ZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9DSEFOR0VMT0cgYi9zb3VuZC9vc3MvQ0hBTkdFTE9HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MDZjZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvQ0hBTkdFTE9HCkBAIC0wLDAgKzEsMzY5IEBACitOb3RlIHRoZXNlIGNoYW5nZXMgcmVsYXRlIHRvIEhhbm51J3MgY29kZSBhbmQgZG9uJ3QgaW5jbHVkZSB0aGUgY2hhbmdlcworbWFkZSBvdXRzaWRlIG9mIHRoaXMgZm9yIG1vZHVsYXJpc2luZyB0aGUgc291bmQKKworQ2hhbmdlbG9nIGZvciB2ZXJzaW9uIDMuOG8KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NpbmNlIDMuOGgKKy0gSW5jbHVkZWQgc3VwcG9ydCBmb3IgT1BMMy1TQTEgYW5kIFNvZnRPU1MKKworU2luY2UgMy44CistIEZpeGVkIFNORENUTF9EU1BfR0VUT1NQQUNFCistIENvbXBhdGliaWxpdHkgZml4ZXMgZm9yIExpbnV4IDIuMS40NworCitTaW5jZSAzLjgtYmV0YTIxCistIEZpeGVkIGFsbCBrbm93biBidWdzIChJIHRoaW5rKS4KKworU2luY2UgMy44LWJldGE4CistIExvdCBvZiBmaXhlcyB0byBhdWRpbyBwbGF5YmFjayBjb2RlIGluIGRtYWJ1Zi5jCisKK1NpbmNlIDMuOC1iZXRhNgorLSBGaXhlZCB0aGUgZmFtb3VzIFF1YWtlIGRlbGF5IGJ1Zy4KKworU2luY2UgMy44LWJldGE1CistIEZpeGVkIG1hbnkgYnVncyBpbiBhdWRpbyBwbGF5YmFjay4KKworU2luY2UgMy44LWJldGE0CistIEp1c3QgbWlub3IgY2hhbmdlcy4KKworU2luY2UgMy44LWJldGExCistIE1ham9yIHJld3JpdGUgb2YgYXVkaW8gcGxheWJhY2sgaGFuZGxpbmcuCistIEFkZGVkIEFXRTMyIHN1cHBvcnQgYnkgVGFrYXNoaSBJd2FpIChpbiAuL2xvd2xldmVsLykuCisKK1NpbmNlIDMuNy1iZXRhIworLSBQYXNzaW5nIG9mIGlvY3RsKCkgcGFyYW1ldGVycyBiZXR3ZWVuIHNvdW5kY2FyZC5jIGFuZCBvdGhlciBtb2R1bGVzIGhhcyBiZWVuCitjaGFuZ2VkIHNvIHRoYXQgYXJnIGFsd2F5cyBwb2ludHMgdG8ga2VybmVsIHNwYWNlLgorLSBTb21lIGJ1Z2ZpeGVzLgorCitTaW5jZSAzLjctYmV0YTUKKy0gRGlzYWJsZWQgTUlESSBpbnB1dCB3aXRoIEdVUyBQblAgKEludGVyd2F2ZSkuIFRoZXJlIHNlZW1zIHRvIGJlIGNvbnN0YW50CitzdHJlYW0gb2YgcmVjZWl2ZWQgMHgwMCBieXRlcyB3aGVuIHRoZSBNSURJIHJlY2VpdmVyIGlzIGVuYWJsZWQuCisKK1NpbmNlIDMuNQorLSBDaGFuZ2VzIGFsbW9zdCBldmVyeXdoZXJlLgorLSBTdXBwb3J0IGZvciBPUFRpIDgyQzkyNC1iYXNlZCBzb3VuZCBjYXJkcy4KKworU2luY2UgMy41LjQtYmV0YTgKKy0gRml4ZWQgYSBidWcgaW4gaGFuZGxpbmcgb2Ygbm9uLWZyYWdtZW50IHNpemVkIHdyaXRlcyBpbiAxNiBiaXQvc3RlcmVvIG1vZGUKKyAgd2l0aCBHVVMuCistIExpbWl0ZWQgbWluaW11bSBmcmFnbWVudCBzaXplIHdpdGggc29tZSBhdWRpbyBkZXZpY2VzIChHVVM9NTEyIGFuZAorICBTQj0zMikuIFRoZXNlIGRldmljZXMgcmVxdWlyZSBtb3JlIHRpbWUgdG8gInJlY292ZXIiIGZyb20gcHJvY2Vzc2luZworICBvZiBlYWNoIGZyYWdtZW50LiAKKworU2luY2UgMy41LjQtYmV0YTYvNworLSBUaGVyZSBzZWVtcyB0byBiZSBwcm9ibGVtcyBpbiB0aGUgT1BUaSA4MkM5MzAgc28gY2FyZHMgYmFzZWQgb24gdGhpcworICBjaGlwIGRvbid0IG5lY2Vzc2FyaWx5IHdvcmsgeWV0LiBUaGVyZSBhcmUgcHJvYmxlbXMgaW4gZGV0ZWN0aW5nIHRoZSAKKyAgTUlESSBpbnRlcmZhY2UuIEFsc28gbWl4ZXIgdm9sdW1lcyBtYXkgYmUgc2VyaW91c2x5IHdyb25nIG9uIHNvbWUgc3lzdGVtcy4KKyAgWW91IGNhbiBzYWZlbHkgdXNlIHRoaXMgZHJpdmVyIHZlcnNpb24gd2l0aCBDOTMwIGlmIGl0IGxvb2tzIHRvIHdvcmsuCisgIEhvd2V2ZXIgcGxlYXNlIGRvbid0IGNvbXBsYWluIGlmIHlvdSBoYXZlIHByb2JsZW1zIHdpdGggaXQuIEM5MzAgc3VwcG9ydAorICBzaG91bGQgYmUgZml4ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLgorLSBHb3QgaW5pdGlhbGl6YXRpb24gb2YgR1VTIFBuUCB0byB3b3JrLiBXaXRoIHRoaXMgdmVyc2lvbiBHVVMgUG5QIHNob3VsZAorICB3b3JrIGluIEdVUyBjb21wYXRpYmxlIG1vZGUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gdXNpbmcgaXNhcG5wdG9vbHMuCistIEZpeGVkIGEgYnVnIGluIGhhbmRsaW5nIG9mIGZ1bGwgZHVwbGV4IGNhcmRzIGluIHdyaXRlIG9ubHkgbW9kZS4gVGhpcyBoYXMKKyAgYmVlbiBjYXVzaW5nICJhdWRpbyBkZXZpY2Ugb3BlbmluZyIgZXJyb3JzIHdpdGggUmVhbEF1ZGlvIHBsYXllci4KKworU2luY2UgMy41LjQuYmV0YTUKKy0gQ2hhbmdlcyB0byBPUFRpIDgyQzkzMCBkcml2ZXIuCistIE1ham9yIGNoYW5nZXMgdG8gdGhlIFNvdW5kc2NhcGUgZHJpdmVyLiBUaGUgZHJpdmVyIHJlcXVpcmVzIG5vdyBqdXN0IG9uZQorICBETUEgY2hhbm5lbC4gVGhlIGV4dHJhIGF1ZGlvL2RzcCBkZXZpY2UgKHRoZSAiTm90IGZ1bmN0aW9uYWwiIG9uZSkgdXNlZAorICBmb3IgY29kZSBkb3dubG9hZCBpbiB0aGUgZWFybGllciB2ZXJzaW9ucyBoYXMgYmVlbiBlbGltaW5hdGVkLiBUaGVyZSBpcyBub3cKKyAganVzdCBvbmUgL2Rldi9kc3AjIGRldmljZSB3aGljaCBpcyB1c2VkIGJvdGggZm9yIGNvZGUgZG93bmxvYWQgYW5kIGF1ZGlvLgorCitTaW5jZSAzLjUuNC5iZXRhNAorLSBNaW5vciBjaGFuZ2VzLgorCitTaW5jZSAzLjUuNC1iZXRhMgorLSBGaXhlZCBzaWxlbnQgcGxheWJhY2sgd2l0aCBFU1MgNjg4LzE2ODguCistIEdvdCBTQjE2IHRvIHdvcmsgd2l0aG91dCB0aGUgMTYgYml0IERNQSBjaGFubmVsIChvbmx5IHRoZSA4IGJpdCBvbmUKKyAgaXMgcmVxdWlyZWQgZm9yIDggYW5kIDE2IGJpdCBtb2RlcykuCistIEFkZGVkIHRoZSAibG93bGV2ZWwiIHN1YmRpcmVjdG9yeSBmb3IgYWRkaXRpb25hbCBsb3cgbGV2ZWwgZHJpdmVycyB0aGF0CisgIGFyZSBub3QgcGFydCBvZiBVU1MgY29yZS4gU2VlIGxvd2xldmVsL1JFQURNRSBmb3IgbW9yZSBpbmZvLgorLSBJbmNsdWRlZCBzdXBwb3J0IGZvciBBQ0kgbWl4ZXIgKGJ5IE1hcmt1cyBLdWhuKS4gQUNJIGlzIGEgbWl4ZXIgdXNlZCBpbgorICBtaXJvUENNIHNvdW5kIGNhcmRzLiBTZWUgbG93bGV2ZWwvYWNpLnJlYWRtZSBmb3IgbW9yZSBpbmZvLgorLSBTdXBwb3J0IGZvciBBenRlY2ggV2FzaGluZ3RvbiBjaGlwc2V0IChBWlQyMzE2IEFTSUMpLgorCitTaW5jZSAzLjUuNC1iZXRhMQorLSBSZWR1Y2VkIGNsaWNraW5nIHdpdGggQUQxODQ4LgorLSBTdXBwb3J0IGZvciBPUFRpIDgyQzkzMC4gT25seSBoYWxmIGR1cGxleCBhdCB0aGlzIHRpbWUuIDE2IGJpdCBwbGF5YmFjaworICBpcyBzb21ldGltZXMganVzdCB3aGl0ZSBub2lzZSAob2NjdXJzIHJhbmRvbWx5KS4KKworU2luY2UgMy41LjIKKy0gTWFqb3IgY2hhbmdlcyB0byB0aGUgU0IvSmF6ejE2L0VTUyBkcml2ZXIgKG1vc3QgcGFydHMgcmV3cml0dGVuKS4KKyAgVGhlIG1vc3Qgbm90aWNlYWJsZSBuZXcgZmVhdHVyZSBpcyBzdXBwb3J0IGZvciBtdWx0aXBsZSBTQiBjYXJkcyBhdCB0aGUgc2FtZQorICB0aW1lLgorLSBSZW5hbWVkIHNiMTZfbWlkaS5jIHRvIHVhcnQ0MDEuYy4gQWxzbyBtb2RpZmllZCBpdCB0byB3b3JrIGFsc28gd2l0aAorICBvdGhlciBNUFU0MDEgVUFSVCBjb21wYXRpYmxlIGNhcmRzIHRoYW4gU0IxNi9FU1MvSmF6ei4KKy0gU29tZSBjaGFuZ2VzIHdoaWNoIHJlZHVjZSBjbGlja2luZyBpbiBhdWRpbyBwbGF5YmFjay4KKy0gQ29weWluZyBwb2xpY3kgaXMgbm93IEdQTC4KKworU2luY2UgMy41LjEKKy0gVEIgTWF1aSBpbml0aWFsaXphdGlvbiBzdXBwb3J0CitTaW5jZSAzLjUKKy0gSW1wcm92ZWQgaGFuZGxpbmcgb2YgcGxheWJhY2sgdW5kZXJydW4gc2l0dWF0aW9ucy4KKworU2luY2UgMy41LWJldGExMAorLSBCdWcgZml4aW5nCisKK1NpbmNlIDMuNS1iZXRhOQorLSBGaXhlZCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIExpbnV4IDEuMy43MCBhbmQgbGF0ZXIuCistIENoYW5nZWQgYm9vdCB0aW1lIHBhc3Npbmcgb2YgMTYgYml0IERNQSBjaGFubmVsIG51bWJlciB0byBTQiBkcml2ZXIuCisKK1NpbmNlIDMuNS1iZXRhOAorLSBNaW5vciBjaGFuZ2VzCisKK1NpbmNlIDMuNS1iZXRhNworLSBlbmhhbmNlbWVudHMgdG8gY29uZmlndXJlIHByb2dyYW0gKGJ5IEplZmYgVHJhbnRlcik6CisgIC0gcHJvbXB0cyBhcmUgaW4gc2FtZSBmb3JtYXQgYXMgMS4zLnggTGludXgga2VybmVsIGNvbmZpZyBwcm9ncmFtCisgIC0gb24tbGluZSBoZWxwIGZvciBlYWNoIHF1ZXN0aW9uCisgIC0gZml4ZWQgc29tZSBjb21waWxlIHdhcm5pbmdzIGRldGVjdGVkIGJ5IGdjYy9nKysgLVdhbGwKKyAgLSBtaW5vciBncmFtbWF0aWNhbCBjaGFuZ2VzIHRvIHByb21wdHMKKworU2luY2UgMy41LWJldGE2CistIEZpeGVkIGJ1Z3MgaW4gbW1hcCgpIHN1cHBvcnQuCistIE1pbm9yIGNoYW5nZXMgdG8gTWF1aSBkcml2ZXIuCisKK1NpbmNlIDMuNS1iZXRhNQorLSBGaXhlZCBjcmFzaCBhZnRlciByZWNvcmRpbmcgd2l0aCBFU1M2ODguIEl0J3MgZ2VuZXJhbGx5IGEgZ29vZAorICBpZGVhIHRvIHN0b3AgaW5ib3VuZCBETUEgdHJhbnNmZXJzIGJlZm9yZSBmcmVlaW5nIHRoZSBtZW1vcnkKKyAgYnVmZmVyLiAKKy0gRml4ZWQgaGFuZGxpbmcgb2YgQUQxODQ1IGNvZGVjIChmb3IgZXhhbXBsZSBTaHV0dGxlIFNvdW5kIFN5c3RlbSkuCistIEZldyBvdGhlciBmaXhlcy4KKworU2luY2UgMy41LWJldGE0CistIEZpeGVkIGJ1ZyBpbiBoYW5kbGluZyBvZiB1bmluaXRpYWxpemVkIGluc3RydW1lbnRzIHdpdGggR1VTLgorCitTaW5jZSAzLjUtYmV0YTMKKy0gRmV3IGNoYW5nZXMgd2hpY2ggZGVjcmVhc2UgcG9wcGluZyBhdCBlbmQvYmVnaW5uaW5nIG9mIGF1ZGlvIHBsYXliYWNrLgorCitTaW5jZSAzLjUtYmV0YTIKKy0gUmVtb3ZlZCBNQUQxNitDUzQyMzEgaGFjayBtYWRlIGluIHByZXZpb3VzIHZlcnNpb24gc2luY2UgaXQgZGlkbid0CisgIGhlbHAuCistIEZpeGVkIHRoZSBhYm92ZSBidWcgaW4gcHJvcGVyIHdheSBhbmQgaW4gcHJvcGVyIHBsYWNlLiBNYW55IHRoYW5rcworICB0byBKYW1lcyBIaWdodG93ZXIuCisKK1NpbmNlIDMuNS1iZXRhMQorLSBCdWcgZml4ZXMuCistIEZ1bGwgZHVwbGV4IGF1ZGlvIHdpdGggTUFEMTYrQ1M0MjMxIG1heSB3b3JrIG5vdy4gVGhlIGRyaXZlciBjb25maWd1cmVzCisgIFNCIERNQSBvZiBNQUQxNiBzbyB0aGF0IGl0IGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCBjb2RlYydzIERNQSBjaGFubmVscy4KKyAgVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgYWxsIDggYml0IERNQSBjaGFubmVscyAoMCwxLDMpIGFyZSBwb3B1bGF0ZWQgaW4gCisgIGR1cGxleCBtb2RlLgorCitTaW5jZSAzLjUtYWxwaGE5CistIEJ1ZyBmaXhlcyAobW9zdGx5IGluIEphenoxNiBhbmQgRVNTMTY4OC82ODggc3VwcG9ydHMpLgorLSBUZW1wb3JhcmlseSBkaXNhYmxlZCByZWNvcmRpbmcgd2l0aCBFU1MxNjg4LzY4OCBzaW5jZSBpdCBjYXVzZXMgY3Jhc2guCistIENoYW5nZWQgYXVkaW8gYnVmZmVyIHBhcnRpdGlvbmluZyBhbGdvcml0aG0gc28gdGhhdCBpdCBzZWxlY3RzCisgIHNtYWxsZXIgZnJhZ21lbnQgc2l6ZSB0aGFuIGVhcmxpZXIuIFRoaXMgaW1wcm92ZXMgcmVhbCB0aW1lIGNhcGFiaWxpdGllcworICBvZiB0aGUgZHJpdmVyIGFuZCBtYWtlcyByZWNvcmRpbmcgdG8gZGlzayB0byB3b3JrIGJldHRlci4gVW5mb3J0dW5hdGVseQorICB0aGlzIGNoYW5nZSBicmVha3Mgc29tZSBwcm9ncmFtcyB3aGljaCBhc3N1bWUgdGhhdCBmcmFnbWVudHMgY2Fubm90IGJlCisgIHNob3J0ZXIgdGhhbiA0MDk2IGJ5dGVzLgorCitTaW5jZSAzLjUtYWxwaGE4CistIEJ1ZyBmaXhlcworCitTaW5jZSAzLjUtYWxwaGE3CistIExpbnV4IGtlcm5lbCBjb21wYXRpYmxlIGNvbmZpZ3VyYXRpb24gKF9FWFBFUklNRU5UQUxfKS4gRW5hYmxlCisgIHVzaW5nIGNvbW1hbmQgImNkIC9saW51eC9kcml2ZXJzL3NvdW5kO21ha2Ugc2NyaXB0IiBhbmQgdGhlbgorICBqdXN0IHJ1biBrZXJuZWwncyBtYWtlIGNvbmZpZyBub3JtYWxseS4KKy0gTWlub3IgZml4ZXMgdG8gdGhlIFNCIHN1cHBvcnQuIEhvcGVmdWxseSB0aGUgZHJpdmVyIHdvcmtzIHdpdGgKKyAgYWxsIFNCIG1vZGVscyBub3cuCistIEFkZGVkIHN1cHBvcnQgZm9yIEVTUyBFUzE2ODggIkF1ZGlvRHJpdmUiIGJhc2VkIGNhcmRzLgorCitTaW5jZSAzLjUtYWxwaGE2CistIFNCIFBybyBhbmQgU0IxNiBzdXBwb3J0cyBhcmUgbm8gbG9uZ2VyIHNlcGFyYXRlbHkgc2VsZWN0YWJsZSBvcHRpb25zLgorICBFbmFibGluZyBTQiBlbmFibGVzIHRoZW0gdG9vLgorLSBDaGFuZ2VkIGFsbCAjaWZuZGVmIEVYQ0xVREVfeHggc3R1ZmYgdG8gI2lmZGVmIENPTkZJR194eC4gTW9kaWZpZWQKK2NvbmZpZ3VyZSB0byBoYW5kbGUgdGhpcy4gCistIFJlbW92ZWQgaW5pdGlhbGl6YXRpb24gbWVzc2FnZXMgZnJvbSB0aGUKK21vZHVsYXJpemVkIHZlcnNpb24uIFRoZXkgY2FuIGJlIGVuYWJsZWQgYnkgdXNpbmcgaW5pdF90cmFjZT0xIGluCit0aGUgaW5zbW9kIGNvbW1hbmQgbGluZSAoaW5zbW9kIHNvdW5kIGluaXRfdHJhY2U9MSkuCistIE1vcmUgQUlYIHN0dWZmLgorLSBBZGRlZCBzdXBwb3J0IGZvciBzeW5jaHJvbml6aW5nIGRzcC9hdWRpbyBkZXZpY2VzIHdpdGggL2Rldi9zZXF1ZW5jZXIuCistIG1tYXAoKSBzdXBwb3J0IGZvciBkc3AvYXVkaW8gZGV2aWNlcy4KKworU2luY2UgMy41LWFscGhhNQorLSBBSVggcG9ydC4KKy0gQ2hhbmdlZCBzb21lIHh4eF9QQVRDSCBtYWNyb3MgaW4gc291bmRjYXJkLmggdG8gd29yayB3aXRoCisgIGJpZyBlbmRpYW4gbWFjaGluZXMuCisKK1NpbmNlIDMuNS1hbHBoYTQKKy0gUmVtb3ZlZCB0aGUgJ3NldGZ4JyBzdHVmZiBmcm9tIHRoZSB2ZXJzaW9uIGRpc3RyaWJ1dGVkIHdpdGgga2VybmVsCisgIHNvdXJjZXMuIFJ1bm5pbmcgJ3NldGZ4JyBpcyByZXF1aXJlZCBhZ2Fpbi4KKworU2luY2UgMy41LWFscGhhMworLSBNb3ZlZCBzdHVmZiBmcm9tIHRoZSAnc2V0ZngnIHByb2dyYW0gdG8gdGhlIEF1ZGlvVHJpeCBQcm8gZHJpdmVyLgorCitTaW5jZSAzLjUtYWxwaGEyCistIE1vZGlmaWNhdGlvbnMgdG8gbWFrZWZpbGUgYW5kIGNvbmZpZ3VyZS5jLiBVbm5lY2Vzc2FyeSBzb3VyY2VzCisgIGFyZSBubyBsb25nZXIgY29tcGlsZWQuIE5ld2x5IGNyZWF0ZWQgbG9jYWwuaCBpcyBhbHNvIGNvcGllZCB0bworICAvZXRjL3NvdW5kY29uZi4gIm1ha2Ugb2xkY29uZmlnIiByZWFkcyAvZXRjL3NvdW5kY29uZiBhbmQgcHJvZHVjZXMKKyAgbmV3IGxvY2FsLmggd2hpY2ggaXMgY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZHJpdmVyLgorLSBTb21lIGZpeGVzIHRvIHRoZSBTQjE2IHN1cHBvcnQuCistIEZpeGVkIHJhbmRvbSBwcm90ZWN0aW9uIGZhdWx0IGluIGd1c193YXZlLmMKKworU2luY2UgMy41LWFscGhhMQorLSBNb2RpZmllZCB0byB3b3JrIHdpdGggTGludXgtMS4zLjMzIGFuZCBsYXRlcgorLSBTb21lIG1pbm9yIGNoYW5nZXMKKworU2luY2UgMy4wLjIKKy0gU3VwcG9ydCBmb3IgQ1M0MjMyIGJhc2VkIFBuUCBjYXJkcyAoQWNlck1hZ2ljIFMyMyBldGMpLgorLSBGdWxsIGR1cGxleCBzdXBwb3J0IGZvciBzb21lIENTNDIzMSwgQ1M0MjMyIGFuZCBBRDE4NDUgYmFzZWQgY2FyZHMKKyhHVVMgTUFYLCBBdWRpb1RyaXggUHJvLCBBY2VyTWFnaWMgUzIzIGFuZCBtYW55IE1BRDE2L01vemFydCBjYXJkcworaGF2aW5nIGEgY29kZWMgbWVudGlvbmVkIGFib3ZlKS4KKy0gQWxtb3N0IGZ1bGx5IHJld3JpdHRlbiBsb2FkYWJsZSBtb2R1bGVzIHN1cHBvcnQuCistIEZpeGVkIHNvbWUgYnVncy4KKy0gSHVnZSBhbW91bnQgb2YgdGVzdGluZyAobW9yZSB0ZXN0aW5nIGlzIHN0aWxsIHJlcXVpcmVkKS4KKy0gbW1hcCgpIHN1cHBvcnQgKHdvcmtzIHdpdGggc29tZSBjYXJkcykuIFJlcXVpcmVzIG11Y2ggbW9yZSB0ZXN0aW5nLgorLSBTYW1wbGUvcGF0Y2gvcHJvZ3JhbSBsb2FkaW5nIGZvciBUQiBNYXVpL1Ryb3Blei4gTm8gaW5pdGlhbGl6YXRpb24KK3NpbmNlIFRCIGRvZXNuJ3QgYWxsb3cgbWUgdG8gcmVsZWFzZSB0aGF0IGNvZGUuCistIFVzaW5nIENTNDIzMSBjb21wYXRpYmxlIGNvZGVjcyBhcyB0aW1lciBmb3IgL2Rldi9tdXNpYy4KKworU2luY2UgMy4wLjEKKy0gQWRkZWQgYWxsb2NhdGlvbiBvZiBJL08gcG9ydHMsIERNQSBjaGFubmVscyBhbmQgaW50ZXJydXB0cwordG8gdGhlIGluaXRpYWxpemF0aW9uIGNvZGUuIFRoaXMgbWF5IGJyZWFrIG1vZHVsZXMgc3VwcG9ydCBzaW5jZQordGhlIGRyaXZlciBtYXkgbm90IGZyZWUgc29tZSByZXNvdXJjZXMgb24gdW5sb2FkLiBTaG91bGQgYmUgZml4ZWQgc29vbi4KKworU2luY2UgMy4wCistIFNvbWUgaW1wb3J0YW50IGJ1ZyBmaXhlcy4gCistIHNlbGVjdCgpIGZvciAvZGV2L2RzcCBhbmQgL2Rldi9hdWRpbyAoTGludXggb25seSkuCisoVG8gdXNlIHNlbGVjdCgpIHdpdGggcmVhZCwgeW91IGhhdmUgdG8gY2FsbCByZWFkKCkgdG8gc3RhcnQKK3RoZSByZWNvcmRpbmcuIENhbGxpbmcgd3JpdGUoKSBraWxscyByZWNvcmRpbmcgaW1tZWRpYXRlbHkgc28KK3VzZSBzZWxlY3QoKSBjYXJlZnVsbHkgd2hlbiB5b3UgYXJlIHdyaXRpbmcgYSBoYWxmIGR1cGxleCBhcHAuCitGdWxsIGR1cGxleCBtb2RlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuKSBTZWxlY3Qgd29ya3MgYWxzbyB3aXRoCisvZGV2L3NlcXVlbmNlciBhbmQgL2Rldi9tdXNpYy4gTWF5YmUgd2l0aCAvZGV2L21pZGkjIyB0b28uCisKK1NpbmNlIDMuMC1iZXRhMgorLSBNaW5vciBmaXhlcy4KKy0gQWRkZWQgUmVhZG1lLmNhcmRzCisKK1NpbmNlIDMuMC1iZXRhMQorLSBNaW5vciBmaXhlcyB0byB0aGUgbW9kdWxlcyBzdXBwb3J0LgorLSBFbGltaW5hdGVkIGNhbGwgdG8gc2JfZnJlZV9pcnEoKSBpbiBhZDE4NDguYworLSBSZXdyaXR0ZW4gTUFEMTYmTW96YXJ0IHN1cHBvcnQgKG5vdCB0ZXN0ZWQgd2l0aCBNQUQxNiBQcm8pLgorLSBGaXggdG8gRE1BIGluaXRpYWxpemF0aW9uIG9mIFBTUyBjYXJkcy4KKy0gU29tZSBmaXhlcyB0byBhZDE4NDgvY3M0Mnh4IG1peGVyIHN1cHBvcnQgKEdVUyBNQVgsIE1TUywgZXRjLikKKy0gRml4ZWQgc29tZSBidWdzIGluIHRoZSBQU1MgZHJpdmVyIHdoaWNoIGNhdXNlZCBJL08gZXJyb3JzIHdpdGgKKyAgdGhlIE1TUyBtb2RlICgvZGV2L2RzcCkuCisKK1NpbmNlIDMuMC05NTA1MDYKKy0gUmVjb3JkaW5nIHdpdGggR1VTIE1BWCBmaXhlZC4gSXQgd29ya3Mgd2hlbiB0aGUgZHJpdmVyIGlzIGNvbmZpZ3VyZWQKKyAgdG8gdXNlIHR3byBETUEgY2hhbm5lbHMgd2l0aCBHVVMgTUFYICgxNiBiaXQgb25lcyByZWNvbW1lbmRlZCkuCisKK1NpbmNlIDMuMC05NHh4eHgKKy0gVG9vIG1hbnkgY2hhbmdlcworCitTaW5jZSAzLjAtOTQwODE4CistIEZpeGVzIGZvciBMaW51eCAxLjEuNHguCistIERpc2FibGVzIERpc25leSBTb3VuZCBTeXN0ZW0gd2l0aCBTRyBOWCBQcm8gMTYgKGxlc3Mgbm9pc2UpLgorCitTaW5jZSAyLjkwLTIKKy0gRml4ZXMgdG8gc291bmRjYXJkLmgKKy0gTm9uIGJsb2NraW5nIG1vZGUgdG8gL2Rldi9zZXF1ZW5jZXIKKy0gRXhwZXJpbWVudGFsIGRldGVjdGlvbiBjb2RlIGZvciBFbnNvbmlxIFNvdW5kc2NhcGUuCisKK1NpbmNlIDIuOTAKKy0gTWlub3IgYW5kIG1ham9yIGJ1ZyBmaXhlcworCitTaW5jZSBwcmUtMy4wLTk0MDcxMgorLSBHVVMgTUFYIHN1cHBvcnQKKy0gUGFydGlhbGx5IHdvcmtpbmcgTVNTL1dTUyBzdXBwb3J0IChjb3VsZCB3b3JrIHdpdGggc29tZSBjYXJkcykuCistIEhhcmR3YXJlIHUtTGF3IGFuZCBBLUxhdyBzdXBwb3J0IHdpdGggQUQxODQ4L0NTNDI0OCBhbmQgQ1M0MjMxIGNvZGVjcworICAoR1VTIE1BWCwgR1VTMTYsIFdTUyBldGMpLiBIYXJkd2FyZSBBRFBDTSBpcyBwb3NzaWJsZSB3aXRoIEdVUzE2IGFuZAorICBHVVMgTUFYLCBidXQgaXQgZG9lc24ndCB3b3JrIHlldC4KK1NpbmNlIHByZS0zLjAtOTQwNDI2CistIEFEMTg0OC9DUzQyNDgvQ1M0MjMxIGNvZGVjIHN1cHBvcnQgKE1TUywgR1VTIE1BWCwgQXp0ZWMsIE9yY2hpZCBldGMpLgorVGhpcyBjb2RlYyBjaGlwIGlzIHVzZWQgaW4gdmFyaW91cyBzb3VuZCBjYXJkcy4gVGhpcyB2ZXJzaW9uIGlzIGRldmVsb3BlZAorZm9yIHRoZSAxNiBiaXQgZGF1Z2h0ZXJjYXJkIG9mIEdVUy4gSXQgc2hvdWxkIHdvcmsgd2l0aCBvdGhlciBjYXJkcyBhbHNvCitpZiB0aGUgZm9sbG93aW5nIHJlcXVpcmVtZW50cyBhcmUgbWV0OgorCS0gVGhlIEkvTywgSVJRIGFuZCBETUEgc2V0dGluZ3MgYXJlIGp1bXBlciBzZWxlY3RhYmxlIG9yCisJdGhlIGNhcmQgaXMgaW5pdGlhbGl6ZWQgYnkgYm9vdGluZyBET1MgYmVmb3JlIGJvb3RpbmcgTGludXggKGV0Yy4pLgorCS0gWW91IGFkZCB0aGUgSU8sIElSUSBhbmQgRE1BIHNldHRpbmdzIG1hbnVhbGx5IHRvIHRoZSBsb2NhbC5oLgorCSAgKEp1c3QgZGVmaW5lIEdVUzE2X0JBU0UsIEdVUzE2X0lSUSBhbmQgR1VTMTZfRE1BKS4gTm90ZSB0aGF0CisJdGhlIGJhc2UgYWRkcmVzcyBidXN0IGJlIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvZGVjIGNoaXAgbm90IHRoZQorCWNhcmQgaXRzZWxmLiBGb3IgdGhlIEdVUzE2IHRoZXNlIGFyZSB0aGUgc2FtZSBidXQgbW9zdCBNU1MgY29tcGF0aWJsZQorCWNhcmRzIGhhdmUgdGhlIGNvZGVjIGxvY2F0ZWQgYXQgY2FyZF9iYXNlKzQuCistIFNvbWUgbWlub3IgY2hhbmdlcworCitTaW5jZSAyLjUgKCoqKioqKiogTUFKT1IgUkVXUklURSAqKioqKioqKioqKikKKworVGhpcyB2ZXJzaW9uIGlzIGJhc2VkIG9uIHYyLjMuIEkgaGF2ZSB0cmllZCB0byBtYWludGFpbiB0d28gdmVyc2lvbnMKK3RvZ2V0aGVyIHNvIHRoYXQgdGhpcyBvbmUgc2hvdWxkIGhhdmUgdGhlIHNhbWUgZmVhdHVyZXMgdGhhbiB2Mi41LgorU29tZXRoaW5nIG1heSBzdGlsbCBiZSBtaXNzaW5nLiBJZiB5b3Ugbm90aWNlIHN1Y2ggdGhpbmdzLCBwbGVhc2UgbGV0IG1lCitrbm93LgorCitUaGUgUmVhZG1lLnYzMCBjb250YWlucyBtb3JlIGRldGFpbHMuCisKKy0gL2Rldi9taWRpIyMgZGV2aWNlcy4KKy0gL2Rldi9zZXF1ZW5jZXIyCisKK1NpbmNlIDIuNS1iZXRhMgorLSBTb21lIGZpbmUgdHVuaW5nIHRvIHRoZSBHVVMgdjMuNyBtaXhlciBjb2RlLgorLSBGaXhlZCBzcGVlZCBsaW1pdHMgZm9yIHRoZSBwbGFpbiBTQiAoMS4wIHRvIDIuMCkuCisKK1NpbmNlIDIuNS1iZXRhCistIEZpeGVkIE9QTC0zIGRldGVjdGlvbiB3aXRoIFNCLiBDYXVzZWQgcHJvYmxlbXMgd2l0aCBQQVMxNi4KKy0gR1VTIHYzLjcgbWl4ZXIgc3VwcG9ydC4KKworU2luY2UgMi40CistIE1peGVyIHN1cHBvcnQgZm9yIFNvdW5kIEdhbGF4eSBOWCBQcm8gKGRlZmluZSBfX1NHTlhQUk9fXyBvbiB5b3VyIGxvY2FsLmgpLgorLSBGaXhlZCB0cnVuY2F0ZWQgc291bmQgb24gL2Rldi9kc3Agd2hlbiB0aGUgZGV2aWNlIGlzIGNsb3NlZC4KKy0gTGluZWFyIHZvbHVtZSBtb2RlIGZvciBHVVMKKy0gUGl0Y2ggYmVuZHMgbGFyZ2VyIHRoYW4gKy8tIDIgb2N0YXZlcy4KKy0gTUlESSByZWNvcmRpbmcgZm9yIFNCIGFuZCBTQiBQcm8uIChVbnRlc3RlZCkuCistIFNvbWUgb3RoZXIgZml4ZXMuCistIFNCMTYgTUlESSBhbmQgRFNQIGRyaXZlcnMgb25seSBpbml0aWFsaXplZCBpZiBTQjE2IGFjdHVhbGx5IGluc3RhbGxlZC4KKy0gSW1wbGVtZW50ZWQgYmV0dGVyIGRldGVjdGlvbiBmb3IgT1BMLTMuIFRoaXMgc2hvdWxkIGJlIHVzZWZ1bCBpZiB5b3UKKyAgaGF2ZSBhbiBvbGQgU0IgUHJvICh0aGUgbm9uLU9QTC0zIG9uZSkgb3IgYSBTQiAyLjAgY2xvbmUgd2hpY2ggaGFzIGEgT1BMLTMuCistIFNWUjQuMiBzdXBwb3J0IGJ5IElhbiBIYXJ0YXMuIEluaXRpYWwgQUxQSEEgVEVTVCB2ZXJzaW9uICh1bnRlc3RlZCkuCisKK1NpbmNlIDIuM2IKKy0gRml4ZWQgYnVnIHdoaWNoIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBtYWtlIGxvbmcgcmVjb3JkaW5ncyB0byBkaXNrLgorICBSZWNvcmRpbmcgd2FzIG5vdCByZXN0YXJ0ZWQgYWZ0ZXIgYSBidWZmZXIgb3ZlcmZsb3cgc2l0dWF0aW9uLgorLSBMaW1pdGVkIG1peGVyIHN1cHBvcnQgZm9yIEdVUy4KKy0gTnVtZXJvdXMgaW1wcm92ZW1lbnRzIHRvIHRoZSBHVVMgZHJpdmVyIGJ5IEFuZHJldyBSb2JpbnNvbi4gSW5jbHVkaW5nCisgIHNvbWUgY2xpY2sgcmVtb3ZhbCBldGMuCisKK1NpbmNlIDIuMworLSBGaXhlZCBzb21lIG1pbm9yIGJ1Z3MgaW4gdGhlIFNCMTYgZHJpdmVyLgorCitTaW5jZSAyLjJiCistIEZ1bGwgU0IxNiBEU1Agc3VwcG9ydC4gOC8xNiBiaXQsIG1vbm8vc3RlcmVvCistIFRoZSBTQ08gYW5kIEZyZWVCU0QgdmVyc2lvbnMgc2hvdWxkIGJlIGluIHN5bmMgbm93LiBUaGVyZSBhcmUgc29tZQorICBwcm9ibGVtcyB3aXRoIFNCMTYgYW5kIEdVUyBpbiB0aGUgRnJlZUJTRCB2ZXJzaW9ucy4KKyAgVGhlIERNQSBidWZmZXIgYWxsb2NhdGlvbiBvZiB0aGUgU0NPIHZlcnNpb24gaGFzIGJlZW4gcG9saXNoZWQgYnV0CisgIHRoZXJlIGNvdWxkIHN0aWxsIGJlIHNvbWUgcHJvYmxlbXMuIEF0IGxlYXN0IGl0IGhvZ3MgbWVtb3J5LgorICBUaGUgRE1BIGNoYW5uZWwKKyAgY29uZmlndXJhdGlvbiBtZXRob2QgdXNlZCBpbiB0aGUgU0NPL1N5c3RlbSBpcyBhIGhhY2suCistIFN1cHBvcnQgZm9yIHRoZSBNUFUgZW11bGF0aW9uIG9mIHRoZSBTQjE2LgorLSBTb21lIGJpZyBhcnJheXMgYXJlIG5vdyBhbGxvY2F0ZWQgYm9vdCB0aW1lLiBUaGlzIG1ha2VzIHRoZSBCU1Mgc2VnbWVudAorICBzbWFsbGVyIHdoaWNoIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgZnVsbCBkcml2ZXIgd2l0aAorICBOZXRCU0QuIFRoZXNlIGFycmF5cyBhcmUgbm90IGFsbG9jYXRlZCBpZiBubyBzdWl0YWJsZSBzb3VuZCBjYXJkIGlzIGF2YWlsYWJsZS4KKy0gRml4ZWQgYSBidWcgaW4gdGhlIGNvbXB1dGVfYW5kX3NldF92b2x1bWUgaW4gZ3VzX3dhdmUuYworLSBGaXhlZCB0aGUgdG9vIGZhc3QgbW9ubyBwbGF5YmFjayBwcm9ibGVtIG9mIFNCIFBybyBhbmQgUEFTMTYuCisKK1NpbmNlIDIuMgorLSBTdGVyZW8gcmVjb3JkaW5nIGZvciBTQiBQcm8uIFNvbWVob3cgaXQgd2FzIG1pc3NpbmcgYW5kIG5vYm9keQorICBoYWQgbm90aWNlZCBpdCBlYXJsaWVyLgorLSBNaW5vciBwb2xpc2hpbmcuCistIEludGVycHJldGluZyBvZiBib290IHRpbWUgYXJndW1lbnRzIChzb3VuZD0pIGZvciBMaW51eC4KKy0gQnJlYWt1cCBvZiBzYl9kc3AuYy4gUGFydHMgb2YgdGhlIGNvZGUgaGFzIGJlZW4gbW92ZWQgdG8KKyAgc2JfbWl4ZXIuYyBhbmQgc2JfbWlkaS5jCisKK1NpbmNlIDIuMQorLSBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBTQjE2LiAKKyAgLSBUaGUgU0IxNiBtaXhlciBpcyBzdXBwb3J0ZWQgaW4gaXRzIG5hdGl2ZSBtb2RlLgorICAtIERpZ2l0aXplZCB2b2ljZSBjYXBhYmlsaXR5IHVwIHRvIDQ0LjEga0h6LzggYml0L21vbm8KKyAgICAoMTYgYml0IGFuZCBzdGVyZW8gc3VwcG9ydCBjb21pbmcgaW4gdGhlIG5leHQgcmVsZWFzZSkuCistIEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgZGlnaXRpemVkIHZvaWNlIGRyaXZlciBmb3IgUEFTMTYuCistIFByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGUgU0IgZW11bGF0aW9uIG9mIGxhdGVzdCBQQVMxNiBtb2RlbHMuCisKKy0gU2lnbmlmaWNhbnRseSBpbXByb3ZlZCAvZGV2L2RzcCBhbmQgL2Rldi9hdWRpbyBzdXBwb3J0LgorICAtIE5vdyBzdXBwb3J0cyBoYWxmIGR1cGxleCBtb2RlLiBJdCdzIG5vdyBwb3NzaWJsZSB0byByZWNvcmQgYW5kCisgICAgcGxheWJhY2sgd2l0aG91dCBjbG9zaW5nIGFuZCByZW9wZW5pbmcgdGhlIGRldmljZS4KKyAgLSBJdCdzIHBvc3NpYmxlIHRvIHVzZSBzbWFsbGVyIGJ1ZmZlcnMgdGhhbiBlYXJsaWVyLiBUaGVyZSBpcyBhIG5ldworICAgIGlvY3RsKGZkLCBTTkRDVExfRFNQX1NVQkRJVklERSwgJm4pIHdoZXJlIG4gc2hvdWxkIGJlIDEsIDIgb3IgNC4KKyAgICBUaGlzIGNhbGwgaW5zdHJ1Y3RzIHRoZSBkcml2ZXIgdG8gdXNlIHNtYWxsZXIgYnVmZmVycy4gVGhlIGRlZmF1bHQKKyAgICBidWZmZXIgc2l6ZSAoMC41IHRvIDEuMCBzZWNvbmRzKSBpcyBkaXZpZGVkIGJ5IG4uIFNob3VsZCBiZSBjYWxsZWQKKyAgICBpbW1lZGlhdGVseSBhZnRlciBvcGVuaW5nIHRoZSBkZXZpY2UuCisKK1NpbmNlIDIuMAorSnVzdCBjb3NtZXRpYyBjaGFuZ2VzLiAKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9DT1BZSU5HIGIvc291bmQvb3NzL0NPUFlJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2ZDFmMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9DT1BZSU5HCkBAIC0wLDAgKzEsMzM5IEBACisJCSAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorCQkgICAgICAgVmVyc2lvbiAyLCBKdW5lIDE5OTEKKworIENvcHlyaWdodCAoQykgMTk4OSwgMTk5MSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCUFwcGVuZGl4OiBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDE5eXkgIDxuYW1lIG9mIGF1dGhvcj4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EKKworQWxzbyBhZGQgaW5mb3JtYXRpb24gb24gaG93IHRvIGNvbnRhY3QgeW91IGJ5IGVsZWN0cm9uaWMgYW5kIHBhcGVyIG1haWwuCisKK0lmIHRoZSBwcm9ncmFtIGlzIGludGVyYWN0aXZlLCBtYWtlIGl0IG91dHB1dCBhIHNob3J0IG5vdGljZSBsaWtlIHRoaXMKK3doZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICBHbm9tb3Zpc2lvbiB2ZXJzaW9uIDY5LCBDb3B5cmlnaHQgKEMpIDE5eXkgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9LY29uZmlnIGIvc291bmQvb3NzL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwM2MyZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9LY29uZmlnCkBAIC0wLDAgKzEsMTEyMCBAQAorIyBkcml2ZXJzL3NvdW5kL0NvbmZpZy5pbgorIworIyAxOCBBcHIgMTk5OCwgTWljaGFlbCBFbGl6YWJldGggQ2hhc3RhaW4sIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4KKyMgTW9yZSBoYWNraW5nIGZvciBtb2R1bGFyaXNhdGlvbi4KKyMKKyMgUHJvbXB0IHVzZXIgZm9yIHByaW1hcnkgZHJpdmVycy4KK2NvbmZpZyBTT1VORF9CVDg3OAorCXRyaXN0YXRlICJCVDg3OCBhdWRpbyBkbWEiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORAorCS0tLWhlbHAtLS0KKwkgIEF1ZGlvIERNQSBzdXBwb3J0IGZvciBidDg3OCBiYXNlZCBncmFiYmVyIGJvYXJkcy4gIEFzIHlvdSBtaWdodCBoYXZlCisJICBhbHJlYWR5IG5vdGljZWQsIGJ0ODc4IGlzIGxpc3RlZCB3aXRoIHR3byBmdW5jdGlvbnMgaW4gL3Byb2MvcGNpLgorCSAgRnVuY3Rpb24gMCBkb2VzIHRoZSB2aWRlbyBzdHVmZiAoYnQ4NDggY29tcGF0aWJsZSksIGZ1bmN0aW9uIDEgZG9lcworCSAgdGhlIHNhbWUgZm9yIGF1ZGlvIGRhdGEuICBUaGlzIGlzIGEgZHJpdmVyIGZvciB0aGUgYXVkaW8gcGFydCBvZgorCSAgdGhlIGNoaXAuICBJZiB5b3Ugc2F5ICdZJyBoZXJlIHlvdSBnZXQgYSBvc3MtY29tcGF0aWJsZSBkc3AgZGV2aWNlCisJICB3aGVyZSB5b3UgY2FuIHJlY29yZCBmcm9tLiAgSWYgeW91IHdhbnQganVzdCB3YXRjaCBUViB5b3UgcHJvYmFibHkKKwkgIGRvbid0IG5lZWQgdGhpcyBkcml2ZXIgYXMgbW9zdCBUViBjYXJkcyBoYW5kbGUgc291bmQgd2l0aCBhIHNob3J0CisJICBjYWJsZSBmcm9tIHRoZSBUViBjYXJkIHRvIHlvdXIgc291bmQgY2FyZCdzIGxpbmUtaW4uCisKKwkgIFRvIGNvbXBpbGUgdGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZSBtb2R1bGUgd2lsbAorCSAgYmUgY2FsbGVkIGJ0YXVkaW8uCisKK2NvbmZpZyBTT1VORF9DTVBDSQorCXRyaXN0YXRlICJDLU1lZGlhIFBDSSAoQ01JODMzOC84NzM4KSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBQQ0kgc291bmQgY2FyZCB1c2luZyB0aGUgQ01JODMzOAorCSAgb3IgdGhlIENNSTg3MzggY2hpcHNldC4gIERhdGEgb24gdGhlc2UgY2hpcHMgYXJlIGF2YWlsYWJsZSBhdAorCSAgPGh0dHA6Ly93d3cuY21lZGlhLmNvbS50dy8+LgorCisJICBBIHVzZXJzcGFjZSB1dGlsaXR5IHRvIGNvbnRyb2wgc29tZSBpbnRlcm5hbCByZWdpc3RlcnMgb2YgdGhlc2UKKwkgIGNoaXBzIGlzIGF2YWlsYWJsZSBhdAorCSAgPGh0dHA6Ly9tZW1iZXIubmlmdHkubmUuanAvQnJlZXplL3NvZnR3YXJlcy91bml4L2NtaWN0bC1lLmh0bWw+LgorCitjb25maWcgU09VTkRfQ01QQ0lfRk0KKwlib29sICJFbmFibGUgbGVnYWN5IEZNIgorCWRlcGVuZHMgb24gU09VTkRfQ01QQ0kgJiYgWDg2CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIGxlZ2FjeSBGTSAoZnJlcXVlbmN5LW1vZHVsYXRpb24pIHN5bnRoZXNpemVyCisJICBzdXBwb3J0IG9uIGEgY2FyZCB1c2luZyB0aGUgQ01JODMzOCBvciBDTUk4Mzc4IGNoaXBzZXQuIEV2ZW4gaXQgaXMKKwkgIGVuYWJsZWQsIHlvdSBuZWVkIHRvIHNldCBmbWlvIGFzIHByb3BlciB2YWx1ZSB0byBlbmFibGUgaXQuCisJICBTYXkgTiBoZXJlIGlmIHlvdSBkb24ndCBuZWVkIHRoaXMuCisKK2NvbmZpZyBTT1VORF9DTVBDSV9NSURJCisJYm9vbCAiRW5hYmxlIGxlZ2FjeSBNUFUtNDAxIgorCWRlcGVuZHMgb24gU09VTkRfQ01QQ0kgJiYgWDg2CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIGxlZ2FjeSBNUFU0MDEgTUlESSBzeW50aGVzaXplciBzdXBwb3J0IG9uIGEKKwkgIGNhcmQgdXNpbmcgdGhlIENNSTgzMzggb3IgQ01JODM3OCBjaGlwc2V0LiBFdmVuIGl0IGlzIGVuYWJsZWQsCisJICB5b3UgbmVlZCB0byBzZXQgbXB1aW8gYXMgcHJvcGVyIHZhbHVlIHRvIGVuYWJsZSBpdC4KKwkgIFNheSBOIGhlcmUgaWYgeW91IGRvbid0IG5lZWQgdGhpcy4KKworY29uZmlnIFNPVU5EX0NNUENJX0pPWVNUSUNLCisJYm9vbCAiRW5hYmxlIGpveXN0aWNrIgorCWRlcGVuZHMgb24gU09VTkRfQ01QQ0kgJiYgWDg2CisJaGVscAorCSAgU2F5IFkgaGVyZSBpbiBvcmRlciB0byBlbmFibGUgdGhlIGpveXN0aWNrIHBvcnQgb24gYSBzb3VuZCBjYXJkIHVzaW5nCisJICB0aGUgQ01JODMzOCBvciB0aGUgQ01JODczOCBjaGlwc2V0LiAgWW91IG5lZWQgdG8gY29uZmlnIHRoZQorCSAgZ2FtZXBvcnQgc3VwcG9ydCBhbmQgc2V0IGpveXN0aWNrIHBhcmFtZXRlciBhcyAxIHRvIHVzZSBpdC4KKwkgIFNheSBOIGhlcmUgaWYgeW91IGRvbid0IG5lZWQgdGhpcy4KKworY29uZmlnIFNPVU5EX0VNVTEwSzEKKwl0cmlzdGF0ZSAiQ3JlYXRpdmUgU0JMaXZlISAoRU1VMTBLMSkiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiBQQ0kKKwktLS1oZWxwLS0tCisJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgUENJIHNvdW5kIGNhcmQgdXNpbmcgdGhlIEVNVTEwSzEgY2hpcHNldCwKKwkgIHN1Y2ggYXMgdGhlIENyZWF0aXZlIFNCTGl2ZSEsIFNCIFBDSTUxMiBvciBFbXUtQVBTLgorCisJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIGRyaXZlciBhbmQgdGhlIGRlZ3JlZSBvZiBzdXBwb3J0IGZvcgorCSAgdGhlIGRpZmZlcmVudCBjYXJkIG1vZGVscyBwbGVhc2UgY2hlY2s6CisKKwkgICAgICAgIDxodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL2VtdTEwazEvPgorCisJICBJdCBpcyBub3cgcG9zc2libGUgdG8gbG9hZCBkc3AgbWljcm9jb2RlIHBhdGNoZXMgaW50byB0aGUgRU1VMTBLMQorCSAgY2hpcC4gIFRoZXNlIHBhdGNoZXMgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHJlYWwgdGltZSBzb3VuZAorCSAgcHJvY2Vzc2luZyBlZmZlY3RzIHdoaWNoIGluY2x1ZGUgZm9yIGV4YW1wbGU6IHNpZ25hbCByb3V0aW5nLAorCSAgYmFzcy90cmVibGUgY29udHJvbCwgQUMzIHBhc3N0aHJvdWdoLCAuLi4KKwkgIFVzZXJzcGFjZSB0b29scyB0byBjcmVhdGUgbmV3IHBhdGNoZXMgYW5kIGxvYWQvdW5sb2FkIHRoZW0gY2FuIGJlCisJICBmb3VuZCBpbiB0aGUgZW11LXRvb2xzIHBhY2thZ2UgYXQgdGhlIGFib3ZlIFVSTC4KKworY29uZmlnIE1JRElfRU1VMTBLMQorCWJvb2wgIkNyZWF0aXZlIFNCTGl2ZSEgTUlESSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFNPVU5EX0VNVTEwSzEgJiYgRVhQRVJJTUVOVEFMCisJaGVscAorCSAgU2F5IFkgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byB1c2UgdGhlIE9TUyAvZGV2L3NlcXVlbmNlcgorCSAgaW50ZXJmYWNlLiAgVGhpcyBjb2RlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbC4KKworY29uZmlnIFNPVU5EX0ZVU0lPTgorCXRyaXN0YXRlICJDcnlzdGFsIFNvdW5kRnVzaW9uIChDUzQyODAvNDYxeCkiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORAorCWhlbHAKKwkgIFRoaXMgbW9kdWxlIGRyaXZlcyB0aGUgQ3J5c3RhbCBTb3VuZEZ1c2lvbiBkZXZpY2VzIChDUzQyODAvNDZ4eAorCSAgc2VyaWVzKSB3aGVuIHdpcmVkIGFzIG5hdGl2ZSBzb3VuZCBkcml2ZXJzIHdpdGggQUM5NyBjb2RlY3MuICBJZgorCSAgdGhpcyBkcml2ZXIgZG9lcyBub3Qgd29yayB0cnkgdGhlIENTNDIzMiBkcml2ZXIuCisKK2NvbmZpZyBTT1VORF9DUzQyODEKKwl0cmlzdGF0ZSAiQ3J5c3RhbCBTb3VuZCBDUzQyODEiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORAorCWhlbHAKKwkgIFBpY3R1cmUgYW5kIGZlYXR1cmUgbGlzdCBhdAorCSAgPGh0dHA6Ly93d3cucGNicm9rZXIuY29tL2NyeXN0YWw0MjgxLmh0bWw+LgorCitjb25maWcgU09VTkRfQkNNX0NTNDI5N0EKKwl0cmlzdGF0ZSAiQ3J5c3RhbCBTb3VuZCBDUzQyOTdhIChmb3IgU3dhcm0pIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU0lCWVRFX1NXQVJNICYmIFNPVU5ECisJaGVscAorCSAgVGhlIEJDTTkxMjUwQSBoYXMgYSBDcnlzdGFsIENTNDI5N2Egb24gc3luY2hyb25vdXMgc2VyaWFsCisJICBwb3J0IEIgKGluIGFkZGl0aW9uIHRvIHRoZSBEQi05IHNlcmlhbCBwb3J0KS4gIFNheSBZIG9yIE0KKwkgIGhlcmUgdG8gZW5hYmxlIHRoZSBzb3VuZCBjaGlwIGluc3RlYWQgb2YgdGhlIFVBUlQuICBBbHNvCisJICBub3RlIHRoYXQgQ09ORklHX0tHREIgc2hvdWxkIG5vdCBiZSBlbmFibGVkIGF0IHRoZSBzYW1lCisJICB0aW1lLCBzaW5jZSBpdCBhbHNvIGF0dGVtcHRzIHRvIHVzZSB0aGlzIFVBUlQgcG9ydC4KKworY29uZmlnIFNPVU5EX0VTMTM3MAorCXRyaXN0YXRlICJFbnNvbmlxIEF1ZGlvUENJIChFUzEzNzApIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQgJiYgUENJICYmIFNPVU5EX0dBTUVQT1JUCisJaGVscAorCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhIFBDSSBzb3VuZCBjYXJkIHV0aWxpemluZyB0aGUgRW5zb25pcQorCSAgRVMxMzcwIGNoaXBzZXQsIHN1Y2ggYXMgRW5zb25pcSdzIEF1ZGlvUENJIChub24tOTcpLiBUbyBmaW5kCisJICBvdXQgaWYgeW91ciBzb3VuZCBjYXJkIHVzZXMgYW4gRVMxMzcwIHdpdGhvdXQgcmVtb3ZpbmcgeW91cgorCSAgY29tcHV0ZXIncyBjb3ZlciwgdXNlIGxzcGNpIC1uIGFuZCBsb29rIGZvciB0aGUgUENJIElECisJICAxMjc0OjUwMDAuIFNpbmNlIEVuc29uaXEgd2FzIGJvdWdodCBieSBDcmVhdGl2ZSBMYWJzLAorCSAgU291bmQgQmxhc3RlciA2NC9QQ0kgbW9kZWxzIGFyZSBlaXRoZXIgRVMxMzcwIG9yIEVTMTM3MSBiYXNlZC4KKwkgIFRoaXMgZHJpdmVyIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSBPU1MvRnJlZSwgc28gUExFQVNFIFJFQUQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL2VzMTM3MD4uCisKK2NvbmZpZyBTT1VORF9FUzEzNzEKKwl0cmlzdGF0ZSAiQ3JlYXRpdmUgRW5zb25pcSBBdWRpb1BDSSA5NyAoRVMxMzcxKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSSAmJiBTT1VORF9HQU1FUE9SVAorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBQQ0kgc291bmQgY2FyZCB1dGlsaXppbmcgdGhlIEVuc29uaXEKKwkgIEVTMTM3MSBjaGlwc2V0LCBzdWNoIGFzIEVuc29uaXEncyBBdWRpb1BDSTk3LiBUbyBmaW5kIG91dCBpZgorCSAgeW91ciBzb3VuZCBjYXJkIHVzZXMgYW4gRVMxMzcxIHdpdGhvdXQgcmVtb3ZpbmcgeW91ciBjb21wdXRlcidzCisJICBjb3ZlciwgdXNlIGxzcGNpIC1uIGFuZCBsb29rIGZvciB0aGUgUENJIElEIDEyNzQ6MTM3MS4gU2luY2UKKwkgIEVuc29uaXEgd2FzIGJvdWdodCBieSBDcmVhdGl2ZSBMYWJzLCBTb3VuZCBCbGFzdGVyIDY0L1BDSQorCSAgbW9kZWxzIGFyZSBlaXRoZXIgRVMxMzcwIG9yIEVTMTM3MSBiYXNlZC4gVGhpcyBkcml2ZXIgZGlmZmVycworCSAgc2xpZ2h0bHkgZnJvbSBPU1MvRnJlZSwgc28gUExFQVNFIFJFQUQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL2VzMTM3MT4uCisKK2NvbmZpZyBTT1VORF9FU1NTT0xPMQorCXRyaXN0YXRlICJFU1MgVGVjaG5vbG9neSBTb2xvMSIgCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiBTT1VORF9HQU1FUE9SVCAmJiBQQ0kKKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgUENJIHNvdW5kIGNhcmQgdXRpbGl6aW5nIHRoZSBFU1MgVGVjaG5vbG9neQorCSAgU29sbzEgY2hpcC4gVG8gZmluZCBvdXQgaWYgeW91ciBzb3VuZCBjYXJkIHVzZXMgYQorCSAgU29sbzEgY2hpcCB3aXRob3V0IHJlbW92aW5nIHlvdXIgY29tcHV0ZXIncyBjb3ZlciwgdXNlCisJICBsc3BjaSAtbiBhbmQgbG9vayBmb3IgdGhlIFBDSSBJRCAxMjVEOjE5NjkuIFRoaXMgZHJpdmVyCisJICBkaWZmZXJzIHNsaWdodGx5IGZyb20gT1NTL0ZyZWUsIHNvIFBMRUFTRSBSRUFECisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9zb2xvMT4uCisKK2NvbmZpZyBTT1VORF9NQUVTVFJPCisJdHJpc3RhdGUgIkVTUyBNYWVzdHJvLCBNYWVzdHJvMiwgTWFlc3RybzJFIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBzb3VuZCBzeXN0ZW0gZHJpdmVuIGJ5IEVTUydzIE1hZXN0cm8gbGluZQorCSAgb2YgUENJIHNvdW5kIGNoaXBzLiAgVGhlc2UgaW5jbHVkZSB0aGUgTWFlc3RybyAxLCBNYWVzdHJvIDIsIGFuZAorCSAgTWFlc3RybyAyRS4gIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9NYWVzdHJvPiBmb3IgbW9yZQorCSAgZGV0YWlscy4KKworY29uZmlnIFNPVU5EX01BRVNUUk8zCisJdHJpc3RhdGUgIkVTUyBNYWVzdHJvMy9BbGxlZ3JvIGRyaXZlciAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFBDSSAmJiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgc291bmQgc3lzdGVtIGRyaXZlbiBieSBFU1MncyBNYWVzdHJvIDMKKwkgIFBDSSBzb3VuZCBjaGlwLgorCitjb25maWcgU09VTkRfSUNICisJdHJpc3RhdGUgIkludGVsIElDSCAoaTh4eCkgYXVkaW8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFBDSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIGludGVncmFsIGF1ZGlvIGluIEludGVsJ3MgSS9PIENvbnRyb2xsZXIgSHViIChJQ0gpCisJICBjaGlwc2V0LCBhcyB1c2VkIG9uIHRoZSA4MTAvODIwLzg0MCBtb3RoZXJib2FyZHMuCisKK2NvbmZpZyBTT1VORF9IQVJNT05ZCisJdHJpc3RhdGUgIlBBIEhhcm1vbnkgYXVkaW8gZHJpdmVyIgorCWRlcGVuZHMgb24gR1NDX0xBU0kgJiYgU09VTkRfUFJJTUUhPW4KKwloZWxwCisJICBTYXkgJ1knIG9yICdNJyB0byBpbmNsdWRlIHN1cHBvcnQgZm9yIEhhcm1vbnkgc291bmRjaGlwCisJICBvbiBIUCA3MTIsIDcxNS9uZXcgYW5kIG1hbnkgb3RoZXIgR1NDIGJhc2VkIG1hY2hpbmVzLgorCitjb25maWcgU09VTkRfU09OSUNWSUJFUworCXRyaXN0YXRlICJTMyBTb25pY1ZpYmVzIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQgJiYgU09VTkRfR0FNRVBPUlQKKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgUENJIHNvdW5kIGNhcmQgdXRpbGl6aW5nIHRoZSBTMworCSAgU29uaWNWaWJlcyBjaGlwc2V0LiBUbyBmaW5kIG91dCBpZiB5b3VyIHNvdW5kIGNhcmQgdXNlcyBhCisJICBTb25pY1ZpYmVzIGNoaXAgd2l0aG91dCByZW1vdmluZyB5b3VyIGNvbXB1dGVyJ3MgY292ZXIsIHVzZQorCSAgbHNwY2kgLW4gYW5kIGxvb2sgZm9yIHRoZSBQQ0kgSUQgNTMzMzpDQTAwLiBUaGlzIGRyaXZlcgorCSAgZGlmZmVycyBzbGlnaHRseSBmcm9tIE9TUy9GcmVlLCBzbyBQTEVBU0UgUkVBRAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3Mvc29uaWN2aWJlcz4uCisKK2NvbmZpZyBTT1VORF9WV1NORAorCXRyaXN0YXRlICJTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIFNvdW5kIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgWDg2X1ZJU1dTICYmIFNPVU5ECisJaGVscAorCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhbiBTR0kgVmlzdWFsIFdvcmtzdGF0aW9uIGFuZCB5b3Ugd2FudCB0byBiZQorCSAgYWJsZSB0byB1c2UgaXRzIG9uLWJvYXJkIGF1ZGlvLiAgUmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvdndzbmQ+IGZvciBtb3JlIGluZm8gb24gdGhpcyBkcml2ZXIncworCSAgY2FwYWJpbGl0aWVzLgorCitjb25maWcgU09VTkRfSEFMMgorCXRyaXN0YXRlICJTR0kgSEFMMiBzb3VuZCAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFNHSV9JUDIyICYmIEVYUEVSSU1FTlRBTAorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYW4gU0dJIEluZHkgc3lzdGVtIGFuZCB3YW50IHRvIGJlIGFibGUgdG8KKwkgIHVzZSBpdCdzIG9uLWJvYXJkIEEyIGF1ZGlvIHN5c3RlbS4KKworY29uZmlnIFNPVU5EX0lUODE3MgorCXRyaXN0YXRlICJJVDgxNzJHIFNvdW5kIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgKE1JUFNfSVRFODE3MiB8fCBNSVBTX0lWUikgJiYgU09VTkQKKworY29uZmlnIFNPVU5EX1ZSQzU0NzcKKwl0cmlzdGF0ZSAiTkVDIFZyYzU0NzcgQUM5NyBzb3VuZCIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIEREQjU0NzcgJiYgU09VTkQKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGVuYWJsZSBzb3VuZCBzdXBwb3J0IGZvciB0aGUgTkVDIFZyYzU0NzcgY2hpcCwgYW4KKwkgIGludGVncmF0ZWQsIG11bHRpLWZ1bmN0aW9uIGNvbnRyb2xsZXIgY2hpcCBmb3IgTUlQUyBDUFVzLiAgV29ya3MKKwkgIHdpdGggdGhlIEFDOTcgY29kZWMuCisKK2NvbmZpZyBTT1VORF9BVTEwMDAKKwl0cmlzdGF0ZSAiQXUxMDAwIFNvdW5kIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgKFNPQ19BVTEwMDAgfHwgU09DX0FVMTEwMCB8fCBTT0NfQVUxNTAwKSAmJiBTT1VORAorCitjb25maWcgU09VTkRfQVUxNTUwX0FDOTcKKwl0cmlzdGF0ZSAiQXUxNTUwIEFDOTcgU291bmQiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT0NfQVUxNTUwICYmIFNPVU5ECisKK2NvbmZpZyBTT1VORF9UUklERU5UCisJdHJpc3RhdGUgIlRyaWRlbnQgNERXYXZlIERYL05YLCBTaVMgNzAxOCBvciBBTGkgNTQ1MSBQQ0kgQXVkaW8gQ29yZSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIFNPVU5EX0dBTUVQT1JUCisJLS0taGVscC0tLQorCSAgU2F5IFkgb3IgTSBpZiB5b3UgaGF2ZSBhIFBDSSBzb3VuZCBjYXJkIHV0aWxpemluZyB0aGUgVHJpZGVudAorCSAgNERXYXZlLURYL05YIGNoaXBzZXQgb3IgeW91ciBtb3RoZXIgYm9hcmQgY2hpcHNldCBoYXMgU2lTIDcwMTgKKwkgIG9yIEFMaSA1NDUxIGJ1aWx0LWluLiBUaGUgU2lTIDcwMTggUENJIEF1ZGlvIENvcmUgaXMgZW1iZWRkZWQKKwkgIGluIFNpUzk2MCBTdXBlciBTb3V0aCBCcmlkZ2UgYW5kIFNpUzU0MC82MzAgU2luZ2xlIENoaXBzZXQuCisJICBUaGUgQUxpIDU0NTEgUENJIEF1ZGlvIENvcmUgaXMgZW1iZWRkZWQgaW4gQUxpIE0xNTM1LCBNMTUzNUQsCisJICBNMTUzNSsgb3IgTTE1MzVEKyBTb3V0aCBCcmlkZ2UuCisKKwkgIFVzZSBsc3BjaSAtbiB0byBmaW5kIG91dCBpZiB5b3VyIHNvdW5kIGNhcmQgb3IgY2hpcHNldCB1c2VzCisJICBUcmlkZW50IDREV2F2ZSBvciBTaVMgNzAxOC4gUENJIElEIDEwMjM6MjAwMCBvciAxMDIzOjIwMDEgc3RhbmRzCisJICBmb3IgVHJpZGVudCA0RHdhdmUuIFBDSSBJRCAxMDM5OjcwMTggc3RhbmRzIGZvciBTaVM3MDE4LiBQQ0kgSUQKKwkgIDEwQjk6NTQ1MSBzdGFuZHMgZm9yIEFMaTU0NTEuCisKKwkgIFRoaXMgZHJpdmVyIHN1cHBvcnRzIFMvUERJRiBpbi9vdXQgKHJlY29yZC9wbGF5YmFjaykgZm9yIEFMaSA1NDUxCisJICBlbWJlZGRlZCBpbiBBTGkgTTE1MzUrIGFuZCBNMTUzNUQrLiBOb3RlIHRoYXQgdGhleSBhcmVuJ3QgYWxsCisJICBlbmFibGVkIGJ5IGRlZmF1bHQ7IHlvdSBjYW4gZW5hYmxlIHRoZW0gYnkgc2F5aW5nIFkgdG8gIi9wcm9jIGZpbGUKKwkgIHN5c3RlbSBzdXBwb3J0IiBhbmQgIlN5c2N0bCBzdXBwb3J0IiwgYW5kIGFmdGVyIHRoZSAvcHJvYyBmaWxlCisJICBzeXN0ZW0gaGFzIGJlZW4gbW91bnRlZCwgZXhlY3V0aW5nIHRoZSBjb21tYW5kCisKKwkgIAljb21tYW5kCQkJd2hhdCBpcyBlbmFibGVkCisKKwkgIGVjaG8gMD4vcHJvYy9BTGk1NDUxCXBjbSBvdXQgaXMgYWxzbyBzZXQgdG8gUy9QRElGIG91dC4gKERlZmF1bHQpLgorCisJICBlY2hvIDE+L3Byb2MvQUxpNTQ1MQl1c2UgUy9QRElGIG91dCB0byBvdXRwdXQgcGNtIGRhdGEuCisKKwkgIGVjaG8gMj4vcHJvYy9BTGk1NDUxCXVzZSBTL1BESUYgb3V0IHRvIG91dHB1dCBub24tcGNtIGRhdGEuCisJICAoQUMzLi4uKS4KKworCSAgZWNobyAzPi9wcm9jL0FMaTU0NTEJcmVjb3JkIGZyb20gQWM5NyBpbihNSUMsIExpbmUgaW4uLi4pLgorCSAgKERlZmF1bHQpLgorCisJICBlY2hvIDQ+L3Byb2MvQUxpNTQ1MQlubyBtYXR0ZXIgQWM5NyBzZXR0aW5ncywgcmVjb3JkIGZyb20gUy9QRElGCisJICBpbi4KKworCisJICBUaGlzIGRyaXZlciBkaWZmZXJzIHNsaWdodGx5IGZyb20gT1NTL0ZyZWUsIHNvIFBMRUFTRSBSRUFEIHRoZQorCSAgY29tbWVudHMgYXQgdGhlIHRvcCBvZiA8ZmlsZTpkcml2ZXJzL3NvdW5kL3RyaWRlbnQuYz4uCisKK2NvbmZpZyBTT1VORF9NU05EQ0xBUworCXRyaXN0YXRlICJTdXBwb3J0IGZvciBUdXJ0bGUgQmVhY2ggTXVsdGlTb3VuZCBDbGFzc2ljLCBUYWhpdGksIE1vbnRlcmV5IgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQgJiYgKG0gfHwgIVNUQU5EQUxPTkUpCisJaGVscAorCSAgU2F5IE0gaGVyZSBpZiB5b3UgaGF2ZSBhIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kIENsYXNzaWMsIFRhaGl0aSBvcgorCSAgTW9udGVyZXkgKG5vdCBmb3IgdGhlIFBpbm5hY2xlIG9yIEZpamkpLgorCisJICBTZWUgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvTXVsdGlTb3VuZD4gZm9yIGltcG9ydGFudCBpbmZvcm1hdGlvbgorCSAgYWJvdXQgdGhpcyBkcml2ZXIuICBOb3RlIHRoYXQgaXQgaGFzIGJlZW4gZGlzY29udGludWVkLCBidXQgdGhlCisJICBWb3lldHJhIFR1cnRsZSBCZWFjaCBrbm93bGVkZ2UgYmFzZSBlbnRyeSBmb3IgaXQgaXMgc3RpbGwgYXZhaWxhYmxlCisJICBhdCA8aHR0cDovL3d3dy50dXJ0bGViZWFjaC5jb20vc2l0ZS9rYl9mdHAvNzkwLmFzcD4uCisKK2NvbW1lbnQgIkNvbXBpbGVkLWluIE1TTkQgQ2xhc3NpYyBzdXBwb3J0IHJlcXVpcmVzIGZpcm13YXJlIGR1cmluZyBjb21waWxhdGlvbi4iCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBTT1VORF9NU05EQ0xBUz15CisKK2NvbmZpZyBNU05EQ0xBU19IQVZFX0JPT1QKKwlib29sCisJZGVwZW5kcyBvbiBTT1VORF9NU05EQ0xBUz15ICYmICFTVEFOREFMT05FCisJZGVmYXVsdCB5CisKK2NvbmZpZyBNU05EQ0xBU19JTklUX0ZJTEUKKwlzdHJpbmcgIkZ1bGwgcGF0aG5hbWUgb2YgTVNORElOSVQuQklOIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBTT1VORF9NU05EQ0xBUworCWRlZmF1bHQgIi9ldGMvc291bmQvbXNuZGluaXQuYmluIgorCWhlbHAKKwkgIFRoZSBNdWx0aVNvdW5kIGNhcmRzIGhhdmUgdHdvIGZpcm13YXJlIGZpbGVzIHdoaWNoIGFyZSByZXF1aXJlZCBmb3IKKwkgIG9wZXJhdGlvbiwgYW5kIGFyZSBub3QgY3VycmVudGx5IGluY2x1ZGVkLiBUaGVzZSBmaWxlcyBjYW4gYmUKKwkgIG9idGFpbmVkIGZyb20gVHVydGxlIEJlYWNoLiBTZWUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL011bHRpU291bmQ+IGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8KKwkgIG9idGFpbiB0aGlzLgorCitjb25maWcgTVNORENMQVNfUEVSTV9GSUxFCisJc3RyaW5nICJGdWxsIHBhdGhuYW1lIG9mIE1TTkRQRVJNLkJJTiBmaXJtd2FyZSBmaWxlIgorCWRlcGVuZHMgb24gU09VTkRfTVNORENMQVMKKwlkZWZhdWx0ICIvZXRjL3NvdW5kL21zbmRwZXJtLmJpbiIKKwloZWxwCisJICBUaGUgTXVsdGlTb3VuZCBjYXJkcyBoYXZlIHR3byBmaXJtd2FyZSBmaWxlcyB3aGljaCBhcmUgcmVxdWlyZWQgZm9yCisJICBvcGVyYXRpb24sIGFuZCBhcmUgbm90IGN1cnJlbnRseSBpbmNsdWRlZC4gVGhlc2UgZmlsZXMgY2FuIGJlCisJICBvYnRhaW5lZCBmcm9tIFR1cnRsZSBCZWFjaC4gU2VlCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9NdWx0aVNvdW5kPiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvCisJICBvYnRhaW4gdGhpcy4KKworY29uZmlnIE1TTkRDTEFTX0lSUQorCWludCAiTVNORCBDbGFzc2ljIElSUSA1LCA3LCA5LCAxMCwgMTEsIDEyIgorCWRlcGVuZHMgb24gU09VTkRfTVNORENMQVM9eQorCWRlZmF1bHQgIjUiCisJaGVscAorCSAgSW50ZXJydXB0IFJlcXVlc3QgbGluZSBmb3IgdGhlIE11bHRpU291bmQgQ2xhc3NpYyBhbmQgcmVsYXRlZCBjYXJkcy4KKworY29uZmlnIE1TTkRDTEFTX01FTQorCWhleCAiTVNORCBDbGFzc2ljIG1lbW9yeSBCMDAwMCwgQzgwMDAsIEQwMDAwLCBEODAwMCwgRTAwMDAsIEU4MDAwIgorCWRlcGVuZHMgb24gU09VTkRfTVNORENMQVM9eQorCWRlZmF1bHQgIkQwMDAwIgorCWhlbHAKKwkgIE1lbW9yeS1tYXBwZWQgSS9PIGJhc2UgYWRkcmVzcyBmb3IgdGhlIE11bHRpU291bmQgQ2xhc3NpYyBhbmQKKwkgIHJlbGF0ZWQgY2FyZHMuCisKK2NvbmZpZyBNU05EQ0xBU19JTworCWhleCAiTVNORCBDbGFzc2ljIEkvTyAyMTAsIDIyMCwgMjMwLCAyNDAsIDI1MCwgMjYwLCAyOTAsIDNFMCIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRDTEFTPXkKKwlkZWZhdWx0ICIyOTAiCisJaGVscAorCSAgSS9PIHBvcnQgYWRkcmVzcyBmb3IgdGhlIE11bHRpU291bmQgQ2xhc3NpYyBhbmQgcmVsYXRlZCBjYXJkcy4KKworY29uZmlnIFNPVU5EX01TTkRQSU4KKwl0cmlzdGF0ZSAiU3VwcG9ydCBmb3IgVHVydGxlIEJlYWNoIE11bHRpU291bmQgUGlubmFjbGUsIEZpamkiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiAobSB8fCAhU1RBTkRBTE9ORSkKKwloZWxwCisJICBTYXkgTSBoZXJlIGlmIHlvdSBoYXZlIGEgVHVydGxlIEJlYWNoIE11bHRpU291bmQgUGlubmFjbGUgb3IgRmlqaS4KKwkgIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9NdWx0aVNvdW5kPiBmb3IgaW1wb3J0YW50IGluZm9ybWF0aW9uCisJICBhYm91dCB0aGlzIGRyaXZlci4gTm90ZSB0aGF0IGl0IGhhcyBiZWVuIGRpc2NvbnRpbnVlZCwgYnV0IHRoZQorCSAgVm95ZXRyYSBUdXJ0bGUgQmVhY2gga25vd2xlZGdlIGJhc2UgZW50cnkgZm9yIGl0IGlzIHN0aWxsIGF2YWlsYWJsZQorCSAgYXQgPGh0dHA6Ly93d3cudHVydGxlYmVhY2guY29tL3NpdGUva2JfZnRwLzYwMC5hc3A+LgorCitjb21tZW50ICJDb21waWxlZC1pbiBNU05EIFBpbm5hY2xlIHN1cHBvcnQgcmVxdWlyZXMgZmlybXdhcmUgZHVyaW5nIGNvbXBpbGF0aW9uLiIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFNPVU5EX01TTkRQSU49eQorCitjb25maWcgTVNORFBJTl9IQVZFX0JPT1QKKwlib29sCisJZGVwZW5kcyBvbiBTT1VORF9NU05EUElOPXkKKwlkZWZhdWx0IHkKKworY29uZmlnIE1TTkRQSU5fSU5JVF9GSUxFCisJc3RyaW5nICJGdWxsIHBhdGhuYW1lIG9mIFBORFNQSU5JLkJJTiBmaXJtd2FyZSBmaWxlIgorCWRlcGVuZHMgb24gU09VTkRfTVNORFBJTgorCWRlZmF1bHQgIi9ldGMvc291bmQvcG5kc3BpbmkuYmluIgorCWhlbHAKKwkgIFRoZSBNdWx0aVNvdW5kIGNhcmRzIGhhdmUgdHdvIGZpcm13YXJlIGZpbGVzIHdoaWNoIGFyZSByZXF1aXJlZAorCSAgZm9yIG9wZXJhdGlvbiwgYW5kIGFyZSBub3QgY3VycmVudGx5IGluY2x1ZGVkLiBUaGVzZSBmaWxlcyBjYW4gYmUKKwkgIG9idGFpbmVkIGZyb20gVHVydGxlIEJlYWNoLiBTZWUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL011bHRpU291bmQ+IGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8KKwkgIG9idGFpbiB0aGlzLgorCitjb25maWcgTVNORFBJTl9QRVJNX0ZJTEUKKwlzdHJpbmcgIkZ1bGwgcGF0aG5hbWUgb2YgUE5EU1BFUk0uQklOIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBTT1VORF9NU05EUElOCisJZGVmYXVsdCAiL2V0Yy9zb3VuZC9wbmRzcGVybS5iaW4iCisJaGVscAorCSAgVGhlIE11bHRpU291bmQgY2FyZHMgaGF2ZSB0d28gZmlybXdhcmUgZmlsZXMgd2hpY2ggYXJlIHJlcXVpcmVkIGZvcgorCSAgb3BlcmF0aW9uLCBhbmQgYXJlIG5vdCBjdXJyZW50bHkgaW5jbHVkZWQuIFRoZXNlIGZpbGVzIGNhbiBiZQorCSAgb2J0YWluZWQgZnJvbSBUdXJ0bGUgQmVhY2guIFNlZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvTXVsdGlTb3VuZD4gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0bworCSAgb2J0YWluIHRoaXMuCisKK2NvbmZpZyBNU05EUElOX0lSUQorCWludCAiTVNORCBQaW5uYWNsZSBJUlEgNSwgNywgOSwgMTAsIDExLCAxMiIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRQSU49eQorCWRlZmF1bHQgIjUiCisJaGVscAorCSAgSW50ZXJydXB0IHJlcXVlc3QgbGluZSBmb3IgdGhlIHByaW1hcnkgc3ludGhlc2l6ZXIgb24gTXVsdGlTb3VuZAorCSAgUGlubmFjbGUgYW5kIEZpamkgc291bmQgY2FyZHMuCisKK2NvbmZpZyBNU05EUElOX01FTQorCWhleCAiTVNORCBQaW5uYWNsZSBtZW1vcnkgQjAwMDAsIEM4MDAwLCBEMDAwMCwgRDgwMDAsIEUwMDAwLCBFODAwMCIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRQSU49eQorCWRlZmF1bHQgIkQwMDAwIgorCWhlbHAKKwkgIE1lbW9yeS1tYXBwZWQgSS9PIGJhc2UgYWRkcmVzcyBmb3IgdGhlIHByaW1hcnkgc3ludGhlc2l6ZXIgb24KKwkgIE11bHRpU291bmQgUGlubmFjbGUgYW5kIEZpamkgc291bmQgY2FyZHMuCisKK2NvbmZpZyBNU05EUElOX0lPCisJaGV4ICJNU05EIFBpbm5hY2xlIEkvTyAyMTAsIDIyMCwgMjMwLCAyNDAsIDI1MCwgMjYwLCAyOTAsIDNFMCIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRQSU49eQorCWRlZmF1bHQgIjI5MCIKKwloZWxwCisJICBNZW1vcnktbWFwcGVkIEkvTyBiYXNlIGFkZHJlc3MgZm9yIHRoZSBwcmltYXJ5IHN5bnRoZXNpemVyIG9uCisJICBNdWx0aVNvdW5kIFBpbm5hY2xlIGFuZCBGaWppIHNvdW5kIGNhcmRzLgorCitjb25maWcgTVNORFBJTl9ESUdJVEFMCisJYm9vbCAiTVNORCBQaW5uYWNsZSBoYXMgUy9QRElGIEkvTyIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRQSU49eQorCWhlbHAKKwkgIElmIHlvdSBoYXZlIHRoZSBTL1BESUYgZGF1Z2h0ZXIgYm9hcmQgZm9yIHRoZSBQaW5uYWNsZSBvciBGaWppLAorCSAgYW5zd2VyIFkgaGVyZTsgb3RoZXJ3aXNlLCBzYXkgTi4gSWYgeW91IGhhdmUgdGhpcywgeW91IHdpbGwgYmUgYWJsZQorCSAgdG8gcGxheSBhbmQgcmVjb3JkIGZyb20gdGhlIFMvUERJRiBwb3J0IChkaWdpdGFsIHNpZ25hbCkuIFNlZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvTXVsdGlTb3VuZD4gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBtYWtlCisJICB1c2Ugb2YgdGhpcyBjYXBhYmlsaXR5LgorCitjb25maWcgTVNORFBJTl9OT05QTlAKKwlib29sICJNU05EIFBpbm5hY2xlIG5vbi1QblAgTW9kZSIKKwlkZXBlbmRzIG9uIFNPVU5EX01TTkRQSU49eQorCWhlbHAKKwkgIFRoZSBQaW5uYWNsZSBhbmQgRmlqaSBjYXJkIHJlc291cmNlcyBjYW4gYmUgY29uZmlndXJlZCBlaXRoZXIgd2l0aAorCSAgUG5QLCBvciB0aHJvdWdoIGEgY29uZmlndXJhdGlvbiBwb3J0LiBTYXkgWSBoZXJlIGlmIHlvdXIgY2FyZCBpcyBOT1QKKwkgIGluIFBuUCBtb2RlLiBGb3IgdGhlIFBpbm5hY2xlLCBjb25maWd1cmF0aW9uIGluIG5vbi1QblAgbW9kZSBhbGxvd3MKKwkgIHVzZSBvZiB0aGUgSURFIGFuZCBqb3lzdGljayBwZXJpcGhlcmFscyBvbiB0aGUgY2FyZCBhcyB3ZWxsOyB0aGVzZQorCSAgZG8gbm90IHNob3cgdXAgd2hlbiB0aGUgY2FyZCBpcyBpbiBQblAgbW9kZS4gU3BlY2lmeWluZyB6ZXJvIGZvciBhbnkKKwkgIHJlc291cmNlIG9mIGEgZGV2aWNlIHdpbGwgZGlzYWJsZSB0aGUgZGV2aWNlLiBJZiB5b3UgYXJlIHJ1bm5pbmcgdGhlCisJICBjYXJkIGluIFBuUCBtb2RlLCB5b3UgbXVzdCBzYXkgTiBoZXJlIGFuZCB1c2UgaXNhcG5wdG9vbHMgdG8KKwkgIGNvbmZpZ3VyZSB0aGUgY2FyZCdzIHJlc291cmNlcy4KKworY29tbWVudCAiTVNORCBQaW5uYWNsZSBEU1Agc2VjdGlvbiB3aWxsIGJlIGNvbmZpZ3VyZWQgdG8gYWJvdmUgcGFyYW1ldGVycy4iCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSAmJiBTT1VORF9NU05EUElOPXkgJiYgTVNORFBJTl9OT05QTlAKKworY29uZmlnIE1TTkRQSU5fQ0ZHCisJaGV4ICJNU05EIFBpbm5hY2xlIGNvbmZpZyBwb3J0IDI1MCwyNjAsMjcwIgorCWRlcGVuZHMgb24gTVNORFBJTl9OT05QTlAKKwlkZWZhdWx0ICIyNTAiCisJaGVscAorCSAgVGhpcyBpcyB0aGUgcG9ydCB3aGljaCB0aGUgUGlubmFjbGUgYW5kIEZpamkgdXNlcyB0byBjb25maWd1cmUgdGhlCisJICBjYXJkJ3MgcmVzb3VyY2VzIHdoZW4gbm90IGluIFBuUCBtb2RlLiBJZiB5b3VyIGNhcmQgaXMgaW4gUG5QIG1vZGUsCisJICB0aGVuIGJlIHN1cmUgdG8gc2F5IE4gdG8gdGhlIHByZXZpb3VzIG9wdGlvbiwgIk1TTkQgUGlubmFjbGUgTm9uLVBuUAorCSAgTW9kZSIuCisKK2NvbW1lbnQgIlBpbm5hY2xlLXNwZWNpZmljIERldmljZSBDb25maWd1cmF0aW9uICgwIGRpc2FibGVzKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIFNPVU5EX01TTkRQSU49eSAmJiBNU05EUElOX05PTlBOUAorCitjb25maWcgTVNORFBJTl9NUFVfSU8KKwloZXggIk1TTkQgUGlubmFjbGUgTVBVIEkvTyAoZS5nLiAzMzApIgorCWRlcGVuZHMgb24gTVNORFBJTl9OT05QTlAKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIE1lbW9yeS1tYXBwZWQgSS9PIGJhc2UgYWRkcmVzcyBmb3IgdGhlIEt1cnp3ZWlsIGRhdWdodGVyYm9hcmQKKwkgIHN5bnRoZXNpemVyIG9uIE11bHRpU291bmQgUGlubmFjbGUgYW5kIEZpamkgc291bmQgY2FyZHMuCisKK2NvbmZpZyBNU05EUElOX01QVV9JUlEKKwlpbnQgIk1TTkQgUGlubmFjbGUgTVBVIElSUSAoZS5nLiA5KSIKKwlkZXBlbmRzIG9uIE1TTkRQSU5fTk9OUE5QCisJZGVmYXVsdCAiMCIKKwloZWxwCisJICBJbnRlcnJ1cHQgcmVxdWVzdCBudW1iZXIgZm9yIHRoZSBLdXJ6d2VpbCBkYXVnaHRlcmJvYXJkCisJICBzeW50aGVzaXplciBvbiBNdWx0aVNvdW5kIFBpbm5hY2xlIGFuZCBGaWppIHNvdW5kIGNhcmRzLgorCitjb25maWcgTVNORFBJTl9JREVfSU8wCisJaGV4ICJNU05EIFBpbm5hY2xlIElERSBJL08gMCAoZS5nLiAxNzApIgorCWRlcGVuZHMgb24gTVNORFBJTl9OT05QTlAKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIENELVJPTSBkcml2ZSAwIG1lbW9yeS1tYXBwZWQgSS9PIGJhc2UgYWRkcmVzcyBmb3IgdGhlIE11bHRpU291bmQKKwkgIFBpbm5hY2xlIGFuZCBGaWppIHNvdW5kIGNhcmRzLgorCitjb25maWcgTVNORFBJTl9JREVfSU8xCisJaGV4ICJNU05EIFBpbm5hY2xlIElERSBJL08gMSAoZS5nLiAzNzYpIgorCWRlcGVuZHMgb24gTVNORFBJTl9OT05QTlAKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIENELVJPTSBkcml2ZSAxIG1lbW9yeS1tYXBwZWQgSS9PIGJhc2UgYWRkcmVzcyBmb3IgdGhlIE11bHRpU291bmQKKwkgIFBpbm5hY2xlIGFuZCBGaWppIHNvdW5kIGNhcmRzLgorCitjb25maWcgTVNORFBJTl9JREVfSVJRCisJaW50ICJNU05EIFBpbm5hY2xlIElERSBJUlEgKGUuZy4gMTUpIgorCWRlcGVuZHMgb24gTVNORFBJTl9OT05QTlAKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIEludGVycnVwdCByZXF1ZXN0IG51bWJlciBmb3IgdGhlIElERSBDRC1ST00gaW50ZXJmYWNlIG9uIHRoZQorCSAgTXVsdGlTb3VuZCBQaW5uYWNsZSBhbmQgRmlqaSBzb3VuZCBjYXJkcy4KKworY29uZmlnIE1TTkRQSU5fSk9ZU1RJQ0tfSU8KKwloZXggIk1TTkQgUGlubmFjbGUgam95c3RpY2sgSS9PIChlLmcuIDIwMCkiCisJZGVwZW5kcyBvbiBNU05EUElOX05PTlBOUAorCWRlZmF1bHQgIjAiCisJaGVscAorCSAgTWVtb3J5LW1hcHBlZCBJL08gYmFzZSBhZGRyZXNzIGZvciB0aGUgam95c3RpY2sgcG9ydCBvbiBNdWx0aVNvdW5kCisJICBQaW5uYWNsZSBhbmQgRmlqaSBzb3VuZCBjYXJkcy4KKworY29uZmlnIE1TTkRfRklGT1NJWkUKKwlpbnQgIk1TTkQgYnVmZmVyIHNpemUgKGtCKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FICYmIChTT1VORF9NU05EUElOPXkgfHwgU09VTkRfTVNORENMQVM9eSkKKwlkZWZhdWx0ICIxMjgiCisJaGVscAorCSAgQ29uZmlndXJlcyB0aGUgc2l6ZSBvZiBlYWNoIGF1ZGlvIGJ1ZmZlciwgaW4ga2lsb2J5dGVzLCBmb3IKKwkgIHJlY29yZGluZyBhbmQgcGxheWluZyBpbiB0aGUgTXVsdGlTb3VuZCBkcml2ZXJzIChib3RoIHRoZSBDbGFzc2ljCisJICBhbmQgUGlubmFjbGUpLiBMYXJnZXIgdmFsdWVzIHJlZHVjZSB0aGUgY2hhbmNlIG9mIGRhdGEgb3ZlcnJ1bnMgYXQKKwkgIHRoZSBleHBlbnNlIG9mIG92ZXJhbGwgbGF0ZW5jeS4gSWYgdW5zdXJlLCB1c2UgdGhlIGRlZmF1bHQuCisKK2NvbmZpZyBTT1VORF9WSUE4MkNYWFgKKwl0cmlzdGF0ZSAiVklBIDgyQzY4NiBBdWRpbyBDb2RlYyIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIGhlcmUgdG8gaW5jbHVkZSBzdXBwb3J0IGZvciB0aGUgYXVkaW8gY29kZWMgZm91bmQgb24gVklBCisJICA4MkN4eHgtYmFzZWQgY2hpcHMuIFR5cGljYWxseSB0aGVzZSBhcmUgYnVpbHQgaW50byBhIG1vdGhlcmJvYXJkLgorCisJICBETyBOT1Qgc2VsZWN0IFNvdW5kIEJsYXN0ZXIgb3IgQWRsaWIgd2l0aCB0aGlzIGRyaXZlciwgdW5sZXNzCisJICB5b3UgaGF2ZSBhIFNvdW5kIEJsYXN0ZXIgb3IgQWRsaWIgY2FyZCBpbiBhZGRpdGlvbiB0byB5b3VyIFZJQQorCSAgYXVkaW8gY2hpcC4KKworY29uZmlnIE1JRElfVklBODJDWFhYCisJYm9vbCAiVklBIDgyQzY4NiBNSURJIgorCWRlcGVuZHMgb24gU09VTkRfVklBODJDWFhYCisJaGVscAorCSAgQW5zd2VyIFkgdG8gdXNlIHRoZSBNSURJIGludGVyZmFjZSBvZiB0aGUgVmlhNjg2LiBZb3UgbWF5IG5lZWQgdG8KKwkgIGVuYWJsZSB0aGlzIGluIHRoZSBCSU9TIGJlZm9yZSBpdCB3aWxsIHdvcmsuIFRoaXMgaXMgZm9yIGNvbm5lY3Rpb24KKwkgIHRvIGV4dGVybmFsIE1JREkgaGFyZHdhcmUsIGFuZCBpcyBub3QgcmVxdWlyZWQgZm9yIHNvZnR3YXJlIHBsYXliYWNrCisJICBvZiBNSURJIGZpbGVzLgorCitjb25maWcgU09VTkRfT1NTCisJdHJpc3RhdGUgIk9TUyBzb3VuZCBtb2R1bGVzIgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgU09VTkQKKwloZWxwCisJICBPU1MgaXMgdGhlIE9wZW4gU291bmQgU3lzdGVtIHN1aXRlIG9mIHNvdW5kIGNhcmQgZHJpdmVycy4gIFRoZXkgbWFrZQorCSAgc291bmQgcHJvZ3JhbW1pbmcgZWFzaWVyIHNpbmNlIHRoZXkgcHJvdmlkZSBhIGNvbW1vbiBBUEkuICBTYXkgWSBvcgorCSAgTSBoZXJlICh0aGUgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNvdW5kKSBpZiB5b3UgaGF2ZW4ndCBmb3VuZCBhCisJICBkcml2ZXIgZm9yIHlvdXIgc291bmQgY2FyZCBhYm92ZSwgdGhlbiBwaWNrIHlvdXIgZHJpdmVyIGZyb20gdGhlCisJICBsaXN0IGJlbG93LgorCitjb25maWcgU09VTkRfVFJBQ0VJTklUCisJYm9vbCAiVmVyYm9zZSBpbml0aWFsaXNhdGlvbiIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCWhlbHAKKwkgIFZlcmJvc2Ugc291bmRjYXJkIGluaXRpYWxpemF0aW9uIC0tIGFmZmVjdHMgdGhlIGZvcm1hdCBvZiBhdXRvcHJvYmUKKwkgIGFuZCBpbml0aWFsaXphdGlvbiBtZXNzYWdlcyBhdCBib290IHRpbWUuCisKK2NvbmZpZyBTT1VORF9ETUFQCisJYm9vbCAiUGVyc2lzdGVudCBETUEgYnVmZmVycyIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCS0tLWhlbHAtLS0KKwkgIExpbnV4IGNhbiBvZnRlbiBoYXZlIHByb2JsZW1zIGFsbG9jYXRpbmcgRE1BIGJ1ZmZlcnMgZm9yIElTQSBzb3VuZAorCSAgY2FyZHMgb24gbWFjaGluZXMgd2l0aCBtb3JlIHRoYW4gMTZNQiBvZiBSQU0uIFRoaXMgaXMgYmVjYXVzZSBJU0EKKwkgIERNQSBidWZmZXJzIG11c3QgZXhpc3QgYmVsb3cgdGhlIDE2TUIgYm91bmRhcnkgYW5kIGl0IGlzIHF1aXRlCisJICBwb3NzaWJsZSB0aGF0IGEgbGFyZ2UgZW5vdWdoIGZyZWUgYmxvY2sgaW4gdGhpcyByZWdpb24gY2Fubm90IGJlCisJICBmb3VuZCBhZnRlciB0aGUgbWFjaGluZSBoYXMgYmVlbiBydW5uaW5nIGZvciBhIHdoaWxlLiBJZiB5b3Ugc2F5IFkKKwkgIGhlcmUgdGhlIERNQSBidWZmZXJzICg2NEtiKSB3aWxsIGJlIGFsbG9jYXRlZCBhdCBib290IHRpbWUgYW5kIGtlcHQKKwkgIHVudGlsIHRoZSBzaHV0ZG93bi4gVGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwgaWYgeW91IHNhaWQgWSB0bworCSAgIk9TUyBzb3VuZCBtb2R1bGVzIiwgYWJvdmUuIElmIHlvdSBzYWlkIE0gdG8gIk9TUyBzb3VuZCBtb2R1bGVzIgorCSAgdGhlbiB5b3UgY2FuIGdldCB0aGUgcGVyc2lzdGVudCBETUEgYnVmZmVyIGZ1bmN0aW9uYWxpdHkgYnkgcGFzc2luZworCSAgdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudCAiZG1hYnVmPTEiIHRvIHRoZSBzb3VuZCBtb2R1bGUuCisKKwkgIFNheSBZIHVubGVzcyB5b3UgaGF2ZSAxNk1CIG9yIG1vcmUgUkFNIG9yIGEgUENJIHNvdW5kIGNhcmQuCisKK2NvbmZpZyBTT1VORF9BRDE4MTYKKwl0cmlzdGF0ZSAiQUQxODE2KEEpIGJhc2VkIGNhcmRzIChFWFBFUklNRU5UQUwpIgorCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMICYmIFNPVU5EX09TUworCWhlbHAKKwkgIFNheSBNIGhlcmUgaWYgeW91IGhhdmUgYSBzb3VuZCBjYXJkIGJhc2VkIG9uIHRoZSBBbmFsb2cgRGV2aWNlcworCSAgQUQxODE2KEEpIGNoaXAuCisKKwkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsLCB5b3UgaGF2ZSB0byBhZGQKKwkgICJhZDE4MTY9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4iIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCitjb25maWcgU09VTkRfQUQxODg5CisJdHJpc3RhdGUgIkFEMTg4OSBiYXNlZCBjYXJkcyAoQUQxODE5IGNvZGVjKSAoRVhQRVJJTUVOVEFMKSIKKwlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTCAmJiBTT1VORF9PU1MKKwloZWxwCisJICBTYXkgTSBoZXJlIGlmIHlvdSBoYXZlIGEgc291bmQgY2FyZCBiYXNlZCBvbiB0aGUgQW5hbG9nIERldmljZXMKKwkgIEFEMTg4OSBjaGlwLgorCitjb25maWcgU09VTkRfU0dBTEFYWQorCXRyaXN0YXRlICJBenRlY2ggU291bmQgR2FsYXh5IChub24tUG5QKSBjYXJkcyIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCWhlbHAKKwkgIFRoaXMgbW9kdWxlIGluaXRpYWxpemVzIHRoZSBvbGRlciBub24gUGx1ZyBhbmQgUGxheSBzb3VuZCBnYWxheHkKKwkgIGNhcmRzIGZyb20gQXp0ZWNoLiBJdCBzdXBwb3J0cyB0aGUgV2F2ZXJpZGVyIFBybyAzMiAtIDNEIGFuZCB0aGUKKwkgIEdhbGF4eSBXYXNoaW5ndG9uIDE2LgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAic2dhbGF4eT08aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8c2diYXNlPiIgdG8gdGhlIGtlcm5lbCBjb21tYW5kCisJICBsaW5lLgorCitjb25maWcgU09VTkRfQURMSUIKKwl0cmlzdGF0ZSAiQWRsaWIgQ2FyZHMiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBJbmNsdWRlcyBBU0IgNjQgNEQuIEluZm9ybWF0aW9uIG9uIHByb2dyYW1taW5nIEFkTGliIGNhcmRzIGlzCisJICBhdmFpbGFibGUgYXQgPGh0dHA6Ly93d3cuaXRzbmV0LmNvbS9ob21lL2xkcmFnb24vU3BlY3MvYWRsaWIuaHRtbD4uCisKK2NvbmZpZyBTT1VORF9BQ0lfTUlYRVIKKwl0cmlzdGF0ZSAiQUNJIG1peGVyIChtaXJvU09VTkQgUENNMS1wcm8vUENNMTIvUENNMjApIgorCWRlcGVuZHMgb24gU09VTkRfT1NTCisJLS0taGVscC0tLQorCSAgQUNJIChBdWRpbyBDb21tYW5kIEludGVyZmFjZSkgaXMgYSBwcm90b2NvbCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGgKKwkgIHRoZSBtaWNyb2NvbnRyb2xsZXIgb24gc29tZSBzb3VuZCBjYXJkcyBwcm9kdWNlZCBieSBtaXJvIGFuZAorCSAgQ2FyZGluYWwgVGVjaG5vbG9naWVzLiAgVGhlIG1haW4gZnVuY3Rpb24gb2YgdGhlIEFDSSBpcyB0byBjb250cm9sCisJICB0aGUgbWl4ZXIgYW5kIHRvIGdldCBhIHByb2R1Y3QgaWRlbnRpZmljYXRpb24uCisKKwkgIFRoaXMgVm94V2FyZSBBQ0kgZHJpdmVyIGN1cnJlbnRseSBzdXBwb3J0cyB0aGUgQUNJIGZ1bmN0aW9ucyBvbiB0aGUKKwkgIG1pcm9TT1VORCBQQ00xLXBybywgUENNMTIgYW5kIFBDTTIwIHJhZGlvLiBPbiB0aGUgUENNMjAgcmFkaW8sIEFDSQorCSAgYWxzbyBjb250cm9scyB0aGUgcmFkaW8gdHVuZXIuIFRoaXMgaXMgc3VwcG9ydGVkIGluIHRoZSB2aWRlbzRsaW51eAorCSAgbWlyb3BjbTIwIGRyaXZlciAoc2F5IE0gb3IgWSBoZXJlIGFuZCBnbyBiYWNrIHRvICJNdWx0aW1lZGlhCisJICBkZXZpY2VzIiAtPiAiUmFkaW8gQWRhcHRlcnMiKS4KKworCSAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgYW5kIHdpbGwgYmUgY2FsbGVkIGFjaS4KKworY29uZmlnIFNPVU5EX0NTNDIzMgorCXRyaXN0YXRlICJDcnlzdGFsIENTNDIzMiBiYXNlZCAoUG5QKSBjYXJkcyIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCWhlbHAKKwkgIFNheSBZIGhlcmUgaWYgeW91IGhhdmUgYSBjYXJkIGJhc2VkIG9uIHRoZSBDcnlzdGFsIENTNDIzMiBjaGlwIHNldCwKKwkgIHdoaWNoIHVzZXMgaXRzIG93biBQbHVnIGFuZCBQbGF5IHByb3RvY29sLgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAiY3M0MjMyPTxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDxtcHVpbz4sPG1wdWlycT4iIHRvIHRoZSBrZXJuZWwKKwkgIGNvbW1hbmQgbGluZS4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL0NTNDIzMj4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24KKwkgIGNvbmZpZ3VyaW5nIHRoaXMgY2FyZC4KKworY29uZmlnIFNPVU5EX1NTQ0FQRQorCXRyaXN0YXRlICJFbnNvbmlxIFNvdW5kU2NhcGUgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCWhlbHAKKwkgIEFuc3dlciBZIGlmIHlvdSBoYXZlIGEgc291bmQgY2FyZCBiYXNlZCBvbiB0aGUgRW5zb25pcSBTb3VuZFNjYXBlCisJICBjaGlwc2V0LiBTdWNoIGNhcmRzIGFyZSBiZWluZyBtYW51ZmFjdHVyZWQgYXQgbGVhc3QgYnkgRW5zb25pcSwgU3BlYQorCSAgYW5kIFJldmVhbCAoUmV2ZWFsIG1ha2VzIGFsc28gb3RoZXIgY2FyZHMpLgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAic3NjYXBlPTxpbz4sPGlycT4sPGRtYT4sPG1wdWlvPiw8bXB1aXJxPiIgdG8gdGhlIGtlcm5lbCBjb21tYW5kCisJICBsaW5lLgorCitjb25maWcgU09VTkRfR1VTCisJdHJpc3RhdGUgIkdyYXZpcyBVbHRyYXNvdW5kIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBTYXkgWSBoZXJlIGZvciBhbnkgdHlwZSBvZiBHcmF2aXMgVWx0cmFzb3VuZCBjYXJkLCBpbmNsdWRpbmcgdGhlIEdVUworCSAgb3IgR1VTIE1BWC4gIFNlZSBhbHNvIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL3VsdHJhc291bmQ+IGZvciBtb3JlCisJICBpbmZvcm1hdGlvbiBvbiBjb25maWd1cmluZyB0aGlzIGNhcmQgd2l0aCBtb2R1bGVzLgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAiZ3VzPTxpbz4sPGlycT4sPGRtYT4sPGRtYTI+IiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKworY29uZmlnIFNPVU5EX0dVUzE2CisJYm9vbCAiMTYgYml0IHNhbXBsaW5nIG9wdGlvbiBvZiBHVVMgKF9OT1RfIEdVUyBNQVgpIgorCWRlcGVuZHMgb24gU09VTkRfR1VTCisJaGVscAorCSAgU3VwcG9ydCBmb3IgR3JhdmlzIFVsc3RyYXNvdW5kIChHVVMpIGNhcmRzIChvdGhlciB0aGFuIHRoZSBHVVMpLAorCSAgc2FtcGxpbmcgYXQgMTYtYml0IHdpZHRoLgorCitjb25maWcgU09VTkRfR1VTTUFYCisJYm9vbCAiR1VTIE1BWCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkRfR1VTCisJaGVscAorCSAgU3VwcG9ydCBmb3IgR3JhdmlzIFVsc3RyYXNvdW5kIE1BWC4KKworY29uZmlnIFNPVU5EX1ZNSURJCisJdHJpc3RhdGUgIkxvb3BiYWNrIE1JREkgZGV2aWNlIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBTdXBwb3J0IGZvciBNSURJIGxvb3BiYWNrIG9uIHBvcnQgMSBvciAyLgorCitjb25maWcgU09VTkRfVFJJWAorCXRyaXN0YXRlICJNZWRpYVRyaXggQXVkaW9Ucml4IFBybyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkRfT1NTCisJaGVscAorCSAgQW5zd2VyIFkgaWYgeW91IGhhdmUgdGhlIEF1ZGlvVHJpWCBQcm8gc291bmQgY2FyZCBtYW51ZmFjdHVyZWQKKwkgIGJ5IE1lZGlhVHJpeC4KKworY29uZmlnIFRSSVhfSEFWRV9CT09UCisJYm9vbCAiSGF2ZSBUUlhQUk8uSEVYIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBTT1VORF9UUklYPXkgJiYgIVNUQU5EQUxPTkUKKwloZWxwCisJICBUaGUgTWVkaWFUcml4IEF1ZGlvVHJpeCBQcm8gaGFzIGFuIG9uLWJvYXJkIG1pY3JvY29udHJvbGxlciB3aGljaAorCSAgbmVlZHMgdG8gYmUgaW5pdGlhbGl6ZWQgYnkgZG93bmxvYWRpbmcgdGhlIGNvZGUgZnJvbSB0aGUgZmlsZQorCSAgVFJYUFJPLkhFWCBpbiB0aGUgRE9TIGRyaXZlciBkaXJlY3RvcnkuIElmIHlvdSBkb24ndCBoYXZlIHRoZQorCSAgVFJYUFJPLkhFWCBmaWxlIGhhbmR5IHlvdSBtYXkgc2tpcCB0aGlzIHN0ZXAuIEhvd2V2ZXIsIHRoZSBTQiBhbmQKKwkgIE1QVS00MDEgbW9kZXMgb2YgQXVkaW9Ucml4IFBybyB3aWxsIG5vdCB3b3JrIHdpdGhvdXQgdGhpcyBmaWxlIQorCitjb25maWcgVFJJWF9CT09UX0ZJTEUKKwlzdHJpbmcgIkZ1bGwgcGF0aG5hbWUgb2YgVFJYUFJPLkhFWCBmaXJtd2FyZSBmaWxlIgorCWRlcGVuZHMgb24gVFJJWF9IQVZFX0JPT1QKKwlkZWZhdWx0ICIvZXRjL3NvdW5kL3RyeHByby5oZXgiCisJaGVscAorCSAgRW50ZXIgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgeW91ciBUUlhQUk8uSEVYIGZpbGUsIHN0YXJ0aW5nIGZyb20gLy4KKworY29uZmlnIFNPVU5EX01TUworCXRyaXN0YXRlICJNaWNyb3NvZnQgU291bmQgU3lzdGVtIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwktLS1oZWxwLS0tCisJICBBZ2FpbiB0aGluayBjYXJlZnVsbHkgYmVmb3JlIGFuc3dlcmluZyBZIHRvIHRoaXMgcXVlc3Rpb24uICBJdCdzCisJICBzYWZlIHRvIGFuc3dlciBZIGlmIHlvdSBoYXZlIHRoZSBvcmlnaW5hbCBXaW5kb3dzIFNvdW5kIFN5c3RlbSBjYXJkCisJICBtYWRlIGJ5IE1pY3Jvc29mdCBvciBBenRlY2ggU0cgMTYgUHJvIChvciBOWDE2IFBybykuICBBbHNvIHlvdSBtYXkKKwkgIHNheSBZIGluIGNhc2UgeW91ciBjYXJkIGlzIE5PVCBhbW9uZyB0aGVzZToKKworCSAgQVRJIFN0ZXJlbyBGL1gsIEFkTGliLCBBdWRpbyBFeGNlbGwgRFNQMTYsIENhcmRpbmFsIERTUDE2LAorCSAgRW5zb25pcSBTb3VuZFNjYXBlIChhbmQgY29tcGF0aWJsZXMgbWFkZSBieSBSZXZlYWwgYW5kIFNwZWEpLAorCSAgR3JhdmlzIFVsdHJhc291bmQsIEdyYXZpcyBVbHRyYXNvdW5kIEFDRSwgR3JhdmlzIFVsdHJhc291bmQgTWF4LAorCSAgR3JhdmlzIFVsdHJhc291bmQgd2l0aCAxNiBiaXQgb3B0aW9uLCBMb2dpdGVjaCBTb3VuZCBNYW4gMTYsCisJICBMb2dpdGVjaCBTb3VuZE1hbiBHYW1lcywgTG9naXRlY2ggU291bmRNYW4gV2F2ZSwgTUFEMTYgUHJvIChPUFRpCisJICA4MkM5MjkpLCBNZWRpYSBWaXNpb24gSmF6ejE2LCBNZWRpYVRyaVggQXVkaW9UcmlYIFBybywgTWljcm9zb2Z0CisJICBXaW5kb3dzIFNvdW5kIFN5c3RlbSAoTVNTL1dTUyksIE1vemFydCAoT0FLIE9USS02MDEpLCBPcmNoaWQKKwkgIFNXMzIsIFBlcnNvbmFsIFNvdW5kIFN5c3RlbSAoUFNTKSwgUHJvIEF1ZGlvIFNwZWN0cnVtIDE2LCBQcm8KKwkgIEF1ZGlvIFN0dWRpbyAxNiwgUHJvIFNvbmljIDE2LCBSb2xhbmQgTVBVLTQwMSBNSURJIGludGVyZmFjZSwKKwkgIFNvdW5kIEJsYXN0ZXIgMS4wLCBTb3VuZCBCbGFzdGVyIDE2LCBTb3VuZCBCbGFzdGVyIDE2QVNQLCBTb3VuZAorCSAgQmxhc3RlciAyLjAsIFNvdW5kIEJsYXN0ZXIgQVdFMzIsIFNvdW5kIEJsYXN0ZXIgUHJvLCBUSSBUTTQwMDBNCisJICBub3RlYm9vaywgVGh1bmRlckJvYXJkLCBUdXJ0bGUgQmVhY2ggVHJvcGV6LCBZYW1haGEgRk0KKwkgIHN5bnRoZXNpemVycyAoT1BMMiwgT1BMMyBhbmQgT1BMNCksIDY4NTAgVUFSVCBNSURJIEludGVyZmFjZS4KKworCSAgRm9yIGNhcmRzIGhhdmluZyBuYXRpdmUgc3VwcG9ydCBpbiBWb3hXYXJlLCBjb25zdWx0IHRoZSBjYXJkCisJICBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgaW4gPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvUkVBRE1FLk9TUz4uCisJICBTb21lIGRyaXZlcnMgaGF2ZSB0aGVpciBvd24gTVNTIHN1cHBvcnQgYW5kIHNheWluZyBZIHRvIHRoaXMgb3B0aW9uCisJICB3aWxsIGNhdXNlIGEgY29uZmxpY3QuCisKKwkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsLCB5b3UgaGF2ZSB0byBhZGQKKwkgICJhZDE4NDg9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj5bLDx0eXBlPl0iIHRvIHRoZSBrZXJuZWwgY29tbWFuZAorCSAgbGluZS4KKworY29uZmlnIFNPVU5EX01QVTQwMQorCXRyaXN0YXRlICJNUFUtNDAxIHN1cHBvcnQgKE5PVCBmb3IgU0IxNikiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwktLS1oZWxwLS0tCisJICBCZSBjYXJlZnVsIHdpdGggdGhpcyBxdWVzdGlvbi4gIFRoZSBNUFU0MDEgaW50ZXJmYWNlIGlzIHN1cHBvcnRlZCBieQorCSAgYWxsIHNvdW5kIGNhcmRzLiAgSG93ZXZlciwgc29tZSBuYXRpdmVseSBzdXBwb3J0ZWQgY2FyZHMgaGF2ZSB0aGVpcgorCSAgb3duIGRyaXZlciBmb3IgTVBVNDAxLiAgRW5hYmxpbmcgdGhpcyBNUFU0MDEgb3B0aW9uIHdpdGggdGhlc2UgY2FyZHMKKwkgIHdpbGwgY2F1c2UgYSBjb25mbGljdC4gIEFsc28sIGVuYWJsaW5nIE1QVTQwMSBvbiBhIHN5c3RlbSB0aGF0CisJICBkb2Vzbid0IHJlYWxseSBoYXZlIGEgTVBVNDAxIGNvdWxkIGNhdXNlIHNvbWUgdHJvdWJsZS4gIElmIHlvdXIgY2FyZAorCSAgd2FzIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjYXJkcywgbG9vayBhdCB0aGUgY2FyZCBzcGVjaWZpYworCSAgaW5zdHJ1Y3Rpb25zIGluIHRoZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9SRUFETUUuT1NTPiBmaWxlLiAgSXQKKwkgIGlzIHNhZmUgdG8gYW5zd2VyIFkgaWYgeW91IGhhdmUgYSB0cnVlIE1QVTQwMSBNSURJIGludGVyZmFjZSBjYXJkLgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAibXB1NDAxPTxpbz4sPGlycT4iIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCitjb25maWcgU09VTkRfTk0yNTYKKwl0cmlzdGF0ZSAiTk0yNTZBVi9OTTI1NlpYIGF1ZGlvIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBTYXkgTSBoZXJlIHRvIGluY2x1ZGUgYXVkaW8gc3VwcG9ydCBmb3IgdGhlIE5lb01hZ2ljIDI1NkFWLzI1NlpYCisJICBjaGlwc2V0cy4gVGhlc2UgYXJlIHRoZSBhdWRpbyBjaGlwc2V0cyBmb3VuZCBpbiB0aGUgU29ueQorCSAgWjUwNVMvU1gvRFgsIHNvbWUgU29ueSBGLXNlcmllcywgYW5kIHRoZSBEZWxsIExhdGl0dWRlIENQaSBhbmQgQ1B0CisJICBsYXB0b3BzLiBJdCBpbmNsdWRlcyBzdXBwb3J0IGZvciBhbiBBQzk3LWNvbXBhdGlibGUgbWl4ZXIgYW5kIGFuCisJICBhcHBhcmVudGx5IHByb3ByaWV0YXJ5IHNvdW5kIGVuZ2luZS4KKworCSAgU2VlIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL05NMjU2PiBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKworY29uZmlnIFNPVU5EX01BRDE2CisJdHJpc3RhdGUgIk9QVGkgTUFEMTYgYW5kL29yIE1vemFydCBiYXNlZCBjYXJkcyIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUyAmJiBTT1VORF9HQU1FUE9SVAorCS0tLWhlbHAtLS0KKwkgIEFuc3dlciBZIGlmIHlvdXIgY2FyZCBoYXMgYSBNb3phcnQgKE9BSyBPVEktNjAxKSBvciBNQUQxNiAoT1BUaQorCSAgODJDOTI4IG9yIDgyQzkyOSBvciA4MkM5MzEpIGF1ZGlvIGludGVyZmFjZSBjaGlwLiBUaGVzZSBjaGlwcyBhcmUKKwkgIHF1aXRlIGNvbW1vbiBzbyBpdCdzIHBvc3NpYmxlIHRoYXQgbWFueSBuby1uYW1lIGNhcmRzIGhhdmUgb25lIG9mCisJICB0aGVtLiBJbiBhZGRpdGlvbiB0aGUgTUFEMTYgY2hpcCBpcyB1c2VkIGluIHNvbWUgY2FyZHMgbWFkZSBieSBrbm93bgorCSAgbWFudWZhY3R1cmVycyBzdWNoIGFzIFR1cnRsZSBCZWFjaCAoVHJvcGV6KSwgUmV2ZWFsIChzb21lIG1vZGVscykKKwkgIGFuZCBEaWFtb25kIChsYXRlc3Qgb25lcykuIE5vdGUgaG93ZXZlciB0aGF0IHRoZSBUcm9wZXogc291bmQgY2FyZHMKKwkgIGhhdmUgdGhlaXIgb3duIGRyaXZlcjsgaWYgeW91IGhhdmUgb25lIG9mIHRob3NlLCBzYXkgTiBoZXJlIGFuZCBZIG9yCisJICBNIHRvICJGdWxsIHN1cHBvcnQgZm9yIFR1cnRsZSBCZWFjaCBXYXZlRnJvbnQiLCBiZWxvdy4KKworCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAorCSAgIm1hZDE2PTxpbz4sPGlycT4sPGRtYT4sPGRtYTI+LDxtcHVpbz4sPG1wdWlycT4iIHRvIHRoZQorCSAga2VybmVsIGNvbW1hbmQgbGluZS4KKworCSAgU2VlIGFsc28gPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvT3B0aT4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9NQUQxNj4gZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2V0dGluZworCSAgdGhlc2UgY2FyZHMgdXAgYXMgbW9kdWxlcy4KKworY29uZmlnIE1BRDE2X09MRENBUkQKKwlib29sICJTdXBwb3J0IE1JREkgaW4gb2xkZXIgTUFEMTYgYmFzZWQgY2FyZHMgKHJlcXVpcmVzIFNCKSIKKwlkZXBlbmRzIG9uIFNPVU5EX01BRDE2CisJaGVscAorCSAgQW5zd2VyIFkgKG9yIE0pIGlmIHlvdSBoYXZlIGFuIG9sZGVyIGNhcmQgYmFzZWQgb24gdGhlIEM5Mjggb3IKKwkgIE1vemFydCBjaGlwc2V0IGFuZCB5b3Ugd2FudCB0byBoYXZlIE1JREkgc3VwcG9ydC4gSWYgeW91IGVuYWJsZSB0aGlzCisJICBvcHRpb24geW91IGFsc28gbmVlZCB0byBlbmFibGUgc3VwcG9ydCBmb3IgU291bmQgQmxhc3Rlci4KKworY29uZmlnIFNPVU5EX1BBUworCXRyaXN0YXRlICJQcm9BdWRpb1NwZWN0cnVtIDE2IHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwktLS1oZWxwLS0tCisJICBBbnN3ZXIgWSBvbmx5IGlmIHlvdSBoYXZlIGEgUHJvIEF1ZGlvIFNwZWN0cnVtIDE2LCBQcm9BdWRpbyBTdHVkaW8KKwkgIDE2IG9yIExvZ2l0ZWNoIFNvdW5kTWFuIDE2IHNvdW5kIGNhcmQuIEFuc3dlciBOIGlmIHlvdSBoYXZlIHNvbWUKKwkgIG90aGVyIGNhcmQgbWFkZSBieSBNZWRpYSBWaXNpb24gb3IgTG9naXRlY2ggc2luY2UgdGhvc2UgYXJlIG5vdAorCSAgUEFTMTYgY29tcGF0aWJsZS4gUGxlYXNlIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvUEFTMTY+LgorCSAgSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBhZGQgU291bmQgQmxhc3RlciBzdXBwb3J0IHNlcGFyYXRlbHk7IGl0CisJICBpcyBpbmNsdWRlZCBpbiBQQVMgc3VwcG9ydC4KKworCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAorCSAgInBhczI9PGlvPiw8aXJxPiw8ZG1hPiw8ZG1hMj4sPHNiaW8+LDxzYmlycT4sPHNiZG1hPiw8c2JkbWEyPgorCSAgdG8gdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUuCisKK2NvbmZpZyBQQVNfSk9ZU1RJQ0sKKwlib29sICJFbmFibGUgUEFTMTYgam95c3RpY2sgcG9ydCIKKwlkZXBlbmRzIG9uIFNPVU5EX1BBUz15CisJaGVscAorCSAgU2F5IFkgaGVyZSB0byBlbmFibGUgdGhlIFBybyBBdWRpbyBTcGVjdHJ1bSAxNidzIGF1eGlsaWFyeSBqb3lzdGljaworCSAgcG9ydC4KKworY29uZmlnIFNPVU5EX1BTUworCXRyaXN0YXRlICJQU1MgKEFEMTg0OCwgQURTUC0yMTE1LCBFU0M2MTQpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBBbnN3ZXIgWSBvciBNIGlmIHlvdSBoYXZlIGFuIE9yY2hpZCBTVzMyLCBDYXJkaW5hbCBEU1AxNiwgQmVldGhvdmVuCisJICBBRFNQLTE2IG9yIHNvbWUgb3RoZXIgY2FyZCBiYXNlZCBvbiB0aGUgUFNTIGNoaXBzZXQgKEFEMTg0OCBjb2RlYyArCisJICBBRFNQLTIxMTUgRFNQIGNoaXAgKyBFY2hvIEVTQzYxNCBBU0lDIENISVApLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgorCSAgaG93IHRvIGNvbXBpbGUgaXQgaW50byB0aGUga2VybmVsIG9yIGFzIGEgbW9kdWxlIHNlZSB0aGUgZmlsZQorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvUFNTPi4KKworCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAorCSAgInBzcz08aW8+LDxtc3Npbz4sPG1zc2lycT4sPG1zc2RtYT4sPG1wdWlvPiw8bXB1aXJxPiIgdG8gdGhlIGtlcm5lbAorCSAgY29tbWFuZCBsaW5lLgorCitjb25maWcgUFNTX01JWEVSCisJYm9vbCAiRW5hYmxlIFBTUyBtaXhlciAoQmVldGhvdmVuIEFEU1AtMTYgYW5kIG90aGVyIGNvbXBhdGliaWxlKSIKKwlkZXBlbmRzIG9uIFNPVU5EX1BTUworCWhlbHAKKwkgIEFuc3dlciBZIGZvciBCZWV0aG92ZW4gQURTUC0xNi4gWW91IG1heSB0cnkgdG8gc2F5IFkgYWxzbyBmb3Igb3RoZXIKKwkgIGNhcmRzIGlmIHRoZXkgaGF2ZSBtYXN0ZXIgdm9sdW1lLCBiYXNzLCB0cmVibGUsIGFuZCB5b3UgY2FuJ3QKKwkgIGNvbnRyb2wgaXQgdW5kZXIgTGludXguIElmIHlvdSBhbnN3ZXIgTiBmb3IgQmVldGhvdmVuIEFEU1AtMTYsIHlvdQorCSAgY2FuJ3QgY29udHJvbCBtYXN0ZXIgdm9sdW1lLCBiYXNzLCB0cmVibGUgYW5kIHN5bnRoIHZvbHVtZS4KKworCSAgSWYgeW91IHNhaWQgTSB0byAiUFNTIHN1cHBvcnQiIGFib3ZlLCB5b3UgbWF5IGVuYWJsZSBvciBkaXNhYmxlIHRoaXMKKwkgIFBTUyBtaXhlciB3aXRoIHRoZSBtb2R1bGUgcGFyYW1ldGVyIHBzc19taXhlci4gRm9yIG1vcmUgaW5mb3JtYXRpb24KKwkgIHNlZSB0aGUgZmlsZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9QU1M+LgorCitjb25maWcgUFNTX0hBVkVfQk9PVAorCWJvb2wgIkhhdmUgRFNQeHh4LkxEIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBTT1VORF9QU1MgJiYgIVNUQU5EQUxPTkUKKwloZWxwCisJICBJZiB5b3UgaGF2ZSB0aGUgRFNQeHh4LkxEIGZpbGUgb3IgU1lOVEguTEQgZmlsZSBmb3IgeW91IGNhcmQsIHNheSBZCisJICB0byBpbmNsdWRlIHRoaXMgZmlsZS4gV2l0aG91dCB0aGlzIGZpbGUgdGhlIHN5bnRoIGRldmljZSAoT1BMKSBtYXkKKwkgIG5vdCB3b3JrLgorCitjb25maWcgUFNTX0JPT1RfRklMRQorCXN0cmluZyAiRnVsbCBwYXRobmFtZSBvZiBEU1B4eHguTEQgZmlybXdhcmUgZmlsZSIKKwlkZXBlbmRzIG9uIFBTU19IQVZFX0JPT1QKKwlkZWZhdWx0ICIvZXRjL3NvdW5kL2RzcDAwMS5sZCIKKwloZWxwCisJICBFbnRlciB0aGUgZnVsbCBwYXRobmFtZSBvZiB5b3VyIERTUHh4eC5MRCBmaWxlIG9yIFNZTlRILkxEIGZpbGUsCisJICBzdGFydGluZyBmcm9tIC8uCisKK2NvbmZpZyBTT1VORF9TQgorCXRyaXN0YXRlICIxMDAlIFNvdW5kIEJsYXN0ZXIgY29tcGF0aWJsZXMgKFNCMTYvMzIvNjQsIEVTUywgSmF6ejE2KSBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkRfT1NTCisJLS0taGVscC0tLQorCSAgQW5zd2VyIFkgaWYgeW91IGhhdmUgYW4gb3JpZ2luYWwgU291bmQgQmxhc3RlciBjYXJkIG1hZGUgYnkgQ3JlYXRpdmUKKwkgIExhYnMgb3IgYSAxMDAlIGhhcmR3YXJlIGNvbXBhdGlibGUgY2xvbmUgKGxpa2UgdGhlIFRodW5kZXJib2FyZCBvcgorCSAgU00gR2FtZXMpLiBGb3IgYW4gdW5rbm93biBjYXJkIHlvdSBtYXkgYW5zd2VyIFkgaWYgdGhlIGNhcmQgY2xhaW1zCisJICB0byBiZSBTb3VuZCBCbGFzdGVyLWNvbXBhdGlibGUuCisKKwkgIFBsZWFzZSByZWFkIHRoZSBmaWxlIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL1NvdW5kYmxhc3Rlcj4uCisKKwkgIFlvdSBzaG91bGQgYWxzbyBzYXkgWSBoZXJlIGZvciBjYXJkcyBiYXNlZCBvbiB0aGUgQXZhbmNlIExvZ2ljCisJICBBTFMtMDA3IGFuZCBBTFMtMVgwIGNoaXBzIChyZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL0FMUz4pIGFuZAorCSAgZm9yIGNhcmRzIGJhc2VkIG9uIEVTUyBjaGlwcyAocmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvRVNTMTg2OD4gYW5kCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9FU1M+KS4gSWYgeW91IGhhdmUgYW4gU0IgQVdFIDMyIG9yIFNCIEFXRQorCSAgNjQsIHNheSBZIGhlcmUgYW5kIGFsc28gdG8gIkFXRTMyIHN5bnRoIiBiZWxvdyBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvSU5TVEFMTC5hd2U+LiBJZiB5b3UgaGF2ZSBhbiBJQk0gTXdhdmUKKwkgIGNhcmQsIHNheSBZIGhlcmUgYW5kIHJlYWQgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvbXdhdmU+LgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCBhbmQgZG9uJ3Qgd2FudCB0byB1c2UKKwkgIGlzYXBucCwgeW91IGhhdmUgdG8gYWRkICJzYj08aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiIgdG8gdGhlIGtlcm5lbAorCSAgY29tbWFuZCBsaW5lLgorCisJICBZb3UgY2FuIHNheSBNIGhlcmUgdG8gY29tcGlsZSB0aGlzIGRyaXZlciBhcyBhIG1vZHVsZTsgdGhlIG1vZHVsZSBpcworCSAgY2FsbGVkIHNiLgorCitjb25maWcgU09VTkRfQVdFMzJfU1lOVEgKKwl0cmlzdGF0ZSAiQVdFMzIgc3ludGgiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSBoYXZlIGEgU291bmQgQmxhc3RlciBTQjMyLCBBV0UzMi1QblAsIFNCIEFXRTY0IG9yCisJICBzaW1pbGFyIHNvdW5kIGNhcmQuIFNlZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9SRUFETUUuYXdlPiwKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL0FXRTMyPiBhbmQgdGhlIFNvdW5kYmxhc3Rlci1BV0UKKwkgIG1pbmktSE9XVE8sIGF2YWlsYWJsZSBmcm9tIDxodHRwOi8vd3d3LnRsZHAub3JnL2RvY3MuaHRtbCNob3d0bz4KKwkgIGZvciBtb3JlIGluZm8uCisKK2NvbmZpZyBTT1VORF9XQVZFRlJPTlQKKwl0cmlzdGF0ZSAiRnVsbCBzdXBwb3J0IGZvciBUdXJ0bGUgQmVhY2ggV2F2ZUZyb250IChUcm9wZXogUGx1cywgVHJvcGV6LCBNYXVpKSBzeW50aC9zb3VuZGNhcmRzIgorCWRlcGVuZHMgb24gU09VTkRfT1NTICYmIG0KKwloZWxwCisJICBBbnN3ZXIgWSBvciBNIGlmIHlvdSBoYXZlIGEgVHJvcGV6IFBsdXMsIFRyb3BleiBvciBNYXVpIHNvdW5kIGNhcmQKKwkgIGFuZCByZWFkIHRoZSBmaWxlcyA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9XYXZlZnJvbnQ+IGFuZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9zb3VuZC9vc3MvVHJvcGV6Kz4uCisKK2NvbmZpZyBTT1VORF9NQVVJCisJdHJpc3RhdGUgIkxpbWl0ZWQgc3VwcG9ydCBmb3IgVHVydGxlIEJlYWNoIFdhdmUgRnJvbnQgKE1hdWksIFRyb3Bleikgc3ludGhlc2l6ZXJzIgorCWRlcGVuZHMgb24gU09VTkRfT1NTCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3UgaGF2ZSBhIFR1cnRsZSBCZWFjaCBXYXZlIEZyb250LCBNYXVpLCBvciBUcm9wZXoKKwkgIHNvdW5kIGNhcmQuCisKKwkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsLCB5b3UgaGF2ZSB0byBhZGQKKwkgICJtYXVpPTxpbz4sPGlycT4iIHRvIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lLgorCitjb25maWcgTUFVSV9IQVZFX0JPT1QKKwlib29sICJIYXZlIE9TV0YuTU9UIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBTT1VORF9NQVVJPXkgJiYgIVNUQU5EQUxPTkUKKwloZWxwCisJICBUdXJ0bGUgQmVhY2ggTWF1aSBhbmQgVHJvcGV6IHNvdW5kIGNhcmRzIGhhdmUgYSBtaWNyb2NvbnRyb2xsZXIKKwkgIHdoaWNoIG5lZWRzIHRvIGJlIGluaXRpYWxpemVkIHByaW9yIHRvIHVzZS4gT1NXRi5NT1QgaXMgYSBmaWxlCisJICBkaXN0cmlidXRlZCB3aXRoIHRoZSBjYXJkJ3MgRE9TL1dpbmRvd3MgZHJpdmVycy4gQW5zd2VyIFkgaWYgeW91CisJICBoYXZlIHRoaXMgZmlsZS4KKworY29uZmlnIE1BVUlfQk9PVF9GSUxFCisJc3RyaW5nICJGdWxsIHBhdGhuYW1lIG9mIE9TV0YuTU9UIGZpcm13YXJlIGZpbGUiCisJZGVwZW5kcyBvbiBNQVVJX0hBVkVfQk9PVAorCWRlZmF1bHQgIi9ldGMvc291bmQvb3N3Zi5tb3QiCisJaGVscAorCSAgRW50ZXIgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgeW91ciBPU1dGLk1PVCBmaWxlLCBzdGFydGluZyBmcm9tIC8uCisKK2NvbmZpZyBTT1VORF9ZTTM4MTIKKwl0cmlzdGF0ZSAiWWFtYWhhIEZNIHN5bnRoZXNpemVyIChZTTM4MTIvT1BMLTMpIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwktLS1oZWxwLS0tCisJICBBbnN3ZXIgWSBpZiB5b3VyIGNhcmQgaGFzIGEgRk0gY2hpcCBtYWRlIGJ5IFlhbWFoYSAoT1BMMi9PUEwzL09QTDQpLgorCSAgQW5zd2VyaW5nIFkgaXMgdXN1YWxseSBhIHNhZmUgYW5kIHJlY29tbWVuZGVkIGNob2ljZSwgaG93ZXZlciBzb21lCisJICBjYXJkcyBtYXkgaGF2ZSBzb2Z0d2FyZSAoVFNSKSBGTSBlbXVsYXRpb24uIEVuYWJsaW5nIEZNIHN1cHBvcnQgd2l0aAorCSAgdGhlc2UgY2FyZHMgbWF5IGNhdXNlIHRyb3VibGUgKEkgZG9uJ3QgY3VycmVudGx5IGtub3cgb2YgYW55IHN1Y2gKKwkgIGNhcmRzLCBob3dldmVyKS4gUGxlYXNlIHJlYWQgdGhlIGZpbGUKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL09QTDM+IGlmIHlvdXIgY2FyZCBoYXMgYW4gT1BMMyBjaGlwLgorCisJICBJZiB5b3UgY29tcGlsZSB0aGUgZHJpdmVyIGludG8gdGhlIGtlcm5lbCwgeW91IGhhdmUgdG8gYWRkCisJICAib3BsMz08aW8+IiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKworCSAgSWYgdW5zdXJlLCBzYXkgWS4KKworY29uZmlnIFNPVU5EX09QTDNTQTEKKwl0cmlzdGF0ZSAiWWFtYWhhIE9QTDMtU0ExIGF1ZGlvIGNvbnRyb2xsZXIiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwloZWxwCisJICBTYXkgWSBvciBNIGlmIHlvdSBoYXZlIGEgWWFtYWhhIE9QTDMtU0ExIHNvdW5kIGNoaXAsIHdoaWNoIGlzCisJICB1c3VhbGx5IGJ1aWx0IGludG8gbW90aGVyYm9hcmRzLiBSZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9PUEwzLVNBPiBmb3IgZGV0YWlscy4KKworCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAorCSAgIm9wbDNzYT08aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8bXB1aW8+LDxtcHVpcnE+IiB0byB0aGUga2VybmVsCisJICBjb21tYW5kIGxpbmUuCisKK2NvbmZpZyBTT1VORF9PUEwzU0EyCisJdHJpc3RhdGUgIllhbWFoYSBPUEwzLVNBMiBhbmQgU0EzIGJhc2VkIFBuUCBjYXJkcyIKKwlkZXBlbmRzIG9uIFNPVU5EX09TUworCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBjYXJkIGJhc2VkIG9uIG9uZSBvZiB0aGVzZSBZYW1haGEgc291bmQKKwkgIGNoaXBzZXRzIG9yIHRoZSAiU0F4Iiwgd2hpY2ggaXMgYWN0dWFsbHkgYSBTQTMuIFJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL09QTDMtU0EyPiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbgorCSAgY29uZmlndXJpbmcgdGhlc2UgY2FyZHMuCisKKwkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsIGFuZCBkbyBub3QgYWxzbworCSAgY29uZmlndXJlIGluIHRoZSBvcHRpb25hbCBJU0EgUG5QIHN1cHBvcnQsIHlvdSB3aWxsIGhhdmUgdG8gYWRkCisJICAib3BsM3NhMj08aW8+LDxpcnE+LDxkbWE+LDxkbWEyPiw8bXNzaW8+LDxtcHVpbz4iIHRvIHRoZSBrZXJuZWwKKwkgIGNvbW1hbmQgbGluZS4KKworY29uZmlnIFNPVU5EX1lNRlBDSQorCXRyaXN0YXRlICJZYW1haGEgWU1GN3h4IFBDSSBhdWRpbyAobmF0aXZlIG1vZGUpIgorCWRlcGVuZHMgb24gU09VTkRfT1NTICYmIFBDSQorCWhlbHAKKwkgIFN1cHBvcnQgZm9yIFlhbWFoYSBjYXJkcyBpbmNsdWRpbmcgdGhlIFlNRjcxMSwgWU1GNzE1LCBZTUY3MTgsCisJICBZTUY3MTksIFlNRjcyNCwgV2F2ZWZvcmNlIDE5MlhHLCBhbmQgV2F2ZWZvcmNlIDE5MiBEaWdpdGFsLgorCitjb25maWcgU09VTkRfWU1GUENJX0xFR0FDWQorCWJvb2wgIllhbWFoYSBQQ0kgbGVnYWN5IHBvcnRzIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9ZTUZQQ0kKKwloZWxwCisJICBTdXBwb3J0IGZvciBZTUY3eHggUENJIGNhcmRzIGVtdWxhdGluZyBhbiBNUDQwMS4KKworY29uZmlnIFNPVU5EX1VBUlQ2ODUwCisJdHJpc3RhdGUgIjY4NTAgVUFSVCBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkRfT1NTCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBNSURJIGludGVyZmFjZXMgYmFzZWQgb24gdGhlIDY4NTAKKwkgIFVBUlQgY2hpcC4gVGhpcyBpbnRlcmZhY2UgaXMgcmFyZWx5IGZvdW5kIG9uIHNvdW5kIGNhcmRzLiBJdCdzIHNhZmUKKwkgIHRvIGFuc3dlciBOIHRvIHRoaXMgcXVlc3Rpb24uCisKKwkgIElmIHlvdSBjb21waWxlIHRoZSBkcml2ZXIgaW50byB0aGUga2VybmVsLCB5b3UgaGF2ZSB0byBhZGQKKwkgICJ1YXJ0Njg1MD08aW8+LDxpcnE+IiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKworY29uZmlnIFNPVU5EX0FFRFNQMTYKKwl0cmlzdGF0ZSAiR2FsbGFudCBBdWRpbyBDYXJkcyAoU0MtNjAwMCBhbmQgU0MtNjYwMCBiYXNlZCkiCisJZGVwZW5kcyBvbiBTT1VORF9PU1MKKwktLS1oZWxwLS0tCisJICBBbnN3ZXIgWSBpZiB5b3UgaGF2ZSBhIEdhbGxhbnQncyBBdWRpbyBFeGNlbCBEU1AgMTYgY2FyZC4gVGhpcworCSAgZHJpdmVyIHN1cHBvcnRzIEF1ZGlvIEV4Y2VsIERTUCAxNiBidXQgbm90IHRoZSBJSUkgbm9yIFBuUCB2ZXJzaW9ucworCSAgb2YgdGhpcyBjYXJkLgorCisJICBUaGUgR2FsbGFudCdzIEF1ZGlvIEV4Y2VsIERTUCAxNiBjYXJkIGNhbiBlbXVsYXRlIGVpdGhlciBhbiBTQlBybyBvcgorCSAgYSBNaWNyb3NvZnQgU291bmQgU3lzdGVtIGNhcmQsIHNvIHlvdSBzaG91bGQgaGF2ZSBzYWlkIFkgdG8gZWl0aGVyCisJICAiMTAwJSBTb3VuZCBCbGFzdGVyIGNvbXBhdGlibGVzIChTQjE2LzMyLzY0LCBFU1MsIEphenoxNikgc3VwcG9ydCIKKwkgIG9yICJNaWNyb3NvZnQgU291bmQgU3lzdGVtIHN1cHBvcnQiLCBhYm92ZSwgYW5kIHlvdSBuZWVkIHRvIGFuc3dlcgorCSAgdGhlICJNU1MgZW11bGF0aW9uIiBhbmQgIlNCUHJvIGVtdWxhdGlvbiIgcXVlc3Rpb25zIGJlbG93CisJICBhY2NvcmRpbmdseS4gWW91IHNob3VsZCBzYXkgWSB0byBvbmUgYW5kIG9ubHkgb25lIG9mIHRoZXNlIHR3bworCSAgcXVlc3Rpb25zLgorCisJICBSZWFkIHRoZSA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvdW5kL29zcy9SRUFETUUuT1NTPiBmaWxlIGFuZCB0aGUgaGVhZCBvZgorCSAgPGZpbGU6ZHJpdmVycy9zb3VuZC9hZWRzcDE2LmM+IGFzIHdlbGwgYXMKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL0F1ZGlvRXhjZWxEU1AxNj4gdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24KKwkgIGFib3V0IHRoaXMgZHJpdmVyIGFuZCBpdHMgY29uZmlndXJhdGlvbi4KKworY29uZmlnIFNDNjYwMAorCWJvb2wgIlNDLTY2MDAgYmFzZWQgYXVkaW8gY2FyZHMgKG5ldyBBdWRpbyBFeGNlbCBEU1AgMTYpIgorCWRlcGVuZHMgb24gU09VTkRfQUVEU1AxNgorCWhlbHAKKwkgIFRoZSBTQzY2MDAgaXMgdGhlIG5ldyB2ZXJzaW9uIG9mIERTUCBtb3VudGVkIG9uIHRoZSBBdWRpbyBFeGNlbCBEU1AKKwkgIDE2IGNhcmRzLiBGaW5kIGluIHRoZSBtYW51YWwgdGhlIEZDQyBJRCBvZiB5b3VyIGF1ZGlvIGNhcmQgYW5kCisJICBhbnN3ZXIgWSBpZiB5b3UgaGF2ZSBhbiBTQzY2MDAgRFNQLgorCitjb25maWcgU0M2NjAwX0pPWQorCWJvb2wgIkFjdGl2YXRlIFNDLTY2MDAgSm95c3RpY2sgSW50ZXJmYWNlIgorCWRlcGVuZHMgb24gU0M2NjAwCisJaGVscAorCSAgU2F5IFkgaGVyZSBpbiBvcmRlciB0byB1c2UgdGhlIGpveXN0aWNrIGludGVyZmFjZSBvZiB0aGUgQXVkaW8gRXhjZWwKKwkgIERTUCAxNiBjYXJkLgorCitjb25maWcgU0M2NjAwX0NEUk9NCisJaW50ICJTQy02NjAwIENEUk9NIEludGVyZmFjZSAoND1Ob25lLCAzPUlERSwgMT1QYW5hc29uaWMsIDA9P1Nvbnk/KSIKKwlkZXBlbmRzIG9uIFNDNjYwMAorCWRlZmF1bHQgIjQiCisJaGVscAorCSAgVGhpcyBpcyB1c2VkIHRvIGFjdGl2YXRlIHRoZSBDRC1ST00gaW50ZXJmYWNlIG9mIHRoZSBBdWRpbyBFeGNlbAorCSAgRFNQIDE2IGNhcmQuIEVudGVyOiAwIGZvciBTb255LCAxIGZvciBQYW5hc29uaWMsIDIgZm9yIElERSwgNCBmb3Igbm8KKwkgIENELVJPTSBwcmVzZW50LgorCitjb25maWcgU0M2NjAwX0NEUk9NQkFTRQorCWhleCAiU0MtNjYwMCBDRFJPTSBJbnRlcmZhY2UgSS9PIEFkZHJlc3MiCisJZGVwZW5kcyBvbiBTQzY2MDAKKwlkZWZhdWx0ICIwIgorCWhlbHAKKwkgIEJhc2UgSS9PIHBvcnQgYWRkcmVzcyBmb3IgdGhlIENELVJPTSBpbnRlcmZhY2Ugb2YgdGhlIEF1ZGlvIEV4Y2VsCisJICBEU1AgMTYgY2FyZC4KKworY2hvaWNlCisJcHJvbXB0ICJBdWRpbyBFeGNlbCBEU1AgMTYiCisJb3B0aW9uYWwKKwlkZXBlbmRzIG9uIFNPVU5EX0FFRFNQMTYKKworY29uZmlnIEFFRFNQMTZfTVNTCisJYm9vbCAiTVNTIGVtdWxhdGlvbiIKKwlkZXBlbmRzIG9uIFNPVU5EX01TUworCWhlbHAKKwkgIEFuc3dlciBZIGlmIHlvdSB3YW50IHlvdXIgYXVkaW8gY2FyZCB0byBlbXVsYXRlIE1pY3Jvc29mdCBTb3VuZAorCSAgU3lzdGVtLiBZb3Ugc2hvdWxkIHRoZW4gc2F5IFkgdG8gIk1pY3Jvc29mdCBTb3VuZCBTeXN0ZW0gc3VwcG9ydCIKKwkgIGFuZCBzYXkgTiB0byAiQXVkaW8gRXhjZWwgRFNQIDE2IChTQlBybyBlbXVsYXRpb24pIi4KKworY29uZmlnIEFFRFNQMTZfU0JQUk8KKwlib29sICJTQlBybyBlbXVsYXRpb24iCisJZGVwZW5kcyBvbiBTT1VORF9TQgorCWhlbHAKKwkgIEFuc3dlciBZIGlmIHlvdSB3YW50IHlvdXIgYXVkaW8gY2FyZCB0byBlbXVsYXRlIFNvdW5kIEJsYXN0ZXIgUHJvLgorCSAgWW91IHNob3VsZCB0aGVuIHNheSBZIHRvICIxMDAlIFNvdW5kIEJsYXN0ZXIgY29tcGF0aWJsZXMKKwkgIChTQjE2LzMyLzY0LCBFU1MsIEphenoxNikgc3VwcG9ydCIgYW5kIE4gdG8gIkF1ZGlvIEV4Y2VsIERTUCAxNiAoTVNTCisJICBlbXVsYXRpb24pIi4KKworCSAgSWYgeW91IGNvbXBpbGUgdGhlIGRyaXZlciBpbnRvIHRoZSBrZXJuZWwsIHlvdSBoYXZlIHRvIGFkZAorCSAgImFlZHNwMTY9PGlvPiw8aXJxPiw8ZG1hPiw8bXNzaW8+LDxtcHVpbz4sPG1vdWlycT4iIHRvIHRoZSBrZXJuZWwKKwkgIGNvbW1hbmQgbGluZS4KKworZW5kY2hvaWNlCisKK2NvbmZpZyBBRURTUDE2X01QVTQwMQorCWJvb2wgIkF1ZGlvIEV4Y2VsIERTUCAxNiAoTVBVNDAxIGVtdWxhdGlvbikiCisJZGVwZW5kcyBvbiBTT1VORF9BRURTUDE2ICYmIFNPVU5EX01QVTQwMQorCWhlbHAKKwkgIEFuc3dlciBZIGlmIHlvdSB3YW50IHlvdXIgYXVkaW8gY2FyZCB0byBlbXVsYXRlIHRoZSBNUFUtNDAxIG1pZGkKKwkgIGludGVyZmFjZS4gWW91IHNob3VsZCB0aGVuIGFsc28gc2F5IFkgdG8gIk1QVS00MDEgc3VwcG9ydCIuCisKKwkgIE5vdGUgdGhhdCB0aGUgSS9PIGJhc2UgZm9yIE1QVS00MDEgc3VwcG9ydCBvZiBhZWRzcDE2IGlzIHRoZSBzYW1lCisJICB5b3UgaGF2ZSBzZWxlY3RlZCBmb3IgIk1QVS00MDEgc3VwcG9ydCIuIElmIHlvdSBhcmUgdXNpbmcgdGhpcworCSAgZHJpdmVyIGFzIGEgbW9kdWxlIHlvdSBoYXZlIHRvIHNwZWNpZnkgdGhlIE1QVSBJL08gYmFzZSBhZGRyZXNzIHdpdGgKKwkgIHRoZSBwYXJhbWV0ZXIgJ21wdV9iYXNlPTB4Tk5OJy4KKworY29uZmlnIFNPVU5EX1ZJREMKKwl0cmlzdGF0ZSAiVklEQyAxNi1iaXQgc291bmQiCisJZGVwZW5kcyBvbiBBUk0gJiYgKEFSQ0hfQUNPUk4gfHwgQVJDSF9DTFBTNzUwMCkgJiYgU09VTkRfT1NTCisJaGVscAorCSAgMTYtYml0IHN1cHBvcnQgZm9yIHRoZSBWSURDIG9uYm9hcmQgc291bmQgaGFyZHdhcmUgZm91bmQgb24gQWNvcm4KKwkgIG1hY2hpbmVzLgorCitjb25maWcgU09VTkRfV0FWRUFSVElTVAorCXRyaXN0YXRlICJOZXR3aW5kZXIgV2F2ZUFydGlzdCIKKwlkZXBlbmRzIG9uIEFSTSAmJiBTT1VORF9PU1MgJiYgQVJDSF9ORVRXSU5ERVIKKwloZWxwCisJICBTYXkgWSBoZXJlIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgdGhlIFJvY2t3ZWxsIFdhdmVBcnRpc3Qgc291bmQKKwkgIHN5c3RlbS4gIFRoaXMgZHJpdmVyIGlzIG1haW5seSBmb3IgdGhlIE5ldFdpbmRlci4KKworY29uZmlnIFNPVU5EX1RWTUlYRVIKKwl0cmlzdGF0ZSAiVFYgY2FyZCAoYnQ4NDgpIG1peGVyIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9biAmJiBTT1VORCAmJiBJMkMKKwloZWxwCisJICBTdXBwb3J0IGZvciBhdWRpbyBtaXhlciBmYWNpbGl0aWVzIG9uIHRoZSBCVDg0OCBUViBmcmFtZS1ncmFiYmVyCisJICBjYXJkLgorCitjb25maWcgU09VTkRfS0FITFVBCisJdHJpc3RhdGUgIlhwcmVzc0F1ZGlvIFNvdW5kIEJsYXN0ZXIgZW11bGF0aW9uIgorCWRlcGVuZHMgb24gU09VTkRfU0IKKworY29uZmlnIFNPVU5EX0FMSTU0NTUKKwl0cmlzdGF0ZSAiQUxpNTQ1NSBhdWRpbyBzdXBwb3J0IgorCWRlcGVuZHMgb24gU09VTkRfUFJJTUUhPW4gJiYgUENJCisKK2NvbmZpZyBTT1VORF9GT1JURQorCXRyaXN0YXRlICJGb3J0ZU1lZGlhIEZNODAxIGRyaXZlciIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IHdhbnQgZHJpdmVyIHN1cHBvcnQgZm9yIHRoZSBGb3J0ZU1lZGlhIEZNODAxIFBDSQorCSAgYXVkaW8gY29udHJvbGxlciAoQWJpdCBBVTEwLCBHZW5pdXMgU291bmQgTWFrZXIsIEhQIFdvcmtzdGF0aW9uCisJICB6eDIwMDAsIGFuZCBvdGhlcnMpLgorCitjb25maWcgU09VTkRfUk1FOTZYWAorCXRyaXN0YXRlICJSTUUgSGFtbWVyZmFsbCAoUk1FOTZYWCkgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFBDSQorCWhlbHAKKwkgIFNheSBZIG9yIE0gaWYgeW91IGhhdmUgYSBIYW1tZXJmYWxsIG9yIEhhbW1lcmZhbGwgbGlnaHQKKwkgIG11bHRpY2hhbm5lbCBjYXJkIGZyb20gUk1FLiBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgYWR2YW5jZWQKKwkgIGZlYXR1cmVzIG9mIHRoZSBjYXJkLCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24vc291bmQvb3NzL3JtZTk2eHg+LgorCitjb25maWcgU09VTkRfQUQxOTgwCisJdHJpc3RhdGUgIkFEMTk4MCBmcm9udC9iYWNrIHN3aXRjaCBwbHVnaW4iCisJZGVwZW5kcyBvbiBTT1VORF9QUklNRSE9bgorCitjb25maWcgU09VTkRfU0hfREFDX0FVRElPCisJdHJpc3RhdGUgIlN1cGVySCBEQUMgYXVkaW8gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIFNPVU5EX1BSSU1FIT1uICYmIFNPVU5EICYmIENQVV9TSDMKKworY29uZmlnIFNPVU5EX1NIX0RBQ19BVURJT19DSEFOTkVMCisJaW50ICIgICAgREFDIGNoYW5uZWwiCisJZGVmYXVsdCAiMSIKKwlkZXBlbmRzIG9uIFNPVU5EX1NIX0RBQ19BVURJTwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL01ha2VmaWxlIGIvc291bmQvb3NzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiOWFmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvTWFrZWZpbGUKQEAgLTAsMCArMSwxODcgQEAKKyMgTWFrZWZpbGUgZm9yIHRoZSBMaW51eCBzb3VuZCBjYXJkIGRyaXZlcgorIworIyAxOCBBcHIgMTk5OCwgTWljaGFlbCBFbGl6YWJldGggQ2hhc3RhaW4sIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4KKyMgUmV3cml0dGVuIHRvIHVzZSBsaXN0cyBpbnN0ZWFkIG9mIGlmLXN0YXRlbWVudHMuCisKKyMgRWFjaCBjb25maWd1cmF0aW9uIG9wdGlvbiBlbmFibGVzIGEgbGlzdCBvZiBmaWxlcy4KKworb2JqLSQoQ09ORklHX1NPVU5EX09TUykJCSs9IHNvdW5kLm8KK29iai0kKENPTkZJR19TT1VORF9DUzQyMzIpCSs9IGNzNDIzMi5vIGFkMTg0OC5vIAorCisjIFBsZWFzZSBsZWF2ZSBpdCBhcyBpcywgY2F1c2UgdGhlIGxpbmsgb3JkZXIgaXMgc2lnbmlmaWNhbnQgIQorCitvYmotJChDT05GSUdfU09VTkRfU0hfREFDX0FVRElPKQkrPSBzaF9kYWNfYXVkaW8ubworb2JqLSQoQ09ORklHX1NPVU5EX0hBTDIpCSs9IGhhbDIubworb2JqLSQoQ09ORklHX1NPVU5EX0FFRFNQMTYpCSs9IGFlZHNwMTYubworb2JqLSQoQ09ORklHX1NPVU5EX1BTUykJCSs9IHBzcy5vIGFkMTg0OC5vIG1wdTQwMS5vCitvYmotJChDT05GSUdfU09VTkRfVFJJWCkJKz0gdHJpeC5vIGFkMTg0OC5vIHNiX2xpYi5vIHVhcnQ0MDEubworb2JqLSQoQ09ORklHX1NPVU5EX09QTDNTQTEpCSs9IG9wbDNzYS5vIGFkMTg0OC5vIHVhcnQ0MDEubworb2JqLSQoQ09ORklHX1NPVU5EX1NTQ0FQRSkJKz0gc3NjYXBlLm8gYWQxODQ4Lm8gbXB1NDAxLm8KK29iai0kKENPTkZJR19TT1VORF9NQUQxNikJKz0gbWFkMTYubyBhZDE4NDgubyBzYl9saWIubyB1YXJ0NDAxLm8KK29iai0kKENPTkZJR19TT1VORF9DUzQyMzIpCSs9IGNzNDIzMi5vIHVhcnQ0MDEubworb2JqLSQoQ09ORklHX1NPVU5EX01TUykJCSs9IGFkMTg0OC5vCitvYmotJChDT05GSUdfU09VTkRfT1BMM1NBMikJKz0gb3BsM3NhMi5vIGFkMTg0OC5vIG1wdTQwMS5vCitvYmotJChDT05GSUdfU09VTkRfUEFTKQkJKz0gcGFzMi5vIHNiLm8gc2JfbGliLm8gdWFydDQwMS5vCitvYmotJChDT05GSUdfU09VTkRfU0IpCQkrPSBzYi5vIHNiX2xpYi5vIHVhcnQ0MDEubworb2JqLSQoQ09ORklHX1NPVU5EX0tBSExVQSkJKz0ga2FobHVhLm8KK29iai0kKENPTkZJR19TT1VORF9XQVZFRlJPTlQpCSs9IHdhdmVmcm9udC5vCitvYmotJChDT05GSUdfU09VTkRfTUFVSSkJKz0gbWF1aS5vIG1wdTQwMS5vCitvYmotJChDT05GSUdfU09VTkRfTVBVNDAxKQkrPSBtcHU0MDEubworb2JqLSQoQ09ORklHX1NPVU5EX1VBUlQ2ODUwKQkrPSB1YXJ0Njg1MC5vCitvYmotJChDT05GSUdfU09VTkRfR1VTKQkJKz0gZ3VzLm8gYWQxODQ4Lm8KK29iai0kKENPTkZJR19TT1VORF9BRExJQikJKz0gYWRsaWJfY2FyZC5vIG9wbDMubworb2JqLSQoQ09ORklHX1NPVU5EX1lNMzgxMikJKz0gb3BsMy5vCitvYmotJChDT05GSUdfU09VTkRfVk1JREkpCSs9IHZfbWlkaS5vCitvYmotJChDT05GSUdfU09VTkRfVklEQykJKz0gdmlkY19tb2Qubworb2JqLSQoQ09ORklHX1NPVU5EX1dBVkVBUlRJU1QpCSs9IHdhdmVhcnRpc3Qubworb2JqLSQoQ09ORklHX1NPVU5EX1NHQUxBWFkpCSs9IHNnYWxheHkubyBhZDE4NDgubworb2JqLSQoQ09ORklHX1NPVU5EX0FEMTgxNikJKz0gYWQxODE2Lm8KK29iai0kKENPTkZJR19TT1VORF9BRDE4ODkpCSs9IGFkMTg4OS5vIGFjOTdfY29kZWMubworb2JqLSQoQ09ORklHX1NPVU5EX0FDSV9NSVhFUikJKz0gYWNpLm8KK29iai0kKENPTkZJR19TT1VORF9BV0UzMl9TWU5USCkJKz0gYXdlX3dhdmUubworCitvYmotJChDT05GSUdfU09VTkRfVklBODJDWFhYKQkrPSB2aWE4MmN4eHhfYXVkaW8ubyBhYzk3X2NvZGVjLm8KK2lmZXEgKCQoQ09ORklHX01JRElfVklBODJDWFhYKSx5KQorICBvYmotJChDT05GSUdfU09VTkRfVklBODJDWFhYKSArPSBzb3VuZC5vIHVhcnQ0MDEubworZW5kaWYKK29iai0kKENPTkZJR19TT1VORF9ZTUZQQ0kpCSs9IHltZnBjaS5vIGFjOTdfY29kZWMubworaWZlcSAoJChDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWSkseSkKKyAgb2JqLSQoQ09ORklHX1NPVU5EX1lNRlBDSSkgICAgKz0gb3BsMy5vIHVhcnQ0MDEubworZW5kaWYKK29iai0kKENPTkZJR19TT1VORF9NU05EQ0xBUykJKz0gbXNuZC5vIG1zbmRfY2xhc3NpYy5vCitvYmotJChDT05GSUdfU09VTkRfTVNORFBJTikJKz0gbXNuZC5vIG1zbmRfcGlubmFjbGUubworb2JqLSQoQ09ORklHX1NPVU5EX1ZXU05EKQkrPSB2d3NuZC5vCitvYmotJChDT05GSUdfU09VTkRfTk0yNTYpCSs9IG5tMjU2X2F1ZGlvLm8gYWM5Ny5vCitvYmotJChDT05GSUdfU09VTkRfSUNIKQkJKz0gaTgxMF9hdWRpby5vIGFjOTdfY29kZWMubworb2JqLSQoQ09ORklHX1NPVU5EX1NPTklDVklCRVMpCSs9IHNvbmljdmliZXMubworb2JqLSQoQ09ORklHX1NPVU5EX0NNUENJKQkrPSBjbXBjaS5vCitpZmVxICgkKENPTkZJR19TT1VORF9DTVBDSV9GTSkseSkKKyAgb2JqLSQoQ09ORklHX1NPVU5EX0NNUENJKSAgICAgKz0gc291bmQubyBvcGwzLm8KK2VuZGlmCitpZmVxICgkKENPTkZJR19TT1VORF9DTVBDSV9NSURJKSx5KQorICBvYmotJChDT05GSUdfU09VTkRfQ01QQ0kpICAgICArPSBzb3VuZC5vIG1wdTQwMS5vCitlbmRpZgorb2JqLSQoQ09ORklHX1NPVU5EX0VTMTM3MCkJKz0gZXMxMzcwLm8KK29iai0kKENPTkZJR19TT1VORF9FUzEzNzEpCSs9IGVzMTM3MS5vIGFjOTdfY29kZWMubworb2JqLSQoQ09ORklHX1NPVU5EX1ZSQzU0NzcpCSs9IG5lY192cmM1NDc3Lm8gYWM5N19jb2RlYy5vCitvYmotJChDT05GSUdfU09VTkRfQVUxMDAwKQkrPSBhdTEwMDAubyBhYzk3X2NvZGVjLm8KK29iai0kKENPTkZJR19TT1VORF9BVTE1NTBfQUM5NykJKz0gYXUxNTUwX2FjOTcubyBhYzk3X2NvZGVjLm8KK29iai0kKENPTkZJR19TT1VORF9FU1NTT0xPMSkJKz0gZXNzc29sbzEubworb2JqLSQoQ09ORklHX1NPVU5EX0ZVU0lPTikJKz0gY3M0Nnh4Lm8gYWM5N19jb2RlYy5vCitvYmotJChDT05GSUdfU09VTkRfTUFFU1RSTykJKz0gbWFlc3Ryby5vCitvYmotJChDT05GSUdfU09VTkRfTUFFU1RSTzMpCSs9IG1hZXN0cm8zLm8gYWM5N19jb2RlYy5vCitvYmotJChDT05GSUdfU09VTkRfVFJJREVOVCkJKz0gdHJpZGVudC5vIGFjOTdfY29kZWMubworb2JqLSQoQ09ORklHX1NPVU5EX0hBUk1PTlkpCSs9IGhhcm1vbnkubworb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpCSs9IGFjOTdfY29kZWMubworb2JqLSQoQ09ORklHX1NPVU5EX0JDTV9DUzQyOTdBKQkrPSBzd2FybV9jczQyOTdhLm8KK29iai0kKENPTkZJR19TT1VORF9STUU5NlhYKSAgICAgKz0gcm1lOTZ4eC5vCitvYmotJChDT05GSUdfU09VTkRfQlQ4NzgpCSs9IGJ0YXVkaW8ubworb2JqLSQoQ09ORklHX1NPVU5EX0FMSTU0NTUpCSs9IGFsaTU0NTUubyBhYzk3X2NvZGVjLm8KK29iai0kKENPTkZJR19TT1VORF9JVDgxNzIpCSs9IGl0ZTgxNzIubyBhYzk3X2NvZGVjLm8KK29iai0kKENPTkZJR19TT1VORF9GT1JURSkJKz0gZm9ydGUubyBhYzk3X2NvZGVjLm8KKworb2JqLSQoQ09ORklHX1NPVU5EX0FEMTk4MCkJKz0gYWM5N19wbHVnaW5fYWQxOTgwLm8KK29iai0kKENPTkZJR19TT1VORF9XTTk3WFgpCSs9IGFjOTdfcGx1Z2luX3dtOTd4eC5vCisKK2lmZXEgKCQoQ09ORklHX01JRElfRU1VMTBLMSkseSkKKyAgb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpCSs9IHNvdW5kLm8KK2VuZGlmCisKK29iai0kKENPTkZJR19TT1VORF9FTVUxMEsxKQkrPSBlbXUxMGsxLworb2JqLSQoQ09ORklHX1NPVU5EX0NTNDI4MSkJKz0gY3M0MjgxLworb2JqLSQoQ09ORklHX0RNQVNPVU5EKQkJKz0gZG1hc291bmQvCisKKyMgRGVjbGFyZSBtdWx0aS1wYXJ0IGRyaXZlcnMuCisKK3NvdW5kLW9ianMJOj0gCQkJCQkJCVwKKyAgICBkZXZfdGFibGUubyBzb3VuZGNhcmQubyBzb3VuZF9zeW1zLm8JCVwKKyAgICBhdWRpby5vIGF1ZGlvX3N5bXMubyBkbWFidWYubwkJCQkJXAorICAgIG1pZGlfc3ltcy5vIG1pZGlfc3ludGgubyBtaWRpYnVmLm8JCQkJCVwKKyAgICBzZXF1ZW5jZXIubyBzZXF1ZW5jZXJfc3ltcy5vIHNvdW5kX3RpbWVyLm8gc3lzX3RpbWVyLm8KKworZ3VzLW9ianMJOj0gZ3VzX2NhcmQubyBndXNfbWlkaS5vIGd1c192b2wubyBndXNfd2F2ZS5vIGljczIxMDEubworcGFzMi1vYmpzCTo9IHBhczJfY2FyZC5vIHBhczJfbWlkaS5vIHBhczJfbWl4ZXIubyBwYXMyX3BjbS5vCitzYi1vYmpzCQk6PSBzYl9jYXJkLm8KK3NiX2xpYi1vYmpzCTo9IHNiX2NvbW1vbi5vIHNiX2F1ZGlvLm8gc2JfbWlkaS5vIHNiX21peGVyLm8gc2JfZXNzLm8KK3ZpZGNfbW9kLW9ianMJOj0gdmlkYy5vIHZpZGNfZmlsbC5vCit3YXZlZnJvbnQtb2JqcyAgOj0gd2F2ZnJvbnQubyB3Zl9taWRpLm8geXNzMjI1Lm8KKworaG9zdHByb2dzLXkJOj0gYmluMmhleCBoZXgyaGV4CisKKyMgRmlsZXMgZ2VuZXJhdGVkIHRoYXQgc2hhbGwgYmUgcmVtb3ZlZCB1cG9uIG1ha2UgY2xlYW4KK2NsZWFuLWZpbGVzIDo9IG1hdWlfYm9vdC5oIG1zbmRwZXJtLmMgbXNuZGluaXQuYyBwbmRzcGVybS5jIHBuZHNwaW5pLmMgXAorICAgICAgICAgICAgICAgcHNzX2Jvb3QuaCB0cml4X2Jvb3QuaAorCisjIEZpcm13YXJlIGZpbGVzIHRoYXQgbmVlZCB0cmFuc2xhdGlvbgorIworIyBUaGUgdHJhbnNsYXRlZCBmaWxlcyBhcmUgcHJvdGVjdGVkIGJ5IGEgZmlsZSB0aGF0IGtlZXBzIHRyYWNrCisjIG9mIHdoYXQgbmFtZSB3YXMgdXNlZCB0byBidWlsZCB0aGVtLiAgSWYgdGhlIG5hbWUgY2hhbmdlcywgdGhleQorIyB3aWxsIGJlIGZvcmNlZCB0byBiZSByZW1hZGUuCisjCisKKyMgVHVydGxlIEJlYWNoIE1hdWkgLyBUcm9wZXoKKworJChvYmopL21hdWkubzogJChvYmopL21hdWlfYm9vdC5oCisKK2lmZXEgKCQoQ09ORklHX01BVUlfSEFWRV9CT09UKSx5KQorICAgICQob2JqKS9tYXVpX2Jvb3QuaDogJChwYXRzdWJzdCAiJSIsICUsICQoQ09ORklHX01BVUlfQk9PVF9GSUxFKSkgJChvYmopL2JpbjJoZXgKKwkkKG9iaikvYmluMmhleCAtaSBtYXVpX29zIDwgJDwgPiAkQAorZWxzZQorICAgICQob2JqKS9tYXVpX2Jvb3QuaDoKKwkoCQkJCQkJCVwKKwkgICAgZWNobyAnc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBtYXVpX29zID0gTlVMTDsnOwlcCisJICAgIGVjaG8gJ3N0YXRpYyBpbnQgbWF1aV9vc0xlbiA9IDA7JzsJCQlcCisJKSA+ICRACitlbmRpZgorCisjIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kCisKK2lmZXEgKCQoQ09ORklHX01TTkRDTEFTX0hBVkVfQk9PVCkseSkKKyAgICAkKG9iaikvbXNuZF9jbGFzc2ljLm86ICQob2JqKS9tc25kcGVybS5jICQob2JqKS9tc25kaW5pdC5jCisKKyAgICAkKG9iaikvbXNuZHBlcm0uYzogJChwYXRzdWJzdCAiJSIsICUsICQoQ09ORklHX01TTkRDTEFTX1BFUk1fRklMRSkpICQob2JqKS9iaW4yaGV4CisJJChvYmopL2JpbjJoZXggbXNuZHBlcm0gPCAkPCA+ICRACisKKyAgICAkKG9iaikvbXNuZGluaXQuYzogJChwYXRzdWJzdCAiJSIsICUsICQoQ09ORklHX01TTkRDTEFTX0lOSVRfRklMRSkpICQob2JqKS9iaW4yaGV4CisJJChvYmopL2JpbjJoZXggbXNuZGluaXQgPCAkPCA+ICRACitlbmRpZgorCitpZmVxICgkKENPTkZJR19NU05EUElOX0hBVkVfQk9PVCkseSkKKyAgICAkKG9iaikvbXNuZF9waW5uYWNsZS5vOiAkKG9iaikvcG5kc3Blcm0uYyAkKG9iaikvcG5kc3BpbmkuYworCisgICAgJChvYmopL3BuZHNwZXJtLmM6ICQocGF0c3Vic3QgIiUiLCAlLCAkKENPTkZJR19NU05EUElOX1BFUk1fRklMRSkpICQob2JqKS9iaW4yaGV4CisJJChvYmopL2JpbjJoZXggcG5kc3Blcm0gPCAkPCA+ICRACisKKyAgICAkKG9iaikvcG5kc3BpbmkuYzogJChwYXRzdWJzdCAiJSIsICUsICQoQ09ORklHX01TTkRQSU5fSU5JVF9GSUxFKSkgJChvYmopL2JpbjJoZXgKKwkkKG9iaikvYmluMmhleCBwbmRzcGluaSA8ICQ8ID4gJEAKK2VuZGlmCisKKyMgUFNTIChFQ0hPLUFESTIxMTEpCisKKyQob2JqKS9wc3MubzogJChvYmopL3Bzc19ib290LmgKKworaWZlcSAoJChDT05GSUdfUFNTX0hBVkVfQk9PVCkseSkKKyAgICAkKG9iaikvcHNzX2Jvb3QuaDogJChwYXRzdWJzdCAiJSIsICUsICQoQ09ORklHX1BTU19CT09UX0ZJTEUpKSAkKG9iaikvYmluMmhleAorCSQob2JqKS9iaW4yaGV4IHBzc19zeW50aCA8ICQ8ID4gJEAKK2Vsc2UKKyAgICAkKG9iaikvcHNzX2Jvb3QuaDoKKwkoCQkJCQkJCVwKKwkgICAgZWNobyAnc3RhdGljIHVuc2lnbmVkIGNoYXIgKiBwc3Nfc3ludGggPSBOVUxMOyc7CVwKKwkgICAgZWNobyAnc3RhdGljIGludCBwc3Nfc3ludGhMZW4gPSAwOyc7CQlcCisJKSA+ICRACitlbmRpZgorCisjIE1lZGlhVHJpeCBBdWRpb1RyaXggUHJvCisKKyQob2JqKS90cml4Lm86ICQob2JqKS90cml4X2Jvb3QuaAorCitpZmVxICgkKENPTkZJR19UUklYX0hBVkVfQk9PVCkseSkKKyAgICAkKG9iaikvdHJpeF9ib290Lmg6ICQocGF0c3Vic3QgIiUiLCAlLCAkKENPTkZJR19UUklYX0JPT1RfRklMRSkpICQob2JqKS9oZXgyaGV4CisJJChvYmopL2hleDJoZXggLWkgdHJpeF9ib290IDwgJDwgPiAkQAorZWxzZQorICAgICQob2JqKS90cml4X2Jvb3QuaDoKKwkoCQkJCQkJCVwKKwkgICAgZWNobyAnc3RhdGljIHVuc2lnbmVkIGNoYXIgKiB0cml4X2Jvb3QgPSBOVUxMOyc7CVwKKwkgICAgZWNobyAnc3RhdGljIGludCB0cml4X2Jvb3RfbGVuID0gMDsnOwkJXAorCSkgPiAkQAorZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9SRUFETUUuRklSU1QgYi9zb3VuZC9vc3MvUkVBRE1FLkZJUlNUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZmRjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvUkVBRE1FLkZJUlNUCkBAIC0wLDAgKzEsNiBAQAorVGhlIG1vZHVsYXIgc291bmQgZHJpdmVyIHBhdGNoZXMgd2VyZSBmdW5kZWQgYnkgUmVkIEhhdCBTb2Z0d2FyZSAKKyh3d3cucmVkaGF0LmNvbSkuIFRoZSBzb3VuZCBkcml2ZXIgaGVyZSBpcyB0aHVzIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiAKK0hhbm51J3MgY29kZS4gUGxlYXNlIGJlYXIgdGhhdCBpbiBtaW5kIHdoZW4gY29uc2lkZXJpbmcgdGhlIGFwcHJvcHJpYXRlCitmb3J1bXMgZm9yIGJ1ZyByZXBvcnRpbmcuIAorCitBbGFuIENveApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjOTcuYyBiL3NvdW5kL29zcy9hYzk3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhNmQ5MQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hYzk3LmMKQEAgLTAsMCArMSw0NTIgQEAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSAiYWM5Ny5oIgorCisvKiBGbGFnIGZvciBtb25vIGNvbnRyb2xzLiAqLworI2RlZmluZSBNTyAwCisvKiBBbmQgZm9yIHN0ZXJlby4gKi8KKyNkZWZpbmUgU1QgMQorCisvKiBXaGV0aGVyIG9yIG5vdCB0aGUgYml0cyBpbiB0aGUgY2hhbm5lbCBhcmUgaW52ZXJ0ZWQuICovCisjZGVmaW5lIElOViAxCisjZGVmaW5lIE5JTlYgMAorCitzdGF0aWMgc3RydWN0IGFjOTdfY2huX2Rlc2MgeworICAgIGludCBhYzk3X3JlZ251bTsKKyAgICBpbnQgb3NzX2NoYW5uZWw7CisgICAgaW50IG1heHZhbDsKKyAgICBpbnQgaXNfc3RlcmVvOworICAgIGludCBvc3NfbWFzazsKKyAgICBpbnQgcmVjb3JkTnVtOworICAgIHUxNiByZWdtYXNrOworICAgIGludCBpc19pbnZlcnRlZDsKK30gbWl4ZXJSZWdzW10gPSB7CisgICAgeyBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCBTT1VORF9NSVhFUl9WT0xVTUUsICAgMHgzZiwgU1QsIFNPVU5EX01BU0tfVk9MVU1FLCAgIDUsIDB4MDAwMCwgSU5WICB9LAorICAgIHsgQUM5N19NQVNURVJfVk9MX01PTk8sICAgU09VTkRfTUlYRVJfUEhPTkVPVVQsIDB4M2YsIE1PLCBTT1VORF9NQVNLX1BIT05FT1VULCA2LCAweDAwMDAsIElOViAgfSwKKyAgICB7IEFDOTdfTUFTVEVSX1RPTkUsICAgICAgIFNPVU5EX01JWEVSX1RSRUJMRSwgICAweDBmLCBNTywgU09VTkRfTUFTS19UUkVCTEUsICAtMSwgMHgwMGZmLCBJTlYgIH0sCisgICAgeyBBQzk3X01BU1RFUl9UT05FLCAgICAgICBTT1VORF9NSVhFUl9CQVNTLCAgICAgMHgwZiwgTU8sIFNPVU5EX01BU0tfQkFTUywgICAgLTEsIDB4ZmYwMCwgSU5WICB9LAorICAgIHsgQUM5N19QQ0JFRVBfVk9MLCAgICAgICAgU09VTkRfTUlYRVJfU1BFQUtFUiwgIDB4MGYsIE1PLCBTT1VORF9NQVNLX1NQRUFLRVIsIC0xLCAweDAwMWUsIElOViAgfSwKKyAgICB7IEFDOTdfUEhPTkVfVk9MLCAgICAgICAgIFNPVU5EX01JWEVSX1BIT05FSU4sICAweDFmLCBNTywgU09VTkRfTUFTS19QSE9ORUlOLCAgNywgMHgwMDAwLCBJTlYgIH0sCisgICAgeyBBQzk3X01JQ19WT0wsICAgICAgICAgICBTT1VORF9NSVhFUl9NSUMsICAgICAgMHgxZiwgTU8sIFNPVU5EX01BU0tfTUlDLCAgICAgIDAsIDB4MDAwMCwgSU5WICB9LAorICAgIHsgQUM5N19MSU5FSU5fVk9MLCAgICAgICAgU09VTkRfTUlYRVJfTElORSwgICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX0xJTkUsICAgICA0LCAweDAwMDAsIElOViAgfSwKKyAgICB7IEFDOTdfQ0RfVk9MLCAgICAgICAgICAgIFNPVU5EX01JWEVSX0NELCAgICAgICAweDFmLCBTVCwgU09VTkRfTUFTS19DRCwgICAgICAgMSwgMHgwMDAwLCBJTlYgIH0sCisgICAgeyBBQzk3X1ZJREVPX1ZPTCwgICAgICAgICBTT1VORF9NSVhFUl9WSURFTywgICAgMHgxZiwgU1QsIFNPVU5EX01BU0tfVklERU8sICAgIDIsIDB4MDAwMCwgSU5WICB9LAorICAgIHsgQUM5N19BVVhfVk9MLCAgICAgICAgICAgU09VTkRfTUlYRVJfTElORTEsICAgIDB4MWYsIFNULCBTT1VORF9NQVNLX0xJTkUxLAkgICAzLCAweDAwMDAsIElOViAgfSwKKyAgICB7IEFDOTdfUENNT1VUX1ZPTCwgICAgICAgIFNPVU5EX01JWEVSX1BDTSwgICAgICAweDFmLCBTVCwgU09VTkRfTUFTS19QQ00sICAgICAtMSwgMHgwMDAwLCBJTlYgIH0sCisgICAgeyBBQzk3X1JFQ09SRF9HQUlOLCAgICAgICBTT1VORF9NSVhFUl9JR0FJTiwgICAgMHgwZiwgU1QsIFNPVU5EX01BU0tfSUdBSU4sICAgLTEsIDB4MDAwMCwgTklOViB9LAorICAgIHsgLTEsCQkgICAgICAtMSwJCSAgICAweGZmLCAwLCAgMCwgICAgICAgICAgICAgICAgICAtMSwgMHgwMDAwLCAwICAgIH0sCit9OworCitzdGF0aWMgc3RydWN0IGFjOTdfY2huX2Rlc2MgKgorYWM5N19maW5kX2NobmRlc2MgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCkKK3sKKyAgICBpbnQgeDsKKworICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5vc3NfY2hhbm5lbCAhPSAtMTsgeCsrKSB7CisJaWYgKG1peGVyUmVnc1t4XS5vc3NfY2hhbm5lbCA9PSBvc3NfY2hhbm5lbCkKKwkgICAgcmV0dXJuIG1peGVyUmVncyArIHg7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CithYzk3X2lzX3ZhbGlkX2NoYW5uZWwgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaG4pCit7CisgICAgcmV0dXJuIChkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbY2huLT5hYzk3X3JlZ251bSAvIDJdCisJICAgICE9IEFDOTdfUkVHX1VOU1VQUE9SVEVEKTsKK30KKworaW50CithYzk3X2luaXQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpCit7CisgICAgaW50IHg7CisgICAgaW50IHJlZzA7CisKKyAgICAvKiBDbGVhciBvdXQgdGhlIGFycmF5cyBvZiBjYWNoZWQgdmFsdWVzLiAqLworICAgIGZvciAoeCA9IDA7IHggPCBBQzk3X1JFR19DTlQ7IHgrKykKKwlkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXNbeF0gPSBBQzk3X1JFR1ZBTF9VTktOT1dOOworCisgICAgZm9yICh4ID0gMDsgeCA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgeCsrKQorCWRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbeF0gPSBBQzk3X1JFR1ZBTF9VTktOT1dOOworCisgICAgLyogQ2xlYXIgdGhlIGRldmljZSBtYXNrcy4gICovCisgICAgZGV2LT5taXhlcl9kZXZtYXNrID0gMDsKKyAgICBkZXYtPm1peGVyX3N0ZXJlb21hc2sgPSAwOworICAgIGRldi0+bWl4ZXJfcmVjbWFzayA9IDA7CisKKyAgICAvKiA/Pz8gRG8gYSAic3RhbmRhcmQgcmVzZXQiIHZpYSByZWdpc3RlciAwPyAqLworCisgICAgLyogSGFyZHdhcmUtZGVwZW5kZW50IHJlc2V0LiAgKi8KKyAgICBpZiAoZGV2LT5yZXNldF9kZXZpY2UgKGRldikpCisJcmV0dXJuIC0xOworCisgICAgLyogQ2hlY2sgdGhlIG1peGVyIGRldmljZSBjYXBhYmlsaXRpZXMuICAqLworICAgIHJlZzAgPSBkZXYtPnJlYWRfcmVnIChkZXYsIEFDOTdfUkVTRVQpOworCisgICAgaWYgKHJlZzAgPCAwKQorCXJldHVybiAtMTsKKworICAgIC8qIENoZWNrIGZvciBzdXBwb3J0IGZvciB0cmVibGUvYmFzcyBjb250cm9scy4gICovCisgICAgaWYgKCEgKHJlZzAgJiA0KSkgeworCWRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tBQzk3X01BU1RFUl9UT05FIC8gMl0gCisJICAgID0gQUM5N19SRUdfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLyogPz8/IFRoZXJlIG1heSBiZSBvdGhlciB0ZXN0cyBoZXJlPyAqLworCisgICAgLyogRmlsbCBpbiB0aGUgZGV2aWNlIG1hc2tzLiAgKi8KKyAgICBmb3IgKHggPSAwOyBtaXhlclJlZ3NbeF0uYWM5N19yZWdudW0gIT0gLTE7IHgrKykgeworCWlmIChhYzk3X2lzX3ZhbGlkX2NoYW5uZWwgKGRldiwgbWl4ZXJSZWdzICsgeCkpIHsKKwkgICAgZGV2LT5taXhlcl9kZXZtYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKKworCSAgICBpZiAobWl4ZXJSZWdzW3hdLmlzX3N0ZXJlbykKKwkJZGV2LT5taXhlcl9zdGVyZW9tYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKKworCSAgICBpZiAobWl4ZXJSZWdzW3hdLnJlY29yZE51bSAhPSAtMSkKKwkJZGV2LT5taXhlcl9yZWNtYXNrIHw9IG1peGVyUmVnc1t4XS5vc3NfbWFzazsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFJlc2V0IHRoZSBtaXhlciB0byB0aGUgY3VycmVudGx5IHNhdmVkIHNldHRpbmdzLiAgKi8KK2ludAorYWM5N19yZXNldCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldikKK3sKKyAgICBpbnQgeDsKKworICAgIGlmIChkZXYtPnJlc2V0X2RldmljZSAoZGV2KSkKKwlyZXR1cm4gLTE7CisKKyAgICAvKiBOb3cgc2V0IHRoZSByZWdpc3RlcnMgYmFjayB0byB0aGVpciBsYXN0LXdyaXR0ZW4gdmFsdWVzLiAqLworICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSAhPSAtMTsgeCsrKSB7CisJaW50IHJlZ251bSA9IG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bTsKKwlpbnQgdmFsdWUgPSBkZXYtPmxhc3Rfd3JpdHRlbl9taXhlcl92YWx1ZXMgW3JlZ251bSAvIDJdOworCWlmICh2YWx1ZSA+PSAwKQorCSAgICBhYzk3X3B1dF9yZWdpc3RlciAoZGV2LCByZWdudW0sIHZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB0aGUgY29udGVudHMgb2YgcmVnaXN0ZXIgUkVHOyB1c2UgdGhlIGNhY2hlIGlmIHRoZSB2YWx1ZSBpbiBpdAorICAgaXMgdmFsaWQuICBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLiAqLworc3RhdGljIGludAorYWM5N19nZXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZykgCit7CisgICAgaWYgKHJlZyA+IDEyNyB8fCAocmVnICYgMSkpCisJcmV0dXJuIC1FSU5WQUw7CisKKyAgICAvKiBTZWUgaWYgaXQncyBpbiB0aGUgY2FjaGUsIG9yIGlmIGl0J3MganVzdCBwbGFpbiBpbnZhbGlkLiAgKi8KKyAgICBzd2l0Y2ggKGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSkgeworICAgIGNhc2UgQUM5N19SRUdfVU5TVVBQT1JURUQ6CisJcmV0dXJuIC1FSU5WQUw7CisJYnJlYWs7CisgICAgY2FzZSBBQzk3X1JFR1ZBTF9VTktOT1dOOgorCWRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9IGRldi0+cmVhZF9yZWcgKGRldiwgcmVnKTsKKwlicmVhazsKKyAgICBkZWZhdWx0OgorCWJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZGV2LT5sYXN0X3dyaXR0ZW5fbWl4ZXJfdmFsdWVzW3JlZyAvIDJdOworfQorCisvKiBXcml0ZSBWQUxVRSB0byBBQzk3IHJlZ2lzdGVyIFJFRywgYW5kIGNhY2hlIGl0cyB2YWx1ZSBpbiB0aGUgbGFzdC13cml0dGVuCisgICBjYWNoZS4gIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUsIG9yIDAgb24gc3VjY2Vzcy4gKi8KK2ludAorYWM5N19wdXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKQoreworICAgIGlmIChyZWcgPiAxMjcgfHwgKHJlZyAmIDEpKQorCXJldHVybiAtRUlOVkFMOworCisgICAgaWYgKGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9PSBBQzk3X1JFR19VTlNVUFBPUlRFRCkKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICBlbHNlIHsKKwlpbnQgcmVzID0gZGV2LT53cml0ZV9yZWcgKGRldiwgcmVnLCB2YWx1ZSk7CisJaWYgKHJlcyA+PSAwKSB7CisJICAgIGRldi0+bGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tyZWcgLyAyXSA9IHZhbHVlOworCSAgICByZXR1cm4gMDsKKwl9CisJZWxzZQorCSAgICByZXR1cm4gcmVzOworICAgIH0KK30KKworLyogU2NhbGUgVkFMVUUgKGEgdmFsdWUgZnJvIDAgdG8gTUFYVkFMKSB0byBhIHZhbHVlIGZyb20gMC0xMDAuICBJZgorICAgSVNfU1RFUkVPIGlzIHNldCwgVkFMVUUgaXMgYSBzdGVyZW8gdmFsdWU7IHRoZSBsZWZ0IGNoYW5uZWwgdmFsdWUKKyAgIGlzIGluIHRoZSBsb3dlciA4IGJpdHMsIGFuZCB0aGUgcmlnaHQgY2hhbm5lbCB2YWx1ZSBpcyBpbiB0aGUgdXBwZXIKKyAgIDggYml0cy4KKworICAgQSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlzIHJldHVybmVkIG9uIGZhaWx1cmUsIG9yIHRoZSB1bnNpZ25lZAorICAgc2NhbGVkIHZhbHVlIG9uIHN1Y2Nlc3MuICAqLworCitzdGF0aWMgaW50CithYzk3X3NjYWxlX3RvX29zc192YWwgKGludCB2YWx1ZSwgaW50IG1heHZhbCwgaW50IGlzX3N0ZXJlbywgaW50IGludikKK3sKKyAgICAvKiBNdXRlZD8gICovCisgICAgaWYgKHZhbHVlICYgQUM5N19NVVRFKQorCXJldHVybiAwOworCisgICAgaWYgKGlzX3N0ZXJlbykKKwlyZXR1cm4gKGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAodmFsdWUgJiAyNTUsIG1heHZhbCwgMCwgaW52KSA8PCA4KQorCXwgKGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAoKHZhbHVlID4+IDgpICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgMCk7CisgICAgZWxzZSB7CisJaW50IGk7CisJCisJLyogSW52ZXJ0ZWQuICovCisJaWYgKGludikKKwkgICAgdmFsdWUgPSBtYXh2YWwgLSB2YWx1ZTsKKworCWkgPSAodmFsdWUgKiAxMDAgKyAobWF4dmFsIC8gMikpIC8gbWF4dmFsOworCWlmIChpID4gMTAwKQorCSAgICAgaSA9IDEwMDsKKwlpZiAoaSA8IDApCisJICAgIGkgPSAwOworCXJldHVybiBpOworICAgIH0KK30KKworc3RhdGljIGludAorYWM5N19zY2FsZV9mcm9tX29zc192YWwgKGludCB2YWx1ZSwgaW50IG1heHZhbCwgaW50IGlzX3N0ZXJlbywgaW50IGludikKK3sKKyAgICBpZiAoaXNfc3RlcmVvKQorCXJldHVybiAoYWM5N19zY2FsZV9mcm9tX29zc192YWwgKHZhbHVlICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgOCkKKwl8IChhYzk3X3NjYWxlX2Zyb21fb3NzX3ZhbCAoKHZhbHVlID4+IDgpICYgMjU1LCBtYXh2YWwsIDAsIGludikgPDwgMCk7CisgICAgZWxzZSB7CisJaW50IGkgPSAoKHZhbHVlICYgMjU1KSAqIG1heHZhbCArIDUwKSAvIDEwMDsKKwlpZiAoaW52KQorCSAgICBpID0gbWF4dmFsIC0gaTsKKwlpZiAoaSA8IDApCisJICAgIGkgPSAwOworCWlmIChpID4gbWF4dmFsKQorCSAgICBpID0gbWF4dmFsOworCXJldHVybiBpOworICAgIH0KK30KKworc3RhdGljIGludAorYWM5N19zZXRfbWl4ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCwgdTE2IG9zc192YWx1ZSkKK3sKKyAgICBpbnQgc2NhbGVkX3ZhbHVlOworICAgIHN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaGFubmVsID0gYWM5N19maW5kX2NobmRlc2MgKGRldiwgb3NzX2NoYW5uZWwpOworICAgIGludCByZXN1bHQ7CisKKyAgICBpZiAoY2hhbm5lbCA9PSBOVUxMKQorCXJldHVybiAtRU5PREVWOworICAgIGlmICghIGFjOTdfaXNfdmFsaWRfY2hhbm5lbCAoZGV2LCBjaGFubmVsKSkKKwlyZXR1cm4gLUVOT0RFVjsKKyAgICBzY2FsZWRfdmFsdWUgPSBhYzk3X3NjYWxlX2Zyb21fb3NzX3ZhbCAob3NzX3ZhbHVlLCBjaGFubmVsLT5tYXh2YWwsCisJCQkJCSAgICBjaGFubmVsLT5pc19zdGVyZW8sIAorCQkJCQkgICAgY2hhbm5lbC0+aXNfaW52ZXJ0ZWQpOworICAgIGlmIChzY2FsZWRfdmFsdWUgPCAwKQorCXJldHVybiBzY2FsZWRfdmFsdWU7CisKKyAgICBpZiAoY2hhbm5lbC0+cmVnbWFzayAhPSAwKSB7CisJaW50IG12OworCisJaW50IG9sZHZhbCA9IGFjOTdfZ2V0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtKTsKKwlpZiAob2xkdmFsIDwgMCkKKwkgICAgcmV0dXJuIG9sZHZhbDsKKworCWZvciAobXYgPSBjaGFubmVsLT5yZWdtYXNrOyAhIChtdiAmIDEpOyBtdiA+Pj0gMSkKKwkgICAgc2NhbGVkX3ZhbHVlIDw8PSAxOworCisJc2NhbGVkX3ZhbHVlICY9IGNoYW5uZWwtPnJlZ21hc2s7CisJc2NhbGVkX3ZhbHVlIHw9IChvbGR2YWwgJiB+Y2hhbm5lbC0+cmVnbWFzayk7CisgICAgfQorICAgIHJlc3VsdCA9IGFjOTdfcHV0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtLCBzY2FsZWRfdmFsdWUpOworICAgIGlmIChyZXN1bHQgPT0gMCkKKwlkZXYtPmxhc3Rfd3JpdHRlbl9PU1NfdmFsdWVzW29zc19jaGFubmVsXSA9IG9zc192YWx1ZTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50CithYzk3X2dldF9taXhlcl9zY2FsZWQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIGludCBvc3NfY2hhbm5lbCkKK3sKKyAgICBzdHJ1Y3QgYWM5N19jaG5fZGVzYyAqY2hhbm5lbCA9IGFjOTdfZmluZF9jaG5kZXNjIChkZXYsIG9zc19jaGFubmVsKTsKKyAgICBpbnQgcmVndmFsOworCisgICAgaWYgKGNoYW5uZWwgPT0gTlVMTCkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGlmICghIGFjOTdfaXNfdmFsaWRfY2hhbm5lbCAoZGV2LCBjaGFubmVsKSkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIHJlZ3ZhbCA9IGFjOTdfZ2V0X3JlZ2lzdGVyIChkZXYsIGNoYW5uZWwtPmFjOTdfcmVnbnVtKTsKKworICAgIGlmIChyZWd2YWwgPCAwKQorCXJldHVybiByZWd2YWw7CisKKyAgICBpZiAoY2hhbm5lbC0+cmVnbWFzayAhPSAwKSB7CisJaW50IG12OworCisJcmVndmFsICY9IGNoYW5uZWwtPnJlZ21hc2s7CisKKwlmb3IgKG12ID0gY2hhbm5lbC0+cmVnbWFzazsgISAobXYgJiAxKTsgbXYgPj49IDEpCisJICAgIHJlZ3ZhbCA+Pj0gMTsKKyAgICB9CisgICAgcmV0dXJuIGFjOTdfc2NhbGVfdG9fb3NzX3ZhbCAocmVndmFsLCBjaGFubmVsLT5tYXh2YWwsCisJCQkJICBjaGFubmVsLT5pc19zdGVyZW8sIAorCQkJCSAgY2hhbm5lbC0+aXNfaW52ZXJ0ZWQpOworfQorCitzdGF0aWMgaW50CithYzk3X2dldF9yZWNtYXNrIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KQoreworICAgIGludCByZWNSZWcgPSBhYzk3X2dldF9yZWdpc3RlciAoZGV2LCBBQzk3X1JFQ09SRF9TRUxFQ1QpOworCisgICAgaWYgKHJlY1JlZyA8IDApCisJcmV0dXJuIHJlY1JlZzsKKyAgICBlbHNlIHsKKwlpbnQgeDsKKwlmb3IgKHggPSAwOyBtaXhlclJlZ3NbeF0uYWM5N19yZWdudW0gPj0gMDsgeCsrKSB7CisJICAgIGlmIChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtID09IChyZWNSZWcgJiA3KSkKKwkJcmV0dXJuIG1peGVyUmVnc1t4XS5vc3NfbWFzazsKKwl9CisJcmV0dXJuIC1FTk9ERVY7CisgICAgfQorfQorCitzdGF0aWMgaW50CithYzk3X3NldF9yZWNtYXNrIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCBpbnQgb3NzX3JlY21hc2spCit7CisgICAgaW50IHg7CisKKyAgICBpZiAob3NzX3JlY21hc2sgPT0gMCkKKwlvc3NfcmVjbWFzayA9IFNPVU5EX01JWEVSX01JQzsKKworICAgIGZvciAoeCA9IDA7IG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSA+PSAwOyB4KyspIHsgCisJaWYgKChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtID49IDApCisJICAgICAmJiAob3NzX3JlY21hc2sgJiBtaXhlclJlZ3NbeF0ub3NzX21hc2spKQorCSAgICBicmVhazsKKyAgICB9CisgICAgaWYgKG1peGVyUmVnc1t4XS5hYzk3X3JlZ251bSA8IDApCisJcmV0dXJuIC1FTk9ERVY7CisgICAgZWxzZSB7CisJaW50IHJlZ3ZhbCA9IChtaXhlclJlZ3NbeF0ucmVjb3JkTnVtIDw8IDgpIHwgbWl4ZXJSZWdzW3hdLnJlY29yZE51bTsKKwlpbnQgcmVzID0gYWM5N19wdXRfcmVnaXN0ZXIgKGRldiwgQUM5N19SRUNPUkRfU0VMRUNULCByZWd2YWwpOworCWlmIChyZXMgPT0gMCkKKwkgICAgcmV0dXJuIGFjOTdfZ2V0X3JlY21hc2sgKGRldik7CisJZWxzZQorCSAgICByZXR1cm4gcmVzOworICAgIH0KK30KKworLyogU2V0IHRoZSBtaXhlciBERVYgdG8gdGhlIGxpc3Qgb2YgdmFsdWVzIGluIFZBTFVFX0xJU1QuICBSZXR1cm4gMCBvbgorICAgc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAgKi8KK2ludAorYWM5N19zZXRfdmFsdWVzIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCAKKwkJIHN0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QgKnZhbHVlX2xpc3QpCit7CisgICAgaW50IHg7CisKKyAgICBmb3IgKHggPSAwOyB2YWx1ZV9saXN0W3hdLm9zc19jaGFubmVsICE9IC0xOyB4KyspIHsKKwlpbnQgY2hudW0gPSB2YWx1ZV9saXN0W3hdLm9zc19jaGFubmVsOworCXN0cnVjdCBhYzk3X2Nobl9kZXNjICpjaGVudCA9IGFjOTdfZmluZF9jaG5kZXNjIChkZXYsIGNobnVtKTsKKwlpZiAoY2hlbnQgIT0gTlVMTCkgeworCSAgICB1MTYgdmFsOworCSAgICBpbnQgcmVzOworCisJICAgIGlmIChjaGVudC0+aXNfc3RlcmVvKQorCQl2YWwgPSAodmFsdWVfbGlzdFt4XS52YWx1ZS5zdGVyZW8ucmlnaHQgPDwgOCkgCisJCSAgICAgIHwgdmFsdWVfbGlzdFt4XS52YWx1ZS5zdGVyZW8ubGVmdDsKKwkgICAgZWxzZSB7CisJCS8qIFdlIGRvIHRoaXMgc28gdGhlIHJldHVybmVkIHZhbHVlIGxvb2tzIE9LIGluIHRoZQorCQkgICBtaXhlciBhcHAuICBJdCdzIG5vdCBuZWNlc3Nhcnkgb3RoZXJ3aXNlLiAgKi8KKwkJdmFsID0gKHZhbHVlX2xpc3RbeF0udmFsdWUubW9ubyA8PCA4KSAKKwkJICAgICAgfCB2YWx1ZV9saXN0W3hdLnZhbHVlLm1vbm87CisJICAgIH0KKwkgICAgcmVzID0gYWM5N19zZXRfbWl4ZXIgKGRldiwgY2hudW0sIHZhbCk7CisJICAgIGlmIChyZXMgPCAwKQorCQlyZXR1cm4gcmVzOworCX0KKwllbHNlCisJICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworaW50CithYzk3X21peGVyX2lvY3RsIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworICAgIGludCByZXQ7CisKKyAgICBzd2l0Y2ggKGNtZCkgeworICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkM6CisJcmV0ID0gYWM5N19nZXRfcmVjbWFzayAoZGV2KTsKKwlicmVhazsKKworICAgIGNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDOgorCXsKKwkgICAgaWYgKGdldF91c2VyIChyZXQsIChpbnQgX191c2VyICopIGFyZykpCisJCXJldCA9IC1FRkFVTFQ7CisJICAgIGVsc2UKKwkJcmV0ID0gYWM5N19zZXRfcmVjbWFzayAoZGV2LCByZXQpOworCX0KKwlicmVhazsKKworICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9DQVBTOgorCXJldCA9IFNPVU5EX0NBUF9FWENMX0lOUFVUOworCWJyZWFrOworCisgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0s6CisJcmV0ID0gZGV2LT5taXhlcl9kZXZtYXNrOworCWJyZWFrOworCisgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6CisJcmV0ID0gZGV2LT5taXhlcl9yZWNtYXNrOworCWJyZWFrOworCisgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlM6CisJcmV0ID0gZGV2LT5taXhlcl9zdGVyZW9tYXNrOworCWJyZWFrOworCisgICAgZGVmYXVsdDoKKwkvKiBSZWFkIG9yIHdyaXRlIHJlcXVlc3QuICovCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAoX0lPQ19UWVBFIChjbWQpID09ICdNJykgeworCSAgICBpbnQgZGlyID0gX1NJT0NfRElSIChjbWQpOworCSAgICBpbnQgY2hhbm5lbCA9IF9JT0NfTlIgKGNtZCk7CisKKwkgICAgaWYgKGNoYW5uZWwgPj0gMCAmJiBjaGFubmVsIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTKSB7CisJCXJldCA9IDA7CisJCWlmIChkaXIgJiBfU0lPQ19XUklURSkgeworCQkgICAgaW50IHZhbDsKKwkJICAgIGlmIChnZXRfdXNlciAodmFsLCAoaW50IF9fdXNlciAqKSBhcmcpID09IDApCisJCQlyZXQgPSBhYzk3X3NldF9taXhlciAoZGV2LCBjaGFubmVsLCB2YWwpOworCQkgICAgZWxzZQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJfQorCQlpZiAocmV0ID49IDAgJiYgKGRpciAmIF9TSU9DX1JFQUQpKSB7CisJCSAgICBpZiAoZGV2LT5sYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tjaGFubmVsXQorCQkJPT0gQUM5N19SRUdWQUxfVU5LTk9XTikKKwkJCWRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbY2hhbm5lbF0KKwkJCSAgICA9IGFjOTdfZ2V0X21peGVyX3NjYWxlZCAoZGV2LCBjaGFubmVsKTsKKwkJICAgIHJldCA9IGRldi0+bGFzdF93cml0dGVuX09TU192YWx1ZXNbY2hhbm5lbF07CisJCX0KKwkgICAgfQorCX0KKwlicmVhazsKKyAgICB9CisKKyAgICBpZiAocmV0IDwgMCkKKwlyZXR1cm4gcmV0OworICAgIGVsc2UKKwlyZXR1cm4gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpOworfQorCitFWFBPUlRfU1lNQk9MKGFjOTdfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGFjOTdfc2V0X3ZhbHVlcyk7CitFWFBPUlRfU1lNQk9MKGFjOTdfcHV0X3JlZ2lzdGVyKTsKK0VYUE9SVF9TWU1CT0woYWM5N19taXhlcl9pb2N0bCk7CitFWFBPUlRfU1lNQk9MKGFjOTdfcmVzZXQpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisMCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogIGMtYmFzaWMtb2Zmc2V0OiA0CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hYzk3LmggYi9zb3VuZC9vc3MvYWM5Ny5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDQ1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYWM5Ny5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogYWM5Ny5oIAorICogCisgKiBkZWZpbml0aW9ucyBmb3IgdGhlIEFDOTcsIEludGVsJ3MgQXVkaW8gQ29kZWMgOTcgU3BlYworICogYWxzbyBpbmNsdWRlcyBzdXBwb3J0IGZvciBhIGdlbmVyaWMgQUM5NyBpbnRlcmZhY2UKKyAqLworCisjaWZuZGVmIF9BQzk3X0hfCisjZGVmaW5lIF9BQzk3X0hfCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAic291bmRfY2FsbHMuaCIKKworI2RlZmluZSAgQUM5N19SRVNFVCAgICAgICAgICAgICAgMHgwMDAwICAgICAgLy8KKyNkZWZpbmUgIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8gIDB4MDAwMiAgICAgIC8vIExpbmUgT3V0CisjZGVmaW5lICBBQzk3X0hFQURQSE9ORV9WT0wgICAgICAweDAwMDQgICAgICAvLyAKKyNkZWZpbmUgIEFDOTdfTUFTVEVSX1ZPTF9NT05PICAgIDB4MDAwNiAgICAgIC8vIFRBRCBPdXRwdXQKKyNkZWZpbmUgIEFDOTdfTUFTVEVSX1RPTkUgICAgICAgIDB4MDAwOCAgICAgIC8vCisjZGVmaW5lICBBQzk3X1BDQkVFUF9WT0wgICAgICAgICAweDAwMGEgICAgICAvLyBub25lCisjZGVmaW5lICBBQzk3X1BIT05FX1ZPTCAgICAgICAgICAweDAwMGMgICAgICAvLyBUQUQgSW5wdXQgKG1vbm8pCisjZGVmaW5lICBBQzk3X01JQ19WT0wgICAgICAgICAgICAweDAwMGUgICAgICAvLyBNSUMgSW5wdXQgKG1vbm8pCisjZGVmaW5lICBBQzk3X0xJTkVJTl9WT0wgICAgICAgICAweDAwMTAgICAgICAvLyBMaW5lIElucHV0IChzdGVyZW8pCisjZGVmaW5lICBBQzk3X0NEX1ZPTCAgICAgICAgICAgICAweDAwMTIgICAgICAvLyBDRCBJbnB1dCAoc3RlcmVvKQorI2RlZmluZSAgQUM5N19WSURFT19WT0wgICAgICAgICAgMHgwMDE0ICAgICAgLy8gbm9uZQorI2RlZmluZSAgQUM5N19BVVhfVk9MICAgICAgICAgICAgMHgwMDE2ICAgICAgLy8gQXV4IElucHV0IChzdGVyZW8pCisjZGVmaW5lICBBQzk3X1BDTU9VVF9WT0wgICAgICAgICAweDAwMTggICAgICAvLyBXYXZlIE91dHB1dCAoc3RlcmVvKQorI2RlZmluZSAgQUM5N19SRUNPUkRfU0VMRUNUICAgICAgMHgwMDFhICAgICAgLy8KKyNkZWZpbmUgIEFDOTdfUkVDT1JEX0dBSU4gICAgICAgIDB4MDAxYworI2RlZmluZSAgQUM5N19SRUNPUkRfR0FJTl9NSUMgICAgMHgwMDFlCisjZGVmaW5lICBBQzk3X0dFTkVSQUxfUFVSUE9TRSAgICAweDAwMjAKKyNkZWZpbmUgIEFDOTdfM0RfQ09OVFJPTCAgICAgICAgIDB4MDAyMgorI2RlZmluZSAgQUM5N19NT0RFTV9SQVRFICAgICAgICAgMHgwMDI0CisjZGVmaW5lICBBQzk3X1BPV0VSX0NPTlRST0wgICAgICAweDAwMjYKKworLyogcmVnaXN0ZXJzIDB4MDAyOCAtIDB4MDA1OCBhcmUgcmVzZXJ2ZWQgKi8KKworLyogQUMnOTcgMi4wICovCisjZGVmaW5lIEFDOTdfRVhURU5ERURfSUQJMHgwMDI4CS8qIEV4dGVuZGVkIEF1ZGlvIElEICovCisjZGVmaW5lIEFDOTdfRVhURU5ERURfU1RBVFVTCTB4MDAyQQkvKiBFeHRlbmRlZCBBdWRpbyBTdGF0dXMgKi8KKyNkZWZpbmUgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUgMHgwMDJDICAvKiBQQ00gRnJvbnQgREFDIFJhdGUgKi8KKyNkZWZpbmUgQUM5N19QQ01fU1VSUl9EQUNfUkFURSAgMHgwMDJFICAvKiBQQ00gU3Vycm91bmQgREFDIFJhdGUgKi8KKyNkZWZpbmUgQUM5N19QQ01fTEZFX0RBQ19SQVRFICAgMHgwMDMwICAvKiBQQ00gTEZFIERBQyBSYXRlICovCisjZGVmaW5lIEFDOTdfUENNX0xSX0FEQ19SQVRFCTB4MDAzMgkvKiBQQ00gTFIgREFDIFJhdGUgKi8KKyNkZWZpbmUgQUM5N19QQ01fTUlDX0FEQ19SQVRFICAgMHgwMDM0ICAvKiBQQ00gTUlDIEFEQyBSYXRlICovCisjZGVmaW5lIEFDOTdfQ0VOVEVSX0xGRV9NQVNURVIgIDB4MDAzNiAgLyogQ2VudGVyICsgTEZFIE1hc3RlciBWb2x1bWUgKi8KKyNkZWZpbmUgQUM5N19TVVJST1VORF9NQVNURVIgICAgMHgwMDM4ICAvKiBTdXJyb3VuZCAoUmVhcikgTWFzdGVyIFZvbHVtZSAqLworI2RlZmluZSBBQzk3X1JFU0VSVkVEXzNBCTB4MDAzQQkvKiBSZXNlcnZlZCAqLworLyogcmFuZ2UgMHgzYy0weDU4IC0gTU9ERU0gKi8KKworLyogcmVnaXN0ZXJzIDB4MDA1YSAtIDB4MDA3YSBhcmUgdmVuZG9yIHJlc2VydmVkICovCisKKyNkZWZpbmUgIEFDOTdfVkVORE9SX0lEMSAgICAgICAgIDB4MDA3YworI2RlZmluZSAgQUM5N19WRU5ET1JfSUQyICAgICAgICAgMHgwMDdlCisKKy8qIHZvbHVtZSBjb250cm9sIGJpdCBkZWZpbmVzICovCisKKyNkZWZpbmUgQUM5N19NVVRFICAgICAgICAgICAgICAgIDB4ODAwMAorI2RlZmluZSBBQzk3X01JQ0JPT1NUICAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIEFDOTdfTEVGVFZPTCAgICAgICAgICAgICAweDNmMDAKKyNkZWZpbmUgQUM5N19SSUdIVFZPTCAgICAgICAgICAgIDB4MDAzZgorCisvKiByZWNvcmQgbXV4IGRlZmluZXMgKi8KKworI2RlZmluZSBBQzk3X1JFQ01VWF9NSUMgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIEFDOTdfUkVDTVVYX0NEICAgICAgICAgICAweDAxMDEKKyNkZWZpbmUgQUM5N19SRUNNVVhfVklERU8gICAgICAgIDB4MDIwMiAgICAgIC8qIG5vdCB1c2VkICovCisjZGVmaW5lIEFDOTdfUkVDTVVYX0FVWCAgICAgICAgICAweDAzMDMgICAgICAKKyNkZWZpbmUgQUM5N19SRUNNVVhfTElORSAgICAgICAgIDB4MDQwNCAgICAgIAorI2RlZmluZSBBQzk3X1JFQ01VWF9TVEVSRU9fTUlYICAgMHgwNTA1CisjZGVmaW5lIEFDOTdfUkVDTVVYX01PTk9fTUlYICAgICAweDA2MDYKKyNkZWZpbmUgQUM5N19SRUNNVVhfUEhPTkUgICAgICAgIDB4MDcwNworCisKKy8qIGdlbmVyYWwgcHVycG9zZSByZWdpc3RlciBiaXQgZGVmaW5lcyAqLworCisjZGVmaW5lIEFDOTdfR1BfTFBCSyAgICAgICAgICAgICAweDAwODAgICAgICAvKiBMb29wYmFjayBtb2RlICovCisjZGVmaW5lIEFDOTdfR1BfTVMgICAgICAgICAgICAgICAweDAxMDAgICAgICAvKiBNaWMgU2VsZWN0IDA9TWljMSwgMT1NaWMyICovCisjZGVmaW5lIEFDOTdfR1BfTUlYICAgICAgICAgICAgICAweDAyMDAgICAgICAvKiBNb25vIG91dHB1dCBzZWxlY3QgMD1NaXgsIDE9TWljICovCisjZGVmaW5lIEFDOTdfR1BfUkxCSyAgICAgICAgICAgICAweDA0MDAgICAgICAvKiBSZW1vdGUgTG9vcGJhY2sgLSBNb2RlbSBsaW5lIGNvZGVjICovCisjZGVmaW5lIEFDOTdfR1BfTExCSyAgICAgICAgICAgICAweDA4MDAgICAgICAvKiBMb2NhbCBMb29wYmFjayAtIE1vZGVtIExpbmUgY29kZWMgKi8KKyNkZWZpbmUgQUM5N19HUF9MRCAgICAgICAgICAgICAgIDB4MTAwMCAgICAgIC8qIExvdWRuZXNzIDE9b24gKi8KKyNkZWZpbmUgQUM5N19HUF8zRCAgICAgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIDNEIEVuaGFuY2VtZW50IDE9b24gKi8KKyNkZWZpbmUgQUM5N19HUF9TVCAgICAgICAgICAgICAgIDB4NDAwMCAgICAgIC8qIFN0ZXJlbyBFbmhhbmNlbWVudCAxPW9uICovCisjZGVmaW5lIEFDOTdfR1BfUE9QICAgICAgICAgICAgICAweDgwMDAgICAgICAvKiBQY20gT3V0IFBhdGgsIDA9cHJlIDNELCAxPXBvc3QgM0QgKi8KKworCisvKiBwb3dlcmRvd24gY29udHJvbCBhbmQgc3RhdHVzIGJpdCBkZWZpbmVzICovCisKKy8qIHN0YXR1cyAqLworI2RlZmluZSBBQzk3X1BXUl9NRE0gICAgICAgICAgICAgMHgwMDEwICAgICAgLyogTW9kZW0gc2VjdGlvbiByZWFkeSAqLworI2RlZmluZSBBQzk3X1BXUl9SRUYgICAgICAgICAgICAgMHgwMDA4ICAgICAgLyogVnJlZiBub21pbmFsICovCisjZGVmaW5lIEFDOTdfUFdSX0FOTCAgICAgICAgICAgICAweDAwMDQgICAgICAvKiBBbmFsb2cgc2VjdGlvbiByZWFkeSAqLworI2RlZmluZSBBQzk3X1BXUl9EQUMgICAgICAgICAgICAgMHgwMDAyICAgICAgLyogREFDIHNlY3Rpb24gcmVhZHkgKi8KKyNkZWZpbmUgQUM5N19QV1JfQURDICAgICAgICAgICAgIDB4MDAwMSAgICAgIC8qIEFEQyBzZWN0aW9uIHJlYWR5ICovCisKKy8qIGNvbnRyb2wgKi8KKyNkZWZpbmUgQUM5N19QV1JfUFIwICAgICAgICAgICAgIDB4MDEwMCAgICAgIC8qIEFEQyBhbmQgTXV4IHBvd2VyZG93biAqLworI2RlZmluZSBBQzk3X1BXUl9QUjEgICAgICAgICAgICAgMHgwMjAwICAgICAgLyogREFDIHBvd2VyZG93biAqLworI2RlZmluZSBBQzk3X1BXUl9QUjIgICAgICAgICAgICAgMHgwNDAwICAgICAgLyogT3V0cHV0IG1peGVyIHBvd2VyZG93biAoVnJlZiBvbikgKi8KKyNkZWZpbmUgQUM5N19QV1JfUFIzICAgICAgICAgICAgIDB4MDgwMCAgICAgIC8qIE91dHB1dCBtaXhlciBwb3dlcmRvd24gKFZyZWYgb2ZmKSAqLworI2RlZmluZSBBQzk3X1BXUl9QUjQgICAgICAgICAgICAgMHgxMDAwICAgICAgLyogQUMtbGluayBwb3dlcmRvd24gKi8KKyNkZWZpbmUgQUM5N19QV1JfUFI1ICAgICAgICAgICAgIDB4MjAwMCAgICAgIC8qIEludGVybmFsIENsayBkaXNhYmxlICovCisjZGVmaW5lIEFDOTdfUFdSX1BSNiAgICAgICAgICAgICAweDQwMDAgICAgICAvKiBIUCBhbXAgcG93ZXJkb3duICovCisjZGVmaW5lIEFDOTdfUFdSX1BSNyAgICAgICAgICAgICAweDgwMDAgICAgICAvKiBNb2RlbSBvZmYgLSBpZiBzdXBwb3J0ZWQgKi8KKworLyogdXNlZnVsIHBvd2VyIHN0YXRlcyAqLworI2RlZmluZSBBQzk3X1BXUl9EMCAgICAgICAgICAgICAgMHgwMDAwICAgICAgLyogZXZlcnl0aGluZyBvbiAqLworI2RlZmluZSBBQzk3X1BXUl9EMSAgICAgICAgICAgICAgQUM5N19QV1JfUFIwfEFDOTdfUFdSX1BSMXxBQzk3X1BXUl9QUjQKKyNkZWZpbmUgQUM5N19QV1JfRDIgICAgICAgICAgICAgIEFDOTdfUFdSX1BSMHxBQzk3X1BXUl9QUjF8QUM5N19QV1JfUFIyfEFDOTdfUFdSX1BSM3xBQzk3X1BXUl9QUjQKKyNkZWZpbmUgQUM5N19QV1JfRDMgICAgICAgICAgICAgIEFDOTdfUFdSX1BSMHxBQzk3X1BXUl9QUjF8QUM5N19QV1JfUFIyfEFDOTdfUFdSX1BSM3xBQzk3X1BXUl9QUjQKKyNkZWZpbmUgQUM5N19QV1JfQU5MT0ZGICAgICAgICAgIEFDOTdfUFdSX1BSMnxBQzk3X1BXUl9QUjMgIC8qIGFuYWxvZyBzZWN0aW9uIG9mZiAqLworCisvKiBUb3RhbCBudW1iZXIgb2YgZGVmaW5lZCByZWdpc3RlcnMuICAqLworI2RlZmluZSBBQzk3X1JFR19DTlQgNjQKKworLyogR2VuZXJpYyBBQzk3IG1peGVyIGludGVyZmFjZS4gKi8KKworLyogU3RydWN0dXJlIGRlc2NyaWJpbmcgYWNjZXNzIHRvIHRoZSBoYXJkd2FyZS4gKi8KK3N0cnVjdCBhYzk3X2h3aW50Cit7CisgICAgLyogUGVyZm9ybSBhbnkgaGFyZHdhcmUtc3BlY2lmaWMgcmVzZXQgYW5kIGluaXRpYWxpemF0aW9uLiAgUmV0dXJucworICAgICAwIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4gICovCisgICAgaW50ICgqcmVzZXRfZGV2aWNlKSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldik7CisKKyAgICAvKiBSZXR1cm5zIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIFJFRy4gIFRoZSBjYWxsZXIKKyAgICAgICBzaG91bGQgY2hlY2sgdG8gc2VlIGlmIHRoZSBkZXNpcmVkIGNvbnRlbnRzIGFyZSBhdmFpbGFibGUgaW4KKyAgICAgICB0aGUgY2FjaGUgZmlyc3QsIGlmIGFwcGxpY2FibGUuIFJldHVybnMgYSBwb3NpdGl2ZSB1bnNpZ25lZCB2YWx1ZQorICAgICAgIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgdGhlIHJlZ2lzdGVyLCBvciBhIG5lZ2F0aXZlIGVycm9yCisgICAgICAgY29kZS4gICovCisgICAgaW50ICgqcmVhZF9yZWcpIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcpOworCisgICAgLyogV3JpdGVzIFZBTFVFIHRvIHJlZ2lzdGVyIFJFRy4gIFJldHVybnMgMCBvbiBzdWNjZXNzLCBvciBhCisgICAgICAgbmVnYXRpdmUgZXJyb3IgY29kZS4gICovCisgICAgaW50ICgqd3JpdGVfcmVnKSAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdTggcmVnLCB1MTYgdmFsdWUpOworCisgICAgLyogSGFyZHdhcmUtc3BlY2lmaWMgaW5mb3JtYXRpb24uICovCisgICAgdm9pZCAqZHJpdmVyX3ByaXZhdGU7CisKKyAgICAvKiBUaHJlZSBPU1MgbWFza3MuICovCisgICAgaW50IG1peGVyX2Rldm1hc2s7CisgICAgaW50IG1peGVyX3N0ZXJlb21hc2s7CisgICAgaW50IG1peGVyX3JlY21hc2s7CisKKyAgICAvKiBUaGUgbWl4ZXIgY2FjaGUuIFRoZSBpbmRpY2VzIGNvcnJlc3BvbmQgdG8gdGhlIEFDOTcgaGFyZHdhcmUgcmVnaXN0ZXIKKyAgICAgICBudW1iZXIgLyAyLCBzaW5jZSB0aGUgcmVnaXN0ZXIgbnVtYmVycyBhcmUgYWx3YXlzIGFuIGV2ZW4gbnVtYmVyLgorCisgICAgICAgVW5rbm93biB2YWx1ZXMgYXJlIHNldCB0byAtMTsgdW5zdXBwb3J0ZWQgcmVnaXN0ZXJzIGNvbnRhaW4gYQorICAgICAgIC0yLiAgKi8KKyAgICBpbnQgbGFzdF93cml0dGVuX21peGVyX3ZhbHVlc1tBQzk3X1JFR19DTlRdOworCisgICAgLyogQSBjYWNoZSBvZiB2YWx1ZXMgd3JpdHRlbiB2aWEgT1NTOyB3ZSBuZWVkIHRoZXNlIHNvIHdlIGNhbiByZXR1cm4KKyAgICAgICB0aGUgdmFsdWVzIG9yaWdpbmFsbHkgd3JpdHRlbiBieSB0aGUgdXNlci4KKworICAgICAgIFdoeSB0aGUgb3JpZ2luYWwgdXNlciB2YWx1ZXM/ICBCZWNhdXNlIHRoZSByZWFsLXdvcmxkIGhhcmR3YXJlCisgICAgICAgaGFzIGxlc3MgcHJlY2lzaW9uLCBhbmQgc29tZSBleGlzdGluZyBhcHBsaWNhdGlvbnMgYXNzdW1lIHRoYXQKKyAgICAgICB0aGV5IHdpbGwgZ2V0IGJhY2sgdGhlIGV4YWN0IHZhbHVlIHRoYXQgdGhleSB3cm90ZSAoYXVtaXgpLgorCisgICAgICAgQSAtMSB2YWx1ZSBpbmRpY2F0ZXMgdGhhdCBubyB2YWx1ZSBoYXMgYmVlbiB3cml0dGVuIHRvIHRoaXMgbWl4ZXIKKyAgICAgICBjaGFubmVsIHZpYSBPU1MuICAqLworICAgIGludCBsYXN0X3dyaXR0ZW5fT1NTX3ZhbHVlc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdOworfTsKKworLyogVmFsdWVzIHN0b3JlZCBpbiB0aGUgcmVnaXN0ZXIgY2FjaGUuICAqLworI2RlZmluZSBBQzk3X1JFR1ZBTF9VTktOT1dOIC0xCisjZGVmaW5lIEFDOTdfUkVHX1VOU1VQUE9SVEVEIC0yCisKK3N0cnVjdCBhYzk3X21peGVyX3ZhbHVlX2xpc3QKK3sKKyAgICAvKiBNaXhlciBjaGFubmVsIHRvIHNldC4gIExpc3QgaXMgdGVybWluYXRlZCBieSBhIHZhbHVlIG9mIC0xLiAgKi8KKyAgICBpbnQgb3NzX2NoYW5uZWw7CisgICAgLyogVGhlIHNjYWxlZCB2YWx1ZSB0byBzZXQgaXQgdG87IHZhbHVlcyBnZW5lcmFsbHkgcmFuZ2UgZnJvbSAwLTEwMC4gKi8KKyAgICB1bmlvbiB7CisJc3RydWN0IHsKKwkgICAgdTggbGVmdCwgcmlnaHQ7CisJfSBzdGVyZW87CisJdTggbW9ubzsKKyAgICB9IHZhbHVlOworfTsKKworLyogSW5pdGlhbGl6ZSB0aGUgYWM5NyBtaXhlciBieSByZXNldHRpbmcgaXQuICAqLworZXh0ZXJuIGludCBhYzk3X2luaXQgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYpOworCisvKiBTZXRzIHRoZSBtaXhlciBERVYgdG8gdGhlIHZhbHVlcyBpbiBWQUxVRV9MSVNULiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsCisgICBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuICAqLworZXh0ZXJuIGludCBhYzk3X3NldF92YWx1ZXMgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsCisJCQkgICAgc3RydWN0IGFjOTdfbWl4ZXJfdmFsdWVfbGlzdCAqdmFsdWVfbGlzdCk7CisKKy8qIFdyaXRlcyB0aGUgc3BlY2lmaWVkIFZBTFVFIHRvIHRoZSBBQzk3IHJlZ2lzdGVyIFJFRyBpbiB0aGUgbWl4ZXIuCisgICBUYWtlcyBjYXJlIG9mIHNldHRpbmcgdGhlIGxhc3Qtd3JpdHRlbiBjYWNoZSBhcyB3ZWxsLiAgKi8KK2V4dGVybiBpbnQgYWM5N19wdXRfcmVnaXN0ZXIgKHN0cnVjdCBhYzk3X2h3aW50ICpkZXYsIHU4IHJlZywgdTE2IHZhbHVlKTsKKworLyogRGVmYXVsdCBpb2N0bC4gKi8KK2V4dGVybiBpbnQgYWM5N19taXhlcl9pb2N0bCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldiwgdW5zaWduZWQgaW50IGNtZCwKKwkJCSAgICAgdm9pZCBfX3VzZXIgKiBhcmcpOworCisvKiBEbyBhIGNvbXBsZXRlIHJlc2V0IG9uIHRoZSBBQzk3IG1peGVyLCByZXN0b3JpbmcgYWxsIG1peGVyIHJlZ2lzdGVycyB0bworICAgdGhlIGN1cnJlbnQgdmFsdWVzLiAgTm9ybWFsbHkgdXNlZCBhZnRlciBhbiBBUE0gcmVzdW1lIGV2ZW50LiAgKi8KK2V4dGVybiBpbnQgYWM5N19yZXNldCAoc3RydWN0IGFjOTdfaHdpbnQgKmRldik7CisjZW5kaWYKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjOTdfY29kZWMuYyBiL3NvdW5kL29zcy9hYzk3X2NvZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0YjFlMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hYzk3X2NvZGVjLmMKQEAgLTAsMCArMSwxNTc2IEBACisvKgorICogYWM5N19jb2RlYy5jOiBHZW5lcmljIEFDOTcgbWl4ZXIvbW9kZW0gbW9kdWxlCisgKgorICogRGVyaXZlZCBmcm9tIGFjOTcgbWl4ZXIgaW4gbWFlc3RybyBhbmQgdHJpZGVudCBkcml2ZXIuCisgKgorICogQ29weXJpZ2h0IDIwMDAgU2lsaWNvbiBJbnRlZ3JhdGVkIFN5c3RlbSBDb3Jwb3JhdGlvbgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFRoZSBJbnRlbCBBdWRpbyBDb2RlYyAnOTcgc3BlY2lmaWNhdGlvbiBpcyBhdmFpbGFibGUgYXQgdGhlIEludGVsCisgKiBhdWRpbyBob21lcGFnZTogaHR0cDovL2RldmVsb3Blci5pbnRlbC5jb20vaWFsL3NjYWxhYmxlcGxhdGZvcm1zL2F1ZGlvLworICoKKyAqIFRoZSBzcGVjaWZpY2F0aW9uIGl0c2VsZiBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIGF0OgorICogZnRwOi8vZG93bmxvYWQuaW50ZWwuY29tL2lhbC9zY2FsYWJsZXBsYXRmb3Jtcy9hYzk3cjIyLnBkZgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEhpc3RvcnkKKyAqIE1heSAwMiwgMjAwMyBMaWFtIEdpcmR3b29kIDxsaWFtLmdpcmR3b29kQHdvbGZzb25taWNyby5jb20+CisgKglSZW1vdmVkIG5vbiBleGlzdGFudCBXTTk3MDAKKyAqCUFkZGVkIHN1cHBvcnQgZm9yIFdNOTcwNSwgV005NzA4LCBXTTk3MDksIFdNOTcxMCwgV005NzExCisgKglXTTk3MTIgYW5kIFdNOTcxNworICogTWFyIDI4LCAyMDAyIFJhbmRvbHBoIEJlbnRzb24gPGJlbnRzb25AaG9sbXNqb2VuLmNvbT4KKyAqCWNvcnJlY3Rpb25zIHRvIHN1cHBvcnQgV005NzA3IGluIFZpZXdQYWQgMTAwMAorICogdjAuNCBNYXIgMTUgMjAwMCBPbGxpZSBMaG8KKyAqCWR1YWwgY29kZWNzIHN1cHBvcnQgdmVyaWZpZWQgd2l0aCA0IGNoYW5uZWxzIG91dHB1dAorICogdjAuMyBGZWIgMjIgMjAwMCBPbGxpZSBMaG8KKyAqCWJ1ZyBmaXggZm9yIHJlY29yZCBtYXNrIHNldHRpbmcKKyAqIHYwLjIgRmViIDEwIDIwMDAgT2xsaWUgTGhvCisgKglhZGQgYWM5N19yZWFkX3Byb2MgZm9yIC9wcm9jL2RyaXZlci97dmVuZG9yfS9hYzk3CisgKiB2MC4xIEphbiAxNCAyMDAwIE9sbGllIExobyA8b2xsaWVAc2lzLmNvbS50dz4gCisgKglJc29sYXRlZCBmcm9tIHRyaWRlbnQuYyB0byBzdXBwb3J0IG11bHRpcGxlIGFjOTcgY29kZWMKKyAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgQ09ERUNfSURfQlVGU1ogMTQKKworc3RhdGljIGludCBhYzk3X3JlYWRfbWl4ZXIoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCBpbnQgb3NzX2NoYW5uZWwpOworc3RhdGljIHZvaWQgYWM5N193cml0ZV9taXhlcihzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCBvc3NfY2hhbm5lbCwgCisJCQkgICAgIHVuc2lnbmVkIGludCBsZWZ0LCB1bnNpZ25lZCBpbnQgcmlnaHQpOworc3RhdGljIHZvaWQgYWM5N19zZXRfbWl4ZXIoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgb3NzX21peGVyLCB1bnNpZ25lZCBpbnQgdmFsICk7CitzdGF0aWMgaW50IGFjOTdfcmVjbWFza19pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCBydywgaW50IG1hc2spOworc3RhdGljIGludCBhYzk3X21peGVyX2lvY3RsKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworCitzdGF0aWMgaW50IGFjOTdfaW5pdF9taXhlcihzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpOworCitzdGF0aWMgaW50IHdvbGZzb25faW5pdDAzKHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpOworc3RhdGljIGludCB3b2xmc29uX2luaXQwNChzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKTsKK3N0YXRpYyBpbnQgd29sZnNvbl9pbml0MDUoc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYyk7CitzdGF0aWMgaW50IHdvbGZzb25faW5pdDExKHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpOworc3RhdGljIGludCB3b2xmc29uX2luaXQxMyhzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKTsKK3N0YXRpYyBpbnQgdHJpdGVjaF9pbml0KHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpOworc3RhdGljIGludCB0cml0ZWNoX21hZXN0cm9faW5pdChzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKTsKK3N0YXRpYyBpbnQgc2lnbWF0ZWxfOTcwOF9pbml0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyk7CitzdGF0aWMgaW50IHNpZ21hdGVsXzk3MjFfaW5pdChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpOworc3RhdGljIGludCBzaWdtYXRlbF85NzQ0X2luaXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKTsKK3N0YXRpYyBpbnQgYWQxODg2X2luaXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKTsKK3N0YXRpYyBpbnQgZWFwZF9jb250cm9sKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50KTsKK3N0YXRpYyBpbnQgY3J5c3RhbF9kaWdpdGFsX2NvbnRyb2woc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCBpbnQgc2xvdHMsIGludCByYXRlLCBpbnQgbW9kZSk7CitzdGF0aWMgaW50IGNtZWRpYV9pbml0KHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpOworc3RhdGljIGludCBjbWVkaWFfZGlnaXRhbF9jb250cm9sKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50IHNsb3RzLCBpbnQgcmF0ZSwgaW50IG1vZGUpOworc3RhdGljIGludCBnZW5lcmljX2RpZ2l0YWxfY29udHJvbChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCBzbG90cywgaW50IHJhdGUsIGludCBtb2RlKTsKKworCisvKgorICoJQUM5NyBvcGVyYXRpb25zLgorICoKKyAqCUlmIHlvdSBhcmUgYWRkaW5nIGEgY29kZWMgdGhlbiB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlCisgKgkJZWFwZF9vcHMgLSBhbnkgY29kZWMgdGhhdCBzdXBwb3J0cyBFQVBEIGFtcCBjb250cm9sIChtb3N0KQorICoJCW51bGxfb3BzIC0gYW55IGFuY2llbnQgY29kZWMgdGhhdCBzdXBwb3J0cyBub3RoaW5nCisgKgorICoJVGhlIHRocmVlIGZ1bmN0aW9ucyBhcmUKKyAqCQlpbml0IC0gdXNlZCBmb3Igbm9uIEFDOTcgc3RhbmRhcmQgaW5pdGlhbGlzYXRpb24KKyAqCQlhbXBsaWZpZXIgLSB1c2VkIHRvIGRvIGFtcGxpZmllciBjb250cm9sICgxPW9uIDA9b2ZmKQorICoJCWRpZ2l0YWwgLSBzd2l0Y2ggdG8gZGlnaXRhbCBtb2RlcyAoMCA9IGFuYWxvZykKKyAqCisgKglOb3QgYWxsIGNvZGVjcyBzdXBwb3J0IGFsbCBmZWF0dXJlcywgbm90IGFsbCBkcml2ZXJzIHVzZSBhbGwgdGhlCisgKglvcGVyYXRpb25zIHlldAorICovCisgCitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIG51bGxfb3BzID0geyBOVUxMLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIGRlZmF1bHRfb3BzID0geyBOVUxMLCBlYXBkX2NvbnRyb2wsIE5VTEwgfTsKK3N0YXRpYyBzdHJ1Y3QgYWM5N19vcHMgZGVmYXVsdF9kaWdpdGFsX29wcyA9IHsgTlVMTCwgZWFwZF9jb250cm9sLCBnZW5lcmljX2RpZ2l0YWxfY29udHJvbH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHdvbGZzb25fb3BzMDMgPSB7IHdvbGZzb25faW5pdDAzLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHdvbGZzb25fb3BzMDQgPSB7IHdvbGZzb25faW5pdDA0LCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHdvbGZzb25fb3BzMDUgPSB7IHdvbGZzb25faW5pdDA1LCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHdvbGZzb25fb3BzMTEgPSB7IHdvbGZzb25faW5pdDExLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHdvbGZzb25fb3BzMTMgPSB7IHdvbGZzb25faW5pdDEzLCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHRyaXRlY2hfb3BzID0geyB0cml0ZWNoX2luaXQsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBzdHJ1Y3QgYWM5N19vcHMgdHJpdGVjaF9tX29wcyA9IHsgdHJpdGVjaF9tYWVzdHJvX2luaXQsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBzdHJ1Y3QgYWM5N19vcHMgc2lnbWF0ZWxfOTcwOF9vcHMgPSB7IHNpZ21hdGVsXzk3MDhfaW5pdCwgTlVMTCwgTlVMTCB9Oworc3RhdGljIHN0cnVjdCBhYzk3X29wcyBzaWdtYXRlbF85NzIxX29wcyA9IHsgc2lnbWF0ZWxfOTcyMV9pbml0LCBOVUxMLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIHNpZ21hdGVsXzk3NDRfb3BzID0geyBzaWdtYXRlbF85NzQ0X2luaXQsIE5VTEwsIE5VTEwgfTsKK3N0YXRpYyBzdHJ1Y3QgYWM5N19vcHMgY3J5c3RhbF9kaWdpdGFsX29wcyA9IHsgTlVMTCwgZWFwZF9jb250cm9sLCBjcnlzdGFsX2RpZ2l0YWxfY29udHJvbCB9Oworc3RhdGljIHN0cnVjdCBhYzk3X29wcyBhZDE4ODZfb3BzID0geyBhZDE4ODZfaW5pdCwgZWFwZF9jb250cm9sLCBOVUxMIH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIGNtZWRpYV9vcHMgPSB7IE5VTEwsIGVhcGRfY29udHJvbCwgTlVMTH07CitzdGF0aWMgc3RydWN0IGFjOTdfb3BzIGNtZWRpYV9kaWdpdGFsX29wcyA9IHsgY21lZGlhX2luaXQsIGVhcGRfY29udHJvbCwgY21lZGlhX2RpZ2l0YWxfY29udHJvbH07CisKKy8qIHNvcnRlZCBieSB2ZW5kb3IvZGV2aWNlIGlkICovCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1MzIgaWQ7CisJY2hhciAqbmFtZTsKKwlzdHJ1Y3QgYWM5N19vcHMgKm9wczsKKwlpbnQgZmxhZ3M7Cit9IGFjOTdfY29kZWNfaWRzW10gPSB7CisJezB4NDE0NDUzMDMsICJBbmFsb2cgRGV2aWNlcyBBRDE4MTkiLAkmbnVsbF9vcHN9LAorCXsweDQxNDQ1MzQwLCAiQW5hbG9nIERldmljZXMgQUQxODgxIiwJJm51bGxfb3BzfSwKKwl7MHg0MTQ0NTM0OCwgIkFuYWxvZyBEZXZpY2VzIEFEMTg4MUEiLAkmbnVsbF9vcHN9LAorCXsweDQxNDQ1MzYwLCAiQW5hbG9nIERldmljZXMgQUQxODg1IiwJJmRlZmF1bHRfb3BzfSwKKwl7MHg0MTQ0NTM2MSwgIkFuYWxvZyBEZXZpY2VzIEFEMTg4NiIsCSZhZDE4ODZfb3BzfSwKKwl7MHg0MTQ0NTM3MCwgIkFuYWxvZyBEZXZpY2VzIEFEMTk4MSIsCSZudWxsX29wc30sCisJezB4NDE0NDUzNzIsICJBbmFsb2cgRGV2aWNlcyBBRDE5ODFBIiwJJm51bGxfb3BzfSwKKwl7MHg0MTQ0NTM3NCwgIkFuYWxvZyBEZXZpY2VzIEFEMTk4MUIiLAkmbnVsbF9vcHN9LAorCXsweDQxNDQ1NDYwLCAiQW5hbG9nIERldmljZXMgQUQxODg1IiwJJmRlZmF1bHRfb3BzfSwKKwl7MHg0MTQ0NTQ2MSwgIkFuYWxvZyBEZXZpY2VzIEFEMTg4NiIsCSZhZDE4ODZfb3BzfSwKKwl7MHg0MTRCNEQwMCwgIkFzYWhpIEthc2VpIEFLNDU0MCIsCSZudWxsX29wc30sCisJezB4NDE0QjREMDEsICJBc2FoaSBLYXNlaSBBSzQ1NDIiLAkmbnVsbF9vcHN9LAorCXsweDQxNEI0RDAyLCAiQXNhaGkgS2FzZWkgQUs0NTQzIiwJJm51bGxfb3BzfSwKKwl7MHg0MTRDNDMyNiwgIkFMQzEwMFAiLAkJCSZudWxsX29wc30sCisJezB4NDE0QzQ3MTAsICJBTEMyMDAvMjAwUCIsCQkmbnVsbF9vcHN9LAorCXsweDQxNEM0NzIwLCAiQUxDNjUwIiwJCQkmZGVmYXVsdF9kaWdpdGFsX29wc30sCisJezB4NDM0RDQ5NDEsICJDTWVkaWEiLAkJCSZjbWVkaWFfb3BzLAkJQUM5N19OT19QQ01fVk9MVU1FIH0sCisJezB4NDM0RDQ5NDIsICJDTWVkaWEiLAkJCSZjbWVkaWFfb3BzLAkJQUM5N19OT19QQ01fVk9MVU1FIH0sCisJezB4NDM0RDQ5NjEsICJDTWVkaWEiLAkJCSZjbWVkaWFfZGlnaXRhbF9vcHMsCUFDOTdfTk9fUENNX1ZPTFVNRSB9LAorCXsweDQzNTI1OTAwLCAiQ2lycnVzIExvZ2ljIENTNDI5NyIsCSZkZWZhdWx0X29wc30sCisJezB4NDM1MjU5MDMsICJDaXJydXMgTG9naWMgQ1M0Mjk3IiwJJmRlZmF1bHRfb3BzfSwKKwl7MHg0MzUyNTkxMywgIkNpcnJ1cyBMb2dpYyBDUzQyOTdBIHJldiBBIiwgJmRlZmF1bHRfb3BzfSwKKwl7MHg0MzUyNTkxNCwgIkNpcnJ1cyBMb2dpYyBDUzQyOTdBIHJldiBCIiwgJmRlZmF1bHRfb3BzfSwKKwl7MHg0MzUyNTkyMywgIkNpcnJ1cyBMb2dpYyBDUzQyOTgiLAkmbnVsbF9vcHN9LAorCXsweDQzNTI1OTJCLCAiQ2lycnVzIExvZ2ljIENTNDI5NCIsCSZudWxsX29wc30sCisJezB4NDM1MjU5MkQsICJDaXJydXMgTG9naWMgQ1M0Mjk0IiwJJm51bGxfb3BzfSwKKwl7MHg0MzUyNTkzMSwgIkNpcnJ1cyBMb2dpYyBDUzQyOTkgcmV2IEEiLCAmY3J5c3RhbF9kaWdpdGFsX29wc30sCisJezB4NDM1MjU5MzMsICJDaXJydXMgTG9naWMgQ1M0Mjk5IHJldiBDIiwgJmNyeXN0YWxfZGlnaXRhbF9vcHN9LAorCXsweDQzNTI1OTM0LCAiQ2lycnVzIExvZ2ljIENTNDI5OSByZXYgRCIsICZjcnlzdGFsX2RpZ2l0YWxfb3BzfSwKKwl7MHg0MzU4NTQ0MiwgIkNYVDY2IiwJCQkmZGVmYXVsdF9vcHMsCQlBQzk3X0RFTFVERURfTU9ERU0gfSwKKwl7MHg0NDU0MzAzMSwgIkRpYW1vbmQgVGVjaG5vbG9neSBEVDA4OTMiLCAmZGVmYXVsdF9vcHN9LAorCXsweDQ1ODM4MzA4LCAiRVNTIEFsbGVncm8gRVMxOTg4IiwJJm51bGxfb3BzfSwKKwl7MHg0OTQzNDUxMSwgIklDRTEyMzIiLAkJCSZudWxsX29wc30sIC8qIEkgaG9wZSAtLWprICovCisJezB4NGU1MzQzMzEsICJOYXRpb25hbCBTZW1pY29uZHVjdG9yIExNNDU0OSIsICZudWxsX29wc30sCisJezB4NTM0OTRjMjIsICJTaWxpY29uIExhYm9yYXRvcnkgU2kzMDM2IiwgJm51bGxfb3BzfSwKKwl7MHg1MzQ5NGMyMywgIlNpbGljb24gTGFib3JhdG9yeSBTaTMwMzgiLCAmbnVsbF9vcHN9LAorCXsweDU0NTIwMEZGLCAiVHJpVGVjaCBUUj8/Pz8/IiwJCSZ0cml0ZWNoX21fb3BzfSwKKwl7MHg1NDUyNDEwMiwgIlRyaVRlY2ggVFIyODAyMiIsCQkmbnVsbF9vcHN9LAorCXsweDU0NTI0MTAzLCAiVHJpVGVjaCBUUjI4MDIzIiwJCSZudWxsX29wc30sCisJezB4NTQ1MjQxMDYsICJUcmlUZWNoIFRSMjgwMjYiLAkJJm51bGxfb3BzfSwKKwl7MHg1NDUyNDEwOCwgIlRyaVRlY2ggVFIyODAyOCIsCQkmdHJpdGVjaF9vcHN9LAorCXsweDU0NTI0MTIzLCAiVHJpVGVjaCBUUiBBNSIsCQkmbnVsbF9vcHN9LAorCXsweDU3NEQ0QzAzLCAiV29sZnNvbiBXTTk3MDMvMDcvMDgvMTciLAkmd29sZnNvbl9vcHMwM30sCisJezB4NTc0RDRDMDQsICJXb2xmc29uIFdNOTcwNE0vV005NzA0USIsCSZ3b2xmc29uX29wczA0fSwKKwl7MHg1NzRENEMwNSwgIldvbGZzb24gV005NzA1L1dNOTcxMCIsICAgJndvbGZzb25fb3BzMDV9LAorCXsweDU3NEQ0QzA5LCAiV29sZnNvbiBXTTk3MDkiLAkJJm51bGxfb3BzfSwKKwl7MHg1NzRENEMxMiwgIldvbGZzb24gV005NzExLzk3MTIiLAkmd29sZnNvbl9vcHMxMX0sCisJezB4NTc0RDRDMTMsICJXb2xmc29uIFdNOTcxMyIsCSZ3b2xmc29uX29wczEzLCBBQzk3X0RFRkFVTFRfUE9XRVJfT0ZGfSwKKwl7MHg4Mzg0NzYwMCwgIlNpZ21hVGVsIFNUQUM/Pz8/IiwJJm51bGxfb3BzfSwKKwl7MHg4Mzg0NzYwNCwgIlNpZ21hVGVsIFNUQUM5NzAxLzMvNC81IiwgJm51bGxfb3BzfSwKKwl7MHg4Mzg0NzYwNSwgIlNpZ21hVGVsIFNUQUM5NzA0IiwJJm51bGxfb3BzfSwKKwl7MHg4Mzg0NzYwOCwgIlNpZ21hVGVsIFNUQUM5NzA4IiwJJnNpZ21hdGVsXzk3MDhfb3BzfSwKKwl7MHg4Mzg0NzYwOSwgIlNpZ21hVGVsIFNUQUM5NzIxLzIzIiwJJnNpZ21hdGVsXzk3MjFfb3BzfSwKKwl7MHg4Mzg0NzY0NCwgIlNpZ21hVGVsIFNUQUM5NzQ0LzQ1IiwJJnNpZ21hdGVsXzk3NDRfb3BzfSwKKwl7MHg4Mzg0NzY1MiwgIlNpZ21hVGVsIFNUQUM5NzUyLzUzIiwJJmRlZmF1bHRfb3BzfSwKKwl7MHg4Mzg0NzY1NiwgIlNpZ21hVGVsIFNUQUM5NzU2LzU3IiwJJnNpZ21hdGVsXzk3NDRfb3BzfSwKKwl7MHg4Mzg0NzY2NiwgIlNpZ21hVGVsIFNUQUM5NzUwVCIsCSZzaWdtYXRlbF85NzQ0X29wc30sCisJezB4ODM4NDc2ODQsICJTaWdtYVRlbCBTVEFDOTc4My84ND8iLAkmbnVsbF9vcHN9LAorCXsweDU3NDU0MzAxLCAiV2luYm9uZCA4Mzk3MUQiLAkJJm51bGxfb3BzfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICphYzk3X3N0ZXJlb19lbmhhbmNlbWVudHNbXSA9Cit7CisJLyogICAwICovICJObyAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorCS8qICAgMSAqLyAiQW5hbG9nIERldmljZXMgUGhhdCBTdGVyZW8iLAorCS8qICAgMiAqLyAiQ3JlYXRpdmUgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgIDMgKi8gIk5hdGlvbmFsIFNlbWkgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgIDQgKi8gIllBTUFIQSBZbWVyc2lvbiIsCisJLyogICA1ICovICJCQkUgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgIDYgKi8gIkNyeXN0YWwgU2VtaSAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorCS8qICAgNyAqLyAiUXNvdW5kIFFYcGFuZGVyIiwKKwkvKiAgIDggKi8gIlNwYXRpYWxpemVyIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisJLyogICA5ICovICJTUlMgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMTAgKi8gIlBsYXRmb3JtIFRlY2ggM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMTEgKi8gIkFLTSAzRCBBdWRpbyIsCisJLyogIDEyICovICJBdXJlYWwgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMTMgKi8gIkF6dGVjaCAzRCBFbmhhbmNlbWVudCIsCisJLyogIDE0ICovICJCaW5hdXJhIDNEIEF1ZGlvIEVuaGFuY2VtZW50IiwKKwkvKiAgMTUgKi8gIkVTUyBUZWNobm9sb2d5IFN0ZXJlbyBFbmhhbmNlbWVudCIsCisJLyogIDE2ICovICJIYXJtYW4gSW50ZXJuYXRpb25hbCBWTUF4IiwKKwkvKiAgMTcgKi8gIk52aWRlYSAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorCS8qICAxOCAqLyAiUGhpbGlwcyBJbmNyZWRpYmxlIFNvdW5kIiwKKwkvKiAgMTkgKi8gIlRleGFzIEluc3RydW1lbnRzIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisJLyogIDIwICovICJWTFNJIFRlY2hub2xvZ3kgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMjEgKi8gIlRyaVRlY2ggM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMjIgKi8gIlJlYWx0ZWsgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMjMgKi8gIlNhbXN1bmcgM0QgU3RlcmVvIEVuaGFuY2VtZW50IiwKKwkvKiAgMjQgKi8gIldvbGZzb24gTWljcm9lbGVjdHJvbmljcyAzRCBFbmhhbmNlbWVudCIsCisJLyogIDI1ICovICJEZWx0YSBJbnRlZ3JhdGlvbiAzRCBFbmhhbmNlbWVudCIsCisJLyogIDI2ICovICJTaWdtYVRlbCAzRCBFbmhhbmNlbWVudCIsCisJLyogIDI3ICovICJXaW5ib25kIDNEIFN0ZXJlbyBFbmhhbmNlbWVudCIsCisJLyogIDI4ICovICJSb2Nrd2VsbCAzRCBTdGVyZW8gRW5oYW5jZW1lbnQiLAorCS8qICAyOSAqLyAiUmVzZXJ2ZWQgMjkiLAorCS8qICAzMCAqLyAiUmVzZXJ2ZWQgMzAiLAorCS8qICAzMSAqLyAiUmVzZXJ2ZWQgMzEiCit9OworCisvKiB0aGlzIHRhYmxlIGhhcyBkZWZhdWx0IG1peGVyIHZhbHVlcyBmb3IgYWxsIE9TUyBtaXhlcnMuICovCitzdGF0aWMgc3RydWN0IG1peGVyX2RlZmF1bHRzIHsKKwlpbnQgbWl4ZXI7CisJdW5zaWduZWQgaW50IHZhbHVlOworfSBtaXhlcl9kZWZhdWx0c1tTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCS8qIGFsbCB2YWx1ZXMgMCAtPiAxMDAgaW4gYnl0ZXMgKi8KKwl7U09VTkRfTUlYRVJfVk9MVU1FLAkweDQzNDN9LAorCXtTT1VORF9NSVhFUl9CQVNTLAkweDQzNDN9LAorCXtTT1VORF9NSVhFUl9UUkVCTEUsCTB4NDM0M30sCisJe1NPVU5EX01JWEVSX1BDTSwJMHg0MzQzfSwKKwl7U09VTkRfTUlYRVJfU1BFQUtFUiwJMHg0MzQzfSwKKwl7U09VTkRfTUlYRVJfTElORSwJMHg0MzQzfSwKKwl7U09VTkRfTUlYRVJfTUlDLAkweDAwMDB9LAorCXtTT1VORF9NSVhFUl9DRCwJMHg0MzQzfSwKKwl7U09VTkRfTUlYRVJfQUxUUENNLAkweDQzNDN9LAorCXtTT1VORF9NSVhFUl9JR0FJTiwJMHg0MzQzfSwKKwl7U09VTkRfTUlYRVJfTElORTEsCTB4NDM0M30sCisJe1NPVU5EX01JWEVSX1BIT05FSU4sCTB4NDM0M30sCisJe1NPVU5EX01JWEVSX1BIT05FT1VULAkweDQzNDN9LAorCXtTT1VORF9NSVhFUl9WSURFTywJMHg0MzQzfSwKKwl7LTEsMH0KK307CisKKy8qIHRhYmxlIHRvIHNjYWxlIHNjYWxlIGZyb20gT1NTIG1peGVyIHZhbHVlIHRvIEFDOTcgbWl4ZXIgcmVnaXN0ZXIgdmFsdWUgKi8JCitzdGF0aWMgc3RydWN0IGFjOTdfbWl4ZXJfaHcgeworCXVuc2lnbmVkIGNoYXIgb2Zmc2V0OworCWludCBzY2FsZTsKK30gYWM5N19od1tTT1VORF9NSVhFUl9OUkRFVklDRVNdPSB7CisJW1NPVU5EX01JWEVSX1ZPTFVNRV0JPQl7QUM5N19NQVNURVJfVk9MX1NURVJFTyw2NH0sCisJW1NPVU5EX01JWEVSX0JBU1NdCT0Je0FDOTdfTUFTVEVSX1RPTkUsCTE2fSwKKwlbU09VTkRfTUlYRVJfVFJFQkxFXQk9CXtBQzk3X01BU1RFUl9UT05FLAkxNn0sCisJW1NPVU5EX01JWEVSX1BDTV0JPQl7QUM5N19QQ01PVVRfVk9MLAkzMn0sCisJW1NPVU5EX01JWEVSX1NQRUFLRVJdCT0Je0FDOTdfUENCRUVQX1ZPTCwJMTZ9LAorCVtTT1VORF9NSVhFUl9MSU5FXQk9CXtBQzk3X0xJTkVJTl9WT0wsCTMyfSwKKwlbU09VTkRfTUlYRVJfTUlDXQk9CXtBQzk3X01JQ19WT0wsCQkzMn0sCisJW1NPVU5EX01JWEVSX0NEXQk9CXtBQzk3X0NEX1ZPTCwJCTMyfSwKKwlbU09VTkRfTUlYRVJfQUxUUENNXQk9CXtBQzk3X0hFQURQSE9ORV9WT0wsCTY0fSwKKwlbU09VTkRfTUlYRVJfSUdBSU5dCT0Je0FDOTdfUkVDT1JEX0dBSU4sCTE2fSwKKwlbU09VTkRfTUlYRVJfTElORTFdCT0Je0FDOTdfQVVYX1ZPTCwJCTMyfSwKKwlbU09VTkRfTUlYRVJfUEhPTkVJTl0JPSAJe0FDOTdfUEhPTkVfVk9MLAkzMn0sCisJW1NPVU5EX01JWEVSX1BIT05FT1VUXQk9IAl7QUM5N19NQVNURVJfVk9MX01PTk8sCTY0fSwKKwlbU09VTkRfTUlYRVJfVklERU9dCT0Je0FDOTdfVklERU9fVk9MLAkzMn0sCit9OworCisvKiB0aGUgZm9sbG93aW5nIHRhYmxlcyBhbGxvdyB1cyB0byBnbyBmcm9tIE9TUyA8LT4gYWM5NyBxdWlja2x5LiAqLworZW51bSBhYzk3X3JlY3NldHRpbmdzIHsKKwlBQzk3X1JFQ19NSUM9MCwKKwlBQzk3X1JFQ19DRCwKKwlBQzk3X1JFQ19WSURFTywKKwlBQzk3X1JFQ19BVVgsCisJQUM5N19SRUNfTElORSwKKwlBQzk3X1JFQ19TVEVSRU8sIC8qIGNvbWJpbmF0aW9uIG9mIGFsbCBlbmFibGVkIG91dHB1dHMuLiAgKi8KKwlBQzk3X1JFQ19NT05PLAkgICAgICAvKi4uIG9yIHRoZSBtb25vIGVxdWl2YWxlbnQgKi8KKwlBQzk3X1JFQ19QSE9ORQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBhYzk3X3JtMm9zc1tdID0geworCVtBQzk3X1JFQ19NSUNdIAkgPSBTT1VORF9NSVhFUl9NSUMsCisJW0FDOTdfUkVDX0NEXSAJID0gU09VTkRfTUlYRVJfQ0QsCisJW0FDOTdfUkVDX1ZJREVPXSA9IFNPVU5EX01JWEVSX1ZJREVPLAorCVtBQzk3X1JFQ19BVVhdIAkgPSBTT1VORF9NSVhFUl9MSU5FMSwKKwlbQUM5N19SRUNfTElORV0gID0gU09VTkRfTUlYRVJfTElORSwKKwlbQUM5N19SRUNfU1RFUkVPXT0gU09VTkRfTUlYRVJfSUdBSU4sCisJW0FDOTdfUkVDX1BIT05FXSA9IFNPVU5EX01JWEVSX1BIT05FSU4KK307CisKKy8qIGluZGV4ZWQgYnkgYml0IHBvc2l0aW9uICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGFjOTdfb3NzX3JtW10gPSB7CisJW1NPVU5EX01JWEVSX01JQ10gCT0gQUM5N19SRUNfTUlDLAorCVtTT1VORF9NSVhFUl9DRF0gCT0gQUM5N19SRUNfQ0QsCisJW1NPVU5EX01JWEVSX1ZJREVPXSAJPSBBQzk3X1JFQ19WSURFTywKKwlbU09VTkRfTUlYRVJfTElORTFdIAk9IEFDOTdfUkVDX0FVWCwKKwlbU09VTkRfTUlYRVJfTElORV0gCT0gQUM5N19SRUNfTElORSwKKwlbU09VTkRfTUlYRVJfSUdBSU5dCT0gQUM5N19SRUNfU1RFUkVPLAorCVtTT1VORF9NSVhFUl9QSE9ORUlOXSAJPSBBQzk3X1JFQ19QSE9ORQorfTsKKworc3RhdGljIExJU1RfSEVBRChjb2RlY3MpOworc3RhdGljIExJU1RfSEVBRChjb2RlY19kcml2ZXJzKTsKK3N0YXRpYyBERUNMQVJFX01VVEVYKGNvZGVjX3NlbSk7CisKKy8qIHJlYWRzIHRoZSBnaXZlbiBPU1MgbWl4ZXIgZnJvbSB0aGUgYWM5NyB0aGUgY2FsbGVyIG11c3QgaGF2ZSBpbnN1cmVkIHRoYXQgdGhlIGFjOTcga25vd3MKKyAgIGFib3V0IHRoYXQgZ2l2ZW4gbWl4ZXIsIGFuZCBzaG91bGQgYmUgaG9sZGluZyBhIHNwaW5sb2NrIGZvciB0aGUgY2FyZCAqLworc3RhdGljIGludCBhYzk3X3JlYWRfbWl4ZXIoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCBpbnQgb3NzX2NoYW5uZWwpIAoreworCXUxNiB2YWw7CisJaW50IHJldCA9IDA7CisJaW50IHNjYWxlOworCXN0cnVjdCBhYzk3X21peGVyX2h3ICptaCA9ICZhYzk3X2h3W29zc19jaGFubmVsXTsKKworCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjICwgbWgtPm9mZnNldCk7CisKKwlpZiAodmFsICYgQUM5N19NVVRFKSB7CisJCXJldCA9IDA7CisJfSBlbHNlIGlmIChBQzk3X1NURVJFT19NQVNLICYgKDEgPDwgb3NzX2NoYW5uZWwpKSB7CisJCS8qIG5pY2Ugc3RlcmVvIG1peGVycyAuLiAqLworCQlpbnQgbGVmdCxyaWdodDsKKworCQlsZWZ0ID0gKHZhbCA+PiA4KSAgJiAweDdmOworCQlyaWdodCA9IHZhbCAgJiAweDdmOworCisJCWlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9JR0FJTikgeworCQkJcmlnaHQgPSAocmlnaHQgKiAxMDApIC8gbWgtPnNjYWxlOworCQkJbGVmdCA9IChsZWZ0ICogMTAwKSAvIG1oLT5zY2FsZTsKKwkJfSBlbHNlIHsKKwkJCS8qIHRoZXNlIG1heSBoYXZlIDUgb3IgNiBiaXQgcmVzb2x1dGlvbiAqLworCQkJaWYob3NzX2NoYW5uZWwgPT0gU09VTkRfTUlYRVJfVk9MVU1FIHx8IG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX0FMVFBDTSkKKwkJCQlzY2FsZSA9ICgxIDw8IGNvZGVjLT5iaXRfcmVzb2x1dGlvbik7CisJCQllbHNlCisJCQkJc2NhbGUgPSBtaC0+c2NhbGU7CisKKwkJCXJpZ2h0ID0gMTAwIC0gKChyaWdodCAqIDEwMCkgLyBzY2FsZSk7CisJCQlsZWZ0ID0gMTAwIC0gKChsZWZ0ICogMTAwKSAvIHNjYWxlKTsKKwkJfQorCQlyZXQgPSBsZWZ0IHwgKHJpZ2h0IDw8IDgpOworCX0gZWxzZSBpZiAob3NzX2NoYW5uZWwgPT0gU09VTkRfTUlYRVJfU1BFQUtFUikgeworCQlyZXQgPSAxMDAgLSAoKCgodmFsICYgMHgxZSk+PjEpICogMTAwKSAvIG1oLT5zY2FsZSk7CisJfSBlbHNlIGlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9QSE9ORUlOKSB7CisJCXJldCA9IDEwMCAtICgoKHZhbCAmIDB4MWYpICogMTAwKSAvIG1oLT5zY2FsZSk7CisJfSBlbHNlIGlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9QSE9ORU9VVCkgeworCQlzY2FsZSA9ICgxIDw8IGNvZGVjLT5iaXRfcmVzb2x1dGlvbik7CisJCXJldCA9IDEwMCAtICgoKHZhbCAmIDB4MWYpICogMTAwKSAvIHNjYWxlKTsKKwl9IGVsc2UgaWYgKG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX01JQykgeworCQlyZXQgPSAxMDAgLSAoKCh2YWwgJiAweDFmKSAqIDEwMCkgLyBtaC0+c2NhbGUpOworCQkvKiAgdGhlIGxvdyBiaXQgaXMgb3B0aW9uYWwgaW4gdGhlIHRvbmUgc2xpZGVycyBhbmQgbWFza2luZworCQkgICAgaXQgbGV0cyB1cyBhdm9pZCB0aGUgMHhmICdieXBhc3MnLi4gKi8KKwl9IGVsc2UgaWYgKG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX0JBU1MpIHsKKwkJcmV0ID0gMTAwIC0gKCgoKHZhbCA+PiA4KSAmIDB4ZSkgKiAxMDApIC8gbWgtPnNjYWxlKTsKKwl9IGVsc2UgaWYgKG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX1RSRUJMRSkgeworCQlyZXQgPSAxMDAgLSAoKCh2YWwgJiAweGUpICogMTAwKSAvIG1oLT5zY2FsZSk7CisJfQorCisjaWZkZWYgREVCVUcKKwlwcmludGsoImFjOTdfY29kZWM6IHJlYWQgT1NTIG1peGVyICUyZCAoJXMgYWM5NyByZWdpc3RlciAweCUwMngpLCAiCisJICAgICAgICIweCUwNHggLT4gMHglMDR4XG4iLAorCSAgICAgICBvc3NfY2hhbm5lbCwgY29kZWMtPmlkID8gIlNlY29uZGFyeSIgOiAiUHJpbWFyeSIsCisJICAgICAgIG1oLT5vZmZzZXQsIHZhbCwgcmV0KTsKKyNlbmRpZgorCisJcmV0dXJuIHJldDsKK30KKworLyogd3JpdGUgdGhlIE9TUyBlbmNvZGVkIHZvbHVtZSB0byB0aGUgZ2l2ZW4gT1NTIGVuY29kZWQgbWl4ZXIsIGFnYWluIGNhbGxlcidzIGpvYiB0bworICAgbWFrZSBzdXJlIGFsbCBpcyB3ZWxsIGluIGFyZyBsYW5kLCBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCAqLworc3RhdGljIHZvaWQgYWM5N193cml0ZV9taXhlcihzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCBvc3NfY2hhbm5lbCwKKwkJICAgICAgdW5zaWduZWQgaW50IGxlZnQsIHVuc2lnbmVkIGludCByaWdodCkKK3sKKwl1MTYgdmFsID0gMDsKKwlpbnQgc2NhbGU7CisJc3RydWN0IGFjOTdfbWl4ZXJfaHcgKm1oID0gJmFjOTdfaHdbb3NzX2NoYW5uZWxdOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImFjOTdfY29kZWM6IHdyb3RlIE9TUyBtaXhlciAlMmQgKCVzIGFjOTcgcmVnaXN0ZXIgMHglMDJ4KSwgIgorCSAgICAgICAibGVmdCB2b2w6JTJkLCByaWdodCB2b2w6JTJkOiIsCisJICAgICAgIG9zc19jaGFubmVsLCBjb2RlYy0+aWQgPyAiU2Vjb25kYXJ5IiA6ICJQcmltYXJ5IiwKKwkgICAgICAgbWgtPm9mZnNldCwgbGVmdCwgcmlnaHQpOworI2VuZGlmCisKKwlpZiAoQUM5N19TVEVSRU9fTUFTSyAmICgxIDw8IG9zc19jaGFubmVsKSkgeworCQkvKiBzdGVyZW8gbWl4ZXJzICovCisJCWlmIChsZWZ0ID09IDAgJiYgcmlnaHQgPT0gMCkgeworCQkJdmFsID0gQUM5N19NVVRFOworCQl9IGVsc2UgeworCQkJaWYgKG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX0lHQUlOKSB7CisJCQkJcmlnaHQgPSAocmlnaHQgKiBtaC0+c2NhbGUpIC8gMTAwOworCQkJCWxlZnQgPSAobGVmdCAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCQkJaWYgKHJpZ2h0ID49IG1oLT5zY2FsZSkKKwkJCQkJcmlnaHQgPSBtaC0+c2NhbGUtMTsKKwkJCQlpZiAobGVmdCA+PSBtaC0+c2NhbGUpCisJCQkJCWxlZnQgPSBtaC0+c2NhbGUtMTsKKwkJCX0gZWxzZSB7CisJCQkJLyogdGhlc2UgbWF5IGhhdmUgNSBvciA2IGJpdCByZXNvbHV0aW9uICovCisJCQkJaWYgKG9zc19jaGFubmVsID09IFNPVU5EX01JWEVSX1ZPTFVNRSB8fAorCQkJCSAgICBvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9BTFRQQ00pCisJCQkJCXNjYWxlID0gKDEgPDwgY29kZWMtPmJpdF9yZXNvbHV0aW9uKTsKKwkJCQllbHNlCisJCQkJCXNjYWxlID0gbWgtPnNjYWxlOworCisJCQkJcmlnaHQgPSAoKDEwMCAtIHJpZ2h0KSAqIHNjYWxlKSAvIDEwMDsKKwkJCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIHNjYWxlKSAvIDEwMDsKKwkJCQlpZiAocmlnaHQgPj0gc2NhbGUpCisJCQkJCXJpZ2h0ID0gc2NhbGUtMTsKKwkJCQlpZiAobGVmdCA+PSBzY2FsZSkKKwkJCQkJbGVmdCA9IHNjYWxlLTE7CisJCQl9CisJCQl2YWwgPSAobGVmdCA8PCA4KSB8IHJpZ2h0OworCQl9CisJfSBlbHNlIGlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9CQVNTKSB7CisJCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjICwgbWgtPm9mZnNldCkgJiB+MHgwZjAwOworCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCWlmIChsZWZ0ID49IG1oLT5zY2FsZSkKKwkJCWxlZnQgPSBtaC0+c2NhbGUtMTsKKwkJdmFsIHw9IChsZWZ0IDw8IDgpICYgMHgwZTAwOworCX0gZWxzZSBpZiAob3NzX2NoYW5uZWwgPT0gU09VTkRfTUlYRVJfVFJFQkxFKSB7CisJCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjICwgbWgtPm9mZnNldCkgJiB+MHgwMDBmOworCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCWlmIChsZWZ0ID49IG1oLT5zY2FsZSkKKwkJCWxlZnQgPSBtaC0+c2NhbGUtMTsKKwkJdmFsIHw9IGxlZnQgJiAweDAwMGU7CisJfSBlbHNlIGlmKGxlZnQgPT0gMCkgeworCQl2YWwgPSBBQzk3X01VVEU7CisJfSBlbHNlIGlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9TUEVBS0VSKSB7CisJCWxlZnQgPSAoKDEwMCAtIGxlZnQpICogbWgtPnNjYWxlKSAvIDEwMDsKKwkJaWYgKGxlZnQgPj0gbWgtPnNjYWxlKQorCQkJbGVmdCA9IG1oLT5zY2FsZS0xOworCQl2YWwgPSBsZWZ0IDw8IDE7CisJfSBlbHNlIGlmIChvc3NfY2hhbm5lbCA9PSBTT1VORF9NSVhFUl9QSE9ORUlOKSB7CisJCWxlZnQgPSAoKDEwMCAtIGxlZnQpICogbWgtPnNjYWxlKSAvIDEwMDsKKwkJaWYgKGxlZnQgPj0gbWgtPnNjYWxlKQorCQkJbGVmdCA9IG1oLT5zY2FsZS0xOworCQl2YWwgPSBsZWZ0OworCX0gZWxzZSBpZiAob3NzX2NoYW5uZWwgPT0gU09VTkRfTUlYRVJfUEhPTkVPVVQpIHsKKwkJc2NhbGUgPSAoMSA8PCBjb2RlYy0+Yml0X3Jlc29sdXRpb24pOworCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIHNjYWxlKSAvIDEwMDsKKwkJaWYgKGxlZnQgPj0gbWgtPnNjYWxlKQorCQkJbGVmdCA9IG1oLT5zY2FsZS0xOworCQl2YWwgPSBsZWZ0OworCX0gZWxzZSBpZiAob3NzX2NoYW5uZWwgPT0gU09VTkRfTUlYRVJfTUlDKSB7CisJCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjICwgbWgtPm9mZnNldCkgJiB+MHg4MDFmOworCQlsZWZ0ID0gKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCWlmIChsZWZ0ID49IG1oLT5zY2FsZSkKKwkJCWxlZnQgPSBtaC0+c2NhbGUtMTsKKwkJdmFsIHw9IGxlZnQ7CisJCS8qICB0aGUgbG93IGJpdCBpcyBvcHRpb25hbCBpbiB0aGUgdG9uZSBzbGlkZXJzIGFuZCBtYXNraW5nCisJCSAgICBpdCBsZXRzIHVzIGF2b2lkIHRoZSAweGYgJ2J5cGFzcycuLiAqLworCX0KKyNpZmRlZiBERUJVRworCXByaW50aygiIDB4JTA0eCIsIHZhbCk7CisjZW5kaWYKKworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgbWgtPm9mZnNldCwgdmFsKTsKKworI2lmZGVmIERFQlVHCisJdmFsID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIG1oLT5vZmZzZXQpOworCXByaW50aygiIC0+IDB4JTA0eFxuIiwgdmFsKTsKKyNlbmRpZgorfQorCisvKiBhIHRoaW4gd3JhcHBlciBmb3Igd3JpdGVfbWl4ZXIgKi8KK3N0YXRpYyB2b2lkIGFjOTdfc2V0X21peGVyKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IG9zc19taXhlciwgdW5zaWduZWQgaW50IHZhbCApIAoreworCXVuc2lnbmVkIGludCBsZWZ0LHJpZ2h0OworCisJLyogY2xlYW5zZSBpbnB1dCBhIGxpdHRsZSAqLworCXJpZ2h0ID0gKCh2YWwgPj4gOCkgICYgMHhmZikgOworCWxlZnQgPSAodmFsICAmIDB4ZmYpIDsKKworCWlmIChyaWdodCA+IDEwMCkgcmlnaHQgPSAxMDA7CisJaWYgKGxlZnQgPiAxMDApIGxlZnQgPSAxMDA7CisKKwljb2RlYy0+bWl4ZXJfc3RhdGVbb3NzX21peGVyXSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7CisJY29kZWMtPndyaXRlX21peGVyKGNvZGVjLCBvc3NfbWl4ZXIsIGxlZnQsIHJpZ2h0KTsKK30KKworLyogcmVhZCBvciB3cml0ZSB0aGUgcmVjbWFzaywgdGhlIGFjOTcgY2FuIHJlYWxseSBoYXZlIGxlZnQgYW5kIHJpZ2h0IHJlY29yZGluZworICAgaW5wdXRzIGluZGVwZW5kYW50bHkgc2V0LCBidXQgT1NTIGRvZXNuJ3Qgc2VlbSB0byB3YW50IHVzIHRvIGV4cHJlc3MgdGhhdCB0bworICAgdGhlIHVzZXIuIHRoZSBjYWxsZXIgZ3VhcmFudGVlcyB0aGF0IHdlIGhhdmUgYSBzdXBwb3J0ZWQgYml0IHNldCwgYW5kIHRoZXkKKyAgIG11c3QgYmUgaG9sZGluZyB0aGUgY2FyZCdzIHNwaW5sb2NrICovCitzdGF0aWMgaW50IGFjOTdfcmVjbWFza19pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCBydywgaW50IG1hc2spIAoreworCXVuc2lnbmVkIGludCB2YWw7CisKKwlpZiAocncpIHsKKwkJLyogcmVhZCBpdCBmcm9tIHRoZSBjYXJkICovCisJCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1JFQ09SRF9TRUxFQ1QpOworI2lmZGVmIERFQlVHCisJCXByaW50aygiYWM5N19jb2RlYzogYWM5NyByZWNtYXNrIHRvIHNldCB0byAweCUwNHhcbiIsIHZhbCk7CisjZW5kaWYKKwkJcmV0dXJuICgxIDw8IGFjOTdfcm0yb3NzW3ZhbCAmIDB4MDddKTsKKwl9CisKKwkvKiBlbHNlLCB3cml0ZSB0aGUgZmlyc3Qgc2V0IGluIHRoZSBtYXNrIGFzIHRoZQorCSAgIG91dHB1dCAqLwkKKwkvKiBjbGVhciBvdXQgY3VycmVudCBzZXQgdmFsdWUgZmlyc3QgKEFDOTcgc3VwcG9ydHMgb25seSAxIGlucHV0ISkgKi8KKwl2YWwgPSAoMSA8PCBhYzk3X3JtMm9zc1tjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19SRUNPUkRfU0VMRUNUKSAmIDB4MDddKTsKKwlpZiAobWFzayAhPSB2YWwpCisJICAgIG1hc2sgJj0gfnZhbDsKKyAgICAgICAKKwl2YWwgPSBmZnMobWFzayk7IAorCXZhbCA9IGFjOTdfb3NzX3JtW3ZhbC0xXTsKKwl2YWwgfD0gdmFsIDw8IDg7ICAvKiBzZXQgYm90aCBjaGFubmVscyAqLworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImFjOTdfY29kZWM6IHNldHRpbmcgYWM5NyByZWNtYXNrIHRvIDB4JTA0eFxuIiwgdmFsKTsKKyNlbmRpZgorCisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1JFQ09SRF9TRUxFQ1QsIHZhbCk7CisKKwlyZXR1cm4gMDsKK307CisKK3N0YXRpYyBpbnQgYWM5N19taXhlcl9pb2N0bChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBpLCB2YWwgPSAwOworCisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCW1peGVyX2luZm8gaW5mbzsKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQlzdHJsY3B5KGluZm8uaWQsIGNvZGVjLT5uYW1lLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgY29kZWMtPm5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaW5mby5tb2RpZnlfY291bnRlciA9IGNvZGVjLT5tb2RjbnQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9PTERfTUlYRVJfSU5GTykgeworCQlfb2xkX21peGVyX2luZm8gaW5mbzsKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQlzdHJsY3B5KGluZm8uaWQsIGNvZGVjLT5uYW1lLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgY29kZWMtPm5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKworCWlmIChfSU9DX1RZUEUoY21kKSAhPSAnTScgfHwgX1NJT0NfU0laRShjbWQpICE9IHNpemVvZihpbnQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjbWQgPT0gT1NTX0dFVFZFUlNJT04pCisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCAoaW50IF9fdXNlciAqKWFyZyk7CisKKwlpZiAoX1NJT0NfRElSKGNtZCkgPT0gX1NJT0NfUkVBRCkgeworCQlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzogLyogZ2l2ZSB0aGVtIHRoZSBjdXJyZW50IHJlY29yZCBzb3VyY2UgKi8KKwkJCWlmICghY29kZWMtPnJlY21hc2tfaW8pIHsKKwkJCQl2YWwgPSAwOworCQkJfSBlbHNlIHsKKwkJCQl2YWwgPSBjb2RlYy0+cmVjbWFza19pbyhjb2RlYywgMSwgMCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6IC8qIGdpdmUgdGhlbSB0aGUgc3VwcG9ydGVkIG1peGVycyAqLworCQkJdmFsID0gY29kZWMtPnN1cHBvcnRlZF9taXhlcnM7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJdmFsID0gY29kZWMtPnJlY29yZF9zb3VyY2VzOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOiAvKiBNaXhlciBjaGFubmVscyBzdXBwb3J0aW5nIHN0ZXJlbyAqLworCQkJdmFsID0gY29kZWMtPnN0ZXJlb19taXhlcnM7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQl2YWwgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6IC8qIHJlYWQgYSBzcGVjaWZpYyBtaXhlciAqLworCQkJaSA9IF9JT0NfTlIoY21kKTsKKworCQkJaWYgKCFzdXBwb3J0ZWRfbWl4ZXIoY29kZWMsIGkpKSAKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJLyogZG8gd2UgZXZlciB3YW50IHRvIHRvdWNoIHRoZSBoYXJkd2FyZT8gKi8KKwkJICAgICAgICAvKiB2YWwgPSBjb2RlYy0+cmVhZF9taXhlcihjb2RlYywgaSk7ICovCisJCQl2YWwgPSBjb2RlYy0+bWl4ZXJfc3RhdGVbaV07CisgCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOworCX0KKworCWlmIChfU0lPQ19ESVIoY21kKSA9PSAoX1NJT0NfV1JJVEV8X1NJT0NfUkVBRCkpIHsKKwkJY29kZWMtPm1vZGNudCsrOworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzogLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHJlY29yZGluZyBzb3VyY2UgKi8KKwkJCWlmICghY29kZWMtPnJlY21hc2tfaW8pIHJldHVybiAtRUlOVkFMOworCQkJaWYgKCF2YWwpIHJldHVybiAwOworCQkJaWYgKCEodmFsICY9IGNvZGVjLT5yZWNvcmRfc291cmNlcykpIHJldHVybiAtRUlOVkFMOworCisJCQljb2RlYy0+cmVjbWFza19pbyhjb2RlYywgMCwgdmFsKTsKKworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6IC8qIHdyaXRlIGEgc3BlY2lmaWMgbWl4ZXIgKi8KKwkJCWkgPSBfSU9DX05SKGNtZCk7CisKKwkJCWlmICghc3VwcG9ydGVkX21peGVyKGNvZGVjLCBpKSkgCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWFjOTdfc2V0X21peGVyKGNvZGVjLCBpLCB2YWwpOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogZW50cnkgcG9pbnQgZm9yIC9wcm9jL2RyaXZlci9jb250cm9sbGVyX3ZlbmRvci9hYzk3LyVkICovCitpbnQgYWM5N19yZWFkX3Byb2MgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgbGVuID0gMCwgY2FwLCBleHRpZCwgdmFsLCBpZDEsIGlkMjsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CisJaW50IGlzX2FjOTdfMjAgPSAwOworCisJaWYgKChjb2RlYyA9IGRhdGEpID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJaWQxID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfVkVORE9SX0lEMSk7CisJaWQyID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfVkVORE9SX0lEMik7CisJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCAiVmVuZG9yIG5hbWUgICAgICA6ICVzXG4iLCBjb2RlYy0+bmFtZSk7CisJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCAiVmVuZG9yIGlkICAgICAgICA6ICUwNFggJTA0WFxuIiwgaWQxLCBpZDIpOworCisJZXh0aWQgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCk7CisJZXh0aWQgJj0gfigoMTw8Mil8KDE8PDQpfCgxPDw1KXwoMTw8MTApfCgxPDwxMSl8KDE8PDEyKXwoMTw8MTMpKTsKKwlsZW4gKz0gc3ByaW50ZiAocGFnZStsZW4sICJBQzk3IFZlcnNpb24gICAgIDogJXNcbiIsCisJCQlleHRpZCA/ICIyLjAgb3IgbGF0ZXIiIDogIjEuMCIpOworCWlmIChleHRpZCkgaXNfYWM5N18yMCA9IDE7CisKKwljYXAgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19SRVNFVCk7CisJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCAiQ2FwYWJpbGl0aWVzICAgICA6JXMlcyVzJXMlcyVzXG4iLAorCQkJY2FwICYgMHgwMDAxID8gIiAtZGVkaWNhdGVkIE1JQyBQQ00gSU4gY2hhbm5lbC0iIDogIiIsCisJCQljYXAgJiAweDAwMDIgPyAiIC1yZXNlcnZlZDEtIiA6ICIiLAorCQkJY2FwICYgMHgwMDA0ID8gIiAtYmFzcyAmIHRyZWJsZS0iIDogIiIsCisJCQljYXAgJiAweDAwMDggPyAiIC1zaW11bGF0ZWQgc3RlcmVvLSIgOiAiIiwKKwkJCWNhcCAmIDB4MDAxMCA/ICIgLWhlYWRwaG9uZSBvdXQtIiA6ICIiLAorCQkJY2FwICYgMHgwMDIwID8gIiAtbG91ZG5lc3MtIiA6ICIiKTsKKwl2YWwgPSBjYXAgJiAweDAwYzA7CisJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCAiREFDIHJlc29sdXRpb25zICA6JXMlcyVzXG4iLAorCQkJIiAtMTYtYml0LSIsCisJCQl2YWwgJiAweDAwNDAgPyAiIC0xOC1iaXQtIiA6ICIiLAorCQkJdmFsICYgMHgwMDgwID8gIiAtMjAtYml0LSIgOiAiIik7CisJdmFsID0gY2FwICYgMHgwMzAwOworCWxlbiArPSBzcHJpbnRmIChwYWdlK2xlbiwgIkFEQyByZXNvbHV0aW9ucyAgOiVzJXMlc1xuIiwKKwkJCSIgLTE2LWJpdC0iLAorCQkJdmFsICYgMHgwMTAwID8gIiAtMTgtYml0LSIgOiAiIiwKKwkJCXZhbCAmIDB4MDIwMCA/ICIgLTIwLWJpdC0iIDogIiIpOworCWxlbiArPSBzcHJpbnRmIChwYWdlK2xlbiwgIjNEIGVuaGFuY2VtZW50ICAgOiAlc1xuIiwKKwkJCWFjOTdfc3RlcmVvX2VuaGFuY2VtZW50c1soY2FwID4+IDEwKSAmIDB4MWZdKTsKKworCXZhbCA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X0dFTkVSQUxfUFVSUE9TRSk7CisJbGVuICs9IHNwcmludGYgKHBhZ2UrbGVuLCAiUE9QIHBhdGggICAgICAgICA6ICVzIDNEXG4iCisJCQkiU2ltLiBzdGVyZW8gICAgICA6ICVzXG4iCisJCQkiM0QgZW5oYW5jZW1lbnQgICA6ICVzXG4iCisJCQkiTG91ZG5lc3MgICAgICAgICA6ICVzXG4iCisJCQkiTW9ubyBvdXRwdXQgICAgICA6ICVzXG4iCisJCQkiTUlDIHNlbGVjdCAgICAgICA6ICVzXG4iCisJCQkiQURDL0RBQyBsb29wYmFjayA6ICVzXG4iLAorCQkJdmFsICYgMHg4MDAwID8gInBvc3QiIDogInByZSIsCisJCQl2YWwgJiAweDQwMDAgPyAib24iIDogIm9mZiIsCisJCQl2YWwgJiAweDIwMDAgPyAib24iIDogIm9mZiIsCisJCQl2YWwgJiAweDEwMDAgPyAib24iIDogIm9mZiIsCisJCQl2YWwgJiAweDAyMDAgPyAiTUlDIiA6ICJNSVgiLAorCQkJdmFsICYgMHgwMTAwID8gIk1JQzIiIDogIk1JQzEiLAorCQkJdmFsICYgMHgwMDgwID8gIm9uIiA6ICJvZmYiKTsKKworCWV4dGlkID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfRVhURU5ERURfSUQpOworCWNhcCA9IGV4dGlkOworCWxlbiArPSBzcHJpbnRmIChwYWdlK2xlbiwgIkV4dCBDYXBhYmlsaXRpZXMgOiVzJXMlcyVzJXMlcyVzXG4iLAorCQkJY2FwICYgMHgwMDAxID8gIiAtdmFyIHJhdGUgUENNIGF1ZGlvLSIgOiAiIiwKKwkJCWNhcCAmIDB4MDAwMiA/ICIgLTJ4IFBDTSBhdWRpbyBvdXQtIiA6ICIiLAorCQkJY2FwICYgMHgwMDA4ID8gIiAtdmFyIHJhdGUgTUlDIGluLSIgOiAiIiwKKwkJCWNhcCAmIDB4MDA0MCA/ICIgLVBDTSBjZW50ZXIgREFDLSIgOiAiIiwKKwkJCWNhcCAmIDB4MDA4MCA/ICIgLVBDTSBzdXJyb3VuZCBEQUMtIiA6ICIiLAorCQkJY2FwICYgMHgwMTAwID8gIiAtUENNIExGRSBEQUMtIiA6ICIiLAorCQkJY2FwICYgMHgwMjAwID8gIiAtc2xvdC9EQUMgbWFwcGluZ3MtIiA6ICIiKTsKKwlpZiAoaXNfYWM5N18yMCkgeworCQlsZW4gKz0gc3ByaW50ZiAocGFnZStsZW4sICJGcm9udCBEQUMgcmF0ZSAgIDogJWRcbiIsCisJCQkJY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKSk7CisJfQorCisJcmV0dXJuIGxlbjsKK30KKworLyoqCisgKgljb2RlY19pZAktICBUdXJuIGlkMS9pZDIgaW50byBhIFBuUCBzdHJpbmcKKyAqCUBpZDE6IFZlbmRvciBJRDEKKyAqCUBpZDI6IFZlbmRvciBJRDIKKyAqCUBidWY6IENPREVDX0lEX0JVRlNaIGJ5dGUgYnVmZmVyCisgKgorICoJRmlsbHMgYnVmIHdpdGggYSB6ZXJvIHRlcm1pbmF0ZWQgUG5QIGlkZW50IHN0cmluZyBmb3IgdGhlIGlkMS9pZDIKKyAqCXBhaXIuIEZvciBjb252ZW5pZW5jZSB0aGUgcmV0dXJuIGlzIHRoZSBwYXNzZWQgaW4gYnVmZmVyIHBvaW50ZXIuCisgKi8KKyAKK3N0YXRpYyBjaGFyICpjb2RlY19pZCh1MTYgaWQxLCB1MTYgaWQyLCBjaGFyICpidWYpCit7CisJaWYoaWQxJjB4ODA4MCkgeworCQlzbnByaW50ZihidWYsIENPREVDX0lEX0JVRlNaLCAiMHglMDR4OjB4JTA0eCIsIGlkMSwgaWQyKTsKKwl9IGVsc2UgeworCQlidWZbMF0gPSAoaWQxID4+IDgpOworCQlidWZbMV0gPSAoaWQxICYgMHhGRik7CisJCWJ1ZlsyXSA9IChpZDIgPj4gOCk7CisJCXNucHJpbnRmKGJ1ZiszLCBDT0RFQ19JRF9CVUZTWiAtIDMsICIlZCIsIGlkMiYweEZGKTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKyAKKy8qKgorICoJYWM5N19jaGVja19tb2RlbSAtIENoZWNrIGlmIHRoZSBDb2RlYyBpcyBhIG1vZGVtCisgKglAY29kZWM6IGNvZGVjIHRvIGNoZWNrCisgKgorICoJUmV0dXJuIHRydWUgaWYgdGhlIGRldmljZSBpcyBhbiBBQzk3IDEuMCBvciBBQzk3IDIuMCBtb2RlbQorICovCisgCitzdGF0aWMgaW50IGFjOTdfY2hlY2tfbW9kZW0oc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCS8qIENoZWNrIGZvciBhbiBBQzk3IDEuMCBzb2Z0IG1vZGVtIChJRDEpICovCisJaWYoY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfUkVTRVQpICYgMikKKwkJcmV0dXJuIDE7CisJLyogQ2hlY2sgZm9yIGFuIEFDOTcgMi54IHNvZnQgbW9kZW0gKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfTU9ERU1fSUQsIDBMKTsKKwlpZihjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9NT0RFTV9JRCkgJiAxKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworCisvKioKKyAqCWFjOTdfYWxsb2NfY29kZWMgLSBBbGxvY2F0ZSBhbiBBQzk3IGNvZGVjCisgKgorICoJUmV0dXJucyBhIG5ldyBBQzk3IGNvZGVjIHN0cnVjdHVyZS4gQUM5NyBjb2RlY3MgbWF5IGJlY29tZQorICoJcmVmY291bnRlZCBzb29uIHNvIHRoaXMgaW50ZXJmYWNlIGlzIG5lZWRlZC4gUmV0dXJucyB3aXRoCisgKglvbmUgcmVmZXJlbmNlIHRha2VuLgorICovCisgCitzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19hbGxvY19jb2RlYyh2b2lkKQoreworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhYzk3X2NvZGVjKSwgR0ZQX0tFUk5FTCk7CisJaWYoIWNvZGVjKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbXNldChjb2RlYywgMCwgc2l6ZW9mKCpjb2RlYykpOworCXNwaW5fbG9ja19pbml0KCZjb2RlYy0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmNvZGVjLT5saXN0KTsKKwlyZXR1cm4gY29kZWM7Cit9CisKK0VYUE9SVF9TWU1CT0woYWM5N19hbGxvY19jb2RlYyk7CisKKy8qKgorICoJYWM5N19yZWxlYXNlX2NvZGVjIC0JUmVsZWFzZSBhbiBBQzk3IGNvZGVjCisgKglAY29kZWM6IGNvZGVjIHRvIHJlbGVhc2UKKyAqCisgKglSZWxlYXNlIGFuIGFsbG9jYXRlZCBBQzk3IGNvZGVjLiBUaGlzIHdpbGwgYmUgcmVmY291bnRlZCBpbgorICoJdGltZSBidXQgZm9yIHRoZSBtb21lbnQgaXMgdHJpdmlhbC4gQ2FsbHMgdGhlIHVucmVnaXN0ZXIKKyAqCWhhbmRsZXIgaWYgdGhlIGNvZGVjIGlzIG5vdyBkZWZ1bmN0LgorICovCisgCit2b2lkIGFjOTdfcmVsZWFzZV9jb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJLyogUmVtb3ZlIGZyb20gdGhlIGxpc3QgZmlyc3QsIHdlIGRvbid0IHdhbnQgdG8gYmUKKwkgICAicmVkaXNjb3ZlcmVkIiAqLworCWRvd24oJmNvZGVjX3NlbSk7CisJbGlzdF9kZWwoJmNvZGVjLT5saXN0KTsKKwl1cCgmY29kZWNfc2VtKTsKKwkvKgorCSAqCVRoZSBkcml2ZXIgbmVlZHMgdG8gZGVhbCB3aXRoIGludGVybmFsCisJICoJbG9ja2luZyB0byBhdm9pZCBhY2NpZGVudHMgaGVyZS4gCisJICovCisJaWYoY29kZWMtPmRyaXZlcikKKwkJY29kZWMtPmRyaXZlci0+cmVtb3ZlKGNvZGVjLCBjb2RlYy0+ZHJpdmVyKTsKKwlrZnJlZShjb2RlYyk7Cit9CisKK0VYUE9SVF9TWU1CT0woYWM5N19yZWxlYXNlX2NvZGVjKTsKKworLyoqCisgKglhYzk3X3Byb2JlX2NvZGVjIC0gSW5pdGlhbGl6ZSBhbmQgc2V0dXAgQUM5Ny1jb21wYXRpYmxlIGNvZGVjCisgKglAY29kZWM6IChpbi9vdXQpIEtlcm5lbCBpbmZvIGZvciBhIHNpbmdsZSBBQzk3IGNvZGVjCisgKgorICoJUmVzZXQgdGhlIEFDOTcgY29kZWMsIHRoZW4gaW5pdGlhbGl6ZSB0aGUgbWl4ZXIgYW5kCisgKgl0aGUgcmVzdCBvZiB0aGUgQGNvZGVjIHN0cnVjdHVyZS4KKyAqCisgKglUaGUgY29kZWNfcmVhZCBhbmQgY29kZWNfd3JpdGUgZmllbGRzIG9mIEBjb2RlYyBhcmUKKyAqCXJlcXVpcmVkIHRvIGJlIHNldHVwIGFuZCB3b3JraW5nIHdoZW4gdGhpcyBmdW5jdGlvbgorICoJaXMgY2FsbGVkLiAgQWxsIG90aGVyIGZpZWxkcyBhcmUgc2V0IGJ5IHRoaXMgZnVuY3Rpb24uCisgKgorICoJY29kZWNfd2FpdCBmaWVsZCBvZiBAY29kZWMgY2FuIG9wdGlvbmFsbHkgYmUgcHJvdmlkZWQKKyAqCXdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgSWYgY29kZWNfd2FpdCBpcyBub3QgJU5VTEwsCisgKgl0aGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCBjb2RlY193YWl0IGFueSB0aW1lIGl0IGlzCisgKgluZWNlc3NhcnkgdG8gd2FpdCBmb3IgdGhlIGF1ZGlvIGNoaXAgdG8gcmVhY2ggdGhlCisgKgljb2RlYy1yZWFkeSBzdGF0ZS4gIElmIGNvZGVjX3dhaXQgaXMgJU5VTEwsIHRoZW4KKyAqCXRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGNhbGwgc2NoZWR1bGVfdGltZW91dC4KKyAqCUN1cnJlbnRseSBjb2RlY193YWl0IGlzIHVzZWQgdG8gd2FpdCBmb3IgQUM5NyBjb2RlYworICoJcmVzZXQgdG8gY29tcGxldGUuIAorICoKKyAqICAgICBTb21lIGNvZGVjcyB3aWxsIHBvd2VyIGRvd24gd2hlbiBhIHJlZ2lzdGVyIHJlc2V0IGlzCisgKiAgICAgcGVyZm9ybWVkLiBXZSBub3cgY2hlY2sgZm9yIHN1Y2ggY29kZWNzLgorICoKKyAqCVJldHVybnMgMSAodHJ1ZSkgb24gc3VjY2Vzcywgb3IgMCAoZmFsc2UpIG9uIGZhaWx1cmUuCisgKi8KKyAKK2ludCBhYzk3X3Byb2JlX2NvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwl1MTYgaWQxLCBpZDI7CisJdTE2IGF1ZGlvOworCWludCBpOworCWNoYXIgY2lkYnVmW0NPREVDX0lEX0JVRlNaXTsKKwl1MTYgZjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBhYzk3X2RyaXZlciAqZDsKKwkKKwkvKiB3YWl0IGZvciBjb2RlYy1yZWFkeSBzdGF0ZSAqLworCWlmIChjb2RlYy0+Y29kZWNfd2FpdCkKKwkJY29kZWMtPmNvZGVjX3dhaXQoY29kZWMpOworCWVsc2UKKwkJdWRlbGF5KDEwKTsKKworCS8qIHdpbGwgdGhlIGNvZGVjIHBvd2VyIGRvd24gaWYgcmVnaXN0ZXIgcmVzZXQgPyAqLworCWlkMSA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1ZFTkRPUl9JRDEpOworCWlkMiA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1ZFTkRPUl9JRDIpOworCWNvZGVjLT5uYW1lID0gTlVMTDsKKwljb2RlYy0+Y29kZWNfb3BzID0gJm51bGxfb3BzOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFjOTdfY29kZWNfaWRzKTsgaSsrKSB7CisJCWlmIChhYzk3X2NvZGVjX2lkc1tpXS5pZCA9PSAoKGlkMSA8PCAxNikgfCBpZDIpKSB7CisJCQljb2RlYy0+dHlwZSA9IGFjOTdfY29kZWNfaWRzW2ldLmlkOworCQkJY29kZWMtPm5hbWUgPSBhYzk3X2NvZGVjX2lkc1tpXS5uYW1lOworCQkJY29kZWMtPmNvZGVjX29wcyA9IGFjOTdfY29kZWNfaWRzW2ldLm9wczsKKwkJCWNvZGVjLT5mbGFncyA9IGFjOTdfY29kZWNfaWRzW2ldLmZsYWdzOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwljb2RlYy0+bW9kZWwgPSAoaWQxIDw8IDE2KSB8IGlkMjsKKwlpZiAoKGNvZGVjLT5mbGFncyAmIEFDOTdfREVGQVVMVF9QT1dFUl9PRkYpID09IDApIHsKKwkJLyogcmVzZXQgY29kZWMgYW5kIHdhaXQgZm9yIHRoZSByZWFkeSBiaXQgYmVmb3JlIHdlIGNvbnRpbnVlICovCisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19SRVNFVCwgMEwpOworCQlpZiAoY29kZWMtPmNvZGVjX3dhaXQpCisJCQljb2RlYy0+Y29kZWNfd2FpdChjb2RlYyk7CisJCWVsc2UKKwkJCXVkZWxheSgxMCk7CisJfQorCisJLyogcHJvYmluZyBBQzk3IGNvZGVjLCBBQzk3IDIuMCBzYXlzIHRoYXQgYml0IDE1IG9mIHJlZ2lzdGVyIDB4MDAgKHJlc2V0KSBzaG91bGQKKwkgKiBiZSByZWFkIHplcm8uCisJICoKKwkgKiBGSVhNRTogaXMgdGhlIGZvbGxvd2luZyBjb21tZW50IG91dGRhdGVkPyAgLWpnYXJ6aWsKKwkgKiBQcm9iaW5nIG9mIEFDOTcgaW4gdGhpcyB3YXkgaXMgbm90IHJlbGlhYmxlLCBpdCBpcyBub3QgZXZlbiBTQUZFICEhCisJICovCisJaWYgKChhdWRpbyA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1JFU0VUKSkgJiAweDgwMDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhYzk3X2NvZGVjOiAlcyBhYzk3IGNvZGVjIG5vdCBwcmVzZW50XG4iLAorCQkgICAgICAgKGNvZGVjLT5pZCAmIDB4MikgPyAoY29kZWMtPmlkJjEgPyAiNHRoIiA6ICJUZXJ0aWFyeSIpCisJCSAgICAgICA6IChjb2RlYy0+aWQmMSA/ICJTZWNvbmRhcnkiOiAgIlByaW1hcnkiKSk7CisJCXJldHVybiAwOworCX0KKwkKKwkvKiBwcm9iZSBmb3IgTW9kZW0gQ29kZWMgKi8KKwljb2RlYy0+bW9kZW0gPSBhYzk3X2NoZWNrX21vZGVtKGNvZGVjKTsKKworCS8qIGVuYWJsZSBTUERJRiAqLworCWYgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCWlmKChjb2RlYy0+Y29kZWNfb3BzID09ICZudWxsX29wcykgJiYgKGYgJiA0KSkKKwkJY29kZWMtPmNvZGVjX29wcyA9ICZkZWZhdWx0X2RpZ2l0YWxfb3BzOworCQorCS8qIEEgZGV2aWNlIHdoaWNoIHRoaW5rcyBpdHMgYSBtb2RlbSBidXQgaXNudCAqLworCWlmKGNvZGVjLT5mbGFncyAmIEFDOTdfREVMVURFRF9NT0RFTSkKKwkJY29kZWMtPm1vZGVtID0gMDsKKwkJCisJaWYgKGNvZGVjLT5uYW1lID09IE5VTEwpCisJCWNvZGVjLT5uYW1lID0gIlVua25vd24iOworCXByaW50ayhLRVJOX0lORk8gImFjOTdfY29kZWM6IEFDOTcgJXMgY29kZWMsIGlkOiAlcyAoJXMpXG4iLCAKKwkJY29kZWMtPm1vZGVtID8gIk1vZGVtIiA6IChhdWRpbyA/ICJBdWRpbyIgOiAiIiksCisJICAgICAgIGNvZGVjX2lkKGlkMSwgaWQyLCBjaWRidWYpLCBjb2RlYy0+bmFtZSk7CisKKwlpZighYWM5N19pbml0X21peGVyKGNvZGVjKSkKKwkJcmV0dXJuIDA7CisJCQorCS8qIAorCSAqCUF0dGFjaCBsYXN0IHNvIHRoZSBjYWxsZXIgY2FuIG92ZXJyaWRlIHRoZSBtaXhlcgorCSAqCWNhbGxiYWNrcy4KKwkgKi8KKwkgCisJZG93bigmY29kZWNfc2VtKTsKKwlsaXN0X2FkZCgmY29kZWMtPmxpc3QsICZjb2RlY3MpOworCisJbGlzdF9mb3JfZWFjaChsLCAmY29kZWNfZHJpdmVycykgeworCQlkID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWM5N19kcml2ZXIsIGxpc3QpOworCQlpZiAoKGNvZGVjLT5tb2RlbCBeIGQtPmNvZGVjX2lkKSAmIGQtPmNvZGVjX21hc2spCisJCQljb250aW51ZTsKKwkJaWYoZC0+cHJvYmUoY29kZWMsIGQpID09IDApCisJCXsKKwkJCWNvZGVjLT5kcml2ZXIgPSBkOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl1cCgmY29kZWNfc2VtKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhYzk3X2luaXRfbWl4ZXIoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCXUxNiBjYXA7CisJaW50IGk7CisKKwljYXAgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19SRVNFVCk7CisKKwkvKiBtaXhlciBtYXNrcyAqLworCWNvZGVjLT5zdXBwb3J0ZWRfbWl4ZXJzID0gQUM5N19TVVBQT1JURURfTUFTSzsKKwljb2RlYy0+c3RlcmVvX21peGVycyA9IEFDOTdfU1RFUkVPX01BU0s7CisJY29kZWMtPnJlY29yZF9zb3VyY2VzID0gQUM5N19SRUNPUkRfTUFTSzsKKwlpZiAoIShjYXAgJiAweDA0KSkKKwkJY29kZWMtPnN1cHBvcnRlZF9taXhlcnMgJj0gfihTT1VORF9NQVNLX0JBU1N8U09VTkRfTUFTS19UUkVCTEUpOworCWlmICghKGNhcCAmIDB4MTApKQorCQljb2RlYy0+c3VwcG9ydGVkX21peGVycyAmPSB+U09VTkRfTUFTS19BTFRQQ007CisKKworCS8qIGRldGVjdCBiaXQgcmVzb2x1dGlvbiAqLworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTywgMHgyMDIwKTsKKwlpZihjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTykgPT0gMHgyMDIwKQorCQljb2RlYy0+Yml0X3Jlc29sdXRpb24gPSA2OworCWVsc2UKKwkJY29kZWMtPmJpdF9yZXNvbHV0aW9uID0gNTsKKworCS8qIGdlbmVyaWMgT1NTIHRvIEFDOTcgd3JhcHBlciAqLworCWNvZGVjLT5yZWFkX21peGVyID0gYWM5N19yZWFkX21peGVyOworCWNvZGVjLT53cml0ZV9taXhlciA9IGFjOTdfd3JpdGVfbWl4ZXI7CisJY29kZWMtPnJlY21hc2tfaW8gPSBhYzk3X3JlY21hc2tfaW87CisJY29kZWMtPm1peGVyX2lvY3RsID0gYWM5N19taXhlcl9pb2N0bDsKKworCS8qIGluaXRpYWxpemUgbWl4ZXIgY2hhbm5lbCB2b2x1bWVzICovCisJZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7CisJCXN0cnVjdCBtaXhlcl9kZWZhdWx0cyAqbWQgPSAmbWl4ZXJfZGVmYXVsdHNbaV07CisJCWlmIChtZC0+bWl4ZXIgPT0gLTEpIAorCQkJYnJlYWs7CisJCWlmICghc3VwcG9ydGVkX21peGVyKGNvZGVjLCBtZC0+bWl4ZXIpKSAKKwkJCWNvbnRpbnVlOworCQlhYzk3X3NldF9taXhlcihjb2RlYywgbWQtPm1peGVyLCBtZC0+dmFsdWUpOworCX0KKworCS8qIGNvZGVjIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIGZvciA0LTYgY2hhbm5lbCBvdXRwdXQgb3Igc2Vjb25kYXJ5IGNvZGVjIHN0dWZmICovCisJaWYgKGNvZGVjLT5jb2RlY19vcHMtPmluaXQgIT0gTlVMTCkgeworCQljb2RlYy0+Y29kZWNfb3BzLT5pbml0KGNvZGVjKTsKKwl9CisKKwkvKgorCSAqCVZvbHVtZSBpcyBNVVRFIG9ubHkgb24gdGhpcyBkZXZpY2UuIFdlIGhhdmUgdG8gaW5pdGlhbGlzZQorCSAqCWl0IGJ1dCBpdHMgdXNlbGVzcyBiZXlvbmQgdGhhdC4KKwkgKi8KKwlpZihjb2RlYy0+ZmxhZ3MgJiBBQzk3X05PX1BDTV9WT0xVTUUpCisJeworCQljb2RlYy0+c3VwcG9ydGVkX21peGVycyAmPSB+U09VTkRfTUFTS19QQ007CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFDOTcgY29kZWMgZG9lcyBub3QgaGF2ZSBwcm9wZXIgdm9sdW1lIHN1cHBvcnQuXG4iKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNkZWZpbmUgQUM5N19TSUdNQVRFTF9BTkFMT0cgICAgMHg2YwkvKiBBbmFsb2cgU3BlY2lhbCAqLworI2RlZmluZSBBQzk3X1NJR01BVEVMX0RBQzJJTlZFUlQgMHg2ZQorI2RlZmluZSBBQzk3X1NJR01BVEVMX0JJQVMxICAgICAweDcwCisjZGVmaW5lIEFDOTdfU0lHTUFURUxfQklBUzIgICAgIDB4NzIKKyNkZWZpbmUgQUM5N19TSUdNQVRFTF9NVUxUSUNITiAgMHg3NAkvKiBNdWx0aS1DaGFubmVsIHByb2dyYW1taW5nICovCisjZGVmaW5lIEFDOTdfU0lHTUFURUxfQ0lDMSAgICAgIDB4NzYKKyNkZWZpbmUgQUM5N19TSUdNQVRFTF9DSUMyICAgICAgMHg3OAorCisKK3N0YXRpYyBpbnQgc2lnbWF0ZWxfOTcwOF9pbml0KHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpCit7CisJdTE2IGNvZGVjNzIsIGNvZGVjNmM7CisKKwljb2RlYzcyID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfU0lHTUFURUxfQklBUzIpICYgMHg4MDAwOworCWNvZGVjNmMgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19TSUdNQVRFTF9BTkFMT0cpOworCisJaWYgKChjb2RlYzcyPT0wKSAmJiAoY29kZWM2Yz09MCkpIHsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NJR01BVEVMX0NJQzEsIDB4YWJiYSk7CisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9DSUMyLCAweDEwMDApOworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU0lHTUFURUxfQklBUzEsIDB4YWJiYSk7CisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9CSUFTMiwgMHgwMDA3KTsKKwl9IGVsc2UgaWYgKChjb2RlYzcyPT0weDgwMDApICYmIChjb2RlYzZjPT0wKSkgeworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU0lHTUFURUxfQ0lDMSwgMHhhYmJhKTsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NJR01BVEVMX0NJQzIsIDB4MTAwMSk7CisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9EQUMySU5WRVJULCAweDAwMDgpOworCX0gZWxzZSBpZiAoKGNvZGVjNzI9PTB4ODAwMCkgJiYgKGNvZGVjNmM9PTB4MDA4MCkpIHsKKwkJLyogbm90aGluZyAqLworCX0KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU0lHTUFURUxfTVVMVElDSE4sIDB4MDAwMCk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBzaWdtYXRlbF85NzIxX2luaXQoc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYykKK3sKKwkvKiBPbmx5IHNldCB1cCBzZWNvbmRhcnkgY29kZWMgKi8KKwlpZiAoY29kZWMtPmlkID09IDApCisJCXJldHVybiAwOworCisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NVUlJPVU5EX01BU1RFUiwgMEwpOworCisJLyogaW5pdGlhbGl6ZSBTaWdtYVRlbCBTVEFDOTcyMS8yMyBhcyBzZWNvbmRhcnkgY29kZWMsIGRlY29kaW5nIEFDIGxpbmsKKwkgICBzbG9jIDMsNCA9IDB4MDEsIHNsb3QgNyw4ID0gMHgwMCwgKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU0lHTUFURUxfTVVMVElDSE4sIDB4MDApOworCisJLyogd2UgZG9uJ3QgaGF2ZSB0aGUgY3J5c3RhbCB3aGVuIHdlIGFyZSBvbiBhbiBBTVIgY2FyZCwgc28gdXNlCisJICAgQklUX0NMSyBhcyBvdXIgY2xvY2sgc291cmNlLiBXcml0ZSB0aGUgbWFnaWMgd29yZCBBQkJBIGFuZCByZWFkCisJICAgYmFjayB0byBlbmFibGUgcmVnaXN0ZXIgMHg3OCAqLworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9DSUMxLCAweGFiYmEpOworCWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1NJR01BVEVMX0NJQzEpOworCisJLyogc3luYyBhbGwgdGhlIGNsb2NrcyovCisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NJR01BVEVMX0NJQzIsIDB4MzgwMik7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHNpZ21hdGVsXzk3NDRfaW5pdChzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKQoreworCS8vIHBhdGNoIGZvciBTaWdtYVRlbAorCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9DSUMxLCAweGFiYmEpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9DSUMyLCAweDAwMDApOyAvLyBpcyB0aGlzIGNvcnJlY3Q/IC0tamsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU0lHTUFURUxfQklBUzEsIDB4YWJiYSk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1NJR01BVEVMX0JJQVMyLCAweDAwMDIpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TSUdNQVRFTF9NVUxUSUNITiwgMHgwMDAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjbWVkaWFfaW5pdChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJLyogSW5pdGlhbGlzZSB0aGUgQ01lZGlhIDk3MzkgKi8KKwkvKgorCQlXZSBjb3VsZCBzZXQgdmFyaW91cyBvcHRpb25zIGhlcmUKKwkJUmVnaXN0ZXIgMHgyMCBiaXQgMHgxMDAgc2V0cyBtaWMgYXMgY2VudGVyIGJhc3MKKwkJQWxzbyBkbyBtdWx0aV9jaGFubmVsX2N0cmwgJj1+MHgzMDAwIHw9MHgxMDAwCisJCQorCQlGb3Igbm93IHdlIHNldCB1cCB0aGUgR1BJTyBhbmQgUEMgYmVlcCAKKwkqLworCQorCXUxNiB2OworCQorCS8qIE1JQyAqLworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHg2NCwgMHgzMDAwKTsKKwl2ID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIDB4NjQpOworCXYgJj0gfjB4ODAwMDsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4NjQsIHYpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHg3MCwgMHgwMTAwKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4NzIsIDB4MDAyMCk7CisJcmV0dXJuIDA7Cit9CisJCisjZGVmaW5lIEFDOTdfV005N1hYX0ZNSVhFUl9WT0wgMHg3MgorI2RlZmluZSBBQzk3X1dNOTdYWF9STUlYRVJfVk9MIDB4NzQKKyNkZWZpbmUgQUM5N19XTTk3WFhfVEVTVCAweDVhCisjZGVmaW5lIEFDOTdfV005NzA0X1JQQ01fVk9MIDB4NzAKKyNkZWZpbmUgQUM5N19XTTk3MTFfT1VUM1ZPTCAweDE2CisKK3N0YXRpYyBpbnQgd29sZnNvbl9pbml0MDMoc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYykKK3sKKwkvKiB0aGlzIGlzIGtub3duIHRvIHdvcmsgZm9yIHRoZSBWaWV3U29uaWMgVmlld1BhZCAxMDAwICovCisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1dNOTdYWF9GTUlYRVJfVk9MLCAweDA4MDgpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19HRU5FUkFMX1BVUlBPU0UsIDB4ODAwMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd29sZnNvbl9pbml0MDQoc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYykKK3sKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfV005N1hYX0ZNSVhFUl9WT0wsIDB4MDgwOCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1dNOTdYWF9STUlYRVJfVk9MLCAweDA4MDgpOworCisJLy8gcGF0Y2ggZm9yIERWRCBub2lzZQorCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19XTTk3WFhfVEVTVCwgMHgwMjAwKTsKKworCS8vIGluaXQgdm9sIGFzIFBDTSB2b2wKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfV005NzA0X1JQQ01fVk9MLAorCQljb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19QQ01PVVRfVk9MKSk7CisKKwkvKiBzZXQgcmVhciBzdXJyb3VuZCB2b2x1bWUgKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU1VSUk9VTkRfTUFTVEVSLCAweDAwMDApOworCXJldHVybiAwOworfQorCisvKiBXTTk3MDUsIFdNOTcxMCAqLworc3RhdGljIGludCB3b2xmc29uX2luaXQwNShzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKQoreworCS8qIHNldCBmcm9udCBtaXhlciB2b2x1bWUgKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfV005N1hYX0ZNSVhFUl9WT0wsIDB4MDgwOCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdNOTcxMSwgV005NzEyICovCitzdGF0aWMgaW50IHdvbGZzb25faW5pdDExKHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpCit7CisJLyogc3RvcCBwb3AncyBkdXJpbmcgc3VzcGVuZC9yZXN1bWUgKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfV005N1hYX1RFU1QsCisJCWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1dNOTdYWF9URVNUKSAmIDB4ZmZiZik7CisKKwkvKiBzZXQgb3V0MyB2b2x1bWUgKi8KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfV005NzExX09VVDNWT0wsIDB4MDgwOCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdNOTcxMyAqLworc3RhdGljIGludCB3b2xmc29uX2luaXQxMyhzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKQoreworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19SRUNPUkRfR0FJTiwgMHgwMGEwKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgMHgwMDAwKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfTU9ERU1fSUQsIDB4REEwMCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X0VYVEVORF9NT0RFTV9TVEFULCAweDM4MTApOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19QSE9ORV9WT0wsIDB4MDgwOCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BDQkVFUF9WT0wsIDB4MDgwOCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0cml0ZWNoX2luaXQoc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYykKK3sKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MjYsIDB4MDMwMCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDI2LCAweDAwMDApOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TVVJST1VORF9NQVNURVIsIDB4MDAwMCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1JFU0VSVkVEXzNBLCAweDAwMDApOworCXJldHVybiAwOworfQorCisKKy8qIGNvcGllZCBmcm9tIGRyaXZlcnMvc291bmQvbWFlc3Ryby5jICovCitzdGF0aWMgaW50IHRyaXRlY2hfbWFlc3Ryb19pbml0KHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpCit7CisJLyogbm8gaWRlYSB3aGF0IHRoaXMgZG9lcyAqLworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgyQSwgMHgwMDAxKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MkMsIDB4MDAwMCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDJDLCAwWEZGRkYpOworCXJldHVybiAwOworfQorCisKKworLyogCisgKglQcmVzYXJpbzcwMCB3b3JrYXJvdW5kIAorICogCWZvciBKYWNrIFNlbnNlL1NQRElGIFJlZ2lzdGVyIG1pcy1zZXR0aW5nIGNhdXNpbmcKKyAqCW5vIGF1ZGlibGUgb3V0cHV0CisgKglieSBTYW50aWFnbyBOdWxsbyAwNC8wNS8yMDAyCisgKi8KKworI2RlZmluZSBBQzk3X0FEMTg4Nl9KQUNLX1NFTlNFIDB4NzIKKworc3RhdGljIGludCBhZDE4ODZfaW5pdChzdHJ1Y3QgYWM5N19jb2RlYyAqIGNvZGVjKQoreworCS8qIGZyb20gQUQxODg2IFNwZWNzICovCisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X0FEMTg4Nl9KQUNLX1NFTlNFLCAweDAwMTApOworCXJldHVybiAwOworfQorCisKKworCisvKgorICoJVGhpcyBpcyBiYXNpY2FsbHkgc3RhbmRhcmQgQUM5Ny4gSXQgc2hvdWxkIHdvcmsgYXMgYSBkZWZhdWx0IGZvcgorICoJYWxtb3N0IGFsbCBtb2Rlcm4gY29kZWNzLiBOb3RlIHRoYXQgc29tZSBjYXJkcyB3aXJlIEVBUEQgKmJhY2t3YXJkcyoKKyAqCVRoYXQgc2lkZSBvZiBpdCBpcyB1cCB0byB0aGUgY2FyZCBkcml2ZXIgbm90IHVzIHRvIGNvcGUgd2l0aC4KKyAqCisgKi8KKworc3RhdGljIGludCBlYXBkX2NvbnRyb2woc3RydWN0IGFjOTdfY29kZWMgKiBjb2RlYywgaW50IG9uKQoreworCWlmKG9uKQorCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwKKwkJCWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wpfDB4ODAwMCk7CisJZWxzZQorCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwKKwkJCWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wpJn4weDgwMDApOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbmVyaWNfZGlnaXRhbF9jb250cm9sKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50IHNsb3RzLCBpbnQgcmF0ZSwgaW50IG1vZGUpCit7CisJdTE2IHJlZzsKKwkKKwlyZWcgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19TUERJRl9DT05UUk9MKTsKKwkKKwlzd2l0Y2gocmF0ZSkKKwl7CisJCS8qIE9mZiBieSBkZWZhdWx0ICovCisJCWRlZmF1bHQ6CisJCWNhc2UgMDoKKwkJCXJlZyA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCAocmVnICYgfkFDOTdfRUFfU1BESUYpKTsKKwkJCWlmKHJhdGUgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiAtRUlOVkFMOworCQljYXNlIDE6CisJCQlyZWcgPSAocmVnICYgQUM5N19TQ19TUFNSX01BU0spIHwgQUM5N19TQ19TUFNSXzQ4SzsKKwkJCWJyZWFrOworCQljYXNlIDI6CisJCQlyZWcgPSAocmVnICYgQUM5N19TQ19TUFNSX01BU0spIHwgQUM5N19TQ19TUFNSXzQ0SzsKKwkJCWJyZWFrOworCQljYXNlIDM6CisJCQlyZWcgPSAocmVnICYgQUM5N19TQ19TUFNSX01BU0spIHwgQUM5N19TQ19TUFNSXzMySzsKKwkJCWJyZWFrOworCX0KKwkKKwlyZWcgJj0gfkFDOTdfU0NfQ0NfTUFTSzsKKwlyZWcgfD0gKG1vZGUgJiBBVURJT19DQ01BU0spIDw8IDY7CisJCisJaWYobW9kZSAmIEFVRElPX0RJR0lUQUwpCisJCXJlZyB8PSAyOworCWlmKG1vZGUgJiBBVURJT19QUk8pCisJCXJlZyB8PSAxOworCWlmKG1vZGUgJiBBVURJT19EUlMpCisJCXJlZyB8PSAweDQwMDA7CisKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfU1BESUZfQ09OVFJPTCwgcmVnKTsKKworCXJlZyA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJcmVnICY9IChBQzk3X0VBX1NMT1RfTUFTSyk7CisJcmVnIHw9IEFDOTdfRUFfVlJBIHwgQUM5N19FQV9TUERJRiB8IHNsb3RzOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIHJlZyk7CisJCisJcmVnID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwlpZighKHJlZyAmIDB4MDQwMCkpCisJeworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCByZWcgJiB+IEFDOTdfRUFfU1BESUYpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKglDcnlzdGFsIGRpZ2l0YWwgYXVkaW8gY29udHJvbCAoQ1M0Mjk5KQorICovCisgCitzdGF0aWMgaW50IGNyeXN0YWxfZGlnaXRhbF9jb250cm9sKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50IHNsb3RzLCBpbnQgcmF0ZSwgaW50IG1vZGUpCit7CisJdTE2IGN2OworCisJaWYobW9kZSAmIEFVRElPX0RJR0lUQUwpCisJCXJldHVybiAtRUlOVkFMOworCQkKKwlzd2l0Y2gocmF0ZSkKKwl7CisJCWNhc2UgMDogY3YgPSAweDA7IGJyZWFrOwkvKiBTUEVOIG9mZiAqLworCQljYXNlIDQ4MDAwOiBjdiA9IDB4ODAwNDsgYnJlYWs7CS8qIDQ4S0h6IGRpZ2l0YWwgKi8KKwkJY2FzZSA0NDEwMDogY3YgPSAweDgxMDQ7IGJyZWFrOwkvKiA0NC4xS0h6IGRpZ2l0YWwgKi8KKwkJY2FzZSAzMjc2ODogCQkJLyogMzJLaHogKi8KKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4NjgsIGN2KTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCUNNZWRpYSBkaWdpdGFsIGF1ZGlvIGNvbnRyb2wKKyAqCU5lZWRzIG1vcmUgd29yay4KKyAqLworIAorc3RhdGljIGludCBjbWVkaWFfZGlnaXRhbF9jb250cm9sKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50IHNsb3RzLCBpbnQgcmF0ZSwgaW50IG1vZGUpCit7CisJdTE2IGN2OworCisJaWYobW9kZSAmIEFVRElPX0RJR0lUQUwpCisJCXJldHVybiAtRUlOVkFMOworCQkKKwlzd2l0Y2gocmF0ZSkKKwl7CisJCWNhc2UgMDoJCWN2ID0gMHgwMDAxOyBicmVhazsJLyogU1BFTiBvZmYgKi8KKwkJY2FzZSA0ODAwMDoJY3YgPSAweDAwMDk7IGJyZWFrOwkvKiA0OEtIeiBkaWdpdGFsICovCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDJBLCAweDA1YzQpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHg2QywgY3YpOworCQorCS8qIFN3aXRjaCBvbiBtaXggdG8gc3Vycm91bmQgKi8KKwljdiA9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCAweDY0KTsKKwljdiAmPSB+MHgwMjAwOworCWlmKG1vZGUpCisJCWN2IHw9IDB4MDIwMDsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4NjQsIGN2KTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBjb3BpZWQgZnJvbSBkcml2ZXJzL3NvdW5kL21hZXN0cm8uYyAqLworI2lmIDAgIC8qIHRoZXJlIGhhcyBiZWVuIDEgcGVyc29uIG9uIHRoZSBwbGFuZXQgd2l0aCBhIHB0MTAxIHRoYXQgd2UKKyAgICAgICAga25vdyBvZi4gIElmIHRoZXkgY2FyZSwgdGhleSBjYW4gcHV0IHRoaXMgYmFjayBpbiA6KSAqLworc3RhdGljIGludCBwdDEwMV9pbml0KHN0cnVjdCBhYzk3X2NvZGVjICogY29kZWMpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiYWM5N19jb2RlYzogUFQxMDEgQ29kZWMgZGV0ZWN0ZWQsIGluaXRpYWxpemluZyBidXQgX25vdF8gaW5zdGFsbGluZyBtaXhlciBkZXZpY2UuXG4iKTsKKwkvKiB3aG8ga25vd3MuLiAqLworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgyQSwgMHgwMDAxKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MkMsIDB4MDAwMCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDJDLCAweEZGRkYpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgxMCwgMHg5RjFGKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MTIsIDB4MDgwOCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDE0LCAweDlGMUYpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgxNiwgMHg5RjFGKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MTgsIDB4MDQwNCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDFBLCAweDAwMDApOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgxQywgMHgwMDAwKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MDIsIDB4MDQwNCk7CisJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCAweDA0LCAweDA4MDgpOworCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgMHgwQywgMHg4MDFGKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIDB4MEUsIDB4ODAxRik7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKwkKKworRVhQT1JUX1NZTUJPTChhYzk3X3JlYWRfcHJvYyk7CitFWFBPUlRfU1lNQk9MKGFjOTdfcHJvYmVfY29kZWMpOworCisvKgorICoJQUM5NyBsaWJyYXJ5IHN1cHBvcnQgcm91dGluZXMKKyAqLwkKKyAKKy8qKgorICoJYWM5N19zZXRfZGFjX3JhdGUJLQlzZXQgY29kZWMgcmF0ZSBhZGFwdGlvbgorICoJQGNvZGVjOiBhYzk3IGNvZGUKKyAqCUByYXRlOiByYXRlIGluIGhlcnR6CisgKgorICoJU2V0IHRoZSBEQUMgcmF0ZS4gQXNzdW1lcyB0aGUgY29kZWMgc3VwcG9ydHMgVlJBLiBUaGUgY2FsbGVyIGlzCisgKglleHBlY3RlZCB0byBoYXZlIGNoZWNrZWQgdGhpcyBsaXR0bGUgZGV0YWlsLgorICovCisgCit1bnNpZ25lZCBpbnQgYWM5N19zZXRfZGFjX3JhdGUoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgbmV3X3JhdGUgPSByYXRlOworCXUzMiBkYWNwOworCXUzMiBtYXN0X3ZvbCwgcGhvbmVfdm9sLCBtb25vX3ZvbCwgcGNtX3ZvbDsKKwl1MzIgbXV0ZV92b2wgPSAweDgwMDA7CS8qIFRoZSBtdXRlIHZvbHVtZT8gKi8KKworCWlmKHJhdGUgIT0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKSkKKwl7CisJCS8qIE11dGUgc2V2ZXJhbCByZWdpc3RlcnMgKi8KKwkJbWFzdF92b2wgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTyk7CisJCW1vbm9fdm9sID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfTUFTVEVSX1ZPTF9NT05PKTsKKwkJcGhvbmVfdm9sID0gY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfSEVBRFBIT05FX1ZPTCk7CisJCXBjbV92b2wgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19QQ01PVVRfVk9MKTsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCBtdXRlX3ZvbCk7CisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19NQVNURVJfVk9MX01PTk8sIG11dGVfdm9sKTsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X0hFQURQSE9ORV9WT0wsIG11dGVfdm9sKTsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BDTU9VVF9WT0wsIG11dGVfdm9sKTsKKwkJCisJCS8qIFBvd2VyIGRvd24gdGhlIERBQyAqLworCQlkYWNwPWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wpOworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgZGFjcHwweDAyMDApOworCQkvKiBMb2FkIHRoZSByYXRlIGFuZCByZWFkIHRoZSBlZmZlY3RpdmUgcmF0ZSAqLworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFLCByYXRlKTsKKwkJbmV3X3JhdGU9Y29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKTsKKwkJLyogUG93ZXIgaXQgYmFjayB1cCAqLworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgZGFjcCk7CisKKwkJLyogUmVzdG9yZSB2b2x1bWVzICovCisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTywgbWFzdF92b2wpOworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfTUFTVEVSX1ZPTF9NT05PLCBtb25vX3ZvbCk7CisJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19IRUFEUEhPTkVfVk9MLCBwaG9uZV92b2wpOworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUENNT1VUX1ZPTCwgcGNtX3ZvbCk7CisJfQorCXJldHVybiBuZXdfcmF0ZTsKK30KKworRVhQT1JUX1NZTUJPTChhYzk3X3NldF9kYWNfcmF0ZSk7CisKKy8qKgorICoJYWM5N19zZXRfYWRjX3JhdGUJLQlzZXQgY29kZWMgcmF0ZSBhZGFwdGlvbgorICoJQGNvZGVjOiBhYzk3IGNvZGUKKyAqCUByYXRlOiByYXRlIGluIGhlcnR6CisgKgorICoJU2V0IHRoZSBBREMgcmF0ZS4gQXNzdW1lcyB0aGUgY29kZWMgc3VwcG9ydHMgVlJBLiBUaGUgY2FsbGVyIGlzCisgKglleHBlY3RlZCB0byBoYXZlIGNoZWNrZWQgdGhpcyBsaXR0bGUgZGV0YWlsLgorICovCisKK3Vuc2lnbmVkIGludCBhYzk3X3NldF9hZGNfcmF0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIGludCBuZXdfcmF0ZSA9IHJhdGU7CisJdTMyIGRhY3A7CisKKwlpZihyYXRlICE9IGNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BDTV9MUl9BRENfUkFURSkpCisJeworCQkvKiBQb3dlciBkb3duIHRoZSBBREMgKi8KKwkJZGFjcD1jb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsIGRhY3B8MHgwMTAwKTsKKwkJLyogTG9hZCB0aGUgcmF0ZSBhbmQgcmVhZCB0aGUgZWZmZWN0aXZlIHJhdGUgKi8KKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BDTV9MUl9BRENfUkFURSwgcmF0ZSk7CisJCW5ld19yYXRlPWNvZGVjLT5jb2RlY19yZWFkKGNvZGVjLCBBQzk3X1BDTV9MUl9BRENfUkFURSk7CisJCS8qIFBvd2VyIGl0IGJhY2sgdXAgKi8KKwkJY29kZWMtPmNvZGVjX3dyaXRlKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsIGRhY3ApOworCX0KKwlyZXR1cm4gbmV3X3JhdGU7Cit9CisKK0VYUE9SVF9TWU1CT0woYWM5N19zZXRfYWRjX3JhdGUpOworCitpbnQgYWM5N19zYXZlX3N0YXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gMDsJCit9CisKK0VYUE9SVF9TWU1CT0woYWM5N19zYXZlX3N0YXRlKTsKKworaW50IGFjOTdfcmVzdG9yZV9zdGF0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGxlZnQsIHJpZ2h0LCB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspIHsKKwkJaWYgKCFzdXBwb3J0ZWRfbWl4ZXIoY29kZWMsIGkpKSAKKwkJCWNvbnRpbnVlOworCisJCXZhbCA9IGNvZGVjLT5taXhlcl9zdGF0ZVtpXTsKKwkJcmlnaHQgPSB2YWwgPj4gODsKKwkJbGVmdCA9IHZhbCAgJiAweGZmOworCQljb2RlYy0+d3JpdGVfbWl4ZXIoY29kZWMsIGksIGxlZnQsIHJpZ2h0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK0VYUE9SVF9TWU1CT0woYWM5N19yZXN0b3JlX3N0YXRlKTsKKworLyoqCisgKglhYzk3X3JlZ2lzdGVyX2RyaXZlcgktCXJlZ2lzdGVyIGEgY29kZWMgaGVscGVyCisgKglAZHJpdmVyOiBEcml2ZXIgaGFuZGxlcgorICoKKyAqCVJlZ2lzdGVyIGEgaGFuZGxlciBmb3IgY29kZWNzIG1hdGNoaW5nIHRoZSBjb2RlYyBpZC4gVGhlIGhhbmRsZXIKKyAqCWF0dGFjaCBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGFsbCBwcmVzZW50IGNvZGVjcyBhbmQgd2lsbCBiZSAKKyAqCWNhbGxlZCB3aGVuIG5ldyBjb2RlY3MgYXJlIGRpc2NvdmVyZWQuCisgKi8KKyAKK2ludCBhYzk3X3JlZ2lzdGVyX2RyaXZlcihzdHJ1Y3QgYWM5N19kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsOworCXN0cnVjdCBhYzk3X2NvZGVjICpjOworCQorCWRvd24oJmNvZGVjX3NlbSk7CisJSU5JVF9MSVNUX0hFQUQoJmRyaXZlci0+bGlzdCk7CisJbGlzdF9hZGQoJmRyaXZlci0+bGlzdCwgJmNvZGVjX2RyaXZlcnMpOworCQorCWxpc3RfZm9yX2VhY2gobCwgJmNvZGVjcykKKwl7CisJCWMgPSBsaXN0X2VudHJ5KGwsIHN0cnVjdCBhYzk3X2NvZGVjLCBsaXN0KTsKKwkJaWYoYy0+ZHJpdmVyICE9IE5VTEwgfHwgKChjLT5tb2RlbCBeIGRyaXZlci0+Y29kZWNfaWQpICYgZHJpdmVyLT5jb2RlY19tYXNrKSkKKwkJCWNvbnRpbnVlOworCQlpZihkcml2ZXItPnByb2JlKGMsIGRyaXZlcikpCisJCQljb250aW51ZTsKKwkJYy0+ZHJpdmVyID0gZHJpdmVyOworCX0KKwl1cCgmY29kZWNfc2VtKTsKKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoYWM5N19yZWdpc3Rlcl9kcml2ZXIpOworCisvKioKKyAqCWFjOTdfdW5yZWdpc3Rlcl9kcml2ZXIJLQl1bnJlZ2lzdGVyIGEgY29kZWMgaGVscGVyCisgKglAZHJpdmVyOiBEcml2ZXIgaGFuZGxlcgorICoKKyAqCVVucmVnaXN0ZXIgYSBoYW5kbGVyIGZvciBjb2RlY3MgbWF0Y2hpbmcgdGhlIGNvZGVjIGlkLiBUaGUgaGFuZGxlcgorICoJcmVtb3ZlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgYWxsIG1hdGNoaW5nIGNvZGVjcy4KKyAqLworIAordm9pZCBhYzk3X3VucmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCBhYzk3X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IGFjOTdfY29kZWMgKmM7CisJCisJZG93bigmY29kZWNfc2VtKTsKKwlsaXN0X2RlbF9pbml0KCZkcml2ZXItPmxpc3QpOworCisJbGlzdF9mb3JfZWFjaChsLCAmY29kZWNzKQorCXsKKwkJYyA9IGxpc3RfZW50cnkobCwgc3RydWN0IGFjOTdfY29kZWMsIGxpc3QpOworCQlpZiAoYy0+ZHJpdmVyID09IGRyaXZlcikgeworCQkJZHJpdmVyLT5yZW1vdmUoYywgZHJpdmVyKTsKKwkJCWMtPmRyaXZlciA9IE5VTEw7CisJCX0KKwl9CisJCisJdXAoJmNvZGVjX3NlbSk7Cit9CisKK0VYUE9SVF9TWU1CT0xfR1BMKGFjOTdfdW5yZWdpc3Rlcl9kcml2ZXIpOworCitzdGF0aWMgaW50IHN3YXBfaGVhZHBob25lKGludCByZW1vdmVfbWFzdGVyKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmw7CisJc3RydWN0IGFjOTdfY29kZWMgKmM7CisJCisJaWYgKHJlbW92ZV9tYXN0ZXIpIHsKKwkJZG93bigmY29kZWNfc2VtKTsKKwkJbGlzdF9mb3JfZWFjaChsLCAmY29kZWNzKQorCQl7CisJCQljID0gbGlzdF9lbnRyeShsLCBzdHJ1Y3QgYWM5N19jb2RlYywgbGlzdCk7CisJCQlpZiAoc3VwcG9ydGVkX21peGVyKGMsIFNPVU5EX01JWEVSX1BIT05FT1VUKSkKKwkJCQljLT5zdXBwb3J0ZWRfbWl4ZXJzICY9IH5TT1VORF9NQVNLX1BIT05FT1VUOworCQl9CisJCXVwKCZjb2RlY19zZW0pOworCX0gZWxzZQorCQlhYzk3X2h3W1NPVU5EX01JWEVSX1BIT05FT1VUXS5vZmZzZXQgPSBBQzk3X01BU1RFUl9WT0xfU1RFUkVPOworCisJLyogU2NhbGUgdmFsdWVzIGFscmVhZHkgbWF0Y2ggKi8KKwlhYzk3X2h3W1NPVU5EX01JWEVSX1ZPTFVNRV0ub2Zmc2V0ID0gQUM5N19NQVNURVJfVk9MX01PTk87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXBwbHlfcXVpcmsoaW50IHF1aXJrKQoreworCXN3aXRjaCAocXVpcmspIHsKKwljYXNlIEFDOTdfVFVORV9OT05FOgorCQlyZXR1cm4gMDsKKwljYXNlIEFDOTdfVFVORV9IUF9PTkxZOgorCQlyZXR1cm4gc3dhcF9oZWFkcGhvbmUoMSk7CisJY2FzZSBBQzk3X1RVTkVfU1dBUF9IUDoKKwkJcmV0dXJuIHN3YXBfaGVhZHBob25lKDApOworCWNhc2UgQUM5N19UVU5FX1NXQVBfU1VSUk9VTkQ6CisJCXJldHVybiAtRU5PU1lTOyAvKiBub3QgeWV0IGltcGxlbWVudGVkICovCisJY2FzZSBBQzk3X1RVTkVfQURfU0hBUklORzoKKwkJcmV0dXJuIC1FTk9TWVM7IC8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwljYXNlIEFDOTdfVFVORV9BTENfSkFDSzoKKwkJcmV0dXJuIC1FTk9TWVM7IC8qIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qKgorICoJYWM5N190dW5lX2hhcmR3YXJlIC0gdHVuZSB1cCB0aGUgaGFyZHdhcmUKKyAqCUBwZGV2OiBwY2lfZGV2IHBvaW50ZXIKKyAqCUBxdWlyazogcXVpcmsgbGlzdAorICoJQG92ZXJyaWRlOiBleHBsaWNpdCBxdWlyayB2YWx1ZSAob3ZlcnJpZGVzIGlmIG5vdCBBQzk3X1RVTkVfREVGQVVMVCkKKyAqCisgKglEbyBzb21lIHdvcmthcm91bmQgZm9yIGVhY2ggcGNpIGRldmljZSwgc3VjaCBhcyByZW5hbWluZyBvZiB0aGUKKyAqCWhlYWRwaG9uZSAodHJ1ZSBsaW5lLW91dCkgY29udHJvbCBhcyAiTWFzdGVyIi4KKyAqCVRoZSBxdWlyay1saXN0IG11c3QgYmUgdGVybWluYXRlZCB3aXRoIGEgemVyby1maWxsZWQgZW50cnkuCisgKgorICoJUmV0dXJucyB6ZXJvIGlmIHN1Y2Nlc3NmdWwsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCisKK2ludCBhYzk3X3R1bmVfaGFyZHdhcmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBhYzk3X3F1aXJrICpxdWlyaywgaW50IG92ZXJyaWRlKQoreworCWludCByZXN1bHQ7CisKKwlpZiAoIXF1aXJrKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChvdmVycmlkZSAhPSBBQzk3X1RVTkVfREVGQVVMVCkgeworCQlyZXN1bHQgPSBhcHBseV9xdWlyayhvdmVycmlkZSk7CisJCWlmIChyZXN1bHQgPCAwKQorCQkJcHJpbnRrKEtFUk5fRVJSICJhcHBseWluZyBxdWlyayB0eXBlICVkIGZhaWxlZCAoJWQpXG4iLCBvdmVycmlkZSwgcmVzdWx0KTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlmb3IgKDsgcXVpcmstPnZlbmRvcjsgcXVpcmsrKykgeworCQlpZiAocXVpcmstPnZlbmRvciAhPSBwZGV2LT5zdWJzeXN0ZW1fdmVuZG9yKQorCQkJY29udGludWU7CisJCWlmICgoISBxdWlyay0+bWFzayAmJiBxdWlyay0+ZGV2aWNlID09IHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpIHx8CisJCSAgICBxdWlyay0+ZGV2aWNlID09IChxdWlyay0+bWFzayAmIHBkZXYtPnN1YnN5c3RlbV9kZXZpY2UpKSB7CisjaWZkZWYgREVCVUcKKwkJCXByaW50aygiYWM5NyBxdWlyayBmb3IgJXMgKCUwNHg6JTA0eClcbiIsIHF1aXJrLT5uYW1lLCBhYzk3LT5zdWJzeXN0ZW1fdmVuZG9yLCBwZGV2LT5zdWJzeXN0ZW1fZGV2aWNlKTsKKyNlbmRpZgorCQkJcmVzdWx0ID0gYXBwbHlfcXVpcmsocXVpcmstPnR5cGUpOworCQkJaWYgKHJlc3VsdCA8IDApCisJCQkJcHJpbnRrKEtFUk5fRVJSICJhcHBseWluZyBxdWlyayB0eXBlICVkIGZvciAlcyBmYWlsZWQgKCVkKVxuIiwgcXVpcmstPnR5cGUsIHF1aXJrLT5uYW1lLCByZXN1bHQpOworCQkJcmV0dXJuIHJlc3VsdDsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwoYWM5N190dW5lX2hhcmR3YXJlKTsKKworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FjOTdfcGx1Z2luX2FkMTk4MC5jIGIvc291bmQvb3NzL2FjOTdfcGx1Z2luX2FkMTk4MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0YTlhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYWM5N19wbHVnaW5fYWQxOTgwLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgICAgYWM5N19wbHVnaW5fYWQxOTgwLmMgIENvcHlyaWdodCAoQykgMjAwMyBSZWQgSGF0LCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIE9wZW4gU29mdHdhcmUgTGljZW5zZSB2ZXJzaW9uIDEuMQorICAgdGhhdCBjYW4gYmUgZm91bmQgYXQgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9vc2wtMS4xLnR4dCBhbmQgaXMgCisgICBpbmNsdWRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLiAKKyAgIAorICAgQWx0ZXJuYXRpdmVseSwgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBtYXkgYmUgdXNlZCB1bmRlciB0aGUKKyAgIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgKHRoZSAiR1BMIikgYXMgCisgICBkaXN0cmlidXRlZCBpbiB0aGUga2VybmVsIHNvdXJjZSBDT1BZSU5HIGZpbGUsIGluIHdoaWNoCisgICBjYXNlIHRoZSBwcm92aXNpb25zIG9mIHRoZSBHUEwgYXJlIGFwcGxpY2FibGUgaW5zdGVhZCBvZiB0aGUKKyAgIGFib3ZlLiAgSWYgeW91IHdpc2ggdG8gYWxsb3cgdGhlIHVzZSBvZiB5b3VyIHZlcnNpb24gb2YgdGhpcyBmaWxlCisgICBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR1BMIGFuZCBub3QgdG8gYWxsb3cgb3RoZXJzIHRvIHVzZQorICAgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciB0aGUgT1NMLCBpbmRpY2F0ZSB5b3VyIGRlY2lzaW9uCisgICBieSBkZWxldGluZyB0aGUgcHJvdmlzaW9ucyBhYm92ZSBhbmQgcmVwbGFjZSB0aGVtIHdpdGggdGhlIG5vdGljZQorICAgYW5kIG90aGVyIHByb3Zpc2lvbnMgcmVxdWlyZWQgYnkgdGhlIEdQTC4gIElmIHlvdSBkbyBub3QgZGVsZXRlCisgICB0aGUgcHJvdmlzaW9ucyBhYm92ZSwgYSByZWNpcGllbnQgbWF5IHVzZSB5b3VyIHZlcnNpb24gb2YgdGhpcworICAgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE9TTCBvciB0aGUgR1BMLgorICAgCisgICBBdXRob3JzOiAJQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKworICAgVGhpcyBpcyBhbiBleGFtcGxlIGNvZGVjIHBsdWdpbi4gVGhpcyBvbmUgc3dpdGNoZXMgdGhlIGNvbm5lY3Rpb25zCisgICBhcm91bmQgdG8gbWF0Y2ggdGhlIHNldHVwcyBzb21lIHZlbmRvcnMgdXNlIHdpdGggYXVkaW8gc3dpdGNoZWQgdG8KKyAgIG5vbiBzdGFuZGFyZCBmcm9udCBjb25uZWN0b3JzIG5vdCB0aGUgbm9ybWFsIHJlYXIgb25lcworCisgICBUaGlzIGNvZGUgcHJpbWFyaWx5IGV4aXN0cyB0byBkZW1vbnN0cmF0ZSBob3cgdG8gdXNlIHRoZSBjb2RlYworICAgaW50ZXJmYWNlCisKKyovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorCisvKioKKyAqCWFkMTk4MF9yZW1vdmUJCS0JY29kZWMgcmVtb3ZlIGNhbGxiYWNrCisgKglAY29kZWM6IFRoZSBjb2RlYyB0aGF0IGlzIGJlaW5nIHJlbW92ZWQKKyAqCisgKglUaGlzIGNhbGxiYWNrIG9jY3VycyB3aGVuIGFuIEFDOTcgY29kZWMgaXMgYmVpbmcgcmVtb3ZlZC4gQQorICoJY29kZWMgcmVtb3ZlIGNhbGwgd2lsbCBub3Qgb2NjdXIgZm9yIGEgY29kZWMgZHVyaW5nIHRoYXQgY29kZWMKKyAqCXByb2JlIGNhbGxiYWNrLgorICoKKyAqCU1vc3QgZHJpdmVycyB3aWxsIG5lZWQgdG8gbG9jayB0aGVpciByZW1vdmUgdmVyc3VzIHRoZWlyIAorICoJdXNlIG9mIHRoZSBjb2RlYyBhZnRlciB0aGUgcHJvYmUgZnVuY3Rpb24uCisgKi8KKyAKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZDE5ODBfcmVtb3ZlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgc3RydWN0IGFjOTdfZHJpdmVyICpkcml2ZXIpCit7CisJLyogTm90aGluZyB0byBkbyBpbiB0aGUgc2ltcGxlIGV4YW1wbGUgKi8KK30KKworCisvKioKKyAqCWFkMTk4MF9wcm9iZQkJLQljb2RlYyBmb3VuZCBjYWxsYmFjaworICoJQGNvZGVjOiBhYzk3IGNvZGVjIG1hdGNoaW5nIHRoZSBpZGVudHMKKyAqCUBkcml2ZXI6IGFjOTdfZHJpdmVyIGl0IG1hdGNoZWQKKyAqCisgKglUaGlzIGVudHJ5IHBvaW50IGlzIGNhbGxlZCB3aGVuIGEgY29kZWMgaXMgZm91bmQgd2hpY2ggbWF0Y2hlcworICoJdGhlIGRyaXZlci4gQXQgdGhlIHBvaW50IGl0IGlzIGNhbGxlZCB0aGUgY29kZWMgaXMgYmFzaWNhbGx5CisgKglvcGVyYXRpb25hbCwgbWl4ZXIgb3BlcmF0aW9ucyBoYXZlIGJlZW4gaW5pdGlhbGlzZWQgYW5kIGNhbgorICoJYmUgb3ZlcnJpZGVuLiBDYWxsZWQgaW4gcHJvY2VzcyBjb250ZXh0LiBUaGUgZmllbGQgZHJpdmVyX3ByaXZhdGUKKyAqCWlzIGF2YWlsYWJsZSBmb3IgdGhlIGRyaXZlciB0byB1c2UgdG8gc3RvcmUgc3R1ZmYuCisgKgorICoJVGhlIGNhbGxlciBjYW4gY2xhaW0gdGhlIGRldmljZSBieSByZXR1cm5pbmcgemVybywgb3IgcmV0dXJuCisgKglhIG5lZ2F0aXZlIGVycm9yIGNvZGUuIAorICovCisgCitzdGF0aWMgaW50IGFkMTk4MF9wcm9iZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHN0cnVjdCBhYzk3X2RyaXZlciAqZHJpdmVyKQoreworCXUxNiBjb250cm9sOworCisjZGVmaW5lIEFDOTdfQURfTUlTQwkweDc2CisKKwkvKiBTd2l0Y2ggdGhlIGlucHV0cy9vdXRwdXRzIG92ZXIgKGZyb20gRGVsbCBjb2RlKSAqLworCWNvbnRyb2wgPSBjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19BRF9NSVNDKTsKKwljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfQURfTUlTQywgY29udHJvbCB8IDB4NDQyMCk7CisJCisJLyogV2UgY291bGQgcmVmdXNlIHRoZSBkZXZpY2Ugc2luY2Ugd2UgZG9udCBuZWVkIHRvIGhhbmcgYXJvdW5kLAorCSAgIGJ1dCB3ZSB3aWxsIGNsYWltIGl0ICovCisJcmV0dXJuIDA7Cit9CisJCisgCitzdGF0aWMgc3RydWN0IGFjOTdfZHJpdmVyIGFkMTk4MF9kcml2ZXIgPSB7CisJLmNvZGVjX2lkCT0gMHg0MTQ0NTM3MCwKKwkuY29kZWNfbWFzawk9IDB4RkZGRkZGRkYsCisJLm5hbWUJCT0gIkFEMTk4MCBleGFtcGxlIiwKKwkucHJvYmUJCT0gYWQxOTgwX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQxOTgwX3JlbW92ZSksCit9OworCisvKioKKyAqCWFkMTk4MF9leGl0CQktCW1vZHVsZSBleGl0IHBhdGgKKyAqCisgKglPdXIgbW9kdWxlIGlzIGJlaW5nIHVubG9hZGVkLiBBdCB0aGlzIHBvaW50IHVucmVnaXN0ZXJfZHJpdmVyCisgKgl3aWxsIGNhbGwgYmFjayBvdXIgcmVtb3ZlIGhhbmRsZXIgZm9yIGFueSBleGlzdGluZyBjb2RlY3MuIFlvdQorICoJbWF5IG5vdCB1bnJlZ2lzdGVyX2RyaXZlciBmcm9tIGludGVycnVwdCBjb250ZXh0IG9yIGZyb20gYSAKKyAqCXByb2JlL3JlbW92ZSBjYWxsYmFjay4KKyAqLworCitzdGF0aWMgdm9pZCBhZDE5ODBfZXhpdCh2b2lkKQoreworCWFjOTdfdW5yZWdpc3Rlcl9kcml2ZXIoJmFkMTk4MF9kcml2ZXIpOworfQorCisvKioKKyAqCWFkMTk4MF9pbml0CQktCXNldCB1cCBhZDE5ODAgaGFuZGxlcnMKKyAqCisgKglBZnRlciB3ZSBjYWxsIHRoZSByZWdpc3RlciBmdW5jdGlvbiBpdCB3aWxsIGNhbGwgb3VyIHByb2JlCisgKglmdW5jdGlvbiBmb3IgZWFjaCBleGlzdGluZyBtYXRjaGluZyBkZXZpY2UgYmVmb3JlIHJldHVybmluZyB0byB1cy4KKyAqCUFueSBkZXZpY2VzIGFwcGVhcmluZyBhZnRlcndhcmRzIHdob3NlIGlkJ3MgbWF0Y2ggdGhlIGNvZGVjX2lkCisgKgl3aWxsIGFsc28gY2F1c2UgdGhlIHByb2JlIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZC4KKyAqCVlvdSBtYXkgbm90IHJlZ2lzdGVyX2RyaXZlciBmcm9tIGludGVycnVwdCBjb250ZXh0IG9yIGZyb20gYSAKKyAqCXByb2JlL3JlbW92ZSBjYWxsYmFjay4KKyAqLworIAorc3RhdGljIGludCBhZDE5ODBfaW5pdCh2b2lkKQoreworCXJldHVybiBhYzk3X3JlZ2lzdGVyX2RyaXZlcigmYWQxOTgwX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KGFkMTk4MF9pbml0KTsKK21vZHVsZV9leGl0KGFkMTk4MF9leGl0KTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hY2kuYyBiL3NvdW5kL29zcy9hY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTI4YzI4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2FjaS5jCkBAIC0wLDAgKzEsNzExIEBACisvKgorICogQXVkaW8gQ29tbWFuZCBJbnRlcmZhY2UgKEFDSSkgZHJpdmVyIChzb3VuZC9hY2kuYykKKyAqCisgKiBBQ0kgaXMgYSBwcm90b2NvbCB1c2VkIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIG1pY3JvY29udHJvbGxlciBvbgorICogc29tZSBzb3VuZCBjYXJkcyBwcm9kdWNlZCBieSBtaXJvLCBlLmcuIHRoZSBtaXJvU09VTkQgUENNMTIgYW5kCisgKiBQQ00yMC4gVGhlIEFDSSBoYXMgYmVlbiBkZXZlbG9wZWQgZm9yIG1pcm8gYnkgTm9yYmVydG8gUGVsbGljY2kKKyAqIDxwZWxsaWNjaUBob21lLmNvbT4uIFNwZWNpYWwgdGhhbmtzIHRvIGJvdGggaGltIGFuZCBtaXJvIGZvcgorICogcHJvdmlkaW5nIHRoZSBBQ0kgc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBUaGUgbWFpbiBmdW5jdGlvbiBvZiB0aGUgQUNJIGlzIHRvIGNvbnRyb2wgdGhlIG1peGVyIGFuZCB0byBnZXQgYQorICogcHJvZHVjdCBpZGVudGlmaWNhdGlvbi4gT24gdGhlIFBDTTIwLCBBQ0kgYWxzbyBjb250cm9scyB0aGUgcmFkaW8KKyAqIHR1bmVyIG9uIHRoaXMgY2FyZCwgdGhpcyBpcyBzdXBwb3J0ZWQgaW4gdGhlIFZpZGVvIGZvciBMaW51eCAKKyAqIG1pcm9wY20yMCBkcml2ZXIuCisgKiAtCisgKiBUaGlzIGlzIGEgZnVsbGZlYXR1cmVkIGltcGxlbWVudGF0aW9uLiBVbnN1cHBvcnRlZCBmZWF0dXJlcworICogYXJlIGJ1Z3MuLi4gKDoKKyAqCisgKiBJdCBpcyBub3QgbG9uZ2VyIG5lY2Vzc2FyeSB0byBsb2FkIHRoZSBtYWQxNiBtb2R1bGUgZmlyc3QuIFRoZQorICogdXNlciBpcyBjdXJyZW50bHkgcmVzcG9uc2libGUgdG8gc2V0IHRoZSBtYWQxNiBtaXhlciBjb3JyZWN0bHkuCisgKgorICogVG8gdG9nZ2xlIHRoZSBzb2xvIG1vZGUgZm9yIGZ1bGwgZHVwbGV4IG9wZXJhdGlvbiBqdXN0IHVzZSB0aGUgT1NTCisgKiByZWNvcmQgc3dpdGNoIGZvciB0aGUgcGNtICgnd2F2ZScpIGNvbnRyb2xsZXIuICAgICAgICAgICBSb2JlcnQKKyAqIC0KKyAqCisgKiBSZXZpc2lvbiBoaXN0b3J5OgorICoKKyAqICAgMTk5NS0xMS0xMCAgTWFya3VzIEt1aG4gPG1za3VobkBjaXAuaW5mb3JtYXRpay51bmktZXJsYW5nZW4uZGU+CisgKiAgICAgICAgRmlyc3QgdmVyc2lvbiB3cml0dGVuLgorICogICAxOTk1LTEyLTMxICBNYXJrdXMgS3VobgorICogICAgICAgIFNlY29uZCByZXZpc2lvbiwgZ2VuZXJhbCBjb2RlIGNsZWFudXAuCisgKiAgIDE5OTYtMDUtMTYJIEhhbm51IFNhdm9sYWluZW4KKyAqCSAgSW50ZWdyYXRlZCB3aXRoIG90aGVyIHBhcnRzIG9mIHRoZSBkcml2ZXIuCisgKiAgIDE5OTYtMDUtMjggIE1hcmt1cyBLdWhuCisgKiAgICAgICAgSW5pdGlhbGl6ZSBDUzQyMzFBIG1peGVyLCBtYWtlIEFDSSBmaXJzdCBtaXhlciwKKyAqICAgICAgICB1c2UgbmV3IHByaXZhdGUgbWl4ZXIgQVBJIGZvciBzb2xvIG1vZGUuCisgKiAgIDE5OTgtMDgtMTggIFJ1dXJkIFJlaXRzbWEgPFIuQS5SZWl0c21hQHdibXQudHVkZWxmdC5ubD4KKyAqCSAgU21hbGwgbW9kaWZpY2F0aW9uIHRvIGV4cG9ydCBBQ0kgZnVuY3Rpb25zIGFuZCAKKyAqCSAgY29tcGxldGUgbW9kdWxhcmlzYXRpb24uCisgKiAgIDIwMDAtMDYtMjAgIFJvYmVydCBTaWVtZXIgPFJvYmVydC5TaWVtZXJAZ214LmRlPgorICogICAgICAgIERvbid0IGluaXRpYWxpemUgdGhlIENTNDIzMUEgbWl4ZXIgYW55bW9yZSwgc28gdGhlIGNvZGUgaXMKKyAqICAgICAgICB3b3JraW5nIGFnYWluLCBhbmQgb3RoZXIgc21hbGwgY2hhbmdlcyB0byBmaXQgaW4gdG9kYXlzCisgKiAgICAgICAga2VybmVscy4KKyAqICAgMjAwMC0wOC0yNiAgUm9iZXJ0IFNpZW1lcgorICogICAgICAgIENsZWFuIHVwIGFuZCByZXdyaXRlIGZvciAyLjQueC4gTWF5YmUgaXQncyBTTVAgc2FmZSBub3cuLi4gKDoKKyAqICAgICAgICBpb2N0bCBidWdmaXgsIGFuZCBpbnRlZ3JhdGlvbiBvZiBzb2xvLW1vZGUgaW50byBPU1MtQVBJLAorICogICAgICAgIGFkZGVkIChPU1MtbGltaXRlZCkgZXF1YWxpemVyIHN1cHBvcnQsIHJldHVybiB2YWx1ZSBidWdmaXgsCisgKiAgICAgICAgY2hhbmdlZCBwYXJhbSBhY2lfcmVzZXQgdG8gcmVzZXQsIG5ldyBwYXJhbXM6IGlkZSwgd3NzLgorICogICAyMDAxLTA0LTIwICBSb2JlcnQgU2llbWVyCisgKiAgICAgICAgZXZlbiBtb3JlIGNsZWFudXBzLi4uCisgKiAgIDIwMDEtMTAtMDggIEFybmFsZG8gQ2FydmFsaG8gZGUgTWVsbyA8YWNtZUBjb25lY3RpdmEuY29tLmJyPgorICogICAJICBHZXQgcmlkIG9mIGNoZWNrX3JlZ2lvbiwgLmJzcyBvcHRpbWl6YXRpb25zLCB1c2Ugc2V0X2N1cnJlbnRfc3RhdGUKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPiAKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCitpbnQgYWNpX3BvcnQ7CS8qIGFzIGRldGVybWluZWQgYnkgYml0IDQgaW4gdGhlIE9QVGkgOTI5IE1DNCByZWdpc3RlciAqLworc3RhdGljIGludCBhY2lfaWRjb2RlWzJdOwkvKiBtYW51ZmFjdHVyZXIgYW5kIHByb2R1Y3QgSUQgKi8KK2ludCBhY2lfdmVyc2lvbjsJLyogQUNJIGZpcm13YXJlIHZlcnNpb24JKi8KKworRVhQT1JUX1NZTUJPTChhY2lfcG9ydCk7CitFWFBPUlRfU1lNQk9MKGFjaV92ZXJzaW9uKTsKKworI2luY2x1ZGUgImFjaS5oIgorCisKK3N0YXRpYyBpbnQgYWNpX3NvbG87CS8qIHN0YXR1cyBiaXQgb2YgdGhlIGNhcmQgdGhhdCBjYW4ndCBiZQkJKgorCQkJICogY2hlY2tlZCB3aXRoIEFDSSB2ZXJzaW9ucyBwcmlvciB0byAweGIwCSovCitzdGF0aWMgaW50IGFjaV9hbXA7ICAgLyogc3RhdHVzIGJpdCBmb3IgcG93ZXItYW1wL2xpbmUtb3V0IGxldmVsCisJCQkgICBidXQgSSBoYXZlIG5vIGRvY3MgYWJvdXQgd2hhdCBpcyB3aGF0Li4uICovCitzdGF0aWMgaW50IGFjaV9taWNwcmVhbXA9MzsgLyogbWljcm9waG9uZSBwcmVhbXAtbGV2ZWwgdGhhdCBjYW4ndCBiZSAgICAqCisJCQkgKiBjaGVja2VkIHdpdGggQUNJIHZlcnNpb25zIHByaW9yIHRvIDB4YjAJKi8KKworc3RhdGljIGludCBtaXhlcl9kZXZpY2U7CitzdGF0aWMgc3RydWN0IHNlbWFwaG9yZSBhY2lfc2VtOworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgaW50IHJlc2V0OworbW9kdWxlX3BhcmFtKHJlc2V0LCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocmVzZXQsIldoZW4gc2V0IHRvIDEsIHJlc2V0IGFjaSBtaXhlci4iKTsKKyNlbHNlCitzdGF0aWMgaW50IHJlc2V0ID0gMTsKKyNlbmRpZgorCitzdGF0aWMgaW50IGlkZT0tMTsKK21vZHVsZV9wYXJhbShpZGUsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlkZSwiMSBlbmFibGUsIDAgZGlzYWJsZSBpZGUtcG9ydCAtIHVudGVzdGVkIgorCQkgIiBkZWZhdWx0OiBkbyBub3RoaW5nIik7CitzdGF0aWMgaW50IHdzcz0tMTsKK21vZHVsZV9wYXJhbSh3c3MsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHdzcywiY2hhbmdlIGJldHdlZW4gQUNJL1dTUy1taXhlcjsgdXNlIDAgYW5kIDEgLSB1bnRlc3RlZCIKKwkJICIgZGVmYXVsdDogZG8gbm90aGluZzsgZm9yIFBDTTEtcHJvIG9ubHkiKTsKKworI2lmZGVmIERFQlVHCitzdGF0aWMgdm9pZCBwcmludF9iaXRzKHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpbnQgajsKKwlwcmludGsoS0VSTl9ERUJVRyAiYWNpOiAiKTsKKworCWZvciAoaj03OyBqPj0wOyBqLS0pIHsKKwkJcHJpbnRrKCIlZCIsIChjID4+IGopICYgMHgxKTsKKwl9CisKKwlwcmludGsoIlxuIik7Cit9CisjZW5kaWYKKworLyoKKyAqIFRoaXMgYnVzeSB3YWl0IGNvZGUgbm9ybWFsbHkgcmVxdWlyZXMgbGVzcyB0aGFuIDE1IGxvb3BzIGFuZAorICogcHJhY3RpY2FsbHkgYWx3YXlzIGxlc3MgdGhhbiAxMDAgbG9vcHMgb24gbXkgaTQ4Ni9EWDIgNjYgTUh6LgorICoKKyAqIFdhcm5pbmc6IFdhaXRpbmcgb24gdGhlIGdlbmVyYWwgc3RhdHVzIGZsYWcgYWZ0ZXIgcmVzZXRpbmcgdGhlIE1VVEUKKyAqIGZ1bmN0aW9uIGNhbiB0YWtlIGEgVkVSWSBsb25nIHRpbWUsIGJlY2F1c2UgdGhlIFBDTTEyIGRvZXMgc29tZSBraW5kCisgKiBvZiBmYWRlLWluIGVmZmVjdC4gRm9yIHRoaXMgcmVhc29uLCBhY2Nlc3MgdG8gdGhlIE1VVEUgZnVuY3Rpb24gaGFzCisgKiBub3QgYmVlbiBpbXBsZW1lbnRlZCBhdCBhbGwuCisgKgorICogLSBUaGUgT1NTIGludGVyZmFjZSBoYXMgbm8gbXV0ZSBvcHRpb24uIEl0IHRha2VzIGFib3V0IDMgc2Vjb25kcyB0bworICogZmFkZS1pbiBvbiBteSBQQ00yMC4gYnVzeV93YWl0KCkgaGFuZGxlcyBpdCBncmVhdCBub3cuLi4gICAgIFJvYmVydAorICovCisKK3N0YXRpYyBpbnQgYnVzeV93YWl0KHZvaWQpCit7CisJI2RlZmluZSBNSU5USU1FIDUwMAorCWxvbmcgdGltZW91dDsKKwl1bnNpZ25lZCBjaGFyIGJ5dGU7CisKKwlmb3IgKHRpbWVvdXQgPSAxOyB0aW1lb3V0IDw9IE1JTlRJTUUrMzA7IHRpbWVvdXQrKykgeworCQlpZiAoKChieXRlPWluYihCVVNZX1JFR0lTVEVSKSkgJiAxKSA9PSAwKSB7CisJCQlpZiAodGltZW91dCA+PSBNSU5USU1FKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJhY2k6IEdvdCBSRUFEWUZMQUcgaW4gcm91bmQgJWxkLlxuIiwgdGltZW91dC1NSU5USU1FKTsKKwkJCXJldHVybiBieXRlOworCQl9CisJCWlmICh0aW1lb3V0ID49IE1JTlRJTUUpIHsKKwkJCWxvbmcgb3V0PTEwKkhaOworCQkJc3dpdGNoICh0aW1lb3V0LU1JTlRJTUUpIHsKKwkJCWNhc2UgMCAuLi4gOToKKwkJCQlvdXQgLz0gMTA7CisJCQljYXNlIDEwIC4uLiAxOToKKwkJCQlvdXQgLz0gMTA7CisJCQljYXNlIDIwIC4uLiAzMDoKKwkJCQlvdXQgLz0gMTA7CisJCQlkZWZhdWx0OgorCQkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KG91dCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiYWNpOiBidXN5X3dhaXQoKSB0aW1lIG91dC5cbiIpOworCXJldHVybiAtRUJVU1k7Cit9CisKKy8qIFRoZSBmb3VyIEFDSSBjb21tYW5kIHR5cGVzIGFyZSBmdWNrZWQgdXAuIFstOgorICogaW1wbGllZCBpczogMXcgICAgICAtIHNwZWNpYWwgY2FzZSBmb3IgSU5JVAorICogd3JpdGUgICBpczogMncxcgorICogcmVhZCAgICBpczogeCgxdzFyKSB3aGVyZSB4IGlzIDEgb3IgMiAoMSBDSEVDS19TSUcsIDEgQ0hFQ0tfU1RFUiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgVkVSU0lPTiwgMiBJRENPREUpCisgKiAgdGhlIGNvbW1hbmQgaXMgb25seSBpbiB0aGUgZmlyc3Qgd3JpdGUsIHJlc3QgaXMgcHJvdG9jb2wgb3ZlcmhlYWQKKyAqCisgKiBpbmRleGVkIGlzIHRlY2huaWNhbGx5IGEgd3JpdGUgYW5kIHVzZWQgZm9yIFNUQVRVUworICogYW5kIHRoZSBzcGVjaWFsIGNhc2UgZm9yIFRVTkUgaXM6IDN3MXIKKyAqIAorICogSGVyZSB0aGUgbmV3IGdlbmVyYWwgc2hlbWU6IFRVTkUgLS0+IGFjaV9yd19jbWQoeCwgIHksICB6KQorICogICAgICAgICAgICAgICAgaW5kZXhlZCBhbmQgd3JpdGUgLS0+IGFjaV9yd19jbWQoeCwgIHksIC0xKQorICogICAgICAgICAgIGltcGxpZWQgYW5kIHJlYWQgKHg9MSkgLS0+IGFjaV9yd19jbWQoeCwgLTEsIC0xKQorICoKKyAqIFJlYWQgKHg+PTIpIGlzIG5vdCBpbXBsZW1lbnRlZCAob25seSB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbikuCisgKiBVc2UgYWNpX2lkY29kZVsyXSBhbmQgYWNpX3ZlcnNpb24uLi4gICAgICAgICAgICAgICAgICAgIFJvYmVydAorICovCisKKy8qIFNvbWUgbm90ZXMgZm9yIGVycm9yIGRldGVjdGlvbjogdGhlb3JldGljYWxseSBpdCBpcyBwb3NzaWJsZS4KKyAqIEJ1dCBpdCBkb3VibGVzIHRoZSBJL08tdHJhZmZpYyBmcm9tIHd3KHIpIHRvIHd3d3J3KHIpIGluIHRoZSBub3JtYWwgCisgKiBjYXNlIGFuZCBkb2Vzbid0IHNlZW0gdG8gYmUgZGVzaWduZWQgZm9yIHRoYXQuLi4gICAgICAgIFJvYmVydAorICovCisKK3N0YXRpYyBpbmxpbmUgaW50IGFjaV9yYXd3cml0ZSh1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJaWYgKGJ1c3lfd2FpdCgpID49IDApIHsKKyNpZmRlZiBERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiYWNpX3Jhd3dyaXRlKCVkKVxuIiwgYnl0ZSk7CisjZW5kaWYKKwkJb3V0YihieXRlLCBDT01NQU5EX1JFR0lTVEVSKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFjaV9yYXdyZWFkKHZvaWQpCit7CisJdW5zaWduZWQgY2hhciBieXRlOworCisJaWYgKGJ1c3lfd2FpdCgpID49IDApIHsKKwkJYnl0ZT1pbmIoU1RBVFVTX1JFR0lTVEVSKTsKKyNpZmRlZiBERUJVRworCQlwcmludGsoS0VSTl9ERUJVRyAiJWQgPSBhY2lfcmF3cmVhZCgpXG4iLCBieXRlKTsKKyNlbmRpZgorCQlyZXR1cm4gYnl0ZTsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FQlVTWTsKK30KKworCitpbnQgYWNpX3J3X2NtZChpbnQgd3JpdGUxLCBpbnQgd3JpdGUyLCBpbnQgd3JpdGUzKQoreworCWludCB3cml0ZVtdID0ge3dyaXRlMSwgd3JpdGUyLCB3cml0ZTN9OworCWludCByZWFkID0gLUVJTlRSLCBpOworCisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmYWNpX3NlbSkpCisJCWdvdG8gb3V0OworCisJZm9yIChpPTA7IGk8MzsgaSsrKSB7CisJCWlmICh3cml0ZVtpXTwgMCB8fCB3cml0ZVtpXSA+IDI1NSkKKwkJCWJyZWFrOworCQllbHNlIHsKKwkJCXJlYWQgPSBhY2lfcmF3d3JpdGUod3JpdGVbaV0pOworCQkJaWYgKHJlYWQgPCAwKQorCQkJCWdvdG8gb3V0X3VwOworCQl9CisJCQorCX0KKwkKKwlyZWFkID0gYWNpX3Jhd3JlYWQoKTsKK291dF91cDoJdXAoJmFjaV9zZW0pOworb3V0OglyZXR1cm4gcmVhZDsKK30KKworRVhQT1JUX1NZTUJPTChhY2lfcndfY21kKTsKKworc3RhdGljIGludCBzZXR2b2x1bWUoaW50IF9fdXNlciAqYXJnLCAKKwkJICAgICB1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCit7CisJaW50IHZvbCwgcmV0LCB1c2Vydm9sLCBidWY7CisKKwlfX2dldF91c2VyKHVzZXJ2b2wsIGFyZyk7CisKKwkvKiBsZWZ0IGNoYW5uZWwgKi8KKwl2b2wgPSB1c2Vydm9sICYgMHhmZjsKKwlpZiAodm9sID4gMTAwKQorCQl2b2wgPSAxMDA7CisJdm9sID0gU0NBTEUoMTAwLCAweDIwLCB2b2wpOworCWlmICgoYnVmPWFjaV93cml0ZV9jbWQobGVmdF9pbmRleCwgMHgyMCAtIHZvbCkpPDApCisJCXJldHVybiBidWY7CisJcmV0ID0gU0NBTEUoMHgyMCwgMTAwLCB2b2wpOworCisKKwkvKiByaWdodCBjaGFubmVsICovCisJdm9sID0gKHVzZXJ2b2wgPj4gOCkgJiAweGZmOworCWlmICh2b2wgPiAxMDApCisJCXZvbCA9IDEwMDsKKwl2b2wgPSBTQ0FMRSgxMDAsIDB4MjAsIHZvbCk7CisJaWYgKChidWY9YWNpX3dyaXRlX2NtZChyaWdodF9pbmRleCwgMHgyMCAtIHZvbCkpPDApCisJCXJldHVybiBidWY7CisJcmV0IHw9IFNDQUxFKDB4MjAsIDEwMCwgdm9sKSA8PCA4OworIAorCV9fcHV0X3VzZXIocmV0LCBhcmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0dm9sdW1lKGludCBfX3VzZXIgKmFyZywKKwkJICAgICB1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCit7CisJaW50IHZvbDsKKwlpbnQgYnVmOworCisJLyogbGVmdCBjaGFubmVsICovCisJaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIGxlZnRfaW5kZXgpKTwwKQorCQlyZXR1cm4gYnVmOworCXZvbCA9IFNDQUxFKDB4MjAsIDEwMCwgYnVmIDwgMHgyMCA/IDB4MjAtYnVmIDogMCk7CisJCisJLyogcmlnaHQgY2hhbm5lbCAqLworCWlmICgoYnVmPWFjaV9pbmRleGVkX2NtZChBQ0lfU1RBVFVTLCByaWdodF9pbmRleCkpPDApCisJCXJldHVybiBidWY7CisJdm9sIHw9IFNDQUxFKDB4MjAsIDEwMCwgYnVmIDwgMHgyMCA/IDB4MjAtYnVmIDogMCkgPDwgODsKKworCV9fcHV0X3VzZXIodm9sLCBhcmcpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogVGhlIGVxdWFsaXplciBpcyBzb21ld2hhdCBzdHJhbmdlIG9uIHRoZSBBQ0kuIEZyb20gLTEyZEIgdG8gKzEyZEIKKyAqIHdyaXRlOiAgMHhmZi4uZG93bi50by4uMHg4MD09MHgwMC4udXAudG8uLjB4N2YKKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlcV9vc3MyYWNpKHVuc2lnbmVkIGludCB2b2wpCit7CisJaW50IGJvb3N0PTA7CisJdW5zaWduZWQgaW50IHJldDsKKworCWlmICh2b2wgPiAxMDApCisJCXZvbCA9IDEwMDsKKwlpZiAodm9sID4gNTApIHsKKwkJdm9sIC09IDUxOworCQlib29zdD0xOworCX0KKwlpZiAoYm9vc3QpCisJCXJldD1TQ0FMRSg0OSwgMHg3ZSwgdm9sKSsxOworCWVsc2UKKwkJcmV0PTB4ZmYgLSBTQ0FMRSg1MCwgMHg3Ziwgdm9sKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBlcV9hY2kyb3NzKHVuc2lnbmVkIGludCB2b2wpCit7CisJaWYgKHZvbCA8IDB4ODApCisJCXJldHVybiBTQ0FMRSgweDdmLCA1MCwgdm9sKSArIDUwOworCWVsc2UKKwkJcmV0dXJuIFNDQUxFKDB4N2YsIDUwLCAweGZmLXZvbCk7Cit9CisKKworc3RhdGljIGludCBzZXRlcXVhbGl6ZXIoaW50IF9fdXNlciAqYXJnLCAKKwkJCXVuc2lnbmVkIGNoYXIgbGVmdF9pbmRleCwgdW5zaWduZWQgY2hhciByaWdodF9pbmRleCkKK3sKKwlpbnQgYnVmOworCXVuc2lnbmVkIGludCB2b2w7CisKKwlfX2dldF91c2VyKHZvbCwgYXJnKTsKKworCS8qIGxlZnQgY2hhbm5lbCAqLworCWlmICgoYnVmPWFjaV93cml0ZV9jbWQobGVmdF9pbmRleCwgZXFfb3NzMmFjaSh2b2wgJiAweGZmKSkpPDApCisJCXJldHVybiBidWY7CisKKwkvKiByaWdodCBjaGFubmVsICovCisJaWYgKChidWY9YWNpX3dyaXRlX2NtZChyaWdodF9pbmRleCwgZXFfb3NzMmFjaSgodm9sPj44KSAmIDB4ZmYpKSk8MCkKKwkJcmV0dXJuIGJ1ZjsKKworCS8qIHRoZSBBQ0kgZXF1YWxpemVyIGlzIG1vcmUgcHJlY2lzZSAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldGVxdWFsaXplcihpbnQgX191c2VyICphcmcsCisJCQl1bnNpZ25lZCBjaGFyIGxlZnRfaW5kZXgsIHVuc2lnbmVkIGNoYXIgcmlnaHRfaW5kZXgpCit7CisJaW50IGJ1ZjsKKwl1bnNpZ25lZCBpbnQgdm9sOworCisJLyogbGVmdCBjaGFubmVsICovCisJaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIGxlZnRfaW5kZXgpKTwwKQorCQlyZXR1cm4gYnVmOworCXZvbCA9IGVxX2FjaTJvc3MoYnVmKTsKKwkKKwkvKiByaWdodCBjaGFubmVsICovCisJaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsIHJpZ2h0X2luZGV4KSk8MCkKKwkJcmV0dXJuIGJ1ZjsKKwl2b2wgfD0gZXFfYWNpMm9zcyhidWYpIDw8IDg7CisKKwlfX3B1dF91c2VyKHZvbCwgYXJnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFjaV9taXhlcl9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCit7CisJaW50IHZvbCwgYnVmOworCWludCBfX3VzZXIgKnAgPSBhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgorCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4MDEsIDB4MDApOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfQ0Q6CisJCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYywgMHgzNCk7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9NSUM6CisJCXJldHVybiBzZXR2b2x1bWUocCwgMHgzOCwgMHgzMCk7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9MSU5FOgorCQlyZXR1cm4gc2V0dm9sdW1lKHAsIDB4MzksIDB4MzEpOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfU1lOVEg6CisJCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYiwgMHgzMyk7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9QQ006CisJCXJldHVybiBzZXR2b2x1bWUocCwgMHgzYSwgMHgzMik7CisJY2FzZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl9SQURJTyk6IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTElORTE6ICAvKiBBVVgxIG9yIHJhZGlvICovCisJCXJldHVybiBzZXR2b2x1bWUocCwgMHgzZCwgMHgzNSk7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9MSU5FMjogIC8qIEFVWDIgKi8KKwkJcmV0dXJuIHNldHZvbHVtZShwLCAweDNlLCAweDM2KTsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0JBU1M6ICAgLyogc2V0IGJhbmQgb25lIGFuZCB0d28gKi8KKwkJaWYgKGFjaV9pZGNvZGVbMV09PSdDJykgeworCQkJaWYgKChidWY9c2V0ZXF1YWxpemVyKHAsIDB4NDgsIDB4NDApKSB8fCAKKwkJCSAgICAoYnVmPXNldGVxdWFsaXplcihwLCAweDQ5LCAweDQxKSkpOworCQkJcmV0dXJuIGJ1ZjsKKwkJfQorCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1RSRUJMRTogLyogc2V0IGJhbmQgc2l4IGFuZCBzZXZlbiAqLworCQlpZiAoYWNpX2lkY29kZVsxXT09J0MnKSB7CisJCQlpZiAoKGJ1Zj1zZXRlcXVhbGl6ZXIocCwgMHg0ZCwgMHg0NSkpIHx8IAorCQkJICAgIChidWY9c2V0ZXF1YWxpemVyKHAsIDB4NGUsIDB4NDYpKSk7CisJCQlyZXR1cm4gYnVmOworCQl9CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfSUdBSU46ICAvKiBNSUMgcHJlLWFtcCAqLworCQlpZiAoYWNpX2lkY29kZVsxXT09J0InIHx8IGFjaV9pZGNvZGVbMV09PSdDJykgeworCQkJX19nZXRfdXNlcih2b2wsIHApOworCQkJdm9sID0gdm9sICYgMHhmZjsKKwkJCWlmICh2b2wgPiAxMDApCisJCQkJdm9sID0gMTAwOworCQkJdm9sID0gU0NBTEUoMTAwLCAzLCB2b2wpOworCQkJaWYgKChidWY9YWNpX3dyaXRlX2NtZChBQ0lfV1JJVEVfSUdBSU4sIHZvbCkpPDApCisJCQkJcmV0dXJuIGJ1ZjsKKwkJCWFjaV9taWNwcmVhbXAgPSB2b2w7CisJCQl2b2wgPSBTQ0FMRSgzLCAxMDAsIHZvbCk7CisJCQl2b2wgfD0gKHZvbCA8PCA4KTsKKwkJCV9fcHV0X3VzZXIodm9sLCBwKTsKKwkJCXJldHVybiAwOworCQl9CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU46ICAvKiBQb3dlci1hbXAvbGluZS1vdXQgbGV2ZWwgKi8KKwkJaWYgKGFjaV9pZGNvZGVbMV09PSdBJyB8fCBhY2lfaWRjb2RlWzFdPT0nQicpIHsKKwkJCV9fZ2V0X3VzZXIoYnVmLCBwKTsKKwkJCWJ1ZiA9IGJ1ZiAmIDB4ZmY7CisJCQlpZiAoYnVmID4gNTApCisJCQkJdm9sID0gMTsKKwkJCWVsc2UKKwkJCQl2b2wgPSAwOworCQkJaWYgKChidWY9YWNpX3dyaXRlX2NtZChBQ0lfU0VUX1BPV0VSQU1QLCB2b2wpKTwwKQorCQkJCXJldHVybiBidWY7CisJCQlhY2lfYW1wID0gdm9sOworCQkJaWYgKGFjaV9hbXApCisJCQkJYnVmID0gKDEwMCB8fCAxMDA8PDgpOworCQkJZWxzZQorCQkJCWJ1ZiA9IDA7CisJCQlfX3B1dF91c2VyKGJ1ZiwgcCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQzoKKwkJLyogaGFuZGxlIHNvbG8gbW9kZSBjb250cm9sICovCisJCV9fZ2V0X3VzZXIoYnVmLCBwKTsKKwkJLyogdW5zZXQgc29sbyB3aGVuIFJFQ1NSQyBmb3IgUENNIGlzIHJlcXVlc3RlZCAqLworCQlpZiAoYWNpX2lkY29kZVsxXT09J0InIHx8IGFjaV9pZGNvZGVbMV09PSdDJykgeworCQkJdm9sID0gIShidWYgJiBTT1VORF9NQVNLX1BDTSk7CisJCQlpZiAoKGJ1Zj1hY2lfd3JpdGVfY21kKEFDSV9TRVRfU09MT01PREUsIHZvbCkpPDApCisJCQkJcmV0dXJuIGJ1ZjsKKwkJCWFjaV9zb2xvID0gdm9sOworCQl9CisJCWJ1ZiA9IChTT1VORF9NQVNLX0NEfCBTT1VORF9NQVNLX01JQ3wgU09VTkRfTUFTS19MSU5FfAorCQkgICAgICAgU09VTkRfTUFTS19TWU5USHwgU09VTkRfTUFTS19MSU5FMik7CisJCWlmIChhY2lfaWRjb2RlWzFdID09ICdDJykgLyogUENNMjAgcmFkaW8gKi8KKwkJCWJ1ZiB8PSBTT1VORF9NQVNLX1JBRElPOworCQllbHNlCisJCQlidWYgfD0gU09VTkRfTUFTS19MSU5FMTsKKwkJaWYgKCFhY2lfc29sbykKKwkJCWJ1ZiB8PSBTT1VORF9NQVNLX1BDTTsKKwkJX19wdXRfdXNlcihidWYsIHApOworCQlyZXR1cm4gMDsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSzoKKwkJYnVmID0gKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19DRCAgICB8CisJCSAgICAgICBTT1VORF9NQVNLX01JQyAgICB8IFNPVU5EX01BU0tfTElORSAgfAorCQkgICAgICAgU09VTkRfTUFTS19TWU5USCAgfCBTT1VORF9NQVNLX1BDTSAgIHwKKwkJICAgICAgIFNPVU5EX01BU0tfTElORTIpOworCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKKwkJY2FzZSAnQyc6IC8qIFBDTTIwIHJhZGlvICovCisJCQlidWYgfD0gKFNPVU5EX01BU0tfUkFESU8gfCBTT1VORF9NQVNLX0lHQUlOIHwKKwkJCQlTT1VORF9NQVNLX0JBU1MgIHwgU09VTkRfTUFTS19UUkVCTEUpOworCQkJYnJlYWs7CisJCWNhc2UgJ0InOiAvKiBQQ00xMiAqLworCQkJYnVmIHw9IChTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19JR0FJTiB8CisJCQkJU09VTkRfTUFTS19PR0FJTik7CisJCQlicmVhazsKKwkJY2FzZSAnQSc6IC8qIFBDTTEtcHJvICovCisJCQlidWYgfD0gKFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX09HQUlOKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7CisJCX0KKwkJX19wdXRfdXNlcihidWYsIHApOworCQlyZXR1cm4gMDsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUzoKKwkJYnVmID0gKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19DRCAgICB8CisJCSAgICAgICBTT1VORF9NQVNLX01JQyAgICB8IFNPVU5EX01BU0tfTElORSAgfAorCQkgICAgICAgU09VTkRfTUFTS19TWU5USCAgfCBTT1VORF9NQVNLX1BDTSAgIHwKKwkJICAgICAgIFNPVU5EX01BU0tfTElORTIpOworCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKKwkJY2FzZSAnQyc6IC8qIFBDTTIwIHJhZGlvICovCisJCQlidWYgfD0gKFNPVU5EX01BU0tfUkFESU8gfAorCQkJCVNPVU5EX01BU0tfQkFTUyAgfCBTT1VORF9NQVNLX1RSRUJMRSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOworCQl9CisJCV9fcHV0X3VzZXIoYnVmLCBwKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6CisJCWJ1ZiA9IChTT1VORF9NQVNLX0NEfCBTT1VORF9NQVNLX01JQ3wgU09VTkRfTUFTS19MSU5FfAorCQkgICAgICAgU09VTkRfTUFTS19TWU5USHwgU09VTkRfTUFTS19MSU5FMnwgU09VTkRfTUFTS19QQ00pOworCQlpZiAoYWNpX2lkY29kZVsxXSA9PSAnQycpIC8qIFBDTTIwIHJhZGlvICovCisJCQlidWYgfD0gU09VTkRfTUFTS19SQURJTzsKKwkJZWxzZQorCQkJYnVmIHw9IFNPVU5EX01BU0tfTElORTE7CisKKwkJX19wdXRfdXNlcihidWYsIHApOworCQlyZXR1cm4gMDsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDU1JDOgorCQlidWYgPSAoU09VTkRfTUFTS19DRCAgICB8IFNPVU5EX01BU0tfTUlDICAgfCBTT1VORF9NQVNLX0xJTkUgIHwKKwkJICAgICAgIFNPVU5EX01BU0tfU1lOVEggfCBTT1VORF9NQVNLX0xJTkUyKTsKKwkJLyogZG8gd2UgbmVlZCBhY2lfc29sbyBvciBjYW4gSSBnZXQgaXQgZnJvbSB0aGUgQUNJPyAqLworCQlzd2l0Y2ggKGFjaV9pZGNvZGVbMV0pIHsKKwkJY2FzZSAnQic6IC8qIFBDTTEyICovCisJCWNhc2UgJ0MnOiAvKiBQQ00yMCByYWRpbyAqLworCQkJaWYgKGFjaV92ZXJzaW9uID49IDB4YjApIHsKKwkJCQlpZiAoKHZvbD1hY2lfcndfY21kKEFDSV9TVEFUVVMsCisJCQkJCQkgICAgQUNJX1NfR0VORVJBTCwgLTEpKTwwKQorCQkJCQlyZXR1cm4gdm9sOworCQkJCWlmICh2b2wgJiAweDIwKQorCQkJCQlidWYgfD0gU09VTkRfTUFTS19QQ007CisJCQl9CisJCQllbHNlCisJCQkJaWYgKCFhY2lfc29sbykKKwkJCQkJYnVmIHw9IFNPVU5EX01BU0tfUENNOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlidWYgfD0gU09VTkRfTUFTS19QQ007CisJCX0KKwkJaWYgKGFjaV9pZGNvZGVbMV0gPT0gJ0MnKSAvKiBQQ00yMCByYWRpbyAqLworCQkJYnVmIHw9IFNPVU5EX01BU0tfUkFESU87CisJCWVsc2UKKwkJCWJ1ZiB8PSBTT1VORF9NQVNLX0xJTkUxOworCisJCV9fcHV0X3VzZXIoYnVmLCBwKTsKKwkJcmV0dXJuIDA7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NBUFM6CisJCV9fcHV0X3VzZXIoMCwgcCk7CisJCXJldHVybiAwOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU6CisJCXJldHVybiBnZXR2b2x1bWUocCwgMHgwNCwgMHgwMyk7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NEOgorCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MGEsIDB4MDkpOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9NSUM6CisJCXJldHVybiBnZXR2b2x1bWUocCwgMHgwNiwgMHgwNSk7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkU6CisJCXJldHVybiBnZXR2b2x1bWUocCwgMHgwOCwgMHgwNyk7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NZTlRIOgorCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MGMsIDB4MGIpOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9QQ006CisJCXJldHVybiBnZXR2b2x1bWUocCwgMHgwZSwgMHgwZCk7CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JBRElPKTogLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkUxOiAgLyogQVVYMSAqLworCQlyZXR1cm4gZ2V0dm9sdW1lKHAsIDB4MTEsIDB4MTApOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9MSU5FMjogIC8qIEFVWDIgKi8KKwkJcmV0dXJuIGdldHZvbHVtZShwLCAweDEzLCAweDEyKTsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfQkFTUzogICAvKiBnZXQgYmFuZCBvbmUgKi8KKwkJaWYgKGFjaV9pZGNvZGVbMV09PSdDJykgeworCQkJcmV0dXJuIGdldGVxdWFsaXplcihwLCAweDIzLCAweDIyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfVFJFQkxFOiAvKiBnZXQgYmFuZCBzZXZlbiAqLworCQlpZiAoYWNpX2lkY29kZVsxXT09J0MnKSB7CisJCQlyZXR1cm4gZ2V0ZXF1YWxpemVyKHAsIDB4MmYsIDB4MmUpOworCQl9CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9JR0FJTjogIC8qIE1JQyBwcmUtYW1wICovCisJCWlmIChhY2lfaWRjb2RlWzFdPT0nQicgfHwgYWNpX2lkY29kZVsxXT09J0MnKSB7CisJCQkvKiBhY2lfbWljcHJlYW1wIG9yIEFDST8gKi8KKwkJCWlmIChhY2lfdmVyc2lvbiA+PSAweGIwKSB7CisJCQkJaWYgKChidWY9YWNpX2luZGV4ZWRfY21kKEFDSV9TVEFUVVMsCisJCQkJCQkJIEFDSV9TX1JFQURfSUdBSU4pKTwwKQorCQkJCQlyZXR1cm4gYnVmOworCQkJfQorCQkJZWxzZQorCQkJCWJ1Zj1hY2lfbWljcHJlYW1wOworCQkJdm9sID0gU0NBTEUoMywgMTAwLCBidWYgPD0gMyA/IGJ1ZiA6IDMpOworCQkJdm9sIHw9IHZvbCA8PCA4OworCQkJX19wdXRfdXNlcih2b2wsIHApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX09HQUlOOgorCQlpZiAoYWNpX2FtcCkKKwkJCWJ1ZiA9ICgxMDAgfHwgMTAwPDw4KTsKKwkJZWxzZQorCQkJYnVmID0gMDsKKwkJX19wdXRfdXNlcihidWYsIHApOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBhY2lfbWl4ZXJfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmlkICAgID0gIkFDSSIsCisJLmlvY3RsID0gYWNpX21peGVyX2lvY3RsCit9OworCisvKgorICogVGhlcmUgaXMgYWxzbyBhbiBpbnRlcm5hbCBtaXhlciBpbiB0aGUgY29kZWMgKENTNDIzMUEgb3IgQUQxODQ1KSwKKyAqIHRoYXQgZGVzZXJ2ZXMgbm8gcHVycG9zZSBpbiBhbiBBQ0kgYmFzZWQgc3lzdGVtIHdoaWNoIHVzZXMgYW4KKyAqIGV4dGVybmFsIEFDSSBjb250cm9sbGVkIHN0ZXJlbyBtaXhlci4gTWFrZSBzdXJlIHRoYXQgdGhpcyBjb2RlYworICogbWl4ZXIgaGFzIHRoZSBBVVgxIGlucHV0IHNlbGVjdGVkIGFzIHRoZSByZWNvcmRpbmcgc291cmNlLCB0aGF0IHRoZQorICogaW5wdXQgZ2FpbiBpcyBzZXQgbmVhciBtYXhpbXVtIGFuZCB0aGF0IHRoZSBvdGhlciBjaGFubmVscyBnb2luZworICogZnJvbSB0aGUgaW5wdXRzIHRvIHRoZSBjb2RlYyBvdXRwdXQgYXJlIG11dGVkLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGF0dGFjaF9hY2kodm9pZCkKK3sKKwljaGFyICpib2FyZG5hbWU7CisJaW50IGksIHJjID0gLUVCVVNZOworCisJaW5pdF9NVVRFWCgmYWNpX3NlbSk7CisKKwlvdXRiKDB4RTMsIDB4ZjhmKTsgLyogV3JpdGUgTUFEMTYgcGFzc3dvcmQgKi8KKwlhY2lfcG9ydCA9IChpbmIoMHhmOTApICYgMHgxMCkgPworCQkweDM0NDogMHgzNTQ7IC8qIEdldCBhY2lfcG9ydCBmcm9tIE1DNF9QT1JUICovCisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFjaV9wb3J0LCAzLCAic291bmQgbWl4ZXIgKEFDSSkiKSkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UKKwkJICAgICAgICJhY2k6IEkvTyBhcmVhIDB4JTAzeC0weCUwM3ggYWxyZWFkeSB1c2VkLlxuIiwKKwkJICAgICAgIGFjaV9wb3J0LCBhY2lfcG9ydCsyKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogZm9yY2UgQUNJIGludG8gYSBrbm93biBzdGF0ZSAqLworCXJjID0gLUVGQVVMVDsKKwlmb3IgKGk9MDsgaTwzOyBpKyspCisJCWlmIChhY2lfcndfY21kKEFDSV9FUlJPUl9PUCwgLTEsIC0xKTwwKQorCQkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisKKwkvKiBvZmZpY2lhbCB0aGlzIGlzIG9uZSBhY2kgcmVhZCBjYWxsOiAqLworCXJjID0gLUVGQVVMVDsKKwlpZiAoKGFjaV9pZGNvZGVbMF09YWNpX3J3X2NtZChBQ0lfUkVBRF9JRENPREUsIC0xLCAtMSkpPDAgfHwKKwkgICAgKGFjaV9pZGNvZGVbMV09YWNpX3J3X2NtZChBQ0lfUkVBRF9JRENPREUsIC0xLCAtMSkpPDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhY2k6IEZhaWxlZCB0byByZWFkIGlkY29kZSBvbiAweCUwM3guXG4iLAorCQkgICAgICAgYWNpX3BvcnQpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwlpZiAoKGFjaV92ZXJzaW9uPWFjaV9yd19jbWQoQUNJX1JFQURfVkVSU0lPTiwgLTEsIC0xKSk8MCkgeworCQlwcmludGsoS0VSTl9FUlIgImFjaTogRmFpbGVkIHRvIHJlYWQgdmVyc2lvbiBvbiAweCUwM3guXG4iLAorCQkgICAgICAgYWNpX3BvcnQpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwlpZiAoYWNpX2lkY29kZVswXSA9PSAnbScpIHsKKwkJLyogSXQgbG9va3MgbGlrZSBhIG1pcm8gc291bmQgY2FyZC4gKi8KKwkJc3dpdGNoIChhY2lfaWRjb2RlWzFdKSB7CisJCWNhc2UgJ0EnOgorCQkJYm9hcmRuYW1lID0gIlBDTTEgcHJvIC8gZWFybHkgUENNMTIiOworCQkJYnJlYWs7CisJCWNhc2UgJ0InOgorCQkJYm9hcmRuYW1lID0gIlBDTTEyIjsKKwkJCWJyZWFrOworCQljYXNlICdDJzoKKwkJCWJvYXJkbmFtZSA9ICJQQ00yMCByYWRpbyI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJvYXJkbmFtZSA9ICJ1bmtub3duIG1pcm8iOworCQl9CisJfSBlbHNlIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWNpOiBXYXJuaW5nOiB1bnN1cHBvcnRlZCBjYXJkISAtICIKKwkJICAgICAgICJubyBoYXJkd2FyZSwgbm8gc3BlY3MuLi5cbiIpOworCQlib2FyZG5hbWUgPSAidW5rbm93biBDYXJkaW5hbCBUZWNobm9sb2dpZXMiOworCX0KKworCXByaW50ayhLRVJOX0lORk8gIjxBQ0kgMHglMDJ4LCBpZCAlMDJ4LyUwMnggXCIlYy8lY1wiLCAoJXMpPiBhdCAweCUwM3hcbiIsCisJICAgICAgIGFjaV92ZXJzaW9uLAorCSAgICAgICBhY2lfaWRjb2RlWzBdLCBhY2lfaWRjb2RlWzFdLAorCSAgICAgICBhY2lfaWRjb2RlWzBdLCBhY2lfaWRjb2RlWzFdLAorCSAgICAgICBib2FyZG5hbWUsIGFjaV9wb3J0KTsKKworCXJjID0gLUVCVVNZOworCWlmIChyZXNldCkgeworCQkvKiBmaXJzdCB3cml0ZSgpcyBhZnRlciByZXNldCBmYWlsIHdpdGggbXkgUENNMjAgKi8KKwkJaWYgKGFjaV9yd19jbWQoQUNJX0lOSVQsIC0xLCAtMSk8MCB8fAorCQkgICAgYWNpX3J3X2NtZChBQ0lfRVJST1JfT1AsIEFDSV9FUlJPUl9PUCwgQUNJX0VSUk9SX09QKTwwIHx8CisJCSAgICBhY2lfcndfY21kKEFDSV9FUlJPUl9PUCwgQUNJX0VSUk9SX09QLCBBQ0lfRVJST1JfT1ApPDApCisJCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwkvKiB0aGUgUENNMjAgaXMgbXV0ZWQgYWZ0ZXIgcmVzZXQgKGFuZCByZWJvb3QpICovCisJaWYgKGFjaV9yd19jbWQoQUNJX1NFVF9NVVRFLCAweDAwLCAtMSk8MCkKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisKKwlpZiAoaWRlPj0wKQorCQlpZiAoYWNpX3J3X2NtZChBQ0lfU0VUX0lERSwgIWlkZSwgLTEpPDApCisJCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwkKKwlpZiAod3NzPj0wICYmIGFjaV9pZGNvZGVbMV09PSdBJykKKwkJaWYgKGFjaV9yd19jbWQoQUNJX1NFVF9XU1MsICEhd3NzLCAtMSk8MCkKKwkJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCisJbWl4ZXJfZGV2aWNlID0gc291bmRfaW5zdGFsbF9taXhlcihNSVhFUl9EUklWRVJfVkVSU0lPTiwgYm9hcmRuYW1lLAorCQkJCQkgICAmYWNpX21peGVyX29wZXJhdGlvbnMsCisJCQkJCSAgIHNpemVvZihhY2lfbWl4ZXJfb3BlcmF0aW9ucyksIE5VTEwpOworCXJjID0gMDsKKwlpZiAobWl4ZXJfZGV2aWNlIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFjaTogRmFpbGVkIHRvIGluc3RhbGwgbWl4ZXIuXG4iKTsKKwkJcmMgPSBtaXhlcl9kZXZpY2U7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0gLyogZWxzZSBNYXliZSBpbml0aWFsaXplIHRoZSBDUzQyMzFBIG1peGVyIGhlcmUuLi4gKi8KK291dDoJcmV0dXJuIHJjOworb3V0X3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKGFjaV9wb3J0LCAzKTsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9hY2kodm9pZCkKK3sKKwlzb3VuZF91bmxvYWRfbWl4ZXJkZXYobWl4ZXJfZGV2aWNlKTsKKwlyZWxlYXNlX3JlZ2lvbihhY2lfcG9ydCwgMyk7Cit9CisKK21vZHVsZV9pbml0KGF0dGFjaF9hY2kpOworbW9kdWxlX2V4aXQodW5sb2FkX2FjaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWNpLmggYi9zb3VuZC9vc3MvYWNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAxMDJlZQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hY2kuaApAQCAtMCwwICsxLDU3IEBACisjaWZuZGVmIF9BQ0lfSF8KKyNkZWZpbmUgX0FDSV9IXworCitleHRlcm4gaW50IGFjaV9wb3J0OworZXh0ZXJuIGludCBhY2lfdmVyc2lvbjsJCS8qIEFDSSBmaXJtd2FyZSB2ZXJzaW9uCSovCitleHRlcm4gaW50IGFjaV9yd19jbWQoaW50IHdyaXRlMSwgaW50IHdyaXRlMiwgaW50IHdyaXRlMyk7CisKKyNkZWZpbmUgYWNpX2luZGV4ZWRfY21kKGEsIGIpIGFjaV9yd19jbWQoYSwgYiwgLTEpCisjZGVmaW5lIGFjaV93cml0ZV9jbWQoYSwgYikgICBhY2lfcndfY21kKGEsIGIsIC0xKQorI2RlZmluZSBhY2lfcmVhZF9jbWQoYSkgICAgICAgYWNpX3J3X2NtZChhLC0xLCAtMSkKKworI2RlZmluZSBDT01NQU5EX1JFR0lTVEVSICAgIChhY2lfcG9ydCkgICAgICAvKiB3cml0ZSByZWdpc3RlciAqLworI2RlZmluZSBTVEFUVVNfUkVHSVNURVIgICAgIChhY2lfcG9ydCArIDEpICAvKiByZWFkIHJlZ2lzdGVyICovCisjZGVmaW5lIEJVU1lfUkVHSVNURVIgICAgICAgKGFjaV9wb3J0ICsgMikgIC8qIGFsc28gdXNlZCBmb3IgcmRzICovCisKKyNkZWZpbmUgUkRTX1JFR0lTVEVSICAgICAgICBCVVNZX1JFR0lTVEVSCisKKyNkZWZpbmUgQUNJX1NFVF9NVVRFICAgICAgICAgIDB4MGQKKyNkZWZpbmUgQUNJX1NFVF9QT1dFUkFNUCAgICAgIDB4MGYKKyNkZWZpbmUgQUNJX1NFVF9UVU5FUk1VVEUgICAgIDB4YTMKKyNkZWZpbmUgQUNJX1NFVF9UVU5FUk1PTk8gICAgIDB4YTQKKyNkZWZpbmUgQUNJX1NFVF9JREUgICAgICAgICAgIDB4ZDAKKyNkZWZpbmUgQUNJX1NFVF9XU1MgICAgICAgICAgIDB4ZDEKKyNkZWZpbmUgQUNJX1NFVF9TT0xPTU9ERSAgICAgIDB4ZDIKKyNkZWZpbmUgQUNJX1dSSVRFX0lHQUlOICAgICAgIDB4MDMKKyNkZWZpbmUgQUNJX1dSSVRFX1RVTkUgICAgICAgIDB4YTcKKyNkZWZpbmUgQUNJX1JFQURfVFVORVJTVEVSRU8gIDB4YTgKKyNkZWZpbmUgQUNJX1JFQURfVFVORVJTVEFUSU9OIDB4YTkKKyNkZWZpbmUgQUNJX1JFQURfVkVSU0lPTiAgICAgIDB4ZjEKKyNkZWZpbmUgQUNJX1JFQURfSURDT0RFICAgICAgIDB4ZjIKKyNkZWZpbmUgQUNJX0lOSVQgICAgICAgICAgICAgIDB4ZmYKKyNkZWZpbmUgQUNJX1NUQVRVUyAgICAgICAgICAgIDB4ZjAKKyNkZWZpbmUgICAgIEFDSV9TX0dFTkVSQUwgICAgIDB4MDAKKyNkZWZpbmUgICAgIEFDSV9TX1JFQURfSUdBSU4gIDB4MjEKKyNkZWZpbmUgQUNJX0VSUk9SX09QICAgICAgICAgIDB4ZGYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm8gU0NBTEUgY2FuIGJlIHVzZWQgdG8gc2NhbGUgb25lIGludGVnZXIgdm9sdW1lCisgKiB2YWx1ZSBpbnRvIGFub3RoZXIgb25lIHVzaW5nIG9ubHkgaW50ZWdlciBhcml0aG1ldGljLiBJZiB0aGUgaW5wdXQKKyAqIHZhbHVlIHggaXMgaW4gdGhlIHJhbmdlIDAgPD0geCA8PSB4bWF4LCB0aGVuIHRoZSByZXN1bHQgd2lsbCBiZSBpbgorICogdGhlIHJhbmdlIDAgPD0gU0NBTEUoeG1heCx5bWF4LHgpIDw9IHltYXguCisgKgorICogVGhpcyBtYWNybyBoYXMgZm9yIGFsbCB4bWF4LCB5bWF4ID4gMCBhbmQgYWxsIDAgPD0geCA8PSB4bWF4IHRoZQorICogZm9sbG93aW5nIG5pY2UgcHJvcGVydGllczoKKyAqCisgKiAtIFNDQUxFKHhtYXgseW1heCx4bWF4KSA9IHltYXgKKyAqIC0gU0NBTEUoeG1heCx5bWF4LDApID0gMAorICogLSBTQ0FMRSh4bWF4LHltYXgsU0NBTEUoeW1heCx4bWF4LFNDQUxFKHhtYXgseW1heCx4KSkpID0gU0NBTEUoeG1heCx5bWF4LHgpCisgKgorICogSW4gYWRkaXRpb24sIHRoZSByb3VuZGluZyBlcnJvciBpcyBtaW5pbWFsIGFuZCBuaWNlbHkgZGlzdHJpYnV0ZWQuCisgKiBUaGUgcHJvb2ZzIGFyZSBsZWZ0IGFzIGFuIGV4ZXJjaXNlIHRvIHRoZSByZWFkZXIuCisgKi8KKworI2RlZmluZSBTQ0FMRSh4bWF4LHltYXgseCkgKCgoeCkqKHltYXgpKyh4bWF4KS8yKS8oeG1heCkpCisKKworI2VuZGlmICAvKiBfQUNJX0hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODE2LmMgYi9zb3VuZC9vc3MvYWQxODE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkYWU1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hZDE4MTYuYwpAQCAtMCwwICsxLDEzNjkgQEAKKy8qCisgKgorICogQUQxODE2IGxvd2xldmVsIHNvdW5kIGRyaXZlciBmb3IgTGludXggMi42LjAgYW5kIGFib3ZlCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDMgYnkgVGhvcnN0ZW4gS25hYmUgPGxpbnV4QHRob3JzdGVuLWtuYWJlLmRlPgorICoKKyAqIEJhc2VkIG9uIHRoZSBDUzQyMzIvQUQxODQ4IGRyaXZlciBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk2CisgKgorICoKKyAqIHZlcnNpb246IDEuNQorICogc3RhdHVzOiBiZXRhCisgKiBkYXRlOiAyMDAzLzA3LzE1CisgKgorICogQ2hhbmdlczoKKyAqCU9sZWcgRHJva2luOiBTb21lIGNsZWFudXAgb2YgbG9hZC91bmxvYWQgZnVuY3Rpb25zLgkxOTk4LzExLzI0CisgKgkKKyAqCVRob3JzdGVuIEtuYWJlOiBhdHRhY2ggYW5kIHVubG9hZCByZXdyaXR0ZW4sIAorICoJc29tZSBhcmd1bWVudCBjaGVja3MgYWRkZWQJCQkJMTk5OC8xMS8zMAorICoKKyAqCVRob3JzdGVuIEtuYWJlOiBCdWdneSBpc2EgYnJpZGdlIHdvcmthcm91bmQgYWRkZWQJMTk5OS8wMS8xNgorICoJCisgKglEYXZpZCBNb2V3cy9UaG9yc3RlbiBLbmFiZTogSW50cm9kdWNlZCBvcHRpb25zIAorICoJcGFyYW1ldGVyLiBBZGRlZCBzbGlnaHRseSBtb2RpZmllZCBwYXRjaCBmcm9tIAorICoJRGF2aWQgTW9ld3MgdG8gZGlzYWJsZSBkc3AgYXVkaW8gc291cmNlcyBieSBzZXR0aW5nIAorICoJYml0IDAgb2Ygb3B0aW9ucyBwYXJhbWV0ZXIuIFRoaXMgc2VlbXMgdG8gYmUKKyAqCXJlcXVpcmVkIGJ5IHNvbWUgQXp0ZWNoL05ld2NvbSBTQy0xNiBjYXJkcy4JCTE5OTkvMDQvMTgKKyAqCisgKglDaHJpc3RvcGggSGVsbHdpZzogQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdC4JMjAwMC8wMy8wMworICoKKyAqCUNocmlzdG9waCBIZWxsd2lnOiBBZGRlZCBpc2FwbnAgc3VwcG9ydAkJCTIwMDAvMDMvMTUKKyAqCisgKglBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG86IGdldCByaWQgb2YgY2hlY2tfcmVnaW9uCTIwMDEvMTAvMDcKKyAqICAgICAgCisgKiAgICAgIFRob3JzdGVuIEtuYWJlOiBDb21waWxpbmcgd2l0aCBDT05GSUdfUE5QIGVuYWJsZWQKKyAqCXdvcmtzIGFnYWluLiBJdCBpcyBub3cgcG9zc2libGUgdG8gdXNlIG1vcmUgdGhhbiBvbmUgCisgKglBRDE4MTYgc291bmQgY2FyZC4gU2FtcGxlIHJhdGUgbm93IG1heSBiZSBjaGFuZ2VkIGR1cmluZworICoJcGxheWJhY2svY2FwdHVyZS4gcHJpbnRrKCkgdXNlcyBsb2cgbGV2ZWxzIGV2ZXJ5d2hlcmUuCisgKglTTVAgZml4ZXMuIERNQSBoYW5kbGluZyBmaXhlcy4KKyAqCU90aGVyIG1pbm9yIGNvZGUgY2xlYW51cC4JCQkJMjAwMy8wNy8xNQorICoKKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaXNhcG5wLmg+CisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2RlZmluZSBERUJVR05PSVNFKHgpCisKKyNkZWZpbmUgQ0hFQ0tfRk9SX1BPV0VSIHsgaW50IHRpbWVvdXQ9MTAwOyBcCisgIHdoaWxlICh0aW1lb3V0ID4gMCAmJiAoaW5iKGRldmMtPmJhc2UpJjB4ODApIT0gMHg4MCkge1wKKyAgICAgICAgICB0aW1lb3V0LS07IFwKKyAgfSBcCisgIGlmICh0aW1lb3V0PT0wKSB7XAorICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogQ2hlY2sgZm9yIHBvd2VyIGZhaWxlZCBpbiAlcyBsaW5lOiAlZFxuIixfX0ZJTEVfXyxfX0xJTkVfXyk7IFwKKyAgfSBcCit9CisKKy8qIHN0cnVjdHVyZSB0byBob2xkIGRldmljZSBzcGVjaWZpYyBpbmZvcm1hdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICAgICAgaW50ICAgICAgICAgICAgYmFzZTsgICAgICAgICAgLyogc2V0IGluIGF0dGFjaCAqLworCWludCAgICAgICAgICAgIGlycTsKKwlpbnQgICAgICAgICAgICBkbWFfcGxheWJhY2s7CisgICAgICAgIGludCAgICAgICAgICAgIGRtYV9jYXB0dXJlOworICAKKwlpbnQgICAgICAgICAgICBvcGVuZWQ7ICAgICAgICAgLyogb3BlbiAqLworICAgICAgICBpbnQgICAgICAgICAgICBzcGVlZDsJCisJaW50ICAgICAgICAgICAgY2hhbm5lbHM7CisJaW50ICAgICAgICAgICAgYXVkaW9fZm9ybWF0OworICAgICAgICBpbnQgICAgICAgICAgICBhdWRpb19tb2RlOyAKKyAgCisgICAgICAgIGludCAgICAgICAgICAgIHJlY21hc2s7ICAgICAgICAvKiBzZXR1cCAqLworCXVuc2lnbmVkIGNoYXIgIGZvcm1hdF9iaXRzOworCWludCAgICAgICAgICAgIHN1cHBvcnRlZF9kZXZpY2VzOworCWludCAgICAgICAgICAgIHN1cHBvcnRlZF9yZWNfZGV2aWNlczsKKwl1bnNpZ25lZCBzaG9ydCBsZXZlbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXTsKKwkJCQkJLyogbWlzYyAqLworCXN0cnVjdCBwbnBfZGV2ICpwbnBkZXY7CSAvKiBjb25maWd1cmVkIHZpYSBwbnAgKi8KKyAgICAgICAgaW50ICAgICAgICAgICAgZGV2X25vOyAgIC8qIHRoaXMgaXMgdGhlICMgaW4gYXVkaW9fZGV2cyBhbmQgTk9UIAorCQkJCSAgICBpbiBhZDE4MTZfaW5mbyAqLworCXNwaW5sb2NrX3QJbG9jazsgIAorfSBhZDE4MTZfaW5mbzsKKworc3RhdGljIGludCBucl9hZDE4MTZfZGV2czsKK3N0YXRpYyBpbnQgYWQxODE2X2Nsb2NrZnJlcSA9IDMzMDAwOworc3RhdGljIGludCBvcHRpb25zOworCisvKiBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0cyAqLworc3RhdGljIGludCAgYWRfZm9ybWF0X21hc2sgPQorQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9TMTZfQkUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVc7CisKKy8qIGFycmF5IG9mIGRldmljZSBpbmZvIHN0cnVjdHVyZXMgKi8KK3N0YXRpYyBhZDE4MTZfaW5mbyBkZXZfaW5mb1tNQVhfQVVESU9fREVWXTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGZ1bmN0aW9ucyBmb3IgZWFzaWVyIGFjY2VzcyB0byBpbmRlcmVjdCByZWdpc3RlcnMgKi8KKworc3RhdGljIGludCBhZF9yZWFkIChhZDE4MTZfaW5mbyAqIGRldmMsIGludCByZWcpCit7CisJaW50IHJlc3VsdDsKKwkKKwlDSEVDS19GT1JfUE9XRVI7CisJb3V0YiAoKHVuc2lnbmVkIGNoYXIpIChyZWcgJiAweDNmKSwgZGV2Yy0+YmFzZSswKTsKKwlyZXN1bHQgPSBpbmIoZGV2Yy0+YmFzZSsyKTsKKwlyZXN1bHQrPSBpbmIoZGV2Yy0+YmFzZSszKTw8ODsKKwlyZXR1cm4gKHJlc3VsdCk7Cit9CisKKworc3RhdGljIHZvaWQgYWRfd3JpdGUgKGFkMTgxNl9pbmZvICogZGV2YywgaW50IHJlZywgaW50IGRhdGEpCit7CisJQ0hFQ0tfRk9SX1BPV0VSOworCW91dGIgKCh1bnNpZ25lZCBjaGFyKSAocmVnICYgMHhmZiksIGRldmMtPmJhc2UrMCk7CisJb3V0YiAoKHVuc2lnbmVkIGNoYXIpIChkYXRhICYgMHhmZiksZGV2Yy0+YmFzZSsyKTsKKwlvdXRiICgodW5zaWduZWQgY2hhcikgKChkYXRhPj44KSYweGZmKSxkZXZjLT5iYXNlKzMpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGZ1bmN0aW9uIGludGVyZmFjZSByZXF1aXJlZCBieSBzdHJ1Y3QgYXVkaW9fZHJpdmVyICovCisKK3N0YXRpYyB2b2lkIGFkMTgxNl9oYWx0X2lucHV0IChpbnQgZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyOworCQorCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogaGFsdF9pbnB1dCBjYWxsZWRcbiIpKTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7IAorCQorCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkgeworCSAgICAgICAgZGlzYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEpOworCX0KKwkKKwlidWZmZXI9aW5iKGRldmMtPmJhc2UrOSk7CisJaWYgKGJ1ZmZlciAmIDB4MDEpIHsKKwkJLyogZGlzYWJsZSBjYXB0dXJlICovCisJCW91dGIoYnVmZmVyICYgfjB4MDEsZGV2Yy0+YmFzZSs5KTsgCisJfQorCisJaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KSB7CisJICAgICAgICBlbmFibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hKTsKKwl9CisKKwkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisJb3V0YiAofjB4NDAsIGRldmMtPmJhc2UrMSk7CQorCQorCWRldmMtPmF1ZGlvX21vZGUgJj0gflBDTV9FTkFCTEVfSU5QVVQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTgxNl9oYWx0X291dHB1dCAoaW50IGRldikKK3sKKwl1bnNpZ25lZCBsb25nICBmbGFnczsKKwlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJCisJdW5zaWduZWQgY2hhciBidWZmZXI7CisKKwlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IGhhbHRfb3V0cHV0IGNhbGxlZCFcbiIpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsgCisJLyogTXV0ZSBwY20gb3V0cHV0ICovCisJYWRfd3JpdGUoZGV2YywgNCwgYWRfcmVhZChkZXZjLDQpfDB4ODA4MCk7CisKKwlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpIHsKKwkgICAgICAgIGRpc2FibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSk7CisJfQorCisJYnVmZmVyPWluYihkZXZjLT5iYXNlKzgpOworCWlmIChidWZmZXIgJiAweDAxKSB7CisJCS8qIGRpc2FibGUgY2FwdHVyZSAqLworCQlvdXRiKGJ1ZmZlciAmIH4weDAxLGRldmMtPmJhc2UrOCk7IAorCX0KKworCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkgeworCSAgICAgICAgZW5hYmxlX2RtYShhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEpOworCX0KKworCS8qIENsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKwlvdXRiICgodW5zaWduZWQgY2hhcil+MHg4MCwgZGV2Yy0+YmFzZSsxKTsJCisKKwlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWQxODE2X291dHB1dF9ibG9jayAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIAorCQkJCSBpbnQgY291bnQsIGludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgY250OworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwkKKwlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IG91dHB1dF9ibG9jayBjYWxsZWQgYnVmPSVsZCBjb3VudD0lZCBmbGFncz0lZFxuIixidWYsY291bnQsaW50cmZsYWcpKTsKKyAgCisJY250ID0gY291bnQvNCAtIDE7CisgIAorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkKKwkvKiBzZXQgdHJhbnNmZXIgY291bnQgKi8KKwlhZF93cml0ZSAoZGV2YywgOCwgY250ICYgMHhmZmZmKTsgCisJCisJZGV2Yy0+YXVkaW9fbW9kZSB8PSBQQ01fRU5BQkxFX09VVFBVVDsgCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgYWQxODE2X3N0YXJ0X2lucHV0IChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IGNvdW50LAorCQkJCWludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgIGNudDsKKwlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJCisJREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBzdGFydF9pbnB1dCBjYWxsZWQgYnVmPSVsZCBjb3VudD0lZCBmbGFncz0lZFxuIixidWYsY291bnQsaW50cmZsYWcpKTsKKworCWNudCA9IGNvdW50LzQgLSAxOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCisJLyogc2V0IHRyYW5zZmVyIGNvdW50ICovCisJYWRfd3JpdGUgKGRldmMsIDEwLCBjbnQgJiAweGZmZmYpOyAKKwlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYWQxODE2X3ByZXBhcmVfZm9yX2lucHV0IChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZnJlcTsKKwlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJdW5zaWduZWQgY2hhciBmbXRfYml0czsKKwkKKwlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IHByZXBhcmVfZm9yX2lucHV0IGNhbGxlZDogYnNpemU9JWQgYmNvdW50PSVkXG4iLGJzaXplLGJjb3VudCkpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWZtdF9iaXRzPSAoZGV2Yy0+Zm9ybWF0X2JpdHMmMHg3KTw8MzsKKwkKKwkvKiBzZXQgbW9uby9zdGVyZW8gbW9kZSAqLworCWlmIChkZXZjLT5jaGFubmVscyA+IDEpIHsKKwkJZm10X2JpdHMgfD0weDQ7CisJfQorCS8qIHNldCBNb25vL1N0ZXJlbyBpbiBwbGF5YmFjay9jYXB0dXJlIHJlZ2lzdGVyICovCisJb3V0YiggKGluYihkZXZjLT5iYXNlKzgpICYgfjB4M0MpfGZtdF9iaXRzLCBkZXZjLT5iYXNlKzgpOyAKKwlvdXRiKCAoaW5iKGRldmMtPmJhc2UrOSkgJiB+MHgzQyl8Zm10X2JpdHMsIGRldmMtPmJhc2UrOSk7CisKKwlmcmVxPSgodW5zaWduZWQgaW50KWRldmMtPnNwZWVkKjMzMDAwKS9hZDE4MTZfY2xvY2tmcmVxOyAKKworCS8qIHdyaXRlIHBsYXliYWNrL2NhcHR1cmUgc3BlZWRzICovCisJYWRfd3JpdGUgKGRldmMsIDIsIGZyZXEgJiAweGZmZmYpOwkKKwlhZF93cml0ZSAoZGV2YywgMywgZnJlcSAmIDB4ZmZmZik7CQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwlhZDE4MTZfaGFsdF9pbnB1dChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkMTgxNl9wcmVwYXJlX2Zvcl9vdXRwdXQgKGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBmcmVxOworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBjaGFyIGZtdF9iaXRzOworCisJREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBwcmVwYXJlX2Zvcl9vdXRwdXQgY2FsbGVkOiBic2l6ZT0lZCBiY291bnQ9JWRcbiIsYnNpemUsYmNvdW50KSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwlmbXRfYml0cz0gKGRldmMtPmZvcm1hdF9iaXRzJjB4Nyk8PDM7CisJLyogc2V0IG1vbm8vc3RlcmVvIG1vZGUgKi8KKwlpZiAoZGV2Yy0+Y2hhbm5lbHMgPiAxKSB7CisJCWZtdF9iaXRzIHw9MHg0OworCX0KKworCS8qIHdyaXRlIGZvcm1hdCBiaXRzIHRvIHBsYXliYWNrL2NhcHR1cmUgcmVnaXN0ZXJzICovCisJb3V0YiggKGluYihkZXZjLT5iYXNlKzgpICYgfjB4M0MpfGZtdF9iaXRzLCBkZXZjLT5iYXNlKzgpOyAKKwlvdXRiKCAoaW5iKGRldmMtPmJhc2UrOSkgJiB+MHgzQyl8Zm10X2JpdHMsIGRldmMtPmJhc2UrOSk7CisgIAorCWZyZXE9KCh1bnNpZ25lZCBpbnQpZGV2Yy0+c3BlZWQqMzMwMDApL2FkMTgxNl9jbG9ja2ZyZXE7IAorCQorCS8qIHdyaXRlIHBsYXliYWNrL2NhcHR1cmUgc3BlZWRzICovCisJYWRfd3JpdGUgKGRldmMsIDIsIGZyZXEgJiAweGZmZmYpOworCWFkX3dyaXRlIChkZXZjLCAzLCBmcmVxICYgMHhmZmZmKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQorCWFkMTgxNl9oYWx0X291dHB1dChkZXYpOworCXJldHVybiAwOworCit9CisKK3N0YXRpYyB2b2lkIGFkMTgxNl90cmlnZ2VyIChpbnQgZGV2LCBpbnQgc3RhdGUpIAoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiB0cmlnZ2VyIGNhbGxlZCEgKGRldmM9JWQsZGV2Yy0+YmFzZT0lZFxuIiwgZGV2YywgZGV2Yy0+YmFzZSkpOworCisJLyogbW9kZSBtYXkgaGF2ZSBjaGFuZ2VkICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwkvKiBtYXNrIG91dCBtb2RlcyBub3Qgc3BlY2lmaWVkIG9uIG9wZW4gY2FsbCAqLworCXN0YXRlICY9IGRldmMtPmF1ZGlvX21vZGU7IAorCQkJCQorCS8qIHNldHVwIHNvdW5kY2hpcCB0byBuZXcgaW8tbW9kZSAqLworCWlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJLyogZW5hYmxlIGNhcHR1cmUgKi8KKwkJb3V0YihpbmIoZGV2Yy0+YmFzZSs5KXwweDAxLCBkZXZjLT5iYXNlKzkpOworCX0gZWxzZSB7CisJCS8qIGRpc2FibGUgY2FwdHVyZSAqLworCQlvdXRiKGluYihkZXZjLT5iYXNlKzkpJn4weDAxLCBkZXZjLT5iYXNlKzkpOworCX0KKworCWlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCS8qIGVuYWJsZSBwbGF5YmFjayAqLworCQlvdXRiKGluYihkZXZjLT5iYXNlKzgpfDB4MDEsIGRldmMtPmJhc2UrOCk7CisJCS8qIHVubXV0ZSBwY20gb3V0cHV0ICovCisJCWFkX3dyaXRlKGRldmMsIDQsIGFkX3JlYWQoZGV2Yyw0KSZ+MHg4MDgwKTsKKwl9IGVsc2UgeworCQkvKiBtdXRlIHBjbSBvdXRwdXQgKi8KKwkJYWRfd3JpdGUoZGV2YywgNCwgYWRfcmVhZChkZXZjLDQpfDB4ODA4MCk7CisJCS8qIGRpc2FibGUgY2FwdHVyZSAqLworCQlvdXRiKGluYihkZXZjLT5iYXNlKzgpJn4weDAxLCBkZXZjLT5iYXNlKzgpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworCisvKiBoYWx0IGlucHV0ICYgb3V0cHV0ICovCitzdGF0aWMgdm9pZCBhZDE4MTZfaGFsdCAoaW50IGRldikKK3sKKwlhZDE4MTZfaGFsdF9pbnB1dChkZXYpOworCWFkMTgxNl9oYWx0X291dHB1dChkZXYpOworfQorCitzdGF0aWMgdm9pZCBhZDE4MTZfcmVzZXQgKGludCBkZXYpCit7CisJYWQxODE2X2hhbHQgKGRldik7Cit9CisKKy8qIHNldCBwbGF5YmFjayBzcGVlZCAqLworc3RhdGljIGludCBhZDE4MTZfc2V0X3NwZWVkIChpbnQgZGV2LCBpbnQgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGZyZXE7CisJaW50IHJldDsKKworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWlmIChhcmcgPT0gMCkgeworCQlyZXQgPSBkZXZjLT5zcGVlZDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiByYW5nZSBjaGVja2luZyAqLworCWlmIChhcmcgPCA0MDAwKSB7CisJCWFyZyA9IDQwMDA7CisJfQorCWlmIChhcmcgPiA1NTAwMCkgeworCQlhcmcgPSA1NTAwMDsKKwl9CisJZGV2Yy0+c3BlZWQgPSBhcmc7CisKKwkvKiBjaGFuZ2Ugc3BlZWQgZHVyaW5nIHBsYXliYWNrICovCisJZnJlcT0oKHVuc2lnbmVkIGludClkZXZjLT5zcGVlZCozMzAwMCkvYWQxODE2X2Nsb2NrZnJlcTsgCisJLyogd3JpdGUgcGxheWJhY2svY2FwdHVyZSBzcGVlZHMgKi8KKwlhZF93cml0ZSAoZGV2YywgMiwgZnJlcSAmIDB4ZmZmZik7CQorCWFkX3dyaXRlIChkZXZjLCAzLCBmcmVxICYgMHhmZmZmKTsJCisKKwlyZXQgPSBkZXZjLT5zcGVlZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKKworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGFkMTgxNl9zZXRfYml0cyAoaW50IGRldiwgdW5zaWduZWQgaW50IGFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwkKKwlzdGF0aWMgc3RydWN0IGZvcm1hdF90YmwgeworCQlpbnQgICAgICAgICAgICAgZm9ybWF0OworCQl1bnNpZ25lZCBjaGFyICAgYml0czsKKwl9IGZvcm1hdDJiaXRzW10gPSB7CisJCXsgMCwgMCB9LAorCQl7IEFGTVRfTVVfTEFXLCAxIH0sCisJCXsgQUZNVF9BX0xBVywgMyB9LAorCQl7IEFGTVRfSU1BX0FEUENNLCAwIH0sCisJCXsgQUZNVF9VOCwgMCB9LAorCQl7IEFGTVRfUzE2X0xFLCAyIH0sCisJCXsgQUZNVF9TMTZfQkUsIDYgfSwKKwkJeyBBRk1UX1M4LCAwIH0sCisJCXsgQUZNVF9VMTZfTEUsIDAgfSwKKwkJeyBBRk1UX1UxNl9CRSwgMCB9CisgIAl9OworCisJaW50ICBpLCBuID0gc2l6ZW9mIChmb3JtYXQyYml0cykgLyBzaXplb2YgKHN0cnVjdCBmb3JtYXRfdGJsKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJLyogcmV0dXJuIGN1cnJlbnQgZm9ybWF0ICovCisJaWYgKGFyZyA9PSAwKSB7CisJICAJYXJnID0gZGV2Yy0+YXVkaW9fZm9ybWF0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBhcmc7CisJfQorCWRldmMtPmF1ZGlvX2Zvcm1hdCA9IGFyZzsKKworCS8qIHNlYXJjaCBtYXRjaGluZyBmb3JtYXQgYml0cyAqLworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJCWlmIChmb3JtYXQyYml0c1tpXS5mb3JtYXQgPT0gYXJnKSB7CisJCQlkZXZjLT5mb3JtYXRfYml0cyA9IGZvcm1hdDJiaXRzW2ldLmJpdHM7CisJCQlkZXZjLT5hdWRpb19mb3JtYXQgPSBhcmc7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gYXJnOworCQl9CisKKwkvKiBTdGlsbCBoYW5naW5nIGhlcmUuIFNvbWV0aGluZyBtdXN0IGJlIHRlcnJpYmx5IHdyb25nICovCisJZGV2Yy0+Zm9ybWF0X2JpdHMgPSAwOworCWRldmMtPmF1ZGlvX2Zvcm1hdCA9IEFGTVRfVTg7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCXJldHVybihBRk1UX1U4KTsgCit9CisKK3N0YXRpYyBzaG9ydCBhZDE4MTZfc2V0X2NoYW5uZWxzIChpbnQgZGV2LCBzaG9ydCBhcmcpCit7CisJYWQxODE2X2luZm8gICAgKmRldmMgPSAoYWQxODE2X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGFyZyAhPSAxICYmIGFyZyAhPSAyKQorCQlyZXR1cm4gZGV2Yy0+Y2hhbm5lbHM7CisKKwlkZXZjLT5jaGFubmVscyA9IGFyZzsKKwlyZXR1cm4gYXJnOworfQorCisvKiBvcGVuIGRldmljZSAqLworc3RhdGljIGludCBhZDE4MTZfb3BlbiAoaW50IGRldiwgaW50IG1vZGUpIAoreworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwkvKiBpcyBkZXZpY2UgbnVtYmVyIHZhbGlkID8gKi8KKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX2F1ZGlvZGV2cykKKwkJcmV0dXJuIC0oRU5YSU8pOworCisJLyogZ2V0IGRldmljZSBpbmZvIG9mIHRoaXMgZGV2ICovCisJZGV2YyA9IChhZDE4MTZfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7IAorCisJLyogbWFrZSBjaGVjayBpZiBkZXZpY2UgYWxyZWFkeSBvcGVuIGF0b21pYyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWlmIChkZXZjLT5vcGVuZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCXJldHVybiAtKEVCVVNZKTsKKwl9CisKKwkvKiBtYXJrIGRldmljZSBhcyBvcGVuICovCisJZGV2Yy0+b3BlbmVkID0gMTsgCisKKwlkZXZjLT5hdWRpb19tb2RlID0gMDsKKwlkZXZjLT5zcGVlZCA9IDgwMDA7CisJZGV2Yy0+YXVkaW9fZm9ybWF0PUFGTVRfVTg7CisJZGV2Yy0+Y2hhbm5lbHM9MTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlhZDE4MTZfcmVzZXQoZGV2Yy0+ZGV2X25vKTsgLyogaGFsdCBhbGwgcGVuZGluZyBvdXRwdXQgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWQxODE2X2Nsb3NlIChpbnQgZGV2KSAvKiBjbG9zZSBkZXZpY2UgKi8KK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gKGFkMTgxNl9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCS8qIGhhbHQgYWxsIHBlbmRpbmcgb3V0cHV0ICovCisJYWQxODE2X3Jlc2V0KGRldmMtPmRldl9ubyk7IAorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWRldmMtPm9wZW5lZCA9IDA7CisJZGV2Yy0+YXVkaW9fbW9kZSA9IDA7CisJZGV2Yy0+c3BlZWQgPSA4MDAwOworCWRldmMtPmF1ZGlvX2Zvcm1hdD1BRk1UX1U4OworCWRldmMtPmZvcm1hdF9iaXRzID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEF1ZGlvIGRyaXZlciBzdHJ1Y3R1cmUgKi8KKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgYWQxODE2X2F1ZGlvX2RyaXZlciA9Cit7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gYWQxODE2X29wZW4sCisJLmNsb3NlCQkJPSBhZDE4MTZfY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBhZDE4MTZfb3V0cHV0X2Jsb2NrLAorCS5zdGFydF9pbnB1dAkJPSBhZDE4MTZfc3RhcnRfaW5wdXQsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gYWQxODE2X3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBhZDE4MTZfcHJlcGFyZV9mb3Jfb3V0cHV0LAorCS5oYWx0X2lvCQk9IGFkMTgxNl9oYWx0LAorCS5oYWx0X2lucHV0CQk9IGFkMTgxNl9oYWx0X2lucHV0LAorCS5oYWx0X291dHB1dAkJPSBhZDE4MTZfaGFsdF9vdXRwdXQsCisJLnRyaWdnZXIJCT0gYWQxODE2X3RyaWdnZXIsCisJLnNldF9zcGVlZAkJPSBhZDE4MTZfc2V0X3NwZWVkLAorCS5zZXRfYml0cwkJPSBhZDE4MTZfc2V0X2JpdHMsCisJLnNldF9jaGFubmVscwkJPSBhZDE4MTZfc2V0X2NoYW5uZWxzLAorfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEludGVycnVwdCBoYW5kbGVyICovCisKKworc3RhdGljIGlycXJldHVybl90IGFkMTgxNl9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KQoreworCXVuc2lnbmVkIGNoYXIJc3RhdHVzOworCWFkMTgxNl9pbmZvCSpkZXZjID0gKGFkMTgxNl9pbmZvICopZGV2X2lkOworCQorCWlmIChpcnEgPCAwIHx8IGlycSA+IDE1KSB7CisJICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IEdvdCBib2d1cyBpbnRlcnJ1cHQgJWRcbiIsIGlycSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlzcGluX2xvY2soJmRldmMtPmxvY2spOworCisJLyogcmVhZCBpbnRlcnJ1cHQgcmVnaXN0ZXIgKi8KKwlzdGF0dXMgPSBpbmIgKGRldmMtPmJhc2UrMSk7IAorCS8qIENsZWFyIGFsbCBpbnRlcnJ1cHQgICovCisJb3V0YiAofnN0YXR1cywgZGV2Yy0+YmFzZSsxKTsJCisKKwlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IEdvdCBpbnRlcnJ1cHQgc3ViY2xhc3MgJWRcbiIsc3RhdHVzKSk7CisKKwlpZiAoc3RhdHVzID09IDApIHsKKwkJREVCVUdOT0lTRShwcmludGsoS0VSTl9ERUJVRyAiYWQxODE2OiBpbnRlcnJ1cHQ6IEdvdCBpbnRlcnJ1cHQsIGJ1dCBubyBzb3VyY2UuXG4iKSk7CisJCXNwaW5fdW5sb2NrKCZkZXZjLT5sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChkZXZjLT5vcGVuZWQgJiYgKGRldmMtPmF1ZGlvX21vZGUgJiBQQ01fRU5BQkxFX0lOUFVUKSAmJiAoc3RhdHVzJjY0KSkKKwkJRE1BYnVmX2lucHV0aW50ciAoZGV2Yy0+ZGV2X25vKTsKKworCWlmIChkZXZjLT5vcGVuZWQgJiYgKGRldmMtPmF1ZGlvX21vZGUgJiBQQ01fRU5BQkxFX09VVFBVVCkgJiYgKHN0YXR1cyAmIDEyOCkpCisJCURNQWJ1Zl9vdXRwdXRpbnRyIChkZXZjLT5kZXZfbm8sIDEpOworCisJc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBNaXhlciBzdHVmZiAqLworCitzdHJ1Y3QgbWl4ZXJfZGVmIHsKKwl1bnNpZ25lZCBpbnQgcmVnbm86IDc7CisJdW5zaWduZWQgaW50IHBvbGFyaXR5OjE7CS8qIDA9bm9ybWFsLCAxPXJldmVyc2VkICovCisJdW5zaWduZWQgaW50IGJpdHBvczo0OworCXVuc2lnbmVkIGludCBuYml0czo0OworfTsKKworc3RhdGljIGNoYXIgbWl4X2N2dFsxMDFdID0geworCSAwLCAwLCAzLCA3LDEwLDEzLDE2LDE5LDIxLDIzLDI2LDI4LDMwLDMyLDM0LDM1LDM3LDM5LDQwLDQyLAorCTQzLDQ1LDQ2LDQ3LDQ5LDUwLDUxLDUyLDUzLDU1LDU2LDU3LDU4LDU5LDYwLDYxLDYyLDYzLDY0LDY1LAorCTY1LDY2LDY3LDY4LDY5LDcwLDcwLDcxLDcyLDczLDczLDc0LDc1LDc1LDc2LDc3LDc3LDc4LDc5LDc5LAorCTgwLDgxLDgxLDgyLDgyLDgzLDg0LDg0LDg1LDg1LDg2LDg2LDg3LDg3LDg4LDg4LDg5LDg5LDkwLDkwLAorCTkxLDkxLDkyLDkyLDkzLDkzLDk0LDk0LDk1LDk1LDk2LDk2LDk2LDk3LDk3LDk4LDk4LDk4LDk5LDk5LAorCTEwMAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4ZXJfZGVmIG1peGVyX2VudDsKKworLyoKKyAqIE1vc3Qgb2YgdGhlIG1peGVyIGVudHJpZXMgd29yayBpbiBiYWNrd2FyZHMuIFNldHRpbmcgdGhlIHBvbGFyaXR5IGZpZWxkCisgKiBtYWtlcyB0aGVtIHRvIHdvcmsgY29ycmVjdGx5LgorICoKKyAqIFRoZSBjaGFubmVsIG51bWJlcmluZyB1c2VkIGJ5IGluZGl2aWR1YWwgc291bmRjYXJkcyBpcyBub3QgZml4ZWQuIFNvbWUKKyAqIGNhcmRzIGhhdmUgYXNzaWduZWQgZGlmZmVyZW50IG1lYW5pbmdzIGZvciB0aGUgQVVYMSwgQVVYMiBhbmQgTElORSBpbnB1dHMuCisgKiBUaGUgY3VycmVudCB2ZXJzaW9uIGRvZXNuJ3QgdHJ5IHRvIGNvbXBlbnNhdGUgdGhpcy4KKyAqLworCisjZGVmaW5lIE1JWF9FTlQobmFtZSwgcmVnX2wsIHBvbGFfbCwgcG9zX2wsIGxlbl9sLCByZWdfciwgcG9sYV9yLCBwb3NfciwgbGVuX3IpCVwKKyAge3tyZWdfbCwgcG9sYV9sLCBwb3NfbCwgbGVuX2x9LCB7cmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yfX0KKworCittaXhlcl9lbnQgbWl4X2RldmljZXNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXVsyXSA9IHsKK01JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkxNCwgMSwgOCwgNSwJMTQsIDEsIDAsIDUpLAorTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9UUkVCTEUsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkgNSwgMSwgOCwgNiwJIDUsIDEsIDAsIDYpLAorTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCSA0LCAxLCA4LCA2LAkgNCwgMSwgMCwgNiksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NQRUFLRVIsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTE4LCAxLCA4LCA1LAkxOCwgMSwgMCwgNSksCitNSVhfRU5UKFNPVU5EX01JWEVSX01JQywJMTksIDEsIDgsIDUsCTE5LCAxLCAwLCA1KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQ0QsCSAJMTUsIDEsIDgsIDUsCTE1LCAxLCAwLCA1KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQUxUUENNLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCTIwLCAwLCA4LCA0LAkyMCwgMCwgMCwgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9PR0FJTiwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsIAkxNywgMSwgOCwgNSwJMTcsIDEsIDAsIDUpLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMiwJMTYsIDEsIDgsIDUsCTE2LCAxLCAwLCA1KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsICAgICAgMzksIDAsIDksIDQsICAgIDM5LCAxLCAwLCA1KQorfTsKKworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZGVmYXVsdF9taXhlcl9sZXZlbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9Cit7CisJMHg0MzQzLAkJLyogTWFzdGVyIFZvbHVtZSAqLworCTB4MzIzMiwJCS8qIEJhc3MgKi8KKwkweDMyMzIsCQkvKiBUcmVibGUgKi8KKwkweDAwMDAsCQkvKiBGTSAqLworCTB4NDM0MywJCS8qIFBDTSAqLworCTB4MDAwMCwJCS8qIFBDIFNwZWFrZXIgKi8KKwkweDAwMDAsCQkvKiBFeHQgTGluZSAqLworCTB4MDAwMCwJCS8qIE1pYyAqLworCTB4MDAwMCwJCS8qIENEICovCisJMHgwMDAwLAkJLyogUmVjb3JkaW5nIG1vbml0b3IgKi8KKwkweDAwMDAsCQkvKiBTQiBQQ00gKi8KKwkweDAwMDAsCQkvKiBSZWNvcmRpbmcgbGV2ZWwgKi8KKwkweDAwMDAsCQkvKiBJbnB1dCBnYWluICovCisJMHgwMDAwLAkJLyogT3V0cHV0IGdhaW4gKi8KKwkweDAwMDAsCQkvKiBMaW5lMSAqLworCTB4MDAwMCwJCS8qIExpbmUyICovCisJMHgwMDAwCQkvKiBMaW5lMyAodXN1YWxseSBsaW5lIGluKSovCit9OworCisjZGVmaW5lIExFRlRfQ0hOCTAKKyNkZWZpbmUgUklHSFRfQ0hOCTEKKworCisKK3N0YXRpYyBpbnQKK2FkMTgxNl9zZXRfcmVjbWFzayAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgbWFzaykKK3sKKyAgCXVuc2lnbmVkIGxvbmcgCWZsYWdzOworCXVuc2lnbmVkIGNoYXIgICByZWNkZXY7CisJaW50ICAgICAgICAgICAgIGksIG47CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwltYXNrICY9IGRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlczsKKwkKKwluID0gMDsKKwkvKiBDb3VudCBzZWxlY3RlZCBkZXZpY2UgYml0cyAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlpZiAobWFzayAmICgxIDw8IGkpKQorCQkJbisrOworCQorCWlmIChuID09IDApCisJCW1hc2sgPSBTT1VORF9NQVNLX01JQzsKKwllbHNlIGlmIChuICE9IDEpIHsgLyogVG9vIG1hbnkgZGV2aWNlcyBzZWxlY3RlZCAqLworCQkvKiBGaWx0ZXIgb3V0IGFjdGl2ZSBzZXR0aW5ncyAqLworCQltYXNrICY9IH5kZXZjLT5yZWNtYXNrOwkKKwkJCisJCW4gPSAwOworCQkvKiBDb3VudCBzZWxlY3RlZCBkZXZpY2UgYml0cyAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgCisJCQlpZiAobWFzayAmICgxIDw8IGkpKQorCQkJCW4rKzsKKwkJCisJCWlmIChuICE9IDEpCisJCQltYXNrID0gU09VTkRfTUFTS19NSUM7CisJfQorCQorCXN3aXRjaCAobWFzaykgeworCWNhc2UgU09VTkRfTUFTS19NSUM6CisJCXJlY2RldiA9IDU7CisJCWJyZWFrOworCQkKKwljYXNlIFNPVU5EX01BU0tfTElORToKKwkJcmVjZGV2ID0gMDsKKwkJYnJlYWs7CisJCQorCWNhc2UgU09VTkRfTUFTS19DRDoKKwkJcmVjZGV2ID0gMjsKKwkJYnJlYWs7CisJCQorCWNhc2UgU09VTkRfTUFTS19MSU5FMToKKwkJcmVjZGV2ID0gNDsKKwkJYnJlYWs7CisJCQorCWNhc2UgU09VTkRfTUFTS19MSU5FMjoKKwkJcmVjZGV2ID0gMzsKKwkJYnJlYWs7CisJCQorCWNhc2UgU09VTkRfTUFTS19WT0xVTUU6CisJCXJlY2RldiA9IDE7CisJCWJyZWFrOworCQkKKwlkZWZhdWx0OgorCQltYXNrID0gU09VTkRfTUFTS19NSUM7CisJCXJlY2RldiA9IDU7CisJfQorCQorCXJlY2RldiA8PD0gNDsKKwlhZF93cml0ZSAoZGV2YywgMjAsIAorCQkgIChhZF9yZWFkIChkZXZjLCAyMCkgJiAweDhmOGYpIHwgcmVjZGV2IHwgKHJlY2Rldjw8OCkpOworCisJZGV2Yy0+cmVjbWFzayA9IG1hc2s7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgdm9pZAorY2hhbmdlX2JpdHMgKGludCAqcmVndmFsLCBpbnQgZGV2LCBpbnQgY2huLCBpbnQgbmV3dmFsKQoreworCXVuc2lnbmVkIGNoYXIgICBtYXNrOworCWludCAgICAgICAgICAgICBzaGlmdDsKKyAgCisJLyogUmV2ZXJzZSBwb2xhcml0eSovCisKKwlpZiAobWl4X2RldmljZXNbZGV2XVtjaG5dLnBvbGFyaXR5ID09IDEpIAorCQluZXd2YWwgPSAxMDAgLSBuZXd2YWw7CisKKwltYXNrID0gKDEgPDwgbWl4X2RldmljZXNbZGV2XVtjaG5dLm5iaXRzKSAtIDE7CisJc2hpZnQgPSBtaXhfZGV2aWNlc1tkZXZdW2Nobl0uYml0cG9zOworCS8qIFNjYWxlIGl0ICovCisJbmV3dmFsID0gKGludCkgKChuZXd2YWwgKiBtYXNrKSArIDUwKSAvIDEwMDsJCisJLyogQ2xlYXIgYml0cyAqLworCSpyZWd2YWwgJj0gfihtYXNrIDw8IHNoaWZ0KTsJCisJLyogU2V0IG5ldyB2YWx1ZSAqLworCSpyZWd2YWwgfD0gKG5ld3ZhbCAmIG1hc2spIDw8IHNoaWZ0OwkKK30KKworc3RhdGljIGludAorYWQxODE2X21peGVyX2dldCAoYWQxODE2X2luZm8gKiBkZXZjLCBpbnQgZGV2KQoreworCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogbWl4ZXJfZ2V0IGNhbGxlZCFcbiIpKTsKKwkKKwkvKiByYW5nZSBjaGVjayArIHN1cHBvcnRlZCBtaXhlciBjaGVjayAqLworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgKQorCSAgICAgICAgcmV0dXJuICgtKEVJTlZBTCkpOworCWlmICghKCgxIDw8IGRldikgJiBkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcykpCisJCXJldHVybiAtKEVJTlZBTCk7CisJCisJcmV0dXJuIGRldmMtPmxldmVsc1tkZXZdOworfQorCitzdGF0aWMgaW50CithZDE4MTZfbWl4ZXJfc2V0IChhZDE4MTZfaW5mbyAqIGRldmMsIGludCBkZXYsIGludCB2YWx1ZSkKK3sKKwlpbnQgICBsZWZ0ID0gdmFsdWUgJiAweDAwMDAwMGZmOworCWludCAgIHJpZ2h0ID0gKHZhbHVlICYgMHgwMDAwZmYwMCkgPj4gODsKKwlpbnQgICByZXR2b2w7CisKKwlpbnQgICByZWdvZmZzOworCWludCAgIHZhbDsKKwlpbnQgICB2YWxtdXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlERUJVR05PSVNFKHByaW50ayhLRVJOX0RFQlVHICJhZDE4MTY6IG1peGVyX3NldCBjYWxsZWQhXG4iKSk7CisJCisJaWYgKGRldiA8IDAgfHwgZGV2ID49IFNPVU5EX01JWEVSX05SREVWSUNFUyApCisJCXJldHVybiAtKEVJTlZBTCk7CisKKwlpZiAobGVmdCA+IDEwMCkKKwkJbGVmdCA9IDEwMDsKKwlpZiAobGVmdCA8IDApCisJCWxlZnQgPSAwOworCWlmIChyaWdodCA+IDEwMCkKKwkJcmlnaHQgPSAxMDA7CisJaWYgKHJpZ2h0IDwgMCkKKwkJcmlnaHQgPSAwOworCQorCS8qIE1vbm8gY29udHJvbCAqLworCWlmIChtaXhfZGV2aWNlc1tkZXZdW1JJR0hUX0NITl0ubmJpdHMgPT0gMCkgCisJCXJpZ2h0ID0gbGVmdDsKKwlyZXR2b2wgPSBsZWZ0IHwgKHJpZ2h0IDw8IDgpOworCQorCS8qIFNjYWxlIGl0ICovCisJCisJbGVmdCA9IG1peF9jdnRbbGVmdF07CisJcmlnaHQgPSBtaXhfY3Z0W3JpZ2h0XTsKKworCS8qIHJlamVjdCBhbGwgbWl4ZXJzIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgKi8KKwlpZiAoIShkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmICgxIDw8IGRldikpKQorCQlyZXR1cm4gLShFSU5WQUwpOworCQorCS8qIHNhbml0eSBjaGVjayAqLworCWlmIChtaXhfZGV2aWNlc1tkZXZdW0xFRlRfQ0hOXS5uYml0cyA9PSAwKQorCQlyZXR1cm4gLShFSU5WQUwpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisKKwkvKiBrZWVwIHByZWNpc2Ugdm9sdW1lIGludGVybmFsICovCisJZGV2Yy0+bGV2ZWxzW2Rldl0gPSByZXR2b2w7CisKKwkvKiBTZXQgdGhlIGxlZnQgY2hhbm5lbCAqLworCXJlZ29mZnMgPSBtaXhfZGV2aWNlc1tkZXZdW0xFRlRfQ0hOXS5yZWdubzsKKwl2YWwgPSBhZF9yZWFkIChkZXZjLCByZWdvZmZzKTsKKwljaGFuZ2VfYml0cyAoJnZhbCwgZGV2LCBMRUZUX0NITiwgbGVmdCk7CisKKwl2YWxtdXRlPXZhbDsKKworCS8qIE11dGUgYml0IG1hc2tpbmcgb24gc29tZSByZWdpc3RlcnMgKi8KKwlpZiAoIHJlZ29mZnM9PTUgfHwgcmVnb2Zmcz09MTQgfHwgcmVnb2Zmcz09MTUgfHwKKwkgICAgIHJlZ29mZnM9PTE2IHx8IHJlZ29mZnM9PTE3IHx8IHJlZ29mZnM9PTE4IHx8IAorCSAgICAgcmVnb2Zmcz09MTkgfHwgcmVnb2Zmcz09MzkpIHsKKwkJaWYgKGxlZnQ9PTApCisJCQl2YWxtdXRlIHw9IDB4ODAwMDsKKwkJZWxzZQorCQkJdmFsbXV0ZSAmPSB+MHg4MDAwOworCX0KKwlhZF93cml0ZSAoZGV2YywgcmVnb2ZmcywgdmFsbXV0ZSk7IC8qIG11dGUgKi8KKworCS8qCisJICogU2V0IHRoZSByaWdodCBjaGFubmVsCisJICovCisgCisJLyogV2FzIGp1c3QgYSBtb25vIGNoYW5uZWwgKi8KKwlpZiAobWl4X2RldmljZXNbZGV2XVtSSUdIVF9DSE5dLm5iaXRzID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcmV0dm9sOwkJCisJfQorCisJcmVnb2ZmcyA9IG1peF9kZXZpY2VzW2Rldl1bUklHSFRfQ0hOXS5yZWdubzsKKwl2YWwgPSBhZF9yZWFkIChkZXZjLCByZWdvZmZzKTsKKwljaGFuZ2VfYml0cyAoJnZhbCwgZGV2LCBSSUdIVF9DSE4sIHJpZ2h0KTsKKworCXZhbG11dGU9dmFsOworCWlmICggcmVnb2Zmcz09NSB8fCByZWdvZmZzPT0xNCB8fCByZWdvZmZzPT0xNSB8fAorCSAgICAgcmVnb2Zmcz09MTYgfHwgcmVnb2Zmcz09MTcgfHwgcmVnb2Zmcz09MTggfHwgCisJICAgICByZWdvZmZzPT0xOSB8fCByZWdvZmZzPT0zOSkgeworCQlpZiAocmlnaHQ9PTApCisJCQl2YWxtdXRlIHw9IDB4ODA7CisJCWVsc2UKKwkJCXZhbG11dGUgJj0gfjB4ODA7CisJfQorCWFkX3dyaXRlIChkZXZjLCByZWdvZmZzLCB2YWxtdXRlKTsgLyogbXV0ZSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAJcmV0dXJuIHJldHZvbDsKK30KKworI2RlZmluZSBNSVhFUl9ERVZJQ0VTICggU09VTkRfTUFTS19WT0xVTUUgfCBcCisJCQlTT1VORF9NQVNLX1NZTlRIIHwgXAorCQkJU09VTkRfTUFTS19QQ00gfCBcCisJCQlTT1VORF9NQVNLX0xJTkUgfCBcCisJCQlTT1VORF9NQVNLX0xJTkUxIHwgXAorCQkJU09VTkRfTUFTS19MSU5FMiB8IFwKKwkJCVNPVU5EX01BU0tfTElORTMgfCBcCisJCQlTT1VORF9NQVNLX01JQyB8IFwKKwkJCVNPVU5EX01BU0tfQ0QgfCBcCisJCQlTT1VORF9NQVNLX1JFQ0xFViAgXAorCQkJKQorI2RlZmluZSBSRUNfREVWSUNFUyAoIFNPVU5EX01BU0tfTElORTIgfFwKKwkJICAgICAgU09VTkRfTUFTS19MSU5FIHxcCisJCSAgICAgIFNPVU5EX01BU0tfTElORTEgfFwKKwkJICAgICAgU09VTkRfTUFTS19NSUMgfFwKKwkJICAgICAgU09VTkRfTUFTS19DRCB8XAorCQkgICAgICBTT1VORF9NQVNLX1ZPTFVNRSBcCisJCSAgICAgICkKKyAgICAgCitzdGF0aWMgdm9pZAorYWQxODE2X21peGVyX3Jlc2V0IChhZDE4MTZfaW5mbyAqIGRldmMpCit7CisJaW50ICBpOworCisJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSBNSVhFUl9ERVZJQ0VTOworCQorCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyA9IFJFQ19ERVZJQ0VTOworCisJZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQlpZiAoZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJiAoMSA8PCBpKSkKKwkJCWFkMTgxNl9taXhlcl9zZXQgKGRldmMsIGksIGRlZmF1bHRfbWl4ZXJfbGV2ZWxzW2ldKTsKKwlhZDE4MTZfc2V0X3JlY21hc2sgKGRldmMsIFNPVU5EX01BU0tfTUlDKTsKK30KKworc3RhdGljIGludAorYWQxODE2X21peGVyX2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKK3sKKwlhZDE4MTZfaW5mbyAgICAqZGV2YyA9IG1peGVyX2RldnNbZGV2XS0+ZGV2YzsKKwlpbnQgdmFsOworCWludCBfX3VzZXIgKnAgPSBhcmc7CisgIAorCURFQlVHTk9JU0UocHJpbnRrKEtFUk5fREVCVUcgImFkMTgxNjogbWl4ZXJfaW9jdGwgY2FsbGVkIVxuIikpOworICAKKwkvKiBNaXhlciBpb2N0bCAqLworCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpID09ICdNJykgeyAKKwkJCisJCS8qIHNldCBpb2N0bCAqLworCQlpZiAoX1NJT0NfRElSIChjbWQpICYgX1NJT0NfV1JJVEUpIHsgCisJCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpeworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQkJCisJCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXZhbD1hZDE4MTZfc2V0X3JlY21hc2sgKGRldmMsIHZhbCk7CisJCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQkJYnJlYWs7CisJCQkJCisJCQlkZWZhdWx0OgorCQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAoKHZhbD1hZDE4MTZfbWl4ZXJfc2V0IChkZXZjLCBjbWQgJiAweGZmLCB2YWwpKTwwKQorCQkJCSAgICAgICAgcmV0dXJuIHZhbDsKKwkJCQllbHNlCisJCQkJICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCX0KKwkJfSBlbHNlIHsgCisJCQkvKiByZWFkIGlvY3RsICovCisJCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpIHsKKwkJCQkKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCXZhbD1kZXZjLT5yZWNtYXNrOworCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJCXZhbD1kZXZjLT5zdXBwb3J0ZWRfZGV2aWNlczsKKwkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJCXZhbD1kZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmIH4oU09VTkRfTUFTS19TUEVBS0VSIHwgU09VTkRfTUFTS19JTUlYKTsKKwkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJCQl2YWw9ZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOworCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJCXZhbD1TT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWRlZmF1bHQ6CisJCQkgICAgICAgIGlmICgodmFsPWFkMTgxNl9taXhlcl9nZXQgKGRldmMsIGNtZCAmIDB4ZmYpKTwwKQorCQkJCSAgICAgICAgcmV0dXJuIHZhbDsKKwkJCQllbHNlCisJCQkJICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQkvKiBub3QgZm9yIG1peGVyICovCisJCXJldHVybiAtKEVJTlZBTCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogTWl4ZXIgc3RydWN0dXJlICovCisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBhZDE4MTZfbWl4ZXJfb3BlcmF0aW9ucyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWQJPSAiQUQxODE2IiwKKwkubmFtZQk9ICJBRDE4MTYgTWl4ZXIiLAorCS5pb2N0bAk9IGFkMTgxNl9taXhlcl9pb2N0bAorfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHN0dWZmIGZvciBjYXJkIHJlY29nbml0aW9uLCBpbml0IGFuZCB1bmxvYWRpbmcgUE5QIC4uLiovCisKKworLyogY2hlY2sgaWYgQUQxODE2IHByZXNlbnQgYXQgc3BlY2lmaWVkIGh3X2NvbmZpZyBhbmQgcmVnaXN0ZXIgZGV2aWNlIHdpdGggT1MgCisgKiByZXR1cm4gMSBpZiBpbml0aWFsaXphdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgMCBvdGhlcndpc2UKKyAqLworc3RhdGljIGludCBfX2luaXQgYWQxODE2X2luaXRfY2FyZCAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCAKKwlzdHJ1Y3QgcG5wX2RldiAqcG5wKQoreworCWFkMTgxNl9pbmZvICAgICpkZXZjID0gTlVMTDsKKwlpbnQgdG1wOworCWludCBvc3NfZGV2bm8gPSAtMTsKKworCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogaW5pdGlhbGl6aW5nIGNhcmQ6IGlvPTB4JXgsIGlycT0lZCwgZG1hPSVkLCAiCisJCQkgImRtYTI9JWQsIGNsb2NrZnJlcT0lZCwgb3B0aW9ucz0lZCBpc2FkbWFidWc9JWQgIgorCQkJICIlc1xuIiwKKwkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlLAorCSAgICAgICBod19jb25maWctPmlycSwKKwkgICAgICAgaHdfY29uZmlnLT5kbWEsCisJICAgICAgIGh3X2NvbmZpZy0+ZG1hMiwKKwkgICAgICAgYWQxODE2X2Nsb2NrZnJlcSwKKwkgICAgICAgb3B0aW9ucywKKwkgICAgICAgaXNhX2RtYV9icmlkZ2VfYnVnZ3ksCisJICAgICAgIHBucD8iKFBOUCkiOiIiKTsKKworCS8qIGFkMTgxNl9pbmZvIHN0cnVjdHVyZSByZW1haW5pbmcgPyAqLworCWlmIChucl9hZDE4MTZfZGV2cyA+PSBNQVhfQVVESU9fREVWKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogbm8gbW9yZSBhZDE4MTZfaW5mbyBzdHJ1Y3R1cmVzICIKKwkJCSJsZWZ0XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJZGV2YyA9ICZkZXZfaW5mb1tucl9hZDE4MTZfZGV2c107CisJZGV2Yy0+YmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKwlkZXZjLT5pcnEgPSBod19jb25maWctPmlycTsKKwlkZXZjLT5kbWFfcGxheWJhY2s9aHdfY29uZmlnLT5kbWE7CisJZGV2Yy0+ZG1hX2NhcHR1cmU9aHdfY29uZmlnLT5kbWEyOworCWRldmMtPm9wZW5lZCA9IDA7CisJZGV2Yy0+cG5wZGV2ID0gcG5wOworCXNwaW5fbG9ja19pbml0KCZkZXZjLT5sb2NrKTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oZGV2Yy0+YmFzZSwgMTYsICJBRDE4MTYgU291bmQiKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IEkvTyBwb3J0IDB4JTAzeCBub3QgZnJlZVxuIiwKKwkJCQkgICAgZGV2Yy0+YmFzZSk7CisJCWdvdG8gb3V0OworCX0KKworCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogRXhhbWluaW5nIEFEMTgxNiBhdCBhZGRyZXNzIDB4JTAzeC5cbiIsIAorCQlkZXZjLT5iYXNlKTsKKwkKKworCS8qIHRlc3RzIGZvciBhZDE4MTYgKi8KKwkvKiBiYXNlKzA6IGJpdCAxIG11c3QgYmUgc2V0IGJ1dCBub3QgMjU1ICovCisJdG1wPWluYihkZXZjLT5iYXNlKTsKKwlpZiAoICh0bXAmMHg4MCk9PTAgfHwgdG1wPT0yNTUgKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiBvciBjaGlwICIKKwkJCSJpcyBub3QgYWN0aXZlIChUZXN0IDApXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJfQorCisJLyogd3JpdGVzIHRvIGlyZWcgOCBhcmUgY29waWVkIHRvIGlyZWcgOSAqLworCWFkX3dyaXRlKGRldmMsOCwxMjM0NSk7IAorCWlmIChhZF9yZWFkKGRldmMsOSkhPTEyMzQ1KSB7CisJCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDEpXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJfQorICAKKwkvKiB3cml0ZXMgdG8gaXJlZyA4IGFyZSBjb3BpZWQgdG8gaXJlZyA5ICovCisJYWRfd3JpdGUoZGV2Yyw4LDU0MzIxKTsgCisJaWYgKGFkX3JlYWQoZGV2Yyw5KSE9NTQzMjEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBDaGlwIGlzIG5vdCBhbiBBRDE4MTYgKFRlc3QgMilcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwkvKiB3cml0ZXMgdG8gaXJlZyAxMCBhcmUgY29waWVkIHRvIGlyZWcgMTEgKi8KKwlhZF93cml0ZShkZXZjLDEwLDU0MzIxKTsgCisJaWYgKGFkX3JlYWQoZGV2YywxMSkhPTU0MzIxKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCAzKVxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0KKworCS8qIHdyaXRlcyB0byBpcmVnIDEwIGFyZSBjb3BpZWQgdG8gaXJlZyAxMSAqLworCWFkX3dyaXRlKGRldmMsMTAsMTIzNDUpOyAKKwlpZiAoYWRfcmVhZChkZXZjLDExKSE9MTIzNDUpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gImFkMTgxNjogQ2hpcCBpcyBub3QgYW4gQUQxODE2IChUZXN0IDQpXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJfQorCisJLyogYml0IGluIGJhc2UgKzEgY2Fubm90IGJlIHNldCB0byAxICovCisJdG1wPWluYihkZXZjLT5iYXNlKzEpOworCW91dGIoMHhmZixkZXZjLT5iYXNlKzEpOyAKKwlpZiAoaW5iKGRldmMtPmJhc2UrMSkhPXRtcCkgeworCQlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IENoaXAgaXMgbm90IGFuIEFEMTgxNiAoVGVzdCA1KVxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0KKyAgCisJcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBBRDE4MTYgKHZlcnNpb24gJWQpIHN1Y2Nlc3NmdWxseSBkZXRlY3RlZCFcbiIsCisJCWFkX3JlYWQoZGV2Yyw0NSkpOworCisJLyogZGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLworCWFkX3dyaXRlKGRldmMsMSwwKTsgICAgIAorCisJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJb3V0YiAoMCwgZGV2Yy0+YmFzZSsxKTsJCisKKwkvKiBhbGxvY2F0ZSBpcnEgKi8KKwlpZiAoZGV2Yy0+aXJxIDwgMCB8fCBkZXZjLT5pcnEgPiAxNSkKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJaWYgKHJlcXVlc3RfaXJxKGRldmMtPmlycSwgYWQxODE2X2ludGVycnVwdCwwLAorCQkJIlNvdW5kUG9ydCIsIGRldmMpIDwgMCkJeworCSAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBJUlEgaW4gdXNlXG4iKTsKKwkJZ290byBvdXRfcmVsZWFzZV9yZWdpb247CisJfQorCisJLyogRE1BIHN0dWZmICovCisJaWYgKHNvdW5kX2FsbG9jX2RtYSAoZGV2Yy0+ZG1hX3BsYXliYWNrLCAiU291bmQgU3lzdGVtIikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBDYW4ndCBhbGxvY2F0ZSBETUElZFxuIiwKKwkJCQkgICAgZGV2Yy0+ZG1hX3BsYXliYWNrKTsKKwkJZ290byBvdXRfZnJlZV9pcnE7CisJfQorCQorCWlmICggZGV2Yy0+ZG1hX2NhcHR1cmUgPj0gMCAmJiAKKwkgIAlkZXZjLT5kbWFfY2FwdHVyZSAhPSBkZXZjLT5kbWFfcGxheWJhY2spIHsKKwkJaWYgKHNvdW5kX2FsbG9jX2RtYShkZXZjLT5kbWFfY2FwdHVyZSwKKwkJCQkgICAgIlNvdW5kIFN5c3RlbSAoY2FwdHVyZSkiKSkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODE2OiBDYW4ndCBhbGxvY2F0ZSBETUElZFxuIiwKKwkJCQkJICAgIGRldmMtPmRtYV9jYXB0dXJlKTsKKwkJCWdvdG8gb3V0X2ZyZWVfZG1hOworCQl9CisJCWRldmMtPmF1ZGlvX21vZGU9RE1BX0FVVE9NT0RFfERNQV9EVVBMRVg7CisJfSBlbHNlIHsKKwkgIAlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IE9ubHkgb25lIERNQSBjaGFubmVsICIKKwkJCSJhdmFpbGFibGUvY29uZmlndXJlZC4gTm8gZHVwbGV4IG9wZXJhdGlvbiBwb3NzaWJsZVxuIik7CisJCWRldmMtPmF1ZGlvX21vZGU9RE1BX0FVVE9NT0RFOworCX0KKworCWNvbmZfcHJpbnRmMiAoIkFEMTgxNiBhdWRpbyBkcml2ZXIiLAorCQkgICAgICBkZXZjLT5iYXNlLCBkZXZjLT5pcnEsIGRldmMtPmRtYV9wbGF5YmFjaywgCisJCSAgICAgIGRldmMtPmRtYV9jYXB0dXJlKTsKKworCS8qIHJlZ2lzdGVyIGRldmljZSAqLworCWlmICgob3NzX2Rldm5vID0gc291bmRfaW5zdGFsbF9hdWRpb2RydiAoQVVESU9fRFJJVkVSX1ZFUlNJT04sCisJCQkJCSAgICAgICJBRDE4MTYgYXVkaW8gZHJpdmVyIiwKKwkJCQkJICAgICAgJmFkMTgxNl9hdWRpb19kcml2ZXIsCisJCQkJCSAgICAgIHNpemVvZiAoc3RydWN0IGF1ZGlvX2RyaXZlciksCisJCQkJCSAgICAgIGRldmMtPmF1ZGlvX21vZGUsCisJCQkJCSAgICAgIGFkX2Zvcm1hdF9tYXNrLAorCQkJCQkgICAgICBkZXZjLAorCQkJCQkgICAgICBkZXZjLT5kbWFfcGxheWJhY2ssIAorCQkJCQkgICAgICBkZXZjLT5kbWFfY2FwdHVyZSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4MTY6IENhbid0IGluc3RhbGwgc291bmQgZHJpdmVyXG4iKTsKKwkJZ290byBvdXRfZnJlZV9kbWFfMjsKKwl9CisKKworCWFkX3dyaXRlKGRldmMsMzIsMHg4MGYwKTsgLyogc291bmQgc3lzdGVtIG1vZGUgKi8KKwlpZiAob3B0aW9ucyYxKSB7CisJICAgICAgICBhZF93cml0ZShkZXZjLDMzLDApOyAvKiBkaXNhYmxlIGFsbCBhdWRpb3NvdXJjZXMgZm9yIGRzcCAqLworCX0gZWxzZSB7CisJICAgICAgICBhZF93cml0ZShkZXZjLDMzLDB4MDNmOCk7IC8qIGVuYWJsZSBhbGwgYXVkaW9zb3VyY2VzIGZvciBkc3AgKi8KKwl9CisJYWRfd3JpdGUoZGV2Yyw0LDB4ODA4MCk7ICAvKiBkZWZhdWx0IHZhbHVlcyBmb3Igdm9sdW1lcyAobXV0ZWQpKi8KKwlhZF93cml0ZShkZXZjLDUsMHg4MDgwKTsKKwlhZF93cml0ZShkZXZjLDYsMHg4MDgwKTsKKwlhZF93cml0ZShkZXZjLDcsMHg4MDgwKTsKKwlhZF93cml0ZShkZXZjLDE1LDB4ODg4OCk7CisJYWRfd3JpdGUoZGV2YywxNiwweDg4ODgpOworCWFkX3dyaXRlKGRldmMsMTcsMHg4ODg4KTsKKwlhZF93cml0ZShkZXZjLDE4LDB4ODg4OCk7CisJYWRfd3JpdGUoZGV2YywxOSwweGM4ODgpOyAvKiArMjBkYiBtaWMgYWN0aXZlICovCisJYWRfd3JpdGUoZGV2YywxNCwweDAwMDApOyAvKiBNYXN0ZXIgdm9sdW1lIHVubXV0ZWQgKi8KKwlhZF93cml0ZShkZXZjLDM5LDB4MDA5Zik7IC8qIDNEIGVmZmVjdCBvbiAwJSBwaG9uZSBvdXQgbXV0ZWQgKi8KKwlhZF93cml0ZShkZXZjLDQ0LDB4MDA4MCk7IC8qIGV2ZXJ5dGhpbmcgb24gcG93ZXIsIDNkIGVuYWJsZWQgZm9yIGQvYSAqLworCW91dGIoMHgxMCxkZXZjLT5iYXNlKzgpOyAvKiBzZXQgZG1hIG1vZGUgKi8KKwlvdXRiKDB4MTAsZGV2Yy0+YmFzZSs5KTsKKyAgCisJLyogZW5hYmxlIGNhcHR1cmUgKyBwbGF5YmFjayBpbnRlcnJ1cHQgKi8KKwlhZF93cml0ZShkZXZjLDEsMHhjMDAwKTsgCisJCisJLyogc2V0IG1peGVyIGRlZmF1bHRzICovCisJYWQxODE2X21peGVyX3Jlc2V0IChkZXZjKTsgCisgIAorCS8qIHJlZ2lzdGVyIG1peGVyICovCisJaWYgKChhdWRpb19kZXZzW29zc19kZXZub10tPm1peGVyX2Rldj1zb3VuZF9pbnN0YWxsX21peGVyKAorCQkJCSAgICAgICBNSVhFUl9EUklWRVJfVkVSU0lPTiwKKwkJCQkgICAgICAgIkFEMTgxNiBhdWRpbyBkcml2ZXIiLAorCQkJCSAgICAgICAmYWQxODE2X21peGVyX29wZXJhdGlvbnMsCisJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLAorCQkJCSAgICAgICBkZXZjKSkgPCAwKSB7CisJICAJcHJpbnRrKEtFUk5fV0FSTklORyAiQ2FuJ3QgaW5zdGFsbCBtaXhlclxuIik7CisJfQorCS8qIG1ha2UgYWQxODE2X2luZm8gYWN0aXZlICovCisJbnJfYWQxODE2X2RldnMrKzsKKwlwcmludGsoS0VSTl9JTkZPICJhZDE4MTY6IGNhcmQgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZCFcbiIpOworCXJldHVybiAxOworCS8qIGVycm9yIGhhbmRsaW5nICovCitvdXRfZnJlZV9kbWFfMjoKKwlpZiAoZGV2Yy0+ZG1hX2NhcHR1cmUgPj0gMCAmJiBkZXZjLT5kbWFfY2FwdHVyZSAhPSBkZXZjLT5kbWFfcGxheWJhY2spCisJICAgICAgICBzb3VuZF9mcmVlX2RtYShkZXZjLT5kbWFfY2FwdHVyZSk7CitvdXRfZnJlZV9kbWE6CisJc291bmRfZnJlZV9kbWEoZGV2Yy0+ZG1hX3BsYXliYWNrKTsKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShkZXZjLT5pcnEsIGRldmMpOworb3V0X3JlbGVhc2VfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDE2KTsKK291dDoKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9jYXJkKGFkMTgxNl9pbmZvICpkZXZjKQoreworCWludCAgbWl4ZXIsIGRldiA9IDA7CisJCisJaWYgKGRldmMgIT0gTlVMTCkgeworCQlwcmludGsoImFkMTgxNjogVW5sb2FkaW5nIGNhcmQgYXQgYWRkcmVzcyAweCUwM3hcbiIsZGV2Yy0+YmFzZSk7CisJCQorCQlkZXYgPSBkZXZjLT5kZXZfbm87CisJCW1peGVyID0gYXVkaW9fZGV2c1tkZXZdLT5taXhlcl9kZXY7CisKKwkJLyogdW5yZWcgbWl4ZXIqLworCQlpZihtaXhlcj49MCkgeworCQkJc291bmRfdW5sb2FkX21peGVyZGV2KG1peGVyKTsKKwkJfQorCQkvKiB1bnJlZyBhdWRpb2RldiAqLworCQlzb3VuZF91bmxvYWRfYXVkaW9kZXYoZGV2KTsKKwkJCisJCS8qIGZyZWUgZG1hIGNoYW5uZWxzICovCisJCWlmIChkZXZjLT5kbWFfY2FwdHVyZT49MCAmJiAKKwkJICAJZGV2Yy0+ZG1hX2NhcHR1cmUgIT0gZGV2Yy0+ZG1hX3BsYXliYWNrKSB7CisJCQlzb3VuZF9mcmVlX2RtYShkZXZjLT5kbWFfY2FwdHVyZSk7CisJCX0KKwkJc291bmRfZnJlZV9kbWEgKGRldmMtPmRtYV9wbGF5YmFjayk7CisJCS8qIGZyZWUgaXJxICovCisJCWZyZWVfaXJxKGRldmMtPmlycSwgZGV2Yyk7CisJCS8qIGZyZWUgaW8gKi8KKwkJcmVsZWFzZV9yZWdpb24gKGRldmMtPmJhc2UsIDE2KTsKKyNpZmRlZiBfX0lTQVBOUF9fCisJCWlmIChkZXZjLT5wbnBkZXYpIHsKKwkJICAJcG5wX2Rpc2FibGVfZGV2KGRldmMtPnBucGRldik7CisJCQlwbnBfZGV2aWNlX2RldGFjaChkZXZjLT5wbnBkZXYpOworCQl9CisjZW5kaWYKKwkJCisJfSBlbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogbm8gZGV2aWNlL2NhcmQgc3BlY2lmaWVkXG4iKTsKK30KKworc3RhdGljIGludCBfX2luaXRkYXRhIGlvID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMiA9IC0xOworCisjaWZkZWYgX19JU0FQTlBfXworLyogdXNlIGlzYXBucCBmb3IgY29uZmlndXJhdGlvbiAqLworc3RhdGljIGludCBpc2FwbnAJPSAxOworc3RhdGljIGludCBpc2FwbnBqdW1wOworbW9kdWxlX3BhcmFtKGlzYXBucCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oaXNhcG5wanVtcCwgaW50LCAwKTsKKyNlbmRpZgorCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGFkMTgxNl9jbG9ja2ZyZXEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ob3B0aW9ucywgaW50LCAwKTsKKworI2lmZGVmIF9fSVNBUE5QX18KK3N0YXRpYyBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IGNhcmRfdmVuZG9yLCBjYXJkX2RldmljZTsKKwl1bnNpZ25lZCBzaG9ydCB2ZW5kb3I7CisJdW5zaWduZWQgc2hvcnQgZnVuY3Rpb247CisJc3RydWN0IGFkMTgxNl9kYXRhICpkYXRhOworfSBpc2FwbnBfYWQxODE2X2xpc3RbXSBfX2luaXRkYXRhID0geworCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdTJyksIElTQVBOUF9GVU5DVElPTigweDcxNTApLCAKKwkJTlVMTCB9LAorCXsJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQScsJ0QnLCdTJyksIElTQVBOUF9GVU5DVElPTigweDcxODApLAorCQlOVUxMIH0sCisJezB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKGlzYXBucCwgaXNhcG5wX2FkMTgxNl9saXN0KTsKKworCitzdGF0aWMgdm9pZCBfX2luaXQgYWQxODE2X2NvbmZpZ19wbnBfY2FyZChzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQsCisJCQkJCSAgdW5zaWduZWQgc2hvcnQgdmVuZG9yLAorCQkJCQkgIHVuc2lnbmVkIHNob3J0IGZ1bmN0aW9uKQoreworCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworICAJc3RydWN0IHBucF9kZXYgKmNhcmRfZGV2ID0gcG5wX2ZpbmRfZGV2KGNhcmQsIHZlbmRvciwgZnVuY3Rpb24sIE5VTEwpOworCWlmICghY2FyZF9kZXYpIHJldHVybjsKKwlpZiAocG5wX2RldmljZV9hdHRhY2goY2FyZF9kZXYpIDwgMCkgeworCSAgCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogRmFpbGVkIHRvIGF0dGFjaCBQblAgZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocG5wX2FjdGl2YXRlX2RldihjYXJkX2RldikgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTgxNjogRmFpbGVkIHRvIGFjdGl2YXRlIFBuUCBkZXZpY2VcbiIpOworCQlwbnBfZGV2aWNlX2RldGFjaChjYXJkX2Rldik7CisJCXJldHVybjsKKwl9CisJY2ZnLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChjYXJkX2RldiwgMik7CisJY2ZnLmlycSA9IHBucF9pcnEoY2FyZF9kZXYsIDApOworCWNmZy5kbWEgPSBwbnBfaXJxKGNhcmRfZGV2LCAwKTsKKwljZmcuZG1hMiA9IHBucF9pcnEoY2FyZF9kZXYsIDEpOworCWlmICghYWQxODE2X2luaXRfY2FyZCgmY2ZnLCBjYXJkX2RldikpIHsKKwkgIAlwbnBfZGlzYWJsZV9kZXYoY2FyZF9kZXYpOworCQlwbnBfZGV2aWNlX2RldGFjaChjYXJkX2Rldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYWQxODE2X2NvbmZpZ19wbnBfY2FyZHModm9pZCkKK3sKKwlpbnQgbnJfcG5wX2NmZzsKKwlpbnQgaTsKKwkKKwkvKiBDb3VudCBlbnRyaWVzIGluIGlzYXBucF9hZDE4MTZfbGlzdCAqLworCWZvciAobnJfcG5wX2NmZyA9IDA7IGlzYXBucF9hZDE4MTZfbGlzdFtucl9wbnBfY2ZnXS5jYXJkX3ZlbmRvciAhPSAwOyAKKwkJbnJfcG5wX2NmZysrKTsKKwkvKiBDaGVjayBhbmQgYWRqdXN0IGlzYXBucGp1bXAgKi8KKwlpZiggaXNhcG5wanVtcCA8IDAgfHwgaXNhcG5wanVtcCA+PSBucl9wbnBfY2ZnKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkiYWQxODE2OiBWYWxpZCByYW5nZSBmb3IgaXNhcG5wanVtcCBpcyAwLSVkLiAiCisJCQkiQWRqdXN0ZWQgdG8gMC5cbiIsIG5yX3BucF9jZmctMSk7CisJCWlzYXBucGp1bXAgPSAwOworCX0KKwlmb3IgKGkgPSBpc2FwbnBqdW1wOyBpc2FwbnBfYWQxODE2X2xpc3RbaV0uY2FyZF92ZW5kb3IgIT0gMDsgaSsrKSB7CisJIAlzdHJ1Y3QgcG5wX2NhcmQgKmNhcmQgPSBOVUxMOworCQkvKiBpdGVyYXRlIG92ZXIgYWxsIHBucCBjYXJkcyAqLwkJCisJCXdoaWxlICgoY2FyZCA9IHBucF9maW5kX2NhcmQoaXNhcG5wX2FkMTgxNl9saXN0W2ldLmNhcmRfdmVuZG9yLAorCQkgICAgICAgICAgICAgIAlpc2FwbnBfYWQxODE2X2xpc3RbaV0uY2FyZF9kZXZpY2UsIGNhcmQpKSkgCisJCQlhZDE4MTZfY29uZmlnX3BucF9jYXJkKGNhcmQsIAorCQkJCWlzYXBucF9hZDE4MTZfbGlzdFtpXS52ZW5kb3IsCisJCQkJaXNhcG5wX2FkMTgxNl9saXN0W2ldLmZ1bmN0aW9uKTsKKwl9Cit9CisjZW5kaWYKKworLyogbW9kdWxlIGluaXRpYWxpemF0aW9uICovCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2FkMTgxNih2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImFkMTgxNjogQUQxODE2IHNvdW5kZHJpdmVyICIKKwkJCSAiQ29weXJpZ2h0IChDKSAxOTk4LTIwMDMgYnkgVGhvcnN0ZW4gS25hYmUgYW5kICIKKwkJCSAib3RoZXJzXG4iKTsKKyNpZmRlZiBBRDE4MTZfQ0xPQ0sgCisJLyogc2V0IGFkMTgxNl9jbG9ja2ZyZXEgaWYgc2V0IGR1cmluZyBjb21waWxhdGlvbiAqLworCWFkMTgxNl9jbG9ja2ZyZXE9QUQxODE2X0NMT0NLOworI2VuZGlmCisJaWYgKGFkMTgxNl9jbG9ja2ZyZXE8NTAwMCB8fCBhZDE4MTZfY2xvY2tmcmVxPjEwMDAwMCkgeworCQlhZDE4MTZfY2xvY2tmcmVxPTMzMDAwOworCX0KKworI2lmZGVmIF9fSVNBUE5QX18KKwkvKiBjb25maWd1cmUgUG5QIGNhcmRzICovCisJaWYoaXNhcG5wKSBhZDE4MTZfY29uZmlnX3BucF9jYXJkcygpOworI2VuZGlmCisJLyogY29uZmlndXJlIGNhcmQgYnkgbW9kdWxlIHBhcmFtcyAqLworCWlmIChpbyAhPSAtMSAmJiBpcnEgIT0gLTEgJiYgZG1hICE9IC0xKSB7CisJCXN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworCQljZmcuaW9fYmFzZSA9IGlvOworCQljZmcuaXJxID0gaXJxOworCQljZmcuZG1hID0gZG1hOworCQljZmcuZG1hMiA9IGRtYTI7CisJCWFkMTgxNl9pbml0X2NhcmQoJmNmZywgTlVMTCk7CisJfQorCWlmIChucl9hZDE4MTZfZGV2cyA8PSAwKQorCSAgCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCisvKiBtb2R1bGUgY2xlYW51cCAqLworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYWQxODE2ICh2b2lkKQoreworCWludCAgICAgICAgICBpOworCWFkMTgxNl9pbmZvICAqZGV2YyA9IE5VTEw7CisgIAorCS8qIHJlbW92ZSBhbnkgc291bmRjYXJkICovCisJZm9yIChpID0gMDsgIGkgPCBucl9hZDE4MTZfZGV2czsgaSsrKSB7CisJCWRldmMgPSAmZGV2X2luZm9baV07CisJCXVubG9hZF9jYXJkKGRldmMpOworCX0gICAgIAorCW5yX2FkMTgxNl9kZXZzPTA7CisJcHJpbnRrKEtFUk5fSU5GTyAiYWQxODE2OiBkcml2ZXIgdW5sb2FkZWQhXG4iKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9hZDE4MTYpOworbW9kdWxlX2V4aXQoY2xlYW51cF9hZDE4MTYpOworCisjaWZuZGVmIE1PRFVMRQorLyoga2VybmVsIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgZXZhbHVhdGlvbiAqLworc3RhdGljIGludCBfX2luaXQgc2V0dXBfYWQxODE2KGNoYXIgKnN0cikKK3sKKwkvKiBpbywgaXJxLCBkbWEsIGRtYTIgKi8KKwlpbnQgaW50c1s1XTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvCT0gaW50c1sxXTsKKwlpcnEJPSBpbnRzWzJdOworCWRtYQk9IGludHNbM107CisJZG1hMgk9IGludHNbNF07CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFkMTgxNj0iLCBzZXR1cF9hZDE4MTYpOworI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODQ4LmMgYi9zb3VuZC9vc3MvYWQxODQ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4NGRhYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hZDE4NDguYwpAQCAtMCwwICsxLDMxNTkgQEAKKy8qCisgKiBzb3VuZC9hZDE4NDguYworICoKKyAqIFRoZSBsb3cgbGV2ZWwgZHJpdmVyIGZvciB0aGUgQUQxODQ4L0NTNDI0OCBjb2RlYyBjaGlwIHdoaWNoCisgKiBpcyB1c2VkIGZvciBleGFtcGxlIGluIHRoZSBNUyBTb3VuZCBTeXN0ZW0uCisgKgorICogVGhlIENTNDIzMSB3aGljaCBpcyB1c2VkIGluIHRoZSBHVVMgTUFYIGFuZCBzb21lIG90aGVyIGNhcmRzIGlzCisgKiB1cHdhcmRzIGNvbXBhdGlibGUgd2l0aCBBRDE4NDggYW5kIHRoaXMgZHJpdmVyIGlzIGFibGUgdG8gZHJpdmUgaXQuCisgKgorICogQ1M0MjMxQSBhbmQgQUQxODQ1IGFyZSB1cHdhcmQgY29tcGF0aWJsZSB3aXRoIENTNDIzMS4gSG93ZXZlcgorICogdGhlIG5ldyBmZWF0dXJlcyBvZiB0aGVzZSBjaGlwcyBhcmUgZGlmZmVyZW50LgorICoKKyAqIENTNDIzMiBpcyBhIFBuUCBhdWRpbyBjaGlwIHdoaWNoIGNvbnRhaW5zIGEgQ1M0MjMxQSAoYW5kIFNCLCBNUFUpLgorICogQ1M0MjMyQSBpcyBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mIENTNDIzMi4KKyAqCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBUaG9tYXMgU2FpbGVyCTogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICoJCQkgIGdlbmVyYWwgc2xlZXAvd2FrZXVwIGNsZWFuIHVwLgorICogQWxhbiBDb3gJCTogcmVmb3JtYXR0ZWQuIEZpeGVkIFNNUCBidWdzLiBNb3ZlZCB0byBrZXJuZWwgYWxsb2MvZnJlZQorICoJCSAgICAgICAgICBvZiBpcnFzLiBVc2UgZGV2X2lkLgorICogQ2hyaXN0b3BoIEhlbGx3aWcJOiBhZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKiBBa2kgTGF1a2thbmVuCTogYWRkZWQgcG93ZXIgbWFuYWdlbWVudCBzdXBwb3J0CisgKiBBcm5hbGRvIEMuIGRlIE1lbG8JOiBhZGRlZCBtaXNzaW5nIHJlc3RvcmVfZmxhZ3MgaW4gYWQxODQ4X3Jlc3VtZQorICogTWlndWVsIEZyZWl0YXMgICAgICAgOiBhZGRlZCBJU0EgUG5QIHN1cHBvcnQKKyAqIEFsYW4gQ294CQk6IEFkZGVkIENTNDIzNi0+NDIzOSBpZGVudGlmaWNhdGlvbgorICogRGFuaWVsIFQuIENvYnJhCTogQWxlcm5hdGUgY29uZmlnL21peGVyIGZvciBsYXRlciBjaGlwcworICogQWxhbiBDb3gJCTogTWVyZ2VkIGNoaXAgaWRlbnRzIGFuZCBjb25maWcgY29kZQorICoKKyAqIFRPRE8KKyAqCQlBUE0gc2F2ZSByZXN0b3JlIGFzc2lzdCBjb2RlIG9uIElCTSB0aGlua3BhZAorICoKKyAqIFN0YXR1czoKKyAqCQlUZXN0ZWQuIEJlbGlldmVkIGZ1bGx5IGZ1bmN0aW9uYWwuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lzYXBucC5oPgorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgREVCKHgpCisjZGVmaW5lIERFQjEoeCkKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgImFkMTg0OC5oIgorI2luY2x1ZGUgImFkMTg0OF9taXhlci5oIgorCit0eXBlZGVmIHN0cnVjdAoreworCXNwaW5sb2NrX3QJbG9jazsKKwlpbnQgICAgICAgICAgICAgYmFzZTsKKwlpbnQgICAgICAgICAgICAgaXJxOworCWludCAgICAgICAgICAgICBkbWExLCBkbWEyOworCWludCAgICAgICAgICAgICBkdWFsX2RtYTsJLyogMSwgd2hlbiB0d28gRE1BIGNoYW5uZWxzIGFsbG9jYXRlZCAqLworCWludCAJCXN1YnR5cGU7CisJdW5zaWduZWQgY2hhciAgIE1DRV9iaXQ7CisJdW5zaWduZWQgY2hhciAgIHNhdmVkX3JlZ3NbNjRdOwkvKiBJbmNsdWRlcyBleHRlbmRlZCByZWdpc3RlciBzcGFjZSAqLworCWludCAgICAgICAgICAgICBkZWJ1Z19mbGFnOworCisJaW50ICAgICAgICAgICAgIGF1ZGlvX2ZsYWdzOworCWludCAgICAgICAgICAgICByZWNvcmRfZGV2LCBwbGF5YmFja19kZXY7CisKKwlpbnQgICAgICAgICAgICAgeGZlcl9jb3VudDsKKwlpbnQgICAgICAgICAgICAgYXVkaW9fbW9kZTsKKwlpbnQgICAgICAgICAgICAgb3Blbl9tb2RlOworCWludCAgICAgICAgICAgICBpbnRyX2FjdGl2ZTsKKwljaGFyICAgICAgICAgICAqY2hpcF9uYW1lLCAqbmFtZTsKKwlpbnQgICAgICAgICAgICAgbW9kZWw7CisjZGVmaW5lIE1EXzE4NDgJCTEKKyNkZWZpbmUgTURfNDIzMQkJMgorI2RlZmluZSBNRF80MjMxQQkzCisjZGVmaW5lIE1EXzE4NDUJCTQKKyNkZWZpbmUgTURfNDIzMgkJNQorI2RlZmluZSBNRF9DOTMwCQk2CisjZGVmaW5lIE1EX0lXQVZFCTcKKyNkZWZpbmUgTURfNDIzNSAgICAgICAgIDggLyogQ3J5c3RhbCBBdWRpbyBDUzQyMzUgICovCisjZGVmaW5lIE1EXzE4NDVfU1NDQVBFICA5IC8qIEVuc29uaXEgU291bmRzY2FwZSBQTlAqLworI2RlZmluZSBNRF80MjM2CQkxMCAvKiA0MjM2IGFuZCBoaWdoZXIgKi8KKyNkZWZpbmUgTURfNDJ4QgkJMTEgLyogQ1MgNDJ4QiAqLworI2RlZmluZSBNRF80MjM5CQkxMiAvKiBDUzQyMzkgKi8KKworCS8qIE1peGVyIHBhcmFtZXRlcnMgKi8KKwlpbnQgICAgICAgICAgICAgcmVjbWFzazsKKwlpbnQgICAgICAgICAgICAgc3VwcG9ydGVkX2RldmljZXMsIG9yaWdfZGV2aWNlczsKKwlpbnQgICAgICAgICAgICAgc3VwcG9ydGVkX3JlY19kZXZpY2VzLCBvcmlnX3JlY19kZXZpY2VzOworCWludCAgICAgICAgICAgICpsZXZlbHM7CisJc2hvcnQgICAgICAgICAgIG1peGVyX3Jlcm91dGVbMzJdOworCWludCAgICAgICAgICAgICBkZXZfbm87CisJdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB0aW1lcl90aWNrczsKKwlpbnQgICAgICAgICAgICAgdGltZXJfcnVubmluZzsKKwlpbnQgICAgICAgICAgICAgaXJxX29rOworCW1peGVyX2VudHMgICAgICptaXhfZGV2aWNlczsKKwlpbnQgICAgICAgICAgICAgbWl4ZXJfb3V0cHV0X3BvcnQ7CisKKwkvKiBQb3dlciBtYW5hZ2VtZW50ICovCisJc3RydWN0CQlwbV9kZXYgKnBtZGV2OworfSBhZDE4NDhfaW5mbzsKKwordHlwZWRlZiBzdHJ1Y3QgYWQxODQ4X3BvcnRfaW5mbworeworCWludCAgICAgICAgICAgICBvcGVuX21vZGU7CisJaW50ICAgICAgICAgICAgIHNwZWVkOworCXVuc2lnbmVkIGNoYXIgICBzcGVlZF9iaXRzOworCWludCAgICAgICAgICAgICBjaGFubmVsczsKKwlpbnQgICAgICAgICAgICAgYXVkaW9fZm9ybWF0OworCXVuc2lnbmVkIGNoYXIgICBmb3JtYXRfYml0czsKK30KK2FkMTg0OF9wb3J0X2luZm87CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKK3N0YXRpYyBpbnQgbnJfYWQxODQ4X2RldnM7CisKK3N0YXRpYyBpbnQgZGVza3Byb194bDsKK3N0YXRpYyBpbnQgZGVza3Byb19tOworc3RhdGljIGludCBzb3VuZHBybzsKKworc3RhdGljIHZvbGF0aWxlIHNpZ25lZCBjaGFyIGlycTJkZXZbMTddID0geworCS0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwKKwktMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xCit9OworCisjaWZuZGVmIEVYQ0xVREVfVElNRVJTCitzdGF0aWMgaW50IHRpbWVyX2luc3RhbGxlZCA9IC0xOworI2VuZGlmCisKK3N0YXRpYyBpbnQgbG9hZGVkOworCitzdGF0aWMgaW50IGFkX2Zvcm1hdF9tYXNrWzEzIC8qZGV2Yy0+bW9kZWwgKi8gXSA9Cit7CisJMCwKKwlBRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcsCisJQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9NVV9MQVcgfCBBRk1UX0FfTEFXIHwgQUZNVF9TMTZfQkUgfCBBRk1UX0lNQV9BRFBDTSwKKwlBRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcgfCBBRk1UX1MxNl9CRSB8IEFGTVRfSU1BX0FEUENNLAorCUFGTVRfVTggfCBBRk1UX1MxNl9MRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVywJLyogQUQxODQ1ICovCisJQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9NVV9MQVcgfCBBRk1UX0FfTEFXIHwgQUZNVF9TMTZfQkUgfCBBRk1UX0lNQV9BRFBDTSwKKwlBRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcgfCBBRk1UX1MxNl9CRSB8IEFGTVRfSU1BX0FEUENNLAorCUFGTVRfVTggfCBBRk1UX1MxNl9MRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVyB8IEFGTVRfUzE2X0JFIHwgQUZNVF9JTUFfQURQQ00sCisJQUZNVF9VOCB8IEFGTVRfUzE2X0xFIC8qIENTNDIzNSAqLywKKwlBRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcJLyogRW5zb25pcSBTb3VuZHNjYXBlKi8sCisJQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9NVV9MQVcgfCBBRk1UX0FfTEFXIHwgQUZNVF9TMTZfQkUgfCBBRk1UX0lNQV9BRFBDTSwKKwlBRk1UX1U4IHwgQUZNVF9TMTZfTEUgfCBBRk1UX01VX0xBVyB8IEFGTVRfQV9MQVcgfCBBRk1UX1MxNl9CRSB8IEFGTVRfSU1BX0FEUENNLAorCUFGTVRfVTggfCBBRk1UX1MxNl9MRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVyB8IEFGTVRfUzE2X0JFIHwgQUZNVF9JTUFfQURQQ00KK307CisKK3N0YXRpYyBhZDE4NDhfaW5mbyBhZGV2X2luZm9bTUFYX0FVRElPX0RFVl07CisKKyNkZWZpbmUgaW9fSW5kZXhfQWRkcihkKQkoKGQpLT5iYXNlKQorI2RlZmluZSBpb19JbmRleGVkX0RhdGEoZCkJKChkKS0+YmFzZSsxKQorI2RlZmluZSBpb19TdGF0dXMoZCkJCSgoZCktPmJhc2UrMikKKyNkZWZpbmUgaW9fUG9sbGVkX0lPKGQpCQkoKGQpLT5iYXNlKzMpCisKK3N0YXRpYyBzdHJ1Y3QgeworICAgICB1bnNpZ25lZCBjaGFyIGZsYWdzOworI2RlZmluZSBDQVBfRl9USU1FUiAweDAxICAgICAKK30gY2FwYWJpbGl0aWVzIFsxMCAvKmRldmMtPm1vZGVsICovIF0gPSB7CisgICAgIHswfQorICAgICx7MH0gICAgICAgICAgIC8qIE1EXzE4NDggICovCisgICAgLHtDQVBfRl9USU1FUn0gLyogTURfNDIzMSAgKi8KKyAgICAse0NBUF9GX1RJTUVSfSAvKiBNRF80MjMxQSAqLworICAgICx7Q0FQX0ZfVElNRVJ9IC8qIE1EXzE4NDUgICovCisgICAgLHtDQVBfRl9USU1FUn0gLyogTURfNDIzMiAgKi8KKyAgICAsezB9ICAgICAgICAgICAvKiBNRF9DOTMwICAqLworICAgICx7Q0FQX0ZfVElNRVJ9IC8qIE1EX0lXQVZFICovCisgICAgLHswfSAgICAgICAgICAgLyogTURfNDIzNSAgKi8KKyAgICAse0NBUF9GX1RJTUVSfSAvKiBNRF8xODQ1X1NTQ0FQRSAqLworfTsKKworI2lmZGVmIENPTkZJR19QTlAKK3N0YXRpYyBpbnQgaXNhcG5wCT0gMTsKK3N0YXRpYyBpbnQgaXNhcG5wanVtcDsKK3N0YXRpYyBpbnQgcmV2ZXJzZTsKKworc3RhdGljIGludCBhdWRpb19hY3RpdmF0ZWQ7CisjZWxzZQorc3RhdGljIGludCBpc2FwbnA7CisjZW5kaWYKKworCisKK3N0YXRpYyBpbnQgICAgICBhZDE4NDhfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCAgICAgYWQxODQ4X2Nsb3NlKGludCBkZXYpOworc3RhdGljIHZvaWQgICAgIGFkMTg0OF9vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwgaW50IGludHJmbGFnKTsKK3N0YXRpYyB2b2lkICAgICBhZDE4NDhfc3RhcnRfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwgaW50IGludHJmbGFnKTsKK3N0YXRpYyBpbnQgICAgICBhZDE4NDhfcHJlcGFyZV9mb3Jfb3V0cHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCk7CitzdGF0aWMgaW50ICAgICAgYWQxODQ4X3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCk7CitzdGF0aWMgdm9pZCAgICAgYWQxODQ4X2hhbHQoaW50IGRldik7CitzdGF0aWMgdm9pZCAgICAgYWQxODQ4X2hhbHRfaW5wdXQoaW50IGRldik7CitzdGF0aWMgdm9pZCAgICAgYWQxODQ4X2hhbHRfb3V0cHV0KGludCBkZXYpOworc3RhdGljIHZvaWQgICAgIGFkMTg0OF90cmlnZ2VyKGludCBkZXYsIGludCBiaXRzKTsKK3N0YXRpYyBpbnQJYWQxODQ4X3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpOworCisjaWZuZGVmIEVYQ0xVREVfVElNRVJTCitzdGF0aWMgaW50IGFkMTg0OF90bXJfaW5zdGFsbChpbnQgZGV2KTsKK3N0YXRpYyB2b2lkIGFkMTg0OF90bXJfcmVwcm9ncmFtKGludCBkZXYpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgYWRfcmVhZChhZDE4NDhfaW5mbyAqIGRldmMsIGludCByZWcpCit7CisJaW50IHg7CisJaW50IHRpbWVvdXQgPSA5MDAwMDA7CisKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCS8qQXJlIHdlIGluaXRpYWxpemluZyAqLworCQl0aW1lb3V0LS07CisKKwlpZihyZWcgPCAzMikKKwl7CisJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAocmVnICYgMHhmZikgfCBkZXZjLT5NQ0VfYml0KSwgaW9fSW5kZXhfQWRkcihkZXZjKSk7CisJCXggPSBpbmIoaW9fSW5kZXhlZF9EYXRhKGRldmMpKTsKKwl9CisJZWxzZQorCXsKKwkJaW50IHhyZWcsIHhyYTsKKworCQl4cmVnID0gKHJlZyAmIDB4ZmYpIC0gMzI7CisJCXhyYSA9ICgoKHhyZWcgJiAweDBmKSA8PCA0KSAmIDB4ZjApIHwgMHgwOCB8ICgoeHJlZyAmIDB4MTApID4+IDIpOworCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKDIzICYgMHhmZikgfCBkZXZjLT5NQ0VfYml0KSwgaW9fSW5kZXhfQWRkcihkZXZjKSk7CisJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAoeHJhICYgMHhmZikpLCBpb19JbmRleGVkX0RhdGEoZGV2YykpOworCQl4ID0gaW5iKGlvX0luZGV4ZWRfRGF0YShkZXZjKSk7CisJfQorCisJcmV0dXJuIHg7Cit9CisKK3N0YXRpYyB2b2lkIGFkX3dyaXRlKGFkMTg0OF9pbmZvICogZGV2YywgaW50IHJlZywgaW50IGRhdGEpCit7CisJaW50IHRpbWVvdXQgPSA5MDAwMDA7CisKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCS8qIEFyZSB3ZSBpbml0aWFsaXppbmcgKi8KKwkJdGltZW91dC0tOworCisJaWYocmVnIDwgMzIpCisJeworCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKHJlZyAmIDB4ZmYpIHwgZGV2Yy0+TUNFX2JpdCksIGlvX0luZGV4X0FkZHIoZGV2YykpOworCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKGRhdGEgJiAweGZmKSksIGlvX0luZGV4ZWRfRGF0YShkZXZjKSk7CisJfQorCWVsc2UKKwl7CisJCWludCB4cmVnLCB4cmE7CisJCQorCQl4cmVnID0gKHJlZyAmIDB4ZmYpIC0gMzI7CisJCXhyYSA9ICgoKHhyZWcgJiAweDBmKSA8PCA0KSAmIDB4ZjApIHwgMHgwOCB8ICgoeHJlZyAmIDB4MTApID4+IDIpOworCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKDIzICYgMHhmZikgfCBkZXZjLT5NQ0VfYml0KSwgaW9fSW5kZXhfQWRkcihkZXZjKSk7CisJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAoeHJhICYgMHhmZikpLCBpb19JbmRleGVkX0RhdGEoZGV2YykpOworCQlvdXRiKCh1bnNpZ25lZCBjaGFyKSAoZGF0YSAmIDB4ZmYpLCBpb19JbmRleGVkX0RhdGEoZGV2YykpOworCX0KK30KKworc3RhdGljIHZvaWQgd2FpdF9mb3JfY2FsaWJyYXRpb24oYWQxODQ4X2luZm8gKiBkZXZjKQoreworCWludCB0aW1lb3V0ID0gMDsKKworCS8qCisJICogV2FpdCB1bnRpbCB0aGUgYXV0byBjYWxpYnJhdGlvbiBwcm9jZXNzIGhhcyBmaW5pc2hlZC4KKwkgKgorCSAqIDEpICAgICAgIFdhaXQgdW50aWwgdGhlIGNoaXAgYmVjb21lcyByZWFkeSAocmVhZHMgZG9uJ3QgcmV0dXJuIDB4ODApLgorCSAqIDIpICAgICAgIFdhaXQgdW50aWwgdGhlIEFDSSBiaXQgb2YgSTExIGdldHMgb24gYW5kIHRoZW4gb2ZmLgorCSAqLworCisJdGltZW91dCA9IDEwMDAwMDsKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCisJCXRpbWVvdXQtLTsKKwlpZiAoaW5iKGRldmMtPmJhc2UpICYgMHg4MCkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODQ4OiBBdXRvIGNhbGlicmF0aW9uIHRpbWVkIG91dCgxKS5cbiIpOworCisJdGltZW91dCA9IDEwMDsKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgIShhZF9yZWFkKGRldmMsIDExKSAmIDB4MjApKQorCQl0aW1lb3V0LS07CisJaWYgKCEoYWRfcmVhZChkZXZjLCAxMSkgJiAweDIwKSkKKwkJcmV0dXJuOworCisJdGltZW91dCA9IDgwMDAwOworCXdoaWxlICh0aW1lb3V0ID4gMCAmJiAoYWRfcmVhZChkZXZjLCAxMSkgJiAweDIwKSkKKwkJdGltZW91dC0tOworCWlmIChhZF9yZWFkKGRldmMsIDExKSAmIDB4MjApCisJCWlmICggKGRldmMtPm1vZGVsICE9IE1EXzE4NDUpIHx8IChkZXZjLT5tb2RlbCAhPSBNRF8xODQ1X1NTQ0FQRSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4NDg6IEF1dG8gY2FsaWJyYXRpb24gdGltZWQgb3V0KDMpLlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGFkX211dGUoYWQxODQ4X2luZm8gKiBkZXZjKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgcHJldjsKKworCS8qCisJICogU2F2ZSBvbGQgcmVnaXN0ZXIgc2V0dGluZ3MgYW5kIG11dGUgb3V0cHV0IGNoYW5uZWxzCisJICovCisJIAorCWZvciAoaSA9IDY7IGkgPCA4OyBpKyspCisJeworCQlwcmV2ID0gZGV2Yy0+c2F2ZWRfcmVnc1tpXSA9IGFkX3JlYWQoZGV2YywgaSk7CisJfQorCit9CisKK3N0YXRpYyB2b2lkIGFkX3VubXV0ZShhZDE4NDhfaW5mbyAqIGRldmMpCit7Cit9CisKK3N0YXRpYyB2b2lkIGFkX2VudGVyX01DRShhZDE4NDhfaW5mbyAqIGRldmMpCit7CisJaW50IHRpbWVvdXQgPSAxMDAwOworCXVuc2lnbmVkIHNob3J0IHByZXY7CisKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCS8qQXJlIHdlIGluaXRpYWxpemluZyAqLworCQl0aW1lb3V0LS07CisKKwlkZXZjLT5NQ0VfYml0ID0gMHg0MDsKKwlwcmV2ID0gaW5iKGlvX0luZGV4X0FkZHIoZGV2YykpOworCWlmIChwcmV2ICYgMHg0MCkKKwl7CisJCXJldHVybjsKKwl9CisJb3V0YigoZGV2Yy0+TUNFX2JpdCksIGlvX0luZGV4X0FkZHIoZGV2YykpOworfQorCitzdGF0aWMgdm9pZCBhZF9sZWF2ZV9NQ0UoYWQxODQ4X2luZm8gKiBkZXZjKQoreworCXVuc2lnbmVkIGNoYXIgcHJldiwgYWNhbDsKKwlpbnQgdGltZW91dCA9IDEwMDA7CisKKwl3aGlsZSAodGltZW91dCA+IDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCS8qQXJlIHdlIGluaXRpYWxpemluZyAqLworCQl0aW1lb3V0LS07CisKKwlhY2FsID0gYWRfcmVhZChkZXZjLCA5KTsKKworCWRldmMtPk1DRV9iaXQgPSAweDAwOworCXByZXYgPSBpbmIoaW9fSW5kZXhfQWRkcihkZXZjKSk7CisJb3V0YigoMHgwMCksIGlvX0luZGV4X0FkZHIoZGV2YykpOwkvKiBDbGVhciB0aGUgTUNFIGJpdCAqLworCisJaWYgKChwcmV2ICYgMHg0MCkgPT0gMCkJLyogTm90IGluIE1DRSBtb2RlICovCisJeworCQlyZXR1cm47CisJfQorCW91dGIoKDB4MDApLCBpb19JbmRleF9BZGRyKGRldmMpKTsJLyogQ2xlYXIgdGhlIE1DRSBiaXQgKi8KKwlpZiAoYWNhbCAmIDB4MDgpCS8qIEF1dG8gY2FsaWJyYXRpb24gaXMgZW5hYmxlZCAqLworCQl3YWl0X2Zvcl9jYWxpYnJhdGlvbihkZXZjKTsKK30KKworc3RhdGljIGludCBhZDE4NDhfc2V0X3JlY21hc2soYWQxODQ4X2luZm8gKiBkZXZjLCBpbnQgbWFzaykKK3sKKwl1bnNpZ25lZCBjaGFyICAgcmVjZGV2OworCWludCAgICAgICAgICAgICBpLCBuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwltYXNrICY9IGRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlczsKKworCS8qIFJlbmFtZSB0aGUgbWl4ZXIgYml0cyBpZiBuZWNlc3NhcnkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwl7CisJCWlmIChkZXZjLT5taXhlcl9yZXJvdXRlW2ldICE9IGkpCisJCXsKKwkJCWlmIChtYXNrICYgKDEgPDwgaSkpCisJCQl7CisJCQkJbWFzayAmPSB+KDEgPDwgaSk7CisJCQkJbWFzayB8PSAoMSA8PCBkZXZjLT5taXhlcl9yZXJvdXRlW2ldKTsKKwkJCX0KKwkJfQorCX0KKwkKKwluID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykJLyogQ291bnQgc2VsZWN0ZWQgZGV2aWNlIGJpdHMgKi8KKwkJaWYgKG1hc2sgJiAoMSA8PCBpKSkKKwkJCW4rKzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlpZiAoIXNvdW5kcHJvKSB7CisJCWlmIChuID09IDApCisJCQltYXNrID0gU09VTkRfTUFTS19NSUM7CisJCWVsc2UgaWYgKG4gIT0gMSkgewkvKiBUb28gbWFueSBkZXZpY2VzIHNlbGVjdGVkICovCisJCQltYXNrICY9IH5kZXZjLT5yZWNtYXNrOwkvKiBGaWx0ZXIgb3V0IGFjdGl2ZSBzZXR0aW5ncyAqLworCisJCQluID0gMDsKKwkJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQkvKiBDb3VudCBzZWxlY3RlZCBkZXZpY2UgYml0cyAqLworCQkJCWlmIChtYXNrICYgKDEgPDwgaSkpCisJCQkJCW4rKzsKKworCQkJaWYgKG4gIT0gMSkKKwkJCQltYXNrID0gU09VTkRfTUFTS19NSUM7CisJCX0KKwkJc3dpdGNoIChtYXNrKSB7CisJCWNhc2UgU09VTkRfTUFTS19NSUM6CisJCQlyZWNkZXYgPSAyOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NQVNLX0xJTkU6CisJCWNhc2UgU09VTkRfTUFTS19MSU5FMzoKKwkJCXJlY2RldiA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01BU0tfQ0Q6CisJCWNhc2UgU09VTkRfTUFTS19MSU5FMToKKwkJCXJlY2RldiA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01BU0tfSU1JWDoKKwkJCXJlY2RldiA9IDM7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbWFzayA9IFNPVU5EX01BU0tfTUlDOworCQkJcmVjZGV2ID0gMjsKKwkJfQorCisJCXJlY2RldiA8PD0gNjsKKwkJYWRfd3JpdGUoZGV2YywgMCwgKGFkX3JlYWQoZGV2YywgMCkgJiAweDNmKSB8IHJlY2Rldik7CisJCWFkX3dyaXRlKGRldmMsIDEsIChhZF9yZWFkKGRldmMsIDEpICYgMHgzZikgfCByZWNkZXYpOworCX0gZWxzZSB7IC8qIHNvdW5kcHJvICovCisJCXVuc2lnbmVkIGNoYXIgdmFsOworCQlpbnQgc2V0X3JlY19iaXQ7CisJCWludCBqOworCisJCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CS8qIEZvciBlYWNoIGJpdCAqLworCQkJaWYgKChkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMgJiAoMSA8PCBpKSkgPT0gMCkKKwkJCQljb250aW51ZTsJLyogRGV2aWNlIG5vdCBzdXBwb3J0ZWQgKi8KKworCQkJZm9yIChqID0gTEVGVF9DSE47IGogPD0gUklHSFRfQ0hOOyBqKyspIHsKKwkJCQlpZiAoZGV2Yy0+bWl4X2RldmljZXNbaV1bal0ubmJpdHMgPT0gMCkgLyogSW5leGlzdGVudCBjaGFubmVsICovCisJCQkJCWNvbnRpbnVlOworCisJCQkJLyoKKwkJCQkgKiBUaGlzIGlzIHRyaWNreToKKwkJCQkgKiBzZXRfcmVjX2JpdCBiZWNvbWVzIDEgaWYgdGhlIGNvcnJlc3BvbmRpbmcgYml0IGluIG1hc2sgaXMgc2V0CisJCQkJICogdGhlbiBpdCBnZXRzIGZsaXBwZWQgaWYgdGhlIHBvbGFyaXR5IGlzIGludmVyc2UKKwkJCQkgKi8KKwkJCQlzZXRfcmVjX2JpdCA9ICgobWFzayAmICgxIDw8IGkpKSAhPSAwKSBeIGRldmMtPm1peF9kZXZpY2VzW2ldW2pdLnJlY3BvbDsKKworCQkJCXZhbCA9IGFkX3JlYWQoZGV2YywgZGV2Yy0+bWl4X2RldmljZXNbaV1bal0ucmVjcmVnKTsKKwkJCQl2YWwgJj0gfigxIDw8IGRldmMtPm1peF9kZXZpY2VzW2ldW2pdLnJlY3Bvcyk7CisJCQkJdmFsIHw9IChzZXRfcmVjX2JpdCA8PCBkZXZjLT5taXhfZGV2aWNlc1tpXVtqXS5yZWNwb3MpOworCQkJCWFkX3dyaXRlKGRldmMsIGRldmMtPm1peF9kZXZpY2VzW2ldW2pdLnJlY3JlZywgdmFsKTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCS8qIFJlbmFtZSB0aGUgbWl4ZXIgYml0cyBiYWNrIGlmIG5lY2Vzc2FyeSAqLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCXsKKwkJaWYgKGRldmMtPm1peGVyX3Jlcm91dGVbaV0gIT0gaSkKKwkJeworCQkJaWYgKG1hc2sgJiAoMSA8PCBkZXZjLT5taXhlcl9yZXJvdXRlW2ldKSkKKwkJCXsKKwkJCQltYXNrICY9IH4oMSA8PCBkZXZjLT5taXhlcl9yZXJvdXRlW2ldKTsKKwkJCQltYXNrIHw9ICgxIDw8IGkpOworCQkJfQorCQl9CisJfQorCWRldmMtPnJlY21hc2sgPSBtYXNrOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfYml0cyhhZDE4NDhfaW5mbyAqIGRldmMsIHVuc2lnbmVkIGNoYXIgKnJlZ3ZhbCwKKwkJCXVuc2lnbmVkIGNoYXIgKm11dGV2YWwsIGludCBkZXYsIGludCBjaG4sIGludCBuZXd2YWwpCit7CisJdW5zaWduZWQgY2hhciBtYXNrOworCWludCBzaGlmdDsKKwlpbnQgbXV0ZTsKKwlpbnQgbXV0ZW1hc2s7CisJaW50IHNldF9tdXRlX2JpdDsKKworCXNldF9tdXRlX2JpdCA9IChuZXd2YWwgPT0gMCkgXiBkZXZjLT5taXhfZGV2aWNlc1tkZXZdW2Nobl0ubXV0ZXBvbDsKKworCWlmIChkZXZjLT5taXhfZGV2aWNlc1tkZXZdW2Nobl0ucG9sYXJpdHkgPT0gMSkJLyogUmV2ZXJzZSAqLworCQluZXd2YWwgPSAxMDAgLSBuZXd2YWw7CisKKwltYXNrID0gKDEgPDwgZGV2Yy0+bWl4X2RldmljZXNbZGV2XVtjaG5dLm5iaXRzKSAtIDE7CisJc2hpZnQgPSBkZXZjLT5taXhfZGV2aWNlc1tkZXZdW2Nobl0uYml0cG9zOworCisJaWYgKGRldmMtPm1peF9kZXZpY2VzW2Rldl1bY2huXS5tdXRlcG9zID09IDgpCisJewkJCS8qIGlmIHRoZXJlIGlzIG5vIG11dGUgYml0ICovCisJCW11dGUgPSAwOwkvKiBObyBtdXRlIGJpdDsgZG8gbm90aGluZyBzcGVjaWFsICovCisJCW11dGVtYXNrID0gfjA7CS8qIE5vIG11dGUgYml0OyBkbyBub3RoaW5nIHNwZWNpYWwgKi8KKwl9CisJZWxzZQorCXsKKwkJbXV0ZSA9IChzZXRfbXV0ZV9iaXQgPDwgZGV2Yy0+bWl4X2RldmljZXNbZGV2XVtjaG5dLm11dGVwb3MpOworCQltdXRlbWFzayA9IH4oMSA8PCBkZXZjLT5taXhfZGV2aWNlc1tkZXZdW2Nobl0ubXV0ZXBvcyk7CisJfQorCisJbmV3dmFsID0gKGludCkgKChuZXd2YWwgKiBtYXNrKSArIDUwKSAvIDEwMDsJLyogU2NhbGUgaXQgKi8KKwkqcmVndmFsICY9IH4obWFzayA8PCBzaGlmdCk7CQkJLyogQ2xlYXIgYml0cyAqLworCSpyZWd2YWwgfD0gKG5ld3ZhbCAmIG1hc2spIDw8IHNoaWZ0OwkJLyogU2V0IG5ldyB2YWx1ZSAqLworCisJKm11dGV2YWwgJj0gbXV0ZW1hc2s7CisJKm11dGV2YWwgfD0gbXV0ZTsKK30KKworc3RhdGljIGludCBhZDE4NDhfbWl4ZXJfZ2V0KGFkMTg0OF9pbmZvICogZGV2YywgaW50IGRldikKK3sKKwlpZiAoISgoMSA8PCBkZXYpICYgZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRldiA9IGRldmMtPm1peGVyX3Jlcm91dGVbZGV2XTsKKworCXJldHVybiBkZXZjLT5sZXZlbHNbZGV2XTsKK30KKworc3RhdGljIHZvaWQgYWQxODQ4X21peGVyX3NldF9jaGFubmVsKGFkMTg0OF9pbmZvICpkZXZjLCBpbnQgZGV2LCBpbnQgdmFsdWUsIGludCBjaGFubmVsKQoreworCWludCByZWdvZmZzLCBtdXRlcmVnb2ZmczsKKwl1bnNpZ25lZCBjaGFyIHZhbCwgbXV0ZXZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmVnb2ZmcyA9IGRldmMtPm1peF9kZXZpY2VzW2Rldl1bY2hhbm5lbF0ucmVnbm87CisJbXV0ZXJlZ29mZnMgPSBkZXZjLT5taXhfZGV2aWNlc1tkZXZdW2NoYW5uZWxdLm11dGVyZWc7CisJdmFsID0gYWRfcmVhZChkZXZjLCByZWdvZmZzKTsKKworCWlmIChtdXRlcmVnb2ZmcyAhPSByZWdvZmZzKSB7CisJCW11dGV2YWwgPSBhZF9yZWFkKGRldmMsIG11dGVyZWdvZmZzKTsKKwkJY2hhbmdlX2JpdHMoZGV2YywgJnZhbCwgJm11dGV2YWwsIGRldiwgY2hhbm5lbCwgdmFsdWUpOworCX0KKwllbHNlCisJCWNoYW5nZV9iaXRzKGRldmMsICZ2YWwsICZ2YWwsIGRldiwgY2hhbm5lbCwgdmFsdWUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWFkX3dyaXRlKGRldmMsIHJlZ29mZnMsIHZhbCk7CisJZGV2Yy0+c2F2ZWRfcmVnc1tyZWdvZmZzXSA9IHZhbDsKKwlpZiAobXV0ZXJlZ29mZnMgIT0gcmVnb2ZmcykgeworCQlhZF93cml0ZShkZXZjLCBtdXRlcmVnb2ZmcywgbXV0ZXZhbCk7CisJCWRldmMtPnNhdmVkX3JlZ3NbbXV0ZXJlZ29mZnNdID0gbXV0ZXZhbDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYWQxODQ4X21peGVyX3NldChhZDE4NDhfaW5mbyAqIGRldmMsIGludCBkZXYsIGludCB2YWx1ZSkKK3sKKwlpbnQgbGVmdCA9IHZhbHVlICYgMHgwMDAwMDBmZjsKKwlpbnQgcmlnaHQgPSAodmFsdWUgJiAweDAwMDBmZjAwKSA+PiA4OworCWludCByZXR2b2w7CisKKwlpZiAoZGV2ID4gMzEpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEoZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJiAoMSA8PCBkZXYpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkZXYgPSBkZXZjLT5taXhlcl9yZXJvdXRlW2Rldl07CisKKwlpZiAoZGV2Yy0+bWl4X2RldmljZXNbZGV2XVtMRUZUX0NITl0ubmJpdHMgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobGVmdCA+IDEwMCkKKwkJbGVmdCA9IDEwMDsKKwlpZiAocmlnaHQgPiAxMDApCisJCXJpZ2h0ID0gMTAwOworCisJaWYgKGRldmMtPm1peF9kZXZpY2VzW2Rldl1bUklHSFRfQ0hOXS5uYml0cyA9PSAwKQkvKiBNb25vIGNvbnRyb2wgKi8KKwkJcmlnaHQgPSBsZWZ0OworCisJcmV0dm9sID0gbGVmdCB8IChyaWdodCA8PCA4KTsKKworCS8qIFNjYWxlIHZvbHVtZXMgKi8KKwlsZWZ0ID0gbWl4X2N2dFtsZWZ0XTsKKwlyaWdodCA9IG1peF9jdnRbcmlnaHRdOworCisJZGV2Yy0+bGV2ZWxzW2Rldl0gPSByZXR2b2w7CisKKwkvKgorCSAqIFNldCB0aGUgbGVmdCBjaGFubmVsCisJICovCisJYWQxODQ4X21peGVyX3NldF9jaGFubmVsKGRldmMsIGRldiwgbGVmdCwgTEVGVF9DSE4pOworCisJLyoKKwkgKiBTZXQgdGhlIHJpZ2h0IGNoYW5uZWwKKwkgKi8KKwlpZiAoZGV2Yy0+bWl4X2RldmljZXNbZGV2XVtSSUdIVF9DSE5dLm5iaXRzID09IDApCisJCWdvdG8gb3V0OworCWFkMTg0OF9taXhlcl9zZXRfY2hhbm5lbChkZXZjLCBkZXYsIHJpZ2h0LCBSSUdIVF9DSE4pOworCisgb3V0OgorCXJldHVybiByZXR2b2w7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0OF9taXhlcl9yZXNldChhZDE4NDhfaW5mbyAqIGRldmMpCit7CisJaW50IGk7CisJY2hhciBuYW1lWzMyXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJZGV2Yy0+bWl4X2RldmljZXMgPSAmKGFkMTg0OF9taXhfZGV2aWNlc1swXSk7CisKKwlzcHJpbnRmKG5hbWUsICIlc18lZCIsIGRldmMtPmNoaXBfbmFtZSwgbnJfYWQxODQ4X2RldnMpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJCWRldmMtPm1peGVyX3Jlcm91dGVbaV0gPSBpOworCisJZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzID0gTU9ERTFfUkVDX0RFVklDRVM7CisKKwlzd2l0Y2ggKGRldmMtPm1vZGVsKQorCXsKKwkJY2FzZSBNRF80MjMxOgorCQljYXNlIE1EXzQyMzFBOgorCQljYXNlIE1EXzE4NDU6CisJCWNhc2UgTURfMTg0NV9TU0NBUEU6CisJCQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IE1PREUyX01JWEVSX0RFVklDRVM7CisJCQlicmVhazsKKworCQljYXNlIE1EX0M5MzA6CisJCQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IEM5MzBfTUlYRVJfREVWSUNFUzsKKwkJCWRldmMtPm1peF9kZXZpY2VzID0gJihjOTMwX21peF9kZXZpY2VzWzBdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTURfSVdBVkU6CisJCQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IE1PREUzX01JWEVSX0RFVklDRVM7CisJCQlkZXZjLT5taXhfZGV2aWNlcyA9ICYoaXdhdmVfbWl4X2RldmljZXNbMF0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRF80MnhCOgorCQljYXNlIE1EXzQyMzk6CisJCQlkZXZjLT5taXhfZGV2aWNlcyA9ICYoY3M0MnhiX21peF9kZXZpY2VzWzBdKTsKKwkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzID0gTU9ERTNfTUlYRVJfREVWSUNFUzsKKwkJCWJyZWFrOworCQljYXNlIE1EXzQyMzI6CisJCWNhc2UgTURfNDIzNToKKwkJY2FzZSBNRF80MjM2OgorCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSBNT0RFM19NSVhFUl9ERVZJQ0VTOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRF8xODQ4OgorCQkJaWYgKHNvdW5kcHJvKSB7CisJCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSBTUFJPX01JWEVSX0RFVklDRVM7CisJCQkJZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzID0gU1BST19SRUNfREVWSUNFUzsKKwkJCQlkZXZjLT5taXhfZGV2aWNlcyA9ICYoc3Byb19taXhfZGV2aWNlc1swXSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJZGVmYXVsdDoKKwkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzID0gTU9ERTFfTUlYRVJfREVWSUNFUzsKKwl9CisKKwlkZXZjLT5vcmlnX2RldmljZXMgPSBkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlczsKKwlkZXZjLT5vcmlnX3JlY19kZXZpY2VzID0gZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOworCisJZGV2Yy0+bGV2ZWxzID0gbG9hZF9taXhlcl92b2x1bWVzKG5hbWUsIGRlZmF1bHRfbWl4ZXJfbGV2ZWxzLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwl7CisJCWlmIChkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmICgxIDw8IGkpKQorCQkJYWQxODQ4X21peGVyX3NldChkZXZjLCBpLCBkZXZjLT5sZXZlbHNbaV0pOworCX0KKwkKKwlhZDE4NDhfc2V0X3JlY21hc2soZGV2YywgU09VTkRfTUFTS19NSUMpOworCQorCWRldmMtPm1peGVyX291dHB1dF9wb3J0ID0gZGV2Yy0+bGV2ZWxzWzMxXSB8IEFVRElPX0hFQURQSE9ORSB8IEFVRElPX0xJTkVfT1VUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWlmICghc291bmRwcm8pIHsKKwkJaWYgKGRldmMtPm1peGVyX291dHB1dF9wb3J0ICYgQVVESU9fU1BFQUtFUikKKwkJCWFkX3dyaXRlKGRldmMsIDI2LCBhZF9yZWFkKGRldmMsIDI2KSAmIH4weDQwKTsJLyogVW5tdXRlIG1vbm8gb3V0ICovCisJCWVsc2UKKwkJCWFkX3dyaXRlKGRldmMsIDI2LCBhZF9yZWFkKGRldmMsIDI2KSB8IDB4NDApOwkvKiBNdXRlIG1vbm8gb3V0ICovCisJfSBlbHNlIHsKKwkJLyoKKwkJICogRnJvbSB0aGUgIndvdWxkbid0IGl0IGJlIG5pY2UgaWYgdGhlIG1peGVyIEFQSSBoYWQgKGJldHRlcikKKwkJICogc3VwcG9ydCBmb3IgY3VzdG9tIHN0dWZmIiBjYXRlZ29yeQorCQkgKi8KKwkJLyogRW5hYmxlIHN1cnJvdW5kIG1vZGUgYW5kIFNCMTYgbWl4ZXIgKi8KKwkJYWRfd3JpdGUoZGV2YywgMTYsIDB4NjApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCBhZDE4NDhfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlhZDE4NDhfaW5mbyAqZGV2YyA9IG1peGVyX2RldnNbZGV2XS0+ZGV2YzsKKwlpbnQgdmFsOworCisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMSkgCisJeworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodmFsICE9IDB4ZmZmZikgCisJCXsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQl2YWwgJj0gKEFVRElPX1NQRUFLRVIgfCBBVURJT19IRUFEUEhPTkUgfCBBVURJT19MSU5FX09VVCk7CisJCQlkZXZjLT5taXhlcl9vdXRwdXRfcG9ydCA9IHZhbDsKKwkJCXZhbCB8PSBBVURJT19IRUFEUEhPTkUgfCBBVURJT19MSU5FX09VVDsJLyogQWx3YXlzIG9uICovCisJCQlkZXZjLT5taXhlcl9vdXRwdXRfcG9ydCA9IHZhbDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJCWlmICh2YWwgJiBBVURJT19TUEVBS0VSKQorCQkJCWFkX3dyaXRlKGRldmMsIDI2LCBhZF9yZWFkKGRldmMsIDI2KSAmIH4weDQwKTsJLyogVW5tdXRlIG1vbm8gb3V0ICovCisJCQllbHNlCisJCQkJYWRfd3JpdGUoZGV2YywgMjYsIGFkX3JlYWQoZGV2YywgMjYpIHwgMHg0MCk7CQkvKiBNdXRlIG1vbm8gb3V0ICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJfQorCQl2YWwgPSBkZXZjLT5taXhlcl9vdXRwdXRfcG9ydDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUyKQorCXsKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybihhZDE4NDhfY29udHJvbChBRDE4NDhfTUlYRVJfUkVST1VURSwgdmFsKSk7CisJfQorCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpID09ICdNJykgCisJeworCQlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkKKwkJeworCQkJc3dpdGNoIChjbWQgJiAweGZmKSAKKwkJCXsKKwkJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJCXZhbCA9IGFkMTg0OF9zZXRfcmVjbWFzayhkZXZjLCB2YWwpOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQlkZWZhdWx0OgorCQkJCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQl2YWwgPSBhZDE4NDhfbWl4ZXJfc2V0KGRldmMsIGNtZCAmIDB4ZmYsIHZhbCk7CisJCQkJCWJyZWFrOworCQkJfSAKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN3aXRjaCAoY21kICYgMHhmZikgCisJCQl7CisJCQkJLyoKKwkJCQkgKiBSZXR1cm4gcGFyYW1ldGVycworCQkJCSAqLworCQkJICAgIAorCQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCQl2YWwgPSBkZXZjLT5yZWNtYXNrOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCQkJCXZhbCA9IGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzOworCQkJCQlicmVhazsKKwkJCQkKKwkJCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6CisJCQkJCXZhbCA9IGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzOworCQkJCQlpZiAoZGV2Yy0+bW9kZWwgIT0gTURfQzkzMCkKKwkJCQkJCXZhbCAmPSB+KFNPVU5EX01BU0tfU1BFQUtFUiB8IFNPVU5EX01BU0tfSU1JWCk7CisJCQkJCWJyZWFrOworCQkJCQorCQkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJCQkJdmFsID0gZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCQkJdmFsPVNPVU5EX0NBUF9FWENMX0lOUFVUOworCQkJCQlicmVhazsKKworCQkJCWRlZmF1bHQ6CisJCQkJCXZhbCA9IGFkMTg0OF9taXhlcl9nZXQoZGV2YywgY21kICYgMHhmZik7CisJCQkJCWJyZWFrOworCQkJfQorCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOworCQl9CisJfQorCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYWQxODQ4X3NldF9zcGVlZChpbnQgZGV2LCBpbnQgYXJnKQoreworCWFkMTg0OF9pbmZvICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwkvKgorCSAqIFRoZSBzYW1wbGluZyBzcGVlZCBpcyBlbmNvZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBuaWJibGUgb2YgSTguIFRoZQorCSAqIExTQiBzZWxlY3RzIHRoZSBjbG9jayBzb3VyY2UgKDA9MjQuNTc2IE1IeiwgMT0xNi45MzQ0IE1IeikgYW5kIG90aGVyCisJICogdGhyZWUgYml0cyBzZWxlY3QgdGhlIGRpdmlzb3IgKGluZGlyZWN0bHkpOgorCSAqCisJICogVGhlIGF2YWlsYWJsZSBzcGVlZHMgYXJlIGluIHRoZSBmb2xsb3dpbmcgdGFibGUuIEtlZXAgdGhlIHNwZWVkcyBpbgorCSAqIHRoZSBpbmNyZWFzaW5nIG9yZGVyLgorCSAqLworCXR5cGVkZWYgc3RydWN0CisJeworCQlpbnQgICAgICAgICAgICAgc3BlZWQ7CisJCXVuc2lnbmVkIGNoYXIgICBiaXRzOworCX0KKwlzcGVlZF9zdHJ1Y3Q7CisKKwlzdGF0aWMgc3BlZWRfc3RydWN0IHNwZWVkX3RhYmxlW10gPQorCXsKKwkJezU1MTAsICgwIDw8IDEpIHwgMX0sCisJCXs1NTEwLCAoMCA8PCAxKSB8IDF9LAorCQl7NjYyMCwgKDcgPDwgMSkgfCAxfSwKKwkJezgwMDAsICgwIDw8IDEpIHwgMH0sCisJCXs5NjAwLCAoNyA8PCAxKSB8IDB9LAorCQl7MTEwMjUsICgxIDw8IDEpIHwgMX0sCisJCXsxNjAwMCwgKDEgPDwgMSkgfCAwfSwKKwkJezE4OTAwLCAoMiA8PCAxKSB8IDF9LAorCQl7MjIwNTAsICgzIDw8IDEpIHwgMX0sCisJCXsyNzQyMCwgKDIgPDwgMSkgfCAwfSwKKwkJezMyMDAwLCAoMyA8PCAxKSB8IDB9LAorCQl7MzMwNzUsICg2IDw8IDEpIHwgMX0sCisJCXszNzgwMCwgKDQgPDwgMSkgfCAxfSwKKwkJezQ0MTAwLCAoNSA8PCAxKSB8IDF9LAorCQl7NDgwMDAsICg2IDw8IDEpIHwgMH0KKwl9OworCisJaW50IGksIG4sIHNlbGVjdGVkID0gLTE7CisKKwluID0gc2l6ZW9mKHNwZWVkX3RhYmxlKSAvIHNpemVvZihzcGVlZF9zdHJ1Y3QpOworCisJaWYgKGFyZyA8PSAwKQorCQlyZXR1cm4gcG9ydGMtPnNwZWVkOworCisJaWYgKGRldmMtPm1vZGVsID09IE1EXzE4NDUgfHwgZGV2Yy0+bW9kZWwgPT0gTURfMTg0NV9TU0NBUEUpCS8qIEFEMTg0NSBoYXMgZGlmZmVyZW50IHRpbWVyIHRoYW4gb3RoZXJzICovCisJeworCQlpZiAoYXJnIDwgNDAwMCkKKwkJCWFyZyA9IDQwMDA7CisJCWlmIChhcmcgPiA1MDAwMCkKKwkJCWFyZyA9IDUwMDAwOworCisJCXBvcnRjLT5zcGVlZCA9IGFyZzsKKwkJcG9ydGMtPnNwZWVkX2JpdHMgPSBzcGVlZF90YWJsZVszXS5iaXRzOworCQlyZXR1cm4gcG9ydGMtPnNwZWVkOworCX0KKwlpZiAoYXJnIDwgc3BlZWRfdGFibGVbMF0uc3BlZWQpCisJCXNlbGVjdGVkID0gMDsKKwlpZiAoYXJnID4gc3BlZWRfdGFibGVbbiAtIDFdLnNwZWVkKQorCQlzZWxlY3RlZCA9IG4gLSAxOworCisJZm9yIChpID0gMSAvKnJlYWxseSAqLyA7IHNlbGVjdGVkID09IC0xICYmIGkgPCBuOyBpKyspCisJeworCQlpZiAoc3BlZWRfdGFibGVbaV0uc3BlZWQgPT0gYXJnKQorCQkJc2VsZWN0ZWQgPSBpOworCQllbHNlIGlmIChzcGVlZF90YWJsZVtpXS5zcGVlZCA+IGFyZykKKwkJeworCQkJaW50IGRpZmYxLCBkaWZmMjsKKworCQkJZGlmZjEgPSBhcmcgLSBzcGVlZF90YWJsZVtpIC0gMV0uc3BlZWQ7CisJCQlkaWZmMiA9IHNwZWVkX3RhYmxlW2ldLnNwZWVkIC0gYXJnOworCisJCQlpZiAoZGlmZjEgPCBkaWZmMikKKwkJCQlzZWxlY3RlZCA9IGkgLSAxOworCQkJZWxzZQorCQkJCXNlbGVjdGVkID0gaTsKKwkJfQorCX0KKwlpZiAoc2VsZWN0ZWQgPT0gLTEpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4NDg6IENhbid0IGZpbmQgc3BlZWQ/Pz9cbiIpOworCQlzZWxlY3RlZCA9IDM7CisJfQorCXBvcnRjLT5zcGVlZCA9IHNwZWVkX3RhYmxlW3NlbGVjdGVkXS5zcGVlZDsKKwlwb3J0Yy0+c3BlZWRfYml0cyA9IHNwZWVkX3RhYmxlW3NlbGVjdGVkXS5iaXRzOworCXJldHVybiBwb3J0Yy0+c3BlZWQ7Cit9CisKK3N0YXRpYyBzaG9ydCBhZDE4NDhfc2V0X2NoYW5uZWxzKGludCBkZXYsIHNob3J0IGFyZykKK3sKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwlpZiAoYXJnICE9IDEgJiYgYXJnICE9IDIpCisJCXJldHVybiBwb3J0Yy0+Y2hhbm5lbHM7CisKKwlwb3J0Yy0+Y2hhbm5lbHMgPSBhcmc7CisJcmV0dXJuIGFyZzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBhZDE4NDhfc2V0X2JpdHMoaW50IGRldiwgdW5zaWduZWQgaW50IGFyZykKK3sKKwlhZDE4NDhfaW5mbyAgICAqZGV2YyA9IChhZDE4NDhfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJYWQxODQ4X3BvcnRfaW5mbyAqcG9ydGMgPSAoYWQxODQ4X3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCisJc3RhdGljIHN0cnVjdCBmb3JtYXRfdGJsCisJeworCQkgIGludCAgICAgICAgICAgICBmb3JtYXQ7CisJCSAgdW5zaWduZWQgY2hhciAgIGJpdHM7CisJfQorCWZvcm1hdDJiaXRzW10gPQorCXsKKwkJeworCQkJMCwgMAorCQl9CisJCSwKKwkJeworCQkJQUZNVF9NVV9MQVcsIDEKKwkJfQorCQksCisJCXsKKwkJCUFGTVRfQV9MQVcsIDMKKwkJfQorCQksCisJCXsKKwkJCUFGTVRfSU1BX0FEUENNLCA1CisJCX0KKwkJLAorCQl7CisJCQlBRk1UX1U4LCAwCisJCX0KKwkJLAorCQl7CisJCQlBRk1UX1MxNl9MRSwgMgorCQl9CisJCSwKKwkJeworCQkJQUZNVF9TMTZfQkUsIDYKKwkJfQorCQksCisJCXsKKwkJCUFGTVRfUzgsIDAKKwkJfQorCQksCisJCXsKKwkJCUFGTVRfVTE2X0xFLCAwCisJCX0KKwkJLAorCQl7CisJCQlBRk1UX1UxNl9CRSwgMAorCQl9CisJfTsKKwlpbnQgaSwgbiA9IHNpemVvZihmb3JtYXQyYml0cykgLyBzaXplb2Yoc3RydWN0IGZvcm1hdF90YmwpOworCisJaWYgKGFyZyA9PSAwKQorCQlyZXR1cm4gcG9ydGMtPmF1ZGlvX2Zvcm1hdDsKKworCWlmICghKGFyZyAmIGFkX2Zvcm1hdF9tYXNrW2RldmMtPm1vZGVsXSkpCisJCWFyZyA9IEFGTVRfVTg7CisKKwlwb3J0Yy0+YXVkaW9fZm9ybWF0ID0gYXJnOworCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJaWYgKGZvcm1hdDJiaXRzW2ldLmZvcm1hdCA9PSBhcmcpCisJCXsKKwkJCWlmICgocG9ydGMtPmZvcm1hdF9iaXRzID0gZm9ybWF0MmJpdHNbaV0uYml0cykgPT0gMCkKKwkJCQlyZXR1cm4gcG9ydGMtPmF1ZGlvX2Zvcm1hdCA9IEFGTVRfVTg7CQkvKiBXYXMgbm90IHN1cHBvcnRlZCAqLworCisJCQlyZXR1cm4gYXJnOworCQl9CisJLyogU3RpbGwgaGFuZ2luZyBoZXJlLiBTb21ldGhpbmcgbXVzdCBiZSB0ZXJyaWJseSB3cm9uZyAqLworCXBvcnRjLT5mb3JtYXRfYml0cyA9IDA7CisJcmV0dXJuIHBvcnRjLT5hdWRpb19mb3JtYXQgPSBBRk1UX1U4OworfQorCitzdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBhZDE4NDhfYXVkaW9fZHJpdmVyID0KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBhZDE4NDhfb3BlbiwKKwkuY2xvc2UJCQk9IGFkMTg0OF9jbG9zZSwKKwkub3V0cHV0X2Jsb2NrCQk9IGFkMTg0OF9vdXRwdXRfYmxvY2ssCisJLnN0YXJ0X2lucHV0CQk9IGFkMTg0OF9zdGFydF9pbnB1dCwKKwkucHJlcGFyZV9mb3JfaW5wdXQJPSBhZDE4NDhfcHJlcGFyZV9mb3JfaW5wdXQsCisJLnByZXBhcmVfZm9yX291dHB1dAk9IGFkMTg0OF9wcmVwYXJlX2Zvcl9vdXRwdXQsCisJLmhhbHRfaW8JCT0gYWQxODQ4X2hhbHQsCisJLmhhbHRfaW5wdXQJCT0gYWQxODQ4X2hhbHRfaW5wdXQsCisJLmhhbHRfb3V0cHV0CQk9IGFkMTg0OF9oYWx0X291dHB1dCwKKwkudHJpZ2dlcgkJPSBhZDE4NDhfdHJpZ2dlciwKKwkuc2V0X3NwZWVkCQk9IGFkMTg0OF9zZXRfc3BlZWQsCisJLnNldF9iaXRzCQk9IGFkMTg0OF9zZXRfYml0cywKKwkuc2V0X2NoYW5uZWxzCQk9IGFkMTg0OF9zZXRfY2hhbm5lbHMKK307CisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBhZDE4NDhfbWl4ZXJfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmlkCT0gIlNPVU5EUE9SVCIsCisJLm5hbWUJPSAiQUQxODQ4L0NTNDI0OC9DUzQyMzEiLAorCS5pb2N0bAk9IGFkMTg0OF9taXhlcl9pb2N0bAorfTsKKworc3RhdGljIGludCBhZDE4NDhfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlhZDE4NDhfaW5mbyAgICAqZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YzsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX2F1ZGlvZGV2cykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRldmMgPSAoYWQxODQ4X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXBvcnRjID0gKGFkMTg0OF9wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKworCS8qIGhlcmUgd2UgZG9uJ3QgaGF2ZSB0byBwcm90ZWN0IGFnYWluc3QgaW50ciAqLworCXNwaW5fbG9jaygmZGV2Yy0+bG9jayk7CisJaWYgKHBvcnRjLT5vcGVuX21vZGUgfHwgKGRldmMtPm9wZW5fbW9kZSAmIG1vZGUpKQorCXsKKwkJc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlkZXZjLT5kdWFsX2RtYSA9IDA7CisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9EVVBMRVgpCisJeworCQlkZXZjLT5kdWFsX2RtYSA9IDE7CisJfQorCWRldmMtPmludHJfYWN0aXZlID0gMDsKKwlkZXZjLT5hdWRpb19tb2RlID0gMDsKKwlkZXZjLT5vcGVuX21vZGUgfD0gbW9kZTsKKwlwb3J0Yy0+b3Blbl9tb2RlID0gbW9kZTsKKwlzcGluX3VubG9jaygmZGV2Yy0+bG9jayk7CisJYWQxODQ4X3RyaWdnZXIoZGV2LCAwKTsKKworCWlmIChtb2RlICYgT1BFTl9SRUFEKQorCQlkZXZjLT5yZWNvcmRfZGV2ID0gZGV2OworCWlmIChtb2RlICYgT1BFTl9XUklURSkKKwkJZGV2Yy0+cGxheWJhY2tfZGV2ID0gZGV2OworLyoKKyAqIE11dGUgb3V0cHV0IHVudGlsIHRoZSBwbGF5YmFjayByZWFsbHkgc3RhcnRzLiBUaGlzIGRlY3JlYXNlcyBjbGlja2luZyAoaG9wZSBzbykuCisgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJYWRfbXV0ZShkZXZjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfY2xvc2UoaW50IGRldikKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJYWQxODQ4X2luZm8gICAgKmRldmMgPSAoYWQxODQ4X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCWFkMTg0OF9wb3J0X2luZm8gKnBvcnRjID0gKGFkMTg0OF9wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKworCURFQihwcmludGsoImFkMTg0OF9jbG9zZSh2b2lkKVxuIikpOworCisJZGV2Yy0+aW50cl9hY3RpdmUgPSAwOworCWFkMTg0OF9oYWx0KGRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwlkZXZjLT5hdWRpb19tb2RlID0gMDsKKwlkZXZjLT5vcGVuX21vZGUgJj0gfnBvcnRjLT5vcGVuX21vZGU7CisJcG9ydGMtPm9wZW5fbW9kZSA9IDA7CisKKwlhZF91bm11dGUoZGV2Yyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0OF9vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwgaW50IGludHJmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFncywgY250OworCWFkMTg0OF9pbmZvICAgICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwljbnQgPSBjb3VudDsKKworCWlmIChwb3J0Yy0+YXVkaW9fZm9ybWF0ID09IEFGTVRfSU1BX0FEUENNKQorCXsKKwkJY250IC89IDQ7CisJfQorCWVsc2UKKwl7CisJCWlmIChwb3J0Yy0+YXVkaW9fZm9ybWF0ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9TMTZfQkUpKQkvKiAxNiBiaXQgZGF0YSAqLworCQkJY250ID4+PSAxOworCX0KKwlpZiAocG9ydGMtPmNoYW5uZWxzID4gMSkKKwkJY250ID4+PSAxOworCWNudC0tOworCisJaWYgKChkZXZjLT5hdWRpb19tb2RlICYgUENNX0VOQUJMRV9PVVRQVVQpICYmIChhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0FVVE9NT0RFKSAmJgorCSAgICBpbnRyZmxhZyAmJgorCSAgICBjbnQgPT0gZGV2Yy0+eGZlcl9jb3VudCkKKwl7CisJCWRldmMtPmF1ZGlvX21vZGUgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCWRldmMtPmludHJfYWN0aXZlID0gMTsKKwkJcmV0dXJuOwkvKgorCQkJICogQXV0byBETUEgbW9kZSBvbi4gTm8gbmVlZCB0byByZWFjdAorCQkJICovCisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWFkX3dyaXRlKGRldmMsIDE1LCAodW5zaWduZWQgY2hhcikgKGNudCAmIDB4ZmYpKTsKKwlhZF93cml0ZShkZXZjLCAxNCwgKHVuc2lnbmVkIGNoYXIpICgoY250ID4+IDgpICYgMHhmZikpOworCisJZGV2Yy0+eGZlcl9jb3VudCA9IGNudDsKKwlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCWRldmMtPmludHJfYWN0aXZlID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWQxODQ4X3N0YXJ0X2lucHV0KGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgY291bnQsIGludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3MsIGNudDsKKwlhZDE4NDhfaW5mbyAgICAqZGV2YyA9IChhZDE4NDhfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJYWQxODQ4X3BvcnRfaW5mbyAqcG9ydGMgPSAoYWQxODQ4X3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCisJY250ID0gY291bnQ7CisJaWYgKHBvcnRjLT5hdWRpb19mb3JtYXQgPT0gQUZNVF9JTUFfQURQQ00pCisJeworCQljbnQgLz0gNDsKKwl9CisJZWxzZQorCXsKKwkJaWYgKHBvcnRjLT5hdWRpb19mb3JtYXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1MxNl9CRSkpCS8qIDE2IGJpdCBkYXRhICovCisJCQljbnQgPj49IDE7CisJfQorCWlmIChwb3J0Yy0+Y2hhbm5lbHMgPiAxKQorCQljbnQgPj49IDE7CisJY250LS07CisKKwlpZiAoKGRldmMtPmF1ZGlvX21vZGUgJiBQQ01fRU5BQkxFX0lOUFVUKSAmJiAoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9BVVRPTU9ERSkgJiYKKwkJaW50cmZsYWcgJiYKKwkJY250ID09IGRldmMtPnhmZXJfY291bnQpCisJeworCQlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWRldmMtPmludHJfYWN0aXZlID0gMTsKKwkJcmV0dXJuOwkvKgorCQkJICogQXV0byBETUEgbW9kZSBvbi4gTm8gbmVlZCB0byByZWFjdAorCQkJICovCisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWlmIChkZXZjLT5tb2RlbCA9PSBNRF8xODQ4KQorCXsKKwkJICBhZF93cml0ZShkZXZjLCAxNSwgKHVuc2lnbmVkIGNoYXIpIChjbnQgJiAweGZmKSk7CisJCSAgYWRfd3JpdGUoZGV2YywgMTQsICh1bnNpZ25lZCBjaGFyKSAoKGNudCA+PiA4KSAmIDB4ZmYpKTsKKwl9CisJZWxzZQorCXsKKwkJICBhZF93cml0ZShkZXZjLCAzMSwgKHVuc2lnbmVkIGNoYXIpIChjbnQgJiAweGZmKSk7CisJCSAgYWRfd3JpdGUoZGV2YywgMzAsICh1bnNpZ25lZCBjaGFyKSAoKGNudCA+PiA4KSAmIDB4ZmYpKTsKKwl9CisKKwlhZF91bm11dGUoZGV2Yyk7CisKKwlkZXZjLT54ZmVyX2NvdW50ID0gY250OworCWRldmMtPmF1ZGlvX21vZGUgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgYWQxODQ4X3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJaW50ICAgICAgICAgICAgIHRpbWVvdXQ7CisJdW5zaWduZWQgY2hhciAgIGZzLCBvbGRfZnMsIHRtcCA9IDA7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCWFkMTg0OF9pbmZvICAgICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwlhZF9tdXRlKGRldmMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWZzID0gcG9ydGMtPnNwZWVkX2JpdHMgfCAocG9ydGMtPmZvcm1hdF9iaXRzIDw8IDUpOworCisJaWYgKHBvcnRjLT5jaGFubmVscyA+IDEpCisJCWZzIHw9IDB4MTA7CisKKwlhZF9lbnRlcl9NQ0UoZGV2Yyk7CS8qIEVuYWJsZXMgY2hhbmdlcyB0byB0aGUgZm9ybWF0IHNlbGVjdCByZWcgKi8KKworCWlmIChkZXZjLT5tb2RlbCA9PSBNRF8xODQ1IHx8IGRldmMtPm1vZGVsID09IE1EXzE4NDVfU1NDQVBFKSAvKiBVc2UgYWx0ZXJuYXRlIHNwZWVkIHNlbGVjdCByZWdpc3RlcnMgKi8KKwl7CisJCWZzICY9IDB4ZjA7CS8qIE1hc2sgb2ZmIHRoZSByYXRlIHNlbGVjdCBiaXRzICovCisKKwkJYWRfd3JpdGUoZGV2YywgMjIsIChwb3J0Yy0+c3BlZWQgPj4gOCkgJiAweGZmKTsJLyogU3BlZWQgTVNCICovCisJCWFkX3dyaXRlKGRldmMsIDIzLCBwb3J0Yy0+c3BlZWQgJiAweGZmKTsJLyogU3BlZWQgTFNCICovCisJfQorCW9sZF9mcyA9IGFkX3JlYWQoZGV2YywgOCk7CisKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURfNDIzMiB8fCBkZXZjLT5tb2RlbCA+PSBNRF80MjM2KQorCXsKKwkJdG1wID0gYWRfcmVhZChkZXZjLCAxNik7CisJCWFkX3dyaXRlKGRldmMsIDE2LCB0bXAgfCAweDMwKTsKKwl9CisJaWYgKGRldmMtPm1vZGVsID09IE1EX0lXQVZFKQorCQlhZF93cml0ZShkZXZjLCAxNywgMHhjMik7CS8qIERpc2FibGUgdmFyaWFibGUgZnJlcXVlbmN5IHNlbGVjdCAqLworCisJYWRfd3JpdGUoZGV2YywgOCwgZnMpOworCisJLyoKKwkgKiBXcml0ZSB0byBJOCBzdGFydHMgcmVzeW5jaHJvbml6YXRpb24uIFdhaXQgdW50aWwgaXQgY29tcGxldGVzLgorCSAqLworCisJdGltZW91dCA9IDA7CisJd2hpbGUgKHRpbWVvdXQgPCAxMDAgJiYgaW5iKGRldmMtPmJhc2UpICE9IDB4ODApCisJCXRpbWVvdXQrKzsKKwl0aW1lb3V0ID0gMDsKKwl3aGlsZSAodGltZW91dCA8IDEwMDAwICYmIGluYihkZXZjLT5iYXNlKSA9PSAweDgwKQorCQl0aW1lb3V0Kys7CisKKwlpZiAoZGV2Yy0+bW9kZWwgPj0gTURfNDIzMikKKwkJYWRfd3JpdGUoZGV2YywgMTYsIHRtcCAmIH4weDMwKTsKKworCWFkX2xlYXZlX01DRShkZXZjKTsJLyoKKwkJCQkgKiBTdGFydHMgdGhlIGNhbGlicmF0aW9uIHByb2Nlc3MuCisJCQkJICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJZGV2Yy0+eGZlcl9jb3VudCA9IDA7CisKKyNpZm5kZWYgRVhDTFVERV9USU1FUlMKKwlpZiAoZGV2ID09IHRpbWVyX2luc3RhbGxlZCAmJiBkZXZjLT50aW1lcl9ydW5uaW5nKQorCQlpZiAoKGZzICYgMHgwMSkgIT0gKG9sZF9mcyAmIDB4MDEpKQorCQl7CisJCQlhZDE4NDhfdG1yX3JlcHJvZ3JhbShkZXYpOworCQl9CisjZW5kaWYKKwlhZDE4NDhfaGFsdF9vdXRwdXQoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE4NDhfcHJlcGFyZV9mb3JfaW5wdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworCWludCB0aW1lb3V0OworCXVuc2lnbmVkIGNoYXIgZnMsIG9sZF9mcywgdG1wID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWFkMTg0OF9pbmZvICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwlpZiAoZGV2Yy0+YXVkaW9fbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJZnMgPSBwb3J0Yy0+c3BlZWRfYml0cyB8IChwb3J0Yy0+Zm9ybWF0X2JpdHMgPDwgNSk7CisKKwlpZiAocG9ydGMtPmNoYW5uZWxzID4gMSkKKwkJZnMgfD0gMHgxMDsKKworCWFkX2VudGVyX01DRShkZXZjKTsJLyogRW5hYmxlcyBjaGFuZ2VzIHRvIHRoZSBmb3JtYXQgc2VsZWN0IHJlZyAqLworCisJaWYgKChkZXZjLT5tb2RlbCA9PSBNRF8xODQ1KSB8fCAoZGV2Yy0+bW9kZWwgPT0gTURfMTg0NV9TU0NBUEUpKQkvKiBVc2UgYWx0ZXJuYXRlIHNwZWVkIHNlbGVjdCByZWdpc3RlcnMgKi8KKwl7CisJCWZzICY9IDB4ZjA7CS8qIE1hc2sgb2ZmIHRoZSByYXRlIHNlbGVjdCBiaXRzICovCisKKwkJYWRfd3JpdGUoZGV2YywgMjIsIChwb3J0Yy0+c3BlZWQgPj4gOCkgJiAweGZmKTsJLyogU3BlZWQgTVNCICovCisJCWFkX3dyaXRlKGRldmMsIDIzLCBwb3J0Yy0+c3BlZWQgJiAweGZmKTsJLyogU3BlZWQgTFNCICovCisJfQorCWlmIChkZXZjLT5tb2RlbCA9PSBNRF80MjMyKQorCXsKKwkJdG1wID0gYWRfcmVhZChkZXZjLCAxNik7CisJCWFkX3dyaXRlKGRldmMsIDE2LCB0bXAgfCAweDMwKTsKKwl9CisJaWYgKGRldmMtPm1vZGVsID09IE1EX0lXQVZFKQorCQlhZF93cml0ZShkZXZjLCAxNywgMHhjMik7CS8qIERpc2FibGUgdmFyaWFibGUgZnJlcXVlbmN5IHNlbGVjdCAqLworCisJLyoKKwkgKiBJZiBtb2RlID49IDIgKENTNDIzMSksIHNldCBJMjguIEl0J3MgdGhlIGNhcHR1cmUgZm9ybWF0IHJlZ2lzdGVyLgorCSAqLworCQorCWlmIChkZXZjLT5tb2RlbCAhPSBNRF8xODQ4KQorCXsKKwkJb2xkX2ZzID0gYWRfcmVhZChkZXZjLCAyOCk7CisJCWFkX3dyaXRlKGRldmMsIDI4LCBmcyk7CisKKwkJLyoKKwkJICogV3JpdGUgdG8gSTI4IHN0YXJ0cyByZXN5bmNocm9uaXphdGlvbi4gV2FpdCB1bnRpbCBpdCBjb21wbGV0ZXMuCisJCSAqLworCQkKKwkJdGltZW91dCA9IDA7CisJCXdoaWxlICh0aW1lb3V0IDwgMTAwICYmIGluYihkZXZjLT5iYXNlKSAhPSAweDgwKQorCQkJdGltZW91dCsrOworCisJCXRpbWVvdXQgPSAwOworCQl3aGlsZSAodGltZW91dCA8IDEwMDAwICYmIGluYihkZXZjLT5iYXNlKSA9PSAweDgwKQorCQkJdGltZW91dCsrOworCisJCWlmIChkZXZjLT5tb2RlbCAhPSBNRF8xODQ4ICYmIGRldmMtPm1vZGVsICE9IE1EXzE4NDUgJiYgZGV2Yy0+bW9kZWwgIT0gTURfMTg0NV9TU0NBUEUpCisJCXsKKwkJCS8qCisJCQkgKiBDUzQyMzEgY29tcGF0aWJsZSBkZXZpY2VzIGRvbid0IGhhdmUgc2VwYXJhdGUgc2FtcGxpbmcgcmF0ZSBzZWxlY3Rpb24KKwkJCSAqIHJlZ2lzdGVyIGZvciByZWNvcmRpbmcgYW4gcGxheWJhY2suIFRoZSBJOCByZWdpc3RlciBpcyBzaGFyZWQgc28gd2UgaGF2ZSB0bworCQkJICogc2V0IHRoZSBzcGVlZCBlbmNvZGluZyBiaXRzIG9mIGl0IHRvby4KKwkJCSAqLworCQkJdW5zaWduZWQgY2hhciAgIHRtcCA9IHBvcnRjLT5zcGVlZF9iaXRzIHwgKGFkX3JlYWQoZGV2YywgOCkgJiAweGYwKTsKKworCQkJYWRfd3JpdGUoZGV2YywgOCwgdG1wKTsKKwkJCS8qCisJCQkgKiBXcml0ZSB0byBJOCBzdGFydHMgcmVzeW5jaHJvbml6YXRpb24uIFdhaXQgdW50aWwgaXQgY29tcGxldGVzLgorCQkJICovCisJCQl0aW1lb3V0ID0gMDsKKwkJCXdoaWxlICh0aW1lb3V0IDwgMTAwICYmIGluYihkZXZjLT5iYXNlKSAhPSAweDgwKQorCQkJCXRpbWVvdXQrKzsKKworCQkJdGltZW91dCA9IDA7CisJCQl3aGlsZSAodGltZW91dCA8IDEwMDAwICYmIGluYihkZXZjLT5iYXNlKSA9PSAweDgwKQorCQkJCXRpbWVvdXQrKzsKKwkJfQorCX0KKwllbHNlCisJewkJCS8qIEZvciBBRDE4NDggc2V0IEk4LiAqLworCisJCW9sZF9mcyA9IGFkX3JlYWQoZGV2YywgOCk7CisJCWFkX3dyaXRlKGRldmMsIDgsIGZzKTsKKwkJLyoKKwkJICogV3JpdGUgdG8gSTggc3RhcnRzIHJlc3luY2hyb25pemF0aW9uLiBXYWl0IHVudGlsIGl0IGNvbXBsZXRlcy4KKwkJICovCisJCXRpbWVvdXQgPSAwOworCQl3aGlsZSAodGltZW91dCA8IDEwMCAmJiBpbmIoZGV2Yy0+YmFzZSkgIT0gMHg4MCkKKwkJCXRpbWVvdXQrKzsKKwkJdGltZW91dCA9IDA7CisJCXdoaWxlICh0aW1lb3V0IDwgMTAwMDAgJiYgaW5iKGRldmMtPmJhc2UpID09IDB4ODApCisJCQl0aW1lb3V0Kys7CisJfQorCisJaWYgKGRldmMtPm1vZGVsID09IE1EXzQyMzIpCisJCWFkX3dyaXRlKGRldmMsIDE2LCB0bXAgJiB+MHgzMCk7CisKKwlhZF9sZWF2ZV9NQ0UoZGV2Yyk7CS8qCisJCQkJICogU3RhcnRzIHRoZSBjYWxpYnJhdGlvbiBwcm9jZXNzLgorCQkJCSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWRldmMtPnhmZXJfY291bnQgPSAwOworCisjaWZuZGVmIEVYQ0xVREVfVElNRVJTCisJaWYgKGRldiA9PSB0aW1lcl9pbnN0YWxsZWQgJiYgZGV2Yy0+dGltZXJfcnVubmluZykKKwl7CisJCWlmICgoZnMgJiAweDAxKSAhPSAob2xkX2ZzICYgMHgwMSkpCisJCXsKKwkJCWFkMTg0OF90bXJfcmVwcm9ncmFtKGRldik7CisJCX0KKwl9CisjZW5kaWYKKwlhZDE4NDhfaGFsdF9pbnB1dChkZXYpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfaGFsdChpbnQgZGV2KQoreworCWFkMTg0OF9pbmZvICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlhZDE4NDhfcG9ydF9pbmZvICpwb3J0YyA9IChhZDE4NDhfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisKKwl1bnNpZ25lZCBjaGFyICAgYml0cyA9IGFkX3JlYWQoZGV2YywgOSk7CisKKwlpZiAoYml0cyAmIDB4MDEgJiYgKHBvcnRjLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKSkKKwkJYWQxODQ4X2hhbHRfb3V0cHV0KGRldik7CisKKwlpZiAoYml0cyAmIDB4MDIgJiYgKHBvcnRjLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpKQorCQlhZDE4NDhfaGFsdF9pbnB1dChkZXYpOworCWRldmMtPmF1ZGlvX21vZGUgPSAwOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfaGFsdF9pbnB1dChpbnQgZGV2KQoreworCWFkMTg0OF9pbmZvICAgICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlpZiAoIShhZF9yZWFkKGRldmMsIDkpICYgMHgwMikpCisJCXJldHVybjsJCS8qIENhcHR1cmUgbm90IGVuYWJsZWQgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWFkX211dGUoZGV2Yyk7CisKKwl7CisJCWludCAgICAgICAgICAgICB0bW91dDsKKwkJCisJCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkKKwkJICAgICAgICBkaXNhYmxlX2RtYShhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSk7CisKKwkJZm9yICh0bW91dCA9IDA7IHRtb3V0IDwgMTAwMDAwOyB0bW91dCsrKQorCQkJaWYgKGFkX3JlYWQoZGV2YywgMTEpICYgMHgxMCkKKwkJCQlicmVhazsKKwkJYWRfd3JpdGUoZGV2YywgOSwgYWRfcmVhZChkZXZjLCA5KSAmIH4weDAyKTsJLyogU3RvcCBjYXB0dXJlICovCisKKwkJaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KQorCQkgICAgICAgIGVuYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEpOworCQlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX0lOUFVUOworCX0KKworCW91dGIoMCwgaW9fU3RhdHVzKGRldmMpKTsJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCW91dGIoMCwgaW9fU3RhdHVzKGRldmMpKTsJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCisJZGV2Yy0+YXVkaW9fbW9kZSAmPSB+UENNX0VOQUJMRV9JTlBVVDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfaGFsdF9vdXRwdXQoaW50IGRldikKK3sKKwlhZDE4NDhfaW5mbyAqZGV2YyA9IChhZDE4NDhfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghKGFkX3JlYWQoZGV2YywgOSkgJiAweDAxKSkKKwkJcmV0dXJuOwkJLyogUGxheWJhY2sgbm90IGVuYWJsZWQgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCWFkX211dGUoZGV2Yyk7CisJeworCQlpbnQgICAgICAgICAgICAgdG1vdXQ7CisKKwkJaWYoIWlzYV9kbWFfYnJpZGdlX2J1Z2d5KQorCQkgICAgICAgIGRpc2FibGVfZG1hKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSk7CisKKwkJZm9yICh0bW91dCA9IDA7IHRtb3V0IDwgMTAwMDAwOyB0bW91dCsrKQorCQkJaWYgKGFkX3JlYWQoZGV2YywgMTEpICYgMHgxMCkKKwkJCQlicmVhazsKKwkJYWRfd3JpdGUoZGV2YywgOSwgYWRfcmVhZChkZXZjLCA5KSAmIH4weDAxKTsJLyogU3RvcCBwbGF5YmFjayAqLworCisJCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkKKwkJICAgICAgIGVuYWJsZV9kbWEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hKTsKKworCQlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKKwl9CisKKwlvdXRiKCgwKSwgaW9fU3RhdHVzKGRldmMpKTsJLyogQ2xlYXIgaW50ZXJydXB0IHN0YXR1cyAqLworCW91dGIoKDApLCBpb19TdGF0dXMoZGV2YykpOwkvKiBDbGVhciBpbnRlcnJ1cHQgc3RhdHVzICovCisKKwlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfdHJpZ2dlcihpbnQgZGV2LCBpbnQgc3RhdGUpCit7CisJYWQxODQ4X2luZm8gICAgKmRldmMgPSAoYWQxODQ4X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCWFkMTg0OF9wb3J0X2luZm8gKnBvcnRjID0gKGFkMTg0OF9wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJdW5zaWduZWQgY2hhciAgIHRtcCwgb2xkOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCXN0YXRlICY9IGRldmMtPmF1ZGlvX21vZGU7CisKKwl0bXAgPSBvbGQgPSBhZF9yZWFkKGRldmMsIDkpOworCisJaWYgKHBvcnRjLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpCisJeworCQkgIGlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfSU5QVVQpCisJCQkgIHRtcCB8PSAweDAyOworCQkgIGVsc2UKKwkJCSAgdG1wICY9IH4weDAyOworCX0KKwlpZiAocG9ydGMtPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpCisJeworCQlpZiAoc3RhdGUgJiBQQ01fRU5BQkxFX09VVFBVVCkKKwkJCXRtcCB8PSAweDAxOworCQllbHNlCisJCQl0bXAgJj0gfjB4MDE7CisJfQorCS8qIGFkX211dGUoZGV2Yyk7ICovCisJaWYgKHRtcCAhPSBvbGQpCisJeworCQkgIGFkX3dyaXRlKGRldmMsIDksIHRtcCk7CisJCSAgYWRfdW5tdXRlKGRldmMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgYWQxODQ4X2luaXRfaHcoYWQxODQ4X2luZm8gKiBkZXZjKQoreworCWludCBpOworCWludCAqaW5pdF92YWx1ZXM7CisKKwkvKgorCSAqIEluaXRpYWwgdmFsdWVzIGZvciB0aGUgaW5kaXJlY3QgcmVnaXN0ZXJzIG9mIENTNDI0OC9BRDE4NDguCisJICovCisJc3RhdGljIGludCAgICAgIGluaXRfdmFsdWVzX2FbXSA9CisJeworCQkweGE4LCAweGE4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDAwLCAweDAwLAorCQkweDAwLCAweDBjLCAweDAyLCAweDAwLCAweDhhLCAweDAxLCAweDAwLCAweDAwLAorCisJLyogUG9zaXRpb25zIDE2IHRvIDMxIGp1c3QgZm9yIENTNDIzMS8yIGFuZCBhZDE4NDUgKi8KKwkJMHg4MCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgxZiwgMHg0MCwKKwkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorCX07CisKKwlzdGF0aWMgaW50ICAgICAgaW5pdF92YWx1ZXNfYltdID0KKwl7CisJCS8qIAorCQkgICBWYWx1ZXMgZm9yIHRoZSBuZXdlciBjaGlwcworCQkgICBTb21lIG9mIHRoZSByZWdpc3RlciBpbml0aWFsaXphdGlvbiB2YWx1ZXMgd2VyZSBjaGFuZ2VkLiBJbgorCQkgICBvcmRlciB0byBnZXQgcmlkIG9mIHRoZSBjbGljayB0aGF0IHByZWNlZGVkIFBDTSBwbGF5YmFjaywKKwkJICAgY2FsaWJyYXRpb24gd2FzIGRpc2FibGVkIG9uIHRoZSAxMHRoIGJ5dGUuIE9uIHRoYXQgc2FtZSBieXRlLAorCQkgICBkdWFsIERNQSB3YXMgZW5hYmxlZDsgb24gdGhlIDExdGggYnl0ZSwgQURDIGRpdGhlcmluZyB3YXMKKwkJICAgZW5hYmxlZCwgc2luY2UgdGhhdCBpcyB0aGVvcmV0aWNhbGx5IGRlc2lyYWJsZTsgb24gdGhlIDEzdGgKKwkJICAgYnl0ZSwgTW9kZSAzIHdhcyBzZWxlY3RlZCwgdG8gZW5hYmxlIGFjY2VzcyB0byBleHRlbmRlZAorCQkgICByZWdpc3RlcnMuCisJCSAqLworCQkweGE4LCAweGE4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDAwLCAweDAwLAorCQkweDAwLCAweDAwLCAweDA2LCAweDAwLCAweGUwLCAweDAxLCAweDAwLCAweDAwLAorIAkJMHg4MCwgMHgwMCwgMHgxMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgxZiwgMHg0MCwKKyAJCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKKwl9OworCisJLyoKKwkgKglTZWxlY3QgaW5pdGlhbGlzYXRpb24gZGF0YQorCSAqLworCSAKKwlpbml0X3ZhbHVlcyA9IGluaXRfdmFsdWVzX2E7CisJaWYoZGV2Yy0+bW9kZWwgPj0gTURfNDIzNikKKwkJaW5pdF92YWx1ZXMgPSBpbml0X3ZhbHVlc19iOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCWFkX3dyaXRlKGRldmMsIGksIGluaXRfdmFsdWVzW2ldKTsKKworCisJYWRfbXV0ZShkZXZjKTsJCS8qIEluaXRpYWxpemUgc29tZSB2YXJpYWJsZXMgKi8KKwlhZF91bm11dGUoZGV2Yyk7CS8qIExlYXZlIGl0IHVubXV0ZWQgbm93ICovCisKKwlpZiAoZGV2Yy0+bW9kZWwgPiBNRF8xODQ4KQorCXsKKwkJaWYgKGRldmMtPm1vZGVsID09IE1EXzE4NDVfU1NDQVBFKQorCQkJYWRfd3JpdGUoZGV2YywgMTIsIGFkX3JlYWQoZGV2YywgMTIpIHwgMHg1MCk7CisJCWVsc2UgCisJCQlhZF93cml0ZShkZXZjLCAxMiwgYWRfcmVhZChkZXZjLCAxMikgfCAweDQwKTsJCS8qIE1vZGUyID0gZW5hYmxlZCAqLworCisJCWlmIChkZXZjLT5tb2RlbCA9PSBNRF9JV0FWRSkKKwkJCWFkX3dyaXRlKGRldmMsIDEyLCAweDZjKTsJLyogU2VsZWN0IGNvZGVjIG1vZGUgMyAqLworCisJCWlmIChkZXZjLT5tb2RlbCAhPSBNRF8xODQ1X1NTQ0FQRSkKKwkJCWZvciAoaSA9IDE2OyBpIDwgMzI7IGkrKykKKwkJCQlhZF93cml0ZShkZXZjLCBpLCBpbml0X3ZhbHVlc1tpXSk7CisKKwkJaWYgKGRldmMtPm1vZGVsID09IE1EX0lXQVZFKQorCQkJYWRfd3JpdGUoZGV2YywgMTYsIDB4MzApOwkvKiBQbGF5YmFjayBhbmQgY2FwdHVyZSBjb3VudGVycyBlbmFibGVkICovCisJfQorCWlmIChkZXZjLT5tb2RlbCA+IE1EXzE4NDgpCisJeworCQlpZiAoZGV2Yy0+YXVkaW9fZmxhZ3MgJiBETUFfRFVQTEVYKQorCQkJYWRfd3JpdGUoZGV2YywgOSwgYWRfcmVhZChkZXZjLCA5KSAmIH4weDA0KTsJLyogRHVhbCBETUEgbW9kZSAqLworCQllbHNlCisJCQlhZF93cml0ZShkZXZjLCA5LCBhZF9yZWFkKGRldmMsIDkpIHwgMHgwNCk7CS8qIFNpbmdsZSBETUEgbW9kZSAqLworCisJCWlmIChkZXZjLT5tb2RlbCA9PSBNRF8xODQ1IHx8IGRldmMtPm1vZGVsID09IE1EXzE4NDVfU1NDQVBFKQorCQkJYWRfd3JpdGUoZGV2YywgMjcsIGFkX3JlYWQoZGV2YywgMjcpIHwgMHgwOCk7CQkvKiBBbHRlcm5hdGUgZnJlcSBzZWxlY3QgZW5hYmxlZCAqLworCisJCWlmIChkZXZjLT5tb2RlbCA9PSBNRF9JV0FWRSkKKwkJewkJLyogU29tZSBtYWdpYyBJbnRlcndhdmUgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KKwkJCWFkX3dyaXRlKGRldmMsIDEyLCAweDZjKTsJLyogU2VsZWN0IGNvZGVjIG1vZGUgMyAqLworCQkJYWRfd3JpdGUoZGV2YywgMTYsIDB4MzApOwkvKiBQbGF5YmFjayBhbmQgY2FwdHVyZSBjb3VudGVycyBlbmFibGVkICovCisJCQlhZF93cml0ZShkZXZjLCAxNywgMHhjMik7CS8qIEFsdGVybmF0ZSBmZWF0dXJlIGVuYWJsZSAqLworCQl9CisJfQorCWVsc2UKKwl7CisJCSAgZGV2Yy0+YXVkaW9fZmxhZ3MgJj0gfkRNQV9EVVBMRVg7CisJCSAgYWRfd3JpdGUoZGV2YywgOSwgYWRfcmVhZChkZXZjLCA5KSB8IDB4MDQpOwkvKiBTaW5nbGUgRE1BIG1vZGUgKi8KKwkJICBpZiAoc291bmRwcm8pCisJCQkgIGFkX3dyaXRlKGRldmMsIDEyLCBhZF9yZWFkKGRldmMsIDEyKSB8IDB4NDApOwkvKiBNb2RlMiA9IGVuYWJsZWQgKi8KKwl9CisKKwlvdXRiKCgwKSwgaW9fU3RhdHVzKGRldmMpKTsJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzICovCisKKwkvKgorCSAqIFRvZ2dsZSB0aGUgTUNFIGJpdC4gSXQgY29tcGxldGVzIHRoZSBpbml0aWFsaXphdGlvbiBwaGFzZS4KKwkgKi8KKworCWFkX2VudGVyX01DRShkZXZjKTsJLyogSW4gY2FzZSB0aGUgYml0IHdhcyBvZmYgKi8KKwlhZF9sZWF2ZV9NQ0UoZGV2Yyk7CisKKwlhZDE4NDhfbWl4ZXJfcmVzZXQoZGV2Yyk7Cit9CisKK2ludCBhZDE4NDhfZGV0ZWN0KHN0cnVjdCByZXNvdXJjZSAqcG9ydHMsIGludCAqYWRfZmxhZ3MsIGludCAqb3NwKQoreworCXVuc2lnbmVkIGNoYXIgdG1wOworCWFkMTg0OF9pbmZvICpkZXZjID0gJmFkZXZfaW5mb1tucl9hZDE4NDhfZGV2c107CisJdW5zaWduZWQgY2hhciB0bXAxID0gMHhmZiwgdG1wMiA9IDB4ZmY7CisJaW50IG9wdGlDOTMwID0gMDsJLyogT1BUaSA4MkM5MzAgZmxhZyAqLworCWludCBpbnRlcndhdmUgPSAwOworCWludCBhZDE4NDdfZmxhZyA9IDA7CisJaW50IGNzNDI0OF9mbGFnID0gMDsKKwlpbnQgc3NjYXBlX2ZsYWcgPSAwOworCWludCBpb19iYXNlID0gcG9ydHMtPnN0YXJ0OworCisJaW50IGk7CisKKwlEREIocHJpbnRrKCJhZDE4NDhfZGV0ZWN0KCV4KVxuIiwgaW9fYmFzZSkpOworCisJaWYgKGFkX2ZsYWdzKQorCXsKKwkJaWYgKCphZF9mbGFncyA9PSAweDEyMzQ1Njc4KQorCQl7CisJCQlpbnRlcndhdmUgPSAxOworCQkJKmFkX2ZsYWdzID0gMDsKKwkJfQorCQkKKwkJaWYgKCphZF9mbGFncyA9PSAweDg3NjU0MzIxKQorCQl7CisJCQlzc2NhcGVfZmxhZyA9IDE7CisJCQkqYWRfZmxhZ3MgPSAwOworCQl9CisJCQorCQlpZiAoKmFkX2ZsYWdzID09IDB4MTIzNDU2NzcpCisJCXsKKwkJICAgIGNzNDI0OF9mbGFnID0gMTsKKwkJICAgICphZF9mbGFncyA9IDA7CisJCX0KKwl9CisJaWYgKG5yX2FkMTg0OF9kZXZzID49IE1BWF9BVURJT19ERVYpCisJeworCQlwcmludGsoS0VSTl9FUlIgImFkMTg0OCAtIFRvbyBtYW55IGF1ZGlvIGRldmljZXNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl9sb2NrX2luaXQoJmRldmMtPmxvY2spOworCWRldmMtPmJhc2UgPSBpb19iYXNlOworCWRldmMtPmlycV9vayA9IDA7CisJZGV2Yy0+dGltZXJfcnVubmluZyA9IDA7CisJZGV2Yy0+TUNFX2JpdCA9IDB4NDA7CisJZGV2Yy0+aXJxID0gMDsKKwlkZXZjLT5vcGVuX21vZGUgPSAwOworCWRldmMtPmNoaXBfbmFtZSA9IGRldmMtPm5hbWUgPSAiQUQxODQ4IjsKKwlkZXZjLT5tb2RlbCA9IE1EXzE4NDg7CS8qIEFEMTg0OCBvciBDUzQyNDggKi8KKwlkZXZjLT5sZXZlbHMgPSBOVUxMOworCWRldmMtPmRlYnVnX2ZsYWcgPSAwOworCisJLyoKKwkgKiBDaGVjayB0aGF0IHRoZSBJL08gYWRkcmVzcyBpcyBpbiB1c2UuCisJICoKKwkgKiBUaGUgYml0IDB4ODAgb2YgdGhlIGJhc2UgSS9PIHBvcnQgaXMga25vd24gdG8gYmUgMCBhZnRlciB0aGUKKwkgKiBjaGlwIGhhcyBwZXJmb3JtZWQgaXRzIHBvd2VyIG9uIGluaXRpYWxpemF0aW9uLiBKdXN0IGFzc3VtZQorCSAqIHRoaXMgaGFzIGhhcHBlbmVkIGJlZm9yZSB0aGUgT1MgaXMgc3RhcnRpbmcuCisJICoKKwkgKiBJZiB0aGUgSS9PIGFkZHJlc3MgaXMgdW51c2VkLCBpdCB0eXBpY2FsbHkgcmV0dXJucyAweGZmLgorCSAqLworCisJaWYgKGluYihkZXZjLT5iYXNlKSA9PSAweGZmKQorCXsKKwkJRERCKHByaW50aygiYWQxODQ4X2RldGVjdDogVGhlIGJhc2UgSS9PIGFkZHJlc3MgYXBwZWFycyB0byBiZSBkZWFkXG4iKSk7CisJfQorCisJLyoKKwkgKiBXYWl0IGZvciB0aGUgZGV2aWNlIHRvIHN0b3AgaW5pdGlhbGl6YXRpb24KKwkgKi8KKwkKKwlEREIocHJpbnRrKCJhZDE4NDhfZGV0ZWN0KCkgLSBzdGVwIDBcbiIpKTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwMDAwMDsgaSsrKQorCXsKKwkJdW5zaWduZWQgY2hhciAgIHggPSBpbmIoZGV2Yy0+YmFzZSk7CisKKwkJaWYgKHggPT0gMHhmZiB8fCAhKHggJiAweDgwKSkKKwkJCWJyZWFrOworCX0KKworCUREQihwcmludGsoImFkMTg0OF9kZXRlY3QoKSAtIHN0ZXAgQVxuIikpOworCisJaWYgKGluYihkZXZjLT5iYXNlKSA9PSAweDgwKQkvKiBOb3QgcmVhZHkuIExldCdzIHdhaXQgKi8KKwkJYWRfbGVhdmVfTUNFKGRldmMpOworCisJaWYgKChpbmIoZGV2Yy0+YmFzZSkgJiAweDgwKSAhPSAweDAwKQkvKiBOb3QgYSBBRDE4NDggKi8KKwl7CisJCUREQihwcmludGsoImFkMTg0OCBkZXRlY3QgZXJyb3IgLSBzdGVwIEEgKCUwMngpXG4iLCAoaW50KSBpbmIoZGV2Yy0+YmFzZSkpKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qCisJICogVGVzdCBpZiBpdCdzIHBvc3NpYmxlIHRvIGNoYW5nZSBjb250ZW50cyBvZiB0aGUgaW5kaXJlY3QgcmVnaXN0ZXJzLgorCSAqIFJlZ2lzdGVycyAwIGFuZCAxIGFyZSBBREMgdm9sdW1lIHJlZ2lzdGVycy4gVGhlIGJpdCAweDEwIGlzIHJlYWQgb25seQorCSAqIHNvIHRyeSB0byBhdm9pZCB1c2luZyBpdC4KKwkgKi8KKworCUREQihwcmludGsoImFkMTg0OF9kZXRlY3QoKSAtIHN0ZXAgQlxuIikpOworCWFkX3dyaXRlKGRldmMsIDAsIDB4YWEpOworCWFkX3dyaXRlKGRldmMsIDEsIDB4NDUpOwkvKiAweDU1IHdpdGggYml0IDB4MTAgY2xlYXIgKi8KKworCWlmICgodG1wMSA9IGFkX3JlYWQoZGV2YywgMCkpICE9IDB4YWEgfHwgKHRtcDIgPSBhZF9yZWFkKGRldmMsIDEpKSAhPSAweDQ1KQorCXsKKwkJaWYgKHRtcDIgPT0gMHg2NSkJLyogQUQxODQ3IGhhcyBjb3VwbGUgb2YgYml0cyBoYXJkY29kZWQgdG8gMSAqLworCQkJYWQxODQ3X2ZsYWcgPSAxOworCQllbHNlCisJCXsKKwkJCUREQihwcmludGsoImFkMTg0OCBkZXRlY3QgZXJyb3IgLSBzdGVwIEIgKCV4LyV4KVxuIiwgdG1wMSwgdG1wMikpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJRERCKHByaW50aygiYWQxODQ4X2RldGVjdCgpIC0gc3RlcCBDXG4iKSk7CisJYWRfd3JpdGUoZGV2YywgMCwgMHg0NSk7CisJYWRfd3JpdGUoZGV2YywgMSwgMHhhYSk7CisKKwlpZiAoKHRtcDEgPSBhZF9yZWFkKGRldmMsIDApKSAhPSAweDQ1IHx8ICh0bXAyID0gYWRfcmVhZChkZXZjLCAxKSkgIT0gMHhhYSkKKwl7CisJCWlmICh0bXAyID09IDB4OGEpCS8qIEFEMTg0NyBoYXMgZmV3IGJpdHMgaGFyZGNvZGVkIHRvIDEgKi8KKwkJCWFkMTg0N19mbGFnID0gMTsKKwkJZWxzZQorCQl7CisJCQlEREIocHJpbnRrKCJhZDE4NDggZGV0ZWN0IGVycm9yIC0gc3RlcCBDICgleC8leClcbiIsIHRtcDEsIHRtcDIpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJLyoKKwkgKiBUaGUgaW5kaXJlY3QgcmVnaXN0ZXIgSTEyIGhhcyBzb21lIHJlYWQgb25seSBiaXRzLiBMZXQncworCSAqIHRyeSB0byBjaGFuZ2UgdGhlbS4KKwkgKi8KKworCUREQihwcmludGsoImFkMTg0OF9kZXRlY3QoKSAtIHN0ZXAgRFxuIikpOworCXRtcCA9IGFkX3JlYWQoZGV2YywgMTIpOworCWFkX3dyaXRlKGRldmMsIDEyLCAofnRtcCkgJiAweDBmKTsKKworCWlmICgodG1wICYgMHgwZikgIT0gKCh0bXAxID0gYWRfcmVhZChkZXZjLCAxMikpICYgMHgwZikpCisJeworCQlEREIocHJpbnRrKCJhZDE4NDggZGV0ZWN0IGVycm9yIC0gc3RlcCBEICgleClcbiIsIHRtcDEpKTsKKwkJcmV0dXJuIDA7CisJfQorCQorCS8qCisJICogTk9URSEgTGFzdCA0IGJpdHMgb2YgdGhlIHJlZyBJMTIgdGVsbCB0aGUgY2hpcCByZXZpc2lvbi4KKwkgKiAgIDB4MDE9UmV2QiBhbmQgMHgwQT1SZXZDLgorCSAqLworCisJLyoKKwkgKiBUaGUgb3JpZ2luYWwgQUQxODQ4L0NTNDI0OCBoYXMganVzdCAxNSBpbmRpcmVjdCByZWdpc3RlcnMuIFRoaXMgbWVhbnMKKwkgKiB0aGF0IEkwIGFuZCBJMTYgc2hvdWxkIHJldHVybiB0aGUgc2FtZSB2YWx1ZSAoZXRjLikuCisJICogSG93ZXZlciB0aGlzIGRvZXNuJ3Qgd29yayB3aXRoIENTNDI0OC4gQWN0dWFsbHkgaXQgc2VlbXMgdG8gYmUgaW1wb3NzaWJsZQorCSAqIHRvIGRldGVjdCBpZiB0aGUgY2hpcCBpcyBhIENTNDIzMSBvciBDUzQyNDguCisJICogRW5zdXJlIHRoYXQgdGhlIE1vZGUyIGVuYWJsZSBiaXQgb2YgSTEyIGlzIDAuIE90aGVyd2lzZSB0aGlzIHRlc3QgZmFpbHMKKwkgKiB3aXRoIENTNDIzMS4KKwkgKi8KKworCS8qCisJICogT1BUaSA4MkM5MzAgaGFzIG1vZGUyIGNvbnRyb2wgYml0IGluIGFub3RoZXIgcGxhY2UuIFRoaXMgdGVzdCB3aWxsIGZhaWwKKwkgKiB3aXRoIGl0LiBBY2NlcHQgdGhpcyBzaXR1YXRpb24gYXMgYSBwb3NzaWJsZSBpbmRpY2F0aW9uIG9mIHRoaXMgY2hpcC4KKwkgKi8KKworCUREQihwcmludGsoImFkMTg0OF9kZXRlY3QoKSAtIHN0ZXAgRlxuIikpOworCWFkX3dyaXRlKGRldmMsIDEyLCAwKTsJLyogTW9kZTI9ZGlzYWJsZWQgKi8KKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQorCXsKKwkJaWYgKCh0bXAxID0gYWRfcmVhZChkZXZjLCBpKSkgIT0gKHRtcDIgPSBhZF9yZWFkKGRldmMsIGkgKyAxNikpKQorCQl7CisJCQlEREIocHJpbnRrKCJhZDE4NDggZGV0ZWN0IHN0ZXAgRiglZC8leC8leCkgLSBPUFRpIGNoaXA/Pz9cbiIsIGksIHRtcDEsIHRtcDIpKTsKKwkJCWlmICghYWQxODQ3X2ZsYWcpCisJCQkJb3B0aUM5MzAgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKgorCSAqIFRyeSB0byBzd2l0Y2ggdGhlIGNoaXAgdG8gbW9kZTIgKENTNDIzMSkgYnkgc2V0dGluZyB0aGUgTU9ERTIgYml0ICgweDQwKS4KKwkgKiBUaGUgYml0IDB4ODAgaXMgYWx3YXlzIDEgaW4gQ1M0MjQ4IGFuZCBDUzQyMzEuCisJICovCisKKwlEREIocHJpbnRrKCJhZDE4NDhfZGV0ZWN0KCkgLSBzdGVwIEdcbiIpKTsKKworCWlmIChhZF9mbGFncyAmJiAqYWRfZmxhZ3MgPT0gNDAwKQorCQkqYWRfZmxhZ3MgPSAwOworCWVsc2UKKwkJYWRfd3JpdGUoZGV2YywgMTIsIDB4NDApOwkvKiBTZXQgbW9kZTIsIGNsZWFyIDB4ODAgKi8KKworCisJaWYgKGFkX2ZsYWdzKQorCQkqYWRfZmxhZ3MgPSAwOworCisJdG1wMSA9IGFkX3JlYWQoZGV2YywgMTIpOworCWlmICh0bXAxICYgMHg4MCkKKwl7CisJCWlmIChhZF9mbGFncykKKwkJCSphZF9mbGFncyB8PSBBRF9GX0NTNDI0ODsKKworCQlkZXZjLT5jaGlwX25hbWUgPSAiQ1M0MjQ4IjsJLyogT3VyIGJlc3Qga25vd2xlZGdlIGp1c3Qgbm93ICovCisJfQorCWlmIChvcHRpQzkzMCB8fCAodG1wMSAmIDB4YzApID09ICgweDgwIHwgMHg0MCkpCisJeworCQkvKgorCQkgKiAgICAgIENTNDIzMSBkZXRlY3RlZCAtIGlzIGl0PworCQkgKgorCQkgKiAgICAgIFZlcmlmeSB0aGF0IHNldHRpbmcgSTAgZG9lc24ndCBjaGFuZ2UgSTE2LgorCQkgKi8KKwkJCisJCUREQihwcmludGsoImFkMTg0OF9kZXRlY3QoKSAtIHN0ZXAgSFxuIikpOworCQlhZF93cml0ZShkZXZjLCAxNiwgMCk7CS8qIFNldCBJMTYgdG8ga25vd24gdmFsdWUgKi8KKworCQlhZF93cml0ZShkZXZjLCAwLCAweDQ1KTsKKwkJaWYgKCh0bXAxID0gYWRfcmVhZChkZXZjLCAxNikpICE9IDB4NDUpCS8qIE5vIGNoYW5nZSAtPiBDUzQyMzE/ICovCisJCXsKKwkJCWFkX3dyaXRlKGRldmMsIDAsIDB4YWEpOworCQkJaWYgKCh0bXAxID0gYWRfcmVhZChkZXZjLCAxNikpID09IDB4YWEpCS8qIFJvdHRlbiBiaXRzPyAqLworCQkJeworCQkJCUREQihwcmludGsoImFkMTg0OCBkZXRlY3QgZXJyb3IgLSBzdGVwIEgoJXgpXG4iLCB0bXAxKSk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQkKKwkJCS8qCisJCQkgKiBWZXJpZnkgdGhhdCBzb21lIGJpdHMgb2YgSTI1IGFyZSByZWFkIG9ubHkuCisJCQkgKi8KKworCQkJRERCKHByaW50aygiYWQxODQ4X2RldGVjdCgpIC0gc3RlcCBJXG4iKSk7CisJCQl0bXAxID0gYWRfcmVhZChkZXZjLCAyNSk7CS8qIE9yaWdpbmFsIGJpdHMgKi8KKwkJCWFkX3dyaXRlKGRldmMsIDI1LCB+dG1wMSk7CS8qIEludmVydCBhbGwgYml0cyAqLworCQkJaWYgKChhZF9yZWFkKGRldmMsIDI1KSAmIDB4ZTcpID09ICh0bXAxICYgMHhlNykpCisJCQl7CisJCQkJaW50IGlkOworCisJCQkJLyoKKwkJCQkgKiAgICAgIEl0J3MgYXQgbGVhc3QgQ1M0MjMxCisJCQkJICovCisKKwkJCQlkZXZjLT5jaGlwX25hbWUgPSAiQ1M0MjMxIjsKKwkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyMzE7CisJCQkJCisJCQkJLyoKKwkJCQkgKiBJdCBjb3VsZCBiZSBhbiBBRDE4NDUgb3IgQ1M0MjMxQSBhcyB3ZWxsLgorCQkJCSAqIENTNDIzMSBhbmQgQUQxODQ1IHJlcG9ydCB0aGUgc2FtZSByZXZpc2lvbiBpbmZvIGluIEkyNQorCQkJCSAqIHdoaWxlIHRoZSBDUzQyMzFBIHJlcG9ydHMgZGlmZmVyZW50LgorCQkJCSAqLworCisJCQkJaWQgPSBhZF9yZWFkKGRldmMsIDI1KTsKKwkJCQlpZiAoKGlkICYgMHhlNykgPT0gMHg4MCkJLyogRGV2aWNlIGJ1c3k/Pz8gKi8KKwkJCQkJaWQgPSBhZF9yZWFkKGRldmMsIDI1KTsKKwkJCQlpZiAoKGlkICYgMHhlNykgPT0gMHg4MCkJLyogRGV2aWNlIHN0aWxsIGJ1c3k/Pz8gKi8KKwkJCQkJaWQgPSBhZF9yZWFkKGRldmMsIDI1KTsKKwkJCQlEREIocHJpbnRrKCJhZDE4NDhfZGV0ZWN0KCkgLSBzdGVwIEogKCUwMngvJTAyeClcbiIsIGlkLCBhZF9yZWFkKGRldmMsIDI1KSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoaWQgJiAweGU3KSA9PSAweDgwKSB7CisJCQkJCS8qIAorCQkJCQkgKiBJdCBtdXN0IGJlIGEgQ1M0MjMxIG9yIEFEMTg0NS4gVGhlIHJlZ2lzdGVyIEkyMyBvZgorCQkJCQkgKiBDUzQyMzEgaXMgdW5kZWZpbmVkIGFuZCBpdCBhcHBlYXJzIHRvIGJlIHJlYWQgb25seS4KKwkJCQkJICogQUQxODQ1IHVzZXMgSTIzIGZvciBzZXR0aW5nIHNhbXBsZSByYXRlLiBBc3N1bWUKKwkJCQkJICogdGhlIGNoaXAgaXMgQUQxODQ1IGlmIEkyMyBpcyBjaGFuZ2VhYmxlLgorCQkJCQkgKi8KKworCQkJCQl1bnNpZ25lZCBjaGFyICAgdG1wID0gYWRfcmVhZChkZXZjLCAyMyk7CisJCQkJCWFkX3dyaXRlKGRldmMsIDIzLCB+dG1wKTsKKworCQkJCQlpZiAoaW50ZXJ3YXZlKQorCQkJCQl7CisJCQkJCQlkZXZjLT5tb2RlbCA9IE1EX0lXQVZFOworCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIklXYXZlIjsKKwkJCQkJfQorCQkJCQllbHNlIGlmIChhZF9yZWFkKGRldmMsIDIzKSAhPSB0bXApCS8qIEFEMTg0NSA/ICovCisJCQkJCXsKKwkJCQkJCWRldmMtPmNoaXBfbmFtZSA9ICJBRDE4NDUiOworCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF8xODQ1OworCQkJCQl9CisJCQkJCWVsc2UgaWYgKGNzNDI0OF9mbGFnKQorCQkJCQl7CisJCQkJCQlpZiAoYWRfZmxhZ3MpCisJCQkJCQkJICAqYWRfZmxhZ3MgfD0gQURfRl9DUzQyNDg7CisJCQkJCQlkZXZjLT5jaGlwX25hbWUgPSAiQ1M0MjQ4IjsKKwkJCQkJCWRldmMtPm1vZGVsID0gTURfMTg0ODsKKwkJCQkJCWFkX3dyaXRlKGRldmMsIDEyLCBhZF9yZWFkKGRldmMsIDEyKSAmIH4weDQwKTsJLyogTW9kZTIgb2ZmICovCisJCQkJCX0KKwkJCQkJYWRfd3JpdGUoZGV2YywgMjMsIHRtcCk7CS8qIFJlc3RvcmUgKi8KKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJc3dpdGNoIChpZCAmIDB4MWYpIHsKKwkJCQkJY2FzZSAzOiAvKiBDUzQyMzYvQ1M0MjM1L0NTNDJ4Qi9DUzQyMzkgKi8KKwkJCQkJCXsKKwkJCQkJCQlpbnQgeGlkOworCQkJCQkJCWFkX3dyaXRlKGRldmMsIDEyLCBhZF9yZWFkKGRldmMsIDEyKSB8IDB4NjApOyAvKiBzd2l0Y2ggdG8gbW9kZSAzICovCisJCQkJCQkJYWRfd3JpdGUoZGV2YywgMjMsIDB4OWMpOyAvKiBzZWxlY3QgZXh0ZW5kZWQgcmVnaXN0ZXIgMjUgKi8KKwkJCQkJCQl4aWQgPSBpbmIoaW9fSW5kZXhlZF9EYXRhKGRldmMpKTsKKwkJCQkJCQlhZF93cml0ZShkZXZjLCAxMiwgYWRfcmVhZChkZXZjLCAxMikgJiB+MHg2MCk7IC8qIGJhY2sgdG8gbW9kZSAwICovCisJCQkJCQkJc3dpdGNoICh4aWQgJiAweDFmKQorCQkJCQkJCXsKKwkJCQkJCQkJY2FzZSAweDAwOgorCQkJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzN0IoQikiOworCQkJCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF80MnhCOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgMHgwODoKKwkJCQkJCQkJCS8qIFNlZW1zIHRvIGJlIGEgNDIzOCA/PyAqLworCQkJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzOCI7CisJCQkJCQkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyeEI7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSAweDA5OgorCQkJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzOEIiOworCQkJCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF80MnhCOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJCWNhc2UgMHgwYjoKKwkJCQkJCQkJCWRldmMtPmNoaXBfbmFtZSA9ICJDUzQyMzZCIjsKKwkJCQkJCQkJCWRldmMtPm1vZGVsID0gTURfNDIzNjsKKwkJCQkJCQkJCWJyZWFrOworCQkJCQkJCQljYXNlIDB4MTA6CisJCQkJCQkJCQlkZXZjLT5jaGlwX25hbWUgPSAiQ1M0MjM3QiI7CisJCQkJCQkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyeEI7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSAweDFkOgorCQkJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzNSI7CisJCQkJCQkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyMzU7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJY2FzZSAweDFlOgorCQkJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzOSI7CisJCQkJCQkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyMzk7CisJCQkJCQkJCQlicmVhazsKKwkJCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQkJCXByaW50aygiQ2hpcCBpZGVudCBpcyAlWC5cbiIsIHhpZCYweDFGKTsKKwkJCQkJCQkJCWRldmMtPmNoaXBfbmFtZSA9ICJDUzQyeHgiOworCQkJCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF80MjMyOworCQkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAyOiAvKiBDUzQyMzIvQ1M0MjMyQSAqLworCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzMiI7CisJCQkJCQlkZXZjLT5tb2RlbCA9IE1EXzQyMzI7CisJCQkJCQlicmVhazsKKwkJCQkKKwkJCQkJY2FzZSAwOgorCQkJCQkJaWYgKChpZCAmIDB4ZTApID09IDB4YTApCisJCQkJCQl7CisJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzMUEiOworCQkJCQkJCWRldmMtPm1vZGVsID0gTURfNDIzMUE7CisJCQkJCQl9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDMyMSI7CisJCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF80MjMxOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisKKwkJCQkJZGVmYXVsdDogLyogbWF5YmUgKi8KKwkJCQkJCUREQihwcmludGsoImFkMTg0ODogSTI1ID0gJTAyeC8lMDJ4XG4iLCBhZF9yZWFkKGRldmMsIDI1KSwgYWRfcmVhZChkZXZjLCAyNSkgJiAweGU3KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aUM5MzApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmMtPmNoaXBfbmFtZSA9ICI4MkM5MzAiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZjLT5tb2RlbCA9IE1EX0M5MzA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQkJCQllbHNlCisJCQkJCQl7CisJCQkJCQkJZGV2Yy0+Y2hpcF9uYW1lID0gIkNTNDIzMSI7CisJCQkJCQkJZGV2Yy0+bW9kZWwgPSBNRF80MjMxOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJfQorCQkJYWRfd3JpdGUoZGV2YywgMjUsIHRtcDEpOwkvKiBSZXN0b3JlIGJpdHMgKi8KKworCQkJRERCKHByaW50aygiYWQxODQ4X2RldGVjdCgpIC0gc3RlcCBLXG4iKSk7CisJCX0KKwl9IGVsc2UgaWYgKHRtcDEgPT0gMHgwYSkgeworCQkvKgorCQkgKiBJcyBpdCBwZXJoYXBzIGEgU291bmRQcm8gQ01JODMzMD8KKwkJICogSWYgc28sIHRoZW4gd2Ugc2hvdWxkIGJlIGFibGUgdG8gY2hhbmdlIGluZGlyZWN0IHJlZ2lzdGVycworCQkgKiBncmVhdGVyIHRoYW4gSTE1IGFmdGVyIGFjdGl2YXRpbmcgTU9ERTIsIGV2ZW4gdGhvdWdoIHJlYWRpbmcKKwkJICogYmFjayBJMTIgZG9lcyBub3Qgc2hvdyBpdC4KKwkJICovCisKKwkJLyoKKwkJICogTGV0J3MgdHJ5IGNvbXBhcmluZyByZWdpc3RlciB2YWx1ZXMKKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlpZiAoKHRtcDEgPSBhZF9yZWFkKGRldmMsIGkpKSAhPSAodG1wMiA9IGFkX3JlYWQoZGV2YywgaSArIDE2KSkpIHsKKwkJCQlEREIocHJpbnRrKCJhZDE4NDggZGV0ZWN0IHN0ZXAgSCglZC8leC8leCkgLSBTb3VuZFBybyBjaGlwP1xuIiwgaSwgdG1wMSwgdG1wMikpOworCQkJCXNvdW5kcHJvID0gMTsKKwkJCQlkZXZjLT5jaGlwX25hbWUgPSAiU291bmRQcm8gQ01JIDgzMzAiOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJRERCKHByaW50aygiYWQxODQ4X2RldGVjdCgpIC0gc3RlcCBMXG4iKSk7CisJaWYgKGFkX2ZsYWdzKQorCXsKKwkJICBpZiAoZGV2Yy0+bW9kZWwgIT0gTURfMTg0OCkKKwkJCSAgKmFkX2ZsYWdzIHw9IEFEX0ZfQ1M0MjMxOworCX0KKwlEREIocHJpbnRrKCJhZDE4NDhfZGV0ZWN0KCkgLSBEZXRlY3RlZCBPS1xuIikpOworCisJaWYgKGRldmMtPm1vZGVsID09IE1EXzE4NDggJiYgYWQxODQ3X2ZsYWcpCisJCWRldmMtPmNoaXBfbmFtZSA9ICJBRDE4NDciOworCisKKwlpZiAoc3NjYXBlX2ZsYWcgPT0gMSkKKwkJZGV2Yy0+bW9kZWwgPSBNRF8xODQ1X1NTQ0FQRTsKKworCXJldHVybiAxOworfQorCitpbnQgYWQxODQ4X2luaXQgKGNoYXIgKm5hbWUsIHN0cnVjdCByZXNvdXJjZSAqcG9ydHMsIGludCBpcnEsIGludCBkbWFfcGxheWJhY2ssCisJCWludCBkbWFfY2FwdHVyZSwgaW50IHNoYXJlX2RtYSwgaW50ICpvc3AsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCS8qCisJICogTk9URSEgSWYgaXJxIDwgMCwgdGhlcmUgaXMgYW5vdGhlciBkcml2ZXIgd2hpY2ggaGFzIGFsbG9jYXRlZCB0aGUgSVJRCisJICogICBzbyB0aGF0IHRoaXMgZHJpdmVyIGRvZXNuJ3QgbmVlZCB0byBhbGxvY2F0ZS9kZWFsbG9jYXRlIGl0LgorCSAqICAgVGhlIGFjdHVhbGx5IHVzZWQgSVJRIGlzIEFCUyhpcnEpLgorCSAqLworCisJaW50IG15X2RldjsKKwljaGFyIGRldl9uYW1lWzEwMF07CisJaW50IGU7CisKKwlhZDE4NDhfaW5mbyAgKmRldmMgPSAmYWRldl9pbmZvW25yX2FkMTg0OF9kZXZzXTsKKworCWFkMTg0OF9wb3J0X2luZm8gKnBvcnRjID0gTlVMTDsKKworCWRldmMtPmlycSA9IChpcnEgPiAwKSA/IGlycSA6IDA7CisJZGV2Yy0+b3Blbl9tb2RlID0gMDsKKwlkZXZjLT50aW1lcl90aWNrcyA9IDA7CisJZGV2Yy0+ZG1hMSA9IGRtYV9wbGF5YmFjazsKKwlkZXZjLT5kbWEyID0gZG1hX2NhcHR1cmU7CisJZGV2Yy0+c3VidHlwZSA9IGNmZy5jYXJkX3N1YnR5cGU7CisJZGV2Yy0+YXVkaW9fZmxhZ3MgPSBETUFfQVVUT01PREU7CisJZGV2Yy0+cGxheWJhY2tfZGV2ID0gZGV2Yy0+cmVjb3JkX2RldiA9IDA7CisJaWYgKG5hbWUgIT0gTlVMTCkKKwkJZGV2Yy0+bmFtZSA9IG5hbWU7CisKKwlpZiAobmFtZSAhPSBOVUxMICYmIG5hbWVbMF0gIT0gMCkKKwkJc3ByaW50ZihkZXZfbmFtZSwKKwkJCSIlcyAoJXMpIiwgbmFtZSwgZGV2Yy0+Y2hpcF9uYW1lKTsKKwllbHNlCisJCXNwcmludGYoZGV2X25hbWUsCisJCQkiR2VuZXJpYyBhdWRpbyBjb2RlYyAoJXMpIiwgZGV2Yy0+Y2hpcF9uYW1lKTsKKworCXJlbmFtZV9yZWdpb24ocG9ydHMsIGRldmMtPm5hbWUpOworCisJY29uZl9wcmludGYyKGRldl9uYW1lLCBkZXZjLT5iYXNlLCBkZXZjLT5pcnEsIGRtYV9wbGF5YmFjaywgZG1hX2NhcHR1cmUpOworCisJaWYgKGRldmMtPm1vZGVsID09IE1EXzE4NDggfHwgZGV2Yy0+bW9kZWwgPT0gTURfQzkzMCkKKwkJZGV2Yy0+YXVkaW9fZmxhZ3MgfD0gRE1BX0hBUkRTVE9QOworCisJaWYgKGRldmMtPm1vZGVsID4gTURfMTg0OCkKKwl7CisJCWlmIChkZXZjLT5kbWExID09IGRldmMtPmRtYTIgfHwgZGV2Yy0+ZG1hMiA9PSAtMSB8fCBkZXZjLT5kbWExID09IC0xKQorCQkJZGV2Yy0+YXVkaW9fZmxhZ3MgJj0gfkRNQV9EVVBMRVg7CisJCWVsc2UKKwkJCWRldmMtPmF1ZGlvX2ZsYWdzIHw9IERNQV9EVVBMRVg7CisJfQorCisJcG9ydGMgPSAoYWQxODQ4X3BvcnRfaW5mbyAqKSBrbWFsbG9jKHNpemVvZihhZDE4NDhfcG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYocG9ydGM9PU5VTEwpIHsKKwkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSwgNCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoKG15X2RldiA9IHNvdW5kX2luc3RhbGxfYXVkaW9kcnYoQVVESU9fRFJJVkVSX1ZFUlNJT04sCisJCQkJCSAgICAgZGV2X25hbWUsCisJCQkJCSAgICAgJmFkMTg0OF9hdWRpb19kcml2ZXIsCisJCQkJCSAgICAgc2l6ZW9mKHN0cnVjdCBhdWRpb19kcml2ZXIpLAorCQkJCQkgICAgIGRldmMtPmF1ZGlvX2ZsYWdzLAorCQkJCQkgICAgIGFkX2Zvcm1hdF9tYXNrW2RldmMtPm1vZGVsXSwKKwkJCQkJICAgICBkZXZjLAorCQkJCQkgICAgIGRtYV9wbGF5YmFjaywKKwkJCQkJICAgICBkbWFfY2FwdHVyZSkpIDwgMCkKKwl7CisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDQpOworCQlrZnJlZShwb3J0Yyk7CisJCXJldHVybiAtMTsKKwl9CisJCisJYXVkaW9fZGV2c1tteV9kZXZdLT5wb3J0YyA9IHBvcnRjOworCWF1ZGlvX2RldnNbbXlfZGV2XS0+bWl4ZXJfZGV2ID0gLTE7CisJaWYgKG93bmVyKQorCQlhdWRpb19kZXZzW215X2Rldl0tPmQtPm93bmVyID0gb3duZXI7CisJbWVtc2V0KChjaGFyICopIHBvcnRjLCAwLCBzaXplb2YoKnBvcnRjKSk7CisKKwlucl9hZDE4NDhfZGV2cysrOworCisJZGV2Yy0+cG1kZXYgPSBwbV9yZWdpc3RlcihQTV9JU0FfREVWLCBteV9kZXYsIGFkMTg0OF9wbV9jYWxsYmFjayk7CisJaWYgKGRldmMtPnBtZGV2KQorCQlkZXZjLT5wbWRldi0+ZGF0YSA9IGRldmM7CisKKwlhZDE4NDhfaW5pdF9odyhkZXZjKTsKKworCWlmIChpcnEgPiAwKQorCXsKKwkJZGV2Yy0+ZGV2X25vID0gbXlfZGV2OworCQlpZiAocmVxdWVzdF9pcnEoZGV2Yy0+aXJxLCBhZGludHIsIDAsIGRldmMtPm5hbWUsICh2b2lkICopbXlfZGV2KSA8IDApCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFkMTg0ODogVW5hYmxlIHRvIGFsbG9jYXRlIElSUVxuIik7CisJCQkvKiBEb24ndCBmcmVlIGl0IGVpdGhlciB0aGVuLi4gKi8KKwkJCWRldmMtPmlycSA9IDA7CisJCX0KKwkJaWYgKGNhcGFiaWxpdGllc1tkZXZjLT5tb2RlbF0uZmxhZ3MgJiBDQVBfRl9USU1FUikKKwkJeworI2lmbmRlZiBDT05GSUdfU01QCisJCQlpbnQgeDsKKwkJCXVuc2lnbmVkIGNoYXIgdG1wID0gYWRfcmVhZChkZXZjLCAxNik7CisjZW5kaWYJCQkKKworCQkJZGV2Yy0+dGltZXJfdGlja3MgPSAwOworCisJCQlhZF93cml0ZShkZXZjLCAyMSwgMHgwMCk7CS8qIFRpbWVyIE1TQiAqLworCQkJYWRfd3JpdGUoZGV2YywgMjAsIDB4MTApOwkvKiBUaW1lciBMU0IgKi8KKyNpZm5kZWYgQ09ORklHX1NNUAorCQkJYWRfd3JpdGUoZGV2YywgMTYsIHRtcCB8IDB4NDApOwkvKiBFbmFibGUgdGltZXIgKi8KKwkJCWZvciAoeCA9IDA7IHggPCAxMDAwMDAgJiYgZGV2Yy0+dGltZXJfdGlja3MgPT0gMDsgeCsrKTsKKwkJCWFkX3dyaXRlKGRldmMsIDE2LCB0bXAgJiB+MHg0MCk7CS8qIERpc2FibGUgdGltZXIgKi8KKworCQkJaWYgKGRldmMtPnRpbWVyX3RpY2tzID09IDApCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODQ4OiBJbnRlcnJ1cHQgdGVzdCBmYWlsZWQgKElSUSVkKVxuIiwgaXJxKTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlEREIocHJpbnRrKCJJbnRlcnJ1cHQgdGVzdCBPS1xuIikpOworCQkJCWRldmMtPmlycV9vayA9IDE7CisJCQl9CisjZWxzZQorCQkJZGV2Yy0+aXJxX29rID0gMTsKKyNlbmRpZgkJCQorCQl9CisJCWVsc2UKKwkJCWRldmMtPmlycV9vayA9IDE7CS8qIENvdWxkbid0IHRlc3QuIGFzc3VtZSBpdCdzIE9LICovCisJfSBlbHNlIGlmIChpcnEgPCAwKQorCQlpcnEyZGV2Wy1pcnFdID0gZGV2Yy0+ZGV2X25vID0gbXlfZGV2OworCisjaWZuZGVmIEVYQ0xVREVfVElNRVJTCisJaWYgKChjYXBhYmlsaXRpZXNbZGV2Yy0+bW9kZWxdLmZsYWdzICYgQ0FQX0ZfVElNRVIpICYmCisJICAgIGRldmMtPmlycV9vaykKKwkJYWQxODQ4X3Rtcl9pbnN0YWxsKG15X2Rldik7CisjZW5kaWYKKworCWlmICghc2hhcmVfZG1hKQorCXsKKwkJaWYgKHNvdW5kX2FsbG9jX2RtYShkbWFfcGxheWJhY2ssIGRldmMtPm5hbWUpKQorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWQxODQ4LmM6IENhbid0IGFsbG9jYXRlIERNQSVkXG4iLCBkbWFfcGxheWJhY2spOworCisJCWlmIChkbWFfY2FwdHVyZSAhPSBkbWFfcGxheWJhY2spCisJCQlpZiAoc291bmRfYWxsb2NfZG1hKGRtYV9jYXB0dXJlLCBkZXZjLT5uYW1lKSkKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4NDguYzogQ2FuJ3QgYWxsb2NhdGUgRE1BJWRcbiIsIGRtYV9jYXB0dXJlKTsKKwl9CisKKwlpZiAoKGUgPSBzb3VuZF9pbnN0YWxsX21peGVyKE1JWEVSX0RSSVZFUl9WRVJTSU9OLAorCQkJCSAgICAgZGV2X25hbWUsCisJCQkJICAgICAmYWQxODQ4X21peGVyX29wZXJhdGlvbnMsCisJCQkJICAgICBzaXplb2Yoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLAorCQkJCSAgICAgZGV2YykpID49IDApCisJeworCQlhdWRpb19kZXZzW215X2Rldl0tPm1peGVyX2RldiA9IGU7CisJCWlmIChvd25lcikKKwkJCW1peGVyX2RldnNbZV0tPm93bmVyID0gb3duZXI7CisJfQorCXJldHVybiBteV9kZXY7Cit9CisKK2ludCBhZDE4NDhfY29udHJvbChpbnQgY21kLCBpbnQgYXJnKQoreworCWFkMTg0OF9pbmZvICpkZXZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobnJfYWQxODQ4X2RldnMgPCAxKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWRldmMgPSAmYWRldl9pbmZvW25yX2FkMTg0OF9kZXZzIC0gMV07CisKKwlzd2l0Y2ggKGNtZCkKKwl7CisJCWNhc2UgQUQxODQ4X1NFVF9YVEFMOgkvKiBDaGFuZ2UgY2xvY2sgZnJlcXVlbmN5IG9mIEFEMTg0NSAob25seSApICovCisJCQlpZiAoZGV2Yy0+bW9kZWwgIT0gTURfMTg0NSB8fCBkZXZjLT5tb2RlbCAhPSBNRF8xODQ1X1NTQ0FQRSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJCWFkX2VudGVyX01DRShkZXZjKTsKKwkJCWFkX3dyaXRlKGRldmMsIDI5LCAoYWRfcmVhZChkZXZjLCAyOSkgJiAweDFmKSB8IChhcmcgPDwgNSkpOworCQkJYWRfbGVhdmVfTUNFKGRldmMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIEFEMTg0OF9NSVhFUl9SRVJPVVRFOgorCQl7CisJCQlpbnQgbyA9IChhcmcgPj4gOCkgJiAweGZmOworCQkJaW50IG4gPSBhcmcgJiAweGZmOworCisJCQlpZiAobyA8IDAgfHwgbyA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmICghKGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzICYgKDEgPDwgbykpICYmCisJCQkgICAgIShkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMgJiAoMSA8PCBvKSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWlmIChuID09IFNPVU5EX01JWEVSX05PTkUpCisJCQl7CS8qIEp1c3QgaGlkZSB0aGlzIGNvbnRyb2wgKi8KKwkJCQlhZDE4NDhfbWl4ZXJfc2V0KGRldmMsIG8sIDApOwkvKiBTaHV0IHVwIGl0ICovCisJCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJj0gfigxIDw8IG8pOworCQkJCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyAmPSB+KDEgPDwgbyk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIE1ha2UgdGhlIG1peGVyIGNvbnRyb2wgaWRlbnRpZmllZCBieSBvIHRvIGFwcGVhciBhcyBuICovCisJCQlpZiAobiA8IDAgfHwgbiA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCWRldmMtPm1peGVyX3Jlcm91dGVbbl0gPSBvOwkvKiBSZW5hbWUgdGhlIGNvbnRyb2wgKi8KKwkJCWlmIChkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmICgxIDw8IG8pKQorCQkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzIHw9ICgxIDw8IG4pOworCQkJaWYgKGRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyAmICgxIDw8IG8pKQorCQkJCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyB8PSAoMSA8PCBuKTsKKworCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgJj0gfigxIDw8IG8pOworCQkJZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzICY9IH4oMSA8PCBvKTsKKwkJfQorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgYWQxODQ4X3VubG9hZChpbnQgaW9fYmFzZSwgaW50IGlycSwgaW50IGRtYV9wbGF5YmFjaywgaW50IGRtYV9jYXB0dXJlLCBpbnQgc2hhcmVfZG1hKQoreworCWludCBpLCBtaXhlciwgZGV2ID0gMDsKKwlhZDE4NDhfaW5mbyAqZGV2YyA9IE5VTEw7CisKKwlmb3IgKGkgPSAwOyBkZXZjID09IE5VTEwgJiYgaSA8IG5yX2FkMTg0OF9kZXZzOyBpKyspCisJeworCQlpZiAoYWRldl9pbmZvW2ldLmJhc2UgPT0gaW9fYmFzZSkKKwkJeworCQkJZGV2YyA9ICZhZGV2X2luZm9baV07CisJCQlkZXYgPSBkZXZjLT5kZXZfbm87CisJCX0KKwl9CisJCQorCWlmIChkZXZjICE9IE5VTEwpCisJeworCQlpZihhdWRpb19kZXZzW2Rldl0tPnBvcnRjIT1OVUxMKQorCQkJa2ZyZWUoYXVkaW9fZGV2c1tkZXZdLT5wb3J0Yyk7CisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDQpOworCisJCWlmICghc2hhcmVfZG1hKQorCQl7CisJCQlpZiAoZGV2Yy0+aXJxID4gMCkgLyogVGhlcmUgaXMgbm8gcG9pbnQgaW4gZnJlZWluZyBpcnEsIGlmIGl0IHdhc24ndCBhbGxvY2F0ZWQgKi8KKwkJCQlmcmVlX2lycShkZXZjLT5pcnEsICh2b2lkICopZGV2Yy0+ZGV2X25vKTsKKworCQkJc291bmRfZnJlZV9kbWEoZG1hX3BsYXliYWNrKTsKKworCQkJaWYgKGRtYV9wbGF5YmFjayAhPSBkbWFfY2FwdHVyZSkKKwkJCQlzb3VuZF9mcmVlX2RtYShkbWFfY2FwdHVyZSk7CisKKwkJfQorCQltaXhlciA9IGF1ZGlvX2RldnNbZGV2Yy0+ZGV2X25vXS0+bWl4ZXJfZGV2OworCQlpZihtaXhlcj49MCkKKwkJCXNvdW5kX3VubG9hZF9taXhlcmRldihtaXhlcik7CisKKwkJaWYgKGRldmMtPnBtZGV2KQorCQkJcG1fdW5yZWdpc3RlcihkZXZjLT5wbWRldik7CisKKwkJbnJfYWQxODQ4X2RldnMtLTsKKwkJZm9yICggOyBpIDwgbnJfYWQxODQ4X2RldnMgOyBpKyspCisJCQlhZGV2X2luZm9baV0gPSBhZGV2X2luZm9baSsxXTsKKwl9CisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIgImFkMTg0ODogQ2FuJ3QgZmluZCBkZXZpY2UgdG8gYmUgdW5sb2FkZWQuIEJhc2U9JXhcbiIsIGlvX2Jhc2UpOworfQorCitpcnFyZXR1cm5fdCBhZGludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpCit7CisJdW5zaWduZWQgY2hhciBzdGF0dXM7CisJYWQxODQ4X2luZm8gKmRldmM7CisJaW50IGRldjsKKwlpbnQgYWx0X3N0YXQgPSAweGZmOworCXVuc2lnbmVkIGNoYXIgYzkzMF9zdGF0ID0gMDsKKwlpbnQgY250ID0gMDsKKworCWRldiA9IChpbnQpZGV2X2lkOworCWRldmMgPSAoYWQxODQ4X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCitpbnRlcnJ1cHRfYWdhaW46CQkvKiBKdW1wIGJhY2sgaGVyZSBpZiBpbnQgc3RhdHVzIGRvZXNuJ3QgcmVzZXQgKi8KKworCXN0YXR1cyA9IGluYihpb19TdGF0dXMoZGV2YykpOworCisJaWYgKHN0YXR1cyA9PSAweDgwKQorCQlwcmludGsoS0VSTl9ERUJVRyAiYWRpbnRyOiBXaHk/XG4iKTsKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURfMTg0OCkKKwkJb3V0YigoMCksIGlvX1N0YXR1cyhkZXZjKSk7CS8qIENsZWFyIGludGVycnVwdCBzdGF0dXMgKi8KKworCWlmIChzdGF0dXMgJiAweDAxKQorCXsKKwkJaWYgKGRldmMtPm1vZGVsID09IE1EX0M5MzApCisJCXsJCS8qIDgyQzkzMCBoYXMgaW50ZXJydXB0IHN0YXR1cyByZWdpc3RlciBpbiBNQUQxNiByZWdpc3RlciBNQzExICovCisKKwkJCXNwaW5fbG9jaygmZGV2Yy0+bG9jayk7CisKKwkJCS8qIDB4ZTBlIGlzIEM5MzAgYWRkcmVzcyBwb3J0CisJCQkgKiAweGUwZiBpcyBDOTMwIGRhdGEgcG9ydAorCQkJICovCisJCQlvdXRiKDExLCAweGUwZSk7CisJCQljOTMwX3N0YXQgPSBpbmIoMHhlMGYpOworCQkJb3V0YigofmM5MzBfc3RhdCksIDB4ZTBmKTsKKworCQkJc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOworCisJCQlhbHRfc3RhdCA9IChjOTMwX3N0YXQgPDwgMikgJiAweDMwOworCQl9CisJCWVsc2UgaWYgKGRldmMtPm1vZGVsICE9IE1EXzE4NDgpCisJCXsKKwkJCXNwaW5fbG9jaygmZGV2Yy0+bG9jayk7CisJCQlhbHRfc3RhdCA9IGFkX3JlYWQoZGV2YywgMjQpOworCQkJYWRfd3JpdGUoZGV2YywgMjQsIGFkX3JlYWQoZGV2YywgMjQpICYgfmFsdF9zdGF0KTsJLyogU2VsZWN0aXZlIGFjayAqLworCQkJc3Bpbl91bmxvY2soJmRldmMtPmxvY2spOworCQl9CisKKwkJaWYgKChkZXZjLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpICYmIChkZXZjLT5hdWRpb19tb2RlICYgUENNX0VOQUJMRV9JTlBVVCkgJiYgKGFsdF9zdGF0ICYgMHgyMCkpCisJCXsKKwkJCURNQWJ1Zl9pbnB1dGludHIoZGV2Yy0+cmVjb3JkX2Rldik7CisJCX0KKwkJaWYgKChkZXZjLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKSAmJiAoZGV2Yy0+YXVkaW9fbW9kZSAmIFBDTV9FTkFCTEVfT1VUUFVUKSAmJgorCQkgICAgICAoYWx0X3N0YXQgJiAweDEwKSkKKwkJeworCQkJRE1BYnVmX291dHB1dGludHIoZGV2Yy0+cGxheWJhY2tfZGV2LCAxKTsKKwkJfQorCQlpZiAoZGV2Yy0+bW9kZWwgIT0gTURfMTg0OCAmJiAoYWx0X3N0YXQgJiAweDQwKSkJLyogVGltZXIgaW50ZXJydXB0ICovCisJCXsKKwkJCWRldmMtPnRpbWVyX3RpY2tzKys7CisjaWZuZGVmIEVYQ0xVREVfVElNRVJTCisJCQlpZiAodGltZXJfaW5zdGFsbGVkID09IGRldiAmJiBkZXZjLT50aW1lcl9ydW5uaW5nKQorCQkJCXNvdW5kX3RpbWVyX2ludGVycnVwdCgpOworI2VuZGlmCisJCX0KKwl9CisvKgorICogU29tZXRpbWVzIHBsYXliYWNrIG9yIGNhcHR1cmUgaW50ZXJydXB0cyBvY2N1ciB3aGlsZSBhIHRpbWVyIGludGVycnVwdAorICogaXMgYmVpbmcgaGFuZGxlZC4gVGhlIGludGVycnVwdCB3aWxsIG5vdCBiZSByZXRyaWdnZXJlZCBpZiB3ZSBkb24ndAorICogaGFuZGxlIGl0IG5vdy4gQ2hlY2sgaWYgYW4gaW50ZXJydXB0IGlzIHN0aWxsIHBlbmRpbmcgYW5kIHJlc3RhcnQKKyAqIHRoZSBoYW5kbGVyIGluIHRoaXMgY2FzZS4KKyAqLworCWlmIChpbmIoaW9fU3RhdHVzKGRldmMpKSAmIDB4MDEgJiYgY250KysgPCA0KQorCXsKKwkJICBnb3RvIGludGVycnVwdF9hZ2FpbjsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICoJRXhwZXJpbWVudGFsIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlIGZvciB0aGUgaW50ZWdyYXRlZCBzb3VuZCBzeXN0ZW0KKyAqCW9mIHRoZSBDb21wYXEgRGVza3BybyBNLgorICovCisKK3N0YXRpYyBpbnQgaW5pdF9kZXNrcHJvX20oc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIGNoYXIgICB0bXA7CisKKwlpZiAoKHRtcCA9IGluYigweGM0NCkpID09IDB4ZmYpCisJeworCQlEREIocHJpbnRrKCJpbml0X2Rlc2twcm9fbTogRGVhZCBwb3J0IDB4YzQ0XG4iKSk7CisJCXJldHVybiAwOworCX0KKworCW91dGIoMHgxMCwgMHhjNDQpOworCW91dGIoMHg0MCwgMHhjNDUpOworCW91dGIoMHgwMCwgMHhjNDYpOworCW91dGIoMHhlOCwgMHhjNDcpOworCW91dGIoMHgxNCwgMHhjNDQpOworCW91dGIoMHg0MCwgMHhjNDUpOworCW91dGIoMHgwMCwgMHhjNDYpOworCW91dGIoMHhlOCwgMHhjNDcpOworCW91dGIoMHgxMCwgMHhjNDQpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKglFeHBlcmltZW50YWwgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UgZm9yIHRoZSBpbnRlZ3JhdGVkIHNvdW5kIHN5c3RlbQorICoJb2YgQ29tcGFxIERlc2twcm8gWEwuCisgKi8KKworc3RhdGljIGludCBpbml0X2Rlc2twcm8oc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIGNoYXIgICB0bXA7CisKKwlpZiAoKHRtcCA9IGluYigweGM0NCkpID09IDB4ZmYpCisJeworCQlEREIocHJpbnRrKCJpbml0X2Rlc2twcm86IERlYWQgcG9ydCAweGM0NFxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0YigodG1wIHwgMHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbmsgMSAqLworCWlmIChpbmIoMHhjNDQpICE9IDB4MDQpCisJeworCQlEREIocHJpbnRrKCJpbml0X2Rlc2twcm86IEludmFsaWQgYmFuazEgc2lnbmF0dXJlIGluIHBvcnQgMHhjNDRcbiIpKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qCisJICogT0suIEl0IGxvb2tzIGxpa2UgYSBEZXNrcHJvIHNvIGxldCdzIHByb2NlZWQuCisJICovCisKKwkvKgorCSAqIEkvTyBwb3J0IDB4YzQ0IEF1ZGlvIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIuCisJICoKKwkgKiBiaXRzIDB4YzA6ICAgQXVkaW8gcmV2aXNpb24gYml0cworCSAqICAgICAgICAgICAgICAweDAwID0gQ29tcGFxIEJ1c2luZXNzIEF1ZGlvCisJICogICAgICAgICAgICAgIDB4NDAgPSBNUyBTb3VuZCBTeXN0ZW0gQ29tcGF0aWJsZSAocmVzZXQgZGVmYXVsdCkKKwkgKiAgICAgICAgICAgICAgMHg4MCA9IFJlc2VydmVkCisJICogICAgICAgICAgICAgIDB4YzAgPSBSZXNlcnZlZAorCSAqIGJpdCAweDIwOiAgICBObyBXYWl0IFN0YXRlIEVuYWJsZQorCSAqICAgICAgICAgICAgICAweDAwID0gRGlzYWJsZWQgKHJlc2V0IGRlZmF1bHQsIERNQSBtb2RlKQorCSAqICAgICAgICAgICAgICAweDIwID0gRW5hYmxlZCAocHJvZ3JhbW1lZCBJL08gbW9kZSkKKwkgKiBiaXQgMHgxMDogICAgTVMgU291bmQgU3lzdGVtIERlY29kZSBFbmFibGUKKwkgKiAgICAgICAgICAgICAgMHgwMCA9IERlY29kaW5nIGRpc2FibGVkIChyZXNldCBkZWZhdWx0KQorCSAqICAgICAgICAgICAgICAweDEwID0gRGVjb2RpbmcgZW5hYmxlZAorCSAqIGJpdCAweDA4OiAgICBGTSBTeW50aGVzaXMgRGVjb2RlIEVuYWJsZQorCSAqICAgICAgICAgICAgICAweDAwID0gRGVjb2RpbmcgRGlzYWJsZWQgKHJlc2V0IGRlZmF1bHQpCisJICogICAgICAgICAgICAgIDB4MDggPSBEZWNvZGluZyBlbmFibGVkCisJICogYml0IDB4MDQgICAgIEJhbmsgc2VsZWN0CisJICogICAgICAgICAgICAgIDB4MDAgPSBCYW5rIDAKKwkgKiAgICAgICAgICAgICAgMHgwNCA9IEJhbmsgMQorCSAqIGJpdHMgMHgwMyAgICBNU1MgQmFzZSBhZGRyZXNzCisJICogICAgICAgICAgICAgIDB4MDAgPSAweDUzMCAocmVzZXQgZGVmYXVsdCkKKwkgKiAgICAgICAgICAgICAgMHgwMSA9IDB4NjA0CisJICogICAgICAgICAgICAgIDB4MDIgPSAweGY0MAorCSAqICAgICAgICAgICAgICAweDAzID0gMHhlODAKKwkgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NCAoYmVmb3JlKTogIik7CisJb3V0YigodG1wICYgfjB4MDQpLCAweGM0NCk7CisJcHJpbnRrKCIlMDJ4ICIsIGluYigweGM0NCkpOworCW91dGIoKHRtcCB8IDB4MDQpLCAweGM0NCk7CisJcHJpbnRrKCIlMDJ4XG4iLCBpbmIoMHhjNDQpKTsKKyNlbmRpZgorCisJLyogU2V0IGJhbmsgMSBvZiB0aGUgcmVnaXN0ZXIgKi8KKwl0bXAgPSAweDU4OwkJLyogTVNTIE1vZGUsIE1TUyZGTSBkZWNvZGUgZW5hYmxlZCAqLworCisJc3dpdGNoIChod19jb25maWctPmlvX2Jhc2UpCisJeworCQljYXNlIDB4NTMwOgorCQkJdG1wIHw9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAweDYwNDoKKwkJCXRtcCB8PSAweDAxOworCQkJYnJlYWs7CisJCWNhc2UgMHhmNDA6CisJCQl0bXAgfD0gMHgwMjsKKwkJCWJyZWFrOworCQljYXNlIDB4ZTgwOgorCQkJdG1wIHw9IDB4MDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUREQihwcmludGsoImluaXRfZGVza3BybzogSW52YWxpZCBNU1MgcG9ydCAleFxuIiwgaHdfY29uZmlnLT5pb19iYXNlKSk7CisJCQlyZXR1cm4gMDsKKwl9CisJb3V0YigodG1wICYgfjB4MDQpLCAweGM0NCk7CS8qIFdyaXRlIHRvIGJhbms9MCAqLworCisjaWZkZWYgREVCVUdYTAorCS8qIERlYnVnIHByaW50aW5nICovCisJcHJpbnRrKCJQb3J0IDB4YzQ0IChhZnRlcik6ICIpOworCW91dGIoKHRtcCAmIH4weDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0wICovCisJcHJpbnRrKCIlMDJ4ICIsIGluYigweGM0NCkpOworCW91dGIoKHRtcCB8IDB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTEgKi8KKwlwcmludGsoIiUwMnhcbiIsIGluYigweGM0NCkpOworI2VuZGlmCisKKwkvKgorCSAqIEkvTyBwb3J0IDB4YzQ1IEZNIEFkZHJlc3MgRGVjb2RlL01TUyBJRCBSZWdpc3Rlci4KKwkgKgorCSAqIGJhbms9MCwgYml0cyAweGZlOiAgIEZNIHN5bnRoZXNpcyBEZWNvZGUgQ29tcGFyZSBiaXRzIDc6MSAoZGVmYXVsdD0weDg4KQorCSAqIGJhbms9MCwgYml0IDB4MDE6ICAgIFNCSUMgUG93ZXIgQ29udHJvbCBCaXQKKwkgKiAgICAgICAgICAgICAgICAgICAgICAweDAwID0gUG93ZXJlZCB1cAorCSAqICAgICAgICAgICAgICAgICAgICAgIDB4MDEgPSBQb3dlcmVkIGRvd24KKwkgKiBiYW5rPTEsIGJpdHMgMHhmYzogICBNU1MgSUQgKGRlZmF1bHQ9MHg0MCkKKwkgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NSAoYmVmb3JlKTogIik7CisJb3V0YigodG1wICYgfjB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTAgKi8KKwlwcmludGsoIiUwMnggIiwgaW5iKDB4YzQ1KSk7CisJb3V0YigodG1wIHwgMHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MSAqLworCXByaW50aygiJTAyeFxuIiwgaW5iKDB4YzQ1KSk7CisjZW5kaWYKKworCW91dGIoKHRtcCAmIH4weDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0wICovCisJb3V0YigoMHg4OCksIDB4YzQ1KTsJLyogRk0gYmFzZSA3OjAgPSAweDg4ICovCisJb3V0YigodG1wIHwgMHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MSAqLworCW91dGIoKDB4MTApLCAweGM0NSk7CS8qIE1TUyBJRCA9IDB4MTAgKE1TUyBwb3J0IHJldHVybnMgMHgwNCkgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NSAoYWZ0ZXIpOiAiKTsKKwlvdXRiKCh0bXAgJiB+MHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MCAqLworCXByaW50aygiJTAyeCAiLCBpbmIoMHhjNDUpKTsKKwlvdXRiKCh0bXAgfCAweDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0xICovCisJcHJpbnRrKCIlMDJ4XG4iLCBpbmIoMHhjNDUpKTsKKyNlbmRpZgorCisKKwkvKgorCSAqIEkvTyBwb3J0IDB4YzQ2IEZNIEFkZHJlc3MgRGVjb2RlL0FkZHJlc3MgQVNJQyBSZXZpc2lvbiBSZWdpc3Rlci4KKwkgKgorCSAqIGJhbms9MCwgYml0cyAweGZmOiAgIEZNIHN5bnRoZXNpcyBEZWNvZGUgQ29tcGFyZSBiaXRzIDE1OjggKGRlZmF1bHQ9MHgwMykKKwkgKiBiYW5rPTEsIGJpdHMgMHhmZjogICBBdWRpbyBhZGRyZXNzaW5nIEFTSUMgaWQKKwkgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NiAoYmVmb3JlKTogIik7CisJb3V0YigodG1wICYgfjB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTAgKi8KKwlwcmludGsoIiUwMnggIiwgaW5iKDB4YzQ2KSk7CisJb3V0YigodG1wIHwgMHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MSAqLworCXByaW50aygiJTAyeFxuIiwgaW5iKDB4YzQ2KSk7CisjZW5kaWYKKworCW91dGIoKHRtcCAmIH4weDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0wICovCisJb3V0YigoMHgwMyksIDB4YzQ2KTsJLyogRk0gYmFzZSAxNTo4ID0gMHgwMyAqLworCW91dGIoKHRtcCB8IDB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTEgKi8KKwlvdXRiKCgweDExKSwgMHhjNDYpOwkvKiBBU0lDIElEID0gMHgxMSAqLworCisjaWZkZWYgREVCVUdYTAorCS8qIERlYnVnIHByaW50aW5nICovCisJcHJpbnRrKCJQb3J0IDB4YzQ2IChhZnRlcik6ICIpOworCW91dGIoKHRtcCAmIH4weDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0wICovCisJcHJpbnRrKCIlMDJ4ICIsIGluYigweGM0NikpOworCW91dGIoKHRtcCB8IDB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTEgKi8KKwlwcmludGsoIiUwMnhcbiIsIGluYigweGM0NikpOworI2VuZGlmCisKKwkvKgorCSAqIEkvTyBwb3J0IDB4YzQ3IEZNIEFkZHJlc3MgRGVjb2RlIFJlZ2lzdGVyLgorCSAqCisJICogYmFuaz0wLCBiaXRzIDB4ZmY6ICAgRGVjb2RlIGVuYWJsZSBzZWxlY3Rpb24gZm9yIHZhcmlvdXMgRk0gYWRkcmVzcyBiaXRzCisJICogYmFuaz0xLCBiaXRzIDB4ZmY6ICAgUmVzZXJ2ZWQKKwkgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NyAoYmVmb3JlKTogIik7CisJb3V0YigodG1wICYgfjB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTAgKi8KKwlwcmludGsoIiUwMnggIiwgaW5iKDB4YzQ3KSk7CisJb3V0YigodG1wIHwgMHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MSAqLworCXByaW50aygiJTAyeFxuIiwgaW5iKDB4YzQ3KSk7CisjZW5kaWYKKworCW91dGIoKHRtcCAmIH4weDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0wICovCisJb3V0YigoMHg3YyksIDB4YzQ3KTsJLyogRk0gZGVjb2RlIGVuYWJsZSBiaXRzID0gMHg3YyAqLworCW91dGIoKHRtcCB8IDB4MDQpLCAweGM0NCk7CS8qIFNlbGVjdCBiYW5rPTEgKi8KKwlvdXRiKCgweDAwKSwgMHhjNDcpOwkvKiBSZXNlcnZlZCBiYW5rMSA9IDB4MDAgKi8KKworI2lmZGVmIERFQlVHWEwKKwkvKiBEZWJ1ZyBwcmludGluZyAqLworCXByaW50aygiUG9ydCAweGM0NyAoYWZ0ZXIpOiAiKTsKKwlvdXRiKCh0bXAgJiB+MHgwNCksIDB4YzQ0KTsJLyogU2VsZWN0IGJhbms9MCAqLworCXByaW50aygiJTAyeCAiLCBpbmIoMHhjNDcpKTsKKwlvdXRiKCh0bXAgfCAweDA0KSwgMHhjNDQpOwkvKiBTZWxlY3QgYmFuaz0xICovCisJcHJpbnRrKCIlMDJ4XG4iLCBpbmIoMHhjNDcpKTsKKyNlbmRpZgorCisJLyoKKwkgKiBJL08gcG9ydCAweGM2ZiA9IEF1ZGlvIERpc2FibGUgRnVuY3Rpb24gUmVnaXN0ZXIKKwkgKi8KKworI2lmZGVmIERFQlVHWEwKKwlwcmludGsoIlBvcnQgMHhjNmYgKGJlZm9yZSkgPSAlMDJ4XG4iLCBpbmIoMHhjNmYpKTsKKyNlbmRpZgorCisJb3V0YigoMHg4MCksIDB4YzZmKTsKKworI2lmZGVmIERFQlVHWEwKKwlwcmludGsoIlBvcnQgMHhjNmYgKGFmdGVyKSA9ICUwMnhcbiIsIGluYigweGM2ZikpOworI2VuZGlmCisKKwlyZXR1cm4gMTsKK30KKworaW50IHByb2JlX21zX3NvdW5kKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IHJlc291cmNlICpwb3J0cykKK3sKKwl1bnNpZ25lZCBjaGFyICAgdG1wOworCisJRERCKHByaW50aygiRW50ZXJlZCBwcm9iZV9tc19zb3VuZCgleCwgJWQpXG4iLCBod19jb25maWctPmlvX2Jhc2UsIGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlKSk7CisKKwlpZiAoaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUgPT0gMSkJLyogSGFzIG5vIElSUS9ETUEgcmVnaXN0ZXJzICovCisJeworCQkvKiBjaGVja19vcGwzKDB4Mzg4LCBod19jb25maWcpOyAqLworCQlyZXR1cm4gYWQxODQ4X2RldGVjdChwb3J0cywgTlVMTCwgaHdfY29uZmlnLT5vc3ApOworCX0KKworCWlmIChkZXNrcHJvX3hsICYmIGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlID09IDIpCS8qIENvbXBhcSBEZXNrcHJvIFhMICovCisJeworCQlpZiAoIWluaXRfZGVza3Bybyhod19jb25maWcpKQorCQkJcmV0dXJuIDA7CisJfQorCisJaWYgKGRlc2twcm9fbSkJLyogQ29tcGFxIERlc2twcm8gTSAqLworCXsKKwkJaWYgKCFpbml0X2Rlc2twcm9fbShod19jb25maWcpKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgICAqIENoZWNrIGlmIHRoZSBJTyBwb3J0IHJldHVybnMgdmFsaWQgc2lnbmF0dXJlLiBUaGUgb3JpZ2luYWwgTVMgU291bmQKKwkgICAqIHN5c3RlbSByZXR1cm5zIDB4MDQgd2hpbGUgc29tZSBjYXJkcyAoQXVkaW9Ucml4IFBybyBmb3IgZXhhbXBsZSkKKwkgICAqIHJldHVybiAweDAwIG9yIDB4MGYuCisJICovCisKKwlpZiAoKHRtcCA9IGluYihod19jb25maWctPmlvX2Jhc2UgKyAzKSkgPT0gMHhmZikJLyogQnVzIGZsb2F0ICovCisJeworCQkgIGludCAgICAgICAgICAgICByZXQ7CisKKwkJICBEREIocHJpbnRrKCJJL08gYWRkcmVzcyBpcyBpbmFjdGl2ZSAoJXgpXG4iLCB0bXApKTsKKwkJICBpZiAoIShyZXQgPSBhZDE4NDhfZGV0ZWN0KHBvcnRzLCBOVUxMLCBod19jb25maWctPm9zcCkpKQorCQkJICByZXR1cm4gMDsKKwkJICByZXR1cm4gMTsKKwl9CisJRERCKHByaW50aygiTVNTIHNpZ25hdHVyZSA9ICV4XG4iLCB0bXAgJiAweDNmKSk7CisJaWYgKCh0bXAgJiAweDNmKSAhPSAweDA0ICYmCisJICAgICh0bXAgJiAweDNmKSAhPSAweDBmICYmCisJICAgICh0bXAgJiAweDNmKSAhPSAweDAwKQorCXsKKwkJaW50IHJldDsKKworCQlNREIocHJpbnRrKEtFUk5fRVJSICJObyBNU1Mgc2lnbmF0dXJlIGRldGVjdGVkIG9uIHBvcnQgMHgleCAoMHgleClcbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSwgKGludCkgaW5iKGh3X2NvbmZpZy0+aW9fYmFzZSArIDMpKSk7CisJCUREQihwcmludGsoIlRyeWluZyB0byBkZXRlY3QgY29kZWMgYW55d2F5IGJ1dCBJUlEvRE1BIG1heSBub3Qgd29ya1xuIikpOworCQlpZiAoIShyZXQgPSBhZDE4NDhfZGV0ZWN0KHBvcnRzLCBOVUxMLCBod19jb25maWctPm9zcCkpKQorCQkJcmV0dXJuIDA7CisKKwkJaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUgPSAxOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKChod19jb25maWctPmlycSAhPSA1KSAgJiYKKwkgICAgKGh3X2NvbmZpZy0+aXJxICE9IDcpICAmJgorCSAgICAoaHdfY29uZmlnLT5pcnEgIT0gOSkgICYmCisJICAgIChod19jb25maWctPmlycSAhPSAxMCkgJiYKKwkgICAgKGh3X2NvbmZpZy0+aXJxICE9IDExKSAmJgorCSAgICAoaHdfY29uZmlnLT5pcnEgIT0gMTIpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJNU1M6IEJhZCBJUlEgJWRcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChod19jb25maWctPmRtYSAhPSAwICYmIGh3X2NvbmZpZy0+ZG1hICE9IDEgJiYgaHdfY29uZmlnLT5kbWEgIT0gMykKKwl7CisJCSAgcHJpbnRrKEtFUk5fRVJSICJNU1M6IEJhZCBETUEgJWRcbiIsIGh3X2NvbmZpZy0+ZG1hKTsKKwkJICByZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBDaGVjayB0aGF0IERNQTAgaXMgbm90IGluIHVzZSB3aXRoIGEgOCBiaXQgYm9hcmQuCisJICovCisKKwlpZiAoaHdfY29uZmlnLT5kbWEgPT0gMCAmJiBpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgMykgJiAweDgwKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJNU1M6IENhbid0IHVzZSBETUEwIHdpdGggYSA4IGJpdCBjYXJkL3Nsb3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGh3X2NvbmZpZy0+aXJxID4gNyAmJiBod19jb25maWctPmlycSAhPSA5ICYmIGluYihod19jb25maWctPmlvX2Jhc2UgKyAzKSAmIDB4ODApCisJeworCQlwcmludGsoS0VSTl9FUlIgIk1TUzogQ2FuJ3QgdXNlIElSUSVkIHdpdGggYSA4IGJpdCBjYXJkL3Nsb3RcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiBhZDE4NDhfZGV0ZWN0KHBvcnRzLCBOVUxMLCBod19jb25maWctPm9zcCk7Cit9CisKK3ZvaWQgYXR0YWNoX21zX3NvdW5kKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IHJlc291cmNlICpwb3J0cywgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJc3RhdGljIHNpZ25lZCBjaGFyIGludGVycnVwdF9iaXRzWzEyXSA9CisJeworCQktMSwgLTEsIC0xLCAtMSwgLTEsIDB4MDAsIC0xLCAweDA4LCAtMSwgMHgxMCwgMHgxOCwgMHgyMAorCX07CisJc2lnbmVkIGNoYXIgICAgIGJpdHM7CisJY2hhciAgICAgICAgICAgIGRtYTJfYml0ID0gMDsKKworCXN0YXRpYyBjaGFyICAgICBkbWFfYml0c1s0XSA9CisJeworCQkxLCAyLCAwLCAzCisJfTsKKworCWludCBjb25maWdfcG9ydCA9IGh3X2NvbmZpZy0+aW9fYmFzZSArIDA7CisJaW50IHZlcnNpb25fcG9ydCA9IGh3X2NvbmZpZy0+aW9fYmFzZSArIDM7CisJaW50IGRtYSA9IGh3X2NvbmZpZy0+ZG1hOworCWludCBkbWEyID0gaHdfY29uZmlnLT5kbWEyOworCisJaWYgKGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlID09IDEpCS8qIEhhcyBubyBJUlEvRE1BIHJlZ2lzdGVycyAqLworCXsKKwkJaHdfY29uZmlnLT5zbG90c1swXSA9IGFkMTg0OF9pbml0KCJNUyBTb3VuZCBTeXN0ZW0iLCBwb3J0cywKKwkJCQkJCSAgICBod19jb25maWctPmlycSwKKwkJCQkJCSAgICBod19jb25maWctPmRtYSwKKwkJCQkJCSAgICBod19jb25maWctPmRtYTIsIDAsIAorCQkJCQkJICAgIGh3X2NvbmZpZy0+b3NwLAorCQkJCQkJICAgIG93bmVyKTsKKwkJcmV0dXJuOworCX0KKwkvKgorCSAqIFNldCB0aGUgSVJRIGFuZCBETUEgYWRkcmVzc2VzLgorCSAqLworCisJYml0cyA9IGludGVycnVwdF9iaXRzW2h3X2NvbmZpZy0+aXJxXTsKKwlpZiAoYml0cyA9PSAtMSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiTVNTOiBCYWQgSVJRICVkXG4iLCBod19jb25maWctPmlycSk7CisJCXJlbGVhc2VfcmVnaW9uKHBvcnRzLT5zdGFydCwgNCk7CisJCXJlbGVhc2VfcmVnaW9uKHBvcnRzLT5zdGFydCAtIDQsIDQpOworCQlyZXR1cm47CisJfQorCW91dGIoKGJpdHMgfCAweDQwKSwgY29uZmlnX3BvcnQpOworCWlmICgoaW5iKHZlcnNpb25fcG9ydCkgJiAweDQwKSA9PSAwKQorCQlwcmludGsoS0VSTl9FUlIgIltNU1M6IElSUSBDb25mbGljdD9dXG4iKTsKKworLyoKKyAqIEhhbmRsZSB0aGUgY2FwdHVyZSBETUEgY2hhbm5lbAorICovCisKKwlpZiAoZG1hMiAhPSAtMSAmJiBkbWEyICE9IGRtYSkKKwl7CisJCWlmICghKChkbWEgPT0gMCAmJiBkbWEyID09IDEpIHx8CisJCQkoZG1hID09IDEgJiYgZG1hMiA9PSAwKSB8fAorCQkJKGRtYSA9PSAzICYmIGRtYTIgPT0gMCkpKQorCQl7CS8qIFVuc3VwcG9ydGVkIGNvbWJpbmF0aW9uLiBUcnkgdG8gc3dhcCBjaGFubmVscyAqLworCQkJaW50IHRtcCA9IGRtYTsKKworCQkJZG1hID0gZG1hMjsKKwkJCWRtYTIgPSB0bXA7CisJCX0KKwkJaWYgKChkbWEgPT0gMCAmJiBkbWEyID09IDEpIHx8CisJCQkoZG1hID09IDEgJiYgZG1hMiA9PSAwKSB8fAorCQkJKGRtYSA9PSAzICYmIGRtYTIgPT0gMCkpCisJCXsKKwkJCWRtYTJfYml0ID0gMHgwNDsJLyogRW5hYmxlIGNhcHR1cmUgRE1BICovCisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJNU1M6IEludmFsaWQgY2FwdHVyZSBETUFcbiIpOworCQkJZG1hMiA9IGRtYTsKKwkJfQorCX0KKwllbHNlCisJeworCQlkbWEyID0gZG1hOworCX0KKworCWh3X2NvbmZpZy0+ZG1hID0gZG1hOworCWh3X2NvbmZpZy0+ZG1hMiA9IGRtYTI7CisKKwlvdXRiKChiaXRzIHwgZG1hX2JpdHNbZG1hXSB8IGRtYTJfYml0KSwgY29uZmlnX3BvcnQpOwkvKiBXcml0ZSBJUlErRE1BIHNldHVwICovCisKKwlod19jb25maWctPnNsb3RzWzBdID0gYWQxODQ4X2luaXQoIk1TIFNvdW5kIFN5c3RlbSIsIHBvcnRzLAorCQkJCQkgIGh3X2NvbmZpZy0+aXJxLAorCQkJCQkgIGRtYSwgZG1hMiwgMCwKKwkJCQkJICBod19jb25maWctPm9zcCwKKwkJCQkJICBUSElTX01PRFVMRSk7Cit9CisKK3ZvaWQgdW5sb2FkX21zX3NvdW5kKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlhZDE4NDhfdW5sb2FkKGh3X2NvbmZpZy0+aW9fYmFzZSArIDQsCisJCSAgICAgIGh3X2NvbmZpZy0+aXJxLAorCQkgICAgICBod19jb25maWctPmRtYSwKKwkJICAgICAgaHdfY29uZmlnLT5kbWEyLCAwKTsKKwlzb3VuZF91bmxvYWRfYXVkaW9kZXYoaHdfY29uZmlnLT5zbG90c1swXSk7CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKK30KKworI2lmbmRlZiBFWENMVURFX1RJTUVSUworCisvKgorICogVGltZXIgc3R1ZmYgKGZvciAvZGV2L211c2ljKS4KKyAqLworCitzdGF0aWMgdW5zaWduZWQgaW50IGN1cnJlbnRfaW50ZXJ2YWw7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWQxODQ4X3Rtcl9zdGFydChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgdXNlY3MpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCWFkMTg0OF9pbmZvICAgICpkZXZjID0gKGFkMTg0OF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nICAgeHRhbF9uc2VjczsJLyogbmFub3NlY29uZHMgcGVyIHh0YWwgb3NjaWxsYXRvciB0aWNrICovCisJdW5zaWduZWQgbG9uZyAgIGRpdmlkZXI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwkvKgorCSAqIExlbmd0aCBvZiB0aGUgdGltZXIgaW50ZXJ2YWwgKGluIG5hbm9zZWNvbmRzKSBkZXBlbmRzIG9uIHRoZQorCSAqIHNlbGVjdGVkIGNyeXN0YWwgb3NjaWxsYXRvci4gQ2hlY2sgdGhpcyBmcm9tIGJpdCAweDAxIG9mIEk4LgorCSAqCisJICogQUQxODQ1IGhhcyBqdXN0IG9uZSBvc2NpbGxhdG9yIHdoaWNoIGhhcyBjeWNsZSB0aW1lIG9mIDEwLjA1MCB1cworCSAqICh3aGVuIGEgMjQuNTc2IE1IeiB4dGFsIG9zY2lsbGF0b3IgaXMgdXNlZCkuCisJICoKKwkgKiBDb252ZXJ0IHJlcXVlc3RlZCBpbnRlcnZhbCB0byBuYW5vc2Vjb25kcyBiZWZvcmUgY29tcHV0aW5nCisJICogdGhlIHRpbWVyIGRpdmlkZXIuCisJICovCisKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURfMTg0NSB8fCBkZXZjLT5tb2RlbCA9PSBNRF8xODQ1X1NTQ0FQRSkKKwkJeHRhbF9uc2VjcyA9IDEwMDUwOworCWVsc2UgaWYgKGFkX3JlYWQoZGV2YywgOCkgJiAweDAxKQorCQl4dGFsX25zZWNzID0gOTkyMDsKKwllbHNlCisJCXh0YWxfbnNlY3MgPSA5OTY5OworCisJZGl2aWRlciA9ICh1c2VjcyAqIDEwMDAgKyB4dGFsX25zZWNzIC8gMikgLyB4dGFsX25zZWNzOworCisJaWYgKGRpdmlkZXIgPCAxMDApCS8qIERvbid0IGFsbG93IHNob3J0ZXIgaW50ZXJ2YWxzIHRoYW4gYWJvdXQgMW1zICovCisJCWRpdmlkZXIgPSAxMDA7CisKKwlpZiAoZGl2aWRlciA+IDY1NTM1KQkvKiBPdmVyZmxvdyBjaGVjayAqLworCQlkaXZpZGVyID0gNjU1MzU7CisKKwlhZF93cml0ZShkZXZjLCAyMSwgKGRpdmlkZXIgPj4gOCkgJiAweGZmKTsJLyogU2V0IHVwcGVyIGJpdHMgKi8KKwlhZF93cml0ZShkZXZjLCAyMCwgZGl2aWRlciAmIDB4ZmYpOwkvKiBTZXQgbG93ZXIgYml0cyAqLworCWFkX3dyaXRlKGRldmMsIDE2LCBhZF9yZWFkKGRldmMsIDE2KSB8IDB4NDApOwkvKiBTdGFydCB0aGUgdGltZXIgKi8KKwlkZXZjLT50aW1lcl9ydW5uaW5nID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCXJldHVybiBjdXJyZW50X2ludGVydmFsID0gKGRpdmlkZXIgKiB4dGFsX25zZWNzICsgNTAwKSAvIDEwMDA7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0OF90bXJfcmVwcm9ncmFtKGludCBkZXYpCit7CisJLyoKKwkgKiAgICBBdWRpbyBkcml2ZXIgaGFzIGNoYW5nZWQgc2FtcGxpbmcgcmF0ZSBzbyB0aGF0IGEgZGlmZmVyZW50IHh0YWwKKwkgKiAgICAgIG9zY2lsbGF0b3Igd2FzIHNlbGVjdGVkLiBXZSBoYXZlIHRvIHJlcHJvZ3JhbSB0aGUgdGltZXIgcmF0ZS4KKwkgKi8KKworCWFkMTg0OF90bXJfc3RhcnQoZGV2LCBjdXJyZW50X2ludGVydmFsKTsKKwlzb3VuZF90aW1lcl9zeW5jaW50ZXJ2YWwoY3VycmVudF9pbnRlcnZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0OF90bXJfZGlzYWJsZShpbnQgZGV2KQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlhZDE4NDhfaW5mbyAgICAqZGV2YyA9IChhZDE4NDhfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJYWRfd3JpdGUoZGV2YywgMTYsIGFkX3JlYWQoZGV2YywgMTYpICYgfjB4NDApOworCWRldmMtPnRpbWVyX3J1bm5pbmcgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBhZDE4NDhfdG1yX3Jlc3RhcnQoaW50IGRldikKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJYWQxODQ4X2luZm8gICAgKmRldmMgPSAoYWQxODQ4X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGN1cnJlbnRfaW50ZXJ2YWwgPT0gMCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWFkX3dyaXRlKGRldmMsIDE2LCBhZF9yZWFkKGRldmMsIDE2KSB8IDB4NDApOworCWRldmMtPnRpbWVyX3J1bm5pbmcgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgc3RydWN0IHNvdW5kX2xvd2xldl90aW1lciBhZDE4NDhfdG1yID0KK3sKKwkwLAorCTIsCisJYWQxODQ4X3Rtcl9zdGFydCwKKwlhZDE4NDhfdG1yX2Rpc2FibGUsCisJYWQxODQ4X3Rtcl9yZXN0YXJ0Cit9OworCitzdGF0aWMgaW50IGFkMTg0OF90bXJfaW5zdGFsbChpbnQgZGV2KQoreworCWlmICh0aW1lcl9pbnN0YWxsZWQgIT0gLTEpCisJCXJldHVybiAwOwkvKiBEb24ndCBpbnN0YWxsIGFub3RoZXIgdGltZXIgKi8KKworCXRpbWVyX2luc3RhbGxlZCA9IGFkMTg0OF90bXIuZGV2ID0gZGV2OworCXNvdW5kX3RpbWVyX2luaXQoJmFkMTg0OF90bXIsIGF1ZGlvX2RldnNbZGV2XS0+bmFtZSk7CisKKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBFWENMVURFX1RJTUVSUyAqLworCitzdGF0aWMgaW50IGFkMTg0OF9zdXNwZW5kKGFkMTg0OF9pbmZvICpkZXZjKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwlhZF9tdXRlKGRldmMpOworCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkMTg0OF9yZXN1bWUoYWQxODQ4X2luZm8gKmRldmMpCit7CisJaW50IG1peGVyX2xldmVsc1szMl0sIGk7CisKKwkvKiBUaGlua3BhZCBpcyBhIGJpdCBtb3JlIG9mIFBJVEEgdGhhbiBub3JtYWwuIFRoZSBCSU9TIHRlbmRzIHRvCisJICAgcmVzdG9yZSBpdCBpbiBhIGRpZmZlcmVudCBjb25maWcgdG8gdGhlIG9uZSB3ZSB1c2UuICBOZWVkIHRvCisJICAgZml4IHRoaXMgc29tZWhvdyAqLworCisJLyogc3RvcmUgb2xkIG1peGVyIGxldmVscyAqLworCW1lbWNweShtaXhlcl9sZXZlbHMsIGRldmMtPmxldmVscywgc2l6ZW9mIChtaXhlcl9sZXZlbHMpKTsgIAorCWFkMTg0OF9pbml0X2h3KGRldmMpOworCisJLyogcmVzdG9yZSBtaXhlciBsZXZlbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJYWQxODQ4X21peGVyX3NldChkZXZjLCBkZXZjLT5kZXZfbm8sIG1peGVyX2xldmVsc1tpXSk7CisKKwlpZiAoIWRldmMtPnN1YnR5cGUpIHsKKwkJc3RhdGljIHNpZ25lZCBjaGFyIGludGVycnVwdF9iaXRzWzEyXSA9IHsgLTEsIC0xLCAtMSwgLTEsIC0xLCAweDAwLCAtMSwgMHgwOCwgLTEsIDB4MTAsIDB4MTgsIDB4MjAgfTsKKwkJc3RhdGljIGNoYXIgZG1hX2JpdHNbNF0gPSB7IDEsIDIsIDAsIDMgfTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc2lnbmVkIGNoYXIgYml0czsKKwkJY2hhciBkbWEyX2JpdCA9IDA7CisKKwkJaW50IGNvbmZpZ19wb3J0ID0gZGV2Yy0+YmFzZSArIDA7CisKKwkJYml0cyA9IGludGVycnVwdF9iaXRzW2RldmMtPmlycV07CisJCWlmIChiaXRzID09IC0xKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIk1TUzogQmFkIElSUSAlZFxuIiwgZGV2Yy0+aXJxKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkKKwkJb3V0YigoYml0cyB8IDB4NDApLCBjb25maWdfcG9ydCk7IAorCisJCWlmIChkZXZjLT5kbWEyICE9IC0xICYmIGRldmMtPmRtYTIgIT0gZGV2Yy0+ZG1hMSkKKwkJCWlmICggKGRldmMtPmRtYTEgPT0gMCAmJiBkZXZjLT5kbWEyID09IDEpIHx8CisJCQkgICAgIChkZXZjLT5kbWExID09IDEgJiYgZGV2Yy0+ZG1hMiA9PSAwKSB8fAorCQkJICAgICAoZGV2Yy0+ZG1hMSA9PSAzICYmIGRldmMtPmRtYTIgPT0gMCkpCisJCQkJZG1hMl9iaXQgPSAweDA0OworCisJCW91dGIoKGJpdHMgfCBkbWFfYml0c1tkZXZjLT5kbWExXSB8IGRtYTJfYml0KSwgY29uZmlnX3BvcnQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE4NDhfcG1fY2FsbGJhY2soc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSkgCit7CisJYWQxODQ4X2luZm8gKmRldmMgPSBkZXYtPmRhdGE7CisJaWYgKGRldmMpIHsKKwkJREVCKHByaW50aygiYWQxODQ4OiBwbSBldmVudCByZWNlaXZlZDogMHgleFxuIiwgcnFzdCkpOworCisJCXN3aXRjaCAocnFzdCkgeworCQljYXNlIFBNX1NVU1BFTkQ6CisJCQlhZDE4NDhfc3VzcGVuZChkZXZjKTsKKwkJCWJyZWFrOworCQljYXNlIFBNX1JFU1VNRToKKwkJCWFkMTg0OF9yZXN1bWUoZGV2Yyk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworCitFWFBPUlRfU1lNQk9MKGFkMTg0OF9kZXRlY3QpOworRVhQT1JUX1NZTUJPTChhZDE4NDhfaW5pdCk7CitFWFBPUlRfU1lNQk9MKGFkMTg0OF91bmxvYWQpOworRVhQT1JUX1NZTUJPTChhZDE4NDhfY29udHJvbCk7CitFWFBPUlRfU1lNQk9MKGFkaW50cik7CitFWFBPUlRfU1lNQk9MKHByb2JlX21zX3NvdW5kKTsKK0VYUE9SVF9TWU1CT0woYXR0YWNoX21zX3NvdW5kKTsKK0VYUE9SVF9TWU1CT0wodW5sb2FkX21zX3NvdW5kKTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGlvID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMiA9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIHR5cGUgPSAwOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CQkvKiBJL08gZm9yIGEgcmF3IEFEMTg0OCBjYXJkICovCittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOwkJLyogSVJRIHRvIHVzZSAqLworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsJCS8qIEZpcnN0IERNQSBjaGFubmVsICovCittb2R1bGVfcGFyYW0oZG1hMiwgaW50LCAwKTsJCS8qIFNlY29uZCBETUEgY2hhbm5lbCAqLworbW9kdWxlX3BhcmFtKHR5cGUsIGludCwgMCk7CQkvKiBDYXJkIHR5cGUgKi8KK21vZHVsZV9wYXJhbShkZXNrcHJvX3hsLCBib29sLCAwKTsJLyogU3BlY2lhbCBtYWdpYyBmb3IgRGVza3BybyBYTCBib3hlbiAqLworbW9kdWxlX3BhcmFtKGRlc2twcm9fbSwgYm9vbCwgMCk7CS8qIFNwZWNpYWwgbWFnaWMgZm9yIERlc2twcm8gTSBib3ggKi8KK21vZHVsZV9wYXJhbShzb3VuZHBybywgYm9vbCwgMCk7CS8qIE1vcmUgc3BlY2lhbCBtYWdpYyBmb3IgU291bmRQcm8gY2hpcHMgKi8KKworI2lmZGVmIENPTkZJR19QTlAKK21vZHVsZV9wYXJhbShpc2FwbnAsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXNhcG5wanVtcCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShyZXZlcnNlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXNhcG5wLAkiV2hlbiBzZXQgdG8gMCwgUGx1ZyAmIFBsYXkgc3VwcG9ydCB3aWxsIGJlIGRpc2FibGVkIik7CitNT0RVTEVfUEFSTV9ERVNDKGlzYXBucGp1bXAsCSJKdW1wcyB0byBhIHNwZWNpZmljIHNsb3QgaW4gdGhlIGRyaXZlcidzIFBuUCB0YWJsZS4gVXNlIHRoZSBzb3VyY2UsIEx1a2UuIik7CitNT0RVTEVfUEFSTV9ERVNDKHJldmVyc2UsCSJXaGVuIHNldCB0byAxLCB3aWxsIHJldmVyc2UgSVNBUG5QIHNlYXJjaCBvcmRlciIpOworCitzdGF0aWMgc3RydWN0IHBucF9kZXYJKmFkMTg0OF9kZXYgID0gTlVMTDsKKworLyogUGxlYXNlIGFkZCBuZXcgZW50cmllcyBhdCB0aGUgZW5kIG9mIHRoZSB0YWJsZSAqLworc3RhdGljIHN0cnVjdCB7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBzaG9ydAljYXJkX3ZlbmRvciwgY2FyZF9kZXZpY2UsCisJCQl2ZW5kb3IsIGZ1bmN0aW9uOworCXNob3J0IG1zc19pbywgaXJxLCBkbWEsIGRtYTI7ICAgLyogaW5kZXggaW50byBpc2FwbnAgdGFibGUgKi8KKyAgICAgICAgaW50IHR5cGU7Cit9IGFkMTg0OF9pc2FwbnBfbGlzdFtdIF9faW5pdGRhdGEgPSB7CisJeyJDTUkgODMzMCBTb3VuZFBSTyIsCisJCUlTQVBOUF9WRU5ET1IoJ0MnLCdNJywnSScpLCBJU0FQTlBfREVWSUNFKDB4MDAwMSksCisJCUlTQVBOUF9WRU5ET1IoJ0AnLCdAJywnQCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMDAxKSwKKwkJMCwgMCwgMCwtMSwgMH0sCisgICAgICAgIHsiQ1M0MjMyIGJhc2VkIGNhcmQiLAorICAgICAgICAgICAgICAgIElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ0MnLCdTJywnQycpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMDAwKSwKKwkJMCwgMCwgMCwgMSwgMH0sCisgICAgICAgIHsiQ1M0MjMyIGJhc2VkIGNhcmQiLAorICAgICAgICAgICAgICAgIElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ0MnLCdTJywnQycpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMTAwKSwKKwkJMCwgMCwgMCwgMSwgMH0sCisgICAgICAgIHsiT1BMMy1TQTIgV1NTIG1vZGUiLAorICAgICAgICAJSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignWScsJ00nLCdIJyksIElTQVBOUF9GVU5DVElPTigweDAwMjEpLAorICAgICAgICAgICAgICAgIDEsIDAsIDAsIDEsIDF9LAorCXsiQWR2YW5jZWQgR3JhdmlzIEludGVyV2F2ZSBBdWRpbyIsCisJCUlTQVBOUF9WRU5ET1IoJ0cnLCdSJywnVicpLCBJU0FQTlBfREVWSUNFKDB4MDAwMSksCisJCUlTQVBOUF9WRU5ET1IoJ0cnLCdSJywnVicpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMDAwKSwKKwkJMCwgMCwgMCwgMSwgMH0sCisJe05VTEx9Cit9OworCitzdGF0aWMgc3RydWN0IGlzYXBucF9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsJSVNBUE5QX1ZFTkRPUignQycsJ00nLCdJJyksIElTQVBOUF9ERVZJQ0UoMHgwMDAxKSwKKwkJSVNBUE5QX1ZFTkRPUignQCcsJ0AnLCdAJyksIElTQVBOUF9GVU5DVElPTigweDAwMDEpLCAwIH0sCisgICAgICAgIHsgICAgICAgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQycsJ1MnLCdDJyksIElTQVBOUF9GVU5DVElPTigweDAwMDApLCAwIH0sCisgICAgICAgIHsgICAgICAgSVNBUE5QX0FOWV9JRCwgSVNBUE5QX0FOWV9JRCwKKwkJSVNBUE5QX1ZFTkRPUignQycsJ1MnLCdDJyksIElTQVBOUF9GVU5DVElPTigweDAxMDApLCAwIH0sCisJLyogVGhlIG1haW4gZHJpdmVyIGZvciB0aGlzIGNhcmQgaXMgb3BsM3NhMgorICAgICAgICB7ICAgICAgIElTQVBOUF9BTllfSUQsIElTQVBOUF9BTllfSUQsCisJCUlTQVBOUF9WRU5ET1IoJ1knLCdNJywnSCcpLCBJU0FQTlBfRlVOQ1RJT04oMHgwMDIxKSwgMCB9LAorCSovCisJewlJU0FQTlBfVkVORE9SKCdHJywnUicsJ1YnKSwgSVNBUE5QX0RFVklDRSgweDAwMDEpLAorCQlJU0FQTlBfVkVORE9SKCdHJywnUicsJ1YnKSwgSVNBUE5QX0ZVTkNUSU9OKDB4MDAwMCksIDAgfSwKKwl7MH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUoaXNhcG5wLCBpZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcG5wX2RldiAqYWN0aXZhdGVfZGV2KGNoYXIgKmRldm5hbWUsIGNoYXIgKnJlc25hbWUsIHN0cnVjdCBwbnBfZGV2ICpkZXYpCit7CisJaW50IGVycjsKKworCWVyciA9IHBucF9kZXZpY2VfYXR0YWNoKGRldik7CisJaWYgKGVyciA8IDApCisJCXJldHVybihOVUxMKTsKKworCWlmKChlcnIgPSBwbnBfYWN0aXZhdGVfZGV2KGRldikpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImFkMTg0ODogJXMgJXMgY29uZmlnIGZhaWxlZCAob3V0IG9mIHJlc291cmNlcz8pWyVkXVxuIiwgZGV2bmFtZSwgcmVzbmFtZSwgZXJyKTsKKworCQlwbnBfZGV2aWNlX2RldGFjaChkZXYpOworCisJCXJldHVybihOVUxMKTsKKwl9CisJYXVkaW9fYWN0aXZhdGVkID0gMTsKKwlyZXR1cm4oZGV2KTsKK30KKworc3RhdGljIHN0cnVjdCBwbnBfZGV2ICphZDE4NDhfaW5pdF9nZW5lcmljKHN0cnVjdCBwbnBfY2FyZCAqYnVzLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIGludCBzbG90KQoreworCisJLyogQ29uZmlndXJlIEF1ZGlvIGRldmljZSAqLworCWlmKChhZDE4NDhfZGV2ID0gcG5wX2ZpbmRfZGV2KGJ1cywgYWQxODQ4X2lzYXBucF9saXN0W3Nsb3RdLnZlbmRvciwgYWQxODQ4X2lzYXBucF9saXN0W3Nsb3RdLmZ1bmN0aW9uLCBOVUxMKSkpCisJeworCQlpZigoYWQxODQ4X2RldiA9IGFjdGl2YXRlX2RldihhZDE4NDhfaXNhcG5wX2xpc3Rbc2xvdF0ubmFtZSwgImFkMTg0OCIsIGFkMTg0OF9kZXYpKSkKKwkJeworCQkJaHdfY29uZmlnLT5pb19iYXNlIAk9IHBucF9wb3J0X3N0YXJ0KGFkMTg0OF9kZXYsIGFkMTg0OF9pc2FwbnBfbGlzdFtzbG90XS5tc3NfaW8pOworCQkJaHdfY29uZmlnLT5pcnEgCQk9IHBucF9pcnEoYWQxODQ4X2RldiwgYWQxODQ4X2lzYXBucF9saXN0W3Nsb3RdLmlycSk7CisJCQlod19jb25maWctPmRtYSAJCT0gcG5wX2RtYShhZDE4NDhfZGV2LCBhZDE4NDhfaXNhcG5wX2xpc3Rbc2xvdF0uZG1hKTsKKwkJCWlmKGFkMTg0OF9pc2FwbnBfbGlzdFtzbG90XS5kbWEyICE9IC0xKQorCQkJCWh3X2NvbmZpZy0+ZG1hMiA9IHBucF9kbWEoYWQxODQ4X2RldiwgYWQxODQ4X2lzYXBucF9saXN0W3Nsb3RdLmRtYTIpOworCQkJZWxzZQorCQkJCWh3X2NvbmZpZy0+ZG1hMiA9IC0xOworICAgICAgICAgICAgICAgICAgICAgICAgaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUgPSBhZDE4NDhfaXNhcG5wX2xpc3Rbc2xvdF0udHlwZTsKKwkJfSBlbHNlCisJCQlyZXR1cm4oTlVMTCk7CisJfSBlbHNlCisJCXJldHVybihOVUxMKTsKKworCXJldHVybihhZDE4NDhfZGV2KTsKK30KKworc3RhdGljIGludCBfX2luaXQgYWQxODQ4X2lzYXBucF9pbml0KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IHBucF9jYXJkICpidXMsIGludCBzbG90KQoreworCWNoYXIgKmJ1c25hbWUgPSBidXMtPm5hbWVbMF0gPyBidXMtPm5hbWUgOiBhZDE4NDhfaXNhcG5wX2xpc3Rbc2xvdF0ubmFtZTsKKworCS8qIEluaXRpYWxpemUgdGhpcyBiYWJ5LiAqLworCisJaWYoYWQxODQ4X2luaXRfZ2VuZXJpYyhidXMsIGh3X2NvbmZpZywgc2xvdCkpIHsKKwkJLyogV2UgZ290IGl0LiAqLworCisJCXByaW50ayhLRVJOX05PVElDRSAiYWQxODQ4OiBQblAgcmVwb3J0cyAnJXMnIGF0IGkvbyAlI3gsIGlycSAlZCwgZG1hICVkLCAlZFxuIiwKKwkJICAgICAgIGJ1c25hbWUsCisJCSAgICAgICBod19jb25maWctPmlvX2Jhc2UsIGh3X2NvbmZpZy0+aXJxLCBod19jb25maWctPmRtYSwKKwkJICAgICAgIGh3X2NvbmZpZy0+ZG1hMik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgYWQxODQ4X2lzYXBucF9wcm9iZShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJc3RhdGljIGludCBmaXJzdCA9IDE7CisJaW50IGk7CisKKwkvKiBDb3VudCBlbnRyaWVzIGluIHNiX2lzYXBucF9saXN0ICovCisJZm9yIChpID0gMDsgYWQxODQ4X2lzYXBucF9saXN0W2ldLmNhcmRfdmVuZG9yICE9IDA7IGkrKyk7CisJaS0tOworCisJLyogQ2hlY2sgYW5kIGFkanVzdCBpc2FwbnBqdW1wICovCisJaWYoIGlzYXBucGp1bXAgPCAwIHx8IGlzYXBucGp1bXAgPiBpKSB7CisJCWlzYXBucGp1bXAgPSByZXZlcnNlID8gaSA6IDA7CisJCXByaW50ayhLRVJOX0VSUiAiYWQxODQ4OiBWYWxpZCByYW5nZSBmb3IgaXNhcG5wanVtcCBpcyAwLSVkLiBBZGp1c3RlZCB0byAlZC5cbiIsIGksIGlzYXBucGp1bXApOworCX0KKworCWlmKCFmaXJzdCB8fCAhcmV2ZXJzZSkKKwkJaSA9IGlzYXBucGp1bXA7CisJZmlyc3QgPSAwOworCXdoaWxlKGFkMTg0OF9pc2FwbnBfbGlzdFtpXS5jYXJkX3ZlbmRvciAhPSAwKSB7CisJCXN0YXRpYyBzdHJ1Y3QgcG5wX2NhcmQgKmJ1cyA9IE5VTEw7CisKKwkJd2hpbGUgKChidXMgPSBwbnBfZmluZF9jYXJkKAorCQkJCWFkMTg0OF9pc2FwbnBfbGlzdFtpXS5jYXJkX3ZlbmRvciwKKwkJCQlhZDE4NDhfaXNhcG5wX2xpc3RbaV0uY2FyZF9kZXZpY2UsCisJCQkJYnVzKSkpIHsKKworCQkJaWYoYWQxODQ4X2lzYXBucF9pbml0KGh3X2NvbmZpZywgYnVzLCBpKSkgeworCQkJCWlzYXBucGp1bXAgPSBpOyAvKiBzdGFydCBuZXh0IHNlYXJjaCBmcm9tIGhlcmUgKi8KKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlpICs9IHJldmVyc2UgPyAtMSA6IDE7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7Cit9CisjZW5kaWYKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2FkMTg0OCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImFkMTg0OC9jczQyNDggY29kZWMgZHJpdmVyIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTZcbiIpOworCisjaWZkZWYgQ09ORklHX1BOUAorCWlmKGlzYXBucCAmJiAoYWQxODQ4X2lzYXBucF9wcm9iZSgmY2ZnKSA8IDApICkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgImFkMTg0ODogTm8gSVNBUG5QIGNhcmRzIGZvdW5kLCB0cnlpbmcgc3RhbmRhcmQgb25lcy4uLlxuIik7CisJCWlzYXBucCA9IDA7CisJfQorI2VuZGlmCisKKwlpZihpbyAhPSAtMSkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCSAgICAgICAgaWYoIGlzYXBucCA9PSAwICkKKwkgICAgICAgIHsKKwkJCWlmKGlycSA9PSAtMSB8fCBkbWEgPT0gLTEpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhZDE4NDg6IG11c3QgZ2l2ZSBJL08gLCBJUlEgYW5kIERNQS5cbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQljZmcuaXJxID0gaXJxOworCQkJY2ZnLmlvX2Jhc2UgPSBpbzsKKwkJCWNmZy5kbWEgPSBkbWE7CisJCQljZmcuZG1hMiA9IGRtYTI7CisJCQljZmcuY2FyZF9zdWJ0eXBlID0gdHlwZTsKKwkgICAgICAgIH0KKworCQlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGlvICsgNCwgNCwgImFkMTg0OCIpOworCisJCWlmICghcG9ydHMpCisJCQlyZXR1cm4gLUVCVVNZOworCisJCWlmICghcmVxdWVzdF9yZWdpb24oaW8sIDQsICJXU1MgY29uZmlnIikpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGlvICsgNCwgNCk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJaWYgKCFwcm9iZV9tc19zb3VuZCgmY2ZnLCBwb3J0cykpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGlvICsgNCwgNCk7CisJCQlyZWxlYXNlX3JlZ2lvbihpbywgNCk7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCQlhdHRhY2hfbXNfc291bmQoJmNmZywgcG9ydHMsIFRISVNfTU9EVUxFKTsKKwkJbG9hZGVkID0gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2FkMTg0OCh2b2lkKQoreworCWlmKGxvYWRlZCkKKwkJdW5sb2FkX21zX3NvdW5kKCZjZmcpOworCisjaWZkZWYgQ09ORklHX1BOUAorCWlmKGFkMTg0OF9kZXYpeworCQlpZihhdWRpb19hY3RpdmF0ZWQpCisJCQlwbnBfZGV2aWNlX2RldGFjaChhZDE4NDhfZGV2KTsKKwl9CisjZW5kaWYKK30KKworbW9kdWxlX2luaXQoaW5pdF9hZDE4NDgpOworbW9kdWxlX2V4aXQoY2xlYW51cF9hZDE4NDgpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfYWQxODQ4KGNoYXIgKnN0cikKK3sKKyAgICAgICAgLyogaW8sIGlycSwgZG1hLCBkbWEyLCB0eXBlICovCisJaW50IGludHNbNl07CisJCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCWlvCT0gaW50c1sxXTsKKwlpcnEJPSBpbnRzWzJdOworCWRtYQk9IGludHNbM107CisJZG1hMgk9IGludHNbNF07CisJdHlwZQk9IGludHNbNV07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYWQxODQ4PSIsIHNldHVwX2FkMTg0OCk7CQorI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODQ4LmggYi9zb3VuZC9vc3MvYWQxODQ4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1NzNiMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hZDE4NDguaApAQCAtMCwwICsxLDI1IEBACisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2RlZmluZSBBRF9GX0NTNDIzMSAgICAgMHgwMDAxICAvKiBSZXR1cm5lZCBpZiBhIENTNDIzMiAob3IgY29tcGF0aWJsZSkgZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgQURfRl9DUzQyNDggICAgIDB4MDAwMSAgLyogUmV0dXJuZWQgaWYgYSBDUzQyNDggKG9yIGNvbXBhdGlibGUpIGRldGVjdGVkICovCisKKyNkZWZpbmUgICAgICAgICBBRDE4NDhfU0VUX1hUQUwgICAgICAgICAxCisjZGVmaW5lICAgICAgICAgQUQxODQ4X01JWEVSX1JFUk9VVEUgICAgMgorCisjZGVmaW5lIEFEMTg0OF9SRVJPVVRFKG9sZGN0bCwgbmV3Y3RsKSBcCisgICAgICAgICAgICAgICAgYWQxODQ4X2NvbnRyb2woQUQxODQ4X01JWEVSX1JFUk9VVEUsICgob2xkY3RsKTw8OCl8KG5ld2N0bCkpCisJCQorCitpbnQgYWQxODQ4X2luaXQoY2hhciAqbmFtZSwgc3RydWN0IHJlc291cmNlICpwb3J0cywgaW50IGlycSwgaW50IGRtYV9wbGF5YmFjaywKKwlpbnQgZG1hX2NhcHR1cmUsIGludCBzaGFyZV9kbWEsIGludCAqb3NwLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7Cit2b2lkIGFkMTg0OF91bmxvYWQgKGludCBpb19iYXNlLCBpbnQgaXJxLCBpbnQgZG1hX3BsYXliYWNrLCBpbnQgZG1hX2NhcHR1cmUsIGludCBzaGFyZV9kbWEpOworCitpbnQgYWQxODQ4X2RldGVjdCAoc3RydWN0IHJlc291cmNlICpwb3J0cywgaW50ICpmbGFncywgaW50ICpvc3ApOworaW50IGFkMTg0OF9jb250cm9sKGludCBjbWQsIGludCBhcmcpOworCitpcnFyZXR1cm5fdCBhZGludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqIGR1bW15KTsKK3ZvaWQgYXR0YWNoX21zX3NvdW5kKHN0cnVjdCBhZGRyZXNzX2luZm8gKiBod19jb25maWcsIHN0cnVjdCByZXNvdXJjZSAqcG9ydHMsIHN0cnVjdCBtb2R1bGUgKiBvd25lcik7CisKK2ludCBwcm9iZV9tc19zb3VuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCByZXNvdXJjZSAqcG9ydHMpOwordm9pZCB1bmxvYWRfbXNfc291bmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfaW5mbyk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYWQxODQ4X21peGVyLmggYi9zb3VuZC9vc3MvYWQxODQ4X21peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyMzFjNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hZDE4NDhfbWl4ZXIuaApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIHNvdW5kL2FkMTg0OF9taXhlci5oCisgKgorICogRGVmaW5pdGlvbnMgZm9yIHRoZSBtaXhlciBvZiBBRDE4NDggYW5kIGNvbXBhdGlibGUgY29kZWNzLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqLworCisKKy8qCisgKiBUaGUgQUQxODQ4IGNvZGVjIGhhcyBnZW5lcmljIGlucHV0IGxpbmVzIGNhbGxlZCBMaW5lLCBBdXgxIGFuZCBBdXgyLgorICogU291bmQgY2FyZCBtYW51ZmFjdHVyZXJzIGhhdmUgY29ubmVjdGVkIGFjdHVhbCBpbnB1dHMgKENELCBzeW50aCwgbGluZSwKKyAqIGV0YykgdG8gdGhlc2UgaW5wdXRzIGluIGRpZmZlcmVudCBvcmRlci4gVGhlcmVmb3JlIGl0J3MgZGlmZmljdWx0CisgKiB0byBhc3NpZ24gbWl4ZXIgY2hhbm5lbHMgdG8gdGhlc2UgaW5wdXRzIGNvcnJlY3RseS4gVGhlIGZvbGxvd2luZworICogY29udGFpbnMgdHdvIGFsdGVybmF0aXZlIG1hcHBpbmdzLiBUaGUgZmlyc3Qgb25lIGlzIGZvciBHVVMgTUFYIGFuZAorICogdGhlIHNlY29uZCBpcyBqdXN0IGEgZ2VuZXJpYyBvbmUgKGxpbmUxLCBsaW5lMiBhbmQgbGluZTMpLgorICogKEFjdHVhbGx5IHRoaXMgaXMgbm90IGEgbWFwcGluZyBidXQgcmF0aGVyIHNvbWUga2luZCBvZiBpbnRlcmxlYXZpbmcKKyAqIHNvbHV0aW9uKS4KKyAqLworI2RlZmluZSBNT0RFMV9SRUNfREVWSUNFUwkJKFNPVU5EX01BU0tfTElORTMgfCBTT1VORF9NQVNLX01JQyB8IFwKKwkJCQkJIFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX0lNSVgpCisKKyNkZWZpbmUgU1BST19SRUNfREVWSUNFUwkJKFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgXAorCQkJCQkgU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfTElORTEpCisKKyNkZWZpbmUgTU9ERTFfTUlYRVJfREVWSUNFUwkJKFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX01JQyB8IFwKKwkJCQkJIFNPVU5EX01BU0tfTElORTIgfCBcCisJCQkJCSBTT1VORF9NQVNLX0lHQUlOIHwgXAorCQkJCQkgU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0lNSVgpCisKKyNkZWZpbmUgTU9ERTJfTUlYRVJfREVWSUNFUwkJKFNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX0xJTkUyIHwgXAorCQkJCQkgU09VTkRfTUFTS19NSUMgfCBcCisJCQkJCSBTT1VORF9NQVNLX0xJTkUzIHwgU09VTkRfTUFTS19TUEVBS0VSIHwgXAorCQkJCQkgU09VTkRfTUFTS19JR0FJTiB8IFwKKwkJCQkJIFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19JTUlYKQorCisjZGVmaW5lIE1PREUzX01JWEVSX0RFVklDRVMJCShNT0RFMl9NSVhFUl9ERVZJQ0VTIHwgU09VTkRfTUFTS19WT0xVTUUpCisKKy8qIE9QVGkgODJDOTMwIGhhcyBubyBJTUlYIGxldmVsIGNvbnRyb2wsIGJ1dCBpdCBjYW4gc3RpbGwgYmUgc2VsZWN0ZWQgYXMgYW4KKyAqIGlucHV0CisgKi8KKyNkZWZpbmUgQzkzMF9NSVhFUl9ERVZJQ0VTCShTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19MSU5FMiB8IFwKKwkJCQkgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX1ZPTFVNRSB8IFwKKwkJCQkgU09VTkRfTUFTS19MSU5FMyB8IFwKKwkJCQkgU09VTkRfTUFTS19JR0FJTiB8IFNPVU5EX01BU0tfUENNKQorCisjZGVmaW5lIFNQUk9fTUlYRVJfREVWSUNFUwkoU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX1BDTSB8IFwKKwkJCQkgU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19TWU5USCB8IFwKKwkJCQkgU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfTUlDIHwgXAorCQkJCSBTT1VORF9NQVNLX1NQRUFLRVIgfCBTT1VORF9NQVNLX0xJTkUxIHwgXAorCQkJCSBTT1VORF9NQVNLX09HQUlOKQorCitzdHJ1Y3QgbWl4ZXJfZGVmIHsKKwl1bnNpZ25lZCBpbnQgcmVnbm86NjsJCS8qIHJlZ2lzdGVyIG51bWJlciBmb3Igdm9sdW1lICovCisJdW5zaWduZWQgaW50IHBvbGFyaXR5OjE7CS8qIHZvbHVtZSBwb2xhcml0eTogMD1ub3JtYWwsIDE9cmV2ZXJzZWQgKi8KKwl1bnNpZ25lZCBpbnQgYml0cG9zOjM7CQkvKiBwb3NpdGlvbiBvZiBiaXRzIGluIHJlZ2lzdGVyIGZvciB2b2x1bWUgKi8KKwl1bnNpZ25lZCBpbnQgbmJpdHM6MzsJCS8qIG51bWJlciBvZiBiaXRzIGluIHJlZ2lzdGVyIGZvciB2b2x1bWUgKi8KKwl1bnNpZ25lZCBpbnQgbXV0ZXJlZzo2OwkJLyogcmVnaXN0ZXIgbnVtYmVyIGZvciBtdXRlIGJpdCAqLworCXVuc2lnbmVkIGludCBtdXRlcG9sOjE7CQkvKiBtdXRlIHBvbGFyaXR5OiAwPW5vcm1hbCwgMT1yZXZlcnNlZCAqLworCXVuc2lnbmVkIGludCBtdXRlcG9zOjQ7CQkvKiBwb3NpdGlvbiBvZiBtdXRlIGJpdCBpbiByZWdpc3RlciAqLworCXVuc2lnbmVkIGludCByZWNyZWc6NjsJCS8qIHJlZ2lzdGVyIG51bWJlciBmb3IgcmVjb3JkaW5nIGJpdCAqLworCXVuc2lnbmVkIGludCByZWNwb2w6MTsJCS8qIHJlY29yZGluZyBwb2xhcml0eTogMD1ub3JtYWwsIDE9cmV2ZXJzZWQgKi8KKwl1bnNpZ25lZCBpbnQgcmVjcG9zOjQ7CQkvKiBwb3NpdGlvbiBvZiByZWNvcmRpbmcgYml0IGluIHJlZ2lzdGVyICovCit9OworCitzdGF0aWMgY2hhciBtaXhfY3Z0WzEwMV0gPSB7CisJIDAsIDAsIDMsIDcsMTAsMTMsMTYsMTksMjEsMjMsMjYsMjgsMzAsMzIsMzQsMzUsMzcsMzksNDAsNDIsCisJNDMsNDUsNDYsNDcsNDksNTAsNTEsNTIsNTMsNTUsNTYsNTcsNTgsNTksNjAsNjEsNjIsNjMsNjQsNjUsCisJNjUsNjYsNjcsNjgsNjksNzAsNzAsNzEsNzIsNzMsNzMsNzQsNzUsNzUsNzYsNzcsNzcsNzgsNzksNzksCisJODAsODEsODEsODIsODIsODMsODQsODQsODUsODUsODYsODYsODcsODcsODgsODgsODksODksOTAsOTAsCisJOTEsOTEsOTIsOTIsOTMsOTMsOTQsOTQsOTUsOTUsOTYsOTYsOTYsOTcsOTcsOTgsOTgsOTgsOTksOTksCisJMTAwCit9OworCit0eXBlZGVmIHN0cnVjdCBtaXhlcl9kZWYgbWl4ZXJfZW50OwordHlwZWRlZiBtaXhlcl9lbnQgbWl4ZXJfZW50c1syXTsKKworLyoKKyAqIE1vc3Qgb2YgdGhlIG1peGVyIGVudHJpZXMgd29yayBpbiBiYWNrd2FyZHMuIFNldHRpbmcgdGhlIHBvbGFyaXR5IGZpZWxkCisgKiBtYWtlcyB0aGVtIHRvIHdvcmsgY29ycmVjdGx5LgorICoKKyAqIFRoZSBjaGFubmVsIG51bWJlcmluZyB1c2VkIGJ5IGluZGl2aWR1YWwgc291bmQgY2FyZHMgaXMgbm90IGZpeGVkLiBTb21lCisgKiBjYXJkcyBoYXZlIGFzc2lnbmVkIGRpZmZlcmVudCBtZWFuaW5ncyBmb3IgdGhlIEFVWDEsIEFVWDIgYW5kIExJTkUgaW5wdXRzLgorICogVGhlIGN1cnJlbnQgdmVyc2lvbiBkb2Vzbid0IHRyeSB0byBjb21wZW5zYXRlIHRoaXMuCisgKi8KKworI2RlZmluZSBNSVhfRU5UKG5hbWUsIHJlZ19sLCBwb2xhX2wsIHBvc19sLCBsZW5fbCwgcmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yLCBtdXRlX2JpdCkJXAorCVtuYW1lXSA9IHt7cmVnX2wsIHBvbGFfbCwgcG9zX2wsIGxlbl9sLCByZWdfbCwgMCwgbXV0ZV9iaXQsIDAsIDAsIDh9LAkJCVwKKwkJICB7cmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yLCByZWdfciwgMCwgbXV0ZV9iaXQsIDAsIDAsIDh9fQorCisjZGVmaW5lIE1JWF9FTlQyKG5hbWUsIHJlZ19sLCBwb2xhX2wsIHBvc19sLCBsZW5fbCwgbXV0ZV9yZWdfbCwgbXV0ZV9wb2xhX2wsIG11dGVfcG9zX2wsIFwKKwkJICAgIHJlY19yZWdfbCwgcmVjX3BvbGFfbCwgcmVjX3Bvc19sLAkJCQkJIFwKKwkJIHJlZ19yLCBwb2xhX3IsIHBvc19yLCBsZW5fciwgbXV0ZV9yZWdfciwgbXV0ZV9wb2xhX3IsIG11dGVfcG9zX3IsCSBcCisJCSAgICByZWNfcmVnX3IsIHJlY19wb2xhX3IsIHJlY19wb3NfcikJCQkJCSBcCisJW25hbWVdID0ge3tyZWdfbCwgcG9sYV9sLCBwb3NfbCwgbGVuX2wsIG11dGVfcmVnX2wsIG11dGVfcG9sYV9sLCBtdXRlX3Bvc19sLAkgXAorCQkgICAgcmVjX3JlZ19sLCByZWNfcG9sYV9sLCByZWNfcG9zX2x9LAkJCQkJIFwKKwkJICB7cmVnX3IsIHBvbGFfciwgcG9zX3IsIGxlbl9yLCBtdXRlX3JlZ19yLCBtdXRlX3BvbGFfciwgbXV0ZV9wb3NfciwJIFwKKwkJICAgIHJlY19yZWdfciwgcmVjX3BvbGFfciwgcmVjX3Bvc19yfX0KKworc3RhdGljIG1peGVyX2VudHMgYWQxODQ4X21peF9kZXZpY2VzWzMyXSA9IHsKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1ZPTFVNRSwJMjcsIDEsIDAsIDQsCTI5LCAxLCAwLCA0LCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1RSRUJMRSwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9TWU5USCwJIDQsIDEsIDAsIDUsCSA1LCAxLCAwLCA1LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCSA2LCAxLCAwLCA2LAkgNywgMSwgMCwgNiwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfU1BFQUtFUiwJMjYsIDEsIDAsIDQsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FLAkxOCwgMSwgMCwgNSwJMTksIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX01JQywJIDAsIDAsIDUsIDEsCSAxLCAwLCA1LCAxLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9DRCwJCSAyLCAxLCAwLCA1LAkgMywgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJMTMsIDEsIDIsIDYsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9BTFRQQ00sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfUkVDTEVWLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkgMCwgMCwgMCwgNCwJIDEsIDAsIDAsIDQsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX09HQUlOLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUxLAkgMiwgMSwgMCwgNSwJIDMsIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUyLAkgNCwgMSwgMCwgNSwJIDUsIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUzLAkxOCwgMSwgMCwgNSwJMTksIDEsIDAsIDUsICA3KQorfTsKKworc3RhdGljIG1peGVyX2VudHMgaXdhdmVfbWl4X2RldmljZXNbMzJdID0geworCU1JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkyNSwgMSwgMCwgNSwJMjcsIDEsIDAsIDUsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkgNCwgMSwgMCwgNSwJIDUsIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJIDYsIDEsIDAsIDYsCSA3LCAxLCAwLCA2LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkyNiwgMSwgMCwgNCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTE4LCAxLCAwLCA1LAkxOSwgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkgMCwgMCwgNSwgMSwJIDEsIDAsIDUsIDEsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJIDIsIDEsIDAsIDUsCSAzLCAxLCAwLCA1LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9JTUlYLAkxNiwgMSwgMCwgNSwJMTcsIDEsIDAsIDUsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCSAwLCAwLCAwLCA0LAkgMSwgMCwgMCwgNCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsCSAyLCAxLCAwLCA1LAkgMywgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTIsCSA0LCAxLCAwLCA1LAkgNSwgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsCTE4LCAxLCAwLCA1LAkxOSwgMSwgMCwgNSwgIDcpCit9OworCitzdGF0aWMgbWl4ZXJfZW50cyBjczQyeGJfbWl4X2RldmljZXNbMzJdID0geworCS8qIERpZ2l0YWwgbWFzdGVyIHZvbHVtZSBhY3R1YWxseSBoYXMgc2V2ZW4gYml0cywgYnV0IHdlIG9ubHkgdXNlCisJICAgc2l4IHRvIGF2b2lkIHRoZSBkaXNjb250aW51aXR5IHdoZW4gdGhlIGFuYWxvZyBnYWluIGtpY2tzIGluLiAqLworCU1JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAk0NiwgMSwgMCwgNiwJNDcsIDEsIDAsIDYsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkgNCwgMSwgMCwgNSwJIDUsIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJIDYsIDEsIDAsIDYsCSA3LCAxLCAwLCA2LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkyNiwgMSwgMCwgNCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTE4LCAxLCAwLCA1LAkxOSwgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkzNCwgMSwgMCwgNSwJMzUsIDEsIDAsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJIDIsIDEsIDAsIDUsCSAzLCAxLCAwLCA1LCAgNyksCisJLyogRm9yIHRoZSBJTUlYIGVudHJ5LCBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIHVzZSB0aGUgTUlYX0VOVCBtYWNybworCSAgIGJlY2F1c2UgdGhlIG11dGUgYml0IGlzIGluIGRpZmZlcmVudCBwb3NpdGlvbnMgZm9yIHRoZSB0d28KKwkgICBjaGFubmVscyBhbmQgcmVxdWlyZXMgcmV2ZXJzZSBwb2xhcml0eS4gKi8KKwlbU09VTkRfTUlYRVJfSU1JWF0gPSB7ezEzLCAxLCAyLCA2LCAxMywgMSwgMCwgMCwgMCwgOH0sCisJCSAgICAgIHs0MiwgMSwgMCwgNiwgNDIsIDEsIDcsIDAsIDAsIDh9fSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCSAwLCAwLCAwLCA0LAkgMSwgMCwgMCwgNCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsCSAyLCAxLCAwLCA1LAkgMywgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTIsCSA0LCAxLCAwLCA1LAkgNSwgMSwgMCwgNSwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsCTM4LCAxLCAwLCA2LAkzOSwgMSwgMCwgNiwgIDcpCit9OworCisvKiBPUFRpIDgyQzkzMCBoYXMgc29tZXdoYXQgZGlmZmVyZW50IHBvcnQgYWRkcmVzc2VzLgorICogTm90ZTogVk9MVU1FID09IFNQRUFLRVIsIFNZTlRIID09IExJTkUyLCBMSU5FID09IExJTkUzLCBDRCA9PSBMSU5FMQorICogVk9MVU1FLCBTWU5USCwgTElORSwgQ0QgYXJlIG5vdCBlbmFibGVkIGFib3ZlLgorICogTUlDIGlzIGxldmVsIG9mIG1pYyBtb25pdG9yaW5nIGRpcmVjdCB0byBvdXRwdXQuIFNhbWUgZm9yIENELCBMSU5FLCBldGMuCisgKi8KK3N0YXRpYyBtaXhlcl9lbnRzIGM5MzBfbWl4X2RldmljZXNbMzJdID0geworCU1JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkyMiwgMSwgMSwgNSwJMjMsIDEsIDEsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkgNCwgMSwgMSwgNCwJIDUsIDEsIDEsIDQsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJIDYsIDEsIDAsIDUsCSA3LCAxLCAwLCA1LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkyMiwgMSwgMSwgNSwJMjMsIDEsIDEsIDUsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCTE4LCAxLCAxLCA0LAkxOSwgMSwgMSwgNCwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkyMCwgMSwgMSwgNCwJMjEsIDEsIDEsIDQsICA3KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJIDIsIDEsIDEsIDQsCSAzLCAxLCAxLCA0LCAgNyksCisJTUlYX0VOVChTT1VORF9NSVhFUl9JTUlYLAkgMCwgMCwgMCwgMCwJIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJIDAsIDAsIDAsIDAsCSAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCSAwLCAwLCAwLCA0LAkgMSwgMCwgMCwgNCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCSAwLCAwLCAwLCAwLAkgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsCSAyLCAxLCAxLCA0LAkgMywgMSwgMSwgNCwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTIsCSA0LCAxLCAxLCA0LAkgNSwgMSwgMSwgNCwgIDcpLAorCU1JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsCTE4LCAxLCAxLCA0LAkxOSwgMSwgMSwgNCwgIDcpCit9OworCitzdGF0aWMgbWl4ZXJfZW50cyBzcHJvX21peF9kZXZpY2VzWzMyXSA9IHsKKwlNSVhfRU5UIChTT1VORF9NSVhFUl9WT0xVTUUsCTE5LCAwLCA0LCA0LAkJCSAxOSwgMCwgMCwgNCwgIDgpLAorCU1JWF9FTlQgKFNPVU5EX01JWEVSX0JBU1MsCSAwLCAwLCAwLCAwLAkJCSAgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQgKFNPVU5EX01JWEVSX1RSRUJMRSwJIDAsIDAsIDAsIDAsCQkJICAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVDIoU09VTkRfTUlYRVJfU1lOVEgsCSA0LCAxLCAxLCA0LCAyMywgMCwgMywgIDAsIDAsIDgsCisJCSAJCQkgNSwgMSwgMSwgNCwgMjMsIDAsIDMsIDAsIDAsIDgpLAorCU1JWF9FTlQgKFNPVU5EX01JWEVSX1BDTSwJIDYsIDEsIDEsIDQsCQkJICA3LCAxLCAxLCA0LCAgOCksCisJTUlYX0VOVCAoU09VTkRfTUlYRVJfU1BFQUtFUiwJMTgsIDAsIDMsIDIsCQkJICAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVDIoU09VTkRfTUlYRVJfTElORSwJMjAsIDAsIDQsIDQsIDE3LCAxLCA0LCAxNiwgMCwgMiwKKwkJIAkJCTIwLCAwLCAwLCA0LCAxNywgMSwgMywgMTYsIDAsIDEpLAorCU1JWF9FTlQyKFNPVU5EX01JWEVSX01JQywJMTgsIDAsIDAsIDMsIDE3LCAxLCAwLCAxNiwgMCwgMCwKKwkJIAkJCSAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgIDAsIDAsIDApLAorCU1JWF9FTlQyKFNPVU5EX01JWEVSX0NELAkyMSwgMCwgNCwgNCwgMTcsIDEsIDIsIDE2LCAwLCA0LAorCQkJCQkyMSwgMCwgMCwgNCwgMTcsIDEsIDEsIDE2LCAwLCAzKSwKKwlNSVhfRU5UIChTT1VORF9NSVhFUl9JTUlYLAkgMCwgMCwgMCwgMCwJCQkgIDAsIDAsIDAsIDAsICA4KSwKKwlNSVhfRU5UIChTT1VORF9NSVhFUl9BTFRQQ00sCSAwLCAwLCAwLCAwLAkJCSAgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQgKFNPVU5EX01JWEVSX1JFQ0xFViwJIDAsIDAsIDAsIDAsCQkJICAwLCAwLCAwLCAwLCAgOCksCisJTUlYX0VOVCAoU09VTkRfTUlYRVJfSUdBSU4sCSAwLCAwLCAwLCAwLAkJCSAgMCwgMCwgMCwgMCwgIDgpLAorCU1JWF9FTlQgKFNPVU5EX01JWEVSX09HQUlOLAkxNywgMSwgNiwgMSwJCQkgIDAsIDAsIDAsIDAsICA4KSwKKwkvKiBUaGlzIGlzIGV4dGVybmFsIHdhdmV0YWJsZSAqLworCU1JWF9FTlQyKFNPVU5EX01JWEVSX0xJTkUxLAkyMiwgMCwgNCwgNCwgMjMsIDEsIDEsIDIzLCAwLCA0LAorCQkgCQkJMjIsIDAsIDAsIDQsIDIzLCAxLCAwLCAyMywgMCwgNSksCit9OworCitzdGF0aWMgaW50IGRlZmF1bHRfbWl4ZXJfbGV2ZWxzWzMyXSA9Cit7CisJMHgzMjMyLAkJCS8qIE1hc3RlciBWb2x1bWUgKi8KKwkweDMyMzIsCQkJLyogQmFzcyAqLworCTB4MzIzMiwJCQkvKiBUcmVibGUgKi8KKwkweDRiNGIsCQkJLyogRk0gKi8KKwkweDMyMzIsCQkJLyogUENNICovCisJMHgxNTE1LAkJCS8qIFBDIFNwZWFrZXIgKi8KKwkweDIwMjAsCQkJLyogRXh0IExpbmUgKi8KKwkweDEwMTAsCQkJLyogTWljICovCisJMHg0YjRiLAkJCS8qIENEICovCisJMHgwMDAwLAkJCS8qIFJlY29yZGluZyBtb25pdG9yICovCisJMHg0YjRiLAkJCS8qIFNlY29uZCBQQ00gKi8KKwkweDRiNGIsCQkJLyogUmVjb3JkaW5nIGxldmVsICovCisJMHg0YjRiLAkJCS8qIElucHV0IGdhaW4gKi8KKwkweDRiNGIsCQkJLyogT3V0cHV0IGdhaW4gKi8KKwkweDIwMjAsCQkJLyogTGluZTEgKi8KKwkweDIwMjAsCQkJLyogTGluZTIgKi8KKwkweDE1MTUJCQkvKiBMaW5lMyAodXN1YWxseSBsaW5lIGluKSovCit9OworCisjZGVmaW5lIExFRlRfQ0hOCTAKKyNkZWZpbmUgUklHSFRfQ0hOCTEKKworLyoKKyAqIENoYW5uZWwgZW5hYmxlIGJpdHMgZm9yIGlvY3RsKFNPVU5EX01JWEVSX1BSSVZBVEUxKQorICovCisKKyNpZm5kZWYgQVVESU9fU1BFQUtFUgorI2RlZmluZQlBVURJT19TUEVBS0VSCQkweDAxCS8qIEVuYWJsZSBtb25vIG91dHB1dCAqLworI2RlZmluZQlBVURJT19IRUFEUEhPTkUJCTB4MDIJLyogU3BhcmMgb25seSAqLworI2RlZmluZQlBVURJT19MSU5FX09VVAkJMHgwNAkvKiBTcGFyYyBvbmx5ICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZDE4ODkuYyBiL3NvdW5kL29zcy9hZDE4ODkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY3YzYyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2FkMTg4OS5jCkBAIC0wLDAgKzEsMTEwMyBAQAorLyoKKyAqICBDb3B5cmlnaHQgMjAwMS0yMDA0IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICoKKyAqICBBbmFsb2cgRGV2aWNlcyAxODg5IFBDSSBhdWRpbyBkcml2ZXIgKEFEMTgxOSBBQzk3LWNvbXBhdGlibGUgY29kZWMpCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICAgTm90ZXM6CisgKiAgIDEuIE9ubHkgZmxhdCBETUEgaXMgc3VwcG9ydGVkOyBzLWcgaXMgbm90IHN1cHBvcnRlZCByaWdodCBub3cKKyAqCisgKgorPGpzbT4gdGF1c3E6IEFueXdheSwgdG8gc2V0IHVwIHNhbXBsZSByYXRlcyBmb3IgRCB0byBBLCB5b3UganVzdCB1c2UgdGhlIHNhbXBsZSByYXRlIG9uIHRoZSBjb2RlYy4gRm9yIEEgdG8gRCwgeW91IG5lZWQgdG8gc2V0IHRoZSBjb2RlYyBhbHdheXMgdG8gNDhLICh1c2luZyB0aGUgc3BsaXQgc2FtcGxlIHJhdGUgZmVhdHVyZSBvbiB0aGUgY29kZWMpIGFuZCB0aGVuIHNldCB0aGUgcmVzYW1wbGVyIG9uIHRoZSBBRDE4ODkgdG8gdGhlIHNhbXBsZSByYXRlIHlvdSB3YW50LgorPGpzbT4gQWxzbywgd2hlbiBjaGFuZ2luZyB0aGUgc2FtcGxlIHJhdGUgb24gdGhlIGNvZGVjIHlvdSBuZWVkIHRvIHBvd2VyIGl0IGRvd24gYW5kIHJlIHBvd2VyIGl0IHVwIGZvciB0aGUgY2hhbmdlIHRvIHRha2UgZWZmZWN0IQorICoKKyAqICRJZDogYWQxODg5LmMsdiAxLjMgMjAwMi8xMC8xOSAyMTozMTo0NCBncnVuZGxlciBFeHAgJAorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJhZDE4ODkuaCIKKworI2RlZmluZSBEQkcoZm10LCBhcmcuLi4pIHByaW50ayhmbXQsICMjYXJnKQorI2RlZmluZSBERVZOQU1FICJhZDE4ODkiCisKKyNkZWZpbmUgTlJfSFdfQ0gJNAorI2RlZmluZSBEQUNfUlVOTklORwkxCisjZGVmaW5lIEFEQ19SVU5OSU5HCTIKKworI2RlZmluZSBVTkRFUlJVTihkZXYpCSgwKQorCisjZGVmaW5lIEFEMTg4OV9SRUFEVyhkZXYscmVnKSByZWFkdyhkZXYtPnJlZ2Jhc2UgKyByZWcpCisjZGVmaW5lIEFEMTg4OV9XUklURVcoZGV2LHJlZyx2YWwpIHdyaXRldygodmFsKSwgZGV2LT5yZWdiYXNlICsgcmVnKQorI2RlZmluZSBBRDE4ODlfUkVBREwoZGV2LHJlZykgcmVhZGwoZGV2LT5yZWdiYXNlICsgcmVnKQorI2RlZmluZSBBRDE4ODlfV1JJVEVMKGRldixyZWcsdmFsKSB3cml0ZWwoKHZhbCksIGRldi0+cmVnYmFzZSArIHJlZykKKworLy9ub3cgMTAwbXMKKy8qICNkZWZpbmUgV0FJVF8xME1TKCkJc2NoZWR1bGVfdGltZW91dChIWi8xMCkgKi8KKyNkZWZpbmUgV0FJVF8xME1TKCkJZG8geyBpbnQgX19pOyBmb3IgKF9faSA9IDA7IF9faSA8IDEwMDsgX19pKyspIHVkZWxheSgxMDAwKTsgfSB3aGlsZSgwKQorCisvKiBjdXJyZW50bHkgb25seSBzdXBwb3J0IGEgc2luZ2xlIGRldmljZSAqLworc3RhdGljIGFkMTg4OV9kZXZfdCAqYWQxODg5X2RldiA9IE5VTEw7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIGhlbHBlciByb3V0aW5lcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIGlubGluZSB2b2lkIGFkMTg4OV9zZXRfd2F2X3JhdGUoYWQxODg5X2Rldl90ICpkZXYsIGludCByYXRlKQoreworCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3X2NvZGVjID0gZGV2LT5hYzk3X2NvZGVjOworCisJREJHKCJTZXR0aW5nIFdBViByYXRlIHRvICVkXG4iLCByYXRlKTsKKwlkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV0uZG1hYnVmLnJhdGUgPSByYXRlOworCUFEMTg4OV9XUklURVcoZGV2LCBBRF9EU1dBUywgcmF0ZSk7CisKKwkvKiBDeWNsZSB0aGUgREFDIHRvIGVuYWJsZSB0aGUgbmV3IHJhdGUgKi8KKwlhYzk3X2NvZGVjLT5jb2RlY193cml0ZShkZXYtPmFjOTdfY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgMHgwMjAwKTsKKwlXQUlUXzEwTVMoKTsKKwlhYzk3X2NvZGVjLT5jb2RlY193cml0ZShkZXYtPmFjOTdfY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgMCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZDE4ODlfc2V0X3dhdl9mbXQoYWQxODg5X2Rldl90ICpkZXYsIGludCBmbXQpCit7CisJdTE2IHRtcDsKKworCURCRygiU2V0dGluZyBXQVYgZm9ybWF0IHRvIDB4JXhcbiIsIGZtdCk7CisKKwl0bXAgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNXU01DKTsKKwlpZiAoZm10ICYgQUZNVF9TMTZfTEUpIHsKKwkJLy90bXAgfD0gMHgwMTAwOyAvKiBzZXQgV0ExNiAqLworCQl0bXAgfD0gMHgwMzAwOyAvKiBzZXQgV0ExNiBzdGVyZW8gKi8KKwl9IGVsc2UgaWYgKGZtdCAmIEFGTVRfVTgpIHsKKwkJdG1wICY9IH4weDAxMDA7IC8qIGNsZWFyIFdBMTYgKi8KKwl9IAorCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNXU01DLCB0bXApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWQxODg5X3NldF9hZGNfZm10KGFkMTg4OV9kZXZfdCAqZGV2LCBpbnQgZm10KQoreworCXUxNiB0bXA7CisKKwlEQkcoIlNldHRpbmcgQURDIGZvcm1hdCB0byAweCV4XG4iLCBmbXQpOworCisJdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTUkFNQyk7CisJaWYgKGZtdCAmIEFGTVRfUzE2X0xFKSB7CisJCXRtcCB8PSAweDAxMDA7IC8qIHNldCBXQTE2ICovCisJfSBlbHNlIGlmIChmbXQgJiBBRk1UX1U4KSB7CisJCXRtcCAmPSB+MHgwMTAwOyAvKiBjbGVhciBXQTE2ICovCisJfSAKKwlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTUkFNQywgdG1wKTsKK30KKworc3RhdGljIHZvaWQgYWQxODg5X3N0YXJ0X3dhdihhZDE4ODlfc3RhdGVfdCAqc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlpbnQgY250OworCXUxNiB0bXA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkbWFidWYtPmRtYV9sZW4pCS8qIERNQSBhbHJlYWR5IGluIGZsaWdodCAqLworCQlnb3RvIHNraXBfZG1hOworCisJLyogc2V0dXAgZG1hICovCisJY250ID0gZG1hYnVmLT53cl9wdHIgLSBkbWFidWYtPnJkX3B0cjsKKwlpZiAoY250ID09IDApCQkvKiBkb25lIC0gZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyAqLworCQlnb3RvIHNraXBfZG1hOworCisJLyogSWYgdGhlIHdyX3B0ciBoYXMgd3JhcHBlZCwgb25seSBtYXAgdG8gdGhlIGVuZCAqLworCWlmIChjbnQgPCAwKQorCQljbnQgPSBETUFfU0laRSAtIGRtYWJ1Zi0+cmRfcHRyOworCisJZG1hYnVmLT5kbWFfaGFuZGxlID0gcGNpX21hcF9zaW5nbGUoYWQxODg5X2Rldi0+cGNpLAorCQkJCQlkbWFidWYtPnJhd2J1ZiArIGRtYWJ1Zi0+cmRfcHRyLAorCQkJCQljbnQsIFBDSV9ETUFfVE9ERVZJQ0UpOworCWRtYWJ1Zi0+ZG1hX2xlbiA9IGNudDsKKwlkbWFidWYtPnJlYWR5ID0gMTsKKworCURCRygiU3RhcnRpbmcgcGxheWJhY2sgYXQgMHglcCBmb3IgJWxkIGJ5dGVzXG4iLCBkbWFidWYtPnJhd2J1ZiArCisJICAgIGRtYWJ1Zi0+cmRfcHRyLCBkbWFidWYtPmRtYV9sZW4pOworCisgICAgICAgIC8qIGxvYWQgdXAgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgc2V0ICovCisJQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFXQVZDQywgY250KTsKKwlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQVdBVklDQywgY250KTsKKwlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQVdBVkNBLCBkbWFidWYtPmRtYV9oYW5kbGUpOworCisJLyogVE9ETzogZm9yIG5vdyB3ZSBsb2FkIHRoZSBiYXNlIHJlZ2lzdGVycyB3aXRoIHRoZSBzYW1lIHRoaW5nICovCisJQUQxODg5X1dSSVRFTChhZDE4ODlfZGV2LCBBRF9ETUFXQVZCQywgY250KTsKKwlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQVdBVklCQywgY250KTsKKwlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQVdBVkJBLCBkbWFidWYtPmRtYV9oYW5kbGUpOworCisJLyogYW5kIHdlJ3JlIG9mZiB0byB0aGUgcmFjZXMuLi4gKi8KKwlBRDE4ODlfV1JJVEVMKGFkMTg4OV9kZXYsIEFEX0RNQUNIU1MsIDB4OCk7CisJdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTV1NNQyk7CisJdG1wIHw9IDB4MDQwMDsgLyogc2V0IFdBRU4gKi8KKwlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTV1NNQywgdG1wKTsKKwkodm9pZCkgQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTV1NNQyk7IC8qIGZsdXNoIHBvc3RlZCBQQ0kgd3JpdGUgKi8KKworCWRtYWJ1Zi0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOworCitza2lwX2RtYToKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIGFkMTg4OV9zdG9wX3dhdihhZDE4ODlfc3RhdGVfdCAqc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpIHsKKwkJdTE2IHRtcDsKKwkJdW5zaWduZWQgbG9uZyBjbnQgPSBkbWFidWYtPmRtYV9sZW47CisKKwkJdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTV1NNQyk7CisJCXRtcCAmPSB+MHgwNDAwOyAvKiBjbGVhciBXQUVOICovCisJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNXU01DLCB0bXApOworCQkodm9pZCkgQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTV1NNQyk7IC8qIGZsdXNoIHBvc3RlZCBQQ0kgd3JpdGUgKi8KKwkJcGNpX3VubWFwX3NpbmdsZShhZDE4ODlfZGV2LT5wY2ksIGRtYWJ1Zi0+ZG1hX2hhbmRsZSwgCisJCQkJY250LCBQQ0lfRE1BX1RPREVWSUNFKTsKKworCQlkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7CisKKwkJLyogdXBkYXRlIGRtYSBwb2ludGVycyAqLworCQlkbWFidWYtPnJkX3B0ciArPSBjbnQ7CisJCWRtYWJ1Zi0+cmRfcHRyICY9IChETUFfU0laRSAtIDEpOworCisJCWRtYWJ1Zi0+ZG1hX2hhbmRsZSA9IDA7CisJCWRtYWJ1Zi0+ZG1hX2xlbiA9IDA7CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCisJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworCisjaWYgMAorc3RhdGljIHZvaWQgYWQxODg5X3N0YXJ0c3RvcF9hZGMoYWQxODg5X3N0YXRlX3QgKnN0YXRlLCBpbnQgc3RhcnQpCit7CisJdTE2IHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCisJdG1wID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTUkFNQyk7CisJaWYgKHN0YXJ0KSB7CisJCXN0YXRlLT5kbWFidWYuZW5hYmxlIHw9IEFEQ19SVU5OSU5HOworCQl0bXAgfD0gMHgwMDA0OyAvKiBzZXQgQURFTiAqLworCX0gZWxzZSB7CisJCXN0YXRlLT5kbWFidWYuZW5hYmxlICY9IH5BRENfUlVOTklORzsKKwkJdG1wICY9IH4weDAwMDQ7IC8qIGNsZWFyIEFERU4gKi8KKwl9CisJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU1JBTUMsIHRtcCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKK3N0YXRpYyBhZDE4ODlfZGV2X3QgKmFkMTg4OV9hbGxvY19kZXYoc3RydWN0IHBjaV9kZXYgKnBjaSkKK3sKKwlhZDE4ODlfZGV2X3QgKmRldjsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJaW50IGk7CisKKwlpZiAoKGRldiA9IGttYWxsb2Moc2l6ZW9mKGFkMTg4OV9kZXZfdCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSAKKwkJcmV0dXJuIE5VTEw7CisJbWVtc2V0KGRldiwgMCwgc2l6ZW9mKGFkMTg4OV9kZXZfdCkpOworCXNwaW5fbG9ja19pbml0KCZkZXYtPmxvY2spOworCWRldi0+cGNpID0gcGNpOworCisJZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgeworCQlkZXYtPnN0YXRlW2ldLmNhcmQgPSBkZXY7CisJCWluaXRfTVVURVgoJmRldi0+c3RhdGVbaV0uc2VtKTsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LT5zdGF0ZVtpXS5kbWFidWYud2FpdCk7CisJfQorCisJLyogYWxsb2NhdGUgZG1hIGJ1ZmZlciAqLworCisJZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgeworCQlkbWFidWYgPSAmZGV2LT5zdGF0ZVtpXS5kbWFidWY7CisJCWRtYWJ1Zi0+cmF3YnVmID0ga21hbGxvYyhETUFfU0laRSwgR0ZQX0tFUk5FTHxHRlBfRE1BKTsKKwkJaWYgKCFkbWFidWYtPnJhd2J1ZikKKwkJCWdvdG8gZXJyX2ZyZWVfZG1hYnVmOworCQlkbWFidWYtPnJhd2J1Zl9zaXplID0gRE1BX1NJWkU7CisJCWRtYWJ1Zi0+ZG1hX2hhbmRsZSA9IDA7CisJCWRtYWJ1Zi0+cmRfcHRyID0gZG1hYnVmLT53cl9wdHIgPSBkbWFidWYtPmRtYV9sZW4gPSAwVUw7CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQlkbWFidWYtPnJhdGUgPSA0ODAwMDsKKwl9CisJcmV0dXJuIGRldjsKKworZXJyX2ZyZWVfZG1hYnVmOgorCXdoaWxlICgtLWkgPj0gMCkKKwkJa2ZyZWUoZGV2LT5zdGF0ZVtpXS5kbWFidWYucmF3YnVmKTsKKwlrZnJlZShkZXYpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBhZDE4ODlfZnJlZV9kZXYoYWQxODg5X2Rldl90ICpkZXYpCit7CisJaW50IGo7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOworCisJaWYgKGRldiA9PSBOVUxMKSAKKwkJcmV0dXJuOworCisJaWYgKGRldi0+YWM5N19jb2RlYykKKwkJYWM5N19yZWxlYXNlX2NvZGVjKGRldi0+YWM5N19jb2RlYyk7CisKKwlmb3IgKGogPSAwOyBqIDwgQURfTUFYX1NUQVRFUzsgaisrKSB7CisJCWRtYWJ1ZiA9ICZkZXYtPnN0YXRlW2pdLmRtYWJ1ZjsKKwkJaWYgKGRtYWJ1Zi0+cmF3YnVmICE9IE5VTEwpIAorCQkJa2ZyZWUoZG1hYnVmLT5yYXdidWYpOworCX0KKworCWtmcmVlKGRldik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZDE4ODlfdHJpZ2dlcl9wbGF5YmFjayhhZDE4ODlfZGV2X3QgKmRldikKK3sKKyNpZiAwCisJdTMyIHZhbDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdLmRtYWJ1ZjsKKyNlbmRpZgorCisJYWQxODg5X3N0YXJ0X3dhdigmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdKTsKK30KKworc3RhdGljIGludCBhZDE4ODlfcmVhZF9wcm9jIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwKKwkJCSAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwljaGFyICpvdXQgPSBwYWdlOworCWludCBsZW4sIGk7CisJYWQxODg5X2Rldl90ICpkZXYgPSBkYXRhOworCWFkMTg4OV9yZWdfdCByZWdzW10gPSB7CisJCXsgIldTTUMiLCBBRF9EU1dTTUMsIDE2IH0sCisJCXsgIlJBTUMiLCBBRF9EU1JBTUMsIDE2IH0sCisJCXsgIldBREEiLCBBRF9EU1dBREEsIDE2IH0sCisJCXsgIlNZREEiLCBBRF9EU1NZREEsIDE2IH0sCisJCXsgIldBUyIsIEFEX0RTV0FTLCAxNiB9LAorCQl7ICJSRVMiLCBBRF9EU1JFUywgMTYgfSwKKwkJeyAiQ0NTIiwgQURfRFNDQ1MsIDE2IH0sCisJCXsgIkFEQ0JBIiwgQURfRE1BQURDQkEsIDMyIH0sCisJCXsgIkFEQ0NBIiwgQURfRE1BQURDQ0EsIDMyIH0sCisJCXsgIkFEQ0JDIiwgQURfRE1BQURDQkMsIDMyIH0sCisJCXsgIkFEQ0NDIiwgQURfRE1BQURDQ0MsIDMyIH0sCisJCXsgIkFEQ0lCQyIsIEFEX0RNQUFEQ0lCQywgMzIgfSwKKwkJeyAiQURDSUNDIiwgQURfRE1BQURDSUNDLCAzMiB9LAorCQl7ICJBRENDVFJMIiwgQURfRE1BQURDQ1RSTCwgMTYgfSwKKwkJeyAiV0FWQkEiLCBBRF9ETUFXQVZCQSwgMzIgfSwKKwkJeyAiV0FWQ0EiLCBBRF9ETUFXQVZDQSwgMzIgfSwKKwkJeyAiV0FWQkMiLCBBRF9ETUFXQVZCQywgMzIgfSwKKwkJeyAiV0FWQ0MiLCBBRF9ETUFXQVZDQywgMzIgfSwKKwkJeyAiV0FWSUJDIiwgQURfRE1BV0FWSUJDLCAzMiB9LAorCQl7ICJXQVZJQ0MiLCBBRF9ETUFXQVZJQ0MsIDMyIH0sCisJCXsgIldBVkNUUkwiLCBBRF9ETUFXQVZDVFJMLCAxNiB9LAorCQl7ICJESVNSIiwgQURfRE1BRElTUiwgMzIgfSwKKwkJeyAiQ0hTUyIsIEFEX0RNQUNIU1MsIDMyIH0sCisJCXsgIklQQyIsIEFEX0dQSU9JUEMsIDE2IH0sCisJCXsgIk9QIiwgQURfR1BJT09QLCAxNiB9LAorCQl7ICJJUCIsIEFEX0dQSU9JUCwgMTYgfSwKKwkJeyAiQUNJQyIsIEFEX0FDSUMsIDE2IH0sCisJCXsgIkFDOTdfUkVTRVQiLCAweDEwMCArIEFDOTdfUkVTRVQsIDE2IH0sCisJCXsgIkFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8iLCAweDEwMCArIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIDE2IH0sCisJCXsgIkFDOTdfSEVBRFBIT05FX1ZPTCIsIDB4MTAwICsgQUM5N19IRUFEUEhPTkVfVk9MLCAxNiB9LAorCQl7ICJBQzk3X01BU1RFUl9WT0xfTU9OTyIsIDB4MTAwICsgQUM5N19NQVNURVJfVk9MX01PTk8sIDE2IH0sCisJCXsgIkFDOTdfTUFTVEVSX1RPTkUiLCAweDEwMCArIEFDOTdfTUFTVEVSX1RPTkUsIDE2IH0sCisJCXsgIkFDOTdfUENCRUVQX1ZPTCIsIDB4MTAwICsgQUM5N19QQ0JFRVBfVk9MLCAxNiB9LAorCQl7ICJBQzk3X1BIT05FX1ZPTCIsIDB4MTAwICsgQUM5N19QSE9ORV9WT0wsIDE2IH0sCisJCXsgIkFDOTdfTUlDX1ZPTCIsIDB4MTAwICsgQUM5N19NSUNfVk9MLCAxNiB9LAorCQl7ICJBQzk3X0xJTkVJTl9WT0wiLCAweDEwMCArIEFDOTdfTElORUlOX1ZPTCwgMTYgfSwKKwkJeyAiQUM5N19DRF9WT0wiLCAweDEwMCArIEFDOTdfQ0RfVk9MLCAxNiB9LAorCQl7ICJBQzk3X1ZJREVPX1ZPTCIsIDB4MTAwICsgQUM5N19WSURFT19WT0wsIDE2IH0sCisJCXsgIkFDOTdfQVVYX1ZPTCIsIDB4MTAwICsgQUM5N19BVVhfVk9MLCAxNiB9LAorCQl7ICJBQzk3X1BDTU9VVF9WT0wiLCAweDEwMCArIEFDOTdfUENNT1VUX1ZPTCwgMTYgfSwKKwkJeyAiQUM5N19SRUNPUkRfU0VMRUNUIiwgMHgxMDAgKyBBQzk3X1JFQ09SRF9TRUxFQ1QsIDE2IH0sCisJCXsgIkFDOTdfUkVDT1JEX0dBSU4iLCAweDEwMCArIEFDOTdfUkVDT1JEX0dBSU4sIDE2IH0sCisJCXsgIkFDOTdfUkVDT1JEX0dBSU5fTUlDIiwgMHgxMDAgKyBBQzk3X1JFQ09SRF9HQUlOX01JQywgMTYgfSwKKwkJeyAiQUM5N19HRU5FUkFMX1BVUlBPU0UiLCAweDEwMCArIEFDOTdfR0VORVJBTF9QVVJQT1NFLCAxNiB9LAorCQl7ICJBQzk3XzNEX0NPTlRST0wiLCAweDEwMCArIEFDOTdfM0RfQ09OVFJPTCwgMTYgfSwKKwkJeyAiQUM5N19NT0RFTV9SQVRFIiwgMHgxMDAgKyBBQzk3X01PREVNX1JBVEUsIDE2IH0sCisJCXsgIkFDOTdfUE9XRVJfQ09OVFJPTCIsIDB4MTAwICsgQUM5N19QT1dFUl9DT05UUk9MLCAxNiB9LAorCQl7IE5VTEwgfQorCX07CisKKwlpZiAoZGV2ID09IE5VTEwpCisJCXJldHVybiAtRU5PREVWOworCisJZm9yIChpID0gMDsgcmVnc1tpXS5uYW1lICE9IDA7IGkrKykKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiJXM6IDB4JTAqeFxuIiwgcmVnc1tpXS5uYW1lLCAKKwkJCXJlZ3NbaV0ud2lkdGggPj4gMiwgCisJCQkocmVnc1tpXS53aWR0aCA9PSAxNiAKKwkJCSAJPyBBRDE4ODlfUkVBRFcoZGV2LCByZWdzW2ldLm9mZnNldCkKKwkJCQk6IEFEMTg4OV9SRUFETChkZXYsIHJlZ3NbaV0ub2Zmc2V0KSkpOworCisJZm9yIChpID0gMDsgaSA8IEFEX01BWF9TVEFURVM7IGkrKykgeworCQlvdXQgKz0gc3ByaW50ZihvdXQsICJETUEgc3RhdHVzIGZvciAlczpcbiIsIAorCQkJKGkgPT0gQURfV0FWX1NUQVRFID8gIldBViIgOiAiQURDIikpOyAKKwkJb3V0ICs9IHNwcmludGYob3V0LCAiXHRcdDB4JXAgKElPVkE6IDB4JWxsdSlcbiIsCisJCQlkZXYtPnN0YXRlW2ldLmRtYWJ1Zi5yYXdidWYsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWRldi0+c3RhdGVbaV0uZG1hYnVmLmRtYV9oYW5kbGUpOworCisJCW91dCArPSBzcHJpbnRmKG91dCwgIlx0cmVhZCBwdHI6IG9mZnNldCAldVxuIiwgCisJCQkodW5zaWduZWQgaW50KWRldi0+c3RhdGVbaV0uZG1hYnVmLnJkX3B0cik7CisJCW91dCArPSBzcHJpbnRmKG91dCwgIlx0d3JpdGUgcHRyOiBvZmZzZXQgJXVcbiIsIAorCQkJKHVuc2lnbmVkIGludClkZXYtPnN0YXRlW2ldLmRtYWJ1Zi53cl9wdHIpOworCQlvdXQgKz0gc3ByaW50ZihvdXQsICJcdGRtYSBsZW46IG9mZnNldCAldVxuIiwgCisJCQkodW5zaWduZWQgaW50KWRldi0+c3RhdGVbaV0uZG1hYnVmLmRtYV9sZW4pOworCX0KKworCWxlbiA9IG91dCAtIHBhZ2UgLSBvZmY7CisJaWYgKGxlbiA8IGNvdW50KSB7CisJCSplb2YgPSAxOworCQlpZiAobGVuIDw9IDApIHJldHVybiAwOworCX0gZWxzZSB7CisJCWxlbiA9IGNvdW50OworCX0KKwkqc3RhcnQgPSBwYWdlICsgb2ZmOworCXJldHVybiBsZW47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKiBETUEgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworI2lmIDAKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBhZDE4ODlfZ2V0X2RtYV9hZGRyKGFkMTg4OV9zdGF0ZV90ICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1MzIgb2Zmc2V0OworCisJaWYgKCEoZG1hYnVmLT5lbmFibGUgJiAoREFDX1JVTk5JTkcgfCBBRENfUlVOTklORykpKSB7CisJCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IGdldF9kbWFfYWRkciBjYWxsZWQgd2l0aG91dCBkbWEgZW5hYmxlZFxuIik7CisJCXJldHVybiAwOworCX0KKwkKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKKwkJb2Zmc2V0ID0gbGUzMl90b19jcHUoQUQxODg5X1JFQURMKHN0YXRlLT5jYXJkLCBBRF9ETUFXQVZCQSkpOworCWVsc2UKKwkJb2Zmc2V0ID0gbGUzMl90b19jcHUoQUQxODg5X1JFQURMKHN0YXRlLT5jYXJkLCBBRF9ETUFBRENCQSkpOworCisJcmV0dXJuICh1bnNpZ25lZCBsb25nKWJ1c190b192aXJ0KCh1bnNpZ25lZCBsb25nKW9mZnNldCkgLSAodW5zaWduZWQgbG9uZylkbWFidWYtPnJhd2J1ZjsKK30KKworc3RhdGljIHZvaWQgYWQxODg5X3VwZGF0ZV9wdHIoYWQxODg5X2Rldl90ICpkZXYsIGludCB3YWtlKQoreworCWFkMTg4OV9zdGF0ZV90ICpzdGF0ZTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJdW5zaWduZWQgbG9uZyBod3B0cjsKKwlpbnQgZGlmZjsKKworCS8qIGNoZWNrIEFEQyBmaXJzdCAqLworCXN0YXRlID0gJmRldi0+YWRjX3N0YXRlOworCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7CisJCWh3cHRyID0gYWQxODg5X2dldF9kbWFfYWRkcihzdGF0ZSk7CisJCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKworCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJZG1hYnVmLT5jb3VudCArPSBkaWZmOworCQlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKKwkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CisKKwkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CisJCQlpZiAod2FrZSAmIGRtYWJ1Zi0+Y291bnQgPj0gZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9IGVsc2UgeworCQkJaWYgKHdha2UgJiBkbWFidWYtPmNvdW50ID4gMCkKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9CisJfQorCisJLyogY2hlY2sgREFDICovCisJc3RhdGUgPSAmZGV2LT53YXZfc3RhdGU7CisJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpIHsKK1hYWAorCit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogL2Rldi9kc3AgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqICovCisKK3N0YXRpYyBzc2l6ZV90IGFkMTg4OV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsCisJbG9mZl90ICpwcG9zKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBhZDE4ODlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwKKwlsb2ZmX3QgKnBwb3MpCit7CisJYWQxODg5X2Rldl90ICpkZXYgPSAoYWQxODg5X2Rldl90ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWFkMTg4OV9zdGF0ZV90ICpzdGF0ZSA9ICZkZXYtPnN0YXRlW0FEX1dBVl9TVEFURV07CisJdm9sYXRpbGUgc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3NpemVfdCByZXQgPSAwOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCisJZG93bigmc3RhdGUtPnNlbSk7CisjaWYgMAorCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gZXJyMTsKKwl9CisjZW5kaWYKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpIHsKKwkJcmV0ID0gLUVGQVVMVDsKKwkJZ290byBlcnIxOworCX0KKworCWFkZF93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKKworCS8qIHN0YXJ0IGZpbGxpbmcgZG1hIGJ1ZmZlci4uLi4gKi8KKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCWxvbmcgcmVtOworCQlsb25nIGNudCA9IGNvdW50OworCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCWZvciAoOzspIHsKKwkJCWxvbmcgdXNlZF9ieXRlczsKKwkJCWxvbmcgdGltZW91dDsJLyogbWF4IHRpbWUgZm9yIERNQSBpbiBqaWZmaWVzICovCisKKwkJCS8qIGJ1ZmZlciBpcyBmdWxsIGlmIHdyIGNhdGNoZXMgdXAgdG8gcmQgKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJdXNlZF9ieXRlcyA9IGRtYWJ1Zi0+d3JfcHRyIC0gZG1hYnVmLT5yZF9wdHI7CisJCQl0aW1lb3V0ID0gKGRtYWJ1Zi0+ZG1hX2xlbiAqIEhaKSAvIGRtYWJ1Zi0+cmF0ZTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJCS8qIGFkanVzdCBmb3IgYnVmZmVyIHdyYXAgYXJvdW5kICovCisJCQl1c2VkX2J5dGVzID0gKHVzZWRfYnl0ZXMgKyBETUFfU0laRSkgJiAoRE1BX1NJWkUgLSAxKTsKKworCQkJLyogSWYgYXQgbGVhc3Qgb25lIHBhZ2UgdW51c2VkICovCisJCQlpZiAodXNlZF9ieXRlcyA8IChETUFfU0laRSAtIDB4MTAwMCkpCisJCQkJYnJlYWs7CisKKwkJCS8qIGRtYSBidWZmZXIgZnVsbCAqLworCisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gZXJyMjsKKwkJCX0KKworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCArIDEpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gZXJyMjsKKwkJCX0KKwkJfQorCisJCS8qIHdhdGNoIG91dCBmb3Igd3JhcHBpbmcgYXJvdW5kIHN0YXRpYyBidWZmZXIgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCXJlbSA9IERNQV9TSVpFIC0gZG1hYnVmLT53cl9wdHI7CisJCWlmIChjbnQgPiByZW0pCisJCQljbnQgPSByZW07CisKKwkJcmVtID0gZG1hYnVmLT53cl9wdHI7CisKKwkJLyogdXBkYXRlIGRtYSBwb2ludGVycyAqLworCQlkbWFidWYtPndyX3B0ciArPSBjbnQ7CisJCWRtYWJ1Zi0+d3JfcHRyICY9IERNQV9TSVpFIC0gMTsJLyogd3JhcCBwdHIgaWYgbmVjZXNzYXJ5ICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJLyogdHJhbnNmZXIgdW53cmFwcGVkIGNodW5rICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHJlbSwgYnVmZmVyLCBjbnQpKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBlcnIyOworCQl9CisKKwkJREJHKCJXcml0aW5nIDB4JWx4IGJ5dGVzIHRvICsweCVseFxuIiwgY250LCByZW0pOworCisJCS8qIHVwZGF0ZSBjb3VudGVycyAqLworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisKKwkJLyogd2UgaGF2ZSBzb21ldGhpbmcgdG8gcGxheSAtIGdvIHBsYXkgaXQhICovCisJCWFkMTg4OV90cmlnZ2VyX3BsYXliYWNrKGRldik7CisJfQorCitlcnIyOgorCXJlbW92ZV93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKK2VycjE6CisJdXAoJnN0YXRlLT5zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWQxODg5X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisjaWYgMAorCWFkMTg4OV9kZXZfdCAqZGV2ID0gKGFkMTg4OV9kZXZfdCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlhZDE4ODlfc3RhdGVfdCAqc3RhdGUgPSBOVUxMOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCWlmICghKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RhdGUgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdOworCQlpZiAoIXN0YXRlKSByZXR1cm4gMDsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdGF0ZSA9ICZkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV07CisJCWlmICghc3RhdGUpIHJldHVybiAwOworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlhZDE4ODlfdXBkYXRlX3B0cihkZXYsIDApOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0YXRlID0gJmRldi0+c3RhdGVbV0FWX1NUQVRFXTsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKGludClkbWFidWYtPmZyYWdzaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0gZWxzZSB7CisJCQlpZiAoKGludClkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArIAorCQkJCShpbnQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9CisJfQorCisJaWYgKGZpbGUgLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0YXRlID0gJmRldi0+c3RhdGVbQURfQURDX1NUQVRFXTsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWlmIChkbWFidWYtPmNvdW50ID49IChpbnQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKyNlbmRpZgorCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGFkMTg4OV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE4ODlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHZhbCA9IDA7CisJYWQxODg5X2Rldl90ICpkZXYgPSAoYWQxODg5X2Rldl90ICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwlhdWRpb19idWZfaW5mbyBhYmluZm87CisJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOworCisJREJHKCJhZDE4ODlfaW9jdGwgY21kIDB4JXggYXJnICVsdVxuIiwgY21kLCBhcmcpOworCisJc3dpdGNoIChjbWQpCisJeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCS8qIHNldCBzYW1wbGluZyByYXRlICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPiA1NDAwICYmIHZhbCA8IDQ4MDAwKQorCQl7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQkJQUQxODg5X1dSSVRFVyhhZDE4ODlfZGV2LCBBRF9EU1dBUywgdmFsKTsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNSRVMsIHZhbCk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOiAvKiB1bmRvY3VtZW50ZWQ/ICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQl2YWwgPSBBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNXU01DKTsKKwkJCWlmICh2YWwpIHsKKwkJCQl2YWwgfD0gMHgwMjAwOyAgLyogc2V0IFdBU1QgKi8KKwkJCX0gZWxzZSB7CisJCQkJdmFsICY9IH4weDAyMDA7IC8qIGNsZWFyIFdBU1QgKi8KKwkJCX0KKwkJCUFEMTg4OV9XUklURVcoYWQxODg5X2RldiwgQURfRFNXU01DLCB2YWwpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJdmFsID0gQUQxODg5X1JFQURXKGFkMTg4OV9kZXYsIEFEX0RTUkFNQyk7CisJCQlpZiAodmFsKSB7CisJCQkJdmFsIHw9IDB4MDAwMjsgIC8qIHNldCBBRFNUICovCisJCQl9IGVsc2UgeworCQkJCXZhbCAmPSB+MHgwMDAyOyAvKiBjbGVhciBBRFNUICovCisJCQl9CisJCQlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTUkFNQywgdmFsKTsKKwkJfQorCisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCXJldHVybiBwdXRfdXNlcihETUFfU0laRSwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFfEFGTVRfVTgsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAodmFsID09IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAKKwkJCQlhZDE4ODlfc2V0X2FkY19mbXQoZGV2LCB2YWwpOworCisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIAorCQkJCWFkMTg4OV9zZXRfd2F2X2ZtdChkZXYsIHZhbCk7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBBRk1UX1MxNl9MRSB8IEFGTVRfVTg7CisJCX0KKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJLyogc2VuZCBhbGwgZGF0YSB0byBkZXZpY2UgKi8KKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJLyogbm90IHN1cHBvcnRlZDsgdXNlcyBmaXhlZCBmcmFnbWVudCBzaXplcyAqLworCQlyZXR1cm4gcHV0X3VzZXIoRE1BX1NJWkUsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQkvKiBzcGFjZSBsZWZ0IGluIGRtYSBidWZmZXJzICovCisJCWlmIChjbWQgPT0gU05EQ1RMX0RTUF9HRVRPU1BBQ0UpCisJCQlkbWFidWYgPSAmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdLmRtYWJ1ZjsKKwkJZWxzZQorCQkJZG1hYnVmID0gJmRldi0+c3RhdGVbQURfQURDX1NUQVRFXS5kbWFidWY7CisJCWFiaW5mby5mcmFnbWVudHMgPSAxOworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IDE7CisJCWFiaW5mby5mcmFnc2l6ZSA9IERNQV9TSVpFOworCQlhYmluZm8uYnl0ZXMgPSBETUFfU0laRTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJYnJlYWs7CisJCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcihBRDE4ODlfUkVBRFcoYWQxODg5X2RldiwgQURfRFNXQVMpLCBwKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKKwljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRU5PVFRZOworfQorCitzdGF0aWMgaW50IGFkMTg4OV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIGNoZWNrIG1pbm9yOyBvbmx5IHN1cHBvcnQgL2Rldi9kc3AgYXRtICovCisJaWYgKGltaW5vcihpbm9kZSkgIT0gMykKKwkJcmV0dXJuIC1FTlhJTzsKKwkKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBhZDE4ODlfZGV2OworCisJYWQxODg5X3NldF93YXZfcmF0ZShhZDE4ODlfZGV2LCA0ODAwMCk7CisJYWQxODg5X3NldF93YXZfZm10KGFkMTg4OV9kZXYsIEFGTVRfUzE2X0xFKTsKKwlBRDE4ODlfV1JJVEVXKGFkMTg4OV9kZXYsIEFEX0RTV0FEQSwgMHgwNDA0KTsgLyogYXR0ZW51YXRpb24gKi8KKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgYWQxODg5X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogaWYgd2UgaGF2ZSBzdGF0ZSBmcmVlIGl0IGhlcmUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWQxODg5X2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGFkMTg4OV9yZWFkLAorCS53cml0ZQkJPSBhZDE4ODlfd3JpdGUsCisJLnBvbGwJCT0gYWQxODg5X3BvbGwsCisJLmlvY3RsCQk9IGFkMTg4OV9pb2N0bCwKKwkubW1hcAkJPSBhZDE4ODlfbW1hcCwKKwkub3BlbgkJPSBhZDE4ODlfb3BlbiwKKwkucmVsZWFzZQk9IGFkMTg4OV9yZWxlYXNlLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKiogL2Rldi9taXhlciBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKiAqLworc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpZiAoYWQxODg5X2Rldi0+YWM5N19jb2RlYy0+ZGV2X21peGVyICE9IGltaW5vcihpbm9kZSkpCisJCXJldHVybiAtRU5PREVWOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYWQxODg5X2Rldi0+YWM5N19jb2RlYzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZDE4ODlfbWl4ZXJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWQxODg5X21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBhZDE4ODlfbWl4ZXJfaW9jdGwsCisJLm9wZW4JCT0gYWQxODg5X21peGVyX29wZW4sCisJLnJlbGVhc2UJPSBhZDE4ODlfbWl4ZXJfcmVsZWFzZSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIEFDOTcgaW50ZXJmYWNlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK3N0YXRpYyB2b2lkIGFkMTg4OV9jb2RlY193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NywgdTggcmVnLCB1MTYgdmFsKQoreworCWFkMTg4OV9kZXZfdCAqZGV2ID0gYWM5Ny0+cHJpdmF0ZV9kYXRhOworCisJLy9EQkcoIldyaXRpbmcgMHgleCB0byAweCVseFxuIiwgdmFsLCBkZXYtPnJlZ2Jhc2UgKyAweDEwMCArIHJlZyk7CisJQUQxODg5X1dSSVRFVyhkZXYsIDB4MTAwICsgcmVnLCB2YWwpOworfQorCitzdGF0aWMgdTE2IGFkMTg4OV9jb2RlY19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICphYzk3LCB1OCByZWcpCit7CisJYWQxODg5X2Rldl90ICpkZXYgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJLy9EQkcoIlJlYWRpbmcgZnJvbSAweCVseFxuIiwgZGV2LT5yZWdiYXNlICsgMHgxMDAgKyByZWcpOworCXJldHVybiBBRDE4ODlfUkVBRFcoZGV2LCAweDEwMCArIHJlZyk7Cit9CQorCitzdGF0aWMgaW50IGFkMTg4OV9hYzk3X2luaXQoYWQxODg5X2Rldl90ICpkZXYsIGludCBpZCkKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NzsKKwl1MTYgZWlkOworCisJaWYgKChhYzk3ID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKSAKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhYzk3LT5wcml2YXRlX2RhdGEgPSBkZXY7CisJYWM5Ny0+aWQgPSBpZDsKKworCWFjOTctPmNvZGVjX3JlYWQgPSBhZDE4ODlfY29kZWNfcmVhZDsKKwlhYzk3LT5jb2RlY193cml0ZSA9IGFkMTg4OV9jb2RlY193cml0ZTsKKworCWlmIChhYzk3X3Byb2JlX2NvZGVjKGFjOTcpID09IDApIHsKKwkJcHJpbnRrKERFVk5BTUUgIjogYWM5N19wcm9iZV9jb2RlYyBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWVpZCA9IGFkMTg4OV9jb2RlY19yZWFkKGFjOTcsIEFDOTdfRVhURU5ERURfSUQpOworCWlmIChlaWQgPT0gMHhmZmZmKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgREVWTkFNRSAiOiBubyBjb2RlYyBhdHRhY2hlZD9cbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRldi0+YWM5N19mZWF0dXJlcyA9IGVpZDsKKworCWlmICgoYWM5Ny0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmFkMTg4OV9taXhlcl9mb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBjYW5ub3QgcmVnaXN0ZXIgbWl4ZXJcbiIpOworCQlnb3RvIG91dF9mcmVlOworCX0KKworCWRldi0+YWM5N19jb2RlYyA9IGFjOTc7CisJcmV0dXJuIDA7CisKK291dF9mcmVlOgorCWFjOTdfcmVsZWFzZV9jb2RlYyhhYzk3KTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBhZDE4ODlfYWNsaW5rX3Jlc2V0KHN0cnVjdCBwY2lfZGV2ICogcGNpZGV2KQoreworCXUxNiBzdGF0OworCWludCByZXRyeSA9IDIwMDsKKwlhZDE4ODlfZGV2X3QgKmRldiA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOworCisJQUQxODg5X1dSSVRFVyhkZXYsIEFEX0RTQ0NTLCAweDgwMDApOyAvKiB0dXJuIG9uIGNsb2NrICovCisJQUQxODg5X1JFQURXKGRldiwgQURfRFNDQ1MpOyAKKworCVdBSVRfMTBNUygpOworCisJc3RhdCA9IEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDSUMpOworCXN0YXQgfD0gMHgwMDAyOwkJCQkvKiBSZXNldCBEaXNhYmxlICovCisJQUQxODg5X1dSSVRFVyhkZXYsIEFEX0FDSUMsIHN0YXQpOworCSh2b2lkKSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQ0lDKTsJLyogZmx1c2ggcG9zdGVkIHdyaXRlICovCisKKwl1ZGVsYXkoMTApOworCisJc3RhdCA9IEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDSUMpOworCXN0YXQgfD0gMHgwMDAxOwkJCQkvKiBJbnRlcmZhY2UgRW5hYmxlICovCisJQUQxODg5X1dSSVRFVyhkZXYsIEFEX0FDSUMsIHN0YXQpOworCisJZG8geworCQlpZiAoQUQxODg5X1JFQURXKGRldiwgQURfQUNJQykgJiAweDgwMDApCS8qIFJlYWR5ICovCisJCQlicmVhazsKKwkJV0FJVF8xME1TKCk7CisJCXJldHJ5LS07CisJfSB3aGlsZSAocmV0cnkgPiAwKTsKKworCWlmICghcmV0cnkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhZDE4ODlfYWNsaW5rX3Jlc2V0OiBjb2RlYyBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAorCQkJICAgIEFEMTg4OV9SRUFEVyhkZXYsIEFEX0FDSUMpKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBUT0RPIHJlc2V0IEFDOTcgY29kZWMgKi8KKwkvKiBUT0RPIHNldCB3YXZlL2FkYyBwY2kgY3RybCBzdGF0dXMgKi8KKworCXN0YXQgPSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9BQ0lDKTsKKwlzdGF0IHw9IDB4MDAwNDsJCQkJLyogQXVkaW8gU3RyZWFtIE91dHB1dCBFbmFibGUgKi8KKwlBRDE4ODlfV1JJVEVXKGRldiwgQURfQUNJQywgc3RhdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqIFBDSSBpbnRlcmZhY2VzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogUENJIGRldmljZSB0YWJsZSAqLworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFkMTg4OV9pZF90YmxbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfQU5BTE9HX0RFVklDRVMsIFBDSV9ERVZJQ0VfSURfQUQxODg5SlMsIFBDSV9BTllfSUQsIAorCSAgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpREVWTkFNRSB9LAorCXsgfSwKK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWQxODg5X2lkX3RibCk7CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhZDE4ODlfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdTMyIHN0YXQ7CisJYWQxODg5X2Rldl90ICpkZXYgPSAoYWQxODg5X2Rldl90ICopZGV2X2lkOworCisJc3RhdCA9IEFEMTg4OV9SRUFETChkZXYsIEFEX0RNQURJU1IpOworCisJLyogY2xlYXIgSVNSICovCisJQUQxODg5X1dSSVRFTChkZXYsIEFEX0RNQURJU1IsIHN0YXQpOworCisJaWYgKHN0YXQgJiAweDgpIHsJCS8qIFdBVkkgKi8KKwkJREJHKCJXQVYgaW50ZXJydXB0XG4iKTsKKwkJZGV2LT5zdGF0cy53YXZfaW50cnMrKzsKKwkJaWYgKGRldi0+c3RhdGVbQURfV0FWX1NUQVRFXS5kbWFidWYucmVhZHkpIHsKKwkJCWFkMTg4OV9zdG9wX3dhdigmZGV2LT5zdGF0ZVtBRF9XQVZfU1RBVEVdKTsJLyogY2xlYW4gdXAgKi8KKwkJCWFkMTg4OV9zdGFydF93YXYoJmRldi0+c3RhdGVbQURfV0FWX1NUQVRFXSk7CS8qIHN0YXJ0IG5ldyAqLworCQl9CisJfQorCisJaWYgKChzdGF0ICYgMHgyKSAmJiBkZXYtPnN0YXRlW0FEX0FEQ19TVEFURV0uZG1hYnVmLnJlYWR5KSB7IC8qIEFEQ0kgKi8KKwkJREJHKCJBREMgaW50ZXJydXB0XG4iKTsKKwkJZGV2LT5zdGF0cy5hZGNfaW50cnMrKzsKKwl9CisJaWYoc3RhdCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCXJldHVybiBJUlFfTk9ORTsKK30KKworc3RhdGljIHZvaWQgYWQxODg5X2luaXRjZmcoYWQxODg5X2Rldl90ICpkZXYpCit7CisJdTE2IHRtcDE2OworCXUzMiB0bXAzMjsKKworCS8qIG1ha2Ugc3VyZSB0aGUgaW50ZXJydXB0IGJpdHMgYXJlIHNldHVwIHRoZSB3YXkgd2Ugd2FudCAqLworCXRtcDMyID0gQUQxODg5X1JFQURMKGRldiwgQURfRE1BV0FWQ1RSTCk7CisJdG1wMzIgJj0gfjB4ZmY7IC8qIGZsYXQgZG1hLCBubyBzZywgbWFzayBvdXQgdGhlIGludHIgYml0cyAqLworCXRtcDMyIHw9IDB4NjsgIC8qIGludHIgb24gY291bnQsIGxvb3AgKi8KKwlBRDE4ODlfV1JJVEVMKGRldiwgQURfRE1BV0FWQ1RSTCwgdG1wMzIpOworCisJLyogdW5tdXRlLi4uICovCisJdG1wMTYgPSBBRDE4ODlfUkVBRFcoZGV2LCBBRF9EU1dBREEpOworCXRtcDE2ICY9IH4weDgwODA7CisJQUQxODg5X1dSSVRFVyhkZXYsIEFEX0RTV0FEQSwgdG1wMTYpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhZDE4ODlfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlpbnQgZXJyOworCWFkMTg4OV9kZXZfdCAqZGV2OworCXVuc2lnbmVkIGxvbmcgYmFyOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvY19yb290ID0gTlVMTDsKKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBwY2lfZW5hYmxlX2RldmljZSBmYWlsZWRcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CisJaWYgKChkZXYgPSBhZDE4ODlfYWxsb2NfZGV2KHBjaWRldikpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIERFVk5BTUUgIjogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZGV2aWNlXG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIGRldik7CisJYmFyID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CisJCisgICAgICAgIGlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDApICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IG1lbW9yeSByZWdpb24gbm90IGFzc2lnbmVkXG4iKTsKKwkJZ290byBvdXQxOworCX0KKworCWlmIChwY2lfcmVxdWVzdF9yZWdpb24ocGNpZGV2LCAwLCBERVZOQU1FKSkgeworCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiB1bmFibGUgdG8gcmVxdWVzdCBtZW1vcnkgcmVnaW9uXG4iKTsKKwkJZ290byBvdXQxOworCX0KKworCWRldi0+cmVnYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShiYXIsIEFEX0RTSU9NRU1TSVpFKTsKKwlpZiAoIWRldi0+cmVnYmFzZSkgeworCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiB1bmFibGUgdG8gcmVtYXAgaW9tZW1cbiIpOworCQlnb3RvIG91dDI7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKHBjaWRldi0+aXJxLCBhZDE4ODlfaW50ZXJydXB0LCBTQV9TSElSUSwgREVWTkFNRSwgZGV2KSAhPSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBERVZOQU1FICI6IHVuYWJsZSB0byByZXF1ZXN0IGludGVycnVwdFxuIik7CisJCWdvdG8gb3V0MzsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIERFVk5BTUUgIjogJXMgYXQgJXAgSVJRICVkXG4iLAorCQkoY2hhciAqKWVudC0+ZHJpdmVyX2RhdGEsIGRldi0+cmVnYmFzZSwgcGNpZGV2LT5pcnEpOworCisJaWYgKGFkMTg4OV9hY2xpbmtfcmVzZXQocGNpZGV2KSAhPSAwKQorCQlnb3RvIG91dDQ7CisKKwkvKiByZWdpc3RlciAvZGV2L2RzcCAqLworCWlmICgoZGV2LT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmFkMTg4OV9mb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgREVWTkFNRSAiOiBjYW5ub3QgcmVnaXN0ZXIgL2Rldi9kc3BcbiIpOworCQlnb3RvIG91dDQ7CisJfQorCisJaWYgKChlcnIgPSBhZDE4ODlfYWM5N19pbml0KGRldiwgMCkpICE9IDApCisJCWdvdG8gb3V0NTsKKworCS8qIFhYWDogY2xlYW51cHMgKi8KKwlpZiAoKChwcm9jX3Jvb3QgPSBwcm9jX21rZGlyKCJkcml2ZXIvYWQxODg5IiwgTlVMTCkpID09IE5VTEwpIHx8CisJICAgIGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoImFjOTciLCBTX0lGUkVHfFNfSVJVR08sIHByb2Nfcm9vdCwgYWM5N19yZWFkX3Byb2MsIGRldi0+YWM5N19jb2RlYykgPT0gTlVMTCB8fAorCSAgICBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJpbmZvIiwgU19JRlJFR3xTX0lSVUdPLCBwcm9jX3Jvb3QsIGFkMTg4OV9yZWFkX3Byb2MsIGRldikgPT0gTlVMTCkgCisJCWdvdG8gb3V0NTsKKwkKKwlhZDE4ODlfaW5pdGNmZyhkZXYpOworCisJLy9EQkcoREVWTkFNRSAiOiBEcml2ZXIgaW5pdGlhbGl6YXRpb24gZG9uZSFcbiIpOworCisJYWQxODg5X2RldiA9IGRldjsKKworCXJldHVybiAwOworCitvdXQ1OgorCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldi0+ZGV2X2F1ZGlvKTsKK291dDQ6CisJZnJlZV9pcnEocGNpZGV2LT5pcnEsIGRldik7CitvdXQzOgorCWlvdW5tYXAoZGV2LT5yZWdiYXNlKTsKK291dDI6CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBjaWRldiwgMCk7CitvdXQxOgorCWFkMTg4OV9mcmVlX2RldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIE5VTEwpOworCisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhZDE4ODlfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJYWQxODg5X2Rldl90ICpkZXYgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKKworCWlmIChkZXYgPT0gTlVMTCkgcmV0dXJuOworCQorCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoZGV2LT5hYzk3X2NvZGVjLT5kZXZfbWl4ZXIpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldi0+ZGV2X2F1ZGlvKTsKKwlmcmVlX2lycShwY2lkZXYtPmlycSwgZGV2KTsKKwlpb3VubWFwKGRldi0+cmVnYmFzZSk7CisJcGNpX3JlbGVhc2VfcmVnaW9uKHBjaWRldiwgMCk7CisKKwkvKiBhbnkgaHcgcHJvZ3JhbW1pbmcgbmVlZGVkPyAqLworCWFkMTg4OV9mcmVlX2RldihkZXYpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIE5VTEwpOworfQorCitNT0RVTEVfQVVUSE9SKCJSYW5kb2xwaCBDaHVuZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBbmFsb2cgRGV2aWNlcyBBRDE4ODkgUENJIEF1ZGlvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhZDE4ODlfZHJpdmVyID0geworCS5uYW1lCQk9IERFVk5BTUUsCisJLmlkX3RhYmxlCT0gYWQxODg5X2lkX3RibCwKKwkucHJvYmUJCT0gYWQxODg5X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYWQxODg5X3JlbW92ZSksCit9OworCitzdGF0aWMgaW50IF9faW5pdCBhZDE4ODlfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZhZDE4ODlfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgYWQxODg5X2V4aXRfbW9kdWxlKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhZDE4ODlfZHJpdmVyKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KGFkMTg4OV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChhZDE4ODlfZXhpdF9tb2R1bGUpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FkMTg4OS5oIGIvc291bmQvb3NzL2FkMTg4OS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNGFmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYWQxODg5LmgKQEAgLTAsMCArMSwxMzQgQEAKKyNpZm5kZWYgX0FEMTg4OV9IXworI2RlZmluZSBfQUQxODg5X0hfCisKKyNkZWZpbmUgQURfRFNXU01DCTB4MDAJLyogRE1BIGlucHV0IHdhdmUvc3luIG1peGVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURfRFNSQU1DCTB4MDIJLyogRE1BIG91dHB1dCByZXNhbXAvQURDIG1peGVyIGNvbnRyb2wgKi8KKyNkZWZpbmUgQURfRFNXQURBCTB4MDQJLyogRE1BIGlucHV0IHdhdmUgYXR0ZW51YXRpb24gKi8KKyNkZWZpbmUgQURfRFNTWURBCTB4MDYJLyogRE1BIGlucHV0IHN5biBhdHRlbnR1YXRpb24gKi8KKyNkZWZpbmUgQURfRFNXQVMJMHgwOAkvKiB3YXZlIGlucHV0IHNhbXBsZSByYXRlICovCisjZGVmaW5lIEFEX0RTUkVTCTB4MGEJLyogcmVzYW1wbGVyIG91dHB1dCBzYW1wbGUgcmF0ZSAqLworI2RlZmluZSBBRF9EU0NDUwkweDBjCS8qIGNoaXAgY29udHJvbC9zdGF0dXMgKi8KKworI2RlZmluZSBBRF9ETUFSRVNCQQkweDQwCS8qIFJFUyBiYXNlIGFkZHIgKi8KKyNkZWZpbmUgQURfRE1BUkVTQ0EJMHg0NAkvKiBSRVMgY3VycmVudCBhZGRyICovCisjZGVmaW5lIEFEX0RNQVJFU0JDCTB4NDgJLyogUkVTIGJhc2UgY250ICovCisjZGVmaW5lIEFEX0RNQVJFU0NDCTB4NGMJLyogUkVTIGN1cnJlbnQgY291bnQgKi8KKyNkZWZpbmUgQURfRE1BQURDQkEJMHg1MAkvKiBBREMgKi8KKyNkZWZpbmUgQURfRE1BQURDQ0EJMHg1NAorI2RlZmluZSBBRF9ETUFBRENCQwkweDU4CisjZGVmaW5lIEFEX0RNQUFEQ0NDCTB4NWMKKyNkZWZpbmUgQURfRE1BU1lOQkEJMHg2MAkvKiBTWU4gKi8KKyNkZWZpbmUgQURfRE1BU1lOQ0EJMHg2NAorI2RlZmluZSBBRF9ETUFTWU5CQwkweDY4CisjZGVmaW5lIEFEX0RNQVNZTkNDCTB4NmMKKyNkZWZpbmUgQURfRE1BV0FWQkEJMHg3MAkvKiBXQVYgKi8KKyNkZWZpbmUgQURfRE1BV0FWQ0EJMHg3NAorI2RlZmluZSBBRF9ETUFXQVZCQwkweDc4CisjZGVmaW5lIEFEX0RNQVdBVkNDCTB4N2MKKyNkZWZpbmUgQURfRE1BUkVTSUNDCTB4ODAJLyogUkVTIGludGVycnVwdCBjdXJyZW50IGNvdW50ICovCisjZGVmaW5lIEFEX0RNQVJFU0lCQwkweDg0CS8qIFJFUyBpbnRlcnJ1cHQgYmFzZSBjb3VudCAqLworI2RlZmluZSBBRF9ETUFBRENJQ0MJMHg4OAkvKiBBREMgaW50ZXJydXB0IGN1cnJlbnQgY291bnQgKi8KKyNkZWZpbmUgQURfRE1BQURDSUJDCTB4OGMJLyogQURDIGludGVycnVwdCBiYXNlIGNvdW50ICovCisjZGVmaW5lIEFEX0RNQVNZTklDQwkweDkwCS8qIFNZTiBpbnRlcnJ1cHQgY3VycmVudCBjb3VudCAqLworI2RlZmluZSBBRF9ETUFTWU5JQkMJMHg5NAkvKiBTWU4gaW50ZXJydXB0IGJhc2UgY291bnQgKi8KKyNkZWZpbmUgQURfRE1BV0FWSUNDCTB4OTgJLyogV0FWIGludGVycnVwdCBjdXJyZW50IGNvdW50ICovCisjZGVmaW5lIEFEX0RNQVdBVklCQwkweDljCS8qIFdBViBpbnRlcnJ1cHQgYmFzZSBjb3VudCAqLworI2RlZmluZSBBRF9ETUFSRVNDVFJMCTB4YTAJLyogUkVTIFBDSSBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBBRF9ETUFBRENDVFJMCTB4YTgJLyogQURDIFBDSSBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBBRF9ETUFTWU5DVFJMCTB4YjAJLyogU1lOIFBDSSBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBBRF9ETUFXQVZDVFJMCTB4YjgJLyogV0FWIFBDSSBjb250cm9sL3N0YXR1cyAqLworI2RlZmluZSBBRF9ETUFESVNSCTB4YzAJLyogUENJIERNQSBpbnRyIHN0YXR1cyAqLworI2RlZmluZSBBRF9ETUFDSFNTCTB4YzQJLyogUENJIERNQSBjaGFubmVsIHN0b3Agc3RhdHVzICovCisKKyNkZWZpbmUgQURfR1BJT0lQQwkweGM4CS8qIElPIHBvcnQgY3RybCAqLworI2RlZmluZSBBRF9HUElPT1AJMHhjYQkvKiBJTyBvdXRwdXQgc3RhdHVzICovCisjZGVmaW5lIEFEX0dQSU9JUAkweGNjCS8qIElPIGlucHV0IHN0YXR1cyAqLworCisvKiBBQzk3IHJlZ2lzdGVycywgMHgxMDAgLSAweDE3Zjsgc2VlIGFjOTcuaCAqLworI2RlZmluZSBBRF9BQ0lDCQkweDE4MAkvKiBBQyBMaW5rIGludGVyZmFjZSBjdHJsICovCisKKy8qIE9QTDM7IEJBUjEgKi8KKyNkZWZpbmUgQURfT1BMTTBBUwkweDAwCS8qIE11c2ljMCBhZGRyZXNzL3N0YXR1cyAqLworI2RlZmluZSBBRF9PUExNMERBVEEJMHgwMQkvKiBNdXNpYzAgZGF0YSAqLworI2RlZmluZSBBRF9PUExNMUEJMHgwMgkvKiBNdXNpYzEgYWRkcmVzcyAqLworI2RlZmluZSBBRF9PUExNMURBVEEJMHgwMwkvKiBNdXNpYzEgZGF0YSAqLworLyogMHgwNC0weDBmIHJlc2VydmVkICovCisKKy8qIE1JREk7IEJBUjIgKi8KKyNkZWZpbmUgQURfTUlEQQkJMHgwMAkvKiBNSURJIGRhdGEgKi8KKyNkZWZpbmUgQURfTUlTQwkJMHgwMQkvKiBNSURJIHN0YXR1cy9jbWQgKi8KKy8qIDB4MDItMHhmZiByZXNlcnZlZCAqLworCisjZGVmaW5lIEFEX0RTSU9NRU1TSVpFCTUxMgorI2RlZmluZSBBRF9PUExNRU1TSVpFCTE2CisjZGVmaW5lIEFEX01JRElNRU1TSVpFCTE2CisKKyNkZWZpbmUgQURfV0FWX1NUQVRFCTAKKyNkZWZpbmUgQURfQURDX1NUQVRFCTEKKyNkZWZpbmUgQURfTUFYX1NUQVRFUwkyCisKKyNkZWZpbmUgRE1BX1NJWkUJKDEyOCoxMDI0KQorCisjZGVmaW5lIERNQV9GTEFHX01BUFBFRAkxCisKK3N0cnVjdCBhZDE4ODlfZGV2OworCit0eXBlZGVmIHN0cnVjdCBhZDE4ODlfc3RhdGUgeworCXN0cnVjdCBhZDE4ODlfZGV2ICpjYXJkOworCisJbW9kZV90IG9wZW5fbW9kZTsKKwlzdHJ1Y3QgZG1hYnVmIHsKKwkJdW5zaWduZWQgaW50IHJhdGU7CisJCXVuc2lnbmVkIGNoYXIgZm10LCBlbmFibGU7CisKKwkJLyogYnVmIG1hbmFnZW1lbnQgKi8KKwkJc2l6ZV90IHJhd2J1Zl9zaXplOworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsJLyogbWFwcGVkIGFkZHJlc3MgKi8KKwkJdW5zaWduZWQgbG9uZyBkbWFfbGVuOwkvKiBudW1iZXIgb2YgYnl0ZXMgbWFwcGVkICovCisKKwkJLyogaW5kZXhlcyBpbnRvIHJhd2J1ZiBmb3Igc2V0dGluZyB1cCBETUEgZW5naW5lICovCisJCXZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgcmRfcHRyLCB3cl9wdHI7CisKKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsgLyogdG8gd2FpdCBmb3IgYnVmIHNlcnZpY2luZyAqLworCisJCS8qIE9TUyBiaXRzICovCisJCXVuc2lnbmVkIGludCBtYXBwZWQ6MTsKKwkJdW5zaWduZWQgaW50IHJlYWR5OjE7CisJCXVuc2lnbmVkIGludCBvc3NmcmFnc2hpZnQ7CisJCWludCBvc3NtYXhmcmFnczsKKwkJdW5zaWduZWQgaW50IHN1YmRpdmlzaW9uOworCX0gZG1hYnVmOworCisJc3RydWN0IHNlbWFwaG9yZSBzZW07Cit9IGFkMTg4OV9zdGF0ZV90OworCit0eXBlZGVmIHN0cnVjdCBhZDE4ODlfZGV2IHsKKwl2b2lkIF9faW9tZW0gKnJlZ2Jhc2U7CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwkKKwlzcGlubG9ja190IGxvY2s7CisKKwlpbnQgZGV2X2F1ZGlvOworCisJLyogc3RhdGVzOyBvbmUgcGVyIGNoYW5uZWw7IHJpZ2h0IG5vdyBvbmx5IFdBViBhbmQgQURDICovCisJc3RydWN0IGFkMTg4OV9zdGF0ZSBzdGF0ZVtBRF9NQVhfU1RBVEVTXTsKKworCS8qIEFDOTcgY29kZWMgKi8KKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlYzsKKwl1MTYgYWM5N19mZWF0dXJlczsKKworCS8qIGRlYnVnZ2luZyBzdHVmZiAqLworCXN0cnVjdCBzdGF0cyB7CisJCXVuc2lnbmVkIGludCB3YXZfaW50cnMsIGFkY19pbnRyczsKKwkJdW5zaWduZWQgaW50IGJsb2NrcywgdW5kZXJydW4sIGVycm9yOworCX0gc3RhdHM7Cit9IGFkMTg4OV9kZXZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgYWQxODg5X3JlZyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgb2Zmc2V0OworCWludCB3aWR0aDsKK30gYWQxODg5X3JlZ190OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hZGxpYl9jYXJkLmMgYi9zb3VuZC9vc3MvYWRsaWJfY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MTRjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYWRsaWJfY2FyZC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBzb3VuZC9hZGxpYl9jYXJkLmMKKyAqCisgKiBEZXRlY3Rpb24gcm91dGluZSBmb3IgdGhlIEFkTGliIGNhcmQuCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAib3BsMy5oIgorCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX2FkbGliX2NhcmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWh3X2NvbmZpZy0+c2xvdHNbMF0gPSBvcGwzX2luaXQoaHdfY29uZmlnLT5pb19iYXNlLCBod19jb25maWctPm9zcCwgVEhJU19NT0RVTEUpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV9hZGxpYihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJcmV0dXJuIG9wbDNfZGV0ZWN0KGh3X2NvbmZpZy0+aW9fYmFzZSwgaHdfY29uZmlnLT5vc3ApOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpbyA9IC0xOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYWRsaWIodm9pZCkKK3sKKwljZmcuaW9fYmFzZSA9IGlvOworCisJaWYgKGNmZy5pb19iYXNlID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWRsaWI6IG11c3Qgc3BlY2lmeSBJL08gYWRkcmVzcy5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHByb2JlX2FkbGliKCZjZmcpID09IDApCisJCXJldHVybiAtRU5PREVWOworCWF0dGFjaF9hZGxpYl9jYXJkKCZjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2FkbGliKHZvaWQpCit7CisJc291bmRfdW5sb2FkX3N5bnRoZGV2KGNmZy5zbG90c1swXSk7CisJCit9CisKK21vZHVsZV9pbml0KGluaXRfYWRsaWIpOworbW9kdWxlX2V4aXQoY2xlYW51cF9hZGxpYik7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hZGxpYihjaGFyICpzdHIpCit7CisgICAgICAgIC8qIGlvICovCisJaW50IGludHNbMl07CisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKwkKKwlpbyA9IGludHNbMV07CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImFkbGliPSIsIHNldHVwX2FkbGliKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2FlZHNwMTYuYyBiL3NvdW5kL29zcy9hZWRzcDE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NjI2MwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hZWRzcDE2LmMKQEAgLTAsMCArMSwxMzgxIEBACisvKgorICAgc291bmQvb3NzL2FlZHNwMTYuYworCisgICBBdWRpbyBFeGNlbCBEU1AgMTYgc29mdHdhcmUgY29uZmlndXJhdGlvbiByb3V0aW5lcworICAgQ29weXJpZ2h0IChDKSAxOTk1LDE5OTYsMTk5NywxOTk4ICBSaWNjYXJkbyBGYWNjaGV0dGkgKGZpemJhbkB0aW4uaXQpCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAqLworLyoKKyAqIEluY2x1ZGUgdGhlIG1haW4gT1NTIExpdGUgaGVhZGVyIGZpbGUuIEl0IGluY2x1ZGUgYWxsIHRoZSBvcywgT1NTIExpdGUsIGV0YworICogaGVhZGVycyBuZWVkZWQgYnkgdGhpcyBzb3VyY2UuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworLyoKKyAqIFNhbml0eSBjaGVja3MKKyAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU09VTkRfQUVEU1AxNl9TQlBSTykgJiYgZGVmaW5lZChDT05GSUdfU09VTkRfQUVEU1AxNl9NU1MpCisjZXJyb3IgWW91IGhhdmUgdG8gZW5hYmxlIG9ubHkgb25lIG9mIHRoZSBNU1MgYW5kIFNCUFJPIGVtdWxhdGlvbnMuCisjZW5kaWYKKworLyoKKworICAgUkVBRCBUSElTCisKKyAgIFRoaXMgbW9kdWxlIHN0YXJ0ZWQgdG8gY29uZmlndXJlIHRoZSBBdWRpbyBFeGNlbCBEU1AgMTYgU291bmQgQ2FyZC4KKyAgIE5vdyB3b3JrcyB3aXRoIHRoZSBTQy02MDAwIChvbGQgYWVkc3AxNikgYW5kIG5ldyBTQy02NjAwIGJhc2VkIGNhcmRzLgorCisgICBOT1RFOiBJIGhhdmUgTk8gaWRlYSBhYm91dCBBdWRpbyBFeGNlbCBEU1AgMTYgSUlJLiBJZiBzb21lb25lIG93bnMgdGhpcworICAgYXVkaW8gY2FyZCBhbmQgd2FudCB0byBzZWUgdGhlIGtlcm5lbCBzdXBwb3J0IGZvciBpdCwgcGxlYXNlIGNvbnRhY3QgbWUuCisKKyAgIEF1ZGlvIEV4Y2VsIERTUCAxNiBpcyBhbiBTQiBwcm8gSUksIE1pY3Jvc29mdCBTb3VuZCBTeXN0ZW0gYW5kIE1QVS00MDEKKyAgIGNvbXBhdGlibGUgY2FyZC4KKyAgIEl0IGlzIHNvZnR3YXJlLW9ubHkgY29uZmlndXJhYmxlIChubyBqdW1wZXJzIHRvIGhhcmQtc2V0IGlycS9kbWEvbXB1LWlycSksCisgICBzbyBiZWZvcmUgdGhpcyBtb2R1bGUsIHRoZSBvbmx5IHdheSB0byBjb25maWd1cmUgdGhlIERTUCB1bmRlciBsaW51eCB3YXMKKyAgIGJvb3QgdGhlIE1TLURPUyBsb2FkaW5nIHRoZSBzb3VuZC5zeXMgZGV2aWNlIGRyaXZlciAodGhpcyBkcml2ZXIgc29mdC0KKyAgIGNvbmZpZ3VyZSB0aGUgc291bmQgYm9hcmQgaGFyZHdhcmUgYnkgbWFzc2FnaW5nIHNvbWVvbmUgb2YgaXRzIHJlZ2lzdGVycyksCisgICBhbmQgdGhlbiBjdHJsLWFsdC1kZWwgdG8gYm9vdCBsaW51eCB3aXRoIHRoZSBEU1AgY29uZmlndXJlZCBieSB0aGUgRE9TCisgICBkcml2ZXIuCisKKyAgIFRoaXMgbW9kdWxlIHdvcmtzIGNvbmZpZ3VyaW5nIHlvdXIgQXVkaW8gRXhjZWwgRFNQIDE2J3MgaXJxLCBkbWEgYW5kCisgICBtcHUtNDAxLWlycS4gVGhlIE9TUyBMaXRlIHJvdXRpbmVzIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBpZiB0aGUKKyAgIGhhcmR3YXJlIGlzIHRoZXJlLCB0aGV5IGNhbiBkZXRlY3QgaXQuIFRoZSBwcm9ibGVtIHdpdGggQUVEU1AxNiBpcworICAgdGhhdCBubyBoYXJkd2FyZSBjYW4gYmUgZm91bmQgYnkgdGhlIHByb2JlIHJvdXRpbmVzIGlmIHRoZSBzb3VuZCBjYXJkCisgICBpcyBub3QgY29uZmlndXJlZCBwcm9wZXJseS4gU29tZXRpbWVzIHRoZSBrZXJuZWwgcHJvYmUgcm91dGluZXMgY2FuIGZpbmQKKyAgIGFuIFNCUFJPIGV2ZW4gd2hlbiB0aGUgY2FyZCBpcyBub3QgY29uZmlndXJlZCAodGhpcyBpcyB0aGUgc3RhbmRhcmQgc2V0dXAKKyAgIG9mIHRoZSBjYXJkKSwgYnV0IHRoZSBTQlBSTyBlbXVsYXRpb24gZG9uJ3Qgd29yayB3ZWxsIGlmIHRoZSBjYXJkIGlzIG5vdAorICAgcHJvcGVybHkgaW5pdGlhbGl6ZWQuIEZvciB0aGlzIHJlYXNvbgorCisgICBhZWRzcDE2X2luaXRfYm9hcmQoKQorCisgICByb3V0aW5lIGlzIGNhbGxlZCBiZWZvcmUgdGhlIE9TUyBMaXRlIHByb2JlIHJvdXRpbmVzIHRyeSB0byBkZXRlY3QgdGhlCisgICBoYXJkd2FyZS4KKworICAgTk9URSAoUkVBRCBUSEUgTk9URSBUT08sIElUIENPTlRBSU4gVVNFRlVMIElORk9STUFUSU9OUykKKworICAgTk9URTogTm93IGl0IHdvcmtzIHdpdGggU0MtNjAwMCBhbmQgU0MtNjYwMCBiYXNlZCBhdWRpbyBjYXJkcy4gVGhlIG5ldyBjYXJkcworICAgaGF2ZSBubyBqdW1wZXIgc3dpdGNoIGF0IGFsbC4gTm8gbW9yZSBXU1Mgb3IgTVBVLTQwMSBJL08gcG9ydCBzd2l0Y2hlcy4gVGhleQorICAgaGF2ZSB0byBiZSBjb25maWd1cmVkIGJ5IHNvZnR3YXJlLgorCisgICBOT1RFOiBUaGUgZHJpdmVyIGlzIG1lcmdlZCB3aXRoIHRoZSBuZXcgT1NTIExpdGUgc291bmQgZHJpdmVyLiBJdCB3b3JrcworICAgYXMgYSBsb3dsZXZlbCBkcml2ZXIuCisKKyAgIFRoZSBBdWRpbyBFeGNlbCBEU1AgMTYgU291bmQgQ2FyZCBlbXVsYXRlcyBib3RoIFNCUFJPIGFuZCBNU1M7CisgICB0aGUgT1NTIExpdGUgc291bmQgZHJpdmVyIGNhbiBiZSBjb25maWd1cmVkIGZvciBTQlBSTyBhbmQgTVNTIGNhcmRzCisgICBhdCB0aGUgc2FtZSB0aW1lLCBidXQgdGhlIGFlZHNwMTYgY2FuJ3QgYmUgdHdvIGNhcmRzISEKKyAgIFdoZW4gd2UgY29uZmlndXJlIGl0LCB3ZSBoYXZlIHRvIGNob29zZSB0aGUgU0JQUk8gb3IgdGhlIE1TUyBlbXVsYXRpb24KKyAgIGZvciBBRURTUDE2LiBXZSBhbHNvIGNhbiBpbnN0YWxsIGEgKlJFQUwqIGNhcmQgb2YgdGhlIG90aGVyIHR5cGUgKHNlZSBbMV0pLgorCisgICBOT1RFOiBJZiBzb21lb25lIGNhbiB0ZXN0IHRoZSBjb21iaW5hdGlvbiBBRURTUDE2K01TUyBvciBBRURTUDE2K1NCUFJPCisgICBwbGVhc2UgbGV0IG1lIGtub3cgaWYgaXQgd29ya3MuCisKKyAgIFRoZSBNUFUtNDAxIHN1cHBvcnQgY2FuIGJlIGNvbXBpbGVkIGluIHRvZ2V0aGVyIHdpdGggb25lIG9mIHRoZSBvdGhlcgorICAgdHdvIG9wZXJhdGluZyBtb2Rlcy4KKworICAgTk9URTogVGhpcyBpcyBzb21ldGhpbmcgbGlrZSBwbHVnLWFuZC1wbGF5OiB3ZSBoYXZlIG9ubHkgdG8gcGx1ZworICAgdGhlIEFFRFNQMTYgYm9hcmQgaW4gdGhlIHNvY2tldCwgYW5kIHRoZW4gY29uZmlndXJlIGFuZCBjb21waWxlCisgICBhIGtlcm5lbCB0aGF0IHVzZXMgdGhlIEFFRFNQMTYgc29mdHdhcmUgY29uZmlndXJhdGlvbiBjYXBhYmlsaXR5LgorICAgTm8ganVtcGVyIHNldHRpbmcgaXMgbmVlZGVkIQorCisgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnQgQUVEU1AxNiB0byBiZSBhbiBTQlBybywgb24gaXJxIDEwLCBkbWEgMworICAgeW91IGhhdmUganVzdCB0byBtYWtlIGNvbmZpZyB0aGUgT1NTIExpdGUgcGFja2FnZSwgY29uZmlndXJpbmcKKyAgIHRoZSBBRURTUDE2IHNvdW5kIGNhcmQsIHRoZW4gYWN0aXZhdGluZyB0aGUgU0JQcm8gZW11bGF0aW9uIG1vZGUKKyAgIGFuZCBhdCBsYXN0IGNvbmZpZ3VyaW5nIElSUSBhbmQgRE1BLgorICAgQ29tcGlsZSB0aGUga2VybmVsIGFuZCBydW4gaXQuCisKKyAgIE5PVEU6IFRoaXMgbWVhbnMgZm9yIFNDLTYwMDAgY2FyZHMgdGhhdCB5b3UgY2FuIGNob29zZSBpcnEgYW5kIGRtYSwKKyAgIGJ1dCBub3QgdGhlIEkvTyBhZGRyZXNzZXMuIFRvIGNoYW5nZSBJL08gYWRkcmVzc2VzIHlvdSBoYXZlIHRvIHNldAorICAgdGhlbSB3aXRoIGp1bXBlcnMuIEZvciBTQy02NjAwIGNhcmRzIHlvdSBoYXZlIG5vIGp1bXBlcnMgc28geW91IGhhdmUKKyAgIHRvIHNldCB1cCB5b3VyIGZ1bGwgY2FyZCBjb25maWd1cmF0aW9uIGluIHRoZSBtYWtlIGNvbmZpZy4KKworICAgWW91IGNhbiBjaGFuZ2UgdGhlIGlycS9kbWEvbWlycSBzZXR0aW5ncyBXSVRIT1VUIFRIRSBORUVEIHRvIG9wZW4KKyAgIHlvdXIgY29tcHV0ZXIgYW5kIG1hc3NhZ2UgdGhlIGp1bXBlcnMgKHRoZXJlIGFyZSBubyBpcnEvZG1hL21pcnEKKyAgIGp1bXBlcnMgdG8gYmUgY29uZmlndXJlZCBhbnl3YXksIG9ubHkgSS9PIEJBU0UgdmFsdWVzIGhhdmUgdG8gYmUKKyAgIGNvbmZpZ3VyZWQgd2l0aCBqdW1wZXJzKQorCisgICBGb3Igc29tZSB1bnVuZGVyc3RhbmRhYmxlIHJlYXNvbiwgdGhlIGNhcmQgZGVmYXVsdCBvZiBpcnEgNywgZG1hIDEsCisgICBkb24ndCB3b3JrIGZvciBtZS4gU2VlbXMgdG8gYmUgYW4gSVJRIG9yIERNQSBjb25mbGljdC4gVW5kZXIgaGVhdnkKKyAgIEhERCB3b3JrLCB0aGUga2VybmVsIHN0YXJ0IHRvIGVydXB0IG91dCBhIGxvdCBvZiBtZXNzYWdlcyBsaWtlOgorCisgICAnU291bmQ6IERNQSB0aW1lZCBvdXQgLSBJUlEvRFJRIGNvbmZpZyBlcnJvcj8nCisKKyAgIEZvciB3aGF0IEkgY2FuIHNheSwgSSBoYXZlIE5PVCBhbnkgY29uZmxpY3QgYXQgaXJxIDcgKHVuZGVyIGxpbnV4IEknbQorICAgdXNpbmcgdGhlIGxwIHBvbGxpbmcgZHJpdmVyKSwgYW5kIGRtYSBsaW5lIDEgaXMgdW51c2VkIGFzIHN0YXRlZCBieQorICAgL3Byb2MvZG1hLiBJIGNhbiBzdXBwb3NlIHRoaXMgaXMgYSBidWcgb2YgQUVEU1AxNi4gSSBrbm93IG15IGhhcmR3YXJlIHNvCisgICBJJ20gcHJldHR5IHN1cmUgSSBoYXZlIG5vdCBhbnkgY29uZmxpY3QsIGJ1dCBtYXkgYmUgSSdtIHdyb25nLiBXaG8ga25vd3MhCisgICBBbnl3YXkgYSBzZXR0aW5nIG9mIGlycSAxMCwgZG1hIDMgd29ya3MgcmVhbGx5IGZpbmUuCisKKyAgIE5PVEU6IGlmIHNvbWVvbmUgY2FuIHVzZSBBRURTUDE2IHdpdGggaXJxIDcsIGRtYSAxLCBwbGVhc2UgbGV0IG1lIGtub3cKKyAgIHRoZSBlbXVsYXRpb24gbW9kZSwgYWxsIHRoZSBpbnN0YWxsZWQgaGFyZHdhcmUgYW5kIHRoZSBoYXJkd2FyZQorICAgY29uZmlndXJhdGlvbiAoaXJxIGFuZCBkbWEgc2V0dGluZ3Mgb2YgYWxsIHRoZSBoYXJkd2FyZSkuCisKKyAgIFRoaXMgaW5pdCBtb2R1bGUgc2hvdWxkIHdvcmsgd2l0aCBTQlBSTytNU1MsIHdoZW4gb25lIG9mIHRoZSB0d28gaXMKKyAgIHRoZSBBRURTUDE2IGVtdWxhdGlvbiBhbmQgdGhlIG90aGVyIHRoZSByZWFsIGNhcmQuIChzZWUgWzFdKQorICAgRm9yIGV4YW1wbGU6CisKKyAgIEFFRFNQMTYgKDB4MjIwKSBpbiBTQlBSTyBlbXUgKDB4MjIwKSArIHJlYWwgTVNTICsgb3RoZXIKKyAgIEFFRFNQMTYgKDB4MjIwKSBpbiBNU1MgZW11ICsgcmVhbCBTQlBSTyAoMHgyNDApICsgb3RoZXIKKworICAgTVBVNDAxIHNob3VsZCB3b3JrLiAoc2VlIFsyXSkKKworICAgWzFdCisgICAgICAgLS0tCisgICAgICAgRGF0ZTogTW9uLCAyOSBKdWwgMTk5NyAwODozNTo0MCArMDEwMAorICAgICAgIEZyb206IE1yIFMgSiBHcmVlbmF3YXkgPHNqZzk1QHVuaXhmZS5ybC5hYy51az4KKworICAgICAgIFsuLi5dCisgICAgICAgSnVzdCB0byBsZXQgeW91IGtub3cgZ290IG15IEF1ZGlvIEV4Y2VsIChlbXVsYXRpbmcgYSBNU1MpIHdvcmtpbmcKKyAgICAgICB3aXRoIG15IG9yaWdpbmFsIFNCMTYsIHRoYW5rcyBmb3IgdGhlIGRyaXZlciEKKyAgICAgICBbLi4uXQorICAgICAgIC0tLQorCisgICBbMl0gTm90IHRlc3RlZCBieSBtZSBmb3IgbGFjayBvZiBoYXJkd2FyZS4KKworICAgVE9ETywgV0lTSEVTIEFORCBURUNICisKKyAgIC0gQWJvdXQgSS9PIHBvcnRzIGFsbG9jYXRpb24gLQorCisgICBSZXF1ZXN0IHRoZSAyeDBoIHJlZ2lvbiAocG9ydCBiYXNlKSBpbiBhbnkgY2FzZSBpZiB3ZSBhcmUgdXNpbmcgdGhpcyBjYXJkLgorCisgICBOT1RFOiB0aGUgImFlZHNwMTYgKGJhc2UpIiBzdHJpbmcgd2l0aCB3aGljaCB3ZSBhcmUgcmVxdWVzdGluZyB0aGUgYWVkc3AxNgorICAgcG9ydCBiYXNlIHJlZ2lvbiAoc2VlIGNvZGUpIGRvZXMgbm90IG1lYW4gbmVjZXNzYXJpbHkgdGhhdCB3ZSBhcmUgZW11bGF0aW5nCisgICBzYnByby4gIEV2ZW4gaWYgdGhpcyByZWdpb24gaXMgdGhlIHNicHJvIEkvTyBwb3J0cyByZWdpb24sIHdlIHVzZSB0aGlzCisgICByZWdpb24gdG8gYWNjZXNzIHRoZSBjb250cm9sIHJlZ2lzdGVycyBvZiB0aGUgY2FyZCwgYW5kIGlmIGVtdWxhdGluZworICAgc2Jwcm8sIEkvTyBzYnBybyByZWdpc3RlcnMgdG9vLiBJZiB3ZSBhcmUgZW11bGF0aW5nIE1TUywgdGhlIHNicHJvCisgICByZWdpc3RlcnMgYXJlIG5vdCB1c2VkLCBpbiBubyB3YXksIHRvIGVtdWxhdGUgYW4gc2Jwcm86IHRoZXkgYXJlCisgICB1c2VkIG9ubHkgZm9yIGNvbmZpZ3VyYXRpb24gcHVycG9zZXMuCisKKyAgIFN0YXJ0ZWQgRnJpIE1hciAxNyAxNjoxMzoxOCBNRVQgMTk5NQorCisgICB2MC4xIChBTFBIQSwgd2FzIGFuIHVzZXItbGV2ZWwgcHJvZ3JhbSBjYWxsZWQgQXVkaW9FeGNlbERTUDE2LmMpCisgICAtIEluaXRpYWwgY29kZS4KKyAgIHYwLjIgKEFMUEhBKQorICAgLSBDbGVhbnVwcy4KKyAgIC0gSW50ZWdyYXRlZCB3aXRoIExpbnV4IHZveHdhcmUgdiAyLjkwLTIga2VybmVsIHNvdW5kIGRyaXZlci4KKyAgIC0gU291bmRCbGFzdGVyIFBybyBtb2RlIGNvbmZpZ3VyYXRpb24uCisgICAtIE1pY3Jvc29mdCBTb3VuZCBTeXN0ZW0gbW9kZSBjb25maWd1cmF0aW9uLgorICAgLSBNUFUtNDAxIG1vZGUgY29uZmlndXJhdGlvbi4KKyAgIHYwLjMgKEFMUEhBKQorICAgLSBDbGVhbnVwcy4KKyAgIC0gUmVhcnJhbmdlZCB0aGUgY29kZSB0byBsZXQgYWVkc3AxNl9pbml0X2JvYXJkIGJlIG1vcmUgZ2VuZXJhbC4KKyAgIC0gRXJhc2VkIHRoZSBSRUFMTFlfU0xPV19JTy4gV2UgZG9uJ3QgbmVlZCBpdC4gRXJhc2VkIHRoZSBsaW51eC9pby5oCisgICBpbmNsdXNpb24gdG9vLiBXZSByZWx5IG9uIG9zLmgKKyAgIC0gVXNlZCB0aGUgIHRvIGdldCBhIHZhcmlhYmxlCisgICBsZW4gc3RyaW5nICh3ZSBhcmUgbm90IHN1cmUgYWJvdXQgdGhlIGxlbiBvZiBDb3B5cmlnaHQgc3RyaW5nKS4KKyAgIFRoaXMgd29ya3Mgd2l0aCBhbnkgU0IgYW5kIGNvbXBhdGlibGUuCisgICAtIEFkZGVkIHRoZSBjb2RlIHRvIHJlcXVlc3RfcmVnaW9uIGF0IGRldmljZSBpbml0IChzaG91bGQgZ28gaW4KKyAgIHRoZSBtYWluIGJvZHkgb2Ygdm94d2FyZSkuCisgICB2MC40IChCRVRBKQorICAgLSBCZXR0ZXIgY29uZmlndXJlLmMgcGF0Y2ggZm9yIGFlZHNwMTYgY29uZmlndXJhdGlvbiAoYmV0dGVyCisgICBsb2dpYyBvZiBpbmNsdXNpb24gb2YgQUVEU1AxNiBzdXBwb3J0KQorICAgLSBNb2RpZmllZCB0aGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gYmV0dGVyIHN1cHBvcnQgbW9yZSB0aGFuCisgICBvbmUgc291bmQgY2FyZCBvZiB0aGUgZW11bGF0ZWQgdHlwZSAocmVhZCB0aGUgTk9URVMgYWJvdmUpCisgICAtIE1vdmVkIHRoZSBzYiBpbml0IHJvdXRpbmUgZnJvbSB0aGUgYXR0YWNoIHRvIHRoZSB2ZXJ5IGZpcnN0CisgICBwcm9iZSBpbiBzYl9jYXJkLmMKKyAgIC0gUmVhcnJhbmdlbWVudHMgYW5kIGNsZWFudXBzCisgICAtIFdpcGVkIG91dCBzb21lIHVubmVjZXNzYXJ5IGNvZGUgYW5kIHZhcmlhYmxlczogdGhpcyBpcyBrZXJuZWwKKyAgIGNvZGUgc28gaXQgaXMgYmV0dGVyIHNhdmUgc29tZSBURVhUIGFuZCBEQVRBCisgICAtIEZpeGVkIHRoZSByZXF1ZXN0X3JlZ2lvbiBjb2RlLiBXZSBtdXN0IGFsbG9jYXRlIHRoZSBhZWRzcDE2IChzYnBybykKKyAgIEkvTyBwb3J0cyBpbiBhbnkgY2FzZSBiZWNhdXNlIHRoZXkgYXJlIHVzZWQgdG8gYWNjZXNzIHRoZSBEU1AKKyAgIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXJzIGFuZCB3ZSBjYW4gbm90IGFsbG93IGFueW9uZSB0byBnZXQgdGhlbS4KKyAgIHYwLjUKKyAgIC0gY2xlYW51cHMgb24gY29tbWVudHMKKyAgIC0gcHJlcCBmb3IgZGlmZnMgYWdhaW5zdCB2My4wLXByb3RvLTk1MDQwMgorICAgdjAuNgorICAgLSByZW1vdmVkIHRoZSByZXF1ZXN0X3JlZ2lvbigpcyB3aGVuIGNvbXBpbGluZyB0aGUgTU9EVUxFIHNvdW5kLm8KKyAgIGJlY2F1c2Ugd2UgYXJlIG5vdCBhbGxvd2VkIChieSB0aGUgYWN0dWFsIHZveHdhcmUgc3RydWN0dXJlKSB0bworICAgcmVsZWFzZV9yZWdpb24oKQorICAgdjAuNyAocHJlIEFMUEhBLCBub3QgZGlzdHJpYnV0ZWQpCisgICAtIHN0YXJ0ZWQgcG9ydGluZyB0aGlzIG1vZHVsZSB0byBrZXJuZWwgMS4zLjg0LiBEdW1teSBwcm9iZS9hdHRhY2gKKyAgIHJvdXRpbmVzLgorICAgdjAuOCAoQUxQSEEpCisgICAtIGF0dGFjaGVkIGFsbCB0aGUgaW5pdCByb3V0aW5lcy4KKyAgIHYwLjkgKEJFVEEpCisgICAtIEludGVncmF0ZWQgd2l0aCBsaW51eC1wcmUyLjAuNworICAgLSBJbnRlZ3JhdGVkIHdpdGggY29uZmlndXJhdGlvbiBzY3JpcHRzLgorICAgLSBDbGVhbmVkIHVwIGFuZCBiZWF1dHlmaWVkIHRoZSBjb2RlLgorICAgdjAuOS45IChCRVRBKQorICAgLSBUaGFua3MgdG8gUGllcmNhcmxvIEdyYW5kaTogY29ycmVjdGVkIHRoZSBjb25kaXRvbmFsIGNvbXBpbGF0aW9uIGNvZGUuCisgICAgIE5vdyBvbmx5IHRoZSBjb2RlIGNvbmZpZ3VyZWQgaXMgY29tcGlsZWQgaW4sIHdpdGggc29tZSBtZW1vcnkgc2F2aW5nLgorICAgdjAuOS4xMAorICAgLSBJbnRlZ3JhdGlvbiBpbnRvIHRoZSBzb3VuZC9sb3dsZXZlbC8gc2VjdGlvbiBvZiB0aGUgc291bmQgZHJpdmVyLgorICAgLSBSZS1vcmdhbml6ZWQgdGhlIGNvZGUuCisgICB2MC45LjExIChub3QgZGlzdHJpYnV0ZWQpCisgICAtIFJld3JpdHRlbiB0aGUgaW5pdCBpbnRlcmZhY2Utcm91dGluZXMgdG8gaW5pdGlhbGl6ZSB0aGUgQUVEU1AxNiBpbgorICAgICBvbmUgc2hvdC4KKyAgIC0gTW9yZSBjb3NtZXRpY3MuCisgICAtIFNDLTY2MDAgc3VwcG9ydC4KKyAgIC0gTW9yZSBzb2Z0L2hhcmQgY29uZmlndXJhdGlvbi4KKyAgIHYwLjkuMTIKKyAgIC0gUmVmaW5lZCB0aGUgdjAuOS4xMSBjb2RlIHdpdGggY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gZGlzdGluZ3Vpc2gKKyAgICAgYmV0d2VlbiBTQy02MDAwIGFuZCBTQy02NjAwIGNvZGUuCisgICB2MS4wLjAKKyAgIC0gUHJlcCBmb3IgbWVyZ2luZyB3aXRoIE9TUyBMaXRlIGFuZCBMaW51eCBrZXJuZWwgMi4xLjEzCisgICAtIENvcnJlY3RlZCBhIGJ1ZyBpbiByZXF1ZXN0L2NoZWNrL3JlbGVhc2UgcmVnaW9uIGNhbGxzICh0aGFua3MgdG8gdGhlCisgICAgIG5ldyBrZXJuZWwgZXhjZXB0aW9uIGhhbmRsaW5nKS4KKyAgIHYxLjEKKyAgIC0gUmV2YW1wZWQgZm9yIGludGVncmF0aW9uIHdpdGggbmV3IG1vZHVsYXJpemVkIHNvdW5kIGRyaXZlcnM6IHRvIGVuaGFuY2UKKyAgICAgdGhlIGZsZXhpYmlsaXR5IG9mIG1vZHVsYXIgdmVyc2lvbiwgSSBoYXZlIHJlbW92ZWQgYWxsIHRoZSBjb25kaXRpb25hbAorICAgICBjb21waWxhdGlvbiBmb3IgU0JQUk8sIE1QVSBhbmQgTVNTIGNvZGUuIE5vdyBpdCBpcyBhbGwgbWFuYWdlZCB3aXRoCisgICAgIHRoZSBhZV9jb25maWcgc3RydWN0dXJlLgorICAgdjEuMgorICAgLSBNb2R1bGUgaW5mb3JtYXRpb25zIGFkZGVkLgorICAgLSBSZW1vdmVkIGFlZHNwMTZfZGVsYXlfMTBtc2VjKCksIG5vdyB1c2luZyBtZGVsYXkoMTApCisgICAtIEFsbCBkYXRhIGFuZCBmdW5jcyBtb3ZlZCB0byAuKi5pbml0IHNlY3Rpb24uCisgICB2MS4zCisgICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4gLSAyMDAwLzA5LzI3CisgICAtIGdvdCByaWQgb2YgY2hlY2tfcmVnaW9uCisKKyAgIEtub3duIFByb2JsZW1zOgorICAgLSBBdWRpbyBFeGNlbCBEU1AgMTYgSUlJIGRvbid0IHdvcmsgd2l0aCB0aGlzIGRyaXZlci4KKworICAgQ3JlZGl0czoKKyAgIE1hbnkgdGhhbmtzIHRvIEdlcmFsZCBCcml0dG9uIDxnYnJpdHRvbkBDYXBBY2Nlc3Mub3JnPi4gSGUgaGVscGVkIG1lIGEKKyAgIGxvdCBpbiB0ZXN0aW5nIHRoZSAwLjkuMTEgYW5kIDAuOS4xMiB2ZXJzaW9ucyBvZiB0aGlzIGRyaXZlci4KKworICovCisKKworI2RlZmluZSBWRVJTSU9OICIxLjMiCQkvKiBWZXJzaW9uIG9mIEF1ZGlvIEV4Y2VsIERTUCAxNiBkcml2ZXIgKi8KKworI3VuZGVmCUFFRFNQMTZfREVCVUcgCQkvKiBEZWZpbmUgdGhpcyB0byAxIHRvIGVuYWJsZSBkZWJ1ZyBjb2RlICAgICAqLworI3VuZGVmCUFFRFNQMTZfREVCVUdfTU9SRSAJLyogRGVmaW5lIHRoaXMgdG8gMSB0byBlbmFibGUgbW9yZSBkZWJ1ZyAgICAgKi8KKyN1bmRlZglBRURTUDE2X0lORk8gCQkvKiBEZWZpbmUgdGhpcyB0byAxIHRvIGVuYWJsZSBpbmZvIGNvZGUgICAgICAqLworCisjaWYgZGVmaW5lZChBRURTUDE2X0RFQlVHKQorIyBkZWZpbmUgREJHKHgpICBwcmludGsgeAorIyBpZiBkZWZpbmVkKEFFRFNQMTZfREVCVUdfTU9SRSkKKyMgIGRlZmluZSBEQkcxKHgpIHByaW50ayB4CisjIGVsc2UKKyMgIGRlZmluZSBEQkcxKHgpCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgREJHKHgpCisjIGRlZmluZSBEQkcxKHgpCisjZW5kaWYKKworLyoKKyAqIE1pc2MgZGVmaW5pdGlvbnMKKyAqLworI2RlZmluZSBUUlVFCTEKKyNkZWZpbmUgRkFMU0UJMAorCisvKgorICogUmVnaW9uIFNpemUgZm9yIHJlcXVlc3QvY2hlY2svcmVsZWFzZSByZWdpb24uCisgKi8KKyNkZWZpbmUgSU9CQVNFX1JFR0lPTl9TSVpFCTB4MTAKKworLyoKKyAqIEhhcmR3YXJlIHJlbGF0ZWQgZGVmYXVsdHMKKyAqLworI2RlZmluZSBERUZfQUVEU1AxNl9JT0IgMHgyMjAgICAvKiAweDIyMChkZWZhdWx0KSAweDI0MCAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgREVGX0FFRFNQMTZfSVJRIDcJLyogNSA3KGRlZmF1bHQpIDkgMTAgMTEgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIERFRl9BRURTUDE2X01SUSAwCS8qIDUgNyA5IDEwIDAoZGVmYXVsdCksIDAgbWVhbnMgZGlzYWJsZSAqLworI2RlZmluZSBERUZfQUVEU1AxNl9ETUEgMQkvKiAwIDEoZGVmYXVsdCkgMyAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyoKKyAqIENvbW1hbmRzIG9mIEFFRFNQMTYncyBEU1AgKFNCUFJPK3NwZWNpYWwpLgorICogU29tZSBvZiB0aGVtIGFyZSBDT01NQU5EX3h4LCBpbiB0aGUgZnV0dXJlIHRoZXkgbWF5IGNoYW5nZS4KKyAqLworI2RlZmluZSBXUklURV9NRElSUV9DRkcgICAweDUwCS8qIFNldCBNJkkmRFJRIG1hc2sgKHRoZSByZWFsIGNvbmZpZykgICAqLworI2RlZmluZSBDT01NQU5EXzUyICAgICAgICAweDUyCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSRUFEX0hBUkRfQ0ZHICAgICAweDU4CS8qIFJlYWQgSGFyZHdhcmUgQ29uZmlnIChJL08gYmFzZSBldGMpICAqLworI2RlZmluZSBDT01NQU5EXzVDICAgICAgICAweDVjCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EXzYwICAgICAgICAweDYwCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EXzY2ICAgICAgICAweDY2CS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EXzZDICAgICAgICAweDZjCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EXzZFICAgICAgICAweDZlCS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBDT01NQU5EXzg4ICAgICAgICAweDg4CS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBEU1BfSU5JVF9NU1MgICAgICAweDhjCS8qIEVuYWJsZSBNaWNyb3NvZnQgU291bmQgU3lzdGVtIG1vZGUgICAqLworI2RlZmluZSBDT01NQU5EX0M1ICAgICAgICAweGM1CS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHRVRfRFNQX1ZFUlNJT04gICAweGUxCS8qIEdldCBEU1AgVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBHRVRfRFNQX0NPUFlSSUdIVCAweGUzCS8qIEdldCBEU1AgQ29weXJpZ2h0ICAgICAgICAgICAgICAgICAgICAqLworCisvKgorICogT2Zmc2V0cyBvZiBBRURTUDE2IERTUCBJL08gcG9ydHMuIFRoZSBvZmZzZXQgaXMgYWRkZWQgdG8gYmFzZSBJL08gcG9ydAorICogdG8gaGF2ZSB0aGUgYWN0dWFsIEkvTyBwb3J0LgorICogUmVnaXN0ZXIgcGVybWlzc2lvbnMgYXJlOgorICogKHdvKSA9PSBXcml0ZSBPbmx5CisgKiAocm8pID09IFJlYWQgIE9ubHkKKyAqICh3LSkgPT0gV3JpdGUKKyAqIChyLSkgPT0gUmVhZAorICovCisjZGVmaW5lIERTUF9SRVNFVCAgICAweDA2CS8qIG9mZnNldCBvZiBEU1AgUkVTRVQgICAgICAgICAgICAgKHdvKSAqLworI2RlZmluZSBEU1BfUkVBRCAgICAgMHgwYQkvKiBvZmZzZXQgb2YgRFNQIFJFQUQgICAgICAgICAgICAgIChybykgKi8KKyNkZWZpbmUgRFNQX1dSSVRFICAgIDB4MGMJLyogb2Zmc2V0IG9mIERTUCBXUklURSAgICAgICAgICAgICAody0pICovCisjZGVmaW5lIERTUF9DT01NQU5EICAweDBjCS8qIG9mZnNldCBvZiBEU1AgQ09NTUFORCAgICAgICAgICAgKHctKSAqLworI2RlZmluZSBEU1BfU1RBVFVTICAgMHgwYwkvKiBvZmZzZXQgb2YgRFNQIFNUQVRVUyAgICAgICAgICAgIChyLSkgKi8KKyNkZWZpbmUgRFNQX0RBVEFWQUlMIDB4MGUJLyogb2Zmc2V0IG9mIERTUCBEQVRBIEFWQUlMQUJMRSAgICAocm8pICovCisKKworI2RlZmluZSBSRVRSWSAgICAgICAgICAgMTAJLyogVmFyaW91cyByZXRyeSB2YWx1ZXMgb24gSS9PIG9wZXJhLSAgICovCisjZGVmaW5lIFNUQVRVU1JFVFJZICAgMTAwMAkvKiB0aW9ucy4gU29tZXRpbWVzIHdlIGhhdmUgdG8gICAgICAgICAgKi8KKyNkZWZpbmUgSEFSRFJFVFJZICAgNTAwMDAwCS8qIHdhaXQgZm9yIHByZXZpb3VzIGNtZCB0byBjb21wbGV0ZSAgICAqLworCisvKgorICogU2l6ZSBvZiBjaGFyYWN0ZXIgYXJyYXlzIHRoYXQgc3RvcmUgbmFtZSBhbmQgdmVyc2lvbiBvZiBzb3VuZCBjYXJkCisgKi8KKyNkZWZpbmUgQ0FSRE5BTUVMRU4gMTUJCS8qIFNpemUgb2YgdGhlIGNhcmQncyBuYW1lIGluIGNoYXJzICAgICAqLworI2RlZmluZSBDQVJEVkVSTEVOICAyCQkvKiBTaXplIG9mIHRoZSBjYXJkJ3MgdmVyc2lvbiBpbiBjaGFycyAgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMCkKKy8qCisgKiBCaXRtYXBwZWQgZmxhZ3Mgb2YgaGFyZCBjb25maWd1cmF0aW9uCisgKi8KKy8qCisgKiBEZWNvZGUgbWFjcm9zICh4bCA9PSBsb3cgYnl0ZSwgeGggPSBoaWdoIGJ5dGUpCisgKi8KKyNkZWZpbmUgSU9CQVNFKHhsKQkJKCh4bCAmIDB4MDEpPzB4MjQwOjB4MjIwKQorI2RlZmluZSBKT1koeGwpICAJCSh4bCAmIDB4MDIpCisjZGVmaW5lIE1QVUFERFIoeGwpCQkoIAkJCVwKKwkJCQkoeGwgJiAweDBDKT8weDMzMDoJXAorCQkJCSh4bCAmIDB4MDgpPzB4MzIwOglcCisJCQkJKHhsICYgMHgwNCk/MHgzMTA6CVwKKwkJCQkJCTB4MzAwKQorI2RlZmluZSBXU1NBRERSKHhsKQkJKCh4bCAmIDB4MTApPzB4RTgwOjB4NTMwKQorI2RlZmluZSBDRFJPTSh4aCkJCSh4aCAmIDB4MjApCisjZGVmaW5lIENEUk9NQUREUih4aCkJCSgoKHhoICYgMHgxRikgPDwgNCkgKyAweDIwMCkKKy8qCisgKiBFbmNvZGUgbWFjcm9zCisgKi8KKyNkZWZpbmUgQkxESU9CQVNFKHhsLCB2YWwpIHsJCVwKKwl4bCAmPSB+MHgwMTsgCQkJXAorCWlmICh2YWwgPT0gMHgyNDApCQlcCisJCXhsIHw9IDB4MDE7CQlcCisJfQorI2RlZmluZSBCTERKT1koeGwsIHZhbCkgewkJXAorCXhsICY9IH4weDAyOyAJCQlcCisJaWYgKHZhbCA9PSAxKQkJCVwKKwkJeGwgfD0gMHgwMjsJCVwKKwl9CisjZGVmaW5lIEJMRE1QVUFERFIoeGwsIHZhbCkgewkJXAorCXhsICY9IH4weDBDOwkJCVwKKwlzd2l0Y2ggKHZhbCkgewkJCVwKKwkJY2FzZSAweDMzMDoJCVwKKwkJCXhsIHw9IDB4MEM7CVwKKwkJCWJyZWFrOwkJXAorCQljYXNlIDB4MzIwOgkJXAorCQkJeGwgfD0gMHgwODsJXAorCQkJYnJlYWs7CQlcCisJCWNhc2UgMHgzMTA6CQlcCisJCQl4bCB8PSAweDA0OwlcCisJCQlicmVhazsJCVwKKwkJY2FzZSAweDMwMDoJCVwKKwkJCXhsIHw9IDB4MDA7CVwKKwkJCWJyZWFrOwkJXAorCQlkZWZhdWx0OgkJXAorCQkJeGwgfD0gMHgwMDsJXAorCQkJYnJlYWs7CQlcCisJCX0JCQlcCisJfQorI2RlZmluZSBCTERXU1NBRERSKHhsLCB2YWwpIHsJCVwKKwl4bCAmPSB+MHgxMDsgCQkJXAorCWlmICh2YWwgPT0gMHhFODApCQlcCisJCXhsIHw9IDB4MTA7CQlcCisJfQorI2RlZmluZSBCTERDRFJPTSh4aCwgdmFsKSB7CQlcCisJeGggJj0gfjB4MjA7IAkJCVwKKwlpZiAodmFsID09IDEpCQkJXAorCQl4aCB8PSAweDIwOwkJXAorCX0KKyNkZWZpbmUgQkxEQ0RST01BRERSKHhoLCB2YWwpIHsJCVwKKwlpbnQgdG1wID0gdmFsOwkJCVwKKwl0bXAgLT0gMHgyMDA7CQkJXAorCXRtcCA+Pj0gNDsJCQlcCisJdG1wICY9IDB4MUY7CQkJXAorCXhoIHw9IHRtcDsJCQlcCisJeGggJj0gMHg3RjsJCQlcCisJeGggfD0gMHg0MDsJCQlcCisJfQorI2VuZGlmIC8qIENPTkZJR19TQzY2MDAgKi8KKworLyoKKyAqIEJpdCBtYXBwZWQgZmxhZ3MgZm9yIGNhbGxpbmcgYWVkc3AxNl9pbml0X2JvYXJkKCksIGFuZCBzYXZpbmcgdGhlIGN1cnJlbnQKKyAqIGVtdWxhdGlvbiBtb2RlLgorICovCisjZGVmaW5lIElOSVRfTk9ORSAgICgwICAgKQorI2RlZmluZSBJTklUX1NCUFJPICAoMTw8MCkKKyNkZWZpbmUgSU5JVF9NU1MgICAgKDE8PDEpCisjZGVmaW5lIElOSVRfTVBVNDAxICgxPDwyKQorCitzdGF0aWMgaW50ICAgICAgc29mdF9jZmcgX19pbml0ZGF0YSA9IDA7CS8qIGJpdG1hcHBlZCBjb25maWcgKi8KK3N0YXRpYyBpbnQgICAgICBzb2Z0X2NmZ19tc3MgX19pbml0ZGF0YSA9IDA7CS8qIGJpdG1hcHBlZCBtc3MgY29uZmlnICovCitzdGF0aWMgaW50ICAgICAgdmVyW0NBUkRWRVJMRU5dIF9faW5pdGRhdGEgPSB7MCwgMH07CS8qIERTUCBWZXI6CisJCQkJCQkgICBoaS0+dmVyWzBdIGxvLT52ZXJbMV0gKi8KKworI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMCkKK3N0YXRpYyBpbnQJaGFyZF9jZmdbMl0gICAgIC8qIGxvPC1oYXJkX2NmZ1swXSBoaTwtaGFyZF9jZmdbMV0gICAgICAqLworICAgICAgICAgICAgICAgICAgICAgX19pbml0ZGF0YSA9IHsgMCwgMH07CisjZW5kaWYgLyogQ09ORklHX1NDNjYwMCAqLworCisjaWYgZGVmaW5lZChDT05GSUdfU0M2NjAwKQorLyogRGVjb2RlZCBoYXJkIGNvbmZpZ3VyYXRpb24gKi8KK3N0cnVjdAlkX2hjZmcgeworCWludCBpb2Jhc2U7CisJaW50IGpveXN0aWNrOworCWludCBtcHViYXNlOworCWludCB3c3NiYXNlOworCWludCBjZHJvbTsKKwlpbnQgY2Ryb21iYXNlOworfTsKKworc3RhdGljIHN0cnVjdCBkX2hjZmcgZGVjb2RlZF9oY2ZnIF9faW5pdGRhdGEgPSB7MCwgfTsKKworI2VuZGlmIC8qIENPTkZJR19TQzY2MDAgKi8KKworLyogb3JWYWxzIGNvbnRhaW4gdGhlIHZhbHVlcyB0byBiZSBvcidlZCAgICAgICAJCQkJKi8KK3N0cnVjdCBvclZhbHMgeworCWludAl2YWw7CQkvKiBpcnF8bWlycXxkbWEgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbnQJb3I7CQkvKiBzb2Z0X2NmZyB8PSBUaGVTdHJ1Y3Qub3IgICAgICAgICAgICAgKi8KK307CisKKy8qIGFlZHNwMTZfaW5mbyBjb250YWluIHRoZSBhdWRpbyBjYXJkIGNvbmZpZ3VyYXRpb24gICAgICAgICAgICAgICAgICAqLworc3RydWN0IGFlZHNwMTZfaW5mbyB7CisJaW50IGJhc2VfaW87ICAgICAgICAgICAgLyogYmFzZSBJL08gYWRkcmVzcyBmb3IgYWNjZXNzaW5nIGNhcmQgICovCisJaW50IGlycTsgICAgICAgICAgICAgICAgLyogaXJxIHZhbHVlIGZvciBEU1AgSS9PICAgICAgICAgICAgICAgICovCisJaW50IG1wdV9pcnE7ICAgICAgICAgICAgLyogaXJxIGZvciBtcHU0MDEgaW50ZXJmYWNlIEkvTyAgICAgICAgICovCisJaW50IGRtYTsgICAgICAgICAgICAgICAgLyogZG1hIHZhbHVlIGZvciBEU1AgSS9PICAgICAgICAgICAgICAgICovCisJaW50IG1zc19iYXNlOyAgICAgICAgICAgLyogYmFzZSBJL08gZm9yIE1pY3Jvc29mdCBTb3VuZCBTeXN0ZW0gICovCisJaW50IG1wdV9iYXNlOyAgICAgICAgICAgLyogYmFzZSBJL08gZm9yIE1QVS00MDEgZW11bGF0aW9uICAgICAgICovCisJaW50IGluaXQ7ICAgICAgICAgICAgICAgLyogSW5pdGlhbGl6YXRpb24gc3RhdHVzIG9mIHRoZSBjYXJkICAgICovCit9OworCisvKgorICogTWFnaWMgdmFsdWVzIHRoYXQgdGhlIERTUCB3aWxsIGVhdCB3aGVuIGNvbmZpZ3VyaW5nIGlycS9taXJxL2RtYQorICovCisvKiBEU1AgSVJRIGNvbnZlcnNpb24gYXJyYXkgICAgICAgICAgICAgKi8KK3N0YXRpYyBzdHJ1Y3Qgb3JWYWxzIG9ySVJRW10gX19pbml0ZGF0YSA9IHsKKwl7MHgwNSwgMHgyOH0sCisJezB4MDcsIDB4MDh9LAorCXsweDA5LCAweDEwfSwKKwl7MHgwYSwgMHgxOH0sCisJezB4MGIsIDB4MjB9LAorCXsweDAwLCAweDAwfQorfTsKKworLyogTVBVLTQwMSBJUlEgY29udmVyc2lvbiBhcnJheSAgICAgICAgICovCitzdGF0aWMgc3RydWN0IG9yVmFscyBvck1JUlFbXSBfX2luaXRkYXRhID0geworCXsweDA1LCAweDA0fSwKKwl7MHgwNywgMHg0NH0sCisJezB4MDksIDB4ODR9LAorCXsweDBhLCAweGM0fSwKKwl7MHgwMCwgMHgwMH0KK307CisKKy8qIERNQSBDaGFubmVscyBjb252ZXJzaW9uIGFycmF5ICAgICAgICAqLworc3RhdGljIHN0cnVjdCBvclZhbHMgb3JETUFbXSBfX2luaXRkYXRhID0geworCXsweDAwLCAweDAxfSwKKwl7MHgwMSwgMHgwMn0sCisJezB4MDMsIDB4MDN9LAorCXsweDAwLCAweDAwfQorfTsKKworc3RhdGljIHN0cnVjdCBhZWRzcDE2X2luZm8gYWVfY29uZmlnID0geworCURFRl9BRURTUDE2X0lPQiwKKwlERUZfQUVEU1AxNl9JUlEsCisJREVGX0FFRFNQMTZfTVJRLAorCURFRl9BRURTUDE2X0RNQSwKKwktMSwKKwktMSwKKwlJTklUX05PTkUKK307CisKKy8qCisgKiBCdWZmZXJzIHRvIHN0b3JlIGF1ZGlvIGNhcmQgaW5mb3JtYXRpb25zCisgKi8KK3N0YXRpYyBjaGFyICAgICBEU1BDb3B5cmlnaHRbQ0FSRE5BTUVMRU4gKyAxXSBfX2luaXRkYXRhID0gezAsIH07CitzdGF0aWMgY2hhciAgICAgRFNQVmVyc2lvbltDQVJEVkVSTEVOICsgMV0gX19pbml0ZGF0YSA9IHswLCB9OworCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X3dhaXRfZGF0YShpbnQgcG9ydCkKK3sKKwlpbnQgICAgICAgICAgICAgbG9vcCA9IFNUQVRVU1JFVFJZOworCXVuc2lnbmVkIGNoYXIgICByZXQgPSAwOworCisJREJHMSgoImFlZHNwMTZfd2FpdF9kYXRhICgweCV4KTogIiwgcG9ydCkpOworCisJZG8geworCQkgIHJldCA9IGluYihwb3J0ICsgRFNQX0RBVEFWQUlMKTsKKwkvKgorCSAqIFdhaXQgZm9yIGRhdGEgYXZhaWxhYmxlIChiaXQgNyBvZiByZXQgPT0gMSkKKwkgKi8KKwkgIH0gd2hpbGUgKCEocmV0ICYgMHg4MCkgJiYgbG9vcC0tKTsKKworCWlmIChyZXQgJiAweDgwKSB7CisJCURCRzEoKCJzdWNjZXNzLlxuIikpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlEQkcxKCgiZmFpbHVyZS5cbiIpKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFlZHNwMTZfcmVhZChpbnQgcG9ydCkKK3sKKwlpbnQgaW5ieXRlOworCisJREJHKCgiICAgIFJlYWQgRFNQIEJ5dGUgKDB4JXgpOiAiLCBwb3J0KSk7CisKKwlpZiAoYWVkc3AxNl93YWl0X2RhdGEocG9ydCkgPT0gRkFMU0UpIHsKKwkJREJHKCgiZmFpbHVyZS5cbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWluYnl0ZSA9IGluYihwb3J0ICsgRFNQX1JFQUQpOworCisJREJHKCgicmVhZCBbMHgleF0veyVjfS5cbiIsIGluYnl0ZSwgaW5ieXRlKSk7CisKKwlyZXR1cm4gaW5ieXRlOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X3Rlc3RfZHNwKGludCBwb3J0KQoreworCXJldHVybiAoKGFlZHNwMTZfcmVhZChwb3J0KSA9PSAweGFhKSA/IFRSVUUgOiBGQUxTRSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFlZHNwMTZfZHNwX3Jlc2V0KGludCBwb3J0KQoreworCS8qCisJICogUmVzZXQgRFNQCisJICovCisKKwlEQkcoKCJSZXNldCBEU1A6XG4iKSk7CisKKwlvdXRiKDEsIChwb3J0ICsgRFNQX1JFU0VUKSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKDAsIChwb3J0ICsgRFNQX1JFU0VUKSk7CisJdWRlbGF5KDEwKTsKKwl1ZGVsYXkoMTApOworCWlmIChhZWRzcDE2X3Rlc3RfZHNwKHBvcnQpID09IFRSVUUpIHsKKwkJREJHKCgic3VjY2Vzcy5cbiIpKTsKKwkJcmV0dXJuIFRSVUU7CisJfSBlbHNlCisJCURCRygoImZhaWx1cmUuXG4iKSk7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X3dyaXRlKGludCBwb3J0LCBpbnQgY21kKQoreworCXVuc2lnbmVkIGNoYXIgICByZXQ7CisJaW50ICAgICAgICAgICAgIGxvb3AgPSBIQVJEUkVUUlk7CisKKwlEQkcoKCIgICAgV3JpdGUgRFNQIEJ5dGUgKDB4JXgpIFsweCV4XTogIiwgcG9ydCwgY21kKSk7CisKKwlkbyB7CisJCXJldCA9IGluYihwb3J0ICsgRFNQX1NUQVRVUyk7CisJCS8qCisJCSAqIERTUCByZWFkeSB0byByZWNlaXZlIGRhdGEgaWYgYml0IDcgb2YgcmV0ID09IDAKKwkJICovCisJCWlmICghKHJldCAmIDB4ODApKSB7CisJCQlvdXRiKGNtZCwgcG9ydCArIERTUF9DT01NQU5EKTsKKwkJCURCRygoInN1Y2Nlc3MuXG4iKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0gd2hpbGUgKGxvb3AtLSk7CisKKwlEQkcoKCJ0aW1lb3V0LlxuIikpOworCXByaW50aygiW0FFRFNQMTZdIERTUCBDb21tYW5kICgweCV4KSB0aW1lb3V0LlxuIiwgY21kKTsKKworCXJldHVybiAtMTsKK30KKworI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMCkKKworI2lmIGRlZmluZWQoQUVEU1AxNl9JTkZPKSB8fCBkZWZpbmVkKEFFRFNQMTZfREVCVUcpCit2b2lkIF9faW5pdCBhZWRzcDE2X3BpbmZvKHZvaWQpIHsKKwlEQkcoKCJcbiBCYXNlIGFkZHJlc3M6ICAleFxuIiwgZGVjb2RlZF9oY2ZnLmlvYmFzZSkpOworCURCRygoIiBKb3lzdGljayAgICA6ICVzIHByZXNlbnRcbiIsIGRlY29kZWRfaGNmZy5qb3lzdGljaz8iIjoiIG5vdCIpKTsKKwlEQkcoKCIgV1NTIGFkZHIgICAgOiAgJXhcbiIsIGRlY29kZWRfaGNmZy53c3NiYXNlKSk7CisJREJHKCgiIE1QVS00MDEgYWRkcjogICV4XG4iLCBkZWNvZGVkX2hjZmcubXB1YmFzZSkpOworCURCRygoIiBDRFJPTSAgICAgICA6ICVzIHByZXNlbnRcbiIsIChkZWNvZGVkX2hjZmcuY2Ryb20hPTQpPyIiOiIgbm90IikpOworCURCRygoIiBDRFJPTUFERFIgICA6ICAleFxuXG4iLCBkZWNvZGVkX2hjZmcuY2Ryb21iYXNlKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgX19pbml0IGFlZHNwMTZfaGFyZF9kZWNvZGUodm9pZCkgeworCisJREJHKCgiIGFlZHNwMTZfaGFyZF9kZWNvZGU6IDB4JXgsIDB4JXhcbiIsIGhhcmRfY2ZnWzBdLCBoYXJkX2NmZ1sxXSkpOworCisvKgorICogRGVjb2RlIENmZyBCeXRlcy4KKyAqLworCWRlY29kZWRfaGNmZy5pb2Jhc2UJPSBJT0JBU0UoaGFyZF9jZmdbMF0pOworCWRlY29kZWRfaGNmZy5qb3lzdGljawk9IEpPWShoYXJkX2NmZ1swXSk7CisJZGVjb2RlZF9oY2ZnLndzc2Jhc2UJPSBXU1NBRERSKGhhcmRfY2ZnWzBdKTsKKwlkZWNvZGVkX2hjZmcubXB1YmFzZQk9IE1QVUFERFIoaGFyZF9jZmdbMF0pOworCWRlY29kZWRfaGNmZy5jZHJvbQk9IENEUk9NKGhhcmRfY2ZnWzFdKTsKKwlkZWNvZGVkX2hjZmcuY2Ryb21iYXNlCT0gQ0RST01BRERSKGhhcmRfY2ZnWzFdKTsKKworI2lmIGRlZmluZWQoQUVEU1AxNl9JTkZPKSB8fCBkZWZpbmVkKEFFRFNQMTZfREVCVUcpCisJcHJpbnRrKCIgT3JpZ2luYWwgc291bmQgY2FyZCBjb25maWd1cmF0aW9uOlxuIik7CisJYWVkc3AxNl9waW5mbygpOworI2VuZGlmCisKKy8qCisgKiBOb3cgc2V0IHVwIHRoZSByZWFsIGtlcm5lbCBjb25maWd1cmF0aW9uLgorICovCisJZGVjb2RlZF9oY2ZnLmlvYmFzZQk9IGFlX2NvbmZpZy5iYXNlX2lvOworCWRlY29kZWRfaGNmZy53c3NiYXNlCT0gYWVfY29uZmlnLm1zc19iYXNlOworCWRlY29kZWRfaGNmZy5tcHViYXNlCT0gYWVfY29uZmlnLm1wdV9iYXNlOworCisjaWYgZGVmaW5lZChDT05GSUdfU0M2NjAwX0pPWSkKKyAJZGVjb2RlZF9oY2ZnLmpveXN0aWNrCT0gQ09ORklHX1NDNjYwMF9KT1k7IC8qIEVuYWJsZSAqLworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfU0M2NjAwX0NEUk9NKQorCWRlY29kZWRfaGNmZy5jZHJvbQk9IENPTkZJR19TQzY2MDBfQ0RST007IC8qIDQ6Ti0zOkktMjpHLTE6UC0wOlMgKi8KKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMF9DRFJPTUJBU0UpCisJZGVjb2RlZF9oY2ZnLmNkcm9tYmFzZQk9IENPTkZJR19TQzY2MDBfQ0RST01CQVNFOyAvKiAwIERpc2FibGUgKi8KKyNlbmRpZgorCisjaWYgZGVmaW5lZChBRURTUDE2X0RFQlVHKQorCURCRygoIiBOZXcgVmFsdWVzOlxuIikpOworCWFlZHNwMTZfcGluZm8oKTsKKyNlbmRpZgorCisJREJHKCgic3VjY2Vzcy5cbiIpKTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFlZHNwMTZfaGFyZF9lbmNvZGUodm9pZCkgeworCisJREJHKCgiIGFlZHNwMTZfaGFyZF9lbmNvZGU6IDB4JXgsIDB4JXhcbiIsIGhhcmRfY2ZnWzBdLCBoYXJkX2NmZ1sxXSkpOworCisJaGFyZF9jZmdbMF0gPSAwOworCWhhcmRfY2ZnWzFdID0gMDsKKworCWhhcmRfY2ZnWzBdIHw9IDB4MjA7CisKKwlCTERJT0JBU0UgKGhhcmRfY2ZnWzBdLCBkZWNvZGVkX2hjZmcuaW9iYXNlKTsKKwlCTERXU1NBRERSKGhhcmRfY2ZnWzBdLCBkZWNvZGVkX2hjZmcud3NzYmFzZSk7CisJQkxETVBVQUREUihoYXJkX2NmZ1swXSwgZGVjb2RlZF9oY2ZnLm1wdWJhc2UpOworCUJMREpPWShoYXJkX2NmZ1swXSwgZGVjb2RlZF9oY2ZnLmpveXN0aWNrKTsKKwlCTERDRFJPTShoYXJkX2NmZ1sxXSwgZGVjb2RlZF9oY2ZnLmNkcm9tKTsKKwlCTERDRFJPTUFERFIoaGFyZF9jZmdbMV0sIGRlY29kZWRfaGNmZy5jZHJvbWJhc2UpOworCisjaWYgZGVmaW5lZChBRURTUDE2X0RFQlVHKQorCWFlZHNwMTZfcGluZm8oKTsKKyNlbmRpZgorCisJREJHKCgiIGFlZHNwMTZfaGFyZF9lbmNvZGU6IDB4JXgsIDB4JXhcbiIsIGhhcmRfY2ZnWzBdLCBoYXJkX2NmZ1sxXSkpOworCURCRygoInN1Y2Nlc3MuXG4iKSk7CisKK30KKworc3RhdGljIGludCBfX2luaXQgYWVkc3AxNl9oYXJkX3dyaXRlKGludCBwb3J0KSB7CisKKwlEQkcoKCJhZWRzcDE2X2hhcmRfd3JpdGU6XG4iKSk7CisKKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBDT01NQU5EXzZDKSkgeworCQlwcmludGsoIltBRURTUDE2XSBDTUQgMHgleDogZmFpbGVkIVxuIiwgQ09NTUFORF82Qyk7CisJCURCRygoImZhaWx1cmUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgQ09NTUFORF81QykpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gQ01EIDB4JXg6IGZhaWxlZCFcbiIsIENPTU1BTkRfNUMpOworCQlEQkcoKCJmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIGhhcmRfY2ZnWzBdKSkgeworCQlwcmludGsoIltBRURTUDE2XSBEQVRBIDB4JXg6IGZhaWxlZCFcbiIsIGhhcmRfY2ZnWzBdKTsKKwkJREJHKCgiZmFpbHVyZS5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBoYXJkX2NmZ1sxXSkpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gREFUQSAweCV4OiBmYWlsZWQhXG4iLCBoYXJkX2NmZ1sxXSk7CisJCURCRygoImZhaWx1cmUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgQ09NTUFORF9DNSkpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gQ01EIDB4JXg6IGZhaWxlZCFcbiIsIENPTU1BTkRfQzUpOworCQlEQkcoKCJmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJREJHKCgic3VjY2Vzcy5cbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X2hhcmRfcmVhZChpbnQgcG9ydCkgeworCisJREJHKCgiYWVkc3AxNl9oYXJkX3JlYWQ6XG4iKSk7CisKKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBSRUFEX0hBUkRfQ0ZHKSkgeworCQlwcmludGsoIltBRURTUDE2XSBDTUQgMHgleDogZmFpbGVkIVxuIiwgUkVBRF9IQVJEX0NGRyk7CisJCURCRygoImZhaWx1cmUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoKGhhcmRfY2ZnWzBdID0gYWVkc3AxNl9yZWFkKHBvcnQpKSA9PSAtMSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X3JlYWQgYWZ0ZXIgQ01EIDB4JXg6IGZhaWxlZFxuIiwKKwkJCVJFQURfSEFSRF9DRkcpOworCQlEQkcoKCJmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmICgoaGFyZF9jZmdbMV0gPSBhZWRzcDE2X3JlYWQocG9ydCkpID09IC0xKSB7CisJCXByaW50aygiW0FFRFNQMTZdIGFlZHNwMTZfcmVhZCBhZnRlciBDTUQgMHgleDogZmFpbGVkXG4iLAorCQkJUkVBRF9IQVJEX0NGRyk7CisJCURCRygoImZhaWx1cmUuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKGFlZHNwMTZfcmVhZChwb3J0KSA9PSAtMSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X3JlYWQgYWZ0ZXIgQ01EIDB4JXg6IGZhaWxlZFxuIiwKKwkJCVJFQURfSEFSRF9DRkcpOworCQlEQkcoKCJmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJREJHKCgic3VjY2Vzcy5cbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X2V4dF9jZmdfd3JpdGUoaW50IHBvcnQpIHsKKworCWludCBleHRjZmcsIHZhbDsKKworCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIENPTU1BTkRfNjYpKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzY2KTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWV4dGNmZyA9IDc7CisJaWYgKGRlY29kZWRfaGNmZy5jZHJvbSAhPSAyKQorCQlleHRjZmcgPSAweDBGOworCWlmICgoZGVjb2RlZF9oY2ZnLmNkcm9tID09IDQpIHx8CisJICAgIChkZWNvZGVkX2hjZmcuY2Ryb20gPT0gMykpCisJCWV4dGNmZyAmPSB+MjsKKwlpZiAoZGVjb2RlZF9oY2ZnLmNkcm9tYmFzZSA9PSAwKQorCQlleHRjZmcgJj0gfjI7CisJaWYgKGRlY29kZWRfaGNmZy5tcHViYXNlID09IDApCisJCWV4dGNmZyAmPSB+MTsKKworCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIGV4dGNmZykpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gV3JpdGUgZXh0Y2ZnOiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCAwKSkgeworCQlwcmludGsoIltBRURTUDE2XSBXcml0ZSBleHRjZmc6IGZhaWxlZCFcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmIChkZWNvZGVkX2hjZmcuY2Ryb20gPT0gMykgeworCQlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBDT01NQU5EXzUyKSkgeworCQkJcHJpbnRrKCJbQUVEU1AxNl0gQ01EIDB4JXg6IGZhaWxlZCFcbiIsIENPTU1BTkRfNTIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJCWlmICgodmFsID0gYWVkc3AxNl9yZWFkKHBvcnQpKSA9PSAtMSkgeworCQkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9yZWFkIGFmdGVyIENNRCAweCV4OiBmYWlsZWRcbiIKKwkJCQkJLCBDT01NQU5EXzUyKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQl2YWwgJj0gMHg3RjsKKwkJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgQ09NTUFORF82MCkpIHsKKwkJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzYwKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCB2YWwpKSB7CisJCQlwcmludGsoIltBRURTUDE2XSBXcml0ZSB2YWw6IGZhaWxlZCFcbiIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU0M2NjAwICovCisKK3N0YXRpYyBpbnQgX19pbml0IGFlZHNwMTZfY2ZnX3dyaXRlKGludCBwb3J0KSB7CisJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgV1JJVEVfTURJUlFfQ0ZHKSkgeworCQlwcmludGsoIltBRURTUDE2XSBDTUQgMHgleDogZmFpbGVkIVxuIiwgV1JJVEVfTURJUlFfQ0ZHKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBzb2Z0X2NmZykpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gSW5pdGlhbGl6YXRpb24gb2YgKE0pSVJRIGFuZCBETUE6IGZhaWxlZCFcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X2luaXRfbXNzKGludCBwb3J0KQoreworCURCRygoImFlZHNwMTZfaW5pdF9tc3M6XG4iKSk7CisKKwltZGVsYXkoMTApOworCisJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgRFNQX0lOSVRfTVNTKSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X2luaXRfbXNzIFsweCV4XTogZmFpbGVkIVxuIiwKKwkJCQlEU1BfSU5JVF9NU1MpOworCQlEQkcoKCJmYWlsdXJlLlxuIikpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCQorCW1kZWxheSgxMCk7CisKKwlpZiAoYWVkc3AxNl9jZmdfd3JpdGUocG9ydCkgPT0gRkFMU0UpCisJCXJldHVybiBGQUxTRTsKKworCW91dGIoc29mdF9jZmdfbXNzLCBhZV9jb25maWcubXNzX2Jhc2UpOworCisJREJHKCgic3VjY2Vzcy5cbiIpKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X3NldHVwX2JvYXJkKGludCBwb3J0KSB7CisJaW50CWxvb3AgPSBSRVRSWTsKKworI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMCkKKwlpbnQJdmFsID0gMDsKKworCWlmIChhZWRzcDE2X2hhcmRfcmVhZChwb3J0KSA9PSBGQUxTRSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X2hhcmRfcmVhZDogZmFpbGVkIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCBDT01NQU5EXzUyKSkgeworCQlwcmludGsoIltBRURTUDE2XSBDTUQgMHgleDogZmFpbGVkIVxuIiwgQ09NTUFORF81Mik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoKHZhbCA9IGFlZHNwMTZfcmVhZChwb3J0KSkgPT0gLTEpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9yZWFkIGFmdGVyIENNRCAweCV4OiBmYWlsZWRcbiIsCisJCQkJQ09NTUFORF81Mik7CisJCXJldHVybiBGQUxTRTsKKwl9CisjZW5kaWYKKworCWRvIHsKKwkJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgQ09NTUFORF84OCkpIHsKKwkJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzg4KTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQltZGVsYXkoMTApOworCX0gd2hpbGUgKChhZWRzcDE2X3dhaXRfZGF0YShwb3J0KSA9PSBGQUxTRSkgJiYgbG9vcC0tKTsKKworCWlmIChhZWRzcDE2X3JlYWQocG9ydCkgPT0gLTEpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9yZWFkIGFmdGVyIENNRCAweCV4OiBmYWlsZWRcbiIsCisJCQkJQ09NTUFORF84OCk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZiAhZGVmaW5lZChDT05GSUdfU0M2NjAwKQorCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIENPTU1BTkRfNUMpKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzVDKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKyNlbmRpZgorCisJaWYgKGFlZHNwMTZfY2ZnX3dyaXRlKHBvcnQpID09IEZBTFNFKQorCQlyZXR1cm4gRkFMU0U7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TQzY2MDApCisJaWYgKGFlZHNwMTZfd3JpdGUocG9ydCwgQ09NTUFORF82MCkpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gQ01EIDB4JXg6IGZhaWxlZCFcbiIsIENPTU1BTkRfNjApOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIHZhbCkpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gREFUQSAweCV4OiBmYWlsZWQhXG4iLCB2YWwpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIENPTU1BTkRfNkUpKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzZFKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCB2ZXJbMF0pKSB7CisJCXByaW50aygiW0FFRFNQMTZdIERBVEEgMHgleDogZmFpbGVkIVxuIiwgdmVyWzBdKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCB2ZXJbMV0pKSB7CisJCXByaW50aygiW0FFRFNQMTZdIERBVEEgMHgleDogZmFpbGVkIVxuIiwgdmVyWzFdKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChhZWRzcDE2X2hhcmRfd3JpdGUocG9ydCkgPT0gRkFMU0UpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9oYXJkX3dyaXRlOiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIENPTU1BTkRfNUMpKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBDT01NQU5EXzVDKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmIGRlZmluZWQoVEhJU19JU19BX1RISU5HX0lfSEFWRV9OT1RfVEVTVEVEX1lFVCkKKwlpZiAoYWVkc3AxNl9jZmdfd3JpdGUocG9ydCkgPT0gRkFMU0UpCisJCXJldHVybiBGQUxTRTsKKyNlbmRpZgorCisjZW5kaWYKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhZWRzcDE2X3N0ZGNmZyhpbnQgcG9ydCkgeworCWlmIChhZWRzcDE2X3dyaXRlKHBvcnQsIFdSSVRFX01ESVJRX0NGRykpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gQ01EIDB4JXg6IGZhaWxlZCFcbiIsIFdSSVRFX01ESVJRX0NGRyk7CisJCXJldHVybiBGQUxTRTsKKwl9CisJLyoKKwkgKiAweDBBID09IChJUlEgNywgRE1BIDEsIE1JUlEgMCkKKwkgKi8KKwlpZiAoYWVkc3AxNl93cml0ZShwb3J0LCAweDBBKSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X3N0ZGNmZzogZmFpbGVkIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFlZHNwMTZfZHNwX3ZlcnNpb24oaW50IHBvcnQpCit7CisJaW50ICAgICAgICAgICAgIGxlbiA9IDA7CisJaW50ICAgICAgICAgICAgIHJldDsKKworCURCRygoIkdldCBEU1AgVmVyc2lvbjpcbiIpKTsKKworCWlmIChhZWRzcDE2X3dyaXRlKGFlX2NvbmZpZy5iYXNlX2lvLCBHRVRfRFNQX1ZFUlNJT04pKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBHRVRfRFNQX1ZFUlNJT04pOworCQlEQkcoKCJmYWlsZWQuXG4iKSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlkbyB7CisJCWlmICgocmV0ID0gYWVkc3AxNl9yZWFkKHBvcnQpKSA9PSAtMSkgeworCQkJREJHKCgiZmFpbGVkLlxuIikpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJLyoKKwkgKiBXZSBhbHJlYWR5IGtub3cgaG93IG1hbnkgaW50IGFyZSBzdG9yZWQgKDIpLCBzbyB3ZSBrbm93IHdoZW4gdGhlCisJICogc3RyaW5nIGlzIGZpbmlzaGVkLgorCSAqLworCQl2ZXJbbGVuKytdID0gcmV0OworCSAgfSB3aGlsZSAobGVuIDwgQ0FSRFZFUkxFTik7CisJc3ByaW50ZihEU1BWZXJzaW9uLCAiJWQuJWQiLCB2ZXJbMF0sIHZlclsxXSk7CisKKwlEQkcoKCJzdWNjZXNzLlxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFlZHNwMTZfZHNwX2NvcHlyaWdodChpbnQgcG9ydCkKK3sKKwlpbnQgICAgICAgICAgICAgbGVuID0gMDsKKwlpbnQgICAgICAgICAgICAgcmV0OworCisJREJHKCgiR2V0IERTUCBDb3B5cmlnaHQ6XG4iKSk7CisKKwlpZiAoYWVkc3AxNl93cml0ZShhZV9jb25maWcuYmFzZV9pbywgR0VUX0RTUF9DT1BZUklHSFQpKSB7CisJCXByaW50aygiW0FFRFNQMTZdIENNRCAweCV4OiBmYWlsZWQhXG4iLCBHRVRfRFNQX0NPUFlSSUdIVCk7CisJCURCRygoImZhaWxlZC5cbiIpKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWRvIHsKKwkJaWYgKChyZXQgPSBhZWRzcDE2X3JlYWQocG9ydCkpID09IC0xKSB7CisJLyoKKwkgKiBJZiBubyBtb3JlIGRhdGEgYXZhaWxhYmxlLCByZXR1cm4gdG8gdGhlIGNhbGxlciwgbm8gZXJyb3IgaWYgbGVuPjAuCisJICogV2UgaGF2ZSBubyBvdGhlciB3YXkgdG8ga25vdyB3aGVuIHRoZSBzdHJpbmcgaXMgZmluaXNoZWQuCisJICovCisJCQlpZiAobGVuKQorCQkJCWJyZWFrOworCQkJZWxzZSB7CisJCQkJREJHKCgiZmFpbGVkLlxuIikpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCisJCURTUENvcHlyaWdodFtsZW4rK10gPSByZXQ7CisKKwkgIH0gd2hpbGUgKGxlbiA8IENBUkROQU1FTEVOKTsKKworCURCRygoInN1Y2Nlc3MuXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGFlZHNwMTZfaW5pdF90YWJsZXModm9pZCkKK3sKKwlpbnQgaSA9IDA7CisKKwltZW1zZXQoRFNQQ29weXJpZ2h0LCAwLCBDQVJETkFNRUxFTiArIDEpOworCW1lbXNldChEU1BWZXJzaW9uLCAwLCBDQVJEVkVSTEVOICsgMSk7CisKKwlmb3IgKGkgPSAwOyBvcklSUVtpXS5vcjsgaSsrKQorCQlpZiAob3JJUlFbaV0udmFsID09IGFlX2NvbmZpZy5pcnEpIHsKKwkJCXNvZnRfY2ZnIHw9IG9ySVJRW2ldLm9yOworCQkJc29mdF9jZmdfbXNzIHw9IG9ySVJRW2ldLm9yOworCQl9CisKKwlmb3IgKGkgPSAwOyBvck1JUlFbaV0ub3I7IGkrKykKKwkJaWYgKG9yTUlSUVtpXS5vciA9PSBhZV9jb25maWcubXB1X2lycSkKKwkJCXNvZnRfY2ZnIHw9IG9yTUlSUVtpXS5vcjsKKworCWZvciAoaSA9IDA7IG9yRE1BW2ldLm9yOyBpKyspCisJCWlmIChvckRNQVtpXS52YWwgPT0gYWVfY29uZmlnLmRtYSkgeworCQkJc29mdF9jZmcgfD0gb3JETUFbaV0ub3I7CisJCQlzb2Z0X2NmZ19tc3MgfD0gb3JETUFbaV0ub3I7CisJCX0KK30KKworc3RhdGljIGludCBfX2luaXQgYWVkc3AxNl9pbml0X2JvYXJkKHZvaWQpCit7CisJYWVkc3AxNl9pbml0X3RhYmxlcygpOworCisJaWYgKGFlZHNwMTZfZHNwX3Jlc2V0KGFlX2NvbmZpZy5iYXNlX2lvKSA9PSBGQUxTRSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X2RzcF9yZXNldDogZmFpbGVkIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisJaWYgKGFlZHNwMTZfZHNwX2NvcHlyaWdodChhZV9jb25maWcuYmFzZV9pbykgPT0gRkFMU0UpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9kc3BfY29weXJpZ2h0OiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCS8qCisJICogTXkgQUVEU1AxNiBjYXJkIHJldHVybiBTQy02MDAwIGluIERTUENvcHlyaWdodCwgc28KKwkgKiBpZiB3ZSBoYXZlIHNvbWV0aGluZyBkaWZmZXJlbnQsIHdlIGhhdmUgdG8gYmUgd2FybmVkLgorCSAqLworCWlmIChzdHJjbXAoIlNDLTYwMDAiLCBEU1BDb3B5cmlnaHQpKQorCQlwcmludGsoIltBRURTUDE2XSBXYXJuaW5nOiBub24gU0MtNjAwMCBhdWRpbyBjYXJkIVxuIik7CisKKwlpZiAoYWVkc3AxNl9kc3BfdmVyc2lvbihhZV9jb25maWcuYmFzZV9pbykgPT0gRkFMU0UpIHsKKwkJcHJpbnRrKCJbQUVEU1AxNl0gYWVkc3AxNl9kc3BfdmVyc2lvbjogZmFpbGVkIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoYWVkc3AxNl9zdGRjZmcoYWVfY29uZmlnLmJhc2VfaW8pID09IEZBTFNFKSB7CisJCXByaW50aygiW0FFRFNQMTZdIGFlZHNwMTZfc3RkY2ZnOiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX1NDNjYwMCkKKwlpZiAoYWVkc3AxNl9oYXJkX3JlYWQoYWVfY29uZmlnLmJhc2VfaW8pID09IEZBTFNFKSB7CisJCXByaW50aygiW0FFRFNQMTZdIGFlZHNwMTZfaGFyZF9yZWFkOiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWFlZHNwMTZfaGFyZF9kZWNvZGUoKTsKKworCWFlZHNwMTZfaGFyZF9lbmNvZGUoKTsKKworCWlmIChhZWRzcDE2X2hhcmRfd3JpdGUoYWVfY29uZmlnLmJhc2VfaW8pID09IEZBTFNFKSB7CisJCXByaW50aygiW0FFRFNQMTZdIGFlZHNwMTZfaGFyZF93cml0ZTogZmFpbGVkIVxuIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwlpZiAoYWVkc3AxNl9leHRfY2ZnX3dyaXRlKGFlX2NvbmZpZy5iYXNlX2lvKSA9PSBGQUxTRSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X2V4dF9jZmdfd3JpdGU6IGZhaWxlZCFcbiIpOworCQlyZXR1cm4gRkFMU0U7CisJfQorI2VuZGlmIC8qIENPTkZJR19TQzY2MDAgKi8KKworCWlmIChhZWRzcDE2X3NldHVwX2JvYXJkKGFlX2NvbmZpZy5iYXNlX2lvKSA9PSBGQUxTRSkgeworCQlwcmludGsoIltBRURTUDE2XSBhZWRzcDE2X3NldHVwX2JvYXJkOiBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWlmIChhZV9jb25maWcubXNzX2Jhc2UgIT0gLTEpIHsKKwkJaWYgKGFlX2NvbmZpZy5pbml0ICYgSU5JVF9NU1MpIHsKKwkJCWlmIChhZWRzcDE2X2luaXRfbXNzKGFlX2NvbmZpZy5iYXNlX2lvKSA9PSBGQUxTRSkgeworCQkJCXByaW50aygiW0FFRFNQMTZdIENhbiBub3QgaW5pdGlhbGl6ZSIKKwkJCQkgICAgICAgIk1pY3Jvc29mdCBTb3VuZCBTeXN0ZW0gbW9kZS5cbiIpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJfQorCX0KKworI2lmICFkZWZpbmVkKE1PRFVMRSkgfHwgZGVmaW5lZChBRURTUDE2X0lORk8pIHx8IGRlZmluZWQoQUVEU1AxNl9ERUJVRykKKworCXByaW50aygiQXVkaW8gRXhjZWwgRFNQIDE2IGluaXQgdiVzICglcyAlcykgWyIsCisJCVZFUlNJT04sIERTUENvcHlyaWdodCwKKwkJRFNQVmVyc2lvbik7CisKKwlpZiAoYWVfY29uZmlnLm1wdV9iYXNlICE9IC0xKSB7CisJCWlmIChhZV9jb25maWcuaW5pdCAmIElOSVRfTVBVNDAxKSB7CisJCQlwcmludGsoIk1QVTQwMSIpOworCQkJaWYgKChhZV9jb25maWcuaW5pdCAmIElOSVRfTVNTKSB8fAorCQkJICAgIChhZV9jb25maWcuaW5pdCAmIElOSVRfU0JQUk8pKQorCQkJCXByaW50aygiICIpOworCQl9CisJfQorCisJaWYgKGFlX2NvbmZpZy5tc3NfYmFzZSA9PSAtMSkgeworCQlpZiAoYWVfY29uZmlnLmluaXQgJiBJTklUX1NCUFJPKSB7CisJCQlwcmludGsoIlNCUHJvIik7CisJCQlpZiAoYWVfY29uZmlnLmluaXQgJiBJTklUX01TUykKKwkJCQlwcmludGsoIiAiKTsKKwkJfQorCX0KKworCWlmIChhZV9jb25maWcubXNzX2Jhc2UgIT0gLTEpCisJCWlmIChhZV9jb25maWcuaW5pdCAmIElOSVRfTVNTKQorCQkJcHJpbnRrKCJNU1MiKTsKKworCXByaW50aygiXVxuIik7CisjZW5kaWYgLyogTU9EVUxFIHx8IEFFRFNQMTZfSU5GTyB8fCBBRURTUDE2X0RFQlVHICovCisKKwltZGVsYXkoMTApOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYWVkc3AxNl9zYih2b2lkKQoreworCURCRygoImluaXRfYWVkc3AxNl9zYjogIikpOworCisvKgorICogSWYgdGhlIGNhcmQgaXMgYWxyZWFkeSBpbml0J2VkIE1TUywgd2UgY2FuIG5vdCBpbml0IGl0IHRvIFNCUFJPIHRvbworICogYmVjYXVzZSB0aGUgYm9hcmQgY2FuIG5vdCBlbXVsYXRlIHNpbXVsdGFuZW91c2x5IE1TUyBhbmQgU0JQUk8uCisgKi8KKwlpZiAoYWVfY29uZmlnLmluaXQgJiBJTklUX01TUykKKwkJcmV0dXJuIEZBTFNFOworCWlmIChhZV9jb25maWcuaW5pdCAmIElOSVRfU0JQUk8pCisJCXJldHVybiBGQUxTRTsKKworCWFlX2NvbmZpZy5pbml0IHw9IElOSVRfU0JQUk87CisKKwlEQkcoKCJkb25lLlxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdF9hZWRzcDE2X3NiKHZvaWQpCit7CisJREJHKCgidW5pbml0X2FlZHNwMTZfc2I6ICIpKTsKKworCWFlX2NvbmZpZy5pbml0ICY9IH5JTklUX1NCUFJPOworCisJREJHKCgiZG9uZS5cbiIpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9hZWRzcDE2X21zcyh2b2lkKQoreworCURCRygoImluaXRfYWVkc3AxNl9tc3M6ICIpKTsKKworLyoKKyAqIElmIHRoZSBjYXJkIGlzIGFscmVhZHkgaW5pdCdlZCBTQlBSTywgd2UgY2FuIG5vdCBpbml0IGl0IHRvIE1TUyB0b28KKyAqIGJlY2F1c2UgdGhlIGJvYXJkIGNhbiBub3QgZW11bGF0ZSBzaW11bHRhbmVvdXNseSBNU1MgYW5kIFNCUFJPLgorICovCisJaWYgKGFlX2NvbmZpZy5pbml0ICYgSU5JVF9TQlBSTykKKwkJcmV0dXJuIEZBTFNFOworCWlmIChhZV9jb25maWcuaW5pdCAmIElOSVRfTVNTKQorCQlyZXR1cm4gRkFMU0U7CisvKgorICogV2UgbXVzdCBhbGxvY2F0ZSB0aGUgQ09ORklHX0FFRFNQMTZfQkFTRSByZWdpb24gdG9vIGJlY2F1c2UgdGhlc2UgYXJlIHRoZSAKKyAqIEkvTyBwb3J0cyB0byBhY2Nlc3MgY2FyZCdzIGNvbnRyb2wgcmVnaXN0ZXJzLgorICovCisJaWYgKCEoYWVfY29uZmlnLmluaXQgJiBJTklUX01QVTQwMSkpIHsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihhZV9jb25maWcuYmFzZV9pbywgSU9CQVNFX1JFR0lPTl9TSVpFLAorCQkJCSJhZWRzcDE2IChiYXNlKSIpKSB7CisJCQlwcmludGsoCisJCQkiQUVEU1AxNiBCQVNFIEkvTyBwb3J0IHJlZ2lvbiBpcyBhbHJlYWR5IGluIHVzZS5cbiIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJYWVfY29uZmlnLmluaXQgfD0gSU5JVF9NU1M7CisKKwlEQkcoKCJkb25lLlxuIikpOworCisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIHVuaW5pdF9hZWRzcDE2X21zcyh2b2lkKQoreworCURCRygoInVuaW5pdF9hZWRzcDE2X21zczogIikpOworCisJaWYgKCghKGFlX2NvbmZpZy5pbml0ICYgSU5JVF9NUFU0MDEpKSAmJgorCSAgIChhZV9jb25maWcuaW5pdCAmIElOSVRfTVNTKSkgeworCQlyZWxlYXNlX3JlZ2lvbihhZV9jb25maWcuYmFzZV9pbywgSU9CQVNFX1JFR0lPTl9TSVpFKTsKKwkJREJHKCgiQUVEU1AxNiBiYXNlIHJlZ2lvbiByZWxlYXNlZC5cbiIpKTsKKwl9CisKKwlhZV9jb25maWcuaW5pdCAmPSB+SU5JVF9NU1M7CisJREJHKCgiZG9uZS5cbiIpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9hZWRzcDE2X21wdSh2b2lkKQoreworCURCRygoImluaXRfYWVkc3AxNl9tcHU6ICIpKTsKKworCWlmIChhZV9jb25maWcuaW5pdCAmIElOSVRfTVBVNDAxKQorCQlyZXR1cm4gRkFMU0U7CisKKy8qCisgKiBXZSBtdXN0IHJlcXVlc3QgdGhlIENPTkZJR19BRURTUDE2X0JBU0UgcmVnaW9uIHRvbyBiZWNhdXNlIHRoZXNlIGFyZSB0aGUgSS9PIAorICogcG9ydHMgdG8gYWNjZXNzIGNhcmQncyBjb250cm9sIHJlZ2lzdGVycy4KKyAqLworCWlmICghKGFlX2NvbmZpZy5pbml0ICYgKElOSVRfTVNTIHwgSU5JVF9TQlBSTykpKSB7CisJCWlmICghcmVxdWVzdF9yZWdpb24oYWVfY29uZmlnLmJhc2VfaW8sIElPQkFTRV9SRUdJT05fU0laRSwKKwkJCQkJImFlZHNwMTYgKGJhc2UpIikpIHsKKwkJCXByaW50aygKKwkJCSJBRURTUDE2IEJBU0UgSS9PIHBvcnQgcmVnaW9uIGlzIGFscmVhZHkgaW4gdXNlLlxuIik7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwlhZV9jb25maWcuaW5pdCB8PSBJTklUX01QVTQwMTsKKworCURCRygoImRvbmUuXG4iKSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgdW5pbml0X2FlZHNwMTZfbXB1KHZvaWQpCit7CisJREJHKCgidW5pbml0X2FlZHNwMTZfbXB1OiAiKSk7CisKKwlpZiAoKCEoYWVfY29uZmlnLmluaXQgJiAoSU5JVF9NU1MgfCBJTklUX1NCUFJPKSkpICYmCisJICAgKGFlX2NvbmZpZy5pbml0ICYgSU5JVF9NUFU0MDEpKSB7CisJCXJlbGVhc2VfcmVnaW9uKGFlX2NvbmZpZy5iYXNlX2lvLCBJT0JBU0VfUkVHSU9OX1NJWkUpOworCQlEQkcoKCJBRURTUDE2IGJhc2UgcmVnaW9uIHJlbGVhc2VkLlxuIikpOworCX0KKworCWFlX2NvbmZpZy5pbml0ICY9IH5JTklUX01QVTQwMTsKKworCURCRygoImRvbmUuXG4iKSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfYWVkc3AxNih2b2lkKQoreworCWludCBpbml0aWFsaXplZCA9IEZBTFNFOworCisJREJHKCgiSW5pdGlhbGl6aW5nIEJBU0VbMHgleF0gSVJRWyVkXSBETUFbJWRdIE1JUlFbJWRdXG4iLAorCSAgICAgYWVfY29uZmlnLmJhc2VfaW8sYWVfY29uZmlnLmlycSxhZV9jb25maWcuZG1hLGFlX2NvbmZpZy5tcHVfaXJxKSk7CisKKwlpZiAoYWVfY29uZmlnLm1zc19iYXNlID09IC0xKSB7CisJCWlmIChpbml0X2FlZHNwMTZfc2IoKSA9PSBGQUxTRSkgeworCQkJdW5pbml0X2FlZHNwMTZfc2IoKTsKKwkJfSBlbHNlIHsKKwkJCWluaXRpYWxpemVkID0gVFJVRTsKKwkJfQorCX0KKworCWlmIChhZV9jb25maWcubXB1X2Jhc2UgIT0gLTEpIHsKKwkJaWYgKGluaXRfYWVkc3AxNl9tcHUoKSA9PSBGQUxTRSkgeworCQkJdW5pbml0X2FlZHNwMTZfbXB1KCk7CisJCX0gZWxzZSB7CisJCQlpbml0aWFsaXplZCA9IFRSVUU7CisJCX0KKwl9CisKKy8qCisgKiBJbiB0aGUgc2VxdWVuY2Ugb2YgaW5pdCByb3V0aW5lcywgdGhlIE1TUyBpbml0IE1VU1QgYmUgdGhlIGxhc3QhCisgKiBUaGlzIGJlY2F1c2Ugb2YgdGhlIHNwZWNpYWwgcmVnaXN0ZXIgcHJvZ3JhbW1pbmcgdGhlIE1TUyBtb2RlIG5lZWRzLgorICogQSBib2FyZCByZXNldCB3b3VsZCBkaXNhYmxlIHRoZSBNU1MgbW9kZSByZXN0b3JpbmcgdGhlIGRlZmF1bHQgU0JQUk8KKyAqIG1vZGUuCisgKi8KKwlpZiAoYWVfY29uZmlnLm1zc19iYXNlICE9IC0xKSB7CisJCWlmIChpbml0X2FlZHNwMTZfbXNzKCkgPT0gRkFMU0UpIHsKKwkJCXVuaW5pdF9hZWRzcDE2X21zcygpOworCQl9IGVsc2UgeworCQkJaW5pdGlhbGl6ZWQgPSBUUlVFOworCQl9CisJfQorCisJaWYgKGluaXRpYWxpemVkKQorCQlpbml0aWFsaXplZCA9IGFlZHNwMTZfaW5pdF9ib2FyZCgpOworCXJldHVybiBpbml0aWFsaXplZDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVuaW5pdF9hZWRzcDE2KHZvaWQpCit7CisJaWYgKGFlX2NvbmZpZy5tc3NfYmFzZSAhPSAtMSkKKwkJdW5pbml0X2FlZHNwMTZfbXNzKCk7CisJZWxzZQorCQl1bmluaXRfYWVkc3AxNl9zYigpOworCWlmIChhZV9jb25maWcubXB1X2Jhc2UgIT0gLTEpCisJCXVuaW5pdF9hZWRzcDE2X21wdSgpOworfQorCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8gPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfaXJxID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXNzX2Jhc2UgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfYmFzZSA9IC0xOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiSS9PIGJhc2UgYWRkcmVzcyAoMHgyMjAgMHgyNDApIik7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhpcnEsICJJUlEgbGluZSAoNSA3IDkgMTAgMTEpIik7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJkbWEgbGluZSAoMCAxIDMpIik7Cittb2R1bGVfcGFyYW0obXB1X2lycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXB1X2lycSwgIk1QVS00MDEgSVJRIGxpbmUgKDUgNyA5IDEwIDApIik7Cittb2R1bGVfcGFyYW0obXNzX2Jhc2UsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1zc19iYXNlLCAiTVNTIGVtdWxhdGlvbiBJL08gYmFzZSBhZGRyZXNzICgweDUzMCAweEU4MCkiKTsKK21vZHVsZV9wYXJhbShtcHVfYmFzZSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXB1X2Jhc2UsIk1QVS00MDEgSS9PIGJhc2UgYWRkcmVzcyAoMHgzMDAgMHgzMTAgMHgzMjAgMHgzMzApIik7CitNT0RVTEVfQVVUSE9SKCJSaWNjYXJkbyBGYWNjaGV0dGkgPGZpemJhbkB0aW4uaXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkF1ZGlvIEV4Y2VsIERTUCAxNiBEcml2ZXIgVmVyc2lvbiAiIFZFUlNJT04pOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBkb19pbml0X2FlZHNwMTYodm9pZCkgeworCXByaW50aygiQXVkaW8gRXhjZWwgRFNQIDE2IGluaXQgZHJpdmVyIENvcHlyaWdodCAoQykgUmljY2FyZG8gRmFjY2hldHRpIDE5OTUtOThcbiIpOworCWlmIChpbyA9PSAtMSB8fCBkbWEgPT0gLTEgfHwgaXJxID09IC0xKSB7CisJCXByaW50ayhLRVJOX0lORk8gImFlZHNwMTY6IEkvTywgSVJRIGFuZCBETUEgYXJlIG1hbmRhdG9yeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWFlX2NvbmZpZy5iYXNlX2lvID0gaW87CisJYWVfY29uZmlnLmlycSA9IGlycTsKKwlhZV9jb25maWcuZG1hID0gZG1hOworCisJYWVfY29uZmlnLm1zc19iYXNlID0gbXNzX2Jhc2U7CisJYWVfY29uZmlnLm1wdV9iYXNlID0gbXB1X2Jhc2U7CisJYWVfY29uZmlnLm1wdV9pcnEgPSBtcHVfaXJxOworCisJaWYgKGluaXRfYWVkc3AxNigpID09IEZBTFNFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWVkc3AxNjogaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJLyoKKwkJICogWFhYCisJCSAqIFdoYXQgZXJyb3Igc2hvdWxkIHdlIHJldHVybiBoZXJlID8KKwkJICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfYWVkc3AxNih2b2lkKSB7CisJdW5pbml0X2FlZHNwMTYoKTsKK30KKworbW9kdWxlX2luaXQoZG9faW5pdF9hZWRzcDE2KTsKK21vZHVsZV9leGl0KGNsZWFudXBfYWVkc3AxNik7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hZWRzcDE2KGNoYXIgKnN0cikKK3sKKwkvKiBpbywgaXJxLCBkbWEsIG1zc19pbywgbXB1X2lvLCBtcHVfaXJxICovCisJaW50IGludHNbN107CisJCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCWlvCSA9IGludHNbMV07CisJaXJxCSA9IGludHNbMl07CisJZG1hCSA9IGludHNbM107CisJbXNzX2Jhc2UgPSBpbnRzWzRdOworCW1wdV9iYXNlID0gaW50c1s1XTsKKwltcHVfaXJxCSA9IGludHNbNl07CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFlZHNwMTY9Iiwgc2V0dXBfYWVkc3AxNik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hbGk1NDU1LmMgYi9zb3VuZC9vc3MvYWxpNTQ1NS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOWU2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYWxpNTQ1NS5jCkBAIC0wLDAgKzEsMzczMyBAQAorLyoKKyAqCUFMSSAgYWxpNTQ1NSBhbmQgZnJpZW5kcyBJQ0ggZHJpdmVyIGZvciBMaW51eAorICoJTEVJIEhVIDxMZWlfSHVAYWxpLmNvbS50dz4KKyAqCisgKiAgQnVpbHQgZnJvbToKKyAqCWRyaXZlcnMvc291bmQvaTgxMF9hdWRpbworICoKKyAqICAJVGhlIEFMaSA1NDU1IGlzIHNpbWlsYXIgYnV0IG5vdCBxdWl0ZSBpZGVudGljYWwgdG8gdGhlIEludGVsIElDSAorICoJc2VyaWVzIG9mIGNvbnRyb2xsZXJzLiBJdHMgZWFzaWVyIHRvIGtlZXAgdGhlIGRyaXZlciBzZXBhcmF0ZWQgZnJvbQorICoJdGhlIGk4MTAgZHJpdmVyLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKglpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICoJdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqCShhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICoJR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICoJYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqCisgKglBTGkgNTQ1NSB0aGVvcnkgb2Ygb3BlcmF0aW9uCisgKgorICoJVGhlIGNoaXBzZXQgcHJvdmlkZXMgdGhyZWUgRE1BIGNoYW5uZWxzIHRoYXQgdGFsayB0byBhbiBBQzk3CisgKglDT0RFQyAoQUM5NyBpcyBhIGRpZ2l0YWwvYW5hbG9nIG1peGVyIHN0YW5kYXJkKS4gQXQgaXRzIHNpbXBsZXN0CisgKgl5b3UgZ2V0IDQ4S2h6IGF1ZGlvIHdpdGggYmFzaWMgdm9sdW1lIGFuZCBtaXhlciBjb250cm9scy4gQXQgdGhlCisgKgliZXN0IHlvdSBnZXQgcmF0ZSBhZGFwdGlvbiBpbiB0aGUgY29kZWMuIFdlIHNldCB0aGUgY2FyZCB1cCBzbworICoJdGhhdCB3ZSBuZXZlciB0YWtlIGNvbXBsZXRpb24gaW50ZXJydXB0cyBidXQgaW5zdGVhZCBrZWVwIHRoZSBjYXJkCisgKgljaGFzaW5nIGl0cyB0YWlsIGFyb3VuZCBhIHJpbmcgYnVmZmVyLiBUaGlzIGlzIG5lZWRlZCBmb3IgbW1hcAorICoJbW9kZSBhdWRpbyBhbmQgaGFwcGVucyB0byB3b3JrIHJhdGhlciB3ZWxsIGZvciBub24tbW1hcCBtb2RlcyB0b28uCisgKgorICoJVGhlIGJvYXJkIGhhcyBvbmUgb3V0cHV0IGNoYW5uZWwgZm9yIFBDTSBhdWRpbyAoc3VwcG9ydGVkKSBhbmQKKyAqCWEgc3RlcmVvIGxpbmUgaW4gYW5kIG1vbm8gbWljcm9waG9uZSBpbnB1dC4gQWdhaW4gdGhlc2UgYXJlIG5vcm1hbGx5CisgKglsb2NrZWQgdG8gNDhLaHogb25seS4gUmlnaHQgbm93IHJlY29yZGluZyBpcyBub3QgZmluaXNoZWQuCisgKgorICoJVGhlcmUgaXMgbm8gbWlkaSBzdXBwb3J0LCBubyBzeW50aCBzdXBwb3J0LiBVc2UgdGltaWRpdHkuIFRvIGdldAorICoJZXNkIHdvcmtpbmcgeW91IG5lZWQgdG8gdXNlIGVzZCAtciA0ODAwMCBhcyBpdCB3b24ndCBwcm9iZSA0OEtIegorICoJYnkgZGVmYXVsdC4gbXBnMTIzIGNhbid0IGhhbmRsZSA0OEtoeiBvbmx5IGF1ZGlvIHNvIHVzZSB4bW1zLgorICoKKyAqCUlmIHlvdSBuZWVkIHRvIGZvcmNlIGEgc3BlY2lmaWMgcmF0ZSBzZXQgdGhlIGNsb2NraW5nPSBvcHRpb24KKyAqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2N0eXBlLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0FMSV81NDU1CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTUJMHg1NDU1CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0FMSQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FMSQkweDEwYjkKKyNlbmRpZgorCitzdGF0aWMgaW50IHN0cmljdF9jbG9ja2luZyA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNsb2NraW5nID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY29kZWNfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvbnRyb2xsZXJfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCA9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50IGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2xvYmVsID0gMDsKKworI2RlZmluZSBBRENfUlVOTklORwkxCisjZGVmaW5lIERBQ19SVU5OSU5HCTIKKyNkZWZpbmUgQ09ERUNfU1BESUZPVVRfUlVOTklORyA4CisjZGVmaW5lIENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORyA0CisKKyNkZWZpbmUgU1BESUZfRU5BQkxFX09VVFBVVAk0CS8qIGJpdHMgMCwxIGFyZSBQQ00gKi8KKworI2RlZmluZSBBTEk1NDU1X0ZNVF8xNkJJVAkxCisjZGVmaW5lIEFMSTU0NTVfRk1UX1NURVJFTwkyCisjZGVmaW5lIEFMSTU0NTVfRk1UX01BU0sJMworCisjZGVmaW5lIFNQRElGX09OCTB4MDAwNAorI2RlZmluZSBTVVJSX09OCQkweDAwMTAKKyNkZWZpbmUgQ0VOVEVSX0xGRV9PTgkweDAwMjAKKyNkZWZpbmUgVk9MX01VVEVECTB4ODAwMAorCisKKyNkZWZpbmUgQUxJX1NQRElGX09VVF9DSF9TVEFUVVMgMHhiZgorLyogdGhlIDgxMCdzIGFycmF5IG9mIHBvaW50ZXJzIHRvIGRhdGEgYnVmZmVycyAqLworCitzdHJ1Y3Qgc2dfaXRlbSB7CisjZGVmaW5lIEJVU0FERFJfTUFTSwkweEZGRkZGRkZFCisJdTMyIGJ1c2FkZHI7CisjZGVmaW5lIENPTl9JT0MgCTB4ODAwMDAwMDAJLyogaW50ZXJydXB0IG9uIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgQ09OX0JVRlBBRAkweDQwMDAwMDAwCS8qIHBhZCB1bmRlcnJ1biB3aXRoIGxhc3Qgc2FtcGxlLCBlbHNlIDAgKi8KKyNkZWZpbmUgQ09OX0JVRkxFTl9NQVNLCTB4MDAwMGZmZmYJLyogYnVmZmVyIGxlbmd0aCBpbiBzYW1wbGVzICovCisJdTMyIGNvbnRyb2w7Cit9OworCisvKiBhbiBpbnN0YW5jZSBvZiB0aGUgYWxpIGNoYW5uZWwgKi8KKyNkZWZpbmUgU0dfTEVOIDMyCitzdHJ1Y3QgYWxpX2NoYW5uZWwgeworCS8qIHRoZXNlIHNnIGd1eXMgc2hvdWxkIHByb2JhYmx5IGJlIGFsbG9jYXRlZAorCSAgIHNlcGFyYXRlbHkgYXMgbm9jYWNoZS4gTXVzdCBiZSA4IGJ5dGUgYWxpZ25lZCAqLworCXN0cnVjdCBzZ19pdGVtIHNnW1NHX0xFTl07CS8qIDMyKjggKi8KKwl1MzIgb2Zmc2V0OwkJLyogNCAqLworCXUzMiBwb3J0OwkJLyogNCAqLworCXUzMiB1c2VkOworCXUzMiBudW07Cit9OworCisvKgorICogd2UgaGF2ZSAzIHNlcGFyYXRlIGRtYSBlbmdpbmVzLiAgcGNtIGluLCBwY20gb3V0LCBhbmQgbWljLgorICogZWFjaCBkbWEgZW5naW5lIGhhcyBjb250cm9sbGluZyByZWdpc3RlcnMuICBUaGVzZSBnb29meQorICogbmFtZXMgYXJlIGZyb20gdGhlIGRhdGFzaGVldCwgYnV0IG1ha2UgaXQgZWFzeSB0byB3cml0ZQorICogY29kZSB3aGlsZSBsZWFmaW5nIHRocm91Z2ggaXQuCisgKi8KKworI2RlZmluZSBFTlVNX0VOR0lORShQUkUsRElHKSAJCQkJCQkJCQlcCitlbnVtIHsJCQkJCQkJCQkJCQlcCisJUFJFIyNfQkRCQVIgPQkweCMjRElHIyMwLAkJLyogQnVmZmVyIERlc2NyaXB0b3IgbGlzdCBCYXNlIEFkZHJlc3MgKi8JXAorCVBSRSMjX0NJViA9CTB4IyNESUcjIzQsCQkvKiBDdXJyZW50IEluZGV4IFZhbHVlICovCQkJXAorCVBSRSMjX0xWSSA9CTB4IyNESUcjIzUsCQkvKiBMYXN0IFZhbGlkIEluZGV4ICovCQkJCVwKKwlQUkUjI19TUiA9CTB4IyNESUcjIzYsCQkvKiBTdGF0dXMgUmVnaXN0ZXIgKi8JCQkJXAorCVBSRSMjX1BJQ0IgPQkweCMjRElHIyM4LAkJLyogUG9zaXRpb24gSW4gQ3VycmVudCBCdWZmZXIgKi8JCVwKKwlQUkUjI19DUiA9CTB4IyNESUcjI2IJCS8qIENvbnRyb2wgUmVnaXN0ZXIgKi8JCQkJXAorfQorCitFTlVNX0VOR0lORShPRkYsIDApOwkJLyogT2Zmc2V0cyAqLworRU5VTV9FTkdJTkUoUEksIDQpOwkJLyogUENNIEluICovCitFTlVNX0VOR0lORShQTywgNSk7CQkvKiBQQ00gT3V0ICovCitFTlVNX0VOR0lORShNQywgNik7CQkvKiBNaWMgSW4gKi8KK0VOVU1fRU5HSU5FKENPREVDU1BESUZPVVQsIDcpOwkvKiBDT0RFQyBTUERJRiBPVVQgICovCitFTlVNX0VOR0lORShDT05UUk9MTEVSU1BESUZJTiwgQSk7CS8qIENPTlRST0xMRVIgU1BESUYgSW4gKi8KK0VOVU1fRU5HSU5FKENPTlRST0xMRVJTUERJRk9VVCwgQik7CS8qIENPTlRST0xMRVIgU1BESUYgT1VUICovCisKKworZW51bSB7CisJQUxJX1NDUiA9IDB4MDAsCQkvKiBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlciAqLworCUFMSV9TU1IgPSAweDA0LAkJLyogU3lzdGVtIFN0YXR1cyBSZWdpc3RlciAgKi8KKwlBTElfRE1BQ1IgPSAweDA4LAkvKiBETUEgQ29udHJvbCBSZWdpc3RlciAgICAqLworCUFMSV9GSUZPQ1IxID0gMHgwYywJLyogRklGTyBDb250cm9sIFJlZ2lzdGVyIDEgICovCisJQUxJX0lOVEVSRkFDRUNSID0gMHgxMCwJLyogSW50ZXJmYWNlIENvbnRyb2wgUmVnaXN0ZXIgKi8KKwlBTElfSU5URVJSVVBUQ1IgPSAweDE0LAkvKiBJbnRlcnJ1cHQgY29udHJvbCBSZWdpc3RlciAqLworCUFMSV9JTlRFUlJVUFRTUiA9IDB4MTgsCS8qIEludGVycnVwdCAgU3RhdHVzIFJlZ2lzdGVyICovCisJQUxJX0ZJRk9DUjIgPSAweDFjLAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgMiAgICovCisJQUxJX0NQUiA9IDB4MjAsCQkvKiBDb21tYW5kIFBvcnQgUmVnaXN0ZXIgICAgICovCisJQUxJX1NQUiA9IDB4MjQsCQkvKiBTdGF0dXMgUG9ydCBSZWdpc3RlciAgICAgICovCisJQUxJX0ZJRk9DUjMgPSAweDJjLAkvKiBGSUZPIENvbnRyb2wgUmVnaXN0ZXIgMyAgKi8KKwlBTElfVFRTUiA9IDB4MzAsCS8qIFRyYW5zbWl0IFRhZyBTbG90IFJlZ2lzdGVyICovCisJQUxJX1JUU1IgPSAweDM0LAkvKiBSZWNlaXZlIFRhZyBTbG90ICBSZWdpc3RlciAqLworCUFMSV9DU1BTUiA9IDB4MzgsCS8qIENvbW1hbmQvU3RhdHVzIFBvcnQgU3RhdHVzIFJlZ2lzdGVyICovCisJQUxJX0NBUyA9IDB4M2MsCQkvKiBDb2RlYyBXcml0ZSBTZW1hcGhvcmUgUmVnaXN0ZXIgKi8KKwlBTElfU1BESUZDU1IgPSAweGY4LAkvKiBzcGRpZiBjaGFubmVsIHN0YXR1cyByZWdpc3RlciAgKi8KKwlBTElfU1BESUZJQ1MgPSAweGZjCS8qIHNwZGlmIGludGVyZmFjZSBjb250cm9sL3N0YXR1cyAgKi8KK307CisKKy8vIHgtc3RhdHVzIHJlZ2lzdGVyKHg6cGNtIGluICxwY20gb3V0LCBtaWMgaW4sKQorLyogaW50ZXJydXB0cyBmb3IgYSBkbWEgZW5naW5lICovCisjZGVmaW5lIERNQV9JTlRfRklGTwkJKDE8PDQpCS8qIGZpZm8gdW5kZXIvb3ZlciBmbG93ICovCisjZGVmaW5lIERNQV9JTlRfQ09NUExFVEUJKDE8PDMpCS8qIGJ1ZmZlciByZWFkL3dyaXRlIGNvbXBsZXRlIGFuZCBpb2Mgc2V0ICovCisjZGVmaW5lIERNQV9JTlRfTFZJCQkoMTw8MikJLyogbGFzdCB2YWxpZCBkb25lICovCisjZGVmaW5lIERNQV9JTlRfQ0VMVgkJKDE8PDEpCS8qIGxhc3QgdmFsaWQgaXMgY3VycmVudCAqLworI2RlZmluZSBETUFfSU5UX0RDSAkJKDEpCS8qIERNQSBDb250cm9sbGVyIEhhbHRlZCAoaGFwcGVucyBvbiBMVkkgaW50ZXJydXB0cykgKi8JLy9ub3QgZXF1bHQgaW50ZWwKKyNkZWZpbmUgRE1BX0lOVF9NQVNLIChETUFfSU5UX0ZJRk98RE1BX0lOVF9DT01QTEVURXxETUFfSU5UX0xWSSkKKworLyogaW50ZXJydXB0cyBmb3IgdGhlIHdob2xlIGNoaXAgKi8vLyBieSBpbnRlcnJ1cHQgc3RhdHVzIHJlZ2lzdGVyIGZpbmlzaAorCisjZGVmaW5lIElOVF9TUERJRk9VVCAgICgxPDwyMykJLyogY29udHJvbGxlciBzcGRpZiBvdXQgSU5URVJSVVBUICovCisjZGVmaW5lIElOVF9TUERJRklOICAgKDE8PDIyKQorI2RlZmluZSBJTlRfQ09ERUNTUERJRk9VVCAgICgxPDwxOSkKKyNkZWZpbmUgSU5UX01JQ0lOICAgKDE8PDE4KQorI2RlZmluZSBJTlRfUENNT1VUICAgKDE8PDE3KQorI2RlZmluZSBJTlRfUENNSU4gICAoMTw8MTYpCisjZGVmaW5lIElOVF9DUFJBSVMgICAoMTw8NykKKyNkZWZpbmUgSU5UX1NQUkFJUyAgICgxPDw1KQorI2RlZmluZSBJTlRfR1BJTyAgICAoMTw8MSkKKyNkZWZpbmUgSU5UX01BU0sgICAoSU5UX1NQRElGT1VUfElOVF9DT0RFQ1NQRElGT1VUfElOVF9NSUNJTnxJTlRfUENNT1VUfElOVF9QQ01JTikKKworI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMC4wMmFjIgorCisvKiBtYWdpYyBudW1iZXJzIHRvIHByb3RlY3Qgb3VyIGRhdGEgc3RydWN0dXJlcyAqLworI2RlZmluZSBBTEk1NDU1X0NBUkRfTUFHSUMJCTB4NTA3MjY5NkUJLyogIlByaW4iICovCisjZGVmaW5lIEFMSTU0NTVfU1RBVEVfTUFHSUMJCTB4NjM2NTczNzMJLyogImNlc3MiICovCisjZGVmaW5lIEFMSTU0NTVfRE1BX01BU0sJCTB4ZmZmZmZmZmYJLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLworI2RlZmluZSBOUl9IV19DSAkJCTUJLy9JIHRoaW5rIDUgY2hhbm5lbAorCisvKiBtYXhpbnVtIG51bWJlciBvZiBBQzk3IGNvZGVjcyBjb25uZWN0ZWQsIEFDOTcgMi4wIGRlZmluZWQgNCAqLworI2RlZmluZSBOUl9BQzk3CQkyCisKKy8qIFBsZWFzZSBub3RlIHRoYXQgYW4gOGJpdCBtb25vIHN0cmVhbSBpcyBub3QgdmFsaWQgb24gdGhpcyBjYXJkLCB5b3UgbXVzdCBoYXZlIGEgMTZiaXQgKi8KKy8qIHN0cmVhbSBhdCBhIG1pbmltdW0gZm9yIHRoaXMgY2FyZCB0byBiZSBoYXBweSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaXplW10gPSB7IDEsIDIsIDIsIDQgfTsKKy8qIFNhbXBsZXMgYXJlIDE2Yml0IHZhbHVlcywgc28gd2UgYXJlIHNoaWZ0aW5nIHRvIGEgd29yZCwgbm90IHRvIGEgYnl0ZSwgaGVuY2Ugc2hpZnQgKi8KKy8qIHZhbHVlcyBhcmUgb25lIGxlc3MgdGhhbiBtaWdodCBiZSBleHBlY3RlZCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAtMSwgMCwgMCwgMSB9OworCisjZGVmaW5lIEFMSTU0NTUKK3N0YXRpYyBjaGFyICpjYXJkX25hbWVzW10gPSB7CisJIkFMSSA1NDU1IgorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGFsaV9wY2lfdGJsW10gPSB7CisJe1BDSV9WRU5ET1JfSURfQUxJLCBQQ0lfREVWSUNFX0lEX0FMSV81NDU1LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBTEk1NDU1fSwKKwl7MCx9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYWxpX3BjaV90YmwpOworCisjaWZkZWYgQ09ORklHX1BNCisjZGVmaW5lIFBNX1NVU1BFTkRFRChjYXJkKSAoY2FyZC0+cG1fc3VzcGVuZGVkKQorI2Vsc2UKKyNkZWZpbmUgUE1fU1VTUEVOREVEKGNhcmQpICgwKQorI2VuZGlmCisKKy8qICJzb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AgKi8KK3N0cnVjdCBhbGlfc3RhdGUgeworCXVuc2lnbmVkIGludCBtYWdpYzsKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQ7CS8qIENhcmQgaW5mbyAqLworCisJLyogc2luZ2xlIG9wZW4gbG9jayBtZWNoYW5pc20sIG9ubHkgdXNlZCBmb3IgcmVjb3JkaW5nICovCisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwkvKiBmaWxlIG1vZGUgKi8KKwltb2RlX3Qgb3Blbl9tb2RlOworCisJLyogdmlydHVhbCBjaGFubmVsIG51bWJlciAqLworCWludCB2aXJ0OworCisjaWZkZWYgQ09ORklHX1BNCisJdW5zaWduZWQgaW50IHBtX3NhdmVkX2RhY19yYXRlLCBwbV9zYXZlZF9hZGNfcmF0ZTsKKyNlbmRpZgorCXN0cnVjdCBkbWFidWYgeworCQkvKiB3YXZlIHNhbXBsZSBzdHVmZiAqLworCQl1bnNpZ25lZCBpbnQgcmF0ZTsKKwkJdW5zaWduZWQgY2hhciBmbXQsIGVuYWJsZSwgdHJpZ2dlcjsKKworCQkvKiBoYXJkd2FyZSBjaGFubmVsICovCisJCXN0cnVjdCBhbGlfY2hhbm5lbCAqcmVhZF9jaGFubmVsOworCQlzdHJ1Y3QgYWxpX2NoYW5uZWwgKndyaXRlX2NoYW5uZWw7CisJCXN0cnVjdCBhbGlfY2hhbm5lbCAqY29kZWNfc3BkaWZvdXRfY2hhbm5lbDsKKwkJc3RydWN0IGFsaV9jaGFubmVsICpjb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWw7CisKKwkJLyogT1NTIGJ1ZmZlciBtYW5hZ2VtZW50IHN0dWZmICovCisJCXZvaWQgKnJhd2J1ZjsKKwkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCQl1bnNpZ25lZCBidWZvcmRlcjsKKwkJdW5zaWduZWQgbnVtZnJhZzsKKwkJdW5zaWduZWQgZnJhZ3NoaWZ0OworCisJCS8qIG91ciBidWZmZXIgYWN0cyBsaWtlIGEgY2lyY3VsYXIgcmluZyAqLworCQl1bnNpZ25lZCBod3B0cjsJLyogd2hlcmUgZG1hIGxhc3Qgc3RhcnRlZCwgdXBkYXRlZCBieSB1cGRhdGVfcHRyICovCisJCXVuc2lnbmVkIHN3cHRyOwkvKiB3aGVyZSBkcml2ZXIgbGFzdCBjbGVhci9maWxsZWQsIHVwZGF0ZWQgYnkgcmVhZC93cml0ZSAqLworCQlpbnQgY291bnQ7CS8qIGJ5dGVzIHRvIGJlIGNvbnN1bWVkIG9yIGJlZW4gZ2VuZXJhdGVkIGJ5IGRtYSBtYWNoaW5lICovCisJCXVuc2lnbmVkIHRvdGFsX2J5dGVzOwkvKiB0b3RhbCBieXRlcyBkbWFlZCBieSBoYXJkd2FyZSAqLworCisJCXVuc2lnbmVkIGVycm9yOwkvKiBudW1iZXIgb2Ygb3Zlci91bmRlcnJ1bnMgKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsJLyogcHV0IHByb2Nlc3Mgb24gd2FpdCBxdWV1ZSB3aGVuIG5vIG1vcmUgc3BhY2UgaW4gYnVmZmVyICovCisKKwkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQkvKiB3aGF0IHRoZSBoYXJkd2FyZSB1c2VzICovCisJCXVuc2lnbmVkIGRtYXNpemU7CisJCXVuc2lnbmVkIGZyYWdzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKworCQkvKiB3aGF0IHdlIHRlbGwgdGhlIHVzZXIgdG8gZXhwZWN0ICovCisJCXVuc2lnbmVkIHVzZXJmcmFnczsKKwkJdW5zaWduZWQgdXNlcmZyYWdzaXplOworCisJCS8qIE9TUyBzdHVmZiAqLworCQl1bnNpZ25lZCBtYXBwZWQ6MTsKKwkJdW5zaWduZWQgcmVhZHk6MTsKKwkJdW5zaWduZWQgdXBkYXRlX2ZsYWc7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaXplOworCQl1bnNpZ25lZCBvc3NtYXhmcmFnczsKKwkJdW5zaWduZWQgc3ViZGl2aXNpb247CisJfSBkbWFidWY7Cit9OworCisKK3N0cnVjdCBhbGlfY2FyZCB7CisJc3RydWN0IGFsaV9jaGFubmVsIGNoYW5uZWxbNV07CisJdW5zaWduZWQgaW50IG1hZ2ljOworCisJLyogV2Uga2VlcCBhbGk1NDU1IGNhcmRzIGluIGEgbGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3QgYWxpX2NhcmQgKm5leHQ7CisKKwkvKiBUaGUgYWxpIGhhcyBhIGNlcnRhaW4gYW1vdW50IG9mIGNyb3NzIGNoYW5uZWwgaW50ZXJhY3Rpb24KKwkgICBzbyB3ZSB1c2UgYSBzaW5nbGUgcGVyIGNhcmQgbG9jayAqLworCXNwaW5sb2NrX3QgbG9jazsKKwlzcGlubG9ja190IGFjOTdfbG9jazsKKworCS8qIFBDSSBkZXZpY2Ugc3R1ZmYgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldjsKKwl1MTYgcGNpX2lkOworI2lmZGVmIENPTkZJR19QTQorCXUxNiBwbV9zdXNwZW5kZWQ7CisJaW50IHBtX3NhdmVkX21peGVyX3NldHRpbmdzW1NPVU5EX01JWEVSX05SREVWSUNFU11bTlJfQUM5N107CisjZW5kaWYKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgZGV2X2F1ZGlvOworCisJLyogc3RydWN0dXJlcyBmb3IgYWJzdHJhY3Rpb24gb2YgaGFyZHdhcmUgZmFjaWxpdGllcywgY29kZWNzLCBiYW5rcyBhbmQgY2hhbm5lbHMgKi8KKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKKwlzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZXNbTlJfSFdfQ0hdOworCisJdTE2IGFjOTdfZmVhdHVyZXM7CisJdTE2IGFjOTdfc3RhdHVzOworCXUxNiBjaGFubmVsczsKKworCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXVuc2lnbmVkIGxvbmcgaW9iYXNlOworCisJdTMyIGlycTsKKworCS8qIEZ1bmN0aW9uIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgYWxpX2NoYW5uZWwgKigqYWxsb2NfcGNtX2NoYW5uZWwpIChzdHJ1Y3QgYWxpX2NhcmQgKik7CisJc3RydWN0IGFsaV9jaGFubmVsICooKmFsbG9jX3JlY19wY21fY2hhbm5lbCkgKHN0cnVjdCBhbGlfY2FyZCAqKTsKKwlzdHJ1Y3QgYWxpX2NoYW5uZWwgKigqYWxsb2NfcmVjX21pY19jaGFubmVsKSAoc3RydWN0IGFsaV9jYXJkICopOworCXN0cnVjdCBhbGlfY2hhbm5lbCAqKCphbGxvY19jb2RlY19zcGRpZm91dF9jaGFubmVsKSAoc3RydWN0IGFsaV9jYXJkICopOworCXN0cnVjdCBhbGlfY2hhbm5lbCAqKCphbGxvY19jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwpIChzdHJ1Y3QgIGFsaV9jYXJkICopOworCXZvaWQgKCpmcmVlX3BjbV9jaGFubmVsKSAoc3RydWN0IGFsaV9jYXJkICosIGludCBjaGFuKTsKKworCS8qIFdlIGhhdmUgYSAqdmVyeSogbG9uZyBpbml0IHRpbWUgcG9zc2libHksIHNvIHVzZSB0aGlzIHRvIGJsb2NrICovCisJLyogYXR0ZW1wdHMgdG8gb3BlbiBvdXIgZGV2aWNlcyBiZWZvcmUgd2UgYXJlIHJlYWR5IChzdG9wcyBvb3BzJ2VzKSAqLworCWludCBpbml0aWFsaXppbmc7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYWxpX2NhcmQgKmRldnMgPSBOVUxMOworCitzdGF0aWMgaW50IGFsaV9vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGFsaV9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIHUxNiBhbGlfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKTsKK3N0YXRpYyB2b2lkIGFsaV9hYzk3X3NldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiBkYXRhKTsKKworc3RhdGljIHN0cnVjdCBhbGlfY2hhbm5lbCAqYWxpX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+Y2hhbm5lbFsxXS51c2VkID09IDEpCisJCXJldHVybiBOVUxMOworCWNhcmQtPmNoYW5uZWxbMV0udXNlZCA9IDE7CisJcmV0dXJuICZjYXJkLT5jaGFubmVsWzFdOworfQorCitzdGF0aWMgc3RydWN0IGFsaV9jaGFubmVsICphbGlfYWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+Y2hhbm5lbFswXS51c2VkID09IDEpCisJCXJldHVybiBOVUxMOworCWNhcmQtPmNoYW5uZWxbMF0udXNlZCA9IDE7CisJcmV0dXJuICZjYXJkLT5jaGFubmVsWzBdOworfQorCitzdGF0aWMgc3RydWN0IGFsaV9jaGFubmVsICphbGlfYWxsb2NfcmVjX21pY19jaGFubmVsKHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlpZiAoY2FyZC0+Y2hhbm5lbFsyXS51c2VkID09IDEpCisJCXJldHVybiBOVUxMOworCWNhcmQtPmNoYW5uZWxbMl0udXNlZCA9IDE7CisJcmV0dXJuICZjYXJkLT5jaGFubmVsWzJdOworfQorCitzdGF0aWMgc3RydWN0IGFsaV9jaGFubmVsICphbGlfYWxsb2NfY29kZWNfc3BkaWZvdXRfY2hhbm5lbChzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQpCit7CisJaWYgKGNhcmQtPmNoYW5uZWxbM10udXNlZCA9PSAxKQorCQlyZXR1cm4gTlVMTDsKKwljYXJkLT5jaGFubmVsWzNdLnVzZWQgPSAxOworCXJldHVybiAmY2FyZC0+Y2hhbm5lbFszXTsKK30KKworc3RhdGljIHN0cnVjdCBhbGlfY2hhbm5lbCAqYWxpX2FsbG9jX2NvbnRyb2xsZXJfc3BkaWZvdXRfY2hhbm5lbChzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQpCit7CisJaWYgKGNhcmQtPmNoYW5uZWxbNF0udXNlZCA9PSAxKQorCQlyZXR1cm4gTlVMTDsKKwljYXJkLT5jaGFubmVsWzRdLnVzZWQgPSAxOworCXJldHVybiAmY2FyZC0+Y2hhbm5lbFs0XTsKK30KK3N0YXRpYyB2b2lkIGFsaV9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCBhbGlfY2FyZCAqY2FyZCwgaW50IGNoYW5uZWwpCit7CisJY2FyZC0+Y2hhbm5lbFtjaGFubmVsXS51c2VkID0gMDsKK30KKworCisvL2FkZCBzdXBwb3J0ICBjb2RlYyBzcGRpZiBvdXQgCitzdGF0aWMgaW50IGFsaV92YWxpZF9zcGRpZl9yYXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgaW50IHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBpZCA9IDBMOworCisJaWQgPSAoYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1ZFTkRPUl9JRDEpIDw8IDE2KTsKKwlpZCB8PSBhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfVkVORE9SX0lEMikgJiAweGZmZmY7CisJc3dpdGNoIChpZCkgeworCWNhc2UgMHg0MTQ0NTM2MToJLyogQUQxODg2ICovCisJCWlmIChyYXRlID09IDQ4MDAwKSB7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIDB4NDE0YzQ3MjA6CS8qIEFMQzY1MCAqLworCQlpZiAocmF0ZSA9PSA0ODAwMCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoJCS8qIGFsbCBvdGhlciBjb2RlY3MsIHVudGlsIHdlIGtub3cgb3RoZXJ3aWFlICovCisJCWlmIChyYXRlID09IDQ4MDAwIHx8IHJhdGUgPT0gNDQxMDAgfHwgcmF0ZSA9PSAzMjAwMCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJYnJlYWs7CisJfQorCXJldHVybiAoMCk7Cit9CisKKy8qIGFsaV9zZXRfc3BkaWZfb3V0cHV0CisgKiAKKyAqICBDb25maWd1cmUgdGhlIFMvUERJRiBvdXRwdXQgdHJhbnNtaXR0ZXIuIFdoZW4gd2UgdHVybiBvbgorICogIFMvUERJRiwgd2UgdHVybiBvZmYgdGhlIGFuYWxvZyBvdXRwdXQuIFRoaXMgbWF5IG5vdCBiZQorICogIHRoZSByaWdodCB0aGluZyB0byBkby4KKyAqCisgKiAgQXNzdW1wdGlvbnM6CisgKiAgICAgVGhlIERTUCBzYW1wbGUgcmF0ZSBtdXN0IGFscmVhZHkgYmUgc2V0IHRvIGEgc3VwcG9ydGVkCisgKiAgICAgUy9QRElGIHJhdGUgKDMya0h6LCA0NC4xa0h6LCBvciA0OGtIeikgb3Igd2UgYWJvcnQuCisgKi8KK3N0YXRpYyB2b2lkIGFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlLCBpbnQgc2xvdHMsCisJCQkJIGludCByYXRlKQoreworCWludCB2b2w7CisJaW50IGF1ZF9yZWc7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gc3RhdGUtPmNhcmQtPmFjOTdfY29kZWNbMF07CisKKwlpZiAoIShzdGF0ZS0+Y2FyZC0+YWM5N19mZWF0dXJlcyAmIDQpKSB7CisJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmPSB+U1BESUZfT047CisJfSBlbHNlIHsKKwkJaWYgKHNsb3RzID09IC0xKSB7CS8qIFR1cm4gb2ZmIFMvUERJRiAqLworCQkJYXVkX3JlZyA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCQkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUywgKGF1ZF9yZWcgJiB+QUM5N19FQV9TUERJRikpOworCisJCQkvKiBJZiB0aGUgdm9sdW1lIHdhc24ndCBtdXRlZCBiZWZvcmUgd2UgdHVybmVkIG9uIFMvUERJRiwgdW5tdXRlIGl0ICovCisJCQlpZiAoIShzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBWT0xfTVVURUQpKSB7CisJCQkJYXVkX3JlZyA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTyk7CisJCQkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLAorCQkJCQkgICAgIChhdWRfcmVnICYgflZPTF9NVVRFRCkpOworCQkJfQorCQkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICY9IH4oVk9MX01VVEVEIHwgU1BESUZfT04pOworCQkJcmV0dXJuOworCQl9CisKKwkJdm9sID0gYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPKTsKKwkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzID0gdm9sICYgVk9MX01VVEVEOworCisJCS8qIFNldCBTL1BESUYgdHJhbnNtaXR0ZXIgc2FtcGxlIHJhdGUgKi8KKwkJYXVkX3JlZyA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19TUERJRl9DT05UUk9MKTsKKwkJc3dpdGNoIChyYXRlKSB7CisJCWNhc2UgMzIwMDA6CisJCQlhdWRfcmVnID0gKGF1ZF9yZWcgJiBBQzk3X1NDX1NQU1JfTUFTSykgfCBBQzk3X1NDX1NQU1JfMzJLOworCQkJYnJlYWs7CisJCWNhc2UgNDQxMDA6CisJCQlhdWRfcmVnID0gKGF1ZF9yZWcgJiBBQzk3X1NDX1NQU1JfTUFTSykgfCBBQzk3X1NDX1NQU1JfNDRLOworCQkJYnJlYWs7CisJCWNhc2UgNDgwMDA6CisJCQlhdWRfcmVnID0gKGF1ZF9yZWcgJiBBQzk3X1NDX1NQU1JfTUFTSykgfCBBQzk3X1NDX1NQU1JfNDhLOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiB0dXJuIG9mZiBTL1BESUYgKi8KKwkJCWF1ZF9yZWcgPSBhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIChhdWRfcmVnICYgfkFDOTdfRUFfU1BESUYpKTsKKwkJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmPSB+U1BESUZfT047CisJCQlyZXR1cm47CisJCX0KKworCQlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfU1BESUZfQ09OVFJPTCwgYXVkX3JlZyk7CisKKwkJYXVkX3JlZyA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCQlhdWRfcmVnID0gKGF1ZF9yZWcgJiBBQzk3X0VBX1NMT1RfTUFTSykgfCBzbG90cyB8IEFDOTdfRUFfU1BESUY7CisJCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIGF1ZF9yZWcpOworCisJCWF1ZF9yZWcgPSBhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJCWF1ZF9yZWcgfD0gMHgwMDAyOworCQlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgYXVkX3JlZyk7CisJCXVkZWxheSgxKTsKKworCQlzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgfD0gU1BESUZfT047CisKKwkJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb25maWd1cmF0aW9uIGlzIHZhbGlkICovCisJCWF1ZF9yZWcgPSBhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJaWYgKCEoYXVkX3JlZyAmIDB4MDQwMCkpIHsKKwkJCS8qIHR1cm4gb2ZmIFMvUERJRiAqLworCQkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUywgKGF1ZF9yZWcgJiB+QUM5N19FQV9TUERJRikpOworCQkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICY9IH5TUERJRl9PTjsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJYXVkX3JlZyA9IGFsaV9hYzk3X2dldChjb2RlYywgMHg2YSk7CisJCQlhbGlfYWM5N19zZXQoY29kZWMsIDB4NmEsIChhdWRfcmVnICYgMHhlZmZmKSk7CisJCX0KKwkJLyogTXV0ZSB0aGUgYW5hbG9nIG91dHB1dCAqLworCQkvKiBTaG91bGQgdGhpcyBvbmx5IG11dGUgdGhlIFBDTSB2b2x1bWU/Pz8gKi8KKwl9Cit9CisKKy8qIGFsaV9zZXRfZGFjX2NoYW5uZWxzCisgKgorICogIENvbmZpZ3VyZSB0aGUgY29kZWMncyBtdWx0aS1jaGFubmVsIERBQ3MKKyAqCisgKiAgVGhlIGxvZ2ljIGlzIGJhY2t3YXJkcy4gU2V0dGluZyB0aGUgYml0IHRvIDEgdHVybnMgb2ZmIHRoZSBEQUMuIAorICoKKyAqICBXaGF0IGFib3V0IHRoZSBJQ0g/IFdlIGN1cnJlbnRseSBjb25maWd1cmUgaXQgdXNpbmcgdGhlCisgKiAgU05EQ1RMX0RTUF9DSEFOTkVMUyBpb2N0bC4gIElmIHdlJ3JlIHR1cm5uaW5nIG9uIHRoZSBEQUMsIAorICogIGRvZXMgdGhhdCBpbXBseSB0aGF0IHdlIHdhbnQgdGhlIElDSCBzZXQgdG8gc3VwcG9ydAorICogIHRoZXNlIGNoYW5uZWxzPworICogIAorICogIFRPRE86CisgKiAgICB2YWlsaWRhdGUgdGhhdCB0aGUgY29kZWMgcmVhbGx5IHN1cHBvcnRzIHRoZXNlIERBQ3MKKyAqICAgIGJlZm9yZSB0dXJuaW5nIHRoZW0gb24uIAorICovCitzdGF0aWMgdm9pZCBhbGlfc2V0X2RhY19jaGFubmVscyhzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSwgaW50IGNoYW5uZWwpCit7CisJaW50IGF1ZF9yZWc7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gc3RhdGUtPmNhcmQtPmFjOTdfY29kZWNbMF07CisKKwlhdWRfcmVnID0gYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJYXVkX3JlZyB8PSBBQzk3X0VBX1BSSSB8IEFDOTdfRUFfUFJKIHwgQUM5N19FQV9QUks7CisJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICY9IH4oU1VSUl9PTiB8IENFTlRFUl9MRkVfT04pOworCisJc3dpdGNoIChjaGFubmVsKSB7CisJY2FzZSAyOgkJLyogYWx3YXlzIGVuYWJsZWQgKi8KKwkJYnJlYWs7CisJY2FzZSA0OgorCQlhdWRfcmVnICY9IH5BQzk3X0VBX1BSSjsKKwkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzIHw9IFNVUlJfT047CisJCWJyZWFrOworCWNhc2UgNjoKKwkJYXVkX3JlZyAmPSB+KEFDOTdfRUFfUFJKIHwgQUM5N19FQV9QUkkgfCBBQzk3X0VBX1BSSyk7CisJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyB8PSBTVVJSX09OIHwgQ0VOVEVSX0xGRV9PTjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIGF1ZF9yZWcpOworCit9CisKKy8qIHNldCBwbGF5YmFjayBzYW1wbGUgcmF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBhbGlfc2V0X2RhY19yYXRlKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdTMyIG5ld19yYXRlOworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IHN0YXRlLT5jYXJkLT5hYzk3X2NvZGVjWzBdOworCisJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiAweDAwMDEpKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IGNsb2NraW5nOworCQlyZXR1cm4gY2xvY2tpbmc7CisJfQorCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgODAwMCkKKwkJcmF0ZSA9IDgwMDA7CisJZG1hYnVmLT5yYXRlID0gcmF0ZTsKKworCS8qCisJICogICAgICBBZGp1c3QgZm9yIG1pc2Nsb2NrZWQgY3JhcAorCSAqLworCisJcmF0ZSA9IChyYXRlICogY2xvY2tpbmcpIC8gNDgwMDA7CisKKwlpZiAoc3RyaWN0X2Nsb2NraW5nICYmIHJhdGUgPCA4MDAwKSB7CisJCXJhdGUgPSA4MDAwOworCQlkbWFidWYtPnJhdGUgPSAocmF0ZSAqIDQ4MDAwKSAvIGNsb2NraW5nOworCX0KKworCW5ld19yYXRlID0gYWM5N19zZXRfZGFjX3JhdGUoY29kZWMsIHJhdGUpOworCWlmIChuZXdfcmF0ZSAhPSByYXRlKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IChuZXdfcmF0ZSAqIDQ4MDAwKSAvIGNsb2NraW5nOworCX0KKwlyYXRlID0gbmV3X3JhdGU7CisJcmV0dXJuIGRtYWJ1Zi0+cmF0ZTsKK30KKworLyogc2V0IHJlY29yZGluZyBzYW1wbGUgcmF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBhbGlfc2V0X2FkY19yYXRlKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlLAorCQkJCSAgICAgdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdTMyIG5ld19yYXRlOworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IHN0YXRlLT5jYXJkLT5hYzk3X2NvZGVjWzBdOworCisJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiAweDAwMDEpKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IGNsb2NraW5nOworCQlyZXR1cm4gY2xvY2tpbmc7CisJfQorCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgODAwMCkKKwkJcmF0ZSA9IDgwMDA7CisJZG1hYnVmLT5yYXRlID0gcmF0ZTsKKworCS8qCisJICogICAgICBBZGp1c3QgZm9yIG1pc2Nsb2NrZWQgY3JhcAorCSAqLworCisJcmF0ZSA9IChyYXRlICogY2xvY2tpbmcpIC8gNDgwMDA7CisJaWYgKHN0cmljdF9jbG9ja2luZyAmJiByYXRlIDwgODAwMCkgeworCQlyYXRlID0gODAwMDsKKwkJZG1hYnVmLT5yYXRlID0gKHJhdGUgKiA0ODAwMCkgLyBjbG9ja2luZzsKKwl9CisKKwluZXdfcmF0ZSA9IGFjOTdfc2V0X2FkY19yYXRlKGNvZGVjLCByYXRlKTsKKworCWlmIChuZXdfcmF0ZSAhPSByYXRlKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IChuZXdfcmF0ZSAqIDQ4MDAwKSAvIGNsb2NraW5nOworCQlyYXRlID0gbmV3X3JhdGU7CisJfQorCXJldHVybiBkbWFidWYtPnJhdGU7Cit9CisKKy8qIHNldCBjb2RlYyBpbmRlcGVuZGVudCBzcGRpZm91dCBzYW1wbGUgcmF0ZSAqLworc3RhdGljIHVuc2lnbmVkIGludCBhbGlfc2V0X2NvZGVjc3BkaWZvdXRfcmF0ZShzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSwKKwkJCQkJICAgICAgIHVuc2lnbmVkIGludCByYXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCisJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiAweDAwMDEpKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IGNsb2NraW5nOworCQlyZXR1cm4gY2xvY2tpbmc7CisJfQorCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgODAwMCkKKwkJcmF0ZSA9IDgwMDA7CisJZG1hYnVmLT5yYXRlID0gcmF0ZTsKKworCXJldHVybiBkbWFidWYtPnJhdGU7Cit9CisKKy8qIHNldCAgY29udHJvbGxlciBpbmRlcGVuZGVudCBzcGRpZiBvdXQgZnVuY3Rpb24gc2FtcGxlIHJhdGUgKi8KK3N0YXRpYyB2b2lkIGFsaV9zZXRfc3BkaWZvdXRfcmF0ZShzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSwKKwkJCQkgIHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIGNoYXIgY2hfc3Rfc2VsOworCXVuc2lnbmVkIHNob3J0IHN0YXR1c19yYXRlOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSA0NDEwMDoKKwkJc3RhdHVzX3JhdGUgPSAwOworCQlicmVhazsKKwljYXNlIDMyMDAwOgorCQlzdGF0dXNfcmF0ZSA9IDB4MzAwOworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCWRlZmF1bHQ6CisJCXN0YXR1c19yYXRlID0gMHgyMDA7CisJCWJyZWFrOworCX0KKworCWNoX3N0X3NlbCA9IGluYihzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX1NQRElGSUNTKSAmIEFMSV9TUERJRl9PVVRfQ0hfU1RBVFVTOwkvL3NlbGVjdCBzcGRpZl9vdXQKKworCWNoX3N0X3NlbCB8PSAweDgwOwkvL3NlbGVjdCByaWdodAorCW91dGIoY2hfc3Rfc2VsLCAoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TUERJRklDUykpOworCW91dGIoc3RhdHVzX3JhdGUgfCAweDIwLCAoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TUERJRkNTUiArIDIpKTsKKworCWNoX3N0X3NlbCAmPSAofjB4ODApOwkvL3NlbGVjdCBsZWZ0CisJb3V0YihjaF9zdF9zZWwsIChzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX1NQRElGSUNTKSk7CisJb3V0dyhzdGF0dXNfcmF0ZSB8IDB4MTAsIChzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX1NQRElGQ1NSICsgMikpOworfQorCisvKiBnZXQgY3VycmVudCBwbGF5YmFjay9yZWNvcmRpbmcgZG1hIGJ1ZmZlciBwb2ludGVyIChieXRlIG9mZnNldCBmcm9tIExCQSksCisgICBjYWxsZWQgd2l0aCBzcGlubG9jayBoZWxkISAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGFsaV9nZXRfZG1hX2FkZHIoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUsIGludCByZWMpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgaW50IGNpdiwgb2Zmc2V0LCBwb3J0LCBwb3J0X3BpY2I7CisJdW5zaWduZWQgaW50IGRhdGE7CisKKwlpZiAoIWRtYWJ1Zi0+ZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCWlmIChyZWMgPT0gMSkKKwkJcG9ydCA9IHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBkbWFidWYtPnJlYWRfY2hhbm5lbC0+cG9ydDsKKwllbHNlIGlmIChyZWMgPT0gMikKKwkJcG9ydCA9IHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBkbWFidWYtPmNvZGVjX3NwZGlmb3V0X2NoYW5uZWwtPnBvcnQ7CisJZWxzZSBpZiAocmVjID09IDMpCisJCXBvcnQgPSBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgZG1hYnVmLT5jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwtPnBvcnQ7CisJZWxzZQorCQlwb3J0ID0gc3RhdGUtPmNhcmQtPmlvYmFzZSArIGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbC0+cG9ydDsKKworCXBvcnRfcGljYiA9IHBvcnQgKyBPRkZfUElDQjsKKworCWRvIHsKKwkJY2l2ID0gaW5iKHBvcnQgKyBPRkZfQ0lWKSAmIDMxOworCQlvZmZzZXQgPSBpbncocG9ydF9waWNiKTsKKwkJLyogTXVzdCBoYXZlIGEgZGVsYXkgaGVyZSEgKi8KKwkJaWYgKG9mZnNldCA9PSAwKQorCQkJdWRlbGF5KDEpOworCisJCS8qIFJlcmVhZCBib3RoIHJlZ2lzdGVycyBhbmQgbWFrZSBzdXJlIHRoYXQgdGhhdCB0b3RhbAorCQkgKiBvZmZzZXQgZnJvbSB0aGUgZmlyc3QgcmVhZGluZyB0byB0aGUgc2Vjb25kIGlzIDAuCisJCSAqIFRoZXJlIGlzIGFuIGlzc3VlIHdpdGggU2lTIGhhcmR3YXJlIHdoZXJlIGl0IHdpbGwgY291bnQKKwkJICogcGljYiBkb3duIHRvIDAsIHRoZW4gdXBkYXRlIGNpdiB0byB0aGUgbmV4dCB2YWx1ZSwKKwkJICogdGhlbiBzZXQgdGhlIG5ldyBwaWNiIHRvIGZyYWdzaXplIGJ5dGVzLiAgV2UgY2FuIGNhdGNoCisJCSAqIGl0IGJldHdlZW4gdGhlIGNpdiB1cGRhdGUgYW5kIHRoZSBwaWNiIHVwZGF0ZSwgbWFraW5nCisJCSAqIGl0IGxvb2sgYXMgdGhvdWdoIHdlIGFyZSAxIGZyYWdzaXplIGFoZWFkIG9mIHdoZXJlIHdlCisJCSAqIGFyZS4gIFRoZSBuZXh0IHRvIHdlIGdldCB0aGUgYWRkcmVzcyB0aG91Z2gsIGl0IHdpbGwKKwkJICogYmUgYmFjayBpbiB0aGRlbGF5IGlzIG1vcmUgdGhhbiBsb25nIGVub3VnaAorCQkgKiB0aGF0IHdlIHdvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGNoaXAgc3RpbGwgYmVpbmcKKwkJICogb3V0IG9mIHN5bmMgd2l0aCByZWFsaXR5IDstKQorCQkgKi8KKwl9IHdoaWxlIChjaXYgIT0gKGluYihwb3J0ICsgT0ZGX0NJVikgJiAzMSkgfHwgb2Zmc2V0ICE9IGludyhwb3J0X3BpY2IpKTsKKworCWRhdGEgPSAoKGNpdiArIDEpICogZG1hYnVmLT5mcmFnc2l6ZSAtICgyICogb2Zmc2V0KSkgJSBkbWFidWYtPmRtYXNpemU7CisJaWYgKGludyhwb3J0X3BpY2IpID09IDApCisJCWRhdGEgLT0gMjA0ODsKKworCXJldHVybiBkYXRhOworfQorCisvKiBTdG9wIHJlY29yZGluZyAobG9jayBoZWxkKSAqLworc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF9hZGMoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisKKwlkbWFidWYtPmVuYWJsZSAmPSB+QURDX1JVTk5JTkc7CisKKwlvdXRsKCgxIDw8IDE4KSB8ICgxIDw8IDE2KSwgY2FyZC0+aW9iYXNlICsgQUxJX0RNQUNSKTsKKwl1ZGVsYXkoMSk7CisKKwlvdXRiKDAsIGNhcmQtPmlvYmFzZSArIFBJX0NSKTsKKwl3aGlsZSAoaW5iKGNhcmQtPmlvYmFzZSArIFBJX0NSKSAhPSAwKTsKKworCS8vIG5vdyBjbGVhciBhbnkgbGF0ZW50IGludGVycnVwdCBiaXRzIChsaWtlIHRoZSBoYWx0IGJpdCkKKwlvdXRiKGluYihjYXJkLT5pb2Jhc2UgKyBQSV9TUikgfCAweDAwMWUsIGNhcmQtPmlvYmFzZSArIFBJX1NSKTsKKwlvdXRsKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpICYgSU5UX1BDTUlOLCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJX19zdG9wX2FkYyhzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdGFydF9hZGMoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisKKwlpZiAoZG1hYnVmLT5jb3VudCA8IGRtYWJ1Zi0+ZG1hc2l6ZSAmJiBkbWFidWYtPnJlYWR5CisJICAgICYmICFkbWFidWYtPmVuYWJsZSAmJiAoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9JTlBVVCkpIHsKKwkJZG1hYnVmLT5lbmFibGUgfD0gQURDX1JVTk5JTkc7CisJCW91dGIoKDEgPDwgNCkgfCAoMSA8PCAyKSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIFBJX0NSKTsKKwkJaWYgKHN0YXRlLT5jYXJkLT5jaGFubmVsWzBdLnVzZWQgPT0gMSkKKwkJCW91dGwoMSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9ETUFDUik7CS8vIERNQSBDT05UUk9MIFJFR0lTVFJFUgorCQl1ZGVsYXkoMTAwKTsKKwkJaWYgKHN0YXRlLT5jYXJkLT5jaGFubmVsWzJdLnVzZWQgPT0gMSkKKwkJCW91dGwoKDEgPDwgMiksIHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfRE1BQ1IpOwkvL0RNQSBDT05UUk9MIFJFR0lTVEVSCisJCXVkZWxheSgxMDApOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RhcnRfYWRjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIHN0b3AgcGxheWJhY2sgKGxvY2sgaGVsZCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3BfZGFjKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCisJZG1hYnVmLT5lbmFibGUgJj0gfkRBQ19SVU5OSU5HOworCW91dGwoMHgwMDAyMDAwMCwgY2FyZC0+aW9iYXNlICsgMHgwOCk7CisJb3V0YigwLCBjYXJkLT5pb2Jhc2UgKyBQT19DUik7CisJd2hpbGUgKGluYihjYXJkLT5pb2Jhc2UgKyBQT19DUikgIT0gMCkKKwkJY3B1X3JlbGF4KCk7CisKKwlvdXRiKGluYihjYXJkLT5pb2Jhc2UgKyBQT19TUikgfCAweDAwMWUsIGNhcmQtPmlvYmFzZSArIFBPX1NSKTsKKworCW91dGwoaW5sKGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUlJVUFRTUikgJiBJTlRfUENNT1VULCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJX19zdG9wX2RhYyhzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdGFydF9kYWMoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJaWYgKGRtYWJ1Zi0+Y291bnQgPiAwICYmIGRtYWJ1Zi0+cmVhZHkgJiYgIWRtYWJ1Zi0+ZW5hYmxlICYmCisJICAgIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX09VVFBVVCkpIHsKKwkJZG1hYnVmLT5lbmFibGUgfD0gREFDX1JVTk5JTkc7CisJCW91dGIoKDEgPDwgNCkgfCAoMSA8PCAyKSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIFBPX0NSKTsKKwkJb3V0bCgoMSA8PCAxKSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIDB4MDgpOwkvL2RtYSBjb250cm9sIHJlZ2lzdGVyCisJfQorfQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RhcnRfZGFjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIHN0b3AgY29kZWMgYW5kIGNvbnRyb2xsZXIgc3BkaWYgb3V0ICAobG9jayBoZWxkKSAqLworc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF9zcGRpZm91dChzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKworCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCWRtYWJ1Zi0+ZW5hYmxlICY9IH5DT0RFQ19TUERJRk9VVF9SVU5OSU5HOworCQlvdXRsKCgxIDw8IDE5KSwgY2FyZC0+aW9iYXNlICsgMHgwOCk7CisJCW91dGIoMCwgY2FyZC0+aW9iYXNlICsgQ09ERUNTUERJRk9VVF9DUik7CisKKwkJd2hpbGUgKGluYihjYXJkLT5pb2Jhc2UgKyBDT0RFQ1NQRElGT1VUX0NSKSAhPSAwKQorCQkJY3B1X3JlbGF4KCk7CisKKwkJb3V0YihpbmIoY2FyZC0+aW9iYXNlICsgQ09ERUNTUERJRk9VVF9TUikgfCAweDAwMWUsIGNhcmQtPmlvYmFzZSArIENPREVDU1BESUZPVVRfU1IpOworCQlvdXRsKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpICYgSU5UX0NPREVDU1BESUZPVVQsIGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUlJVUFRTUik7CisJfSBlbHNlIHsKKwkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJZG1hYnVmLT5lbmFibGUgJj0gfkNPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORzsKKwkJCW91dGwoKDEgPDwgMjMpLCBjYXJkLT5pb2Jhc2UgKyAweDA4KTsKKwkJCW91dGIoMCwgY2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX0NSKTsKKwkJCXdoaWxlIChpbmIoY2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX0NSKSAhPSAwKQorCQkJCWNwdV9yZWxheCgpOworCQkJb3V0YihpbmIoY2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX1NSKSB8IDB4MDAxZSwgY2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX1NSKTsKKwkJCW91dGwoaW5sKGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUlJVUFRTUikgJiBJTlRfU1BESUZPVVQsIGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUlJVUFRTUik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0b3Bfc3BkaWZvdXQoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19zdGFydF9zcGRpZm91dChzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlpZiAoZG1hYnVmLT5jb3VudCA+IDAgJiYgZG1hYnVmLT5yZWFkeSAmJiAhZG1hYnVmLT5lbmFibGUgJiYKKwkgICAgKGRtYWJ1Zi0+dHJpZ2dlciAmIFNQRElGX0VOQUJMRV9PVVRQVVQpKSB7CisJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlkbWFidWYtPmVuYWJsZSB8PSBDT0RFQ19TUERJRk9VVF9SVU5OSU5HOworCQkJb3V0YigoMSA8PCA0KSB8ICgxIDw8IDIpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQ09ERUNTUERJRk9VVF9DUik7CisJCQlvdXRsKCgxIDw8IDMpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgMHgwOCk7CS8vZG1hIGNvbnRyb2wgcmVnaXN0ZXIKKwkJfSBlbHNlIHsKKwkJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQlkbWFidWYtPmVuYWJsZSB8PSBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkc7CisJCQkJb3V0YigoMSA8PCA0KSB8ICgxIDw8IDIpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX0NSKTsKKwkJCQlvdXRsKCgxIDw8IDcpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgMHgwOCk7CS8vZG1hIGNvbnRyb2wgcmVnaXN0ZXIKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfc3BkaWZvdXQoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RhcnRfc3BkaWZvdXQoc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNi1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCisvKiBhbGxvY2F0ZSBETUEgYnVmZmVyLCBwbGF5YmFjayAsIHJlY29yZGluZyxzcGRpZiBvdXQgIGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIHNlcGFyYXRlbHkgKi8KK3N0YXRpYyBpbnQgYWxsb2NfZG1hYnVmKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXZvaWQgKnJhd2J1ZiA9IE5VTEw7CisJaW50IG9yZGVyLCBzaXplOworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgYW55IG9zcyBmcmFnIHBhcmFtcywgdGhlbiB1c2Ugb3VyIGRlZmF1bHQgb25lcyAqLworCWlmIChkbWFidWYtPm9zc21heGZyYWdzID09IDApCisJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSA0OworCWlmIChkbWFidWYtPm9zc2ZyYWdzaXplID09IDApCisJCWRtYWJ1Zi0+b3NzZnJhZ3NpemUgPSAoUEFHRV9TSVpFIDw8IERNQUJVRl9ERUZBVUxUT1JERVIpIC8gZG1hYnVmLT5vc3NtYXhmcmFnczsKKwlzaXplID0gZG1hYnVmLT5vc3NmcmFnc2l6ZSAqIGRtYWJ1Zi0+b3NzbWF4ZnJhZ3M7CisKKwlpZiAoZG1hYnVmLT5yYXdidWYgJiYgKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSA9PSBzaXplKQorCQlyZXR1cm4gMDsKKwkvKiBhbGxvYyBlbm91Z2ggdG8gc2F0aXNmeSB0aGUgb3NzIHBhcmFtcyAqLworCWZvciAob3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pIHsKKwkJaWYgKChQQUdFX1NJWkUgPDwgb3JkZXIpID4gc2l6ZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoKHJhd2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHN0YXRlLT5jYXJkLT5wY2lfZGV2LAorCQkJCQkJICAgUEFHRV9TSVpFIDw8IG9yZGVyLAorCQkJCQkJICAgJmRtYWJ1Zi0+ZG1hX2hhbmRsZSkpKQorCQkJYnJlYWs7CisJfQorCWlmICghcmF3YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRtYWJ1Zi0+cmVhZHkgPSBkbWFidWYtPm1hcHBlZCA9IDA7CisJZG1hYnVmLT5yYXdidWYgPSByYXdidWY7CisJZG1hYnVmLT5idWZvcmRlciA9IG9yZGVyOworCisJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCisJcGVuZCA9IHZpcnRfdG9fcGFnZShyYXdidWYgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpOworCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShyYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCXJldHVybiAwOworfQorCisvKiBmcmVlIERNQSBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWlmIChkbWFidWYtPnJhd2J1ZikgeworCQkvKiB1bmRvIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoc3RhdGUtPmNhcmQtPnBjaV9kZXYsCisJCQkJICAgIFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyLAorCQkJCSAgICBkbWFidWYtPnJhd2J1ZiwgZG1hYnVmLT5kbWFfaGFuZGxlKTsKKwl9CisJZG1hYnVmLT5yYXdidWYgPSBOVUxMOworCWRtYWJ1Zi0+bWFwcGVkID0gZG1hYnVmLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgYWxpX2NoYW5uZWwgKmMgPSBOVUxMOworCXN0cnVjdCBzZ19pdGVtICpzZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisJdW5zaWduZWQgZnJhZ2ludDsKKwlpbnQgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQlfX3N0b3BfZGFjKHN0YXRlKTsKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKKwkJX19zdG9wX2FkYyhzdGF0ZSk7CisJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09ERUNfU1BESUZPVVRfUlVOTklORykKKwkJX19zdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkcpCisJCV9fc3RvcF9zcGRpZm91dChzdGF0ZSk7CisKKwlkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5lcnJvciA9IDA7CisJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyLCBsZXQgYWxsb2NfZG1hYnVmIGRldGVybWluZSBpZiB3ZSBhcmUgYWxyZWFkeQorCSAqIGFsbG9jYXRlZCB3ZWxsIGVub3VnaCBvciBpZiB3ZSBzaG91bGQgcmVwbGFjZSB0aGUgY3VycmVudCBidWZmZXIKKwkgKiAoYXNzdW1pbmcgb25lIGlzIGFscmVhZHkgYWxsb2NhdGVkLCBpZiBpdCBpc24ndCwgdGhlbiBhbGxvY2F0ZSBpdCkuCisJICovCisJaWYgKChyZXQgPSBhbGxvY19kbWFidWYoc3RhdGUpKSkKKwkJcmV0dXJuIHJldDsKKworCS8qIEZJWE1FOiBmaWd1cmUgb3V0IGFsbCB0aGlzIE9TUyBmcmFnbWVudCBzdHVmZiAqLworCS8qIEkgZGlkLCBpdCBub3cgZG9lcyB3aGF0IGl0IHNob3VsZCBhY2NvcmRpbmcgdG8gdGhlIE9TUyBBUEkuICBETCAqLworCS8qIFdlIG1heSBub3QgaGF2ZSByZWFsbG9jZWQgb3VyIGRtYWJ1ZiwgYnV0IHRoZSBmcmFnbWVudCBzaXplIHRvCisJICogZnJhZ21lbnQgbnVtYmVyIHJhdGlvIG1heSBoYXZlIGNoYW5nZWQsIHNvIGdvIGFoZWFkIGFuZCByZXByb2dyYW0KKwkgKiB0aGluZ3MKKwkgKi8KKworCWRtYWJ1Zi0+ZG1hc2l6ZSA9IFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyOworCWRtYWJ1Zi0+bnVtZnJhZyA9IFNHX0xFTjsKKwlkbWFidWYtPmZyYWdzaXplID0gZG1hYnVmLT5kbWFzaXplIC8gZG1hYnVmLT5udW1mcmFnOworCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSBkbWFidWYtPmZyYWdzaXplID4+IDE7CisJZG1hYnVmLT51c2VyZnJhZ3NpemUgPSBkbWFidWYtPm9zc2ZyYWdzaXplOworCWRtYWJ1Zi0+dXNlcmZyYWdzID0gZG1hYnVmLT5kbWFzaXplIC8gZG1hYnVmLT5vc3NmcmFnc2l6ZTsKKworCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgMCwgZG1hYnVmLT5kbWFzaXplKTsKKworCWlmIChkbWFidWYtPm9zc21heGZyYWdzID09IDQpIHsKKwkJZnJhZ2ludCA9IDg7CisJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gMjsKKwl9IGVsc2UgaWYgKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPT0gOCkgeworCQlmcmFnaW50ID0gNDsKKwkJZG1hYnVmLT5mcmFnc2hpZnQgPSAzOworCX0gZWxzZSBpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA9PSAxNikgeworCQlmcmFnaW50ID0gMjsKKwkJZG1hYnVmLT5mcmFnc2hpZnQgPSA0OworCX0gZWxzZSB7CisJCWZyYWdpbnQgPSAxOworCQlkbWFidWYtPmZyYWdzaGlmdCA9IDU7CisJfQorCS8qCisJICogICAgICBOb3cgc2V0IHVwIHRoZSByaW5nIAorCSAqLworCisJaWYgKHJlYyA9PSAxKQorCQljID0gZG1hYnVmLT5yZWFkX2NoYW5uZWw7CisJZWxzZSBpZiAocmVjID09IDIpCisJCWMgPSBkbWFidWYtPmNvZGVjX3NwZGlmb3V0X2NoYW5uZWw7CisJZWxzZSBpZiAocmVjID09IDMpCisJCWMgPSBkbWFidWYtPmNvbnRyb2xsZXJfc3BkaWZvdXRfY2hhbm5lbDsKKwllbHNlIGlmIChyZWMgPT0gMCkKKwkJYyA9IGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbDsKKwlpZiAoYyAhPSBOVUxMKSB7CisJCXNnID0gJmMtPnNnWzBdOworCQkvKgorCQkgKiAgICAgIExvYWQgdXAgMzIgc2cgZW50cmllcyBhbmQgdGFrZSBhbiBpbnRlcnJ1cHQgYXQgaGFsZgorCQkgKiAgICAgIHdheSAod2UgbWlnaHQgd2FudCBtb3JlIGludGVycnVwdHMgbGF0ZXIuLikgCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgZG1hYnVmLT5udW1mcmFnOyBpKyspIHsKKwkJCXNnLT5idXNhZGRyID0KKwkJCSAgICB2aXJ0X3RvX2J1cyhkbWFidWYtPnJhd2J1ZiArCisJCQkJCWRtYWJ1Zi0+ZnJhZ3NpemUgKiBpKTsKKwkJCS8vIHRoZSBjYXJkIHdpbGwgYWx3YXlzIGJlIGRvaW5nIDE2Yml0IHN0ZXJlbworCQkJc2ctPmNvbnRyb2wgPSBkbWFidWYtPmZyYWdzYW1wbGVzOworCQkJc2ctPmNvbnRyb2wgfD0gQ09OX0JVRlBBRDsJLy9JIG1vZGlmeQorCQkJLy8gc2V0IHVzIHVwIHRvIGdldCBJT0MgaW50ZXJydXB0cyBhcyBvZnRlbiBhcyBuZWVkZWQgdG8KKwkJCS8vIHNhdGlzZnkgbnVtZnJhZyByZXF1aXJlbWVudHMsIG5vIG1vcmUKKwkJCWlmICgoKGkgKyAxKSAlIGZyYWdpbnQpID09IDApIHsKKwkJCQlzZy0+Y29udHJvbCB8PSBDT05fSU9DOworCQkJfQorCQkJc2crKzsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJb3V0YigyLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgYy0+cG9ydCArIE9GRl9DUik7CS8qIHJlc2V0IERNQSBtYWNoaW5lICovCisJCW91dGwodmlydF90b19idXMoJmMtPnNnWzBdKSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIGMtPnBvcnQgKyBPRkZfQkRCQVIpOworCQlvdXRiKDAsIHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBjLT5wb3J0ICsgT0ZGX0NJVik7CisJCW91dGIoMCwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIGMtPnBvcnQgKyBPRkZfTFZJKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl9CisJLyogc2V0IHRoZSByZWFkeSBmbGFnIGZvciB0aGUgZG1hIGJ1ZmZlciAqLworCWRtYWJ1Zi0+cmVhZHkgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2FsaV91cGRhdGVfbHZpKHN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlLCBpbnQgcmVjKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCB4LCBwb3J0OworCXBvcnQgPSBzdGF0ZS0+Y2FyZC0+aW9iYXNlOworCWlmIChyZWMgPT0gMSkKKwkJcG9ydCArPSBkbWFidWYtPnJlYWRfY2hhbm5lbC0+cG9ydDsKKwllbHNlIGlmIChyZWMgPT0gMikKKwkJcG9ydCArPSBkbWFidWYtPmNvZGVjX3NwZGlmb3V0X2NoYW5uZWwtPnBvcnQ7CisJZWxzZSBpZiAocmVjID09IDMpCisJCXBvcnQgKz0gZG1hYnVmLT5jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwtPnBvcnQ7CisJZWxzZSBpZiAocmVjID09IDApCisJCXBvcnQgKz0gZG1hYnVmLT53cml0ZV9jaGFubmVsLT5wb3J0OworCS8qIGlmIHdlIGFyZSBjdXJyZW50bHkgc3RvcHBlZCwgdGhlbiBvdXIgQ0lWIGlzIGFjdHVhbGx5IHNldCB0byBvdXIKKwkgKiAqbGFzdCogc2cgc2VnbWVudCBhbmQgd2UgYXJlIHJlYWR5IHRvIHdyYXAgdG8gdGhlIG5leHQuICBIb3dldmVyLAorCSAqIGlmIHdlIHNldCBvdXIgTFZJIHRvIHRoZSBsYXN0IHNnIHNlZ21lbnQsIHRoZW4gaXQgd29uJ3Qgd3JhcCB0bworCSAqIHRoZSBuZXh0IHNnIHNlZ21lbnQsIGl0IHdvbid0IGV2ZW4gZ2V0IGEgc3RhcnQuICBTbywgaW5zdGVhZCwgd2hlbgorCSAqIHdlIGFyZSBzdG9wcGVkLCB3ZSBzZXQgYm90aCB0aGUgTFZJIHZhbHVlIGFuZCBhbHNvIHdlIGluY3JlbWVudAorCSAqIHRoZSBDSVYgdmFsdWUgdG8gdGhlIG5leHQgc2cgc2VnbWVudCB0byBiZSBwbGF5ZWQgc28gdGhhdCB3aGVuCisJICogd2UgY2FsbCBzdGFydF97ZGFjLGFkY30sIHRoaW5ncyB3aWxsIG9wZXJhdGUgcHJvcGVybHkKKwkgKi8KKwlpZiAoIWRtYWJ1Zi0+ZW5hYmxlICYmIGRtYWJ1Zi0+cmVhZHkpIHsKKwkJaWYgKHJlYyAmJiBkbWFidWYtPmNvdW50IDwgZG1hYnVmLT5kbWFzaXplICYmIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX0lOUFVUKSkgeworCQkJb3V0YigoaW5iKHBvcnQgKyBPRkZfQ0lWKSArIDEpICYgMzEsIHBvcnQgKyBPRkZfTFZJKTsKKwkJCV9fc3RhcnRfYWRjKHN0YXRlKTsKKwkJCXdoaWxlICghIChpbmIocG9ydCArIE9GRl9DUikgJiAoKDEgPDwgNCkgfCAoMSA8PCAyKSkpKQorCQkJCWNwdV9yZWxheCgpOworCQl9IGVsc2UgaWYgKCFyZWMgJiYgZG1hYnVmLT5jb3VudCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9PVVRQVVQpKSB7CisJCQlvdXRiKChpbmIocG9ydCArIE9GRl9DSVYpICsgMSkgJiAzMSwgcG9ydCArIE9GRl9MVkkpOworCQkJX19zdGFydF9kYWMoc3RhdGUpOworCQkJd2hpbGUgKCEoaW5iKHBvcnQgKyBPRkZfQ1IpICYgKCgxIDw8IDQpIHwgKDEgPDwgMikpKSkKKwkJCQljcHVfcmVsYXgoKTsKKwkJfSBlbHNlIGlmIChyZWMgJiYgZG1hYnVmLT5jb3VudCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgU1BESUZfRU5BQkxFX09VVFBVVCkpIHsKKwkJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQkJLy8gb3V0YigoaW5iKHBvcnQrT0ZGX0NJVikpJjMxLCBwb3J0K09GRl9MVkkpOworCQkJCW91dGIoKGluYihwb3J0ICsgT0ZGX0NJVikgKyAxKSAmIDMxLCBwb3J0ICsgT0ZGX0xWSSk7CisJCQkJX19zdGFydF9zcGRpZm91dChzdGF0ZSk7CisJCQkJd2hpbGUgKCEoaW5iKHBvcnQgKyBPRkZfQ1IpICYgKCgxIDw8IDQpIHwgKDEgPDwgMikpKSkKKwkJCQkJY3B1X3JlbGF4KCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQkJb3V0YigoaW5iKHBvcnQgKyBPRkZfQ0lWKSArIDEpICYgMzEsIHBvcnQgKyBPRkZfTFZJKTsKKwkJCQkJX19zdGFydF9zcGRpZm91dChzdGF0ZSk7CisJCQkJCXdoaWxlICghKGluYihwb3J0ICsgT0ZGX0NSKSAmICgoMSA8PCA0KSB8ICgxIDw8IDIpKSkpCisJCQkJCQljcHVfcmVsYXgoKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwkvKiBzd3B0ciAtIDEgaXMgdGhlIHRhaWwgb2Ygb3VyIHRyYW5zZmVyICovCisJeCA9IChkbWFidWYtPmRtYXNpemUgKyBkbWFidWYtPnN3cHRyIC0gMSkgJSBkbWFidWYtPmRtYXNpemU7CisJeCAvPSBkbWFidWYtPmZyYWdzaXplOworCW91dGIoeCwgcG9ydCArIE9GRl9MVkkpOworfQorCitzdGF0aWMgdm9pZCBhbGlfdXBkYXRlX2x2aShzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSwgaW50IHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmICghZG1hYnVmLT5yZWFkeSkKKwkJcmV0dXJuOworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCV9fYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIHJlYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyogdXBkYXRlIGJ1ZmZlciBtYW5hbmdlbWVudCBwb2ludGVycywgZXNwZWNpYWxseSwgZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLworc3RhdGljIHZvaWQgYWxpX3VwZGF0ZV9wdHIoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgaHdwdHI7CisJaW50IGRpZmY7CisJCisJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgREFDICovCisJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CisJCS8qIHVwZGF0ZSBoYXJkd2FyZSBwb2ludGVyICovCisJCWh3cHRyID0gYWxpX2dldF9kbWFfYWRkcihzdGF0ZSwgMSk7CisJCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJZG1hYnVmLT5od3B0ciA9IGh3cHRyOworCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biAqLworCQkJLyogdGhpcyBpcyBub3JtYWwgZm9yIHRoZSBlbmQgb2YgYSByZWFkICovCisJCQkvKiBvbmx5IGdpdmUgYW4gZXJyb3IgaWYgd2Ugd2VudCBwYXN0IHRoZSAqLworCQkJLyogbGFzdCB2YWxpZCBzZyBlbnRyeSAqLworCQkJaWYgKChpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIFBJX0NJVikgJiAzMSkgIT0gKGluYihzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgUElfTFZJKSAmIDMxKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImFsaV9hdWRpbzogRE1BIG92ZXJydW4gb24gcmVhZFxuIik7CisJCQkJZG1hYnVmLT5lcnJvcisrOworCQkJfQorCQl9CisJCWlmIChkbWFidWYtPmNvdW50ID4gZG1hYnVmLT51c2VyZnJhZ3NpemUpCisJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCX0KKwkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBEQUMgKi8KKwlpZiAoZG1hYnVmLT5lbmFibGUgPT0gREFDX1JVTk5JTkcpIHsKKwkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KKwkJaHdwdHIgPSBhbGlfZ2V0X2RtYV9hZGRyKHN0YXRlLCAwKTsKKwkJZGlmZiA9CisJCSAgICAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLQorCQkgICAgIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOworI2lmIGRlZmluZWQoREVCVUdfSU5URVJSVVBUUykgfHwgZGVmaW5lZChERUJVR19NTUFQKQorCQlwcmludGsoIkRBQyBIV1AgJWQsJWQsJWRcbiIsIGh3cHRyLCBkbWFidWYtPmh3cHRyLCBkaWZmKTsKKyNlbmRpZgorCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApIHsKKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biAqLworCQkJLyogdGhpcyBpcyBub3JtYWwgZm9yIHRoZSBlbmQgb2YgYSB3cml0ZSAqLworCQkJLyogb25seSBnaXZlIGFuIGVycm9yIGlmIHdlIHdlbnQgcGFzdCB0aGUgKi8KKwkJCS8qIGxhc3QgdmFsaWQgc2cgZW50cnkgKi8KKwkJCWlmICgoaW5iKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBQT19DSVYpICYgMzEpICE9IChpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIFBPX0xWSSkgJiAzMSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGlfYXVkaW86IERNQSBvdmVycnVuIG9uIHdyaXRlXG4iKTsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiYWxpX2F1ZGlvOiBDSVYgJWQsIExWSSAlZCwgaHdwdHIgJXgsIGNvdW50ICVkXG4iLAorCQkJCSAgICAgCQkJaW5iKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBQT19DSVYpICYgMzEsCisJCQkJICAgICAJCQlpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIFBPX0xWSSkgJiAzMSwgCisJCQkJCQkJZG1hYnVmLT5od3B0ciwKKwkJCQkJCQlkbWFidWYtPmNvdW50KTsKKwkJCQlkbWFidWYtPmVycm9yKys7CisJCQl9CisJCX0KKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAoZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT51c2VyZnJhZ3NpemUpKQorCQkgICAgCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJfQorCisJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgQ09ERUMgU1BESUYgT1VUICovCisJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IENPREVDX1NQRElGT1VUX1JVTk5JTkcpIHsKKwkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KKwkJaHdwdHIgPSBhbGlfZ2V0X2RtYV9hZGRyKHN0YXRlLCAyKTsKKwkJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOworCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApIHsKKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biAqLworCQkJLyogdGhpcyBpcyBub3JtYWwgZm9yIHRoZSBlbmQgb2YgYSB3cml0ZSAqLworCQkJLyogb25seSBnaXZlIGFuIGVycm9yIGlmIHdlIHdlbnQgcGFzdCB0aGUgKi8KKwkJCS8qIGxhc3QgdmFsaWQgc2cgZW50cnkgKi8KKwkJCWlmICgoaW5iKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBDT0RFQ1NQRElGT1VUX0NJVikgJiAzMSkgIT0gKGluYihzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQ09ERUNTUERJRk9VVF9MVkkpICYgMzEpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxpX2F1ZGlvOiBETUEgb3ZlcnJ1biBvbiB3cml0ZVxuIik7CisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImFsaV9hdWRpbzogQ0lWICVkLCBMVkkgJWQsIGh3cHRyICV4LCBjb3VudCAlZFxuIiwgCisJCQkJICAgICAgICBpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIENPREVDU1BESUZPVVRfQ0lWKSAmIDMxLAorCQkJCQlpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIENPREVDU1BESUZPVVRfTFZJKSAmIDMxLAorCQkJCQlkbWFidWYtPmh3cHRyLCBkbWFidWYtPmNvdW50KTsKKwkJCQlkbWFidWYtPmVycm9yKys7CisJCQl9CisJCX0KKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAoZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT51c2VyZnJhZ3NpemUpKQorCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwl9CisJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgQ09OVFJPTExFUiBTUERJRiBPVVQgKi8KKwlpZiAoZG1hYnVmLT5lbmFibGUgPT0gQ09OVFJPTExFUl9TUERJRk9VVF9SVU5OSU5HKSB7CisJCS8qIHVwZGF0ZSBoYXJkd2FyZSBwb2ludGVyICovCisJCWh3cHRyID0gYWxpX2dldF9kbWFfYWRkcihzdGF0ZSwgMyk7CisJCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJZG1hYnVmLT5od3B0ciA9IGh3cHRyOworCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWRtYWJ1Zi0+Y291bnQgLT0gZGlmZjsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CisJCQkvKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4gKi8KKwkJCS8qIHRoaXMgaXMgbm9ybWFsIGZvciB0aGUgZW5kIG9mIGEgd3JpdGUgKi8KKwkJCS8qIG9ubHkgZ2l2ZSBhbiBlcnJvciBpZiB3ZSB3ZW50IHBhc3QgdGhlICovCisJCQkvKiBsYXN0IHZhbGlkIHNnIGVudHJ5ICovCisJCQlpZiAoKGluYihzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX0NJVikgJiAzMSkgIT0gKGluYihzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQ09OVFJPTExFUlNQRElGT1VUX0xWSSkgJiAzMSkpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgICJhbGlfYXVkaW86IERNQSBvdmVycnVuIG9uIHdyaXRlXG4iKTsKKwkJCQlwcmludGsoImFsaV9hdWRpbzogQ0lWICVkLCBMVkkgJWQsIGh3cHRyICV4LCAiCisJCQkJCSJjb3VudCAlZFxuIiwKKwkJCQkgICAgIAkJaW5iKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBDT05UUk9MTEVSU1BESUZPVVRfQ0lWKSAmIDMxLAorCQkJCSAgICAgCQlpbmIoc3RhdGUtPmNhcmQtPmlvYmFzZSArIENPTlRST0xMRVJTUERJRk9VVF9MVkkpICYgMzEsCisJCQkJICAgICAJCWRtYWJ1Zi0+aHdwdHIsIGRtYWJ1Zi0+Y291bnQpOworCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKKwkJCX0KKwkJfQorCQlpZiAoZG1hYnVmLT5jb3VudCA8IChkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPnVzZXJmcmFnc2l6ZSkpCisJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgYWxpX2dldF9mcmVlX3dyaXRlX3NwYWNlKHN0cnVjdAorCQkJCQkgICBhbGlfc3RhdGUKKwkJCQkJICAgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCBmcmVlOworCisJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CisJCWRtYWJ1Zi0+Y291bnQgPSAwOworCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwl9CisJZnJlZSA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIGRtYWJ1Zi0+c3dwdHI7CisJaWYgKChkbWFidWYtPmNvdW50ICsgZnJlZSkgPiBkbWFidWYtPmRtYXNpemUpeworCQlmcmVlID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKwl9CisJcmV0dXJuIGZyZWU7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFsaV9nZXRfYXZhaWxhYmxlX3JlYWRfZGF0YShzdHJ1Y3QKKwkJCQkJICAgICAgYWxpX3N0YXRlCisJCQkJCSAgICAgICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlpbnQgYXZhaWw7CisJYWxpX3VwZGF0ZV9wdHIoc3RhdGUpOworCS8vIGNhdGNoIG92ZXJydW5zIGR1cmluZyByZWNvcmQKKwlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5kbWFzaXplOworCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwl9CisJYXZhaWwgPSBkbWFidWYtPmNvdW50OworCWF2YWlsIC09IChkbWFidWYtPmh3cHRyICUgZG1hYnVmLT5mcmFnc2l6ZSk7CisJaWYgKGF2YWlsIDwgMCkKKwkJcmV0dXJuICgwKTsKKwlyZXR1cm4gKGF2YWlsKTsKK30KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUsIGludCBzaWduYWxzX2FsbG93ZWQpCit7CisKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdG1vOworCWludCBjb3VudDsKKwlpZiAoIWRtYWJ1Zi0+cmVhZHkpCisJCXJldHVybiAwOworCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQlzdG9wX2RhYyhzdGF0ZSk7CisJCXJldHVybiAwOworCX0KKwlhZGRfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CisJZm9yICg7OykgeworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDw9IDApCisJCQlicmVhazsKKwkJLyogCisJCSAqIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCBvdXIgTFZJIGlzIGNvcnJlY3QsIHRoYXQgb3VyCisJCSAqIHBvaW50ZXIgaXMgdXBkYXRlZCwgYW5kIHRoYXQgdGhlIERBQyBpcyBydW5uaW5nLiAgV2UKKwkJICogaGF2ZSB0byBmb3JjZSB0aGUgc2V0dGluZyBvZiBkbWFidWYtPnRyaWdnZXIgdG8gYXZvaWQKKwkJICogYW55IHBvc3NpYmxlIGRlYWRsb2Nrcy4KKwkJICovCisJCWlmICghZG1hYnVmLT5lbmFibGUpIHsKKwkJCWRtYWJ1Zi0+dHJpZ2dlciA9IFBDTV9FTkFCTEVfT1VUUFVUOworCQkJYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDApOworCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBzaWduYWxzX2FsbG93ZWQpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSXQgc2VlbXMgdGhhdCB3ZSBoYXZlIHRvIHNldCB0aGUgY3VycmVudCBzdGF0ZSB0bworCQkgKiBUQVNLX0lOVEVSUlVQVElCTEUgZXZlcnkgdGltZSB0byBtYWtlIHRoZSBwcm9jZXNzCisJCSAqIHJlYWxseSBnbyB0byBzbGVlcC4gIFRoaXMgYWxzbyBoYXMgdG8gYmUgKmFmdGVyKiB0aGUKKwkJICogdXBkYXRlX3B0cigpIGNhbGwgYmVjYXVzZSB1cGRhdGVfcHRyIGlzIGxpa2VseSB0bworCQkgKiBkbyBhIHdha2VfdXAoKSB3aGljaCB3aWxsIHVuc2V0IHRoaXMgYmVmb3JlIHdlIGV2ZXIKKwkJICogdHJ5IHRvIHNsZWVwLCByZXN1bGluZyBpbiBhIHRpZ2h0IGxvb3AgaW4gdGhpcyBjb2RlCisJCSAqIGluc3RlYWQgb2YgYWN0dWFsbHkgc2xlZXBpbmcgYW5kIHdhaXRpbmcgZm9yIGFuCisJCSAqIGludGVycnVwdCB0byB3YWtlIHVzIHVwIQorCQkgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJLyoKKwkJICogc2V0IHRoZSB0aW1lb3V0IHRvIHNpZ25pZmljYW50bHkgbG9uZ2VyIHRoYW4gaXQgKnNob3VsZCoKKwkJICogdGFrZSBmb3IgdGhlIERBQyB0byBkcmFpbiB0aGUgRE1BIGJ1ZmZlcgorCQkgKi8KKwkJdG1vID0gKGNvdW50ICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSk7CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPj0gMiA/IHRtbyA6IDIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogZHJhaW5fZGFjLCBkbWEgdGltZW91dD9cbiIpOworCQkJY291bnQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CisJaWYgKGNvdW50ID4gMCAmJiBzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBzaWduYWxzX2FsbG93ZWQpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJc3RvcF9kYWMoc3RhdGUpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgZHJhaW5fc3BkaWZvdXQoc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUsIGludCBzaWduYWxzX2FsbG93ZWQpCit7CisKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdG1vOworCWludCBjb3VudDsKKwlpZiAoIWRtYWJ1Zi0+cmVhZHkpCisJCXJldHVybiAwOworCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQlzdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwkJcmV0dXJuIDA7CisJfQorCWFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWFsaV91cGRhdGVfcHRyKHN0YXRlKTsKKwkJY291bnQgPSBkbWFidWYtPmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQkvKiAKKwkJICogVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGF0IG91ciBMVkkgaXMgY29ycmVjdCwgdGhhdCBvdXIKKwkJICogcG9pbnRlciBpcyB1cGRhdGVkLCBhbmQgdGhhdCB0aGUgREFDIGlzIHJ1bm5pbmcuICBXZQorCQkgKiBoYXZlIHRvIGZvcmNlIHRoZSBzZXR0aW5nIG9mIGRtYWJ1Zi0+dHJpZ2dlciB0byBhdm9pZAorCQkgKiBhbnkgcG9zc2libGUgZGVhZGxvY2tzLgorCQkgKi8KKwkJaWYgKCFkbWFidWYtPmVuYWJsZSkgeworCQkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQlkbWFidWYtPnRyaWdnZXIgPSBTUERJRl9FTkFCTEVfT1VUUFVUOworCQkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAyKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCQlkbWFidWYtPnRyaWdnZXIgPSBTUERJRl9FTkFCTEVfT1VUUFVUOworCQkJCQlhbGlfdXBkYXRlX2x2aShzdGF0ZSwgMyk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBzaWduYWxzX2FsbG93ZWQpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJLyogSXQgc2VlbXMgdGhhdCB3ZSBoYXZlIHRvIHNldCB0aGUgY3VycmVudCBzdGF0ZSB0bworCQkgKiBUQVNLX0lOVEVSUlVQVElCTEUgZXZlcnkgdGltZSB0byBtYWtlIHRoZSBwcm9jZXNzCisJCSAqIHJlYWxseSBnbyB0byBzbGVlcC4gIFRoaXMgYWxzbyBoYXMgdG8gYmUgKmFmdGVyKiB0aGUKKwkJICogdXBkYXRlX3B0cigpIGNhbGwgYmVjYXVzZSB1cGRhdGVfcHRyIGlzIGxpa2VseSB0bworCQkgKiBkbyBhIHdha2VfdXAoKSB3aGljaCB3aWxsIHVuc2V0IHRoaXMgYmVmb3JlIHdlIGV2ZXIKKwkJICogdHJ5IHRvIHNsZWVwLCByZXN1bGluZyBpbiBhIHRpZ2h0IGxvb3AgaW4gdGhpcyBjb2RlCisJCSAqIGluc3RlYWQgb2YgYWN0dWFsbHkgc2xlZXBpbmcgYW5kIHdhaXRpbmcgZm9yIGFuCisJCSAqIGludGVycnVwdCB0byB3YWtlIHVzIHVwIQorCQkgKi8KKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJLyoKKwkJICogc2V0IHRoZSB0aW1lb3V0IHRvIHNpZ25pZmljYW50bHkgbG9uZ2VyIHRoYW4gaXQgKnNob3VsZCoKKwkJICogdGFrZSBmb3IgdGhlIERBQyB0byBkcmFpbiB0aGUgRE1BIGJ1ZmZlcgorCQkgKi8KKwkJdG1vID0gKGNvdW50ICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSk7CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPj0gMiA/IHRtbyA6IDIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogZHJhaW5fc3BkaWZvdXQsIGRtYSB0aW1lb3V0P1xuIik7CisJCQljb3VudCA9IDA7CisJCQlicmVhazsKKwkJfQorCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKKwlpZiAoY291bnQgPiAwICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIHNpZ25hbHNfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlzdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYWxpX2NoYW5uZWxfaW50ZXJydXB0KHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlpbnQgaSwgY291bnQ7CisJCisJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV07CisJCXN0cnVjdCBhbGlfY2hhbm5lbCAqYyA9IE5VTEw7CisJCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwkJdW5zaWduZWQgbG9uZyBwb3J0ID0gY2FyZC0+aW9iYXNlOworCQl1MTYgc3RhdHVzOworCQlpZiAoIXN0YXRlKQorCQkJY29udGludWU7CisJCWlmICghc3RhdGUtPmRtYWJ1Zi5yZWFkeSkKKwkJCWNvbnRpbnVlOworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCWlmIChkbWFidWYtPmVuYWJsZSAmIENPREVDX1NQRElGT1VUX1JVTk5JTkcpIHsKKwkJCQljID0gZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykKKwkJCQkJYyA9IGRtYWJ1Zi0+Y29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgeworCQkJCQljID0gZG1hYnVmLT53cml0ZV9jaGFubmVsOworCQkJCX0gZWxzZSBpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgeworCQkJCQljID0gZG1hYnVmLT5yZWFkX2NoYW5uZWw7CisJCQkJfSBlbHNlCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXBvcnQgKz0gYy0+cG9ydDsKKworCQlzdGF0dXMgPSBpbncocG9ydCArIE9GRl9TUik7CisKKwkJaWYgKHN0YXR1cyAmIERNQV9JTlRfQ09NUExFVEUpIHsKKwkJCS8qIG9ubHkgd2FrZV91cCgpIHdhaXRlcnMgaWYgdGhpcyBpbnRlcnJ1cHQgc2lnbmFscworCQkJICogdXMgYmVpbmcgYmV5b25kIGEgdXNlcmZyYWdzaXplIG9mIGRhdGEgb3BlbiBvcgorCQkJICogYXZhaWxhYmxlLCBhbmQgYWxpX3VwZGF0ZV9wdHIoKSBkb2VzIHRoYXQgZm9yCisJCQkgKiB1cworCQkJICovCisJCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCX0KKworCQlpZiAoc3RhdHVzICYgRE1BX0lOVF9MVkkpIHsKKwkJCWFsaV91cGRhdGVfcHRyKHN0YXRlKTsKKwkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisKKwkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCisJCQkJY291bnQgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OworCQkJZWxzZSBpZiAoZG1hYnVmLT5lbmFibGUgJiBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09OVFJPTExFUl9TUERJRk9VVF9SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UgY291bnQgPSAwOworCisJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCisJCQkJCW91dGwoKDEgPDwgMSksIHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfRE1BQ1IpOworCQkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09ERUNfU1BESUZPVVRfUlVOTklORykKKwkJCQkJCW91dGwoKDEgPDwgMyksIHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfRE1BQ1IpOworCQkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09OVFJPTExFUl9TUERJRk9VVF9SVU5OSU5HKQorCQkJCQlvdXRsKCgxIDw8IDcpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX0RNQUNSKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCisJCQkJCV9fc3RvcF9kYWMoc3RhdGUpOworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKQorCQkJCQlfX3N0b3BfYWRjKHN0YXRlKTsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKQorCQkJCQlfX3N0b3Bfc3BkaWZvdXQoc3RhdGUpOworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykKKwkJCQkJX19zdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwkJCQlkbWFidWYtPmVuYWJsZSA9IDA7CisJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwkJCX0KKworCQl9CisJCWlmICghKHN0YXR1cyAmIERNQV9JTlRfRENIKSkgeworCQkJYWxpX3VwZGF0ZV9wdHIoc3RhdGUpOworCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCisJCQkJY291bnQgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmNvdW50OworCQkJZWxzZSBpZiAoZG1hYnVmLT5lbmFibGUgJiBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UgaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09OVFJPTExFUl9TUERJRk9VVF9SVU5OSU5HKQorCQkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWVsc2UKKwkJCQljb3VudCA9IDA7CisKKwkJCWlmIChjb3VudCA+IDApIHsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKKwkJCQkJb3V0bCgoMSA8PCAxKSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9ETUFDUik7CisJCQkJZWxzZSBpZiAoZG1hYnVmLT5lbmFibGUgJiBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKQorCQkJCQlvdXRsKCgxIDw8IDMpLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX0RNQUNSKTsKKwkJCQllbHNlIGlmIChkbWFidWYtPmVuYWJsZSAmIENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykKKwkJCQkJb3V0bCgoMSA8PCA3KSwgc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9ETUFDUik7CisJCQl9IGVsc2UgeworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQkJCQlfX3N0b3BfZGFjKHN0YXRlKTsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKKwkJCQkJX19zdG9wX2FkYyhzdGF0ZSk7CisJCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09ERUNfU1BESUZPVVRfUlVOTklORykKKwkJCQkJX19zdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkcpCisJCQkJCV9fc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJCQkJZG1hYnVmLT5lbmFibGUgPSAwOworCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJCQl9CisJCX0KKwkJb3V0dyhzdGF0dXMgJiBETUFfSU5UX01BU0ssIHBvcnQgKyBPRkZfU1IpOworCX0KK30KKworc3RhdGljIGlycXJldHVybl90IGFsaV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSAoc3RydWN0IGFsaV9jYXJkICopIGRldl9pZDsKKwl1MzIgc3RhdHVzOworCXUxNiBzdGF0dXMyOworCisJc3Bpbl9sb2NrKCZjYXJkLT5sb2NrKTsKKwlzdGF0dXMgPSBpbmwoY2FyZC0+aW9iYXNlICsgQUxJX0lOVEVSUlVQVFNSKTsKKwlpZiAoIShzdGF0dXMgJiBJTlRfTUFTSykpIHsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOworCQlyZXR1cm4gSVJRX05PTkU7CQkvKiBub3QgZm9yIHVzICovCisJfQorCisJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJaWYgKGdsb2JlbCA9PSAwKSB7CisJCQlnbG9iZWwgKz0gMTsKKwkJCXN0YXR1czIgPSBpbncoY2FyZC0+aW9iYXNlICsgMHg3Nik7CisJCQlvdXR3KHN0YXR1czIgfCAweDAwMGMsIGNhcmQtPmlvYmFzZSArIDB4NzYpOworCQl9IGVsc2UgeworCQkJaWYgKHN0YXR1cyAmIChJTlRfUENNT1VUIHwgSU5UX1BDTUlOIHwgSU5UX01JQ0lOIHwgSU5UX1NQRElGT1VUIHwgSU5UX0NPREVDU1BESUZPVVQpKQorCQkJCWFsaV9jaGFubmVsX2ludGVycnVwdChjYXJkKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzdGF0dXMgJiAoSU5UX1BDTU9VVCB8IElOVF9QQ01JTiB8IElOVF9NSUNJTiB8IElOVF9TUERJRk9VVCB8IElOVF9DT0RFQ1NQRElGT1VUKSkKKwkJCWFsaV9jaGFubmVsX2ludGVycnVwdChjYXJkKTsKKwl9CisKKwkvKiBjbGVhciAnZW0gKi8KKwlvdXRsKHN0YXR1cyAmIElOVF9NQVNLLCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpOworCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcworICAgd2FpdGluZyB0byBiZSBjb3BpZWQgdG8gdGhlIHVzZXIncyBidWZmZXIuICBJdCBpcyBmaWxsZWQgYnkgdGhlIGRtYQorICAgbWFjaGluZSBhbmQgZHJhaW5lZCBieSB0aGlzIGxvb3AuICovCisKK3N0YXRpYyBzc2l6ZV90IGFsaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBhbGlfc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IHN0YXRlID8gc3RhdGUtPmNhcmQgOiBOVUxMOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN3cHRyOworCWludCBjbnQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdGEsIGN1cnJlbnQpOworI2lmZGVmIERFQlVHMgorCXByaW50aygiYWxpX2F1ZGlvOiBhbGlfcmVhZCBjYWxsZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKKyNlbmRpZgorCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFkbWFidWYtPnJlYWRfY2hhbm5lbCkgeworCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJZG1hYnVmLT5yZWFkX2NoYW5uZWwgPSBjYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwoY2FyZCk7CisJCWlmICghZG1hYnVmLT5yZWFkX2NoYW5uZWwpIHsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpKQorCQlyZXR1cm4gcmV0OworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXRhKTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCWlmIChQTV9TVVNQRU5ERUQoY2FyZCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJY250ID0gYWxpX2dldF9hdmFpbGFibGVfcmVhZF9kYXRhKHN0YXRlKTsKKwkJLy8gdGhpcyBpcyB0byBtYWtlIHRoZSBjb3B5X3RvX3VzZXIgc2ltcGxlciBiZWxvdworCQlpZiAoY250ID4gKGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyKSkKKwkJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQkvKiBMb3Agb2ZmIHRoZSBsYXN0IHR3byBiaXRzIHRvIGZvcmNlIHRoZSBjb2RlIHRvIGFsd2F5cworCQkgKiB3cml0ZSBpbiBmdWxsIHNhbXBsZXMuICBUaGlzIGtlZXBzIHNvZnR3YXJlIHRoYXQgc2V0cworCQkgKiBPX05PTkJMT0NLIGJ1dCBkb2Vzbid0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlCisJCSAqIHdyaXRlIGNhbGwgZnJvbSBnZXR0aW5nIHRoaW5ncyBvdXQgb2Ygc3RhdGUgd2hlcmUgdGhleQorCQkgKiB0aGluayBhIGZ1bGwgNCBieXRlIHNhbXBsZSB3YXMgd3JpdHRlbiB3aGVuIHJlYWxseSBvbmx5CisJCSAqIGEgcG9ydGlvbiB3YXMsIHJlc3VsdGluZyBpbiBvZGQgc291bmQgYW5kIHN0ZXJlbworCQkgKiBoeXN0ZXJlc2lzLgorCQkgKi8KKwkJY250ICY9IH4weDM7CisJCWlmIChjbnQgPD0gMCkgeworCQkJdW5zaWduZWQgbG9uZyB0bW87CisJCQkvKgorCQkJICogRG9uJ3QgbGV0IHVzIGRlYWRsb2NrLiAgVGhlIEFEQyB3b24ndCBzdGFydCBpZgorCQkJICogZG1hYnVmLT50cmlnZ2VyIGlzbid0IHNldC4gIEEgY2FsbCB0byBTRVRUUklHR0VSCisJCQkgKiBjb3VsZCBoYXZlIHR1cm5lZCBpdCBvZmYgYWZ0ZXIgd2Ugc2V0IGl0IHRvIG9uCisJCQkgKiBwcmV2aW91c2x5LgorCQkJICovCisJCQlkbWFidWYtPnRyaWdnZXIgPSBQQ01fRU5BQkxFX0lOUFVUOworCQkJLyoKKwkJCSAqIFRoaXMgZG9lcyB0aHJlZSB0aGluZ3MuICBVcGRhdGVzIExWSSB0byBiZSBjb3JyZWN0LAorCQkJICogbWFrZXMgc3VyZSB0aGUgQURDIGlzIHJ1bm5pbmcsIGFuZCB1cGRhdGVzIHRoZQorCQkJICogaHdwdHIuCisJCQkgKi8KKwkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAxKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCS8qIFNldCB0aGUgdGltZW91dCB0byBob3cgbG9uZyBpdCB3b3VsZCB0YWtlIHRvIGZpbGwKKwkJCSAqIHR3byBvZiBvdXIgYnVmZmVycy4gIElmIHdlIGhhdmVuJ3QgYmVlbiB3b2tlIHVwCisJCQkgKiBieSB0aGVuLCB0aGVuIHdlIGtub3cgc29tZXRoaW5nIGlzIHdyb25nLgorCQkJICovCisJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFogKiAyKSAvIChkbWFidWYtPnJhdGUgKiA0KTsKKwkJCSAgICAKKwkJCS8qIFRoZXJlIGFyZSB0d28gc2l0dWF0aW9ucyB3aGVuIHNsZWVwX29uX3RpbWVvdXQgcmV0dXJucywgb25lIGlzIHdoZW4KKwkJCSAgIHRoZSBpbnRlcnJ1cHQgaXMgc2VydmljZWQgY29ycmVjdGx5IGFuZCB0aGUgcHJvY2VzcyBpcyB3YWtlZCB1cCBieQorCQkJICAgSVNSIE9OIFRJTUUuIEFub3RoZXIgaXMgd2hlbiB0aW1lb3V0IGlzIGV4cGlyZWQsIHdoaWNoIG1lYW5zIHRoYXQKKwkJCSAgIGVpdGhlciBpbnRlcnJ1cHQgaXMgTk9UIHNlcnZpY2VkIGNvcnJlY3RseSAocGVuZGluZyBpbnRlcnJ1cHQpIG9yIGl0CisJCQkgICBpcyBUT08gTEFURSBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAoc2NoZWR1bGVyIGxhdGVuY3kpCisJCQkgICB3aGljaCByZXN1bHRzIGluIGEgKHBvdGVudGlhbCkgYnVmZmVyIG92ZXJydW4uIEFuZCB3b3JzZSwgdGhlcmUgaXMKKwkJCSAgIE5PVEhJTkcgd2UgY2FuIGRvIHRvIHByZXZlbnQgaXQuICovCisJCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID49IDIgPyB0bW8gOiAyKSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICAiYWxpX2F1ZGlvOiByZWNvcmRpbmcgc2NoZWR1bGUgdGltZW91dCwgIgorCQkJCSAgICAgICAiZG1hc3ogJXUgZnJhZ3N6ICV1IGNvdW50ICVpIGh3cHRyICV1IHN3cHRyICV1XG4iLAorCQkJCSAgICAgICBkbWFidWYtPmRtYXNpemUsIGRtYWJ1Zi0+ZnJhZ3NpemUsCisJCQkJICAgICAgIGRtYWJ1Zi0+Y291bnQsIGRtYWJ1Zi0+aHdwdHIsCisJCQkJICAgICAgIGRtYWJ1Zi0+c3dwdHIpOworCQkJCS8qIGEgYnVmZmVyIG92ZXJydW4sIHdlIGRlbGF5IHRoZSByZWNvdmVyeSB1bnRpbCBuZXh0IHRpbWUgdGhlCisJCQkJICAgd2hpbGUgbG9vcCBiZWdpbiBhbmQgd2UgUkVBTExZIGhhdmUgc3BhY2UgdG8gcmVjb3JkICovCisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlyZXQgPSByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBkb25lOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKFBNX1NVU1BFTkRFRChjYXJkKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQkJY29udGludWU7CisJCX0KKwkJZG1hYnVmLT5zd3B0ciA9IHN3cHRyOworCQlkbWFidWYtPmNvdW50IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJfQorZG9uZToKKwlhbGlfdXBkYXRlX2x2aShzdGF0ZSwgMSk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB3YWl0aW5nIHRvIGJlIGRtYSB0bworICAgdGhlIHNvdW5kY2FyZC4gIGl0IGlzIGRyYWluZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCBmaWxsZWQgYnkgdGhpcyBsb29wLiAqLworc3RhdGljIHNzaXplX3QgYWxpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgYWxpX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBzdGF0ZSA/IHN0YXRlLT5jYXJkIDogTlVMTDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBzd3B0ciA9IDA7CisJaW50IGNudCwgeDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0YSwgY3VycmVudCk7CisjaWZkZWYgREVCVUcyCisJcHJpbnRrKCJhbGlfYXVkaW86IGFsaV93cml0ZSBjYWxsZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKKyNlbmRpZgorCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJaWYgKCFkbWFidWYtPmNvZGVjX3NwZGlmb3V0X2NoYW5uZWwpIHsKKwkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsID0gY2FyZC0+YWxsb2NfY29kZWNfc3BkaWZvdXRfY2hhbm5lbChjYXJkKTsKKwkJCWlmICghZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsKQorCQkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY29udHJvbGxlcl9pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlpZiAoIWRtYWJ1Zi0+Y29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwgPSBjYXJkLT5hbGxvY19jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwoY2FyZCk7CisJCQkJaWYgKCFkbWFidWYtPmNvbnRyb2xsZXJfc3BkaWZvdXRfY2hhbm5lbCkKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICghZG1hYnVmLT53cml0ZV9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT53cml0ZV9jaGFubmVsID0KKwkJCQkgICAgY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCk7CisJCQkJaWYgKCFkbWFidWYtPndyaXRlX2NoYW5uZWwpCisJCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlLCAyKSkpCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSB7CisJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9IGVsc2UgeworCisJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisJYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXRhKTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlpZiAoUE1fU1VTUEVOREVEKGNhcmQpKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJY250ID0gYWxpX2dldF9mcmVlX3dyaXRlX3NwYWNlKHN0YXRlKTsKKwkJLyogQm91bmQgdGhlIG1heGltdW0gc2l6ZSB0byBob3cgbXVjaCB3ZSBjYW4gY29weSB0byB0aGUKKwkJICogZG1hIGJ1ZmZlciBiZWZvcmUgd2UgaGl0IHRoZSBlbmQuICBJZiB3ZSBoYXZlIG1vcmUgdG8KKwkJICogY29weSB0aGVuIGl0IHdpbGwgZ2V0IGRvbmUgaW4gYSBzZWNvbmQgcGFzcyBvZiB0aGlzCisJCSAqIGxvb3Agc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuCisJCSAqLworCQlpZiAoY250ID4gKGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyKSkKKwkJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworI2lmZGVmIERFQlVHMgorCQlwcmludGsoS0VSTl9JTkZPCisJCSAgICAgICAiYWxpX2F1ZGlvOiBhbGlfd3JpdGU6ICVkIGJ5dGVzIGF2YWlsYWJsZSBzcGFjZVxuIiwKKwkJICAgICAgIGNudCk7CisjZW5kaWYKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCS8qIExvcCBvZmYgdGhlIGxhc3QgdHdvIGJpdHMgdG8gZm9yY2UgdGhlIGNvZGUgdG8gYWx3YXlzCisJCSAqIHdyaXRlIGluIGZ1bGwgc2FtcGxlcy4gIFRoaXMga2VlcHMgc29mdHdhcmUgdGhhdCBzZXRzCisJCSAqIE9fTk9OQkxPQ0sgYnV0IGRvZXNuJ3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUKKwkJICogd3JpdGUgY2FsbCBmcm9tIGdldHRpbmcgdGhpbmdzIG91dCBvZiBzdGF0ZSB3aGVyZSB0aGV5CisJCSAqIHRoaW5rIGEgZnVsbCA0IGJ5dGUgc2FtcGxlIHdhcyB3cml0dGVuIHdoZW4gcmVhbGx5IG9ubHkKKwkJICogYSBwb3J0aW9uIHdhcywgcmVzdWx0aW5nIGluIG9kZCBzb3VuZCBhbmQgc3RlcmVvCisJCSAqIGh5c3RlcmVzaXMuCisJCSAqLworCQljbnQgJj0gfjB4MzsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQl1bnNpZ25lZCBsb25nIHRtbzsKKwkJCS8vIFRoZXJlIGlzIGRhdGEgd2FpdGluZyB0byBiZSBwbGF5ZWQKKwkJCS8qCisJCQkgKiBGb3JjZSB0aGUgdHJpZ2dlciBzZXR0aW5nIHNpbmNlIHdlIHdvdWxkCisJCQkgKiBkZWFkbG9jayB3aXRoIGl0IHNldCBhbnkgb3RoZXIgd2F5CisJCQkgKi8KKwkJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQkJZG1hYnVmLT50cmlnZ2VyID0gU1BESUZfRU5BQkxFX09VVFBVVDsKKwkJCQlhbGlfdXBkYXRlX2x2aShzdGF0ZSwgMik7CisJCQl9IGVsc2UgeworCQkJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQkJZG1hYnVmLT50cmlnZ2VyID0gU1BESUZfRU5BQkxFX09VVFBVVDsKKwkJCQkJYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDMpOworCQkJCX0gZWxzZSB7CisKKwkJCQkJZG1hYnVmLT50cmlnZ2VyID0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCQkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAwKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJCS8qIE5vdCBzdHJpY3RseSBjb3JyZWN0IGJ1dCB3b3JrcyAqLworCQkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaICogMikgLyAoZG1hYnVmLT5yYXRlICogNCk7CisJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0IHJldHVybnMsIG9uZSBpcyB3aGVuCisJCQkgICB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkKKwkJCSAgIElTUiBPTiBUSU1FLiBBbm90aGVyIGlzIHdoZW4gdGltZW91dCBpcyBleHBpcmVkLCB3aGljaCBtZWFucyB0aGF0CisJCQkgICBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdAorCQkJICAgaXMgVE9PIExBVEUgZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKHNjaGVkdWxlciBsYXRlbmN5KQorCQkJICAgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpIGJ1ZmZlciB1bmRlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcworCQkJICAgTk9USElORyB3ZSBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KKwkJCSAgIAorCQkJLyogRklYTUUgLSBkbyB0aW1lb3V0IGhhbmRsaW5nIGhlcmUgISEgKi8KKwkJCXNjaGVkdWxlX3RpbWVvdXQodG1vID49IDIgPyB0bW8gOiAyKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIHJldDsKKwkJfQorCisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWlmIChQTV9TVVNQRU5ERUQoY2FyZCkpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZG1hYnVmLT5zd3B0ciA9IHN3cHRyOworCQlkbWFidWYtPmNvdW50ICs9IGNudDsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCX0KKwlpZiAoc3dwdHIgJSBkbWFidWYtPmZyYWdzaXplKSB7CisJCXggPSBkbWFidWYtPmZyYWdzaXplIC0gKHN3cHRyICUgZG1hYnVmLT5mcmFnc2l6ZSk7CisJCW1lbXNldChkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCAnXDAnLCB4KTsKKwl9CityZXQ6CisJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDIpOworCX0gZWxzZSB7CisJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAzKTsKKwkJfSBlbHNlIHsKKwkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAwKTsKKwkJfQorCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0YSk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgYWxpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdAorCQkJICAgICAqd2FpdCkKK3sKKwlzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgYWxpX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwlpZiAoIWRtYWJ1Zi0+cmVhZHkpCisJCXJldHVybiAwOworCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgeworCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKSBkbWFidWYtPmZyYWdzaXplKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgICYmIChkbWFidWYtPmVuYWJsZSAmIChEQUNfUlVOTklOR3xDT0RFQ19TUERJRk9VVF9SVU5OSU5HfENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykpKSB7CisJCWlmICgoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArIChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGFsaV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgYWxpX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgYWxpX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICghZG1hYnVmLT53cml0ZV9jaGFubmVsICYmIChkbWFidWYtPndyaXRlX2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQpKSA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRUJVU1k7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKKwkJaWYgKCFkbWFidWYtPnJlYWRfY2hhbm5lbCAmJiAoZG1hYnVmLT5yZWFkX2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkKSkgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpICE9IDApCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikpCisJCWdvdG8gb3V0OworCXJldCA9IC1FQUdBSU47CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJdmlydF90b19waHlzKGRtYWJ1Zi0+cmF3YnVmKSA+PiBQQUdFX1NISUZULAorCQkJCXNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJZ290byBvdXQ7CisJZG1hYnVmLT5tYXBwZWQgPSAxOworCWRtYWJ1Zi0+dHJpZ2dlciA9IDA7CisJcmV0ID0gMDsKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBhbGlfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCBhbGlfc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBhbGlfY2hhbm5lbCAqYyA9IE5VTEw7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhdWRpb19idWZfaW5mbyBhYmluZm87CisJY291bnRfaW5mbyBjaW5mbzsKKwl1bnNpZ25lZCBpbnQgaV9zY3I7CisJaW50IHZhbCA9IDAsIHJldDsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBzdGF0ZS0+Y2FyZC0+YWM5N19jb2RlY1swXTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJhbGlfYXVkaW86IGFsaV9pb2N0bCwgYXJnPTB4JXgsIGNtZD0iLAorCSAgICAgICBhcmcgPyAqcCA6IDApOworI2VuZGlmCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiT1NTX0dFVFZFUlNJT05cbiIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1JFU0VUXG4iKTsKKyNlbmRpZgorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IERBQ19SVU5OSU5HKSB7CisJCQljID0gZG1hYnVmLT53cml0ZV9jaGFubmVsOworCQkJX19zdG9wX2RhYyhzdGF0ZSk7CisJCX0KKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CisJCQljID0gZG1hYnVmLT5yZWFkX2NoYW5uZWw7CisJCQlfX3N0b3BfYWRjKHN0YXRlKTsKKwkJfQorCQlpZiAoZG1hYnVmLT5lbmFibGUgPT0gQ09ERUNfU1BESUZPVVRfUlVOTklORykgeworCQkJYyA9IGRtYWJ1Zi0+Y29kZWNfc3BkaWZvdXRfY2hhbm5lbDsKKwkJCV9fc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJCX0KKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykgeworCQkJYyA9IGRtYWJ1Zi0+Y29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsOworCQkJX19zdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwkJfQorCQlpZiAoYyAhPSBOVUxMKSB7CisJCQlvdXRiKDIsIHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBjLT5wb3J0ICsgT0ZGX0NSKTsJLyogcmVzZXQgRE1BIG1hY2hpbmUgKi8KKwkJCW91dGwodmlydF90b19idXMoJmMtPnNnWzBdKSwKKwkJCSAgICAgc3RhdGUtPmNhcmQtPmlvYmFzZSArIGMtPnBvcnQgKyBPRkZfQkRCQVIpOworCQkJb3V0YigwLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgYy0+cG9ydCArIE9GRl9DSVYpOworCQkJb3V0YigwLCBzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgYy0+cG9ydCArIE9GRl9MVkkpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJc3luY2hyb25pemVfaXJxKHN0YXRlLT5jYXJkLT5wY2lfZGV2LT5pcnEpOworCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOworCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7CisJCXJldHVybiAwOworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TWU5DXG4iKTsKKyNlbmRpZgorCQlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICE9IENPREVDX1NQRElGT1VUX1JVTk5JTkcKKwkJCSAgICB8fCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlyZXR1cm4gMDsKKwkJCWlmICgodmFsID0gZHJhaW5fc3BkaWZvdXQoc3RhdGUsIDEpKSkKKwkJCQlyZXR1cm4gdmFsOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAhPQorCQkJCSAgICBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkcKKwkJCQkgICAgfHwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJCXJldHVybiAwOworCQkJCWlmICgodmFsID0gZHJhaW5fc3BkaWZvdXQoc3RhdGUsIDEpKSkKKwkJCQkJcmV0dXJuIHZhbDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICE9IERBQ19SVU5OSU5HCisJCQkJICAgIHx8IGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCQlyZXR1cm4gMDsKKwkJCQlpZiAoKHZhbCA9IGRyYWluX2RhYyhzdGF0ZSwgMSkpKQorCQkJCQlyZXR1cm4gdmFsOworCQkJfQorCQl9CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCQlyZXR1cm4gMDsKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CS8qIHNldCBzbWFwbGUgcmF0ZSAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TUEVFRFxuIik7CisjZW5kaWYKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlpZiAoKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OKSkgewkvKiBTL1BESUYgRW5hYmxlZCAqLworCQkJCQkvKiBSRUxURUsgQUxDNjUwIG9ubHkgc3VwcG9ydCA0ODAwMCwgbmVlZCB0byBjaGVjayB0aGF0ICovCisJCQkJCWlmIChhbGlfdmFsaWRfc3BkaWZfcmF0ZShjb2RlYywgdmFsKSkgeworCQkJCQkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgLTEsIDApOworCQkJCQkJCXN0b3Bfc3BkaWZvdXQoc3RhdGUpOworCQkJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCQkJCS8qIEkgYWRkIHRlc3QgY29kZWMgaW5kZXBlbmRlbnQgc3BkaWYgb3V0ICovCisJCQkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQkJCQkJYWxpX3NldF9jb2RlY3NwZGlmb3V0X3JhdGUoc3RhdGUsIHZhbCk7CS8vIEkgbW9kaWZpZWQKKwkJCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQkJCS8qIFNldCBTL1BESUYgdHJhbnNtaXR0ZXIgcmF0ZS4gKi8KKwkJCQkJCQlpX3NjciA9IGlubChzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX1NDUik7CisJCQkJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAxMDAwMDApIHsKKwkJCQkJCQkJYWxpX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV83XzgsIGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJaWYgKChpX3NjciYweDAwMzAwMDAwKSAgPT0gMHgwMDIwMDAwMCkKKwkJCQkJCQkJeworCQkJCQkJCQkJYWxpX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV82XzksIGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJCQkJCX0gZWxzZSB7CisJCQkJCQkJCQlpZiAoKGlfc2NyICYgMHgwMDMwMDAwMCkgPT0gMHgwMDMwMDAwMCkgeworCQkJCQkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCBBQzk3X0VBX1NQU0FfMTBfMTEsIGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJCQkJCQl9IGVsc2UgeworCQkJCQkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCBBQzk3X0VBX1NQU0FfN184LCBjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQpOworCQkJCQkJCQkJfQorCQkJCQkJCQl9CisJCQkJCQkJfQorCisJCQkJCQkJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICYgU1BESUZfT04pKSB7CisJCQkJCQkJCXZhbCA9IGRtYWJ1Zi0+cmF0ZTsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIAorCQkJCQkJCXsKKwkJCQkJCQkJc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJCQkJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQkJCQkJYWxpX3NldF9zcGRpZm91dF9yYXRlKHN0YXRlLCBjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJLyogU2V0IERBQyByYXRlICovCisJCQkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCAtMSwgMCk7CisJCQkJCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQkJCQlhbGlfc2V0X2RhY19yYXRlKHN0YXRlLCB2YWwpOworCQkJCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQkJCQkvKiBTZXQgUy9QRElGIHRyYW5zbWl0dGVyIHJhdGUuICovCisJCQkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCBBQzk3X0VBX1NQU0FfM180LCB2YWwpOworCQkJCQkJCQlpZiAoIShzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTUERJRl9PTikpCisJCQkJCQkJCXsKKwkJCQkJCQkJCXZhbCA9IGRtYWJ1Zi0+cmF0ZTsKKwkJCQkJCQkJfQorCQkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsJLyogTm90IGEgdmFsaWQgcmF0ZSBmb3IgUy9QRElGLCBpZ25vcmUgaXQgKi8KKwkJCQkJCXZhbCA9IGRtYWJ1Zi0+cmF0ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQlhbGlfc2V0X2RhY19yYXRlKHN0YXRlLCB2YWwpOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCX0KKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCWFsaV9zZXRfYWRjX3JhdGUoc3RhdGUsIHZhbCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOgkvKiBzZXQgc3RlcmVvIG9yIG1vbm8gY2hhbm5lbCAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TVEVSRU9cbiIpOworI2VuZGlmCisJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSB7CisJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCX0KKwkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpIHsKKwkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJfQorCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKSB7CisJCQlzdG9wX3NwZGlmb3V0KHN0YXRlKTsKKwkJfQorCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkcpIHsKKwkJCXN0b3Bfc3BkaWZvdXQoc3RhdGUpOworCQl9CisJCXJldHVybiBwdXRfdXNlcigxLCBwKTsKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDIpKSkKKwkJCQkJcmV0dXJuIHZhbDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAzKSkpCisJCQkJCQlyZXR1cm4gdmFsOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSkKKwkJCQkJCXJldHVybiB2YWw7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDEpKSkKKwkJCQlyZXR1cm4gdmFsOworCQl9CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVEJMS1NJWkUgJWRcbiIsIGRtYWJ1Zi0+dXNlcmZyYWdzaXplKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT51c2VyZnJhZ3NpemUsIHApOworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgkvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRGTVRTXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEUsIHApOworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CS8qIFNlbGVjdCBzYW1wbGUgZm9ybWF0ICovCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZNVFxuIik7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFLCBwKTsKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CS8vIGFkZCBzdXBwb3J0IDQsNiBjaGFubmVsIAorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9DSEFOTkVMU1xuIik7CisjZW5kaWYKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+IDApIHsKKwkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSB7CisJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJfQorCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09ERUNfU1BESUZPVVRfUlVOTklORykgeworCQkJCXN0b3Bfc3BkaWZvdXQoc3RhdGUpOworCQkJfQorCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQ09OVFJPTExFUl9TUERJRk9VVF9SVU5OSU5HKSB7CisJCQkJc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJCQl9CisJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgeworCQkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXJldHVybiBwdXRfdXNlcihzdGF0ZS0+Y2FyZC0+Y2hhbm5lbHMsIHApOworCQl9CisKKwkJaV9zY3IgPSBpbmwoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpOworCQkvKiBDdXJyZW50ICMgb2YgY2hhbm5lbHMgZW5hYmxlZCAqLworCQlpZiAoaV9zY3IgJiAweDAwMDAwMTAwKQorCQkJcmV0ID0gNDsKKwkJZWxzZSBpZiAoaV9zY3IgJiAweDAwMDAwMjAwKQorCQkJcmV0ID0gNjsKKwkJZWxzZQorCQkJcmV0ID0gMjsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSAyOgkvKiAyIGNoYW5uZWxzIGlzIGFsd2F5cyBzdXBwb3J0ZWQgKi8KKwkJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQkJb3V0bCgoKGlfc2NyICYgMHhmZmZmZmNmZikgfCAweDAwMTAwMDAwKSwgKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfU0NSKSk7CisJCQl9IGVsc2UKKwkJCQlvdXRsKChpX3NjciAmIDB4ZmZmZmZjZmYpLCAoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpKTsKKwkJCS8qIERvIHdlIG5lZWQgdG8gY2hhbmdlIG1peGVyIHNldHRpbmdzPz8/PyAgKi8KKwkJCWJyZWFrOworCQljYXNlIDQ6CS8qIFN1cHBvcnRlZCBvbiBzb21lIGNoaXBzZXRzLCBiZXR0ZXIgY2hlY2sgZmlyc3QgKi8KKwkJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQkJb3V0bCgoKGlfc2NyICYgMHhmZmZmZmNmZikgfCAweDAwMDAwMTAwIHwgMHgwMDIwMDAwMCksIChzdGF0ZS0+Y2FyZC0+aW9iYXNlICsgQUxJX1NDUikpOworCQkJfSBlbHNlCisJCQkJb3V0bCgoKGlfc2NyICYgMHhmZmZmZmNmZikgfCAweDAwMDAwMTAwKSwgKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfU0NSKSk7CisJCQlicmVhazsKKwkJY2FzZSA2OgkvKiBTdXBwb3J0ZWQgb24gc29tZSBjaGlwc2V0cywgYmV0dGVyIGNoZWNrIGZpcnN0ICovCisJCQlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCW91dGwoKChpX3NjciAmIDB4ZmZmZmZjZmYpIHwgMHgwMDAwMDIwMCB8IDB4MDAwMDgwMDAgfCAweDAwMzAwMDAwKSwgKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfU0NSKSk7CisJCQl9IGVsc2UKKwkJCQlvdXRsKCgoaV9zY3IgJiAweGZmZmZmY2ZmKSB8IDB4MDAwMDAyMDAgfCAweDAwMDA4MDAwKSwgKHN0YXRlLT5jYXJkLT5pb2Jhc2UgKyBBTElfU0NSKSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoJLyogbm90aGluZyBlbHNlIGlzIGV2ZXIgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwc2V0ICovCisJCQl2YWwgPSByZXQ7CisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwljYXNlIFNORENUTF9EU1BfUE9TVDoJLyogdGhlIHVzZXIgaGFzIHNlbnQgYWxsIGRhdGEgYW5kIGlzIG5vdGlmeWluZyB1cyAqLworCQkvKiB3ZSB1cGRhdGUgdGhlIHN3cHRyIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3Qgc2cgc2VnbWVudCB0aGVuIHJldHVybiAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9QT1NUXG4iKTsKKyNlbmRpZgorCQlpZiAoY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJaWYgKCFkbWFidWYtPnJlYWR5IHx8IChkbWFidWYtPmVuYWJsZSAhPSBDT0RFQ19TUERJRk9VVF9SVU5OSU5HKSkKKwkJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgfHwgKGRtYWJ1Zi0+ZW5hYmxlICE9IENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykpCisJCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgfHwgKGRtYWJ1Zi0+ZW5hYmxlICE9IERBQ19SVU5OSU5HKSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwkJaWYgKChkbWFidWYtPnN3cHRyICUgZG1hYnVmLT5mcmFnc2l6ZSkgIT0gMCkgeworCQkJdmFsID0gZG1hYnVmLT5mcmFnc2l6ZSAtIChkbWFidWYtPnN3cHRyICUgZG1hYnVmLT5mcmFnc2l6ZSk7CisJCQlkbWFidWYtPnN3cHRyICs9IHZhbDsKKwkJCWRtYWJ1Zi0+Y291bnQgKz0gdmFsOworCQl9CisJCXJldHVybiAwOworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmIChkbWFidWYtPnN1YmRpdmlzaW9uKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMiAmJiB2YWwgIT0gNCkKKwkJCXJldHVybiAtRUlOVkFMOworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TVUJESVZJREUgJWRcbiIsIHZhbCk7CisjZW5kaWYKKwkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCXJldHVybiAwOworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZG1hYnVmLT5vc3NmcmFnc2l6ZSA9IDEgPDwgKHZhbCAmIDB4ZmZmZik7CisJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJaWYgKCFkbWFidWYtPm9zc2ZyYWdzaXplIHx8ICFkbWFidWYtPm9zc21heGZyYWdzKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qCisJCSAqIEJvdW5kIHRoZSBmcmFnIHNpemUgaW50byBvdXIgYWxsb3dlZCByYW5nZSBvZiAyNTYgLSA0MDk2CisJCSAqLworCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2l6ZSA8IDI1NikKKwkJCWRtYWJ1Zi0+b3NzZnJhZ3NpemUgPSAyNTY7CisJCWVsc2UgaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NpemUgPiA0MDk2KQorCQkJZG1hYnVmLT5vc3NmcmFnc2l6ZSA9IDQwOTY7CisJCS8qCisJCSAqIFRoZSBudW1mcmFncyBjb3VsZCBiZSBzb21ldGhpbmcgcmVhc29uYWJsZSwgb3IgaXQgY291bGQKKwkJICogYmUgMHhmZmZmIG1lYW5pbmcgIkdpdmUgbWUgYXMgbXVjaCBhcyBwb3NzaWJsZSIuICBTbywKKwkJICogd2UgY2hlY2sgdGhlIG51bWZyYWdzICogZnJhZ3NpemUgZG9lc24ndCBleGNlZWQgb3VyCisJCSAqIDY0ayBidWZmZXIgbGltaXQsIG5vciBpcyBpdCBsZXNzIHRoYW4gb3VyIDhrIG1pbmltdW0uCisJCSAqIElmIGl0IGZhaWxzIGVpdGhlciBvbmUgb2YgdGhlc2UgY2hlY2tzLCB0aGVuIGFkanVzdCB0aGUKKwkJICogbnVtYmVyIG9mIGZyYWdtZW50cywgbm90IHRoZSBzaXplIG9mIHRoZW0uICBJdCdzIE9LIGlmCisJCSAqIG91ciBudW1iZXIgb2YgZnJhZ21lbnRzIGRvZXNuJ3QgZXF1YWwgMzIgb3IgYW55dGhpbmcKKwkJICogbGlrZSBvdXIgaGFyZHdhcmUgYmFzZWQgbnVtYmVyIG5vdyBzaW5jZSB3ZSBhcmUgdXNpbmcKKwkJICogYSBkaWZmZXJlbnQgZnJhZyBjb3VudCBmb3IgdGhlIGhhcmR3YXJlLiAgQmVmb3JlIHdlIGdldAorCQkgKiBpbnRvIHRoaXMgdGhvdWdoLCBib3VuZCB0aGUgbWF4ZnJhZ3MgdG8gYXZvaWQgb3ZlcmZsb3cKKwkJICogaXNzdWVzLiAgQSByZWFzb25hYmxlIGJvdW5kIHdvdWxkIGJlIDY0ayAvIDI1NiBzaW5jZSBvdXIKKwkJICogbWF4aW11bSBidWZmZXIgc2l6ZSBpcyA2NGsgYW5kIG91ciBtaW5pbXVtIGZyYWcgc2l6ZSBpcworCQkgKiAyNTYuICBPbiB0aGUgb3RoZXIgZW5kLCBvdXIgbWluaW11bSBidWZmZXIgc2l6ZSBpcyA4ayBhbmQKKwkJICogb3VyIG1heGltdW0gZnJhZyBzaXplIGlzIDRrLCBzbyB0aGUgbG93ZXIgYm91bmQgc2hvdWxkCisJCSAqIGJlIDIuCisJCSAqLworCQlpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA+IDI1NikKKwkJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAyNTY7CisJCWVsc2UgaWYgKGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPCAyKQorCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA9IDI7CisJCXZhbCA9IGRtYWJ1Zi0+b3NzZnJhZ3NpemUgKiBkbWFidWYtPm9zc21heGZyYWdzOworCQl3aGlsZSAodmFsIDwgODE5MikgeworCQkJdmFsIDw8PSAxOworCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA8PD0gMTsKKwkJfQorCQl3aGlsZSAodmFsID4gNjU1MzYpIHsKKwkJCXZhbCA+Pj0gMTsKKwkJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPj49IDE7CisJCX0KKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZSQUdNRU5UIDB4JXgsICVkLCAlZFxuIiwgdmFsLAorCQkgICAgICAgZG1hYnVmLT5vc3NmcmFnc2l6ZSwgZG1hYnVmLT5vc3NtYXhmcmFncyk7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAyKSkgIT0gMCkKKwkJCQlyZXR1cm4gdmFsOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDMpKSAhPSAwKQorCQkJCQlyZXR1cm4gdmFsOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkgIT0gMCkKKwkJCQkJcmV0dXJuIHZhbDsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJYWxpX3VwZGF0ZV9wdHIoc3RhdGUpOworCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPnVzZXJmcmFnc2l6ZTsKKwkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPnVzZXJmcmFnczsKKwkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplOworCQllbHNlCisJCQlhYmluZm8uYnl0ZXMgPSBhbGlfZ2V0X2ZyZWVfd3JpdGVfc3BhY2Uoc3RhdGUpOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzIC8gZG1hYnVmLT51c2VyZnJhZ3NpemU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChERUJVR19NTUFQKQorCQlwcmludGsoIlNORENUTF9EU1BfR0VUT1NQQUNFICVkLCAlZCwgJWQsICVkXG4iLAorCQkgICAgICAgYWJpbmZvLmJ5dGVzLCBhYmluZm8uZnJhZ3NpemUsIGFiaW5mby5mcmFnbWVudHMsCisJCSAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCk7CisjZW5kaWYKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLAorCQkJCSAgICBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAyKSkgIT0gMCkKKwkJCQlyZXR1cm4gdmFsOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDMpKSAhPSAwKQorCQkJCQlyZXR1cm4gdmFsOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkgIT0gMCkKKwkJCQkJcmV0dXJuIHZhbDsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJdmFsID0gYWxpX2dldF9mcmVlX3dyaXRlX3NwYWNlKHN0YXRlKTsKKwkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOworCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCQljaW5mby5ibG9ja3MgPSB2YWwgLyBkbWFidWYtPnVzZXJmcmFnc2l6ZTsKKwkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCWlmIChkbWFidWYtPm1hcHBlZCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgU1BESUZfRU5BQkxFX09VVFBVVCkpIHsKKwkJCQlkbWFidWYtPmNvdW50ICs9IHZhbDsKKwkJCQlkbWFidWYtPnN3cHRyID0gKGRtYWJ1Zi0+c3dwdHIgKyB2YWwpICUgZG1hYnVmLT5kbWFzaXplOworCQkJCV9fYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDIpOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmIChkbWFidWYtPm1hcHBlZCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgU1BESUZfRU5BQkxFX09VVFBVVCkpIHsKKwkJCQkJZG1hYnVmLT5jb3VudCArPSB2YWw7CisJCQkJCWRtYWJ1Zi0+c3dwdHIgPSAoZG1hYnVmLT5zd3B0ciArIHZhbCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJCV9fYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDMpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkICYmIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX09VVFBVVCkpIHsKKwkJCQkJZG1hYnVmLT5jb3VudCArPSB2YWw7CisJCQkJCWRtYWJ1Zi0+c3dwdHIgPSAoZG1hYnVmLT5zd3B0ciArIHZhbCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJCV9fYWxpX3VwZGF0ZV9sdmkoc3RhdGUsIDApOworCQkJCX0KKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9QVFIgJWQsICVkLCAlZCwgJWRcbiIsIGNpbmZvLmJ5dGVzLAorCQkgICAgICAgY2luZm8uYmxvY2tzLCBjaW5mby5wdHIsIGRtYWJ1Zi0+Y291bnQpOworI2VuZGlmCisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKT8gLUVGQVVMVCA6IDA7CisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJYWJpbmZvLmJ5dGVzID0gYWxpX2dldF9hdmFpbGFibGVfcmVhZF9kYXRhKHN0YXRlKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT51c2VyZnJhZ3NpemU7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT51c2VyZnJhZ3M7CisJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgLyBkbWFidWYtPnVzZXJmcmFnc2l6ZTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX01NQVApCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRJU1BBQ0UgJWQsICVkLCAlZCwgJWRcbiIsCisJCSAgICAgICBhYmluZm8uYnl0ZXMsIGFiaW5mby5mcmFnc2l6ZSwgYWJpbmZvLmZyYWdtZW50cywKKwkJICAgICAgIGFiaW5mby5mcmFnc3RvdGFsKTsKKyNlbmRpZgorCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sCisJCQkJICAgIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQl2YWwgPSBhbGlfZ2V0X2F2YWlsYWJsZV9yZWFkX2RhdGEoc3RhdGUpOworCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXM7CisJCWNpbmZvLmJsb2NrcyA9IHZhbCAvIGRtYWJ1Zi0+dXNlcmZyYWdzaXplOworCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCQlpZiAoZG1hYnVmLT5tYXBwZWQgJiYgKGRtYWJ1Zi0+dHJpZ2dlciAmIFBDTV9FTkFCTEVfSU5QVVQpKSB7CisJCQlkbWFidWYtPmNvdW50IC09IHZhbDsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSAoZG1hYnVmLT5zd3B0ciArIHZhbCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQlfX2FsaV91cGRhdGVfbHZpKHN0YXRlLCAxKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVElQVFIgJWQsICVkLCAlZCwgJWRcbiIsIGNpbmZvLmJ5dGVzLAorCQkgICAgICAgY2luZm8uYmxvY2tzLCBjaW5mby5wdHIsIGRtYWJ1Zi0+Y291bnQpOworI2VuZGlmCisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKT8gLUVGQVVMVDogMDsKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX05PTkJMT0NLXG4iKTsKKyNlbmRpZgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRDQVBTXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8CisJCQkJRFNQX0NBUF9NTUFQIHwgRFNQX0NBUF9CSU5ELCBwKTsKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfR0VUVFJJR0dFUiAweCV4XG4iLCBkbWFidWYtPnRyaWdnZXIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnRyaWdnZXIsIHApOworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NFVFRSSUdHRVIgMHgleFxuIiwgdmFsKTsKKyNlbmRpZgorCQlpZiAoISh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSAmJiBkbWFidWYtPmVuYWJsZSA9PSBBRENfUlVOTklORykgeworCQkJc3RvcF9hZGMoc3RhdGUpOworCQl9CisJCWlmICghKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSAmJiBkbWFidWYtPmVuYWJsZSA9PSBEQUNfUlVOTklORykgeworCQkJc3RvcF9kYWMoc3RhdGUpOworCQl9CisJCWlmICghKHZhbCAmIFNQRElGX0VOQUJMRV9PVVRQVVQpICYmIGRtYWJ1Zi0+ZW5hYmxlID09IENPREVDX1NQRElGT1VUX1JVTk5JTkcpIHsKKwkJCXN0b3Bfc3BkaWZvdXQoc3RhdGUpOworCQl9CisJCWlmICghKHZhbCAmIFNQRElGX0VOQUJMRV9PVVRQVVQpICYmIGRtYWJ1Zi0+ZW5hYmxlID09IENPTlRST0xMRVJfU1BESUZPVVRfUlVOTklORykgeworCQkJc3RvcF9zcGRpZm91dChzdGF0ZSk7CisJCX0KKwkJZG1hYnVmLT50cmlnZ2VyID0gdmFsOworCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQgJiYgIShkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSkgeworCQkJaWYgKCFkbWFidWYtPndyaXRlX2NoYW5uZWwpIHsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQlkbWFidWYtPndyaXRlX2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQpOworCQkJCWlmICghZG1hYnVmLT53cml0ZV9jaGFubmVsKQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQkJZG1hYnVmLT5jb3VudCA9IGFsaV9nZXRfZnJlZV93cml0ZV9zcGFjZShzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IChkbWFidWYtPnN3cHRyICsgZG1hYnVmLT5jb3VudCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJX19hbGlfdXBkYXRlX2x2aShzdGF0ZSwgMCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssCisJCQkJCQkgICAgICAgZmxhZ3MpOworCQkJfSBlbHNlCisJCQkJc3RhcnRfZGFjKHN0YXRlKTsKKwkJfQorCQlpZiAodmFsICYgU1BESUZfRU5BQkxFX09VVFBVVCAmJiAhKGRtYWJ1Zi0+ZW5hYmxlICYgQ09ERUNfU1BESUZPVVRfUlVOTklORykpIHsKKwkJCWlmICghZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsID0gc3RhdGUtPmNhcmQtPmFsbG9jX2NvZGVjX3NwZGlmb3V0X2NoYW5uZWwoc3RhdGUtPmNhcmQpOworCQkJCWlmICghZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsKQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMikpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQkJZG1hYnVmLT5jb3VudCA9IGFsaV9nZXRfZnJlZV93cml0ZV9zcGFjZShzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IChkbWFidWYtPnN3cHRyICsgZG1hYnVmLT5jb3VudCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJX19hbGlfdXBkYXRlX2x2aShzdGF0ZSwgMik7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssCisJCQkJCQkgICAgICAgZmxhZ3MpOworCQkJfSBlbHNlCisJCQkJc3RhcnRfc3BkaWZvdXQoc3RhdGUpOworCQl9CisJCWlmICh2YWwgJiBTUERJRl9FTkFCTEVfT1VUUFVUICYmICEoZG1hYnVmLT5lbmFibGUgJiBDT05UUk9MTEVSX1NQRElGT1VUX1JVTk5JTkcpKSB7CisJCQlpZiAoIWRtYWJ1Zi0+Y29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfY29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsKHN0YXRlLT5jYXJkKTsKKwkJCQlpZiAoIWRtYWJ1Zi0+Y29udHJvbGxlcl9zcGRpZm91dF9jaGFubmVsKQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMykpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQkJZG1hYnVmLT5jb3VudCA9IGFsaV9nZXRfZnJlZV93cml0ZV9zcGFjZShzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IChkbWFidWYtPnN3cHRyICsgZG1hYnVmLT5jb3VudCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJX19hbGlfdXBkYXRlX2x2aShzdGF0ZSwgMyk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCX0gZWxzZQorCQkJCXN0YXJ0X3NwZGlmb3V0KHN0YXRlKTsKKwkJfQorCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCAmJiAhKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpKSB7CisJCQlpZiAoIWRtYWJ1Zi0+cmVhZF9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5yZWFkX2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkKTsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZF9jaGFubmVsKQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssCisJCQkJCQkgIGZsYWdzKTsKKwkJCQlhbGlfdXBkYXRlX3B0cihzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWFsaV91cGRhdGVfbHZpKHN0YXRlLCAxKTsKKwkJCXN0YXJ0X2FkYyhzdGF0ZSk7CisJCX0KKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfU0VURFVQTEVYXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWFsaV91cGRhdGVfcHRyKHN0YXRlKTsKKwkJdmFsID0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfR0VUT0RFTEFZICVkXG4iLCBkbWFidWYtPmNvdW50KTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9SQVRFICVkXG4iLCBkbWFidWYtPnJhdGUpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnJhdGUsIHApOworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9DSEFOTkVMU1xuIik7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKDIsIHApOworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNPVU5EX1BDTV9SRUFEX0JJVFNcbiIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSwgcCk7CisJY2FzZSBTTkRDVExfRFNQX1NFVFNQRElGOgkvKiBTZXQgUy9QRElGIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfU0VUU1BESUZcbiIpOworI2VuZGlmCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCS8qIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgY29kZWMgc3VwcG9ydHMgUy9QRElGIHRyYW5zbWl0dGVyICovCisJCWlmICgoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiA0KSkgeworCQkJLyogbWFzayBvdXQgdGhlIHRyYW5zbWl0dGVyIHNwZWVkIGJpdHMgc28gdGhlIHVzZXIgY2FuJ3Qgc2V0IHRoZW0gKi8KKwkJCXZhbCAmPSB+MHgzMDAwOworCQkJLyogQWRkIHRoZSBjdXJyZW50IHRyYW5zbWl0dGVyIHNwZWVkIGJpdHMgdG8gdGhlIHBhc3NlZCB2YWx1ZSAqLworCQkJcmV0ID0gYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1NQRElGX0NPTlRST0wpOworCQkJdmFsIHw9IChyZXQgJiAweDMwMDApOworCQkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1NQRElGX0NPTlRST0wsIHZhbCk7CisJCQlpZiAoYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1NQRElGX0NPTlRST0wpICE9IHZhbCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiYWxpX2F1ZGlvOiBVbmFibGUgdG8gc2V0IFMvUERJRiBjb25maWd1cmF0aW9uIHRvIDB4JTA0eC5cbiIsIHZhbCk7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCX0KKyNpZmRlZiBERUJVRworCQllbHNlCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGlfYXVkaW86IFMvUERJRiB0cmFuc21pdHRlciBub3QgYXZhbGlibGUuXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwljYXNlIFNORENUTF9EU1BfR0VUU1BESUY6CS8qIEdldCBTL1BESUYgQ29udHJvbCByZWdpc3RlciAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRTUERJRlxuIik7CisjZW5kaWYKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb2RlYyBzdXBwb3J0cyBTL1BESUYgdHJhbnNtaXR0ZXIgKi8KKwkJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiA0KSkgeworI2lmZGVmIERFQlVHCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGlfYXVkaW86IFMvUERJRiB0cmFuc21pdHRlciBub3QgYXZhbGlibGUuXG4iKTsKKyNlbmRpZgorCQkJdmFsID0gMDsKKwkJfSBlbHNlIHsKKwkJCXZhbCA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19TUERJRl9DT05UUk9MKTsKKwkJfQorCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworLy9lbmQgYWRkIHN1cHBvcnQgc3BkaWYgb3V0CisvL2FkZCBzdXBwb3J0IDQsNiBjaGFubmVsCisJY2FzZSBTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTS1xuIik7CisjZW5kaWYKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJLyogQmFzZWQgb24gQUMnOTcgREFDIHN1cHBvcnQsIG5vdCBJQ0ggaGFyZHdhcmUgKi8KKwkJdmFsID0gRFNQX0JJTkRfRlJPTlQ7CisJCWlmIChzdGF0ZS0+Y2FyZC0+YWM5N19mZWF0dXJlcyAmIDB4MDAwNCkKKwkJCXZhbCB8PSBEU1BfQklORF9TUERJRjsKKwkJaWYgKHN0YXRlLT5jYXJkLT5hYzk3X2ZlYXR1cmVzICYgMHgwMDgwKQorCQkJdmFsIHw9IERTUF9CSU5EX1NVUlI7CisJCWlmIChzdGF0ZS0+Y2FyZC0+YWM5N19mZWF0dXJlcyAmIDB4MDE0MCkKKwkJCXZhbCB8PSBEU1BfQklORF9DRU5URVJfTEZFOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwljYXNlIFNORENUTF9EU1BfQklORF9DSEFOTkVMOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9CSU5EX0NIQU5ORUxcbiIpOworI2VuZGlmCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPT0gRFNQX0JJTkRfUVVFUlkpIHsKKwkJCXZhbCA9IERTUF9CSU5EX0ZST05UOwkvKiBBbHdheXMgcmVwb3J0IHRoaXMgYXMgYmVpbmcgZW5hYmxlZCAqLworCQkJaWYgKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OKQorCQkJCXZhbCB8PSBEU1BfQklORF9TUERJRjsKKwkJCWVsc2UgeworCQkJCWlmIChzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTVVJSX09OKQorCQkJCQl2YWwgfD0gRFNQX0JJTkRfU1VSUjsKKwkJCQlpZiAoc3RhdGUtPmNhcmQtPgorCQkJCSAgICBhYzk3X3N0YXR1cyAmIENFTlRFUl9MRkVfT04pCisJCQkJCXZhbCB8PSBEU1BfQklORF9DRU5URVJfTEZFOworCQkJfQorCQl9IGVsc2UgewkvKiBOb3QgYSBxdWVyeSwgc2V0IGl0ICovCisJCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZG1hYnVmLT5lbmFibGUgPT0gREFDX1JVTk5JTkcpIHsKKwkJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQl9CisJCQlpZiAodmFsICYgRFNQX0JJTkRfU1BESUYpIHsJLyogVHVybiBvbiBTUERJRiAqLworCQkJCS8qICBPaywgdGhpcyBzaG91bGQgcHJvYmFibHkgZGVmaW5lIHdoYXQgc2xvdHMKKwkJCQkgKiAgdG8gdXNlLiBGb3Igbm93LCB3ZSdsbCBvbmx5IHNldCBpdCB0byB0aGUKKwkJCQkgKiAgZGVmYXVsdHM6CisJCQkJICogCisJCQkJICogICBub24gbXVsdGljaGFubmVsIGNvZGVjIG1hcHMgdG8gc2xvdHMgMyY0CisJCQkJICogICAyIGNoYW5uZWwgY29kZWMgbWFwcyB0byBzbG90cyA3JjgKKwkJCQkgKiAgIDQgY2hhbm5lbCBjb2RlYyBtYXBzIHRvIHNsb3RzIDYmOQorCQkJCSAqICAgNiBjaGFubmVsIGNvZGVjIG1hcHMgdG8gc2xvdHMgMTAmMTEKKwkJCQkgKgorCQkJCSAqICB0aGVyZSBzaG91bGQgYmUgc29tZSB3YXkgZm9yIHRoZSBhcHAgdG8KKwkJCQkgKiAgc2VsZWN0IHRoZSBzbG90IGFzc2lnbm1lbnQuCisJCQkJICovCisJCQkJaV9zY3IgPSBpbmwoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpOworCQkJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisKKwkJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAxMDAwMDApIHsKKwkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCBBQzk3X0VBX1NQU0FfN184LCBjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAyMDAwMDApIHsKKwkJCQkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgQUM5N19FQV9TUFNBXzZfOSwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAzMDAwMDApIHsKKwkJCQkJCQkJYWxpX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV8xMF8xMSwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9IGVsc2UgewkvKiBjb2RlYyBzcGRpZiBvdXQgKHBjbSBvdXQgc2hhcmUgKSAqLworCQkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgQUM5N19FQV9TUFNBXzNfNCwgZG1hYnVmLT5yYXRlKTsJLy9JIGRvIG5vdCBtb2RpZnkKKwkJCQl9CisKKwkJCQlpZiAoIShzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTUERJRl9PTikpCisJCQkJCXZhbCAmPSB+RFNQX0JJTkRfU1BESUY7CisJCQl9IGVsc2UgeworCQkJCWludCBtYXNrOworCQkJCWludCBjaGFubmVsczsKKwkJCQkvKiBUdXJuIG9mZiBTL1BESUYgaWYgaXQgd2FzIG9uICovCisJCQkJaWYgKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OKQorCQkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgLTEsIDApOworCQkJCW1hc2sgPQorCQkJCSAgICB2YWwgJiAoRFNQX0JJTkRfRlJPTlQgfCBEU1BfQklORF9TVVJSIHwKKwkJCQkJICAgRFNQX0JJTkRfQ0VOVEVSX0xGRSk7CisJCQkJc3dpdGNoIChtYXNrKSB7CisJCQkJY2FzZSBEU1BfQklORF9GUk9OVDoKKwkJCQkJY2hhbm5lbHMgPSAyOworCQkJCQlicmVhazsKKwkJCQljYXNlIERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUjoKKwkJCQkJY2hhbm5lbHMgPSA0OworCQkJCQlicmVhazsKKwkJCQljYXNlIERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUiB8IERTUF9CSU5EX0NFTlRFUl9MRkU6CisJCQkJCWNoYW5uZWxzID0gNjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJdmFsID0gRFNQX0JJTkRfRlJPTlQ7CisJCQkJCWNoYW5uZWxzID0gMjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWFsaV9zZXRfZGFjX2NoYW5uZWxzKHN0YXRlLCBjaGFubmVscyk7CisJCQkJLyogY2hlY2sgdGhhdCB0aGV5IHJlYWxseSBnb3QgdHVybmVkIG9uICovCisJCQkJaWYgKCFzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTVVJSX09OKQorCQkJCQl2YWwgJj0gfkRTUF9CSU5EX1NVUlI7CisJCQkJaWYgKCFzdGF0ZS0+Y2FyZC0+CisJCQkJICAgIGFjOTdfc3RhdHVzICYgQ0VOVEVSX0xGRV9PTikKKwkJCQkJdmFsICY9IH5EU1BfQklORF9DRU5URVJfTEZFOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKKwljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgYWxpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGkgPSAwOworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IGRldnM7CisJc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUgPSBOVUxMOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9IE5VTEw7CisJdW5zaWduZWQgaW50IGlfc2NyOworCQorCS8qIGZpbmQgYW4gYXZhaWxhYmxlIHZpcnR1YWwgY2hhbm5lbCAoaW5zdGFuY2Ugb2YgL2Rldi9kc3ApICovCisJCisJd2hpbGUgKGNhcmQgIT0gTlVMTCkgeworCisJCS8qCisJCSAqIElmIHdlIGFyZSBpbml0aWFsaXppbmcgYW5kIHRoZW4gZmFpbCwgY2FyZCBjb3VsZCBnbworCQkgKiBhd2F5IHVudWV4cGVjdGVkbHkgd2hpbGUgd2UgYXJlIGluIHRoZSBmb3IoKSBsb29wLgorCQkgKiBTbywgY2hlY2sgZm9yIGNhcmQgb24gZWFjaCBpdGVyYXRpb24gYmVmb3JlIHdlIGNoZWNrCisJCSAqIGZvciBjYXJkLT5pbml0aWFsaXppbmcgdG8gYXZvaWQgYSBwb3NzaWJsZSBvb3BzLgorCQkgKiBUaGlzIHVzdWFsbHkgb25seSBtYXR0ZXJzIGZvciB0aW1lcyB3aGVuIHRoZSBkcml2ZXIgaXMKKwkJICogYXV0b2xvYWRlZCBieSBrbW9kLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDUwICYmIGNhcmQgJiYgY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAyMCk7CisJCX0KKworCQlmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0ggJiYgY2FyZCAmJiAhY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspIHsKKwkJCWlmIChjYXJkLT5zdGF0ZXNbaV0gPT0gTlVMTCkgeworCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzW2ldID0gKHN0cnVjdCBhbGlfc3RhdGUgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGFsaV9zdGF0ZSksIEdGUF9LRVJORUwpOworCQkJCWlmIChzdGF0ZSA9PSBOVUxMKQorCQkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgYWxpX3N0YXRlKSk7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJZ290byBmb3VuZF92aXJ0OworCQkJfQorCQl9CisJCWNhcmQgPSBjYXJkLT5uZXh0OworCX0KKworCS8qIG5vIG1vcmUgdmlydHVhbCBjaGFubmVsIGF2YWlhYmxlICovCisJaWYgKCFzdGF0ZSkKKwkJcmV0dXJuIC1FTk9ERVY7Citmb3VuZF92aXJ0OgorCS8qIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgY2hhbm5lbCAqLworCisJc3RhdGUtPnZpcnQgPSBpOworCXN0YXRlLT5jYXJkID0gY2FyZDsKKwlzdGF0ZS0+bWFnaWMgPSBBTEk1NDU1X1NUQVRFX01BR0lDOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7CisJaW5pdF9NVVRFWCgmc3RhdGUtPm9wZW5fc2VtKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzdGF0ZTsKKwlkbWFidWYtPnRyaWdnZXIgPSAwOworCS8qIGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWxzICovCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKChkbWFidWYtPnJlYWRfY2hhbm5lbCA9CisJCSAgICAgY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKGNhcmQpKSA9PSBOVUxMKSB7CisJCQlrZnJlZShjYXJkLT5zdGF0ZXNbaV0pOworCQkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJZG1hYnVmLT50cmlnZ2VyIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWFsaV9zZXRfYWRjX3JhdGUoc3RhdGUsIDgwMDApOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJCWlmICgoZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsID0gY2FyZC0+YWxsb2NfY29kZWNfc3BkaWZvdXRfY2hhbm5lbChjYXJkKSkgPT0gTlVMTCkgeworCQkJCWtmcmVlKGNhcmQtPnN0YXRlc1tpXSk7CisJCQkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJZG1hYnVmLT50cmlnZ2VyIHw9IFNQRElGX0VOQUJMRV9PVVRQVVQ7CisJCQlhbGlfc2V0X2NvZGVjc3BkaWZvdXRfcmF0ZShzdGF0ZSwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkKTsJLy9JdCBtdXN0IGFkZAorCQkJaV9zY3IgPSBpbmwoc3RhdGUtPmNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpOworCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAxMDAwMDApIHsKKwkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgQUM5N19FQV9TUFNBXzdfOCwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAyMDAwMDApIHsKKwkJCQkJYWxpX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV82XzksIGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJaWYgKChpX3NjciAmIDB4MDAzMDAwMDApID09IDB4MDAzMDAwMDApIHsKKwkJCQkJCWFsaV9zZXRfc3BkaWZfb3V0cHV0KHN0YXRlLCBBQzk3X0VBX1NQU0FfMTBfMTEsIGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlhbGlfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgQUM5N19FQV9TUFNBXzdfOCwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkKTsKKwkJCQkJfQorCQkJCX0KKworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkgeworCQkJCWlmICgoZG1hYnVmLT5jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwgPSBjYXJkLT5hbGxvY19jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWwoY2FyZCkpID09IE5VTEwpIHsKKwkJCQkJa2ZyZWUoY2FyZC0+c3RhdGVzW2ldKTsKKwkJCQkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisJCQkJZG1hYnVmLT50cmlnZ2VyIHw9IFNQRElGX0VOQUJMRV9PVVRQVVQ7CisJCQkJYWxpX3NldF9zcGRpZm91dF9yYXRlKHN0YXRlLCBjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCk7CisJCQl9IGVsc2UgeworCQkJCWlmICgoZG1hYnVmLT53cml0ZV9jaGFubmVsID0gY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCkpID09IE5VTEwpIHsKKwkJCQkJa2ZyZWUoY2FyZC0+c3RhdGVzW2ldKTsKKwkJCQkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCQl9CisJCQkJLyogSW5pdGlhbGl6ZSB0byA4a0h6PyAgV2hhdCBpZiB3ZSBkb24ndCBzdXBwb3J0IDhrSHo/ICovCisJCQkJLyogIExldCdzIGNoYW5nZSB0aGlzIHRvIGNoZWNrIGZvciBTL1BESUYgc3R1ZmYgKi8KKworCQkJCWRtYWJ1Zi0+dHJpZ2dlciB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJCQlpZiAoY29kZWNfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCkgeworCQkJCQlhbGlfc2V0X2RhY19yYXRlKHN0YXRlLCBjb2RlY19wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkKTsKKwkJCQkJYWxpX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIEFDOTdfRUFfU1BTQV8zXzQsIGNvZGVjX3BjbW91dF9zaGFyZV9zcGRpZl9sb2NrZWQpOworCQkJCX0gZWxzZSB7CisJCQkJCWFsaV9zZXRfZGFjX3JhdGUoc3RhdGUsIDgwMDApOworCQkJCX0KKwkJCX0KKworCQl9CisJfQorCisJLyogc2V0IGRlZmF1bHQgc2FtcGxlIGZvcm1hdC4gQWNjb3JkaW5nIHRvIE9TUyBQcm9ncmFtbWVyJ3MgR3VpZGUgIC9kZXYvZHNwCisJICAgc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kCisJICAgL2Rldi9kc3BXIHdpbGwgYWNjZXB0IDE2LWJpdHMgc2FtcGxlLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aG9zZSBzbyB3ZQorCSAgIHNldCBpdCBpbW1lZGlhdGVseSB0byBzdGVyZW8gYW5kIDE2Yml0LCB3aGljaCBpcyBhbGwgd2UgZG8gc3VwcG9ydCAqLworCWRtYWJ1Zi0+Zm10IHw9IEFMSTU0NTVfRk1UXzE2QklUIHwgQUxJNTQ1NV9GTVRfU1RFUkVPOworCWRtYWJ1Zi0+b3NzZnJhZ3NpemUgPSAwOworCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAwOworCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSAwOworCXN0YXRlLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJb3V0bCgweDAwMDAwMDAwLCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUQ1IpOworCW91dGwoMHgwMDAwMDAwMCwgY2FyZC0+aW9iYXNlICsgQUxJX0lOVEVSUlVQVFNSKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgYWxpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGFsaV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb2NrX2tlcm5lbCgpOworCQorCS8qIHN0b3AgRE1BIHN0YXRlIG1hY2hpbmUgYW5kIGZyZWUgRE1BIGJ1ZmZlcnMvY2hhbm5lbHMgKi8KKwlpZiAoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9PVVRQVVQpCisJCWRyYWluX2RhYyhzdGF0ZSwgMCk7CisKKwlpZiAoZG1hYnVmLT50cmlnZ2VyICYgU1BESUZfRU5BQkxFX09VVFBVVCkKKwkJZHJhaW5fc3BkaWZvdXQoc3RhdGUsIDApOworCQorCWlmIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQlzdG9wX2FkYyhzdGF0ZSk7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlkZWFsbG9jX2RtYWJ1ZihzdGF0ZSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jb2RlY19zcGRpZm91dF9jaGFubmVsLT5udW0pOworCQl9IGVsc2UgeworCQkJaWYgKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID4gMCkKKwkJCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwKKwkJCQkJCQkgICAgICBkbWFidWYtPmNvbnRyb2xsZXJfc3BkaWZvdXRfY2hhbm5lbC0+bnVtKTsKKwkJCWVsc2Ugc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsCisJCQkJCQkJICAgICAgZG1hYnVmLT53cml0ZV9jaGFubmVsLT5udW0pOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5yZWFkX2NoYW5uZWwtPm51bSk7CisKKwlzdGF0ZS0+Y2FyZC0+c3RhdGVzW3N0YXRlLT52aXJ0XSA9IE5VTEw7CisJa2ZyZWUoc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgYWxpX2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLCAKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywgCisJLnJlYWQJCT0gYWxpX3JlYWQsCisJLndyaXRlCQk9IGFsaV93cml0ZSwgCisJLnBvbGwJCT0gYWxpX3BvbGwsCisJLmlvY3RsCQk9IGFsaV9pb2N0bCwKKwkubW1hcAkJPSBhbGlfbW1hcCwKKwkub3BlbgkJPSBhbGlfb3BlbiwKKwkucmVsZWFzZQk9IGFsaV9yZWxlYXNlLAorfTsKKworLyogUmVhZCBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLworc3RhdGljIHUxNiBhbGlfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKQoreworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IGRldi0+cHJpdmF0ZV9kYXRhOworCWludCBjb3VudDEgPSAxMDA7CisJY2hhciB2YWw7CisJdW5zaWduZWQgc2hvcnQgaW50IGRhdGEgPSAwLCBjb3VudCwgYWRkcjEsIGFkZHIyID0gMDsKKworCXNwaW5fbG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwl3aGlsZSAoY291bnQxLS0gJiYgKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfQ0FTKSAmIDB4ODAwMDAwMDApKQorCQl1ZGVsYXkoMSk7CisKKwlhZGRyMSA9IHJlZzsKKwlyZWcgfD0gMHgwMDgwOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDB4N2Y7IGNvdW50KyspIHsKKwkJdmFsID0gaW5iKGNhcmQtPmlvYmFzZSArIEFMSV9DU1BTUik7CisJCWlmICh2YWwgJiAweDA4KQorCQkJYnJlYWs7CisJfQorCWlmIChjb3VudCA9PSAweDdmKQorCXsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJCXJldHVybiAtMTsKKwl9CisJb3V0dyhyZWcsIChjYXJkLT5pb2Jhc2UgKyBBTElfQ1BSKSArIDIpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDB4N2Y7IGNvdW50KyspIHsKKwkJdmFsID0gaW5iKGNhcmQtPmlvYmFzZSArIEFMSV9DU1BTUik7CisJCWlmICh2YWwgJiAweDAyKSB7CisJCQlkYXRhID0gaW53KGNhcmQtPmlvYmFzZSArIEFMSV9TUFIpOworCQkJYWRkcjIgPSBpbncoKGNhcmQtPmlvYmFzZSArIEFMSV9TUFIpICsgMik7CisJCQlicmVhazsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwlpZiAoY291bnQgPT0gMHg3ZikKKwkJcmV0dXJuIC0xOworCWlmIChhZGRyMiAhPSBhZGRyMSkKKwkJcmV0dXJuIC0xOworCXJldHVybiAoKHUxNikgZGF0YSk7Cit9CisKKy8qIHdyaXRlIGFjOTcgY29kZWMgcmVnaXN0ZXIgICAqLworCitzdGF0aWMgdm9pZCBhbGlfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKKwlpbnQgY291bnQxID0gMTAwOworCWNoYXIgdmFsOworCXVuc2lnbmVkIHNob3J0IGludCBjb3VudDsKKworCXNwaW5fbG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwl3aGlsZSAoY291bnQxLS0gJiYgKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfQ0FTKSAmIDB4ODAwMDAwMDApKQorCQl1ZGVsYXkoMSk7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAweDdmOyBjb3VudCsrKSB7CisJCXZhbCA9IGluYihjYXJkLT5pb2Jhc2UgKyBBTElfQ1NQU1IpOworCQlpZiAodmFsICYgMHgwOCkKKwkJCWJyZWFrOworCX0KKwlpZiAoY291bnQgPT0gMHg3ZikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJhbGlfYWM5N19zZXQ6IEFDOTcgY29kZWMgcmVnaXN0ZXIgYWNjZXNzIHRpbWVkIG91dC4gXG4iKTsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJCXJldHVybjsKKwl9CisJb3V0dyhkYXRhLCAoY2FyZC0+aW9iYXNlICsgQUxJX0NQUikpOworCW91dGIocmVnLCAoY2FyZC0+aW9iYXNlICsgQUxJX0NQUikgKyAyKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAweDdmOyBjb3VudCsrKSB7CisJCXZhbCA9IGluYihjYXJkLT5pb2Jhc2UgKyBBTElfQ1NQU1IpOworCQlpZiAodmFsICYgMHgwMSkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwlpZiAoY291bnQgPT0gMHg3ZikKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiYWxpX2FjOTdfc2V0OiBBQzk3IGNvZGVjIHJlZ2lzdGVyIGFjY2VzcyB0aW1lZCBvdXQuIFxuIik7CisJcmV0dXJuOworfQorCisvKiBPU1MgL2Rldi9taXhlciBmaWxlIG9wZXJhdGlvbiBtZXRob2RzICovCisKK3N0YXRpYyBpbnQgYWxpX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gZGV2czsKKwlmb3IgKGNhcmQgPSBkZXZzOyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0KSB7CisJCS8qCisJCSAqIElmIHdlIGFyZSBpbml0aWFsaXppbmcgYW5kIHRoZW4gZmFpbCwgY2FyZCBjb3VsZCBnbworCQkgKiBhd2F5IHVudWV4cGVjdGVkbHkgd2hpbGUgd2UgYXJlIGluIHRoZSBmb3IoKSBsb29wLgorCQkgKiBTbywgY2hlY2sgZm9yIGNhcmQgb24gZWFjaCBpdGVyYXRpb24gYmVmb3JlIHdlIGNoZWNrCisJCSAqIGZvciBjYXJkLT5pbml0aWFsaXppbmcgdG8gYXZvaWQgYSBwb3NzaWJsZSBvb3BzLgorCQkgKiBUaGlzIHVzdWFsbHkgb25seSBtYXR0ZXJzIGZvciB0aW1lcyB3aGVuIHRoZSBkcml2ZXIgaXMKKwkJICogYXV0b2xvYWRlZCBieSBrbW9kLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IDUwICYmIGNhcmQgJiYgY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAyMCk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTcgJiYgY2FyZCAmJiAhY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspCisJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMCisJCQkgICAgJiYgY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyID09IG1pbm9yKSB7CisJCQkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZC0+YWM5N19jb2RlY1tpXTsKKwkJCQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisJCQl9CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGFsaV9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCSAgICBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhbGlfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJPSBUSElTX01PRFVMRSwgCisJLmxsc2Vlawk9IG5vX2xsc2VlaywgCisJLmlvY3RsCT0gYWxpX2lvY3RsX21peGRldiwKKwkub3Blbgk9IGFsaV9vcGVuX21peGRldiwKK307CisKKy8qIEFDOTcgY29kZWMgaW5pdGlhbGlzYXRpb24uICBUaGVzZSBzbWFsbCBmdW5jdGlvbnMgZXhpc3Qgc28gd2UgZG9uJ3QKKyAgIGR1cGxpY2F0ZSBjb2RlIGJldHdlZW4gbW9kdWxlIGluaXQgYW5kIGFwbSByZXN1bWUgKi8KKworc3RhdGljIGlubGluZSBpbnQgYWxpX2FjOTdfZXhpc3RzKHN0cnVjdCBhbGlfY2FyZCAqY2FyZCwgaW50IGFjOTdfbnVtYmVyKQoreworCXVuc2lnbmVkIGludCBpID0gMTsKKwl1MzIgcmVnID0gaW5sKGNhcmQtPmlvYmFzZSArIEFMSV9SVFNSKTsKKwlpZiAoYWM5N19udW1iZXIpIHsKKwkJd2hpbGUgKGkgPCAxMDApIHsKKworCQkJcmVnID0gaW5sKGNhcmQtPmlvYmFzZSArIEFMSV9SVFNSKTsKKwkJCWlmIChyZWcgJiAweDQwKSB7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCW91dGwocmVnIHwgMHgwMDAwMDA0MCwKKwkJCQkgICAgIGNhcmQtPmlvYmFzZSArIDB4MzQpOworCQkJCXVkZWxheSgxKTsKKwkJCX0KKwkJCWkrKzsKKwkJfQorCisJfSBlbHNlIHsKKwkJd2hpbGUgKGkgPCAxMDApIHsKKwkJCXJlZyA9IGlubChjYXJkLT5pb2Jhc2UgKyBBTElfUlRTUik7CisJCQlpZiAocmVnICYgMHg4MCkgeworCQkJCWJyZWFrOworCQkJfSBlbHNlIHsKKwkJCQlvdXRsKHJlZyB8IDB4MDAwMDAwODAsCisJCQkJICAgICBjYXJkLT5pb2Jhc2UgKyAweDM0KTsKKwkJCQl1ZGVsYXkoMSk7CisJCQl9CisJCQlpKys7CisJCX0KKwl9CisKKwlpZiAoYWM5N19udW1iZXIpCisJCXJldHVybiByZWcgJiAweDQwOworCWVsc2UKKwkJcmV0dXJuIHJlZyAmIDB4ODA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGFsaV9hYzk3X2VuYWJsZV92YXJpYWJsZV9yYXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCA5KTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLCBhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKSB8IDB4RTgwMCk7CisJcmV0dXJuIChhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKSAmIDEpOworfQorCisKK3N0YXRpYyBpbnQgYWxpX2FjOTdfcHJvYmVfYW5kX3Bvd2VydXAoc3RydWN0IGFsaV9jYXJkICpjYXJkLCBzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJLyogUmV0dXJucyAwIG9uIGZhaWx1cmUgKi8KKwlpbnQgaTsKKwl1MTYgYWRkcjsKKwlpZiAoYWM5N19wcm9iZV9jb2RlYyhjb2RlYykgPT0gMCkKKwkJcmV0dXJuIDA7CisJLyogYWM5N19wcm9iZV9jb2RlYyBpcyBzdWNjZXNzICx0aGVuIGJlZ2luIHRvIGluaXQgY29kZWMgKi8KKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfUkVTRVQsIDB4ZmZmZik7CisJaWYgKGNhcmQtPmNoYW5uZWxbMF0udXNlZCA9PSAxKSB7CisJCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19SRUNPUkRfU0VMRUNULCAweDAwMDApOworCQlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfTElORUlOX1ZPTCwgMHgwODA4KTsKKwkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1JFQ09SRF9HQUlOLCAweDBGMEYpOworCX0KKworCWlmIChjYXJkLT5jaGFubmVsWzJdLnVzZWQgPT0gMSkJLy9pZiBNSUNpbiB0aGVuIGluaXQgY29kZWMKKwl7CisJCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19SRUNPUkRfU0VMRUNULCAweDAwMDApOworCQlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfTUlDX1ZPTCwgMHg4ODA4KTsKKwkJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1JFQ09SRF9HQUlOLCAweDBGMEYpOworCQlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfUkVDT1JEX0dBSU5fTUlDLCAweDAwMDApOworCX0KKworCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTywgMHgwMDAwKTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfSEVBRFBIT05FX1ZPTCwgMHgwMDAwKTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfUENNT1VUX1ZPTCwgMHgwMDAwKTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfQ0RfVk9MLCAweDA4MDgpOworCWFsaV9hYzk3X3NldChjb2RlYywgQUM5N19WSURFT19WT0wsIDB4MDgwOCk7CisJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X0FVWF9WT0wsIDB4MDgwOCk7CisJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1BIT05FX1ZPTCwgMHg4MDQ4KTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfUENCRUVQX1ZPTCwgMHgwMDAwKTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIEFDOTdfR0VORVJBTF9QVVJQT1NFLCBBQzk3X0dQX01JWCk7CisJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfTU9OTywgMHgwMDAwKTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIDB4MzgsIDB4MDAwMCk7CisJYWRkciA9IGFsaV9hYzk3X2dldChjb2RlYywgMHgyYSk7CisJYWxpX2FjOTdfc2V0KGNvZGVjLCAweDJhLCBhZGRyIHwgMHgwMDAxKTsKKwlhZGRyID0gYWxpX2FjOTdfZ2V0KGNvZGVjLCAweDJhKTsKKwlhZGRyID0gYWxpX2FjOTdfZ2V0KGNvZGVjLCAweDI4KTsKKwlhbGlfYWM5N19zZXQoY29kZWMsIDB4MmMsIDB4YmI4MCk7CisJYWRkciA9IGFsaV9hYzk3X2dldChjb2RlYywgMHgyYyk7CisJLyogcG93ZXIgaXQgYWxsIHVwICovCisJYWxpX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsCisJCSAgICAgYWxpX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgfjB4N2YwMCk7CisJLyogd2FpdCBmb3IgYW5hbG9nIHJlYWR5ICovCisJZm9yIChpID0gMTA7IGkgJiYgKChhbGlfYWM5N19nZXQoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAweGYpICE9IDB4Zik7IGktLSkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAyMCk7CisJfQorCS8qIEZJWE1FICEhICovCisJaSsrOworCXJldHVybiBpOworfQorCisKKy8qIEkgY2xvbmUgYWxpNTQ1NSgyLjQuNyApICBub3QgY2xvbmUgaTgxMF9hdWRpbygyLjQuMTgpICAqLworCitzdGF0aWMgaW50IGFsaV9yZXNldF81NDU1KHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlvdXRsKDB4ODAwMDAwMDMsIGNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpOworCW91dGwoMHg4MzgzODM4MywgY2FyZC0+aW9iYXNlICsgQUxJX0ZJRk9DUjEpOworCW91dGwoMHg4MzgzODM4MywgY2FyZC0+aW9iYXNlICsgQUxJX0ZJRk9DUjIpOworCWlmIChjb250cm9sbGVyX3BjbW91dF9zaGFyZV9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCW91dGwoKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfU1BESUZJQ1MpIHwgMHgwMDAwMDAwMSksCisJCSAgICAgY2FyZC0+aW9iYXNlICsgQUxJX1NQRElGSUNTKTsKKwkJb3V0bCgweDA0MDgwMDBhLCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJGQUNFQ1IpOworCX0gZWxzZSB7CisJCWlmIChjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCQlvdXRsKChpbmwoY2FyZC0+aW9iYXNlICsgQUxJX1NDUikgfCAweDAwMTAwMDAwKSwgY2FyZC0+aW9iYXNlICsgQUxJX1NDUik7CS8vIG5vdyBJIHNlbGVjdCBzbG90IDcgJiA4CisJCQlvdXRsKDB4MDAyMDAwMDAsIGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUkZBQ0VDUik7CS8vZW5hYmxlIGNvZGVjIGluZGVwZW5kZW50IHNwZGlmb3V0IAorCQl9IGVsc2UKKwkJCW91dGwoMHgwNDA4MDAwMiwgY2FyZC0+aW9iYXNlICsgQUxJX0lOVEVSRkFDRUNSKTsKKwl9CisKKwlvdXRsKDB4MDAwMDAwMDAsIGNhcmQtPmlvYmFzZSArIEFMSV9JTlRFUlJVUFRDUik7CisJb3V0bCgweDAwMDAwMDAwLCBjYXJkLT5pb2Jhc2UgKyBBTElfSU5URVJSVVBUU1IpOworCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApCisJCW91dGwoKGlubChjYXJkLT5pb2Jhc2UgKyBBTElfU1BESUZJQ1MpIHwgMHgwMDAwMDAwMSksCisJCSAgICAgY2FyZC0+aW9iYXNlICsgQUxJX1NQRElGSUNTKTsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IGFsaV9hYzk3X3JhbmRvbV9pbml0X3N0dWZmKHN0cnVjdCBhbGlfY2FyZAorCQkJCSAgICAgICpjYXJkKQoreworCXUzMiByZWcgPSBpbmwoY2FyZC0+aW9iYXNlICsgQUxJX1NDUik7CisJaW50IGkgPSAwOworCXJlZyA9IGlubChjYXJkLT5pb2Jhc2UgKyBBTElfU0NSKTsKKwlpZiAoKHJlZyAmIDIpID09IDApCS8qIENvbGQgcmVxdWlyZWQgKi8KKwkJcmVnIHw9IDI7CisJZWxzZQorCQlyZWcgfD0gMTsJLyogV2FybSAqLworCXJlZyAmPSB+MHg4MDAwMDAwMDsJLyogQUNMaW5rIG9uICovCisJb3V0bChyZWcsIGNhcmQtPmlvYmFzZSArIEFMSV9TQ1IpOworCisJd2hpbGUgKGkgPCAxMCkgeworCQlpZiAoKGlubChjYXJkLT5pb2Jhc2UgKyAweDE4KSAmICgxIDw8IDEpKSA9PSAwKQorCQkJYnJlYWs7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFogLyAyMCk7CisJCWkrKzsKKwl9CisJaWYgKGkgPT0gMTApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGlfYXVkaW86IEFDJzk3IHJlc2V0IGZhaWxlZC5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJc2NoZWR1bGVfdGltZW91dChIWiAvIDIpOworCXJldHVybiAxOworfQorCisvKiBBQzk3IGNvZGVjIGluaXRpYWxpc2F0aW9uLiAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhbGlfYWM5N19pbml0KHN0cnVjdCBhbGlfY2FyZCAqY2FyZCkKK3sKKwlpbnQgbnVtX2FjOTcgPSAwOworCWludCB0b3RhbF9jaGFubmVscyA9IDA7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCXUxNiBlaWQ7CisKKwlpZiAoIWFsaV9hYzk3X3JhbmRvbV9pbml0X3N0dWZmKGNhcmQpKQorCQlyZXR1cm4gMDsKKworCS8qIE51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgKi8KKwkvKiBXaGF0IGFib3V0IHRoZSBjb2RlYz8gIEp1c3QgYmVjYXVzZSB0aGUgSUNIIHN1cHBvcnRzICovCisJLyogbXVsdGlwbGUgY2hhbm5lbHMgZG9lc24ndCBtZWFuIHRoZSBjb2RlYyBkb2VzLiAgICAgICAqLworCS8qIHdlJ2xsIGhhdmUgdG8gbW9kaWZ5IHRoaXMgaW4gdGhlIGNvZGVjIHNlY3Rpb24gYmVsb3cgKi8KKwkvKiB0byByZWZsZWN0IHdoYXQgdGhlIGNvZGVjIGhhcy4gICAgICAgICAgICAgICAgICAgICAgICovCisJLyogSUNIIGFuZCBJQ0gwIG9ubHkgc3VwcG9ydCAyIGNoYW5uZWxzIHNvIGRvbid0IGJvdGhlciAqLworCS8qIHRvIGNoZWNrLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwlpbmwoY2FyZC0+aW9iYXNlICsgQUxJX0NQUik7CisJY2FyZC0+Y2hhbm5lbHMgPSAyOworCisJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgeworCisJCS8qIEFzc3VtZSBjb2RlYyBpc24ndCBhdmFpbGFibGUgdW50aWwgd2UgZ28gdGhyb3VnaCB0aGUKKwkJICogZ2F1bnRsZXQgYmVsb3cgKi8KKwkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBOVUxMOworCQkvKiBUaGUgSUNIIHByb2dyYW1tZXIncyByZWZlcmVuY2Ugc2F5cyB5b3Ugc2hvdWxkICAgKi8KKwkJLyogY2hlY2sgdGhlIHJlYWR5IHN0YXR1cyBiZWZvcmUgcHJvYmluZy4gU28gd2UgY2hrICovCisJCS8qICAgV2hhdCBkbyB3ZSBkbyBpZiBpdCdzIG5vdCByZWFkeT8gIFdhaXQgYW5kIHRyeSAqLworCQkvKiAgIGFnYWluLCBvciBhYm9ydD8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJaWYgKCFhbGlfYWM5N19leGlzdHMoY2FyZCwgbnVtX2FjOTcpKSB7CisJCQlpZiAobnVtX2FjOTcgPT0gMCkKKwkJCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogUHJpbWFyeSBjb2RlYyBub3QgcmVhZHkuXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChjb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKSkgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyB3aWxsIGJlIGZpbGxlZAorCQkgICBpbiBhYzk3X3Byb2JlX2NvZGVjICovCisJCWNvZGVjLT5wcml2YXRlX2RhdGEgPSBjYXJkOworCQljb2RlYy0+aWQgPSBudW1fYWM5NzsKKwkJY29kZWMtPmNvZGVjX3JlYWQgPSBhbGlfYWM5N19nZXQ7CisJCWNvZGVjLT5jb2RlY193cml0ZSA9IGFsaV9hYzk3X3NldDsKKwkJaWYgKCFhbGlfYWM5N19wcm9iZV9hbmRfcG93ZXJ1cChjYXJkLCBjb2RlYykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWxpX2F1ZGlvOiB0aW1lZCBvdXQgd2FpdGluZyBmb3IgY29kZWMgJWQgYW5hbG9nIHJlYWR5IiwKKwkJCSAgICAgbnVtX2FjOTcpOworCQkJa2ZyZWUoY29kZWMpOworCQkJYnJlYWs7CS8qIGl0IGRpZG4ndCB3b3JrICovCisJCX0KKwkJCisJCS8qIFN0b3JlIHN0YXRlIGluZm9ybWF0aW9uIGFib3V0IFMvUERJRiB0cmFuc21pdHRlciAqLworCQljYXJkLT5hYzk3X3N0YXR1cyA9IDA7CisJCS8qIERvbid0IGF0dGVtcHQgdG8gZ2V0IGVpZCB1bnRpbCBwb3dlcnVwIGlzIGNvbXBsZXRlICovCisJCWVpZCA9IGFsaV9hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCk7CisJCWlmIChlaWQgPT0gMHhGRkZGKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogbm8gY29kZWMgYXR0YWNoZWQgP1xuIik7CisJCQlrZnJlZShjb2RlYyk7CisJCQlicmVhazsKKwkJfQorCisJCWNhcmQtPmFjOTdfZmVhdHVyZXMgPSBlaWQ7CisJCS8qIE5vdyBjaGVjayB0aGUgY29kZWMgZm9yIHVzZWZ1bCBmZWF0dXJlcyB0byBtYWtlIHVwIGZvcgorCQkgICB0aGUgZHVtYm5lc3Mgb2YgdGhlIGFsaTU0NTUgaGFyZHdhcmUgZW5naW5lICovCisJCWlmICghKGVpZCAmIDB4MDAwMSkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImFsaV9hdWRpbzogb25seSA0OEtoeiBwbGF5YmFjayBhdmFpbGFibGUuXG4iKTsKKwkJZWxzZSB7CisJCQlpZiAoIWFsaV9hYzk3X2VuYWJsZV92YXJpYWJsZV9yYXRlKGNvZGVjKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCQkgICAgICAgImFsaV9hdWRpbzogQ29kZWMgcmVmdXNlZCB0byBhbGxvdyBWUkEsIHVzaW5nIDQ4S2h6IG9ubHkuXG4iKTsKKwkJCQljYXJkLT5hYzk3X2ZlYXR1cmVzICY9IH4xOworCQkJfQorCQl9CisKKwkJLyogRGV0ZXJtaW5lIGhvdyBtYW55IGNoYW5uZWxzIHRoZSBjb2RlYyhzKSBzdXBwb3J0ICAgKi8KKwkJLyogICAtIFRoZSBwcmltYXJ5IGNvZGVjIGFsd2F5cyBzdXBwb3J0cyAyICAgICAgICAgICAgKi8KKwkJLyogICAtIElmIHRoZSBjb2RlYyBzdXBwb3J0cyBBTUFQLCBzdXJyb3VuZCBEQUNzIHdpbGwgKi8KKwkJLyogICAgIGF1dG9tYXRpY2xseSBnZXQgYXNzaWduZWQgdG8gc2xvdHMuICAgICAgICAgICAgKi8KKwkJLyogICAgICogQ2hlY2sgZm9yIHN1cnJvdW5kIERBQ3MgYW5kIGluY3JlbWVudCBpZiAgICAgKi8KKwkJLyogICAgICAgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJLyogICAtIEVsc2UgY2hlY2sgaWYgdGhlIGNvZGVjIGlzIHJldmlzaW9uIDIuMiAgICAgICAgKi8KKwkJLyogICAgICogSWYgc3Vycm91bmQgREFDcyBleGlzdCwgYXNzaWduIHRoZW0gdG8gc2xvdHMgKi8KKwkJLyogICAgICAgYW5kIGluY3JlbWVudCBjaGFubmVsIGNvdW50LiAgICAgICAgICAgICAgICAgKi8KKworCQkvKiBBbGwgb2YgdGhpcyBvbmx5IGFwcGxpZXMgdG8gSUNIMiBhbmQgYWJvdmUuIElDSCAgICAqLworCQkvKiBhbmQgSUNIMCBvbmx5IHN1cHBvcnQgMiBjaGFubmVscy4gIElDSDIgd2lsbCBvbmx5ICAqLworCQkvKiBzdXBwb3J0IG11bHRpcGxlIGNvZGVjcyBpbiBhICJzcGxpdCBhdWRpbyIgY29uZmlnLiAqLworCQkvKiBhcyBkZXNjcmliZWQgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJCS8qIFRPRE86IFJlbW92ZSBhbGwgdGhlIGRlYnVnZ2luZyBtZXNzYWdlcyEgICAgICAgICAgICovCisKKwkJaWYgKChlaWQgJiAweGMwMDApID09IDApCS8qIHByaW1hcnkgY29kZWMgKi8KKwkJCXRvdGFsX2NoYW5uZWxzICs9IDI7CisJCWlmICgoY29kZWMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZhbGlfbWl4ZXJfZm9wcywgLTEpKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiYWxpX2F1ZGlvOiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOworCQkJa2ZyZWUoY29kZWMpOworCQkJYnJlYWs7CisJCX0KKwkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBjb2RlYzsKKwl9CisJLyogcGljayB0aGUgbWluaW11bSBvZiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgSUNIeCBvciBjb2RlYyhzKSAqLworCWNhcmQtPmNoYW5uZWxzID0gKGNhcmQtPmNoYW5uZWxzID4gdG90YWxfY2hhbm5lbHMpID8gdG90YWxfY2hhbm5lbHMgOiBjYXJkLT5jaGFubmVsczsKKwlyZXR1cm4gbnVtX2FjOTc7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhbGlfY29uZmlndXJlX2Nsb2NraW5nKHZvaWQpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkOworCXN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwl1bnNpZ25lZCBpbnQgaSwgb2Zmc2V0LCBuZXdfb2Zmc2V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2FyZCA9IGRldnM7CisKKwkvKiBXZSBjb3VsZCB0cnkgdG8gc2V0IHRoZSBjbG9ja2luZyBmb3IgbXVsdGlwbGUgY2FyZHMsIGJ1dCBjYW4geW91IGV2ZW4gaGF2ZQorCSAqIG1vcmUgdGhhbiBvbmUgYWxpIGluIGEgbWFjaGluZT8gIEJlc2lkZXMsIGNsb2NraW5nIGlzIGdsb2JhbCwgc28gdW5sZXNzCisJICogc29tZW9uZSBhY3R1YWxseSB0aGlua3MgbW9yZSB0aGFuIG9uZSBhbGkgaW4gYSBtYWNoaW5lIGlzIHBvc3NpYmxlIGFuZAorCSAqIGRlY2lkZXMgdG8gcmV3cml0ZSB0aGF0IGxpdHRsZSBiaXQsIHNldHRpbmcgdGhlIHJhdGUgZm9yIG1vcmUgdGhhbiBvbmUgY2FyZAorCSAqIGlzIGEgd2FzdGUgb2YgdGltZS4KKwkgKi8KKwlpZiAoY2FyZCAhPSBOVUxMKSB7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdID0gKHN0cnVjdCBhbGlfc3RhdGUgKikKKwkJICAgIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhbGlfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKHN0YXRlID09IE5VTEwpCisJCQlyZXR1cm47CisJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBhbGlfc3RhdGUpKTsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWRtYWJ1Zi0+d3JpdGVfY2hhbm5lbCA9IGNhcmQtPmFsbG9jX3BjbV9jaGFubmVsKGNhcmQpOworCQlzdGF0ZS0+dmlydCA9IDA7CisJCXN0YXRlLT5jYXJkID0gY2FyZDsKKwkJc3RhdGUtPm1hZ2ljID0gQUxJNTQ1NV9TVEFURV9NQUdJQzsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKKwkJaW5pdF9NVVRFWCgmc3RhdGUtPm9wZW5fc2VtKTsKKwkJZG1hYnVmLT5mbXQgPSBBTEk1NDU1X0ZNVF9TVEVSRU8gfCBBTEk1NDU1X0ZNVF8xNkJJVDsKKwkJZG1hYnVmLT50cmlnZ2VyID0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCWFsaV9zZXRfZGFjX3JhdGUoc3RhdGUsIDQ4MDAwKTsKKwkJaWYgKHByb2dfZG1hYnVmKHN0YXRlLCAwKSAhPSAwKQorCQkJZ290byBjb25maWdfb3V0X25vZG1hYnVmOworCQkKKwkJaWYgKGRtYWJ1Zi0+ZG1hc2l6ZSA8IDE2Mzg0KQorCQkJZ290byBjb25maWdfb3V0OworCQkKKwkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJb3V0YigzMSwgY2FyZC0+aW9iYXNlICsgZG1hYnVmLT53cml0ZV9jaGFubmVsLT5wb3J0ICsgT0ZGX0xWSSk7CisKKwkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCQlzdGFydF9kYWMoc3RhdGUpOworCQlvZmZzZXQgPSBhbGlfZ2V0X2RtYV9hZGRyKHN0YXRlLCAwKTsKKwkJbWRlbGF5KDUwKTsKKwkJbmV3X29mZnNldCA9IGFsaV9nZXRfZG1hX2FkZHIoc3RhdGUsIDApOworCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQorCQlvdXRiKDIsIGNhcmQtPmlvYmFzZSArIGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbC0+cG9ydCArIE9GRl9DUik7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCQlpID0gbmV3X29mZnNldCAtIG9mZnNldDsKKworCQlpZiAoaSA9PSAwKQorCQkJZ290byBjb25maWdfb3V0OworCQlpID0gaSAvIDQgKiAyMDsKKwkJaWYgKGkgPiA0ODUwMCB8fCBpIDwgNDc1MDApIHsKKwkJCWNsb2NraW5nID0gY2xvY2tpbmcgKiBjbG9ja2luZyAvIGk7CisJCX0KK2NvbmZpZ19vdXQ6CisJCWRlYWxsb2NfZG1hYnVmKHN0YXRlKTsKK2NvbmZpZ19vdXRfbm9kbWFidWY6CisJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkLCBzdGF0ZS0+ZG1hYnVmLiB3cml0ZV9jaGFubmVsLT5udW0pOworCQlrZnJlZShzdGF0ZSk7CisJCWNhcmQtPnN0YXRlc1swXSA9IE5VTEw7CisJfQorfQorCisvKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyIG5vdywgdGhleSBhcmUgZGVmZXJlZCAKKyAgIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSBvcGVuL3JlYWQvd3JpdGUvaW9jdGwvbW1hcCkgKi8KKworc3RhdGljIGludCBfX2RldmluaXQgYWxpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LAorCQkJICAgICAgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkOworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpX2RldiwgQUxJNTQ1NV9ETUFfTUFTSykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJhbGk1NDU1OiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCIKKwkJICAgICAgICIgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoKGNhcmQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgYWxpX2NhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKCpjYXJkKSk7CisJY2FyZC0+aW5pdGlhbGl6aW5nID0gMTsKKwljYXJkLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCk7CisJY2FyZC0+cGNpX2RldiA9IHBjaV9kZXY7CisJY2FyZC0+cGNpX2lkID0gcGNpX2lkLT5kZXZpY2U7CisJY2FyZC0+aXJxID0gcGNpX2Rldi0+aXJxOworCWNhcmQtPm5leHQgPSBkZXZzOworCWNhcmQtPm1hZ2ljID0gQUxJNTQ1NV9DQVJEX01BR0lDOworI2lmZGVmIENPTkZJR19QTQorCWNhcmQtPnBtX3N1c3BlbmRlZCA9IDA7CisjZW5kaWYKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmFjOTdfbG9jayk7CisJZGV2cyA9IGNhcmQ7CisJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CisJcHJpbnRrKEtFUk5fSU5GTyAiYWxpOiAlcyBmb3VuZCBhdCBJTyAweCUwNGx4LCBJUlEgJWRcbiIsCisJICAgICAgIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQtPmlvYmFzZSwgY2FyZC0+aXJxKTsKKwljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IGFsaV9hbGxvY19wY21fY2hhbm5lbDsKKwljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBhbGlfYWxsb2NfcmVjX3BjbV9jaGFubmVsOworCWNhcmQtPmFsbG9jX3JlY19taWNfY2hhbm5lbCA9IGFsaV9hbGxvY19yZWNfbWljX2NoYW5uZWw7CisJY2FyZC0+YWxsb2NfY29kZWNfc3BkaWZvdXRfY2hhbm5lbCA9IGFsaV9hbGxvY19jb2RlY19zcGRpZm91dF9jaGFubmVsOworCWNhcmQtPmFsbG9jX2NvbnRyb2xsZXJfc3BkaWZvdXRfY2hhbm5lbCA9IGFsaV9hbGxvY19jb250cm9sbGVyX3NwZGlmb3V0X2NoYW5uZWw7CisJY2FyZC0+ZnJlZV9wY21fY2hhbm5lbCA9IGFsaV9mcmVlX3BjbV9jaGFubmVsOworCWNhcmQtPmNoYW5uZWxbMF0ub2Zmc2V0ID0gMDsKKwljYXJkLT5jaGFubmVsWzBdLnBvcnQgPSAweDQwOworCWNhcmQtPmNoYW5uZWxbMF0ubnVtID0gMDsKKwljYXJkLT5jaGFubmVsWzFdLm9mZnNldCA9IDA7CisJY2FyZC0+Y2hhbm5lbFsxXS5wb3J0ID0gMHg1MDsKKwljYXJkLT5jaGFubmVsWzFdLm51bSA9IDE7CisJY2FyZC0+Y2hhbm5lbFsyXS5vZmZzZXQgPSAwOworCWNhcmQtPmNoYW5uZWxbMl0ucG9ydCA9IDB4NjA7CisJY2FyZC0+Y2hhbm5lbFsyXS5udW0gPSAyOworCWNhcmQtPmNoYW5uZWxbM10ub2Zmc2V0ID0gMDsKKwljYXJkLT5jaGFubmVsWzNdLnBvcnQgPSAweDcwOworCWNhcmQtPmNoYW5uZWxbM10ubnVtID0gMzsKKwljYXJkLT5jaGFubmVsWzRdLm9mZnNldCA9IDA7CisJY2FyZC0+Y2hhbm5lbFs0XS5wb3J0ID0gMHhiMDsKKwljYXJkLT5jaGFubmVsWzRdLm51bSA9IDQ7CisJLyogY2xhaW0gb3VyIGlvc3BhY2UgYW5kIGlycSAqLworCXJlcXVlc3RfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2LCBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdKTsKKwlpZiAocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCAmYWxpX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQljYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCBjYXJkKSkgeworCQlwcmludGsoS0VSTl9FUlIgImFsaV9hdWRpbzogdW5hYmxlIHRvIGFsbG9jYXRlIGlycSAlZFxuIiwKKwkJICAgICAgIGNhcmQtPmlycSk7CisJCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2KTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChhbGlfcmVzZXRfNTQ1NShjYXJkKSA8PSAwKSB7CisJCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7CisJCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2KTsKKwkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGluaXRpYWxpemUgQUM5NyBjb2RlYyBhbmQgcmVnaXN0ZXIgL2Rldi9taXhlciAqLworCWlmIChhbGlfYWM5N19pbml0KGNhcmQpIDwgMCkgeworCQlyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIDI1Nik7CisJCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisJCWtmcmVlKGNhcmQpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsIGNhcmQpOworCQorCWlmIChjbG9ja2luZyA9PSAwKSB7CisJCWNsb2NraW5nID0gNDgwMDA7CisJCWFsaV9jb25maWd1cmVfY2xvY2tpbmcoKTsKKwl9CisKKwkvKiByZWdpc3RlciAvZGV2L2RzcCAqLworCWlmICgoY2FyZC0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZhbGlfYXVkaW9fZm9wcywgLTEpKSA8IDApIHsKKwkJaW50IGk7CisJCXByaW50ayhLRVJOX0VSUiJhbGlfYXVkaW86IGNvdWxkbid0IHJlZ2lzdGVyIERTUCBkZXZpY2UhXG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCAyNTYpOworCQlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQorCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCkgeworCQkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKKwkJCQlrZnJlZShjYXJkLT5hYzk3X2NvZGVjW2ldKTsKKwkJCX0KKwkJa2ZyZWUoY2FyZCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwljYXJkLT5pbml0aWFsaXppbmcgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgYWxpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgYWxpX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJLyogZnJlZSBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwlmcmVlX2lycShjYXJkLT5pcnEsIGRldnMpOworCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2KTsKKwkvKiB1bnJlZ2lzdGVyIGF1ZGlvIGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQorCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMKSB7CisJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTdfY29kZWNbaV0tPgorCQkJCQkgICAgICAgZGV2X21peGVyKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2ldKTsKKwkJCWNhcmQtPmFjOTdfY29kZWNbaV0gPSBOVUxMOworCQl9CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKKwlrZnJlZShjYXJkKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBhbGlfcG1fc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqZGV2LCBwbV9tZXNzYWdlX3QgcG1fc3RhdGUpCit7CisJc3RydWN0IGFsaV9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisJc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJaW50IGksIG51bV9hYzk3OworCisJaWYgKCFjYXJkKQorCQlyZXR1cm4gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCWNhcmQtPnBtX3N1c3BlbmRlZCA9IDE7CisJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV07CisJCWlmICghc3RhdGUpCisJCQljb250aW51ZTsKKwkJLyogdGhpcyBoYXBwZW5zIG9ubHkgaWYgdGhlcmUgYXJlIG9wZW4gZmlsZXMgKi8KKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HIHx8CisJCSAgICAoZG1hYnVmLT5jb3VudAorCQkgICAgICYmIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX09VVFBVVCkpKSB7CisJCQlzdGF0ZS0+cG1fc2F2ZWRfZGFjX3JhdGUgPSBkbWFidWYtPnJhdGU7CisJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0ZS0+cG1fc2F2ZWRfZGFjX3JhdGUgPSAwOworCQl9CisJCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7CisJCQlzdGF0ZS0+cG1fc2F2ZWRfYWRjX3JhdGUgPSBkbWFidWYtPnJhdGU7CisJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCX0gZWxzZSB7CisJCQlzdGF0ZS0+cG1fc2F2ZWRfYWRjX3JhdGUgPSAwOworCQl9CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciA9IDA7CisJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJLyogc2F2ZSBtaXhlciBzZXR0aW5ncyAqLworCWZvciAobnVtX2FjOTcgPSAwOyBudW1fYWM5NyA8IE5SX0FDOTc7IG51bV9hYzk3KyspIHsKKwkJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N107CisJCWlmICghY29kZWMpCisJCQljb250aW51ZTsKKwkJZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7CisJCQlpZiAoKHN1cHBvcnRlZF9taXhlcihjb2RlYywgaSkpICYmIChjb2RlYy0+cmVhZF9taXhlcikpIHsKKwkJCQljYXJkLT5wbV9zYXZlZF9taXhlcl9zZXR0aW5nc1tpXVtudW1fYWM5N10gPSBjb2RlYy0+cmVhZF9taXhlcihjb2RlYywgaSk7CisJCQl9CisJCX0KKwl9CisJcGNpX3NhdmVfc3RhdGUoZGV2KTsJLyogWFhYIGRvIHdlIG5lZWQgdGhpcz8gKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsJLyogZGlzYWJsZSBidXNtYXN0ZXJpbmcgKi8KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwgMyk7CS8qIFp6ei4gKi8KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFsaV9wbV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlpbnQgbnVtX2FjOTcsIGkgPSAwOworCXN0cnVjdCBhbGlfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCXBjaV9lbmFibGVfZGV2aWNlKGRldik7CisJcGNpX3Jlc3RvcmVfc3RhdGUoZGV2KTsKKwkvKiBvYnNlcnZhdGlvbiBvZiBhIHRvc2hpYmEgcG9ydGVnZSAzNDQwY3Qgc3VnZ2VzdHMgdGhhdCB0aGUgCisJICAgaGFyZHdhcmUgaGFzIHRvIGJlIG1vcmUgb3IgbGVzcyBjb21wbGV0ZWx5IHJlaW5pdGlhbGl6ZWQgZnJvbQorCSAgIHNjcmF0Y2ggYWZ0ZXIgYW4gYXBtIHN1c3BlbmQuICBXb3JrcyBGb3IgTWUuICAgLWRhbiAqLworCWFsaV9hYzk3X3JhbmRvbV9pbml0X3N0dWZmKGNhcmQpOworCWZvciAobnVtX2FjOTcgPSAwOyBudW1fYWM5NyA8IE5SX0FDOTc7IG51bV9hYzk3KyspIHsKKwkJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N107CisJCS8qIGNoZWNrIHRoZXkgaGF2ZW4ndCBzdG9sZW4gdGhlIGhhcmR3YXJlIHdoaWxlIHdlIHdlcmUKKwkJICAgYXdheSAqLworCQlpZiAoIWNvZGVjIHx8ICFhbGlfYWM5N19leGlzdHMoY2FyZCwgbnVtX2FjOTcpKSB7CisJCQlpZiAobnVtX2FjOTcpCisJCQkJY29udGludWU7CisJCQllbHNlCisJCQkJQlVHKCk7CisJCX0KKwkJaWYgKCFhbGlfYWM5N19wcm9iZV9hbmRfcG93ZXJ1cChjYXJkLCBjb2RlYykpCisJCQlCVUcoKTsKKwkJaWYgKChjYXJkLT5hYzk3X2ZlYXR1cmVzICYgMHgwMDAxKSkgeworCQkJLyogYXQgcHJvYmUgdGltZSB3ZSBmb3VuZCB3ZSBjb3VsZCBkbyB2YXJpYWJsZQorCQkJICAgcmF0ZXMsIGJ1dCBBUE0gc3VzcGVuZCBoYXMgbWFkZSBpdCBmb3JnZXQKKwkJCSAgIGl0cyBtYWdpY2FsIHBvd2VycyAqLworCQkJaWYgKCFhbGlfYWM5N19lbmFibGVfdmFyaWFibGVfcmF0ZShjb2RlYykpCisJCQkJQlVHKCk7CisJCX0KKwkJLyogd2UgbG9zdCBvdXIgbWl4ZXIgc2V0dGluZ3MsIHNvIHJlc3RvcmUgdGhlbSAqLworCQlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspIHsKKwkJCWlmIChzdXBwb3J0ZWRfbWl4ZXIoY29kZWMsIGkpKSB7CisJCQkJaW50IHZhbCA9IGNhcmQtPnBtX3NhdmVkX21peGVyX3NldHRpbmdzW2ldW251bV9hYzk3XTsKKwkJCQljb2RlYy0+bWl4ZXJfc3RhdGVbaV0gPSB2YWw7CisJCQkJY29kZWMtPndyaXRlX21peGVyKGNvZGVjLCBpLAorCQkJCQkJICAgKHZhbCAmIDB4ZmYpLAorCQkJCQkJICAgKCh2YWwgPj4gOCkgJiAweGZmKSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiB3ZSBuZWVkIHRvIHJlc3RvcmUgdGhlIHNhbXBsZSByYXRlIGZyb20gd2hhdGV2ZXIgaXQgd2FzICovCisJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJc3RydWN0IGFsaV9zdGF0ZSAqc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV07CisJCWlmIChzdGF0ZSkgeworCQkJaWYgKHN0YXRlLT5wbV9zYXZlZF9hZGNfcmF0ZSkKKwkJCQlhbGlfc2V0X2FkY19yYXRlKHN0YXRlLCBzdGF0ZS0+cG1fc2F2ZWRfYWRjX3JhdGUpOworCQkJaWYgKHN0YXRlLT5wbV9zYXZlZF9kYWNfcmF0ZSkKKwkJCQlhbGlfc2V0X2RhY19yYXRlKHN0YXRlLCBzdGF0ZS0+cG1fc2F2ZWRfZGFjX3JhdGUpOworCQl9CisJfQorCisJY2FyZC0+cG1fc3VzcGVuZGVkID0gMDsKKwkvKiBhbnkgcHJvY2Vzc2VzIHRoYXQgd2VyZSByZWFkaW5nL3dyaXRpbmcgZHVyaW5nIHRoZSBzdXNwZW5kCisJICAgcHJvYmFibHkgZW5kZWQgdXAgaGVyZSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9IV19DSDsgaSsrKSB7CisJCXN0cnVjdCBhbGlfc3RhdGUgKnN0YXRlID0gY2FyZC0+c3RhdGVzW2ldOworCQlpZiAoc3RhdGUpCisJCQl3YWtlX3VwKCZzdGF0ZS0+ZG1hYnVmLndhaXQpOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgkJCQkvKiBDT05GSUdfUE0gKi8KKworTU9EVUxFX0FVVEhPUigiIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFMSSA1NDU1IGF1ZGlvIHN1cHBvcnQiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK21vZHVsZV9wYXJhbShjbG9ja2luZywgaW50LCAwKTsKKy8qIEZJWE1FOiBib29sPyAqLworbW9kdWxlX3BhcmFtKHN0cmljdF9jbG9ja2luZywgdWludCwgMCk7Cittb2R1bGVfcGFyYW0oY29kZWNfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCwgdWludCwgMCk7Cittb2R1bGVfcGFyYW0oY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkLCB1aW50LCAwKTsKK21vZHVsZV9wYXJhbShjb250cm9sbGVyX3BjbW91dF9zaGFyZV9zcGRpZl9sb2NrZWQsIHVpbnQsIDApOworbW9kdWxlX3BhcmFtKGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkLCB1aW50LCAwKTsKKyNkZWZpbmUgQUxJNTQ1NV9NT0RVTEVfTkFNRSAiYWxpNTQ1NSIKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhbGlfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBBTEk1NDU1X01PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IGFsaV9wY2lfdGJsLAorCS5wcm9iZQkJPSBhbGlfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhbGlfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGFsaV9wbV9zdXNwZW5kLAorCS5yZXN1bWUJCT0gYWxpX3BtX3Jlc3VtZSwKKyNlbmRpZgkJCQkvKiBDT05GSUdfUE0gKi8KK307CisKK3N0YXRpYyBpbnQgX19pbml0IGFsaV9pbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkFMSSA1NDU1ICsgQUM5NyBBdWRpbywgdmVyc2lvbiAiCisJICAgICAgIERSSVZFUl9WRVJTSU9OICIsICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOworCisJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA+IDApIHsKKwkJaWYgKGNvZGVjX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA9PSAzMjAwMAorCQkgICAgfHwgY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID09IDQ0MTAwCisJCSAgICB8fCBjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPT0gNDgwMDApIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImFsaV9hdWRpbzogRW5hYmxpbmcgUy9QRElGIGF0IHNhbXBsZSByYXRlICVkSHouXG4iLCBjb2RlY19pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWxpX2F1ZGlvOiBTL1BESUYgY2FuIG9ubHkgYmUgbG9ja2VkIHRvIDMyMDAwLCA0NDEwMCwgb3IgNDgwMDBIei5cbiIpOworCQkJY29kZWNfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID0gMDsKKwkJfQorCX0KKwlpZiAoY29udHJvbGxlcl9pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCWlmIChjb250cm9sbGVyX2luZGVwZW5kZW50X3NwZGlmX2xvY2tlZCA9PSAzMjAwMAorCQkgICAgfHwgY29udHJvbGxlcl9pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPT0gNDQxMDAKKwkJICAgIHx8IGNvbnRyb2xsZXJfaW5kZXBlbmRlbnRfc3BkaWZfbG9ja2VkID09IDQ4MDAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJhbGlfYXVkaW86IEVuYWJsaW5nIFMvUERJRiBhdCBzYW1wbGUgcmF0ZSAlZEh6LlxuIiwgY29udHJvbGxlcl9pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWxpX2F1ZGlvOiBTL1BESUYgY2FuIG9ubHkgYmUgbG9ja2VkIHRvIDMyMDAwLCA0NDEwMCwgb3IgNDgwMDBIei5cbiIpOworCQkJY29udHJvbGxlcl9pbmRlcGVuZGVudF9zcGRpZl9sb2NrZWQgPSAwOworCQl9CisJfQorCisJaWYgKGNvZGVjX3BjbW91dF9zaGFyZV9zcGRpZl9sb2NrZWQgPiAwKSB7CisJCWlmIChjb2RlY19wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID09IDMyMDAwCisJCSAgICB8fCBjb2RlY19wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID09IDQ0MTAwCisJCSAgICB8fCBjb2RlY19wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID09IDQ4MDAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJhbGlfYXVkaW86IEVuYWJsaW5nIFMvUERJRiBhdCBzYW1wbGUgcmF0ZSAlZEh6LlxuIiwgY29kZWNfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCk7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJhbGlfYXVkaW86IFMvUERJRiBjYW4gb25seSBiZSBsb2NrZWQgdG8gMzIwMDAsIDQ0MTAwLCBvciA0ODAwMEh6LlxuIik7CisJCQljb2RlY19wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID0gMDsKKwkJfQorCX0KKwlpZiAoY29udHJvbGxlcl9wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID4gMCkgeworCQlpZiAoY29udHJvbGxlcl9wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkID09IDMyMDAwCisJCSAgICB8fCBjb250cm9sbGVyX3BjbW91dF9zaGFyZV9zcGRpZl9sb2NrZWQgPT0gNDQxMDAKKwkJICAgIHx8IGNvbnRyb2xsZXJfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCA9PSA0ODAwMCkgeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiYWxpX2F1ZGlvOiBFbmFibGluZyBjb250cm9sbGVyIFMvUERJRiBhdCBzYW1wbGUgcmF0ZSAlZEh6LlxuIiwgY29udHJvbGxlcl9wY21vdXRfc2hhcmVfc3BkaWZfbG9ja2VkKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayhLRVJOX0lORk8gImFsaV9hdWRpbzogUy9QRElGIGNhbiBvbmx5IGJlIGxvY2tlZCB0byAzMjAwMCwgNDQxMDAsIG9yIDQ4MDAwSHouXG4iKTsKKwkJCWNvbnRyb2xsZXJfcGNtb3V0X3NoYXJlX3NwZGlmX2xvY2tlZCA9IDA7CisJCX0KKwl9CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmFsaV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGFsaV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYWxpX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChhbGlfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYWxpX2NsZWFudXBfbW9kdWxlKTsKKy8qCitMb2NhbCBWYXJpYWJsZXM6CitjLWJhc2ljLW9mZnNldDogOAorRW5kOgorKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hdTEwMDAuYyBiL3NvdW5kL29zcy9hdTEwMDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDkxNzMzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2F1MTAwMC5jCkBAIC0wLDAgKzEsMjIxNCBAQAorLyoKKyAqICAgICAgYXUxMDAwLmMgIC0tICBTb3VuZCBkcml2ZXIgZm9yIEFsY2hlbXkgQXUxMDAwIE1JUFMgSW50ZXJuZXQgRWRnZQorICogICAgICAgICAgICAgICAgICAgIFByb2Nlc3Nvci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMSBNb250YVZpc3RhIFNvZnR3YXJlIEluYy4KKyAqIEF1dGhvcjogTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLgorICogICAgICAgICAJc3RldmVsQG12aXN0YS5jb20gb3Igc291cmNlQG12aXN0YS5jb20KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoKKyAqIE1vZHVsZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyczoKKyAqCisgKiAgU3VwcG9ydGVkIGRldmljZXM6CisgKiAgL2Rldi9kc3AgICAgc3RhbmRhcmQgT1NTIC9kZXYvZHNwIGRldmljZQorICogIC9kZXYvbWl4ZXIgIHN0YW5kYXJkIE9TUyAvZGV2L21peGVyIGRldmljZQorICoKKyAqIE5vdGVzOgorICoKKyAqICAxLiBNdWNoIG9mIHRoZSBPU1MgYnVmZmVyIGFsbG9jYXRpb24sIGlvY3RsJ3MsIGFuZCBtbWFwJ2luZyBhcmUKKyAqICAgICB0YWtlbiwgc2xpZ2h0bHkgbW9kaWZpZWQgb3Igbm90IGF0IGFsbCwgZnJvbSB0aGUgRVMxMzcxIGRyaXZlciwKKyAqICAgICBzbyByZWZlciB0byB0aGUgY3JlZGl0cyBpbiBlczEzNzEuYyBmb3IgdGhvc2UuIFRoZSByZXN0IG9mIHRoZQorICogICAgIGNvZGUgKHByb2JlLCBvcGVuLCByZWFkLCB3cml0ZSwgdGhlIElTUiwgZXRjLikgaXMgbmV3LgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAwNi4yNy4yMDAxICBJbml0aWFsIHZlcnNpb24KKyAqICAgIDAzLjIwLjIwMDIgIEFkZGVkIG11dGV4IGxvY2tzIGFyb3VuZCByZWFkL3dyaXRlIG1ldGhvZHMsIHRvIHByZXZlbnQKKyAqICAgICAgICAgICAgICAgIHNpbXVsdGFuZW91cyBhY2Nlc3Mgb24gU01QIG9yIHByZWVtcHRpYmxlIGtlcm5lbHMuIEFsc28KKyAqICAgICAgICAgICAgICAgIHJlbW92ZWQgdGhlIGNvdW50ZXIvcG9pbnRlciBmcmFnbWVudCBhbGlnbmluZyBhdCB0aGUgZW5kCisgKiAgICAgICAgICAgICAgICBvZiByZWFkL3dyaXRlIG1ldGhvZHMgW3N0ZXZlbF0uCisgKiAgICAwMy4yMS4yMDAyICBBZGQgc3VwcG9ydCBmb3IgY29oZXJlbnQgRE1BIG9uIHRoZSBhdWRpbyByZWFkL3dyaXRlIERNQQorICogICAgICAgICAgICAgICAgY2hhbm5lbHMgW3N0ZXZlbF0uCisgKgorICovCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtYXUxeDAwL2F1MTAwMC5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDBfZG1hLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisjdW5kZWYgQVUxMDAwX0RFQlVHCisjdW5kZWYgQVUxMDAwX1ZFUkJPU0VfREVCVUcKKworI2RlZmluZSBBVTEwMDBfTU9EVUxFX05BTUUgIkF1MTAwMCBhdWRpbyIKKyNkZWZpbmUgUEZYIEFVMTAwMF9NT0RVTEVfTkFNRQorCisjaWZkZWYgQVUxMDAwX0RFQlVHCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fREVCVUcgUEZYICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI2RlZmluZSB3YXJuKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCisKKy8qIG1pc2Mgc3R1ZmYgKi8KKyNkZWZpbmUgUE9MTF9DT1VOVCAgIDB4NTAwMAorI2RlZmluZSBBQzk3X0VYVF9EQUNTIChBQzk3X0VYVElEX1NEQUMgfCBBQzk3X0VYVElEX0NEQUMgfCBBQzk3X0VYVElEX0xEQUMpCisKKy8qIEJvb3Qgb3B0aW9ucyAqLworc3RhdGljIGludCAgICAgIHZyYSA9IDA7CS8vIDAgPSBubyBWUkEsIDEgPSB1c2UgVlJBIGlmIGNvZGVjIHN1cHBvcnRzIGl0CitNT0RVTEVfUEFSTSh2cmEsICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKHZyYSwgImlmIDEgdXNlIFZSQSBpZiBjb2RlYyBzdXBwb3J0cyBpdCIpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgYXUxMDAwX3N0YXRlIHsKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgICAgICAgICAgICAgZGV2X2F1ZGlvOworCisjaWZkZWYgQVUxMDAwX0RFQlVHCisJLyogZGVidWcgL3Byb2MgZW50cnkgKi8KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnBzOworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqYWM5N19wczsKKyNlbmRpZgkJCQkvKiBBVTEwMDBfREVCVUcgKi8KKworCXN0cnVjdCBhYzk3X2NvZGVjIGNvZGVjOworCXVuc2lnbmVkICAgICAgICBjb2RlY19iYXNlX2NhcHM7Ly8gQUMnOTcgcmVnIDAwaCwgIlJlc2V0IFJlZ2lzdGVyIgorCXVuc2lnbmVkICAgICAgICBjb2RlY19leHRfY2FwczsJLy8gQUMnOTcgcmVnIDI4aCwgIkV4dGVuZGVkIEF1ZGlvIElEIgorCWludCAgICAgICAgICAgICBub192cmE7CS8vIGRvIG5vdCB1c2UgVlJBCisKKwlzcGlubG9ja190ICAgICAgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCW1vZGVfdCAgICAgICAgICBvcGVuX21vZGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCisJc3RydWN0IGRtYWJ1ZiB7CisJCXVuc2lnbmVkIGludCAgICBkbWFucjsJLy8gRE1BIENoYW5uZWwgbnVtYmVyCisJCXVuc2lnbmVkICAgICAgICBzYW1wbGVfcmF0ZTsJLy8gSHoKKwkJdW5zaWduZWQgc3JjX2ZhY3RvcjsgICAgIC8vIFNSQyBpbnRlcnAvZGVjaW1hdGlvbiAobm8gdnJhKQorCQl1bnNpZ25lZCAgICAgICAgc2FtcGxlX3NpemU7CS8vIDggb3IgMTYKKwkJaW50ICAgICAgICAgICAgIG51bV9jaGFubmVsczsJLy8gMSA9IG1vbm8sIDIgPSBzdGVyZW8sIDQsIDYKKwkJaW50IGRtYV9ieXRlc19wZXJfc2FtcGxlOy8vIERNQSBieXRlcyBwZXIgYXVkaW8gc2FtcGxlIGZyYW1lCisJCWludCB1c2VyX2J5dGVzX3Blcl9zYW1wbGU7Ly8gVXNlciBieXRlcyBwZXIgYXVkaW8gc2FtcGxlIGZyYW1lCisJCWludCBjbnRfZmFjdG9yOyAgICAgICAgICAvLyB1c2VyLXRvLURNQSBieXRlcyBwZXIgYXVkaW8KKwkJLy8gIHNhbXBsZSBmcmFtZQorCQl2b2lkICAgICAgICAgICAqcmF3YnVmOworCQlkbWFfYWRkcl90ICAgICAgZG1hYWRkcjsKKwkJdW5zaWduZWQgICAgICAgIGJ1Zm9yZGVyOworCQl1bnNpZ25lZCBudW1mcmFnOyAgICAgICAgLy8gIyBvZiBETUEgZnJhZ21lbnRzIGluIERNQSBidWZmZXIKKwkJdW5zaWduZWQgICAgICAgIGZyYWdzaGlmdDsKKwkJdm9pZCAgICAgICAgICAgKm5leHRJbjsJLy8gcHRyIHRvIG5leHQtaW4gdG8gRE1BIGJ1ZmZlcgorCQl2b2lkICAgICAgICAgICAqbmV4dE91dDsvLyBwdHIgdG8gbmV4dC1vdXQgZnJvbSBETUEgYnVmZmVyCisJCWludCAgICAgICAgICAgICBjb3VudDsJLy8gY3VycmVudCBieXRlIGNvdW50IGluIERNQSBidWZmZXIKKwkJdW5zaWduZWQgICAgICAgIHRvdGFsX2J5dGVzOwkvLyB0b3RhbCBieXRlcyB3cml0dGVuIG9yIHJlYWQKKwkJdW5zaWduZWQgICAgICAgIGVycm9yOwkvLyBvdmVyL3VuZGVycnVuCisJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJCS8qIHJlZHVuZGFudCwgYnV0IG1ha2VzIGNhbGN1bGF0aW9ucyBlYXNpZXIgKi8KKwkJdW5zaWduZWQgZnJhZ3NpemU7ICAgICAgIC8vIHVzZXIgcGVyY2VwdGlvbiBvZiBmcmFnbWVudCBzaXplCisJCXVuc2lnbmVkIGRtYV9mcmFnc2l6ZTsgICAvLyBETUEgKHJlYWwpIGZyYWdtZW50IHNpemUKKwkJdW5zaWduZWQgZG1hc2l6ZTsgICAgICAgIC8vIFRvdGFsIERNQSBidWZmZXIgc2l6ZQorCQkvLyAgIChtdWx0LiBvZiBETUEgZnJhZ3NpemUpCisJCS8qIE9TUyBzdHVmZiAqLworCQl1bnNpZ25lZCAgICAgICAgbWFwcGVkOjE7CisJCXVuc2lnbmVkICAgICAgICByZWFkeToxOworCQl1bnNpZ25lZCAgICAgICAgc3RvcHBlZDoxOworCQl1bnNpZ25lZCAgICAgICAgb3NzZnJhZ3NoaWZ0OworCQlpbnQgICAgICAgICAgICAgb3NzbWF4ZnJhZ3M7CisJCXVuc2lnbmVkICAgICAgICBzdWJkaXZpc2lvbjsKKwl9IGRtYV9kYWMgICAgICAsIGRtYV9hZGM7Cit9IGF1MTAwMF9zdGF0ZTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsZDIodW5zaWduZWQgaW50IHgpCit7CisJdW5zaWduZWQgICAgICAgIHIgPSAwOworCisJaWYgKHggPj0gMHgxMDAwMCkgeworCQl4ID4+PSAxNjsKKwkJciArPSAxNjsKKwl9CisJaWYgKHggPj0gMHgxMDApIHsKKwkJeCA+Pj0gODsKKwkJciArPSA4OworCX0KKwlpZiAoeCA+PSAweDEwKSB7CisJCXggPj49IDQ7CisJCXIgKz0gNDsKKwl9CisJaWYgKHggPj0gNCkgeworCQl4ID4+PSAyOworCQlyICs9IDI7CisJfQorCWlmICh4ID49IDIpCisJCXIrKzsKKwlyZXR1cm4gcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGF1MTAwMF9kZWxheShpbnQgbXNlYykKK3sKKwl1bnNpZ25lZCBsb25nICAgdG1vOworCXNpZ25lZCBsb25nICAgICB0bW8yOworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CisKKwl0bW8gPSBqaWZmaWVzICsgKG1zZWMgKiBIWikgLyAxMDAwOworCWZvciAoOzspIHsKKwkJdG1vMiA9IHRtbyAtIGppZmZpZXM7CisJCWlmICh0bW8yIDw9IDApCisJCQlicmVhazsKKwkJc2NoZWR1bGVfdGltZW91dCh0bW8yKTsKKwl9Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1MTYgcmRjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IGFkZHIpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJdTMyICAgICAgICAgICAgIGNtZDsKKwl1MTYgICAgICAgICAgICAgZGF0YTsKKwlpbnQgICAgICAgICAgICAgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKQorCQlpZiAoIShhdV9yZWFkbChBQzk3Q19TVEFUVVMpICYgQUM5N0NfQ1ApKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJyZGNvZGVjOiBjb2RlYyBjbWQgcGVuZGluZyBleHBpcmVkISIpOworCisJY21kID0gKHUzMikgYWRkciAmIEFDOTdDX0lOREVYX01BU0s7CisJY21kIHw9IEFDOTdDX1JFQUQ7CS8vIHJlYWQgY29tbWFuZAorCWF1X3dyaXRlbChjbWQsIEFDOTdDX0NNRCk7CisKKwkvKiBub3cgd2FpdCBmb3IgdGhlIGRhdGEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKQorCQlpZiAoIShhdV9yZWFkbChBQzk3Q19TVEFUVVMpICYgQUM5N0NfQ1ApKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkgeworCQllcnIoInJkY29kZWM6IHJlYWQgcG9sbCBleHBpcmVkISIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkYXRhID0gYXVfcmVhZGwoQUM5N0NfQ01EKSAmIDB4ZmZmZjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBkYXRhOworfQorCisKK3N0YXRpYyB2b2lkIHdyY29kZWMoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCBhZGRyLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzID0gKHN0cnVjdCBhdTEwMDBfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1MzIgICAgICAgICAgICAgY21kOworCWludCAgICAgICAgICAgICBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBQT0xMX0NPVU5UOyBpKyspCisJCWlmICghKGF1X3JlYWRsKEFDOTdDX1NUQVRVUykgJiBBQzk3Q19DUCkpCisJCQlicmVhazsKKwlpZiAoaSA9PSBQT0xMX0NPVU5UKQorCQllcnIoIndyY29kZWM6IGNvZGVjIGNtZCBwZW5kaW5nIGV4cGlyZWQhIik7CisKKwljbWQgPSAodTMyKSBhZGRyICYgQUM5N0NfSU5ERVhfTUFTSzsKKwljbWQgJj0gfkFDOTdDX1JFQUQ7CS8vIHdyaXRlIGNvbW1hbmQKKwljbWQgfD0gKCh1MzIpIGRhdGEgPDwgQUM5N0NfV0RfQklUKTsJLy8gT1IgaW4gdGhlIGRhdGEgd29yZAorCWF1X3dyaXRlbChjbWQsIEFDOTdDX0NNRCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJdTE2ICAgICAgICAgICAgIHRlbXA7CisJaW50ICAgICAgICAgICAgIGk7CisKKwkvKiBjb2RlY193YWl0IGlzIHVzZWQgdG8gd2FpdCBmb3IgYSByZWFkeSBzdGF0ZSBhZnRlcgorCSAgIGFuIEFDOTdDX1JFU0VULiAqLworCWF1MTAwMF9kZWxheSgxMCk7CisKKwkvLyBmaXJzdCBwb2xsIHRoZSBDT0RFQ19SRUFEWSB0YWcgYml0CisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykKKwkJaWYgKGF1X3JlYWRsKEFDOTdDX1NUQVRVUykgJiBBQzk3Q19SRUFEWSkKKwkJCWJyZWFrOworCWlmIChpID09IFBPTExfQ09VTlQpIHsKKwkJZXJyKCJ3YWl0Y29kZWM6IENPREVDX1JFQURZIHBvbGwgZXhwaXJlZCEiKTsKKwkJcmV0dXJuOworCX0KKwkvLyBnZXQgQUMnOTcgcG93ZXJkb3duIGNvbnRyb2wvc3RhdHVzIHJlZ2lzdGVyCisJdGVtcCA9IHJkY29kZWMoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisKKwkvLyBJZiBhbnl0aGluZyBpcyBwb3dlcmVkIGRvd24sIHBvd2VyJ2VtIHVwCisJaWYgKHRlbXAgJiAweDdmMDApIHsKKwkJLy8gUG93ZXIgb24KKwkJd3Jjb2RlYyhjb2RlYywgQUM5N19QT1dFUl9DT05UUk9MLCAwKTsKKwkJYXUxMDAwX2RlbGF5KDEwMCk7CisJCS8vIFJlcmVhZAorCQl0ZW1wID0gcmRjb2RlYyhjb2RlYywgQUM5N19QT1dFUl9DT05UUk9MKTsKKwl9CisgICAgCisJLy8gQ2hlY2sgaWYgQ29kZWMgUkVGLEFOTCxEQUMsQURDIHJlYWR5CisJaWYgKCh0ZW1wICYgMHg3ZjBmKSAhPSAweDAwMGYpCisJCWVycigiY29kZWMgcmVnIDI2IHN0YXR1cyAoMHgleCkgbm90IHJlYWR5ISEiLCB0ZW1wKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogc3RvcCB0aGUgQURDIGJlZm9yZSBjYWxsaW5nICovCitzdGF0aWMgdm9pZCBzZXRfYWRjX3JhdGUoc3RydWN0IGF1MTAwMF9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICAqYWRjID0gJnMtPmRtYV9hZGM7CisJc3RydWN0IGRtYWJ1ZiAgKmRhYyA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkICAgICAgICBhZGNfcmF0ZSwgZGFjX3JhdGU7CisJdTE2ICAgICAgICAgICAgIGFjOTdfZXh0c3RhdDsKKworCWlmIChzLT5ub192cmEpIHsKKwkJLy8gY2FsYyBTUkMgZmFjdG9yCisJCWFkYy0+c3JjX2ZhY3RvciA9ICgoOTYwMDAgLyByYXRlKSArIDEpID4+IDE7CisJCWFkYy0+c2FtcGxlX3JhdGUgPSA0ODAwMCAvIGFkYy0+c3JjX2ZhY3RvcjsKKwkJcmV0dXJuOworCX0KKworCWFkYy0+c3JjX2ZhY3RvciA9IDE7CisKKwlhYzk3X2V4dHN0YXQgPSByZGNvZGVjKCZzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCisJcmF0ZSA9IHJhdGUgPiA0ODAwMCA/IDQ4MDAwIDogcmF0ZTsKKworCS8vIGVuYWJsZSBWUkEKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCWFjOTdfZXh0c3RhdCB8IEFDOTdfRVhUU1RBVF9WUkEpOworCS8vIG5vdyB3cml0ZSB0aGUgc2FtcGxlIHJhdGUKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01fTFJfQURDX1JBVEUsICh1MTYpIHJhdGUpOworCS8vIHJlYWQgaXQgYmFjayBmb3IgYWN0dWFsIHN1cHBvcnRlZCByYXRlCisJYWRjX3JhdGUgPSByZGNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01fTFJfQURDX1JBVEUpOworCisjaWZkZWYgQVUxMDAwX1ZFUkJPU0VfREVCVUcKKwlkYmcoIiVzOiBzZXQgdG8gJWQgSHoiLCBfX0ZVTkNUSU9OX18sIGFkY19yYXRlKTsKKyNlbmRpZgorCisJLy8gc29tZSBjb2RlYydzIGRvbid0IGFsbG93IHVuZXF1YWwgREFDIGFuZCBBREMgcmF0ZXMsIGluIHdoaWNoIGNhc2UKKwkvLyB3cml0aW5nIG9uZSByYXRlIHJlZyBhY3R1YWxseSBjaGFuZ2VzIGJvdGguCisJZGFjX3JhdGUgPSByZGNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpOworCWlmIChkYWMtPm51bV9jaGFubmVscyA+IDIpCisJCXdyY29kZWMoJnMtPmNvZGVjLCBBQzk3X1BDTV9TVVJSX0RBQ19SQVRFLCBkYWNfcmF0ZSk7CisJaWYgKGRhYy0+bnVtX2NoYW5uZWxzID4gNCkKKwkJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfUENNX0xGRV9EQUNfUkFURSwgZGFjX3JhdGUpOworCisJYWRjLT5zYW1wbGVfcmF0ZSA9IGFkY19yYXRlOworCWRhYy0+c2FtcGxlX3JhdGUgPSBkYWNfcmF0ZTsKK30KKworLyogc3RvcCB0aGUgREFDIGJlZm9yZSBjYWxsaW5nICovCitzdGF0aWMgdm9pZCBzZXRfZGFjX3JhdGUoc3RydWN0IGF1MTAwMF9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICAqZGFjID0gJnMtPmRtYV9kYWM7CisJc3RydWN0IGRtYWJ1ZiAgKmFkYyA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkICAgICAgICBhZGNfcmF0ZSwgZGFjX3JhdGU7CisJdTE2ICAgICAgICAgICAgIGFjOTdfZXh0c3RhdDsKKworCWlmIChzLT5ub192cmEpIHsKKwkJLy8gY2FsYyBTUkMgZmFjdG9yCisJCWRhYy0+c3JjX2ZhY3RvciA9ICgoOTYwMDAgLyByYXRlKSArIDEpID4+IDE7CisJCWRhYy0+c2FtcGxlX3JhdGUgPSA0ODAwMCAvIGRhYy0+c3JjX2ZhY3RvcjsKKwkJcmV0dXJuOworCX0KKworCWRhYy0+c3JjX2ZhY3RvciA9IDE7CisKKwlhYzk3X2V4dHN0YXQgPSByZGNvZGVjKCZzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCisJcmF0ZSA9IHJhdGUgPiA0ODAwMCA/IDQ4MDAwIDogcmF0ZTsKKworCS8vIGVuYWJsZSBWUkEKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCWFjOTdfZXh0c3RhdCB8IEFDOTdfRVhUU1RBVF9WUkEpOworCS8vIG5vdyB3cml0ZSB0aGUgc2FtcGxlIHJhdGUKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsICh1MTYpIHJhdGUpOworCS8vIEkgZG9uJ3Qgc3VwcG9ydCBkaWZmZXJlbnQgc2FtcGxlIHJhdGVzIGZvciBtdWx0aWNoYW5uZWwsCisJLy8gc28gbWFrZSB0aGVzZSBjaGFubmVscyB0aGUgc2FtZS4KKwlpZiAoZGFjLT5udW1fY2hhbm5lbHMgPiAyKQorCQl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01fU1VSUl9EQUNfUkFURSwgKHUxNikgcmF0ZSk7CisJaWYgKGRhYy0+bnVtX2NoYW5uZWxzID4gNCkKKwkJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfUENNX0xGRV9EQUNfUkFURSwgKHUxNikgcmF0ZSk7CisJLy8gcmVhZCBpdCBiYWNrIGZvciBhY3R1YWwgc3VwcG9ydGVkIHJhdGUKKwlkYWNfcmF0ZSA9IHJkY29kZWMoJnMtPmNvZGVjLCBBQzk3X1BDTV9GUk9OVF9EQUNfUkFURSk7CisKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWRiZygiJXM6IHNldCB0byAlZCBIeiIsIF9fRlVOQ1RJT05fXywgZGFjX3JhdGUpOworI2VuZGlmCisKKwkvLyBzb21lIGNvZGVjJ3MgZG9uJ3QgYWxsb3cgdW5lcXVhbCBEQUMgYW5kIEFEQyByYXRlcywgaW4gd2hpY2ggY2FzZQorCS8vIHdyaXRpbmcgb25lIHJhdGUgcmVnIGFjdHVhbGx5IGNoYW5nZXMgYm90aC4KKwlhZGNfcmF0ZSA9IHJkY29kZWMoJnMtPmNvZGVjLCBBQzk3X1BDTV9MUl9BRENfUkFURSk7CisKKwlkYWMtPnNhbXBsZV9yYXRlID0gZGFjX3JhdGU7CisJYWRjLT5zYW1wbGVfcmF0ZSA9IGFkY19yYXRlOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCWlmIChkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWRpc2FibGVfZG1hKGRiLT5kbWFucik7CisKKwlkYi0+c3RvcHBlZCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkICBzdG9wX2FkYyhzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCWlmIChkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWRpc2FibGVfZG1hKGRiLT5kbWFucik7CisKKwlkYi0+c3RvcHBlZCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgc2V0X3htaXRfc2xvdHMoaW50IG51bV9jaGFubmVscykKK3sKKwl1MzIgYWM5N19jb25maWcgPSBhdV9yZWFkbChBQzk3Q19DT05GSUcpICYgfkFDOTdDX1hNSVRfU0xPVFNfTUFTSzsKKworCXN3aXRjaCAobnVtX2NoYW5uZWxzKSB7CisJY2FzZSAxOgkJLy8gbW9ubworCWNhc2UgMjoJCS8vIHN0ZXJlbywgc2xvdHMgMyw0CisJCWFjOTdfY29uZmlnIHw9ICgweDMgPDwgQUM5N0NfWE1JVF9TTE9UU19CSVQpOworCQlicmVhazsKKwljYXNlIDQ6CQkvLyBzdGVyZW8gd2l0aCBzdXJyb3VuZCwgc2xvdHMgMyw0LDcsOAorCQlhYzk3X2NvbmZpZyB8PSAoMHgzMyA8PCBBQzk3Q19YTUlUX1NMT1RTX0JJVCk7CisJCWJyZWFrOworCWNhc2UgNjoJCS8vIHN0ZXJlbyB3aXRoIHN1cnJvdW5kIGFuZCBjZW50ZXIvTEZFLCBzbG90cyAzLDQsNiw3LDgsOQorCQlhYzk3X2NvbmZpZyB8PSAoMHg3YiA8PCBBQzk3Q19YTUlUX1NMT1RTX0JJVCk7CisJCWJyZWFrOworCX0KKworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgQUM5N0NfQ09ORklHKTsKK30KKworc3RhdGljIHZvaWQgICAgIHNldF9yZWN2X3Nsb3RzKGludCBudW1fY2hhbm5lbHMpCit7CisJdTMyIGFjOTdfY29uZmlnID0gYXVfcmVhZGwoQUM5N0NfQ09ORklHKSAmIH5BQzk3Q19SRUNWX1NMT1RTX01BU0s7CisKKwkvKgorCSAqIEFsd2F5cyBlbmFibGUgc2xvdHMgMyBhbmQgNCAoc3RlcmVvKS4gU2xvdCA2IGlzCisJICogb3B0aW9uYWwgTWljIEFEQywgd2hpY2ggSSBkb24ndCBzdXBwb3J0IHlldC4KKwkgKi8KKwlhYzk3X2NvbmZpZyB8PSAoMHgzIDw8IEFDOTdDX1JFQ1ZfU0xPVFNfQklUKTsKKworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgQUM5N0NfQ09ORklHKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBhdTEwMDBfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiAgKmRiID0gJnMtPmRtYV9kYWM7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgICBidWYxLCBidWYyOworCisJaWYgKCFkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWF1X3JlYWRsKEFDOTdDX1NUQVRVUyk7CS8vIHJlYWQgc3RhdHVzIHRvIGNsZWFyIHN0aWNreSBiaXRzCisKKwkvLyByZXNldCBCdWZmZXIgMSBhbmQgMiBwb2ludGVycyB0byBuZXh0T3V0IGFuZCBuZXh0T3V0K2RtYV9mcmFnc2l6ZQorCWJ1ZjEgPSB2aXJ0X3RvX3BoeXMoZGItPm5leHRPdXQpOworCWJ1ZjIgPSBidWYxICsgZGItPmRtYV9mcmFnc2l6ZTsKKwlpZiAoYnVmMiA+PSBkYi0+ZG1hYWRkciArIGRiLT5kbWFzaXplKQorCQlidWYyIC09IGRiLT5kbWFzaXplOworCisJc2V0X3htaXRfc2xvdHMoZGItPm51bV9jaGFubmVscyk7CisKKwlpbml0X2RtYShkYi0+ZG1hbnIpOworCWlmIChnZXRfZG1hX2FjdGl2ZV9idWZmZXIoZGItPmRtYW5yKSA9PSAwKSB7CisJCWNsZWFyX2RtYV9kb25lMChkYi0+ZG1hbnIpOwkvLyBjbGVhciBETUEgZG9uZSBiaXQKKwkJc2V0X2RtYV9hZGRyMChkYi0+ZG1hbnIsIGJ1ZjEpOworCQlzZXRfZG1hX2FkZHIxKGRiLT5kbWFuciwgYnVmMik7CisJfSBlbHNlIHsKKwkJY2xlYXJfZG1hX2RvbmUxKGRiLT5kbWFucik7CS8vIGNsZWFyIERNQSBkb25lIGJpdAorCQlzZXRfZG1hX2FkZHIxKGRiLT5kbWFuciwgYnVmMSk7CisJCXNldF9kbWFfYWRkcjAoZGItPmRtYW5yLCBidWYyKTsKKwl9CisJc2V0X2RtYV9jb3VudChkYi0+ZG1hbnIsIGRiLT5kbWFfZnJhZ3NpemU+PjEpOworCWVuYWJsZV9kbWFfYnVmZmVycyhkYi0+ZG1hbnIpOworCisJc3RhcnRfZG1hKGRiLT5kbWFucik7CisKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWR1bXBfYXUxMDAwX2RtYV9jaGFubmVsKGRiLT5kbWFucik7CisjZW5kaWYKKworCWRiLT5zdG9wcGVkID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBhdTEwMDBfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiAgKmRiID0gJnMtPmRtYV9hZGM7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgICBidWYxLCBidWYyOworCisJaWYgKCFkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWF1X3JlYWRsKEFDOTdDX1NUQVRVUyk7CS8vIHJlYWQgc3RhdHVzIHRvIGNsZWFyIHN0aWNreSBiaXRzCisKKwkvLyByZXNldCBCdWZmZXIgMSBhbmQgMiBwb2ludGVycyB0byBuZXh0SW4gYW5kIG5leHRJbitkbWFfZnJhZ3NpemUKKwlidWYxID0gdmlydF90b19waHlzKGRiLT5uZXh0SW4pOworCWJ1ZjIgPSBidWYxICsgZGItPmRtYV9mcmFnc2l6ZTsKKwlpZiAoYnVmMiA+PSBkYi0+ZG1hYWRkciArIGRiLT5kbWFzaXplKQorCQlidWYyIC09IGRiLT5kbWFzaXplOworCisJc2V0X3JlY3Zfc2xvdHMoZGItPm51bV9jaGFubmVscyk7CisKKwlpbml0X2RtYShkYi0+ZG1hbnIpOworCWlmIChnZXRfZG1hX2FjdGl2ZV9idWZmZXIoZGItPmRtYW5yKSA9PSAwKSB7CisJCWNsZWFyX2RtYV9kb25lMChkYi0+ZG1hbnIpOwkvLyBjbGVhciBETUEgZG9uZSBiaXQKKwkJc2V0X2RtYV9hZGRyMChkYi0+ZG1hbnIsIGJ1ZjEpOworCQlzZXRfZG1hX2FkZHIxKGRiLT5kbWFuciwgYnVmMik7CisJfSBlbHNlIHsKKwkJY2xlYXJfZG1hX2RvbmUxKGRiLT5kbWFucik7CS8vIGNsZWFyIERNQSBkb25lIGJpdAorCQlzZXRfZG1hX2FkZHIxKGRiLT5kbWFuciwgYnVmMSk7CisJCXNldF9kbWFfYWRkcjAoZGItPmRtYW5yLCBidWYyKTsKKwl9CisJc2V0X2RtYV9jb3VudChkYi0+ZG1hbnIsIGRiLT5kbWFfZnJhZ3NpemU+PjEpOworCWVuYWJsZV9kbWFfYnVmZmVycyhkYi0+ZG1hbnIpOworCisJc3RhcnRfZG1hKGRiLT5kbWFucik7CisKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWR1bXBfYXUxMDAwX2RtYV9jaGFubmVsKGRiLT5kbWFucik7CisjZW5kaWYKKworCWRiLT5zdG9wcGVkID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAoMTctUEFHRV9TSElGVCkKKyNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKKworZXh0ZXJuIGlubGluZSB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBhdTEwMDBfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXN0cnVjdCBwYWdlICAgICpwYWdlLCAqcGVuZDsKKworCWlmIChkYi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsKKwkJCQkgICAgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJZG1hX2ZyZWVfbm9uY29oZXJlbnQoTlVMTCwKKwkJCQlQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyLAorCQkJCWRiLT5yYXdidWYsCisJCQkJZGItPmRtYWFkZHIpOworCX0KKwlkYi0+cmF3YnVmID0gZGItPm5leHRJbiA9IGRiLT5uZXh0T3V0ID0gTlVMTDsKKwlkYi0+bWFwcGVkID0gZGItPnJlYWR5ID0gMDsKK30KKworc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlpbnQgICAgICAgICAgICAgb3JkZXI7CisJdW5zaWduZWQgdXNlcl9ieXRlc19wZXJfc2VjOworCXVuc2lnbmVkICAgICAgICBidWZzOworCXN0cnVjdCBwYWdlICAgICpwYWdlLCAqcGVuZDsKKwl1bnNpZ25lZCAgICAgICAgcmF0ZSA9IGRiLT5zYW1wbGVfcmF0ZTsKKworCWlmICghZGItPnJhd2J1ZikgeworCQlkYi0+cmVhZHkgPSBkYi0+bWFwcGVkID0gMDsKKwkJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7CisJCSAgICAgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKQorCQkJaWYgKChkYi0+cmF3YnVmID0gZG1hX2FsbG9jX25vbmNvaGVyZW50KE5VTEwsCisJCQkJCQlQQUdFX1NJWkUgPDwgb3JkZXIsCisJCQkJCQkmZGItPmRtYWFkZHIsCisJCQkJCQkwKSkpCisJCQkJYnJlYWs7CisJCWlmICghZGItPnJhd2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlkYi0+YnVmb3JkZXIgPSBvcmRlcjsKKwkJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOworCQkgICBvdGhlcndpc2UgcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArCisJCQkJICAgIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCX0KKworCWRiLT5jbnRfZmFjdG9yID0gMTsKKwlpZiAoZGItPnNhbXBsZV9zaXplID09IDgpCisJCWRiLT5jbnRfZmFjdG9yICo9IDI7CisJaWYgKGRiLT5udW1fY2hhbm5lbHMgPT0gMSkKKwkJZGItPmNudF9mYWN0b3IgKj0gMjsKKwlkYi0+Y250X2ZhY3RvciAqPSBkYi0+c3JjX2ZhY3RvcjsKKworCWRiLT5jb3VudCA9IDA7CisJZGItPm5leHRJbiA9IGRiLT5uZXh0T3V0ID0gZGItPnJhd2J1ZjsKKworCWRiLT51c2VyX2J5dGVzX3Blcl9zYW1wbGUgPSAoZGItPnNhbXBsZV9zaXplPj4zKSAqIGRiLT5udW1fY2hhbm5lbHM7CisJZGItPmRtYV9ieXRlc19wZXJfc2FtcGxlID0gMiAqICgoZGItPm51bV9jaGFubmVscyA9PSAxKSA/CisJCQkJCTIgOiBkYi0+bnVtX2NoYW5uZWxzKTsKKworCXVzZXJfYnl0ZXNfcGVyX3NlYyA9IHJhdGUgKiBkYi0+dXNlcl9ieXRlc19wZXJfc2FtcGxlOworCWJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworCWlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IHVzZXJfYnl0ZXNfcGVyX3NlYykKKwkJCWRiLT5mcmFnc2hpZnQgPSBsZDIodXNlcl9ieXRlc19wZXJfc2VjLzEwMDApOworCQllbHNlCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gZGItPm9zc2ZyYWdzaGlmdDsKKwl9IGVsc2UgeworCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKHVzZXJfYnl0ZXNfcGVyX3NlYyAvIDEwMCAvCisJCQkJICAgIChkYi0+c3ViZGl2aXNpb24gPyBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CisJCWlmIChkYi0+ZnJhZ3NoaWZ0IDwgMykKKwkJCWRiLT5mcmFnc2hpZnQgPSAzOworCX0KKworCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKwlkYi0+ZG1hX2ZyYWdzaXplID0gZGItPmZyYWdzaXplICogZGItPmNudF9mYWN0b3I7CisJZGItPm51bWZyYWcgPSBidWZzIC8gZGItPmRtYV9mcmFnc2l6ZTsKKworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+ZnJhZ3NpemUgPSAxIDw8IGRiLT5mcmFnc2hpZnQ7CisJCWRiLT5kbWFfZnJhZ3NpemUgPSBkYi0+ZnJhZ3NpemUgKiBkYi0+Y250X2ZhY3RvcjsKKwkJZGItPm51bWZyYWcgPSBidWZzIC8gZGItPmRtYV9mcmFnc2l6ZTsKKwl9CisKKwlpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisJCWRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworCisJZGItPmRtYXNpemUgPSBkYi0+ZG1hX2ZyYWdzaXplICogZGItPm51bWZyYWc7CisJbWVtc2V0KGRiLT5yYXdidWYsIDAsIGJ1ZnMpOworCisjaWZkZWYgQVUxMDAwX1ZFUkJPU0VfREVCVUcKKwlkYmcoInJhdGU9JWQsIHNhbXBsZXNpemU9JWQsIGNoYW5uZWxzPSVkIiwKKwkgICAgcmF0ZSwgZGItPnNhbXBsZV9zaXplLCBkYi0+bnVtX2NoYW5uZWxzKTsKKwlkYmcoImZyYWdzaXplPSVkLCBjbnRfZmFjdG9yPSVkLCBkbWFfZnJhZ3NpemU9JWQiLAorCSAgICBkYi0+ZnJhZ3NpemUsIGRiLT5jbnRfZmFjdG9yLCBkYi0+ZG1hX2ZyYWdzaXplKTsKKwlkYmcoIm51bWZyYWc9JWQsIGRtYXNpemU9JWQiLCBkYi0+bnVtZnJhZywgZGItPmRtYXNpemUpOworI2VuZGlmCisKKwlkYi0+cmVhZHkgPSAxOworCXJldHVybiAwOworfQorCitleHRlcm4gaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9hZGMoc3RydWN0IGF1MTAwMF9zdGF0ZSAqcykKK3sKKwlzdG9wX2FkYyhzKTsKKwlyZXR1cm4gcHJvZ19kbWFidWYocywgJnMtPmRtYV9hZGMpOworCit9CisKK2V4dGVybiBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2RhYyhzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzKQoreworCXN0b3BfZGFjKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYyk7Cit9CisKKworLyogaG9sZCBzcGlubG9jayBmb3IgdGhlIGZvbGxvd2luZyAqLworc3RhdGljIGlycXJldHVybl90IGRhY19kbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopIGRldl9pZDsKKwlzdHJ1Y3QgZG1hYnVmICAqZGFjID0gJnMtPmRtYV9kYWM7CisJdW5zaWduZWQgbG9uZyAgIG5ld3B0cjsKKwl1MzIgYWM5N2Nfc3RhdCwgYnVmZl9kb25lOworCisJYWM5N2Nfc3RhdCA9IGF1X3JlYWRsKEFDOTdDX1NUQVRVUyk7CisjaWZkZWYgQVUxMDAwX1ZFUkJPU0VfREVCVUcKKwlpZiAoYWM5N2Nfc3RhdCAmIChBQzk3Q19YVSB8IEFDOTdDX1hPIHwgQUM5N0NfVEUpKQorCQlkYmcoIkFDOTdDIHN0YXR1cyA9IDB4JTA4eCIsIGFjOTdjX3N0YXQpOworI2VuZGlmCisKKwlpZiAoKGJ1ZmZfZG9uZSA9IGdldF9kbWFfYnVmZmVyX2RvbmUoZGFjLT5kbWFucikpID09IDApIHsKKwkJLyogZmFzdHBhdGggb3V0LCB0byBlYXNlIGludGVycnVwdCBzaGFyaW5nICovCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlzcGluX2xvY2soJnMtPmxvY2spOworCQorCWlmIChidWZmX2RvbmUgIT0gKERNQV9EMCB8IERNQV9EMSkpIHsKKwkJZGFjLT5uZXh0T3V0ICs9IGRhYy0+ZG1hX2ZyYWdzaXplOworCQlpZiAoZGFjLT5uZXh0T3V0ID49IGRhYy0+cmF3YnVmICsgZGFjLT5kbWFzaXplKQorCQkJZGFjLT5uZXh0T3V0IC09IGRhYy0+ZG1hc2l6ZTsKKworCQkvKiB1cGRhdGUgcGxheWJhY2sgcG9pbnRlcnMgKi8KKwkJbmV3cHRyID0gdmlydF90b19waHlzKGRhYy0+bmV4dE91dCkgKyBkYWMtPmRtYV9mcmFnc2l6ZTsKKwkJaWYgKG5ld3B0ciA+PSBkYWMtPmRtYWFkZHIgKyBkYWMtPmRtYXNpemUpCisJCQluZXdwdHIgLT0gZGFjLT5kbWFzaXplOworCisJCWRhYy0+Y291bnQgLT0gZGFjLT5kbWFfZnJhZ3NpemU7CisJCWRhYy0+dG90YWxfYnl0ZXMgKz0gZGFjLT5kbWFfZnJhZ3NpemU7CisKKwkJaWYgKGRhYy0+Y291bnQgPD0gMCkgeworI2lmZGVmIEFVMTAwMF9WRVJCT1NFX0RFQlVHCisJCQlkYmcoImRhYyB1bmRlcnJ1biIpOworI2VuZGlmCisJCQlzcGluX3VubG9jaygmcy0+bG9jayk7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXNwaW5fbG9jaygmcy0+bG9jayk7CisJCQlkYWMtPmNvdW50ID0gMDsKKwkJCWRhYy0+bmV4dEluID0gZGFjLT5uZXh0T3V0OworCQl9IGVsc2UgaWYgKGJ1ZmZfZG9uZSA9PSBETUFfRDApIHsKKwkJCWNsZWFyX2RtYV9kb25lMChkYWMtPmRtYW5yKTsJLy8gY2xlYXIgRE1BIGRvbmUgYml0CisJCQlzZXRfZG1hX2NvdW50MChkYWMtPmRtYW5yLCBkYWMtPmRtYV9mcmFnc2l6ZT4+MSk7CisJCQlzZXRfZG1hX2FkZHIwKGRhYy0+ZG1hbnIsIG5ld3B0cik7CisJCQllbmFibGVfZG1hX2J1ZmZlcjAoZGFjLT5kbWFucik7CS8vIHJlZW5hYmxlCisJCX0gZWxzZSB7CisJCQljbGVhcl9kbWFfZG9uZTEoZGFjLT5kbWFucik7CS8vIGNsZWFyIERNQSBkb25lIGJpdAorCQkJc2V0X2RtYV9jb3VudDEoZGFjLT5kbWFuciwgZGFjLT5kbWFfZnJhZ3NpemU+PjEpOworCQkJc2V0X2RtYV9hZGRyMShkYWMtPmRtYW5yLCBuZXdwdHIpOworCQkJZW5hYmxlX2RtYV9idWZmZXIxKGRhYy0+ZG1hbnIpOwkvLyByZWVuYWJsZQorCQl9CisJfSBlbHNlIHsKKwkJLy8gYm90aCBkb25lIGJpdHMgc2V0LCB3ZSBtaXNzZWQgYW4gaW50ZXJydXB0CisJCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwkJc3RvcF9kYWMocyk7CisJCXNwaW5fbG9jaygmcy0+bG9jayk7CisKKwkJZGFjLT5uZXh0T3V0ICs9IDIqZGFjLT5kbWFfZnJhZ3NpemU7CisJCWlmIChkYWMtPm5leHRPdXQgPj0gZGFjLT5yYXdidWYgKyBkYWMtPmRtYXNpemUpCisJCQlkYWMtPm5leHRPdXQgLT0gZGFjLT5kbWFzaXplOworCisJCWRhYy0+Y291bnQgLT0gMipkYWMtPmRtYV9mcmFnc2l6ZTsKKwkJZGFjLT50b3RhbF9ieXRlcyArPSAyKmRhYy0+ZG1hX2ZyYWdzaXplOworCisJCWlmIChkYWMtPmNvdW50ID4gMCkgeworCQkJc3Bpbl91bmxvY2soJnMtPmxvY2spOworCQkJc3RhcnRfZGFjKHMpOworCQkJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwkJfQorCX0KKworCS8qIHdha2UgdXAgYW55Ym9keSBsaXN0ZW5pbmcgKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZGFjLT53YWl0KSkKKwkJd2FrZV91cCgmZGFjLT53YWl0KTsKKworCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3QgYWRjX2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzID0gKHN0cnVjdCBhdTEwMDBfc3RhdGUgKikgZGV2X2lkOworCXN0cnVjdCBkbWFidWYgICphZGMgPSAmcy0+ZG1hX2FkYzsKKwl1bnNpZ25lZCBsb25nICAgbmV3cHRyOworCXUzMiBhYzk3Y19zdGF0LCBidWZmX2RvbmU7CisKKwlhYzk3Y19zdGF0ID0gYXVfcmVhZGwoQUM5N0NfU1RBVFVTKTsKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWlmIChhYzk3Y19zdGF0ICYgKEFDOTdDX1JVIHwgQUM5N0NfUk8pKQorCQlkYmcoIkFDOTdDIHN0YXR1cyA9IDB4JTA4eCIsIGFjOTdjX3N0YXQpOworI2VuZGlmCisKKwlpZiAoKGJ1ZmZfZG9uZSA9IGdldF9kbWFfYnVmZmVyX2RvbmUoYWRjLT5kbWFucikpID09IDApIHsKKwkJLyogZmFzdHBhdGggb3V0LCB0byBlYXNlIGludGVycnVwdCBzaGFyaW5nICovCisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlzcGluX2xvY2soJnMtPmxvY2spOworCQorCWlmIChidWZmX2RvbmUgIT0gKERNQV9EMCB8IERNQV9EMSkpIHsKKwkJaWYgKGFkYy0+Y291bnQgKyBhZGMtPmRtYV9mcmFnc2l6ZSA+IGFkYy0+ZG1hc2l6ZSkgeworCQkJLy8gT3ZlcnJ1bi4gU3RvcCBBREMgYW5kIGxvZyB0aGUgZXJyb3IKKwkJCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwkJCXN0b3BfYWRjKHMpOworCQkJYWRjLT5lcnJvcisrOworCQkJZXJyKCJhZGMgb3ZlcnJ1biIpOworCQkJcmV0dXJuIElSUV9OT05FOworCQl9CisKKwkJYWRjLT5uZXh0SW4gKz0gYWRjLT5kbWFfZnJhZ3NpemU7CisJCWlmIChhZGMtPm5leHRJbiA+PSBhZGMtPnJhd2J1ZiArIGFkYy0+ZG1hc2l6ZSkKKwkJCWFkYy0+bmV4dEluIC09IGFkYy0+ZG1hc2l6ZTsKKworCQkvKiB1cGRhdGUgY2FwdHVyZSBwb2ludGVycyAqLworCQluZXdwdHIgPSB2aXJ0X3RvX3BoeXMoYWRjLT5uZXh0SW4pICsgYWRjLT5kbWFfZnJhZ3NpemU7CisJCWlmIChuZXdwdHIgPj0gYWRjLT5kbWFhZGRyICsgYWRjLT5kbWFzaXplKQorCQkJbmV3cHRyIC09IGFkYy0+ZG1hc2l6ZTsKKworCQlhZGMtPmNvdW50ICs9IGFkYy0+ZG1hX2ZyYWdzaXplOworCQlhZGMtPnRvdGFsX2J5dGVzICs9IGFkYy0+ZG1hX2ZyYWdzaXplOworCisJCWlmIChidWZmX2RvbmUgPT0gRE1BX0QwKSB7CisJCQljbGVhcl9kbWFfZG9uZTAoYWRjLT5kbWFucik7CS8vIGNsZWFyIERNQSBkb25lIGJpdAorCQkJc2V0X2RtYV9jb3VudDAoYWRjLT5kbWFuciwgYWRjLT5kbWFfZnJhZ3NpemU+PjEpOworCQkJc2V0X2RtYV9hZGRyMChhZGMtPmRtYW5yLCBuZXdwdHIpOworCQkJZW5hYmxlX2RtYV9idWZmZXIwKGFkYy0+ZG1hbnIpOwkvLyByZWVuYWJsZQorCQl9IGVsc2UgeworCQkJY2xlYXJfZG1hX2RvbmUxKGFkYy0+ZG1hbnIpOwkvLyBjbGVhciBETUEgZG9uZSBiaXQKKwkJCXNldF9kbWFfY291bnQxKGFkYy0+ZG1hbnIsIGFkYy0+ZG1hX2ZyYWdzaXplPj4xKTsKKwkJCXNldF9kbWFfYWRkcjEoYWRjLT5kbWFuciwgbmV3cHRyKTsKKwkJCWVuYWJsZV9kbWFfYnVmZmVyMShhZGMtPmRtYW5yKTsJLy8gcmVlbmFibGUKKwkJfQorCX0gZWxzZSB7CisJCS8vIGJvdGggZG9uZSBiaXRzIHNldCwgd2UgbWlzc2VkIGFuIGludGVycnVwdAorCQlzcGluX3VubG9jaygmcy0+bG9jayk7CisJCXN0b3BfYWRjKHMpOworCQlzcGluX2xvY2soJnMtPmxvY2spOworCQkKKwkJaWYgKGFkYy0+Y291bnQgKyAyKmFkYy0+ZG1hX2ZyYWdzaXplID4gYWRjLT5kbWFzaXplKSB7CisJCQkvLyBPdmVycnVuLiBMb2cgdGhlIGVycm9yCisJCQlhZGMtPmVycm9yKys7CisJCQllcnIoImFkYyBvdmVycnVuIik7CisJCQlzcGluX3VubG9jaygmcy0+bG9jayk7CisJCQlyZXR1cm4gSVJRX05PTkU7CisJCX0KKworCQlhZGMtPm5leHRJbiArPSAyKmFkYy0+ZG1hX2ZyYWdzaXplOworCQlpZiAoYWRjLT5uZXh0SW4gPj0gYWRjLT5yYXdidWYgKyBhZGMtPmRtYXNpemUpCisJCQlhZGMtPm5leHRJbiAtPSBhZGMtPmRtYXNpemU7CisKKwkJYWRjLT5jb3VudCArPSAyKmFkYy0+ZG1hX2ZyYWdzaXplOworCQlhZGMtPnRvdGFsX2J5dGVzICs9IDIqYWRjLT5kbWFfZnJhZ3NpemU7CisJCQorCQlzcGluX3VubG9jaygmcy0+bG9jayk7CisJCXN0YXJ0X2FkYyhzKTsKKwkJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwl9CisKKwkvKiB3YWtlIHVwIGFueWJvZHkgbGlzdGVuaW5nICovCisJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmFkYy0+d2FpdCkpCisJCXdha2VfdXAoJmFkYy0+d2FpdCk7CisKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgbG9mZl90IGF1MTAwMF9sbHNlZWsoc3RydWN0IGZpbGUgKmZpbGUsIGxvZmZfdCBvZmZzZXQsIGludCBvcmlnaW4pCit7CisJcmV0dXJuIC1FU1BJUEU7Cit9CisKKworc3RhdGljIGludCBhdTEwMDBfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJmF1MTAwMF9zdGF0ZTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgYXUxMDAwX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1peGRldl9pb2N0bChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgYXUxMDAwX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzID0gKHN0cnVjdCBhdTEwMDBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gJnMtPmNvZGVjOworCisJcmV0dXJuIG1peGRldl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworfQorCitzdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1MTAwMF9taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IGF1MTAwMF9sbHNlZWssCisJLmlvY3RsCQk9IGF1MTAwMF9pb2N0bF9taXhkZXYsCisJLm9wZW4JCT0gYXUxMDAwX29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlCT0gYXUxMDAwX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBhdTEwMDBfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgIGNvdW50LCB0bW87CisKKwlpZiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwgIXMtPmRtYV9kYWMucmVhZHkgfHwgcy0+ZG1hX2RhYy5zdG9wcGVkKQorCQlyZXR1cm4gMDsKKworCWZvciAoOzspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlpZiAobm9uYmxvY2spCisJCQlyZXR1cm4gLUVCVVNZOworCQl0bW8gPSAxMDAwICogY291bnQgLyAocy0+bm9fdnJhID8KKwkJCQkgICAgICA0ODAwMCA6IHMtPmRtYV9kYWMuc2FtcGxlX3JhdGUpOworCQl0bW8gLz0gcy0+ZG1hX2RhYy5kbWFfYnl0ZXNfcGVyX3NhbXBsZTsKKwkJYXUxMDAwX2RlbGF5KHRtbyk7CisJfQorCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdTggUzE2X1RPX1U4KHMxNiBjaCkKK3sKKwlyZXR1cm4gKHU4KSAoY2ggPj4gOCkgKyAweDgwOworfQorc3RhdGljIGlubGluZSBzMTYgVThfVE9fUzE2KHU4IGNoKQoreworCXJldHVybiAoczE2KSAoY2ggLSAweDgwKSA8PCA4OworfQorCisvKgorICogVHJhbnNsYXRlcyB1c2VyIHNhbXBsZXMgdG8gZG1hIGJ1ZmZlciBzdWl0YWJsZSBmb3IgQUMnOTcgREFDIGRhdGE6CisgKiAgICAgSWYgbW9ubywgY29weSBsZWZ0IGNoYW5uZWwgdG8gcmlnaHQgY2hhbm5lbCBpbiBkbWEgYnVmZmVyLgorICogICAgIElmIDggYml0IHNhbXBsZXMsIGN2dCB0byAxNi1iaXQgYmVmb3JlIHdyaXRpbmcgdG8gZG1hIGJ1ZmZlci4KKyAqICAgICBJZiBpbnRlcnBvbGF0aW5nIChubyBWUkEpLCBkdXBsaWNhdGUgZXZlcnkgYXVkaW8gZnJhbWUgc3JjX2ZhY3RvciB0aW1lcy4KKyAqLworc3RhdGljIGludCB0cmFuc2xhdGVfZnJvbV91c2VyKHN0cnVjdCBkbWFidWYgKmRiLAorCQkJICAgICAgIGNoYXIqIGRtYWJ1ZiwKKwkJCSAgICAgICBjaGFyKiB1c2VyYnVmLAorCQkJICAgICAgIGludCBkbWFjb3VudCkKK3sKKwlpbnQgICAgICAgICAgICAgc2FtcGxlLCBpOworCWludCAgICAgICAgICAgICBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKwlpbnQgICAgICAgICAgICAgbnVtX3NhbXBsZXM7CisJaW50ICAgICAgICAgICAgIG1vbm8gPSAoZGItPm51bV9jaGFubmVscyA9PSAxKTsKKwljaGFyICAgICAgICAgICAgdXNlcnNhbXBsZVsxMl07CisJczE2ICAgICAgICAgICAgIGNoLCBkbWFzYW1wbGVbNl07CisKKwlpZiAoZGItPnNhbXBsZV9zaXplID09IDE2ICYmICFtb25vICYmIGRiLT5zcmNfZmFjdG9yID09IDEpIHsKKwkJLy8gbm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5LCBqdXN0IGNvcHkKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1ZiwgdXNlcmJ1ZiwgZG1hY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBkbWFjb3VudDsKKwl9CisKKwlpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZSA9IGRiLT5kbWFfYnl0ZXNfcGVyX3NhbXBsZSAqIGRiLT5zcmNfZmFjdG9yOworCW51bV9zYW1wbGVzID0gZG1hY291bnQgLyBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKworCWZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgbnVtX3NhbXBsZXM7IHNhbXBsZSsrKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcih1c2Vyc2FtcGxlLCB1c2VyYnVmLAorCQkJCSAgIGRiLT51c2VyX2J5dGVzX3Blcl9zYW1wbGUpKSB7CisJCQlkYmcoIiVzOiBmYXVsdCIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBkYi0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChkYi0+c2FtcGxlX3NpemUgPT0gOCkKKwkJCQljaCA9IFU4X1RPX1MxNih1c2Vyc2FtcGxlW2ldKTsKKwkJCWVsc2UKKwkJCQljaCA9ICooKHMxNiAqKSAoJnVzZXJzYW1wbGVbaSAqIDJdKSk7CisJCQlkbWFzYW1wbGVbaV0gPSBjaDsKKwkJCWlmIChtb25vKQorCQkJCWRtYXNhbXBsZVtpICsgMV0gPSBjaDsJLy8gcmlnaHQgY2hhbm5lbAorCQl9CisKKwkJLy8gZHVwbGljYXRlIGV2ZXJ5IGF1ZGlvIGZyYW1lIHNyY19mYWN0b3IgdGltZXMKKwkJZm9yIChpID0gMDsgaSA8IGRiLT5zcmNfZmFjdG9yOyBpKyspCisJCQltZW1jcHkoZG1hYnVmLCBkbWFzYW1wbGUsIGRiLT5kbWFfYnl0ZXNfcGVyX3NhbXBsZSk7CisKKwkJdXNlcmJ1ZiArPSBkYi0+dXNlcl9ieXRlc19wZXJfc2FtcGxlOworCQlkbWFidWYgKz0gaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7CisJfQorCisJcmV0dXJuIG51bV9zYW1wbGVzICogaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7Cit9CisKKy8qCisgKiBUcmFuc2xhdGVzIEFDJzk3IEFEQyBzYW1wbGVzIHRvIHVzZXIgYnVmZmVyOgorICogICAgIElmIG1vbm8sIHNlbmQgb25seSBsZWZ0IGNoYW5uZWwgdG8gdXNlciBidWZmZXIuCisgKiAgICAgSWYgOCBiaXQgc2FtcGxlcywgY3Z0IGZyb20gMTYgdG8gOCBiaXQgYmVmb3JlIHdyaXRpbmcgdG8gdXNlciBidWZmZXIuCisgKiAgICAgSWYgZGVjaW1hdGluZyAobm8gVlJBKSwgc2tpcCBvdmVyIHNyY19mYWN0b3IgYXVkaW8gZnJhbWVzLgorICovCitzdGF0aWMgaW50IHRyYW5zbGF0ZV90b191c2VyKHN0cnVjdCBkbWFidWYgKmRiLAorCQkJICAgICBjaGFyKiB1c2VyYnVmLAorCQkJICAgICBjaGFyKiBkbWFidWYsCisJCQkgICAgIGludCBkbWFjb3VudCkKK3sKKwlpbnQgICAgICAgICAgICAgc2FtcGxlLCBpOworCWludCAgICAgICAgICAgICBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKwlpbnQgICAgICAgICAgICAgbnVtX3NhbXBsZXM7CisJaW50ICAgICAgICAgICAgIG1vbm8gPSAoZGItPm51bV9jaGFubmVscyA9PSAxKTsKKwljaGFyICAgICAgICAgICAgdXNlcnNhbXBsZVsxMl07CisKKwlpZiAoZGItPnNhbXBsZV9zaXplID09IDE2ICYmICFtb25vICYmIGRiLT5zcmNfZmFjdG9yID09IDEpIHsKKwkJLy8gbm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5LCBqdXN0IGNvcHkKKwkJaWYgKGNvcHlfdG9fdXNlcih1c2VyYnVmLCBkbWFidWYsIGRtYWNvdW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gZG1hY291bnQ7CisJfQorCisJaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGUgPSBkYi0+ZG1hX2J5dGVzX3Blcl9zYW1wbGUgKiBkYi0+c3JjX2ZhY3RvcjsKKwludW1fc2FtcGxlcyA9IGRtYWNvdW50IC8gaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7CisKKwlmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IG51bV9zYW1wbGVzOyBzYW1wbGUrKykgeworCQlmb3IgKGkgPSAwOyBpIDwgZGItPm51bV9jaGFubmVsczsgaSsrKSB7CisJCQlpZiAoZGItPnNhbXBsZV9zaXplID09IDgpCisJCQkJdXNlcnNhbXBsZVtpXSA9CisJCQkJCVMxNl9UT19VOCgqKChzMTYgKikgKCZkbWFidWZbaSAqIDJdKSkpOworCQkJZWxzZQorCQkJCSooKHMxNiAqKSAoJnVzZXJzYW1wbGVbaSAqIDJdKSkgPQorCQkJCQkqKChzMTYgKikgKCZkbWFidWZbaSAqIDJdKSk7CisJCX0KKworCQlpZiAoY29weV90b191c2VyKHVzZXJidWYsIHVzZXJzYW1wbGUsCisJCQkJIGRiLT51c2VyX2J5dGVzX3Blcl9zYW1wbGUpKSB7CisJCQlkYmcoIiVzOiBmYXVsdCIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXVzZXJidWYgKz0gZGItPnVzZXJfYnl0ZXNfcGVyX3NhbXBsZTsKKwkJZG1hYnVmICs9IGludGVycF9ieXRlc19wZXJfc2FtcGxlOworCX0KKworCXJldHVybiBudW1fc2FtcGxlcyAqIGludGVycF9ieXRlc19wZXJfc2FtcGxlOworfQorCisvKgorICogQ29weSBhdWRpbyBkYXRhIHRvL2Zyb20gdXNlciBidWZmZXIgZnJvbS90byBkbWEgYnVmZmVyLCB0YWtpbmcgY2FyZQorICogdGhhdCB3ZSB3cmFwIHdoZW4gcmVhZGluZy93cml0aW5nIHRoZSBkbWEgYnVmZmVyLiBSZXR1cm5zIGFjdHVhbCBieXRlCisgKiBjb3VudCB3cml0dGVuIHRvIG9yIHJlYWQgZnJvbSB0aGUgZG1hIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBjb3B5X2RtYWJ1Zl91c2VyKHN0cnVjdCBkbWFidWYgKmRiLCBjaGFyKiB1c2VyYnVmLAorCQkJICAgIGludCBjb3VudCwgaW50IHRvX3VzZXIpCit7CisJY2hhciAgICAgICAgICAgKmJ1ZnB0ciA9IHRvX3VzZXIgPyBkYi0+bmV4dE91dCA6IGRiLT5uZXh0SW47CisJY2hhciAgICAgICAgICAgKmJ1ZmVuZCA9IGRiLT5yYXdidWYgKyBkYi0+ZG1hc2l6ZTsKKwlpbnQgICAgICAgICAgICAgY250LCByZXQ7CisKKwlpZiAoYnVmcHRyICsgY291bnQgPiBidWZlbmQpIHsKKwkJaW50ICAgICAgICAgICAgIHBhcnRpYWwgPSAoaW50KSAoYnVmZW5kIC0gYnVmcHRyKTsKKwkJaWYgKHRvX3VzZXIpIHsKKwkJCWlmICgoY250ID0gdHJhbnNsYXRlX3RvX3VzZXIoZGIsIHVzZXJidWYsCisJCQkJCQkgICAgIGJ1ZnB0ciwgcGFydGlhbCkpIDwgMCkKKwkJCQlyZXR1cm4gY250OworCQkJcmV0ID0gY250OworCQkJaWYgKChjbnQgPSB0cmFuc2xhdGVfdG9fdXNlcihkYiwgdXNlcmJ1ZiArIHBhcnRpYWwsCisJCQkJCQkgICAgIGRiLT5yYXdidWYsCisJCQkJCQkgICAgIGNvdW50IC0gcGFydGlhbCkpIDwgMCkKKwkJCQlyZXR1cm4gY250OworCQkJcmV0ICs9IGNudDsKKwkJfSBlbHNlIHsKKwkJCWlmICgoY250ID0gdHJhbnNsYXRlX2Zyb21fdXNlcihkYiwgYnVmcHRyLCB1c2VyYnVmLAorCQkJCQkJICAgICAgIHBhcnRpYWwpKSA8IDApCisJCQkJcmV0dXJuIGNudDsKKwkJCXJldCA9IGNudDsKKwkJCWlmICgoY250ID0gdHJhbnNsYXRlX2Zyb21fdXNlcihkYiwgZGItPnJhd2J1ZiwKKwkJCQkJCSAgICAgICB1c2VyYnVmICsgcGFydGlhbCwKKwkJCQkJCSAgICAgICBjb3VudCAtIHBhcnRpYWwpKSA8IDApCisJCQkJcmV0dXJuIGNudDsKKwkJCXJldCArPSBjbnQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodG9fdXNlcikKKwkJCXJldCA9IHRyYW5zbGF0ZV90b191c2VyKGRiLCB1c2VyYnVmLCBidWZwdHIsIGNvdW50KTsKKwkJZWxzZQorCQkJcmV0ID0gdHJhbnNsYXRlX2Zyb21fdXNlcihkYiwgYnVmcHRyLCB1c2VyYnVmLCBjb3VudCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdTEwMDBfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmZmVyLAorCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfYWRjOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgICAgICAgICByZXQ7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCWludCAgICAgICAgICAgICBjbnQsIHVzZXJjbnQsIGF2YWlsOworCisJaWYgKGRiLT5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKworCWNvdW50ICo9IGRiLT5jbnRfZmFjdG9yOworCisJZG93bigmcy0+c2VtKTsKKwlhZGRfd2FpdF9xdWV1ZSgmZGItPndhaXQsICZ3YWl0KTsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLy8gd2FpdCBmb3Igc2FtcGxlcyBpbiBBREMgZG1hIGJ1ZmZlcgorCQlkbyB7CisJCQlpZiAoZGItPnN0b3BwZWQpCisJCQkJc3RhcnRfYWRjKHMpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWF2YWlsID0gZGItPmNvdW50OworCQkJaWYgKGF2YWlsIDw9IDApCisJCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGF2YWlsIDw9IDApIHsKKwkJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJdXAoJnMtPnNlbSk7CisJCQkJc2NoZWR1bGUoKTsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJCWdvdG8gb3V0MjsKKwkJCQl9CisJCQkJZG93bigmcy0+c2VtKTsKKwkJCX0KKwkJfSB3aGlsZSAoYXZhaWwgPD0gMCk7CisKKwkJLy8gY29weSBmcm9tIG5leHRPdXQgdG8gdXNlcgorCQlpZiAoKGNudCA9IGNvcHlfZG1hYnVmX3VzZXIoZGIsIGJ1ZmZlciwKKwkJCQkJICAgIGNvdW50ID4gYXZhaWwgPworCQkJCQkgICAgYXZhaWwgOiBjb3VudCwgMSkpIDwgMCkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZGItPmNvdW50IC09IGNudDsKKwkJZGItPm5leHRPdXQgKz0gY250OworCQlpZiAoZGItPm5leHRPdXQgPj0gZGItPnJhd2J1ZiArIGRiLT5kbWFzaXplKQorCQkJZGItPm5leHRPdXQgLT0gZGItPmRtYXNpemU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCQljb3VudCAtPSBjbnQ7CisJCXVzZXJjbnQgPSBjbnQgLyBkYi0+Y250X2ZhY3RvcjsKKwkJYnVmZmVyICs9IHVzZXJjbnQ7CisJCXJldCArPSB1c2VyY250OworCX0JCQkvLyB3aGlsZSAoY291bnQgPiAwKQorCitvdXQ6CisJdXAoJnMtPnNlbSk7CitvdXQyOgorCXJlbW92ZV93YWl0X3F1ZXVlKCZkYi0+d2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgYXUxMDAwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJICAgICAJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfZGFjOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgICAgICAgICByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlpbnQgICAgICAgICAgICAgY250LCB1c2VyY250LCBhdmFpbDsKKworI2lmZGVmIEFVMTAwMF9WRVJCT1NFX0RFQlVHCisJZGJnKCJ3cml0ZTogY291bnQ9JWQiLCBjb3VudCk7CisjZW5kaWYKKworCWlmIChkYi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljb3VudCAqPSBkYi0+Y250X2ZhY3RvcjsKKworCWRvd24oJnMtPnNlbSk7CQorCWFkZF93YWl0X3F1ZXVlKCZkYi0+d2FpdCwgJndhaXQpOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkvLyB3YWl0IGZvciBzcGFjZSBpbiBwbGF5YmFjayBidWZmZXIKKwkJZG8geworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWF2YWlsID0gKGludCkgZGItPmRtYXNpemUgLSBkYi0+Y291bnQ7CisJCQlpZiAoYXZhaWwgPD0gMCkKKwkJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoYXZhaWwgPD0gMCkgeworCQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQl1cCgmcy0+c2VtKTsKKwkJCQlzY2hlZHVsZSgpOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQkJZ290byBvdXQyOworCQkJCX0KKwkJCQlkb3duKCZzLT5zZW0pOworCQkJfQorCQl9IHdoaWxlIChhdmFpbCA8PSAwKTsKKworCQkvLyBjb3B5IGZyb20gdXNlciB0byBuZXh0SW4KKwkJaWYgKChjbnQgPSBjb3B5X2RtYWJ1Zl91c2VyKGRiLCAoY2hhciAqKSBidWZmZXIsCisJCQkJCSAgICBjb3VudCA+IGF2YWlsID8KKwkJCQkJICAgIGF2YWlsIDogY291bnQsIDApKSA8IDApIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWRiLT5jb3VudCArPSBjbnQ7CisJCWRiLT5uZXh0SW4gKz0gY250OworCQlpZiAoZGItPm5leHRJbiA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQlkYi0+bmV4dEluIC09IGRiLT5kbWFzaXplOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChkYi0+c3RvcHBlZCkKKwkJCXN0YXJ0X2RhYyhzKTsKKworCQljb3VudCAtPSBjbnQ7CisJCXVzZXJjbnQgPSBjbnQgLyBkYi0+Y250X2ZhY3RvcjsKKwkJYnVmZmVyICs9IHVzZXJjbnQ7CisJCXJldCArPSB1c2VyY250OworCX0JCQkvLyB3aGlsZSAoY291bnQgPiAwKQorCitvdXQ6CisJdXAoJnMtPnNlbSk7CitvdXQyOgorCXJlbW92ZV93YWl0X3F1ZXVlKCZkYi0+d2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCBhdTEwMDBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1bnNpZ25lZCBpbnQgICAgbWFzayA9IDA7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5KQorCQkJcmV0dXJuIDA7CisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2RhYy53YWl0LCB3YWl0KTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5KQorCQkJcmV0dXJuIDA7CisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2FkYy53YWl0LCB3YWl0KTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5kbWFfZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49CisJCQkgICAgKHNpZ25lZClzLT5kbWFfZGFjLmRtYV9mcmFnc2l6ZSkgCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2lnbmVkKSBzLT5kbWFfZGFjLmRtYXNpemUgPj0KKwkJCSAgICBzLT5kbWFfZGFjLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjLmRtYV9mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBhdTEwMDBfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgICpkYjsKKwl1bnNpZ25lZCBsb25nICAgc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWRiZyhfX0ZVTkNUSU9OX18pOworICAgIAorCWxvY2tfa2VybmVsKCk7CisJZG93bigmcy0+c2VtKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQorCQlkYiA9ICZzLT5kbWFfZGFjOworCWVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKQorCQlkYiA9ICZzLT5kbWFfYWRjOworCWVsc2UgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZpcnRfdG9fcGh5cyhkYi0+cmF3YnVmKSwKKwkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKwl2bWEtPnZtX2ZsYWdzICY9IH5WTV9JTzsKKwlkYi0+bWFwcGVkID0gMTsKK291dDoKKwl1cCgmcy0+c2VtKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworCisjaWZkZWYgQVUxMDAwX1ZFUkJPU0VfREVCVUcKK3N0YXRpYyBzdHJ1Y3QgaW9jdGxfc3RyX3QgeworCXVuc2lnbmVkIGludCAgICBjbWQ7CisJY29uc3QgY2hhciAgICAgKnN0cjsKK30gaW9jdGxfc3RyW10gPSB7CisJe1NORENUTF9EU1BfUkVTRVQsICJTTkRDVExfRFNQX1JFU0VUIn0sCisJe1NORENUTF9EU1BfU1lOQywgIlNORENUTF9EU1BfU1lOQyJ9LAorCXtTTkRDVExfRFNQX1NQRUVELCAiU05EQ1RMX0RTUF9TUEVFRCJ9LAorCXtTTkRDVExfRFNQX1NURVJFTywgIlNORENUTF9EU1BfU1RFUkVPIn0sCisJe1NORENUTF9EU1BfR0VUQkxLU0laRSwgIlNORENUTF9EU1BfR0VUQkxLU0laRSJ9LAorCXtTTkRDVExfRFNQX1NBTVBMRVNJWkUsICJTTkRDVExfRFNQX1NBTVBMRVNJWkUifSwKKwl7U05EQ1RMX0RTUF9DSEFOTkVMUywgIlNORENUTF9EU1BfQ0hBTk5FTFMifSwKKwl7U09VTkRfUENNX1dSSVRFX0NIQU5ORUxTLCAiU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTIn0sCisJe1NPVU5EX1BDTV9XUklURV9GSUxURVIsICJTT1VORF9QQ01fV1JJVEVfRklMVEVSIn0sCisJe1NORENUTF9EU1BfUE9TVCwgIlNORENUTF9EU1BfUE9TVCJ9LAorCXtTTkRDVExfRFNQX1NVQkRJVklERSwgIlNORENUTF9EU1BfU1VCRElWSURFIn0sCisJe1NORENUTF9EU1BfU0VURlJBR01FTlQsICJTTkRDVExfRFNQX1NFVEZSQUdNRU5UIn0sCisJe1NORENUTF9EU1BfR0VURk1UUywgIlNORENUTF9EU1BfR0VURk1UUyJ9LAorCXtTTkRDVExfRFNQX1NFVEZNVCwgIlNORENUTF9EU1BfU0VURk1UIn0sCisJe1NORENUTF9EU1BfR0VUT1NQQUNFLCAiU05EQ1RMX0RTUF9HRVRPU1BBQ0UifSwKKwl7U05EQ1RMX0RTUF9HRVRJU1BBQ0UsICJTTkRDVExfRFNQX0dFVElTUEFDRSJ9LAorCXtTTkRDVExfRFNQX05PTkJMT0NLLCAiU05EQ1RMX0RTUF9OT05CTE9DSyJ9LAorCXtTTkRDVExfRFNQX0dFVENBUFMsICJTTkRDVExfRFNQX0dFVENBUFMifSwKKwl7U05EQ1RMX0RTUF9HRVRUUklHR0VSLCAiU05EQ1RMX0RTUF9HRVRUUklHR0VSIn0sCisJe1NORENUTF9EU1BfU0VUVFJJR0dFUiwgIlNORENUTF9EU1BfU0VUVFJJR0dFUiJ9LAorCXtTTkRDVExfRFNQX0dFVElQVFIsICJTTkRDVExfRFNQX0dFVElQVFIifSwKKwl7U05EQ1RMX0RTUF9HRVRPUFRSLCAiU05EQ1RMX0RTUF9HRVRPUFRSIn0sCisJe1NORENUTF9EU1BfTUFQSU5CVUYsICJTTkRDVExfRFNQX01BUElOQlVGIn0sCisJe1NORENUTF9EU1BfTUFQT1VUQlVGLCAiU05EQ1RMX0RTUF9NQVBPVVRCVUYifSwKKwl7U05EQ1RMX0RTUF9TRVRTWU5DUk8sICJTTkRDVExfRFNQX1NFVFNZTkNSTyJ9LAorCXtTTkRDVExfRFNQX1NFVERVUExFWCwgIlNORENUTF9EU1BfU0VURFVQTEVYIn0sCisJe1NORENUTF9EU1BfR0VUT0RFTEFZLCAiU05EQ1RMX0RTUF9HRVRPREVMQVkifSwKKwl7U05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSywgIlNORENUTF9EU1BfR0VUQ0hBTk5FTE1BU0sifSwKKwl7U05EQ1RMX0RTUF9CSU5EX0NIQU5ORUwsICJTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTCJ9LAorCXtPU1NfR0VUVkVSU0lPTiwgIk9TU19HRVRWRVJTSU9OIn0sCisJe1NPVU5EX1BDTV9SRUFEX1JBVEUsICJTT1VORF9QQ01fUkVBRF9SQVRFIn0sCisJe1NPVU5EX1BDTV9SRUFEX0NIQU5ORUxTLCAiU09VTkRfUENNX1JFQURfQ0hBTk5FTFMifSwKKwl7U09VTkRfUENNX1JFQURfQklUUywgIlNPVU5EX1BDTV9SRUFEX0JJVFMifSwKKwl7U09VTkRfUENNX1JFQURfRklMVEVSLCAiU09VTkRfUENNX1JFQURfRklMVEVSIn0KK307CisjZW5kaWYKKworLy8gTmVlZCB0byBob2xkIGEgc3Bpbi1sb2NrIGJlZm9yZSBjYWxsaW5nIHRoaXMhCitzdGF0aWMgaW50IGRtYV9jb3VudF9kb25lKHN0cnVjdCBkbWFidWYgKmRiKQoreworCWlmIChkYi0+c3RvcHBlZCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gZGItPmRtYV9mcmFnc2l6ZSAtIGdldF9kbWFfcmVzaWR1ZShkYi0+ZG1hbnIpOworfQorCisKK3N0YXRpYyBpbnQgYXUxMDAwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxMDAwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlhdWRpb19idWZfaW5mbyAgYWJpbmZvOworCWNvdW50X2luZm8gICAgICBjaW5mbzsKKwlpbnQgICAgICAgICAgICAgY291bnQ7CisJaW50ICAgICAgICAgICAgIHZhbCwgbWFwcGVkLCByZXQsIGRpZmY7CisKKwltYXBwZWQgPSAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiBzLT5kbWFfZGFjLm1hcHBlZCkgfHwKKwkJKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiBzLT5kbWFfYWRjLm1hcHBlZCk7CisKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWZvciAoY291bnQ9MDsgY291bnQ8c2l6ZW9mKGlvY3RsX3N0cikvc2l6ZW9mKGlvY3RsX3N0clswXSk7IGNvdW50KyspIHsKKwkJaWYgKGlvY3RsX3N0cltjb3VudF0uY21kID09IGNtZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoY291bnQgPCBzaXplb2YoaW9jdGxfc3RyKSAvIHNpemVvZihpb2N0bF9zdHJbMF0pKQorCQlkYmcoImlvY3RsICVzLCBhcmc9MHglbHgiLCBpb2N0bF9zdHJbY291bnRdLnN0ciwgYXJnKTsKKwllbHNlCisJCWRiZygiaW9jdGwgMHgleCB1bmtub3duLCBhcmc9MHglbHgiLCBjbWQsIGFyZyk7CisjZW5kaWYKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gZHJhaW5fZGFjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwKKwkJCQlEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJc3luY2hyb25pemVfaXJxKCk7CisJCQlzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9IDA7CisJCQlzLT5kbWFfZGFjLm5leHRJbiA9IHMtPmRtYV9kYWMubmV4dE91dCA9CisJCQkJcy0+ZG1hX2RhYy5yYXdidWY7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3luY2hyb25pemVfaXJxKCk7CisJCQlzLT5kbWFfYWRjLmNvdW50ID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9IDA7CisJCQlzLT5kbWFfYWRjLm5leHRJbiA9IHMtPmRtYV9hZGMubmV4dE91dCA9CisJCQkJcy0+ZG1hX2FkYy5yYXdidWY7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJc2V0X2FkY19yYXRlKHMsIHZhbCk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzZXRfZGFjX3JhdGUocywgdmFsKTsKKwkJCX0KKwkJCWlmIChzLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCWlmIChzLT5vcGVuX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/CisJCQkJcy0+ZG1hX2FkYy5zYW1wbGVfcmF0ZSA6CisJCQkJcy0+ZG1hX2RhYy5zYW1wbGVfcmF0ZSwKKwkJCQkoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzLT5kbWFfYWRjLm51bV9jaGFubmVscyA9IHZhbCA/IDIgOiAxOworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXMtPmRtYV9kYWMubnVtX2NoYW5uZWxzID0gdmFsID8gMiA6IDE7CisJCQlpZiAocy0+Y29kZWNfZXh0X2NhcHMgJiBBQzk3X0VYVF9EQUNTKSB7CisJCQkJLy8gZGlzYWJsZSBzdXJyb3VuZCBhbmQgY2VudGVyL2xmZSBpbiBBQyc5NworCQkJCXUxNiBleHRfc3RhdCA9IHJkY29kZWMoJnMtPmNvZGVjLAorCQkJCQkJICAgICAgIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJCQl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCQkJCWV4dF9zdGF0IHwgKEFDOTdfRVhUU1RBVF9QUkkgfAorCQkJCQkJICAgIEFDOTdfRVhUU1RBVF9QUkogfAorCQkJCQkJICAgIEFDOTdfRVhUU1RBVF9QUkspKTsKKwkJCX0KKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCWlmICh2YWwgPCAwIHx8IHZhbCA+IDIpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMubnVtX2NoYW5uZWxzID0gdmFsOworCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN3aXRjaCAodmFsKSB7CisJCQkJY2FzZSAxOgorCQkJCWNhc2UgMjoKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAzOgorCQkJCWNhc2UgNToKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJY2FzZSA0OgorCQkJCQlpZiAoIShzLT5jb2RlY19leHRfY2FwcyAmCisJCQkJCSAgICAgIEFDOTdfRVhUSURfU0RBQykpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA2OgorCQkJCQlpZiAoKHMtPmNvZGVjX2V4dF9jYXBzICYKKwkJCQkJICAgICBBQzk3X0VYVF9EQUNTKSAhPSBBQzk3X0VYVF9EQUNTKQorCQkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCXN0b3BfZGFjKHMpOworCQkJCWlmICh2YWwgPD0gMiAmJgorCQkJCSAgICAocy0+Y29kZWNfZXh0X2NhcHMgJiBBQzk3X0VYVF9EQUNTKSkgeworCQkJCQkvLyBkaXNhYmxlIHN1cnJvdW5kIGFuZCBjZW50ZXIvbGZlCisJCQkJCS8vIGNoYW5uZWxzIGluIEFDJzk3CisJCQkJCXUxNiAgICAgICAgICAgICBleHRfc3RhdCA9CisJCQkJCQlyZGNvZGVjKCZzLT5jb2RlYywKKwkJCQkJCQlBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJCQkJCXdyY29kZWMoJnMtPmNvZGVjLAorCQkJCQkJQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCQkJCQlleHRfc3RhdCB8IChBQzk3X0VYVFNUQVRfUFJJIHwKKwkJCQkJCQkgICAgQUM5N19FWFRTVEFUX1BSSiB8CisJCQkJCQkJICAgIEFDOTdfRVhUU1RBVF9QUkspKTsKKwkJCQl9IGVsc2UgaWYgKHZhbCA+PSA0KSB7CisJCQkJCS8vIGVuYWJsZSBzdXJyb3VuZCwgY2VudGVyL2xmZQorCQkJCQkvLyBjaGFubmVscyBpbiBBQyc5NworCQkJCQl1MTYgICAgICAgICAgICAgZXh0X3N0YXQgPQorCQkJCQkJcmRjb2RlYygmcy0+Y29kZWMsCisJCQkJCQkJQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCQkJCQlleHRfc3RhdCAmPSB+QUM5N19FWFRTVEFUX1BSSjsKKwkJCQkJaWYgKHZhbCA9PSA2KQorCQkJCQkJZXh0X3N0YXQgJj0KKwkJCQkJCQl+KEFDOTdfRVhUU1RBVF9QUkkgfAorCQkJCQkJCSAgQUM5N19FWFRTVEFUX1BSSyk7CisJCQkJCXdyY29kZWMoJnMtPmNvZGVjLAorCQkJCQkJQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCQkJCQlleHRfc3RhdCk7CisJCQkJfQorCisJCQkJcy0+ZG1hX2RhYy5udW1fY2hhbm5lbHMgPSB2YWw7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgkvKiBSZXR1cm5zIGEgbWFzayAqLworCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEUgfCBBRk1UX1U4LCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOgkvKiBTZWxlY3RzIE9ORSBmbXQgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5kbWFfYWRjLnNhbXBsZV9zaXplID0gMTY7CisJCQkJZWxzZSB7CisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJCXMtPmRtYV9hZGMuc2FtcGxlX3NpemUgPSA4OworCQkJCX0KKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5kbWFfZGFjLnNhbXBsZV9zaXplID0gMTY7CisJCQkJZWxzZSB7CisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJCXMtPmRtYV9kYWMuc2FtcGxlX3NpemUgPSA4OworCQkJCX0KKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQl2YWwgPSAocy0+ZG1hX2FkYy5zYW1wbGVfc2l6ZSA9PSAxNikgPworCQkJCQlBRk1UX1MxNl9MRSA6IEFGTVRfVTg7CisJCQllbHNlCisJCQkJdmFsID0gKHMtPmRtYV9kYWMuc2FtcGxlX3NpemUgPT0gMTYpID8KKwkJCQkJQUZNVF9TMTZfTEUgOiBBRk1UX1U4OworCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiAhcy0+ZG1hX2FkYy5zdG9wcGVkKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiAhcy0+ZG1hX2RhYy5zdG9wcGVkKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCWVsc2UKKwkJCQlzdG9wX2FkYyhzKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkKKwkJCQlzdGFydF9kYWMocyk7CisJCQllbHNlCisJCQkJc3RvcF9kYWMocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQljb3VudCAtPSBkbWFfY291bnRfZG9uZSgmcy0+ZG1hX2RhYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJYWJpbmZvLmJ5dGVzID0gKHMtPmRtYV9kYWMuZG1hc2l6ZSAtIGNvdW50KSAvCisJCQlzLT5kbWFfZGFjLmNudF9mYWN0b3I7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYy5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworI2lmZGVmIEFVMTAwMF9WRVJCT1NFX0RFQlVHCisJCWRiZygiYnl0ZXM9JWQsIGZyYWdtZW50cz0lZCIsIGFiaW5mby5ieXRlcywgYWJpbmZvLmZyYWdtZW50cyk7CisjZW5kaWYKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhYmluZm8sCisJCQkJICAgIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQljb3VudCArPSBkbWFfY291bnRfZG9uZSgmcy0+ZG1hX2FkYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJYWJpbmZvLmJ5dGVzID0gY291bnQgLyBzLT5kbWFfYWRjLmNudF9mYWN0b3I7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmFiaW5mbywKKwkJCQkgICAgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQljb3VudCAtPSBkbWFfY291bnRfZG9uZSgmcy0+ZG1hX2RhYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJY291bnQgLz0gcy0+ZG1hX2RhYy5jbnRfZmFjdG9yOworCQlyZXR1cm4gcHV0X3VzZXIoY291bnQsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljaW5mby5ieXRlcyA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXM7CisJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJaWYgKCFzLT5kbWFfYWRjLnN0b3BwZWQpIHsKKwkJCWRpZmYgPSBkbWFfY291bnRfZG9uZSgmcy0+ZG1hX2FkYyk7CisJCQljb3VudCArPSBkaWZmOworCQkJY2luZm8uYnl0ZXMgKz0gZGlmZjsKKwkJCWNpbmZvLnB0ciA9ICB2aXJ0X3RvX3BoeXMocy0+ZG1hX2FkYy5uZXh0SW4pICsgZGlmZiAtCisJCQkJcy0+ZG1hX2FkYy5kbWFhZGRyOworCQl9IGVsc2UKKwkJCWNpbmZvLnB0ciA9IHZpcnRfdG9fcGh5cyhzLT5kbWFfYWRjLm5leHRJbikgLQorCQkJCXMtPmRtYV9hZGMuZG1hYWRkcjsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSAocy0+ZG1hX2FkYy5kbWFfZnJhZ3NpemUtMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY2luZm8sIHNpemVvZihjaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9kYWMuY291bnQ7CisJCWlmICghcy0+ZG1hX2RhYy5zdG9wcGVkKSB7CisJCQlkaWZmID0gZG1hX2NvdW50X2RvbmUoJnMtPmRtYV9kYWMpOworCQkJY291bnQgLT0gZGlmZjsKKwkJCWNpbmZvLmJ5dGVzICs9IGRpZmY7CisJCQljaW5mby5wdHIgPSB2aXJ0X3RvX3BoeXMocy0+ZG1hX2RhYy5uZXh0T3V0KSArIGRpZmYgLQorCQkJCXMtPmRtYV9kYWMuZG1hYWRkcjsKKwkJfSBlbHNlCisJCQljaW5mby5wdHIgPSB2aXJ0X3RvX3BoeXMocy0+ZG1hX2RhYy5uZXh0T3V0KSAtCisJCQkJcy0+ZG1hX2RhYy5kbWFhZGRyOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCQlzLT5kbWFfZGFjLmNvdW50ICY9IChzLT5kbWFfZGFjLmRtYV9mcmFnc2l6ZS0xKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworCQljaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgKGludCAqKSBhcmcpOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IDQ7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9IDQ7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKSB8fAorCQkgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMocyk7CisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gdmFsOworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPworCQkJCXMtPmRtYV9hZGMuc2FtcGxlX3JhdGUgOgorCQkJCXMtPmRtYV9kYWMuc2FtcGxlX3JhdGUsCisJCQkJKGludCAqKWFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLm51bV9jaGFubmVscywgKGludCAqKWFyZyk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfZGFjLm51bV9jaGFubmVscywgKGludCAqKWFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9hZGMuc2FtcGxlX3NpemUsIChpbnQgKilhcmcpOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5zYW1wbGVfc2l6ZSwgKGludCAqKWFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIG1peGRldl9pb2N0bCgmcy0+Y29kZWMsIGNtZCwgYXJnKTsKK30KKworCitzdGF0aWMgaW50ICBhdTEwMDBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgICAgICAgICAgICAgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBhdTEwMDBfc3RhdGUgKnMgPSAmYXUxMDAwX3N0YXRlOworCWludCAgICAgICAgICAgICByZXQ7CisKKyNpZmRlZiBBVTEwMDBfVkVSQk9TRV9ERUJVRworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJZGJnKCIlczogbm9uLWJsb2NraW5nIiwgX19GVU5DVElPTl9fKTsKKwllbHNlCisJCWRiZygiJXM6IGJsb2NraW5nIiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorCQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBmaWxlLT5mX21vZGUpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCisJc3RvcF9kYWMocyk7CisJc3RvcF9hZGMocyk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPSAwOworCQlzLT5kbWFfYWRjLm51bV9jaGFubmVscyA9IDE7CisJCXMtPmRtYV9hZGMuc2FtcGxlX3NpemUgPSA4OworCQlzZXRfYWRjX3JhdGUocywgODAwMCk7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlzLT5kbWFfYWRjLnNhbXBsZV9zaXplID0gMTY7CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9CisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9IDA7CisJCXMtPmRtYV9kYWMubnVtX2NoYW5uZWxzID0gMTsKKwkJcy0+ZG1hX2RhYy5zYW1wbGVfc2l6ZSA9IDg7CisJCXNldF9kYWNfcmF0ZShzLCA4MDAwKTsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCXMtPmRtYV9kYWMuc2FtcGxlX3NpemUgPSAxNjsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQlyZXR1cm4gcmV0OworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwlzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlpbml0X01VVEVYKCZzLT5zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBhdTEwMDBfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzID0gKHN0cnVjdCBhdTEwMDBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlsb2NrX2tlcm5lbCgpOworCQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCWRyYWluX2RhYyhzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJCWxvY2tfa2VybmVsKCk7CisJfQorCisJZG93bigmcy0+b3Blbl9zZW0pOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdG9wX2RhYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9kYWMpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdG9wX2FkYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9hZGMpOworCX0KKwlzLT5vcGVuX21vZGUgJj0gKCh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdTEwMDBfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBhdTEwMDBfbGxzZWVrLAorCS5yZWFkCQk9IGF1MTAwMF9yZWFkLAorCS53cml0ZQkJPSBhdTEwMDBfd3JpdGUsCisJLnBvbGwJCT0gYXUxMDAwX3BvbGwsCisJLmlvY3RsCQk9IGF1MTAwMF9pb2N0bCwKKwkubW1hcAkJPSBhdTEwMDBfbW1hcCwKKwkub3BlbgkJPSBhdTEwMDBfb3BlbiwKKwkucmVsZWFzZQk9IGF1MTAwMF9yZWxlYXNlLAorfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHdlJ2xsIGNyZWF0ZSBhIHByb2MgZGV2aWNlIHRoYXQgZHVtcHMgdGhlCisgKiBDT0RFQyBjaGlwc3RhdGUKKyAqLworCisjaWZkZWYgQVUxMDAwX0RFQlVHCitzdGF0aWMgaW50IHByb2NfYXUxMDAwX2R1bXAoY2hhciAqYnVmLCBjaGFyICoqc3RhcnQsIG9mZl90IGZwb3MsCisJCQkgICAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9ICZhdTEwMDBfc3RhdGU7CisJaW50ICAgICAgICAgICAgIGNudCwgbGVuID0gMDsKKworCS8qIHByaW50IG91dCBoZWFkZXIgKi8KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcblx0XHRBVTEwMDAgQXVkaW8gRGVidWdcblxuIik7CisKKwkvLyBwcmludCBvdXQgZGlnaXRhbCBjb250cm9sbGVyIHN0YXRlCisJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAiQVUxMDAwIEF1ZGlvIENvbnRyb2xsZXIgcmVnaXN0ZXJzXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJBQzk3Q19DT05GSUcgPSAlMDh4XG4iLAorCQkJYXVfcmVhZGwoQUM5N0NfQ09ORklHKSk7CisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgIkFDOTdDX1NUQVRVUyA9ICUwOHhcbiIsCisJCQlhdV9yZWFkbChBQzk3Q19TVEFUVVMpKTsKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiQUM5N0NfQ05UUkwgID0gJTA4eFxuIiwKKwkJCWF1X3JlYWRsKEFDOTdDX0NOVFJMKSk7CisKKwkvKiBwcmludCBvdXQgQ09ERUMgc3RhdGUgKi8KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcbkFDOTcgQ09ERUMgcmVnaXN0ZXJzXG4iKTsKKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8PSAweDdlOyBjbnQgKz0gMikKKwkJbGVuICs9IHNwcmludGYoYnVmICsgbGVuLCAicmVnICUwMnggPSAlMDR4XG4iLAorCQkJICAgICAgIGNudCwgcmRjb2RlYygmcy0+Y29kZWMsIGNudCkpOworCisJaWYgKGZwb3MgPj0gbGVuKSB7CisJCSpzdGFydCA9IGJ1ZjsKKwkJKmVvZiA9IDE7CisJCXJldHVybiAwOworCX0KKwkqc3RhcnQgPSBidWYgKyBmcG9zOworCWlmICgobGVuIC09IGZwb3MpID4gbGVuZ3RoKQorCQlyZXR1cm4gbGVuZ3RoOworCSplb2YgPSAxOworCXJldHVybiBsZW47CisKK30KKyNlbmRpZiAvKiBBVTEwMDBfREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK01PRFVMRV9BVVRIT1IoIk1vbnRhIFZpc3RhIFNvZnR3YXJlLCBzdGV2ZWxAbXZpc3RhLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTEwMDAgQXVkaW8gRHJpdmVyIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBhdTEwMDBfcHJvYmUodm9pZCkKK3sKKwlzdHJ1Y3QgYXUxMDAwX3N0YXRlICpzID0gJmF1MTAwMF9zdGF0ZTsKKwlpbnQgICAgICAgICAgICAgdmFsOworI2lmZGVmIEFVMTAwMF9ERUJVRworCWNoYXIgICAgICAgICAgICBwcm9jX3N0cls4MF07CisjZW5kaWYKKworCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IGF1MTAwMF9zdGF0ZSkpOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5jb2RlYy5wcml2YXRlX2RhdGEgPSBzOworCXMtPmNvZGVjLmlkID0gMDsKKwlzLT5jb2RlYy5jb2RlY19yZWFkID0gcmRjb2RlYzsKKwlzLT5jb2RlYy5jb2RlY193cml0ZSA9IHdyY29kZWM7CisJcy0+Y29kZWMuY29kZWNfd2FpdCA9IHdhaXRjb2RlYzsKKworCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uKENQSFlTQUREUihBQzk3Q19DT05GSUcpLAorCQkJICAgIDB4MTQsIEFVMTAwMF9NT0RVTEVfTkFNRSkpIHsKKwkJZXJyKCJBQyc5NyBwb3J0cyBpbiB1c2UiKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvLyBBbGxvY2F0ZSB0aGUgRE1BIENoYW5uZWxzCisJaWYgKChzLT5kbWFfZGFjLmRtYW5yID0gcmVxdWVzdF9hdTEwMDBfZG1hKERNQV9JRF9BQzk3Q19UWCwKKwkJCQkJCSAgICJhdWRpbyBEQUMiLAorCQkJCQkJICAgZGFjX2RtYV9pbnRlcnJ1cHQsCisJCQkJCQkgICBTQV9JTlRFUlJVUFQsIHMpKSA8IDApIHsKKwkJZXJyKCJDYW4ndCBnZXQgREFDIERNQSIpOworCQlnb3RvIGVycl9kbWExOworCX0KKwlpZiAoKHMtPmRtYV9hZGMuZG1hbnIgPSByZXF1ZXN0X2F1MTAwMF9kbWEoRE1BX0lEX0FDOTdDX1JYLAorCQkJCQkJICAgImF1ZGlvIEFEQyIsCisJCQkJCQkgICBhZGNfZG1hX2ludGVycnVwdCwKKwkJCQkJCSAgIFNBX0lOVEVSUlVQVCwgcykpIDwgMCkgeworCQllcnIoIkNhbid0IGdldCBBREMgRE1BIik7CisJCWdvdG8gZXJyX2RtYTI7CisJfQorCisJaW5mbygiREFDOiBETUElZC9JUlElZCwgQURDOiBETUElZC9JUlElZCIsCisJICAgICBzLT5kbWFfZGFjLmRtYW5yLCBnZXRfZG1hX2RvbmVfaXJxKHMtPmRtYV9kYWMuZG1hbnIpLAorCSAgICAgcy0+ZG1hX2FkYy5kbWFuciwgZ2V0X2RtYV9kb25lX2lycShzLT5kbWFfYWRjLmRtYW5yKSk7CisKKwkvLyBlbmFibGUgRE1BIGNvaGVyZW5jeSBpbiByZWFkL3dyaXRlIERNQSBjaGFubmVscworCXNldF9kbWFfbW9kZShzLT5kbWFfZGFjLmRtYW5yLAorCQkgICAgIGdldF9kbWFfbW9kZShzLT5kbWFfZGFjLmRtYW5yKSAmIH5ETUFfTkMpOworCXNldF9kbWFfbW9kZShzLT5kbWFfYWRjLmRtYW5yLAorCQkgICAgIGdldF9kbWFfbW9kZShzLT5kbWFfYWRjLmRtYW5yKSAmIH5ETUFfTkMpOworCisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCisJaWYgKChzLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmF1MTAwMF9hdWRpb19mb3BzLCAtMSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MTsKKwlpZiAoKHMtPmNvZGVjLmRldl9taXhlciA9CisJICAgICByZWdpc3Rlcl9zb3VuZF9taXhlcigmYXUxMDAwX21peGVyX2ZvcHMsIC0xKSkgPCAwKQorCQlnb3RvIGVycl9kZXYyOworCisjaWZkZWYgQVUxMDAwX0RFQlVHCisJLyogaW50aWFsaXplIHRoZSBkZWJ1ZyBwcm9jIGRldmljZSAqLworCXMtPnBzID0gY3JlYXRlX3Byb2NfcmVhZF9lbnRyeShBVTEwMDBfTU9EVUxFX05BTUUsIDAsIE5VTEwsCisJCQkJICAgICAgIHByb2NfYXUxMDAwX2R1bXAsIE5VTEwpOworI2VuZGlmIC8qIEFVMTAwMF9ERUJVRyAqLworCisJLy8gY29uZmlndXJlIHBpbnMgZm9yIEFDJzk3CisJYXVfd3JpdGVsKGF1X3JlYWRsKFNZU19QSU5GVU5DKSAmIH4weDAyLCBTWVNfUElORlVOQyk7CisKKwkvLyBBc3NlcnQgcmVzZXQgZm9yIDEwbXNlYyB0byB0aGUgQUMnOTcgY29udHJvbGxlciwgYW5kIGVuYWJsZSBjbG9jaworCWF1X3dyaXRlbChBQzk3Q19SUyB8IEFDOTdDX0NFLCBBQzk3Q19DTlRSTCk7CisJYXUxMDAwX2RlbGF5KDEwKTsKKwlhdV93cml0ZWwoQUM5N0NfQ0UsIEFDOTdDX0NOVFJMKTsKKwlhdTEwMDBfZGVsYXkoMTApOwkvLyB3YWl0IGZvciBjbG9jayB0byBzdGFiaWxpemUKKworCS8qIGNvbGQgcmVzZXQgdGhlIEFDJzk3ICovCisJYXVfd3JpdGVsKEFDOTdDX1JFU0VULCBBQzk3Q19DT05GSUcpOworCWF1MTAwMF9kZWxheSgxMCk7CisJYXVfd3JpdGVsKDAsIEFDOTdDX0NPTkZJRyk7CisJLyogbmVlZCB0byBkZWxheSBhcm91bmQgNTAwbXNlYyhibGVlY2gpIHRvIGdpdmUKKwkgICBzb21lIENPREVDcyBlbm91Z2ggdGltZSB0byB3YWtldXAgKi8KKwlhdTEwMDBfZGVsYXkoNTAwKTsKKworCS8qIHdhcm0gcmVzZXQgdGhlIEFDJzk3IHRvIHN0YXJ0IHRoZSBiaXRjbGsgKi8KKwlhdV93cml0ZWwoQUM5N0NfU0cgfCBBQzk3Q19TWU5DLCBBQzk3Q19DT05GSUcpOworCXVkZWxheSgxMDApOworCWF1X3dyaXRlbCgwLCBBQzk3Q19DT05GSUcpOworCisJLyogY29kZWMgaW5pdCAqLworCWlmICghYWM5N19wcm9iZV9jb2RlYygmcy0+Y29kZWMpKQorCQlnb3RvIGVycl9kZXYzOworCisJcy0+Y29kZWNfYmFzZV9jYXBzID0gcmRjb2RlYygmcy0+Y29kZWMsIEFDOTdfUkVTRVQpOworCXMtPmNvZGVjX2V4dF9jYXBzID0gcmRjb2RlYygmcy0+Y29kZWMsIEFDOTdfRVhURU5ERURfSUQpOworCWluZm8oIkFDJzk3IEJhc2UvRXh0ZW5kZWQgSUQgPSAlMDR4LyUwNHgiLAorCSAgICAgcy0+Y29kZWNfYmFzZV9jYXBzLCBzLT5jb2RlY19leHRfY2Fwcyk7CisKKwkvKgorCSAqIE9uIHRoZSBQYjEwMDAsIGF1ZGlvIHBsYXliYWNrIGlzIG9uIHRoZSBBVVhfT1VUCisJICogY2hhbm5lbCAod2hpY2ggZGVmYXVsdHMgdG8gTE5MVkxfT1VUIGluIEFDJzk3CisJICogcmV2IDIuMikgc28gbWFrZSBzdXJlIHRoaXMgY2hhbm5lbCBpcyBsaXN0ZWQKKwkgKiBhcyBzdXBwb3J0ZWQgKHNvdW5kY2FyZC5oIGNhbGxzIHRoaXMgY2hhbm5lbAorCSAqIEFMVFBDTSkuIGFjOTdfY29kZWMuYyBkb2VzIG5vdCBoYW5kbGUgZGV0ZWN0aW9uCisJICogb2YgdGhpcyBjaGFubmVsIGNvcnJlY3RseS4KKwkgKi8KKwlzLT5jb2RlYy5zdXBwb3J0ZWRfbWl4ZXJzIHw9IFNPVU5EX01BU0tfQUxUUENNOworCS8qCisJICogTm93IHNldCBBVVhfT1VUJ3MgZGVmYXVsdCB2b2x1bWUuCisJICovCisJdmFsID0gMHg0MzQzOworCW1peGRldl9pb2N0bCgmcy0+Y29kZWMsIFNPVU5EX01JWEVSX1dSSVRFX0FMVFBDTSwKKwkJICAgICAodW5zaWduZWQgbG9uZykgJnZhbCk7CisJCisJaWYgKCEocy0+Y29kZWNfZXh0X2NhcHMgJiBBQzk3X0VYVElEX1ZSQSkpIHsKKwkJLy8gY29kZWMgZG9lcyBub3Qgc3VwcG9ydCBWUkEKKwkJcy0+bm9fdnJhID0gMTsKKwl9IGVsc2UgaWYgKCF2cmEpIHsKKwkJLy8gQm9vdCBvcHRpb24gc2F5cyBkaXNhYmxlIFZSQQorCQl1MTYgYWM5N19leHRzdGF0ID0gcmRjb2RlYygmcy0+Y29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTLAorCQkJYWM5N19leHRzdGF0ICYgfkFDOTdfRVhUU1RBVF9WUkEpOworCQlzLT5ub192cmEgPSAxOworCX0KKwlpZiAocy0+bm9fdnJhKQorCQlpbmZvKCJubyBWUkEsIGludGVycG9sYXRpbmcgYW5kIGRlY2ltYXRpbmciKTsKKworCS8qIHNldCBtaWMgdG8gYmUgdGhlIHJlY29yZGluZyBzb3VyY2UgKi8KKwl2YWwgPSBTT1VORF9NQVNLX01JQzsKKwltaXhkZXZfaW9jdGwoJnMtPmNvZGVjLCBTT1VORF9NSVhFUl9XUklURV9SRUNTUkMsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpICZ2YWwpOworCisjaWZkZWYgQVUxMDAwX0RFQlVHCisJc3ByaW50Zihwcm9jX3N0ciwgImRyaXZlci8lcy8lZC9hYzk3IiwgQVUxMDAwX01PRFVMRV9OQU1FLAorCQlzLT5jb2RlYy5pZCk7CisJcy0+YWM5N19wcyA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKHByb2Nfc3RyLCAwLCBOVUxMLAorCQkJCQkgICAgIGFjOTdfcmVhZF9wcm9jLCAmcy0+Y29kZWMpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTUlQU19YWFMxNTAwCisJLyogZGVhc3NlcnQgZWFwZCAqLworCXdyY29kZWMoJnMtPmNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsCisJCQlyZGNvZGVjKCZzLT5jb2RlYywgQUM5N19QT1dFUl9DT05UUk9MKSAmIH4weDgwMDApOworCS8qIG11dGUgYSBudW1iZXIgb2Ygc2lnbmFscyB3aGljaCBzZWVtIHRvIGJlIGNhdXNpbmcgcHJvYmxlbXMKKwkgKiBpZiBub3QgbXV0ZWQuCisJICovCisJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfUENCRUVQX1ZPTCwgMHg4MDAwKTsKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19QSE9ORV9WT0wsIDB4ODAwOCk7CisJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfTUlDX1ZPTCwgMHg4MDA4KTsKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19MSU5FSU5fVk9MLCAweDg4MDgpOworCXdyY29kZWMoJnMtPmNvZGVjLCBBQzk3X0NEX1ZPTCwgMHg4ODA4KTsKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19WSURFT19WT0wsIDB4ODgwOCk7CisJd3Jjb2RlYygmcy0+Y29kZWMsIEFDOTdfQVVYX1ZPTCwgMHg4ODA4KTsKKwl3cmNvZGVjKCZzLT5jb2RlYywgQUM5N19QQ01PVVRfVk9MLCAweDA4MDgpOworCXdyY29kZWMoJnMtPmNvZGVjLCBBQzk3X0dFTkVSQUxfUFVSUE9TRSwgMHgyMDAwKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7CisKKyBlcnJfZGV2MzoKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLmRldl9taXhlcik7CisgZXJyX2RldjI6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKyBlcnJfZGV2MToKKwlmcmVlX2F1MTAwMF9kbWEocy0+ZG1hX2FkYy5kbWFucik7CisgZXJyX2RtYTI6CisJZnJlZV9hdTEwMDBfZG1hKHMtPmRtYV9kYWMuZG1hbnIpOworIGVycl9kbWExOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihDUEhZU0FERFIoQUM5N0NfQ09ORklHKSwgMHgxNCk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBhdTEwMDBfcmVtb3ZlKHZvaWQpCit7CisJc3RydWN0IGF1MTAwMF9zdGF0ZSAqcyA9ICZhdTEwMDBfc3RhdGU7CisKKwlpZiAoIXMpCisJCXJldHVybjsKKyNpZmRlZiBBVTEwMDBfREVCVUcKKwlpZiAocy0+cHMpCisJCXJlbW92ZV9wcm9jX2VudHJ5KEFVMTAwMF9NT0RVTEVfTkFNRSwgTlVMTCk7CisjZW5kaWYgLyogQVUxMDAwX0RFQlVHICovCisJc3luY2hyb25pemVfaXJxKCk7CisJZnJlZV9hdTEwMDBfZG1hKHMtPmRtYV9hZGMuZG1hbnIpOworCWZyZWVfYXUxMDAwX2RtYShzLT5kbWFfZGFjLmRtYW5yKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oQ1BIWVNBRERSKEFDOTdDX0NPTkZJRyksIDB4MTQpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5jb2RlYy5kZXZfbWl4ZXIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2F1MTAwMCh2b2lkKQoreworCWluZm8oInN0ZXZlbEBtdmlzdGEuY29tLCBidWlsdCAiIF9fVElNRV9fICIgb24gIiBfX0RBVEVfXyk7CisJcmV0dXJuIGF1MTAwMF9wcm9iZSgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9hdTEwMDAodm9pZCkKK3sKKwlpbmZvKCJ1bmxvYWRpbmciKTsKKwlhdTEwMDBfcmVtb3ZlKCk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfYXUxMDAwKTsKK21vZHVsZV9leGl0KGNsZWFudXBfYXUxMDAwKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgTU9EVUxFCisKK3N0YXRpYyBpbnQgX19pbml0IGF1MTAwMF9zZXR1cChjaGFyICpvcHRpb25zKQoreworCWNoYXIgICAgICAgICAgICp0aGlzX29wdDsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkpIHsKKwkJaWYgKCEqdGhpc19vcHQpCisJCQljb250aW51ZTsKKwkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidnJhIiwgMykpIHsKKwkJCXZyYSA9IDE7CisJCX0KKwl9CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiYXUxMDAwX2F1ZGlvPSIsIGF1MTAwMF9zZXR1cCk7CisKKyNlbmRpZiAvKiBNT0RVTEUgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9hdTE1NTBfYWM5Ny5jIGIvc291bmQvb3NzL2F1MTU1MF9hYzk3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc4ZTQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9hdTE1NTBfYWM5Ny5jCkBAIC0wLDAgKzEsMjExOSBAQAorLyoKKyAqIGF1MTU1MF9hYzk3LmMgIC0tICBTb3VuZCBkcml2ZXIgZm9yIEFsY2hlbXkgQXUxNTUwIE1JUFMgSW50ZXJuZXQgRWRnZQorICogICAgICAgICAgICAgICAgICAgIFByb2Nlc3Nvci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNCBFbWJlZGRlZCBFZGdlLCBMTEMKKyAqCWRhbkBlbWJlZGRlZGVkZ2UuY29tCisgKgorICogTW9zdGx5IGNvcGllZCBmcm9tIHRoZSBhdTEwMDAuYyBkcml2ZXIgYW5kIHNvbWUgZnJvbSB0aGUKKyAqIFBvd2VyTWFjIGRiZG1hIGRyaXZlci4KKyAqIFdlIGFzc3VtZSB0aGUgcHJvY2Vzc29yIGNhbiBkbyBtZW1vcnkgY29oZXJlbnQgRE1BLgorICoKKyAqIFBvcnRlZCB0byAyLjYgYnkgTWF0dCBQb3J0ZXIgPG1wb3J0ZXJAa2VybmVsLmNyYXNoaW5nLm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlICBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiAgdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyAgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgKiAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVEhJUyAgU09GVFdBUkUgIElTIFBST1ZJREVEICAgYGBBUyAgSVMnJyBBTkQgICBBTlkgIEVYUFJFU1MgT1IgSU1QTElFRAorICogIFdBUlJBTlRJRVMsICAgSU5DTFVESU5HLCBCVVQgTk9UICBMSU1JVEVEICBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTgorICogIE5PICBFVkVOVCAgU0hBTEwgICBUSEUgQVVUSE9SICBCRSAgICBMSUFCTEUgRk9SIEFOWSAgIERJUkVDVCwgSU5ESVJFQ1QsCisgKiAgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiAgTk9UIExJTUlURUQgICBUTywgUFJPQ1VSRU1FTlQgT0YgIFNVQlNUSVRVVEUgR09PRFMgIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCisgKiAgVVNFLCBEQVRBLCAgT1IgUFJPRklUUzsgT1IgIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiAgQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiAgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiAgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiAgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyN1bmRlZiBERUJVRworCisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaGFyZGlycS5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTEwMDAuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC1hdTF4MDAvYXUxeHh4X3BzYy5oPgorI2luY2x1ZGUgPGFzbS9tYWNoLWF1MXgwMC9hdTF4eHhfZGJkbWEuaD4KKworI3VuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCisvKiBtaXNjIHN0dWZmICovCisjZGVmaW5lIFBPTExfQ09VTlQgICAweDUwMDAwCisjZGVmaW5lIEFDOTdfRVhUX0RBQ1MgKEFDOTdfRVhUSURfU0RBQyB8IEFDOTdfRVhUSURfQ0RBQyB8IEFDOTdfRVhUSURfTERBQykKKworLyogVGhlIG51bWJlciBvZiBEQkRNQSByaW5nIGRlc2NyaXB0b3JzIHRvIGFsbG9jYXRlLiAgTm8gc2Vuc2UgbWFraW5nCisgKiB0aGlzIHRvbyBsYXJnZS4uLi5pZiB5b3UgY2FuJ3Qga2VlcCB1cCB3aXRoIGEgZmV3IHlvdSBhcmVuJ3QgbGlrZWx5CisgKiB0byBiZSBhYmxlIHRvIHdpdGggbG90cyBvZiB0aGVtLCBlaXRoZXIuCisgKi8KKyNkZWZpbmUgTlVNX0RCRE1BX0RFU0NSSVBUT1JTIDQKKworI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKworLyogQm9vdCBvcHRpb25zCisgKiAwID0gbm8gVlJBLCAxID0gdXNlIFZSQSBpZiBjb2RlYyBzdXBwb3J0cyBpdAorICovCitzdGF0aWMgaW50ICAgICAgdnJhID0gMTsKK01PRFVMRV9QQVJNKHZyYSwgImkiKTsKK01PRFVMRV9QQVJNX0RFU0ModnJhLCAiaWYgMSB1c2UgVlJBIGlmIGNvZGVjIHN1cHBvcnRzIGl0Iik7CisKK3N0YXRpYyBzdHJ1Y3QgYXUxNTUwX3N0YXRlIHsKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgICAgICAgICAgICAgZGV2X2F1ZGlvOworCisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCXVuc2lnbmVkICAgICAgICBjb2RlY19iYXNlX2NhcHM7IC8qIEFDJzk3IHJlZyAwMGgsICJSZXNldCBSZWdpc3RlciIgKi8KKwl1bnNpZ25lZCAgICAgICAgY29kZWNfZXh0X2NhcHM7ICAvKiBBQyc5NyByZWcgMjhoLCAiRXh0ZW5kZWQgQXVkaW8gSUQiICovCisJaW50ICAgICAgICAgICAgIG5vX3ZyYTsJCS8qIGRvIG5vdCB1c2UgVlJBICovCisKKwlzcGlubG9ja190ICAgICAgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworCW1vZGVfdCAgICAgICAgICBvcGVuX21vZGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCisJc3RydWN0IGRtYWJ1ZiB7CisJCXUzMgkJZG1hbnI7CisJCXVuc2lnbmVkICAgICAgICBzYW1wbGVfcmF0ZTsKKwkJdW5zaWduZWQJc3JjX2ZhY3RvcjsKKwkJdW5zaWduZWQgICAgICAgIHNhbXBsZV9zaXplOworCQlpbnQgICAgICAgICAgICAgbnVtX2NoYW5uZWxzOworCQlpbnQJCWRtYV9ieXRlc19wZXJfc2FtcGxlOworCQlpbnQJCXVzZXJfYnl0ZXNfcGVyX3NhbXBsZTsKKwkJaW50CQljbnRfZmFjdG9yOworCisJCXZvaWQJCSpyYXdidWY7CisJCXVuc2lnbmVkICAgICAgICBidWZvcmRlcjsKKwkJdW5zaWduZWQJbnVtZnJhZzsKKwkJdW5zaWduZWQgICAgICAgIGZyYWdzaGlmdDsKKwkJdm9pZAkJKm5leHRJbjsKKwkJdm9pZAkJKm5leHRPdXQ7CisJCWludAkJY291bnQ7CisJCXVuc2lnbmVkICAgICAgICB0b3RhbF9ieXRlczsKKwkJdW5zaWduZWQgICAgICAgIGVycm9yOworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCisJCS8qIHJlZHVuZGFudCwgYnV0IG1ha2VzIGNhbGN1bGF0aW9ucyBlYXNpZXIgKi8KKwkJdW5zaWduZWQJZnJhZ3NpemU7CisJCXVuc2lnbmVkCWRtYV9mcmFnc2l6ZTsKKwkJdW5zaWduZWQJZG1hc2l6ZTsKKwkJdW5zaWduZWQJZG1hX3Fjb3VudDsKKworCQkvKiBPU1Mgc3R1ZmYgKi8KKwkJdW5zaWduZWQgICAgICAgIG1hcHBlZDoxOworCQl1bnNpZ25lZCAgICAgICAgcmVhZHk6MTsKKwkJdW5zaWduZWQgICAgICAgIHN0b3BwZWQ6MTsKKwkJdW5zaWduZWQgICAgICAgIG9zc2ZyYWdzaGlmdDsKKwkJaW50ICAgICAgICAgICAgIG9zc21heGZyYWdzOworCQl1bnNpZ25lZCAgICAgICAgc3ViZGl2aXNpb247CisJfSBkbWFfZGFjLCBkbWFfYWRjOworfSBhdTE1NTBfc3RhdGU7CisKK3N0YXRpYyB1bnNpZ25lZAorbGQyKHVuc2lnbmVkIGludCB4KQoreworCXVuc2lnbmVkICAgICAgICByID0gMDsKKworCWlmICh4ID49IDB4MTAwMDApIHsKKwkJeCA+Pj0gMTY7CisJCXIgKz0gMTY7CisJfQorCWlmICh4ID49IDB4MTAwKSB7CisJCXggPj49IDg7CisJCXIgKz0gODsKKwl9CisJaWYgKHggPj0gMHgxMCkgeworCQl4ID4+PSA0OworCQlyICs9IDQ7CisJfQorCWlmICh4ID49IDQpIHsKKwkJeCA+Pj0gMjsKKwkJciArPSAyOworCX0KKwlpZiAoeCA+PSAyKQorCQlyKys7CisJcmV0dXJuIHI7Cit9CisKK3N0YXRpYyB2b2lkCithdTE1NTBfZGVsYXkoaW50IG1zZWMpCit7CisJdW5zaWduZWQgbG9uZyAgIHRtbzsKKwlzaWduZWQgbG9uZyAgICAgdG1vMjsKKworCWlmIChpbl9pbnRlcnJ1cHQoKSkKKwkJcmV0dXJuOworCisJdG1vID0gamlmZmllcyArIChtc2VjICogSFopIC8gMTAwMDsKKwlmb3IgKDs7KSB7CisJCXRtbzIgPSB0bW8gLSBqaWZmaWVzOworCQlpZiAodG1vMiA8PSAwKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlX3RpbWVvdXQodG1vMik7CisJfQorfQorCitzdGF0aWMgdTE2CityZGNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggYWRkcikKK3sKKwlzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzID0gKHN0cnVjdCBhdTE1NTBfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1MzIgICAgICAgICAgICAgY21kLCB2YWw7CisJdTE2ICAgICAgICAgICAgIGRhdGE7CisJaW50ICAgICAgICAgICAgIGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykgeworCQl2YWwgPSBhdV9yZWFkbChQU0NfQUM5N1NUQVQpOworCQlhdV9zeW5jKCk7CisJCWlmICghKHZhbCAmIFBTQ19BQzk3U1RBVF9DUCkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJyZGNvZGVjOiBjb2RlYyBjbWQgcGVuZGluZyBleHBpcmVkISIpOworCisJY21kID0gKHUzMilQU0NfQUM5N0NEQ19JTkRYKGFkZHIpOworCWNtZCB8PSBQU0NfQUM5N0NEQ19SRDsJLyogcmVhZCBjb21tYW5kICovCisJYXVfd3JpdGVsKGNtZCwgUFNDX0FDOTdDREMpOworCWF1X3N5bmMoKTsKKworCS8qIG5vdyB3YWl0IGZvciB0aGUgZGF0YQorCSovCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykgeworCQl2YWwgPSBhdV9yZWFkbChQU0NfQUM5N1NUQVQpOworCQlhdV9zeW5jKCk7CisJCWlmICghKHZhbCAmIFBTQ19BQzk3U1RBVF9DUCkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkgeworCQllcnIoInJkY29kZWM6IHJlYWQgcG9sbCBleHBpcmVkISIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiB3YWl0IGZvciBjb21tYW5kIGRvbmU/CisJKi8KKwlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKSB7CisJCXZhbCA9IGF1X3JlYWRsKFBTQ19BQzk3RVZOVCk7CisJCWF1X3N5bmMoKTsKKwkJaWYgKHZhbCAmIFBTQ19BQzk3RVZOVF9DRCkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBQT0xMX0NPVU5UKSB7CisJCWVycigicmRjb2RlYzogcmVhZCBjbWR3YWl0IGV4cGlyZWQhIik7CisJCXJldHVybiAwOworCX0KKworCWRhdGEgPSBhdV9yZWFkbChQU0NfQUM5N0NEQykgJiAweGZmZmY7CisJYXVfc3luYygpOworCisJLyogQ2xlYXIgY29tbWFuZCBkb25lIGV2ZW50LgorCSovCisJYXVfd3JpdGVsKFBTQ19BQzk3RVZOVF9DRCwgUFNDX0FDOTdFVk5UKTsKKwlhdV9zeW5jKCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gZGF0YTsKK30KKworCitzdGF0aWMgdm9pZAord3Jjb2RlYyhzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IGFkZHIsIHUxNiBkYXRhKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXUzMiAgICAgICAgICAgICBjbWQsIHZhbDsKKwlpbnQgICAgICAgICAgICAgaTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUE9MTF9DT1VOVDsgaSsrKSB7CisJCXZhbCA9IGF1X3JlYWRsKFBTQ19BQzk3U1RBVCk7CisJCWF1X3N5bmMoKTsKKwkJaWYgKCEodmFsICYgUFNDX0FDOTdTVEFUX0NQKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSBQT0xMX0NPVU5UKQorCQllcnIoIndyY29kZWM6IGNvZGVjIGNtZCBwZW5kaW5nIGV4cGlyZWQhIik7CisKKwljbWQgPSAodTMyKVBTQ19BQzk3Q0RDX0lORFgoYWRkcik7CisJY21kIHw9ICh1MzIpZGF0YTsKKwlhdV93cml0ZWwoY21kLCBQU0NfQUM5N0NEQyk7CisJYXVfc3luYygpOworCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykgeworCQl2YWwgPSBhdV9yZWFkbChQU0NfQUM5N1NUQVQpOworCQlhdV9zeW5jKCk7CisJCWlmICghKHZhbCAmIFBTQ19BQzk3U1RBVF9DUCkpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJ3cmNvZGVjOiBjb2RlYyBjbWQgcGVuZGluZyBleHBpcmVkISIpOworCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykgeworCQl2YWwgPSBhdV9yZWFkbChQU0NfQUM5N0VWTlQpOworCQlhdV9zeW5jKCk7CisJCWlmICh2YWwgJiBQU0NfQUM5N0VWTlRfQ0QpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJ3cmNvZGVjOiByZWFkIGNtZHdhaXQgZXhwaXJlZCEiKTsKKworCS8qIENsZWFyIGNvbW1hbmQgZG9uZSBldmVudC4KKwkqLworCWF1X3dyaXRlbChQU0NfQUM5N0VWTlRfQ0QsIFBTQ19BQzk3RVZOVCk7CisJYXVfc3luYygpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAord2FpdGNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYykKK3sKKwl1MTYJdGVtcDsKKwl1MzIJdmFsOworCWludAlpOworCisJLyogY29kZWNfd2FpdCBpcyB1c2VkIHRvIHdhaXQgZm9yIGEgcmVhZHkgc3RhdGUgYWZ0ZXIKKwkgKiBhbiBBQzk3Q19SRVNFVC4KKwkgKi8KKwlhdTE1NTBfZGVsYXkoMTApOworCisJLyogZmlyc3QgcG9sbCB0aGUgQ09ERUNfUkVBRFkgdGFnIGJpdAorCSovCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykgeworCQl2YWwgPSBhdV9yZWFkbChQU0NfQUM5N1NUQVQpOworCQlhdV9zeW5jKCk7CisJCWlmICh2YWwgJiBQU0NfQUM5N1NUQVRfQ1IpCisJCQlicmVhazsKKwl9CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkgeworCQllcnIoIndhaXRjb2RlYzogQ09ERUNfUkVBRFkgcG9sbCBleHBpcmVkISIpOworCQlyZXR1cm47CisJfQorCisJLyogZ2V0IEFDJzk3IHBvd2VyZG93biBjb250cm9sL3N0YXR1cyByZWdpc3RlcgorCSovCisJdGVtcCA9IHJkY29kZWMoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisKKwkvKiBJZiBhbnl0aGluZyBpcyBwb3dlcmVkIGRvd24sIHBvd2VyJ2VtIHVwCisJKi8KKwlpZiAodGVtcCAmIDB4N2YwMCkgeworCQkvKiBQb3dlciBvbgorCQkqLworCQl3cmNvZGVjKGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wsIDApOworCQlhdTE1NTBfZGVsYXkoMTAwKTsKKworCQkvKiBSZXJlYWQKKwkJKi8KKwkJdGVtcCA9IHJkY29kZWMoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJfQorCisJLyogQ2hlY2sgaWYgQ29kZWMgUkVGLEFOTCxEQUMsQURDIHJlYWR5CisJKi8KKwlpZiAoKHRlbXAgJiAweDdmMGYpICE9IDB4MDAwZikKKwkJZXJyKCJjb2RlYyByZWcgMjYgc3RhdHVzICgweCV4KSBub3QgcmVhZHkhISIsIHRlbXApOworfQorCisvKiBzdG9wIHRoZSBBREMgYmVmb3JlIGNhbGxpbmcgKi8KK3N0YXRpYyB2b2lkCitzZXRfYWRjX3JhdGUoc3RydWN0IGF1MTU1MF9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICAqYWRjID0gJnMtPmRtYV9hZGM7CisJc3RydWN0IGRtYWJ1ZiAgKmRhYyA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkICAgICAgICBhZGNfcmF0ZSwgZGFjX3JhdGU7CisJdTE2ICAgICAgICAgICAgIGFjOTdfZXh0c3RhdDsKKworCWlmIChzLT5ub192cmEpIHsKKwkJLyogY2FsYyBTUkMgZmFjdG9yCisJCSovCisJCWFkYy0+c3JjX2ZhY3RvciA9ICgoOTYwMDAgLyByYXRlKSArIDEpID4+IDE7CisJCWFkYy0+c2FtcGxlX3JhdGUgPSA0ODAwMCAvIGFkYy0+c3JjX2ZhY3RvcjsKKwkJcmV0dXJuOworCX0KKworCWFkYy0+c3JjX2ZhY3RvciA9IDE7CisKKwlhYzk3X2V4dHN0YXQgPSByZGNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisKKwlyYXRlID0gcmF0ZSA+IDQ4MDAwID8gNDgwMDAgOiByYXRlOworCisJLyogZW5hYmxlIFZSQQorCSovCisJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCWFjOTdfZXh0c3RhdCB8IEFDOTdfRVhUU1RBVF9WUkEpOworCisJLyogbm93IHdyaXRlIHRoZSBzYW1wbGUgcmF0ZQorCSovCisJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fTFJfQURDX1JBVEUsICh1MTYpIHJhdGUpOworCisJLyogcmVhZCBpdCBiYWNrIGZvciBhY3R1YWwgc3VwcG9ydGVkIHJhdGUKKwkqLworCWFkY19yYXRlID0gcmRjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fTFJfQURDX1JBVEUpOworCisJcHJfZGVidWcoInNldF9hZGNfcmF0ZTogc2V0IHRvICVkIEh6XG4iLCBhZGNfcmF0ZSk7CisKKwkvKiBzb21lIGNvZGVjJ3MgZG9uJ3QgYWxsb3cgdW5lcXVhbCBEQUMgYW5kIEFEQyByYXRlcywgaW4gd2hpY2ggY2FzZQorCSAqIHdyaXRpbmcgb25lIHJhdGUgcmVnIGFjdHVhbGx5IGNoYW5nZXMgYm90aC4KKwkgKi8KKwlkYWNfcmF0ZSA9IHJkY29kZWMocy0+Y29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKTsKKwlpZiAoZGFjLT5udW1fY2hhbm5lbHMgPiAyKQorCQl3cmNvZGVjKHMtPmNvZGVjLCBBQzk3X1BDTV9TVVJSX0RBQ19SQVRFLCBkYWNfcmF0ZSk7CisJaWYgKGRhYy0+bnVtX2NoYW5uZWxzID4gNCkKKwkJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fTEZFX0RBQ19SQVRFLCBkYWNfcmF0ZSk7CisKKwlhZGMtPnNhbXBsZV9yYXRlID0gYWRjX3JhdGU7CisJZGFjLT5zYW1wbGVfcmF0ZSA9IGRhY19yYXRlOworfQorCisvKiBzdG9wIHRoZSBEQUMgYmVmb3JlIGNhbGxpbmcgKi8KK3N0YXRpYyB2b2lkCitzZXRfZGFjX3JhdGUoc3RydWN0IGF1MTU1MF9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICAqZGFjID0gJnMtPmRtYV9kYWM7CisJc3RydWN0IGRtYWJ1ZiAgKmFkYyA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkICAgICAgICBhZGNfcmF0ZSwgZGFjX3JhdGU7CisJdTE2ICAgICAgICAgICAgIGFjOTdfZXh0c3RhdDsKKworCWlmIChzLT5ub192cmEpIHsKKwkJLyogY2FsYyBTUkMgZmFjdG9yCisJCSovCisJCWRhYy0+c3JjX2ZhY3RvciA9ICgoOTYwMDAgLyByYXRlKSArIDEpID4+IDE7CisJCWRhYy0+c2FtcGxlX3JhdGUgPSA0ODAwMCAvIGRhYy0+c3JjX2ZhY3RvcjsKKwkJcmV0dXJuOworCX0KKworCWRhYy0+c3JjX2ZhY3RvciA9IDE7CisKKwlhYzk3X2V4dHN0YXQgPSByZGNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisKKwlyYXRlID0gcmF0ZSA+IDQ4MDAwID8gNDgwMDAgOiByYXRlOworCisJLyogZW5hYmxlIFZSQQorCSovCisJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCWFjOTdfZXh0c3RhdCB8IEFDOTdfRVhUU1RBVF9WUkEpOworCisJLyogbm93IHdyaXRlIHRoZSBzYW1wbGUgcmF0ZQorCSovCisJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUsICh1MTYpIHJhdGUpOworCisJLyogSSBkb24ndCBzdXBwb3J0IGRpZmZlcmVudCBzYW1wbGUgcmF0ZXMgZm9yIG11bHRpY2hhbm5lbCwKKwkgKiBzbyBtYWtlIHRoZXNlIGNoYW5uZWxzIHRoZSBzYW1lLgorCSAqLworCWlmIChkYWMtPm51bV9jaGFubmVscyA+IDIpCisJCXdyY29kZWMocy0+Y29kZWMsIEFDOTdfUENNX1NVUlJfREFDX1JBVEUsICh1MTYpIHJhdGUpOworCWlmIChkYWMtPm51bV9jaGFubmVscyA+IDQpCisJCXdyY29kZWMocy0+Y29kZWMsIEFDOTdfUENNX0xGRV9EQUNfUkFURSwgKHUxNikgcmF0ZSk7CisJLyogcmVhZCBpdCBiYWNrIGZvciBhY3R1YWwgc3VwcG9ydGVkIHJhdGUKKwkqLworCWRhY19yYXRlID0gcmRjb2RlYyhzLT5jb2RlYywgQUM5N19QQ01fRlJPTlRfREFDX1JBVEUpOworCisJcHJfZGVidWcoInNldF9kYWNfcmF0ZTogc2V0IHRvICVkIEh6XG4iLCBkYWNfcmF0ZSk7CisKKwkvKiBzb21lIGNvZGVjJ3MgZG9uJ3QgYWxsb3cgdW5lcXVhbCBEQUMgYW5kIEFEQyByYXRlcywgaW4gd2hpY2ggY2FzZQorCSAqIHdyaXRpbmcgb25lIHJhdGUgcmVnIGFjdHVhbGx5IGNoYW5nZXMgYm90aC4KKwkgKi8KKwlhZGNfcmF0ZSA9IHJkY29kZWMocy0+Y29kZWMsIEFDOTdfUENNX0xSX0FEQ19SQVRFKTsKKworCWRhYy0+c2FtcGxlX3JhdGUgPSBkYWNfcmF0ZTsKKwlhZGMtPnNhbXBsZV9yYXRlID0gYWRjX3JhdGU7Cit9CisKK3N0YXRpYyB2b2lkCitzdG9wX2RhYyhzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfZGFjOworCXUzMgkJc3RhdDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlpZiAoZGItPnN0b3BwZWQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlhdV93cml0ZWwoUFNDX0FDOTdQQ1JfVFAsIFBTQ19BQzk3UENSKTsKKwlhdV9zeW5jKCk7CisKKwkvKiBXYWl0IGZvciBUcmFuc21pdCBCdXN5IHRvIHNob3cgZGlzYWJsZWQuCisJKi8KKwlkbyB7CisJCXN0YXQgPSByZWFkbCgodm9pZCAqKVBTQ19BQzk3U1RBVCk7CisJCWF1X3N5bmMoKTsKKwl9IHdoaWxlICgoc3RhdCAmIFBTQ19BQzk3U1RBVF9UQikgIT0gMCk7CisKKwlhdTF4eHhfZGJkbWFfcmVzZXQoZGItPmRtYW5yKTsKKworCWRiLT5zdG9wcGVkID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK3N0b3BfYWRjKHN0cnVjdCBhdTE1NTBfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiAgKmRiID0gJnMtPmRtYV9hZGM7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXUzMgkJc3RhdDsKKworCWlmIChkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWF1X3dyaXRlbChQU0NfQUM5N1BDUl9SUCwgUFNDX0FDOTdQQ1IpOworCWF1X3N5bmMoKTsKKworCS8qIFdhaXQgZm9yIFJlY2VpdmUgQnVzeSB0byBzaG93IGRpc2FibGVkLgorCSovCisJZG8geworCQlzdGF0ID0gcmVhZGwoKHZvaWQgKilQU0NfQUM5N1NUQVQpOworCQlhdV9zeW5jKCk7CisJfSB3aGlsZSAoKHN0YXQgJiBQU0NfQUM5N1NUQVRfUkIpICE9IDApOworCisJYXUxeHh4X2RiZG1hX3Jlc2V0KGRiLT5kbWFucik7CisKKwlkYi0+c3RvcHBlZCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQKK3NldF94bWl0X3Nsb3RzKGludCBudW1fY2hhbm5lbHMpCit7CisJdTMyCWFjOTdfY29uZmlnLCBzdGF0OworCisJYWM5N19jb25maWcgPSBhdV9yZWFkbChQU0NfQUM5N0NGRyk7CisJYXVfc3luYygpOworCWFjOTdfY29uZmlnICY9IH4oUFNDX0FDOTdDRkdfVFhTTE9UX01BU0sgfCBQU0NfQUM5N0NGR19ERV9FTkFCTEUpOworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgUFNDX0FDOTdDRkcpOworCWF1X3N5bmMoKTsKKworCXN3aXRjaCAobnVtX2NoYW5uZWxzKSB7CisJY2FzZSA2OgkJLyogc3RlcmVvIHdpdGggc3Vycm91bmQgYW5kIGNlbnRlci9MRkUsCisJCQkgKiBzbG90cyAzLDQsNiw3LDgsOQorCQkJICovCisJCWFjOTdfY29uZmlnIHw9IFBTQ19BQzk3Q0ZHX1RYU0xPVF9FTkEoNik7CisJCWFjOTdfY29uZmlnIHw9IFBTQ19BQzk3Q0ZHX1RYU0xPVF9FTkEoOSk7CisKKwljYXNlIDQ6CQkvKiBzdGVyZW8gd2l0aCBzdXJyb3VuZCwgc2xvdHMgMyw0LDcsOCAqLworCQlhYzk3X2NvbmZpZyB8PSBQU0NfQUM5N0NGR19UWFNMT1RfRU5BKDcpOworCQlhYzk3X2NvbmZpZyB8PSBQU0NfQUM5N0NGR19UWFNMT1RfRU5BKDgpOworCisJY2FzZSAyOgkJLyogc3RlcmVvLCBzbG90cyAzLDQgKi8KKwljYXNlIDE6CQkvKiBtb25vICovCisJCWFjOTdfY29uZmlnIHw9IFBTQ19BQzk3Q0ZHX1RYU0xPVF9FTkEoMyk7CisJCWFjOTdfY29uZmlnIHw9IFBTQ19BQzk3Q0ZHX1RYU0xPVF9FTkEoNCk7CisJfQorCisJYXVfd3JpdGVsKGFjOTdfY29uZmlnLCBQU0NfQUM5N0NGRyk7CisJYXVfc3luYygpOworCisJYWM5N19jb25maWcgfD0gUFNDX0FDOTdDRkdfREVfRU5BQkxFOworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgUFNDX0FDOTdDRkcpOworCWF1X3N5bmMoKTsKKworCS8qIFdhaXQgZm9yIERldmljZSByZWFkeS4KKwkqLworCWRvIHsKKwkJc3RhdCA9IHJlYWRsKCh2b2lkICopUFNDX0FDOTdTVEFUKTsKKwkJYXVfc3luYygpOworCX0gd2hpbGUgKChzdGF0ICYgUFNDX0FDOTdTVEFUX0RSKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQKK3NldF9yZWN2X3Nsb3RzKGludCBudW1fY2hhbm5lbHMpCit7CisJdTMyCWFjOTdfY29uZmlnLCBzdGF0OworCisJYWM5N19jb25maWcgPSBhdV9yZWFkbChQU0NfQUM5N0NGRyk7CisJYXVfc3luYygpOworCWFjOTdfY29uZmlnICY9IH4oUFNDX0FDOTdDRkdfUlhTTE9UX01BU0sgfCBQU0NfQUM5N0NGR19ERV9FTkFCTEUpOworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgUFNDX0FDOTdDRkcpOworCWF1X3N5bmMoKTsKKworCS8qIEFsd2F5cyBlbmFibGUgc2xvdHMgMyBhbmQgNCAoc3RlcmVvKS4gU2xvdCA2IGlzCisJICogb3B0aW9uYWwgTWljIEFEQywgd2hpY2ggd2UgZG9uJ3Qgc3VwcG9ydCB5ZXQuCisJICovCisJYWM5N19jb25maWcgfD0gUFNDX0FDOTdDRkdfUlhTTE9UX0VOQSgzKTsKKwlhYzk3X2NvbmZpZyB8PSBQU0NfQUM5N0NGR19SWFNMT1RfRU5BKDQpOworCisJYXVfd3JpdGVsKGFjOTdfY29uZmlnLCBQU0NfQUM5N0NGRyk7CisJYXVfc3luYygpOworCisJYWM5N19jb25maWcgfD0gUFNDX0FDOTdDRkdfREVfRU5BQkxFOworCWF1X3dyaXRlbChhYzk3X2NvbmZpZywgUFNDX0FDOTdDRkcpOworCWF1X3N5bmMoKTsKKworCS8qIFdhaXQgZm9yIERldmljZSByZWFkeS4KKwkqLworCWRvIHsKKwkJc3RhdCA9IHJlYWRsKCh2b2lkICopUFNDX0FDOTdTVEFUKTsKKwkJYXVfc3luYygpOworCX0gd2hpbGUgKChzdGF0ICYgUFNDX0FDOTdTVEFUX0RSKSA9PSAwKTsKK30KKworc3RhdGljIHZvaWQKK3N0YXJ0X2RhYyhzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCWlmICghZGItPnN0b3BwZWQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlzZXRfeG1pdF9zbG90cyhkYi0+bnVtX2NoYW5uZWxzKTsKKwlhdV93cml0ZWwoUFNDX0FDOTdQQ1JfVEMsIFBTQ19BQzk3UENSKTsKKwlhdV9zeW5jKCk7CisJYXVfd3JpdGVsKFBTQ19BQzk3UENSX1RTLCBQU0NfQUM5N1BDUik7CisJYXVfc3luYygpOworCisJYXUxeHh4X2RiZG1hX3N0YXJ0KGRiLT5kbWFucik7CisKKwlkYi0+c3RvcHBlZCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitzdGFydF9hZGMoc3RydWN0IGF1MTU1MF9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1hYnVmICAqZGIgPSAmcy0+ZG1hX2FkYzsKKwlpbnQJaTsKKworCWlmICghZGItPnN0b3BwZWQpCisJCXJldHVybjsKKworCS8qIFB1dCB0d28gYnVmZmVycyBvbiB0aGUgcmluZyB0byBnZXQgdGhpbmdzIHN0YXJ0ZWQuCisJKi8KKwlmb3IgKGk9MDsgaTwyOyBpKyspIHsKKwkJYXUxeHh4X2RiZG1hX3B1dF9kZXN0KGRiLT5kbWFuciwgZGItPm5leHRJbiwgZGItPmRtYV9mcmFnc2l6ZSk7CisKKwkJZGItPm5leHRJbiArPSBkYi0+ZG1hX2ZyYWdzaXplOworCQlpZiAoZGItPm5leHRJbiA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQlkYi0+bmV4dEluIC09IGRiLT5kbWFzaXplOworCX0KKworCXNldF9yZWN2X3Nsb3RzKGRiLT5udW1fY2hhbm5lbHMpOworCWF1MXh4eF9kYmRtYV9zdGFydChkYi0+ZG1hbnIpOworCWF1X3dyaXRlbChQU0NfQUM5N1BDUl9SQywgUFNDX0FDOTdQQ1IpOworCWF1X3N5bmMoKTsKKwlhdV93cml0ZWwoUFNDX0FDOTdQQ1JfUlMsIFBTQ19BQzk3UENSKTsKKwlhdV9zeW5jKCk7CisKKwlkYi0+c3RvcHBlZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2dfZG1hYnVmKHN0cnVjdCBhdTE1NTBfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXVuc2lnbmVkIHVzZXJfYnl0ZXNfcGVyX3NlYzsKKwl1bnNpZ25lZCAgICAgICAgYnVmczsKKwl1bnNpZ25lZCAgICAgICAgcmF0ZSA9IGRiLT5zYW1wbGVfcmF0ZTsKKworCWlmICghZGItPnJhd2J1ZikgeworCQlkYi0+cmVhZHkgPSBkYi0+bWFwcGVkID0gMDsKKwkJZGItPmJ1Zm9yZGVyID0gNTsJLyogMzIgKiBQQUdFX1NJWkUgKi8KKwkJZGItPnJhd2J1ZiA9IGttYWxsb2MoKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkYi0+cmF3YnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZGItPmNudF9mYWN0b3IgPSAxOworCWlmIChkYi0+c2FtcGxlX3NpemUgPT0gOCkKKwkJZGItPmNudF9mYWN0b3IgKj0gMjsKKwlpZiAoZGItPm51bV9jaGFubmVscyA9PSAxKQorCQlkYi0+Y250X2ZhY3RvciAqPSAyOworCWRiLT5jbnRfZmFjdG9yICo9IGRiLT5zcmNfZmFjdG9yOworCisJZGItPmNvdW50ID0gMDsKKwlkYi0+ZG1hX3Fjb3VudCA9IDA7CisJZGItPm5leHRJbiA9IGRiLT5uZXh0T3V0ID0gZGItPnJhd2J1ZjsKKworCWRiLT51c2VyX2J5dGVzX3Blcl9zYW1wbGUgPSAoZGItPnNhbXBsZV9zaXplPj4zKSAqIGRiLT5udW1fY2hhbm5lbHM7CisJZGItPmRtYV9ieXRlc19wZXJfc2FtcGxlID0gMiAqICgoZGItPm51bV9jaGFubmVscyA9PSAxKSA/CisJCQkJCTIgOiBkYi0+bnVtX2NoYW5uZWxzKTsKKworCXVzZXJfYnl0ZXNfcGVyX3NlYyA9IHJhdGUgKiBkYi0+dXNlcl9ieXRlc19wZXJfc2FtcGxlOworCWJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworCWlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IHVzZXJfYnl0ZXNfcGVyX3NlYykKKwkJCWRiLT5mcmFnc2hpZnQgPSBsZDIodXNlcl9ieXRlc19wZXJfc2VjLzEwMDApOworCQllbHNlCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gZGItPm9zc2ZyYWdzaGlmdDsKKwl9IGVsc2UgeworCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKHVzZXJfYnl0ZXNfcGVyX3NlYyAvIDEwMCAvCisJCQkJICAgIChkYi0+c3ViZGl2aXNpb24gPyBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CisJCWlmIChkYi0+ZnJhZ3NoaWZ0IDwgMykKKwkJCWRiLT5mcmFnc2hpZnQgPSAzOworCX0KKworCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKwlkYi0+ZG1hX2ZyYWdzaXplID0gZGItPmZyYWdzaXplICogZGItPmNudF9mYWN0b3I7CisJZGItPm51bWZyYWcgPSBidWZzIC8gZGItPmRtYV9mcmFnc2l6ZTsKKworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+ZnJhZ3NpemUgPSAxIDw8IGRiLT5mcmFnc2hpZnQ7CisJCWRiLT5kbWFfZnJhZ3NpemUgPSBkYi0+ZnJhZ3NpemUgKiBkYi0+Y250X2ZhY3RvcjsKKwkJZGItPm51bWZyYWcgPSBidWZzIC8gZGItPmRtYV9mcmFnc2l6ZTsKKwl9CisKKwlpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisJCWRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworCisJZGItPmRtYXNpemUgPSBkYi0+ZG1hX2ZyYWdzaXplICogZGItPm51bWZyYWc7CisJbWVtc2V0KGRiLT5yYXdidWYsIDAsIGJ1ZnMpOworCisJcHJfZGVidWcoInByb2dfZG1hYnVmOiByYXRlPSVkLCBzYW1wbGVzaXplPSVkLCBjaGFubmVscz0lZFxuIiwKKwkgICAgcmF0ZSwgZGItPnNhbXBsZV9zaXplLCBkYi0+bnVtX2NoYW5uZWxzKTsKKwlwcl9kZWJ1ZygicHJvZ19kbWFidWY6IGZyYWdzaXplPSVkLCBjbnRfZmFjdG9yPSVkLCBkbWFfZnJhZ3NpemU9JWRcbiIsCisJICAgIGRiLT5mcmFnc2l6ZSwgZGItPmNudF9mYWN0b3IsIGRiLT5kbWFfZnJhZ3NpemUpOworCXByX2RlYnVnKCJwcm9nX2RtYWJ1ZjogbnVtZnJhZz0lZCwgZG1hc2l6ZT0lZFxuIiwgZGItPm51bWZyYWcsIGRiLT5kbWFzaXplKTsKKworCWRiLT5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2dfZG1hYnVmX2FkYyhzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzKQoreworCXN0b3BfYWRjKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYyk7CisKK30KKworc3RhdGljIGludAorcHJvZ19kbWFidWZfZGFjKHN0cnVjdCBhdTE1NTBfc3RhdGUgKnMpCit7CisJc3RvcF9kYWMocyk7CisJcmV0dXJuIHByb2dfZG1hYnVmKHMsICZzLT5kbWFfZGFjKTsKK30KKworCisvKiBob2xkIHNwaW5sb2NrIGZvciB0aGUgZm9sbG93aW5nICovCitzdGF0aWMgdm9pZAorZGFjX2RtYV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzID0gKHN0cnVjdCBhdTE1NTBfc3RhdGUgKikgZGV2X2lkOworCXN0cnVjdCBkbWFidWYgICpkYiA9ICZzLT5kbWFfZGFjOworCXUzMglhYzk3Y19zdGF0OworCisJYWM5N2Nfc3RhdCA9IGF1X3JlYWRsKFBTQ19BQzk3U1RBVCk7CisJaWYgKGFjOTdjX3N0YXQgJiAoQUM5N0NfWFUgfCBBQzk3Q19YTyB8IEFDOTdDX1RFKSkKKwkJcHJfZGVidWcoIkFDOTdDIHN0YXR1cyA9IDB4JTA4eFxuIiwgYWM5N2Nfc3RhdCk7CisJZGItPmRtYV9xY291bnQtLTsKKworCWlmIChkYi0+Y291bnQgPj0gZGItPmZyYWdzaXplKSB7CisJCWlmIChhdTF4eHhfZGJkbWFfcHV0X3NvdXJjZShkYi0+ZG1hbnIsIGRiLT5uZXh0T3V0LAorCQkJCQkJCWRiLT5mcmFnc2l6ZSkgPT0gMCkgeworCQkJZXJyKCJxY291bnQgPCAyIGFuZCBubyByaW5nIHJvb20hIik7CisJCX0KKwkJZGItPm5leHRPdXQgKz0gZGItPmZyYWdzaXplOworCQlpZiAoZGItPm5leHRPdXQgPj0gZGItPnJhd2J1ZiArIGRiLT5kbWFzaXplKQorCQkJZGItPm5leHRPdXQgLT0gZGItPmRtYXNpemU7CisJCWRiLT5jb3VudCAtPSBkYi0+ZnJhZ3NpemU7CisJCWRiLT50b3RhbF9ieXRlcyArPSBkYi0+ZG1hX2ZyYWdzaXplOworCQlkYi0+ZG1hX3Fjb3VudCsrOworCX0KKworCS8qIHdha2UgdXAgYW55Ym9keSBsaXN0ZW5pbmcgKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZGItPndhaXQpKQorCQl3YWtlX3VwKCZkYi0+d2FpdCk7Cit9CisKKworc3RhdGljIHZvaWQKK2FkY19kbWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0CWF1MTU1MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxNTUwX3N0YXRlICopZGV2X2lkOworCXN0cnVjdAlkbWFidWYgICpkcCA9ICZzLT5kbWFfYWRjOworCXUzMglvYnl0ZXM7CisJY2hhcgkqb2J1ZjsKKworCS8qIFB1bGwgdGhlIGJ1ZmZlciBmcm9tIHRoZSBkbWEgcXVldWUuCisJKi8KKwlhdTF4eHhfZGJkbWFfZ2V0X2Rlc3QoZHAtPmRtYW5yLCAodm9pZCAqKSgmb2J1ZiksICZvYnl0ZXMpOworCisJaWYgKChkcC0+Y291bnQgKyBvYnl0ZXMpID4gZHAtPmRtYXNpemUpIHsKKwkJLyogT3ZlcnJ1bi4gU3RvcCBBREMgYW5kIGxvZyB0aGUgZXJyb3IKKwkJKi8KKwkJc3RvcF9hZGMocyk7CisJCWRwLT5lcnJvcisrOworCQllcnIoImFkYyBvdmVycnVuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBQdXQgYSBuZXcgZW1wdHkgYnVmZmVyIG9uIHRoZSBkZXN0aW5hdGlvbiBETUEuCisJKi8KKwlhdTF4eHhfZGJkbWFfcHV0X2Rlc3QoZHAtPmRtYW5yLCBkcC0+bmV4dEluLCBkcC0+ZG1hX2ZyYWdzaXplKTsKKworCWRwLT5uZXh0SW4gKz0gZHAtPmRtYV9mcmFnc2l6ZTsKKwlpZiAoZHAtPm5leHRJbiA+PSBkcC0+cmF3YnVmICsgZHAtPmRtYXNpemUpCisJCWRwLT5uZXh0SW4gLT0gZHAtPmRtYXNpemU7CisKKwlkcC0+Y291bnQgKz0gb2J5dGVzOworCWRwLT50b3RhbF9ieXRlcyArPSBvYnl0ZXM7CisKKwkvKiB3YWtlIHVwIGFueWJvZHkgbGlzdGVuaW5nCisJKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZHAtPndhaXQpKQorCQl3YWtlX3VwKCZkcC0+d2FpdCk7CisKK30KKworc3RhdGljIGxvZmZfdAorYXUxNTUwX2xsc2VlayhzdHJ1Y3QgZmlsZSAqZmlsZSwgbG9mZl90IG9mZnNldCwgaW50IG9yaWdpbikKK3sKKwlyZXR1cm4gLUVTUElQRTsKK30KKworCitzdGF0aWMgaW50CithdTE1NTBfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gJmF1MTU1MF9zdGF0ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYXUxNTUwX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CittaXhkZXZfaW9jdGwoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1bnNpZ25lZCBpbnQgY21kLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50CithdTE1NTBfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBzLT5jb2RlYzsKKworCXJldHVybiBtaXhkZXZfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBhdTE1NTBfbWl4ZXJfZm9wcyA9IHsKKwlvd25lcjpUSElTX01PRFVMRSwKKwlsbHNlZWs6YXUxNTUwX2xsc2VlaywKKwlpb2N0bDphdTE1NTBfaW9jdGxfbWl4ZGV2LAorCW9wZW46YXUxNTUwX29wZW5fbWl4ZGV2LAorCXJlbGVhc2U6YXUxNTUwX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworc3RhdGljIGludAorZHJhaW5fZGFjKHN0cnVjdCBhdTE1NTBfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgIGNvdW50LCB0bW87CisKKwlpZiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwgIXMtPmRtYV9kYWMucmVhZHkgfHwgcy0+ZG1hX2RhYy5zdG9wcGVkKQorCQlyZXR1cm4gMDsKKworCWZvciAoOzspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSBzLT5kbWFfZGFjLmZyYWdzaXplKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlpZiAobm9uYmxvY2spCisJCQlyZXR1cm4gLUVCVVNZOworCQl0bW8gPSAxMDAwICogY291bnQgLyAocy0+bm9fdnJhID8KKwkJCQkgICAgICA0ODAwMCA6IHMtPmRtYV9kYWMuc2FtcGxlX3JhdGUpOworCQl0bW8gLz0gcy0+ZG1hX2RhYy5kbWFfYnl0ZXNfcGVyX3NhbXBsZTsKKwkJYXUxNTUwX2RlbGF5KHRtbyk7CisJfQorCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB1OCBTMTZfVE9fVTgoczE2IGNoKQoreworCXJldHVybiAodTgpIChjaCA+PiA4KSArIDB4ODA7Cit9CitzdGF0aWMgaW5saW5lIHMxNiBVOF9UT19TMTYodTggY2gpCit7CisJcmV0dXJuIChzMTYpIChjaCAtIDB4ODApIDw8IDg7Cit9CisKKy8qCisgKiBUcmFuc2xhdGVzIHVzZXIgc2FtcGxlcyB0byBkbWEgYnVmZmVyIHN1aXRhYmxlIGZvciBBQyc5NyBEQUMgZGF0YToKKyAqICAgICBJZiBtb25vLCBjb3B5IGxlZnQgY2hhbm5lbCB0byByaWdodCBjaGFubmVsIGluIGRtYSBidWZmZXIuCisgKiAgICAgSWYgOCBiaXQgc2FtcGxlcywgY3Z0IHRvIDE2LWJpdCBiZWZvcmUgd3JpdGluZyB0byBkbWEgYnVmZmVyLgorICogICAgIElmIGludGVycG9sYXRpbmcgKG5vIFZSQSksIGR1cGxpY2F0ZSBldmVyeSBhdWRpbyBmcmFtZSBzcmNfZmFjdG9yIHRpbWVzLgorICovCitzdGF0aWMgaW50Cit0cmFuc2xhdGVfZnJvbV91c2VyKHN0cnVjdCBkbWFidWYgKmRiLCBjaGFyKiBkbWFidWYsIGNoYXIqIHVzZXJidWYsCisJCQkJCQkJICAgICAgIGludCBkbWFjb3VudCkKK3sKKwlpbnQgICAgICAgICAgICAgc2FtcGxlLCBpOworCWludCAgICAgICAgICAgICBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKwlpbnQgICAgICAgICAgICAgbnVtX3NhbXBsZXM7CisJaW50ICAgICAgICAgICAgIG1vbm8gPSAoZGItPm51bV9jaGFubmVscyA9PSAxKTsKKwljaGFyICAgICAgICAgICAgdXNlcnNhbXBsZVsxMl07CisJczE2ICAgICAgICAgICAgIGNoLCBkbWFzYW1wbGVbNl07CisKKwlpZiAoZGItPnNhbXBsZV9zaXplID09IDE2ICYmICFtb25vICYmIGRiLT5zcmNfZmFjdG9yID09IDEpIHsKKwkJLyogbm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5LCBqdXN0IGNvcHkKKwkJKi8KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1ZiwgdXNlcmJ1ZiwgZG1hY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBkbWFjb3VudDsKKwl9CisKKwlpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZSA9IGRiLT5kbWFfYnl0ZXNfcGVyX3NhbXBsZSAqIGRiLT5zcmNfZmFjdG9yOworCW51bV9zYW1wbGVzID0gZG1hY291bnQgLyBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKworCWZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgbnVtX3NhbXBsZXM7IHNhbXBsZSsrKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcih1c2Vyc2FtcGxlLCB1c2VyYnVmLAorCQkJCSAgIGRiLT51c2VyX2J5dGVzX3Blcl9zYW1wbGUpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBkYi0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChkYi0+c2FtcGxlX3NpemUgPT0gOCkKKwkJCQljaCA9IFU4X1RPX1MxNih1c2Vyc2FtcGxlW2ldKTsKKwkJCWVsc2UKKwkJCQljaCA9ICooKHMxNiAqKSAoJnVzZXJzYW1wbGVbaSAqIDJdKSk7CisJCQlkbWFzYW1wbGVbaV0gPSBjaDsKKwkJCWlmIChtb25vKQorCQkJCWRtYXNhbXBsZVtpICsgMV0gPSBjaDsJLyogcmlnaHQgY2hhbm5lbCAqLworCQl9CisKKwkJLyogZHVwbGljYXRlIGV2ZXJ5IGF1ZGlvIGZyYW1lIHNyY19mYWN0b3IgdGltZXMKKwkJKi8KKwkJZm9yIChpID0gMDsgaSA8IGRiLT5zcmNfZmFjdG9yOyBpKyspCisJCQltZW1jcHkoZG1hYnVmLCBkbWFzYW1wbGUsIGRiLT5kbWFfYnl0ZXNfcGVyX3NhbXBsZSk7CisKKwkJdXNlcmJ1ZiArPSBkYi0+dXNlcl9ieXRlc19wZXJfc2FtcGxlOworCQlkbWFidWYgKz0gaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7CisJfQorCisJcmV0dXJuIG51bV9zYW1wbGVzICogaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7Cit9CisKKy8qCisgKiBUcmFuc2xhdGVzIEFDJzk3IEFEQyBzYW1wbGVzIHRvIHVzZXIgYnVmZmVyOgorICogICAgIElmIG1vbm8sIHNlbmQgb25seSBsZWZ0IGNoYW5uZWwgdG8gdXNlciBidWZmZXIuCisgKiAgICAgSWYgOCBiaXQgc2FtcGxlcywgY3Z0IGZyb20gMTYgdG8gOCBiaXQgYmVmb3JlIHdyaXRpbmcgdG8gdXNlciBidWZmZXIuCisgKiAgICAgSWYgZGVjaW1hdGluZyAobm8gVlJBKSwgc2tpcCBvdmVyIHNyY19mYWN0b3IgYXVkaW8gZnJhbWVzLgorICovCitzdGF0aWMgaW50Cit0cmFuc2xhdGVfdG9fdXNlcihzdHJ1Y3QgZG1hYnVmICpkYiwgY2hhciogdXNlcmJ1ZiwgY2hhciogZG1hYnVmLAorCQkJCQkJCSAgICAgaW50IGRtYWNvdW50KQoreworCWludCAgICAgICAgICAgICBzYW1wbGUsIGk7CisJaW50ICAgICAgICAgICAgIGludGVycF9ieXRlc19wZXJfc2FtcGxlOworCWludCAgICAgICAgICAgICBudW1fc2FtcGxlczsKKwlpbnQgICAgICAgICAgICAgbW9ubyA9IChkYi0+bnVtX2NoYW5uZWxzID09IDEpOworCWNoYXIgICAgICAgICAgICB1c2Vyc2FtcGxlWzEyXTsKKworCWlmIChkYi0+c2FtcGxlX3NpemUgPT0gMTYgJiYgIW1vbm8gJiYgZGItPnNyY19mYWN0b3IgPT0gMSkgeworCQkvKiBubyB0cmFuc2xhdGlvbiBuZWNlc3NhcnksIGp1c3QgY29weQorCQkqLworCQlpZiAoY29weV90b191c2VyKHVzZXJidWYsIGRtYWJ1ZiwgZG1hY291bnQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiBkbWFjb3VudDsKKwl9CisKKwlpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZSA9IGRiLT5kbWFfYnl0ZXNfcGVyX3NhbXBsZSAqIGRiLT5zcmNfZmFjdG9yOworCW51bV9zYW1wbGVzID0gZG1hY291bnQgLyBpbnRlcnBfYnl0ZXNfcGVyX3NhbXBsZTsKKworCWZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgbnVtX3NhbXBsZXM7IHNhbXBsZSsrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkYi0+bnVtX2NoYW5uZWxzOyBpKyspIHsKKwkJCWlmIChkYi0+c2FtcGxlX3NpemUgPT0gOCkKKwkJCQl1c2Vyc2FtcGxlW2ldID0KKwkJCQkJUzE2X1RPX1U4KCooKHMxNiAqKSAoJmRtYWJ1ZltpICogMl0pKSk7CisJCQllbHNlCisJCQkJKigoczE2ICopICgmdXNlcnNhbXBsZVtpICogMl0pKSA9CisJCQkJCSooKHMxNiAqKSAoJmRtYWJ1ZltpICogMl0pKTsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIodXNlcmJ1ZiwgdXNlcnNhbXBsZSwKKwkJCQkgZGItPnVzZXJfYnl0ZXNfcGVyX3NhbXBsZSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJdXNlcmJ1ZiArPSBkYi0+dXNlcl9ieXRlc19wZXJfc2FtcGxlOworCQlkbWFidWYgKz0gaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7CisJfQorCisJcmV0dXJuIG51bV9zYW1wbGVzICogaW50ZXJwX2J5dGVzX3Blcl9zYW1wbGU7Cit9CisKKy8qCisgKiBDb3B5IGF1ZGlvIGRhdGEgdG8vZnJvbSB1c2VyIGJ1ZmZlciBmcm9tL3RvIGRtYSBidWZmZXIsIHRha2luZyBjYXJlCisgKiB0aGF0IHdlIHdyYXAgd2hlbiByZWFkaW5nL3dyaXRpbmcgdGhlIGRtYSBidWZmZXIuIFJldHVybnMgYWN0dWFsIGJ5dGUKKyAqIGNvdW50IHdyaXR0ZW4gdG8gb3IgcmVhZCBmcm9tIHRoZSBkbWEgYnVmZmVyLgorICovCitzdGF0aWMgaW50Citjb3B5X2RtYWJ1Zl91c2VyKHN0cnVjdCBkbWFidWYgKmRiLCBjaGFyKiB1c2VyYnVmLCBpbnQgY291bnQsIGludCB0b191c2VyKQoreworCWNoYXIgICAgICAgICAgICpidWZwdHIgPSB0b191c2VyID8gZGItPm5leHRPdXQgOiBkYi0+bmV4dEluOworCWNoYXIgICAgICAgICAgICpidWZlbmQgPSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemU7CisJaW50ICAgICAgICAgICAgIGNudCwgcmV0OworCisJaWYgKGJ1ZnB0ciArIGNvdW50ID4gYnVmZW5kKSB7CisJCWludCAgICAgICAgICAgICBwYXJ0aWFsID0gKGludCkgKGJ1ZmVuZCAtIGJ1ZnB0cik7CisJCWlmICh0b191c2VyKSB7CisJCQlpZiAoKGNudCA9IHRyYW5zbGF0ZV90b191c2VyKGRiLCB1c2VyYnVmLAorCQkJCQkJICAgICBidWZwdHIsIHBhcnRpYWwpKSA8IDApCisJCQkJcmV0dXJuIGNudDsKKwkJCXJldCA9IGNudDsKKwkJCWlmICgoY250ID0gdHJhbnNsYXRlX3RvX3VzZXIoZGIsIHVzZXJidWYgKyBwYXJ0aWFsLAorCQkJCQkJICAgICBkYi0+cmF3YnVmLAorCQkJCQkJICAgICBjb3VudCAtIHBhcnRpYWwpKSA8IDApCisJCQkJcmV0dXJuIGNudDsKKwkJCXJldCArPSBjbnQ7CisJCX0gZWxzZSB7CisJCQlpZiAoKGNudCA9IHRyYW5zbGF0ZV9mcm9tX3VzZXIoZGIsIGJ1ZnB0ciwgdXNlcmJ1ZiwKKwkJCQkJCSAgICAgICBwYXJ0aWFsKSkgPCAwKQorCQkJCXJldHVybiBjbnQ7CisJCQlyZXQgPSBjbnQ7CisJCQlpZiAoKGNudCA9IHRyYW5zbGF0ZV9mcm9tX3VzZXIoZGIsIGRiLT5yYXdidWYsCisJCQkJCQkgICAgICAgdXNlcmJ1ZiArIHBhcnRpYWwsCisJCQkJCQkgICAgICAgY291bnQgLSBwYXJ0aWFsKSkgPCAwKQorCQkJCXJldHVybiBjbnQ7CisJCQlyZXQgKz0gY250OworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHRvX3VzZXIpCisJCQlyZXQgPSB0cmFuc2xhdGVfdG9fdXNlcihkYiwgdXNlcmJ1ZiwgYnVmcHRyLCBjb3VudCk7CisJCWVsc2UKKwkJCXJldCA9IHRyYW5zbGF0ZV9mcm9tX3VzZXIoZGIsIGJ1ZnB0ciwgdXNlcmJ1ZiwgY291bnQpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHNzaXplX3QKK2F1MTU1MF9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICAqZGIgPSAmcy0+ZG1hX2FkYzsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90ICAgICAgICAgcmV0OworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlpbnQgICAgICAgICAgICAgY250LCB1c2VyY250LCBhdmFpbDsKKworCWlmIChkYi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisKKwljb3VudCAqPSBkYi0+Y250X2ZhY3RvcjsKKworCWRvd24oJnMtPnNlbSk7CisJYWRkX3dhaXRfcXVldWUoJmRiLT53YWl0LCAmd2FpdCk7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8qIHdhaXQgZm9yIHNhbXBsZXMgaW4gQURDIGRtYSBidWZmZXIKKwkJKi8KKwkJZG8geworCQkJaWYgKGRiLT5zdG9wcGVkKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlhdmFpbCA9IGRiLT5jb3VudDsKKwkJCWlmIChhdmFpbCA8PSAwKQorCQkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChhdmFpbCA8PSAwKSB7CisJCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJCWlmICghcmV0KQorCQkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCXVwKCZzLT5zZW0pOworCQkJCXNjaGVkdWxlKCk7CisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCWlmICghcmV0KQorCQkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCQlnb3RvIG91dDI7CisJCQkJfQorCQkJCWRvd24oJnMtPnNlbSk7CisJCQl9CisJCX0gd2hpbGUgKGF2YWlsIDw9IDApOworCisJCS8qIGNvcHkgZnJvbSBuZXh0T3V0IHRvIHVzZXIKKwkJKi8KKwkJaWYgKChjbnQgPSBjb3B5X2RtYWJ1Zl91c2VyKGRiLCBidWZmZXIsCisJCQkJCSAgICBjb3VudCA+IGF2YWlsID8KKwkJCQkJICAgIGF2YWlsIDogY291bnQsIDEpKSA8IDApIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWRiLT5jb3VudCAtPSBjbnQ7CisJCWRiLT5uZXh0T3V0ICs9IGNudDsKKwkJaWYgKGRiLT5uZXh0T3V0ID49IGRiLT5yYXdidWYgKyBkYi0+ZG1hc2l6ZSkKKwkJCWRiLT5uZXh0T3V0IC09IGRiLT5kbWFzaXplOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkJY291bnQgLT0gY250OworCQl1c2VyY250ID0gY250IC8gZGItPmNudF9mYWN0b3I7CisJCWJ1ZmZlciArPSB1c2VyY250OworCQlyZXQgKz0gdXNlcmNudDsKKwl9CQkJLyogd2hpbGUgKGNvdW50ID4gMCkgKi8KKworb3V0OgorCXVwKCZzLT5zZW0pOworb3V0MjoKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZGItPndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CithdTE1NTBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICAqZGIgPSAmcy0+ZG1hX2RhYzsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90ICAgICAgICAgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgIGNudCwgdXNlcmNudCwgYXZhaWw7CisKKwlwcl9kZWJ1Zygid3JpdGU6IGNvdW50PSVkXG4iLCBjb3VudCk7CisKKwlpZiAoZGItPm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJY291bnQgKj0gZGItPmNudF9mYWN0b3I7CisKKwlkb3duKCZzLT5zZW0pOworCWFkZF93YWl0X3F1ZXVlKCZkYi0+d2FpdCwgJndhaXQpOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkvKiB3YWl0IGZvciBzcGFjZSBpbiBwbGF5YmFjayBidWZmZXIKKwkJKi8KKwkJZG8geworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWF2YWlsID0gKGludCkgZGItPmRtYXNpemUgLSBkYi0+Y291bnQ7CisJCQlpZiAoYXZhaWwgPD0gMCkKKwkJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoYXZhaWwgPD0gMCkgeworCQkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQl1cCgmcy0+c2VtKTsKKwkJCQlzY2hlZHVsZSgpOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQkJZ290byBvdXQyOworCQkJCX0KKwkJCQlkb3duKCZzLT5zZW0pOworCQkJfQorCQl9IHdoaWxlIChhdmFpbCA8PSAwKTsKKworCQkvKiBjb3B5IGZyb20gdXNlciB0byBuZXh0SW4KKwkJKi8KKwkJaWYgKChjbnQgPSBjb3B5X2RtYWJ1Zl91c2VyKGRiLCAoY2hhciAqKSBidWZmZXIsCisJCQkJCSAgICBjb3VudCA+IGF2YWlsID8KKwkJCQkJICAgIGF2YWlsIDogY291bnQsIDApKSA8IDApIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWRiLT5jb3VudCArPSBjbnQ7CisJCWRiLT5uZXh0SW4gKz0gY250OworCQlpZiAoZGItPm5leHRJbiA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQlkYi0+bmV4dEluIC09IGRiLT5kbWFzaXplOworCisJCS8qIElmIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSwgd2Ugd2FudCB0byBrZWVwIHR3byBidWZmZXJzCisJCSAqIG9uIHRoZSBkbWEgcXVldWUuICBJZiB0aGUgcXVldWUgY291bnQgcmVhY2hlcyB6ZXJvLAorCQkgKiB3ZSBrbm93IHRoZSBkbWEgaGFzIHN0b3BwZWQuCisJCSAqLworCQl3aGlsZSAoKGRiLT5kbWFfcWNvdW50IDwgMikgJiYgKGRiLT5jb3VudCA+PSBkYi0+ZnJhZ3NpemUpKSB7CisJCQlpZiAoYXUxeHh4X2RiZG1hX3B1dF9zb3VyY2UoZGItPmRtYW5yLCBkYi0+bmV4dE91dCwKKwkJCQkJCQlkYi0+ZnJhZ3NpemUpID09IDApIHsKKwkJCQllcnIoInFjb3VudCA8IDIgYW5kIG5vIHJpbmcgcm9vbSEiKTsKKwkJCX0KKwkJCWRiLT5uZXh0T3V0ICs9IGRiLT5mcmFnc2l6ZTsKKwkJCWlmIChkYi0+bmV4dE91dCA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQkJZGItPm5leHRPdXQgLT0gZGItPmRtYXNpemU7CisJCQlkYi0+dG90YWxfYnl0ZXMgKz0gZGItPmRtYV9mcmFnc2l6ZTsKKwkJCWlmIChkYi0+ZG1hX3Fjb3VudCA9PSAwKQorCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCWRiLT5kbWFfcWNvdW50Kys7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJCWNvdW50IC09IGNudDsKKwkJdXNlcmNudCA9IGNudCAvIGRiLT5jbnRfZmFjdG9yOworCQlidWZmZXIgKz0gdXNlcmNudDsKKwkJcmV0ICs9IHVzZXJjbnQ7CisJfQkJCS8qIHdoaWxlIChjb3VudCA+IDApICovCisKK291dDoKKwl1cCgmcy0+c2VtKTsKK291dDI6CisJcmVtb3ZlX3dhaXRfcXVldWUoJmRiLT53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50CithdTE1NTBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJdW5zaWduZWQgaW50ICAgIG1hc2sgPSAwOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5kbWFfZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49CisJCQkgICAgKHNpZ25lZClzLT5kbWFfZGFjLmRtYV9mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9IGVsc2UgeworCQkJaWYgKChzaWduZWQpIHMtPmRtYV9kYWMuZG1hc2l6ZSA+PQorCQkJICAgIHMtPmRtYV9kYWMuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMuZG1hX2ZyYWdzaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50CithdTE1NTBfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGF1MTU1MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgYXUxNTUwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgICpkYjsKKwl1bnNpZ25lZCBsb25nICAgc2l6ZTsKKwlpbnQgcmV0ID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisJZG93bigmcy0+c2VtKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQorCQlkYiA9ICZzLT5kbWFfZGFjOworCWVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKQorCQlkYiA9ICZzLT5kbWFfYWRjOworCWVsc2UgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHBhZ2VfdG9fcGZuKHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKSksCisJCQkgICAgIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisJdm1hLT52bV9mbGFncyAmPSB+Vk1fSU87CisJZGItPm1hcHBlZCA9IDE7CitvdXQ6CisJdXAoJnMtPnNlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKKyNpZmRlZiBERUJVRworc3RhdGljIHN0cnVjdCBpb2N0bF9zdHJfdCB7CisJdW5zaWduZWQgaW50ICAgIGNtZDsKKwljb25zdCBjaGFyICAgICAqc3RyOworfSBpb2N0bF9zdHJbXSA9IHsKKwl7U05EQ1RMX0RTUF9SRVNFVCwgIlNORENUTF9EU1BfUkVTRVQifSwKKwl7U05EQ1RMX0RTUF9TWU5DLCAiU05EQ1RMX0RTUF9TWU5DIn0sCisJe1NORENUTF9EU1BfU1BFRUQsICJTTkRDVExfRFNQX1NQRUVEIn0sCisJe1NORENUTF9EU1BfU1RFUkVPLCAiU05EQ1RMX0RTUF9TVEVSRU8ifSwKKwl7U05EQ1RMX0RTUF9HRVRCTEtTSVpFLCAiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIn0sCisJe1NORENUTF9EU1BfU0FNUExFU0laRSwgIlNORENUTF9EU1BfU0FNUExFU0laRSJ9LAorCXtTTkRDVExfRFNQX0NIQU5ORUxTLCAiU05EQ1RMX0RTUF9DSEFOTkVMUyJ9LAorCXtTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFMsICJTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFMifSwKKwl7U09VTkRfUENNX1dSSVRFX0ZJTFRFUiwgIlNPVU5EX1BDTV9XUklURV9GSUxURVIifSwKKwl7U05EQ1RMX0RTUF9QT1NULCAiU05EQ1RMX0RTUF9QT1NUIn0sCisJe1NORENUTF9EU1BfU1VCRElWSURFLCAiU05EQ1RMX0RTUF9TVUJESVZJREUifSwKKwl7U05EQ1RMX0RTUF9TRVRGUkFHTUVOVCwgIlNORENUTF9EU1BfU0VURlJBR01FTlQifSwKKwl7U05EQ1RMX0RTUF9HRVRGTVRTLCAiU05EQ1RMX0RTUF9HRVRGTVRTIn0sCisJe1NORENUTF9EU1BfU0VURk1ULCAiU05EQ1RMX0RTUF9TRVRGTVQifSwKKwl7U05EQ1RMX0RTUF9HRVRPU1BBQ0UsICJTTkRDVExfRFNQX0dFVE9TUEFDRSJ9LAorCXtTTkRDVExfRFNQX0dFVElTUEFDRSwgIlNORENUTF9EU1BfR0VUSVNQQUNFIn0sCisJe1NORENUTF9EU1BfTk9OQkxPQ0ssICJTTkRDVExfRFNQX05PTkJMT0NLIn0sCisJe1NORENUTF9EU1BfR0VUQ0FQUywgIlNORENUTF9EU1BfR0VUQ0FQUyJ9LAorCXtTTkRDVExfRFNQX0dFVFRSSUdHRVIsICJTTkRDVExfRFNQX0dFVFRSSUdHRVIifSwKKwl7U05EQ1RMX0RTUF9TRVRUUklHR0VSLCAiU05EQ1RMX0RTUF9TRVRUUklHR0VSIn0sCisJe1NORENUTF9EU1BfR0VUSVBUUiwgIlNORENUTF9EU1BfR0VUSVBUUiJ9LAorCXtTTkRDVExfRFNQX0dFVE9QVFIsICJTTkRDVExfRFNQX0dFVE9QVFIifSwKKwl7U05EQ1RMX0RTUF9NQVBJTkJVRiwgIlNORENUTF9EU1BfTUFQSU5CVUYifSwKKwl7U05EQ1RMX0RTUF9NQVBPVVRCVUYsICJTTkRDVExfRFNQX01BUE9VVEJVRiJ9LAorCXtTTkRDVExfRFNQX1NFVFNZTkNSTywgIlNORENUTF9EU1BfU0VUU1lOQ1JPIn0sCisJe1NORENUTF9EU1BfU0VURFVQTEVYLCAiU05EQ1RMX0RTUF9TRVREVVBMRVgifSwKKwl7U05EQ1RMX0RTUF9HRVRPREVMQVksICJTTkRDVExfRFNQX0dFVE9ERUxBWSJ9LAorCXtTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLLCAiU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSyJ9LAorCXtTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTCwgIlNORENUTF9EU1BfQklORF9DSEFOTkVMIn0sCisJe09TU19HRVRWRVJTSU9OLCAiT1NTX0dFVFZFUlNJT04ifSwKKwl7U09VTkRfUENNX1JFQURfUkFURSwgIlNPVU5EX1BDTV9SRUFEX1JBVEUifSwKKwl7U09VTkRfUENNX1JFQURfQ0hBTk5FTFMsICJTT1VORF9QQ01fUkVBRF9DSEFOTkVMUyJ9LAorCXtTT1VORF9QQ01fUkVBRF9CSVRTLCAiU09VTkRfUENNX1JFQURfQklUUyJ9LAorCXtTT1VORF9QQ01fUkVBRF9GSUxURVIsICJTT1VORF9QQ01fUkVBRF9GSUxURVIifQorfTsKKyNlbmRpZgorCitzdGF0aWMgaW50CitkbWFfY291bnRfZG9uZShzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlpZiAoZGItPnN0b3BwZWQpCisJCXJldHVybiAwOworCisJcmV0dXJuIGRiLT5kbWFfZnJhZ3NpemUgLSBhdTF4eHhfZ2V0X2RtYV9yZXNpZHVlKGRiLT5kbWFucik7Cit9CisKKworc3RhdGljIGludAorYXUxNTUwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJYXVkaW9fYnVmX2luZm8gIGFiaW5mbzsKKwljb3VudF9pbmZvICAgICAgY2luZm87CisJaW50ICAgICAgICAgICAgIGNvdW50OworCWludCAgICAgICAgICAgICB2YWwsIG1hcHBlZCwgcmV0LCBkaWZmOworCisJbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYy5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCisjaWZkZWYgREVCVUcKKwlmb3IgKGNvdW50PTA7IGNvdW50PHNpemVvZihpb2N0bF9zdHIpL3NpemVvZihpb2N0bF9zdHJbMF0pOyBjb3VudCsrKSB7CisJCWlmIChpb2N0bF9zdHJbY291bnRdLmNtZCA9PSBjbWQpCisJCQlicmVhazsKKwl9CisJaWYgKGNvdW50IDwgc2l6ZW9mKGlvY3RsX3N0cikgLyBzaXplb2YoaW9jdGxfc3RyWzBdKSkKKwkJcHJfZGVidWcoImlvY3RsICVzLCBhcmc9MHglbHhuIiwgaW9jdGxfc3RyW2NvdW50XS5zdHIsIGFyZyk7CisJZWxzZQorCQlwcl9kZWJ1ZygiaW9jdGwgMHgleCB1bmtub3duLCBhcmc9MHglbHhcbiIsIGNtZCwgYXJnKTsKKyNlbmRpZgorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfUkVBTFRJTUUgfAorCQkJCURTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEoKTsKKwkJCXMtPmRtYV9kYWMuY291bnQgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzID0gMDsKKwkJCXMtPmRtYV9kYWMubmV4dEluID0gcy0+ZG1hX2RhYy5uZXh0T3V0ID0KKwkJCQlzLT5kbWFfZGFjLnJhd2J1ZjsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEoKTsKKwkJCXMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKKwkJCXMtPmRtYV9hZGMubmV4dEluID0gcy0+ZG1hX2FkYy5uZXh0T3V0ID0KKwkJCQlzLT5kbWFfYWRjLnJhd2J1ZjsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPj0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzZXRfYWRjX3JhdGUocywgdmFsKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXNldF9kYWNfcmF0ZShzLCB2YWwpOworCQkJfQorCQkJaWYgKHMtPm9wZW5fbW9kZSAmIEZNT0RFX1JFQUQpCisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJaWYgKHMtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KKwkJCQlzLT5kbWFfYWRjLnNhbXBsZV9yYXRlIDoKKwkJCQlzLT5kbWFfZGFjLnNhbXBsZV9yYXRlLAorCQkJCShpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXMtPmRtYV9hZGMubnVtX2NoYW5uZWxzID0gdmFsID8gMiA6IDE7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5udW1fY2hhbm5lbHMgPSB2YWwgPyAyIDogMTsKKwkJCWlmIChzLT5jb2RlY19leHRfY2FwcyAmIEFDOTdfRVhUX0RBQ1MpIHsKKwkJCQkvKiBkaXNhYmxlIHN1cnJvdW5kIGFuZCBjZW50ZXIvbGZlIGluIEFDJzk3CisJCQkJKi8KKwkJCQl1MTYgZXh0X3N0YXQgPSByZGNvZGVjKHMtPmNvZGVjLAorCQkJCQkJICAgICAgIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJCQl3cmNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUywKKwkJCQkJZXh0X3N0YXQgfCAoQUM5N19FWFRTVEFUX1BSSSB8CisJCQkJCQkgICAgQUM5N19FWFRTVEFUX1BSSiB8CisJCQkJCQkgICAgQUM5N19FWFRTVEFUX1BSSykpOworCQkJfQorCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMikKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5udW1fY2hhbm5lbHMgPSB2YWw7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3dpdGNoICh2YWwpIHsKKwkJCQljYXNlIDE6CisJCQkJY2FzZSAyOgorCQkJCQlicmVhazsKKwkJCQljYXNlIDM6CisJCQkJY2FzZSA1OgorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQljYXNlIDQ6CisJCQkJCWlmICghKHMtPmNvZGVjX2V4dF9jYXBzICYKKwkJCQkJICAgICAgQUM5N19FWFRJRF9TREFDKSkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlicmVhazsKKwkJCQljYXNlIDY6CisJCQkJCWlmICgocy0+Y29kZWNfZXh0X2NhcHMgJgorCQkJCQkgICAgIEFDOTdfRVhUX0RBQ1MpICE9IEFDOTdfRVhUX0RBQ1MpCisJCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJc3RvcF9kYWMocyk7CisJCQkJaWYgKHZhbCA8PSAyICYmCisJCQkJICAgIChzLT5jb2RlY19leHRfY2FwcyAmIEFDOTdfRVhUX0RBQ1MpKSB7CisJCQkJCS8qIGRpc2FibGUgc3Vycm91bmQgYW5kIGNlbnRlci9sZmUKKwkJCQkJICogY2hhbm5lbHMgaW4gQUMnOTcKKwkJCQkJICovCisJCQkJCXUxNiAgICAgICAgICAgICBleHRfc3RhdCA9CisJCQkJCQlyZGNvZGVjKHMtPmNvZGVjLAorCQkJCQkJCUFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJCQkJd3Jjb2RlYyhzLT5jb2RlYywKKwkJCQkJCUFDOTdfRVhURU5ERURfU1RBVFVTLAorCQkJCQkJZXh0X3N0YXQgfCAoQUM5N19FWFRTVEFUX1BSSSB8CisJCQkJCQkJICAgIEFDOTdfRVhUU1RBVF9QUkogfAorCQkJCQkJCSAgICBBQzk3X0VYVFNUQVRfUFJLKSk7CisJCQkJfSBlbHNlIGlmICh2YWwgPj0gNCkgeworCQkJCQkvKiBlbmFibGUgc3Vycm91bmQsIGNlbnRlci9sZmUKKwkJCQkJICogY2hhbm5lbHMgaW4gQUMnOTcKKwkJCQkJICovCisJCQkJCXUxNiAgICAgICAgICAgICBleHRfc3RhdCA9CisJCQkJCQlyZGNvZGVjKHMtPmNvZGVjLAorCQkJCQkJCUFDOTdfRVhURU5ERURfU1RBVFVTKTsKKwkJCQkJZXh0X3N0YXQgJj0gfkFDOTdfRVhUU1RBVF9QUko7CisJCQkJCWlmICh2YWwgPT0gNikKKwkJCQkJCWV4dF9zdGF0ICY9CisJCQkJCQkJfihBQzk3X0VYVFNUQVRfUFJJIHwKKwkJCQkJCQkgIEFDOTdfRVhUU1RBVF9QUkspOworCQkJCQl3cmNvZGVjKHMtPmNvZGVjLAorCQkJCQkJQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCQkJCQlleHRfc3RhdCk7CisJCQkJfQorCisJCQkJcy0+ZG1hX2RhYy5udW1fY2hhbm5lbHMgPSB2YWw7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgkvKiBSZXR1cm5zIGEgbWFzayAqLworCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEUgfCBBRk1UX1U4LCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOgkvKiBTZWxlY3RzIE9ORSBmbXQgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5kbWFfYWRjLnNhbXBsZV9zaXplID0gMTY7CisJCQkJZWxzZSB7CisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJCXMtPmRtYV9hZGMuc2FtcGxlX3NpemUgPSA4OworCQkJCX0KKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlzLT5kbWFfZGFjLnNhbXBsZV9zaXplID0gMTY7CisJCQkJZWxzZSB7CisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJCXMtPmRtYV9kYWMuc2FtcGxlX3NpemUgPSA4OworCQkJCX0KKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQl2YWwgPSAocy0+ZG1hX2FkYy5zYW1wbGVfc2l6ZSA9PSAxNikgPworCQkJCQlBRk1UX1MxNl9MRSA6IEFGTVRfVTg7CisJCQllbHNlCisJCQkJdmFsID0gKHMtPmRtYV9kYWMuc2FtcGxlX3NpemUgPT0gMTYpID8KKwkJCQkJQUZNVF9TMTZfTEUgOiBBRk1UX1U4OworCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiAhcy0+ZG1hX2FkYy5zdG9wcGVkKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiAhcy0+ZG1hX2RhYy5zdG9wcGVkKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCWVsc2UKKwkJCQlzdG9wX2FkYyhzKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkKKwkJCQlzdGFydF9kYWMocyk7CisJCQllbHNlCisJCQkJc3RvcF9kYWMocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQljb3VudCAtPSBkbWFfY291bnRfZG9uZSgmcy0+ZG1hX2RhYyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJYWJpbmZvLmJ5dGVzID0gKHMtPmRtYV9kYWMuZG1hc2l6ZSAtIGNvdW50KSAvCisJCQlzLT5kbWFfZGFjLmNudF9mYWN0b3I7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYy5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworCQlwcl9kZWJ1ZygiaW9jdGwgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6IGJ5dGVzPSVkLCBmcmFnbWVudHM9JWRcbiIsIGFiaW5mby5ieXRlcywgYWJpbmZvLmZyYWdtZW50cyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmYWJpbmZvLAorCQkJCSAgICBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ3NpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJY291bnQgKz0gZG1hX2NvdW50X2RvbmUoJnMtPmRtYV9hZGMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCWFiaW5mby5ieXRlcyA9IGNvdW50IC8gcy0+ZG1hX2FkYy5jbnRfZmFjdG9yOworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9hZGMubnVtZnJhZzsKKwkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhYmluZm8sCisJCQkJICAgIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJY291bnQgLT0gZG1hX2NvdW50X2RvbmUoJnMtPmRtYV9kYWMpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCWNvdW50IC89IHMtPmRtYV9kYWMuY250X2ZhY3RvcjsKKwkJcmV0dXJuIHB1dF91c2VyKGNvdW50LCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY2luZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmICghcy0+ZG1hX2FkYy5zdG9wcGVkKSB7CisJCQlkaWZmID0gZG1hX2NvdW50X2RvbmUoJnMtPmRtYV9hZGMpOworCQkJY291bnQgKz0gZGlmZjsKKwkJCWNpbmZvLmJ5dGVzICs9IGRpZmY7CisJCQljaW5mby5wdHIgPSAgdmlydF90b19waHlzKHMtPmRtYV9hZGMubmV4dEluKSArIGRpZmYgLQorCQkJCXZpcnRfdG9fcGh5cyhzLT5kbWFfYWRjLnJhd2J1Zik7CisJCX0gZWxzZQorCQkJY2luZm8ucHRyID0gdmlydF90b19waHlzKHMtPmRtYV9hZGMubmV4dEluKSAtCisJCQkJdmlydF90b19waHlzKHMtPmRtYV9hZGMucmF3YnVmKTsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSAocy0+ZG1hX2FkYy5kbWFfZnJhZ3NpemUtMSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKikgYXJnLCAmY2luZm8sIHNpemVvZihjaW5mbykpOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlpZiAoIXMtPmRtYV9kYWMuc3RvcHBlZCkgeworCQkJZGlmZiA9IGRtYV9jb3VudF9kb25lKCZzLT5kbWFfZGFjKTsKKwkJCWNvdW50IC09IGRpZmY7CisJCQljaW5mby5ieXRlcyArPSBkaWZmOworCQkJY2luZm8ucHRyID0gdmlydF90b19waHlzKHMtPmRtYV9kYWMubmV4dE91dCkgKyBkaWZmIC0KKwkJCQl2aXJ0X3RvX3BoeXMocy0+ZG1hX2RhYy5yYXdidWYpOworCQl9IGVsc2UKKwkJCWNpbmZvLnB0ciA9IHZpcnRfdG9fcGh5cyhzLT5kbWFfZGFjLm5leHRPdXQpIC0KKwkJCQl2aXJ0X3RvX3BoeXMocy0+ZG1hX2RhYy5yYXdidWYpOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCQlzLT5kbWFfZGFjLmNvdW50ICY9IChzLT5kbWFfZGFjLmRtYV9mcmFnc2l6ZS0xKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworCQljaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMuZnJhZ3NpemUsIChpbnQgKikgYXJnKTsKKwkJZWxzZQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9hZGMuZnJhZ3NpemUsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSA0OworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSA0OworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbikgfHwKKwkJICAgIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5kbWFfZGFjLnN1YmRpdmlzaW9uKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSB2YWw7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KKwkJCQlzLT5kbWFfYWRjLnNhbXBsZV9yYXRlIDoKKwkJCQlzLT5kbWFfZGFjLnNhbXBsZV9yYXRlLAorCQkJCShpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5udW1fY2hhbm5lbHMsIChpbnQgKilhcmcpOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5udW1fY2hhbm5lbHMsIChpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLnNhbXBsZV9zaXplLCAoaW50ICopYXJnKTsKKwkJZWxzZQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMuc2FtcGxlX3NpemUsIChpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiBtaXhkZXZfaW9jdGwocy0+Y29kZWMsIGNtZCwgYXJnKTsKK30KKworCitzdGF0aWMgaW50CithdTE1NTBfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgICAgICAgICAgICAgbWlub3IgPSBNSU5PUihpbm9kZS0+aV9yZGV2KTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgYXUxNTUwX3N0YXRlICpzID0gJmF1MTU1MF9zdGF0ZTsKKwlpbnQgICAgICAgICAgICAgcmV0OworCisjaWZkZWYgREVCVUcKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCXByX2RlYnVnKCJvcGVuOiBub24tYmxvY2tpbmdcbiIpOworCWVsc2UKKwkJcHJfZGVidWcoIm9wZW46IGJsb2NraW5nXG4iKTsKKyNlbmRpZgorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisKKwlzdG9wX2RhYyhzKTsKKwlzdG9wX2FkYyhzKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9CisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9IDA7CisJCXMtPmRtYV9hZGMubnVtX2NoYW5uZWxzID0gMTsKKwkJcy0+ZG1hX2FkYy5zYW1wbGVfc2l6ZSA9IDg7CisJCXNldF9hZGNfcmF0ZShzLCA4MDAwKTsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCXMtPmRtYV9hZGMuc2FtcGxlX3NpemUgPSAxNjsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjLm9zc21heGZyYWdzID0KKwkJCXMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzID0gMDsKKwkJcy0+ZG1hX2RhYy5udW1fY2hhbm5lbHMgPSAxOworCQlzLT5kbWFfZGFjLnNhbXBsZV9zaXplID0gODsKKwkJc2V0X2RhY19yYXRlKHMsIDgwMDApOworCQlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQkJcy0+ZG1hX2RhYy5zYW1wbGVfc2l6ZSA9IDE2OworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCXJldHVybiByZXQ7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQlyZXR1cm4gcmV0OworCX0KKworCXMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCWluaXRfTVVURVgoJnMtPnNlbSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2F1MTU1MF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAoc3RydWN0IGF1MTU1MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCWxvY2tfa2VybmVsKCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQlsb2NrX2tlcm5lbCgpOworCX0KKworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RvcF9kYWMocyk7CisJCWtmcmVlKHMtPmRtYV9kYWMucmF3YnVmKTsKKwkJcy0+ZG1hX2RhYy5yYXdidWYgPSBOVUxMOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdG9wX2FkYyhzKTsKKwkJa2ZyZWUocy0+ZG1hX2FkYy5yYXdidWYpOworCQlzLT5kbWFfYWRjLnJhd2J1ZiA9IE5VTEw7CisJfQorCXMtPm9wZW5fbW9kZSAmPSAoKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGF1MTU1MF9hdWRpb19mb3BzID0geworCW93bmVyOgkJVEhJU19NT0RVTEUsCisJbGxzZWVrOgkJYXUxNTUwX2xsc2VlaywKKwlyZWFkOgkJYXUxNTUwX3JlYWQsCisJd3JpdGU6CQlhdTE1NTBfd3JpdGUsCisJcG9sbDoJCWF1MTU1MF9wb2xsLAorCWlvY3RsOgkJYXUxNTUwX2lvY3RsLAorCW1tYXA6CQlhdTE1NTBfbW1hcCwKKwlvcGVuOgkJYXUxNTUwX29wZW4sCisJcmVsZWFzZToJYXUxNTUwX3JlbGVhc2UsCit9OworCitNT0RVTEVfQVVUSE9SKCJBZHZhbmNlZCBNaWNybyBEZXZpY2VzIChBTUQpLCBkYW5AZW1iZWRkZWRlZGdlLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBdTE1NTAgQUM5NyBBdWRpbyBEcml2ZXIiKTsKKworc3RhdGljIGludCBfX2RldmluaXQKK2F1MTU1MF9wcm9iZSh2b2lkKQoreworCXN0cnVjdCBhdTE1NTBfc3RhdGUgKnMgPSAmYXUxNTUwX3N0YXRlOworCWludCAgICAgICAgICAgICB2YWw7CisKKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBhdTE1NTBfc3RhdGUpKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9hZGMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXQpOworCWluaXRfTVVURVgoJnMtPm9wZW5fc2VtKTsKKwlzcGluX2xvY2tfaW5pdCgmcy0+bG9jayk7CisKKwlzLT5jb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKTsKKwlpZihzLT5jb2RlYyA9PSBOVUxMKSB7CisJCWVycigiT3V0IG9mIG1lbW9yeSIpOworCQlyZXR1cm4gLTE7CisJfQorCXMtPmNvZGVjLT5wcml2YXRlX2RhdGEgPSBzOworCXMtPmNvZGVjLT5pZCA9IDA7CisJcy0+Y29kZWMtPmNvZGVjX3JlYWQgPSByZGNvZGVjOworCXMtPmNvZGVjLT5jb2RlY193cml0ZSA9IHdyY29kZWM7CisJcy0+Y29kZWMtPmNvZGVjX3dhaXQgPSB3YWl0Y29kZWM7CisKKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihDUEhZU0FERFIoQUM5N19QU0NfU0VMKSwKKwkJCSAgICAweDMwLCAiQXUxNTUwIEFDOTciKSkgeworCQllcnIoIkFDJzk3IHBvcnRzIGluIHVzZSIpOworCX0KKworCS8qIEFsbG9jYXRlIHRoZSBETUEgQ2hhbm5lbHMKKwkqLworCWlmICgocy0+ZG1hX2RhYy5kbWFuciA9IGF1MXh4eF9kYmRtYV9jaGFuX2FsbG9jKERCRE1BX01FTV9DSEFOLAorCSAgICBEQkRNQV9BQzk3X1RYX0NIQU4sIGRhY19kbWFfaW50ZXJydXB0LCAodm9pZCAqKXMpKSA9PSAwKSB7CisJCWVycigiQ2FuJ3QgZ2V0IERBQyBETUEiKTsKKwkJZ290byBlcnJfZG1hMTsKKwl9CisJYXUxeHh4X2RiZG1hX3NldF9kZXZ3aWR0aChzLT5kbWFfZGFjLmRtYW5yLCAxNik7CisJaWYgKGF1MXh4eF9kYmRtYV9yaW5nX2FsbG9jKHMtPmRtYV9kYWMuZG1hbnIsCisJCQkJCU5VTV9EQkRNQV9ERVNDUklQVE9SUykgPT0gMCkgeworCQllcnIoIkNhbid0IGdldCBEQUMgRE1BIGRlc2NyaXB0b3JzIik7CisJCWdvdG8gZXJyX2RtYTE7CisJfQorCisJaWYgKChzLT5kbWFfYWRjLmRtYW5yID0gYXUxeHh4X2RiZG1hX2NoYW5fYWxsb2MoREJETUFfQUM5N19SWF9DSEFOLAorCSAgICBEQkRNQV9NRU1fQ0hBTiwgYWRjX2RtYV9pbnRlcnJ1cHQsICh2b2lkICopcykpID09IDApIHsKKwkJZXJyKCJDYW4ndCBnZXQgQURDIERNQSIpOworCQlnb3RvIGVycl9kbWEyOworCX0KKwlhdTF4eHhfZGJkbWFfc2V0X2RldndpZHRoKHMtPmRtYV9hZGMuZG1hbnIsIDE2KTsKKwlpZiAoYXUxeHh4X2RiZG1hX3JpbmdfYWxsb2Mocy0+ZG1hX2FkYy5kbWFuciwKKwkJCQkJTlVNX0RCRE1BX0RFU0NSSVBUT1JTKSA9PSAwKSB7CisJCWVycigiQ2FuJ3QgZ2V0IEFEQyBETUEgZGVzY3JpcHRvcnMiKTsKKwkJZ290byBlcnJfZG1hMjsKKwl9CisKKwlwcl9pbmZvKCJEQUM6IERNQSVkLCBBREM6IERNQSVkIiwgREJETUFfQUM5N19UWF9DSEFOLCBEQkRNQV9BQzk3X1JYX0NIQU4pOworCisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCisJaWYgKChzLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmF1MTU1MF9hdWRpb19mb3BzLCAtMSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MTsKKwlpZiAoKHMtPmNvZGVjLT5kZXZfbWl4ZXIgPQorCSAgICAgcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmF1MTU1MF9taXhlcl9mb3BzLCAtMSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MjsKKworCS8qIFRoZSBHUElPIGZvciB0aGUgYXBwcm9wcmlhdGUgUFNDIHdhcyBjb25maWd1cmVkIGJ5IHRoZQorCSAqIGJvYXJkIHNwZWNpZmljIHN0YXJ0IHVwLgorCSAqCisJICogY29uZmlndXJlIFBTQyBmb3IgQUMnOTcKKwkgKi8KKwlhdV93cml0ZWwoMCwgQUM5N19QU0NfQ1RSTCk7CS8qIERpc2FibGUgUFNDICovCisJYXVfc3luYygpOworCWF1X3dyaXRlbCgoUFNDX1NFTF9DTEtfU0VSQ0xLIHwgUFNDX1NFTF9QU19BQzk3TU9ERSksIEFDOTdfUFNDX1NFTCk7CisJYXVfc3luYygpOworCisJLyogY29sZCByZXNldCB0aGUgQUMnOTcKKwkqLworCWF1X3dyaXRlbChQU0NfQUM5N1JTVF9SU1QsIFBTQ19BQzk3UlNUKTsKKwlhdV9zeW5jKCk7CisJYXUxNTUwX2RlbGF5KDEwKTsKKwlhdV93cml0ZWwoMCwgUFNDX0FDOTdSU1QpOworCWF1X3N5bmMoKTsKKworCS8qIG5lZWQgdG8gZGVsYXkgYXJvdW5kIDUwMG1zZWMoYmxlZWNoKSB0byBnaXZlCisJICAgc29tZSBDT0RFQ3MgZW5vdWdoIHRpbWUgdG8gd2FrZXVwICovCisJYXUxNTUwX2RlbGF5KDUwMCk7CisKKwkvKiB3YXJtIHJlc2V0IHRoZSBBQyc5NyB0byBzdGFydCB0aGUgYml0Y2xrCisJKi8KKwlhdV93cml0ZWwoUFNDX0FDOTdSU1RfU05DLCBQU0NfQUM5N1JTVCk7CisJYXVfc3luYygpOworCXVkZWxheSgxMDApOworCWF1X3dyaXRlbCgwLCBQU0NfQUM5N1JTVCk7CisJYXVfc3luYygpOworCisJLyogRW5hYmxlIFBTQworCSovCisJYXVfd3JpdGVsKFBTQ19DVFJMX0VOQUJMRSwgQUM5N19QU0NfQ1RSTCk7CisJYXVfc3luYygpOworCisJLyogV2FpdCBmb3IgUFNDIHJlYWR5LgorCSovCisJZG8geworCQl2YWwgPSByZWFkbCgodm9pZCAqKVBTQ19BQzk3U1RBVCk7CisJCWF1X3N5bmMoKTsKKwl9IHdoaWxlICgodmFsICYgUFNDX0FDOTdTVEFUX1NSKSA9PSAwKTsKKworCS8qIENvbmZpZ3VyZSBBQzk3IGNvbnRyb2xsZXIuCisJICogRGVlcCBGSUZPLCAxNi1iaXQgc2FtcGxlLCBETUEsIG1ha2Ugc3VyZSBETUEgbWF0Y2hlcyBmaWZvIHNpemUuCisJICovCisJdmFsID0gUFNDX0FDOTdDRkdfU0VUX0xFTigxNik7CisJdmFsIHw9IFBTQ19BQzk3Q0ZHX1JUX0ZJRk84IHwgUFNDX0FDOTdDRkdfVFRfRklGTzg7CisKKwkvKiBFbmFibGUgZGV2aWNlIHNvIHdlIGNhbiBhdCBsZWFzdAorCSAqIHRhbGsgb3ZlciB0aGUgQUMtbGluay4KKwkgKi8KKwlhdV93cml0ZWwodmFsLCBQU0NfQUM5N0NGRyk7CisJYXVfd3JpdGVsKFBTQ19BQzk3TVNLX0FMTE1BU0ssIFBTQ19BQzk3TVNLKTsKKwlhdV9zeW5jKCk7CisJdmFsIHw9IFBTQ19BQzk3Q0ZHX0RFX0VOQUJMRTsKKwlhdV93cml0ZWwodmFsLCBQU0NfQUM5N0NGRyk7CisJYXVfc3luYygpOworCisJLyogV2FpdCBmb3IgRGV2aWNlIHJlYWR5LgorCSovCisJZG8geworCQl2YWwgPSByZWFkbCgodm9pZCAqKVBTQ19BQzk3U1RBVCk7CisJCWF1X3N5bmMoKTsKKwl9IHdoaWxlICgodmFsICYgUFNDX0FDOTdTVEFUX0RSKSA9PSAwKTsKKworCS8qIGNvZGVjIGluaXQgKi8KKwlpZiAoIWFjOTdfcHJvYmVfY29kZWMocy0+Y29kZWMpKQorCQlnb3RvIGVycl9kZXYzOworCisJcy0+Y29kZWNfYmFzZV9jYXBzID0gcmRjb2RlYyhzLT5jb2RlYywgQUM5N19SRVNFVCk7CisJcy0+Y29kZWNfZXh0X2NhcHMgPSByZGNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX0lEKTsKKwlwcl9pbmZvKCJBQyc5NyBCYXNlL0V4dGVuZGVkIElEID0gJTA0eC8lMDR4IiwKKwkgICAgIHMtPmNvZGVjX2Jhc2VfY2Fwcywgcy0+Y29kZWNfZXh0X2NhcHMpOworCisJaWYgKCEocy0+Y29kZWNfZXh0X2NhcHMgJiBBQzk3X0VYVElEX1ZSQSkpIHsKKwkJLyogY29kZWMgZG9lcyBub3Qgc3VwcG9ydCBWUkEKKwkJKi8KKwkJcy0+bm9fdnJhID0gMTsKKwl9IGVsc2UgaWYgKCF2cmEpIHsKKwkJLyogQm9vdCBvcHRpb24gc2F5cyBkaXNhYmxlIFZSQQorCQkqLworCQl1MTYgYWM5N19leHRzdGF0ID0gcmRjb2RlYyhzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCQl3cmNvZGVjKHMtPmNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUywKKwkJCWFjOTdfZXh0c3RhdCAmIH5BQzk3X0VYVFNUQVRfVlJBKTsKKwkJcy0+bm9fdnJhID0gMTsKKwl9CisJaWYgKHMtPm5vX3ZyYSkKKwkJcHJfaW5mbygibm8gVlJBLCBpbnRlcnBvbGF0aW5nIGFuZCBkZWNpbWF0aW5nIik7CisKKwkvKiBzZXQgbWljIHRvIGJlIHRoZSByZWNvcmRpbmcgc291cmNlICovCisJdmFsID0gU09VTkRfTUFTS19NSUM7CisJbWl4ZGV2X2lvY3RsKHMtPmNvZGVjLCBTT1VORF9NSVhFUl9XUklURV9SRUNTUkMsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpICZ2YWwpOworCisJcmV0dXJuIDA7CisKKyBlcnJfZGV2MzoKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLT5kZXZfbWl4ZXIpOworIGVycl9kZXYyOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisgZXJyX2RldjE6CisJYXUxeHh4X2RiZG1hX2NoYW5fZnJlZShzLT5kbWFfYWRjLmRtYW5yKTsKKyBlcnJfZG1hMjoKKwlhdTF4eHhfZGJkbWFfY2hhbl9mcmVlKHMtPmRtYV9kYWMuZG1hbnIpOworIGVycl9kbWExOgorCXJlbGVhc2VfbWVtX3JlZ2lvbihDUEhZU0FERFIoQUM5N19QU0NfU0VMKSwgMHgzMCk7CisKKwlhYzk3X3JlbGVhc2VfY29kZWMocy0+Y29kZWMpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CithdTE1NTBfcmVtb3ZlKHZvaWQpCit7CisJc3RydWN0IGF1MTU1MF9zdGF0ZSAqcyA9ICZhdTE1NTBfc3RhdGU7CisKKwlpZiAoIXMpCisJCXJldHVybjsKKwlzeW5jaHJvbml6ZV9pcnEoKTsKKwlhdTF4eHhfZGJkbWFfY2hhbl9mcmVlKHMtPmRtYV9hZGMuZG1hbnIpOworCWF1MXh4eF9kYmRtYV9jaGFuX2ZyZWUocy0+ZG1hX2RhYy5kbWFucik7CisJcmVsZWFzZV9tZW1fcmVnaW9uKENQSFlTQUREUihBQzk3X1BTQ19TRUwpLCAweDMwKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+Y29kZWMtPmRldl9taXhlcik7CisJYWM5N19yZWxlYXNlX2NvZGVjKHMtPmNvZGVjKTsKK30KKworc3RhdGljIGludCBfX2luaXQKK2luaXRfYXUxNTUwKHZvaWQpCit7CisJcmV0dXJuIGF1MTU1MF9wcm9iZSgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQKK2NsZWFudXBfYXUxNTUwKHZvaWQpCit7CisJYXUxNTUwX3JlbW92ZSgpOworfQorCittb2R1bGVfaW5pdChpbml0X2F1MTU1MCk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2F1MTU1MCk7CisKKyNpZm5kZWYgTU9EVUxFCisKK3N0YXRpYyBpbnQgX19pbml0CithdTE1NTBfc2V0dXAoY2hhciAqb3B0aW9ucykKK3sKKwljaGFyICAgICAgICAgICAqdGhpc19vcHQ7CisKKwlpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpKSB7CisJCWlmICghKnRoaXNfb3B0KQorCQkJY29udGludWU7CisJCWlmICghc3RybmNtcCh0aGlzX29wdCwgInZyYSIsIDMpKSB7CisJCQl2cmEgPSAxOworCQl9CisJfQorCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImF1MTU1MF9hdWRpbz0iLCBhdTE1NTBfc2V0dXApOworCisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYXVkaW8uYyBiL3NvdW5kL29zcy9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZGQ2M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYXVkaW8uYwpAQCAtMCwwICsxLDk4MyBAQAorLyoKKyAqIHNvdW5kL2F1ZGlvLmMKKyAqCisgKiBEZXZpY2UgZmlsZSBtYW5hZ2VyIGZvciAvZGV2L2F1ZGlvCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisvKgorICogVGhvbWFzIFNhaWxlciAgIDogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICogVGhvbWFzIFNhaWxlciAgIDogbW92ZWQgc2V2ZXJhbCBzdGF0aWMgdmFyaWFibGVzIGludG8gc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMKKyAqICAgICAgICAgICAgICAgICAgICh3aGljaCBpcyBncm9zc2x5IG1pc25hbWVkIGJ0dy4pIGJlY2F1c2UgdGhleSBoYXZlIHRoZSBzYW1lCisgKiAgICAgICAgICAgICAgICAgICBsaWZldGltZSBhcyB0aGUgcmVzdCBpbiB0aGVyZSBhbmQgZHluYW1pYyBhbGxvY2F0aW9uIHNhdmVzCisgKiAgICAgICAgICAgICAgICAgICAxMmsgb3Igc28KKyAqIFRob21hcyBTYWlsZXIgICA6IHVzZSBtb3JlIGxvZ2ljYWwgT19OT05CTE9DSyBzZW1hbnRpY3MKKyAqIERhbmllbCBSb2RyaWtzc29uOiByZXdvcmtlZCB0aGUgdXNlIG9mIHRoZSBkZXZpY2Ugc3BlY2lmaWMgY29weV91c2VyCisgKiAgICAgICAgICAgICAgICAgICAgc3RpbGwgZ2VuZXJpYworICogSG9yc3Qgdm9uIEJyYW5kOiAgQWRkIG1pc3NpbmcgI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorICogQ2hyaXMgUmFua2luICAgIDogVXBkYXRlIHRoZSBtb2R1bGUtdXNhZ2UgY291bnRlciBmb3IgdGhlIGNvcHJvY2Vzc29yLAorICogICAgICAgICAgICAgICAgICAgYW5kIGRlY3JlbWVudCB0aGUgY291bnRlcnMgYWdhaW4gaWYgd2UgY2Fubm90IG9wZW4KKyAqICAgICAgICAgICAgICAgICAgIHRoZSBhdWRpbyBkZXZpY2UuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInVsYXcuaCIKKyNpbmNsdWRlICJjb3Byb2MuaCIKKworI2RlZmluZSBORVVUUkFMOAkweDgwCisjZGVmaW5lIE5FVVRSQUwxNgkweDAwCisKKworc3RhdGljIGludCAgICAgICAgICAgICBkbWFfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZyk7CisKK3N0YXRpYyBpbnQgc2V0X2Zvcm1hdChpbnQgZGV2LCBpbnQgZm10KQoreworCWlmIChmbXQgIT0gQUZNVF9RVUVSWSkKKwl7CisJCWF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbiA9IDA7CisKKwkJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5mb3JtYXRfbWFzayAmIGZtdCkpCS8qIE5vdCBzdXBwb3J0ZWQgKi8KKwkJeworCQkJaWYgKGZtdCA9PSBBRk1UX01VX0xBVykKKwkJCXsKKwkJCQlmbXQgPSBBRk1UX1U4OworCQkJCWF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbiA9IENOVl9NVV9MQVc7CisJCQl9CisJCQllbHNlCisJCQkJZm10ID0gQUZNVF9VODsJLyogVGhpcyBpcyBhbHdheXMgc3VwcG9ydGVkICovCisJCX0KKwkJYXVkaW9fZGV2c1tkZXZdLT5hdWRpb19mb3JtYXQgPSBhdWRpb19kZXZzW2Rldl0tPmQtPnNldF9iaXRzKGRldiwgZm10KTsKKwkJYXVkaW9fZGV2c1tkZXZdLT5sb2NhbF9mb3JtYXQgPSBmbXQ7CisJfQorCWVsc2UKKwkJcmV0dXJuIGF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfZm9ybWF0OworCisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbikKKwkJcmV0dXJuIGF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbjsKKwllbHNlIAorCQlyZXR1cm4gYXVkaW9fZGV2c1tkZXZdLT5sb2NhbF9mb3JtYXQ7Cit9CisKK2ludCBhdWRpb19vcGVuKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCByZXQ7CisJaW50IGJpdHM7CisJaW50IGRldl90eXBlID0gZGV2ICYgMHgwZjsKKwlpbnQgbW9kZSA9IHRyYW5zbGF0ZV9tb2RlKGZpbGUpOworCWNvbnN0IHN0cnVjdCBhdWRpb19kcml2ZXIgKmRyaXZlcjsKKwljb25zdCBzdHJ1Y3QgY29wcm9jX29wZXJhdGlvbnMgKmNvcHJvY2Vzc29yOworCisJZGV2ID0gZGV2ID4+IDQ7CisKKwlpZiAoZGV2X3R5cGUgPT0gU05EX0RFVl9EU1AxNikKKwkJYml0cyA9IDE2OworCWVsc2UKKwkJYml0cyA9IDg7CisKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX2F1ZGlvZGV2cykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRyaXZlciA9IGF1ZGlvX2RldnNbZGV2XS0+ZDsKKworCWlmICghdHJ5X21vZHVsZV9nZXQoZHJpdmVyLT5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKChyZXQgPSBETUFidWZfb3BlbihkZXYsIG1vZGUpKSA8IDApCisJCWdvdG8gZXJyb3JfMTsKKworCWlmICggKGNvcHJvY2Vzc29yID0gYXVkaW9fZGV2c1tkZXZdLT5jb3Byb2MpICE9IE5VTEwgKSB7CisJCWlmICghdHJ5X21vZHVsZV9nZXQoY29wcm9jZXNzb3ItPm93bmVyKSkKKwkJCWdvdG8gZXJyb3JfMjsKKworCQlpZiAoKHJldCA9IGNvcHJvY2Vzc29yLT5vcGVuKGNvcHJvY2Vzc29yLT5kZXZjLCBDT1BSX1BDTSkpIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQ6IENhbid0IGFjY2VzcyBjb3Byb2Nlc3NvciBkZXZpY2VcbiIpOworCQkJZ290byBlcnJvcl8zOworCQl9CisJfQorCQorCWF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbiA9IDA7CisKKwlpZiAoZGV2X3R5cGUgPT0gU05EX0RFVl9BVURJTykKKwkJc2V0X2Zvcm1hdChkZXYsIEFGTVRfTVVfTEFXKTsKKwllbHNlIAorCQlzZXRfZm9ybWF0KGRldiwgYml0cyk7CisKKwlhdWRpb19kZXZzW2Rldl0tPmF1ZGlvX21vZGUgPSBBTV9OT05FOworCisJcmV0dXJuIDA7CisKKwkvKgorCSAqIENsZWFuLXVwIHN0YWNrOiB0aGlzIGlzIHdoYXQgbmVlZHMgKHVuKWRvaW5nIGlmCisJICogd2UgY2FuJ3Qgb3BlbiB0aGUgYXVkaW8gZGV2aWNlIC4uLgorCSAqLworCWVycm9yXzM6CisJbW9kdWxlX3B1dChjb3Byb2Nlc3Nvci0+b3duZXIpOworCisJZXJyb3JfMjoKKwlETUFidWZfcmVsZWFzZShkZXYsIG1vZGUpOworCisJZXJyb3JfMToKKwltb2R1bGVfcHV0KGRyaXZlci0+b3duZXIpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc3luY19vdXRwdXQoaW50IGRldikKK3sKKwlpbnQgICAgICAgICAgICAgcCwgaTsKKwlpbnQgICAgICAgICAgICAgbDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQ7CisKKwlpZiAoZG1hcC0+ZnJhZ21lbnRfc2l6ZSA8PSAwKQorCQlyZXR1cm47CisJZG1hcC0+ZmxhZ3MgfD0gRE1BX1BPU1Q7CisKKwkvKiBBbGlnbiB0aGUgd3JpdGUgcG9pbnRlciB3aXRoIGZyYWdtZW50IGJvdW5kYXJpZXMgKi8KKwkKKwlpZiAoKGwgPSBkbWFwLT51c2VyX2NvdW50ZXIgJSBkbWFwLT5mcmFnbWVudF9zaXplKSA+IDApCisJeworCQlpbnQgbGVuOworCQl1bnNpZ25lZCBsb25nIG9mZnMgPSBkbWFwLT51c2VyX2NvdW50ZXIgJSBkbWFwLT5ieXRlc19pbl91c2U7CisKKwkJbGVuID0gZG1hcC0+ZnJhZ21lbnRfc2l6ZSAtIGw7CisJCW1lbXNldChkbWFwLT5yYXdfYnVmICsgb2ZmcywgZG1hcC0+bmV1dHJhbF9ieXRlLCBsZW4pOworCQlETUFidWZfbW92ZV93cnBvaW50ZXIoZGV2LCBsZW4pOworCX0KKwkKKwkvKgorCSAqIENsZWFuIGFsbCB1bnVzZWQgYnVmZmVyIGZyYWdtZW50cy4KKwkgKi8KKworCXAgPSBkbWFwLT5xdGFpbDsKKwlkbWFwLT5mbGFncyB8PSBETUFfUE9TVDsKKworCWZvciAoaSA9IGRtYXAtPnFsZW4gKyAxOyBpIDwgZG1hcC0+bmJ1ZnM7IGkrKykKKwl7CisJCXAgPSAocCArIDEpICUgZG1hcC0+bmJ1ZnM7CisJCWlmICgoKGRtYXAtPnJhd19idWYgKyBwICogZG1hcC0+ZnJhZ21lbnRfc2l6ZSkgKyBkbWFwLT5mcmFnbWVudF9zaXplKSA+CisJCQkoZG1hcC0+cmF3X2J1ZiArIGRtYXAtPmJ1ZmZzaXplKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgImF1ZGlvOiBCdWZmZXIgZXJyb3IgMlxuIik7CisKKwkJbWVtc2V0KGRtYXAtPnJhd19idWYgKyBwICogZG1hcC0+ZnJhZ21lbnRfc2l6ZSwKKwkJCWRtYXAtPm5ldXRyYWxfYnl0ZSwKKwkJCWRtYXAtPmZyYWdtZW50X3NpemUpOworCX0KKworCWRtYXAtPmZsYWdzIHw9IERNQV9ESVJUWTsKK30KKwordm9pZCBhdWRpb19yZWxlYXNlKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNvbnN0IHN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAqY29wcm9jZXNzb3I7CisJaW50IG1vZGUgPSB0cmFuc2xhdGVfbW9kZShmaWxlKTsKKworCWRldiA9IGRldiA+PiA0OworCisJLyoKKwkgKiBXZSBkbyB0aGlzIGluIERNQWJ1Zl9yZWxlYXNlKCkuIFdoeSBhcmUgd2UgZG9pbmcgaXQKKwkgKiBoZXJlPyBXaHkgZG9uJ3Qgd2UgdGVzdCB0aGUgZmlsZSBtb2RlIGJlZm9yZSBzZXR0aW5nCisJICogYm90aCBmbGFncz8gRE1BYnVmX3JlbGVhc2UoKSBkb2VzLgorCSAqIC4uLnBlc3Rlci4uLnBlc3Rlci4uLnBlc3Rlci4uLgorCSAqLworCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmNsb3NpbmcgPSAxOworCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+Y2xvc2luZyA9IDE7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGFsbG9jYXRlZCB0aGUgZG1hcF9vdXQgYnVmZmVyCisJICogYmVmb3JlIHdlIGdvIG11Y2tpbmcgYXJvdW5kIHdpdGggaXQgaW4gc3luY19vdXRwdXQoKS4KKwkgKi8KKwlpZiAobW9kZSAmIE9QRU5fV1JJVEUpCisJCXN5bmNfb3V0cHV0KGRldik7CisKKwlpZiAoIChjb3Byb2Nlc3NvciA9IGF1ZGlvX2RldnNbZGV2XS0+Y29wcm9jKSAhPSBOVUxMICkgeworCQljb3Byb2Nlc3Nvci0+Y2xvc2UoY29wcm9jZXNzb3ItPmRldmMsIENPUFJfUENNKTsKKwkJbW9kdWxlX3B1dChjb3Byb2Nlc3Nvci0+b3duZXIpOworCX0KKwlETUFidWZfcmVsZWFzZShkZXYsIG1vZGUpOworCisJbW9kdWxlX3B1dChhdWRpb19kZXZzW2Rldl0tPmQtPm93bmVyKTsKK30KKworc3RhdGljIHZvaWQgdHJhbnNsYXRlX2J5dGVzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRhYmxlLCB1bnNpZ25lZCBjaGFyICpidWZmLCBpbnQgbikKK3sKKwl1bnNpZ25lZCBsb25nICAgaTsKKworCWlmIChuIDw9IDApCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBuOyArK2kpCisJCWJ1ZmZbaV0gPSB0YWJsZVtidWZmW2ldXTsKK30KKworaW50IGF1ZGlvX3dyaXRlKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IGMsIHAsIGwsIGJ1Zl9zaXplLCB1c2VkLCByZXR1cm5lZDsKKwlpbnQgZXJyOworCWNoYXIgKmRtYV9idWY7CisKKwlkZXYgPSBkZXYgPj4gNDsKKworCXAgPSAwOworCWMgPSBjb3VudDsKKwkKKwlpZihjb3VudCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKSkKKwkJcmV0dXJuIC1FUEVSTTsKKworCWlmIChhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0RVUExFWCkKKwkJYXVkaW9fZGV2c1tkZXZdLT5hdWRpb19tb2RlIHw9IEFNX1dSSVRFOworCWVsc2UKKwkJYXVkaW9fZGV2c1tkZXZdLT5hdWRpb19tb2RlID0gQU1fV1JJVEU7CisKKwlpZiAoIWNvdW50KQkJLyogRmx1c2ggb3V0cHV0ICovCisJeworCQkgIHN5bmNfb3V0cHV0KGRldik7CisJCSAgcmV0dXJuIDA7CisJfQorCQorCXdoaWxlIChjKQorCXsKKwkJaWYgKChlcnIgPSBETUFidWZfZ2V0d3JidWZmZXIoZGV2LCAmZG1hX2J1ZiwgJmJ1Zl9zaXplLCAhIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpKSA8IDApCisJCXsKKwkJCSAgICAvKiBIYW5kbGUgbm9uYmxvY2tpbmcgbW9kZSAqLworCQkJaWYgKChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgJiYgZXJyID09IC1FQUdBSU4pCisJCQkJcmV0dXJuIHA/IHAgOiAtRUFHQUlOOwkvKiBObyBtb3JlIHNwYWNlLiBSZXR1cm4gIyBvZiBhY2NlcHRlZCBieXRlcyAqLworCQkJcmV0dXJuIGVycjsKKwkJfQorCQlsID0gYzsKKworCQlpZiAobCA+IGJ1Zl9zaXplKQorCQkJbCA9IGJ1Zl9zaXplOworCisJCXJldHVybmVkID0gbDsKKwkJdXNlZCA9IGw7CisJCWlmICghYXVkaW9fZGV2c1tkZXZdLT5kLT5jb3B5X3VzZXIpCisJCXsKKwkJCWlmICgoZG1hX2J1ZiArIGwpID4KKwkJCQkoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+cmF3X2J1ZiArIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmJ1ZmZzaXplKSkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgImF1ZGlvOiBCdWZmZXIgZXJyb3IgMyAoJWx4LCVkKSwgKCVseCwgJWQpXG4iLCAobG9uZykgZG1hX2J1ZiwgbCwgKGxvbmcpIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPnJhd19idWYsIChpbnQpIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmJ1ZmZzaXplKTsKKwkJCQlyZXR1cm4gLUVET007CisJCQl9CisJCQlpZiAoZG1hX2J1ZiA8IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPnJhd19idWYpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJhdWRpbzogQnVmZmVyIGVycm9yIDEzICglbHg8JWx4KVxuIiwgKGxvbmcpIGRtYV9idWYsIChsb25nKSBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5yYXdfYnVmKTsKKwkJCQlyZXR1cm4gLUVET007CisJCQl9CisJCQlpZihjb3B5X2Zyb21fdXNlcihkbWFfYnVmLCAmKGJ1ZilbcF0sIGwpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9IAorCQllbHNlIGF1ZGlvX2RldnNbZGV2XS0+ZC0+Y29weV91c2VyIChkZXYsCisJCQkJCQlkbWFfYnVmLCAwLAorCQkJCQkJYnVmLCBwLAorCQkJCQkJYywgYnVmX3NpemUsCisJCQkJCQkmdXNlZCwgJnJldHVybmVkLAorCQkJCQkJbCk7CisJCWwgPSByZXR1cm5lZDsKKworCQlpZiAoYXVkaW9fZGV2c1tkZXZdLT5sb2NhbF9jb252ZXJzaW9uICYgQ05WX01VX0xBVykKKwkJeworCQkJdHJhbnNsYXRlX2J5dGVzKHVsYXdfZHNwLCAodW5zaWduZWQgY2hhciAqKSBkbWFfYnVmLCBsKTsKKwkJfQorCQljIC09IHVzZWQ7CisJCXAgKz0gdXNlZDsKKwkJRE1BYnVmX21vdmVfd3Jwb2ludGVyKGRldiwgbCk7CisKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBhdWRpb19yZWFkKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50ICAgICAgICAgICAgIGMsIHAsIGw7CisJY2hhciAgICAgICAgICAgKmRtYWJ1ZjsKKwlpbnQgICAgICAgICAgICAgYnVmX25vOworCisJZGV2ID0gZGV2ID4+IDQ7CisJcCA9IDA7CisJYyA9IGNvdW50OworCisJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKChhdWRpb19kZXZzW2Rldl0tPmF1ZGlvX21vZGUgJiBBTV9XUklURSkgJiYgIShhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0RVUExFWCkpCisJCXN5bmNfb3V0cHV0KGRldik7CisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9EVVBMRVgpCisJCWF1ZGlvX2RldnNbZGV2XS0+YXVkaW9fbW9kZSB8PSBBTV9SRUFEOworCWVsc2UKKwkJYXVkaW9fZGV2c1tkZXZdLT5hdWRpb19tb2RlID0gQU1fUkVBRDsKKworCXdoaWxlKGMpCisJeworCQlpZiAoKGJ1Zl9ubyA9IERNQWJ1Zl9nZXRyZGJ1ZmZlcihkZXYsICZkbWFidWYsICZsLCAhIShmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykpKSA8IDApCisJCXsKKwkJCS8qCisJCQkgKglOb25ibG9ja2luZyBtb2RlIGhhbmRsaW5nLiBSZXR1cm4gY3VycmVudCAjIG9mIGJ5dGVzCisJCQkgKi8KKworCQkJaWYgKHAgPiAwKSAJCS8qIEF2b2lkIHRocm93aW5nIGF3YXkgZGF0YSAqLworCQkJCXJldHVybiBwOwkvKiBSZXR1cm4gaXQgaW5zdGVhZCAqLworCisJCQlpZiAoKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAmJiBidWZfbm8gPT0gLUVBR0FJTikKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKworCQkJcmV0dXJuIGJ1Zl9ubzsKKwkJfQorCQlpZiAobCA+IGMpCisJCQlsID0gYzsKKworCQkvKgorCQkgKiBJbnNlcnQgYW55IGxvY2FsIHByb2Nlc3NpbmcgaGVyZS4KKwkJICovCisKKwkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+bG9jYWxfY29udmVyc2lvbiAmIENOVl9NVV9MQVcpCisJCXsKKwkJCXRyYW5zbGF0ZV9ieXRlcyhkc3BfdWxhdywgKHVuc2lnbmVkIGNoYXIgKikgZG1hYnVmLCBsKTsKKwkJfQorCQkKKwkJeworCQkJY2hhciAgICAgICAgICAgKmZpeGl0ID0gZG1hYnVmOworCisJCQlpZihjb3B5X3RvX3VzZXIoJihidWYpW3BdLCBmaXhpdCwgbCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX07CisKKwkJRE1BYnVmX3JtY2hhcnMoZGV2LCBidWZfbm8sIGwpOworCisJCXAgKz0gbDsKKwkJYyAtPSBsOworCX0KKworCXJldHVybiBjb3VudCAtIGM7Cit9CisKK2ludCBhdWRpb19pb2N0bChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgdmFsLCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwOworCWludCBfX3VzZXIgKnAgPSBhcmc7CisKKwlkZXYgPSBkZXYgPj4gNDsKKworCWlmIChfSU9DX1RZUEUoY21kKSA9PSAnQycpCXsKKwkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+Y29wcm9jKQkvKiBDb3Byb2Nlc3NvciBpb2N0bCAqLworCQkJcmV0dXJuIGF1ZGlvX2RldnNbZGV2XS0+Y29wcm9jLT5pb2N0bChhdWRpb19kZXZzW2Rldl0tPmNvcHJvYy0+ZGV2YywgY21kLCBhcmcsIDApOworCQkvKiBlbHNlCisJCSAgICAgICAgcHJpbnRrKEtFUk5fREVCVUciL2Rldi9kc3AlZDogTm8gY29wcm9jZXNzb3IgZm9yIHRoaXMgZGV2aWNlXG4iLCBkZXYpOyAqLworCQlyZXR1cm4gLUVOWElPOworCX0KKwllbHNlIHN3aXRjaCAoY21kKSAKKwl7CisJCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQkJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWlmIChhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5mcmFnbWVudF9zaXplID09IDApCisJCQkJcmV0dXJuIDA7CisJCQlzeW5jX291dHB1dChkZXYpOworCQkJRE1BYnVmX3N5bmMoZGV2KTsKKwkJCURNQWJ1Zl9yZXNldChkZXYpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCQlpZiAoIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpKQorCQkJCXJldHVybiAwOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmZyYWdtZW50X3NpemUgPT0gMCkKKwkJCQlyZXR1cm4gMDsKKwkJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmZsYWdzIHw9IERNQV9QT1NUIHwgRE1BX0RJUlRZOworCQkJc3luY19vdXRwdXQoZGV2KTsKKwkJCWRtYV9pb2N0bChkZXYsIFNORENUTF9EU1BfUE9TVCwgTlVMTCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCQlhdWRpb19kZXZzW2Rldl0tPmF1ZGlvX21vZGUgPSBBTV9OT05FOworCQkJRE1BYnVmX3Jlc2V0KGRldik7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKKwkJCXZhbCA9IGF1ZGlvX2RldnNbZGV2XS0+Zm9ybWF0X21hc2sgfCBBRk1UX01VX0xBVzsKKwkJCWJyZWFrOworCQorCQljYXNlIFNORENUTF9EU1BfU0VURk1UOgorCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl2YWwgPSBzZXRfZm9ybWF0KGRldiwgdmFsKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCQlpZiAoIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCkpCisJCQkJcmV0dXJuIDA7CisgIAkJCWlmICgoYXVkaW9fZGV2c1tkZXZdLT5hdWRpb19tb2RlICYgQU1fV1JJVEUpICYmICEoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9EVVBMRVgpKQorICAJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCXJldHVybiBkbWFfaW9jdGwoZGV2LCBjbWQsIGFyZyk7CisKKwkJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJCWlmICghKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9XUklURSkpCisJCQkJcmV0dXJuIC1FUEVSTTsKKyAgCQkJaWYgKChhdWRpb19kZXZzW2Rldl0tPmF1ZGlvX21vZGUgJiBBTV9SRUFEKSAmJiAhKGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfRFVQTEVYKSkKKyAgCQkJCXJldHVybiAtRUJVU1k7CisJCQlyZXR1cm4gZG1hX2lvY3RsKGRldiwgY21kLCBhcmcpOworCQkKKwkJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQkJZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCQkJdmFsID0gMSB8IERTUF9DQVBfTU1BUDsJLyogUmV2aXNpb24gbGV2ZWwgb2YgdGhpcyBpb2N0bCgpICovCisJCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfRFVQTEVYICYmCisJCQkJCWF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlID09IE9QRU5fUkVBRFdSSVRFKQorCQkJCQl2YWwgfD0gRFNQX0NBUF9EVVBMRVg7CisJCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+Y29wcm9jKQorCQkJCQl2YWwgfD0gRFNQX0NBUF9DT1BST0M7CisJCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZC0+bG9jYWxfcWxlbikJLyogRGV2aWNlIGhhcyBoaWRkZW4gYnVmZmVycyAqLworCQkJCQl2YWwgfD0gRFNQX0NBUF9CQVRDSDsKKwkJCQlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kLT50cmlnZ2VyKQkvKiBTdXBwb3J0cyBTRVRUUklHR0VSICovCisJCQkJCXZhbCB8PSBEU1BfQ0FQX1RSSUdHRVI7CisJCQkJYnJlYWs7CisJCQkKKwkJY2FzZSBTT1VORF9QQ01fV1JJVEVfUkFURToKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdmFsID0gYXVkaW9fZGV2c1tkZXZdLT5kLT5zZXRfc3BlZWQoZGV2LCB2YWwpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQkJdmFsID0gYXVkaW9fZGV2c1tkZXZdLT5kLT5zZXRfc3BlZWQoZGV2LCAwKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh2YWwgPiAxIHx8IHZhbCA8IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl2YWwgPSBhdWRpb19kZXZzW2Rldl0tPmQtPnNldF9jaGFubmVscyhkZXYsIHZhbCArIDEpIC0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTOgorCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl2YWwgPSBhdWRpb19kZXZzW2Rldl0tPmQtPnNldF9jaGFubmVscyhkZXYsIHZhbCk7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQkJdmFsID0gYXVkaW9fZGV2c1tkZXZdLT5kLT5zZXRfY2hhbm5lbHMoZGV2LCAwKTsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQkJdmFsID0gYXVkaW9fZGV2c1tkZXZdLT5kLT5zZXRfYml0cyhkZXYsIDApOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJCWlmIChhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAhPSBPUEVOX1JFQURXUklURSkKKwkJCQlyZXR1cm4gLUVQRVJNOworCQkJcmV0dXJuIChhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0RVUExFWCkgPyAwIDogLUVJTzsKKworCQljYXNlIFNORENUTF9EU1BfUFJPRklMRToKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9XUklURSkKKwkJCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5hcHBsaWNfcHJvZmlsZSA9IHZhbDsKKwkJCWlmIChhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCkKKwkJCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmFwcGxpY19wcm9maWxlID0gdmFsOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQkJZG1hcCA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQ7CisJCQlpZiAoIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfQUxMT0NfRE9ORSkpCisJCQl7CisJCQkJdmFsPTA7CisJCQkJYnJlYWs7CisJCQl9CisJCQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQkJLyogQ29tcHV0ZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcGxheWVkICovCisJCQljb3VudCA9IERNQWJ1Zl9nZXRfYnVmZmVyX3BvaW50ZXIgKGRldiwgZG1hcCwgRE1PREVfT1VUUFVUKTsKKwkJCWlmIChjb3VudCA8IGRtYXAtPmZyYWdtZW50X3NpemUgJiYgZG1hcC0+cWhlYWQgIT0gMCkKKwkJCQljb3VudCArPSBkbWFwLT5ieXRlc19pbl91c2U7CS8qIFBvaW50ZXIgd3JhcCBub3QgaGFuZGxlZCB5ZXQgKi8KKwkJCWNvdW50ICs9IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCisJCQkvKiBTdWJzdHJhY3QgY3VycmVudCBjb3VudCBmcm9tIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieSBhcHAgKi8KKwkJCWNvdW50ID0gZG1hcC0+dXNlcl9jb3VudGVyIC0gY291bnQ7CisJCQlpZiAoY291bnQgPCAwKQorCQkJCWNvdW50ID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQkJdmFsID0gY291bnQ7CisJCQlicmVhazsKKwkJCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gZG1hX2lvY3RsKGRldiwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKK30KKwordm9pZCBhdWRpb19pbml0X2RldmljZXModm9pZCkKK3sKKwkvKgorCSAqIE5PVEUhIFRoaXMgcm91dGluZSBjb3VsZCBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBkdXJpbmcgYm9vdC4KKwkgKi8KK30KKwordm9pZCByZW9yZ2FuaXplX2J1ZmZlcnMoaW50IGRldiwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAsIGludCByZWNvcmRpbmcpCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgYnJlYWtzIHRoZSBwaHlzaWNhbCBkZXZpY2UgYnVmZmVycyB0byBsb2dpY2FsIG9uZXMuCisJICovCisKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqZHNwX2RldiA9IGF1ZGlvX2RldnNbZGV2XTsKKworCXVuc2lnbmVkIGksIG47CisJdW5zaWduZWQgc3IsIG5jLCBzeiwgYnN6OworCisJc3IgPSBkc3BfZGV2LT5kLT5zZXRfc3BlZWQoZGV2LCAwKTsKKwluYyA9IGRzcF9kZXYtPmQtPnNldF9jaGFubmVscyhkZXYsIDApOworCXN6ID0gZHNwX2Rldi0+ZC0+c2V0X2JpdHMoZGV2LCAwKTsKKworCWlmIChzeiA9PSA4KQorCQlkbWFwLT5uZXV0cmFsX2J5dGUgPSBORVVUUkFMODsKKwllbHNlCisJCWRtYXAtPm5ldXRyYWxfYnl0ZSA9IE5FVVRSQUwxNjsKKworCWlmIChzciA8IDEgfHwgbmMgPCAxIHx8IHN6IDwgMSkKKwl7CisvKgkJcHJpbnRrKEtFUk5fREVCVUcgIldhcm5pbmc6IEludmFsaWQgUENNIHBhcmFtZXRlcnNbJWRdIHNyPSVkLCBuYz0lZCwgc3o9JWRcbiIsIGRldiwgc3IsIG5jLCBzeik7Ki8KKwkJc3IgPSBEU1BfREVGQVVMVF9TUEVFRDsKKwkJbmMgPSAxOworCQlzeiA9IDg7CisJfQorCQorCXN6ID0gc3IgKiBuYyAqIHN6OworCisJc3ogLz0gODsJCS8qICNiaXRzIC0+ICNieXRlcyAqLworCWRtYXAtPmRhdGFfcmF0ZSA9IHN6OworCisJaWYgKCFkbWFwLT5uZWVkc19yZW9yZykKKwkJcmV0dXJuOworCWRtYXAtPm5lZWRzX3Jlb3JnID0gMDsKKworCWlmIChkbWFwLT5mcmFnbWVudF9zaXplID09IDApCisJewkKKwkJLyogQ29tcHV0ZSB0aGUgZnJhZ21lbnQgc2l6ZSB1c2luZyB0aGUgZGVmYXVsdCBhbGdvcml0aG0gKi8KKworCQkvKgorCQkgKiBDb21wdXRlIGEgYnVmZmVyIHNpemUgZm9yIHRpbWUgbm90IGV4Y2VlZGluZyAxIHNlY29uZC4KKwkJICogVXN1YWxseSB0aGlzIGFsZ29yaXRobSBnaXZlcyBhIGJ1ZmZlciBzaXplIGZvciAwLjUgdG8gMS4wIHNlY29uZHMKKwkJICogb2Ygc291bmQgKHVzaW5nIHRoZSBjdXJyZW50IHNwZWVkLCBzYW1wbGUgc2l6ZSBhbmQgI2NoYW5uZWxzKS4KKwkJICovCisKKwkJYnN6ID0gZG1hcC0+YnVmZnNpemU7CisJCXdoaWxlIChic3ogPiBzeikKKwkJCWJzeiAvPSAyOworCisJCWlmIChic3ogPT0gZG1hcC0+YnVmZnNpemUpCisJCQlic3ogLz0gMjsJLyogTmVlZHMgYXQgbGVhc3QgMiBidWZmZXJzICovCisKKwkJLyoKKwkJICogICAgU3BsaXQgdGhlIGNvbXB1dGVkIGZyYWdtZW50IHRvIHNtYWxsZXIgcGFydHMuIEFmdGVyIDMuNWE5CisJCSAqICAgICAgdGhlIGRlZmF1bHQgc3ViZGl2aXNpb24gaXMgNCB3aGljaCBzaG91bGQgZ2l2ZSBiZXR0ZXIKKwkJICogICAgICByZXN1bHRzIHdoZW4gcmVjb3JkaW5nLgorCQkgKi8KKworCQlpZiAoZG1hcC0+c3ViZGl2aXNpb24gPT0gMCkJLyogTm90IGFscmVhZHkgc2V0ICovCisJCXsKKwkJCWRtYXAtPnN1YmRpdmlzaW9uID0gNDsJLyogSW5pdCB0byB0aGUgZGVmYXVsdCB2YWx1ZSAqLworCisJCQlpZiAoKGJzeiAvIGRtYXAtPnN1YmRpdmlzaW9uKSA+IDQwOTYpCisJCQkJZG1hcC0+c3ViZGl2aXNpb24gKj0gMjsKKwkJCWlmICgoYnN6IC8gZG1hcC0+c3ViZGl2aXNpb24pIDwgNDA5NikKKwkJCQlkbWFwLT5zdWJkaXZpc2lvbiA9IDE7CisJCX0KKwkJYnN6IC89IGRtYXAtPnN1YmRpdmlzaW9uOworCisJCWlmIChic3ogPCAxNikKKwkJCWJzeiA9IDE2OwkvKiBKdXN0IGEgc2FuaXR5IGNoZWNrICovCisKKwkJZG1hcC0+ZnJhZ21lbnRfc2l6ZSA9IGJzejsKKwl9CisJZWxzZQorCXsKKwkJLyoKKwkJICogVGhlIHByb2Nlc3MgaGFzIHNwZWNpZmllZCB0aGUgYnVmZmVyIHNpemUgd2l0aCBTTkRDVExfRFNQX1NFVEZSQUdNRU5UIG9yCisJCSAqIHRoZSBidWZmZXIgc2l6ZSBjb21wdXRhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGRvbmUuCisJCSAqLworCQlpZiAoZG1hcC0+ZnJhZ21lbnRfc2l6ZSA+IChkbWFwLT5idWZmc2l6ZSAvIDIpKQorCQkJZG1hcC0+ZnJhZ21lbnRfc2l6ZSA9IChkbWFwLT5idWZmc2l6ZSAvIDIpOworCQlic3ogPSBkbWFwLT5mcmFnbWVudF9zaXplOworCX0KKworCWlmIChhdWRpb19kZXZzW2Rldl0tPm1pbl9mcmFnbWVudCkKKwkJaWYgKGJzeiA8ICgxIDw8IGF1ZGlvX2RldnNbZGV2XS0+bWluX2ZyYWdtZW50KSkKKwkJCWJzeiA9IDEgPDwgYXVkaW9fZGV2c1tkZXZdLT5taW5fZnJhZ21lbnQ7CisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+bWF4X2ZyYWdtZW50KQorCQlpZiAoYnN6ID4gKDEgPDwgYXVkaW9fZGV2c1tkZXZdLT5tYXhfZnJhZ21lbnQpKQorCQkJYnN6ID0gMSA8PCBhdWRpb19kZXZzW2Rldl0tPm1heF9mcmFnbWVudDsKKwlic3ogJj0gfjB4MDc7CQkvKiBGb3JjZSBzaXplIHdoaWNoIGlzIG11bHRpcGxlIG9mIDggYnl0ZXMgKi8KKyNpZmRlZiBPU19ETUFfQUxJR05fQ0hFQ0sKKwlPU19ETUFfQUxJR05fQ0hFQ0soYnN6KTsKKyNlbmRpZgorCisJbiA9IGRtYXAtPmJ1ZmZzaXplIC8gYnN6OworCWlmIChuID4gTUFYX1NVQl9CVUZGRVJTKQorCQluID0gTUFYX1NVQl9CVUZGRVJTOworCWlmIChuID4gZG1hcC0+bWF4X2ZyYWdtZW50cykKKwkJbiA9IGRtYXAtPm1heF9mcmFnbWVudHM7CisKKwlpZiAobiA8IDIpCisJeworCQluID0gMjsKKwkJYnN6IC89IDI7CisJfQorCWRtYXAtPm5idWZzID0gbjsKKwlkbWFwLT5ieXRlc19pbl91c2UgPSBuICogYnN6OworCWRtYXAtPmZyYWdtZW50X3NpemUgPSBic3o7CisJZG1hcC0+bWF4X2J5dGVfY291bnRlciA9IChkbWFwLT5kYXRhX3JhdGUgKiA2MCAqIDYwKSArCisJCQlkbWFwLT5ieXRlc19pbl91c2U7CS8qIEFwcHJveGltYXRlbHkgb25lIGhvdXIgKi8KKworCWlmIChkbWFwLT5yYXdfYnVmKQorCXsKKwkJbWVtc2V0KGRtYXAtPnJhd19idWYsIGRtYXAtPm5ldXRyYWxfYnl0ZSwgZG1hcC0+Ynl0ZXNfaW5fdXNlKTsKKwl9CisJCisJZm9yIChpID0gMDsgaSA8IGRtYXAtPm5idWZzOyBpKyspCisJeworCQlkbWFwLT5jb3VudHNbaV0gPSAwOworCX0KKworCWRtYXAtPmZsYWdzIHw9IERNQV9BTExPQ19ET05FIHwgRE1BX0VNUFRZOworfQorCitzdGF0aWMgaW50IGRtYV9zdWJkaXZpZGUoaW50IGRldiwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAsIGludCBmYWN0KQoreworCWlmIChmYWN0ID09IDApIAorCXsKKwkJZmFjdCA9IGRtYXAtPnN1YmRpdmlzaW9uOworCQlpZiAoZmFjdCA9PSAwKQorCQkJZmFjdCA9IDE7CisJCXJldHVybiBmYWN0OworCX0KKwlpZiAoZG1hcC0+c3ViZGl2aXNpb24gIT0gMCB8fCBkbWFwLT5mcmFnbWVudF9zaXplKQkvKiBUb28gbGF0ZSB0byBjaGFuZ2UgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZmFjdCA+IE1BWF9SRUFMVElNRV9GQUNUT1IpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGZhY3QgIT0gMSAmJiBmYWN0ICE9IDIgJiYgZmFjdCAhPSA0ICYmIGZhY3QgIT0gOCAmJiBmYWN0ICE9IDE2KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWRtYXAtPnN1YmRpdmlzaW9uID0gZmFjdDsKKwlyZXR1cm4gZmFjdDsKK30KKworc3RhdGljIGludCBkbWFfc2V0X2ZyYWdtZW50KGludCBkZXYsIHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwLCBpbnQgZmFjdCkKK3sKKwlpbnQgYnl0ZXMsIGNvdW50OworCisJaWYgKGZhY3QgPT0gMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoZG1hcC0+c3ViZGl2aXNpb24gIT0gMCB8fAorCSAgICBkbWFwLT5mcmFnbWVudF9zaXplKQkvKiBUb28gbGF0ZSB0byBjaGFuZ2UgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlieXRlcyA9IGZhY3QgJiAweGZmZmY7CisJY291bnQgPSAoZmFjdCA+PiAxNikgJiAweDdmZmY7CisKKwlpZiAoY291bnQgPT0gMCkKKwkJY291bnQgPSBNQVhfU1VCX0JVRkZFUlM7CisJZWxzZSBpZiAoY291bnQgPCBNQVhfU1VCX0JVRkZFUlMpCisJCWNvdW50Kys7CisKKwlpZiAoYnl0ZXMgPCA0IHx8IGJ5dGVzID4gMTcpCS8qIDwxNiB8fCA+IDUxMmsgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY291bnQgPCAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChhdWRpb19kZXZzW2Rldl0tPm1pbl9mcmFnbWVudCA+IDApCisJCWlmIChieXRlcyA8IGF1ZGlvX2RldnNbZGV2XS0+bWluX2ZyYWdtZW50KQorCQkJYnl0ZXMgPSBhdWRpb19kZXZzW2Rldl0tPm1pbl9mcmFnbWVudDsKKworCWlmIChhdWRpb19kZXZzW2Rldl0tPm1heF9mcmFnbWVudCA+IDApCisJCWlmIChieXRlcyA+IGF1ZGlvX2RldnNbZGV2XS0+bWF4X2ZyYWdtZW50KQorCQkJYnl0ZXMgPSBhdWRpb19kZXZzW2Rldl0tPm1heF9mcmFnbWVudDsKKworI2lmZGVmIE9TX0RNQV9NSU5CSVRTCisJaWYgKGJ5dGVzIDwgT1NfRE1BX01JTkJJVFMpCisJCWJ5dGVzID0gT1NfRE1BX01JTkJJVFM7CisjZW5kaWYKKworCWRtYXAtPmZyYWdtZW50X3NpemUgPSAoMSA8PCBieXRlcyk7CisJZG1hcC0+bWF4X2ZyYWdtZW50cyA9IGNvdW50OworCisJaWYgKGRtYXAtPmZyYWdtZW50X3NpemUgPiBkbWFwLT5idWZmc2l6ZSkKKwkJZG1hcC0+ZnJhZ21lbnRfc2l6ZSA9IGRtYXAtPmJ1ZmZzaXplOworCisJaWYgKGRtYXAtPmZyYWdtZW50X3NpemUgPT0gZG1hcC0+YnVmZnNpemUgJiYKKwkgICAgYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9BVVRPTU9ERSkKKwkJZG1hcC0+ZnJhZ21lbnRfc2l6ZSAvPSAyOwkvKiBOZWVkcyBhdCBsZWFzdCAyIGJ1ZmZlcnMgKi8KKworCWRtYXAtPnN1YmRpdmlzaW9uID0gMTsJLyogRGlzYWJsZSBTTkRDVExfRFNQX1NVQkRJVklERSAqLworCXJldHVybiBieXRlcyB8ICgoY291bnQgLSAxKSA8PCAxNik7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXBfb3V0ID0gYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcF9pbiA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbjsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcDsKKwlhdWRpb19idWZfaW5mbyBpbmZvOworCWNvdW50X2luZm8gY2luZm87CisJaW50IGZhY3QsIHJldCwgY2hhbmdlZCwgYml0cywgY291bnQsIGVycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3dpdGNoIChjbWQpIAorCXsKKwkJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJCXJldCA9IDA7CisJCQlpZiAoZ2V0X3VzZXIoZmFjdCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9XUklURSkKKwkJCQlyZXQgPSBkbWFfc3ViZGl2aWRlKGRldiwgZG1hcF9vdXQsIGZhY3QpOworCQkJaWYgKHJldCA8IDApCisJCQkJcmV0dXJuIHJldDsKKwkJCWlmIChhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAhPSBPUEVOX1dSSVRFIHx8CisJCQkJKGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfRFVQTEVYICYmCisJCQkJCWF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9SRUFEKSkKKwkJCQlyZXQgPSBkbWFfc3ViZGl2aWRlKGRldiwgZG1hcF9pbiwgZmFjdCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJCWRtYXAgPSBkbWFwX291dDsKKwkJCWlmIChjbWQgPT0gU05EQ1RMX0RTUF9HRVRJU1BBQ0UgJiYgIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoY21kID09IFNORENUTF9EU1BfR0VUT1NQQUNFICYmICEoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChjbWQgPT0gU05EQ1RMX0RTUF9HRVRJU1BBQ0UgJiYgYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9EVVBMRVgpCisJCQkJZG1hcCA9IGRtYXBfaW47CisJCQlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfQUxMT0NfRE9ORSkpCisJCQkJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgZG1hcCwgKGNtZCA9PSBTTkRDVExfRFNQX0dFVElTUEFDRSkpOworCQkJaW5mby5mcmFnc3RvdGFsID0gZG1hcC0+bmJ1ZnM7CisJCQlpZiAoY21kID09IFNORENUTF9EU1BfR0VUSVNQQUNFKQorCQkJCWluZm8uZnJhZ21lbnRzID0gZG1hcC0+cWxlbjsKKwkJCWVsc2UgCisJCQl7CisJCQkJaWYgKCFETUFidWZfc3BhY2VfaW5fcXVldWUoZGV2KSkKKwkJCQkJaW5mby5mcmFnbWVudHMgPSAwOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCWluZm8uZnJhZ21lbnRzID0gRE1BYnVmX3NwYWNlX2luX3F1ZXVlKGRldik7CisJCQkJCWlmIChhdWRpb19kZXZzW2Rldl0tPmQtPmxvY2FsX3FsZW4pIAorCQkJCQl7CisJCQkJCQlpbnQgdG1wID0gYXVkaW9fZGV2c1tkZXZdLT5kLT5sb2NhbF9xbGVuKGRldik7CisJCQkJCQlpZiAodG1wICYmIGluZm8uZnJhZ21lbnRzKQorCQkJCQkJCXRtcC0tOwkvKgorCQkJCQkJCQkgKiBUaGlzIGJ1ZmZlciBoYXMgYmVlbiBjb3VudGVkIHR3aWNlCisJCQkJCQkJCSAqLworCQkJCQkJaW5mby5mcmFnbWVudHMgLT0gdG1wOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJaWYgKGluZm8uZnJhZ21lbnRzIDwgMCkKKwkJCQlpbmZvLmZyYWdtZW50cyA9IDA7CisJCQllbHNlIGlmIChpbmZvLmZyYWdtZW50cyA+IGRtYXAtPm5idWZzKQorCQkJCWluZm8uZnJhZ21lbnRzID0gZG1hcC0+bmJ1ZnM7CisKKwkJCWluZm8uZnJhZ3NpemUgPSBkbWFwLT5mcmFnbWVudF9zaXplOworCQkJaW5mby5ieXRlcyA9IGluZm8uZnJhZ21lbnRzICogZG1hcC0+ZnJhZ21lbnRfc2l6ZTsKKworCQkJaWYgKGNtZCA9PSBTTkRDVExfRFNQX0dFVElTUEFDRSAmJiBkbWFwLT5xbGVuKQorCQkJCWluZm8uYnl0ZXMgLT0gZG1hcC0+Y291bnRzW2RtYXAtPnFoZWFkXTsKKwkJCWVsc2UgCisJCQl7CisJCQkJaW5mby5mcmFnbWVudHMgPSBpbmZvLmJ5dGVzIC8gZG1hcC0+ZnJhZ21lbnRfc2l6ZTsKKwkJCQlpbmZvLmJ5dGVzIC09IGRtYXAtPnVzZXJfY291bnRlciAlIGRtYXAtPmZyYWdtZW50X3NpemU7CisJCQl9CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJCWlmIChnZXRfdXNlcihiaXRzLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQliaXRzICY9IGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZC0+dHJpZ2dlciA9PSBOVUxMKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5mbGFncyAmIERNQV9EVVBMRVgpICYmIChiaXRzICYgUENNX0VOQUJMRV9JTlBVVCkgJiYKKwkJCQkoYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJaWYgKGJpdHMgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQkJeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwX2luLT5sb2NrLGZsYWdzKTsKKwkJCQljaGFuZ2VkID0gKGF1ZGlvX2RldnNbZGV2XS0+ZW5hYmxlX2JpdHMgXiBiaXRzKSAmIFBDTV9FTkFCTEVfSU5QVVQ7CisJCQkJaWYgKGNoYW5nZWQgJiYgYXVkaW9fZGV2c1tkZXZdLT5nbykgCisJCQkJeworCQkJCQlyZW9yZ2FuaXplX2J1ZmZlcnMoZGV2LCBkbWFwX2luLCAxKTsKKwkJCQkJaWYgKChlcnIgPSBhdWRpb19kZXZzW2Rldl0tPmQtPnByZXBhcmVfZm9yX2lucHV0KGRldiwKKwkJCQkJCSAgICAgZG1hcF9pbi0+ZnJhZ21lbnRfc2l6ZSwgZG1hcF9pbi0+bmJ1ZnMpKSA8IDApIHsKKwkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXBfaW4tPmxvY2ssZmxhZ3MpOworCQkJCQkJcmV0dXJuIC1lcnI7CisJCQkJCX0KKwkJCQkJZG1hcF9pbi0+ZG1hX21vZGUgPSBETU9ERV9JTlBVVDsKKwkJCQkJYXVkaW9fZGV2c1tkZXZdLT5lbmFibGVfYml0cyB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQkJCQlETUFidWZfYWN0aXZhdGVfcmVjb3JkaW5nKGRldiwgZG1hcF9pbik7CisJCQkJfSBlbHNlCisJCQkJCWF1ZGlvX2RldnNbZGV2XS0+ZW5hYmxlX2JpdHMgJj0gflBDTV9FTkFCTEVfSU5QVVQ7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcF9pbi0+bG9jayxmbGFncyk7CisJCQl9CisJCQlpZiAoYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKQorCQkJeworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwX291dC0+bG9jayxmbGFncyk7CisJCQkJY2hhbmdlZCA9IChhdWRpb19kZXZzW2Rldl0tPmVuYWJsZV9iaXRzIF4gYml0cykgJiBQQ01fRU5BQkxFX09VVFBVVDsKKwkJCQlpZiAoY2hhbmdlZCAmJgorCQkJCSAgICAoZG1hcF9vdXQtPm1hcHBpbmdfZmxhZ3MgJiBETUFfTUFQX01BUFBFRCB8fCBkbWFwX291dC0+cWxlbiA+IDApICYmCisJCQkJICAgIGF1ZGlvX2RldnNbZGV2XS0+Z28pIAorCQkJCXsKKwkJCQkJaWYgKCEoZG1hcF9vdXQtPmZsYWdzICYgRE1BX0FMTE9DX0RPTkUpKQorCQkJCQkJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgZG1hcF9vdXQsIDApOworCQkJCQlkbWFwX291dC0+ZG1hX21vZGUgPSBETU9ERV9PVVRQVVQ7CisJCQkJCWF1ZGlvX2RldnNbZGV2XS0+ZW5hYmxlX2JpdHMgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCQkJCWRtYXBfb3V0LT5jb3VudHNbZG1hcF9vdXQtPnFoZWFkXSA9IGRtYXBfb3V0LT5mcmFnbWVudF9zaXplOworCQkJCQlETUFidWZfbGF1bmNoX291dHB1dChkZXYsIGRtYXBfb3V0KTsKKwkJCQl9IGVsc2UKKwkJCQkJYXVkaW9fZGV2c1tkZXZdLT5lbmFibGVfYml0cyAmPSB+UENNX0VOQUJMRV9PVVRQVVQ7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcF9vdXQtPmxvY2ssZmxhZ3MpOworCQkJfQorI2lmIDAKKwkJCWlmIChjaGFuZ2VkICYmIGF1ZGlvX2RldnNbZGV2XS0+ZC0+dHJpZ2dlcikKKwkJCQlhdWRpb19kZXZzW2Rldl0tPmQtPnRyaWdnZXIoZGV2LCBiaXRzICogYXVkaW9fZGV2c1tkZXZdLT5nbyk7CisjZW5kaWYJCQkJCisJCQkvKiBGYWxscyB0aHJvdWdoLi4uICovCisKKwkJY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCQlyZXQgPSBhdWRpb19kZXZzW2Rldl0tPmVuYWJsZV9iaXRzOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwkJCWlmICghYXVkaW9fZGV2c1tkZXZdLT5kLT50cmlnZ2VyKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYXVkaW9fZGV2c1tkZXZdLT5kLT50cmlnZ2VyKGRldiwgMCk7CisJCQlhdWRpb19kZXZzW2Rldl0tPmdvID0gMDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQkJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXBfaW4tPmxvY2ssZmxhZ3MpOworCQkJY2luZm8uYnl0ZXMgPSBkbWFwX2luLT5ieXRlX2NvdW50ZXI7CisJCQljaW5mby5wdHIgPSBETUFidWZfZ2V0X2J1ZmZlcl9wb2ludGVyKGRldiwgZG1hcF9pbiwgRE1PREVfSU5QVVQpICYgfjM7CisJCQlpZiAoY2luZm8ucHRyIDwgZG1hcF9pbi0+ZnJhZ21lbnRfc2l6ZSAmJiBkbWFwX2luLT5xdGFpbCAhPSAwKQorCQkJCWNpbmZvLmJ5dGVzICs9IGRtYXBfaW4tPmJ5dGVzX2luX3VzZTsJLyogUG9pbnRlciB3cmFwIG5vdCBoYW5kbGVkIHlldCAqLworCQkJY2luZm8uYmxvY2tzID0gZG1hcF9pbi0+cWxlbjsKKwkJCWNpbmZvLmJ5dGVzICs9IGNpbmZvLnB0cjsKKwkJCWlmIChkbWFwX2luLT5tYXBwaW5nX2ZsYWdzICYgRE1BX01BUF9NQVBQRUQpCisJCQkJZG1hcF9pbi0+cWxlbiA9IDA7CS8qIFJlc2V0IGludGVycnVwdCBjb3VudGVyICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwX2luLT5sb2NrLGZsYWdzKTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCQlpZiAoIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hcF9vdXQtPmxvY2ssZmxhZ3MpOworCQkJY2luZm8uYnl0ZXMgPSBkbWFwX291dC0+Ynl0ZV9jb3VudGVyOworCQkJY2luZm8ucHRyID0gRE1BYnVmX2dldF9idWZmZXJfcG9pbnRlcihkZXYsIGRtYXBfb3V0LCBETU9ERV9PVVRQVVQpICYgfjM7CisJCQlpZiAoY2luZm8ucHRyIDwgZG1hcF9vdXQtPmZyYWdtZW50X3NpemUgJiYgZG1hcF9vdXQtPnFoZWFkICE9IDApCisJCQkJY2luZm8uYnl0ZXMgKz0gZG1hcF9vdXQtPmJ5dGVzX2luX3VzZTsJLyogUG9pbnRlciB3cmFwIG5vdCBoYW5kbGVkIHlldCAqLworCQkJY2luZm8uYmxvY2tzID0gZG1hcF9vdXQtPnFsZW47CisJCQljaW5mby5ieXRlcyArPSBjaW5mby5wdHI7CisJCQlpZiAoZG1hcF9vdXQtPm1hcHBpbmdfZmxhZ3MgJiBETUFfTUFQX01BUFBFRCkKKwkJCQlkbWFwX291dC0+cWxlbiA9IDA7CS8qIFJlc2V0IGludGVycnVwdCBjb3VudGVyICovCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwX291dC0+bG9jayxmbGFncyk7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCQlpZiAoIShhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKCEoZG1hcF9vdXQtPmZsYWdzICYgRE1BX0FMTE9DX0RPTkUpKQorCQkJeworCQkJCXJldD0wOworCQkJCWJyZWFrOworCQkJfQorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXBfb3V0LT5sb2NrLGZsYWdzKTsKKwkJCS8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHBsYXllZCAqLworCQkJY291bnQgPSBETUFidWZfZ2V0X2J1ZmZlcl9wb2ludGVyIChkZXYsIGRtYXBfb3V0LCBETU9ERV9PVVRQVVQpOworCQkJaWYgKGNvdW50IDwgZG1hcF9vdXQtPmZyYWdtZW50X3NpemUgJiYgZG1hcF9vdXQtPnFoZWFkICE9IDApCisJCQkJY291bnQgKz0gZG1hcF9vdXQtPmJ5dGVzX2luX3VzZTsJLyogUG9pbnRlciB3cmFwIG5vdCBoYW5kbGVkIHlldCAqLworCQkJY291bnQgKz0gZG1hcF9vdXQtPmJ5dGVfY291bnRlcjsKKwkJCS8qIFN1YnN0cmFjdCBjdXJyZW50IGNvdW50IGZyb20gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIGJ5IGFwcCAqLworCQkJY291bnQgPSBkbWFwX291dC0+dXNlcl9jb3VudGVyIC0gY291bnQ7CisJCQlpZiAoY291bnQgPCAwKQorCQkJCWNvdW50ID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXBfb3V0LT5sb2NrLGZsYWdzKTsKKwkJCXJldCA9IGNvdW50OworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCQlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+cWxlbiA+IDApCisJCQkJaWYgKCEoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZmxhZ3MgJiBETUFfQUNUSVZFKSkKKwkJCQkJRE1BYnVmX2xhdW5jaF9vdXRwdXQoZGV2LCBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0KTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQkJZG1hcCA9IGRtYXBfb3V0OworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9XUklURSkKKwkJCQlyZW9yZ2FuaXplX2J1ZmZlcnMoZGV2LCBkbWFwX291dCwgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlID09IE9QRU5fUkVBRCkpOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlID09IE9QRU5fUkVBRCB8fAorCQkJICAgIChhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0RVUExFWCAmJgorCQkJICAgICBhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCkpCisJCQkJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgZG1hcF9pbiwgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlID09IE9QRU5fUkVBRCkpOworCQkJaWYgKGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlID09IE9QRU5fUkVBRCkKKwkJCQlkbWFwID0gZG1hcF9pbjsKKwkJCXJldCA9IGRtYXAtPmZyYWdtZW50X3NpemU7CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCQlyZXQgPSAwOworCQkJaWYgKGdldF91c2VyKGZhY3QsIChpbnQgX191c2VyICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChhdWRpb19kZXZzW2Rldl0tPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpCisJCQkJcmV0ID0gZG1hX3NldF9mcmFnbWVudChkZXYsIGRtYXBfb3V0LCBmYWN0KTsKKwkJCWlmIChyZXQgPCAwKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgPT0gT1BFTl9SRUFEIHx8CisJCQkgICAgKGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfRFVQTEVYICYmCisJCQkgICAgIGF1ZGlvX2RldnNbZGV2XS0+b3Blbl9tb2RlICYgT1BFTl9SRUFEKSkKKwkJCQlyZXQgPSBkbWFfc2V0X2ZyYWdtZW50KGRldiwgZG1hcF9pbiwgZmFjdCk7CisJCQlpZiAocmV0IDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKCFhcmcpIC8qIGRvbid0IGtub3cgd2hhdCB0aGlzIGlzIGdvb2QgZm9yLCBidXQgcHJlc2VydmUgb2xkIHNlbWFudGljcyAqLworCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmICghYXVkaW9fZGV2c1tkZXZdLT5kLT5pb2N0bCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBhdWRpb19kZXZzW2Rldl0tPmQtPmlvY3RsKGRldiwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKWFyZyk7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYXVkaW9fc3ltcy5jIGIvc291bmQvb3NzL2F1ZGlvX3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGEyMTdmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2F1ZGlvX3N5bXMuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogRXhwb3J0ZWQgc3ltYm9scyBmb3IgYXVkaW8gZHJpdmVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworY2hhciBhdWRpb19zeW1zX3N5bWJvbDsKKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInNvdW5kX2NhbGxzLmgiCisKK0VYUE9SVF9TWU1CT0woRE1BYnVmX3N0YXJ0X2RtYSk7CitFWFBPUlRfU1lNQk9MKERNQWJ1Zl9vcGVuX2RtYSk7CitFWFBPUlRfU1lNQk9MKERNQWJ1Zl9jbG9zZV9kbWEpOworRVhQT1JUX1NZTUJPTChETUFidWZfaW5wdXRpbnRyKTsKK0VYUE9SVF9TWU1CT0woRE1BYnVmX291dHB1dGludHIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2F3ZV9ody5oIGIvc291bmQvb3NzL2F3ZV9ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNDAzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYXdlX2h3LmgKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIHNvdW5kL2F3ZV9ody5oCisgKgorICogQWNjZXNzIHJvdXRpbmVzIGFuZCBkZWZpbml0aW9ucyBmb3IgdGhlIGxvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSAKKyAqIENyZWF0aXZlIEFXRTMyL1NCMzIvQVdFNjQgd2F2ZSB0YWJsZSBzeW50aC4KKyAqICAgdmVyc2lvbiAwLjQuNDsgSmFuLiA0LCAyMDAwCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTIwMDAgVGFrYXNoaSBJd2FpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2lmbmRlZiBBV0VfSFdfSF9ERUYKKyNkZWZpbmUgQVdFX0hXX0hfREVGCisKKy8qCisgKiBFbXUtODAwMCBjb250cm9sIHJlZ2lzdGVycworICogbmFtZShjaGFubmVsKQlyZWcsIHBvcnQKKyAqLworCisjZGVmaW5lIGF3ZV9jbWRfaWR4KHJlZyxjaCkJKCgocmVnKTw8IDUpIHwgKGNoKSkKKworI2RlZmluZSBEYXRhMCAgICAwCQkvKiAweDYyMDogZG91Ymxld29yZCByL3cgKi8KKyNkZWZpbmUgRGF0YTEgICAgMQkJLyogMHhBMjA6IGRvdWJsZXdvcmQgci93ICovCisjZGVmaW5lIERhdGEyICAgIDIJCS8qIDB4QTIyOiB3b3JkIHIvdyAqLworI2RlZmluZSBEYXRhMyAgICAzCQkvKiAweEUyMDogd29yZCByL3cgKi8KKyNkZWZpbmUgUG9pbnRlciAgNAkJLyogMHhFMjIgcmVnaXN0ZXIgcG9pbnRlciByL3cgKi8KKworI2RlZmluZSBBV0VfQ1BGKGNoKQlhd2VfY21kX2lkeCgwLGNoKSwgRGF0YTAJLyogRFc6IGN1cnJlbnQgcGl0Y2ggYW5kIGZyYWN0aW9uYWwgYWRkcmVzcyAqLworI2RlZmluZSBBV0VfUFRSWChjaCkJYXdlX2NtZF9pZHgoMSxjaCksIERhdGEwCS8qIERXOiBwaXRjaCB0YXJnZXQgYW5kIHJldmVyYiBzZW5kICovCisjZGVmaW5lIEFXRV9DVkNGKGNoKQlhd2VfY21kX2lkeCgyLGNoKSwgRGF0YTAJLyogRFc6IGN1cnJlbnQgdm9sdW1lIGFuZCBmaWx0ZXIgY3V0b2ZmICovCisjZGVmaW5lIEFXRV9WVEZUKGNoKQlhd2VfY21kX2lkeCgzLGNoKSwgRGF0YTAJLyogRFc6IHZvbHVtZSBhbmQgZmlsdGVyIGN1dG9mZiB0YXJnZXRzICovCisjZGVmaW5lIEFXRV8wMDgwKGNoKQlhd2VfY21kX2lkeCg0LGNoKSwgRGF0YTAJLyogRFc6ID8/ICovCisjZGVmaW5lIEFXRV8wMEEwKGNoKQlhd2VfY21kX2lkeCg1LGNoKSwgRGF0YTAJLyogRFc6ID8/ICovCisjZGVmaW5lIEFXRV9QU1NUKGNoKQlhd2VfY21kX2lkeCg2LGNoKSwgRGF0YTAJLyogRFc6IHBhbiBzZW5kIGFuZCBsb29wIHN0YXJ0IGFkZHJlc3MgKi8KKyNkZWZpbmUgQVdFX0NTTChjaCkJYXdlX2NtZF9pZHgoNyxjaCksIERhdGEwCS8qIERXOiBjaG9ydXMgc2VuZCBhbmQgbG9vcCBlbmQgYWRkcmVzcyAqLworI2RlZmluZSBBV0VfQ0NDQShjaCkJYXdlX2NtZF9pZHgoMCxjaCksIERhdGExCS8qIERXOiBRLCBjb250cm9sIGJpdHMsIGFuZCBjdXJyZW50IGFkZHJlc3MgKi8KKyNkZWZpbmUgQVdFX0hXQ0Y0CWF3ZV9jbWRfaWR4KDEsOSksICBEYXRhMQkvKiBEVzogY29uZmlnIGR3IDQgKi8KKyNkZWZpbmUgQVdFX0hXQ0Y1CWF3ZV9jbWRfaWR4KDEsMTApLCBEYXRhMQkvKiBEVzogY29uZmlnIGR3IDUgKi8KKyNkZWZpbmUgQVdFX0hXQ0Y2CWF3ZV9jbWRfaWR4KDEsMTMpLCBEYXRhMQkvKiBEVzogY29uZmlnIGR3IDYgKi8KKyNkZWZpbmUgQVdFX0hXQ0Y3CWF3ZV9jbWRfaWR4KDEsMTQpLCBEYXRhMQkvKiBEVzogY29uZmlnIGR3IDc/IChub3QgZG9jdW1lbnRlZCkgKi8KKyNkZWZpbmUgQVdFX1NNQUxSCWF3ZV9jbWRfaWR4KDEsMjApLCBEYXRhMQkvKiBEVzogc291bmQgbWVtb3J5IGFkZHJlc3MgZm9yIGxlZnQgcmVhZCAqLworI2RlZmluZSBBV0VfU01BUlIJYXdlX2NtZF9pZHgoMSwyMSksIERhdGExCS8qIERXOiAgICBmb3IgcmlnaHQgcmVhZCAqLworI2RlZmluZSBBV0VfU01BTFcJYXdlX2NtZF9pZHgoMSwyMiksIERhdGExCS8qIERXOiBzb3VuZCBtZW1vcnkgYWRkcmVzcyBmb3IgbGVmdCB3cml0ZSAqLworI2RlZmluZSBBV0VfU01BUlcJYXdlX2NtZF9pZHgoMSwyMyksIERhdGExCS8qIERXOiAgICBmb3IgcmlnaHQgd3JpdGUgKi8KKyNkZWZpbmUgQVdFX1NNTEQJYXdlX2NtZF9pZHgoMSwyNiksIERhdGExCS8qIFc6IHNvdW5kIG1lbW9yeSBsZWZ0IGRhdGEgKi8KKyNkZWZpbmUgQVdFX1NNUkQJYXdlX2NtZF9pZHgoMSwyNiksIERhdGEyCS8qIFc6ICAgIHJpZ2h0IGRhdGEgKi8KKyNkZWZpbmUgQVdFX1dDCQlhd2VfY21kX2lkeCgxLDI3KSwgRGF0YTIJLyogVzogc2FtcGxlIGNvdW50ZXIgKi8KKyNkZWZpbmUgQVdFX1dDX0NtZAlhd2VfY21kX2lkeCgxLDI3KQorI2RlZmluZSBBV0VfV0NfUG9ydAlEYXRhMgorI2RlZmluZSBBV0VfSFdDRjEJYXdlX2NtZF9pZHgoMSwyOSksIERhdGExCS8qIFc6IGNvbmZpZyB3IDEgKi8KKyNkZWZpbmUgQVdFX0hXQ0YyCWF3ZV9jbWRfaWR4KDEsMzApLCBEYXRhMQkvKiBXOiBjb25maWcgdyAyICovCisjZGVmaW5lIEFXRV9IV0NGMwlhd2VfY21kX2lkeCgxLDMxKSwgRGF0YTEJLyogVzogY29uZmlnIHcgMyAqLworI2RlZmluZSBBV0VfSU5JVDEoY2gpCWF3ZV9jbWRfaWR4KDIsY2gpLCBEYXRhMQkvKiBXOiBpbml0IGFycmF5IDEgKi8KKyNkZWZpbmUgQVdFX0lOSVQyKGNoKQlhd2VfY21kX2lkeCgyLGNoKSwgRGF0YTIJLyogVzogaW5pdCBhcnJheSAyICovCisjZGVmaW5lIEFXRV9JTklUMyhjaCkJYXdlX2NtZF9pZHgoMyxjaCksIERhdGExCS8qIFc6IGluaXQgYXJyYXkgMyAqLworI2RlZmluZSBBV0VfSU5JVDQoY2gpCWF3ZV9jbWRfaWR4KDMsY2gpLCBEYXRhMgkvKiBXOiBpbml0IGFycmF5IDQgKi8KKyNkZWZpbmUgQVdFX0VOVlZPTChjaCkJYXdlX2NtZF9pZHgoNCxjaCksIERhdGExCS8qIFc6IHZvbHVtZSBlbnZlbG9wZSBkZWxheSAqLworI2RlZmluZSBBV0VfRENZU1VTVihjaCkJYXdlX2NtZF9pZHgoNSxjaCksIERhdGExCS8qIFc6IHZvbHVtZSBlbnZlbG9wZSBzdXN0YWluIGFuZCBkZWNheSAqLworI2RlZmluZSBBV0VfRU5WVkFMKGNoKQlhd2VfY21kX2lkeCg2LGNoKSwgRGF0YTEJLyogVzogbW9kdWxhdGlvbiBlbnZlbG9wZSBkZWxheSAqLworI2RlZmluZSBBV0VfRENZU1VTKGNoKQlhd2VfY21kX2lkeCg3LGNoKSwgRGF0YTEJLyogVzogbW9kdWxhdGlvbiBlbnZlbG9wZSBzdXN0YWluIGFuZCBkZWNheSAqLworI2RlZmluZSBBV0VfQVRLSExEVihjaCkJYXdlX2NtZF9pZHgoNCxjaCksIERhdGEyCS8qIFc6IHZvbHVtZSBlbnZlbG9wZSBhdHRhY2sgYW5kIGhvbGQgKi8KKyNkZWZpbmUgQVdFX0xGTzFWQUwoY2gpCWF3ZV9jbWRfaWR4KDUsY2gpLCBEYXRhMgkvKiBXOiBMRk8jMSBEZWxheSAqLworI2RlZmluZSBBV0VfQVRLSExEKGNoKQlhd2VfY21kX2lkeCg2LGNoKSwgRGF0YTIJLyogVzogbW9kdWxhdGlvbiBlbnZlbG9wZSBhdHRhY2sgYW5kIGhvbGQgKi8KKyNkZWZpbmUgQVdFX0xGTzJWQUwoY2gpCWF3ZV9jbWRfaWR4KDcsY2gpLCBEYXRhMgkvKiBXOiBMRk8jMiBEZWxheSAqLworI2RlZmluZSBBV0VfSVAoY2gpCWF3ZV9jbWRfaWR4KDAsY2gpLCBEYXRhMwkvKiBXOiBpbml0aWFsIHBpdGNoICovCisjZGVmaW5lIEFXRV9JRkFUTihjaCkJYXdlX2NtZF9pZHgoMSxjaCksIERhdGEzCS8qIFc6IGluaXRpYWwgZmlsdGVyIGN1dG9mZiBhbmQgYXR0ZW51YXRpb24gKi8KKyNkZWZpbmUgQVdFX1BFRkUoY2gpCWF3ZV9jbWRfaWR4KDIsY2gpLCBEYXRhMwkvKiBXOiBwaXRjaCBhbmQgZmlsdGVyIGVudmVsb3BlIGhlaWdodHMgKi8KKyNkZWZpbmUgQVdFX0ZNTU9EKGNoKQlhd2VfY21kX2lkeCgzLGNoKSwgRGF0YTMJLyogVzogdmlicmF0byBhbmQgZmlsdGVyIG1vZHVsYXRpb24gZnJlcSAqLworI2RlZmluZSBBV0VfVFJFTUZSUShjaCkJYXdlX2NtZF9pZHgoNCxjaCksIERhdGEzCS8qIFc6IExGTyMxIHRyZW1vbG8gYW1vdW50IGFuZCBmcmVxICovCisjZGVmaW5lIEFXRV9GTTJGUlEyKGNoKQlhd2VfY21kX2lkeCg1LGNoKSwgRGF0YTMJLyogVzogTEZPIzIgdmlicmF0byBhbW91bnQgYW5kIGZyZXEgKi8KKworLyogdXNlZCBkdXJpbmcgZGV0ZWN0aW9uIChyZXR1cm5zIFJPTSB2ZXJzaW9uPzsgbm90IGRvY3VtZW50ZWQgaW4gQURJUCkgKi8KKyNkZWZpbmUgQVdFX1UxCQkweEUwLCBEYXRhMwkgIC8qIChSKShXKSB1c2VkIGluIGluaXRpYWxpemF0aW9uICovCisjZGVmaW5lIEFXRV9VMihjaCkJMHhDMCsoY2gpLCBEYXRhMyAgLyogKFcpKFcpIHVzZWQgaW4gaW5pdCBlbnZlbG9wZSAgKi8KKworCisjZGVmaW5lIEFXRV9NQVhfVk9JQ0VTCQkzMgorI2RlZmluZSBBV0VfTk9STUFMX1ZPSUNFUwkzMAkvKjMwJjMxIGFyZSByZXNlcnZlZCBmb3IgRFJBTSByZWZyZXNoKi8KKworI2RlZmluZSBBV0VfTUFYX0NIQU5ORUxTCTMyCS8qIG1heCBtaWRpIGNoYW5uZWxzIChtdXN0ID49IHZvaWNlcykgKi8KKyNkZWZpbmUgQVdFX01BWF9MQVlFUlMJQVdFX01BWF9WT0lDRVMJLyogbWF4aW11bSBudW1iZXIgb2YgbXVsdGlwbGUgbGF5ZXJzICovCisKKyNkZWZpbmUgQVdFX0RSQU1fT0ZGU0VUCQkweDIwMDAwMAorI2RlZmluZSBBV0VfTUFYX0RSQU1fU0laRQkoMjggKiAxMDI0KQkvKiAyOCBNQiBpcyBtYXggb25ib2FyZCBtZW1vcnkgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvYXdlX3dhdmUuYyBiL3NvdW5kL29zcy9hd2Vfd2F2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyYjliZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYXdlX3dhdmUuYwpAQCAtMCwwICsxLDYxNDcgQEAKKy8qCisgKiBzb3VuZC9hd2Vfd2F2ZS5jCisgKgorICogVGhlIGxvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSBBV0UzMi9TQjMyL0FXRTY0IHdhdmUgdGFibGUgc3ludGguCisgKiAgIHZlcnNpb24gMC40LjQ7IEphbi4gNCwgMjAwMAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5Ni0yMDAwIFRha2FzaGkgSXdhaQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiBDaGFuZ2Vsb2c6CisgKiBBdWcgMTgsIDIwMDMsIEFkYW0gQmVsYXkgPGFtYngxQG5lby5yci5jb20+CisgKiAtIGRldGVjdGlvbiBjb2RlIHJld3JpdGUKKyAqLworCisjaW5jbHVkZSA8bGludXgvYXdlX3ZvaWNlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJhd2Vfd2F2ZS5oIgorI2luY2x1ZGUgImF3ZV9ody5oIgorCisjaWZkZWYgQVdFX0hBU19HVVNfQ09NUEFUSUJJTElUWQorI2luY2x1ZGUgInR1bmluZy5oIgorI2luY2x1ZGUgPGxpbnV4L3VsdHJhc291bmQuaD4KKyNlbmRpZgorCisvKgorICogZGVidWcgbWVzc2FnZQorICovCisKKyNpZmRlZiBBV0VfREVCVUdfT04KKyNkZWZpbmUgREVCVUcoTFZMLFhYWCkJe2lmIChjdHJsc1tBV0VfTURfREVCVUdfTU9ERV0gPiBMVkwpIHsgWFhYOyB9fQorI2RlZmluZSBFUlJNU0coWFhYKQl7aWYgKGN0cmxzW0FXRV9NRF9ERUJVR19NT0RFXSkgeyBYWFg7IH19CisjZGVmaW5lIEZBVEFMRVJSKFhYWCkJWFhYCisjZWxzZQorI2RlZmluZSBERUJVRyhMVkwsWFhYKSAvKiovCisjZGVmaW5lIEVSUk1TRyhYWFgpCVhYWAorI2RlZmluZSBGQVRBTEVSUihYWFgpCVhYWAorI2VuZGlmCisKKy8qCisgKiBiYW5rIGFuZCB2b2ljZSByZWNvcmQKKyAqLworCit0eXBlZGVmIHN0cnVjdCBfc2ZfbGlzdCBzZl9saXN0OwordHlwZWRlZiBzdHJ1Y3QgX2F3ZV92b2ljZV9saXN0IGF3ZV92b2ljZV9saXN0OwordHlwZWRlZiBzdHJ1Y3QgX2F3ZV9zYW1wbGVfbGlzdCBhd2Vfc2FtcGxlX2xpc3Q7CisKKy8qIHNvdW5kZm9udCByZWNvcmQgKi8KK3N0cnVjdCBfc2ZfbGlzdCB7CisJdW5zaWduZWQgc2hvcnQgc2ZfaWQ7CS8qIGlkIG51bWJlciAqLworCXVuc2lnbmVkIHNob3J0IHR5cGU7CS8qIGxvY2sgJiBzaGFyZWQgZmxhZ3MgKi8KKwlpbnQgbnVtX2luZm87CQkvKiBjdXJyZW50IGluZm8gdGFibGUgaW5kZXggKi8KKwlpbnQgbnVtX3NhbXBsZTsJCS8qIGN1cnJlbnQgc2FtcGxlIHRhYmxlIGluZGV4ICovCisJaW50IG1lbV9wdHI7CQkvKiBjdXJyZW50IHdvcmQgYnl0ZSBwb2ludGVyICovCisJYXdlX3ZvaWNlX2xpc3QgKmluZm9zLCAqbGFzdF9pbmZvczsJLyogaW5zdHJ1bWVudHMgKi8KKwlhd2Vfc2FtcGxlX2xpc3QgKnNhbXBsZXMsICpsYXN0X3NhbXBsZXM7CS8qIHNhbXBsZXMgKi8KKyNpZmRlZiBBV0VfQUxMT1dfU0FNUExFX1NIQVJJTkcKKwlzZl9saXN0ICpzaGFyZWQ7CS8qIHNoYXJlZCBsaXN0ICovCisJdW5zaWduZWQgY2hhciBuYW1lW0FXRV9QQVRDSF9OQU1FX0xFTl07CS8qIHNoYXJpbmcgaWQgKi8KKyNlbmRpZgorCXNmX2xpc3QgKm5leHQsICpwcmV2OworfTsKKworLyogaW5zdHJ1bWVudCBsaXN0ICovCitzdHJ1Y3QgX2F3ZV92b2ljZV9saXN0IHsKKwlhd2Vfdm9pY2VfaW5mbyB2OwkvKiBpbnN0cnVtZW50IGluZm9ybWF0aW9uICovCisJc2ZfbGlzdCAqaG9sZGVyOwkvKiBwYXJlbnQgc2ZfbGlzdCBvZiB0aGlzIHJlY29yZCAqLworCXVuc2lnbmVkIGNoYXIgYmFuaywgaW5zdHI7CS8qIHByZXNldCBudW1iZXIgaW5mb3JtYXRpb24gKi8KKwljaGFyIHR5cGUsIGRpc2FibGVkOwkvKiB0eXBlPW5vcm1hbC9tYXBwZWQsIGRpc2FibGVkPWJvb2xlYW4gKi8KKwlhd2Vfdm9pY2VfbGlzdCAqbmV4dDsJLyogbGlua2VkIGxpc3Qgd2l0aCBzYW1lIHNmX2lkICovCisJYXdlX3ZvaWNlX2xpc3QgKm5leHRfaW5zdHI7CS8qIGluc3RydW1lbnQgbGlzdCAqLworCWF3ZV92b2ljZV9saXN0ICpuZXh0X2Jhbms7CS8qIGhhc2ggdGFibGUgbGlzdCAqLworfTsKKworLyogdm9pY2UgbGlzdCB0eXBlICovCisjZGVmaW5lIFZfU1RfTk9STUFMCTAKKyNkZWZpbmUgVl9TVF9NQVBQRUQJMQorCisvKiBzYW1wbGUgbGlzdCAqLworc3RydWN0IF9hd2Vfc2FtcGxlX2xpc3QgeworCWF3ZV9zYW1wbGVfaW5mbyB2OwkvKiBzYW1wbGUgaW5mb3JtYXRpb24gKi8KKwlzZl9saXN0ICpob2xkZXI7CS8qIHBhcmVudCBzZl9saXN0IG9mIHRoaXMgcmVjb3JkICovCisJYXdlX3NhbXBsZV9saXN0ICpuZXh0OwkvKiBsaW5rZWQgbGlzdCB3aXRoIHNhbWUgc2ZfaWQgKi8KK307CisKKy8qIHNhbXBsZSBhbmQgaW5mb3JtYXRpb24gdGFibGUgKi8KK3N0YXRpYyBpbnQgY3VycmVudF9zZl9pZDsJLyogY3VycmVudCBudW1iZXIgb2YgZm9udHMgKi8KK3N0YXRpYyBpbnQgbG9ja2VkX3NmX2lkOwkvKiBsb2NrZWQgcG9zaXRpb24gKi8KK3N0YXRpYyBzZl9saXN0ICpzZmhlYWQsICpzZnRhaWw7CS8qIGxpbmtlZC1saXN0cyAqLworCisjZGVmaW5lIGF3ZV9mcmVlX21lbV9wdHIoKSAoc2Z0YWlsID8gc2Z0YWlsLT5tZW1fcHRyIDogMCkKKyNkZWZpbmUgYXdlX2ZyZWVfaW5mbygpIChzZnRhaWwgPyBzZnRhaWwtPm51bV9pbmZvIDogMCkKKyNkZWZpbmUgYXdlX2ZyZWVfc2FtcGxlKCkgKHNmdGFpbCA/IHNmdGFpbC0+bnVtX3NhbXBsZSA6IDApCisKKyNkZWZpbmUgQVdFX01BWF9QUkVTRVRTCQkyNTYKKyNkZWZpbmUgQVdFX0RFRkFVTFRfUFJFU0VUCTAKKyNkZWZpbmUgQVdFX0RFRkFVTFRfQkFOSwkwCisjZGVmaW5lIEFXRV9ERUZBVUxUX0RSVU0JMAorI2RlZmluZSBBV0VfRFJVTV9CQU5LCQkxMjgKKworI2RlZmluZSBNQVhfTEFZRVJTCUFXRV9NQVhfVk9JQ0VTCisKKy8qIHByZXNldCB0YWJsZSBpbmRleCAqLworc3RhdGljIGF3ZV92b2ljZV9saXN0ICpwcmVzZXRfdGFibGVbQVdFX01BWF9QUkVTRVRTXTsKKworLyoKKyAqIHZvaWNlIHRhYmxlCisgKi8KKworLyogZWZmZWN0cyB0YWJsZSAqLwordHlwZWRlZglzdHJ1Y3QgRlhfUmVjIHsgLyogY2hhbm5lbCBlZmZlY3RzICovCisJdW5zaWduZWQgY2hhciBmbGFnc1tBV0VfRlhfRU5EXTsKKwlzaG9ydCB2YWxbQVdFX0ZYX0VORF07Cit9IEZYX1JlYzsKKworCisvKiBjaGFubmVsIHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IF9hd2VfY2hhbl9pbmZvIHsKKwlpbnQgY2hhbm5lbDsJCS8qIGNoYW5uZWwgbnVtYmVyICovCisJaW50IGJhbms7CQkvKiBjdXJyZW50IHRvbmUgYmFuayAqLworCWludCBpbnN0cjsJCS8qIGN1cnJlbnQgcHJvZ3JhbSAqLworCWludCBiZW5kZXI7CQkvKiBtaWRpIHBpdGNoYmVuZCAoLTgxOTIgLSA4MTkyKSAqLworCWludCBiZW5kZXJfcmFuZ2U7CS8qIG1pZGkgYmVuZGVyIHJhbmdlICh4MTAwKSAqLworCWludCBwYW5uaW5nOwkJLyogcGFubmluZyAoMC0xMjcpICovCisJaW50IG1haW5fdm9sOwkJLyogY2hhbm5lbCB2b2x1bWUgKDAtMTI3KSAqLworCWludCBleHByZXNzaW9uX3ZvbDsJLyogbWlkaSBleHByZXNzaW9uICgwLTEyNykgKi8KKwlpbnQgY2hhbl9wcmVzczsJCS8qIGNoYW5uZWwgcHJlc3N1cmUgKi8KKwlpbnQgc3VzdGFpbmVkOwkJLyogc3VzdGFpbiBzdGF0dXMgaW4gTUlESSAqLworCUZYX1JlYyBmeDsJCS8qIGVmZmVjdHMgKi8KKwlGWF9SZWMgZnhfbGF5ZXJbTUFYX0xBWUVSU107IC8qIGxheWVyIGVmZmVjdHMgKi8KK30gYXdlX2NoYW5faW5mbzsKKworLyogdm9pY2UgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgX3ZvaWNlX2luZm8geworCWludCBzdGF0ZTsKKyNkZWZpbmUgQVdFX1NUX09GRgkJKDE8PDApCS8qIG5vIHNvdW5kICovCisjZGVmaW5lIEFXRV9TVF9PTgkJKDE8PDEpCS8qIHBsYXlpbmcgKi8KKyNkZWZpbmUgQVdFX1NUX1NUQU5EQlkJCSgxPDwyKQkvKiBzdGFuZCBieSBmb3IgcGxheWluZyAqLworI2RlZmluZSBBV0VfU1RfU1VTVEFJTkVECSgxPDwzKQkvKiBzdXN0YWluZWQgKi8KKyNkZWZpbmUgQVdFX1NUX01BUksJCSgxPDw0KQkvKiBtYXJrZWQgZm9yIGFsbG9jYXRpb24gKi8KKyNkZWZpbmUgQVdFX1NUX0RSQU0JCSgxPDw1KQkvKiBEUkFNIHJlYWQvd3JpdGUgKi8KKyNkZWZpbmUgQVdFX1NUX0ZNCQkoMTw8NikJLyogcmVzZXJ2ZWQgZm9yIEZNICovCisjZGVmaW5lIEFXRV9TVF9SRUxFQVNFRAkJKDE8PDcpCS8qIHJlbGVhc2VkICovCisKKwlpbnQgY2g7CQkJLyogbWlkaSBjaGFubmVsICovCisJaW50IGtleTsJCS8qIGludGVybmFsIGtleSBmb3Igc2VhcmNoICovCisJaW50IGxheWVyOwkJLyogbGF5ZXIgbnVtYmVyIChmb3IgY2hhbm5lbCBtb2RlIG9ubHkpICovCisJaW50IHRpbWU7CQkvKiBhbGxvY2F0ZWQgdGltZSAqLworCWF3ZV9jaGFuX2luZm8JKmNpbmZvOwkvKiBjaGFubmVsIGluZm8gKi8KKworCWludCBub3RlOwkJLyogbWlkaSBrZXkgKDAtMTI3KSAqLworCWludCB2ZWxvY2l0eTsJCS8qIG1pZGkgdmVsb2NpdHkgKDAtMTI3KSAqLworCWludCBzb3N0ZW51dG87CQkvKiBzb3N0ZW51dG8gb24vb2ZmICovCisJYXdlX3ZvaWNlX2luZm8gKnNhbXBsZTsJLyogYXNzaWduZWQgdm9pY2UgKi8KKworCS8qIEVNVTgwMDAgcGFyYW1ldGVycyAqLworCWludCBhcGl0Y2g7CQkvKiBwaXRjaCBwYXJhbWV0ZXIgKi8KKwlpbnQgYXZvbDsJCS8qIHZvbHVtZSBwYXJhbWV0ZXIgKi8KKwlpbnQgYXBhbjsJCS8qIHBhbm5pbmcgcGFyYW1ldGVyICovCisJaW50IGFjdXRvZmY7CQkvKiBjdXRvZmYgcGFyYW1ldGVyICovCisJc2hvcnQgYWF1eDsJCS8qIGF1eCB3b3JkICovCit9IHZvaWNlX2luZm87CisKKy8qIHZvaWNlIGluZm9ybWF0aW9uICovCitzdGF0aWMgdm9pY2VfaW5mbyB2b2ljZXNbQVdFX01BWF9WT0lDRVNdOworCisjZGVmaW5lIElTX05PX1NPVU5EKHYpCSh2b2ljZXNbdl0uc3RhdGUgJiAoQVdFX1NUX09GRnxBV0VfU1RfUkVMRUFTRUR8QVdFX1NUX1NUQU5EQll8QVdFX1NUX1NVU1RBSU5FRCkpCisjZGVmaW5lIElTX05PX0VGRkVDVCh2KQkodm9pY2VzW3ZdLnN0YXRlICE9IEFXRV9TVF9PTikKKyNkZWZpbmUgSVNfUExBWUlORyh2KQkodm9pY2VzW3ZdLnN0YXRlICYgKEFXRV9TVF9PTnxBV0VfU1RfU1VTVEFJTkVEfEFXRV9TVF9SRUxFQVNFRCkpCisjZGVmaW5lIElTX0VNUFRZKHYpCSh2b2ljZXNbdl0uc3RhdGUgJiAoQVdFX1NUX09GRnxBV0VfU1RfTUFSS3xBV0VfU1RfRFJBTXxBV0VfU1RfRk0pKQorCisKKy8qIE1JREkgY2hhbm5lbCBlZmZlY3RzIGluZm9ybWF0aW9uIChmb3IgaHcgY29udHJvbCkgKi8KK3N0YXRpYyBhd2VfY2hhbl9pbmZvIGNoYW5uZWxzW0FXRV9NQVhfQ0hBTk5FTFNdOworCisKKy8qCisgKiBnbG9iYWwgdmFyaWFibGVzCisgKi8KKworI2lmbmRlZiBBV0VfREVGQVVMVF9CQVNFX0FERFIKKyNkZWZpbmUgQVdFX0RFRkFVTFRfQkFTRV9BRERSCTAJLyogYXV0b2RldGVjdCAqLworI2VuZGlmCisKKyNpZm5kZWYgQVdFX0RFRkFVTFRfTUVNX1NJWkUKKyNkZWZpbmUgQVdFX0RFRkFVTFRfTUVNX1NJWkUJLTEJLyogYXV0b2RldGVjdCAqLworI2VuZGlmCisKK3N0YXRpYyBpbnQgaW8gPSBBV0VfREVGQVVMVF9CQVNFX0FERFI7IC8qIEVtdTgwMDAgYmFzZSBhZGRyZXNzICovCitzdGF0aWMgaW50IG1lbXNpemUgPSBBV0VfREVGQVVMVF9NRU1fU0laRTsgLyogbWVtb3J5IHNpemUgaW4gS2J5dGVzICovCisjaWZkZWYgQ09ORklHX1BOUAorc3RhdGljIGludCBpc2FwbnAgPSAtMTsKKyNlbHNlCitzdGF0aWMgaW50IGlzYXBucDsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJUYWthc2hpIEl3YWkgPGl3YWlAd3cudW5pLWVybGFuZ2VuLmRlPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTQiBBV0UzMi82NCBXYXZlVGFibGUgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sICJiYXNlIGkvbyBwb3J0IG9mIEVtdTgwMDAiKTsKK21vZHVsZV9wYXJhbShtZW1zaXplLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtZW1zaXplLCAib25ib2FyZCBEUkFNIHNpemUgaW4gS2J5dGVzIik7Cittb2R1bGVfcGFyYW0oaXNhcG5wLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXNhcG5wLCAidXNlIElTQVBuUCBkZXRlY3Rpb24iKTsKKworLyogRFJBTSBzdGFydCBvZmZzZXQgKi8KK3N0YXRpYyBpbnQgYXdlX21lbV9zdGFydCA9IEFXRV9EUkFNX09GRlNFVDsKKworLyogbWF4aW11bSBjaGFubmVscyBmb3IgcGxheWluZyAqLworc3RhdGljIGludCBhd2VfbWF4X3ZvaWNlcyA9IEFXRV9NQVhfVk9JQ0VTOworCitzdGF0aWMgaW50IHBhdGNoX29wZW5lZDsJCS8qIHNhbXBsZSBhbHJlYWR5IGxvYWRlZD8gKi8KKworc3RhdGljIGNoYXIgYXR0ZW5fcmVsYXRpdmUgPSBGQUxTRTsKK3N0YXRpYyBzaG9ydCBhdHRlbl9vZmZzZXQ7CisKK3N0YXRpYyBpbnQgYXdlX3ByZXNlbnQgPSBGQUxTRTsJCS8qIGF3ZSBkZXZpY2UgcHJlc2VudD8gKi8KK3N0YXRpYyBpbnQgYXdlX2J1c3kgPSBGQUxTRTsJCS8qIGF3ZSBkZXZpY2Ugb3BlbmVkPyAqLworCitzdGF0aWMgaW50IG15X2RldiA9IC0xOworCisjZGVmaW5lIERFRkFVTFRfRFJVTV9GTEFHUwkoKDEgPDwgOSkgfCAoMSA8PCAyNSkpCisjZGVmaW5lIElTX0RSVU1fQ0hBTk5FTChjKQkoZHJ1bV9mbGFncyAmICgxIDw8IChjKSkpCisjZGVmaW5lIERSVU1fQ0hBTk5FTF9PTihjKQkoZHJ1bV9mbGFncyB8PSAoMSA8PCAoYykpKQorI2RlZmluZSBEUlVNX0NIQU5ORUxfT0ZGKGMpCShkcnVtX2ZsYWdzICY9IH4oMSA8PCAoYykpKQorc3RhdGljIHVuc2lnbmVkIGludCBkcnVtX2ZsYWdzID0gREVGQVVMVF9EUlVNX0ZMQUdTOyAvKiBjaGFubmVsIGZsYWdzICovCisKK3N0YXRpYyBpbnQgcGxheWluZ19tb2RlID0gQVdFX1BMQVlfSU5ESVJFQ1Q7CisjZGVmaW5lIFNJTkdMRV9MQVlFUl9NT0RFKCkJKHBsYXlpbmdfbW9kZSA9PSBBV0VfUExBWV9JTkRJUkVDVCB8fCBwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfRElSRUNUKQorI2RlZmluZSBNVUxUSV9MQVlFUl9NT0RFKCkJKHBsYXlpbmdfbW9kZSA9PSBBV0VfUExBWV9NVUxUSSB8fCBwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfTVVMVEkyKQorCitzdGF0aWMgaW50IGN1cnJlbnRfYWxsb2NfdGltZTsgIAkvKiB2b2ljZSBhbGxvY2F0aW9uIGluZGV4IGZvciBjaGFubmVsIG1vZGUgKi8KKworc3RhdGljIHN0cnVjdCBzeW50aF9pbmZvIGF3ZV9pbmZvID0geworCSJBV0UzMiBTeW50aCIsCQkvKiBuYW1lICovCisJMCwJCQkvKiBkZXZpY2UgKi8KKwlTWU5USF9UWVBFX1NBTVBMRSwJLyogc3ludGhfdHlwZSAqLworCVNBTVBMRV9UWVBFX0FXRTMyLAkvKiBzeW50aF9zdWJ0eXBlICovCisJMCwJCQkvKiBwZXJjX21vZGUgKG9ic29sZXRlKSAqLworCUFXRV9NQVhfVk9JQ0VTLAkJLyogbnJfdm9pY2VzICovCisJMCwJCQkvKiBucl9kcnVtcyAob2Jzb2xldGUpICovCisJNDAwCQkJLyogaW5zdHJfYmFua19zaXplICovCit9OworCisKK3N0YXRpYyBzdHJ1Y3Qgdm9pY2VfYWxsb2NfaW5mbyAqdm9pY2VfYWxsb2M7CS8qIHNldCBhdCBpbml0aWFsaXphdGlvbiAqLworCisKKy8qCisgKiBmdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KKworc3RhdGljIGludCBhd2VfcmVxdWVzdF9yZWdpb24odm9pZCk7CitzdGF0aWMgdm9pZCBhd2VfcmVsZWFzZV9yZWdpb24odm9pZCk7CisKK3N0YXRpYyB2b2lkIGF3ZV9yZXNldF9zYW1wbGVzKHZvaWQpOworLyogZW11ODAwMCBjaGlwIGkvbyBhY2Nlc3MgKi8KK3N0YXRpYyB2b2lkIHNldHVwX3BvcnRzKGludCBwMSwgaW50IHAyLCBpbnQgcDMpOworc3RhdGljIHZvaWQgYXdlX3Bva2UodW5zaWduZWQgc2hvcnQgY21kLCB1bnNpZ25lZCBzaG9ydCBwb3J0LCB1bnNpZ25lZCBzaG9ydCBkYXRhKTsKK3N0YXRpYyB2b2lkIGF3ZV9wb2tlX2R3KHVuc2lnbmVkIHNob3J0IGNtZCwgdW5zaWduZWQgc2hvcnQgcG9ydCwgdW5zaWduZWQgaW50IGRhdGEpOworc3RhdGljIHVuc2lnbmVkIHNob3J0IGF3ZV9wZWVrKHVuc2lnbmVkIHNob3J0IGNtZCwgdW5zaWduZWQgc2hvcnQgcG9ydCk7CitzdGF0aWMgdW5zaWduZWQgaW50IGF3ZV9wZWVrX2R3KHVuc2lnbmVkIHNob3J0IGNtZCwgdW5zaWduZWQgc2hvcnQgcG9ydCk7CitzdGF0aWMgdm9pZCBhd2Vfd2FpdCh1bnNpZ25lZCBzaG9ydCBkZWxheSk7CisKKy8qIGluaXRpYWxpemUgZW11ODAwMCBjaGlwICovCitzdGF0aWMgdm9pZCBhd2VfaW5pdGlhbGl6ZSh2b2lkKTsKKworLyogc2V0IHZvaWNlIHBhcmFtZXRlcnMgKi8KK3N0YXRpYyB2b2lkIGF3ZV9pbml0X2N0cmxfcGFybXMoaW50IGluaXRfYWxsKTsKK3N0YXRpYyB2b2lkIGF3ZV9pbml0X3ZvaWNlX2luZm8oYXdlX3ZvaWNlX2luZm8gKnZwKTsKK3N0YXRpYyB2b2lkIGF3ZV9pbml0X3ZvaWNlX3Bhcm0oYXdlX3ZvaWNlX3Bhcm0gKnBwKTsKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCitzdGF0aWMgaW50IGZyZXFfdG9fbm90ZShpbnQgZnJlcSk7CitzdGF0aWMgaW50IGNhbGNfcmF0ZV9vZmZzZXQoaW50IEh6KTsKKy8qc3RhdGljIGludCBjYWxjX3Bhcm1fZGVsYXkoaW50IG1zZWMpOyovCitzdGF0aWMgaW50IGNhbGNfcGFybV9ob2xkKGludCBtc2VjKTsKK3N0YXRpYyBpbnQgY2FsY19wYXJtX2F0dGFjayhpbnQgbXNlYyk7CitzdGF0aWMgaW50IGNhbGNfcGFybV9kZWNheShpbnQgbXNlYyk7CitzdGF0aWMgaW50IGNhbGNfcGFybV9zZWFyY2goaW50IG1zZWMsIHNob3J0ICp0YWJsZSk7CisjZW5kaWYgLyogZ3VzIGNvbXBhdCAqLworCisvKiB0dXJuIG9uL29mZiBub3RlICovCitzdGF0aWMgdm9pZCBhd2Vfbm90ZV9vbihpbnQgdm9pY2UpOworc3RhdGljIHZvaWQgYXdlX25vdGVfb2ZmKGludCB2b2ljZSk7CitzdGF0aWMgdm9pZCBhd2VfdGVybWluYXRlKGludCB2b2ljZSk7CitzdGF0aWMgdm9pZCBhd2VfZXhjbHVzaXZlX29mZihpbnQgdm9pY2UpOworc3RhdGljIHZvaWQgYXdlX25vdGVfb2ZmX2FsbChpbnQgZG9fc3VzdGFpbik7CisKKy8qIGNhbGN1bGF0ZSB2b2ljZSBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHZvaWQgKCpmeF9hZmZlY3RfZnVuYykoaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV9zZXRfcGl0Y2goaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV9zZXRfdm9pY2VfcGl0Y2goaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV9zZXRfdm9sdW1lKGludCB2b2ljZSwgaW50IGZvcmNlZCk7CitzdGF0aWMgdm9pZCBhd2Vfc2V0X3ZvaWNlX3ZvbChpbnQgdm9pY2UsIGludCBmb3JjZWQpOworc3RhdGljIHZvaWQgYXdlX3NldF9wYW4oaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV9meF9mbW1vZChpbnQgdm9pY2UsIGludCBmb3JjZWQpOworc3RhdGljIHZvaWQgYXdlX2Z4X3RyZW1mcnEoaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV9meF9mbTJmcnEyKGludCB2b2ljZSwgaW50IGZvcmNlZCk7CitzdGF0aWMgdm9pZCBhd2VfZnhfZmlsdGVyUShpbnQgdm9pY2UsIGludCBmb3JjZWQpOworc3RhdGljIHZvaWQgYXdlX2NhbGNfcGl0Y2goaW50IHZvaWNlKTsKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCitzdGF0aWMgdm9pZCBhd2VfY2FsY19waXRjaF9mcm9tX2ZyZXEoaW50IHZvaWNlLCBpbnQgZnJlcSk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGF3ZV9jYWxjX3ZvbHVtZShpbnQgdm9pY2UpOworc3RhdGljIHZvaWQgYXdlX3VwZGF0ZV92b2x1bWUodm9pZCk7CitzdGF0aWMgdm9pZCBhd2VfY2hhbmdlX21hc3Rlcl92b2x1bWUoc2hvcnQgdmFsKTsKK3N0YXRpYyB2b2lkIGF3ZV92b2ljZV9pbml0KGludCB2b2ljZSwgaW50IGluaXRfYWxsKTsKK3N0YXRpYyB2b2lkIGF3ZV9jaGFubmVsX2luaXQoaW50IGNoLCBpbnQgaW5pdF9hbGwpOworc3RhdGljIHZvaWQgYXdlX2Z4X2luaXQoaW50IGNoKTsKK3N0YXRpYyB2b2lkIGF3ZV9zZW5kX2VmZmVjdChpbnQgdm9pY2UsIGludCBsYXllciwgaW50IHR5cGUsIGludCB2YWwpOworc3RhdGljIHZvaWQgYXdlX21vZHdoZWVsX2NoYW5nZShpbnQgdm9pY2UsIGludCB2YWx1ZSk7CisKKy8qIHNlcXVlbmNlciBpbnRlcmZhY2UgKi8KK3N0YXRpYyBpbnQgYXdlX29wZW4oaW50IGRldiwgaW50IG1vZGUpOworc3RhdGljIHZvaWQgYXdlX2Nsb3NlKGludCBkZXYpOworc3RhdGljIGludCBhd2VfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpOworc3RhdGljIGludCBhd2Vfa2lsbF9ub3RlKGludCBkZXYsIGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSk7CitzdGF0aWMgaW50IGF3ZV9zdGFydF9ub3RlKGludCBkZXYsIGludCB2LCBpbnQgbm90ZV9udW0sIGludCB2b2x1bWUpOworc3RhdGljIGludCBhd2Vfc2V0X2luc3RyKGludCBkZXYsIGludCB2b2ljZSwgaW50IGluc3RyX25vKTsKK3N0YXRpYyBpbnQgYXdlX3NldF9pbnN0cl8yKGludCBkZXYsIGludCB2b2ljZSwgaW50IGluc3RyX25vKTsKK3N0YXRpYyB2b2lkIGF3ZV9yZXNldChpbnQgZGV2KTsKK3N0YXRpYyB2b2lkIGF3ZV9od19jb250cm9sKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KTsKK3N0YXRpYyBpbnQgYXdlX2xvYWRfcGF0Y2goaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJCQkgIGludCBvZmZzLCBpbnQgY291bnQsIGludCBwbWdyX2ZsYWcpOworc3RhdGljIHZvaWQgYXdlX2FmdGVydG91Y2goaW50IGRldiwgaW50IHZvaWNlLCBpbnQgcHJlc3N1cmUpOworc3RhdGljIHZvaWQgYXdlX2NvbnRyb2xsZXIoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgY3RybF9udW0sIGludCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBhd2VfcGFubmluZyhpbnQgZGV2LCBpbnQgdm9pY2UsIGludCB2YWx1ZSk7CitzdGF0aWMgdm9pZCBhd2Vfdm9sdW1lX21ldGhvZChpbnQgZGV2LCBpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCBhd2VfYmVuZGVyKGludCBkZXYsIGludCB2b2ljZSwgaW50IHZhbHVlKTsKK3N0YXRpYyBpbnQgYXdlX2FsbG9jKGludCBkZXYsIGludCBjaG4sIGludCBub3RlLCBzdHJ1Y3Qgdm9pY2VfYWxsb2NfaW5mbyAqYWxsb2MpOworc3RhdGljIHZvaWQgYXdlX3NldHVwX3ZvaWNlKGludCBkZXYsIGludCB2b2ljZSwgaW50IGNobik7CisKKyNkZWZpbmUgYXdlX2tleV9wcmVzc3VyZShkZXYsdm9pY2Usa2V5LHByZXNzKSBhd2Vfc3RhcnRfbm90ZShkZXYsdm9pY2UsKGtleSkrMTI4LHByZXNzKQorCisvKiBoYXJkd2FyZSBjb250cm9scyAqLworI2lmZGVmIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkKK3N0YXRpYyB2b2lkIGF3ZV9od19ndXNfY29udHJvbChpbnQgZGV2LCBpbnQgY21kLCB1bnNpZ25lZCBjaGFyICpldmVudCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIGF3ZV9od19hd2VfY29udHJvbChpbnQgZGV2LCBpbnQgY21kLCB1bnNpZ25lZCBjaGFyICpldmVudCk7CitzdGF0aWMgdm9pZCBhd2Vfdm9pY2VfY2hhbmdlKGludCB2b2ljZSwgZnhfYWZmZWN0X2Z1bmMgZnVuYyk7CitzdGF0aWMgdm9pZCBhd2Vfc29zdGVudXRvX29uKGludCB2b2ljZSwgaW50IGZvcmNlZCk7CitzdGF0aWMgdm9pZCBhd2Vfc3VzdGFpbl9vZmYoaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKK3N0YXRpYyB2b2lkIGF3ZV90ZXJtaW5hdGVfYW5kX2luaXQoaW50IHZvaWNlLCBpbnQgZm9yY2VkKTsKKworLyogdm9pY2Ugc2VhcmNoICovCitzdGF0aWMgaW50IGF3ZV9zZWFyY2hfa2V5KGludCBiYW5rLCBpbnQgcHJlc2V0LCBpbnQgbm90ZSk7CitzdGF0aWMgYXdlX3ZvaWNlX2xpc3QgKmF3ZV9zZWFyY2hfaW5zdHIoaW50IGJhbmssIGludCBwcmVzZXQsIGludCBub3RlKTsKK3N0YXRpYyBpbnQgYXdlX3NlYXJjaF9tdWx0aV92b2ljZXMoYXdlX3ZvaWNlX2xpc3QgKnJlYywgaW50IG5vdGUsIGludCB2ZWxvY2l0eSwgYXdlX3ZvaWNlX2luZm8gKip2bGlzdCk7CitzdGF0aWMgdm9pZCBhd2VfYWxsb2NfbXVsdGlfdm9pY2VzKGludCBjaCwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSwgaW50IGtleSk7CitzdGF0aWMgdm9pZCBhd2VfYWxsb2Nfb25lX3ZvaWNlKGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSk7CitzdGF0aWMgaW50IGF3ZV9jbGVhcl92b2ljZSh2b2lkKTsKKworLyogbG9hZCAvIHJlbW92ZSBwYXRjaGVzICovCitzdGF0aWMgaW50IGF3ZV9vcGVuX3BhdGNoKGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCk7CitzdGF0aWMgaW50IGF3ZV9jbG9zZV9wYXRjaChhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpOworc3RhdGljIGludCBhd2VfdW5sb2FkX3BhdGNoKGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCk7CitzdGF0aWMgaW50IGF3ZV9sb2FkX2luZm8oYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgYXdlX3JlbW92ZV9pbmZvKGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCk7CitzdGF0aWMgaW50IGF3ZV9sb2FkX2RhdGEoYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KTsKK3N0YXRpYyBpbnQgYXdlX3JlcGxhY2VfZGF0YShhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpOworc3RhdGljIGludCBhd2VfbG9hZF9tYXAoYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KTsKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCitzdGF0aWMgaW50IGF3ZV9sb2FkX2d1c3BhdGNoKGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgb2ZmcywgaW50IHNpemUsIGludCBwbWdyX2ZsYWcpOworI2VuZGlmCisvKnN0YXRpYyBpbnQgYXdlX3Byb2JlX2luZm8oYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KTsqLworc3RhdGljIGludCBhd2VfcHJvYmVfZGF0YShhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpOworc3RhdGljIHNmX2xpc3QgKmNoZWNrX3BhdGNoX29wZW5lZChpbnQgdHlwZSwgY2hhciAqbmFtZSk7CitzdGF0aWMgaW50IGF3ZV93cml0ZV93YXZlX2RhdGEoY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBvZmZzZXQsIGF3ZV9zYW1wbGVfbGlzdCAqc3AsIGludCBjaGFubmVscyk7CitzdGF0aWMgaW50IGF3ZV9jcmVhdGVfc2YoaW50IHR5cGUsIGNoYXIgKm5hbWUpOworc3RhdGljIHZvaWQgYXdlX2ZyZWVfc2Yoc2ZfbGlzdCAqc2YpOworc3RhdGljIHZvaWQgYWRkX3NmX2luZm8oc2ZfbGlzdCAqc2YsIGF3ZV92b2ljZV9saXN0ICpyZWMpOworc3RhdGljIHZvaWQgYWRkX3NmX3NhbXBsZShzZl9saXN0ICpzZiwgYXdlX3NhbXBsZV9saXN0ICpzbXApOworc3RhdGljIHZvaWQgcHVyZ2Vfb2xkX2xpc3QoYXdlX3ZvaWNlX2xpc3QgKnJlYywgYXdlX3ZvaWNlX2xpc3QgKm5leHQpOworc3RhdGljIHZvaWQgYWRkX2luZm9fbGlzdChhd2Vfdm9pY2VfbGlzdCAqcmVjKTsKK3N0YXRpYyB2b2lkIGF3ZV9yZW1vdmVfc2FtcGxlcyhpbnQgc2ZfaWQpOworc3RhdGljIHZvaWQgcmVidWlsZF9wcmVzZXRfbGlzdCh2b2lkKTsKK3N0YXRpYyBzaG9ydCBhd2Vfc2V0X3NhbXBsZShhd2Vfdm9pY2VfbGlzdCAqcmVjKTsKK3N0YXRpYyBhd2Vfc2FtcGxlX2xpc3QgKnNlYXJjaF9zYW1wbGVfaW5kZXgoc2ZfbGlzdCAqc2YsIGludCBzYW1wbGUpOworCitzdGF0aWMgaW50IGlzX2lkZW50aWNhbF9ob2xkZXIoc2ZfbGlzdCAqc2YxLCBzZl9saXN0ICpzZjIpOworI2lmZGVmIEFXRV9BTExPV19TQU1QTEVfU0hBUklORworc3RhdGljIGludCBpc19pZGVudGljYWxfbmFtZSh1bnNpZ25lZCBjaGFyICpuYW1lLCBzZl9saXN0ICpwKTsKK3N0YXRpYyBpbnQgaXNfc2hhcmVkX3NmKHVuc2lnbmVkIGNoYXIgKm5hbWUpOworc3RhdGljIGludCBpbmZvX2R1cGxpY2F0ZWQoc2ZfbGlzdCAqc2YsIGF3ZV92b2ljZV9saXN0ICpyZWMpOworI2VuZGlmIC8qIGFsbG93IHNoYXJpbmcgKi8KKworLyogbG93bGV2ZWwgZnVuY3Rpb25zICovCitzdGF0aWMgdm9pZCBhd2VfaW5pdF9hdWRpbyh2b2lkKTsKK3N0YXRpYyB2b2lkIGF3ZV9pbml0X2RtYSh2b2lkKTsKK3N0YXRpYyB2b2lkIGF3ZV9pbml0X2FycmF5KHZvaWQpOworc3RhdGljIHZvaWQgYXdlX3NlbmRfYXJyYXkodW5zaWduZWQgc2hvcnQgKmRhdGEpOworc3RhdGljIHZvaWQgYXdlX3R3ZWFrX3ZvaWNlKGludCB2b2ljZSk7CitzdGF0aWMgdm9pZCBhd2VfdHdlYWsodm9pZCk7CitzdGF0aWMgdm9pZCBhd2VfaW5pdF9mbSh2b2lkKTsKK3N0YXRpYyBpbnQgYXdlX29wZW5fZHJhbV9mb3Jfd3JpdGUoaW50IG9mZnNldCwgaW50IGNoYW5uZWxzKTsKK3N0YXRpYyB2b2lkIGF3ZV9vcGVuX2RyYW1fZm9yX2NoZWNrKHZvaWQpOworc3RhdGljIHZvaWQgYXdlX2Nsb3NlX2RyYW0odm9pZCk7CisvKnN0YXRpYyB2b2lkIGF3ZV93cml0ZV9kcmFtKHVuc2lnbmVkIHNob3J0IGMpOyovCitzdGF0aWMgaW50IGF3ZV9kZXRlY3RfYmFzZShpbnQgYWRkcik7CitzdGF0aWMgaW50IGF3ZV9kZXRlY3Qodm9pZCk7CitzdGF0aWMgdm9pZCBhd2VfY2hlY2tfZHJhbSh2b2lkKTsKK3N0YXRpYyBpbnQgYXdlX2xvYWRfY2hvcnVzX2Z4KGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCk7CitzdGF0aWMgdm9pZCBhd2Vfc2V0X2Nob3J1c19tb2RlKGludCBtb2RlKTsKK3N0YXRpYyB2b2lkIGF3ZV91cGRhdGVfY2hvcnVzX21vZGUodm9pZCk7CitzdGF0aWMgaW50IGF3ZV9sb2FkX3JldmVyYl9meChhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpOworc3RhdGljIHZvaWQgYXdlX3NldF9yZXZlcmJfbW9kZShpbnQgbW9kZSk7CitzdGF0aWMgdm9pZCBhd2VfdXBkYXRlX3JldmVyYl9tb2RlKHZvaWQpOworc3RhdGljIHZvaWQgYXdlX2VxdWFsaXplcihpbnQgYmFzcywgaW50IHRyZWJsZSk7CitzdGF0aWMgdm9pZCBhd2VfdXBkYXRlX2VxdWFsaXplcih2b2lkKTsKKworI2lmZGVmIENPTkZJR19BV0UzMl9NSVhFUgorc3RhdGljIHZvaWQgYXR0YWNoX21peGVyKHZvaWQpOworc3RhdGljIHZvaWQgdW5sb2FkX21peGVyKHZvaWQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQVdFMzJfTUlESUVNVQorc3RhdGljIHZvaWQgYXR0YWNoX21pZGllbXUodm9pZCk7CitzdGF0aWMgdm9pZCB1bmxvYWRfbWlkaWVtdSh2b2lkKTsKKyNlbmRpZgorCisjZGVmaW5lIGxpbWl0dmFsdWUoeCwgYSwgYikgaWYgKCh4KSA8IChhKSkgKHgpID0gKGEpOyBlbHNlIGlmICgoeCkgPiAoYikpICh4KSA9IChiKQorCisvKgorICogY29udHJvbCBwYXJhbWV0ZXJzCisgKi8KKworCisjaWZkZWYgQVdFX1VTRV9ORVdfVk9MVU1FX0NBTEMKKyNkZWZpbmUgREVGX1ZPTFVNRV9DQUxDCVRSVUUKKyNlbHNlCisjZGVmaW5lIERFRl9WT0xVTUVfQ0FMQwlGQUxTRQorI2VuZGlmIC8qIG5ldyB2b2x1bWUgKi8KKworI2RlZmluZSBERUZfWkVST19BVFRFTgkJMzIJLyogMTJkQiBiZWxvdyAqLworI2RlZmluZSBERUZfTU9EX1NFTlNFCQkxOAorI2RlZmluZSBERUZfQ0hPUlVTX01PREUJCTIKKyNkZWZpbmUgREVGX1JFVkVSQl9NT0RFCQk0CisjZGVmaW5lIERFRl9CQVNTX0xFVkVMCQk1CisjZGVmaW5lIERFRl9UUkVCTEVfTEVWRUwJOQorCitzdGF0aWMgc3RydWN0IEN0cmxQYXJtc0RlZiB7CisJaW50IHZhbHVlOworCWludCBpbml0X2VhY2hfdGltZTsKKwl2b2lkICgqdXBkYXRlKSh2b2lkKTsKK30gY3RybF9wYXJtc1tBV0VfTURfRU5EXSA9IHsKKwl7MCwwLCBOVUxMfSwgezAsMCwgTlVMTH0sIC8qIDwtLSBub3QgdXNlZCAqLworCXtBV0VfVkVSU0lPTl9OVU1CRVIsIEZBTFNFLCBOVUxMfSwKKwl7VFJVRSwgRkFMU0UsIE5VTEx9LCAvKiBleGNsdXNpdmUgKi8KKwl7VFJVRSwgRkFMU0UsIE5VTEx9LCAvKiByZWFscGFuICovCisJe0FXRV9ERUZBVUxUX0JBTkssIEZBTFNFLCBOVUxMfSwgLyogZ3VzYmFuayAqLworCXtGQUxTRSwgVFJVRSwgTlVMTH0sIC8qIGtlZXAgZWZmZWN0ICovCisJe0RFRl9aRVJPX0FUVEVOLCBGQUxTRSwgYXdlX3VwZGF0ZV92b2x1bWV9LCAvKiB6ZXJvX2F0dGVuICovCisJe0ZBTFNFLCBGQUxTRSwgTlVMTH0sIC8qIGNobl9wcmlvciAqLworCXtERUZfTU9EX1NFTlNFLCBGQUxTRSwgTlVMTH0sIC8qIG1vZHdoZWVsIHNlbnNlICovCisJe0FXRV9ERUZBVUxUX1BSRVNFVCwgRkFMU0UsIE5VTEx9LCAvKiBkZWZfcHJlc2V0ICovCisJe0FXRV9ERUZBVUxUX0JBTkssIEZBTFNFLCBOVUxMfSwgLyogZGVmX2JhbmsgKi8KKwl7QVdFX0RFRkFVTFRfRFJVTSwgRkFMU0UsIE5VTEx9LCAvKiBkZWZfZHJ1bSAqLworCXtGQUxTRSwgRkFMU0UsIE5VTEx9LCAvKiB0b2dnbGVfZHJ1bV9iYW5rICovCisJe0RFRl9WT0xVTUVfQ0FMQywgRkFMU0UsIGF3ZV91cGRhdGVfdm9sdW1lfSwgLyogbmV3X3ZvbHVtZV9jYWxjICovCisJe0RFRl9DSE9SVVNfTU9ERSwgRkFMU0UsIGF3ZV91cGRhdGVfY2hvcnVzX21vZGV9LCAvKiBjaG9ydXMgbW9kZSAqLworCXtERUZfUkVWRVJCX01PREUsIEZBTFNFLCBhd2VfdXBkYXRlX3JldmVyYl9tb2RlfSwgLyogcmV2ZXJiIG1vZGUgKi8KKwl7REVGX0JBU1NfTEVWRUwsIEZBTFNFLCBhd2VfdXBkYXRlX2VxdWFsaXplcn0sIC8qIGJhc3MgbGV2ZWwgKi8KKwl7REVGX1RSRUJMRV9MRVZFTCwgRkFMU0UsIGF3ZV91cGRhdGVfZXF1YWxpemVyfSwgLyogdHJlYmxlIGxldmVsICovCisJezAsIEZBTFNFLCBOVUxMfSwJLyogZGVidWcgbW9kZSAqLworCXtGQUxTRSwgRkFMU0UsIE5VTEx9LCAvKiBwYW4gZXhjaGFuZ2UgKi8KK307CisKK3N0YXRpYyBpbnQgY3RybHNbQVdFX01EX0VORF07CisKKworLyoKKyAqIHN5bnRoIG9wZXJhdGlvbiB0YWJsZQorICovCisKK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyBhd2Vfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pZAkJPSAiRU1VOEsiLAorCS5pbmZvCQk9ICZhd2VfaW5mbywKKwkubWlkaV9kZXYJPSAwLAorCS5zeW50aF90eXBlCT0gU1lOVEhfVFlQRV9TQU1QTEUsCisJLnN5bnRoX3N1YnR5cGUJPSBTQU1QTEVfVFlQRV9BV0UzMiwKKwkub3BlbgkJPSBhd2Vfb3BlbiwKKwkuY2xvc2UJCT0gYXdlX2Nsb3NlLAorCS5pb2N0bAkJPSBhd2VfaW9jdGwsCisJLmtpbGxfbm90ZQk9IGF3ZV9raWxsX25vdGUsCisJLnN0YXJ0X25vdGUJPSBhd2Vfc3RhcnRfbm90ZSwKKwkuc2V0X2luc3RyCT0gYXdlX3NldF9pbnN0cl8yLAorCS5yZXNldAkJPSBhd2VfcmVzZXQsCisJLmh3X2NvbnRyb2wJPSBhd2VfaHdfY29udHJvbCwKKwkubG9hZF9wYXRjaAk9IGF3ZV9sb2FkX3BhdGNoLAorCS5hZnRlcnRvdWNoCT0gYXdlX2FmdGVydG91Y2gsCisJLmNvbnRyb2xsZXIJPSBhd2VfY29udHJvbGxlciwKKwkucGFubmluZwk9IGF3ZV9wYW5uaW5nLAorCS52b2x1bWVfbWV0aG9kCT0gYXdlX3ZvbHVtZV9tZXRob2QsCisJLmJlbmRlcgkJPSBhd2VfYmVuZGVyLAorCS5hbGxvY192b2ljZQk9IGF3ZV9hbGxvYywKKwkuc2V0dXBfdm9pY2UJPSBhd2Vfc2V0dXBfdm9pY2UKK307CisKK3N0YXRpYyB2b2lkIGZyZWVfdGFibGVzKHZvaWQpCit7CisJaWYgKHNmdGFpbCkgeworCQlzZl9saXN0ICpwLCAqcHJldjsKKwkJZm9yIChwID0gc2Z0YWlsOyBwOyBwID0gcHJldikgeworCQkJcHJldiA9IHAtPnByZXY7CisJCQlhd2VfZnJlZV9zZihwKTsKKwkJfQorCX0KKwlzZmhlYWQgPSBzZnRhaWwgPSBOVUxMOworfQorCisvKgorICogY2xlYXIgc2FtcGxlIHRhYmxlcyAKKyAqLworCitzdGF0aWMgdm9pZAorYXdlX3Jlc2V0X3NhbXBsZXModm9pZCkKK3sKKwkvKiBmcmVlIGFsbCBiYW5rIHRhYmxlcyAqLworCW1lbXNldChwcmVzZXRfdGFibGUsIDAsIHNpemVvZihwcmVzZXRfdGFibGUpKTsKKwlmcmVlX3RhYmxlcygpOworCisJY3VycmVudF9zZl9pZCA9IDA7CisJbG9ja2VkX3NmX2lkID0gMDsKKwlwYXRjaF9vcGVuZWQgPSAwOworfQorCisKKy8qCisgKiBFTVUgcmVnaXN0ZXIgYWNjZXNzCisgKi8KKworLyogc2VsZWN0IGEgZ2l2ZW4gQVdFMzIgcG9pbnRlciAqLworc3RhdGljIGludCBhd2VfcG9ydHNbNV07CitzdGF0aWMgaW50IHBvcnRfc2V0dXBlZCA9IEZBTFNFOworc3RhdGljIGludCBhd2VfY3VyX2NtZCA9IC0xOworI2RlZmluZSBhd2Vfc2V0X2NtZChjbWQpIFwKK2lmIChhd2VfY3VyX2NtZCAhPSBjbWQpIHsgb3V0dyhjbWQsIGF3ZV9wb3J0c1tQb2ludGVyXSk7IGF3ZV9jdXJfY21kID0gY21kOyB9CisKKy8qIHdyaXRlIDE2Yml0IGRhdGEgKi8KK3N0YXRpYyB2b2lkCithd2VfcG9rZSh1bnNpZ25lZCBzaG9ydCBjbWQsIHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIHNob3J0IGRhdGEpCit7CisJYXdlX3NldF9jbWQoY21kKTsKKwlvdXR3KGRhdGEsIGF3ZV9wb3J0c1twb3J0XSk7Cit9CisKKy8qIHdyaXRlIDMyYml0IGRhdGEgKi8KK3N0YXRpYyB2b2lkCithd2VfcG9rZV9kdyh1bnNpZ25lZCBzaG9ydCBjbWQsIHVuc2lnbmVkIHNob3J0IHBvcnQsIHVuc2lnbmVkIGludCBkYXRhKQoreworCXVuc2lnbmVkIHNob3J0IGFkZHIgPSBhd2VfcG9ydHNbcG9ydF07CisJYXdlX3NldF9jbWQoY21kKTsKKwlvdXR3KGRhdGEsIGFkZHIpOwkJLyogd3JpdGUgbG93ZXIgMTYgYml0cyAqLworCW91dHcoZGF0YSA+PiAxNiwgYWRkciArIDIpOwkvKiB3cml0ZSBoaWdoZXIgMTYgYml0cyAqLworfQorCisvKiByZWFkIDE2Yml0IGRhdGEgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorYXdlX3BlZWsodW5zaWduZWQgc2hvcnQgY21kLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXVuc2lnbmVkIHNob3J0IGs7CisJYXdlX3NldF9jbWQoY21kKTsKKwlrID0gaW53KGF3ZV9wb3J0c1twb3J0XSk7CisJcmV0dXJuIGs7Cit9CisKKy8qIHJlYWQgMzJiaXQgZGF0YSAqLworc3RhdGljIHVuc2lnbmVkIGludAorYXdlX3BlZWtfZHcodW5zaWduZWQgc2hvcnQgY21kLCB1bnNpZ25lZCBzaG9ydCBwb3J0KQoreworCXVuc2lnbmVkIGludCBrMSwgazI7CisJdW5zaWduZWQgc2hvcnQgYWRkciA9IGF3ZV9wb3J0c1twb3J0XTsKKwlhd2Vfc2V0X2NtZChjbWQpOworCWsxID0gaW53KGFkZHIpOworCWsyID0gaW53KGFkZHIgKyAyKTsKKwlrMSB8PSBrMiA8PCAxNjsKKwlyZXR1cm4gazE7Cit9CisKKy8qIHdhaXQgZGVsYXkgbnVtYmVyIG9mIEFXRTMyIDQ0MTAwSHogY2xvY2tzICovCisjaWZkZWYgV0FJVF9CWV9MT09QIC8qIHdhaXQgYnkgbG9vcCAtLSB0aGF0J3Mgbm90IGdvb2QuLiAqLworc3RhdGljIHZvaWQKK2F3ZV93YWl0KHVuc2lnbmVkIHNob3J0IGRlbGF5KQoreworCXVuc2lnbmVkIHNob3J0IGNsb2NrLCB0YXJnZXQ7CisJdW5zaWduZWQgc2hvcnQgcG9ydCA9IGF3ZV9wb3J0c1tBV0VfV0NfUG9ydF07CisJaW50IGNvdW50ZXI7CisgIAorCS8qIHNhbXBsZSBjb3VudGVyICovCisJYXdlX3NldF9jbWQoQVdFX1dDX0NtZCk7CisJY2xvY2sgPSAodW5zaWduZWQgc2hvcnQpaW53KHBvcnQpOworCXRhcmdldCA9IGNsb2NrICsgZGVsYXk7CisJY291bnRlciA9IDA7CisJaWYgKHRhcmdldCA8IGNsb2NrKSB7CisJCWZvciAoOyAodW5zaWduZWQgc2hvcnQpaW53KHBvcnQpID4gdGFyZ2V0OyBjb3VudGVyKyspCisJCQlpZiAoY291bnRlciA+IDY1NTM2KQorCQkJCWJyZWFrOworCX0KKwlmb3IgKDsgKHVuc2lnbmVkIHNob3J0KWludyhwb3J0KSA8IHRhcmdldDsgY291bnRlcisrKQorCQlpZiAoY291bnRlciA+IDY1NTM2KQorCQkJYnJlYWs7Cit9CisjZWxzZQorCitzdGF0aWMgdm9pZCBhd2Vfd2FpdCh1bnNpZ25lZCBzaG9ydCBkZWxheSkKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KChIWioodW5zaWduZWQgbG9uZylkZWxheSArIDQ0MDk5KS80NDEwMCk7Cit9CisvKgorc3RhdGljIHZvaWQgYXdlX3dhaXQodW5zaWduZWQgc2hvcnQgZGVsYXkpCit7CisJdWRlbGF5KCgodW5zaWduZWQgbG9uZylkZWxheSAqIDEwMDAwMDBMICsgNDQwOTkpIC8gNDQxMDApOworfQorKi8KKyNlbmRpZiAvKiB3YWl0IGJ5IGxvb3AgKi8KKworLyogd3JpdGUgYSB3b3JkIGRhdGEgKi8KKyNkZWZpbmUgYXdlX3dyaXRlX2RyYW0oYykJYXdlX3Bva2UoQVdFX1NNTEQsIGMpCisKKy8qCisgKiBBV0UzMiB2b2ljZSBwYXJhbWV0ZXJzCisgKi8KKworLyogaW5pdGlhbGl6ZSB2b2ljZV9pbmZvIHJlY29yZCAqLworc3RhdGljIHZvaWQKK2F3ZV9pbml0X3ZvaWNlX2luZm8oYXdlX3ZvaWNlX2luZm8gKnZwKQoreworCXZwLT5zYW1wbGUgPSAwOworCXZwLT5yYXRlX29mZnNldCA9IDA7CisKKwl2cC0+c3RhcnQgPSAwOworCXZwLT5lbmQgPSAwOworCXZwLT5sb29wc3RhcnQgPSAwOworCXZwLT5sb29wZW5kID0gMDsKKwl2cC0+bW9kZSA9IDA7CisJdnAtPnJvb3QgPSA2MDsKKwl2cC0+dHVuZSA9IDA7CisJdnAtPmxvdyA9IDA7CisJdnAtPmhpZ2ggPSAxMjc7CisJdnAtPnZlbGxvdyA9IDA7CisJdnAtPnZlbGhpZ2ggPSAxMjc7CisKKwl2cC0+Zml4a2V5ID0gLTE7CisJdnAtPmZpeHZlbCA9IC0xOworCXZwLT5maXhwYW4gPSAtMTsKKwl2cC0+cGFuID0gLTE7CisKKwl2cC0+ZXhjbHVzaXZlQ2xhc3MgPSAwOworCXZwLT5hbXBsaXR1ZGUgPSAxMjc7CisJdnAtPmF0dGVudWF0aW9uID0gMDsKKwl2cC0+c2NhbGVUdW5pbmcgPSAxMDA7CisKKwlhd2VfaW5pdF92b2ljZV9wYXJtKCZ2cC0+cGFybSk7Cit9CisKKy8qIGluaXRpYWxpemUgdm9pY2VfcGFybSByZWNvcmQ6CisgKiBFbnYxLzI6IGRlbGF5PTAsIGF0dGFjaz0wLCBob2xkPTAsIHN1c3RhaW49MCwgZGVjYXk9MCwgcmVsZWFzZT0wLgorICogVmlicmF0byBhbmQgVHJlbW9sbyBlZmZlY3RzIGFyZSB6ZXJvLgorICogQ3V0b2ZmIGlzIG1heGltdW0uCisgKiBDaG9ydXMgYW5kIFJldmVyYiBlZmZlY3RzIGFyZSB6ZXJvLgorICovCitzdGF0aWMgdm9pZAorYXdlX2luaXRfdm9pY2VfcGFybShhd2Vfdm9pY2VfcGFybSAqcHApCit7CisJcHAtPm1vZGRlbGF5ID0gMHg4MDAwOworCXBwLT5tb2RhdGtobGQgPSAweDdmN2Y7CisJcHAtPm1vZGRjeXN1cyA9IDB4N2Y3ZjsKKwlwcC0+bW9kcmVsZWFzZSA9IDB4ODA3ZjsKKwlwcC0+bW9ka2V5aG9sZCA9IDA7CisJcHAtPm1vZGtleWRlY2F5ID0gMDsKKworCXBwLT52b2xkZWxheSA9IDB4ODAwMDsKKwlwcC0+dm9sYXRraGxkID0gMHg3ZjdmOworCXBwLT52b2xkY3lzdXMgPSAweDdmN2Y7CisJcHAtPnZvbHJlbGVhc2UgPSAweDgwN2Y7CisJcHAtPnZvbGtleWhvbGQgPSAwOworCXBwLT52b2xrZXlkZWNheSA9IDA7CisKKwlwcC0+bGZvMWRlbGF5ID0gMHg4MDAwOworCXBwLT5sZm8yZGVsYXkgPSAweDgwMDA7CisJcHAtPnBlZmUgPSAwOworCisJcHAtPmZtbW9kID0gMDsKKwlwcC0+dHJlbWZycSA9IDA7CisJcHAtPmZtMmZycTIgPSAwOworCisJcHAtPmN1dG9mZiA9IDB4ZmY7CisJcHAtPmZpbHRlclEgPSAwOworCisJcHAtPmNob3J1cyA9IDA7CisJcHAtPnJldmVyYiA9IDA7Cit9CQorCisKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCisKKy8qIGNvbnZlcnQgZnJlcXVlbmN5IG1IeiB0byBhYnN0cmFjdCBjZW50cyAoPSBtaWRpIGtleSAqIDEwMCkgKi8KK3N0YXRpYyBpbnQKK2ZyZXFfdG9fbm90ZShpbnQgbUh6KQoreworCS8qIGFic2NlbnRzID0gbG9nKG1Iei84MTc2KSAvIGxvZygyKSAqIDEyMDAgKi8KKwl1bnNpZ25lZCBpbnQgbWF4X3ZhbCA9ICh1bnNpZ25lZCBpbnQpMHhmZmZmZmZmZiAvIDEwMDAwOworCWludCBpLCB0aW1lczsKKwl1bnNpZ25lZCBpbnQgYmFzZTsKKwl1bnNpZ25lZCBpbnQgZnJlcTsKKwlpbnQgbm90ZSwgdHVuZTsKKworCWlmIChtSHogPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKG1IeiA8IDApCisJCXJldHVybiAxMjc5OTsgLyogbWF4aW11bSAqLworCisJZnJlcSA9IG1IejsKKwlub3RlID0gMDsKKwlmb3IgKGJhc2UgPSA4MTc2ICogMjsgZnJlcSA+PSBiYXNlOyBiYXNlICo9IDIpIHsKKwkJbm90ZSArPSAxMjsKKwkJaWYgKG5vdGUgPj0gMTI4KSAvKiBvdmVyIG1heGltdW0gKi8KKwkJCXJldHVybiAxMjc5OTsKKwl9CisJYmFzZSAvPSAyOworCisJLyogdG8gYXZvaWQgb3ZlcmZsb3cuLi4gKi8KKwl0aW1lcyA9IDEwMDAwOworCXdoaWxlIChmcmVxID4gbWF4X3ZhbCkgeworCQltYXhfdmFsICo9IDEwOworCQl0aW1lcyAvPSAxMDsKKwkJYmFzZSAvPSAxMDsKKwl9CisKKwlmcmVxID0gZnJlcSAqIHRpbWVzIC8gYmFzZTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQlpZiAoZnJlcSA8IHNlbWl0b25lX3R1bmluZ1tpKzFdKQorCQkJYnJlYWs7CisJCW5vdGUrKzsKKwl9CisKKwl0dW5lID0gMDsKKwlmcmVxID0gZnJlcSAqIDEwMDAwIC8gc2VtaXRvbmVfdHVuaW5nW2ldOworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoZnJlcSA8IGNlbnRfdHVuaW5nW2krMV0pCisJCQlicmVhazsKKwkJdHVuZSsrOworCX0KKworCXJldHVybiBub3RlICogMTAwICsgdHVuZTsKK30KKworCisvKiBjb252ZXJ0IEh6IHRvIEFXRTMyIHJhdGUgb2Zmc2V0OgorICogc2FtcGxlIHBpdGNoIG9mZnNldCBmb3IgdGhlIHNwZWNpZmllZCBzYW1wbGUgcmF0ZQorICogcmF0ZT00NDEwMCBpcyBubyBvZmZzZXQsIGVhY2ggNDA5NiBpcyAxIG9jdGF2ZSAodHdpY2UpLgorICogZWcsIHdoZW4gcmF0ZSBpcyAyMjA1MCwgdGhpcyBvZmZzZXQgYmVjb21lcyAtNDA5Ni4KKyAqLworc3RhdGljIGludAorY2FsY19yYXRlX29mZnNldChpbnQgSHopCit7CisJLyogb2Zmc2V0ID0gbG9nKEh6IC8gNDQxMDApIC8gbG9nKDIpICogNDA5NiAqLworCWludCBmcmVxLCBiYXNlLCBpOworCisJLyogbWF5YmUgc21hbGxlciB0aGFuIG1heCAoNDQxMDBIeikgKi8KKwlpZiAoSHogPD0gMCB8fCBIeiA+PSA0NDEwMCkgcmV0dXJuIDA7CisKKwliYXNlID0gMDsKKwlmb3IgKGZyZXEgPSBIeiAqIDI7IGZyZXEgPCA0NDEwMDsgZnJlcSAqPSAyKQorCQliYXNlKys7CisJYmFzZSAqPSAxMjAwOworCisJZnJlcSA9IDQ0MTAwICogMTAwMDAgLyAoZnJlcS8yKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykgeworCQlpZiAoZnJlcSA8IHNlbWl0b25lX3R1bmluZ1tpKzFdKQorCQkJYnJlYWs7CisJCWJhc2UgKz0gMTAwOworCX0KKwlmcmVxID0gZnJlcSAqIDEwMDAwIC8gc2VtaXRvbmVfdHVuaW5nW2ldOworCWZvciAoaSA9IDA7IGkgPCAxMDA7IGkrKykgeworCQlpZiAoZnJlcSA8IGNlbnRfdHVuaW5nW2krMV0pCisJCQlicmVhazsKKwkJYmFzZSsrOworCX0KKwlyZXR1cm4gLWJhc2UgKiA0MDk2IC8gMTIwMDsKK30KKworCisvKgorICogY29udmVydCBlbnZlbG9wZSB0aW1lIHBhcmFtZXRlciB0byBBV0UzMiByYXcgcGFyYW1ldGVyCisgKi8KKworLyogYXR0YWNrICYgZGVjYXkvcmVsZWFzZSB0aW1lIHRhYmxlIChtc2VjKSAqLworc3RhdGljIHNob3J0IGF0dGFja190aW1lX3RibFsxMjhdID0geworMzI3NjcsIDMyNzY3LCA1OTg5LCA0MjM1LCAyOTk0LCAyNTE4LCAyMTE3LCAxNzgwLCAxNDk3LCAxMzczLCAxMjU5LCAxMTU0LCAxMDU4LCA5NzAsIDg5MCwgODE2LAorNzA3LCA2OTEsIDY2MiwgNjM0LCA2MDcsIDU4MSwgNTU3LCA1MzMsIDUxMCwgNDg5LCA0NjgsIDQ0OCwgNDI5LCA0MTEsIDM5MywgMzc3LAorMzYxLCAzNDUsIDMzMSwgMzE3LCAzMDMsIDI5MCwgMjc4LCAyNjYsIDI1NSwgMjQ0LCAyMzQsIDIyNCwgMjE0LCAyMDUsIDE5NiwgMTg4LAorMTgwLCAxNzIsIDE2NSwgMTU4LCAxNTEsIDE0NSwgMTM5LCAxMzMsIDEyNywgMTIyLCAxMTcsIDExMiwgMTA3LCAxMDIsIDk4LCA5NCwKKzkwLCA4NiwgODIsIDc5LCA3NSwgNzIsIDY5LCA2NiwgNjMsIDYxLCA1OCwgNTYsIDUzLCA1MSwgNDksIDQ3LAorNDUsIDQzLCA0MSwgMzksIDM3LCAzNiwgMzQsIDMzLCAzMSwgMzAsIDI5LCAyOCwgMjYsIDI1LCAyNCwgMjMsCisyMiwgMjEsIDIwLCAxOSwgMTksIDE4LCAxNywgMTYsIDE2LCAxNSwgMTUsIDE0LCAxMywgMTMsIDEyLCAxMiwKKzExLCAxMSwgMTAsIDEwLCAxMCwgOSwgOSwgOCwgOCwgOCwgOCwgNywgNywgNywgNiwgMCwKK307CisKK3N0YXRpYyBzaG9ydCBkZWNheV90aW1lX3RibFsxMjhdID0geworMzI3NjcsIDMyNzY3LCAyMjYxNCwgMTU5OTAsIDExMzA3LCA5NTA4LCA3OTk1LCA2NzIzLCA1NjUzLCA1MTg0LCA0NzU0LCA0MzU5LCAzOTk3LCAzNjY1LCAzMzYxLCAzMDgyLAorMjgyOCwgMjc2NSwgMjY0OCwgMjUzNSwgMjQyOCwgMjMyNSwgMjIyNiwgMjEzMiwgMjA0MiwgMTk1NSwgMTg3MiwgMTc5MywgMTcxNywgMTY0NCwgMTU3NCwgMTUwNywKKzE0NDMsIDEzODIsIDEzMjQsIDEyNjcsIDEyMTQsIDExNjIsIDExMTMsIDEwNjYsIDk3OCwgOTM2LCA4OTcsIDg1OSwgODIyLCA3ODcsIDc1NCwgNzIyLAorNjkxLCA2NjIsIDYzNCwgNjA3LCA1ODEsIDU1NywgNTMzLCA1MTAsIDQ4OSwgNDY4LCA0NDgsIDQyOSwgNDExLCAzOTMsIDM3NywgMzYxLAorMzQ1LCAzMzEsIDMxNywgMzAzLCAyOTAsIDI3OCwgMjY2LCAyNTUsIDI0NCwgMjM0LCAyMjQsIDIxNCwgMjA1LCAxOTYsIDE4OCwgMTgwLAorMTcyLCAxNjUsIDE1OCwgMTUxLCAxNDUsIDEzOSwgMTMzLCAxMjcsIDEyMiwgMTE3LCAxMTIsIDEwNywgMTAyLCA5OCwgOTQsIDkwLAorODYsIDgyLCA3OSwgNzUsIDcyLCA2OSwgNjYsIDYzLCA2MSwgNTgsIDU2LCA1MywgNTEsIDQ5LCA0NywgNDUsCis0MywgNDEsIDM5LCAzNywgMzYsIDM0LCAzMywgMzEsIDMwLCAyOSwgMjgsIDI2LCAyNSwgMjQsIDIzLCAyMiwKK307CisKKyNkZWZpbmUgY2FsY19wYXJtX2RlbGF5KG1zZWMpICgweDgwMDAgLSAobXNlYykgKiAxMDAwIC8gNzI1KTsKKworLyogZGVsYXkgdGltZSA9IDB4ODAwMCAtIG1zZWMvOTIgKi8KK3N0YXRpYyBpbnQKK2NhbGNfcGFybV9ob2xkKGludCBtc2VjKQoreworCWludCB2YWwgPSAoMHg3ZiAqIDkyIC0gbXNlYykgLyA5MjsKKwlpZiAodmFsIDwgMSkgdmFsID0gMTsKKwlpZiAodmFsID4gMTI3KSB2YWwgPSAxMjc7CisJcmV0dXJuIHZhbDsKK30KKworLyogYXR0YWNrIHRpbWU6IHNlYXJjaCBmcm9tIHRpbWUgdGFibGUgKi8KK3N0YXRpYyBpbnQKK2NhbGNfcGFybV9hdHRhY2soaW50IG1zZWMpCit7CisJcmV0dXJuIGNhbGNfcGFybV9zZWFyY2gobXNlYywgYXR0YWNrX3RpbWVfdGJsKTsKK30KKworLyogZGVjYXkvcmVsZWFzZSB0aW1lOiBzZWFyY2ggZnJvbSB0aW1lIHRhYmxlICovCitzdGF0aWMgaW50CitjYWxjX3Bhcm1fZGVjYXkoaW50IG1zZWMpCit7CisJcmV0dXJuIGNhbGNfcGFybV9zZWFyY2gobXNlYywgZGVjYXlfdGltZV90YmwpOworfQorCisvKiBzZWFyY2ggYW4gaW5kZXggZm9yIHNwZWNpZmllZCB0aW1lIGZyb20gZ2l2ZW4gdGltZSB0YWJsZSAqLworc3RhdGljIGludAorY2FsY19wYXJtX3NlYXJjaChpbnQgbXNlYywgc2hvcnQgKnRhYmxlKQoreworCWludCBsZWZ0ID0gMSwgcmlnaHQgPSAxMjcsIG1pZDsKKwl3aGlsZSAobGVmdCA8IHJpZ2h0KSB7CisJCW1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKwkJaWYgKG1zZWMgPCAoaW50KXRhYmxlW21pZF0pCisJCQlsZWZ0ID0gbWlkICsgMTsKKwkJZWxzZQorCQkJcmlnaHQgPSBtaWQ7CisJfQorCXJldHVybiBsZWZ0OworfQorI2VuZGlmIC8qIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkgKi8KKworCisvKgorICogZWZmZWN0cyB0YWJsZQorICovCisKKy8qIHNldCBhbiBlZmZlY3QgdmFsdWUgKi8KKyNkZWZpbmUgRlhfRkxBR19PRkYJMAorI2RlZmluZSBGWF9GTEFHX1NFVAkxCisjZGVmaW5lIEZYX0ZMQUdfQURECTIKKworI2RlZmluZSBGWF9TRVQocmVjLHR5cGUsdmFsdWUpIFwKKwkoKHJlYyktPmZsYWdzW3R5cGVdID0gRlhfRkxBR19TRVQsIChyZWMpLT52YWxbdHlwZV0gPSAodmFsdWUpKQorI2RlZmluZSBGWF9BREQocmVjLHR5cGUsdmFsdWUpIFwKKwkoKHJlYyktPmZsYWdzW3R5cGVdID0gRlhfRkxBR19BREQsIChyZWMpLT52YWxbdHlwZV0gPSAodmFsdWUpKQorI2RlZmluZSBGWF9VTlNFVChyZWMsdHlwZSkgXAorCSgocmVjKS0+ZmxhZ3NbdHlwZV0gPSBGWF9GTEFHX09GRiwgKHJlYyktPnZhbFt0eXBlXSA9IDApCisKKy8qIGNoZWNrIHRoZSBlZmZlY3QgdmFsdWUgaXMgc2V0ICovCisjZGVmaW5lIEZYX09OKHJlYyx0eXBlKQkoKHJlYyktPmZsYWdzW3R5cGVdKQorCisjZGVmaW5lIFBBUk1fQllURQkwCisjZGVmaW5lIFBBUk1fV09SRAkxCisjZGVmaW5lIFBBUk1fU0lHTgkyCisKK3N0YXRpYyBzdHJ1Y3QgUEFSTV9ERUZTIHsKKwlpbnQgdHlwZTsJLyogYnl0ZSBvciB3b3JkICovCisJaW50IGxvdywgaGlnaDsJLyogdmFsdWUgcmFuZ2UgKi8KKwlmeF9hZmZlY3RfZnVuYyByZWFsdGltZTsJLyogcmVhbHRpbWUgcGFyYW1hdGVyIGNoYW5nZSAqLworfSBwYXJtX2RlZnNbXSA9IHsKKwl7UEFSTV9XT1JELCAwLCAweDgwMDAsIE5VTEx9LAkvKiBlbnYxIGRlbGF5ICovCisJe1BBUk1fQllURSwgMSwgMHg3ZiwgTlVMTH0sCS8qIGVudjEgYXR0YWNrICovCisJe1BBUk1fQllURSwgMCwgMHg3ZSwgTlVMTH0sCS8qIGVudjEgaG9sZCAqLworCXtQQVJNX0JZVEUsIDEsIDB4N2YsIE5VTEx9LAkvKiBlbnYxIGRlY2F5ICovCisJe1BBUk1fQllURSwgMSwgMHg3ZiwgTlVMTH0sCS8qIGVudjEgcmVsZWFzZSAqLworCXtQQVJNX0JZVEUsIDAsIDB4N2YsIE5VTEx9LAkvKiBlbnYxIHN1c3RhaW4gKi8KKwl7UEFSTV9CWVRFLCAwLCAweGZmLCBOVUxMfSwJLyogZW52MSBwaXRjaCAqLworCXtQQVJNX0JZVEUsIDAsIDB4ZmYsIE5VTEx9LAkvKiBlbnYxIGN1dG9mZiAqLworCisJe1BBUk1fV09SRCwgMCwgMHg4MDAwLCBOVUxMfSwJLyogZW52MiBkZWxheSAqLworCXtQQVJNX0JZVEUsIDEsIDB4N2YsIE5VTEx9LAkvKiBlbnYyIGF0dGFjayAqLworCXtQQVJNX0JZVEUsIDAsIDB4N2UsIE5VTEx9LAkvKiBlbnYyIGhvbGQgKi8KKwl7UEFSTV9CWVRFLCAxLCAweDdmLCBOVUxMfSwJLyogZW52MiBkZWNheSAqLworCXtQQVJNX0JZVEUsIDEsIDB4N2YsIE5VTEx9LAkvKiBlbnYyIHJlbGVhc2UgKi8KKwl7UEFSTV9CWVRFLCAwLCAweDdmLCBOVUxMfSwJLyogZW52MiBzdXN0YWluICovCisKKwl7UEFSTV9XT1JELCAwLCAweDgwMDAsIE5VTEx9LAkvKiBsZm8xIGRlbGF5ICovCisJe1BBUk1fQllURSwgMCwgMHhmZiwgYXdlX2Z4X3RyZW1mcnF9LAkvKiBsZm8xIGZyZXEgKi8KKwl7UEFSTV9TSUdOLCAtMTI4LCAxMjcsIGF3ZV9meF90cmVtZnJxfSwJLyogbGZvMSB2b2x1bWUgKi8KKwl7UEFSTV9TSUdOLCAtMTI4LCAxMjcsIGF3ZV9meF9mbW1vZH0sCS8qIGxmbzEgcGl0Y2ggKi8KKwl7UEFSTV9CWVRFLCAwLCAweGZmLCBhd2VfZnhfZm1tb2R9LAkvKiBsZm8xIGN1dG9mZiAqLworCisJe1BBUk1fV09SRCwgMCwgMHg4MDAwLCBOVUxMfSwJLyogbGZvMiBkZWxheSAqLworCXtQQVJNX0JZVEUsIDAsIDB4ZmYsIGF3ZV9meF9mbTJmcnEyfSwJLyogbGZvMiBmcmVxICovCisJe1BBUk1fU0lHTiwgLTEyOCwgMTI3LCBhd2VfZnhfZm0yZnJxMn0sCS8qIGxmbzIgcGl0Y2ggKi8KKworCXtQQVJNX1dPUkQsIDAsIDB4ZmZmZiwgYXdlX3NldF92b2ljZV9waXRjaH0sCS8qIGluaXRpYWwgcGl0Y2ggKi8KKwl7UEFSTV9CWVRFLCAwLCAweGZmLCBOVUxMfSwJLyogY2hvcnVzICovCisJe1BBUk1fQllURSwgMCwgMHhmZiwgTlVMTH0sCS8qIHJldmVyYiAqLworCXtQQVJNX0JZVEUsIDAsIDB4ZmYsIGF3ZV9zZXRfdm9sdW1lfSwJLyogaW5pdGlhbCBjdXRvZmYgKi8KKwl7UEFSTV9CWVRFLCAwLCAxNSwgYXdlX2Z4X2ZpbHRlclF9LAkvKiBpbml0aWFsIHJlc29uYW5jZSAqLworCisJe1BBUk1fV09SRCwgMCwgMHhmZmZmLCBOVUxMfSwJLyogc2FtcGxlIHN0YXJ0ICovCisJe1BBUk1fV09SRCwgMCwgMHhmZmZmLCBOVUxMfSwJLyogbG9vcCBzdGFydCAqLworCXtQQVJNX1dPUkQsIDAsIDB4ZmZmZiwgTlVMTH0sCS8qIGxvb3AgZW5kICovCisJe1BBUk1fV09SRCwgMCwgMHhmZmZmLCBOVUxMfSwJLyogY29hcnNlIHNhbXBsZSBzdGFydCAqLworCXtQQVJNX1dPUkQsIDAsIDB4ZmZmZiwgTlVMTH0sCS8qIGNvYXJzZSBsb29wIHN0YXJ0ICovCisJe1BBUk1fV09SRCwgMCwgMHhmZmZmLCBOVUxMfSwJLyogY29hcnNlIGxvb3AgZW5kICovCisJe1BBUk1fQllURSwgMCwgMHhmZiwgYXdlX3NldF92b2x1bWV9LAkvKiBpbml0aWFsIGF0dGVudWF0aW9uICovCit9OworCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitGWF9CWVRFKEZYX1JlYyAqcmVjLCBGWF9SZWMgKmxheSwgaW50IHR5cGUsIHVuc2lnbmVkIGNoYXIgdmFsdWUpCit7CisJaW50IGVmZmVjdCA9IDA7CisJaW50IG9uID0gMDsKKwlpZiAobGF5ICYmIChvbiA9IEZYX09OKGxheSwgdHlwZSkpICE9IDApCisJCWVmZmVjdCA9IGxheS0+dmFsW3R5cGVdOworCWlmICghb24gJiYgKG9uID0gRlhfT04ocmVjLCB0eXBlKSkgIT0gMCkKKwkJZWZmZWN0ID0gcmVjLT52YWxbdHlwZV07CisJaWYgKG9uID09IEZYX0ZMQUdfQUREKSB7CisJCWlmIChwYXJtX2RlZnNbdHlwZV0udHlwZSA9PSBQQVJNX1NJR04pIHsKKwkJCWlmICh2YWx1ZSA+IDB4N2YpCisJCQkJZWZmZWN0ICs9IChpbnQpdmFsdWUgLSAweDEwMDsKKwkJCWVsc2UKKwkJCQllZmZlY3QgKz0gKGludCl2YWx1ZTsKKwkJfSBlbHNlIHsKKwkJCWVmZmVjdCArPSAoaW50KXZhbHVlOworCQl9CisJfQorCWlmIChvbikgeworCQlpZiAoZWZmZWN0IDwgcGFybV9kZWZzW3R5cGVdLmxvdykKKwkJCWVmZmVjdCA9IHBhcm1fZGVmc1t0eXBlXS5sb3c7CisJCWVsc2UgaWYgKGVmZmVjdCA+IHBhcm1fZGVmc1t0eXBlXS5oaWdoKQorCQkJZWZmZWN0ID0gcGFybV9kZWZzW3R5cGVdLmhpZ2g7CisJCXJldHVybiAodW5zaWduZWQgY2hhcillZmZlY3Q7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworLyogZ2V0IHdvcmQgZWZmZWN0IHZhbHVlICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQKK0ZYX1dPUkQoRlhfUmVjICpyZWMsIEZYX1JlYyAqbGF5LCBpbnQgdHlwZSwgdW5zaWduZWQgc2hvcnQgdmFsdWUpCit7CisJaW50IGVmZmVjdCA9IDA7CisJaW50IG9uID0gMDsKKwlpZiAobGF5ICYmIChvbiA9IEZYX09OKGxheSwgdHlwZSkpICE9IDApCisJCWVmZmVjdCA9IGxheS0+dmFsW3R5cGVdOworCWlmICghb24gJiYgKG9uID0gRlhfT04ocmVjLCB0eXBlKSkgIT0gMCkKKwkJZWZmZWN0ID0gcmVjLT52YWxbdHlwZV07CisJaWYgKG9uID09IEZYX0ZMQUdfQUREKQorCQllZmZlY3QgKz0gKGludCl2YWx1ZTsKKwlpZiAob24pIHsKKwkJaWYgKGVmZmVjdCA8IHBhcm1fZGVmc1t0eXBlXS5sb3cpCisJCQllZmZlY3QgPSBwYXJtX2RlZnNbdHlwZV0ubG93OworCQllbHNlIGlmIChlZmZlY3QgPiBwYXJtX2RlZnNbdHlwZV0uaGlnaCkKKwkJCWVmZmVjdCA9IHBhcm1fZGVmc1t0eXBlXS5oaWdoOworCQlyZXR1cm4gKHVuc2lnbmVkIHNob3J0KWVmZmVjdDsKKwl9CisJcmV0dXJuIHZhbHVlOworfQorCisvKiBnZXQgd29yZCAodXBwZXI9dHlwZTEvbG93ZXI9dHlwZTIpIGVmZmVjdCB2YWx1ZSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0CitGWF9DT01CKEZYX1JlYyAqcmVjLCBGWF9SZWMgKmxheSwgaW50IHR5cGUxLCBpbnQgdHlwZTIsIHVuc2lnbmVkIHNob3J0IHZhbHVlKQoreworCXVuc2lnbmVkIHNob3J0IHRtcDsKKwl0bXAgPSBGWF9CWVRFKHJlYywgbGF5LCB0eXBlMSwgKHVuc2lnbmVkIGNoYXIpKHZhbHVlID4+IDgpKTsKKwl0bXAgPDw9IDg7CisJdG1wIHw9IEZYX0JZVEUocmVjLCBsYXksIHR5cGUyLCAodW5zaWduZWQgY2hhcikodmFsdWUgJiAweGZmKSk7CisJcmV0dXJuIHRtcDsKK30KKworLyogYWRkcmVzcyBvZmZzZXQgKi8KK3N0YXRpYyBpbnQKK0ZYX09GRlNFVChGWF9SZWMgKnJlYywgRlhfUmVjICpsYXksIGludCBsbywgaW50IGhpLCBpbnQgbW9kZSkKK3sKKwlpbnQgYWRkciA9IDA7CisJaWYgKGxheSAmJiBGWF9PTihsYXksIGhpKSkKKwkJYWRkciA9IChzaG9ydClsYXktPnZhbFtoaV07CisJZWxzZSBpZiAoRlhfT04ocmVjLCBoaSkpCisJCWFkZHIgPSAoc2hvcnQpcmVjLT52YWxbaGldOworCWFkZHIgPSBhZGRyIDw8IDE1OworCWlmIChsYXkgJiYgRlhfT04obGF5LCBsbykpCisJCWFkZHIgKz0gKHNob3J0KWxheS0+dmFsW2xvXTsKKwllbHNlIGlmIChGWF9PTihyZWMsIGxvKSkKKwkJYWRkciArPSAoc2hvcnQpcmVjLT52YWxbbG9dOworCWlmICghKG1vZGUgJiBBV0VfU0FNUExFXzhCSVRTKSkKKwkJYWRkciAvPSAyOworCXJldHVybiBhZGRyOworfQorCisKKy8qCisgKiB0dXJuIG9uL29mZiBzYW1wbGUKKyAqLworCisvKiB0YWJsZSBmb3Igdm9sdW1lIHRhcmdldCBjYWxjdWxhdGlvbiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHZvbHRhcmdldFsxNl0gPSB7IAorICAgMHhFQUMwLCAwWEUwQzgsIDBYRDc0MCwgMFhDRTIwLCAwWEM1NjAsIDBYQkQwOCwgMFhCNTAwLCAwWEFENTgsCisgICAwWEE1RjgsIDBYOUVGMCwgMFg5ODMwLCAwWDkxQzAsIDBYOEI5MCwgMFg4NUE4LCAwWDgwMDAsIDBYN0E5MAorfTsKKworc3RhdGljIHZvaWQKK2F3ZV9ub3RlX29uKGludCB2b2ljZSkKK3sKKwl1bnNpZ25lZCBpbnQgdGVtcDsKKwlpbnQgYWRkcjsKKwlpbnQgdnRhcmdldCwgZnRhcmdldCwgcHRhcmdldCwgcGl0Y2g7CisJYXdlX3ZvaWNlX2luZm8gKnZwOworCWF3ZV92b2ljZV9wYXJtX2Jsb2NrICpwYXJtOworCUZYX1JlYyAqZnggPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+Zng7CisJRlhfUmVjICpmeF9sYXkgPSBOVUxMOworCWlmICh2b2ljZXNbdm9pY2VdLmxheWVyIDwgTUFYX0xBWUVSUykKKwkJZnhfbGF5ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4X2xheWVyW3ZvaWNlc1t2b2ljZV0ubGF5ZXJdOworCisJLyogQSB2b2ljZSBzYW1wbGUgbXVzdCBhc3NpZ25lZCBiZWZvcmUgY2FsbGluZyAqLworCWlmICgodnAgPSB2b2ljZXNbdm9pY2VdLnNhbXBsZSkgPT0gTlVMTCB8fCB2cC0+aW5kZXggPT0gMCkKKwkJcmV0dXJuOworCisJcGFybSA9IChhd2Vfdm9pY2VfcGFybV9ibG9jayopJnZwLT5wYXJtOworCisJLyogY2hhbm5lbCB0byBiZSBzaWxlbnQgYW5kIGlkbGUgKi8KKwlhd2VfcG9rZShBV0VfRENZU1VTVih2b2ljZSksIDB4MDA4MCk7CisJYXdlX3Bva2UoQVdFX1ZURlQodm9pY2UpLCAweDAwMDBGRkZGKTsKKwlhd2VfcG9rZShBV0VfQ1ZDRih2b2ljZSksIDB4MDAwMEZGRkYpOworCWF3ZV9wb2tlKEFXRV9QVFJYKHZvaWNlKSwgMCk7CisJYXdlX3Bva2UoQVdFX0NQRih2b2ljZSksIDApOworCisJLyogc2V0IHBpdGNoIG9mZnNldCAqLworCWF3ZV9zZXRfcGl0Y2godm9pY2UsIFRSVUUpOworCisJLyogbW9kdWxhdGlvbiAmIHZvbHVtZSBlbnZlbG9wZSAqLworCWlmIChwYXJtLT5tb2RhdGsgPj0gMHg4MCAmJiBwYXJtLT5tb2RkZWxheSA+PSAweDgwMDApIHsKKwkJYXdlX3Bva2UoQVdFX0VOVlZBTCh2b2ljZSksIDB4QkZGRik7CisJCXBpdGNoID0gKHBhcm0tPmVudjFwaXQ8PDQpICsgdm9pY2VzW3ZvaWNlXS5hcGl0Y2g7CisJCWlmIChwaXRjaCA+IDB4ZmZmZikgcGl0Y2ggPSAweGZmZmY7CisJCS8qIGNhbGN1bGF0ZSBmaWx0ZXIgdGFyZ2V0ICovCisJCWZ0YXJnZXQgPSBwYXJtLT5jdXRvZmYgKyBwYXJtLT5lbnYxZmM7CisJCWxpbWl0dmFsdWUoZnRhcmdldCwgMCwgMjU1KTsKKwkJZnRhcmdldCA8PD0gODsKKwl9IGVsc2UgeworCQlhd2VfcG9rZShBV0VfRU5WVkFMKHZvaWNlKSwKKwkJCSBGWF9XT1JEKGZ4LCBmeF9sYXksIEFXRV9GWF9FTlYxX0RFTEFZLCBwYXJtLT5tb2RkZWxheSkpOworCQlmdGFyZ2V0ID0gcGFybS0+Y3V0b2ZmOworCQlmdGFyZ2V0IDw8PSA4OworCQlwaXRjaCA9IHZvaWNlc1t2b2ljZV0uYXBpdGNoOworCX0KKworCS8qIGNhbGN1YWx0ZSBwaXRjaCB0YXJnZXQgKi8KKwlpZiAocGl0Y2ggIT0gMHhmZmZmKSB7CisJCXB0YXJnZXQgPSAxIDw8IChwaXRjaCA+PiAxMik7CisJCWlmIChwaXRjaCAmIDB4ODAwKSBwdGFyZ2V0ICs9IChwdGFyZ2V0KjB4MTAyZSkvMHgyNzEwOworCQlpZiAocGl0Y2ggJiAweDQwMCkgcHRhcmdldCArPSAocHRhcmdldCoweDc2NCkvMHgyNzEwOworCQlpZiAocGl0Y2ggJiAweDIwMCkgcHRhcmdldCArPSAocHRhcmdldCoweDM4OSkvMHgyNzEwOworCQlwdGFyZ2V0ICs9IChwdGFyZ2V0Pj4xKTsKKwkJaWYgKHB0YXJnZXQgPiAweGZmZmYpIHB0YXJnZXQgPSAweGZmZmY7CisKKwl9IGVsc2UgcHRhcmdldCA9IDB4ZmZmZjsKKwlpZiAocGFybS0+bW9kYXRrID49IDB4ODApCisJCWF3ZV9wb2tlKEFXRV9BVEtITEQodm9pY2UpLAorCQkJIEZYX0JZVEUoZngsIGZ4X2xheSwgQVdFX0ZYX0VOVjFfSE9MRCwgcGFybS0+bW9kaGxkKSA8PCA4IHwgMHg3Zik7CisJZWxzZQorCQlhd2VfcG9rZShBV0VfQVRLSExEKHZvaWNlKSwKKwkJCSBGWF9DT01CKGZ4LCBmeF9sYXksIEFXRV9GWF9FTlYxX0hPTEQsIEFXRV9GWF9FTlYxX0FUVEFDSywKKwkJCQkgdnAtPnBhcm0ubW9kYXRraGxkKSk7CisJYXdlX3Bva2UoQVdFX0RDWVNVUyh2b2ljZSksCisJCSBGWF9DT01CKGZ4LCBmeF9sYXksIEFXRV9GWF9FTlYxX1NVU1RBSU4sIEFXRV9GWF9FTlYxX0RFQ0FZLAorCQkJICB2cC0+cGFybS5tb2RkY3lzdXMpKTsKKworCWlmIChwYXJtLT52b2xhdGsgPj0gMHg4MCAmJiBwYXJtLT52b2xkZWxheSA+PSAweDgwMDApIHsKKwkJYXdlX3Bva2UoQVdFX0VOVlZPTCh2b2ljZSksIDB4QkZGRik7CisJCXZ0YXJnZXQgPSB2b2x0YXJnZXRbdm9pY2VzW3ZvaWNlXS5hdm9sJTB4MTBdPj4odm9pY2VzW3ZvaWNlXS5hdm9sPj40KTsKKwl9IGVsc2UgeworCQlhd2VfcG9rZShBV0VfRU5WVk9MKHZvaWNlKSwKKwkJCSBGWF9XT1JEKGZ4LCBmeF9sYXksIEFXRV9GWF9FTlYyX0RFTEFZLCB2cC0+cGFybS52b2xkZWxheSkpOworCQl2dGFyZ2V0ID0gMDsKKwl9CisJaWYgKHBhcm0tPnZvbGF0ayA+PSAweDgwKQorCQlhd2VfcG9rZShBV0VfQVRLSExEVih2b2ljZSksCisJCQkgRlhfQllURShmeCwgZnhfbGF5LCBBV0VfRlhfRU5WMl9IT0xELCBwYXJtLT52b2xobGQpIDw8IDggfCAweDdmKTsKKwllbHNlCisJCWF3ZV9wb2tlKEFXRV9BVEtITERWKHZvaWNlKSwKKwkJCSBGWF9DT01CKGZ4LCBmeF9sYXksIEFXRV9GWF9FTlYyX0hPTEQsIEFXRV9GWF9FTlYyX0FUVEFDSywKKwkJCSB2cC0+cGFybS52b2xhdGtobGQpKTsKKwkvKiBkZWNheS9zdXN0YWluIHBhcmFtZXRlciBmb3Igdm9sdW1lIGVudmVsb3BlIG11c3QgYmUgc2V0IGF0IGxhc3QgKi8KKworCS8qIGN1dG9mZiBhbmQgdm9sdW1lICovCisJYXdlX3NldF92b2x1bWUodm9pY2UsIFRSVUUpOworCisJLyogbW9kdWxhdGlvbiBlbnZlbG9wZSBoZWlnaHRzICovCisJYXdlX3Bva2UoQVdFX1BFRkUodm9pY2UpLAorCQkgRlhfQ09NQihmeCwgZnhfbGF5LCBBV0VfRlhfRU5WMV9QSVRDSCwgQVdFX0ZYX0VOVjFfQ1VUT0ZGLAorCQkJIHZwLT5wYXJtLnBlZmUpKTsKKworCS8qIGxmbzEvMiBkZWxheSAqLworCWF3ZV9wb2tlKEFXRV9MRk8xVkFMKHZvaWNlKSwKKwkJIEZYX1dPUkQoZngsIGZ4X2xheSwgQVdFX0ZYX0xGTzFfREVMQVksIHZwLT5wYXJtLmxmbzFkZWxheSkpOworCWF3ZV9wb2tlKEFXRV9MRk8yVkFMKHZvaWNlKSwKKwkJIEZYX1dPUkQoZngsIGZ4X2xheSwgQVdFX0ZYX0xGTzJfREVMQVksIHZwLT5wYXJtLmxmbzJkZWxheSkpOworCisJLyogbGZvMSBwaXRjaCAmIGN1dG9mZiBzaGlmdCAqLworCWF3ZV9meF9mbW1vZCh2b2ljZSwgVFJVRSk7CisJLyogbGZvMSB2b2x1bWUgJiBmcmVxICovCisJYXdlX2Z4X3RyZW1mcnEodm9pY2UsIFRSVUUpOworCS8qIGxmbzIgcGl0Y2ggJiBmcmVxICovCisJYXdlX2Z4X2ZtMmZycTIodm9pY2UsIFRSVUUpOworCS8qIHBhbiAmIGxvb3Agc3RhcnQgKi8KKwlhd2Vfc2V0X3Bhbih2b2ljZSwgVFJVRSk7CisKKwkvKiBjaG9ydXMgJiBsb29wIGVuZCAoY2hvcnVzIDhiaXQsIE1TQikgKi8KKwlhZGRyID0gdnAtPmxvb3BlbmQgLSAxOworCWFkZHIgKz0gRlhfT0ZGU0VUKGZ4LCBmeF9sYXksIEFXRV9GWF9MT09QX0VORCwKKwkJCSAgQVdFX0ZYX0NPQVJTRV9MT09QX0VORCwgdnAtPm1vZGUpOworCXRlbXAgPSBGWF9CWVRFKGZ4LCBmeF9sYXksIEFXRV9GWF9DSE9SVVMsIHZwLT5wYXJtLmNob3J1cyk7CisJdGVtcCA9ICh0ZW1wIDw8MjQpIHwgKHVuc2lnbmVkIGludClhZGRyOworCWF3ZV9wb2tlX2R3KEFXRV9DU0wodm9pY2UpLCB0ZW1wKTsKKwlERUJVRyg0LHByaW50aygiQVdFMzI6IFstLSBsb29wZW5kPSV4LyV4XVxuIiwgdnAtPmxvb3BlbmQsIGFkZHIpKTsKKworCS8qIFEgJiBjdXJyZW50IGFkZHJlc3MgKFEgNGJpdCB2YWx1ZSwgTVNCKSAqLworCWFkZHIgPSB2cC0+c3RhcnQgLSAxOworCWFkZHIgKz0gRlhfT0ZGU0VUKGZ4LCBmeF9sYXksIEFXRV9GWF9TQU1QTEVfU1RBUlQsCisJCQkgIEFXRV9GWF9DT0FSU0VfU0FNUExFX1NUQVJULCB2cC0+bW9kZSk7CisJdGVtcCA9IEZYX0JZVEUoZngsIGZ4X2xheSwgQVdFX0ZYX0ZJTFRFUlEsIHZwLT5wYXJtLmZpbHRlclEpOworCXRlbXAgPSAodGVtcDw8MjgpIHwgKHVuc2lnbmVkIGludClhZGRyOworCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKHZvaWNlKSwgdGVtcCk7CisJREVCVUcoNCxwcmludGsoIkFXRTMyOiBbLS0gc3RhcnRhZGRyPSV4LyV4XVxuIiwgdnAtPnN0YXJ0LCBhZGRyKSk7CisKKwkvKiBjbGVhciB1bmtub3duIHJlZ2lzdGVycyAqLworCWF3ZV9wb2tlX2R3KEFXRV8wMEEwKHZvaWNlKSwgMCk7CisJYXdlX3Bva2VfZHcoQVdFXzAwODAodm9pY2UpLCAwKTsKKworCS8qIHJlc2V0IHZvbHVtZSAqLworCWF3ZV9wb2tlX2R3KEFXRV9WVEZUKHZvaWNlKSwgKHZ0YXJnZXQ8PDE2KXxmdGFyZ2V0KTsKKwlhd2VfcG9rZV9kdyhBV0VfQ1ZDRih2b2ljZSksICh2dGFyZ2V0PDwxNil8ZnRhcmdldCk7CisKKwkvKiBzZXQgcmV2ZXJiICovCisJdGVtcCA9IEZYX0JZVEUoZngsIGZ4X2xheSwgQVdFX0ZYX1JFVkVSQiwgdnAtPnBhcm0ucmV2ZXJiKTsKKwl0ZW1wID0gKHRlbXAgPDwgOCkgfCAocHRhcmdldCA8PCAxNikgfCB2b2ljZXNbdm9pY2VdLmFhdXg7CisJYXdlX3Bva2VfZHcoQVdFX1BUUlgodm9pY2UpLCB0ZW1wKTsKKwlhd2VfcG9rZV9kdyhBV0VfQ1BGKHZvaWNlKSwgcHRhcmdldCA8PCAxNik7CisJLyogdHVybiBvbiBlbnZlbG9wZSAqLworCWF3ZV9wb2tlKEFXRV9EQ1lTVVNWKHZvaWNlKSwKKwkJIEZYX0NPTUIoZngsIGZ4X2xheSwgQVdFX0ZYX0VOVjJfU1VTVEFJTiwgQVdFX0ZYX0VOVjJfREVDQVksCisJCQkgIHZwLT5wYXJtLnZvbGRjeXN1cykpOworCisJdm9pY2VzW3ZvaWNlXS5zdGF0ZSA9IEFXRV9TVF9PTjsKKworCS8qIGNsZWFyIHZvaWNlIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBub3RlIG9uIHRoaXMgY2hhbm5lbCAqLworCWlmIChTSU5HTEVfTEFZRVJfTU9ERSgpKSB7CisJCUZYX1VOU0VUKGZ4LCBBV0VfRlhfU0FNUExFX1NUQVJUKTsKKwkJRlhfVU5TRVQoZngsIEFXRV9GWF9DT0FSU0VfU0FNUExFX1NUQVJUKTsKKwl9Cit9CisKKworLyogdHVybiBvZmYgdGhlIHZvaWNlICovCitzdGF0aWMgdm9pZAorYXdlX25vdGVfb2ZmKGludCB2b2ljZSkKK3sKKwlhd2Vfdm9pY2VfaW5mbyAqdnA7CisJdW5zaWduZWQgc2hvcnQgdG1wOworCUZYX1JlYyAqZnggPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+Zng7CisJRlhfUmVjICpmeF9sYXkgPSBOVUxMOworCWlmICh2b2ljZXNbdm9pY2VdLmxheWVyIDwgTUFYX0xBWUVSUykKKwkJZnhfbGF5ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4X2xheWVyW3ZvaWNlc1t2b2ljZV0ubGF5ZXJdOworCisJaWYgKCh2cCA9IHZvaWNlc1t2b2ljZV0uc2FtcGxlKSA9PSBOVUxMKSB7CisJCXZvaWNlc1t2b2ljZV0uc3RhdGUgPSBBV0VfU1RfT0ZGOworCQlyZXR1cm47CisJfQorCisJdG1wID0gMHg4MDAwIHwgRlhfQllURShmeCwgZnhfbGF5LCBBV0VfRlhfRU5WMV9SRUxFQVNFLAorCQkJICAgICAgICh1bnNpZ25lZCBjaGFyKXZwLT5wYXJtLm1vZHJlbGVhc2UpOworCWF3ZV9wb2tlKEFXRV9EQ1lTVVModm9pY2UpLCB0bXApOworCXRtcCA9IDB4ODAwMCB8IEZYX0JZVEUoZngsIGZ4X2xheSwgQVdFX0ZYX0VOVjJfUkVMRUFTRSwKKwkJCSAgICAgICAodW5zaWduZWQgY2hhcil2cC0+cGFybS52b2xyZWxlYXNlKTsKKwlhd2VfcG9rZShBV0VfRENZU1VTVih2b2ljZSksIHRtcCk7CisJdm9pY2VzW3ZvaWNlXS5zdGF0ZSA9IEFXRV9TVF9SRUxFQVNFRDsKK30KKworLyogZm9yY2UgdG8gdGVybWluYXRlIHRoZSB2b2ljZSAobm8gcmVsZWFzaW5nIGVjaG8pICovCitzdGF0aWMgdm9pZAorYXdlX3Rlcm1pbmF0ZShpbnQgdm9pY2UpCit7CisJYXdlX3Bva2UoQVdFX0RDWVNVU1Yodm9pY2UpLCAweDgwN0YpOworCWF3ZV90d2Vha192b2ljZSh2b2ljZSk7CisJdm9pY2VzW3ZvaWNlXS5zdGF0ZSA9IEFXRV9TVF9PRkY7Cit9CisKKy8qIHR1cm4gb2ZmIG90aGVyIHZvaWNlcyB3aXRoIHRoZSBzYW1lIGV4Y2x1c2l2ZSBjbGFzcyAoZm9yIGRydW1zKSAqLworc3RhdGljIHZvaWQKK2F3ZV9leGNsdXNpdmVfb2ZmKGludCB2b2ljZSkKK3sKKwlpbnQgaSwgZXhjbGFzczsKKworCWlmICh2b2ljZXNbdm9pY2VdLnNhbXBsZSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKChleGNsYXNzID0gdm9pY2VzW3ZvaWNlXS5zYW1wbGUtPmV4Y2x1c2l2ZUNsYXNzKSA9PSAwKQorCQlyZXR1cm47CS8qIG5vdCBleGNsdXNpdmUgKi8KKworCS8qIHR1cm4gb2ZmIHZvaWNlcyB3aXRoIHRoZSBzYW1lIGNsYXNzICovCisJZm9yIChpID0gMDsgaSA8IGF3ZV9tYXhfdm9pY2VzOyBpKyspIHsKKwkJaWYgKGkgIT0gdm9pY2UgJiYgSVNfUExBWUlORyhpKSAmJgorCQkgICAgdm9pY2VzW2ldLnNhbXBsZSAmJiB2b2ljZXNbaV0uY2ggPT0gdm9pY2VzW3ZvaWNlXS5jaCAmJgorCQkgICAgdm9pY2VzW2ldLnNhbXBsZS0+ZXhjbHVzaXZlQ2xhc3MgPT0gZXhjbGFzcykgeworCQkJREVCVUcoNCxwcmludGsoIkFXRTMyOiBbZXhvZmYoJWQpXVxuIiwgaSkpOworCQkJYXdlX3Rlcm1pbmF0ZShpKTsKKwkJCWF3ZV92b2ljZV9pbml0KGksIFRSVUUpOworCQl9CisJfQorfQorCisKKy8qCisgKiBjaGFuZ2UgdGhlIHBhcmFtZXRlcnMgb2YgYW4gYXVkaWJsZSB2b2ljZQorICovCisKKy8qIGNoYW5nZSBwaXRjaCAqLworc3RhdGljIHZvaWQKK2F3ZV9zZXRfcGl0Y2goaW50IHZvaWNlLCBpbnQgZm9yY2VkKQoreworCWlmIChJU19OT19FRkZFQ1Qodm9pY2UpICYmICFmb3JjZWQpIHJldHVybjsKKwlhd2VfcG9rZShBV0VfSVAodm9pY2UpLCB2b2ljZXNbdm9pY2VdLmFwaXRjaCk7CisJREVCVUcoMyxwcmludGsoIkFXRTMyOiBbLS0gcGl0Y2g9JXhdXG4iLCB2b2ljZXNbdm9pY2VdLmFwaXRjaCkpOworfQorCisvKiBjYWxjdWxhdGUgJiBjaGFuZ2UgcGl0Y2ggKi8KK3N0YXRpYyB2b2lkCithd2Vfc2V0X3ZvaWNlX3BpdGNoKGludCB2b2ljZSwgaW50IGZvcmNlZCkKK3sKKwlhd2VfY2FsY19waXRjaCh2b2ljZSk7CisJYXdlX3NldF9waXRjaCh2b2ljZSwgZm9yY2VkKTsKK30KKworLyogY2hhbmdlIHZvbHVtZSAmIGN1dG9mZiAqLworc3RhdGljIHZvaWQKK2F3ZV9zZXRfdm9sdW1lKGludCB2b2ljZSwgaW50IGZvcmNlZCkKK3sKKwlhd2Vfdm9pY2VfaW5mbyAqdnA7CisJdW5zaWduZWQgc2hvcnQgdG1wMjsKKwlGWF9SZWMgKmZ4ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4OworCUZYX1JlYyAqZnhfbGF5ID0gTlVMTDsKKwlpZiAodm9pY2VzW3ZvaWNlXS5sYXllciA8IE1BWF9MQVlFUlMpCisJCWZ4X2xheSA9ICZ2b2ljZXNbdm9pY2VdLmNpbmZvLT5meF9sYXllclt2b2ljZXNbdm9pY2VdLmxheWVyXTsKKworCWlmICghSVNfUExBWUlORyh2b2ljZSkgJiYgIWZvcmNlZCkgcmV0dXJuOworCWlmICgodnAgPSB2b2ljZXNbdm9pY2VdLnNhbXBsZSkgPT0gTlVMTCB8fCB2cC0+aW5kZXggPT0gMCkKKwkJcmV0dXJuOworCisJdG1wMiA9IEZYX0JZVEUoZngsIGZ4X2xheSwgQVdFX0ZYX0NVVE9GRiwKKwkJICAgICAgICh1bnNpZ25lZCBjaGFyKXZvaWNlc1t2b2ljZV0uYWN1dG9mZik7CisJdG1wMiA9ICh0bXAyIDw8IDgpOworCXRtcDIgfD0gRlhfQllURShmeCwgZnhfbGF5LCBBV0VfRlhfQVRURU4sCisJCQkodW5zaWduZWQgY2hhcil2b2ljZXNbdm9pY2VdLmF2b2wpOworCWF3ZV9wb2tlKEFXRV9JRkFUTih2b2ljZSksIHRtcDIpOworfQorCisvKiBjYWxjdWxhdGUgJiBjaGFuZ2Ugdm9sdW1lICovCitzdGF0aWMgdm9pZAorYXdlX3NldF92b2ljZV92b2woaW50IHZvaWNlLCBpbnQgZm9yY2VkKQoreworCWlmIChJU19FTVBUWSh2b2ljZSkpCisJCXJldHVybjsKKwlhd2VfY2FsY192b2x1bWUodm9pY2UpOworCWF3ZV9zZXRfdm9sdW1lKHZvaWNlLCBmb3JjZWQpOworfQorCisKKy8qIGNoYW5nZSBwYW47IHRoaXMgY291bGQgbWFrZSBhIGNsaWNrIG5vaXNlLi4gKi8KK3N0YXRpYyB2b2lkCithd2Vfc2V0X3BhbihpbnQgdm9pY2UsIGludCBmb3JjZWQpCit7CisJdW5zaWduZWQgaW50IHRlbXA7CisJaW50IGFkZHI7CisJYXdlX3ZvaWNlX2luZm8gKnZwOworCUZYX1JlYyAqZnggPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+Zng7CisJRlhfUmVjICpmeF9sYXkgPSBOVUxMOworCWlmICh2b2ljZXNbdm9pY2VdLmxheWVyIDwgTUFYX0xBWUVSUykKKwkJZnhfbGF5ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4X2xheWVyW3ZvaWNlc1t2b2ljZV0ubGF5ZXJdOworCisJaWYgKElTX05PX0VGRkVDVCh2b2ljZSkgJiYgIWZvcmNlZCkgcmV0dXJuOworCWlmICgodnAgPSB2b2ljZXNbdm9pY2VdLnNhbXBsZSkgPT0gTlVMTCB8fCB2cC0+aW5kZXggPT0gMCkKKwkJcmV0dXJuOworCisJLyogcGFuICYgbG9vcCBzdGFydCAocGFuIDhiaXQsIE1TQiwgMDpyaWdodCwgMHhmZjpsZWZ0KSAqLworCWlmICh2cC0+Zml4cGFuID4gMCkJLyogMC0xMjcgKi8KKwkJdGVtcCA9IDI1NSAtIChpbnQpdnAtPmZpeHBhbiAqIDI7CisJZWxzZSB7CisJCWludCBwb3MgPSAwOworCQlpZiAodnAtPnBhbiA+PSAwKSAvKiAwLTEyNyAqLworCQkJcG9zID0gKGludCl2cC0+cGFuICogMiAtIDEyODsKKwkJcG9zICs9IHZvaWNlc1t2b2ljZV0uY2luZm8tPnBhbm5pbmc7IC8qIC0xMjggLSAxMjcgKi8KKwkJdGVtcCA9IDEyNyAtIHBvczsKKwl9CisJbGltaXR2YWx1ZSh0ZW1wLCAwLCAyNTUpOworCWlmIChjdHJsc1tBV0VfTURfUEFOX0VYQ0hBTkdFXSkgeworCQl0ZW1wID0gMjU1IC0gdGVtcDsKKwl9CisJaWYgKGZvcmNlZCB8fCB0ZW1wICE9IHZvaWNlc1t2b2ljZV0uYXBhbikgeworCQl2b2ljZXNbdm9pY2VdLmFwYW4gPSB0ZW1wOworCQlpZiAodGVtcCA9PSAwKQorCQkJdm9pY2VzW3ZvaWNlXS5hYXV4ID0gMHhmZjsKKwkJZWxzZQorCQkJdm9pY2VzW3ZvaWNlXS5hYXV4ID0gKC10ZW1wKSAmIDB4ZmY7CisJCWFkZHIgPSB2cC0+bG9vcHN0YXJ0IC0gMTsKKwkJYWRkciArPSBGWF9PRkZTRVQoZngsIGZ4X2xheSwgQVdFX0ZYX0xPT1BfU1RBUlQsCisJCQkJICBBV0VfRlhfQ09BUlNFX0xPT1BfU1RBUlQsIHZwLT5tb2RlKTsKKwkJdGVtcCA9ICh0ZW1wPDwyNCkgfCAodW5zaWduZWQgaW50KWFkZHI7CisJCWF3ZV9wb2tlX2R3KEFXRV9QU1NUKHZvaWNlKSwgdGVtcCk7CisJCURFQlVHKDQscHJpbnRrKCJBV0UzMjogWy0tIGxvb3BzdGFydD0leC8leF1cbiIsIHZwLT5sb29wc3RhcnQsIGFkZHIpKTsKKwl9Cit9CisKKy8qIGVmZmVjdHMgY2hhbmdlIGR1cmluZyBwbGF5aW5nICovCitzdGF0aWMgdm9pZAorYXdlX2Z4X2ZtbW9kKGludCB2b2ljZSwgaW50IGZvcmNlZCkKK3sKKwlhd2Vfdm9pY2VfaW5mbyAqdnA7CisJRlhfUmVjICpmeCA9ICZ2b2ljZXNbdm9pY2VdLmNpbmZvLT5meDsKKwlGWF9SZWMgKmZ4X2xheSA9IE5VTEw7CisJaWYgKHZvaWNlc1t2b2ljZV0ubGF5ZXIgPCBNQVhfTEFZRVJTKQorCQlmeF9sYXkgPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+ZnhfbGF5ZXJbdm9pY2VzW3ZvaWNlXS5sYXllcl07CisKKwlpZiAoSVNfTk9fRUZGRUNUKHZvaWNlKSAmJiAhZm9yY2VkKSByZXR1cm47CisJaWYgKCh2cCA9IHZvaWNlc1t2b2ljZV0uc2FtcGxlKSA9PSBOVUxMIHx8IHZwLT5pbmRleCA9PSAwKQorCQlyZXR1cm47CisJYXdlX3Bva2UoQVdFX0ZNTU9EKHZvaWNlKSwKKwkJIEZYX0NPTUIoZngsIGZ4X2xheSwgQVdFX0ZYX0xGTzFfUElUQ0gsIEFXRV9GWF9MRk8xX0NVVE9GRiwKKwkJCSB2cC0+cGFybS5mbW1vZCkpOworfQorCisvKiBzZXQgdHJlbW9sbyAobGZvMSkgdm9sdW1lICYgZnJlcXVlbmN5ICovCitzdGF0aWMgdm9pZAorYXdlX2Z4X3RyZW1mcnEoaW50IHZvaWNlLCBpbnQgZm9yY2VkKQoreworCWF3ZV92b2ljZV9pbmZvICp2cDsKKwlGWF9SZWMgKmZ4ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4OworCUZYX1JlYyAqZnhfbGF5ID0gTlVMTDsKKwlpZiAodm9pY2VzW3ZvaWNlXS5sYXllciA8IE1BWF9MQVlFUlMpCisJCWZ4X2xheSA9ICZ2b2ljZXNbdm9pY2VdLmNpbmZvLT5meF9sYXllclt2b2ljZXNbdm9pY2VdLmxheWVyXTsKKworCWlmIChJU19OT19FRkZFQ1Qodm9pY2UpICYmICFmb3JjZWQpIHJldHVybjsKKwlpZiAoKHZwID0gdm9pY2VzW3ZvaWNlXS5zYW1wbGUpID09IE5VTEwgfHwgdnAtPmluZGV4ID09IDApCisJCXJldHVybjsKKwlhd2VfcG9rZShBV0VfVFJFTUZSUSh2b2ljZSksCisJCSBGWF9DT01CKGZ4LCBmeF9sYXksIEFXRV9GWF9MRk8xX1ZPTFVNRSwgQVdFX0ZYX0xGTzFfRlJFUSwKKwkJCSB2cC0+cGFybS50cmVtZnJxKSk7Cit9CisKKy8qIHNldCBsZm8yIHBpdGNoICYgZnJlcXVlbmN5ICovCitzdGF0aWMgdm9pZAorYXdlX2Z4X2ZtMmZycTIoaW50IHZvaWNlLCBpbnQgZm9yY2VkKQoreworCWF3ZV92b2ljZV9pbmZvICp2cDsKKwlGWF9SZWMgKmZ4ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4OworCUZYX1JlYyAqZnhfbGF5ID0gTlVMTDsKKwlpZiAodm9pY2VzW3ZvaWNlXS5sYXllciA8IE1BWF9MQVlFUlMpCisJCWZ4X2xheSA9ICZ2b2ljZXNbdm9pY2VdLmNpbmZvLT5meF9sYXllclt2b2ljZXNbdm9pY2VdLmxheWVyXTsKKworCWlmIChJU19OT19FRkZFQ1Qodm9pY2UpICYmICFmb3JjZWQpIHJldHVybjsKKwlpZiAoKHZwID0gdm9pY2VzW3ZvaWNlXS5zYW1wbGUpID09IE5VTEwgfHwgdnAtPmluZGV4ID09IDApCisJCXJldHVybjsKKwlhd2VfcG9rZShBV0VfRk0yRlJRMih2b2ljZSksCisJCSBGWF9DT01CKGZ4LCBmeF9sYXksIEFXRV9GWF9MRk8yX1BJVENILCBBV0VfRlhfTEZPMl9GUkVRLAorCQkJIHZwLT5wYXJtLmZtMmZycTIpKTsKK30KKworCisvKiBRICYgY3VycmVudCBhZGRyZXNzIChRIDRiaXQgdmFsdWUsIE1TQikgKi8KK3N0YXRpYyB2b2lkCithd2VfZnhfZmlsdGVyUShpbnQgdm9pY2UsIGludCBmb3JjZWQpCit7CisJdW5zaWduZWQgaW50IGFkZHI7CisJYXdlX3ZvaWNlX2luZm8gKnZwOworCUZYX1JlYyAqZnggPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+Zng7CisJRlhfUmVjICpmeF9sYXkgPSBOVUxMOworCWlmICh2b2ljZXNbdm9pY2VdLmxheWVyIDwgTUFYX0xBWUVSUykKKwkJZnhfbGF5ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4X2xheWVyW3ZvaWNlc1t2b2ljZV0ubGF5ZXJdOworCisJaWYgKElTX05PX0VGRkVDVCh2b2ljZSkgJiYgIWZvcmNlZCkgcmV0dXJuOworCWlmICgodnAgPSB2b2ljZXNbdm9pY2VdLnNhbXBsZSkgPT0gTlVMTCB8fCB2cC0+aW5kZXggPT0gMCkKKwkJcmV0dXJuOworCisJYWRkciA9IGF3ZV9wZWVrX2R3KEFXRV9DQ0NBKHZvaWNlKSkgJiAweGZmZmZmZjsKKwlhZGRyIHw9IChGWF9CWVRFKGZ4LCBmeF9sYXksIEFXRV9GWF9GSUxURVJRLCB2cC0+cGFybS5maWx0ZXJRKSA8PCAyOCk7CisJYXdlX3Bva2VfZHcoQVdFX0NDQ0Eodm9pY2UpLCBhZGRyKTsKK30KKworLyoKKyAqIGNhbGN1bGF0ZSBwaXRjaCBvZmZzZXQKKyAqCisgKiAweEUwMDAgaXMgbm8gcGl0Y2ggb2Zmc2V0IGF0IDQ0MTAwSHogc2FtcGxlLgorICogRXZlcnkgNDA5NiBpcyBvbmUgb2N0YXZlLgorICovCisKK3N0YXRpYyB2b2lkCithd2VfY2FsY19waXRjaChpbnQgdm9pY2UpCit7CisJdm9pY2VfaW5mbyAqdnAgPSAmdm9pY2VzW3ZvaWNlXTsKKwlhd2Vfdm9pY2VfaW5mbyAqYXA7CisJYXdlX2NoYW5faW5mbyAqY3AgPSB2b2ljZXNbdm9pY2VdLmNpbmZvOworCWludCBvZmZzZXQ7CisKKwkvKiBzZWFyY2ggdm9pY2UgaW5mb3JtYXRpb24gKi8KKwlpZiAoKGFwID0gdnAtPnNhbXBsZSkgPT0gTlVMTCkKKwkJCXJldHVybjsKKwlpZiAoYXAtPmluZGV4ID09IDApIHsKKwkJREVCVUcoMyxwcmludGsoIkFXRTMyOiBzZXQgc2FtcGxlICglZClcbiIsIGFwLT5zYW1wbGUpKTsKKwkJaWYgKGF3ZV9zZXRfc2FtcGxlKChhd2Vfdm9pY2VfbGlzdCopYXApID09IDApCisJCQlyZXR1cm47CisJfQorCisJLyogY2FsY3VsYXRlIG9mZnNldCAqLworCWlmIChhcC0+Zml4a2V5ID49IDApIHsKKwkJREVCVUcoMyxwcmludGsoIkFXRTMyOiBwLT4gZml4a2V5KCVkKSB0dW5lKCVkKVxuIiwgYXAtPmZpeGtleSwgYXAtPnR1bmUpKTsKKwkJb2Zmc2V0ID0gKGFwLT5maXhrZXkgLSBhcC0+cm9vdCkgKiA0MDk2IC8gMTI7CisJfSBlbHNlIHsKKwkJREVCVUcoMyxwcmludGsoIkFXRTMyOiBwKCVkKS0+IHJvb3QoJWQpIHR1bmUoJWQpXG4iLCB2cC0+bm90ZSwgYXAtPnJvb3QsIGFwLT50dW5lKSk7CisJCW9mZnNldCA9ICh2cC0+bm90ZSAtIGFwLT5yb290KSAqIDQwOTYgLyAxMjsKKwkJREVCVUcoNCxwcmludGsoIkFXRTMyOiBwLT4gb2ZzPSVkXG4iLCBvZmZzZXQpKTsKKwl9CisJb2Zmc2V0ID0gKG9mZnNldCAqIGFwLT5zY2FsZVR1bmluZykgLyAxMDA7CisJREVCVUcoNCxwcmludGsoIkFXRTMyOiBwLT4gc2NhbGUqIG9mcz0lZFxuIiwgb2Zmc2V0KSk7CisJb2Zmc2V0ICs9IGFwLT50dW5lICogNDA5NiAvIDEyMDA7CisJREVCVUcoNCxwcmludGsoIkFXRTMyOiBwLT4gdHVuZSsgb2ZzPSVkXG4iLCBvZmZzZXQpKTsKKwlpZiAoY3AtPmJlbmRlciAhPSAwKSB7CisJCURFQlVHKDMscHJpbnRrKCJBV0UzMjogcC0+IGJlbmQoJWQpICVkXG4iLCB2b2ljZSwgY3AtPmJlbmRlcikpOworCQkvKiAoODE5MjAwOiAxIHNlbWl0b25lKSA9PT4gKDQwOTY6IDEyIHNlbWl0b25lcykgKi8KKwkJb2Zmc2V0ICs9IGNwLT5iZW5kZXIgKiBjcC0+YmVuZGVyX3JhbmdlIC8gMjQwMDsKKwl9CisKKwkvKiBhZGQgaW5pdGlhbCBwaXRjaCBjb3JyZWN0aW9uICovCisJaWYgKEZYX09OKCZjcC0+ZnhfbGF5ZXJbdnAtPmxheWVyXSwgQVdFX0ZYX0lOSVRfUElUQ0gpKQorCQlvZmZzZXQgKz0gY3AtPmZ4X2xheWVyW3ZwLT5sYXllcl0udmFsW0FXRV9GWF9JTklUX1BJVENIXTsKKwllbHNlIGlmIChGWF9PTigmY3AtPmZ4LCBBV0VfRlhfSU5JVF9QSVRDSCkpCisJCW9mZnNldCArPSBjcC0+ZngudmFsW0FXRV9GWF9JTklUX1BJVENIXTsKKworCS8qIDB4ZTAwMDogcm9vdCBwaXRjaCAqLworCXZwLT5hcGl0Y2ggPSAweGUwMDAgKyBhcC0+cmF0ZV9vZmZzZXQgKyBvZmZzZXQ7CisJREVCVUcoNCxwcmludGsoIkFXRTMyOiBwLT4gc3VtIGFvZnM9JXgsIHJhdGVfb2ZzPSVkXG4iLCB2cC0+YXBpdGNoLCBhcC0+cmF0ZV9vZmZzZXQpKTsKKwlpZiAodnAtPmFwaXRjaCA+IDB4ZmZmZikKKwkJdnAtPmFwaXRjaCA9IDB4ZmZmZjsKKwlpZiAodnAtPmFwaXRjaCA8IDApCisJCXZwLT5hcGl0Y2ggPSAwOworfQorCisKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCisvKiBjYWxjdWxhdGUgTUlESSBrZXkgYW5kIHNlbWl0b25lIGZyb20gdGhlIHNwZWNpZmllZCBmcmVxdWVuY3kgKi8KK3N0YXRpYyB2b2lkCithd2VfY2FsY19waXRjaF9mcm9tX2ZyZXEoaW50IHZvaWNlLCBpbnQgZnJlcSkKK3sKKwl2b2ljZV9pbmZvICp2cCA9ICZ2b2ljZXNbdm9pY2VdOworCWF3ZV92b2ljZV9pbmZvICphcDsKKwlGWF9SZWMgKmZ4ID0gJnZvaWNlc1t2b2ljZV0uY2luZm8tPmZ4OworCUZYX1JlYyAqZnhfbGF5ID0gTlVMTDsKKwlpbnQgb2Zmc2V0OworCWludCBub3RlOworCisJaWYgKHZvaWNlc1t2b2ljZV0ubGF5ZXIgPCBNQVhfTEFZRVJTKQorCQlmeF9sYXkgPSAmdm9pY2VzW3ZvaWNlXS5jaW5mby0+ZnhfbGF5ZXJbdm9pY2VzW3ZvaWNlXS5sYXllcl07CisKKwkvKiBzZWFyY2ggdm9pY2UgaW5mb3JtYXRpb24gKi8KKwlpZiAoKGFwID0gdnAtPnNhbXBsZSkgPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmIChhcC0+aW5kZXggPT0gMCkgeworCQlERUJVRygzLHByaW50aygiQVdFMzI6IHNldCBzYW1wbGUgKCVkKVxuIiwgYXAtPnNhbXBsZSkpOworCQlpZiAoYXdlX3NldF9zYW1wbGUoKGF3ZV92b2ljZV9saXN0KilhcCkgPT0gMCkKKwkJCXJldHVybjsKKwl9CisJbm90ZSA9IGZyZXFfdG9fbm90ZShmcmVxKTsKKwlvZmZzZXQgPSAobm90ZSAtIGFwLT5yb290ICogMTAwICsgYXAtPnR1bmUpICogNDA5NiAvIDEyMDA7CisJb2Zmc2V0ID0gKG9mZnNldCAqIGFwLT5zY2FsZVR1bmluZykgLyAxMDA7CisJaWYgKGZ4X2xheSAmJiBGWF9PTihmeF9sYXksIEFXRV9GWF9JTklUX1BJVENIKSkKKwkJb2Zmc2V0ICs9IGZ4X2xheS0+dmFsW0FXRV9GWF9JTklUX1BJVENIXTsKKwllbHNlIGlmIChGWF9PTihmeCwgQVdFX0ZYX0lOSVRfUElUQ0gpKQorCQlvZmZzZXQgKz0gZngtPnZhbFtBV0VfRlhfSU5JVF9QSVRDSF07CisJdnAtPmFwaXRjaCA9IDB4ZTAwMCArIGFwLT5yYXRlX29mZnNldCArIG9mZnNldDsKKwlpZiAodnAtPmFwaXRjaCA+IDB4ZmZmZikKKwkJdnAtPmFwaXRjaCA9IDB4ZmZmZjsKKwlpZiAodnAtPmFwaXRjaCA8IDApCisJCXZwLT5hcGl0Y2ggPSAwOworfQorI2VuZGlmIC8qIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkgKi8KKworCisvKgorICogY2FsY3VsYXRlIHZvbHVtZSBhdHRlbnVhdGlvbgorICoKKyAqIFZvaWNlIHZvbHVtZSBpcyBjb250cm9sbGVkIGJ5IHZvbHVtZSBhdHRlbnVhdGlvbiBwYXJhbWV0ZXIuCisgKiBTbyB2b2x1bWUgYmVjb21lcyBtYXhpbXVtIHdoZW4gYXZvbCBpcyAwIChubyBhdHRlbnVhdGlvbiksIGFuZAorICogbWluaW11bSB3aGVuIDI1NSAoLTk2ZEIgb3Igc2lsZW5jZSkuCisgKi8KKworc3RhdGljIGludCB2b2xfdGFibGVbMTI4XSA9IHsKKwkyNTUsMTExLDk1LDg2LDc5LDc0LDcwLDY2LDYzLDYxLDU4LDU2LDU0LDUyLDUwLDQ5LAorCTQ3LDQ2LDQ1LDQzLDQyLDQxLDQwLDM5LDM4LDM3LDM2LDM1LDM0LDM0LDMzLDMyLAorCTMxLDMxLDMwLDI5LDI5LDI4LDI3LDI3LDI2LDI2LDI1LDI0LDI0LDIzLDIzLDIyLAorCTIyLDIxLDIxLDIxLDIwLDIwLDE5LDE5LDE4LDE4LDE4LDE3LDE3LDE2LDE2LDE2LAorCTE1LDE1LDE1LDE0LDE0LDE0LDEzLDEzLDEzLDEyLDEyLDEyLDExLDExLDExLDEwLAorCTEwLDEwLDEwLDksOSw5LDgsOCw4LDgsNyw3LDcsNyw2LDYsCisJNiw2LDUsNSw1LDUsNSw0LDQsNCw0LDMsMywzLDMsMywKKwkyLDIsMiwyLDIsMSwxLDEsMSwxLDAsMCwwLDAsMCwwLAorfTsKKworLyogdGFibGVzIGZvciB2b2x1bWUtPmF0dGVudWF0aW9uIGNhbGN1bGF0aW9uICovCitzdGF0aWMgdW5zaWduZWQgY2hhciB2b2x0YWIxWzEyOF0gPSB7CisgICAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLCAweDYzLAorICAgMHg2MywgMHgyYiwgMHgyOSwgMHgyOCwgMHgyNywgMHgyNiwgMHgyNSwgMHgyNCwgMHgyMywgMHgyMiwKKyAgIDB4MjEsIDB4MjAsIDB4MWYsIDB4MWUsIDB4MWUsIDB4MWQsIDB4MWMsIDB4MWIsIDB4MWIsIDB4MWEsCisgICAweDE5LCAweDE5LCAweDE4LCAweDE3LCAweDE3LCAweDE2LCAweDE2LCAweDE1LCAweDE1LCAweDE0LAorICAgMHgxNCwgMHgxMywgMHgxMywgMHgxMywgMHgxMiwgMHgxMiwgMHgxMSwgMHgxMSwgMHgxMSwgMHgxMCwKKyAgIDB4MTAsIDB4MTAsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGQsCisgICAweDBkLCAweDBkLCAweDBjLCAweDBjLCAweDBjLCAweDBjLCAweDBjLCAweDBiLCAweDBiLCAweDBiLAorICAgMHgwYiwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwKKyAgIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDYsCisgICAweDA2LCAweDA2LCAweDA2LCAweDA2LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA0LAorICAgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMywgMHgwMiwKKyAgIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciB2b2x0YWIyWzEyOF0gPSB7CisgICAweDMyLCAweDMxLCAweDMwLCAweDJmLCAweDJlLCAweDJkLCAweDJjLCAweDJiLCAweDJhLCAweDJhLAorICAgMHgyOSwgMHgyOCwgMHgyNywgMHgyNiwgMHgyNSwgMHgyNCwgMHgyNCwgMHgyMywgMHgyMiwgMHgyMSwKKyAgIDB4MjEsIDB4MjAsIDB4MWYsIDB4MWUsIDB4MWUsIDB4MWQsIDB4MWMsIDB4MWMsIDB4MWIsIDB4MWEsCisgICAweDFhLCAweDE5LCAweDE5LCAweDE4LCAweDE4LCAweDE3LCAweDE2LCAweDE2LCAweDE1LCAweDE1LAorICAgMHgxNCwgMHgxNCwgMHgxMywgMHgxMywgMHgxMywgMHgxMiwgMHgxMiwgMHgxMSwgMHgxMSwgMHgxMCwKKyAgIDB4MTAsIDB4MTAsIDB4MGYsIDB4MGYsIDB4MGYsIDB4MGUsIDB4MGUsIDB4MGUsIDB4MGQsIDB4MGQsCisgICAweDBkLCAweDBjLCAweDBjLCAweDBjLCAweDBiLCAweDBiLCAweDBiLCAweDBiLCAweDBhLCAweDBhLAorICAgMHgwYSwgMHgwYSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwKKyAgIDB4MDgsIDB4MDgsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDcsIDB4MDYsIDB4MDYsIDB4MDYsCisgICAweDA2LCAweDA2LCAweDA2LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LCAweDA1LAorICAgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHgwMywKKyAgIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MDEsCisgICAweDAxLCAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBleHByZXNzaW9udGFiWzEyOF0gPSB7CisgICAweDdmLCAweDZjLCAweDYyLCAweDVhLCAweDU0LCAweDUwLCAweDRiLCAweDQ4LCAweDQ1LCAweDQyLAorICAgMHg0MCwgMHgzZCwgMHgzYiwgMHgzOSwgMHgzOCwgMHgzNiwgMHgzNCwgMHgzMywgMHgzMSwgMHgzMCwKKyAgIDB4MmYsIDB4MmQsIDB4MmMsIDB4MmIsIDB4MmEsIDB4MjksIDB4MjgsIDB4MjcsIDB4MjYsIDB4MjUsCisgICAweDI0LCAweDI0LCAweDIzLCAweDIyLCAweDIxLCAweDIxLCAweDIwLCAweDFmLCAweDFlLCAweDFlLAorICAgMHgxZCwgMHgxZCwgMHgxYywgMHgxYiwgMHgxYiwgMHgxYSwgMHgxYSwgMHgxOSwgMHgxOCwgMHgxOCwKKyAgIDB4MTcsIDB4MTcsIDB4MTYsIDB4MTYsIDB4MTUsIDB4MTUsIDB4MTUsIDB4MTQsIDB4MTQsIDB4MTMsCisgICAweDEzLCAweDEyLCAweDEyLCAweDExLCAweDExLCAweDExLCAweDEwLCAweDEwLCAweDBmLCAweDBmLAorICAgMHgwZiwgMHgwZSwgMHgwZSwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwYywgMHgwYywgMHgwYywKKyAgIDB4MGIsIDB4MGIsIDB4MGIsIDB4MGEsIDB4MGEsIDB4MGEsIDB4MDksIDB4MDksIDB4MDksIDB4MDksCisgICAweDA4LCAweDA4LCAweDA4LCAweDA3LCAweDA3LCAweDA3LCAweDA3LCAweDA2LCAweDA2LCAweDA2LAorICAgMHgwNiwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwMywKKyAgIDB4MDMsIDB4MDMsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDEsCisgICAweDAxLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwCit9OworCitzdGF0aWMgdm9pZAorYXdlX2NhbGNfdm9sdW1lKGludCB2b2ljZSkKK3sKKwl2b2ljZV9pbmZvICp2cCA9ICZ2b2ljZXNbdm9pY2VdOworCWF3ZV92b2ljZV9pbmZvICphcDsKKwlhd2VfY2hhbl9pbmZvICpjcCA9IHZvaWNlc1t2b2ljZV0uY2luZm87CisJaW50IHZvbDsKKworCS8qIHNlYXJjaCB2b2ljZSBpbmZvcm1hdGlvbiAqLworCWlmICgoYXAgPSB2cC0+c2FtcGxlKSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlhcCA9IHZwLT5zYW1wbGU7CisJaWYgKGFwLT5pbmRleCA9PSAwKSB7CisJCURFQlVHKDMscHJpbnRrKCJBV0UzMjogc2V0IHNhbXBsZSAoJWQpXG4iLCBhcC0+c2FtcGxlKSk7CisJCWlmIChhd2Vfc2V0X3NhbXBsZSgoYXdlX3ZvaWNlX2xpc3QqKWFwKSA9PSAwKQorCQkJcmV0dXJuOworCX0KKwkKKwlpZiAoY3RybHNbQVdFX01EX05FV19WT0xVTUVfQ0FMQ10pIHsKKwkJaW50IG1haW5fdm9sID0gY3AtPm1haW5fdm9sICogYXAtPmFtcGxpdHVkZSAvIDEyNzsKKwkJbGltaXR2YWx1ZSh2cC0+dmVsb2NpdHksIDAsIDEyNyk7CisJCWxpbWl0dmFsdWUobWFpbl92b2wsIDAsIDEyNyk7CisJCWxpbWl0dmFsdWUoY3AtPmV4cHJlc3Npb25fdm9sLCAwLCAxMjcpOworCisJCXZvbCA9IHZvbHRhYjFbbWFpbl92b2xdICsgdm9sdGFiMlt2cC0+dmVsb2NpdHldOworCQl2b2wgPSAodm9sICogOCkgLyAzOworCQl2b2wgKz0gYXAtPmF0dGVudWF0aW9uOworCQlpZiAoY3AtPmV4cHJlc3Npb25fdm9sIDwgMTI3KQorCQkJdm9sICs9ICgoMHgxMDAgLSB2b2wpICogZXhwcmVzc2lvbnRhYltjcC0+ZXhwcmVzc2lvbl92b2xdKS8xMjg7CisJCXZvbCArPSBhdHRlbl9vZmZzZXQ7CisJCWlmIChhdHRlbl9yZWxhdGl2ZSkKKwkJCXZvbCArPSBjdHJsc1tBV0VfTURfWkVST19BVFRFTl07CisJCWxpbWl0dmFsdWUodm9sLCAwLCAyNTUpOworCQl2cC0+YXZvbCA9IHZvbDsKKwkJCisJfSBlbHNlIHsKKwkJLyogMCAtIDEyNyAqLworCQl2b2wgPSAodnAtPnZlbG9jaXR5ICogY3AtPm1haW5fdm9sICogY3AtPmV4cHJlc3Npb25fdm9sKSAvICgxMjcqMTI3KTsKKwkJdm9sID0gdm9sICogYXAtPmFtcGxpdHVkZSAvIDEyNzsKKworCQlpZiAodm9sIDwgMCkgdm9sID0gMDsKKwkJaWYgKHZvbCA+IDEyNykgdm9sID0gMTI3OworCisJCS8qIGNhbGMgdG8gYXR0ZW51YXRpb24gKi8KKwkJdm9sID0gdm9sX3RhYmxlW3ZvbF07CisJCXZvbCArPSAoaW50KWFwLT5hdHRlbnVhdGlvbjsKKwkJdm9sICs9IGF0dGVuX29mZnNldDsKKwkJaWYgKGF0dGVuX3JlbGF0aXZlKQorCQkJdm9sICs9IGN0cmxzW0FXRV9NRF9aRVJPX0FUVEVOXTsKKwkJaWYgKHZvbCA+IDI1NSkgdm9sID0gMjU1OworCisJCXZwLT5hdm9sID0gdm9sOworCX0KKwlpZiAoY3AtPmJhbmsgIT0gIEFXRV9EUlVNX0JBTksgJiYgKChhd2Vfdm9pY2VfcGFybV9ibG9jayopKCZhcC0+cGFybSkpLT52b2xhdGsgPCAweDdkKSB7CisJCWludCBhdHRlbjsKKwkJaWYgKHZwLT52ZWxvY2l0eSA8IDcwKSBhdHRlbiA9IDcwOworCQllbHNlIGF0dGVuID0gdnAtPnZlbG9jaXR5OworCQl2cC0+YWN1dG9mZiA9IChhdHRlbiAqIGFwLT5wYXJtLmN1dG9mZiArIDB4YTApID4+IDc7CisJfSBlbHNlIHsKKwkJdnAtPmFjdXRvZmYgPSBhcC0+cGFybS5jdXRvZmY7CisJfQorCURFQlVHKDMscHJpbnRrKCJBV0UzMjogWy0tIHZvaWNlKCVkKSB2b2w9JXhdXG4iLCB2b2ljZSwgdm9sKSk7Cit9CisKKy8qIGNoYW5nZSBtYXN0ZXIgdm9sdW1lICovCitzdGF0aWMgdm9pZAorYXdlX2NoYW5nZV9tYXN0ZXJfdm9sdW1lKHNob3J0IHZhbCkKK3sKKwlsaW1pdHZhbHVlKHZhbCwgMCwgMTI3KTsKKwlhdHRlbl9vZmZzZXQgPSB2b2xfdGFibGVbdmFsXTsKKwlhdHRlbl9yZWxhdGl2ZSA9IFRSVUU7CisJYXdlX3VwZGF0ZV92b2x1bWUoKTsKK30KKworLyogdXBkYXRlIHZvbHVtZXMgb2YgYWxsIGF2YWlsYWJsZSBjaGFubmVscyAqLworc3RhdGljIHZvaWQgYXdlX3VwZGF0ZV92b2x1bWUodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYXdlX21heF92b2ljZXM7IGkrKykKKwkJYXdlX3NldF92b2ljZV92b2woaSwgVFJVRSk7Cit9CisKKy8qIHNldCBzb3N0ZW51dG8gb24gKi8KK3N0YXRpYyB2b2lkIGF3ZV9zb3N0ZW51dG9fb24oaW50IHZvaWNlLCBpbnQgZm9yY2VkKQoreworCWlmIChJU19OT19FRkZFQ1Qodm9pY2UpICYmICFmb3JjZWQpIHJldHVybjsKKwl2b2ljZXNbdm9pY2VdLnNvc3RlbnV0byA9IDEyNzsKK30KKworCisvKiBkcm9wIHN1c3RhaW4gKi8KK3N0YXRpYyB2b2lkIGF3ZV9zdXN0YWluX29mZihpbnQgdm9pY2UsIGludCBmb3JjZWQpCit7CisJaWYgKHZvaWNlc1t2b2ljZV0uc3RhdGUgPT0gQVdFX1NUX1NVU1RBSU5FRCkgeworCQlhd2Vfbm90ZV9vZmYodm9pY2UpOworCQlhd2VfZnhfaW5pdCh2b2ljZXNbdm9pY2VdLmNoKTsKKwkJYXdlX3ZvaWNlX2luaXQodm9pY2UsIEZBTFNFKTsKKwl9Cit9CisKKworLyogdGVybWluYXRlIGFuZCBpbml0aWFsaXplIHZvaWNlICovCitzdGF0aWMgdm9pZCBhd2VfdGVybWluYXRlX2FuZF9pbml0KGludCB2b2ljZSwgaW50IGZvcmNlZCkKK3sKKwlhd2VfdGVybWluYXRlKHZvaWNlKTsKKwlhd2VfZnhfaW5pdCh2b2ljZXNbdm9pY2VdLmNoKTsKKwlhd2Vfdm9pY2VfaW5pdCh2b2ljZSwgVFJVRSk7Cit9CisKKworLyoKKyAqIHN5bnRoIG9wZXJhdGlvbiByb3V0aW5lcworICovCisKKyNkZWZpbmUgQVdFX1ZPSUNFX0tFWSh2KQkoMHg4MDAwIHwgKHYpKQorI2RlZmluZSBBV0VfQ0hBTl9LRVkoYyxuKQkoKChjKSA8PCA4KSB8ICgobikgKyAxKSkKKyNkZWZpbmUgS0VZX0NIQU5fTUFUQ0goa2V5LGMpCSgoKGtleSkgPj4gOCkgPT0gKGMpKQorCisvKiBpbml0aWFsaXplIHRoZSB2b2ljZSAqLworc3RhdGljIHZvaWQKK2F3ZV92b2ljZV9pbml0KGludCB2b2ljZSwgaW50IGluaXRfYWxsKQoreworCXZvaWNlX2luZm8gKnZwID0gJnZvaWNlc1t2b2ljZV07CisKKwkvKiByZXNldCB2b2ljZSBzZWFyY2gga2V5ICovCisJaWYgKHBsYXlpbmdfbW9kZSA9PSBBV0VfUExBWV9ESVJFQ1QpCisJCXZwLT5rZXkgPSBBV0VfVk9JQ0VfS0VZKHZvaWNlKTsKKwllbHNlCisJCXZwLT5rZXkgPSAwOworCisJLyogY2xlYXIgdm9pY2UgbWFwcGluZyAqLworCXZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdID0gMDsKKworCS8qIHRvdWNoIHRoZSB0aW1pbmcgZmxhZyAqLworCXZwLT50aW1lID0gY3VycmVudF9hbGxvY190aW1lOworCisJLyogaW5pdGlhbGl6ZSBvdGhlciBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeSAqLworCWlmIChpbml0X2FsbCkgeworCQl2cC0+bm90ZSA9IC0xOworCQl2cC0+dmVsb2NpdHkgPSAwOworCQl2cC0+c29zdGVudXRvID0gMDsKKworCQl2cC0+c2FtcGxlID0gTlVMTDsKKwkJdnAtPmNpbmZvID0gJmNoYW5uZWxzW3ZvaWNlXTsKKwkJdnAtPmNoID0gdm9pY2U7CisJCXZwLT5zdGF0ZSA9IEFXRV9TVF9PRkY7CisKKwkJLyogZW11ODAwMCBwYXJhbWV0ZXJzICovCisJCXZwLT5hcGl0Y2ggPSAwOworCQl2cC0+YXZvbCA9IDI1NTsKKwkJdnAtPmFwYW4gPSAtMTsKKwl9Cit9CisKKy8qIGNsZWFyIGVmZmVjdHMgKi8KK3N0YXRpYyB2b2lkIGF3ZV9meF9pbml0KGludCBjaCkKK3sKKwlpZiAoU0lOR0xFX0xBWUVSX01PREUoKSAmJiAhY3RybHNbQVdFX01EX0tFRVBfRUZGRUNUXSkgeworCQltZW1zZXQoJmNoYW5uZWxzW2NoXS5meCwgMCwgc2l6ZW9mKGNoYW5uZWxzW2NoXS5meCkpOworCQltZW1zZXQoJmNoYW5uZWxzW2NoXS5meF9sYXllciwgMCwgc2l6ZW9mKCZjaGFubmVsc1tjaF0uZnhfbGF5ZXIpKTsKKwl9Cit9CisKKy8qIGluaXRpYWxpemUgY2hhbm5lbCBpbmZvICovCitzdGF0aWMgdm9pZCBhd2VfY2hhbm5lbF9pbml0KGludCBjaCwgaW50IGluaXRfYWxsKQoreworCWF3ZV9jaGFuX2luZm8gKmNwID0gJmNoYW5uZWxzW2NoXTsKKwljcC0+Y2hhbm5lbCA9IGNoOworCWlmIChpbml0X2FsbCkgeworCQljcC0+cGFubmluZyA9IDA7IC8qIHplcm8gY2VudGVyICovCisJCWNwLT5iZW5kZXJfcmFuZ2UgPSAyMDA7IC8qIHNlbnNlICogMTAwICovCisJCWNwLT5tYWluX3ZvbCA9IDEyNzsKKwkJaWYgKE1VTFRJX0xBWUVSX01PREUoKSAmJiBJU19EUlVNX0NIQU5ORUwoY2gpKSB7CisJCQljcC0+aW5zdHIgPSBjdHJsc1tBV0VfTURfREVGX0RSVU1dOworCQkJY3AtPmJhbmsgPSBBV0VfRFJVTV9CQU5LOworCQl9IGVsc2UgeworCQkJY3AtPmluc3RyID0gY3RybHNbQVdFX01EX0RFRl9QUkVTRVRdOworCQkJY3AtPmJhbmsgPSBjdHJsc1tBV0VfTURfREVGX0JBTktdOworCQl9CisJfQorCisJY3AtPmJlbmRlciA9IDA7IC8qIHplcm8gdHVuZSBza2V3ICovCisJY3AtPmV4cHJlc3Npb25fdm9sID0gMTI3OworCWNwLT5jaGFuX3ByZXNzID0gMDsKKwljcC0+c3VzdGFpbmVkID0gMDsKKworCWlmICghIGN0cmxzW0FXRV9NRF9LRUVQX0VGRkVDVF0pIHsKKwkJbWVtc2V0KCZjcC0+ZngsIDAsIHNpemVvZihjcC0+ZngpKTsKKwkJbWVtc2V0KCZjcC0+ZnhfbGF5ZXIsIDAsIHNpemVvZihjcC0+ZnhfbGF5ZXIpKTsKKwl9Cit9CisKKworLyogY2hhbmdlIHRoZSB2b2ljZSBwYXJhbWV0ZXJzOyB2b2ljZSA9IGNoYW5uZWwgKi8KK3N0YXRpYyB2b2lkIGF3ZV92b2ljZV9jaGFuZ2UoaW50IHZvaWNlLCBmeF9hZmZlY3RfZnVuYyBmdW5jKQoreworCWludCBpOyAKKwlzd2l0Y2ggKHBsYXlpbmdfbW9kZSkgeworCWNhc2UgQVdFX1BMQVlfRElSRUNUOgorCQlmdW5jKHZvaWNlLCBGQUxTRSk7CisJCWJyZWFrOworCWNhc2UgQVdFX1BMQVlfSU5ESVJFQ1Q6CisJCWZvciAoaSA9IDA7IGkgPCBhd2VfbWF4X3ZvaWNlczsgaSsrKQorCQkJaWYgKHZvaWNlc1tpXS5rZXkgPT0gQVdFX1ZPSUNFX0tFWSh2b2ljZSkpCisJCQkJZnVuYyhpLCBGQUxTRSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZvciAoaSA9IDA7IGkgPCBhd2VfbWF4X3ZvaWNlczsgaSsrKQorCQkJaWYgKEtFWV9DSEFOX01BVENIKHZvaWNlc1tpXS5rZXksIHZvaWNlKSkKKwkJCQlmdW5jKGksIEZBTFNFKTsKKwkJYnJlYWs7CisJfQorfQorCisKKy8qCisgKiBkZXZpY2Ugb3BlbiAvIGNsb3NlCisgKi8KKworLyogb3BlbiBkZXZpY2U6CisgKiAgIHJlc2V0IHN0YXR1cyBvZiBhbGwgdm9pY2VzLCBhbmQgY2xlYXIgc2FtcGxlIHBvc2l0aW9uIGZsYWcKKyAqLworc3RhdGljIGludAorYXdlX29wZW4oaW50IGRldiwgaW50IG1vZGUpCit7CisJaWYgKGF3ZV9idXN5KQorCQlyZXR1cm4gLUVCVVNZOworCisJYXdlX2J1c3kgPSBUUlVFOworCisJLyogc2V0IGRlZmF1bHQgbW9kZSAqLworCWF3ZV9pbml0X2N0cmxfcGFybXMoRkFMU0UpOworCWF0dGVuX3JlbGF0aXZlID0gVFJVRTsKKwlhdHRlbl9vZmZzZXQgPSAwOworCWRydW1fZmxhZ3MgPSBERUZBVUxUX0RSVU1fRkxBR1M7CisJcGxheWluZ19tb2RlID0gQVdFX1BMQVlfSU5ESVJFQ1Q7CisKKwkvKiByZXNldCB2b2ljZXMgJiBjaGFubmVscyAqLworCWF3ZV9yZXNldChkZXYpOworCisJcGF0Y2hfb3BlbmVkID0gMDsKKworCXJldHVybiAwOworfQorCisKKy8qIGNsb3NlIGRldmljZToKKyAqICAgcmVzZXQgYWxsIHZvaWNlcyBhZ2FpbiAodGVybWluYXRlIHNvdW5kcykKKyAqLworc3RhdGljIHZvaWQKK2F3ZV9jbG9zZShpbnQgZGV2KQoreworCWF3ZV9yZXNldChkZXYpOworCWF3ZV9idXN5ID0gRkFMU0U7Cit9CisKKworLyogc2V0IG1pc2NlbGxhbmVvdXMgbW9kZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyB2b2lkCithd2VfaW5pdF9jdHJsX3Bhcm1zKGludCBpbml0X2FsbCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVdFX01EX0VORDsgaSsrKSB7CisJCWlmIChpbml0X2FsbCB8fCBjdHJsX3Bhcm1zW2ldLmluaXRfZWFjaF90aW1lKQorCQkJY3RybHNbaV0gPSBjdHJsX3Bhcm1zW2ldLnZhbHVlOworCX0KK30KKworCisvKiBzZXF1ZW5jZXIgSS9PIGNvbnRyb2w6CisgKi8KK3N0YXRpYyBpbnQKK2F3ZV9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRDVExfU1lOVEhfSU5GTzoKKwkJaWYgKHBsYXlpbmdfbW9kZSA9PSBBV0VfUExBWV9ESVJFQ1QpCisJCQlhd2VfaW5mby5ucl92b2ljZXMgPSBhd2VfbWF4X3ZvaWNlczsKKwkJZWxzZQorCQkJYXdlX2luZm8ubnJfdm9pY2VzID0gQVdFX01BWF9DSEFOTkVMUzsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZhd2VfaW5mbywgc2l6ZW9mKGF3ZV9pbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfU0VRX1JFU0VUU0FNUExFUzoKKwkJYXdlX3Jlc2V0KGRldik7CisJCWF3ZV9yZXNldF9zYW1wbGVzKCk7CisJCXJldHVybiAwOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX1NFUV9QRVJDTU9ERToKKwkJLyogd2hhdCdzIHRoaXM/ICovCisJCXJldHVybiAwOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX1NZTlRIX01FTUFWTDoKKwkJcmV0dXJuIG1lbXNpemUgLSBhd2VfZnJlZV9tZW1fcHRyKCkgKiAyOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyOiB1bnN1cHBvcnRlZCBpb2N0bCAlZFxuIiwgY21kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCX0KK30KKworCitzdGF0aWMgaW50IHZvaWNlX2luX3JhbmdlKGludCB2b2ljZSkKK3sKKwlpZiAocGxheWluZ19tb2RlID09IEFXRV9QTEFZX0RJUkVDVCkgeworCQlpZiAodm9pY2UgPCAwIHx8IHZvaWNlID49IGF3ZV9tYXhfdm9pY2VzKQorCQkJcmV0dXJuIEZBTFNFOworCX0gZWxzZSB7CisJCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gQVdFX01BWF9DSEFOTkVMUykKKwkJCXJldHVybiBGQUxTRTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2Vfdm9pY2UoaW50IHZvaWNlLCBpbnQgZG9fc3VzdGFpbikKK3sKKwlpZiAoSVNfTk9fU09VTkQodm9pY2UpKQorCQlyZXR1cm47CisJaWYgKGRvX3N1c3RhaW4gJiYgKHZvaWNlc1t2b2ljZV0uY2luZm8tPnN1c3RhaW5lZCA9PSAxMjcgfHwKKwkJCSAgICB2b2ljZXNbdm9pY2VdLnNvc3RlbnV0byA9PSAxMjcpKQorCQl2b2ljZXNbdm9pY2VdLnN0YXRlID0gQVdFX1NUX1NVU1RBSU5FRDsKKwllbHNlIHsKKwkJYXdlX25vdGVfb2ZmKHZvaWNlKTsKKwkJYXdlX2Z4X2luaXQodm9pY2VzW3ZvaWNlXS5jaCk7CisJCWF3ZV92b2ljZV9pbml0KHZvaWNlLCBGQUxTRSk7CisJfQorfQorCisvKiByZWxlYXNlIGFsbCBub3RlcyAqLworc3RhdGljIHZvaWQgYXdlX25vdGVfb2ZmX2FsbChpbnQgZG9fc3VzdGFpbikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYXdlX21heF92b2ljZXM7IGkrKykKKwkJcmVsZWFzZV92b2ljZShpLCBkb19zdXN0YWluKTsKK30KKworLyoga2lsbCBhIHZvaWNlOgorICogICBub3QgdGVybWluYXRlLCBqdXN0IHJlbGVhc2UgdGhlIHZvaWNlLgorICovCitzdGF0aWMgaW50Cithd2Vfa2lsbF9ub3RlKGludCBkZXYsIGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSkKK3sKKwlpbnQgaSwgdjIsIGtleTsKKworCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW29mZiglZCkgbnQ9JWQgdmw9JWRdXG4iLCB2b2ljZSwgbm90ZSwgdmVsb2NpdHkpKTsKKwlpZiAoISB2b2ljZV9pbl9yYW5nZSh2b2ljZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChwbGF5aW5nX21vZGUpIHsKKwljYXNlIEFXRV9QTEFZX0RJUkVDVDoKKwljYXNlIEFXRV9QTEFZX0lORElSRUNUOgorCQlrZXkgPSBBV0VfVk9JQ0VfS0VZKHZvaWNlKTsKKwkJYnJlYWs7CisKKwljYXNlIEFXRV9QTEFZX01VTFRJMjoKKwkJdjIgPSB2b2ljZV9hbGxvYy0+bWFwW3ZvaWNlXSA+PiA4OworCQl2b2ljZV9hbGxvYy0+bWFwW3ZvaWNlXSA9IDA7CisJCXZvaWNlID0gdjI7CisJCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gQVdFX01BWF9DSEFOTkVMUykKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKiBjb250aW51ZSB0byBiZWxvdyAqLworCWRlZmF1bHQ6CisJCWtleSA9IEFXRV9DSEFOX0tFWSh2b2ljZSwgbm90ZSk7CisJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBhd2VfbWF4X3ZvaWNlczsgaSsrKSB7CisJCWlmICh2b2ljZXNbaV0ua2V5ID09IGtleSkKKwkJCXJlbGVhc2Vfdm9pY2UoaSwgVFJVRSk7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0X29yX3ZvbHVtZV9jaGFuZ2UoaW50IHZvaWNlLCBpbnQgdmVsb2NpdHkpCit7CisJdm9pY2VzW3ZvaWNlXS52ZWxvY2l0eSA9IHZlbG9jaXR5OworCWF3ZV9jYWxjX3ZvbHVtZSh2b2ljZSk7CisJaWYgKHZvaWNlc1t2b2ljZV0uc3RhdGUgPT0gQVdFX1NUX1NUQU5EQlkpCisJCWF3ZV9ub3RlX29uKHZvaWNlKTsKKwllbHNlIGlmICh2b2ljZXNbdm9pY2VdLnN0YXRlID09IEFXRV9TVF9PTikKKwkJYXdlX3NldF92b2x1bWUodm9pY2UsIEZBTFNFKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2FuZF9zdGFydF92b2ljZShpbnQgdm9pY2UsIGludCBzdGF0ZSkKK3sKKwkvKiBjYWxjdWxhdGUgcGl0Y2ggJiB2b2x1bWUgcGFyYW1ldGVycyAqLworCXZvaWNlc1t2b2ljZV0uc3RhdGUgPSBzdGF0ZTsKKwlhd2VfY2FsY19waXRjaCh2b2ljZSk7CisJYXdlX2NhbGNfdm9sdW1lKHZvaWNlKTsKKwlpZiAoc3RhdGUgPT0gQVdFX1NUX09OKQorCQlhd2Vfbm90ZV9vbih2b2ljZSk7Cit9CisKKy8qIHN0YXJ0IGEgdm9pY2U6CisgKiAgIGlmIG5vdGUgaXMgMjU1LCBpZGVudGljYWwgd2l0aCBhZnRlcnRvdWNoIGZ1bmN0aW9uLgorICogICBPdGhlcndpc2UsIHN0YXJ0IGEgdm9pY2Ugd2l0aCBzcGVjaWZpZWQgbm90IGFuZCB2b2x1bWUuCisgKi8KK3N0YXRpYyBpbnQKK2F3ZV9zdGFydF9ub3RlKGludCBkZXYsIGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSkKK3sKKwlpbnQgaSwga2V5LCBzdGF0ZSwgdm9sb25seTsKKworCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW29uKCVkKSBudD0lZCB2bD0lZF1cbiIsIHZvaWNlLCBub3RlLCB2ZWxvY2l0eSkpOworCWlmICghIHZvaWNlX2luX3JhbmdlKHZvaWNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJICAgIAorCWlmICh2ZWxvY2l0eSA9PSAwKQorCQlzdGF0ZSA9IEFXRV9TVF9TVEFOREJZOyAvKiBzdGFuZCBieSBmb3IgcGxheWluZyAqLworCWVsc2UKKwkJc3RhdGUgPSBBV0VfU1RfT047CS8qIHJlYWxseSBwbGF5ICovCisJdm9sb25seSA9IEZBTFNFOworCisJc3dpdGNoIChwbGF5aW5nX21vZGUpIHsKKwljYXNlIEFXRV9QTEFZX0RJUkVDVDoKKwljYXNlIEFXRV9QTEFZX0lORElSRUNUOgorCQlrZXkgPSBBV0VfVk9JQ0VfS0VZKHZvaWNlKTsKKwkJaWYgKG5vdGUgPT0gMjU1KQorCQkJdm9sb25seSA9IFRSVUU7CisJCWJyZWFrOworCisJY2FzZSBBV0VfUExBWV9NVUxUSTI6CisJCXZvaWNlID0gdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPj4gODsKKwkJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBBV0VfTUFYX0NIQU5ORUxTKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCS8qIGNvbnRpbnVlIHRvIGJlbG93ICovCisJZGVmYXVsdDoKKwkJaWYgKG5vdGUgPj0gMTI4KSB7IC8qIGtleSB2b2x1bWUgbW9kZSAqLworCQkJbm90ZSAtPSAxMjg7CisJCQl2b2xvbmx5ID0gVFJVRTsKKwkJfQorCQlrZXkgPSBBV0VfQ0hBTl9LRVkodm9pY2UsIG5vdGUpOworCQlicmVhazsKKwl9CisKKwkvKiBkeW5hbWljIHZvbHVtZSBjaGFuZ2UgKi8KKwlpZiAodm9sb25seSkgeworCQlmb3IgKGkgPSAwOyBpIDwgYXdlX21heF92b2ljZXM7IGkrKykgeworCQkJaWYgKHZvaWNlc1tpXS5rZXkgPT0ga2V5KQorCQkJCXN0YXJ0X29yX3ZvbHVtZV9jaGFuZ2UoaSwgdmVsb2NpdHkpOworCQl9CisJCXJldHVybiAwOworCX0KKworCS8qIGlmIHRoZSBzYW1lIG5vdGUgc3RpbGwgcGxheWluZywgc3RvcCBpdCAqLworCWlmIChwbGF5aW5nX21vZGUgIT0gQVdFX1BMQVlfRElSRUNUIHx8IGN0cmxzW0FXRV9NRF9FWENMVVNJVkVfU09VTkRdKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhd2VfbWF4X3ZvaWNlczsgaSsrKQorCQkJaWYgKHZvaWNlc1tpXS5rZXkgPT0ga2V5KSB7CisJCQkJaWYgKHZvaWNlc1tpXS5zdGF0ZSA9PSBBV0VfU1RfT04pIHsKKwkJCQkJYXdlX25vdGVfb2ZmKGkpOworCQkJCQlhd2Vfdm9pY2VfaW5pdChpLCBGQUxTRSk7CisJCQkJfSBlbHNlIGlmICh2b2ljZXNbaV0uc3RhdGUgPT0gQVdFX1NUX1NUQU5EQlkpCisJCQkJCWF3ZV92b2ljZV9pbml0KGksIFRSVUUpOworCQkJfQorCX0KKworCS8qIGFsbG9jYXRlIHZvaWNlcyAqLworCWlmIChwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfRElSRUNUKQorCQlhd2VfYWxsb2Nfb25lX3ZvaWNlKHZvaWNlLCBub3RlLCB2ZWxvY2l0eSk7CisJZWxzZQorCQlhd2VfYWxsb2NfbXVsdGlfdm9pY2VzKHZvaWNlLCBub3RlLCB2ZWxvY2l0eSwga2V5KTsKKworCS8qIHR1cm4gb2ZmIG90aGVyIHZvaWNlcyBleGx1c2l2ZWx5IChmb3IgZHJ1bXMpICovCisJZm9yIChpID0gMDsgaSA8IGF3ZV9tYXhfdm9pY2VzOyBpKyspCisJCWlmICh2b2ljZXNbaV0ua2V5ID09IGtleSkKKwkJCWF3ZV9leGNsdXNpdmVfb2ZmKGkpOworCisJLyogc2V0IHVwIHBpdGNoIGFuZCB2b2x1bWUgcGFyYW1ldGVycyAqLworCWZvciAoaSA9IDA7IGkgPCBhd2VfbWF4X3ZvaWNlczsgaSsrKSB7CisJCWlmICh2b2ljZXNbaV0ua2V5ID09IGtleSAmJiB2b2ljZXNbaV0uc3RhdGUgPT0gQVdFX1NUX09GRikKKwkJCXNldF9hbmRfc3RhcnRfdm9pY2UoaSwgc3RhdGUpOworCX0KKworCXJldHVybiAwOworfQorCisKKy8qIGNhbGN1bGF0ZSBoYXNoIGtleSAqLworc3RhdGljIGludAorYXdlX3NlYXJjaF9rZXkoaW50IGJhbmssIGludCBwcmVzZXQsIGludCBub3RlKQoreworCXVuc2lnbmVkIGludCBrZXk7CisKKyNpZiAxIC8qIG5ldyBoYXNoIHRhYmxlICovCisJaWYgKGJhbmsgPT0gQVdFX0RSVU1fQkFOSykKKwkJa2V5ID0gcHJlc2V0ICsgbm90ZSArIDEyODsKKwllbHNlCisJCWtleSA9IGJhbmsgKyBwcmVzZXQ7CisjZWxzZQorCWtleSA9IHByZXNldDsKKyNlbmRpZgorCWtleSAlPSBBV0VfTUFYX1BSRVNFVFM7CisKKwlyZXR1cm4gKGludClrZXk7Cit9CisKKworLyogc2VhcmNoIGluc3RydW1lbnQgZnJvbSBoYXNoIHRhYmxlICovCitzdGF0aWMgYXdlX3ZvaWNlX2xpc3QgKgorYXdlX3NlYXJjaF9pbnN0cihpbnQgYmFuaywgaW50IHByZXNldCwgaW50IG5vdGUpCit7CisJYXdlX3ZvaWNlX2xpc3QgKnA7CisJaW50IGtleSwga2V5MjsKKworCWtleSA9IGF3ZV9zZWFyY2hfa2V5KGJhbmssIHByZXNldCwgbm90ZSk7CisJZm9yIChwID0gcHJlc2V0X3RhYmxlW2tleV07IHA7IHAgPSBwLT5uZXh0X2JhbmspIHsKKwkJaWYgKHAtPmluc3RyID09IHByZXNldCAmJiBwLT5iYW5rID09IGJhbmspCisJCQlyZXR1cm4gcDsKKwl9CisJa2V5MiA9IGF3ZV9zZWFyY2hfa2V5KGJhbmssIHByZXNldCwgMCk7IC8qIHNlYXJjaCBkZWZhdWx0ICovCisJaWYgKGtleSA9PSBrZXkyKQorCQlyZXR1cm4gTlVMTDsKKwlmb3IgKHAgPSBwcmVzZXRfdGFibGVba2V5Ml07IHA7IHAgPSBwLT5uZXh0X2JhbmspIHsKKwkJaWYgKHAtPmluc3RyID09IHByZXNldCAmJiBwLT5iYW5rID09IGJhbmspCisJCQlyZXR1cm4gcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworLyogYXNzaWduIHRoZSBpbnN0cnVtZW50IHRvIGEgdm9pY2UgKi8KK3N0YXRpYyBpbnQKK2F3ZV9zZXRfaW5zdHJfMihpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBpbnN0cl9ubykKK3sKKwlpZiAocGxheWluZ19tb2RlID09IEFXRV9QTEFZX01VTFRJMikgeworCQl2b2ljZSA9IHZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdID4+IDg7CisJCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gQVdFX01BWF9DSEFOTkVMUykKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gYXdlX3NldF9pbnN0cihkZXYsIHZvaWNlLCBpbnN0cl9ubyk7Cit9CisKKy8qIGFzc2lnbiB0aGUgaW5zdHJ1bWVudCB0byBhIGNoYW5uZWw7IHZvaWNlIGlzIHRoZSBjaGFubmVsIG51bWJlciAqLworc3RhdGljIGludAorYXdlX3NldF9pbnN0cihpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBpbnN0cl9ubykKK3sKKwlhd2VfY2hhbl9pbmZvICpjaW5mbzsKKworCWlmICghIHZvaWNlX2luX3JhbmdlKHZvaWNlKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoaW5zdHJfbm8gPCAwIHx8IGluc3RyX25vID49IEFXRV9NQVhfUFJFU0VUUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljaW5mbyA9ICZjaGFubmVsc1t2b2ljZV07CisJY2luZm8tPmluc3RyID0gaW5zdHJfbm87CisJREVCVUcoMixwcmludGsoIkFXRTMyOiBbcHJvZ3JhbSglZCkgJWRdXG4iLCB2b2ljZSwgaW5zdHJfbm8pKTsKKworCXJldHVybiAwOworfQorCisKKy8qIHJlc2V0IGFsbCB2b2ljZXM7IHRlcm1pbmF0ZSBzb3VuZHMgYW5kIGluaXRpYWxpemUgcGFyYW1ldGVycyAqLworc3RhdGljIHZvaWQKK2F3ZV9yZXNldChpbnQgZGV2KQoreworCWludCBpOworCWN1cnJlbnRfYWxsb2NfdGltZSA9IDA7CisJLyogZG9uJ3QgdHVybiBvZmYgdm9pY2UgMzEgYW5kIDMyLiAgdGhleSBhcmUgdXNlZCBhbHNvIGZvciBGTSB2b2ljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYXdlX21heF92b2ljZXM7IGkrKykgeworCQlhd2VfdGVybWluYXRlKGkpOworCQlhd2Vfdm9pY2VfaW5pdChpLCBUUlVFKTsKKwl9CisJZm9yIChpID0gMDsgaSA8IEFXRV9NQVhfQ0hBTk5FTFM7IGkrKykKKwkJYXdlX2NoYW5uZWxfaW5pdChpLCBUUlVFKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQlhd2Vfb3BlcmF0aW9ucy5jaG5faW5mb1tpXS5jb250cm9sbGVyc1tDVExfTUFJTl9WT0xVTUVdID0gMTI3OworCQlhd2Vfb3BlcmF0aW9ucy5jaG5faW5mb1tpXS5jb250cm9sbGVyc1tDVExfRVhQUkVTU0lPTl0gPSAxMjc7CisJfQorCWF3ZV9pbml0X2ZtKCk7CisJYXdlX3R3ZWFrKCk7Cit9CisKKworLyogaGFyZHdhcmUgc3BlY2lmaWMgY29udHJvbDoKKyAqICAgR1VTIHNwZWNpZmljIGFuZCBBV0UzMiBzcGVjaWZpYyBjb250cm9scyBhcmUgYXZhaWxhYmxlLgorICovCitzdGF0aWMgdm9pZAorYXdlX2h3X2NvbnRyb2woaW50IGRldiwgdW5zaWduZWQgY2hhciAqZXZlbnQpCit7CisJaW50IGNtZCA9IGV2ZW50WzJdOworCWlmIChjbWQgJiBfQVdFX01PREVfRkxBRykKKwkJYXdlX2h3X2F3ZV9jb250cm9sKGRldiwgY21kICYgX0FXRV9NT0RFX1ZBTFVFX01BU0ssIGV2ZW50KTsKKyNpZmRlZiBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCisJZWxzZQorCQlhd2VfaHdfZ3VzX2NvbnRyb2woZGV2LCBjbWQgJiBfQVdFX01PREVfVkFMVUVfTUFTSywgZXZlbnQpOworI2VuZGlmCit9CisKKworI2lmZGVmIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkKKworLyogR1VTIGNvbXBhdGlibGUgY29udHJvbHMgKi8KK3N0YXRpYyB2b2lkCithd2VfaHdfZ3VzX2NvbnRyb2woaW50IGRldiwgaW50IGNtZCwgdW5zaWduZWQgY2hhciAqZXZlbnQpCit7CisJaW50IHZvaWNlLCBpLCBrZXk7CisJdW5zaWduZWQgc2hvcnQgcDE7CisJc2hvcnQgcDI7CisJaW50IHBsb25nOworCisJaWYgKE1VTFRJX0xBWUVSX01PREUoKSkKKwkJcmV0dXJuOworCWlmIChjbWQgPT0gX0dVU19OVU1WT0lDRVMpCisJCXJldHVybjsKKworCXZvaWNlID0gZXZlbnRbM107CisJaWYgKCEgdm9pY2VfaW5fcmFuZ2Uodm9pY2UpKQorCQlyZXR1cm47CisKKwlwMSA9ICoodW5zaWduZWQgc2hvcnQgKikgJmV2ZW50WzRdOworCXAyID0gKihzaG9ydCAqKSAmZXZlbnRbNl07CisJcGxvbmcgPSAqKGludCopICZldmVudFs0XTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBfR1VTX1ZPSUNFU0FNUExFOgorCQlhd2Vfc2V0X2luc3RyKGRldiwgdm9pY2UsIHAxKTsKKwkJcmV0dXJuOworCisJY2FzZSBfR1VTX1ZPSUNFQkFMQToKKwkJLyogMCB0byAxNSAtLT4gLTEyOCB0byAxMjcgKi8KKwkJYXdlX3Bhbm5pbmcoZGV2LCB2b2ljZSwgKChpbnQpcDEgPDwgNCkgLSAxMjgpOworCQlyZXR1cm47CisKKwljYXNlIF9HVVNfVk9JQ0VWT0w6CisJY2FzZSBfR1VTX1ZPSUNFVk9MMjoKKwkJLyogbm90IHN1cHBvcnRlZCB5ZXQgKi8KKwkJcmV0dXJuOworCisJY2FzZSBfR1VTX1JBTVBSQU5HRToKKwljYXNlIF9HVVNfUkFNUFJBVEU6CisJY2FzZSBfR1VTX1JBTVBNT0RFOgorCWNhc2UgX0dVU19SQU1QT046CisJY2FzZSBfR1VTX1JBTVBPRkY6CisJCS8qIHZvbHVtZSByYW1waW5nIG5vdCBzdXBwb3J0ZWQgKi8KKwkJcmV0dXJuOworCisJY2FzZSBfR1VTX1ZPTFVNRV9TQ0FMRToKKwkJcmV0dXJuOworCisJY2FzZSBfR1VTX1ZPSUNFX1BPUzoKKwkJRlhfU0VUKCZjaGFubmVsc1t2b2ljZV0uZngsIEFXRV9GWF9TQU1QTEVfU1RBUlQsCisJCSAgICAgICAoc2hvcnQpKHBsb25nICYgMHg3ZmZmKSk7CisJCUZYX1NFVCgmY2hhbm5lbHNbdm9pY2VdLmZ4LCBBV0VfRlhfQ09BUlNFX1NBTVBMRV9TVEFSVCwKKwkJICAgICAgIChwbG9uZyA+PiAxNSkgJiAweGZmZmYpOworCQlyZXR1cm47CisJfQorCisJa2V5ID0gQVdFX1ZPSUNFX0tFWSh2b2ljZSk7CisJZm9yIChpID0gMDsgaSA8IGF3ZV9tYXhfdm9pY2VzOyBpKyspIHsKKwkJaWYgKHZvaWNlc1tpXS5rZXkgPT0ga2V5KSB7CisJCQlzd2l0Y2ggKGNtZCkgeworCQkJY2FzZSBfR1VTX1ZPSUNFT046CisJCQkJYXdlX25vdGVfb24oaSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgX0dVU19WT0lDRU9GRjoKKwkJCQlhd2VfdGVybWluYXRlKGkpOworCQkJCWF3ZV9meF9pbml0KHZvaWNlc1tpXS5jaCk7CisJCQkJYXdlX3ZvaWNlX2luaXQoaSwgVFJVRSk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgX0dVU19WT0lDRUZBREU6CisJCQkJYXdlX25vdGVfb2ZmKGkpOworCQkJCWF3ZV9meF9pbml0KHZvaWNlc1tpXS5jaCk7CisJCQkJYXdlX3ZvaWNlX2luaXQoaSwgRkFMU0UpOworCQkJCWJyZWFrOworCisJCQljYXNlIF9HVVNfVk9JQ0VGUkVROgorCQkJCWF3ZV9jYWxjX3BpdGNoX2Zyb21fZnJlcShpLCBwbG9uZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKyNlbmRpZiAvKiBndXNfY29tcGF0ICovCisKKworLyogQVdFMzIgc3BlY2lmaWMgY29udHJvbHMgKi8KK3N0YXRpYyB2b2lkCithd2VfaHdfYXdlX2NvbnRyb2woaW50IGRldiwgaW50IGNtZCwgdW5zaWduZWQgY2hhciAqZXZlbnQpCit7CisJaW50IHZvaWNlOworCXVuc2lnbmVkIHNob3J0IHAxOworCXNob3J0IHAyOworCWludCBpOworCisJdm9pY2UgPSBldmVudFszXTsKKwlpZiAoISB2b2ljZV9pbl9yYW5nZSh2b2ljZSkpCisJCXJldHVybjsKKworCWlmIChwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfTVVMVEkyKSB7CisJCXZvaWNlID0gdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPj4gODsKKwkJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBBV0VfTUFYX0NIQU5ORUxTKQorCQkJcmV0dXJuOworCX0KKworCXAxID0gKih1bnNpZ25lZCBzaG9ydCAqKSAmZXZlbnRbNF07CisJcDIgPSAqKHNob3J0ICopICZldmVudFs2XTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBfQVdFX0RFQlVHX01PREU6CisJCWN0cmxzW0FXRV9NRF9ERUJVR19NT0RFXSA9IHAxOworCQlwcmludGsoS0VSTl9ERUJVRyAiQVdFMzI6IGRlYnVnIG1vZGUgPSAlZFxuIiwgY3RybHNbQVdFX01EX0RFQlVHX01PREVdKTsKKwkJYnJlYWs7CisJY2FzZSBfQVdFX1JFVkVSQl9NT0RFOgorCQljdHJsc1tBV0VfTURfUkVWRVJCX01PREVdID0gcDE7CisJCWF3ZV91cGRhdGVfcmV2ZXJiX21vZGUoKTsKKwkJYnJlYWs7CisKKwljYXNlIF9BV0VfQ0hPUlVTX01PREU6CisJCWN0cmxzW0FXRV9NRF9DSE9SVVNfTU9ERV0gPSBwMTsKKwkJYXdlX3VwZGF0ZV9jaG9ydXNfbW9kZSgpOworCQlicmVhazsKKwkJICAgICAgCisJY2FzZSBfQVdFX1JFTU9WRV9MQVNUX1NBTVBMRVM6CisJCURFQlVHKDAscHJpbnRrKCJBV0UzMjogcmVtb3ZlIGxhc3Qgc2FtcGxlc1xuIikpOworCQlhd2VfcmVzZXQoMCk7CisJCWlmIChsb2NrZWRfc2ZfaWQgPiAwKQorCQkJYXdlX3JlbW92ZV9zYW1wbGVzKGxvY2tlZF9zZl9pZCk7CisJCWJyZWFrOworCisJY2FzZSBfQVdFX0lOSVRJQUxJWkVfQ0hJUDoKKwkJYXdlX2luaXRpYWxpemUoKTsKKwkJYnJlYWs7CisKKwljYXNlIF9BV0VfU0VORF9FRkZFQ1Q6CisJCWkgPSAtMTsKKwkJaWYgKHAxID49IDB4MTAwKSB7CisJCQlpID0gKHAxID4+IDgpOworCQkJaWYgKGkgPCAwIHx8IGkgPj0gTUFYX0xBWUVSUykKKwkJCQlicmVhazsKKwkJfQorCQlhd2Vfc2VuZF9lZmZlY3Qodm9pY2UsIGksIHAxLCBwMik7CisJCWJyZWFrOworCisJY2FzZSBfQVdFX1JFU0VUX0NIQU5ORUw6CisJCWF3ZV9jaGFubmVsX2luaXQodm9pY2UsICFwMSk7CisJCWJyZWFrOworCQkKKwljYXNlIF9BV0VfVEVSTUlOQVRFX0FMTDoKKwkJYXdlX3Jlc2V0KDApOworCQlicmVhazsKKworCWNhc2UgX0FXRV9URVJNSU5BVEVfQ0hBTk5FTDoKKwkJYXdlX3ZvaWNlX2NoYW5nZSh2b2ljZSwgYXdlX3Rlcm1pbmF0ZV9hbmRfaW5pdCk7CisJCWJyZWFrOworCisJY2FzZSBfQVdFX1JFTEVBU0VfQUxMOgorCQlhd2Vfbm90ZV9vZmZfYWxsKEZBTFNFKTsKKwkJYnJlYWs7CisJY2FzZSBfQVdFX05PVEVPRkZfQUxMOgorCQlhd2Vfbm90ZV9vZmZfYWxsKFRSVUUpOworCQlicmVhazsKKworCWNhc2UgX0FXRV9JTklUSUFMX1ZPTFVNRToKKwkJREVCVUcoMCxwcmludGsoIkFXRTMyOiBpbml0IGF0dGVudWF0aW9uICVkXG4iLCBwMSkpOworCQlhdHRlbl9yZWxhdGl2ZSA9IChjaGFyKXAyOworCQlhdHRlbl9vZmZzZXQgPSAoc2hvcnQpcDE7CisJCWF3ZV91cGRhdGVfdm9sdW1lKCk7CisJCWJyZWFrOworCisJY2FzZSBfQVdFX0NITl9QUkVTU1VSRToKKwkJY2hhbm5lbHNbdm9pY2VdLmNoYW5fcHJlc3MgPSBwMTsKKwkJYXdlX21vZHdoZWVsX2NoYW5nZSh2b2ljZSwgcDEpOworCQlicmVhazsKKworCWNhc2UgX0FXRV9DSEFOTkVMX01PREU6CisJCURFQlVHKDAscHJpbnRrKCJBV0UzMjogY2hhbm5lbCBtb2RlID0gJWRcbiIsIHAxKSk7CisJCXBsYXlpbmdfbW9kZSA9IHAxOworCQlhd2VfcmVzZXQoMCk7CisJCWJyZWFrOworCisJY2FzZSBfQVdFX0RSVU1fQ0hBTk5FTFM6CisJCURFQlVHKDAscHJpbnRrKCJBV0UzMjogZHJ1bSBmbGFncyA9ICV4XG4iLCBwMSkpOworCQlkcnVtX2ZsYWdzID0gKih1bnNpZ25lZCBpbnQqKSZldmVudFs0XTsKKwkJYnJlYWs7CisKKwljYXNlIF9BV0VfTUlTQ19NT0RFOgorCQlERUJVRygwLHByaW50aygiQVdFMzI6IGN0cmwgcGFybXMgPSAlZCAlZFxuIiwgcDEsIHAyKSk7CisJCWlmIChwMSA+IEFXRV9NRF9WRVJTSU9OICYmIHAxIDwgQVdFX01EX0VORCkgeworCQkJY3RybHNbcDFdID0gcDI7CisJCQlpZiAoY3RybF9wYXJtc1twMV0udXBkYXRlKQorCQkJCWN0cmxfcGFybXNbcDFdLnVwZGF0ZSgpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBfQVdFX0VRVUFMSVpFUjoKKwkJY3RybHNbQVdFX01EX0JBU1NfTEVWRUxdID0gcDE7CisJCWN0cmxzW0FXRV9NRF9UUkVCTEVfTEVWRUxdID0gcDI7CisJCWF3ZV91cGRhdGVfZXF1YWxpemVyKCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJREVCVUcoMCxwcmludGsoIkFXRTMyOiBodyBjb250cm9sIGNtZD0lZCB2b2ljZT0lZFxuIiwgY21kLCB2b2ljZSkpOworCQlicmVhazsKKwl9Cit9CisKKworLyogY2hhbmdlIGVmZmVjdHMgKi8KK3N0YXRpYyB2b2lkCithd2Vfc2VuZF9lZmZlY3QoaW50IHZvaWNlLCBpbnQgbGF5ZXIsIGludCB0eXBlLCBpbnQgdmFsKQoreworCWF3ZV9jaGFuX2luZm8gKmNpbmZvOworCUZYX1JlYyAqZng7CisJaW50IG1vZGU7CisKKwljaW5mbyA9ICZjaGFubmVsc1t2b2ljZV07CisJaWYgKGxheWVyID49IDAgJiYgbGF5ZXIgPCBNQVhfTEFZRVJTKQorCQlmeCA9ICZjaW5mby0+ZnhfbGF5ZXJbbGF5ZXJdOworCWVsc2UKKwkJZnggPSAmY2luZm8tPmZ4OworCisJaWYgKHR5cGUgJiAweDQwKQorCQltb2RlID0gRlhfRkxBR19PRkY7CisJZWxzZSBpZiAodHlwZSAmIDB4ODApCisJCW1vZGUgPSBGWF9GTEFHX0FERDsKKwllbHNlCisJCW1vZGUgPSBGWF9GTEFHX1NFVDsKKwl0eXBlICY9IDB4M2Y7CisKKwlpZiAodHlwZSA+PSAwICYmIHR5cGUgPCBBV0VfRlhfRU5EKSB7CisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogZWZmZWN0cyAoJWQpICVkICVkXG4iLCB2b2ljZSwgdHlwZSwgdmFsKSk7CisJCWlmIChtb2RlID09IEZYX0ZMQUdfU0VUKQorCQkJRlhfU0VUKGZ4LCB0eXBlLCB2YWwpOworCQllbHNlIGlmIChtb2RlID09IEZYX0ZMQUdfQUREKQorCQkJRlhfQUREKGZ4LCB0eXBlLCB2YWwpOworCQllbHNlCisJCQlGWF9VTlNFVChmeCwgdHlwZSk7CisJCWlmIChtb2RlICE9IEZYX0ZMQUdfT0ZGICYmIHBhcm1fZGVmc1t0eXBlXS5yZWFsdGltZSkgeworCQkJREVCVUcoMixwcmludGsoIkFXRTMyOiBmeF9yZWFsdGltZSAoJWQpXG4iLCB2b2ljZSkpOworCQkJYXdlX3ZvaWNlX2NoYW5nZSh2b2ljZSwgcGFybV9kZWZzW3R5cGVdLnJlYWx0aW1lKTsKKwkJfQorCX0KK30KKworCisvKiBjaGFuZ2UgbW9kdWxhdGlvbiB3aGVlbDsgdm9pY2UgaXMgYWxyZWFkeSBtYXBwZWQgb24gbXVsdGkyIG1vZGUgKi8KK3N0YXRpYyB2b2lkCithd2VfbW9kd2hlZWxfY2hhbmdlKGludCB2b2ljZSwgaW50IHZhbHVlKQoreworCWludCBpOworCWF3ZV9jaGFuX2luZm8gKmNpbmZvOworCisJY2luZm8gPSAmY2hhbm5lbHNbdm9pY2VdOworCWkgPSB2YWx1ZSAqIGN0cmxzW0FXRV9NRF9NT0RfU0VOU0VdIC8gMTIwMDsKKwlGWF9BREQoJmNpbmZvLT5meCwgQVdFX0ZYX0xGTzFfUElUQ0gsIGkpOworCWF3ZV92b2ljZV9jaGFuZ2Uodm9pY2UsIGF3ZV9meF9mbW1vZCk7CisJRlhfQUREKCZjaW5mby0+ZngsIEFXRV9GWF9MRk8yX1BJVENILCBpKTsKKwlhd2Vfdm9pY2VfY2hhbmdlKHZvaWNlLCBhd2VfZnhfZm0yZnJxMik7Cit9CisKKworLyogdm9pY2UgcHJlc3N1cmUgY2hhbmdlICovCitzdGF0aWMgdm9pZAorYXdlX2FmdGVydG91Y2goaW50IGRldiwgaW50IHZvaWNlLCBpbnQgcHJlc3N1cmUpCit7CisJaW50IG5vdGU7CisKKwlERUJVRygyLHByaW50aygiQVdFMzI6IFthZnRlciglZCkgJWRdXG4iLCB2b2ljZSwgcHJlc3N1cmUpKTsKKwlpZiAoISB2b2ljZV9pbl9yYW5nZSh2b2ljZSkpCisJCXJldHVybjsKKworCXN3aXRjaCAocGxheWluZ19tb2RlKSB7CisJY2FzZSBBV0VfUExBWV9ESVJFQ1Q6CisJY2FzZSBBV0VfUExBWV9JTkRJUkVDVDoKKwkJYXdlX3N0YXJ0X25vdGUoZGV2LCB2b2ljZSwgMjU1LCBwcmVzc3VyZSk7CisJCWJyZWFrOworCWNhc2UgQVdFX1BMQVlfTVVMVEkyOgorCQlub3RlID0gKHZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdICYgMHhmZikgLSAxOworCQlhd2Vfa2V5X3ByZXNzdXJlKGRldiwgdm9pY2UsIG5vdGUgKyAweDgwLCBwcmVzc3VyZSk7CisJCWJyZWFrOworCX0KK30KKworCisvKiB2b2ljZSBjb250cm9sIGNoYW5nZSAqLworc3RhdGljIHZvaWQKK2F3ZV9jb250cm9sbGVyKGludCBkZXYsIGludCB2b2ljZSwgaW50IGN0cmxfbnVtLCBpbnQgdmFsdWUpCit7CisJYXdlX2NoYW5faW5mbyAqY2luZm87CisKKwlpZiAoISB2b2ljZV9pbl9yYW5nZSh2b2ljZSkpCisJCXJldHVybjsKKworCWlmIChwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfTVVMVEkyKSB7CisJCXZvaWNlID0gdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPj4gODsKKwkJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBBV0VfTUFYX0NIQU5ORUxTKQorCQkJcmV0dXJuOworCX0KKworCWNpbmZvID0gJmNoYW5uZWxzW3ZvaWNlXTsKKworCXN3aXRjaCAoY3RybF9udW0pIHsKKwljYXNlIENUTF9CQU5LX1NFTEVDVDogLyogTUlESSBjb250cm9sICMwICovCisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW2JhbmsoJWQpICVkXVxuIiwgdm9pY2UsIHZhbHVlKSk7CisJCWlmIChNVUxUSV9MQVlFUl9NT0RFKCkgJiYgSVNfRFJVTV9DSEFOTkVMKHZvaWNlKSAmJgorCQkgICAgIWN0cmxzW0FXRV9NRF9UT0dHTEVfRFJVTV9CQU5LXSkKKwkJCWJyZWFrOworCQlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KQorCQkJYnJlYWs7CisJCWNpbmZvLT5iYW5rID0gdmFsdWU7CisJCWlmIChjaW5mby0+YmFuayA9PSBBV0VfRFJVTV9CQU5LKQorCQkJRFJVTV9DSEFOTkVMX09OKGNpbmZvLT5jaGFubmVsKTsKKwkJZWxzZQorCQkJRFJVTV9DSEFOTkVMX09GRihjaW5mby0+Y2hhbm5lbCk7CisJCWF3ZV9zZXRfaW5zdHIoZGV2LCB2b2ljZSwgY2luZm8tPmluc3RyKTsKKwkJYnJlYWs7CisKKwljYXNlIENUTF9NT0RXSEVFTDogLyogTUlESSBjb250cm9sICMxICovCisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW21vZHdoZWVsKCVkKSAlZF1cbiIsIHZvaWNlLCB2YWx1ZSkpOworCQlhd2VfbW9kd2hlZWxfY2hhbmdlKHZvaWNlLCB2YWx1ZSk7CisJCWJyZWFrOworCisJY2FzZSBDVFJMX1BJVENIX0JFTkRFUjogLyogU0VRMSBWMiBjb250b3JsICovCisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW2JlbmQoJWQpICVkXVxuIiwgdm9pY2UsIHZhbHVlKSk7CisJCS8qIHplcm8gY2VudGVyZWQgKi8KKwkJY2luZm8tPmJlbmRlciA9IHZhbHVlOworCQlhd2Vfdm9pY2VfY2hhbmdlKHZvaWNlLCBhd2Vfc2V0X3ZvaWNlX3BpdGNoKTsKKwkJYnJlYWs7CisKKwljYXNlIENUUkxfUElUQ0hfQkVOREVSX1JBTkdFOiAvKiBTRVExIFYyIGNvbnRyb2wgKi8KKwkJREVCVUcoMixwcmludGsoIkFXRTMyOiBbcmFuZ2UoJWQpICVkXVxuIiwgdm9pY2UsIHZhbHVlKSk7CisJCS8qIHZhbHVlID0gc2Vuc2UgeCAxMDAgKi8KKwkJY2luZm8tPmJlbmRlcl9yYW5nZSA9IHZhbHVlOworCQkvKiBubyBhdWRpYmxlIHBpdGNoIGNoYW5nZSB5ZXQuLiAqLworCQlicmVhazsKKworCWNhc2UgQ1RMX0VYUFJFU1NJT046IC8qIE1JREkgY29udHJvbCAjMTEgKi8KKwkJaWYgKFNJTkdMRV9MQVlFUl9NT0RFKCkpCisJCQl2YWx1ZSAvPSAxMjg7CisJY2FzZSBDVFJMX0VYUFJFU1NJT046IC8qIFNFUTEgVjIgY29udHJvbCAqLworCQlERUJVRygyLHByaW50aygiQVdFMzI6IFtleHByKCVkKSAlZF1cbiIsIHZvaWNlLCB2YWx1ZSkpOworCQkvKiAwIC0gMTI3ICovCisJCWNpbmZvLT5leHByZXNzaW9uX3ZvbCA9IHZhbHVlOworCQlhd2Vfdm9pY2VfY2hhbmdlKHZvaWNlLCBhd2Vfc2V0X3ZvaWNlX3ZvbCk7CisJCWJyZWFrOworCisJY2FzZSBDVExfUEFOOgkvKiBNSURJIGNvbnRyb2wgIzEwICovCisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW3BhbiglZCkgJWRdXG4iLCB2b2ljZSwgdmFsdWUpKTsKKwkJLyogKDAtMTI3KSAtPiBzaWduZWQgOGJpdCAqLworCQljaW5mby0+cGFubmluZyA9IHZhbHVlICogMiAtIDEyODsKKwkJaWYgKGN0cmxzW0FXRV9NRF9SRUFMVElNRV9QQU5dKQorCQkJYXdlX3ZvaWNlX2NoYW5nZSh2b2ljZSwgYXdlX3NldF9wYW4pOworCQlicmVhazsKKworCWNhc2UgQ1RMX01BSU5fVk9MVU1FOgkvKiBNSURJIGNvbnRyb2wgIzcgKi8KKwkJaWYgKFNJTkdMRV9MQVlFUl9NT0RFKCkpCisJCQl2YWx1ZSA9ICh2YWx1ZSAqIDEwMCkgLyAxNjM4MzsKKwljYXNlIENUUkxfTUFJTl9WT0xVTUU6CS8qIFNFUTEgVjIgY29udHJvbCAqLworCQlERUJVRygyLHByaW50aygiQVdFMzI6IFttYWludm9sKCVkKSAlZF1cbiIsIHZvaWNlLCB2YWx1ZSkpOworCQkvKiAwIC0gMTI3ICovCisJCWNpbmZvLT5tYWluX3ZvbCA9IHZhbHVlOworCQlhd2Vfdm9pY2VfY2hhbmdlKHZvaWNlLCBhd2Vfc2V0X3ZvaWNlX3ZvbCk7CisJCWJyZWFrOworCisJY2FzZSBDVExfRVhUX0VGRl9ERVBUSDogLyogcmV2ZXJiIGVmZmVjdHM6IDAtMTI3ICovCisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW3JldmVyYiglZCkgJWRdXG4iLCB2b2ljZSwgdmFsdWUpKTsKKwkJRlhfU0VUKCZjaW5mby0+ZngsIEFXRV9GWF9SRVZFUkIsIHZhbHVlICogMik7CisJCWJyZWFrOworCisJY2FzZSBDVExfQ0hPUlVTX0RFUFRIOiAvKiBjaG9ydXMgZWZmZWN0czogMC0xMjcgKi8KKwkJREVCVUcoMixwcmludGsoIkFXRTMyOiBbY2hvcnVzKCVkKSAlZF1cbiIsIHZvaWNlLCB2YWx1ZSkpOworCQlGWF9TRVQoJmNpbmZvLT5meCwgQVdFX0ZYX0NIT1JVUywgdmFsdWUgKiAyKTsKKwkJYnJlYWs7CisKKwljYXNlIDEyMDogIC8qIGFsbCBzb3VuZHMgb2ZmICovCisJCWF3ZV9ub3RlX29mZl9hbGwoRkFMU0UpOworCQlicmVhazsKKwljYXNlIDEyMzogIC8qIGFsbCBub3RlcyBvZmYgKi8KKwkJYXdlX25vdGVfb2ZmX2FsbChUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIENUTF9TVVNUQUlOOiAvKiBNSURJIGNvbnRyb2wgIzY0ICovCisJCWNpbmZvLT5zdXN0YWluZWQgPSB2YWx1ZTsKKwkJaWYgKHZhbHVlICE9IDEyNykKKwkJCWF3ZV92b2ljZV9jaGFuZ2Uodm9pY2UsIGF3ZV9zdXN0YWluX29mZik7CisJCWJyZWFrOworCisJY2FzZSBDVExfU09TVEVOVVRPOiAvKiBNSURJIGNvbnRyb2wgIzY2ICovCisJCWlmICh2YWx1ZSA9PSAxMjcpCisJCQlhd2Vfdm9pY2VfY2hhbmdlKHZvaWNlLCBhd2Vfc29zdGVudXRvX29uKTsKKwkJZWxzZQorCQkJYXdlX3ZvaWNlX2NoYW5nZSh2b2ljZSwgYXdlX3N1c3RhaW5fb2ZmKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlERUJVRygwLHByaW50aygiQVdFMzI6IFtjb250cm9sKCVkKSBjdHJsPSVkIHZhbD0lZF1cbiIsCisJCQkgICB2b2ljZSwgY3RybF9udW0sIHZhbHVlKSk7CisJCWJyZWFrOworCX0KK30KKworCisvKiB2b2ljZSBwYW4gY2hhbmdlICh2YWx1ZSA9IC0xMjggLSAxMjcpICovCitzdGF0aWMgdm9pZAorYXdlX3Bhbm5pbmcoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgdmFsdWUpCit7CisJYXdlX2NoYW5faW5mbyAqY2luZm87CisKKwlpZiAoISB2b2ljZV9pbl9yYW5nZSh2b2ljZSkpCisJCXJldHVybjsKKworCWlmIChwbGF5aW5nX21vZGUgPT0gQVdFX1BMQVlfTVVMVEkyKSB7CisJCXZvaWNlID0gdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPj4gODsKKwkJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBBV0VfTUFYX0NIQU5ORUxTKQorCQkJcmV0dXJuOworCX0KKworCWNpbmZvID0gJmNoYW5uZWxzW3ZvaWNlXTsKKwljaW5mby0+cGFubmluZyA9IHZhbHVlOworCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW3BhbiglZCkgJWRdXG4iLCB2b2ljZSwgY2luZm8tPnBhbm5pbmcpKTsKKwlpZiAoY3RybHNbQVdFX01EX1JFQUxUSU1FX1BBTl0pCisJCWF3ZV92b2ljZV9jaGFuZ2Uodm9pY2UsIGF3ZV9zZXRfcGFuKTsKK30KKworCisvKiB2b2x1bWUgbW9kZSBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkCithd2Vfdm9sdW1lX21ldGhvZChpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwkvKiBub3QgaW1wcmVtZW50ZWQgKi8KKwlERUJVRygwLHByaW50aygiQVdFMzI6IFt2b2xtZXRob2QgbW9kZT0lZF1cbiIsIG1vZGUpKTsKK30KKworCisvKiBwaXRjaCB3aGVlbCBjaGFuZ2U6IDAtMTYzODQgKi8KK3N0YXRpYyB2b2lkCithd2VfYmVuZGVyKGludCBkZXYsIGludCB2b2ljZSwgaW50IHZhbHVlKQoreworCWF3ZV9jaGFuX2luZm8gKmNpbmZvOworCisJaWYgKCEgdm9pY2VfaW5fcmFuZ2Uodm9pY2UpKQorCQlyZXR1cm47CisKKwlpZiAocGxheWluZ19tb2RlID09IEFXRV9QTEFZX01VTFRJMikgeworCQl2b2ljZSA9IHZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdID4+IDg7CisJCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gQVdFX01BWF9DSEFOTkVMUykKKwkJCXJldHVybjsKKwl9CisKKwkvKiBjb252ZXJ0IHRvIHplcm8gY2VudGVyZWQgdmFsdWUgKi8KKwljaW5mbyA9ICZjaGFubmVsc1t2b2ljZV07CisJY2luZm8tPmJlbmRlciA9IHZhbHVlIC0gODE5MjsKKwlERUJVRygyLHByaW50aygiQVdFMzI6IFtiZW5kKCVkKSAlZF1cbiIsIHZvaWNlLCBjaW5mby0+YmVuZGVyKSk7CisJYXdlX3ZvaWNlX2NoYW5nZSh2b2ljZSwgYXdlX3NldF92b2ljZV9waXRjaCk7Cit9CisKKworLyoKKyAqIGxvYWQgYSBzb3VuZCBwYXRjaDoKKyAqICAgdGhyZWUgdHlwZXMgb2YgcGF0Y2hlcyBhcmUgYWNjZXB0ZWQ6IEFXRSwgR1VTLCBhbmQgU1lTRVguCisgKi8KKworc3RhdGljIGludAorYXdlX2xvYWRfcGF0Y2goaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJICAgICAgIGludCBvZmZzLCBpbnQgY291bnQsIGludCBwbWdyX2ZsYWcpCit7CisJYXdlX3BhdGNoX2luZm8gcGF0Y2g7CisJaW50IHJjID0gMDsKKworI2lmZGVmIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkKKwlpZiAoZm9ybWF0ID09IEdVU19QQVRDSCkgeworCQlyZXR1cm4gYXdlX2xvYWRfZ3VzcGF0Y2goYWRkciwgb2ZmcywgY291bnQsIHBtZ3JfZmxhZyk7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAoZm9ybWF0ID09IFNZU0VYX1BBVENIKSB7CisJCS8qIG5vIHN5c3RlbSBleGNsdXNpdmUgbWVzc2FnZSBzdXBwb3J0ZWQgeWV0ICovCisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoZm9ybWF0ICE9IEFXRV9QQVRDSCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMiBFcnJvcjogSW52YWxpZCBwYXRjaCBmb3JtYXQgKGtleSkgMHgleFxuIiwgZm9ybWF0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCWlmIChjb3VudCA8IEFXRV9QQVRDSF9JTkZPX1NJWkUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IFBhdGNoIGhlYWRlciB0b28gc2hvcnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCgoY2hhciopJnBhdGNoKSArIG9mZnMsIGFkZHIgKyBvZmZzLCAKKwkJCSAgIEFXRV9QQVRDSF9JTkZPX1NJWkUgLSBvZmZzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwljb3VudCAtPSBBV0VfUEFUQ0hfSU5GT19TSVpFOworCWlmIChjb3VudCA8IHBhdGNoLmxlbikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMjogc2FtcGxlOiBQYXRjaCByZWNvcmQgdG9vIHNob3J0ICglZDwlZClcbiIsCisJCSAgICAgICBjb3VudCwgcGF0Y2gubGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCXN3aXRjaCAocGF0Y2gudHlwZSkgeworCWNhc2UgQVdFX0xPQURfSU5GTzoKKwkJcmMgPSBhd2VfbG9hZF9pbmZvKCZwYXRjaCwgYWRkciwgY291bnQpOworCQlicmVhazsKKwljYXNlIEFXRV9MT0FEX0RBVEE6CisJCXJjID0gYXdlX2xvYWRfZGF0YSgmcGF0Y2gsIGFkZHIsIGNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBBV0VfT1BFTl9QQVRDSDoKKwkJcmMgPSBhd2Vfb3Blbl9wYXRjaCgmcGF0Y2gsIGFkZHIsIGNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBBV0VfQ0xPU0VfUEFUQ0g6CisJCXJjID0gYXdlX2Nsb3NlX3BhdGNoKCZwYXRjaCwgYWRkciwgY291bnQpOworCQlicmVhazsKKwljYXNlIEFXRV9VTkxPQURfUEFUQ0g6CisJCXJjID0gYXdlX3VubG9hZF9wYXRjaCgmcGF0Y2gsIGFkZHIsIGNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBBV0VfUkVQTEFDRV9EQVRBOgorCQlyYyA9IGF3ZV9yZXBsYWNlX2RhdGEoJnBhdGNoLCBhZGRyLCBjb3VudCk7CisJCWJyZWFrOworCWNhc2UgQVdFX01BUF9QUkVTRVQ6CisJCXJjID0gYXdlX2xvYWRfbWFwKCZwYXRjaCwgYWRkciwgY291bnQpOworCQlicmVhazsKKwkvKiBjYXNlIEFXRV9QUk9CRV9JTkZPOgorCQlyYyA9IGF3ZV9wcm9iZV9pbmZvKCZwYXRjaCwgYWRkciwgY291bnQpOworCQlicmVhazsqLworCWNhc2UgQVdFX1BST0JFX0RBVEE6CisJCXJjID0gYXdlX3Byb2JlX2RhdGEoJnBhdGNoLCBhZGRyLCBjb3VudCk7CisJCWJyZWFrOworCWNhc2UgQVdFX1JFTU9WRV9JTkZPOgorCQlyYyA9IGF3ZV9yZW1vdmVfaW5mbygmcGF0Y2gsIGFkZHIsIGNvdW50KTsKKwkJYnJlYWs7CisJY2FzZSBBV0VfTE9BRF9DSE9SVVNfRlg6CisJCXJjID0gYXdlX2xvYWRfY2hvcnVzX2Z4KCZwYXRjaCwgYWRkciwgY291bnQpOworCQlicmVhazsKKwljYXNlIEFXRV9MT0FEX1JFVkVSQl9GWDoKKwkJcmMgPSBhd2VfbG9hZF9yZXZlcmJfZngoJnBhdGNoLCBhZGRyLCBjb3VudCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IHVua25vd24gcGF0Y2ggZm9ybWF0IHR5cGUgJWRcbiIsCisJCSAgICAgICBwYXRjaC50eXBlKTsKKwkJcmMgPSAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworCisvKiBjcmVhdGUgYW4gc2YgbGlzdCByZWNvcmQgKi8KK3N0YXRpYyBpbnQKK2F3ZV9jcmVhdGVfc2YoaW50IHR5cGUsIGNoYXIgKm5hbWUpCit7CisJc2ZfbGlzdCAqcmVjOworCisJLyogdGVybWluYXRlIHNvdW5kcyAqLworCWF3ZV9yZXNldCgwKTsKKwlyZWMgPSAoc2ZfbGlzdCAqKWttYWxsb2Moc2l6ZW9mKCpyZWMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocmVjID09IE5VTEwpCisJCXJldHVybiAxOyAvKiBubyBtZW1vcnkgKi8KKwlyZWMtPnNmX2lkID0gY3VycmVudF9zZl9pZCArIDE7CisJcmVjLT50eXBlID0gdHlwZTsKKwlpZiAoLypjdXJyZW50X3NmX2lkID09IDAgfHwqLyAodHlwZSAmIEFXRV9QQVRfTE9DS0VEKSAhPSAwKQorCQlsb2NrZWRfc2ZfaWQgPSBjdXJyZW50X3NmX2lkICsgMTsKKwlyZWMtPm51bV9pbmZvID0gYXdlX2ZyZWVfaW5mbygpOworCXJlYy0+bnVtX3NhbXBsZSA9IGF3ZV9mcmVlX3NhbXBsZSgpOworCXJlYy0+bWVtX3B0ciA9IGF3ZV9mcmVlX21lbV9wdHIoKTsKKwlyZWMtPmluZm9zID0gcmVjLT5sYXN0X2luZm9zID0gTlVMTDsKKwlyZWMtPnNhbXBsZXMgPSByZWMtPmxhc3Rfc2FtcGxlcyA9IE5VTEw7CisKKwkvKiBhZGQgdG8gbGlua2VkLWxpc3QgKi8KKwlyZWMtPm5leHQgPSBOVUxMOworCXJlYy0+cHJldiA9IHNmdGFpbDsKKwlpZiAoc2Z0YWlsKQorCQlzZnRhaWwtPm5leHQgPSByZWM7CisJZWxzZQorCQlzZmhlYWQgPSByZWM7CisJc2Z0YWlsID0gcmVjOworCWN1cnJlbnRfc2ZfaWQrKzsKKworI2lmZGVmIEFXRV9BTExPV19TQU1QTEVfU0hBUklORworCXJlYy0+c2hhcmVkID0gTlVMTDsKKwlpZiAobmFtZSkKKwkJbWVtY3B5KHJlYy0+bmFtZSwgbmFtZSwgQVdFX1BBVENIX05BTUVfTEVOKTsKKwllbHNlCisJCXN0cmNweShyZWMtPm5hbWUsICIqVEVNUE9SQVJZKiIpOworCWlmIChjdXJyZW50X3NmX2lkID4gMSAmJiBuYW1lICYmICh0eXBlICYgQVdFX1BBVF9TSEFSRUQpICE9IDApIHsKKwkJLyogaXMgdGhlIGN1cnJlbnQgZm9udCByZWFsbHkgYSBzaGFyZWQgZm9udD8gKi8KKwkJaWYgKGlzX3NoYXJlZF9zZihyZWMtPm5hbWUpKSB7CisJCQkvKiBjaGVjayBpZiB0aGUgc2hhcmVkIGZvbnQgaXMgYWxyZWFkeSBpbnN0YWxsZWQgKi8KKwkJCXNmX2xpc3QgKnA7CisJCQlmb3IgKHAgPSByZWMtPnByZXY7IHA7IHAgPSBwLT5wcmV2KSB7CisJCQkJaWYgKGlzX2lkZW50aWNhbF9uYW1lKHJlYy0+bmFtZSwgcCkpIHsKKwkJCQkJcmVjLT5zaGFyZWQgPSBwOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisjZW5kaWYgLyogYWxsb3cgc2hhcmluZyAqLworCisJcmV0dXJuIDA7Cit9CisKKworI2lmZGVmIEFXRV9BTExPV19TQU1QTEVfU0hBUklORworCisvKiBjaGVjayBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhIHZhbGlkIHNoYXJlZCBuYW1lICovCisjZGVmaW5lIEFTQ19UT19LRVkoYykgKChjKSAtICdBJyArIDEpCitzdGF0aWMgaW50IGlzX3NoYXJlZF9zZih1bnNpZ25lZCBjaGFyICpuYW1lKQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGlkX2hlYWRbNF0gPSB7CisJCUFTQ19UT19LRVkoJ0EnKSwgQVNDX1RPX0tFWSgnVycpLCBBU0NfVE9fS0VZKCdFJyksCisJCUFXRV9NQUpPUl9WRVJTSU9OLAorCX07CisJaWYgKG1lbWNtcChuYW1lLCBpZF9oZWFkLCA0KSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qIGNoZWNrIGlmIHRoZSBnaXZlbiBuYW1lIG1hdGNoZXMgdG8gdGhlIGV4aXN0aW5nIGxpc3QgKi8KK3N0YXRpYyBpbnQgaXNfaWRlbnRpY2FsX25hbWUodW5zaWduZWQgY2hhciAqbmFtZSwgc2ZfbGlzdCAqcCkgCit7CisJY2hhciAqaWQgPSBwLT5uYW1lOworCWlmIChpc19zaGFyZWRfc2YoaWQpICYmIG1lbWNtcChpZCwgbmFtZSwgQVdFX1BBVENIX05BTUVfTEVOKSA9PSAwKQorCQlyZXR1cm4gVFJVRTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qIGNoZWNrIGlmIHRoZSBnaXZlbiB2b2ljZSBpbmZvIGV4aXN0cyAqLworc3RhdGljIGludCBpbmZvX2R1cGxpY2F0ZWQoc2ZfbGlzdCAqc2YsIGF3ZV92b2ljZV9saXN0ICpyZWMpCit7CisJLyogc2VhcmNoIGZvciBhbGwgc2hhcmluZyBsaXN0cyAqLworCWZvciAoOyBzZjsgc2YgPSBzZi0+c2hhcmVkKSB7CisJCWF3ZV92b2ljZV9saXN0ICpwOworCQlmb3IgKHAgPSBzZi0+aW5mb3M7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlpZiAocC0+dHlwZSA9PSBWX1NUX05PUk1BTCAmJgorCQkJICAgIHAtPmJhbmsgPT0gcmVjLT5iYW5rICYmCisJCQkgICAgcC0+aW5zdHIgPT0gcmVjLT5pbnN0ciAmJgorCQkJICAgIHAtPnYubG93ID09IHJlYy0+di5sb3cgJiYKKwkJCSAgICBwLT52LmhpZ2ggPT0gcmVjLT52LmhpZ2ggJiYKKwkJCSAgICBwLT52LnNhbXBsZSA9PSByZWMtPnYuc2FtcGxlKQorCQkJCXJldHVybiBUUlVFOworCQl9CisJfQorCXJldHVybiBGQUxTRTsKK30KKworI2VuZGlmIC8qIEFXRV9BTExPV19TQU1QTEVfU0hBUklORyAqLworCisKKy8qIGZyZWUgc2ZfbGlzdCByZWNvcmQgKi8KKy8qIGxpbmtlZC1saXN0IGluIHRoaXMgZnVuY3Rpb24gaXMgbm90IGNhcmVkICovCitzdGF0aWMgdm9pZAorYXdlX2ZyZWVfc2Yoc2ZfbGlzdCAqc2YpCit7CisJaWYgKHNmLT5pbmZvcykgeworCQlhd2Vfdm9pY2VfbGlzdCAqcCwgKm5leHQ7CisJCWZvciAocCA9IHNmLT5pbmZvczsgcDsgcCA9IG5leHQpIHsKKwkJCW5leHQgPSBwLT5uZXh0OworCQkJa2ZyZWUocCk7CisJCX0KKwl9CisJaWYgKHNmLT5zYW1wbGVzKSB7CisJCWF3ZV9zYW1wbGVfbGlzdCAqcCwgKm5leHQ7CisJCWZvciAocCA9IHNmLT5zYW1wbGVzOyBwOyBwID0gbmV4dCkgeworCQkJbmV4dCA9IHAtPm5leHQ7CisJCQlrZnJlZShwKTsKKwkJfQorCX0KKwlrZnJlZShzZik7Cit9CisKKworLyogb3BlbiBwYXRjaDsgY3JlYXRlIHNmIGxpc3QgYW5kIHNldCBvcGVuZWQgZmxhZyAqLworc3RhdGljIGludAorYXdlX29wZW5fcGF0Y2goYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KQoreworCWF3ZV9vcGVuX3Bhcm0gcGFybTsKKwlpbnQgc2hhcmVkOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZwYXJtLCBhZGRyICsgQVdFX1BBVENIX0lORk9fU0laRSwgc2l6ZW9mKHBhcm0pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2hhcmVkID0gRkFMU0U7CisKKyNpZmRlZiBBV0VfQUxMT1dfU0FNUExFX1NIQVJJTkcKKwlpZiAoc2Z0YWlsICYmIChwYXJtLnR5cGUgJiBBV0VfUEFUX1NIQVJFRCkgIT0gMCkgeworCQkvKiBpcyB0aGUgcHJldmlvdXMgZm9udCB0aGUgc2FtZSBmb250PyAqLworCQlpZiAoaXNfaWRlbnRpY2FsX25hbWUocGFybS5uYW1lLCBzZnRhaWwpKSB7CisJCQkvKiB0aGVuIGFwcGVuZCB0byB0aGUgcHJldmlvdXMgKi8KKwkJCXNoYXJlZCA9IFRSVUU7CisJCQlhd2VfcmVzZXQoMCk7CisJCQlpZiAocGFybS50eXBlICYgQVdFX1BBVF9MT0NLRUQpCisJCQkJbG9ja2VkX3NmX2lkID0gY3VycmVudF9zZl9pZDsKKwkJfQorCX0KKyNlbmRpZiAvKiBhbGxvdyBzaGFyaW5nICovCisJaWYgKCEgc2hhcmVkKSB7CisJCWlmIChhd2VfY3JlYXRlX3NmKHBhcm0udHlwZSwgcGFybS5uYW1lKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJBV0UzMjogY2FuJ3Qgb3BlbjogZmFpbGVkIHRvIGFsbG9jIG5ldyBsaXN0XG4iKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCXBhdGNoX29wZW5lZCA9IFRSVUU7CisJcmV0dXJuIGN1cnJlbnRfc2ZfaWQ7Cit9CisKKy8qIGNoZWNrIGlmIHRoZSBwYXRjaCBpcyBhbHJlYWR5IG9wZW5lZCAqLworc3RhdGljIHNmX2xpc3QgKgorY2hlY2tfcGF0Y2hfb3BlbmVkKGludCB0eXBlLCBjaGFyICpuYW1lKQoreworCWlmICghIHBhdGNoX29wZW5lZCkgeworCQlpZiAoYXdlX2NyZWF0ZV9zZih0eXBlLCBuYW1lKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJBV0UzMjogZmFpbGVkIHRvIGFsbG9jIG5ldyBsaXN0XG4iKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXBhdGNoX29wZW5lZCA9IFRSVUU7CisJCXJldHVybiBzZnRhaWw7CisJfQorCXJldHVybiBzZnRhaWw7Cit9CisKKy8qIGNsb3NlIHRoZSBwYXRjaDsgaWYgbm8gdm9pY2UgaXMgbG9hZGVkLCByZW1vdmUgdGhlIHBhdGNoICovCitzdGF0aWMgaW50Cithd2VfY2xvc2VfcGF0Y2goYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KQoreworCWlmIChwYXRjaF9vcGVuZWQgJiYgc2Z0YWlsKSB7CisJCS8qIGlmIG5vIHZvaWNlIGlzIGxvYWRlZCwgcmVsZWFzZSB0aGUgY3VycmVudCBwYXRjaCAqLworCQlpZiAoc2Z0YWlsLT5pbmZvcyA9PSBOVUxMKSB7CisJCQlhd2VfcmVzZXQoMCk7CisJCQlhd2VfcmVtb3ZlX3NhbXBsZXMoY3VycmVudF9zZl9pZCAtIDEpOworCQl9CisJfQorCXBhdGNoX29wZW5lZCA9IDA7CisJcmV0dXJuIDA7Cit9CisKKworLyogcmVtb3ZlIHRoZSBsYXRlc3QgcGF0Y2ggKi8KK3N0YXRpYyBpbnQKK2F3ZV91bmxvYWRfcGF0Y2goYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KQoreworCWlmIChjdXJyZW50X3NmX2lkID4gMCAmJiBjdXJyZW50X3NmX2lkID4gbG9ja2VkX3NmX2lkKSB7CisJCWF3ZV9yZXNldCgwKTsKKwkJYXdlX3JlbW92ZV9zYW1wbGVzKGN1cnJlbnRfc2ZfaWQgLSAxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGFsbG9jYXRlIHZvaWNlIGluZm8gbGlzdCByZWNvcmRzICovCitzdGF0aWMgYXdlX3ZvaWNlX2xpc3QgKgorYWxsb2NfbmV3X2luZm8odm9pZCkKK3sKKwlhd2Vfdm9pY2VfbGlzdCAqbmV3bGlzdDsKKwkKKwluZXdsaXN0ID0gKGF3ZV92b2ljZV9saXN0ICopa21hbGxvYyhzaXplb2YoKm5ld2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3bGlzdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQVdFMzI6IGNhbid0IGFsbG9jIGluZm8gdGFibGVcbiIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG5ld2xpc3Q7Cit9CisKKy8qIGFsbG9jYXRlIHNhbXBsZSBpbmZvIGxpc3QgcmVjb3JkcyAqLworc3RhdGljIGF3ZV9zYW1wbGVfbGlzdCAqCithbGxvY19uZXdfc2FtcGxlKHZvaWQpCit7CisJYXdlX3NhbXBsZV9saXN0ICpuZXdsaXN0OworCQorCW5ld2xpc3QgPSAoYXdlX3NhbXBsZV9saXN0ICopa21hbGxvYyhzaXplb2YoKm5ld2xpc3QpLCBHRlBfS0VSTkVMKTsKKwlpZiAobmV3bGlzdCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQVdFMzI6IGNhbid0IGFsbG9jIHNhbXBsZSB0YWJsZVxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gbmV3bGlzdDsKK30KKworLyogbG9hZCB2b2ljZSBtYXAgKi8KK3N0YXRpYyBpbnQKK2F3ZV9sb2FkX21hcChhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisJYXdlX3ZvaWNlX21hcCBtYXA7CisJYXdlX3ZvaWNlX2xpc3QgKnJlYywgKnA7CisJc2ZfbGlzdCAqc2Y7CisKKwkvKiBnZXQgdGhlIGxpbmsgaW5mbyAqLworCWlmIChjb3VudCA8IHNpemVvZihtYXApKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyIEVycm9yOiBpbnZhbGlkIHBhdGNoIGluZm8gbGVuZ3RoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb3B5X2Zyb21fdXNlcigmbWFwLCBhZGRyICsgQVdFX1BBVENIX0lORk9fU0laRSwgc2l6ZW9mKG1hcCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwkKKwkvKiBjaGVjayBpZiB0aGUgaWRlbnRpY2FsIG1hcHBpbmcgYWxyZWFkeSBleGlzdHMgKi8KKwlwID0gYXdlX3NlYXJjaF9pbnN0cihtYXAubWFwX2JhbmssIG1hcC5tYXBfaW5zdHIsIG1hcC5tYXBfa2V5KTsKKwlmb3IgKDsgcDsgcCA9IHAtPm5leHRfaW5zdHIpIHsKKwkJaWYgKHAtPnR5cGUgPT0gVl9TVF9NQVBQRUQgJiYKKwkJICAgIHAtPnYuc3RhcnQgPT0gbWFwLnNyY19pbnN0ciAmJgorCQkgICAgcC0+di5lbmQgPT0gbWFwLnNyY19iYW5rICYmCisJCSAgICBwLT52LmZpeGtleSA9PSBtYXAuc3JjX2tleSkKKwkJCXJldHVybiAwOyAvKiBhbHJlYWR5IHByZXNlbnQhICovCisJfQorCisJaWYgKChzZiA9IGNoZWNrX3BhdGNoX29wZW5lZChBV0VfUEFUX1RZUEVfTUFQLCBOVUxMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAoKHJlYyA9IGFsbG9jX25ld19pbmZvKCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJcmVjLT5iYW5rID0gbWFwLm1hcF9iYW5rOworCXJlYy0+aW5zdHIgPSBtYXAubWFwX2luc3RyOworCXJlYy0+dHlwZSA9IFZfU1RfTUFQUEVEOworCXJlYy0+ZGlzYWJsZWQgPSBGQUxTRTsKKwlhd2VfaW5pdF92b2ljZV9pbmZvKCZyZWMtPnYpOworCWlmIChtYXAubWFwX2tleSA+PSAwKSB7CisJCXJlYy0+di5sb3cgPSBtYXAubWFwX2tleTsKKwkJcmVjLT52LmhpZ2ggPSBtYXAubWFwX2tleTsKKwl9CisJcmVjLT52LnN0YXJ0ID0gbWFwLnNyY19pbnN0cjsKKwlyZWMtPnYuZW5kID0gbWFwLnNyY19iYW5rOworCXJlYy0+di5maXhrZXkgPSBtYXAuc3JjX2tleTsKKwlhZGRfc2ZfaW5mbyhzZiwgcmVjKTsKKwlhZGRfaW5mb19saXN0KHJlYyk7CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKy8qIHByb2JlIHByZXNldCBpbiB0aGUgY3VycmVudCBsaXN0IC0tIG5vdGhpbmcgdG8gYmUgbG9hZGVkICovCitzdGF0aWMgaW50Cithd2VfcHJvYmVfaW5mbyhhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisjaWZkZWYgQVdFX0FMTE9XX1NBTVBMRV9TSEFSSU5HCisJYXdlX3ZvaWNlX21hcCBtYXA7CisJYXdlX3ZvaWNlX2xpc3QgKnA7CisKKwlpZiAoISBwYXRjaF9vcGVuZWQpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZ2V0IHRoZSBsaW5rIGluZm8gKi8KKwlpZiAoY291bnQgPCBzaXplb2YobWFwKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMiBFcnJvcjogaW52YWxpZCBwYXRjaCBpbmZvIGxlbmd0aFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJm1hcCwgYWRkciArIEFXRV9QQVRDSF9JTkZPX1NJWkUsIHNpemVvZihtYXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJLyogY2hlY2sgaWYgdGhlIGlkZW50aWNhbCBtYXBwaW5nIGFscmVhZHkgZXhpc3RzICovCisJaWYgKHNmdGFpbCA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwID0gYXdlX3NlYXJjaF9pbnN0cihtYXAuc3JjX2JhbmssIG1hcC5zcmNfaW5zdHIsIG1hcC5zcmNfa2V5KTsKKwlmb3IgKDsgcDsgcCA9IHAtPm5leHRfaW5zdHIpIHsKKwkJaWYgKHAtPnR5cGUgPT0gVl9TVF9OT1JNQUwgJiYKKwkJICAgIGlzX2lkZW50aWNhbF9ob2xkZXIocC0+aG9sZGVyLCBzZnRhaWwpICYmCisJCSAgICBwLT52LmxvdyA8PSBtYXAuc3JjX2tleSAmJgorCQkgICAgcC0+di5oaWdoID49IG1hcC5zcmNfa2V5KQorCQkJcmV0dXJuIDA7IC8qIGFscmVhZHkgcHJlc2VudCEgKi8KKwl9CisjZW5kaWYgLyogYWxsb3cgc2hhcmluZyAqLworCXJldHVybiAtRUlOVkFMOworfQorI2VuZGlmCisKKy8qIHByb2JlIHNhbXBsZSBpbiB0aGUgY3VycmVudCBsaXN0IC0tIG5vdGhpbmcgdG8gYmUgbG9hZGVkICovCitzdGF0aWMgaW50Cithd2VfcHJvYmVfZGF0YShhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisjaWZkZWYgQVdFX0FMTE9XX1NBTVBMRV9TSEFSSU5HCisJaWYgKCEgcGF0Y2hfb3BlbmVkKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHNlYXJjaCB0aGUgc3BlY2lmaWVkIHNhbXBsZSBieSBvcHRhcmcgKi8KKwlpZiAoc2VhcmNoX3NhbXBsZV9pbmRleChzZnRhaWwsIHBhdGNoLT5vcHRhcmcpICE9IE5VTEwpCisJCXJldHVybiAwOworI2VuZGlmIC8qIGFsbG93IHNoYXJpbmcgKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCQkKKy8qIHJlbW92ZSB0aGUgcHJlc2VudCBpbnN0cnVtZW50IGxheWVycyAqLworc3RhdGljIGludAorcmVtb3ZlX2luZm8oc2ZfbGlzdCAqc2YsIGludCBiYW5rLCBpbnQgaW5zdHIpCit7CisJYXdlX3ZvaWNlX2xpc3QgKnByZXYsICpuZXh0LCAqcDsKKwlpbnQgcmVtb3ZlZCA9IDA7CisKKwlwcmV2ID0gTlVMTDsKKwlmb3IgKHAgPSBzZi0+aW5mb3M7IHA7IHAgPSBuZXh0KSB7CisJCW5leHQgPSBwLT5uZXh0OworCQlpZiAocC0+dHlwZSA9PSBWX1NUX05PUk1BTCAmJgorCQkgICAgcC0+YmFuayA9PSBiYW5rICYmIHAtPmluc3RyID09IGluc3RyKSB7CisJCQkvKiByZW1vdmUgdGhpcyBsYXllciAqLworCQkJaWYgKHByZXYpCisJCQkJcHJldi0+bmV4dCA9IG5leHQ7CisJCQllbHNlCisJCQkJc2YtPmluZm9zID0gbmV4dDsKKwkJCWlmIChwID09IHNmLT5sYXN0X2luZm9zKQorCQkJCXNmLT5sYXN0X2luZm9zID0gcHJldjsKKwkJCXNmLT5udW1faW5mby0tOworCQkJcmVtb3ZlZCsrOworCQkJa2ZyZWUocCk7CisJCX0gZWxzZQorCQkJcHJldiA9IHA7CisJfQorCWlmIChyZW1vdmVkKQorCQlyZWJ1aWxkX3ByZXNldF9saXN0KCk7CisJcmV0dXJuIHJlbW92ZWQ7Cit9CisKKy8qIGxvYWQgdm9pY2UgaW5mb3JtYXRpb24gZGF0YSAqLworc3RhdGljIGludAorYXdlX2xvYWRfaW5mbyhhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisJaW50IG9mZnNldDsKKwlhd2Vfdm9pY2VfcmVjX2hkciBoZHI7CisJaW50IGk7CisJaW50IHRvdGFsX3NpemU7CisJc2ZfbGlzdCAqc2Y7CisJYXdlX3ZvaWNlX2xpc3QgKnJlYzsKKworCWlmIChjb3VudCA8IEFXRV9WT0lDRV9SRUNfU0laRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMiBFcnJvcjogaW52YWxpZCBwYXRjaCBpbmZvIGxlbmd0aFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCW9mZnNldCA9IEFXRV9QQVRDSF9JTkZPX1NJWkU7CisJaWYgKGNvcHlfZnJvbV91c2VyKChjaGFyKikmaGRyLCBhZGRyICsgb2Zmc2V0LCBBV0VfVk9JQ0VfUkVDX1NJWkUpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlvZmZzZXQgKz0gQVdFX1ZPSUNFX1JFQ19TSVpFOworCisJaWYgKGhkci5udm9pY2VzIDw9IDAgfHwgaGRyLm52b2ljZXMgPj0gMTAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyIEVycm9yOiBJbnZhbGlkIHZvaWNlIG51bWJlciAlZFxuIiwgaGRyLm52b2ljZXMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJdG90YWxfc2l6ZSA9IEFXRV9WT0lDRV9SRUNfU0laRSArIEFXRV9WT0lDRV9JTkZPX1NJWkUgKiBoZHIubnZvaWNlczsKKwlpZiAoY291bnQgPCB0b3RhbF9zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyIEVycm9yOiBwYXRjaCBsZW5ndGgoJWQpIGlzIHNtYWxsZXIgdGhhbiBudm9pY2VzKCVkKVxuIiwKKwkJICAgICAgIGNvdW50LCBoZHIubnZvaWNlcyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICgoc2YgPSBjaGVja19wYXRjaF9vcGVuZWQoQVdFX1BBVF9UWVBFX01JU0MsIE5VTEwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN3aXRjaCAoaGRyLndyaXRlX21vZGUpIHsKKwljYXNlIEFXRV9XUl9FWENMVVNJVkU6CisJCS8qIGV4Y2x1c2l2ZSBtb2RlIC0gaWYgdGhlIGluc3RydW1lbnQgYWxyZWFkeSBleGlzdHMsCisJCSAgIHJldHVybiBlcnJvciAqLworCQlmb3IgKHJlYyA9IHNmLT5pbmZvczsgcmVjOyByZWMgPSByZWMtPm5leHQpIHsKKwkJCWlmIChyZWMtPnR5cGUgPT0gVl9TVF9OT1JNQUwgJiYKKwkJCSAgICByZWMtPmJhbmsgPT0gaGRyLmJhbmsgJiYKKwkJCSAgICByZWMtPmluc3RyID09IGhkci5pbnN0cikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIEFXRV9XUl9SRVBMQUNFOgorCQkvKiByZXBsYWNlIG1vZGUgLSByZW1vdmUgdGhlIGluc3RydW1lbnQgaWYgaXQgYWxyZWFkeSBleGlzdHMgKi8KKwkJcmVtb3ZlX2luZm8oc2YsIGhkci5iYW5rLCBoZHIuaW5zdHIpOworCQlicmVhazsKKwl9CisKKwkvKiBhcHBlbmQgbmV3IGxheWVycyAqLworCWZvciAoaSA9IDA7IGkgPCBoZHIubnZvaWNlczsgaSsrKSB7CisJCXJlYyA9IGFsbG9jX25ld19pbmZvKCk7CisJCWlmIChyZWMgPT0gTlVMTCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXJlYy0+YmFuayA9IGhkci5iYW5rOworCQlyZWMtPmluc3RyID0gaGRyLmluc3RyOworCQlyZWMtPnR5cGUgPSBWX1NUX05PUk1BTDsKKwkJcmVjLT5kaXNhYmxlZCA9IEZBTFNFOworCisJCS8qIGNvcHkgYXdlX3ZvaWNlX2luZm8gcGFyYW1ldGVycyAqLworCQlpZiAoY29weV9mcm9tX3VzZXIoJnJlYy0+diwgYWRkciArIG9mZnNldCwgQVdFX1ZPSUNFX0lORk9fU0laRSkpIHsKKwkJCWtmcmVlKHJlYyk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlvZmZzZXQgKz0gQVdFX1ZPSUNFX0lORk9fU0laRTsKKyNpZmRlZiBBV0VfQUxMT1dfU0FNUExFX1NIQVJJTkcKKwkJaWYgKHNmICYmIHNmLT5zaGFyZWQpIHsKKwkJCWlmIChpbmZvX2R1cGxpY2F0ZWQoc2YsIHJlYykpIHsKKwkJCQlrZnJlZShyZWMpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisjZW5kaWYgLyogYWxsb3cgc2hhcmluZyAqLworCQlpZiAocmVjLT52Lm1vZGUgJiBBV0VfTU9ERV9JTklUX1BBUk0pCisJCQlhd2VfaW5pdF92b2ljZV9wYXJtKCZyZWMtPnYucGFybSk7CisJCWFkZF9zZl9pbmZvKHNmLCByZWMpOworCQlhd2Vfc2V0X3NhbXBsZShyZWMpOworCQlhZGRfaW5mb19saXN0KHJlYyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyogcmVtb3ZlIGluc3RydW1lbnQgbGF5ZXJzICovCitzdGF0aWMgaW50Cithd2VfcmVtb3ZlX2luZm8oYXdlX3BhdGNoX2luZm8gKnBhdGNoLCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGNoYXIgYmFuaywgaW5zdHI7CisJc2ZfbGlzdCAqc2Y7CisKKwlpZiAoISBwYXRjaF9vcGVuZWQgfHwgKHNmID0gc2Z0YWlsKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyOiByZW1vdmVfaW5mbzogcGF0Y2ggbm90IG9wZW5lZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWJhbmsgPSAoKHVuc2lnbmVkIHNob3J0KXBhdGNoLT5vcHRhcmcgPj4gOCkgJiAweGZmOworCWluc3RyID0gKHVuc2lnbmVkIHNob3J0KXBhdGNoLT5vcHRhcmcgJiAweGZmOworCWlmICghIHJlbW92ZV9pbmZvKHNmLCBiYW5rLCBpbnN0cikpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisKKy8qIGxvYWQgd2F2ZSBzYW1wbGUgZGF0YSAqLworc3RhdGljIGludAorYXdlX2xvYWRfZGF0YShhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisJaW50IG9mZnNldCwgc2l6ZTsKKwlpbnQgcmM7CisJYXdlX3NhbXBsZV9pbmZvIHRtcHJlYzsKKwlhd2Vfc2FtcGxlX2xpc3QgKnJlYzsKKwlzZl9saXN0ICpzZjsKKworCWlmICgoc2YgPSBjaGVja19wYXRjaF9vcGVuZWQoQVdFX1BBVF9UWVBFX01JU0MsIE5VTEwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNpemUgPSAoY291bnQgLSBBV0VfU0FNUExFX0lORk9fU0laRSkgLyAyOworCW9mZnNldCA9IEFXRV9QQVRDSF9JTkZPX1NJWkU7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ0bXByZWMsIGFkZHIgKyBvZmZzZXQsIEFXRV9TQU1QTEVfSU5GT19TSVpFKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJb2Zmc2V0ICs9IEFXRV9TQU1QTEVfSU5GT19TSVpFOworCWlmIChzaXplICE9IHRtcHJlYy5zaXplKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyOiBsb2FkOiBzYW1wbGUgc2l6ZSBkaWZmZXJlZCAoJWQgIT0gJWQpXG4iLAorCQkgICAgICAgdG1wcmVjLnNpemUsIHNpemUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoc2VhcmNoX3NhbXBsZV9pbmRleChzZiwgdG1wcmVjLnNhbXBsZSkgIT0gTlVMTCkgeworI2lmZGVmIEFXRV9BTExPV19TQU1QTEVfU0hBUklORworCQkvKiBpZiBzaGFyZWQgc2FtcGxlLCBza2lwIHRoaXMgZGF0YSAqLworCQlpZiAoc2YtPnR5cGUgJiBBV0VfUEFUX1NIQVJFRCkKKwkJCXJldHVybiAwOworI2VuZGlmIC8qIGFsbG93IHNoYXJpbmcgKi8KKwkJREVCVUcoMSxwcmludGsoIkFXRTMyOiBzYW1wbGUgZGF0YSAlZCBhbHJlYWR5IHByZXNlbnRcbiIsIHRtcHJlYy5zYW1wbGUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKChyZWMgPSBhbGxvY19uZXdfc2FtcGxlKCkpID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KCZyZWMtPnYsICZ0bXByZWMsIHNpemVvZih0bXByZWMpKTsKKworCWlmIChyZWMtPnYuc2l6ZSA+IDApIHsKKwkJaWYgKChyYyA9IGF3ZV93cml0ZV93YXZlX2RhdGEoYWRkciwgb2Zmc2V0LCByZWMsIC0xKSkgPCAwKSB7CisJCQlrZnJlZShyZWMpOworCQkJcmV0dXJuIHJjOworCQl9CisJCXNmLT5tZW1fcHRyICs9IHJjOworCX0KKworCWFkZF9zZl9zYW1wbGUoc2YsIHJlYyk7CisJcmV0dXJuIDA7Cit9CisKKworLyogcmVwbGFjZSB3YXZlIHNhbXBsZSBkYXRhICovCitzdGF0aWMgaW50Cithd2VfcmVwbGFjZV9kYXRhKGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCkKK3sKKwlpbnQgb2Zmc2V0OworCWludCBzaXplOworCWludCByYzsKKwlpbnQgY2hhbm5lbHM7CisJYXdlX3NhbXBsZV9pbmZvIGN1cnNtcDsKKwlpbnQgc2F2ZV9tZW1fcHRyOworCXNmX2xpc3QgKnNmOworCWF3ZV9zYW1wbGVfbGlzdCAqcmVjOworCisJaWYgKCEgcGF0Y2hfb3BlbmVkIHx8IChzZiA9IHNmdGFpbCkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMjogcmVwbGFjZTogcGF0Y2ggbm90IG9wZW5lZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNpemUgPSAoY291bnQgLSBBV0VfU0FNUExFX0lORk9fU0laRSkgLyAyOworCW9mZnNldCA9IEFXRV9QQVRDSF9JTkZPX1NJWkU7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZjdXJzbXAsIGFkZHIgKyBvZmZzZXQsIEFXRV9TQU1QTEVfSU5GT19TSVpFKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJb2Zmc2V0ICs9IEFXRV9TQU1QTEVfSU5GT19TSVpFOworCWlmIChjdXJzbXAuc2l6ZSA9PSAwIHx8IHNpemUgIT0gY3Vyc21wLnNpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzI6IHJlcGxhY2U6IGludmFsaWQgc2FtcGxlIHNpemUgKCVkIT0lZClcbiIsCisJCSAgICAgICBjdXJzbXAuc2l6ZSwgc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwljaGFubmVscyA9IHBhdGNoLT5vcHRhcmc7CisJaWYgKGNoYW5uZWxzIDw9IDAgfHwgY2hhbm5lbHMgPiBBV0VfTk9STUFMX1ZPSUNFUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMjogcmVwbGFjZTogaW52YWxpZCBjaGFubmVscyAlZFxuIiwgY2hhbm5lbHMpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlmb3IgKHJlYyA9IHNmLT5zYW1wbGVzOyByZWM7IHJlYyA9IHJlYy0+bmV4dCkgeworCQlpZiAocmVjLT52LnNhbXBsZSA9PSBjdXJzbXAuc2FtcGxlKQorCQkJYnJlYWs7CisJfQorCWlmIChyZWMgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMjogcmVwbGFjZTogY2Fubm90IGZpbmQgZXhpc3Rpbmcgc2FtcGxlIGRhdGEgJWRcbiIsCisJCSAgICAgICBjdXJzbXAuc2FtcGxlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQkKKwlpZiAocmVjLT52LnNpemUgIT0gY3Vyc21wLnNpemUpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzI6IHJlcGxhY2U6IGV4aXRpbmcgc2l6ZSBkaWZmZXJlZCAoJWQhPSVkKVxuIiwKKwkJICAgICAgIHJlYy0+di5zaXplLCBjdXJzbXAuc2l6ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNhdmVfbWVtX3B0ciA9IGF3ZV9mcmVlX21lbV9wdHIoKTsKKwlzZnRhaWwtPm1lbV9wdHIgPSByZWMtPnYuc3RhcnQgLSBhd2VfbWVtX3N0YXJ0OworCW1lbWNweSgmcmVjLT52LCAmY3Vyc21wLCBzaXplb2YoY3Vyc21wKSk7CisJcmVjLT52LnNmX2lkID0gY3VycmVudF9zZl9pZDsKKwlpZiAoKHJjID0gYXdlX3dyaXRlX3dhdmVfZGF0YShhZGRyLCBvZmZzZXQsIHJlYywgY2hhbm5lbHMpKSA8IDApCisJCXJldHVybiByYzsKKwlzZnRhaWwtPm1lbV9wdHIgPSBzYXZlX21lbV9wdHI7CisKKwlyZXR1cm4gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgY2hhciBfX3VzZXIgKnJlYWRidWZfYWRkcjsKK3N0YXRpYyBpbnQgcmVhZGJ1Zl9vZmZzOworc3RhdGljIGludCByZWFkYnVmX2ZsYWdzOworCisvKiBpbml0aWFsaXplIHJlYWQgYnVmZmVyICovCitzdGF0aWMgaW50CityZWFkYnVmX2luaXQoY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBvZmZzZXQsIGF3ZV9zYW1wbGVfaW5mbyAqc3ApCit7CisJcmVhZGJ1Zl9hZGRyID0gYWRkcjsKKwlyZWFkYnVmX29mZnMgPSBvZmZzZXQ7CisJcmVhZGJ1Zl9mbGFncyA9IHNwLT5tb2RlX2ZsYWdzOworCXJldHVybiAwOworfQorCisvKiByZWFkIGRpcmVjdGx5IGZyb20gdXNlciBidWZmZXIgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydAorcmVhZGJ1Zl93b3JkKGludCBwb3MpCit7CisJdW5zaWduZWQgc2hvcnQgYzsKKwkvKiByZWFkIGZyb20gdXNlciBidWZmZXIgKi8KKwlpZiAocmVhZGJ1Zl9mbGFncyAmIEFXRV9TQU1QTEVfOEJJVFMpIHsKKwkJdW5zaWduZWQgY2hhciBjYzsKKwkJZ2V0X3VzZXIoY2MsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKShyZWFkYnVmX2FkZHIgKyByZWFkYnVmX29mZnMgKyBwb3MpKTsKKwkJYyA9ICh1bnNpZ25lZCBzaG9ydCljYyA8PCA4OyAvKiBjb252ZXJ0IDhiaXQgLT4gMTZiaXQgKi8KKwl9IGVsc2UgeworCQlnZXRfdXNlcihjLCAodW5zaWduZWQgc2hvcnQgX191c2VyICopKHJlYWRidWZfYWRkciArIHJlYWRidWZfb2ZmcyArIHBvcyAqIDIpKTsKKwl9CisJaWYgKHJlYWRidWZfZmxhZ3MgJiBBV0VfU0FNUExFX1VOU0lHTkVEKQorCQljIF49IDB4ODAwMDsgLyogdW5zaWduZWQgLT4gc2lnbmVkICovCisJcmV0dXJuIGM7Cit9CisKKyNkZWZpbmUgcmVhZGJ1Zl93b3JkX2NhY2hlCXJlYWRidWZfd29yZAorI2RlZmluZSByZWFkYnVmX2VuZCgpCQkvKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgQkxBTktfTE9PUF9TVEFSVAk4CisjZGVmaW5lIEJMQU5LX0xPT1BfRU5ECQk0MAorI2RlZmluZSBCTEFOS19MT09QX1NJWkUJCTQ4CisKKy8qIGxvYWRpbmcgb250byBtZW1vcnkgLSByZXR1cm4gdGhlIGFjdHVhbCB3cml0dGVuIHNpemUgKi8KK3N0YXRpYyBpbnQgCithd2Vfd3JpdGVfd2F2ZV9kYXRhKGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgb2Zmc2V0LCBhd2Vfc2FtcGxlX2xpc3QgKmxpc3QsIGludCBjaGFubmVscykKK3sKKwlpbnQgaSwgdHJ1ZXNpemUsIGRyYW1fb2Zmc2V0OworCWF3ZV9zYW1wbGVfaW5mbyAqc3AgPSAmbGlzdC0+djsKKwlpbnQgcmM7CisKKwkvKiBiZSBzdXJlIGxvb3AgcG9pbnRzIHN0YXJ0IDwgZW5kICovCisJaWYgKHNwLT5sb29wc3RhcnQgPiBzcC0+bG9vcGVuZCkgeworCQlpbnQgdG1wID0gc3AtPmxvb3BzdGFydDsKKwkJc3AtPmxvb3BzdGFydCA9IHNwLT5sb29wZW5kOworCQlzcC0+bG9vcGVuZCA9IHRtcDsKKwl9CisKKwkvKiBjb21wdXRlIHRydWUgZGF0YSBzaXplIHRvIGJlIGxvYWRlZCAqLworCXRydWVzaXplID0gc3AtPnNpemU7CisJaWYgKHNwLT5tb2RlX2ZsYWdzICYgKEFXRV9TQU1QTEVfQklESVJfTE9PUHxBV0VfU0FNUExFX1JFVkVSU0VfTE9PUCkpCisJCXRydWVzaXplICs9IHNwLT5sb29wZW5kIC0gc3AtPmxvb3BzdGFydDsKKwlpZiAoc3AtPm1vZGVfZmxhZ3MgJiBBV0VfU0FNUExFX05PX0JMQU5LKQorCQl0cnVlc2l6ZSArPSBCTEFOS19MT09QX1NJWkU7CisJaWYgKGF3ZV9mcmVlX21lbV9wdHIoKSArIHRydWVzaXplID49IG1lbXNpemUvMikgeworCQlERUJVRygtMSxwcmludGsoIkFXRTMyIEVycm9yOiBTYW1wbGUgbWVtb3J5IGZ1bGxcbiIpKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJLyogcmVjYWxjdWxhdGUgYWRkcmVzcyBvZmZzZXQgKi8KKwlzcC0+ZW5kIC09IHNwLT5zdGFydDsKKwlzcC0+bG9vcHN0YXJ0IC09IHNwLT5zdGFydDsKKwlzcC0+bG9vcGVuZCAtPSBzcC0+c3RhcnQ7CisKKwlkcmFtX29mZnNldCA9IGF3ZV9mcmVlX21lbV9wdHIoKSArIGF3ZV9tZW1fc3RhcnQ7CisJc3AtPnN0YXJ0ID0gZHJhbV9vZmZzZXQ7CisJc3AtPmVuZCArPSBkcmFtX29mZnNldDsKKwlzcC0+bG9vcHN0YXJ0ICs9IGRyYW1fb2Zmc2V0OworCXNwLT5sb29wZW5kICs9IGRyYW1fb2Zmc2V0OworCisJLyogc2V0IHRoZSB0b3RhbCBzaXplIChzdG9yZSBvbnRvIG9ic29sZXRlIGNoZWNrc3VtIHZhbHVlKSAqLworCWlmIChzcC0+c2l6ZSA9PSAwKQorCQlzcC0+Y2hlY2tzdW0gPSAwOworCWVsc2UKKwkJc3AtPmNoZWNrc3VtID0gdHJ1ZXNpemU7CisKKwlpZiAoKHJjID0gYXdlX29wZW5fZHJhbV9mb3Jfd3JpdGUoZHJhbV9vZmZzZXQsIGNoYW5uZWxzKSkgIT0gMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKHJlYWRidWZfaW5pdChhZGRyLCBvZmZzZXQsIHNwKSA8IDApCisJCXJldHVybiAtRU5PU1BDOworCisJZm9yIChpID0gMDsgaSA8IHNwLT5zaXplOyBpKyspIHsKKwkJdW5zaWduZWQgc2hvcnQgYzsKKwkJYyA9IHJlYWRidWZfd29yZChpKTsKKwkJYXdlX3dyaXRlX2RyYW0oYyk7CisJCWlmIChpID09IHNwLT5sb29wZW5kICYmCisJCSAgICAoc3AtPm1vZGVfZmxhZ3MgJiAoQVdFX1NBTVBMRV9CSURJUl9MT09QfEFXRV9TQU1QTEVfUkVWRVJTRV9MT09QKSkpIHsKKwkJCWludCBsb29wbGVuID0gc3AtPmxvb3BlbmQgLSBzcC0+bG9vcHN0YXJ0OworCQkJLyogY29weSByZXZlcnNlIGxvb3AgKi8KKwkJCWludCBrOworCQkJZm9yIChrID0gMTsgayA8PSBsb29wbGVuOyBrKyspIHsKKwkJCQljID0gcmVhZGJ1Zl93b3JkX2NhY2hlKGkgLSBrKTsKKwkJCQlhd2Vfd3JpdGVfZHJhbShjKTsKKwkJCX0KKwkJCWlmIChzcC0+bW9kZV9mbGFncyAmIEFXRV9TQU1QTEVfQklESVJfTE9PUCkgeworCQkJCXNwLT5lbmQgKz0gbG9vcGxlbjsKKwkJCX0gZWxzZSB7CisJCQkJc3AtPnN0YXJ0ICs9IGxvb3BsZW47CisJCQkJc3AtPmVuZCArPSBsb29wbGVuOworCQkJfQorCQl9CisJfQorCXJlYWRidWZfZW5kKCk7CisKKwkvKiBpZiBubyBibGFuayBsb29wIGlzIGF0dGFjaGVkIGluIHRoZSBzYW1wbGUsIGFkZCBpdCAqLworCWlmIChzcC0+bW9kZV9mbGFncyAmIEFXRV9TQU1QTEVfTk9fQkxBTkspIHsKKwkJZm9yIChpID0gMDsgaSA8IEJMQU5LX0xPT1BfU0laRTsgaSsrKQorCQkJYXdlX3dyaXRlX2RyYW0oMCk7CisJCWlmIChzcC0+bW9kZV9mbGFncyAmIEFXRV9TQU1QTEVfU0lOR0xFU0hPVCkgeworCQkJc3AtPmxvb3BzdGFydCA9IHNwLT5lbmQgKyBCTEFOS19MT09QX1NUQVJUOworCQkJc3AtPmxvb3BlbmQgPSBzcC0+ZW5kICsgQkxBTktfTE9PUF9FTkQ7CisJCX0KKwl9CisKKwlhd2VfY2xvc2VfZHJhbSgpOworCisJLyogaW5pdGlhbGl6ZSBGTSAqLworCWF3ZV9pbml0X2ZtKCk7CisKKwlyZXR1cm4gdHJ1ZXNpemU7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmZGVmIEFXRV9IQVNfR1VTX0NPTVBBVElCSUxJVFkKKworLyogY2FsY3VsYXRlIEdVUyBlbnZlbG9wZSB0aW1lOgorICogaXMgdGhpcyBjb3JyZWN0PyAgaSBoYXZlIG5vIGlkZWEuLgorICovCitzdGF0aWMgaW50CitjYWxjX2d1c19lbnZlbG9wZV90aW1lKGludCByYXRlLCBpbnQgc3RhcnQsIGludCBlbmQpCit7CisJaW50IHIsIHAsIHQ7CisJciA9ICgzIC0gKChyYXRlID4+IDYpICYgMykpICogMzsKKwlwID0gcmF0ZSAmIDB4M2Y7CisJdCA9IGVuZCAtIHN0YXJ0OworCWlmICh0IDwgMCkgdCA9IC10OworCWlmICgxMyA+IHIpCisJCXQgPSB0IDw8ICgxMyAtIHIpOworCWVsc2UKKwkJdCA9IHQgPj4gKHIgLSAxMyk7CisJcmV0dXJuICh0ICogMTApIC8gKHAgKiA0NDEpOworfQorCisjZGVmaW5lIGNhbGNfZ3VzX3N1c3RhaW4odmFsKSAgKDB4N2YgLSB2b2xfdGFibGVbKHZhbCkvMl0pCisjZGVmaW5lIGNhbGNfZ3VzX2F0dGVudWF0aW9uKHZhbCkJdm9sX3RhYmxlWyh2YWwpLzJdCisKKy8qIGxvYWQgR1VTIHBhdGNoICovCitzdGF0aWMgaW50Cithd2VfbG9hZF9ndXNwYXRjaChjb25zdCBjaGFyIF9fdXNlciAqYWRkciwgaW50IG9mZnMsIGludCBzaXplLCBpbnQgcG1ncl9mbGFnKQoreworCXN0cnVjdCBwYXRjaF9pbmZvIHBhdGNoOworCWF3ZV92b2ljZV9pbmZvICpyZWM7CisJYXdlX3NhbXBsZV9pbmZvICpzbXA7CisJYXdlX3ZvaWNlX2xpc3QgKnZyZWM7CisJYXdlX3NhbXBsZV9saXN0ICpzbXByZWM7CisJaW50IHNpemVvZl9wYXRjaDsKKwlpbnQgbm90ZSwgcmM7CisJc2ZfbGlzdCAqc2Y7CisKKwlzaXplb2ZfcGF0Y2ggPSAoaW50KSgobG9uZykmcGF0Y2guZGF0YVswXSAtIChsb25nKSZwYXRjaCk7IC8qIGhlYWRlciBzaXplICovCisJaWYgKHNpemUgPCBzaXplb2ZfcGF0Y2gpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IFBhdGNoIGhlYWRlciB0b28gc2hvcnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCgoY2hhciopJnBhdGNoKSArIG9mZnMsIGFkZHIgKyBvZmZzLCBzaXplb2ZfcGF0Y2ggLSBvZmZzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc2l6ZSAtPSBzaXplb2ZfcGF0Y2g7CisJaWYgKHNpemUgPCBwYXRjaC5sZW4pIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IFBhdGNoIHJlY29yZCB0b28gc2hvcnQgKCVkPCVkKVxuIiwKKwkJICAgICAgIHNpemUsIHBhdGNoLmxlbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoKHNmID0gY2hlY2tfcGF0Y2hfb3BlbmVkKEFXRV9QQVRfVFlQRV9HVVMsIE5VTEwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoKHNtcHJlYyA9IGFsbG9jX25ld19zYW1wbGUoKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKCh2cmVjID0gYWxsb2NfbmV3X2luZm8oKSkgPT0gTlVMTCkgeworCQlrZnJlZShzbXByZWMpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzbXAgPSAmc21wcmVjLT52OworCXNtcC0+c2FtcGxlID0gc2YtPm51bV9zYW1wbGU7CisJc21wLT5zdGFydCA9IDA7CisJc21wLT5lbmQgPSBwYXRjaC5sZW47CisJc21wLT5sb29wc3RhcnQgPSBwYXRjaC5sb29wX3N0YXJ0OworCXNtcC0+bG9vcGVuZCA9IHBhdGNoLmxvb3BfZW5kOworCXNtcC0+c2l6ZSA9IHBhdGNoLmxlbjsKKworCS8qIHNldCB1cCBtb2RlIGZsYWdzICovCisJc21wLT5tb2RlX2ZsYWdzID0gMDsKKwlpZiAoIShwYXRjaC5tb2RlICYgV0FWRV8xNl9CSVRTKSkKKwkJc21wLT5tb2RlX2ZsYWdzIHw9IEFXRV9TQU1QTEVfOEJJVFM7CisJaWYgKHBhdGNoLm1vZGUgJiBXQVZFX1VOU0lHTkVEKQorCQlzbXAtPm1vZGVfZmxhZ3MgfD0gQVdFX1NBTVBMRV9VTlNJR05FRDsKKwlzbXAtPm1vZGVfZmxhZ3MgfD0gQVdFX1NBTVBMRV9OT19CTEFOSzsKKwlpZiAoIShwYXRjaC5tb2RlICYgKFdBVkVfTE9PUElOR3xXQVZFX0JJRElSX0xPT1B8V0FWRV9MT09QX0JBQ0spKSkKKwkJc21wLT5tb2RlX2ZsYWdzIHw9IEFXRV9TQU1QTEVfU0lOR0xFU0hPVDsKKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfQklESVJfTE9PUCkKKwkJc21wLT5tb2RlX2ZsYWdzIHw9IEFXRV9TQU1QTEVfQklESVJfTE9PUDsKKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfTE9PUF9CQUNLKQorCQlzbXAtPm1vZGVfZmxhZ3MgfD0gQVdFX1NBTVBMRV9SRVZFUlNFX0xPT1A7CisKKwlERUJVRygwLHByaW50aygiQVdFMzI6IFtzYW1wbGUgJWQgbW9kZSAleF1cbiIsIHBhdGNoLmluc3RyX25vLCBzbXAtPm1vZGVfZmxhZ3MpKTsKKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfMTZfQklUUykgeworCQkvKiBjb252ZXJ0IHRvIHdvcmQgb2Zmc2V0cyAqLworCQlzbXAtPnNpemUgLz0gMjsKKwkJc21wLT5lbmQgLz0gMjsKKwkJc21wLT5sb29wc3RhcnQgLz0gMjsKKwkJc21wLT5sb29wZW5kIC89IDI7CisJfQorCXNtcC0+Y2hlY2tzdW1fZmxhZyA9IDA7CisJc21wLT5jaGVja3N1bSA9IDA7CisKKwlpZiAoKHJjID0gYXdlX3dyaXRlX3dhdmVfZGF0YShhZGRyLCBzaXplb2ZfcGF0Y2gsIHNtcHJlYywgLTEpKSA8IDApCisJCXJldHVybiByYzsKKwlzZi0+bWVtX3B0ciArPSByYzsKKwlhZGRfc2Zfc2FtcGxlKHNmLCBzbXByZWMpOworCisJLyogc2V0IHVwIHZvaWNlIGluZm8gKi8KKwlyZWMgPSAmdnJlYy0+djsKKwlhd2VfaW5pdF92b2ljZV9pbmZvKHJlYyk7CisJcmVjLT5zYW1wbGUgPSBzZi0+bnVtX2luZm87IC8qIHRoZSBsYXN0IHNhbXBsZSAqLworCXJlYy0+cmF0ZV9vZmZzZXQgPSBjYWxjX3JhdGVfb2Zmc2V0KHBhdGNoLmJhc2VfZnJlcSk7CisJbm90ZSA9IGZyZXFfdG9fbm90ZShwYXRjaC5iYXNlX25vdGUpOworCXJlYy0+cm9vdCA9IG5vdGUgLyAxMDA7CisJcmVjLT50dW5lID0gLShub3RlICUgMTAwKTsKKwlyZWMtPmxvdyA9IGZyZXFfdG9fbm90ZShwYXRjaC5sb3dfbm90ZSkgLyAxMDA7CisJcmVjLT5oaWdoID0gZnJlcV90b19ub3RlKHBhdGNoLmhpZ2hfbm90ZSkgLyAxMDA7CisJREVCVUcoMSxwcmludGsoIkFXRTMyOiBbZ3VzIGJhc2Ugb2Zmc2V0PSVkLCBub3RlPSVkLCByYW5nZT0lZC0lZCglZC0lZCldXG4iLAorCQkgICAgICAgcmVjLT5yYXRlX29mZnNldCwgbm90ZSwKKwkJICAgICAgIHJlYy0+bG93LCByZWMtPmhpZ2gsCisJICAgICAgcGF0Y2gubG93X25vdGUsIHBhdGNoLmhpZ2hfbm90ZSkpOworCS8qIHBhbm5pbmcgcG9zaXRpb247IC0xMjggLSAxMjcgPT4gMC0xMjcgKi8KKwlyZWMtPnBhbiA9IChwYXRjaC5wYW5uaW5nICsgMTI4KSAvIDI7CisKKwkvKiBkZXR1bmluZyBpcyBpZ25vcmVkICovCisJLyogNnBvaW50cyB2b2x1bWUgZW52ZWxvcGUgKi8KKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfRU5WRUxPUEVTKSB7CisJCWludCBhdHRhY2ssIGhvbGQsIGRlY2F5LCByZWxlYXNlOworCQlhdHRhY2sgPSBjYWxjX2d1c19lbnZlbG9wZV90aW1lCisJCQkocGF0Y2guZW52X3JhdGVbMF0sIDAsIHBhdGNoLmVudl9vZmZzZXRbMF0pOworCQlob2xkID0gY2FsY19ndXNfZW52ZWxvcGVfdGltZQorCQkJKHBhdGNoLmVudl9yYXRlWzFdLCBwYXRjaC5lbnZfb2Zmc2V0WzBdLAorCQkJIHBhdGNoLmVudl9vZmZzZXRbMV0pOworCQlkZWNheSA9IGNhbGNfZ3VzX2VudmVsb3BlX3RpbWUKKwkJCShwYXRjaC5lbnZfcmF0ZVsyXSwgcGF0Y2guZW52X29mZnNldFsxXSwKKwkJCSBwYXRjaC5lbnZfb2Zmc2V0WzJdKTsKKwkJcmVsZWFzZSA9IGNhbGNfZ3VzX2VudmVsb3BlX3RpbWUKKwkJCShwYXRjaC5lbnZfcmF0ZVszXSwgcGF0Y2guZW52X29mZnNldFsxXSwKKwkJCSBwYXRjaC5lbnZfb2Zmc2V0WzRdKTsKKwkJcmVsZWFzZSArPSBjYWxjX2d1c19lbnZlbG9wZV90aW1lCisJCQkocGF0Y2guZW52X3JhdGVbNF0sIHBhdGNoLmVudl9vZmZzZXRbM10sCisJCQkgcGF0Y2guZW52X29mZnNldFs0XSk7CisJCXJlbGVhc2UgKz0gY2FsY19ndXNfZW52ZWxvcGVfdGltZQorCQkJKHBhdGNoLmVudl9yYXRlWzVdLCBwYXRjaC5lbnZfb2Zmc2V0WzRdLAorCQkJIHBhdGNoLmVudl9vZmZzZXRbNV0pOworCQlyZWMtPnBhcm0udm9sYXRraGxkID0gKGNhbGNfcGFybV9ob2xkKGhvbGQpIDw8IDgpIHwKKwkJCWNhbGNfcGFybV9hdHRhY2soYXR0YWNrKTsKKwkJcmVjLT5wYXJtLnZvbGRjeXN1cyA9IChjYWxjX2d1c19zdXN0YWluKHBhdGNoLmVudl9vZmZzZXRbMl0pIDw8IDgpIHwKKwkJCWNhbGNfcGFybV9kZWNheShkZWNheSk7CisJCXJlYy0+cGFybS52b2xyZWxlYXNlID0gMHg4MDAwIHwgY2FsY19wYXJtX2RlY2F5KHJlbGVhc2UpOworCQlERUJVRygyLHByaW50aygiQVdFMzI6IFtndXNlbnYgYXRrPSVkLCBobGQ9JWQsIGRjeT0lZCwgcmVsPSVkXVxuIiwgYXR0YWNrLCBob2xkLCBkZWNheSwgcmVsZWFzZSkpOworCQlyZWMtPmF0dGVudWF0aW9uID0gY2FsY19ndXNfYXR0ZW51YXRpb24ocGF0Y2guZW52X29mZnNldFswXSk7CisJfQorCisJLyogdHJlbW9sbyBlZmZlY3QgKi8KKwlpZiAocGF0Y2gubW9kZSAmIFdBVkVfVFJFTU9MTykgeworCQlpbnQgcmF0ZSA9IChwYXRjaC50cmVtb2xvX3JhdGUgKiAxMDAwIC8gMzgpIC8gNDI7CisJCXJlYy0+cGFybS50cmVtZnJxID0gKChwYXRjaC50cmVtb2xvX2RlcHRoIC8gMikgPDwgOCkgfCByYXRlOworCQlERUJVRygyLHByaW50aygiQVdFMzI6IFtndXNlbnYgdHJlbW9sbyByYXRlPSVkLCBkZXA9JWQsIHRyZW1mcnE9JXhdXG4iLAorCQkJICAgICAgIHBhdGNoLnRyZW1vbG9fcmF0ZSwgcGF0Y2gudHJlbW9sb19kZXB0aCwKKwkJCSAgICAgICByZWMtPnBhcm0udHJlbWZycSkpOworCX0KKwkvKiB2aWJyYXRvIGVmZmVjdCAqLworCWlmIChwYXRjaC5tb2RlICYgV0FWRV9WSUJSQVRPKSB7CisJCWludCByYXRlID0gKHBhdGNoLnZpYnJhdG9fcmF0ZSAqIDEwMDAgLyAzOCkgLyA0MjsKKwkJcmVjLT5wYXJtLmZtMmZycTIgPSAoKHBhdGNoLnZpYnJhdG9fZGVwdGggLyA2KSA8PCA4KSB8IHJhdGU7CisJCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW2d1c2VudiB2aWJyYXRvIHJhdGU9JWQsIGRlcD0lZCwgdHJlbWZycT0leF1cbiIsCisJCQkgICAgICAgcGF0Y2gudHJlbW9sb19yYXRlLCBwYXRjaC50cmVtb2xvX2RlcHRoLAorCQkJICAgICAgIHJlYy0+cGFybS50cmVtZnJxKSk7CisJfQorCQorCS8qIHNjYWxlX2ZyZXEsIHNjYWxlX2ZhY3Rvciwgdm9sdW1lLCBhbmQgZnJhY3Rpb25zIG5vdCBpbXBsZW1lbnRlZCAqLworCisJLyogYXBwZW5kIHRvIHRoZSB0YWlsIG9mIHRoZSBsaXN0ICovCisJdnJlYy0+YmFuayA9IGN0cmxzW0FXRV9NRF9HVVNfQkFOS107CisJdnJlYy0+aW5zdHIgPSBwYXRjaC5pbnN0cl9ubzsKKwl2cmVjLT5kaXNhYmxlZCA9IEZBTFNFOworCXZyZWMtPnR5cGUgPSBWX1NUX05PUk1BTDsKKworCWFkZF9zZl9pbmZvKHNmLCB2cmVjKTsKKwlhZGRfaW5mb19saXN0KHZyZWMpOworCisJLyogc2V0IHRoZSB2b2ljZSBpbmRleCAqLworCWF3ZV9zZXRfc2FtcGxlKHZyZWMpOworCisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLyogQVdFX0hBU19HVVNfQ09NUEFUSUJJTElUWSAqLworCisvKgorICogc2FtcGxlIGFuZCB2b2ljZSBsaXN0IGhhbmRsZXJzCisgKi8KKworLyogYXBwZW5kIHRoaXMgdG8gdGhlIGN1cnJlbnQgc2YgbGlzdCAqLworc3RhdGljIHZvaWQgYWRkX3NmX2luZm8oc2ZfbGlzdCAqc2YsIGF3ZV92b2ljZV9saXN0ICpyZWMpCit7CisJaWYgKHNmID09IE5VTEwpCisJCXJldHVybjsKKwlyZWMtPmhvbGRlciA9IHNmOworCXJlYy0+di5zZl9pZCA9IHNmLT5zZl9pZDsKKwlpZiAoc2YtPmxhc3RfaW5mb3MpCisJCXNmLT5sYXN0X2luZm9zLT5uZXh0ID0gcmVjOworCWVsc2UKKwkJc2YtPmluZm9zID0gcmVjOworCXNmLT5sYXN0X2luZm9zID0gcmVjOworCXJlYy0+bmV4dCA9IE5VTEw7CisJc2YtPm51bV9pbmZvKys7Cit9CisKKy8qIHByZXBlbmQgdGhpcyBzYW1wbGUgdG8gc2YgbGlzdCAqLworc3RhdGljIHZvaWQgYWRkX3NmX3NhbXBsZShzZl9saXN0ICpzZiwgYXdlX3NhbXBsZV9saXN0ICpyZWMpCit7CisJaWYgKHNmID09IE5VTEwpCisJCXJldHVybjsKKwlyZWMtPmhvbGRlciA9IHNmOworCXJlYy0+di5zZl9pZCA9IHNmLT5zZl9pZDsKKwlpZiAoc2YtPmxhc3Rfc2FtcGxlcykKKwkJc2YtPmxhc3Rfc2FtcGxlcy0+bmV4dCA9IHJlYzsKKwllbHNlCisJCXNmLT5zYW1wbGVzID0gcmVjOworCXNmLT5sYXN0X3NhbXBsZXMgPSByZWM7CisJcmVjLT5uZXh0ID0gTlVMTDsKKwlzZi0+bnVtX3NhbXBsZSsrOworfQorCisvKiBwdXJnZSB0aGUgb2xkIHJlY29yZHMgd2hpY2ggZG9uJ3QgYmVsb25nIHdpdGggdGhlIHNhbWUgZmlsZSBpZCAqLworc3RhdGljIHZvaWQgcHVyZ2Vfb2xkX2xpc3QoYXdlX3ZvaWNlX2xpc3QgKnJlYywgYXdlX3ZvaWNlX2xpc3QgKm5leHQpCit7CisJcmVjLT5uZXh0X2luc3RyID0gbmV4dDsKKwlpZiAocmVjLT5iYW5rID09IEFXRV9EUlVNX0JBTkspIHsKKwkJLyogcmVtb3ZlIHNhbXBsZXMgd2l0aCB0aGUgc2FtZSBub3RlIHJhbmdlICovCisJCWF3ZV92b2ljZV9saXN0ICpjdXIsICpwcmV2ID0gcmVjOworCQlpbnQgbG93ID0gcmVjLT52LmxvdzsKKwkJaW50IGhpZ2ggPSByZWMtPnYuaGlnaDsKKwkJZm9yIChjdXIgPSBuZXh0OyBjdXI7IGN1ciA9IGN1ci0+bmV4dF9pbnN0cikgeworCQkJaWYgKGN1ci0+di5sb3cgPT0gbG93ICYmCisJCQkgICAgY3VyLT52LmhpZ2ggPT0gaGlnaCAmJgorCQkJICAgICEgaXNfaWRlbnRpY2FsX2hvbGRlcihjdXItPmhvbGRlciwgcmVjLT5ob2xkZXIpKQorCQkJCXByZXYtPm5leHRfaW5zdHIgPSBjdXItPm5leHRfaW5zdHI7CisJCQllbHNlCisJCQkJcHJldiA9IGN1cjsKKwkJfQorCX0gZWxzZSB7CisJCWlmICghIGlzX2lkZW50aWNhbF9ob2xkZXIobmV4dC0+aG9sZGVyLCByZWMtPmhvbGRlcikpCisJCQkvKiByZW1vdmUgYWxsIHNhbXBsZXMgKi8KKwkJCXJlYy0+bmV4dF9pbnN0ciA9IE5VTEw7CisJfQorfQorCisvKiBwcmVwZW5kIHRvIHRvcCBvZiB0aGUgcHJlc2V0IHRhYmxlICovCitzdGF0aWMgdm9pZCBhZGRfaW5mb19saXN0KGF3ZV92b2ljZV9saXN0ICpyZWMpCit7CisJYXdlX3ZvaWNlX2xpc3QgKnByZXYsICpjdXI7CisJaW50IGtleTsKKworCWlmIChyZWMtPmRpc2FibGVkKQorCQlyZXR1cm47CisKKwlrZXkgPSBhd2Vfc2VhcmNoX2tleShyZWMtPmJhbmssIHJlYy0+aW5zdHIsIHJlYy0+di5sb3cpOworCXByZXYgPSBOVUxMOworCWZvciAoY3VyID0gcHJlc2V0X3RhYmxlW2tleV07IGN1cjsgY3VyID0gY3VyLT5uZXh0X2JhbmspIHsKKwkJLyogc2VhcmNoIHRoZSBmaXJzdCByZWNvcmQgd2l0aCB0aGUgc2FtZSBiYW5rIG51bWJlciAqLworCQlpZiAoY3VyLT5pbnN0ciA9PSByZWMtPmluc3RyICYmIGN1ci0+YmFuayA9PSByZWMtPmJhbmspIHsKKwkJCS8qIHJlcGxhY2UgdGhlIGxpc3Qgd2l0aCB0aGUgbmV3IHJlY29yZCAqLworCQkJcmVjLT5uZXh0X2JhbmsgPSBjdXItPm5leHRfYmFuazsKKwkJCWlmIChwcmV2KQorCQkJCXByZXYtPm5leHRfYmFuayA9IHJlYzsKKwkJCWVsc2UKKwkJCQlwcmVzZXRfdGFibGVba2V5XSA9IHJlYzsKKwkJCXB1cmdlX29sZF9saXN0KHJlYywgY3VyKTsKKwkJCXJldHVybjsKKwkJfQorCQlwcmV2ID0gY3VyOworCX0KKworCS8qIHRoaXMgaXMgdGhlIGZpcnN0IGJhbmsgcmVjb3JkLi4ganVzdCBhZGQgdGhpcyAqLworCXJlYy0+bmV4dF9pbnN0ciA9IE5VTEw7CisJcmVjLT5uZXh0X2JhbmsgPSBwcmVzZXRfdGFibGVba2V5XTsKKwlwcmVzZXRfdGFibGVba2V5XSA9IHJlYzsKK30KKworLyogcmVtb3ZlIHNhbXBsZXMgbGF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHNmX2lkICovCitzdGF0aWMgdm9pZAorYXdlX3JlbW92ZV9zYW1wbGVzKGludCBzZl9pZCkKK3sKKwlzZl9saXN0ICpwLCAqcHJldjsKKworCWlmIChzZl9pZCA8PSAwKSB7CisJCWF3ZV9yZXNldF9zYW1wbGVzKCk7CisJCXJldHVybjsKKwl9CisJLyogYWxyZWFkeSByZW1vdmVkPyAqLworCWlmIChjdXJyZW50X3NmX2lkIDw9IHNmX2lkKQorCQlyZXR1cm47CisKKwlmb3IgKHAgPSBzZnRhaWw7IHA7IHAgPSBwcmV2KSB7CisJCWlmIChwLT5zZl9pZCA8PSBzZl9pZCkKKwkJCWJyZWFrOworCQlwcmV2ID0gcC0+cHJldjsKKwkJYXdlX2ZyZWVfc2YocCk7CisJfQorCXNmdGFpbCA9IHA7CisJaWYgKHNmdGFpbCkgeworCQlzZl9pZCA9IHNmdGFpbC0+c2ZfaWQ7CisJCXNmdGFpbC0+bmV4dCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJc2ZfaWQgPSAwOworCQlzZmhlYWQgPSBOVUxMOworCX0KKwljdXJyZW50X3NmX2lkID0gc2ZfaWQ7CisJaWYgKGxvY2tlZF9zZl9pZCA+IHNmX2lkKQorCQlsb2NrZWRfc2ZfaWQgPSBzZl9pZDsKKworCXJlYnVpbGRfcHJlc2V0X2xpc3QoKTsKK30KKworLyogcmVidWlsZCBwcmVzZXQgc2VhcmNoIGxpc3QgKi8KK3N0YXRpYyB2b2lkIHJlYnVpbGRfcHJlc2V0X2xpc3Qodm9pZCkKK3sKKwlzZl9saXN0ICpwOworCWF3ZV92b2ljZV9saXN0ICpyZWM7CisKKwltZW1zZXQocHJlc2V0X3RhYmxlLCAwLCBzaXplb2YocHJlc2V0X3RhYmxlKSk7CisKKwlmb3IgKHAgPSBzZmhlYWQ7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWZvciAocmVjID0gcC0+aW5mb3M7IHJlYzsgcmVjID0gcmVjLT5uZXh0KQorCQkJYWRkX2luZm9fbGlzdChyZWMpOworCX0KK30KKworLyogY29tcGFyZSB0aGUgZ2l2ZW4gc2ZfaWQgcGFpciAqLworc3RhdGljIGludCBpc19pZGVudGljYWxfaG9sZGVyKHNmX2xpc3QgKnNmMSwgc2ZfbGlzdCAqc2YyKQoreworCWlmIChzZjEgPT0gTlVMTCB8fCBzZjIgPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCWlmIChzZjEgPT0gc2YyKQorCQlyZXR1cm4gVFJVRTsKKyNpZmRlZiBBV0VfQUxMT1dfU0FNUExFX1NIQVJJTkcKKwl7CisJCS8qIGNvbXBhcmUgd2l0aCB0aGUgc2hhcmluZyBpZCAqLworCQlzZl9saXN0ICpwOworCQlpbnQgY291bnRlciA9IDA7CisJCWlmIChzZjEtPnNmX2lkIDwgc2YyLT5zZl9pZCkgeyAvKiBtYWtlIHN1cmUgaWQxID4gaWQyICovCisJCQlzZl9saXN0ICp0bXA7IHRtcCA9IHNmMTsgc2YxID0gc2YyOyBzZjIgPSB0bXA7CisJCX0KKwkJZm9yIChwID0gc2YxLT5zaGFyZWQ7IHA7IHAgPSBwLT5zaGFyZWQpIHsKKwkJCWlmIChjb3VudGVyKysgPiBjdXJyZW50X3NmX2lkKQorCQkJCWJyZWFrOyAvKiBzdHJhbmdlIHNoYXJpbmcgbG9vcC4uIHF1aXQgKi8KKwkJCWlmIChwID09IHNmMikKKwkJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKyNlbmRpZiAvKiBhbGxvdyBzaGFyaW5nICovCisJcmV0dXJuIEZBTFNFOworfQorCisvKiBzZWFyY2ggdGhlIHNhbXBsZSBpbmRleCBtYXRjaGluZyB3aXRoIHRoZSBnaXZlbiBzYW1wbGUgaWQgKi8KK3N0YXRpYyBhd2Vfc2FtcGxlX2xpc3QgKgorc2VhcmNoX3NhbXBsZV9pbmRleChzZl9saXN0ICpzZiwgaW50IHNhbXBsZSkKK3sKKwlhd2Vfc2FtcGxlX2xpc3QgKnA7CisjaWZkZWYgQVdFX0FMTE9XX1NBTVBMRV9TSEFSSU5HCisJaW50IGNvdW50ZXIgPSAwOworCXdoaWxlIChzZikgeworCQlmb3IgKHAgPSBzZi0+c2FtcGxlczsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCWlmIChwLT52LnNhbXBsZSA9PSBzYW1wbGUpCisJCQkJcmV0dXJuIHA7CisJCX0KKwkJc2YgPSBzZi0+c2hhcmVkOworCQlpZiAoY291bnRlcisrID4gY3VycmVudF9zZl9pZCkKKwkJCWJyZWFrOyAvKiBzdHJhbmdlIHNoYXJpbmcgbG9vcC4uIHF1aXQgKi8KKwl9CisjZWxzZQorCWlmIChzZikgeworCQlmb3IgKHAgPSBzZi0+c2FtcGxlczsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCWlmIChwLT52LnNhbXBsZSA9PSBzYW1wbGUpCisJCQkJcmV0dXJuIHA7CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm4gTlVMTDsKK30KKworLyogc2VhcmNoIHRoZSBzcGVjaWZpZWQgc2FtcGxlICovCisvKiBub24temVybyA9IGZvdW5kICovCitzdGF0aWMgc2hvcnQKK2F3ZV9zZXRfc2FtcGxlKGF3ZV92b2ljZV9saXN0ICpyZWMpCit7CisJYXdlX3NhbXBsZV9saXN0ICpzbXA7CisJYXdlX3ZvaWNlX2luZm8gKnZwID0gJnJlYy0+djsKKworCXZwLT5pbmRleCA9IDA7CisJaWYgKChzbXAgPSBzZWFyY2hfc2FtcGxlX2luZGV4KHJlYy0+aG9sZGVyLCB2cC0+c2FtcGxlKSkgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBzZXQgdGhlIGFjdHVhbCBzYW1wbGUgb2Zmc2V0cyAqLworCXZwLT5zdGFydCArPSBzbXAtPnYuc3RhcnQ7CisJdnAtPmVuZCArPSBzbXAtPnYuZW5kOworCXZwLT5sb29wc3RhcnQgKz0gc21wLT52Lmxvb3BzdGFydDsKKwl2cC0+bG9vcGVuZCArPSBzbXAtPnYubG9vcGVuZDsKKwkvKiBjb3B5IG1vZGUgZmxhZ3MgKi8KKwl2cC0+bW9kZSA9IHNtcC0+di5tb2RlX2ZsYWdzOworCS8qIHNldCBmbGFnICovCisJdnAtPmluZGV4ID0gMTsKKworCXJldHVybiAxOworfQorCisKKy8qCisgKiB2b2ljZSBhbGxvY2F0aW9uCisgKi8KKworLyogbG9vayBmb3IgYWxsIHZvaWNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBub3RlICYgdmVsb2NpdHkgKi8KK3N0YXRpYyBpbnQKK2F3ZV9zZWFyY2hfbXVsdGlfdm9pY2VzKGF3ZV92b2ljZV9saXN0ICpyZWMsIGludCBub3RlLCBpbnQgdmVsb2NpdHksCisJCQlhd2Vfdm9pY2VfaW5mbyAqKnZsaXN0KQoreworCWludCBudm9pY2VzOworCisJbnZvaWNlcyA9IDA7CisJZm9yICg7IHJlYzsgcmVjID0gcmVjLT5uZXh0X2luc3RyKSB7CisJCWlmIChub3RlID49IHJlYy0+di5sb3cgJiYKKwkJICAgIG5vdGUgPD0gcmVjLT52LmhpZ2ggJiYKKwkJICAgIHZlbG9jaXR5ID49IHJlYy0+di52ZWxsb3cgJiYKKwkJICAgIHZlbG9jaXR5IDw9IHJlYy0+di52ZWxoaWdoKSB7CisJCQlpZiAocmVjLT50eXBlID09IFZfU1RfTUFQUEVEKSB7CisJCQkJLyogbWFwcGVyICovCisJCQkJdmxpc3RbMF0gPSAmcmVjLT52OworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXZsaXN0W252b2ljZXMrK10gPSAmcmVjLT52OworCQkJaWYgKG52b2ljZXMgPj0gQVdFX01BWF9WT0lDRVMpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIG52b2ljZXM7CQorfQorCisvKiBzdG9yZSB0aGUgdm9pY2UgbGlzdCBmcm9tIHRoZSBzcGVjaWZpZWQgbm90ZSBhbmQgdmVsb2NpdHkuCisgICBpZiB0aGUgcHJlc2V0IGlzIG1hcHBlZCwgc2VlayBmb3IgdGhlIGRlc3RpbmF0aW9uIHByZXNldCwgYW5kIHJld3JpdGUKKyAgIHRoZSBub3RlIG51bWJlciBpZiBuZWNlc3NhcnkuCisgICAqLworc3RhdGljIGludAorcmVhbGx5X2FsbG9jX3ZvaWNlcyhpbnQgYmFuaywgaW50IGluc3RyLCBpbnQgKm5vdGUsIGludCB2ZWxvY2l0eSwgYXdlX3ZvaWNlX2luZm8gKip2bGlzdCkKK3sKKwlpbnQgbnZvaWNlczsKKwlhd2Vfdm9pY2VfbGlzdCAqdnJlYzsKKwlpbnQgbGV2ZWwgPSAwOworCisJZm9yICg7OykgeworCQl2cmVjID0gYXdlX3NlYXJjaF9pbnN0cihiYW5rLCBpbnN0ciwgKm5vdGUpOworCQludm9pY2VzID0gYXdlX3NlYXJjaF9tdWx0aV92b2ljZXModnJlYywgKm5vdGUsIHZlbG9jaXR5LCB2bGlzdCk7CisJCWlmIChudm9pY2VzID09IDApIHsKKwkJCWlmIChiYW5rID09IEFXRV9EUlVNX0JBTkspCisJCQkJLyogc2VhcmNoIGRlZmF1bHQgZHJ1bXNldCAqLworCQkJCXZyZWMgPSBhd2Vfc2VhcmNoX2luc3RyKGJhbmssIGN0cmxzW0FXRV9NRF9ERUZfRFJVTV0sICpub3RlKTsKKwkJCWVsc2UKKwkJCQkvKiBzZWFyY2ggZGVmYXVsdCBwcmVzZXQgKi8KKwkJCQl2cmVjID0gYXdlX3NlYXJjaF9pbnN0cihjdHJsc1tBV0VfTURfREVGX0JBTktdLCBpbnN0ciwgKm5vdGUpOworCQkJbnZvaWNlcyA9IGF3ZV9zZWFyY2hfbXVsdGlfdm9pY2VzKHZyZWMsICpub3RlLCB2ZWxvY2l0eSwgdmxpc3QpOworCQl9CisJCWlmIChudm9pY2VzID09IDApIHsKKwkJCWlmIChiYW5rID09IEFXRV9EUlVNX0JBTksgJiYgY3RybHNbQVdFX01EX0RFRl9EUlVNXSAhPSAwKQorCQkJCS8qIHNlYXJjaCBkZWZhdWx0IGRydW1zZXQgKi8KKwkJCQl2cmVjID0gYXdlX3NlYXJjaF9pbnN0cihiYW5rLCAwLCAqbm90ZSk7CisJCQllbHNlIGlmIChiYW5rICE9IEFXRV9EUlVNX0JBTksgJiYgY3RybHNbQVdFX01EX0RFRl9CQU5LXSAhPSAwKQorCQkJCS8qIHNlYXJjaCBkZWZhdWx0IHByZXNldCAqLworCQkJCXZyZWMgPSBhd2Vfc2VhcmNoX2luc3RyKDAsIGluc3RyLCAqbm90ZSk7CisJCQludm9pY2VzID0gYXdlX3NlYXJjaF9tdWx0aV92b2ljZXModnJlYywgKm5vdGUsIHZlbG9jaXR5LCB2bGlzdCk7CisJCX0KKwkJaWYgKG52b2ljZXMgPCAwKSB7IC8qIG1hcHBpbmcgKi8KKwkJCWludCBrZXkgPSB2bGlzdFswXS0+Zml4a2V5OworCQkJaW5zdHIgPSB2bGlzdFswXS0+c3RhcnQ7CisJCQliYW5rID0gdmxpc3RbMF0tPmVuZDsKKwkJCWlmIChsZXZlbCsrID4gNSkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiQVdFMzI6IHRvbyBkZWVwIG1hcHBpbmcgbGV2ZWxcbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKGtleSA+PSAwKQorCQkJCSpub3RlID0ga2V5OworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBudm9pY2VzOworfQorCisvKiBhbGxvY2F0ZSB2b2ljZXMgY29ycmVzcG9uZGluZyBub3RlIGFuZCB2ZWxvY2l0eTsgc3VwcG9ydHMgbXVsdGlwbGUgaW5zdHMuICovCitzdGF0aWMgdm9pZAorYXdlX2FsbG9jX211bHRpX3ZvaWNlcyhpbnQgY2gsIGludCBub3RlLCBpbnQgdmVsb2NpdHksIGludCBrZXkpCit7CisJaW50IGksIHYsIG52b2ljZXMsIGJhbms7CisJYXdlX3ZvaWNlX2luZm8gKnZsaXN0W0FXRV9NQVhfVk9JQ0VTXTsKKworCWlmIChNVUxUSV9MQVlFUl9NT0RFKCkgJiYgSVNfRFJVTV9DSEFOTkVMKGNoKSkKKwkJYmFuayA9IEFXRV9EUlVNX0JBTks7IC8qIGFsd2F5cyBzZWFyY2ggZHJ1bXNldCAqLworCWVsc2UKKwkJYmFuayA9IGNoYW5uZWxzW2NoXS5iYW5rOworCisJLyogY2hlY2sgdGhlIHBvc3NpYmxlIHZvaWNlczsgbm90ZSBtYXkgYmUgY2hhbmdlYWJsZSBpZiBtYXBwZWQgKi8KKwludm9pY2VzID0gcmVhbGx5X2FsbG9jX3ZvaWNlcyhiYW5rLCBjaGFubmVsc1tjaF0uaW5zdHIsCisJCQkJICAgICAgJm5vdGUsIHZlbG9jaXR5LCB2bGlzdCk7CisKKwkvKiBzZXQgdGhlIHZvaWNlcyAqLworCWN1cnJlbnRfYWxsb2NfdGltZSsrOworCWZvciAoaSA9IDA7IGkgPCBudm9pY2VzOyBpKyspIHsKKwkJdiA9IGF3ZV9jbGVhcl92b2ljZSgpOworCQl2b2ljZXNbdl0ua2V5ID0ga2V5OworCQl2b2ljZXNbdl0uY2ggPSBjaDsKKwkJdm9pY2VzW3ZdLm5vdGUgPSBub3RlOworCQl2b2ljZXNbdl0udmVsb2NpdHkgPSB2ZWxvY2l0eTsKKwkJdm9pY2VzW3ZdLnRpbWUgPSBjdXJyZW50X2FsbG9jX3RpbWU7CisJCXZvaWNlc1t2XS5jaW5mbyA9ICZjaGFubmVsc1tjaF07CisJCXZvaWNlc1t2XS5zYW1wbGUgPSB2bGlzdFtpXTsKKwkJdm9pY2VzW3ZdLnN0YXRlID0gQVdFX1NUX01BUks7CisJCXZvaWNlc1t2XS5sYXllciA9IG52b2ljZXMgLSBpIC0gMTsgIC8qIGluIHJldmVyc2Ugb3JkZXIgKi8KKwl9CisKKwkvKiBjbGVhciB0aGUgbWFyayBpbiBhbGxvY2F0ZWQgdm9pY2VzICovCisJZm9yIChpID0gMDsgaSA8IGF3ZV9tYXhfdm9pY2VzOyBpKyspIHsKKwkJaWYgKHZvaWNlc1tpXS5zdGF0ZSA9PSBBV0VfU1RfTUFSSykKKwkJCXZvaWNlc1tpXS5zdGF0ZSA9IEFXRV9TVF9PRkY7CisJCQkKKwl9Cit9CisKKworLyogc2VhcmNoIGFuIGVtcHR5IHZvaWNlLgorICAgaWYgbm8gZW1wdHkgdm9pY2UgaXMgZm91bmQsIGF0IGxlYXN0IHRlcm1pbmF0ZSBhIHZvaWNlCisgICAqLworc3RhdGljIGludAorYXdlX2NsZWFyX3ZvaWNlKHZvaWQpCit7CisJZW51bSB7CisJCU9GRj0wLCBSRUxFQVNFRCwgU1VTVEFJTkVELCBQTEFZSU5HLCBFTkQKKwl9OworCXN0cnVjdCB2b2ljZV9jYW5kaWRhdGVfdCB7CisJCWludCBiZXN0OworCQlpbnQgdGltZTsKKwkJaW50IHZ0YXJnZXQ7CisJfSBjYW5kaWRhdGVbRU5EXTsKKwlpbnQgaSwgdHlwZSwgdnRhcmdldDsKKworCXZ0YXJnZXQgPSAweGZmZmY7CisJZm9yICh0eXBlID0gT0ZGOyB0eXBlIDwgRU5EOyB0eXBlKyspIHsKKwkJY2FuZGlkYXRlW3R5cGVdLmJlc3QgPSAtMTsKKwkJY2FuZGlkYXRlW3R5cGVdLnRpbWUgPSBjdXJyZW50X2FsbG9jX3RpbWUgKyAxOworCQljYW5kaWRhdGVbdHlwZV0udnRhcmdldCA9IHZ0YXJnZXQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGF3ZV9tYXhfdm9pY2VzOyBpKyspIHsKKwkJaWYgKHZvaWNlc1tpXS5zdGF0ZSAmIEFXRV9TVF9PRkYpCisJCQl0eXBlID0gT0ZGOworCQllbHNlIGlmICh2b2ljZXNbaV0uc3RhdGUgJiBBV0VfU1RfUkVMRUFTRUQpCisJCQl0eXBlID0gUkVMRUFTRUQ7CisJCWVsc2UgaWYgKHZvaWNlc1tpXS5zdGF0ZSAmIEFXRV9TVF9TVVNUQUlORUQpCisJCQl0eXBlID0gU1VTVEFJTkVEOworCQllbHNlIGlmICh2b2ljZXNbaV0uc3RhdGUgJiB+QVdFX1NUX01BUkspCisJCQl0eXBlID0gUExBWUlORzsKKwkJZWxzZQorCQkJY29udGludWU7CisjaWZkZWYgQVdFX0NIRUNLX1ZUQVJHRVQKKwkJLyogZ2V0IGN1cnJlbnQgdm9sdW1lICovCisJCXZ0YXJnZXQgPSAoYXdlX3BlZWtfZHcoQVdFX1ZURlQoaSkpID4+IDE2KSAmIDB4ZmZmZjsKKyNlbmRpZgorCQlpZiAoY2FuZGlkYXRlW3R5cGVdLmJlc3QgPCAwIHx8CisJCSAgICB2dGFyZ2V0IDwgY2FuZGlkYXRlW3R5cGVdLnZ0YXJnZXQgfHwKKwkJICAgICh2dGFyZ2V0ID09IGNhbmRpZGF0ZVt0eXBlXS52dGFyZ2V0ICYmCisJCSAgICAgdm9pY2VzW2ldLnRpbWUgPCBjYW5kaWRhdGVbdHlwZV0udGltZSkpIHsKKwkJCWNhbmRpZGF0ZVt0eXBlXS5iZXN0ID0gaTsKKwkJCWNhbmRpZGF0ZVt0eXBlXS50aW1lID0gdm9pY2VzW2ldLnRpbWU7CisJCQljYW5kaWRhdGVbdHlwZV0udnRhcmdldCA9IHZ0YXJnZXQ7CisJCX0KKwl9CisKKwlmb3IgKHR5cGUgPSBPRkY7IHR5cGUgPCBFTkQ7IHR5cGUrKykgeworCQlpZiAoKGkgPSBjYW5kaWRhdGVbdHlwZV0uYmVzdCkgPj0gMCkgeworCQkJaWYgKHZvaWNlc1tpXS5zdGF0ZSAhPSBBV0VfU1RfT0ZGKQorCQkJCWF3ZV90ZXJtaW5hdGUoaSk7CisJCQlhd2Vfdm9pY2VfaW5pdChpLCBUUlVFKTsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisKKy8qIHNlYXJjaCBzYW1wbGUgZm9yIHRoZSBzcGVjaWZpZWQgbm90ZSAmIHZlbG9jaXR5IGFuZCBzZXQgaXQgb24gdGhlIHZvaWNlOworICogbm90ZSB0aGF0IHZvaWNlIGlzIHRoZSB2b2ljZSBpbmRleCAobm90IGNoYW5uZWwgaW5kZXgpCisgKi8KK3N0YXRpYyB2b2lkCithd2VfYWxsb2Nfb25lX3ZvaWNlKGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSkKK3sKKwlpbnQgY2gsIG52b2ljZXMsIGJhbms7CisJYXdlX3ZvaWNlX2luZm8gKnZsaXN0W0FXRV9NQVhfVk9JQ0VTXTsKKworCWNoID0gdm9pY2VzW3ZvaWNlXS5jaDsKKwlpZiAoTVVMVElfTEFZRVJfTU9ERSgpICYmIElTX0RSVU1fQ0hBTk5FTCh2b2ljZSkpCisJCWJhbmsgPSBBV0VfRFJVTV9CQU5LOyAvKiBhbHdheXMgc2VhcmNoIGRydW1zZXQgKi8KKwllbHNlCisJCWJhbmsgPSB2b2ljZXNbdm9pY2VdLmNpbmZvLT5iYW5rOworCisJbnZvaWNlcyA9IHJlYWxseV9hbGxvY192b2ljZXMoYmFuaywgdm9pY2VzW3ZvaWNlXS5jaW5mby0+aW5zdHIsCisJCQkJICAgICAgJm5vdGUsIHZlbG9jaXR5LCB2bGlzdCk7CisJaWYgKG52b2ljZXMgPiAwKSB7CisJCXZvaWNlc1t2b2ljZV0udGltZSA9ICsrY3VycmVudF9hbGxvY190aW1lOworCQl2b2ljZXNbdm9pY2VdLnNhbXBsZSA9IHZsaXN0WzBdOyAvKiB1c2UgdGhlIGZpcnN0IG9uZSAqLworCQl2b2ljZXNbdm9pY2VdLmxheWVyID0gMDsKKwkJdm9pY2VzW3ZvaWNlXS5ub3RlID0gbm90ZTsKKwkJdm9pY2VzW3ZvaWNlXS52ZWxvY2l0eSA9IHZlbG9jaXR5OworCX0KK30KKworCisvKgorICogc2VxdWVuY2VyMiBmdW5jdGlvbnMKKyAqLworCisvKiBzZWFyY2ggYW4gZW1wdHkgdm9pY2U7IHVzZWQgYnkgc2VxdWVuY2VyMiAqLworc3RhdGljIGludAorYXdlX2FsbG9jKGludCBkZXYsIGludCBjaG4sIGludCBub3RlLCBzdHJ1Y3Qgdm9pY2VfYWxsb2NfaW5mbyAqYWxsb2MpCit7CisJcGxheWluZ19tb2RlID0gQVdFX1BMQVlfTVVMVEkyOworCWF3ZV9pbmZvLm5yX3ZvaWNlcyA9IEFXRV9NQVhfQ0hBTk5FTFM7CisJcmV0dXJuIGF3ZV9jbGVhcl92b2ljZSgpOworfQorCisKKy8qIHNldCB1cCB2b2ljZTsgdXNlZCBieSBzZXF1ZW5jZXIyICovCitzdGF0aWMgdm9pZAorYXdlX3NldHVwX3ZvaWNlKGludCBkZXYsIGludCB2b2ljZSwgaW50IGNobikKK3sKKwlzdHJ1Y3QgY2hhbm5lbF9pbmZvICppbmZvOworCWlmIChzeW50aF9kZXZzW2Rldl0gPT0gTlVMTCB8fAorCSAgICAoaW5mbyA9ICZzeW50aF9kZXZzW2Rldl0tPmNobl9pbmZvW2Nobl0pID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gYXdlX21heF92b2ljZXMpCisJCXJldHVybjsKKworCURFQlVHKDIscHJpbnRrKCJBV0UzMjogW3NldHVwKCVkKSBjaD0lZF1cbiIsIHZvaWNlLCBjaG4pKTsKKwljaGFubmVsc1tjaG5dLmV4cHJlc3Npb25fdm9sID0gaW5mby0+Y29udHJvbGxlcnNbQ1RMX0VYUFJFU1NJT05dOworCWNoYW5uZWxzW2Nobl0ubWFpbl92b2wgPSBpbmZvLT5jb250cm9sbGVyc1tDVExfTUFJTl9WT0xVTUVdOworCWNoYW5uZWxzW2Nobl0ucGFubmluZyA9CisJCWluZm8tPmNvbnRyb2xsZXJzW0NUTF9QQU5dICogMiAtIDEyODsgLyogc2lnbmVkIDhiaXQgKi8KKwljaGFubmVsc1tjaG5dLmJlbmRlciA9IGluZm8tPmJlbmRlcl92YWx1ZTsgLyogemVybyBjZW50ZXIgKi8KKwljaGFubmVsc1tjaG5dLmJhbmsgPSBpbmZvLT5jb250cm9sbGVyc1tDVExfQkFOS19TRUxFQ1RdOworCWNoYW5uZWxzW2Nobl0uc3VzdGFpbmVkID0gaW5mby0+Y29udHJvbGxlcnNbQ1RMX1NVU1RBSU5dOworCWlmIChpbmZvLT5jb250cm9sbGVyc1tDVExfRVhUX0VGRl9ERVBUSF0pIHsKKwkJRlhfU0VUKCZjaGFubmVsc1tjaG5dLmZ4LCBBV0VfRlhfUkVWRVJCLAorCQkgICAgICAgaW5mby0+Y29udHJvbGxlcnNbQ1RMX0VYVF9FRkZfREVQVEhdICogMik7CisJfQorCWlmIChpbmZvLT5jb250cm9sbGVyc1tDVExfQ0hPUlVTX0RFUFRIXSkgeworCQlGWF9TRVQoJmNoYW5uZWxzW2Nobl0uZngsIEFXRV9GWF9DSE9SVVMsCisJCSAgICAgICBpbmZvLT5jb250cm9sbGVyc1tDVExfQ0hPUlVTX0RFUFRIXSAqIDIpOworCX0KKwlhd2Vfc2V0X2luc3RyKGRldiwgY2huLCBpbmZvLT5wZ21fbnVtKTsKK30KKworCisjaWZkZWYgQ09ORklHX0FXRTMyX01JWEVSCisvKgorICogQVdFMzIgbWl4ZXIgZGV2aWNlIGNvbnRyb2wKKyAqLworCitzdGF0aWMgaW50IGF3ZV9taXhlcl9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKKworc3RhdGljIGludCBteV9taXhlcmRldiA9IC0xOworCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgYXdlX21peGVyX29wZXJhdGlvbnMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmlkCT0gIkFXRSIsCisJLm5hbWUJPSAiQVdFMzIgRXF1YWxpemVyIiwKKwkuaW9jdGwJPSBhd2VfbWl4ZXJfaW9jdGwsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX21peGVyKHZvaWQpCit7CisJaWYgKChteV9taXhlcmRldiA9IHNvdW5kX2FsbG9jX21peGVyZGV2KCkpID49IDApIHsKKwkJbWl4ZXJfZGV2c1tteV9taXhlcmRldl0gPSAmYXdlX21peGVyX29wZXJhdGlvbnM7CisJfQorfQorCitzdGF0aWMgdm9pZCB1bmxvYWRfbWl4ZXIodm9pZCkKK3sKKwlpZiAobXlfbWl4ZXJkZXYgPj0gMCkKKwkJc291bmRfdW5sb2FkX21peGVyZGV2KG15X21peGVyZGV2KTsKK30KKworc3RhdGljIGludAorYXdlX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKQoreworCWludCBpLCBsZXZlbCwgdmFsdWU7CisKKwlpZiAoKChjbWQgPj4gOCkgJiAweGZmKSAhPSAnTScpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGdldF91c2VyKGxldmVsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCXJldHVybiAtRUZBVUxUOworCWxldmVsID0gKChsZXZlbCAmIDB4ZmYpICsgKGxldmVsID4+IDgpKSAvIDI7CisJREVCVUcoMCxwcmludGsoIkFXRU1peDogY21kPSV4IHZhbD0lZFxuIiwgY21kICYgMHhmZiwgbGV2ZWwpKTsKKworCWlmIChfU0lPQ19ESVIoY21kKSAmIF9TSU9DX1dSSVRFKSB7CisJCXN3aXRjaCAoY21kICYgMHhmZikgeworCQljYXNlIFNPVU5EX01JWEVSX0JBU1M6CisJCQl2YWx1ZSA9IGxldmVsICogMTIgLyAxMDA7CisJCQlpZiAodmFsdWUgPj0gMTIpCisJCQkJdmFsdWUgPSAxMTsKKwkJCWN0cmxzW0FXRV9NRF9CQVNTX0xFVkVMXSA9IHZhbHVlOworCQkJYXdlX3VwZGF0ZV9lcXVhbGl6ZXIoKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1RSRUJMRToKKwkJCXZhbHVlID0gbGV2ZWwgKiAxMiAvIDEwMDsKKwkJCWlmICh2YWx1ZSA+PSAxMikKKwkJCQl2YWx1ZSA9IDExOworCQkJY3RybHNbQVdFX01EX1RSRUJMRV9MRVZFTF0gPSB2YWx1ZTsKKwkJCWF3ZV91cGRhdGVfZXF1YWxpemVyKCk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCQlsZXZlbCA9IGxldmVsICogMTI3IC8gMTAwOworCQkJaWYgKGxldmVsID49IDEyOCkgbGV2ZWwgPSAxMjc7CisJCQlhdHRlbl9yZWxhdGl2ZSA9IEZBTFNFOworCQkJYXR0ZW5fb2Zmc2V0ID0gdm9sX3RhYmxlW2xldmVsXTsKKwkJCWF3ZV91cGRhdGVfdm9sdW1lKCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlzd2l0Y2ggKGNtZCAmIDB4ZmYpIHsKKwljYXNlIFNPVU5EX01JWEVSX0JBU1M6CisJCWxldmVsID0gY3RybHNbQVdFX01EX0JBU1NfTEVWRUxdICogMTAwIC8gMjQ7CisJCWxldmVsID0gKGxldmVsIDw8IDgpIHwgbGV2ZWw7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfVFJFQkxFOgorCQlsZXZlbCA9IGN0cmxzW0FXRV9NRF9UUkVCTEVfTEVWRUxdICogMTAwIC8gMjQ7CisJCWxldmVsID0gKGxldmVsIDw8IDgpIHwgbGV2ZWw7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQl2YWx1ZSA9IGF0dGVuX29mZnNldDsKKwkJaWYgKGF0dGVuX3JlbGF0aXZlKQorCQkJdmFsdWUgKz0gY3RybHNbQVdFX01EX1pFUk9fQVRURU5dOworCQlmb3IgKGkgPSAxMjc7IGkgPiAwOyBpLS0pIHsKKwkJCWlmICh2YWx1ZSA8PSB2b2xfdGFibGVbaV0pCisJCQkJYnJlYWs7CisJCX0KKwkJbGV2ZWwgPSBpICogMTAwIC8gMTI3OworCQlsZXZlbCA9IChsZXZlbCA8PCA4KSB8IGxldmVsOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCWxldmVsID0gU09VTkRfTUFTS19CQVNTfFNPVU5EX01BU0tfVFJFQkxFfFNPVU5EX01BU0tfVk9MVU1FOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlsZXZlbCA9IDA7CisJCWJyZWFrOworCX0KKwlpZiAocHV0X3VzZXIobGV2ZWwsIChpbnQgX191c2VyICopYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIGxldmVsOworfQorI2VuZGlmIC8qIENPTkZJR19BV0UzMl9NSVhFUiAqLworCisKKy8qCisgKiBpbml0aWFsaXphdGlvbiBvZiBFbXU4MDAwCisgKi8KKworLyogaW50aWFpbGl6ZSBhdWRpbyBjaGFubmVscyAqLworc3RhdGljIHZvaWQKK2F3ZV9pbml0X2F1ZGlvKHZvaWQpCit7CisJaW50IGNoOworCisJLyogdHVybiBvZmYgZW52ZWxvcGUgZW5naW5lcyAqLworCWZvciAoY2ggPSAwOyBjaCA8IEFXRV9NQVhfVk9JQ0VTOyBjaCsrKSB7CisJCWF3ZV9wb2tlKEFXRV9EQ1lTVVNWKGNoKSwgMHg4MCk7CisJfQorICAKKwkvKiByZXNldCBhbGwgb3RoZXIgcGFyYW1ldGVycyB0byB6ZXJvICovCisJZm9yIChjaCA9IDA7IGNoIDwgQVdFX01BWF9WT0lDRVM7IGNoKyspIHsKKwkJYXdlX3Bva2UoQVdFX0VOVlZPTChjaCksIDApOworCQlhd2VfcG9rZShBV0VfRU5WVkFMKGNoKSwgMCk7CisJCWF3ZV9wb2tlKEFXRV9EQ1lTVVMoY2gpLCAwKTsKKwkJYXdlX3Bva2UoQVdFX0FUS0hMRFYoY2gpLCAwKTsKKwkJYXdlX3Bva2UoQVdFX0xGTzFWQUwoY2gpLCAwKTsKKwkJYXdlX3Bva2UoQVdFX0FUS0hMRChjaCksIDApOworCQlhd2VfcG9rZShBV0VfTEZPMlZBTChjaCksIDApOworCQlhd2VfcG9rZShBV0VfSVAoY2gpLCAwKTsKKwkJYXdlX3Bva2UoQVdFX0lGQVROKGNoKSwgMCk7CisJCWF3ZV9wb2tlKEFXRV9QRUZFKGNoKSwgMCk7CisJCWF3ZV9wb2tlKEFXRV9GTU1PRChjaCksIDApOworCQlhd2VfcG9rZShBV0VfVFJFTUZSUShjaCksIDApOworCQlhd2VfcG9rZShBV0VfRk0yRlJRMihjaCksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfUFRSWChjaCksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfVlRGVChjaCksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfUFNTVChjaCksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfQ1NMKGNoKSwgMCk7CisJCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKGNoKSwgMCk7CisJfQorCisJZm9yIChjaCA9IDA7IGNoIDwgQVdFX01BWF9WT0lDRVM7IGNoKyspIHsKKwkJYXdlX3Bva2VfZHcoQVdFX0NQRihjaCksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfQ1ZDRihjaCksIDApOworCX0KK30KKworCisvKiBpbml0aWFsaXplIERNQSBhZGRyZXNzICovCitzdGF0aWMgdm9pZAorYXdlX2luaXRfZG1hKHZvaWQpCit7CisJYXdlX3Bva2VfZHcoQVdFX1NNQUxSLCAwKTsKKwlhd2VfcG9rZV9kdyhBV0VfU01BUlIsIDApOworCWF3ZV9wb2tlX2R3KEFXRV9TTUFMVywgMCk7CisJYXdlX3Bva2VfZHcoQVdFX1NNQVJXLCAwKTsKK30KKworCisvKiBpbml0aWFsaXphdGlvbiBhcnJheXM7IGZyb20gQURJUCAqLworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW5pdDFbMTI4XSA9IHsKKwkweDAzZmYsIDB4MDAzMCwgIDB4MDdmZiwgMHgwMTMwLCAweDBiZmYsIDB4MDIzMCwgIDB4MGZmZiwgMHgwMzMwLAorCTB4MTNmZiwgMHgwNDMwLCAgMHgxN2ZmLCAweDA1MzAsIDB4MWJmZiwgMHgwNjMwLCAgMHgxZmZmLCAweDA3MzAsCisJMHgyM2ZmLCAweDA4MzAsICAweDI3ZmYsIDB4MDkzMCwgMHgyYmZmLCAweDBhMzAsICAweDJmZmYsIDB4MGIzMCwKKwkweDMzZmYsIDB4MGMzMCwgIDB4MzdmZiwgMHgwZDMwLCAweDNiZmYsIDB4MGUzMCwgIDB4M2ZmZiwgMHgwZjMwLAorCisJMHg0M2ZmLCAweDAwMzAsICAweDQ3ZmYsIDB4MDEzMCwgMHg0YmZmLCAweDAyMzAsICAweDRmZmYsIDB4MDMzMCwKKwkweDUzZmYsIDB4MDQzMCwgIDB4NTdmZiwgMHgwNTMwLCAweDViZmYsIDB4MDYzMCwgIDB4NWZmZiwgMHgwNzMwLAorCTB4NjNmZiwgMHgwODMwLCAgMHg2N2ZmLCAweDA5MzAsIDB4NmJmZiwgMHgwYTMwLCAgMHg2ZmZmLCAweDBiMzAsCisJMHg3M2ZmLCAweDBjMzAsICAweDc3ZmYsIDB4MGQzMCwgMHg3YmZmLCAweDBlMzAsICAweDdmZmYsIDB4MGYzMCwKKworCTB4ODNmZiwgMHgwMDMwLCAgMHg4N2ZmLCAweDAxMzAsIDB4OGJmZiwgMHgwMjMwLCAgMHg4ZmZmLCAweDAzMzAsCisJMHg5M2ZmLCAweDA0MzAsICAweDk3ZmYsIDB4MDUzMCwgMHg5YmZmLCAweDA2MzAsICAweDlmZmYsIDB4MDczMCwKKwkweGEzZmYsIDB4MDgzMCwgIDB4YTdmZiwgMHgwOTMwLCAweGFiZmYsIDB4MGEzMCwgIDB4YWZmZiwgMHgwYjMwLAorCTB4YjNmZiwgMHgwYzMwLCAgMHhiN2ZmLCAweDBkMzAsIDB4YmJmZiwgMHgwZTMwLCAgMHhiZmZmLCAweDBmMzAsCisKKwkweGMzZmYsIDB4MDAzMCwgIDB4YzdmZiwgMHgwMTMwLCAweGNiZmYsIDB4MDIzMCwgIDB4Y2ZmZiwgMHgwMzMwLAorCTB4ZDNmZiwgMHgwNDMwLCAgMHhkN2ZmLCAweDA1MzAsIDB4ZGJmZiwgMHgwNjMwLCAgMHhkZmZmLCAweDA3MzAsCisJMHhlM2ZmLCAweDA4MzAsICAweGU3ZmYsIDB4MDkzMCwgMHhlYmZmLCAweDBhMzAsICAweGVmZmYsIDB4MGIzMCwKKwkweGYzZmYsIDB4MGMzMCwgIDB4ZjdmZiwgMHgwZDMwLCAweGZiZmYsIDB4MGUzMCwgIDB4ZmZmZiwgMHgwZjMwLAorfTsKKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGluaXQyWzEyOF0gPSB7CisJMHgwM2ZmLCAweDgwMzAsIDB4MDdmZiwgMHg4MTMwLCAweDBiZmYsIDB4ODIzMCwgMHgwZmZmLCAweDgzMzAsCisJMHgxM2ZmLCAweDg0MzAsIDB4MTdmZiwgMHg4NTMwLCAweDFiZmYsIDB4ODYzMCwgMHgxZmZmLCAweDg3MzAsCisJMHgyM2ZmLCAweDg4MzAsIDB4MjdmZiwgMHg4OTMwLCAweDJiZmYsIDB4OGEzMCwgMHgyZmZmLCAweDhiMzAsCisJMHgzM2ZmLCAweDhjMzAsIDB4MzdmZiwgMHg4ZDMwLCAweDNiZmYsIDB4OGUzMCwgMHgzZmZmLCAweDhmMzAsCisKKwkweDQzZmYsIDB4ODAzMCwgMHg0N2ZmLCAweDgxMzAsIDB4NGJmZiwgMHg4MjMwLCAweDRmZmYsIDB4ODMzMCwKKwkweDUzZmYsIDB4ODQzMCwgMHg1N2ZmLCAweDg1MzAsIDB4NWJmZiwgMHg4NjMwLCAweDVmZmYsIDB4ODczMCwKKwkweDYzZmYsIDB4ODgzMCwgMHg2N2ZmLCAweDg5MzAsIDB4NmJmZiwgMHg4YTMwLCAweDZmZmYsIDB4OGIzMCwKKwkweDczZmYsIDB4OGMzMCwgMHg3N2ZmLCAweDhkMzAsIDB4N2JmZiwgMHg4ZTMwLCAweDdmZmYsIDB4OGYzMCwKKworCTB4ODNmZiwgMHg4MDMwLCAweDg3ZmYsIDB4ODEzMCwgMHg4YmZmLCAweDgyMzAsIDB4OGZmZiwgMHg4MzMwLAorCTB4OTNmZiwgMHg4NDMwLCAweDk3ZmYsIDB4ODUzMCwgMHg5YmZmLCAweDg2MzAsIDB4OWZmZiwgMHg4NzMwLAorCTB4YTNmZiwgMHg4ODMwLCAweGE3ZmYsIDB4ODkzMCwgMHhhYmZmLCAweDhhMzAsIDB4YWZmZiwgMHg4YjMwLAorCTB4YjNmZiwgMHg4YzMwLCAweGI3ZmYsIDB4OGQzMCwgMHhiYmZmLCAweDhlMzAsIDB4YmZmZiwgMHg4ZjMwLAorCisJMHhjM2ZmLCAweDgwMzAsIDB4YzdmZiwgMHg4MTMwLCAweGNiZmYsIDB4ODIzMCwgMHhjZmZmLCAweDgzMzAsCisJMHhkM2ZmLCAweDg0MzAsIDB4ZDdmZiwgMHg4NTMwLCAweGRiZmYsIDB4ODYzMCwgMHhkZmZmLCAweDg3MzAsCisJMHhlM2ZmLCAweDg4MzAsIDB4ZTdmZiwgMHg4OTMwLCAweGViZmYsIDB4OGEzMCwgMHhlZmZmLCAweDhiMzAsCisJMHhmM2ZmLCAweDhjMzAsIDB4ZjdmZiwgMHg4ZDMwLCAweGZiZmYsIDB4OGUzMCwgMHhmZmZmLCAweDhmMzAsCit9OworCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgaW5pdDNbMTI4XSA9IHsKKwkweDBDMTAsIDB4ODQ3MCwgMHgxNEZFLCAweEI0ODgsIDB4MTY3RiwgMHhBNDcwLCAweDE4RTcsIDB4ODRCNSwKKwkweDFCNkUsIDB4ODQyQSwgMHgxRjFELCAweDg1MkEsIDB4MERBMywgMHg4RjdDLCAweDE2N0UsIDB4RjI1NCwKKwkweDAwMDAsIDB4ODQyQSwgMHgwMDAxLCAweDg1MkEsIDB4MThFNiwgMHg4QkFBLCAweDFCNkQsIDB4RjIzNCwKKwkweDIyOUYsIDB4ODQyOSwgMHgyNzQ2LCAweDg1MjksIDB4MUYxQywgMHg4NkU3LCAweDIyOUUsIDB4RjIyNCwKKworCTB4MERBNCwgMHg4NDI5LCAweDJDMjksIDB4ODUyOSwgMHgyNzQ1LCAweDg3RjYsIDB4MkMyOCwgMHhGMjU0LAorCTB4MzgzQiwgMHg4NDI4LCAweDMyMEYsIDB4ODUyOCwgMHgzMjBFLCAweDhGMDIsIDB4MTM0MSwgMHhGMjY0LAorCTB4M0VCNiwgMHg4NDI4LCAweDNFQjksIDB4ODUyOCwgMHgzODNBLCAweDhGQTksIDB4M0VCNSwgMHhGMjk0LAorCTB4M0VCNywgMHg4NDc0LCAweDNFQkEsIDB4ODU3NSwgMHgzRUI4LCAweEM0QzMsIDB4M0VCQiwgMHhDNUMzLAorCisJMHgwMDAwLCAweEE0MDQsIDB4MDAwMSwgMHhBNTA0LCAweDE0MUYsIDB4ODY3MSwgMHgxNEZELCAweDgyODcsCisJMHgzRUJDLCAweEU2MTAsIDB4M0VDOCwgMHg4QzdCLCAweDAzMUEsIDB4ODdFNiwgMHgzRUM4LCAweDg2RjcsCisJMHgzRUMwLCAweDgyMUUsIDB4M0VCRSwgMHhEMjA4LCAweDNFQkQsIDB4ODIxRiwgMHgzRUNBLCAweDgzODYsCisJMHgzRUMxLCAweDhDMDMsIDB4M0VDOSwgMHg4MzFFLCAweDNFQ0EsIDB4OEM0QywgMHgzRUJGLCAweDhDNTUsCisKKwkweDNFQzksIDB4QzIwOCwgMHgzRUM0LCAweEJDODQsIDB4M0VDOCwgMHg4RUFELCAweDNFQzgsIDB4RDMwOCwKKwkweDNFQzIsIDB4OEY3RSwgMHgzRUNCLCAweDgyMTksIDB4M0VDQiwgMHhEMjZFLCAweDNFQzUsIDB4ODMxRiwKKwkweDNFQzYsIDB4QzMwOCwgMHgzRUMzLCAweEIyRkYsIDB4M0VDOSwgMHg4MjY1LCAweDNFQzksIDB4ODMxOSwKKwkweDEzNDIsIDB4RDM2RSwgMHgzRUM3LCAweEIzRkYsIDB4MDAwMCwgMHg4MzY1LCAweDE0MjAsIDB4OTU3MCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBpbml0NFsxMjhdID0geworCTB4MEMxMCwgMHg4NDcwLCAweDE0RkUsIDB4QjQ4OCwgMHgxNjdGLCAweEE0NzAsIDB4MThFNywgMHg4NEI1LAorCTB4MUI2RSwgMHg4NDJBLCAweDFGMUQsIDB4ODUyQSwgMHgwREEzLCAweDBGN0MsIDB4MTY3RSwgMHg3MjU0LAorCTB4MDAwMCwgMHg4NDJBLCAweDAwMDEsIDB4ODUyQSwgMHgxOEU2LCAweDBCQUEsIDB4MUI2RCwgMHg3MjM0LAorCTB4MjI5RiwgMHg4NDI5LCAweDI3NDYsIDB4ODUyOSwgMHgxRjFDLCAweDA2RTcsIDB4MjI5RSwgMHg3MjI0LAorCisJMHgwREE0LCAweDg0MjksIDB4MkMyOSwgMHg4NTI5LCAweDI3NDUsIDB4MDdGNiwgMHgyQzI4LCAweDcyNTQsCisJMHgzODNCLCAweDg0MjgsIDB4MzIwRiwgMHg4NTI4LCAweDMyMEUsIDB4MEYwMiwgMHgxMzQxLCAweDcyNjQsCisJMHgzRUI2LCAweDg0MjgsIDB4M0VCOSwgMHg4NTI4LCAweDM4M0EsIDB4MEZBOSwgMHgzRUI1LCAweDcyOTQsCisJMHgzRUI3LCAweDg0NzQsIDB4M0VCQSwgMHg4NTc1LCAweDNFQjgsIDB4NDRDMywgMHgzRUJCLCAweDQ1QzMsCisKKwkweDAwMDAsIDB4QTQwNCwgMHgwMDAxLCAweEE1MDQsIDB4MTQxRiwgMHgwNjcxLCAweDE0RkQsIDB4MDI4NywKKwkweDNFQkMsIDB4RTYxMCwgMHgzRUM4LCAweDBDN0IsIDB4MDMxQSwgMHgwN0U2LCAweDNFQzgsIDB4ODZGNywKKwkweDNFQzAsIDB4ODIxRSwgMHgzRUJFLCAweEQyMDgsIDB4M0VCRCwgMHgwMjFGLCAweDNFQ0EsIDB4MDM4NiwKKwkweDNFQzEsIDB4MEMwMywgMHgzRUM5LCAweDAzMUUsIDB4M0VDQSwgMHg4QzRDLCAweDNFQkYsIDB4MEM1NSwKKworCTB4M0VDOSwgMHhDMjA4LCAweDNFQzQsIDB4QkM4NCwgMHgzRUM4LCAweDBFQUQsIDB4M0VDOCwgMHhEMzA4LAorCTB4M0VDMiwgMHg4RjdFLCAweDNFQ0IsIDB4MDIxOSwgMHgzRUNCLCAweEQyNkUsIDB4M0VDNSwgMHgwMzFGLAorCTB4M0VDNiwgMHhDMzA4LCAweDNFQzMsIDB4MzJGRiwgMHgzRUM5LCAweDAyNjUsIDB4M0VDOSwgMHg4MzE5LAorCTB4MTM0MiwgMHhEMzZFLCAweDNFQzcsIDB4MzNGRiwgMHgwMDAwLCAweDgzNjUsIDB4MTQyMCwgMHg5NTcwLAorfTsKKworCisvKiBzZW5kIGluaXRpYWxpemF0aW9uIGFycmF5cyB0byBzdGFydCB1cCAqLworc3RhdGljIHZvaWQKK2F3ZV9pbml0X2FycmF5KHZvaWQpCit7CisJYXdlX3NlbmRfYXJyYXkoaW5pdDEpOworCWF3ZV93YWl0KDEwMjQpOworCWF3ZV9zZW5kX2FycmF5KGluaXQyKTsKKwlhd2Vfc2VuZF9hcnJheShpbml0Myk7CisJYXdlX3Bva2VfZHcoQVdFX0hXQ0Y0LCAwKTsKKwlhd2VfcG9rZV9kdyhBV0VfSFdDRjUsIDB4ODMpOworCWF3ZV9wb2tlX2R3KEFXRV9IV0NGNiwgMHg4MDAwKTsKKwlhd2Vfc2VuZF9hcnJheShpbml0NCk7Cit9CisKKy8qIHNlbmQgYW4gaW5pdGlhbGl6YXRpb24gYXJyYXkgKi8KK3N0YXRpYyB2b2lkCithd2Vfc2VuZF9hcnJheSh1bnNpZ25lZCBzaG9ydCAqZGF0YSkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBzaG9ydCAqcDsKKworCXAgPSBkYXRhOworCWZvciAoaSA9IDA7IGkgPCBBV0VfTUFYX1ZPSUNFUzsgaSsrLCBwKyspCisJCWF3ZV9wb2tlKEFXRV9JTklUMShpKSwgKnApOworCWZvciAoaSA9IDA7IGkgPCBBV0VfTUFYX1ZPSUNFUzsgaSsrLCBwKyspCisJCWF3ZV9wb2tlKEFXRV9JTklUMihpKSwgKnApOworCWZvciAoaSA9IDA7IGkgPCBBV0VfTUFYX1ZPSUNFUzsgaSsrLCBwKyspCisJCWF3ZV9wb2tlKEFXRV9JTklUMyhpKSwgKnApOworCWZvciAoaSA9IDA7IGkgPCBBV0VfTUFYX1ZPSUNFUzsgaSsrLCBwKyspCisJCWF3ZV9wb2tlKEFXRV9JTklUNChpKSwgKnApOworfQorCisKKy8qCisgKiBzZXQgdXAgYXdlMzIgY2hhbm5lbHMgdG8gc29tZSBrbm93biBzdGF0ZS4KKyAqLworCisvKiBzZXQgdGhlIGVudmVsb3BlICYgTEZPIHBhcmFtZXRlcnMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzOyBzZWUgQURJUCAqLworc3RhdGljIHZvaWQKK2F3ZV90d2Vha192b2ljZShpbnQgaSkKK3sKKwkvKiBzZXQgYWxsIG1vZC92b2wgZW52ZWxvcGUgc2hhcGUgdG8gbWluaW11bSAqLworCWF3ZV9wb2tlKEFXRV9FTlZWT0woaSksIDB4ODAwMCk7CisJYXdlX3Bva2UoQVdFX0VOVlZBTChpKSwgMHg4MDAwKTsKKwlhd2VfcG9rZShBV0VfRENZU1VTKGkpLCAweDdGN0YpOworCWF3ZV9wb2tlKEFXRV9BVEtITERWKGkpLCAweDdGN0YpOworCWF3ZV9wb2tlKEFXRV9BVEtITEQoaSksIDB4N0Y3Rik7CisJYXdlX3Bva2UoQVdFX1BFRkUoaSksIDApOyAgLyogbW9kIGVudmVsb3BlIGhlaWdodCB0byB6ZXJvICovCisJYXdlX3Bva2UoQVdFX0xGTzFWQUwoaSksIDB4ODAwMCk7IC8qIG5vIGRlbGF5IGZvciBMRk8xICovCisJYXdlX3Bva2UoQVdFX0xGTzJWQUwoaSksIDB4ODAwMCk7CisJYXdlX3Bva2UoQVdFX0lQKGkpLCAweEUwMDApOwkvKiBubyBwaXRjaCBzaGlmdCAqLworCWF3ZV9wb2tlKEFXRV9JRkFUTihpKSwgMHhGRjAwKTsJLyogdm9sdW1lIHRvIG1pbmltdW0gKi8KKwlhd2VfcG9rZShBV0VfRk1NT0QoaSksIDApOworCWF3ZV9wb2tlKEFXRV9UUkVNRlJRKGkpLCAwKTsKKwlhd2VfcG9rZShBV0VfRk0yRlJRMihpKSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCithd2VfdHdlYWsodm9pZCkKK3sKKwlpbnQgaTsKKwkvKiByZXNldCBhbGwgY2hhbm5lbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgYXdlX21heF92b2ljZXM7IGkrKykKKwkJYXdlX3R3ZWFrX3ZvaWNlKGkpOworfQorCisKKy8qCisgKiAgaW5pdGlhbGl6ZXMgdGhlIEZNIHNlY3Rpb24gb2YgQVdFMzI7CisgKiAgIHNlZSBWaW5jZSBWdSdzIHVub2ZmaWNpYWwgQVdFMzIgcHJvZ3JhbW1pbmcgZ3VpZGUKKyAqLworCitzdGF0aWMgdm9pZAorYXdlX2luaXRfZm0odm9pZCkKK3sKKyNpZm5kZWYgQVdFX0FMV0FZU19JTklUX0ZNCisJLyogaWYgbm8gZXh0ZW5kZWQgbWVtb3J5IGlzIG9uIGJvYXJkLi4gKi8KKwlpZiAobWVtc2l6ZSA8PSAwKQorCQlyZXR1cm47CisjZW5kaWYKKwlERUJVRygzLHByaW50aygiQVdFMzI6IGluaXRpYWxpemluZyBGTVxuIikpOworCisJLyogSW5pdGlhbGl6ZSB0aGUgbGFzdCB0d28gY2hhbm5lbHMgZm9yIERSQU0gcmVmcmVzaCBhbmQgcHJvZHVjaW5nCisJICAgdGhlIHJldmVyYiBhbmQgY2hvcnVzIGVmZmVjdHMgZm9yIFlhbWFoYSBPUEwtMyBzeW50aGVzaXplciAqLworCisJLyogMzE6IEZNIGxlZnQgY2hhbm5lbCwgMHhmZmZmZTAtMHhmZmZmZTggKi8KKwlhd2VfcG9rZShBV0VfRENZU1VTVigzMCksIDB4ODApOworCWF3ZV9wb2tlX2R3KEFXRV9QU1NUKDMwKSwgMHhGRkZGRkZFMCk7IC8qIGZ1bGwgbGVmdCAqLworCWF3ZV9wb2tlX2R3KEFXRV9DU0woMzApLCAweDAwRkZGRkU4IHwKKwkJICAgIChERUZfRk1fQ0hPUlVTX0RFUFRIIDw8IDI0KSk7CisJYXdlX3Bva2VfZHcoQVdFX1BUUlgoMzApLCAoREVGX0ZNX1JFVkVSQl9ERVBUSCA8PCA4KSk7CisJYXdlX3Bva2VfZHcoQVdFX0NQRigzMCksIDApOworCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKDMwKSwgMHgwMEZGRkZFMyk7CisKKwkvKiAzMjogRk0gcmlnaHQgY2hhbm5lbCwgMHhmZmZmZjAtMHhmZmZmZjggKi8KKwlhd2VfcG9rZShBV0VfRENZU1VTVigzMSksIDB4ODApOworCWF3ZV9wb2tlX2R3KEFXRV9QU1NUKDMxKSwgMHgwMEZGRkZGMCk7IC8qIGZ1bGwgcmlnaHQgKi8KKwlhd2VfcG9rZV9kdyhBV0VfQ1NMKDMxKSwgMHgwMEZGRkZGOCB8CisJCSAgICAoREVGX0ZNX0NIT1JVU19ERVBUSCA8PCAyNCkpOworCWF3ZV9wb2tlX2R3KEFXRV9QVFJYKDMxKSwgKERFRl9GTV9SRVZFUkJfREVQVEggPDwgOCkpOworCWF3ZV9wb2tlX2R3KEFXRV9DUEYoMzEpLCAweDgwMDApOworCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKDMxKSwgMHgwMEZGRkZGMyk7CisKKwkvKiBza2V3IHZvbHVtZSAmIGN1dG9mZiAqLworCWF3ZV9wb2tlX2R3KEFXRV9WVEZUKDMwKSwgMHg4MDAwRkZGRik7CisJYXdlX3Bva2VfZHcoQVdFX1ZURlQoMzEpLCAweDgwMDBGRkZGKTsKKworCXZvaWNlc1szMF0uc3RhdGUgPSBBV0VfU1RfRk07CisJdm9pY2VzWzMxXS5zdGF0ZSA9IEFXRV9TVF9GTTsKKworCS8qIGNoYW5nZSBtYXhpbXVtIGNoYW5uZWxzIHRvIDMwICovCisJYXdlX21heF92b2ljZXMgPSBBV0VfTk9STUFMX1ZPSUNFUzsKKwlpZiAocGxheWluZ19tb2RlID09IEFXRV9QTEFZX0RJUkVDVCkKKwkJYXdlX2luZm8ubnJfdm9pY2VzID0gYXdlX21heF92b2ljZXM7CisJZWxzZQorCQlhd2VfaW5mby5ucl92b2ljZXMgPSBBV0VfTUFYX0NIQU5ORUxTOworCXZvaWNlX2FsbG9jLT5tYXhfdm9pY2UgPSBhd2VfbWF4X3ZvaWNlczsKK30KKworLyoKKyAqICBBV0UzMiBEUkFNIGFjY2VzcyByb3V0aW5lcworICovCisKKy8qIG9wZW4gRFJBTSB3cml0ZSBhY2Nlc3NpbmcgbW9kZSAqLworc3RhdGljIGludAorYXdlX29wZW5fZHJhbV9mb3Jfd3JpdGUoaW50IG9mZnNldCwgaW50IGNoYW5uZWxzKQoreworCWludCB2aWR4W0FXRV9OT1JNQUxfVk9JQ0VTXTsKKwlpbnQgaTsKKworCWlmIChjaGFubmVscyA8IDAgfHwgY2hhbm5lbHMgPj0gQVdFX05PUk1BTF9WT0lDRVMpIHsKKwkJY2hhbm5lbHMgPSBBV0VfTk9STUFMX1ZPSUNFUzsKKwkJZm9yIChpID0gMDsgaSA8IEFXRV9OT1JNQUxfVk9JQ0VTOyBpKyspCisJCQl2aWR4W2ldID0gaTsKKwl9IGVsc2UgeworCQlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworCQkJdmlkeFtpXSA9IGF3ZV9jbGVhcl92b2ljZSgpOworCQkJdm9pY2VzW3ZpZHhbaV1dLnN0YXRlID0gQVdFX1NUX01BUks7CisJCX0KKwl9CisKKwkvKiB1c2UgYWxsIGNoYW5uZWxzIGZvciBETUEgdHJhbnNmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY2hhbm5lbHM7IGkrKykgeworCQlpZiAodmlkeFtpXSA8IDApIGNvbnRpbnVlOworCQlhd2VfcG9rZShBV0VfRENZU1VTVih2aWR4W2ldKSwgMHg4MCk7CisJCWF3ZV9wb2tlX2R3KEFXRV9WVEZUKHZpZHhbaV0pLCAwKTsKKwkJYXdlX3Bva2VfZHcoQVdFX0NWQ0YodmlkeFtpXSksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfUFRSWCh2aWR4W2ldKSwgMHg0MDAwMDAwMCk7CisJCWF3ZV9wb2tlX2R3KEFXRV9DUEYodmlkeFtpXSksIDB4NDAwMDAwMDApOworCQlhd2VfcG9rZV9kdyhBV0VfUFNTVCh2aWR4W2ldKSwgMCk7CisJCWF3ZV9wb2tlX2R3KEFXRV9DU0wodmlkeFtpXSksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfQ0NDQSh2aWR4W2ldKSwgMHgwNjAwMDAwMCk7CisJCXZvaWNlc1t2aWR4W2ldXS5zdGF0ZSA9IEFXRV9TVF9EUkFNOworCX0KKwkvKiBwb2ludCBjaGFubmVscyAzMSAmIDMyIHRvIFJPTSBzYW1wbGVzIGZvciBEUkFNIHJlZnJlc2ggKi8KKwlhd2VfcG9rZV9kdyhBV0VfVlRGVCgzMCksIDApOworCWF3ZV9wb2tlX2R3KEFXRV9QU1NUKDMwKSwgMHgxZDgpOworCWF3ZV9wb2tlX2R3KEFXRV9DU0woMzApLCAweDFlMCk7CisJYXdlX3Bva2VfZHcoQVdFX0NDQ0EoMzApLCAweDFkOCk7CisJYXdlX3Bva2VfZHcoQVdFX1ZURlQoMzEpLCAwKTsKKwlhd2VfcG9rZV9kdyhBV0VfUFNTVCgzMSksIDB4MWQ4KTsKKwlhd2VfcG9rZV9kdyhBV0VfQ1NMKDMxKSwgMHgxZTApOworCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKDMxKSwgMHgxZDgpOworCXZvaWNlc1szMF0uc3RhdGUgPSBBV0VfU1RfRk07CisJdm9pY2VzWzMxXS5zdGF0ZSA9IEFXRV9TVF9GTTsKKworCS8qIGlmIGZ1bGwgYml0IGlzIG9uLCBub3QgcmVhZHkgdG8gd3JpdGUgb24gKi8KKwlpZiAoYXdlX3BlZWtfZHcoQVdFX1NNQUxXKSAmIDB4ODAwMDAwMDApIHsKKwkJZm9yIChpID0gMDsgaSA8IGNoYW5uZWxzOyBpKyspIHsKKwkJCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKHZpZHhbaV0pLCAwKTsKKwkJCXZvaWNlc1t2aWR4W2ldXS5zdGF0ZSA9IEFXRV9TVF9PRkY7CisJCX0KKwkJcHJpbnRrKCJhd2U6IG5vdCByZWFkeSB0byB3cml0ZS4uXG4iKTsKKwkJcmV0dXJuIC1FUEVSTTsKKwl9CisKKwkvKiBzZXQgYWRkcmVzcyB0byB3cml0ZSAqLworCWF3ZV9wb2tlX2R3KEFXRV9TTUFMVywgb2Zmc2V0KTsKKworCXJldHVybiAwOworfQorCisvKiBvcGVuIERSQU0gZm9yIFJBTSBzaXplIGRldGVjdGlvbiAqLworc3RhdGljIHZvaWQKK2F3ZV9vcGVuX2RyYW1fZm9yX2NoZWNrKHZvaWQpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFXRV9OT1JNQUxfVk9JQ0VTOyBpKyspIHsKKwkJYXdlX3Bva2UoQVdFX0RDWVNVU1YoaSksIDB4ODApOworCQlhd2VfcG9rZV9kdyhBV0VfVlRGVChpKSwgMCk7CisJCWF3ZV9wb2tlX2R3KEFXRV9DVkNGKGkpLCAwKTsKKwkJYXdlX3Bva2VfZHcoQVdFX1BUUlgoaSksIDB4NDAwMDAwMDApOworCQlhd2VfcG9rZV9kdyhBV0VfQ1BGKGkpLCAweDQwMDAwMDAwKTsKKwkJYXdlX3Bva2VfZHcoQVdFX1BTU1QoaSksIDApOworCQlhd2VfcG9rZV9kdyhBV0VfQ1NMKGkpLCAwKTsKKwkJaWYgKGkgJiAxKSAvKiBETUEgd3JpdGUgKi8KKwkJCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKGkpLCAweDA2MDAwMDAwKTsKKwkJZWxzZQkgICAvKiBETUEgcmVhZCAqLworCQkJYXdlX3Bva2VfZHcoQVdFX0NDQ0EoaSksIDB4MDQwMDAwMDApOworCQl2b2ljZXNbaV0uc3RhdGUgPSBBV0VfU1RfRFJBTTsKKwl9Cit9CisKKworLyogY2xvc2UgZHJhbSBhY2Nlc3MgKi8KK3N0YXRpYyB2b2lkCithd2VfY2xvc2VfZHJhbSh2b2lkKQoreworCWludCBpOworCS8qIHdhaXQgdW50aWwgRlVMTCBiaXQgaW4gU01BeFcgcmVnaXN0ZXIgYmUgZmFsc2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTAwMDA7IGkrKykgeworCQlpZiAoIShhd2VfcGVla19kdyhBV0VfU01BTFcpICYgMHg4MDAwMDAwMCkpCisJCQlicmVhazsKKwkJYXdlX3dhaXQoMTApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBV0VfTk9STUFMX1ZPSUNFUzsgaSsrKSB7CisJCWlmICh2b2ljZXNbaV0uc3RhdGUgPT0gQVdFX1NUX0RSQU0pIHsKKwkJCWF3ZV9wb2tlX2R3KEFXRV9DQ0NBKGkpLCAwKTsKKwkJCWF3ZV9wb2tlKEFXRV9EQ1lTVVNWKGkpLCAweDgwN0YpOworCQkJdm9pY2VzW2ldLnN0YXRlID0gQVdFX1NUX09GRjsKKwkJfQorCX0KK30KKworCisvKgorICogY2hlY2sgZHJhbSBzaXplIG9uIEFXRSBib2FyZAorICovCisKKy8qIGFueSB0aHJlZSBudW1iZXJzIHlvdSBsaWtlICovCisjZGVmaW5lIFVOSVFVRV9JRDEJMHgxMjM0CisjZGVmaW5lIFVOSVFVRV9JRDIJMHg0MzIxCisjZGVmaW5lIFVOSVFVRV9JRDMJMHhBQkNECisKK3N0YXRpYyB2b2lkIF9faW5pdAorYXdlX2NoZWNrX2RyYW0odm9pZCkKK3sKKwlpZiAoYXdlX3ByZXNlbnQpIC8qIGFscmVhZHkgaW5pdGlhbGl6ZWQgKi8KKwkJcmV0dXJuOworCisJaWYgKG1lbXNpemUgPj0gMCkgeyAvKiBnaXZlbiBieSBjb25maWcgZmlsZSBvciBtb2R1bGUgb3B0aW9uICovCisJCW1lbXNpemUgKj0gMTAyNDsgLyogY29udmVydCB0byBLYnl0ZXMgKi8KKwkJcmV0dXJuOworCX0KKworCWF3ZV9vcGVuX2RyYW1fZm9yX2NoZWNrKCk7CisKKwltZW1zaXplID0gMDsKKworCS8qIHNldCB1cCB1bmlxdWUgdHdvIGlkIG51bWJlcnMgKi8KKwlhd2VfcG9rZV9kdyhBV0VfU01BTFcsIEFXRV9EUkFNX09GRlNFVCk7CisJYXdlX3Bva2UoQVdFX1NNTEQsIFVOSVFVRV9JRDEpOworCWF3ZV9wb2tlKEFXRV9TTUxELCBVTklRVUVfSUQyKTsKKworCXdoaWxlIChtZW1zaXplIDwgQVdFX01BWF9EUkFNX1NJWkUpIHsKKwkJYXdlX3dhaXQoNSk7CisJCS8qIHJlYWQgYSBkYXRhIG9uIHRoZSBEUkFNIHN0YXJ0IGFkZHJlc3MgKi8KKwkJYXdlX3Bva2VfZHcoQVdFX1NNQUxSLCBBV0VfRFJBTV9PRkZTRVQpOworCQlhd2VfcGVlayhBV0VfU01MRCk7IC8qIGRpc2NhcmQgc3RhbGUgZGF0YSAgKi8KKwkJaWYgKGF3ZV9wZWVrKEFXRV9TTUxEKSAhPSBVTklRVUVfSUQxKQorCQkJYnJlYWs7CisJCWlmIChhd2VfcGVlayhBV0VfU01MRCkgIT0gVU5JUVVFX0lEMikKKwkJCWJyZWFrOworCQltZW1zaXplICs9IDUxMjsgIC8qIGluY3JlbWVudCA1MTJrYnl0ZXMgKi8KKwkJLyogV3JpdGUgYSB1bmlxdWUgZGF0YSBvbiB0aGUgdGVzdCBhZGRyZXNzOworCQkgKiBpZiB0aGUgYWRkcmVzcyBpcyBvdXQgb2YgcmFuZ2UsIHRoZSBkYXRhIGlzIHdyaXR0ZW4gb24KKwkJICogMHgyMDAwMDAoPUFXRV9EUkFNX09GRlNFVCkuICBUaGVuIHRoZSB0d28gaWQgd29yZHMgYXJlCisJCSAqIGJyb2tlbiBieSB0aGlzIGRhdGEuCisJCSAqLworCQlhd2VfcG9rZV9kdyhBV0VfU01BTFcsIEFXRV9EUkFNX09GRlNFVCArIG1lbXNpemUqNTEyTCk7CisJCWF3ZV9wb2tlKEFXRV9TTUxELCBVTklRVUVfSUQzKTsKKwkJYXdlX3dhaXQoNSk7CisJCS8qIHJlYWQgYSBkYXRhIG9uIHRoZSBqdXN0IHdyaXR0ZW4gRFJBTSBhZGRyZXNzICovCisJCWF3ZV9wb2tlX2R3KEFXRV9TTUFMUiwgQVdFX0RSQU1fT0ZGU0VUICsgbWVtc2l6ZSo1MTJMKTsKKwkJYXdlX3BlZWsoQVdFX1NNTEQpOyAvKiBkaXNjYXJkIHN0YWxlIGRhdGEgICovCisJCWlmIChhd2VfcGVlayhBV0VfU01MRCkgIT0gVU5JUVVFX0lEMykKKwkJCWJyZWFrOworCX0KKwlhd2VfY2xvc2VfZHJhbSgpOworCisJREVCVUcoMCxwcmludGsoIkFXRTMyOiAlZCBLYnl0ZXMgbWVtb3J5IGRldGVjdGVkXG4iLCBtZW1zaXplKSk7CisKKwkvKiBjb252ZXJ0IHRvIEtieXRlcyAqLworCW1lbXNpemUgKj0gMTAyNDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKgorICogY2hvcnVzIGFuZCByZXZlcmIgY29udHJvbHM7IGZyb20gVlYncyBndWlkZQorICovCisKKy8qIDUgcGFyYW1ldGVycyBmb3IgZWFjaCBjaG9ydXMgbW9kZTsgMyB4IDE2Yml0LCAyIHggMzJiaXQgKi8KK3N0YXRpYyBjaGFyIGNob3J1c19kZWZpbmVkW0FXRV9DSE9SVVNfTlVNQkVSU107CitzdGF0aWMgYXdlX2Nob3J1c19meF9yZWMgY2hvcnVzX3Bhcm1bQVdFX0NIT1JVU19OVU1CRVJTXSA9IHsKKwl7MHhFNjAwLCAweDAzRjYsIDB4QkMyQyAsMHgwMDAwMDAwMCwgMHgwMDAwMDA2RH0sIC8qIGNob3J1cyAxICovCisJezB4RTYwOCwgMHgwMzFBLCAweEJDNkUsIDB4MDAwMDAwMDAsIDB4MDAwMDAxN0N9LCAvKiBjaG9ydXMgMiAqLworCXsweEU2MTAsIDB4MDMxQSwgMHhCQzg0LCAweDAwMDAwMDAwLCAweDAwMDAwMDgzfSwgLyogY2hvcnVzIDMgKi8KKwl7MHhFNjIwLCAweDAyNjksIDB4QkM2RSwgMHgwMDAwMDAwMCwgMHgwMDAwMDE3Q30sIC8qIGNob3J1cyA0ICovCisJezB4RTY4MCwgMHgwNEQzLCAweEJDQTYsIDB4MDAwMDAwMDAsIDB4MDAwMDAwNUJ9LCAvKiBmZWVkYmFjayAqLworCXsweEU2RTAsIDB4MDQ0RSwgMHhCQzM3LCAweDAwMDAwMDAwLCAweDAwMDAwMDI2fSwgLyogZmxhbmdlciAqLworCXsweEU2MDAsIDB4MEIwNiwgMHhCQzAwLCAweDAwMDBFMDAwLCAweDAwMDAwMDgzfSwgLyogc2hvcnQgZGVsYXkgKi8KKwl7MHhFNkMwLCAweDBCMDYsIDB4QkMwMCwgMHgwMDAwRTAwMCwgMHgwMDAwMDA4M30sIC8qIHNob3J0IGRlbGF5ICsgZmVlZGJhY2sgKi8KK307CisKK3N0YXRpYyBpbnQKK2F3ZV9sb2FkX2Nob3J1c19meChhd2VfcGF0Y2hfaW5mbyAqcGF0Y2gsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLCBpbnQgY291bnQpCit7CisJaWYgKHBhdGNoLT5vcHRhcmcgPCBBV0VfQ0hPUlVTX1BSRURFRklORUQgfHwgcGF0Y2gtPm9wdGFyZyA+PSBBV0VfQ0hPUlVTX05VTUJFUlMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IGludmFsaWQgY2hvcnVzIG1vZGUgJWQgZm9yIHVwbG9hZGluZ1xuIiwgcGF0Y2gtPm9wdGFyZyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY291bnQgPCBzaXplb2YoYXdlX2Nob3J1c19meF9yZWMpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkFXRTMyIEVycm9yOiB0b28gc2hvcnQgY2hvcnVzIGZ4IHBhcmFtZXRlcnNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvcHlfZnJvbV91c2VyKCZjaG9ydXNfcGFybVtwYXRjaC0+b3B0YXJnXSwgYWRkciArIEFXRV9QQVRDSF9JTkZPX1NJWkUsCisJCQkgICBzaXplb2YoYXdlX2Nob3J1c19meF9yZWMpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJY2hvcnVzX2RlZmluZWRbcGF0Y2gtPm9wdGFyZ10gPSBUUlVFOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYXdlX3NldF9jaG9ydXNfbW9kZShpbnQgZWZmZWN0KQoreworCWlmIChlZmZlY3QgPCAwIHx8IGVmZmVjdCA+PSBBV0VfQ0hPUlVTX05VTUJFUlMgfHwKKwkgICAgKGVmZmVjdCA+PSBBV0VfQ0hPUlVTX1BSRURFRklORUQgJiYgIWNob3J1c19kZWZpbmVkW2VmZmVjdF0pKQorCQlyZXR1cm47CisJYXdlX3Bva2UoQVdFX0lOSVQzKDkpLCBjaG9ydXNfcGFybVtlZmZlY3RdLmZlZWRiYWNrKTsKKwlhd2VfcG9rZShBV0VfSU5JVDMoMTIpLCBjaG9ydXNfcGFybVtlZmZlY3RdLmRlbGF5X29mZnNldCk7CisJYXdlX3Bva2UoQVdFX0lOSVQ0KDMpLCBjaG9ydXNfcGFybVtlZmZlY3RdLmxmb19kZXB0aCk7CisJYXdlX3Bva2VfZHcoQVdFX0hXQ0Y0LCBjaG9ydXNfcGFybVtlZmZlY3RdLmRlbGF5KTsKKwlhd2VfcG9rZV9kdyhBV0VfSFdDRjUsIGNob3J1c19wYXJtW2VmZmVjdF0ubGZvX2ZyZXEpOworCWF3ZV9wb2tlX2R3KEFXRV9IV0NGNiwgMHg4MDAwKTsKKwlhd2VfcG9rZV9kdyhBV0VfSFdDRjcsIDB4MDAwMCk7Cit9CisKK3N0YXRpYyB2b2lkCithd2VfdXBkYXRlX2Nob3J1c19tb2RlKHZvaWQpCit7CisJYXdlX3NldF9jaG9ydXNfbW9kZShjdHJsc1tBV0VfTURfQ0hPUlVTX01PREVdKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyogcmV2ZXJiIG1vZGUgc2V0dGluZ3M7IHdyaXRlIHRoZSBmb2xsb3dpbmcgMjggZGF0YSBvZiAxNiBiaXQgbGVuZ3RoCisgKiAgIG9uIHRoZSBjb3JyZXNwb25kaW5nIHBvcnRzIGluIHRoZSByZXZlcmJfY21kcyBhcnJheQorICovCitzdGF0aWMgY2hhciByZXZlcmJfZGVmaW5lZFtBV0VfQ0hPUlVTX05VTUJFUlNdOworc3RhdGljIGF3ZV9yZXZlcmJfZnhfcmVjIHJldmVyYl9wYXJtW0FXRV9SRVZFUkJfTlVNQkVSU10gPSB7Cit7eyAgLyogcm9vbSAxICovCisJMHhCNDg4LCAweEE0NTAsIDB4OTU1MCwgMHg4NEI1LCAweDM4M0EsIDB4M0VCNSwgMHg3MkY0LAorCTB4NzJBNCwgMHg3MjU0LCAweDcyMDQsIDB4NzIwNCwgMHg3MjA0LCAweDQ0MTYsIDB4NDUxNiwKKwkweEE0OTAsIDB4QTU5MCwgMHg4NDJBLCAweDg1MkEsIDB4ODQyQSwgMHg4NTJBLCAweDg0MjksCisJMHg4NTI5LCAweDg0MjksIDB4ODUyOSwgMHg4NDI4LCAweDg1MjgsIDB4ODQyOCwgMHg4NTI4LAorfX0sCit7eyAgLyogcm9vbSAyICovCisJMHhCNDg4LCAweEE0NTgsIDB4OTU1OCwgMHg4NEI1LCAweDM4M0EsIDB4M0VCNSwgMHg3Mjg0LAorCTB4NzI1NCwgMHg3MjI0LCAweDcyMjQsIDB4NzI1NCwgMHg3Mjg0LCAweDQ0NDgsIDB4NDU0OCwKKwkweEE0NDAsIDB4QTU0MCwgMHg4NDJBLCAweDg1MkEsIDB4ODQyQSwgMHg4NTJBLCAweDg0MjksCisJMHg4NTI5LCAweDg0MjksIDB4ODUyOSwgMHg4NDI4LCAweDg1MjgsIDB4ODQyOCwgMHg4NTI4LAorfX0sCit7eyAgLyogcm9vbSAzICovCisJMHhCNDg4LCAweEE0NjAsIDB4OTU2MCwgMHg4NEI1LCAweDM4M0EsIDB4M0VCNSwgMHg3Mjg0LAorCTB4NzI1NCwgMHg3MjI0LCAweDcyMjQsIDB4NzI1NCwgMHg3Mjg0LCAweDQ0MTYsIDB4NDUxNiwKKwkweEE0OTAsIDB4QTU5MCwgMHg4NDJDLCAweDg1MkMsIDB4ODQyQywgMHg4NTJDLCAweDg0MkIsCisJMHg4NTJCLCAweDg0MkIsIDB4ODUyQiwgMHg4NDJBLCAweDg1MkEsIDB4ODQyQSwgMHg4NTJBLAorfX0sCit7eyAgLyogaGFsbCAxICovCisJMHhCNDg4LCAweEE0NzAsIDB4OTU3MCwgMHg4NEI1LCAweDM4M0EsIDB4M0VCNSwgMHg3Mjg0LAorCTB4NzI1NCwgMHg3MjI0LCAweDcyMjQsIDB4NzI1NCwgMHg3Mjg0LCAweDQ0NDgsIDB4NDU0OCwKKwkweEE0NDAsIDB4QTU0MCwgMHg4NDJCLCAweDg1MkIsIDB4ODQyQiwgMHg4NTJCLCAweDg0MkEsCisJMHg4NTJBLCAweDg0MkEsIDB4ODUyQSwgMHg4NDI5LCAweDg1MjksIDB4ODQyOSwgMHg4NTI5LAorfX0sCit7eyAgLyogaGFsbCAyICovCisJMHhCNDg4LCAweEE0NzAsIDB4OTU3MCwgMHg4NEI1LCAweDM4M0EsIDB4M0VCNSwgMHg3MjU0LAorCTB4NzIzNCwgMHg3MjI0LCAweDcyNTQsIDB4NzI2NCwgMHg3Mjk0LCAweDQ0QzMsIDB4NDVDMywKKwkweEE0MDQsIDB4QTUwNCwgMHg4NDJBLCAweDg1MkEsIDB4ODQyQSwgMHg4NTJBLCAweDg0MjksCisJMHg4NTI5LCAweDg0MjksIDB4ODUyOSwgMHg4NDI4LCAweDg1MjgsIDB4ODQyOCwgMHg4NTI4LAorfX0sCit7eyAgLyogcGxhdGUgKi8KKwkweEI0RkYsIDB4QTQ3MCwgMHg5NTcwLCAweDg0QjUsIDB4MzgzQSwgMHgzRUI1LCAweDcyMzQsCisJMHg3MjM0LCAweDcyMzQsIDB4NzIzNCwgMHg3MjM0LCAweDcyMzQsIDB4NDQ0OCwgMHg0NTQ4LAorCTB4QTQ0MCwgMHhBNTQwLCAweDg0MkEsIDB4ODUyQSwgMHg4NDJBLCAweDg1MkEsIDB4ODQyOSwKKwkweDg1MjksIDB4ODQyOSwgMHg4NTI5LCAweDg0MjgsIDB4ODUyOCwgMHg4NDI4LCAweDg1MjgsCit9fSwKK3t7ICAvKiBkZWxheSAqLworCTB4QjRGRiwgMHhBNDcwLCAweDk1MDAsIDB4ODRCNSwgMHgzMzNBLCAweDM5QjUsIDB4NzIwNCwKKwkweDcyMDQsIDB4NzIwNCwgMHg3MjA0LCAweDcyMDQsIDB4NzJGNCwgMHg0NDAwLCAweDQ1MDAsCisJMHhBNEZGLCAweEE1RkYsIDB4ODQyMCwgMHg4NTIwLCAweDg0MjAsIDB4ODUyMCwgMHg4NDIwLAorCTB4ODUyMCwgMHg4NDIwLCAweDg1MjAsIDB4ODQyMCwgMHg4NTIwLCAweDg0MjAsIDB4ODUyMCwKK319LAore3sgIC8qIHBhbm5pbmcgZGVsYXkgKi8KKwkweEI0RkYsIDB4QTQ5MCwgMHg5NTkwLCAweDg0NzQsIDB4MzMzQSwgMHgzOUI1LCAweDcyMDQsCisJMHg3MjA0LCAweDcyMDQsIDB4NzIwNCwgMHg3MjA0LCAweDcyRjQsIDB4NDQwMCwgMHg0NTAwLAorCTB4QTRGRiwgMHhBNUZGLCAweDg0MjAsIDB4ODUyMCwgMHg4NDIwLCAweDg1MjAsIDB4ODQyMCwKKwkweDg1MjAsIDB4ODQyMCwgMHg4NTIwLCAweDg0MjAsIDB4ODUyMCwgMHg4NDIwLCAweDg1MjAsCit9fSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgUmV2ZXJiQ21kUGFpciB7CisJdW5zaWduZWQgc2hvcnQgY21kLCBwb3J0OworfSByZXZlcmJfY21kc1syOF0gPSB7CisgIHtBV0VfSU5JVDEoMHgwMyl9LCB7QVdFX0lOSVQxKDB4MDUpfSwge0FXRV9JTklUNCgweDFGKX0sIHtBV0VfSU5JVDEoMHgwNyl9LAorICB7QVdFX0lOSVQyKDB4MTQpfSwge0FXRV9JTklUMigweDE2KX0sIHtBV0VfSU5JVDEoMHgwRil9LCB7QVdFX0lOSVQxKDB4MTcpfSwKKyAge0FXRV9JTklUMSgweDFGKX0sIHtBV0VfSU5JVDIoMHgwNyl9LCB7QVdFX0lOSVQyKDB4MEYpfSwge0FXRV9JTklUMigweDE3KX0sCisgIHtBV0VfSU5JVDIoMHgxRCl9LCB7QVdFX0lOSVQyKDB4MUYpfSwge0FXRV9JTklUMygweDAxKX0sIHtBV0VfSU5JVDMoMHgwMyl9LAorICB7QVdFX0lOSVQxKDB4MDkpfSwge0FXRV9JTklUMSgweDBCKX0sIHtBV0VfSU5JVDEoMHgxMSl9LCB7QVdFX0lOSVQxKDB4MTMpfSwKKyAge0FXRV9JTklUMSgweDE5KX0sIHtBV0VfSU5JVDEoMHgxQil9LCB7QVdFX0lOSVQyKDB4MDEpfSwge0FXRV9JTklUMigweDAzKX0sCisgIHtBV0VfSU5JVDIoMHgwOSl9LCB7QVdFX0lOSVQyKDB4MEIpfSwge0FXRV9JTklUMigweDExKX0sIHtBV0VfSU5JVDIoMHgxMyl9LAorfTsKKworc3RhdGljIGludAorYXdlX2xvYWRfcmV2ZXJiX2Z4KGF3ZV9wYXRjaF9pbmZvICpwYXRjaCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsIGludCBjb3VudCkKK3sKKwlpZiAocGF0Y2gtPm9wdGFyZyA8IEFXRV9SRVZFUkJfUFJFREVGSU5FRCB8fCBwYXRjaC0+b3B0YXJnID49IEFXRV9SRVZFUkJfTlVNQkVSUykgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJBV0UzMiBFcnJvcjogaW52YWxpZCByZXZlcmIgbW9kZSAlZCBmb3IgdXBsb2FkaW5nXG4iLCBwYXRjaC0+b3B0YXJnKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb3VudCA8IHNpemVvZihhd2VfcmV2ZXJiX2Z4X3JlYykpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiQVdFMzIgRXJyb3I6IHRvbyBzaG9ydCByZXZlcmIgZnggcGFyYW1ldGVyc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY29weV9mcm9tX3VzZXIoJnJldmVyYl9wYXJtW3BhdGNoLT5vcHRhcmddLCBhZGRyICsgQVdFX1BBVENIX0lORk9fU0laRSwKKwkJCSAgIHNpemVvZihhd2VfcmV2ZXJiX2Z4X3JlYykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXZlcmJfZGVmaW5lZFtwYXRjaC0+b3B0YXJnXSA9IFRSVUU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithd2Vfc2V0X3JldmVyYl9tb2RlKGludCBlZmZlY3QpCit7CisJaW50IGk7CisJaWYgKGVmZmVjdCA8IDAgfHwgZWZmZWN0ID49IEFXRV9SRVZFUkJfTlVNQkVSUyB8fAorCSAgICAoZWZmZWN0ID49IEFXRV9SRVZFUkJfUFJFREVGSU5FRCAmJiAhcmV2ZXJiX2RlZmluZWRbZWZmZWN0XSkpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgMjg7IGkrKykKKwkJYXdlX3Bva2UocmV2ZXJiX2NtZHNbaV0uY21kLCByZXZlcmJfY21kc1tpXS5wb3J0LAorCQkJIHJldmVyYl9wYXJtW2VmZmVjdF0ucGFybXNbaV0pOworfQorCitzdGF0aWMgdm9pZAorYXdlX3VwZGF0ZV9yZXZlcmJfbW9kZSh2b2lkKQoreworCWF3ZV9zZXRfcmV2ZXJiX21vZGUoY3RybHNbQVdFX01EX1JFVkVSQl9NT0RFXSk7Cit9CisKKy8qCisgKiB0cmVibGUvYmFzcyBlcXVhbGl6ZXIgY29udHJvbAorICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBiYXNzX3Bhcm1bMTJdWzNdID0geworCXsweEQyNkEsIDB4RDM2QSwgMHgwMDAwfSwgLyogLTEyIGRCICovCisJezB4RDI1QiwgMHhEMzVCLCAweDAwMDB9LCAvKiAgLTggKi8KKwl7MHhEMjRDLCAweEQzNEMsIDB4MDAwMH0sIC8qICAtNiAqLworCXsweEQyM0QsIDB4RDMzRCwgMHgwMDAwfSwgLyogIC00ICovCisJezB4RDIxRiwgMHhEMzFGLCAweDAwMDB9LCAvKiAgLTIgKi8KKwl7MHhDMjA4LCAweEMzMDgsIDB4MDAwMX0sIC8qICAgMCAoSFcgZGVmYXVsdCkgKi8KKwl7MHhDMjE5LCAweEMzMTksIDB4MDAwMX0sIC8qICArMiAqLworCXsweEMyMkEsIDB4QzMyQSwgMHgwMDAxfSwgLyogICs0ICovCisJezB4QzI0QywgMHhDMzRDLCAweDAwMDF9LCAvKiAgKzYgKi8KKwl7MHhDMjZFLCAweEMzNkUsIDB4MDAwMX0sIC8qICArOCAqLworCXsweEMyNDgsIDB4QzM0OCwgMHgwMDAyfSwgLyogKzEwICovCisJezB4QzI2QSwgMHhDMzZBLCAweDAwMDJ9LCAvKiArMTIgZEIgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB0cmVibGVfcGFybVsxMl1bOV0gPSB7CisJezB4ODIxRSwgMHhDMjZBLCAweDAzMUUsIDB4QzM2QSwgMHgwMjFFLCAweEQyMDgsIDB4ODMxRSwgMHhEMzA4LCAweDAwMDF9LCAvKiAtMTIgZEIgKi8KKwl7MHg4MjFFLCAweEMyNUIsIDB4MDMxRSwgMHhDMzVCLCAweDAyMUUsIDB4RDIwOCwgMHg4MzFFLCAweEQzMDgsIDB4MDAwMX0sCisJezB4ODIxRSwgMHhDMjRDLCAweDAzMUUsIDB4QzM0QywgMHgwMjFFLCAweEQyMDgsIDB4ODMxRSwgMHhEMzA4LCAweDAwMDF9LAorCXsweDgyMUUsIDB4QzIzRCwgMHgwMzFFLCAweEMzM0QsIDB4MDIxRSwgMHhEMjA4LCAweDgzMUUsIDB4RDMwOCwgMHgwMDAxfSwKKwl7MHg4MjFFLCAweEMyMUYsIDB4MDMxRSwgMHhDMzFGLCAweDAyMUUsIDB4RDIwOCwgMHg4MzFFLCAweEQzMDgsIDB4MDAwMX0sCisJezB4ODIxRSwgMHhEMjA4LCAweDAzMUUsIDB4RDMwOCwgMHgwMjFFLCAweEQyMDgsIDB4ODMxRSwgMHhEMzA4LCAweDAwMDJ9LAorCXsweDgyMUUsIDB4RDIwOCwgMHgwMzFFLCAweEQzMDgsIDB4MDIxRCwgMHhEMjE5LCAweDgzMUQsIDB4RDMxOSwgMHgwMDAyfSwKKwl7MHg4MjFFLCAweEQyMDgsIDB4MDMxRSwgMHhEMzA4LCAweDAyMUMsIDB4RDIyQSwgMHg4MzFDLCAweEQzMkEsIDB4MDAwMn0sCisJezB4ODIxRSwgMHhEMjA4LCAweDAzMUUsIDB4RDMwOCwgMHgwMjFBLCAweEQyNEMsIDB4ODMxQSwgMHhEMzRDLCAweDAwMDJ9LAorCXsweDgyMUUsIDB4RDIwOCwgMHgwMzFFLCAweEQzMDgsIDB4MDIxOSwgMHhEMjZFLCAweDgzMTksIDB4RDM2RSwgMHgwMDAyfSwgLyogKzggKEhXIGRlZmF1bHQpICovCisJezB4ODIxRCwgMHhEMjE5LCAweDAzMUQsIDB4RDMxOSwgMHgwMjE5LCAweEQyNkUsIDB4ODMxOSwgMHhEMzZFLCAweDAwMDJ9LAorCXsweDgyMUMsIDB4RDIyQSwgMHgwMzFDLCAweEQzMkEsIDB4MDIxOSwgMHhEMjZFLCAweDgzMTksIDB4RDM2RSwgMHgwMDAyfSwgLyogKzEyIGRCICovCit9OworCisKKy8qCisgKiBzZXQgRW11ODAwMCBkaWdpdGFsIGVxdWFsaXplcjsgZnJvbSAwIHRvIDExIFstMTJkQiAtIDEyZEJdCisgKi8KK3N0YXRpYyB2b2lkCithd2VfZXF1YWxpemVyKGludCBiYXNzLCBpbnQgdHJlYmxlKQoreworCXVuc2lnbmVkIHNob3J0IHc7CisKKwlpZiAoYmFzcyA8IDAgfHwgYmFzcyA+IDExIHx8IHRyZWJsZSA8IDAgfHwgdHJlYmxlID4gMTEpCisJCXJldHVybjsKKwlhd2VfcG9rZShBV0VfSU5JVDQoMHgwMSksIGJhc3NfcGFybVtiYXNzXVswXSk7CisJYXdlX3Bva2UoQVdFX0lOSVQ0KDB4MTEpLCBiYXNzX3Bhcm1bYmFzc11bMV0pOworCWF3ZV9wb2tlKEFXRV9JTklUMygweDExKSwgdHJlYmxlX3Bhcm1bdHJlYmxlXVswXSk7CisJYXdlX3Bva2UoQVdFX0lOSVQzKDB4MTMpLCB0cmVibGVfcGFybVt0cmVibGVdWzFdKTsKKwlhd2VfcG9rZShBV0VfSU5JVDMoMHgxQiksIHRyZWJsZV9wYXJtW3RyZWJsZV1bMl0pOworCWF3ZV9wb2tlKEFXRV9JTklUNCgweDA3KSwgdHJlYmxlX3Bhcm1bdHJlYmxlXVszXSk7CisJYXdlX3Bva2UoQVdFX0lOSVQ0KDB4MEIpLCB0cmVibGVfcGFybVt0cmVibGVdWzRdKTsKKwlhd2VfcG9rZShBV0VfSU5JVDQoMHgwRCksIHRyZWJsZV9wYXJtW3RyZWJsZV1bNV0pOworCWF3ZV9wb2tlKEFXRV9JTklUNCgweDE3KSwgdHJlYmxlX3Bhcm1bdHJlYmxlXVs2XSk7CisJYXdlX3Bva2UoQVdFX0lOSVQ0KDB4MTkpLCB0cmVibGVfcGFybVt0cmVibGVdWzddKTsKKwl3ID0gYmFzc19wYXJtW2Jhc3NdWzJdICsgdHJlYmxlX3Bhcm1bdHJlYmxlXVs4XTsKKwlhd2VfcG9rZShBV0VfSU5JVDQoMHgxNSksICh1bnNpZ25lZCBzaG9ydCkodyArIDB4MDI2MikpOworCWF3ZV9wb2tlKEFXRV9JTklUNCgweDFEKSwgKHVuc2lnbmVkIHNob3J0KSh3ICsgMHg4MzYyKSk7Cit9CisKK3N0YXRpYyB2b2lkIGF3ZV91cGRhdGVfZXF1YWxpemVyKHZvaWQpCit7CisJYXdlX2VxdWFsaXplcihjdHJsc1tBV0VfTURfQkFTU19MRVZFTF0sIGN0cmxzW0FXRV9NRF9UUkVCTEVfTEVWRUxdKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgQ09ORklHX0FXRTMyX01JRElFTVUKKworLyoKKyAqIEVtdTgwMDAgTUlESSBFbXVsYXRpb24KKyAqLworCisvKgorICogbWlkaSBxdWV1ZSByZWNvcmQKKyAqLworCisvKiBxdWV1ZSB0eXBlICovCitlbnVtIHsgUV9OT05FLCBRX1ZBUkxFTiwgUV9SRUFELCBRX1NZU0VYLCB9OworCisjZGVmaW5lIE1BWF9NSURJQlVGCTY0CisKKy8qIG1pZGkgc3RhdHVzICovCit0eXBlZGVmIHN0cnVjdCBNaWRpU3RhdHVzIHsKKwlpbnQgcXVldWU7CS8qIHF1ZXVlIHR5cGUgKi8KKwlpbnQgcWxlbjsJLyogcXVldWUgbGVuZ3RoICovCisJaW50IHJlYWQ7CS8qIGNoYXJzIHJlYWQgKi8KKwlpbnQgc3RhdHVzOwkvKiBjdXJyZW50IHN0YXR1cyAqLworCWludCBjaGFuOwkvKiBjdXJyZW50IGNoYW5uZWwgKi8KKwl1bnNpZ25lZCBjaGFyIGJ1ZltNQVhfTUlESUJVRl07Cit9IE1pZGlTdGF0dXM7CisKKy8qIE1JREkgbW9kZSB0eXBlICovCitlbnVtIHsgTU9ERV9HTSwgTU9ERV9HUywgTU9ERV9YRywgfTsKKworLyogTlJQTiAvIENDIC0+IEVtdTgwMDAgcGFyYW1ldGVyIGNvbnZlcnRlciAqLwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBjb250cm9sOworCWludCBhd2VfZWZmZWN0OworCXVuc2lnbmVkIHNob3J0ICgqY29udmVydCkoaW50IHZhbCk7Cit9IENvbnZUYWJsZTsKKworCisvKgorICogcHJvdG90eXBlcworICovCisKK3N0YXRpYyBpbnQgYXdlX21pZGlfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSwgdm9pZCAoKmlucHV0KShpbnQsdW5zaWduZWQgY2hhciksIHZvaWQgKCpvdXRwdXQpKGludCkpOworc3RhdGljIHZvaWQgYXdlX21pZGlfY2xvc2UoaW50IGRldik7CitzdGF0aWMgaW50IGF3ZV9taWRpX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpOworc3RhdGljIGludCBhd2VfbWlkaV9vdXRwdXRjKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKTsKKworc3RhdGljIHZvaWQgaW5pdF9taWRpX3N0YXR1cyhNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgdm9pZCBjbGVhcl9ycG4odm9pZCk7CitzdGF0aWMgdm9pZCBnZXRfbWlkaV9jaGFyKE1pZGlTdGF0dXMgKnN0LCBpbnQgYyk7CisvKnN0YXRpYyB2b2lkIHF1ZXVlX3ZhcmxlbihNaWRpU3RhdHVzICpzdCwgaW50IGMpOyovCitzdGF0aWMgdm9pZCBzcGVjaWFsX2V2ZW50KE1pZGlTdGF0dXMgKnN0LCBpbnQgYyk7CitzdGF0aWMgdm9pZCBxdWV1ZV9yZWFkKE1pZGlTdGF0dXMgKnN0LCBpbnQgYyk7CitzdGF0aWMgdm9pZCBtaWRpX25vdGVfb24oTWlkaVN0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgbWlkaV9ub3RlX29mZihNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgdm9pZCBtaWRpX2tleV9wcmVzc3VyZShNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgdm9pZCBtaWRpX2NoYW5uZWxfcHJlc3N1cmUoTWlkaVN0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgbWlkaV9waXRjaF93aGVlbChNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgdm9pZCBtaWRpX3Byb2dyYW1fY2hhbmdlKE1pZGlTdGF0dXMgKnN0KTsKK3N0YXRpYyB2b2lkIG1pZGlfY29udHJvbF9jaGFuZ2UoTWlkaVN0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgbWlkaV9zZWxlY3RfYmFuayhNaWRpU3RhdHVzICpzdCwgaW50IHZhbCk7CitzdGF0aWMgdm9pZCBtaWRpX25ycG5fZXZlbnQoTWlkaVN0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgbWlkaV9ycG5fZXZlbnQoTWlkaVN0YXR1cyAqc3QpOworc3RhdGljIHZvaWQgbWlkaV9kZXR1bmUoaW50IGNoYW4sIGludCBjb2Fyc2UsIGludCBmaW5lKTsKK3N0YXRpYyB2b2lkIG1pZGlfc3lzdGVtX2V4Y2x1c2l2ZShNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgaW50IHNlbmRfY29udmVydGVkX2VmZmVjdChDb252VGFibGUgKnRhYmxlLCBpbnQgbnVtX3RhYmxlcywgTWlkaVN0YXR1cyAqc3QsIGludCB0eXBlLCBpbnQgdmFsKTsKK3N0YXRpYyBpbnQgYWRkX2NvbnZlcnRlZF9lZmZlY3QoQ29udlRhYmxlICp0YWJsZSwgaW50IG51bV90YWJsZXMsIE1pZGlTdGF0dXMgKnN0LCBpbnQgdHlwZSwgaW50IHZhbCk7CitzdGF0aWMgaW50IHhnX2NvbnRyb2xfY2hhbmdlKE1pZGlTdGF0dXMgKnN0LCBpbnQgY21kLCBpbnQgdmFsKTsKKworI2RlZmluZSBudW1iZXJvZihhcnkpCShzaXplb2YoYXJ5KS9zaXplb2YoYXJ5WzBdKSkKKworCisvKgorICogT1NTIE1pZGkgZGV2aWNlIHJlY29yZAorICovCisKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIGF3ZV9taWRpX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7IkFXRSBNaWRpIEVtdSIsIDAsIDAsIFNORENBUkRfU0J9LAorCS5pbl9pbmZvCT0gezB9LAorCS5vcGVuCQk9IGF3ZV9taWRpX29wZW4sIC8qb3BlbiovCisJLmNsb3NlCQk9IGF3ZV9taWRpX2Nsb3NlLCAvKmNsb3NlKi8KKwkuaW9jdGwJCT0gYXdlX21pZGlfaW9jdGwsIC8qaW9jdGwqLworCS5vdXRwdXRjCT0gYXdlX21pZGlfb3V0cHV0YywgLypvdXRwdXRjKi8KK307CisKK3N0YXRpYyBpbnQgbXlfbWlkaWRldiA9IC0xOworCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX21pZGllbXUodm9pZCkKK3sKKwlpZiAoKG15X21pZGlkZXYgPSBzb3VuZF9hbGxvY19taWRpZGV2KCkpIDwgMCkKKwkJcHJpbnRrICgiU291bmQ6IFRvbyBtYW55IG1pZGkgZGV2aWNlcyBkZXRlY3RlZFxuIik7CisJZWxzZQorCQltaWRpX2RldnNbbXlfbWlkaWRldl0gPSAmYXdlX21pZGlfb3BlcmF0aW9uczsKK30KKworc3RhdGljIHZvaWQgdW5sb2FkX21pZGllbXUodm9pZCkKK3sKKwlpZiAobXlfbWlkaWRldiA+PSAwKQorCQlzb3VuZF91bmxvYWRfbWlkaWRldihteV9taWRpZGV2KTsKK30KKworCisvKgorICogb3Blbi9jbG9zZSBtaWRpIGRldmljZQorICovCisKK3N0YXRpYyBpbnQgbWlkaV9vcGVuZWQgPSBGQUxTRTsKKworc3RhdGljIGludCBtaWRpX21vZGU7CitzdGF0aWMgaW50IGNvYXJzZXR1bmUsIGZpbmV0dW5lOworCitzdGF0aWMgaW50IHhnX21hcHBpbmcgPSBUUlVFOworc3RhdGljIGludCB4Z19iYW5rbW9kZTsKKworLyogZWZmZWN0IHNlbnNpdGl2aXR5ICovCisKKyNkZWZpbmUgRlhfQ1VUT0ZGCTAKKyNkZWZpbmUgRlhfUkVTT05BTkNFCTEKKyNkZWZpbmUgRlhfQVRUQUNLCTIKKyNkZWZpbmUgRlhfUkVMRUFTRQkzCisjZGVmaW5lIEZYX1ZJQlJBVEUJNAorI2RlZmluZSBGWF9WSUJERVBUSAk1CisjZGVmaW5lIEZYX1ZJQkRFTEFZCTYKKyNkZWZpbmUgRlhfTlVNUwkJNworCisjZGVmaW5lIERFRl9GWF9DVVRPRkYJCTE3MAorI2RlZmluZSBERUZfRlhfUkVTT05BTkNFCTYKKyNkZWZpbmUgREVGX0ZYX0FUVEFDSwkJNTAKKyNkZWZpbmUgREVGX0ZYX1JFTEVBU0UJCTUwCisjZGVmaW5lIERFRl9GWF9WSUJSQVRFCQkzMAorI2RlZmluZSBERUZfRlhfVklCREVQVEgJCTQKKyNkZWZpbmUgREVGX0ZYX1ZJQkRFTEFZCQkxNTAwCisKKy8qIGVmZmVjdCBzZW5zZTogKi8KK3N0YXRpYyBpbnQgZ3Nfc2Vuc2VbXSA9IAoreworCURFRl9GWF9DVVRPRkYsIERFRl9GWF9SRVNPTkFOQ0UsIERFRl9GWF9BVFRBQ0ssIERFRl9GWF9SRUxFQVNFLAorCURFRl9GWF9WSUJSQVRFLCBERUZfRlhfVklCREVQVEgsIERFRl9GWF9WSUJERUxBWQorfTsKK3N0YXRpYyBpbnQgeGdfc2Vuc2VbXSA9IAoreworCURFRl9GWF9DVVRPRkYsIERFRl9GWF9SRVNPTkFOQ0UsIERFRl9GWF9BVFRBQ0ssIERFRl9GWF9SRUxFQVNFLAorCURFRl9GWF9WSUJSQVRFLCBERUZfRlhfVklCREVQVEgsIERFRl9GWF9WSUJERUxBWQorfTsKKworCisvKiBjdXJyZW50IHN0YXR1cyAqLworc3RhdGljIE1pZGlTdGF0dXMgY3Vyc3Q7CisKKworc3RhdGljIGludAorYXdlX21pZGlfb3BlbiAoaW50IGRldiwgaW50IG1vZGUsCisJICAgICAgIHZvaWQgKCppbnB1dCkoaW50LHVuc2lnbmVkIGNoYXIpLAorCSAgICAgICB2b2lkICgqb3V0cHV0KShpbnQpKQoreworCWlmIChtaWRpX29wZW5lZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCW1pZGlfb3BlbmVkID0gVFJVRTsKKworCW1pZGlfbW9kZSA9IE1PREVfR007CisKKwljdXJzdC5xdWV1ZSA9IFFfTk9ORTsKKwljdXJzdC5xbGVuID0gMDsKKwljdXJzdC5yZWFkID0gMDsKKwljdXJzdC5zdGF0dXMgPSAwOworCWN1cnN0LmNoYW4gPSAwOworCW1lbXNldChjdXJzdC5idWYsIDAsIHNpemVvZihjdXJzdC5idWYpKTsKKworCWluaXRfbWlkaV9zdGF0dXMoJmN1cnN0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYXdlX21pZGlfY2xvc2UgKGludCBkZXYpCit7CisJbWlkaV9vcGVuZWQgPSBGQUxTRTsKK30KKworCitzdGF0aWMgaW50Cithd2VfbWlkaV9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXJldHVybiAtRVBFUk07Cit9CisKK3N0YXRpYyBpbnQKK2F3ZV9taWRpX291dHB1dGMgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKQoreworCWlmICghIG1pZGlfb3BlbmVkKQorCQlyZXR1cm4gMTsKKworCS8qIGZvcmNlIHRvIGNoYW5nZSBwbGF5aW5nIG1vZGUgKi8KKwlwbGF5aW5nX21vZGUgPSBBV0VfUExBWV9NVUxUSTsKKworCWdldF9taWRpX2NoYXIoJmN1cnN0LCBtaWRpX2J5dGUpOworCXJldHVybiAxOworfQorCisKKy8qCisgKiBpbml0aWFsaXplCisgKi8KKworc3RhdGljIHZvaWQgaW5pdF9taWRpX3N0YXR1cyhNaWRpU3RhdHVzICpzdCkKK3sKKwljbGVhcl9ycG4oKTsKKwljb2Fyc2V0dW5lID0gMDsKKwlmaW5ldHVuZSA9IDA7Cit9CisKKworLyoKKyAqIFJQTiAmIE5SUE4KKyAqLworCisjZGVmaW5lIE1BWF9NSURJX0NIQU5ORUxTCTE2CisKKy8qIFJQTiAmIE5SUE4gKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5ycG5bTUFYX01JRElfQ0hBTk5FTFNdOyAgLyogY3VycmVudCBldmVudCBpcyBOUlBOPyAqLworc3RhdGljIGludCBtc2JfYml0OyAgLyogY3VycmVudCBldmVudCBpcyBtc2IgZm9yIFJQTi9OUlBOICovCisvKiBSUE4gJiBOUlBOIGluZGVjZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJwbl9tc2JbTUFYX01JRElfQ0hBTk5FTFNdLCBycG5fbHNiW01BWF9NSURJX0NIQU5ORUxTXTsKKy8qIFJQTiAmIE5SUE4gdmFsdWVzICovCitzdGF0aWMgaW50IHJwbl92YWxbTUFYX01JRElfQ0hBTk5FTFNdOworCitzdGF0aWMgdm9pZCBjbGVhcl9ycG4odm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX01JRElfQ0hBTk5FTFM7IGkrKykgeworCQlucnBuW2ldID0gMDsKKwkJcnBuX21zYltpXSA9IDEyNzsKKwkJcnBuX2xzYltpXSA9IDEyNzsKKwkJcnBuX3ZhbFtpXSA9IDA7CisJfQorCW1zYl9iaXQgPSAwOworfQorCisKKy8qCisgKiBwcm9jZXNzIG1pZGkgcXVldWUKKyAqLworCisvKiBzdGF0dXMgZXZlbnQgdHlwZXMgKi8KK3R5cGVkZWYgdm9pZCAoKlN0YXR1c0V2ZW50KShNaWRpU3RhdHVzICpzdCk7CitzdGF0aWMgc3RydWN0IFN0YXR1c0V2ZW50TGlzdCB7CisJU3RhdHVzRXZlbnQgcHJvY2VzczsKKwlpbnQgcWxlbjsKK30gc3RhdHVzX2V2ZW50WzhdID0geworCXttaWRpX25vdGVfb2ZmLCAyfSwKKwl7bWlkaV9ub3RlX29uLCAyfSwKKwl7bWlkaV9rZXlfcHJlc3N1cmUsIDJ9LAorCXttaWRpX2NvbnRyb2xfY2hhbmdlLCAyfSwKKwl7bWlkaV9wcm9ncmFtX2NoYW5nZSwgMX0sCisJe21pZGlfY2hhbm5lbF9wcmVzc3VyZSwgMX0sCisJe21pZGlfcGl0Y2hfd2hlZWwsIDJ9LAorCXtOVUxMLCAwfSwKK307CisKKworLyogcmVhZCBhIGNoYXIgZnJvbSBmaWZvIGFuZCBwcm9jZXNzIGl0ICovCitzdGF0aWMgdm9pZCBnZXRfbWlkaV9jaGFyKE1pZGlTdGF0dXMgKnN0LCBpbnQgYykKK3sKKwlpZiAoYyA9PSAweGZlKSB7CisJCS8qIGlnbm9yZSBhY3RpdmUgc2Vuc2UgKi8KKwkJc3QtPnF1ZXVlID0gUV9OT05FOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChzdC0+cXVldWUpIHsKKwkvKiBjYXNlIFFfVkFSTEVOOiBxdWV1ZV92YXJsZW4oc3QsIGMpOyBicmVhazsqLworCWNhc2UgUV9SRUFEOgorCWNhc2UgUV9TWVNFWDoKKwkJcXVldWVfcmVhZChzdCwgYyk7CisJCWJyZWFrOworCWNhc2UgUV9OT05FOgorCQlzdC0+cmVhZCA9IDA7CisJCWlmICgoYyAmIDB4ZjApID09IDB4ZjApIHsKKwkJCXNwZWNpYWxfZXZlbnQoc3QsIGMpOworCQl9IGVsc2UgaWYgKGMgJiAweDgwKSB7IC8qIHN0YXR1cyBjaGFuZ2UgKi8KKwkJCXN0LT5zdGF0dXMgPSAoYyA+PiA0KSAmIDB4MDc7CisJCQlzdC0+Y2hhbiA9IGMgJiAweDBmOworCQkJc3QtPnF1ZXVlID0gUV9SRUFEOworCQkJc3QtPnFsZW4gPSBzdGF0dXNfZXZlbnRbc3QtPnN0YXR1c10ucWxlbjsKKwkJCWlmIChzdC0+cWxlbiA9PSAwKQorCQkJCXN0LT5xdWV1ZSA9IFFfTk9ORTsKKwkJfQorCQlicmVhazsKKwl9Cit9CisKKy8qIDB4ZnggZXZlbnRzICovCitzdGF0aWMgdm9pZCBzcGVjaWFsX2V2ZW50KE1pZGlTdGF0dXMgKnN0LCBpbnQgYykKK3sKKwlzd2l0Y2ggKGMpIHsKKwljYXNlIDB4ZjA6IC8qIHN5c3RlbSBleGNsdXNpdmUgKi8KKwkJc3QtPnF1ZXVlID0gUV9TWVNFWDsKKwkJc3QtPnFsZW4gPSAwOworCQlicmVhazsKKwljYXNlIDB4ZjE6IC8qIE1UQyBxdWFydGVyIGZyYW1lICovCisJY2FzZSAweGYzOiAvKiBzb25nIHNlbGVjdCAqLworCQlzdC0+cXVldWUgPSBRX1JFQUQ7CisJCXN0LT5xbGVuID0gMTsKKwkJYnJlYWs7CisJY2FzZSAweGYyOiAvKiBzb25nIHBvc2l0aW9uICovCisJCXN0LT5xdWV1ZSA9IFFfUkVBRDsKKwkJc3QtPnFsZW4gPSAyOworCQlicmVhazsKKwl9Cit9CisKKyNpZiAwCisvKiByZWFkIHZhcmlhYmxlIGxlbmd0aCB2YWx1ZSAqLworc3RhdGljIHZvaWQgcXVldWVfdmFybGVuKE1pZGlTdGF0dXMgKnN0LCBpbnQgYykKK3sKKwlzdC0+cWxlbiArPSAoYyAmIDB4N2YpOworCWlmIChjICYgMHg4MCkgeworCQlzdC0+cWxlbiA8PD0gNzsKKwkJcmV0dXJuOworCX0KKwlpZiAoc3QtPnFsZW4gPD0gMCkgeworCQlzdC0+cWxlbiA9IDA7CisJCXN0LT5xdWV1ZSA9IFFfTk9ORTsKKwl9CisJc3QtPnF1ZXVlID0gUV9SRUFEOworCXN0LT5yZWFkID0gMDsKK30KKyNlbmRpZgorCisKKy8qIHJlYWQgYSBjaGFyICovCitzdGF0aWMgdm9pZCBxdWV1ZV9yZWFkKE1pZGlTdGF0dXMgKnN0LCBpbnQgYykKK3sKKwlpZiAoc3QtPnJlYWQgPCBNQVhfTUlESUJVRikgeworCQlpZiAoc3QtPnF1ZXVlICE9IFFfU1lTRVgpCisJCQljICY9IDB4N2Y7CisJCXN0LT5idWZbc3QtPnJlYWRdID0gKHVuc2lnbmVkIGNoYXIpYzsKKwl9CisJc3QtPnJlYWQrKzsKKwlpZiAoc3QtPnF1ZXVlID09IFFfU1lTRVggJiYgYyA9PSAweGY3KSB7CisJCW1pZGlfc3lzdGVtX2V4Y2x1c2l2ZShzdCk7CisJCXN0LT5xdWV1ZSA9IFFfTk9ORTsKKwl9IGVsc2UgaWYgKHN0LT5xdWV1ZSA9PSBRX1JFQUQgJiYgc3QtPnJlYWQgPj0gc3QtPnFsZW4pIHsKKwkJaWYgKHN0YXR1c19ldmVudFtzdC0+c3RhdHVzXS5wcm9jZXNzKQorCQkJc3RhdHVzX2V2ZW50W3N0LT5zdGF0dXNdLnByb2Nlc3Moc3QpOworCQlzdC0+cXVldWUgPSBRX05PTkU7CisJfQorfQorCisKKy8qCisgKiBzdGF0dXMgZXZlbnRzCisgKi8KKworLyogbm90ZSBvbiAqLworc3RhdGljIHZvaWQgbWlkaV9ub3RlX29uKE1pZGlTdGF0dXMgKnN0KQoreworCURFQlVHKDIscHJpbnRrKCJtaWRpOiBub3RlX29uICglZCkgJWQgJWRcbiIsIHN0LT5jaGFuLCBzdC0+YnVmWzBdLCBzdC0+YnVmWzFdKSk7CisJaWYgKHN0LT5idWZbMV0gPT0gMCkKKwkJbWlkaV9ub3RlX29mZihzdCk7CisJZWxzZQorCQlhd2Vfc3RhcnRfbm90ZSgwLCBzdC0+Y2hhbiwgc3QtPmJ1ZlswXSwgc3QtPmJ1ZlsxXSk7Cit9CisKKy8qIG5vdGUgb2ZmICovCitzdGF0aWMgdm9pZCBtaWRpX25vdGVfb2ZmKE1pZGlTdGF0dXMgKnN0KQoreworCURFQlVHKDIscHJpbnRrKCJtaWRpOiBub3RlX29mZiAoJWQpICVkICVkXG4iLCBzdC0+Y2hhbiwgc3QtPmJ1ZlswXSwgc3QtPmJ1ZlsxXSkpOworCWF3ZV9raWxsX25vdGUoMCwgc3QtPmNoYW4sIHN0LT5idWZbMF0sIHN0LT5idWZbMV0pOworfQorCisvKiBrZXkgcHJlc3N1cmUgY2hhbmdlICovCitzdGF0aWMgdm9pZCBtaWRpX2tleV9wcmVzc3VyZShNaWRpU3RhdHVzICpzdCkKK3sKKwlhd2Vfa2V5X3ByZXNzdXJlKDAsIHN0LT5jaGFuLCBzdC0+YnVmWzBdLCBzdC0+YnVmWzFdKTsKK30KKworLyogY2hhbm5lbCBwcmVzc3VyZSBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIG1pZGlfY2hhbm5lbF9wcmVzc3VyZShNaWRpU3RhdHVzICpzdCkKK3sKKwljaGFubmVsc1tzdC0+Y2hhbl0uY2hhbl9wcmVzcyA9IHN0LT5idWZbMF07CisJYXdlX21vZHdoZWVsX2NoYW5nZShzdC0+Y2hhbiwgc3QtPmJ1ZlswXSk7Cit9CisKKy8qIHBpdGNoIHdoZWVsIGNoYW5nZSAqLworc3RhdGljIHZvaWQgbWlkaV9waXRjaF93aGVlbChNaWRpU3RhdHVzICpzdCkKK3sKKwlpbnQgdmFsID0gKGludClzdC0+YnVmWzFdICogMTI4ICsgc3QtPmJ1ZlswXTsKKwlhd2VfYmVuZGVyKDAsIHN0LT5jaGFuLCB2YWwpOworfQorCisvKiBwcm9ncmFtIGNoYW5nZSAqLworc3RhdGljIHZvaWQgbWlkaV9wcm9ncmFtX2NoYW5nZShNaWRpU3RhdHVzICpzdCkKK3sKKwlpbnQgcHJlc2V0OworCXByZXNldCA9IHN0LT5idWZbMF07CisJaWYgKG1pZGlfbW9kZSA9PSBNT0RFX0dTICYmIElTX0RSVU1fQ0hBTk5FTChzdC0+Y2hhbikgJiYgcHJlc2V0ID09IDEyNykKKwkJcHJlc2V0ID0gMDsKKwllbHNlIGlmIChtaWRpX21vZGUgPT0gTU9ERV9YRyAmJiB4Z19tYXBwaW5nICYmIElTX0RSVU1fQ0hBTk5FTChzdC0+Y2hhbikpCisJCXByZXNldCArPSA2NDsKKworCWF3ZV9zZXRfaW5zdHIoMCwgc3QtPmNoYW4sIHByZXNldCk7Cit9CisKKyNkZWZpbmUgc2VuZF9lZmZlY3QoY2hhbix0eXBlLHZhbCkgYXdlX3NlbmRfZWZmZWN0KGNoYW4sLTEsdHlwZSx2YWwpCisjZGVmaW5lIGFkZF9lZmZlY3QoY2hhbix0eXBlLHZhbCkgYXdlX3NlbmRfZWZmZWN0KGNoYW4sLTEsKHR5cGUpfDB4ODAsdmFsKQorI2RlZmluZSB1bnNldF9lZmZlY3QoY2hhbix0eXBlKSBhd2Vfc2VuZF9lZmZlY3QoY2hhbiwtMSwodHlwZSl8MHg0MCwwKQorCisvKiBtaWRpIGNvbnRyb2wgY2hhbmdlICovCitzdGF0aWMgdm9pZCBtaWRpX2NvbnRyb2xfY2hhbmdlKE1pZGlTdGF0dXMgKnN0KQoreworCWludCBjbWQgPSBzdC0+YnVmWzBdOworCWludCB2YWwgPSBzdC0+YnVmWzFdOworCisJREVCVUcoMixwcmludGsoIm1pZGk6IGNvbnRyb2wgKCVkKSAlZCAlZFxuIiwgc3QtPmNoYW4sIGNtZCwgdmFsKSk7CisJaWYgKG1pZGlfbW9kZSA9PSBNT0RFX1hHKSB7CisJCWlmICh4Z19jb250cm9sX2NoYW5nZShzdCwgY21kLCB2YWwpKQorCQkJcmV0dXJuOworCX0KKworCS8qIGNvbnRyb2xzICMzMSAtICM2NCBhcmUgTFNCIG9mICMwIC0gIzMxICovCisJbXNiX2JpdCA9IDE7CisJaWYgKGNtZCA+PSAweDIwICYmIGNtZCA8IDB4NDApIHsKKwkJbXNiX2JpdCA9IDA7CisJCWNtZCAtPSAweDIwOworCX0KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBDVExfU09GVF9QRURBTDoKKwkJaWYgKHZhbCA9PSAxMjcpCisJCQlhZGRfZWZmZWN0KHN0LT5jaGFuLCBBV0VfRlhfQ1VUT0ZGLCAtMTYwKTsKKwkJZWxzZQorCQkJdW5zZXRfZWZmZWN0KHN0LT5jaGFuLCBBV0VfRlhfQ1VUT0ZGKTsKKwkJYnJlYWs7CisKKwljYXNlIENUTF9CQU5LX1NFTEVDVDoKKwkJbWlkaV9zZWxlY3RfYmFuayhzdCwgdmFsKTsKKwkJYnJlYWs7CisJCQorCS8qIHNldCBSUE4vTlJQTiBwYXJhbWV0ZXIgKi8KKwljYXNlIENUTF9SRUdJU1RfUEFSTV9OVU1fTVNCOgorCQlucnBuW3N0LT5jaGFuXT0wOyBycG5fbXNiW3N0LT5jaGFuXT12YWw7CisJCWJyZWFrOworCWNhc2UgQ1RMX1JFR0lTVF9QQVJNX05VTV9MU0I6CisJCW5ycG5bc3QtPmNoYW5dPTA7IHJwbl9sc2Jbc3QtPmNoYW5dPXZhbDsKKwkJYnJlYWs7CisJY2FzZSBDVExfTk9OUkVHX1BBUk1fTlVNX01TQjoKKwkJbnJwbltzdC0+Y2hhbl09MTsgcnBuX21zYltzdC0+Y2hhbl09dmFsOworCQlicmVhazsKKwljYXNlIENUTF9OT05SRUdfUEFSTV9OVU1fTFNCOgorCQlucnBuW3N0LT5jaGFuXT0xOyBycG5fbHNiW3N0LT5jaGFuXT12YWw7CisJCWJyZWFrOworCisJLyogc2VuZCBSUE4vTlJQTiBlbnRyeSAqLworCWNhc2UgQ1RMX0RBVEFfRU5UUlk6CisJCWlmIChtc2JfYml0KQorCQkJcnBuX3ZhbFtzdC0+Y2hhbl0gPSB2YWwgKiAxMjg7CisJCWVsc2UKKwkJCXJwbl92YWxbc3QtPmNoYW5dIHw9IHZhbDsKKwkJaWYgKG5ycG5bc3QtPmNoYW5dKQorCQkJbWlkaV9ucnBuX2V2ZW50KHN0KTsKKwkJZWxzZQorCQkJbWlkaV9ycG5fZXZlbnQoc3QpOworCQlicmVhazsKKworCS8qIGluY3JlYXNlL2RlY3JlYXNlIGRhdGEgZW50cnkgKi8KKwljYXNlIENUTF9EQVRBX0lOQ1JFTUVOVDoKKwkJcnBuX3ZhbFtzdC0+Y2hhbl0rKzsKKwkJbWlkaV9ycG5fZXZlbnQoc3QpOworCQlicmVhazsKKwljYXNlIENUTF9EQVRBX0RFQ1JFTUVOVDoKKwkJcnBuX3ZhbFtzdC0+Y2hhbl0tLTsKKwkJbWlkaV9ycG5fZXZlbnQoc3QpOworCQlicmVhazsKKworCS8qIGRlZmF1bHQgKi8KKwlkZWZhdWx0OgorCQlhd2VfY29udHJvbGxlcigwLCBzdC0+Y2hhbiwgY21kLCB2YWwpOworCQlicmVhazsKKwl9Cit9CisKKy8qIHRvbmUgYmFuayBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIG1pZGlfc2VsZWN0X2JhbmsoTWlkaVN0YXR1cyAqc3QsIGludCB2YWwpCit7CisJaWYgKG1pZGlfbW9kZSA9PSBNT0RFX1hHICYmIG1zYl9iaXQpIHsKKwkJeGdfYmFua21vZGUgPSB2YWw7CisJCS8qIFhHIE1TQiB2YWx1ZTsgbm90IG5vcm1hbCBiYW5rIHNlbGVjdGlvbiAqLworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIDEyNzogLyogcmVtYXAgdG8gZHJ1bSBjaGFubmVsICovCisJCQlhd2VfY29udHJvbGxlcigwLCBzdC0+Y2hhbiwgQ1RMX0JBTktfU0VMRUNULCAxMjgpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIHJlbWFwIHRvIG5vcm1hbCBjaGFubmVsICovCisJCQlhd2VfY29udHJvbGxlcigwLCBzdC0+Y2hhbiwgQ1RMX0JBTktfU0VMRUNULCB2YWwpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dXJuOworCX0gZWxzZSBpZiAobWlkaV9tb2RlID09IE1PREVfR1MgJiYgIW1zYl9iaXQpCisJCS8qIGlnbm9yZSBMU0IgYmFuayBpbiBHUyBtb2RlICh1c2VkIGZvciBtYXBwaW5nKSAqLworCQlyZXR1cm47CisKKwkvKiBub3JtYWwgYmFuayBjb250cm9sczsgYWNjZXB0IGJvdGggTVNCIGFuZCBMU0IgKi8KKwlpZiAoISBJU19EUlVNX0NIQU5ORUwoc3QtPmNoYW4pKSB7CisJCWlmIChtaWRpX21vZGUgPT0gTU9ERV9YRykgeworCQkJaWYgKHhnX2Jhbmttb2RlKSByZXR1cm47CisJCQlpZiAodmFsID09IDY0IHx8IHZhbCA9PSAxMjYpCisJCQkJdmFsID0gMDsKKwkJfSBlbHNlIGlmIChtaWRpX21vZGUgPT0gTU9ERV9HUyAmJiB2YWwgPT0gMTI3KQorCQkJdmFsID0gMDsKKwkJYXdlX2NvbnRyb2xsZXIoMCwgc3QtPmNoYW4sIENUTF9CQU5LX1NFTEVDVCwgdmFsKTsKKwl9Cit9CisKKworLyoKKyAqIFJQTiBldmVudHMKKyAqLworCitzdGF0aWMgdm9pZCBtaWRpX3Jwbl9ldmVudChNaWRpU3RhdHVzICpzdCkKK3sKKwlpbnQgdHlwZTsKKwl0eXBlID0gKHJwbl9tc2Jbc3QtPmNoYW5dPDw4KSB8IHJwbl9sc2Jbc3QtPmNoYW5dOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMHgwMDAwOiAvKiBQaXRjaCBiZW5kIHNlbnNpdGl2aXR5ICovCisJCS8qIE1TQiBvbmx5IC8gMSBzZW1pdG9uZSBwZXIgMTI4ICovCisJCWlmIChtc2JfYml0KSB7CisJCQljaGFubmVsc1tzdC0+Y2hhbl0uYmVuZGVyX3JhbmdlID0gCisJCQkJcnBuX3ZhbFtzdC0+Y2hhbl0gKiAxMDAgLyAxMjg7CisJCX0KKwkJYnJlYWs7CisJCQkJCQorCWNhc2UgMHgwMDAxOiAvKiBmaW5lIHR1bmluZzogKi8KKwkJLyogTVNCL0xTQiwgODE5Mj1jZW50ZXIsIDEwMC84MTkyIGNlbnQgc3RlcCAqLworCQlmaW5ldHVuZSA9IHJwbl92YWxbc3QtPmNoYW5dIC0gODE5MjsKKwkJbWlkaV9kZXR1bmUoc3QtPmNoYW4sIGNvYXJzZXR1bmUsIGZpbmV0dW5lKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDAwMjogLyogY29hcnNlIHR1bmluZyAqLworCQkvKiBNU0Igb25seSAvIDgxOTI9Y2VudGVyLCAxIHNlbWl0b25lIHBlciAxMjggKi8KKwkJaWYgKG1zYl9iaXQpIHsKKwkJCWNvYXJzZXR1bmUgPSBycG5fdmFsW3N0LT5jaGFuXSAtIDgxOTI7CisJCQltaWRpX2RldHVuZShzdC0+Y2hhbiwgY29hcnNldHVuZSwgZmluZXR1bmUpOworCQl9CisJCWJyZWFrOworCisJY2FzZSAweDdGN0Y6IC8qICJsb2NrLWluIiBSUE4gKi8KKwkJYnJlYWs7CisJfQorfQorCisKKy8qIHR1bmluZzoKKyAqICAgY29hcnNlID0gLTgxOTIgdG8gODE5MiAoMTAwIGNlbnQgcGVyIDEyOCkKKyAqICAgZmluZSA9IC04MTkyIHRvIDgxOTIgKG1heD0xMDBjZW50KQorICovCitzdGF0aWMgdm9pZCBtaWRpX2RldHVuZShpbnQgY2hhbiwgaW50IGNvYXJzZSwgaW50IGZpbmUpCit7CisJLyogNDA5NiA9IDEyMDAgY2VudHMgaW4gQVdFIHBhcmFtZXRlciAqLworCWludCB2YWw7CisJdmFsID0gY29hcnNlICogNDA5NiAvICgxMiAqIDEyOCk7CisJdmFsICs9IGZpbmUgLyAyNDsKKwlpZiAodmFsKQorCQlzZW5kX2VmZmVjdChjaGFuLCBBV0VfRlhfSU5JVF9QSVRDSCwgdmFsKTsKKwllbHNlCisJCXVuc2V0X2VmZmVjdChjaGFuLCBBV0VfRlhfSU5JVF9QSVRDSCk7Cit9CisKKworLyoKKyAqIHN5c3RlbSBleGNsdXNpdmUgbWVzc2FnZQorICogR00vR1MvWEcgbWFjcm9zIGFyZSBhY2NlcHRlZAorICovCisKK3N0YXRpYyB2b2lkIG1pZGlfc3lzdGVtX2V4Y2x1c2l2ZShNaWRpU3RhdHVzICpzdCkKK3sKKwkvKiBHTSBvbiAqLworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGdtX29uX21hY3JvW10gPSB7CisJCTB4N2UsMHg3ZiwweDA5LDB4MDEsCisJfTsKKwkvKiBYRyBvbiAqLworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHhnX29uX21hY3JvW10gPSB7CisJCTB4NDMsMHgxMCwweDRjLDB4MDAsMHgwMCwweDdlLDB4MDAsCisJfTsKKwkvKiBHUyBwcmVmaXgKKwkgKiBkcnVtIGNoYW5uZWw6IFhYPTB4MT8oY2hhbm5lbCksIFlZPTB4MTUsIFpaPW9uL29mZgorCSAqIHJldmVyYiBtb2RlOiBYWD0weDAxLCBZWT0weDMwLCBaWj0wLTcKKwkgKiBjaG9ydXMgbW9kZTogWFg9MHgwMSwgWVk9MHgzOCwgWlo9MC03CisJICovCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3NfcGZ4X21hY3JvW10gPSB7CisJCTB4NDEsMHgxMCwweDQyLDB4MTIsMHg0MCwvKlhYLFlZLFpaKi8KKwl9OworCisjaWYgMAorCS8qIFNDODggc3lzdGVtIG1vZGUgc2V0CisJICogc2luZ2xlIG1vZHVsZSBtb2RlOiBYWD0xCisJICogZG91YmxlIG1vZHVsZSBtb2RlOiBYWD0wCisJICovCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3NfbW9kZV9tYWNyb1tdID0geworCQkweDQxLDB4MTAsMHg0MiwweDEyLDB4MDAsMHgwMCwweDdGLC8qWloqLworCX07CisJLyogU0M4OCBkaXNwbGF5IG1hY3JvOiBYWD0wMTpiaXRtYXAsIDAwOnRleHQKKwkgKi8KKwlzdGF0aWMgdW5zaWduZWQgY2hhciBnc19kaXNwX21hY3JvW10gPSB7CisJCTB4NDEsMHgxMCwweDQ1LDB4MTIsMHgxMCwvKlhYLDAwKi8KKwl9OworI2VuZGlmCisKKwkvKiBHTSBvbiAqLworCWlmIChtZW1jbXAoc3QtPmJ1ZiwgZ21fb25fbWFjcm8sIHNpemVvZihnbV9vbl9tYWNybykpID09IDApIHsKKwkJaWYgKG1pZGlfbW9kZSAhPSBNT0RFX0dTICYmIG1pZGlfbW9kZSAhPSBNT0RFX1hHKQorCQkJbWlkaV9tb2RlID0gTU9ERV9HTTsKKwkJaW5pdF9taWRpX3N0YXR1cyhzdCk7CisJfQorCisJLyogR1MgbWFjcm9zICovCisJZWxzZSBpZiAobWVtY21wKHN0LT5idWYsIGdzX3BmeF9tYWNybywgc2l6ZW9mKGdzX3BmeF9tYWNybykpID09IDApIHsKKwkJaWYgKG1pZGlfbW9kZSAhPSBNT0RFX0dTICYmIG1pZGlfbW9kZSAhPSBNT0RFX1hHKQorCQkJbWlkaV9tb2RlID0gTU9ERV9HUzsKKworCQlpZiAoc3QtPmJ1Zls1XSA9PSAweDAwICYmIHN0LT5idWZbNl0gPT0gMHg3ZiAmJiBzdC0+YnVmWzddID09IDB4MDApIHsKKwkJCS8qIEdTIHJlc2V0ICovCisJCQlpbml0X21pZGlfc3RhdHVzKHN0KTsKKwkJfQorCisJCWVsc2UgaWYgKChzdC0+YnVmWzVdICYgMHhmMCkgPT0gMHgxMCAmJiBzdC0+YnVmWzZdID09IDB4MTUpIHsKKwkJCS8qIGRydW0gcGF0dGVybiAqLworCQkJaW50IHAgPSBzdC0+YnVmWzVdICYgMHgwZjsKKwkJCWlmIChwID09IDApIHAgPSA5OworCQkJZWxzZSBpZiAocCA8IDEwKSBwLS07CisJCQlpZiAoc3QtPmJ1Zls3XSA9PSAwKQorCQkJCURSVU1fQ0hBTk5FTF9PRkYocCk7CisJCQllbHNlCisJCQkJRFJVTV9DSEFOTkVMX09OKHApOworCisJCX0gZWxzZSBpZiAoKHN0LT5idWZbNV0gJiAweGYwKSA9PSAweDEwICYmIHN0LT5idWZbNl0gPT0gMHgyMSkgeworCQkJLyogcHJvZ3JhbSAqLworCQkJaW50IHAgPSBzdC0+YnVmWzVdICYgMHgwZjsKKwkJCWlmIChwID09IDApIHAgPSA5OworCQkJZWxzZSBpZiAocCA8IDEwKSBwLS07CisJCQlpZiAoISBJU19EUlVNX0NIQU5ORUwocCkpCisJCQkJYXdlX3NldF9pbnN0cigwLCBwLCBzdC0+YnVmWzddKTsKKworCQl9IGVsc2UgaWYgKHN0LT5idWZbNV0gPT0gMHgwMSAmJiBzdC0+YnVmWzZdID09IDB4MzApIHsKKwkJCS8qIHJldmVyYiBtb2RlICovCisJCQlhd2Vfc2V0X3JldmVyYl9tb2RlKHN0LT5idWZbN10pOworCisJCX0gZWxzZSBpZiAoc3QtPmJ1Zls1XSA9PSAweDAxICYmIHN0LT5idWZbNl0gPT0gMHgzOCkgeworCQkJLyogY2hvcnVzIG1vZGUgKi8KKwkJCWF3ZV9zZXRfY2hvcnVzX21vZGUoc3QtPmJ1Zls3XSk7CisKKwkJfSBlbHNlIGlmIChzdC0+YnVmWzVdID09IDB4MDAgJiYgc3QtPmJ1Zls2XSA9PSAweDA0KSB7CisJCQkvKiBtYXN0ZXIgdm9sdW1lICovCisJCQlhd2VfY2hhbmdlX21hc3Rlcl92b2x1bWUoc3QtPmJ1Zls3XSk7CisKKwkJfQorCX0KKworCS8qIFhHIG9uICovCisJZWxzZSBpZiAobWVtY21wKHN0LT5idWYsIHhnX29uX21hY3JvLCBzaXplb2YoeGdfb25fbWFjcm8pKSA9PSAwKSB7CisJCW1pZGlfbW9kZSA9IE1PREVfWEc7CisJCXhnX21hcHBpbmcgPSBUUlVFOworCQl4Z19iYW5rbW9kZSA9IDA7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBjb252ZXJ0IE5SUE4vY29udHJvbCB2YWx1ZXMKKyAqLworCitzdGF0aWMgaW50IHNlbmRfY29udmVydGVkX2VmZmVjdChDb252VGFibGUgKnRhYmxlLCBpbnQgbnVtX3RhYmxlcywgTWlkaVN0YXR1cyAqc3QsIGludCB0eXBlLCBpbnQgdmFsKQoreworCWludCBpLCBjdmFsOworCWZvciAoaSA9IDA7IGkgPCBudW1fdGFibGVzOyBpKyspIHsKKwkJaWYgKHRhYmxlW2ldLmNvbnRyb2wgPT0gdHlwZSkgeworCQkJY3ZhbCA9IHRhYmxlW2ldLmNvbnZlcnQodmFsKTsKKwkJCXNlbmRfZWZmZWN0KHN0LT5jaGFuLCB0YWJsZVtpXS5hd2VfZWZmZWN0LCBjdmFsKTsKKwkJCXJldHVybiBUUlVFOworCQl9CisJfQorCXJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludCBhZGRfY29udmVydGVkX2VmZmVjdChDb252VGFibGUgKnRhYmxlLCBpbnQgbnVtX3RhYmxlcywgTWlkaVN0YXR1cyAqc3QsIGludCB0eXBlLCBpbnQgdmFsKQoreworCWludCBpLCBjdmFsOworCWZvciAoaSA9IDA7IGkgPCBudW1fdGFibGVzOyBpKyspIHsKKwkJaWYgKHRhYmxlW2ldLmNvbnRyb2wgPT0gdHlwZSkgeworCQkJY3ZhbCA9IHRhYmxlW2ldLmNvbnZlcnQodmFsKTsKKwkJCWFkZF9lZmZlY3Qoc3QtPmNoYW4sIHRhYmxlW2ldLmF3ZV9lZmZlY3R8MHg4MCwgY3ZhbCk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyoKKyAqIEFXRTMyIE5SUE4gZWZmZWN0cworICovCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF9kZWxheShpbnQgdmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF9hdHRhY2soaW50IHZhbCk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZnhfaG9sZChpbnQgdmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF9kZWNheShpbnQgdmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF90aGVfdmFsdWUoaW50IHZhbCk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZnhfdHdpY2VfdmFsdWUoaW50IHZhbCk7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZnhfY29udl9waXRjaChpbnQgdmFsKTsKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF9jb252X1EoaW50IHZhbCk7CisKKy8qIGZ1bmN0aW9uIGZvciBlYWNoIE5SUE4gKi8JCS8qIFtyYW5nZV0gIHVuaXRzICovCisjZGVmaW5lIGZ4X2VudjFfZGVsYXkJZnhfZGVsYXkJLyogWzAsNTkwMF0gNG1zZWMgKi8KKyNkZWZpbmUgZnhfZW52MV9hdHRhY2sJZnhfYXR0YWNrCS8qIFswLDU5NDBdIDFtc2VjICovCisjZGVmaW5lIGZ4X2VudjFfaG9sZAlmeF9ob2xkCQkvKiBbMCw4MTkxXSAxbXNlYyAqLworI2RlZmluZSBmeF9lbnYxX2RlY2F5CWZ4X2RlY2F5CS8qIFswLDU5NDBdIDRtc2VjICovCisjZGVmaW5lIGZ4X2VudjFfcmVsZWFzZQlmeF9kZWNheQkvKiBbMCw1OTQwXSA0bXNlYyAqLworI2RlZmluZSBmeF9lbnYxX3N1c3RhaW4JZnhfdGhlX3ZhbHVlCS8qIFswLDEyN10gMC43NWRCICovCisjZGVmaW5lIGZ4X2VudjFfcGl0Y2gJZnhfdGhlX3ZhbHVlCS8qIFstMTI3LDEyN10gOS4zNzVjZW50cyAqLworI2RlZmluZSBmeF9lbnYxX2N1dG9mZglmeF90aGVfdmFsdWUJLyogWy0xMjcsMTI3XSA1Ni4yNWNlbnRzICovCisKKyNkZWZpbmUgZnhfZW52Ml9kZWxheQlmeF9kZWxheQkvKiBbMCw1OTAwXSA0bXNlYyAqLworI2RlZmluZSBmeF9lbnYyX2F0dGFjawlmeF9hdHRhY2sJLyogWzAsNTk0MF0gMW1zZWMgKi8KKyNkZWZpbmUgZnhfZW52Ml9ob2xkCWZ4X2hvbGQJCS8qIFswLDgxOTFdIDFtc2VjICovCisjZGVmaW5lIGZ4X2VudjJfZGVjYXkJZnhfZGVjYXkJLyogWzAsNTk0MF0gNG1zZWMgKi8KKyNkZWZpbmUgZnhfZW52Ml9yZWxlYXNlCWZ4X2RlY2F5CS8qIFswLDU5NDBdIDRtc2VjICovCisjZGVmaW5lIGZ4X2VudjJfc3VzdGFpbglmeF90aGVfdmFsdWUJLyogWzAsMTI3XSAwLjc1ZEIgKi8KKworI2RlZmluZSBmeF9sZm8xX2RlbGF5CWZ4X2RlbGF5CS8qIFswLDU5MDBdIDRtc2VjICovCisjZGVmaW5lIGZ4X2xmbzFfZnJlcQlmeF90d2ljZV92YWx1ZQkvKiBbMCwxMjddIDg0bUh6ICovCisjZGVmaW5lIGZ4X2xmbzFfdm9sdW1lCWZ4X3R3aWNlX3ZhbHVlCS8qIFswLDEyN10gMC4xODc1ZEIgKi8KKyNkZWZpbmUgZnhfbGZvMV9waXRjaAlmeF90aGVfdmFsdWUJLyogWy0xMjcsMTI3XSA5LjM3NWNlbnRzICovCisjZGVmaW5lIGZ4X2xmbzFfY3V0b2ZmCWZ4X3R3aWNlX3ZhbHVlCS8qIFstNjQsNjNdIDU2LjI1Y2VudHMgKi8KKworI2RlZmluZSBmeF9sZm8yX2RlbGF5CWZ4X2RlbGF5CS8qIFswLDU5MDBdIDRtc2VjICovCisjZGVmaW5lIGZ4X2xmbzJfZnJlcQlmeF90d2ljZV92YWx1ZQkvKiBbMCwxMjddIDg0bUh6ICovCisjZGVmaW5lIGZ4X2xmbzJfcGl0Y2gJZnhfdGhlX3ZhbHVlCS8qIFstMTI3LDEyN10gOS4zNzVjZW50cyAqLworCisjZGVmaW5lIGZ4X2luaXRfcGl0Y2gJZnhfY29udl9waXRjaAkvKiBbLTgxOTIsODE5Ml0gY2VudHMgKi8KKyNkZWZpbmUgZnhfY2hvcnVzCWZ4X3RoZV92YWx1ZQkvKiBbMCwyNTVdIC0tICovCisjZGVmaW5lIGZ4X3JldmVyYglmeF90aGVfdmFsdWUJLyogWzAsMjU1XSAtLSAqLworI2RlZmluZSBmeF9jdXRvZmYJZnhfdHdpY2VfdmFsdWUJLyogWzAsMTI3XSA2Mkh6ICovCisjZGVmaW5lIGZ4X2ZpbHRlclEJZnhfY29udl9RCS8qIFswLDEyN10gLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ4X2RlbGF5KGludCB2YWwpCit7CisJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCljYWxjX3Bhcm1fZGVsYXkodmFsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ4X2F0dGFjayhpbnQgdmFsKQoreworCXJldHVybiAodW5zaWduZWQgc2hvcnQpY2FsY19wYXJtX2F0dGFjayh2YWwpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZnhfaG9sZChpbnQgdmFsKQoreworCXJldHVybiAodW5zaWduZWQgc2hvcnQpY2FsY19wYXJtX2hvbGQodmFsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ4X2RlY2F5KGludCB2YWwpCit7CisJcmV0dXJuICh1bnNpZ25lZCBzaG9ydCljYWxjX3Bhcm1fZGVjYXkodmFsKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ4X3RoZV92YWx1ZShpbnQgdmFsKQoreworCXJldHVybiAodW5zaWduZWQgc2hvcnQpKHZhbCAmIDB4ZmYpOworfQorCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZnhfdHdpY2VfdmFsdWUoaW50IHZhbCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIHNob3J0KSgodmFsICogMikgJiAweGZmKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGZ4X2NvbnZfcGl0Y2goaW50IHZhbCkKK3sKKwlyZXR1cm4gKHNob3J0KSh2YWwgKiA0MDk2IC8gMTIwMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBmeF9jb252X1EoaW50IHZhbCkKK3sKKwlyZXR1cm4gKHVuc2lnbmVkIHNob3J0KSgodmFsIC8gOCkgJiAweGZmKTsKK30KKworCitzdGF0aWMgQ29udlRhYmxlIGF3ZV9lZmZlY3RzW10gPQoreworCXsgMCwgQVdFX0ZYX0xGTzFfREVMQVksCWZ4X2xmbzFfZGVsYXl9LAorCXsgMSwgQVdFX0ZYX0xGTzFfRlJFUSwJZnhfbGZvMV9mcmVxfSwKKwl7IDIsIEFXRV9GWF9MRk8yX0RFTEFZLAlmeF9sZm8yX2RlbGF5fSwKKwl7IDMsIEFXRV9GWF9MRk8yX0ZSRVEsCWZ4X2xmbzJfZnJlcX0sCisKKwl7IDQsIEFXRV9GWF9FTlYxX0RFTEFZLAlmeF9lbnYxX2RlbGF5fSwKKwl7IDUsIEFXRV9GWF9FTlYxX0FUVEFDSyxmeF9lbnYxX2F0dGFja30sCisJeyA2LCBBV0VfRlhfRU5WMV9IT0xELAlmeF9lbnYxX2hvbGR9LAorCXsgNywgQVdFX0ZYX0VOVjFfREVDQVksCWZ4X2VudjFfZGVjYXl9LAorCXsgOCwgQVdFX0ZYX0VOVjFfU1VTVEFJTiwJZnhfZW52MV9zdXN0YWlufSwKKwl7IDksIEFXRV9GWF9FTlYxX1JFTEVBU0UsCWZ4X2VudjFfcmVsZWFzZX0sCisKKwl7MTAsIEFXRV9GWF9FTlYyX0RFTEFZLAlmeF9lbnYyX2RlbGF5fSwKKwl7MTEsIEFXRV9GWF9FTlYyX0FUVEFDSywJZnhfZW52Ml9hdHRhY2t9LAorCXsxMiwgQVdFX0ZYX0VOVjJfSE9MRCwJZnhfZW52Ml9ob2xkfSwKKwl7MTMsIEFXRV9GWF9FTlYyX0RFQ0FZLAlmeF9lbnYyX2RlY2F5fSwKKwl7MTQsIEFXRV9GWF9FTlYyX1NVU1RBSU4sCWZ4X2VudjJfc3VzdGFpbn0sCisJezE1LCBBV0VfRlhfRU5WMl9SRUxFQVNFLAlmeF9lbnYyX3JlbGVhc2V9LAorCisJezE2LCBBV0VfRlhfSU5JVF9QSVRDSCwJZnhfaW5pdF9waXRjaH0sCisJezE3LCBBV0VfRlhfTEZPMV9QSVRDSCwJZnhfbGZvMV9waXRjaH0sCisJezE4LCBBV0VfRlhfTEZPMl9QSVRDSCwJZnhfbGZvMl9waXRjaH0sCisJezE5LCBBV0VfRlhfRU5WMV9QSVRDSCwJZnhfZW52MV9waXRjaH0sCisJezIwLCBBV0VfRlhfTEZPMV9WT0xVTUUsCWZ4X2xmbzFfdm9sdW1lfSwKKwl7MjEsIEFXRV9GWF9DVVRPRkYsCQlmeF9jdXRvZmZ9LAorCXsyMiwgQVdFX0ZYX0ZJTFRFUlEsCWZ4X2ZpbHRlclF9LAorCXsyMywgQVdFX0ZYX0xGTzFfQ1VUT0ZGLAlmeF9sZm8xX2N1dG9mZn0sCisJezI0LCBBV0VfRlhfRU5WMV9DVVRPRkYsCWZ4X2VudjFfY3V0b2ZmfSwKKwl7MjUsIEFXRV9GWF9DSE9SVVMsCQlmeF9jaG9ydXN9LAorCXsyNiwgQVdFX0ZYX1JFVkVSQiwJCWZ4X3JldmVyYn0sCit9OworCitzdGF0aWMgaW50IG51bV9hd2VfZWZmZWN0cyA9IG51bWJlcm9mKGF3ZV9lZmZlY3RzKTsKKworCisvKgorICogR1MoU0M4OCkgTlJQTiBlZmZlY3RzOyBzdGlsbCBleHBlcmltZW50YWwKKyAqLworCisvKiBjdXRvZmY6IHF1YXJ0ZXIgc2VtaXRvbmUgc3RlcCwgbWF4PTI1NSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX2N1dG9mZihpbnQgdmFsKQoreworCXJldHVybiAodmFsIC0gNjQpICogZ3Nfc2Vuc2VbRlhfQ1VUT0ZGXSAvIDUwOworfQorCisvKiByZXNvbmFuY2U6IDAgdG8gMTUobWF4KSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX2ZpbHRlclEoaW50IHZhbCkKK3sKKwlyZXR1cm4gKHZhbCAtIDY0KSAqIGdzX3NlbnNlW0ZYX1JFU09OQU5DRV0gLyA1MDsKK30KKworLyogYXR0YWNrOiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX2F0dGFjayhpbnQgdmFsKQoreworCXJldHVybiAtKHZhbCAtIDY0KSAqIGdzX3NlbnNlW0ZYX0FUVEFDS10gLyA1MDsKK30KKworLyogZGVjYXk6ICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgZ3NfZGVjYXkoaW50IHZhbCkKK3sKKwlyZXR1cm4gLSh2YWwgLSA2NCkgKiBnc19zZW5zZVtGWF9SRUxFQVNFXSAvIDUwOworfQorCisvKiByZWxlYXNlOiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX3JlbGVhc2UoaW50IHZhbCkKK3sKKwlyZXR1cm4gLSh2YWwgLSA2NCkgKiBnc19zZW5zZVtGWF9SRUxFQVNFXSAvIDUwOworfQorCisvKiB2aWJyYXRvIGZyZXE6IDAuMDQySHogc3RlcCwgbWF4PTI1NSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX3ZpYl9yYXRlKGludCB2YWwpCit7CisJcmV0dXJuICh2YWwgLSA2NCkgKiBnc19zZW5zZVtGWF9WSUJSQVRFXSAvIDUwOworfQorCisvKiB2aWJyYXRvIGRlcHRoOiBtYXg9MTI3LCAxIG9jdGF2ZSAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX3ZpYl9kZXB0aChpbnQgdmFsKQoreworCXJldHVybiAodmFsIC0gNjQpICogZ3Nfc2Vuc2VbRlhfVklCREVQVEhdIC8gNTA7Cit9CisKKy8qIHZpYnJhdG8gZGVsYXk6IC0wLjcyNW1zZWMgc3RlcCAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IGdzX3ZpYl9kZWxheShpbnQgdmFsKQoreworCXJldHVybiAtKHZhbCAtIDY0KSAqIGdzX3NlbnNlW0ZYX1ZJQkRFTEFZXSAvIDUwOworfQorCitzdGF0aWMgQ29udlRhYmxlIGdzX2VmZmVjdHNbXSA9Cit7CisJezMyLCBBV0VfRlhfQ1VUT0ZGLAlnc19jdXRvZmZ9LAorCXszMywgQVdFX0ZYX0ZJTFRFUlEsCWdzX2ZpbHRlclF9LAorCXs5OSwgQVdFX0ZYX0VOVjJfQVRUQUNLLCBnc19hdHRhY2t9LAorCXsxMDAsIEFXRV9GWF9FTlYyX0RFQ0FZLCBnc19kZWNheX0sCisJezEwMiwgQVdFX0ZYX0VOVjJfUkVMRUFTRSwgZ3NfcmVsZWFzZX0sCisJezgsIEFXRV9GWF9MRk8xX0ZSRVEsIGdzX3ZpYl9yYXRlfSwKKwl7OSwgQVdFX0ZYX0xGTzFfVk9MVU1FLCBnc192aWJfZGVwdGh9LAorCXsxMCwgQVdFX0ZYX0xGTzFfREVMQVksIGdzX3ZpYl9kZWxheX0sCit9OworCitzdGF0aWMgaW50IG51bV9nc19lZmZlY3RzID0gbnVtYmVyb2YoZ3NfZWZmZWN0cyk7CisKKworLyoKKyAqIE5SUE4gZXZlbnRzOiBhY2NlcHQgYXMgQVdFMzIvU0M4OCBzcGVjaWZpYyBjb250cm9scworICovCisKK3N0YXRpYyB2b2lkIG1pZGlfbnJwbl9ldmVudChNaWRpU3RhdHVzICpzdCkKK3sKKwlpZiAocnBuX21zYltzdC0+Y2hhbl0gPT0gMTI3ICYmIHJwbl9sc2Jbc3QtPmNoYW5dIDw9IDI2KSB7CisJCWlmICghIG1zYl9iaXQpIC8qIGJvdGggTVNCL0xTQiBuZWNlc3NhcnkgKi8KKwkJCXNlbmRfY29udmVydGVkX2VmZmVjdChhd2VfZWZmZWN0cywgbnVtX2F3ZV9lZmZlY3RzLAorCQkJCQkgICAgICBzdCwgcnBuX2xzYltzdC0+Y2hhbl0sCisJCQkJCSAgICAgIHJwbl92YWxbc3QtPmNoYW5dIC0gODE5Mik7CisJfSBlbHNlIGlmIChycG5fbXNiW3N0LT5jaGFuXSA9PSAxKSB7CisJCWlmIChtc2JfYml0KSAvKiBvbmx5IE1TQiBpcyB2YWxpZCAqLworCQkJYWRkX2NvbnZlcnRlZF9lZmZlY3QoZ3NfZWZmZWN0cywgbnVtX2dzX2VmZmVjdHMsCisJCQkJCSAgICAgc3QsIHJwbl9sc2Jbc3QtPmNoYW5dLAorCQkJCQkgICAgIHJwbl92YWxbc3QtPmNoYW5dIC8gMTI4KTsKKwl9Cit9CisKKworLyoKKyAqIFhHIGNvbnRyb2wgZWZmZWN0czsgc3RpbGwgZXhwZXJpbWVudGFsCisgKi8KKworLyogY3V0b2ZmOiBxdWFydGVyIHNlbWl0b25lIHN0ZXAsIG1heD0yNTUgKi8KK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCB4Z19jdXRvZmYoaW50IHZhbCkKK3sKKwlyZXR1cm4gKHZhbCAtIDY0KSAqIHhnX3NlbnNlW0ZYX0NVVE9GRl0gLyA2NDsKK30KKworLyogcmVzb25hbmNlOiAwKG9wZW4pIHRvIDE1KG1vc3QgbmFzYWwpICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgeGdfZmlsdGVyUShpbnQgdmFsKQoreworCXJldHVybiAodmFsIC0gNjQpICogeGdfc2Vuc2VbRlhfUkVTT05BTkNFXSAvIDY0OworfQorCisvKiBhdHRhY2s6ICovCitzdGF0aWMgdW5zaWduZWQgc2hvcnQgeGdfYXR0YWNrKGludCB2YWwpCit7CisJcmV0dXJuIC0odmFsIC0gNjQpICogeGdfc2Vuc2VbRlhfQVRUQUNLXSAvIDY0OworfQorCisvKiByZWxlYXNlOiAqLworc3RhdGljIHVuc2lnbmVkIHNob3J0IHhnX3JlbGVhc2UoaW50IHZhbCkKK3sKKwlyZXR1cm4gLSh2YWwgLSA2NCkgKiB4Z19zZW5zZVtGWF9SRUxFQVNFXSAvIDY0OworfQorCitzdGF0aWMgQ29udlRhYmxlIHhnX2VmZmVjdHNbXSA9Cit7CisJezcxLCBBV0VfRlhfQ1VUT0ZGLAl4Z19jdXRvZmZ9LAorCXs3NCwgQVdFX0ZYX0ZJTFRFUlEsCXhnX2ZpbHRlclF9LAorCXs3MiwgQVdFX0ZYX0VOVjJfUkVMRUFTRSwgeGdfcmVsZWFzZX0sCisJezczLCBBV0VfRlhfRU5WMl9BVFRBQ0ssIHhnX2F0dGFja30sCit9OworCitzdGF0aWMgaW50IG51bV94Z19lZmZlY3RzID0gbnVtYmVyb2YoeGdfZWZmZWN0cyk7CisKK3N0YXRpYyBpbnQgeGdfY29udHJvbF9jaGFuZ2UoTWlkaVN0YXR1cyAqc3QsIGludCBjbWQsIGludCB2YWwpCit7CisJcmV0dXJuIGFkZF9jb252ZXJ0ZWRfZWZmZWN0KHhnX2VmZmVjdHMsIG51bV94Z19lZmZlY3RzLCBzdCwgY21kLCB2YWwpOworfQorCisjZW5kaWYgLyogQ09ORklHX0FXRTMyX01JRElFTVUgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisKKy8qCisgKiBpbml0aWFsaXphdGlvbiBvZiBBV0UgZHJpdmVyCisgKi8KKworc3RhdGljIHZvaWQKK2F3ZV9pbml0aWFsaXplKHZvaWQpCit7CisJREVCVUcoMCxwcmludGsoIkFXRTMyOiBpbml0aWFsaXppbmcuLlxuIikpOworCisJLyogaW5pdGlhbGl6ZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uICovCisJYXdlX3Bva2UoQVdFX0hXQ0YxLCAweDAwNTkpOworCWF3ZV9wb2tlKEFXRV9IV0NGMiwgMHgwMDIwKTsKKworCS8qIGRpc2FibGUgYXVkaW87IHRoaXMgc2VlbXMgdG8gcmVkdWNlIGEgY2xpY2tpbmcgbm9pc2UgYSBiaXQuLiAqLworCWF3ZV9wb2tlKEFXRV9IV0NGMywgMCk7CisKKwkvKiBpbml0aWFsaXplIGF1ZGlvIGNoYW5uZWxzICovCisJYXdlX2luaXRfYXVkaW8oKTsKKworCS8qIGluaXRpYWxpemUgRE1BICovCisJYXdlX2luaXRfZG1hKCk7CisKKwkvKiBpbml0aWFsaXplIGluaXQgYXJyYXkgKi8KKwlhd2VfaW5pdF9hcnJheSgpOworCisJLyogY2hlY2sgRFJBTSBtZW1vcnkgc2l6ZSAqLworCWF3ZV9jaGVja19kcmFtKCk7CisKKwkvKiBpbml0aWFsaXplIHRoZSBGTSBzZWN0aW9uIG9mIHRoZSBBV0UzMiAqLworCWF3ZV9pbml0X2ZtKCk7CisKKwkvKiBzZXQgdXAgdm9pY2UgZW52ZWxvcGVzICovCisJYXdlX3R3ZWFrKCk7CisKKwkvKiBlbmFibGUgYXVkaW8gKi8KKwlhd2VfcG9rZShBV0VfSFdDRjMsIDB4MDAwNCk7CisKKwkvKiBzZXQgZGVmYXVsdCB2YWx1ZXMgKi8KKwlhd2VfaW5pdF9jdHJsX3Bhcm1zKFRSVUUpOworCisJLyogc2V0IGVxdWFsaXplciAqLworCWF3ZV91cGRhdGVfZXF1YWxpemVyKCk7CisKKwkvKiBzZXQgcmV2ZXJiICYgY2hvcnVzIG1vZGVzICovCisJYXdlX3VwZGF0ZV9yZXZlcmJfbW9kZSgpOworCWF3ZV91cGRhdGVfY2hvcnVzX21vZGUoKTsKK30KKworCisvKgorICogQ29yZSBEZXZpY2UgTWFuYWdlbWVudCBGdW5jdGlvbnMKKyAqLworCisvKiBzdG9yZSB2YWx1ZXMgdG8gaS9vIHBvcnQgYXJyYXkgKi8KK3N0YXRpYyB2b2lkIHNldHVwX3BvcnRzKGludCBwb3J0MSwgaW50IHBvcnQyLCBpbnQgcG9ydDMpCit7CisJYXdlX3BvcnRzWzBdID0gcG9ydDE7CisJaWYgKHBvcnQyID09IDApCisJCXBvcnQyID0gcG9ydDEgKyAweDQwMDsKKwlhd2VfcG9ydHNbMV0gPSBwb3J0MjsKKwlhd2VfcG9ydHNbMl0gPSBwb3J0MiArIDI7CisJaWYgKHBvcnQzID09IDApCisJCXBvcnQzID0gcG9ydDEgKyAweDgwMDsKKwlhd2VfcG9ydHNbM10gPSBwb3J0MzsKKwlhd2VfcG9ydHNbNF0gPSBwb3J0MyArIDI7CisKKwlwb3J0X3NldHVwZWQgPSBUUlVFOworfQorCisvKgorICogcG9ydCByZXF1ZXN0CisgKiAgMHg2MjAtNjIzLCAweEEyMC1BMjMsIDB4RTIwLUUyMworICovCisKK3N0YXRpYyBpbnQKK2F3ZV9yZXF1ZXN0X3JlZ2lvbih2b2lkKQoreworCWlmICghIHBvcnRfc2V0dXBlZCkKKwkJcmV0dXJuIDA7CisJaWYgKCEgcmVxdWVzdF9yZWdpb24oYXdlX3BvcnRzWzBdLCA0LCAic291bmQgZHJpdmVyIChBV0UzMikiKSkKKwkJcmV0dXJuIDA7CisJaWYgKCEgcmVxdWVzdF9yZWdpb24oYXdlX3BvcnRzWzFdLCA0LCAic291bmQgZHJpdmVyIChBV0UzMikiKSkKKwkJZ290byBlcnJfb3V0OworCWlmICghIHJlcXVlc3RfcmVnaW9uKGF3ZV9wb3J0c1szXSwgNCwgInNvdW5kIGRyaXZlciAoQVdFMzIpIikpCisJCWdvdG8gZXJyX291dDE7CisJcmV0dXJuIDE7CitlcnJfb3V0MToKKwlyZWxlYXNlX3JlZ2lvbihhd2VfcG9ydHNbMV0sIDQpOworZXJyX291dDoKKwlyZWxlYXNlX3JlZ2lvbihhd2VfcG9ydHNbMF0sIDQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYXdlX3JlbGVhc2VfcmVnaW9uKHZvaWQpCit7CisJaWYgKCEgcG9ydF9zZXR1cGVkKSByZXR1cm47CisJcmVsZWFzZV9yZWdpb24oYXdlX3BvcnRzWzBdLCA0KTsKKwlyZWxlYXNlX3JlZ2lvbihhd2VfcG9ydHNbMV0sIDQpOworCXJlbGVhc2VfcmVnaW9uKGF3ZV9wb3J0c1szXSwgNCk7Cit9CisKK3N0YXRpYyBpbnQgYXdlX2F0dGFjaF9kZXZpY2Uodm9pZCkKK3sKKwlpZiAoYXdlX3ByZXNlbnQpIHJldHVybiAwOyAvKiBmb3IgT1NTMzguLiBjYWxsZWQgdHdpY2U/ICovCisKKwkvKiByZXNlcnZlIEkvTyBwb3J0cyBmb3IgYXdlZHJ2ICovCisJaWYgKCEgYXdlX3JlcXVlc3RfcmVnaW9uKCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBV0UzMjogSS9PIGFyZWEgYWxyZWFkeSB1c2VkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIHNldCBidWZmZXJzIHRvIE5VTEwgKi8KKwlzZmhlYWQgPSBzZnRhaWwgPSBOVUxMOworCisJbXlfZGV2ID0gc291bmRfYWxsb2Nfc3ludGhkZXYoKTsKKwlpZiAobXlfZGV2ID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQVdFMzIgRXJyb3I6IHRvbyBtYW55IHN5bnRoZXNpemVyc1xuIik7CisJCWF3ZV9yZWxlYXNlX3JlZ2lvbigpOworCQlyZXR1cm4gMDsKKwl9CisKKwl2b2ljZV9hbGxvYyA9ICZhd2Vfb3BlcmF0aW9ucy5hbGxvYzsKKwl2b2ljZV9hbGxvYy0+bWF4X3ZvaWNlID0gYXdlX21heF92b2ljZXM7CisJc3ludGhfZGV2c1tteV9kZXZdID0gJmF3ZV9vcGVyYXRpb25zOworCisjaWZkZWYgQ09ORklHX0FXRTMyX01JWEVSCisJYXR0YWNoX21peGVyKCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVdFMzJfTUlESUVNVQorCWF0dGFjaF9taWRpZW11KCk7CisjZW5kaWYKKworCS8qIGNsZWFyIGFsbCBzYW1wbGVzICovCisJYXdlX3Jlc2V0X3NhbXBsZXMoKTsKKworCS8qIGluaXRpYWxpemUgQVdFMzIgaGFyZHdhcmUgKi8KKwlhd2VfaW5pdGlhbGl6ZSgpOworCisJc3ByaW50Zihhd2VfaW5mby5uYW1lLCAiQVdFMzItJXMgKFJBTSVkaykiLAorCQlBV0VEUlZfVkVSU0lPTiwgbWVtc2l6ZS8xMDI0KTsKKwlwcmludGsoS0VSTl9JTkZPICI8U291bmRCbGFzdGVyIEVNVTgwMDAgKFJBTSVkayk+XG4iLCBtZW1zaXplLzEwMjQpOworCisJYXdlX3ByZXNlbnQgPSBUUlVFOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGF3ZV9kZXR0YWNoX2RldmljZSh2b2lkKQoreworCWlmIChhd2VfcHJlc2VudCkgeworCQlhd2VfcmVzZXRfc2FtcGxlcygpOworCQlhd2VfcmVsZWFzZV9yZWdpb24oKTsKKwkJZnJlZV90YWJsZXMoKTsKKyNpZmRlZiBDT05GSUdfQVdFMzJfTUlYRVIKKwkJdW5sb2FkX21peGVyKCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVdFMzJfTUlESUVNVQorCQl1bmxvYWRfbWlkaWVtdSgpOworI2VuZGlmCisJCXNvdW5kX3VubG9hZF9zeW50aGRldihteV9kZXYpOworCQlhd2VfcHJlc2VudCA9IEZBTFNFOworCX0KK30KKworCisvKgorICogTGVnYWN5IGRldmljZSBQcm9iaW5nCisgKi8KKworLyogZGV0ZWN0IGVtdTgwMDAgY2hpcCBvbiB0aGUgc3BlY2lmaWVkIGFkZHJlc3M7IGZyb20gVlYncyBndWlkZSAqLworCitzdGF0aWMgaW50IF9faW5pdAorYXdlX2RldGVjdF9iYXNlKGludCBhZGRyKQoreworCXNldHVwX3BvcnRzKGFkZHIsIDAsIDApOworCWlmICgoYXdlX3BlZWsoQVdFX1UxKSAmIDB4MDAwRikgIT0gMHgwMDBDKQorCQlyZXR1cm4gMDsKKwlpZiAoKGF3ZV9wZWVrKEFXRV9IV0NGMSkgJiAweDAwN0UpICE9IDB4MDA1OCkKKwkJcmV0dXJuIDA7CisJaWYgKChhd2VfcGVlayhBV0VfSFdDRjIpICYgMHgwMDAzKSAhPSAweDAwMDMpCisJCXJldHVybiAwOworICAgICAgICBERUJVRygwLHByaW50aygiQVdFMzIgZm91bmQgYXQgJXhcbiIsIGFkZHIpKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgYXdlX2RldGVjdF9sZWdhY3lfZGV2aWNlcyh2b2lkKQoreworCWludCBiYXNlOworCWZvciAoYmFzZSA9IDB4NjIwOyBiYXNlIDw9IDB4NjgwOyBiYXNlICs9IDB4MjApCisJCWlmIChhd2VfZGV0ZWN0X2Jhc2UoYmFzZSkpIHsKKwkJCWF3ZV9hdHRhY2hfZGV2aWNlKCk7CisJCQlyZXR1cm4gMTsKKwkJCX0KKwlERUJVRygwLHByaW50aygiQVdFMzIgTGVnYWN5IGRldGVjdGlvbiBmYWlsZWRcbiIpKTsKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogUG5QIGRldmljZSBQcm9iaW5nCisgKi8KKworc3RhdGljIHN0cnVjdCBwbnBfZGV2aWNlX2lkIGF3ZV9wbnBfaWRzW10gPSB7CisJey5pZCA9ICJDVEwwMDIxIiwgLmRyaXZlcl9kYXRhID0gMH0sIC8qIEFXRTMyIFdhdmVUYWJsZSAqLworCXsuaWQgPSAiQ1RMMDAyMiIsIC5kcml2ZXJfZGF0YSA9IDB9LCAvKiBBV0U2NCBXYXZlVGFibGUgKi8KKwl7LmlkID0gIkNUTDAwMjMiLCAuZHJpdmVyX2RhdGEgPSAwfSwgLyogQVdFNjQgR29sZCBXYXZlVGFibGUgKi8KKwl7IH0gLyogdGVybWluYXRvciAqLworfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwbnAsIGF3ZV9wbnBfaWRzKTsKKworc3RhdGljIGludCBhd2VfcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCit7CisJaW50IGlvMSwgaW8yLCBpbzM7CisKKwlpZiAoYXdlX3ByZXNlbnQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBV0UzMjogVGhpcyBkcml2ZXIgb25seSBzdXBwb3J0cyBvbmUgQVdFMzIgZGV2aWNlLCBza2lwcGluZy5cbiIpOworCX0KKworCWlmICghcG5wX3BvcnRfdmFsaWQoZGV2LDApIHx8CisJICAgICFwbnBfcG9ydF92YWxpZChkZXYsMSkgfHwKKwkgICAgIXBucF9wb3J0X3ZhbGlkKGRldiwyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkFXRTMyOiBUaGUgUG5QIGRldmljZSBkb2VzIG5vdCBoYXZlIHRoZSByZXF1aXJlZCByZXNvdXJjZXMuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlvMSA9IHBucF9wb3J0X3N0YXJ0KGRldiwwKTsKKwlpbzIgPSBwbnBfcG9ydF9zdGFydChkZXYsMSk7CisJaW8zID0gcG5wX3BvcnRfc3RhcnQoZGV2LDIpOworCXByaW50ayhLRVJOX0lORk8gIkFXRTMyOiBBIFBuUCBXYXZlIFRhYmxlIHdhcyBkZXRlY3RlZCBhdCBJTydzICUjeCwlI3gsJSN4XG4uIiwKKwkgICAgICAgaW8xLCBpbzIsIGlvMyk7CisJc2V0dXBfcG9ydHMoaW8xLCBpbzIsIGlvMyk7CisKKwlhd2VfYXR0YWNoX2RldmljZSgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhd2VfcG5wX3JlbW92ZShzdHJ1Y3QgcG5wX2RldiAqZGV2KQoreworCWF3ZV9kZXR0YWNoX2RldmljZSgpOworfQorCitzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgYXdlX3BucF9kcml2ZXIgPSB7CisJLm5hbWUJCT0gIkFXRTMyIiwKKwkuaWRfdGFibGUJPSBhd2VfcG5wX2lkcywKKwkucHJvYmUJCT0gYXdlX3BucF9wcm9iZSwKKwkucmVtb3ZlCQk9IGF3ZV9wbnBfcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgYXdlX2RldGVjdF9wbnBfZGV2aWNlcyh2b2lkKQoreworCWludCByZXQ7CisKKwlyZXQgPSBwbnBfcmVnaXN0ZXJfZHJpdmVyKCZhd2VfcG5wX2RyaXZlcik7CisJaWYgKHJldDwwKQorCQlwcmludGsoS0VSTl9FUlIgIkFXRTMyOiBQblAgc3VwcG9ydCBpcyB1bmF2YWlsYWJsZS5cbiIpOworCXJldHVybiByZXQ7Cit9CisKKworLyoKKyAqIGRldmljZSAvIGxvd2xldmVsIChtb2R1bGUpIGludGVyZmFjZQorICovCisKK3N0YXRpYyBpbnQgX19pbml0Cithd2VfZGV0ZWN0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiQVdFMzI6IFByb2JpbmcgZm9yIFdhdmVUYWJsZS4uLlxuIik7CisJaWYgKGlzYXBucCkgeworCQlpZiAoYXdlX2RldGVjdF9wbnBfZGV2aWNlcygpPj0wKQorCQkJcmV0dXJuIDE7CisJfSBlbHNlCisJCXByaW50ayhLRVJOX0lORk8gIkFXRTMyOiBTa2lwcGluZyBQblAgZGV0ZWN0aW9uLlxuIik7CisKKwlpZiAoYXdlX2RldGVjdF9sZWdhY3lfZGV2aWNlcygpKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBhdHRhY2hfYXdlKHZvaWQpCit7CisJcmV0dXJuIGF3ZV9kZXRlY3QoKSA/IDAgOiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX2F3ZSh2b2lkKQoreworCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmYXdlX3BucF9kcml2ZXIpOworCWF3ZV9kZXR0YWNoX2RldmljZSgpOworfQorCisKK21vZHVsZV9pbml0KGF0dGFjaF9hd2UpOworbW9kdWxlX2V4aXQodW5sb2FkX2F3ZSk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9hd2UoY2hhciAqc3RyKQoreworCS8qIGlvLCBtZW1zaXplLCBpc2FwbnAgKi8KKwlpbnQgaW50c1s0XTsKKworCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpbyA9IGludHNbMV07CisJbWVtc2l6ZSA9IGludHNbMl07CisJaXNhcG5wID0gaW50c1szXTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJhd2U9Iiwgc2V0dXBfYXdlKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2F3ZV93YXZlLmggYi9zb3VuZC9vc3MvYXdlX3dhdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2FhMDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2F3ZV93YXZlLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIHNvdW5kL2F3ZV9jb25maWcuaAorICoKKyAqIENvbmZpZ3VyYXRpb24gb2YgQVdFMzIvU0IzMi9BV0U2NCB3YXZlIHRhYmxlIHN5bnRoIGRyaXZlci4KKyAqICAgdmVyc2lvbiAwLjQuNDsgSmFuLiA0LCAyMDAwCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk2LTE5OTggVGFrYXNoaSBJd2FpCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqIGNob3J1cyAmIHJldmVyYiBlZmZlY3RzIHNlbmQgZm9yIEZNIGNoaXA6IGZyb20gMCB0byAweGZmCisgKiBsYXJnZXIgbnVtYmVycyBvZnRlbiBjYXVzZSB3ZWlyZCBzb3VuZHMuCisgKi8KKworI2RlZmluZSBERUZfRk1fQ0hPUlVTX0RFUFRICTB4MTAKKyNkZWZpbmUgREVGX0ZNX1JFVkVSQl9ERVBUSAkweDEwCisKKworLyoKKyAqIG90aGVyIGNvbXBpbGUgY29uZGl0aW9ucworICovCisKKy8qIGluaXRpYWxpemUgRk0gcGFzc3Rocm91Z2ggZXZlbiB3aXRob3V0IGV4dGVuZGVkIFJBTSAqLworI3VuZGVmIEFXRV9BTFdBWVNfSU5JVF9GTQorCisvKiBkZWJ1ZyBvbiAqLworI2RlZmluZSBBV0VfREVCVUdfT04KKworLyogR1VTIGNvbXBhdGlibGUgbW9kZSAqLworI2RlZmluZSBBV0VfSEFTX0dVU19DT01QQVRJQklMSVRZCisKKy8qIGFkZCBNSURJIGVtdWxhdGlvbiBieSB3YXZldGFibGUgKi8KKyNkZWZpbmUgQ09ORklHX0FXRTMyX01JRElFTVUKKworLyogYWRkIG1peGVyIGNvbnRyb2wgb2YgZW11ODAwMCBlcXVhbGl6ZXIgKi8KKyN1bmRlZiBDT05GSUdfQVdFMzJfTUlYRVIKKworLyogdXNlIG5ldyB2b2x1bWUgY2FsY3VsYXRpb24gbWV0aG9kIGFzIGRlZmF1bHQgKi8KKyNkZWZpbmUgQVdFX1VTRV9ORVdfVk9MVU1FX0NBTEMKKworLyogY2hlY2sgY3VycmVudCB2b2x1bWUgdGFyZ2V0IGZvciBzZWFyY2hpbmcgZW1wdHkgdm9pY2VzICovCisjZGVmaW5lIEFXRV9DSEVDS19WVEFSR0VUCisKKy8qIGFsbG93IHNhbXBsZSBzaGFyaW5nICovCisjZGVmaW5lIEFXRV9BTExPV19TQU1QTEVfU0hBUklORworCisvKgorICogQVdFMzIgY2FyZCBjb25maWd1cmF0aW9uOgorICogdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgbGluZXMgKk9OTFkqIHdoZW4gYXV0byBkZXRlY3Rpb24gZG9lc24ndAorICogd29yayBwcm9wZXJseSBvbiB5b3VyIG1hY2hpbmUuCisgKi8KKworLyojZGVmaW5lIEFXRV9ERUZBVUxUX0JBU0VfQUREUgkweDYyMCovCS8qIGJhc2UgcG9ydCBhZGRyZXNzICovCisvKiNkZWZpbmUgQVdFX0RFRkFVTFRfTUVNX1NJWkUJNTEyKi8JLyoga2J5dGVzICovCisKKy8qCisgKiBBV0UgZHJpdmVyIHZlcnNpb24gbnVtYmVyCisgKi8KKyNkZWZpbmUgQVdFX01BSk9SX1ZFUlNJT04JMAorI2RlZmluZSBBV0VfTUlOT1JfVkVSU0lPTgk0CisjZGVmaW5lIEFXRV9USU5ZX1ZFUlNJT04JNAorI2RlZmluZSBBV0VfVkVSU0lPTl9OVU1CRVIJKChBV0VfTUFKT1JfVkVSU0lPTjw8MTYpfChBV0VfTUlOT1JfVkVSU0lPTjw8OCl8QVdFX1RJTllfVkVSU0lPTikKKyNkZWZpbmUgQVdFRFJWX1ZFUlNJT04JCSIwLjQuNCIKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9iaW4yaGV4LmMgYi9zb3VuZC9vc3MvYmluMmhleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1OTEwOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvYmluMmhleC5jCkBAIC0wLDAgKzEsMzkgQEAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2IFtdICkKK3sKKyAgICBjb25zdCBjaGFyICogdmFybmFtZTsKKyAgICBpbnQgaSA9IDA7CisgICAgaW50IGM7CisgICAgaW50IGlkID0gMDsKKworICAgIGlmKGFyZ3ZbMV0gJiYgc3RyY21wKGFyZ3ZbMV0sIi1pIik9PTApCisgICAgeworICAgIAlhcmd2Kys7CisgICAgCWFyZ2MtLTsKKyAgICAJaWQ9MTsKKyAgICB9CisgICAgCQorICAgIGlmKGFyZ2M9PTEpCisgICAgeworICAgIAlmcHJpbnRmKHN0ZGVyciwgImJpbjJoZXg6IFstaV0gZmlybXdhcmVcbiIpOworICAgIAlleGl0KDEpOworICAgIH0KKyAgICAKKyAgICB2YXJuYW1lID0gYXJndlsxXTsKKyAgICBwcmludGYoICIvKiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSBiaW4yaGV4ICovXG4iICk7CisgICAgcHJpbnRmKCAic3RhdGljIHVuc2lnbmVkIGNoYXIgJXMgW10gJXMgPVxue1xuIiwgdmFybmFtZSAsIGlkPyJfX2luaXRkYXRhIjoiIik7CisKKyAgICB3aGlsZSAoICggYyA9IGdldGNoYXIoICkgKSAhPSBFT0YgKQorICAgIHsKKwlpZiAoIGkgIT0gMCAmJiBpICUgMTAgPT0gMCApCisJICAgIHByaW50ZiggIlxuIiApOworCXByaW50ZiggIjB4JTAybHgsIiwgYyAmIDB4RkZsICk7CisJaSsrOworICAgIH0KKworICAgIHByaW50ZiggIn07XG5zdGF0aWMgaW50ICVzTGVuID0gICVkO1xuIiwgdmFybmFtZSwgaSApOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2J0YXVkaW8uYyBiL3NvdW5kL29zcy9idGF1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1MDkzZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9idGF1ZGlvLmMKQEAgLTAsMCArMSwxMTM2IEBACisvKgorICAgIGJ0YXVkaW8gLSBidDg3OCBhdWRpbyBkbWEgZHJpdmVyIGZvciBsaW51eCAyLjQueAorCisgICAgKGMpIDIwMDAtMjAwMiBHZXJkIEtub3JyIDxrcmF4ZWxAYnl0ZXNleC5vcmc+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworCisvKiBtbWlvIGFjY2VzcyAqLworI2RlZmluZSBidHdyaXRlKGRhdCxhZHIpICAgIHdyaXRlbCgoZGF0KSwgKGJ0YS0+bW1pbysoYWRyKSkpCisjZGVmaW5lIGJ0cmVhZChhZHIpICAgICAgICAgcmVhZGwoYnRhLT5tbWlvKyhhZHIpKQorCisjZGVmaW5lIGJ0YW5kKGRhdCxhZHIpICAgICAgYnR3cml0ZSgoZGF0KSAmIGJ0cmVhZChhZHIpLCBhZHIpCisjZGVmaW5lIGJ0b3IoZGF0LGFkcikgICAgICAgYnR3cml0ZSgoZGF0KSB8IGJ0cmVhZChhZHIpLCBhZHIpCisjZGVmaW5lIGJ0YW9yKGRhdCxtYXNrLGFkcikgYnR3cml0ZSgoZGF0KSB8ICgobWFzaykgJiBidHJlYWQoYWRyKSksIGFkcikKKworLyogcmVnaXN0ZXJzIChzaGlmdGVkIGJlY2F1c2UgYnRhLT5tbWlvIGlzIGxvbmcpICovCisjZGVmaW5lIFJFR19JTlRfU1RBVCAgICAgICgweDEwMCA+PiAyKQorI2RlZmluZSBSRUdfSU5UX01BU0sgICAgICAoMHgxMDQgPj4gMikKKyNkZWZpbmUgUkVHX0dQSU9fRE1BX0NUTCAgKDB4MTBjID4+IDIpCisjZGVmaW5lIFJFR19QQUNLRVRfTEVOICAgICgweDExMCA+PiAyKQorI2RlZmluZSBSRUdfUklTQ19TVFJUX0FERCAoMHgxMTQgPj4gMikKKyNkZWZpbmUgUkVHX1JJU0NfQ09VTlQgICAgKDB4MTIwID4+IDIpCisKKy8qIElSUSBiaXRzIC0gUkVHX0lOVF8oU1RBVHxNQVNLKSAqLworI2RlZmluZSBJUlFfU0NFUlIgICAgICAgICAoMSA8PCAxOSkKKyNkZWZpbmUgSVJRX09DRVJSICAgICAgICAgKDEgPDwgMTgpCisjZGVmaW5lIElSUV9QQUJPUlQgICAgICAgICgxIDw8IDE3KQorI2RlZmluZSBJUlFfUklQRVJSICAgICAgICAoMSA8PCAxNikKKyNkZWZpbmUgSVJRX1BQRVJSICAgICAgICAgKDEgPDwgMTUpCisjZGVmaW5lIElSUV9GRFNSICAgICAgICAgICgxIDw8IDE0KQorI2RlZmluZSBJUlFfRlRSR1QgICAgICAgICAoMSA8PCAxMykKKyNkZWZpbmUgSVJRX0ZCVVMgICAgICAgICAgKDEgPDwgMTIpCisjZGVmaW5lIElSUV9SSVNDSSAgICAgICAgICgxIDw8IDExKQorI2RlZmluZSBJUlFfT0ZMT1cgICAgICAgICAoMSA8PCAgMykKKworI2RlZmluZSBJUlFfQlRBVURJTyAgICAgICAoSVJRX1NDRVJSIHwgSVJRX09DRVJSIHwgSVJRX1BBQk9SVCB8IElSUV9SSVBFUlIgfFwKKwkJCSAgIElSUV9QUEVSUiB8IElSUV9GRFNSICB8IElSUV9GVFJHVCAgfCBJUlFfRkJVUyAgIHxcCisJCQkgICBJUlFfUklTQ0kpCisKKy8qIFJFR19HUElPX0RNQV9DVEwgYml0cyAqLworI2RlZmluZSBETUFfQ1RMX0FfUFdSRE4gICAoMSA8PCAyNikKKyNkZWZpbmUgRE1BX0NUTF9EQV9TQlIgICAgKDEgPDwgMTQpCisjZGVmaW5lIERNQV9DVExfREFfRVMyICAgICgxIDw8IDEzKQorI2RlZmluZSBETUFfQ1RMX0FDQVBfRU4gICAoMSA8PCAgNCkKKyNkZWZpbmUgRE1BX0NUTF9SSVNDX0VOICAgKDEgPDwgIDEpCisjZGVmaW5lIERNQV9DVExfRklGT19FTiAgICgxIDw8ICAwKQorCisvKiBSSVNDIGluc3RydWN0aW9ucyAqLworI2RlZmluZSBSSVNDX1dSSVRFICAgICAgICAoMHgwMSA8PCAyOCkKKyNkZWZpbmUgUklTQ19KVU1QICAgICAgICAgKDB4MDcgPDwgMjgpCisjZGVmaW5lIFJJU0NfU1lOQyAgICAgICAgICgweDA4IDw8IDI4KQorCisvKiBSSVNDIGJpdHMgKi8KKyNkZWZpbmUgUklTQ19XUl9TT0wgICAgICAgKDEgPDwgMjcpCisjZGVmaW5lIFJJU0NfV1JfRU9MICAgICAgICgxIDw8IDI2KQorI2RlZmluZSBSSVNDX0lSUSAgICAgICAgICAoMSA8PCAyNCkKKyNkZWZpbmUgUklTQ19TWU5DX1JFU1lOQyAgKDEgPDwgMTUpCisjZGVmaW5lIFJJU0NfU1lOQ19GTTEgICAgIDB4MDYKKyNkZWZpbmUgUklTQ19TWU5DX1ZSTyAgICAgMHgwYworCisjZGVmaW5lIEhXQkFTRV9BRCAoNDQ4MDAwKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgYnRhdWRpbyB7CisJLyogbGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3QgYnRhdWRpbyAqbmV4dDsKKworCS8qIGRldmljZSBpbmZvICovCisJaW50ICAgICAgICAgICAgZHNwX2RpZ2l0YWw7CisJaW50ICAgICAgICAgICAgZHNwX2FuYWxvZzsKKwlpbnQgICAgICAgICAgICBtaXhlcl9kZXY7CisJc3RydWN0IHBjaV9kZXYgKnBjaTsKKwl1bnNpZ25lZCBpbnQgICBpcnE7CisJdW5zaWduZWQgbG9uZyAgbWVtOworCXVuc2lnbmVkIGxvbmcgIF9faW9tZW0gKm1taW87CisKKwkvKiBsb2NraW5nICovCisJaW50ICAgICAgICAgICAgdXNlcnM7CisJc3RydWN0IHNlbWFwaG9yZSBsb2NrOworCisJLyogcmlzYyBpbnN0cnVjdGlvbnMgKi8KKwl1bnNpZ25lZCBpbnQgICByaXNjX3NpemU7CisJdW5zaWduZWQgbG9uZyAgKnJpc2NfY3B1OworCWRtYV9hZGRyX3QgICAgIHJpc2NfZG1hOworCisJLyogYXVkaW8gZGF0YSAqLworCXVuc2lnbmVkIGludCAgIGJ1Zl9zaXplOworCXVuc2lnbmVkIGNoYXIgICpidWZfY3B1OworCWRtYV9hZGRyX3QgICAgIGJ1Zl9kbWE7CisKKwkvKiBidWZmZXIgc2V0dXAgKi8KKwlpbnQgbGluZV9ieXRlczsKKwlpbnQgbGluZV9jb3VudDsKKwlpbnQgYmxvY2tfYnl0ZXM7CisJaW50IGJsb2NrX2NvdW50OworCisJLyogcmVhZCBmaWZvIG1hbmFnZW1lbnQgKi8KKwlpbnQgcmVjb3JkaW5nOworCWludCBkbWFfYmxvY2s7CisJaW50IHJlYWRfb2Zmc2V0OworCWludCByZWFkX2NvdW50OworCXdhaXRfcXVldWVfaGVhZF90IHJlYWRxOworCisJLyogc2V0dGluZ3MgKi8KKwlpbnQgZ2FpblszXTsKKwlpbnQgc291cmNlOworCWludCBiaXRzOworCWludCBkZWNpbWF0aW9uOworCWludCBtaXhjb3VudDsKKwlpbnQgc2FtcGxlc2hpZnQ7CisJaW50IGNoYW5uZWxzOworCWludCBhbmFsb2c7CisJaW50IHJhdGU7Cit9OworCitzdHJ1Y3QgY2FyZGluZm8geworCWNoYXIgKm5hbWU7CisJaW50IHJhdGU7Cit9OworCitzdGF0aWMgc3RydWN0IGJ0YXVkaW8gKmJ0YXVkaW9zOworc3RhdGljIHVuc2lnbmVkIGludCBkZWJ1ZzsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXJxX2RlYnVnOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEJVRl9ERUZBVUxUIDEyOCoxMDI0CisjZGVmaW5lIEJVRl9NSU4gICAgICAgICA4MTkyCisKK3N0YXRpYyBpbnQgYWxsb2NfYnVmZmVyKHN0cnVjdCBidGF1ZGlvICpidGEpCit7CisJaWYgKE5VTEwgPT0gYnRhLT5idWZfY3B1KSB7CisJCWZvciAoYnRhLT5idWZfc2l6ZSA9IEJVRl9ERUZBVUxUOyBidGEtPmJ1Zl9zaXplID49IEJVRl9NSU47CisJCSAgICAgYnRhLT5idWZfc2l6ZSA9IGJ0YS0+YnVmX3NpemUgPj4gMSkgeworCQkJYnRhLT5idWZfY3B1ID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQKKwkJCQkoYnRhLT5wY2ksIGJ0YS0+YnVmX3NpemUsICZidGEtPmJ1Zl9kbWEpOworCQkJaWYgKE5VTEwgIT0gYnRhLT5idWZfY3B1KQorCQkJCWJyZWFrOworCQl9CisJCWlmIChOVUxMID09IGJ0YS0+YnVmX2NwdSkKKwkJCXJldHVybiAtRU5PTUVNOworCQltZW1zZXQoYnRhLT5idWZfY3B1LDAsYnRhLT5idWZfc2l6ZSk7CisJfQorCWlmIChOVUxMID09IGJ0YS0+cmlzY19jcHUpIHsKKwkJYnRhLT5yaXNjX3NpemUgPSBQQUdFX1NJWkU7CisJCWJ0YS0+cmlzY19jcHUgPSBwY2lfYWxsb2NfY29uc2lzdGVudAorCQkJKGJ0YS0+cGNpLCBidGEtPnJpc2Nfc2l6ZSwgJmJ0YS0+cmlzY19kbWEpOworCQlpZiAoTlVMTCA9PSBidGEtPnJpc2NfY3B1KSB7CisJCQlwY2lfZnJlZV9jb25zaXN0ZW50KGJ0YS0+cGNpLCBidGEtPmJ1Zl9zaXplLCBidGEtPmJ1Zl9jcHUsIGJ0YS0+YnVmX2RtYSk7CisJCQlidGEtPmJ1Zl9jcHUgPSBOVUxMOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYnVmZmVyKHN0cnVjdCBidGF1ZGlvICpidGEpCit7CisJaWYgKE5VTEwgIT0gYnRhLT5idWZfY3B1KSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoYnRhLT5wY2ksIGJ0YS0+YnVmX3NpemUsCisJCQkJICAgIGJ0YS0+YnVmX2NwdSwgYnRhLT5idWZfZG1hKTsKKwkJYnRhLT5idWZfY3B1ID0gTlVMTDsKKwl9CisJaWYgKE5VTEwgIT0gYnRhLT5yaXNjX2NwdSkgeworCQlwY2lfZnJlZV9jb25zaXN0ZW50KGJ0YS0+cGNpLCBidGEtPnJpc2Nfc2l6ZSwKKwkJCQkgICAgYnRhLT5yaXNjX2NwdSwgYnRhLT5yaXNjX2RtYSk7CisJCWJ0YS0+cmlzY19jcHUgPSBOVUxMOworCX0KK30KKworc3RhdGljIGludCBtYWtlX3Jpc2Moc3RydWN0IGJ0YXVkaW8gKmJ0YSkKK3sKKwlpbnQgcnAsIGJwLCBsaW5lLCBibG9jazsKKwl1bnNpZ25lZCBsb25nIHJpc2M7CisKKwlidGEtPmJsb2NrX2J5dGVzID0gYnRhLT5idWZfc2l6ZSA+PiA0OworCWJ0YS0+YmxvY2tfY291bnQgPSAxIDw8IDQ7CisJYnRhLT5saW5lX2J5dGVzICA9IGJ0YS0+YmxvY2tfYnl0ZXM7CisJYnRhLT5saW5lX2NvdW50ICA9IGJ0YS0+YmxvY2tfY291bnQ7CisJd2hpbGUgKGJ0YS0+bGluZV9ieXRlcyA+IDQwOTUpIHsKKwkJYnRhLT5saW5lX2J5dGVzID4+PSAxOworCQlidGEtPmxpbmVfY291bnQgPDw9IDE7CisJfQorCWlmIChidGEtPmxpbmVfY291bnQgPiAyNTUpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKEtFUk5fREVCVUcKKwkJICAgICAgICJidGF1ZGlvOiBidWZzaXplPSVkIC0gYnM9JWQgYmM9JWQgLSBscz0lZCwgbGM9JWRcbiIsCisJCSAgICAgICBidGEtPmJ1Zl9zaXplLGJ0YS0+YmxvY2tfYnl0ZXMsYnRhLT5ibG9ja19jb3VudCwKKwkJICAgICAgIGJ0YS0+bGluZV9ieXRlcyxidGEtPmxpbmVfY291bnQpOworICAgICAgICBycCA9IDA7IGJwID0gMDsKKwlibG9jayA9IDA7CisJYnRhLT5yaXNjX2NwdVtycCsrXSA9IGNwdV90b19sZTMyKFJJU0NfU1lOQ3xSSVNDX1NZTkNfRk0xKTsKKwlidGEtPnJpc2NfY3B1W3JwKytdID0gY3B1X3RvX2xlMzIoMCk7CisJZm9yIChsaW5lID0gMDsgbGluZSA8IGJ0YS0+bGluZV9jb3VudDsgbGluZSsrKSB7CisJCXJpc2MgID0gUklTQ19XUklURSB8IFJJU0NfV1JfU09MIHwgUklTQ19XUl9FT0w7CisJCXJpc2MgfD0gYnRhLT5saW5lX2J5dGVzOworCQlpZiAoMCA9PSAoYnAgJiAoYnRhLT5ibG9ja19ieXRlcy0xKSkpIHsKKwkJCXJpc2MgfD0gUklTQ19JUlE7CisJCQlyaXNjIHw9IChibG9jayAgJiAweDBmKSA8PCAxNjsKKwkJCXJpc2MgfD0gKH5ibG9jayAmIDB4MGYpIDw8IDIwOworCQkJYmxvY2srKzsKKwkJfQorCQlidGEtPnJpc2NfY3B1W3JwKytdID0gY3B1X3RvX2xlMzIocmlzYyk7CisJCWJ0YS0+cmlzY19jcHVbcnArK10gPSBjcHVfdG9fbGUzMihidGEtPmJ1Zl9kbWEgKyBicCk7CisJCWJwICs9IGJ0YS0+bGluZV9ieXRlczsKKwl9CisJYnRhLT5yaXNjX2NwdVtycCsrXSA9IGNwdV90b19sZTMyKFJJU0NfU1lOQ3xSSVNDX1NZTkNfVlJPKTsKKwlidGEtPnJpc2NfY3B1W3JwKytdID0gY3B1X3RvX2xlMzIoMCk7CisJYnRhLT5yaXNjX2NwdVtycCsrXSA9IGNwdV90b19sZTMyKFJJU0NfSlVNUCk7IAorCWJ0YS0+cmlzY19jcHVbcnArK10gPSBjcHVfdG9fbGUzMihidGEtPnJpc2NfZG1hKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGFydF9yZWNvcmRpbmcoc3RydWN0IGJ0YXVkaW8gKmJ0YSkKK3sKKwlpbnQgcmV0OworCisJaWYgKDAgIT0gKHJldCA9IGFsbG9jX2J1ZmZlcihidGEpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoMCAhPSAocmV0ID0gbWFrZV9yaXNjKGJ0YSkpKQorCQlyZXR1cm4gcmV0OworCisJYnR3cml0ZShidGEtPnJpc2NfZG1hLCBSRUdfUklTQ19TVFJUX0FERCk7CisJYnR3cml0ZSgoYnRhLT5saW5lX2NvdW50IDw8IDE2KSB8IGJ0YS0+bGluZV9ieXRlcywKKwkJUkVHX1BBQ0tFVF9MRU4pOworCWJ0d3JpdGUoSVJRX0JUQVVESU8sIFJFR19JTlRfTUFTSyk7CisJaWYgKGJ0YS0+YW5hbG9nKSB7CisJCWJ0d3JpdGUoRE1BX0NUTF9BQ0FQX0VOIHwKKwkJCURNQV9DVExfUklTQ19FTiB8CisJCQlETUFfQ1RMX0ZJRk9fRU4gfAorCQkJRE1BX0NUTF9EQV9FUzIgIHwKKwkJCSgoYnRhLT5iaXRzID09IDgpID8gRE1BX0NUTF9EQV9TQlIgOiAwKSB8CisJCQkoYnRhLT5nYWluW2J0YS0+c291cmNlXSA8PCAyOCkgfAorCQkJKGJ0YS0+c291cmNlICAgICAgICAgICAgPDwgMjQpIHwKKwkJCShidGEtPmRlY2ltYXRpb24gICAgICAgIDw8ICA4KSwKKwkJCVJFR19HUElPX0RNQV9DVEwpOworCX0gZWxzZSB7CisJCWJ0d3JpdGUoRE1BX0NUTF9BQ0FQX0VOIHwKKwkJCURNQV9DVExfUklTQ19FTiB8CisJCQlETUFfQ1RMX0ZJRk9fRU4gfAorCQkJRE1BX0NUTF9EQV9FUzIgIHwKKwkJCURNQV9DVExfQV9QV1JETiB8CisJCQkoMSA8PCA2KSAgIHwKKwkJCSgoYnRhLT5iaXRzID09IDgpID8gRE1BX0NUTF9EQV9TQlIgOiAwKSB8CisJCQkoYnRhLT5nYWluW2J0YS0+c291cmNlXSA8PCAyOCkgfAorCQkJKGJ0YS0+c291cmNlICAgICAgICAgICAgPDwgMjQpIHwKKwkJCShidGEtPmRlY2ltYXRpb24gICAgICAgIDw8ICA4KSwKKwkJCVJFR19HUElPX0RNQV9DVEwpOworCX0KKwlidGEtPmRtYV9ibG9jayA9IDA7CisJYnRhLT5yZWFkX29mZnNldCA9IDA7CisJYnRhLT5yZWFkX2NvdW50ID0gMDsKKwlidGEtPnJlY29yZGluZyA9IDE7CisJaWYgKGRlYnVnKQorCQlwcmludGsoS0VSTl9ERUJVRyAiYnRhdWRpbzogcmVjb3JkaW5nIHN0YXJ0ZWRcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdG9wX3JlY29yZGluZyhzdHJ1Y3QgYnRhdWRpbyAqYnRhKQoreworICAgICAgICBidGFuZCh+MTUsIFJFR19HUElPX0RNQV9DVEwpOworCWJ0YS0+cmVjb3JkaW5nID0gMDsKKwlpZiAoZGVidWcpCisJCXByaW50ayhLRVJOX0RFQlVHICJidGF1ZGlvOiByZWNvcmRpbmcgc3RvcHBlZFxuIik7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBidGF1ZGlvX21peGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhOworCisJZm9yIChidGEgPSBidGF1ZGlvczsgYnRhICE9IE5VTEw7IGJ0YSA9IGJ0YS0+bmV4dCkKKwkJaWYgKGJ0YS0+bWl4ZXJfZGV2ID09IG1pbm9yKQorCQkJYnJlYWs7CisJaWYgKE5VTEwgPT0gYnRhKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmIChkZWJ1ZykKKwkJcHJpbnRrKCJidGF1ZGlvOiBvcGVuIG1peGVyIFslZF1cbiIsbWlub3IpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGJ0YTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBidGF1ZGlvX21peGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYnRhdWRpb19taXhlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQsdmFsPTAsaT0wOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCW1peGVyX2luZm8gaW5mbzsKKwkJbWVtc2V0KCZpbmZvLDAsc2l6ZW9mKGluZm8pKTsKKyAgICAgICAgICAgICAgICBzdHJsY3B5KGluZm8uaWQsImJ0ODc4IixzaXplb2YoaW5mby5pZCkpOworICAgICAgICAgICAgICAgIHN0cmxjcHkoaW5mby5uYW1lLCJCcm9va3RyZWUgQnQ4NzggYXVkaW8iLHNpemVvZihpbmZvLm5hbWUpKTsKKyAgICAgICAgICAgICAgICBpbmZvLm1vZGlmeV9jb3VudGVyID0gYnRhLT5taXhjb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZpbmZvLCBzaXplb2YoaW5mbykpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CisJCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sMCxzaXplb2YoaW5mbykpOworICAgICAgICAgICAgICAgIHN0cmxjcHkoaW5mby5pZCwiYnQ4NzgiLHNpemVvZihpbmZvLmlkKS0xKTsKKyAgICAgICAgICAgICAgICBzdHJsY3B5KGluZm8ubmFtZSwiQnJvb2t0cmVlIEJ0ODc4IGF1ZGlvIixzaXplb2YoaW5mby5uYW1lKSk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgX191c2VyICopYXJncCk7CisKKwkvKiByZWFkICovCisJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpCisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0NBUFMpOgorCQlyZXQgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJYnJlYWs7CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1NURVJFT0RFVlMpOgorCQlyZXQgPSAwOworCQlicmVhazsKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUkVDTUFTSyk6CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0RFVk1BU0spOgorCQlyZXQgPSBTT1VORF9NQVNLX0xJTkUxfFNPVU5EX01BU0tfTElORTJ8U09VTkRfTUFTS19MSU5FMzsKKwkJYnJlYWs7CisKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1JFQ1NSQyk6CisJCWlmICh2YWwgJiBTT1VORF9NQVNLX0xJTkUxICYmIGJ0YS0+c291cmNlICE9IDApCisJCQlidGEtPnNvdXJjZSA9IDA7CisJCWVsc2UgaWYgKHZhbCAmIFNPVU5EX01BU0tfTElORTIgJiYgYnRhLT5zb3VyY2UgIT0gMSkKKwkJCWJ0YS0+c291cmNlID0gMTsKKwkJZWxzZSBpZiAodmFsICYgU09VTkRfTUFTS19MSU5FMyAmJiBidGEtPnNvdXJjZSAhPSAyKQorCQkJYnRhLT5zb3VyY2UgPSAyOworCQlidGFvcigoYnRhLT5nYWluW2J0YS0+c291cmNlXSA8PCAyOCkgfAorCQkgICAgICAoYnRhLT5zb3VyY2UgICAgICAgICAgICA8PCAyNCksCisJCSAgICAgIDB4MGNmZmZmZmYsIFJFR19HUElPX0RNQV9DVEwpOworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9SRUNTUkMpOgorCQlzd2l0Y2ggKGJ0YS0+c291cmNlKSB7CisJCWNhc2UgMDogIHJldCA9IFNPVU5EX01BU0tfTElORTE7IGJyZWFrOworCQljYXNlIDE6ICByZXQgPSBTT1VORF9NQVNLX0xJTkUyOyBicmVhazsKKwkJY2FzZSAyOiAgcmV0ID0gU09VTkRfTUFTS19MSU5FMzsgYnJlYWs7CisJCWRlZmF1bHQ6IHJldCA9IDA7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUxKToKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUyKToKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUzKToKKwkJaWYgKE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUxKSA9PSBjbWQpCisJCQlpID0gMDsKKwkJaWYgKE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUyKSA9PSBjbWQpCisJCQlpID0gMTsKKwkJaWYgKE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0xJTkUzKSA9PSBjbWQpCisJCQlpID0gMjsKKwkJYnRhLT5nYWluW2ldID0gKHZhbCAmIDB4ZmYpICogMTUgLyAxMDA7CisJCWlmIChidGEtPmdhaW5baV0gPiAxNSkgYnRhLT5nYWluW2ldID0gMTU7CisJCWlmIChidGEtPmdhaW5baV0gPCAgMCkgYnRhLT5nYWluW2ldID0gIDA7CisJCWlmIChpID09IGJ0YS0+c291cmNlKQorCQkJYnRhb3IoKGJ0YS0+Z2FpbltidGEtPnNvdXJjZV08PDI4KSwKKwkJCSAgICAgIDB4MGZmZmZmZmYsIFJFR19HUElPX0RNQV9DVEwpOworCQlyZXQgID0gYnRhLT5nYWluW2ldICogMTAwIC8gMTU7CisJCXJldCB8PSByZXQgPDwgODsKKwkJYnJlYWs7CisKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTElORTEpOgorCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMik6CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUzKToKKwkJaWYgKE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTElORTEpID09IGNtZCkKKwkJCWkgPSAwOworCQlpZiAoTUlYRVJfUkVBRChTT1VORF9NSVhFUl9MSU5FMikgPT0gY21kKQorCQkJaSA9IDE7CisJCWlmIChNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0xJTkUzKSA9PSBjbWQpCisJCQlpID0gMjsKKwkJcmV0ICA9IGJ0YS0+Z2FpbltpXSAqIDEwMCAvIDE1OworCQlyZXQgfD0gcmV0IDw8IDg7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChwdXRfdXNlcihyZXQsIChpbnQgX191c2VyICopYXJncCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBidGF1ZGlvX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5vcGVuCQk9IGJ0YXVkaW9fbWl4ZXJfb3BlbiwKKwkucmVsZWFzZQk9IGJ0YXVkaW9fbWl4ZXJfcmVsZWFzZSwKKwkuaW9jdGwJCT0gYnRhdWRpb19taXhlcl9pb2N0bCwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgYnRhdWRpb19kc3Bfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICBzdHJ1Y3QgYnRhdWRpbyAqYnRhLCBpbnQgYW5hbG9nKQoreworCWRvd24oJmJ0YS0+bG9jayk7CisJaWYgKGJ0YS0+dXNlcnMpCisJCWdvdG8gYnVzeTsKKwlidGEtPnVzZXJzKys7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gYnRhOworCisJYnRhLT5hbmFsb2cgPSBhbmFsb2c7CisJYnRhLT5kbWFfYmxvY2sgPSAwOworCWJ0YS0+cmVhZF9vZmZzZXQgPSAwOworCWJ0YS0+cmVhZF9jb3VudCA9IDA7CisJYnRhLT5zYW1wbGVzaGlmdCA9IDA7CisKKwl1cCgmYnRhLT5sb2NrKTsKKwlyZXR1cm4gMDsKKworIGJ1c3k6CisJdXAoJmJ0YS0+bG9jayk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIGludCBidGF1ZGlvX2RzcF9vcGVuX2RpZ2l0YWwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhOworCisJZm9yIChidGEgPSBidGF1ZGlvczsgYnRhICE9IE5VTEw7IGJ0YSA9IGJ0YS0+bmV4dCkKKwkJaWYgKGJ0YS0+ZHNwX2RpZ2l0YWwgPT0gbWlub3IpCisJCQlicmVhazsKKwlpZiAoTlVMTCA9PSBidGEpCisJCXJldHVybiAtRU5PREVWOworCQorCWlmIChkZWJ1ZykKKwkJcHJpbnRrKCJidGF1ZGlvOiBvcGVuIGRpZ2l0YWwgZHNwIFslZF1cbiIsbWlub3IpOworCXJldHVybiBidGF1ZGlvX2RzcF9vcGVuKGlub2RlLGZpbGUsYnRhLDApOworfQorCitzdGF0aWMgaW50IGJ0YXVkaW9fZHNwX29wZW5fYW5hbG9nKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGJ0YXVkaW8gKmJ0YTsKKworCWZvciAoYnRhID0gYnRhdWRpb3M7IGJ0YSAhPSBOVUxMOyBidGEgPSBidGEtPm5leHQpCisJCWlmIChidGEtPmRzcF9hbmFsb2cgPT0gbWlub3IpCisJCQlicmVhazsKKwlpZiAoTlVMTCA9PSBidGEpCisJCXJldHVybiAtRU5PREVWOworCisJaWYgKGRlYnVnKQorCQlwcmludGsoImJ0YXVkaW86IG9wZW4gYW5hbG9nIGRzcCBbJWRdXG4iLG1pbm9yKTsKKwlyZXR1cm4gYnRhdWRpb19kc3Bfb3Blbihpbm9kZSxmaWxlLGJ0YSwxKTsKK30KKworc3RhdGljIGludCBidGF1ZGlvX2RzcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBidGF1ZGlvICpidGEgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlkb3duKCZidGEtPmxvY2spOworCWlmIChidGEtPnJlY29yZGluZykKKwkJc3RvcF9yZWNvcmRpbmcoYnRhKTsKKwlidGEtPnVzZXJzLS07CisJdXAoJmJ0YS0+bG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJ0YXVkaW9fZHNwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsCisJCQkJc2l6ZV90IHN3Y291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCBod2NvdW50ID0gc3djb3VudCA8PCBidGEtPnNhbXBsZXNoaWZ0OworCWludCBuc3JjLCBuZHN0LCBlcnIsIHJldCA9IDA7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhZGRfd2FpdF9xdWV1ZSgmYnRhLT5yZWFkcSwgJndhaXQpOworCWRvd24oJmJ0YS0+bG9jayk7CisJd2hpbGUgKHN3Y291bnQgPiAwKSB7CisJCWlmICgwID09IGJ0YS0+cmVhZF9jb3VudCkgeworCQkJaWYgKCFidGEtPnJlY29yZGluZykgeworCQkJCWlmICgwICE9IChlcnIgPSBzdGFydF9yZWNvcmRpbmcoYnRhKSkpIHsKKwkJCQkJaWYgKDAgPT0gcmV0KQorCQkJCQkJcmV0ID0gZXJyOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoMCA9PSByZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQl1cCgmYnRhLT5sb2NrKTsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQkJc2NoZWR1bGUoKTsKKwkJCWRvd24oJmJ0YS0+bG9jayk7CisJCQlpZihzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICgwID09IHJldCkKKwkJCQkJcmV0ID0gLUVJTlRSOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW5zcmMgPSAoYnRhLT5yZWFkX2NvdW50IDwgaHdjb3VudCkgPyBidGEtPnJlYWRfY291bnQgOiBod2NvdW50OworCQlpZiAobnNyYyA+IGJ0YS0+YnVmX3NpemUgLSBidGEtPnJlYWRfb2Zmc2V0KQorCQkJbnNyYyA9IGJ0YS0+YnVmX3NpemUgLSBidGEtPnJlYWRfb2Zmc2V0OworCQluZHN0ID0gbnNyYyA+PiBidGEtPnNhbXBsZXNoaWZ0OworCQkKKwkJaWYgKChidGEtPmFuYWxvZyAgJiYgMCA9PSBidGEtPnNhbXBsZXNoaWZ0KSB8fAorCQkgICAgKCFidGEtPmFuYWxvZyAmJiAyID09IGJ0YS0+Y2hhbm5lbHMpKSB7CisJCQkvKiBqdXN0IGNvcHkgKi8KKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyICsgcmV0LCBidGEtPmJ1Zl9jcHUgKyBidGEtPnJlYWRfb2Zmc2V0LCBuc3JjKSkgeworCQkJCWlmICgwID09IHJldCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQl9IGVsc2UgaWYgKCFidGEtPmFuYWxvZykgeworCQkJLyogc3RlcmVvID0+IG1vbm8gKGRpZ2l0YWwgYXVkaW8pICovCisJCQlfX3MxNiAqc3JjID0gKF9fczE2KikoYnRhLT5idWZfY3B1ICsgYnRhLT5yZWFkX29mZnNldCk7CisJCQlfX3MxNiBfX3VzZXIgKmRzdCA9IChfX3MxNiBfX3VzZXIgKikoYnVmZmVyICsgcmV0KTsKKwkJCV9fczE2IGF2ZzsKKwkJCWludCBuID0gbmRzdD4+MTsKKwkJCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgZHN0LCBuZHN0KSkgeworCQkJCWlmICgwID09IHJldCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWZvciAoOyBuOyBuLS0sIGRzdCsrKSB7CisJCQkJYXZnICA9IChfX3MxNilsZTE2X3RvX2NwdSgqc3JjKSAvIDI7IHNyYysrOworCQkJCWF2ZyArPSAoX19zMTYpbGUxNl90b19jcHUoKnNyYykgLyAyOyBzcmMrKzsKKwkJCQlfX3B1dF91c2VyKGNwdV90b19sZTE2KGF2ZyksZHN0KTsKKwkJCX0KKworCQl9IGVsc2UgaWYgKDggPT0gYnRhLT5iaXRzKSB7CisJCQkvKiBjb3B5ICsgYnl0ZSBkb3duc2FtcGxpbmcgKGF1ZGlvIEEvRCkgKi8KKwkJCV9fdTggKnNyYyA9IGJ0YS0+YnVmX2NwdSArIGJ0YS0+cmVhZF9vZmZzZXQ7CisJCQlfX3U4IF9fdXNlciAqZHN0ID0gYnVmZmVyICsgcmV0OworCQkJaW50IG4gPSBuZHN0OworCQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkc3QsIG5kc3QpKSB7CisJCQkJaWYgKDAgPT0gcmV0KQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJZm9yICg7IG47IG4tLSwgc3JjICs9ICgxIDw8IGJ0YS0+c2FtcGxlc2hpZnQpLCBkc3QrKykKKwkJCQlfX3B1dF91c2VyKCpzcmMsIGRzdCk7CisKKwkJfSBlbHNlIHsKKwkJCS8qIGNvcHkgKyB3b3JkIGRvd25zYW1wbGluZyAoYXVkaW8gQS9EKSAqLworCQkJX191MTYgKnNyYyA9IChfX3UxNiopKGJ0YS0+YnVmX2NwdSArIGJ0YS0+cmVhZF9vZmZzZXQpOworCQkJX191MTYgX191c2VyICpkc3QgPSAoX191MTYgX191c2VyICopKGJ1ZmZlciArIHJldCk7CisJCQlpbnQgbiA9IG5kc3Q+PjE7CisJCQlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsZHN0LG5kc3QpKSB7CisJCQkJaWYgKDAgPT0gcmV0KQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCWJyZWFrOworCQkJfQorCQkJZm9yICg7IG47IG4tLSwgc3JjICs9ICgxIDw8IGJ0YS0+c2FtcGxlc2hpZnQpLCBkc3QrKykKKwkJCQlfX3B1dF91c2VyKCpzcmMsIGRzdCk7CisJCX0KKworCQlyZXQgICAgICs9IG5kc3Q7CisJCXN3Y291bnQgLT0gbmRzdDsKKwkJaHdjb3VudCAtPSBuc3JjOworCQlidGEtPnJlYWRfY291bnQgIC09IG5zcmM7CisJCWJ0YS0+cmVhZF9vZmZzZXQgKz0gbnNyYzsKKwkJaWYgKGJ0YS0+cmVhZF9vZmZzZXQgPT0gYnRhLT5idWZfc2l6ZSkKKwkJCWJ0YS0+cmVhZF9vZmZzZXQgPSAwOworCX0KKwl1cCgmYnRhLT5sb2NrKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmYnRhLT5yZWFkcSwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGJ0YXVkaW9fZHNwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLAorCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBidGF1ZGlvX2RzcF9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGJ0YXVkaW8gKmJ0YSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcywgaSwgcmV0LCB2YWwgPSAwOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCQorICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIE9TU19HRVRWRVJTSU9OOgorICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGJ0YS0+YW5hbG9nKSB7CisJCQlmb3IgKHMgPSAwOyBzIDwgMTY7IHMrKykKKwkJCQlpZiAodmFsIDw8IHMgPj0gSFdCQVNFX0FEKjQvMTUpCisJCQkJCWJyZWFrOworCQkJZm9yIChpID0gMTU7IGkgPj0gNTsgaS0tKQorCQkJCWlmICh2YWwgPDwgcyA8PSBIV0JBU0VfQUQqNC9pKQorCQkJCQlicmVhazsKKwkJCWJ0YS0+c2FtcGxlc2hpZnQgPSBzOworCQkJYnRhLT5kZWNpbWF0aW9uICA9IGk7CisJCQlpZiAoZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fREVCVUcgImJ0YXVkaW86IHJhdGU6IHJlcT0lZCAgIgorCQkJCSAgICAgICAiZGVjPSVkIHNoaWZ0PSVkIGh3cmF0ZT0lZCBzd3JhdGU9JWRcbiIsCisJCQkJICAgICAgIHZhbCxpLHMsKEhXQkFTRV9BRCo0L2kpLChIV0JBU0VfQUQqNC9pKT4+cyk7CisJCX0gZWxzZSB7CisJCQlidGEtPnNhbXBsZXNoaWZ0ID0gKGJ0YS0+Y2hhbm5lbHMgPT0gMikgPyAwIDogMTsKKwkJCWJ0YS0+ZGVjaW1hdGlvbiAgPSAwOworCQl9CisJCWlmIChidGEtPnJlY29yZGluZykgeworCQkJZG93bigmYnRhLT5sb2NrKTsKKwkJCXN0b3BfcmVjb3JkaW5nKGJ0YSk7CisJCQlzdGFydF9yZWNvcmRpbmcoYnRhKTsKKwkJCXVwKCZidGEtPmxvY2spOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCWlmIChidGEtPmFuYWxvZykgeworCQkJcmV0dXJuIHB1dF91c2VyKEhXQkFTRV9BRCo0L2J0YS0+ZGVjaW1hdGlvbj4+YnRhLT5zYW1wbGVzaGlmdCwgcCk7CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcHV0X3VzZXIoYnRhLT5yYXRlLCBwKTsKKwkJfQorCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmICghYnRhLT5hbmFsb2cpIHsKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnRhLT5jaGFubmVscyAgICA9ICh2YWwgPiAwKSA/IDIgOiAxOworCQkJYnRhLT5zYW1wbGVzaGlmdCA9IChidGEtPmNoYW5uZWxzID09IDIpID8gMCA6IDE7CisJCQlpZiAoZGVidWcpCisJCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAgICAiYnRhdWRpbzogc3RlcmVvPSVkIGNoYW5uZWxzPSVkXG4iLAorCQkJCSAgICAgICB2YWwsYnRhLT5jaGFubmVscyk7CisJCX0gZWxzZSB7CisJCQlpZiAodmFsID09IDEpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQllbHNlIHsKKwkJCQlidGEtPmNoYW5uZWxzID0gMTsKKwkJCQlpZiAoZGVidWcpCisJCQkJCXByaW50ayhLRVJOX0lORk8KKwkJCQkJICAgICAgICJidGF1ZGlvOiBzdGVyZW89MCBjaGFubmVscz0xXG4iKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKGJ0YS0+Y2hhbm5lbHMpLTEsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKwkJaWYgKCFidGEtPmFuYWxvZykgeworCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlidGEtPmNoYW5uZWxzICAgID0gKHZhbCA+IDEpID8gMiA6IDE7CisJCQlidGEtPnNhbXBsZXNoaWZ0ID0gKGJ0YS0+Y2hhbm5lbHMgPT0gMikgPyAwIDogMTsKKwkJCWlmIChkZWJ1ZykKKwkJCQlwcmludGsoS0VSTl9ERUJVRworCQkJCSAgICAgICAiYnRhdWRpbzogdmFsPSVkIGNoYW5uZWxzPSVkXG4iLAorCQkJCSAgICAgICB2YWwsYnRhLT5jaGFubmVscyk7CisJCX0KKwkJLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcihidGEtPmNoYW5uZWxzLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworCQlpZiAoYnRhLT5hbmFsb2cpCisJCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9TOCwgcCk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWlmIChidGEtPmFuYWxvZykKKwkJCQlidGEtPmJpdHMgPSAodmFsID09IEFGTVRfUzgpID8gOCA6IDE2OworCQkJZWxzZQorCQkJCWJ0YS0+Yml0cyA9IDE2OworCQkJaWYgKGJ0YS0+cmVjb3JkaW5nKSB7CisJCQkJZG93bigmYnRhLT5sb2NrKTsKKwkJCQlzdG9wX3JlY29yZGluZyhidGEpOworCQkJCXN0YXJ0X3JlY29yZGluZyhidGEpOworCQkJCXVwKCZidGEtPmxvY2spOworCQkJfQorCQl9CisJCWlmIChkZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICJidGF1ZGlvOiBmbXQ6IGJpdHM9JWRcbiIsYnRhLT5iaXRzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoKGJ0YS0+Yml0cz09MTYpID8gQUZNVF9TMTZfTEUgOiBBRk1UX1M4LAorCQkJCXApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlyZXR1cm4gcHV0X3VzZXIoYnRhLT5iaXRzLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisgICAgICAgICAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJaWYgKGJ0YS0+cmVjb3JkaW5nKSB7CisJCQlkb3duKCZidGEtPmxvY2spOworCQkJc3RvcF9yZWNvcmRpbmcoYnRhKTsKKwkJCXVwKCZidGEtPmxvY2spOworCQl9CisJCXJldHVybiAwOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKCFidGEtPnJlY29yZGluZykgeworCQkJaWYgKDAgIT0gKHJldCA9IGFsbG9jX2J1ZmZlcihidGEpKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKDAgIT0gKHJldCA9IG1ha2VfcmlzYyhidGEpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiBwdXRfdXNlcihidGEtPmJsb2NrX2J5dGVzPj5idGEtPnNhbXBsZXNoaWZ0LHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQkvKiBOT1AgKi8KKwkJcmV0dXJuIDA7CisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwl7CisJCWF1ZGlvX2J1Zl9pbmZvIGluZm87CisJCWlmICghYnRhLT5yZWNvcmRpbmcpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaW5mby5mcmFnc2l6ZSA9IGJ0YS0+YmxvY2tfYnl0ZXM+PmJ0YS0+c2FtcGxlc2hpZnQ7CisJCWluZm8uZnJhZ3N0b3RhbCA9IGJ0YS0+YmxvY2tfY291bnQ7CisJCWluZm8uYnl0ZXMgPSBidGEtPnJlYWRfY291bnQ7CisJCWluZm8uZnJhZ21lbnRzID0gaW5mby5ieXRlcyAvIGluZm8uZnJhZ3NpemU7CisJCWlmIChkZWJ1ZykKKwkJCXByaW50ayhLRVJOX0RFQlVHICJidGF1ZGlvOiBTTkRDVExfRFNQX0dFVElTUEFDRSAiCisJCQkgICAgICAgInJldHVybnMgJWQvJWQvJWQvJWRcbiIsCisJCQkgICAgICAgaW5mby5mcmFnc2l6ZSwgaW5mby5mcmFnc3RvdGFsLAorCQkJICAgICAgIGluZm8uYnl0ZXMsIGluZm8uZnJhZ21lbnRzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisjaWYgMCAvKiBUT0RPICovCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorI2VuZGlmCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGJ0YXVkaW9fZHNwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCXBvbGxfd2FpdChmaWxlLCAmYnRhLT5yZWFkcSwgd2FpdCk7CisKKwlpZiAoMCAhPSBidGEtPnJlYWRfY291bnQpCisJCW1hc2sgfD0gKFBPTExJTiB8IFBPTExSRE5PUk0pOworCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ0YXVkaW9fZGlnaXRhbF9kc3BfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLm9wZW4JCT0gYnRhdWRpb19kc3Bfb3Blbl9kaWdpdGFsLAorCS5yZWxlYXNlCT0gYnRhdWRpb19kc3BfcmVsZWFzZSwKKwkucmVhZAkJPSBidGF1ZGlvX2RzcF9yZWFkLAorCS53cml0ZQkJPSBidGF1ZGlvX2RzcF93cml0ZSwKKwkuaW9jdGwJCT0gYnRhdWRpb19kc3BfaW9jdGwsCisJLnBvbGwJCT0gYnRhdWRpb19kc3BfcG9sbCwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGJ0YXVkaW9fYW5hbG9nX2RzcF9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkub3BlbgkJPSBidGF1ZGlvX2RzcF9vcGVuX2FuYWxvZywKKwkucmVsZWFzZQk9IGJ0YXVkaW9fZHNwX3JlbGVhc2UsCisJLnJlYWQJCT0gYnRhdWRpb19kc3BfcmVhZCwKKwkud3JpdGUJCT0gYnRhdWRpb19kc3Bfd3JpdGUsCisJLmlvY3RsCQk9IGJ0YXVkaW9fZHNwX2lvY3RsLAorCS5wb2xsCQk9IGJ0YXVkaW9fZHNwX3BvbGwsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY2hhciAqaXJxX25hbWVbXSA9IHsgIiIsICIiLCAiIiwgIk9GTE9XIiwgIiIsICIiLCAiIiwgIiIsICIiLCAiIiwgIiIsCisJCQkgICAgIlJJU0NJIiwgIkZCVVMiLCAiRlRSR1QiLCAiRkRTUiIsICJQUEVSUiIsCisJCQkgICAgIlJJUEVSUiIsICJQQUJPUlQiLCAiT0NFUlIiLCAiU0NFUlIiIH07CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBidGF1ZGlvX2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogcmVncykKK3sKKwlpbnQgY291bnQgPSAwOworCXUzMiBzdGF0LGFzdGF0OworCXN0cnVjdCBidGF1ZGlvICpidGEgPSBkZXZfaWQ7CisJaW50IGhhbmRsZWQgPSAwOworCisJZm9yICg7OykgeworCQljb3VudCsrOworCQlzdGF0ICA9IGJ0cmVhZChSRUdfSU5UX1NUQVQpOworCQlhc3RhdCA9IHN0YXQgJiBidHJlYWQoUkVHX0lOVF9NQVNLKTsKKwkJaWYgKCFhc3RhdCkKKwkJCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworCQloYW5kbGVkID0gMTsKKwkJYnR3cml0ZShhc3RhdCxSRUdfSU5UX1NUQVQpOworCisJCWlmIChpcnFfZGVidWcpIHsKKwkJCWludCBpOworCQkJcHJpbnRrKEtFUk5fREVCVUcgImJ0YXVkaW86IGlycSBsb29wPSVkIHJpc2M9JXgsIGJpdHM6IiwKKwkJCSAgICAgICBjb3VudCwgc3RhdD4+MjgpOworCQkJZm9yIChpID0gMDsgaSA8IChzaXplb2YoaXJxX25hbWUpL3NpemVvZihjaGFyKikpOyBpKyspIHsKKwkJCQlpZiAoc3RhdCAmICgxIDw8IGkpKQorCQkJCQlwcmludGsoIiAlcyIsaXJxX25hbWVbaV0pOworCQkJCWlmIChhc3RhdCAmICgxIDw8IGkpKQorCQkJCQlwcmludGsoIioiKTsKKwkJCX0KKwkJCXByaW50aygiXG4iKTsKKwkJfQorCQlpZiAoc3RhdCAmIElSUV9SSVNDSSkgeworCQkJaW50IGJsb2NrczsKKwkJCWJsb2NrcyA9IChzdGF0ID4+IDI4KSAtIGJ0YS0+ZG1hX2Jsb2NrOworCQkJaWYgKGJsb2NrcyA8IDApCisJCQkJYmxvY2tzICs9IGJ0YS0+YmxvY2tfY291bnQ7CisJCQlidGEtPmRtYV9ibG9jayA9IHN0YXQgPj4gMjg7CisJCQlpZiAoYnRhLT5yZWFkX2NvdW50ICsgMipidGEtPmJsb2NrX2J5dGVzID4gYnRhLT5idWZfc2l6ZSkgeworCQkJCXN0b3BfcmVjb3JkaW5nKGJ0YSk7CisJCQkJcHJpbnRrKEtFUk5fSU5GTyAiYnRhdWRpbzogYnVmZmVyIG92ZXJydW5cbiIpOworCQkJfQorCQkJaWYgKGJsb2NrcyA+IDApIHsKKwkJCQlidGEtPnJlYWRfY291bnQgKz0gYmxvY2tzICogYnRhLT5ibG9ja19ieXRlczsKKwkJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmJ0YS0+cmVhZHEpOworCQkJfQorCQl9CisJCWlmIChjb3VudCA+IDEwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImJ0YXVkaW86IE9vcHMgLSBpcnEgbWFzayBjbGVhcmVkXG4iKTsKKwkJCWJ0d3JpdGUoMCwgUkVHX0lOVF9NQVNLKTsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX05PTkU7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHNwMSA9IC0xOworc3RhdGljIHVuc2lnbmVkIGludCBkc3AyID0gLTE7CitzdGF0aWMgdW5zaWduZWQgaW50IG1peGVyID0gLTE7CitzdGF0aWMgaW50IGxhdGVuY3kgPSAtMTsKK3N0YXRpYyBpbnQgZGlnaXRhbCA9IDE7CitzdGF0aWMgaW50IGFuYWxvZyA9IDE7CitzdGF0aWMgaW50IHJhdGU7CisKKyNkZWZpbmUgQlRBX09TUFJFWTIwMCAxCisKK3N0YXRpYyBzdHJ1Y3QgY2FyZGluZm8gY2FyZHNbXSA9IHsKKwlbMF0gPSB7CisJCS5uYW1lCT0gImRlZmF1bHQiLAorCQkucmF0ZQk9IDMyMDAwLAorCX0sCisJW0JUQV9PU1BSRVkyMDBdID0geworCQkubmFtZQk9ICJPc3ByZXkgMjAwIiwKKwkJLnJhdGUJPSA0NDEwMCwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2RldmluaXQgYnRhdWRpb19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwKKwkJCQkgICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworCXN0cnVjdCBidGF1ZGlvICpidGE7CisJc3RydWN0IGNhcmRpbmZvICpjYXJkID0gJmNhcmRzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdOworCXVuc2lnbmVkIGNoYXIgcmV2aXNpb24sbGF0OworCWludCByYyA9IC1FQlVTWTsKKworCWlmIChwY2lfZW5hYmxlX2RldmljZShwY2lfZGV2KSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCksCisJCQkJcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LDApLAorCQkJCSJidGF1ZGlvIikpIHsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlidGEgPSBrbWFsbG9jKHNpemVvZigqYnRhKSxHRlBfQVRPTUlDKTsKKwlpZiAoIWJ0YSkgeworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZmFpbDA7CisJfQorCW1lbXNldChidGEsMCxzaXplb2YoKmJ0YSkpOworCisJYnRhLT5wY2kgID0gcGNpX2RldjsKKwlidGEtPmlycSAgPSBwY2lfZGV2LT5pcnE7CisJYnRhLT5tZW0gID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCk7CisJYnRhLT5tbWlvID0gaW9yZW1hcChwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwwKSwKKwkJCSAgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsMCkpOworCisJYnRhLT5zb3VyY2UgICAgID0gMTsKKwlidGEtPmJpdHMgICAgICAgPSA4OworCWJ0YS0+Y2hhbm5lbHMgICA9IDE7CisJaWYgKGJ0YS0+YW5hbG9nKSB7CisJCWJ0YS0+ZGVjaW1hdGlvbiAgPSAxNTsKKwl9IGVsc2UgeworCQlidGEtPmRlY2ltYXRpb24gID0gMDsKKwkJYnRhLT5zYW1wbGVzaGlmdCA9IDE7CisJfQorCisJLyogc2FtcGxlIHJhdGUgKi8KKwlidGEtPnJhdGUgPSBjYXJkLT5yYXRlOworCWlmIChyYXRlKQorCQlidGEtPnJhdGUgPSByYXRlOworCQorCWluaXRfTVVURVgoJmJ0YS0+bG9jayk7CisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmJ0YS0+cmVhZHEpOworCisJaWYgKC0xICE9IGxhdGVuY3kpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnRhdWRpbzogc2V0dGluZyBwY2kgbGF0ZW5jeSB0aW1lciB0byAlZFxuIiwKKwkJICAgICAgIGxhdGVuY3kpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0xBVEVOQ1lfVElNRVIsIGxhdGVuY3kpOworCX0KKyAgICAgICAgcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgUENJX0NMQVNTX1JFVklTSU9OLCAmcmV2aXNpb24pOworICAgICAgICBwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCBQQ0lfTEFURU5DWV9USU1FUiwgJmxhdCk7CisgICAgICAgIHByaW50ayhLRVJOX0lORk8gImJ0YXVkaW86IEJ0JXggKHJldiAlZCkgYXQgJTAyeDolMDJ4LiV4LCAiLAorCSAgICAgICBwY2lfZGV2LT5kZXZpY2UscmV2aXNpb24scGNpX2Rldi0+YnVzLT5udW1iZXIsCisJICAgICAgIFBDSV9TTE9UKHBjaV9kZXYtPmRldmZuKSxQQ0lfRlVOQyhwY2lfZGV2LT5kZXZmbikpOworICAgICAgICBwcmludGsoImlycTogJWQsIGxhdGVuY3k6ICVkLCBtbWlvOiAweCVseFxuIiwKKwkgICAgICAgYnRhLT5pcnEsIGxhdCwgYnRhLT5tZW0pOworCXByaW50aygiYnRhdWRpbzogdXNpbmcgY2FyZCBjb25maWcgXCIlc1wiXG4iLCBjYXJkLT5uYW1lKTsKKworCS8qIGluaXQgaHcgKi8KKyAgICAgICAgYnR3cml0ZSgwLCBSRUdfR1BJT19ETUFfQ1RMKTsKKyAgICAgICAgYnR3cml0ZSgwLCBSRUdfSU5UX01BU0spOworICAgICAgICBidHdyaXRlKH4wVSwgUkVHX0lOVF9TVEFUKTsKKwlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKworCWlmICgocmMgPSByZXF1ZXN0X2lycShidGEtPmlycSwgYnRhdWRpb19pcnEsIFNBX1NISVJRfFNBX0lOVEVSUlVQVCwKKwkJCSAgICAgICJidGF1ZGlvIiwodm9pZCAqKWJ0YSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCSAgICAgICAiYnRhdWRpbzogY2FuJ3QgcmVxdWVzdCBpcnEgKHJjPSVkKVxuIixyYyk7CisJCWdvdG8gZmFpbDE7CisJfQorCisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCWlmIChkaWdpdGFsKSB7CisJCXJjID0gYnRhLT5kc3BfZGlnaXRhbCA9CisJCQlyZWdpc3Rlcl9zb3VuZF9kc3AoJmJ0YXVkaW9fZGlnaXRhbF9kc3BfZm9wcyxkc3AxKTsKKwkJaWYgKHJjIDwgMCkgeworCQkJcHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAgICJidGF1ZGlvOiBjYW4ndCByZWdpc3RlciBkaWdpdGFsIGRzcCAocmM9JWQpXG4iLHJjKTsKKwkJCWdvdG8gZmFpbDI7CisJCX0KKwkJcHJpbnRrKEtFUk5fSU5GTyAiYnRhdWRpbzogcmVnaXN0ZXJlZCBkZXZpY2UgZHNwJWQgW2RpZ2l0YWxdXG4iLAorCQkgICAgICAgYnRhLT5kc3BfZGlnaXRhbCA+PiA0KTsKKwl9CisJaWYgKGFuYWxvZykgeworCQlyYyA9IGJ0YS0+ZHNwX2FuYWxvZyA9CisJCQlyZWdpc3Rlcl9zb3VuZF9kc3AoJmJ0YXVkaW9fYW5hbG9nX2RzcF9mb3BzLGRzcDIpOworCQlpZiAocmMgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICAgImJ0YXVkaW86IGNhbid0IHJlZ2lzdGVyIGFuYWxvZyBkc3AgKHJjPSVkKVxuIixyYyk7CisJCQlnb3RvIGZhaWwzOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gImJ0YXVkaW86IHJlZ2lzdGVyZWQgZGV2aWNlIGRzcCVkIFthbmFsb2ddXG4iLAorCQkgICAgICAgYnRhLT5kc3BfYW5hbG9nID4+IDQpOworCQlyYyA9IGJ0YS0+bWl4ZXJfZGV2ID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmJ0YXVkaW9fbWl4ZXJfZm9wcyxtaXhlcik7CisJCWlmIChyYyA8IDApIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJCSAgICAgICAiYnRhdWRpbzogY2FuJ3QgcmVnaXN0ZXIgbWl4ZXIgKHJjPSVkKVxuIixyYyk7CisJCQlnb3RvIGZhaWw0OworCQl9CisJCXByaW50ayhLRVJOX0lORk8gImJ0YXVkaW86IHJlZ2lzdGVyZWQgZGV2aWNlIG1peGVyJWRcbiIsCisJCSAgICAgICBidGEtPm1peGVyX2RldiA+PiA0KTsKKwl9CisKKwkvKiBob29rIGludG8gbGlua2VkIGxpc3QgKi8KKwlidGEtPm5leHQgPSBidGF1ZGlvczsKKwlidGF1ZGlvcyA9IGJ0YTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LGJ0YSk7CisgICAgICAgIHJldHVybiAwOworCisgZmFpbDQ6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoYnRhLT5kc3BfYW5hbG9nKTsKKyBmYWlsMzoKKwlpZiAoZGlnaXRhbCkKKwkJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoYnRhLT5kc3BfZGlnaXRhbCk7CisgZmFpbDI6CisgICAgICAgIGZyZWVfaXJxKGJ0YS0+aXJxLGJ0YSk7CQorIGZhaWwxOgorCWtmcmVlKGJ0YSk7CisgZmFpbDA6CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LDApLAorCQkJICAgcGNpX3Jlc291cmNlX2xlbihwY2lfZGV2LDApKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBidGF1ZGlvX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgYnRhdWRpbyAqYnRhID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCXN0cnVjdCBidGF1ZGlvICp3YWxrOworCisJLyogdHVybiBvZmYgYWxsIERNQSAvIElSUXMgKi8KKyAgICAgICAgYnRhbmQofjE1LCBSRUdfR1BJT19ETUFfQ1RMKTsKKyAgICAgICAgYnR3cml0ZSgwLCBSRUdfSU5UX01BU0spOworICAgICAgICBidHdyaXRlKH4wVSwgUkVHX0lOVF9TVEFUKTsKKworCS8qIHVucmVnaXN0ZXIgZGV2aWNlcyAqLworCWlmIChkaWdpdGFsKSB7CisJCXVucmVnaXN0ZXJfc291bmRfZHNwKGJ0YS0+ZHNwX2RpZ2l0YWwpOworCX0KKwlpZiAoYW5hbG9nKSB7CisJCXVucmVnaXN0ZXJfc291bmRfZHNwKGJ0YS0+ZHNwX2FuYWxvZyk7CisJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoYnRhLT5taXhlcl9kZXYpOworCX0KKworCS8qIGZyZWUgcmVzb3VyY2VzICovCisJZnJlZV9idWZmZXIoYnRhKTsKKyAgICAgICAgZnJlZV9pcnEoYnRhLT5pcnEsYnRhKTsKKwlyZWxlYXNlX21lbV9yZWdpb24ocGNpX3Jlc291cmNlX3N0YXJ0KHBjaV9kZXYsMCksCisJCQkgICBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsMCkpOworCisJLyogcmVtb3ZlIGZyb20gbGlua2VkIGxpc3QgKi8KKwlpZiAoYnRhID09IGJ0YXVkaW9zKSB7CisJCWJ0YXVkaW9zID0gTlVMTDsKKwl9IGVsc2UgeworCQlmb3IgKHdhbGsgPSBidGF1ZGlvczsgd2Fsay0+bmV4dCAhPSBidGE7IHdhbGsgPSB3YWxrLT5uZXh0KQorCQkJOyAvKiBpZiAoTlVMTCA9PSB3YWxrLT5uZXh0KSBCVUcoKTsgKi8KKwkJd2Fsay0+bmV4dCA9IGJ0YS0+bmV4dDsKKwl9CisKKwlwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgTlVMTCk7CisJa2ZyZWUoYnRhKTsKKwlyZXR1cm47Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBidGF1ZGlvX3BjaV90YmxbXSA9IHsKKyAgICAgICAgeworCQkudmVuZG9yCQk9IFBDSV9WRU5ET1JfSURfQlJPT0tUUkVFLAorCQkuZGV2aWNlCQk9IDB4MDg3OCwKKwkJLnN1YnZlbmRvcgk9IDB4MDA3MCwKKwkJLnN1YmRldmljZQk9IDB4ZmYwMSwKKwkJLmRyaXZlcl9kYXRhCT0gQlRBX09TUFJFWTIwMCwKKwl9LHsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0JST09LVFJFRSwKKwkJLmRldmljZQkJPSAweDA4NzgsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKwl9LHsKKwkJLnZlbmRvcgkJPSBQQ0lfVkVORE9SX0lEX0JST09LVFJFRSwKKwkJLmRldmljZQkJPSAweDA4NzgsCisJCS5zdWJ2ZW5kb3IJPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlCT0gUENJX0FOWV9JRCwKKyAgICAgICAgfSx7CisJCS8qIC0tLSBlbmQgb2YgbGlzdCAtLS0gKi8KKwl9Cit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYnRhdWRpb19wY2lfZHJpdmVyID0geworICAgICAgICAubmFtZQkJPSAiYnRhdWRpbyIsCisgICAgICAgIC5pZF90YWJsZQk9IGJ0YXVkaW9fcGNpX3RibCwKKyAgICAgICAgLnByb2JlCQk9IGJ0YXVkaW9fcHJvYmUsCisgICAgICAgIC5yZW1vdmUJCT0gIF9fZGV2ZXhpdF9wKGJ0YXVkaW9fcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgYnRhdWRpb19pbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImJ0YXVkaW86IGRyaXZlciB2ZXJzaW9uIDAuNyBsb2FkZWQgWyVzJXMlc11cbiIsCisJICAgICAgIGRpZ2l0YWwgPyAiZGlnaXRhbCIgOiAiIiwKKwkgICAgICAgYW5hbG9nICYmIGRpZ2l0YWwgPyAiKyIgOiAiIiwKKwkgICAgICAgYW5hbG9nID8gImFuYWxvZyIgOiAiIik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmYnRhdWRpb19wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgYnRhdWRpb19jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYnRhdWRpb19wY2lfZHJpdmVyKTsKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KGJ0YXVkaW9faW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoYnRhdWRpb19jbGVhbnVwX21vZHVsZSk7CisKK21vZHVsZV9wYXJhbShkc3AxLCBpbnQsIFNfSVJVR08pOworbW9kdWxlX3BhcmFtKGRzcDIsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0obWl4ZXIsIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0oZGVidWcsIGludCwgU19JUlVHTyB8IFNfSVdVU1IpOworbW9kdWxlX3BhcmFtKGlycV9kZWJ1ZywgaW50LCBTX0lSVUdPIHwgU19JV1VTUik7Cittb2R1bGVfcGFyYW0oZGlnaXRhbCwgaW50LCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbShhbmFsb2csIGludCwgU19JUlVHTyk7Cittb2R1bGVfcGFyYW0ocmF0ZSwgaW50LCBTX0lSVUdPKTsKK21vZHVsZV9wYXJhbShsYXRlbmN5LCBpbnQsIFNfSVJVR08pOworTU9EVUxFX1BBUk1fREVTQyhsYXRlbmN5LCJwY2kgbGF0ZW5jeSB0aW1lciIpOworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgYnRhdWRpb19wY2lfdGJsKTsKK01PRFVMRV9ERVNDUklQVElPTigiYnQ4NzggYXVkaW8gZG1hIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigiR2VyZCBLbm9yciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvKgorICogTG9jYWwgdmFyaWFibGVzOgorICogYy1iYXNpYy1vZmZzZXQ6IDgKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NtcGNpLmMgYi9zb3VuZC9vc3MvY21wY2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDcyMGU2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NtcGNpLmMKQEAgLTAsMCArMSwzMzc4IEBACisvKgorICogICAgICBjbXBjaS5jICAtLSAgQy1NZWRpYSBQQ0kgYXVkaW8gZHJpdmVyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk5ICBDLW1lZGlhIHN1cHBvcnQgKHN1cHBvcnRAY21lZGlhLmNvbS50dykKKyAqCisgKiAgICAgIEJhc2VkIG9uIHRoZSBQQ0kgZHJpdmVycyBieSBUaG9tYXMgU2FpbGVyIChzYWlsZXJAaWZlLmVlLmV0aHouY2gpCisgKgorICogCUZvciB1cGRhdGUsIHZpc2l0OgorICogCQlodHRwOi8vd3d3LmNtZWRpYS5jb20udHcKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gRGF2aWQgQy4gTmllbWksIEphbiBQZmVpZmVyCisgKgorICoKKyAqIE1vZHVsZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyczoKKyAqICAgbm9uZSBzbyBmYXIKKyAqCisgKgorICogIFN1cHBvcnRlZCBkZXZpY2VzOgorICogIC9kZXYvZHNwICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21peGVyICBzdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21pZGkgICBzaW1wbGUgTUlESSBVQVJUIGludGVyZmFjZSwgbm8gaW9jdGwKKyAqCisgKiAgVGhlIGNhcmQgaGFzIGJvdGggYW4gRk0gYW5kIGEgV2F2ZXRhYmxlIHN5bnRoLCBidXQgSSBoYXZlIHRvIGZpZ3VyZQorICogIG91dCBmaXJzdCBob3cgdG8gZHJpdmUgdGhlbS4uLgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAwNi4wNS45OCAgIDAuMSAgIEluaXRpYWwgcmVsZWFzZQorICogICAgMTAuMDUuOTggICAwLjIgICBGaXhlZCBtYW55IGJ1Z3MsIGVzcC4gQURDIHJhdGUgY2FsY3VsYXRpb24KKyAqICAgICAgICAgICAgICAgICAgICAgRmlyc3Qgc3RhYiBhdCBhIHNpbXBsZSBtaWRpIGludGVyZmFjZSAobm8gYmVsbHMmd2hpc3RsZXMpCisgKiAgICAxMy4wNS45OCAgIDAuMyAgIEZpeCBzdHVwaWQgY3V0JnBhc3RlIGVycm9yOiBzZXRfYWRjX3JhdGUgd2FzIGNhbGxlZCBpbnN0ZWFkIG9mCisgKiAgICAgICAgICAgICAgICAgICAgIHNldF9kYWNfcmF0ZSBpbiB0aGUgRk1PREVfV1JJVEUgY2FzZSBpbiBjbV9vcGVuCisgKiAgICAgICAgICAgICAgICAgICAgIEZpeCBod3B0ciBvdXQgb2YgYm91bmRzIChub3cgbXBnMTIzIHdvcmtzKQorICogICAgMTQuMDUuOTggICAwLjQgICBEb24ndCBhbGxvdyBleGNlc3NpdmUgaW50ZXJydXB0IHJhdGVzCisgKiAgICAwOC4wNi45OCAgIDAuNSAgIEZpcnN0IHJlbGVhc2UgdXNpbmcgQWxhbiBDb3gnIHNvdW5kY29yZSBpbnN0ZWFkIG9mIG1pc2NkZXZpY2UKKyAqICAgIDAzLjA4Ljk4ICAgMC42ICAgRG8gbm90IGluY2x1ZGUgbW9kdmVyc2lvbnMuaAorICogICAgICAgICAgICAgICAgICAgICBOb3cgbWl4ZXIgYmVoYXZpb3VyIGNhbiBiYXNpY2FsbHkgYmUgc2VsZWN0ZWQgYmV0d2VlbgorICogICAgICAgICAgICAgICAgICAgICAiT1NTIGRvY3VtZW50ZWQiIGFuZCAiT1NTIGFjdHVhbCIgYmVoYXZpb3VyCisgKiAgICAzMS4wOC45OCAgIDAuNyAgIEZpeCByZWFscGxheWVyIHByb2JsZW1zIC0gZGFjLmNvdW50IGlzc3VlcworICogICAgMTAuMTIuOTggICAwLjggICBGaXggZHJhaW5fZGFjIHRyeWluZyB0byB3YWl0IG9uIG5vdCB5ZXQgaW5pdGlhbGl6ZWQgRE1BCisgKiAgICAxNi4xMi45OCAgIDAuOSAgIEZpeCBhIGZldyBmX2ZpbGUgJiBGTU9ERV8gYnVncworICogICAgMDYuMDEuOTkgICAwLjEwICByZW1vdmUgdGhlIHNpbGx5IFNBX0lOVEVSUlVQVCBmbGFnLgorICogICAgICAgICAgICAgICAgICAgICBob3BlZnVsbHkga2lsbGVkIHRoZSBlZ2NzIHNlY3Rpb24gdHlwZSBjb25mbGljdAorICogICAgMTIuMDMuOTkgICAwLjExICBjaW5mby5ibG9ja3Mgc2hvdWxkIGJlIHJlc2V0IGFmdGVyIEdFVHhQVFIgaW9jdGwuCisgKiAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEpvaGFuIE1hZXMgPGpvbWFAdGVsaW5kdXMuYmU+CisgKiAgICAyMi4wMy45OSAgIDAuMTIgIHJldHVybiBFQUdBSU4gaW5zdGVhZCBvZiBFQlVTWSB3aGVuIE9fTk9OQkxPQ0sKKyAqICAgICAgICAgICAgICAgICAgICAgcmVhZC93cml0ZSBjYW5ub3QgYmUgZXhlY3V0ZWQKKyAqICAgIDE4LjA4Ljk5ICAgMS41ICAgT25seSBkZWFsbG9jYXRlIERNQSBidWZmZXIgd2hlbiB1bmxvYWRpbmcuCisgKiAgICAwMi4wOS45OSAgIDEuNiAgIEVuYWJsZSBTUERJRiBMT09QCisgKiAgICAgICAgICAgICAgICAgICAgIENoYW5nZSB0aGUgbWl4ZXIgcmVhZCBiYWNrCisgKiAgICAyMS4wOS45OSAgIDIuMzMgIFVzZSBSQ1MgdmVyc2lvbiBhcyBkcml2ZXIgdmVyc2lvbi4KKyAqICAgICAgICAgICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIG1vZGVtLCBTL1BESUYgbG9vcCBhbmQgNCBjaGFubmVscy4KKyAqICAgICAgICAgICAgICAgICAgICAgKDg3Mzggb25seSkKKyAqICAgICAgICAgICAgICAgICAgICAgRml4IGJ1ZyBjYXVzZSB4MTFhbXAgY2Fubm90IHBsYXkuCisgKgorICogICAgRml4ZXM6CisgKiAgICBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqICAgIDE4LzA1LzIwMDEgLSAuYnNzIG5pdHBpY2tzLCBmaXggYSBidWcgaW4gc2V0X2RhY19jaGFubmVscyB3aGVyZSBpdAorICogICAgCQkgICB3YXMgY2FsbGluZyBwcm9nX2RtYWJ1ZiB3aXRoIHMtPmxvY2sgaGVsZCwgY2FsbCBtaXNzaW5nCisgKiAgICAJCSAgIHVubG9ja19rZXJuZWwgaW4gY21fbWlkaV9yZWxlYXNlCisgKiAgICAwOC8xMC8yMDAxIC0gdXNlIHNldF9jdXJyZW50X3N0YXRlIGluIHNvbWUgbW9yZSBwbGFjZXMKKyAqCisgKglDYXJsb3MgRWR1YXJkbyBHb3JnZXMgPGNhcmxvc0B0ZWNobGludXguY29tLmJyPgorICoJRnJpIE1heSAyNSAyMDAxCisgKgktIFNNUCBzdXBwb3J0ICggc3Bpblt1bl1sb2NrKiByZXZpc2lvbiApCisgKgktIHNwZWFrZXIgbWl4ZXIgc3VwcG9ydAorICoJTW9uIEF1ZyAxMyAyMDAxCisgKgktIG9wdGltaXphdGlvbnMgYW5kIGNsZWFudXBzCisgKgorICogICAgMDMvMDEvMjAwMyAtIG9wZW5fbW9kZSBmaXhlcyBmcm9tIEdlb3JnIEFjaGVyIDxhY2hlckBpbi50dW0uZGU+CisgKglTaW1vbiBCcmF1bnNjaG1pZHQgPGJyYXNpbW9uQHdlYi5kZT4KKyAqICAgICBTYXQgSmFuIDMxIDIwMDQKKyAqCS0gcHJvdmlkZSBzdXBwb3J0IGZvciBvcGwzIEZNIGJ5IHJlbGVhc2luZyBJTyByYW5nZSBhZnRlciBpbml0aWFsaXphdGlvbgorICoKKyAqICAgIENoZW5MaSBUaWVuIDxjbHRpZW5AY21lZGlhLmNvbS50dz4KKyAqICAgIE1hciA5IDIwMDQKKyAqCS0gRml4IFMvUERJRiBvdXQgaWYgc3BkaWZfbG9vcCBlbmFibGVkCisgKgktIExvYWQgb3BsMyBkcml2ZXIgaWYgZW5hYmxlZCAoZm1pbyBpbiBwcm9wZXIgcmFuZ2UpCisgKgktIExvYWQgbXB1NDAxIGlmIGVuYWJsZWQgKG1wdWlvIGluIHByb3BlciByYW5nZSkKKyAqICAgIEFwciA1IDIwMDQKKyAqCS0gRml4IERVQUxfREFDIGRtYSBzeW5jaHJvbml6YXRpb24gYnVnCisgKgktIENoZWNrIGV4aXN0IEZNL01QVTQwMSBJL08gYmVmb3JlIGFjdGl2YXRlLgorICoJLSBBZGQgQUZUTV9TMTZfQkUgZm9ybWF0IHN1cHBvcnQsIHNvIE1QbGF5ZXIvWGluZSBjYW4gcGxheSBBQzMvbXV0bGljaGFubmVsCisgKgkgIG9uIE1hYworICoJLSBDaGFuZ2UgdG8gc3VwcG9ydCBrZXJuZWwgMi42IHNvIG9ubHkgc21hbGwgcGF0Y2ggbmVlZGVkCisgKgktIEFsbCBwYXJhbWV0ZXJzIGRlZmF1bHQgdG8gMAorICoJLSBBZGQgc3BkaWZfb3V0IHRvIHNlbmQgUENNIHRocm91Z2ggUy9QRElGIG91dCBqYWNrCisgKgktIEFkZCBod19jb3B5IHRvIGdldCA0LXNwYWtlciBvdXRwdXQgZm9yIGdlbmVyYWwgUENNL2FuYWxvZyBvdXRwdXQKKyAqCisgKiAgICBTdGVmYW4gVGhhdGVyIDxzdGVmYW4udGhhZXRlckBnbXguZGU+CisgKiAgICBBcHIgNSAyMDA0CisgKgktIEZpeCBtdXRlIHNpbmdsZSBjaGFubmVsIGZvciBDRC9MaW5lLWluL0FVWC1pbgorICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX01JREkKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJtcHU0MDEuaCIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT1VORF9DTVBDSV9GTQorI2luY2x1ZGUgIm9wbDMuaCIKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT1VORF9DTVBDSV9KT1lTVElDSworI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjdW5kZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisjdW5kZWYgRE1BQllURUlPCisjZGVmaW5lCURCRyh4KSB7fQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQ01fTUFHSUMgICgoUENJX1ZFTkRPUl9JRF9DTUVESUE8PDE2KXxQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTgzMzhBKQorCisvKiBDTTgzMzggcmVnaXN0ZXJzIGRlZmluaXRpb24gKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBDT0RFQ19DTUlfRlVOQ1RSTDAJCSgweDAwKQorI2RlZmluZSBDT0RFQ19DTUlfRlVOQ1RSTDEJCSgweDA0KQorI2RlZmluZSBDT0RFQ19DTUlfQ0hGT1JNQVQJCSgweDA4KQorI2RlZmluZSBDT0RFQ19DTUlfSU5UX0hMRENMUgkJKDB4MEMpCisjZGVmaW5lIENPREVDX0NNSV9JTlRfU1RBVFVTCQkoMHgxMCkKKyNkZWZpbmUgQ09ERUNfQ01JX0xFR0FDWV9DVFJMCQkoMHgxNCkKKyNkZWZpbmUgQ09ERUNfQ01JX01JU0NfQ1RSTAkJKDB4MTgpCisjZGVmaW5lIENPREVDX0NNSV9URE1BX1BPUwkJKDB4MUMpCisjZGVmaW5lIENPREVDX0NNSV9NSVhFUgkJCSgweDIwKQorI2RlZmluZSBDT0RFQ19TQjE2X0RBVEEJCQkoMHgyMikKKyNkZWZpbmUgQ09ERUNfU0IxNl9BRERSCQkJKDB4MjMpCisjZGVmaW5lIENPREVDX0NNSV9NSVhFUjEJCSgweDI0KQorI2RlZmluZSBDT0RFQ19DTUlfTUlYRVIyCQkoMHgyNSkKKyNkZWZpbmUgQ09ERUNfQ01JX0FVWF9WT0wJCSgweDI2KQorI2RlZmluZSBDT0RFQ19DTUlfTUlTQwkJCSgweDI3KQorI2RlZmluZSBDT0RFQ19DTUlfQUM5NwkJCSgweDI4KQorCisjZGVmaW5lIENPREVDX0NNSV9DSDBfRlJBTUUxCQkoMHg4MCkKKyNkZWZpbmUgQ09ERUNfQ01JX0NIMF9GUkFNRTIJCSgweDg0KQorI2RlZmluZSBDT0RFQ19DTUlfQ0gxX0ZSQU1FMQkJKDB4ODgpCisjZGVmaW5lIENPREVDX0NNSV9DSDFfRlJBTUUyCQkoMHg4QykKKworI2RlZmluZSBDT0RFQ19DTUlfU1BESUZfQ1RSTAkJKDB4OTApCisjZGVmaW5lIENPREVDX0NNSV9NSVNDX0NUUkwyCQkoMHg5MikKKworI2RlZmluZSBDT0RFQ19DTUlfRVhUX1JFRwkJKDB4RjApCisKKy8qICBNaXhlciByZWdpc3RlcnMgZm9yIFNCMTYgKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIERTUF9NSVhfREFUQVJFU0VUSURYCQkoKHVuc2lnbmVkIGNoYXIpKDB4MDApKQorCisjZGVmaW5lIERTUF9NSVhfTUFTVEVSVk9MSURYX0wJCSgodW5zaWduZWQgY2hhcikoMHgzMCkpCisjZGVmaW5lIERTUF9NSVhfTUFTVEVSVk9MSURYX1IJCSgodW5zaWduZWQgY2hhcikoMHgzMSkpCisjZGVmaW5lIERTUF9NSVhfVk9JQ0VWT0xJRFhfTAkJKCh1bnNpZ25lZCBjaGFyKSgweDMyKSkKKyNkZWZpbmUgRFNQX01JWF9WT0lDRVZPTElEWF9SCQkoKHVuc2lnbmVkIGNoYXIpKDB4MzMpKQorI2RlZmluZSBEU1BfTUlYX0ZNVk9MSURYX0wJCSgodW5zaWduZWQgY2hhcikoMHgzNCkpCisjZGVmaW5lIERTUF9NSVhfRk1WT0xJRFhfUgkJKCh1bnNpZ25lZCBjaGFyKSgweDM1KSkKKyNkZWZpbmUgRFNQX01JWF9DRFZPTElEWF9MCQkoKHVuc2lnbmVkIGNoYXIpKDB4MzYpKQorI2RlZmluZSBEU1BfTUlYX0NEVk9MSURYX1IJCSgodW5zaWduZWQgY2hhcikoMHgzNykpCisjZGVmaW5lIERTUF9NSVhfTElORVZPTElEWF9MCQkoKHVuc2lnbmVkIGNoYXIpKDB4MzgpKQorI2RlZmluZSBEU1BfTUlYX0xJTkVWT0xJRFhfUgkJKCh1bnNpZ25lZCBjaGFyKSgweDM5KSkKKworI2RlZmluZSBEU1BfTUlYX01JQ1ZPTElEWAkJKCh1bnNpZ25lZCBjaGFyKSgweDNBKSkKKyNkZWZpbmUgRFNQX01JWF9TUEtSVk9MSURYCQkoKHVuc2lnbmVkIGNoYXIpKDB4M0IpKQorCisjZGVmaW5lIERTUF9NSVhfT1VUTUlYSURYCQkoKHVuc2lnbmVkIGNoYXIpKDB4M0MpKQorCisjZGVmaW5lIERTUF9NSVhfQURDTUlYSURYX0wJCSgodW5zaWduZWQgY2hhcikoMHgzRCkpCisjZGVmaW5lIERTUF9NSVhfQURDTUlYSURYX1IJCSgodW5zaWduZWQgY2hhcikoMHgzRSkpCisKKyNkZWZpbmUgRFNQX01JWF9JTkdBSU5JRFhfTAkJKCh1bnNpZ25lZCBjaGFyKSgweDNGKSkKKyNkZWZpbmUgRFNQX01JWF9JTkdBSU5JRFhfUgkJKCh1bnNpZ25lZCBjaGFyKSgweDQwKSkKKyNkZWZpbmUgRFNQX01JWF9PVVRHQUlOSURYX0wJCSgodW5zaWduZWQgY2hhcikoMHg0MSkpCisjZGVmaW5lIERTUF9NSVhfT1VUR0FJTklEWF9SCQkoKHVuc2lnbmVkIGNoYXIpKDB4NDIpKQorCisjZGVmaW5lIERTUF9NSVhfQUdDSURYCQkJKCh1bnNpZ25lZCBjaGFyKSgweDQzKSkKKworI2RlZmluZSBEU1BfTUlYX1RSRUJMRUlEWF9MCQkoKHVuc2lnbmVkIGNoYXIpKDB4NDQpKQorI2RlZmluZSBEU1BfTUlYX1RSRUJMRUlEWF9SCQkoKHVuc2lnbmVkIGNoYXIpKDB4NDUpKQorI2RlZmluZSBEU1BfTUlYX0JBU1NJRFhfTAkJKCh1bnNpZ25lZCBjaGFyKSgweDQ2KSkKKyNkZWZpbmUgRFNQX01JWF9CQVNTSURYX1IJCSgodW5zaWduZWQgY2hhcikoMHg0NykpCisjZGVmaW5lIERTUF9NSVhfRVhURU5TSU9OCQkoKHVuc2lnbmVkIGNoYXIpKDB4ZjApKQorLy8gcHNldWRvIHJlZ2lzdGVyIGZvciBBVVgKKyNkZWZpbmUJRFNQX01JWF9BVVhWT0xfTAkJKCh1bnNpZ25lZCBjaGFyKSgweDUwKSkKKyNkZWZpbmUJRFNQX01JWF9BVVhWT0xfUgkJKCh1bnNpZ25lZCBjaGFyKSgweDUxKSkKKworLy8gSS9PIGxlbmd0aAorI2RlZmluZSBDTV9FWFRFTlRfQ09ERUMJICAweDEwMAorI2RlZmluZSBDTV9FWFRFTlRfTUlESQkgIDB4MgorI2RlZmluZSBDTV9FWFRFTlRfU1lOVEgJICAweDQKKyNkZWZpbmUgQ01fRVhURU5UX0dBTUUJICAweDgKKworLy8gRnVuY3Rpb24gQ29udHJvbCBSZWdpc3RlciAwICgwMGgpCisjZGVmaW5lIENIQURDMCAgICAJMHgwMQorI2RlZmluZSBDSEFEQzEgICAgCTB4MDIKKyNkZWZpbmUgUEFVU0UwCSAgCTB4MDQKKyNkZWZpbmUgUEFVU0UxCSAgCTB4MDgKKworLy8gRnVuY3Rpb24gQ29udHJvbCBSZWdpc3RlciAwKzIgKDAyaCkKKyNkZWZpbmUgQ0hFTjAgICAgIAkweDAxCisjZGVmaW5lIENIRU4xICAgICAJMHgwMgorI2RlZmluZSBSU1RfQ0gwCSAgCTB4MDQKKyNkZWZpbmUgUlNUX0NIMQkgIAkweDA4CisKKy8vIEZ1bmN0aW9uIENvbnRyb2wgUmVnaXN0ZXIgMSAoMDRoKQorI2RlZmluZSBKWVNUS19FTgkweDAyCisjZGVmaW5lIFVBUlRfRU4JCTB4MDQKKyNkZWZpbmUJU1BETzJEQUMJMHg0MAorI2RlZmluZQlTUERGTE9PUAkweDgwCisKKy8vIEZ1bmN0aW9uIENvbnRyb2wgUmVnaXN0ZXIgMSsxICgwNWgpCisjZGVmaW5lCVNQREZfMAkJMHgwMQorI2RlZmluZQlTUERGXzEJCTB4MDIKKyNkZWZpbmUJQVNGQwkJMHgxYworI2RlZmluZQlEU0ZDCQkweGUwCisjZGVmaW5lCVNQRElGMkRBQwkoU1BERl8xIDw8IDggfCBTUERPMkRBQykKKworLy8gQ2hhbm5lbCBGb3JtYXQgUmVnaXN0ZXIgKDA4aCkKKyNkZWZpbmUgQ01fQ0ZNVF9TVEVSRU8JMHgwMQorI2RlZmluZSBDTV9DRk1UXzE2QklUCTB4MDIKKyNkZWZpbmUgQ01fQ0ZNVF9NQVNLCTB4MDMKKyNkZWZpbmUJUE9MVkFMSUQJMHgyMAorI2RlZmluZQlJTlZTUERJRkkJMHg4MAorCisvLyBDaGFubmVsIEZvcm1hdCBSZWdpc3RlcisyICgwYWgpCisjZGVmaW5lIFNQRDI0U0VMCTB4MjAKKworLy8gQ2hhbm5lbCBGb3JtYXQgUmVnaXN0ZXIrMyAoMGJoKQorI2RlZmluZSBDSEIzRAkJMHgyMAorI2RlZmluZSBDSEIzRDVDCQkweDgwCisKKy8vIEludGVycnVwdCBIb2xkL0NsZWFyIFJlZ2lzdGVyKzIgKDBlaCkKKyNkZWZpbmUJQ0gwX0lOVF9FTgkweDAxCisjZGVmaW5lCUNIMV9JTlRfRU4JMHgwMgorCisvLyBJbnRlcnJ1cHQgUmVnaXN0ZXIgKDEwaCkKKyNkZWZpbmUgQ0hJTlQwCQkweDAxCisjZGVmaW5lIENISU5UMQkJMHgwMgorI2RlZmluZQlDSDBCVVNZCQkweDA0CisjZGVmaW5lCUNIMUJVU1kJCTB4MDgKKworLy8gTGVnYWN5IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyKzEgKDE1aCkKKyNkZWZpbmUJRVhCQVNFTgkJMHgxMAorI2RlZmluZQlCQVNFMkxJTgkweDIwCisjZGVmaW5lCUNFTlRSMkxJTgkweDQwCisjZGVmaW5lCUNCMkxJTgkJKEJBU0UyTElOIHwgQ0VOVFIyTElOKQorI2RlZmluZQlDSEIzRDZDCQkweDgwCisKKy8vIExlZ2FjeSBDb250cm9sL1N0YXR1cyBSZWdpc3RlcisyICgxNmgpCisjZGVmaW5lCURBQzJTUERPCTB4MjAKKyNkZWZpbmUJU1BEQ09QWVJIVAkweDQwCisjZGVmaW5lCUVOU1BET1VUCTB4ODAKKworLy8gTGVnYWN5IENvbnRyb2wvU3RhdHVzIFJlZ2lzdGVyKzMgKDE3aCkKKyNkZWZpbmUJRk1TRUwJCTB4MDMKKyNkZWZpbmUJVlNCU0VMCQkweDBjCisjZGVmaW5lCVZNUFUJCTB4NjAKKyNkZWZpbmUJTlhDSEcJCTB4ODAKKworLy8gTWlzY2VsbGFuZW91cyBDb250cm9sIFJlZ2lzdGVyICgxOGgpCisjZGVmaW5lCVJFQVIyTElOCTB4MjAKKyNkZWZpbmUJTVVURUNIMQkJMHg0MAorI2RlZmluZQlFTkNFTlRFUgkweDgwCisKKy8vIE1pc2NlbGxhbmVvdXMgQ29udHJvbCBSZWdpc3RlcisxICgxOWgpCisjZGVmaW5lCVNFTFNQRElGSTIJMHgwMQorI2RlZmluZQlTUERGX0FDOTcJMHg4MAorCisvLyBNaXNjZWxsYW5lb3VzIENvbnRyb2wgUmVnaXN0ZXIrMiAoMWFoKQorI2RlZmluZQlBQzNfRU4JCTB4MDQKKyNkZWZpbmUJRk1fRU4JCTB4MDgKKyNkZWZpbmUJU1BEMzJTRUwJMHgyMAorI2RlZmluZQlYQ0hHREFDCQkweDQwCisjZGVmaW5lCUVOREJEQUMJCTB4ODAKKworLy8gTWlzY2VsbGFuZW91cyBDb250cm9sIFJlZ2lzdGVyKzMgKDFiaCkKKyNkZWZpbmUJU1BESUZJNDhLCTB4MDEKKyNkZWZpbmUJU1BETzVWCQkweDAyCisjZGVmaW5lCU40U1BLM0QJCTB4MDQKKyNkZWZpbmUJUkVTRVQJCTB4NDAKKyNkZWZpbmUJUFdECQkweDgwCisjZGVmaW5lCVNQRElGNDhLCShTUERJRkk0OEsgPDwgMjQgfCBTUERGX0FDOTcgPDwgOCkKKworLy8gTWl4ZXIxICgyNGgpCisjZGVmaW5lCUNEUExBWQkJMHgwMQorI2RlZmluZQlYM0RFTgkJMHgwMgorI2RlZmluZQlSRUFSMkZST05UCTB4MTAKKyNkZWZpbmUJU1BLNAkJMHgyMAorI2RlZmluZQlXU01VVEUJCTB4NDAKKyNkZWZpbmUJRk1NVVRFCQkweDgwCisKKy8vIE1pc2NlbGxhbmVvdXMgUmVnaXN0ZXIgKDI3aCkKKyNkZWZpbmUJU1BEVkFMSUQJMHgwMgorI2RlZmluZQlDRU5UUjJNSUMJMHgwNAorCisvLyBNaXNjZWxsYW5lb3VzIFJlZ2lzdGVyMiAoOTJoKQorI2RlZmluZQlTUEQzMktGTVQJMHgxMAorCisjZGVmaW5lIENNX0NGTVRfREFDU0hJRlQgICAyCisjZGVmaW5lIENNX0NGTVRfQURDU0hJRlQgICAwCisjZGVmaW5lIENNX0ZSRVFfREFDU0hJRlQgICA1CisjZGVmaW5lIENNX0ZSRVFfQURDU0hJRlQgICAyCisjZGVmaW5lCVJTVERBQwlSU1RfQ0gxCisjZGVmaW5lCVJTVEFEQwlSU1RfQ0gwCisjZGVmaW5lCUVOREFDCUNIRU4xCisjZGVmaW5lCUVOQURDCUNIRU4wCisjZGVmaW5lCVBBVVNFREFDCVBBVVNFMQorI2RlZmluZQlQQVVTRUFEQwlQQVVTRTAKKyNkZWZpbmUgQ09ERUNfQ01JX0FEQ19GUkFNRTEJQ09ERUNfQ01JX0NIMF9GUkFNRTEKKyNkZWZpbmUgQ09ERUNfQ01JX0FEQ19GUkFNRTIJQ09ERUNfQ01JX0NIMF9GUkFNRTIKKyNkZWZpbmUgQ09ERUNfQ01JX0RBQ19GUkFNRTEJQ09ERUNfQ01JX0NIMV9GUkFNRTEKKyNkZWZpbmUgQ09ERUNfQ01JX0RBQ19GUkFNRTIJQ09ERUNfQ01JX0NIMV9GUkFNRTIKKyNkZWZpbmUJREFDSU5UCUNISU5UMQorI2RlZmluZQlBRENJTlQJQ0hJTlQwCisjZGVmaW5lCURBQ0JVU1kJQ0gxQlVTWQorI2RlZmluZQlBRENCVVNZCUNIMEJVU1kKKyNkZWZpbmUJRU5EQUNJTlQJQ0gxX0lOVF9FTgorI2RlZmluZQlFTkFEQ0lOVAlDSDBfSU5UX0VOCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10JPSB7IDAsIDEsIDEsIDIgfTsKKworI2RlZmluZSBTTkRfREVWX0RTUDE2ICAgNQorCisjZGVmaW5lIE5SX0RFVklDRSAzCQkvKiBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzICovCisKKyNkZWZpbmUJc2V0X2RhYzFfcmF0ZQlzZXRfYWRjX3JhdGUKKyNkZWZpbmUJc2V0X2RhYzFfcmF0ZV91bmxvY2tlZAlzZXRfYWRjX3JhdGVfdW5sb2NrZWQKKyNkZWZpbmUJc3RvcF9kYWMxCXN0b3BfYWRjCisjZGVmaW5lCXN0b3BfZGFjMV91bmxvY2tlZAlzdG9wX2FkY191bmxvY2tlZAorI2RlZmluZQlnZXRfZG1hZGFjMQlnZXRfZG1hYWRjCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGV2aW5kZXggPSAwOworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RydWN0IGNtX3N0YXRlIHsKKwkvKiBtYWdpYyAqLworCXVuc2lnbmVkIGludCBtYWdpYzsKKworCS8qIGxpc3Qgb2YgY21lZGlhIGRldmljZXMgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGRldnM7CisKKwkvKiB0aGUgY29ycmVzcG9uZGluZyBwY2lfZGV2IHN0cnVjdHVyZSAqLworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisKKwlpbnQgZGV2X2F1ZGlvOwkJCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfbWl4ZXI7CisKKwl1bnNpZ25lZCBpbnQgaW9zYiwgaW9iYXNlLCBpb3N5bnRoLAorCQkJIGlvbWlkaSwgaW9nYW1lLCBpcnE7CS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXVuc2lnbmVkIHNob3J0IGRldmljZWlkOwkJLyogcGNpX2lkICovCisKKyAgICAgICAgc3RydWN0IHsJCQkJLyogbWl4ZXIgc3R1ZmYgKi8KKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kY250OworCQl1bnNpZ25lZCBzaG9ydCB2b2xbMTNdOworICAgICAgICB9IG1peDsKKworCXVuc2lnbmVkIGludCByYXRlYWRjLCByYXRlZGFjOwkJLyogd2F2ZSBzdHVmZiAqLworCXVuc2lnbmVkIGNoYXIgZm10LCBlbmFibGU7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwltb2RlX3Qgb3Blbl9tb2RlOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCXN0cnVjdCBkbWFidWYgeworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hYWRkcjsKKwkJdW5zaWduZWQgYnVmb3JkZXI7CisJCXVuc2lnbmVkIG51bWZyYWc7CisJCXVuc2lnbmVkIGZyYWdzaGlmdDsKKwkJdW5zaWduZWQgaHdwdHIsIHN3cHRyOworCQl1bnNpZ25lZCB0b3RhbF9ieXRlczsKKwkJaW50IGNvdW50OworCQl1bnNpZ25lZCBlcnJvcjsJCS8qIG92ZXIvdW5kZXJydW4gKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKworCQl1bnNpZ25lZCBmcmFnc2l6ZTsJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQl1bnNpZ25lZCBkbWFzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKwkJdW5zaWduZWQgZG1hc2FtcGxlczsKKworCQl1bnNpZ25lZCBtYXBwZWQ6MTsJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIHJlYWR5OjE7CisJCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKKwkJdW5zaWduZWQgZW5hYmxlZDoxOworCQl1bnNpZ25lZCBvc3NmcmFnc2hpZnQ7CisJCWludCBvc3NtYXhmcmFnczsKKwkJdW5zaWduZWQgc3ViZGl2aXNpb247CisJfSBkbWFfZGFjLCBkbWFfYWRjOworCisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX01JREkKKwlpbnQgbWlkaV9kZXZjOworCXN0cnVjdCBhZGRyZXNzX2luZm8gbXB1X2RhdGE7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU09VTkRfQ01QQ0lfSk9ZU1RJQ0sKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworI2VuZGlmCisKKwlpbnQJY2hpcF92ZXJzaW9uOworCWludAltYXhfY2hhbm5lbHM7CisJaW50CWN1cnJfY2hhbm5lbHM7CisJaW50CWNhcGFiaWxpdHk7CQkvKiBIVyBjYXBhYmlsaXR5LCB2YXJpb3VzIGZvciBjaGlwIHZlcnNpb25zICovCisKKwlpbnQJc3RhdHVzOwkJCS8qIEhXIG9yIFNXIHN0YXRlICovCisKKwlpbnQJc3BkaWZfY291bnRlcjsJCS8qIHNwZGlmIGZyYW1lIGNvdW50ZXIgKi8KK307CisKKy8qIGZsYWdzIHVzZWQgZm9yIGNhcGFiaWxpdHkgKi8KKyNkZWZpbmUJQ0FOX0FDM19IVwkJMHgwMDAwMDAwMQkJLyogMDM3IG9yIGxhdGVyICovCisjZGVmaW5lCUNBTl9BQzNfU1cJCTB4MDAwMDAwMDIJCS8qIDAzMyBvciBsYXRlciAqLworI2RlZmluZQlDQU5fQUMzCQkJKENBTl9BQzNfSFcgfCBDQU5fQUMzX1NXKQorI2RlZmluZSBDQU5fRFVBTF9EQUMJCTB4MDAwMDAwMDQJCS8qIDAzMyBvciBsYXRlciAqLworI2RlZmluZQlDQU5fTVVMVElfQ0hfSFcJCTB4MDAwMDAwMDgJCS8qIDAzOSBvciBsYXRlciAqLworI2RlZmluZQlDQU5fTVVMVElfQ0gJCShDQU5fTVVMVElfQ0hfSFcgfCBDQU5fRFVBTF9EQUMpCisjZGVmaW5lCUNBTl9MSU5FX0FTX1JFQVIJMHgwMDAwMDAxMAkJLyogMDMzIG9yIGxhdGVyICovCisjZGVmaW5lCUNBTl9MSU5FX0FTX0JBU1MJMHgwMDAwMDAyMAkJLyogMDM5IG9yIGxhdGVyICovCisjZGVmaW5lCUNBTl9NSUNfQVNfQkFTUwkJMHgwMDAwMDA0MAkJLyogMDM5IG9yIGxhdGVyICovCisKKy8qIGZsYWdzIHVzZWQgZm9yIHN0YXR1cyAqLworI2RlZmluZQlET19BQzNfSFcJCTB4MDAwMDAwMDEKKyNkZWZpbmUJRE9fQUMzX1NXCQkweDAwMDAwMDAyCisjZGVmaW5lCURPX0FDMwkJCShET19BQzNfSFcgfCBET19BQzNfU1cpCisjZGVmaW5lCURPX0RVQUxfREFDCQkweDAwMDAwMDA0CisjZGVmaW5lCURPX01VTFRJX0NIX0hXCQkweDAwMDAwMDA4CisjZGVmaW5lCURPX01VTFRJX0NICQkoRE9fTVVMVElfQ0hfSFcgfCBET19EVUFMX0RBQykKKyNkZWZpbmUJRE9fTElORV9BU19SRUFSCQkweDAwMDAwMDEwCQkvKiAwMzMgb3IgbGF0ZXIgKi8KKyNkZWZpbmUJRE9fTElORV9BU19CQVNTCQkweDAwMDAwMDIwCQkvKiAwMzkgb3IgbGF0ZXIgKi8KKyNkZWZpbmUJRE9fTUlDX0FTX0JBU1MJCTB4MDAwMDAwNDAJCS8qIDAzOSBvciBsYXRlciAqLworI2RlZmluZQlET19TUERJRl9PVVQJCTB4MDAwMDAxMDAKKyNkZWZpbmUJRE9fU1BESUZfSU4JCTB4MDAwMDAyMDAKKyNkZWZpbmUJRE9fU1BESUZfTE9PUAkJMHgwMDAwMDQwMAorI2RlZmluZQlET19CSUdFTkRJQU5fVwkJMHgwMDAwMTAwMAkJLyogdXNlZCBpbiBQb3dlclBDICovCisjZGVmaW5lCURPX0JJR0VORElBTl9SCQkweDAwMDAyMDAwCQkvKiB1c2VkIGluIFBvd2VyUEMgKi8KKworc3RhdGljIExJU1RfSEVBRChkZXZzKTsKKworc3RhdGljCWludAltcHVpbzsKK3N0YXRpYwlpbnQJZm1pbzsKK3N0YXRpYwlpbnQJam95c3RpY2s7CitzdGF0aWMJaW50CXNwZGlmX2ludmVyc2U7CitzdGF0aWMJaW50CXNwZGlmX2xvb3A7CitzdGF0aWMJaW50CXNwZGlmX291dDsKK3N0YXRpYwlpbnQJdXNlX2xpbmVfYXNfcmVhcjsKK3N0YXRpYwlpbnQJdXNlX2xpbmVfYXNfYmFzczsKK3N0YXRpYwlpbnQJdXNlX21pY19hc19iYXNzOworc3RhdGljCWludAltaWNfYm9vc3Q7CitzdGF0aWMJaW50CWh3X2NvcHk7Cittb2R1bGVfcGFyYW0obXB1aW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZm1pbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShqb3lzdGljaywgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oc3BkaWZfaW52ZXJzZSwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oc3BkaWZfbG9vcCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oc3BkaWZfb3V0LCBib29sLCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfbGluZV9hc19yZWFyLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfbGluZV9hc19iYXNzLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbSh1c2VfbWljX2FzX2Jhc3MsIGJvb2wsIDApOworbW9kdWxlX3BhcmFtKG1pY19ib29zdCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oaHdfY29weSwgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1wdWlvLCAiKDB4MzMwLCAweDMyMCwgMHgzMTAsIDB4MzAwKSBCYXNlIG9mIE1QVS00MDEsIDAgdG8gZGlzYWJsZSIpOworTU9EVUxFX1BBUk1fREVTQyhmbWlvLCAiKDB4Mzg4LCAweDNDOCwgMHgzRTApIEJhc2Ugb2YgT1BMMywgMCB0byBkaXNhYmxlIik7CitNT0RVTEVfUEFSTV9ERVNDKGpveXN0aWNrLCAiKDEvMCkgRW5hYmxlIGpveXN0aWNrIGludGVyZmFjZSwgc3RpbGwgbmVlZCBqb3lzdGljayBkcml2ZXIiKTsKK01PRFVMRV9QQVJNX0RFU0Moc3BkaWZfaW52ZXJzZSwgIigxLzApIEludmVydCBTL1BESUYtaW4gc2lnbmFsIik7CitNT0RVTEVfUEFSTV9ERVNDKHNwZGlmX2xvb3AsICIoMS8wKSBSb3V0ZSBTL1BESUYtaW4gdG8gUy9QRElGLW91dCBkaXJlY3RseSIpOworTU9EVUxFX1BBUk1fREVTQyhzcGRpZl9vdXQsICIoMS8wKSBTZW5kIFBDTSB0byBTL1BESUYtb3V0IChQQ00gdm9sdW1lIHdpbGwgbm90IGZ1bmN0aW9uKSIpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfbGluZV9hc19yZWFyLCAiKDEvMCkgVXNlIGxpbmUtaW4gamFjayBhcyByZWFyLW91dCIpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfbGluZV9hc19iYXNzLCAiKDEvMCkgVXNlIGxpbmUtaW4gamFjayBhcyBiYXNzL2NlbnRlciIpOworTU9EVUxFX1BBUk1fREVTQyh1c2VfbWljX2FzX2Jhc3MsICIoMS8wKSBVc2UgbWljLWluIGphY2sgYXMgYmFzcy9jZW50ZXIiKTsKK01PRFVMRV9QQVJNX0RFU0MobWljX2Jvb3N0LCAiKDEvMCkgRW5hYmxlIG1pY3JvcGhvbmUgYm9vc3QiKTsKK01PRFVMRV9QQVJNX0RFU0MoaHdfY29weSwgIkNvcHkgZnJvbnQgY2hhbm5lbCB0byBzdXJyb3VuZCBjaGFubmVsIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxkMih1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCBleHA9MTYsbD01LHI9MDsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgbnVtW109ezB4MiwweDQsMHgxMCwweDEwMCwweDEwMDAwfTsKKworCS8qIG51bTogMiwgNCwgMTYsIDI1NiwgNjU1MzYgKi8KKwkvKiBleHA6IDEsIDIsICA0LCAgIDgsICAgIDE2ICovCisKKwl3aGlsZShsLS0pIHsKKwkJaWYoIHggPj0gbnVtW2xdICkgeworCQkJaWYobnVtW2xdPjIpIHggPj49IGV4cDsKKwkJCXIrPWV4cDsKKwkJfQorCQlleHA+Pj0xOworCX0KKworCXJldHVybiByOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgbWFza2IodW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsdWUpCit7CisJb3V0YigoaW5iKGFkZHIpICYgbWFzaykgfCB2YWx1ZSwgYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIG1hc2t3KHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHZhbHVlKQoreworCW91dHcoKGludyhhZGRyKSAmIG1hc2spIHwgdmFsdWUsIGFkZHIpOworfQorCitzdGF0aWMgdm9pZCBtYXNrbCh1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlvdXRsKChpbmwoYWRkcikgJiBtYXNrKSB8IHZhbHVlLCBhZGRyKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2RtYWRhYzEoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQoreworCWlmIChhZGRyKQorCSAgICBvdXRsKGFkZHIsIHMtPmlvYmFzZSArIENPREVDX0NNSV9BRENfRlJBTUUxKTsKKwlvdXR3KGNvdW50IC0gMSwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0FEQ19GUkFNRTIpOworCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMCwgfkNIQURDMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kbWFhZGMoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQoreworCW91dGwoYWRkciwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0FEQ19GUkFNRTEpOworCW91dHcoY291bnQgLSAxLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQURDX0ZSQU1FMik7CisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwLCB+MCwgQ0hBREMwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2RtYWRhYyhzdHJ1Y3QgY21fc3RhdGUgKnMsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJb3V0bChhZGRyLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfREFDX0ZSQU1FMSk7CisJb3V0dyhjb3VudCAtIDEsIHMtPmlvYmFzZSArIENPREVDX0NNSV9EQUNfRlJBTUUyKTsKKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAsIH5DSEFEQzEsIDApOworCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJc2V0X2RtYWRhYzEocywgMCwgY291bnQpOworfQorCitzdGF0aWMgdm9pZCBzZXRfY291bnRhZGMoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBjb3VudCkKK3sKKwlvdXR3KGNvdW50IC0gMSwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0FEQ19GUkFNRTIgKyAyKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2NvdW50ZGFjKHN0cnVjdCBjbV9zdGF0ZSAqcywgdW5zaWduZWQgY291bnQpCit7CisJb3V0dyhjb3VudCAtIDEsIHMtPmlvYmFzZSArIENPREVDX0NNSV9EQUNfRlJBTUUyICsgMik7CisJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCSAgICBzZXRfY291bnRhZGMocywgY291bnQpOworfQorCitzdGF0aWMgdW5zaWduZWQgZ2V0X2RtYWRhYyhzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJdW5zaWduZWQgaW50IGN1cnJfYWRkcjsKKworCWN1cnJfYWRkciA9IGludyhzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfREFDX0ZSQU1FMikgKyAxOworCWN1cnJfYWRkciA8PD0gc2FtcGxlX3NoaWZ0WyhzLT5mbXQgPj4gQ01fQ0ZNVF9EQUNTSElGVCkgJiBDTV9DRk1UX01BU0tdOworCWN1cnJfYWRkciA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIGN1cnJfYWRkcjsKKworCXJldHVybiBjdXJyX2FkZHI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBnZXRfZG1hYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgY3Vycl9hZGRyOworCisJY3Vycl9hZGRyID0gaW53KHMtPmlvYmFzZSArIENPREVDX0NNSV9BRENfRlJBTUUyKSArIDE7CisJY3Vycl9hZGRyIDw8PSBzYW1wbGVfc2hpZnRbKHMtPmZtdCA+PiBDTV9DRk1UX0FEQ1NISUZUKSAmIENNX0NGTVRfTUFTS107CisJY3Vycl9hZGRyID0gcy0+ZG1hX2FkYy5kbWFzaXplIC0gY3Vycl9hZGRyOworCisJcmV0dXJuIGN1cnJfYWRkcjsKK30KKworc3RhdGljIHZvaWQgd3JtaXhlcihzdHJ1Y3QgY21fc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgaWR4LCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgY2hhciByZWd2YWwsIHBzZXVkbzsKKworCS8vIHBzZXVkbyByZWdpc3RlcgorCWlmIChpZHggPT0gRFNQX01JWF9BVVhWT0xfTCkgeworCQlkYXRhID4+PSA0OworCQlkYXRhICY9IDB4MGY7CisJCXJlZ3ZhbCA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQVVYX1ZPTCkgJiB+MHgwZjsKKwkJb3V0YihyZWd2YWwgfCBkYXRhLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQVVYX1ZPTCk7CisJCXJldHVybjsKKwl9CisJaWYgKGlkeCA9PSBEU1BfTUlYX0FVWFZPTF9SKSB7CisJCWRhdGEgJj0gMHhmMDsKKwkJcmVndmFsID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9BVVhfVk9MKSAmIH4weGYwOworCQlvdXRiKHJlZ3ZhbCB8IGRhdGEsIHMtPmlvYmFzZSArIENPREVDX0NNSV9BVVhfVk9MKTsKKwkJcmV0dXJuOworCX0KKwlvdXRiKGlkeCwgcy0+aW9iYXNlICsgQ09ERUNfU0IxNl9BRERSKTsKKwl1ZGVsYXkoMTApOworCS8vIHBzZXVkbyBiaXRzCisJaWYgKGlkeCA9PSBEU1BfTUlYX09VVE1JWElEWCkgeworCQlwc2V1ZG8gPSBkYXRhICYgfjB4MWY7CisJCXBzZXVkbyA+Pj0gMTsKKwkJcmVndmFsID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjIpICYgfjB4MzA7CisJCW91dGIocmVndmFsIHwgcHNldWRvLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyKTsKKwl9CisJaWYgKGlkeCA9PSBEU1BfTUlYX0FEQ01JWElEWF9MKSB7CisJCXBzZXVkbyA9IGRhdGEgJiAweDgwOworCQlwc2V1ZG8gPj49IDE7CisJCXJlZ3ZhbCA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyKSAmIH4weDQwOworCQlvdXRiKHJlZ3ZhbCB8IHBzZXVkbywgcy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMik7CisJfQorCWlmIChpZHggPT0gRFNQX01JWF9BRENNSVhJRFhfUikgeworCQlwc2V1ZG8gPSBkYXRhICYgMHg4MDsKKwkJcmVndmFsID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjIpICYgfjB4ODA7CisJCW91dGIocmVndmFsIHwgcHNldWRvLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyKTsKKwl9CisJb3V0YihkYXRhLCBzLT5pb2Jhc2UgKyBDT0RFQ19TQjE2X0RBVEEpOworCXVkZWxheSgxMCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHJkbWl4ZXIoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyIGlkeCkKK3sKKwl1bnNpZ25lZCBjaGFyIHYsIHBzZXVkbzsKKworCS8vIHBzZXVkbyByZWdpc3RlcgorCWlmIChpZHggPT0gRFNQX01JWF9BVVhWT0xfTCkgeworCQl2ID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9BVVhfVk9MKSAmIDB4MGY7CisJCXYgPDw9IDQ7CisJCXJldHVybiB2OworCX0KKwlpZiAoaWR4ID09IERTUF9NSVhfQVVYVk9MX0wpIHsKKwkJdiA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQVVYX1ZPTCkgJiAweGYwOworCQlyZXR1cm4gdjsKKwl9CisJb3V0YihpZHgsIHMtPmlvYmFzZSArIENPREVDX1NCMTZfQUREUik7CisJdWRlbGF5KDEwKTsKKwl2ID0gaW5iKHMtPmlvYmFzZSArIENPREVDX1NCMTZfREFUQSk7CisJdWRlbGF5KDEwKTsKKwkvLyBwc2V1ZG8gYml0cworCWlmIChpZHggPT0gRFNQX01JWF9PVVRNSVhJRFgpIHsKKwkJcHNldWRvID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjIpICYgMHgzMDsKKwkJcHNldWRvIDw8PSAxOworCQl2IHw9IHBzZXVkbzsKKwl9CisJaWYgKGlkeCA9PSBEU1BfTUlYX0FEQ01JWElEWF9MKSB7CisJCXBzZXVkbyA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyKSAmIDB4NDA7CisJCXBzZXVkbyA8PD0gMTsKKwkJdiB8PSBwc2V1ZG87CisJfQorCWlmIChpZHggPT0gRFNQX01JWF9BRENNSVhJRFhfUikgeworCQlwc2V1ZG8gPSBpbmIocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMikgJiAweDgwOworCQl2IHw9IHBzZXVkbzsKKwl9CisJcmV0dXJuIHY7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mbXRfdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyIG1hc2ssIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlpZiAobWFzayAmJiBzLT5jaGlwX3ZlcnNpb24gPiAwKSB7CS8qIDgzMzggY2Fubm90IGtlZXAgdGhpcyAqLworCQlzLT5mbXQgPSBpbmIocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUKTsKKwkJdWRlbGF5KDEwKTsKKwl9CisJcy0+Zm10ID0gKHMtPmZtdCAmIG1hc2spIHwgZGF0YTsKKwlvdXRiKHMtPmZtdCwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdm9pZCBzZXRfZm10KHN0cnVjdCBjbV9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciBtYXNrLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc2V0X2ZtdF91bmxvY2tlZChzLG1hc2ssZGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBmcm9iaW5kaXIoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyIGlkeCwgdW5zaWduZWQgY2hhciBtYXNrLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJb3V0YihpZHgsIHMtPmlvYmFzZSArIENPREVDX1NCMTZfQUREUik7CisJdWRlbGF5KDEwKTsKKwlvdXRiKChpbmIocy0+aW9iYXNlICsgQ09ERUNfU0IxNl9EQVRBKSAmIG1hc2spIHwgZGF0YSwgcy0+aW9iYXNlICsgQ09ERUNfU0IxNl9EQVRBKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgc3RydWN0IHsKKwl1bnNpZ25lZAlyYXRlOworCXVuc2lnbmVkCWxvd2VyOworCXVuc2lnbmVkCXVwcGVyOworCXVuc2lnbmVkIGNoYXIJZnJlcTsKK30gcmF0ZV9sb29rdXBbXSA9Cit7CisJeyA1NTEyLAkJKDAgKyA1NTEyKSAvIDIsCQkoNTUxMiArIDgwMDApIC8gMiwJMCB9LAorCXsgODAwMCwJCSg1NTEyICsgODAwMCkgLyAyLAkoODAwMCArIDExMDI1KSAvIDIsCTQgfSwKKwl7IDExMDI1LAkoODAwMCArIDExMDI1KSAvIDIsCSgxMTAyNSArIDE2MDAwKSAvIDIsCTEgfSwKKwl7IDE2MDAwLAkoMTEwMjUgKyAxNjAwMCkgLyAyLAkoMTYwMDAgKyAyMjA1MCkgLyAyLAk1IH0sCisJeyAyMjA1MCwJKDE2MDAwICsgMjIwNTApIC8gMiwJKDIyMDUwICsgMzIwMDApIC8gMiwJMiB9LAorCXsgMzIwMDAsCSgyMjA1MCArIDMyMDAwKSAvIDIsCSgzMjAwMCArIDQ0MTAwKSAvIDIsCTYgfSwKKwl7IDQ0MTAwLAkoMzIwMDAgKyA0NDEwMCkgLyAyLAkoNDQxMDAgKyA0ODAwMCkgLyAyLAkzIH0sCisJeyA0ODAwMCwJKDQ0MTAwICsgNDgwMDApIC8gMiwJNDgwMDAsCQkJNyB9Cit9OworCitzdGF0aWMgdm9pZCBzZXRfc3BkaWZfY29weXJpZ2h0KHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IHNwZGlmX2NvcHlyaWdodCkKK3sKKwkvKiBlbmFibGUgU1BESUYtaW4gQ29weXJpZ2h0ICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0xFR0FDWV9DVFJMICsgMiwgflNQRENPUFlSSFQsIHNwZGlmX2NvcHlyaWdodCA/IFNQRENPUFlSSFQgOiAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3NwZGlmX2xvb3Aoc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgc3BkaWZfbG9vcCkKK3sKKwkvKiBlbmFibGUgU1BESUYgbG9vcCAqLworCWlmIChzcGRpZl9sb29wKSB7CisJCXMtPnN0YXR1cyB8PSBET19TUERJRl9MT09QOworCQkvKiB0dXJuIG9uIHNwZGlmLWluIHRvIHNwZGlmLW91dCAqLworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEsIH4wLCBTUERGTE9PUCk7CisJfSBlbHNlIHsKKwkJcy0+c3RhdHVzICY9IH5ET19TUERJRl9MT09QOworCQkvKiB0dXJuIG9mZiBzcGRpZi1pbiB0byBzcGRpZi1vdXQgKi8KKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+U1BERkxPT1AsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X3NwZGlmX21vbml0b3Ioc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgY2hhbm5lbCkKK3sKKwkvLyBTUERPMkRBQworCW1hc2t3KHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMSwgflNQRE8yREFDLCBjaGFubmVsID09IDIgPyBTUERPMkRBQyA6IDApOworCS8vIENEUExBWQorCWlmIChzLT5jaGlwX3ZlcnNpb24gPj0gMzkpCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjEsIH5DRFBMQVksIGNoYW5uZWwgPyBDRFBMQVkgOiAwKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3NwZGlmb3V0X2xldmVsKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IGxldmVsNXYpCit7CisJLyogU1BETzVWICovCisJaWYgKHMtPmNoaXBfdmVyc2lvbiA+IDApCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwgKyAzLCB+U1BETzVWLCBsZXZlbDV2ID8gU1BETzVWIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zcGRpZmluX2ludmVyc2Uoc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgc3BkaWZfaW52ZXJzZSkKK3sKKwlpZiAocy0+Y2hpcF92ZXJzaW9uID09IDApCS8qIDgzMzggaGFzIG5vdCB0aGlzIGZlYXR1cmUgKi8KKwkJcmV0dXJuOworCWlmIChzcGRpZl9pbnZlcnNlKSB7CisJCS8qIHR1cm4gb24gc3BkaWYtaW4gaW52ZXJzZSAqLworCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM5KQorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFULCB+MCwgSU5WU1BESUZJKTsKKwkJZWxzZQorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMiwgfjAsIDEpOworCX0gZWxzZSB7CisJCS8qIHR1cm4gb2ZmIHNwZGlmLWluaW52ZXJzZSAqLworCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM5KQorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFULCB+SU5WU1BESUZJLCAwKTsKKwkJZWxzZQorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMiwgfjEsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X3NwZGlmaW5fY2hhbm5lbDIoc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgY2hhbm5lbDIpCit7CisJLyogU0VMU1BESUZJMiAqLworCWlmIChzLT5jaGlwX3ZlcnNpb24gPj0gMzkpCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwgKyAxLCB+U0VMU1BESUZJMiwgY2hhbm5lbDIgPyBTRUxTUERJRkkyIDogMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zcGRpZmluX3ZhbGlkKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IHZhbGlkKQoreworCS8qIFNQRFZBTElEICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0MsIH5TUERWQUxJRCwgdmFsaWQgPyBTUERWQUxJRCA6IDApOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3BkaWZvdXRfdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCWlmIChyYXRlICE9IDQ4MDAwICYmIHJhdGUgIT0gNDQxMDApCisJCXJhdGUgPSAwOworCWlmIChyYXRlID09IDQ4MDAwIHx8IHJhdGUgPT0gNDQxMDApIHsKKwkJc2V0X3NwZGlmX2xvb3AocywgMCk7CisJCS8vIFNQREZfMQorCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEgKyAxLCB+MCwgU1BERl8xKTsKKwkJLy8gU1BESUZJNDhLIFNQREZfQUM5NworCQltYXNrbChzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlTQ19DVFJMLCB+U1BESUY0OEssIHJhdGUgPT0gNDgwMDAgPyBTUERJRjQ4SyA6IDApOworCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDU1KQorCQkvLyBTUEQzMktGTVQKKwkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwyLCB+U1BEMzJLRk1ULCByYXRlID09IDQ4MDAwID8gU1BEMzJLRk1UIDogMCk7CisJCWlmIChzLT5jaGlwX3ZlcnNpb24gPiAwKQorCQkvLyBFTlNQRE9VVAorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0xFR0FDWV9DVFJMICsgMiwgfjAsIEVOU1BET1VUKTsKKwkJLy8gbW9uaXRvciBTUERJRiBvdXQKKwkJc2V0X3NwZGlmX21vbml0b3IocywgMik7CisJCXMtPnN0YXR1cyB8PSBET19TUERJRl9PVVQ7CisJfSBlbHNlIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxICsgMSwgflNQREZfMSwgMCk7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9MRUdBQ1lfQ1RSTCArIDIsIH5FTlNQRE9VVCwgMCk7CisJCS8vIG1vbml0b3Igbm9uZQorCQlzZXRfc3BkaWZfbW9uaXRvcihzLCAwKTsKKwkJcy0+c3RhdHVzICY9IH5ET19TUERJRl9PVVQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfc3BkaWZvdXQoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXNldF9zcGRpZm91dF91bmxvY2tlZChzLHJhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2V0X3NwZGlmaW5fdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCWlmIChyYXRlID09IDQ4MDAwIHx8IHJhdGUgPT0gNDQxMDApIHsKKwkJLy8gU1BERl8xCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMSArIDEsIH4wLCBTUERGXzEpOworCQkvLyBTUERJRkk0OEsgU1BERl9BQzk3CisJCW1hc2tsKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwsIH5TUERJRjQ4SywgcmF0ZSA9PSA0ODAwMCA/IFNQRElGNDhLIDogMCk7CisJCXMtPnN0YXR1cyB8PSBET19TUERJRl9JTjsKKwl9IGVsc2UgeworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEgKyAxLCB+U1BERl8xLCAwKTsKKwkJcy0+c3RhdHVzICY9IH5ET19TUERJRl9JTjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNldF9zcGRpZmluKHN0cnVjdCBjbV9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzZXRfc3BkaWZpbl91bmxvY2tlZChzLHJhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworLyogZmluZCBwYXJpdHkgZm9yIGJpdCA0fjMwICovCitzdGF0aWMgdW5zaWduZWQgcGFyaXR5KHVuc2lnbmVkIGRhdGEpCit7CisJdW5zaWduZWQgcGFyaXR5ID0gMDsKKwlpbnQgY291bnRlciA9IDQ7CisKKwlkYXRhID4+PSA0OwkvLyBzdGFydCBmcm9tIGJpdCA0CisJd2hpbGUgKGNvdW50ZXIgPD0gMzApIHsKKwkJaWYgKGRhdGEgJiAxKQorCQkJcGFyaXR5Kys7CisJCWRhdGEgPj49IDE7CisJCWNvdW50ZXIrKzsKKwl9CisJcmV0dXJuIHBhcml0eSAmIDE7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hYzNfdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCWlmICghKHMtPmNhcGFiaWxpdHkgJiBDQU5fQUMzKSkKKwkJcmV0dXJuOworCS8qIGVuYWJsZSBBQzMgKi8KKwlpZiAocmF0ZSAmJiByYXRlICE9IDQ0MTAwKQorCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPT0gNDgwMDAgfHwgcmF0ZSA9PSA0NDEwMCkgeworCQkvLyBtdXRlIERBQworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIxLCB+MCwgV1NNVVRFKTsKKwkJaWYgKHMtPmNoaXBfdmVyc2lvbiA+PSAzOSkKKwkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwsIH4wLCBNVVRFQ0gxKTsKKwkJLy8gQUMzRU4gZm9yIDAzOSwgMHgwNAorCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM5KSB7CisJCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlTQ19DVFJMICsgMiwgfjAsIEFDM19FTik7CisJCQlpZiAocy0+Y2hpcF92ZXJzaW9uID09IDU1KQorCQkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9TUERJRl9DVFJMLCB+MiwgMCk7CisJCS8vIEFDM0VOIGZvciAwMzcsIDB4MTAKKwkJfSBlbHNlIGlmIChzLT5jaGlwX3ZlcnNpb24gPT0gMzcpCisJCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQ0hGT1JNQVQgKyAyLCB+MCwgMHgxMCk7CisJCWlmIChzLT5jYXBhYmlsaXR5ICYgQ0FOX0FDM19IVykgeworCQkJLy8gU1BEMjRTRUwgZm9yIDAzOSwgMHgyMCwgYnV0IGNhbm5vdCBiZSBzZXQKKwkJCWlmIChzLT5jaGlwX3ZlcnNpb24gPT0gMzkpCisJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMiwgfjAsIFNQRDI0U0VMKTsKKwkJCS8vIFNQRDI0U0VMIGZvciAwMzcsIDB4MDIKKwkJCWVsc2UgaWYgKHMtPmNoaXBfdmVyc2lvbiA9PSAzNykKKwkJCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQ0hGT1JNQVQgKyAyLCB+MCwgMHgwMik7CisJCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM5KQorCQkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjEsIH5DRFBMQVksIDApOworCisJCQlzLT5zdGF0dXMgfD0gRE9fQUMzX0hXOworCQkgfSBlbHNlIHsKKwkJCS8vIFNQRDMyU0VMIGZvciAwMzcgJiAwMzkKKwkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwgKyAyLCB+MCwgU1BEMzJTRUwpOworCQkJLy8gc2V0IDE3Nksgc2FtcGxlIHJhdGUgdG8gZml4IDAzMyBIVyBidWcKKwkJCWlmIChzLT5jaGlwX3ZlcnNpb24gPT0gMzMpIHsKKwkJCQlpZiAocmF0ZSA9PSA0ODAwMCkKKwkJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMSwgfjAsIDB4MDgpOworCQkJCWVsc2UKKwkJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMSwgfjB4MDgsIDApOworCQkJfQorCQkJcy0+c3RhdHVzIHw9IERPX0FDM19TVzsKKwkJfQorCX0gZWxzZSB7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjEsIH5XU01VVEUsIDApOworCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM5KQorCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCwgfk1VVEVDSDEsIDApOworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQ0hGT1JNQVQgKyAyLCB+KFNQRDI0U0VMfDB4MTIpLCAwKTsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCArIDIsIH4oU1BEMzJTRUx8QUMzX0VOKSwgMCk7CisJCWlmIChzLT5jaGlwX3ZlcnNpb24gPT0gMzMpCisJCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQ0hGT1JNQVQgKyAxLCB+MHgwOCwgMCk7CisJCWlmIChzLT5jaGlwX3ZlcnNpb24gPj0gMzkpCisJCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIxLCB+MCwgQ0RQTEFZKTsKKwkJcy0+c3RhdHVzICY9IH5ET19BQzM7CisJfQorCXMtPnNwZGlmX2NvdW50ZXIgPSAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfbGluZV9hc19yZWFyKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IHVzZV9saW5lX2FzX3JlYXIpCit7CisJaWYgKCEocy0+Y2FwYWJpbGl0eSAmIENBTl9MSU5FX0FTX1JFQVIpKQorCQlyZXR1cm47CisJaWYgKHVzZV9saW5lX2FzX3JlYXIpIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMSwgfjAsIFNQSzQpOworCQlzLT5zdGF0dXMgfD0gRE9fTElORV9BU19SRUFSOworCX0gZWxzZSB7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjEsIH5TUEs0LCAwKTsKKwkJcy0+c3RhdHVzICY9IH5ET19MSU5FX0FTX1JFQVI7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfbGluZV9hc19iYXNzKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IHVzZV9saW5lX2FzX2Jhc3MpCit7CisJaWYgKCEocy0+Y2FwYWJpbGl0eSAmIENBTl9MSU5FX0FTX0JBU1MpKQorCQlyZXR1cm47CisJaWYgKHVzZV9saW5lX2FzX2Jhc3MpIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0xFR0FDWV9DVFJMICsgMSwgfjAsIENCMkxJTik7CisJCXMtPnN0YXR1cyB8PSBET19MSU5FX0FTX0JBU1M7CisJfSBlbHNlIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0xFR0FDWV9DVFJMICsgMSwgfkNCMkxJTiwgMCk7CisJCXMtPnN0YXR1cyAmPSB+RE9fTElORV9BU19CQVNTOworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X21pY19hc19iYXNzKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IHVzZV9taWNfYXNfYmFzcykKK3sKKwlpZiAoIShzLT5jYXBhYmlsaXR5ICYgQ0FOX01JQ19BU19CQVNTKSkKKwkJcmV0dXJuOworCWlmICh1c2VfbWljX2FzX2Jhc3MpIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0MsIH4wLCAweDA0KTsKKwkJcy0+c3RhdHVzIHw9IERPX01JQ19BU19CQVNTOworCX0gZWxzZSB7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDLCB+MHgwNCwgMCk7CisJCXMtPnN0YXR1cyAmPSB+RE9fTUlDX0FTX0JBU1M7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfaHdfY29weShzdHJ1Y3QgY21fc3RhdGUgKnMsIGludCBod19jb3B5KQoreworICAgIAlpZiAocy0+bWF4X2NoYW5uZWxzID4gMiAmJiBod19jb3B5KQorCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlTQ19DVFJMICsgMywgfjAsIE40U1BLM0QpOworICAgIAllbHNlCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwgKyAzLCB+TjRTUEszRCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hYzMoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXNldF9zcGRpZm91dF91bmxvY2tlZChzLCByYXRlKTsKKwlzZXRfYWMzX3VubG9ja2VkKHMsIHJhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCB0cmFuc19hYzMoc3RydWN0IGNtX3N0YXRlICpzLCB2b2lkICpkZXN0LCBjb25zdCBjaGFyIF9fdXNlciAqc291cmNlLCBpbnQgc2l6ZSkKK3sKKwlpbnQgICBpID0gc2l6ZSAvIDI7CisJdW5zaWduZWQgbG9uZyBkYXRhOworCXVuc2lnbmVkIHNob3J0IGRhdGExNjsKKwl1bnNpZ25lZCBsb25nICpkc3QgPSAodW5zaWduZWQgbG9uZyAqKSBkZXN0OworCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqc3JjID0gKHVuc2lnbmVkIHNob3J0IF9fdXNlciAqKXNvdXJjZTsKKwlpbnQgZXJyOworCisJZG8geworCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YTE2LCBzcmMrKykpKQorCQkJcmV0dXJuIGVycjsKKwkJZGF0YSA9ICh1bnNpZ25lZCBsb25nKWxlMTZfdG9fY3B1KGRhdGExNik7CisJCWRhdGEgPDw9IDEyOwkJCS8vIG9rIGZvciAxNi1iaXQgZGF0YQorCQlpZiAocy0+c3BkaWZfY291bnRlciA9PSAyIHx8IHMtPnNwZGlmX2NvdW50ZXIgPT0gMykKKwkJCWRhdGEgfD0gMHg0MDAwMDAwMDsJLy8gaW5kaWNhdGUgQUMtMyByYXcgZGF0YQorCQlpZiAocGFyaXR5KGRhdGEpKQorCQkJZGF0YSB8PSAweDgwMDAwMDAwOwkvLyBwYXJpdHkKKwkJaWYgKHMtPnNwZGlmX2NvdW50ZXIgPT0gMCkKKwkJCWRhdGEgfD0gMzsJCS8vIHByZWFtYmxlICdNJworCQllbHNlIGlmIChzLT5zcGRpZl9jb3VudGVyICYgMSkKKwkJCWRhdGEgfD0gNTsJCS8vIG9kZCwgJ1cnCisJCWVsc2UKKwkJCWRhdGEgfD0gOTsJCS8vIGV2ZW4sICdNJworCQkqZHN0KysgPSBjcHVfdG9fbGUzMihkYXRhKTsKKwkJcy0+c3BkaWZfY291bnRlcisrOworCQlpZiAocy0+c3BkaWZfY291bnRlciA9PSAzODQpCisJCQlzLT5zcGRpZl9jb3VudGVyID0gMDsKKwl9IHdoaWxlICgtLWkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hZGNfcmF0ZV91bmxvY2tlZChzdHJ1Y3QgY21fc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJdW5zaWduZWQgY2hhciBmcmVxID0gNDsKKwlpbnQJaTsKKworCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDgwMDApCisJCXJhdGUgPSA4MDAwOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmF0ZV9sb29rdXApIC8gc2l6ZW9mKHJhdGVfbG9va3VwWzBdKTsgaSsrKSB7CisJCWlmIChyYXRlID4gcmF0ZV9sb29rdXBbaV0ubG93ZXIgJiYgcmF0ZSA8PSByYXRlX2xvb2t1cFtpXS51cHBlcikgeworCQkJcmF0ZSA9IHJhdGVfbG9va3VwW2ldLnJhdGU7CisJCQlmcmVxID0gcmF0ZV9sb29rdXBbaV0uZnJlcTsKKwkJCWJyZWFrOworCSAgICAJfQorCX0KKwlzLT5yYXRlYWRjID0gcmF0ZTsKKwlmcmVxIDw8PSBDTV9GUkVRX0FEQ1NISUZUOworCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxICsgMSwgfkFTRkMsIGZyZXEpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYWRjX3JhdGUoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBmcmVxID0gNDsKKwlpbnQJaTsKKworCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDgwMDApCisJCXJhdGUgPSA4MDAwOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmF0ZV9sb29rdXApIC8gc2l6ZW9mKHJhdGVfbG9va3VwWzBdKTsgaSsrKSB7CisJCWlmIChyYXRlID4gcmF0ZV9sb29rdXBbaV0ubG93ZXIgJiYgcmF0ZSA8PSByYXRlX2xvb2t1cFtpXS51cHBlcikgeworCQkJcmF0ZSA9IHJhdGVfbG9va3VwW2ldLnJhdGU7CisJCQlmcmVxID0gcmF0ZV9sb29rdXBbaV0uZnJlcTsKKwkJCWJyZWFrOworCSAgICAJfQorCX0KKwlzLT5yYXRlYWRjID0gcmF0ZTsKKwlmcmVxIDw8PSBDTV9GUkVRX0FEQ1NISUZUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEgKyAxLCB+QVNGQywgZnJlcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGFjX3JhdGUoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBmcmVxID0gNDsKKwlpbnQJaTsKKworCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDgwMDApCisJCXJhdGUgPSA4MDAwOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YocmF0ZV9sb29rdXApIC8gc2l6ZW9mKHJhdGVfbG9va3VwWzBdKTsgaSsrKSB7CisJCWlmIChyYXRlID4gcmF0ZV9sb29rdXBbaV0ubG93ZXIgJiYgcmF0ZSA8PSByYXRlX2xvb2t1cFtpXS51cHBlcikgeworCQkJcmF0ZSA9IHJhdGVfbG9va3VwW2ldLnJhdGU7CisJCQlmcmVxID0gcmF0ZV9sb29rdXBbaV0uZnJlcTsKKwkJCWJyZWFrOworCSAgICAJfQorCX0KKwlzLT5yYXRlZGFjID0gcmF0ZTsKKwlmcmVxIDw8PSBDTV9GUkVRX0RBQ1NISUZUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEgKyAxLCB+RFNGQywgZnJlcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJaWYgKHMtPmN1cnJfY2hhbm5lbHMgPD0gMiAmJiBzcGRpZl9vdXQpCisJCXNldF9zcGRpZm91dChzLCByYXRlKTsKKwlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpCisJCXNldF9kYWMxX3JhdGUocywgcmF0ZSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworc3RhdGljIGlubGluZSB2b2lkIHJlc2V0X2FkYyhzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJLyogcmVzZXQgYnVzIG1hc3RlciAqLworCW91dGIocy0+ZW5hYmxlIHwgUlNUQURDLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAgKyAyKTsKKwl1ZGVsYXkoMTApOworCW91dGIocy0+ZW5hYmxlICYgflJTVEFEQywgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwICsgMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNldF9kYWMoc3RydWN0IGNtX3N0YXRlICpzKQoreworCS8qIHJlc2V0IGJ1cyBtYXN0ZXIgKi8KKwlvdXRiKHMtPmVuYWJsZSB8IFJTVERBQywgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwICsgMik7CisJdWRlbGF5KDEwKTsKKwlvdXRiKHMtPmVuYWJsZSAmIH5SU1REQUMsIHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMCArIDIpOworCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJcmVzZXRfYWRjKHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcGF1c2VfYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAsIH4wLCBQQVVTRUFEQyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXVzZV9kYWMoc3RydWN0IGNtX3N0YXRlICpzKQoreworCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMCwgfjAsIFBBVVNFREFDKTsKKwlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpCisJCXBhdXNlX2FkYyhzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwkvKiBkaXNhYmxlIGNoYW5uZWwgKi8KKwlzLT5lbmFibGUgJj0gfkVOQURDOworCW91dGIocy0+ZW5hYmxlLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAgKyAyKTsKKwlyZXNldF9hZGMocyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkaXNhYmxlX2RhYyhzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJLyogZGlzYWJsZSBjaGFubmVsICovCisJcy0+ZW5hYmxlICY9IH5FTkRBQzsKKwlvdXRiKHMtPmVuYWJsZSwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwICsgMik7CisJcmVzZXRfZGFjKHMpOworCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJZGlzYWJsZV9hZGMocyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwlpZiAoIShzLT5lbmFibGUgJiBFTkFEQykpIHsKKwkJLyogZW5hYmxlIGNoYW5uZWwgKi8KKwkJcy0+ZW5hYmxlIHw9IEVOQURDOworCQlvdXRiKHMtPmVuYWJsZSwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwICsgMik7CisJfQorCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMCwgflBBVVNFQURDLCAwKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9kYWNfdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzKQoreworCWlmICghKHMtPmVuYWJsZSAmIEVOREFDKSkgeworCQkvKiBlbmFibGUgY2hhbm5lbCAqLworCQlzLT5lbmFibGUgfD0gRU5EQUM7CisJCW91dGIocy0+ZW5hYmxlLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAgKyAyKTsKKwl9CisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwLCB+UEFVU0VEQUMsIDApOworCisJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQllbmFibGVfYWRjKHMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9hZGNfdW5sb2NrZWQoc3RydWN0IGNtX3N0YXRlICpzKQoreworCWlmIChzLT5lbmFibGUgJiBFTkFEQykgeworCQkvKiBkaXNhYmxlIGludGVycnVwdCAqLworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfSU5UX0hMRENMUiArIDIsIH5FTkFEQ0lOVCwgMCk7CisJCWRpc2FibGVfYWRjKHMpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzdG9wX2FkY191bmxvY2tlZChzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKK30KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfZGFjX3VubG9ja2VkKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwlpZiAocy0+ZW5hYmxlICYgRU5EQUMpIHsKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHQgKi8KKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0lOVF9ITERDTFIgKyAyLCB+RU5EQUNJTlQsIDApOworCQlkaXNhYmxlX2RhYyhzKTsKKwl9CisJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQlzdG9wX2RhYzFfdW5sb2NrZWQocyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc3RvcF9kYWNfdW5sb2NrZWQocyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RhcnRfYWRjX3VubG9ja2VkKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwlpZiAoKHMtPmRtYV9hZGMubWFwcGVkIHx8IHMtPmRtYV9hZGMuY291bnQgPCAoc2lnbmVkKShzLT5kbWFfYWRjLmRtYXNpemUgLSAyKnMtPmRtYV9hZGMuZnJhZ3NpemUpKQorCSAgICAmJiBzLT5kbWFfYWRjLnJlYWR5KSB7CisJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0lOVF9ITERDTFIgKyAyLCB+MCwgRU5BRENJTlQpOworCQllbmFibGVfYWRjKHMpOworCX0KK30KKworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzdGFydF9hZGNfdW5sb2NrZWQocyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMxX3VubG9ja2VkKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwlpZiAoKHMtPmRtYV9hZGMubWFwcGVkIHx8IHMtPmRtYV9hZGMuY291bnQgPiAwKSAmJiBzLT5kbWFfYWRjLnJlYWR5KSB7CisJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0lOVF9ITERDTFIgKyAyLCB+MCwgRU5BRENJTlQpOworIAkJZW5hYmxlX2RhY191bmxvY2tlZChzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2RhY191bmxvY2tlZChzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJaWYgKChzLT5kbWFfZGFjLm1hcHBlZCB8fCBzLT5kbWFfZGFjLmNvdW50ID4gMCkgJiYgcy0+ZG1hX2RhYy5yZWFkeSkgeworCQkvKiBlbmFibGUgaW50ZXJydXB0ICovCisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9JTlRfSExEQ0xSICsgMiwgfjAsIEVOREFDSU5UKTsKKwkJZW5hYmxlX2RhY191bmxvY2tlZChzKTsKKwl9CisJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQlzdGFydF9kYWMxX3VubG9ja2VkKHMpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGNtX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXN0YXJ0X2RhY191bmxvY2tlZChzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGNtX3N0YXRlICpzLCB1bnNpZ25lZCByZWMpOworCitzdGF0aWMgaW50IHNldF9kYWNfY2hhbm5lbHMoc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgY2hhbm5lbHMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdGF0aWMgdW5zaWduZWQgaW50IGZtbXV0ZSA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJaWYgKChjaGFubmVscyA+IDIpICYmIChjaGFubmVscyA8PSBzLT5tYXhfY2hhbm5lbHMpCisJICYmICgoKHMtPmZtdCA+PiBDTV9DRk1UX0RBQ1NISUZUKSAmIENNX0NGTVRfTUFTSykgPT0gKENNX0NGTVRfU1RFUkVPIHwgQ01fQ0ZNVF8xNkJJVCkpKSB7CisJICAgIHNldF9zcGRpZm91dF91bmxvY2tlZChzLCAwKTsKKwkgICAgaWYgKHMtPmNhcGFiaWxpdHkgJiBDQU5fTVVMVElfQ0hfSFcpIHsKKwkJLy8gTlhDSEcKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0xFR0FDWV9DVFJMICsgMywgfjAsIE5YQ0hHKTsKKwkJLy8gQ0hCM0Qgb3IgQ0hCM0Q1QworCSAgICAgICAJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0NIRk9STUFUICsgMywgfihDSEIzRDVDfENIQjNEKSwgY2hhbm5lbHMgPiA0ID8gQ0hCM0Q1QyA6IENIQjNEKTsKKwkJLy8gQ0hCM0Q2QworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTEVHQUNZX0NUUkwgKyAxLCB+Q0hCM0Q2QywgY2hhbm5lbHMgPT0gNiA/IENIQjNENkMgOiAwKTsKKwkJLy8gRU5DRU5URVIKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCwgfkVOQ0VOVEVSLCBjaGFubmVscyA9PSA2ID8gRU5DRU5URVIgOiAwKTsKKwkJcy0+c3RhdHVzIHw9IERPX01VTFRJX0NIX0hXOworCSAgICB9IGVsc2UgaWYgKHMtPmNhcGFiaWxpdHkgJiBDQU5fRFVBTF9EQUMpIHsKKwkJdW5zaWduZWQgY2hhciBmbXRtID0gfjAsIGZtdHMgPSAwOworCQlzc2l6ZV90IHJldDsKKworCQkvLyBFTkRCREFDLCB0dXJuIG9uIGRvdWJsZSBEQUMgbW9kZQorCQkvLyBYQ0hHREFDLCBDSDAgLT4gYmFjaywgQ0gxLT5mcm9udAorCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlTQ19DVFJMICsgMiwgfjAsIEVOREJEQUN8WENIR0RBQyk7CisJCS8vIG11dGUgRk0KKwkJZm1tdXRlID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjEpICYgRk1NVVRFOworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIxLCB+MCwgRk1NVVRFKTsKKwkJcy0+c3RhdHVzIHw9IERPX0RVQUxfREFDOworCQkvLyBwcmVwYXJlIHNlY29uZGFyeSBidWZmZXIKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBwcm9nX2RtYWJ1ZihzLCAxKTsKKwkJaWYgKHJldCkgcmV0dXJuIHJldDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCQkvLyBjb3B5IHRoZSBodyBzdGF0ZQorCQlmbXRtICY9IH4oKENNX0NGTVRfU1RFUkVPIHwgQ01fQ0ZNVF8xNkJJVCkgPDwgQ01fQ0ZNVF9EQUNTSElGVCk7CisJCWZtdG0gJj0gfigoQ01fQ0ZNVF9TVEVSRU8gfCBDTV9DRk1UXzE2QklUKSA8PCBDTV9DRk1UX0FEQ1NISUZUKTsKKwkJLy8gdGhlIEhXIG9ubHkgc3VwcG9ydCAxNi1iaXQgc3RlcmVvCisJCWZtdHMgfD0gQ01fQ0ZNVF8xNkJJVCA8PCBDTV9DRk1UX0RBQ1NISUZUOworCQlmbXRzIHw9IENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9BRENTSElGVDsKKwkJZm10cyB8PSBDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0RBQ1NISUZUOworCQlmbXRzIHw9IENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfQURDU0hJRlQ7CisKKwkJc2V0X2ZtdF91bmxvY2tlZChzLCBmbXRtLCBmbXRzKTsKKwkJc2V0X2FkY19yYXRlX3VubG9ja2VkKHMsIHMtPnJhdGVkYWMpOworCSAgICB9CisJICAgIC8vIGRpc2FibGUgNCBzcGVha2VyIG1vZGUgKGFuYWxvZyBkdXBsaWNhdGUpCisJICAgIHNldF9od19jb3B5KHMsIDApOworCSAgICBzLT5jdXJyX2NoYW5uZWxzID0gY2hhbm5lbHM7CisKKwkgICAgLy8gZW5hYmxlIGphY2sgcmVkaXJlY3QKKwkgICAgc2V0X2xpbmVfYXNfcmVhcihzLCB1c2VfbGluZV9hc19yZWFyKTsKKwkgICAgaWYgKGNoYW5uZWxzID4gNCkgeworCQkgICAgc2V0X2xpbmVfYXNfYmFzcyhzLCB1c2VfbGluZV9hc19iYXNzKTsKKwkJICAgIHNldF9taWNfYXNfYmFzcyhzLCB1c2VfbWljX2FzX2Jhc3MpOworCSAgICB9CisJfSBlbHNlIHsKKwkgICAgaWYgKHMtPnN0YXR1cyAmIERPX01VTFRJX0NIX0hXKSB7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9MRUdBQ1lfQ1RSTCArIDMsIH5OWENIRywgMCk7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9DSEZPUk1BVCArIDMsIH4oQ0hCM0Q1Q3xDSEIzRCksIDApOworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTEVHQUNZX0NUUkwgKyAxLCB+Q0hCM0Q2QywgMCk7CisJICAgIH0gZWxzZSBpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpIHsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCArIDIsIH5FTkRCREFDLCAwKTsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMSwgfkZNTVVURSwgZm1tdXRlKTsKKwkgICAgfQorCSAgICAvLyBlbmFibGUgNCBzcGVha2VyIG1vZGUgKGFuYWxvZyBkdXBsaWNhdGUpCisJICAgIHNldF9od19jb3B5KHMsIGh3X2NvcHkpOworCSAgICBzLT5zdGF0dXMgJj0gfkRPX01VTFRJX0NIOworCSAgICBzLT5jdXJyX2NoYW5uZWxzID0gcy0+Zm10ICYgKENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfREFDU0hJRlQpID8gMiA6IDE7CisJICAgIC8vIGRpc2FibGUgamFjayByZWRpcmVjdAorCSAgICBzZXRfbGluZV9hc19yZWFyKHMsIGh3X2NvcHkgPyB1c2VfbGluZV9hc19yZWFyIDogMCk7CisJICAgIHNldF9saW5lX2FzX2Jhc3MocywgMCk7CisJICAgIHNldF9taWNfYXNfYmFzcyhzLCAwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBzLT5jdXJyX2NoYW5uZWxzOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNi1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCitzdGF0aWMgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgY21fc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXN0cnVjdCBwYWdlICpwc3RhcnQsICpwZW5kOworCisJaWYgKGRiLT5yYXdidWYpIHsKKwkJLyogdW5kbyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAqLworCQlwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwc3RhcnQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBzdGFydCA8PSBwZW5kOyBwc3RhcnQrKykKKwkJCUNsZWFyUGFnZVJlc2VydmVkKHBzdGFydCk7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQocy0+ZGV2LCBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyLCBkYi0+cmF3YnVmLCBkYi0+ZG1hYWRkcik7CisJfQorCWRiLT5yYXdidWYgPSBOVUxMOworCWRiLT5tYXBwZWQgPSBkYi0+cmVhZHkgPSAwOworfQorCisvKiBDaDEgaXMgdXNlZCBmb3IgcGxheWJhY2ssIENoMCBpcyB1c2VkIGZvciByZWNvcmRpbmcgKi8KKworc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3QgY21fc3RhdGUgKnMsIHVuc2lnbmVkIHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9IHJlYyA/ICZzLT5kbWFfYWRjIDogJnMtPmRtYV9kYWM7CisJdW5zaWduZWQgcmF0ZSA9IHJlYyA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjOworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBieXRlcGVyc2VjOworCXVuc2lnbmVkIGJ1ZnM7CisJc3RydWN0IHBhZ2UgKnBzdGFydCwgKnBlbmQ7CisJdW5zaWduZWQgY2hhciBmbXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZtdCA9IHMtPmZtdDsKKwlpZiAocmVjKSB7CisJCXN0b3BfYWRjKHMpOworCQlmbXQgPj49IENNX0NGTVRfQURDU0hJRlQ7CisJfSBlbHNlIHsKKwkJc3RvcF9kYWMocyk7CisJCWZtdCA+Pj0gQ01fQ0ZNVF9EQUNTSElGVDsKKwl9CisKKwlmbXQgJj0gQ01fQ0ZNVF9NQVNLOworCWRiLT5od3B0ciA9IGRiLT5zd3B0ciA9IGRiLT50b3RhbF9ieXRlcyA9IGRiLT5jb3VudCA9IGRiLT5lcnJvciA9IGRiLT5lbmRjbGVhcmVkID0gMDsKKwlpZiAoIWRiLT5yYXdidWYpIHsKKwkJZGItPnJlYWR5ID0gZGItPm1hcHBlZCA9IDA7CisJCWZvciAob3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pCisJCQlpZiAoKGRiLT5yYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRiLT5kbWFhZGRyKSkpCisJCQkJYnJlYWs7CisJCWlmICghZGItPnJhd2J1ZiB8fCAhZGItPmRtYWFkZHIpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZGItPmJ1Zm9yZGVyID0gb3JkZXI7CisJCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLworCQlwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwc3RhcnQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBzdGFydCA8PSBwZW5kOyBwc3RhcnQrKykKKwkJCVNldFBhZ2VSZXNlcnZlZChwc3RhcnQpOworCX0KKwlieXRlcGVyc2VjID0gcmF0ZSA8PCBzYW1wbGVfc2hpZnRbZm10XTsKKwlidWZzID0gUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcjsKKwlpZiAoZGItPm9zc2ZyYWdzaGlmdCkgeworCQlpZiAoKDEwMDAgPDwgZGItPm9zc2ZyYWdzaGlmdCkgPCBieXRlcGVyc2VjKQorCQkJZGItPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjLzEwMDApOworCQllbHNlCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gZGItPm9zc2ZyYWdzaGlmdDsKKwl9IGVsc2UgeworCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwLyhkYi0+c3ViZGl2aXNpb24gPyBkYi0+c3ViZGl2aXNpb24gOiAxKSk7CisJCWlmIChkYi0+ZnJhZ3NoaWZ0IDwgMykKKwkJCWRiLT5mcmFnc2hpZnQgPSAzOworCX0KKwlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl3aGlsZSAoZGItPm51bWZyYWcgPCA0ICYmIGRiLT5mcmFnc2hpZnQgPiAzKSB7CisJCWRiLT5mcmFnc2hpZnQtLTsKKwkJZGItPm51bWZyYWcgPSBidWZzID4+IGRiLT5mcmFnc2hpZnQ7CisJfQorCWRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKwlpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisJCWRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworIAkvKiB0byBtYWtlIGZyYWdzaXplID49IDQwOTYgKi8KKwlkYi0+ZnJhZ3NhbXBsZXMgPSBkYi0+ZnJhZ3NpemUgPj4gc2FtcGxlX3NoaWZ0W2ZtdF07CisJZGItPmRtYXNpemUgPSBkYi0+bnVtZnJhZyA8PCBkYi0+ZnJhZ3NoaWZ0OworCWRiLT5kbWFzYW1wbGVzID0gZGItPmRtYXNpemUgPj4gc2FtcGxlX3NoaWZ0W2ZtdF07CisJbWVtc2V0KGRiLT5yYXdidWYsIChmbXQgJiBDTV9DRk1UXzE2QklUKSA/IDAgOiAweDgwLCBkYi0+ZG1hc2l6ZSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAocmVjKSB7CisJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJICAgIHNldF9kbWFkYWMxKHMsIGRiLT5kbWFhZGRyLCBkYi0+ZG1hc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZm10XSk7CisJCWVsc2UKKwkJICAgIHNldF9kbWFhZGMocywgZGItPmRtYWFkZHIsIGRiLT5kbWFzaXplID4+IHNhbXBsZV9zaGlmdFtmbXRdKTsKKwkJLyogcHJvZ3JhbSBzYW1wbGUgY291bnRzICovCisJCXNldF9jb3VudGRhYyhzLCBkYi0+ZnJhZ3NhbXBsZXMpOworCX0gZWxzZSB7CisJCXNldF9kbWFkYWMocywgZGItPmRtYWFkZHIsIGRiLT5kbWFzaXplID4+IHNhbXBsZV9zaGlmdFtmbXRdKTsKKwkJLyogcHJvZ3JhbSBzYW1wbGUgY291bnRzICovCisJCXNldF9jb3VudGRhYyhzLCBkYi0+ZnJhZ3NhbXBsZXMpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJZGItPmVuYWJsZWQgPSAxOworCWRiLT5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9hZHZhbmNlKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBjaGFyIGMgPSAocy0+Zm10ICYgKENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9EQUNTSElGVCkpID8gMCA6IDB4ODA7CisJdW5zaWduZWQgY2hhciAqYnVmID0gcy0+ZG1hX2RhYy5yYXdidWY7CisJdW5zaWduZWQgY2hhciAqYnVmMSA9IHMtPmRtYV9hZGMucmF3YnVmOworCXVuc2lnbmVkIGJzaXplID0gcy0+ZG1hX2RhYy5kbWFzaXplOworCXVuc2lnbmVkIGJwdHIgPSBzLT5kbWFfZGFjLnN3cHRyOworCXVuc2lnbmVkIGxlbiA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisKKwlpZiAoYnB0ciArIGxlbiA+IGJzaXplKSB7CisJCXVuc2lnbmVkIHggPSBic2l6ZSAtIGJwdHI7CisJCW1lbXNldChidWYgKyBicHRyLCBjLCB4KTsKKwkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQkJbWVtc2V0KGJ1ZjEgKyBicHRyLCBjLCB4KTsKKwkJYnB0ciA9IDA7CisJCWxlbiAtPSB4OworCX0KKwltZW1zZXQoYnVmICsgYnB0ciwgYywgbGVuKTsKKwlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpCisJCW1lbXNldChidWYxICsgYnB0ciwgYywgbGVuKTsKK30KKworLyogY2FsbCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgdm9pZCBjbV91cGRhdGVfcHRyKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBod3B0cjsKKwlpbnQgZGlmZjsKKworCS8qIHVwZGF0ZSBBREMgcG9pbnRlciAqLworCWlmIChzLT5kbWFfYWRjLnJlYWR5KSB7CisJICAgIGlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkgICAgLyogdGhlIGRhYyBwYXJ0IHdpbGwgZmluaXNoIGZvciB0aGlzICovCisJICAgIH0gZWxzZSB7CisJCWh3cHRyID0gZ2V0X2RtYWFkYyhzKSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKwkJZGlmZiA9IChzLT5kbWFfYWRjLmRtYXNpemUgKyBod3B0ciAtIHMtPmRtYV9hZGMuaHdwdHIpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlzLT5kbWFfYWRjLmh3cHRyID0gaHdwdHI7CisJCXMtPmRtYV9hZGMudG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJcy0+ZG1hX2FkYy5jb3VudCArPSBkaWZmOworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQl3YWtlX3VwKCZzLT5kbWFfYWRjLndhaXQpOworCQlpZiAoIXMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtICgoMyAqIHMtPmRtYV9hZGMuZnJhZ3NpemUpID4+IDEpKSkgeworCQkJCXBhdXNlX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLmVycm9yKys7CisJCQl9CisJCX0KKwkgICAgfQorCX0KKwkvKiB1cGRhdGUgREFDIHBvaW50ZXIgKi8KKwlpZiAocy0+ZG1hX2RhYy5yZWFkeSkgeworCQlod3B0ciA9IGdldF9kbWFkYWMocykgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCWRpZmYgPSAocy0+ZG1hX2RhYy5kbWFzaXplICsgaHdwdHIgLSBzLT5kbWFfZGFjLmh3cHRyKSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJcy0+ZG1hX2RhYy5od3B0ciA9IGh3cHRyOworCQlzLT5kbWFfZGFjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkJcy0+ZG1hX2FkYy5od3B0ciA9IGh3cHRyOworCQkJcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQl9CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkgeworCQkJcy0+ZG1hX2RhYy5jb3VudCArPSBkaWZmOworCQkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQkJCXMtPmRtYV9hZGMuY291bnQgKz0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZzLT5kbWFfZGFjLndhaXQpOworCQl9IGVsc2UgeworCQkJcy0+ZG1hX2RhYy5jb3VudCAtPSBkaWZmOworCQkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQkJCXMtPmRtYV9hZGMuY291bnQgLT0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50IDw9IDApIHsKKwkJCQlwYXVzZV9kYWMocyk7CisJCQkJcy0+ZG1hX2RhYy5lcnJvcisrOworCQkJfSBlbHNlIGlmIChzLT5kbWFfZGFjLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSAmJiAhcy0+ZG1hX2RhYy5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzKTsKKwkJCQlzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAxOworCQkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJCQkJcy0+ZG1hX2FkYy5lbmRjbGVhcmVkID0gMTsKKwkJCX0KKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplIDw9IChzaWduZWQpcy0+ZG1hX2RhYy5kbWFzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMud2FpdCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjbV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IGNtX3N0YXRlICpzID0gKHN0cnVjdCBjbV9zdGF0ZSAqKWRldl9pZDsKKwl1bnNpZ25lZCBpbnQgaW50c3JjLCBpbnRzdGF0OworCXVuc2lnbmVkIGNoYXIgbWFzayA9IDA7CisKKwkvKiBmYXN0cGF0aCBvdXQsIHRvIGVhc2UgaW50ZXJydXB0IHNoYXJpbmcgKi8KKwlpbnRzcmMgPSBpbmwocy0+aW9iYXNlICsgQ09ERUNfQ01JX0lOVF9TVEFUVVMpOworCWlmICghKGludHNyYyAmIDB4ODAwMDAwMDApKQorCQlyZXR1cm4gSVJRX05PTkU7CisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwlpbnRzdGF0ID0gaW5iKHMtPmlvYmFzZSArIENPREVDX0NNSV9JTlRfSExEQ0xSICsgMik7CisJLyogYWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisJaWYgKGludHNyYyAmIEFEQ0lOVCkKKwkJbWFzayB8PSBFTkFEQ0lOVDsKKwlpZiAoaW50c3JjICYgREFDSU5UKQorCQltYXNrIHw9IEVOREFDSU5UOworCW91dGIoaW50c3RhdCAmIH5tYXNrLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfSU5UX0hMRENMUiArIDIpOworCW91dGIoaW50c3RhdCB8IG1hc2ssIHMtPmlvYmFzZSArIENPREVDX0NNSV9JTlRfSExEQ0xSICsgMik7CisJY21fdXBkYXRlX3B0cihzKTsKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX01JREkKKwlpZiAoaW50c3JjICYgMHgwMDAxMDAwMCkgewkvLyBVQVJUIGludGVycnVwdAorCQlpZiAocy0+bWlkaV9kZXZjICYmIGludGNoa19tcHU0MDEoKHZvaWQgKilzLT5taWRpX2RldmMpKQorCQkJbXB1aW50cihpcnEsICh2b2lkICopcy0+bWlkaV9kZXZjLCByZWdzKTsKKwkJZWxzZQorCQkJaW5iKHMtPmlvbWlkaSk7Ly8gZHVtbXkgcmVhZAorCX0KKyNlbmRpZgorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfbWFnaWNbXSA9IEtFUk5fQ1JJVCAiY21wY2k6IGludmFsaWQgbWFnaWMgdmFsdWVcbiI7CisKKyNkZWZpbmUgVkFMSURBVEVfU1RBVEUocykgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKCEocykgfHwgKHMpLT5tYWdpYyAhPSBDTV9NQUdJQykgeyBcCisJCXByaW50ayhpbnZhbGlkX21hZ2ljKTsgICAgICAgICAgICBcCisJCXJldHVybiAtRU5YSU87ICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTVRfNCAgICAgICAgICAxCisjZGVmaW5lIE1UXzVNVVRFICAgICAgMgorI2RlZmluZSBNVF80TVVURU1PTk8gIDMKKyNkZWZpbmUgTVRfNk1VVEUgICAgICA0CisjZGVmaW5lIE1UXzVNVVRFTU9OTyAgNQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBsZWZ0OworCXVuc2lnbmVkIHJpZ2h0OworCXVuc2lnbmVkIHR5cGU7CisJdW5zaWduZWQgcmVjOworCXVuc2lnbmVkIHBsYXk7Cit9IG1peHRhYmxlW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7CisJW1NPVU5EX01JWEVSX0NEXSAgICAgPSB7IERTUF9NSVhfQ0RWT0xJRFhfTCwgICAgIERTUF9NSVhfQ0RWT0xJRFhfUiwgICAgIE1UXzVNVVRFLCAgICAgMHgwNCwgMHgwNiB9LAorCVtTT1VORF9NSVhFUl9MSU5FXSAgID0geyBEU1BfTUlYX0xJTkVWT0xJRFhfTCwgICBEU1BfTUlYX0xJTkVWT0xJRFhfUiwgICBNVF81TVVURSwgICAgIDB4MTAsIDB4MTggfSwKKwlbU09VTkRfTUlYRVJfTUlDXSAgICA9IHsgRFNQX01JWF9NSUNWT0xJRFgsICAgICAgRFNQX01JWF9NSUNWT0xJRFgsICAgICAgTVRfNU1VVEVNT05PLCAweDAxLCAweDAxIH0sCisJW1NPVU5EX01JWEVSX1NZTlRIXSAgPSB7IERTUF9NSVhfRk1WT0xJRFhfTCwgIAkgRFNQX01JWF9GTVZPTElEWF9SLCAgICAgTVRfNU1VVEUsICAgICAweDQwLCAweDAwIH0sCisJW1NPVU5EX01JWEVSX1ZPTFVNRV0gPSB7IERTUF9NSVhfTUFTVEVSVk9MSURYX0wsIERTUF9NSVhfTUFTVEVSVk9MSURYX1IsIE1UXzVNVVRFLCAgICAgMHgwMCwgMHgwMCB9LAorCVtTT1VORF9NSVhFUl9QQ01dICAgID0geyBEU1BfTUlYX1ZPSUNFVk9MSURYX0wsICBEU1BfTUlYX1ZPSUNFVk9MSURYX1IsICBNVF81TVVURSwgICAgIDB4MDAsIDB4MDAgfSwKKwlbU09VTkRfTUlYRVJfTElORTFdICA9IHsgRFNQX01JWF9BVVhWT0xfTCwgICAgICAgRFNQX01JWF9BVVhWT0xfUiwgICAgICAgTVRfNU1VVEUsICAgICAweDgwLCAweDYwIH0sCisJW1NPVU5EX01JWEVSX1NQRUFLRVJdPSB7IERTUF9NSVhfU1BLUlZPTElEWCwJIERTUF9NSVhfU1BLUlZPTElEWCwJIE1UXzVNVVRFTU9OTywgMHgwMCwgMHgwMSB9Cit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB2b2xpZHhbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9Cit7CisJW1NPVU5EX01JWEVSX0NEXSAgICAgPSAxLAorCVtTT1VORF9NSVhFUl9MSU5FXSAgID0gMiwKKwlbU09VTkRfTUlYRVJfTUlDXSAgICA9IDMsCisJW1NPVU5EX01JWEVSX1NZTlRIXSAgPSA0LAorCVtTT1VORF9NSVhFUl9WT0xVTUVdID0gNSwKKwlbU09VTkRfTUlYRVJfUENNXSAgICA9IDYsCisJW1NPVU5EX01JWEVSX0xJTkUxXSAgPSA3LAorCVtTT1VORF9NSVhFUl9TUEVBS0VSXT0gOAorfTsKKworc3RhdGljIHVuc2lnbmVkIG1peGVyX291dG1hc2soc3RydWN0IGNtX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIGosIGs7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWogPSByZG1peGVyKHMsIERTUF9NSVhfT1VUTUlYSURYKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJZm9yIChrID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJaWYgKGogJiBtaXh0YWJsZVtpXS5wbGF5KQorCQkJayB8PSAxIDw8IGk7CisJcmV0dXJuIGs7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBtaXhlcl9yZWNtYXNrKHN0cnVjdCBjbV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpLCBqLCBrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlqID0gcmRtaXhlcihzLCBEU1BfTUlYX0FEQ01JWElEWF9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJZm9yIChrID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJaWYgKGogJiBtaXh0YWJsZVtpXS5yZWMpCisJCQlrIHw9IDEgPDwgaTsKKwlyZXR1cm4gazsKK30KKworc3RhdGljIGludCBtaXhlcl9pb2N0bChzdHJ1Y3QgY21fc3RhdGUgKnMsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIHZhbCwgajsKKwl1bnNpZ25lZCBjaGFyIGwsIHIsIHJsLCBycjsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworICAgICAgICBpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKKwkJbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCXN0cmxjcHkoaW5mby5pZCwgImNtcGNpIiwgc2l6ZW9mKGluZm8uaWQpKTsKKwkJc3RybGNweShpbmZvLm5hbWUsICJDLU1lZGlhIFBDSSIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaW5mby5tb2RpZnlfY291bnRlciA9IHMtPm1peC5tb2RjbnQ7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjbWQgPT0gU09VTkRfT0xEX01JWEVSX0lORk8pIHsKKwkJX29sZF9taXhlcl9pbmZvIGluZm87CisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJc3RybGNweShpbmZvLmlkLCAiY21wY2kiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgIkMtTWVkaWEgY21wY2kiLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjbWQgPT0gT1NTX0dFVFZFUlNJT04pCisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKwlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ00nIHx8IF9TSU9DX1NJWkUoY21kKSAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgaWYgKF9TSU9DX0RJUihjbWQpID09IF9TSU9DX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJdmFsID0gbWl4ZXJfcmVjbWFzayhzKTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlICovCisJCQl2YWwgPSBtaXhlcl9vdXRtYXNrKHMpOworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgZGV2aWNlICovCisJCQlmb3IgKHZhbCA9IGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspCisJCQkJaWYgKG1peHRhYmxlW2ldLnR5cGUpCisJCQkJCXZhbCB8PSAxIDw8IGk7CisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzogLyogQXJnIGNvbnRhaW5zIGEgYml0IGZvciBlYWNoIHN1cHBvcnRlZCByZWNvcmRpbmcgc291cmNlICovCisJCQlmb3IgKHZhbCA9IGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspCisJCQkJaWYgKG1peHRhYmxlW2ldLnJlYykKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9PVVRNQVNLOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgKi8KKwkJCWZvciAodmFsID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCQlpZiAobWl4dGFibGVbaV0ucGxheSkKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisgICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogLyogTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gKi8KKwkJCWZvciAodmFsID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCQlpZiAobWl4dGFibGVbaV0udHlwZSAmJiBtaXh0YWJsZVtpXS50eXBlICE9IE1UXzRNVVRFTU9OTykKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJCWRlZmF1bHQ6CisJCQlpID0gX0lPQ19OUihjbWQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICFtaXh0YWJsZVtpXS50eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghdm9saWR4W2ldKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbdm9saWR4W2ldLTFdLCBwKTsKKwkJfQorCX0KKyAgICAgICAgaWYgKF9TSU9DX0RJUihjbWQpICE9IChfU0lPQ19SRUFEfF9TSU9DX1dSSVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcy0+bWl4Lm1vZGNudCsrOworCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWkgPSBnZW5lcmljX2h3ZWlnaHQzMih2YWwpOworCQlmb3IgKGogPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7CisJCQlpZiAoISh2YWwgJiAoMSA8PCBpKSkpCisJCQkJY29udGludWU7CisJCQlpZiAoIW1peHRhYmxlW2ldLnJlYykgeworCQkJCXZhbCAmPSB+KDEgPDwgaSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlqIHw9IG1peHRhYmxlW2ldLnJlYzsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQl3cm1peGVyKHMsIERTUF9NSVhfQURDTUlYSURYX0wsIGopOworCQl3cm1peGVyKHMsIERTUF9NSVhfQURDTUlYSURYX1IsIChqICYgMSkgfCAoaj4+MSkgfCAoaiAmIDB4ODApKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlmb3IgKGogPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7CisJCQlpZiAoISh2YWwgJiAoMSA8PCBpKSkpCisJCQkJY29udGludWU7CisJCQlpZiAoIW1peHRhYmxlW2ldLnBsYXkpIHsKKwkJCQl2YWwgJj0gfigxIDw8IGkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaiB8PSBtaXh0YWJsZVtpXS5wbGF5OworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXdybWl4ZXIocywgRFNQX01JWF9PVVRNSVhJRFgsIGopOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJaSA9IF9JT0NfTlIoY21kKTsKKwkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICFtaXh0YWJsZVtpXS50eXBlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlyID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWlmIChsID4gMTAwKQorCQkJbCA9IDEwMDsKKwkJaWYgKHIgPiAxMDApCisJCQlyID0gMTAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzd2l0Y2ggKG1peHRhYmxlW2ldLnR5cGUpIHsKKwkJY2FzZSBNVF80OgorCQkJaWYgKGwgPj0gMTApCisJCQkJbCAtPSAxMDsKKwkJCWlmIChyID49IDEwKQorCQkJCXIgLT0gMTA7CisJCQlmcm9iaW5kaXIocywgbWl4dGFibGVbaV0ubGVmdCwgMHhmMCwgbCAvIDYpOworCQkJZnJvYmluZGlyKHMsIG1peHRhYmxlW2ldLnJpZ2h0LCAweGYwLCBsIC8gNik7CisJCQlicmVhazsKKworCQljYXNlIE1UXzRNVVRFTU9OTzoKKwkJCXJsID0gKGwgPCA0ID8gMCA6IChsIC0gNSkgLyAzKSAmIDMxOworCQkJcnIgPSAocmwgPj4gMikgJiA3OworCQkJd3JtaXhlcihzLCBtaXh0YWJsZVtpXS5sZWZ0LCBybDw8Myk7CisJCQlpZiAoaSA9PSBTT1VORF9NSVhFUl9NSUMpCisJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMiwgfjB4MGUsIHJyPDwxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTVRfNU1VVEVNT05POgorCQkJcmwgPSBsIDwgNCA/IDAgOiAobCAtIDUpIC8gMzsKKyAJCQl3cm1peGVyKHMsIG1peHRhYmxlW2ldLmxlZnQsIHJsPDwzKTsKKwkJCWwgPSByZG1peGVyKHMsIERTUF9NSVhfT1VUTUlYSURYKSAmIH5taXh0YWJsZVtpXS5wbGF5OworCQkJciA9IHJsID8gbWl4dGFibGVbaV0ucGxheSA6IDA7CisJCQl3cm1peGVyKHMsIERTUF9NSVhfT1VUTUlYSURYLCBsIHwgcik7CisJCQkvKiBmb3IgcmVjb3JkaW5nICovCisJCQlpZiAoaSA9PSBTT1VORF9NSVhFUl9NSUMpIHsKKwkJCQlpZiAocy0+Y2hpcF92ZXJzaW9uID49IDM3KSB7CisJCQkJCXJyID0gcmwgPj4gMTsKKwkJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JWEVSMiwgfjB4MGUsIChyciYweDA3KTw8MSk7CisJCQkJCWZyb2JpbmRpcihzLCBEU1BfTUlYX0VYVEVOU0lPTiwgfjB4MDEsIHJyPj4zKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyciA9IHJsID4+IDI7CisJCQkJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVhFUjIsIH4weDBlLCBycjw8MSk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNVF81TVVURToKKwkJCXJsID0gbCA8IDQgPyAwIDogKGwgLSA1KSAvIDM7CisJCQlyciA9IHIgPCA0ID8gMCA6IChyIC0gNSkgLyAzOworIAkJCXdybWl4ZXIocywgbWl4dGFibGVbaV0ubGVmdCwgcmw8PDMpOworCQkJd3JtaXhlcihzLCBtaXh0YWJsZVtpXS5yaWdodCwgcnI8PDMpOworCQkJbCA9IHJkbWl4ZXIocywgRFNQX01JWF9PVVRNSVhJRFgpOworCQkJbCAmPSB+bWl4dGFibGVbaV0ucGxheTsKKwkJCXIgPSAocmx8cnIpID8gbWl4dGFibGVbaV0ucGxheSA6IDA7CisJCQl3cm1peGVyKHMsIERTUF9NSVhfT1VUTUlYSURYLCBsIHwgcik7CisJCQlicmVhazsKKworCQljYXNlIE1UXzZNVVRFOgorCQkJaWYgKGwgPCA2KQorCQkJCXJsID0gMHgwMDsKKwkJCWVsc2UKKwkJCQlybCA9IGwgKiAyIC8gMzsKKwkJCWlmIChyIDwgNikKKwkJCQlyciA9IDB4MDA7CisJCQllbHNlCisJCQkJcnIgPSByICogMiAvIDM7CisJCQl3cm1peGVyKHMsIG1peHRhYmxlW2ldLmxlZnQsIHJsKTsKKwkJCXdybWl4ZXIocywgbWl4dGFibGVbaV0ucmlnaHQsIHJyKTsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoIXZvbGlkeFtpXSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzLT5taXgudm9sW3ZvbGlkeFtpXS0xXSA9IHZhbDsKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbdm9saWR4W2ldLTFdLCBwKTsKKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGNtX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgY21fc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGNtX3N0YXRlLCBkZXZzKTsKKwkJaWYgKHMtPmRldl9taXhlciA9PSBtaW5vcikKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgY21fcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNtX3N0YXRlICpzID0gKHN0cnVjdCBjbV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNtX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIG1peGVyX2lvY3RsKChzdHJ1Y3QgY21fc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGEsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNtX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJID0gbm9fbGxzZWVrLAorCS5pb2N0bAkgPSBjbV9pb2N0bF9taXhkZXYsCisJLm9wZW4JID0gY21fb3Blbl9taXhkZXYsCisJLnJlbGVhc2UgPSBjbV9yZWxlYXNlX21peGRldiwKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50LCB0bW87CisKKwlpZiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwgIXMtPmRtYV9kYWMucmVhZHkpCisJCXJldHVybiAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9kYWMuY291bnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobm9uYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICAgICAgICAgIH0KKwkJdG1vID0gMyAqIEhaICogKGNvdW50ICsgcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgLyAyIC8gcy0+cmF0ZWRhYzsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPmZtdCA+PiBDTV9DRk1UX0RBQ1NISUZUKSAmIENNX0NGTVRfTUFTS107CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gKyAxKSkKKwkJCURCRyhwcmludGsoS0VSTl9ERUJVRyAiY21wY2k6IGRtYSB0aW1lZCBvdXQ/P1xuIik7KQorICAgICAgICB9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNzaXplX3QgY21fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGNtX3N0YXRlICpzID0gKHN0cnVjdCBjbV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2FkYy53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzd3B0ciA9IHMtPmRtYV9hZGMuc3dwdHI7CisJCWNudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZS1zd3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMuY291bnQgPCBjbnQpCisJCQljbnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoY250IDw9IDApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKKwkJCQlzdGFydF9hZGMocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWlmICghc2NoZWR1bGVfdGltZW91dChIWikpIHsKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAiY21wY2k6IHJlYWQ6IGNoaXAgbG9ja3VwPyBkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCisJCQkJICAgICAgIHMtPmRtYV9hZGMuZG1hc2l6ZSwgcy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcy0+ZG1hX2FkYy5jb3VudCwKKwkJCQkgICAgICAgcy0+ZG1hX2FkYy5od3B0ciwgcy0+ZG1hX2FkYy5zd3B0cik7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlzdG9wX2FkY191bmxvY2tlZChzKTsKKwkJCQlzZXRfZG1hYWRjKHMsIHMtPmRtYV9hZGMuZG1hYWRkciwgcy0+ZG1hX2FkYy5kbWFzYW1wbGVzKTsKKwkJCQkvKiBwcm9ncmFtIHNhbXBsZSBjb3VudHMgKi8KKwkJCQlzZXRfY291bnRhZGMocywgcy0+ZG1hX2FkYy5mcmFnc2FtcGxlcyk7CisJCQkJcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMuaHdwdHIgPSBzLT5kbWFfYWRjLnN3cHRyID0gMDsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKHMtPnN0YXR1cyAmIERPX0JJR0VORElBTl9SKSB7CisJCQlpbnQJaSwgZXJyOworCQkJdW5zaWduZWQgY2hhciAqc3JjOworCQkJY2hhciBfX3VzZXIgKmRzdCA9IGJ1ZmZlcjsKKwkJCXVuc2lnbmVkIGNoYXIgZGF0YVsyXTsKKworCQkJc3JjID0gKHVuc2lnbmVkIGNoYXIgKikgKHMtPmRtYV9hZGMucmF3YnVmICsgc3dwdHIpOworCQkJLy8gY29weSBsZWZ0L3JpZ2h0IHNhbXBsZSBhdCBvbmUgdGltZQorCQkJZm9yIChpID0gMDsgaSA8IGNudCAvIDI7IGkrKykgeworCQkJCWRhdGFbMF0gPSBzcmNbMV07CisJCQkJZGF0YVsxXSA9IHNyY1swXTsKKwkJCQlpZiAoKGVyciA9IF9fcHV0X3VzZXIoZGF0YVswXSwgZHN0KyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fcHV0X3VzZXIoZGF0YVsxXSwgZHN0KyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlzcmMgKz0gMjsKKwkJCX0KKwkJfSBlbHNlIGlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfYWRjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9hZGMuY291bnQgLT0gY250OworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWlmIChzLT5kbWFfYWRjLmVuYWJsZWQpCisJCQlzdGFydF9hZGNfdW5sb2NrZWQocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl9CitvdXQ6CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGNtX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgY21fc3RhdGUgKnMgPSAoc3RydWN0IGNtX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCQlyZXR1cm4gLUVOWElPOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDEpKSkKKwkJCXJldHVybiByZXQ7CisJfQorCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA8IDApIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgPSAwOworCQkJcy0+ZG1hX2RhYy5zd3B0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCX0KKwkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSB7CisJCQlzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKwkJCXMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQkJcy0+ZG1hX2FkYy5lbmRjbGVhcmVkID0gcy0+ZG1hX2RhYy5lbmRjbGVhcmVkOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+c3RhdHVzICYgRE9fQUMzX1NXKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCArIDIgKiBjbnQgPiBzLT5kbWFfZGFjLmRtYXNpemUpCisJCQkJY250ID0gKHMtPmRtYV9kYWMuZG1hc2l6ZSAtIHMtPmRtYV9kYWMuY291bnQpIC8gMjsKKwkJfSBlbHNlIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ICsgY250ID4gcy0+ZG1hX2RhYy5kbWFzaXplKQorCQkJCWNudCA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIHMtPmRtYV9kYWMuY291bnQ7CisJCX0KKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSAmJiAoY250ID4gY291bnQgLyAyKSkKKwkJICAgIGNudCA9IGNvdW50IC8gMjsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5lbmFibGVkKQorCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KEhaKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJjbXBjaTogd3JpdGU6IGNoaXAgbG9ja3VwPyBkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCisJCQkJICAgICAgIHMtPmRtYV9kYWMuZG1hc2l6ZSwgcy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcy0+ZG1hX2RhYy5jb3VudCwKKwkJCQkgICAgICAgcy0+ZG1hX2RhYy5od3B0ciwgcy0+ZG1hX2RhYy5zd3B0cik7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlzdG9wX2RhY191bmxvY2tlZChzKTsKKwkJCQlzZXRfZG1hZGFjKHMsIHMtPmRtYV9kYWMuZG1hYWRkciwgcy0+ZG1hX2RhYy5kbWFzYW1wbGVzKTsKKwkJCQkvKiBwcm9ncmFtIHNhbXBsZSBjb3VudHMgKi8KKwkJCQlzZXRfY291bnRkYWMocywgcy0+ZG1hX2RhYy5mcmFnc2FtcGxlcyk7CisJCQkJcy0+ZG1hX2RhYy5jb3VudCA9IHMtPmRtYV9kYWMuaHdwdHIgPSBzLT5kbWFfZGFjLnN3cHRyID0gMDsKKwkJCQlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpICB7CisJCQkJCXNldF9kbWFkYWMxKHMsIHMtPmRtYV9hZGMuZG1hYWRkciwgcy0+ZG1hX2FkYy5kbWFzYW1wbGVzKTsKKwkJCQkJcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMuaHdwdHIgPSBzLT5kbWFfYWRjLnN3cHRyID0gMDsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzLT5zdGF0dXMgJiBET19BQzNfU1cpIHsKKwkJCWludCBlcnI7CisKKwkJCS8vIGNsaXAgZXhjZWVkZWQgZGF0YSwgY2F1Z2h0IGJ5IDAzMyBhbmQgMDM3CisJCQlpZiAoc3dwdHIgKyAyICogY250ID4gcy0+ZG1hX2RhYy5kbWFzaXplKQorCQkJCWNudCA9IChzLT5kbWFfZGFjLmRtYXNpemUgLSBzd3B0cikgLyAyOworCQkJaWYgKChlcnIgPSB0cmFuc19hYzMocywgcy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSkgeworCQkJCXJldCA9IGVycjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXN3cHRyID0gKHN3cHRyICsgMiAqIGNudCkgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCX0gZWxzZSBpZiAoKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSAmJiAocy0+c3RhdHVzICYgRE9fQklHRU5ESUFOX1cpKSB7CisJCQlpbnQJaSwgZXJyOworCQkJY29uc3QgY2hhciBfX3VzZXIgKnNyYyA9IGJ1ZmZlcjsKKwkJCXVuc2lnbmVkIGNoYXIgKmRzdDAsICpkc3QxOworCQkJdW5zaWduZWQgY2hhciBkYXRhWzhdOworCisJCQlkc3QwID0gKHVuc2lnbmVkIGNoYXIgKikgKHMtPmRtYV9kYWMucmF3YnVmICsgc3dwdHIpOworCQkJZHN0MSA9ICh1bnNpZ25lZCBjaGFyICopIChzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyKTsKKwkJCS8vIGNvcHkgbGVmdC9yaWdodCBzYW1wbGUgYXQgb25lIHRpbWUKKwkJCWZvciAoaSA9IDA7IGkgPCBjbnQgLyA0OyBpKyspIHsKKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVswXSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVsxXSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVsyXSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVszXSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVs0XSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVs1XSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVs2XSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlpZiAoKGVyciA9IF9fZ2V0X3VzZXIoZGF0YVs3XSwgc3JjKyspKSkgeworCQkJCQlyZXQgPSBlcnI7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQlkc3QwWzBdID0gZGF0YVsxXTsKKwkJCQlkc3QwWzFdID0gZGF0YVswXTsKKwkJCQlkc3QwWzJdID0gZGF0YVszXTsKKwkJCQlkc3QwWzNdID0gZGF0YVsyXTsKKwkJCQlkc3QxWzBdID0gZGF0YVs1XTsKKwkJCQlkc3QxWzFdID0gZGF0YVs0XTsKKwkJCQlkc3QxWzJdID0gZGF0YVs3XTsKKwkJCQlkc3QxWzNdID0gZGF0YVs2XTsKKwkJCQlkc3QwICs9IDQ7CisJCQkJZHN0MSArPSA0OworCQkJfQorCQkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYy5kbWFzaXplOworCQl9IGVsc2UgaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSB7CisJCQlpbnQJaSwgZXJyOworCQkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKnNyYyA9ICh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBidWZmZXI7CisJCQl1bnNpZ25lZCBsb25nICpkc3QwLCAqZHN0MTsKKworCQkJZHN0MCA9ICh1bnNpZ25lZCBsb25nICopIChzLT5kbWFfZGFjLnJhd2J1ZiArIHN3cHRyKTsKKwkJCWRzdDEgPSAodW5zaWduZWQgbG9uZyAqKSAocy0+ZG1hX2FkYy5yYXdidWYgKyBzd3B0cik7CisJCQkvLyBjb3B5IGxlZnQvcmlnaHQgc2FtcGxlIGF0IG9uZSB0aW1lCisJCQlmb3IgKGkgPSAwOyBpIDwgY250IC8gNDsgaSsrKSB7CisJCQkJaWYgKChlcnIgPSBfX2dldF91c2VyKCpkc3QwKyssIHNyYysrKSkpIHsKKwkJCQkJcmV0ID0gZXJyOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQkJaWYgKChlcnIgPSBfX2dldF91c2VyKCpkc3QxKyssIHNyYysrKSkpIHsKKwkJCQkJcmV0ID0gZXJyOworCQkJCQlnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCX0gZWxzZSBpZiAocy0+c3RhdHVzICYgRE9fQklHRU5ESUFOX1cpIHsKKwkJCWludAlpLCBlcnI7CisJCQljb25zdCBjaGFyIF9fdXNlciAqc3JjID0gYnVmZmVyOworCQkJdW5zaWduZWQgY2hhciAqZHN0OworCQkJdW5zaWduZWQgY2hhciBkYXRhWzJdOworCisJCQlkc3QgPSAodW5zaWduZWQgY2hhciAqKSAocy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0cik7CisJCQkvLyBzd2FwIGhpL2xvIGJ5dGVzIGZvciBlYWNoIHNhbXBsZQorCQkJZm9yIChpID0gMDsgaSA8IGNudCAvIDI7IGkrKykgeworCQkJCWlmICgoZXJyID0gX19nZXRfdXNlcihkYXRhWzBdLCBzcmMrKykpKSB7CisJCQkJCXJldCA9IGVycjsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWlmICgoZXJyID0gX19nZXRfdXNlcihkYXRhWzFdLCBzcmMrKykpKSB7CisJCQkJCXJldCA9IGVycjsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJCWRzdFswXSA9IGRhdGFbMV07CisJCQkJZHN0WzFdID0gZGF0YVswXTsKKwkJCQlkc3QgKz0gMjsKKwkJCX0KKwkJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihzLT5kbWFfZGFjLnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfZGFjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9kYWMuY291bnQgKz0gY250OworCQlpZiAocy0+c3RhdHVzICYgRE9fQUMzX1NXKQorCQkJcy0+ZG1hX2RhYy5jb3VudCArPSBjbnQ7CisJCXMtPmRtYV9kYWMuZW5kY2xlYXJlZCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpIHsKKwkJCWNvdW50IC09IGNudDsKKwkJCWJ1ZmZlciArPSBjbnQ7CisJCQlyZXQgKz0gY250OworCQl9CisJCWlmIChzLT5kbWFfZGFjLmVuYWJsZWQpCisJCQlzdGFydF9kYWMocyk7CisJfQorb3V0OgorICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNtX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgY21fc3RhdGUgKnMgPSAoc3RydWN0IGNtX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1ZihzLCAwKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1ZihzLCAxKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJY21fdXBkYXRlX3B0cihzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9IGVsc2UgeworCQkJaWYgKChzaWduZWQpcy0+ZG1hX2RhYy5kbWFzaXplID49IHMtPmRtYV9kYWMuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgY21fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGNtX3N0YXRlICpzID0gKHN0cnVjdCBjbV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAwKSkgIT0gMCkKKwkJCWdvdG8gb3V0OworCQlkYiA9ICZzLT5kbWFfZGFjOworCX0gZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAxKSkgIT0gMCkKKwkJCWdvdG8gb3V0OworCQlkYiA9ICZzLT5kbWFfYWRjOworCX0gZWxzZQorCQlnb3RvIG91dDsKKwlyZXQgPSAtRUlOVkFMOworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCisJCWdvdG8gb3V0OworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikpCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJdmlydF90b19waHlzKGRiLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlnb3RvIG91dDsKKwlkYi0+bWFwcGVkID0gMTsKKwlyZXQgPSAwOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFNORENUTF9TUERJRl9DT1BZUklHSFQJX1NJT1coJ1MnLCAgMCwgaW50KSAgICAgICAvLyBzZXQvcmVzZXQgUy9QRElGIGNvcHkgcHJvdGVjdGlvbgorI2RlZmluZSBTTkRDVExfU1BESUZfTE9PUAlfU0lPVygnUycsICAxLCBpbnQpICAgICAgIC8vIHNldC9yZXNldCBTL1BESUYgbG9vcAorI2RlZmluZSBTTkRDVExfU1BESUZfTU9OSVRPUglfU0lPVygnUycsICAyLCBpbnQpICAgICAgIC8vIHNldCBTL1BESUYgbW9uaXRvcgorI2RlZmluZSBTTkRDVExfU1BESUZfTEVWRUwJX1NJT1coJ1MnLCAgMywgaW50KSAgICAgICAvLyBzZXQvcmVzZXQgUy9QRElGIG91dCBsZXZlbAorI2RlZmluZSBTTkRDVExfU1BESUZfSU5WCV9TSU9XKCdTJywgIDQsIGludCkgICAgICAgLy8gc2V0L3Jlc2V0IFMvUERJRiBpbiBpbnZlcnNlCisjZGVmaW5lIFNORENUTF9TUERJRl9TRUwyCV9TSU9XKCdTJywgIDUsIGludCkgICAgICAgLy8gc2V0IFMvUERJRiBpbiAjMgorI2RlZmluZSBTTkRDVExfU1BESUZfVkFMSUQJX1NJT1coJ1MnLCAgNiwgaW50KSAgICAgICAvLyBzZXQgUy9QRElGIHZhbGlkCisjZGVmaW5lIFNORENUTF9TUERJRk9VVAkJX1NJT1coJ1MnLCAgNywgaW50KSAgICAgICAvLyBzZXQgUy9QRElGIG91dAorI2RlZmluZSBTTkRDVExfU1BESUZJTgkJX1NJT1coJ1MnLCAgOCwgaW50KSAgICAgICAvLyBzZXQgUy9QRElGIG91dAorCitzdGF0aWMgaW50IGNtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY21fc3RhdGUgKnMgPSAoc3RydWN0IGNtX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKyAgICAgICAgY291bnRfaW5mbyBjaW5mbzsKKwlpbnQgdmFsLCBtYXBwZWQsIHJldDsKKwl1bnNpZ25lZCBjaGFyIGZtdG0sIGZtdGQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAgbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYy5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywgMC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sqLyk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCB8IERTUF9DQVBfQklORCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfZGFjLnN3cHRyID0gcy0+ZG1hX2RhYy5od3B0ciA9IHMtPmRtYV9kYWMuY291bnQgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzID0gMDsKKwkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJCQlzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2FkYy5od3B0ciA9IHMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0gcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPSAwOworCQl9CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJIAlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCXN0b3BfYWRjX3VubG9ja2VkKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCXNldF9hZGNfcmF0ZV91bmxvY2tlZChzLCB2YWwpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJc2V0X2RhY19yYXRlKHMsIHZhbCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlmbXRkID0gMDsKKwkJZm10bSA9IH4wOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCWlmICh2YWwpCisJCQkJZm10ZCB8PSBDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUOworCQkJZWxzZQorCQkJCWZtdG0gJj0gfihDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQlpZiAodmFsKQorCQkJCWZtdGQgfD0gQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9EQUNTSElGVDsKKwkJCWVsc2UKKwkJCQlmbXRtICY9IH4oQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9EQUNTSElGVCk7CisJCQlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpIHsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsKQorCQkJCQlmbXRkIHw9IENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfQURDU0hJRlQ7CisJCQkJZWxzZQorCQkJCQlmbXRtICY9IH4oQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9BRENTSElGVCk7CisJCQl9CisJCX0KKwkJc2V0X2ZtdChzLCBmbXRtLCBmbXRkKTsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWZtdGQgPSAwOworCQkJZm10bSA9IH4wOworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsID49IDIpCisJCQkJCWZtdGQgfD0gQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9BRENTSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJZm10ZCB8PSBDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0RBQ1NISUZUOworCQkJCWVsc2UKKwkJCQkJZm10bSAmPSB+KENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfREFDU0hJRlQpOworCQkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQkJZm10ZCB8PSBDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUOworCQkJCQllbHNlCisJCQkJCQlmbXRtICY9IH4oQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9BRENTSElGVCk7CisJCQkJfQorCQkJfQorCQkJc2V0X2ZtdChzLCBmbXRtLCBmbXRkKTsKKwkJCWlmICgocy0+Y2FwYWJpbGl0eSAmIENBTl9NVUxUSV9DSCkKKwkJCSAgICAgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgeworCQkJCXZhbCA9IHNldF9kYWNfY2hhbm5lbHMocywgdmFsKTsKKwkJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPmZtdCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyAoQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9BRENTSElGVCkKKwkJCQkJICAgOiAoQ01fQ0ZNVF9TVEVSRU8gPDwgQ01fQ0ZNVF9EQUNTSElGVCkpKSA/IDIgOiAxLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9CRXxBRk1UX1MxNl9MRXxBRk1UX1U4fAorCQkJKChzLT5jYXBhYmlsaXR5ICYgQ0FOX0FDMykgPyBBRk1UX0FDMyA6IDApLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJZm10ZCA9IDA7CisJCQlmbXRtID0gfjA7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfQkUgfHwgdmFsID09IEFGTVRfUzE2X0xFKQorCQkJCQlmbXRkIHw9IENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9BRENTSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihDTV9DRk1UXzE2QklUIDw8IENNX0NGTVRfQURDU0hJRlQpOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfQkUpCisJCQkJCXMtPnN0YXR1cyB8PSBET19CSUdFTkRJQU5fUjsKKwkJCQllbHNlCisJCQkJCXMtPnN0YXR1cyAmPSB+RE9fQklHRU5ESUFOX1I7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsID09IEFGTVRfUzE2X0JFIHx8IHZhbCA9PSBBRk1UX1MxNl9MRSB8fCB2YWwgPT0gQUZNVF9BQzMpCisJCQkJCWZtdGQgfD0gQ01fQ0ZNVF8xNkJJVCA8PCBDTV9DRk1UX0RBQ1NISUZUOworCQkJCWVsc2UKKwkJCQkJZm10bSAmPSB+KENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9EQUNTSElGVCk7CisJCQkJaWYgKHZhbCA9PSBBRk1UX0FDMykgeworCQkJCQlmbXRkIHw9IENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfREFDU0hJRlQ7CisJCQkJCXNldF9hYzMocywgNDgwMDApOworCQkJCX0gZWxzZQorCQkJCQlzZXRfYWMzKHMsIDApOworCQkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9CRSB8fCB2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCQlmbXRkIHw9IENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfQURDU0hJRlQ7CisJCQkJCWVsc2UKKwkJCQkJCWZtdG0gJj0gfihDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUKTsKKwkJCQl9CisJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9CRSkKKwkJCQkJcy0+c3RhdHVzIHw9IERPX0JJR0VORElBTl9XOworCQkJCWVsc2UKKwkJCQkJcy0+c3RhdHVzICY9IH5ET19CSUdFTkRJQU5fVzsKKwkJCX0KKwkJCXNldF9mbXQocywgZm10bSwgZm10ZCk7CisJCX0KKwkJaWYgKHMtPnN0YXR1cyAmIERPX0FDMykgcmV0dXJuIHB1dF91c2VyKEFGTVRfQUMzLCBwKTsKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9BRENTSElGVCkKKwkJCQkJICAgOiAoQ01fQ0ZNVF8xNkJJVCA8PCBDTV9DRk1UX0RBQ1NISUZUKSkpID8gdmFsIDogQUZNVF9VOCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKwkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYKKwkJCSAocy0+ZW5hYmxlICYgRU5EQUMpICYmCisJCQkgKHMtPmVuYWJsZSAmIEVOQURDKSkKKwkJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5lbmFibGUgJiBFTkFEQykKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZW5hYmxlICYgRU5EQUMpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMSkpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDE7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJfSBlbHNlIHsKKwkJCQlzLT5kbWFfYWRjLmVuYWJsZWQgPSAwOworCQkJCXN0b3BfYWRjKHMpOworCQkJfQorCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCQkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAwKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKSB7CisJCQkJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMSkpKQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQkJcy0+ZG1hX2RhYy5lbmFibGVkID0gMTsKKwkJCQlzdGFydF9kYWMocyk7CisJCQl9IGVsc2UgeworCQkJCXMtPmRtYV9kYWMuZW5hYmxlZCA9IDA7CisJCQkJc3RvcF9kYWMocyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCEocy0+ZW5hYmxlICYgRU5EQUMpICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAwKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNtX3VwZGF0ZV9wdHIocyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gcy0+ZG1hX2RhYy5jb3VudDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMubnVtZnJhZzsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIShzLT5lbmFibGUgJiBFTkFEQykgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHMsIDEpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY21fdXBkYXRlX3B0cihzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZTsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLmNvdW50OworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisgICAgICAgICAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljbV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIHZhbCA9IHMtPmRtYV9kYWMuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNtX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IHMtPmRtYV9hZGMuY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSBzLT5kbWFfYWRjLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgID8gLUVGQVVMVCA6IDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljbV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlczsKKyAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBzLT5kbWFfZGFjLmNvdW50ID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJCXMtPmRtYV9kYWMuY291bnQgJj0gcy0+ZG1hX2RhYy5mcmFnc2l6ZS0xOworCQlpZiAocy0+c3RhdHVzICYgRE9fRFVBTF9EQUMpIHsKKwkJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCQlzLT5kbWFfYWRjLmNvdW50ICY9IHMtPmRtYV9hZGMuZnJhZ3NpemUtMTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAwKSkpCisJCQkJcmV0dXJuIHZhbDsKKwkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkJCWlmICgodmFsID0gcHJvZ19kbWFidWYocywgMSkpKQorCQkJCQlyZXR1cm4gdmFsOworCQkJCXJldHVybiBwdXRfdXNlcigyICogcy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcCk7CisJCQl9CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcCk7CisJCX0KKwkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCQlyZXR1cm4gdmFsOworCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IDQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJCWlmIChzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSA0OworCQkJaWYgKHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJCWlmIChzLT5kbWFfZGFjLm9zc21heGZyYWdzIDwgNCkKKwkJCQlzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gNDsKKwkJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykgeworCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQ7CisJCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3M7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24pIHx8CisJCSAgICAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gdmFsOworCQkJaWYgKHMtPnN0YXR1cyAmIERPX0RVQUxfREFDKQorCQkJCXMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSB2YWw7CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+cmF0ZWFkYyA6IHMtPnJhdGVkYWMsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0FEQ1NISUZUKSA6IChDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0RBQ1NISUZUKSkpID8gMiA6IDEsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9BRENTSElGVCkgOiAoQ01fQ0ZNVF8xNkJJVCA8PCBDTV9DRk1UX0RBQ1NISUZUKSkpID8gMTYgOiA4LCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9CSU5EX0ZST05UfERTUF9CSU5EX1NVUlJ8RFNQX0JJTkRfQ0VOVEVSX0xGRXxEU1BfQklORF9TUERJRiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfQklORF9DSEFOTkVMOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID09IERTUF9CSU5EX1FVRVJZKSB7CisJCQl2YWwgPSBEU1BfQklORF9GUk9OVDsKKwkJCWlmIChzLT5zdGF0dXMgJiBET19TUERJRl9PVVQpCisJCQkJdmFsIHw9IERTUF9CSU5EX1NQRElGOworCQkJZWxzZSB7CisJCQkJaWYgKHMtPmN1cnJfY2hhbm5lbHMgPT0gNCkKKwkJCQkJdmFsIHw9IERTUF9CSU5EX1NVUlI7CisJCQkJaWYgKHMtPmN1cnJfY2hhbm5lbHMgPiA0KQorCQkJCQl2YWwgfD0gRFNQX0JJTkRfQ0VOVEVSX0xGRTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCAmIERTUF9CSU5EX1NQRElGKSB7CisJCQkJCXNldF9zcGRpZmluKHMsIHMtPnJhdGVhZGMpOworCQkJCQlpZiAoIShzLT5zdGF0dXMgJiBET19TUERJRl9PVVQpKQorCQkJCQkJdmFsICY9IH5EU1BfQklORF9TUERJRjsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsICYgRFNQX0JJTkRfU1BESUYpIHsKKwkJCQkJc2V0X3NwZGlmb3V0KHMsIHMtPnJhdGVkYWMpOworCQkJCQlzZXRfZGFjX2NoYW5uZWxzKHMsIHMtPmZtdCAmIChDTV9DRk1UX1NURVJFTyA8PCBDTV9DRk1UX0RBQ1NISUZUKSA/IDIgOiAxKTsKKwkJCQkJaWYgKCEocy0+c3RhdHVzICYgRE9fU1BESUZfT1VUKSkKKwkJCQkJCXZhbCAmPSB+RFNQX0JJTkRfU1BESUY7CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IGNoYW5uZWxzOworCQkJCQlpbnQgbWFzazsKKworCQkJCQltYXNrID0gdmFsICYgKERTUF9CSU5EX0ZST05UfERTUF9CSU5EX1NVUlJ8RFNQX0JJTkRfQ0VOVEVSX0xGRSk7CisJCQkJCXN3aXRjaCAobWFzaykgeworCQkJCQkgICAgY2FzZSBEU1BfQklORF9GUk9OVDoKKwkJCQkJCWNoYW5uZWxzID0gMjsKKwkJCQkJCWJyZWFrOworCQkJCQkgICAgY2FzZSBEU1BfQklORF9GUk9OVHxEU1BfQklORF9TVVJSOgorCQkJCQkJY2hhbm5lbHMgPSA0OworCQkJCQkJYnJlYWs7CisJCQkJCSAgICBjYXNlIERTUF9CSU5EX0ZST05UfERTUF9CSU5EX1NVUlJ8RFNQX0JJTkRfQ0VOVEVSX0xGRToKKwkJCQkJCWNoYW5uZWxzID0gNjsKKwkJCQkJCWJyZWFrOworCQkJCQkgICAgZGVmYXVsdDoKKwkJCQkJCWNoYW5uZWxzID0gcy0+Zm10ICYgKENNX0NGTVRfU1RFUkVPIDw8IENNX0NGTVRfREFDU0hJRlQpID8gMiA6IDE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlzZXRfZGFjX2NoYW5uZWxzKHMsIGNoYW5uZWxzKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBTTkRDVExfU1BESUZfQ09QWVJJR0hUOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZfY29weXJpZ2h0KHMsIHZhbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisJY2FzZSBTTkRDVExfU1BESUZfTE9PUDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc2V0X3NwZGlmX2xvb3AocywgdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwljYXNlIFNORENUTF9TUERJRl9NT05JVE9SOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZfbW9uaXRvcihzLCB2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCWNhc2UgU05EQ1RMX1NQRElGX0xFVkVMOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZvdXRfbGV2ZWwocywgdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwljYXNlIFNORENUTF9TUERJRl9JTlY6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXNldF9zcGRpZmluX2ludmVyc2UocywgdmFsKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwljYXNlIFNORENUTF9TUERJRl9TRUwyOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZpbl9jaGFubmVsMihzLCB2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCWNhc2UgU05EQ1RMX1NQRElGX1ZBTElEOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZpbl92YWxpZChzLCB2YWwpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCWNhc2UgU05EQ1RMX1NQRElGT1VUOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfc3BkaWZvdXQocywgdmFsID8gcy0+cmF0ZWRhYyA6IDApOworICAgICAgICAgICAgICAgIHJldHVybiAwOworCWNhc2UgU05EQ1RMX1NQRElGSU46CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXNldF9zcGRpZmluKHMsIHZhbCA/IHMtPnJhdGVhZGMgOiAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKwl9CisJcmV0dXJuIG1peGVyX2lvY3RsKHMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBjbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgY2hhciBmbXRtID0gfjAsIGZtdHMgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGNtX3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBjbV9zdGF0ZSwgZGV2cyk7CisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcy0+c3RhdHVzICY9IH5ET19CSUdFTkRJQU5fUjsKKwkJZm10bSAmPSB+KChDTV9DRk1UX1NURVJFTyB8IENNX0NGTVRfMTZCSVQpIDw8IENNX0NGTVRfQURDU0hJRlQpOworCQlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQkJZm10cyB8PSBDTV9DRk1UXzE2QklUIDw8IENNX0NGTVRfQURDU0hJRlQ7CisJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSAwOworCQlzLT5kbWFfYWRjLmVuYWJsZWQgPSAxOworCQlzZXRfYWRjX3JhdGUocywgODAwMCk7CisJCS8vIHNwZGlmLWluIGlzIHR1cm5uZWQgb2ZmIGJ5IGRlZmF1bHQKKwkJc2V0X3NwZGlmaW4ocywgMCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzLT5zdGF0dXMgJj0gfkRPX0JJR0VORElBTl9XOworCQlmbXRtICY9IH4oKENNX0NGTVRfU1RFUkVPIHwgQ01fQ0ZNVF8xNkJJVCkgPDwgQ01fQ0ZNVF9EQUNTSElGVCk7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlmbXRzIHw9IENNX0NGTVRfMTZCSVQgPDwgQ01fQ0ZNVF9EQUNTSElGVDsKKwkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IDA7CisJCXMtPmRtYV9kYWMuZW5hYmxlZCA9IDE7CisJCXNldF9kYWNfcmF0ZShzLCA4MDAwKTsKKwkJLy8gY2xlYXIgcHJldmlvdXMgbXVsdGljaGFubmVsLCBzcGRpZiwgYWMzIHN0YXRlCisJCXNldF9zcGRpZm91dChzLCAwKTsKKwkJc2V0X2FjMyhzLCAwKTsKKwkJc2V0X2RhY19jaGFubmVscyhzLCAxKTsKKwl9CisJc2V0X2ZtdChzLCBmbXRtLCBmbXRzKTsKKwlzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgY21fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgY21fc3RhdGUgKnMgPSAoc3RydWN0IGNtX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWRyYWluX2RhYyhzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJZG93bigmcy0+b3Blbl9zZW0pOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdG9wX2RhYyhzKTsKKworCQlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYyk7CisJCWlmIChzLT5zdGF0dXMgJiBET19EVUFMX0RBQykKKwkJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKKworCQlpZiAocy0+c3RhdHVzICYgRE9fTVVMVElfQ0gpCisJCQlzZXRfZGFjX2NoYW5uZWxzKHMsIDEpOworCQlpZiAocy0+c3RhdHVzICYgRE9fQUMzKQorCQkJc2V0X2FjMyhzLCAwKTsKKwkJaWYgKHMtPnN0YXR1cyAmIERPX1NQRElGX09VVCkKKwkJCXNldF9zcGRpZm91dChzLCAwKTsKKwkJLyogZW5hYmxlIFNQRElGIGxvb3AgKi8KKwkJc2V0X3NwZGlmX2xvb3Aocywgc3BkaWZfbG9vcCk7CisJCXMtPnN0YXR1cyAmPSB+RE9fQklHRU5ESUFOX1c7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0b3BfYWRjKHMpOworCQlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYyk7CisJCXMtPnN0YXR1cyAmPSB+RE9fQklHRU5ESUFOX1I7CisJfQorCXMtPm9wZW5fbW9kZSAmPSB+KGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNtX2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJID0gbm9fbGxzZWVrLAorCS5yZWFkCSA9IGNtX3JlYWQsCisJLndyaXRlCSA9IGNtX3dyaXRlLAorCS5wb2xsCSA9IGNtX3BvbGwsCisJLmlvY3RsCSA9IGNtX2lvY3RsLAorCS5tbWFwCSA9IGNtX21tYXAsCisJLm9wZW4JID0gY21fb3BlbiwKKwkucmVsZWFzZSA9IGNtX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpbml0dm9sIHsKKwlpbnQgbWl4Y2g7CisJaW50IHZvbDsKK30gaW5pdHZvbFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBTT1VORF9NSVhFUl9XUklURV9DRCwgMHg0ZjRmIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FLCAweDRmNGYgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX01JQywgMHg0ZjRmIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9TWU5USCwgMHg0ZjRmIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsIDB4NGY0ZiB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfUENNLCAweDRmNGYgfQorfTsKKworLyogY2hlY2sgY2hpcCB2ZXJzaW9uIGFuZCBjYXBhYmlsaXR5ICovCitzdGF0aWMgaW50IHF1ZXJ5X2NoaXAoc3RydWN0IGNtX3N0YXRlICpzKQoreworCWludCBDaGlwVmVyc2lvbiA9IC0xOworCXVuc2lnbmVkIGNoYXIgUmVnVmFsdWU7CisKKwkvLyBjaGVjayByZWcgMENoLCBiaXQgMjQtMzEKKwlSZWdWYWx1ZSA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfSU5UX0hMRENMUiArIDMpOworCWlmIChSZWdWYWx1ZSA9PSAwKSB7CisJICAgIC8vIGNoZWNrIHJlZyAwOGgsIGJpdCAyNC0yOAorCSAgICBSZWdWYWx1ZSA9IGluYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfQ0hGT1JNQVQgKyAzKTsKKwkgICAgUmVnVmFsdWUgJj0gMHgxZjsKKwkgICAgaWYgKFJlZ1ZhbHVlID09IDApIHsKKwkJQ2hpcFZlcnNpb24gPSAzMzsKKwkJcy0+bWF4X2NoYW5uZWxzID0gNDsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fQUMzX1NXOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9EVUFMX0RBQzsKKwkgICAgfSBlbHNlIHsKKwkJQ2hpcFZlcnNpb24gPSAzNzsKKwkJcy0+bWF4X2NoYW5uZWxzID0gNDsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fQUMzX0hXOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9EVUFMX0RBQzsKKwkgICAgfQorCX0gZWxzZSB7CisJICAgIC8vIGNoZWNrIHJlZyAwQ2gsIGJpdCAyNgorCSAgICBpZiAoUmVnVmFsdWUgJiAoMSA8PCAoMjYtMjQpKSkgeworCQlDaGlwVmVyc2lvbiA9IDM5OworCSAgICAJaWYgKFJlZ1ZhbHVlICYgKDEgPDwgKDI0LTI0KSkpCisJCSAgICBzLT5tYXhfY2hhbm5lbHMgPSA2OworCSAgICAJZWxzZQorCQkgICAgcy0+bWF4X2NoYW5uZWxzID0gNDsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fQUMzX0hXOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9EVUFMX0RBQzsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fTVVMVElfQ0hfSFc7CisJCXMtPmNhcGFiaWxpdHkgfD0gQ0FOX0xJTkVfQVNfQkFTUzsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fTUlDX0FTX0JBU1M7CisJICAgIH0gZWxzZSB7CisJCUNoaXBWZXJzaW9uID0gNTU7IC8vIDQgb3IgNiBjaGFubmVscworCQlzLT5tYXhfY2hhbm5lbHMgPSA2OworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9BQzNfSFc7CisJCXMtPmNhcGFiaWxpdHkgfD0gQ0FOX0RVQUxfREFDOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9NVUxUSV9DSF9IVzsKKwkJcy0+Y2FwYWJpbGl0eSB8PSBDQU5fTElORV9BU19CQVNTOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9NSUNfQVNfQkFTUzsKKwkgICAgfQorCX0KKwlzLT5jYXBhYmlsaXR5IHw9IENBTl9MSU5FX0FTX1JFQVI7CisJcmV0dXJuIENoaXBWZXJzaW9uOworfQorCisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX0pPWVNUSUNLCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjbV9jcmVhdGVfZ2FtZXBvcnQoc3RydWN0IGNtX3N0YXRlICpzLCBpbnQgaW9fcG9ydCkKK3sKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdwOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb19wb3J0LCBDTV9FWFRFTlRfR0FNRSwgImNtcGNpIEdBTUUiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNtcGNpOiBnYW1lcG9ydCBpbyBwb3J0cyAweCUjeCBpbiB1c2VcbiIsIGlvX3BvcnQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICghKHMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY21wY2k6IGNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGlvX3BvcnQsIENNX0VYVEVOVF9HQU1FKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ2FtZXBvcnRfc2V0X25hbWUoZ3AsICJDLU1lZGlhIEdQIik7CisJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShzLT5kZXYpKTsKKwlncC0+ZGV2LnBhcmVudCA9ICZzLT5kZXYtPmRldjsKKwlncC0+aW8gPSBpb19wb3J0OworCisJLyogZW5hYmxlIGpveXN0aWNrICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+MCwgMHgwMik7CisKKwlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgY21fZnJlZV9nYW1lcG9ydChzdHJ1Y3QgY21fc3RhdGUgKnMpCit7CisJaWYgKHMtPmdhbWVwb3J0KSB7CisJCWludCBncGlvID0gcy0+Z2FtZXBvcnQtPmlvOworCisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7CisJCXMtPmdhbWVwb3J0ID0gTlVMTDsKKwkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+MHgwMiwgMCk7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIENNX0VYVEVOVF9HQU1FKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgY21fY3JlYXRlX2dhbWVwb3J0KHN0cnVjdCBjbV9zdGF0ZSAqcywgaW50IGlvX3BvcnQpIHsgcmV0dXJuIC1FTk9TWVM7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBjbV9mcmVlX2dhbWVwb3J0KHN0cnVjdCBjbV9zdGF0ZSAqcykgeyB9CisjZW5kaWYKKworI2RlZmluZQllY2hvX29wdGlvbih4KVwKK2lmICh4KSBzdHJjYXQob3B0aW9ucywgIiIgI3ggIiAiKQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjbV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCit7CisJc3RydWN0IGNtX3N0YXRlICpzOworCW1tX3NlZ21lbnRfdCBmczsKKwlpbnQgaSwgdmFsLCByZXQ7CisJdW5zaWduZWQgY2hhciByZWdfbWFzazsKKwlpbnQgdGltZW91dDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0CWRldmljZWlkOworCQljaGFyCQkqZGV2aWNlbmFtZTsKKwl9IGRldmljZXRhYmxlW10gPSB7CisJCXsgUENJX0RFVklDRV9JRF9DTUVESUFfQ004MzM4QSwgIkNNODMzOEEiIH0sCisJCXsgUENJX0RFVklDRV9JRF9DTUVESUFfQ004MzM4QiwgIkNNODMzOEIiIH0sCisJCXsgUENJX0RFVklDRV9JRF9DTUVESUFfQ004NzM4LCAgIkNNODczOCIgfSwKKwkJeyBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzhCLCAiQ004NzM4QiIgfSwKKwl9OworCWNoYXIJKmRldmljZW5hbWUgPSAidW5rbm93biI7CisJY2hhcglvcHRpb25zWzI1Nl07CisKKwlpZiAoKHJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpKQorCQlyZXR1cm4gcmV0OworCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDApICYgSU9SRVNPVVJDRV9JTykpCisJCXJldHVybiAtRU5PREVWOworCWlmIChwY2lkZXYtPmlycSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpID0gcGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIDB4ZmZmZmZmZmYpOworCWlmIChpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNtcGNpOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCXJldHVybiBpOworCX0KKwlzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiY21wY2k6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJLyogc2VhcmNoIGRldmljZSBuYW1lICovCisJZm9yIChpID0gMDsgaSA8IHNpemVvZihkZXZpY2V0YWJsZSkgLyBzaXplb2YoZGV2aWNldGFibGVbMF0pOyBpKyspIHsKKwkJaWYgKGRldmljZXRhYmxlW2ldLmRldmljZWlkID09IHBjaWRldi0+ZGV2aWNlKSB7CisJCQlkZXZpY2VuYW1lID0gZGV2aWNldGFibGVbaV0uZGV2aWNlbmFtZTsKKwkJCWJyZWFrOworCQl9CisJfQorCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IGNtX3N0YXRlKSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5tYWdpYyA9IENNX01BR0lDOworCXMtPmRldiA9IHBjaWRldjsKKwlzLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKKwlzLT5pb3N5bnRoID0gZm1pbzsKKwlzLT5pb21pZGkgPSBtcHVpbzsKKyNpZmRlZiBDT05GSUdfU09VTkRfQ01QQ0lfTUlESQorCXMtPm1pZGlfZGV2YyA9IDA7CisjZW5kaWYKKwlzLT5zdGF0dXMgPSAwOworCWlmIChzLT5pb2Jhc2UgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcy0+aXJxID0gcGNpZGV2LT5pcnE7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvYmFzZSwgQ01fRVhURU5UX0NPREVDLCAiY21wY2kiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImNtcGNpOiBpbyBwb3J0cyAlI3gtJSN4IGluIHVzZVxuIiwgcy0+aW9iYXNlLCBzLT5pb2Jhc2UrQ01fRVhURU5UX0NPREVDLTEpOworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJyX3JlZ2lvbjU7CisJfQorCS8qIGR1bXAgcGFyYW1ldGVycyAqLworCXN0cmNweShvcHRpb25zLCAiY21wY2k6ICIpOworCWVjaG9fb3B0aW9uKGpveXN0aWNrKTsKKwllY2hvX29wdGlvbihzcGRpZl9pbnZlcnNlKTsKKwllY2hvX29wdGlvbihzcGRpZl9sb29wKTsKKwllY2hvX29wdGlvbihzcGRpZl9vdXQpOworCWVjaG9fb3B0aW9uKHVzZV9saW5lX2FzX3JlYXIpOworCWVjaG9fb3B0aW9uKHVzZV9saW5lX2FzX2Jhc3MpOworCWVjaG9fb3B0aW9uKHVzZV9taWNfYXNfYmFzcyk7CisJZWNob19vcHRpb24obWljX2Jvb3N0KTsKKwllY2hvX29wdGlvbihod19jb3B5KTsKKwlwcmludGsoS0VSTl9JTkZPICIlc1xuIiwgb3B0aW9ucyk7CisKKwkvKiBpbml0aWFsaXplIGNvZGVjIHJlZ2lzdGVycyAqLworCW91dGIoMCwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0lOVF9ITERDTFIgKyAyKTsgIC8qIGRpc2FibGUgaW50cyAqLworCW91dGIoMCwgcy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwwICsgMik7IC8qIGRpc2FibGUgY2hhbm5lbHMgKi8KKwkvKiByZXNldCBtaXhlciAqLworCXdybWl4ZXIocywgRFNQX01JWF9EQVRBUkVTRVRJRFgsIDApOworCisJLyogcmVxdWVzdCBpcnEgKi8KKwlpZiAoKHJldCA9IHJlcXVlc3RfaXJxKHMtPmlycSwgY21faW50ZXJydXB0LCBTQV9TSElSUSwgImNtcGNpIiwgcykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY21wY2k6IGlycSAldSBpbiB1c2VcbiIsIHMtPmlycSk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAiY21wY2k6IGZvdW5kICVzIGFkYXB0ZXIgYXQgaW8gJSN4IGlycSAldVxuIiwKKwkgICAgICAgZGV2aWNlbmFtZSwgcy0+aW9iYXNlLCBzLT5pcnEpOworCS8qIHJlZ2lzdGVyIGRldmljZXMgKi8KKwlpZiAoKHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmY21fYXVkaW9fZm9wcywgLTEpKSA8IDApIHsKKwkJcmV0ID0gcy0+ZGV2X2F1ZGlvOworCQlnb3RvIGVycl9kZXYxOworCX0KKwlpZiAoKHMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZjbV9taXhlcl9mb3BzLCAtMSkpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfbWl4ZXI7CisJCWdvdG8gZXJyX2RldjI7CisJfQorCXBjaV9zZXRfbWFzdGVyKHBjaWRldik7CS8qIGVuYWJsZSBidXMgbWFzdGVyaW5nICovCisJLyogaW5pdGlhbGl6ZSB0aGUgY2hpcHMgKi8KKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCS8qIHNldCBtaXhlciBvdXRwdXQgKi8KKwlmcm9iaW5kaXIocywgRFNQX01JWF9PVVRNSVhJRFgsIDB4MWYsIDB4MWYpOworCS8qIHNldCBtaXhlciBpbnB1dCAqLworCXZhbCA9IFNPVU5EX01BU0tfTElORXxTT1VORF9NQVNLX1NZTlRIfFNPVU5EX01BU0tfQ0R8U09VTkRfTUFTS19NSUM7CisJbWl4ZXJfaW9jdGwocywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGluaXR2b2wpL3NpemVvZihpbml0dm9sWzBdKTsgaSsrKSB7CisJCXZhbCA9IGluaXR2b2xbaV0udm9sOworCQltaXhlcl9pb2N0bChzLCBpbml0dm9sW2ldLm1peGNoLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwl9CisJc2V0X2ZzKGZzKTsKKwkvKiB1c2UgY2hhbm5lbCAxIGZvciBwbGF5YmFjaywgY2hhbm5lbCAwIGZvciByZWNvcmQgKi8KKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAsIH5DSEFEQzEsIENIQURDMCk7CisJLyogdHVybiBvZmYgVk1JQzMgLSBtaWMgYm9vc3QgKi8KKwlpZiAobWljX2Jvb3N0KQorCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyLCB+MSwgMCk7CisJZWxzZQorCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlYRVIyLCB+MCwgMSk7CisJcy0+ZGV2aWNlaWQgPSBwY2lkZXYtPmRldmljZTsKKworCWlmIChwY2lkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzgKKwkgfHwgcGNpZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9DTUVESUFfQ004NzM4QikgeworCisJCS8qIGNoaXAgdmVyc2lvbiBhbmQgaHcgY2FwYWJpbGl0eSBjaGVjayAqLworCQlzLT5jaGlwX3ZlcnNpb24gPSBxdWVyeV9jaGlwKHMpOworCQlwcmludGsoS0VSTl9JTkZPICJjbXBjaTogY2hpcCB2ZXJzaW9uID0gMCVkXG4iLCBzLT5jaGlwX3ZlcnNpb24pOworCisJCS8qIHNldCBTUERJRi1pbiBpbnZlcnNlIGJlZm9yZSBlbmFibGUgU1BESUYgbG9vcCAqLworCQlzZXRfc3BkaWZpbl9pbnZlcnNlKHMsIHNwZGlmX2ludmVyc2UpOworCisJCS8qIHVzZSBTUERJRiBpbiAjMSAqLworCQlzZXRfc3BkaWZpbl9jaGFubmVsMihzLCAwKTsKKwl9IGVsc2UgeworCQlzLT5jaGlwX3ZlcnNpb24gPSAwOworCQkvKiA4MzM4IHdpbGwgZmFsbCBoZXJlICovCisJCXMtPm1heF9jaGFubmVscyA9IDQ7CisJCXMtPmNhcGFiaWxpdHkgfD0gQ0FOX0RVQUxfREFDOworCQlzLT5jYXBhYmlsaXR5IHw9IENBTl9MSU5FX0FTX1JFQVI7CisJfQorCS8qIGVuYWJsZSBTUERJRiBsb29wICovCisJc2V0X3NwZGlmX2xvb3Aocywgc3BkaWZfbG9vcCk7CisKKwkvLyBlbmFibGUgNCBzcGVha2VyIG1vZGUgKGFuYWxvZyBkdXBsaWNhdGUpCisJc2V0X2h3X2NvcHkocywgaHdfY29weSk7CisKKwlyZWdfbWFzayA9IDA7CisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX0ZNCisJLyogZGlzYWJsZSBGTSAqLworCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9NSVNDX0NUUkwgKyAyLCB+OCwgMCk7CisJaWYgKHMtPmlvc3ludGgpIHsKKwkgICAgLyogZG9uJ3QgZW5hYmxlIE9QTDMgaWYgdGhlcmUgaXMgb25lICovCisJICAgIGlmIChvcGwzX2RldGVjdChzLT5pb3N5bnRoLCBOVUxMKSkgeworCSAgICAJcy0+aW9zeW50aCA9IDA7CisJICAgIH0gZWxzZSB7CisJCS8qIHNldCBJTyBiYXNlZCBhdCAweDM4OCAqLworCQlzd2l0Y2ggKHMtPmlvc3ludGgpIHsKKwkJICAgIGNhc2UgMHgzODg6CisJCQlyZWdfbWFzayA9IDA7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMHgzQzg6CisJCQlyZWdfbWFzayA9IDB4MDE7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMHgzRTA6CisJCQlyZWdfbWFzayA9IDB4MDI7CisJCQlicmVhazsKKwkJICAgIGNhc2UgMHgzRTg6CisJCQlyZWdfbWFzayA9IDB4MDM7CisJCQlicmVhazsKKwkJICAgIGRlZmF1bHQ6CisJCQlzLT5pb3N5bnRoID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9MRUdBQ1lfQ1RSTCArIDMsIH4weDAzLCByZWdfbWFzayk7CisJCS8qIGVuYWJsZSBGTSAqLworCQlpZiAocy0+aW9zeW50aCkgeworCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCArIDIsIH4wLCA4KTsKKwkJCWlmIChvcGwzX2RldGVjdChzLT5pb3N5bnRoLCBOVUxMKSkKKwkJCQlyZXQgPSBvcGwzX2luaXQocy0+aW9zeW50aCwgTlVMTCwgVEhJU19NT0RVTEUpOworCQkJZWxzZSB7CisJCQkJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX01JU0NfQ1RSTCArIDIsIH44LCAwKTsKKwkJCQlzLT5pb3N5bnRoID0gMDsKKwkJCX0KKwkJfQorCSAgICB9CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX01JREkKKwlzd2l0Y2ggKHMtPmlvbWlkaSkgeworCSAgICBjYXNlIDB4MzMwOgorCQlyZWdfbWFzayA9IDA7CisJCWJyZWFrOworCSAgICBjYXNlIDB4MzIwOgorCQlyZWdfbWFzayA9IDB4MjA7CisJCWJyZWFrOworCSAgICBjYXNlIDB4MzEwOgorCQlyZWdfbWFzayA9IDB4NDA7CisJCWJyZWFrOworCSAgICBjYXNlIDB4MzAwOgorCQlyZWdfbWFzayA9IDB4NjA7CisJCWJyZWFrOworCSAgICBkZWZhdWx0OgorCQlzLT5pb21pZGkgPSAwOworCQlnb3RvIHNraXBfbXB1OworCX0KKwlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKHMtPmlvbWlkaSwgMiwgIm1wdTQwMSIpOworCWlmICghcG9ydHMpCisJCWdvdG8gc2tpcF9tcHU7CisJLyogZGlzYWJsZSBNUFUtNDAxICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+MHgwNCwgMCk7CisJcy0+bXB1X2RhdGEubmFtZSA9ICJjbXBjaSBtcHUiOworCXMtPm1wdV9kYXRhLmlvX2Jhc2UgPSBzLT5pb21pZGk7CisJcy0+bXB1X2RhdGEuaXJxID0gLXMtPmlycTsJLy8gdGVsbCBtcHU0MDEgdG8gc2hhcmUgaXJxCisJaWYgKHByb2JlX21wdTQwMSgmcy0+bXB1X2RhdGEsIHBvcnRzKSkgeworCQlyZWxlYXNlX3JlZ2lvbihzLT5pb21pZGksIDIpOworCQlzLT5pb21pZGkgPSAwOworCQlnb3RvIHNraXBfbXB1OworCX0KKwltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTEVHQUNZX0NUUkwgKyAzLCB+MHg2MCwgcmVnX21hc2spOworCS8qIGVuYWJsZSBNUFUtNDAxICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+MCwgMHgwNCk7CisJLyogY2xlYXIgYWxsIHByZXZpb3VzbHkgcmVjZWl2ZWQgaW50ZXJydXB0ICovCisJZm9yICh0aW1lb3V0ID0gOTAwMDAwOyB0aW1lb3V0ID4gMDsgdGltZW91dC0tKSB7CisJCWlmICgoaW5iKHMtPmlvbWlkaSArIDEpICYmIDB4ODApID09IDApCisJCQlpbmIocy0+aW9taWRpKTsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCWlmICghcHJvYmVfbXB1NDAxKCZzLT5tcHVfZGF0YSwgcG9ydHMpKSB7CisJCXJlbGVhc2VfcmVnaW9uKHMtPmlvbWlkaSwgMik7CisJCXMtPmlvbWlkaSA9IDA7CisJCW1hc2tiKHMtPmlvYmFzZSArIENPREVDX0NNSV9GVU5DVFJMMSwgfjAsIDB4MDQpOworCX0gZWxzZSB7CisJCWF0dGFjaF9tcHU0MDEoJnMtPm1wdV9kYXRhLCBUSElTX01PRFVMRSk7CisJCXMtPm1pZGlfZGV2YyA9IHMtPm1wdV9kYXRhLnNsb3RzWzFdOworCX0KK3NraXBfbXB1OgorI2VuZGlmCisJLyogZGlzYWJsZSBqb3lzdGljayBwb3J0ICovCisJbWFza2Iocy0+aW9iYXNlICsgQ09ERUNfQ01JX0ZVTkNUUkwxLCB+MHgwMiwgMCk7CisJaWYgKGpveXN0aWNrKQorCQljbV9jcmVhdGVfZ2FtZXBvcnQocywgMHgyMDApOworCisJLyogc3RvcmUgaXQgaW4gdGhlIGRyaXZlciBmaWVsZCAqLworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHMpOworCS8qIHB1dCBpdCBpbnRvIGRyaXZlciBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmcy0+ZGV2cywgJmRldnMpOworCS8qIGluY3JlbWVudCBkZXZpbmRleCAqLworCWlmIChkZXZpbmRleCA8IE5SX0RFVklDRS0xKQorCQlkZXZpbmRleCsrOworCXJldHVybiAwOworCitlcnJfZGV2MjoKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworZXJyX2RldjE6CisJcHJpbnRrKEtFUk5fRVJSICJjbXBjaTogY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworZXJyX2lycToKKwlyZWxlYXNlX3JlZ2lvbihzLT5pb2Jhc2UsIENNX0VYVEVOVF9DT0RFQyk7CitlcnJfcmVnaW9uNToKKwlrZnJlZShzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworTU9EVUxFX0FVVEhPUigiQ2hlbkxpIFRpZW4sIGNsdGllbkBjbWVkaWEuY29tLnR3Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNNOHgzOCBBdWRpbyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNtX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBjbV9zdGF0ZSAqcyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFzKQorCQlyZXR1cm47CisKKwljbV9mcmVlX2dhbWVwb3J0KHMpOworCisjaWZkZWYgQ09ORklHX1NPVU5EX0NNUENJX0ZNCisJaWYgKHMtPmlvc3ludGgpIHsKKwkJLyogZGlzYWJsZSBGTSAqLworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfTUlTQ19DVFJMICsgMiwgfjgsIDApOworCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19TT1VORF9DTVBDSV9NSURJCisJaWYgKHMtPmlvbWlkaSkgeworCQl1bmxvYWRfbXB1NDAxKCZzLT5tcHVfZGF0YSk7CisJCS8qIGRpc2FibGUgTVBVLTQwMSAqLworCQltYXNrYihzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDEsIH4weDA0LCAwKTsKKwl9CisjZW5kaWYKKwlzZXRfc3BkaWZfbG9vcChzLCAwKTsKKwlsaXN0X2RlbCgmcy0+ZGV2cyk7CisJb3V0YigwLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfSU5UX0hMRENMUiArIDIpOyAgLyogZGlzYWJsZSBpbnRzICovCisJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJb3V0YigwLCBzLT5pb2Jhc2UgKyBDT0RFQ19DTUlfRlVOQ1RSTDAgKyAyKTsgLyogZGlzYWJsZSBjaGFubmVscyAqLworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisKKwkvKiByZXNldCBtaXhlciAqLworCXdybWl4ZXIocywgRFNQX01JWF9EQVRBUkVTRVRJRFgsIDApOworCisJcmVsZWFzZV9yZWdpb24ocy0+aW9iYXNlLCBDTV9FWFRFTlRfQ09ERUMpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5kZXZfbWl4ZXIpOworCWtmcmVlKHMpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRfdGFibGVbXSBfX2RldmluaXRkYXRhID0geworCXsgUENJX1ZFTkRPUl9JRF9DTUVESUEsIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODczOEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfQ01FRElBLCBQQ0lfREVWSUNFX0lEX0NNRURJQV9DTTg3MzgsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKyAJeyBQQ0lfVkVORE9SX0lEX0NNRURJQSwgUENJX0RFVklDRV9JRF9DTUVESUFfQ004MzM4QSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9DTUVESUEsIFBDSV9ERVZJQ0VfSURfQ01FRElBX0NNODMzOEIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjbV9kcml2ZXIgPSB7CisgICAgICAgLm5hbWUJID0gImNtcGNpIiwKKyAgICAgICAuaWRfdGFibGUgPSBpZF90YWJsZSwKKyAgICAgICAucHJvYmUJID0gY21fcHJvYmUsCisgICAgICAgLnJlbW92ZQkgPSBfX2RldmV4aXRfcChjbV9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2NtcGNpKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiY21wY2k6IHZlcnNpb24gJFJldmlzaW9uOiA2LjgyICQgdGltZSAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZjbV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9jbXBjaSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImNtcGNpOiB1bmxvYWRpbmdcbiIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY21fZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9jbXBjaSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2NtcGNpKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jb3Byb2MuaCBiL3NvdW5kL29zcy9jb3Byb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzA2MzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NvcHJvYy5oCkBAIC0wLDAgKzEsMTIgQEAKKy8qCisgKiBEZWZpbml0aW9ucyBmb3IgdmFyaW91cyBvbiBib2FyZCBwcm9jZXNzb3JzIG9uIHRoZSBzb3VuZCBjYXJkcy4gRm9yCisgKiBleGFtcGxlIERTUCBwcm9jZXNzb3JzLgorICovCisKKy8qCisgKiBDb3Byb2Nlc3NvciBhY2Nlc3MgdHlwZXMgCisgKi8KKyNkZWZpbmUgQ09QUl9DVVNUT00JCTB4MDAwMQkvKiBDdXN0b20gYXBwbGljYXRpb25zICovCisjZGVmaW5lIENPUFJfTUlESQkJMHgwMDAyCS8qIE1JREkgKE1QVS00MDEpIGVtdWxhdGlvbiAqLworI2RlZmluZSBDT1BSX1BDTQkJMHgwMDA0CS8qIERpZ2l0aXplZCB2b2ljZSBhcHBsaWNhdGlvbnMgKi8KKyNkZWZpbmUgQ09QUl9TWU5USAkJMHgwMDA4CS8qIE11c2ljIHN5bnRoZXNpcyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDIzMi5jIGIvc291bmQvb3NzL2NzNDIzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzMwOGYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvY3M0MjMyLmMKQEAgLTAsMCArMSw1MjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICoJY3M0MjMyLmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgQ3J5c3RhbCBDUzQyMzIgYmFzZWQgY2FyZHMuIFRoZSBDUzQyMzIgaXMKKyAqIGEgUG5QIGNvbXBhdGlibGUgY2hpcCB3aGljaCBjb250YWlucyBhIENTNDIzMUEgY29kZWMsIFNCIGVtdWxhdGlvbiwKKyAqIGEgTVBVNDAxIGNvbXBhdGlibGUgTUlESSBwb3J0LCBqb3lzdGljayBhbmQgc3ludGhlc2l6ZXIgYW5kIElERSBDRC1ST00gCisgKiBpbnRlcmZhY2VzLiBUaGlzIGlzIGp1c3QgYSB0ZW1wb3JhcnkgZHJpdmVyIHVudGlsIGZ1bGwgUG5QIHN1cHBvcnQKKyAqIGdldHMgaW1wbGVtZW50ZWQuIEp1c3QgdGhlIFdTUyBjb2RlYywgRk0gc3ludGggYW5kIHRoZSBNSURJIHBvcnRzIGFyZQorICogc3VwcG9ydGVkLiBPdGhlciBpbnRlcmZhY2VzIGFyZSBsZWZ0IHVuaW5pdGlhbGl6ZWQuCisgKgorICogaWZkZWYgLi4uV0FWRUZST05ULi4uCisgKiAKKyAqICAgU3VwcG9ydCBpcyBwcm92aWRlZCBmb3IgaW5pdGlhbGl6aW5nIHRoZSBXYXZlRnJvbnQgc3ludGgKKyAqICAgaW50ZXJmYWNlIGFzIHdlbGwsIHdoaWNoIGlzIGxvZ2ljYWwgZGV2aWNlICM0LiBOb3RlIHRoYXQgaWYKKyAqICAgeW91IGhhdmUgYSBUcm9wZXorIGNhcmQsIHlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIHNldHVwCisgKiAgIHRoZSBDUzQyMzItc3VwcG9ydGVkIE1JREkgaW50ZXJmYWNlLCBzaW5jZSBpdCBjb3JyZXNwb25kcyB0bworICogICB0aGUgaW50ZXJuYWwgMjYtcGluIGhlYWRlciB0aGF0J3MgaGFyZCB0byBhY2Nlc3MuIFVzaW5nIHRoaXMKKyAqICAgcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBJUlEsIGEgcmVzb3VyY2Ugbm9uZSB0b28gcGxlbnRpZnVsIGluCisgKiAgIHRoaXMgZW52aXJvbm1lbnQuIEp1c3QgZG9uJ3Qgc2V0IG1vZHVsZSBwYXJhbWV0ZXJzIG1wdWlvIGFuZAorICogICBtcHVpcnEsIGFuZCB0aGUgTUlESSBwb3J0IHdpbGwgYmUgbGVmdCB1bmluaXRpYWxpemVkLiBZb3UgY2FuCisgKiAgIHN0aWxsIHVzZSB0aGUgSUNTMjExNSBob3N0ZWQgTUlESSBpbnRlcmZhY2Ugd2hpY2ggY29ycmVzcG9uZHMKKyAqICAgdG8gdGhlIDktcGluIEQgY29ubmVjdG9yIG9uIHRoZSBiYWNrIG9mIHRoZSBjYXJkLgorICoKKyAqIGVuZGlmICAuLi5XQVZFRlJPTlQuLi4KKyAqCisgKiBTdXBwb3J0ZWQgY2hpcHMgYXJlOgorICogICAgICBDUzQyMzIKKyAqICAgICAgQ1M0MjM2CisgKiAgICAgIENTNDIzNkIKKyAqCisgKiBOb3RlOiBZb3Ugd2lsbCBuZWVkIGEgUG5QIGNvbmZpZyBzZXR1cCB0byBpbml0aWFsaXNlIHNvbWUgQ1M0MjMyIGJvYXJkcworICogYW55d2F5LgorICoKKyAqIENoYW5nZXMKKyAqICAgICAgSm9obiBSb29kICAgICAgICAgICAgICAgQWRkZWQgQm9zZSBTb3VuZCBTeXN0ZW0gU3VwcG9ydC4KKyAqICAgICAgVG9zaGlvIFNwb29yCisgKglBbGFuIENveAkJTW9kdWxhcmlzYXRpb24sIEJhc2ljIGNsZWFudXBzLgorICogICAgICBQYXVsIEJhcnRvbi1EYXZpcwlTZXBhcmF0ZWQgTVBVIGNvbmZpZ3VyYXRpb24sIGFkZGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyb3BleisgKFdhdmVGcm9udCkgc3VwcG9ydAorICoJQ2hyaXN0b3BoIEhlbGx3aWcJQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdCwKKyAqIAkJCQkJc2ltcGxlIGNsZWFudXBzCisgKiAJQXJuYWxkbyBDLiBkZSBNZWxvCWdvdCByaWQgb2YgYXR0YWNoX3VhcnQ0MDEKKyAqCUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3oKKyAqCQkJCUFkZGVkIHNvbWUgX19pbml0L19faW5pdGRhdGEvX19leGl0CisgKglNYXJjdXMgTWVpc3NuZXIJCUFkZGVkIElTQSBQblAgc3VwcG9ydC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcG5wLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJhZDE4NDguaCIKKyNpbmNsdWRlICJtcHU0MDEuaCIKKworI2RlZmluZSBLRVlfUE9SVAkweDI3OQkvKiBTYW1lIGFzIExQVDEgc3RhdHVzIHBvcnQgKi8KKyNkZWZpbmUgQ1NOX05VTQkJMHg5OQkvKiBKdXN0IGEgcmFuZG9tIG51bWJlciAqLworI2RlZmluZSBJTkRFWF9BRERSRVNTICAgMHgwMCAgICAvKiAoUjApIEluZGV4IEFkZHJlc3MgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgSU5ERVhfREFUQSAgICAgIDB4MDEgICAgLyogKFIxKSBJbmRleGVkIERhdGEgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgUElOX0NPTlRST0wgICAgIDB4MGEgICAgLyogKEkxMCkgUGluIENvbnRyb2wgKi8KKyNkZWZpbmUgRU5BQkxFX1BJTlMgICAgIDB4YzAgICAgLyogWENUUkwwL1hDVFJMMSBlbmFibGUgKi8KKworc3RhdGljIHZvaWQgQ1NfT1VUKHVuc2lnbmVkIGNoYXIgYSkKK3sKKwlvdXRiKGEsIEtFWV9QT1JUKTsKK30KKworI2RlZmluZSBDU19PVVQyKGEsIGIpCQl7Q1NfT1VUKGEpO0NTX09VVChiKTt9CisjZGVmaW5lIENTX09VVDMoYSwgYiwgYykJe0NTX09VVChhKTtDU19PVVQoYik7Q1NfT1VUKGMpO30KKworc3RhdGljIGludCBfX2luaXRkYXRhIGJzcyAgICAgICA9IDA7CitzdGF0aWMgaW50IG1wdV9iYXNlLCBtcHVfaXJxOworc3RhdGljIGludCBzeW50aF9iYXNlLCBzeW50aF9pcnE7CitzdGF0aWMgaW50IG1wdV9kZXRlY3RlZDsKKworc3RhdGljIGludCBwcm9iZV9jczQyMzJfbXB1KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwkvKgorCSAqCUp1c3Qgd3JpdGUgZG93biB0aGUgY29uZmlnIHZhbHVlcy4KKwkgKi8KKworCW1wdV9iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCW1wdV9pcnEgPSBod19jb25maWctPmlycTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBjcnlzdGFsX2tleVtdID0JLyogQSAzMiBieXRlIG1hZ2ljIGtleSBzZXF1ZW5jZSAqLworeworCTB4OTYsIDB4MzUsIDB4OWEsIDB4Y2QsIDB4ZTYsIDB4ZjMsIDB4NzksIDB4YmMsCisJMHg1ZSwgMHhhZiwgMHg1NywgMHgyYiwgMHgxNSwgMHg4YSwgMHhjNSwgMHhlMiwKKwkweGYxLCAweGY4LCAweDdjLCAweDNlLCAweDlmLCAweDRmLCAweDI3LCAweDEzLAorCTB4MDksIDB4ODQsIDB4NDIsIDB4YTEsIDB4ZDAsIDB4NjgsIDB4MzQsIDB4MWEKK307CisKK3N0YXRpYyB2b2lkIHNsZWVwKHVuc2lnbmVkIGhvd2xvbmcpCit7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisJc2NoZWR1bGVfdGltZW91dChob3dsb25nKTsKK30KKworc3RhdGljIHZvaWQgZW5hYmxlX3hjdHJsKGludCBiYXNlaW8pCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgcmVnZDsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgLyoKKyAgICAgICAgICogU29tZSBJQk0gQXB0aXZhJ3MgaGF2ZSB0aGUgQm9zZSBTb3VuZCBTeXN0ZW0uIEJ5IGRlZmF1bHQKKyAgICAgICAgICogdGhlIEJvc2UgQW1wbGlmaWVyIGlzIGRpc2FibGVkLiBUaGUgYW1wbGlmaWVyIHdpbGwgYmUgCisgICAgICAgICAqIGFjdGl2YXRlZCwgYnkgc2V0dGluZyB0aGUgWENUUkwwIGFuZCBYQ1RSTDEgYml0cy4KKyAgICAgICAgICogVm9sdW1lIG9mIHRoZSBtb25pdG9yIGJvc2Ugc3BlYWtlcnMvd29vZmVyLCBjYW4gdGhlbgorICAgICAgICAgKiBiZSBzZXQgYnkgY2hhbmdpbmcgdGhlIFBDTSB2b2x1bWUuCisgICAgICAgICAqCisgICAgICAgICAqLworICAgICAgICAgICAgICAgIAorICAgICAgICBwcmludGsoImNzNDIzMjogZW5hYmxpbmcgQm9zZSBTb3VuZCBTeXN0ZW0gQW1wbGlmaWVyLlxuIik7CisgICAgICAgIAorICAgICAgICAvKiBTd2l0Y2ggdG8gUGluIENvbnRyb2wgQWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgcmVnZCA9IGluYihiYXNlaW8gKyBJTkRFWF9BRERSRVNTKSAmIDB4ZTA7CisgICAgICAgIG91dGIoKCh1bnNpZ25lZCBjaGFyKSAoUElOX0NPTlRST0wgfCByZWdkKSksIGJhc2VpbyArIElOREVYX0FERFJFU1MgKTsKKyAgICAgICAgCisgICAgICAgIC8qIEFjdGl2YXRlIHRoZSBYQ1RSTDAgYW5kIFhDVFJMMSBQaW5zICovCisgICAgICAgIHJlZ2QgPSBpbmIoYmFzZWlvICsgSU5ERVhfREFUQSk7CisgICAgICAgIG91dGIoKCh1bnNpZ25lZCBjaGFyKSAoRU5BQkxFX1BJTlMgfCByZWdkKSksIGJhc2VpbyArIElOREVYX0RBVEEgKTsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfY3M0MjMyKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgaW50IGlzYXBucF9jb25maWd1cmVkKQoreworCWludCBpLCBuOworCWludCBiYXNlID0gaHdfY29uZmlnLT5pb19iYXNlLCBpcnEgPSBod19jb25maWctPmlycTsKKwlpbnQgZG1hMSA9IGh3X2NvbmZpZy0+ZG1hLCBkbWEyID0gaHdfY29uZmlnLT5kbWEyOworCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7CisKKwlpZiAoYmFzZSA9PSAtMSB8fCBpcnEgPT0gLTEgfHwgZG1hMSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgImNzNDIzMjogZG1hLCBpcnEgYW5kIGlvIG11c3QgYmUgc2V0LlxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogVmVyaWZ5IHRoYXQgdGhlIEkvTyBwb3J0IHJhbmdlIGlzIGZyZWUuCisJICovCisKKwlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGJhc2UsIDQsICJhZDE4NDgiKTsKKwlpZiAoIXBvcnRzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3M0MjMyLmM6IEkvTyBwb3J0IDB4JTAzeCBub3QgZnJlZVxuIiwgYmFzZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoYWQxODQ4X2RldGVjdChwb3J0cywgTlVMTCwgaHdfY29uZmlnLT5vc3ApKSB7CisJCWdvdG8gZ290X2l0OwkvKiBUaGUgY2FyZCBpcyBhbHJlYWR5IGFjdGl2ZSAqLworCX0KKwlpZiAoaXNhcG5wX2NvbmZpZ3VyZWQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczQyMzIuYzogSVNBIFBuUCBjb25maWd1cmVkLCBidXQgbm90IGRldGVjdGVkP1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGRvZXNuJ3QgdXNlIHRoZSBQblAgbWV0aG9kIHdoZW4gY29uZmlndXJpbmcKKwkgKiB0aGUgY2FyZCBidXQgYSBzaW1wbGlmaWVkIG1ldGhvZCBkZWZpbmVkIGJ5IENyeXN0YWwuIFRoaXMgbWVhbnMgdGhhdAorCSAqIGp1c3Qgb25lIENTNDIzMiBjb21wYXRpYmxlIGRldmljZSBjYW4gZXhpc3Qgb24gdGhlIHN5c3RlbS4gQWxzbyB0aGlzCisJICogbWV0aG9kIGNvbmZsaWN0cyB3aXRoIHBvc3NpYmxlIFBuUCBzdXBwb3J0IGluIHRoZSBPUy4gRm9yIHRoaXMgcmVhc29uIAorCSAqIGRyaXZlciBpcyBqdXN0IGEgdGVtcG9yYXJ5IGtsdWRnZS4KKwkgKgorCSAqIEFsc28gdGhlIENpcnJ1cy9DcnlzdGFsIG1ldGhvZCBkb2Vzbid0IGFsd2F5cyB3b3JrLiBUcnkgSVNBIFBuUCBmaXJzdCA7KQorCSAqLworCisJLyoKKwkgKiBSZXBlYXQgaW5pdGlhbGl6YXRpb24gZmV3IHRpbWVzIHNpbmNlIGl0IGRvZXNuJ3QgYWx3YXlzIHN1Y2NlZWQgaW4KKwkgKiBmaXJzdCB0aW1lLgorCSAqLworCisJZm9yIChuID0gMDsgbiA8IDQ7IG4rKykKKwl7CQorCQkvKgorCQkgKglXYWtlIHVwIHRoZSBjYXJkIGJ5IHNlbmRpbmcgYSAzMiBieXRlIENyeXN0YWwga2V5IHRvIHRoZSBrZXkgcG9ydC4KKwkJICovCisJCQorCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJCUNTX09VVChjcnlzdGFsX2tleVtpXSk7CisKKwkJc2xlZXAoSFogLyAxMCk7CisKKwkJLyoKKwkJICoJTm93IHNldCB0aGUgQ1NOIChDYXJkIFNlbGVjdCBOdW1iZXIpLgorCQkgKi8KKworCQlDU19PVVQyKDB4MDYsIENTTl9OVU0pOworCisJCS8qCisJCSAqCVRoZW4gc2V0IHNvbWUgY29uZmlnIGJ5dGVzLiBGaXJzdCBsb2dpY2FsIGRldmljZSAwIAorCQkgKi8KKworCQlDU19PVVQyKDB4MTUsIDB4MDApOwkvKiBTZWxlY3QgbG9naWNhbCBkZXZpY2UgMCAoV1NTL1NCL0ZNKSAqLworCQlDU19PVVQzKDB4NDcsIChiYXNlID4+IDgpICYgMHhmZiwgYmFzZSAmIDB4ZmYpOwkvKiBXU1MgYmFzZSAqLworCisJCWlmIChjaGVja19yZWdpb24oMHgzODgsIDQpKQkvKiBOb3QgZnJlZSAqLworCQkJQ1NfT1VUMygweDQ4LCAweDAwLCAweDAwKQkvKiBGTSBiYXNlIG9mZiAqLworCQllbHNlCisJCQlDU19PVVQzKDB4NDgsIDB4MDMsIDB4ODgpOwkvKiBGTSBiYXNlIDB4Mzg4ICovCisKKwkJQ1NfT1VUMygweDQyLCAweDAwLCAweDAwKTsJLyogU0IgYmFzZSBvZmYgKi8KKwkJQ1NfT1VUMigweDIyLCBpcnEpOwkJLyogU0IrV1NTIElSUSAqLworCQlDU19PVVQyKDB4MmEsIGRtYTEpOwkJLyogU0IrV1NTIERNQSAqLworCisJCWlmIChkbWEyICE9IC0xKQorCQkJQ1NfT1VUMigweDI1LCBkbWEyKQkvKiBXU1MgRE1BMiAqLworCQllbHNlCisJCQlDU19PVVQyKDB4MjUsIDQpOwkvKiBObyBXU1MgRE1BMiAqLworCisJCUNTX09VVDIoMHgzMywgMHgwMSk7CS8qIEFjdGl2YXRlIGxvZ2ljYWwgZGV2IDAgKi8KKworCQlzbGVlcChIWiAvIDEwKTsKKworCQkvKgorCQkgKiBJbml0aWFsaXplIGxvZ2ljYWwgZGV2aWNlIDMgKE1QVSkKKwkJICovCisKKwkJaWYgKG1wdV9iYXNlICE9IDAgJiYgbXB1X2lycSAhPSAwKQorCQl7CisJCQlDU19PVVQyKDB4MTUsIDB4MDMpOwkvKiBTZWxlY3QgbG9naWNhbCBkZXZpY2UgMyAoTVBVKSAqLworCQkJQ1NfT1VUMygweDQ3LCAobXB1X2Jhc2UgPj4gOCkgJiAweGZmLCBtcHVfYmFzZSAmIDB4ZmYpOwkvKiBNUFUgYmFzZSAqLworCQkJQ1NfT1VUMigweDIyLCBtcHVfaXJxKTsJLyogTVBVIElSUSAqLworCQkJQ1NfT1VUMigweDMzLCAweDAxKTsJLyogQWN0aXZhdGUgbG9naWNhbCBkZXYgMyAqLworCQl9CisKKwkJaWYoc3ludGhfYmFzZSAhPSAwKQorCQl7CisJCSAgICBDU19PVVQyICgweDE1LCAweDA0KTsJICAgICAgICAvKiBsb2dpY2FsIGRldmljZSA0IChXYXZlRnJvbnQpICovCisJCSAgICBDU19PVVQzICgweDQ3LCAoc3ludGhfYmFzZSA+PiA4KSAmIDB4ZmYsCisJCQkgICAgIHN5bnRoX2Jhc2UgJiAweGZmKTsJLyogYmFzZSAqLworCQkgICAgQ1NfT1VUMiAoMHgyMiwgc3ludGhfaXJxKTsgICAgIAkvKiBJUlEgKi8KKwkJICAgIENTX09VVDIgKDB4MzMsIDB4MDEpOwkgICAgICAgIC8qIEFjdGl2YXRlIGxvZ2ljYWwgZGV2IDQgKi8KKwkJfQorCisJCS8qCisJCSAqIEZpbmFsbHkgYWN0aXZhdGUgdGhlIGNoaXAKKwkJICovCisJCQorCQlDU19PVVQoMHg3OSk7CisKKwkJc2xlZXAoSFogLyA1KTsKKworCQkvKgorCQkgKiBUaGVuIHRyeSB0byBkZXRlY3QgdGhlIGNvZGVjIHBhcnQgb2YgdGhlIGNoaXAKKwkJICovCisKKwkJaWYgKGFkMTg0OF9kZXRlY3QocG9ydHMsIE5VTEwsIGh3X2NvbmZpZy0+b3NwKSkKKwkJCWdvdG8gZ290X2l0OworCQkKKwkJc2xlZXAoSFopOworCX0KK2ZhaWw6CisJcmVsZWFzZV9yZWdpb24oYmFzZSwgNCk7CisJcmV0dXJuIDA7CisKK2dvdF9pdDoKKwlpZiAoZG1hMiA9PSAtMSkKKwkJZG1hMiA9IGRtYTE7CisKKwlod19jb25maWctPnNsb3RzWzBdID0gYWQxODQ4X2luaXQoIkNyeXN0YWwgYXVkaW8gY29udHJvbGxlciIsIHBvcnRzLAorCQkJCQkgIGlycSwKKwkJCQkJICBkbWExLAkJLyogUGxheWJhY2sgRE1BICovCisJCQkJCSAgZG1hMiwJCS8qIENhcHR1cmUgRE1BICovCisJCQkJCSAgMCwKKwkJCQkJICBod19jb25maWctPm9zcCwKKwkJCQkJICBUSElTX01PRFVMRSk7CisKKwlpZiAoaHdfY29uZmlnLT5zbG90c1swXSAhPSAtMSAmJgorCQlhdWRpb19kZXZzW2h3X2NvbmZpZy0+c2xvdHNbMF1dLT5taXhlcl9kZXYhPS0xKQorCXsJCisJCS8qIEFzc3VtZSB0aGUgbWl4ZXIgbWFwIGlzIGFzIHN1Z2dlc3RlZCBpbiB0aGUgQ1M0MjMyIGRhdGFib29rICovCisJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUxLCBTT1VORF9NSVhFUl9MSU5FKTsKKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTIsIFNPVU5EX01JWEVSX0NEKTsKKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX1NZTlRIKTsJCS8qIEZNIHN5bnRoICovCisJfQorCWlmIChtcHVfYmFzZSAhPSAwICYmIG1wdV9pcnEgIT0gMCkKKwl7CisJCXN0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGh3X2NvbmZpZzIgPSB7CisJCQkwCisJCX07CQkvKiBFbnN1cmUgaXQncyBpbml0aWFsaXplZCAqLworCisJCWh3X2NvbmZpZzIuaW9fYmFzZSA9IG1wdV9iYXNlOworCQlod19jb25maWcyLmlycSA9IG1wdV9pcnE7CisJCWh3X2NvbmZpZzIuZG1hID0gLTE7CisJCWh3X2NvbmZpZzIuZG1hMiA9IC0xOworCQlod19jb25maWcyLmFsd2F5c19kZXRlY3QgPSAwOworCQlod19jb25maWcyLm5hbWUgPSBOVUxMOworCQlod19jb25maWcyLmRyaXZlcl91c2VfMSA9IDA7CisJCWh3X2NvbmZpZzIuZHJpdmVyX3VzZV8yID0gMDsKKwkJaHdfY29uZmlnMi5jYXJkX3N1YnR5cGUgPSAwOworCisJCWlmIChwcm9iZV91YXJ0NDAxKCZod19jb25maWcyLCBUSElTX01PRFVMRSkpCisJCXsKKwkJCW1wdV9kZXRlY3RlZCA9IDE7CisJCX0KKwkJZWxzZQorCQl7CisJCQltcHVfYmFzZSA9IG1wdV9pcnEgPSAwOworCQl9CisJCWh3X2NvbmZpZy0+c2xvdHNbMV0gPSBod19jb25maWcyLnNsb3RzWzFdOworCX0KKwkKKwlpZiAoYnNzKQorICAgICAgICAJZW5hYmxlX3hjdHJsKGJhc2UpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB1bmxvYWRfY3M0MjMyKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgYmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZSwgaXJxID0gaHdfY29uZmlnLT5pcnE7CisJaW50IGRtYTEgPSBod19jb25maWctPmRtYSwgZG1hMiA9IGh3X2NvbmZpZy0+ZG1hMjsKKworCWlmIChkbWEyID09IC0xKQorCQlkbWEyID0gZG1hMTsKKworCWFkMTg0OF91bmxvYWQoYmFzZSwKKwkJICAgICAgaXJxLAorCQkgICAgICBkbWExLAkvKiBQbGF5YmFjayBETUEgKi8KKwkJICAgICAgZG1hMiwJLyogQ2FwdHVyZSBETUEgKi8KKwkJICAgICAgMCk7CisKKwlzb3VuZF91bmxvYWRfYXVkaW9kZXYoaHdfY29uZmlnLT5zbG90c1swXSk7CisJaWYgKG1wdV9iYXNlICE9IDAgJiYgbXB1X2lycSAhPSAwICYmIG1wdV9kZXRlY3RlZCkKKwl7CisJCXN0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGh3X2NvbmZpZzIgPQorCQl7CisJCQkwCisJCX07CQkvKiBFbnN1cmUgaXQncyBpbml0aWFsaXplZCAqLworCisJCWh3X2NvbmZpZzIuaW9fYmFzZSA9IG1wdV9iYXNlOworCQlod19jb25maWcyLmlycSA9IG1wdV9pcnE7CisJCWh3X2NvbmZpZzIuZG1hID0gLTE7CisJCWh3X2NvbmZpZzIuZG1hMiA9IC0xOworCQlod19jb25maWcyLmFsd2F5c19kZXRlY3QgPSAwOworCQlod19jb25maWcyLm5hbWUgPSBOVUxMOworCQlod19jb25maWcyLmRyaXZlcl91c2VfMSA9IDA7CisJCWh3X2NvbmZpZzIuZHJpdmVyX3VzZV8yID0gMDsKKwkJaHdfY29uZmlnMi5jYXJkX3N1YnR5cGUgPSAwOworCQlod19jb25maWcyLnNsb3RzWzFdID0gaHdfY29uZmlnLT5zbG90c1sxXTsKKworCQl1bmxvYWRfdWFydDQwMSgmaHdfY29uZmlnMik7CisJfQorfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7CitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXB1OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8JPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEyCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXB1aW8JPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVpcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBzeW50aGlvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgc3ludGhpcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpc2FwbnAJPSAxOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkNTNDIzMiBiYXNlZCBzb3VuZGNhcmQgZHJpdmVyIik7IAorTU9EVUxFX0FVVEhPUigiSGFubnUgU2F2b2xhaW5lbiwgUGF1bCBCYXJ0b24tRGF2aXMiKTsgCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaW8sImJhc2UgSS9PIHBvcnQgZm9yIEFEMTg0OCIpOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLCJJUlEgZm9yIEFEMTg0OCBjaGlwIik7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsIjggYml0IERNQSBmb3IgQUQxODQ4IGNoaXAiKTsKK21vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEyLCIxNiBiaXQgRE1BIGZvciBBRDE4NDggY2hpcCIpOworbW9kdWxlX3BhcmFtKG1wdWlvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtcHVpbywiTVBVIDQwMSBiYXNlIGFkZHJlc3MiKTsKK21vZHVsZV9wYXJhbShtcHVpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1wdWlycSwiTVBVIDQwMSBJUlEiKTsKK21vZHVsZV9wYXJhbShzeW50aGlvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhzeW50aGlvLCJNYXVpIFdhdmVUYWJsZSBiYXNlIEkvTyBwb3J0Iik7Cittb2R1bGVfcGFyYW0oc3ludGhpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHN5bnRoaXJxLCJNYXVpIFdhdmVUYWJsZSBJUlEiKTsKK21vZHVsZV9wYXJhbShpc2FwbnAsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhpc2FwbnAsIkVuYWJsZSBJU0FQblAgcHJvYmluZyAoZGVmYXVsdCAxKSIpOworbW9kdWxlX3BhcmFtKGJzcywgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGJzcywiRW5hYmxlIEJvc2UgU291bmQgU3lzdGVtIFN1cHBvcnQgKGRlZmF1bHQgMCkiKTsKKworLyoKKyAqCUluc3RhbGwgYSBDUzQyMzIgYmFzZWQgY2FyZC4gTmVlZCB0byBoYXZlIGFkMTg0OCBhbmQgbXB1NDAxCisgKglsb2FkZWQgcmVhZHkuCisgKi8KKworLyogQWxsIGNzNDIzMiBiYXNlZCBjYXJkcyBoYXZlIHRoZSBtYWluIGFkMTg0OCBjYXJkIGVpdGhlciBhcyBDU0MwMDAwIG9yCisgKiBDU0MwMTAwLiAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkIGNzNDIzMl9wbnBfdGFibGVbXSA9IHsKKwl7IC5pZCA9ICJDU0MwMTAwIiwgLmRyaXZlcl9kYXRhID0gMCB9LAorCXsgLmlkID0gIkNTQzAwMDAiLCAuZHJpdmVyX2RhdGEgPSAwIH0sCisJLyogR3VpbGxlbW90IFR1cnRsZWJlYWNoIHNvbWV0aGluZyBhcHBlYXJzIHRvIGJlIGNzNDIzMiBjb21wYXRpYmxlCisJICogKHVudGVzdGVkKSAqLworCXsgLmlkID0gIkdJTTAxMDAiLCAuZHJpdmVyX2RhdGEgPSAwIH0sCisJeyAuaWQgPSAiIn0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocG5wLCBjczQyMzJfcG5wX3RhYmxlKTsKKworc3RhdGljIGludCBjczQyMzJfcG5wX3Byb2JlKHN0cnVjdCBwbnBfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwbnBfZGV2aWNlX2lkICpkZXZfaWQpCit7CisJc3RydWN0IGFkZHJlc3NfaW5mbyAqaXNhcG5wY2ZnOworCisJaXNhcG5wY2ZnPShzdHJ1Y3QgYWRkcmVzc19pbmZvKilrbWFsbG9jKHNpemVvZigqaXNhcG5wY2ZnKSxHRlBfS0VSTkVMKTsKKwlpZiAoIWlzYXBucGNmZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpc2FwbnBjZmctPmlycQkJPSBwbnBfaXJxKGRldiwgMCk7CisJaXNhcG5wY2ZnLT5kbWEJCT0gcG5wX2RtYShkZXYsIDApOworCWlzYXBucGNmZy0+ZG1hMgkJPSBwbnBfZG1hKGRldiwgMSk7CisJaXNhcG5wY2ZnLT5pb19iYXNlCT0gcG5wX3BvcnRfc3RhcnQoZGV2LCAwKTsKKwlpZiAocHJvYmVfY3M0MjMyKGlzYXBucGNmZyxUUlVFKSA9PSAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3M0MjMyOiBJU0EgUG5QIGNhcmQgZm91bmQsIGJ1dCBub3QgZGV0ZWN0ZWQ/XG4iKTsKKwkJa2ZyZWUoaXNhcG5wY2ZnKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXBucF9zZXRfZHJ2ZGF0YShkZXYsaXNhcG5wY2ZnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNzNDIzMl9wbnBfcmVtb3ZlKHN0cnVjdCBwbnBfZGV2ICpkZXYpCit7CisJc3RydWN0IGFkZHJlc3NfaW5mbyAqY2ZnID0gcG5wX2dldF9kcnZkYXRhKGRldik7CisJaWYgKGNmZykgeworCQl1bmxvYWRfY3M0MjMyKGNmZyk7CisJCWtmcmVlKGNmZyk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHBucF9kcml2ZXIgY3M0MjMyX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiY3M0MjMyIiwKKwkuaWRfdGFibGUJPSBjczQyMzJfcG5wX3RhYmxlLAorCS5wcm9iZQkJPSBjczQyMzJfcG5wX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoY3M0MjMyX3BucF9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9jczQyMzIodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU09VTkRfV0FWRUZST05UX01PRFVMRQorCWlmKHN5bnRoaW8gPT0gLTEpCisJCXByaW50ayhLRVJOX0lORk8gImNzNDIzMjogc2V0IHN5bnRoaW8gYW5kIHN5bnRoaXJxIHRvIHVzZSB0aGUgd2F2ZWZyb250IGZhY2lsaXRpZXMuXG4iKTsKKwllbHNlIHsKKwkJc3ludGhfYmFzZSA9IHN5bnRoaW87CisJCXN5bnRoX2lycSA9ICBzeW50aGlycTsKKwl9CisjZWxzZQorCWlmKHN5bnRoaW8gIT0gLTEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNzNDIzMjogd2F2ZWZyb250IHN1cHBvcnQgbm90IGVuYWJsZWQgaW4gdGhpcyBkcml2ZXIuXG4iKTsKKyNlbmRpZgorCWNmZy5pcnEgPSAtMTsKKworCWlmIChpc2FwbnAgJiYKKwkgICAgKHBucF9yZWdpc3Rlcl9kcml2ZXIoJmNzNDIzMl9kcml2ZXIpID4gMCkKKwkpCisJCXJldHVybiAwOworCisJaWYoaW89PS0xfHxpcnE9PS0xfHxkbWE9PS0xKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczQyMzI6IE11c3Qgc2V0IGlvLCBpcnEgYW5kIGRtYS5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljZmcuaW9fYmFzZSA9IGlvOworCWNmZy5pcnEgPSBpcnE7CisJY2ZnLmRtYSA9IGRtYTsKKwljZmcuZG1hMiA9IGRtYTI7CisKKwljZmdfbXB1LmlvX2Jhc2UgPSAtMTsKKwljZmdfbXB1LmlycSA9IC0xOworCisJaWYgKG1wdWlvICE9IC0xICYmIG1wdWlycSAhPSAtMSkgeworCQljZmdfbXB1LmlvX2Jhc2UgPSBtcHVpbzsKKwkJY2ZnX21wdS5pcnEgPSBtcHVpcnE7CisJCXByb2JlX2NzNDIzMl9tcHUoJmNmZ19tcHUpOyAvKiBCdWcgYWx3YXlzIHJldHVybnMgMCBub3QgT0sgLS0gQUMgKi8KKwl9CisKKwlpZiAocHJvYmVfY3M0MjMyKCZjZmcsRkFMU0UpID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2NzNDIzMih2b2lkKQoreworCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmY3M0MjMyX2RyaXZlcik7CisgICAgICAgIGlmIChjZmcuaXJxICE9IC0xKQorCQl1bmxvYWRfY3M0MjMyKCZjZmcpOyAvKiBVbmxvYWRzIGdsb2JhbCBNUFUgYXMgd2VsbCwgaWYgbmVlZGVkICovCit9CisKK21vZHVsZV9pbml0KGluaXRfY3M0MjMyKTsKK21vZHVsZV9leGl0KGNsZWFudXBfY3M0MjMyKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX2NzNDIzMihjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSwgZG1hLCBkbWEyIG1wdWlvLCBtcHVpcnEqLworCWludCBpbnRzWzddOworCisJLyogSWYgd2UgaGF2ZSBpc2FwbnAgY2FyZHMsIG5vIG5lZWQgZm9yIG9wdGlvbnMgKi8KKwlpZiAocG5wX3JlZ2lzdGVyX2RyaXZlcigmY3M0MjMyX2RyaXZlcikgPiAwKQorCQlyZXR1cm4gMTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvCT0gaW50c1sxXTsKKwlpcnEJPSBpbnRzWzJdOworCWRtYQk9IGludHNbM107CisJZG1hMgk9IGludHNbNF07CisJbXB1aW8JPSBpbnRzWzVdOworCW1wdWlycQk9IGludHNbNl07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiY3M0MjMyPSIsIHNldHVwX2NzNDIzMik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQyODEvTWFrZWZpbGUgYi9zb3VuZC9vc3MvY3M0MjgxL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkNTI3ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvY3M0MjgxL01ha2VmaWxlCkBAIC0wLDAgKzEsNiBAQAorIyBNYWtlZmlsZSBmb3IgQ2lycnVzIExvZ2ljLUNyeXN0YWwgQ1M0MjgxIAorIworCitvYmotJChDT05GSUdfU09VTkRfQ1M0MjgxKSArPSBjczQyODEubworCitjczQyODEtb2JqcyArPSBjczQyODFtLm8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQyODEvY3M0MjgxX2h3ZGVmcy5oIGIvc291bmQvb3NzL2NzNDI4MS9jczQyODFfaHdkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAxZDU5NQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9jczQyODEvY3M0MjgxX2h3ZGVmcy5oCkBAIC0wLDAgKzEsMTIzNCBAQAorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gSFdERUZTLkggLSBEZWZpbml0aW9ucyBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBkYXRhIHN0cnVjdHVyZXMgdXNlZCBieSB0aGUKKy8vICAgICAgICAgICAgQ1M0MjgxCisvLworLy8gQ29weXJpZ2h0IChjKSAxOTk5LDIwMDAsMjAwMSBDcnlzdGFsIFNlbWljb25kdWN0b3IgQ29ycC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworI2lmbmRlZiBfSF9IV0RFRlMKKyNkZWZpbmUgX0hfSFdERUZTCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBvZmZzZXRzIG9mIHRoZSByZWdpc3RlcnMgbG9jYXRlZCBpbiB0aGUgUENJCisvLyBjb25maWd1cmF0aW9uIHNwYWNlIG9mIHRoZSBDUzQyODEgcGFydC4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUENJQ09ORklHX0RFVklEX1ZFTklEICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIFBDSUNPTkZJR19TVEFUVVNfQ09NTUFORCAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBQQ0lDT05GSUdfQ0xBU1NfUkVWSVNJT04gICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgUENJQ09ORklHX0xBVEVOQ1lfVElNRVIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMENMCisjZGVmaW5lIFBDSUNPTkZJR19CQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBQQ0lDT05GSUdfQkExICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNEwKKyNkZWZpbmUgUENJQ09ORklHX1NVQlNZU0lEX1NVQlNZU1ZFTklEICAgICAgICAgIDB4MDAwMDAwMkNMCisjZGVmaW5lIFBDSUNPTkZJR19JTlRFUlJVUFQgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDNDTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgcmVnaXN0ZXJzIGFjY2Vzc2VkIHZpYSBiYXNlIGFkZHJlc3MKKy8vIHJlZ2lzdGVyIHplcm8gb24gdGhlIENTNDI4MSBwYXJ0LgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBCQTBfSElTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwKKyNkZWZpbmUgQkEwX0hJQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIEJBMF9ISU1SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBDTAorI2RlZmluZSBCQTBfSUlFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgQkEwX0hEU1IwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjBMCisjZGVmaW5lIEJBMF9IRFNSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEY0TAorI2RlZmluZSBCQTBfSERTUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGOEwKKyNkZWZpbmUgQkEwX0hEU1IzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkNMCisjZGVmaW5lIEJBMF9EQ0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEwTAorI2RlZmluZSBCQTBfRENDMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNEwKKyNkZWZpbmUgQkEwX0RCQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMThMCisjZGVmaW5lIEJBMF9EQkMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFDTAorI2RlZmluZSBCQTBfRENBMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEyMEwKKyNkZWZpbmUgQkEwX0RDQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMjRMCisjZGVmaW5lIEJBMF9EQkExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTI4TAorI2RlZmluZSBCQTBfREJDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEyQ0wKKyNkZWZpbmUgQkEwX0RDQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMzBMCisjZGVmaW5lIEJBMF9EQ0MyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTM0TAorI2RlZmluZSBCQTBfREJBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEzOEwKKyNkZWZpbmUgQkEwX0RCQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxM0NMCisjZGVmaW5lIEJBMF9EQ0EzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTQwTAorI2RlZmluZSBCQTBfRENDMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE0NEwKKyNkZWZpbmUgQkEwX0RCQTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxNDhMCisjZGVmaW5lIEJBMF9EQkMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTRDTAorI2RlZmluZSBCQTBfRE1SMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE1MEwKKyNkZWZpbmUgQkEwX0RDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxNTRMCisjZGVmaW5lIEJBMF9ETVIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTU4TAorI2RlZmluZSBCQTBfRENSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE1Q0wKKyNkZWZpbmUgQkEwX0RNUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxNjBMCisjZGVmaW5lIEJBMF9EQ1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTY0TAorI2RlZmluZSBCQTBfRE1SMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE2OEwKKyNkZWZpbmUgQkEwX0RDUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxNkNMCisjZGVmaW5lIEJBMF9ETE1SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTcwTAorI2RlZmluZSBCQTBfRExTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE3NEwKKyNkZWZpbmUgQkEwX0ZDUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxODBMCisjZGVmaW5lIEJBMF9GQ1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTg0TAorI2RlZmluZSBCQTBfRkNSMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE4OEwKKyNkZWZpbmUgQkEwX0ZDUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxOENMCisjZGVmaW5lIEJBMF9GUERSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTkwTAorI2RlZmluZSBCQTBfRlBEUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDE5NEwKKyNkZWZpbmUgQkEwX0ZQRFIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxOThMCisjZGVmaW5lIEJBMF9GUERSMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTlDTAorI2RlZmluZSBCQTBfRkNIUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwQ0wKKyNkZWZpbmUgQkEwX0ZTSUMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTBMCisjZGVmaW5lIEJBMF9GU0lDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE0TAorI2RlZmluZSBCQTBfRlNJQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxOEwKKyNkZWZpbmUgQkEwX0ZTSUMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUNMCisjZGVmaW5lIEJBMF9QQ0lDRkcwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwTAorI2RlZmluZSBCQTBfUENJQ0ZHMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNEwKKyNkZWZpbmUgQkEwX1BDSUNGRzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDhMCisjZGVmaW5lIEJBMF9QQ0lDRkcwQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzBDTAorI2RlZmluZSBCQTBfUENJQ0ZHMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxMEwKKyNkZWZpbmUgQkEwX1BDSUNGRzE0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMTRMCisjZGVmaW5lIEJBMF9QQ0lDRkcxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzE4TAorI2RlZmluZSBCQTBfUENJQ0ZHMUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxQ0wKKyNkZWZpbmUgQkEwX1BDSUNGRzIwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMjBMCisjZGVmaW5lIEJBMF9QQ0lDRkcyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzI0TAorI2RlZmluZSBCQTBfUENJQ0ZHMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyOEwKKyNkZWZpbmUgQkEwX1BDSUNGRzJDICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMkNMCisjZGVmaW5lIEJBMF9QQ0lDRkczMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzMwTAorI2RlZmluZSBCQTBfUENJQ0ZHMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzNEwKKyNkZWZpbmUgQkEwX1BDSUNGRzM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMzhMCisjZGVmaW5lIEJBMF9QQ0lDRkczQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzNDTAorI2RlZmluZSBCQTBfUENJQ0ZHNDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDM0MEwKKyNkZWZpbmUgQkEwX1BNQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzNDRMCisjZGVmaW5lIEJBMF9DV1BSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwM0UwTAorI2RlZmluZSBCQTBfRVBQTUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNFNEwKKyNkZWZpbmUgQkEwX0dQSU9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzRThMCisjZGVmaW5lIEJBMF9TUE1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwM0VDTAorI2RlZmluZSBCQTBfQ0ZMUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNGMEwKKyNkZWZpbmUgQkEwX0lJU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzRjRMCisjZGVmaW5lIEJBMF9UTVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwM0Y4TAorI2RlZmluZSBCQTBfU1NWSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNGQ0wKKyNkZWZpbmUgQkEwX0NMS0NSMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBMCisjZGVmaW5lIEJBMF9GUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDEwTAorI2RlZmluZSBCQTBfU0xUMTJPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQxQ0wKKyNkZWZpbmUgQkEwX1NFUk1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjBMCisjZGVmaW5lIEJBMF9TRVJDMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDI4TAorI2RlZmluZSBCQTBfU0VSQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQyQ0wKKyNkZWZpbmUgQkEwX1NMVDEyTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NUNMCisjZGVmaW5lIEJBMF9BQ0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDYwTAorI2RlZmluZSBCQTBfQUNTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ2NEwKKyNkZWZpbmUgQkEwX0FDT1NWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjhMCisjZGVmaW5lIEJBMF9BQ0NBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDZDTAorI2RlZmluZSBCQTBfQUNDREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3MEwKKyNkZWZpbmUgQkEwX0FDSVNWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzRMCisjZGVmaW5lIEJBMF9BQ1NBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDc4TAorI2RlZmluZSBCQTBfQUNTREEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ3Q0wKKyNkZWZpbmUgQkEwX0pTUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODBMCisjZGVmaW5lIEJBMF9KU0NUTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDg0TAorI2RlZmluZSBCQTBfTUlEQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5MEwKKyNkZWZpbmUgQkEwX01JRENNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTRMCisjZGVmaW5lIEJBMF9NSURTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDk0TAorI2RlZmluZSBCQTBfTUlEV1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQ5OEwKKyNkZWZpbmUgQkEwX01JRFJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OUNMCisjZGVmaW5lIEJBMF9BT0RTRDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEE4TAorI2RlZmluZSBCQTBfQU9EU0QyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRBQ0wKKyNkZWZpbmUgQkEwX0NGR0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjBMCisjZGVmaW5lIEJBMF9TTFQxMk0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNERDTAorI2RlZmluZSBCQTBfQUNTVFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRFNEwKKyNkZWZpbmUgQkEwX0FDSVNWMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0RjRMCisjZGVmaW5lIEJBMF9BQ1NBRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEY4TAorI2RlZmluZSBCQTBfQUNTREEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDRGQ0wKKyNkZWZpbmUgQkEwX0lPVEdQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDBMCisjZGVmaW5lIEJBMF9JT1RTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTA0TAorI2RlZmluZSBCQTBfSU9URk0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwOEwKKyNkZWZpbmUgQkEwX0lPVERNQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MENMCisjZGVmaW5lIEJBMF9JT1RBQzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTAwTAorI2RlZmluZSBCQTBfSU9UQUMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNEwKKyNkZWZpbmUgQkEwX0lPVEFDMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDhMCisjZGVmaW5lIEJBMF9JT1RBQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTBDTAorI2RlZmluZSBCQTBfSU9UUENQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDUyQ0wKKyNkZWZpbmUgQkEwX0lPVENDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MzBMCisjZGVmaW5lIEJBMF9JT1RDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNThDTAorI2RlZmluZSBCQTBfUENQUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwMEwKKyNkZWZpbmUgQkEwX1BDUEdSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MDRMCisjZGVmaW5lIEJBMF9QQ1BDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjA4TAorI2RlZmluZSBCQTBfUENQQ0lFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYwOEwKKyNkZWZpbmUgQkEwX1NCTUFSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MDBMCisjZGVmaW5lIEJBMF9TQk1EUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzA0TAorI2RlZmluZSBCQTBfU0JSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDcwOEwKKyNkZWZpbmUgQkEwX1NCUkRQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MENMCisjZGVmaW5lIEJBMF9TQldEUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzEwTAorI2RlZmluZSBCQTBfU0JXQlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDcxMEwKKyNkZWZpbmUgQkEwX1NCUkJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MTRMCisjZGVmaW5lIEJBMF9GTVNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzMwTAorI2RlZmluZSBCQTBfQjBBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDczMEwKKyNkZWZpbmUgQkEwX0ZNRFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MzRMCisjZGVmaW5lIEJBMF9CMUFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzM4TAorI2RlZmluZSBCQTBfQjFEUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDczQ0wKKyNkZWZpbmUgQkEwX1NTUE0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3NDBMCisjZGVmaW5lIEJBMF9EQUNTUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzQ0TAorI2RlZmluZSBCQTBfQURDU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDc0OEwKKyNkZWZpbmUgQkEwX1NTQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3NENMCisjZGVmaW5lIEJBMF9GTUxWQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzU0TAorI2RlZmluZSBCQTBfRk1SVkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDc1OEwKKyNkZWZpbmUgQkEwX1NSQ1NBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3NUNMCisjZGVmaW5lIEJBMF9QUExWQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzYwTAorI2RlZmluZSBCQTBfUFBSVkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDc2NEwKKyNkZWZpbmUgQkEwX1BBU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3NjhMCisjZGVmaW5lIEJBMF9DQVNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNzZDTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgQUM5NyBzaGFkb3cgcmVnaXN0ZXJzLCB3aGljaCBhcHBlYXIKKy8vIGFzIGEgdmlydHVhbCBleHRlbnNpb24gdG8gdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciB6ZXJvIG1lbW9yeSByYW5nZS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQUM5N19SRUdfT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0VMCisjZGVmaW5lIEFDOTdfQ09ERUNfTlVNQkVSX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAzMDAwTAorCisjZGVmaW5lIEJBMF9BQzk3X1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwTAorI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVk9MVU1FICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMkwKKyNkZWZpbmUgQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSAgICAgICAgICAgICAgIDB4MDAwMDEwMDRMCisjZGVmaW5lIEJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyAgICAgICAgICAgICAweDAwMDAxMDA2TAorI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVE9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwOEwKKyNkZWZpbmUgQkEwX0FDOTdfUENfQkVFUF9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMEFMCisjZGVmaW5lIEJBMF9BQzk3X1BIT05FX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAweDAwMDAxMDBDTAorI2RlZmluZSBCQTBfQUM5N19NSUNfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwRUwKKyNkZWZpbmUgQkEwX0FDOTdfTElORV9JTl9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTBMCisjZGVmaW5lIEJBMF9BQzk3X0NEX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDEyTAorI2RlZmluZSBCQTBfQUM5N19WSURFT19WT0xVTUUgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxNEwKKyNkZWZpbmUgQkEwX0FDOTdfQVVYX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTZMCisjZGVmaW5lIEJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FICAgICAgICAgICAgICAgICAweDAwMDAxMDE4TAorI2RlZmluZSBCQTBfQUM5N19SRUNPUkRfU0VMRUNUICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxQUwKKyNkZWZpbmUgQkEwX0FDOTdfUkVDT1JEX0dBSU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMUNMCisjZGVmaW5lIEJBMF9BQzk3X1JFQ09SRF9HQUlOX01JQyAgICAgICAgICAgICAgICAweDAwMDAxMDFFTAorI2RlZmluZSBCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UgICAgICAgICAgICAgICAgMHgwMDAwMTAyMEwKKyNkZWZpbmUgQkEwX0FDOTdfM0RfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjJMCisjZGVmaW5lIEJBMF9BQzk3X01PREVNX1JBVEUgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDI0TAorI2RlZmluZSBCQTBfQUM5N19QT1dFUkRPV04gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAyNkwKKyNkZWZpbmUgQkEwX0FDOTdfRVhUX0FVRElPX0lEICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjhMCisjZGVmaW5lIEJBMF9BQzk3X0VYVF9BVURJT19QT1dFUiAgICAgICAgICAgICAgICAweDAwMDAxMDJBTAorI2RlZmluZSBCQTBfQUM5N19QQ01fRlJPTlRfREFDX1JBVEUgICAgICAgICAgICAgMHgwMDAwMTAyQ0wKKyNkZWZpbmUgQkEwX0FDOTdfUENNX1NVUlJfREFDX1JBVEUgICAgICAgICAgICAgIDB4MDAwMDEwMkVMCisjZGVmaW5lIEJBMF9BQzk3X1BDTV9MRkVfREFDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDMwTAorI2RlZmluZSBCQTBfQUM5N19QQ01fTFJfQURDX1JBVEUgICAgICAgICAgICAgICAgMHgwMDAwMTAzMkwKKyNkZWZpbmUgQkEwX0FDOTdfTUlDX0FEQ19SQVRFICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMzRMCisjZGVmaW5lIEJBMF9BQzk3XzZDSF9WT0xfQ19MRkUgICAgICAgICAgICAgICAgICAweDAwMDAxMDM2TAorI2RlZmluZSBCQTBfQUM5N182Q0hfVk9MX1NVUlJPVU5EICAgICAgICAgICAgICAgMHgwMDAwMTAzOEwKKyNkZWZpbmUgQkEwX0FDOTdfUkVTRVJWRURfM0EgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwM0FMCisjZGVmaW5lIEJBMF9BQzk3X0VYVF9NT0RFTV9JRCAgICAgICAgICAgICAgICAgICAweDAwMDAxMDNDTAorI2RlZmluZSBCQTBfQUM5N19FWFRfTU9ERU1fUE9XRVIgICAgICAgICAgICAgICAgMHgwMDAwMTAzRUwKKyNkZWZpbmUgQkEwX0FDOTdfTElORTFfQ09ERUNfUkFURSAgICAgICAgICAgICAgIDB4MDAwMDEwNDBMCisjZGVmaW5lIEJBMF9BQzk3X0xJTkUyX0NPREVDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDQyTAorI2RlZmluZSBCQTBfQUM5N19IQU5EU0VUX0NPREVDX1JBVEUgICAgICAgICAgICAgMHgwMDAwMTA0NEwKKyNkZWZpbmUgQkEwX0FDOTdfTElORTFfQ09ERUNfTEVWRUwgICAgICAgICAgICAgIDB4MDAwMDEwNDZMCisjZGVmaW5lIEJBMF9BQzk3X0xJTkUyX0NPREVDX0xFVkVMICAgICAgICAgICAgICAweDAwMDAxMDQ4TAorI2RlZmluZSBCQTBfQUM5N19IQU5EU0VUX0NPREVDX0xFVkVMICAgICAgICAgICAgMHgwMDAwMTA0QUwKKyNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fQ09ORklHICAgICAgICAgICAgICAgIDB4MDAwMDEwNENMCisjZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1RZUEUgICAgICAgICAgICAgICAgICAweDAwMDAxMDRFTAorI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9TVElDS1kgICAgICAgICAgICAgICAgMHgwMDAwMTA1MEwKKyNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fV0FLRVVQICAgICAgICAgICAgICAgIDB4MDAwMDEwNTJMCisjZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1NUQVRVUyAgICAgICAgICAgICAgICAweDAwMDAxMDU0TAorI2RlZmluZSBCQTBfQUM5N19NSVNDX01PREVNX0FGRV9TVEFUICAgICAgICAgICAgMHgwMDAwMTA1NkwKKyNkZWZpbmUgQkEwX0FDOTdfUkVTRVJWRURfNTggICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNThMCisjZGVmaW5lIEJBMF9BQzk3X0NSWVNUQUxfUkVWX05fRkFCX0lEICAgICAgICAgICAweDAwMDAxMDVBTAorI2RlZmluZSBCQTBfQUM5N19URVNUX0FORF9NSVNDX0NUUkwgICAgICAgICAgICAgMHgwMDAwMTA1Q0wKKyNkZWZpbmUgQkEwX0FDOTdfQUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNUVMCisjZGVmaW5lIEJBMF9BQzk3X01JU0NfQ1JZU1RBTF9DT05UUk9MICAgICAgICAgICAweDAwMDAxMDYwTAorI2RlZmluZSBCQTBfQUM5N19MSU5FMV9IWVBSSURfQ1RSTCAgICAgICAgICAgICAgMHgwMDAwMTA2MkwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzY0ICAgICAgICAgICAgIDB4MDAwMDEwNjRMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82NiAgICAgICAgICAgICAweDAwMDAxMDY2TAorI2RlZmluZSBCQTBfQUM5N19TUERJRl9DT05UUk9MICAgICAgICAgICAgICAgICAgMHgwMDAwMTA2OEwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzZBICAgICAgICAgICAgIDB4MDAwMDEwNkFMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82QyAgICAgICAgICAgICAweDAwMDAxMDZDTAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNkUgICAgICAgICAgICAgMHgwMDAwMTA2RUwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzcwICAgICAgICAgICAgIDB4MDAwMDEwNzBMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF83MiAgICAgICAgICAgICAweDAwMDAxMDcyTAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNzQgICAgICAgICAgICAgMHgwMDAwMTA3NEwKKyNkZWZpbmUgQkEwX0FDOTdfQ0FMX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNzZMCisjZGVmaW5lIEJBMF9BQzk3X0NBTF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDc4TAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfN0EgICAgICAgICAgICAgMHgwMDAwMTA3QUwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX0lEMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwN0NMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9JRDIgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDdFTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBtZW1vcmllcyBhY2Nlc3NlZCB2aWEKKy8vIGJhc2UgYWRkcmVzcyByZWdpc3RlciBvbmUgb24gdGhlIENTNDI4MSBwYXJ0LgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDSSBkZXZpY2UgSUQvdmVuZG9yIElECisvLyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUERWX1ZFTklEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIFBEVl9ERVZJRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwTAorI2RlZmluZSBQRFZfVkVOSURfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgUERWX0RFVklEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2TAorI2RlZmluZSBWRU5JRF9DSVJSVVNfTE9HSUMgICAgICAgICAgICAgICAgICAgICAgMHgxMDEzTAorI2RlZmluZSBERVZJRF9DUzQyODEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg2MDA1TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDSSBzdGF0dXMgYW5kIGNvbW1hbmQKKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBQU0NfSU9fU1BBQ0VfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgUFNDX01FTU9SWV9TUEFDRV9FTkFCTEUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFBTQ19CVVNfTUFTVEVSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBQU0NfU1BFQ0lBTF9DWUNMRVMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgUFNDX01XSV9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIFBTQ19WR0FfUEFMRVRURV9TTk9PUCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBQU0NfUEFSSVRZX1JFU1BPTlNFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgUFNDX1dBSVRfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMCisjZGVmaW5lIFBTQ19TRVJSX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwTAorI2RlZmluZSBQU0NfRkFTVF9CMkJfRU5BQkxFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMEwKKyNkZWZpbmUgUFNDX1VERl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA3RjAwMDBMCisjZGVmaW5lIFBTQ19GQVNUX0IyQl9DQVBBQkxFICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwTAorI2RlZmluZSBQU0NfUEFSSVRZX0VSUk9SX0RFVEVDVEVEICAgICAgICAgICAgICAgMHgwMTAwMDAwMEwKKyNkZWZpbmUgUFNDX0RFVlNFTF9USU1JTkdfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDBMCisjZGVmaW5lIFBTQ19UQVJHRVRfQUJPUlRfU0lHTkFMTEVEICAgICAgICAgICAgICAweDA4MDAwMDAwTAorI2RlZmluZSBQU0NfUkVDRUlWRURfVEFSR0VUX0FCT1JUICAgICAgICAgICAgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgUFNDX1JFQ0VJVkVEX01BU1RFUl9BQk9SVCAgICAgICAgICAgICAgIDB4MjAwMDAwMDBMCisjZGVmaW5lIFBTQ19TSUdOQUxMRURfU0VSUiAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwTAorI2RlZmluZSBQU0NfREVURUNURURfUEFSSVRZX0VSUk9SICAgICAgICAgICAgICAgMHg4MDAwMDAwMEwKKyNkZWZpbmUgUFNDX1VERl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2TAorI2RlZmluZSBQU0NfREVWU0VMX1RJTUlOR19TSElGVCAgICAgICAgICAgICAgICAgMjVMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUENJIGNsYXNzL3JldmlzaW9uIElECisvLyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUENSX1JFVklEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkZMCisjZGVmaW5lIFBDUl9JTlRFUkZBQ0VfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRjAwTAorI2RlZmluZSBQQ1JfU1VCQ0xBU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMEZGMDAwMEwKKyNkZWZpbmUgUENSX0NMQVNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYwMDAwMDBMCisjZGVmaW5lIFBDUl9SRVZJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwTAorI2RlZmluZSBQQ1JfSU5URVJGQUNFX1NISUZUICAgICAgICAgICAgICAgICAgICAgOEwKKyNkZWZpbmUgUENSX1NVQkNMQVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDE2TAorI2RlZmluZSBQQ1JfQ0xBU1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMjRMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUENJIGxhdGVuY3kgdGltZXIgcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFBMVF9DQUNIRV9MSU5FX1NJWkVfTUFTSyAgICAgICAgICAgICAgICAweDAwMDAwMEZGTAorI2RlZmluZSBQTFRfTEFURU5DWV9USU1FUl9NQVNLICAgICAgICAgICAgICAgICAgMHgwMDAwRkYwMEwKKyNkZWZpbmUgUExUX0hFQURFUl9UWVBFX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDBGRjAwMDBMCisjZGVmaW5lIFBMVF9CSVNUX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGMDAwMDAwTAorI2RlZmluZSBQTFRfQ0FDSEVfTElORV9TSVpFX1NISUZUICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgUExUX0xBVEVOQ1lfVElNRVJfU0hJRlQgICAgICAgICAgICAgICAgIDhMCisjZGVmaW5lIFBMVF9IRUFERVJfVFlQRV9TSElGVCAgICAgICAgICAgICAgICAgICAxNkwKKyNkZWZpbmUgUExUX0JJU1RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDI0TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDSSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXJzLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBQQkFSX01FTU9SWV9TUEFDRV9JTkRJQ0FUT1IgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgUEJBUl9MT0NBVElPTl9UWVBFX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDZMCisjZGVmaW5lIFBCQVJfTk9UX1BSRUZFVENIQUJMRSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TAorI2RlZmluZSBQQkFSX0FERFJFU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGMEwKKyNkZWZpbmUgUEJBUl9MT0NBVElPTl9UWVBFX1NISUZUICAgICAgICAgICAgICAgIDFMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUENJIHN1YnN5c3RlbSBJRC9zdWJzeXN0ZW0KKy8vIHZlbmRvciBJRCByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUFNTX1NVQlNZU1RFTV9WRU5ET1JfSURfTUFTSyAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIFBTU19TVUJTWVNURU1fSURfTUFTSyAgICAgICAgICAgICAgICAgICAweEZGRkYwMDAwTAorI2RlZmluZSBQU1NfU1VCU1lTVEVNX1ZFTkRPUl9JRF9TSElGVCAgICAgICAgICAgMEwKKyNkZWZpbmUgUFNTX1NVQlNZU1RFTV9JRF9TSElGVCAgICAgICAgICAgICAgICAgIDE2TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDSSBpbnRlcnJ1cHQgcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFBJX0xJTkVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGTAorI2RlZmluZSBQSV9QSU5fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkYwMEwKKyNkZWZpbmUgUElfTUlOX0dSQU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDBGRjAwMDBMCisjZGVmaW5lIFBJX01BWF9MQVRFTkNZX01BU0sgICAgICAgICAgICAgICAgICAgICAweEZGMDAwMDAwTAorI2RlZmluZSBQSV9MSU5FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgUElfUElOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgIDhMCisjZGVmaW5lIFBJX01JTl9HUkFOVF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAxNkwKKyNkZWZpbmUgUElfTUFYX0xBVEVOQ1lfU0hJRlQgICAgICAgICAgICAgICAgICAgIDI0TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgaW50ZXJydXB0IHN0YXR1cworLy8gcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEhJU1JfSFZPTE1BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgSElTUl9WRE5JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBISVNSX1ZVUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIEhJU1JfR1AxSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgSElTUl9HUDNJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TAorI2RlZmluZSBISVNSX0dQU0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIEhJU1JfR1BQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgSElTUl9ETUFJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwTAorI2RlZmluZSBISVNSX0ZJRk9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDBMCisjZGVmaW5lIEhJU1JfSFZPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMEwKKyNkZWZpbmUgSElTUl9NSURJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwTAorI2RlZmluZSBISVNSX1NCSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDBMCisjZGVmaW5lIEhJU1JfSU5URU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMEwKKyNkZWZpbmUgSElTUl9ETUFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwRjAwTAorI2RlZmluZSBISVNSX0ZJRk9fTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEYwMDBMCisjZGVmaW5lIEhJU1JfRE1BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOEwKKyNkZWZpbmUgSElTUl9GSUZPX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxMkwKKyNkZWZpbmUgSElTUl9GSUZPMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwTAorI2RlZmluZSBISVNSX0ZJRk8xICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDBMCisjZGVmaW5lIEhJU1JfRklGTzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMEwKKyNkZWZpbmUgSElTUl9GSUZPMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwTAorI2RlZmluZSBISVNSX0RNQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIEhJU1JfRE1BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMEwKKyNkZWZpbmUgSElTUl9ETUEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwTAorI2RlZmluZSBISVNSX0RNQTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDBMCisjZGVmaW5lIEhJU1JfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IGludGVycnVwdCBjb250cm9sCisvLyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgSElDUl9JRVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBISUNSX0NIR00gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgRE1BIE1vZGUgUmVnaXN0ZXIgbgorLy8gKERNUm4pCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIERNUm5fVFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQ0wKKyNkZWZpbmUgRE1Sbl9UUl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyTAorI2RlZmluZSBETVJuX0FVVE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIERNUm5fVFJfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgRE1Sbl9UUl9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBETVJuX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwQzBMCisjZGVmaW5lIERNUm5fVFlQRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgNkwKKyNkZWZpbmUgRE1Sbl9TSVpFOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwTAorI2RlZmluZSBETVJuX01PTk8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDBMCisjZGVmaW5lIERNUm5fQkVORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAwMEwKKyNkZWZpbmUgRE1Sbl9VU0lHTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwTAorI2RlZmluZSBETVJuX1NJWkUyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxMDAwMDBMCisjZGVmaW5lIERNUm5fU1dBUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMEwKKyNkZWZpbmUgRE1Sbl9DQkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwTAorI2RlZmluZSBETVJuX1RCQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDBMCisjZGVmaW5lIERNUm5fUE9MTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgRE1Sbl9ETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwTAorI2RlZmluZSBETVJuX0ZTRUxfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4QzAwMDAwMDBMCisjZGVmaW5lIERNUm5fRlNFTF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMzBMCisjZGVmaW5lIERNUm5fRlNFTDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwKKyNkZWZpbmUgRE1Sbl9GU0VMMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwTAorI2RlZmluZSBETVJuX0ZTRUwyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDBMCisjZGVmaW5lIERNUm5fRlNFTDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDMDAwMDAwMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBETUEgQ29tbWFuZCBSZWdpc3RlciBuCisvLyAoRENSbikKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgRENSbl9IVENJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwTAorI2RlZmluZSBEQ1JuX1RDSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBMCisjZGVmaW5lIERDUm5fTVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBGSUZPIENvbnRyb2wgCisvLyByZWdpc3RlciBuLihGQ1JuKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBGQ1JuX09GX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RkwKKyNkZWZpbmUgRkNSbl9PRl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisjZGVmaW5lIEZDUm5fU1pfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA3RjAwTAorI2RlZmluZSBGQ1JuX1NaX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgOEwKKyNkZWZpbmUgRkNSbl9MU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRjAwMDBMCisjZGVmaW5lIEZDUm5fTFNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAxNkwKKyNkZWZpbmUgRkNSbl9SU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MUYwMDAwMDBMCisjZGVmaW5lIEZDUm5fUlNfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAyNEwKKyNkZWZpbmUgRkNSbl9GRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDBMCisjZGVmaW5lIEZDUm5fUFNIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwTAorI2RlZmluZSBGQ1JuX0RBQ1ogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBQb3dlciBNYW5hZ2VtZW50CisvLyBjb250cm9sIHJlZ2lzdGVyLihTUE1DKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBTUE1DX1JTVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgU1BNQ19BU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFNQTUNfV1VQMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBTUE1DX1dVUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgU1BNQ19BU0RJMkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIFNQTUNfRVNTUEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwTAorI2RlZmluZSBTUE1DX0dJU1BFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMEwKKyNkZWZpbmUgU1BNQ19HSVBQRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQ29uZmlndXJhdGlvbiBMb2FkIHJlZ2lzdGVyLgorLy8gKENGTFIpCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIENGTFJfQ0xPQ0tfU09VUkNFX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzTAorI2RlZmluZSBDRkxSX0NMT0NLX1NPVVJDRV9BQzk3ICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKworI2RlZmluZSBDRkxSX0NCMF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkZMCisjZGVmaW5lIENGTFJfQ0IxX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkYwMEwKKyNkZWZpbmUgQ0ZMUl9DQjJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwRkYwMDAwTAorI2RlZmluZSBDRkxSX0NCM19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkYwMDAwMDBMCisjZGVmaW5lIENGTFJfQ0IwX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgQ0ZMUl9DQjFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICA4TAorI2RlZmluZSBDRkxSX0NCMl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2TAorI2RlZmluZSBDRkxSX0NCM19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0TAorCisjZGVmaW5lIElPVENSX0RNQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBJT1RDUl9ETUExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMEwKKyNkZWZpbmUgSU9UQ1JfRE1BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDBMCisjZGVmaW5lIElPVENSX0RNQTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwQzAwTAorI2RlZmluZSBJT1RDUl9DQ0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMEwKKyNkZWZpbmUgSU9UQ1JfUENQQ0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDBMCisjZGVmaW5lIElPVENSX0RETUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwTAorCisjZGVmaW5lIFNCV0JTX1dCQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFNSQyBTbG90IEFzc2lnbm1lbnQgUmVnaXN0ZXIKKy8vIChTUkNTQSkKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgU1JDU0FfUExTU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUZMCisjZGVmaW5lIFNSQ1NBX1BMU1NfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwTAorI2RlZmluZSBTUkNTQV9QUlNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMUYwMEwKKyNkZWZpbmUgU1JDU0FfUFJTU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDhMCisjZGVmaW5lIFNSQ1NBX0NMU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMUYwMDAwTAorI2RlZmluZSBTUkNTQV9DTFNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMTZMCisjZGVmaW5lIFNSQ1NBX0NSU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDFGMDAwMDAwTAorI2RlZmluZSBTUkNTQV9DUlNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMjRMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU291bmQgU3lzdGVtIFBvd2VyIE1hbmFnZW1lbnQKKy8vIHJlZ2lzdGVyLihTU1BNKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBTU1BNX0ZQRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgU1NQTV9NSVhFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDBMCisjZGVmaW5lIFNTUE1fQ1NSQ0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBTU1BNX1BTUkNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgU1NQTV9KU0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIFNTUE1fQUNMRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBTU1BNX0ZNRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTb3VuZCBTeXN0ZW0gQ29udHJvbAorLy8gUmVnaXN0ZXIuIChTU0NSKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBTU0NSX1NCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgU1NDUl9IVkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIFNTQ1JfTFBGSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwTAorI2RlZmluZSBTU0NSX0xQU1JDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgU1NDUl9YTFBTUkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIFNTQ1JfTVZNRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwTAorI2RlZmluZSBTU0NSX01WQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMEwKKyNkZWZpbmUgU1NDUl9NVkxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDBMCisjZGVmaW5lIFNTQ1JfTVZDUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIENsb2NrIENvbnRyb2wgUmVnaXN0ZXIgMS4gCisvLyAoQ0xLQ1IxKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDTEtDUjFfRExMU1NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwQ0wKKyNkZWZpbmUgQ0xLQ1IxX0RMTFNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgIDJMCisjZGVmaW5lIENMS0NSMV9ETExQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBDTEtDUjFfU1dDRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgQ0xLQ1IxX0RMTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDBMCisjZGVmaW5lIENMS0NSMV9DS1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwTAorI2RlZmluZSBDTEtDUjFfQ0tSTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMEwKKyNkZWZpbmUgQ0xLQ1IxX0RMTFJEWSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDBMCisjZGVmaW5lIENMS0NSMV9DTEtPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFNvdW5kIEJsYXN0ZXIgUmVhZCBCdWZmZXIKKy8vIFN0YXR1cy4oU0JSQlMpCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFNCUkJTX1JEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGTAorI2RlZmluZSBTQlJCU19SRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgU0JSQlNfUkJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgbWFzdGVyIGNvbnRyb2wKKy8vIHJlZ2lzdGVyLihTRVJNQykKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgU0VSTUNfTVNQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIFNFUk1DX1BUQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFTAorI2RlZmluZSBTRVJNQ19QVENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMUwKKyNkZWZpbmUgU0VSTUNfUFRDX0FDOTcgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFNFUk1DX1BMQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBTRVJNQ19QWExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgU0VSTUNfTE9GViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwODAwMDBMCisjZGVmaW5lIFNFUk1DX1NMQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwTAorI2RlZmluZSBTRVJNQ19TWExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMEwKKyNkZWZpbmUgU0VSTUNfT0RTRU4xICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDBMCisjZGVmaW5lIFNFUk1DX09EU0VOMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEdlbmVyYWwgUHVycG9zZSBJL08gUmVnaXN0ZXIuIAorLy8gKEdQSU9SKQorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBHUElPUl9WRE5TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgR1BJT1JfVlVQUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIEdQSU9SX0dQMVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBHUElPUl9HUDNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgR1BJT1JfR1BTUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIEdQSU9SX0dQUFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBHUElPUl9HUDFEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMEwKKyNkZWZpbmUgR1BJT1JfR1AzRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDBMCisjZGVmaW5lIEdQSU9SX1ZETkxUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwTAorI2RlZmluZSBHUElPUl9WRE5QTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMEwKKyNkZWZpbmUgR1BJT1JfVkROU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwNDAwMDBMCisjZGVmaW5lIEdQSU9SX1ZETlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwTAorI2RlZmluZSBHUElPUl9WVVBMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEwMDAwMEwKKyNkZWZpbmUgR1BJT1JfVlVQUE8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDBMCisjZGVmaW5lIEdQSU9SX1ZVUFNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwTAorI2RlZmluZSBHUElPUl9WVVBXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMEwKKyNkZWZpbmUgR1BJT1JfR1AxT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDBMCisjZGVmaW5lIEdQSU9SX0dQMVBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTAorI2RlZmluZSBHUElPUl9HUDFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMEwKKyNkZWZpbmUgR1BJT1JfR1AxVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDBMCisjZGVmaW5lIEdQSU9SX0dQM09FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwTAorI2RlZmluZSBHUElPUl9HUDNQVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMEwKKyNkZWZpbmUgR1BJT1JfR1AzU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDBMCisjZGVmaW5lIEdQSU9SX0dQM1cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgMS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMENMCisjZGVmaW5lIENMS0NSMV9QTExTU19TRVJJQUwgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBDTEtDUjFfUExMU1NfQ1JZU1RBTCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1BDSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIENMS0NSMV9QTExTU19SRVNFUlZFRCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBDTAorI2RlZmluZSBDTEtDUjFfUExMUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgQ0xLQ1IxX1NXQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBMCisjZGVmaW5lIENMS0NSMV9QTExPUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZlYXR1cmUgcmVwb3J0aW5nIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBGUlJfRkFCX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgRlJSX01BU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUNMCisjZGVmaW5lIEZSUl9JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAzMDAwTAorI2RlZmluZSBGUlJfRkFCX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgRlJSX01BU0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDJMCisjZGVmaW5lIEZSUl9JRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCAxIGNvbmZpZ3VyYXRpb24KKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBTRVJDMV9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgU0VSQzFfU08xRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIFNFUkMxX1NPMUZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFTAorI2RlZmluZSBTRVJDMV9TTzFGX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwKKyNkZWZpbmUgU0VSQzFfU08xRl9BQzk3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFNFUkMxX1NPMUZfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBTRVJDMV9TTzFGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCAyIGNvbmZpZ3VyYXRpb24KKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBTRVJDMl9WQUxVRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgU0VSQzJfU0kxRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIFNFUkMyX1NJMUZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBFTAorI2RlZmluZSBTRVJDMl9TSTFGX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwKKyNkZWZpbmUgU0VSQzJfU0kxRl9BQzk3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIFNFUkMyX1NJMUZfQURDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBTRVJDMl9TSTFGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDQ1RMX0VTWU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTAorI2RlZmluZSBBQ0NUTF9WRlJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgQUNDVExfRENWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIEFDQ1RMX0NSVyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBBQ0NUTF9UQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQUNTVFNfQ1JEWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIEFDU1RTX1ZTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgb3V0cHV0IHNsb3QgdmFsaWQKKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBBQ09TVl9TTFYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgQUNPU1ZfU0xWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIEFDT1NWX1NMVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBBQ09TVl9TTFY2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgQUNPU1ZfU0xWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIEFDT1NWX1NMVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBBQ09TVl9TTFY5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgQUNPU1ZfU0xWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMCisjZGVmaW5lIEFDT1NWX1NMVjExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwTAorI2RlZmluZSBBQ09TVl9TTFYxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbW1hbmQgYWRkcmVzcworLy8gcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDQ0FEX0NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGTAorI2RlZmluZSBBQ0NBRF9DSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbW1hbmQgZGF0YSByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQUNDREFfQ0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIEFDQ0RBX0NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgaW5wdXQgc2xvdCB2YWxpZAorLy8gcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDSVNWX0lTVjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBBQ0lTVl9JU1Y0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgQUNJU1ZfSVNWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIEFDSVNWX0lTVjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TAorI2RlZmluZSBBQ0lTVl9JU1Y3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgQUNJU1ZfSVNWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBMCisjZGVmaW5lIEFDSVNWX0lTVjkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwTAorI2RlZmluZSBBQ0lTVl9JU1YxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgQUNJU1ZfSVNWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIEFDSVNWX0lTVjEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIGFkZHJlc3MKKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBBQ1NBRF9TSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA3RkwKKyNkZWZpbmUgQUNTQURfU0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgZGF0YSByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQUNTREFfU0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIEFDU0RBX1NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIGFkZHJlc3MgYW5kIGNvbnRyb2wKKy8vIHJlZ2lzdGVycyAoYWxsIDEyKS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgSU9UQUNfU0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIElPVEFDX01TS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwTAorI2RlZmluZSBJT1RBQ19JT0RDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMEwKKyNkZWZpbmUgSU9UQUNfSU9EQ18xNl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIElPVEFDX0lPRENfMTBfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTAorI2RlZmluZSBJT1RBQ19JT0RDXzEyX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMEwKKyNkZWZpbmUgSU9UQUNfV1NQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDBMCisjZGVmaW5lIElPVEFDX1JTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwTAorI2RlZmluZSBJT1RBQ19XU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMEwKKyNkZWZpbmUgSU9UQUNfV0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDBMCisjZGVmaW5lIElPVEFDX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwTAorI2RlZmluZSBJT1RBQ19TQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgSU9UQUNfTVNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDL1BDSSBtYXN0ZXIgZW5hYmxlCisvLyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUENQQ0lFTl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgcG9sbC90cmlnZ2VyCisvLyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgSlNQVF9DQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIEpTUFRfQ0FZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTAorI2RlZmluZSBKU1BUX0NCWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgSlNQVF9DQlkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIEpTUFRfQkExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBKU1BUX0JBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgSlNQVF9CQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDBMCisjZGVmaW5lIEpTUFRfQkIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGpveXN0aWNrIGNvbnRyb2wgcmVnaXN0ZXIuCisvLyBUaGUgVEJGIGJpdCBoYXMgYmVlbiBtb3ZlZCBmcm9tIE1JRFNSIHJlZ2lzdGVyIHRvIEpTQ1RMIHJlZ2lzdGVyIGJpdCA4LgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBKU0NUTF9TUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwM0wKKyNkZWZpbmUgSlNDVExfU1BfU0xPVyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIEpTQ1RMX1NQX01FRElVTV9TTE9XICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBKU0NUTF9TUF9NRURJVU1fRkFTVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgSlNDVExfU1BfRkFTVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDNMCisjZGVmaW5lIEpTQ1RMX0FSRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBKU0NUTF9UQkYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMEwKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgY29udHJvbCByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTUlEQ1JfVFhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisjZGVmaW5lIE1JRENSX1JYRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTAorI2RlZmluZSBNSURDUl9SSUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgTUlEQ1JfVElFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDhMCisjZGVmaW5lIE1JRENSX01MQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTAorI2RlZmluZSBNSURDUl9NUlNUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIHN0YXR1cyByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTUlEU1JfUkJFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMCisjZGVmaW5lIE1JRFNSX1JEQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgd3JpdGUgcG9ydCByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgTUlEV1BfTVdEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkZMCisjZGVmaW5lIE1JRFdQX01XRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIE1JREkgcmVhZCBwb3J0IHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBNSURSUF9NUkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRkwKKyNkZWZpbmUgTUlEUlBfTVJEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgY29uZmlndXJhdGlvbiBpbnRlcmZhY2UKKy8vIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBDRkdJX0NMSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgQ0ZHSV9ET1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIENGR0lfRElOX0VFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBDRkdJX0VFTEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzdWJzeXN0ZW0gSUQgYW5kIHZlbmRvciBJRAorLy8gcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFNTVklEX1ZJRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGTAorI2RlZmluZSBTU1ZJRF9TSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMEwKKyNkZWZpbmUgU1NWSURfVklEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisjZGVmaW5lIFNTVklEX1NJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBHUElPIHBpbiBpbnRlcmZhY2UgcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEdQSU9SX1ZPTEROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBHUElPUl9WT0xVUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgR1BJT1JfU0kyRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIEdQSU9SX1NJMk9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyIDIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDU1RTMl9DUkRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBBQ1NUUzJfVlNUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGlucHV0IHNsb3QgdmFsaWQKKy8vIHJlZ2lzdGVyIDIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDSVNWMl9JU1YzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBBQ0lTVjJfSVNWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgQUNJU1YyX0lTVjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRMCisjZGVmaW5lIEFDSVNWMl9JU1Y2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TAorI2RlZmluZSBBQ0lTVjJfSVNWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgQUNJU1YyX0lTVjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjBMCisjZGVmaW5lIEFDSVNWMl9JU1Y5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwTAorI2RlZmluZSBBQ0lTVjJfSVNWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgQUNJU1YyX0lTVjExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDBMCisjZGVmaW5lIEFDSVNWMl9JU1YxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwTAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIGFkZHJlc3MKKy8vIHJlZ2lzdGVyIDIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDU0FEMl9TSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGTAorI2RlZmluZSBBQ1NBRDJfU0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBkYXRhIHJlZ2lzdGVyIDIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIEFDU0RBMl9TRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGTAorI2RlZmluZSBBQ1NEQTJfU0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBjb250cm9sIHJlZ2lzdGVyLgorLy8KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorI2RlZmluZSBJT1RDUl9JVEQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMUwKKyNkZWZpbmUgSU9UQ1JfSFJWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMCisjZGVmaW5lIElPVENSX1NSViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0TAorI2RlZmluZSBJT1RDUl9EVEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOEwKKyNkZWZpbmUgSU9UQ1JfREZJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIElPVENSX0REUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBJT1RDUl9KVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgSU9UQ1JfUFBFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgYWRkcmVzcyBhbmQgY29udHJvbAorLy8gcmVnaXN0ZXJzIGZvciBIYXJkd2FyZSBNYXN0ZXIgVm9sdW1lLiAgCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIElPVEdQX1NBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGTAorI2RlZmluZSBJT1RHUF9NU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMEwKKyNkZWZpbmUgSU9UR1BfSU9EQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDBMCisjZGVmaW5lIElPVEdQX0lPRENfMTZfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBJT1RHUF9JT0RDXzEwX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMEwKKyNkZWZpbmUgSU9UR1BfSU9EQ18xMl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDBMCisjZGVmaW5lIElPVEdQX1dTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwTAorI2RlZmluZSBJT1RHUF9SU1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgSU9UR1BfV1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDBMCisjZGVmaW5lIElPVEdQX1dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwTAorI2RlZmluZSBJT1RHUF9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMEwKKyNkZWZpbmUgSU9UR1BfU0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisjZGVmaW5lIElPVEdQX01TS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBhZGRyZXNzIGFuZCBjb250cm9sCisvLyByZWdpc3RlcnMgZm9yIFNvdW5kIEJsYXN0ZXIKKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgSU9UU0JfU0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkZMCisjZGVmaW5lIElPVFNCX01TS19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwTAorI2RlZmluZSBJT1RTQl9JT0RDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMEwKKyNkZWZpbmUgSU9UU0JfSU9EQ18xNl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIElPVFNCX0lPRENfMTBfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwTAorI2RlZmluZSBJT1RTQl9JT0RDXzEyX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMEwKKyNkZWZpbmUgSU9UU0JfV1NQSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDBMCisjZGVmaW5lIElPVFNCX1JTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwTAorI2RlZmluZSBJT1RTQl9XU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMEwKKyNkZWZpbmUgSU9UU0JfV0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDBMCisjZGVmaW5lIElPVFNCX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwTAorI2RlZmluZSBJT1RTQl9TQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMEwKKyNkZWZpbmUgSU9UU0JfTVNLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2TAorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIGFkZHJlc3MgYW5kIGNvbnRyb2wKKy8vIHJlZ2lzdGVycyBmb3IgRk0uCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIElPVEZNX1NBX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGTAorI2RlZmluZSBJT1RGTV9NU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMEwKKyNkZWZpbmUgSU9URk1fSU9EQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDBMCisjZGVmaW5lIElPVEZNX0lPRENfMTZfQklUICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwTAorI2RlZmluZSBJT1RGTV9JT0RDXzEwX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMEwKKyNkZWZpbmUgSU9URk1fSU9EQ18xMl9CSVQgICAgICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDBMCisjZGVmaW5lIElPVEZNX1dTUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwTAorI2RlZmluZSBJT1RGTV9SU1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMEwKKyNkZWZpbmUgSU9URk1fV1NFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDBMCisjZGVmaW5lIElPVEZNX1dFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwTAorI2RlZmluZSBJT1RGTV9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMEwKKyNkZWZpbmUgSU9URk1fU0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDBMCisjZGVmaW5lIElPVEZNX01TS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAxNkwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQQy9QQ0kgcmVxdWVzdCByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgUENQUlJfUkRDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwN0wKKyNkZWZpbmUgUENQUlJfUkVRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMEwKKyNkZWZpbmUgUENQUlJfUkRDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMEwKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworLy8gVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBQQy9QQ0kgZ3JhbnQgcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFBDUEdSX0dEQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDdMCisjZGVmaW5lIFBDUEdSX1ZMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDBMCisjZGVmaW5lIFBDUEdSX0dEQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUEMvUENJIENvbnRyb2wgUmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIFBDUENSX0VOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGVidWcgaW5kZXggcmVnaXN0ZXIuCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisjZGVmaW5lIERSRUdfUkVHSURfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGTAorI2RlZmluZSBEUkVHX0RFQlVHICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgRFJFR19SR0JLX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MDBMCisjZGVmaW5lIERSRUdfVFJBUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwTAorI2lmICFkZWZpbmVkKE5PX0NTNDYxMikKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTUpCisjZGVmaW5lIERSRUdfVFJBUFggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwTAorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgRFJFR19SRUdJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDBMCisjZGVmaW5lIERSRUdfUkdCS19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICA4TAorI2RlZmluZSBEUkVHX1JHQktfUkVHSURfTUFTSyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDc3RkwKKyNkZWZpbmUgRFJFR19SRUdJRF9SMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMCisjZGVmaW5lIERSRUdfUkVHSURfUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDExTAorI2RlZmluZSBEUkVHX1JFR0lEX1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMkwKKyNkZWZpbmUgRFJFR19SRUdJRF9SMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTNMCisjZGVmaW5lIERSRUdfUkVHSURfUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE0TAorI2RlZmluZSBEUkVHX1JFR0lEX1I1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxNUwKKyNkZWZpbmUgRFJFR19SRUdJRF9SNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTZMCisjZGVmaW5lIERSRUdfUkVHSURfUjcgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDE3TAorI2RlZmluZSBEUkVHX1JFR0lEX1I4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxOEwKKyNkZWZpbmUgRFJFR19SRUdJRF9SOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTlMCisjZGVmaW5lIERSRUdfUkVHSURfUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFBTAorI2RlZmluZSBEUkVHX1JFR0lEX1JCICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxQkwKKyNkZWZpbmUgRFJFR19SRUdJRF9SQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUNMCisjZGVmaW5lIERSRUdfUkVHSURfUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFETAorI2RlZmluZSBEUkVHX1JFR0lEX1JFICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxRUwKKyNkZWZpbmUgRFJFR19SRUdJRF9SRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUZMCisjZGVmaW5lIERSRUdfUkVHSURfUkFfQlVTX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwTAorI2RlZmluZSBEUkVHX1JFR0lEX1JBX0JVU19ISUdIICAgICAgICAgICAgICAgICAgMHgwMDAwMDAzOEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ZQlVTX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTBMCisjZGVmaW5lIERSRUdfUkVHSURfWUJVU19ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDU4TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDFMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAyTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwM0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDRMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF81ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTA1TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfNiAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwNkwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzcgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDdMCisjZGVmaW5lIERSRUdfUkVHSURfSU5ESVJFQ1RfQUREUkVTUyAgICAgICAgICAgICAweDAwMDAwMTBFTAorI2RlZmluZSBEUkVHX1JFR0lEX1RPUF9PRl9TVEFDSyAgICAgICAgICAgICAgICAgMHgwMDAwMDEwRkwKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCisjaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfOCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzkgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTFMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTEyTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExM0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzEyICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTRMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xMyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE1TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNkwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzE1ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMTdMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xNiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTE4TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOUwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzE4ICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMUFMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8xOSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFCTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQ0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzIxICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMURMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF8yMiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTFFTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRkwKKyNlbmRpZgorI2VuZGlmCisjZGVmaW5lIERSRUdfUkVHSURfUlNBMF9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTQTBfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMUwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0ExX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDJMCisjZGVmaW5lIERSRUdfUkVHSURfUlNBMV9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAzTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTQTIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNEwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0EzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDVMCisjZGVmaW5lIERSRUdfUkVHSURfUlNJMF9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA2TAorI2RlZmluZSBEUkVHX1JFR0lEX1JTSTBfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwN0wKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0kxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDhMCisjZGVmaW5lIERSRUdfUkVHSURfUlNJMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjA5TAorI2RlZmluZSBEUkVHX1JFR0lEX1NBR1VTVEFUVVMgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwQUwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzAxX0xPVyAgICAgICAgICAgICAgIDB4MDAwMDAyMEJMCisjZGVmaW5lIERSRUdfUkVHSURfUlNDT05GSUcwMV9ISUdIICAgICAgICAgICAgICAweDAwMDAwMjBDTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTQ09ORklHMjNfTE9XICAgICAgICAgICAgICAgMHgwMDAwMDIwREwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzIzX0hJR0ggICAgICAgICAgICAgIDB4MDAwMDAyMEVMCisjZGVmaW5lIERSRUdfUkVHSURfUlNETUEwMUUgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjBGTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTRE1BMjNFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTFMCisjZGVmaW5lIERSRUdfUkVHSURfUlNEMF9ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjEyTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTRDFfTE9XICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxM0wKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QxX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTRMCisjZGVmaW5lIERSRUdfUkVHSURfUlNEMl9MT1cgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE1TAorI2RlZmluZSBEUkVHX1JFR0lEX1JTRDJfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxNkwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QzX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTdMCisjZGVmaW5lIERSRUdfUkVHSURfUlNEM19ISUdIICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjE4TAorI2RlZmluZSBEUkVHX1JFR0lEX1NSQVJfSElHSCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIxQUwKKyNkZWZpbmUgRFJFR19SRUdJRF9TUkFSX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUJMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjFDTAorI2RlZmluZSBEUkVHX1JFR0lEX0NVUlJFTlRfRE1BX1NUUkVBTSAgICAgICAgICAgMHgwMDAwMDIxREwKKyNkZWZpbmUgRFJFR19SRUdJRF9ORVhUX0RNQV9TVFJFQU0gICAgICAgICAgICAgIDB4MDAwMDAyMUVMCisjZGVmaW5lIERSRUdfUkVHSURfQ1BVX1NUQVRVUyAgICAgICAgICAgICAgICAgICAweDAwMDAwMzAwTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQ19NT0RFICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMUwKKyNkZWZpbmUgRFJFR19SRUdJRF9TVEFDS19BTkRfUkVQRUFUICAgICAgICAgICAgIDB4MDAwMDAzMDJMCisjZGVmaW5lIERSRUdfUkVHSURfSU5ERVgwICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMzA0TAorI2RlZmluZSBEUkVHX1JFR0lEX0lOREVYMSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNUwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMF8zICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzRfNyAgICAgICAgICAgICAgICAweDAwMDAwNDA0TAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84XzExICAgICAgICAgICAgICAgMHgwMDAwMDQwOEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMTJfMTUgICAgICAgICAgICAgIDB4MDAwMDA0MENMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzE2XzE5ICAgICAgICAgICAgICAweDAwMDAwNDEwTAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8yMF8yMyAgICAgICAgICAgICAgMHgwMDAwMDQxNEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjRfMjcgICAgICAgICAgICAgIDB4MDAwMDA0MThMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzI4XzMxICAgICAgICAgICAgICAweDAwMDAwNDFDTAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV8zMl8zNSAgICAgICAgICAgICAgMHgwMDAwMDQyMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMzZfMzkgICAgICAgICAgICAgIDB4MDAwMDA0MjRMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzQwXzQzICAgICAgICAgICAgICAweDAwMDAwNDI4TAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV80NF80NyAgICAgICAgICAgICAgMHgwMDAwMDQyQ0wKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDhfNTEgICAgICAgICAgICAgIDB4MDAwMDA0MzBMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzUyXzU1ICAgICAgICAgICAgICAweDAwMDAwNDM0TAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV81Nl81OSAgICAgICAgICAgICAgMHgwMDAwMDQzOEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjBfNjMgICAgICAgICAgICAgIDB4MDAwMDA0M0NMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzY0XzY3ICAgICAgICAgICAgICAweDAwMDAwNDQwTAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV82OF83MSAgICAgICAgICAgICAgMHgwMDAwMDQ0NEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNzJfNzUgICAgICAgICAgICAgIDB4MDAwMDA0NDhMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzc2Xzc5ICAgICAgICAgICAgICAweDAwMDAwNDRDTAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV84MF84MyAgICAgICAgICAgICAgMHgwMDAwMDQ1MEwKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODRfODcgICAgICAgICAgICAgIDB4MDAwMDA0NTRMCisjZGVmaW5lIERSRUdfUkVHSURfRE1BX1NUQVRFXzg4XzkxICAgICAgICAgICAgICAweDAwMDAwNDU4TAorI2RlZmluZSBEUkVHX1JFR0lEX0RNQV9TVEFURV85Ml85NSAgICAgICAgICAgICAgMHgwMDAwMDQ1Q0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1NFTEVDVCAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDBMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8wICAgICAgICAgICAgICAgICAweDAwMDAwNTAwTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMSAgICAgICAgICAgICAgICAgMHgwMDAwMDUwMUwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDJMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8zICAgICAgICAgICAgICAgICAweDAwMDAwNTAzTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNCAgICAgICAgICAgICAgICAgMHgwMDAwMDUwNEwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzUgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDVMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV82ICAgICAgICAgICAgICAgICAweDAwMDAwNTA2TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfNyAgICAgICAgICAgICAgICAgMHgwMDAwMDUwN0wKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCisjaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfOCAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzkgICAgICAgICAgICAgICAgIDB4MDAwMDA1MTFMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMCAgICAgICAgICAgICAgICAweDAwMDAwNTEyTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTEgICAgICAgICAgICAgICAgMHgwMDAwMDUxM0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzEyICAgICAgICAgICAgICAgIDB4MDAwMDA1MTRMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xMyAgICAgICAgICAgICAgICAweDAwMDAwNTE1TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTQgICAgICAgICAgICAgICAgMHgwMDAwMDUxNkwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzE1ICAgICAgICAgICAgICAgIDB4MDAwMDA1MTdMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xNiAgICAgICAgICAgICAgICAweDAwMDAwNTE4TAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTcgICAgICAgICAgICAgICAgMHgwMDAwMDUxOUwKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzE4ICAgICAgICAgICAgICAgIDB4MDAwMDA1MUFMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8xOSAgICAgICAgICAgICAgICAweDAwMDAwNTFCTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjAgICAgICAgICAgICAgICAgMHgwMDAwMDUxQ0wKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIxICAgICAgICAgICAgICAgIDB4MDAwMDA1MURMCisjZGVmaW5lIERSRUdfUkVHSURfVFJBUF9XUklURV8yMiAgICAgICAgICAgICAgICAweDAwMDAwNTFFTAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjMgICAgICAgICAgICAgICAgMHgwMDAwMDUxRkwKKyNlbmRpZgorI2VuZGlmCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MwX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjAwTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMV9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwMUwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDJMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MzX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjAzTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMF9MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwNEwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDVMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MyX0xPVyAgICAgICAgICAgICAgICAweDAwMDAwNjA2TAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDM19MT1cgICAgICAgICAgICAgICAgMHgwMDAwMDYwN0wKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MDhMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MxX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjA5TAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMl9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwQUwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEJMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MwX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjBDTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMV9NSUQgICAgICAgICAgICAgICAgMHgwMDAwMDYwREwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEVMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MzX01JRCAgICAgICAgICAgICAgICAweDAwMDAwNjBGTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDMF9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxMEwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTFMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMF9BQ0MyX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjEyTAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzBfQUNDM19ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxM0wKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTRMCisjZGVmaW5lIERSRUdfUkVHSURfTUFDMV9BQ0MxX0hJR0ggICAgICAgICAgICAgICAweDAwMDAwNjE1TAorI2RlZmluZSBEUkVHX1JFR0lEX01BQzFfQUNDMl9ISUdIICAgICAgICAgICAgICAgMHgwMDAwMDYxNkwKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTdMCisjZGVmaW5lIERSRUdfUkVHSURfUlNIT1VUX0xPVyAgICAgICAgICAgICAgICAgICAweDAwMDAwNjIwTAorI2RlZmluZSBEUkVHX1JFR0lEX1JTSE9VVF9NSUQgICAgICAgICAgICAgICAgICAgMHgwMDAwMDYyOEwKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MzBMCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBTL1BESUYgQ29udHJvbCByZWdpc3Rlci4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9TUERJRl9FTiAgICAgICAgICAgICAgICAgMHgwMDAwODAwMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9WQUwgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DT1BZICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9DQzYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMEwKKyNkZWZpbmUgU1BESUZfQ09OVFJPTF9MICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDgwMEwKKworI2VuZGlmIC8vIF9IX0hXREVGUwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDI4MS9jczQyODFfd3JhcHBlci0yNC5jIGIvc291bmQvb3NzL2NzNDI4MS9jczQyODFfd3JhcHBlci0yNC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NTlmMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MV93cmFwcGVyLTI0LmMKQEAgLTAsMCArMSw0MSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAiY3M0MjgxX3dyYXBwZXIuYyIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDI4MSBsaW51eCBhdWRpbyBkcml2ZXIuCisqCisqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCisqICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCisqICAgICAgICAgICAgICAgKGF1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbSkuCisqCisqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorKgorKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyoKKyogMTIvMjAvMDAgdHJ3IC0gbmV3IGZpbGUuIAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKK3N0YXRpYyBpbnQgY3M0MjgxX3Jlc3VtZV9udWxsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbnQgY3M0MjgxX3N1c3BlbmRfbnVsbChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpIHsgcmV0dXJuIDA7IH0KKworI2RlZmluZSBmcmVlX2RtYWJ1ZihzdGF0ZSwgZG1hYnVmKSBcCisJcGNpX2ZyZWVfY29uc2lzdGVudChzdGF0ZS0+cGNpZGV2LCBcCisJCQkgICAgUEFHRV9TSVpFIDw8IChkbWFidWYpLT5idWZvcmRlciwgXAorCQkJICAgIChkbWFidWYpLT5yYXdidWYsIChkbWFidWYpLT5kbWFhZGRyKTsKKyNkZWZpbmUgZnJlZV9kbWFidWYyKHN0YXRlLCBkbWFidWYpIFwKKwlwY2lfZnJlZV9jb25zaXN0ZW50KChzdGF0ZSktPnBjaWRldiwgXAorCQkJCSAgICBQQUdFX1NJWkUgPDwgKHN0YXRlKS0+YnVmb3JkZXJfdG1wYnVmZiwgXAorCQkJCSAgICAoc3RhdGUpLT50bXBidWZmLCAoc3RhdGUpLT5kbWFhZGRyX3RtcGJ1ZmYpOworI2RlZmluZSBjczR4X3Bnb2ZmKHZtYSkgKCh2bWEpLT52bV9wZ29mZikKKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDI4MS9jczQyODFtLmMgYi9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGQzOTYzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDI4MS9jczQyODFtLmMKQEAgLTAsMCArMSw0NTA1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICJjczQyODEuYyIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDI4MSBsaW51eCBhdWRpbyBkcml2ZXIuCisqCisqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCisqICAgICAgICAgICAgLS0gYWRhcHRlZCBmcm9tIGRyaXZlcnMgYnkgVGhvbWFzIFNhaWxlciwgCisqICAgICAgICAgICAgLS0gYnV0IGRvbid0IGJ1ZyBoaW07IFByb2JsZW1zIHNob3VsZCBnbyB0bzoKKyogICAgICAgICAgICAtLSB0b20gd29sbGVyICh0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbSkgb3IKKyogICAgICAgICAgICAgICAoYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiBNb2R1bGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnM6CisqICAgbm9uZQorKgorKiAgU3VwcG9ydGVkIGRldmljZXM6CisqICAvZGV2L2RzcCAgICBzdGFuZGFyZCAvZGV2L2RzcCBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCisqICAvZGV2L21peGVyICBzdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyogIC9kZXYvbWlkaSAgIHNpbXBsZSBNSURJIFVBUlQgaW50ZXJmYWNlLCBubyBpb2N0bAorKgorKiBNb2RpZmljYXRpb24gSGlzdG9yeQorKiAwOC8yMC8wMCB0cncgLSBzaWxlbmNlIGFuZCBubyBzdG9wcGluZyBEQUMgdW50aWwgcmVsZWFzZQorKiAwOC8yMy8wMCB0cncgLSBhZGRlZCBDU19EQkcgc3RhdGVtZW50cywgZml4IGludGVycnVwdCBoYW5nIGlzc3VlIG9uIERBQyBzdG9wLgorKiAwOS8xOC8wMCB0cncgLSBhZGRlZCAxNmJpdCBvbmx5IHJlY29yZCB3aXRoIGNvbnZlcnNpb24gCisqIDA5LzI0LzAwIHRydyAtIGFkZGVkIEVuaGFuY2VkIEZ1bGwgZHVwbGV4IChzZXBhcmF0ZSBzaW11bHRhbmVvdXMgCisqICAgICAgICAgICAgICAgIGNhcHR1cmUvcGxheWJhY2sgcmF0ZXMpCisqIDEwLzAzLzAwIHRydyAtIGZpeGVkIG1tYXAgKGZpeGVkIEdSRUNPUkQgYW5kIHRoZSBYTU1TIG1tYXAgdGVzdCBwbHVnaW4gIAorKiAgICAgICAgICAgICAgICBsaWJPU1NtLnNvKQorKiAxMC8xMS8wMCB0cncgLSBtb2RpZmllZCBmb3IgMi40LjAtdGVzdDkga2VybmVsIGVuaGFuY2VtZW50cyAoTlJfTUFQIHJlbW92YWwpCisqIDExLzAzLzAwIHRydyAtIGZpeGVkIGludGVycnVwdCBsb3NzL3N0dXR0ZXIsIGFkZGVkIGRlYnVnLgorKiAxMS8xMC8wMCBia3ogLSBhZGRlZCBfX2RldmluaXQgdG8gY3M0MjgxX2h3X2luaXQoKQorKiAxMS8xMC8wMCB0cncgLSBmaXhlZCBTTVAgYW5kIGNhcHR1cmUgc3BpbmxvY2sgaGFuZy4KKyogMTIvMDQvMDAgdHJ3IC0gY2xlYW5lZCB1cCBDU0RFQlVHIGZsYWdzIGFuZCBhZGRlZCAiZGVmYXVsdG9yZGVyIiBtb2R1bGVwYXJtLgorKiAxMi8wNS8wMCB0cncgLSBmaXhlZCBwb2xsaW5nIChteXRoMiksIGFuZCBhZGRlZCB1bmRlcnJ1biBzd3B0ciBmaXguCisqIDEyLzA4LzAwIHRydyAtIGFkZGVkIFBNIHN1cHBvcnQuIAorKiAxMi8xNC8wMCB0cncgLSBhZGRlZCB3cmFwcGVyIGNvZGUsIGJ1aWxkcyB1bmRlciAyLjQuMCwgMi4yLjE3LTIwLCAyLjIuMTctOCAKKyoJCSAoUkgvRGVsbCBiYXNlKSwgMi4yLjE4LCAyLjIuMTIuICBjbGVhbmVkIHVwIGNvZGUgbW9kcyBieSBpZGVudC4KKyogMTIvMTkvMDAgdHJ3IC0gYWRkZWQgUE0gc3VwcG9ydCBmb3IgMi4yIGJhc2UgKGFwbV9jYWxsYmFjaykuIG90aGVyIFBNIGNsZWFudXAuCisqIDEyLzIxLzAwIHRydyAtIGFkZGVkIGZyYWN0aW9uYWwgImRlZmF1bHRvcmRlciIgaW5wdXRzLiBpZiA+MTAwIHRoZW4gdXNlIAorKgkJIGRlZmF1bHRvcmRlci0xMDAgYXMgcG93ZXIgb2YgMiBmb3IgdGhlIGJ1ZmZlciBzaXplLiBleGFtcGxlOgorKgkJIDEwNiA9IDJeKDEwNi0xMDApID0gMl42ID0gNjQgYnl0ZXMgZm9yIHRoZSBidWZmZXIgc2l6ZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZGlzYWJsZSBidWlsZGluZyBQTSBzdXBwb3J0IGludG8gdGhlIGRyaXZlciAqLworLy8jZGVmaW5lIE5PVF9DUzQyODFfUE0gMSAKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworLy8jaW5jbHVkZSAiY3NfZG0uaCIKKyNpbmNsdWRlICJjczQyODFfaHdkZWZzLmgiCisjaW5jbHVkZSAiY3M0MjgxcG0uaCIKKworc3RydWN0IGNzNDI4MV9zdGF0ZTsKKworc3RhdGljIHZvaWQgc3RvcF9kYWMoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKTsKK3N0YXRpYyB2b2lkIHN0YXJ0X2RhYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKTsKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKTsKKyN1bmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQ0lSUlVTCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfQ0lSUlVTICAgICAgICAgIDB4MTAxMworI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ1JZU1RBTF9DUzQyODEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DUllTVEFMX0NTNDI4MSAgMHg2MDA1CisjZW5kaWYKKworI2RlZmluZSBDUzQyODFfTUFHSUMgICgoUENJX0RFVklDRV9JRF9DUllTVEFMX0NTNDI4MTw8MTYpIHwgUENJX1ZFTkRPUl9JRF9DSVJSVVMpCisjZGVmaW5lCUNTNDI4MV9DRkxSX0RFRkFVTFQJMHgwMDAwMDAwMSAgLyogQ0ZMUiBtdXN0IGJlIGluIEFDOTcgbGluayBtb2RlICovCisKKy8vIGJ1ZmZlciBvcmRlciBkZXRlcm1pbmVzIHRoZSBzaXplIG9mIHRoZSBkbWEgYnVmZmVyIGZvciB0aGUgZHJpdmVyLgorLy8gdW5kZXIgTGludXgsIGEgc21hbGxlciBidWZmZXIgYWxsb3dzIG1vcmUgcmVzcG9uc2l2ZW5lc3MgZnJvbSBtYW55IG9mIHRoZSAKKy8vIGFwcGxpY2F0aW9ucyAoZS5nLiBnYW1lcykuICBBIGxhcmdlciBidWZmZXIgYWxsb3dzIHNvbWUgb2YgdGhlIGFwcHMgKGVzb3VuZCkgCisvLyB0byBub3QgdW5kZXJydW4gdGhlIGRtYSBidWZmZXIgYXMgZWFzaWx5LiAgQXMgZGVmYXVsdCwgdXNlIDMyayAob3JkZXI9MykKKy8vIHJhdGhlciB0aGFuIDY0ayBhcyBzb21lIG9mIHRoZSBnYW1lcyB3b3JrIG1vcmUgcmVzcG9uc2l2ZWx5LgorLy8gbG9nIGJhc2UgMiggYnVmZiBzeiA9IDMyaykuCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0b3JkZXIgPSAzOworbW9kdWxlX3BhcmFtKGRlZmF1bHRvcmRlciwgdWxvbmcsIDApOworCisvLworLy8gVHVybiBvbi9vZmYgZGVidWdnaW5nIGNvbXBpbGF0aW9uIGJ5IGNvbW1lbnRpbmcgb3V0ICIjZGVmaW5lIENTREVCVUciCisvLworI2RlZmluZSBDU0RFQlVHIDEKKyNpZiBDU0RFQlVHCisjZGVmaW5lIENTREVCVUdfSU5URVJGQUNFIDEKKyNlbHNlCisjdW5kZWYgQ1NERUJVR19JTlRFUkZBQ0UKKyNlbmRpZgorLy8KKy8vIGNzX2RlYnVnbWFzayBhcmVhcworLy8KKyNkZWZpbmUgQ1NfSU5JVAkgCTB4MDAwMDAwMDEJLy8gaW5pdGlhbGl6YXRpb24gYW5kIHByb2JlIGZ1bmN0aW9ucworI2RlZmluZSBDU19FUlJPUiAJMHgwMDAwMDAwMgkvLyB0bXAgZGVidWdnaW5nIGJpdCBwbGFjZWhvbGRlcgorI2RlZmluZSBDU19JTlRFUlJVUFQJMHgwMDAwMDAwNAkvLyBpbnRlcnJ1cHQgaGFuZGxlciAoc2VwYXJhdGUgZnJvbSBhbGwgb3RoZXIpCisjZGVmaW5lIENTX0ZVTkNUSU9OIAkweDAwMDAwMDA4CS8vIGVudGVyL2xlYXZlIGZ1bmN0aW9ucworI2RlZmluZSBDU19XQVZFX1dSSVRFIAkweDAwMDAwMDEwCS8vIHdyaXRlIGluZm9ybWF0aW9uIGZvciB3YXZlCisjZGVmaW5lIENTX1dBVkVfUkVBRCAJMHgwMDAwMDAyMAkvLyByZWFkIGluZm9ybWF0aW9uIGZvciB3YXZlCisjZGVmaW5lIENTX01JRElfV1JJVEUgCTB4MDAwMDAwNDAJLy8gd3JpdGUgaW5mb3JtYXRpb24gZm9yIG1pZGkKKyNkZWZpbmUgQ1NfTUlESV9SRUFEIAkweDAwMDAwMDgwCS8vIHJlYWQgaW5mb3JtYXRpb24gZm9yIG1pZGkKKyNkZWZpbmUgQ1NfTVBVNDAxX1dSSVRFIDB4MDAwMDAxMDAJLy8gd3JpdGUgaW5mb3JtYXRpb24gZm9yIG1wdTQwMQorI2RlZmluZSBDU19NUFU0MDFfUkVBRCAJMHgwMDAwMDIwMAkvLyByZWFkIGluZm9ybWF0aW9uIGZvciBtcHU0MDEKKyNkZWZpbmUgQ1NfT1BFTgkJMHgwMDAwMDQwMAkvLyBhbGwgb3BlbiBmdW5jdGlvbnMgaW4gdGhlIGRyaXZlcgorI2RlZmluZSBDU19SRUxFQVNFCTB4MDAwMDA4MDAJLy8gYWxsIHJlbGVhc2UgZnVuY3Rpb25zIGluIHRoZSBkcml2ZXIKKyNkZWZpbmUgQ1NfUEFSTVMJMHgwMDAwMTAwMAkvLyBmdW5jdGlvbmFsIGFuZCBvcGVyYXRpb25hbCBwYXJhbWV0ZXJzCisjZGVmaW5lIENTX0lPQ1RMCTB4MDAwMDIwMDAJLy8gaW9jdGwgKG5vbi1taXhlcikKKyNkZWZpbmUgQ1NfUE0JCTB4MDAwMDQwMDAJLy8gcG93ZXIgbWFuYWdlbWVudCAKKyNkZWZpbmUgQ1NfVE1QCQkweDEwMDAwMDAwCS8vIHRtcCBkZWJ1ZyBtYXNrIGJpdAorCisjZGVmaW5lIENTX0lPQ1RMX0NNRF9TVVNQRU5ECTB4MQkvLyBzdXNwZW5kCisjZGVmaW5lIENTX0lPQ1RMX0NNRF9SRVNVTUUJMHgyCS8vIHJlc3VtZQorLy8KKy8vIENTREVCVUcgaXMgdXN1YWwgbW9kZSBpcyBzZXQgdG8gMSwgdGhlbiB1c2UgdGhlCisvLyBjc19kZWJ1Z2xldmVsIGFuZCBjc19kZWJ1Z21hc2sgdG8gdHVybiBvbiBvciBvZmYgZGVidWdnaW5nLgorLy8gRGVidWcgbGV2ZWwgb2YgMSBoYXMgYmVlbiBkZWZpbmVkIHRvIGJlIGtlcm5lbCBlcnJvcnMgYW5kIGluZm8KKy8vIHRoYXQgc2hvdWxkIGJlIHByaW50ZWQgb24gYW55IHJlbGVhc2VkIGRyaXZlci4KKy8vCisjaWYgQ1NERUJVRworI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KSBpZigoY3NfZGVidWdsZXZlbCA+PSAobGV2ZWwpKSAmJiAoKG1hc2spICYgY3NfZGVidWdtYXNrKSApIHt4O30KKyNlbHNlCisjZGVmaW5lIENTX0RCR09VVChtYXNrLGxldmVsLHgpCisjZW5kaWYKKworI2lmIENTREVCVUcKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNzX2RlYnVnbGV2ZWwgPSAxOwkvLyBsZXZlbHMgcmFuZ2UgZnJvbSAxLTkKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNzX2RlYnVnbWFzayA9IENTX0lOSVQgfCBDU19FUlJPUjsJLy8gdXNlIENTX0RCR09VVCB3aXRoIHZhcmlvdXMgbWFzayB2YWx1ZXMKK21vZHVsZV9wYXJhbShjc19kZWJ1Z2xldmVsLCB1bG9uZywgMCk7Cittb2R1bGVfcGFyYW0oY3NfZGVidWdtYXNrLCB1bG9uZywgMCk7CisjZW5kaWYKKyNkZWZpbmUgQ1NfVFJVRSAJMQorI2RlZmluZSBDU19GQUxTRSAJMAorCisvLyBNSURJIGJ1ZmZlciBzaXplcyAKKyNkZWZpbmUgTUlESUlOQlVGICA1MDAKKyNkZWZpbmUgTUlESU9VVEJVRiA1MDAKKworI2RlZmluZSBGTU9ERV9NSURJX1NISUZUIDMKKyNkZWZpbmUgRk1PREVfTUlESV9SRUFEICAoRk1PREVfUkVBRCA8PCBGTU9ERV9NSURJX1NISUZUKQorI2RlZmluZSBGTU9ERV9NSURJX1dSSVRFIChGTU9ERV9XUklURSA8PCBGTU9ERV9NSURJX1NISUZUKQorCisjZGVmaW5lIENTNDI4MV9NQUpPUl9WRVJTSU9OIAkxCisjZGVmaW5lIENTNDI4MV9NSU5PUl9WRVJTSU9OIAkxMworI2lmZGVmIF9faWE2NF9fCisjZGVmaW5lIENTNDI4MV9BUkNICSAgICAgCTY0CS8vYXJjaGl0ZWN0dXJlIGtleQorI2Vsc2UKKyNkZWZpbmUgQ1M0MjgxX0FSQ0gJICAgICAJMzIJLy9hcmNoaXRlY3R1cmUga2V5CisjZW5kaWYKKworI2RlZmluZSBDU19UWVBFX0FEQyAwCisjZGVmaW5lIENTX1RZUEVfREFDIDEKKworCitzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPQorICAgIEtFUk5fQ1JJVCAiY3M0MjgxOiBpbnZhbGlkIG1hZ2ljIHZhbHVlXG4iOworCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShzKSB8fCAocyktPm1hZ2ljICE9IENTNDI4MV9NQUdJQykgeyBcCisgICAgICAgICAgICAgICAgcHJpbnRrKGludmFsaWRfbWFnaWMpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisvL0xJU1RfSEVBRChjczQyODFfZGV2cyk7CitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBjczQyODFfZGV2cyA9IHsgJmNzNDI4MV9kZXZzLCAmY3M0MjgxX2RldnMgfTsKKworc3RydWN0IGNzNDI4MV9zdGF0ZTsgCisKKyNpbmNsdWRlICJjczQyODFfd3JhcHBlci0yNC5jIgorCitzdHJ1Y3QgY3M0MjgxX3N0YXRlIHsKKwkvLyBtYWdpYyAKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisKKwkvLyB3ZSBrZWVwIHRoZSBjYXJkcyBpbiBhIGxpbmtlZCBsaXN0IAorCXN0cnVjdCBjczQyODFfc3RhdGUgKm5leHQ7CisKKwkvLyBwY2lkZXYgaXMgbmVlZGVkIHRvIHR1cm4gb2ZmIHRoZSBERE1BIGNvbnRyb2xsZXIgYXQgZHJpdmVyIHNodXRkb3duIAorCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLy8gc291bmRjb3JlIHN0dWZmIAorCWludCBkZXZfYXVkaW87CisJaW50IGRldl9taXhlcjsKKwlpbnQgZGV2X21pZGk7CisKKwkvLyBoYXJkd2FyZSByZXNvdXJjZXMgCisJdW5zaWduZWQgaW50IHBCQTBwaHlzLCBwQkExcGh5czsKKwljaGFyIF9faW9tZW0gKnBCQTA7CisJY2hhciBfX2lvbWVtICpwQkExOworCXVuc2lnbmVkIGludCBpcnE7CisKKwkvLyBtaXhlciByZWdpc3RlcnMgCisJc3RydWN0IHsKKwkJdW5zaWduZWQgc2hvcnQgdm9sWzEwXTsKKwkJdW5zaWduZWQgaW50IHJlY3NyYzsKKwkJdW5zaWduZWQgaW50IG1vZGNudDsKKwkJdW5zaWduZWQgc2hvcnQgbWljcHJlYW1wOworCX0gbWl4OworCisJLy8gd2F2ZSBzdHVmZiAgIAorCXN0cnVjdCBwcm9wZXJ0aWVzIHsKKwkJdW5zaWduZWQgZm10OworCQl1bnNpZ25lZCBmbXRfb3JpZ2luYWw7CS8vIG9yaWdpbmFsIHJlcXVlc3RlZCBmb3JtYXQKKwkJdW5zaWduZWQgY2hhbm5lbHM7CisJCXVuc2lnbmVkIHJhdGU7CisJCXVuc2lnbmVkIGNoYXIgY2xrZGl2OworCX0gcHJvcF9kYWMsIHByb3BfYWRjOworCXVuc2lnbmVkIGNvbnZlcnNpb246MTsJLy8gY29udmVyc2lvbiBmcm9tIDE2IHRvIDggYml0IGluIHByb2dyZXNzCisJdm9pZCAqdG1wYnVmZjsJCS8vIHRtcCBidWZmZXIgZm9yIHNhbXBsZSBjb252ZXJzaW9ucworCXVuc2lnbmVkIGVuYTsKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtX2FkYzsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtX2RhYzsKKwltb2RlX3Qgb3Blbl9tb2RlOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXRfYWRjOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdF9kYWM7CisKKwlkbWFfYWRkcl90IGRtYWFkZHJfdG1wYnVmZjsKKwl1bnNpZ25lZCBidWZvcmRlcl90bXBidWZmOwkvLyBMb2cgYmFzZSAyIG9mICdyYXdidWYnIHNpemUgaW4gYnl0ZXMuLgorCXN0cnVjdCBkbWFidWYgeworCQl2b2lkICpyYXdidWY7CS8vIFBoeXNpY2FsIGFkZHJlc3Mgb2YgIAorCQlkbWFfYWRkcl90IGRtYWFkZHI7CisJCXVuc2lnbmVkIGJ1Zm9yZGVyOwkvLyBMb2cgYmFzZSAyIG9mICdyYXdidWYnIHNpemUgaW4gYnl0ZXMuLgorCQl1bnNpZ25lZCBudW1mcmFnOwkvLyAjIG9mICdmcmFnbWVudHMnIGluIHRoZSBidWZmZXIuCisJCXVuc2lnbmVkIGZyYWdzaGlmdDsJLy8gTG9nIGJhc2UgMiBvZiBmcmFnbWVudCBzaXplLgorCQl1bnNpZ25lZCBod3B0ciwgc3dwdHI7CisJCXVuc2lnbmVkIHRvdGFsX2J5dGVzOwkvLyAjIGJ5dGVzIHByb2Nlc3Mgc2luY2Ugb3Blbi4KKwkJdW5zaWduZWQgYmxvY2tzOwkvLyBsYXN0IHJldHVybmVkIGJsb2NrcyB2YWx1ZSBHRVRPUFRSCisJCXVuc2lnbmVkIHdha2V1cDsJLy8gaW50ZXJydXB0IG9jY3VycmVkIG9uIGJsb2NrIAorCQlpbnQgY291bnQ7CisJCXVuc2lnbmVkIHVuZGVycnVuOwkvLyB1bmRlcnJ1biBmbGFnCisJCXVuc2lnbmVkIGVycm9yOwkvLyBvdmVyL3VuZGVycnVuIAorCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCQkvLyByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyIAorCQl1bnNpZ25lZCBmcmFnc2l6ZTsJLy8gMioqZnJhZ3NoaWZ0Li4KKwkJdW5zaWduZWQgZG1hc2l6ZTsJLy8gMioqYnVmb3JkZXIuCisJCXVuc2lnbmVkIGZyYWdzYW1wbGVzOworCQkvLyBPU1Mgc3R1ZmYgCisJCXVuc2lnbmVkIG1hcHBlZDoxOwkvLyBCdWZmZXIgbWFwcGVkIGluIGNzNDI4MV9tbWFwKCk/CisJCXVuc2lnbmVkIHJlYWR5OjE7CS8vIHByb2dfZG1hYnVmX2RhYygpL2FkYygpIHN1Y2Nlc3NmdWw/CisJCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKKwkJdW5zaWduZWQgdHlwZToxOwkvLyBhZGMgb3IgZGFjIGJ1ZmZlciAoQ1NfVFlQRV9YWFgpCisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwl9IGRtYV9kYWMsIGRtYV9hZGM7CisKKwkvLyBtaWRpIHN0dWZmIAorCXN0cnVjdCB7CisJCXVuc2lnbmVkIGlyZCwgaXdyLCBpY250OworCQl1bnNpZ25lZCBvcmQsIG93ciwgb2NudDsKKwkJd2FpdF9xdWV1ZV9oZWFkX3QgaXdhaXQ7CisJCXdhaXRfcXVldWVfaGVhZF90IG93YWl0OworCQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwkJdW5zaWduZWQgY2hhciBpYnVmW01JRElJTkJVRl07CisJCXVuc2lnbmVkIGNoYXIgb2J1ZltNSURJT1VUQlVGXTsKKwl9IG1pZGk7CisKKwlzdHJ1Y3QgY3M0MjgxX3BtIHBtOworCXN0cnVjdCBjczQyODFfcGlwZWxpbmUgcGxbQ1M0MjgxX05VTUJFUl9PRl9QSVBFTElORVNdOworfTsKKworI2luY2x1ZGUgImNzNDI4MXBtLTI0LmMiCisKKyNpZiBDU0RFQlVHCisKKy8vIERFQlVHIFJPVVRJTkVTCisKKyNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUwgCV9TSU9XUignTScsMTIwLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMIAlfU0lPV1IoJ00nLDEyMSwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLIAlfU0lPV1IoJ00nLDEyMiwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLIAlfU0lPV1IoJ00nLDEyMywgaW50KQorCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX0FQTQkgCV9TSU9XUignTScsMTI0LCBpbnQpCisKKworc3RhdGljIHZvaWQgY3NfcHJpbnRpb2N0bCh1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHZpZHg7CisJLy8gSW5kZXggb2YgbWl4dGFibGUxW10gbWVtYmVyIGlzIERldmljZSBJRCAKKwkvLyBhbmQgbXVzdCBiZSA8PSBTT1VORF9NSVhFUl9OUkRFVklDRVMuCisJLy8gVmFsdWUgb2YgYXJyYXkgbWVtYmVyIGlzIGluZGV4IGludG8gcy0+bWl4LnZvbFtdCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWl4dGFibGUxW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7CisJCVtTT1VORF9NSVhFUl9QQ01dID0gMSwJLy8gdm9pY2UgCisJCVtTT1VORF9NSVhFUl9MSU5FMV0gPSAyLAkvLyBBVVgKKwkJW1NPVU5EX01JWEVSX0NEXSA9IDMsCS8vIENEIAorCQlbU09VTkRfTUlYRVJfTElORV0gPSA0LAkvLyBMaW5lIAorCQlbU09VTkRfTUlYRVJfU1lOVEhdID0gNSwJLy8gRk0KKwkJW1NPVU5EX01JWEVSX01JQ10gPSA2LAkvLyBNaWMgCisJCVtTT1VORF9NSVhFUl9TUEVBS0VSXSA9IDcsCS8vIFNwZWFrZXIgCisJCVtTT1VORF9NSVhFUl9SRUNMRVZdID0gOCwJLy8gUmVjb3JkaW5nIGxldmVsIAorCQlbU09VTkRfTUlYRVJfVk9MVU1FXSA9IDkJLy8gTWFzdGVyIFZvbHVtZSAKKwl9OworCisJc3dpdGNoICh4KSB7CisJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJICBwcmludGsoIlNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUw6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJPU1NfR0VUVkVSU0lPTjpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NZTkM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVERVUExFWDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVENBUFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfUkVTRVQ6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1BFRUQ6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NURVJFTzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9DSEFOTkVMUzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVEZNVFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZNVDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1BPU1Q6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRUUklHR0VSOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VUVFJJR0dFUjpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT1NQQUNFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRJU1BBQ0U6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfTk9OQkxPQ0s6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9ERUxBWTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVElQVFI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRPUFRSOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUQkxLU0laRTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1VCRElWSURFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9SQVRFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX0JJVFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJICBwcmludGsoIlNPVU5EX1BDTV9XUklURV9GSUxURVI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVFNZTkNSTzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9GSUxURVI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTE6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFMTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEUyOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUzOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFNDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFNToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEU1OlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0lORk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9JTkZPOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX09MRF9NSVhFUl9JTkZPOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfT0xEX01JWEVSX0lORk86XG4iKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3dpdGNoIChfSU9DX05SKHgpKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9WT0xVTUU6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9TUEVBS0VSOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TUEVBS0VSOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDTEVWOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9SRUNMRVY6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkJICBwcmludGsoIlNPVU5EX01JWEVSX01JQzpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TWU5USDpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCQkgIHByaW50aygiU09VTkRfTUlYRVJfUkVDU1JDOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCQkgIHByaW50aygiU09VTkRfTUlYRVJfREVWTUFTSzpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkJICBwcmludGsoIlNPVU5EX01JWEVSX1JFQ01BU0s6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TVEVSRU9ERVZTOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DQVBTOlxuIikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpID0gX0lPQ19OUih4KTsKKwkJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUworCQkJICAgIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpIHsKKwkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aworCQkJCQkoIlVOS05PV04gSU9DVEw6IDB4JS44eCBOUj0lZFxuIiwKKwkJCQkJCXgsIGkpKTsKKwkJCX0gZWxzZSB7CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsKKwkJCQkJKCJTT1VORF9NSVhFUl9JT0NUTCBBQzl4OiAweCUuOHggTlI9JWRcbiIsCisJCQkJCQl4LCBpKSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKyNlbmRpZgorc3RhdGljIGludCBwcm9nX2RtYWJ1Zl9hZGMoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBwcm9nX2NvZGVjKHN0cnVjdCBjczQyODFfc3RhdGUgKnMsIHVuc2lnbmVkIHR5cGUpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisvLworLy8gICAgICAgICAgICAgIEhhcmR3YXJlIEludGVyZmFjZXMgRm9yIHRoZSBDUzQyODEKKy8vCisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICJkZWxheXVzKCktLSBEZWxheSBmb3IgdGhlIHNwZWNpZmllZCAjIG9mIG1pY3Jvc2Vjb25kcy4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZCBkZWxheXVzKHN0cnVjdCBjczQyODFfc3RhdGUgKnMsIHUzMiBkZWxheSkKK3sKKwl1MzIgajsKKwlpZiAoKGRlbGF5ID4gOTk5OSkgJiYgKHMtPnBtLmZsYWdzICYgQ1M0MjgxX1BNX0lETEUpKSB7CisJCWogPSAoZGVsYXkgKiBIWikgLyAxMDAwMDAwOwkvKiBjYWxjdWxhdGUgZGVsYXkgaW4gamlmZmllcyAgKi8KKwkJaWYgKGogPCAxKQorCQkJaiA9IDE7CS8qIG1pbmltdW0gb25lIGppZmZ5LiAqLworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfVU5JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KGopOworCX0gZWxzZQorCQl1ZGVsYXkoZGVsYXkpOworCXJldHVybjsKK30KKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gImNzNDI4MV9yZWFkX2FjOTciIC0tIFJlYWRzIGEgd29yZCBmcm9tIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlCisvLyAgICAgICAgICAgICAgIENTNDI4MSdzIGFkZHJlc3Mgc3BhY2UoYmFzZWQgb24gdGhlIEJBMCByZWdpc3RlcikuCisvLworLy8gMS4gV3JpdGUgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoIGZvciBBQzk3IHJlZ2lzdGVyIGFkZHJlc3MKKy8vIDIuIFdyaXRlIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaCBmb3IgZGF0YSB0byB3cml0ZSB0byBBQzk3IHJlZ2lzdGVyLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBoIGZvciByZWFkcy4KKy8vIDMuIFdyaXRlIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGggZm9yIGluaXRpYXRpbmcgdGhlIHdyaXRlCisvLyA0LiBSZWFkIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAxN2gKKy8vIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgorLy8gNi4gUmVhZCBBQ1NUUyA9IFN0YXR1cyBSZWdpc3RlciA9IDQ2NGgsIGNoZWNrIFZTVFMgYml0CisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyBpbnQgY3M0MjgxX3JlYWRfYWM5NyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpjYXJkLCB1MzIgb2Zmc2V0LAorCQkJICAgIHUzMiAqIHZhbHVlKQoreworCXUzMiBjb3VudCwgc3RhdHVzOworCisJLy8gTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgbm90IGRhdGEgc2l0dGluZworCS8vIGFyb3VuZCBmcm9tIGEgcHJldmlvdXMgdW5jb21wbGV0ZWQgYWNjZXNzLgorCS8vIEFDU0RBID0gU3RhdHVzIERhdGEgUmVnaXN0ZXIgPSA0N0NoCisJc3RhdHVzID0gcmVhZGwoY2FyZC0+cEJBMCArIEJBMF9BQ1NEQSk7CisKKwkvLyBTZXR1cCB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVycyBvbiB0aGUgQ1M0MjgxIHRvIHNlbmQgdGhlCisJLy8gYXBwcm9wcmlhdGUgY29tbWFuZCB0byB0aGUgQUM5NyB0byBwZXJmb3JtIHRoZSByZWFkLgorCS8vIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaAorCS8vIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaAorCS8vIEFDQ1RMID0gQ29udHJvbCBSZWdpc3RlciA9IDQ2MGgKKwkvLyBiaXQgRENWIC0gd2lsbCBjbGVhciB3aGVuIHByb2Nlc3MgY29tcGxldGVkCisJLy8gYml0IENSVyAtIFJlYWQgY29tbWFuZAorCS8vIGJpdCBWRlJNIC0gdmFsaWQgZnJhbWUgZW5hYmxlZAorCS8vIGJpdCBFU1lOIC0gQVNZTkMgZ2VuZXJhdGlvbiBlbmFibGVkCisKKwkvLyBHZXQgdGhlIGFjdHVhbCBBQzk3IHJlZ2lzdGVyIGZyb20gdGhlIG9mZnNldAorCXdyaXRlbChvZmZzZXQgLSBCQTBfQUM5N19SRVNFVCwgY2FyZC0+cEJBMCArIEJBMF9BQ0NBRCk7CisJd3JpdGVsKDAsIGNhcmQtPnBCQTAgKyBCQTBfQUNDREEpOworCXdyaXRlbChBQ0NUTF9EQ1YgfCBBQ0NUTF9DUlcgfCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiwKKwkgICAgICAgY2FyZC0+cEJBMCArIEJBMF9BQ0NUTCk7CisKKwkvLyBXYWl0IGZvciB0aGUgcmVhZCB0byBvY2N1ci4KKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDsgY291bnQrKykgeworCQkvLyBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCisJCXVkZWxheSgyNSk7CisKKwkJLy8gTm93LCBjaGVjayB0byBzZWUgaWYgdGhlIHJlYWQgaGFzIGNvbXBsZXRlZC4KKwkJLy8gQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDE3aAorCQlpZiAoIShyZWFkbChjYXJkLT5wQkEwICsgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikpCisJCQlicmVhazsKKwl9CisKKwkvLyBNYWtlIHN1cmUgdGhlIHJlYWQgY29tcGxldGVkLgorCWlmIChyZWFkbChjYXJkLT5wQkEwICsgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikKKwkJcmV0dXJuIDE7CisKKwkvLyBXYWl0IGZvciB0aGUgdmFsaWQgc3RhdHVzIGJpdCB0byBnbyBhY3RpdmUuCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTA7IGNvdW50KyspIHsKKwkJLy8gUmVhZCB0aGUgQUM5NyBzdGF0dXMgcmVnaXN0ZXIuCisJCS8vIEFDU1RTID0gU3RhdHVzIFJlZ2lzdGVyID0gNDY0aAorCQlzdGF0dXMgPSByZWFkbChjYXJkLT5wQkEwICsgQkEwX0FDU1RTKTsKKworCQkvLyBTZWUgaWYgd2UgaGF2ZSB2YWxpZCBzdGF0dXMuCisJCS8vIFZTVFMgLSBWYWxpZCBTdGF0dXMKKwkJaWYgKHN0YXR1cyAmIEFDU1RTX1ZTVFMpCisJCQlicmVhazsKKwkJLy8gV2FpdCBmb3IgYSBzaG9ydCB3aGlsZS4KKwkJdWRlbGF5KDI1KTsKKwl9CisKKwkvLyBNYWtlIHN1cmUgd2UgZ290IHZhbGlkIHN0YXR1cy4KKwlpZiAoIShzdGF0dXMgJiBBQ1NUU19WU1RTKSkKKwkJcmV0dXJuIDE7CisKKwkvLyBSZWFkIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIEFDOTcgcmVnaXN0ZXIuCisJLy8gQUNTREEgPSBTdGF0dXMgRGF0YSBSZWdpc3RlciA9IDQ3NGgKKwkqdmFsdWUgPSByZWFkbChjYXJkLT5wQkEwICsgQkEwX0FDU0RBKTsKKworCS8vIFN1Y2Nlc3MuCisJcmV0dXJuICgwKTsKK30KKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyAiY3M0MjgxX3dyaXRlX2FjOTcoKSItLSB3cml0ZXMgYSB3b3JkIHRvIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlCisvLyBDUzQ2MXgncyBhZGRyZXNzIHNwYWNlIChiYXNlZCBvbiB0aGUgcGFydCdzIGJhc2UgYWRkcmVzcyB6ZXJvIHJlZ2lzdGVyKS4KKy8vCisvLyAxLiBXcml0ZSBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2ggZm9yIEFDOTcgcmVnaXN0ZXIgYWRkcmVzcworLy8gMi4gV3JpdGUgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoIGZvciBkYXRhIHRvIHdyaXRlIHRvIEFDOTcgcmVnLgorLy8gMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGUKKy8vIDQuIFJlYWQgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDA3aAorLy8gNS4gaWYgRENWIG5vdCBjbGVhcmVkLCBicmVhayBhbmQgcmV0dXJuIGVycm9yCisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgaW50IGNzNDI4MV93cml0ZV9hYzk3KHN0cnVjdCBjczQyODFfc3RhdGUgKmNhcmQsIHUzMiBvZmZzZXQsCisJCQkgICAgIHUzMiB2YWx1ZSkKK3sKKwl1MzIgY291bnQsIHN0YXR1cz0wOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3NfNDI4MV93cml0ZV9hYzk3KCkrIFxuIikpOworCisJLy8gU2V0dXAgdGhlIEFDOTcgY29udHJvbCByZWdpc3RlcnMgb24gdGhlIENTNDI4MSB0byBzZW5kIHRoZQorCS8vIGFwcHJvcHJpYXRlIGNvbW1hbmQgdG8gdGhlIEFDOTcgdG8gcGVyZm9ybSB0aGUgcmVhZC4KKwkvLyBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2gKKwkvLyBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGgKKwkvLyBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoCisJLy8gc2V0IERDViAtIHdpbGwgY2xlYXIgd2hlbiBwcm9jZXNzIGNvbXBsZXRlZAorCS8vIHJlc2V0IENSVyAtIFdyaXRlIGNvbW1hbmQKKwkvLyBzZXQgVkZSTSAtIHZhbGlkIGZyYW1lIGVuYWJsZWQKKwkvLyBzZXQgRVNZTiAtIEFTWU5DIGdlbmVyYXRpb24gZW5hYmxlZAorCS8vIHNldCBSU1ROIC0gQVJTVCMgaW5hY3RpdmUsIEFDOTcgY29kZWMgbm90IHJlc2V0CisKKwkvLyBHZXQgdGhlIGFjdHVhbCBBQzk3IHJlZ2lzdGVyIGZyb20gdGhlIG9mZnNldAorCisJd3JpdGVsKG9mZnNldCAtIEJBMF9BQzk3X1JFU0VULCBjYXJkLT5wQkEwICsgQkEwX0FDQ0FEKTsKKwl3cml0ZWwodmFsdWUsIGNhcmQtPnBCQTAgKyBCQTBfQUNDREEpOworCXdyaXRlbChBQ0NUTF9EQ1YgfCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiwKKwkgICAgICAgY2FyZC0+cEJBMCArIEJBMF9BQ0NUTCk7CisKKwkvLyBXYWl0IGZvciB0aGUgd3JpdGUgdG8gb2NjdXIuCisJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMTAwOyBjb3VudCsrKSB7CisJCS8vIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KKwkJdWRlbGF5KDI1KTsKKwkJLy8gTm93LCBjaGVjayB0byBzZWUgaWYgdGhlIHdyaXRlIGhhcyBjb21wbGV0ZWQuCisJCS8vIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAwN2gKKwkJc3RhdHVzID0gcmVhZGwoY2FyZC0+cEJBMCArIEJBMF9BQ0NUTCk7CisJCWlmICghKHN0YXR1cyAmIEFDQ1RMX0RDVikpCisJCQlicmVhazsKKwl9CisKKwkvLyBNYWtlIHN1cmUgdGhlIHdyaXRlIGNvbXBsZXRlZC4KKwlpZiAoc3RhdHVzICYgQUNDVExfRENWKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTworCSAgICAgIAkJImNzNDI4MTogY3NfNDI4MV93cml0ZV9hYzk3KCktIHVuYWJsZSB0byB3cml0ZS4gQUNDVExfRENWIGFjdGl2ZVxuIikpOworCQlyZXR1cm4gMTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3NfNDI4MV93cml0ZV9hYzk3KCktIDBcbiIpKTsKKwkvLyBTdWNjZXNzLgorCXJldHVybiAwOworfQorCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAiSW5pdDQyODEoKSIgLS0gQnJpbmcgdXAgdGhlIHBhcnQuCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIF9fZGV2aW5pdCBpbnQgY3M0MjgxX2h3X2luaXQoc3RydWN0IGNzNDI4MV9zdGF0ZSAqY2FyZCkKK3sKKwl1MzIgYWM5N19zbG90aWQ7CisJdTMyIHRlbXAxLCB0ZW1wMjsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV9od19pbml0KCkrIFxuIikpOworI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisJaWYoIWNhcmQpCisJCXJldHVybiAxOworI2VuZGlmCisJdGVtcDIgPSByZWFkbChjYXJkLT5wQkEwICsgQkEwX0NGTFIpOworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IgfCBDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDI4MTogY3M0MjgxX2h3X2luaXQoKSBDRkxSIDB4JXhcbiIsIHRlbXAyKSk7CisJaWYodGVtcDIgIT0gQ1M0MjgxX0NGTFJfREVGQVVMVCkKKwl7CisJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkiY3M0MjgxOiBjczQyODFfaHdfaW5pdCgpIENGTFIgaW52YWxpZCAtIHJlc2V0dGluZyBmcm9tIDB4JXggdG8gMHgleFxuIiwKKwkJCQl0ZW1wMixDUzQyODFfQ0ZMUl9ERUZBVUxUKSk7CisJCXdyaXRlbChDUzQyODFfQ0ZMUl9ERUZBVUxULCBjYXJkLT5wQkEwICsgQkEwX0NGTFIpOworCQl0ZW1wMiA9IHJlYWRsKGNhcmQtPnBCQTAgKyBCQTBfQ0ZMUik7CisJCWlmKHRlbXAyICE9IENTNDI4MV9DRkxSX0RFRkFVTFQpCisJCXsKKwkJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkJImNzNDI4MTogY3M0MjgxX2h3X2luaXQoKSBJbnZhbGlkIGhhcmR3YXJlIC0gdW5hYmxlIHRvIGNvbmZpZ3VyZSBDRkxSXG4iKSk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKworCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqNworCS8vICBTZXQgdXAgdGhlIFNvdW5kIFN5c3RlbSBDb25maWd1cmF0aW9uCisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCS8vIFNldCB0aGUgJ0NvbmZpZ3VyYXRpb24gV3JpdGUgUHJvdGVjdCcgcmVnaXN0ZXIKKwkvLyB0byA0MjgxaC4gIEFsbG93cyB2ZW5kb3ItZGVmaW5lZCBjb25maWd1cmF0aW9uCisJLy8gc3BhY2UgYmV0d2VlbiAwZTRoIGFuZCAwZmZoIHRvIGJlIHdyaXR0ZW4uCisKKwl3cml0ZWwoMHg0MjgxLCBjYXJkLT5wQkEwICsgQkEwX0NXUFIpOwkvLyAoM2UwaCkKKworCS8vICgwKSwgQmxhc3QgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgdG8gemVybyBzbyB0aGF0IHRoZQorCS8vIFBMTCBzdGFydHMgb3V0IGluIGEga25vd24gc3RhdGUsIGFuZCBibGFzdCB0aGUgbWFzdGVyIHNlcmlhbAorCS8vIHBvcnQgY29udHJvbCByZWdpc3RlciB0byB6ZXJvIHNvIHRoYXQgdGhlIHNlcmlhbCBwb3J0cyBhbHNvCisJLy8gc3RhcnQgb3V0IGluIGEga25vd24gc3RhdGUuCisKKwl3cml0ZWwoMCwgY2FyZC0+cEJBMCArIEJBMF9DTEtDUjEpOwkvLyAoNDAwaCkKKwl3cml0ZWwoMCwgY2FyZC0+cEJBMCArIEJBMF9TRVJNQyk7CS8vICg0MjBoKQorCisKKwkvLyAoMSksIE1ha2UgRVNZTiBnbyB0byB6ZXJvIHRvIHR1cm4gb2ZmCisJLy8gdGhlIFN5bmMgcHVsc2Ugb24gdGhlIEFDOTcgbGluay4KKworCXdyaXRlbCgwLCBjYXJkLT5wQkEwICsgQkEwX0FDQ1RMKTsKKwl1ZGVsYXkoNTApOworCisKKwkvLyAoMikgRHJpdmUgdGhlIEFSU1QjIHBpbiBsb3cgZm9yIGEgbWluaW11bSBvZiAxdVMgKGFzIGRlZmluZWQgaW4KKwkvLyB0aGUgQUM5NyBzcGVjKSBhbmQgdGhlbiBkcml2ZSBpdCBoaWdoLiAgVGhpcyBpcyBkb25lIGZvciBub24KKwkvLyBBQzk3IG1vZGVzIHNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvZ2ljIGV4dGVybmFsIHRvIHRoZSBDUzQ2MXgKKwkvLyB0aGF0IHVzZXMgdGhlIEFSU1QjIGxpbmUgZm9yIGEgcmVzZXQuCisKKwl3cml0ZWwoMCwgY2FyZC0+cEJBMCArIEJBMF9TUE1DKTsJLy8gKDNlY2gpCisJdWRlbGF5KDEwMCk7CisJd3JpdGVsKFNQTUNfUlNUTiwgY2FyZC0+cEJBMCArIEJBMF9TUE1DKTsKKwlkZWxheXVzKGNhcmQsNTAwMDApOwkJLy8gV2FpdCA1MCBtcyBmb3IgQUJJVENMSyB0byBiZWNvbWUgc3RhYmxlLgorCisJLy8gKDMpIFR1cm4gb24gdGhlIFNvdW5kIFN5c3RlbSBDbG9ja3MuCisJd3JpdGVsKENMS0NSMV9QTExQLCBjYXJkLT5wQkEwICsgQkEwX0NMS0NSMSk7CS8vICg0MDBoKQorCWRlbGF5dXMoY2FyZCw1MDAwMCk7CQkvLyBXYWl0IGZvciB0aGUgUExMIHRvIHN0YWJpbGl6ZS4KKwkvLyBUdXJuIG9uIGNsb2NraW5nIG9mIHRoZSBjb3JlIChDTEtDUjEoNDAwaCkgPSAweDAwMDAwMDMwKQorCXdyaXRlbChDTEtDUjFfUExMUCB8IENMS0NSMV9TV0NFLCBjYXJkLT5wQkEwICsgQkEwX0NMS0NSMSk7CisKKwkvLyAoNCkgUG93ZXIgb24gZXZlcnl0aGluZyBmb3Igbm93Li4KKwl3cml0ZWwoMHg3RSwgY2FyZC0+cEJBMCArIEJBMF9TU1BNKTsJLy8gKDc0MGgpCisKKwkvLyAoNSkgV2FpdCBmb3IgY2xvY2sgc3RhYmlsaXphdGlvbi4KKwlmb3IgKHRlbXAxID0gMDsgdGVtcDEgPCAxMDAwOyB0ZW1wMSsrKSB7CisJCXVkZWxheSgxMDAwKTsKKwkJaWYgKHJlYWRsKGNhcmQtPnBCQTAgKyBCQTBfQ0xLQ1IxKSAmIENMS0NSMV9ETExSRFkpCisJCQlicmVhazsKKwl9CisJaWYgKCEocmVhZGwoY2FyZC0+cEJBMCArIEJBMF9DTEtDUjEpICYgQ0xLQ1IxX0RMTFJEWSkpIHsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIgCisJCQkiY3M0MjgxOiBETExSRFkgZmFpbGVkIVxuIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJLy8gKDYpIEVuYWJsZSBBU1lOQyBnZW5lcmF0aW9uLgorCXdyaXRlbChBQ0NUTF9FU1lOLCBjYXJkLT5wQkEwICsgQkEwX0FDQ1RMKTsJLy8gKDQ2MGgpCisKKwkvLyBOb3cgd2FpdCAnZm9yIGEgc2hvcnQgd2hpbGUnIHRvIGFsbG93IHRoZSAgQUM5NworCS8vIHBhcnQgdG8gc3RhcnQgZ2VuZXJhdGluZyBiaXQgY2xvY2suIChzbyB3ZSBkb24ndAorCS8vIFRyeSB0byBzdGFydCB0aGUgUExMIHdpdGhvdXQgYW4gaW5wdXQgY2xvY2suKQorCWRlbGF5dXMoY2FyZCw1MDAwMCk7CisKKwkvLyBTZXQgdGhlIHNlcmlhbCBwb3J0IHRpbWluZyBjb25maWd1cmF0aW9uLCBzbyB0aGF0IHRoZQorCS8vIGNsb2NrIGNvbnRyb2wgY2lyY3VpdCBnZXRzIGl0cyBjbG9jayBmcm9tIHRoZSByaWdodCBwbGFjZS4KKwl3cml0ZWwoU0VSTUNfUFRDX0FDOTcsIGNhcmQtPnBCQTAgKyBCQTBfU0VSTUMpOwkvLyAoNDIwaCk9Mi4KKworCS8vICg3KSBXYWl0IGZvciB0aGUgY29kZWMgcmVhZHkgc2lnbmFsIGZyb20gdGhlIEFDOTcgY29kZWMuCisKKwlmb3IgKHRlbXAxID0gMDsgdGVtcDEgPCAxMDAwOyB0ZW1wMSsrKSB7CisJCS8vIERlbGF5IGEgbWlsIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhbmQKKwkJLy8gdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KKwkJdWRlbGF5KDEwMDApOworCQlpZiAocmVhZGwoY2FyZC0+cEJBMCArIEJBMF9BQ1NUUykgJiBBQ1NUU19DUkRZKQkvLyBJZiByZWFkeSwgICg0NjRoKQorCQkJYnJlYWs7CS8vICAgZXhpdCB0aGUgJ2ZvcicgbG9vcC4KKwl9CisJaWYgKCEocmVhZGwoY2FyZC0+cEJBMCArIEJBMF9BQ1NUUykgJiBBQ1NUU19DUkRZKSkJLy8gSWYgbmV2ZXIgY2FtZSByZWFkeSwKKwl7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI4MTogQUNTVFMgbmV2ZXIgY2FtZSByZWFkeSFcbiIpKTsKKwkJcmV0dXJuIC1FSU87CS8vICAgZXhpdCBpbml0aWFsaXphdGlvbi4KKwl9CisJLy8gKDgpIEFzc2VydCB0aGUgJ3ZhbGlkIGZyYW1lJyBzaWduYWwgc28gd2UgY2FuCisJLy8gYmVnaW4gc2VuZGluZyBjb21tYW5kcyB0byB0aGUgQUM5NyBjb2RlYy4KKwl3cml0ZWwoQUNDVExfVkZSTSB8IEFDQ1RMX0VTWU4sIGNhcmQtPnBCQTAgKyBCQTBfQUNDVEwpOwkvLyAoNDYwaCkKKworCS8vICg5KSwgV2FpdCB1bnRpbCBDT0RFQyBjYWxpYnJhdGlvbiBpcyBmaW5pc2hlZC4KKwkvLyBQcmludCBhbiBlcnJvciBtZXNzYWdlIGlmIGl0IGRvZXNuJ3QuCisJZm9yICh0ZW1wMSA9IDA7IHRlbXAxIDwgMTAwMDsgdGVtcDErKykgeworCQlkZWxheXVzKGNhcmQsMTAwMDApOworCQkvLyBSZWFkIHRoZSBBQzk3IFBvd2VyZG93biBDb250cm9sL1N0YXR1cyBSZWdpc3Rlci4KKwkJY3M0MjgxX3JlYWRfYWM5NyhjYXJkLCBCQTBfQUM5N19QT1dFUkRPV04sICZ0ZW1wMik7CisJCWlmICgodGVtcDIgJiAweDAwMDAwMDBGKSA9PSAweDAwMDAwMDBGKQorCQkJYnJlYWs7CisJfQorCWlmICgodGVtcDIgJiAweDAwMDAwMDBGKSAhPSAweDAwMDAwMDBGKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fRVJSCisJCQkiY3M0MjgxOiBDb2RlYyBmYWlsZWQgdG8gY2FsaWJyYXRlLiAgU3RhdHVzID0gJS44eC5cbiIsCisJCQkJdGVtcDIpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCS8vICgxMCksIFNldCB0aGUgc2VyaWFsIHBvcnQgdGltaW5nIGNvbmZpZ3VyYXRpb24sIHNvIHRoYXQgdGhlCisJLy8gY2xvY2sgY29udHJvbCBjaXJjdWl0IGdldHMgaXRzIGNsb2NrIGZyb20gdGhlIHJpZ2h0IHBsYWNlLgorCXdyaXRlbChTRVJNQ19QVENfQUM5NywgY2FyZC0+cEJBMCArIEJBMF9TRVJNQyk7CS8vICg0MjBoKT0yLgorCisKKwkvLyAoMTEpIFdhaXQgdW50aWwgd2UndmUgc2FtcGxlZCBpbnB1dCBzbG90cyAzICYgNCBhcyB2YWxpZCwgbWVhbmluZworCS8vIHRoYXQgdGhlIGNvZGVjIGlzIHB1bXBpbmcgQURDIGRhdGEgYWNyb3NzIHRoZSBBQyBsaW5rLgorCWZvciAodGVtcDEgPSAwOyB0ZW1wMSA8IDEwMDA7IHRlbXAxKyspIHsKKwkJLy8gRGVsYXkgYSBtaWwgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGFuZAorCQkvLyB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgorCQlkZWxheXVzKGNhcmQsMTAwMCk7CS8vKHRlc3QpCisKKwkJLy8gUmVhZCB0aGUgaW5wdXQgc2xvdCB2YWxpZCByZWdpc3RlcjsgIFNlZQorCQkvLyBpZiBpbnB1dCBzbG90cyAzIGFuZCA0IGFyZSB2YWxpZCB5ZXQuCisJCWlmICgKKwkJICAgIChyZWFkbChjYXJkLT5wQkEwICsgQkEwX0FDSVNWKSAmCisJCSAgICAgKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgPT0KKwkJICAgIChBQ0lTVl9JU1YzIHwgQUNJU1ZfSVNWNCkpIGJyZWFrOwkvLyBFeGl0IHRoZSAnZm9yJyBpZiBzbG90cyBhcmUgdmFsaWQuCisJfQorCS8vIElmIHdlIG5ldmVyIGdvdCB2YWxpZCBkYXRhLCBleGl0IGluaXRpYWxpemF0aW9uLgorCWlmICgocmVhZGwoY2FyZC0+cEJBMCArIEJBMF9BQ0lTVikgJiAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKQorCSAgICAhPSAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwKKwkJCSAgcHJpbnRrKEtFUk5fRVJSCisJCQkJICJjczQyODE6IE5ldmVyIGdvdCB2YWxpZCBkYXRhIVxuIikpOworCQlyZXR1cm4gLUVJTzsJLy8gSWYgbm8gdmFsaWQgZGF0YSwgZXhpdCBpbml0aWFsaXphdGlvbi4KKwl9CisJLy8gKDEyKSwgU3RhcnQgZGlnaXRhbCBkYXRhIHRyYW5zZmVyIG9mIGF1ZGlvIGRhdGEgdG8gdGhlIGNvZGVjLgorCXdyaXRlbChBQ09TVl9TTFYzIHwgQUNPU1ZfU0xWNCwgY2FyZC0+cEJBMCArIEJBMF9BQ09TVik7CS8vICg0NjhoKQorCisKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gVW5tdXRlIHRoZSBNYXN0ZXIgYW5kIEFsdGVybmF0ZQorCS8vIChoZWFkcGhvbmUpIHZvbHVtZXMuICBTZXQgdG8gbWF4LgorCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwljczQyODFfd3JpdGVfYWM5NyhjYXJkLCBCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FLCAwKTsKKwljczQyODFfd3JpdGVfYWM5NyhjYXJkLCBCQTBfQUM5N19NQVNURVJfVk9MVU1FLCAwKTsKKworCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJLy8gUG93ZXIgb24gdGhlIERBQyhBZGREQUNVc2VyKClmcm9tIG1haW4oKSkKKwkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCWNzNDI4MV9yZWFkX2FjOTcoY2FyZCwgQkEwX0FDOTdfUE9XRVJET1dOLCAmdGVtcDEpOworCWNzNDI4MV93cml0ZV9hYzk3KGNhcmQsIEJBMF9BQzk3X1BPV0VSRE9XTiwgdGVtcDEgJj0gMHhmZGZmKTsKKworCS8vIFdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgREFDIHJlYWR5IHN0YXRlLgorCWZvciAodGVtcDIgPSAwOyB0ZW1wMiA8IDMyOyB0ZW1wMisrKSB7CisJCS8vIExldCdzIHdhaXQgYSBtaWwgdG8gbGV0IHRoaW5ncyBzZXR0bGUuCisJCWRlbGF5dXMoY2FyZCwxMDAwKTsKKwkJLy8gUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWcuCisJCWNzNDI4MV9yZWFkX2FjOTcoY2FyZCwgQkEwX0FDOTdfUE9XRVJET1dOLCAmdGVtcDEpOworCQkvLyBJZiB0aGUgREFDIHJlYWR5IHN0YXRlIGJpdCBpcyBzZXQsIHN0b3Agd2FpdGluZy4KKwkJaWYgKHRlbXAxICYgMHgyKQorCQkJYnJlYWs7CisJfQorCisJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKwkvLyBQb3dlciBvbiB0aGUgQURDKEFkZEFEQ1VzZXIoKWZyb20gbWFpbigpKQorCS8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisJY3M0MjgxX3JlYWRfYWM5NyhjYXJkLCBCQTBfQUM5N19QT1dFUkRPV04sICZ0ZW1wMSk7CisJY3M0MjgxX3dyaXRlX2FjOTcoY2FyZCwgQkEwX0FDOTdfUE9XRVJET1dOLCB0ZW1wMSAmPSAweGZlZmYpOworCisJLy8gV2FpdCB1bnRpbCB3ZSBzYW1wbGUgQURDIHJlYWR5IHN0YXRlLgorCWZvciAodGVtcDIgPSAwOyB0ZW1wMiA8IDMyOyB0ZW1wMisrKSB7CisJCS8vIExldCdzIHdhaXQgYSBtaWwgdG8gbGV0IHRoaW5ncyBzZXR0bGUuCisJCWRlbGF5dXMoY2FyZCwxMDAwKTsKKwkJLy8gUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWcuCisJCWNzNDI4MV9yZWFkX2FjOTcoY2FyZCwgQkEwX0FDOTdfUE9XRVJET1dOLCAmdGVtcDEpOworCQkvLyBJZiB0aGUgQURDIHJlYWR5IHN0YXRlIGJpdCBpcyBzZXQsIHN0b3Agd2FpdGluZy4KKwkJaWYgKHRlbXAxICYgMHgxKQorCQkJYnJlYWs7CisJfQorCS8vIFNldCB1cCA0MjgxIFJlZ2lzdGVyIGNvbnRlbnRzIHRoYXQKKwkvLyBkb24ndCBjaGFuZ2UgZm9yIGJvb3QgZHVyYXRpb24uCisKKwkvLyBGb3IgcGxheWJhY2ssIHdlIG1hcCBBQzk3IHNsb3QgMyBhbmQgNChMZWZ0CisJLy8gJiBSaWdodCBQQ00gcGxheWJhY2spIHRvIERNQSBDaGFubmVsIDAuCisJLy8gU2V0IHRoZSBmaWZvIHRvIGJlIDE1IGJ5dGVzIGF0IG9mZnNldCB6ZXJvLgorCisJYWM5N19zbG90aWQgPSAweDAxMDAwZjAwOwkvLyBGQ1IwLlJTWzQ6MF09MSg9PnNsb3Q0LCByaWdodCBQQ00gcGxheWJhY2spLgorCS8vIEZDUjAuTFNbNDowXT0wKD0+c2xvdDMsIGxlZnQgUENNIHBsYXliYWNrKS4KKwkvLyBGQ1IwLlNaWzYtMF09MTU7IEZDUjAuT0ZbNi0wXT0wLgorCXdyaXRlbChhYzk3X3Nsb3RpZCwgY2FyZC0+cEJBMCArIEJBMF9GQ1IwKTsJLy8gKDE4MGgpCisJd3JpdGVsKGFjOTdfc2xvdGlkIHwgRkNSbl9GRU4sIGNhcmQtPnBCQTAgKyBCQTBfRkNSMCk7CS8vIFR1cm4gb24gRklGTyBFbmFibGUuCisKKwkvLyBGb3IgY2FwdHVyZSwgd2UgbWFwIEFDOTcgc2xvdCAxMCBhbmQgMTEoTGVmdAorCS8vIGFuZCBSaWdodCBQQ00gUmVjb3JkKSB0byBETUEgQ2hhbm5lbCAxLgorCS8vIFNldCB0aGUgZmlmbyB0byBiZSAxNSBieXRlcyBhdCBvZmZzZXQgc2l4dGVlbi4KKwlhYzk3X3Nsb3RpZCA9IDB4MEIwQTBmMTA7CS8vIEZDUjEuUlNbNDowXT0xMSg9PnNsb3QxMSwgcmlnaHQgUENNIHJlY29yZCkuCisJLy8gRkNSMS5MU1s0OjBdPTEwKD0+c2xvdDEwLCBsZWZ0IFBDTSByZWNvcmQpLgorCS8vIEZDUjEuU1pbNi0wXT0xNTsgRkNSMS5PRls2LTBdPTE2LgorCXdyaXRlbChhYzk3X3Nsb3RpZCB8IEZDUm5fUFNILCBjYXJkLT5wQkEwICsgQkEwX0ZDUjEpOwkvLyAoMTg0aCkKKwl3cml0ZWwoYWM5N19zbG90aWQgfCBGQ1JuX0ZFTiwgY2FyZC0+cEJBMCArIEJBMF9GQ1IxKTsJLy8gVHVybiBvbiBGSUZPIEVuYWJsZS4KKworCS8vIE1hcCB0aGUgUGxheWJhY2sgU1JDIHRvIHRoZSBzYW1lIEFDOTcgc2xvdHMoMyAmIDQtLQorCS8vIC0tUGxheWJhY2sgbGVmdCAmIHJpZ2h0KWFzIERNQSBjaGFubmVsIDAuCisJLy8gTWFwIHRoZSByZWNvcmQgU1JDIHRvIHRoZSBzYW1lIEFDOTcgc2xvdHMoMTAgJiAxMS0tCisJLy8gLS0gUmVjb3JkIGxlZnQgJiByaWdodCkgYXMgRE1BIGNoYW5uZWwgMS4KKworCWFjOTdfc2xvdGlkID0gMHgwYjBhMDEwMDsJLy8gU0NSU0EuUFJTU1s0OjBdPTEoPT5zbG90NCwgcmlnaHQgUENNIHBsYXliYWNrKS4KKwkvLyBTQ1JTQS5QTFNTWzQ6MF09MCg9PnNsb3QzLCBsZWZ0IFBDTSBwbGF5YmFjaykuCisJLy8gU0NSU0EuQ1JTU1s0OjBdPTExKD0+c2xvdDExLCByaWdodCBQQ00gcmVjb3JkKQorCS8vIFNDUlNBLkNMU1NbNDowXT0xMCg9PnNsb3QxMCwgbGVmdCBQQ00gcmVjb3JkKS4KKwl3cml0ZWwoYWM5N19zbG90aWQsIGNhcmQtPnBCQTAgKyBCQTBfU1JDU0EpOwkvLyAoNzVjaCkKKworCS8vIFNldCAnSGFsZiBUZXJtaW5hbCBDb3VudCBJbnRlcnJ1cHQgRW5hYmxlJyBhbmQgJ1Rlcm1pbmFsCisJLy8gQ291bnQgSW50ZXJydXB0IEVuYWJsZScgaW4gRE1BIENvbnRyb2wgUmVnaXN0ZXJzIDAgJiAxLgorCS8vIFNldCAnTVNLJyBmbGFnIHRvIDEgdG8ga2VlcCB0aGUgRE1BIGVuZ2luZXMgcGF1c2VkLgorCXRlbXAxID0gKERDUm5fSFRDSUUgfCBEQ1JuX1RDSUUgfCBEQ1JuX01TSyk7CS8vICgwMDAzMDAwMWgpCisJd3JpdGVsKHRlbXAxLCBjYXJkLT5wQkEwICsgQkEwX0RDUjApOwkvLyAoMTU0aAorCXdyaXRlbCh0ZW1wMSwgY2FyZC0+cEJBMCArIEJBMF9EQ1IxKTsJLy8gKDE1Y2gpCisKKwkvLyBTZXQgJ0F1dG8tSW5pdGlhbGl6ZSBDb250cm9sJyB0byAnZW5hYmxlZCc7IEZvciBwbGF5YmFjaywKKwkvLyBzZXQgJ1RyYW5zZmVyIFR5cGUgQ29udHJvbCcoVFJbMTowXSkgdG8gJ3JlYWQgdHJhbnNmZXInLAorCS8vIGZvciByZWNvcmQsIHNldCBUcmFuc2ZlciBUeXBlIENvbnRyb2wgdG8gJ3dyaXRlIHRyYW5zZmVyJy4KKwkvLyBBbGwgb3RoZXIgYml0cyBzZXQgdG8gemVybzsgIFNvbWUgd2lsbCBiZSBjaGFuZ2VkIEAgdHJhbnNmZXIgc3RhcnQuCisJdGVtcDEgPSAoRE1Sbl9ETUEgfCBETVJuX0FVVE8gfCBETVJuX1RSX1JFQUQpOwkvLyAoMjAwMDAwMThoKQorCXdyaXRlbCh0ZW1wMSwgY2FyZC0+cEJBMCArIEJBMF9ETVIwKTsJLy8gKDE1MGgpCisJdGVtcDEgPSAoRE1Sbl9ETUEgfCBETVJuX0FVVE8gfCBETVJuX1RSX1dSSVRFKTsJLy8gKDIwMDAwMDE0aCkKKwl3cml0ZWwodGVtcDEsIGNhcmQtPnBCQTAgKyBCQTBfRE1SMSk7CS8vICgxNThoKQorCisJLy8gRW5hYmxlIERNQSBpbnRlcnJ1cHRzIGdlbmVyYWxseSwgYW5kCisJLy8gRE1BMCAmIERNQTEgaW50ZXJydXB0cyBzcGVjaWZpY2FsbHkuCisJdGVtcDEgPSByZWFkbChjYXJkLT5wQkEwICsgQkEwX0hJTVIpICYgMHhmZmZiZmNmZjsKKwl3cml0ZWwodGVtcDEsIGNhcmQtPnBCQTAgKyBCQTBfSElNUik7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjczQyODFfaHdfaW5pdCgpLSAwXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKKyNpZm5kZWYgTk9UX0NTNDI4MV9QTQorc3RhdGljIHZvaWQgcHJpbnRwbShzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJwbSBzdHJ1Y3Q6XG4iKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImZsYWdzOjB4JXggdTMyQ0xLQ1IxX1NBVkU6IDAleCB1MzJTU1BNVmFsdWU6IDB4JXhcbiIsCisJCSh1bnNpZ25lZClzLT5wbS5mbGFncyxzLT5wbS51MzJDTEtDUjFfU0FWRSxzLT5wbS51MzJTU1BNVmFsdWUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyUFBMVkN2YWx1ZTogMHgleCB1MzJQUFJWQ3ZhbHVlOiAweCV4XG4iLAorCQlzLT5wbS51MzJQUExWQ3ZhbHVlLHMtPnBtLnUzMlBQUlZDdmFsdWUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRk1MVkN2YWx1ZTogMHgleCB1MzJGTVJWQ3ZhbHVlOiAweCV4XG4iLAorCQlzLT5wbS51MzJGTUxWQ3ZhbHVlLHMtPnBtLnUzMkZNUlZDdmFsdWUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyR1BJT1J2YWx1ZTogMHgleCB1MzJKU0NUTHZhbHVlOiAweCV4XG4iLAorCQlzLT5wbS51MzJHUElPUnZhbHVlLHMtPnBtLnUzMkpTQ1RMdmFsdWUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyU1NDUjogMHgleCB1MzJTUkNTQTogMHgleFxuIiwKKwkJcy0+cG0udTMyU1NDUixzLT5wbS51MzJTUkNTQSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJEYWNBU1I6IDB4JXggdTMyQWRjQVNSOiAweCV4XG4iLAorCQlzLT5wbS51MzJEYWNBU1Iscy0+cG0udTMyQWRjQVNSKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkRhY1NSOiAweCV4IHUzMkFkY1NSOiAweCV4XG4iLAorCQlzLT5wbS51MzJEYWNTUixzLT5wbS51MzJBZGNTUikpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJNSURDUl9TYXZlOiAweCV4XG4iLAorCQlzLT5wbS51MzJNSURDUl9TYXZlKSk7CisKK30KK3N0YXRpYyB2b2lkIHByaW50cGlwZShzdHJ1Y3QgY3M0MjgxX3BpcGVsaW5lICpwbCkKK3sKKworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJwbSBzdHJ1Y3Q6XG4iKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImZsYWdzOjB4JXggbnVtYmVyOiAwJXhcbiIsCisJCSh1bnNpZ25lZClwbC0+ZmxhZ3MscGwtPm51bWJlcikpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJEQkFuVmFsdWU6IDAleCB1MzJEQkNuVmFsdWU6IDB4JXhcbiIsCisJCXBsLT51MzJEQkFuVmFsdWUscGwtPnUzMkRCQ25WYWx1ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJETVJuVmFsdWU6IDB4JXggdTMyRENSblZhbHVlOiAweCV4XG4iLAorCQlwbC0+dTMyRE1SblZhbHVlLHBsLT51MzJEQ1JuVmFsdWUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyREJBbkFkZHJlc3M6IDB4JXggdTMyREJDbkFkZHJlc3M6IDB4JXhcbiIsCisJCXBsLT51MzJEQkFuQWRkcmVzcyxwbC0+dTMyREJDbkFkZHJlc3MpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRENBbkFkZHJlc3M6IDB4JXggdTMyRENDbkFkZHJlc3M6IDB4JXhcbiIsCisJCXBsLT51MzJEQ0NuQWRkcmVzcyxwbC0+dTMyRENDbkFkZHJlc3MpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRE1SbkFkZHJlc3M6IDB4JXggdTMyRENSbkFkZHJlc3M6IDB4JXhcbiIsCisJCXBsLT51MzJETVJuQWRkcmVzcyxwbC0+dTMyRENSbkFkZHJlc3MpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMySERTUm5BZGRyZXNzOiAweCV4IHUzMkRCQW5fU2F2ZTogMHgleFxuIiwKKwkJcGwtPnUzMkhEU1JuQWRkcmVzcyxwbC0+dTMyREJBbl9TYXZlKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkRCQ25fU2F2ZTogMHgleCB1MzJETVJuX1NhdmU6IDB4JXhcbiIsCisJCXBsLT51MzJEQkNuX1NhdmUscGwtPnUzMkRNUm5fU2F2ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJEQ1JuX1NhdmU6IDB4JXggdTMyRENDbl9TYXZlOiAweCV4XG4iLAorCQlwbC0+dTMyRENSbl9TYXZlLHBsLT51MzJEQ0NuX1NhdmUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRENBbl9TYXZlOiAweCV4XG4iLAorCQlwbC0+dTMyRENBbl9TYXZlKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkZDUm5fU2F2ZTogMHgleCB1MzJGU0lDbl9TYXZlOiAweCV4XG4iLAorCQlwbC0+dTMyRkNSbl9TYXZlLHBsLT51MzJGU0lDbl9TYXZlKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkZDUm5WYWx1ZTogMHgleCB1MzJGU0lDblZhbHVlOiAweCV4XG4iLAorCQlwbC0+dTMyRkNSblZhbHVlLHBsLT51MzJGU0lDblZhbHVlKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkZDUm5BZGRyZXNzOiAweCV4IHUzMkZTSUNuQWRkcmVzczogMHgleFxuIiwKKwkJcGwtPnUzMkZDUm5BZGRyZXNzLHBsLT51MzJGU0lDbkFkZHJlc3MpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRlBEUm5WYWx1ZTogMHgleCB1MzJGUERSbkFkZHJlc3M6IDB4JXhcbiIsCisJCXBsLT51MzJGUERSblZhbHVlLHBsLT51MzJGUERSbkFkZHJlc3MpKTsKK30KK3N0YXRpYyB2b2lkIHByaW50cGlwZWxpbmVzKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpCit7CisJaW50IGk7CisJZm9yKGk9MDtpPENTNDI4MV9OVU1CRVJfT0ZfUElQRUxJTkVTO2krKykKKwl7CisJCWlmKHMtPnBsW2ldLmZsYWdzICYgQ1M0MjgxX1BJUEVMSU5FX1ZBTElEKQorCQl7CisJCQlwcmludHBpcGUoJnMtPnBsW2ldKTsKKwkJfQorCX0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCisqICBTdXNwZW5kIC0gc2F2ZSB0aGUgYWM5NyByZWdzLCBtdXRlIHRoZSBvdXRwdXRzIGFuZCBwb3dlciBkb3duIHRoZSBwYXJ0LiAgCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgY3M0MjgxX2FjOTdfc3VzcGVuZChzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCWludCBDb3VudCxpOworCisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDI4MTogY3M0MjgxX2FjOTdfc3VzcGVuZCgpK1xuIikpOworLyoKKyogY2hhbmdlIHRoZSBzdGF0ZSwgc2F2ZSB0aGUgY3VycmVudCBod3B0ciwgdGhlbiBzdG9wIHRoZSBkYWMvYWRjCisqLworCXMtPnBtLmZsYWdzICY9IH5DUzQyODFfUE1fSURMRTsKKwlzLT5wbS5mbGFncyB8PSBDUzQyODFfUE1fU1VTUEVORElORzsKKwlzLT5wbS51MzJod3B0cl9wbGF5YmFjayA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfRENBMCk7CisJcy0+cG0udTMyaHdwdHJfY2FwdHVyZSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfRENBMSk7CisJc3RvcF9kYWMocyk7CisJc3RvcF9hZGMocyk7CisKKwlmb3IoQ291bnQgPSAweDIsIGk9MDsgKENvdW50IDw9IENTNDI4MV9BQzk3X0hJR0hFU1RSRUdUT1JFU1RPUkUpCisJCQkmJiAoaSA8IENTNDI4MV9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1MpOyAKKwkJQ291bnQgKz0gMiwgaSsrKQorCXsKKwkJY3M0MjgxX3JlYWRfYWM5NyhzLCBCQTBfQUM5N19SRVNFVCArIENvdW50LCAmcy0+cG0uYWM5N1tpXSk7CisJfQorLyoKKyogU2F2ZSB0aGUgYWM5NyB2b2x1bWUgcmVnaXN0ZXJzIGFzIHdlbGwgYXMgdGhlIGN1cnJlbnQgcG93ZXJkb3duIHN0YXRlLgorKiBOb3csIG11dGUgdGhlIGFsbCB0aGUgb3V0cHV0cyAobWFzdGVyLCBoZWFkcGhvbmUsIGFuZCBtb25vKSwgYXMgd2VsbAorKiBhcyB0aGUgUENNIHZvbHVtZSwgaW4gcHJlcGFyYXRpb24gZm9yIHBvd2VyaW5nIGRvd24gdGhlIGVudGlyZSBwYXJ0LgorKi8gCisJY3M0MjgxX3JlYWRfYWM5NyhzLCBCQTBfQUM5N19NQVNURVJfVk9MVU1FLCAmcy0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lKTsKKwljczQyODFfcmVhZF9hYzk3KHMsIEJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUsICZzLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUpOworCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCAmcy0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8pOworCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfUENNX09VVF9WT0xVTUUsICZzLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lKTsKKwkJCisJY3M0MjgxX3dyaXRlX2FjOTcocywgQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgMHg4MDAwKTsKKwljczQyODFfd3JpdGVfYWM5NyhzLCBCQTBfQUM5N19IRUFEUEhPTkVfVk9MVU1FLCAweDgwMDApOworCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTywgMHg4MDAwKTsKKwljczQyODFfd3JpdGVfYWM5NyhzLCBCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSwgMHg4MDAwKTsKKworCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfUE9XRVJET1dOLCAmcy0+cG0udTMyQUM5N19wb3dlcmRvd24pOworCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfR0VORVJBTF9QVVJQT1NFLCAmcy0+cG0udTMyQUM5N19nZW5lcmFsX3B1cnBvc2UpOworCisvKgorKiBBbmQgcG93ZXIgZG93biBldmVyeXRoaW5nIG9uIHRoZSBBQzk3IGNvZGVjLgorKi8KKwljczQyODFfd3JpdGVfYWM5NyhzLCBCQTBfQUM5N19QT1dFUkRPV04sIDB4ZmYwMCk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDI4MTogY3M0MjgxX2FjOTdfc3VzcGVuZCgpLVxuIikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgUmVzdW1lIC0gcG93ZXIgdXAgdGhlIHBhcnQgYW5kIHJlc3RvcmUgaXRzIHJlZ2lzdGVycy4uICAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjczQyODFfYWM5N19yZXN1bWUoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcykKK3sKKwlpbnQgQ291bnQsaTsKKworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQyODE6IGNzNDI4MV9hYzk3X3Jlc3VtZSgpK1xuIikpOworCisvKiBkbyBub3Qgc2F2ZSB0aGUgcG93ZXIgc3RhdGUgcmVnaXN0ZXJzIGF0IHRoaXMgdGltZQorICAgIC8vCisgICAgLy8gSWYgd2Ugc2F2ZWQgYXdheSB0aGUgcG93ZXIgY29udHJvbCByZWdpc3RlcnMsIHdyaXRlIHRoZW0gaW50byB0aGUKKyAgICAvLyBzaGFkb3dzIHNvIHRob3NlIHNhdmVkIHZhbHVlcyBnZXQgcmVzdG9yZWQgaW5zdGVhZCBvZiB0aGUgY3VycmVudAorICAgIC8vIHNoYWRvd2VkIHZhbHVlLgorICAgIC8vCisgICAgaWYoIGJQb3dlclN0YXRlU2F2ZWQgKQorICAgIHsKKyAgICAgICAgUG9rZVNoYWRvdyggMHgyNiwgdWxTYXZlUmVnMHgyNiApOworICAgICAgICBiUG93ZXJTdGF0ZVNhdmVkID0gRkFMU0U7CisgICAgfQorKi8KKworLy8KKy8vIEZpcnN0LCB3ZSByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiAgVGhpcworLy8gY29udGFpbnMgdGhlIG1pYyBzZWxlY3QgKG1pYzEgb3IgbWljMikgYW5kIGlmIHdlIHJlc3RvcmUgdGhpcyBhZnRlcgorLy8gd2UgcmVzdG9yZSB0aGUgbWljIHZvbHVtZS9ib29zdCBzdGF0ZSBhbmQgbWljMiB3YXMgc2VsZWN0ZWQgYXQKKy8vIHN1c3BlbmQgdGltZSwgd2Ugd2lsbCBlbmQgdXAgd2l0aCBhIGJyaWVmIHBlcmlvZCBvZiB0aW1lIHdoZXJlIG1pYzEKKy8vIGlzIHNlbGVjdGVkIHdpdGggdGhlIHZvbHVtZS9ib29zdCBzZXR0aW5ncyBmb3IgbWljMiwgY2F1c2luZworLy8gYWNvdXN0aWMgZmVlZGJhY2suICBTbyB3ZSByZXN0b3JlIHRoZSBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIKKy8vIGZpcnN0LCB0aGVyZWJ5IGdldHRpbmcgdGhlIGNvcnJlY3QgbWljIHNlbGVjdGVkIGJlZm9yZSB3ZSByZXN0b3JlCisvLyB0aGUgbWljIHZvbHVtZS9ib29zdC4KKy8vCisJY3M0MjgxX3dyaXRlX2FjOTcocywgQkEwX0FDOTdfR0VORVJBTF9QVVJQT1NFLCBzLT5wbS51MzJBQzk3X2dlbmVyYWxfcHVycG9zZSk7CisKKy8vCisvLyBOb3csIHdoaWxlIHRoZSBvdXRwdXRzIGFyZSBzdGlsbCBtdXRlZCwgcmVzdG9yZSB0aGUgc3RhdGUgb2YgcG93ZXIKKy8vIG9uIHRoZSBBQzk3IHBhcnQuCisvLworCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X1BPV0VSRE9XTiwgcy0+cG0udTMyQUM5N19wb3dlcmRvd24pOworCisvKgorKiBSZXN0b3JlIGp1c3QgdGhlIGZpcnN0IHNldCBvZiByZWdpc3RlcnMsIGZyb20gcmVnaXN0ZXIgbnVtYmVyCisqIDB4MDIgdG8gdGhlIHJlZ2lzdGVyIG51bWJlciB0aGF0IHVsSGlnaGVzdFJlZ1RvUmVzdG9yZSBzcGVjaWZpZXMuCisqLworCWZvcigJQ291bnQgPSAweDIsIGk9MDsgCisJCShDb3VudCA8PSBDUzQyODFfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFKQorCQkJJiYgKGkgPCBDUzQyODFfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTKTsgCisJCUNvdW50ICs9IDIsIGkrKykKKwl7CisJCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X1JFU0VUICsgQ291bnQsIHMtPnBtLmFjOTdbaV0pOworCX0KKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiY3M0MjgxOiBjczQyODFfYWM5N19yZXN1bWUoKS1cbiIpKTsKK30KKworLyogZG8gbm90IHNhdmUgdGhlIHBvd2VyIHN0YXRlIHJlZ2lzdGVycyBhdCB0aGlzIHRpbWUKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogIFNhdmVQb3dlclN0YXRlIC0gU2F2ZSB0aGUgcG93ZXIgcmVnaXN0ZXJzIGF3YXkuIAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgordm9pZCAKK0hXQUM5N2NvZGVjOjpTYXZlUG93ZXJTdGF0ZSh2b2lkKQoreworICAgIEVOVFJZKFRNX09CSkVDVENBTExTLCAiSFdBQzk3Y29kZWM6OlNhdmVQb3dlclN0YXRlKClcclxuIik7CisKKyAgICB1bFNhdmVSZWcweDI2ID0gUGVla1NoYWRvdygweDI2KTsKKworICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHdlIGhhdmUgc2F2ZWQgcmVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSByZXN0b3JlZCBkdXJpbmcgYQorICAgIC8vIHJlc3VtZSBpbnN0ZWFkIG9mIHVsQUM5N1JlZ3NbXS4KKyAgICAvLworICAgIGJQb3dlclN0YXRlU2F2ZWQgPSBUUlVFOworCit9IC8vIFNhdmVQb3dlclN0YXRlCisqLworCitzdGF0aWMgdm9pZCBjczQyODFfU3VzcGVuZEZJRk8oc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgc3RydWN0IGNzNDI4MV9waXBlbGluZSAqcGwpCit7CisgLyoKKyAqIFdlIG5lZWQgdG8gc2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIEJBU0lDIEZJRk8gUmVnaXN0ZXJzLgorICovCisJcGwtPnUzMkZDUm5fU2F2ZSA9IHJlYWRsKHMtPnBCQTAgKyBwbC0+dTMyRkNSbkFkZHJlc3MpOworCXBsLT51MzJGU0lDbl9TYXZlID0gcmVhZGwocy0+cEJBMCArIHBsLT51MzJGU0lDbkFkZHJlc3MpOworfQorc3RhdGljIHZvaWQgY3M0MjgxX1Jlc3VtZUZJRk8oc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgc3RydWN0IGNzNDI4MV9waXBlbGluZSAqcGwpCit7CisgLyoKKyAqIFdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgY29udGVudHMgb2YgdGhlIEJBU0lDIEZJRk8gUmVnaXN0ZXJzLgorICovCisJd3JpdGVsKHBsLT51MzJGQ1JuX1NhdmUscy0+cEJBMCArIHBsLT51MzJGQ1JuQWRkcmVzcyk7CisJd3JpdGVsKHBsLT51MzJGU0lDbl9TYXZlLHMtPnBCQTAgKyBwbC0+dTMyRlNJQ25BZGRyZXNzKTsKK30KK3N0YXRpYyB2b2lkIGNzNDI4MV9TdXNwZW5kRE1BZW5naW5lKHN0cnVjdCBjczQyODFfc3RhdGUgKnMsIHN0cnVjdCBjczQyODFfcGlwZWxpbmUgKnBsKQoreworCS8vCisJLy8gV2UgbmVlZCB0byBzYXZlIHRoZSBjb250ZW50cyBvZiB0aGUgQkFTSUMgRE1BIFJlZ2lzdGVycy4KKwkvLworCXBsLT51MzJEQkFuX1NhdmUgPSByZWFkbChzLT5wQkEwICsgcGwtPnUzMkRCQW5BZGRyZXNzKTsKKwlwbC0+dTMyREJDbl9TYXZlID0gcmVhZGwocy0+cEJBMCArIHBsLT51MzJEQkNuQWRkcmVzcyk7CisJcGwtPnUzMkRNUm5fU2F2ZSA9IHJlYWRsKHMtPnBCQTAgKyBwbC0+dTMyRE1SbkFkZHJlc3MpOworCXBsLT51MzJEQ1JuX1NhdmUgPSByZWFkbChzLT5wQkEwICsgcGwtPnUzMkRDUm5BZGRyZXNzKTsKKwlwbC0+dTMyRENDbl9TYXZlID0gcmVhZGwocy0+cEJBMCArIHBsLT51MzJEQ0NuQWRkcmVzcyk7CisJcGwtPnUzMkRDQW5fU2F2ZSA9IHJlYWRsKHMtPnBCQTAgKyBwbC0+dTMyRENBbkFkZHJlc3MpOworfQorc3RhdGljIHZvaWQgY3M0MjgxX1Jlc3VtZURNQWVuZ2luZShzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzLCBzdHJ1Y3QgY3M0MjgxX3BpcGVsaW5lICpwbCkKK3sKKwkvLworCS8vIFdlIG5lZWQgdG8gc2F2ZSB0aGUgY29udGVudHMgb2YgdGhlIEJBU0lDIERNQSBSZWdpc3RlcnMuCisJLy8KKwl3cml0ZWwoIHBsLT51MzJEQkFuX1NhdmUsIHMtPnBCQTAgKyBwbC0+dTMyREJBbkFkZHJlc3MpOworCXdyaXRlbCggcGwtPnUzMkRCQ25fU2F2ZSwgcy0+cEJBMCArIHBsLT51MzJEQkNuQWRkcmVzcyk7CisJd3JpdGVsKCBwbC0+dTMyRE1Sbl9TYXZlLCBzLT5wQkEwICsgcGwtPnUzMkRNUm5BZGRyZXNzKTsKKwl3cml0ZWwoIHBsLT51MzJEQ1JuX1NhdmUsIHMtPnBCQTAgKyBwbC0+dTMyRENSbkFkZHJlc3MpOworCXdyaXRlbCggcGwtPnUzMkRDQ25fU2F2ZSwgcy0+cEJBMCArIHBsLT51MzJEQ0NuQWRkcmVzcyk7CisJd3JpdGVsKCBwbC0+dTMyRENBbl9TYXZlLCBzLT5wQkEwICsgcGwtPnUzMkRDQW5BZGRyZXNzKTsKK30KKworc3RhdGljIGludCBjczQyODFfc3VzcGVuZChzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCWludCBpOworCXUzMiB1MzJDTEtDUjE7CisJc3RydWN0IGNzNDI4MV9wbSAqcG0gPSAmcy0+cG07CisJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDksIAorCQlwcmludGsoImNzNDI4MTogY3M0MjgxX3N1c3BlbmQoKSsgZmxhZ3M9JWRcbiIsCisJCQkodW5zaWduZWQpcy0+cG0uZmxhZ3MpKTsKKy8qCisqIGNoZWNrIHRoZSBjdXJyZW50IHN0YXRlLCBvbmx5IHN1c3BlbmQgaWYgSURMRQorKi8KKwlpZighKHMtPnBtLmZsYWdzICYgQ1M0MjgxX1BNX0lETEUpKQorCXsKKwkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDIsIAorCQkJcHJpbnRrKCJjczQyODE6IGNzNDI4MV9zdXNwZW5kKCkgdW5hYmxlIHRvIHN1c3BlbmQsIG5vdCBJRExFXG4iKSk7CisJCXJldHVybiAxOworCX0KKwlzLT5wbS5mbGFncyAmPSB+Q1M0MjgxX1BNX0lETEU7CisJcy0+cG0uZmxhZ3MgfD0gQ1M0MjgxX1BNX1NVU1BFTkRJTkc7CisKKy8vCisvLyBHZXJzaHdpbiBDTEtSVU4gLSBTZXQgQ0tSQQorLy8KKwl1MzJDTEtDUjEgPSByZWFkbChzLT5wQkEwICsgQkEwX0NMS0NSMSk7CisKKwlwbS0+dTMyQ0xLQ1IxX1NBVkUgPSB1MzJDTEtDUjE7CisJaWYoISh1MzJDTEtDUjEgJiAweDAwMDEwMDAwICkgKQorCQl3cml0ZWwodTMyQ0xLQ1IxIHwgMHgwMDAxMDAwMCwgcy0+cEJBMCArIEJBMF9DTEtDUjEpOworCisvLworLy8gRmlyc3QsIHR1cm4gb24gdGhlIGNsb2NrcyAoeWlrZXMpIHRvIHRoZSBkZXZpY2VzLCBzbyB0aGF0IHRoZXkgd2lsbAorLy8gcmVzcG9uZCB3aGVuIHdlIHRyeSB0byBzYXZlIHRoZWlyIHN0YXRlLgorLy8KKwlpZighKHUzMkNMS0NSMSAmIENMS0NSMV9TV0NFKSkKKwl7CisJCXdyaXRlbCh1MzJDTEtDUjEgfCBDTEtDUjFfU1dDRSAsIHMtPnBCQTAgKyBCQTBfQ0xLQ1IxKTsKKwl9CisgICAgCisJLy8KKwkvLyBTYXZlIHRoZSBwb3dlciBzdGF0ZQorCS8vCisJcG0tPnUzMlNTUE1WYWx1ZSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfU1NQTSk7CisKKwkvLworCS8vIERpc2FibGUgaW50ZXJydXB0cy4KKwkvLworCXdyaXRlbChISUNSX0NIR00sIHMtPnBCQTAgKyBCQTBfSElDUik7CisKKwkvLworCS8vIFNhdmUgdGhlIFBDTSBQbGF5YmFjayBMZWZ0IGFuZCBSaWdodCBWb2x1bWUgQ29udHJvbC4KKwkvLworCXBtLT51MzJQUExWQ3ZhbHVlID0gcmVhZGwocy0+cEJBMCArIEJBMF9QUExWQyk7CisJcG0tPnUzMlBQUlZDdmFsdWUgPSByZWFkbChzLT5wQkEwICsgQkEwX1BQUlZDKTsKKworCS8vCisJLy8gU2F2ZSB0aGUgRk0gU3ludGhlc2lzIExlZnQgYW5kIFJpZ2h0IFZvbHVtZSBDb250cm9sLgorCS8vCisJcG0tPnUzMkZNTFZDdmFsdWUgPSByZWFkbChzLT5wQkEwICsgQkEwX0ZNTFZDKTsKKwlwbS0+dTMyRk1SVkN2YWx1ZSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfRk1SVkMpOworCisJLy8KKwkvLyBTYXZlIHRoZSBHUElPUiB2YWx1ZS4KKwkvLworCXBtLT51MzJHUElPUnZhbHVlID0gcmVhZGwocy0+cEJBMCArIEJBMF9HUElPUik7CisKKwkvLworCS8vIFNhdmUgdGhlIEpTQ1RMIHZhbHVlLgorCS8vCisJcG0tPnUzMkpTQ1RMdmFsdWUgPSByZWFkbChzLT5wQkEwICsgQkEwX0dQSU9SKTsKKworCS8vCisJLy8gU2F2ZSBTb3VuZCBTeXN0ZW0gQ29udHJvbCBSZWdpc3RlcgorCS8vCisJcG0tPnUzMlNTQ1IgPSByZWFkbChzLT5wQkEwICsgQkEwX1NTQ1IpOworCisJLy8KKwkvLyBTYXZlIFNSQyBTbG90IEFzc2lubWVudCByZWdpc3RlcgorCS8vCisJcG0tPnUzMlNSQ1NBID0gcmVhZGwocy0+cEJBMCArIEJBMF9TUkNTQSk7CisKKwkvLworCS8vIFNhdmUgc2FtcGxlIHJhdGUKKwkvLworCXBtLT51MzJEYWNBU1IgPSByZWFkbChzLT5wQkEwICsgQkEwX1BBU1IpOworCXBtLT51MzJBZGNBU1IgPSByZWFkbChzLT5wQkEwICsgQkEwX0NBU1IpOworCXBtLT51MzJEYWNTUiA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfREFDU1IpOworCXBtLT51MzJBZGNTUiA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfQURDU1IpOworCisJLy8KKwkvLyBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBQaXBlTGluZXMgCisJLy8KKwlmb3IoaSA9IDA7IGkgPCBDUzQyODFfTlVNQkVSX09GX1BJUEVMSU5FUzsgaSsrKQorICAgICAgICB7CisJCWlmKHMtPnBsW2ldLmZsYWdzICYgQ1M0MjgxX1BJUEVMSU5FX1ZBTElEKQorCQl7CisJCS8vCisJCS8vIEFzayB0aGUgRE1BZW5naW5lcyBhbmQgRklGT3MgdG8gU3VzcGVuZC4KKwkJLy8KKwkJCWNzNDI4MV9TdXNwZW5kRE1BZW5naW5lKHMsJnMtPnBsW2ldKTsKKwkJCWNzNDI4MV9TdXNwZW5kRklGTyhzLCZzLT5wbFtpXSk7CisJCX0KKwl9CisJLy8KKwkvLyBXZSBuZWVkIHRvIHNhdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNaWRpIENvbnRyb2wgUmVnaXN0ZXIuCisJLy8KKwlwbS0+dTMyTUlEQ1JfU2F2ZSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfTUlEQ1IpOworLyoKKyogc2F2ZSBvZmYgdGhlIEFDOTcgcGFydCBpbmZvcm1hdGlvbgorKi8KKwljczQyODFfYWM5N19zdXNwZW5kKHMpOworICAgIAorCS8vCisJLy8gVHVybiBvZmYgdGhlIHNlcmlhbCBwb3J0cy4KKwkvLworCXdyaXRlbCgwLCBzLT5wQkEwICsgQkEwX1NFUk1DKTsKKworCS8vCisJLy8gUG93ZXIgb2ZmIEZNLCBKb3lzdGljaywgQUMgbGluaywgCisJLy8KKwl3cml0ZWwoMCwgcy0+cEJBMCArIEJBMF9TU1BNKTsKKworCS8vCisJLy8gRExMIG9mZi4KKwkvLworCXdyaXRlbCgwLCBzLT5wQkEwICsgQkEwX0NMS0NSMSk7CisKKwkvLworCS8vIEFDIGxpbmsgb2ZmLgorCS8vCisJd3JpdGVsKDAsIHMtPnBCQTAgKyBCQTBfU1BNQyk7CisKKwkvLworCS8vIFB1dCB0aGUgY2hpcCBpbnRvIEQzKGhvdCkgc3RhdGUuCisJLy8KKwkvLyBQb2tlQkEwKEJBMF9QTUNTLCAweDAwMDAwMDAzKTsKKworCS8vCisJLy8gR2Vyc2h3aW4gQ0xLUlVOIC0gQ2xlYXIgQ0tSQQorCS8vCisJdTMyQ0xLQ1IxID0gcmVhZGwocy0+cEJBMCArIEJBMF9DTEtDUjEpOworCXdyaXRlbCh1MzJDTEtDUjEgJiAweEZGRkVGRkZGLCBzLT5wQkEwICsgQkEwX0NMS0NSMSk7CisKKyNpZmRlZiBDU0RFQlVHCisJcHJpbnRwbShzKTsKKwlwcmludHBpcGVsaW5lcyhzKTsKKyNlbmRpZgorCisJcy0+cG0uZmxhZ3MgJj0gfkNTNDI4MV9QTV9TVVNQRU5ESU5HOworCXMtPnBtLmZsYWdzIHw9IENTNDI4MV9QTV9TVVNQRU5ERUQ7CisKKwlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgOSwgCisJCXByaW50aygiY3M0MjgxOiBjczQyODFfc3VzcGVuZCgpLSBmbGFncz0lZFxuIiwKKwkJCSh1bnNpZ25lZClzLT5wbS5mbGFncykpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzNDI4MV9yZXN1bWUoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcykKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCB0ZW1wMTsKKwl1MzIgdTMyQ0xLQ1IxOworCXN0cnVjdCBjczQyODFfcG0gKnBtID0gJnMtPnBtOworCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKKwkJcHJpbnRrKCAiY3M0MjgxOiBjczQyODFfcmVzdW1lKCkrIGZsYWdzPSVkXG4iLAorCQkJKHVuc2lnbmVkKXMtPnBtLmZsYWdzKSk7CisJaWYoIShzLT5wbS5mbGFncyAmIENTNDI4MV9QTV9TVVNQRU5ERUQpKQorCXsKKwkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDIsIAorCQkJcHJpbnRrKCJjczQyODE6IGNzNDI4MV9yZXN1bWUoKSB1bmFibGUgdG8gcmVzdW1lLCBub3QgU1VTUEVOREVEXG4iKSk7CisJCXJldHVybiAxOworCX0KKwlzLT5wbS5mbGFncyAmPSB+Q1M0MjgxX1BNX1NVU1BFTkRFRDsKKwlzLT5wbS5mbGFncyB8PSBDUzQyODFfUE1fUkVTVU1JTkc7CisKKy8vCisvLyBHZXJzaHdpbiBDTEtSVU4gLSBTZXQgQ0tSQQorLy8KKwl1MzJDTEtDUjEgPSByZWFkbChzLT5wQkEwICsgQkEwX0NMS0NSMSk7CisJd3JpdGVsKHUzMkNMS0NSMSB8IDB4MDAwMTAwMDAsIHMtPnBCQTAgKyBCQTBfQ0xLQ1IxKTsKKworCS8vCisJLy8gc2V0IHRoZSBwb3dlciBzdGF0ZS4KKwkvLworCS8vb2xkIFBva2VCQTAoQkEwX1BNQ1MsIDApOworCisJLy8KKwkvLyBQcm9ncmFtIHRoZSBjbG9jayBjaXJjdWl0IGFuZCBzZXJpYWwgcG9ydHMuCisJLy8KKwl0ZW1wMSA9IGNzNDI4MV9od19pbml0KHMpOworCWlmICh0ZW1wMSkgeworCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLAorCQkgICAgcHJpbnRrKEtFUk5fRVJSCisJCQkiY3M0MjgxOiByZXN1bWUgY3M0MjgxX2h3X2luaXQoKSBlcnJvci5cbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8vCisJLy8gcmVzdG9yZSB0aGUgUG93ZXIgc3RhdGUKKwkvLworCXdyaXRlbChwbS0+dTMyU1NQTVZhbHVlLCBzLT5wQkEwICsgQkEwX1NTUE0pOworCisJLy8KKwkvLyBTZXQgcG9zdCBTUkMgbWl4IHNldHRpbmcgKEZNIG9yIEFMVDQ4SykKKwkvLworCXdyaXRlbChwbS0+dTMyU1NQTV9CSVRTLCBzLT5wQkEwICsgQkEwX1NTUE0pOworCisJLy8KKwkvLyBMb29wIHRocm91Z2ggYWxsIG9mIHRoZSBQaXBlTGluZXMgCisJLy8KKwlmb3IoaSA9IDA7IGkgPCBDUzQyODFfTlVNQkVSX09GX1BJUEVMSU5FUzsgaSsrKQorICAgICAgICB7CisJCWlmKHMtPnBsW2ldLmZsYWdzICYgQ1M0MjgxX1BJUEVMSU5FX1ZBTElEKQorCQl7CisJCS8vCisJCS8vIEFzayB0aGUgRE1BZW5naW5lcyBhbmQgRklGT3MgdG8gUmVzdW1lLgorCQkvLworCQkJY3M0MjgxX1Jlc3VtZURNQWVuZ2luZShzLCZzLT5wbFtpXSk7CisJCQljczQyODFfUmVzdW1lRklGTyhzLCZzLT5wbFtpXSk7CisJCX0KKwl9CisJLy8KKwkvLyBXZSBuZWVkIHRvIHJlc3RvcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBNaWRpIENvbnRyb2wgUmVnaXN0ZXIuCisJLy8KKwl3cml0ZWwocG0tPnUzMk1JRENSX1NhdmUsIHMtPnBCQTAgKyBCQTBfTUlEQ1IpOworCisJY3M0MjgxX2FjOTdfcmVzdW1lKHMpOworCS8vCisJLy8gUmVzdG9yZSB0aGUgUENNIFBsYXliYWNrIExlZnQgYW5kIFJpZ2h0IFZvbHVtZSBDb250cm9sLgorCS8vCisJd3JpdGVsKHBtLT51MzJQUExWQ3ZhbHVlLCBzLT5wQkEwICsgQkEwX1BQTFZDKTsKKwl3cml0ZWwocG0tPnUzMlBQUlZDdmFsdWUsIHMtPnBCQTAgKyBCQTBfUFBSVkMpOworCisJLy8KKwkvLyBSZXN0b3JlIHRoZSBGTSBTeW50aGVzaXMgTGVmdCBhbmQgUmlnaHQgVm9sdW1lIENvbnRyb2wuCisJLy8KKwl3cml0ZWwocG0tPnUzMkZNTFZDdmFsdWUsIHMtPnBCQTAgKyBCQTBfRk1MVkMpOworCXdyaXRlbChwbS0+dTMyRk1SVkN2YWx1ZSwgcy0+cEJBMCArIEJBMF9GTVJWQyk7CisKKwkvLworCS8vIFJlc3RvcmUgdGhlIEpTQ1RMIHZhbHVlLgorCS8vCisJd3JpdGVsKHBtLT51MzJKU0NUTHZhbHVlLCBzLT5wQkEwICsgQkEwX0pTQ1RMKTsKKworCS8vCisJLy8gUmVzdG9yZSB0aGUgR1BJT1IgcmVnaXN0ZXIgdmFsdWUuCisJLy8KKwl3cml0ZWwocG0tPnUzMkdQSU9SdmFsdWUsIHMtPnBCQTAgKyBCQTBfR1BJT1IpOworCisJLy8KKwkvLyBSZXN0b3JlIFNvdW5kIFN5c3RlbSBDb250cm9sIFJlZ2lzdGVyCisJLy8KKwl3cml0ZWwocG0tPnUzMlNTQ1IsIHMtPnBCQTAgKyBCQTBfU1NDUik7CisKKwkvLworCS8vIFJlc3RvcmUgU1JDIFNsb3QgQXNzaWdubWVudCByZWdpc3RlcgorCS8vCisJd3JpdGVsKHBtLT51MzJTUkNTQSwgcy0+cEJBMCArIEJBMF9TUkNTQSk7CisKKwkvLworCS8vIFJlc3RvcmUgc2FtcGxlIHJhdGUKKwkvLworCXdyaXRlbChwbS0+dTMyRGFjQVNSLCBzLT5wQkEwICsgQkEwX1BBU1IpOworCXdyaXRlbChwbS0+dTMyQWRjQVNSLCBzLT5wQkEwICsgQkEwX0NBU1IpOworCXdyaXRlbChwbS0+dTMyRGFjU1IsIHMtPnBCQTAgKyBCQTBfREFDU1IpOworCXdyaXRlbChwbS0+dTMyQWRjU1IsIHMtPnBCQTAgKyBCQTBfQURDU1IpOworCisJLy8gCisJLy8gUmVzdG9yZSBDRkwxLzIgcmVnaXN0ZXJzIHdlIHNhdmVkIHRvIGNvbXBlbnNhdGUgZm9yIE9FTSBidWdzLgorCS8vCisJLy8JUG9rZUJBMChCQTBfQ0ZMUiwgdWxDb25maWcpOworCisJLy8KKwkvLyBHZXJzaHdpbiBDTEtSVU4gLSBDbGVhciBDS1JBCisJLy8KKwl3cml0ZWwocG0tPnUzMkNMS0NSMV9TQVZFLCBzLT5wQkEwICsgQkEwX0NMS0NSMSk7CisKKwkvLworCS8vIEVuYWJsZSBpbnRlcnJ1cHRzIG9uIHRoZSBwYXJ0LgorCS8vCisJd3JpdGVsKEhJQ1JfSUVWIHwgSElDUl9DSEdNLCBzLT5wQkEwICsgQkEwX0hJQ1IpOworCisjaWZkZWYgQ1NERUJVRworCXByaW50cG0ocyk7CisJcHJpbnRwaXBlbGluZXMocyk7CisjZW5kaWYKKy8qCisqIGNoYW5nZSB0aGUgc3RhdGUsIHJlc3RvcmUgdGhlIGN1cnJlbnQgaHdwdHJzLCB0aGVuIHN0b3AgdGhlIGRhYy9hZGMKKyovCisJcy0+cG0uZmxhZ3MgfD0gQ1M0MjgxX1BNX0lETEU7CisJcy0+cG0uZmxhZ3MgJj0gfihDUzQyODFfUE1fU1VTUEVORElORyB8IENTNDI4MV9QTV9TVVNQRU5ERUQgCisJCQl8IENTNDI4MV9QTV9SRVNVTUlORyB8IENTNDI4MV9QTV9SRVNVTUVEKTsKKworCXdyaXRlbChzLT5wbS51MzJod3B0cl9wbGF5YmFjaywgcy0+cEJBMCArIEJBMF9EQ0EwKTsKKwl3cml0ZWwocy0+cG0udTMyaHdwdHJfY2FwdHVyZSwgcy0+cEJBMCArIEJBMF9EQ0ExKTsKKwlzdGFydF9kYWMocyk7CisJc3RhcnRfYWRjKHMpOworCisJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDksIHByaW50aygiY3M0MjgxOiBjczQyODFfcmVzdW1lKCktIGZsYWdzPSVkXG4iLAorCQkodW5zaWduZWQpcy0+cG0uZmxhZ3MpKTsKKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAiY3M0MjgxX3BsYXlfcmF0ZSgpIiAtLQorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK3N0YXRpYyB2b2lkIGNzNDI4MV9wbGF5X3JhdGUoc3RydWN0IGNzNDI4MV9zdGF0ZSAqY2FyZCwgdTMyIHBsYXlyYXRlKQoreworCXUzMiBEQUNTUnZhbHVlID0gMTsKKworCS8vIEJhc2VkIG9uIHRoZSBzYW1wbGUgcmF0ZSwgcHJvZ3JhbSB0aGUgREFDU1IgcmVnaXN0ZXIuCisJaWYgKHBsYXlyYXRlID09IDgwMDApCisJCURBQ1NSdmFsdWUgPSA1OworCWlmIChwbGF5cmF0ZSA9PSAxMTAyNSkKKwkJREFDU1J2YWx1ZSA9IDQ7CisJZWxzZSBpZiAocGxheXJhdGUgPT0gMjIwNTApCisJCURBQ1NSdmFsdWUgPSAyOworCWVsc2UgaWYgKHBsYXlyYXRlID09IDQ0MTAwKQorCQlEQUNTUnZhbHVlID0gMTsKKwllbHNlIGlmICgocGxheXJhdGUgPD0gNDgwMDApICYmIChwbGF5cmF0ZSA+PSA2MDIzKSkKKwkJREFDU1J2YWx1ZSA9IDI0NTc2MDAwIC8gKHBsYXlyYXRlICogMTYpOworCWVsc2UgaWYgKHBsYXlyYXRlIDwgNjAyMykKKwkJLy8gTm90IGFsbG93ZWQgYnkgb3Blbi4KKwkJcmV0dXJuOworCWVsc2UgaWYgKHBsYXlyYXRlID4gNDgwMDApCisJCS8vIE5vdCBhbGxvd2VkIGJ5IG9wZW4uCisJCXJldHVybjsKKwlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSB8IENTX1BBUk1TLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQyODE6IGNzNDI4MV9wbGF5X3JhdGUoKTogREFDU1J2YWx1ZT0weCUuOHggcGxheXJhdGU9JWRcbiIsCisJCQlEQUNTUnZhbHVlLCBwbGF5cmF0ZSkpOworCS8vICBXcml0ZSB0aGUgJ3NhbXBsZSByYXRlIHNlbGVjdCBjb2RlJworCS8vICB0byB0aGUgJ0RBQyBTYW1wbGUgUmF0ZScgcmVnaXN0ZXIuCisJd3JpdGVsKERBQ1NSdmFsdWUsIGNhcmQtPnBCQTAgKyBCQTBfREFDU1IpOwkvLyAoNzQ0aCkKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICJjczQyODFfcmVjb3JkX3JhdGUoKSIgLS0gSW5pdGlhbGl6ZSB0aGUgcmVjb3JkIHNhbXBsZSByYXRlIGNvbnZlcnRlci4KKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZCBjczQyODFfcmVjb3JkX3JhdGUoc3RydWN0IGNzNDI4MV9zdGF0ZSAqY2FyZCwgdTMyIG91dHJhdGUpCit7CisJdTMyIEFEQ1NSdmFsdWUgPSAxOworCisJLy8KKwkvLyBCYXNlZCBvbiB0aGUgc2FtcGxlIHJhdGUsIHByb2dyYW0gdGhlIEFEQ1NSIHJlZ2lzdGVyCisJLy8KKwlpZiAob3V0cmF0ZSA9PSA4MDAwKQorCQlBRENTUnZhbHVlID0gNTsKKwlpZiAob3V0cmF0ZSA9PSAxMTAyNSkKKwkJQURDU1J2YWx1ZSA9IDQ7CisJZWxzZSBpZiAob3V0cmF0ZSA9PSAyMjA1MCkKKwkJQURDU1J2YWx1ZSA9IDI7CisJZWxzZSBpZiAob3V0cmF0ZSA9PSA0NDEwMCkKKwkJQURDU1J2YWx1ZSA9IDE7CisJZWxzZSBpZiAoKG91dHJhdGUgPD0gNDgwMDApICYmIChvdXRyYXRlID49IDYwMjMpKQorCQlBRENTUnZhbHVlID0gMjQ1NzYwMDAgLyAob3V0cmF0ZSAqIDE2KTsKKwllbHNlIGlmIChvdXRyYXRlIDwgNjAyMykgeworCQkvLyBOb3QgYWxsb3dlZCBieSBvcGVuLgorCQlyZXR1cm47CisJfSBlbHNlIGlmIChvdXRyYXRlID4gNDgwMDApIHsKKwkJLy8gTm90IGFsbG93ZWQgYnkgb3Blbi4KKwkJcmV0dXJuOworCX0KKwlDU19EQkdPVVQoQ1NfV0FWRV9SRUFEIHwgQ1NfUEFSTVMsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJImNzNDI4MTogY3M0MjgxX3JlY29yZF9yYXRlKCk6IEFEQ1NSdmFsdWU9MHglLjh4IG91dHJhdGU9JWRcbiIsCisJCQlBRENTUnZhbHVlLCBvdXRyYXRlKSk7CisJLy8gIFdyaXRlIHRoZSAnc2FtcGxlIHJhdGUgc2VsZWN0IGNvZGUKKwkvLyAgdG8gdGhlICdBREMgU2FtcGxlIFJhdGUnIHJlZ2lzdGVyLgorCXdyaXRlbChBRENTUnZhbHVlLCBjYXJkLT5wQkEwICsgQkEwX0FEQ1NSKTsJLy8gKDc0OGgpCit9CisKKworCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgdGVtcDE7CisKKwlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSwgMywgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBzdG9wX2RhYygpOlxuIikpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+ZW5hICY9IH5GTU9ERV9XUklURTsKKwl0ZW1wMSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfRENSMCkgfCBEQ1JuX01TSzsKKwl3cml0ZWwodGVtcDEsIHMtPnBCQTAgKyBCQTBfRENSMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCB0ZW1wMTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBzdGFydF9kYWMoKStcbiIpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPmVuYSAmIEZNT0RFX1dSSVRFKSAmJiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwKKwkJCQkJKHMtPmRtYV9kYWMuY291bnQgPiAwCisJICAgIAkJCQkmJiBzLT5kbWFfZGFjLnJlYWR5KSkKKyNpZm5kZWYgTk9UX0NTNDI4MV9QTQorCSYmIChzLT5wbS5mbGFncyAmIENTNDI4MV9QTV9JRExFKSkKKyNlbHNlCispCisjZW5kaWYKKyB7CisJCXMtPmVuYSB8PSBGTU9ERV9XUklURTsKKwkJdGVtcDEgPSByZWFkbChzLT5wQkEwICsgQkEwX0RDUjApICYgfkRDUm5fTVNLOwkvLyBDbGVhciBETUEwIGNoYW5uZWwgbWFzay4KKwkJd3JpdGVsKHRlbXAxLCBzLT5wQkEwICsgQkEwX0RDUjApOwkvLyBTdGFydCBETUEnaW5nLgorCQl3cml0ZWwoSElDUl9JRVYgfCBISUNSX0NIR00sIHMtPnBCQTAgKyBCQTBfSElDUik7CS8vIEVuYWJsZSBpbnRlcnJ1cHRzLiAgICAgICAgICAgICAgCisKKwkJd3JpdGVsKDcsIHMtPnBCQTAgKyBCQTBfUFBSVkMpOworCQl3cml0ZWwoNywgcy0+cEJBMCArIEJBMF9QUExWQyk7CisJCUNTX0RCR09VVChDU19XQVZFX1dSSVRFIHwgQ1NfUEFSTVMsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyODE6IHN0YXJ0X2RhYygpOiB3cml0ZWwgMHgleCBzdGFydCBkbWFcbiIsIHRlbXAxKSk7CisKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IHN0YXJ0X2RhYygpLVxuIikpOworfQorCisKK3N0YXRpYyB2b2lkIHN0b3BfYWRjKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCB0ZW1wMTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IHN0b3BfYWRjKCkrXG4iKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmVuYSAmPSB+Rk1PREVfUkVBRDsKKworCWlmIChzLT5jb252ZXJzaW9uID09IDEpIHsKKwkJcy0+Y29udmVyc2lvbiA9IDA7CisJCXMtPnByb3BfYWRjLmZtdCA9IHMtPnByb3BfYWRjLmZtdF9vcmlnaW5hbDsKKwl9CisJdGVtcDEgPSByZWFkbChzLT5wQkEwICsgQkEwX0RDUjEpIHwgRENSbl9NU0s7CisJd3JpdGVsKHRlbXAxLCBzLT5wQkEwICsgQkEwX0RDUjEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDMsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBzdG9wX2FkYygpLVxuIikpOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgdGVtcDE7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBzdGFydF9hZGMoKStcbiIpKTsKKworCWlmICghKHMtPmVuYSAmIEZNT0RFX1JFQUQpICYmCisJICAgIChzLT5kbWFfYWRjLm1hcHBlZCB8fCBzLT5kbWFfYWRjLmNvdW50IDw9CisJICAgICAoc2lnbmVkKSAocy0+ZG1hX2FkYy5kbWFzaXplIC0gMiAqIHMtPmRtYV9hZGMuZnJhZ3NpemUpKQorCSAgICAmJiBzLT5kbWFfYWRjLnJlYWR5CisjaWZuZGVmIE5PVF9DUzQyODFfUE0KKwkmJiAocy0+cG0uZmxhZ3MgJiBDUzQyODFfUE1fSURMRSkpCisjZWxzZQorKSAKKyNlbmRpZgorCXsKKwkJaWYgKHMtPnByb3BfYWRjLmZtdCAmIEFGTVRfUzggfHwgcy0+cHJvcF9hZGMuZm10ICYgQUZNVF9VOCkgeworCQkJLy8gCisJCQkvLyBub3cgb25seSB1c2UgMTYgYml0IGNhcHR1cmUsIGR1ZSB0byB0cnVuY2F0aW9uIGlzc3VlCisJCQkvLyBpbiB0aGUgY2hpcCwgbm90aWNhYmxlIGRpc3RvcnRpb24gb2NjdXJzLgorCQkJLy8gYWxsb2NhdGUgYnVmZmVyIGFuZCB0aGVuIGNvbnZlcnQgZnJvbSAxNiBiaXQgdG8gCisJCQkvLyA4IGJpdCBmb3IgdGhlIHVzZXIgYnVmZmVyLgorCQkJLy8KKwkJCXMtPnByb3BfYWRjLmZtdF9vcmlnaW5hbCA9IHMtPnByb3BfYWRjLmZtdDsKKwkJCWlmIChzLT5wcm9wX2FkYy5mbXQgJiBBRk1UX1M4KSB7CisJCQkJcy0+cHJvcF9hZGMuZm10ICY9IH5BRk1UX1M4OworCQkJCXMtPnByb3BfYWRjLmZtdCB8PSBBRk1UX1MxNl9MRTsKKwkJCX0KKwkJCWlmIChzLT5wcm9wX2FkYy5mbXQgJiBBRk1UX1U4KSB7CisJCQkJcy0+cHJvcF9hZGMuZm10ICY9IH5BRk1UX1U4OworCQkJCXMtPnByb3BfYWRjLmZtdCB8PSBBRk1UX1UxNl9MRTsKKwkJCX0KKwkJCS8vCisJCQkvLyBwcm9nX2RtYWJ1Zl9hZGMgcGVyZm9ybXMgYSBzdG9wX2FkYygpIGJ1dCB0aGF0IGlzCisJCQkvLyBvayBzaW5jZSB3ZSByZWFsbHkgaGF2ZW4ndCBzdGFydGVkIHRoZSBETUEgeWV0LgorCQkJLy8KKwkJCXByb2dfY29kZWMocywgQ1NfVFlQRV9BREMpOworCisJCQlpZiAocHJvZ19kbWFidWZfYWRjKHMpICE9IDApIHsKKwkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCQkJICJjczQyODE6IHN0YXJ0X2FkYygpOiBlcnJvciBpbiBwcm9nX2RtYWJ1Zl9hZGNcbiIpKTsKKwkJCX0KKwkJCXMtPmNvbnZlcnNpb24gPSAxOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmVuYSB8PSBGTU9ERV9SRUFEOworCQl0ZW1wMSA9IHJlYWRsKHMtPnBCQTAgKyBCQTBfRENSMSkgJiB+RENSbl9NU0s7CS8vIENsZWFyIERNQTEgY2hhbm5lbCBtYXNrIGJpdC4KKwkJd3JpdGVsKHRlbXAxLCBzLT5wQkEwICsgQkEwX0RDUjEpOwkvLyBTdGFydCByZWNvcmRpbmcKKwkJd3JpdGVsKEhJQ1JfSUVWIHwgSElDUl9DSEdNLCBzLT5wQkEwICsgQkEwX0hJQ1IpOwkvLyBFbmFibGUgaW50ZXJydXB0cy4KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJCUNTX0RCR09VVChDU19QQVJNUywgNiwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyODE6IHN0YXJ0X2FkYygpOiB3cml0ZWwgMHgleCBcbiIsIHRlbXAxKSk7CisJfQorCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IHN0YXJ0X2FkYygpLVxuIikpOworCit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisjZGVmaW5lIERNQUJVRl9NSU5PUkRFUiAxCS8vID09PiBtaW4gYnVmZmVyIHNpemUgPSA4Sy4KKworCitzdGF0aWMgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlzdHJ1Y3QgcGFnZSAqbWFwLCAqbWFwZW5kOworCisJaWYgKGRiLT5yYXdidWYpIHsKKwkJLy8gVW5kbyBwcm9nX2RtYWJ1ZigpJ3MgbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgCisJCW1hcGVuZCA9CisJCSAgICB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtCisJCQkJIDEpOworCQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChtYXApOworCQlmcmVlX2RtYWJ1ZihzLCBkYik7CisJfQorCWlmIChzLT50bXBidWZmICYmIChkYi0+dHlwZSA9PSBDU19UWVBFX0FEQykpIHsKKwkJLy8gVW5kbyBwcm9nX2RtYWJ1ZigpJ3MgbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgCisJCW1hcGVuZCA9CisJCSAgICB2aXJ0X3RvX3BhZ2Uocy0+dG1wYnVmZiArCisJCQkJIChQQUdFX1NJWkUgPDwgcy0+YnVmb3JkZXJfdG1wYnVmZikgLSAxKTsKKwkJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2Uocy0+dG1wYnVmZik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQorCQkJQ2xlYXJQYWdlUmVzZXJ2ZWQobWFwKTsKKwkJZnJlZV9kbWFidWYyKHMsIGRiKTsKKwl9CisJcy0+dG1wYnVmZiA9IE5VTEw7CisJZGItPnJhd2J1ZiA9IE5VTEw7CisJZGItPm1hcHBlZCA9IGRiLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIpCit7CisJaW50IG9yZGVyOworCXVuc2lnbmVkIGJ5dGVzcGVyc2VjLCB0ZW1wMTsKKwl1bnNpZ25lZCBidWZzLCBzYW1wbGVfc2hpZnQgPSAwOworCXN0cnVjdCBwYWdlICptYXAsICptYXBlbmQ7CisJdW5zaWduZWQgbG9uZyBkZjsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IHByb2dfZG1hYnVmKCkrXG4iKSk7CisJZGItPmh3cHRyID0gZGItPnN3cHRyID0gZGItPnRvdGFsX2J5dGVzID0gZGItPmNvdW50ID0gZGItPmVycm9yID0KKwkgICAgZGItPmVuZGNsZWFyZWQgPSBkYi0+YmxvY2tzID0gZGItPndha2V1cCA9IGRiLT51bmRlcnJ1biA9IDA7CisvKgorKiBjaGVjayBmb3Igb3JkZXIgd2l0aGluIGxpbWl0cywgYnV0IGRvIG5vdCBvdmVyd3JpdGUgdmFsdWUsIGNoZWNrCisqIGxhdGVyIGZvciBhIGZyYWN0aW9uYWwgZGVmYXVsdG9yZGVyIChpLmUuIDEwMCspLgorKi8KKwlpZigoZGVmYXVsdG9yZGVyID4gMCkgJiYgKGRlZmF1bHRvcmRlciA8IDEyKSkKKwkJZGYgPSBkZWZhdWx0b3JkZXI7CisJZWxzZQorCQlkZiA9IDE7CQorCisJaWYgKCFkYi0+cmF3YnVmKSB7CisJCWRiLT5yZWFkeSA9IGRiLT5tYXBwZWQgPSAwOworCQlmb3IgKG9yZGVyID0gZGY7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkKKwkJCWlmICggKGRiLT5yYXdidWYgPSAodm9pZCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudCgKKwkJCQlzLT5wY2lkZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRiLT4gZG1hYWRkcikpKQorCQkJCSAgICBicmVhazsKKwkJaWYgKCFkYi0+cmF3YnVmKSB7CisJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgorCQkJCSJjczQyODE6IHByb2dfZG1hYnVmKCk6IHVuYWJsZSB0byBhbGxvY2F0ZSByYXdidWZcbiIpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWRiLT5idWZvcmRlciA9IG9yZGVyOworCQkvLyBOb3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSB0aGUgCisJCS8vIHJlbWFwX3Bmbl9yYW5nZSgpIGluIGNzNDI4MV9tbWFwIGRvZXNuJ3Qgd29yay4KKwkJLy8gMS4gZ2V0IGluZGV4IHRvIGxhc3QgcGFnZSBpbiBtZW1fbWFwIGFycmF5IGZvciByYXdidWYuCisJCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgCisJCQkoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKworCQkvLyAyLiBtYXJrIGVhY2ggcGh5c2ljYWwgcGFnZSBpbiByYW5nZSBhcyAncmVzZXJ2ZWQnLgorCQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCisJCQlTZXRQYWdlUmVzZXJ2ZWQobWFwKTsKKwl9CisJaWYgKCFzLT50bXBidWZmICYmIChkYi0+dHlwZSA9PSBDU19UWVBFX0FEQykpIHsKKwkJZm9yIChvcmRlciA9IGRmOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7CisJCSAgICAgb3JkZXItLSkKKwkJCWlmICggKHMtPnRtcGJ1ZmYgPSAodm9pZCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudCgKKwkJCQkJcy0+cGNpZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsIAorCQkJCQkmcy0+ZG1hYWRkcl90bXBidWZmKSkpCisJCQkJICAgIGJyZWFrOworCQlpZiAoIXMtPnRtcGJ1ZmYpIHsKKwkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkJImNzNDI4MTogcHJvZ19kbWFidWYoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHRtcGJ1ZmZcbiIpKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXMtPmJ1Zm9yZGVyX3RtcGJ1ZmYgPSBvcmRlcjsKKwkJLy8gTm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgdGhlIAorCQkvLyByZW1hcF9wZm5fcmFuZ2UoKSBpbiBjczQyODFfbW1hcCBkb2Vzbid0IHdvcmsuCisJCS8vIDEuIGdldCBpbmRleCB0byBsYXN0IHBhZ2UgaW4gbWVtX21hcCBhcnJheSBmb3IgcmF3YnVmLgorCQltYXBlbmQgPSB2aXJ0X3RvX3BhZ2Uocy0+dG1wYnVmZiArIAorCQkJCShQQUdFX1NJWkUgPDwgcy0+YnVmb3JkZXJfdG1wYnVmZikgLSAxKTsKKworCQkvLyAyLiBtYXJrIGVhY2ggcGh5c2ljYWwgcGFnZSBpbiByYW5nZSBhcyAncmVzZXJ2ZWQnLgorCQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShzLT50bXBidWZmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCisJCQlTZXRQYWdlUmVzZXJ2ZWQobWFwKTsKKwl9CisJaWYgKGRiLT50eXBlID09IENTX1RZUEVfREFDKSB7CisJCWlmIChzLT5wcm9wX2RhYy5mbXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSkpCisJCQlzYW1wbGVfc2hpZnQrKzsKKwkJaWYgKHMtPnByb3BfZGFjLmNoYW5uZWxzID4gMSkKKwkJCXNhbXBsZV9zaGlmdCsrOworCQlieXRlc3BlcnNlYyA9IHMtPnByb3BfZGFjLnJhdGUgPDwgc2FtcGxlX3NoaWZ0OworCX0gZWxzZQkJCS8vIENTX1RZUEVfQURDCisJeworCQlpZiAocy0+cHJvcF9hZGMuZm10ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUpKQorCQkJc2FtcGxlX3NoaWZ0Kys7CisJCWlmIChzLT5wcm9wX2FkYy5jaGFubmVscyA+IDEpCisJCQlzYW1wbGVfc2hpZnQrKzsKKwkJYnl0ZXNwZXJzZWMgPSBzLT5wcm9wX2FkYy5yYXRlIDw8IHNhbXBsZV9zaGlmdDsKKwl9CisJYnVmcyA9IFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXI7CisKKy8qCisqIGFkZGVkIGZyYWN0aW9uYWwgImRlZmF1bHRvcmRlciIgaW5wdXRzLiBpZiA+MTAwIHRoZW4gdXNlIAorKiBkZWZhdWx0b3JkZXItMTAwIGFzIHBvd2VyIG9mIDIgZm9yIHRoZSBidWZmZXIgc2l6ZS4gZXhhbXBsZToKKyogMTA2ID0gMl4oMTA2LTEwMCkgPSAyXjYgPSA2NCBieXRlcyBmb3IgdGhlIGJ1ZmZlciBzaXplLgorKi8KKwlpZihkZWZhdWx0b3JkZXIgPj0gMTAwKQorCXsKKwkJYnVmcyA9IDEgPDwgKGRlZmF1bHRvcmRlci0xMDApOworCX0KKworI2RlZmluZSBJTlRFUlJVUFRfUkFURV9NUyAgICAgICAxMDAJLy8gSW50ZXJydXB0IHJhdGUgaW4gbWlsbGlzZWNvbmRzLgorCWRiLT5udW1mcmFnID0gMjsKKy8qIAorKiBOb21pbmFsIGZyYWcgc2l6ZShieXRlcy9pbnRlcnJ1cHQpCisqLworCXRlbXAxID0gYnl0ZXNwZXJzZWMgLyAoMTAwMCAvIElOVEVSUlVQVF9SQVRFX01TKTsKKwlkYi0+ZnJhZ3NoaWZ0ID0gODsJLy8gTWluIDI1NiBieXRlcy4KKwl3aGlsZSAoMSA8PCBkYi0+ZnJhZ3NoaWZ0IDwgdGVtcDEpCS8vIENhbGMgcG93ZXIgb2YgMiBmcmFnIHNpemUuCisJCWRiLT5mcmFnc2hpZnQgKz0gMTsKKwlkYi0+ZnJhZ3NpemUgPSAxIDw8IGRiLT5mcmFnc2hpZnQ7CisJZGItPmRtYXNpemUgPSBkYi0+ZnJhZ3NpemUgKiAyOworCWRiLT5mcmFnc2FtcGxlcyA9IGRiLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnQ7CS8vICMgc2FtcGxlcy9mcmFnbWVudC4KKworLy8gSWYgdGhlIGNhbGN1bGF0ZWQgc2l6ZSBpcyBsYXJnZXIgdGhhbiB0aGUgYWxsb2NhdGVkCisvLyAgYnVmZmVyLCBkaXZpZGUgdGhlIGFsbG9jYXRlZCBidWZmZXIgaW50byAyIGZyYWdtZW50cy4KKwlpZiAoZGItPmRtYXNpemUgPiBidWZzKSB7CisKKwkJZGItPm51bWZyYWcgPSAyOwkvLyBUd28gZnJhZ21lbnRzLgorCQlkYi0+ZnJhZ3NpemUgPSBidWZzID4+IDE7CS8vIEVhY2ggMS8yIHRoZSBhbGxvYydlZCBidWZmZXIuCisJCWRiLT5mcmFnc2FtcGxlcyA9IGRiLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnQ7CS8vICMgc2FtcGxlcy9mcmFnbWVudC4KKwkJZGItPmRtYXNpemUgPSBidWZzOwkvLyBVc2UgYWxsIHRoZSBhbGxvYydlZCBidWZmZXIuCisKKwkJZGItPmZyYWdzaGlmdCA9IDA7CS8vIENhbGN1bGF0ZSAnZnJhZ3NoaWZ0Jy4KKwkJdGVtcDEgPSBkYi0+ZnJhZ3NpemU7CS8vIHVwZGF0ZV9wdHIoKSB1c2VzIGl0IAorCQl3aGlsZSAoKHRlbXAxID4+PSAxKSA+IDEpCS8vIHRvIGNhbGMgJ3RvdGFsLWJ5dGVzJworCQkJZGItPmZyYWdzaGlmdCArPSAxOwkvLyByZXR1cm5lZCBpbiBEU1BfR0VUSS9PUFRSLiAKKwl9CisJQ1NfREJHT1VUKENTX1BBUk1TLCAzLCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQyODE6IHByb2dfZG1hYnVmKCk6IG51bWZyYWc9JWQgZnJhZ3NpemU9JWQgZnJhZ3NhbXBsZXM9JWQgZnJhZ3NoaWZ0PSVkIGJ1ZnM9JWQgZm10PTB4JXggY2g9JWRcbiIsCisJCQlkYi0+bnVtZnJhZywgZGItPmZyYWdzaXplLCBkYi0+ZnJhZ3NhbXBsZXMsIAorCQkJZGItPmZyYWdzaGlmdCwgYnVmcywgCisJCQkoZGItPnR5cGUgPT0gQ1NfVFlQRV9EQUMpID8gcy0+cHJvcF9kYWMuZm10IDogCisJCQkJcy0+cHJvcF9hZGMuZm10LCAKKwkJCShkYi0+dHlwZSA9PSBDU19UWVBFX0RBQykgPyBzLT5wcm9wX2RhYy5jaGFubmVscyA6IAorCQkJCXMtPnByb3BfYWRjLmNoYW5uZWxzKSk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogcHJvZ19kbWFidWYoKS1cbiIpKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IHByb2dfZG1hYnVmX2FkYyhzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgdmE7CisJdW5zaWduZWQgY291bnQ7CisJaW50IGM7CisJc3RvcF9hZGMocyk7CisJcy0+ZG1hX2FkYy50eXBlID0gQ1NfVFlQRV9BREM7CisJaWYgKChjID0gcHJvZ19kbWFidWYocywgJnMtPmRtYV9hZGMpKSkKKwkJcmV0dXJuIGM7CisKKwlpZiAocy0+ZG1hX2FkYy5yYXdidWYpIHsKKwkJbWVtc2V0KHMtPmRtYV9hZGMucmF3YnVmLAorCQkgICAgICAgKHMtPnByb3BfYWRjLgorCQkJZm10ICYgKEFGTVRfVTggfCBBRk1UX1UxNl9MRSkpID8gMHg4MCA6IDAsCisJCSAgICAgICBzLT5kbWFfYWRjLmRtYXNpemUpOworCX0KKwlpZiAocy0+dG1wYnVmZikgeworCQltZW1zZXQocy0+dG1wYnVmZiwKKwkJICAgICAgIChzLT5wcm9wX2FkYy4KKwkJCWZtdCAmIChBRk1UX1U4IHwgQUZNVF9VMTZfTEUpKSA/IDB4ODAgOiAwLAorCQkgICAgICAgUEFHRV9TSVpFIDw8IHMtPmJ1Zm9yZGVyX3RtcGJ1ZmYpOworCX0KKworCXZhID0gdmlydF90b19idXMocy0+ZG1hX2FkYy5yYXdidWYpOworCisJY291bnQgPSBzLT5kbWFfYWRjLmRtYXNpemU7CisKKwlpZiAocy0+cHJvcF9hZGMuCisJICAgIGZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TMTZfQkUgfCBBRk1UX1UxNl9CRSkpCisJCSAgICBjb3VudCAvPSAyOwkvLyAxNi1iaXQuCisKKwlpZiAocy0+cHJvcF9hZGMuY2hhbm5lbHMgPiAxKQorCQljb3VudCAvPSAyOwkvLyBBc3N1bWUgc3RlcmVvLgorCisJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgMywgcHJpbnRrKEtFUk5fSU5GTworCQkiY3M0MjgxOiBwcm9nX2RtYWJ1Zl9hZGMoKTogY291bnQ9JWQgdmE9MHglLjh4XG4iLAorCQkJY291bnQsICh1bnNpZ25lZCkgdmEpKTsKKworCXdyaXRlbCh2YSwgcy0+cEJBMCArIEJBMF9EQkExKTsJLy8gU2V0IGJ1ZmZlciBzdGFydCBhZGRyZXNzLgorCXdyaXRlbChjb3VudCAtIDEsIHMtPnBCQTAgKyBCQTBfREJDMSk7CS8vIFNldCBjb3VudC4gCisJcy0+ZG1hX2FkYy5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcm9nX2RtYWJ1Zl9kYWMoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIHZhOworCXVuc2lnbmVkIGNvdW50OworCWludCBjOworCXN0b3BfZGFjKHMpOworCXMtPmRtYV9kYWMudHlwZSA9IENTX1RZUEVfREFDOworCWlmICgoYyA9IHByb2dfZG1hYnVmKHMsICZzLT5kbWFfZGFjKSkpCisJCXJldHVybiBjOworCW1lbXNldChzLT5kbWFfZGFjLnJhd2J1ZiwKKwkgICAgICAgKHMtPnByb3BfZGFjLmZtdCAmIChBRk1UX1U4IHwgQUZNVF9VMTZfTEUpKSA/IDB4ODAgOiAwLAorCSAgICAgICBzLT5kbWFfZGFjLmRtYXNpemUpOworCisJdmEgPSB2aXJ0X3RvX2J1cyhzLT5kbWFfZGFjLnJhd2J1Zik7CisKKwljb3VudCA9IHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwlpZiAocy0+cHJvcF9kYWMuCisJICAgIGZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TMTZfQkUgfCBBRk1UX1UxNl9CRSkpCisJCSAgICBjb3VudCAvPSAyOwkvLyAxNi1iaXQuCisKKwlpZiAocy0+cHJvcF9kYWMuY2hhbm5lbHMgPiAxKQorCQljb3VudCAvPSAyOwkvLyBBc3N1bWUgc3RlcmVvLgorCisJd3JpdGVsKHZhLCBzLT5wQkEwICsgQkEwX0RCQTApOwkvLyBTZXQgYnVmZmVyIHN0YXJ0IGFkZHJlc3MuCisJd3JpdGVsKGNvdW50IC0gMSwgcy0+cEJBMCArIEJBMF9EQkMwKTsJLy8gU2V0IGNvdW50LiAgICAgICAgICAgICAKKworCUNTX0RCR09VVChDU19XQVZFX1dSSVRFLCAzLCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQyODE6IHByb2dfZG1hYnVmX2RhYygpOiBjb3VudD0lZCB2YT0weCUuOHhcbiIsCisJCQljb3VudCwgKHVuc2lnbmVkKSB2YSkpOworCisJcy0+ZG1hX2RhYy5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgY2xlYXJfYWR2YW5jZSh2b2lkICpidWYsIHVuc2lnbmVkIGJzaXplLCB1bnNpZ25lZCBicHRyLAorCQkJICB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoYnB0ciArIGxlbiA+IGJzaXplKSB7CisJCXVuc2lnbmVkIHggPSBic2l6ZSAtIGJwdHI7CisJCW1lbXNldCgoKGNoYXIgKikgYnVmKSArIGJwdHIsIGMsIHgpOworCQlicHRyID0gMDsKKwkJbGVuIC09IHg7CisJfQorCUNTX0RCR09VVChDU19XQVZFX1dSSVRFLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQyODE6IGNsZWFyX2FkdmFuY2UoKTogbWVtc2V0ICVkIGF0ICVwIGZvciAlZCBzaXplIFxuIiwKKwkJCSh1bnNpZ25lZCljLCAoKGNoYXIgKikgYnVmKSArIGJwdHIsIGxlbikpOworCW1lbXNldCgoKGNoYXIgKikgYnVmKSArIGJwdHIsIGMsIGxlbik7Cit9CisKKworCisvLyBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCEgCitzdGF0aWMgdm9pZCBjczQyODFfdXBkYXRlX3B0cihzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzLCBpbnQgaW50ZmxhZykKK3sKKwlpbnQgZGlmZjsKKwl1bnNpZ25lZCBod3B0ciwgdmE7CisKKwkvLyB1cGRhdGUgQURDIHBvaW50ZXIgCisJaWYgKHMtPmVuYSAmIEZNT0RFX1JFQUQpIHsKKwkJaHdwdHIgPSByZWFkbChzLT5wQkEwICsgQkEwX0RDQTEpOwkvLyBSZWFkIGNhcHR1cmUgRE1BIGFkZHJlc3MuCisJCXZhID0gdmlydF90b19idXMocy0+ZG1hX2FkYy5yYXdidWYpOworCQlod3B0ciAtPSAodW5zaWduZWQpIHZhOworCQlkaWZmID0KKwkJICAgIChzLT5kbWFfYWRjLmRtYXNpemUgKyBod3B0ciAtCisJCSAgICAgcy0+ZG1hX2FkYy5od3B0cikgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisJCXMtPmRtYV9hZGMuaHdwdHIgPSBod3B0cjsKKwkJcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQlzLT5kbWFfYWRjLmNvdW50ICs9IGRpZmY7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID4gcy0+ZG1hX2FkYy5kbWFzaXplKQorCQkJcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZTsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PQorCQkJICAgIChzaWduZWQpIHMtPmRtYV9hZGMuZnJhZ3NpemUpIHdha2VfdXAoJnMtPgorCQkJCQkJCQkgIGRtYV9hZGMuCisJCQkJCQkJCSAgd2FpdCk7CisJCX0gZWxzZSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IDApCisJCQkJd2FrZV91cCgmcy0+ZG1hX2FkYy53YWl0KTsKKwkJfQorCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyODE6IGNzNDI4MV91cGRhdGVfcHRyKCk6IHM9JXAgaHdwdHI9JWQgdG90YWxfYnl0ZXM9JWQgY291bnQ9JWQgXG4iLAorCQkJCXMsIHMtPmRtYV9hZGMuaHdwdHIsIHMtPmRtYV9hZGMudG90YWxfYnl0ZXMsIHMtPmRtYV9hZGMuY291bnQpKTsKKwl9CisJLy8gdXBkYXRlIERBQyBwb2ludGVyIAorCS8vCisJLy8gY2hlY2sgZm9yIGVuZCBvZiBidWZmZXIsIG1lYW5zIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHdhaXQgZm9yIGFub3RoZXIgaW50ZXJydXB0CisJLy8gdG8gYWxsb3cgc2lsZW5jZSB0byBmaWxsIHRoZSBmaWZvcyBvbiB0aGUgcGFydCwgdG8ga2VlcCBwb3BzIGRvd24gdG8gYSBtaW5pbXVtLgorCS8vCisJaWYgKHMtPmVuYSAmIEZNT0RFX1dSSVRFKSB7CisJCWh3cHRyID0gcmVhZGwocy0+cEJBMCArIEJBMF9EQ0EwKTsJLy8gUmVhZCBwbGF5IERNQSBhZGRyZXNzLgorCQl2YSA9IHZpcnRfdG9fYnVzKHMtPmRtYV9kYWMucmF3YnVmKTsKKwkJaHdwdHIgLT0gKHVuc2lnbmVkKSB2YTsKKwkJZGlmZiA9IChzLT5kbWFfZGFjLmRtYXNpemUgKyBod3B0ciAtCisJCSAgICAgcy0+ZG1hX2RhYy5od3B0cikgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCXMtPmRtYV9kYWMuaHdwdHIgPSBod3B0cjsKKwkJcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgKz0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IHMtPmRtYV9kYWMuZnJhZ3NpemUpIHsKKwkJCQlzLT5kbWFfZGFjLndha2V1cCA9IDE7CisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYy53YWl0KTsKKwkJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA+IHMtPmRtYV9kYWMuZG1hc2l6ZSkKKwkJCQkJcy0+ZG1hX2RhYy5jb3VudCAmPQorCQkJCQkgICAgcy0+ZG1hX2RhYy5kbWFzaXplIC0gMTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgLT0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50IDw9IDApIHsKKwkJCQkvLworCQkJCS8vIGZpbGwgd2l0aCBzaWxlbmNlLCBhbmQgZG8gbm90IHNodXQgZG93biB0aGUgREFDLgorCQkJCS8vIENvbnRpbnVlIHRvIHBsYXkgc2lsZW5jZSB1bnRpbCB0aGUgX3JlbGVhc2UuCisJCQkJLy8KKwkJCQlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSwgNiwgcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiY3M0MjgxOiBjczQyODFfdXBkYXRlX3B0cigpOiBtZW1zZXQgJWQgYXQgJXAgZm9yICVkIHNpemUgXG4iLAorCQkJCQkJKHVuc2lnbmVkKShzLT5wcm9wX2RhYy5mbXQgJiAKKwkJCQkJCShBRk1UX1U4IHwgQUZNVF9VMTZfTEUpKSA/IDB4ODAgOiAwLCAKKwkJCQkJCXMtPmRtYV9kYWMucmF3YnVmLCBzLT5kbWFfZGFjLmRtYXNpemUpKTsKKwkJCQltZW1zZXQocy0+ZG1hX2RhYy5yYXdidWYsCisJCQkJICAgICAgIChzLT5wcm9wX2RhYy4KKwkJCQkJZm10ICYgKEFGTVRfVTggfCBBRk1UX1UxNl9MRSkpID8KKwkJCQkgICAgICAgMHg4MCA6IDAsIHMtPmRtYV9kYWMuZG1hc2l6ZSk7CisJCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPCAwKSB7CisJCQkJCXMtPmRtYV9kYWMudW5kZXJydW4gPSAxOworCQkJCQlzLT5kbWFfZGFjLmNvdW50ID0gMDsKKwkJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCA5LCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSAiY3M0MjgxOiBjczQyODFfdXBkYXRlX3B0cigpOiB1bmRlcnJ1blxuIikpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAocy0+ZG1hX2RhYy5jb3VudCA8PQorCQkJCSAgIChzaWduZWQpIHMtPmRtYV9kYWMuZnJhZ3NpemUKKwkJCQkgICAmJiAhcy0+ZG1hX2RhYy5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzLT5kbWFfZGFjLnJhd2J1ZiwKKwkJCQkJICAgICAgcy0+ZG1hX2RhYy5kbWFzaXplLAorCQkJCQkgICAgICBzLT5kbWFfZGFjLnN3cHRyLAorCQkJCQkgICAgICBzLT5kbWFfZGFjLmZyYWdzaXplLAorCQkJCQkgICAgICAocy0+cHJvcF9kYWMuCisJCQkJCSAgICAgICBmbXQgJiAoQUZNVF9VOCB8CisJCQkJCQkgICAgICBBRk1UX1UxNl9MRSkpID8gMHg4MAorCQkJCQkgICAgICA6IDApOworCQkJCXMtPmRtYV9kYWMuZW5kY2xlYXJlZCA9IDE7CisJCQl9CisJCQlpZiAoIChzLT5kbWFfZGFjLmNvdW50IDw9IChzaWduZWQpIHMtPmRtYV9kYWMuZG1hc2l6ZS8yKSB8fAorCQkJCWludGZsYWcpCisJCQl7CisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYy53YWl0KTsKKwkJCX0KKwkJfQorCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyODE6IGNzNDI4MV91cGRhdGVfcHRyKCk6IHM9JXAgaHdwdHI9JWQgdG90YWxfYnl0ZXM9JWQgY291bnQ9JWQgXG4iLAorCQkJCXMsIHMtPmRtYV9kYWMuaHdwdHIsIHMtPmRtYV9kYWMudG90YWxfYnl0ZXMsIHMtPmRtYV9kYWMuY291bnQpKTsKKwl9Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCitzdGF0aWMgdm9pZCBwcm9nX2NvZGVjKHN0cnVjdCBjczQyODFfc3RhdGUgKnMsIHVuc2lnbmVkIHR5cGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCB0ZW1wMSwgZm9ybWF0OworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogcHJvZ19jb2RlYygpKyBcbiIpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKHR5cGUgPT0gQ1NfVFlQRV9BREMpIHsKKwkJdGVtcDEgPSByZWFkbChzLT5wQkEwICsgQkEwX0RDUjEpOworCQl3cml0ZWwodGVtcDEgfCBEQ1JuX01TSywgcy0+cEJBMCArIEJBMF9EQ1IxKTsJLy8gU3RvcCBjYXB0dXJlIERNQSwgaWYgYWN0aXZlLgorCisJCS8vIHByb2dyYW0gc2FtcGxpbmcgcmF0ZXMgIAorCQkvLyBOb3RlLCBmb3IgQ1M0MjgxLCBjYXB0dXJlICYgcGxheSByYXRlcyBjYW4gYmUgc2V0IGluZGVwZW5kZW50bHkuCisJCWNzNDI4MV9yZWNvcmRfcmF0ZShzLCBzLT5wcm9wX2FkYy5yYXRlKTsKKworCQkvLyBwcm9ncmFtIEFEQyBwYXJhbWV0ZXJzIAorCQlmb3JtYXQgPSBETVJuX0RNQSB8IERNUm5fQVVUTyB8IERNUm5fVFJfV1JJVEU7CisJCWlmIChzLT5wcm9wX2FkYy4KKwkJICAgIGZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TMTZfQkUgfCBBRk1UX1UxNl9CRSkpIHsJLy8gMTYtYml0CisJCQlpZiAocy0+cHJvcF9hZGMuZm10ICYgKEFGTVRfUzE2X0JFIHwgQUZNVF9VMTZfQkUpKQkvLyBCaWctZW5kaWFuPworCQkJCWZvcm1hdCB8PSBETVJuX0JFTkQ7CisJCQlpZiAocy0+cHJvcF9hZGMuZm10ICYgKEFGTVRfVTE2X0xFIHwgQUZNVF9VMTZfQkUpKQorCQkJCWZvcm1hdCB8PSBETVJuX1VTSUdOOwkvLyBVbnNpZ25lZC4gICAgICAKKwkJfSBlbHNlCisJCQlmb3JtYXQgfD0gRE1Sbl9TSVpFOCB8IERNUm5fVVNJR047CS8vIDgtYml0LCB1bnNpZ25lZAorCQlpZiAocy0+cHJvcF9hZGMuY2hhbm5lbHMgPCAyKQorCQkJZm9ybWF0IHw9IERNUm5fTU9OTzsKKworCQl3cml0ZWwoZm9ybWF0LCBzLT5wQkEwICsgQkEwX0RNUjEpOworCisJCUNTX0RCR09VVChDU19QQVJNUywgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI4MTogcHJvZ19jb2RlYygpOiBhZGMgJXMgJXMgJXMgcmF0ZT0lZCBETVIwIGZvcm1hdD0weCUuOHhcbiIsCisJCQkJKGZvcm1hdCAmIERNUm5fU0laRTgpID8gIjgiIDogIjE2IiwKKwkJCQkoZm9ybWF0ICYgRE1Sbl9VU0lHTikgPyAgIlVuc2lnbmVkIiA6ICJTaWduZWQiLCAKKwkJCQkoZm9ybWF0ICYgRE1Sbl9NT05PKSA/ICJNb25vIiA6ICJTdGVyZW8iLCAKKwkJCQlzLT5wcm9wX2FkYy5yYXRlLCBmb3JtYXQpKTsKKworCQlzLT5lbmEgJj0gfkZNT0RFX1JFQUQ7CS8vIG5vdCBjYXB0dXJpbmcgZGF0YSB5ZXQKKwl9CisKKworCWlmICh0eXBlID09IENTX1RZUEVfREFDKSB7CisJCXRlbXAxID0gcmVhZGwocy0+cEJBMCArIEJBMF9EQ1IwKTsKKwkJd3JpdGVsKHRlbXAxIHwgRENSbl9NU0ssIHMtPnBCQTAgKyBCQTBfRENSMCk7CS8vIFN0b3AgcGxheSBETUEsIGlmIGFjdGl2ZS4KKworCQkvLyBwcm9ncmFtIHNhbXBsaW5nIHJhdGVzICAKKwkJLy8gTm90ZSwgZm9yIENTNDI4MSwgY2FwdHVyZSAmIHBsYXkgcmF0ZXMgY2FuIGJlIHNldCBpbmRlcGVuZGVudGx5LgorCQljczQyODFfcGxheV9yYXRlKHMsIHMtPnByb3BfZGFjLnJhdGUpOworCisJCS8vIHByb2dyYW0gREFDIHBhcmFtZXRlcnMgCisJCWZvcm1hdCA9IERNUm5fRE1BIHwgRE1Sbl9BVVRPIHwgRE1Sbl9UUl9SRUFEOworCQlpZiAocy0+cHJvcF9kYWMuCisJCSAgICBmbXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSB8IEFGTVRfUzE2X0JFIHwgQUZNVF9VMTZfQkUpKSB7CS8vIDE2LWJpdAorCQkJaWYgKHMtPnByb3BfZGFjLmZtdCAmIChBRk1UX1MxNl9CRSB8IEFGTVRfVTE2X0JFKSkKKwkJCQlmb3JtYXQgfD0gRE1Sbl9CRU5EOwkvLyBCaWcgRW5kaWFuLgorCQkJaWYgKHMtPnByb3BfZGFjLmZtdCAmIChBRk1UX1UxNl9MRSB8IEFGTVRfVTE2X0JFKSkKKwkJCQlmb3JtYXQgfD0gRE1Sbl9VU0lHTjsJLy8gVW5zaWduZWQuICAgICAgCisJCX0gZWxzZQorCQkJZm9ybWF0IHw9IERNUm5fU0laRTggfCBETVJuX1VTSUdOOwkvLyA4LWJpdCwgdW5zaWduZWQKKworCQlpZiAocy0+cHJvcF9kYWMuY2hhbm5lbHMgPCAyKQorCQkJZm9ybWF0IHw9IERNUm5fTU9OTzsKKworCQl3cml0ZWwoZm9ybWF0LCBzLT5wQkEwICsgQkEwX0RNUjApOworCisKKwkJQ1NfREJHT1VUKENTX1BBUk1TLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0MjgxOiBwcm9nX2NvZGVjKCk6IGRhYyAlcyAlcyAlcyByYXRlPSVkIERNUjAgZm9ybWF0PTB4JS44eFxuIiwKKwkJCQkoZm9ybWF0ICYgRE1Sbl9TSVpFOCkgPyAiOCIgOiAiMTYiLAorCQkJCShmb3JtYXQgJiBETVJuX1VTSUdOKSA/ICAiVW5zaWduZWQiIDogIlNpZ25lZCIsCisJCQkJKGZvcm1hdCAmIERNUm5fTU9OTykgPyAiTW9ubyIgOiAiU3RlcmVvIiwgCisJCQkJcy0+cHJvcF9kYWMucmF0ZSwgZm9ybWF0KSk7CisKKwkJcy0+ZW5hICY9IH5GTU9ERV9XUklURTsJLy8gbm90IGNhcHR1cmluZyBkYXRhIHlldAorCisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBwcm9nX2NvZGVjKCktIFxuIikpOworfQorCisKK3N0YXRpYyBpbnQgbWl4ZXJfaW9jdGwoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgdW5zaWduZWQgaW50IGNtZCwKKwkJICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCS8vIEluZGV4IHRvIG1peGVyX3NyY1tdIGlzIHZhbHVlIG9mIEFDOTcgSW5wdXQgTXV4IFNlbGVjdCBSZWcuCisJLy8gVmFsdWUgb2YgYXJyYXkgbWVtYmVyIGlzIHJlY29yZGluZyBzb3VyY2UgRGV2aWNlIElEIE1hc2suCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtaXhlcl9zcmNbOF0gPSB7CisJCVNPVU5EX01BU0tfTUlDLCBTT1VORF9NQVNLX0NELCAwLCBTT1VORF9NQVNLX0xJTkUxLAorCQlTT1VORF9NQVNLX0xJTkUsIFNPVU5EX01BU0tfVk9MVU1FLCAwLCAwCisJfTsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCS8vIEluZGV4IG9mIG1peHRhYmxlMVtdIG1lbWJlciBpcyBEZXZpY2UgSUQgCisJLy8gYW5kIG11c3QgYmUgPD0gU09VTkRfTUlYRVJfTlJERVZJQ0VTLgorCS8vIFZhbHVlIG9mIGFycmF5IG1lbWJlciBpcyBpbmRleCBpbnRvIHMtPm1peC52b2xbXQorCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1peHRhYmxlMVtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCQlbU09VTkRfTUlYRVJfUENNXSA9IDEsCS8vIHZvaWNlIAorCQlbU09VTkRfTUlYRVJfTElORTFdID0gMiwJLy8gQVVYCisJCVtTT1VORF9NSVhFUl9DRF0gPSAzLAkvLyBDRCAKKwkJW1NPVU5EX01JWEVSX0xJTkVdID0gNCwJLy8gTGluZSAKKwkJW1NPVU5EX01JWEVSX1NZTlRIXSA9IDUsCS8vIEZNCisJCVtTT1VORF9NSVhFUl9NSUNdID0gNiwJLy8gTWljIAorCQlbU09VTkRfTUlYRVJfU1BFQUtFUl0gPSA3LAkvLyBTcGVha2VyIAorCQlbU09VTkRfTUlYRVJfUkVDTEVWXSA9IDgsCS8vIFJlY29yZGluZyBsZXZlbCAKKwkJW1NPVU5EX01JWEVSX1ZPTFVNRV0gPSA5CS8vIE1hc3RlciBWb2x1bWUgCisJfTsKKworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIG1peHJlZ1tdID0geworCQlCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSwKKwkJQkEwX0FDOTdfQVVYX1ZPTFVNRSwKKwkJQkEwX0FDOTdfQ0RfVk9MVU1FLAorCQlCQTBfQUM5N19MSU5FX0lOX1ZPTFVNRQorCX07CisJdW5zaWduZWQgY2hhciBsLCByLCBybCwgcnIsIHZpZHg7CisJdW5zaWduZWQgY2hhciBhdHRlbnRibFsxMV0gPQorCSAgICB7IDYzLCA0MiwgMjYsIDE3LCAxNCwgMTEsIDgsIDYsIDQsIDIsIDAgfTsKKwl1bnNpZ25lZCB0ZW1wMTsKKwlpbnQgaSwgdmFsOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCSAiY3M0MjgxOiBtaXhlcl9pb2N0bCgpOiBzPSVwIGNtZD0weCUuOHhcbiIsIHMsIGNtZCkpOworI2lmIENTREVCVUcKKwljc19wcmludGlvY3RsKGNtZCk7CisjZW5kaWYKKyNpZiBDU0RFQlVHX0lOVEVSRkFDRQorCisJaWYgKChjbWQgPT0gU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSykgfHwKKwkgICAgKGNtZCA9PSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLKSB8fAorCSAgICAoY21kID09IFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMKSB8fAorCSAgICAoY21kID09IFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMKSB8fAorCSAgICAoY21kID09IFNPVU5EX01JWEVSX0NTX0FQTSkpCisJeworCQlzd2l0Y2ggKGNtZCkgeworCisJCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzoKKwkJCXJldHVybiBwdXRfdXNlcihjc19kZWJ1Z21hc2ssCisJCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOgorCQkJcmV0dXJuIHB1dF91c2VyKGNzX2RlYnVnbGV2ZWwsCisJCQkJCSh1bnNpZ25lZCBsb25nIF9fdXNlciAqKSBhcmdwKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgbG9uZyBfX3VzZXIgKikgYXJncCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQljc19kZWJ1Z21hc2sgPSB2YWw7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOgorCQkJaWYgKGdldF91c2VyKHZhbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJY3NfZGVidWdsZXZlbCA9IHZhbDsKKwkJCXJldHVybiAwOworI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisJCWNhc2UgU09VTkRfTUlYRVJfQ1NfQVBNOgorCQkJaWYgKGdldF91c2VyKHZhbCwgKHVuc2lnbmVkIGxvbmcgX191c2VyICopIGFyZ3ApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYodmFsID09IENTX0lPQ1RMX0NNRF9TVVNQRU5EKQorCQkJCWNzNDI4MV9zdXNwZW5kKHMpOworCQkJZWxzZSBpZih2YWwgPT0gQ1NfSU9DVExfQ01EX1JFU1VNRSkKKwkJCQljczQyODFfcmVzdW1lKHMpOworCQkJZWxzZQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTworCQkJCSAgICAiY3M0MjgxOiBtaXhlcl9pb2N0bCgpOiBpbnZhbGlkIEFQTSBjbWQgKCVkKVxuIiwKKwkJCQkJdmFsKSk7CisJCQl9CisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPCisJCQkJImNzNDI4MTogbWl4ZXJfaW9jdGwoKTogRVJST1IgdW5rbm93biBkZWJ1ZyBjbWRcbiIpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUxKSB7CisJCS8vIGVuYWJsZS9kaXNhYmxlL3F1ZXJ5IG1peGVyIHByZWFtcCAKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAtMSkgeworCQkJY3M0MjgxX3JlYWRfYWM5NyhzLCBCQTBfQUM5N19NSUNfVk9MVU1FLCAmdGVtcDEpOworCQkJdGVtcDEgPSB2YWwgPyAodGVtcDEgfCAweDQwKSA6ICh0ZW1wMSAmIDB4ZmZiZik7CisJCQljczQyODFfd3JpdGVfYWM5NyhzLCBCQTBfQUM5N19NSUNfVk9MVU1FLCB0ZW1wMSk7CisJCX0KKwkJY3M0MjgxX3JlYWRfYWM5NyhzLCBCQTBfQUM5N19NSUNfVk9MVU1FLCAmdGVtcDEpOworCQl2YWwgPSAodGVtcDEgJiAweDQwKSA/IDEgOiAwOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKSBhcmdwKTsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMikgeworCQkvLyBlbmFibGUvZGlzYWJsZS9xdWVyeSBzcGF0aWFsaXplciAKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IC0xKSB7CisJCQl0ZW1wMSA9ICh2YWwgJiAweDNmKSA+PiAyOworCQkJY3M0MjgxX3dyaXRlX2FjOTcocywgQkEwX0FDOTdfM0RfQ09OVFJPTCwgdGVtcDEpOworCQkJY3M0MjgxX3JlYWRfYWM5NyhzLCBCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UsCisJCQkJCSAmdGVtcDEpOworCQkJY3M0MjgxX3dyaXRlX2FjOTcocywgQkEwX0FDOTdfR0VORVJBTF9QVVJQT1NFLAorCQkJCQkgIHRlbXAxIHwgMHgyMDAwKTsKKwkJfQorCQljczQyODFfcmVhZF9hYzk3KHMsIEJBMF9BQzk3XzNEX0NPTlRST0wsICZ0ZW1wMSk7CisJCXJldHVybiBwdXRfdXNlcigodGVtcDEgPDwgMikgfCAzLCAoaW50IF9fdXNlciAqKWFyZ3ApOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKKwkJbWl4ZXJfaW5mbyBpbmZvOworCQlzdHJsY3B5KGluZm8uaWQsICJDUzQyODEiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgIkNyeXN0YWwgQ1M0MjgxIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpbmZvLm1vZGlmeV9jb3VudGVyID0gcy0+bWl4Lm1vZGNudDsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBTT1VORF9PTERfTUlYRVJfSU5GTykgeworCQlfb2xkX21peGVyX2luZm8gaW5mbzsKKwkJc3RybGNweShpbmZvLmlkLCAiQ1M0MjgxIiwgc2l6ZW9mKGluZm8uaWQpKTsKKwkJc3RybGNweShpbmZvLm5hbWUsICJDcnlzdGFsIENTNDI4MSIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgX191c2VyICopIGFyZ3ApOworCisJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdNJyB8fCBfU0lPQ19TSVpFKGNtZCkgIT0gc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gSWYgaW9jdGwgaGFzIG9ubHkgdGhlIFNJT0NfUkVBRCBiaXQoYml0IDMxKQorCS8vIG9uLCBwcm9jZXNzIHRoZSBvbmx5LXJlYWQgY29tbWFuZHMuIAorCWlmIChfU0lPQ19ESVIoY21kKSA9PSBfU0lPQ19SRUFEKSB7CisJCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgkvLyBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAKKwkJCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfUkVDT1JEX1NFTEVDVCwgJnRlbXAxKTsKKwkJCXJldHVybiBwdXRfdXNlcihtaXhlcl9zcmNbdGVtcDEmN10sIChpbnQgX191c2VyICopYXJncCk7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgkvLyBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIGRldmljZSAKKwkJCXJldHVybiBwdXRfdXNlcihTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfU1lOVEggfAorCQkJCQlTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19MSU5FIHwKKwkJCQkJU09VTkRfTUFTS19MSU5FMSB8IFNPVU5EX01BU0tfTUlDIHwKKwkJCQkJU09VTkRfTUFTS19WT0xVTUUgfAorCQkJCQlTT1VORF9NQVNLX1JFQ0xFViB8CisJCQkJCVNPVU5EX01BU0tfU1BFQUtFUiwgKGludCBfX3VzZXIgKilhcmdwKTsKKworCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CS8vIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgcmVjb3JkaW5nIHNvdXJjZSAKKwkJCXJldHVybiBwdXRfdXNlcihTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX01JQyB8CisJCQkJCVNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX1ZPTFVNRSB8CisJCQkJCVNPVU5EX01BU0tfTElORTEsIChpbnQgX191c2VyICopIGFyZ3ApOworCisJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoJLy8gTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gCisJCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX1NZTlRIIHwKKwkJCQkJU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfTElORSB8CisJCQkJCVNPVU5EX01BU0tfTElORTEgfCBTT1VORF9NQVNLX01JQyB8CisJCQkJCVNPVU5EX01BU0tfVk9MVU1FIHwKKwkJCQkJU09VTkRfTUFTS19SRUNMRVYsIChpbnQgX191c2VyICopYXJncCk7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX0NBUF9FWENMX0lOUFVULCAoaW50IF9fdXNlciAqKWFyZ3ApOworCisJCWRlZmF1bHQ6CisJCQlpID0gX0lPQ19OUihjbWQpOworCQkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTCisJCQkgICAgfHwgISh2aWR4ID0gbWl4dGFibGUxW2ldKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sW3ZpZHggLSAxXSwgKGludCBfX3VzZXIgKilhcmdwKTsKKwkJfQorCX0KKwkvLyBJZiBpb2N0bCBkb2Vzbid0IGhhdmUgYm90aCB0aGUgU0lPQ19SRUFEIGFuZCAKKwkvLyB0aGUgU0lPQ19XUklURSBiaXQgc2V0LCByZXR1cm4gaW52YWxpZC4KKwlpZiAoX1NJT0NfRElSKGNtZCkgIT0gKF9TSU9DX1JFQUQgfCBfU0lPQ19XUklURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvZiB2b2x1bWUgd3JpdGVzLgorCXMtPm1peC5tb2RjbnQrKzsKKworCS8vIElzb2xhdGUgdGhlIGNvbW1hbmQ7IGl0IG11c3QgYmUgYSB3cml0ZS4KKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CS8vIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlIAorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWkgPSBod2VpZ2h0MzIodmFsKTsJLy8gaSA9ICMgYml0cyBvbiBpbiB2YWwuCisJCWlmIChpICE9IDEpCS8vIE9uZSAmIG9ubHkgMSBiaXQgbXVzdCBiZSBvbi4KKwkJCXJldHVybiAwOworCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1peGVyX3NyYykgLyBzaXplb2YoaW50KTsgaSsrKSB7CisJCQlpZiAodmFsID09IG1peGVyX3NyY1tpXSkgeworCQkJCXRlbXAxID0gKGkgPDwgOCkgfCBpOworCQkJCWNzNDI4MV93cml0ZV9hYzk3KHMsCisJCQkJCQkgIEJBMF9BQzk3X1JFQ09SRF9TRUxFQ1QsCisJCQkJCQkgIHRlbXAxKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CS8vIE1heCBzb3VuZGNhcmQuaCB2b2wgaXMgMTAwLgorCQlpZiAobCA8IDYpIHsKKwkJCXJsID0gNjM7CisJCQlsID0gMDsKKwkJfSBlbHNlCisJCQlybCA9IGF0dGVudGJsWygxMCAqIGwpIC8gMTAwXTsJLy8gQ29udmVydCAwLTEwMCB2b2wgdG8gNjMtMCBhdHRlbi4KKworCQlyID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWlmIChyID4gMTAwKQorCQkJciA9IDEwMDsJLy8gTWF4IHJpZ2h0IHZvbHVtZSBpcyAxMDAsIHRvbworCQlpZiAociA8IDYpIHsKKwkJCXJyID0gNjM7CisJCQlyID0gMDsKKwkJfSBlbHNlCisJCQlyciA9IGF0dGVudGJsWygxMCAqIHIpIC8gMTAwXTsJLy8gQ29udmVydCB2b2x1bWUgdG8gYXR0ZW51YXRpb24uCisKKwkJaWYgKChybCA+IDYwKSAmJiAocnIgPiA2MCkpCS8vIElmIGJvdGggbCAmIHIgYXJlICdsb3cnLCAgICAgICAgICAKKwkJCXRlbXAxID0gMHg4MDAwOwkvLyAgdHVybiBvbiB0aGUgbXV0ZSBiaXQuCisJCWVsc2UKKwkJCXRlbXAxID0gMDsKKworCQl0ZW1wMSB8PSAocmwgPDwgOCkgfCBycjsKKworCQljczQyODFfd3JpdGVfYWM5NyhzLCBCQTBfQUM5N19NQVNURVJfVk9MVU1FLCB0ZW1wMSk7CisJCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUsIHRlbXAxKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sWzhdID0gKCh1bnNpZ25lZCBpbnQpIHIgPDwgOCkgfCBsOworI2Vsc2UKKwkJcy0+bWl4LnZvbFs4XSA9IHZhbDsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFs4XSwgKGludCBfX3VzZXIgKilhcmdwKTsKKworCWNhc2UgU09VTkRfTUlYRVJfU1BFQUtFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOworCQlpZiAobCA8IDMpIHsKKwkJCXJsID0gMDsKKwkJCWwgPSAwOworCQl9IGVsc2UgeworCQkJcmwgPSAobCAqIDIgLSA1KSAvIDEzOwkvLyBDb252ZXJ0IDAtMTAwIHJhbmdlIHRvIDAtMTUuCisJCQlsID0gKHJsICogMTMgKyA1KSAvIDI7CisJCX0KKworCQlpZiAocmwgPCAzKSB7CisJCQl0ZW1wMSA9IDB4ODAwMDsKKwkJCXJsID0gMDsKKwkJfSBlbHNlCisJCQl0ZW1wMSA9IDA7CisJCXJsID0gMTUgLSBybDsJLy8gQ29udmVydCB2b2x1bWUgdG8gYXR0ZW51YXRpb24uCisJCXRlbXAxIHw9IHJsIDw8IDE7CisJCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X1BDX0JFRVBfVk9MVU1FLCB0ZW1wMSk7CisKKyNpZmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKwkJcy0+bWl4LnZvbFs2XSA9IGwgPDwgODsKKyNlbHNlCisJCXMtPm1peC52b2xbNl0gPSB2YWw7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbNl0sIChpbnQgX191c2VyICopYXJncCk7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOworCQlyID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCWlmIChyID4gMTAwKQorCQkJciA9IDEwMDsKKwkJcmwgPSAobCAqIDIgLSA1KSAvIDEzOwkvLyBDb252ZXJ0IDAtMTAwIHNjYWxlIHRvIDAtMTUuCisJCXJyID0gKHIgKiAyIC0gNSkgLyAxMzsKKwkJaWYgKHJsIDwgMyAmJiByciA8IDMpCisJCQl0ZW1wMSA9IDB4ODAwMDsKKwkJZWxzZQorCQkJdGVtcDEgPSAwOworCisJCXRlbXAxID0gdGVtcDEgfCAocmwgPDwgOCkgfCBycjsKKwkJY3M0MjgxX3dyaXRlX2FjOTcocywgQkEwX0FDOTdfUkVDT1JEX0dBSU4sIHRlbXAxKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sWzddID0gKCh1bnNpZ25lZCBpbnQpIHIgPDwgOCkgfCBsOworI2Vsc2UKKwkJcy0+bWl4LnZvbFs3XSA9IHZhbDsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFs3XSwgKGludCBfX3VzZXIgKilhcmdwKTsKKworCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCWlmIChsIDwgMSkgeworCQkJbCA9IDA7CisJCQlybCA9IDA7CisJCX0gZWxzZSB7CisJCQlybCA9ICgodW5zaWduZWQpIGwgKiA1IC0gNCkgLyAxNjsJLy8gQ29udmVydCAwLTEwMCByYW5nZSB0byAwLTMxLgorCQkJbCA9IChybCAqIDE2ICsgNCkgLyA1OworCQl9CisJCWNzNDI4MV9yZWFkX2FjOTcocywgQkEwX0FDOTdfTUlDX1ZPTFVNRSwgJnRlbXAxKTsKKwkJdGVtcDEgJj0gMHg0MDsJLy8gSXNvbGF0ZSAyMGRiIGdhaW4gYml0LgorCQlpZiAocmwgPCAzKSB7CisJCQl0ZW1wMSB8PSAweDgwMDA7CisJCQlybCA9IDA7CisJCX0KKwkJcmwgPSAzMSAtIHJsOwkvLyBDb252ZXJ0IHZvbHVtZSB0byBhdHRlbnVhdGlvbi4KKwkJdGVtcDEgfD0gcmw7CisJCWNzNDI4MV93cml0ZV9hYzk3KHMsIEJBMF9BQzk3X01JQ19WT0xVTUUsIHRlbXAxKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sWzVdID0gdmFsIDw8IDg7CisjZWxzZQorCQlzLT5taXgudm9sWzVdID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzVdLCAoaW50IF9fdXNlciAqKWFyZ3ApOworCisKKwljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZ3ApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJncCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJciA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlpZiAociA+IDEwMCkKKwkJCXIgPSAxMDA7CisJCXJsID0gKGwgKiAyIC0gMTEpIC8gMzsJLy8gQ29udmVydCAwLTEwMCByYW5nZSB0byAwLTYzLgorCQlyciA9IChyICogMiAtIDExKSAvIDM7CisJCWlmIChybCA8IDMpCS8vIElmIGwgaXMgbG93LCB0dXJuIG9uCisJCQl0ZW1wMSA9IDB4MDA4MDsJLy8gIHRoZSBtdXRlIGJpdC4KKwkJZWxzZQorCQkJdGVtcDEgPSAwOworCisJCXJsID0gNjMgLSBybDsJLy8gQ29udmVydCB2b2wgdG8gYXR0ZW51YXRpb24uCisJCXdyaXRlbCh0ZW1wMSB8IHJsLCBzLT5wQkEwICsgQkEwX0ZNTFZDKTsKKwkJaWYgKHJyIDwgMykJLy8gIElmIHJyIGlzIGxvdywgdHVybiBvbgorCQkJdGVtcDEgPSAweDAwODA7CS8vICAgdGhlIG11dGUgYml0LgorCQllbHNlCisJCQl0ZW1wMSA9IDA7CisJCXJyID0gNjMgLSBycjsJLy8gQ29udmVydCB2b2wgdG8gYXR0ZW51YXRpb24uCisJCXdyaXRlbCh0ZW1wMSB8IHJyLCBzLT5wQkEwICsgQkEwX0ZNUlZDKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sWzRdID0gKHIgPDwgOCkgfCBsOworI2Vsc2UKKwkJcy0+bWl4LnZvbFs0XSA9IHZhbDsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFs0XSwgKGludCBfX3VzZXIgKilhcmdwKTsKKworCisJZGVmYXVsdDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0MjgxOiBtaXhlcl9pb2N0bCgpOiBkZWZhdWx0XG4iKSk7CisKKwkJaSA9IF9JT0NfTlIoY21kKTsKKwkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmdwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOworCQlpZiAobCA8IDEpIHsKKwkJCWwgPSAwOworCQkJcmwgPSAzMTsKKwkJfSBlbHNlCisJCQlybCA9IChhdHRlbnRibFsobCAqIDEwKSAvIDEwMF0pID4+IDE7CisKKwkJciA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlpZiAociA+IDEwMCkKKwkJCXIgPSAxMDA7CisJCWlmIChyIDwgMSkgeworCQkJciA9IDA7CisJCQlyciA9IDMxOworCQl9IGVsc2UKKwkJCXJyID0gKGF0dGVudGJsWyhyICogMTApIC8gMTAwXSkgPj4gMTsKKwkJaWYgKChybCA+IDMwKSAmJiAocnIgPiAzMCkpCisJCQl0ZW1wMSA9IDB4ODAwMDsKKwkJZWxzZQorCQkJdGVtcDEgPSAwOworCQl0ZW1wMSA9IHRlbXAxIHwgKHJsIDw8IDgpIHwgcnI7CisJCWNzNDI4MV93cml0ZV9hYzk3KHMsIG1peHJlZ1t2aWR4IC0gMV0sIHRlbXAxKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sW3ZpZHggLSAxXSA9ICgodW5zaWduZWQgaW50KSByIDw8IDgpIHwgbDsKKyNlbHNlCisJCXMtPm1peC52b2xbdmlkeCAtIDFdID0gdmFsOworI2VuZGlmCisjaWZuZGVmIE5PVF9DUzQyODFfUE0KKwkJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoS0VSTl9JTkZPIAorCQkJIndyaXRlIGFjOTcgbWl4cmVnWyVkXT0weCV4IG1peC52b2xbXT0weCV4XG4iLCAKKwkJCQl2aWR4LTEsdGVtcDEscy0+bWl4LnZvbFt2aWR4LTFdKSk7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbdmlkeCAtIDFdLCAoaW50IF9fdXNlciAqKWFyZ3ApOworCX0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKK3N0YXRpYyBpbnQgY3M0MjgxX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcz1OVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgNCwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV9vcGVuX21peGRldigpK1xuIikpOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDI4MV9kZXZzKQorCXsKKwkJcyA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjczQyODFfc3RhdGUsIGxpc3QpOworCQlpZihzLT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisJaWYgKCFzKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiB8IENTX0VSUk9SLCAyLAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjczQyODFfb3Blbl9taXhkZXYoKS0gLUVOT0RFVlxuIikpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDQsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjczQyODFfb3Blbl9taXhkZXYoKS0gMFxuIikpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisKK3N0YXRpYyBpbnQgY3M0MjgxX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBjczQyODFfc3RhdGUgKnMgPQorCSAgICAoc3RydWN0IGNzNDI4MV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNzNDI4MV9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIG1peGVyX2lvY3RsKChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YSwgY21kLAorCQkJICAgYXJnKTsKK30KKworCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vICAgTWl4ZXIgZmlsZSBvcGVyYXRpb25zIHN0cnVjdC4KKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjczQyODFfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkgPSBub19sbHNlZWssCisJLmlvY3RsCSA9IGNzNDI4MV9pb2N0bF9taXhkZXYsCisJLm9wZW4JID0gY3M0MjgxX29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlID0gY3M0MjgxX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisKK3N0YXRpYyBpbnQgZHJhaW5fYWRjKHN0cnVjdCBjczQyODFfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudDsKKwl1bnNpZ25lZCB0bW87CisKKwlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCXJldHVybiAwOworCWFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGRyYWluX2FkYygpICVkXG4iLCBjb3VudCkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKSB7CisJCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCQkgImNzNDI4MTogZHJhaW5fYWRjKCkgY291bnQ8MFxuIikpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJCWlmIChub25ibG9jaykgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9hZGMud2FpdCwgJndhaXQpOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXRtbyA9CisJCSAgICAzICogSFogKiAoY291bnQgKworCQkJICAgICAgcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgLyAyIC8gcy0+cHJvcF9hZGMucmF0ZTsKKwkJaWYgKHMtPnByb3BfYWRjLmZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFKSkKKwkJCXRtbyA+Pj0gMTsKKwkJaWYgKHMtPnByb3BfYWRjLmNoYW5uZWxzID4gMSkKKwkJCXRtbyA+Pj0gMTsKKwkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyArIDEpKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgImNzNDI4MTogZG1hIHRpbWVkIG91dD8/XG4iKTsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9hZGMud2FpdCwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50OworCXVuc2lnbmVkIHRtbzsKKworCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJcmV0dXJuIDA7CisJYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworCWZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlpZiAobm9uYmxvY2spIHsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQl0bW8gPQorCQkgICAgMyAqIEhaICogKGNvdW50ICsKKwkJCSAgICAgIHMtPmRtYV9kYWMuZnJhZ3NpemUpIC8gMiAvIHMtPnByb3BfZGFjLnJhdGU7CisJCWlmIChzLT5wcm9wX2RhYy5mbXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSkpCisJCQl0bW8gPj49IDE7CisJCWlmIChzLT5wcm9wX2RhYy5jaGFubmVscyA+IDEpCisJCQl0bW8gPj49IDE7CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gKyAxKSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJjczQyODE6IGRtYSB0aW1lZCBvdXQ/P1xuIik7CisJfQorCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJcmV0dXJuIDA7Cit9CisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKy8vIENvcHlTYW1wbGVzIGNvcGllcyAxNi1iaXQgc3RlcmVvIHNhbXBsZXMgZnJvbSB0aGUgc291cmNlIHRvIHRoZQorLy8gZGVzdGluYXRpb24sIHBvc3NpYmx5IGNvbnZlcnRpbmcgZG93biB0byBlaXRoZXIgOC1iaXQgb3IgbW9ubyBvciBib3RoLgorLy8gY291bnQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzIHRvIHdyaXRlLgorLy8KKy8vICBBcmd1bWVudHM6CisvLworLy8gIGRzdCAgICAgICAgICAgICAtIFBvaW50ZXIgdG8gYSBkZXN0aW5hdGlvbiBidWZmZXIuCisvLyAgc3JjICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhIHNvdXJjZSBidWZmZXIKKy8vICBjb3VudCAgICAgICAgICAgLSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgaW50byB0aGUgZGVzdGluYXRpb24gYnVmZmVyLgorLy8gIGlDaGFubmVscyAgICAgICAtIFN0ZXJlbyAtIDIKKy8vICAgICAgICAgICAgICAgICAgICBNb25vICAgLSAxCisvLyAgZm10ICAgICAgICAgICAgIC0gQUZNVF94eHggKHNvdW5kY2FyZC5oIGZvcm1hdHMpCisvLworLy8gTk9URVM6IG9ubHkgY2FsbCB0aGlzIHJvdXRpbmUgZm9yIGNvbnZlcnNpb24gdG8gOGJpdCBmcm9tIDE2Yml0CisvLworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgdm9pZCBDb3B5U2FtcGxlcyhjaGFyICpkc3QsIGNoYXIgKnNyYywgaW50IGNvdW50LCBpbnQgaUNoYW5uZWxzLAorCQkJdW5zaWduZWQgZm10KQoreworCisJdW5zaWduZWQgc2hvcnQgKnBzU3JjOworCWxvbmcgbEF1ZGlvU2FtcGxlOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogQ29weVNhbXBsZXMoKSsgIikpOworCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJICIgZHN0PSVwIHNyYz0lcCBjb3VudD0lZCBpQ2hhbm5lbHM9JWQgZm10PTB4JXhcbiIsCisJCQkgZHN0LCBzcmMsICh1bnNpZ25lZCkgY291bnQsICh1bnNpZ25lZCkgaUNoYW5uZWxzLCAodW5zaWduZWQpIGZtdCkpOworCisJLy8gR2Vyc2h3aW4gZG9lcyBmb3JtYXQgY29udmVyc2lvbiBpbiBoYXJkd2FyZSBzbyBub3JtYWxseQorCS8vIHdlIGRvbid0IGRvIGFueSBob3N0IGJhc2VkIGNvdmVyc2lvbi4gVGhlIGRhdGEgZm9ybWF0dGVyCisJLy8gdHJ1bmNhdGVzIDE2IGJpdCBkYXRhIHRvIDggYml0IGFuZCB0aGF0IGNhdXNlcyBzb21lIGhpc3MuCisJLy8gV2UgaGF2ZSBhbHJlYWR5IGZvcmNlZCB0aGUgSFcgdG8gZG8gMTYgYml0IHNhbXBsaW5nIGFuZCAKKwkvLyAyIGNoYW5uZWwgc28gdGhhdCB3ZSBjYW4gdXNlIHNvZnR3YXJlIHRvIHJvdW5kIGluc3RlYWQgCisJLy8gb2YgdHJ1bmNhdGUKKworCS8vCisJLy8gU2VlIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXMgOC1iaXQgdW5zaWduZWQgc3RlcmVvLgorCS8vIG9yIGlmIHRoZSBkYXRhIHNob3VsZCBiZSBvdXRwdXQgYXQgOC1iaXQgdW5zaWduZWQgbW9uby4KKwkvLworCWlmICggKChpQ2hhbm5lbHMgPT0gMikgJiYgKGZtdCAmIEFGTVRfVTgpKSB8fAorCQkoKGlDaGFubmVscyA9PSAxKSAmJiAoZm10ICYgQUZNVF9VOCkpICkgeworCQkvLworCQkvLyBDb252ZXJ0IGVhY2ggMTYtYml0IHVuc2lnbmVkIHN0ZXJlbyBzYW1wbGUgdG8gOC1iaXQgdW5zaWduZWQgCisJCS8vIHN0ZXJlbyB1c2luZyByb3VuZGluZy4KKwkJLy8KKwkJcHNTcmMgPSAodW5zaWduZWQgc2hvcnQgKikgc3JjOworCQljb3VudCA9IGNvdW50IC8gMjsKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCWxBdWRpb1NhbXBsZSA9IChsb25nKSBwc1NyY1tjb3VudF0gKyAobG9uZykgMHg4MDsKKwkJCWlmIChsQXVkaW9TYW1wbGUgPiAweGZmZmYpIHsKKwkJCQlsQXVkaW9TYW1wbGUgPSAweGZmZmY7CisJCQl9CisJCQlkc3RbY291bnRdID0gKGNoYXIpIChsQXVkaW9TYW1wbGUgPj4gOCk7CisJCX0KKwl9CisJLy8KKwkvLyBjaGVjayBmb3IgOC1iaXQgc2lnbmVkIHN0ZXJlby4KKwkvLworCWVsc2UgaWYgKChpQ2hhbm5lbHMgPT0gMikgJiYgKGZtdCAmIEFGTVRfUzgpKSB7CisJCS8vCisJCS8vIENvbnZlcnQgZWFjaCAxNi1iaXQgc3RlcmVvIHNhbXBsZSB0byA4LWJpdCBzdGVyZW8gdXNpbmcgcm91bmRpbmcuCisJCS8vCisJCXBzU3JjID0gKHNob3J0ICopIHNyYzsKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCWxBdWRpb1NhbXBsZSA9CisJCQkgICAgKCgobG9uZykgcHNTcmNbMF0gKyAobG9uZykgcHNTcmNbMV0pIC8gMik7CisJCQlwc1NyYyArPSAyOworCQkJKmRzdCsrID0gKGNoYXIpICgoc2hvcnQpIGxBdWRpb1NhbXBsZSA+PiA4KTsKKwkJfQorCX0KKwkvLworCS8vIE90aGVyd2lzZSwgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhcyA4LWJpdCBzaWduZWQgbW9uby4KKwkvLworCWVsc2UgaWYgKChpQ2hhbm5lbHMgPT0gMSkgJiYgKGZtdCAmIEFGTVRfUzgpKSB7CisJCS8vCisJCS8vIENvbnZlcnQgZWFjaCAxNi1iaXQgc2lnbmVkIG1vbm8gc2FtcGxlIHRvIDgtYml0IHNpZ25lZCBtb25vIAorCQkvLyB1c2luZyByb3VuZGluZy4KKwkJLy8KKwkJcHNTcmMgPSAoc2hvcnQgKikgc3JjOworCQljb3VudCA9IGNvdW50IC8gMjsKKwkJd2hpbGUgKGNvdW50LS0pIHsKKwkJCWxBdWRpb1NhbXBsZSA9CisJCQkgICAgKCgobG9uZykgcHNTcmNbMF0gKyAobG9uZykgcHNTcmNbMV0pIC8gMik7CisJCQlpZiAobEF1ZGlvU2FtcGxlID4gMHg3ZmZmKSB7CisJCQkJbEF1ZGlvU2FtcGxlID0gMHg3ZmZmOworCQkJfQorCQkJcHNTcmMgKz0gMjsKKwkJCSpkc3QrKyA9IChjaGFyKSAoKHNob3J0KSBsQXVkaW9TYW1wbGUgPj4gOCk7CisJCX0KKwl9Cit9CisKKy8vCisvLyBjc19jb3B5X3RvX3VzZXIoKQorLy8gcmVwbGFjZW1lbnQgZm9yIHRoZSBzdGFuZGFyZCBjb3B5X3RvX3VzZXIsIHRvIGFsbG93IGZvciBhIGNvbnZlcnNpb24gZnJvbQorLy8gMTYgYml0IHRvIDggYml0IGlmIHRoZSByZWNvcmQgY29udmVyc2lvbiBpcyBhY3RpdmUuICB0aGUgY3M0MjgxIGhhcyBzb21lCisvLyBpc3N1ZXMgd2l0aCA4IGJpdCBjYXB0dXJlLCBzbyB0aGUgZHJpdmVyIGFsd2F5cyBjYXB0dXJlcyBkYXRhIGluIDE2IGJpdAorLy8gYW5kIHRoZW4gaWYgdGhlIHVzZXIgcmVxdWVzdGVkIDggYml0LCBjb252ZXJ0cyBmcm9tIDE2IHRvIDggYml0LgorLy8KK3N0YXRpYyB1bnNpZ25lZCBjc19jb3B5X3RvX3VzZXIoc3RydWN0IGNzNDI4MV9zdGF0ZSAqcywgdm9pZCBfX3VzZXIgKmRlc3QsCisJCQkJdW5zaWduZWQgKmh3c3JjLCB1bnNpZ25lZCBjbnQsCisJCQkJdW5zaWduZWQgKmNvcGllZCkKK3sKKwl2b2lkICpzcmMgPSBod3NyYzsJLy9kZWZhdWx0IHRvIHRoZSBzdGFuZGFyZCBkZXN0aW5hdGlvbiBidWZmZXIgYWRkcgorCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA2LCBwcmludGsoS0VSTl9JTkZPCisJCSJjc19jb3B5X3RvX3VzZXIoKSsgZm10PTB4JXggZm10X289MHgleCBjbnQ9JWQgZGVzdD0lcFxuIiwKKwkJCXMtPnByb3BfYWRjLmZtdCwgcy0+cHJvcF9hZGMuZm10X29yaWdpbmFsLAorCQkJKHVuc2lnbmVkKSBjbnQsIGRlc3QpKTsKKworCWlmIChjbnQgPiBzLT5kbWFfYWRjLmRtYXNpemUpIHsKKwkJY250ID0gcy0+ZG1hX2FkYy5kbWFzaXplOworCX0KKwlpZiAoIWNudCkgeworCQkqY29waWVkID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzLT5jb252ZXJzaW9uKSB7CisJCWlmICghcy0+dG1wYnVmZikgeworCQkJKmNvcGllZCA9IGNudCAvIDI7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlDb3B5U2FtcGxlcyhzLT50bXBidWZmLCAodm9pZCAqKSBod3NyYywgY250LAorCQkJICAgICh1bnNpZ25lZCkgcy0+cHJvcF9hZGMuY2hhbm5lbHMsCisJCQkgICAgcy0+cHJvcF9hZGMuZm10X29yaWdpbmFsKTsKKwkJc3JjID0gcy0+dG1wYnVmZjsKKwkJY250ID0gY250IC8gMjsKKwl9CisKKwlpZiAoY29weV90b191c2VyKGRlc3QsIHNyYywgY250KSkgeworCQkqY29waWVkID0gMDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCSpjb3BpZWQgPSBjbnQ7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQyODE6IGNzX2NvcHlfdG9fdXNlcigpLSBjb3BpZWQgYnl0ZXMgaXMgJWQgXG4iLCBjbnQpKTsKKwlyZXR1cm4gMDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCitzdGF0aWMgc3NpemVfdCBjczQyODFfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LAorCQkJICAgbG9mZl90ICogcHBvcykKK3sKKwlzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzID0KKwkgICAgKHN0cnVjdCBjczQyODFfc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKwl1bnNpZ25lZCBjb3BpZWQgPSAwOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9SRUFELCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3M0MjgxX3JlYWQoKSsgJVp1IFxuIiwgY291bnQpKTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKy8vCisvLyAiY291bnQiIGlzIHRoZSBhbW91bnQgb2YgYnl0ZXMgdG8gcmVhZCAoZnJvbSBhcHApLCBpcyBkZWNyZW1lbnRlZCBlYWNoIGxvb3AKKy8vICAgICAgYnkgdGhlIGFtb3VudCBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiByZXR1cm5lZCB0byB0aGUgdXNlciBidWZmZXIuCisvLyAiY250IiBpcyB0aGUgcnVubmluZyB0b3RhbCBvZiBlYWNoIHJlYWQgZnJvbSB0aGUgYnVmZmVyIChjaGFuZ2VzIGVhY2ggbG9vcCkKKy8vICJidWZmZXIiIHBvaW50cyB0byB0aGUgYXBwJ3MgYnVmZmVyCisvLyAicmV0IiBrZWVwcyBhIHJ1bm5pbmcgdG90YWwgb2YgdGhlIGFtb3VudCBvZiBieXRlcyB0aGF0IGhhdmUgYmVlbiBjb3BpZWQKKy8vICAgICAgdG8gdGhlIHVzZXIgYnVmZmVyLgorLy8gImNvcGllZCIgaXMgdGhlIHRvdGFsIGJ5dGVzIGNvcGllZCBpbnRvIHRoZSB1c2VyIGJ1ZmZlciBmb3IgZWFjaCBsb29wLgorLy8KKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJCSJfcmVhZCgpIGNvdW50PjAgY291bnQ9JVp1IC5jb3VudD0lZCAuc3dwdHI9JWQgLmh3cHRyPSVkIFxuIiwKKwkJCQljb3VudCwgcy0+ZG1hX2FkYy5jb3VudCwKKwkJCQlzLT5kbWFfYWRjLnN3cHRyLCBzLT5kbWFfYWRjLmh3cHRyKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkJLy8gZ2V0IHRoZSBjdXJyZW50IGNvcHkgcG9pbnQgb2YgdGhlIHN3IGJ1ZmZlcgorCQlzd3B0ciA9IHMtPmRtYV9hZGMuc3dwdHI7CisKKwkJLy8gY250IGlzIHRoZSBhbW91bnQgb2YgdW5yZWFkIGJ5dGVzIGZyb20gdGhlIGVuZCBvZiB0aGUgCisJCS8vIGh3IGJ1ZmZlciB0byB0aGUgY3VycmVudCBzdyBwb2ludGVyCisJCWNudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZSAtIHN3cHRyOworCisJCS8vIGRtYV9hZGMuY291bnQgaXMgdGhlIGN1cnJlbnQgdG90YWwgYnl0ZXMgdGhhdCBoYXZlIG5vdCBiZWVuIHJlYWQuCisJCS8vIGlmIHRoZSBhbW91bnQgb2YgdW5yZWFkIGJ5dGVzIGZyb20gdGhlIGN1cnJlbnQgc3cgcG9pbnRlciB0byB0aGUKKwkJLy8gZW5kIG9mIHRoZSBidWZmZXIgaXMgZ3JlYXRlciB0aGFuIHRoZSBjdXJyZW50IHRvdGFsIGJ5dGVzIHRoYXQKKwkJLy8gaGF2ZSBub3QgYmVlbiByZWFkLCB0aGVuIHNldCB0aGUgImNudCIgKHVucmVhZCBieXRlcykgdG8gdGhlCisJCS8vIGFtb3VudCBvZiB1bnJlYWQgYnl0ZXMuICAKKworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA8IGNudCkKKwkJCWNudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJLy8KKwkJLy8gaWYgd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSA4LzE2IHRoZW4gd2UgbmVlZCB0byBjb3B5CisJCS8vIHR3aWNlIHRoZSBudW1iZXIgb2YgMTYgYml0IGJ5dGVzIHRoZW4gOCBiaXQgYnl0ZXMuCisJCS8vIAorCQlpZiAocy0+Y29udmVyc2lvbikgeworCQkJaWYgKGNudCA+IChjb3VudCAqIDIpKQorCQkJCWNudCA9IChjb3VudCAqIDIpOworCQl9IGVsc2UgeworCQkJaWYgKGNudCA+IGNvdW50KQorCQkJCWNudCA9IGNvdW50OworCQl9CisJCS8vCisJCS8vICJjbnQiIE5PVyBpcyB0aGUgc21hbGxlciBvZiB0aGUgYW1vdW50IHRoYXQgd2lsbCBiZSByZWFkLAorCQkvLyBhbmQgdGhlIGFtb3VudCB0aGF0IGlzIHJlcXVlc3RlZCBpbiB0aGlzIHJlYWQgKG9yIHBhcnRpYWwpLgorCQkvLyBpZiB0aGVyZSBhcmUgbm8gYnl0ZXMgaW4gdGhlIGJ1ZmZlciB0byByZWFkLCB0aGVuIHN0YXJ0IHRoZQorCQkvLyBBREMgYW5kIHdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byB3YWtlIHVzIHVwLgorCQkvLworCQlpZiAoY250IDw9IDApIHsKKworCQkJLy8gc3RhcnQgdXAgdGhlIGRtYSBlbmdpbmUgYW5kIHRoZW4gY29udGludWUgYmFjayB0byB0aGUgdG9wIG9mCisJCQkvLyB0aGUgbG9vcCB3aGVuIHdha2UgdXAgb2NjdXJzLgorCQkJc3RhcnRfYWRjKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcy0+ZG1hX2FkYy53YWl0KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCQkJY29udGludWU7CisJCX0KKwkJLy8gdGhlcmUgYXJlIGJ5dGVzIGluIHRoZSBidWZmZXIgdG8gcmVhZC4KKwkJLy8gY29weSBmcm9tIHRoZSBodyBidWZmZXIgb3ZlciB0byB0aGUgdXNlciBidWZmZXIuCisJCS8vIHVzZXIgYnVmZmVyIGlzIGRlc2lnbmF0ZWQgYnkgImJ1ZmZlciIKKwkJLy8gdmlydHVhbCBhZGRyZXNzIHRvIGNvcHkgZnJvbSBpcyByYXdidWYrc3dwdHIKKwkJLy8gdGhlICJjbnQiIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKworCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkiX3JlYWQoKSBjb3B5X3RvIGNudD0lZCBjb3VudD0lWnUgIiwgY250LCBjb3VudCkpOworCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPCisJCQkgIiAuZG1hc2l6ZT0lZCAuY291bnQ9JWQgYnVmZmVyPSVwIHJldD0lWmRcbiIsCisJCQkJIHMtPmRtYV9hZGMuZG1hc2l6ZSwgcy0+ZG1hX2FkYy5jb3VudCwgYnVmZmVyLCByZXQpKTsKKworCQlpZiAoY3NfY29weV90b191c2VyCisJCSAgICAocywgYnVmZmVyLCBzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyLCBjbnQsICZjb3BpZWQpKQorCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+ZG1hX2FkYy5zd3B0ciA9IHN3cHRyOworCQlzLT5kbWFfYWRjLmNvdW50IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjb3BpZWQ7CisJCWJ1ZmZlciArPSBjb3BpZWQ7CisJCXJldCArPSBjb3BpZWQ7CisJCXN0YXJ0X2FkYyhzKTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9SRUFELCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3M0MjgxX3JlYWQoKS0gJVpkXG4iLCByZXQpKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBzc2l6ZV90IGNzNDI4MV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyLCBod3B0ciwgYnVzYWRkcjsKKwlpbnQgY250OworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9XUklURSwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV93cml0ZSgpKyBjb3VudD0lWnVcbiIsCisJCQkgY291bnQpKTsKKwlWQUxJREFURV9TVEFURShzKTsKKworCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSAwOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHMtPmRtYV9kYWMuY291bnQgPCAwKSB7CisJCQlzLT5kbWFfZGFjLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyOworCQl9CisJCWlmIChzLT5kbWFfZGFjLnVuZGVycnVuKSB7CisJCQlzLT5kbWFfZGFjLnVuZGVycnVuID0gMDsKKwkJCWh3cHRyID0gcmVhZGwocy0+cEJBMCArIEJBMF9EQ0EwKTsKKwkJCWJ1c2FkZHIgPSB2aXJ0X3RvX2J1cyhzLT5kbWFfZGFjLnJhd2J1Zik7CisJCQlod3B0ciAtPSAodW5zaWduZWQpIGJ1c2FkZHI7CisJCQlzLT5kbWFfZGFjLnN3cHRyID0gcy0+ZG1hX2RhYy5od3B0ciA9IGh3cHRyOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gc3dwdHI7CisJCWlmIChzLT5kbWFfZGFjLmNvdW50ICsgY250ID4gcy0+ZG1hX2RhYy5kbWFzaXplKQorCQkJY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlzdGFydF9kYWMocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5kbWFfZGFjLndhaXQpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKQorCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+ZG1hX2RhYy5zd3B0ciA9IHN3cHRyOworCQlzLT5kbWFfZGFjLmNvdW50ICs9IGNudDsKKwkJcy0+ZG1hX2RhYy5lbmRjbGVhcmVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCXN0YXJ0X2RhYyhzKTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9XUklURSwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV93cml0ZSgpLSAlWmRcbiIsIHJldCkpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCBjczQyODFfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQlzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1dBVkVfV1JJVEUgfCBDU19XQVZFX1JFQUQsIDQsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjczQyODFfcG9sbCgpK1xuIikpOworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19XQVZFX1dSSVRFIHwgQ1NfV0FWRV9SRUFELCA0LAorCQkJICBwcmludGsoS0VSTl9JTkZPCisJCQkJICJjczQyODE6IGNzNDI4MV9wb2xsKCkgd2FpdCBvbiBGTU9ERV9XUklURVxuIikpOworCQlpZighcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9kYWMocykpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfZGFjLndhaXQsIHdhaXQpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19XQVZFX1dSSVRFIHwgQ1NfV0FWRV9SRUFELCA0LAorCQkJICBwcmludGsoS0VSTl9JTkZPCisJCQkJICJjczQyODE6IGNzNDI4MV9wb2xsKCkgd2FpdCBvbiBGTU9ERV9SRUFEXG4iKSk7CisJCWlmKCFzLT5kbWFfZGFjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2FkYyhzKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJY3M0MjgxX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkgeworCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPj0KKwkJCSAgICAoc2lnbmVkKSBzLT5kbWFfZGFjLmZyYWdzaXplKSB7CisJCQkJaWYgKHMtPmRtYV9kYWMud2FrZXVwKQorCQkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQkJCWVsc2UKKwkJCQkJbWFzayA9IDA7CisJCQkJcy0+ZG1hX2RhYy53YWtldXAgPSAwOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKChzaWduZWQpIChzLT5kbWFfZGFjLmRtYXNpemUvMikgPj0gcy0+ZG1hX2RhYy5jb3VudCkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9CisJfSBlbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkgeworCQkJaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZCkgcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgCisJCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQl9IGVsc2UgeworCQkJaWYgKHMtPmRtYV9hZGMuY291bnQgPiAwKQorCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9XUklURSB8IENTX1dBVkVfUkVBRCwgNCwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV9wb2xsKCktIDB4JS44eFxuIiwKKwkJCSBtYXNrKSk7CisJcmV0dXJuIG1hc2s7Cit9CisKKworc3RhdGljIGludCBjczQyODFfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1BBUk1TIHwgQ1NfT1BFTiwgNCwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV9tbWFwKCkrXG4iKSk7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwkJZGIgPSAmcy0+ZG1hX2RhYzsKKwl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSAhPSAwKQorCQkJcmV0dXJuIHJldDsKKwkJZGIgPSAmcy0+ZG1hX2FkYzsKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7CisvLworLy8gb25seSBzdXBwb3J0IFBMQVlCQUNLIGZvciBub3cKKy8vCisJZGIgPSAmcy0+ZG1hX2RhYzsKKworCWlmIChjczR4X3Bnb2ZmKHZtYSkgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJdmlydF90b19waHlzKGRiLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlkYi0+bWFwcGVkID0gMTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1BBUk1TIHwgQ1NfT1BFTiwgNCwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyODE6IGNzNDI4MV9tbWFwKCktIDAgc2l6ZT0lZFxuIiwKKwkJCSAodW5zaWduZWQpIHNpemUpKTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY3M0MjgxX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKwljb3VudF9pbmZvIGNpbmZvOworCWludCB2YWwsIG1hcHBlZCwgcmV0OworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkgImNzNDI4MTogY3M0MjgxX2lvY3RsKCk6IGZpbGU9JXAgY21kPTB4JS44eFxuIiwgZmlsZSwgY21kKSk7CisjaWYgQ1NERUJVRworCWNzX3ByaW50aW9jdGwoY21kKTsKKyNlbmRpZgorCVZBTElEQVRFX1NUQVRFKHMpOworCW1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIHMtPmRtYV9kYWMubWFwcGVkKSB8fAorCSAgICAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIHMtPmRtYV9hZGMubWFwcGVkKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogU09VTkRfVkVSU0lPTj0weCUuOHhcbiIsCisJCQkJIFNPVU5EX1ZFUlNJT04pKTsKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyODE6IGNzNDI4MV9pb2N0bCgpOiBEU1BfU1lOQ1xuIikpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gZHJhaW5fZGFjKHMsCisJCQkJCSAwIC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sgKi8KKwkJCQkJICk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8CisJCQkJRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLAorCQkJCXApOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogRFNQX1JFU0VUXG4iKSk7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyID0KKwkJCSAgICBzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9CisJCQkgICAgcy0+ZG1hX2RhYy5ibG9ja3MgPSBzLT5kbWFfZGFjLndha2V1cCA9IDA7CisJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfREFDKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0KKwkJCSAgICBzLT5kbWFfYWRjLmNvdW50ID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9CisJCQkgICAgcy0+ZG1hX2FkYy5ibG9ja3MgPSBzLT5kbWFfZGFjLndha2V1cCA9IDA7CisJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfQURDKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogRFNQX1NQRUVEIHZhbD0lZFxuIiwgdmFsKSk7CisJCS8vCisJCS8vIHN1cHBvcnQgaW5kZXBlbmRlbnQgY2FwdHVyZSBhbmQgcGxheWJhY2sgY2hhbm5lbHMKKwkJLy8gYXNzdW1lIHRoYXQgdGhlIGZpbGUgbW9kZSBiaXQgZGV0ZXJtaW5lcyB0aGUgCisJCS8vIGRpcmVjdGlvbiBvZiB0aGUgZGF0YSBmbG93LgorCQkvLworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCA+PSAwKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJLy8gcHJvZ3JhbSBzYW1wbGluZyByYXRlcyAKKwkJCQlpZiAodmFsID4gNDgwMDApCisJCQkJCXZhbCA9IDQ4MDAwOworCQkJCWlmICh2YWwgPCA2MzAwKQorCQkJCQl2YWwgPSA2MzAwOworCQkJCXMtPnByb3BfYWRjLnJhdGUgPSB2YWw7CisJCQkJcHJvZ19jb2RlYyhzLCBDU19UWVBFX0FEQyk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsID49IDApIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQkvLyBwcm9ncmFtIHNhbXBsaW5nIHJhdGVzIAorCQkJCWlmICh2YWwgPiA0ODAwMCkKKwkJCQkJdmFsID0gNDgwMDA7CisJCQkJaWYgKHZhbCA8IDYzMDApCisJCQkJCXZhbCA9IDYzMDA7CisJCQkJcy0+cHJvcF9kYWMucmF0ZSA9IHZhbDsKKwkJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfREFDKTsKKwkJCX0KKwkJfQorCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXZhbCA9IHMtPnByb3BfZGFjLnJhdGU7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQl2YWwgPSBzLT5wcm9wX2FkYy5yYXRlOworCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogRFNQX1NURVJFTyB2YWw9JWRcbiIsIHZhbCkpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCXMtPnByb3BfYWRjLmNoYW5uZWxzID0gdmFsID8gMiA6IDE7CisJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfQURDKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IHZhbCA/IDIgOiAxOworCQkJcHJvZ19jb2RlYyhzLCBDU19UWVBFX0RBQyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDI4MTogY3M0MjgxX2lvY3RsKCk6IERTUF9DSEFOTkVMUyB2YWw9JWRcbiIsCisJCQkJIHZhbCkpOworCQlpZiAodmFsICE9IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlzLT5wcm9wX2FkYy5jaGFubmVscyA9IDI7CisJCQkJZWxzZQorCQkJCQlzLT5wcm9wX2FkYy5jaGFubmVscyA9IDE7CisJCQkJcHJvZ19jb2RlYyhzLCBDU19UWVBFX0FEQyk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsID49IDIpCisJCQkJCXMtPnByb3BfZGFjLmNoYW5uZWxzID0gMjsKKwkJCQllbHNlCisJCQkJCXMtPnByb3BfZGFjLmNoYW5uZWxzID0gMTsKKwkJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfREFDKTsKKwkJCX0KKwkJfQorCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXZhbCA9IHMtPnByb3BfZGFjLmNoYW5uZWxzOworCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJdmFsID0gcy0+cHJvcF9hZGMuY2hhbm5lbHM7CisKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzoJLy8gUmV0dXJucyBhIG1hc2sgCisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogRFNQX0dFVEZNVCB2YWw9MHglLjh4XG4iLAorCQkJCSBBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TOCB8CisJCQkJIEFGTVRfVTgpKTsKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUgfCBBRk1UX1M4IHwKKwkJCQlBRk1UX1U4LCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDI4MTogY3M0MjgxX2lvY3RsKCk6IERTUF9TRVRGTVQgdmFsPTB4JS44eFxuIiwKKwkJCQkgdmFsKSk7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsICE9IEFGTVRfUzE2X0xFCisJCQkJICAgICYmIHZhbCAhPSBBRk1UX1UxNl9MRSAmJiB2YWwgIT0gQUZNVF9TOAorCQkJCSAgICAmJiB2YWwgIT0gQUZNVF9VOCkKKwkJCQkJdmFsID0gQUZNVF9VODsKKwkJCQlzLT5wcm9wX2FkYy5mbXQgPSB2YWw7CisJCQkJcy0+cHJvcF9hZGMuZm10X29yaWdpbmFsID0gcy0+cHJvcF9hZGMuZm10OworCQkJCXByb2dfY29kZWMocywgQ1NfVFlQRV9BREMpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMocyk7CisJCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCAhPSBBRk1UX1MxNl9MRQorCQkJCSAgICAmJiB2YWwgIT0gQUZNVF9VMTZfTEUgJiYgdmFsICE9IEFGTVRfUzgKKwkJCQkgICAgJiYgdmFsICE9IEFGTVRfVTgpCisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJcy0+cHJvcF9kYWMuZm10ID0gdmFsOworCQkJCXMtPnByb3BfZGFjLmZtdF9vcmlnaW5hbCA9IHMtPnByb3BfZGFjLmZtdDsKKwkJCQlwcm9nX2NvZGVjKHMsIENTX1RZUEVfREFDKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCQl2YWwgPSBzLT5wcm9wX2RhYy5mbXRfb3JpZ2luYWw7CisJCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCXZhbCA9IHMtPnByb3BfYWRjLmZtdF9vcmlnaW5hbDsKKwkJfQorCQlDU19EQkdPVVQoQ1NfSU9DVEwgfCBDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkgICJjczQyODE6IGNzNDI4MV9pb2N0bCgpOiBEU1BfU0VURk1UIHJldHVybiB2YWw9MHglLjh4XG4iLCAKKwkJCXZhbCkpOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0MjgxOiBjczQyODFfaW9jdGwoKTogRFNQX1BPU1RcbiIpKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIHMtPmVuYSAmIEZNT0RFX1JFQUQpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIHMtPmVuYSAmIEZNT0RFX1dSSVRFKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkKKwkJCQkgICAgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9hZGMocyk7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkKKwkJCQkgICAgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJc3RhcnRfZGFjKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9kYWMocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY3M0MjgxX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJCWFiaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJZWxzZQorCQkJYWJpbmZvLmJ5dGVzID0KKwkJCSAgICBzLT5kbWFfZGFjLmRtYXNpemUgLSBzLT5kbWFfZGFjLmNvdW50OworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMubnVtZnJhZzsKKwkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyODE6IGNzNDI4MV9pb2N0bCgpOiBHRVRPU1BBQ0UgLmZyYWdzaXplPSVkIC5ieXRlcz0lZCAuZnJhZ3N0b3RhbD0lZCAuZnJhZ21lbnRzPSVkXG4iLAorCQkJCWFiaW5mby5mcmFnc2l6ZSxhYmluZm8uYnl0ZXMsYWJpbmZvLmZyYWdzdG90YWwsCisJCQkJYWJpbmZvLmZyYWdtZW50cykpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIocCwgJmFiaW5mbywKKwkJCQkgICAgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyODFfdXBkYXRlX3B0cihzLENTX0ZBTFNFKTsKKwkJaWYgKHMtPmNvbnZlcnNpb24pIHsKKwkJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ3NpemUgLyAyOworCQkJYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy5jb3VudCAvIDI7CisJCQlhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9hZGMubnVtZnJhZzsKKwkJCWFiaW5mby5mcmFnbWVudHMgPQorCQkJICAgIGFiaW5mby5ieXRlcyA+PiAocy0+ZG1hX2FkYy5mcmFnc2hpZnQgLSAxKTsKKwkJfSBlbHNlIHsKKwkJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ3NpemU7CisJCQlhYmluZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLmNvdW50OworCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bWZyYWc7CisJCQlhYmluZm8uZnJhZ21lbnRzID0KKwkJCSAgICBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKHAsICZhYmluZm8sCisJCQkJICAgIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmKCFzLT5kbWFfZGFjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYyhzKSkKKwkJCXJldHVybiAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyODFfdXBkYXRlX3B0cihzLENTX0ZBTFNFKTsKKwkJdmFsID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZighcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9hZGMocykpCisJCQlyZXR1cm4gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY3M0MjgxX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCWNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQljaW5mby5ibG9ja3MgPQorCQkJICAgIChjaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdCkgLQorCQkJICAgIHMtPmRtYV9hZGMuYmxvY2tzOworCQkJcy0+ZG1hX2FkYy5ibG9ja3MgPQorCQkJICAgIGNpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworCQl9IGVsc2UgeworCQkJaWYgKHMtPmNvbnZlcnNpb24pIHsKKwkJCQljaW5mby5ibG9ja3MgPQorCQkJCSAgICBzLT5kbWFfYWRjLmNvdW50IC8KKwkJCQkgICAgMiA+PiAocy0+ZG1hX2FkYy5mcmFnc2hpZnQgLSAxKTsKKwkJCX0gZWxzZQorCQkJCWNpbmZvLmJsb2NrcyA9CisJCQkJICAgIHMtPmRtYV9hZGMuY291bnQgPj4gcy0+ZG1hX2FkYy4KKwkJCQkgICAgZnJhZ3NoaWZ0OworCQl9CisJCWlmIChzLT5jb252ZXJzaW9uKQorCQkJY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0ciAvIDI7CisJCWVsc2UKKwkJCWNpbmZvLnB0ciA9IHMtPmRtYV9hZGMuaHdwdHI7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZSAtIDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZighcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9kYWMocykpCisJCQlyZXR1cm4gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY3M0MjgxX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCWNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlczsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKSB7CisJCQljaW5mby5ibG9ja3MgPQorCQkJICAgIChjaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdCkgLQorCQkJICAgIHMtPmRtYV9kYWMuYmxvY2tzOworCQkJcy0+ZG1hX2RhYy5ibG9ja3MgPQorCQkJICAgIGNpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworCQl9IGVsc2UgeworCQkJY2luZm8uYmxvY2tzID0KKwkJCSAgICBzLT5kbWFfZGFjLmNvdW50ID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworCQl9CisJCWNpbmZvLnB0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJCXMtPmRtYV9kYWMuY291bnQgJj0gcy0+ZG1hX2RhYy5mcmFnc2l6ZSAtIDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiB2YWw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcCk7CisJCX0KKwkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJcmV0dXJuIHZhbDsKKwkJaWYgKHMtPmNvbnZlcnNpb24pCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSAvIDIsIHApOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOwkvLyBTYXkgT0ssIGJ1dCBkbyBub3RoaW5nLgorCisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24pCisJCSAgICB8fCAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUKKwkJCSYmIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24pKSByZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gdmFsOworCQlyZXR1cm4gMDsKKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+cHJvcF9hZGMucmF0ZSwgcCk7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPnByb3BfZGFjLnJhdGUsIHApOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+cHJvcF9hZGMuY2hhbm5lbHMsIHApOworCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBwdXRfdXNlcihzLT5wcm9wX2RhYy5jaGFubmVscywgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcmV0dXJuCisJCQkgICAgcHV0X3VzZXIoCisJCQkJICAgICAocy0+cHJvcF9hZGMuCisJCQkJICAgICAgZm10ICYgKEFGTVRfUzggfCBBRk1UX1U4KSkgPyA4IDogMTYsCisJCQkJICAgICBwKTsKKwkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4KKwkJCSAgICBwdXRfdXNlcigKKwkJCQkgICAgIChzLT5wcm9wX2RhYy4KKwkJCQkgICAgICBmbXQgJiAoQUZNVF9TOCB8IEFGTVRfVTgpKSA/IDggOiAxNiwKKwkJCQkgICAgIHApOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gbWl4ZXJfaW9jdGwocywgY21kLCBhcmcpOworfQorCisKK3N0YXRpYyBpbnQgY3M0MjgxX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJICJjczQyODE6IGNzNDI4MV9yZWxlYXNlKCk6IGlub2RlPSVwIGZpbGU9JXAgZl9tb2RlPSVkXG4iLAorCQkJIGlub2RlLCBmaWxlLCBmaWxlLT5mX21vZGUpKTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWRyYWluX2RhYyhzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJCWRvd24oJnMtPm9wZW5fc2VtX2RhYyk7CisJCXN0b3BfZGFjKHMpOworCQlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYyk7CisJCXMtPm9wZW5fbW9kZSAmPSB+Rk1PREVfV1JJVEU7CisJCXVwKCZzLT5vcGVuX3NlbV9kYWMpOworCQl3YWtlX3VwKCZzLT5vcGVuX3dhaXRfZGFjKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJZHJhaW5fYWRjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJZG93bigmcy0+b3Blbl9zZW1fYWRjKTsKKwkJc3RvcF9hZGMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKKwkJcy0+b3Blbl9tb2RlICY9IH5GTU9ERV9SRUFEOworCQl1cCgmcy0+b3Blbl9zZW1fYWRjKTsKKwkJd2FrZV91cCgmcy0+b3Blbl93YWl0X2FkYyk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzNDI4MV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcz1OVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkiY3M0MjgxOiBjczQyODFfb3BlbigpOiBpbm9kZT0lcCBmaWxlPSVwIGZfbW9kZT0weCV4XG4iLAorCQkJaW5vZGUsIGZpbGUsIGZpbGUtPmZfbW9kZSkpOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDI4MV9kZXZzKQorCXsKKwkJcyA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjczQyODFfc3RhdGUsIGxpc3QpOworCisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoZW50cnkgPT0gJmNzNDI4MV9kZXZzKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIXMpIHsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI4MTogY3M0MjgxX29wZW4oKTogRXJyb3IgLSB1bmFibGUgdG8gZmluZCBhdWRpbyBzdGF0ZSBzdHJ1Y3RcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisKKwkvLyB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4gfCBDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyODE6IGNzNDI4MV9vcGVuKCk6IEVycm9yIC0gbXVzdCBvcGVuIFJFQUQgYW5kL29yIFdSSVRFXG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJZG93bigmcy0+b3Blbl9zZW1fZGFjKTsKKwkJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQl1cCgmcy0+b3Blbl9zZW1fZGFjKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJdXAoJnMtPm9wZW5fc2VtX2RhYyk7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5vcGVuX3dhaXRfZGFjKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQlkb3duKCZzLT5vcGVuX3NlbV9kYWMpOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWRvd24oJnMtPm9wZW5fc2VtX2FkYyk7CisJCXdoaWxlIChzLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQl1cCgmcy0+b3Blbl9zZW1fYWRjKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJdXAoJnMtPm9wZW5fc2VtX2FkYyk7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5vcGVuX3dhaXRfYWRjKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCQlkb3duKCZzLT5vcGVuX3NlbV9hZGMpOworCQl9CisJfQorCXMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5wcm9wX2FkYy5mbXQgPSBBRk1UX1U4OworCQlzLT5wcm9wX2FkYy5mbXRfb3JpZ2luYWwgPSBzLT5wcm9wX2FkYy5mbXQ7CisJCXMtPnByb3BfYWRjLmNoYW5uZWxzID0gMTsKKwkJcy0+cHJvcF9hZGMucmF0ZSA9IDgwMDA7CisJCXMtPnByb3BfYWRjLmNsa2RpdiA9IDk2IHwgMHg4MDsKKwkJcy0+Y29udmVyc2lvbiA9IDA7CisJCXMtPmVuYSAmPSB+Rk1PREVfUkVBRDsKKwkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfYWRjLm9zc21heGZyYWdzID0KKwkJICAgIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24gPSAwOworCQl1cCgmcy0+b3Blbl9zZW1fYWRjKTsKKworCQlpZiAocHJvZ19kbWFidWZfYWRjKHMpKSB7CisJCQlDU19EQkdPVVQoQ1NfT1BFTiB8IENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9FUlIKKwkJCQkiY3M0MjgxOiBhZGMgUHJvZ3JhbSBkbWFidWZzIGZhaWxlZC5cbiIpKTsKKwkJCWNzNDI4MV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXByb2dfY29kZWMocywgQ1NfVFlQRV9BREMpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+cHJvcF9kYWMuZm10ID0gQUZNVF9VODsKKwkJcy0+cHJvcF9kYWMuZm10X29yaWdpbmFsID0gcy0+cHJvcF9kYWMuZm10OworCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IDE7CisJCXMtPnByb3BfZGFjLnJhdGUgPSA4MDAwOworCQlzLT5wcm9wX2RhYy5jbGtkaXYgPSA5NiB8IDB4ODA7CisJCXMtPmNvbnZlcnNpb24gPSAwOworCQlzLT5lbmEgJj0gfkZNT0RFX1dSSVRFOworCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPQorCQkgICAgcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IDA7CisJCXVwKCZzLT5vcGVuX3NlbV9kYWMpOworCisJCWlmIChwcm9nX2RtYWJ1Zl9kYWMocykpIHsKKwkJCUNTX0RCR09VVChDU19PUEVOIHwgQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX0VSUgorCQkJCSJjczQyODE6IGRhYyBQcm9ncmFtIGRtYWJ1ZnMgZmFpbGVkLlxuIikpOworCQkJY3M0MjgxX3JlbGVhc2UoaW5vZGUsIGZpbGUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJcHJvZ19jb2RlYyhzLCBDU19UWVBFX0RBQyk7CisJfQorCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjczQyODFfb3BlbigpLSAwXG4iKSk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gICBXYXZlIChhdWRpbykgZmlsZSBvcGVyYXRpb25zIHN0cnVjdC4KKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjczQyODFfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkgPSBub19sbHNlZWssCisJLnJlYWQJID0gY3M0MjgxX3JlYWQsCisJLndyaXRlCSA9IGNzNDI4MV93cml0ZSwKKwkucG9sbAkgPSBjczQyODFfcG9sbCwKKwkuaW9jdGwJID0gY3M0MjgxX2lvY3RsLAorCS5tbWFwCSA9IGNzNDI4MV9tbWFwLAorCS5vcGVuCSA9IGNzNDI4MV9vcGVuLAorCS5yZWxlYXNlID0gY3M0MjgxX3JlbGVhc2UsCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKKy8vIGhvbGQgc3BpbmxvY2sgZm9yIHRoZSBmb2xsb3dpbmchIAorc3RhdGljIHZvaWQgY3M0MjgxX2hhbmRsZV9taWRpKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwlpbnQgd2FrZTsKKwl1bnNpZ25lZCB0ZW1wMTsKKworCXdha2UgPSAwOworCXdoaWxlICghKHJlYWRsKHMtPnBCQTAgKyBCQTBfTUlEU1IpICYgMHg4MCkpIHsKKwkJY2ggPSByZWFkbChzLT5wQkEwICsgQkEwX01JRFJQKTsKKwkJaWYgKHMtPm1pZGkuaWNudCA8IE1JRElJTkJVRikgeworCQkJcy0+bWlkaS5pYnVmW3MtPm1pZGkuaXdyXSA9IGNoOworCQkJcy0+bWlkaS5pd3IgPSAocy0+bWlkaS5pd3IgKyAxKSAlIE1JRElJTkJVRjsKKwkJCXMtPm1pZGkuaWNudCsrOworCQl9CisJCXdha2UgPSAxOworCX0KKwlpZiAod2FrZSkKKwkJd2FrZV91cCgmcy0+bWlkaS5pd2FpdCk7CisJd2FrZSA9IDA7CisJd2hpbGUgKCEocmVhZGwocy0+cEJBMCArIEJBMF9NSURTUikgJiAweDQwKSAmJiBzLT5taWRpLm9jbnQgPiAwKSB7CisJCXRlbXAxID0gKHMtPm1pZGkub2J1ZltzLT5taWRpLm9yZF0pICYgMHgwMDAwMDBmZjsKKwkJd3JpdGVsKHRlbXAxLCBzLT5wQkEwICsgQkEwX01JRFdQKTsKKwkJcy0+bWlkaS5vcmQgPSAocy0+bWlkaS5vcmQgKyAxKSAlIE1JRElPVVRCVUY7CisJCXMtPm1pZGkub2NudC0tOworCQlpZiAocy0+bWlkaS5vY250IDwgTUlESU9VVEJVRiAtIDE2KQorCQkJd2FrZSA9IDE7CisJfQorCWlmICh3YWtlKQorCQl3YWtlX3VwKCZzLT5taWRpLm93YWl0KTsKK30KKworCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjczQyODFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGRldl9pZDsKKwl1bnNpZ25lZCBpbnQgdGVtcDE7CisKKwkvLyBmYXN0cGF0aCBvdXQsIHRvIGVhc2UgaW50ZXJydXB0IHNoYXJpbmcgCisJdGVtcDEgPSByZWFkbChzLT5wQkEwICsgQkEwX0hJU1IpOwkvLyBHZXQgSW50IFN0YXR1cyByZWcuCisKKwlDU19EQkdPVVQoQ1NfSU5URVJSVVBULCA2LCBwcmludGsoS0VSTl9JTkZPCisJCSAgImNzNDI4MTogY3M0MjgxX2ludGVycnVwdCgpIEJBMF9ISVNSPTB4JS44eFxuIiwgdGVtcDEpKTsKKy8qCisqIElmIG5vdCBETUEgb3IgTUlESSBpbnRlcnJ1cHQsIHRoZW4ganVzdCByZXR1cm4uCisqLworCWlmICghKHRlbXAxICYgKEhJU1JfRE1BMCB8IEhJU1JfRE1BMSB8IEhJU1JfTUlESSkpKSB7CisJCXdyaXRlbChISUNSX0lFViB8IEhJQ1JfQ0hHTSwgcy0+cEJBMCArIEJBMF9ISUNSKTsKKwkJQ1NfREJHT1VUKENTX0lOVEVSUlVQVCwgOSwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI4MTogY3M0MjgxX2ludGVycnVwdCgpOiByZXR1cm5pbmcgbm90IGNzNDI4MSBpbnRlcnJ1cHQuXG4iKSk7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAodGVtcDEgJiBISVNSX0RNQTApCS8vIElmIHBsYXkgaW50ZXJydXB0LAorCQlyZWFkbChzLT5wQkEwICsgQkEwX0hEU1IwKTsJLy8gICBjbGVhciB0aGUgc291cmNlLgorCisJaWYgKHRlbXAxICYgSElTUl9ETUExKQkvLyBTYW1lIGZvciBwbGF5LgorCQlyZWFkbChzLT5wQkEwICsgQkEwX0hEU1IxKTsKKwl3cml0ZWwoSElDUl9JRVYgfCBISUNSX0NIR00sIHMtPnBCQTAgKyBCQTBfSElDUik7CS8vIExvY2FsIEVPSQorCisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwljczQyODFfdXBkYXRlX3B0cihzLENTX1RSVUUpOworCWNzNDI4MV9oYW5kbGVfbWlkaShzKTsKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitzdGF0aWMgdm9pZCBjczQyODFfbWlkaV90aW1lcih1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJY3M0MjgxX2hhbmRsZV9taWRpKHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5taWRpLnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgMTsKKwlhZGRfdGltZXIoJnMtPm1pZGkudGltZXIpOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworc3RhdGljIHNzaXplX3QgY3M0MjgxX21pZGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHB0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXB0ciA9IHMtPm1pZGkuaXJkOworCQljbnQgPSBNSURJSU5CVUYgLSBwdHI7CisJCWlmIChzLT5taWRpLmljbnQgPCBjbnQpCisJCQljbnQgPSBzLT5taWRpLmljbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcy0+bWlkaS5pd2FpdCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5taWRpLmlidWYgKyBwdHIsIGNudCkpCisJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVGQVVMVDsKKwkJcHRyID0gKHB0ciArIGNudCkgJSBNSURJSU5CVUY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPm1pZGkuaXJkID0gcHRyOworCQlzLT5taWRpLmljbnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCBjczQyODFfbWlkaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCBjczQyODFfc3RhdGUgKnMgPQorCSAgICAoc3RydWN0IGNzNDI4MV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXB0ciA9IHMtPm1pZGkub3dyOworCQljbnQgPSBNSURJT1VUQlVGIC0gcHRyOworCQlpZiAocy0+bWlkaS5vY250ICsgY250ID4gTUlESU9VVEJVRikKKwkJCWNudCA9IE1JRElPVVRCVUYgLSBzLT5taWRpLm9jbnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCWNzNDI4MV9oYW5kbGVfbWlkaShzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5taWRpLm93YWl0KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKHMtPm1pZGkub2J1ZiArIHB0ciwgYnVmZmVyLCBjbnQpKQorCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESU9VVEJVRjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+bWlkaS5vd3IgPSBwdHI7CisJCXMtPm1pZGkub2NudCArPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyODFfaGFuZGxlX21pZGkocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGNzNDI4MV9taWRpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX2ZsYWdzICYgRk1PREVfV1JJVEUpCisJCXBvbGxfd2FpdChmaWxlLCAmcy0+bWlkaS5vd2FpdCwgd2FpdCk7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9SRUFEKQorCQlwb2xsX3dhaXQoZmlsZSwgJnMtPm1pZGkuaXdhaXQsIHdhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5taWRpLmljbnQgPiAwKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChzLT5taWRpLm9jbnQgPCBNSURJT1VUQlVGKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCisKK3N0YXRpYyBpbnQgY3M0MjgxX21pZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0ZW1wMTsKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBjczQyODFfc3RhdGUgKnM9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0MjgxX2RldnMpCisJeworCQlzID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzNDI4MV9zdGF0ZSwgbGlzdCk7CisKKwkJaWYgKHMtPmRldl9taWRpID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGVudHJ5ID09ICZjczQyODFfZGV2cykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFzKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI4MTogY3M0MjgxX29wZW4oKTogRXJyb3IgLSB1bmFibGUgdG8gZmluZCBhdWRpbyBzdGF0ZSBzdHJ1Y3RcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLy8gd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlIAorCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnMtPm9wZW5fd2FpdCk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCQlzLT5taWRpLm9yZCA9IHMtPm1pZGkub3dyID0gcy0+bWlkaS5vY250ID0gMDsKKwkJd3JpdGVsKDEsIHMtPnBCQTAgKyBCQTBfTUlEQ1IpOwkvLyBSZXNldCB0aGUgaW50ZXJmYWNlLgorCQl3cml0ZWwoMCwgcy0+cEJBMCArIEJBMF9NSURDUik7CS8vIFJldHVybiB0byBub3JtYWwgbW9kZS4KKwkJcy0+bWlkaS5pcmQgPSBzLT5taWRpLml3ciA9IHMtPm1pZGkuaWNudCA9IDA7CisJCXdyaXRlbCgweDAwMDAwMDBmLCBzLT5wQkEwICsgQkEwX01JRENSKTsJLy8gRW5hYmxlIHRyYW5zbWl0LCByZWNvcmQsIGludHMuCisJCXRlbXAxID0gcmVhZGwocy0+cEJBMCArIEJBMF9ISU1SKTsKKwkJd3JpdGVsKHRlbXAxICYgMHhmZmJmZmZmZiwgcy0+cEJBMCArIEJBMF9ISU1SKTsJLy8gRW5hYmxlIG1pZGkgaW50LiByZWNvZ25pdGlvbi4KKwkJd3JpdGVsKEhJQ1JfSUVWIHwgSElDUl9DSEdNLCBzLT5wQkEwICsgQkEwX0hJQ1IpOwkvLyBFbmFibGUgaW50ZXJydXB0cworCQlpbml0X3RpbWVyKCZzLT5taWRpLnRpbWVyKTsKKwkJcy0+bWlkaS50aW1lci5leHBpcmVzID0gamlmZmllcyArIDE7CisJCXMtPm1pZGkudGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBzOworCQlzLT5taWRpLnRpbWVyLmZ1bmN0aW9uID0gY3M0MjgxX21pZGlfdGltZXI7CisJCWFkZF90aW1lcigmcy0+bWlkaS50aW1lcik7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+bWlkaS5vcmQgPSBzLT5taWRpLm93ciA9IHMtPm1pZGkub2NudCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5vcGVuX21vZGUgfD0KKwkgICAgKGZpbGUtPgorCSAgICAgZl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRCB8CisJCQkJCSAgICBGTU9ERV9NSURJX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworCitzdGF0aWMgaW50IGNzNDI4MV9taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0MjgxX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNvdW50LCB0bW87CisKKwlWQUxJREFURV9TVEFURShzKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCQlmb3IgKDs7KSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWNvdW50ID0gcy0+bWlkaS5vY250OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGNvdW50IDw9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJYnJlYWs7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQl0bW8gPSAoY291bnQgKiBIWikgLyAzMTAwOworCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IDogMSkgJiYgdG1vKQorCQkJCXByaW50ayhLRVJOX0RFQlVHCisJCQkJICAgICAgICJjczQyODE6IG1pZGkgdGltZWQgb3V0Pz9cbiIpOworCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCX0KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJcy0+b3Blbl9tb2RlICY9CisJICAgICh+KGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSkgJiAoRk1PREVfTUlESV9SRUFEIHwKKwkJCQkJCSAgICAgRk1PREVfTUlESV9XUklURSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCXdyaXRlbCgwLCBzLT5wQkEwICsgQkEwX01JRENSKTsJLy8gRGlzYWJsZSBNaWRpIGludGVycnVwdHMuICAKKwkJZGVsX3RpbWVyKCZzLT5taWRpLnRpbWVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwlyZXR1cm4gMDsKK30KKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAgIE1pZGkgZmlsZSBvcGVyYXRpb25zIHN0cnVjdC4KKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjczQyODFfbWlkaV9mb3BzID0geworCS5vd25lcgkgPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCSA9IG5vX2xsc2VlaywKKwkucmVhZAkgPSBjczQyODFfbWlkaV9yZWFkLAorCS53cml0ZQkgPSBjczQyODFfbWlkaV93cml0ZSwKKwkucG9sbAkgPSBjczQyODFfbWlkaV9wb2xsLAorCS5vcGVuCSA9IGNzNDI4MV9taWRpX29wZW4sCisJLnJlbGVhc2UgPSBjczQyODFfbWlkaV9yZWxlYXNlLAorfTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKKy8vIG1heGltdW0gbnVtYmVyIG9mIGRldmljZXMgCisjZGVmaW5lIE5SX0RFVklDRSA4CQkvLyBPbmx5IGVpZ2h0IGRldmljZXMgc3VwcG9ydGVkIGN1cnJlbnRseS4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCitzdGF0aWMgc3RydWN0IGluaXR2b2wgeworCWludCBtaXhjaDsKKwlpbnQgdm9sOworfSBpbml0dm9sW10gX19kZXZpbml0ZGF0YSA9IHsKKworCXsKKwlTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsIDB4NDA0MH0sIHsKKwlTT1VORF9NSVhFUl9XUklURV9QQ00sIDB4NDA0MH0sIHsKKwlTT1VORF9NSVhFUl9XUklURV9TWU5USCwgMHg0MDQwfSwgeworCVNPVU5EX01JWEVSX1dSSVRFX0NELCAweDQwNDB9LCB7CisJU09VTkRfTUlYRVJfV1JJVEVfTElORSwgMHg0MDQwfSwgeworCVNPVU5EX01JWEVSX1dSSVRFX0xJTkUxLCAweDQwNDB9LCB7CisJU09VTkRfTUlYRVJfV1JJVEVfUkVDTEVWLCAweDAwMDB9LCB7CisJU09VTkRfTUlYRVJfV1JJVEVfU1BFQUtFUiwgMHg0MDQwfSwgeworCVNPVU5EX01JWEVSX1dSSVRFX01JQywgMHgwMDAwfQorfTsKKworCisjaWZuZGVmIE5PVF9DUzQyODFfUE0KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBjczQyODFfQnVpbGRGSUZPKAorCXN0cnVjdCBjczQyODFfcGlwZWxpbmUgKnAsIAorCXN0cnVjdCBjczQyODFfc3RhdGUgKnMpCit7CisJc3dpdGNoKHAtPm51bWJlcikKKwl7CisJCWNhc2UgMDogIC8qIHBsYXliYWNrICovCisJCXsKKwkJCXAtPnUzMkZDUm5BZGRyZXNzICA9ICBCQTBfRkNSMDsKKwkJCXAtPnUzMkZTSUNuQWRkcmVzcyA9IEJBMF9GU0lDMDsKKwkJCXAtPnUzMkZQRFJuQWRkcmVzcyA9IEJBMF9GUERSMDsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgMTogIC8qIGNhcHR1cmUgKi8KKwkJeworCQkJcC0+dTMyRkNSbkFkZHJlc3MgID0gIEJBMF9GQ1IxOworCQkJcC0+dTMyRlNJQ25BZGRyZXNzID0gQkEwX0ZTSUMxOworCQkJcC0+dTMyRlBEUm5BZGRyZXNzID0gQkEwX0ZQRFIxOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIDI6IAorCQl7CisJCQlwLT51MzJGQ1JuQWRkcmVzcyAgPSAgQkEwX0ZDUjI7CisJCQlwLT51MzJGU0lDbkFkZHJlc3MgPSBCQTBfRlNJQzI7CisJCQlwLT51MzJGUERSbkFkZHJlc3MgPSBCQTBfRlBEUjI7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDM6IAorCQl7CisJCQlwLT51MzJGQ1JuQWRkcmVzcyAgPSAgQkEwX0ZDUjM7CisJCQlwLT51MzJGU0lDbkFkZHJlc3MgPSBCQTBfRlNJQzM7CisJCQlwLT51MzJGUERSbkFkZHJlc3MgPSBCQTBfRlBEUjM7CisJCQlicmVhazsKKwkJfQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorCS8vCisJLy8gZmlyc3QgcmVhZCB0aGUgaGFyZHdhcmUgdG8gaW5pdGlhbGl6ZSB0aGUgbWVtYmVyIHZhcmlhYmxlcworCS8vCisJcC0+dTMyRkNSblZhbHVlID0gcmVhZGwocy0+cEJBMCArIHAtPnUzMkZDUm5BZGRyZXNzKTsKKwlwLT51MzJGU0lDblZhbHVlID0gcmVhZGwocy0+cEJBMCArIHAtPnUzMkZTSUNuQWRkcmVzcyk7CisJcC0+dTMyRlBEUm5WYWx1ZSA9IHJlYWRsKHMtPnBCQTAgKyBwLT51MzJGUERSbkFkZHJlc3MpOworCit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBjczQyODFfQnVpbGRETUFlbmdpbmUoCisJc3RydWN0IGNzNDI4MV9waXBlbGluZSAqcCwgCisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcykKK3sKKy8qCisqIGluaXRpYWxpemUgYWxsIHRoZSBhZGRyZXNzZXMgb2YgdGhpcyBwaXBlbGluZSBkbWEgaW5mby4KKyovCisJc3dpdGNoKHAtPm51bWJlcikKKwl7CisJCWNhc2UgMDogIC8qIHBsYXliYWNrICovCisJCXsKKwkJCXAtPnUzMkRCQW5BZGRyZXNzID0gQkEwX0RCQTA7CisJCQlwLT51MzJEQ0FuQWRkcmVzcyA9IEJBMF9EQ0EwOworCQkJcC0+dTMyREJDbkFkZHJlc3MgPSBCQTBfREJDMDsKKwkJCXAtPnUzMkRDQ25BZGRyZXNzID0gQkEwX0RDQzA7CisJCQlwLT51MzJETVJuQWRkcmVzcyA9IEJBMF9ETVIwOworCQkJcC0+dTMyRENSbkFkZHJlc3MgPSBCQTBfRENSMDsKKwkJCXAtPnUzMkhEU1JuQWRkcmVzcyA9IEJBMF9IRFNSMDsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSAxOiAvKiBjYXB0dXJlICovCisJCXsKKwkJCXAtPnUzMkRCQW5BZGRyZXNzID0gQkEwX0RCQTE7CisJCQlwLT51MzJEQ0FuQWRkcmVzcyA9IEJBMF9EQ0ExOworCQkJcC0+dTMyREJDbkFkZHJlc3MgPSBCQTBfREJDMTsKKwkJCXAtPnUzMkRDQ25BZGRyZXNzID0gQkEwX0RDQzE7CisJCQlwLT51MzJETVJuQWRkcmVzcyA9IEJBMF9ETVIxOworCQkJcC0+dTMyRENSbkFkZHJlc3MgPSBCQTBfRENSMTsKKwkJCXAtPnUzMkhEU1JuQWRkcmVzcyA9IEJBMF9IRFNSMTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSAyOgorCQl7CisJCQlwLT51MzJEQkFuQWRkcmVzcyA9IEJBMF9EQkEyOworCQkJcC0+dTMyRENBbkFkZHJlc3MgPSBCQTBfRENBMjsKKwkJCXAtPnUzMkRCQ25BZGRyZXNzID0gQkEwX0RCQzI7CisJCQlwLT51MzJEQ0NuQWRkcmVzcyA9IEJBMF9EQ0MyOworCQkJcC0+dTMyRE1SbkFkZHJlc3MgPSBCQTBfRE1SMjsKKwkJCXAtPnUzMkRDUm5BZGRyZXNzID0gQkEwX0RDUjI7CisJCQlwLT51MzJIRFNSbkFkZHJlc3MgPSBCQTBfSERTUjI7CisJCQlicmVhazsKKwkJfQorCisJCWNhc2UgMzoKKwkJeworCQkJcC0+dTMyREJBbkFkZHJlc3MgPSBCQTBfREJBMzsKKwkJCXAtPnUzMkRDQW5BZGRyZXNzID0gQkEwX0RDQTM7CisJCQlwLT51MzJEQkNuQWRkcmVzcyA9IEJBMF9EQkMzOworCQkJcC0+dTMyRENDbkFkZHJlc3MgPSBCQTBfRENDMzsKKwkJCXAtPnUzMkRNUm5BZGRyZXNzID0gQkEwX0RNUjM7CisJCQlwLT51MzJEQ1JuQWRkcmVzcyA9IEJBMF9EQ1IzOworCQkJcC0+dTMySERTUm5BZGRyZXNzID0gQkEwX0hEU1IzOworCQkJYnJlYWs7CisJCX0KKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworLy8KKy8vIEluaXRpYWxpemUgdGhlIGRtYSB2YWx1ZXMgZm9yIHRoaXMgcGlwZWxpbmUKKy8vCisJcC0+dTMyREJBblZhbHVlID0gcmVhZGwocy0+cEJBMCArIHAtPnUzMkRCQW5BZGRyZXNzKTsKKwlwLT51MzJEQkNuVmFsdWUgPSByZWFkbChzLT5wQkEwICsgcC0+dTMyREJDbkFkZHJlc3MpOworCXAtPnUzMkRNUm5WYWx1ZSA9IHJlYWRsKHMtPnBCQTAgKyBwLT51MzJETVJuQWRkcmVzcyk7CisJcC0+dTMyRENSblZhbHVlID0gcmVhZGwocy0+cEJBMCArIHAtPnUzMkRDUm5BZGRyZXNzKTsKKworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgY3M0MjgxX0luaXRQTShzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzKQoreworCWludCBpOworCXN0cnVjdCBjczQyODFfcGlwZWxpbmUgKnA7CisKKwlmb3IoaT0wO2k8Q1M0MjgxX05VTUJFUl9PRl9QSVBFTElORVM7aSsrKQorCXsKKwkJcCA9ICZzLT5wbFtpXTsKKwkJcC0+bnVtYmVyID0gaTsKKwkJY3M0MjgxX0J1aWxkRE1BZW5naW5lKHAscyk7CisJCWNzNDI4MV9CdWlsZEZJRk8ocCxzKTsKKwkvKgorCSogY3VycmVudGx5IG9ubHkgIDIgcGlwZWxpbmVzIGFyZSB1c2VkCisJKiBzbywgb25seSBzZXQgdGhlIHZhbGlkIGJpdCBvbiB0aGUgcGxheWJhY2sgYW5kIGNhcHR1cmUuCisJKi8KKwkJaWYoIChpID09IENTNDI4MV9QTEFZQkFDS19QSVBFTElORV9OVU1CRVIpIHx8IAorCQkJKGkgPT0gQ1M0MjgxX0NBUFRVUkVfUElQRUxJTkVfTlVNQkVSKSkKKwkJCXAtPmZsYWdzIHw9IENTNDI4MV9QSVBFTElORV9WQUxJRDsKKwl9CisJcy0+cG0udTMyU1NQTV9CSVRTID0gMHg3ZTsgIC8qIHJldiBjLCB1c2UgMHg3YyBmb3IgcmV2IGEgb3IgYiAqLworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGNzNDI4MV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorCQkJCSAgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQoreworI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisJc3RydWN0IHBtX2RldiAqcG1kZXY7CisjZW5kaWYKKwlzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzOworCWRtYV9hZGRyX3QgZG1hX21hc2s7CisJbW1fc2VnbWVudF90IGZzOworCWludCBpLCB2YWw7CisJdW5zaWduZWQgaW50IHRlbXAxLCB0ZW1wMjsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBwcm9iZSgpK1xuIikpOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpIHsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI4MTogcGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpZGV2LCAwKSAmIElPUkVTT1VSQ0VfTUVNKSB8fAorCSAgICAhKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDEpICYgSU9SRVNPVVJDRV9NRU0pKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI4MTogcHJvYmUoKS0gTWVtb3J5IHJlZ2lvbiBub3QgYXNzaWduZWRcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChwY2lkZXYtPmlycSA9PSAwKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI4MTogcHJvYmUoKSBJUlEgbm90IGFzc2lnbmVkXG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlkbWFfbWFzayA9IDB4ZmZmZmZmZmY7CS8qIHRoaXMgZW5hYmxlcyBwbGF5YmFjayBhbmQgcmVjb3JkaW5nICovCisJaSA9IHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCBkbWFfbWFzayk7CisJaWYgKGkpIHsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKKwkJICAgICAgImNzNDI4MTogcHJvYmUoKSBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIikpOworCQlyZXR1cm4gaTsKKwl9CisJaWYgKCEocyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBjczQyODFfc3RhdGUpLCBHRlBfS0VSTkVMKSkpIHsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKKwkJICAgICAgImNzNDI4MTogcHJvYmUoKSBubyBtZW1vcnkgZm9yIHN0YXRlIHN0cnVjdC5cbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBjczQyODFfc3RhdGUpKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfYWRjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXRfYWRjKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXRfZGFjKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5taWRpLml3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5taWRpLm93YWl0KTsKKwlpbml0X01VVEVYKCZzLT5vcGVuX3NlbSk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW1fYWRjKTsKKwlpbml0X01VVEVYKCZzLT5vcGVuX3NlbV9kYWMpOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5wQkEwcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOworCXMtPnBCQTFwaHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMSk7CisKKwkvKiBDb252ZXJ0IHBoeXMgdG8gbGluZWFyLiAqLworCXMtPnBCQTAgPSBpb3JlbWFwX25vY2FjaGUocy0+cEJBMHBoeXMsIDQwOTYpOworCWlmICghcy0+cEJBMCkgeworCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9FUlIKKwkJCSAiY3M0MjgxOiBCQTAgSS9PIG1hcHBpbmcgZmFpbGVkLiBTa2lwcGluZyBwYXJ0LlxuIikpOworCQlnb3RvIGVycl9mcmVlOworCX0KKwlzLT5wQkExID0gaW9yZW1hcF9ub2NhY2hlKHMtPnBCQTFwaHlzLCA2NTUzNik7CisJaWYgKCFzLT5wQkExKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0VSUgorCQkJICJjczQyODE6IEJBMSBJL08gbWFwcGluZyBmYWlsZWQuIFNraXBwaW5nIHBhcnQuXG4iKSk7CisJCWdvdG8gZXJyX3VubWFwOworCX0KKworCXRlbXAxID0gcmVhZGwocy0+cEJBMCArIEJBMF9QQ0lDRkcwMCk7CisJdGVtcDIgPSByZWFkbChzLT5wQkEwICsgQkEwX1BDSUNGRzA0KTsKKworCUNTX0RCR09VVChDU19JTklULCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0MjgxOiBwcm9iZSgpIEJBMD0weCUuOHggQkExPTB4JS44eCBwQkEwPSVwIHBCQTE9JXAgXG4iLAorCQkJICh1bnNpZ25lZCkgdGVtcDEsICh1bnNpZ25lZCkgdGVtcDIsIHMtPnBCQTAsIHMtPnBCQTEpKTsKKwlDU19EQkdPVVQoQ1NfSU5JVCwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDI4MTogcHJvYmUoKSBwQkEwcGh5cz0weCUuOHggcEJBMXBoeXM9MHglLjh4XG4iLAorCQkJICh1bnNpZ25lZCkgcy0+cEJBMHBoeXMsICh1bnNpZ25lZCkgcy0+cEJBMXBoeXMpKTsKKworI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisJcy0+cG0uZmxhZ3MgPSBDUzQyODFfUE1fSURMRTsKKyNlbmRpZgorCXRlbXAxID0gY3M0MjgxX2h3X2luaXQocyk7CisJaWYgKHRlbXAxKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0VSUgorCQkJICJjczQyODE6IGNzNDI4MV9od19pbml0KCkgZmFpbGVkLiBTa2lwcGluZyBwYXJ0LlxuIikpOworCQlnb3RvIGVycl9pcnE7CisJfQorCXMtPm1hZ2ljID0gQ1M0MjgxX01BR0lDOworCXMtPnBjaWRldiA9IHBjaWRldjsKKwlzLT5pcnEgPSBwY2lkZXYtPmlycTsKKwlpZiAocmVxdWVzdF9pcnEKKwkgICAgKHMtPmlycSwgY3M0MjgxX2ludGVycnVwdCwgU0FfU0hJUlEsICJDcnlzdGFsIENTNDI4MSIsIHMpKSB7CisJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsCisJCQkgIHByaW50ayhLRVJOX0VSUiAiY3M0MjgxOiBpcnEgJXUgaW4gdXNlXG4iLCBzLT5pcnEpKTsKKwkJZ290byBlcnJfaXJxOworCX0KKwlpZiAoKHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmY3M0MjgxX2F1ZGlvX2ZvcHMsIC0xKSkgPAorCSAgICAwKSB7CisJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgorCQkJICJjczQyODE6IHByb2JlKCkgcmVnaXN0ZXJfc291bmRfZHNwKCkgZmFpbGVkLlxuIikpOworCQlnb3RvIGVycl9kZXYxOworCX0KKwlpZiAoKHMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZjczQyODFfbWl4ZXJfZm9wcywgLTEpKSA8CisJICAgIDApIHsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI4MTogcHJvYmUoKSByZWdpc3Rlcl9zb3VuZF9taXhlcigpIGZhaWxlZC5cbiIpKTsKKwkJZ290byBlcnJfZGV2MjsKKwl9CisJaWYgKChzLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJmNzNDI4MV9taWRpX2ZvcHMsIC0xKSkgPCAwKSB7CisJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgorCQkJICJjczQyODE6IHByb2JlKCkgcmVnaXN0ZXJfc291bmRfbWlkaSgpIGZhaWxlZC5cbiIpKTsKKwkJZ290byBlcnJfZGV2MzsKKwl9CisjaWZuZGVmIE5PVF9DUzQyODFfUE0KKwljczQyODFfSW5pdFBNKHMpOworCXBtZGV2ID0gY3NfcG1fcmVnaXN0ZXIoUE1fUENJX0RFViwgUE1fUENJX0lEKHBjaWRldiksIGNzNDI4MV9wbV9jYWxsYmFjayk7CisJaWYgKHBtZGV2KQorCXsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19QTSwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyODE6IHByb2JlKCkgcG1fcmVnaXN0ZXIoKSBzdWNjZWVkZWQgKCVwKS5cbiIsIHBtZGV2KSk7CisJCXBtZGV2LT5kYXRhID0gczsKKwl9CisJZWxzZQorCXsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19QTSB8IENTX0VSUk9SLCAwLCBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDI4MTogcHJvYmUoKSBwbV9yZWdpc3RlcigpIGZhaWxlZCAoJXApLlxuIiwgcG1kZXYpKTsKKwkJcy0+cG0uZmxhZ3MgfD0gQ1M0MjgxX1BNX05PVF9SRUdJU1RFUkVEOworCX0KKyNlbmRpZgorCisJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsJLy8gZW5hYmxlIGJ1cyBtYXN0ZXJpbmcgCisKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCXZhbCA9IFNPVU5EX01BU0tfTElORTsKKwltaXhlcl9pb2N0bChzLCBTT1VORF9NSVhFUl9XUklURV9SRUNTUkMsICh1bnNpZ25lZCBsb25nKSAmdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGluaXR2b2wpIC8gc2l6ZW9mKGluaXR2b2xbMF0pOyBpKyspIHsKKwkJdmFsID0gaW5pdHZvbFtpXS52b2w7CisJCW1peGVyX2lvY3RsKHMsIGluaXR2b2xbaV0ubWl4Y2gsICh1bnNpZ25lZCBsb25nKSAmdmFsKTsKKwl9CisJdmFsID0gMTsJCS8vIGVuYWJsZSBtaWMgcHJlYW1wIAorCW1peGVyX2lvY3RsKHMsIFNPVU5EX01JWEVSX1BSSVZBVEUxLCAodW5zaWduZWQgbG9uZykgJnZhbCk7CisJc2V0X2ZzKGZzKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHMpOworCWxpc3RfYWRkKCZzLT5saXN0LCAmY3M0MjgxX2RldnMpOworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJImNzNDI4MTogcHJvYmUoKS0gZGV2aWNlIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHlcbiIpKTsKKwlyZXR1cm4gMDsKKworICAgICAgZXJyX2RldjM6CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5kZXZfbWl4ZXIpOworICAgICAgZXJyX2RldjI6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKyAgICAgIGVycl9kZXYxOgorCWZyZWVfaXJxKHMtPmlycSwgcyk7CisgICAgICBlcnJfaXJxOgorCWlvdW5tYXAocy0+cEJBMSk7CisgICAgICBlcnJfdW5tYXA6CisJaW91bm1hcChzLT5wQkEwKTsKKyAgICAgIGVycl9mcmVlOgorCWtmcmVlKHMpOworCisJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTworCQkiY3M0MjgxOiBwcm9iZSgpLSBubyBkZXZpY2UgYWxsb2NhdGVkXG4iKSk7CisJcmV0dXJuIC1FTk9ERVY7Cit9IC8vIHByb2JlX2NzNDI4MQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNzNDI4MV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IGNzNDI4MV9zdGF0ZSAqcyA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwkvLyBzdG9wIERNQSBjb250cm9sbGVyIAorCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmRldl9taXhlcik7CisJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKHMtPmRldl9taWRpKTsKKwlpb3VubWFwKHMtPnBCQTEpOworCWlvdW5tYXAocy0+cEJBMCk7CisJcGNpX3NldF9kcnZkYXRhKHBjaV9kZXYsTlVMTCk7CisJbGlzdF9kZWwoJnMtPmxpc3QpOworCWtmcmVlKHMpOworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJICJjczQyODE6IGNzNDI4MV9yZW1vdmUoKS06IHJlbW92ZSBzdWNjZXNzZnVsXG4iKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczQyODFfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvciAgICA9IFBDSV9WRU5ET1JfSURfQ0lSUlVTLAorCQkuZGV2aWNlICAgID0gUENJX0RFVklDRV9JRF9DUllTVEFMX0NTNDI4MSwKKwkJLnN1YnZlbmRvciA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgPSBQQ0lfQU5ZX0lELAorCX0sCisJeyAwLCB9LAorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGNzNDI4MV9wY2lfdGJsKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGNzNDI4MV9wY2lfZHJpdmVyID0geworCS5uYW1lCSAgPSAiY3M0MjgxIiwKKwkuaWRfdGFibGUgPSBjczQyODFfcGNpX3RibCwKKwkucHJvYmUJICA9IGNzNDI4MV9wcm9iZSwKKwkucmVtb3ZlCSAgPSBfX2RldmV4aXRfcChjczQyODFfcmVtb3ZlKSwKKwkuc3VzcGVuZCAgPSBDUzQyODFfU1VTUEVORF9UQkwsCisJLnJlc3VtZQkgID0gQ1M0MjgxX1JFU1VNRV9UQkwsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBjczQyODFfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlpbnQgcnRuID0gMDsKKwlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0MjgxOiBjczQyODFfaW5pdF9tb2R1bGUoKSsgXG4iKSk7CisJcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiB2ZXJzaW9uIHYlZC4lMDJkLiVkIHRpbWUgIiBfX1RJTUVfXyAiICIKKwkgICAgICAgX19EQVRFX18gIlxuIiwgQ1M0MjgxX01BSk9SX1ZFUlNJT04sIENTNDI4MV9NSU5PUl9WRVJTSU9OLAorCSAgICAgICBDUzQyODFfQVJDSCk7CisJcnRuID0gcGNpX21vZHVsZV9pbml0KCZjczQyODFfcGNpX2RyaXZlcik7CisKKwlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI4MTogY3M0MjgxX2luaXRfbW9kdWxlKCktICglZClcbiIscnRuKSk7CisJcmV0dXJuIHJ0bjsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNzNDI4MV9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmY3M0MjgxX3BjaV9kcml2ZXIpOworI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisJY3NfcG1fdW5yZWdpc3Rlcl9hbGwoY3M0MjgxX3BtX2NhbGxiYWNrKTsKKyNlbmRpZgorCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0MjgxOiBjbGVhbnVwX2NzNDI4MSgpIGZpbmlzaGVkXG4iKSk7Cit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKK01PRFVMRV9BVVRIT1IoImd3IGJveW50b24sIGF1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJDaXJydXMgTG9naWMgQ1M0MjgxIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKK21vZHVsZV9pbml0KGNzNDI4MV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChjczQyODFfY2xlYW51cF9tb2R1bGUpOworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MXBtLTI0LmMgYi9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MXBtLTI0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNDUzYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9jczQyODEvY3M0MjgxcG0tMjQuYwpAQCAtMCwwICsxLDg0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICJjczQyODFwbS5jIiAtLSAgQ2lycnVzIExvZ2ljLUNyeXN0YWwgQ1M0MjgxIGxpbnV4IGF1ZGlvIGRyaXZlci4KKyoKKyogICAgICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgQ2lycnVzIExvZ2ljIENvcnAuICAKKyogICAgICAgICAgICAtLSB0b20gd29sbGVyICh0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbSkgb3IKKyogICAgICAgICAgICAgICAoYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAxMi8yMi8wMCB0cncgLSBuZXcgZmlsZS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZuZGVmIE5PVF9DUzQyODFfUE0KKyNpbmNsdWRlIDxsaW51eC9wbS5oPgorCisjZGVmaW5lIGNzX3BtX3JlZ2lzdGVyKGEsIGIsIGMpIHBtX3JlZ2lzdGVyKChhKSwgKGIpLCAoYykpOworI2RlZmluZSBjc19wbV91bnJlZ2lzdGVyX2FsbChhKSBwbV91bnJlZ2lzdGVyX2FsbCgoYSkpOworCitzdGF0aWMgaW50IGNzNDI4MV9zdXNwZW5kKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpOworc3RhdGljIGludCBjczQyODFfcmVzdW1lKHN0cnVjdCBjczQyODFfc3RhdGUgKnMpOworLyogCisqIGZvciBub3cgKDEyLzIyLzAwKSBvbmx5IGVuYWJsZSB0aGUgcG1fcmVnaXN0ZXIgUE0gc3VwcG9ydC4KKyogYWxsb3cgdGhlc2UgdGFibGUgZW50cmllcyB0byBiZSBudWxsLgorI2RlZmluZSBDUzQyODFfU1VTUEVORF9UQkwgY3M0MjgxX3N1c3BlbmRfdGJsCisjZGVmaW5lIENTNDI4MV9SRVNVTUVfVEJMIGNzNDI4MV9yZXN1bWVfdGJsCisqLworI2RlZmluZSBDUzQyODFfU1VTUEVORF9UQkwgY3M0MjgxX3N1c3BlbmRfbnVsbAorI2RlZmluZSBDUzQyODFfUkVTVU1FX1RCTCBjczQyODFfcmVzdW1lX251bGwKKworc3RhdGljIGludCBjczQyODFfcG1fY2FsbGJhY2soc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgY3M0MjgxX3N0YXRlICpzdGF0ZTsKKworCUNTX0RCR09VVChDU19QTSwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDI4MTogY3M0MjgxX3BtX2NhbGxiYWNrIGRldj0lcCBycXN0PTB4JXggc3RhdGU9JXBcbiIsCisJCQlkZXYsKHVuc2lnbmVkKXJxc3QsZGF0YSkpOworCXN0YXRlID0gKHN0cnVjdCBjczQyODFfc3RhdGUgKikgZGV2LT5kYXRhOworCWlmIChzdGF0ZSkgeworCQlzd2l0Y2gocnFzdCkgeworCQkJY2FzZSBQTV9TVVNQRU5EOgorCQkJCUNTX0RCR09VVChDU19QTSwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiY3M0MjgxOiBQTSBzdXNwZW5kIHJlcXVlc3RcbiIpKTsKKwkJCQlpZihjczQyODFfc3VzcGVuZChzdGF0ZSkpCisJCQkJeworCQkJCSAgICBDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCQkJImNzNDI4MTogUE0gc3VzcGVuZCByZXF1ZXN0IHJlZnVzZWRcbiIpKTsKKwkJCQkJcmV0dXJuIDE7IAorCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgUE1fUkVTVU1FOgorCQkJCUNTX0RCR09VVChDU19QTSwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiY3M0MjgxOiBQTSByZXN1bWUgcmVxdWVzdFxuIikpOworCQkJCWlmKGNzNDI4MV9yZXN1bWUoc3RhdGUpKQorCQkJCXsKKwkJCQkgICAgQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSJjczQyODE6IFBNIHJlc3VtZSByZXF1ZXN0IHJlZnVzZWRcbiIpKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNlbHNlIC8qIENTNDI4MV9QTSAqLworI2RlZmluZSBDUzQyODFfU1VTUEVORF9UQkwgY3M0MjgxX3N1c3BlbmRfbnVsbAorI2RlZmluZSBDUzQyODFfUkVTVU1FX1RCTCBjczQyODFfcmVzdW1lX251bGwKKyNlbmRpZiAvKiBDUzQyODFfUE0gKi8KKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDI4MS9jczQyODFwbS5oIGIvc291bmQvb3NzL2NzNDI4MS9jczQyODFwbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NGZkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvY3M0MjgxL2NzNDI4MXBtLmgKQEAgLTAsMCArMSw3NCBAQAorI2lmbmRlZiBOT1RfQ1M0MjgxX1BNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICJjczQyODFwbS5oIiAtLSAgQ2lycnVzIExvZ2ljLUNyeXN0YWwgQ1M0MjgxIGxpbnV4IGF1ZGlvIGRyaXZlci4KKyoKKyogICAgICBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgQ2lycnVzIExvZ2ljIENvcnAuICAKKyogICAgICAgICAgICAtLSB0b20gd29sbGVyICh0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbSkgb3IKKyogICAgICAgICAgICAgICAoYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAxMi8yMi8wMCB0cncgLSBuZXcgZmlsZS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZ2VuZXJhbCBwbSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBDUzQyODFfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFIDB4MjYKKyNkZWZpbmUgQ1M0MjgxX0FDOTdfTlVNQkVSX1JFU1RPUkVfUkVHUyAoQ1M0MjgxX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRS8yLTEpCisKKy8qIHBpcGVsaW5lIGRlZmluaXRpb25zICovCisjZGVmaW5lIENTNDI4MV9OVU1CRVJfT0ZfUElQRUxJTkVTIAk0CisjZGVmaW5lIENTNDI4MV9QSVBFTElORV9WQUxJRCAJCTB4MDAwMQorI2RlZmluZSBDUzQyODFfUExBWUJBQ0tfUElQRUxJTkVfTlVNQkVSCTB4MDAwMAorI2RlZmluZSBDUzQyODFfQ0FQVFVSRV9QSVBFTElORV9OVU1CRVIgCTB4MDAwMQorCisvKiBQTSBzdGF0ZSBkZWZpbnRpb25zICovCisjZGVmaW5lIENTNDI4MV9QTV9OT1RfUkVHSVNURVJFRAkweDEwMDAKKyNkZWZpbmUgQ1M0MjgxX1BNX0lETEUJCQkweDAwMDEKKyNkZWZpbmUgQ1M0MjgxX1BNX1NVU1BFTkRJTkcJCTB4MDAwMgorI2RlZmluZSBDUzQyODFfUE1fU1VTUEVOREVECQkweDAwMDQKKyNkZWZpbmUgQ1M0MjgxX1BNX1JFU1VNSU5HCQkweDAwMDgKKyNkZWZpbmUgQ1M0MjgxX1BNX1JFU1VNRUQJCTB4MDAxMAorCitzdHJ1Y3QgY3M0MjgxX3BtIHsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB1MzJDTEtDUjFfU0FWRSx1MzJTU1BNVmFsdWUsdTMyUFBMVkN2YWx1ZSx1MzJQUFJWQ3ZhbHVlOworCXUzMiB1MzJGTUxWQ3ZhbHVlLHUzMkZNUlZDdmFsdWUsdTMyR1BJT1J2YWx1ZSx1MzJKU0NUTHZhbHVlLHUzMlNTQ1I7CisJdTMyIHUzMlNSQ1NBLHUzMkRhY0FTUix1MzJBZGNBU1IsdTMyRGFjU1IsdTMyQWRjU1IsdTMyTUlEQ1JfU2F2ZTsKKwl1MzIgdTMyU1NQTV9CSVRTOworCXUzMiBhYzk3W0NTNDI4MV9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1NdOworCXUzMiB1MzJBQzk3X21hc3Rlcl92b2x1bWUsIHUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZSwgdTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm87CisJdTMyIHUzMkFDOTdfcGNtX291dF92b2x1bWUsIHUzMkFDOTdfcG93ZXJkb3duLCB1MzJBQzk3X2dlbmVyYWxfcHVycG9zZTsKKwl1MzIgdTMyaHdwdHJfcGxheWJhY2ssdTMyaHdwdHJfY2FwdHVyZTsKK307CisKK3N0cnVjdCBjczQyODFfcGlwZWxpbmUgeworCXVuc2lnbmVkIGZsYWdzOworCXVuc2lnbmVkIG51bWJlcjsKKwl1MzIgdTMyREJBblZhbHVlLHUzMkRCQ25WYWx1ZSx1MzJETVJuVmFsdWUsdTMyRENSblZhbHVlOworCXUzMiB1MzJEQkFuQWRkcmVzcyx1MzJEQ0FuQWRkcmVzcyx1MzJEQkNuQWRkcmVzcyx1MzJEQ0NuQWRkcmVzczsKKwl1MzIgdTMyRE1SbkFkZHJlc3MsdTMyRENSbkFkZHJlc3MsdTMySERTUm5BZGRyZXNzOworCXUzMiB1MzJEQkFuX1NhdmUsdTMyREJDbl9TYXZlLHUzMkRNUm5fU2F2ZSx1MzJEQ1JuX1NhdmU7CisJdTMyIHUzMkRDQ25fU2F2ZSx1MzJEQ0FuX1NhdmU7CisvKiAKKyogdGVjaG5pY2FsbHksIHRoZXNlIGFyZSBmaWZvIHZhcmlhYmxlcywgYnV0IGp1c3QgbWFwIHRoZSAKKyogZmlyc3QgZmlmbyB3aXRoIHRoZSBmaXJzdCBwaXBlbGluZSBhbmQgdGhlbiB1c2UgdGhlIGZpZm8KKyogdmFyaWFibGVzIGluc2lkZSBvZiB0aGUgcGlwZWxpbmUgc3RydWN0LgorKi8KKwl1MzIgdTMyRkNSbl9TYXZlLHUzMkZTSUNuX1NhdmU7CisJdTMyIHUzMkZDUm5WYWx1ZSx1MzJGQ1JuQWRkcmVzcyx1MzJGU0lDblZhbHVlLHUzMkZTSUNuQWRkcmVzczsKKwl1MzIgdTMyRlBEUm5WYWx1ZSx1MzJGUERSbkFkZHJlc3M7Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvY3M0NjF4LmggYi9zb3VuZC9vc3MvY3M0NjF4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNlNDEzMwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9jczQ2MXguaApAQCAtMCwwICsxLDE2OTEgQEAKKyNpZm5kZWYgX19DUzQ2MVhfSAorI2RlZmluZSBfX0NTNDYxWF9ICisKKy8qCisgKiAgQ29weXJpZ2h0IChjKSBieSBDaXJydXMgTG9naWMgQ29ycG9yYXRpb24gPHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tPgorICogIENvcHlyaWdodCAoYykgYnkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PgorICogIERlZmluaXRpb25zIGZvciBDaXJydXMgTG9naWMgQ1M0NjF4IGNoaXBzCisgKgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0NJUlJVUworI2RlZmluZSBQQ0lfVkVORE9SX0lEX0NJUlJVUyAgICAgICAgICAgIDB4MTAxMworI2VuZGlmCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMCAgICAgICAweDYwMDEKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjEyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTIgICAgICAgMHg2MDAzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxNQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjE1ICAgICAgIDB4NjAwNAorI2VuZGlmCisKKy8qCisgKiAgRGlyZWN0IHJlZ2lzdGVycworICovCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIG9mZnNldHMgb2YgdGhlIHJlZ2lzdGVycyBhY2Nlc3NlZCB2aWEgYmFzZSBhZGRyZXNzCisgKiAgcmVnaXN0ZXIgemVybyBvbiB0aGUgQ1M0NjF4IHBhcnQuCisgKi8KKyNkZWZpbmUgQkEwX0hJU1IJCQkJMHgwMDAwMDAwMAorI2RlZmluZSBCQTBfSFNSMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBCQTBfSElDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBCQTBfRE1TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBCQTBfSFNBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAorI2RlZmluZSBCQTBfSERBUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNAorI2RlZmluZSBCQTBfSERNUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOAorI2RlZmluZSBCQTBfSERDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQworI2RlZmluZSBCQTBfUEZNQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBCQTBfUEZDVjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwNAorI2RlZmluZSBCQTBfUEZDVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwOAorI2RlZmluZSBCQTBfUENJQ0ZHMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBCQTBfUENJQ0ZHMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwNAorI2RlZmluZSBCQTBfUENJQ0ZHMDggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwOAorI2RlZmluZSBCQTBfUENJQ0ZHMEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMwQworI2RlZmluZSBCQTBfUENJQ0ZHMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxMAorI2RlZmluZSBCQTBfUENJQ0ZHMTQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxNAorI2RlZmluZSBCQTBfUENJQ0ZHMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxOAorI2RlZmluZSBCQTBfUENJQ0ZHMUMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMxQworI2RlZmluZSBCQTBfUENJQ0ZHMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyMAorI2RlZmluZSBCQTBfUENJQ0ZHMjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyNAorI2RlZmluZSBCQTBfUENJQ0ZHMjggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyOAorI2RlZmluZSBCQTBfUENJQ0ZHMkMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMyQworI2RlZmluZSBCQTBfUENJQ0ZHMzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzMAorI2RlZmluZSBCQTBfUENJQ0ZHMzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzNAorI2RlZmluZSBCQTBfUENJQ0ZHMzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzOAorI2RlZmluZSBCQTBfUENJQ0ZHM0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDMzQworI2RlZmluZSBCQTBfQ0xLQ1IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwMAorI2RlZmluZSBCQTBfQ0xLQ1IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwNAorI2RlZmluZSBCQTBfUExMTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwOAorI2RlZmluZSBCQTBfUExMQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQwQworI2RlZmluZSBCQTBfRlJSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDQxMCAKKyNkZWZpbmUgQkEwX0NGTDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MTQKKyNkZWZpbmUgQkEwX0NGTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MTgKKyNkZWZpbmUgQkEwX1NFUk1DMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjAKKyNkZWZpbmUgQkEwX1NFUk1DMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjQKKyNkZWZpbmUgQkEwX1NFUkMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MjgKKyNkZWZpbmUgQkEwX1NFUkMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MkMKKyNkZWZpbmUgQkEwX1NFUkMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MzAKKyNkZWZpbmUgQkEwX1NFUkM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MzQKKyNkZWZpbmUgQkEwX1NFUkM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MzgKKyNkZWZpbmUgQkEwX1NFUkJTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0M0MKKyNkZWZpbmUgQkEwX1NFUkJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NDAKKyNkZWZpbmUgQkEwX1NFUkJDTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NDQKKyNkZWZpbmUgQkEwX1NFUkJBRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NDgKKyNkZWZpbmUgQkEwX1NFUkJDRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NEMKKyNkZWZpbmUgQkEwX1NFUkJXUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NTAKKyNkZWZpbmUgQkEwX1NFUkJSUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NTQKKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEJBMF9BU0VSX0ZBRERSICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDU4CisjZW5kaWYKKyNkZWZpbmUgQkEwX0FDQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjAKKyNkZWZpbmUgQkEwX0FDU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjQKKyNkZWZpbmUgQkEwX0FDT1NWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NjgKKyNkZWZpbmUgQkEwX0FDQ0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NkMKKyNkZWZpbmUgQkEwX0FDQ0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzAKKyNkZWZpbmUgQkEwX0FDSVNWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzQKKyNkZWZpbmUgQkEwX0FDU0FEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0NzgKKyNkZWZpbmUgQkEwX0FDU0RBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0N0MKKyNkZWZpbmUgQkEwX0pTUFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODAKKyNkZWZpbmUgQkEwX0pTQ1RMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODQKKyNkZWZpbmUgQkEwX0pTQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0ODgKKyNkZWZpbmUgQkEwX0pTQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OEMKKyNkZWZpbmUgQkEwX01JRENSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTAKKyNkZWZpbmUgQkEwX01JRFNSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTQKKyNkZWZpbmUgQkEwX01JRFdQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OTgKKyNkZWZpbmUgQkEwX01JRFJQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0OUMKKyNkZWZpbmUgQkEwX0pTSU8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QTAKKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEJBMF9BU0VSX01BU1RFUiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEE0CisjZW5kaWYKKyNkZWZpbmUgQkEwX0NGR0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjAKKyNkZWZpbmUgQkEwX1NTVklEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjQKKyNkZWZpbmUgQkEwX0dQSU9SICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA0QjgKKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEJBMF9FR1BJT0RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEJDCisjZGVmaW5lIEJBMF9FR1BJT1BUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEMwCisjZGVmaW5lIEJBMF9FR1BJT1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEM0CisjZGVmaW5lIEJBMF9FR1BJT1dSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEM4CisjZGVmaW5lIEJBMF9FR1BJT1NSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNENDCisjZGVmaW5lIEJBMF9TRVJDNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEQwCisjZGVmaW5lIEJBMF9TRVJDNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEQ0CisjZGVmaW5lIEJBMF9TRVJBQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEQ4CisjZGVmaW5lIEJBMF9BQ0NUTDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEUwCisjZGVmaW5lIEJBMF9BQ1NUUzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEU0CisjZGVmaW5lIEJBMF9BQ09TVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEU4CisjZGVmaW5lIEJBMF9BQ0NBRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEVDCisjZGVmaW5lIEJBMF9BQ0NEQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEYwCisjZGVmaW5lIEJBMF9BQ0lTVjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEY0CisjZGVmaW5lIEJBMF9BQ1NBRDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEY4CisjZGVmaW5lIEJBMF9BQ1NEQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNEZDCisjZGVmaW5lIEJBMF9JT1RBQzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTAwCisjZGVmaW5lIEJBMF9JT1RBQzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTA0CisjZGVmaW5lIEJBMF9JT1RBQzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTA4CisjZGVmaW5lIEJBMF9JT1RBQzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTBDCisjZGVmaW5lIEJBMF9JT1RBQzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTEwCisjZGVmaW5lIEJBMF9JT1RBQzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTE0CisjZGVmaW5lIEJBMF9JT1RBQzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTE4CisjZGVmaW5lIEJBMF9JT1RBQzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTFDCisjZGVmaW5lIEJBMF9JT1RBQzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTIwCisjZGVmaW5lIEJBMF9JT1RBQzkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTI0CisjZGVmaW5lIEJBMF9JT1RBQzEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTI4CisjZGVmaW5lIEJBMF9JT1RBQzExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTJDCisjZGVmaW5lIEJBMF9JT1RGUjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTQwCisjZGVmaW5lIEJBMF9JT1RGUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTQ0CisjZGVmaW5lIEJBMF9JT1RGUjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTQ4CisjZGVmaW5lIEJBMF9JT1RGUjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTRDCisjZGVmaW5lIEJBMF9JT1RGUjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTUwCisjZGVmaW5lIEJBMF9JT1RGUjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTU0CisjZGVmaW5lIEJBMF9JT1RGUjYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTU4CisjZGVmaW5lIEJBMF9JT1RGUjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTVDCisjZGVmaW5lIEJBMF9JT1RGSUZPICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTgwCisjZGVmaW5lIEJBMF9JT1RSUkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTg0CisjZGVmaW5lIEJBMF9JT1RGUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTg4CisjZGVmaW5lIEJBMF9JT1RDUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNThDCisjZGVmaW5lIEJBMF9EUENJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTkwCisjZGVmaW5lIEJBMF9EUENJQSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTk0CisjZGVmaW5lIEJBMF9EUENJQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNTk4CisjZGVmaW5lIEJBMF9QQ1BDSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjAwCisjZGVmaW5lIEJBMF9QQ1BDSUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjA0CisjZGVmaW5lIEJBMF9QQ1BDSUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjA4CisjZGVmaW5lIEJBMF9FUENJUE1DICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNjEwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgcmVnaXN0ZXJzIGFuZCBtZW1vcmllcyBhY2Nlc3NlZCB2aWEKKyAqICBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgb25lIG9uIHRoZSBDUzQ2MXggcGFydC4KKyAqLworI2RlZmluZSBCQTFfU1BfRE1FTTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBCQTFfU1BfRE1FTTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBCQTFfU1BfUE1FTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBCQTFfU1BfUkVHCQkJCTB4MDAwMzAwMDAKKyNkZWZpbmUgQkExX1NQQ1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgQkExX0RSRUcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDQKKyNkZWZpbmUgQkExX0RTUldQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDgKKyNkZWZpbmUgQkExX1RXUFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMEMKKyNkZWZpbmUgQkExX1NQV1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMTAKKyNkZWZpbmUgQkExX1NQSVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMTQKKyNkZWZpbmUgQkExX0ZHUjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMjAKKyNkZWZpbmUgQkExX1NQQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMjgKKyNkZWZpbmUgQkExX1NEU1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMkMKKyNkZWZpbmUgQkExX0ZSTVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMzAKKyNkZWZpbmUgQkExX0ZSQ0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMzQKKyNkZWZpbmUgQkExX0ZSU0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMzgKKyNkZWZpbmUgQkExX09NTklfTUVNICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTAwMDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgaW50ZXJydXB0IHN0YXR1cworICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEhJU1JfVkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEhJU1JfVkMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhJU1JfVkMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhJU1JfVkMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhJU1JfVkMzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhJU1JfVkM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhJU1JfVkM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEhJU1JfVkM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhJU1JfVkM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhJU1JfVkM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEhJU1JfVkM5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhJU1JfVkMxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhJU1JfVkMxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEhJU1JfVkMxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEhJU1JfVkMxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhJU1JfVkMxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEhJU1JfVkMxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhJU1JfSU5UMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhJU1JfSU5UMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEhJU1JfRE1BSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEhJU1JfRlJPVlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEhJU1JfTUlESSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjaWZkZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEhJU1JfUkVTRVJWRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGRTAwMDAwCisjZWxzZQorI2RlZmluZSBISVNSX1NCSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDIwMDAwMAorI2RlZmluZSBISVNSX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwRkMwMDAwMAorI2VuZGlmCisjZGVmaW5lIEhJU1JfSDBQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEhJU1JfSU5URU5BICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IHNpZ25hbCByZWdpc3RlciAwLgorICovCisjZGVmaW5lIEhTUjBfVkNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIEhTUjBfVkMxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEhTUjBfVkMxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEhTUjBfVkMxOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEhTUjBfVkMxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEhTUjBfVkMyMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEhTUjBfVkMyMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIEhTUjBfVkMyMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIEhTUjBfVkMyMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIEhTUjBfVkMyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIEhTUjBfVkMyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIEhTUjBfVkMyNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIEhTUjBfVkMyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIEhTUjBfVkMyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIEhTUjBfVkMyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIEhTUjBfVkMzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIEhTUjBfVkMzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEhTUjBfVkMzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIEhTUjBfVkMzMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIEhTUjBfVkMzNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMDAwCisjZGVmaW5lIEhTUjBfVkMzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDgwMDAwCisjZGVmaW5lIEhTUjBfVkMzNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIEhTUjBfVkMzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIEhTUjBfVkMzOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwNDAwMDAwCisjZGVmaW5lIEhTUjBfVkMzOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAwCisjZGVmaW5lIEhTUjBfVkM0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0MiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA0MDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0NSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIEhTUjBfVkM0NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBob3N0IGludGVycnVwdCBjb250cm9sCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgSElDUl9JRVYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgSElDUl9DSEdNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIERNQSBzdGF0dXMgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRE1TUl9IUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRE1TUl9IUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRE1TUl9TUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRE1TUl9TUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgRE1BIHNvdXJjZSBhZGRyZXNzCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgSFNBUl9IT1NUX0FERFJfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgSFNBUl9EU1BfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgSFNBUl9NRU1JRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRjAwMDAKKyNkZWZpbmUgSFNBUl9NRU1JRF9TUF9ETUVNMCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgSFNBUl9NRU1JRF9TUF9ETUVNMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgSFNBUl9NRU1JRF9TUF9QTUVNICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgSFNBUl9NRU1JRF9TUF9ERUJVRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgSFNBUl9NRU1JRF9PTU5JX01FTSAgICAgICAgICAgICAgICAgICAgIDB4MDAwRTAwMDAKKyNkZWZpbmUgSFNBUl9FTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSFNBUl9FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGhvc3QgRE1BIGRlc3RpbmF0aW9uIGFkZHJlc3MKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBIREFSX0hPU1RfQUREUl9NQVNLICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBIREFSX0RTUF9BRERSX01BU0sgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBIREFSX01FTUlEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMAorI2RlZmluZSBIREFSX01FTUlEX1NQX0RNRU0wICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIREFSX01FTUlEX1NQX0RNRU0xICAgICAgICAgICAgICAgICAgICAgMHgwMDAxMDAwMAorI2RlZmluZSBIREFSX01FTUlEX1NQX1BNRU0gICAgICAgICAgICAgICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBIREFSX01FTUlEX1NQX0RFQlVHICAgICAgICAgICAgICAgICAgICAgMHgwMDAzMDAwMAorI2RlZmluZSBIREFSX01FTUlEX09NTklfTUVNICAgICAgICAgICAgICAgICAgICAgMHgwMDBFMDAwMAorI2RlZmluZSBIREFSX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBIREFSX0VSUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBETUEgY29udHJvbCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBIRE1SX0FDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRjAwMAorI2RlZmluZSBIRE1SX0FDXzhfMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBIRE1SX0FDX01fUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMjAwMAorI2RlZmluZSBIRE1SX0FDX0JfTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIRE1SX0FDX1NfVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgaG9zdCBETUEgY29udHJvbCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBIRENSX0NPVU5UX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDNGRgorI2RlZmluZSBIRENSX0RPTkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBIRENSX09QVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBIRENSX1dCRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDQwMDAwMAorI2RlZmluZSBIRENSX1dCUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBIRENSX0RNU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNzAwMDAwMAorI2RlZmluZSBIRENSX0RNU19MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIRENSX0RNU18xNl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgwMTAwMDAwMAorI2RlZmluZSBIRENSX0RNU18zMl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBIRENSX0RNU182NF9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgwMzAwMDAwMAorI2RlZmluZSBIRENSX0RNU18xMjhfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBIRENSX0RNU18yNTZfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHgwNTAwMDAwMAorI2RlZmluZSBIRENSX0RNU181MTJfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMAorI2RlZmluZSBIRENSX0RNU18xMDI0X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgMHgwNzAwMDAwMAorI2RlZmluZSBIRENSX0RIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBIRENSX1NNU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg3MDAwMDAwMAorI2RlZmluZSBIRENSX1NNU19MSU5FQVIgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBIRENSX1NNU18xNl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBIRENSX1NNU18zMl9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBIRENSX1NNU182NF9EV09SRFMgICAgICAgICAgICAgICAgICAgICAgMHgzMDAwMDAwMAorI2RlZmluZSBIRENSX1NNU18xMjhfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBIRENSX1NNU18yNTZfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHg1MDAwMDAwMAorI2RlZmluZSBIRENSX1NNU181MTJfRFdPUkRTICAgICAgICAgICAgICAgICAgICAgMHg2MDAwMDAwMAorI2RlZmluZSBIRENSX1NNU18xMDI0X0RXT1JEUyAgICAgICAgICAgICAgICAgICAgMHg3MDAwMDAwMAorI2RlZmluZSBIRENSX1NIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBIRENSX0NPVU5UX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgcGVyZm9ybWFuY2UgbW9uaXRvciBjb250cm9sCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgUEZNQ19DMVNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUYKKyNkZWZpbmUgUEZNQ19DMUVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgUEZNQ19DMVJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgUEZNQ19DMlNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAxRjAwMDAKKyNkZWZpbmUgUEZNQ19DMkVWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgUEZNQ19DMlJTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgUEZNQ19DMVNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUEZNQ19DMlNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFBGTUNfQlVTX0dSQU5UICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFBGTUNfR1JBTlRfQUZURVJfUkVRICAgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFBGTUNfVFJBTlNBQ1RJT04gICAgICAgICAgICAgICAgICAgICAgICAyCisjZGVmaW5lIFBGTUNfRFdPUkRfVFJBTlNGRVIgICAgICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIFBGTUNfU0xBVkVfUkVBRCAgICAgICAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIFBGTUNfU0xBVkVfV1JJVEUgICAgICAgICAgICAgICAgICAgICAgICA1CisjZGVmaW5lIFBGTUNfUFJFRU1QVElPTiAgICAgICAgICAgICAgICAgICAgICAgICA2CisjZGVmaW5lIFBGTUNfRElTQ09OTkVDVF9SRVRSWSAgICAgICAgICAgICAgICAgICA3CisjZGVmaW5lIFBGTUNfSU5URVJSVVBUICAgICAgICAgICAgICAgICAgICAgICAgICA4CisjZGVmaW5lIFBGTUNfQlVTX09XTkVSU0hJUCAgICAgICAgICAgICAgICAgICAgICA5CisjZGVmaW5lIFBGTUNfVFJBTlNBQ1RJT05fTEFHICAgICAgICAgICAgICAgICAgICAxMAorI2RlZmluZSBQRk1DX1BDSV9DTE9DSyAgICAgICAgICAgICAgICAgICAgICAgICAgMTEKKyNkZWZpbmUgUEZNQ19TRVJJQUxfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIFBGTUNfU1BfQ0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAxMworCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgcGVyZm9ybWFuY2UgY291bnRlciB2YWx1ZSAxCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgUEZDVjFfUEMxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgUEZDVjFfUEMxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHBlcmZvcm1hbmNlIGNvdW50ZXIgdmFsdWUgMgorICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFBGQ1YyX1BDMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGCisjZGVmaW5lIFBGQ1YyX1BDMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyIDEuCisgKi8KKyNkZWZpbmUgQ0xLQ1IxX09TQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ0xLQ1IxX09TQ1AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEMKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1NFUklBTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX0NSWVNUQUwgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1BDSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQ0xLQ1IxX1BMTFNTX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEMKKyNkZWZpbmUgQ0xLQ1IxX1BMTFAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQ0xLQ1IxX1NXQ0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQ0xLQ1IxX1BMTE9TICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgMi4KKyAqLworI2RlZmluZSBDTEtDUjJfUERJVlNfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRgorI2RlZmluZSBDTEtDUjJfUERJVlNfMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBDTEtDUjJfUERJVlNfMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBDTEtDUjJfUERJVlNfNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBDTEtDUjJfUERJVlNfNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBDTEtDUjJfUERJVlNfOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBDTEtDUjJfUERJVlNfMTYgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUExMIG11bHRpcGxpZXIgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgUExMTV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKyNkZWZpbmUgUExMTV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBMTCBjYXBhY2l0b3IgY29lZmZpY2llbnQKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBQTExDQ19DRFJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2lmbmRlZiBOT19DUzQ2MTAKKyNkZWZpbmUgUExMQ0NfQ0RSXzI0MF8zNTBfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUExMQ0NfQ0RSXzE4NF8yNjVfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUExMQ0NfQ0RSXzE0NF8yMDVfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUExMQ0NfQ0RSXzExMV8xNjBfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgUExMQ0NfQ0RSXzg3XzEyM19NSFogICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUExMQ0NfQ0RSXzY3Xzk2X01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgUExMQ0NfQ0RSXzUyXzc0X01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgUExMQ0NfQ0RSXzQ1XzU4X01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNlbmRpZgorI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgUExMQ0NfQ0RSXzI3MV8zOThfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUExMQ0NfQ0RSXzIyN18zMzBfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgUExMQ0NfQ0RSXzE2N18yMzlfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgUExMQ0NfQ0RSXzE1MF8yMTVfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgUExMQ0NfQ0RSXzEwN18xNTRfTUhaICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgUExMQ0NfQ0RSXzk4XzE0MF9NSFogICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDUKKyNkZWZpbmUgUExMQ0NfQ0RSXzczXzEwNF9NSFogICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgUExMQ0NfQ0RSXzYzXzkwX01IWiAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNlbmRpZgorI2RlZmluZSBQTExDQ19MUEZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGOAorI2lmbmRlZiBOT19DUzQ2MTAKKyNkZWZpbmUgUExMQ0NfTFBGXzIzODUwXzYwMDAwX0tIWiAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUExMQ0NfTFBGXzc5NjBfMjYyOTBfS0haICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUExMQ0NfTFBGXzQxNjBfMTA5ODBfS0haICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgUExMQ0NfTFBGXzE3NDBfNDU4MF9LSFogICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKKyNkZWZpbmUgUExMQ0NfTFBGXzcyNF8xOTEwX0tIWiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNzgKKyNkZWZpbmUgUExMQ0NfTFBGXzMxN183OThfS0haICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjgKKyNlbmRpZgorI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgUExMQ0NfTFBGXzI1NTgwXzY0NTMwX0tIWiAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgUExMQ0NfTFBGXzE0MzYwXzM3MjcwX0tIWiAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgUExMQ0NfTFBGXzYxMDBfMTYwMjBfS0haICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgUExMQ0NfTFBGXzI1NDBfNjY5MF9LSFogICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKKyNkZWZpbmUgUExMQ0NfTFBGXzEwNTBfMjc4MF9LSFogICAgICAgICAgICAgICAgIDB4MDAwMDAwNzgKKyNkZWZpbmUgUExMQ0NfTFBGXzQ1MF8xMTYwX0tIWiAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRjgKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZmVhdHVyZSByZXBvcnRpbmcgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRlJSX0ZBQl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgRlJSX01BU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUMKKyNpZmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgRlJSX0NGT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRTAKKyNlbHNlCisjZGVmaW5lIEZSUl9DRk9QX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwRkUwCisjZW5kaWYKKyNkZWZpbmUgRlJSX0NGT1BfTk9UX0RWRCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRlJSX0NGT1BfQTNEICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRlJSX0NGT1BfMTI4X1BJTiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEZSUl9DRk9QX0NTNDI4MCAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZW5kaWYKKyNkZWZpbmUgRlJSX0ZBQl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRlJSX01BU0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgRlJSX0NGT1BfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDUKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbG9hZCAxCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfQ1M0MjNYICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfQUM5NyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfQ1JZU1RBTCAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0ZMMV9DTE9DS19TT1VSQ0VfRFVBTF9BQzk3ICAgICAgICAgICAgIDB4MDAwMDAwMDMKKyNkZWZpbmUgQ0ZMMV9WQUxJRF9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbG9hZCAyCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQ0ZMMl9WQUxJRF9EQVRBX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwRkYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IG1hc3RlciBjb250cm9sCisgKiAgcmVnaXN0ZXIgMS4KKyAqLworI2RlZmluZSBTRVJNQzFfTVNQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTRVJNQzFfUFRDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRQorI2RlZmluZSBTRVJNQzFfUFRDX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBTRVJNQzFfUFRDX0FDOTcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTRVJNQzFfUFRDX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTRVJNQzFfUExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBTRVJNQzFfWExCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgbWFzdGVyIGNvbnRyb2wKKyAqICByZWdpc3RlciAyLgorICovCisjZGVmaW5lIFNFUk1DMl9MUk9FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNFUk1DMl9NQ09FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNFUk1DMl9NQ0RJViAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCAxIGNvbmZpZ3VyYXRpb24KKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTRVJDMV9TTzFFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTRVJDMV9TTzFGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwRQorI2RlZmluZSBTRVJDMV9TTzFGX0NTNDIzWCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBTRVJDMV9TTzFGX0FDOTcgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTRVJDMV9TTzFGX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTRVJDMV9TTzFGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgMiBjb25maWd1cmF0aW9uCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSQzJfU0kxRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VSQzJfU0kxRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEUKKyNkZWZpbmUgU0VSQzJfU0kxRl9DUzQyM1ggICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgU0VSQzJfU0kxRl9BQzk3ICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU0VSQzJfU0kxRl9BREMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU0VSQzJfU0kxRl9TUERJRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDMgY29uZmlndXJhdGlvbgorICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNFUkMzX1NPMkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNFUkMzX1NPMkZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA2CisjZGVmaW5lIFNFUkMzX1NPMkZfREFDICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFNFUkMzX1NPMkZfU1BESUYgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCA0IGNvbmZpZ3VyYXRpb24KKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTRVJDNF9TTzNFTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTRVJDNF9TTzNGX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNgorI2RlZmluZSBTRVJDNF9TTzNGX0RBQyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBTRVJDNF9TTzNGX1NQRElGICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgNSBjb25maWd1cmF0aW9uCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSQzVfU0kyRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VSQzVfU0kyRl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgU0VSQzVfU0kyRl9BREMgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgU0VSQzVfU0kyRl9TUERJRiAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHNhbXBsZQorICogIHBvaW50ZXIgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSQlNQX0ZTUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgU0VSQlNQX0ZTUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHN0YXR1cworICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNFUkJTVF9SUkRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNFUkJTVF9XQlNZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vciBjb21tYW5kCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSQkNNX1JEQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VSQkNNX1dSQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIGFkZHJlc3MKKyAqICByZWdpc3Rlci4KKyAqLworI2lmZGVmIE5PX0NTNDYxMgorI2RlZmluZSBTRVJCQURfRkFEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgorI2Vsc2UKKyNkZWZpbmUgU0VSQkFEX0ZBRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxRkYKKyNlbmRpZgorI2RlZmluZSBTRVJCQURfRkFEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgYmFja2Rvb3IKKyAqICBjb25maWd1cmF0aW9uIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNFUkJDRl9IQlAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBiYWNrZG9vciB3cml0ZQorICogIHBvcnQgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU0VSQldQX0ZXRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwRkZGRkYKKyNkZWZpbmUgU0VSQldQX0ZXRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IGJhY2tkb29yIHJlYWQKKyAqICBwb3J0IHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNFUkJSUF9GUkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEZGRkZGCisjZGVmaW5lIFNFUkJSUF9GUkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBhc3luYyBGSUZPIGFkZHJlc3MgcmVnaXN0ZXIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFTRVJfRkFERFJfQTFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMUZGCisjZGVmaW5lIEFTRVJfRkFERFJfRU4xICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDA4MDAwCisjZGVmaW5lIEFTRVJfRkFERFJfQTJfTUFTSyAgICAgICAgICAgICAgICAgICAgICAweDAxRkYwMDAwCisjZGVmaW5lIEFTRVJfRkFERFJfRU4yICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIEFTRVJfRkFERFJfQTFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEFTRVJfRkFERFJfQTJfU0hJRlQgICAgICAgICAgICAgICAgICAgICAxNgorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbnRyb2wgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQUNDVExfUlNUTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQUNDVExfRVNZTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQUNDVExfVkZSTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQUNDVExfRENWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQUNDVExfQ1JXICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQUNDVExfQVNZTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFDQ1RMX1RDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEFDU1RTX0NSRFkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFDU1RTX1ZTVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBBQ1NUU19XS1VQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IG91dHB1dCBzbG90IHZhbGlkCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQUNPU1ZfU0xWMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQUNPU1ZfU0xWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQUNPU1ZfU0xWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQUNPU1ZfU0xWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgQUNPU1ZfU0xWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgQUNPU1ZfU0xWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgQUNPU1ZfU0xWOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgQUNPU1ZfU0xWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgQUNPU1ZfU0xWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgQUNPU1ZfU0xWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBhZGRyZXNzCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQUNDQURfQ0lfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKKyNkZWZpbmUgQUNDQURfQ0lfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBkYXRhIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEFDQ0RBX0NEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEFDQ0RBX0NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGlucHV0IHNsb3QgdmFsaWQKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBBQ0lTVl9JU1YzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBQ0lTVl9JU1Y0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBQ0lTVl9JU1Y1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBQ0lTVl9JU1Y2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBQ0lTVl9JU1Y3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBQ0lTVl9JU1Y4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBQ0lTVl9JU1Y5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBQ0lTVl9JU1YxMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBQ0lTVl9JU1YxMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBQ0lTVl9JU1YxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgYWRkcmVzcworICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEFDU0FEX1NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGCisjZGVmaW5lIEFDU0FEX1NJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBkYXRhIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEFDU0RBX1NEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEFDU0RBX1NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBqb3lzdGljayBwb2xsL3RyaWdnZXIKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBKU1BUX0NBWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBKU1BUX0NBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBKU1BUX0NCWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBKU1BUX0NCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBKU1BUX0JBMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBKU1BUX0JBMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBKU1BUX0JCMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBKU1BUX0JCMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgY29udHJvbCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBKU0NUTF9TUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBKU0NUTF9TUF9TTE9XICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBKU0NUTF9TUF9NRURJVU1fU0xPVyAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBKU0NUTF9TUF9NRURJVU1fRkFTVCAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBKU0NUTF9TUF9GQVNUICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMworI2RlZmluZSBKU0NUTF9BUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgY29vcmRpbmF0ZSBwYWlyIDEKKyAqICByZWFkYmFjayByZWdpc3Rlci4KKyAqLworI2RlZmluZSBKU0MxX1kxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBKU0MxX1gxVl9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGMDAwMAorI2RlZmluZSBKU0MxX1kxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBKU0MxX1gxVl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGpveXN0aWNrIGNvb3JkaW5hdGUgcGFpciAyCisgKiAgcmVhZGJhY2sgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgSlNDMl9ZMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgSlNDMl9YMlZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgSlNDMl9ZMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSlNDMl9YMlZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIGNvbnRyb2wgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgTUlEQ1JfVFhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogRW5hYmxlIHRyYW5zbWl0dGluZy4gKi8KKyNkZWZpbmUgTUlEQ1JfUlhFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIJLyogRW5hYmxlIHJlY2VpdmluZy4gKi8KKyNkZWZpbmUgTUlEQ1JfUklFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQJLyogSW50ZXJydXB0IHVwb24gdHggcmVhZHkuICovCisjZGVmaW5lIE1JRENSX1RJRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CS8qIEludGVycnVwdCB1cG9uIHJ4IHJlYWR5LiAqLworI2RlZmluZSBNSURDUl9NTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAkvKiBFbmFibGUgbWlkaSBsb29wYmFjay4gKi8KKyNkZWZpbmUgTUlEQ1JfTVJTVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAJLyogUmVzZXQgaW50ZXJmYWNlLiAqLworCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgTUlESSBzdGF0dXMgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgTUlEU1JfVEJGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEJLyogVHggRklGTyBpcyBmdWxsLiAqLworI2RlZmluZSBNSURTUl9SQkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgkvKiBSeCBGSUZPIGlzIGVtcHR5LiAqLworCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgTUlESSB3cml0ZSBwb3J0IHJlZ2lzdGVyLgorICovCisjZGVmaW5lIE1JRFdQX01XRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEZGCisjZGVmaW5lIE1JRFdQX01XRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBNSURJIHJlYWQgcG9ydCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBNSURSUF9NUkRfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgorI2RlZmluZSBNSURSUF9NUkRfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgam95c3RpY2sgR1BJTyByZWdpc3Rlci4KKyAqLworI2RlZmluZSBKU0lPX0RBWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBKU0lPX0RBWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBKU0lPX0RCWCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBKU0lPX0RCWSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBKU0lPX0FYT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBKU0lPX0FZT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBKU0lPX0JYT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBKU0lPX0JZT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgbWFzdGVyIGFzeW5jL3N5bmMgc2VyaWFsCisgKiAgcG9ydCBlbmFibGUgcmVnaXN0ZXIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFTRVJfTUFTVEVSX01FICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gaW50ZXJmYWNlCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgQ0ZHSV9DTEsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgQ0ZHSV9ET1VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgQ0ZHSV9ESU5fRUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQ0ZHSV9FRUxEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHN1YnN5c3RlbSBJRCBhbmQgdmVuZG9yIElECisgKiAgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU1NWSURfVklEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgU1NWSURfU0lEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRjAwMDAKKyNkZWZpbmUgU1NWSURfVklEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgU1NWSURfU0lEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBHUElPIHBpbiBpbnRlcmZhY2UgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgR1BJT1JfVk9MRE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgR1BJT1JfVk9MVVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgR1BJT1JfU0kyRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgR1BJT1JfU0kyT0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGV4dGVuZGVkIEdQSU8gcGluIGRpcmVjdGlvbgorICogIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBFR1BJT0RSX0dQT0UwICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFR1BJT0RSX0dQT0UxICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFR1BJT0RSX0dQT0UyICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFR1BJT0RSX0dQT0UzICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFR1BJT0RSX0dQT0U0ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFR1BJT0RSX0dQT0U1ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBFR1BJT0RSX0dQT0U2ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFR1BJT0RSX0dQT0U3ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFR1BJT0RSX0dQT0U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbiBwb2xhcml0eS8KKyAqICB0eXBlIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBFR1BJT1BUUl9HUFBUMCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFR1BJT1BUUl9HUFBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFR1BJT1BUUl9HUFBUMiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFR1BJT1BUUl9HUFBUMyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFR1BJT1BUUl9HUFBUNCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFR1BJT1BUUl9HUFBUNSAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBFR1BJT1BUUl9HUFBUNiAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFR1BJT1BUUl9HUFBUNyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFR1BJT1BUUl9HUFBUOCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbiBzdGlja3kKKyAqICByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgRUdQSU9UUl9HUFMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUdQSU9UUl9HUFMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUdQSU9UUl9HUFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRUdQSU9UUl9HUFMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRUdQSU9UUl9HUFM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRUdQSU9UUl9HUFM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRUdQSU9UUl9HUFM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRUdQSU9UUl9HUFM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRUdQSU9UUl9HUFM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgR1BJTyBwaW5nIHdha2V1cAorICogIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBFR1BJT1dSX0dQVzAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFR1BJT1dSX0dQVzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBFR1BJT1dSX0dQVzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBFR1BJT1dSX0dQVzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBFR1BJT1dSX0dQVzQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBFR1BJT1dSX0dQVzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBFR1BJT1dSX0dQVzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBFR1BJT1dSX0dQVzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBFR1BJT1dSX0dQVzggICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBleHRlbmRlZCBHUElPIHBpbiBzdGF0dXMKKyAqICByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgRUdQSU9TUl9HUFMwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRUdQSU9TUl9HUFMxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRUdQSU9TUl9HUFMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRUdQSU9TUl9HUFMzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRUdQSU9TUl9HUFM0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRUdQSU9TUl9HUFM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRUdQSU9TUl9HUFM2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRUdQSU9TUl9HUFM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRUdQSU9TUl9HUFM4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc2VyaWFsIHBvcnQgNiBjb25maWd1cmF0aW9uCisgKiAgcmVnaXN0ZXIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIFNFUkM2X0FTRE8yRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlcmlhbCBwb3J0IDcgY29uZmlndXJhdGlvbgorICogIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBTRVJDN19BU0RJMkVOICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTRVJDN19QT1NJTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTRVJDN19TSVBPTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTRVJDN19TT1NJTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTRVJDN19TSVNPTEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzZXJpYWwgcG9ydCBBQyBsaW5rCisgKiAgY29uZmlndXJhdGlvbiByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgU0VSQUNDX0NPREVDX1RZUEVfTUFTSyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VSQUNDX0NPREVDX1RZUEVfMV8wMyAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgU0VSQUNDX0NPREVDX1RZUEVfMl8wICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU0VSQUNDX1RXT19DT0RFQ1MgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU0VSQUNDX01ETSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU0VSQUNDX0hTUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVyIDIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFDQ1RMMl9SU1ROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFDQ1RMMl9FU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIEFDQ1RMMl9WRlJNICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIEFDQ1RMMl9EQ1YgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIEFDQ1RMMl9DUlcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIEFDQ1RMMl9BU1lOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyIDIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFDU1RTMl9DUkRZICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIEFDU1RTMl9WU1RTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgb3V0cHV0IHNsb3QgdmFsaWQKKyAqICByZWdpc3RlciAyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBBQ09TVjJfU0xWMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBQ09TVjJfU0xWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBQ09TVjJfU0xWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBQ09TVjJfU0xWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBQ09TVjJfU0xWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBQ09TVjJfU0xWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBQ09TVjJfU0xWOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBQ09TVjJfU0xWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBQ09TVjJfU0xWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBQ09TVjJfU0xWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGNvbW1hbmQgYWRkcmVzcworICogIHJlZ2lzdGVyIDIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIEFDQ0FEMl9DSV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDdGCisjZGVmaW5lIEFDQ0FEMl9DSV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEFDOTcgY29tbWFuZCBkYXRhIHJlZ2lzdGVyCisgKiAgMi4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgQUNDREEyX0NEX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgQUNDREEyX0NEX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAgIAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IGlucHV0IHNsb3QgdmFsaWQKKyAqICByZWdpc3RlciAyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBBQ0lTVjJfSVNWMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBBQ0lTVjJfSVNWNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBBQ0lTVjJfSVNWNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBBQ0lTVjJfSVNWNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBBQ0lTVjJfSVNWNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBQ0lTVjJfSVNWOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBBQ0lTVjJfSVNWOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBBQ0lTVjJfSVNWMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBBQ0lTVjJfSVNWMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBBQ0lTVjJfSVNWMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBBQzk3IHN0YXR1cyBhZGRyZXNzCisgKiAgcmVnaXN0ZXIgMi4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgQUNTQUQyX1NJX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKKyNkZWZpbmUgQUNTQUQyX1NJX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgQUM5NyBzdGF0dXMgZGF0YSByZWdpc3RlciAyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBBQ1NEQTJfU0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBBQ1NEQTJfU0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBhZGRyZXNzIGFuZCBjb250cm9sCisgKiAgcmVnaXN0ZXJzIChhbGwgMTIpLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBJT1RBQ19TQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBJT1RBQ19NU0tfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDBGMDAwMAorI2RlZmluZSBJT1RBQ19JT0RDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwNjAwMDAwMAorI2RlZmluZSBJT1RBQ19JT0RDXzE2X0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBJT1RBQ19JT0RDXzEwX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBJT1RBQ19JT0RDXzEyX0JJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwNDAwMDAwMAorI2RlZmluZSBJT1RBQ19XU1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwODAwMDAwMAorI2RlZmluZSBJT1RBQ19SU1BJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAorI2RlZmluZSBJT1RBQ19XU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMDAwMDAwMAorI2RlZmluZSBJT1RBQ19XRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDAwMDAwMAorI2RlZmluZSBJT1RBQ19SRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBJT1RBQ19TQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBJT1RBQ19NU0tfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgMTYKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgZmFzdCByZWFkIHJlZ2lzdGVycworICogIChhbGwgOCkuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIElPVEZSX0RfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIElPVEZSX0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMEYwMDAwCisjZGVmaW5lIElPVEZSX1JfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDBGMDAwMDAwCisjZGVmaW5lIElPVEZSX0FMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIElPVEZSX1ZMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIElPVEZSX0RfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIElPVEZSX0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAxNgorI2RlZmluZSBJT1RGUl9SX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgSS9PIHRyYXAgRklGTyByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgSU9URklGT19CQV9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDNGRkYKKyNkZWZpbmUgSU9URklGT19TX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDBGRjAwMDAKKyNkZWZpbmUgSU9URklGT19PRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgSU9URklGT19TUElPRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgSU9URklGT19CQV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU9URklGT19TX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIHJldHJ5IHJlYWQgZGF0YQorICogIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBJT1RSUkRfRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBJT1RSUkRfUkRWICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAorI2RlZmluZSBJT1RSUkRfRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBJL08gdHJhcCBGSUZPIHBvaW50ZXIKKyAqICByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgSU9URlBfQ0FfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDNGRkYKKyNkZWZpbmUgSU9URlBfUEFfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4M0ZGRjAwMDAKKyNkZWZpbmUgSU9URlBfQ0FfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgSU9URlBfUEFfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2CisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIEkvTyB0cmFwIGNvbnRyb2wgcmVnaXN0ZXIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIElPVENSX0lURCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIElPVENSX0hSViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIElPVENSX1NSViAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIElPVENSX0RUSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIElPVENSX0RGSSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIElPVENSX0REUCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIElPVENSX0pURSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIElPVENSX1BQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGRpcmVjdCBQQ0kgZGF0YSByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgRFBDSURfRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4RkZGRkZGRkYKKyNkZWZpbmUgRFBDSURfRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGlyZWN0IFBDSSBhZGRyZXNzIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBEUENJQV9BX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBEUENJQV9BX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2VuZGlmCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBkaXJlY3QgUENJIGNvbW1hbmQgcmVnaXN0ZXIuCisgKi8KKyNpZm5kZWYgTk9fQ1M0NjEyCisjZGVmaW5lIERQQ0lDX0NfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIERQQ0lDX0NfSU9SRUFEICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIERQQ0lDX0NfSU9XUklURSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAzCisjZGVmaW5lIERQQ0lDX0JFX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMEYwCisjZW5kaWYKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIFBDL1BDSSByZXF1ZXN0IHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBQQ1BDSVJfUkRDX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworI2RlZmluZSBQQ1BDSVJfQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwNzAwMAorI2RlZmluZSBQQ1BDSVJfUkVRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBQQ1BDSVJfUkRDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBQQ1BDSVJfQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMTIKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUEMvUENJIGdyYW50IHJlZ2lzdGVyLgorICovIAorI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgUENQQ0lHX0dEQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDcKKyNkZWZpbmUgUENQQ0lHX1ZMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgUENQQ0lHX0dEQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgUEMvUENJIG1hc3RlciBlbmFibGUKKyAqICByZWdpc3Rlci4KKyAqLworI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgUENQQ0lFTl9FTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZXh0ZW5kZWQgUENJIHBvd2VyCisgKiAgbWFuYWdlbWVudCBjb250cm9sIHJlZ2lzdGVyLgorICovCisjaWZuZGVmIE5PX0NTNDYxMgorI2RlZmluZSBFUENJUE1DX0dXVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBFUENJUE1DX0ZTUEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2VuZGlmIAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU1AgY29udHJvbCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTUENSX1JVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBTUENSX1NUUEZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBTUENSX1JVTkZSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAorI2RlZmluZSBTUENSX1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwOAorI2RlZmluZSBTUENSX0RSUUVOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBTUENSX1JTVFNQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTUENSX09SRU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDA4MAorI2lmbmRlZiBOT19DUzQ2MTIKKyNkZWZpbmUgU1BDUl9QQ0lJTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgU1BDUl9PSU5URCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgU1BDUl9DUkUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNlbmRpZgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZGVidWcgaW5kZXggcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRFJFR19SRUdJRF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0YKKyNkZWZpbmUgRFJFR19ERUJVRyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgRFJFR19SR0JLX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgRFJFR19UUkFQICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA4MDAKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCisjaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQorI2RlZmluZSBEUkVHX1RSQVBYICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMAorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgRFJFR19SRUdJRF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgRFJFR19SR0JLX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRFJFR19SR0JLX1JFR0lEX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDA3N0YKKyNkZWZpbmUgRFJFR19SRUdJRF9SMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRFJFR19SRUdJRF9SMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTEKKyNkZWZpbmUgRFJFR19SRUdJRF9SMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTIKKyNkZWZpbmUgRFJFR19SRUdJRF9SMyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTMKKyNkZWZpbmUgRFJFR19SRUdJRF9SNCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTQKKyNkZWZpbmUgRFJFR19SRUdJRF9SNSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTUKKyNkZWZpbmUgRFJFR19SRUdJRF9SNiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTYKKyNkZWZpbmUgRFJFR19SRUdJRF9SNyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTcKKyNkZWZpbmUgRFJFR19SRUdJRF9SOCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTgKKyNkZWZpbmUgRFJFR19SRUdJRF9SOSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTkKKyNkZWZpbmUgRFJFR19SRUdJRF9SQSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUEKKyNkZWZpbmUgRFJFR19SRUdJRF9SQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUIKKyNkZWZpbmUgRFJFR19SRUdJRF9SQyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUMKKyNkZWZpbmUgRFJFR19SRUdJRF9SRCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUQKKyNkZWZpbmUgRFJFR19SRUdJRF9SRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUUKKyNkZWZpbmUgRFJFR19SRUdJRF9SRiAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMUYKKyNkZWZpbmUgRFJFR19SRUdJRF9SQV9CVVNfTE9XICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRFJFR19SRUdJRF9SQV9CVVNfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMzgKKyNkZWZpbmUgRFJFR19SRUdJRF9ZQlVTX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTAKKyNkZWZpbmUgRFJFR19SRUdJRF9ZQlVTX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNTgKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDEKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzIgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDIKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzMgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDMKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzQgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDQKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDUKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzYgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDYKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQXzcgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAxMDcKKyNkZWZpbmUgRFJFR19SRUdJRF9JTkRJUkVDVF9BRERSRVNTICAgICAgICAgICAgIDB4MDAwMDAxMEUKKyNkZWZpbmUgRFJFR19SRUdJRF9UT1BfT0ZfU1RBQ0sgICAgICAgICAgICAgICAgIDB4MDAwMDAxMEYKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCisjaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfOCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfOSAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExMworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTQgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTUgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExNworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTYgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTcgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExOQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTggICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMTkgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExQworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjEgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjIgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfMjMgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDExRgorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0EwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0EwX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDEKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0ExX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDIKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0ExX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDMKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0EyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDQKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0EzICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDUKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0kwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDYKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0kwX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDcKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0kxICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDgKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0kyICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMDkKKyNkZWZpbmUgRFJFR19SRUdJRF9TQUdVU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMEEKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzAxX0xPVyAgICAgICAgICAgICAgIDB4MDAwMDAyMEIKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzAxX0hJR0ggICAgICAgICAgICAgIDB4MDAwMDAyMEMKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzIzX0xPVyAgICAgICAgICAgICAgIDB4MDAwMDAyMEQKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0NPTkZJRzIzX0hJR0ggICAgICAgICAgICAgIDB4MDAwMDAyMEUKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0RNQTAxRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMEYKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0RNQTIzRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTAKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QwX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTEKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QwX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTIKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QxX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTMKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QxX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTQKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QyX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTUKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QyX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTYKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QzX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTcKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0QzX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMTgKKyNkZWZpbmUgRFJFR19SRUdJRF9TUkFSX0hJR0ggICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUEKKyNkZWZpbmUgRFJFR19SRUdJRF9TUkFSX0xPVyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUIKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEUgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAyMUMKKyNkZWZpbmUgRFJFR19SRUdJRF9DVVJSRU5UX0RNQV9TVFJFQU0gICAgICAgICAgIDB4MDAwMDAyMUQKKyNkZWZpbmUgRFJFR19SRUdJRF9ORVhUX0RNQV9TVFJFQU0gICAgICAgICAgICAgIDB4MDAwMDAyMUUKKyNkZWZpbmUgRFJFR19SRUdJRF9DUFVfU1RBVFVTICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUNfTU9ERSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDEKKyNkZWZpbmUgRFJFR19SRUdJRF9TVEFDS19BTkRfUkVQRUFUICAgICAgICAgICAgIDB4MDAwMDAzMDIKKyNkZWZpbmUgRFJFR19SRUdJRF9JTkRFWDAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDQKKyNkZWZpbmUgRFJFR19SRUdJRF9JTkRFWDEgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzMDUKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMF8zICAgICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNF83ICAgICAgICAgICAgICAgIDB4MDAwMDA0MDQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfOF8xMSAgICAgICAgICAgICAgIDB4MDAwMDA0MDgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMTJfMTUgICAgICAgICAgICAgIDB4MDAwMDA0MEMKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMTZfMTkgICAgICAgICAgICAgIDB4MDAwMDA0MTAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjBfMjMgICAgICAgICAgICAgIDB4MDAwMDA0MTQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjRfMjcgICAgICAgICAgICAgIDB4MDAwMDA0MTgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMjhfMzEgICAgICAgICAgICAgIDB4MDAwMDA0MUMKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMzJfMzUgICAgICAgICAgICAgIDB4MDAwMDA0MjAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfMzZfMzkgICAgICAgICAgICAgIDB4MDAwMDA0MjQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDBfNDMgICAgICAgICAgICAgIDB4MDAwMDA0MjgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDRfNDcgICAgICAgICAgICAgIDB4MDAwMDA0MkMKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNDhfNTEgICAgICAgICAgICAgIDB4MDAwMDA0MzAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNTJfNTUgICAgICAgICAgICAgIDB4MDAwMDA0MzQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNTZfNTkgICAgICAgICAgICAgIDB4MDAwMDA0MzgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjBfNjMgICAgICAgICAgICAgIDB4MDAwMDA0M0MKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjRfNjcgICAgICAgICAgICAgIDB4MDAwMDA0NDAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNjhfNzEgICAgICAgICAgICAgIDB4MDAwMDA0NDQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNzJfNzUgICAgICAgICAgICAgIDB4MDAwMDA0NDgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfNzZfNzkgICAgICAgICAgICAgIDB4MDAwMDA0NEMKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODBfODMgICAgICAgICAgICAgIDB4MDAwMDA0NTAKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODRfODcgICAgICAgICAgICAgIDB4MDAwMDA0NTQKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfODhfOTEgICAgICAgICAgICAgIDB4MDAwMDA0NTgKKyNkZWZpbmUgRFJFR19SRUdJRF9ETUFfU1RBVEVfOTJfOTUgICAgICAgICAgICAgIDB4MDAwMDA0NUMKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1NFTEVDVCAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDAKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzAgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDAKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzEgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDEKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzIgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDIKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzMgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDMKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzQgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDQKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzUgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDUKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzYgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDYKKyNkZWZpbmUgRFJFR19SRUdJRF9UUkFQX1dSSVRFXzcgICAgICAgICAgICAgICAgIDB4MDAwMDA1MDcKKyNpZiAhZGVmaW5lZChOT19DUzQ2MTIpCisjaWYgIWRlZmluZWQoTk9fQ1M0NjE1KQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfOCAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfOSAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTAgICAgICAgICAgICAgICAgMHgwMDAwMDUxMgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTEgICAgICAgICAgICAgICAgMHgwMDAwMDUxMworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTIgICAgICAgICAgICAgICAgMHgwMDAwMDUxNAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTMgICAgICAgICAgICAgICAgMHgwMDAwMDUxNQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTQgICAgICAgICAgICAgICAgMHgwMDAwMDUxNgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTUgICAgICAgICAgICAgICAgMHgwMDAwMDUxNworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTYgICAgICAgICAgICAgICAgMHgwMDAwMDUxOAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTcgICAgICAgICAgICAgICAgMHgwMDAwMDUxOQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTggICAgICAgICAgICAgICAgMHgwMDAwMDUxQQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMTkgICAgICAgICAgICAgICAgMHgwMDAwMDUxQgorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjAgICAgICAgICAgICAgICAgMHgwMDAwMDUxQworI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjEgICAgICAgICAgICAgICAgMHgwMDAwMDUxRAorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjIgICAgICAgICAgICAgICAgMHgwMDAwMDUxRQorI2RlZmluZSBEUkVHX1JFR0lEX1RSQVBfV1JJVEVfMjMgICAgICAgICAgICAgICAgMHgwMDAwMDUxRgorI2VuZGlmCisjZW5kaWYKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDAKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDEKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDIKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDMKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDQKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDUKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDYKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfTE9XICAgICAgICAgICAgICAgIDB4MDAwMDA2MDcKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MDgKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MDkKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEEKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEIKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEMKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEQKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEUKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfTUlEICAgICAgICAgICAgICAgIDB4MDAwMDA2MEYKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzBfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTAKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzFfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTEKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzJfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTIKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMwX0FDQzNfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTMKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzBfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTQKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzFfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTUKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzJfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTYKKyNkZWZpbmUgRFJFR19SRUdJRF9NQUMxX0FDQzNfSElHSCAgICAgICAgICAgICAgIDB4MDAwMDA2MTcKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfTE9XICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MjAKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfTUlEICAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MjgKKyNkZWZpbmUgRFJFR19SRUdJRF9SU0hPVVRfSElHSCAgICAgICAgICAgICAgICAgIDB4MDAwMDA2MzAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIERNQSBzdHJlYW0gcmVxdWVzdG9yIHdyaXRlCisgKi8KKyNkZWZpbmUgRFNSV1BfRFNSX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMEYKKyNkZWZpbmUgRFNSV1BfRFNSX0JHX1JRICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZX01BU0sgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzEgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzIgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRFNSV1BfRFNSX1BSSU9SSVRZXzMgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDYKKyNkZWZpbmUgRFNSV1BfRFNSX1JRX1BFTkRJTkcgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHRyYXAgd3JpdGUgcG9ydCByZWdpc3Rlci4KKyAqLworI2RlZmluZSBUV1BSX1RXX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBUV1BSX1RXX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgc3RhY2sgcG9pbnRlciB3cml0ZQorICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNQV1JfU1RLUF9NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDBGCisjZGVmaW5lIFNQV1JfU1RLUF9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBTUCBpbnRlcnJ1cHQgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgU1BJUl9GUkkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgU1BJUl9ET0kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgU1BJUl9HUEkyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgU1BJUl9HUEkzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgU1BJUl9JUDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgU1BJUl9JUDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgU1BJUl9JUDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgU1BJUl9JUDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZ1bmN0aW9uYWwgZ3JvdXAgMSByZWdpc3Rlci4KKyAqLworI2RlZmluZSBGR1IxX0YxU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBGR1IxX0YxU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU1AgY2xvY2sgc3RhdHVzIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIFNQQ1NfRlJJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIFNQQ1NfRE9JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFNQQ1NfR1BJMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIFNQQ1NfR1BJMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIFNQQ1NfSVAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIFNQQ1NfSVAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNQQ1NfSVAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFNQQ1NfSVAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIFNQQ1NfU1BSVU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMTAwCisjZGVmaW5lIFNQQ1NfU0xFRVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFNQQ1NfRkcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFNQQ1NfT1JVTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwODAwCisjZGVmaW5lIFNQQ1NfSVJRICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFNQQ1NfRkdOX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBFMDAwCisjZGVmaW5lIFNQQ1NfRkdOX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAxMworCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgU1AgRE1BIHJlcXVlc3RvciBzdGF0dXMKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBTRFNSX0RDU19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDBGRgorI2RlZmluZSBTRFNSX0RDU19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBTRFNSX0RDU19OT05FICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNworCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZnJhbWUgdGltZXIgcmVnaXN0ZXIuCisgKi8KKyNkZWZpbmUgRlJNVF9GVFZfTUFTSyAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMEZGRkYKKyNkZWZpbmUgRlJNVF9GVFZfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIGZyYW1lIHRpbWVyIGN1cnJlbnQgY291bnQKKyAqICByZWdpc3Rlci4KKyAqLworI2RlZmluZSBGUkNDX0ZDQ19NQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwRkZGRgorI2RlZmluZSBGUkNDX0ZDQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMAorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgZm9yIHRoZSBmbGFncyBpbiB0aGUgZnJhbWUgdGltZXIgc2F2ZSBjb3VudAorICogIHJlZ2lzdGVyLgorICovCisjZGVmaW5lIEZSU0NfRkNTX01BU0sgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIEZSU0NfRkNTX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmUgdGhlIHZhcmlvdXMgZmxhZ3Mgc3RvcmVkIGluIHRoZSBzY2F0dGVyL2dhdGhlcgorICogIGRlc2NyaXB0b3JzLgorICovCisjZGVmaW5lIERNQV9TR19ORVhUX0VOVFJZX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAwRkY4CisjZGVmaW5lIERNQV9TR19TQU1QTEVfRU5EX01BU0sgICAgICAgICAgICAgICAgICAweDBGRkYwMDAwCisjZGVmaW5lIERNQV9TR19TQU1QTEVfRU5EX0ZMQUcgICAgICAgICAgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIERNQV9TR19MT09QX0VORF9GTEFHICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCisjZGVmaW5lIERNQV9TR19TSUdOQUxfRU5EX0ZMQUcgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIERNQV9TR19TSUdOQUxfUEFHRV9GTEFHICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIERNQV9TR19ORVhUX0VOVFJZX1NISUZUICAgICAgICAgICAgICAgICAzCisjZGVmaW5lIERNQV9TR19TQU1QTEVfRU5EX1NISUZUICAgICAgICAgICAgICAgICAxNgorCisvKgorICogIFRoZSBmb2xsb3dpbmcgZGVmaW5lIHRoZSBvZmZzZXRzIG9mIHRoZSBmaWVsZHMgd2l0aGluIHRoZSBvbi1jaGlwIGdlbmVyaWMKKyAqICBETUEgcmVxdWVzdG9yLgorICovCisjZGVmaW5lIERNQV9SUV9DT05UUk9MMSAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIERNQV9SUV9DT05UUk9MMiAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIERNQV9SUV9TT1VSQ0VfQUREUiAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4CisjZGVmaW5lIERNQV9SUV9ERVNUSU5BVElPTl9BRERSICAgICAgICAgICAgICAgICAweDAwMDAwMDBDCisjZGVmaW5lIERNQV9SUV9ORVhUX1BBR0VfQUREUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDEwCisjZGVmaW5lIERNQV9SUV9ORVhUX1BBR0VfU0dERVNDICAgICAgICAgICAgICAgICAweDAwMDAwMDE0CisjZGVmaW5lIERNQV9SUV9MT09QX1NUQVJUX0FERFIgICAgICAgICAgICAgICAgICAweDAwMDAwMDE4CisjZGVmaW5lIERNQV9SUV9QT1NUX0xPT1BfQUREUiAgICAgICAgICAgICAgICAgICAweDAwMDAwMDFDCisjZGVmaW5lIERNQV9SUV9QQUdFX01BUF9BRERSICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDIwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBmaXJzdCBjb250cm9sIHdvcmQgb2YgdGhlCisgKiAgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCisgKi8KKyNkZWZpbmUgRE1BX1JRX0MxX0NPVU5UX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAzRkYKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RJTkFUSU9OX1NDQVRURVIgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9HQVRIRVIgICAgICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RPTkVfRkxBRyAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX09QVElNSVpFX1NUQVRFICAgICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NBTVBMRV9FTkRfU1RBVEVfTUFTSyAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0ZVTExfUEFHRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0JFRk9SRV9TQU1QTEVfRU5EICAgICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BBR0VfTUFQX0VSUk9SICAgICAgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0FUX1NBTVBMRV9FTkQgICAgICAgICAgICAgICAgIDB4MDAwMzAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0xPT1BfRU5EX1NUQVRFX01BU0sgICAgICAgICAgIDB4MDAwQzAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX05PVF9MT09QX0VORCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0JFRk9SRV9MT09QX0VORCAgICAgICAgICAgICAgIDB4MDAwNDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxXzJQQUdFX0xPT1BfQkVHSU4gICAgICAgICAgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0xPT1BfQkVHSU4gICAgICAgICAgICAgICAgICAgIDB4MDAwQzAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BBR0VfTUFQX01BU0sgICAgICAgICAgICAgICAgIDB4MDAzMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BNX05PTkVfUEVORElORyAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BNX05FWFRfUEVORElORyAgICAgICAgICAgICAgIDB4MDAxMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BNX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgIDB4MDAyMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1BNX0xPT1BfTkVYVF9QRU5ESU5HICAgICAgICAgIDB4MDAzMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1dSSVRFQkFDS19ERVNUX0ZMQUcgICAgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1dSSVRFQkFDS19TUkNfRkxBRyAgICAgICAgICAgIDB4MDA4MDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfU0laRV9NQVNLICAgICAgICAgICAgICAgIDB4MDcwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTElORUFSICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMTYgICAgICAgICAgICAgICAgICAgIDB4MDEwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMzIgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9ENjQgICAgICAgICAgICAgICAgICAgIDB4MDMwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMTI4ICAgICAgICAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMjU2ICAgICAgICAgICAgICAgICAgIDB4MDUwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9ENTEyICAgICAgICAgICAgICAgICAgIDB4MDYwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfTU9EMTAyNCAgICAgICAgICAgICAgICAgIDB4MDcwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0RFU1RfT05fSE9TVCAgICAgICAgICAgICAgICAgIDB4MDgwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9TSVpFX01BU0sgICAgICAgICAgICAgIDB4NzAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9MSU5FQVIgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QxNiAgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QzMiAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0Q2NCAgICAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QxMjggICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QyNTYgICAgICAgICAgICAgICAgIDB4NTAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0Q1MTIgICAgICAgICAgICAgICAgIDB4NjAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9NT0QxMDI0ICAgICAgICAgICAgICAgIDB4NzAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX1NPVVJDRV9PTl9IT1NUICAgICAgICAgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MxX0NPVU5UX1NISUZUICAgICAgICAgICAgICAgICAgIDAKKworLyoKKyAqICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIGZvciB0aGUgZmxhZ3MgaW4gdGhlIHNlY29uZCBjb250cm9sIHdvcmQgb2YgdGhlCisgKiAgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCisgKi8KKyNkZWZpbmUgRE1BX1JRX0MyX1ZJUlRVQUxfQ0hBTk5FTF9NQVNLICAgICAgICAgIDB4MDAwMDAwM0YKKyNkZWZpbmUgRE1BX1JRX0MyX1ZJUlRVQUxfU0lHTkFMX01BU0sgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgRE1BX1JRX0MyX05PX1ZJUlRVQUxfU0lHTkFMICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9FVkVSWV9ETUEgICAgICAgICAgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9TT1VSQ0VfUElOR1BPTkcgICAgICAgIDB4MDAwMDAyMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9ERVNUX1BJTkdQT05HICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FVRElPX0NPTlZFUlRfTUFTSyAgICAgICAgICAgIDB4MDAwMEYwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FDX05PTkUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FDXzhfVE9fMTZfQklUICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FDX01PTk9fVE9fU1RFUkVPICAgICAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FDX0VORElBTl9DT05WRVJUICAgICAgICAgICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0FDX1NJR05FRF9DT05WRVJUICAgICAgICAgICAgIDB4MDAwMDgwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0xPT1BfRU5EX01BU0sgICAgICAgICAgICAgICAgIDB4MEZGRjAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX0xPT1BfTUFTSyAgICAgICAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX05PX0xPT1AgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX09ORV9QQUdFX0xPT1AgICAgICAgICAgICAgICAgIDB4MTAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1RXT19QQUdFX0xPT1AgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX01VTFRJX1BBR0VfTE9PUCAgICAgICAgICAgICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9MT09QX0JBQ0sgICAgICAgICAgICAgIDB4NDAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1NJR05BTF9QT1NUX0JFR0lOX1BBR0UgICAgICAgIDB4ODAwMDAwMDAKKyNkZWZpbmUgRE1BX1JRX0MyX1ZJUlRVQUxfQ0hBTk5FTF9TSElGVCAgICAgICAgIDAKKyNkZWZpbmUgRE1BX1JRX0MyX0xPT1BfRU5EX1NISUZUICAgICAgICAgICAgICAgIDE2CisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHdvcmRzCisgKiAgb2YgdGhlIG9uLWNoaXAgZ2VuZXJpYyBETUEgcmVxdWVzdG9yLgorICovCisjZGVmaW5lIERNQV9SUV9TRF9BRERSRVNTX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDBGRkZGCisjZGVmaW5lIERNQV9SUV9TRF9NRU1PUllfSURfTUFTSyAgICAgICAgICAgICAgICAweDAwMEYwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9TUF9QQVJBTV9BRERSICAgICAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9TUF9TQU1QTEVfQUREUiAgICAgICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9TUF9QUk9HUkFNX0FERFIgICAgICAgICAgICAgICAweDAwMDIwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9TUF9ERUJVR19BRERSICAgICAgICAgICAgICAgICAweDAwMDMwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9PTU5JTUVNX0FERFIgICAgICAgICAgICAgICAgICAweDAwMEUwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9FTkRfRkxBRyAgICAgICAgICAgICAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9FUlJPUl9GTEFHICAgICAgICAgICAgICAgICAgICAweDgwMDAwMDAwCisjZGVmaW5lIERNQV9SUV9TRF9BRERSRVNTX1NISUZUICAgICAgICAgICAgICAgICAwCisKKy8qCisgKiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBmb3IgdGhlIGZsYWdzIGluIHRoZSBwYWdlIG1hcCBhZGRyZXNzIHdvcmQgb2YgdGhlCisgKiAgb24tY2hpcCBnZW5lcmljIERNQSByZXF1ZXN0b3IuCisgKi8KKyNkZWZpbmUgRE1BX1JRX1BNQV9MT09QX1RISVJEX1BBR0VfRU5UUllfTUFTSyAgIDB4MDAwMDBGRjgKKyNkZWZpbmUgRE1BX1JRX1BNQV9QQUdFX1RBQkxFX01BU0sgICAgICAgICAgICAgIDB4RkZGRkYwMDAKKyNkZWZpbmUgRE1BX1JRX1BNQV9MT09QX1RISVJEX1BBR0VfRU5UUllfU0hJRlQgIDMKKyNkZWZpbmUgRE1BX1JRX1BNQV9QQUdFX1RBQkxFX1NISUZUICAgICAgICAgICAgIDEyCisKKyNkZWZpbmUgQkExX1ZBUklERUNfQlVGXzEgICAgICAgMHgwMDAKKworI2RlZmluZSBCQTFfUERUQyAgICAgICAgICAgICAgICAweDBjMCAgICAvKiBCQTFfUExBWV9ETUFfVFJBTlNBQ1RJT05fQ09VTlRfUkVHICovCisjZGVmaW5lIEJBMV9QRklFICAgICAgICAgICAgICAgIDB4MGM0ICAgIC8qIEJBMV9QTEFZX0ZPUk1BVF8mX0lOVEVSUlVQVF9FTkFCTEVfUkVHICovCisjZGVmaW5lIEJBMV9QQkEgICAgICAgICAgICAgICAgIDB4MGM4ICAgIC8qIEJBMV9QTEFZX0JVRkZFUl9BRERSRVNTICovCisjZGVmaW5lIEJBMV9QVk9MICAgICAgICAgICAgICAgIDB4MGY4ICAgIC8qIEJBMV9QTEFZX1ZPTFVNRV9SRUcgKi8KKyNkZWZpbmUgQkExX1BTUkMgICAgICAgICAgICAgICAgMHgyODggICAgLyogQkExX1BMQVlfU0FNUExFX1JBVEVfQ09SUkVDVElPTl9SRUcgKi8KKyNkZWZpbmUgQkExX1BDVEwgICAgICAgICAgICAgICAgMHgyYTQgICAgLyogQkExX1BMQVlfQ09OVFJPTF9SRUcgKi8KKyNkZWZpbmUgQkExX1BQSSAgICAgICAgICAgICAgICAgMHgyYjQgICAgLyogQkExX1BMQVlfUEhBU0VfSU5DUkVNRU5UX1JFRyAqLworCisjZGVmaW5lIEJBMV9DQ1RMICAgICAgICAgICAgICAgIDB4MDY0ICAgIC8qIEJBMV9DQVBUVVJFX0NPTlRST0xfUkVHICovCisjZGVmaW5lIEJBMV9DSUUgICAgICAgICAgICAgICAgIDB4MTA0ICAgIC8qIEJBMV9DQVBUVVJFX0lOVEVSUlVQVF9FTkFCTEVfUkVHICovCisjZGVmaW5lIEJBMV9DQkEgICAgICAgICAgICAgICAgIDB4MTBjICAgIC8qIEJBMV9DQVBUVVJFX0JVRkZFUl9BRERSRVNTICovCisjZGVmaW5lIEJBMV9DU1JDICAgICAgICAgICAgICAgIDB4MmM4ICAgIC8qIEJBMV9DQVBUVVJFX1NBTVBMRV9SQVRFX0NPUlJFQ1RJT05fUkVHICovCisjZGVmaW5lIEJBMV9DQ0kgICAgICAgICAgICAgICAgIDB4MmQ4ICAgIC8qIEJBMV9DQVBUVVJFX0NPRUZGSUNJRU5UX0lOQ1JFTUVOVF9SRUcgKi8KKyNkZWZpbmUgQkExX0NEICAgICAgICAgICAgICAgICAgMHgyZTAgICAgLyogQkExX0NBUFRVUkVfREVMQVlfUkVHICovCisjZGVmaW5lIEJBMV9DUEkgICAgICAgICAgICAgICAgIDB4MmY0ICAgIC8qIEJBMV9DQVBUVVJFX1BIQVNFX0lOQ1JFTUVOVF9SRUcgKi8KKyNkZWZpbmUgQkExX0NWT0wgICAgICAgICAgICAgICAgMHgyZjggICAgLyogQkExX0NBUFRVUkVfVk9MVU1FX1JFRyAqLworCisjZGVmaW5lIEJBMV9DRkcxICAgICAgICAgICAgICAgIDB4MTM0ICAgIC8qIEJBMV9DQVBUVVJFX0ZSQU1FX0dST1VQXzFfUkVHICovCisjZGVmaW5lIEJBMV9DRkcyICAgICAgICAgICAgICAgIDB4MTM4ICAgIC8qIEJBMV9DQVBUVVJFX0ZSQU1FX0dST1VQXzJfUkVHICovCisjZGVmaW5lIEJBMV9DQ1NUICAgICAgICAgICAgICAgIDB4MTNjICAgIC8qIEJBMV9DQVBUVVJFX0NPTlNUQU5UX1JFRyAqLworI2RlZmluZSBCQTFfQ1NQQiAgICAgICAgICAgICAgICAweDM0MCAgICAvKiBCQTFfQ0FQVFVSRV9TUEJfQUREUkVTUyAqLworCisvKgorICoKKyAqLworCisjZGVmaW5lIENTNDYxWF9NT0RFX09VVFBVVAkoMTw8MCkJIC8qIE1JREkgVUFSVCAtIG91dHB1dCAqLyAKKyNkZWZpbmUgQ1M0NjFYX01PREVfSU5QVVQJKDE8PDEpCSAvKiBNSURJIFVBUlQgLSBpbnB1dCAqLworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisvLyBUaGUgZm9sbG93aW5nIGRlZmluZSB0aGUgb2Zmc2V0cyBvZiB0aGUgQUM5NyBzaGFkb3cgcmVnaXN0ZXJzLCB3aGljaCBhcHBlYXIKKy8vIGFzIGEgdmlydHVhbCBleHRlbnNpb24gdG8gdGhlIGJhc2UgYWRkcmVzcyByZWdpc3RlciB6ZXJvIG1lbW9yeSByYW5nZS4KKy8vCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyNkZWZpbmUgQUM5N19SRUdfT0ZGU0VUX01BU0sgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwN0VMCisjZGVmaW5lIEFDOTdfQ09ERUNfTlVNQkVSX01BU0sgICAgICAgICAgICAgICAgICAweDAwMDAzMDAwTAorCisjZGVmaW5lIEJBMF9BQzk3X1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDAwTAorI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVk9MVU1FICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwMkwKKyNkZWZpbmUgQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSAgICAgICAgICAgICAgIDB4MDAwMDEwMDRMCisjZGVmaW5lIEJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyAgICAgICAgICAgICAweDAwMDAxMDA2TAorI2RlZmluZSBCQTBfQUM5N19NQVNURVJfVE9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwOEwKKyNkZWZpbmUgQkEwX0FDOTdfUENfQkVFUF9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMEFMCisjZGVmaW5lIEJBMF9BQzk3X1BIT05FX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAweDAwMDAxMDBDTAorI2RlZmluZSBCQTBfQUM5N19NSUNfVk9MVU1FICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAwRUwKKyNkZWZpbmUgQkEwX0FDOTdfTElORV9JTl9WT0xVTUUgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTBMCisjZGVmaW5lIEJBMF9BQzk3X0NEX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDEyTAorI2RlZmluZSBCQTBfQUM5N19WSURFT19WT0xVTUUgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxNEwKKyNkZWZpbmUgQkEwX0FDOTdfQVVYX1ZPTFVNRSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMTZMCisjZGVmaW5lIEJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FICAgICAgICAgICAgICAgICAweDAwMDAxMDE4TAorI2RlZmluZSBCQTBfQUM5N19SRUNPUkRfU0VMRUNUICAgICAgICAgICAgICAgICAgMHgwMDAwMTAxQUwKKyNkZWZpbmUgQkEwX0FDOTdfUkVDT1JEX0dBSU4gICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMUNMCisjZGVmaW5lIEJBMF9BQzk3X1JFQ09SRF9HQUlOX01JQyAgICAgICAgICAgICAgICAweDAwMDAxMDFFTAorI2RlZmluZSBCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UgICAgICAgICAgICAgICAgMHgwMDAwMTAyMEwKKyNkZWZpbmUgQkEwX0FDOTdfM0RfQ09OVFJPTCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjJMCisjZGVmaW5lIEJBMF9BQzk3X01PREVNX1JBVEUgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDI0TAorI2RlZmluZSBCQTBfQUM5N19QT1dFUkRPV04gICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMTAyNkwKKyNkZWZpbmUgQkEwX0FDOTdfRVhUX0FVRElPX0lEICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMjhMCisjZGVmaW5lIEJBMF9BQzk3X0VYVF9BVURJT19QT1dFUiAgICAgICAgICAgICAgICAweDAwMDAxMDJBTAorI2RlZmluZSBCQTBfQUM5N19QQ01fRlJPTlRfREFDX1JBVEUgICAgICAgICAgICAgMHgwMDAwMTAyQ0wKKyNkZWZpbmUgQkEwX0FDOTdfUENNX1NVUlJfREFDX1JBVEUgICAgICAgICAgICAgIDB4MDAwMDEwMkVMCisjZGVmaW5lIEJBMF9BQzk3X1BDTV9MRkVfREFDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDMwTAorI2RlZmluZSBCQTBfQUM5N19QQ01fTFJfQURDX1JBVEUgICAgICAgICAgICAgICAgMHgwMDAwMTAzMkwKKyNkZWZpbmUgQkEwX0FDOTdfTUlDX0FEQ19SQVRFICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMzRMCisjZGVmaW5lIEJBMF9BQzk3XzZDSF9WT0xfQ19MRkUgICAgICAgICAgICAgICAgICAweDAwMDAxMDM2TAorI2RlZmluZSBCQTBfQUM5N182Q0hfVk9MX1NVUlJPVU5EICAgICAgICAgICAgICAgMHgwMDAwMTAzOEwKKyNkZWZpbmUgQkEwX0FDOTdfUkVTRVJWRURfM0EgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwM0FMCisjZGVmaW5lIEJBMF9BQzk3X0VYVF9NT0RFTV9JRCAgICAgICAgICAgICAgICAgICAweDAwMDAxMDNDTAorI2RlZmluZSBCQTBfQUM5N19FWFRfTU9ERU1fUE9XRVIgICAgICAgICAgICAgICAgMHgwMDAwMTAzRUwKKyNkZWZpbmUgQkEwX0FDOTdfTElORTFfQ09ERUNfUkFURSAgICAgICAgICAgICAgIDB4MDAwMDEwNDBMCisjZGVmaW5lIEJBMF9BQzk3X0xJTkUyX0NPREVDX1JBVEUgICAgICAgICAgICAgICAweDAwMDAxMDQyTAorI2RlZmluZSBCQTBfQUM5N19IQU5EU0VUX0NPREVDX1JBVEUgICAgICAgICAgICAgMHgwMDAwMTA0NEwKKyNkZWZpbmUgQkEwX0FDOTdfTElORTFfQ09ERUNfTEVWRUwgICAgICAgICAgICAgIDB4MDAwMDEwNDZMCisjZGVmaW5lIEJBMF9BQzk3X0xJTkUyX0NPREVDX0xFVkVMICAgICAgICAgICAgICAweDAwMDAxMDQ4TAorI2RlZmluZSBCQTBfQUM5N19IQU5EU0VUX0NPREVDX0xFVkVMICAgICAgICAgICAgMHgwMDAwMTA0QUwKKyNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fQ09ORklHICAgICAgICAgICAgICAgIDB4MDAwMDEwNENMCisjZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1RZUEUgICAgICAgICAgICAgICAgICAweDAwMDAxMDRFTAorI2RlZmluZSBCQTBfQUM5N19HUElPX1BJTl9TVElDS1kgICAgICAgICAgICAgICAgMHgwMDAwMTA1MEwKKyNkZWZpbmUgQkEwX0FDOTdfR1BJT19QSU5fV0FLRVVQICAgICAgICAgICAgICAgIDB4MDAwMDEwNTJMCisjZGVmaW5lIEJBMF9BQzk3X0dQSU9fUElOX1NUQVRVUyAgICAgICAgICAgICAgICAweDAwMDAxMDU0TAorI2RlZmluZSBCQTBfQUM5N19NSVNDX01PREVNX0FGRV9TVEFUICAgICAgICAgICAgMHgwMDAwMTA1NkwKKyNkZWZpbmUgQkEwX0FDOTdfUkVTRVJWRURfNTggICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNThMCisjZGVmaW5lIEJBMF9BQzk3X0NSWVNUQUxfUkVWX05fRkFCX0lEICAgICAgICAgICAweDAwMDAxMDVBTAorI2RlZmluZSBCQTBfQUM5N19URVNUX0FORF9NSVNDX0NUUkwgICAgICAgICAgICAgMHgwMDAwMTA1Q0wKKyNkZWZpbmUgQkEwX0FDOTdfQUNfTU9ERSAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNUVMCisjZGVmaW5lIEJBMF9BQzk3X01JU0NfQ1JZU1RBTF9DT05UUk9MICAgICAgICAgICAweDAwMDAxMDYwTAorI2RlZmluZSBCQTBfQUM5N19MSU5FMV9IWVBSSURfQ1RSTCAgICAgICAgICAgICAgMHgwMDAwMTA2MkwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzY0ICAgICAgICAgICAgIDB4MDAwMDEwNjRMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82NiAgICAgICAgICAgICAweDAwMDAxMDY2TAorI2RlZmluZSBCQTBfQUM5N19TUERJRl9DT05UUk9MICAgICAgICAgICAgICAgICAgMHgwMDAwMTA2OEwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzZBICAgICAgICAgICAgIDB4MDAwMDEwNkFMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF82QyAgICAgICAgICAgICAweDAwMDAxMDZDTAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNkUgICAgICAgICAgICAgMHgwMDAwMTA2RUwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX1JFU0VSVkVEXzcwICAgICAgICAgICAgIDB4MDAwMDEwNzBMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9SRVNFUlZFRF83MiAgICAgICAgICAgICAweDAwMDAxMDcyTAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfNzQgICAgICAgICAgICAgMHgwMDAwMTA3NEwKKyNkZWZpbmUgQkEwX0FDOTdfQ0FMX0FERFJFU1MgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwNzZMCisjZGVmaW5lIEJBMF9BQzk3X0NBTF9EQVRBICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDc4TAorI2RlZmluZSBCQTBfQUM5N19WRU5ET1JfUkVTRVJWRURfN0EgICAgICAgICAgICAgMHgwMDAwMTA3QUwKKyNkZWZpbmUgQkEwX0FDOTdfVkVORE9SX0lEMSAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwN0NMCisjZGVmaW5lIEJBMF9BQzk3X1ZFTkRPUl9JRDIgICAgICAgICAgICAgICAgICAgICAweDAwMDAxMDdFTAorI2VuZGlmCQkJCS8qIF9fQ1M0NjFYX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2MXhfaW1hZ2UuaCBiL3NvdW5kL29zcy9jczQ2MXhfaW1hZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWM1YTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDYxeF9pbWFnZS5oCkBAIC0wLDAgKzEsMzIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIkNXQ0lNQUdFLkgiLS0gRm9yIENTNDZYWC4gVmVyIDEuMDQKKyAqICAgICAgQ29weXJpZ2h0IDE5OTgtMjAwMSAoYykgQ2lycnVzIExvZ2ljIENvcnAuCisgKiAgICAgIFZlcnNpb24gMS4wNAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworI2lmbmRlZiBfX0NTX0lNQUdFX0gKKyNkZWZpbmUgX19DU19JTUFHRV9ICisKKyNkZWZpbmUgQ0xFQVJfX0NPVU5UICAgICAzCisjZGVmaW5lIEZJTExfX0NPVU5UICAgICAgNAorI2RlZmluZSBCQTFfX0RXT1JEX1NJWkUgIDEzKjEwMjQrNTEyCisKK3N0YXRpYyBzdHJ1Y3QKK3sKKyAgICAgICAgdW5zaWduZWQgQkExX19EZXN0Qnl0ZU9mZnNldDsKKyAgICAgICAgdW5zaWduZWQgQkExX19Tb3VyY2VTaXplOworfSBDbHJTdGF0W0NMRUFSX19DT1VOVF0gPXsgezB4MDAwMDAwMDAsIDB4MDAwMDMwMDAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDAwMDEwMDAwLCAweDAwMDAzODAwIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHgwMDAyMDAwMCwgMHgwMDAwNzAwMCB9IH07CisKK3N0YXRpYyB1MzIgRmlsbEFycmF5MVtdPXsKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAxNjMsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDIwMDA0MCwweDAwMDA4MDEwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4ODAwMDAwMDEsMHgwMDAwMDAwMSwweDAwMDYwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDA5MDAwODAsMHgwMDAwMDE3MywweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDEwLDB4MDA4MDAwMDAsMHgwMDkwMDAwMCwKKzB4ZjJjMDAwMGYsMHgwMDAwMDIwMCwweDAwMDAwMDAwLDB4MDAwMTA2MDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAxNjMsMHgzMzAzMDBjMiwKKzB4MDYwMDAwMDAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLDB4ODAwMDgwMDAsCisweDNmYzAwMDBmLDB4MDAwMDAzMDEsMHgwMDAxMDQwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMGIwMDAwMCwweDAwZDA4MDZkLDB4MzMwNDgwYzMsCisweDA0ODAwMDAwLDB4MDAwMDAwMDEsMHgwMDgwMDAwMSwweDAwMDBmZmZmLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDA2NmEwNjAwLDB4MDYzNTAwNzAsMHgwMDAwOTI5ZCwweDkyOWQ5MjlkLAorMHgwMDAwMDAwMCwweDAwMDA3MzVhLDB4MDAwMDA2MDAsMHgwMDAwMDAwMCwKKzB4OTI5ZDczNWEsMHgwMDAwMDAwMCwweDAwMDEwMDAwLDB4NzM1YTczNWEsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwODA0ZiwweDAwMDAwMGMzLAorMHgwNTAwMDAwMCwweDAwYTAwMDEwLDB4MDAwMDAwMDAsMHg4MDAwODAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwNzAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDA4MCwweDAwYTAwMDAwLDB4MDAwMDgwOWEsMHgwMDAwMDBjMiwKKzB4MDc0MDAwMDAsMHgwMDAwMDAwMCwweDgwMDA4MDAwLDB4ZmZmZmZmZmYsCisweDAwYzgwMDI4LDB4MDAwMDU1NTUsMHgwMDAwMDAwMCwweDAwMDEwN2EwLAorMHgwMGM4MDAyOCwweDAwMDAwMGMyLDB4MDY4MDAwMDAsMHgwMDAwMDAwMCwKKzB4MDZlMDAwODAsMHgwMDMwMDAwMCwweDAwMDA4MGJiLDB4MDAwMDAwYzksCisweDA3YTAwMDAwLDB4MDQwMDAwMDAsMHg4MDAwODAwMCwweGZmZmZmZmZmLAorMHgwMGM4MDAyOCwweDAwMDA1NTU1LDB4MDAwMDAwMDAsMHgwMDAwMDc4MCwKKzB4MDBjODAwMjgsMHgwMDAwMDBjNSwweGZmODAwMDAwLDB4MDAwMDAwMDAsCisweDAwNjQwMDgwLDB4MDBjMDAwMDAsMHgwMDAwODE5NywweDAwMDAwMGM5LAorMHgwNzgwMDAwMCwweDA0MDAwMDAwLDB4ODAwMDgwMDAsMHhmZmZmZmZmZiwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDgwNWUsMHgwMDAwMDBjMSwKKzB4MDAwMDAwMDAsMHgwMDgwMDAwMCwweDgwMDA4MDAwLDB4ODAwMDgwMDAsCisweDAwMDIwMDAwLDB4MDAwMGZmZmYsMHgwMDAwMDAwMCwweDAwMDAwMDAwfTsKKworc3RhdGljIHUzMiBGaWxsQXJyYXkyW109eworMHg5MjlkMDYwMCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkMDAwMCwKKzB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCisweDkyOWQ5MjlkLDB4MDAxMDA2MzUsMHgwNjBiMDEzZiwweDAwMDAwMDA0LAorMHgwMDAwMDAwMSwweDAwN2EwMDAyLDB4MDAwMDAwMDAsMHgwNjZlMDYxMCwKKzB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCisweDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHg3MzVhMDA1MSwKKzB4MDAwMDAwMDAsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsCisweDkyOWQ5MjlkLDB4OTI5ZDkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4MDAwMDAwMDAsMHgwNjQwMDEzNiwKKzB4MDAwMDI3MGYsMHgwMDAxMDAwMCwweDAwN2EwMDAwLDB4MDAwMDAwMDAsCisweDA2OGUwNjQ1LDB4MDEwNTkyOWQsMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLAorMHg5MjlkOTI5ZCwweDkyOWQ5MjlkLDB4YTQzMWFjNzUsMHgwMDAxNzM1YSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LAorMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsMHhhNDMxYWM3NSwKKzB4YTQzMWFjNzUsMHhhNDMxYWM3NSwweGE0MzFhYzc1LDB4YTQzMWFjNzUsCisweDczNWEwMTAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwfTsKKworc3RhdGljIHUzMiBGaWxsQXJyYXkzW109eworMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAxMDAwNH07CisKK3N0YXRpYyB1MzIgRmlsbEFycmF5NFtdPXsKKzB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCisweDAwMDAxNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAorMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKzB4MDAwMDk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCisweDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAorMHgwMDAxMTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKzB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCisweDAwMDE5NzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAorMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKzB4MDAwMjE3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCisweDAwMDQwNzMwLDB4MDAwMDEwMDIsMHgwMDBmNjE5ZSwweDAwMDAxMDAzLAorMHgwMDAyOTcwNSwweDAwMDAxNDAwLDB4MDAwYTQxMWUsMHgwMDAwMTAwMywKKzB4MDAwNDA3MzAsMHgwMDAwMTAwMiwweDAwMGY2MTllLDB4MDAwMDEwMDMsCisweDAwMDMxNzA1LDB4MDAwMDE0MDAsMHgwMDBhNDExZSwweDAwMDAxMDAzLAorMHgwMDA0MDczMCwweDAwMDAxMDAyLDB4MDAwZjYxOWUsMHgwMDAwMTAwMywKKzB4MDAwMzk3MDUsMHgwMDAwMTQwMCwweDAwMGE0MTFlLDB4MDAwMDEwMDMsCisweDAwMGZlMTllLDB4MDAwMDEwMDMsMHgwMDA5YzczMCwweDAwMDAxMDAzLAorMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKKzB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCisweDAwMDA5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAorMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKzB4MDAwMTE3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCisweDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAorMHgwMDAxOTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKzB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCisweDAwMDIxNzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAorMHgwMDA5ODczMCwweDAwMDAxMDAyLDB4MDAwZWUxOWUsMHgwMDAwMTAwMywKKzB4MDAwMjk3MDUsMHgwMDAwMTQwMCwweDAwMGEyMTFlLDB4MDAwMDEwMDMsCisweDAwMDk4NzMwLDB4MDAwMDEwMDIsMHgwMDBlZTE5ZSwweDAwMDAxMDAzLAorMHgwMDAzMTcwNSwweDAwMDAxNDAwLDB4MDAwYTIxMWUsMHgwMDAwMTAwMywKKzB4MDAwOTg3MzAsMHgwMDAwMTAwMiwweDAwMGVlMTllLDB4MDAwMDEwMDMsCisweDAwMDM5NzA1LDB4MDAwMDE0MDAsMHgwMDBhMjExZSwweDAwMDAxMDAzLAorMHgwMDAwYTczMCwweDAwMDAxMDA4LDB4MDAwZTI3MzAsMHgwMDAwMTAwMiwKKzB4MDAwMGE3MzEsMHgwMDAwMTAwMiwweDAwMDBhNzMxLDB4MDAwMDEwMDIsCisweDAwMDBhNzMxLDB4MDAwMDEwMDIsMHgwMDAwYTczMSwweDAwMDAxMDAyLAorMHgwMDAwYTczMSwweDAwMDAxMDAyLDB4MDAwMGE3MzEsMHgwMDAwMTAwMiwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGY2MTljLDB4MDAwMDEwMDMsCisweDAwMDdmODAxLDB4MDAwYzAwMDAsMHgwMDAwMDAzNywweDAwMDAxMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMzczYywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwZWUxOWMsMHgwMDAwMTAwMywweDAwMDdmODAxLDB4MDAwYzAwMDAsCisweDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAyNzNjLDB4MDAwMDEwMDAsCisweDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDBlNjc5ZSwweDAwMDAxMDAzLAorMHgwMDAwNzcwNSwweDAwMDAxNDAwLDB4MDAwYWM3MWUsMHgwMDAwMTAwMywKKzB4MDAwODdmYzEsMHgwMDBjM2JlMCwweDAwMDdmODAxLDB4MDAwYzAwMDAsCisweDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDBhNzMwLDB4MDAwMDEwMDMsCisweDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDA3ZjgwMSwweDAwMGMwMDAwLAorMHgwMDAwMDAzNywweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMGMwMDAwLAorMHgwMDAwMDAzMiwweDAwMDAxMDAwLDB4MDAwMDI3M2QsMHgwMDAwMTAwMCwKKzB4MDAwNGE3MzAsMHgwMDAwMTAwMywweDAwMDAwZjQxLDB4MDAwOTcxNDAsCisweDAwMDBhODQxLDB4MDAwOWIyNDAsMHgwMDAwYTBjMSwweDAwMDlmMDQwLAorMHgwMDAxYzY0MSwweDAwMDkzNTQwLDB4MDAwMWNlYzEsMHgwMDA5YjVjMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDFiZjA1LDB4MDAwM2ZjNDAsCisweDAwMDAyNzI1LDB4MDAwYWE0MDAsMHgwMDAxMzcwNSwweDAwMDkzYTAwLAorMHgwMDAwMDAyZSwweDAwMDlkNmMwLDB4MDAwMzg2MzAsMHgwMDAwMTAwNCwKKzB4MDAwNGVmMGEsMHgwMDBlYjc4NSwweDAwMDNmYzhhLDB4MDAwMDAwMDAsCisweDAwMDAwMDAwLDB4MDAwYzcwZTAsMHgwMDA3ZDE4MiwweDAwMDJjNjQwLAorMHgwMDAwMDYzMCwweDAwMDAxMDA0LDB4MDAwNzk5YjgsMHgwMDAyYzZjMCwKKzB4MDAwMzE3MDUsMHgwMDA5MjI0MCwweDAwMDM5ZjA1LDB4MDAwOTMyYzAsCisweDAwMDM1MjBhLDB4MDAwMDAwMDAsMHgwMDA0MDczMSwweDAwMDAxMDBiLAorMHgwMDAxMDcwNSwweDAwMGIyMGMwLDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKKzB4MDAwMzIxMDgsMHgwMDBjNjBjNCwweDAwMDY1MjA4LDB4MDAwYzI5MTcsCisweDAwMDQwNmIwLDB4MDAwMDEwMDcsMHgwMDAxMmYwNSwweDAwMDM2ODgwLAorMHgwMDAyODE4ZSwweDAwMGMwMDAwLDB4MDAwNDQxMGEsMHgwMDAwMDAwMCwKKzB4MDAwNDA2MzAsMHgwMDAwMTAwNywweDAwMDI5NzA1LDB4MDAwYzAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwM2ZjMSwweDAwMDNmYzQwLAorMHgwMDAwMzdjMSwweDAwMDkxYjQwLDB4MDAwMDNmYzEsMHgwMDA5MTFjMCwKKzB4MDAwMDM3YzEsMHgwMDA5NTdjMCwweDAwMDAzZmMxLDB4MDAwOTUxYzAsCisweDAwMDAzN2MxLDB4MDAwMDAwMDAsMHgwMDAwM2ZjMSwweDAwMDk5MWMwLAorMHgwMDAwMzdjMSwweDAwMDAwMDAwLDB4MDAwMDNmYzEsMHgwMDA5ZDFjMCwKKzB4MDAwMDM3YzEsMHgwMDAwMDAwMCwweDAwMDFjY2MxLDB4MDAwOTE1YzAsCisweDAwMDFjNDQxLDB4MDAwOWQ4MDAsMHgwMDA5Y2RjMSwweDAwMDkxMjQwLAorMHgwMDAxYzU0MSwweDAwMDkxZDAwLDB4MDAwOWNmYzEsMHgwMDA5NTI0MCwKKzB4MDAwMWM3NDEsMHgwMDA5NWM4MCwweDAwMGU4Y2E5LDB4MDAwOTkyNDAsCisweDAwMGU4NWFkLDB4MDAwOTU2NDAsMHgwMDA2OWNhOSwweDAwMDk5ZDgwLAorMHgwMDBlOTUyZCwweDAwMDk5NjQwLDB4MDAwZWFjYTksMHgwMDA5ZDZjMCwKKzB4MDAwZWE1YWQsMHgwMDA5MWE0MCwweDAwMDZiY2E5LDB4MDAwOWRlODAsCisweDAwMGViNTJkLDB4MDAwOTVhNDAsMHgwMDBlY2NhOSwweDAwMDk5YWMwLAorMHgwMDBlYzVhZCwweDAwMDlkYTQwLDB4MDAwZWRjYTksMHgwMDA5ZDMwMCwKKzB4MDAwYTZlMGEsMHgwMDAwMTAwMCwweDAwMGVkNTJkLDB4MDAwOTFlNDAsCisweDAwMGVlY2E5LDB4MDAwOTVlYzAsMHgwMDBlZTVhZCwweDAwMDk5ZTQwLAorMHgwMDA2ZmNhOSwweDAwMDAyNTAwLDB4MDAwZmIyMDgsMHgwMDBjNTlhMCwKKzB4MDAwZWY1MmQsMHgwMDA5ZGU0MCwweDAwMDY4Y2E5LDB4MDAwOTEyYzEsCisweDAwMDY4M2FkLDB4MDAwOTUyNDEsMHgwMDAyMGYwNSwweDAwMDk5MWMxLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwODZmODgsMHgwMDAwMTAwMCwKKzB4MDAwOWNmODEsMHgwMDBiNTM0MCwweDAwMDljNzAxLDB4MDAwYjkyYzAsCisweDAwMDlkZTgxLDB4MDAwYmQzMDAsMHgwMDA5ZDYwMSwweDAwMGIxNzAwLAorMHgwMDAxZmQ4MSwweDAwMGI5ZDgwLDB4MDAwOWY1MDEsMHgwMDBiNTdjMCwKKzB4MDAwYTBmODEsMHgwMDBiZDc0MCwweDAwMDIwNzAxLDB4MDAwYjVjODAsCisweDAwMGExNjgxLDB4MDAwYjk3YzAsMHgwMDAyMTYwMSwweDAwMDAyNTAwLAorMHgwMDBhMDcwMSwweDAwMGI5YjQwLDB4MDAwYTBmODEsMHgwMDBiMWJjMCwKKzB4MDAwMjE2ODEsMHgwMDAwMmQwMCwweDAwMDIwZjgxLDB4MDAwYmQ4MDAsCisweDAwMGEwNzAxLDB4MDAwYjViYzAsMHgwMDAyMTYwMSwweDAwMDAzNTAwLAorMHgwMDBhMGY4MSwweDAwMGI1ZjQwLDB4MDAwYTA3MDEsMHgwMDBiZGJjMCwKKzB4MDAwMjE2ODEsMHgwMDAwM2QwMCwweDAwMDIwZjgxLDB4MDAwYjFkMDAsCisweDAwMGEwNzAxLDB4MDAwYjFmYzAsMHgwMDAyMTYwMSwweDAwMDIwNTAwLAorMHgwMDAyMGY4MSwweDAwMGIxMzQxLDB4MDAwYTA3MDEsMHgwMDBiOWZjMCwKKzB4MDAwMjE2ODEsMHgwMDAyMGQwMCwweDAwMDIwZjgxLDB4MDAwYmRlODAsCisweDAwMGEwNzAxLDB4MDAwYmRmYzAsMHgwMDAyMTYwMSwweDAwMDIxNTAwLAorMHgwMDAyMGY4MSwweDAwMGI5MzQxLDB4MDAwMjA3MDEsMHgwMDBiNTNjMSwKKzB4MDAwMjE2ODEsMHgwMDAyMWQwMCwweDAwMGEwZjgxLDB4MDAwZDAzODAsCisweDAwMDBiNjAxLDB4MDAwYjE1YzAsMHgwMDAwN2IwMSwweDAwMDAwMDAwLAorMHgwMDAwN2I4MSwweDAwMGJkMWMwLDB4MDAwMDdiMDEsMHgwMDAwMDAwMCwKKzB4MDAwMDdiODEsMHgwMDBiOTFjMCwweDAwMDA3YjAxLDB4MDAwYjU3YzAsCisweDAwMDA3YjgxLDB4MDAwYjUxYzAsMHgwMDAwN2IwMSwweDAwMGIxYjQwLAorMHgwMDAwN2I4MSwweDAwMGIxMWMwLDB4MDAwODdiMDEsMHgwMDBjM2RjMCwKKzB4MDAwN2U0ODgsMHgwMDBkN2U0NSwweDAwMDAwMDAwLDB4MDAwZDdhNDQsCisweDAwMDdlNDhhLDB4MDAwMDAwMDAsMHgwMDAxMWYwNSwweDAwMDg0MDgwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDE3MDUsMHgwMDBiMzU0MCwKKzB4MDAwMDhhMDEsMHgwMDBiZjA0MCwweDAwMDA3MDgxLDB4MDAwYmI1YzAsCisweDAwMDU1NDg4LDB4MDAwMDAwMDAsMHgwMDAwZDQ4MiwweDAwMDNmYzQwLAorMHgwMDAzZmM4OCwweDAwMDAwMDAwLDB4MDAwMWU0MDEsMHgwMDBiM2EwMCwKKzB4MDAwMWVjODEsMHgwMDBiZDZjMCwweDAwMDRlZjA4LDB4MDAwZWI3ODQsCisweDAwMGM4NmIwLDB4MDAwMDEwMDcsMHgwMDAwODI4MSwweDAwMGJiMjQwLAorMHgwMDAwYjgwMSwweDAwMGI3MTQwLDB4MDAwMDc4ODgsMHgwMDAwMDAwMCwKKzB4MDAwMDA3M2MsMHgwMDAwMTAwMCwweDAwMDdmMTg4LDB4MDAwYzAwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDA1NTI4OCwweDAwMGM1NTVjLAorMHgwMDA1NTI4YSwweDAwMGMwMDAwLDB4MDAwOWZhODgsMHgwMDBjNWQwMCwKKzB4MDAwMGZhODgsMHgwMDAwMDAwMCwweDAwMDAwMDMyLDB4MDAwMDEwMDAsCisweDAwMDAwNzNkLDB4MDAwMDEwMDAsMHgwMDA3ZjE4OCwweDAwMGMwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwOGMwMWMsMHgwMDAwMTAwMywKKzB4MDAwMDI3MDUsMHgwMDAwMTAwOCwweDAwMDhiMjAxLDB4MDAwYzEzOTIsCisweDAwMDBiYTAxLDB4MDAwMDAwMDAsMHgwMDAwODczMSwweDAwMDAxNDAwLAorMHgwMDA0YzEwOCwweDAwMGZlMGM0LDB4MDAwNTc0ODgsMHgwMDAwMDAwMCwKKzB4MDAwYTYzODgsMHgwMDAwMTAwMSwweDAwMDhiMzM0LDB4MDAwYmMxNDEsCisweDAwMDMwMjBlLDB4MDAwMDAwMDAsMHgwMDA4ODZiMCwweDAwMDAxMDA4LAorMHgwMDAwMzYyNSwweDAwMGM1ZGZhLDB4MDAwYTYzOGEsMHgwMDAwMTAwMSwKKzB4MDAwODAyMGUsMHgwMDAwMTAwMiwweDAwMDhhNmIwLDB4MDAwMDEwMDgsCisweDAwMDdmMzAxLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMjcyNSwweDAwMGE4YzQwLDB4MDAwMDAwYWUsMHgwMDAwMDAwMCwKKzB4MDAwZDg2MzAsMHgwMDAwMTAwOCwweDAwMDAwMDAwLDB4MDAwYzc0ZTAsCisweDAwMDdkMTgyLDB4MDAwMmQ2NDAsMHgwMDBhODYzMCwweDAwMDAxMDA4LAorMHgwMDA3OTliOCwweDAwMDJkNmMwLDB4MDAwMDc0OGEsMHgwMDBjM2VjNSwKKzB4MDAwNzQyMGEsMHgwMDBjMDAwMCwweDAwMDYyMjA4LDB4MDAwYzQxMTcsCisweDAwMDcwNjMwLDB4MDAwMDEwMDksMHgwMDAwMDAwMCwweDAwMGMwMDAwLAorMHgwMDAxMDIyZSwweDAwMDAwMDAwLDB4MDAwM2E2MzAsMHgwMDAwMTAwOSwKKzB4MDAwMDAwMDAsMHgwMDBjMDAwMCwweDAwMDAwMDM2LDB4MDAwMDEwMDAsCisweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMmE3MzAsMHgwMDAwMTAwOCwweDAwMDdmODAxLDB4MDAwYzAwMDAsCisweDAwMDAwMDM3LDB4MDAwMDEwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDAwMDAwMCwweDAwMDAwMDAwLDB4MDAwMDAwMDAsMHgwMDAwMDAwMCwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDJhNzMwLDB4MDAwMDEwMDgsCisweDAwMDAwMDMzLDB4MDAwMDEwMDAsMHgwMDAyYTcwNSwweDAwMDAxMDA4LAorMHgwMDAwN2EwMSwweDAwMGMwMDAwLDB4MDAwZTYyODgsMHgwMDBkNTUwYSwKKzB4MDAwNjQyOGEsMHgwMDAwMDAwMCwweDAwMDYwNzMwLDB4MDAwMDEwMGEsCisweDAwMDAwMDAwLDB4MDAwYzAwMDAsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDA3YWFiMCwweDAwMDM0ODgwLDB4MDAwNzhmYjAsMHgwMDAwMTAwYiwKKzB4MDAwNTc0ODgsMHgwMDAwMDAwMCwweDAwMDMzYjk0LDB4MDAwODExNDAsCisweDAwMDE4M2FlLDB4MDAwMDAwMDAsMHgwMDA3ODZiMCwweDAwMDAxMDBiLAorMHgwMDAyMmYwNSwweDAwMGMzNTQ1LDB4MDAwMGViOGEsMHgwMDAwMDAwMCwKKzB4MDAwNDI3MzEsMHgwMDAwMTAwMywweDAwMDdhYWIwLDB4MDAwMzQ4ODAsCisweDAwMDQ4ZmIwLDB4MDAwMDEwMGEsMHgwMDA1NzQ4OCwweDAwMDAwMDAwLAorMHgwMDAzM2I5NCwweDAwMDgxMTQwLDB4MDAwMTgzYWUsMHgwMDAwMDAwMCwKKzB4MDAwODA2YjAsMHgwMDAwMTAwYiwweDAwMDIyZjA1LDB4MDAwMDAwMDAsCisweDAwMDA3NDAxLDB4MDAwOTExNDAsMHgwMDA0OGYwNSwweDAwMDk1MWMwLAorMHgwMDA0MjczMSwweDAwMDAxMDAzLDB4MDAwMDQ3M2QsMHgwMDAwMTAwMCwKKzB4MDAwZjE5YjAsMHgwMDBiYmM0NywweDAwMDgwMDAwLDB4MDAwYmZmYzcsCisweDAwMGZlMTllLDB4MDAwMDEwMDMsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDA4ZTE5YywweDAwMDAxMDAzLDB4MDAwMDgzYzEsMHgwMDA5MzA0MCwKKzB4MDAwMDBmNDEsMHgwMDA5NzE0MCwweDAwMDBhODQxLDB4MDAwOWIyNDAsCisweDAwMDBhMGMxLDB4MDAwOWYwNDAsMHgwMDAxYzY0MSwweDAwMDkzNTQwLAorMHgwMDAxY2VjMSwweDAwMDliNWMwLDB4MDAwMDAwMDAsMHgwMDBmZGM0NCwKKzB4MDAwNTUyMDgsMHgwMDAwMDAwMCwweDAwMDEwNzA1LDB4MDAwYTI4ODAsCisweDAwMDBhMjNhLDB4MDAwOTNhMDAsMHgwMDAzZmM4YSwweDAwMGRmNmM1LAorMHgwMDA0ZWYwYSwweDAwMGMwMDAwLDB4MDAwMTJmMDUsMHgwMDAzNjg4MCwKKzB4MDAwNjUzMDgsMHgwMDBjMjk5NywweDAwMGQ4NmIwLDB4MDAwMDEwMGEsCisweDAwMDQ0MTBhLDB4MDAwZDQwYzcsMHgwMDAwMDAwMCwweDAwMDAwMDAwLAorMHgwMDA4MDczMCwweDAwMDAxMDA0LDB4MDAwNTZmMGEsMHgwMDBlYTEwNSwKKzB4MDAwMDAwMDAsMHgwMDAwMDAwMCwweDAwMDA0NzNkLDB4MDAwMDEwMDAsCisweDAwMGYxOWIwLDB4MDAwYmJjNDcsMHgwMDA4MDAwMCwweDAwMGJmZmM3LAorMHgwMDAwMjczZCwweDAwMDAxMDAwLDB4MDAwMDAwMDAsMHgwMDBlYmE0NCwKKzB4MDAwNDhmMDUsMHgwMDAwZjQ0MCwweDAwMDA3NDAxLDB4MDAwMGY3YzAsCisweDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAorMHgwMDAwNmE4OCwweDAwMGM3NWM0LDB4MDAwMDAwMDAsMHgwMDBlNTA4NCwKKzB4MDAwMDAwMDAsMHgwMDBlYmE0NCwweDAwMDg3NDAxLDB4MDAwZTQ3ODIsCisweDAwMDAwNzM0LDB4MDAwMDEwMDAsMHgwMDAxMDcwNSwweDAwMGE2ODgwLAorMHgwMDAwNmE4OCwweDAwMGM3NWM0LDB4MDAwN2MxMDgsMHgwMDBjMDAwMCwKKzB4MDAwN2U3MjEsMHgwMDBiZWQ0MCwweDAwMDA1ZjI1LDB4MDAwYmFkYzAsCisweDAwMDNiYTk3LDB4MDAwYmViODAsMHgwMDA2NTU5MCwweDAwMGIyZTAwLAorMHgwMDAzMzIxNywweDAwMDAzZWMwLDB4MDAwNjU1OTAsMHgwMDBiOGU0MCwKKzB4MDAwM2VkODAsMHgwMDA0OTFjMCwweDAwMDczZmIwLDB4MDAwNzRjODAsCisweDAwMDI4M2EwLDB4MDAwMDEwMGMsMHgwMDBlZTM4OCwweDAwMDQyOTcwLAorMHgwMDAwODMwMSwweDAwMDIxZWYyLDB4MDAwYjhmMTQsMHgwMDAwMDAwZiwKKzB4MDAwYzRkOGQsMHgwMDAwMDAxYiwweDAwMGQ2ZGMyLDB4MDAwZTA2YzYsCisweDAwMDAzMmFjLDB4MDAwYzM5MTYsMHgwMDA0ZWRjMiwweDAwMDc0YzgwLAorMHgwMDA3ODg5OCwweDAwMDAxMDAwLDB4MDAwMzg4OTQsMHgwMDAwMDAzMiwKKzB4MDAwYzRkOGQsMHgwMDA5MmUxYiwweDAwMGQ2ZGMyLDB4MDAwZTA2YzYsCisweDAwMDRlZGMyLDB4MDAwYzE5NTYsMHgwMDAwNzIyYywweDAwMDM0YTAwLAorMHgwMDA0MTcwNSwweDAwMDllZDQwLDB4MDAwNTg3MzAsMHgwMDAwMTQwMCwKKzB4MDAwZDc0ODgsMHgwMDBjM2EwMCwweDAwMDQ4ZjA1LDB4MDAwMDAwMDB9OworCitzdGF0aWMgc3RydWN0Cit7ICAgdTMyIE9mZnNldDsKKyAgICB1MzIgU2l6ZTsKKyAgICB1MzIgKnBGaWxsOworfSBGaWxsU3RhdFtGSUxMX19DT1VOVF0gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMDAwMDAsIHNpemVvZihGaWxsQXJyYXkxKSwgRmlsbEFycmF5MX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMDE4MDAsIHNpemVvZihGaWxsQXJyYXkyKSwgRmlsbEFycmF5Mn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMTM3ZjAsIHNpemVvZihGaWxsQXJyYXkzKSwgRmlsbEFycmF5M30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4MDAwMjAwMDAsIHNpemVvZihGaWxsQXJyYXk0KSwgRmlsbEFycmF5NH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9jczQ2eHguYyBiL3NvdW5kL29zcy9jczQ2eHguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2U2YjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDZ4eC5jCkBAIC0wLDAgKzEsNTc5NCBAQAorLyoKKyAqCUNyeXN0YWwgU291bmRGdXNpb24gQ1M0Nnh4IGRyaXZlcgorICoKKyAqCUNvcHlyaWdodCAxOTk4LTIwMDEgQ2lycnVzIExvZ2ljIENvcnBvcmF0aW9uIDxwY2F1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbT4KKyAqCQkJCQkJPHR3b2xsZXJAY3J5c3RhbC5jaXJydXMuY29tPgorICoJQ29weXJpZ2h0IDE5OTktMjAwMCBKYXJvc2xhdiBLeXNlbGEgPHBlcmV4QHN1c2UuY3o+CisgKglDb3B5cmlnaHQgMjAwMCBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqCVRoZSBjb3JlIG9mIHRoaXMgY29kZSBpcyB0YWtlbiBmcm9tIHRoZSBBTFNBIHByb2plY3QgZHJpdmVyIGJ5IAorICoJSmFyb3NsYXYuIFBsZWFzZSBzZW5kIEphcm9zbGF2IHRoZSBjcmVkaXQgZm9yIHRoZSBkcml2ZXIgYW5kIAorICoJcmVwb3J0IGJ1Z3MgaW4gdGhpcyBwb3J0IHRvIDxhbGFuQHJlZGhhdC5jb20+CisgKgorICoJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqCWl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKgl0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICoJKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKglHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKglDdXJyZW50IG1haW50YWluZXJzOgorICoJCUNpcnJ1cyBMb2dpYyBDb3Jwb3JhdGlvbiwgVGhvbWFzIFdvbGxlciAodHcpCisgKgkJCTx0d29sbGVyQGNyeXN0YWwuY2lycnVzLmNvbT4KKyAqCQlOaWxzIEZhZXJiZXIgKG5mKQorICoJCQk8bmlsc0BrZXJuZWxjb25jZXB0cy5kZT4KKyAqCQlUaGFua3MgdG8gRGF2aWQgUG9sbGFyZCBmb3IgdGVzdGluZy4KKyAqCisgKglDaGFuZ2VzOgorICoJMjAwMDA5MDktbmYJQ2hhbmdlZCBjc19yZWFkLCBjc193cml0ZSBhbmQgZHJhaW5fZGFjCisgKgkyMDAwMTAyNS10dwlTZXBhcmF0ZSBQbGF5YmFjay9DYXB0dXJlIHN0cnVjdHMgYW5kIGJ1ZmZlcnMuCisgKgkJCUFkZGVkIFNjYXR0ZXIvR2F0aGVyIHN1cHBvcnQgZm9yIFBsYXliYWNrLgorICoJCQlBZGRlZCBDYXB0dXJlLgorICoJMjAwMDEwMjctbmYJUG9ydCB0byBrZXJuZWwgMi40LjAtdGVzdDksIHNvbWUgY2xlYW4tdXBzCisgKgkJCVN0YXJ0IG9mIHBvd2VybWFuYWdlbWVudCBzdXBwb3J0IChDUzQ2WFhfUE0pLgorICoJMjAwMDExMjgtdHcJQWRkIG1vZHVsZSBwYXJtIGZvciBkZWZhdWx0IGJ1ZmZlciBvcmRlci4KKyAqCQkJYWRkZWQgRE1BX0dGUCBmbGFnIHRvIGttYWxsb2MgZG1hIGJ1ZmZlciBhbGxvY3MuCisgKgkJCWJhY2tmaWxsIHNpbGVuY2UgdG8gZWxpbWluYXRlIHN0dXR0ZXJpbmcgb24KKyAqCQkJdW5kZXJydW5zLgorICoJMjAwMDEyMDEtdHcJYWRkIHJlc3luY2luZyBvZiBzd3B0ciBvbiB1bmRlcnJ1bnMuCisgKgkyMDAwMTIwNS10dy1uZglmaXhlZCBHRVRPU1BBQ0UgaW9jdGwoKSBhZnRlciBvcGVuKCkKKyAqCTIwMDEwMTEzLXR3CXBhdGNoIGZyb20gSGFucyBHcm9ibGVyIGdlbmVyYWwgY2xlYW51cC4KKyAqCTIwMDEwMTE3LXR3CTIuNC4wIHBjaSBjbGVhbnVwLCB3cmFwcGVyIGNvZGUgZm9yIDIuMi4xNi0yLjQuMAorICoJMjAwMTAxMTgtdHcJYmFzaWMgUE0gc3VwcG9ydCBmb3IgMi4yLjE2KyBhbmQgMi40LjAvMi40LjIuCisgKgkyMDAxMDIyOC1kaAlwYXRjaCBmcm9tIERhdmlkIEh1Z2dpbnMgLSBjc191cGRhdGVfcHRyIHJlY3Vyc2lvbi4KKyAqCTIwMDEwNDA5LXR3CWFkZCBoZXJjdWxlcyBnYW1lIHRoZWF0cmUgWFAgYW1wIGNvZGUuCisgKgkyMDAxMDQyMC10dwljbGVhbnVwIHBvd2VyZG93bi91cCBjb2RlLgorICoJMjAwMTA1MjEtdHcJZWxpbWluYXRlIHBvcHMsIGFuZCBmaXhlcyBmb3IgcG93ZXJkb3duLgorICoJMjAwMTA1MjUtdHcJYWRkZWQgZml4ZXMgZm9yIHRoaW5rcGFkcyB3aXRoIHBvd2VyZG93biBsb2dpYy4KKyAqCTIwMDEwNzIzLXNoICAgICBwYXRjaCBmcm9tIEhvcm1zIChTaW1vbiBIb3JtYW4pIC0KKyAqCSAgICAgICAgICAgICAgICBTT1VORF9QQ01fUkVBRF9CSVRTIHJldHVybnMgYml0cyBhcyBzZXQgaW4gZHJpdmVyCisgKgkgICAgICAgICAgICAgICAgcmF0aGVyIHRoYW4gYSBsb2dpY2FsIG9yIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMuCisgKgkgICAgICAgICAgICAgICAgVmFyaW91cyBpb2N0bHMgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBkZXZpY2UKKyAqCSAgICAgICAgICAgICAgICBpcyBvcGVuIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgYnV0IG5vdCBib3RoIGJldHRlci4KKyAqCisgKglTdGF0dXM6CisgKglQbGF5YmFjay9DYXB0dXJlIHN1cHBvcnRlZCBmcm9tIDhrLTQ4ay4KKyAqCTE2Qml0IFNpZ25lZCBMRSAmIDhCaXQgVW5zaWduZWQsIHdpdGggTW9ubyBvciBTdGVyZW8gc3VwcG9ydGVkLgorICoKKyAqCUFQTS9QTSAtIDIuMi54IEFQTSBpcyBlbmFibGVkIGFuZCBmdW5jdGlvbmluZyBmaW5lLiBBUE0gY2FuIGFsc28KKyAqCWJlIGVuYWJsZWQgZm9yIDIuNC54IGJ5IG1vZGlmeWluZyB0aGUgQ1M0NlhYX0FDUElfU1VQUE9SVCBtYWNybworICoJZGVmaW5pdGlvbi4KKyAqCisgKiAgICAgIEhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCAtIHRoZSBFR1BJTzIgcGluIGNvbnRyb2xzIHRoZSBleHRlcm5hbCBBbXAsCisgKglzbywgdXNlIHRoZSBkcmFpbi9wb2xhcml0eSB0byBlbmFibGUuICAKKyAqCWhlcmN1bGVzX2VncGlvX2Rpc2FibGUgc2V0IHRvIDEsIHdpbGwgZm9yY2UgYSAwIHRvIEVHUElPRFIuCisgKgorICoJVlRCIFNhbnRhIENydXogLSB0aGUgR1BJTzcvR1BJTzggb24gdGhlIFNlY29uZGFyeSBDb2RlYyBjb250cm9sCisgKgl0aGUgZXh0ZXJuYWwgYW1wbGlmaWVyIGZvciB0aGUgImJhY2siIHNwZWFrZXJzLCBzaW5jZSB3ZSBkbyBub3QKKyAqCXN1cHBvcnQgdGhlIHNlY29uZGFyeSBjb2RlYyB0aGVuIHRoaXMgZXh0ZXJuYWwgYW1wIGlzIGFsc28gbm90CisgKgl0dXJuZWQgb24uCisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJjczQ2eHhwbS0yNC5oIgorI2luY2x1ZGUgImNzNDZ4eF93cmFwcGVyLTI0LmgiCisjaW5jbHVkZSAiY3M0NjF4LmgiCisKKy8qIE1JREkgYnVmZmVyIHNpemVzICovCisjZGVmaW5lIENTX01JRElJTkJVRiAgNTAwCisjZGVmaW5lIENTX01JRElPVVRCVUYgNTAwCisKKyNkZWZpbmUgQURDX1JVTk5JTkcJMQorI2RlZmluZSBEQUNfUlVOTklORwkyCisKKyNkZWZpbmUgQ1NfRk1UXzE2QklUCTEJCS8qIFRoZXNlIGFyZSBmaXhlZCBpbiBmYWN0ICovCisjZGVmaW5lIENTX0ZNVF9TVEVSRU8JMgorI2RlZmluZSBDU19GTVRfTUFTSwkzCisKKyNkZWZpbmUgQ1NfVFlQRV9BREMJMQorI2RlZmluZSBDU19UWVBFX0RBQwkyCisKKyNkZWZpbmUgQ1NfVFJVRSAJMQorI2RlZmluZSBDU19GQUxTRSAJMAorCisjZGVmaW5lIENTX0lOQ19VU0VfQ09VTlQobSkgKGF0b21pY19pbmMobSkpCisjZGVmaW5lIENTX0RFQ19VU0VfQ09VTlQobSkgKGF0b21pY19kZWMobSkpCisjZGVmaW5lIENTX0RFQ19BTkRfVEVTVChtKSAoYXRvbWljX2RlY19hbmRfdGVzdChtKSkKKyNkZWZpbmUgQ1NfSU5fVVNFKG0pIChhdG9taWNfcmVhZChtKSAhPSAwKQorCisjZGVmaW5lIENTX0RCR0JSRUFLUE9JTlQge19fYXNtX18oIklOVCAkMyIpO30KKy8qCisgKglDUzQ2MXggZGVmaW5pdGlvbnMKKyAqLworIAorI2RlZmluZSBDUzQ2MVhfQkEwX1NJWkUJCTB4MjAwMAorI2RlZmluZSBDUzQ2MVhfQkExX0RBVEEwX1NJWkUJMHgzMDAwCisjZGVmaW5lIENTNDYxWF9CQTFfREFUQTFfU0laRQkweDM4MDAKKyNkZWZpbmUgQ1M0NjFYX0JBMV9QUkdfU0laRQkweDcwMDAKKyNkZWZpbmUgQ1M0NjFYX0JBMV9SRUdfU0laRQkweDAxMDAKKworI2RlZmluZSBHT0ZfUEVSX1NFQwkyMDAKKworI2RlZmluZSBDU0RFQlVHX0lOVEVSRkFDRSAxCisjZGVmaW5lIENTREVCVUcgMQorLyoKKyAqIFR1cm4gb24vb2ZmIGRlYnVnZ2luZyBjb21waWxhdGlvbiBieSB1c2luZyAxLzAgcmVzcGVjdGl2ZWx5IGZvciBDU0RFQlVHCisgKgorICoKKyAqIENTREVCVUcgaXMgdXN1YWwgbW9kZSBpcyBzZXQgdG8gMSwgdGhlbiB1c2UgdGhlCisgKiBjc19kZWJ1Z2xldmVsIGFuZCBjc19kZWJ1Z21hc2sgdG8gdHVybiBvbiBvciBvZmYgZGVidWdnaW5nLgorICogRGVidWcgbGV2ZWwgb2YgMSBoYXMgYmVlbiBkZWZpbmVkIHRvIGJlIGtlcm5lbCBlcnJvcnMgYW5kIGluZm8KKyAqIHRoYXQgc2hvdWxkIGJlIHByaW50ZWQgb24gYW55IHJlbGVhc2VkIGRyaXZlci4KKyAqLworI2lmIENTREVCVUcKKyNkZWZpbmUgQ1NfREJHT1VUKG1hc2ssbGV2ZWwseCkgaWYoKGNzX2RlYnVnbGV2ZWwgPj0gKGxldmVsKSkgJiYgKChtYXNrKSAmIGNzX2RlYnVnbWFzaykpIHt4O30gCisjZWxzZQorI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KSAKKyNlbmRpZgorLyoKKyAqIGNzX2RlYnVnbWFzayBhcmVhcworICovCisjZGVmaW5lIENTX0lOSVQJIAkweDAwMDAwMDAxCQkvKiBpbml0aWFsaXphdGlvbiBhbmQgcHJvYmUgZnVuY3Rpb25zICovCisjZGVmaW5lIENTX0VSUk9SIAkweDAwMDAwMDAyCQkvKiB0bXAgZGVidWdnaW5nIGJpdCBwbGFjZWhvbGRlciAqLworI2RlZmluZSBDU19JTlRFUlJVUFQJMHgwMDAwMDAwNAkJLyogaW50ZXJydXB0IGhhbmRsZXIgKHNlcGFyYXRlIGZyb20gYWxsIG90aGVyKSAqLworI2RlZmluZSBDU19GVU5DVElPTiAJMHgwMDAwMDAwOAkJLyogZW50ZXIvbGVhdmUgZnVuY3Rpb25zICovCisjZGVmaW5lIENTX1dBVkVfV1JJVEUgCTB4MDAwMDAwMTAJCS8qIHdyaXRlIGluZm9ybWF0aW9uIGZvciB3YXZlICovCisjZGVmaW5lIENTX1dBVkVfUkVBRCAJMHgwMDAwMDAyMAkJLyogcmVhZCBpbmZvcm1hdGlvbiBmb3Igd2F2ZSAqLworI2RlZmluZSBDU19NSURJX1dSSVRFIAkweDAwMDAwMDQwCQkvKiB3cml0ZSBpbmZvcm1hdGlvbiBmb3IgbWlkaSAqLworI2RlZmluZSBDU19NSURJX1JFQUQgCTB4MDAwMDAwODAJCS8qIHJlYWQgaW5mb3JtYXRpb24gZm9yIG1pZGkgKi8KKyNkZWZpbmUgQ1NfTVBVNDAxX1dSSVRFIDB4MDAwMDAxMDAJCS8qIHdyaXRlIGluZm9ybWF0aW9uIGZvciBtcHU0MDEgKi8KKyNkZWZpbmUgQ1NfTVBVNDAxX1JFQUQgCTB4MDAwMDAyMDAJCS8qIHJlYWQgaW5mb3JtYXRpb24gZm9yIG1wdTQwMSAqLworI2RlZmluZSBDU19PUEVOCQkweDAwMDAwNDAwCQkvKiBhbGwgb3BlbiBmdW5jdGlvbnMgaW4gdGhlIGRyaXZlciAqLworI2RlZmluZSBDU19SRUxFQVNFCTB4MDAwMDA4MDAJCS8qIGFsbCByZWxlYXNlIGZ1bmN0aW9ucyBpbiB0aGUgZHJpdmVyICovCisjZGVmaW5lIENTX1BBUk1TCTB4MDAwMDEwMDAJCS8qIGZ1bmN0aW9uYWwgYW5kIG9wZXJhdGlvbmFsIHBhcmFtZXRlcnMgKi8KKyNkZWZpbmUgQ1NfSU9DVEwJMHgwMDAwMjAwMAkJLyogaW9jdGwgKG5vbi1taXhlcikgKi8KKyNkZWZpbmUgQ1NfUE0JCTB4MDAwMDQwMDAJCS8qIFBNICovCisjZGVmaW5lIENTX1RNUAkJMHgxMDAwMDAwMAkJLyogdG1wIGRlYnVnIG1hc2sgYml0ICovCisKKyNkZWZpbmUgQ1NfSU9DVExfQ01EX1NVU1BFTkQJMHgxCS8vIHN1c3BlbmQKKyNkZWZpbmUgQ1NfSU9DVExfQ01EX1JFU1VNRQkweDIJLy8gcmVzdW1lCisKKyNpZiBDU0RFQlVHCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z2xldmVsPTE7CQkJLyogbGV2ZWxzIHJhbmdlIGZyb20gMS05ICovCittb2R1bGVfcGFyYW0oY3NfZGVidWdsZXZlbCwgdWxvbmcsIDA2NDQpOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY3NfZGVidWdtYXNrPUNTX0lOSVQgfCBDU19FUlJPUjsJLyogdXNlIENTX0RCR09VVCB3aXRoIHZhcmlvdXMgbWFzayB2YWx1ZXMgKi8KK21vZHVsZV9wYXJhbShjc19kZWJ1Z21hc2ssIHVsb25nLCAwNjQ0KTsKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGxvbmcgaGVyY3VsZXNfZWdwaW9fZGlzYWJsZTsgIC8qIGlmIG5vbi16ZXJvIHNldCBhbGwgRUdQSU8gdG8gMCAqLworbW9kdWxlX3BhcmFtKGhlcmN1bGVzX2VncGlvX2Rpc2FibGUsIHVsb25nLCAwKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGluaXRkZWxheT03MDA7ICAvKiBQTSBkZWxheSBpbiBtaWxsaXNlY3MgKi8KK21vZHVsZV9wYXJhbShpbml0ZGVsYXksIHVsb25nLCAwKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHBvd2VyZG93bj0tMTsgIC8qIHR1cm4gb24vb2ZmIHBvd2VyZG93biBwcm9jZXNzaW5nIGluIGRyaXZlciAqLworbW9kdWxlX3BhcmFtKHBvd2VyZG93biwgdWxvbmcsIDApOworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSIDMKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRlZmF1bHRvcmRlcj1ETUFCVUZfREVGQVVMVE9SREVSOworbW9kdWxlX3BhcmFtKGRlZmF1bHRvcmRlciwgdWxvbmcsIDApOworCitzdGF0aWMgaW50IGV4dGVybmFsX2FtcDsKK21vZHVsZV9wYXJhbShleHRlcm5hbF9hbXAsIGJvb2wsIDApOworc3RhdGljIGludCB0aGlua3BhZDsKK21vZHVsZV9wYXJhbSh0aGlua3BhZCwgYm9vbCwgMCk7CisKKy8qCisqIHNldCB0aGUgcG93ZXJkb3duIG1vZHVsZSBwYXJtIHRvIDAgdG8gZGlzYWJsZSBhbGwgCisqIHBvd2VyZG93bi4gYWxzbyBzZXQgdGhpbmtwYWQgdG8gMSB0byBkaXNhYmxlIHBvd2VyZG93biwgCisqIGJ1dCBhbHNvIHRvIGVuYWJsZSB0aGUgY2xrcnVuIGZ1bmN0aW9uYWxpdHkuCisqLworc3RhdGljIHVuc2lnbmVkIGNzX3Bvd2VyZG93bj0xOworc3RhdGljIHVuc2lnbmVkIGNzX2xhcHRvcF93YWl0PTE7CisKKy8qIEFuIGluc3RhbmNlIG9mIHRoZSA0NjEwIGNoYW5uZWwgKi8KK3N0cnVjdCBjc19jaGFubmVsIAoreworCWludCB1c2VkOworCWludCBudW07CisJdm9pZCAqc3RhdGU7Cit9OworCisjZGVmaW5lIENTNDZYWF9NQUpPUl9WRVJTSU9OICIxIgorI2RlZmluZSBDUzQ2WFhfTUlOT1JfVkVSU0lPTiAiMjgiCisKKyNpZmRlZiBfX2lhNjRfXworI2RlZmluZSBDUzQ2WFhfQVJDSAkgICAgIAkiNjQiCS8vYXJjaGl0ZWN0dXJlIGtleQorI2Vsc2UKKyNkZWZpbmUgQ1M0NlhYX0FSQ0gJICAgICAJIjMyIgkvL2FyY2hpdGVjdHVyZSBrZXkKKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGxpc3RfaGVhZCBjczQ2eHhfZGV2cyA9IHsgJmNzNDZ4eF9kZXZzLCAmY3M0Nnh4X2RldnMgfTsKKworLyogbWFnaWMgbnVtYmVycyB0byBwcm90ZWN0IG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgQ1NfQ0FSRF9NQUdJQwkJMHg0MzUyNTU1MyAvKiAiQ1JVUyIgKi8KKyNkZWZpbmUgQ1NfU1RBVEVfTUFHSUMJCTB4NGM0ZjQ3NDkgLyogIkxPR0kiICovCisjZGVmaW5lIE5SX0hXX0NICQkzCisKKy8qIG1heGludW0gbnVtYmVyIG9mIEFDOTcgY29kZWNzIGNvbm5lY3RlZCwgQUM5NyAyLjAgZGVmaW5lZCA0ICovCisjZGVmaW5lIE5SX0FDOTcJCTIKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaXplW10gPSB7IDEsIDIsIDIsIDQgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2hpZnRbXSA9IHsgMCwgMSwgMSwgMiB9OworCisvKiAic29mdHdhcmUiIG9yIHZpcnR1YWwgY2hhbm5lbCwgYW4gaW5zdGFuY2Ugb2Ygb3BlbmVkIC9kZXYvZHNwICovCitzdHJ1Y3QgY3Nfc3RhdGUgeworCXVuc2lnbmVkIGludCBtYWdpYzsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZDsJLyogQ2FyZCBpbmZvICovCisKKwkvKiBzaW5nbGUgb3BlbiBsb2NrIG1lY2hhbmlzbSwgb25seSB1c2VkIGZvciByZWNvcmRpbmcgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCS8qIGZpbGUgbW9kZSAqLworCW1vZGVfdCBvcGVuX21vZGU7CisKKwkvKiB2aXJ0dWFsIGNoYW5uZWwgbnVtYmVyICovCisJaW50IHZpcnQ7CisJCisJc3RydWN0IGRtYWJ1ZiB7CisJCS8qIHdhdmUgc2FtcGxlIHN0dWZmICovCisJCXVuc2lnbmVkIGludCByYXRlOworCQl1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlOworCisJCS8qIGhhcmR3YXJlIGNoYW5uZWwgKi8KKwkJc3RydWN0IGNzX2NoYW5uZWwgKmNoYW5uZWw7CisJCWludCBwcmluZ2J1ZjsJCS8qIFNvZnR3YXJlIHJpbmcgc2xvdCAqLworCQl2b2lkICpwYnVmOwkJLyogNEsgaGFyZHdhcmUgRE1BIGJ1ZmZlciAqLworCisJCS8qIE9TUyBidWZmZXIgbWFuYWdlbWVudCBzdHVmZiAqLworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwkJdW5zaWduZWQgYnVmb3JkZXI7CisJCXVuc2lnbmVkIG51bWZyYWc7CisJCXVuc2lnbmVkIGZyYWdzaGlmdDsKKwkJdW5zaWduZWQgZGl2aXNvcjsKKwkJdW5zaWduZWQgdHlwZTsKKwkJdm9pZCAqdG1wYnVmZjsJCQkvKiB0bXAgYnVmZmVyIGZvciBzYW1wbGUgY29udmVyc2lvbnMgKi8KKwkJZG1hX2FkZHJfdCBkbWFhZGRyOworCQlkbWFfYWRkcl90IGRtYWFkZHJfdG1wYnVmZjsKKwkJdW5zaWduZWQgYnVmb3JkZXJfdG1wYnVmZjsJLyogTG9nIGJhc2UgMiBvZiBzaXplIGluIGJ5dGVzLi4gKi8KKworCQkvKiBvdXIgYnVmZmVyIGFjdHMgbGlrZSBhIGNpcmN1bGFyIHJpbmcgKi8KKwkJdW5zaWduZWQgaHdwdHI7CQkvKiB3aGVyZSBkbWEgbGFzdCBzdGFydGVkLCB1cGRhdGVkIGJ5IHVwZGF0ZV9wdHIgKi8KKwkJdW5zaWduZWQgc3dwdHI7CQkvKiB3aGVyZSBkcml2ZXIgbGFzdCBjbGVhci9maWxsZWQsIHVwZGF0ZWQgYnkgcmVhZC93cml0ZSAqLworCQlpbnQgY291bnQ7CQkvKiBieXRlcyB0byBiZSBjb21zdW1lZCBvciBiZWVuIGdlbmVyYXRlZCBieSBkbWEgbWFjaGluZSAqLworCQl1bnNpZ25lZCB0b3RhbF9ieXRlczsJLyogdG90YWwgYnl0ZXMgZG1hZWQgYnkgaGFyZHdhcmUgKi8KKwkJdW5zaWduZWQgYmxvY2tzOwkvKiB0b3RhbCBibG9ja3MgKi8KKworCQl1bnNpZ25lZCBlcnJvcjsJCS8qIG51bWJlciBvZiBvdmVyL3VuZGVycnVucyAqLworCQl1bnNpZ25lZCB1bmRlcnJ1bjsJLyogdW5kZXJydW4gcGVuZGluZyBiZWZvcmUgbmV4dCB3cml0ZSBoYXMgb2NjdXJyZWQgKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsJLyogcHV0IHByb2Nlc3Mgb24gd2FpdCBxdWV1ZSB3aGVuIG5vIG1vcmUgc3BhY2UgaW4gYnVmZmVyICovCisKKwkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQl1bnNpZ25lZCBmcmFnc2l6ZTsKKwkJdW5zaWduZWQgZG1hc2l6ZTsKKwkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7CisKKwkJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIG1hcHBlZDoxOworCQl1bnNpZ25lZCByZWFkeToxOworCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CisJCXVuc2lnbmVkIFNHb2s6MTsKKwkJdW5zaWduZWQgdXBkYXRlX2ZsYWc7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwl9IGRtYWJ1ZjsKKwkvKiBHdWFyZCBhZ2FpbnN0IG1tYXAvd3JpdGUvcmVhZCByYWNlcyAqLworCXN0cnVjdCBzZW1hcGhvcmUgc2VtOworfTsKKworc3RydWN0IGNzX2NhcmQgeworCXN0cnVjdCBjc19jaGFubmVsIGNoYW5uZWxbMl07CisJdW5zaWduZWQgaW50IG1hZ2ljOworCisJLyogV2Uga2VlcCBjczQ2MXggY2FyZHMgaW4gYSBsaW5rZWQgbGlzdCAqLworCXN0cnVjdCBjc19jYXJkICpuZXh0OworCisJLyogVGhlIGNzNDYxeCBoYXMgYSBjZXJ0YWluIGFtb3VudCBvZiBjcm9zcyBjaGFubmVsIGludGVyYWN0aW9uCisJICAgc28gd2UgdXNlIGEgc2luZ2xlIHBlciBjYXJkIGxvY2sgKi8KKwlzcGlubG9ja190IGxvY2s7CisJCisJLyogS2VlcCBBQzk3IHNhbmUgKi8KKwlzcGlubG9ja190IGFjOTdfbG9jazsKKworCS8qIG1peGVyIHVzZSBjb3VudCAqLworCWF0b21pY190IG1peGVyX3VzZV9jbnQ7CisKKwkvKiBQQ0kgZGV2aWNlIHN0dWZmICovCisJc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2OworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXVuc2lnbmVkIGludCBwY3RsLCBjY3RsOwkvKiBIYXJkd2FyZSBETUEgZmxhZyBzZXRzICovCisKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgZGV2X2F1ZGlvOworCWludCBkZXZfbWlkaTsKKworCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgYmFua3MgYW5kIGNoYW5uZWxzKi8KKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlc1syXTsKKworCXUxNiBhYzk3X2ZlYXR1cmVzOworCQorCWludCBhbXBsaWZpZXI7CQkJLyogQW1wbGlmaWVyIGNvbnRyb2wgKi8KKwl2b2lkICgqYW1wbGlmaWVyX2N0cmwpKHN0cnVjdCBjc19jYXJkICosIGludCk7CisJdm9pZCAoKmFtcF9pbml0KShzdHJ1Y3QgY3NfY2FyZCAqKTsKKwkKKwlpbnQgYWN0aXZlOwkJCS8qIEFjdGl2ZSBjbG9ja2luZyAqLworCXZvaWQgKCphY3RpdmVfY3RybCkoc3RydWN0IGNzX2NhcmQgKiwgaW50KTsKKwkKKwkvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBsb25nIGJhMF9hZGRyOworCXVuc2lnbmVkIGxvbmcgYmExX2FkZHI7CisJdTMyIGlycTsKKwkKKwkvKiBtYXBwaW5ncyAqLworCXZvaWQgX19pb21lbSAqYmEwOworCXVuaW9uCisJeworCQlzdHJ1Y3QKKwkJeworCQkJdTggX19pb21lbSAqZGF0YTA7CisJCQl1OCBfX2lvbWVtICpkYXRhMTsKKwkJCXU4IF9faW9tZW0gKnBtZW07CisJCQl1OCBfX2lvbWVtICpyZWc7CisJCX0gbmFtZTsKKwkJdTggX19pb21lbSAqaWR4WzRdOworCX0gYmExOworCQorCS8qIEZ1bmN0aW9uIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgY3NfY2hhbm5lbCAqKCphbGxvY19wY21fY2hhbm5lbCkoc3RydWN0IGNzX2NhcmQgKik7CisJc3RydWN0IGNzX2NoYW5uZWwgKigqYWxsb2NfcmVjX3BjbV9jaGFubmVsKShzdHJ1Y3QgY3NfY2FyZCAqKTsKKwl2b2lkICgqZnJlZV9wY21fY2hhbm5lbCkoc3RydWN0IGNzX2NhcmQgKiwgaW50IGNoYW4pOworCisJLyogL2Rldi9taWRpIHN0dWZmICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaXJkLCBpd3IsIGljbnQ7CisJCXVuc2lnbmVkIG9yZCwgb3dyLCBvY250OworCQl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisJCXdhaXRfcXVldWVfaGVhZF90IGl3YWl0OworCQl3YWl0X3F1ZXVlX2hlYWRfdCBvd2FpdDsKKwkJc3BpbmxvY2tfdCBsb2NrOworCQl1bnNpZ25lZCBjaGFyIGlidWZbQ1NfTUlESUlOQlVGXTsKKwkJdW5zaWduZWQgY2hhciBvYnVmW0NTX01JRElPVVRCVUZdOworCQltb2RlX3Qgb3Blbl9tb2RlOworCQlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCX0gbWlkaTsKKwlzdHJ1Y3QgY3M0Nnh4X3BtIHBtOworfTsKKworc3RhdGljIGludCBjc19vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGNzX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgY3NfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKTsKK3N0YXRpYyBpbnQgY3NfaGFyZHdhcmVfaW5pdChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCk7CitzdGF0aWMgaW50IGNzNDZ4eF9wb3dlcnVwKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSk7CitzdGF0aWMgaW50IGNzNDYxeF9wb3dlcmRvd24oc3RydWN0IGNzX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCB0eXBlLCBpbnQgc3VzcGVuZGZsYWcpOworc3RhdGljIHZvaWQgY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHR5cGUpOworc3RhdGljIGludCBjczQ2eHhfc3VzcGVuZF90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgcG1fbWVzc2FnZV90IHN0YXRlKTsKK3N0YXRpYyBpbnQgY3M0Nnh4X3Jlc3VtZV90Ymwoc3RydWN0IHBjaV9kZXYgKnBjaWRldik7CisKKyNpZm5kZWYgQ1M0NlhYX0FDUElfU1VQUE9SVAorc3RhdGljIGludCBjczQ2eHhfcG1fY2FsbGJhY2soc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZGF0YSk7CisjZW5kaWYKKworI2lmIENTREVCVUcKKworLyogREVCVUcgUk9VVElORVMgKi8KKworI2RlZmluZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTCAJX1NJT1dSKCdNJywxMjAsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUwgCV9TSU9XUignTScsMTIxLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0sgCV9TSU9XUignTScsMTIyLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0sgCV9TSU9XUignTScsMTIzLCBpbnQpCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX0FQTQkgCV9TSU9XUignTScsMTI0LCBpbnQpCisKK3N0YXRpYyB2b2lkIHByaW50aW9jdGwodW5zaWduZWQgaW50IHgpCit7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciB2aWR4OworCS8qIHRoZXNlIHZhbHVlcyBhcmUgaW5jb3JyZWN0IGZvciB0aGUgYWM5NyBkcml2ZXIsIGZpeC4KKyAgICAgICAgICogSW5kZXggb2YgbWl4dGFibGUxW10gbWVtYmVyIGlzIERldmljZSBJRCAKKyAgICAgICAgICogYW5kIG11c3QgYmUgPD0gU09VTkRfTUlYRVJfTlJERVZJQ0VTLgorICAgICAgICAgKiBWYWx1ZSBvZiBhcnJheSBtZW1iZXIgaXMgaW5kZXggaW50byBzLT5taXgudm9sW10KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1peHRhYmxlMVtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9QQ01dICAgICA9IDEsICAgLyogdm9pY2UgKi8KKyAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfTElORTFdICAgPSAyLCAgIC8qIEFVWCAqLworICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9DRF0gICAgICA9IDMsICAgLyogQ0QgKi8KKyAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfTElORV0gICAgPSA0LCAgIC8qIExpbmUgKi8KKyAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfU1lOVEhdICAgPSA1LCAgIC8qIEZNICovCisgICAgICAgICAgICAgICAgW1NPVU5EX01JWEVSX01JQ10gICAgID0gNiwgICAvKiBNaWMgKi8KKyAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfU1BFQUtFUl0gPSA3LCAgIC8qIFNwZWFrZXIgKi8KKyAgICAgICAgICAgICAgICBbU09VTkRfTUlYRVJfUkVDTEVWXSAgPSA4LCAgIC8qIFJlY29yZGluZyBsZXZlbCAqLworICAgICAgICAgICAgICAgIFtTT1VORF9NSVhFUl9WT0xVTUVdICA9IDkgICAgLyogTWFzdGVyIFZvbHVtZSAqLworICAgICAgICB9OworICAgICAgICAKKyAgICBzd2l0Y2goeCkgCisgICAgeworCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NTX0dFVERCR01BU0s6ICIpICk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUw6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDogIikgKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSzogIikgKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIk9TU19HRVRWRVJTSU9OOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NZTkM6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVREVVBMRVg6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUQ0FQUzogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfUkVTRVQ6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NQRUVEOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1RFUkVPOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9DSEFOTkVMUzogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VURk1UUzogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IAorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVRGTVQ6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfUE9TVDogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRUUklHR0VSOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVFRSSUdHRVI6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRPU1BBQ0U6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRJU1BBQ0U6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX05PTkJMT0NLOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT0RFTEFZOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVElQVFI6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT1BUUjogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRCTEtTSVpFOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NVQkRJVklERTogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX1JBVEU6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9CSVRTOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1dSSVRFX0ZJTFRFUjogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVFNZTkNSTzogIikgKTsKKwkJYnJlYWs7CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfUENNX1JFQURfRklMVEVSOiAiKSApOworCQlicmVhazsKKworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUxOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTE6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUyOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTI6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUzOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTM6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEU0OgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTQ6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1BSSVZBVEU1OgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTU6ICIpICk7CisJCWJyZWFrOworICAgICAgICBjYXNlIFNPVU5EX01JWEVSX0lORk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9JTkZPOiAiKSApOworCQlicmVhazsKKyAgICAgICAgY2FzZSBTT1VORF9PTERfTUlYRVJfSU5GTzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX09MRF9NSVhFUl9JTkZPOiAiKSApOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXN3aXRjaCAoX0lPQ19OUih4KSkgCisJCXsKKwkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9WT0xVTUU6ICIpICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNPVU5EX01JWEVSX1NQRUFLRVI6CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1NQRUFLRVI6ICIpICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKKwkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUkVDTEVWOiAiKSApOworCQkJCWJyZWFrOworCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX01JQzogIikgKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1lOVEg6CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1NZTlRIOiAiKSApOworCQkJCWJyZWFrOworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6IAorCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9SRUNTUkM6ICIpICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0RFVk1BU0s6ICIpICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1JFQ01BU0s6ICIpICk7CisJCQkJYnJlYWs7CisJCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6IAorCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9TVEVSRU9ERVZTOiAiKSApOworCQkJCWJyZWFrOworCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DQVBTOiIpICk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWkgPSBfSU9DX05SKHgpOworCQkJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCAhKHZpZHggPSBtaXh0YWJsZTFbaV0pKQorCQkJCXsKKwkJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlVOS05PV04gSU9DVEw6IDB4JS44eCBOUj0lZCAiLHgsaSkgKTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX0lPQ1RMIEFDOXg6IDB4JS44eCBOUj0lZCAiLAorCQkJCQkJCXgsaSkgKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCX0KKyAgICB9CisgICAgQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoImNvbW1hbmQgPSAweCV4IElPQ19OUj0lZFxuIix4LCBfSU9DX05SKHgpKSApOworfQorI2VuZGlmCisKKy8qCisgKiAgY29tbW9uIEkvTyByb3V0aW5lcworICovCisKK3N0YXRpYyB2b2lkIGNzNDYxeF9wb2tlKHN0cnVjdCBjc19jYXJkICpjb2RlYywgdW5zaWduZWQgbG9uZyByZWcsIHVuc2lnbmVkIGludCB2YWwpCit7CisJd3JpdGVsKHZhbCwgY29kZWMtPmJhMS5pZHhbKHJlZyA+PiAxNikgJiAzXSsocmVnJjB4ZmZmZikpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGNzNDYxeF9wZWVrKHN0cnVjdCBjc19jYXJkICpjb2RlYywgdW5zaWduZWQgbG9uZyByZWcpCit7CisJcmV0dXJuIHJlYWRsKGNvZGVjLT5iYTEuaWR4WyhyZWcgPj4gMTYpICYgM10rKHJlZyYweGZmZmYpKTsKK30KKworc3RhdGljIHZvaWQgY3M0NjF4X3Bva2VCQTAoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZywgdW5zaWduZWQgaW50IHZhbCkKK3sKKwl3cml0ZWwodmFsLCBjb2RlYy0+YmEwK3JlZyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3M0NjF4X3BlZWtCQTAoc3RydWN0IGNzX2NhcmQgKmNvZGVjLCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKwlyZXR1cm4gcmVhZGwoY29kZWMtPmJhMCtyZWcpOworfQorCisKK3N0YXRpYyB1MTYgY3NfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKTsKK3N0YXRpYyB2b2lkIGNzX2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZywgdTE2IGRhdGEpOworCitzdGF0aWMgc3RydWN0IGNzX2NoYW5uZWwgKmNzX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworCWlmKGNhcmQtPmNoYW5uZWxbMV0udXNlZD09MSkKKwkJcmV0dXJuIE5VTEw7CisJY2FyZC0+Y2hhbm5lbFsxXS51c2VkPTE7CisJY2FyZC0+Y2hhbm5lbFsxXS5udW09MTsKKwlyZXR1cm4gJmNhcmQtPmNoYW5uZWxbMV07Cit9CisKK3N0YXRpYyBzdHJ1Y3QgY3NfY2hhbm5lbCAqY3NfYWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworCWlmKGNhcmQtPmNoYW5uZWxbMF0udXNlZD09MSkKKwkJcmV0dXJuIE5VTEw7CisJY2FyZC0+Y2hhbm5lbFswXS51c2VkPTE7CisJY2FyZC0+Y2hhbm5lbFswXS5udW09MDsKKwlyZXR1cm4gJmNhcmQtPmNoYW5uZWxbMF07Cit9CisKK3N0YXRpYyB2b2lkIGNzX2ZyZWVfcGNtX2NoYW5uZWwoc3RydWN0IGNzX2NhcmQgKmNhcmQsIGludCBjaGFubmVsKQoreworCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0uc3RhdGUgPSBOVUxMOworCWNhcmQtPmNoYW5uZWxbY2hhbm5lbF0udXNlZD0wOworfQorCisvKgorICogc2V0dXAgYSBkaXZpc29yIHZhbHVlIHRvIGhlbHAgd2l0aCBjb252ZXJzaW9uIGZyb20KKyAqIDE2Yml0IFN0ZXJlbywgZG93biB0byA4Yml0IHN0ZXJlby9tb25vIG9yIDE2Yml0IG1vbm8uCisgKiBhc3NpZ24gYSBkaXZpc29yIG9mIDEgaWYgdXNpbmcgMTZiaXQgU3RlcmVvIGFzIHRoYXQgaXMKKyAqIHRoZSBvbmx5IGZvcm1hdCB0aGF0IHRoZSBzdGF0aWMgaW1hZ2Ugd2lsbCBjYXB0dXJlLgorICovCitzdGF0aWMgdm9pZCBjc19zZXRfZGl2aXNvcihzdHJ1Y3QgZG1hYnVmICpkbWFidWYpCit7CisJaWYoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKQorCQlkbWFidWYtPmRpdmlzb3IgPSAxOworCWVsc2UgaWYoICEoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAKKwkgICAgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkKKwkJZG1hYnVmLT5kaXZpc29yID0gMjsKKwllbHNlIGlmKCAoZG1hYnVmLT5mbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAKKwkgICAgIShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkpCisJCWRtYWJ1Zi0+ZGl2aXNvciA9IDI7CisJZWxzZSBpZiggIShkbWFidWYtPmZtdCAmIENTX0ZNVF9TVEVSRU8pICYmIAorCSAgICAhKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkKKwkJZG1hYnVmLT5kaXZpc29yID0gNDsKKwllbHNlCisJCWRtYWJ1Zi0+ZGl2aXNvciA9IDE7CisKKwlDU19EQkdPVVQoQ1NfUEFSTVMgfCBDU19GVU5DVElPTiwgOCwgcHJpbnRrKAorCQkiY3M0Nnh4OiBjc19zZXRfZGl2aXNvcigpLSAlcyAlZFxuIiwKKwkJCShkbWFidWYtPnR5cGUgPT0gQ1NfVFlQRV9BREMpID8gIkFEQyIgOiAiREFDIiwgCisJCQlkbWFidWYtPmRpdmlzb3IpICk7Cit9CisKKy8qCisqIG11dGUgc29tZSBvZiB0aGUgbW9yZSBwcmV2YWxlbnQgcmVnaXN0ZXJzIHRvIGF2b2lkIHBvcHBpbmcuCisqLworc3RhdGljIHZvaWQgY3NfbXV0ZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHN0YXRlKSAKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2PWNhcmQtPmFjOTdfY29kZWNbMF07CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfbXV0ZSgpKyAlc1xuIiwKKwkJKHN0YXRlID09IENTX1RSVUUpID8gIk11dGluZyIgOiAiVW5NdXRpbmciKSApOworCisJaWYoc3RhdGUgPT0gQ1NfVFJVRSkKKwl7CisJLyoKKwkqIGZpeCBwb3BzIHdoZW4gcG93ZXJpbmcgdXAgb24gdGhpbmtwYWRzCisJKi8KKwkJY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldCggZGV2LCAKKwkJCQkodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSk7IAorCQljYXJkLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCisJCQkJKHU4KUJBMF9BQzk3X0hFQURQSE9ORV9WT0xVTUUpOyAKKwkJY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8gPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCisJCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyk7IAorCQljYXJkLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lID0gKHUzMiljc19hYzk3X2dldChkZXYsIAorCQkJCSh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSk7CisJCQkKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgMHg4MDAwKTsKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgMHg4MDAwKTsKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCAweDgwMDApOworCQljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19QQ01fT1VUX1ZPTFVNRSwgMHg4MDAwKTsKKwl9CisJZWxzZQorCXsKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRSwgY2FyZC0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lKTsKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgY2FyZC0+cG0udTMyQUM5N19oZWFkcGhvbmVfdm9sdW1lKTsKKwkJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfTUFTVEVSX1ZPTFVNRV9NT05PLCBjYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubyk7CisJCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X1BDTV9PVVRfVk9MVU1FLCBjYXJkLT5wbS51MzJBQzk3X3BjbV9vdXRfdm9sdW1lKTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX211dGUoKS1cbiIpKTsKK30KKworLyogc2V0IHBsYXliYWNrIHNhbXBsZSByYXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNzX3NldF9kYWNfcmF0ZShzdHJ1Y3QgY3Nfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IHJhdGUpCit7CQorCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGludCB0bXAxLCB0bXAyOworCXVuc2lnbmVkIGludCBwaGlJbmNyOworCXVuc2lnbmVkIGludCBjb3JyZWN0aW9uUGVyR09GLCBjb3JyZWN0aW9uUGVyU2VjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19zZXRfZGFjX3JhdGUoKSsgJWRcbiIscmF0ZSkgKTsKKworCS8qCisJICogIENvbXB1dGUgdGhlIHZhbHVlcyB1c2VkIHRvIGRyaXZlIHRoZSBhY3R1YWwgc2FtcGxlIHJhdGUgY29udmVyc2lvbi4KKwkgKiAgVGhlIGZvbGxvd2luZyBmb3JtdWxhcyBhcmUgYmVpbmcgY29tcHV0ZWQsIHVzaW5nIGlubGluZSBhc3NlbWJseQorCSAqICBzaW5jZSB3ZSBuZWVkIHRvIHVzZSA2NCBiaXQgYXJpdGhtZXRpYyB0byBjb21wdXRlIHRoZSB2YWx1ZXM6CisJICoKKwkgKiAgcGhpSW5jciA9IGZsb29yKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQorCSAqICBjb3JyZWN0aW9uUGVyR09GID0gZmxvb3IoKEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IpIC8KKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPRl9QRVJfU0VDKQorICAgICAgICAgKiAgdWxDb3JyZWN0aW9uUGVyU2VjID0gRnMsaW4gKiAyXjI2IC0gRnMsb3V0ICogcGhpSW5jciAtTQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMgKiBjb3JyZWN0aW9uUGVyR09GCisJICoKKwkgKiAgaS5lLgorCSAqCisJICogIHBoaUluY3I6b3RoZXIgPSBkaXZpZGVuZDpyZW1haW5kZXIoKEZzLGluICogMl4yNikgLyBGcyxvdXQpCisJICogIGNvcnJlY3Rpb25QZXJHT0Y6Y29ycmVjdGlvblBlclNlYyA9CisJICogICAgICBkaXZpZGVuZDpyZW1haW5kZXIodWxPdGhlciAvIEdPRl9QRVJfU0VDKQorCSAqLworCXRtcDEgPSByYXRlIDw8IDE2OworCXBoaUluY3IgPSB0bXAxIC8gNDgwMDA7CisJdG1wMSAtPSBwaGlJbmNyICogNDgwMDA7CisJdG1wMSA8PD0gMTA7CisJcGhpSW5jciA8PD0gMTA7CisJdG1wMiA9IHRtcDEgLyA0ODAwMDsKKwlwaGlJbmNyICs9IHRtcDI7CisJdG1wMSAtPSB0bXAyICogNDgwMDA7CisJY29ycmVjdGlvblBlckdPRiA9IHRtcDEgLyBHT0ZfUEVSX1NFQzsKKwl0bXAxIC09IGNvcnJlY3Rpb25QZXJHT0YgKiBHT0ZfUEVSX1NFQzsKKwljb3JyZWN0aW9uUGVyU2VjID0gdG1wMTsKKworCS8qCisJICogIEZpbGwgaW4gdGhlIFNhbXBsZVJhdGVDb252ZXJ0ZXIgY29udHJvbCBibG9jay4KKwkgKi8KKwkgCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJY3M0NjF4X3Bva2Uoc3RhdGUtPmNhcmQsIEJBMV9QU1JDLAorCSAgKChjb3JyZWN0aW9uUGVyU2VjIDw8IDE2KSAmIDB4RkZGRjAwMDApIHwgKGNvcnJlY3Rpb25QZXJHT0YgJiAweEZGRkYpKTsKKwljczQ2MXhfcG9rZShzdGF0ZS0+Y2FyZCwgQkExX1BQSSwgcGhpSW5jcik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlkbWFidWYtPnJhdGUgPSByYXRlOworCQorCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3NldF9kYWNfcmF0ZSgpLSAlZFxuIixyYXRlKSApOworCXJldHVybiByYXRlOworfQorCisvKiBzZXQgcmVjb3JkaW5nIHNhbXBsZSByYXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50IGNzX3NldF9hZGNfcmF0ZShzdHJ1Y3QgY3Nfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBpbnQgcGhpSW5jciwgY29lZmZJbmNyLCB0bXAxLCB0bXAyOworCXVuc2lnbmVkIGludCBjb3JyZWN0aW9uUGVyR09GLCBjb3JyZWN0aW9uUGVyU2VjLCBpbml0aWFsRGVsYXk7CisJdW5zaWduZWQgaW50IGZyYW1lR3JvdXBMZW5ndGgsIGNudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3NldF9hZGNfcmF0ZSgpKyAlZFxuIixyYXRlKSApOworCisJLyoKKwkgKiAgV2UgY2FuIG9ubHkgZGVjaW1hdGUgYnkgdXAgdG8gYSBmYWN0b3Igb2YgMS85dGggdGhlIGhhcmR3YXJlIHJhdGUuCisJICogIENvcnJlY3QgdGhlIHZhbHVlIGlmIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBzdHJheSBvdXRzaWRlIHRoYXQgbGltaXQuCisJICovCisJaWYgKChyYXRlICogOSkgPCA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwIC8gOTsKKworCS8qCisJICogIFdlIGNhbiBub3QgY2FwdHVyZSBhdCBhdCByYXRlIGdyZWF0ZXIgdGhhbiB0aGUgSW5wdXQgUmF0ZSAoNDgwMDApLgorCSAqICBSZXR1cm4gYW4gZXJyb3IgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHN0cmF5IG91dHNpZGUgdGhhdCBsaW1pdC4KKwkgKi8KKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisKKwkvKgorCSAqICBDb21wdXRlIHRoZSB2YWx1ZXMgdXNlZCB0byBkcml2ZSB0aGUgYWN0dWFsIHNhbXBsZSByYXRlIGNvbnZlcnNpb24uCisJICogIFRoZSBmb2xsb3dpbmcgZm9ybXVsYXMgYXJlIGJlaW5nIGNvbXB1dGVkLCB1c2luZyBpbmxpbmUgYXNzZW1ibHkKKwkgKiAgc2luY2Ugd2UgbmVlZCB0byB1c2UgNjQgYml0IGFyaXRobWV0aWMgdG8gY29tcHV0ZSB0aGUgdmFsdWVzOgorCSAqCisJICogICAgIGNvZWZmSW5jciA9IC1mbG9vcigoRnMsb3V0ICogMl4yMykgLyBGcyxpbikKKwkgKiAgICAgcGhpSW5jciA9IGZsb29yKChGcyxpbiAqIDJeMjYpIC8gRnMsb3V0KQorCSAqICAgICBjb3JyZWN0aW9uUGVyR09GID0gZmxvb3IoKEZzLGluICogMl4yNiAtIEZzLG91dCAqIHBoaUluY3IpIC8KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMpCisJICogICAgIGNvcnJlY3Rpb25QZXJTZWMgPSBGcyxpbiAqIDJeMjYgLSBGcyxvdXQgKiBwaGlJbmNyIC0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgR09GX1BFUl9TRUMgKiBjb3JyZWN0aW9uUGVyR09GCisJICogICAgIGluaXRpYWxEZWxheSA9IGNlaWwoKDI0ICogRnMsaW4pIC8gRnMsb3V0KQorCSAqCisJICogaS5lLgorCSAqCisJICogICAgIGNvZWZmSW5jciA9IG5lZyhkaXZpZGVuZCgoRnMsb3V0ICogMl4yMykgLyBGcyxpbikpCisJICogICAgIHBoaUluY3I6dWxPdGhlciA9IGRpdmlkZW5kOnJlbWFpbmRlcigoRnMsaW4gKiAyXjI2KSAvIEZzLG91dCkKKwkgKiAgICAgY29ycmVjdGlvblBlckdPRjpjb3JyZWN0aW9uUGVyU2VjID0KKwkgKiAJICAgIGRpdmlkZW5kOnJlbWFpbmRlcih1bE90aGVyIC8gR09GX1BFUl9TRUMpCisJICogICAgIGluaXRpYWxEZWxheSA9IGRpdmlkZW5kKCgoMjQgKiBGcyxpbikgKyBGcyxvdXQgLSAxKSAvIEZzLG91dCkKKwkgKi8KKworCXRtcDEgPSByYXRlIDw8IDE2OworCWNvZWZmSW5jciA9IHRtcDEgLyA0ODAwMDsKKwl0bXAxIC09IGNvZWZmSW5jciAqIDQ4MDAwOworCXRtcDEgPDw9IDc7CisJY29lZmZJbmNyIDw8PSA3OworCWNvZWZmSW5jciArPSB0bXAxIC8gNDgwMDA7CisJY29lZmZJbmNyIF49IDB4RkZGRkZGRkY7CisJY29lZmZJbmNyKys7CisJdG1wMSA9IDQ4MDAwIDw8IDE2OworCXBoaUluY3IgPSB0bXAxIC8gcmF0ZTsKKwl0bXAxIC09IHBoaUluY3IgKiByYXRlOworCXRtcDEgPDw9IDEwOworCXBoaUluY3IgPDw9IDEwOworCXRtcDIgPSB0bXAxIC8gcmF0ZTsKKwlwaGlJbmNyICs9IHRtcDI7CisJdG1wMSAtPSB0bXAyICogcmF0ZTsKKwljb3JyZWN0aW9uUGVyR09GID0gdG1wMSAvIEdPRl9QRVJfU0VDOworCXRtcDEgLT0gY29ycmVjdGlvblBlckdPRiAqIEdPRl9QRVJfU0VDOworCWNvcnJlY3Rpb25QZXJTZWMgPSB0bXAxOworCWluaXRpYWxEZWxheSA9ICgoNDgwMDAgKiAyNCkgKyByYXRlIC0gMSkgLyByYXRlOworCisJLyoKKwkgKiAgRmlsbCBpbiB0aGUgVmFyaURlY2ltYXRlIGNvbnRyb2wgYmxvY2suCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1NSQywKKwkJKChjb3JyZWN0aW9uUGVyU2VjIDw8IDE2KSAmIDB4RkZGRjAwMDApIHwgKGNvcnJlY3Rpb25QZXJHT0YgJiAweEZGRkYpKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0NJLCBjb2VmZkluY3IpOworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DRCwKKwkJKCgoQkExX1ZBUklERUNfQlVGXzEgKyAoaW5pdGlhbERlbGF5IDw8IDIpKSA8PCAxNikgJiAweEZGRkYwMDAwKSB8IDB4ODApOworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DUEksIHBoaUluY3IpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCS8qCisJICogIEZpZ3VyZSBvdXQgdGhlIGZyYW1lIGdyb3VwIGxlbmd0aCBmb3IgdGhlIHdyaXRlIGJhY2sgdGFzay4gIEJhc2ljYWxseSwKKwkgKiAgdGhpcyBpcyBqdXN0IHRoZSBmYWN0b3JzIG9mIDI0MDAwICgyXjYqMyo1XjMpIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluCisJICogIHRoZSBvdXRwdXQgc2FtcGxlIHJhdGUuCisJICovCisJZnJhbWVHcm91cExlbmd0aCA9IDE7CisJZm9yIChjbnQgPSAyOyBjbnQgPD0gNjQ7IGNudCAqPSAyKSB7CisJCWlmICgoKHJhdGUgLyBjbnQpICogY250KSAhPSByYXRlKQorCQkJZnJhbWVHcm91cExlbmd0aCAqPSAyOworCX0KKwlpZiAoKChyYXRlIC8gMykgKiAzKSAhPSByYXRlKSB7CisJCWZyYW1lR3JvdXBMZW5ndGggKj0gMzsKKwl9CisJZm9yIChjbnQgPSA1OyBjbnQgPD0gMTI1OyBjbnQgKj0gNSkgeworCQlpZiAoKChyYXRlIC8gY250KSAqIGNudCkgIT0gcmF0ZSkgCisJCQlmcmFtZUdyb3VwTGVuZ3RoICo9IDU7CisgICAgICAgIH0KKworCS8qCisJICogRmlsbCBpbiB0aGUgV3JpdGVCYWNrIGNvbnRyb2wgYmxvY2suCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0ZHMSwgZnJhbWVHcm91cExlbmd0aCk7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NGRzIsICgweDAwODAwMDAwIHwgZnJhbWVHcm91cExlbmd0aCkpOworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1NULCAweDAwMDBGRkZGKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ1NQQiwgKCg2NTUzNiAqIHJhdGUpIC8gMjQwMDApKTsKKwljczQ2MXhfcG9rZShjYXJkLCAoQkExX0NTUEIgKyA0KSwgMHgwMDAwRkZGRik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCWRtYWJ1Zi0+cmF0ZSA9IHJhdGU7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3Nfc2V0X2FkY19yYXRlKCktICVkXG4iLHJhdGUpICk7CisJcmV0dXJuIHJhdGU7Cit9CisKKy8qIHByZXBhcmUgY2hhbm5lbCBhdHRyaWJ1dGVzIGZvciBwbGF5YmFjayAqLyAKK3N0YXRpYyB2b2lkIGNzX3BsYXlfc2V0dXAoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworICAgICAgICB1bnNpZ25lZCBpbnQgdG1wLCBDb3VudCwgcGxheUZvcm1hdDsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3BsYXlfc2V0dXAoKStcbiIpICk7CisgICAgICAgIGNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QVk9MLCAweDgwMDA4MDAwKTsKKyAgICAgICAgaWYoIWRtYWJ1Zi0+U0dvaykKKyAgICAgICAgICAgICAgIGNzNDYxeF9wb2tlKGNhcmQsIEJBMV9QQkEsIHZpcnRfdG9fYnVzKGRtYWJ1Zi0+cGJ1ZikpOworICAgIAorICAgICAgICBDb3VudCA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBwbGF5Rm9ybWF0PWNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QRklFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgJj0gfkRNQV9SUV9DMl9BQ19NT05PX1RPX1NURVJFTzsgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENvdW50ICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgfD0gRE1BX1JRX0MyX0FDX01PTk9fVE9fU1RFUkVPOyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBpZiAoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UXzE2QklUKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgJj0gfihETUFfUlFfQzJfQUNfOF9UT18xNl9CSVQgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQpOyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIENvdW50ICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHBsYXlGb3JtYXQgfD0gKERNQV9SUV9DMl9BQ184X1RPXzE2X0JJVCAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBETUFfUlFfQzJfQUNfU0lHTkVEX0NPTlZFUlQpOyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgcGxheUZvcm1hdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUERUQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICB0bXAgJj0gMHhmZmZmZmUwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICBjczQ2MXhfcG9rZShjYXJkLCBCQTFfUERUQywgdG1wIHwgLS1Db3VudCk7ICAgICAgICAgICAgICAgICAgICAgICAgIAorCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcGxheV9zZXR1cCgpLVxuIikgKTsKKworfQorCitzdGF0aWMgc3RydWN0IEluaXRTdHJ1Y3QKK3sKKyAgICB1MzIgb2ZmOworICAgIHUzMiB2YWw7Cit9IEluaXRBcnJheVtdID0geyB7MHgwMDAwMDA0MCwgMHgzZmMwMDAwZn0sCisgICAgICAgICAgICAgICAgICB7MHgwMDAwMDA0YywgMHgwNDgwMDAwMH0sCisKKyAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGIzLCAweDAwMDAwNzgwfSwKKyAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGI3LCAweDAwMDAwMDAwfSwKKyAgICAgICAgICAgICAgICAgIHsweDAwMDAwMGJjLCAweDA3ODAwMDAwfSwKKworICAgICAgICAgICAgICAgICAgezB4MDAwMDAwY2QsIDB4MDA4MDAwMDB9LAorICAgICAgICAgICAgICAgIH07CisKKy8qCisgKiAiU2V0Q2FwdHVyZVNQVmFsdWVzKCkiIC0tIEluaXRpYWxpemUgcmVjb3JkIHRhc2sgdmFsdWVzIGJlZm9yZSBlYWNoCisgKiAJY2FwdHVyZSBzdGFydHVwLiAgCisgKi8KK3N0YXRpYyB2b2lkIFNldENhcHR1cmVTUFZhbHVlcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKK3sKKwl1bnNpZ25lZCBpLCBvZmZzZXQ7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoImNzNDZ4eDogU2V0Q2FwdHVyZVNQVmFsdWVzKCkrXG4iKSApOworCWZvcihpPTA7IGk8c2l6ZW9mKEluaXRBcnJheSkvc2l6ZW9mKHN0cnVjdCBJbml0U3RydWN0KTsgaSsrKQorCXsKKwkJb2Zmc2V0ID0gSW5pdEFycmF5W2ldLm9mZio0OyAvKiA4Yml0IHRvIDMyYml0IG9mZnNldCB2YWx1ZSAqLworCQljczQ2MXhfcG9rZShjYXJkLCBvZmZzZXQsIEluaXRBcnJheVtpXS52YWwgKTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoImNzNDZ4eDogU2V0Q2FwdHVyZVNQVmFsdWVzKCktXG4iKSApOworfQorCisvKiBwcmVwYXJlIGNoYW5uZWwgYXR0cmlidXRlcyBmb3IgcmVjb3JkaW5nICovCitzdGF0aWMgdm9pZCBjc19yZWNfc2V0dXAoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlY19zZXR1cCgpK1xuIikgKTsKKworCVNldENhcHR1cmVTUFZhbHVlcyhjYXJkKTsKKworCS8qCisJICogc2V0IHRoZSBhdHRlbnVhdGlvbiB0byAwZEIgCisJICovCisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NWT0wsIDB4ODAwMDgwMDApOworCisJLyoKKwkgKiBzZXQgdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGNhcHR1cmUgYnVmZmVyIGludG8gdGhlIFNQCisJICovCisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NCQSwgdmlydF90b19idXMoZG1hYnVmLT5yYXdidWYpKTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlY19zZXR1cCgpLVxuIikgKTsKK30KKworCisvKiBnZXQgY3VycmVudCBwbGF5YmFjay9yZWNvcmRpbmcgZG1hIGJ1ZmZlciBwb2ludGVyIChieXRlIG9mZnNldCBmcm9tIExCQSksCisgICBjYWxsZWQgd2l0aCBzcGlubG9jayBoZWxkISAqLworICAgCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNzX2dldF9kbWFfYWRkcihzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXUzMiBvZmZzZXQ7CisJCisJaWYgKCAoIShkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSkgJiYKKwkgICAgICghKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpICkgKQorCXsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoCisJCQkiY3M0Nnh4OiBFUlJPUiBjc19nZXRfZG1hX2FkZHIoKTogbm90IGVuYWJsZWQgXG4iKSApOworCQlyZXR1cm4gMDsKKwl9CisJCQorCS8qCisJICogZ3JhbnVsYXJpdHkgaXMgYnl0ZSBib3VuZGFyeSwgZ29vZCBwYXJ0LgorCSAqLworCWlmKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCisJeworCQlvZmZzZXQgPSBjczQ2MXhfcGVlayhzdGF0ZS0+Y2FyZCwgQkExX1BCQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCX0KKwllbHNlIC8qIEFEQ19SVU5OSU5HIG11c3QgYmUgc2V0ICovCisJeworCQlvZmZzZXQgPSBjczQ2MXhfcGVlayhzdGF0ZS0+Y2FyZCwgQkExX0NCQSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCX0KKwlDU19EQkdPVVQoQ1NfUEFSTVMgfCBDU19GVU5DVElPTiwgOSwgCisJCXByaW50aygiY3M0Nnh4OiBjc19nZXRfZG1hX2FkZHIoKSAlZFxuIixvZmZzZXQpICk7CisJb2Zmc2V0ID0gKHUzMilidXNfdG9fdmlydCgodW5zaWduZWQgbG9uZylvZmZzZXQpIC0gKHUzMilkbWFidWYtPnJhd2J1ZjsKKwlDU19EQkdPVVQoQ1NfUEFSTVMgfCBDU19GVU5DVElPTiwgOCwgCisJCXByaW50aygiY3M0Nnh4OiBjc19nZXRfZG1hX2FkZHIoKS0gJWRcbiIsb2Zmc2V0KSApOworCXJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3luY19kbWFfcHRycyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwkKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiByZXN5bmNfZG1hX3B0cnMoKSsgXG4iKSApOworCWlmKHN0YXRlKQorCXsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCWRtYWJ1Zi0+aHdwdHI9ZG1hYnVmLT5zd3B0ciA9IDA7CisJCWRtYWJ1Zi0+cHJpbmdidWYgPSAwOworCX0KKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiByZXN5bmNfZG1hX3B0cnMoKS0gXG4iKSApOworfQorCQorLyogU3RvcCByZWNvcmRpbmcgKGxvY2sgaGVsZCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3BfYWRjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCQorCWRtYWJ1Zi0+ZW5hYmxlICY9IH5BRENfUlVOTklORzsKKwkKKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7CisJdG1wICY9IDB4RkZGRjAwMDA7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCApOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdG9wX2FkYygpKyBcbiIpICk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJX19zdG9wX2FkYyhzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdG9wX2FkYygpLSBcbiIpICk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSAmJiAKKwkgICAgICgoZG1hYnVmLT5tYXBwZWQgfHwgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpZG1hYnVmLT5kbWFzaXplKSAKKwkgICAgICAgJiYgZG1hYnVmLT5yZWFkeSkgJiYgCisJICAgICAgICgoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgfHwgCisJICAgICAgICAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fUkVTVU1FRCkpICkKKwl7CisJCWRtYWJ1Zi0+ZW5hYmxlIHw9IEFEQ19SVU5OSU5HOworCQljc19zZXRfZGl2aXNvcihkbWFidWYpOworCQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7CisJCXRtcCAmPSAweEZGRkYwMDAwOworCQl0bXAgfD0gY2FyZC0+Y2N0bDsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoCisJCQkiY3M0Nnh4OiBzdGFydF9hZGMoKSBwb2tlIDB4JXggXG4iLHRtcCkgKTsKKwkJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyogc3RvcCBwbGF5YmFjayAobG9jayBoZWxkKSAqLworc3RhdGljIGlubGluZSB2b2lkIF9fc3RvcF9kYWMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7CisJCisJdG1wPWNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKKwl0bXAmPTB4RkZGRjsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wKTsKK30KKworc3RhdGljIHZvaWQgc3RvcF9kYWMoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RvcF9kYWMoKSsgXG4iKSApOworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RvcF9kYWMoc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogc3RvcF9kYWMoKS0gXG4iKSApOworfQkKKworc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB0bXA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBzdGFydF9kYWMoKSsgXG4iKSApOworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJaWYgKCEoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgJiYgCisJICAgICgoZG1hYnVmLT5tYXBwZWQgfHwgZG1hYnVmLT5jb3VudCA+IDApICYmIGRtYWJ1Zi0+cmVhZHkpICYmCisJICAgICAgICgoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkgfHwgCisJICAgICAgICAoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fUkVTVU1FRCkpICkKKwl7CisJCWRtYWJ1Zi0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOworCQl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7CisJCXRtcCAmPSAweEZGRkY7CisJCXRtcCB8PSBjYXJkLT5wY3RsOworCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDYsIHByaW50aygKKwkJICAgICJjczQ2eHg6IHN0YXJ0X2RhYygpIHBva2UgY2FyZD0lcCB0bXA9MHglLjA4eCBhZGRyPSVwIFxuIiwKKwkJICAgIGNhcmQsICh1bnNpZ25lZCl0bXAsIAorCQkgICAgY2FyZC0+YmExLmlkeFsoQkExX1BDVEwgPj4gMTYpICYgM10rKEJBMV9QQ1RMJjB4ZmZmZikgKSApOworCQljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IHN0YXJ0X2RhYygpLSBcbiIpICk7Cit9CisKKyNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKKworLyoKKyAqIGFsbG9jYXRlIERNQSBidWZmZXIsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgYnVmZmVycyBhcmUgc2VwYXJhdGUuCisgKi8KK3N0YXRpYyBpbnQgYWxsb2NfZG1hYnVmKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCit7CisKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1zdGF0ZS0+Y2FyZDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl2b2lkICpyYXdidWYgPSBOVUxMOworCXZvaWQgKnRtcGJ1ZmYgPSBOVUxMOworCWludCBvcmRlcjsKKwlzdHJ1Y3QgcGFnZSAqbWFwLCAqbWFwZW5kOworCXVuc2lnbmVkIGxvbmcgZGY7CisJCisJZG1hYnVmLT5yZWFkeSAgPSBkbWFidWYtPm1hcHBlZCA9IDA7CisJZG1hYnVmLT5TR29rID0gMDsKKy8qCisqIGNoZWNrIGZvciBvcmRlciB3aXRoaW4gbGltaXRzLCBidXQgZG8gbm90IG92ZXJ3cml0ZSB2YWx1ZS4KKyovCisJaWYoKGRlZmF1bHRvcmRlciA+IDEpICYmIChkZWZhdWx0b3JkZXIgPCAxMikpCisJCWRmID0gZGVmYXVsdG9yZGVyOworCWVsc2UKKwkJZGYgPSAyOwkKKworCWZvciAob3JkZXIgPSBkZjsgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKQorCQlpZiAoIChyYXdidWYgPSAodm9pZCAqKSBwY2lfYWxsb2NfY29uc2lzdGVudCgKKwkJCWNhcmQtPnBjaV9kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRtYWJ1Zi0+ZG1hYWRkcikpKQorCQkJICAgIGJyZWFrOworCWlmICghcmF3YnVmKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkiY3M0Nnh4OiBhbGxvY19kbWFidWYoKTogdW5hYmxlIHRvIGFsbG9jYXRlIHJhd2J1ZlxuIikpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJZG1hYnVmLT5idWZvcmRlciA9IG9yZGVyOworCWRtYWJ1Zi0+cmF3YnVmID0gcmF3YnVmOworCS8vIE5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlIHRoZSAKKwkvLyByZW1hcF9wZm5fcmFuZ2UoKSBpbiBjczQ2eHhfbW1hcCBkb2Vzbid0IHdvcmsuCisJLy8gMS4gZ2V0IGluZGV4IHRvIGxhc3QgcGFnZSBpbiBtZW1fbWFwIGFycmF5IGZvciByYXdidWYuCisJbWFwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmICsgCisJCShQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKKworCS8vIDIuIG1hcmsgZWFjaCBwaHlzaWNhbCBwYWdlIGluIHJhbmdlIGFzICdyZXNlcnZlZCcuCisJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKKwkJY3M0eF9tZW1fbWFwX3Jlc2VydmUobWFwKTsKKworCUNTX0RCR09VVChDU19QQVJNUywgOSwgcHJpbnRrKCJjczQ2eHg6IGFsbG9jX2RtYWJ1ZigpOiBhbGxvY2F0ZWQgJWxkIChvcmRlciA9ICVkKSBieXRlcyBhdCAlcFxuIiwKKwkgICAgICAgUEFHRV9TSVpFIDw8IG9yZGVyLCBvcmRlciwgcmF3YnVmKSApOworCisvKgorKiAgb25seSBhbGxvY2F0ZSB0aGUgY29udmVyc2lvbiBidWZmZXIgZm9yIHRoZSBBREMKKyovCisJaWYoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKQorCXsKKwkJZG1hYnVmLT50bXBidWZmID0gTlVMTDsKKwkJZG1hYnVmLT5idWZvcmRlcl90bXBidWZmID0gMDsKKwkJcmV0dXJuIDA7CisJfQorLyoKKyAqIG5vdyB0aGUgdGVtcCBidWZmZXIgZm9yIDE2LzggY29udmVyc2lvbnMKKyAqLworCisJdG1wYnVmZiA9ICh2b2lkICopIHBjaV9hbGxvY19jb25zaXN0ZW50KAorCQljYXJkLT5wY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsICZkbWFidWYtPmRtYWFkZHJfdG1wYnVmZik7CisKKwlpZiAoIXRtcGJ1ZmYpCisJCXJldHVybiAtRU5PTUVNOworCUNTX0RCR09VVChDU19QQVJNUywgOSwgcHJpbnRrKCJjczQ2eHg6IGFsbG9jYXRlZCAlbGQgKG9yZGVyID0gJWQpIGJ5dGVzIGF0ICVwXG4iLAorCSAgICAgICBQQUdFX1NJWkUgPDwgb3JkZXIsIG9yZGVyLCB0bXBidWZmKSApOworCisJZG1hYnVmLT50bXBidWZmID0gdG1wYnVmZjsKKwlkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYgPSBvcmRlcjsKKwkKKwkvLyBOb3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSB0aGUgCisJLy8gcmVtYXBfcGZuX3JhbmdlKCkgaW4gY3M0Nnh4X21tYXAgZG9lc24ndCB3b3JrLgorCS8vIDEuIGdldCBpbmRleCB0byBsYXN0IHBhZ2UgaW4gbWVtX21hcCBhcnJheSBmb3IgcmF3YnVmLgorCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnRtcGJ1ZmYgKyAKKwkJKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYpIC0gMSk7CisKKwkvLyAyLiBtYXJrIGVhY2ggcGh5c2ljYWwgcGFnZSBpbiByYW5nZSBhcyAncmVzZXJ2ZWQnLgorCWZvciAobWFwID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+dG1wYnVmZik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQorCQljczR4X21lbV9tYXBfcmVzZXJ2ZShtYXApOworCXJldHVybiAwOworfQorCisvKiBmcmVlIERNQSBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IHBhZ2UgKm1hcCwgKm1hcGVuZDsKKworCWlmIChkbWFidWYtPnJhd2J1ZikgeworCQkvLyBVbmRvIHByb2dfZG1hYnVmKCkncyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAKKwkJbWFwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmICsgCisJCQkJKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1Zik7IG1hcCA8PSBtYXBlbmQ7IG1hcCsrKQorCQkJY3M0eF9tZW1fbWFwX3VucmVzZXJ2ZShtYXApOworCQlmcmVlX2RtYWJ1ZihzdGF0ZS0+Y2FyZCwgZG1hYnVmKTsKKwl9CisKKwlpZiAoZG1hYnVmLT50bXBidWZmKSB7CisJCS8vIFVuZG8gcHJvZ19kbWFidWYoKSdzIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkIAorCQltYXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT50bXBidWZmICsKKwkJCQkoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXJfdG1wYnVmZikgLSAxKTsKKwkJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT50bXBidWZmKTsgbWFwIDw9IG1hcGVuZDsgbWFwKyspCisJCQljczR4X21lbV9tYXBfdW5yZXNlcnZlKG1hcCk7CisJCWZyZWVfZG1hYnVmMihzdGF0ZS0+Y2FyZCwgZG1hYnVmKTsKKwl9CisKKwlkbWFidWYtPnJhd2J1ZiA9IE5VTEw7CisJZG1hYnVmLT50bXBidWZmID0gTlVMTDsKKwlkbWFidWYtPm1hcHBlZCA9IGRtYWJ1Zi0+cmVhZHkgPSAwOworCWRtYWJ1Zi0+U0dvayA9IDA7Cit9CisKK3N0YXRpYyBpbnQgX19wcm9nX2RtYWJ1ZihzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlKQoreworICAgICAgICBzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBhbGxvY2F0ZWRfcGFnZXMsIGFsbG9jYXRlZF9ieXRlczsgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgdW5zaWduZWQgbG9uZyB0bXAxLCB0bXAyLCBmbXQ9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIHVuc2lnbmVkIGxvbmcgKnB0bXAgPSAodW5zaWduZWQgbG9uZyAqKSBkbWFidWYtPnBidWY7ICAgICAgICAgICAgICAgCisgICAgICAgIHVuc2lnbmVkIGxvbmcgU0dhcnJheVs5XSwgblNHcGFnZXM9MDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIGludCByZXQ7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpKyBcbiIpKTsKKy8qCisgKiBjaGVjayBmb3IgQ0FQVFVSRSBhbmQgdXNlIG9ubHkgbm9uLXNnIGZvciBpbml0aWFsIHJlbGVhc2UKKyAqLworCWlmKGRtYWJ1Zi0+dHlwZSA9PSBDU19UWVBFX0FEQykKKwl7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCkgQURDXG4iKSk7CisJCS8qIAorCQkgKiBhZGQgaW4gbm9uLXNnIHN1cHBvcnQgZm9yIGNhcHR1cmUuCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkvKiBhZGQgY29kZSB0byByZXNldCB0aGUgcmF3YnVmIG1lbW9yeS4gVFJXICovCisJCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSBkbWFidWYtPmJsb2NrcyA9IDA7CisJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmVycm9yID0gZG1hYnVmLT51bmRlcnJ1biA9IDA7CisKKwkJZG1hYnVmLT5TR29rID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KKwkJaWYgKCFkbWFidWYtPnJhd2J1ZiB8fCAhZG1hYnVmLT50bXBidWZmKQorCQkJaWYgKChyZXQgPSBhbGxvY19kbWFidWYoc3RhdGUpKSkKKwkJCQlyZXR1cm4gcmV0OyAKKwkvKgorCSAqIHN0YXRpYyBpbWFnZSBvbmx5IHN1cHBvcnRzIDE2Qml0IHNpZ25lZCwgc3RlcmVvIC0gaGFyZCBjb2RlIGZtdAorCSAqLworCQlmbXQgPSBDU19GTVRfMTZCSVQgfCBDU19GTVRfU1RFUkVPOworCisJCWRtYWJ1Zi0+bnVtZnJhZyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlkbWFidWYtPmZyYWdzaXplID0gMjA0ODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IDIwNDggPj4gc2FtcGxlX3NoaWZ0W2ZtdF07ICAgIAorCQlkbWFidWYtPmRtYXNpemUgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZG1hYnVmLT5mcmFnc2hpZnQgPSAxMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKwkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZm10ICYgQ1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLAorCQkgICAgICAgZG1hYnVmLT5kbWFzaXplKTsKKyAgICAgICAgCW1lbXNldChkbWFidWYtPnRtcGJ1ZmYsIChmbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsIAorCQkJUEFHRV9TSVpFPDxkbWFidWYtPmJ1Zm9yZGVyX3RtcGJ1ZmYpOyAgICAgIAorCisJCS8qCisJCSAqICAgICAgTm93IHNldCB1cCB0aGUgcmluZworCQkgKi8KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJY3NfcmVjX3NldHVwKHN0YXRlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBzZXQgdGhlIHJlYWR5IGZsYWcgZm9yIHRoZSBkbWEgYnVmZmVyICovCisJCWRtYWJ1Zi0+cmVhZHkgPSAxOworCisJCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKAorCQkJImNzNDZ4eDogcHJvZ19kbWFidWYoKTogQ0FQVFVSRSByYXRlPSVkIGZtdD0weCV4IG51bWZyYWc9JWQgIgorCQkJImZyYWdzaXplPSVkIGRtYXNpemU9JWRcbiIsCisJCQkgICAgZG1hYnVmLT5yYXRlLCBkbWFidWYtPmZtdCwgZG1hYnVmLT5udW1mcmFnLAorCQkJICAgIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+ZG1hc2l6ZSkgKTsKKworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpLSAwIFxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJZWxzZSBpZiAoZG1hYnVmLT50eXBlID09IENTX1RZUEVfREFDKQorCXsKKwkvKgorCSAqIE11c3QgYmUgREFDCisJICovCisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IHByb2dfZG1hYnVmKCkgREFDXG4iKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXN5bmNfZG1hX3B0cnMoc3RhdGUpOworCQlkbWFidWYtPnRvdGFsX2J5dGVzID0gZG1hYnVmLT5ibG9ja3MgPSAwOworCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5lcnJvciA9IGRtYWJ1Zi0+dW5kZXJydW4gPSAwOworCisJCWRtYWJ1Zi0+U0dvayA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIGlmIG5vdCBhbGxvY2F0ZWQgeWV0ICovCisJCWlmICghZG1hYnVmLT5yYXdidWYpCisJCQlpZiAoKHJldCA9IGFsbG9jX2RtYWJ1ZihzdGF0ZSkpKQorCQkJCXJldHVybiByZXQ7CisKKwkJYWxsb2NhdGVkX3BhZ2VzID0gMSA8PCBkbWFidWYtPmJ1Zm9yZGVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJYWxsb2NhdGVkX2J5dGVzID0gYWxsb2NhdGVkX3BhZ2VzKlBBR0VfU0laRTsgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQkJCQkJCQkgICAgCisJCWlmKGFsbG9jYXRlZF9wYWdlcyA8IDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCXsKKwkJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKAorCQkJICAgICJjczQ2eHg6IHByb2dfZG1hYnVmKCkgRXJyb3I6IGFsbG9jYXRlZF9wYWdlcyB0b28gc21hbGwgKCVkKVxuIiwKKwkJCQkodW5zaWduZWQpYWxsb2NhdGVkX3BhZ2VzKSk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQkJCQkJCQkJCSAgICAKKwkJLyogVXNlIGFsbCB0aGUgcGFnZXMgYWxsb2NhdGVkLCBmcmFnc2l6ZSA0ay4gKi8KKwkJLyogVXNlICdwYnVmJyBmb3IgUy9HIHBhZ2UgbWFwIHRhYmxlLiAqLworCQlkbWFidWYtPlNHb2sgPSAxOyAgICAgICAgICAgLyogVXNlIFMvRy4gKi8KKworCQluU0dwYWdlcyA9IGFsbG9jYXRlZF9ieXRlcy80MDk2OyAgICAvKiBTL0cgcGFnZXMgYWx3YXlzIDRrLiAqLworCQkJCQkJCQkJCSAgICAKKwkJICAgICAvKiBTZXQgdXAgUy9HIHZhcmlhYmxlcy4gKi8KKwkJKnB0bXAgPSB2aXJ0X3RvX2J1cyhkbWFidWYtPnJhd2J1Zik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJKihwdG1wKzEpID0gMHgwMDAwMDAwODsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZm9yKHRtcDE9IDE7IHRtcDEgPCBuU0dwYWdlczsgdG1wMSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCSoocHRtcCsyKnRtcDEpID0gdmlydF90b19idXMoIChkbWFidWYtPnJhd2J1ZikrNDA5Nip0bXAxKTsgIAorCQkJaWYoIHRtcDEgPT0gblNHcGFnZXMtMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQkJdG1wMiA9IDB4YmZmZjAwMDA7CisJCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCQl0bXAyID0gMHg4MDAwMDAwMCs4Kih0bXAxKzEpOyAgICAgICAgICAgICAgICAgICAgICAgCisJCQkqKHB0bXArMip0bXAxKzEpID0gdG1wMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVswXSA9IDB4ODJjMDIwMGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVsxXSA9IDB4ZmZmZjAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVsyXSA9ICpwdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVszXSA9IDB4MDAwMTA2MDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVs0XSA9ICoocHRtcCsyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVs1XSA9IDB4ODAwMDAwMTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVs2XSA9ICpwdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVs3XSA9ICoocHRtcCsyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJU0dhcnJheVs4XSA9ICh2aXJ0X3RvX2J1cyhkbWFidWYtPnBidWYpICYgMHhmZmZmMDAwKSB8IDB4MTA7ICAgICAgICAKKworCQlpZiAoZG1hYnVmLT5TR29rKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJZG1hYnVmLT5udW1mcmFnID0gblNHcGFnZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlkbWFidWYtPmZyYWdzaXplID0gNDA5NjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSA0MDk2ID4+IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07ICAgIAorCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSAxMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcqNDA5NjsgICAgICAgICAgICAgICAgICAgICAKKwkJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCVNHYXJyYXlbMF0gPSAweGYyYzAwMDBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJU0dhcnJheVsxXSA9IDB4MDAwMDAyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJCQlTR2FycmF5WzJdID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCVNHYXJyYXlbM10gPSAweDAwMDEwNjAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJU0dhcnJheVs0XT1TR2FycmF5WzVdPVNHYXJyYXlbNl09U0dhcnJheVs3XT1TR2FycmF5WzhdID0gMDsgCisJCQlkbWFidWYtPm51bWZyYWcgPSAyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWRtYWJ1Zi0+ZnJhZ3NpemUgPSAyMDQ4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkJZG1hYnVmLT5mcmFnc2FtcGxlcyA9IDIwNDggPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsgICAgCisJCQlkbWFidWYtPmRtYXNpemUgPSA0MDk2OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKwkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0ID0gMTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCQl9CisJCWZvcih0bXAxID0gMDsgdG1wMSA8IHNpemVvZihTR2FycmF5KS80OyB0bXAxKyspICAgICAgICAgICAgICAgICAgICAgCisJCQljczQ2MXhfcG9rZSggc3RhdGUtPmNhcmQsIEJBMV9QRFRDK3RtcDEqNCwgU0dhcnJheVt0bXAxXSk7ICAKKworCQltZW1zZXQoZG1hYnVmLT5yYXdidWYsIChkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwKKwkJICAgICAgIGRtYWJ1Zi0+ZG1hc2l6ZSk7CisKKwkJLyoKKwkJICogICAgICBOb3cgc2V0IHVwIHRoZSByaW5nCisJCSAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQljc19wbGF5X3NldHVwKHN0YXRlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBzZXQgdGhlIHJlYWR5IGZsYWcgZm9yIHRoZSBkbWEgYnVmZmVyICovCisJCWRtYWJ1Zi0+cmVhZHkgPSAxOworCisJCUNTX0RCR09VVChDU19QQVJNUywgNCwgcHJpbnRrKAorCQkJImNzNDZ4eDogcHJvZ19kbWFidWYoKTogUExBWUJBQ0sgcmF0ZT0lZCBmbXQ9MHgleCBudW1mcmFnPSVkICIKKwkJCSJmcmFnc2l6ZT0lZCBkbWFzaXplPSVkXG4iLAorCQkJICAgIGRtYWJ1Zi0+cmF0ZSwgZG1hYnVmLT5mbXQsIGRtYWJ1Zi0+bnVtZnJhZywKKwkJCSAgICBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmRtYXNpemUpICk7CisKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogcHJvZ19kbWFidWYoKS0gXG4iKSk7CisJCXJldHVybiAwOworCX0KKwllbHNlCisJeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBwcm9nX2RtYWJ1ZigpLSBJbnZhbGlkIFR5cGUgJWRcbiIsCisJCQlkbWFidWYtPnR5cGUpKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGNzX3N0YXRlICpzdGF0ZSkKK3sKKwlpbnQgcmV0OworCQorCWRvd24oJnN0YXRlLT5zZW0pOworCXJldCA9IF9fcHJvZ19kbWFidWYoc3RhdGUpOworCXVwKCZzdGF0ZS0+c2VtKTsKKwkKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBjc19jbGVhcl90YWlsKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUpCit7Cit9CisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBjc19zdGF0ZSAqc3RhdGUsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1zdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgdG1vOworCWludCBjb3VudDsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGRyYWluX2RhYygpKyBcbiIpKTsKKwlpZiAoZG1hYnVmLT5tYXBwZWQgfHwgIWRtYWJ1Zi0+cmVhZHkpCisJeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50aygiY3M0Nnh4OiBkcmFpbl9kYWMoKS0gMCwgbm90IHJlYWR5XG4iKSk7CisJCXJldHVybiAwOworCX0KKworCWFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCS8qIEl0IHNlZW1zIHRoYXQgd2UgaGF2ZSB0byBzZXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8gVEFTS19JTlRFUlJVUFRJQkxFCisJCSAgIGV2ZXJ5IHRpbWUgdG8gbWFrZSB0aGUgcHJvY2VzcyByZWFsbHkgZ28gdG8gc2xlZXAgKi8KKwkJY3VycmVudC0+c3RhdGUgPSBUQVNLX0lOVEVSUlVQVElCTEU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCisJCWlmIChub25ibG9jaykgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisKKwkJdG1vID0gKGRtYWJ1Zi0+ZG1hc2l6ZSAqIEhaKSAvIGRtYWJ1Zi0+cmF0ZTsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOworCQl0bW8gKz0gKDIwNDgqSFopL2RtYWJ1Zi0+cmF0ZTsKKwkJCisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyB0bW8gOiAxKSAmJiB0bW8peworCQkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IGRyYWluX2RhYywgZG1hIHRpbWVvdXQ/ICVkXG4iLCBjb3VudCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCBwcmludGsoImNzNDZ4eDogZHJhaW5fZGFjKCktIC1FUkVTVEFSVFNZU1xuIikpOworCQkvKgorCQkqIHNldCB0byBzaWxlbmNlIGFuZCBsZXQgdGhhdCBjbGVhciB0aGUgZmlmb3MuCisJCSovCisJCWNzNDYxeF9jbGVhcl9zZXJpYWxfRklGT3MoY2FyZCwgQ1NfVFlQRV9EQUMpOworCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCX0KKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGRyYWluX2RhYygpLSAwXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogdXBkYXRlIGJ1ZmZlciBtYW5hbmdlbWVudCBwb2ludGVycywgZXNwZWNpYWxseSwgZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLworc3RhdGljIHZvaWQgY3NfdXBkYXRlX3B0cihzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHdha2UpCit7CisJc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJdW5zaWduZWQgaHdwdHI7CisJaW50IGRpZmY7CisKKwkvKiBlcnJvciBoYW5kbGluZyBhbmQgcHJvY2VzcyB3YWtlIHVwIGZvciBBREMgKi8KKwlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKKwlpZihzdGF0ZSkKKwl7CisJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykgeworCQkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KKwkJCWh3cHRyID0gY3NfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKKworCQkJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOworCQkJQ1NfREJHT1VUKENTX1BBUk1TLCA5LCBwcmludGsoCisJCQkJImNzNDZ4eDogY3NfdXBkYXRlX3B0cigpKyBBREMgaHdwdHI9JWQgZGlmZj0lZFxuIiwgCisJCQkJaHdwdHIsZGlmZikgKTsKKwkJCWRtYWJ1Zi0+aHdwdHIgPSBod3B0cjsKKwkJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKKwkJCWlmIChkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKQorCQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CisKKwkJCWlmKGRtYWJ1Zi0+bWFwcGVkKQorCQkJeworCQkJCWlmICh3YWtlICYmIGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZClkbWFidWYtPmZyYWdzaXplKQorCQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQkJfSBlbHNlIAorCQkJeworCQkJCWlmICh3YWtlICYmIGRtYWJ1Zi0+Y291bnQgPiAwKQorCQkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQkJfQorCQl9CisJfQorCisvKgorICogTm93IHRoZSBEQUMKKyAqLworCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCWlmKHN0YXRlKQorCXsKKwkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIERBQyAqLworCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgeworCQkJLyogdXBkYXRlIGhhcmR3YXJlIHBvaW50ZXIgKi8KKwkJCWh3cHRyID0gY3NfZ2V0X2RtYV9hZGRyKHN0YXRlKTsKKworCQkJZGlmZiA9IChkbWFidWYtPmRtYXNpemUgKyBod3B0ciAtIGRtYWJ1Zi0+aHdwdHIpICUgZG1hYnVmLT5kbWFzaXplOworCQkJQ1NfREJHT1VUKENTX1BBUk1TLCA5LCBwcmludGsoCisJCQkJImNzNDZ4eDogY3NfdXBkYXRlX3B0cigpKyBEQUMgaHdwdHI9JWQgZGlmZj0lZFxuIiwgCisJCQkJaHdwdHIsZGlmZikgKTsKKwkJCWRtYWJ1Zi0+aHdwdHIgPSBod3B0cjsKKwkJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJCWRtYWJ1Zi0+Y291bnQgKz0gZGlmZjsKKwkJCQlpZiAod2FrZSAmJiBkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwkJCQkvKgorCQkJCSAqIG90aGVyIGRyaXZlcnMgdXNlIGZyYWdzaXplLCBidXQgZG9uJ3Qgc2VlIGFueSBzZW5zZQorCQkJCSAqIGluIHRoYXQsIHNpbmNlIGRtYXNpemUgaXMgdGhlIGJ1ZmZlciBhc2tlZCBmb3IKKwkJCQkgKiB2aWEgbW1hcC4KKwkJCQkgKi8KKwkJCQlpZiggZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKKwkJCQkJZG1hYnVmLT5jb3VudCAmPSBkbWFidWYtPmRtYXNpemUtMTsKKwkJCX0gZWxzZSB7CisJCQkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCQkJCS8qCisJCQkJICogYmFja2ZpbGwgd2l0aCBzaWxlbmNlIGFuZCBjbGVhciBvdXQgdGhlIGxhc3QgCisJCQkJICogImRpZmYiIG51bWJlciBvZiBieXRlcy4KKwkJCQkgKi8KKwkJCQlpZihod3B0ciA+PSBkaWZmKQorCQkJCXsKKwkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgaHdwdHIgLSBkaWZmLCAKKwkJCQkJCShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgZGlmZik7CisJCQkJfQorCQkJCWVsc2UKKwkJCQl7CisJCQkJCW1lbXNldChkbWFidWYtPnJhd2J1ZiwgCisJCQkJCQkoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsCisJCQkJCQkodW5zaWduZWQpaHdwdHIpOworCQkJCQltZW1zZXQoKGNoYXIgKilkbWFidWYtPnJhd2J1ZiArIAorCQkJCQkJCWRtYWJ1Zi0+ZG1hc2l6ZSArIGh3cHRyIC0gZGlmZiwKKwkJCQkJCShkbWFidWYtPmZtdCAmIENTX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgCisJCQkJCQlkaWZmIC0gaHdwdHIpOyAKKwkJCQl9CisKKwkJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCQkJICAiY3M0Nnh4OiBFUlJPUiBEQUMgY291bnQ8MCBvciBjb3VudCA+IGRtYXNpemUgKCVkKVxuIiwKKwkJCQkJICAJZG1hYnVmLT5jb3VudCkpOworCQkJCQkvKiAKKwkJCQkJKiBidWZmZXIgdW5kZXJydW4gb3IgYnVmZmVyIG92ZXJydW4sIHJlc2V0IHRoZQorCQkJCQkqIGNvdW50IG9mIGJ5dGVzIHdyaXR0ZW4gYmFjayB0byAwLgorCQkJCQkqLworCQkJCQlpZihkbWFidWYtPmNvdW50IDwgMCkKKwkJCQkJCWRtYWJ1Zi0+dW5kZXJydW49MTsKKwkJCQkJZG1hYnVmLT5jb3VudCA9IDA7CisJCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKKwkJCQl9CisJCQkJaWYgKHdha2UgJiYgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpZG1hYnVmLT5kbWFzaXplLzIpCisJCQkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyogaG9sZCBzcGlubG9jayBmb3IgdGhlIGZvbGxvd2luZyEgKi8KK3N0YXRpYyB2b2lkIGNzX2hhbmRsZV9taWRpKHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworICAgICAgICB1bnNpZ25lZCBjaGFyIGNoOworICAgICAgICBpbnQgd2FrZTsKKyAgICAgICAgdW5zaWduZWQgdGVtcDE7CisKKyAgICAgICAgd2FrZSA9IDA7CisgICAgICAgIHdoaWxlICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsICBCQTBfTUlEU1IpICYgTUlEU1JfUkJFKSkgeworICAgICAgICAgICAgICAgIGNoID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX01JRFJQKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FyZC0+bWlkaS5pY250IDwgQ1NfTUlESUlOQlVGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlidWZbY2FyZC0+bWlkaS5pd3JdID0gY2g7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLT5taWRpLml3ciA9IChjYXJkLT5taWRpLml3ciArIDEpICUgQ1NfTUlESUlOQlVGOworICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pY250Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdha2UgPSAxOworICAgICAgICB9CisgICAgICAgIGlmICh3YWtlKQorICAgICAgICAgICAgICAgIHdha2VfdXAoJmNhcmQtPm1pZGkuaXdhaXQpOworICAgICAgICB3YWtlID0gMDsKKyAgICAgICAgd2hpbGUgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgIEJBMF9NSURTUikgJiBNSURTUl9UQkYpICYmIGNhcmQtPm1pZGkub2NudCA+IDApIHsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICggY2FyZC0+bWlkaS5vYnVmW2NhcmQtPm1pZGkub3JkXSApICYgMHgwMDAwMDBmZjsKKyAgICAgICAgICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEV1AsdGVtcDEpOworICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub3JkID0gKGNhcmQtPm1pZGkub3JkICsgMSkgJSBDU19NSURJT1VUQlVGOworICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkub2NudC0tOworICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLm9jbnQgPCBDU19NSURJT1VUQlVGLTE2KQorICAgICAgICAgICAgICAgICAgICAgICAgd2FrZSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdha2UpCisgICAgICAgICAgICAgICAgd2FrZV91cCgmY2FyZC0+bWlkaS5vd2FpdCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBjc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWRldl9pZDsKKwkvKiBTaW5nbGUgY2hhbm5lbCBjYXJkICovCisJc3RydWN0IGNzX3N0YXRlICpyZWNzdGF0ZSA9IGNhcmQtPmNoYW5uZWxbMF0uc3RhdGU7CisJc3RydWN0IGNzX3N0YXRlICpwbGF5c3RhdGUgPSBjYXJkLT5jaGFubmVsWzFdLnN0YXRlOworCXUzMiBzdGF0dXM7CisKKwlDU19EQkdPVVQoQ1NfSU5URVJSVVBULCA5LCBwcmludGsoImNzNDZ4eDogY3NfaW50ZXJydXB0KCkrIFxuIikpOworCisJc3Bpbl9sb2NrKCZjYXJkLT5sb2NrKTsKKworCXN0YXR1cyA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9ISVNSKTsKKwkKKwlpZiAoKHN0YXR1cyAmIDB4N2ZmZmZmZmYpID09IDApCisJeworCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfSElDUiwgSElDUl9DSEdNfEhJQ1JfSUVWKTsKKwkJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CS8qIE1pZ2h0IGJlIElSUV9OT05FLi4gKi8KKwl9CisJCisJLyoKKwkgKiBjaGVjayBmb3IgcGxheWJhY2sgb3IgY2FwdHVyZSBpbnRlcnJ1cHQgb25seQorCSAqLworCWlmKCAoKHN0YXR1cyAmIEhJU1JfVkMwKSAmJiBwbGF5c3RhdGUgJiYgcGxheXN0YXRlLT5kbWFidWYucmVhZHkpIHx8IAorCSAgICAoKChzdGF0dXMgJiBISVNSX1ZDMSkgJiYgcmVjc3RhdGUgJiYgcmVjc3RhdGUtPmRtYWJ1Zi5yZWFkeSkpICkKKwl7CisJCUNTX0RCR09VVChDU19JTlRFUlJVUFQsIDgsIHByaW50aygKKwkJCSJjczQ2eHg6IGNzX2ludGVycnVwdCgpIGludGVycnVwdCBiaXQocykgc2V0ICgweCV4KVxuIixzdGF0dXMpKTsKKwkJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19UUlVFKTsKKwl9CisKKyAgICAgICAgaWYoIHN0YXR1cyAmIEhJU1JfTUlESSApCisgICAgICAgICAgICAgICAgY3NfaGFuZGxlX21pZGkoY2FyZCk7CisJCisgCS8qIGNsZWFyICdlbSAqLworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9ISUNSLCBISUNSX0NIR018SElDUl9JRVYpOworCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKKwlDU19EQkdPVVQoQ1NfSU5URVJSVVBULCA5LCBwcmludGsoImNzNDZ4eDogY3NfaW50ZXJydXB0KCktIFxuIikpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHNzaXplX3QgY3NfbWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKyAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHNzaXplX3QgcmV0OworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICB1bnNpZ25lZCBwdHI7CisgICAgICAgIGludCBjbnQ7CisKKyAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKyAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgcHRyID0gY2FyZC0+bWlkaS5pcmQ7CisgICAgICAgICAgICAgICAgY250ID0gQ1NfTUlESUlOQlVGIC0gcHRyOworICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLmljbnQgPCBjbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBjbnQgPSBjYXJkLT5taWRpLmljbnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGlmIChjbnQgPiBjb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNudCA9IGNvdW50OworICAgICAgICAgICAgICAgIGlmIChjbnQgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPm1pZGkuaXdhaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBjYXJkLT5taWRpLmlidWYgKyBwdHIsIGNudCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0ID8gcmV0IDogLUVGQVVMVDsKKyAgICAgICAgICAgICAgICBwdHIgPSAocHRyICsgY250KSAlIENTX01JRElJTkJVRjsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaXJkID0gcHRyOworICAgICAgICAgICAgICAgIGNhcmQtPm1pZGkuaWNudCAtPSBjbnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGNvdW50IC09IGNudDsKKyAgICAgICAgICAgICAgICBidWZmZXIgKz0gY250OworICAgICAgICAgICAgICAgIHJldCArPSBjbnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCBjc19taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKyAgICAgICAgc3RydWN0IGNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisgICAgICAgIHNzaXplX3QgcmV0OworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICB1bnNpZ25lZCBwdHI7CisgICAgICAgIGludCBjbnQ7CisKKyAgICAgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworICAgICAgICByZXQgPSAwOworICAgICAgICB3aGlsZSAoY291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBwdHIgPSBjYXJkLT5taWRpLm93cjsKKyAgICAgICAgICAgICAgICBjbnQgPSBDU19NSURJT1VUQlVGIC0gcHRyOworICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLm9jbnQgKyBjbnQgPiBDU19NSURJT1VUQlVGKQorICAgICAgICAgICAgICAgICAgICAgICAgY250ID0gQ1NfTUlESU9VVEJVRiAtIGNhcmQtPm1pZGkub2NudDsKKyAgICAgICAgICAgICAgICBpZiAoY250IDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICBjc19oYW5kbGVfbWlkaShjYXJkKTsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKGNudCA+IGNvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgY250ID0gY291bnQ7CisgICAgICAgICAgICAgICAgaWYgKGNudCA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOworICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmY2FyZC0+bWlkaS5vd2FpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfZnJvbV91c2VyKGNhcmQtPm1pZGkub2J1ZiArIHB0ciwgYnVmZmVyLCBjbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgcHRyID0gKHB0ciArIGNudCkgJSBDU19NSURJT1VUQlVGOworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vd3IgPSBwdHI7CisgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vY250ICs9IGNudDsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgY291bnQgLT0gY250OworICAgICAgICAgICAgICAgIGJ1ZmZlciArPSBjbnQ7CisgICAgICAgICAgICAgICAgcmV0ICs9IGNudDsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIGNzX2hhbmRsZV9taWRpKGNhcmQpOworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3NfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisgICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKyAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9XUklURSkKKyAgICAgICAgICAgICAgICBwb2xsX3dhaXQoZmlsZSwgJmNhcmQtPm1pZGkub3dhaXQsIHdhaXQpOworICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1JFQUQpCisgICAgICAgICAgICAgICAgcG9sbF93YWl0KGZpbGUsICZjYXJkLT5taWRpLml3YWl0LCB3YWl0KTsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhcmQtPm1pZGkuaWNudCA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICBtYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgICAgIGlmIChjYXJkLT5taWRpLm9jbnQgPCBDU19NSURJT1VUQlVGKQorICAgICAgICAgICAgICAgICAgICAgICAgbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiBtYXNrOworfQorCisKK3N0YXRpYyBpbnQgY3NfbWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgICAgICB1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworICAgICAgICBzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1OVUxMOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQorCXsKKwkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKKwkJaWYgKGNhcmQtPmRldl9taWRpID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGVudHJ5ID09ICZjczQ2eHhfZGV2cykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFjYXJkKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDZ4eDogY3M0Nnh4X21pZGlfb3BlbigpOiBFcnJvciAtIHVuYWJsZSB0byBmaW5kIGNhcmQgc3RydWN0XG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworICAgICAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkOworICAgICAgICAvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKyAgICAgICAgZG93bigmY2FyZC0+bWlkaS5vcGVuX3NlbSk7CisgICAgICAgIHdoaWxlIChjYXJkLT5taWRpLm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworICAgICAgICAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworICAgICAgICAgICAgICAgICAgICAgICAgdXAoJmNhcmQtPm1pZGkub3Blbl9zZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXAoJmNhcmQtPm1pZGkub3Blbl9zZW0pOworICAgICAgICAgICAgICAgIGludGVycnVwdGlibGVfc2xlZXBfb24oJmNhcmQtPm1pZGkub3Blbl93YWl0KTsKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgIGRvd24oJmNhcmQtPm1pZGkub3Blbl9zZW0pOworICAgICAgICB9CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKCEoY2FyZC0+bWlkaS5vcGVuX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkpIHsKKyAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlyZCA9IGNhcmQtPm1pZGkuaXdyID0gY2FyZC0+bWlkaS5pY250ID0gMDsKKyAgICAgICAgICAgICAgICBjYXJkLT5taWRpLm9yZCA9IGNhcmQtPm1pZGkub3dyID0gY2FyZC0+bWlkaS5vY250ID0gMDsKKyAgICAgICAgICAgICAgICBjYXJkLT5taWRpLmlyZCA9IGNhcmQtPm1pZGkuaXdyID0gY2FyZC0+bWlkaS5pY250ID0gMDsKKyAgICAgICAgICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIDB4MDAwMDAwMGYpOyAgICAgICAgICAgIC8qIEVuYWJsZSB4bWl0LCByY3YuICovCisgICAgICAgICAgICAgICAgY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0hJQ1IsIEhJQ1JfSUVWIHwgSElDUl9DSEdNKTsgICAvKiBFbmFibGUgaW50ZXJydXB0cyAqLworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5pcmQgPSBjYXJkLT5taWRpLml3ciA9IGNhcmQtPm1pZGkuaWNudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgICAgICAgICAgY2FyZC0+bWlkaS5vcmQgPSBjYXJkLT5taWRpLm93ciA9IGNhcmQtPm1pZGkub2NudCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bWlkaS5sb2NrLCBmbGFncyk7CisgICAgICAgIGNhcmQtPm1pZGkub3Blbl9tb2RlIHw9IChmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSk7CisgICAgICAgIHVwKCZjYXJkLT5taWRpLm9wZW5fc2VtKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBjc19taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgICAgIHN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgICAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgdW5zaWduZWQgY291bnQsIHRtbzsKKworICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKyAgICAgICAgICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmY2FyZC0+bWlkaS5vd2FpdCwgJndhaXQpOworICAgICAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5taWRpLmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ID0gY2FyZC0+bWlkaS5vY250OworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bWlkaS5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorICAgICAgICAgICAgICAgICAgICAgICAgCWJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgdG1vID0gKGNvdW50ICogSFopIC8gMzEwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyA6IDEpICYmIHRtbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fREVCVUcgImNzNDZ4eDogbWlkaSB0aW1lZCBvdXQ/P1xuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZjYXJkLT5taWRpLm93YWl0LCAmd2FpdCk7CisgICAgICAgICAgICAgICAgY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisgICAgICAgIH0KKyAgICAgICAgZG93bigmY2FyZC0+bWlkaS5vcGVuX3NlbSk7CisgICAgICAgIGNhcmQtPm1pZGkub3Blbl9tb2RlICY9ICh+KGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKSk7CisgICAgICAgIHVwKCZjYXJkLT5taWRpLm9wZW5fc2VtKTsKKyAgICAgICAgd2FrZV91cCgmY2FyZC0+bWlkaS5vcGVuX3dhaXQpOworICAgICAgICByZXR1cm4gMDsKK30KKworLyoKKyAqICAgTWlkaSBmaWxlIG9wZXJhdGlvbnMgc3RydWN0LgorICovCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY3NfbWlkaV9mb3BzID0geworCUNTX09XTkVSCUNTX1RISVNfTU9EVUxFCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gY3NfbWlkaV9yZWFkLAorCS53cml0ZQkJPSBjc19taWRpX3dyaXRlLAorCS5wb2xsCQk9IGNzX21pZGlfcG9sbCwKKwkub3BlbgkJPSBjc19taWRpX29wZW4sCisJLnJlbGVhc2UJPSBjc19taWRpX3JlbGVhc2UsCit9OworCisvKgorICoKKyAqIENvcHlTYW1wbGVzIGNvcGllcyAxNi1iaXQgc3RlcmVvIHNpZ25lZCBzYW1wbGVzIGZyb20gdGhlIHNvdXJjZSB0byB0aGUKKyAqIGRlc3RpbmF0aW9uLCBwb3NzaWJseSBjb252ZXJ0aW5nIGRvd24gdG8gdW5zaWduZWQgOC1iaXQgYW5kL29yIG1vbm8uCisgKiBjb3VudCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBvdXRwdXQgYnl0ZXMgdG8gd3JpdGUuCisgKgorICogIEFyZ3VtZW50czoKKyAqCisgKiAgZHN0ICAgICAgICAgICAgIC0gUG9pbnRlciB0byBhIGRlc3RpbmF0aW9uIGJ1ZmZlci4KKyAqICBzcmMgICAgICAgICAgICAgLSBQb2ludGVyIHRvIGEgc291cmNlIGJ1ZmZlcgorICogIGNvdW50ICAgICAgICAgICAtIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weSBpbnRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIuCisgKiAgZm10ICAgICAgICAgICAgIC0gQ1NfRk1UXzE2QklUIGFuZC9vciBDU19GTVRfU1RFUkVPIGJpdHMKKyAqICBkbWFidWYgICAgICAgICAgLSBwb2ludGVyIHRvIHRoZSBkbWEgYnVmZmVyIHN0cnVjdHVyZQorICoKKyAqIE5PVEVTOiBvbmx5IGNhbGwgdGhpcyByb3V0aW5lIGlmIHRoZSBvdXRwdXQgZGVzaXJlZCBpcyBub3QgMTYgU2lnbmVkIFN0ZXJlbworICogCQorICoKKyAqLworc3RhdGljIHZvaWQgQ29weVNhbXBsZXMoY2hhciAqZHN0LCBjaGFyICpzcmMsIGludCBjb3VudCwgdW5zaWduZWQgZm10LCAKKwkJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmKQoreworCisgICAgczMyIHMzMkF1ZGlvU2FtcGxlOworICAgIHMxNiAqcHNTcmM9KHMxNiAqKXNyYzsKKyAgICBzMTYgKnBzRHN0PShzMTYgKilkc3Q7CisgICAgdTggKnB1Y0RzdD0odTggKilkc3Q7CisKKyAgICBDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogQ29weVNhbXBsZXMoKSsgIikgKTsKKyAgICBDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPCisJIiBkc3Q9JXAgc3JjPSVwIGNvdW50PSVkIGZtdD0weCV4XG4iLAorCWRzdCxzcmMsY291bnQsZm10KSApOworCisgICAgLyoKKyAgICAgKiBTZWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhcyA4LWJpdCB1bnNpZ25lZCBzdGVyZW8uCisgICAgICovCisgICAgaWYoKGZtdCAmIENTX0ZNVF9TVEVSRU8pICYmICEoZm10ICYgQ1NfRk1UXzE2QklUKSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZWFjaCAxNi1iaXQgc2lnbmVkIHN0ZXJlbyBzYW1wbGUgdG8gOC1iaXQgdW5zaWduZWQgCisJICogc3RlcmVvIHVzaW5nIHJvdW5kaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHNTcmMgPSAoczE2ICopc3JjOworCWNvdW50ID0gY291bnQvMjsKKyAgICAgICAgd2hpbGUoY291bnQtLSkKKyAgICAgICAgeworICAgICAgICAgICAgKihwdWNEc3QrKykgPSAodTgpKCgoczE2KSgqcHNTcmMrKykgKyAoczE2KTB4ODAwMCkgPj4gOCk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBTZWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhdCA4LWJpdCB1bnNpZ25lZCBtb25vLgorICAgICAqLworICAgIGVsc2UgaWYoIShmbXQgJiBDU19GTVRfU1RFUkVPKSAmJiAhKGZtdCAmIENTX0ZNVF8xNkJJVCkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb252ZXJ0IGVhY2ggMTYtYml0IHNpZ25lZCBzdGVyZW8gc2FtcGxlIHRvIDgtYml0IHVuc2lnbmVkIAorCSAqIG1vbm8gdXNpbmcgYXZlcmFnaW5nIGFuZCByb3VuZGluZy4KKyAgICAgICAgICovCisgICAgICAgIHBzU3JjID0gKHMxNiAqKXNyYzsKKwljb3VudCA9IGNvdW50LzI7CisgICAgICAgIHdoaWxlKGNvdW50LS0pCisgICAgICAgIHsKKwkgICAgczMyQXVkaW9TYW1wbGUgPSAoKCpwc1NyYykrKCoocHNTcmMgKyAxKSkpLzIgKyAoczMyKTB4ODA7CisJICAgIGlmKHMzMkF1ZGlvU2FtcGxlID4gMHg3ZmZmKQorCSAgICAJczMyQXVkaW9TYW1wbGUgPSAweDdmZmY7CisgICAgICAgICAgICAqKHB1Y0RzdCsrKSA9ICh1OCkoKChzMTYpczMyQXVkaW9TYW1wbGUgKyAoczE2KTB4ODAwMCkgPj4gOCk7CisJICAgIHBzU3JjICs9IDI7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBTZWUgaWYgdGhlIGRhdGEgc2hvdWxkIGJlIG91dHB1dCBhdCAxNi1iaXQgc2lnbmVkIG1vbm8uCisgICAgICovCisgICAgZWxzZSBpZighKGZtdCAmIENTX0ZNVF9TVEVSRU8pICYmIChmbXQgJiBDU19GTVRfMTZCSVQpKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29udmVydCBlYWNoIDE2LWJpdCBzaWduZWQgc3RlcmVvIHNhbXBsZSB0byAxNi1iaXQgc2lnbmVkIAorCSAqIG1vbm8gdXNpbmcgYXZlcmFnaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHNTcmMgPSAoczE2ICopc3JjOworCWNvdW50ID0gY291bnQvMjsKKyAgICAgICAgd2hpbGUoY291bnQtLSkKKyAgICAgICAgeworICAgICAgICAgICAgKihwc0RzdCsrKSA9IChzMTYpKCgqcHNTcmMpKygqKHBzU3JjICsgMSkpKS8yOworCSAgICBwc1NyYyArPSAyOworICAgICAgICB9CisgICAgfQorfQorCisvKgorICogY3NfY29weV90b191c2VyKCkKKyAqIHJlcGxhY2VtZW50IGZvciB0aGUgc3RhbmRhcmQgY29weV90b191c2VyLCB0byBhbGxvdyBmb3IgYSBjb252ZXJzaW9uIGZyb20KKyAqIDE2IGJpdCB0byA4IGJpdCBhbmQgZnJvbSBzdGVyZW8gdG8gbW9ubywgaWYgdGhlIHJlY29yZCBjb252ZXJzaW9uIGlzIGFjdGl2ZS4gIAorICogVGhlIGN1cnJlbnQgQ1M0Nnh4L0NTNDI4MCBzdGF0aWMgaW1hZ2Ugb25seSByZWNvcmRzIGluIDE2Yml0IHVuc2lnbmVkIFN0ZXJlbywgCisgKiBzbyB3ZSBjb252ZXJ0IGZyb20gYW55IG9mIHRoZSBvdGhlciBmb3JtYXQgY29tYmluYXRpb25zLgorICovCitzdGF0aWMgdW5zaWduZWQgY3NfY29weV90b191c2VyKAorCXN0cnVjdCBjc19zdGF0ZSAqcywgCisJdm9pZCBfX3VzZXIgKmRlc3QsIAorCXZvaWQgKmh3c3JjLCAKKwl1bnNpZ25lZCBjbnQsIAorCXVuc2lnbmVkICpjb3BpZWQpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnMtPmRtYWJ1ZjsKKwl2b2lkICpzcmMgPSBod3NyYzsgIC8qIGRlZmF1bHQgdG8gdGhlIHN0YW5kYXJkIGRlc3RpbmF0aW9uIGJ1ZmZlciBhZGRyICovCisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDYsIHByaW50ayhLRVJOX0lORk8gCisJCSJjc19jb3B5X3RvX3VzZXIoKSsgZm10PTB4JXggY250PSVkIGRlc3Q9JXBcbiIsCisJCWRtYWJ1Zi0+Zm10LCh1bnNpZ25lZCljbnQsZGVzdCkgKTsKKworCWlmKGNudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkKKwl7CisJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKKwl9CisJaWYoIWNudCkKKwl7CisJCSpjb3BpZWQgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYoZG1hYnVmLT5kaXZpc29yICE9IDEpCisJeworCQlpZighZG1hYnVmLT50bXBidWZmKQorCQl7CisJCQkqY29waWVkID0gY250L2RtYWJ1Zi0+ZGl2aXNvcjsKKwkJCXJldHVybiAwOworCQl9CisKKwkJQ29weVNhbXBsZXMoKGNoYXIgKilkbWFidWYtPnRtcGJ1ZmYsIChjaGFyICopaHdzcmMsIGNudCwgCisJCQlkbWFidWYtPmZtdCwgZG1hYnVmKTsKKwkJc3JjID0gZG1hYnVmLT50bXBidWZmOworCQljbnQgPSBjbnQvZG1hYnVmLT5kaXZpc29yOworCX0KKyAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihkZXN0LCBzcmMsIGNudCkpCisJeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0VSUiAKKwkJCSJjczQ2eHg6IGNzX2NvcHlfdG9fdXNlcigpLSBmYXVsdCBkZXN0PSVwIHNyYz0lcCBjbnQ9JWRcbiIsCisJCQkJZGVzdCxzcmMsY250KSApOworCQkqY29waWVkID0gMDsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCSpjb3BpZWQgPSBjbnQ7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0Nnh4OiBjc19jb3B5X3RvX3VzZXIoKS0gY29waWVkIGJ5dGVzIGlzICVkIFxuIixjbnQpICk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGluIHRoaXMgbG9vcCwgZG1hYnVmLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyB3YWl0aW5nIHRvIGJlIGNvcGllZCB0bworICAgdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCBkcmFpbmVkIGJ5IHRoaXMgbG9vcC4gKi8KK3N0YXRpYyBzc2l6ZV90IGNzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwlzc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCXVuc2lnbmVkIGNvcGllZD0wOworCisJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCB8IENTX0ZVTkNUSU9OLCA0LCAKKwkJcHJpbnRrKCJjczQ2eHg6IGNzX3JlYWQoKSsgJXpkXG4iLGNvdW50KSApOworCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwlpZighc3RhdGUpCisJCXJldHVybiAtRU5PREVWOworCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCisJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCQorCWRvd24oJnN0YXRlLT5zZW0pOworCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gX19wcm9nX2RtYWJ1ZihzdGF0ZSkpKQorCQlnb3RvIG91dDI7CisKKwlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQl3aGlsZSghKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQorCQl7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYoIXJldCkgcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOworCQlpZiAoZG1hYnVmLT5jb3VudCA8IGNudCkKKwkJCWNudCA9IGRtYWJ1Zi0+Y291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY250ID4gKGNvdW50ICogZG1hYnVmLT5kaXZpc29yKSkKKwkJCWNudCA9IGNvdW50ICogZG1hYnVmLT5kaXZpc29yOworCQlpZiAoY250IDw9IDApIHsKKwkJCS8qIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCB3YWl0IGZvciBkYXRhIHRvIGJlCisJCQkgICByZWNvcmRlZCAqLworCQkJc3RhcnRfYWRjKHN0YXRlKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KSByZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gb3V0OworIAkJCX0KKwkJCXVwKCZzdGF0ZS0+c2VtKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZighcmV0KSByZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlkb3duKCZzdGF0ZS0+c2VtKTsKKwkJCWlmIChkbWFidWYtPm1hcHBlZCkgCisJCQl7CisJCQkJaWYoIXJldCkKKwkJCQkJcmV0ID0gLUVOWElPOworCQkJCWdvdG8gb3V0OworCQkJfQorIAkJCWNvbnRpbnVlOworCQl9CisKKwkJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJfcmVhZCgpIGNvcHlfdG8gY250PSVkIGNvdW50PSV6ZCAiLCBjbnQsY291bnQpICk7CisJCUNTX0RCR09VVChDU19XQVZFX1JFQUQsIDgsIHByaW50ayhLRVJOX0lORk8gCisJCQkiIC5kbWFzaXplPSVkIC5jb3VudD0lZCBidWZmZXI9JXAgcmV0PSV6ZFxuIiwKKwkJCWRtYWJ1Zi0+ZG1hc2l6ZSxkbWFidWYtPmNvdW50LGJ1ZmZlcixyZXQpICk7CisKKyAgICAgICAgICAgICAgICBpZiAoY3NfY29weV90b191c2VyKHN0YXRlLCBidWZmZXIsIAorCQkJKGNoYXIgKilkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBjbnQsICZjb3BpZWQpKQorCQl7CisJCQlpZiAoIXJldCkgcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisgICAgICAgICAgICAgICAgc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgZG1hYnVmLT5kbWFzaXplOworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgZG1hYnVmLT5zd3B0ciA9IHN3cHRyOworICAgICAgICAgICAgICAgIGRtYWJ1Zi0+Y291bnQgLT0gY250OworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBjb3VudCAtPSBjb3BpZWQ7CisgICAgICAgICAgICAgICAgYnVmZmVyICs9IGNvcGllZDsKKyAgICAgICAgICAgICAgICByZXQgKz0gY29waWVkOworICAgICAgICAgICAgICAgIHN0YXJ0X2FkYyhzdGF0ZSk7CisJfQorb3V0OgorCXJlbW92ZV93YWl0X3F1ZXVlKCZzdGF0ZS0+ZG1hYnVmLndhaXQsICZ3YWl0KTsKK291dDI6CisJdXAoJnN0YXRlLT5zZW0pOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCB8IENTX0ZVTkNUSU9OLCA0LCAKKwkJcHJpbnRrKCJjczQ2eHg6IGNzX3JlYWQoKS0gJXpkXG4iLHJldCkgKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyB0byBiZSBkbWEgdG8KKyAgIHRoZSBzb3VuZGNhcmQuICBpdCBpcyBkcmFpbmVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgZmlsbGVkIGJ5IHRoaXMgbG9vcC4gKi8KK3N0YXRpYyBzc2l6ZV90IGNzX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNzX3N0YXRlICpzdGF0ZTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCisJQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUgfCBDU19GVU5DVElPTiwgNCwKKwkJcHJpbnRrKCJjczQ2eHg6IGNzX3dyaXRlIGNhbGxlZCwgY291bnQgPSAlemRcbiIsIGNvdW50KSApOworCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwlpZighc3RhdGUpCisJCXJldHVybiAtRU5PREVWOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisKKwlkb3duKCZzdGF0ZS0+c2VtKTsKKwlpZiAoZG1hYnVmLT5tYXBwZWQpCisJeworCQlyZXQgPSAtRU5YSU87CisJCWdvdG8gb3V0OworCX0KKworCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gX19wcm9nX2RtYWJ1ZihzdGF0ZSkpKQorCQlnb3RvIG91dDsKKwlhZGRfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7CisJcmV0ID0gMDsKKy8qCisqIFN0YXJ0IHRoZSBsb29wIHRvIHJlYWQgZnJvbSB0aGUgdXNlcidzIGJ1ZmZlciBhbmQgd3JpdGUgdG8gdGhlIGRtYSBidWZmZXIuCisqIGNoZWNrIGZvciBQTSBldmVudHMgYW5kIHVuZGVycnVuL292ZXJydW4gaW4gdGhlIGxvb3AuCisqLworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJd2hpbGUoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKKwkJeworCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmKCFyZXQpIHJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CisJCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gc2xlZXBfb25fdGltZW91dCwKKwkJCSAgIHJlc3luYyBod3B0ciBhbmQgc3dwdHIgKi8KKwkJCWRtYWJ1Zi0+Y291bnQgPSAwOworCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCX0KKwkJaWYgKGRtYWJ1Zi0+dW5kZXJydW4pCisJCXsKKwkJCWRtYWJ1Zi0+dW5kZXJydW4gPSAwOworCQkJZG1hYnVmLT5od3B0ciA9IGNzX2dldF9kbWFfYWRkcihzdGF0ZSk7CisJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwkJfQorCisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisJCWlmIChkbWFidWYtPmNvdW50ICsgY250ID4gZG1hYnVmLT5kbWFzaXplKQorCQkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kIHdhaXQgZm9yIGRhdGEgdG8gYmUKKwkJCSAgIHBsYXllZCAqLworCQkJc3RhcnRfZGFjKHN0YXRlKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KSByZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gb3V0OworIAkJCX0KKwkJCXVwKCZzdGF0ZS0+c2VtKTsKKwkJCXNjaGVkdWxlKCk7CisgCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYoIXJldCkgcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0OworIAkJCX0KKwkJCWRvd24oJnN0YXRlLT5zZW0pOworCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQkJeworCQkJCWlmKCFyZXQpCisJCQkJCXJldCA9IC1FTlhJTzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKyAJCQljb250aW51ZTsKKyAJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgY250KSkgeworCQkJaWYgKCFyZXQpIHJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgZG1hYnVmLT5kbWFzaXplOworCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CisJCWRtYWJ1Zi0+Y291bnQgKz0gY250OworCQlpZihkbWFidWYtPmNvdW50ID4gZG1hYnVmLT5kbWFzaXplKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSB8IENTX0VSUk9SLCAyLCBwcmludGsoCisJCQkgICAgImNzNDZ4eDogY3Nfd3JpdGUoKSBkLT5jb3VudCA+IGRtYXNpemUgLSByZXNldHRpbmdcbiIpKTsKKwkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CisJCX0KKwkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCXN0YXJ0X2RhYyhzdGF0ZSk7CisJfQorb3V0OgorCXVwKCZzdGF0ZS0+c2VtKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmc3RhdGUtPmRtYWJ1Zi53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCUNTX0RCR09VVChDU19XQVZFX1dSSVRFIHwgQ1NfRlVOQ1RJT04sIDIsIAorCQlwcmludGsoImNzNDZ4eDogY3Nfd3JpdGUoKS0gcmV0PSV6ZFxuIiwgcmV0KSApOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3NfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gKHN0cnVjdCBjc19jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOworCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19wb2xsKCkrIFxuIikpOworCWlmICghKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9XUklURSB8IEZNT0RFX1JFQUQpKSkKKwl7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJeworCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXTsKKwkJaWYoc3RhdGUpCisJCXsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCXsKKwkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07CisJCWlmKHN0YXRlKQorCQl7CisJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwkJfQorCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJY3NfdXBkYXRlX3B0cihjYXJkLCBDU19GQUxTRSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07CisJCWlmKHN0YXRlKQorCQl7CisJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0KKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCQlpZihzdGF0ZSkKKwkJeworCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlpZiAoZG1hYnVmLT5jb3VudCA+PSAoc2lnbmVkKWRtYWJ1Zi0+ZnJhZ3NpemUpCisJCQkJICAgIG1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCQl9IGVsc2UgeworCQkJCWlmICgoc2lnbmVkKWRtYWJ1Zi0+ZG1hc2l6ZSA+PSBkbWFidWYtPmNvdW50IAorCQkJCQkrIChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQkgICAgbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19wb2xsKCktICgweCV4KSBcbiIsCisJCW1hc2spKTsKKwlyZXR1cm4gbWFzazsKK30KKworLyoKKyAqCVdlIGxldCB1c2VycyBtbWFwIHRoZSByaW5nIGJ1ZmZlci4gSXRzIG5vdCB0aGUgcmVhbCBETUEgYnVmZmVyIGJ1dAorICoJdGhhdCBzaWRlIG9mIHRoZSBjb2RlIGlzIGhpZGRlbiBpbiB0aGUgSVJRIGhhbmRsaW5nLiBXZSBkbyBhIHNvZnR3YXJlCisgKgllbXVsYXRpb24gb2YgRE1BIGZyb20gYSA2NEsgb3Igc28gYnVmZmVyIGludG8gYSAySyBGSUZPLiAKKyAqCSh0aGUgaGFyZHdhcmUgcHJvYmFibHkgZGVzZXJ2ZXMgYSBtb2FuIGhlcmUgYnV0IENyeXN0YWwgc2VuZCBtZSBuaWNlCisgKgl0b3lzIDspKS4KKyAqLworIAorc3RhdGljIGludCBjc19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwlpbnQgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19QQVJNUywgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX21tYXAoKSsgZmlsZT0lcCAlcyAlc1xuIiwgCisJCWZpbGUsIHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSA/ICJWTV9XUklURSIgOiAiIiwKKwkJdm1hLT52bV9mbGFncyAmIFZNX1JFQUQgPyAiVk1fUkVBRCIgOiAiIikgKTsKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMV07CisJCWlmKHN0YXRlKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfT1BFTiwgMiwgcHJpbnRrKAorCQkJICAiY3M0Nnh4OiBjc19tbWFwKCkgVk1fV1JJVEUgLSBzdGF0ZSBUUlVFIHByb2dfZG1hYnVmIERBQ1xuIikgKTsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdOworCQlpZihzdGF0ZSkKKwkJeworCQkJQ1NfREJHT1VUKENTX09QRU4sIDIsIHByaW50aygKKwkJCSAgImNzNDZ4eDogY3NfbW1hcCgpIFZNX1JFQUQgLSBzdGF0ZSBUUlVFIHByb2dfZG1hYnVmIEFEQ1xuIikgKTsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSAhPSAwKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlDU19EQkdPVVQoQ1NfRVJST1IsIDIsIHByaW50aygKKwkJICAiY3M0Nnh4OiBjc19tbWFwKCkgcmV0dXJuIC1FSU5WQUxcbiIpICk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworLyoKKyAqIEZvciBub3cgT05MWSBzdXBwb3J0IHBsYXliYWNrLCBidXQgc2VlbXMgbGlrZSB0aGUgb25seSB3YXkgdG8gdXNlCisgKiBtbWFwKCkgaXMgdG8gb3BlbiBhbiBGRCB3aXRoIFJEV1IsIGp1c3QgcmVhZCBvciBqdXN0IHdyaXRlIGFjY2VzcworICogZG9lcyBub3QgZnVuY3Rpb24sIGdldCBhbiBlcnJvciBiYWNrIGZyb20gdGhlIGtlcm5lbC4KKyAqIEFsc28sIFF1YWtlSUlJIG9wZW5zIHdpdGggUkRXUiEgIFNvLCB0aGVyZSBtdXN0IGJlIHNvbWV0aGluZworICogdG8gbmVlZGluZyByZWFkL3dyaXRlIGFjY2VzcyBtYXBwaW5nLiAgU28sIGFsbG93IHJlYWQvd3JpdGUgYnV0IAorICogdXNlIHRoZSBEQUMgb25seS4KKyAqLworCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOyAgCisJaWYgKCFzdGF0ZSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlkb3duKCZzdGF0ZS0+c2VtKTsJCisJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJaWYgKGNzNHhfcGdvZmYodm1hKSAhPSAwKQorCXsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisKKwlDU19EQkdPVVQoQ1NfUEFSTVMsIDIsIHByaW50aygiY3M0Nnh4OiBjc19tbWFwKCk6IHNpemU9JWRcbiIsKHVuc2lnbmVkKXNpemUpICk7CisKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikpCisJeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZpcnRfdG9fcGh5cyhkbWFidWYtPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCXsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBvdXQ7CisJfQorCWRtYWJ1Zi0+bWFwcGVkID0gMTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX21tYXAoKS1cbiIpICk7CitvdXQ6CisJdXAoJnN0YXRlLT5zZW0pOworCXJldHVybiByZXQ7CQorfQorCitzdGF0aWMgaW50IGNzX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1Zj1OVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYXVkaW9fYnVmX2luZm8gYWJpbmZvOworCWNvdW50X2luZm8gY2luZm87CisJaW50IHZhbCwgdmFsc2F2ZSwgbWFwcGVkLCByZXQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJaWYoc3RhdGUpCisJeworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJbWFwcGVkID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIGRtYWJ1Zi0+bWFwcGVkOworCX0KKwlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJaWYoc3RhdGUpCisJeworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJbWFwcGVkIHw9IChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgZG1hYnVmLT5tYXBwZWQ7CisJfQorCQkKKyNpZiBDU0RFQlVHCisJcHJpbnRpb2N0bChjbWQpOworI2VuZGlmCisKKwlzd2l0Y2ggKGNtZCkgCisJeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJLyogRklYTUU6IHNwaW5fbG9jayA/ICovCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQkJaWYoc3RhdGUpCisJCQl7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJCXN5bmNocm9uaXplX2lycShjYXJkLT5pcnEpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOworCQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJCQlkbWFidWYtPmJsb2NrcyA9IDA7CisJCQkJZG1hYnVmLT5TR29rID0gMDsKKwkJCX0KKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQkJaWYoc3RhdGUpCisJCQl7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJCXN5bmNocm9uaXplX2lycShjYXJkLT5pcnEpOworCQkJCXJlc3luY19kbWFfcHRycyhzdGF0ZSk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHIgPSAwOworCQkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJCQlkbWFidWYtPmJsb2NrcyA9IDA7CisJCQkJZG1hYnVmLT5TR29rID0gMDsKKwkJCX0KKwkJfQorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfUkVTRVQoKS1cbiIpICk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6IC8qIHNldCBzYW1wbGUgcmF0ZSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQkJCWlmKHN0YXRlKQorCQkJCXsKKwkJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCWRtYWJ1Zi0+U0dvayA9IDA7CisJCQkJCWNzX3NldF9hZGNfcmF0ZShzdGF0ZSwgdmFsKTsKKwkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCQkJaWYoc3RhdGUpCisJCQkJeworCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQkJZG1hYnVmLT5TR29rID0gMDsKKwkJCQkJY3Nfc2V0X2RhY19yYXRlKHN0YXRlLCB2YWwpOworCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOworCQkJCX0KKwkJCX0KKwkJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoCisJCQkgICAgImNzNDZ4eDogY3NfaW9jdGwoKSBEU1BfU1BFRUQgJXMgJXMgJWRcbiIsCisJCQkJZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgPyAiREFDIiA6ICIiLAorCQkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiQURDIiA6ICIiLAorCQkJCWRtYWJ1Zi0+cmF0ZSApICk7CisJCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOiAvKiBzZXQgc3RlcmVvIG9yIG1vbm8gY2hhbm5lbCAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwkJCWlmKHN0YXRlKQorCQkJeworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQlkbWFidWYtPlNHb2sgPSAwOworCQkJCWlmKHZhbCkKKwkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKKwkJCQllbHNlCisJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOworCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKKwkJCQkgICAgImNzNDZ4eDogRFNQX1NURVJFTygpIERBQyAlc1xuIiwKKwkJCQkgICAgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPworCQkJCQkiU1RFUkVPIjoiTU9OTyIpICk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwkJCWlmKHN0YXRlKQorCQkJeworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQlkbWFidWYtPlNHb2sgPSAwOworCQkJCWlmKHZhbCkKKwkJCQkJZG1hYnVmLT5mbXQgfD0gQ1NfRk1UX1NURVJFTzsKKwkJCQllbHNlCisJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOworCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKKwkJCQkgICAgImNzNDZ4eDogRFNQX1NURVJFTygpIEFEQyAlc1xuIiwKKwkJCQkgICAgKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPworCQkJCQkiU1RFUkVPIjoiTU9OTyIpICk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCisJCQkJCXJldHVybiB2YWw7CisJCQkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+ZnJhZ3NpemUsIHApOworCQkJfQorCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCisJCQkJCXJldHVybiB2YWw7CisJCQkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+ZnJhZ3NpemUvZG1hYnVmLT5kaXZpc29yLCAKKwkJCQkJCXApOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCovCisJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSB8IEFGTVRfVTgsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0IHNhbXBsZSBmb3JtYXQgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50aygKKwkJICAgICJjczQ2eHg6IGNzX2lvY3RsKCkgRFNQX1NFVEZNVCAlcyAlcyAlcyAlc1xuIiwKKwkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFID8gIkRBQyIgOiAiIiwKKwkJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiQURDIiA6ICIiLAorCQkJdmFsID09IEFGTVRfUzE2X0xFID8gIjE2Qml0IFNpZ25lZCIgOiAiIiwKKwkJCXZhbCA9PSBBRk1UX1U4ID8gIjhCaXQgVW5zaWduZWQiIDogIiIpICk7CisJCXZhbHNhdmUgPSB2YWw7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYodmFsPT1BRk1UX1MxNl9MRSB8fCB2YWw9PUFGTVRfVTgpCisJCQl7CisJCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwkJCQkJaWYoc3RhdGUpCisJCQkJCXsKKwkJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCQlkbWFidWYtPlNHb2sgPSAwOworCQkJCQkJaWYodmFsPT1BRk1UX1MxNl9MRSkKKwkJCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfMTZCSVQ7CisJCQkJCQllbHNlCisJCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF8xNkJJVDsKKwkJCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7CisJCQkJCQlpZigocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKKwkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQl9CisJCQkJfQorCQkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJCXZhbCA9IHZhbHNhdmU7CisJCQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwkJCQkJaWYoc3RhdGUpCisJCQkJCXsKKwkJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCQlkbWFidWYtPlNHb2sgPSAwOworCQkJCQkJaWYodmFsPT1BRk1UX1MxNl9MRSkKKwkJCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfMTZCSVQ7CisJCQkJCQllbHNlCisJCQkJCQkJZG1hYnVmLT5mbXQgJj0gfkNTX0ZNVF8xNkJJVDsKKwkJCQkJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7CisJCQkJCQlpZigocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKKwkJCQkJCQlyZXR1cm4gcmV0OworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX0VSUk9SLCAyLCBwcmludGsoCisJCQkJICAgICJjczQ2eHg6IERTUF9TRVRGTVQoKSBVbnN1cHBvcnRlZCBmb3JtYXQgKDB4JXgpXG4iLAorCQkJCQl2YWxzYXZlKSApOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQl7CisJCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQkJCWlmKHN0YXRlKQorCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCX0KKwkJCWVsc2UgaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXsKKwkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCQkJaWYoc3RhdGUpCisJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJfQorCQl9CisJCWlmKGRtYWJ1ZikKKwkJeworCQkJaWYoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpCisJCQkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFLCBwKTsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9VOCwgcCk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwkJCQlpZihzdGF0ZSkKKwkJCQl7CisJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCQlkbWFidWYtPlNHb2sgPSAwOworCQkJCQlpZih2YWw+MSkKKwkJCQkJCWRtYWJ1Zi0+Zm10IHw9IENTX0ZNVF9TVEVSRU87CisJCQkJCWVsc2UKKwkJCQkJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfU1RFUkVPOworCQkJCQljc19zZXRfZGl2aXNvcihkbWFidWYpOworCQkJCQlpZiAocHJvZ19kbWFidWYoc3RhdGUpKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCQkJaWYoc3RhdGUpCisJCQkJeworCQkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQkJZG1hYnVmLT5TR29rID0gMDsKKwkJCQkJaWYodmFsPjEpCisJCQkJCQlkbWFidWYtPmZtdCB8PSBDU19GTVRfU1RFUkVPOworCQkJCQllbHNlCisJCQkJCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX1NURVJFTzsKKwkJCQkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKKwkJCQkJaWYgKHByb2dfZG1hYnVmKHN0YXRlKSkKKwkJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPyAyIDogMSwKKwkJCQlwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQkvKgorCQkgKiBUaGVyZSB3aWxsIGJlIGEgbG9uZ2VyIHRoYW4gbm9ybWFsIHBhdXNlIGluIHRoZSBkYXRhLgorCQkgKiBzby4uLiBkbyBub3RoaW5nLCBiZWNhdXNlIHRoZXJlIGlzIG5vdGhpbmcgdGhhdCB3ZSBjYW4gZG8uCisJCSAqLworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQkJaWYoc3RhdGUpCisJCQl7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJaWYgKGRtYWJ1Zi0+c3ViZGl2aXNpb24pCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIpCisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSB2YWw7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwkJCWlmKHN0YXRlKQorCQkJeworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCWlmIChkbWFidWYtPnN1YmRpdmlzaW9uKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gdmFsOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQkJaWYoc3RhdGUpCisJCQl7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJfQorCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCQlkbWFidWYtPm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQlpZihzdGF0ZSkKKwkJeworCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7CisJCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplOworCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CisJCS8qCisJCSAqIGZvciBtbWFwIHdlIGFsd2F5cyBoYXZlIHRvdGFsIHNwYWNlIGF2YWlsYWJsZQorCQkgKi8KKwkJCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJCQlhYmluZm8uYnl0ZXMgPSBkbWFidWYtPmRtYXNpemU7CisJCQllbHNlCisJCQkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKworCQkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCQl9CisJCXJldHVybiAtRU5PREVWOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQlpZihzdGF0ZSkKKwkJeworCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCWNzX3VwZGF0ZV9wdHIoY2FyZCwgQ1NfVFJVRSk7CisJCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplL2RtYWJ1Zi0+ZGl2aXNvcjsKKwkJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+Y291bnQvZG1hYnVmLT5kaXZpc29yOworCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CisJCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisJCX0KKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUV8RFNQX0NBUF9UUklHR0VSfERTUF9DQVBfTU1BUCwKKwkJCSAgICBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfR0VUVFJJR0dFUigpK1xuIikgKTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQl7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlpZihkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQkJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwkJCX0KKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJeworCQkJaWYoc3RhdGUpCisJCQl7CisJCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCWlmKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCisJCQkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJCX0KKwkJfQorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDIsIHByaW50aygiY3M0Nnh4OiBEU1BfR0VUVFJJR0dFUigpLSB2YWw9MHgleFxuIix2YWwpICk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHN0YXRlKSkpCisJCQkJCQlyZXR1cm4gcmV0OworCQkJCQlzdGFydF9hZGMoc3RhdGUpOworCQkJCX0gZWxzZQorCQkJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCQlpZihzdGF0ZSkKKwkJCXsKKwkJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSkpKQorCQkJCQkJcmV0dXJuIHJldDsKKwkJCQkJc3RhcnRfZGFjKHN0YXRlKTsKKwkJCQl9IGVsc2UKKwkJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1swXTsKKwkJaWYoc3RhdGUpCisJCXsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOworCQkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzL2RtYWJ1Zi0+ZGl2aXNvcjsKKwkJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQvZG1hYnVmLT5kaXZpc29yID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQkJY2luZm8ucHRyID0gZG1hYnVmLT5od3B0ci9kbWFidWYtPmRpdmlzb3I7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisJCX0KKwkJcmV0dXJuIC1FTk9ERVY7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwkJaWYoc3RhdGUpCisJCXsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOworCQkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOworCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQkJeworCQkJCWNpbmZvLmJsb2NrcyA9IChjaW5mby5ieXRlcyA+PiBkbWFidWYtPmZyYWdzaGlmdCkgCisJCQkJCQkJLSBkbWFidWYtPmJsb2NrczsKKwkJCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDgsIAorCQkJCQlwcmludGsoInRvdGFsX2J5dGVzPSVkIGJsb2Nrcz0lZCBkbWFidWYtPmJsb2Nrcz0lZFxuIiwgCisJCQkJCWNpbmZvLmJ5dGVzLGNpbmZvLmJsb2NrcyxkbWFidWYtPmJsb2NrcykgKTsKKwkJCQlkbWFidWYtPmJsb2NrcyA9IGNpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CisJCQl9CisJCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCisJCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50aygKKwkJCSAgICAiY3M0Nnh4OiBHRVRPUFRSIGJ5dGVzPSVkIGJsb2Nrcz0lZCBwdHI9JWRcbiIsCisJCQkJY2luZm8uYnl0ZXMsY2luZm8uYmxvY2tzLGNpbmZvLnB0cikgKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXN0YXRlID0gKHN0cnVjdCBjc19zdGF0ZSAqKWNhcmQtPnN0YXRlc1sxXTsKKwkJaWYoc3RhdGUpCisJCXsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQljc191cGRhdGVfcHRyKGNhcmQsIENTX1RSVUUpOworCQkJdmFsID0gZG1hYnVmLT5jb3VudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJZWxzZQorCQkJdmFsID0gMDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCWlmKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCWVsc2UgCisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCWlmKHN0YXRlKQorCQl7CisJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnJhdGUsIHApOworCQl9CisJCXJldHVybiBwdXRfdXNlcigwLCBwKTsKKwkJCisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlpZihmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzBdOworCQllbHNlIAorCQkJc3RhdGUgPSAoc3RydWN0IGNzX3N0YXRlICopY2FyZC0+c3RhdGVzWzFdOworCQlpZihzdGF0ZSkKKwkJeworCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQlyZXR1cm4gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgQ1NfRk1UX1NURVJFTykgPyAyIDogMSwKKwkJCQlwKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoMCwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCWlmKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMF07CisJCWVsc2UgCisJCQlzdGF0ZSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKiljYXJkLT5zdGF0ZXNbMV07CisJCWlmKHN0YXRlKQorCQl7CisJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCXJldHVybiBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBDU19GTVRfMTZCSVQpID8gCisJCQkgIAlBRk1UX1MxNl9MRSA6IEFGTVRfVTgsIHApOworCisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCisvKgorICoJQU1QIGNvbnRyb2wgLSBudWxsIEFNUAorICovCisgCitzdGF0aWMgdm9pZCBhbXBfbm9uZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKK3sJCit9CisKKy8qCisgKglDcnlzdGFsIEVBUEQgbW9kZQorICovCisgCitzdGF0aWMgdm9pZCBhbXBfdm95ZXRyYShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IGNoYW5nZSkKK3sKKwkvKiBNYW5hZ2UgdGhlIEVBUEQgYml0IG9uIHRoZSBDcnlzdGFsIDQyOTcgCisJICAgYW5kIHRoZSBBbmFsb2cgQUQxODg1ICovCisJICAgCisJaW50IG9sZD1jYXJkLT5hbXBsaWZpZXI7CisJCisJY2FyZC0+YW1wbGlmaWVyKz1jaGFuZ2U7CisJaWYoY2FyZC0+YW1wbGlmaWVyICYmICFvbGQpCisJeworCQkvKiBUdXJuIHRoZSBFQVBEIGFtcCBvbiAqLworCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCAgQUM5N19QT1dFUl9DT05UUk9MLCAKKwkJCWNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgfAorCQkJCTB4ODAwMCk7CisJfQorCWVsc2UgaWYob2xkICYmICFjYXJkLT5hbXBsaWZpZXIpCisJeworCQkvKiBUdXJuIHRoZSBFQVBEIGFtcCBvZmYgKi8KKwkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgIEFDOTdfUE9XRVJfQ09OVFJPTCwgCisJCQljc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYKKwkJCQl+MHg4MDAwKTsKKwl9Cit9CisKKwkJICAgICAgIAorLyoKKyAqCUdhbWUgVGhlYXRyZSBYUCBjYXJkIC0gRUdQSU9bMl0gaXMgdXNlZCB0byBlbmFibGUgdGhlIGV4dGVybmFsIGFtcC4KKyAqLworIAorc3RhdGljIHZvaWQgYW1wX2hlcmN1bGVzKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgY2hhbmdlKQoreworCWludCBvbGQ9Y2FyZC0+YW1wbGlmaWVyOworCWlmKCFjYXJkKQorCXsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPIAorCQkJImNzNDZ4eDogYW1wX2hlcmN1bGVzKCkgY2FsbGVkIGJlZm9yZSBpbml0aWFsaXplZC5cbiIpKTsKKwkJcmV0dXJuOworCX0KKwljYXJkLT5hbXBsaWZpZXIrPWNoYW5nZTsKKwlpZiggKGNhcmQtPmFtcGxpZmllciAmJiAhb2xkKSAmJiAhKGhlcmN1bGVzX2VncGlvX2Rpc2FibGUpKQorCXsKKwkJQ1NfREJHT1VUKENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPIAorCQkJImNzNDZ4eDogYW1wX2hlcmN1bGVzKCkgZXh0ZXJuYWwgYW1wIGVuYWJsZWRcbiIpKTsKKwkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0VHUElPRFIsIAorCQkJRUdQSU9EUl9HUE9FMik7ICAgICAvKiBlbmFibGUgRUdQSU8yIG91dHB1dCAqLworCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfRUdQSU9QVFIsIAorCQkJRUdQSU9QVFJfR1BQVDIpOyAgIC8qIG9wZW4tZHJhaW4gb24gb3V0cHV0ICovCisJfQorCWVsc2UgaWYob2xkICYmICFjYXJkLT5hbXBsaWZpZXIpCisJeworCQlDU19EQkdPVVQoQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8gCisJCQkiY3M0Nnh4OiBhbXBfaGVyY3VsZXMoKSBleHRlcm5hbCBhbXAgZGlzYWJsZWRcbiIpKTsKKwkJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX0VHUElPRFIsIDApOyAvKiBkaXNhYmxlICovCisJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9FR1BJT1BUUiwgMCk7IC8qIGRpc2FibGUgKi8KKwl9Cit9CisKKy8qCisgKglIYW5kbGUgdGhlIENMS1JVTiBvbiBhIHRoaW5rcGFkLiBXZSBtdXN0IGRpc2FibGUgQ0xLUlVOIHN1cHBvcnQKKyAqCXdoZW5ldmVyIHdlIG5lZWQgdG8gYmVhdCBvbiB0aGUgY2hpcC4KKyAqCisgKglUaGUgb3JpZ2luYWwgaWRlYSBhbmQgY29kZSBmb3IgdGhpcyBoYWNrIGNvbWVzIGZyb20gRGF2aWQgS2Fpc2VyIGF0CisgKglMaW51eGNhcmUuIFBlcmhhcHMgb25lIGRheSBDcnlzdGFsIHdpbGwgZG9jdW1lbnQgdGhlaXIgY2hpcHMgd2VsbAorICoJZW5vdWdoIHRvIG1ha2UgdGhlbSB1c2VmdWwuCisgKi8KKyAKK3N0YXRpYyB2b2lkIGNsa3J1bl9oYWNrKHN0cnVjdCBjc19jYXJkICpjYXJkLCBpbnQgY2hhbmdlKQoreworCXN0cnVjdCBwY2lfZGV2ICphY3BpX2RldjsKKwl1MTYgY29udHJvbDsKKwl1OCBwcDsKKwl1bnNpZ25lZCBsb25nIHBvcnQ7CisJaW50IG9sZD1jYXJkLT5hY3RpdmU7CisJCisJY2FyZC0+YWN0aXZlKz1jaGFuZ2U7CisJCisJYWNwaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjM3MUFCXzMsIE5VTEwpOworCWlmKGFjcGlfZGV2ID09IE5VTEwpCisJCXJldHVybjsJCS8qIE5vdCBhIHRoaW5rcGFkIHRoYXRzIGZvciBzdXJlICovCisKKwkvKiBGaW5kIHRoZSBjb250cm9sIHBvcnQgKi8JCQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKGFjcGlfZGV2LCAweDQxLCAmcHApOworCXBvcnQ9cHA8PDg7CisKKwkvKiBSZWFkIEFDUEkgcG9ydCAqLwkKKwljb250cm9sPWludyhwb3J0KzB4MTApOworCisJLyogRmxpcCBDTEtSVU4gb2ZmIHdoaWxlIHJ1bm5pbmcgKi8KKwlpZighY2FyZC0+YWN0aXZlICYmIG9sZCkKKwl7CisJCUNTX0RCR09VVChDU19QQVJNUyAsIDksIHByaW50ayggS0VSTl9JTkZPCisJCQkiY3M0Nnh4OiBjbGtydW4oKSBlbmFibGUgY2xrcnVuIC0gY2hhbmdlPSVkIGFjdGl2ZT0lZFxuIiwKKwkJCQljaGFuZ2UsY2FyZC0+YWN0aXZlKSk7CisJCW91dHcoY29udHJvbHwweDIwMDAsIHBvcnQrMHgxMCk7CisJfQorCWVsc2UgCisJeworCS8qCisJKiBzb21ldGltZXMgb24gYSByZXN1bWUgdGhlIGJpdCBpcyBzZXQsIHNvIGFsd2F5cyByZXNldCB0aGUgYml0LgorCSovCisJCUNTX0RCR09VVChDU19QQVJNUyAsIDksIHByaW50ayggS0VSTl9JTkZPCisJCQkiY3M0Nnh4OiBjbGtydW4oKSBkaXNhYmxlIGNsa3J1biAtIGNoYW5nZT0lZCBhY3RpdmU9JWRcbiIsCisJCQkJY2hhbmdlLGNhcmQtPmFjdGl2ZSkpOworCQlvdXR3KGNvbnRyb2wmfjB4MjAwMCwgcG9ydCsweDEwKTsKKwl9Cit9CisKKwkKK3N0YXRpYyBpbnQgY3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgY3NfY2FyZCAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgY3Nfc3RhdGUgKnN0YXRlID0gTlVMTDsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSBOVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworICAgICAgICB1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludCByZXQ9MDsKKwl1bnNpZ25lZCBpbnQgdG1wOworCisJQ1NfREJHT1VUKENTX09QRU4gfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX29wZW4oKSsgZmlsZT0lcCAlcyAlc1xuIiwKKwkJZmlsZSwgZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgPyAiRk1PREVfV1JJVEUiIDogIiIsCisJCWZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgPyAiRk1PREVfUkVBRCIgOiAiIikgKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykKKwl7CisJCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7CisKKwkJaWYgKCEoKGNhcmQtPmRldl9hdWRpbyBeIG1pbm9yKSAmIH4weGYpKQorCQkJYnJlYWs7CisJfQorCWlmIChlbnRyeSA9PSAmY3M0Nnh4X2RldnMpCisJCXJldHVybiAtRU5PREVWOworCWlmICghY2FyZCkgeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0Nnh4OiBjc19vcGVuKCk6IEVycm9yIC0gdW5hYmxlIHRvIGZpbmQgYXVkaW8gY2FyZCBzdHJ1Y3RcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyoKKwkgKiBoYXJkY29kZSBzdGF0ZVswXSBmb3IgY2FwdHVyZSwgWzFdIGZvciBwbGF5YmFjaworCSAqLworCWlmKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJeworCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCAyLCBwcmludGsoImNzNDZ4eDogY3Nfb3BlbigpIEZNT0RFX1JFQURcbiIpICk7CisJCWlmIChjYXJkLT5zdGF0ZXNbMF0gPT0gTlVMTCkgeworCQkJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF0gPSAoc3RydWN0IGNzX3N0YXRlICopCisJCQkJa21hbGxvYyhzaXplb2Yoc3RydWN0IGNzX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoc3RhdGUgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBjc19zdGF0ZSkpOworCQkJaW5pdF9NVVRFWCgmc3RhdGUtPnNlbSk7CisJCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJCWRtYWJ1Zi0+cGJ1ZiA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwgfCBHRlBfRE1BKTsKKwkJCWlmKGRtYWJ1Zi0+cGJ1Zj09TlVMTCkKKwkJCXsKKwkJCQlrZnJlZShzdGF0ZSk7CisJCQkJY2FyZC0+c3RhdGVzWzBdPU5VTEw7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1swXTsKKwkJCWlmKHN0YXRlLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKGNhcmQpOworCQkJCisJCWlmIChkbWFidWYtPmNoYW5uZWwgPT0gTlVMTCkgeworCQkJa2ZyZWUgKGNhcmQtPnN0YXRlc1swXSk7CisJCQljYXJkLT5zdGF0ZXNbMF0gPSBOVUxMOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQkvKiBOb3cgdHVybiBvbiBleHRlcm5hbCBBTVAgaWYgbmVlZGVkICovCisJCXN0YXRlLT5jYXJkID0gY2FyZDsKKwkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLDEpOworCQlzdGF0ZS0+Y2FyZC0+YW1wbGlmaWVyX2N0cmwoc3RhdGUtPmNhcmQsMSk7CisJCQorCQlpZiggKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX0FEQykpICkKKwkJeworCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCBvZiBBREMgZmFpbGVkICgweCV4KVxuIix0bXApICk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWRtYWJ1Zi0+Y2hhbm5lbC0+c3RhdGUgPSBzdGF0ZTsKKwkJLyogaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCBjaGFubmVsICovCisJCXN0YXRlLT52aXJ0ID0gMDsKKwkJc3RhdGUtPm1hZ2ljID0gQ1NfU1RBVEVfTUFHSUM7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7CisJCWluaXRfTVVURVgoJnN0YXRlLT5vcGVuX3NlbSk7CisJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQ7CisKKwkJZG93bigmc3RhdGUtPm9wZW5fc2VtKTsKKworCQkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgZm9ybWF0LiBBY2NvcmRpbmcgdG8gT1NTIFByb2dyYW1tZXIncyBHdWlkZSAgL2Rldi9kc3AKKwkJICAgc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kCisJCSAgIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLworCisJCS8qIERlZmF1bHQgaW5wdXQgaXMgOGJpdCBtb25vICovCisJCWRtYWJ1Zi0+Zm10ICY9IH5DU19GTVRfTUFTSzsKKwkJZG1hYnVmLT50eXBlID0gQ1NfVFlQRV9BREM7CisJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMDsKKwkJZG1hYnVmLT5vc3NtYXhmcmFncyAgPSAwOworCQlkbWFidWYtPnN1YmRpdmlzaW9uICA9IDA7CisJCWNzX3NldF9hZGNfcmF0ZShzdGF0ZSwgODAwMCk7CisJCWNzX3NldF9kaXZpc29yKGRtYWJ1Zik7CisKKwkJc3RhdGUtPm9wZW5fbW9kZSB8PSBGTU9ERV9SRUFEOworCQl1cCgmc3RhdGUtPm9wZW5fc2VtKTsKKwl9CisJaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJeworCQlDU19EQkdPVVQoQ1NfT1BFTiwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX29wZW4oKSBGTU9ERV9XUklURVxuIikgKTsKKwkJaWYgKGNhcmQtPnN0YXRlc1sxXSA9PSBOVUxMKSB7CisJCQlzdGF0ZSA9IGNhcmQtPnN0YXRlc1sxXSA9IChzdHJ1Y3QgY3Nfc3RhdGUgKikKKwkJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3Nfc3RhdGUpLCBHRlBfS0VSTkVMKTsKKwkJCWlmIChzdGF0ZSA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PTUVNOworCQkJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RydWN0IGNzX3N0YXRlKSk7CisJCQlpbml0X01VVEVYKCZzdGF0ZS0+c2VtKTsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJZG1hYnVmLT5wYnVmID0gKHZvaWQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCB8IEdGUF9ETUEpOworCQkJaWYoZG1hYnVmLT5wYnVmPT1OVUxMKQorCQkJeworCQkJCWtmcmVlKHN0YXRlKTsKKwkJCQljYXJkLT5zdGF0ZXNbMV09TlVMTDsKKwkJCQlyZXR1cm4gLUVOT01FTTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCQkJaWYoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCk7CisJCQkKKwkJaWYgKGRtYWJ1Zi0+Y2hhbm5lbCA9PSBOVUxMKSB7CisJCQlrZnJlZSAoY2FyZC0+c3RhdGVzWzFdKTsKKwkJCWNhcmQtPnN0YXRlc1sxXSA9IE5VTEw7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCS8qIE5vdyB0dXJuIG9uIGV4dGVybmFsIEFNUCBpZiBuZWVkZWQgKi8KKwkJc3RhdGUtPmNhcmQgPSBjYXJkOworCQlzdGF0ZS0+Y2FyZC0+YWN0aXZlX2N0cmwoc3RhdGUtPmNhcmQsMSk7CisJCXN0YXRlLT5jYXJkLT5hbXBsaWZpZXJfY3RybChzdGF0ZS0+Y2FyZCwxKTsKKworCQlpZiggKHRtcCA9IGNzNDZ4eF9wb3dlcnVwKGNhcmQsIENTX1BPV0VSX0RBQykpICkKKwkJeworCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCBvZiBEQUMgZmFpbGVkICgweCV4KVxuIix0bXApICk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQkKKwkJZG1hYnVmLT5jaGFubmVsLT5zdGF0ZSA9IHN0YXRlOworCQkvKiBpbml0aWFsaXplIHRoZSB2aXJ0dWFsIGNoYW5uZWwgKi8KKwkJc3RhdGUtPnZpcnQgPSAxOworCQlzdGF0ZS0+bWFnaWMgPSBDU19TVEFURV9NQUdJQzsKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmZG1hYnVmLT53YWl0KTsKKwkJaW5pdF9NVVRFWCgmc3RhdGUtPm9wZW5fc2VtKTsKKwkJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKworCQlkb3duKCZzdGF0ZS0+b3Blbl9zZW0pOworCisJCS8qIHNldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQuIEFjY29yZGluZyB0byBPU1MgUHJvZ3JhbW1lcidzIEd1aWRlICAvZGV2L2RzcAorCQkgICBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sIHdpdGggc2FtcGxlIHJhdGUgOGtIeiBhbmQKKwkJICAgL2Rldi9kc3BXIHdpbGwgYWNjZXB0IDE2LWJpdHMgc2FtcGxlICovCisKKwkJLyogRGVmYXVsdCBvdXRwdXQgaXMgOGJpdCBtb25vLiAqLworCQlkbWFidWYtPmZtdCAmPSB+Q1NfRk1UX01BU0s7CisJCWRtYWJ1Zi0+dHlwZSA9IENTX1RZUEVfREFDOworCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDA7CisJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgID0gMDsKKwkJZG1hYnVmLT5zdWJkaXZpc2lvbiAgPSAwOworCQljc19zZXRfZGFjX3JhdGUoc3RhdGUsIDgwMDApOworCQljc19zZXRfZGl2aXNvcihkbWFidWYpOworCisJCXN0YXRlLT5vcGVuX21vZGUgfD0gRk1PREVfV1JJVEU7CisJCXVwKCZzdGF0ZS0+b3Blbl9zZW0pOworCQlpZigocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUpKSkKKwkJCXJldHVybiByZXQ7CisJfQorCUNTX0RCR09VVChDU19PUEVOIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50aygiY3M0Nnh4OiBjc19vcGVuKCktIDBcbiIpICk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGNzX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOworCXN0cnVjdCBjc19zdGF0ZSAqc3RhdGU7CisJdW5zaWduZWQgaW50IHRtcDsKKwlDU19EQkdPVVQoQ1NfUkVMRUFTRSB8IENTX0ZVTkNUSU9OLCAyLCBwcmludGsoImNzNDZ4eDogY3NfcmVsZWFzZSgpKyBmaWxlPSVwICVzICVzXG4iLAorCQlmaWxlLCBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSA/ICJGTU9ERV9XUklURSIgOiAiIiwKKwkJZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCA/ICJGTU9ERV9SRUFEIiA6ICIiKSApOworCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpKQorCXsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXN0YXRlID0gY2FyZC0+c3RhdGVzWzFdOworCWlmKHN0YXRlKQorCXsKKwkJaWYgKCAoc3RhdGUtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKSAmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKSBGTU9ERV9XUklURVxuIikgKTsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJY3NfY2xlYXJfdGFpbChzdGF0ZSk7CisJCQlkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJCS8qIHN0b3AgRE1BIHN0YXRlIG1hY2hpbmUgYW5kIGZyZWUgRE1BIGJ1ZmZlcnMvY2hhbm5lbHMgKi8KKwkJCWRvd24oJnN0YXRlLT5vcGVuX3NlbSk7CisJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQlkZWFsbG9jX2RtYWJ1ZihzdGF0ZSk7CisJCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5jaGFubmVsLT5udW0pOworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXN0YXRlLT5kbWFidWYucGJ1Zik7CisKKwkJCS8qIHdlJ3JlIGNvdmVyZWQgYnkgdGhlIG9wZW5fc2VtICovCisJCQl1cCgmc3RhdGUtPm9wZW5fc2VtKTsKKwkJCXN0YXRlLT5jYXJkLT5zdGF0ZXNbc3RhdGUtPnZpcnRdID0gTlVMTDsKKwkJCXN0YXRlLT5vcGVuX21vZGUgJj0gKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCisJCQlpZiggKHRtcCA9IGNzNDYxeF9wb3dlcmRvd24oY2FyZCwgQ1NfUE9XRVJfREFDLCBDU19GQUxTRSApKSApCisJCQl7CisJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPIAorCQkJCQkiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpIHBvd2VyZG93biBEQUMgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOworCQkJfQorCisJCQkvKiBOb3cgdHVybiBvZmYgZXh0ZXJuYWwgQU1QIGlmIG5lZWRlZCAqLworCQkJc3RhdGUtPmNhcmQtPmFtcGxpZmllcl9jdHJsKHN0YXRlLT5jYXJkLCAtMSk7CisJCQlzdGF0ZS0+Y2FyZC0+YWN0aXZlX2N0cmwoc3RhdGUtPmNhcmQsIC0xKTsKKworCQkJa2ZyZWUoc3RhdGUpOworCQl9CisJfQorCisJc3RhdGUgPSBjYXJkLT5zdGF0ZXNbMF07CisJaWYoc3RhdGUpCisJeworCQlpZiAoIChzdGF0ZS0+b3Blbl9tb2RlICYgRk1PREVfUkVBRCkgJiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfUkVMRUFTRSwgMiwgcHJpbnRrKCJjczQ2eHg6IGNzX3JlbGVhc2UoKSBGTU9ERV9SRUFEXG4iKSApOworCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQlkb3duKCZzdGF0ZS0+b3Blbl9zZW0pOworCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJZGVhbGxvY19kbWFidWYoc3RhdGUpOworCQkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKKwkJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylzdGF0ZS0+ZG1hYnVmLnBidWYpOworCisJCQkvKiB3ZSdyZSBjb3ZlcmVkIGJ5IHRoZSBvcGVuX3NlbSAqLworCQkJdXAoJnN0YXRlLT5vcGVuX3NlbSk7CisJCQlzdGF0ZS0+Y2FyZC0+c3RhdGVzW3N0YXRlLT52aXJ0XSA9IE5VTEw7CisJCQlzdGF0ZS0+b3Blbl9tb2RlICY9ICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKworCQkJaWYoICh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0FEQywgQ1NfRkFMU0UgKSkgKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkJImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKSBwb3dlcmRvd24gQURDIGZhaWx1cmUgKDB4JXgpXG4iLHRtcCkgKTsKKwkJCX0KKworCQkJLyogTm93IHR1cm4gb2ZmIGV4dGVybmFsIEFNUCBpZiBuZWVkZWQgKi8KKwkJCXN0YXRlLT5jYXJkLT5hbXBsaWZpZXJfY3RybChzdGF0ZS0+Y2FyZCwgLTEpOworCQkJc3RhdGUtPmNhcmQtPmFjdGl2ZV9jdHJsKHN0YXRlLT5jYXJkLCAtMSk7CisKKwkJCWtmcmVlKHN0YXRlKTsKKwkJfQorCX0KKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDIsIHByaW50aygiY3M0Nnh4OiBjc19yZWxlYXNlKCktIDBcbiIpICk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50cG0oc3RydWN0IGNzX2NhcmQgKnMpCit7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInBtIHN0cnVjdDpcbiIpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiZmxhZ3M6MHgleCB1MzJDTEtDUjFfU0FWRTogMCV4IHUzMlNTUE1WYWx1ZTogMHgleFxuIiwKKwkJKHVuc2lnbmVkKXMtPnBtLmZsYWdzLHMtPnBtLnUzMkNMS0NSMV9TQVZFLHMtPnBtLnUzMlNTUE1WYWx1ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJQUExWQ3ZhbHVlOiAweCV4IHUzMlBQUlZDdmFsdWU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMlBQTFZDdmFsdWUscy0+cG0udTMyUFBSVkN2YWx1ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJGTUxWQ3ZhbHVlOiAweCV4IHUzMkZNUlZDdmFsdWU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkZNTFZDdmFsdWUscy0+cG0udTMyRk1SVkN2YWx1ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJHUElPUnZhbHVlOiAweCV4IHUzMkpTQ1RMdmFsdWU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkdQSU9SdmFsdWUscy0+cG0udTMySlNDVEx2YWx1ZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJTU0NSOiAweCV4IHUzMlNSQ1NBOiAweCV4XG4iLAorCQlzLT5wbS51MzJTU0NSLHMtPnBtLnUzMlNSQ1NBKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMkRhY0FTUjogMHgleCB1MzJBZGNBU1I6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkRhY0FTUixzLT5wbS51MzJBZGNBU1IpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyRGFjU1I6IDB4JXggdTMyQWRjU1I6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkRhY1NSLHMtPnBtLnUzMkFkY1NSKSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoInUzMk1JRENSX1NhdmU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMk1JRENSX1NhdmUpKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19wb3dlcmRvd246IDB4JXggX2dlbmVyYWxfcHVycG9zZSAweCV4XG4iLAorCQlzLT5wbS51MzJBQzk3X3Bvd2VyZG93bixzLT5wbS51MzJBQzk3X2dlbmVyYWxfcHVycG9zZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X21hc3Rlcl92b2x1bWU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X2hlYWRwaG9uZV92b2x1bWU6IDB4JXhcbiIsCisJCXMtPnBtLnUzMkFDOTdfaGVhZHBob25lX3ZvbHVtZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJ1MzJBQzk3X21hc3Rlcl92b2x1bWVfbW9ubzogMHgleFxuIiwKKwkJcy0+cG0udTMyQUM5N19tYXN0ZXJfdm9sdW1lX21vbm8pKTsKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygidTMyQUM5N19wY21fb3V0X3ZvbHVtZTogMHgleFxuIiwKKwkJcy0+cG0udTMyQUM5N19wY21fb3V0X3ZvbHVtZSkpOworCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJkbWFidWZfc3dwdHJfcGxheTogMHgleCBkbWFidWZfY291bnRfcGxheTogJWRcbiIsCisJCXMtPnBtLmRtYWJ1Zl9zd3B0cl9wbGF5LHMtPnBtLmRtYWJ1Zl9jb3VudF9wbGF5KSk7CisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImRtYWJ1Zl9zd3B0cl9jYXB0dXJlOiAweCV4IGRtYWJ1Zl9jb3VudF9jYXB0dXJlOiAlZFxuIiwKKwkJcy0+cG0uZG1hYnVmX3N3cHRyX2NhcHR1cmUscy0+cG0uZG1hYnVmX2NvdW50X2NhcHR1cmUpKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgU3VzcGVuZCAtIHNhdmUgdGhlIGFjOTcgcmVncywgbXV0ZSB0aGUgb3V0cHV0cyBhbmQgcG93ZXIgZG93biB0aGUgcGFydC4gIAorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNzNDZ4eF9hYzk3X3N1c3BlbmQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCit7CisJaW50IENvdW50LGk7CisJc3RydWN0IGFjOTdfY29kZWMgKmRldj1jYXJkLT5hYzk3X2NvZGVjWzBdOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlDU19EQkdPVVQoQ1NfUE0sIDksIHByaW50aygiY3M0Nnh4OiBjczQ2eHhfYWM5N19zdXNwZW5kKCkrXG4iKSk7CisKKwlpZihjYXJkLT5zdGF0ZXNbMV0pCisJeworCQlzdG9wX2RhYyhjYXJkLT5zdGF0ZXNbMV0pOworCQlyZXN5bmNfZG1hX3B0cnMoY2FyZC0+c3RhdGVzWzFdKTsKKwl9CisJaWYoY2FyZC0+c3RhdGVzWzBdKQorCXsKKwkJc3RvcF9hZGMoY2FyZC0+c3RhdGVzWzBdKTsKKwkJcmVzeW5jX2RtYV9wdHJzKGNhcmQtPnN0YXRlc1swXSk7CisJfQorCisJZm9yKENvdW50ID0gMHgyLCBpPTA7IChDb3VudCA8PSBDUzQ2WFhfQUM5N19ISUdIRVNUUkVHVE9SRVNUT1JFKQorCQkJJiYgKGkgPCBDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTKTsgCisJCUNvdW50ICs9IDIsIGkrKykKKwl7CisJCWNhcmQtPnBtLmFjOTdbaV0gPSBjc19hYzk3X2dldChkZXYsIEJBMF9BQzk3X1JFU0VUICsgQ291bnQpOworCX0KKy8qCisqIFNhdmUgdGhlIGFjOTcgdm9sdW1lIHJlZ2lzdGVycyBhcyB3ZWxsIGFzIHRoZSBjdXJyZW50IHBvd2VyZG93biBzdGF0ZS4KKyogTm93LCBtdXRlIHRoZSBhbGwgdGhlIG91dHB1dHMgKG1hc3RlciwgaGVhZHBob25lLCBhbmQgbW9ubyksIGFzIHdlbGwKKyogYXMgdGhlIFBDTSB2b2x1bWUsIGluIHByZXBhcmF0aW9uIGZvciBwb3dlcmluZyBkb3duIHRoZSBlbnRpcmUgcGFydC4KKwljYXJkLT5wbS51MzJBQzk3X21hc3Rlcl92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KCBkZXYsIAorCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUpOyAKKwljYXJkLT5wbS51MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCisJCQkodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSk7IAorCWNhcmQtPnBtLnUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vID0gKHUzMiljc19hYzk3X2dldChkZXYsIAorCQkJKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUVfTU9OTyk7IAorCWNhcmQtPnBtLnUzMkFDOTdfcGNtX291dF92b2x1bWUgPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgCisJCQkodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUpOworKi8gCisvKgorKiBtdXRlIHRoZSBvdXRwdXRzCisqLworCWNzX2FjOTdfc2V0KGRldiwgKHU4KUJBMF9BQzk3X01BU1RFUl9WT0xVTUUsIDB4ODAwMCk7CisJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfSEVBRFBIT05FX1ZPTFVNRSwgMHg4MDAwKTsKKwljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19NQVNURVJfVk9MVU1FX01PTk8sIDB4ODAwMCk7CisJY3NfYWM5N19zZXQoZGV2LCAodTgpQkEwX0FDOTdfUENNX09VVF9WT0xVTUUsIDB4ODAwMCk7CisKKy8qCisqIHNhdmUgdGhlIHJlZ2lzdGVycyB0aGF0IGNhdXNlIHBvcHMKKyovCisJY2FyZC0+cG0udTMyQUM5N19wb3dlcmRvd24gPSAodTMyKWNzX2FjOTdfZ2V0KGRldiwgKHU4KUFDOTdfUE9XRVJfQ09OVFJPTCk7IAorCWNhcmQtPnBtLnUzMkFDOTdfZ2VuZXJhbF9wdXJwb3NlID0gKHUzMiljc19hYzk3X2dldChkZXYsICh1OClCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UpOyAKKy8qCisqIEFuZCBwb3dlciBkb3duIGV2ZXJ5dGhpbmcgb24gdGhlIEFDOTcgY29kZWMuCisqIHdlbGwsIGZvciBub3csIG9ubHkgcG93ZXIgZG93biB0aGUgREFDL0FEQyBhbmQgTUlYRVIgVlJFRk9OIGNvbXBvbmVudHMuIAorKiB0cm91YmxlIHdpdGggcmVtb3ZpbmcgVlJFRi4KKyovCisJaWYoICh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8CisJCQlDU19QT1dFUl9NSVhWT04sIENTX1RSVUUgKSkgKQorCXsKKwkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJjczQ2eHg6IGNzNDZ4eF9hYzk3X3N1c3BlbmQoKSBmYWlsdXJlICgweCV4KVxuIix0bXApICk7CisJfQorCisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X2FjOTdfc3VzcGVuZCgpLVxuIikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgUmVzdW1lIC0gcG93ZXIgdXAgdGhlIHBhcnQgYW5kIHJlc3RvcmUgaXRzIHJlZ2lzdGVycy4uICAKKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBjczQ2eHhfYWM5N19yZXN1bWUoc3RydWN0IGNzX2NhcmQgKmNhcmQpCit7CisJaW50IENvdW50LGk7CisJc3RydWN0IGFjOTdfY29kZWMgKmRldj1jYXJkLT5hYzk3X2NvZGVjWzBdOworCisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoImNzNDZ4eDogY3M0Nnh4X2FjOTdfcmVzdW1lKCkrXG4iKSk7CisKKy8qCisqIEZpcnN0LCB3ZSByZXN0b3JlIHRoZSBzdGF0ZSBvZiB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyLiAgVGhpcworKiBjb250YWlucyB0aGUgbWljIHNlbGVjdCAobWljMSBvciBtaWMyKSBhbmQgaWYgd2UgcmVzdG9yZSB0aGlzIGFmdGVyCisqIHdlIHJlc3RvcmUgdGhlIG1pYyB2b2x1bWUvYm9vc3Qgc3RhdGUgYW5kIG1pYzIgd2FzIHNlbGVjdGVkIGF0CisqIHN1c3BlbmQgdGltZSwgd2Ugd2lsbCBlbmQgdXAgd2l0aCBhIGJyaWVmIHBlcmlvZCBvZiB0aW1lIHdoZXJlIG1pYzEKKyogaXMgc2VsZWN0ZWQgd2l0aCB0aGUgdm9sdW1lL2Jvb3N0IHNldHRpbmdzIGZvciBtaWMyLCBjYXVzaW5nCisqIGFjb3VzdGljIGZlZWRiYWNrLiAgU28gd2UgcmVzdG9yZSB0aGUgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVyCisqIGZpcnN0LCB0aGVyZWJ5IGdldHRpbmcgdGhlIGNvcnJlY3QgbWljIHNlbGVjdGVkIGJlZm9yZSB3ZSByZXN0b3JlCisqIHRoZSBtaWMgdm9sdW1lL2Jvb3N0LgorKi8KKwljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19HRU5FUkFMX1BVUlBPU0UsIAorCQkodTE2KWNhcmQtPnBtLnUzMkFDOTdfZ2VuZXJhbF9wdXJwb3NlKTsKKy8qCisqIE5vdywgd2hpbGUgdGhlIG91dHB1dHMgYXJlIHN0aWxsIG11dGVkLCByZXN0b3JlIHRoZSBzdGF0ZSBvZiBwb3dlcgorKiBvbiB0aGUgQUM5NyBwYXJ0LgorKi8KKwljc19hYzk3X3NldChkZXYsICh1OClCQTBfQUM5N19QT1dFUkRPV04sICh1MTYpY2FyZC0+cG0udTMyQUM5N19wb3dlcmRvd24pOworCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOworLyoKKyogUmVzdG9yZSBqdXN0IHRoZSBmaXJzdCBzZXQgb2YgcmVnaXN0ZXJzLCBmcm9tIHJlZ2lzdGVyIG51bWJlcgorKiAweDAyIHRvIHRoZSByZWdpc3RlciBudW1iZXIgdGhhdCB1bEhpZ2hlc3RSZWdUb1Jlc3RvcmUgc3BlY2lmaWVzLgorKi8KKwlmb3IoCUNvdW50ID0gMHgyLCBpPTA7IAorCQkoQ291bnQgPD0gQ1M0NlhYX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRSkKKwkJCSYmIChpIDwgQ1M0NlhYX0FDOTdfTlVNQkVSX1JFU1RPUkVfUkVHUyk7IAorCQlDb3VudCArPSAyLCBpKyspCisJeworCQljc19hYzk3X3NldChkZXYsICh1OCkoQkEwX0FDOTdfUkVTRVQgKyBDb3VudCksICh1MTYpY2FyZC0+cG0uYWM5N1tpXSk7CisJfQorCisJLyogQ2hlY2sgaWYgd2UgaGF2ZSB0byBpbml0IHRoZSBhbXBsaWZpZXIgKi8KKwlpZihjYXJkLT5hbXBfaW5pdCkKKwkJY2FyZC0+YW1wX2luaXQoY2FyZCk7CisgICAgICAgIAorCUNTX0RCR09VVChDU19QTSwgOSwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9hYzk3X3Jlc3VtZSgpLVxuIikpOworfQorCisKK3N0YXRpYyBpbnQgY3M0Nnh4X3Jlc3RhcnRfcGFydChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWY7CisJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRlVOQ1RJT04sIDQsIAorCQlwcmludGsoICJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKStcbiIpKTsKKwlpZihjYXJkLT5zdGF0ZXNbMV0pCisJeworCQlkbWFidWYgPSAmY2FyZC0+c3RhdGVzWzFdLT5kbWFidWY7CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQlyZXN5bmNfZG1hX3B0cnMoY2FyZC0+c3RhdGVzWzFdKTsKKwkJY3Nfc2V0X2Rpdmlzb3IoZG1hYnVmKTsKKwkJaWYoX19wcm9nX2RtYWJ1ZihjYXJkLT5zdGF0ZXNbMV0pKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgCisJCQkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN0YXJ0X3BhcnQoKS0gKC0xKSBwcm9nX2RtYWJ1ZigpIGRhYyBlcnJvclxuIikpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWNzX3NldF9kYWNfcmF0ZShjYXJkLT5zdGF0ZXNbMV0sIGRtYWJ1Zi0+cmF0ZSk7CisJfQorCWlmKGNhcmQtPnN0YXRlc1swXSkKKwl7CisJCWRtYWJ1ZiA9ICZjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1ZjsKKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCXJlc3luY19kbWFfcHRycyhjYXJkLT5zdGF0ZXNbMF0pOworCQljc19zZXRfZGl2aXNvcihkbWFidWYpOworCQlpZihfX3Byb2dfZG1hYnVmKGNhcmQtPnN0YXRlc1swXSkpCisJCXsKKwkJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAxLCAKKwkJCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3RhcnRfcGFydCgpLSAoLTEpIHByb2dfZG1hYnVmKCkgYWRjIGVycm9yXG4iKSk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY3Nfc2V0X2FkY19yYXRlKGNhcmQtPnN0YXRlc1swXSwgZG1hYnVmLT5yYXRlKTsKKwl9CisJY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX1JFU1VNRUQ7CisJaWYoY2FyZC0+c3RhdGVzWzBdKQorCQlzdGFydF9hZGMoY2FyZC0+c3RhdGVzWzBdKTsKKwlpZihjYXJkLT5zdGF0ZXNbMV0pCisJCXN0YXJ0X2RhYyhjYXJkLT5zdGF0ZXNbMV0pOworCisJY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX0lETEU7CisJY2FyZC0+cG0uZmxhZ3MgJj0gfihDUzQ2WFhfUE1fU1VTUEVORElORyB8IENTNDZYWF9QTV9TVVNQRU5ERUQgCisJCQl8IENTNDZYWF9QTV9SRVNVTUlORyB8IENTNDZYWF9QTV9SRVNVTUVEKTsKKwlpZihjYXJkLT5zdGF0ZXNbMF0pCisJCXdha2VfdXAoJmNhcmQtPnN0YXRlc1swXS0+ZG1hYnVmLndhaXQpOworCWlmKGNhcmQtPnN0YXRlc1sxXSkKKwkJd2FrZV91cCgmY2FyZC0+c3RhdGVzWzFdLT5kbWFidWYud2FpdCk7CisKKwlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCisJCXByaW50ayggImNzNDZ4eDogY3M0Nnh4X3Jlc3RhcnRfcGFydCgpLVxuIikpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIGNzNDYxeF9yZXNldChzdHJ1Y3QgY3NfY2FyZCAqY2FyZCk7CitzdGF0aWMgdm9pZCBjczQ2MXhfcHJvY19zdG9wKHN0cnVjdCBjc19jYXJkICpjYXJkKTsKK3N0YXRpYyBpbnQgY3M0Nnh4X3N1c3BlbmQoc3RydWN0IGNzX2NhcmQgKmNhcmQsIHUzMiBzdGF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQgdG1wOworCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKKwkJcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9zdXNwZW5kKCkrIGZsYWdzPTB4JXggcz0lcFxuIiwKKwkJCSh1bnNpZ25lZCljYXJkLT5wbS5mbGFncyxjYXJkKSk7CisvKgorKiBjaGVjayB0aGUgY3VycmVudCBzdGF0ZSwgb25seSBzdXNwZW5kIGlmIElETEUKKyovCisJaWYoIShjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKSkKKwl7CisJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAyLCAKKwkJCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZCgpIHVuYWJsZSB0byBzdXNwZW5kLCBub3QgSURMRVxuIikpOworCQlyZXR1cm4gMTsKKwl9CisJY2FyZC0+cG0uZmxhZ3MgJj0gfkNTNDZYWF9QTV9JRExFOworCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9TVVNQRU5ESU5HOworCisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwxKTsKKwkKKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUEZJRSk7CisJdG1wICY9IH4weDAwMDBmMDNmOworCXRtcCB8PSAgMHgwMDAwMDAxMDsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgdG1wKTsJLyogcGxheWJhY2sgaW50ZXJydXB0IGRpc2FibGUgKi8KKworCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DSUUpOworCXRtcCAmPSB+MHgwMDAwMDAzZjsKKwl0bXAgfD0gIDB4MDAwMDAwMTE7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZGlzYWJsZSAqLworCisJLyoKKyAgICAgICAgICogIFN0b3AgcGxheWJhY2sgRE1BLgorCSAqLworCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wICYgMHgwMDAwZmZmZik7CisKKwkvKgorICAgICAgICAgKiAgU3RvcCBjYXB0dXJlIERNQS4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCAmIDB4ZmZmZjAwMDApOworCisJaWYoY2FyZC0+c3RhdGVzWzFdKQorCXsKKwkJY2FyZC0+cG0uZG1hYnVmX3N3cHRyX3BsYXkgPSBjYXJkLT5zdGF0ZXNbMV0tPmRtYWJ1Zi5zd3B0cjsKKwkJY2FyZC0+cG0uZG1hYnVmX2NvdW50X3BsYXkgPSBjYXJkLT5zdGF0ZXNbMV0tPmRtYWJ1Zi5jb3VudDsKKwl9CisJaWYoY2FyZC0+c3RhdGVzWzBdKQorCXsKKwkJY2FyZC0+cG0uZG1hYnVmX3N3cHRyX2NhcHR1cmUgPSBjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1Zi5zd3B0cjsKKwkJY2FyZC0+cG0uZG1hYnVmX2NvdW50X2NhcHR1cmUgPSBjYXJkLT5zdGF0ZXNbMF0tPmRtYWJ1Zi5jb3VudDsKKwl9CisKKwljczQ2eHhfYWM5N19zdXNwZW5kKGNhcmQpOworCisJLyoKKyAgICAgICAgICogIFJlc2V0IHRoZSBwcm9jZXNzb3IuCisgICAgICAgICAqLworCWNzNDYxeF9yZXNldChjYXJkKTsKKworCWNzNDYxeF9wcm9jX3N0b3AoY2FyZCk7CisKKwkvKgorCSAqICBQb3dlciBkb3duIHRoZSBEQUMgYW5kIEFEQy4gIEZvciBub3cgbGVhdmUgdGhlIG90aGVyIGFyZWFzIG9uLgorCSAqLworCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgMHgwMzAwKTsKKworCS8qCisJICogIFBvd2VyIGRvd24gdGhlIFBMTC4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCAwKTsKKworCS8qCisJICogIFR1cm4gb2ZmIHRoZSBQcm9jZXNzb3IgYnkgdHVybmluZyBvZmYgdGhlIHNvZnR3YXJlIGNsb2NrIGVuYWJsZSBmbGFnIGluIAorCSAqICB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOworCisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwtMSk7CisKKwljYXJkLT5wbS5mbGFncyAmPSB+Q1M0NlhYX1BNX1NVU1BFTkRJTkc7CisJY2FyZC0+cG0uZmxhZ3MgfD0gQ1M0NlhYX1BNX1NVU1BFTkRFRDsKKworCXByaW50cG0oY2FyZCk7CisKKwlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgCisJCXByaW50aygiY3M0Nnh4OiBjczQ2eHhfc3VzcGVuZCgpLSBmbGFncz0weCV4XG4iLAorCQkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M0Nnh4X3Jlc3VtZShzdHJ1Y3QgY3NfY2FyZCAqY2FyZCkKK3sKKwlpbnQgaTsKKworCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCA0LCAKKwkJcHJpbnRrKCAiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCkrIGZsYWdzPTB4JXhcbiIsCisJCQkodW5zaWduZWQpY2FyZC0+cG0uZmxhZ3MpKTsKKwlpZighKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX1NVU1BFTkRFRCkpCisJeworCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMiwgCisJCQlwcmludGsoImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpIHVuYWJsZSB0byByZXN1bWUsIG5vdCBTVVNQRU5ERURcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCWNhcmQtPnBtLmZsYWdzIHw9IENTNDZYWF9QTV9SRVNVTUlORzsKKwljYXJkLT5wbS5mbGFncyAmPSB+Q1M0NlhYX1BNX1NVU1BFTkRFRDsKKwlwcmludHBtKGNhcmQpOworCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIDEpOworCisJZm9yKGk9MDtpPDU7aSsrKQorCXsKKwkJaWYgKGNzX2hhcmR3YXJlX2luaXQoY2FyZCkgIT0gMCkKKwkJeworCQkJQ1NfREJHT1VUKENTX1BNIHwgQ1NfRVJST1IsIDQsIHByaW50aygKKwkJCQkiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lKCktIEVSUk9SIGluIGNzX2hhcmR3YXJlX2luaXQoKVxuIikpOworCQkJbWRlbGF5KDEwICogY3NfbGFwdG9wX3dhaXQpOworCQkJY3M0NjF4X3Jlc2V0KGNhcmQpOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCWlmKGk+PTQpCisJeworCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgMSwgcHJpbnRrKAorCQkJImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpLSBjc19oYXJkd2FyZV9pbml0KCkgZmFpbGVkLCByZXRyaWVkICVkIHRpbWVzLlxuIixpKSk7CisJCXJldHVybiAwOworCX0KKworCWlmKGNzNDZ4eF9yZXN0YXJ0X3BhcnQoY2FyZCkpCisJeworCQlDU19EQkdPVVQoQ1NfUE0gfCBDU19FUlJPUiwgNCwgcHJpbnRrKAorCQkJImNzNDZ4eDogY3M0Nnh4X3Jlc3VtZSgpOiBjczQ2eHhfcmVzdGFydF9wYXJ0KCkgcmV0dXJuZWQgZXJyb3JcbiIpKTsKKwl9CisKKwljYXJkLT5hY3RpdmVfY3RybChjYXJkLCAtMSk7CisKKwlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgNCwgcHJpbnRrKCJjczQ2eHg6IGNzNDZ4eF9yZXN1bWUoKS0gZmxhZ3M9MHgleFxuIiwKKwkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBjczQ2MXhfZm9wcyA9IHsKKwlDU19PV05FUglDU19USElTX01PRFVMRQorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGNzX3JlYWQsCisJLndyaXRlCQk9IGNzX3dyaXRlLAorCS5wb2xsCQk9IGNzX3BvbGwsCisJLmlvY3RsCQk9IGNzX2lvY3RsLAorCS5tbWFwCQk9IGNzX21tYXAsCisJLm9wZW4JCT0gY3Nfb3BlbiwKKwkucmVsZWFzZQk9IGNzX3JlbGVhc2UsCit9OworCisvKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLworCisKK3N0YXRpYyB1MTYgX2NzX2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZCA9IGRldi0+cHJpdmF0ZV9kYXRhOworCWludCBjb3VudCxsb29wY250OworCXVuc2lnbmVkIGludCB0bXA7CisJdTE2IHJldDsKKwkKKwkvKgorCSAqICAxLiBXcml0ZSBBQ0NBRCA9IENvbW1hbmQgQWRkcmVzcyBSZWdpc3RlciA9IDQ2Q2ggZm9yIEFDOTcgcmVnaXN0ZXIgYWRkcmVzcworCSAqICAyLiBXcml0ZSBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGggICAgZm9yIGRhdGEgdG8gd3JpdGUgdG8gQUM5NyAKKwkgKiAgMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGUKKwkgKiAgNC4gUmVhZCBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMTdoCisJICogIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgorCSAqICA2LiBSZWFkIEFDU1RTID0gU3RhdHVzIFJlZ2lzdGVyID0gNDY0aCwgY2hlY2sgVlNUUyBiaXQKKwkgKi8KKworCWNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NEQSk7CisKKwkvKgorCSAqICBTZXR1cCB0aGUgQUM5NyBjb250cm9sIHJlZ2lzdGVycyBvbiB0aGUgQ1M0NjF4IHRvIHNlbmQgdGhlCisJICogIGFwcHJvcHJpYXRlIGNvbW1hbmQgdG8gdGhlIEFDOTcgdG8gcGVyZm9ybSB0aGUgcmVhZC4KKwkgKiAgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoCisJICogIEFDQ0RBID0gQ29tbWFuZCBEYXRhIFJlZ2lzdGVyID0gNDcwaAorCSAqICBBQ0NUTCA9IENvbnRyb2wgUmVnaXN0ZXIgPSA0NjBoCisJICogIHNldCBEQ1YgLSB3aWxsIGNsZWFyIHdoZW4gcHJvY2VzcyBjb21wbGV0ZWQKKwkgKiAgc2V0IENSVyAtIFJlYWQgY29tbWFuZAorCSAqICBzZXQgVkZSTSAtIHZhbGlkIGZyYW1lIGVuYWJsZWQKKwkgKiAgc2V0IEVTWU4gLSBBU1lOQyBnZW5lcmF0aW9uIGVuYWJsZWQKKwkgKiAgc2V0IFJTVE4gLSBBUlNUIyBpbmFjdGl2ZSwgQUM5NyBjb2RlYyBub3QgcmVzZXQKKwkgKi8KKworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NBRCwgcmVnKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDREEsIDApOworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgQUNDVExfRENWIHwgQUNDVExfQ1JXIHwKKwkJCQkJICAgICBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8CisJCQkJCSAgICAgQUNDVExfUlNUTik7CisKKworCS8qCisJICogIFdhaXQgZm9yIHRoZSByZWFkIHRvIG9jY3VyLgorCSAqLworCWlmKCEoY2FyZC0+cG0uZmxhZ3MgJiBDUzQ2WFhfUE1fSURMRSkpCisJCWxvb3BjbnQgPSAyMDAwOworCWVsc2UKKwkJbG9vcGNudCA9IDUwMCAqIGNzX2xhcHRvcF93YWl0OworIAlsb29wY250ICo9IGNzX2xhcHRvcF93YWl0OworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BjbnQ7IGNvdW50KyspIHsKKwkJLyoKKwkJICogIEZpcnN0LCB3ZSB3YW50IHRvIHdhaXQgZm9yIGEgc2hvcnQgdGltZS4KKwkgCSAqLworCQl1ZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7CisJCS8qCisJCSAqICBOb3csIGNoZWNrIHRvIHNlZSBpZiB0aGUgcmVhZCBoYXMgY29tcGxldGVkLgorCQkgKiAgQUNDVEwgPSA0NjBoLCBEQ1Ygc2hvdWxkIGJlIHJlc2V0IGJ5IG5vdyBhbmQgNDYwaCA9IDE3aAorCQkgKi8KKwkJaWYgKCEoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKSAmIEFDQ1RMX0RDVikpCisJCQlicmVhazsKKwl9CisKKwkvKgorCSAqICBNYWtlIHN1cmUgdGhlIHJlYWQgY29tcGxldGVkLgorCSAqLworCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSJjczQ2eHg6IEFDJzk3IHJlYWQgcHJvYmxlbSAoQUNDVExfRENWKSwgcmVnID0gMHgleCByZXR1cm5pbmcgMHhmZmZmXG4iLCByZWcpKTsKKwkJcmV0dXJuIDB4ZmZmZjsKKwl9CisKKwkvKgorCSAqICBXYWl0IGZvciB0aGUgdmFsaWQgc3RhdHVzIGJpdCB0byBnbyBhY3RpdmUuCisJICovCisKKwlpZighKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQorCQlsb29wY250ID0gMjAwMDsKKwllbHNlCisJCWxvb3BjbnQgPSAxMDAwOworIAlsb29wY250ICo9IGNzX2xhcHRvcF93YWl0OworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxvb3BjbnQ7IGNvdW50KyspIHsKKwkJLyoKKwkJICogIFJlYWQgdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyLgorCQkgKiAgQUNTVFMgPSBTdGF0dXMgUmVnaXN0ZXIgPSA0NjRoCisJCSAqICBWU1RTIC0gVmFsaWQgU3RhdHVzCisJCSAqLworCQlpZiAoY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU1RTKSAmIEFDU1RTX1ZTVFMpCisJCQlicmVhazsKKwkJdWRlbGF5KDEwICogY3NfbGFwdG9wX3dhaXQpOworCX0KKwkKKwkvKgorCSAqICBNYWtlIHN1cmUgd2UgZ290IHZhbGlkIHN0YXR1cy4KKwkgKi8KKwlpZiAoISggKHRtcD1jczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpKSAmIEFDU1RTX1ZTVFMpKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCSJjczQ2eHg6IEFDJzk3IHJlYWQgcHJvYmxlbSAoQUNTVFNfVlNUUyksIHJlZyA9IDB4JXggdmFsPTB4JXggMHhmZmZmIFxuIiwgCisJCQkJcmVnLCB0bXApKTsKKwkJcmV0dXJuIDB4ZmZmZjsKKwl9CisKKwkvKgorCSAqICBSZWFkIHRoZSBkYXRhIHJldHVybmVkIGZyb20gdGhlIEFDOTcgcmVnaXN0ZXIuCisJICogIEFDU0RBID0gU3RhdHVzIERhdGEgUmVnaXN0ZXIgPSA0NzRoCisJICovCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA5LCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQ2eHg6IGNzX2FjOTdfZ2V0KCkgcmVnID0gMHgleCwgdmFsID0gMHgleCwgQkEwX0FDQ0FEID0gMHgleFxuIiwgCisJCQlyZWcsIGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NEQSksCisJCQljczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDQUQpKSk7CisJcmV0ID0gY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDU0RBKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdTE2IGNzX2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZykKK3sKKwl1MTYgcmV0OworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7CisJCisJc3Bpbl9sb2NrKCZjYXJkLT5hYzk3X2xvY2spOworCXJldCA9IF9jc19hYzk3X2dldChkZXYsIHJlZyk7CisJc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgY3NfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnLCB1MTYgdmFsKQoreworCXN0cnVjdCBjc19jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7CisJaW50IGNvdW50OworCWludCB2YWwyID0gMDsKKwkKKwlzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJCisJaWYocmVnID09IEFDOTdfQ0RfVk9MKQorCXsKKwkJdmFsMiA9IF9jc19hYzk3X2dldChkZXYsIEFDOTdfQ0RfVk9MKTsKKwl9CisJCisJCisJLyoKKwkgKiAgMS4gV3JpdGUgQUNDQUQgPSBDb21tYW5kIEFkZHJlc3MgUmVnaXN0ZXIgPSA0NkNoIGZvciBBQzk3IHJlZ2lzdGVyIGFkZHJlc3MKKwkgKiAgMi4gV3JpdGUgQUNDREEgPSBDb21tYW5kIERhdGEgUmVnaXN0ZXIgPSA0NzBoICAgIGZvciBkYXRhIHRvIHdyaXRlIHRvIEFDOTcKKwkgKiAgMy4gV3JpdGUgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaCBmb3IgaW5pdGlhdGluZyB0aGUgd3JpdGUKKwkgKiAgNC4gUmVhZCBBQ0NUTCA9IDQ2MGgsIERDViBzaG91bGQgYmUgcmVzZXQgYnkgbm93IGFuZCA0NjBoID0gMDdoCisJICogIDUuIGlmIERDViBub3QgY2xlYXJlZCwgYnJlYWsgYW5kIHJldHVybiBlcnJvcgorCSAqLworCisJLyoKKwkgKiAgU2V0dXAgdGhlIEFDOTcgY29udHJvbCByZWdpc3RlcnMgb24gdGhlIENTNDYxeCB0byBzZW5kIHRoZQorCSAqICBhcHByb3ByaWF0ZSBjb21tYW5kIHRvIHRoZSBBQzk3IHRvIHBlcmZvcm0gdGhlIHJlYWQuCisJICogIEFDQ0FEID0gQ29tbWFuZCBBZGRyZXNzIFJlZ2lzdGVyID0gNDZDaAorCSAqICBBQ0NEQSA9IENvbW1hbmQgRGF0YSBSZWdpc3RlciA9IDQ3MGgKKwkgKiAgQUNDVEwgPSBDb250cm9sIFJlZ2lzdGVyID0gNDYwaAorCSAqICBzZXQgRENWIC0gd2lsbCBjbGVhciB3aGVuIHByb2Nlc3MgY29tcGxldGVkCisJICogIHJlc2V0IENSVyAtIFdyaXRlIGNvbW1hbmQKKwkgKiAgc2V0IFZGUk0gLSB2YWxpZCBmcmFtZSBlbmFibGVkCisJICogIHNldCBFU1lOIC0gQVNZTkMgZ2VuZXJhdGlvbiBlbmFibGVkCisJICogIHNldCBSU1ROIC0gQVJTVCMgaW5hY3RpdmUsIEFDOTcgY29kZWMgbm90IHJlc2V0CisgICAgICAgICAqLworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NBRCwgcmVnKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDREEsIHZhbCk7CisJY3M0NjF4X3BlZWtCQTAoY2FyZCwgQkEwX0FDQ1RMKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDAgfCBBQ0NUTF9WRlJNIHwgQUNDVExfRVNZTiB8IEFDQ1RMX1JTVE4pOworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ0NUTCwgQUNDVExfRENWIHwgQUNDVExfVkZSTSB8CisJCQkJICAgICAgICAgICAgIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDAwOyBjb3VudCsrKSB7CisJCS8qCisJCSAqICBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCisJCSAqLworCQl1ZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7CisJCS8qCisJCSAqICBOb3csIGNoZWNrIHRvIHNlZSBpZiB0aGUgd3JpdGUgaGFzIGNvbXBsZXRlZC4KKwkJICogIEFDQ1RMID0gNDYwaCwgRENWIHNob3VsZCBiZSByZXNldCBieSBub3cgYW5kIDQ2MGggPSAwN2gKKwkJICovCisJCWlmICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0NUTCkgJiBBQ0NUTF9EQ1YpKQorCQkJYnJlYWs7CisJfQorCS8qCisJICogIE1ha2Ugc3VyZSB0aGUgd3JpdGUgY29tcGxldGVkLgorCSAqLworCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNDVEwpICYgQUNDVExfRENWKQorCXsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJImNzNDZ4eDogQUMnOTcgd3JpdGUgcHJvYmxlbSwgcmVnID0gMHgleCwgdmFsID0gMHgleFxuIiwgcmVnLCB2YWwpKTsKKwl9CisKKwlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKworCS8qCisJICoJQWRqdXN0IHBvd2VyIGlmIHRoZSBtaXhlciBpcyBzZWxlY3RlZC9kZXNlbGVjdGVkIGFjY29yZGluZworCSAqCXRvIHRoZSBDRC4KKwkgKgorCSAqCUlGIHRoZSBDRCBpcyBhIHZhbGlkIGlucHV0IHNvdXJjZSAobWl4ZXIgb3IgZGlyZWN0KSBBTkQKKwkgKgkJdGhlIENEIGlzIG5vdCBtdXRlZCBUSEVOIHBvd2VyIGlzIG5lZWRlZAorCSAqCisJICoJV2UgZG8gdHdvIHRoaW5ncy4gV2hlbiByZWNvcmQgc2VsZWN0IGNoYW5nZXMgdGhlIGlucHV0IHRvCisJICoJYWRkL3JlbW92ZSB0aGUgQ0Qgd2UgYWRqdXN0IHRoZSBwb3dlciBjb3VudCBpZiB0aGUgQ0QgaXMKKwkgKgl1bm11dGVkLgorCSAqCisJICoJV2hlbiB0aGUgQ0QgbXV0ZSBjaGFuZ2VzIHdlIGFkanVzdCB0aGUgcG93ZXIgbGV2ZWwgaWYgdGhlCisJICoJQ0Qgd2FzIGEgdmFsaWQgaW5wdXQuCisJICoKKwkgKiAgICAgIFdlIGFsc28gY2hlY2sgZm9yIENEIHZvbHVtZSAhPSAwLCBhcyB0aGUgQ0QgbXV0ZSBpc24ndAorCSAqICAgICAgbm9ybWFsbHkgdHdlYWtlZCBmcm9tIHVzZXJzcGFjZS4KKwkgKi8KKwkgCisJLyogQ0QgbXV0ZSBjaGFuZ2UgPyAqLworCQorCWlmKHJlZz09QUM5N19DRF9WT0wpCisJeworCQkvKiBNdXRlIGJpdCBjaGFuZ2UgPyAqLworCQlpZigodmFsMl52YWwpJjB4ODAwMCB8fCAoKHZhbDIgPT0gMHgxZjFmIHx8IHZhbCA9PSAweDFmMWYpICYmIHZhbDIgIT0gdmFsKSkKKwkJeworCQkJLyogVGhpcyBpcyBhIGhhY2sgYnV0IGl0cyBjbGVhbmVyIHRoYW4gdGhlIGFsdGVybmF0aXZlcy4KKwkJCSAgIFJpZ2h0IG5vdyBjYXJkLT5hYzk3X2NvZGVjWzBdIG1pZ2h0IGJlIE5VTEwgYXMgd2UgYXJlCisJCQkgICBzdGlsbCBkb2luZyBjb2RlYyBzZXR1cC4gVGhpcyBkb2VzIGFuIGVhcmx5IGFzc2lnbm1lbnQKKwkJCSAgIHRvIGF2b2lkIHRoZSBwcm9ibGVtIGlmIGl0IG9jY3VycyAqLworCQkJICAgCisJCQlpZihjYXJkLT5hYzk3X2NvZGVjWzBdPT1OVUxMKQorCQkJCWNhcmQtPmFjOTdfY29kZWNbMF09ZGV2OworCQkJCQorCQkJLyogTXV0ZSBvbiAqLworCQkJaWYodmFsJjB4ODAwMCB8fCB2YWwgPT0gMHgxZjFmKQorCQkJCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIC0xKTsKKwkJCWVsc2UgLyogTXV0ZSBvZmYgcG93ZXIgb24gKi8KKwkJCXsKKwkJCQlpZihjYXJkLT5hbXBfaW5pdCkKKwkJCQkJY2FyZC0+YW1wX2luaXQoY2FyZCk7CisJCQkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgMSk7CisJCQl9CisJCX0KKwl9Cit9CisKKworLyogT1NTIC9kZXYvbWl4ZXIgZmlsZSBvcGVyYXRpb24gbWV0aG9kcyAqLworCitzdGF0aWMgaW50IGNzX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpPTA7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1OVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXVuc2lnbmVkIGludCB0bXA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCA0LAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3Nfb3Blbl9taXhkZXYoKStcbiIpKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQ2eHhfZGV2cykKKwl7CisJCWNhcmQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3NfY2FyZCwgbGlzdCk7CisJCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCisJCQlpZiAoY2FyZC0+YWM5N19jb2RlY1tpXSAhPSBOVUxMICYmCisJCQkgICAgY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyID09IG1pbm9yKQorCQkJCWdvdG8gbWF0Y2g7CisJfQorCWlmICghY2FyZCkKKwl7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4gfCBDU19FUlJPUiwgMiwKKwkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X29wZW5fbWl4ZGV2KCktIC1FTk9ERVZcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorIG1hdGNoOgorCWlmKCFjYXJkLT5hYzk3X2NvZGVjW2ldKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkLT5hYzk3X2NvZGVjW2ldOworCisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwxKTsKKwlpZighQ1NfSU5fVVNFKCZjYXJkLT5taXhlcl91c2VfY250KSkKKwl7CisJCWlmKCAodG1wID0gY3M0Nnh4X3Bvd2VydXAoY2FyZCwgQ1NfUE9XRVJfTUlYVk9OICkpICkKKwkJeworCQkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCQkiY3M0Nnh4OiBjc19vcGVuX21peGRldigpIHBvd2VydXAgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgMSk7CisJQ1NfSU5DX1VTRV9DT1VOVCgmY2FyZC0+bWl4ZXJfdXNlX2NudCk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfT1BFTiwgNCwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzX29wZW5fbWl4ZGV2KCktIDBcbiIpKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgY3NfcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgY3NfY2FyZCAqY2FyZD1OVUxMOworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCWludCBpOworCXVuc2lnbmVkIGludCB0bXA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19SRUxFQVNFLCA0LAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKStcbiIpKTsKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpCisJeworCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOworCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQorCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJgorCQkJICAgIGNhcmQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlciA9PSBtaW5vcikKKwkJCQlnb3RvIG1hdGNoOworCX0KKwlpZiAoIWNhcmQpCisJeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOIHwgQ1NfRVJST1IsIDIsCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9vcGVuX21peGRldigpLSAtRU5PREVWXG4iKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KK21hdGNoOgorCWlmKCFDU19ERUNfQU5EX1RFU1QoJmNhcmQtPm1peGVyX3VzZV9jbnQpKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfUkVMRUFTRSwgNCwKKwkJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjc19yZWxlYXNlX21peGRldigpLSBubyBwb3dlcmRvd24sIHVzZWNudD4wXG4iKSk7CisJCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKKwkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOworCQlyZXR1cm4gMDsKKwl9CisvKgorKiBvaywgbm8gb3V0c3RhbmRpbmcgbWl4ZXIgb3BlbnMsIHNvIHBvd2VyZG93bi4KKyovCisJaWYoICh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX01JWFZPTiwgQ1NfRkFMU0UgKSkgKQorCXsKKwkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJjczQ2eHg6IGNzX3JlbGVhc2VfbWl4ZGV2KCkgcG93ZXJkb3duIE1JWFZPTiBmYWlsdXJlICgweCV4KVxuIix0bXApICk7CisJCWNhcmQtPmFjdGl2ZV9jdHJsKGNhcmQsIC0xKTsKKwkJY2FyZC0+YW1wbGlmaWVyX2N0cmwoY2FyZCwgLTEpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgLTEpOworCWNhcmQtPmFtcGxpZmllcl9jdHJsKGNhcmQsIC0xKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19SRUxFQVNFLCA0LAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3NfcmVsZWFzZV9taXhkZXYoKS0gMFxuIikpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQ9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwl1bnNpZ25lZCBsb25nIF9fdXNlciAqcCA9IChsb25nIF9fdXNlciAqKWFyZzsKKworI2lmIENTREVCVUdfSU5URVJGQUNFCisgICAgICAgIGludCB2YWw7CisKKwlpZiggCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSykgfHwgCisJCShjbWQgPT0gU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSykgfHwKKwkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTCkgfHwKKwkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTCkgfHwKKwkJKGNtZCA9PSBTT1VORF9NSVhFUl9DU19BUE0pKQorCXsKKwkgICAgc3dpdGNoKGNtZCkKKwkgICAgeworCisJCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzoKKwkJCXJldHVybiBwdXRfdXNlcihjc19kZWJ1Z21hc2ssIHApOworCQkKKwkJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDoKKwkJCXJldHVybiBwdXRfdXNlcihjc19kZWJ1Z2xldmVsLCBwKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWNzX2RlYnVnbWFzayA9IHZhbDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUw6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWNzX2RlYnVnbGV2ZWwgPSB2YWw7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX0FQTToKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYodmFsID09IENTX0lPQ1RMX0NNRF9TVVNQRU5EKSAKKwkJCXsKKwkJCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY3M0Nnh4X2RldnMpCisJCQkJeworCQkJCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzX2NhcmQsIGxpc3QpOworCQkJCQljczQ2eHhfc3VzcGVuZChjYXJkLCAwKTsKKwkJCQl9CisKKwkJCX0KKwkJCWVsc2UgaWYodmFsID09IENTX0lPQ1RMX0NNRF9SRVNVTUUpCisJCQl7CisJCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDZ4eF9kZXZzKQorCQkJCXsKKwkJCQkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBjc19jYXJkLCBsaXN0KTsKKwkJCQkJY3M0Nnh4X3Jlc3VtZShjYXJkKTsKKwkJCQl9CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPCisJCQkJICAgICJjczQ2eHg6IG1peGVyX2lvY3RsKCk6IGludmFsaWQgQVBNIGNtZCAoJWQpXG4iLAorCQkJCQl2YWwpKTsKKwkJCX0KKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6CisJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkJImNzNDZ4eDogbWl4ZXJfaW9jdGwoKTogRVJST1IgdW5rbm93biBkZWJ1ZyBjbWRcbiIpICk7CisJCQlyZXR1cm4gMDsKKwkgICAgfQorCX0KKyNlbmRpZgorCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzX21peGVyX2ZvcHMgPSB7CisJQ1NfT1dORVIJQ1NfVEhJU19NT0RVTEUKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gY3NfaW9jdGxfbWl4ZGV2LAorCS5vcGVuCQk9IGNzX29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlCT0gY3NfcmVsZWFzZV9taXhkZXYsCit9OworCisvKiBBQzk3IGNvZGVjIGluaXRpYWxpc2F0aW9uLiAqLworc3RhdGljIGludCBfX2luaXQgY3NfYWM5N19pbml0KHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworCWludCBudW1fYWM5NyA9IDA7CisJaW50IHJlYWR5XzJuZCA9IDA7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCXUxNiBlaWQ7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0Nnh4OiBjc19hYzk3X2luaXQoKStcbiIpICk7CisKKwlmb3IgKG51bV9hYzk3ID0gMDsgbnVtX2FjOTcgPCBOUl9BQzk3OyBudW1fYWM5NysrKSB7CisJCWlmICgoY29kZWMgPSBhYzk3X2FsbG9jX2NvZGVjKCkpID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQkvKiBpbml0aWFsaXplIHNvbWUgYmFzaWMgY29kZWMgaW5mb3JtYXRpb24sIG90aGVyIGZpZWxkcyB3aWxsIGJlIGZpbGxlZAorCQkgICBpbiBhYzk3X3Byb2JlX2NvZGVjICovCisJCWNvZGVjLT5wcml2YXRlX2RhdGEgPSBjYXJkOworCQljb2RlYy0+aWQgPSBudW1fYWM5NzsKKworCQljb2RlYy0+Y29kZWNfcmVhZCA9IGNzX2FjOTdfZ2V0OworCQljb2RlYy0+Y29kZWNfd3JpdGUgPSBjc19hYzk3X3NldDsKKwkKKwkJaWYgKGFjOTdfcHJvYmVfY29kZWMoY29kZWMpID09IDApCisJCXsKKwkJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX0lOSVQsIDIsIHByaW50ayhLRVJOX0lORk8gCisJCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCktIGNvZGVjIG51bWJlciAlZCBub3QgZm91bmRcbiIsCisJCQkJCW51bV9hYzk3KSApOworCQkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpIGZvdW5kIGNvZGVjICVkXG4iLG51bV9hYzk3KSApOworCisJCWVpZCA9IGNzX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX0lEKTsKKwkJCisJCWlmKGVpZD09MHhGRkZGKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjczQ2eHg6IGNvZGVjICVkIG5vdCBwcmVzZW50XG4iLG51bV9hYzk3KTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisJCQlicmVhazsKKwkJfQorCQkKKwkJY2FyZC0+YWM5N19mZWF0dXJlcyA9IGVpZDsKKwkJCQorCQlpZiAoKGNvZGVjLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmY3NfbWl4ZXJfZm9wcywgLTEpKSA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiY3M0Nnh4OiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOworCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKKwkJCWJyZWFrOworCQl9CisJCWNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID0gY29kZWM7CisKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJjczQ2eHg6IGNzX2FjOTdfaW5pdCgpIGFjOTdfY29kZWNbJWRdIHNldCB0byAlcFxuIiwKKwkJCQkodW5zaWduZWQgaW50KW51bV9hYzk3LAorCQkJCWNvZGVjKSk7CisJCS8qIGlmIHRoZXJlIGlzIG5vIHNlY29uZGFyeSBjb2RlYyBhdCBhbGwsIGRvbid0IHByb2JlIGFueSBtb3JlICovCisJCWlmICghcmVhZHlfMm5kKQorCQl7CisJCQludW1fYWM5NyArPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDZ4eDogY3NfYWM5N19pbml0KCktICVkXG4iLCAodW5zaWduZWQgaW50KW51bV9hYzk3KSk7CisJcmV0dXJuIG51bV9hYzk3OworfQorCisvKgorICogbG9hZCB0aGUgc3RhdGljIGltYWdlIGludG8gdGhlIERTUAorICovCisjaW5jbHVkZSAiY3M0NjF4X2ltYWdlLmgiCitzdGF0aWMgdm9pZCBjczQ2MXhfZG93bmxvYWRfaW1hZ2Uoc3RydWN0IGNzX2NhcmQgKmNhcmQpCit7CisgICAgdW5zaWduZWQgaSwgaiwgdGVtcDEsIHRlbXAyLCBvZmZzZXQsIGNvdW50OworICAgIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqcEJBMSA9IGlvcmVtYXAoY2FyZC0+YmExX2FkZHIsIDB4NDAwMDApOworICAgIGZvciggaT0wOyBpIDwgQ0xFQVJfX0NPVU5UOyBpKyspCisgICAgeworICAgICAgICBvZmZzZXQgPSBDbHJTdGF0W2ldLkJBMV9fRGVzdEJ5dGVPZmZzZXQ7CisgICAgICAgIGNvdW50ICA9IENsclN0YXRbaV0uQkExX19Tb3VyY2VTaXplOworICAgICAgICBmb3IoICB0ZW1wMSA9IG9mZnNldDsgdGVtcDE8KG9mZnNldCtjb3VudCk7IHRlbXAxKz00ICkKKyAgICAgICAgICAgICAgd3JpdGVsKDAsIHBCQTErdGVtcDEpOworICAgIH0KKworICAgIGZvcihpPTA7IGk8RklMTF9fQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAgIHRlbXAyID0gRmlsbFN0YXRbaV0uT2Zmc2V0OworICAgICAgICBmb3Ioaj0wOyBqPChGaWxsU3RhdFtpXS5TaXplKS80OyBqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAxID0gKEZpbGxTdGF0W2ldKS5wRmlsbFtqXTsKKyAgICAgICAgICAgIHdyaXRlbCh0ZW1wMSwgcEJBMSt0ZW1wMitqKjQpOworICAgICAgICB9CisgICAgfQorICAgIGlvdW5tYXAocEJBMSk7Cit9CisKKworLyoKKyAqICBDaGlwIHJlc2V0CisgKi8KKworc3RhdGljIHZvaWQgY3M0NjF4X3Jlc2V0KHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworCWludCBpZHg7CisKKwkvKgorCSAqICBXcml0ZSB0aGUgcmVzZXQgYml0IG9mIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCBTUENSX1JTVFNQKTsKKworCS8qCisJICogIFdyaXRlIHRoZSBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCBTUENSX0RSUUVOKTsKKworCS8qCisJICogIENsZWFyIHRoZSB0cmFwIHJlZ2lzdGVycy4KKwkgKi8KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IDg7IGlkeCsrKSB7CisJCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9EUkVHLCBEUkVHX1JFR0lEX1RSQVBfU0VMRUNUICsgaWR4KTsKKwkJY3M0NjF4X3Bva2UoY2FyZCwgQkExX1RXUFIsIDB4RkZGRik7CisJfQorCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9EUkVHLCAwKTsKKworCS8qCisJICogIFNldCB0aGUgZnJhbWUgdGltZXIgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBwZXIgZnJhbWUuCisJICovCisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0ZSTVQsIDB4YWRmKTsKK30KKworc3RhdGljIHZvaWQgY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhzdHJ1Y3QgY3NfY2FyZCAqY2FyZCwgaW50IHR5cGUpCit7CisJaW50IGlkeCwgbG9vcCwgc3RhcnRmaWZvPTAsIGVuZGZpZm89MCwgcG93ZXJkb3duMSA9IDA7CisJdW5zaWduZWQgaW50IHRtcDsKKworCS8qCisJICogIFNlZSBpZiB0aGUgZGV2aWNlcyBhcmUgcG93ZXJlZCBkb3duLiAgSWYgc28sIHdlIG11c3QgcG93ZXIgdGhlbSB1cCBmaXJzdAorCSAqICBvciB0aGV5IHdpbGwgbm90IHJlc3BvbmQuCisJICovCisJaWYgKCEoKHRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9DTEtDUjEpKSAmIENMS0NSMV9TV0NFKSkgeworCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXAgfCBDTEtDUjFfU1dDRSk7CisJCXBvd2VyZG93bjEgPSAxOworCX0KKworCS8qCisJICogIFdlIHdhbnQgdG8gY2xlYXIgb3V0IHRoZSBzZXJpYWwgcG9ydCBGSUZPcyBzbyB3ZSBkb24ndCBlbmQgdXAgcGxheWluZworCSAqICB3aGF0ZXZlciByYW5kb20gZ2FyYmFnZSBoYXBwZW5zIHRvIGJlIGluIHRoZW0uICBXZSBmaWxsIHRoZSBzYW1wbGUgRklGT1MKKwkgKiAgd2l0aCB6ZXJvIChzaWxlbmNlKS4KKyAgICAgICAgICovCisJY3M0NjF4X3Bva2VCQTAoY2FyZCwgQkEwX1NFUkJXUCwgMCk7CisKKwkvKgorCSogQ2hlY2sgZm9yIHdoaWNoIEZJRk8gbG9jYXRpb25zIHRvIGNsZWFyLCBpZiB3ZSBhcmUgY3VycmVudGx5CisJKiBwbGF5aW5nIG9yIGNhcHR1cmluZyB0aGVuIHdlIGRvbid0IHdhbnQgdG8gcHV0IGluIDEyOCBieXRlcyBvZgorCSogIm5vaXNlIi4KKwkgKi8KKwlpZih0eXBlICYgQ1NfVFlQRV9EQUMpCisJeworCQlzdGFydGZpZm8gPSAxMjg7CisJCWVuZGZpZm8gPSAyNTY7CisJfQorCWlmKHR5cGUgJiBDU19UWVBFX0FEQykKKwl7CisJCXN0YXJ0ZmlmbyA9IDA7CisJCWlmKCFlbmRmaWZvKQorCQkJZW5kZmlmbyA9IDEyODsKKwl9CisJLyoKKwkgKiAgRmlsbCBzYW1wbGUgRklGTyBsb2NhdGlvbnMgKDI1NiBsb2NhdGlvbnMgdG90YWwpLgorCSAqLworCWZvciAoaWR4ID0gc3RhcnRmaWZvOyBpZHggPCBlbmRmaWZvOyBpZHgrKykgeworCQkvKgorCQkgKiAgTWFrZSBzdXJlIHRoZSBwcmV2aW91cyBGSUZPIHdyaXRlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgorCQkgKi8KKwkJZm9yIChsb29wID0gMDsgbG9vcCA8IDU7IGxvb3ArKykgeworCQkJdWRlbGF5KDUwKTsKKwkJCWlmICghKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9TRVJCU1QpICYgU0VSQlNUX1dCU1kpKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfU0VSQlNUKSAmIFNFUkJTVF9XQlNZKSB7CisJCQlpZiAocG93ZXJkb3duMSkKKwkJCQljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOworCQl9CisJCS8qCisJCSAqICBXcml0ZSB0aGUgc2VyaWFsIHBvcnQgRklGTyBpbmRleC4KKwkJICovCisJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJCQUQsIGlkeCk7CisJCS8qCisJCSAqICBUZWxsIHRoZSBzZXJpYWwgcG9ydCB0byBsb2FkIHRoZSBuZXcgdmFsdWUgaW50byB0aGUgRklGTyBsb2NhdGlvbi4KKwkJICovCisJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJCQ00sIFNFUkJDTV9XUkMpOworCX0KKwkvKgorCSAqICBOb3csIGlmIHdlIHBvd2VyZWQgdXAgdGhlIGRldmljZXMsIHRoZW4gcG93ZXIgdGhlbSBiYWNrIGRvd24gYWdhaW4uCisJICogIFRoaXMgaXMga2luZGEgdWdseSwgYnV0IHNob3VsZCBuZXZlciBoYXBwZW4uCisJICovCisJaWYgKHBvd2VyZG93bjEpCisJCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7Cit9CisKKworc3RhdGljIGludCBjczQ2MXhfcG93ZXJkb3duKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSwgaW50IHN1c3BlbmRmbGFnKQoreworCWludCBjb3VudDsKKwl1bnNpZ25lZCBpbnQgdG1wPTAsbXV0ZWQ9MDsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyB0eXBlPTB4JXhcbiIsdHlwZSkpOworCWlmKCFjc19wb3dlcmRvd24gJiYgIXN1c3BlbmRmbGFnKQorCXsKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoS0VSTl9JTkZPIAorCQkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpIERJU0FCTEVEIGV4aXRpbmdcbiIpKTsKKwkJcmV0dXJuIDA7CisJfQorCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA4LCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkgcG93ZXJkb3duIHJlZz0weCV4XG4iLHRtcCkpOworLyoKKyogaWYgcG93ZXJpbmcgZG93biBvbmx5IHRoZSBWUkVGLCBhbmQgbm90IHBvd2VyaW5nIGRvd24gdGhlIERBQy9BREMsCisqIHRoZW4gZG8gbm90IHBvd2VyIGRvd24gdGhlIFZSRUYsIFVOTEVTUyBib3RoIHRoZSBEQUMgYW5kIEFEQyBhcmUgbm90CisqIGN1cnJlbnRseSBwb3dlcmVkIGRvd24uICBJZiBwb3dlcmluZyBkb3duIERBQyBhbmQgQURDLCB0aGVuCisqIGl0IGlzIHBvc3NpYmxlIHRvIHBvd2VyIGRvd24gdGhlIFZSRUYgKE9OKS4KKyovCisJaWYgKCAgICAoKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pICYmIAorCQkgKCEodHlwZSAmIENTX1BPV0VSX0FEQykgfHwgKCEodHlwZSAmIENTX1BPV0VSX0RBQykpKSApCisJICAgICAgJiYgCisJCSgodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikgfHwKKwkJICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKSApICkKKwl7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgOCwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKS0gMCAgdW5hYmxlIHRvIHBvd2VyZG93bi4gdG1wPTB4JXhcbiIsdG1wKSk7CisJCXJldHVybiAwOworCX0KKy8qCisqIGZvciBub3csIGFsd2F5cyBrZWVwIHBvd2VyIHRvIHRoZSBtaXhlciBibG9jay4KKyogbm90IHN1cmUgd2h5IGl0J3MgYSBwcm9ibGVtIGJ1dCBpdCBzZWVtcyB0byBiZSBpZiB3ZSBwb3dlciBvZmYuCisqLworCXR5cGUgJj0gfkNTX1BPV0VSX01JWFZPTjsKKwl0eXBlICY9IH5DU19QT1dFUl9NSVhWT0ZGOworCisJLyoKKwkgKiAgUG93ZXIgZG93biBpbmRpY2F0ZWQgYXJlYXMuCisJICovCisJaWYodHlwZSAmIENTX1BPV0VSX01JWFZPRkYpCisJeworCisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgTUlYVk9GRlxuIikpOworCQkvKgorCQkgKiAgUG93ZXIgZG93biB0aGUgTUlYRVIgKFZSRUYgT04pIG9uIHRoZSBBQzk3IGNhcmQuICAKKwkJICovCisJCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikKKwkJeworCQkJaWYoIW11dGVkKQorCQkJeworCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7CisJCQkJbXV0ZWQ9MTsKKwkJCX0KKwkJCXRtcCB8PSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRjsKKwkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7CisJCQkvKgorCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KKwkJCSAqLworCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKKwkJCQkvKgorCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKKwkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KKwkJCQkgKi8KKwkJCQl1ZGVsYXkoNTAwKTsKKworCQkJCS8qCisJCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCisJCQkJICovCisJCQkJaWYgKCEoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAorCQkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTikpCisJCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvKgorCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgorCQkJICovCisJCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAorCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGX09OKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCQkJImNzNDZ4eDogcG93ZXJkb3duIE1JWFZPRkYgZmFpbGVkXG4iKSk7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwl9CisJaWYodHlwZSAmIENTX1BPV0VSX01JWFZPTikKKwl7CisKKwkJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCA0LCAKKwkJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBNSVhWT05cbiIpKTsKKwkJLyoKKwkJICogIFBvd2VyIGRvd24gdGhlIE1JWEVSIChWUkVGIE9OKSBvbiB0aGUgQUM5NyBjYXJkLiAgCisJCSAqLworCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOworCQlpZiAodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTikKKwkJeworCQkJaWYoIW11dGVkKQorCQkJeworCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7CisJCQkJbXV0ZWQ9MTsKKwkJCX0KKwkJCXRtcCB8PSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OOworCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKKwkJCS8qCisJCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgorCQkJICovCisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgeworCQkJCS8qCisJCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQorCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgorCQkJCSAqLworCQkJCXVkZWxheSg1MDApOworCisJCQkJLyoKKwkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KKwkJCQkgKi8KKwkJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT05fT04pKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCQorCQkJLyoKKwkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KKwkJCSAqLworCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCQkJImNzNDZ4eDogcG93ZXJkb3duIE1JWFZPTiBmYWlsZWRcbiIpKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlpZih0eXBlICYgQ1NfUE9XRVJfQURDKQorCXsKKwkJLyoKKwkJICogIFBvd2VyIGRvd24gdGhlIEFEQyBvbiB0aGUgQUM5NyBjYXJkLiAgCisJCSAqLworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpKyBBRENcbiIpKTsKKwkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkJaWYgKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pCisJCXsKKwkJCWlmKCFtdXRlZCkKKwkJCXsKKwkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOworCQkJCW11dGVkPTE7CisJCQl9CisJCQl0bXAgfD0gQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQzsKKwkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7CisKKwkJCS8qCisJCQkgKiAgTm93LCB3ZSB3YWl0IHVudGlsIHdlIHNhbXBsZSBhIHJlYWR5IHN0YXRlLgorCQkJICovCisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAzMjsgY291bnQrKykgeworCQkJCS8qCisJCQkJICogIEZpcnN0LCBsZXRzIHdhaXQgYSBzaG9ydCB3aGlsZSB0byBsZXQgdGhpbmdzIHNldHRsZSBvdXQgYQorCQkJCSAqICBiaXQsIGFuZCB0byBwcmV2ZW50IHJldHJ5aW5nIHRoZSByZWFkIHRvbyBxdWlja2x5LgorCQkJCSAqLworCQkJCXVkZWxheSg1MDApOworCisJCQkJLyoKKwkJCQkgKiAgUmVhZCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG93ZXIgY29udHJvbCByZWdpc3Rlci4KKwkJCQkgKi8KKwkJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqICBDaGVjayB0aGUgc3RhdHVzLi4KKwkJCSAqLworCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCQkJImNzNDZ4eDogcG93ZXJkb3duIEFEQyBmYWlsZWRcbiIpKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlpZih0eXBlICYgQ1NfUE9XRVJfREFDKQorCXsKKwkJLyoKKwkJICogIFBvd2VyIGRvd24gdGhlIERBQyBvbiB0aGUgQUM5NyBjYXJkLiAgCisJCSAqLworCisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSsgREFDXG4iKSk7CisJCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJCWlmICh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OKQorCQl7CisJCQlpZighbXV0ZWQpCisJCQl7CisJCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKKwkJCQltdXRlZD0xOworCQkJfQorCQkJdG1wIHw9IENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUM7CisJCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOworCQkJLyoKKwkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCisJCQkgKi8KKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7CisJCQkJLyoKKwkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCisJCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCisJCQkJICovCisJCQkJdWRlbGF5KDUwMCk7CisKKwkJCQkvKgorCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgorCQkJCSAqLworCQkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpCisJCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvKgorCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgorCQkJICovCisJCQlpZiAoY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKSAmIAorCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pCisJCQl7CisJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJCQkiY3M0Nnh4OiBwb3dlcmRvd24gREFDIGZhaWxlZFxuIikpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJaWYobXV0ZWQpCisJCWNzX211dGUoY2FyZCwgQ1NfRkFMU0UpOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDZ4eDogY3M0NjF4X3Bvd2VyZG93bigpLSAwIHRtcD0weCV4XG4iLHRtcCkpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNzNDZ4eF9wb3dlcnVwKHN0cnVjdCBjc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgdHlwZSkKK3sKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgaW50IHRtcD0wLG11dGVkPTA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDgsIHByaW50ayhLRVJOX0lORk8gCisJCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIHR5cGU9MHgleFxuIix0eXBlKSk7CisJLyoKKwkqIGNoZWNrIGZvciBWUkVGIGFuZCBwb3dlcnVwIGlmIG5lZWQgdG8uCisJKi8KKwlpZih0eXBlICYgQ1NfUE9XRVJfTUlYVk9OKQorCQl0eXBlIHw9IENTX1BPV0VSX01JWFZPRkY7CisJaWYodHlwZSAmIChDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMpKQorCQl0eXBlIHw9IENTX1BPV0VSX01JWFZPTiB8IENTX1BPV0VSX01JWFZPRkY7CisKKwkvKgorCSAqICBQb3dlciB1cCBpbmRpY2F0ZWQgYXJlYXMuCisJICovCisJaWYodHlwZSAmIENTX1BPV0VSX01JWFZPRkYpCisJeworCisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIE1JWFZPRkZcbiIpKTsKKwkJLyoKKwkJICogIFBvd2VyIHVwIHRoZSBNSVhFUiAoVlJFRiBPTikgb24gdGhlIEFDOTcgY2FyZC4gIAorCQkgKi8KKwkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkJaWYgKCEodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pKQorCQl7CisJCQlpZighbXV0ZWQpCisJCQl7CisJCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKKwkJCQltdXRlZD0xOworCQkJfQorCQkJdG1wICY9IH5DU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRjsKKwkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7CisJCQkvKgorCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KKwkJCSAqLworCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKKwkJCQkvKgorCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKKwkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KKwkJCQkgKi8KKwkJCQl1ZGVsYXkoNTAwKTsKKworCQkJCS8qCisJCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCisJCQkJICovCisJCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pCisJCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvKgorCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgorCQkJICovCisJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPRkZfT04pKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAKKwkJCQkJImNzNDZ4eDogcG93ZXJ1cCBNSVhWT0ZGIGZhaWxlZFxuIikpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCWlmKHR5cGUgJiBDU19QT1dFUl9NSVhWT04pCisJeworCisJCUNTX0RCR09VVChDU19GVU5DVElPTiwgNCwgCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCkrIE1JWFZPTlxuIikpOworCQkvKgorCQkgKiAgUG93ZXIgdXAgdGhlIE1JWEVSIChWUkVGIE9OKSBvbiB0aGUgQUM5NyBjYXJkLiAgCisJCSAqLworCQl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOworCQlpZiAoISh0bXAgJiBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSkKKwkJeworCQkJaWYoIW11dGVkKQorCQkJeworCQkJCWNzX211dGUoY2FyZCwgQ1NfVFJVRSk7CisJCQkJbXV0ZWQ9MTsKKwkJCX0KKwkJCXRtcCAmPSB+Q1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTjsKKwkJCWNzX2FjOTdfc2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCwgdG1wICk7CisJCQkvKgorCQkJICogIE5vdywgd2Ugd2FpdCB1bnRpbCB3ZSBzYW1wbGUgYSByZWFkeSBzdGF0ZS4KKwkJCSAqLworCQkJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgMzI7IGNvdW50KyspIHsKKwkJCQkvKgorCQkJCSAqICBGaXJzdCwgbGV0cyB3YWl0IGEgc2hvcnQgd2hpbGUgdG8gbGV0IHRoaW5ncyBzZXR0bGUgb3V0IGEKKwkJCQkgKiAgYml0LCBhbmQgdG8gcHJldmVudCByZXRyeWluZyB0aGUgcmVhZCB0b28gcXVpY2tseS4KKwkJCQkgKi8KKwkJCQl1ZGVsYXkoNTAwKTsKKworCQkJCS8qCisJCQkJICogIFJlYWQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHBvd2VyIGNvbnRyb2wgcmVnaXN0ZXIuCisJCQkJICovCisJCQkJaWYgKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX01JWFZPTl9PTikKKwkJCQkJYnJlYWs7CisJCQl9CisJCQkKKwkJCS8qCisJCQkgKiAgQ2hlY2sgdGhlIHN0YXR1cy4uCisJCQkgKi8KKwkJCWlmICghKGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiAKKwkJCQlDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OKSkKKwkJCXsKKwkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX1dBUk5JTkcgCisJCQkJCSJjczQ2eHg6IHBvd2VydXAgTUlYVk9OIGZhaWxlZFxuIikpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCWlmKHR5cGUgJiBDU19QT1dFUl9BREMpCisJeworCQkvKgorCQkgKiAgUG93ZXIgdXAgdGhlIEFEQyBvbiB0aGUgQUM5NyBjYXJkLiAgCisJCSAqLworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3Bvd2VydXAoKSsgQURDXG4iKSk7CisJCXRtcCA9IGNzX2FjOTdfZ2V0KGNhcmQtPmFjOTdfY29kZWNbMF0sIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJCWlmICghKHRtcCAmIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pKQorCQl7CisJCQlpZighbXV0ZWQpCisJCQl7CisJCQkJY3NfbXV0ZShjYXJkLCBDU19UUlVFKTsKKwkJCQltdXRlZD0xOworCQkJfQorCQkJdG1wICY9IH5DU19BQzk3X1BPV0VSX0NPTlRST0xfQURDOworCQkJY3NfYWM5N19zZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MLCB0bXAgKTsKKworCQkJLyoKKwkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCisJCQkgKi8KKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7CisJCQkJLyoKKwkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCisJCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCisJCQkJICovCisJCQkJdWRlbGF5KDUwMCk7CisKKwkJCQkvKgorCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgorCQkJCSAqLworCQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9BRENfT04pCisJCQkJCWJyZWFrOworCQkJfQorCisJCQkvKgorCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgorCQkJICovCisJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0FEQ19PTikpCisJCQl7CisJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIEFEQyBmYWlsZWRcbiIpKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlpZih0eXBlICYgQ1NfUE9XRVJfREFDKQorCXsKKwkJLyoKKwkJICogIFBvd2VyIHVwIHRoZSBEQUMgb24gdGhlIEFDOTcgY2FyZC4gIAorCQkgKi8KKworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcG93ZXJ1cCgpKyBEQUNcbiIpKTsKKwkJdG1wID0gY3NfYWM5N19nZXQoY2FyZC0+YWM5N19jb2RlY1swXSwgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkJaWYgKCEodG1wICYgQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpCisJCXsKKwkJCWlmKCFtdXRlZCkKKwkJCXsKKwkJCQljc19tdXRlKGNhcmQsIENTX1RSVUUpOworCQkJCW11dGVkPTE7CisJCQl9CisJCQl0bXAgJj0gfkNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUM7CisJCQljc19hYzk3X3NldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wsIHRtcCApOworCQkJLyoKKwkJCSAqICBOb3csIHdlIHdhaXQgdW50aWwgd2Ugc2FtcGxlIGEgcmVhZHkgc3RhdGUuCisJCQkgKi8KKwkJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDMyOyBjb3VudCsrKSB7CisJCQkJLyoKKwkJCQkgKiAgRmlyc3QsIGxldHMgd2FpdCBhIHNob3J0IHdoaWxlIHRvIGxldCB0aGluZ3Mgc2V0dGxlIG91dCBhCisJCQkJICogIGJpdCwgYW5kIHRvIHByZXZlbnQgcmV0cnlpbmcgdGhlIHJlYWQgdG9vIHF1aWNrbHkuCisJCQkJICovCisJCQkJdWRlbGF5KDUwMCk7CisKKwkJCQkvKgorCQkJCSAqICBSZWFkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb3dlciBjb250cm9sIHJlZ2lzdGVyLgorCQkJCSAqLworCQkJCWlmIChjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJCUNTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUNfT04pCisJCQkJCWJyZWFrOworCQkJfQorCQkJCisJCQkvKgorCQkJICogIENoZWNrIHRoZSBzdGF0dXMuLgorCQkJICovCisJCQlpZiAoIShjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgCisJCQkJQ1NfQUM5N19QT1dFUl9DT05UUk9MX0RBQ19PTikpCisJCQl7CisJCQkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9XQVJOSU5HIAorCQkJCQkiY3M0Nnh4OiBwb3dlcnVwIERBQyBmYWlsZWRcbiIpKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwl0bXAgPSBjc19hYzk3X2dldChjYXJkLT5hYzk3X2NvZGVjWzBdLCBBQzk3X1BPV0VSX0NPTlRST0wpOworCWlmKG11dGVkKQorCQljc19tdXRlKGNhcmQsIENTX0ZBTFNFKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8gCisJCSJjczQ2eHg6IGNzNDZ4eF9wb3dlcnVwKCktIDAgdG1wPTB4JXhcbiIsdG1wKSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgY3M0NjF4X3Byb2Nfc3RhcnQoc3RydWN0IGNzX2NhcmQgKmNhcmQpCit7CisJaW50IGNudDsKKworCS8qCisJICogIFNldCB0aGUgZnJhbWUgdGltZXIgdG8gcmVmbGVjdCB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBwZXIgZnJhbWUuCisJICovCisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0ZSTVQsIDB4YWRmKTsKKwkvKgorCSAqICBUdXJuIG9uIHRoZSBydW4sIHJ1biBhdCBmcmFtZSwgYW5kIERNQSBlbmFibGUgYml0cyBpbiB0aGUgbG9jYWwgY29weSBvZgorCSAqICB0aGUgU1AgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfU1BDUiwgU1BDUl9SVU4gfCBTUENSX1JVTkZSIHwgU1BDUl9EUlFFTik7CisJLyoKKwkgKiAgV2FpdCB1bnRpbCB0aGUgcnVuIGF0IGZyYW1lIGJpdCByZXNldHMgaXRzZWxmIGluIHRoZSBTUCBjb250cm9sCisJICogIHJlZ2lzdGVyLgorCSAqLworCWZvciAoY250ID0gMDsgY250IDwgMjU7IGNudCsrKSB7CisJCXVkZWxheSg1MCk7CisJCWlmICghKGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9TUENSKSAmIFNQQ1JfUlVORlIpKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9TUENSKSAmIFNQQ1JfUlVORlIpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImNzNDZ4eDogU1BDUl9SVU5GUiBuZXZlciByZXNldFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIGNzNDYxeF9wcm9jX3N0b3Aoc3RydWN0IGNzX2NhcmQgKmNhcmQpCit7CisJLyoKKwkgKiAgVHVybiBvZmYgdGhlIHJ1biwgcnVuIGF0IGZyYW1lLCBhbmQgRE1BIGVuYWJsZSBiaXRzIGluIHRoZSBsb2NhbCBjb3B5IG9mCisJICogIHRoZSBTUCBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9TUENSLCAwKTsKK30KKworc3RhdGljIGludCBjc19oYXJkd2FyZV9pbml0KHN0cnVjdCBjc19jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgZW5kX3RpbWU7CisJdW5zaWduZWQgaW50IHRtcCxjb3VudDsKKwkKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0Nnh4OiBjc19oYXJkd2FyZV9pbml0KCkrXG4iKSApOworCS8qIAorCSAqICBGaXJzdCwgYmxhc3QgdGhlIGNsb2NrIGNvbnRyb2wgcmVnaXN0ZXIgdG8gemVybyBzbyB0aGF0IHRoZSBQTEwgc3RhcnRzCisgICAgICAgICAqICBvdXQgaW4gYSBrbm93biBzdGF0ZSwgYW5kIGJsYXN0IHRoZSBtYXN0ZXIgc2VyaWFsIHBvcnQgY29udHJvbCByZWdpc3RlcgorICAgICAgICAgKiAgdG8gemVybyBzbyB0aGF0IHRoZSBzZXJpYWwgcG9ydHMgYWxzbyBzdGFydCBvdXQgaW4gYSBrbm93biBzdGF0ZS4KKyAgICAgICAgICovCisgICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIDApOworICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCAwKTsKKworCS8qCisJICogIElmIHdlIGFyZSBpbiBBQzk3IG1vZGUsIHRoZW4gd2UgbXVzdCBzZXQgdGhlIHBhcnQgdG8gYSBob3N0IGNvbnRyb2xsZWQKKyAgICAgICAgICogIEFDLWxpbmsuICBPdGhlcndpc2UsIHdlIHdvbid0IGJlIGFibGUgdG8gYnJpbmcgdXAgdGhlIGxpbmsuCisgICAgICAgICAqLyAgICAgICAgCisgICAgICAgIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ09ERUNfVFlQRV8xXzAzKTsJLyogMS4wMyBjYXJkICovCisgICAgICAgIC8qIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9TRVJBQ0MsIFNFUkFDQ19IU1AgfCBTRVJBQ0NfQ09ERUNfVFlQRV8yXzApOyAqLyAvKiAyLjAwIGNhcmQgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiAgRHJpdmUgdGhlIEFSU1QjIHBpbiBsb3cgZm9yIGEgbWluaW11bSBvZiAxdVMgKGFzIGRlZmluZWQgaW4gdGhlIEFDOTcKKyAgICAgICAgICogIHNwZWMpIGFuZCB0aGVuIGRyaXZlIGl0IGhpZ2guICBUaGlzIGlzIGRvbmUgZm9yIG5vbiBBQzk3IG1vZGVzIHNpbmNlCisgICAgICAgICAqICB0aGVyZSBtaWdodCBiZSBsb2dpYyBleHRlcm5hbCB0byB0aGUgQ1M0NjF4IHRoYXQgdXNlcyB0aGUgQVJTVCMgbGluZQorICAgICAgICAgKiAgZm9yIGEgcmVzZXQuCisgICAgICAgICAqLworICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDEpOworICAgICAgICB1ZGVsYXkoNTApOworICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIDApOworICAgICAgICB1ZGVsYXkoNTApOworICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX1JTVE4pOworCisJLyoKKwkgKiAgVGhlIGZpcnN0IHRoaW5nIHdlIGRvIGhlcmUgaXMgdG8gZW5hYmxlIHN5bmMgZ2VuZXJhdGlvbi4gIEFzIHNvb24KKwkgKiAgYXMgd2Ugc3RhcnQgcmVjZWl2aW5nIGJpdCBjbG9jaywgd2UnbGwgc3RhcnQgcHJvZHVjaW5nIHRoZSBTWU5DCisJICogIHNpZ25hbC4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX0VTWU4gfCBBQ0NUTF9SU1ROKTsKKworCS8qCisJICogIE5vdyB3YWl0IGZvciBhIHNob3J0IHdoaWxlIHRvIGFsbG93IHRoZSBBQzk3IHBhcnQgdG8gc3RhcnQKKwkgKiAgZ2VuZXJhdGluZyBiaXQgY2xvY2sgKHNvIHdlIGRvbid0IHRyeSB0byBzdGFydCB0aGUgUExMIHdpdGhvdXQgYW4KKwkgKiAgaW5wdXQgY2xvY2spLgorCSAqLworCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOwkJLyogMSBzaG91bGQgYmUgZW5vdWdoID8/IChhbmQgcGlncyBtaWdodCBmbHkpICovCisKKwkvKgorCSAqICBTZXQgdGhlIHNlcmlhbCBwb3J0IHRpbWluZyBjb25maWd1cmF0aW9uLCBzbyB0aGF0CisJICogIHRoZSBjbG9jayBjb250cm9sIGNpcmN1aXQgZ2V0cyBpdHMgY2xvY2sgZnJvbSB0aGUgY29ycmVjdCBwbGFjZS4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCBTRVJNQzFfUFRDX0FDOTcpOworCisJLyoKKwkqIFRoZSBwYXJ0IHNlZW1zIHRvIG5vdCBiZSByZWFkeSBmb3IgYSB3aGlsZSBhZnRlciBhIHJlc3VtZS4KKwkqIHNvLCBpZiB3ZSBhcmUgcmVzdW1pbmcsIHRoZW4gd2FpdCBmb3IgNzAwIG1pbHMuICBOb3RlIHRoYXQgNjAwIG1pbHMKKwkqIGlzIG5vdCBlbm91Z2ggZm9yIHNvbWUgcGxhdGZvcm1zISB0ZXN0ZWQgb24gYW4gSUJNIFRoaW5rcGFkcyBhbmQgCisJKiByZWZlcmVuY2UgY2FyZHMuCisJKi8KKwlpZighKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpKQorCQltZGVsYXkoaW5pdGRlbGF5KTsKKwkvKgorCSAqICBXcml0ZSB0aGUgc2VsZWN0ZWQgY2xvY2sgY29udHJvbCBzZXR1cCB0byB0aGUgaGFyZHdhcmUuICBEbyBub3QgdHVybiBvbgorCSAqICBTV0NFIHlldCAoaWYgcmVxdWVzdGVkKSwgc28gdGhhdCB0aGUgZGV2aWNlcyBjbG9ja2VkIGJ5IHRoZSBvdXRwdXQgb2YKKwkgKiAgUExMIGFyZSBub3QgY2xvY2tlZCB1bnRpbCB0aGUgUExMIGlzIHN0YWJsZS4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfUExMQ0MsIFBMTENDX0xQRl8xMDUwXzI3ODBfS0haIHwgUExMQ0NfQ0RSXzczXzEwNF9NSFopOworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9QTExNLCAweDNhKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IyLCBDTEtDUjJfUERJVlNfOCk7CisKKwkvKgorCSAqICBQb3dlciB1cCB0aGUgUExMLgorCSAqLworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIENMS0NSMV9QTExQKTsKKworCS8qCisgICAgICAgICAqICBXYWl0IHVudGlsIHRoZSBQTEwgaGFzIHN0YWJpbGl6ZWQuCisJICovCisJbWRlbGF5KDUgKiBjc19sYXB0b3Bfd2FpdCk7CQkvKiBBZ2FpbiAxIHNob3VsZCBiZSBlbm91Z2ggPz8gKi8KKworCS8qCisJICogIFR1cm4gb24gY2xvY2tpbmcgb2YgdGhlIGNvcmUgc28gdGhhdCB3ZSBjYW4gc2V0dXAgdGhlIHNlcmlhbCBwb3J0cy4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSB8IENMS0NSMV9TV0NFOworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7CisKKwkvKgorCSAqICBGaWxsIHRoZSBzZXJpYWwgcG9ydCBGSUZPcyB3aXRoIHNpbGVuY2UuCisJICovCisJY3M0NjF4X2NsZWFyX3NlcmlhbF9GSUZPcyhjYXJkLENTX1RZUEVfREFDIHwgQ1NfVFlQRV9BREMpOworCisJLyoKKwkgKiAgU2V0IHRoZSBzZXJpYWwgcG9ydCBGSUZPIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHNhbXBsZSBpbiB0aGUgRklGTy4KKwkgKi8KKwkvKiBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQlNQLCAwKTsgKi8KKworCS8qCisJICogIFdyaXRlIHRoZSBzZXJpYWwgcG9ydCBjb25maWd1cmF0aW9uIHRvIHRoZSBwYXJ0LiAgVGhlIG1hc3RlcgorCSAqICBlbmFibGUgYml0IGlzIG5vdCBzZXQgdW50aWwgYWxsIG90aGVyIHZhbHVlcyBoYXZlIGJlZW4gd3JpdHRlbi4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQzEsIFNFUkMxX1NPMUZfQUM5NyB8IFNFUkMxX1NPMUVOKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSQzIsIFNFUkMyX1NJMUZfQUM5NyB8IFNFUkMxX1NPMUVOKTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfU0VSTUMxLCBTRVJNQzFfUFRDX0FDOTcgfCBTRVJNQzFfTVNQRSk7CisKKworCW1kZWxheSg1ICogY3NfbGFwdG9wX3dhaXQpOwkJLyogU2hvdWxkbnQgYmUgbmVlZGVkID8/ICovCisJCisvKgorKiBJZiB3ZSBhcmUgcmVzdW1pbmcgdW5kZXIgMi4yLnggdGhlbiB3ZSBjYW4gbm90IHNjaGVkdWxlIGEgdGltZW91dC4KKyogc28sIGp1c3Qgc3BpbiB0aGUgQ1BVLgorKi8KKwlpZihjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKQorCXsKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSBjYXJkIHJlYWR5IHNpZ25hbCBmcm9tIHRoZSBBQzk3IGNhcmQuCisJICovCisJCWVuZF90aW1lID0gamlmZmllcyArIDMgKiAoSFogPj4gMik7CisJCWRvIHsKKwkJLyoKKwkJICogIFJlYWQgdGhlIEFDOTcgc3RhdHVzIHJlZ2lzdGVyIHRvIHNlZSBpZiB3ZSd2ZSBzZWVuIGEgQ09ERUMgUkVBRFkKKwkJICogIHNpZ25hbCBmcm9tIHRoZSBBQzk3IGNhcmQuCisJCSAqLworCQkJaWYgKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ1NUUykgJiBBQ1NUU19DUkRZKQorCQkJCWJyZWFrOworCQkJY3VycmVudC0+c3RhdGUgPSBUQVNLX1VOSU5URVJSVVBUSUJMRTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0gd2hpbGUgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGVuZF90aW1lKSk7CisJfQorCWVsc2UKKwl7CisJCWZvciAoY291bnQgPSAwOyBjb3VudCA8IDEwMDsgY291bnQrKykgeworCQkvLyBGaXJzdCwgd2Ugd2FudCB0byB3YWl0IGZvciBhIHNob3J0IHRpbWUuCisJCQl1ZGVsYXkoMjUgKiBjc19sYXB0b3Bfd2FpdCk7CisKKwkJCWlmIChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfQ1JEWSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCS8qCisJICogIE1ha2Ugc3VyZSBDT0RFQyBpcyBSRUFEWS4KKwkgKi8KKwlpZiAoIShjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNTVFMpICYgQUNTVFNfQ1JEWSkpIHsKKwkJQ1NfREJHT1VUKENTX0VSUk9SIHwgQ1NfSU5JVCwgMSwgcHJpbnRrKEtFUk5fV0FSTklORyAgCisJCQkiY3M0Nnh4OiBjcmVhdGUgLSBuZXZlciByZWFkIGNhcmQgcmVhZHkgZnJvbSBBQyc5N1xuIikpOworCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9XQVJOSU5HICAKKwkJCSJjczQ2eHg6IHByb2JhYmx5IG5vdCBhIGJ1ZywgdHJ5IHVzaW5nIHRoZSBDUzQyMzIgZHJpdmVyLFxuIikpOworCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoS0VSTl9XQVJOSU5HICAKKwkJCSJjczQ2eHg6IG9yIHR1cm4gb2ZmIGFueSBhdXRvbWF0aWMgUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IGluIHRoZSBCSU9TLlxuIikpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKgorCSAqICBBc3NlcnQgdGhlIHZhaWQgZnJhbWUgc2lnbmFsIHNvIHRoYXQgd2UgY2FuIHN0YXJ0IHNlbmRpbmcgY29tbWFuZHMKKwkgKiAgdG8gdGhlIEFDOTcgY2FyZC4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQUNDVEwsIEFDQ1RMX1ZGUk0gfCBBQ0NUTF9FU1lOIHwgQUNDVExfUlNUTik7CisKKwlpZihjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKQorCXsKKwkvKgorCSAqICBXYWl0IHVudGlsIHdlJ3ZlIHNhbXBsZWQgaW5wdXQgc2xvdHMgMyBhbmQgNCBhcyB2YWxpZCwgbWVhbmluZyB0aGF0CisJICogIHRoZSBjYXJkIGlzIHB1bXBpbmcgQURDIGRhdGEgYWNyb3NzIHRoZSBBQy1saW5rLgorCSAqLworCQllbmRfdGltZSA9IGppZmZpZXMgKyAzICogKEhaID4+IDIpOworCQlkbyB7CisJCQkvKgorCQkJICogIFJlYWQgdGhlIGlucHV0IHNsb3QgdmFsaWQgcmVnaXN0ZXIgYW5kIHNlZSBpZiBpbnB1dCBzbG90cyAzIGFuZAorCQkJICogIDQgYXJlIHZhbGlkIHlldC4KKwkJCSAqLworCQkJaWYgKChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNJU1YpICYgKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgPT0gKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkKKwkJCQlicmVhazsKKwkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CisJCQlzY2hlZHVsZV90aW1lb3V0KDEpOworCQl9IHdoaWxlICh0aW1lX2JlZm9yZShqaWZmaWVzLCBlbmRfdGltZSkpOworCX0KKwllbHNlCisJeworCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCAxMDA7IGNvdW50KyspIHsKKwkJLy8gRmlyc3QsIHdlIHdhbnQgdG8gd2FpdCBmb3IgYSBzaG9ydCB0aW1lLgorCQkJdWRlbGF5KDI1ICogY3NfbGFwdG9wX3dhaXQpOworCisJCQlpZiAoKGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9BQ0lTVikgJiAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKSA9PSAoQUNJU1ZfSVNWMyB8IEFDSVNWX0lTVjQpKQorCQkJCWJyZWFrOworCQl9CisJfQorCS8qCisJICogIE1ha2Ugc3VyZSBpbnB1dCBzbG90cyAzIGFuZCA0IGFyZSB2YWxpZC4gIElmIG5vdCwgdGhlbiByZXR1cm4KKwkgKiAgYW4gZXJyb3IuCisJICovCisJaWYgKChjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQUNJU1YpICYgKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgIT0gKEFDSVNWX0lTVjMgfCBBQ0lTVl9JU1Y0KSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJjczQ2eHg6IGNyZWF0ZSAtIG5ldmVyIHJlYWQgSVNWMyAmIElTVjQgZnJvbSBBQyc5N1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qCisJICogIE5vdywgYXNzZXJ0IHZhbGlkIGZyYW1lIGFuZCB0aGUgc2xvdCAzIGFuZCA0IHZhbGlkIGJpdHMuICBUaGlzIHdpbGwKKwkgKiAgY29tbWVuc2UgdGhlIHRyYW5zZmVyIG9mIGRpZ2l0YWwgYXVkaW8gZGF0YSB0byB0aGUgQUM5NyBjYXJkLgorCSAqLworCWNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9BQ09TViwgQUNPU1ZfU0xWMyB8IEFDT1NWX1NMVjQpOworCisJLyoKKwkgKiAgVHVybiBvZmYgdGhlIFByb2Nlc3NvciBieSB0dXJuaW5nIG9mZiB0aGUgc29mdHdhcmUgY2xvY2sgZW5hYmxlIGZsYWcgaW4gCisJICogIHRoZSBjbG9jayBjb250cm9sIHJlZ2lzdGVyLgorCSAqLworCS8qIHRtcCA9IGNzNDYxeF9wZWVrQkEwKGNhcmQsIEJBMF9DTEtDUjEpICYgfkNMS0NSMV9TV0NFOyAqLworCS8qIGNzNDYxeF9wb2tlQkEwKGNhcmQsIEJBMF9DTEtDUjEsIHRtcCk7ICovCisKKwkvKgorICAgICAgICAgKiAgUmVzZXQgdGhlIHByb2Nlc3Nvci4KKyAgICAgICAgICovCisJY3M0NjF4X3Jlc2V0KGNhcmQpOworCisJLyoKKyAgICAgICAgICogIERvd25sb2FkIHRoZSBpbWFnZSB0byB0aGUgcHJvY2Vzc29yLgorCSAqLworCQorCWNzNDYxeF9kb3dubG9hZF9pbWFnZShjYXJkKTsKKworCS8qCisgICAgICAgICAqICBTdG9wIHBsYXliYWNrIERNQS4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUENUTCk7CisJY2FyZC0+cGN0bCA9IHRtcCAmIDB4ZmZmZjAwMDA7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX1BDVEwsIHRtcCAmIDB4MDAwMGZmZmYpOworCisJLyoKKyAgICAgICAgICogIFN0b3AgY2FwdHVyZSBETUEuCisJICovCisJdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NDVEwpOworCWNhcmQtPmNjdGwgPSB0bXAgJiAweDAwMDBmZmZmOworCWNzNDYxeF9wb2tlKGNhcmQsIEJBMV9DQ1RMLCB0bXAgJiAweGZmZmYwMDAwKTsKKworCS8qIGluaXRpYWxpemUgQUM5NyBjb2RlYyBhbmQgcmVnaXN0ZXIgL2Rldi9taXhlciAqLworCWlmKGNhcmQtPnBtLmZsYWdzICYgQ1M0NlhYX1BNX0lETEUpCisJeworCQlpZiAoY3NfYWM5N19pbml0KGNhcmQpIDw9IDApCisJCXsKKwkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkJImNzNDZ4eDogY3NfYWM5N19pbml0KCkgZmFpbHVyZVxuIikgKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJfQorCWVsc2UKKwl7CisJCWNzNDZ4eF9hYzk3X3Jlc3VtZShjYXJkKTsKKwl9CisJCisJY3M0NjF4X3Byb2Nfc3RhcnQoY2FyZCk7CisKKwkvKgorCSAqICBFbmFibGUgaW50ZXJydXB0cyBvbiB0aGUgcGFydC4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfSElDUiwgSElDUl9JRVYgfCBISUNSX0NIR00pOworCisJdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX1BGSUUpOworCXRtcCAmPSB+MHgwMDAwZjAzZjsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgdG1wKTsJLyogcGxheWJhY2sgaW50ZXJydXB0IGVuYWJsZSAqLworCisJdG1wID0gY3M0NjF4X3BlZWsoY2FyZCwgQkExX0NJRSk7CisJdG1wICY9IH4weDAwMDAwMDNmOworCXRtcCB8PSAgMHgwMDAwMDAwMTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfQ0lFLCB0bXApOwkvKiBjYXB0dXJlIGludGVycnVwdCBlbmFibGUgKi8JCisKKwkvKgorCSAqICBJZiBJRExFIHRoZW4gUG93ZXIgZG93biB0aGUgcGFydC4gIFdlIHdpbGwgcG93ZXIgY29tcG9uZW50cyB1cCAKKwkgKiAgd2hlbiB3ZSBuZWVkIHRoZW0uICAKKwkgKi8KKwlpZihjYXJkLT5wbS5mbGFncyAmIENTNDZYWF9QTV9JRExFKQorCXsKKwkJaWYoIWNzX3Bvd2VyZG93bikKKwkJeworCQkJaWYoICh0bXAgPSBjczQ2eHhfcG93ZXJ1cChjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAorCQkJCQlDU19QT1dFUl9NSVhWT04gKSkgKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcnVwKCkgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJaWYoICh0bXAgPSBjczQ2MXhfcG93ZXJkb3duKGNhcmQsIENTX1BPV0VSX0RBQyB8IENTX1BPV0VSX0FEQyB8CisJCQkJCUNTX1BPV0VSX01JWFZPTiwgQ1NfRkFMU0UgKSkgKQorCQkJeworCQkJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkJCSJjczQ2eHg6IGNzNDYxeF9wb3dlcmRvd24oKSBmYWlsdXJlICgweCV4KVxuIix0bXApICk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfSU5JVCwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDZ4eDogY3NfaGFyZHdhcmVfaW5pdCgpLSAwXG4iKSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGluc3RhbGwgdGhlIGRyaXZlciwgd2UgZG8gbm90IGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWwgbm9yIERNQSBidWZmZXIgbm93LCB0aGV5IGFyZSBkZWZlcmVkIAorICAgdW50aWwgIkFDQ0VTUyIgdGltZSAoaW4gcHJvZ19kbWFidWYgY2FsbGVkIGJ5IG9wZW4vcmVhZC93cml0ZS9pb2N0bC9tbWFwKSAqLworICAgCisvKgorICoJQ2FyZCBzdWJpZCB0YWJsZQorICovCisgCitzdHJ1Y3QgY3NfY2FyZF90eXBlCit7CisJdTE2IHZlbmRvcjsKKwl1MTYgaWQ7CisJY2hhciAqbmFtZTsKKwl2b2lkICgqYW1wKShzdHJ1Y3QgY3NfY2FyZCAqLCBpbnQpOworCXZvaWQgKCphbXBfaW5pdCkoc3RydWN0IGNzX2NhcmQgKik7CisJdm9pZCAoKmFjdGl2ZSkoc3RydWN0IGNzX2NhcmQgKiwgaW50KTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgY3NfY2FyZF90eXBlIGNhcmRzW10gPSB7CisJeworCQkudmVuZG9yCT0gMHgxNDg5LAorCQkuaWQJPSAweDcwMDEsCisJCS5uYW1lCT0gIkdlbml1cyBTb3VuZG1ha2VyIDEyOCB2YWx1ZSIsCisJCS5hbXAJPSBhbXBfbm9uZSwKKwl9LAorCXsKKwkJLnZlbmRvcgk9IDB4NTA1MywKKwkJLmlkCT0gMHgzMzU3LAorCQkubmFtZQk9ICJWb3lldHJhIiwKKwkJLmFtcAk9IGFtcF92b3lldHJhLAorCX0sCisJeworCQkudmVuZG9yCT0gMHgxMDcxLAorCQkuaWQJPSAweDYwMDMsCisJCS5uYW1lCT0gIk1pdGFjIE1JNjAyMC8yMSIsCisJCS5hbXAJPSBhbXBfdm95ZXRyYSwKKwl9LAorCXsKKwkJLnZlbmRvcgk9IDB4MTRBRiwKKwkJLmlkCT0gMHgwMDUwLAorCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAorCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAorCX0sCisJeworCQkudmVuZG9yCT0gMHgxNjgxLAorCQkuaWQJPSAweDAwNTAsCisJCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCisJCS5hbXAJPSBhbXBfaGVyY3VsZXMsCisJfSwKKwl7CisJCS52ZW5kb3IJPSAweDE2ODEsCisJCS5pZAk9IDB4MDA1MSwKKwkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKKwkJLmFtcAk9IGFtcF9oZXJjdWxlcywKKwl9LAorCXsKKwkJLnZlbmRvcgk9IDB4MTY4MSwKKwkJLmlkCT0gMHgwMDUyLAorCQkubmFtZQk9ICJIZXJjdWxlcyBHYW1lIFRoZWF0cmUgWFAiLAorCQkuYW1wCT0gYW1wX2hlcmN1bGVzLAorCX0sCisJeworCQkudmVuZG9yCT0gMHgxNjgxLAorCQkuaWQJPSAweDAwNTMsCisJCS5uYW1lCT0gIkhlcmN1bGVzIEdhbWUgVGhlYXRyZSBYUCIsCisJCS5hbXAJPSBhbXBfaGVyY3VsZXMsCisJfSwKKwl7CisJCS52ZW5kb3IJPSAweDE2ODEsCisJCS5pZAk9IDB4MDA1NCwKKwkJLm5hbWUJPSAiSGVyY3VsZXMgR2FtZSBUaGVhdHJlIFhQIiwKKwkJLmFtcAk9IGFtcF9oZXJjdWxlcywKKwl9LAorCXsKKwkJLnZlbmRvcgk9IDB4MTY4MSwKKwkJLmlkCT0gMHhhMDEwLAorCQkubmFtZQk9ICJIZXJjdWxlcyBGb3J0aXNzaW1vIElJIiwKKwkJLmFtcAk9IGFtcF9ub25lLAorCX0sCisJLyogTm90IHN1cmUgaWYgdGhlIDU3MCBuZWVkcyB0aGUgY2xrcnVuIGhhY2sgKi8KKwl7CisJCS52ZW5kb3IJPSBQQ0lfVkVORE9SX0lEX0lCTSwKKwkJLmlkCT0gMHgwMTMyLAorCQkubmFtZQk9ICJUaGlua3BhZCA1NzAiLAorCQkuYW1wCT0gYW1wX25vbmUsCisJCS5hY3RpdmUJPSBjbGtydW5faGFjaywKKwl9LAorCXsKKwkJLnZlbmRvcgk9IFBDSV9WRU5ET1JfSURfSUJNLAorCQkuaWQJPSAweDAxNTMsCisJCS5uYW1lCT0gIlRoaW5rcGFkIDYwMFgvQTIwL1QyMCIsCisJCS5hbXAJPSBhbXBfbm9uZSwKKwkJLmFjdGl2ZQk9IGNsa3J1bl9oYWNrLAorCX0sCisJeworCQkudmVuZG9yCT0gUENJX1ZFTkRPUl9JRF9JQk0sCisJCS5pZAk9IDB4MTAxMCwKKwkJLm5hbWUJPSAiVGhpbmtwYWQgNjAwRSAodW5zdXBwb3J0ZWQpIiwKKwl9LAorCXsKKwkJLm5hbWUJPSAiQ2FyZCB3aXRob3V0IFNTSUQgc2V0IiwKKwl9LAorCXsgMCwgfSwKK307CisKK01PRFVMRV9BVVRIT1IoIkFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+LCBKYXJvc2xhdiBLeXNlbGEsIDxwY2F1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3J5c3RhbCBTb3VuZEZ1c2lvbiBBdWRpbyBTdXBwb3J0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworc3RhdGljIGNvbnN0IGNoYXIgY3M0Nnh4X2Jhbm5lcltdID0gS0VSTl9JTkZPICJDcnlzdGFsIDQyODAvNDZ4eCArIEFDOTcgQXVkaW8sIHZlcnNpb24gIiBDUzQ2WFhfTUFKT1JfVkVSU0lPTiAiLiIgQ1M0NlhYX01JTk9SX1ZFUlNJT04gIi4iIENTNDZYWF9BUkNIICIsICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiI7CitzdGF0aWMgY29uc3QgY2hhciBmbmRtc2dbXSA9IEtFUk5fSU5GTyAiY3M0Nnh4OiBGb3VuZCAlZCBhdWRpbyBkZXZpY2UocykuXG4iOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBjczQ2eHhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsCisJCQkJICBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCit7CisJc3RydWN0IHBtX2RldiAqcG1kZXY7CisJaW50IGksajsKKwl1MTYgc3NfY2FyZCwgc3NfdmVuZG9yOworCXN0cnVjdCBjc19jYXJkICpjYXJkOworCWRtYV9hZGRyX3QgZG1hX21hc2s7CisJc3RydWN0IGNzX2NhcmRfdHlwZSAqY3AgPSAmY2FyZHNbMF07CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19JTklULCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogcHJvYmUoKStcbiIpKTsKKworCWRtYV9tYXNrID0gMHhmZmZmZmZmZjsJLyogdGhpcyBlbmFibGVzIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgKi8KKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpIHsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDZ4eDogcGNpX2VuYWJsZV9kZXZpY2UoKSBmYWlsZWRcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIVJTUkNJU01FTU9SWVJFR0lPTihwY2lfZGV2LCAwKSB8fAorCSAgICAhUlNSQ0lTTUVNT1JZUkVHSU9OKHBjaV9kZXYsIDEpKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDZ4eDogcHJvYmUoKS0gTWVtb3J5IHJlZ2lvbiBub3QgYXNzaWduZWRcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAocGNpX2Rldi0+aXJxID09IDApIHsKKwkJQ1NfREJHT1VUKENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKKwkJCSAiY3M0Nnh4OiBwcm9iZSgpIElSUSBub3QgYXNzaWduZWRcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIXBjaV9kbWFfc3VwcG9ydGVkKHBjaV9kZXYsIDB4ZmZmZmZmZmYpKSB7CisJCUNTX0RCR09VVChDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCSAgICAgICJjczQ2eHg6IHByb2JlKCkgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnNzX3ZlbmRvcik7CisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpX2RldiwgUENJX1NVQlNZU1RFTV9JRCwgJnNzX2NhcmQpOworCisJaWYgKChjYXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGNzX2NhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKCpjYXJkKSk7CisJY2FyZC0+YmEwX2FkZHIgPSBSU1JDQUREUkVTUyhwY2lfZGV2LCAwKTsKKwljYXJkLT5iYTFfYWRkciA9IFJTUkNBRERSRVNTKHBjaV9kZXYsIDEpOworCWNhcmQtPnBjaV9kZXYgPSBwY2lfZGV2OworCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKKwljYXJkLT5tYWdpYyA9IENTX0NBUkRfTUFHSUM7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmxvY2spOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5hYzk3X2xvY2spOworCisJcGNpX3NldF9tYXN0ZXIocGNpX2Rldik7CisKKwlwcmludGsoY3M0Nnh4X2Jhbm5lcik7CisJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBDYXJkIGZvdW5kIGF0IDB4JTA4bHggYW5kIDB4JTA4bHgsIElSUSAlZFxuIiwKKwkgICAgICAgY2FyZC0+YmEwX2FkZHIsIGNhcmQtPmJhMV9hZGRyLCBjYXJkLT5pcnEpOworCisJY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBjc19hbGxvY19wY21fY2hhbm5lbDsKKwljYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwgPSBjc19hbGxvY19yZWNfcGNtX2NoYW5uZWw7CisJY2FyZC0+ZnJlZV9wY21fY2hhbm5lbCA9IGNzX2ZyZWVfcGNtX2NoYW5uZWw7CisJY2FyZC0+YW1wbGlmaWVyX2N0cmwgPSBhbXBfbm9uZTsKKwljYXJkLT5hY3RpdmVfY3RybCA9IGFtcF9ub25lOworCisJd2hpbGUgKGNwLT5uYW1lKQorCXsKKwkJaWYoY3AtPnZlbmRvciA9PSBzc192ZW5kb3IgJiYgY3AtPmlkID09IHNzX2NhcmQpCisJCXsKKwkJCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gY3AtPmFtcDsKKwkJCWlmKGNwLT5hY3RpdmUpCisJCQkJY2FyZC0+YWN0aXZlX2N0cmwgPSBjcC0+YWN0aXZlOworCQkJaWYoY3AtPmFtcF9pbml0KQorCQkJCWNhcmQtPmFtcF9pbml0ID0gY3AtPmFtcF9pbml0OworCQkJYnJlYWs7CisJCX0KKwkJY3ArKzsKKwl9CisJaWYgKGNwLT5uYW1lPT1OVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBVbmtub3duIGNhcmQgKCUwNFg6JTA0WCkgYXQgMHglMDhseC8weCUwOGx4LCBJUlEgJWRcbiIsCisJCQlzc192ZW5kb3IsIHNzX2NhcmQsIGNhcmQtPmJhMF9hZGRyLCBjYXJkLT5iYTFfYWRkciwgIGNhcmQtPmlycSk7CisJfQorCWVsc2UKKwl7CisJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogJXMgKCUwNFg6JTA0WCkgYXQgMHglMDhseC8weCUwOGx4LCBJUlEgJWRcbiIsCisJCQljcC0+bmFtZSwgc3NfdmVuZG9yLCBzc19jYXJkLCBjYXJkLT5iYTBfYWRkciwgY2FyZC0+YmExX2FkZHIsIGNhcmQtPmlycSk7CisJfQorCQorCWlmIChjYXJkLT5hbXBsaWZpZXJfY3RybD09TlVMTCkKKwl7CisJCWNhcmQtPmFtcGxpZmllcl9jdHJsID0gYW1wX25vbmU7CisJCWNhcmQtPmFjdGl2ZV9jdHJsID0gY2xrcnVuX2hhY2s7CisJfQkJCisKKwlpZiAoZXh0ZXJuYWxfYW1wID09IDEpCisJeworCQlwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IENyeXN0YWwgRUFQRCBzdXBwb3J0IGZvcmNlZCBvbi5cbiIpOworCQljYXJkLT5hbXBsaWZpZXJfY3RybCA9IGFtcF92b3lldHJhOworCX0KKworCWlmICh0aGlua3BhZCA9PSAxKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBBY3RpdmF0aW5nIENMS1JVTiBoYWNrIGZvciBUaGlua3BhZC5cbiIpOworCQljYXJkLT5hY3RpdmVfY3RybCA9IGNsa3J1bl9oYWNrOworCX0KKy8qCisqIFRoZSB0aGlua3BhZHMgZG9uJ3Qgd29yayB3ZWxsIHdpdGhvdXQgcnVudGltZSB1cGRhdGluZyBvbiB0aGVpciBrZXJuZWwgCisqIGRlbGF5IHZhbHVlcyAob3IgYW55IGxhcHRvcCB3aXRoIHZhcmlhYmxlIENQVSBzcGVlZHMgcmVhbGx5KS4KKyogc28sIGp1c3QgdG8gYmUgc2FmZSBzZXQgdGhlIGluaXQgZGVsYXkgdG8gMjEwMC4gIEVsaW1pbmF0ZXMKKyogZmFpbHVyZXMgb24gVDIxIFRoaW5rcGFkcy4gIHJlbW92ZSB0aGlzIGNvZGUgd2hlbiB0aGUgdWRlbGF5CisqIGFuZCBtZGVsYXkga2VybmVsIGNvZGUgaXMgcmVwbGFjZWQgYnkgYSBwbSB0aW1lciwgb3IgdGhlIGRlbGF5cworKiB3b3JrIHdlbGwgZm9yIGJhdHRlcnkgYW5kL29yIEFDIHBvd2VyIGJvdGguCisqLworCWlmKGNhcmQtPmFjdGl2ZV9jdHJsID09IGNsa3J1bl9oYWNrKQorCXsKKwkJaW5pdGRlbGF5ID0gMjEwMDsKKwkJY3NfbGFwdG9wX3dhaXQgPSA1OworCX0KKwlpZigoY2FyZC0+YWN0aXZlX2N0cmwgPT0gY2xrcnVuX2hhY2spICYmICEocG93ZXJkb3duID09IDEpKQorCXsKKy8qCisqIGZvciBzb21lIGN1cnJlbnRseSB1bmtub3duIHJlYXNvbiwgcG93ZXJpbmcgZG93biB0aGUgREFDIGFuZCBBREMgY29tcG9uZW50CisqIGJsb2NrcyBvbiB0aGlua3BhZHMgY2F1c2VzIHNvbWUgZnVua3kgYmVoYXZpb3IuLi4gZGlzdG9vcnJydGlvbiBhbmQgYWM5NyAKKyogY29kZWMgYWNjZXNzIHByb2JsZW1zLiAgcHJvYmFibHkgdGhlIHNlcmlhbCBjbG9jayBiZWNvbWVzIHVuc3luY2VkLiAKKyogYWRkZWQgY29kZSB0byBzeW5jIHRoZSBjaGlwcyBiYWNrIHVwLCBidXQgb25seSBoZWxwZWQgYWJvdXQgNzAlIHRoZSB0aW1lLgorKi8KKwkJY3NfcG93ZXJkb3duID0gMDsKKwl9CisJaWYocG93ZXJkb3duID09IDApCisJCWNzX3Bvd2VyZG93biA9IDA7CisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgMSk7CisKKwkvKiBjbGFpbSBvdXIgaW9zcGFjZSBhbmQgaXJxICovCisJCisJY2FyZC0+YmEwID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMF9hZGRyLCBDUzQ2MVhfQkEwX1NJWkUpOworCWNhcmQtPmJhMS5uYW1lLmRhdGEwID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMV9hZGRyICsgQkExX1NQX0RNRU0wLCBDUzQ2MVhfQkExX0RBVEEwX1NJWkUpOworCWNhcmQtPmJhMS5uYW1lLmRhdGExID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMV9hZGRyICsgQkExX1NQX0RNRU0xLCBDUzQ2MVhfQkExX0RBVEExX1NJWkUpOworCWNhcmQtPmJhMS5uYW1lLnBtZW0gPSBpb3JlbWFwX25vY2FjaGUoY2FyZC0+YmExX2FkZHIgKyBCQTFfU1BfUE1FTSwgQ1M0NjFYX0JBMV9QUkdfU0laRSk7CisJY2FyZC0+YmExLm5hbWUucmVnID0gaW9yZW1hcF9ub2NhY2hlKGNhcmQtPmJhMV9hZGRyICsgQkExX1NQX1JFRywgQ1M0NjFYX0JBMV9SRUdfU0laRSk7CisJCisJQ1NfREJHT1VUKENTX0lOSVQsIDQsIHByaW50ayhLRVJOX0lORk8gCisJCSJjczQ2eHg6IGNhcmQ9JXAgY2FyZC0+YmEwPSVwXG4iLGNhcmQsY2FyZC0+YmEwKSApOworCUNTX0RCR09VVChDU19JTklULCA0LCBwcmludGsoS0VSTl9JTkZPIAorCQkiY3M0Nnh4OiBjYXJkLT5iYTE9JXAgJXAgJXAgJXBcbiIsCisJCQljYXJkLT5iYTEubmFtZS5kYXRhMCwKKwkJCWNhcmQtPmJhMS5uYW1lLmRhdGExLAorCQkJY2FyZC0+YmExLm5hbWUucG1lbSwKKwkJCWNhcmQtPmJhMS5uYW1lLnJlZykgKTsKKworCWlmKGNhcmQtPmJhMCA9PSAwIHx8IGNhcmQtPmJhMS5uYW1lLmRhdGEwID09IDAgfHwKKwkJY2FyZC0+YmExLm5hbWUuZGF0YTEgPT0gMCB8fCBjYXJkLT5iYTEubmFtZS5wbWVtID09IDAgfHwKKwkJY2FyZC0+YmExLm5hbWUucmVnID09IDApCisJCWdvdG8gZmFpbDI7CisJCQorCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZjc19pbnRlcnJ1cHQsIFNBX1NISVJRLCAiY3M0Nnh4IiwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJWRcbiIsIGNhcmQtPmlycSk7CisJCWdvdG8gZmFpbDI7CisJfQorCS8qIHJlZ2lzdGVyIC9kZXYvZHNwICovCisJaWYgKChjYXJkLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmNzNDYxeF9mb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImNzNDZ4eDogdW5hYmxlIHRvIHJlZ2lzdGVyIGRzcFxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKyAgICAgICAgLyogcmVnaXN0ZXIgL2Rldi9taWRpICovCisgICAgICAgIGlmKChjYXJkLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJmNzX21pZGlfZm9wcywgLTEpKSA8IDApCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQ2eHg6IHVuYWJsZSB0byByZWdpc3RlciBtaWRpXG4iKTsKKyAgICAgICAgICAgICAgICAKKwljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fSURMRTsKKwlmb3IoaT0wO2k8NTtpKyspCisJeworCQlpZiAoY3NfaGFyZHdhcmVfaW5pdChjYXJkKSAhPSAwKQorCQl7CisJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDQsIHByaW50aygKKwkJCQkiY3M0Nnh4OiBFUlJPUiBpbiBjc19oYXJkd2FyZV9pbml0KCkuLi4gcmV0cnlpbmdcbiIpKTsKKwkJCWZvciAoaiA9IDA7IGogPCBOUl9BQzk3OyBqKyspCisJCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbal0gIT0gTlVMTCkgeworCQkJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTdfY29kZWNbal0tPmRldl9taXhlcik7CisJCQkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2pdKTsKKwkJCQl9CisJCQltZGVsYXkoMTAgKiBjc19sYXB0b3Bfd2FpdCk7CisJCQljb250aW51ZTsKKwkJfQorCQlicmVhazsKKwl9CisJaWYoaT49NCkKKwl7CisJCUNTX0RCR09VVChDU19QTSB8IENTX0VSUk9SLCAxLCBwcmludGsoCisJCQkiY3M0Nnh4OiBjczQ2eHhfcHJvYmUoKS0gY3NfaGFyZHdhcmVfaW5pdCgpIGZhaWxlZCwgcmV0cmllZCAlZCB0aW1lcy5cbiIsaSkpOworICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7CisgICAgICAgICAgICAgICAgaWYoY2FyZC0+ZGV2X21pZGkpCisgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX21pZGkoY2FyZC0+ZGV2X21pZGkpOworICAgICAgICAgICAgICAgIGdvdG8gZmFpbDsKKwl9CisKKyAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+bWlkaS5vcGVuX3dhaXQpOworICAgICAgICBpbml0X01VVEVYKCZjYXJkLT5taWRpLm9wZW5fc2VtKTsKKyAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmY2FyZC0+bWlkaS5pd2FpdCk7CisgICAgICAgIGluaXRfd2FpdHF1ZXVlX2hlYWQoJmNhcmQtPm1pZGkub3dhaXQpOworICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIE1JRENSX01SU1QpOyAgIAorICAgICAgICBjczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfTUlEQ1IsIDApOyAgIAorCisJLyogCisJKiBDaGVjayBpZiB3ZSBoYXZlIHRvIGluaXQgdGhlIGFtcGxpZmllciwgYnV0IHByb2JhYmx5IGFscmVhZHkgZG9uZQorCSogc2luY2UgdGhlIENEIGxvZ2ljIGluIHRoZSBhYzk3IGluaXQgY29kZSB3aWxsIHR1cm4gb24gdGhlIGV4dCBhbXAuCisJKi8KKwlpZihjcC0+YW1wX2luaXQpCisJCWNwLT5hbXBfaW5pdChjYXJkKTsKKyAgICAgICAgY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwgLTEpOworCisJUENJX1NFVF9EUklWRVJfREFUQShwY2lfZGV2LCBjYXJkKTsKKwlQQ0lfU0VUX0RNQV9NQVNLKHBjaV9kZXYsIGRtYV9tYXNrKTsKKwlsaXN0X2FkZCgmY2FyZC0+bGlzdCwgJmNzNDZ4eF9kZXZzKTsKKworCXBtZGV2ID0gY3NfcG1fcmVnaXN0ZXIoUE1fUENJX0RFViwgUE1fUENJX0lEKHBjaV9kZXYpLCBjczQ2eHhfcG1fY2FsbGJhY2spOworCWlmIChwbWRldikKKwl7CisJCUNTX0RCR09VVChDU19JTklUIHwgQ1NfUE0sIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0Nnh4OiBwcm9iZSgpIHBtX3JlZ2lzdGVyKCkgc3VjY2VlZGVkICglcCkuXG4iLAorCQkJCXBtZGV2KSk7CisJCXBtZGV2LT5kYXRhID0gY2FyZDsKKwl9CisJZWxzZQorCXsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19QTSB8IENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDZ4eDogcHJvYmUoKSBwbV9yZWdpc3RlcigpIGZhaWxlZCAoJXApLlxuIiwKKwkJCQlwbWRldikpOworCQljYXJkLT5wbS5mbGFncyB8PSBDUzQ2WFhfUE1fTk9UX1JFR0lTVEVSRUQ7CisJfQorCisJQ1NfREJHT1VUKENTX1BNLCA5LCBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IHBtLmZsYWdzPTB4JXggY2FyZD0lcFxuIiwKKwkJKHVuc2lnbmVkKWNhcmQtPnBtLmZsYWdzLGNhcmQpKTsKKworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJImNzNDZ4eDogcHJvYmUoKS0gZGV2aWNlIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHlcbiIpKTsKKyAgICAgICAgcmV0dXJuIDA7CisKK2ZhaWw6CisJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKK2ZhaWwyOgorCWlmKGNhcmQtPmJhMCkKKwkJaW91bm1hcChjYXJkLT5iYTApOworCWlmKGNhcmQtPmJhMS5uYW1lLmRhdGEwKQorCQlpb3VubWFwKGNhcmQtPmJhMS5uYW1lLmRhdGEwKTsKKwlpZihjYXJkLT5iYTEubmFtZS5kYXRhMSkKKwkJaW91bm1hcChjYXJkLT5iYTEubmFtZS5kYXRhMSk7CisJaWYoY2FyZC0+YmExLm5hbWUucG1lbSkKKwkJaW91bm1hcChjYXJkLT5iYTEubmFtZS5wbWVtKTsKKwlpZihjYXJkLT5iYTEubmFtZS5yZWcpCisJCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucmVnKTsKKwlrZnJlZShjYXJkKTsKKwlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9JTkZPCisJCSJjczQ2eHg6IHByb2JlKCktIG5vIGRldmljZSBhbGxvY2F0ZWRcbiIpKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30gLy8gcHJvYmVfY3M0Nnh4CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworc3RhdGljIHZvaWQgX19kZXZleGl0IGNzNDZ4eF9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQgPSBQQ0lfR0VUX0RSSVZFUl9EQVRBKHBjaV9kZXYpOworCWludCBpOworCXVuc2lnbmVkIGludCB0bXA7CisJCisJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkgImNzNDZ4eDogY3M0Nnh4X3JlbW92ZSgpK1xuIikpOworCisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwxKTsKKwkKKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfUEZJRSk7CisJdG1wICY9IH4weDAwMDBmMDNmOworCXRtcCB8PSAgMHgwMDAwMDAxMDsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUEZJRSwgdG1wKTsJLyogcGxheWJhY2sgaW50ZXJydXB0IGRpc2FibGUgKi8KKworCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9DSUUpOworCXRtcCAmPSB+MHgwMDAwMDAzZjsKKwl0bXAgfD0gIDB4MDAwMDAwMTE7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NJRSwgdG1wKTsJLyogY2FwdHVyZSBpbnRlcnJ1cHQgZGlzYWJsZSAqLworCisJLyoKKyAgICAgICAgICogIFN0b3AgcGxheWJhY2sgRE1BLgorCSAqLworCXRtcCA9IGNzNDYxeF9wZWVrKGNhcmQsIEJBMV9QQ1RMKTsKKwljczQ2MXhfcG9rZShjYXJkLCBCQTFfUENUTCwgdG1wICYgMHgwMDAwZmZmZik7CisKKwkvKgorICAgICAgICAgKiAgU3RvcCBjYXB0dXJlIERNQS4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVlayhjYXJkLCBCQTFfQ0NUTCk7CisJY3M0NjF4X3Bva2UoY2FyZCwgQkExX0NDVEwsIHRtcCAmIDB4ZmZmZjAwMDApOworCisJLyoKKyAgICAgICAgICogIFJlc2V0IHRoZSBwcm9jZXNzb3IuCisgICAgICAgICAqLworCWNzNDYxeF9yZXNldChjYXJkKTsKKworCWNzNDYxeF9wcm9jX3N0b3AoY2FyZCk7CisKKwkvKgorCSAqICBQb3dlciBkb3duIHRoZSBEQUMgYW5kIEFEQy4gIFdlIHdpbGwgcG93ZXIgdGhlbSB1cCAoaWYpIHdoZW4gd2UgbmVlZAorCSAqICB0aGVtLgorCSAqLworCWlmKCAodG1wID0gY3M0NjF4X3Bvd2VyZG93bihjYXJkLCBDU19QT1dFUl9EQUMgfCBDU19QT1dFUl9BREMgfAorCQkJQ1NfUE9XRVJfTUlYVk9OLCBDU19UUlVFICkpICkKKwl7CisJCUNTX0RCR09VVChDU19FUlJPUiB8IENTX0lOSVQsIDEsIHByaW50ayhLRVJOX0lORk8gCisJCQkiY3M0Nnh4OiBjczQ2MXhfcG93ZXJkb3duKCkgZmFpbHVyZSAoMHgleClcbiIsdG1wKSApOworCX0KKworCS8qCisJICogIFBvd2VyIGRvd24gdGhlIFBMTC4KKwkgKi8KKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCAwKTsKKworCS8qCisJICogIFR1cm4gb2ZmIHRoZSBQcm9jZXNzb3IgYnkgdHVybmluZyBvZmYgdGhlIHNvZnR3YXJlIGNsb2NrIGVuYWJsZSBmbGFnIGluIAorCSAqICB0aGUgY2xvY2sgY29udHJvbCByZWdpc3Rlci4KKwkgKi8KKwl0bXAgPSBjczQ2MXhfcGVla0JBMChjYXJkLCBCQTBfQ0xLQ1IxKSAmIH5DTEtDUjFfU1dDRTsKKwljczQ2MXhfcG9rZUJBMChjYXJkLCBCQTBfQ0xLQ1IxLCB0bXApOworCisJY2FyZC0+YWN0aXZlX2N0cmwoY2FyZCwtMSk7CisKKwkvKiBmcmVlIGhhcmR3YXJlIHJlc291cmNlcyAqLworCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisJaW91bm1hcChjYXJkLT5iYTApOworCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTApOworCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUuZGF0YTEpOworCWlvdW5tYXAoY2FyZC0+YmExLm5hbWUucG1lbSk7CisJaW91bm1hcChjYXJkLT5iYTEubmFtZS5yZWcpOworCQorCS8qIHVucmVnaXN0ZXIgYXVkaW8gZGV2aWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCisJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKKwkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2ldKTsKKwkJfQorCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7CisgICAgICAgIGlmKGNhcmQtPmRldl9taWRpKQorICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJfc291bmRfbWlkaShjYXJkLT5kZXZfbWlkaSk7CisJbGlzdF9kZWwoJmNhcmQtPmxpc3QpOworCWtmcmVlKGNhcmQpOworCVBDSV9TRVRfRFJJVkVSX0RBVEEocGNpX2RldixOVUxMKTsKKworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJICJjczQ2eHg6IGNzNDZ4eF9yZW1vdmUoKS06IHJlbW92ZSBzdWNjZXNzZnVsXG4iKSk7Cit9CisKK2VudW0geworCUNTNDZYWF80NjEwID0gMCwKKwlDUzQ2WFhfNDYxMiwgIAkvKiBzYW1lIGFzIDQ2MzAgKi8KKwlDUzQ2WFhfNDYxNSwgIAkvKiBzYW1lIGFzIDQ2MjQgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBjczQ2eHhfcGNpX3RibFtdID0geworCXsKKwkJLnZlbmRvcgkgICAgID0gUENJX1ZFTkRPUl9JRF9DSVJSVVMsCisJCS5kZXZpY2UJICAgICA9IFBDSV9ERVZJQ0VfSURfQ0lSUlVTXzQ2MTAsCisJCS5zdWJ2ZW5kb3IgICA9IFBDSV9BTllfSUQsCisJCS5zdWJkZXZpY2UgICA9IFBDSV9BTllfSUQsCisJCS5kcml2ZXJfZGF0YSA9IENTNDZYWF80NjEwLAorCX0sCisJeworCQkudmVuZG9yCSAgICAgPSBQQ0lfVkVORE9SX0lEX0NJUlJVUywKKwkJLmRldmljZQkgICAgID0gUENJX0RFVklDRV9JRF9DSVJSVVNfNDYxMiwKKwkJLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSAgID0gUENJX0FOWV9JRCwKKwkJLmRyaXZlcl9kYXRhID0gQ1M0NlhYXzQ2MTIsCisJfSwKKwl7CisJCS52ZW5kb3IJICAgICA9IFBDSV9WRU5ET1JfSURfQ0lSUlVTLAorCQkuZGV2aWNlCSAgICAgPSBQQ0lfREVWSUNFX0lEX0NJUlJVU180NjE1LAorCQkuc3VidmVuZG9yICAgPSBQQ0lfQU5ZX0lELAorCQkuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAorCQkuZHJpdmVyX2RhdGEgPSBDUzQ2WFhfNDYxNSwKKwl9LAorCXsgMCwgfSwKK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBjczQ2eHhfcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBjczQ2eHhfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkgID0gImNzNDZ4eCIsCisJLmlkX3RhYmxlID0gY3M0Nnh4X3BjaV90YmwsCisJLnByb2JlCSAgPSBjczQ2eHhfcHJvYmUsCisJLnJlbW92ZQkgID0gX19kZXZleGl0X3AoY3M0Nnh4X3JlbW92ZSksCisJLnN1c3BlbmQgID0gQ1M0NlhYX1NVU1BFTkRfVEJMLAorCS5yZXN1bWUJICA9IENTNDZYWF9SRVNVTUVfVEJMLAorfTsKKworc3RhdGljIGludCBfX2luaXQgY3M0Nnh4X2luaXRfbW9kdWxlKHZvaWQpCit7CisJaW50IHJ0biA9IDA7CisJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwgcHJpbnRrKEtFUk5fSU5GTyAKKwkJImNzNDZ4eDogY3M0Nnh4X2luaXRfbW9kdWxlKCkrIFxuIikpOworCXJ0biA9IHBjaV9tb2R1bGVfaW5pdCgmY3M0Nnh4X3BjaV9kcml2ZXIpOworCisJaWYocnRuID09IC1FTk9ERVYpCisJeworCQlDU19EQkdPVVQoQ1NfRVJST1IgfCBDU19JTklULCAxLCBwcmludGsoIAorCQkJImNzNDZ4eDogVW5hYmxlIHRvIGRldGVjdCB2YWxpZCBjczQ2eHggZGV2aWNlXG4iKSk7CisJfQorCisJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQ2eHg6IGNzNDZ4eF9pbml0X21vZHVsZSgpLSAoJWQpXG4iLHJ0bikpOworCXJldHVybiBydG47Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjczQ2eHhfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmNzNDZ4eF9wY2lfZHJpdmVyKTsKKwljc19wbV91bnJlZ2lzdGVyX2FsbChjczQ2eHhfcG1fY2FsbGJhY2spOworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjbGVhbnVwX2NzNDZ4eCgpIGZpbmlzaGVkXG4iKSk7Cit9CisKK21vZHVsZV9pbml0KGNzNDZ4eF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChjczQ2eHhfY2xlYW51cF9tb2R1bGUpOworCisjaWZuZGVmIENTNDZYWF9BQ1BJX1NVUFBPUlQKK3N0YXRpYyBpbnQgY3M0Nnh4X3BtX2NhbGxiYWNrKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGNzX2NhcmQgKmNhcmQ7CisKKwlDU19EQkdPVVQoQ1NfUE0sIDIsIHByaW50ayhLRVJOX0lORk8gCisJCSJjczQ2eHg6IGNzNDZ4eF9wbV9jYWxsYmFjayBkZXY9JXAgcnFzdD0weCV4IGNhcmQ9JXBcbiIsCisJCQlkZXYsKHVuc2lnbmVkKXJxc3QsZGF0YSkpOworCWNhcmQgPSAoc3RydWN0IGNzX2NhcmQgKikgZGV2LT5kYXRhOworCWlmIChjYXJkKSB7CisJCXN3aXRjaChycXN0KSB7CisJCQljYXNlIFBNX1NVU1BFTkQ6CisJCQkJQ1NfREJHT1VUKENTX1BNLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSJjczQ2eHg6IFBNIHN1c3BlbmQgcmVxdWVzdFxuIikpOworCQkJCWlmKGNzNDZ4eF9zdXNwZW5kKGNhcmQsIDApKQorCQkJCXsKKwkJCQkgICAgQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSJjczQ2eHg6IFBNIHN1c3BlbmQgcmVxdWVzdCByZWZ1c2VkXG4iKSk7CisJCQkJCXJldHVybiAxOyAKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFBNX1JFU1VNRToKKwkJCQlDU19EQkdPVVQoQ1NfUE0sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCQkJImNzNDZ4eDogUE0gcmVzdW1lIHJlcXVlc3RcbiIpKTsKKwkJCQlpZihjczQ2eHhfcmVzdW1lKGNhcmQpKQorCQkJCXsKKwkJCQkgICAgQ1NfREJHT1VUKENTX0VSUk9SLCAyLCBwcmludGsoS0VSTl9JTkZPCisJCQkJCSJjczQ2eHg6IFBNIHJlc3VtZSByZXF1ZXN0IHJlZnVzZWRcbiIpKTsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmIENTNDZYWF9BQ1BJX1NVUFBPUlQKK3N0YXRpYyBpbnQgY3M0Nnh4X3N1c3BlbmRfdGJsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKwlzdHJ1Y3QgY3NfY2FyZCAqcyA9IFBDSV9HRVRfRFJJVkVSX0RBVEEocGNpZGV2KTsKKwlDU19EQkdPVVQoQ1NfUE0gfCBDU19GVU5DVElPTiwgMiwgCisJCXByaW50ayhLRVJOX0lORk8gImNzNDZ4eDogY3M0Nnh4X3N1c3BlbmRfdGJsIHJlcXVlc3RcbiIpKTsKKwljczQ2eHhfc3VzcGVuZChzLCAwKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjczQ2eHhfcmVzdW1lX3RibChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCXN0cnVjdCBjc19jYXJkICpzID0gUENJX0dFVF9EUklWRVJfREFUQShwY2lkZXYpOworCUNTX0RCR09VVChDU19QTSB8IENTX0ZVTkNUSU9OLCAyLCAKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY3M0Nnh4OiBjczQ2eHhfcmVzdW1lX3RibCByZXF1ZXN0XG4iKSk7CisJY3M0Nnh4X3Jlc3VtZShzKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eF93cmFwcGVyLTI0LmggYi9zb3VuZC9vc3MvY3M0Nnh4X3dyYXBwZXItMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjhlMDExCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDZ4eF93cmFwcGVyLTI0LmgKQEAgLTAsMCArMSw1NiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAiY3M0Nnh4X3dyYXBwZXIuYyIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDZYWCBsaW51eCBhdWRpbyBkcml2ZXIuCisqCisqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCisqICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCisqICAgICAgICAgICAgICAgKHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAwMS8xMS8yMDAxIHRydyAtIG5ldyBmaWxlIGZyb20gY3M0MjgxIHdyYXBwZXIgY29kZS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX0NTNDZYWF9XUkFQUEVSMjRfSAorI2RlZmluZSBfX0NTNDZYWF9XUkFQUEVSMjRfSAorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2RlZmluZSBDU19PV05FUiAub3duZXIgPQorI2RlZmluZSBDU19USElTX01PRFVMRSBUSElTX01PRFVMRSwKK3N0YXRpYyBpbmxpbmUgdm9pZCBjczQ2eHhfbnVsbChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KSB7IHJldHVybjsgfQorI2RlZmluZSBjczR4X21lbV9tYXBfcmVzZXJ2ZShwYWdlKSBTZXRQYWdlUmVzZXJ2ZWQocGFnZSkKKyNkZWZpbmUgY3M0eF9tZW1fbWFwX3VucmVzZXJ2ZShwYWdlKSBDbGVhclBhZ2VSZXNlcnZlZChwYWdlKQorCisjZGVmaW5lIGZyZWVfZG1hYnVmKGNhcmQsIGRtYWJ1ZikgXAorCXBjaV9mcmVlX2NvbnNpc3RlbnQoKGNhcmQpLT5wY2lfZGV2LCBcCisJCQkgICAgUEFHRV9TSVpFIDw8IChkbWFidWYpLT5idWZvcmRlciwgXAorCQkJICAgIChkbWFidWYpLT5yYXdidWYsIChkbWFidWYpLT5kbWFhZGRyKTsKKyNkZWZpbmUgZnJlZV9kbWFidWYyKGNhcmQsIGRtYWJ1ZikgXAorCXBjaV9mcmVlX2NvbnNpc3RlbnQoKGNhcmQpLT5wY2lfZGV2LCBcCisJCQkJICAgIFBBR0VfU0laRSA8PCAoZG1hYnVmKS0+YnVmb3JkZXJfdG1wYnVmZiwgXAorCQkJCSAgICAoZG1hYnVmKS0+dG1wYnVmZiwgKGRtYWJ1ZiktPmRtYWFkZHJfdG1wYnVmZik7CisjZGVmaW5lIGNzNHhfcGdvZmYodm1hKSAoKHZtYSktPnZtX3Bnb2ZmKQorCisjZGVmaW5lIFJTUkNJU0lPUkVHSU9OKGRldixudW0pICgoZGV2KS0+cmVzb3VyY2VbKG51bSldLnN0YXJ0ICE9IDAgJiYgXAorCSAoKGRldiktPnJlc291cmNlWyhudW0pXS5mbGFncyAmIFBDSV9CQVNFX0FERFJFU1NfU1BBQ0UpID09IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8pCisjZGVmaW5lIFJTUkNJU01FTU9SWVJFR0lPTihkZXYsbnVtKSAoKGRldiktPnJlc291cmNlWyhudW0pXS5zdGFydCAhPSAwICYmIFwKKwkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uZmxhZ3MgJiBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFKSA9PSBQQ0lfQkFTRV9BRERSRVNTX1NQQUNFX01FTU9SWSkKKyNkZWZpbmUgUlNSQ0FERFJFU1MoZGV2LG51bSkgKChkZXYpLT5yZXNvdXJjZVsobnVtKV0uc3RhcnQpCisjZGVmaW5lIFBDSV9HRVRfRFJJVkVSX0RBVEEgcGNpX2dldF9kcnZkYXRhCisjZGVmaW5lIFBDSV9TRVRfRFJJVkVSX0RBVEEgcGNpX3NldF9kcnZkYXRhCisjZGVmaW5lIFBDSV9TRVRfRE1BX01BU0socGNpZGV2LG1hc2spIHBjaWRldi0+ZG1hX21hc2sgPSBtYXNrCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eHBtLTI0LmggYi9zb3VuZC9vc3MvY3M0Nnh4cG0tMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIwYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDZ4eHBtLTI0LmgKQEAgLTAsMCArMSw1MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAiY3M0Nnh4cG0tMjQuaCIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDZYWCBsaW51eCBhdWRpbyBkcml2ZXIuCisqCisqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCisqICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCisqICAgICAgICAgICAgICAgKHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAxMi8yMi8wMCB0cncgLSBuZXcgZmlsZS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX0NTNDZYWFBNMjRfSAorI2RlZmluZSBfX0NTNDZYWFBNMjRfSAorCisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlICJjczQ2eHhwbS5oIgorCisKKyNkZWZpbmUgQ1M0NlhYX0FDUElfU1VQUE9SVCAxCisjaWZkZWYgQ1M0NlhYX0FDUElfU1VQUE9SVAorLyogCisqIGZvciBub3cgKDEyLzIyLzAwKSBvbmx5IGVuYWJsZSB0aGUgcG1fcmVnaXN0ZXIgUE0gc3VwcG9ydC4KKyogYWxsb3cgdGhlc2UgdGFibGUgZW50cmllcyB0byBiZSBudWxsLgorKi8KK3N0YXRpYyBpbnQgY3M0Nnh4X3N1c3BlbmRfdGJsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IGNzNDZ4eF9yZXN1bWVfdGJsKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpOworI2RlZmluZSBjc19wbV9yZWdpc3RlcihhLCBiLCBjKSAgTlVMTAorI2RlZmluZSBjc19wbV91bnJlZ2lzdGVyX2FsbChhKSAKKyNkZWZpbmUgQ1M0NlhYX1NVU1BFTkRfVEJMIGNzNDZ4eF9zdXNwZW5kX3RibAorI2RlZmluZSBDUzQ2WFhfUkVTVU1FX1RCTCBjczQ2eHhfcmVzdW1lX3RibAorI2Vsc2UKKyNkZWZpbmUgY3NfcG1fcmVnaXN0ZXIoYSwgYiwgYykgcG1fcmVnaXN0ZXIoKGEpLCAoYiksIChjKSk7CisjZGVmaW5lIGNzX3BtX3VucmVnaXN0ZXJfYWxsKGEpIHBtX3VucmVnaXN0ZXJfYWxsKChhKSk7CisjZGVmaW5lIENTNDZYWF9TVVNQRU5EX1RCTCBjczQ2eHhfbnVsbAorI2RlZmluZSBDUzQ2WFhfUkVTVU1FX1RCTCBjczQ2eHhfbnVsbAorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2NzNDZ4eHBtLmggYi9zb3VuZC9vc3MvY3M0Nnh4cG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTMyYjZlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2NzNDZ4eHBtLmgKQEAgLTAsMCArMSw3MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoKKyogICAgICAiY3M0Nnh4cG0uaCIgLS0gIENpcnJ1cyBMb2dpYy1DcnlzdGFsIENTNDZYWCBsaW51eCBhdWRpbyBkcml2ZXIuCisqCisqICAgICAgQ29weXJpZ2h0IChDKSAyMDAwLDIwMDEgIENpcnJ1cyBMb2dpYyBDb3JwLiAgCisqICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCisqICAgICAgICAgICAgICAgKHBjYXVkaW9AY3J5c3RhbC5jaXJydXMuY29tKS4KKyoKKyogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisqCisqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorKgorKiAxMi8yMi8wMCB0cncgLSBuZXcgZmlsZS4gCisqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfX0NTNDZYWFBNX0gKKyNkZWZpbmUgX19DUzQ2WFhQTV9ICisKKyNkZWZpbmUgQ1M0NlhYX0FDOTdfSElHSEVTVFJFR1RPUkVTVE9SRSAweDI2CisjZGVmaW5lIENTNDZYWF9BQzk3X05VTUJFUl9SRVNUT1JFX1JFR1MgKENTNDZYWF9BQzk3X0hJR0hFU1RSRUdUT1JFU1RPUkUvMi0xKQorCisvKiBQTSBzdGF0ZSBkZWZpbnRpb25zICovCisjZGVmaW5lIENTNDZYWF9QTV9OT1RfUkVHSVNURVJFRAkweDEwMDAKKyNkZWZpbmUgQ1M0NlhYX1BNX0lETEUJCQkweDAwMDEKKyNkZWZpbmUgQ1M0NlhYX1BNX1NVU1BFTkRJTkcJCTB4MDAwMgorI2RlZmluZSBDUzQ2WFhfUE1fU1VTUEVOREVECQkweDAwMDQKKyNkZWZpbmUgQ1M0NlhYX1BNX1JFU1VNSU5HCQkweDAwMDgKKyNkZWZpbmUgQ1M0NlhYX1BNX1JFU1VNRUQJCTB4MDAxMAorCisjZGVmaW5lIENTX1BPV0VSX0RBQwkJCTB4MDAwMQorI2RlZmluZSBDU19QT1dFUl9BREMJCQkweDAwMDIKKyNkZWZpbmUgQ1NfUE9XRVJfTUlYVk9OCQkJMHgwMDA0CisjZGVmaW5lIENTX1BPV0VSX01JWFZPRkYJCTB4MDAwOAorI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfT04JMHhmMDAwICAvKiBhbHdheXMgb24gYml0cyAoaW52ZXJ0ZWQpICovCisjZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9BREMJMHgwMTAwCisjZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9EQUMJMHgwMjAwCisjZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT04JMHgwNDAwCisjZGVmaW5lIENTX0FDOTdfUE9XRVJfQ09OVFJPTF9NSVhWT0ZGCTB4MDgwMAorI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfQURDX09OCTB4MDAwMQorI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfREFDX09OCTB4MDAwMgorI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9OX09OCTB4MDAwNAorI2RlZmluZSBDU19BQzk3X1BPV0VSX0NPTlRST0xfTUlYVk9GRl9PTiAweDAwMDgKKworc3RydWN0IGNzNDZ4eF9wbSB7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdTMyQ0xLQ1IxX1NBVkUsdTMyU1NQTVZhbHVlLHUzMlBQTFZDdmFsdWUsdTMyUFBSVkN2YWx1ZTsKKwl1MzIgdTMyRk1MVkN2YWx1ZSx1MzJGTVJWQ3ZhbHVlLHUzMkdQSU9SdmFsdWUsdTMySlNDVEx2YWx1ZSx1MzJTU0NSOworCXUzMiB1MzJTUkNTQSx1MzJEYWNBU1IsdTMyQWRjQVNSLHUzMkRhY1NSLHUzMkFkY1NSLHUzMk1JRENSX1NhdmU7CisJdTMyIHUzMlNTUE1fQklUUzsKKwl1MzIgYWM5N1tDUzQ2WFhfQUM5N19OVU1CRVJfUkVTVE9SRV9SRUdTXTsKKwl1MzIgdTMyQUM5N19tYXN0ZXJfdm9sdW1lLCB1MzJBQzk3X2hlYWRwaG9uZV92b2x1bWUsIHUzMkFDOTdfbWFzdGVyX3ZvbHVtZV9tb25vOworCXUzMiB1MzJBQzk3X3BjbV9vdXRfdm9sdW1lLCB1MzJBQzk3X3Bvd2VyZG93biwgdTMyQUM5N19nZW5lcmFsX3B1cnBvc2U7CisJdTMyIHUzMmh3cHRyX3BsYXliYWNrLHUzMmh3cHRyX2NhcHR1cmU7CisJdW5zaWduZWQgZG1hYnVmX3N3cHRyX3BsYXk7CisJaW50IGRtYWJ1Zl9jb3VudF9wbGF5OworCXVuc2lnbmVkIGRtYWJ1Zl9zd3B0cl9jYXB0dXJlOworCWludCBkbWFidWZfY291bnRfY2FwdHVyZTsKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2Rldl90YWJsZS5jIGIvc291bmQvb3NzL2Rldl90YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NWE5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZGV2X3RhYmxlLmMKQEAgLTAsMCArMSwyMTQgQEAKKy8qCisgKiBzb3VuZC9kZXZfdGFibGUuYworICoKKyAqIERldmljZSBjYWxsIHRhYmxlcy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworI2RlZmluZSBfREVWX1RBQkxFX0NfCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKK3N0YXRpYyBpbnQgc291bmRfYWxsb2NfYXVkaW9kZXYodm9pZCk7CisKK2ludCBzb3VuZF9pbnN0YWxsX2F1ZGlvZHJ2KGludCB2ZXJzLCBjaGFyICpuYW1lLCBzdHJ1Y3QgYXVkaW9fZHJpdmVyICpkcml2ZXIsCisJCQlpbnQgZHJpdmVyX3NpemUsIGludCBmbGFncywgdW5zaWduZWQgaW50IGZvcm1hdF9tYXNrLAorCQkJdm9pZCAqZGV2YywgaW50IGRtYTEsIGludCBkbWEyKQoreworCXN0cnVjdCBhdWRpb19kcml2ZXIgKmQ7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKm9wOworCWludCBudW07CisKKwlpZiAodmVycyAhPSBBVURJT19EUklWRVJfVkVSU0lPTiB8fCBkcml2ZXJfc2l6ZSA+IHNpemVvZihzdHJ1Y3QgYXVkaW9fZHJpdmVyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBJbmNvbXBhdGlibGUgYXVkaW8gZHJpdmVyIGZvciAlc1xuIiwgbmFtZSk7CisJCXJldHVybiAtKEVJTlZBTCk7CisJfQorCW51bSA9IHNvdW5kX2FsbG9jX2F1ZGlvZGV2KCk7CisKKwlpZiAobnVtID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAic291bmQ6IFRvbyBtYW55IGF1ZGlvIGRyaXZlcnNcbiIpOworCQlyZXR1cm4gLShFQlVTWSk7CisJfQorCWQgPSAoc3RydWN0IGF1ZGlvX2RyaXZlciAqKSAoc291bmRfbWVtX2Jsb2Nrc1tzb3VuZF9uYmxvY2tzXSA9IHZtYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdWRpb19kcml2ZXIpKSk7CisKKwlpZiAoc291bmRfbmJsb2NrcyA8IDEwMjQpCisJCXNvdW5kX25ibG9ja3MrKzsKKworCW9wID0gKHN0cnVjdCBhdWRpb19vcGVyYXRpb25zICopIChzb3VuZF9tZW1fYmxvY2tzW3NvdW5kX25ibG9ja3NdID0gdm1hbGxvYyhzaXplb2Yoc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMpKSk7CisKKwlpZiAoc291bmRfbmJsb2NrcyA8IDEwMjQpCisJCXNvdW5kX25ibG9ja3MrKzsKKwlpZiAoZCA9PSBOVUxMIHx8IG9wID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogQ2FuJ3QgYWxsb2NhdGUgZHJpdmVyIGZvciAoJXMpXG4iLCBuYW1lKTsKKwkJc291bmRfdW5sb2FkX2F1ZGlvZGV2KG51bSk7CisJCXJldHVybiAtKEVOT01FTSk7CisJfQorCW1lbXNldCgoY2hhciAqKSBvcCwgMCwgc2l6ZW9mKHN0cnVjdCBhdWRpb19vcGVyYXRpb25zKSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmb3AtPmluX3NsZWVwZXIpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9wLT5vdXRfc2xlZXBlcik7CQorCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm9wLT5wb2xsX3NsZWVwZXIpOworCWlmIChkcml2ZXJfc2l6ZSA8IHNpemVvZihzdHJ1Y3QgYXVkaW9fZHJpdmVyKSkKKwkJbWVtc2V0KChjaGFyICopIGQsIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fZHJpdmVyKSk7CisKKwltZW1jcHkoKGNoYXIgKikgZCwgKGNoYXIgKikgZHJpdmVyLCBkcml2ZXJfc2l6ZSk7CisKKwlvcC0+ZCA9IGQ7CisJc3RybGNweShvcC0+bmFtZSwgbmFtZSwgc2l6ZW9mKG9wLT5uYW1lKSk7CisJb3AtPmZsYWdzID0gZmxhZ3M7CisJb3AtPmZvcm1hdF9tYXNrID0gZm9ybWF0X21hc2s7CisJb3AtPmRldmMgPSBkZXZjOworCisJLyoKKwkgKiAgICBIYXJkY29kZWQgZGVmYXVsdHMKKwkgKi8KKwlhdWRpb19kZXZzW251bV0gPSBvcDsKKworCURNQWJ1Zl9pbml0KG51bSwgZG1hMSwgZG1hMik7CisKKwlhdWRpb19pbml0X2RldmljZXMoKTsKKwlyZXR1cm4gbnVtOworfQorCitpbnQgc291bmRfaW5zdGFsbF9taXhlcihpbnQgdmVycywgY2hhciAqbmFtZSwgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKmRyaXZlciwKKwlpbnQgZHJpdmVyX3NpemUsIHZvaWQgKmRldmMpCit7CisJc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKm9wOworCisJaW50IG4gPSBzb3VuZF9hbGxvY19taXhlcmRldigpOworCisJaWYgKG4gPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogVG9vIG1hbnkgbWl4ZXIgZHJpdmVyc1xuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWlmICh2ZXJzICE9IE1JWEVSX0RSSVZFUl9WRVJTSU9OIHx8CisJCWRyaXZlcl9zaXplID4gc2l6ZW9mKHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBJbmNvbXBhdGlibGUgbWl4ZXIgZHJpdmVyIGZvciAlc1xuIiwgbmFtZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwkvKiBGSVhNRTogVGhpcyBsZWFrcyBhIG1peGVyX29wZXJhdGlvbnMgc3RydWN0IGV2ZXJ5IHRpbWUgaXRzIGNhbGxlZAorCSAgIHVudGlsIHlvdSB1bmxvYWQgc291bmQhICovCisJICAgCisJb3AgPSAoc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKikgKHNvdW5kX21lbV9ibG9ja3Nbc291bmRfbmJsb2Nrc10gPSB2bWFsbG9jKHNpemVvZihzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucykpKTsKKworCWlmIChzb3VuZF9uYmxvY2tzIDwgMTAyNCkKKwkJc291bmRfbmJsb2NrcysrOworCWlmIChvcCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IENhbid0IGFsbG9jYXRlIG1peGVyIGRyaXZlciBmb3IgKCVzKVxuIiwgbmFtZSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoKGNoYXIgKikgb3AsIDAsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucykpOworCW1lbWNweSgoY2hhciAqKSBvcCwgKGNoYXIgKikgZHJpdmVyLCBkcml2ZXJfc2l6ZSk7CisKKwlzdHJsY3B5KG9wLT5uYW1lLCBuYW1lLCBzaXplb2Yob3AtPm5hbWUpKTsKKwlvcC0+ZGV2YyA9IGRldmM7CisKKwltaXhlcl9kZXZzW25dID0gb3A7CisJcmV0dXJuIG47Cit9CisKK3ZvaWQgc291bmRfdW5sb2FkX2F1ZGlvZGV2KGludCBkZXYpCit7CisJaWYgKGRldiAhPSAtMSkgeworCQlETUFidWZfZGVpbml0KGRldik7CisJCWF1ZGlvX2RldnNbZGV2XSA9IE5VTEw7CisJCXVucmVnaXN0ZXJfc291bmRfZHNwKChkZXY8PDQpKzMpOworCX0KK30KKworc3RhdGljIGludCBzb3VuZF9hbGxvY19hdWRpb2Rldih2b2lkKQoreyAKKwlpbnQgaSA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmb3NzX3NvdW5kX2ZvcHMsIC0xKTsKKwlpZihpPT0tMSkKKwkJcmV0dXJuIGk7CisJaT4+PTQ7CisJaWYoaT49bnVtX2F1ZGlvZGV2cykKKwkJbnVtX2F1ZGlvZGV2cyA9IGkgKyAxOworCXJldHVybiBpOworfQorCitpbnQgc291bmRfYWxsb2NfbWlkaWRldih2b2lkKQoreworCWludCBpID0gcmVnaXN0ZXJfc291bmRfbWlkaSgmb3NzX3NvdW5kX2ZvcHMsIC0xKTsKKwlpZihpPT0tMSkKKwkJcmV0dXJuIGk7CisJaT4+PTQ7CisJaWYoaT49bnVtX21pZGlzKQorCQludW1fbWlkaXMgPSBpICsgMTsKKwlyZXR1cm4gaTsKK30KKworaW50IHNvdW5kX2FsbG9jX3N5bnRoZGV2KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX1NZTlRIX0RFVjsgaSsrKSB7CisJCWlmIChzeW50aF9kZXZzW2ldID09IE5VTEwpIHsKKwkJCWlmIChpID49IG51bV9zeW50aHMpCisJCQkJbnVtX3N5bnRocysrOworCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitpbnQgc291bmRfYWxsb2NfbWl4ZXJkZXYodm9pZCkKK3sKKwlpbnQgaSA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZvc3Nfc291bmRfZm9wcywgLTEpOworCWlmKGk9PS0xKQorCQlyZXR1cm4gLTE7CisJaT4+PTQ7CisJaWYoaT49bnVtX21peGVycykKKwkJbnVtX21peGVycyA9IGkgKyAxOworCXJldHVybiBpOworfQorCitpbnQgc291bmRfYWxsb2NfdGltZXJkZXYodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfVElNRVJfREVWOyBpKyspIHsKKwkJaWYgKHNvdW5kX3RpbWVyX2RldnNbaV0gPT0gTlVMTCkgeworCQkJaWYgKGkgPj0gbnVtX3NvdW5kX3RpbWVycykKKwkJCQludW1fc291bmRfdGltZXJzKys7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgc291bmRfdW5sb2FkX21peGVyZGV2KGludCBkZXYpCit7CisJaWYgKGRldiAhPSAtMSkgeworCQltaXhlcl9kZXZzW2Rldl0gPSBOVUxMOworCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGRldjw8NCk7CisJCW51bV9taXhlcnMtLTsKKwl9Cit9CisKK3ZvaWQgc291bmRfdW5sb2FkX21pZGlkZXYoaW50IGRldikKK3sKKwlpZiAoZGV2ICE9IC0xKSB7CisJCW1pZGlfZGV2c1tkZXZdID0gTlVMTDsKKwkJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKChkZXY8PDQpKzIpOworCX0KK30KKwordm9pZCBzb3VuZF91bmxvYWRfc3ludGhkZXYoaW50IGRldikKK3sKKwlpZiAoZGV2ICE9IC0xKQorCQlzeW50aF9kZXZzW2Rldl0gPSBOVUxMOworfQorCit2b2lkIHNvdW5kX3VubG9hZF90aW1lcmRldihpbnQgZGV2KQoreworCWlmIChkZXYgIT0gLTEpCisJCXNvdW5kX3RpbWVyX2RldnNbZGV2XSA9IE5VTEw7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZGV2X3RhYmxlLmggYi9zb3VuZC9vc3MvZGV2X3RhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRmMWQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kZXZfdGFibGUuaApAQCAtMCwwICsxLDQwNSBAQAorLyoKKyAqCWRldl90YWJsZS5oCisgKgorICoJR2xvYmFsIGRlZmluaXRpb25zIGZvciBkZXZpY2UgY2FsbCB0YWJsZXMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKworCisjaWZuZGVmIF9ERVZfVEFCTEVfSF8KKyNkZWZpbmUgX0RFVl9UQUJMRV9IXworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKy8qCisgKiBTb3VuZCBjYXJkIG51bWJlcnMgMjcgdG8gOTk5LiAoMSB0byAyNiBhcmUgZGVmaW5lZCBpbiBzb3VuZGNhcmQuaCkKKyAqIE51bWJlcnMgMTAwMCB0byBOIGFyZSByZXNlcnZlZCBmb3IgZHJpdmVyJ3MgaW50ZXJuYWwgdXNlLgorICovCisKKyNkZWZpbmUgU05EQ0FSRF9ERVNLUFJPWEwJCTI3CS8qIENvbXBhcSBEZXNrcHJvIFhMICovCisjZGVmaW5lIFNORENBUkRfVklEQwkJCTI4CS8qIEFSTXMgVklEQyAqLworI2RlZmluZSBTTkRDQVJEX1NCUE5QCQkJMjkKKyNkZWZpbmUgU05EQ0FSRF9TT0ZUT1NTCQkJMzYKKyNkZWZpbmUgU05EQ0FSRF9WTUlESQkJCTM3CisjZGVmaW5lIFNORENBUkRfT1BMM1NBMQkJCTM4CS8qIE5vdGU6IGNsYXNoIGluIG1zbmQuaCAqLworI2RlZmluZSBTTkRDQVJEX09QTDNTQTFfU0IJCTM5CisjZGVmaW5lIFNORENBUkRfT1BMM1NBMV9NUFUJCTQwCisjZGVmaW5lIFNORENBUkRfV0FWRUZST05UICAgICAgICAgICAgICAgNDEKKyNkZWZpbmUgU05EQ0FSRF9PUEwzU0EyICAgICAgICAgICAgICAgICA0MgorI2RlZmluZSBTTkRDQVJEX09QTDNTQTJfTVBVICAgICAgICAgICAgIDQzCisjZGVmaW5lIFNORENBUkRfV0FWRUFSVElTVCAgICAgICAgICAgICAgNDQJLyogV2F2ZWFydGlzdCAqLworI2RlZmluZSBTTkRDQVJEX09QTDNTQTJfTVNTICAgICAgICAgICAgIDQ1CS8qIE9yaWdpbmFsbHkgbWlzc2VkICovCisjZGVmaW5lIFNORENBUkRfQUQxODE2ICAgICAgICAgICAgICAgICAgODgKKworLyoKKyAqCU5PVEUhIAlOT1RFIQlOT1RFIQlOT1RFIQorICoKKyAqCUlmIHlvdSBtb2RpZnkgdGhpcyBmaWxlLCBwbGVhc2UgY2hlY2sgdGhlIGRldl90YWJsZS5jIGFsc28uCisgKgorICoJTk9URSEgCU5PVEUhCU5PVEUhCU5PVEUhCisgKi8KKworc3RydWN0IGRyaXZlcl9pbmZvIAoreworCWNoYXIgKmRyaXZlcl9pZDsKKwlpbnQgY2FyZF9zdWJ0eXBlOwkvKiBEcml2ZXIgc3BlY2lmaWMuIFVzdWFsbHkgMCAqLworCWludCBjYXJkX3R5cGU7CQkvKglGcm9tIHNvdW5kY2FyZC5oCSovCisJY2hhciAqbmFtZTsKKwl2b2lkICgqYXR0YWNoKSAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKTsKKwlpbnQgKCpwcm9iZSkgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZyk7CisJdm9pZCAoKnVubG9hZCkgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZyk7Cit9OworCitzdHJ1Y3QgY2FyZF9pbmZvIAoreworCWludCBjYXJkX3R5cGU7CS8qIExpbmsgKHNlYXJjaCBrZXkpIHRvIHRoZSBkcml2ZXIgbGlzdCAqLworCXN0cnVjdCBhZGRyZXNzX2luZm8gY29uZmlnOworCWludCBlbmFibGVkOworCXZvaWQgKmZvcl9kcml2ZXJfdXNlOworfTsKKworCisvKgorICogRGV2aWNlIHNwZWNpZmljIHBhcmFtZXRlcnMgKHVzZWQgb25seSBieSBkbWFidWYuYykKKyAqLworI2RlZmluZSBNQVhfU1VCX0JVRkZFUlMJCSgzMipNQVhfUkVBTFRJTUVfRkFDVE9SKQorCisjZGVmaW5lIERNT0RFX05PTkUJCTAKKyNkZWZpbmUgRE1PREVfT1VUUFVUCQlQQ01fRU5BQkxFX09VVFBVVAorI2RlZmluZSBETU9ERV9JTlBVVAkJUENNX0VOQUJMRV9JTlBVVAorCitzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAKK3sKKwlpbnQgICAgICBkbWFfbW9kZTsJLyogRE1PREVfSU5QVVQsIERNT0RFX09VVFBVVCBvciBETU9ERV9OT05FICovCisJaW50CSBjbG9zaW5nOworCisJLyoKKyAJICogUG9pbnRlcnMgdG8gcmF3IGJ1ZmZlcnMKKyAJICovCisKKyAgCWNoYXIgICAgICpyYXdfYnVmOworICAgIAl1bnNpZ25lZCBsb25nICAgcmF3X2J1Zl9waHlzOworCWludCBidWZmc2l6ZTsKKworICAgICAJLyoKKyAgICAgICAgICogRGV2aWNlIHN0YXRlIHRhYmxlcworICAgICAgICAgKi8KKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisjZGVmaW5lIERNQV9CVVNZCTB4MDAwMDAwMDEKKyNkZWZpbmUgRE1BX1JFU1RBUlQJMHgwMDAwMDAwMgorI2RlZmluZSBETUFfQUNUSVZFCTB4MDAwMDAwMDQKKyNkZWZpbmUgRE1BX1NUQVJURUQJMHgwMDAwMDAwOAorI2RlZmluZSBETUFfRU1QVFkJMHgwMDAwMDAxMAkKKyNkZWZpbmUgRE1BX0FMTE9DX0RPTkUJMHgwMDAwMDAyMAorI2RlZmluZSBETUFfU1lOQ0lORwkweDAwMDAwMDQwCisjZGVmaW5lIERNQV9ESVJUWQkweDAwMDAwMDgwCisjZGVmaW5lIERNQV9QT1NUCTB4MDAwMDAxMDAKKyNkZWZpbmUgRE1BX05PRE1BCTB4MDAwMDAyMDAKKyNkZWZpbmUgRE1BX05PVElNRU9VVAkweDAwMDAwNDAwCisKKwlpbnQgICAgICBvcGVuX21vZGU7CisKKwkvKgorCSAqIFF1ZXVlIHBhcmFtZXRlcnMuCisJICovCisJaW50ICAgICAgcWxlbjsKKwlpbnQgICAgICBxaGVhZDsKKwlpbnQgICAgICBxdGFpbDsKKwlzcGlubG9ja190IGxvY2s7CisJCQorCWludAkgY2ZyYWc7CS8qIEN1cnJlbnQgaW5jb21wbGV0ZSBmcmFnbWVudCAod3JpdGUpICovCisKKwlpbnQgICAgICBuYnVmczsKKwlpbnQgICAgICBjb3VudHNbTUFYX1NVQl9CVUZGRVJTXTsKKwlpbnQgICAgICBzdWJkaXZpc2lvbjsKKworCWludCAgICAgIGZyYWdtZW50X3NpemU7CisgICAgICAgIGludAkgbmVlZHNfcmVvcmc7CisJaW50CSBtYXhfZnJhZ21lbnRzOworCisJaW50CSBieXRlc19pbl91c2U7CisKKwlpbnQJIHVuZGVycnVuX2NvdW50OworCXVuc2lnbmVkIGxvbmcJIGJ5dGVfY291bnRlcjsKKwl1bnNpZ25lZCBsb25nCSB1c2VyX2NvdW50ZXI7CisJdW5zaWduZWQgbG9uZwkgbWF4X2J5dGVfY291bnRlcjsKKwlpbnQJIGRhdGFfcmF0ZTsgLyogQnl0ZXMvc2Vjb25kICovCisKKwlpbnQJIG1hcHBpbmdfZmxhZ3M7CisjZGVmaW5lCQkJRE1BX01BUF9NQVBQRUQJCTB4MDAwMDAwMDEKKwljaGFyCW5ldXRyYWxfYnl0ZTsKKwlpbnQJZG1hOwkJLyogRE1BIGNoYW5uZWwgKi8KKworCWludCAgICAgYXBwbGljX3Byb2ZpbGU7CS8qIEFwcGxpY2F0aW9uIHByb2ZpbGUgKEFQRl8qKSAqLworCS8qIEludGVycnVwdCBjYWxsYmFjayBzdHVmZiAqLworCXZvaWQgKCphdWRpb19jYWxsYmFjaykgKGludCBkZXYsIGludCBwYXJtKTsKKwlpbnQgY2FsbGJhY2tfcGFybTsKKworCWludAkgYnVmX2ZsYWdzW01BWF9TVUJfQlVGRkVSU107CisjZGVmaW5lCQkgQlVGRl9FT0YJCTB4MDAwMDAwMDEgLyogSW5jcmVtZW50IGVvZiBjb3VudCAqLworI2RlZmluZQkJIEJVRkZfRElSVFkJCTB4MDAwMDAwMDIgLyogQnVmZmVyIHdyaXR0ZW4gKi8KK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgZm9yIHVzZSB3aXRoIHZhcmlvdXMgbWljcm9jb250cm9sbGVycyBhbmQgRFNQIHByb2Nlc3NvcnMgCisgKiBpbiB0aGUgcmVjZW50IHNvdW5kIGNhcmRzLgorICovCit0eXBlZGVmIHN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAKK3sKKwljaGFyIG5hbWVbNjRdOworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCWludCAoKm9wZW4pICh2b2lkICpkZXZjLCBpbnQgc3ViX2RldmljZSk7CisJdm9pZCAoKmNsb3NlKSAodm9pZCAqZGV2YywgaW50IHN1Yl9kZXZpY2UpOworCWludCAoKmlvY3RsKSAodm9pZCAqZGV2YywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcsIGludCBsb2NhbCk7CisJdm9pZCAoKnJlc2V0KSAodm9pZCAqZGV2Yyk7CisKKwl2b2lkICpkZXZjOwkJLyogRHJpdmVyIHNwZWNpZmljIGluZm8gKi8KK30gY29wcm9jX29wZXJhdGlvbnM7CisKK3N0cnVjdCBhdWRpb19kcml2ZXIgCit7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJaW50ICgqb3BlbikgKGludCBkZXYsIGludCBtb2RlKTsKKwl2b2lkICgqY2xvc2UpIChpbnQgZGV2KTsKKwl2b2lkICgqb3V0cHV0X2Jsb2NrKSAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIAorCQkJICAgICAgaW50IGNvdW50LCBpbnQgaW50cmZsYWcpOworCXZvaWQgKCpzdGFydF9pbnB1dCkgKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCAKKwkJCSAgICAgaW50IGNvdW50LCBpbnQgaW50cmZsYWcpOworCWludCAoKmlvY3RsKSAoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpOworCWludCAoKnByZXBhcmVfZm9yX2lucHV0KSAoaW50IGRldiwgaW50IGJ1ZnNpemUsIGludCBuYnVmcyk7CisJaW50ICgqcHJlcGFyZV9mb3Jfb3V0cHV0KSAoaW50IGRldiwgaW50IGJ1ZnNpemUsIGludCBuYnVmcyk7CisJdm9pZCAoKmhhbHRfaW8pIChpbnQgZGV2KTsKKwlpbnQgKCpsb2NhbF9xbGVuKShpbnQgZGV2KTsKKwl2b2lkICgqY29weV91c2VyKSAoaW50IGRldiwKKwkJCWNoYXIgKmxvY2FsYnVmLCBpbnQgbG9jYWxvZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsIGludCB1c2Vyb2ZmcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhfaW4sIGludCBtYXhfb3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp1c2VkLCBpbnQgKnJldHVybmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbik7CisJdm9pZCAoKmhhbHRfaW5wdXQpIChpbnQgZGV2KTsKKwl2b2lkICgqaGFsdF9vdXRwdXQpIChpbnQgZGV2KTsKKwl2b2lkICgqdHJpZ2dlcikgKGludCBkZXYsIGludCBiaXRzKTsKKwlpbnQgKCpzZXRfc3BlZWQpKGludCBkZXYsIGludCBzcGVlZCk7CisJdW5zaWduZWQgaW50ICgqc2V0X2JpdHMpKGludCBkZXYsIHVuc2lnbmVkIGludCBiaXRzKTsKKwlzaG9ydCAoKnNldF9jaGFubmVscykoaW50IGRldiwgc2hvcnQgY2hhbm5lbHMpOworCXZvaWQgKCpwb3N0cHJvY2Vzc193cml0ZSkoaW50IGRldik7IAkvKiBEZXZpY2Ugc3Blc2lmaWMgcG9zdHByb2Nlc3NpbmcgZm9yIHdyaXR0ZW4gZGF0YSAqLworCXZvaWQgKCpwcmVwcm9jZXNzX3JlYWQpKGludCBkZXYpOyAJLyogRGV2aWNlIHNwZXNpZmljIHByZXByb2Nlc3NpbmcgZm9yIHJlYWQgZGF0YSAqLworCXZvaWQgKCptbWFwKShpbnQgZGV2KTsKK307CisKK3N0cnVjdCBhdWRpb19vcGVyYXRpb25zIAoreworICAgICAgICBjaGFyIG5hbWVbMTI4XTsKKwlpbnQgZmxhZ3M7CisjZGVmaW5lIE5PVEhJTkdfU1BFQ0lBTCAJMHgwMAorI2RlZmluZSBORUVEU19SRVNUQVJUCQkweDAxCisjZGVmaW5lIERNQV9BVVRPTU9ERQkJMHgwMgorI2RlZmluZSBETUFfRFVQTEVYCQkweDA0CisjZGVmaW5lIERNQV9QU0VVRE9fQVVUT01PREUJMHgwOAorI2RlZmluZSBETUFfSEFSRFNUT1AJCTB4MTAKKyNkZWZpbmUgRE1BX0VYQUNUCQkweDQwCisjZGVmaW5lIERNQV9OT1JFU0VUCQkweDgwCisJaW50ICBmb3JtYXRfbWFzazsJLyogQml0bWFzayBmb3Igc3VwcG9ydGVkIGF1ZGlvIGZvcm1hdHMgKi8KKwl2b2lkICpkZXZjOwkJLyogRHJpdmVyIHNwZWNpZmljIGluZm8gKi8KKwlzdHJ1Y3QgYXVkaW9fZHJpdmVyICpkOworCXZvaWQgKnBvcnRjOwkJLyogRHJpdmVyIHNwZWNpZmljIGluZm8gKi8KKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcF9pbiwgKmRtYXBfb3V0OworCXN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAqY29wcm9jOworCWludCBtaXhlcl9kZXY7CisJaW50IGVuYWJsZV9iaXRzOworIAlpbnQgb3Blbl9tb2RlOworCWludCBnbzsKKwlpbnQgbWluX2ZyYWdtZW50OwkvKiAwID09IHVubGltaXRlZCAqLworCWludCBtYXhfZnJhZ21lbnQ7CS8qIDAgPT0gdW5saW1pdGVkICovCisJaW50IHBhcmVudF9kZXY7CQkvKiAwIC0+IG5vIHBhcmVudCwgMSB0byBuIC0+IHBhcmVudD1wYXJlbnRfZGV2KzEgKi8KKworCS8qIGZpZWxkcyBmb3JtZXJseSBpbiBkbWFidWYuYyAqLworCXdhaXRfcXVldWVfaGVhZF90IGluX3NsZWVwZXI7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3V0X3NsZWVwZXI7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcG9sbF9zbGVlcGVyOworCisJLyogZmllbGRzIGZvcm1lcmx5IGluIGF1ZGlvLmMgKi8KKwlpbnQgYXVkaW9fbW9kZTsKKworI2RlZmluZQkJQU1fTk9ORQkJMAorI2RlZmluZQkJQU1fV1JJVEUJT1BFTl9XUklURQorI2RlZmluZSAJQU1fUkVBRAkJT1BFTl9SRUFECisKKwlpbnQgbG9jYWxfZm9ybWF0OworCWludCBhdWRpb19mb3JtYXQ7CisJaW50IGxvY2FsX2NvbnZlcnNpb247CisjZGVmaW5lIENOVl9NVV9MQVcJMHgwMDAwMDAwMQorCisJLyogbGFyZ2Ugc3RydWN0dXJlcyBhdCB0aGUgZW5kIHRvIGtlZXAgb2Zmc2V0cyBzbWFsbCAqLworCXN0cnVjdCBkbWFfYnVmZnBhcm1zIGRtYXBzWzJdOworfTsKKworaW50ICpsb2FkX21peGVyX3ZvbHVtZXMoY2hhciAqbmFtZSwgaW50ICpsZXZlbHMsIGludCBwcmVzZW50KTsKKworc3RydWN0IG1peGVyX29wZXJhdGlvbnMgCit7CisJc3RydWN0IG1vZHVsZSAqb3duZXI7CisJY2hhciBpZFsxNl07CisJY2hhciBuYW1lWzY0XTsKKwlpbnQgKCppb2N0bCkgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKTsKKwkKKwl2b2lkICpkZXZjOworCWludCBtb2RpZnlfY291bnRlcjsKK307CisKK3N0cnVjdCBzeW50aF9vcGVyYXRpb25zIAoreworCXN0cnVjdCBtb2R1bGUgKm93bmVyOworCWNoYXIgKmlkOwkvKiBVbmlxdWUgaWRlbnRpZmllciAoQVNDSUkpIG1heCAyOSBjaGFyICovCisJc3RydWN0IHN5bnRoX2luZm8gKmluZm87CisJaW50IG1pZGlfZGV2OworCWludCBzeW50aF90eXBlOworCWludCBzeW50aF9zdWJ0eXBlOworCisJaW50ICgqb3BlbikgKGludCBkZXYsIGludCBtb2RlKTsKKwl2b2lkICgqY2xvc2UpIChpbnQgZGV2KTsKKwlpbnQgKCppb2N0bCkgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKTsKKwlpbnQgKCpraWxsX25vdGUpIChpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBub3RlLCBpbnQgdmVsb2NpdHkpOworCWludCAoKnN0YXJ0X25vdGUpIChpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBub3RlLCBpbnQgdmVsb2NpdHkpOworCWludCAoKnNldF9pbnN0cikgKGludCBkZXYsIGludCB2b2ljZSwgaW50IGluc3RyKTsKKwl2b2lkICgqcmVzZXQpIChpbnQgZGV2KTsKKwl2b2lkICgqaHdfY29udHJvbCkgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KTsKKwlpbnQgKCpsb2FkX3BhdGNoKSAoaW50IGRldiwgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJICAgICBpbnQgb2ZmcywgaW50IGNvdW50LCBpbnQgcG1ncl9mbGFnKTsKKwl2b2lkICgqYWZ0ZXJ0b3VjaCkgKGludCBkZXYsIGludCB2b2ljZSwgaW50IHByZXNzdXJlKTsKKwl2b2lkICgqY29udHJvbGxlcikgKGludCBkZXYsIGludCB2b2ljZSwgaW50IGN0cmxfbnVtLCBpbnQgdmFsdWUpOworCXZvaWQgKCpwYW5uaW5nKSAoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgdmFsdWUpOworCXZvaWQgKCp2b2x1bWVfbWV0aG9kKSAoaW50IGRldiwgaW50IG1vZGUpOworCXZvaWQgKCpiZW5kZXIpIChpbnQgZGV2LCBpbnQgY2huLCBpbnQgdmFsdWUpOworCWludCAoKmFsbG9jX3ZvaWNlKSAoaW50IGRldiwgaW50IGNobiwgaW50IG5vdGUsIHN0cnVjdCB2b2ljZV9hbGxvY19pbmZvICphbGxvYyk7CisJdm9pZCAoKnNldHVwX3ZvaWNlKSAoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgY2huKTsKKwlpbnQgKCpzZW5kX3N5c2V4KShpbnQgZGV2LCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbik7CisKKyAJc3RydWN0IHZvaWNlX2FsbG9jX2luZm8gYWxsb2M7CisgCXN0cnVjdCBjaGFubmVsX2luZm8gY2huX2luZm9bMTZdOworCWludCBlbXVsYXRpb247CisjZGVmaW5lCUVNVV9HTQkJCTEJLyogR2VuZXJhbCBNSURJICovCisjZGVmaW5lCUVNVV9YRwkJCTIJLyogWWFtYWhhIFhHICovCisjZGVmaW5lIE1BWF9TWVNFWF9CVUYJNjQKKwl1bnNpZ25lZCBjaGFyIHN5c2V4X2J1ZltNQVhfU1lTRVhfQlVGXTsKKwlpbnQgc3lzZXhfcHRyOworfTsKKworc3RydWN0IG1pZGlfaW5wdXRfaW5mbyAKK3sKKwkvKiBNSURJIGlucHV0IHNjYW5uZXIgdmFyaWFibGVzICovCisjZGVmaW5lIE1JX01BWAkxMAorCXZvbGF0aWxlIGludCAgICAgICAgICAgICBtX2J1c3k7CisgICAgCXVuc2lnbmVkIGNoYXIgICBtX2J1ZltNSV9NQVhdOworCXVuc2lnbmVkIGNoYXIJbV9wcmV2X3N0YXR1czsJLyogRm9yIHJ1bm5pbmcgc3RhdHVzICovCisgICAgCWludCAgICAgICAgICAgICBtX3B0cjsKKyNkZWZpbmUgTVNUX0lOSVQJCQkwCisjZGVmaW5lIE1TVF9EQVRBCQkJMQorI2RlZmluZSBNU1RfU1lTRVgJCQkyCisgICAgCWludCAgICAgICAgICAgICBtX3N0YXRlOworICAgIAlpbnQgICAgICAgICAgICAgbV9sZWZ0OworfTsKKworc3RydWN0IG1pZGlfb3BlcmF0aW9ucyAKK3sKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwlzdHJ1Y3QgbWlkaV9pbmZvIGluZm87CisJc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgKmNvbnZlcnRlcjsKKwlzdHJ1Y3QgbWlkaV9pbnB1dF9pbmZvIGluX2luZm87CisJaW50ICgqb3BlbikgKGludCBkZXYsIGludCBtb2RlLAorCQl2b2lkICgqaW5wdXRpbnRyKShpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpLAorCQl2b2lkICgqb3V0cHV0aW50cikoaW50IGRldikKKwkJKTsKKwl2b2lkICgqY2xvc2UpIChpbnQgZGV2KTsKKwlpbnQgKCppb2N0bCkgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKTsKKwlpbnQgKCpvdXRwdXRjKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKTsKKwlpbnQgKCpzdGFydF9yZWFkKSAoaW50IGRldik7CisJaW50ICgqZW5kX3JlYWQpIChpbnQgZGV2KTsKKwl2b2lkICgqa2ljaykoaW50IGRldik7CisJaW50ICgqY29tbWFuZCkgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmRhdGEpOworCWludCAoKmJ1ZmZlcl9zdGF0dXMpIChpbnQgZGV2KTsKKwlpbnQgKCpwcmVmaXhfY21kKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBzdGF0dXMpOworCXN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAqY29wcm9jOworCXZvaWQgKmRldmM7Cit9OworCitzdHJ1Y3Qgc291bmRfbG93bGV2X3RpbWVyIAoreworCWludCBkZXY7CisJaW50IHByaW9yaXR5OworCXVuc2lnbmVkIGludCAoKnRtcl9zdGFydCkoaW50IGRldiwgdW5zaWduZWQgaW50IHVzZWNzKTsKKwl2b2lkICgqdG1yX2Rpc2FibGUpKGludCBkZXYpOworCXZvaWQgKCp0bXJfcmVzdGFydCkoaW50IGRldik7Cit9OworCitzdHJ1Y3Qgc291bmRfdGltZXJfb3BlcmF0aW9ucyAKK3sKKwlzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKwlzdHJ1Y3Qgc291bmRfdGltZXJfaW5mbyBpbmZvOworCWludCBwcmlvcml0eTsKKwlpbnQgZGV2bGluazsKKwlpbnQgKCpvcGVuKShpbnQgZGV2LCBpbnQgbW9kZSk7CisJdm9pZCAoKmNsb3NlKShpbnQgZGV2KTsKKwlpbnQgKCpldmVudCkoaW50IGRldiwgdW5zaWduZWQgY2hhciAqZXYpOworCXVuc2lnbmVkIGxvbmcgKCpnZXRfdGltZSkoaW50IGRldik7CisJaW50ICgqaW9jdGwpIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZyk7CisJdm9pZCAoKmFybV90aW1lcikoaW50IGRldiwgbG9uZyB0aW1lKTsKK307CisKKyNpZmRlZiBfREVWX1RBQkxFX0NfICAgCitzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYXVkaW9fZGV2c1tNQVhfQVVESU9fREVWXTsKK2ludCBudW1fYXVkaW9kZXZzOworc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKm1peGVyX2RldnNbTUFYX01JWEVSX0RFVl07CitpbnQgbnVtX21peGVyczsKK3N0cnVjdCBzeW50aF9vcGVyYXRpb25zICpzeW50aF9kZXZzW01BWF9TWU5USF9ERVYrTUFYX01JRElfREVWXTsKK2ludCBudW1fc3ludGhzOworc3RydWN0IG1pZGlfb3BlcmF0aW9ucyAqbWlkaV9kZXZzW01BWF9NSURJX0RFVl07CitpbnQgbnVtX21pZGlzOworCitleHRlcm4gc3RydWN0IHNvdW5kX3RpbWVyX29wZXJhdGlvbnMgZGVmYXVsdF9zb3VuZF90aW1lcjsKK3N0cnVjdCBzb3VuZF90aW1lcl9vcGVyYXRpb25zICpzb3VuZF90aW1lcl9kZXZzW01BWF9USU1FUl9ERVZdID0geworCSZkZWZhdWx0X3NvdW5kX3RpbWVyLCBOVUxMCit9OyAKK2ludCBudW1fc291bmRfdGltZXJzID0gMTsKKyNlbHNlCitleHRlcm4gc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmF1ZGlvX2RldnNbTUFYX0FVRElPX0RFVl07CitleHRlcm4gaW50IG51bV9hdWRpb2RldnM7CitleHRlcm4gc3RydWN0IG1peGVyX29wZXJhdGlvbnMgKm1peGVyX2RldnNbTUFYX01JWEVSX0RFVl07CitleHRlcm4gaW50IG51bV9taXhlcnM7CitleHRlcm4gc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgKnN5bnRoX2RldnNbTUFYX1NZTlRIX0RFVitNQVhfTUlESV9ERVZdOworZXh0ZXJuIGludCBudW1fc3ludGhzOworZXh0ZXJuIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgKm1pZGlfZGV2c1tNQVhfTUlESV9ERVZdOworZXh0ZXJuIGludCBudW1fbWlkaXM7CitleHRlcm4gc3RydWN0IHNvdW5kX3RpbWVyX29wZXJhdGlvbnMgKiBzb3VuZF90aW1lcl9kZXZzW01BWF9USU1FUl9ERVZdOworZXh0ZXJuIGludCBudW1fc291bmRfdGltZXJzOworI2VuZGlmCS8qIF9ERVZfVEFCTEVfQ18gKi8KKworZXh0ZXJuIGludCBzb3VuZF9tYXBfYnVmZmVyIChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCwgYnVmZm1lbV9kZXNjICppbmZvKTsKK3ZvaWQgc291bmRfdGltZXJfaW5pdCAoc3RydWN0IHNvdW5kX2xvd2xldl90aW1lciAqdCwgY2hhciAqbmFtZSk7Cit2b2lkIHNvdW5kX2RtYV9pbnRyIChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCwgaW50IGNoYW4pOworCisjZGVmaW5lIEFVRElPX0RSSVZFUl9WRVJTSU9OCTIKKyNkZWZpbmUgTUlYRVJfRFJJVkVSX1ZFUlNJT04JMgoraW50IHNvdW5kX2luc3RhbGxfYXVkaW9kcnYoaW50IHZlcnMsIGNoYXIgKm5hbWUsIHN0cnVjdCBhdWRpb19kcml2ZXIgKmRyaXZlciwKKwkJCWludCBkcml2ZXJfc2l6ZSwgaW50IGZsYWdzLCB1bnNpZ25lZCBpbnQgZm9ybWF0X21hc2ssCisJCQl2b2lkICpkZXZjLCBpbnQgZG1hMSwgaW50IGRtYTIpOworaW50IHNvdW5kX2luc3RhbGxfbWl4ZXIoaW50IHZlcnMsIGNoYXIgKm5hbWUsIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zICpkcml2ZXIsCisJCQlpbnQgZHJpdmVyX3NpemUsIHZvaWQgKmRldmMpOworCit2b2lkIHNvdW5kX3VubG9hZF9hdWRpb2RldihpbnQgZGV2KTsKK3ZvaWQgc291bmRfdW5sb2FkX21peGVyZGV2KGludCBkZXYpOwordm9pZCBzb3VuZF91bmxvYWRfbWlkaWRldihpbnQgZGV2KTsKK3ZvaWQgc291bmRfdW5sb2FkX3N5bnRoZGV2KGludCBkZXYpOwordm9pZCBzb3VuZF91bmxvYWRfdGltZXJkZXYoaW50IGRldik7CitpbnQgc291bmRfYWxsb2NfbWl4ZXJkZXYodm9pZCk7CitpbnQgc291bmRfYWxsb2NfdGltZXJkZXYodm9pZCk7CitpbnQgc291bmRfYWxsb2Nfc3ludGhkZXYodm9pZCk7CitpbnQgc291bmRfYWxsb2NfbWlkaWRldih2b2lkKTsKKyNlbmRpZgkvKiBfREVWX1RBQkxFX0hfICovCisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbS5oIGIvc291bmQvb3NzL2RtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhOTA1OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbS5oCkBAIC0wLDAgKzEsNzkgQEAKKyNpZm5kZWYgX0RSSVZFUlNfU09VTkRfRE1fSAorI2RlZmluZSBfRFJJVkVSU19TT1VORF9ETV9ICisKKy8qCisgKglEZWZpbml0aW9ucyBvZiB0aGUgJ2RpcmVjdCBtaWRpIHNvdW5kJyBpbnRlcmZhY2UgdXNlZAorICoJYnkgdGhlIG5ld2VyIGNvbW1lcmNpYWwgT1NTIHBhY2thZ2UuIFdlIHNob3VsZCBleHBvcnQKKyAqCXRoaXMgdG8gdXNlcmxhbmQgc29tZXdoZXJlIGluIGdsaWJjIGxhdGVyLgorICovCisKKy8qCisgKiBEYXRhIHN0cnVjdHVyZSBjb21wb3NpbmcgYW4gRk0gIm5vdGUiIG9yIHNvdW5kIGV2ZW50LgorICovCisKK3N0cnVjdCBkbV9mbV92b2ljZQoreworCXU4IG9wOworCXU4IHZvaWNlOworCXU4IGFtOworCXU4IHZpYnJhdG87CisJdTggZG9fc3VzdGFpbjsKKwl1OCBrYmRfc2NhbGU7CisJdTggaGFybW9uaWM7CisJdTggc2NhbGVfbGV2ZWw7CisJdTggdm9sdW1lOworCXU4IGF0dGFjazsKKwl1OCBkZWNheTsKKwl1OCBzdXN0YWluOworCXU4IHJlbGVhc2U7CisJdTggZmVlZGJhY2s7CisJdTggY29ubmVjdGlvbjsKKwl1OCBsZWZ0OworCXU4IHJpZ2h0OworCXU4IHdhdmVmb3JtOworfTsKKworLyoKKyAqCVRoaXMgZGVzY3JpYmVzIGFuIEZNIG5vdGUgYnkgaXRzIHZvaWNlLCBvY3RhdmUsIGZyZXF1ZW5jeSBudW1iZXIgKDEwYml0KQorICoJYW5kIGtleSBvbi9vZmYuCisgKi8KKworc3RydWN0IGRtX2ZtX25vdGUKK3sKKwl1OCB2b2ljZTsKKwl1OCBvY3RhdmU7CisJdTMyIGZudW07CisJdTgga2V5X29uOworfTsKKworLyoKKyAqIEZNIHBhcmFtZXRlcnMgdGhhdCBhcHBseSBnbG9iYWxseSB0byBhbGwgdm9pY2VzLCBhbmQgdGh1cyBhcmUgbm90ICJub3RlcyIKKyAqLworCitzdHJ1Y3QgZG1fZm1fcGFyYW1zCit7CisJdTggYW1fZGVwdGg7CisJdTggdmliX2RlcHRoOworCXU4IGtiZF9zcGxpdDsKKwl1OCByaHl0aG07CisKKwkvKiBUaGlzIGJsb2NrIGlzIHRoZSBwZXJjdXNzaW9uIGluc3RydW1lbnQgZGF0YSAqLworCXU4IGJhc3M7CisJdTggc25hcmU7CisJdTggdG9tdG9tOworCXU4IGN5bWJhbDsKKwl1OCBoaWhhdDsKK307CisKKy8qCisgKglGTSBtb2RlIGlvY3RsIHNldHRpbmdzCisgKi8KKyAKKyNkZWZpbmUgRk1fSU9DVExfUkVTRVQgICAgICAgIDB4MjAKKyNkZWZpbmUgRk1fSU9DVExfUExBWV9OT1RFICAgIDB4MjEKKyNkZWZpbmUgRk1fSU9DVExfU0VUX1ZPSUNFICAgIDB4MjIKKyNkZWZpbmUgRk1fSU9DVExfU0VUX1BBUkFNUyAgIDB4MjMKKyNkZWZpbmUgRk1fSU9DVExfU0VUX01PREUgICAgIDB4MjQKKyNkZWZpbmUgRk1fSU9DVExfU0VUX09QTCAgICAgIDB4MjUKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hYnVmLmMgYi9zb3VuZC9vc3MvZG1hYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmNDI0NAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFidWYuYwpAQCAtMCwwICsxLDEyOTggQEAKKy8qCisgKiBzb3VuZC9kbWFidWYuYworICoKKyAqIFRoZSBETUEgYnVmZmVyIG1hbmFnZXIgZm9yIGRpZ2l0aXplZCB2b2ljZSBhcHBsaWNhdGlvbnMKKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqIFRob21hcyBTYWlsZXIgICA6IG1vdmVkIHNldmVyYWwgc3RhdGljIHZhcmlhYmxlcyBpbnRvIHN0cnVjdCBhdWRpb19vcGVyYXRpb25zCisgKiAgICAgICAgICAgICAgICAgICAod2hpY2ggaXMgZ3Jvc3NseSBtaXNuYW1lZCBidHcuKSBiZWNhdXNlIHRoZXkgaGF2ZSB0aGUgc2FtZQorICogICAgICAgICAgICAgICAgICAgbGlmZXRpbWUgYXMgdGhlIHJlc3QgaW4gdGhlcmUgYW5kIGR5bmFtaWMgYWxsb2NhdGlvbiBzYXZlcworICogICAgICAgICAgICAgICAgICAgMTJrIG9yIHNvCisgKiBUaG9tYXMgU2FpbGVyICAgOiByZW1vdmUge2luLG91dH1fc2xlZXBfZmxhZy4gSXQgd2FzIHVzZWQgZm9yIHRoZSBzbGVlcGVyIHRvCisgKiAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmUgaWYgaXQgd2FzIHdva2VuIHVwIGJ5IHRoZSBleHBpcmluZyB0aW1lb3V0IG9yIGJ5CisgKiAgICAgICAgICAgICAgICAgICBhbiBleHBsaWNpdCB3YWtlX3VwLiBUaGUgcmV0dXJuIHZhbHVlIGZyb20gc2NoZWR1bGVfdGltZW91dAorICoJCSAgICAgY2FuIGJlIHVzZWQgaW5zdGVhZDsgaWYgMCwgdGhlIHdha2V1cCB3YXMgZHVlIHRvIHRoZSB0aW1lb3V0LgorICoKKyAqIFJvYiBSaWdncwkJQWRkZWQgcGVyc2lzdGVudCBETUEgYnVmZmVycyAoMTk5OC8xMC8xNykKKyAqLworCisjZGVmaW5lIEJFX0NPTlNFUlZBVElWRQorI2RlZmluZSBTQU1QTEVfUk9VTkRVUCAwCisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2RlZmluZSBETUFQX0ZSRUVfT05fQ0xPU0UgICAgICAwCisjZGVmaW5lIERNQVBfS0VFUF9PTl9DTE9TRSAgICAgIDEKK2V4dGVybiBpbnQgc291bmRfZG1hcF9mbGFnOworCitzdGF0aWMgdm9pZCBkbWFfcmVzZXRfb3V0cHV0KGludCBkZXYpOworc3RhdGljIHZvaWQgZG1hX3Jlc2V0X2lucHV0KGludCBkZXYpOworc3RhdGljIGludCBsb2NhbF9zdGFydF9kbWEoc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIGludCBjb3VudCwgaW50IGRtYV9tb2RlKTsKKworCisKK3N0YXRpYyBpbnQgZGVidWdtZW07ICAgIAkvKiBzd2l0Y2hlZCBvZmYgYnkgZGVmYXVsdCAqLworc3RhdGljIGludCBkbWFfYnVmZnNpemUgPSBEU1BfQlVGRlNJWkU7CisKK3N0YXRpYyBsb25nIGRtYWJ1Zl90aW1lb3V0KHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwKQoreworCWxvbmcgdG1vdXQ7CisKKwl0bW91dCA9IChkbWFwLT5mcmFnbWVudF9zaXplICogSFopIC8gZG1hcC0+ZGF0YV9yYXRlOworCXRtb3V0ICs9IEhaIC8gNTsJLyogU29tZSBzYWZldHkgZGlzdGFuY2UgKi8KKwlpZiAodG1vdXQgPCAoSFogLyAyKSkKKwkJdG1vdXQgPSBIWiAvIDI7CisJaWYgKHRtb3V0ID4gMjAgKiBIWikKKwkJdG1vdXQgPSAyMCAqIEhaOworCXJldHVybiB0bW91dDsKK30KKworc3RhdGljIGludCBzb3VuZF9hbGxvY19kbWFwKHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwKQoreworCWNoYXIgKnN0YXJ0X2FkZHIsICplbmRfYWRkcjsKKwlpbnQgZG1hX3BhZ2VzaXplOworCWludCBzeiwgc2l6ZTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZTsKKworCWRtYXAtPm1hcHBpbmdfZmxhZ3MgJj0gfkRNQV9NQVBfTUFQUEVEOworCisJaWYgKGRtYXAtPnJhd19idWYgIT0gTlVMTCkKKwkJcmV0dXJuIDA7CS8qIEFscmVhZHkgZG9uZSAqLworCWlmIChkbWFfYnVmZnNpemUgPCA0MDk2KQorCQlkbWFfYnVmZnNpemUgPSA0MDk2OworCWRtYV9wYWdlc2l6ZSA9IChkbWFwLT5kbWEgPCA0KSA/ICg2NCAqIDEwMjQpIDogKDEyOCAqIDEwMjQpOworCQorCS8qCisJICoJTm93IGNoZWNrIGZvciB0aGUgQ3lyaXggcHJvYmxlbS4KKwkgKi8KKwkgCisJaWYoaXNhX2RtYV9icmlkZ2VfYnVnZ3k9PTIpCisJCWRtYV9wYWdlc2l6ZT0zMjc2ODsKKwkgCisJZG1hcC0+cmF3X2J1ZiA9IE5VTEw7CisJZG1hcC0+YnVmZnNpemUgPSBkbWFfYnVmZnNpemU7CisJaWYgKGRtYXAtPmJ1ZmZzaXplID4gZG1hX3BhZ2VzaXplKQorCQlkbWFwLT5idWZmc2l6ZSA9IGRtYV9wYWdlc2l6ZTsKKwlzdGFydF9hZGRyID0gTlVMTDsKKwkvKgorCSAqIE5vdyBsb29wIHVudGlsIHdlIGdldCBhIGZyZWUgYnVmZmVyLiBUcnkgdG8gZ2V0IHNtYWxsZXIgYnVmZmVyIGlmCisJICogaXQgZmFpbHMuIERvbid0IGFjY2VwdCBzbWFsbGVyIHRoYW4gOGsgYnVmZmVyIGZvciBwZXJmb3JtYW5jZQorCSAqIHJlYXNvbnMuCisJICovCisJd2hpbGUgKHN0YXJ0X2FkZHIgPT0gTlVMTCAmJiBkbWFwLT5idWZmc2l6ZSA+IFBBR0VfU0laRSkgeworCQlmb3IgKHN6ID0gMCwgc2l6ZSA9IFBBR0VfU0laRTsgc2l6ZSA8IGRtYXAtPmJ1ZmZzaXplOyBzeisrLCBzaXplIDw8PSAxKTsKKwkJZG1hcC0+YnVmZnNpemUgPSBQQUdFX1NJWkUgKiAoMSA8PCBzeik7CisJCXN0YXJ0X2FkZHIgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9BVE9NSUN8R0ZQX0RNQXxfX0dGUF9OT1dBUk4sIHN6KTsKKwkJaWYgKHN0YXJ0X2FkZHIgPT0gTlVMTCkKKwkJCWRtYXAtPmJ1ZmZzaXplIC89IDI7CisJfQorCisJaWYgKHN0YXJ0X2FkZHIgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZCBlcnJvcjogQ291bGRuJ3QgYWxsb2NhdGUgRE1BIGJ1ZmZlclxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0gZWxzZSB7CisJCS8qIG1ha2Ugc29tZSBjaGVja3MgKi8KKwkJZW5kX2FkZHIgPSBzdGFydF9hZGRyICsgZG1hcC0+YnVmZnNpemUgLSAxOworCisJCWlmIChkZWJ1Z21lbSkKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzb3VuZDogc3RhcnQgMHglbHgsIGVuZCAweCVseFxuIiwgKGxvbmcpIHN0YXJ0X2FkZHIsIChsb25nKSBlbmRfYWRkcik7CisJCQorCQkvKiBub3cgY2hlY2sgaWYgaXQgZml0cyBpbnRvIHRoZSBzYW1lIGRtYS1wYWdlc2l6ZSAqLworCisJCWlmICgoKGxvbmcpIHN0YXJ0X2FkZHIgJiB+KGRtYV9wYWdlc2l6ZSAtIDEpKSAhPSAoKGxvbmcpIGVuZF9hZGRyICYgfihkbWFfcGFnZXNpemUgLSAxKSkKKwkJICAgIHx8IGVuZF9hZGRyID49IChjaGFyICopIChNQVhfRE1BX0FERFJFU1MpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgInNvdW5kOiBHb3QgaW52YWxpZCBhZGRyZXNzIDB4JWx4IGZvciAlZGIgRE1BLWJ1ZmZlclxuIiwgKGxvbmcpIHN0YXJ0X2FkZHIsIGRtYXAtPmJ1ZmZzaXplKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJfQorCWRtYXAtPnJhd19idWYgPSBzdGFydF9hZGRyOworCWRtYXAtPnJhd19idWZfcGh5cyA9IHZpcnRfdG9fYnVzKHN0YXJ0X2FkZHIpOworCisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHN0YXJ0X2FkZHIpOyBwYWdlIDw9IHZpcnRfdG9fcGFnZShlbmRfYWRkcik7IHBhZ2UrKykKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzb3VuZF9mcmVlX2RtYXAoc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXApCit7CisJaW50IHN6LCBzaXplOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgZW5kX2FkZHI7CisKKwlpZiAoZG1hcC0+cmF3X2J1ZiA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGRtYXAtPm1hcHBpbmdfZmxhZ3MgJiBETUFfTUFQX01BUFBFRCkKKwkJcmV0dXJuOwkJLyogRG9uJ3QgZnJlZSBtbWFwcGVkIGJ1ZmZlci4gV2lsbCB1c2UgaXQgbmV4dCB0aW1lICovCisJZm9yIChzeiA9IDAsIHNpemUgPSBQQUdFX1NJWkU7IHNpemUgPCBkbWFwLT5idWZmc2l6ZTsgc3orKywgc2l6ZSA8PD0gMSk7CisKKwlzdGFydF9hZGRyID0gKHVuc2lnbmVkIGxvbmcpIGRtYXAtPnJhd19idWY7CisJZW5kX2FkZHIgPSBzdGFydF9hZGRyICsgZG1hcC0+YnVmZnNpemU7CisKKwlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2Uoc3RhcnRfYWRkcik7IHBhZ2UgPD0gdmlydF90b19wYWdlKGVuZF9hZGRyKTsgcGFnZSsrKQorCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKworCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIGRtYXAtPnJhd19idWYsIHN6KTsKKwlkbWFwLT5yYXdfYnVmID0gTlVMTDsKK30KKworCisvKiBJbnRlbCB2ZXJzaW9uICEhISEhISEhISAqLworCitzdGF0aWMgaW50IHNvdW5kX3N0YXJ0X2RtYShzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCwgdW5zaWduZWQgbG9uZyBwaHlzYWRkciwgaW50IGNvdW50LCBpbnQgZG1hX21vZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY2hhbiA9IGRtYXAtPmRtYTsKKworCS8qIHByaW50ayggIlN0YXJ0IERNQSVkICVkLCAlZFxuIiwgIGNoYW4sICAoaW50KShwaHlzYWRkci1kbWFwLT5yYXdfYnVmX3BoeXMpLCAgY291bnQpOyAqLworCisJZmxhZ3MgPSBjbGFpbV9kbWFfbG9jaygpOworCWRpc2FibGVfZG1hKGNoYW4pOworCWNsZWFyX2RtYV9mZihjaGFuKTsKKwlzZXRfZG1hX21vZGUoY2hhbiwgZG1hX21vZGUpOworCXNldF9kbWFfYWRkcihjaGFuLCBwaHlzYWRkcik7CisJc2V0X2RtYV9jb3VudChjaGFuLCBjb3VudCk7CisJZW5hYmxlX2RtYShjaGFuKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkbWFfaW5pdF9idWZmZXJzKHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwKQoreworCWRtYXAtPnFsZW4gPSBkbWFwLT5xaGVhZCA9IGRtYXAtPnF0YWlsID0gZG1hcC0+dXNlcl9jb3VudGVyID0gMDsKKwlkbWFwLT5ieXRlX2NvdW50ZXIgPSAwOworCWRtYXAtPm1heF9ieXRlX2NvdW50ZXIgPSA4MDAwICogNjAgKiA2MDsKKwlkbWFwLT5ieXRlc19pbl91c2UgPSBkbWFwLT5idWZmc2l6ZTsKKworCWRtYXAtPmRtYV9tb2RlID0gRE1PREVfTk9ORTsKKwlkbWFwLT5tYXBwaW5nX2ZsYWdzID0gMDsKKwlkbWFwLT5uZXV0cmFsX2J5dGUgPSAweDgwOworCWRtYXAtPmRhdGFfcmF0ZSA9IDgwMDA7CisJZG1hcC0+Y2ZyYWcgPSAtMTsKKwlkbWFwLT5jbG9zaW5nID0gMDsKKwlkbWFwLT5uYnVmcyA9IDE7CisJZG1hcC0+ZmxhZ3MgPSBETUFfQlVTWTsJLyogT3RoZXIgZmxhZ3Mgb2ZmICovCit9CisKK3N0YXRpYyBpbnQgb3Blbl9kbWFwKHN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2LCBpbnQgbW9kZSwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXApCit7CisJaW50IGVycjsKKwkKKwlpZiAoZG1hcC0+ZmxhZ3MgJiBETUFfQlVTWSkKKwkJcmV0dXJuIC1FQlVTWTsKKwlpZiAoKGVyciA9IHNvdW5kX2FsbG9jX2RtYXAoZG1hcCkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmIChkbWFwLT5yYXdfYnVmID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQ6IERNQSBidWZmZXJzIG5vdCBhdmFpbGFibGVcbiIpOworCQlyZXR1cm4gLUVOT1NQQzsJLyogTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkIGR1cmluZyBib290ICovCisJfQorCWlmIChkbWFwLT5kbWEgPj0gMCAmJiBzb3VuZF9vcGVuX2RtYShkbWFwLT5kbWEsIGFkZXYtPm5hbWUpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlVuYWJsZSB0byBncmFiKDIpIERNQSVkIGZvciB0aGUgYXVkaW8gZHJpdmVyXG4iLCBkbWFwLT5kbWEpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlkbWFfaW5pdF9idWZmZXJzKGRtYXApOworCXNwaW5fbG9ja19pbml0KCZkbWFwLT5sb2NrKTsKKwlkbWFwLT5vcGVuX21vZGUgPSBtb2RlOworCWRtYXAtPnN1YmRpdmlzaW9uID0gZG1hcC0+dW5kZXJydW5fY291bnQgPSAwOworCWRtYXAtPmZyYWdtZW50X3NpemUgPSAwOworCWRtYXAtPm1heF9mcmFnbWVudHMgPSA2NTUzNjsJLyogSnVzdCBhIGxhcmdlIHZhbHVlICovCisJZG1hcC0+Ynl0ZV9jb3VudGVyID0gMDsKKwlkbWFwLT5tYXhfYnl0ZV9jb3VudGVyID0gODAwMCAqIDYwICogNjA7CisJZG1hcC0+YXBwbGljX3Byb2ZpbGUgPSBBUEZfTk9STUFMOworCWRtYXAtPm5lZWRzX3Jlb3JnID0gMTsKKwlkbWFwLT5hdWRpb19jYWxsYmFjayA9IE5VTEw7CisJZG1hcC0+Y2FsbGJhY2tfcGFybSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX2RtYXAoc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYsIHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKGRtYXAtPmRtYSA+PSAwKSB7CisJCXNvdW5kX2Nsb3NlX2RtYShkbWFwLT5kbWEpOworCQlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQlkaXNhYmxlX2RtYShkbWFwLT5kbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwl9CisJaWYgKGRtYXAtPmZsYWdzICYgRE1BX0JVU1kpCisJCWRtYXAtPmRtYV9tb2RlID0gRE1PREVfTk9ORTsKKwlkbWFwLT5mbGFncyAmPSB+RE1BX0JVU1k7CisJCisJaWYgKHNvdW5kX2RtYXBfZmxhZyA9PSBETUFQX0ZSRUVfT05fQ0xPU0UpCisJCXNvdW5kX2ZyZWVfZG1hcChkbWFwKTsKK30KKworCitzdGF0aWMgdW5zaWduZWQgaW50IGRlZmF1bHRfc2V0X2JpdHMoaW50IGRldiwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7CisKKwlzZXRfZnMoZ2V0X2RzKCkpOworCWF1ZGlvX2RldnNbZGV2XS0+ZC0+aW9jdGwoZGV2LCBTTkRDVExfRFNQX1NFVEZNVCwgKHZvaWQgX191c2VyICopJmJpdHMpOworCXNldF9mcyhmcyk7CisJcmV0dXJuIGJpdHM7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9zZXRfc3BlZWQoaW50IGRldiwgaW50IHNwZWVkKQoreworCW1tX3NlZ21lbnRfdCBmcyA9IGdldF9mcygpOworCisJc2V0X2ZzKGdldF9kcygpKTsKKwlhdWRpb19kZXZzW2Rldl0tPmQtPmlvY3RsKGRldiwgU05EQ1RMX0RTUF9TUEVFRCwgKHZvaWQgX191c2VyICopJnNwZWVkKTsKKwlzZXRfZnMoZnMpOworCXJldHVybiBzcGVlZDsKK30KKworc3RhdGljIHNob3J0IGRlZmF1bHRfc2V0X2NoYW5uZWxzKGludCBkZXYsIHNob3J0IGNoYW5uZWxzKQoreworCWludCBjID0gY2hhbm5lbHM7CisJbW1fc2VnbWVudF90IGZzID0gZ2V0X2ZzKCk7CisKKwlzZXRfZnMoZ2V0X2RzKCkpOworCWF1ZGlvX2RldnNbZGV2XS0+ZC0+aW9jdGwoZGV2LCBTTkRDVExfRFNQX0NIQU5ORUxTLCAodm9pZCBfX3VzZXIgKikmYyk7CisJc2V0X2ZzKGZzKTsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfZHJpdmVyKHN0cnVjdCBhdWRpb19kcml2ZXIgKmQpCit7CisJaWYgKGQtPnNldF9zcGVlZCA9PSBOVUxMKQorCQlkLT5zZXRfc3BlZWQgPSBkZWZhdWx0X3NldF9zcGVlZDsKKwlpZiAoZC0+c2V0X2JpdHMgPT0gTlVMTCkKKwkJZC0+c2V0X2JpdHMgPSBkZWZhdWx0X3NldF9iaXRzOworCWlmIChkLT5zZXRfY2hhbm5lbHMgPT0gTlVMTCkKKwkJZC0+c2V0X2NoYW5uZWxzID0gZGVmYXVsdF9zZXRfY2hhbm5lbHM7Cit9CisKK2ludCBETUFidWZfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwX2luID0gTlVMTDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcF9vdXQgPSBOVUxMOworCisJaWYgKCFhZGV2KQorCQkgIHJldHVybiAtRU5YSU87CisJaWYgKCEoYWRldi0+ZmxhZ3MgJiBETUFfRFVQTEVYKSkKKwkJYWRldi0+ZG1hcF9pbiA9IGFkZXYtPmRtYXBfb3V0OworCWNoZWNrX2RyaXZlcihhZGV2LT5kKTsKKworCWlmICgocmV0dmFsID0gYWRldi0+ZC0+b3BlbihkZXYsIG1vZGUpKSA8IDApCisJCXJldHVybiByZXR2YWw7CisJZG1hcF9vdXQgPSBhZGV2LT5kbWFwX291dDsKKwlkbWFwX2luID0gYWRldi0+ZG1hcF9pbjsKKwlpZiAoZG1hcF9pbiA9PSBkbWFwX291dCkKKwkJYWRldi0+ZmxhZ3MgJj0gfkRNQV9EVVBMRVg7CisKKwlpZiAobW9kZSAmIE9QRU5fV1JJVEUpIHsKKwkJaWYgKChyZXR2YWwgPSBvcGVuX2RtYXAoYWRldiwgbW9kZSwgZG1hcF9vdXQpKSA8IDApIHsKKwkJCWFkZXYtPmQtPmNsb3NlKGRldik7CisJCQlyZXR1cm4gcmV0dmFsOworCQl9CisJfQorCWFkZXYtPmVuYWJsZV9iaXRzID0gbW9kZTsKKworCWlmIChtb2RlID09IE9QRU5fUkVBRCB8fCAobW9kZSAhPSBPUEVOX1dSSVRFICYmIChhZGV2LT5mbGFncyAmIERNQV9EVVBMRVgpKSkgeworCQlpZiAoKHJldHZhbCA9IG9wZW5fZG1hcChhZGV2LCBtb2RlLCBkbWFwX2luKSkgPCAwKSB7CisJCQlhZGV2LT5kLT5jbG9zZShkZXYpOworCQkJaWYgKG1vZGUgJiBPUEVOX1dSSVRFKQorCQkJCWNsb3NlX2RtYXAoYWRldiwgZG1hcF9vdXQpOworCQkJcmV0dXJuIHJldHZhbDsKKwkJfQorCX0KKwlhZGV2LT5vcGVuX21vZGUgPSBtb2RlOworCWFkZXYtPmdvID0gMTsKKworCWFkZXYtPmQtPnNldF9iaXRzKGRldiwgOCk7CisJYWRldi0+ZC0+c2V0X2NoYW5uZWxzKGRldiwgMSk7CisJYWRldi0+ZC0+c2V0X3NwZWVkKGRldiwgRFNQX0RFRkFVTFRfU1BFRUQpOworCWlmIChhZGV2LT5kbWFwX291dC0+ZG1hX21vZGUgPT0gRE1PREVfT1VUUFVUKSAKKwkJbWVtc2V0KGFkZXYtPmRtYXBfb3V0LT5yYXdfYnVmLCBhZGV2LT5kbWFwX291dC0+bmV1dHJhbF9ieXRlLAorCQkgICAgICAgYWRldi0+ZG1hcF9vdXQtPmJ5dGVzX2luX3VzZSk7CisJcmV0dXJuIDA7Cit9CisvKiBNVVNUIG5vdCBob2xkIHRoZSBzcGlubG9jayAqLwordm9pZCBETUFidWZfcmVzZXQoaW50IGRldikKK3sKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFKQorCQlkbWFfcmVzZXRfb3V0cHV0KGRldik7CisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpCisJCWRtYV9yZXNldF9pbnB1dChkZXYpOworfQorCitzdGF0aWMgdm9pZCBkbWFfcmVzZXRfb3V0cHV0KGludCBkZXYpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJdW5zaWduZWQgbG9uZyBmbGFncyxmIDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworCisJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfU1RBUlRFRCkpCS8qIERNQSBpcyBub3QgYWN0aXZlICovCisJCXJldHVybjsKKworCS8qCisJICoJRmlyc3Qgd2FpdCB1bnRpbCB0aGUgY3VycmVudCBmcmFnbWVudCBoYXMgYmVlbiBwbGF5ZWQgY29tcGxldGVseQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwlhZGV2LT5kbWFwX291dC0+ZmxhZ3MgfD0gRE1BX1NZTkNJTkc7CisKKwlhZGV2LT5kbWFwX291dC0+dW5kZXJydW5fY291bnQgPSAwOworCWlmICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgYWRldi0+ZG1hcF9vdXQtPnFsZW4gJiYgCisJICAgIGFkZXYtPmRtYXBfb3V0LT51bmRlcnJ1bl9jb3VudCA9PSAwKXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7CisJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmYWRldi0+b3V0X3NsZWVwZXIsCisJCQkJCSAgICAgICBkbWFidWZfdGltZW91dChkbWFwKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwl9CisJYWRldi0+ZG1hcF9vdXQtPmZsYWdzICY9IH4oRE1BX1NZTkNJTkcgfCBETUFfQUNUSVZFKTsKKworCS8qCisJICoJRmluYWxseSBzaHV0IHRoZSBkZXZpY2Ugb2ZmCisJICovCisJaWYgKCEoYWRldi0+ZmxhZ3MgJiBETUFfRFVQTEVYKSB8fCAhYWRldi0+ZC0+aGFsdF9vdXRwdXQpCisJCWFkZXYtPmQtPmhhbHRfaW8oZGV2KTsKKwllbHNlCisJCWFkZXYtPmQtPmhhbHRfb3V0cHV0KGRldik7CisJYWRldi0+ZG1hcF9vdXQtPmZsYWdzICY9IH5ETUFfU1RBUlRFRDsKKwkKKwlmPWNsYWltX2RtYV9sb2NrKCk7CisJY2xlYXJfZG1hX2ZmKGRtYXAtPmRtYSk7CisJZGlzYWJsZV9kbWEoZG1hcC0+ZG1hKTsKKwlyZWxlYXNlX2RtYV9sb2NrKGYpOworCQorCWRtYXAtPmJ5dGVfY291bnRlciA9IDA7CisJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgYWRldi0+ZG1hcF9vdXQsIDApOworCWRtYXAtPnFsZW4gPSBkbWFwLT5xaGVhZCA9IGRtYXAtPnF0YWlsID0gZG1hcC0+dXNlcl9jb3VudGVyID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZG1hX3Jlc2V0X2lucHV0KGludCBkZXYpCit7CisgICAgICAgIHN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSBhZGV2LT5kbWFwX2luOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCWlmICghKGFkZXYtPmZsYWdzICYgRE1BX0RVUExFWCkgfHwgIWFkZXYtPmQtPmhhbHRfaW5wdXQpCisJCWFkZXYtPmQtPmhhbHRfaW8oZGV2KTsKKwllbHNlCisJCWFkZXYtPmQtPmhhbHRfaW5wdXQoZGV2KTsKKwlhZGV2LT5kbWFwX2luLT5mbGFncyAmPSB+RE1BX1NUQVJURUQ7CisKKwlkbWFwLT5xbGVuID0gZG1hcC0+cWhlYWQgPSBkbWFwLT5xdGFpbCA9IGRtYXAtPnVzZXJfY291bnRlciA9IDA7CisJZG1hcC0+Ynl0ZV9jb3VudGVyID0gMDsKKwlyZW9yZ2FuaXplX2J1ZmZlcnMoZGV2LCBhZGV2LT5kbWFwX2luLCAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKK30KKy8qIE1VU1QgYmUgY2FsbGVkIHdpdGggaG9sZGluZyB0aGUgZG1hcC0+bG9jayAqLwordm9pZCBETUFidWZfbGF1bmNoX291dHB1dChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKworCWlmICghKChhZGV2LT5lbmFibGVfYml0cyAqIGFkZXYtPmdvKSAmIFBDTV9FTkFCTEVfT1VUUFVUKSkKKwkJcmV0dXJuOwkJLyogRG9uJ3Qgc3RhcnQgRE1BIHlldCAqLworCWRtYXAtPmRtYV9tb2RlID0gRE1PREVfT1VUUFVUOworCisJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfQUNUSVZFKSB8fCAhKGFkZXYtPmZsYWdzICYgRE1BX0FVVE9NT0RFKSB8fCAoZG1hcC0+ZmxhZ3MgJiBETUFfTk9ETUEpKSB7CisJCWlmICghKGRtYXAtPmZsYWdzICYgRE1BX1NUQVJURUQpKSB7CisJCQlyZW9yZ2FuaXplX2J1ZmZlcnMoZGV2LCBkbWFwLCAwKTsKKwkJCWlmIChhZGV2LT5kLT5wcmVwYXJlX2Zvcl9vdXRwdXQoZGV2LCBkbWFwLT5mcmFnbWVudF9zaXplLCBkbWFwLT5uYnVmcykpCisJCQkJcmV0dXJuOworCQkJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfTk9ETUEpKQorCQkJCWxvY2FsX3N0YXJ0X2RtYShhZGV2LCBkbWFwLT5yYXdfYnVmX3BoeXMsIGRtYXAtPmJ5dGVzX2luX3VzZSxETUFfTU9ERV9XUklURSk7CisJCQlkbWFwLT5mbGFncyB8PSBETUFfU1RBUlRFRDsKKwkJfQorCQlpZiAoZG1hcC0+Y291bnRzW2RtYXAtPnFoZWFkXSA9PSAwKQorCQkJZG1hcC0+Y291bnRzW2RtYXAtPnFoZWFkXSA9IGRtYXAtPmZyYWdtZW50X3NpemU7CisJCWRtYXAtPmRtYV9tb2RlID0gRE1PREVfT1VUUFVUOworCQlhZGV2LT5kLT5vdXRwdXRfYmxvY2soZGV2LCBkbWFwLT5yYXdfYnVmX3BoeXMgKyBkbWFwLT5xaGVhZCAqIGRtYXAtPmZyYWdtZW50X3NpemUsCisJCQkJICAgICAgZG1hcC0+Y291bnRzW2RtYXAtPnFoZWFkXSwgMSk7CisJCWlmIChhZGV2LT5kLT50cmlnZ2VyKQorCQkJYWRldi0+ZC0+dHJpZ2dlcihkZXYsYWRldi0+ZW5hYmxlX2JpdHMgKiBhZGV2LT5nbyk7CisJfQorCWRtYXAtPmZsYWdzIHw9IERNQV9BQ1RJVkU7Cit9CisKK2ludCBETUFidWZfc3luYyhpbnQgZGV2KQoreworCXN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG4gPSAwOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwOworCisJaWYgKCFhZGV2LT5nbyAmJiAhKGFkZXYtPmVuYWJsZV9iaXRzICYgUENNX0VOQUJMRV9PVVRQVVQpKQorCQlyZXR1cm4gMDsKKworCWlmIChhZGV2LT5kbWFwX291dC0+ZG1hX21vZGUgPT0gRE1PREVfT1VUUFVUKSB7CisJCWRtYXAgPSBhZGV2LT5kbWFwX291dDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQlpZiAoZG1hcC0+cWxlbiA+IDAgJiYgIShkbWFwLT5mbGFncyAmIERNQV9BQ1RJVkUpKQorCQkJRE1BYnVmX2xhdW5jaF9vdXRwdXQoZGV2LCBkbWFwKTsKKwkJYWRldi0+ZG1hcF9vdXQtPmZsYWdzIHw9IERNQV9TWU5DSU5HOworCQlhZGV2LT5kbWFwX291dC0+dW5kZXJydW5fY291bnQgPSAwOworCQl3aGlsZSAoIXNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIG4rKyA8PSBhZGV2LT5kbWFwX291dC0+bmJ1ZnMgJiYgCisJCSAgICAgICBhZGV2LT5kbWFwX291dC0+cWxlbiAmJiBhZGV2LT5kbWFwX291dC0+dW5kZXJydW5fY291bnQgPT0gMCkgeworCQkJbG9uZyB0ID0gZG1hYnVmX3RpbWVvdXQoZG1hcCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJCS8qIEZJWE1FOiBub3Qgc2FmZSBtYXkgbWlzcyBldmVudHMgKi8KKwkJCXQgPSBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmFkZXYtPm91dF9zbGVlcGVyLCB0KTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJCWlmICghdCkgeworCQkJCWFkZXYtPmRtYXBfb3V0LT5mbGFncyAmPSB+RE1BX1NZTkNJTkc7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7CisJCQkJcmV0dXJuIGFkZXYtPmRtYXBfb3V0LT5xbGVuOworCQkJfQorCQl9CisJCWFkZXYtPmRtYXBfb3V0LT5mbGFncyAmPSB+KERNQV9TWU5DSU5HIHwgRE1BX0FDVElWRSk7CisJCQorCQkvKgorCQkgKiBTb21lIGRldmljZXMgc3VjaCBhcyBHVVMgaGF2ZSBodWdlIGFtb3VudCBvZiBvbiBib2FyZCBSQU0gZm9yIHRoZQorCQkgKiBhdWRpbyBkYXRhLiBXZSBoYXZlIHRvIHdhaXQgdW50aWwgdGhlIGRldmljZSBoYXMgZmluaXNoZWQgcGxheWluZy4KKwkJICovCisKKwkJLyogc3RpbGwgaG9sZGluZyB0aGUgbG9jayAqLworCQlpZiAoYWRldi0+ZC0+bG9jYWxfcWxlbikgeyAgIC8qIERldmljZSBoYXMgaGlkZGVuIGJ1ZmZlcnMgKi8KKwkJCXdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYKKwkJCSAgICAgICBhZGV2LT5kLT5sb2NhbF9xbGVuKGRldikpeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmYWRldi0+b3V0X3NsZWVwZXIsCisJCQkJCQkJICAgICAgIGRtYWJ1Zl90aW1lb3V0KGRtYXApKTsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hcC0+bG9jayxmbGFncyk7CisJCQl9CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7CisJfQorCWFkZXYtPmRtYXBfb3V0LT5kbWFfbW9kZSA9IERNT0RFX05PTkU7CisJcmV0dXJuIGFkZXYtPmRtYXBfb3V0LT5xbGVuOworfQorCitpbnQgRE1BYnVmX3JlbGVhc2UoaW50IGRldiwgaW50IG1vZGUpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRtYXAgPSBhZGV2LT5kbWFwX291dDsKKwlpZiAoYWRldi0+b3Blbl9tb2RlICYgT1BFTl9XUklURSkKKwkJYWRldi0+ZG1hcF9vdXQtPmNsb3NpbmcgPSAxOworCisJaWYgKGFkZXYtPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCl7CisJCWFkZXYtPmRtYXBfaW4tPmNsb3NpbmcgPSAxOworCQlkbWFwID0gYWRldi0+ZG1hcF9pbjsKKwl9CisJaWYgKGFkZXYtPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpCisJCWlmICghKGFkZXYtPmRtYXBfb3V0LT5tYXBwaW5nX2ZsYWdzICYgRE1BX01BUF9NQVBQRUQpKQorCQkJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiAoYWRldi0+ZG1hcF9vdXQtPmRtYV9tb2RlID09IERNT0RFX09VVFBVVCkpCisJCQkJRE1BYnVmX3N5bmMoZGV2KTsKKwlpZiAoYWRldi0+ZG1hcF9vdXQtPmRtYV9tb2RlID09IERNT0RFX09VVFBVVCkKKwkJbWVtc2V0KGFkZXYtPmRtYXBfb3V0LT5yYXdfYnVmLCBhZGV2LT5kbWFwX291dC0+bmV1dHJhbF9ieXRlLCBhZGV2LT5kbWFwX291dC0+Ynl0ZXNfaW5fdXNlKTsKKworCURNQWJ1Zl9yZXNldChkZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwlhZGV2LT5kLT5jbG9zZShkZXYpOworCisJaWYgKGFkZXYtPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpCisJCWNsb3NlX2RtYXAoYWRldiwgYWRldi0+ZG1hcF9vdXQpOworCisJaWYgKGFkZXYtPm9wZW5fbW9kZSA9PSBPUEVOX1JFQUQgfHwKKwkgICAgKGFkZXYtPm9wZW5fbW9kZSAhPSBPUEVOX1dSSVRFICYmCisJICAgICAoYWRldi0+ZmxhZ3MgJiBETUFfRFVQTEVYKSkpCisJCWNsb3NlX2RtYXAoYWRldiwgYWRldi0+ZG1hcF9pbik7CisJYWRldi0+b3Blbl9tb2RlID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKy8qIGNhbGxlZCB3aXRoIGRtYXAtPmxvY2sgZG9sZCAqLworaW50IERNQWJ1Zl9hY3RpdmF0ZV9yZWNvcmRpbmcoaW50IGRldiwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXApCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJaW50ICBlcnI7CisKKwlpZiAoIShhZGV2LT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpKQorCQlyZXR1cm4gMDsKKwlpZiAoIShhZGV2LT5lbmFibGVfYml0cyAmIFBDTV9FTkFCTEVfSU5QVVQpKQorCQlyZXR1cm4gMDsKKwlpZiAoZG1hcC0+ZG1hX21vZGUgPT0gRE1PREVfT1VUUFVUKSB7CS8qIERpcmVjdGlvbiBjaGFuZ2UgKi8KKwkJLyogcmVsZWFzZSBsb2NrIC0gaXQncyBub3QgcmVjdXJzaXZlICovCisJCXNwaW5fdW5sb2NrX2lycSgmZG1hcC0+bG9jayk7CisJCURNQWJ1Zl9zeW5jKGRldik7CisJCURNQWJ1Zl9yZXNldChkZXYpOworCQlzcGluX2xvY2tfaXJxKCZkbWFwLT5sb2NrKTsKKwkJZG1hcC0+ZG1hX21vZGUgPSBETU9ERV9OT05FOworCX0KKwlpZiAoIWRtYXAtPmRtYV9tb2RlKSB7CisJCXJlb3JnYW5pemVfYnVmZmVycyhkZXYsIGRtYXAsIDEpOworCQlpZiAoKGVyciA9IGFkZXYtPmQtPnByZXBhcmVfZm9yX2lucHV0KGRldiwKKwkJCQlkbWFwLT5mcmFnbWVudF9zaXplLCBkbWFwLT5uYnVmcykpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWRtYXAtPmRtYV9tb2RlID0gRE1PREVfSU5QVVQ7CisJfQorCWlmICghKGRtYXAtPmZsYWdzICYgRE1BX0FDVElWRSkpIHsKKwkJaWYgKGRtYXAtPm5lZWRzX3Jlb3JnKQorCQkJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgZG1hcCwgMCk7CisJCWxvY2FsX3N0YXJ0X2RtYShhZGV2LCBkbWFwLT5yYXdfYnVmX3BoeXMsIGRtYXAtPmJ5dGVzX2luX3VzZSwgRE1BX01PREVfUkVBRCk7CisJCWFkZXYtPmQtPnN0YXJ0X2lucHV0KGRldiwgZG1hcC0+cmF3X2J1Zl9waHlzICsgZG1hcC0+cXRhaWwgKiBkbWFwLT5mcmFnbWVudF9zaXplLAorCQkJCSAgICAgZG1hcC0+ZnJhZ21lbnRfc2l6ZSwgMCk7CisJCWRtYXAtPmZsYWdzIHw9IERNQV9BQ1RJVkU7CisJCWlmIChhZGV2LT5kLT50cmlnZ2VyKQorCQkJYWRldi0+ZC0+dHJpZ2dlcihkZXYsIGFkZXYtPmVuYWJsZV9iaXRzICogYWRldi0+Z28pOworCX0KKwlyZXR1cm4gMDsKK30KKy8qIGFxdWlyZXMgbG9jayAqLworaW50IERNQWJ1Zl9nZXRyZGJ1ZmZlcihpbnQgZGV2LCBjaGFyICoqYnVmLCBpbnQgKmxlbiwgaW50IGRvbnRibG9jaykKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAwLCBuID0gMDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfaW47CisJaW50IGdvOworCisJaWYgKCEoYWRldi0+b3Blbl9tb2RlICYgT1BFTl9SRUFEKSkKKwkJcmV0dXJuIC1FSU87CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCWlmIChkbWFwLT5uZWVkc19yZW9yZykKKwkJcmVvcmdhbml6ZV9idWZmZXJzKGRldiwgZG1hcCwgMCk7CisJaWYgKGFkZXYtPmRtYXBfaW4tPm1hcHBpbmdfZmxhZ3MgJiBETUFfTUFQX01BUFBFRCkgeworLyoJCSAgcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQ6IENhbid0IHJlYWQgZnJvbSBtbWFwcGVkIGRldmljZSAoMSlcbiIpOyovCisJCSAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7CisJCSAgcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHdoaWxlIChkbWFwLT5xbGVuIDw9IDAgJiYgbisrIDwgMTApIHsKKwkJbG9uZyB0aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJCWlmICghKGFkZXYtPmVuYWJsZV9iaXRzICYgUENNX0VOQUJMRV9JTlBVVCkgfHwgIWFkZXYtPmdvKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJCWlmICgoZXJyID0gRE1BYnVmX2FjdGl2YXRlX3JlY29yZGluZyhkZXYsIGRtYXApKSA8IDApIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCQkvKiBXYWl0IGZvciB0aGUgbmV4dCBibG9jayAqLworCisJCWlmIChkb250YmxvY2spIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwkJaWYgKChnbyA9IGFkZXYtPmdvKSkKKwkJCXRpbWVvdXQgPSBkbWFidWZfdGltZW91dChkbWFwKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJdGltZW91dCA9IGludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmYWRldi0+aW5fc2xlZXBlciwKKwkJCQkJCQkgdGltZW91dCk7CisJCWlmICghdGltZW91dCkgeworCQkJLyogRklYTUU6IGluY2x1ZGUgZGV2aWNlIG5hbWUgKi8KKwkJCWVyciA9IC1FSU87CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZDogRE1BIChpbnB1dCkgdGltZWQgb3V0IC0gSVJRL0RSUSBjb25maWcgZXJyb3I/XG4iKTsKKwkJCWRtYV9yZXNldF9pbnB1dChkZXYpOworCQl9IGVsc2UKKwkJCWVyciA9IC1FSU5UUjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKworCWlmIChkbWFwLT5xbGVuIDw9IDApCisJCXJldHVybiBlcnIgPyBlcnIgOiAtRUlOVFI7CisJKmJ1ZiA9ICZkbWFwLT5yYXdfYnVmW2RtYXAtPnFoZWFkICogZG1hcC0+ZnJhZ21lbnRfc2l6ZSArIGRtYXAtPmNvdW50c1tkbWFwLT5xaGVhZF1dOworCSpsZW4gPSBkbWFwLT5mcmFnbWVudF9zaXplIC0gZG1hcC0+Y291bnRzW2RtYXAtPnFoZWFkXTsKKworCXJldHVybiBkbWFwLT5xaGVhZDsKK30KKworaW50IERNQWJ1Zl9ybWNoYXJzKGludCBkZXYsIGludCBidWZmX25vLCBpbnQgYykKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfaW47CisJaW50IHAgPSBkbWFwLT5jb3VudHNbZG1hcC0+cWhlYWRdICsgYzsKKworCWlmIChkbWFwLT5tYXBwaW5nX2ZsYWdzICYgRE1BX01BUF9NQVBQRUQpCisJeworLyoJCSAgcHJpbnRrKCJTb3VuZDogQ2FuJ3QgcmVhZCBmcm9tIG1tYXBwZWQgZGV2aWNlICgyKVxuIik7Ki8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWVsc2UgaWYgKGRtYXAtPnFsZW4gPD0gMCkKKwkJcmV0dXJuIC1FSU87CisJZWxzZSBpZiAocCA+PSBkbWFwLT5mcmFnbWVudF9zaXplKSB7ICAvKiBUaGlzIGJ1ZmZlciBpcyBjb21wbGV0ZWx5IGVtcHR5ICovCisJCWRtYXAtPmNvdW50c1tkbWFwLT5xaGVhZF0gPSAwOworCQlkbWFwLT5xbGVuLS07CisJCWRtYXAtPnFoZWFkID0gKGRtYXAtPnFoZWFkICsgMSkgJSBkbWFwLT5uYnVmczsKKwl9CisJZWxzZSBkbWFwLT5jb3VudHNbZG1hcC0+cWhlYWRdID0gcDsKKworCXJldHVybiAwOworfQorLyogTVVTVCBiZSBjYWxsZWQgd2l0aCBkbWFwLT5sb2NrIGhvbGQgKi8KK2ludCBETUFidWZfZ2V0X2J1ZmZlcl9wb2ludGVyKGludCBkZXYsIHN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwLCBpbnQgZGlyZWN0aW9uKQoreworCS8qCisJICoJVHJ5IHRvIGFwcHJveGltYXRlIHRoZSBhY3RpdmUgYnl0ZSBwb3NpdGlvbiBvZiB0aGUgRE1BIHBvaW50ZXIgd2l0aGluIHRoZQorCSAqCWJ1ZmZlciBhcmVhIGFzIHdlbGwgYXMgcG9zc2libGUuCisJICovCisKKwlpbnQgcG9zOworCXVuc2lnbmVkIGxvbmcgZjsKKworCWlmICghKGRtYXAtPmZsYWdzICYgRE1BX0FDVElWRSkpCisJCXBvcyA9IDA7CisJZWxzZSB7CisJCWludCBjaGFuID0gZG1hcC0+ZG1hOworCQkKKwkJZj1jbGFpbV9kbWFfbG9jaygpOworCQljbGVhcl9kbWFfZmYoY2hhbik7CisJCQorCQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpCisJCQlkaXNhYmxlX2RtYShkbWFwLT5kbWEpOworCQkKKwkJcG9zID0gZ2V0X2RtYV9yZXNpZHVlKGNoYW4pOworCQkKKwkJcG9zID0gZG1hcC0+Ynl0ZXNfaW5fdXNlIC0gcG9zOworCisJCWlmICghKGRtYXAtPm1hcHBpbmdfZmxhZ3MgJiBETUFfTUFQX01BUFBFRCkpIHsKKwkJCWlmIChkaXJlY3Rpb24gPT0gRE1PREVfT1VUUFVUKSB7CisJCQkJaWYgKGRtYXAtPnFoZWFkID09IDApCisJCQkJCWlmIChwb3MgPiBkbWFwLT5mcmFnbWVudF9zaXplKQorCQkJCQkJcG9zID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKGRtYXAtPnF0YWlsID09IDApCisJCQkJCWlmIChwb3MgPiBkbWFwLT5mcmFnbWVudF9zaXplKQorCQkJCQkJcG9zID0gMDsKKwkJCX0KKwkJfQorCQlpZiAocG9zIDwgMCkKKwkJCXBvcyA9IDA7CisJCWlmIChwb3MgPj0gZG1hcC0+Ynl0ZXNfaW5fdXNlKQorCQkJcG9zID0gMDsKKwkJCisJCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkKKwkJCWVuYWJsZV9kbWEoZG1hcC0+ZG1hKTsKKwkJCQorCQlyZWxlYXNlX2RtYV9sb2NrKGYpOworCX0KKwkvKiBwcmludGsoICIlMDR4ICIsICBwb3MpOyAqLworCisJcmV0dXJuIHBvczsKK30KKworLyoKKyAqCURNQWJ1Zl9zdGFydF9kZXZpY2VzKCkgaXMgY2FsbGVkIGJ5IHRoZSAvZGV2L211c2ljIGRyaXZlciB0byBzdGFydAorICoJb25lIG9yIG1vcmUgYXVkaW8gZGV2aWNlcyBhdCBkZXNpcmVkIG1vbWVudC4KKyAqLworCit2b2lkIERNQWJ1Zl9zdGFydF9kZXZpY2VzKHVuc2lnbmVkIGludCBkZXZtYXNrKQoreworCXN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2OworCWludCBkZXY7CisKKwlmb3IgKGRldiA9IDA7IGRldiA8IG51bV9hdWRpb2RldnM7IGRldisrKSB7CisJCWlmICghKGRldm1hc2sgJiAoMSA8PCBkZXYpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIShhZGV2ID0gYXVkaW9fZGV2c1tkZXZdKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoYWRldi0+b3Blbl9tb2RlID09IDApCisJCQljb250aW51ZTsKKwkJaWYgKGFkZXYtPmdvKQorCQkJY29udGludWU7CisJCS8qIE9LIHRvIHN0YXJ0IHRoZSBkZXZpY2UgKi8KKwkJYWRldi0+Z28gPSAxOworCQlpZiAoYWRldi0+ZC0+dHJpZ2dlcikKKwkJCWFkZXYtPmQtPnRyaWdnZXIoZGV2LGFkZXYtPmVuYWJsZV9iaXRzICogYWRldi0+Z28pOworCX0KK30KKy8qIHZpYSBwb2xsIGNhbGxlZCB3aXRob3V0IGEgbG9jayA/Ki8KK2ludCBETUFidWZfc3BhY2VfaW5fcXVldWUoaW50IGRldikKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlpbnQgbGVuLCBtYXgsIHRtcDsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworCWludCBsaW0gPSBkbWFwLT5uYnVmczsKKworCWlmIChsaW0gPCAyKQorCQlsaW0gPSAyOworCisJaWYgKGRtYXAtPnFsZW4gPj0gbGltKQkvKiBObyBzcGFjZSBhdCBhbGwgKi8KKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqCVZlcmlmeSB0aGF0IHRoZXJlIGFyZSBubyBtb3JlIHBlbmRpbmcgYnVmZmVycyB0aGFuIHRoZSBsaW1pdAorCSAqCWRlZmluZWQgYnkgdGhlIHByb2Nlc3MuCisJICovCisKKwltYXggPSBkbWFwLT5tYXhfZnJhZ21lbnRzOworCWlmIChtYXggPiBsaW0pCisJCW1heCA9IGxpbTsKKwlsZW4gPSBkbWFwLT5xbGVuOworCisJaWYgKGFkZXYtPmQtPmxvY2FsX3FsZW4pIHsKKwkJdG1wID0gYWRldi0+ZC0+bG9jYWxfcWxlbihkZXYpOworCQlpZiAodG1wICYmIGxlbikKKwkJCXRtcC0tOwkvKiBUaGlzIGJ1ZmZlciBoYXMgYmVlbiBjb3VudGVkIHR3aWNlICovCisJCWxlbiArPSB0bXA7CisJfQorCWlmIChkbWFwLT5ieXRlX2NvdW50ZXIgJSBkbWFwLT5mcmFnbWVudF9zaXplKQkvKiBUaGVyZSBpcyBhIHBhcnRpYWwgZnJhZ21lbnQgKi8KKwkJbGVuID0gbGVuICsgMTsKKworCWlmIChsZW4gPj0gbWF4KQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gbWF4IC0gbGVuOworfQorLyogTVVTVCBub3QgaG9sZCB0aGUgc3BpbmxvY2sgIC0gdGhpcyBmdW5jdGlvbiBtYXkgc2xlZXAgKi8KK3N0YXRpYyBpbnQgb3V0cHV0X3NsZWVwKGludCBkZXYsIGludCBkb250YmxvY2spCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJaW50IGVyciA9IDA7CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSBhZGV2LT5kbWFwX291dDsKKwlsb25nIHRpbWVvdXQ7CisJbG9uZyB0aW1lb3V0X3ZhbHVlOworCisJaWYgKGRvbnRibG9jaykKKwkJcmV0dXJuIC1FQUdBSU47CisJaWYgKCEoYWRldi0+ZW5hYmxlX2JpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkpCisJCXJldHVybiAtRUFHQUlOOworCisJLyoKKwkgKiBXYWl0IGZvciBmcmVlIHNwYWNlCisJICovCisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVJTlRSOworCXRpbWVvdXQgPSAoYWRldi0+Z28gJiYgIShkbWFwLT5mbGFncyAmIERNQV9OT1RJTUVPVVQpKTsKKwlpZiAodGltZW91dCkgCisJCXRpbWVvdXRfdmFsdWUgPSBkbWFidWZfdGltZW91dChkbWFwKTsKKwllbHNlCisJCXRpbWVvdXRfdmFsdWUgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKKwl0aW1lb3V0X3ZhbHVlID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZhZGV2LT5vdXRfc2xlZXBlciwKKwkJCQkJCSAgICAgICB0aW1lb3V0X3ZhbHVlKTsKKwlpZiAodGltZW91dCAhPSBNQVhfU0NIRURVTEVfVElNRU9VVCAmJiAhdGltZW91dF92YWx1ZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZDogRE1BIChvdXRwdXQpIHRpbWVkIG91dCAtIElSUS9EUlEgY29uZmlnIGVycm9yP1xuIik7CisJCWRtYV9yZXNldF9vdXRwdXQoZGV2KTsKKwl9IGVsc2UgeworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQllcnIgPSAtRUlOVFI7CisJfQorCXJldHVybiBlcnI7Cit9CisvKiBjYWxsZWQgd2l0aCB0aGUgbG9jayBoZWxkICovCitzdGF0aWMgaW50IGZpbmRfb3V0cHV0X3NwYWNlKGludCBkZXYsIGNoYXIgKipidWYsIGludCAqc2l6ZSkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworCXVuc2lnbmVkIGxvbmcgYWN0aXZlX29mZnM7CisJbG9uZyBsZW4sIG9mZnM7CisJaW50IG1heGZyYWdzOworCWludCBvY2N1cGllZF9ieXRlcyA9IChkbWFwLT51c2VyX2NvdW50ZXIgJSBkbWFwLT5mcmFnbWVudF9zaXplKTsKKworCSpidWYgPSBkbWFwLT5yYXdfYnVmOworCWlmICghKG1heGZyYWdzID0gRE1BYnVmX3NwYWNlX2luX3F1ZXVlKGRldikpICYmICFvY2N1cGllZF9ieXRlcykKKwkJcmV0dXJuIDA7CisKKyNpZmRlZiBCRV9DT05TRVJWQVRJVkUKKwlhY3RpdmVfb2ZmcyA9IGRtYXAtPmJ5dGVfY291bnRlciArIGRtYXAtPnFoZWFkICogZG1hcC0+ZnJhZ21lbnRfc2l6ZTsKKyNlbHNlCisJYWN0aXZlX29mZnMgPSBETUFidWZfZ2V0X2J1ZmZlcl9wb2ludGVyKGRldiwgZG1hcCwgRE1PREVfT1VUUFVUKTsKKwkvKiBDaGVjayBmb3IgcG9pbnRlciB3cmFwcGluZyBzaXR1YXRpb24gKi8KKwlpZiAoYWN0aXZlX29mZnMgPCAwIHx8IGFjdGl2ZV9vZmZzID49IGRtYXAtPmJ5dGVzX2luX3VzZSkKKwkJYWN0aXZlX29mZnMgPSAwOworCWFjdGl2ZV9vZmZzICs9IGRtYXAtPmJ5dGVfY291bnRlcjsKKyNlbmRpZgorCisJb2ZmcyA9IChkbWFwLT51c2VyX2NvdW50ZXIgJSBkbWFwLT5ieXRlc19pbl91c2UpICYgflNBTVBMRV9ST1VORFVQOworCWlmIChvZmZzIDwgMCB8fCBvZmZzID49IGRtYXAtPmJ5dGVzX2luX3VzZSkgeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBHb3QgdW5leHBlY3RlZCBvZmZzICVsZC4gR2l2aW5nIHVwLlxuIiwgb2Zmcyk7CisJCXByaW50aygiQ291bnRlciA9ICVsZCwgYnl0ZXM9JWRcbiIsIGRtYXAtPnVzZXJfY291bnRlciwgZG1hcC0+Ynl0ZXNfaW5fdXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCSpidWYgPSBkbWFwLT5yYXdfYnVmICsgb2ZmczsKKworCWxlbiA9IGFjdGl2ZV9vZmZzICsgZG1hcC0+Ynl0ZXNfaW5fdXNlIC0gZG1hcC0+dXNlcl9jb3VudGVyOwkvKiBOdW1iZXIgb2YgdW51c2VkIGJ5dGVzIGluIGJ1ZmZlciAqLworCisJaWYgKChvZmZzICsgbGVuKSA+IGRtYXAtPmJ5dGVzX2luX3VzZSkKKwkJbGVuID0gZG1hcC0+Ynl0ZXNfaW5fdXNlIC0gb2ZmczsKKwlpZiAobGVuIDwgMCkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGxlbiA+ICgobWF4ZnJhZ3MgKiBkbWFwLT5mcmFnbWVudF9zaXplKSAtIG9jY3VwaWVkX2J5dGVzKSkKKwkJbGVuID0gKG1heGZyYWdzICogZG1hcC0+ZnJhZ21lbnRfc2l6ZSkgLSBvY2N1cGllZF9ieXRlczsKKwkqc2l6ZSA9IGxlbiAmIH5TQU1QTEVfUk9VTkRVUDsKKwlyZXR1cm4gKCpzaXplID4gMCk7Cit9CisvKiBhcXVpcmVzIGxvY2sgICovCitpbnQgRE1BYnVmX2dldHdyYnVmZmVyKGludCBkZXYsIGNoYXIgKipidWYsIGludCAqc2l6ZSwgaW50IGRvbnRibG9jaykKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBlcnIgPSAtRUlPOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYWRldi0+ZG1hcF9vdXQ7CisKKwlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKSB7CisvKgkJcHJpbnRrKEtFUk5fREVCVUcgIlNvdW5kOiBDYW4ndCB3cml0ZSB0byBtbWFwcGVkIGRldmljZSAoMylcbiIpOyovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hcC0+bG9jayxmbGFncyk7CisJaWYgKGRtYXAtPm5lZWRzX3Jlb3JnKQorCQlyZW9yZ2FuaXplX2J1ZmZlcnMoZGV2LCBkbWFwLCAwKTsKKworCWlmIChkbWFwLT5kbWFfbW9kZSA9PSBETU9ERV9JTlBVVCkgewkvKiBEaXJlY3Rpb24gY2hhbmdlICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQlETUFidWZfcmVzZXQoZGV2KTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCX0KKwlkbWFwLT5kbWFfbW9kZSA9IERNT0RFX09VVFBVVDsKKworCXdoaWxlIChmaW5kX291dHB1dF9zcGFjZShkZXYsIGJ1Ziwgc2l6ZSkgPD0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJaWYgKChlcnIgPSBvdXRwdXRfc2xlZXAoZGV2LCBkb250YmxvY2spKSA8IDApIHsKKwkJCXJldHVybiBlcnI7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorLyogaGFzIHRvIGFxdWlyZSBkbWFwLT5sb2NrICovCitpbnQgRE1BYnVmX21vdmVfd3Jwb2ludGVyKGludCBkZXYsIGludCBsKQoreworCXN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYWRldi0+ZG1hcF9vdXQ7CisJdW5zaWduZWQgbG9uZyBwdHI7CisJdW5zaWduZWQgbG9uZyBlbmRfcHRyLCBwOworCWludCBwb3N0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hcC0+bG9jayxmbGFncyk7CisJcG9zdD0gKGRtYXAtPmZsYWdzICYgRE1BX1BPU1QpOworCXB0ciA9IChkbWFwLT51c2VyX2NvdW50ZXIgLyBkbWFwLT5mcmFnbWVudF9zaXplKSAqIGRtYXAtPmZyYWdtZW50X3NpemU7CisKKwlkbWFwLT5mbGFncyAmPSB+RE1BX1BPU1Q7CisJZG1hcC0+Y2ZyYWcgPSAtMTsKKwlkbWFwLT51c2VyX2NvdW50ZXIgKz0gbDsKKwlkbWFwLT5mbGFncyB8PSBETUFfRElSVFk7CisKKwlpZiAoZG1hcC0+Ynl0ZV9jb3VudGVyID49IGRtYXAtPm1heF9ieXRlX2NvdW50ZXIpIHsKKwkJLyogV3JhcCB0aGUgYnl0ZSBjb3VudGVycyAqLworCQlsb25nIGRlY3IgPSBkbWFwLT5ieXRlX2NvdW50ZXI7CisJCWRtYXAtPmJ5dGVfY291bnRlciA9IChkbWFwLT5ieXRlX2NvdW50ZXIgJSBkbWFwLT5ieXRlc19pbl91c2UpOworCQlkZWNyIC09IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJZG1hcC0+dXNlcl9jb3VudGVyIC09IGRlY3I7CisJfQorCWVuZF9wdHIgPSAoZG1hcC0+dXNlcl9jb3VudGVyIC8gZG1hcC0+ZnJhZ21lbnRfc2l6ZSkgKiBkbWFwLT5mcmFnbWVudF9zaXplOworCisJcCA9IChkbWFwLT51c2VyX2NvdW50ZXIgLSAxKSAlIGRtYXAtPmJ5dGVzX2luX3VzZTsKKwlkbWFwLT5uZXV0cmFsX2J5dGUgPSBkbWFwLT5yYXdfYnVmW3BdOworCisJLyogVXBkYXRlIHRoZSBmcmFnbWVudCBiYXNlZCBib29ra2VlcGluZyB0b28gKi8KKwl3aGlsZSAocHRyIDwgZW5kX3B0cikgeworCQlkbWFwLT5jb3VudHNbZG1hcC0+cXRhaWxdID0gZG1hcC0+ZnJhZ21lbnRfc2l6ZTsKKwkJZG1hcC0+cXRhaWwgPSAoZG1hcC0+cXRhaWwgKyAxKSAlIGRtYXAtPm5idWZzOworCQlkbWFwLT5xbGVuKys7CisJCXB0ciArPSBkbWFwLT5mcmFnbWVudF9zaXplOworCX0KKworCWRtYXAtPmNvdW50c1tkbWFwLT5xdGFpbF0gPSBkbWFwLT51c2VyX2NvdW50ZXIgLSBwdHI7CisKKwkvKgorCSAqCUxldCB0aGUgbG93IGxldmVsIGRyaXZlciBwZXJmb3JtIHNvbWUgcG9zdHByb2Nlc3NpbmcgdG8KKwkgKgl0aGUgd3JpdHRlbiBkYXRhLgorCSAqLworCWlmIChhZGV2LT5kLT5wb3N0cHJvY2Vzc193cml0ZSkKKwkJYWRldi0+ZC0+cG9zdHByb2Nlc3Nfd3JpdGUoZGV2KTsKKworCWlmICghKGRtYXAtPmZsYWdzICYgRE1BX0FDVElWRSkpCisJCWlmIChkbWFwLT5xbGVuID4gMSB8fCAoZG1hcC0+cWxlbiA+IDAgJiYgKHBvc3QgfHwgZG1hcC0+cWxlbiA+PSBkbWFwLT5uYnVmcyAtIDEpKSkKKwkJCURNQWJ1Zl9sYXVuY2hfb3V0cHV0KGRldiwgZG1hcCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworaW50IERNQWJ1Zl9zdGFydF9kbWEoaW50IGRldiwgdW5zaWduZWQgbG9uZyBwaHlzYWRkciwgaW50IGNvdW50LCBpbnQgZG1hX21vZGUpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSAoZG1hX21vZGUgPT0gRE1BX01PREVfV1JJVEUpID8gYWRldi0+ZG1hcF9vdXQgOiBhZGV2LT5kbWFwX2luOworCisJaWYgKGRtYXAtPnJhd19idWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kOiBETUEgYnVmZmVyKDEpID09IE5VTExcbiIpOworCQlwcmludGsoIkRldmljZSAlZCwgY2huPSVzXG4iLCBkZXYsIChkbWFwID09IGFkZXYtPmRtYXBfb3V0KSA/ICJvdXQiIDogImluIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoZG1hcC0+ZG1hIDwgMCkKKwkJcmV0dXJuIDA7CisJc291bmRfc3RhcnRfZG1hKGRtYXAsIHBoeXNhZGRyLCBjb3VudCwgZG1hX21vZGUpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBsb2NhbF9zdGFydF9kbWEoc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c2FkZHIsIGludCBjb3VudCwgaW50IGRtYV9tb2RlKQoreworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gKGRtYV9tb2RlID09IERNQV9NT0RFX1dSSVRFKSA/IGFkZXYtPmRtYXBfb3V0IDogYWRldi0+ZG1hcF9pbjsKKworCWlmIChkbWFwLT5yYXdfYnVmID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZDogRE1BIGJ1ZmZlcigyKSA9PSBOVUxMXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJEZXZpY2UgJXMsIGNobj0lc1xuIiwgYWRldi0+bmFtZSwgKGRtYXAgPT0gYWRldi0+ZG1hcF9vdXQpID8gIm91dCIgOiAiaW4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChkbWFwLT5mbGFncyAmIERNQV9OT0RNQSkKKwkJcmV0dXJuIDE7CisJaWYgKGRtYXAtPmRtYSA8IDApCisJCXJldHVybiAwOworCXNvdW5kX3N0YXJ0X2RtYShkbWFwLCBkbWFwLT5yYXdfYnVmX3BoeXMsIGRtYXAtPmJ5dGVzX2luX3VzZSwgZG1hX21vZGUgfCBETUFfQVVUT0lOSVQpOworCWRtYXAtPmZsYWdzIHw9IERNQV9TVEFSVEVEOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHZvaWQgZmluaXNoX291dHB1dF9pbnRlcnJ1cHQoaW50IGRldiwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXApCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisKKwlpZiAoZG1hcC0+YXVkaW9fY2FsbGJhY2sgIT0gTlVMTCkKKwkJZG1hcC0+YXVkaW9fY2FsbGJhY2soZGV2LCBkbWFwLT5jYWxsYmFja19wYXJtKTsKKwl3YWtlX3VwKCZhZGV2LT5vdXRfc2xlZXBlcik7CisJd2FrZV91cCgmYWRldi0+cG9sbF9zbGVlcGVyKTsKK30KKy8qIGNhbGxlZCB3aXRoIGRtYXAtPmxvY2sgaGVsZCBpbiBpcnEgY29udGV4dCovCitzdGF0aWMgdm9pZCBkb19vdXRwdXRpbnRyKGludCBkZXYsIGludCBkdW1teSkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworCWludCB0aGlzX2ZyYWdtZW50OworCisJaWYgKGRtYXAtPnJhd19idWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBFcnJvci4gQXVkaW8gaW50ZXJydXB0ICglZCkgYWZ0ZXIgZnJlZWluZyBidWZmZXJzLlxuIiwgZGV2KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKSB7CS8qIFZpcnR1YWwgbWVtb3J5IG1hcHBlZCBhY2Nlc3MgKi8KKwkJLyogbW1hcHBlZCBhY2Nlc3MgKi8KKwkJZG1hcC0+cWhlYWQgPSAoZG1hcC0+cWhlYWQgKyAxKSAlIGRtYXAtPm5idWZzOworCQlpZiAoZG1hcC0+cWhlYWQgPT0gMCkgewkgICAgLyogV3JhcHBlZCAqLworCQkJZG1hcC0+Ynl0ZV9jb3VudGVyICs9IGRtYXAtPmJ5dGVzX2luX3VzZTsKKwkJCWlmIChkbWFwLT5ieXRlX2NvdW50ZXIgPj0gZG1hcC0+bWF4X2J5dGVfY291bnRlcikgewkvKiBPdmVyZmxvdyAqLworCQkJCWxvbmcgZGVjciA9IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCQlkbWFwLT5ieXRlX2NvdW50ZXIgPSAoZG1hcC0+Ynl0ZV9jb3VudGVyICUgZG1hcC0+Ynl0ZXNfaW5fdXNlKTsKKwkJCQlkZWNyIC09IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCQlkbWFwLT51c2VyX2NvdW50ZXIgLT0gZGVjcjsKKwkJCX0KKwkJfQorCQlkbWFwLT5xbGVuKys7CS8qIFllcyBpbmNyZW1lbnQgaXQgKGRvbid0IGRlY3JlbWVudCkgKi8KKwkJaWYgKCEoYWRldi0+ZmxhZ3MgJiBETUFfQVVUT01PREUpKQorCQkJZG1hcC0+ZmxhZ3MgJj0gfkRNQV9BQ1RJVkU7CisJCWRtYXAtPmNvdW50c1tkbWFwLT5xaGVhZF0gPSBkbWFwLT5mcmFnbWVudF9zaXplOworCQlETUFidWZfbGF1bmNoX291dHB1dChkZXYsIGRtYXApOworCQlmaW5pc2hfb3V0cHV0X2ludGVycnVwdChkZXYsIGRtYXApOworCQlyZXR1cm47CisJfQorCisJZG1hcC0+cWxlbi0tOworCXRoaXNfZnJhZ21lbnQgPSBkbWFwLT5xaGVhZDsKKwlkbWFwLT5xaGVhZCA9IChkbWFwLT5xaGVhZCArIDEpICUgZG1hcC0+bmJ1ZnM7CisKKwlpZiAoZG1hcC0+cWhlYWQgPT0gMCkgewkvKiBXcmFwcGVkICovCisJCWRtYXAtPmJ5dGVfY291bnRlciArPSBkbWFwLT5ieXRlc19pbl91c2U7CisJCWlmIChkbWFwLT5ieXRlX2NvdW50ZXIgPj0gZG1hcC0+bWF4X2J5dGVfY291bnRlcikgewkvKiBPdmVyZmxvdyAqLworCQkJbG9uZyBkZWNyID0gZG1hcC0+Ynl0ZV9jb3VudGVyOworCQkJZG1hcC0+Ynl0ZV9jb3VudGVyID0gKGRtYXAtPmJ5dGVfY291bnRlciAlIGRtYXAtPmJ5dGVzX2luX3VzZSk7CisJCQlkZWNyIC09IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCWRtYXAtPnVzZXJfY291bnRlciAtPSBkZWNyOworCQl9CisJfQorCWlmICghKGFkZXYtPmZsYWdzICYgRE1BX0FVVE9NT0RFKSkKKwkJZG1hcC0+ZmxhZ3MgJj0gfkRNQV9BQ1RJVkU7CisJCQorCS8qCisJICoJVGhpcyBpcyAgZG1hcC0+cWxlbiA8PSAwIGV4Y2VwdCB3aGVuIGNsb3Npbmcgd2hlbgorCSAqCWRtYXAtPnFsZW4gPCAwCisJICovCisJIAorCXdoaWxlIChkbWFwLT5xbGVuIDw9IC1kbWFwLT5jbG9zaW5nKSB7CisJCWRtYXAtPnVuZGVycnVuX2NvdW50Kys7CisJCWRtYXAtPnFsZW4rKzsKKwkJaWYgKChkbWFwLT5mbGFncyAmIERNQV9ESVJUWSkgJiYgZG1hcC0+YXBwbGljX3Byb2ZpbGUgIT0gQVBGX0NQVUlOVEVOUykgeworCQkJZG1hcC0+ZmxhZ3MgJj0gfkRNQV9ESVJUWTsKKwkJCW1lbXNldChhZGV2LT5kbWFwX291dC0+cmF3X2J1ZiwgYWRldi0+ZG1hcF9vdXQtPm5ldXRyYWxfYnl0ZSwKKwkJCSAgICAgICBhZGV2LT5kbWFwX291dC0+YnVmZnNpemUpOworCQl9CisJCWRtYXAtPnVzZXJfY291bnRlciArPSBkbWFwLT5mcmFnbWVudF9zaXplOworCQlkbWFwLT5xdGFpbCA9IChkbWFwLT5xdGFpbCArIDEpICUgZG1hcC0+bmJ1ZnM7CisJfQorCWlmIChkbWFwLT5xbGVuID4gMCkKKwkJRE1BYnVmX2xhdW5jaF9vdXRwdXQoZGV2LCBkbWFwKTsKKwlmaW5pc2hfb3V0cHV0X2ludGVycnVwdChkZXYsIGRtYXApOworfQorLyogY2FsbGVkIGluIGlycSBjb250ZXh0ICovCit2b2lkIERNQWJ1Zl9vdXRwdXRpbnRyKGludCBkZXYsIGludCBub3RpZnlfb25seSkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYWRldi0+ZG1hcF9vdXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hcC0+bG9jayxmbGFncyk7CisJaWYgKCEoZG1hcC0+ZmxhZ3MgJiBETUFfTk9ETUEpKSB7CisJCWludCBjaGFuID0gZG1hcC0+ZG1hLCBwb3MsIG47CisJCXVuc2lnbmVkIGxvbmcgZjsKKwkJCisJCWY9Y2xhaW1fZG1hX2xvY2soKTsKKwkJCisJCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkKKwkJCWRpc2FibGVfZG1hKGRtYXAtPmRtYSk7CisJCWNsZWFyX2RtYV9mZihjaGFuKTsKKwkJcG9zID0gZG1hcC0+Ynl0ZXNfaW5fdXNlIC0gZ2V0X2RtYV9yZXNpZHVlKGNoYW4pOworCQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpCisJCQllbmFibGVfZG1hKGRtYXAtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZik7CisJCQorCQlwb3MgPSBwb3MgLyBkbWFwLT5mcmFnbWVudF9zaXplOwkvKiBBY3R1YWwgcWhlYWQgKi8KKwkJaWYgKHBvcyA8IDAgfHwgcG9zID49IGRtYXAtPm5idWZzKQorCQkJcG9zID0gMDsKKwkJbiA9IDA7CisJCXdoaWxlIChkbWFwLT5xaGVhZCAhPSBwb3MgJiYgbisrIDwgZG1hcC0+bmJ1ZnMpCisJCQlkb19vdXRwdXRpbnRyKGRldiwgbm90aWZ5X29ubHkpOworCX0KKwllbHNlCisJCWRvX291dHB1dGludHIoZGV2LCBub3RpZnlfb25seSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7Cit9CisvKiBjYWxsZWQgd2l0aCBkbWFwLT5sb2NrIGhlbGQgaW4gaXJxIGNvbnRleHQgKi8KK3N0YXRpYyB2b2lkIGRvX2lucHV0aW50cihpbnQgZGV2KQoreworCXN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYWRldi0+ZG1hcF9pbjsKKworCWlmIChkbWFwLT5yYXdfYnVmID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogRmF0YWwgZXJyb3IuIEF1ZGlvIGludGVycnVwdCBhZnRlciBmcmVlaW5nIGJ1ZmZlcnMuXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKSB7CisJCWRtYXAtPnF0YWlsID0gKGRtYXAtPnF0YWlsICsgMSkgJSBkbWFwLT5uYnVmczsKKwkJaWYgKGRtYXAtPnF0YWlsID09IDApIHsJCS8qIFdyYXBwZWQgKi8KKwkJCWRtYXAtPmJ5dGVfY291bnRlciArPSBkbWFwLT5ieXRlc19pbl91c2U7CisJCQlpZiAoZG1hcC0+Ynl0ZV9jb3VudGVyID49IGRtYXAtPm1heF9ieXRlX2NvdW50ZXIpIHsJLyogT3ZlcmZsb3cgKi8KKwkJCQlsb25nIGRlY3IgPSBkbWFwLT5ieXRlX2NvdW50ZXI7CisJCQkJZG1hcC0+Ynl0ZV9jb3VudGVyID0gKGRtYXAtPmJ5dGVfY291bnRlciAlIGRtYXAtPmJ5dGVzX2luX3VzZSkgKyBkbWFwLT5ieXRlc19pbl91c2U7CisJCQkJZGVjciAtPSBkbWFwLT5ieXRlX2NvdW50ZXI7CisJCQkJZG1hcC0+dXNlcl9jb3VudGVyIC09IGRlY3I7CisJCQl9CisJCX0KKwkJZG1hcC0+cWxlbisrOworCisJCWlmICghKGFkZXYtPmZsYWdzICYgRE1BX0FVVE9NT0RFKSkgeworCQkJaWYgKGRtYXAtPm5lZWRzX3Jlb3JnKQorCQkJCXJlb3JnYW5pemVfYnVmZmVycyhkZXYsIGRtYXAsIDApOworCQkJbG9jYWxfc3RhcnRfZG1hKGFkZXYsIGRtYXAtPnJhd19idWZfcGh5cywgZG1hcC0+Ynl0ZXNfaW5fdXNlLERNQV9NT0RFX1JFQUQpOworCQkJYWRldi0+ZC0+c3RhcnRfaW5wdXQoZGV2LCBkbWFwLT5yYXdfYnVmX3BoeXMgKyBkbWFwLT5xdGFpbCAqIGRtYXAtPmZyYWdtZW50X3NpemUsCisJCQkJCSAgICAgZG1hcC0+ZnJhZ21lbnRfc2l6ZSwgMSk7CisJCQlpZiAoYWRldi0+ZC0+dHJpZ2dlcikKKwkJCQlhZGV2LT5kLT50cmlnZ2VyKGRldiwgYWRldi0+ZW5hYmxlX2JpdHMgKiBhZGV2LT5nbyk7CisJCX0KKwkJZG1hcC0+ZmxhZ3MgfD0gRE1BX0FDVElWRTsKKwl9IGVsc2UgaWYgKGRtYXAtPnFsZW4gPj0gKGRtYXAtPm5idWZzIC0gMSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQ6IFJlY29yZGluZyBvdmVycnVuXG4iKTsKKwkJZG1hcC0+dW5kZXJydW5fY291bnQrKzsKKworCQkvKiBKdXN0IHRocm93IGF3YXkgdGhlIG9sZGVzdCBmcmFnbWVudCBidXQga2VlcCB0aGUgZW5naW5lIHJ1bm5pbmcgKi8KKwkJZG1hcC0+cWhlYWQgPSAoZG1hcC0+cWhlYWQgKyAxKSAlIGRtYXAtPm5idWZzOworCQlkbWFwLT5xdGFpbCA9IChkbWFwLT5xdGFpbCArIDEpICUgZG1hcC0+bmJ1ZnM7CisJfSBlbHNlIGlmIChkbWFwLT5xbGVuID49IDAgJiYgZG1hcC0+cWxlbiA8IGRtYXAtPm5idWZzKSB7CisJCWRtYXAtPnFsZW4rKzsKKwkJZG1hcC0+cXRhaWwgPSAoZG1hcC0+cXRhaWwgKyAxKSAlIGRtYXAtPm5idWZzOworCQlpZiAoZG1hcC0+cXRhaWwgPT0gMCkgewkJLyogV3JhcHBlZCAqLworCQkJZG1hcC0+Ynl0ZV9jb3VudGVyICs9IGRtYXAtPmJ5dGVzX2luX3VzZTsKKwkJCWlmIChkbWFwLT5ieXRlX2NvdW50ZXIgPj0gZG1hcC0+bWF4X2J5dGVfY291bnRlcikgewkvKiBPdmVyZmxvdyAqLworCQkJCWxvbmcgZGVjciA9IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCQlkbWFwLT5ieXRlX2NvdW50ZXIgPSAoZG1hcC0+Ynl0ZV9jb3VudGVyICUgZG1hcC0+Ynl0ZXNfaW5fdXNlKSArIGRtYXAtPmJ5dGVzX2luX3VzZTsKKwkJCQlkZWNyIC09IGRtYXAtPmJ5dGVfY291bnRlcjsKKwkJCQlkbWFwLT51c2VyX2NvdW50ZXIgLT0gZGVjcjsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIShhZGV2LT5mbGFncyAmIERNQV9BVVRPTU9ERSkgfHwgKGRtYXAtPmZsYWdzICYgRE1BX05PRE1BKSkgeworCQlsb2NhbF9zdGFydF9kbWEoYWRldiwgZG1hcC0+cmF3X2J1Zl9waHlzLCBkbWFwLT5ieXRlc19pbl91c2UsIERNQV9NT0RFX1JFQUQpOworCQlhZGV2LT5kLT5zdGFydF9pbnB1dChkZXYsIGRtYXAtPnJhd19idWZfcGh5cyArIGRtYXAtPnF0YWlsICogZG1hcC0+ZnJhZ21lbnRfc2l6ZSwgZG1hcC0+ZnJhZ21lbnRfc2l6ZSwgMSk7CisJCWlmIChhZGV2LT5kLT50cmlnZ2VyKQorCQkJYWRldi0+ZC0+dHJpZ2dlcihkZXYsYWRldi0+ZW5hYmxlX2JpdHMgKiBhZGV2LT5nbyk7CisJfQorCWRtYXAtPmZsYWdzIHw9IERNQV9BQ1RJVkU7CisJaWYgKGRtYXAtPnFsZW4gPiAwKQorCXsKKwkJd2FrZV91cCgmYWRldi0+aW5fc2xlZXBlcik7CisJCXdha2VfdXAoJmFkZXYtPnBvbGxfc2xlZXBlcik7CisJfQorfQorLyogY2FsbGVkIGluIGlycSBjb250ZXh0ICovCit2b2lkIERNQWJ1Zl9pbnB1dGludHIoaW50IGRldikKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfaW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKworCWlmICghKGRtYXAtPmZsYWdzICYgRE1BX05PRE1BKSkgeworCQlpbnQgY2hhbiA9IGRtYXAtPmRtYSwgcG9zLCBuOworCQl1bnNpZ25lZCBsb25nIGY7CisJCQorCQlmPWNsYWltX2RtYV9sb2NrKCk7CisJCWlmKCFpc2FfZG1hX2JyaWRnZV9idWdneSkKKwkJCWRpc2FibGVfZG1hKGRtYXAtPmRtYSk7CisJCWNsZWFyX2RtYV9mZihjaGFuKTsKKwkJcG9zID0gZG1hcC0+Ynl0ZXNfaW5fdXNlIC0gZ2V0X2RtYV9yZXNpZHVlKGNoYW4pOworCQlpZighaXNhX2RtYV9icmlkZ2VfYnVnZ3kpCisJCQllbmFibGVfZG1hKGRtYXAtPmRtYSk7CisJCXJlbGVhc2VfZG1hX2xvY2soZik7CisKKwkJcG9zID0gcG9zIC8gZG1hcC0+ZnJhZ21lbnRfc2l6ZTsJLyogQWN0dWFsIHFoZWFkICovCisJCWlmIChwb3MgPCAwIHx8IHBvcyA+PSBkbWFwLT5uYnVmcykKKwkJCXBvcyA9IDA7CisKKwkJbiA9IDA7CisJCXdoaWxlIChkbWFwLT5xdGFpbCAhPSBwb3MgJiYgKytuIDwgZG1hcC0+bmJ1ZnMpCisJCQlkb19pbnB1dGludHIoZGV2KTsKKwl9IGVsc2UKKwkJZG9faW5wdXRpbnRyKGRldik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hcC0+bG9jayxmbGFncyk7Cit9CisKK2ludCBETUFidWZfb3Blbl9kbWEoaW50IGRldikKK3sKKwkvKgorCSAqICAgIE5PVEUhICBUaGlzIHJvdXRpbmUgb3BlbnMgb25seSB0aGUgcHJpbWFyeSBETUEgY2hhbm5lbCAob3V0cHV0KS4KKwkgKi8KKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlpbnQgZXJyOworCisJaWYgKChlcnIgPSBvcGVuX2RtYXAoYWRldiwgT1BFTl9SRUFEV1JJVEUsIGFkZXYtPmRtYXBfb3V0KSkgPCAwKQorCQlyZXR1cm4gLUVCVVNZOworCWRtYV9pbml0X2J1ZmZlcnMoYWRldi0+ZG1hcF9vdXQpOworCWFkZXYtPmRtYXBfb3V0LT5mbGFncyB8PSBETUFfQUxMT0NfRE9ORTsKKwlhZGV2LT5kbWFwX291dC0+ZnJhZ21lbnRfc2l6ZSA9IGFkZXYtPmRtYXBfb3V0LT5idWZmc2l6ZTsKKworCWlmIChhZGV2LT5kbWFwX291dC0+ZG1hID49IDApIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlmbGFncz1jbGFpbV9kbWFfbG9jaygpOworCQljbGVhcl9kbWFfZmYoYWRldi0+ZG1hcF9vdXQtPmRtYSk7CisJCWRpc2FibGVfZG1hKGFkZXYtPmRtYXBfb3V0LT5kbWEpOworCQlyZWxlYXNlX2RtYV9sb2NrKGZsYWdzKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgRE1BYnVmX2Nsb3NlX2RtYShpbnQgZGV2KQoreworCWNsb3NlX2RtYXAoYXVkaW9fZGV2c1tkZXZdLCBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0KTsKK30KKwordm9pZCBETUFidWZfaW5pdChpbnQgZGV2LCBpbnQgZG1hMSwgaW50IGRtYTIpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisJLyoKKwkgKiBOT1RFISBUaGlzIHJvdXRpbmUgY291bGQgYmUgY2FsbGVkIHNldmVyYWwgdGltZXMuCisJICovCisKKwkvKiBkcmFnIGluIGF1ZGlvX3N5bXMubyAqLworCXsKKwkJZXh0ZXJuIGNoYXIgYXVkaW9fc3ltc19zeW1ib2w7CisJCWF1ZGlvX3N5bXNfc3ltYm9sID0gMDsKKwl9CisKKwlpZiAoYWRldiAmJiBhZGV2LT5kbWFwX291dCA9PSBOVUxMKSB7CisJCWlmIChhZGV2LT5kID09IE5VTEwpCisJCQlwYW5pYygiT1NTOiBhdWRpb19kZXZzWyVkXS0+ZCA9PSBOVUxMXG4iLCBkZXYpOworCisJCWlmIChhZGV2LT5wYXJlbnRfZGV2KSB7CSAvKiBVc2UgRE1BIG1hcCBvZiB0aGUgcGFyZW50IGRldiAqLworCQkJaW50IHBhcmVudCA9IGFkZXYtPnBhcmVudF9kZXYgLSAxOworCQkJYWRldi0+ZG1hcF9vdXQgPSBhdWRpb19kZXZzW3BhcmVudF0tPmRtYXBfb3V0OworCQkJYWRldi0+ZG1hcF9pbiA9IGF1ZGlvX2RldnNbcGFyZW50XS0+ZG1hcF9pbjsKKwkJfSBlbHNlIHsKKwkJCWFkZXYtPmRtYXBfb3V0ID0gYWRldi0+ZG1hcF9pbiA9ICZhZGV2LT5kbWFwc1swXTsKKwkJCWFkZXYtPmRtYXBfb3V0LT5kbWEgPSBkbWExOworCQkJaWYgKGFkZXYtPmZsYWdzICYgRE1BX0RVUExFWCkgeworCQkJCWFkZXYtPmRtYXBfaW4gPSAmYWRldi0+ZG1hcHNbMV07CisJCQkJYWRldi0+ZG1hcF9pbi0+ZG1hID0gZG1hMjsKKwkJCX0KKwkJfQorCQkvKiBQZXJzaXN0ZW50IERNQSBidWZmZXJzIGFsbG9jYXRlZCBoZXJlICovCisJCWlmIChzb3VuZF9kbWFwX2ZsYWcgPT0gRE1BUF9LRUVQX09OX0NMT1NFKSB7CisJCQlpZiAoYWRldi0+ZG1hcF9pbi0+cmF3X2J1ZiA9PSBOVUxMKQorCQkJCXNvdW5kX2FsbG9jX2RtYXAoYWRldi0+ZG1hcF9pbik7CisJCQlpZiAoYWRldi0+ZG1hcF9vdXQtPnJhd19idWYgPT0gTlVMTCkKKwkJCQlzb3VuZF9hbGxvY19kbWFwKGFkZXYtPmRtYXBfb3V0KTsKKwkJfQorCX0KK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBETUFidWZfYWN0aXZhdGVfcmVjb3JkaW5nIHByb3RlY3RlZCBieSBnbG9iYWwgY2xpL3N0aSAqLworc3RhdGljIHVuc2lnbmVkIGludCBwb2xsX2lucHV0KHN0cnVjdCBmaWxlICogZmlsZSwgaW50IGRldiwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfaW47CisKKwlpZiAoIShhZGV2LT5vcGVuX21vZGUgJiBPUEVOX1JFQUQpKQorCQlyZXR1cm4gMDsKKwlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKSB7CisJCWlmIChkbWFwLT5xbGVuKQorCQkJcmV0dXJuIFBPTExJTiB8IFBPTExSRE5PUk07CisJCXJldHVybiAwOworCX0KKwlpZiAoZG1hcC0+ZG1hX21vZGUgIT0gRE1PREVfSU5QVVQpIHsKKwkJaWYgKGRtYXAtPmRtYV9tb2RlID09IERNT0RFX05PTkUgJiYKKwkJICAgIGFkZXYtPmVuYWJsZV9iaXRzICYgUENNX0VOQUJMRV9JTlBVVCAmJgorCQkgICAgIWRtYXAtPnFsZW4gJiYgYWRldi0+Z28pIHsKKwkJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCQkKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFwLT5sb2NrLGZsYWdzKTsKKwkJCURNQWJ1Zl9hY3RpdmF0ZV9yZWNvcmRpbmcoZGV2LCBkbWFwKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXAtPmxvY2ssZmxhZ3MpOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoIWRtYXAtPnFsZW4pCisJCXJldHVybiAwOworCXJldHVybiBQT0xMSU4gfCBQT0xMUkROT1JNOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBvbGxfb3V0cHV0KHN0cnVjdCBmaWxlICogZmlsZSwgaW50IGRldiwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworCQorCWlmICghKGFkZXYtPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpKQorCQlyZXR1cm4gMDsKKwlpZiAoZG1hcC0+bWFwcGluZ19mbGFncyAmIERNQV9NQVBfTUFQUEVEKSB7CisJCWlmIChkbWFwLT5xbGVuKQorCQkJcmV0dXJuIFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGRtYXAtPmRtYV9tb2RlID09IERNT0RFX0lOUFVUKQorCQlyZXR1cm4gMDsKKwlpZiAoZG1hcC0+ZG1hX21vZGUgPT0gRE1PREVfTk9ORSkKKwkJcmV0dXJuIFBPTExPVVQgfCBQT0xMV1JOT1JNOworCWlmICghRE1BYnVmX3NwYWNlX2luX3F1ZXVlKGRldikpCisJCXJldHVybiAwOworCXJldHVybiBQT0xMT1VUIHwgUE9MTFdSTk9STTsKK30KKwordW5zaWduZWQgaW50IERNQWJ1Zl9wb2xsKHN0cnVjdCBmaWxlICogZmlsZSwgaW50IGRldiwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwlzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKwlwb2xsX3dhaXQoZmlsZSwgJmFkZXYtPnBvbGxfc2xlZXBlciwgd2FpdCk7CisJcmV0dXJuIHBvbGxfaW5wdXQoZmlsZSwgZGV2LCB3YWl0KSB8IHBvbGxfb3V0cHV0KGZpbGUsIGRldiwgd2FpdCk7Cit9CisKK3ZvaWQgRE1BYnVmX2RlaW5pdChpbnQgZGV2KQoreworCXN0cnVjdCBhdWRpb19vcGVyYXRpb25zICphZGV2ID0gYXVkaW9fZGV2c1tkZXZdOworCS8qIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBkcml2ZXIgaXMgYmVpbmcgdW5sb2FkZWQgKi8KKwlpZiAoIWFkZXYpCisJCXJldHVybjsKKworCS8qIFBlcnNpc3RlbnQgRE1BIGJ1ZmZlcnMgZGVhbGxvY2F0ZWQgaGVyZSAqLworCWlmIChzb3VuZF9kbWFwX2ZsYWcgPT0gRE1BUF9LRUVQX09OX0NMT1NFKSB7CisJCXNvdW5kX2ZyZWVfZG1hcChhZGV2LT5kbWFwX291dCk7CisJCWlmIChhZGV2LT5mbGFncyAmIERNQV9EVVBMRVgpCisJCQlzb3VuZF9mcmVlX2RtYXAoYWRldi0+ZG1hcF9pbik7CisJfQorfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL0tjb25maWcgYi9zb3VuZC9vc3MvZG1hc291bmQvS2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjg0NTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL0tjb25maWcKQEAgLTAsMCArMSw1OCBAQAorY29uZmlnIERNQVNPVU5EX0FUQVJJCisJdHJpc3RhdGUgIkF0YXJpIERNQSBzb3VuZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gQVRBUkkgJiYgU09VTkQKKwlzZWxlY3QgRE1BU09VTkQKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIGludGVybmFsIGF1ZGlvIG9mIHlvdXIgQXRhcmkgaW4gTGludXgsIGFuc3dlcgorCSAgWSB0byB0aGlzIHF1ZXN0aW9uLiBUaGlzIHdpbGwgcHJvdmlkZSBhIFN1bi1saWtlIC9kZXYvYXVkaW8sCisJICBjb21wYXRpYmxlIHdpdGggdGhlIExpbnV4L2kzODYgc291bmQgc3lzdGVtLiBPdGhlcndpc2UsIHNheSBOLgorCisJICBUaGlzIGRyaXZlciBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIG1vZHVsZSAoID0gY29kZSB3aGljaCBjYW4gYmUKKwkgIGluc2VydGVkIGluIGFuZCByZW1vdmVkIGZyb20gdGhlIHJ1bm5pbmcga2VybmVsIHdoZW5ldmVyIHlvdQorCSAgd2FudCkuIElmIHlvdSB3YW50IHRvIGNvbXBpbGUgaXQgYXMgYSBtb2R1bGUsIHNheSBNIGhlcmUgYW5kIHJlYWQKKwkgIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4KKworY29uZmlnIERNQVNPVU5EX1BNQUMKKwl0cmlzdGF0ZSAiUG93ZXJNYWMgRE1BIHNvdW5kIHN1cHBvcnQiCisJZGVwZW5kcyBvbiBQUEMzMiAmJiBQUENfUE1BQyAmJiBTT1VORCAmJiBJMkMKKyAJc2VsZWN0IERNQVNPVU5ECisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBpbnRlcm5hbCBhdWRpbyBvZiB5b3VyIFBvd2VyTWFjIGluIExpbnV4LAorCSAgYW5zd2VyIFkgdG8gdGhpcyBxdWVzdGlvbi4gVGhpcyB3aWxsIHByb3ZpZGUgYSBTdW4tbGlrZSAvZGV2L2F1ZGlvLAorCSAgY29tcGF0aWJsZSB3aXRoIHRoZSBMaW51eC9pMzg2IHNvdW5kIHN5c3RlbS4gT3RoZXJ3aXNlLCBzYXkgTi4KKworCSAgVGhpcyBkcml2ZXIgaXMgYWxzbyBhdmFpbGFibGUgYXMgYSBtb2R1bGUgKCA9IGNvZGUgd2hpY2ggY2FuIGJlCisJICBpbnNlcnRlZCBpbiBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3UKKwkgIHdhbnQpLiBJZiB5b3Ugd2FudCB0byBjb21waWxlIGl0IGFzIGEgbW9kdWxlLCBzYXkgTSBoZXJlIGFuZCByZWFkCisJICA8ZmlsZTpEb2N1bWVudGF0aW9uL2tidWlsZC9tb2R1bGVzLnR4dD4uCisKK2NvbmZpZyBETUFTT1VORF9QQVVMQQorCXRyaXN0YXRlICJBbWlnYSBETUEgc291bmQgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIChBTUlHQSB8fCBBUFVTKSAmJiBTT1VORAorCXNlbGVjdCBETUFTT1VORAorCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgaW50ZXJuYWwgYXVkaW8gb2YgeW91ciBBbWlnYSBpbiBMaW51eCwgYW5zd2VyCisJICBZIHRvIHRoaXMgcXVlc3Rpb24uIFRoaXMgd2lsbCBwcm92aWRlIGEgU3VuLWxpa2UgL2Rldi9hdWRpbywKKwkgIGNvbXBhdGlibGUgd2l0aCB0aGUgTGludXgvaTM4NiBzb3VuZCBzeXN0ZW0uIE90aGVyd2lzZSwgc2F5IE4uCisKKwkgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91CisJICB3YW50KS4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQ+LgorCitjb25maWcgRE1BU09VTkRfUTQwCisJdHJpc3RhdGUgIlE0MCBzb3VuZCBzdXBwb3J0IgorCWRlcGVuZHMgb24gUTQwICYmIFNPVU5ECisJc2VsZWN0IERNQVNPVU5ECisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBpbnRlcm5hbCBhdWRpbyBvZiB5b3VyIFE0MCBpbiBMaW51eCwgYW5zd2VyCisJICBZIHRvIHRoaXMgcXVlc3Rpb24uIFRoaXMgd2lsbCBwcm92aWRlIGEgU3VuLWxpa2UgL2Rldi9hdWRpbywKKwkgIGNvbXBhdGlibGUgd2l0aCB0aGUgTGludXgvaTM4NiBzb3VuZCBzeXN0ZW0uIE90aGVyd2lzZSwgc2F5IE4uCisKKwkgIFRoaXMgZHJpdmVyIGlzIGFsc28gYXZhaWxhYmxlIGFzIGEgbW9kdWxlICggPSBjb2RlIHdoaWNoIGNhbiBiZQorCSAgaW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJuZWwgd2hlbmV2ZXIgeW91CisJICB3YW50KS4gSWYgeW91IHdhbnQgdG8gY29tcGlsZSBpdCBhcyBhIG1vZHVsZSwgc2F5IE0gaGVyZSBhbmQgcmVhZAorCSAgPGZpbGU6RG9jdW1lbnRhdGlvbi9rYnVpbGQvbW9kdWxlcy50eHQ+LgorCitjb25maWcgRE1BU09VTkQKKwl0cmlzdGF0ZQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL01ha2VmaWxlIGIvc291bmQvb3NzL2RtYXNvdW5kL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTE2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvTWFrZWZpbGUKQEAgLTAsMCArMSwxMyBAQAorIworIyBNYWtlZmlsZSBmb3IgdGhlIERNQSBzb3VuZCBkcml2ZXIKKyMKKworZG1hc291bmRfcG1hYy15CQkJKz0gZG1hc291bmRfYXdhY3MubyBcCisJCQkJICAgdHJhbnNfMTYubyBkYWMzNTUwYS5vIHRhc19jb21tb24ubyBcCisJCQkJICAgdGFzMzAwMWMubyB0YXMzMDAxY190YWJsZXMubyBcCisJCQkJICAgdGFzMzAwNC5vIHRhczMwMDRfdGFibGVzLm8KKworb2JqLSQoQ09ORklHX0RNQVNPVU5EX0FUQVJJKQkrPSBkbWFzb3VuZF9jb3JlLm8gZG1hc291bmRfYXRhcmkubworb2JqLSQoQ09ORklHX0RNQVNPVU5EX1BNQUMpCSs9IGRtYXNvdW5kX2NvcmUubyBkbWFzb3VuZF9wbWFjLm8KK29iai0kKENPTkZJR19ETUFTT1VORF9QQVVMQSkJKz0gZG1hc291bmRfY29yZS5vIGRtYXNvdW5kX3BhdWxhLm8KK29iai0kKENPTkZJR19ETUFTT1VORF9RNDApCSs9IGRtYXNvdW5kX2NvcmUubyBkbWFzb3VuZF9xNDAubwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2F3YWNzX2RlZnMuaCBiL3NvdW5kL29zcy9kbWFzb3VuZC9hd2Fjc19kZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5NGY0NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC9hd2Fjc19kZWZzLmgKQEAgLTAsMCArMSwyNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBUaGlzIGZpbGUgd2FzIHdyaXR0ZW4gYnkgc29tZW9uZSwgc29tZXdoZXJlLCBzb21ldGltZSAqLworLyogQW5kIGlzIHJlbGVhc2VkIGludG8gdGhlIFB1YmxpYyBEb21haW4gICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZm5kZWYgX0FXQUNTX0RFRlNfSF8KKyNkZWZpbmUgX0FXQUNTX0RFRlNfSF8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBV0FDcyBBdWRpbyBSZWdpc3RlciBMYXlvdXQgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgYXdhY3NfcmVncyB7CisgICAgdW5zaWduZWQJY29udHJvbDsJLyogQXVkaW8gY29udHJvbCByZWdpc3RlciAqLworICAgIHVuc2lnbmVkCXBhZDBbM107CisgICAgdW5zaWduZWQJY29kZWNfY3RybDsJLyogQ29kZWMgY29udHJvbCByZWdpc3RlciAqLworICAgIHVuc2lnbmVkCXBhZDFbM107CisgICAgdW5zaWduZWQJY29kZWNfc3RhdDsJLyogQ29kZWMgc3RhdHVzIHJlZ2lzdGVyICovCisgICAgdW5zaWduZWQJcGFkMlszXTsKKyAgICB1bnNpZ25lZAljbGlwX2NvdW50OwkvKiBDbGlwcGluZyBjb3VudCByZWdpc3RlciAqLworICAgIHVuc2lnbmVkCXBhZDNbM107CisgICAgdW5zaWduZWQJYnl0ZXN3YXA7CS8qIERhdGEgaXMgbGl0dGxlLWVuZGlhbiBpZiAxICovCit9OworCisvKioqKioqKioqKioqKioqKioqKi8KKy8qIEF1ZGlvIEJpdCBNYXNrcyAqLworLyoqKioqKioqKioqKioqKioqKiovCisKKy8qIEF1ZGlvIENvbnRyb2wgUmVnIEJpdCBNYXNrcyAqLworLyogLS0tLS0gLS0tLS0tLSAtLS0gLS0tIC0tLS0tICovCisjZGVmaW5lIE1BU0tfSVNGU0VMCSgweGYpCQkvKiBJbnB1dCBTdWJGcmFtZSBTZWxlY3QgKi8KKyNkZWZpbmUgTUFTS19PU0ZTRUwJKDB4ZiA8PCA0KQkvKiBPdXRwdXQgU3ViRnJhbWUgU2VsZWN0ICovCisjZGVmaW5lIE1BU0tfUkFURQkoMHg3IDw8IDgpCS8qIFNvdW5kIFJhdGUgKi8KKyNkZWZpbmUgTUFTS19DTlRMRVJSCSgweDEgPDwgMTEpCS8qIEVycm9yICovCisjZGVmaW5lIE1BU0tfUE9SVENIRwkoMHgxIDw8IDEyKQkvKiBQb3J0IENoYW5nZSAqLworI2RlZmluZSBNQVNLX0lFRQkoMHgxIDw8IDEzKQkvKiBFbmFibGUgSW50ZXJydXB0IG9uIEVycm9yICovCisjZGVmaW5lIE1BU0tfSUVQQwkoMHgxIDw8IDE0KQkvKiBFbmFibGUgSW50ZXJydXB0IG9uIFBvcnQgQ2hhbmdlICovCisjZGVmaW5lIE1BU0tfU1NGU0VMCSgweDMgPDwgMTUpCS8qIFN0YXR1cyBTdWJGcmFtZSBTZWxlY3QgKi8KKworLyogQXVkaW8gQ29kZWMgQ29udHJvbCBSZWcgQml0IE1hc2tzICovCisvKiAtLS0tLSAtLS0tLSAtLS0tLS0tIC0tLSAtLS0gLS0tLS0gKi8KKyNkZWZpbmUgTUFTS19ORVdFQ01ECSgweDEgPDwgMjQpCS8qIExvY2s6IGRvbid0IHdyaXRlIHRvIHJlZyB3aGVuIDEgKi8KKyNkZWZpbmUgTUFTS19FTU9ERVNFTAkoMHgzIDw8IDIyKQkvKiBTZW5kIGluZm8gb3V0IG9uIHdoaWNoIGZyYW1lPyAqLworI2RlZmluZSBNQVNLX0VYTU9ERUFERFIJKDB4M2ZmIDw8IDEyKQkvKiBFeHRlbmRlZCBNb2RlIEFkZHJlc3MgLS0gMTAgYml0cyAqLworI2RlZmluZSBNQVNLX0VYTU9ERURBVEEJKDB4ZmZmKQkJLyogRXh0ZW5kZWQgTW9kZSBEYXRhIC0tIDEyIGJpdHMgKi8KKworLyogQXVkaW8gQ29kZWMgQ29udHJvbCBBZGRyZXNzIFZhbHVlcyAvIE1hc2tzICovCisvKiAtLS0tLSAtLS0tLSAtLS0tLS0tIC0tLS0tLS0gLS0tLS0tIC0gLS0tLS0gKi8KKyNkZWZpbmUgTUFTS19BRERSMAkoMHgwIDw8IDEyKQkvKiBFeHBhbmRlZCBEYXRhIE1vZGUgQWRkcmVzcyAwICovCisjZGVmaW5lIE1BU0tfQUREUl9NVVgJTUFTS19BRERSMAkvKiBNdXggQ29udHJvbCAqLworI2RlZmluZSBNQVNLX0FERFJfR0FJTglNQVNLX0FERFIwCisKKyNkZWZpbmUgTUFTS19BRERSMQkoMHgxIDw8IDEyKQkvKiBFeHBhbmRlZCBEYXRhIE1vZGUgQWRkcmVzcyAxICovCisjZGVmaW5lIE1BU0tfQUREUl9NVVRFCU1BU0tfQUREUjEKKyNkZWZpbmUgTUFTS19BRERSX1JBVEUJTUFTS19BRERSMQorCisjZGVmaW5lIE1BU0tfQUREUjIJKDB4MiA8PCAxMikJLyogRXhwYW5kZWQgRGF0YSBNb2RlIEFkZHJlc3MgMiAqLworI2RlZmluZSBNQVNLX0FERFJfVk9MQQlNQVNLX0FERFIyCS8qIFZvbHVtZSBDb250cm9sIEEgLS0gSGVhZHBob25lcyAqLworI2RlZmluZSBNQVNLX0FERFJfVk9MSEQgTUFTS19BRERSMgorCisjZGVmaW5lIE1BU0tfQUREUjQJKDB4NCA8PCAxMikJLyogRXhwYW5kZWQgRGF0YSBNb2RlIEFkZHJlc3MgNCAqLworI2RlZmluZSBNQVNLX0FERFJfVk9MQwlNQVNLX0FERFI0CS8qIFZvbHVtZSBDb250cm9sIEMgLS0gU3BlYWtlciAqLworI2RlZmluZSBNQVNLX0FERFJfVk9MU1BLIE1BU0tfQUREUjQKKworLyogYWRkaXRpb25hbCByZWdpc3RlcnMgb2Ygc2NyZWFtZXIgKi8KKyNkZWZpbmUgTUFTS19BRERSNQkoMHg1IDw8IDEyKQkvKiBFeHBhbmRlZCBEYXRhIE1vZGUgQWRkcmVzcyA1ICovCisjZGVmaW5lIE1BU0tfQUREUjYJKDB4NiA8PCAxMikJLyogRXhwYW5kZWQgRGF0YSBNb2RlIEFkZHJlc3MgNiAqLworI2RlZmluZSBNQVNLX0FERFI3CSgweDcgPDwgMTIpCS8qIEV4cGFuZGVkIERhdGEgTW9kZSBBZGRyZXNzIDcgKi8KKworLyogQWRkcmVzcyAwIEJpdCBNYXNrcyAmIE1hY3JvcyAqLworLyogLS0tLS0tLSAtIC0tLSAtLS0tLSAtIC0tLS0tLSAqLworI2RlZmluZSBNQVNLX0dBSU5SSUdIVAkoMHhmKQkJLyogR2FpbiBSaWdodCBNYXNrICovCisjZGVmaW5lIE1BU0tfR0FJTkxFRlQJKDB4ZiA8PCA0KQkvKiBHYWluIExlZnQgTWFzayAqLworI2RlZmluZSBNQVNLX0dBSU5MSU5FCSgweDEgPDwgOCkJLyogRGlzYWJsZSBNaWMgcHJlYW1wICovCisjZGVmaW5lIE1BU0tfR0FJTk1JQwkoMHgwIDw8IDgpCS8qIEVuYWJsZSBNaWMgcHJlYW1wICovCisKKyNkZWZpbmUgTUFTS19NVVhfQ0QJKDB4MSA8PCA5KQkvKiBTZWxlY3QgQ0QgaW4gTVVYICovCisjZGVmaW5lIE1BU0tfTVVYX01JQwkoMHgxIDw8IDEwKQkvKiBTZWxlY3QgTWljIGluIE1VWCAqLworI2RlZmluZSBNQVNLX01VWF9BVURJTgkoMHgxIDw8IDExKQkvKiBTZWxlY3QgQXVkaW8gSW4gaW4gTVVYICovCisjZGVmaW5lIE1BU0tfTVVYX0xJTkUJTUFTS19NVVhfQVVESU4KKworI2RlZmluZSBHQUlOUklHSFQoeCkJKCh4KSAmIE1BU0tfR0FJTlJJR0hUKQorI2RlZmluZSBHQUlOTEVGVCh4KQkoKCh4KSA8PCA0KSAmIE1BU0tfR0FJTkxFRlQpCisKKyNkZWZpbmUgREVGX0NEX0dBSU4gMHgwMGJiCisjZGVmaW5lIERFRl9NSUNfR0FJTiAweDAwY2MKKworLyogQWRkcmVzcyAxIEJpdCBNYXNrcyAqLworLyogLS0tLS0tLSAtIC0tLSAtLS0tLSAqLworI2RlZmluZSBNQVNLX0FERFIxUkVTMQkoMHgzKQkJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFTS19SRUNBTElCUkFURSAoMHgxIDw8IDIpCS8qIFJlY2FsaWJyYXRlICovCisjZGVmaW5lIE1BU0tfU0FNUExFUkFURQkoMHg3IDw8IDMpCS8qIFNhbXBsZSBSYXRlOiAqLworI2RlZmluZSBNQVNLX0xPT1BUSFJVCSgweDEgPDwgNikJLyogTG9vcHRocm91Z2ggRW5hYmxlICovCisjZGVmaW5lIE1BU0tfQ01VVEUJKDB4MSA8PCA3KQkvKiBPdXRwdXQgQyAoU3BlYWtlcikgTXV0ZSB3aGVuIDEgKi8KKyNkZWZpbmUgTUFTS19TUEtNVVRFCU1BU0tfQ01VVEUKKyNkZWZpbmUgTUFTS19BRERSMVJFUzIJKDB4MSA8PCA4KQkvKiBSZXNlcnZlZCAqLworI2RlZmluZSBNQVNLX0FNVVRFCSgweDEgPDwgOSkJLyogT3V0cHV0IEEgKEhlYWRwaG9uZSkgTXV0ZSB3aGVuIDEgKi8KKyNkZWZpbmUgTUFTS19IRE1VVEUJTUFTS19BTVVURQorI2RlZmluZSBNQVNLX1BBUk9VVDAJKDB4MSA8PCAxMCkJLyogUGFyYWxsZWwgT3V0cHV0IDAgKi8KKyNkZWZpbmUgTUFTS19QQVJPVVQxCSgweDIgPDwgMTApCS8qIFBhcmFsbGVsIE91dHB1dCAxICovCisKKyNkZWZpbmUgTUFTS19NSUNfQk9PU1QgICgweDQpICAgICAgICAgICAvKiBzY3JlYW1lciBtaWMgYm9vc3QgKi8KKworI2RlZmluZSBTQU1QTEVSQVRFXzQ4MDAwCSgweDAgPDwgMykJLyogNDggb3IgNDQuMSBrSHogKi8KKyNkZWZpbmUgU0FNUExFUkFURV8zMjAwMAkoMHgxIDw8IDMpCS8qIDMyIG9yIDI5LjQga0h6ICovCisjZGVmaW5lIFNBTVBMRVJBVEVfMjQwMDAJKDB4MiA8PCAzKQkvKiAyNCBvciAyMi4wNSBrSHogKi8KKyNkZWZpbmUgU0FNUExFUkFURV8xOTIwMAkoMHgzIDw8IDMpCS8qIDE5LjIgb3IgMTcuNjQga0h6ICovCisjZGVmaW5lIFNBTVBMRVJBVEVfMTYwMDAJKDB4NCA8PCAzKQkvKiAxNiBvciAxNC43IGtIeiAqLworI2RlZmluZSBTQU1QTEVSQVRFXzEyMDAwCSgweDUgPDwgMykJLyogMTIgb3IgMTEuMDI1IGtIeiAqLworI2RlZmluZSBTQU1QTEVSQVRFXzk2MDAJCSgweDYgPDwgMykJLyogOS42IG9yIDguODIga0h6ICovCisjZGVmaW5lIFNBTVBMRVJBVEVfODAwMAkJKDB4NyA8PCAzKQkvKiA4IG9yIDcuMzUga0h6ICovCisKKy8qIEFkZHJlc3MgMiAmIDQgQml0IE1hc2tzICYgTWFjcm9zICovCisvKiAtLS0tLS0tIC0gLSAtIC0tLSAtLS0tLSAtIC0tLS0tLSAqLworI2RlZmluZSBNQVNLX09VVFZPTFJJR0hUICgweGYpCQkvKiBPdXRwdXQgUmlnaHQgVm9sdW1lICovCisjZGVmaW5lIE1BU0tfQUREUjJSRVMxCSgweDIgPDwgNCkJLyogUmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFTS19BRERSNFJFUzEJTUFTS19BRERSMlJFUzEKKyNkZWZpbmUgTUFTS19PVVRWT0xMRUZUCSgweGYgPDwgNikJLyogT3V0cHV0IExlZnQgVm9sdW1lICovCisjZGVmaW5lIE1BU0tfQUREUjJSRVMyCSgweDIgPDwgMTApCS8qIFJlc2VydmVkICovCisjZGVmaW5lIE1BU0tfQUREUjRSRVMyCU1BU0tfQUREUjJSRVMyCisKKyNkZWZpbmUgVk9MUklHSFQoeCkJKCgofih4KSkgJiBNQVNLX09VVFZPTFJJR0hUKSkKKyNkZWZpbmUgVk9MTEVGVCh4KQkoKCh+KHgpKSA8PCA2KSAmIE1BU0tfT1VUVk9MTEVGVCkKKworLyogQXVkaW8gQ29kZWMgU3RhdHVzIFJlZyBCaXQgTWFza3MgKi8KKy8qIC0tLS0tIC0tLS0tIC0tLS0tLSAtLS0gLS0tIC0tLS0tICovCisjZGVmaW5lIE1BU0tfRVhURU5ECSgweDEgPDwgMjMpCS8qIEV4dGVuZCAqLworI2RlZmluZSBNQVNLX1ZBTElECSgweDEgPDwgMjIpCS8qIFZhbGlkIERhdGE/ICovCisjZGVmaW5lIE1BU0tfT0ZMRUZUCSgweDEgPDwgMjEpCS8qIE92ZXJmbG93IExlZnQgKi8KKyNkZWZpbmUgTUFTS19PRlJJR0hUCSgweDEgPDwgMjApCS8qIE92ZXJmbG93IFJpZ2h0ICovCisjZGVmaW5lIE1BU0tfRVJSQ09ERQkoMHhmIDw8IDE2KQkvKiBFcnJvciBDb2RlICovCisjZGVmaW5lIE1BU0tfUkVWSVNJT04JKDB4ZiA8PCAxMikJLyogUmV2aXNpb24gTnVtYmVyICovCisjZGVmaW5lIE1BU0tfTUZHSUQJKDB4ZiA8PCA4KQkvKiBNZmcuIElEICovCisjZGVmaW5lIE1BU0tfQ09EU1RBVFJFUwkoMHhmIDw8IDQpCS8qIGJpdHMgNCAtIDcgcmVzZXJ2ZWQgKi8KKyNkZWZpbmUgTUFTS19JTlBQT1JUCSgweGYpCQkvKiBJbnB1dCBQb3J0ICovCisjZGVmaW5lIE1BU0tfSERQQ09OTgk4CQkvKiBoZWFkcGhvbmUgcGx1Z2dlZCBpbiAqLworCisvKiBDbGlwcGluZyBDb3VudCBSZWcgQml0IE1hc2tzICovCisvKiAtLS0tLS0tLSAtLS0tLSAtLS0gLS0tIC0tLS0tICovCisjZGVmaW5lIE1BU0tfQ0xJUExFRlQJKDB4ZmYgPDwgNykJLyogQ2xpcHBpbmcgQ291bnQsIExlZnQgQ2hhbm5lbCAqLworI2RlZmluZSBNQVNLX0NMSVBSSUdIVAkoMHhmZikJCS8qIENsaXBwaW5nIENvdW50LCBSaWdodCBDaGFubmVsICovCisKKy8qIERCRE1BIENoYW5uZWxTdGF0dXMgQml0IE1hc2tzICovCisvKiAtLS0tLSAtLS0tLS0tLS0tLS0tIC0tLSAtLS0tLSAqLworI2RlZmluZSBNQVNLX0NTRVJSCSgweDEgPDwgNykJLyogRXJyb3IgKi8KKyNkZWZpbmUgTUFTS19FT0kJKDB4MSA8PCA2KQkvKiBFbmQgb2YgSW5wdXQgLS0gb25seSBmb3IgSW5wdXQgQ2hhbm5lbCAqLworI2RlZmluZSBNQVNLX0NTVU5VU0VECSgweDFmIDw8IDEpCS8qIGJpdHMgMS01IG5vdCB1c2VkICovCisjZGVmaW5lIE1BU0tfV0FJVAkoMHgxKQkJLyogV2FpdCAqLworCisvKiBWYXJpb3VzIFJhdGVzICovCisvKiAtLS0tLS0tIC0tLS0tICovCisjZGVmaW5lIFJBVEVfNDgwMDAJKDB4MCA8PCA4KQkvKiA0OCBrSHogKi8KKyNkZWZpbmUgUkFURV80NDEwMAkoMHgwIDw8IDgpCS8qIDQ0LjEga0h6ICovCisjZGVmaW5lIFJBVEVfMzIwMDAJKDB4MSA8PCA4KQkvKiAzMiBrSHogKi8KKyNkZWZpbmUgUkFURV8yOTQwMAkoMHgxIDw8IDgpCS8qIDI5LjQga0h6ICovCisjZGVmaW5lIFJBVEVfMjQwMDAJKDB4MiA8PCA4KQkvKiAyNCBrSHogKi8KKyNkZWZpbmUgUkFURV8yMjA1MAkoMHgyIDw8IDgpCS8qIDIyLjA1IGtIeiAqLworI2RlZmluZSBSQVRFXzE5MjAwCSgweDMgPDwgOCkJLyogMTkuMiBrSHogKi8KKyNkZWZpbmUgUkFURV8xNzY0MAkoMHgzIDw8IDgpCS8qIDE3LjY0IGtIeiAqLworI2RlZmluZSBSQVRFXzE2MDAwCSgweDQgPDwgOCkJLyogMTYga0h6ICovCisjZGVmaW5lIFJBVEVfMTQ3MDAJKDB4NCA8PCA4KQkvKiAxNC43IGtIeiAqLworI2RlZmluZSBSQVRFXzEyMDAwCSgweDUgPDwgOCkJLyogMTIga0h6ICovCisjZGVmaW5lIFJBVEVfMTEwMjUJKDB4NSA8PCA4KQkvKiAxMS4wMjUga0h6ICovCisjZGVmaW5lIFJBVEVfOTYwMAkoMHg2IDw8IDgpCS8qIDkuNiBrSHogKi8KKyNkZWZpbmUgUkFURV84ODIwCSgweDYgPDwgOCkJLyogOC44MiBrSHogKi8KKyNkZWZpbmUgUkFURV84MDAwCSgweDcgPDwgOCkJLyogOCBrSHogKi8KKyNkZWZpbmUgUkFURV83MzUwCSgweDcgPDwgOCkJLyogNy4zNSBrSHogKi8KKworI2RlZmluZSBSQVRFX0xPVwkxCS8qIEhJR0ggPSA0OGtIeiwgZXRjOyAgTE9XID0gNDQuMWtIeiwgZXRjLiAqLworCisvKioqKioqKioqKioqKioqKioqKi8KKy8qIEJ1cmd1bmR5IHZhbHVlcyAqLworLyoqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgTUFTS19BRERSX0JVUkdVTkRZX0lOUFNFTDIxICgweDExIDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfSU5QU0VMMyAoMHgxMiA8PCAxMikKKworI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNIMSAoMHgxMyA8PCAxMikKKyNkZWZpbmUgTUFTS19BRERSX0JVUkdVTkRZX0dBSU5DSDIgKDB4MTQgPDwgMTIpCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9HQUlOQ0gzICgweDE1IDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNINCAoMHgxNiA8PCAxMikKKworI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0gxICgweDIwIDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0gyICgweDIxIDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0gzICgweDIyIDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0g0ICgweDIzIDw8IDEyKQorCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9PVVRQVVRTRUxFQ1RTICgweDJCIDw8IDEyKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfT1VUUFVURU5BQkxFUyAoMHgyRiA8PCAxMikKKworI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfTUFTVEVSX1ZPTFVNRSAoMHgzMCA8PCAxMikKKworI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfTU9SRV9PVVRQVVRFTkFCTEVTICgweDYwIDw8IDEyKQorCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9BVFRFTlNQRUFLRVIgKDB4NjIgPDwgMTIpCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9BVFRFTkxJTkVPVVQgKDB4NjMgPDwgMTIpCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9BVFRFTkhQICgweDY0IDw8IDEyKQorCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9WT0xDRCAoTUFTS19BRERSX0JVUkdVTkRZX1ZPTENIMSkKKyNkZWZpbmUgTUFTS19BRERSX0JVUkdVTkRZX1ZPTExJTkUgKE1BU0tfQUREUl9CVVJHVU5EWV9WT0xDSDIpCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9WT0xNSUMgKE1BU0tfQUREUl9CVVJHVU5EWV9WT0xDSDMpCisjZGVmaW5lIE1BU0tfQUREUl9CVVJHVU5EWV9WT0xNT0RFTSAoTUFTS19BRERSX0JVUkdVTkRZX1ZPTENINCkKKworI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNEIChNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNIMSkKKyNkZWZpbmUgTUFTS19BRERSX0JVUkdVTkRZX0dBSU5MSU5FIChNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNIMikKKyNkZWZpbmUgTUFTS19BRERSX0JVUkdVTkRZX0dBSU5NSUMgKE1BU0tfQUREUl9CVVJHVU5EWV9HQUlOQ0gzKQorI2RlZmluZSBNQVNLX0FERFJfQlVSR1VORFlfR0FJTk1PREVNIChNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0g0KQorCisKKy8qIFRoZXNlIGFyZSBhbGwgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBidXJndW5keSAqLworI2RlZmluZSBERUZfQlVSR1VORFlfSU5QU0VMMjEgKDB4QUEpCisjZGVmaW5lIERFRl9CVVJHVU5EWV9JTlBTRUwzICgweDBBKQorCisjZGVmaW5lIERFRl9CVVJHVU5EWV9HQUlOQ0QgKDB4MzMpCisjZGVmaW5lIERFRl9CVVJHVU5EWV9HQUlOTElORSAoMHg0NCkKKyNkZWZpbmUgREVGX0JVUkdVTkRZX0dBSU5NSUMgKDB4NDQpCisjZGVmaW5lIERFRl9CVVJHVU5EWV9HQUlOTU9ERU0gKDB4MDYpCisKKy8qIFJlbWVtYmVyOiBsb3dlc3Qgdm9sdW1lIGhlcmUgaXMgMHg5YiAqLworI2RlZmluZSBERUZfQlVSR1VORFlfVk9MQ0QgKDB4Q0NDQ0NDQ0MpCisjZGVmaW5lIERFRl9CVVJHVU5EWV9WT0xMSU5FICgweDAwMDAwMDAwKQorI2RlZmluZSBERUZfQlVSR1VORFlfVk9MTUlDICgweDAwMDAwMDAwKQorI2RlZmluZSBERUZfQlVSR1VORFlfVk9MTU9ERU0gKDB4Q0NDQ0NDQ0MpCisKKyNkZWZpbmUgREVGX0JVUkdVTkRZX09VVFBVVFNFTEVDVFMgKDB4MDEwZjAxMGYpCisjZGVmaW5lIERFRl9CVVJHVU5EWV9PVVRQVVRFTkFCTEVTICgweDBBKQorCisjZGVmaW5lIERFRl9CVVJHVU5EWV9NQVNURVJfVk9MVU1FICgweEZGRkZGRkZGKQorCisjZGVmaW5lIERFRl9CVVJHVU5EWV9NT1JFX09VVFBVVEVOQUJMRVMgKDB4N0UpCisKKyNkZWZpbmUgREVGX0JVUkdVTkRZX0FUVEVOU1BFQUtFUiAoMHg0NCkKKyNkZWZpbmUgREVGX0JVUkdVTkRZX0FUVEVOTElORU9VVCAoMHhDQykKKyNkZWZpbmUgREVGX0JVUkdVTkRZX0FUVEVOSFAgKDB4Q0MpCisKKy8qKioqKioqKioqKioqKioqKioqKiovCisvKiBpMnMgbGF5b3V0IHZhbHVlcyAqLworLyoqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBJMlNfUkVHX0lOVF9DVEwJCQkweDAwCisjZGVmaW5lIEkyU19SRUdfU0VSSUFMX0ZPUk1BVAkJMHgxMAorI2RlZmluZSBJMlNfUkVHX0NPREVDX01TR19PVVQJCTB4MjAKKyNkZWZpbmUgSTJTX1JFR19DT0RFQ19NU0dfSU4JCTB4MzAKKyNkZWZpbmUgSTJTX1JFR19GUkFNRV9DT1VOVAkJMHg0MAorI2RlZmluZSBJMlNfUkVHX0ZSQU1FX01BVENICQkweDUwCisjZGVmaW5lIEkyU19SRUdfREFUQVdPUkRfU0laRVMJCTB4NjAKKyNkZWZpbmUgSTJTX1JFR19QRUFLTEVWRUxfU0VMCQkweDcwCisjZGVmaW5lIEkyU19SRUdfUEVBS0xFVkVMX0lOMAkJMHg4MAorI2RlZmluZSBJMlNfUkVHX1BFQUtMRVZFTF9JTjEJCTB4OTAKKworI2VuZGlmIC8qIF9BV0FDU19ERUZTX0hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZGFjMzU1MGEuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kYWMzNTUwYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMzg5NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvZGFjMzU1MGEuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIERyaXZlciBmb3IgdGhlIGkyYy9pMnMgYmFzZWQgREFDMzU1MGEgc291bmQgY2hpcCB1c2VkCisgKiBvbiBzb21lIEFwcGxlIGlCb29rcy4gQWxzbyBrbm93biBhcyAiREFDQSIuCisgKgorICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZS4gIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqICBmb3IgbW9yZSBkZXRhaWxzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImRtYXNvdW5kLmgiCisKKy8qIEZZSTogVGhpcyBjb2RlIHdhcyBkZXJpdmVkIGZyb20gdGhlIHRhczMwMDFjLmMgVGV4YXMvVHVtYmxlciBtaXhlcgorICogY29udHJvbCBjb2RlLCBhcyB3ZWxsIGFzIGluZm8gZGVyaXZlZCBmcm9tIHRoZSBBcHBsZURBQ0FBdWRpbyBkcml2ZXIKKyAqIGZyb20gRGFyd2luIENWUyAobWFpbiB0aGluZyBJIGRlcml2ZWQgYmVpbmcgcmVnaXN0ZXIgbnVtYmVycyBhbmQgCisgKiB2YWx1ZXMsIGFzIHdlbGwgYXMgd2hlbiB0byBtYWtlIHRoZSBjYWxscykuICovCisKKyNkZWZpbmUgSTJDX0RSSVZFUklEX0RBQ0EgKDB4RkRDQikKKworI2RlZmluZSBEQUNBX1ZFUlNJT04JIjAuMSIKKyNkZWZpbmUgREFDQV9EQVRFICIyMDAxMDkzMCIKKworc3RhdGljIGludCBjdXJfbGVmdF92b2w7CitzdGF0aWMgaW50IGN1cl9yaWdodF92b2w7CitzdGF0aWMgc3RydWN0IGkyY19jbGllbnQgKmRhY2FfY2xpZW50OworCitzdGF0aWMgaW50IGRhY2FfYXR0YWNoX2FkYXB0ZXIoc3RydWN0IGkyY19hZGFwdGVyICphZGFwdGVyKTsKK3N0YXRpYyBpbnQgZGFjYV9kZXRlY3RfY2xpZW50KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MpOworc3RhdGljIGludCBkYWNhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCk7CisKK3N0cnVjdCBpMmNfZHJpdmVyIGRhY2FfZHJpdmVyID0geyAgCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJCT0gIkRBQzM1NTBBIGRyaXZlciAgViAiIERBQ0FfVkVSU0lPTiwKKwkuaWQJCQk9IEkyQ19EUklWRVJJRF9EQUNBLAorCS5mbGFncwkJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJCT0gZGFjYV9hdHRhY2hfYWRhcHRlciwKKwkuZGV0YWNoX2NsaWVudAkJPSBkYWNhX2RldGFjaF9jbGllbnQsCit9OworCisjZGVmaW5lIFZPTF9NQVggKCgxPDwyMCkgLSAxKQorCit2b2lkIGRhY2FfZ2V0X3ZvbHVtZSh1aW50ICogbGVmdF92b2wsIHVpbnQgICpyaWdodF92b2wpCit7CisJKmxlZnRfdm9sID0gY3VyX2xlZnRfdm9sID4+IDU7CisJKnJpZ2h0X3ZvbCA9IGN1cl9yaWdodF92b2wgPj4gNTsKK30KKworaW50IGRhY2Ffc2V0X3ZvbHVtZSh1aW50IGxlZnRfdm9sLCB1aW50IHJpZ2h0X3ZvbCkKK3sKKwl1bnNpZ25lZCBzaG9ydCB2b2xkYXRhOworICAKKwlpZiAoIWRhY2FfY2xpZW50KQorCQlyZXR1cm4gLTE7CisKKwkvKiBEZXJpdmVkIGZyb20gZXhwZXJpZW5jZSwgbm90IGZyb20gYW55IHNwZWNpZmljIHZhbHVlcyAqLworCWxlZnRfdm9sIDw8PSA1OworCXJpZ2h0X3ZvbCA8PD0gNTsKKworCWlmIChsZWZ0X3ZvbCA+IFZPTF9NQVgpCisJCWxlZnRfdm9sID0gVk9MX01BWDsKKwlpZiAocmlnaHRfdm9sID4gVk9MX01BWCkKKwkJcmlnaHRfdm9sID0gVk9MX01BWDsKKworCXZvbGRhdGEgPSAoKGxlZnRfdm9sID4+IDE0KSAgJiAweDNmKSA8PCA4OworCXZvbGRhdGEgfD0gKHJpZ2h0X3ZvbCA+PiAxNCkgICYgMHgzZjsKKyAgCisJaWYgKGkyY19zbWJ1c193cml0ZV93b3JkX2RhdGEoZGFjYV9jbGllbnQsIDIsIHZvbGRhdGEpIDwgMCkgeworCQlwcmludGsoImRhY2E6IGZhaWxlZCB0byBzZXQgdm9sdW1lIFxuIik7CisJCXJldHVybiAtMTsgCisJfQorCisJY3VyX2xlZnRfdm9sID0gbGVmdF92b2w7CisJY3VyX3JpZ2h0X3ZvbCA9IHJpZ2h0X3ZvbDsKKyAgCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYWNhX2xlYXZlX3NsZWVwKHZvaWQpCit7CisJaWYgKCFkYWNhX2NsaWVudCkKKwkJcmV0dXJuIC0xOworICAKKwkvKiBEbyBhIHNob3J0IHNsZWVwLCBqdXN0IHRvIG1ha2Ugc3VyZSBJMkMgYnVzIGlzIGF3YWtlIGFuZCBwYXlpbmcKKwkgKiBhdHRlbnRpb24gdG8gdXMKKwkgKi8KKwltc2xlZXAoMjApOworCS8qIFdyaXRlIHRoZSBzYW1wbGUgcmF0ZSByZWcgdGhlIHZhbHVlIGl0IG5lZWRzICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYWNhX2NsaWVudCwgMSwgOCk7CisJZGFjYV9zZXRfdm9sdW1lKGN1cl9sZWZ0X3ZvbCA+PiA1LCBjdXJfcmlnaHRfdm9sID4+IDUpOworCS8qIEFub3RoZXIgc2hvcnQgZGVsYXksIGp1c3QgdG8gbWFrZSBzdXJlIHRoZSBvdGhlciBJMkMgYnVzIHdyaXRlcworCSAqIGhhdmUgdGFrZW4uLi4KKwkgKi8KKwltc2xlZXAoMjApOworCS8qIFdyaXRlIHRoZSBnbG9iYWwgY29uZmlnIHJlZyAtIGludmVydCByaWdodCBwb3dlciBhbXAsCisJICogREFDIG9uLCB1c2UgNS12b2x0IG1vZGUgKi8KKwlpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGRhY2FfY2xpZW50LCAzLCAweDQ1KTsKKworCXJldHVybiAwOworfQorCitpbnQgZGFjYV9lbnRlcl9zbGVlcCh2b2lkKQoreworCWlmICghZGFjYV9jbGllbnQpCisJCXJldHVybiAtMTsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZGFjYV9jbGllbnQsIDEsIDgpOworCWRhY2Ffc2V0X3ZvbHVtZShjdXJfbGVmdF92b2wgPj4gNSwgY3VyX3JpZ2h0X3ZvbCA+PiA1KTsKKworCS8qIFdyaXRlIHRoZSBnbG9iYWwgY29uZmlnIHJlZyAtIGludmVydCByaWdodCBwb3dlciBhbXAsCisJICogREFDIG9uLCBlbnRlciBsb3ctcG93ZXIgbW9kZSwgdXNlIDUtdm9sdCBtb2RlCisJICovCisJaTJjX3NtYnVzX3dyaXRlX2J5dGVfZGF0YShkYWNhX2NsaWVudCwgMywgMHg2NSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkYWNhX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIXN0cm5jbXAoYWRhcHRlci0+bmFtZSwgIm1hYy1pbyIsIDYpKQorCQlkYWNhX2RldGVjdF9jbGllbnQoYWRhcHRlciwgMHg0ZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFjYV9pbml0X2NsaWVudChzdHJ1Y3QgaTJjX2NsaWVudCAqIG5ld19jbGllbnQpCit7CisJLyogCisJICogUHJvYmUgaXMgbm90IHdvcmtpbmcgd2l0aCB0aGUgY3VycmVudCBpMmMta2V5d2VzdAorCSAqIGRyaXZlci4gV2UgdHJ5IHRvIHVzZSBhZGRyIDB4NGQgb24gZWFjaCBhZGFwdGVycworCSAqIGluc3RlYWQsIGJ5IHNldHRpbmcgdGhlIGZvcm1hdCByZWdpc3Rlci4KKwkgKiAKKwkgKiBGSVhNRTogSSdtIHN1cmUgdGhhdCBjYW4gYmUgb2J0YWluZWQgZnJvbSB0aGUKKwkgKiBkZXZpY2UtdHJlZS4gLS1CZW5ILgorCSAqLworICAKKwkvKiBXcml0ZSB0aGUgZ2xvYmFsIGNvbmZpZyByZWcgLSBpbnZlcnQgcmlnaHQgcG93ZXIgYW1wLAorCSAqIERBQyBvbiwgdXNlIDUtdm9sdCBtb2RlCisJICovCisJaWYgKGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEobmV3X2NsaWVudCwgMywgMHg0NSkpCisJCXJldHVybiAtMTsKKworCWkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEobmV3X2NsaWVudCwgMSwgOCk7CisJZGFjYV9jbGllbnQgPSBuZXdfY2xpZW50OworCWRhY2Ffc2V0X3ZvbHVtZSgxNTAwMCwgMTUwMDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFjYV9kZXRlY3RfY2xpZW50KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlciwgaW50IGFkZHJlc3MpCit7CisJY29uc3QgY2hhciAqY2xpZW50X25hbWUgPSAiREFDIDM1NTBBIERpZ2l0YWwgRXF1YWxpemVyIjsKKwlzdHJ1Y3QgaTJjX2NsaWVudCAqbmV3X2NsaWVudDsKKwlpbnQgcmMgPSAtRU5PREVWOworCisJbmV3X2NsaWVudCA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfY2xpZW50KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQobmV3X2NsaWVudCwgMCwgc2l6ZW9mKCpuZXdfY2xpZW50KSk7CisKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmZGFjYV9kcml2ZXI7CisJbmV3X2NsaWVudC0+ZmxhZ3MgPSAwOworCXN0cmNweShuZXdfY2xpZW50LT5uYW1lLCBjbGllbnRfbmFtZSk7CisKKwlpZiAoZGFjYV9pbml0X2NsaWVudChuZXdfY2xpZW50KSkKKwkJZ290byBiYWlsOworCisJLyogVGVsbCB0aGUgaTJjIGxheWVyIGEgbmV3IGNsaWVudCBoYXMgYXJyaXZlZCAqLworCWlmIChpMmNfYXR0YWNoX2NsaWVudChuZXdfY2xpZW50KSkKKwkJZ290byBiYWlsOworCisJcmV0dXJuIDA7CisgYmFpbDoKKwlrZnJlZShuZXdfY2xpZW50KTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGludCBkYWNhX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpZiAoY2xpZW50ID09IGRhY2FfY2xpZW50KQorCQlkYWNhX2NsaWVudCA9IE5VTEw7CisKKyAgCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJa2ZyZWUoY2xpZW50KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkYWNhX2NsZWFudXAodm9pZCkKK3sKKwlpMmNfZGVsX2RyaXZlcigmZGFjYV9kcml2ZXIpOworfQorCitpbnQgZGFjYV9pbml0KHZvaWQpCit7CisJcHJpbnRrKCJkYWMzNTUwYSBkcml2ZXIgdmVyc2lvbiAlcyAoJXMpXG4iLERBQ0FfVkVSU0lPTixEQUNBX0RBVEUpOworCXJldHVybiBpMmNfYWRkX2RyaXZlcigmZGFjYV9kcml2ZXIpOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kLmggYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTJmNTBmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kLmgKQEAgLTAsMCArMSwyNzcgQEAKKyNpZm5kZWYgX2RtYXNvdW5kX2hfCisvKgorICogIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZC5oCisgKgorICoKKyAqICBNaW5vciBudW1iZXJzIGZvciB0aGUgc291bmQgZHJpdmVyLgorICoKKyAqICBVbmZvcnR1bmF0ZWx5IENyZWF0aXZlIGNhbGxlZCB0aGUgY29kZWMgY2hpcCBvZiBTQiBhcyBhIERTUC4gRm9yIHRoaXMKKyAqICByZWFzb24gdGhlIC9kZXYvZHNwIGlzIHJlc2VydmVkIGZvciBkaWdpdGl6ZWQgYXVkaW8gdXNlLiBUaGVyZSBpcyBhCisgKiAgZGV2aWNlIGZvciB0cnVlIERTUCBwcm9jZXNzb3JzIGJ1dCBpdCB3aWxsIGJlIGNhbGxlZCBzb21ldGhpbmcgZWxzZS4KKyAqICBJbiB2My4wIGl0J3MgL2Rldi9zbmRwcm9jIGJ1dCB0aGlzIGNvdWxkIGJlIGEgdGVtcG9yYXJ5IHNvbHV0aW9uLgorICovCisjZGVmaW5lIF9kbWFzb3VuZF9oXworCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKworI2RlZmluZSBTTkRfTkRFVlMJMjU2CS8qIE51bWJlciBvZiBzdXBwb3J0ZWQgZGV2aWNlcyAqLworI2RlZmluZSBTTkRfREVWX0NUTAkwCS8qIENvbnRyb2wgcG9ydCAvZGV2L21peGVyICovCisjZGVmaW5lIFNORF9ERVZfU0VRCTEJLyogU2VxdWVuY2VyIG91dHB1dCAvZGV2L3NlcXVlbmNlciAoRk0KKwkJCQkgICBzeW50aGVzaXplciBhbmQgTUlESSBvdXRwdXQpICovCisjZGVmaW5lIFNORF9ERVZfTUlESU4JMgkvKiBSYXcgbWlkaSBhY2Nlc3MgKi8KKyNkZWZpbmUgU05EX0RFVl9EU1AJMwkvKiBEaWdpdGl6ZWQgdm9pY2UgL2Rldi9kc3AgKi8KKyNkZWZpbmUgU05EX0RFVl9BVURJTwk0CS8qIFNwYXJjIGNvbXBhdGlibGUgL2Rldi9hdWRpbyAqLworI2RlZmluZSBTTkRfREVWX0RTUDE2CTUJLyogTGlrZSAvZGV2L2RzcCBidXQgMTYgYml0cy9zYW1wbGUgKi8KKyNkZWZpbmUgU05EX0RFVl9TVEFUVVMJNgkvKiAvZGV2L3NuZHN0YXQgKi8KKy8qICM3IG5vdCBpbiB1c2Ugbm93LiBXYXMgaW4gMi40LiBGcmVlIGZvciB1c2UgYWZ0ZXIgdjMuMC4gKi8KKyNkZWZpbmUgU05EX0RFVl9TRVEyCTgJLyogL2Rldi9zZXF1ZW5jZXIsIGxldmVsIDIgaW50ZXJmYWNlICovCisjZGVmaW5lIFNORF9ERVZfU05EUFJPQyA5CS8qIC9kZXYvc25kcHJvYyBmb3IgcHJvZ3JhbW1hYmxlIGRldmljZXMgKi8KKyNkZWZpbmUgU05EX0RFVl9QU1MJU05EX0RFVl9TTkRQUk9DCisKKy8qIHN3aXRjaCBvbiB2YXJpb3VzIHByaW5rcyAqLworI2RlZmluZSBERUJVR19ETUFTT1VORCAxCisKKyNkZWZpbmUgTUFYX0FVRElPX0RFVgk1CisjZGVmaW5lIE1BWF9NSVhFUl9ERVYJNAorI2RlZmluZSBNQVhfU1lOVEhfREVWCTMKKyNkZWZpbmUgTUFYX01JRElfREVWCTYKKyNkZWZpbmUgTUFYX1RJTUVSX0RFVgkzCisKKyNkZWZpbmUgTUFYX0NBVENIX1JBRElVUwkxMAorCisjZGVmaW5lIGxlMmJlMTYoeCkJKCgoeCk8PDggJiAweGZmMDApIHwgKCh4KT4+OCAmIDB4MDBmZikpCisjZGVmaW5lIGxlMmJlMTZkYmwoeCkJKCgoeCk8PDggJiAweGZmMDBmZjAwKSB8ICgoeCk+PjggJiAweDAwZmYwMGZmKSkKKworI2RlZmluZSBJT0NUTF9JTihhcmcsIHJldCkgXAorCWRvIHsgaW50IGVycm9yID0gZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKShhcmcpKTsgXAorCQlpZiAoZXJyb3IpIHJldHVybiBlcnJvcjsgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIElPQ1RMX09VVChhcmcsIHJldCkJaW9jdGxfcmV0dXJuKChpbnQgX191c2VyICopKGFyZyksIHJldCkKKworc3RhdGljIGlubGluZSBpbnQgaW9jdGxfcmV0dXJuKGludCBfX3VzZXIgKmFkZHIsIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gdmFsdWUgPCAwID8gdmFsdWUgOiBwdXRfdXNlcih2YWx1ZSwgYWRkcik7Cit9CisKKworICAgIC8qCisgICAgICogIENvbmZpZ3VyYXRpb24KKyAgICAgKi8KKworI3VuZGVmIEhBU184QklUX1RBQkxFUworI3VuZGVmIEhBU19SRUNPUkQKKworI2lmIGRlZmluZWQoQ09ORklHX0RNQVNPVU5EX0FUQVJJKSB8fCBkZWZpbmVkKENPTkZJR19ETUFTT1VORF9BVEFSSV9NT0RVTEUpIHx8XAorICAgIGRlZmluZWQoQ09ORklHX0RNQVNPVU5EX1BBVUxBKSB8fCBkZWZpbmVkKENPTkZJR19ETUFTT1VORF9QQVVMQV9NT0RVTEUpIHx8XAorICAgIGRlZmluZWQoQ09ORklHX0RNQVNPVU5EX1E0MCkgfHwgZGVmaW5lZChDT05GSUdfRE1BU09VTkRfUTQwX01PRFVMRSkKKyNkZWZpbmUgSEFTXzhCSVRfVEFCTEVTCisjZGVmaW5lIE1JTl9CVUZGRVJTCTQKKyNkZWZpbmUgTUlOX0JVRlNJWkUJKDE8PDEyKQkvKiBpbiBieXRlcyAoLSB3aGVyZSBkb2VzIHRoaXMgY29tZSBmcm9tID8pICovCisjZGVmaW5lIE1JTl9GUkFHX1NJWkUJOAkvKiBub3QgMTAwJSBzdXJlIGFib3V0IHRoaXMgKi8KKyNkZWZpbmUgTUFYX0JVRlNJWkUJKDE8PDE3KQkvKiBMaW1pdCBmb3IgQW1pZ2EgaXMgMTI4IGtiICovCisjZGVmaW5lIE1BWF9GUkFHX1NJWkUJMTUJLyogYWxsb3cgKjQgZm9yIG1vbm8tOCA9PiBzdGVyZW8tMTYgKGZvciBtdWx0aSkgKi8KKworI2Vsc2UgLyogaXMgcG1hYyBhbmQgbXVsdGkgaXMgb2ZmICovCisKKyNkZWZpbmUgTUlOX0JVRkZFUlMJMgorI2RlZmluZSBNSU5fQlVGU0laRQkoMTw8OCkJLyogaW4gYnl0ZXMgKi8KKyNkZWZpbmUgTUlOX0ZSQUdfU0laRQk4CisjZGVmaW5lIE1BWF9CVUZTSVpFCSgxPDwxOCkJLyogdGhpcyBpcyBzb21ld2hhdCBhcmJpdHJhcnkgZm9yIHBtYWMgKi8KKyNkZWZpbmUgTUFYX0ZSQUdfU0laRQkxNgkvKiBuZWVkIHRvIGFsbG93ICo0IGZvciBtb25vLTggPT4gc3RlcmVvLTE2ICovCisjZW5kaWYKKworI2RlZmluZSBERUZBVUxUX05fQlVGRkVSUyA0CisjZGVmaW5lIERFRkFVTFRfQlVGRl9TSVpFICgxPDwxNSkKKworI2lmIGRlZmluZWQoQ09ORklHX0RNQVNPVU5EX1BNQUMpIHx8IGRlZmluZWQoQ09ORklHX0RNQVNPVU5EX1BNQUNfTU9EVUxFKQorI2RlZmluZSBIQVNfUkVDT1JECisjZW5kaWYKKworICAgIC8qCisgICAgICogIEluaXRpYWxpemF0aW9uCisgICAgICovCisKK2V4dGVybiBpbnQgZG1hc291bmRfaW5pdCh2b2lkKTsKKyNpZmRlZiBNT0RVTEUKK2V4dGVybiB2b2lkIGRtYXNvdW5kX2RlaW5pdCh2b2lkKTsKKyNlbHNlCisjZGVmaW5lIGRtYXNvdW5kX2RlaW5pdCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKiBkZXNjcmlwdGlvbiBvZiB0aGUgc2V0LXVwIGFwcGxpZXMgdG8gZWl0aGVyIGhhcmQgb3Igc29mdCBzZXR0aW5ncyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGZvcm1hdDsJCS8qIEFGTVRfKiAqLworICAgIGludCBzdGVyZW87CQkvKiAwID0gbW9ubywgMSA9IHN0ZXJlbyAqLworICAgIGludCBzaXplOwkJLyogOC8xNiBiaXQqLworICAgIGludCBzcGVlZDsJCS8qIHNwZWVkICovCit9IFNFVFRJTkdTOworCisgICAgLyoKKyAgICAgKiAgTWFjaGluZSBkZWZpbml0aW9ucworICAgICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICBjb25zdCBjaGFyICpuYW1lMjsKKyAgICBzdHJ1Y3QgbW9kdWxlICpvd25lcjsKKyAgICB2b2lkICooKmRtYV9hbGxvYykodW5zaWduZWQgaW50LCBpbnQpOworICAgIHZvaWQgKCpkbWFfZnJlZSkodm9pZCAqLCB1bnNpZ25lZCBpbnQpOworICAgIGludCAoKmlycWluaXQpKHZvaWQpOworI2lmZGVmIE1PRFVMRQorICAgIHZvaWQgKCppcnFjbGVhbnVwKSh2b2lkKTsKKyNlbmRpZgorICAgIHZvaWQgKCppbml0KSh2b2lkKTsKKyAgICB2b2lkICgqc2lsZW5jZSkodm9pZCk7CisgICAgaW50ICgqc2V0Rm9ybWF0KShpbnQpOworICAgIGludCAoKnNldFZvbHVtZSkoaW50KTsKKyAgICBpbnQgKCpzZXRCYXNzKShpbnQpOworICAgIGludCAoKnNldFRyZWJsZSkoaW50KTsKKyAgICBpbnQgKCpzZXRHYWluKShpbnQpOworICAgIHZvaWQgKCpwbGF5KSh2b2lkKTsKKyAgICB2b2lkICgqcmVjb3JkKSh2b2lkKTsJCS8qIG9wdGlvbmFsICovCisgICAgdm9pZCAoKm1peGVyX2luaXQpKHZvaWQpOwkJLyogb3B0aW9uYWwgKi8KKyAgICBpbnQgKCptaXhlcl9pb2N0bCkodV9pbnQsIHVfbG9uZyk7CS8qIG9wdGlvbmFsICovCisgICAgaW50ICgqd3JpdGVfc3Ffc2V0dXApKHZvaWQpOwkvKiBvcHRpb25hbCAqLworICAgIGludCAoKnJlYWRfc3Ffc2V0dXApKHZvaWQpOwkJLyogb3B0aW9uYWwgKi8KKyAgICBpbnQgKCpzcV9vcGVuKShtb2RlX3QpOwkJLyogb3B0aW9uYWwgKi8KKyAgICBpbnQgKCpzdGF0ZV9pbmZvKShjaGFyICosIHNpemVfdCk7CS8qIG9wdGlvbmFsICovCisgICAgdm9pZCAoKmFib3J0X3JlYWQpKHZvaWQpOwkJLyogb3B0aW9uYWwgKi8KKyAgICBpbnQgbWluX2RzcF9zcGVlZDsKKyAgICBpbnQgbWF4X2RzcF9zcGVlZDsKKyAgICBpbnQgdmVyc2lvbiA7CisgICAgaW50IGhhcmR3YXJlX2FmbXRzIDsJCS8qIE9TUyBzYXlzIHdlIG9ubHkgcmV0dXJuIGgnd2FyZSBpbmZvICovCisJCQkJCS8qIHdoZW4gcXVlcmllZCB2aWEgU05EQ1RMX0RTUF9HRVRGTVRTICovCisgICAgaW50IGNhcGFiaWxpdGllcyA7CQkvKiBsb3ctbGV2ZWwgcmVwbHkgdG8gU05EQ1RMX0RTUF9HRVRDQVBTICovCisgICAgU0VUVElOR1MgZGVmYXVsdF9oYXJkIDsJLyogb3BlbigpIG9yIGluaXQoKSBzaG91bGQgc2V0IHNvbWV0aGluZyB2YWxpZCAqLworICAgIFNFVFRJTkdTIGRlZmF1bHRfc29mdCA7CS8qIHlvdSBjYW4gbWFrZSBpdCBsb29rIGxpa2Ugb2xkIE9TUywgaWYgeW91IHdhbnQgdG8gKi8KK30gTUFDSElORTsKKworICAgIC8qCisgICAgICogIExvdyBsZXZlbCBzdHVmZgorICAgICAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc3NpemVfdCAoKmN0X3VsYXcpKGNvbnN0IHVfY2hhciBfX3VzZXIgKiwgc2l6ZV90LCB1X2NoYXIgKiwgc3NpemVfdCAqLCBzc2l6ZV90KTsKKyAgICBzc2l6ZV90ICgqY3RfYWxhdykoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF9zOCkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF91OCkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF9zMTZiZSkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF91MTZiZSkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF9zMTZsZSkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworICAgIHNzaXplX3QgKCpjdF91MTZsZSkoY29uc3QgdV9jaGFyIF9fdXNlciAqLCBzaXplX3QsIHVfY2hhciAqLCBzc2l6ZV90ICosIHNzaXplX3QpOworfSBUUkFOUzsKKworc3RydWN0IHNvdW5kX3NldHRpbmdzIHsKKyAgICBNQUNISU5FIG1hY2g7CS8qIG1hY2hpbmUgZGVwZW5kZW50IHRoaW5ncyAqLworICAgIFNFVFRJTkdTIGhhcmQ7CS8qIGhhcmR3YXJlIHNldHRpbmdzICovCisgICAgU0VUVElOR1Mgc29mdDsJLyogc29mdHdhcmUgc2V0dGluZ3MgKi8KKyAgICBTRVRUSU5HUyBkc3A7CS8qIC9kZXYvZHNwIGRlZmF1bHQgc2V0dGluZ3MgKi8KKyAgICBUUkFOUyAqdHJhbnNfd3JpdGU7CS8qIHN1cHBvcnRlZCB0cmFuc2xhdGlvbnMgKi8KKyNpZmRlZiBIQVNfUkVDT1JECisgICAgVFJBTlMgKnRyYW5zX3JlYWQ7CS8qIHN1cHBvcnRlZCB0cmFuc2xhdGlvbnMgKi8KKyNlbmRpZgorICAgIGludCB2b2x1bWVfbGVmdDsJLyogdm9sdW1lIChyYW5nZSBpcyBtYWNoaW5lIGRlcGVuZGVudCkgKi8KKyAgICBpbnQgdm9sdW1lX3JpZ2h0OworICAgIGludCBiYXNzOwkJLyogdG9uZSAocmFuZ2UgaXMgbWFjaGluZSBkZXBlbmRlbnQpICovCisgICAgaW50IHRyZWJsZTsKKyAgICBpbnQgZ2FpbjsKKyAgICBpbnQgbWluRGV2OwkJLyogbWlub3IgZGV2aWNlIG51bWJlciBjdXJyZW50bHkgb3BlbiAqLworICAgIHNwaW5sb2NrX3QgbG9jazsKK307CisKK2V4dGVybiBzdHJ1Y3Qgc291bmRfc2V0dGluZ3MgZG1hc291bmQ7CisKKyNpZmRlZiBIQVNfOEJJVF9UQUJMRVMKK2V4dGVybiBjaGFyIGRtYXNvdW5kX3VsYXcyZG1hOFtdOworZXh0ZXJuIGNoYXIgZG1hc291bmRfYWxhdzJkbWE4W107CisjZW5kaWYKKworICAgIC8qCisgICAgICogIE1pZCBsZXZlbCBzdHVmZgorICAgICAqLworCitzdGF0aWMgaW5saW5lIGludCBkbWFzb3VuZF9zZXRfdm9sdW1lKGludCB2b2x1bWUpCit7CisJcmV0dXJuIGRtYXNvdW5kLm1hY2guc2V0Vm9sdW1lKHZvbHVtZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGRtYXNvdW5kX3NldF9iYXNzKGludCBiYXNzKQoreworCXJldHVybiBkbWFzb3VuZC5tYWNoLnNldEJhc3MgPyBkbWFzb3VuZC5tYWNoLnNldEJhc3MoYmFzcykgOiA1MDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hc291bmRfc2V0X3RyZWJsZShpbnQgdHJlYmxlKQoreworCXJldHVybiBkbWFzb3VuZC5tYWNoLnNldFRyZWJsZSA/IGRtYXNvdW5kLm1hY2guc2V0VHJlYmxlKHRyZWJsZSkgOiA1MDsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG1hc291bmRfc2V0X2dhaW4oaW50IGdhaW4pCit7CisJcmV0dXJuIGRtYXNvdW5kLm1hY2guc2V0R2FpbiA/IGRtYXNvdW5kLm1hY2guc2V0R2FpbihnYWluKSA6IDEwMDsKK30KKworCisgICAgLyoKKyAgICAgKiBTb3VuZCBxdWV1ZSBzdHVmZiwgdGhlIGhlYXJ0IG9mIHRoZSBkcml2ZXIKKyAgICAgKi8KKworc3RydWN0IHNvdW5kX3F1ZXVlIHsKKyAgICAvKiBidWZmZXJzIGFsbG9jYXRlZCBmb3IgdGhpcyBxdWV1ZSAqLworICAgIGludCBudW1CdWZzOwkJLyogcmVhbCBsaW1pdHMgb24gd2hhdCB0aGUgdXNlciBjYW4gaGF2ZSAqLworICAgIGludCBidWZTaXplOwkJLyogaW4gYnl0ZXMgKi8KKyAgICBjaGFyICoqYnVmZmVyczsKKworICAgIC8qIGN1cnJlbnQgcGFyYW1ldGVycyAqLworICAgIGludCBsb2NrZWQgOwkJLyogcGFyYW1zIGNhbm5vdCBiZSBtb2RpZmllZCB3aGVuICE9IDAgKi8KKyAgICBpbnQgdXNlcl9mcmFncyA7CQkvKiB1c2VyIHJlcXVlc3RzIHRoaXMgbWFueSAqLworICAgIGludCB1c2VyX2ZyYWdfc2l6ZSA7CS8qIG9mIHRoaXMgc2l6ZSAqLworICAgIGludCBtYXhfY291bnQ7CQkvKiBhY3R1YWwgIyBmcmFnbWVudHMgPD0gbnVtQnVmcyAqLworICAgIGludCBibG9ja19zaXplOwkJLyogaW50ZXJuYWwgYmxvY2sgc2l6ZSBpbiBieXRlcyAqLworICAgIGludCBtYXhfYWN0aXZlOwkJLyogaW4tdXNlIGZyYWdtZW50cyA8PSBtYXhfY291bnQgKi8KKworICAgIC8qIGl0IHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgdG8gZGVjbGFyZSBhbnkgb2YgdGhlc2Ugdm9sYXRpbGUgKi8KKyAgICBpbnQgZnJvbnQsIHJlYXIsIGNvdW50OworICAgIGludCByZWFyX3NpemU7CisgICAgLyoKKyAgICAgKglUaGUgdXNlIG9mIHRoZSBwbGF5aW5nIGZpZWxkIGRlcGVuZHMgb24gdGhlIGhhcmR3YXJlCisgICAgICoKKyAgICAgKglBdGFyaSwgUE1hYzogVGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCBhcmUgbG9hZGVkL3BsYXlpbmcKKyAgICAgKgorICAgICAqCUFtaWdhOiBCaXQgMCBpcyBzZXQ6IGEgZnJhbWUgaXMgbG9hZGVkCisgICAgICoJICAgICAgIEJpdCAxIGlzIHNldDogYSBmcmFtZSBpcyBwbGF5aW5nCisgICAgICovCisgICAgaW50IGFjdGl2ZTsKKyAgICB3YWl0X3F1ZXVlX2hlYWRfdCBhY3Rpb25fcXVldWUsIG9wZW5fcXVldWUsIHN5bmNfcXVldWU7CisgICAgaW50IG9wZW5fbW9kZTsKKyAgICBpbnQgYnVzeSwgc3luY2luZywgeHJ1bnMsIGRpZWQ7Cit9OworCisjZGVmaW5lIFNMRUVQKHF1ZXVlKQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZxdWV1ZSwgSFopCisjZGVmaW5lIFdBS0VfVVAocXVldWUpCQkod2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZxdWV1ZSkpCisKK2V4dGVybiBzdHJ1Y3Qgc291bmRfcXVldWUgZG1hc291bmRfd3JpdGVfc3E7CisjZGVmaW5lIHdyaXRlX3NxCWRtYXNvdW5kX3dyaXRlX3NxCisKKyNpZmRlZiBIQVNfUkVDT1JECitleHRlcm4gc3RydWN0IHNvdW5kX3F1ZXVlIGRtYXNvdW5kX3JlYWRfc3E7CisjZGVmaW5lIHJlYWRfc3EJCWRtYXNvdW5kX3JlYWRfc3EKKyNlbmRpZgorCitleHRlcm4gaW50IGRtYXNvdW5kX2NhdGNoUmFkaXVzOworI2RlZmluZSBjYXRjaFJhZGl1cwlkbWFzb3VuZF9jYXRjaFJhZGl1cworCisvKiBkZWZpbmUgdGhlIHZhbHVlIHRvIGJlIHB1dCBpbiB0aGUgYnl0ZS1zd2FwIHJlZyBpbiBtYWMtaW8KKyAgIHdoZW4gd2Ugd2FudCBpdCB0byBzd2FwIGZvciB1cy4KKyovCisjZGVmaW5lIEJTX1ZBTCAxCisKKyNkZWZpbmUgU1dfSU5QVVRfVk9MVU1FX1NDQUxFCTQKKyNkZWZpbmUgU1dfSU5QVVRfVk9MVU1FX0RFRkFVTFQJKDEyOCAvIFNXX0lOUFVUX1ZPTFVNRV9TQ0FMRSkKKworZXh0ZXJuIGludCBleHBhbmRfYmFsOwkvKiBCYWxhbmNlIGZhY3RvciBmb3IgZXhwYW5kaW5nIChub3Qgdm9sdW1lISkgKi8KK2V4dGVybiBpbnQgZXhwYW5kX3JlYWRfYmFsOwkvKiBCYWxhbmNlIGZhY3RvciBmb3IgcmVhZGluZyAqLworZXh0ZXJuIHVpbnQgc29mdHdhcmVfaW5wdXRfdm9sdW1lOyAvKiBzb2Z0d2FyZSBpbXBsZW1lbnRlZCByZWNvcmRpbmcgdm9sdW1lISAqLworCisjZW5kaWYgLyogX2RtYXNvdW5kX2hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXRhcmkuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hdGFyaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYWFmODc2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F0YXJpLmMKQEAgLTAsMCArMSwxNjAwIEBACisvKgorICogIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hdGFyaS5jCisgKgorICogIEF0YXJpIFRUIGFuZCBGYWxjb24gRE1BIFNvdW5kIERyaXZlcgorICoKKyAqICBTZWUgbGludXgvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2NvcmUuYyBmb3IgY29weXJpZ2h0IGFuZCBjcmVkaXRzCisgKiAgcHJpb3IgdG8gMjgvMDEvMjAwMQorICoKKyAqICAyOC8wMS8yMDAxIFswLjFdIElhaW4gU2FuZG9lCisgKgkJICAgICAtIGFkZGVkIHZlcnNpb25pbmcKKyAqCQkgICAgIC0gcHV0IGluIGFuZCBwb3B1bGF0ZWQgdGhlIGhhcmR3YXJlX2FmbXRzIGZpZWxkLgorICogICAgICAgICAgICAgWzAuMl0gLSBwdXQgaW4gU05EQ1RMX0RTUF9HRVRDQVBTIHZhbHVlLgorICogIDAxLzAyLzIwMDEgWzAuM10gLSBwdXQgaW4gZGVmYXVsdCBoYXJkL3NvZnQgc2V0dGluZ3MuCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL2F0YXJpaW50cy5oPgorI2luY2x1ZGUgPGFzbS9hdGFyaV9zdHJhbS5oPgorCisjaW5jbHVkZSAiZG1hc291bmQuaCIKKworI2RlZmluZSBETUFTT1VORF9BVEFSSV9SRVZJU0lPTiAwCisjZGVmaW5lIERNQVNPVU5EX0FUQVJJX0VESVRJT04gMworCitleHRlcm4gdm9pZCBhdGFyaV9taWNyb3dpcmVfY21kKGludCBjbWQpOworCitzdGF0aWMgaW50IGlzX2ZhbGNvbjsKK3N0YXRpYyBpbnQgd3JpdGVfc3FfaWdub3JlX2ludDsJLyogKytUZVNjaGU6IHVzZWQgZm9yIEZhbGNvbiAqLworCitzdGF0aWMgaW50IGV4cGFuZF9iYWw7CS8qIEJhbGFuY2UgZmFjdG9yIGZvciBleHBhbmRpbmcgKG5vdCB2b2x1bWUhKSAqLworc3RhdGljIGludCBleHBhbmRfZGF0YTsJLyogRGF0YSBmb3IgZXhwYW5kaW5nICovCisKKworLyoqKiBUcmFuc2xhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qICsrVGVTY2hlOiByYWRpY2FsbHkgY2hhbmdlZCBmb3IgbmV3IGV4cGFuZGluZyBwdXJwb3Nlcy4uLgorICoKKyAqIFRoZXNlIHR3byByb3V0aW5lcyBub3cgZGVhbCB3aXRoIGNvcHlpbmcvZXhwYW5kaW5nL3RyYW5zbGF0aW5nIHRoZSBzYW1wbGVzCisgKiBmcm9tIHVzZXIgc3BhY2UgaW50byBvdXIgYnVmZmVyIGF0IHRoZSByaWdodCBmcmVxdWVuY3kuIFRoZXkgdGFrZSBjYXJlIGFib3V0CisgKiBob3cgbXVjaCBkYXRhIHRoZXJlJ3MgYWN0dWFsbHkgdG8gcmVhZCwgaG93IG11Y2ggYnVmZmVyIHNwYWNlIHRoZXJlIGlzIGFuZAorICogdG8gY29udmVydCBzYW1wbGVzIGludG8gdGhlIHJpZ2h0IGZyZXF1ZW5jeS9lbmNvZGluZy4gVGhleSB3aWxsIG9ubHkgd29yayBvbgorICogY29tcGxldGUgc2FtcGxlcyBzbyBpdCBtYXkgaGFwcGVuIHRoZXkgbGVhdmUgc29tZSBieXRlcyBpbiB0aGUgaW5wdXQgc3RyZWFtCisgKiBpZiB0aGUgdXNlciBkaWRuJ3Qgd3JpdGUgYSBtdWx0aXBsZSBvZiB0aGUgY3VycmVudCBzYW1wbGUgc2l6ZS4gVGhleSBib3RoCisgKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGV5J3ZlIHVzZWQgZnJvbSBib3RoIHN0cmVhbXMgc28geW91IG1heSBkZXRlY3QKKyAqIHN1Y2ggYSBzaXR1YXRpb24uIEx1Y2tpbHkgYWxsIHByb2dyYW1zIHNob3VsZCBiZSBhYmxlIHRvIGNvcGUgd2l0aCB0aGF0LgorICoKKyAqIEkgdGhpbmsgSSd2ZSBvcHRpbWl6ZWQgYW55dGhpbmcgYXMgZmFyIGFzIG9uZSBjYW4gZG8gaW4gcGxhaW4gQywgYWxsCisgKiB2YXJpYWJsZXMgc2hvdWxkIGZpdCBpbiByZWdpc3RlcnMgYW5kIHRoZSBsb29wcyBhcmUgcmVhbGx5IHNob3J0LiBUaGVyZSdzCisgKiBvbmUgbG9vcCBmb3IgZXZlcnkgcG9zc2libGUgc2l0dWF0aW9uLiBXcml0aW5nIGEgbW9yZSBnZW5lcmFsaXplZCBhbmQgdGh1cworICogcGFyYW1ldGVyaXplZCBsb29wIHdvdWxkIG9ubHkgcHJvZHVjZSBzbG93ZXIgY29kZS4gRmVlbCBmcmVlIHRvIG9wdGltaXplCisgKiB0aGlzIGluIGFzc2VtYmxlciBpZiB5b3UgbGlrZS4gOikKKyAqCisgKiBJIHRoaW5rIHRoZXNlIHJvdXRpbmVzIGJlbG9uZyBoZXJlIGJlY2F1c2UgdGhleSdyZSBub3QgeWV0IHJlYWxseSBoYXJkd2FyZQorICogaW5kZXBlbmRlbnQsIGVzcGVjaWFsbHkgdGhlIGZhY3QgdGhhdCB0aGUgRmFsY29uIGNhbiBwbGF5IDE2Yml0IHNhbXBsZXMKKyAqIG9ubHkgaW4gc3RlcmVvIGlzIGhhcmRjb2RlZCBpbiBib3RoIG9mIHRoZW0hCisgKgorICogKytnZWVydDogc3BsaXQgaW4gZXZlbiBtb3JlIGZ1bmN0aW9ucyAob25lIHBlciBmb3JtYXQpCisgKi8KKworc3RhdGljIHNzaXplX3QgYXRhX2N0X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF9zOChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBhdGFfY3RfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgYXRhX2N0X3MxNmJlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF91MTZiZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBhdGFfY3RfczE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgYXRhX2N0X3UxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfbGF3KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgYXRhX2N0eF91OChjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3UxNmJlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgYXRhX2N0eF9zMTZsZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCk7CisKKworLyoqKiBMb3cgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyB2b2lkICpBdGFBbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKTsKK3N0YXRpYyB2b2lkIEF0YUZyZWUodm9pZCAqLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IEF0YUlycUluaXQodm9pZCk7CisjaWZkZWYgTU9EVUxFCitzdGF0aWMgdm9pZCBBdGFJcnFDbGVhblVwKHZvaWQpOworI2VuZGlmIC8qIE1PRFVMRSAqLworc3RhdGljIGludCBBdGFTZXRCYXNzKGludCBiYXNzKTsKK3N0YXRpYyBpbnQgQXRhU2V0VHJlYmxlKGludCB0cmVibGUpOworc3RhdGljIHZvaWQgVFRTaWxlbmNlKHZvaWQpOworc3RhdGljIHZvaWQgVFRJbml0KHZvaWQpOworc3RhdGljIGludCBUVFNldEZvcm1hdChpbnQgZm9ybWF0KTsKK3N0YXRpYyBpbnQgVFRTZXRWb2x1bWUoaW50IHZvbHVtZSk7CitzdGF0aWMgaW50IFRUU2V0R2FpbihpbnQgZ2Fpbik7CitzdGF0aWMgdm9pZCBGYWxjb25TaWxlbmNlKHZvaWQpOworc3RhdGljIHZvaWQgRmFsY29uSW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgRmFsY29uU2V0Rm9ybWF0KGludCBmb3JtYXQpOworc3RhdGljIGludCBGYWxjb25TZXRWb2x1bWUoaW50IHZvbHVtZSk7CitzdGF0aWMgdm9pZCBBdGFQbGF5TmV4dEZyYW1lKGludCBpbmRleCk7CitzdGF0aWMgdm9pZCBBdGFQbGF5KHZvaWQpOworc3RhdGljIGlycXJldHVybl90IEF0YUludGVycnVwdChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKKworLyoqKiBNaWQgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCBUVE1peGVySW5pdCh2b2lkKTsKK3N0YXRpYyB2b2lkIEZhbGNvbk1peGVySW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgQXRhTWl4ZXJJb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpOworc3RhdGljIGludCBUVE1peGVySW9jdGwodV9pbnQgY21kLCB1X2xvbmcgYXJnKTsKK3N0YXRpYyBpbnQgRmFsY29uTWl4ZXJJb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpOworc3RhdGljIGludCBBdGFXcml0ZVNxU2V0dXAodm9pZCk7CitzdGF0aWMgaW50IEF0YVNxT3Blbihtb2RlX3QgbW9kZSk7CitzdGF0aWMgaW50IFRUU3RhdGVJbmZvKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNwYWNlKTsKK3N0YXRpYyBpbnQgRmFsY29uU3RhdGVJbmZvKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNwYWNlKTsKKworCisvKioqIFRyYW5zbGF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIHNzaXplX3QgYXRhX2N0X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCWNoYXIgKnRhYmxlID0gZG1hc291bmQuc29mdC5mb3JtYXQgPT0gQUZNVF9NVV9MQVcgPyBkbWFzb3VuZF91bGF3MmRtYTgKKwkJCQkJCQkgIDogZG1hc291bmRfYWxhdzJkbWE4OworCXNzaXplX3QgY291bnQsIHVzZWQ7CisJdV9jaGFyICpwID0gJmZyYW1lWypmcmFtZVVzZWRdOworCisJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk7CisJaWYgKGRtYXNvdW5kLnNvZnQuc3RlcmVvKQorCQljb3VudCAmPSB+MTsKKwl1c2VkID0gY291bnQ7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQl1X2NoYXIgZGF0YTsKKwkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJKnArKyA9IHRhYmxlW2RhdGFdOworCQljb3VudC0tOworCX0KKwkqZnJhbWVVc2VkICs9IHVzZWQ7CisJcmV0dXJuIHVzZWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgYXRhX2N0X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNzaXplX3QgY291bnQsIHVzZWQ7CisJdm9pZCAqcCA9ICZmcmFtZVsqZnJhbWVVc2VkXTsKKworCWNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCWlmIChkbWFzb3VuZC5zb2Z0LnN0ZXJlbykKKwkJY291bnQgJj0gfjE7CisJdXNlZCA9IGNvdW50OworCWlmIChjb3B5X2Zyb21fdXNlcihwLCB1c2VyUHRyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCSpmcmFtZVVzZWQgKz0gdXNlZDsKKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKworCWlmICghZG1hc291bmQuc29mdC5zdGVyZW8pIHsKKwkJdV9jaGFyICpwID0gJmZyYW1lWypmcmFtZVVzZWRdOworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKKwkJdXNlZCA9IGNvdW50OworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQl1X2NoYXIgZGF0YTsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCB1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJKnArKyA9IGRhdGEgXiAweDgwOworCQkJY291bnQtLTsKKwkJfQorCX0gZWxzZSB7CisJCXVfc2hvcnQgKnAgPSAodV9zaG9ydCAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk+PjE7CisJCXVzZWQgPSBjb3VudCoyOworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQl1X3Nob3J0IGRhdGE7CisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkqcCsrID0gZGF0YSBeIDB4ODA4MDsKKwkJCWNvdW50LS07CisJCX0KKwl9CisJKmZyYW1lVXNlZCArPSB1c2VkOworCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdF9zMTZiZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90IGNvdW50LCB1c2VkOworCisJaWYgKCFkbWFzb3VuZC5zb2Z0LnN0ZXJlbykgeworCQl1X3Nob3J0ICpwID0gKHVfc2hvcnQgKikmZnJhbWVbKmZyYW1lVXNlZF07CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpPj4xOworCQl1c2VkID0gY291bnQqMjsKKwkJd2hpbGUgKGNvdW50ID4gMCkgeworCQkJdV9zaG9ydCBkYXRhOworCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJKnArKyA9IGRhdGE7CisJCQkqcCsrID0gZGF0YTsKKwkJCWNvdW50LS07CisJCX0KKwkJKmZyYW1lVXNlZCArPSB1c2VkKjI7CisJfSBlbHNlIHsKKwkJdm9pZCAqcCA9ICh1X3Nob3J0ICopJmZyYW1lWypmcmFtZVVzZWRdOworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KSAmIH4zOworCQl1c2VkID0gY291bnQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcihwLCB1c2VyUHRyLCBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJKmZyYW1lVXNlZCArPSB1c2VkOworCX0KKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfdTE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKworCWlmICghZG1hc291bmQuc29mdC5zdGVyZW8pIHsKKwkJdV9zaG9ydCAqcCA9ICh1X3Nob3J0ICopJmZyYW1lWypmcmFtZVVzZWRdOworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KT4+MTsKKwkJdXNlZCA9IGNvdW50KjI7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCXVfc2hvcnQgZGF0YTsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgXj0gMHg4MDAwOworCQkJKnArKyA9IGRhdGE7CisJCQkqcCsrID0gZGF0YTsKKwkJCWNvdW50LS07CisJCX0KKwkJKmZyYW1lVXNlZCArPSB1c2VkKjI7CisJfSBlbHNlIHsKKwkJdV9sb25nICpwID0gKHVfbG9uZyAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk+PjI7CisJCXVzZWQgPSBjb3VudCo0OworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQl1X2xvbmcgZGF0YTsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfaW50ICopdXNlclB0cikrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkqcCsrID0gZGF0YSBeIDB4ODAwMDgwMDA7CisJCQljb3VudC0tOworCQl9CisJCSpmcmFtZVVzZWQgKz0gdXNlZDsKKwl9CisJcmV0dXJuIHVzZWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgYXRhX2N0X3MxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNzaXplX3QgY291bnQsIHVzZWQ7CisKKwljb3VudCA9IGZyYW1lTGVmdDsKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CisJCXVfc2hvcnQgKnAgPSAodV9zaG9ydCAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk+PjE7CisJCXVzZWQgPSBjb3VudCoyOworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQl1X3Nob3J0IGRhdGE7CisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkYXRhID0gbGUyYmUxNihkYXRhKTsKKwkJCSpwKysgPSBkYXRhOworCQkJKnArKyA9IGRhdGE7CisJCQljb3VudC0tOworCQl9CisJCSpmcmFtZVVzZWQgKz0gdXNlZCoyOworCX0gZWxzZSB7CisJCXVfbG9uZyAqcCA9ICh1X2xvbmcgKikmZnJhbWVbKmZyYW1lVXNlZF07CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpPj4yOworCQl1c2VkID0gY291bnQqNDsKKwkJd2hpbGUgKGNvdW50ID4gMCkgeworCQkJdV9sb25nIGRhdGE7CisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X2ludCAqKXVzZXJQdHIpKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZGF0YSA9IGxlMmJlMTZkYmwoZGF0YSk7CisJCQkqcCsrID0gZGF0YTsKKwkJCWNvdW50LS07CisJCX0KKwkJKmZyYW1lVXNlZCArPSB1c2VkOworCX0KKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdGFfY3RfdTE2bGUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKworCWNvdW50ID0gZnJhbWVMZWZ0OworCWlmICghZG1hc291bmQuc29mdC5zdGVyZW8pIHsKKwkJdV9zaG9ydCAqcCA9ICh1X3Nob3J0ICopJmZyYW1lWypmcmFtZVVzZWRdOworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KT4+MTsKKwkJdXNlZCA9IGNvdW50KjI7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCXVfc2hvcnQgZGF0YTsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSBsZTJiZTE2KGRhdGEpIF4gMHg4MDAwOworCQkJKnArKyA9IGRhdGE7CisJCQkqcCsrID0gZGF0YTsKKwkJfQorCQkqZnJhbWVVc2VkICs9IHVzZWQqMjsKKwl9IGVsc2UgeworCQl1X2xvbmcgKnAgPSAodV9sb25nICopJmZyYW1lWypmcmFtZVVzZWRdOworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KT4+MjsKKwkJdXNlZCA9IGNvdW50OworCQl3aGlsZSAoY291bnQgPiAwKSB7CisJCQl1X2xvbmcgZGF0YTsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfaW50ICopdXNlclB0cikrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkYXRhID0gbGUyYmUxNmRibChkYXRhKSBeIDB4ODAwMDgwMDA7CisJCQkqcCsrID0gZGF0YTsKKwkJCWNvdW50LS07CisJCX0KKwkJKmZyYW1lVXNlZCArPSB1c2VkOworCX0KKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJY2hhciAqdGFibGUgPSBkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9PSBBRk1UX01VX0xBVyA/IGRtYXNvdW5kX3VsYXcyZG1hOAorCQkJCQkJCSAgOiBkbWFzb3VuZF9hbGF3MmRtYTg7CisJLyogdGhpcyBzaG91bGQgaGVscCBnY2MgdG8gc3R1ZmYgZXZlcnl0aGluZyBpbnRvIHJlZ2lzdGVycyAqLworCWxvbmcgYmFsID0gZXhwYW5kX2JhbDsKKwlsb25nIGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJc3NpemVfdCB1c2VkLCB1c2VkZjsKKworCXVzZWQgPSB1c2VyQ291bnQ7CisJdXNlZGYgPSBmcmFtZUxlZnQ7CisJaWYgKCFkbWFzb3VuZC5zb2Z0LnN0ZXJlbykgeworCQl1X2NoYXIgKnAgPSAmZnJhbWVbKmZyYW1lVXNlZF07CisJCXVfY2hhciBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJCXVfY2hhciBjOworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAoIXVzZXJDb3VudCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGMsIHVzZXJQdHIrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgPSB0YWJsZVtjXTsKKwkJCQl1c2VyQ291bnQtLTsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQtLTsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0gZWxzZSB7CisJCXVfc2hvcnQgKnAgPSAodV9zaG9ydCAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9zaG9ydCBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQgPj0gMikgeworCQkJdV9jaGFyIGM7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICh1c2VyQ291bnQgPCAyKQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IHRhYmxlW2NdIDw8IDg7CisJCQkJaWYgKGdldF91c2VyKGMsIHVzZXJQdHIrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgfD0gdGFibGVbY107CisJCQkJdXNlckNvdW50IC09IDI7CisJCQkJYmFsICs9IGhTcGVlZDsKKwkJCX0KKwkJCSpwKysgPSBkYXRhOworCQkJZnJhbWVMZWZ0IC09IDI7CisJCQliYWwgLT0gc1NwZWVkOworCQl9CisJCWV4cGFuZF9kYXRhID0gZGF0YTsKKwl9CisJZXhwYW5kX2JhbCA9IGJhbDsKKwl1c2VkIC09IHVzZXJDb3VudDsKKwkqZnJhbWVVc2VkICs9IHVzZWRmLWZyYW1lTGVmdDsKKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJLyogdGhpcyBzaG91bGQgaGVscCBnY2MgdG8gc3R1ZmYgZXZlcnl0aGluZyBpbnRvIHJlZ2lzdGVycyAqLworCWxvbmcgYmFsID0gZXhwYW5kX2JhbDsKKwlsb25nIGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJc3NpemVfdCB1c2VkLCB1c2VkZjsKKworCXVzZWQgPSB1c2VyQ291bnQ7CisJdXNlZGYgPSBmcmFtZUxlZnQ7CisJaWYgKCFkbWFzb3VuZC5zb2Z0LnN0ZXJlbykgeworCQl1X2NoYXIgKnAgPSAmZnJhbWVbKmZyYW1lVXNlZF07CisJCXVfY2hhciBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJCWlmIChiYWwgPCAwKSB7CisJCQkJaWYgKCF1c2VyQ291bnQpCisJCQkJCWJyZWFrOworCQkJCWlmIChnZXRfdXNlcihkYXRhLCB1c2VyUHRyKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyQ291bnQtLTsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQtLTsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0gZWxzZSB7CisJCXVfc2hvcnQgKnAgPSAodV9zaG9ydCAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9zaG9ydCBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQgPj0gMikgeworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAodXNlckNvdW50IDwgMikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyQ291bnQgLT0gMjsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQgLT0gMjsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCXVzZWQgLT0gdXNlckNvdW50OworCSpmcmFtZVVzZWQgKz0gdXNlZGYtZnJhbWVMZWZ0OworCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwkvKiB0aGlzIHNob3VsZCBoZWxwIGdjYyB0byBzdHVmZiBldmVyeXRoaW5nIGludG8gcmVnaXN0ZXJzICovCisJbG9uZyBiYWwgPSBleHBhbmRfYmFsOworCWxvbmcgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlzc2l6ZV90IHVzZWQsIHVzZWRmOworCisJdXNlZCA9IHVzZXJDb3VudDsKKwl1c2VkZiA9IGZyYW1lTGVmdDsKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CisJCXVfY2hhciAqcCA9ICZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9jaGFyIGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCkgeworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAoIXVzZXJDb3VudCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgXj0gMHg4MDsKKwkJCQl1c2VyQ291bnQtLTsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQtLTsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0gZWxzZSB7CisJCXVfc2hvcnQgKnAgPSAodV9zaG9ydCAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9zaG9ydCBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQgPj0gMikgeworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAodXNlckNvdW50IDwgMikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhIF49IDB4ODA4MDsKKwkJCQl1c2VyQ291bnQgLT0gMjsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQgLT0gMjsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCXVzZWQgLT0gdXNlckNvdW50OworCSpmcmFtZVVzZWQgKz0gdXNlZGYtZnJhbWVMZWZ0OworCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfczE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwkvKiB0aGlzIHNob3VsZCBoZWxwIGdjYyB0byBzdHVmZiBldmVyeXRoaW5nIGludG8gcmVnaXN0ZXJzICovCisJbG9uZyBiYWwgPSBleHBhbmRfYmFsOworCWxvbmcgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlzc2l6ZV90IHVzZWQsIHVzZWRmOworCisJdXNlZCA9IHVzZXJDb3VudDsKKwl1c2VkZiA9IGZyYW1lTGVmdDsKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CisJCXVfc2hvcnQgKnAgPSAodV9zaG9ydCAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9zaG9ydCBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQgPj0gNCkgeworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAodXNlckNvdW50IDwgMikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyQ291bnQgLT0gMjsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdCAtPSA0OworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfSBlbHNlIHsKKwkJdV9sb25nICpwID0gKHVfbG9uZyAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9sb25nIGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCA+PSA0KSB7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICh1c2VyQ291bnQgPCA0KQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X2ludCAqKXVzZXJQdHIpKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl1c2VyQ291bnQgLT0gNDsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQgLT0gNDsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCXVzZWQgLT0gdXNlckNvdW50OworCSpmcmFtZVVzZWQgKz0gdXNlZGYtZnJhbWVMZWZ0OworCXJldHVybiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IGF0YV9jdHhfdTE2YmUoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwkvKiB0aGlzIHNob3VsZCBoZWxwIGdjYyB0byBzdHVmZiBldmVyeXRoaW5nIGludG8gcmVnaXN0ZXJzICovCisJbG9uZyBiYWwgPSBleHBhbmRfYmFsOworCWxvbmcgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlzc2l6ZV90IHVzZWQsIHVzZWRmOworCisJdXNlZCA9IHVzZXJDb3VudDsKKwl1c2VkZiA9IGZyYW1lTGVmdDsKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CisJCXVfc2hvcnQgKnAgPSAodV9zaG9ydCAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9zaG9ydCBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQgPj0gNCkgeworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAodXNlckNvdW50IDwgMikKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhIF49IDB4ODAwMDsKKwkJCQl1c2VyQ291bnQgLT0gMjsKKwkJCQliYWwgKz0gaFNwZWVkOworCQkJfQorCQkJKnArKyA9IGRhdGE7CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdCAtPSA0OworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfSBlbHNlIHsKKwkJdV9sb25nICpwID0gKHVfbG9uZyAqKSZmcmFtZVsqZnJhbWVVc2VkXTsKKwkJdV9sb25nIGRhdGEgPSBleHBhbmRfZGF0YTsKKwkJd2hpbGUgKGZyYW1lTGVmdCA+PSA0KSB7CisJCQlpZiAoYmFsIDwgMCkgeworCQkJCWlmICh1c2VyQ291bnQgPCA0KQorCQkJCQlicmVhazsKKwkJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X2ludCAqKXVzZXJQdHIpKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhIF49IDB4ODAwMDgwMDA7CisJCQkJdXNlckNvdW50IC09IDQ7CisJCQkJYmFsICs9IGhTcGVlZDsKKwkJCX0KKwkJCSpwKysgPSBkYXRhOworCQkJZnJhbWVMZWZ0IC09IDQ7CisJCQliYWwgLT0gc1NwZWVkOworCQl9CisJCWV4cGFuZF9kYXRhID0gZGF0YTsKKwl9CisJZXhwYW5kX2JhbCA9IGJhbDsKKwl1c2VkIC09IHVzZXJDb3VudDsKKwkqZnJhbWVVc2VkICs9IHVzZWRmLWZyYW1lTGVmdDsKKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3MxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJLyogdGhpcyBzaG91bGQgaGVscCBnY2MgdG8gc3R1ZmYgZXZlcnl0aGluZyBpbnRvIHJlZ2lzdGVycyAqLworCWxvbmcgYmFsID0gZXhwYW5kX2JhbDsKKwlsb25nIGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJc3NpemVfdCB1c2VkLCB1c2VkZjsKKworCXVzZWQgPSB1c2VyQ291bnQ7CisJdXNlZGYgPSBmcmFtZUxlZnQ7CisJaWYgKCFkbWFzb3VuZC5zb2Z0LnN0ZXJlbykgeworCQl1X3Nob3J0ICpwID0gKHVfc2hvcnQgKikmZnJhbWVbKmZyYW1lVXNlZF07CisJCXVfc2hvcnQgZGF0YSA9IGV4cGFuZF9kYXRhOworCQl3aGlsZSAoZnJhbWVMZWZ0ID49IDQpIHsKKwkJCWlmIChiYWwgPCAwKSB7CisJCQkJaWYgKHVzZXJDb3VudCA8IDIpCisJCQkJCWJyZWFrOworCQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IGxlMmJlMTYoZGF0YSk7CisJCQkJdXNlckNvdW50IC09IDI7CisJCQkJYmFsICs9IGhTcGVlZDsKKwkJCX0KKwkJCSpwKysgPSBkYXRhOworCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQgLT0gNDsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0gZWxzZSB7CisJCXVfbG9uZyAqcCA9ICh1X2xvbmcgKikmZnJhbWVbKmZyYW1lVXNlZF07CisJCXVfbG9uZyBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQgPj0gNCkgeworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAodXNlckNvdW50IDwgNCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IGxlMmJlMTZkYmwoZGF0YSk7CisJCQkJdXNlckNvdW50IC09IDQ7CisJCQkJYmFsICs9IGhTcGVlZDsKKwkJCX0KKwkJCSpwKysgPSBkYXRhOworCQkJZnJhbWVMZWZ0IC09IDQ7CisJCQliYWwgLT0gc1NwZWVkOworCQl9CisJCWV4cGFuZF9kYXRhID0gZGF0YTsKKwl9CisJZXhwYW5kX2JhbCA9IGJhbDsKKwl1c2VkIC09IHVzZXJDb3VudDsKKwkqZnJhbWVVc2VkICs9IHVzZWRmLWZyYW1lTGVmdDsKKwlyZXR1cm4gdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBhdGFfY3R4X3UxNmxlKGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJLyogdGhpcyBzaG91bGQgaGVscCBnY2MgdG8gc3R1ZmYgZXZlcnl0aGluZyBpbnRvIHJlZ2lzdGVycyAqLworCWxvbmcgYmFsID0gZXhwYW5kX2JhbDsKKwlsb25nIGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJc3NpemVfdCB1c2VkLCB1c2VkZjsKKworCXVzZWQgPSB1c2VyQ291bnQ7CisJdXNlZGYgPSBmcmFtZUxlZnQ7CisJaWYgKCFkbWFzb3VuZC5zb2Z0LnN0ZXJlbykgeworCQl1X3Nob3J0ICpwID0gKHVfc2hvcnQgKikmZnJhbWVbKmZyYW1lVXNlZF07CisJCXVfc2hvcnQgZGF0YSA9IGV4cGFuZF9kYXRhOworCQl3aGlsZSAoZnJhbWVMZWZ0ID49IDQpIHsKKwkJCWlmIChiYWwgPCAwKSB7CisJCQkJaWYgKHVzZXJDb3VudCA8IDIpCisJCQkJCWJyZWFrOworCQkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IGxlMmJlMTYoZGF0YSkgXiAweDgwMDA7CisJCQkJdXNlckNvdW50IC09IDI7CisJCQkJYmFsICs9IGhTcGVlZDsKKwkJCX0KKwkJCSpwKysgPSBkYXRhOworCQkJKnArKyA9IGRhdGE7CisJCQlmcmFtZUxlZnQgLT0gNDsKKwkJCWJhbCAtPSBzU3BlZWQ7CisJCX0KKwkJZXhwYW5kX2RhdGEgPSBkYXRhOworCX0gZWxzZSB7CisJCXVfbG9uZyAqcCA9ICh1X2xvbmcgKikmZnJhbWVbKmZyYW1lVXNlZF07CisJCXVfbG9uZyBkYXRhID0gZXhwYW5kX2RhdGE7CisJCXdoaWxlIChmcmFtZUxlZnQgPj0gNCkgeworCQkJaWYgKGJhbCA8IDApIHsKKwkJCQlpZiAodXNlckNvdW50IDwgNCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9pbnQgKil1c2VyUHRyKSsrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IGxlMmJlMTZkYmwoZGF0YSkgXiAweDgwMDA4MDAwOworCQkJCXVzZXJDb3VudCAtPSA0OworCQkJCWJhbCArPSBoU3BlZWQ7CisJCQl9CisJCQkqcCsrID0gZGF0YTsKKwkJCWZyYW1lTGVmdCAtPSA0OworCQkJYmFsIC09IHNTcGVlZDsKKwkJfQorCQlleHBhbmRfZGF0YSA9IGRhdGE7CisJfQorCWV4cGFuZF9iYWwgPSBiYWw7CisJdXNlZCAtPSB1c2VyQ291bnQ7CisJKmZyYW1lVXNlZCArPSB1c2VkZi1mcmFtZUxlZnQ7CisJcmV0dXJuIHVzZWQ7Cit9CisKKworc3RhdGljIFRSQU5TIHRyYW5zVFROb3JtYWwgPSB7CisJLmN0X3VsYXcJPSBhdGFfY3RfbGF3LAorCS5jdF9hbGF3CT0gYXRhX2N0X2xhdywKKwkuY3RfczgJCT0gYXRhX2N0X3M4LAorCS5jdF91OAkJPSBhdGFfY3RfdTgsCit9OworCitzdGF0aWMgVFJBTlMgdHJhbnNUVEV4cGFuZGluZyA9IHsKKwkuY3RfdWxhdwk9IGF0YV9jdHhfbGF3LAorCS5jdF9hbGF3CT0gYXRhX2N0eF9sYXcsCisJLmN0X3M4CQk9IGF0YV9jdHhfczgsCisJLmN0X3U4CQk9IGF0YV9jdHhfdTgsCit9OworCitzdGF0aWMgVFJBTlMgdHJhbnNGYWxjb25Ob3JtYWwgPSB7CisJLmN0X3VsYXcJPSBhdGFfY3RfbGF3LAorCS5jdF9hbGF3CT0gYXRhX2N0X2xhdywKKwkuY3RfczgJCT0gYXRhX2N0X3M4LAorCS5jdF91OAkJPSBhdGFfY3RfdTgsCisJLmN0X3MxNmJlCT0gYXRhX2N0X3MxNmJlLAorCS5jdF91MTZiZQk9IGF0YV9jdF91MTZiZSwKKwkuY3RfczE2bGUJPSBhdGFfY3RfczE2bGUsCisJLmN0X3UxNmxlCT0gYXRhX2N0X3UxNmxlCit9OworCitzdGF0aWMgVFJBTlMgdHJhbnNGYWxjb25FeHBhbmRpbmcgPSB7CisJLmN0X3VsYXcJPSBhdGFfY3R4X2xhdywKKwkuY3RfYWxhdwk9IGF0YV9jdHhfbGF3LAorCS5jdF9zOAkJPSBhdGFfY3R4X3M4LAorCS5jdF91OAkJPSBhdGFfY3R4X3U4LAorCS5jdF9zMTZiZQk9IGF0YV9jdHhfczE2YmUsCisJLmN0X3UxNmJlCT0gYXRhX2N0eF91MTZiZSwKKwkuY3RfczE2bGUJPSBhdGFfY3R4X3MxNmxlLAorCS5jdF91MTZsZQk9IGF0YV9jdHhfdTE2bGUsCit9OworCisKKy8qKiogTG93IGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisKKy8qCisgKiBBdGFyaSAoVFQvRmFsY29uKQorICovCisKK3N0YXRpYyB2b2lkICpBdGFBbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiBhdGFyaV9zdHJhbV9hbGxvYyhzaXplLCAiZG1hc291bmQiKTsKK30KKworc3RhdGljIHZvaWQgQXRhRnJlZSh2b2lkICpvYmosIHVuc2lnbmVkIGludCBzaXplKQoreworCWF0YXJpX3N0cmFtX2ZyZWUoIG9iaiApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBBdGFJcnFJbml0KHZvaWQpCit7CisJLyogU2V0IHVwIHRpbWVyIEEuIFRpbWVyIEEKKwkgICB3aWxsIHJlY2VpdmUgYSBzaWduYWwgdXBvbiBlbmQgb2YgcGxheWluZyBmcm9tIHRoZSBzb3VuZAorCSAgIGhhcmR3YXJlLiBGdXJ0aGVybW9yZSBUaW1lciBBIGlzIGFibGUgdG8gY291bnQgZXZlbnRzCisJICAgYW5kIHdpbGwgY2F1c2UgYW4gaW50ZXJydXB0IGFmdGVyIGEgcHJvZ3JhbW1lZCBudW1iZXIKKwkgICBvZiBldmVudHMuIFNvIGFsbCB3ZSBuZWVkIHRvIGtlZXAgdGhlIG11c2ljIHBsYXlpbmcgaXMKKwkgICB0byBwcm92aWRlIHRoZSBzb3VuZCBoYXJkd2FyZSB3aXRoIG5ldyBkYXRhIHVwb24KKwkgICBhbiBpbnRlcnJ1cHQgZnJvbSB0aW1lciBBLiAqLworCW1mcC50aW1fY3RfYSA9IDA7CS8qICsrcm9tYW46IFN0b3AgdGltZXIgYmVmb3JlIHByb2dyYW1taW5nISAqLworCW1mcC50aW1fZHRfYSA9IDE7CS8qIENhdXNlIGludGVycnVwdCBhZnRlciBmaXJzdCBldmVudC4gKi8KKwltZnAudGltX2N0X2EgPSA4OwkvKiBUdXJuIG9uIGV2ZW50IGNvdW50aW5nLiAqLworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyLiAqLworCXJlcXVlc3RfaXJxKElSUV9NRlBfVElNQSwgQXRhSW50ZXJydXB0LCBJUlFfVFlQRV9TTE9XLCAiRE1BIHNvdW5kIiwKKwkJICAgIEF0YUludGVycnVwdCk7CisJbWZwLmludF9lbl9hIHw9IDB4MjA7CS8qIFR1cm4gaW50ZXJydXB0IG9uLiAqLworCW1mcC5pbnRfbWtfYSB8PSAweDIwOworCXJldHVybiAxOworfQorCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgdm9pZCBBdGFJcnFDbGVhblVwKHZvaWQpCit7CisJbWZwLnRpbV9jdF9hID0gMDsJLyogc3RvcCB0aW1lciAqLworCW1mcC5pbnRfZW5fYSAmPSB+MHgyMDsJLyogdHVybiBpbnRlcnJ1cHQgb2ZmICovCisJZnJlZV9pcnEoSVJRX01GUF9USU1BLCBBdGFJbnRlcnJ1cHQpOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCisKKyNkZWZpbmUgVE9ORV9WT1hXQVJFX1RPX0RCKHYpIFwKKwkoKCh2KSA8IDApID8gLTEyIDogKCh2KSA+IDEwMCkgPyAxMiA6ICgodikgLSA1MCkgKiA2IC8gMjUpCisjZGVmaW5lIFRPTkVfREJfVE9fVk9YV0FSRSh2KSAoKCh2KSAqIDI1ICsgKCh2KSA+IDAgPyA1IDogLTUpKSAvIDYgKyA1MCkKKworCitzdGF0aWMgaW50IEF0YVNldEJhc3MoaW50IGJhc3MpCit7CisJZG1hc291bmQuYmFzcyA9IFRPTkVfVk9YV0FSRV9UT19EQihiYXNzKTsKKwlhdGFyaV9taWNyb3dpcmVfY21kKE1XX0xNMTk5Ml9CQVNTKGRtYXNvdW5kLmJhc3MpKTsKKwlyZXR1cm4gVE9ORV9EQl9UT19WT1hXQVJFKGRtYXNvdW5kLmJhc3MpOworfQorCisKK3N0YXRpYyBpbnQgQXRhU2V0VHJlYmxlKGludCB0cmVibGUpCit7CisJZG1hc291bmQudHJlYmxlID0gVE9ORV9WT1hXQVJFX1RPX0RCKHRyZWJsZSk7CisJYXRhcmlfbWljcm93aXJlX2NtZChNV19MTTE5OTJfVFJFQkxFKGRtYXNvdW5kLnRyZWJsZSkpOworCXJldHVybiBUT05FX0RCX1RPX1ZPWFdBUkUoZG1hc291bmQudHJlYmxlKTsKK30KKworCisKKy8qCisgKiBUVAorICovCisKKworc3RhdGljIHZvaWQgVFRTaWxlbmNlKHZvaWQpCit7CisJdHRfZG1hc25kLmN0cmwgPSBETUFTTkRfQ1RSTF9PRkY7CisJYXRhcmlfbWljcm93aXJlX2NtZChNV19MTTE5OTJfUFNHX0hJR0gpOyAvKiBtaXggaW4gUFNHIHNpZ25hbCAxOjEgKi8KK30KKworCitzdGF0aWMgdm9pZCBUVEluaXQodm9pZCkKK3sKKwlpbnQgbW9kZSwgaSwgaWR4OworCWNvbnN0IGludCBmcmVxWzRdID0gezUwMDY2LCAyNTAzMywgMTI1MTcsIDYyNTh9OworCisJLyogc2VhcmNoIGEgZnJlcXVlbmN5IHRoYXQgZml0cyBpbnRvIHRoZSBhbGxvd2VkIGVycm9yIHJhbmdlICovCisKKwlpZHggPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmcmVxKTsgaSsrKQorCQkvKiB0aGlzIGlzbid0IGFzIG11Y2ggdXNlZnVsIGZvciBhIFRUIHRoYW4gZm9yIGEgRmFsY29uLCBidXQKKwkJICogdGhlbiBpdCBkb2Vzbid0IGh1cnQgdmVyeSBtdWNoIHRvIGltcGxlbWVudCBpdCBmb3IgYSBUVCB0b28uCisJCSAqLworCQlpZiAoKDEwMCAqIGFicyhkbWFzb3VuZC5zb2Z0LnNwZWVkIC0gZnJlcVtpXSkgLyBmcmVxW2ldKSA8IGNhdGNoUmFkaXVzKQorCQkJaWR4ID0gaTsKKwlpZiAoaWR4ID4gLTEpIHsKKwkJZG1hc291bmQuc29mdC5zcGVlZCA9IGZyZXFbaWR4XTsKKwkJZG1hc291bmQudHJhbnNfd3JpdGUgPSAmdHJhbnNUVE5vcm1hbDsKKwl9IGVsc2UKKwkJZG1hc291bmQudHJhbnNfd3JpdGUgPSAmdHJhbnNUVEV4cGFuZGluZzsKKworCVRUU2lsZW5jZSgpOworCWRtYXNvdW5kLmhhcmQgPSBkbWFzb3VuZC5zb2Z0OworCisJaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiA1MDA2NikgeworCQkvKiB3ZSB3b3VsZCBuZWVkIHRvIHNxdWVlemUgdGhlIHNvdW5kLCBidXQgd2Ugd29uJ3QgZG8gdGhhdCAqLworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gNTAwNjY7CisJCW1vZGUgPSBETUFTTkRfTU9ERV81MEtIWjsKKwkJZG1hc291bmQudHJhbnNfd3JpdGUgPSAmdHJhbnNUVE5vcm1hbDsKKwl9IGVsc2UgaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiAyNTAzMykgeworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gNTAwNjY7CisJCW1vZGUgPSBETUFTTkRfTU9ERV81MEtIWjsKKwl9IGVsc2UgaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiAxMjUxNykgeworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gMjUwMzM7CisJCW1vZGUgPSBETUFTTkRfTU9ERV8yNUtIWjsKKwl9IGVsc2UgaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiA2MjU4KSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSAxMjUxNzsKKwkJbW9kZSA9IERNQVNORF9NT0RFXzEyS0haOworCX0gZWxzZSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSA2MjU4OworCQltb2RlID0gRE1BU05EX01PREVfNktIWjsKKwl9CisKKwl0dF9kbWFzbmQubW9kZSA9IChkbWFzb3VuZC5oYXJkLnN0ZXJlbyA/CisJCQkgIERNQVNORF9NT0RFX1NURVJFTyA6IERNQVNORF9NT0RFX01PTk8pIHwKKwkJRE1BU05EX01PREVfOEJJVCB8IG1vZGU7CisKKwlleHBhbmRfYmFsID0gLWRtYXNvdW5kLnNvZnQuc3BlZWQ7Cit9CisKKworc3RhdGljIGludCBUVFNldEZvcm1hdChpbnQgZm9ybWF0KQoreworCS8qIFRUIHNvdW5kIERNQSBzdXBwb3J0cyBvbmx5IDhiaXQgbW9kZXMgKi8KKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBBRk1UX1FVRVJZOgorCQlyZXR1cm4gZG1hc291bmQuc29mdC5mb3JtYXQ7CisJY2FzZSBBRk1UX01VX0xBVzoKKwljYXNlIEFGTVRfQV9MQVc6CisJY2FzZSBBRk1UX1M4OgorCWNhc2UgQUZNVF9VODoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZm9ybWF0ID0gQUZNVF9TODsKKwl9CisKKwlkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9IGZvcm1hdDsKKwlkbWFzb3VuZC5zb2Z0LnNpemUgPSA4OworCWlmIChkbWFzb3VuZC5taW5EZXYgPT0gU05EX0RFVl9EU1ApIHsKKwkJZG1hc291bmQuZHNwLmZvcm1hdCA9IGZvcm1hdDsKKwkJZG1hc291bmQuZHNwLnNpemUgPSA4OworCX0KKwlUVEluaXQoKTsKKworCXJldHVybiBmb3JtYXQ7Cit9CisKKworI2RlZmluZSBWT0xVTUVfVk9YV0FSRV9UT19EQih2KSBcCisJKCgodikgPCAwKSA/IC00MCA6ICgodikgPiAxMDApID8gMCA6ICgodikgKiAyKSAvIDUgLSA0MCkKKyNkZWZpbmUgVk9MVU1FX0RCX1RPX1ZPWFdBUkUodikgKCgoKHYpICsgNDApICogNSArIDEpIC8gMikKKworCitzdGF0aWMgaW50IFRUU2V0Vm9sdW1lKGludCB2b2x1bWUpCit7CisJZG1hc291bmQudm9sdW1lX2xlZnQgPSBWT0xVTUVfVk9YV0FSRV9UT19EQih2b2x1bWUgJiAweGZmKTsKKwlhdGFyaV9taWNyb3dpcmVfY21kKE1XX0xNMTk5Ml9CQUxMRUZUKGRtYXNvdW5kLnZvbHVtZV9sZWZ0KSk7CisJZG1hc291bmQudm9sdW1lX3JpZ2h0ID0gVk9MVU1FX1ZPWFdBUkVfVE9fREIoKHZvbHVtZSAmIDB4ZmYwMCkgPj4gOCk7CisJYXRhcmlfbWljcm93aXJlX2NtZChNV19MTTE5OTJfQkFMUklHSFQoZG1hc291bmQudm9sdW1lX3JpZ2h0KSk7CisJcmV0dXJuIFZPTFVNRV9EQl9UT19WT1hXQVJFKGRtYXNvdW5kLnZvbHVtZV9sZWZ0KSB8CisJICAgICAgIChWT0xVTUVfREJfVE9fVk9YV0FSRShkbWFzb3VuZC52b2x1bWVfcmlnaHQpIDw8IDgpOworfQorCisKKyNkZWZpbmUgR0FJTl9WT1hXQVJFX1RPX0RCKHYpIFwKKwkoKCh2KSA8IDApID8gLTgwIDogKCh2KSA+IDEwMCkgPyAwIDogKCh2KSAqIDQpIC8gNSAtIDgwKQorI2RlZmluZSBHQUlOX0RCX1RPX1ZPWFdBUkUodikgKCgoKHYpICsgODApICogNSArIDEpIC8gNCkKKworc3RhdGljIGludCBUVFNldEdhaW4oaW50IGdhaW4pCit7CisJZG1hc291bmQuZ2FpbiA9IEdBSU5fVk9YV0FSRV9UT19EQihnYWluKTsKKwlhdGFyaV9taWNyb3dpcmVfY21kKE1XX0xNMTk5Ml9WT0xVTUUoZG1hc291bmQuZ2FpbikpOworCXJldHVybiBHQUlOX0RCX1RPX1ZPWFdBUkUoZG1hc291bmQuZ2Fpbik7Cit9CisKKworCisvKgorICogRmFsY29uCisgKi8KKworCitzdGF0aWMgdm9pZCBGYWxjb25TaWxlbmNlKHZvaWQpCit7CisJLyogc3RvcCBwbGF5YmFjaywgc2V0IHNhbXBsZSByYXRlIDUwa0h6IGZvciBQU0cgc291bmQgKi8KKwl0dF9kbWFzbmQuY3RybCA9IERNQVNORF9DVFJMX09GRjsKKwl0dF9kbWFzbmQubW9kZSA9IERNQVNORF9NT0RFXzUwS0haIHwgRE1BU05EX01PREVfU1RFUkVPIHwgRE1BU05EX01PREVfOEJJVDsKKwl0dF9kbWFzbmQuaW50X2RpdiA9IDA7IC8qIFNURSBjb21wYXRpYmxlIGRpdmlkZXIgKi8KKwl0dF9kbWFzbmQuaW50X2N0cmwgPSAweDA7CisJdHRfZG1hc25kLmNiYXJfc3JjID0gMHgwMDAwOyAvKiBubyBtYXRyaXggaW5wdXRzICovCisJdHRfZG1hc25kLmNiYXJfZHN0ID0gMHgwMDAwOyAvKiBubyBtYXRyaXggb3V0cHV0cyAqLworCXR0X2RtYXNuZC5kYWNfc3JjID0gMTsgLyogY29ubmVjdCBBREMgdG8gREFDLCBkaXNjb25uZWN0IG1hdHJpeCAqLworCXR0X2RtYXNuZC5hZGNfc3JjID0gMzsgLyogQURDIElucHV0ID0gUFNHICovCit9CisKKworc3RhdGljIHZvaWQgRmFsY29uSW5pdCh2b2lkKQoreworCWludCBkaXZpZGVyLCBpLCBpZHg7CisJY29uc3QgaW50IGZyZXFbOF0gPSB7NDkxNzAsIDMyNzgwLCAyNDU4NSwgMTk2NjgsIDE2MzkwLCAxMjI5MiwgOTgzNCwgODE5NX07CisKKwkvKiBzZWFyY2ggYSBmcmVxdWVuY3kgdGhhdCBmaXRzIGludG8gdGhlIGFsbG93ZWQgZXJyb3IgcmFuZ2UgKi8KKworCWlkeCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZyZXEpOyBpKyspCisJCS8qIGlmIHdlIHdpbGwgdG9sZXJhdGUgMyUgZXJyb3IgODAwMEh6LT44MTk1SHogKDIuMzglKSB3b3VsZAorCQkgKiBiZSBwbGF5YWJsZSB3aXRob3V0IGV4cGFuZGluZywgYnV0IHRoYXQgbm93IGEga2VybmVsIHJ1bnRpbWUKKwkJICogb3B0aW9uCisJCSAqLworCQlpZiAoKDEwMCAqIGFicyhkbWFzb3VuZC5zb2Z0LnNwZWVkIC0gZnJlcVtpXSkgLyBmcmVxW2ldKSA8IGNhdGNoUmFkaXVzKQorCQkJaWR4ID0gaTsKKwlpZiAoaWR4ID4gLTEpIHsKKwkJZG1hc291bmQuc29mdC5zcGVlZCA9IGZyZXFbaWR4XTsKKwkJZG1hc291bmQudHJhbnNfd3JpdGUgPSAmdHJhbnNGYWxjb25Ob3JtYWw7CisJfSBlbHNlCisJCWRtYXNvdW5kLnRyYW5zX3dyaXRlID0gJnRyYW5zRmFsY29uRXhwYW5kaW5nOworCisJRmFsY29uU2lsZW5jZSgpOworCWRtYXNvdW5kLmhhcmQgPSBkbWFzb3VuZC5zb2Z0OworCisJaWYgKGRtYXNvdW5kLmhhcmQuc2l6ZSA9PSAxNikgeworCQkvKiB0aGUgRmFsY29uIGNhbiBwbGF5IDE2Yml0IHNhbXBsZXMgb25seSBpbiBzdGVyZW8gKi8KKwkJZG1hc291bmQuaGFyZC5zdGVyZW8gPSAxOworCX0KKworCWlmIChkbWFzb3VuZC5oYXJkLnNwZWVkID4gNDkxNzApIHsKKwkJLyogd2Ugd291bGQgbmVlZCB0byBzcXVlZXplIHRoZSBzb3VuZCwgYnV0IHdlIHdvbid0IGRvIHRoYXQgKi8KKwkJZG1hc291bmQuaGFyZC5zcGVlZCA9IDQ5MTcwOworCQlkaXZpZGVyID0gMTsKKwkJZG1hc291bmQudHJhbnNfd3JpdGUgPSAmdHJhbnNGYWxjb25Ob3JtYWw7CisJfSBlbHNlIGlmIChkbWFzb3VuZC5oYXJkLnNwZWVkID4gMzI3ODApIHsKKwkJZG1hc291bmQuaGFyZC5zcGVlZCA9IDQ5MTcwOworCQlkaXZpZGVyID0gMTsKKwl9IGVsc2UgaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiAyNDU4NSkgeworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gMzI3ODA7CisJCWRpdmlkZXIgPSAyOworCX0gZWxzZSBpZiAoZG1hc291bmQuaGFyZC5zcGVlZCA+IDE5NjY4KSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSAyNDU4NTsKKwkJZGl2aWRlciA9IDM7CisJfSBlbHNlIGlmIChkbWFzb3VuZC5oYXJkLnNwZWVkID4gMTYzOTApIHsKKwkJZG1hc291bmQuaGFyZC5zcGVlZCA9IDE5NjY4OworCQlkaXZpZGVyID0gNDsKKwl9IGVsc2UgaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiAxMjI5MikgeworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gMTYzOTA7CisJCWRpdmlkZXIgPSA1OworCX0gZWxzZSBpZiAoZG1hc291bmQuaGFyZC5zcGVlZCA+IDk4MzQpIHsKKwkJZG1hc291bmQuaGFyZC5zcGVlZCA9IDEyMjkyOworCQlkaXZpZGVyID0gNzsKKwl9IGVsc2UgaWYgKGRtYXNvdW5kLmhhcmQuc3BlZWQgPiA4MTk1KSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSA5ODM0OworCQlkaXZpZGVyID0gOTsKKwl9IGVsc2UgeworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gODE5NTsKKwkJZGl2aWRlciA9IDExOworCX0KKwl0dF9kbWFzbmQuaW50X2RpdiA9IGRpdmlkZXI7CisKKwkvKiBTZXR1cCBGYWxjb24gc291bmQgRE1BIGZvciBwbGF5YmFjayAqLworCXR0X2RtYXNuZC5pbnRfY3RybCA9IDB4NDsgLyogVGltZXIgQSBpbnQgYXQgcGxheSBlbmQgKi8KKwl0dF9kbWFzbmQudHJhY2tfc2VsZWN0ID0gMHgwOyAvKiBwbGF5IDEgdHJhY2ssIHRyYWNrIDEgKi8KKwl0dF9kbWFzbmQuY2Jhcl9zcmMgPSAweDAwMDE7IC8qIERNQSgyNU1IeikgLS0+IERBQyAqLworCXR0X2RtYXNuZC5jYmFyX2RzdCA9IDB4MDAwMDsKKwl0dF9kbWFzbmQucmVjX3RyYWNrX3NlbGVjdCA9IDA7CisJdHRfZG1hc25kLmRhY19zcmMgPSAyOyAvKiBjb25uZWN0IG1hdHJpeCB0byBEQUMgKi8KKwl0dF9kbWFzbmQuYWRjX3NyYyA9IDA7IC8qIEFEQyBJbnB1dCA9IE1pYyAqLworCisJdHRfZG1hc25kLm1vZGUgPSAoZG1hc291bmQuaGFyZC5zdGVyZW8gPworCQkJICBETUFTTkRfTU9ERV9TVEVSRU8gOiBETUFTTkRfTU9ERV9NT05PKSB8CisJCSgoZG1hc291bmQuaGFyZC5zaXplID09IDgpID8KKwkJIERNQVNORF9NT0RFXzhCSVQgOiBETUFTTkRfTU9ERV8xNkJJVCkgfAorCQlETUFTTkRfTU9ERV82S0haOworCisJZXhwYW5kX2JhbCA9IC1kbWFzb3VuZC5zb2Z0LnNwZWVkOworfQorCisKK3N0YXRpYyBpbnQgRmFsY29uU2V0Rm9ybWF0KGludCBmb3JtYXQpCit7CisJaW50IHNpemU7CisJLyogRmFsY29uIHNvdW5kIERNQSBzdXBwb3J0cyA4Yml0IGFuZCAxNmJpdCBtb2RlcyAqLworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIEFGTVRfUVVFUlk6CisJCXJldHVybiBkbWFzb3VuZC5zb2Z0LmZvcm1hdDsKKwljYXNlIEFGTVRfTVVfTEFXOgorCWNhc2UgQUZNVF9BX0xBVzoKKwljYXNlIEFGTVRfVTg6CisJY2FzZSBBRk1UX1M4OgorCQlzaXplID0gODsKKwkJYnJlYWs7CisJY2FzZSBBRk1UX1MxNl9CRToKKwljYXNlIEFGTVRfVTE2X0JFOgorCWNhc2UgQUZNVF9TMTZfTEU6CisJY2FzZSBBRk1UX1UxNl9MRToKKwkJc2l6ZSA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OiAvKiA6LSkgKi8KKwkJc2l6ZSA9IDg7CisJCWZvcm1hdCA9IEFGTVRfUzg7CisJfQorCisJZG1hc291bmQuc29mdC5mb3JtYXQgPSBmb3JtYXQ7CisJZG1hc291bmQuc29mdC5zaXplID0gc2l6ZTsKKwlpZiAoZG1hc291bmQubWluRGV2ID09IFNORF9ERVZfRFNQKSB7CisJCWRtYXNvdW5kLmRzcC5mb3JtYXQgPSBmb3JtYXQ7CisJCWRtYXNvdW5kLmRzcC5zaXplID0gZG1hc291bmQuc29mdC5zaXplOworCX0KKworCUZhbGNvbkluaXQoKTsKKworCXJldHVybiBmb3JtYXQ7Cit9CisKKworLyogVGhpcyBpcyBmb3IgdGhlIEZhbGNvbiBvdXRwdXQgKmF0dGVudWF0aW9uKiBpbiAxLjVkQiBzdGVwcywKKyAqIGkuZS4gb3V0cHV0IGxldmVsIGZyb20gMCB0byAtMjIuNWRCIGluIC0xLjVkQiBzdGVwcy4KKyAqLworI2RlZmluZSBWT0xVTUVfVk9YV0FSRV9UT19BVFQodikgXAorCSgodikgPCAwID8gMTUgOiAodikgPiAxMDAgPyAwIDogMTUgLSAodikgKiAzIC8gMjApCisjZGVmaW5lIFZPTFVNRV9BVFRfVE9fVk9YV0FSRSh2KSAoMTAwIC0gKHYpICogMjAgLyAzKQorCisKK3N0YXRpYyBpbnQgRmFsY29uU2V0Vm9sdW1lKGludCB2b2x1bWUpCit7CisJZG1hc291bmQudm9sdW1lX2xlZnQgPSBWT0xVTUVfVk9YV0FSRV9UT19BVFQodm9sdW1lICYgMHhmZik7CisJZG1hc291bmQudm9sdW1lX3JpZ2h0ID0gVk9MVU1FX1ZPWFdBUkVfVE9fQVRUKCh2b2x1bWUgJiAweGZmMDApID4+IDgpOworCXR0X2RtYXNuZC5vdXRwdXRfYXR0ZW4gPSBkbWFzb3VuZC52b2x1bWVfbGVmdCA8PCA4IHwgZG1hc291bmQudm9sdW1lX3JpZ2h0IDw8IDQ7CisJcmV0dXJuIFZPTFVNRV9BVFRfVE9fVk9YV0FSRShkbWFzb3VuZC52b2x1bWVfbGVmdCkgfAorCSAgICAgICBWT0xVTUVfQVRUX1RPX1ZPWFdBUkUoZG1hc291bmQudm9sdW1lX3JpZ2h0KSA8PCA4OworfQorCisKK3N0YXRpYyB2b2lkIEF0YVBsYXlOZXh0RnJhbWUoaW50IGluZGV4KQoreworCWNoYXIgKnN0YXJ0LCAqZW5kOworCisJLyogdXNlZCBieSBBdGFQbGF5KCkgaWYgYWxsIGRvdWJ0cyB3aGV0aGVyIHRoZXJlIHJlYWxseSBpcyBzb21ldGhpbmcKKwkgKiB0byBiZSBwbGF5ZWQgYXJlIGFscmVhZHkgd2lwZWQgb3V0LgorCSAqLworCXN0YXJ0ID0gd3JpdGVfc3EuYnVmZmVyc1t3cml0ZV9zcS5mcm9udF07CisJZW5kID0gc3RhcnQrKCh3cml0ZV9zcS5jb3VudCA9PSBpbmRleCkgPyB3cml0ZV9zcS5yZWFyX3NpemUKKwkJCQkJICAgICAgIDogd3JpdGVfc3EuYmxvY2tfc2l6ZSk7CisJLyogZW5kIG1pZ2h0IG5vdCBiZSBhIGxlZ2FsIHZpcnR1YWwgYWRkcmVzcy4gKi8KKwlETUFTTkRTZXRFbmQodmlydF90b19waHlzKGVuZCAtIDEpICsgMSk7CisJRE1BU05EU2V0QmFzZSh2aXJ0X3RvX3BoeXMoc3RhcnQpKTsKKwkvKiBTaW5jZSBvbmx5IGFuIGV2ZW4gbnVtYmVyIG9mIHNhbXBsZXMgcGVyIGZyYW1lIGNhbgorCSAgIGJlIHBsYXllZCwgd2UgbWlnaHQgbG9zZSBvbmUgYnl0ZSBoZXJlLiAoVE8gRE8pICovCisJd3JpdGVfc3EuZnJvbnQgPSAod3JpdGVfc3EuZnJvbnQrMSkgJSB3cml0ZV9zcS5tYXhfY291bnQ7CisJd3JpdGVfc3EuYWN0aXZlKys7CisJdHRfZG1hc25kLmN0cmwgPSBETUFTTkRfQ1RSTF9PTiB8IERNQVNORF9DVFJMX1JFUEVBVDsKK30KKworCitzdGF0aWMgdm9pZCBBdGFQbGF5KHZvaWQpCit7CisJLyogKytUZVNjaGU6IE5vdGUgdGhhdCB3cml0ZV9zcS5hY3RpdmUgaXMgbm8gbG9uZ2VyIGp1c3QgYSBmbGFnIGJ1dAorCSAqIGhvbGRzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRoZSBETUEgaXMgY3VycmVudGx5IHByb2dyYW1tZWQgZm9yCisJICogaW5zdGVhZCwgbWF5IGJlIDAsIDEgKGN1cnJlbnRseSBiZWluZyBwbGF5ZWQpIG9yIDIgKHByZS1wcm9ncmFtbWVkKS4KKwkgKgorCSAqIENoYW5nZXMgZG9uZSB0byB3cml0ZV9zcS5jb3VudCBhbmQgd3JpdGVfc3EuYWN0aXZlIGFyZSBhIGJpdCBtb3JlCisJICogc3VidGxlIGFnYWluIHNvIG5vdyBJIG11c3QgYWRtaXQgSSBhbHNvIHByZWZlciBkaXNhYmxpbmcgdGhlIGlycQorCSAqIGhlcmUgcmF0aGVyIHRoYW4gY29uc2lkZXJpbmcgYWxsIHBvc3NpYmxlIHNpdHVhdGlvbnMuIEJ1dCB0aGUgcG9pbnQKKwkgKiBpcyB0aGF0IGRpc2FibGluZyB0aGUgaXJxIGRvZXNuJ3QgaGF2ZSBhbnkgYmFkIGluZmx1ZW5jZSBvbiB0aGlzCisJICogdmVyc2lvbiBvZiB0aGUgZHJpdmVyIGFzIHdlIGJlbmVmaXQgZnJvbSBoYXZpbmcgcHJlLXByb2dyYW1tZWQgdGhlCisJICogRE1BIHdoZXJldmVyIHBvc3NpYmxlOiBUaGVyZSdzIG5vIG5lZWQgdG8gcmVsb2FkIHRoZSBETUEgYXQgdGhlCisJICogZXhhY3QgdGltZSBvZiBhbiBpbnRlcnJ1cHQgYnV0IG9ubHkgYXQgc29tZSB0aW1lIHdoaWxlIHRoZQorCSAqIHByZS1wcm9ncmFtbWVkIGZyYW1lIGlzIHBsYXlpbmchCisJICovCisJYXRhcmlfZGlzYWJsZV9pcnEoSVJRX01GUF9USU1BKTsKKworCWlmICh3cml0ZV9zcS5hY3RpdmUgPT0gMiB8fAkvKiBETUEgaXMgJ2Z1bGwnICovCisJICAgIHdyaXRlX3NxLmNvdW50IDw9IDApIHsJLyogbm90aGluZyB0byBkbyAqLworCQlhdGFyaV9lbmFibGVfaXJxKElSUV9NRlBfVElNQSk7CisJCXJldHVybjsKKwl9CisKKwlpZiAod3JpdGVfc3EuYWN0aXZlID09IDApIHsKKwkJLyogbG9va3MgbGlrZSB0aGVyZSdzIG5vdGhpbmcgJ2luJyB0aGUgRE1BIHlldCwgc28gdHJ5CisJCSAqIHRvIHB1dCB0d28gZnJhbWVzIGludG8gaXQgKGF0IGxlYXN0IG9uZSBpcyBhdmFpbGFibGUpLgorCQkgKi8KKwkJaWYgKHdyaXRlX3NxLmNvdW50ID09IDEgJiYKKwkJICAgIHdyaXRlX3NxLnJlYXJfc2l6ZSA8IHdyaXRlX3NxLmJsb2NrX3NpemUgJiYKKwkJICAgICF3cml0ZV9zcS5zeW5jaW5nKSB7CisJCQkvKiBobW1tLCB0aGUgb25seSBleGlzdGluZyBmcmFtZSBpcyBub3QKKwkJCSAqIHlldCBmaWxsZWQgYW5kIHdlJ3JlIG5vdCBzeW5jaW5nPworCQkJICovCisJCQlhdGFyaV9lbmFibGVfaXJxKElSUV9NRlBfVElNQSk7CisJCQlyZXR1cm47CisJCX0KKwkJQXRhUGxheU5leHRGcmFtZSgxKTsKKwkJaWYgKHdyaXRlX3NxLmNvdW50ID09IDEpIHsKKwkJCS8qIG5vIG1vcmUgZnJhbWVzICovCisJCQlhdGFyaV9lbmFibGVfaXJxKElSUV9NRlBfVElNQSk7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKHdyaXRlX3NxLmNvdW50ID09IDIgJiYKKwkJICAgIHdyaXRlX3NxLnJlYXJfc2l6ZSA8IHdyaXRlX3NxLmJsb2NrX3NpemUgJiYKKwkJICAgICF3cml0ZV9zcS5zeW5jaW5nKSB7CisJCQkvKiBobW1tLCB0aGVyZSB3ZXJlIHR3byBmcmFtZXMsIGJ1dCB0aGUgc2Vjb25kCisJCQkgKiBvbmUgaXMgbm90IHlldCBmaWxsZWQgYW5kIHdlJ3JlIG5vdCBzeW5jaW5nPworCQkJICovCisJCQlhdGFyaV9lbmFibGVfaXJxKElSUV9NRlBfVElNQSk7CisJCQlyZXR1cm47CisJCX0KKwkJQXRhUGxheU5leHRGcmFtZSgyKTsKKwl9IGVsc2UgeworCQkvKiB0aGVyZSdzIGFscmVhZHkgYSBmcmFtZSBiZWluZyBwbGF5ZWQgc28gd2UgbWF5IG9ubHkgc3R1ZmYKKwkJICogb25lIG5ldyBpbnRvIHRoZSBETUEsIGJ1dCBldmVuIGlmIHRoaXMgbWF5IGJlIHRoZSBsYXN0CisJCSAqIGZyYW1lIGV4aXN0aW5nIHRoZSBwcmV2aW91cyBvbmUgaXMgc3RpbGwgb24gd3JpdGVfc3EuY291bnQuCisJCSAqLworCQlpZiAod3JpdGVfc3EuY291bnQgPT0gMiAmJgorCQkgICAgd3JpdGVfc3EucmVhcl9zaXplIDwgd3JpdGVfc3EuYmxvY2tfc2l6ZSAmJgorCQkgICAgIXdyaXRlX3NxLnN5bmNpbmcpIHsKKwkJCS8qIGhtbW0sIHRoZSBvbmx5IGV4aXN0aW5nIGZyYW1lIGlzIG5vdAorCQkJICogeWV0IGZpbGxlZCBhbmQgd2UncmUgbm90IHN5bmNpbmc/CisJCQkgKi8KKwkJCWF0YXJpX2VuYWJsZV9pcnEoSVJRX01GUF9USU1BKTsKKwkJCXJldHVybjsKKwkJfQorCQlBdGFQbGF5TmV4dEZyYW1lKDIpOworCX0KKwlhdGFyaV9lbmFibGVfaXJxKElSUV9NRlBfVElNQSk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90IEF0YUludGVycnVwdChpbnQgaXJxLCB2b2lkICpkdW1teSwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworI2lmIDAKKwkvKiArK1RlU2NoZTogaWYgeW91IHNob3VsZCB3YW50IHRvIHRlc3QgdGhpcy4uLiAqLworCXN0YXRpYyBpbnQgY250OworCWlmICh3cml0ZV9zcS5hY3RpdmUgPT0gMikKKwkJaWYgKCsrY250ID09IDEwKSB7CisJCQkvKiBzaW11bGF0ZSBsb3NpbmcgYW4gaW50ZXJydXB0ICovCisJCQljbnQgPSAwOworCQkJcmV0dXJuIElSUV9IQU5ETEVEOworCQl9CisjZW5kaWYKKwlzcGluX2xvY2soJmRtYXNvdW5kLmxvY2spOworCWlmICh3cml0ZV9zcV9pZ25vcmVfaW50ICYmIGlzX2ZhbGNvbikgeworCQkvKiArK1RlU2NoZTogRmFsY29uIG9ubHk6IGlnbm9yZSBmaXJzdCBpcnEgYmVjYXVzZSBpdCBjb21lcworCQkgKiBpbW1lZGlhdGVseSBhZnRlciBzdGFydGluZyBhIGZyYW1lLiBhZnRlciB0aGF0LCBpcnFzIGNvbWUKKwkJICogKGFsbW9zdCkgbGlrZSBvbiB0aGUgVFQuCisJCSAqLworCQl3cml0ZV9zcV9pZ25vcmVfaW50ID0gMDsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCWlmICghd3JpdGVfc3EuYWN0aXZlKSB7CisJCS8qIHBsYXlpbmcgd2FzIGludGVycnVwdGVkIGFuZCBzcV9yZXNldCgpIGhhcyBhbHJlYWR5IGNsZWFyZWQKKwkJICogdGhlIHNxIHZhcmlhYmxlcywgc28gYmV0dGVyIGRvbid0IGRvIGFueXRoaW5nIGhlcmUuCisJCSAqLworCQlXQUtFX1VQKHdyaXRlX3NxLnN5bmNfcXVldWUpOworCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJfQorCisJLyogUHJvYmFibHkgOykgb25lIGZyYW1lIGlzIGZpbmlzaGVkLiBXZWxsLCBpbiBmYWN0IGl0IG1heSBiZSB0aGF0IGEKKwkgKiBwcmUtcHJvZ3JhbW1lZCBvbmUgaXMgYWxzbyBmaW5pc2hlZCBiZWNhdXNlIHRoZXJlIGhhcyBiZWVuIGEgbG9uZworCSAqIGRlbGF5IGluIGludGVycnVwdCBkZWxpdmVyeSBhbmQgd2UndmUgY29tcGxldGVseSBsb3N0IG9uZSwgYnV0CisJICogdGhlcmUncyBubyB3YXkgdG8gZGV0ZWN0IHN1Y2ggYSBzaXR1YXRpb24uIEluIHN1Y2ggYSBjYXNlIHRoZSBsYXN0CisJICogZnJhbWUgd2lsbCBiZSBwbGF5ZWQgbW9yZSB0aGFuIG9uY2UgYW5kIHRoZSBzaXR1YXRpb24gd2lsbCByZWNvdmVyCisJICogYXMgc29vbiBhcyB0aGUgaXJxIGdldHMgdGhyb3VnaC4KKwkgKi8KKwl3cml0ZV9zcS5jb3VudC0tOworCXdyaXRlX3NxLmFjdGl2ZS0tOworCisJaWYgKCF3cml0ZV9zcS5hY3RpdmUpIHsKKwkJdHRfZG1hc25kLmN0cmwgPSBETUFTTkRfQ1RSTF9PRkY7CisJCXdyaXRlX3NxX2lnbm9yZV9pbnQgPSAxOworCX0KKworCVdBS0VfVVAod3JpdGVfc3EuYWN0aW9uX3F1ZXVlKTsKKwkvKiBBdCBsZWFzdCBvbmUgYmxvY2sgb2YgdGhlIHF1ZXVlIGlzIGZyZWUgbm93CisJICAgc28gd2FrZSB1cCBhIHdyaXRpbmcgcHJvY2VzcyBibG9ja2VkIGJlY2F1c2UKKwkgICBvZiBhIGZ1bGwgcXVldWUuICovCisKKwlpZiAoKHdyaXRlX3NxLmFjdGl2ZSAhPSAxKSB8fCAod3JpdGVfc3EuY291bnQgIT0gMSkpCisJCS8qIFdlIG11c3QgYmUgYSBiaXQgY2FyZWZ1bGx5IGhlcmU6IHdyaXRlX3NxLmNvdW50IGluZGljYXRlcyB0aGUKKwkJICogbnVtYmVyIG9mIGJ1ZmZlcnMgdXNlZCBhbmQgbm90IHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlCisJCSAqIHBsYXllZC4gSWYgd3JpdGVfc3EuY291bnQ9PTEgYW5kIHdyaXRlX3NxLmFjdGl2ZT09MSB0aGF0CisJCSAqIG1lYW5zIHRoZSBvbmx5IHJlbWFpbmluZyBmcmFtZSB3YXMgYWxyZWFkeSBwcm9ncmFtbWVkCisJCSAqIGVhcmxpZXIgKGFuZCBpcyBjdXJyZW50bHkgcnVubmluZykgc28gd2UgbXVzdG4ndCBjYWxsCisJCSAqIEF0YVBsYXkoKSBoZXJlLCBvdGhlcndpc2Ugd2UnbGwgcGxheSBvbmUgZnJhbWUgdG9vIG11Y2guCisJCSAqLworCQlBdGFQbGF5KCk7CisKKwlpZiAoIXdyaXRlX3NxLmFjdGl2ZSkgV0FLRV9VUCh3cml0ZV9zcS5zeW5jX3F1ZXVlKTsKKwkvKiBXZSBhcmUgbm90IHBsYXlpbmcgYWZ0ZXIgQXRhUGxheSgpLCBzbyB0aGVyZQorCSAgIGlzIG5vdGhpbmcgdG8gcGxheSBhbnkgbW9yZS4gV2FrZSB1cCBhIHByb2Nlc3MKKwkgICB3YWl0aW5nIGZvciBhdWRpbyBvdXRwdXQgdG8gZHJhaW4uICovCisJc3Bpbl91bmxvY2soJmRtYXNvdW5kLmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioqIE1pZCBsZXZlbCBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqIC9kZXYvbWl4ZXIgYWJzdHJhY3Rpb24KKyAqLworCisjZGVmaW5lIFJFQ0xFVkVMX1ZPWFdBUkVfVE9fR0FJTih2KQlcCisJKCh2KSA8IDAgPyAwIDogKHYpID4gMTAwID8gMTUgOiAodikgKiAzIC8gMjApCisjZGVmaW5lIFJFQ0xFVkVMX0dBSU5fVE9fVk9YV0FSRSh2KQkoKCh2KSAqIDIwICsgMikgLyAzKQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBUVE1peGVySW5pdCh2b2lkKQoreworCWF0YXJpX21pY3Jvd2lyZV9jbWQoTVdfTE0xOTkyX1ZPTFVNRSgwKSk7CisJZG1hc291bmQudm9sdW1lX2xlZnQgPSAwOworCWF0YXJpX21pY3Jvd2lyZV9jbWQoTVdfTE0xOTkyX0JBTExFRlQoMCkpOworCWRtYXNvdW5kLnZvbHVtZV9yaWdodCA9IDA7CisJYXRhcmlfbWljcm93aXJlX2NtZChNV19MTTE5OTJfQkFMUklHSFQoMCkpOworCWF0YXJpX21pY3Jvd2lyZV9jbWQoTVdfTE0xOTkyX1RSRUJMRSgwKSk7CisJYXRhcmlfbWljcm93aXJlX2NtZChNV19MTTE5OTJfQkFTUygwKSk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCBGYWxjb25NaXhlckluaXQodm9pZCkKK3sKKwlkbWFzb3VuZC52b2x1bWVfbGVmdCA9ICh0dF9kbWFzbmQub3V0cHV0X2F0dGVuICYgMHhmMDApID4+IDg7CisJZG1hc291bmQudm9sdW1lX3JpZ2h0ID0gKHR0X2RtYXNuZC5vdXRwdXRfYXR0ZW4gJiAweGYwKSA+PiA0OworfQorCitzdGF0aWMgaW50IEF0YU1peGVySW9jdGwodV9pbnQgY21kLCB1X2xvbmcgYXJnKQoreworCWludCBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3dpdGNoIChjbWQpIHsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NQRUFLRVI6CisJCSAgICBpZiAoaXNfZmFsY29uIHx8IE1BQ0hfSVNfVFQpIHsKKwkJCSAgICBpbnQgcG9ydGE7CisJCQkgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKwkJCSAgICBzb3VuZF95bS5yZF9kYXRhX3JlZ19zZWwgPSAxNDsKKwkJCSAgICBwb3J0YSA9IHNvdW5kX3ltLnJkX2RhdGFfcmVnX3NlbDsKKwkJCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJCQkgICAgcmV0dXJuIElPQ1RMX09VVChhcmcsIHBvcnRhICYgMHg0MCA/IDAgOiAxMDApOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgorCQkgICAgSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJICAgIHJldHVybiBJT0NUTF9PVVQoYXJnLCBkbWFzb3VuZF9zZXRfdm9sdW1lKGRhdGEpKTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9XUklURV9TUEVBS0VSOgorCQkgICAgaWYgKGlzX2ZhbGNvbiB8fCBNQUNIX0lTX1RUKSB7CisJCQkgICAgaW50IHBvcnRhOworCQkJICAgIElPQ1RMX0lOKGFyZywgZGF0YSk7CisJCQkgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKwkJCSAgICBzb3VuZF95bS5yZF9kYXRhX3JlZ19zZWwgPSAxNDsKKwkJCSAgICBwb3J0YSA9IChzb3VuZF95bS5yZF9kYXRhX3JlZ19zZWwgJiB+MHg0MCkgfAorCQkJCSAgICAoZGF0YSA8IDUwID8gMHg0MCA6IDApOworCQkJICAgIHNvdW5kX3ltLndkX2RhdGEgPSBwb3J0YTsKKwkJCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJCQkgICAgcmV0dXJuIElPQ1RMX09VVChhcmcsIHBvcnRhICYgMHg0MCA/IDAgOiAxMDApOworCQkgICAgfQorCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworCitzdGF0aWMgaW50IFRUTWl4ZXJJb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisJaW50IGRhdGE7CisJc3dpdGNoIChjbWQpIHsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLCAwKTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX0RFVk1BU0s6CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLAorCQkJCSBTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfVFJFQkxFIHwgU09VTkRfTUFTS19CQVNTIHwKKwkJCQkgKE1BQ0hfSVNfVFQgPyBTT1VORF9NQVNLX1NQRUFLRVIgOiAwKSk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9TVEVSRU9ERVZTOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgU09VTkRfTUFTS19WT0xVTUUpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfVk9MVU1FOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywKKwkJCQkgVk9MVU1FX0RCX1RPX1ZPWFdBUkUoZG1hc291bmQudm9sdW1lX2xlZnQpIHwKKwkJCQkgKFZPTFVNRV9EQl9UT19WT1hXQVJFKGRtYXNvdW5kLnZvbHVtZV9yaWdodCkgPDwgOCkpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfQkFTUzoKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIFRPTkVfREJfVE9fVk9YV0FSRShkbWFzb3VuZC5iYXNzKSk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9UUkVCTEU6CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBUT05FX0RCX1RPX1ZPWFdBUkUoZG1hc291bmQudHJlYmxlKSk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9PR0FJTjoKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIEdBSU5fREJfVE9fVk9YV0FSRShkbWFzb3VuZC5nYWluKSk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfV1JJVEVfQkFTUzoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIGRtYXNvdW5kX3NldF9iYXNzKGRhdGEpKTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9XUklURV9UUkVCTEU6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBkbWFzb3VuZF9zZXRfdHJlYmxlKGRhdGEpKTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9XUklURV9PR0FJTjoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIGRtYXNvdW5kX3NldF9nYWluKGRhdGEpKTsKKwl9CisJcmV0dXJuIEF0YU1peGVySW9jdGwoY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IEZhbGNvbk1peGVySW9jdGwodV9pbnQgY21kLCB1X2xvbmcgYXJnKQoreworCWludCBkYXRhOworCXN3aXRjaCAoY21kKSB7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNNQVNLOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgU09VTkRfTUFTS19NSUMpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSzoKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX1NQRUFLRVIpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUzoKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19NSUMpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfVk9MVU1FOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywKKwkJCVZPTFVNRV9BVFRfVE9fVk9YV0FSRShkbWFzb3VuZC52b2x1bWVfbGVmdCkgfAorCQkJVk9MVU1FX0FUVF9UT19WT1hXQVJFKGRtYXNvdW5kLnZvbHVtZV9yaWdodCkgPDwgOCk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9DQVBTOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgU09VTkRfQ0FQX0VYQ0xfSU5QVVQpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1dSSVRFX01JQzoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJdHRfZG1hc25kLmlucHV0X2dhaW4gPQorCQkJUkVDTEVWRUxfVk9YV0FSRV9UT19HQUlOKGRhdGEgJiAweGZmKSA8PCA0IHwKKwkJCVJFQ0xFVkVMX1ZPWFdBUkVfVE9fR0FJTihkYXRhID4+IDggJiAweGZmKTsKKwkJLyogZmFsbCB0aHJ1LCByZXR1cm4gc2V0IHZhbHVlICovCisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9NSUM6CisJCXJldHVybiBJT0NUTF9PVVQoYXJnLAorCQkJUkVDTEVWRUxfR0FJTl9UT19WT1hXQVJFKHR0X2RtYXNuZC5pbnB1dF9nYWluID4+IDQgJiAweGYpIHwKKwkJCVJFQ0xFVkVMX0dBSU5fVE9fVk9YV0FSRSh0dF9kbWFzbmQuaW5wdXRfZ2FpbiAmIDB4ZikgPDwgOCk7CisJfQorCXJldHVybiBBdGFNaXhlcklvY3RsKGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBBdGFXcml0ZVNxU2V0dXAodm9pZCkKK3sKKwl3cml0ZV9zcV9pZ25vcmVfaW50ID0gMDsKKwlyZXR1cm4gMCA7Cit9CisKK3N0YXRpYyBpbnQgQXRhU3FPcGVuKG1vZGVfdCBtb2RlKQoreworCXdyaXRlX3NxX2lnbm9yZV9pbnQgPSAxOworCXJldHVybiAwIDsKK30KKworc3RhdGljIGludCBUVFN0YXRlSW5mbyhjaGFyICpidWZmZXIsIHNpemVfdCBzcGFjZSkKK3sKKwlpbnQgbGVuID0gMDsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXHR2b2wgbGVmdCAgJWRkQiBbLTQwLi4uICAwXVxuIiwKKwkJICAgICAgIGRtYXNvdW5kLnZvbHVtZV9sZWZ0KTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXHR2b2wgcmlnaHQgJWRkQiBbLTQwLi4uICAwXVxuIiwKKwkJICAgICAgIGRtYXNvdW5kLnZvbHVtZV9yaWdodCk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIlx0YmFzcyAgICAgICVkZEIgWy0xMi4uLisxMl1cbiIsCisJCSAgICAgICBkbWFzb3VuZC5iYXNzKTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXHR0cmVibGUgICAgJWRkQiBbLTEyLi4uKzEyXVxuIiwKKwkJICAgICAgIGRtYXNvdW5kLnRyZWJsZSk7CisJaWYgKGxlbiA+PSBzcGFjZSkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kX2F0YXJpOiBvdmVyZmxvd2VkIHN0YXRlIGJ1ZmZlciBhbGxvYy5cbiIpIDsKKwkJbGVuID0gc3BhY2UgOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IEZhbGNvblN0YXRlSW5mbyhjaGFyICpidWZmZXIsIHNpemVfdCBzcGFjZSkKK3sKKwlpbnQgbGVuID0gMDsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXHR2b2wgbGVmdCAgJWRkQiBbLTIyLjUgLi4uIDBdXG4iLAorCQkgICAgICAgZG1hc291bmQudm9sdW1lX2xlZnQpOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICJcdHZvbCByaWdodCAlZGRCIFstMjIuNSAuLi4gMF1cbiIsCisJCSAgICAgICBkbWFzb3VuZC52b2x1bWVfcmlnaHQpOworCWlmIChsZW4gPj0gc3BhY2UpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZF9hdGFyaTogb3ZlcmZsb3dlZCBzdGF0ZSBidWZmZXIgYWxsb2MuXG4iKSA7CisJCWxlbiA9IHNwYWNlIDsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworCisvKioqIE1hY2hpbmUgZGVmaW5pdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBTRVRUSU5HUyBkZWZfaGFyZF9mYWxjb24gPSB7CisJLmZvcm1hdAkJPSBBRk1UX1M4LAorCS5zdGVyZW8JCT0gMCwKKwkuc2l6ZQkJPSA4LAorCS5zcGVlZAkJPSA4MTk1Cit9IDsKKworc3RhdGljIFNFVFRJTkdTIGRlZl9oYXJkX3R0ID0geworCS5mb3JtYXQJPSBBRk1UX1M4LAorCS5zdGVyZW8JPSAwLAorCS5zaXplCT0gOCwKKwkuc3BlZWQJPSAxMjUxNworfSA7CisKK3N0YXRpYyBTRVRUSU5HUyBkZWZfc29mdCA9IHsKKwkuZm9ybWF0CT0gQUZNVF9VOCwKKwkuc3RlcmVvCT0gMCwKKwkuc2l6ZQk9IDgsCisJLnNwZWVkCT0gODAwMAorfSA7CisKK3N0YXRpYyBNQUNISU5FIG1hY2hUVCA9IHsKKwkubmFtZQkJPSAiQXRhcmkiLAorCS5uYW1lMgkJPSAiVFQiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZG1hX2FsbG9jCT0gQXRhQWxsb2MsCisJLmRtYV9mcmVlCT0gQXRhRnJlZSwKKwkuaXJxaW5pdAk9IEF0YUlycUluaXQsCisjaWZkZWYgTU9EVUxFCisJLmlycWNsZWFudXAJPSBBdGFJcnFDbGVhblVwLAorI2VuZGlmIC8qIE1PRFVMRSAqLworCS5pbml0CQk9IFRUSW5pdCwKKwkuc2lsZW5jZQk9IFRUU2lsZW5jZSwKKwkuc2V0Rm9ybWF0CT0gVFRTZXRGb3JtYXQsCisJLnNldFZvbHVtZQk9IFRUU2V0Vm9sdW1lLAorCS5zZXRCYXNzCT0gQXRhU2V0QmFzcywKKwkuc2V0VHJlYmxlCT0gQXRhU2V0VHJlYmxlLAorCS5zZXRHYWluCT0gVFRTZXRHYWluLAorCS5wbGF5CQk9IEF0YVBsYXksCisJLm1peGVyX2luaXQJPSBUVE1peGVySW5pdCwKKwkubWl4ZXJfaW9jdGwJPSBUVE1peGVySW9jdGwsCisJLndyaXRlX3NxX3NldHVwCT0gQXRhV3JpdGVTcVNldHVwLAorCS5zcV9vcGVuCT0gQXRhU3FPcGVuLAorCS5zdGF0ZV9pbmZvCT0gVFRTdGF0ZUluZm8sCisJLm1pbl9kc3Bfc3BlZWQJPSA2MjU4LAorCS52ZXJzaW9uCT0gKChETUFTT1VORF9BVEFSSV9SRVZJU0lPTjw8OCkgfCBETUFTT1VORF9BVEFSSV9FRElUSU9OKSwKKwkuaGFyZHdhcmVfYWZtdHMJPSBBRk1UX1M4LCAgLyogaCd3YXJlLXN1cHBvcnRlZCBmb3JtYXRzICpvbmx5KiBoZXJlICovCisJLmNhcGFiaWxpdGllcwk9ICBEU1BfQ0FQX0JBVENICS8qIEFzIHBlciBTTkRDVExfRFNQX0dFVENBUFMgKi8KK307CisKK3N0YXRpYyBNQUNISU5FIG1hY2hGYWxjb24gPSB7CisJLm5hbWUJCT0gIkF0YXJpIiwKKwkubmFtZTIJCT0gIkZBTENPTiIsCisJLmRtYV9hbGxvYwk9IEF0YUFsbG9jLAorCS5kbWFfZnJlZQk9IEF0YUZyZWUsCisJLmlycWluaXQJPSBBdGFJcnFJbml0LAorI2lmZGVmIE1PRFVMRQorCS5pcnFjbGVhbnVwCT0gQXRhSXJxQ2xlYW5VcCwKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwkuaW5pdAkJPSBGYWxjb25Jbml0LAorCS5zaWxlbmNlCT0gRmFsY29uU2lsZW5jZSwKKwkuc2V0Rm9ybWF0CT0gRmFsY29uU2V0Rm9ybWF0LAorCS5zZXRWb2x1bWUJPSBGYWxjb25TZXRWb2x1bWUsCisJLnNldEJhc3MJPSBBdGFTZXRCYXNzLAorCS5zZXRUcmVibGUJPSBBdGFTZXRUcmVibGUsCisJLnBsYXkJCT0gQXRhUGxheSwKKwkubWl4ZXJfaW5pdAk9IEZhbGNvbk1peGVySW5pdCwKKwkubWl4ZXJfaW9jdGwJPSBGYWxjb25NaXhlcklvY3RsLAorCS53cml0ZV9zcV9zZXR1cAk9IEF0YVdyaXRlU3FTZXR1cCwKKwkuc3Ffb3Blbgk9IEF0YVNxT3BlbiwKKwkuc3RhdGVfaW5mbwk9IEZhbGNvblN0YXRlSW5mbywKKwkubWluX2RzcF9zcGVlZAk9IDgxOTUsCisJLnZlcnNpb24JPSAoKERNQVNPVU5EX0FUQVJJX1JFVklTSU9OPDw4KSB8IERNQVNPVU5EX0FUQVJJX0VESVRJT04pLAorCS5oYXJkd2FyZV9hZm10cwk9IChBRk1UX1M4IHwgQUZNVF9TMTZfQkUpLCAvKiBoJ3dhcmUtc3VwcG9ydGVkIGZvcm1hdHMgKm9ubHkqIGhlcmUgKi8KKwkuY2FwYWJpbGl0aWVzCT0gIERTUF9DQVBfQkFUQ0gJLyogQXMgcGVyIFNORENUTF9EU1BfR0VUQ0FQUyAqLworfTsKKworCisvKioqIENvbmZpZyAmIFNldHVwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworc3RhdGljIGludCBfX2luaXQgZG1hc291bmRfYXRhcmlfaW5pdCh2b2lkKQoreworCWlmIChNQUNIX0lTX0FUQVJJICYmIEFUQVJJSFdfUFJFU0VOVChQQ01fOEJJVCkpIHsKKwkgICAgaWYgKEFUQVJJSFdfUFJFU0VOVChDT0RFQykpIHsKKwkJZG1hc291bmQubWFjaCA9IG1hY2hGYWxjb247CisJCWRtYXNvdW5kLm1hY2guZGVmYXVsdF9zb2Z0ID0gZGVmX3NvZnQgOworCQlkbWFzb3VuZC5tYWNoLmRlZmF1bHRfaGFyZCA9IGRlZl9oYXJkX2ZhbGNvbiA7CisJCWlzX2ZhbGNvbiA9IDE7CisJICAgIH0gZWxzZSBpZiAoQVRBUklIV19QUkVTRU5UKE1JQ1JPV0lSRSkpIHsKKwkJZG1hc291bmQubWFjaCA9IG1hY2hUVDsKKwkJZG1hc291bmQubWFjaC5kZWZhdWx0X3NvZnQgPSBkZWZfc29mdCA7CisJCWRtYXNvdW5kLm1hY2guZGVmYXVsdF9oYXJkID0gZGVmX2hhcmRfdHQgOworCQlpc19mYWxjb24gPSAwOworCSAgICB9IGVsc2UKKwkJcmV0dXJuIC1FTk9ERVY7CisJICAgIGlmICgobWZwLmludF9lbl9hICYgbWZwLmludF9ta19hICYgMHgyMCkgPT0gMCkKKwkJcmV0dXJuIGRtYXNvdW5kX2luaXQoKTsKKwkgICAgZWxzZSB7CisJCXByaW50aygiRE1BIHNvdW5kIGRyaXZlcjogVGltZXIgQSBpbnRlcnJ1cHQgYWxyZWFkeSBpbiB1c2VcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCSAgICB9CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZG1hc291bmRfYXRhcmlfY2xlYW51cCh2b2lkKQoreworCWRtYXNvdW5kX2RlaW5pdCgpOworfQorCittb2R1bGVfaW5pdChkbWFzb3VuZF9hdGFyaV9pbml0KTsKK21vZHVsZV9leGl0KGRtYXNvdW5kX2F0YXJpX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F3YWNzLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfYXdhY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjgxYjg4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2F3YWNzLmMKQEAgLTAsMCArMSwzMTc2IEBACisvKgorICogIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9hd2Fjcy5jCisgKgorICogIFBvd2VyTWFjIGBBV0FDUycgYW5kIGBCdXJndW5keScgRE1BIFNvdW5kIERyaXZlcgorICogIHdpdGggc29tZSBsaW1pdGVkIHN1cHBvcnQgZm9yIERBQ0EgJiBUdW1ibGVyCisgKgorICogIFNlZSBsaW51eC9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfY29yZS5jIGZvciBjb3B5cmlnaHQgYW5kCisgKiAgaGlzdG9yeSBwcmlvciB0byAyMDAxLzAxLzI2LgorICoKKyAqCTI2LzAxLzIwMDEgZWQgMC4xIElhaW4gU2FuZG9lCisgKgkJLSBhZGRlZCB2ZXJzaW9uIGluZm8uCisgKgkJLSBtb3ZlZCBkYmRtYSBjb21tYW5kIGJ1ZmZlciBhbGxvY2F0aW9uIHRvIFBNYWNYWFhTcVNldHVwKCkKKyAqCQktIGZpeGVkIHVwIGJlZXAgZGJkbWEgY21kIGJ1ZmZlcnMKKyAqCisgKgkwOC8wMi8yMDAxIFswLjJdCisgKgkJLSBtYWtlIFNORENUTF9EU1BfR0VURk1UUyByZXR1cm4gdGhlIGNvcnJlY3QgaW5mbyBmb3IgdGhlIGgvdworICoJCS0gbW92ZSBzb2Z0IGZvcm1hdCB0cmFuc2xhdGlvbnMgdG8gYSBzZXBhcmF0ZSBmaWxlCisgKgkJLSBbMC4zXSBtYWtlIFNORENUTF9EU1BfR0VUQ0FQUyByZXR1cm4gY29ycmVjdCBpbmZvLgorICoJCS0gWzAuNF0gbW9yZSBpbmZvcm1hdGl2ZSBtYWNoaW5lIG5hbWUgc3RyaW5ncy4KKyAqCQktIFswLjVdCisgKgkJLSByZWNvcmQgY2hhbmdlcy4KKyAqCQktIG1hZGUgdGhlIGRlZmF1bHRfaGFyZC9zb2Z0IGVudHJpZXMuCisgKgkwNC8wNC8yMDAxIFswLjZdCisgKgkJLSBtaW5vciBjb3JyZWN0aW9uIHRvIGJpdCBhc3NpZ25tZW50cyBpbiBhd2Fjc19kZWZzLmgKKyAqCQktIGluY29ycG9yYXRlIG1peGVyIGNoYW5nZXMgZnJvbSAyLjIueCBiYWNrLXBvcnQuCisgKgkJLSB0YWtlIG91dCBwYXNzdGhydSBhcyBhIHJlYyBpbnB1dCAoaXQgaXNuJ3QpLgorICogICAgICAgICAgICAgIC0gbWFrZSBJbnB1dCBHYWluIHNsaWRlciB3b3JrIHRoZSAncmlnaHQgd2F5IHVwJy4KKyAqICAgICAgICAgICAgICAtIHRyeSB0byBtYWtlIHRoZSBtaXhlciBzbGlkZXJzIG1vcmUgbG9naWNhbCAtIHNvIG5vdyB0aGUKKyAqICAgICAgICAgICAgICAgIGlucHV0IHNlbGVjdG9ycyBhcmUganVzdCB0d28tc3RhdGUgKD41MCUgPT0gT04pIGFuZCB0aGUKKyAqICAgICAgICAgICAgICAgIElucHV0IEdhaW4gc2xpZGVyIGhhbmRsZXMgdGhlIHJlc3Qgb2YgdGhlIGdhaW4gaXNzdWVzLgorICogICAgICAgICAgICAgIC0gdHJ5IHRvIHBpY2sgc2xpZGVyIHJlcHJlc2VudGF0aW9ucyB0aGF0IG1vc3QgY2xvc2VseSBtYXRjaAorICogICAgICAgICAgICAgICAgdGhlIGFjdHVhbCB1c2UgLSBlLmcuIElHYWluIGZvciBpbnB1dCBnYWluLi4uIAorICogICAgICAgICAgICAgIC0gZmlyc3Qgc3RhYiBhdCBvdmVyL3VuZGVyLXJ1biBkZXRlY3Rpb24uCisgKgkJLSBtaW5vciBjb3NtZXRpYyBjaGFuZ2VzIHRvIElSUSBpZGVudGlmaWNhdGlvbi4KKyAqCQktIGZpeCBidWcgd2hlcmUgcmF0ZXMgPiBtYXggd291bGQgYmUgcmVwb3J0ZWQgYXMgc3VwcG9ydGVkLgorICogICAgICAgICAgICAgIC0gZmlyc3Qgc3RhYiBhdCBvdmVyL3VuZGVyLXJ1biBkZXRlY3Rpb24uCisgKiAgICAgICAgICAgICAgLSBtYWtlIHVzZSBvZiBpMmMgZm9yIG1peGVyIHNldHRpbmdzIGNvbmRpdGlvbmFsIG9uIHBlcmNoCisgKiAgICAgICAgICAgICAgICByYXRoZXIgdGhhbiBjdWRhIChzb21lIG1hY2hpbmVzIHdpdGhvdXQgcGVyY2ggaGF2ZSBjdWRhKS4KKyAqICAgICAgICAgICAgICAtIGZpeCBidWcgd2hlcmUgVFggc3RvcHMgd2hlbiBkYmRtYSBzdGF0dXMgY29tZXMgdXAgIkRFQUQiCisgKgkJICBzbyBmYXIgb25seSByZXBvcnRlZCBvbiBQb3dlckNvbXB1dGluZyBjbG9uZXMgLi4uIGJ1dC4KKyAqCQktIHB1dCBpbiBBV0FDUy9TY3JlYW1lciByZWdpc3RlciB3cml0ZSB0aW1lb3V0cy4KKyAqCQktIHBhcnQgd2F5IHRvIHBhcnRpdGlvbmluZyB0aGUgaW5pdCgpIHN0dWZmCisgKgkJLSBmaXJzdCBwYXNzIGF0ICd0dW1ibGVyJyBzdHVmZiAobm90IHN1cHBvcnQgLSBqdXN0IGFuIGF0dGVtcHQKKyAqCQkgIHRvIGFsbG93IHRoZSBkcml2ZXIgdG8gbG9hZCBvbiBuZXcgRzRzKS4KKyAqICAgICAgMDEvMDIvMjAwMiBbMC43XSAtIEJlbkgKKyAqCSAgICAgICAgLSBhbGwgc29ydCBvZiBtaW5vciBiaXRzIHdlbnQgaW4gc2luY2UgdGhlIGxhdGVzdCB1cGRhdGUsIEkKKyAqCSAgICAgICAgICBidW1wZWQgdGhlIHZlcnNpb24gbnVtYmVyIGZvciB0aGF0IHJlYXNvbgorICoKKyAqICAgICAgMDcvMjYvMjAwMiBbMC44XSAtIEJlbkgKKyAqCSAgICAgICAgLSBNb3JlIG1pbm9yIGJpdHMgc2luY2UgbGFzdCBjaGFuZ2Vsb2cgKEkgc2hvdWxkIGJlIG1vcmUgY2FyZWZ1bAorICoJICAgICAgICAgIHdpdGggdGhvc2UpCisgKgkgICAgICAgIC0gU3VwcG9ydCBmb3Igc25hcHBlciAmIGJldHRlciB0dW1ibGVyIGludGVncmF0aW9uIGJ5IFRvYnkgU2FyZ2VhbnQKKyAqCSAgICAgICAgLSBIZWFkcGhvbmUgZGV0ZWN0IGZvciBzY3JlbWVyIGJ5IEp1bGllbiBCbGFjaGUKKyAqCSAgICAgICAgLSBNb3JlIHR1bWJsZXIgZml4ZWQgYnkgQW5kcmVhcyBTY2h3YWIKKyAqCTExLzI5LzIwMDMgWzAuOC4xXSAtIFJlbnpvIERhdm9saSAoS2luZyBFbnpvKQorICoJCS0gU3VwcG9ydCBmb3IgU25hcHBlciBsaW5lIGluCisgKgkJLSBzbmFwcGVyIGlucHV0IHJlc2FtcGxpbmcgKGZvciByYXRlcyA8IDQ0MTAwKQorICoJCS0gc29mdHdhcmUgbGluZSBnYWluIGNvbnRyb2wKKyAqLworCisvKiBHRU5FUkFMIEZJWE1FL1RPRE86IGNoZWNrIHRoYXQgdGhlIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgaXMgd3JpdHRlbiB0bworICAgbWFjLWlvIGlzIHZhbGlkIGZvciBEQUNBICYgVHVtYmxlci4KKworICAgVGhpcyBkcml2ZXIgaXMgaW4gYmFkIG5lZWQgb2YgYSByZXdyaXRlLiBUaGUgZGJkbWEgY29kZSBoYXMgdG8gYmUgc3BsaXQsCisgICBzb21lIHByb3BlciBkZXZpY2UtdHJlZSBwYXJzaW5nIGNvZGUgaGFzIHRvIGJlIHdyaXR0ZW4sIGV0Yy4uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FkYi5oPgorI2luY2x1ZGUgPGxpbnV4L252cmFtLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGludXgvdnRfa2Vybi5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lucHV0Lmg+CisjaW5jbHVkZSA8YXNtL3NlbWFwaG9yZS5oPgorI2lmZGVmIENPTkZJR19BREJfQ1VEQQorI2luY2x1ZGUgPGxpbnV4L2N1ZGEuaD4KKyNlbmRpZgorI2lmZGVmIENPTkZJR19BREJfUE1VCisjaW5jbHVkZSA8bGludXgvcG11Lmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2kyYy1kZXYuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8YXNtL3Byb20uaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kYmRtYS5oPgorI2luY2x1ZGUgPGFzbS9wbWFjX2ZlYXR1cmUuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL252cmFtLmg+CisKKyNpbmNsdWRlICJhd2Fjc19kZWZzLmgiCisjaW5jbHVkZSAiZG1hc291bmQuaCIKKyNpbmNsdWRlICJ0YXMzMDAxYy5oIgorI2luY2x1ZGUgInRhczMwMDQuaCIKKyNpbmNsdWRlICJ0YXNfY29tbW9uLmgiCisKKyNkZWZpbmUgRE1BU09VTkRfQVdBQ1NfUkVWSVNJT04JMAorI2RlZmluZSBETUFTT1VORF9BV0FDU19FRElUSU9OCTcKKworI2RlZmluZSBBV0FDU19TTkFQUEVSICAgMTEwCS8qIGZha2UgcmV2aXNpb24gIyBmb3Igc25hcHBlciAqLworI2RlZmluZSBBV0FDU19CVVJHVU5EWQkxMDAJLyogZmFrZSByZXZpc2lvbiAjIGZvciBidXJndW5keSAqLworI2RlZmluZSBBV0FDU19UVU1CTEVSICAgIDkwCS8qIGZha2UgcmV2aXNpb24gIyBmb3IgdHVtYmxlciAqLworI2RlZmluZSBBV0FDU19EQUNBCSA4MAkvKiBmYWtlIHJldmlzaW9uICMgZm9yIGRhY2EgKGlib29rKSAqLworI2RlZmluZSBBV0FDU19BV0FDUyAgICAgICAyICAgICAvKiBob2xkaW5nIHJldmlzaW9uIGZvciBBV0FDUyAqLworI2RlZmluZSBBV0FDU19TQ1JFQU1FUiAgICAzICAgICAvKiBob2xkaW5nIHJldmlzaW9uIGZvciBTY3JlYW1lciAqLworLyoKKyAqIEludGVycnVwdCBudW1iZXJzIGFuZCBhZGRyZXNzZXMsICYgaW5mbyBvYnRhaW5lZCBmcm9tIHRoZSBkZXZpY2UgdHJlZS4KKyAqLworc3RhdGljIGludCBhd2Fjc19pcnEsIGF3YWNzX3R4X2lycSwgYXdhY3NfcnhfaXJxOworc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBhd2Fjc19yZWdzIF9faW9tZW0gKmF3YWNzOworc3RhdGljIHZvbGF0aWxlIHUzMiBfX2lvbWVtICppMnM7CitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IGRiZG1hX3JlZ3MgX19pb21lbSAqYXdhY3NfdHhkbWEsICphd2Fjc19yeGRtYTsKK3N0YXRpYyBpbnQgYXdhY3NfcmF0ZV9pbmRleDsKK3N0YXRpYyBpbnQgYXdhY3Nfc3ViZnJhbWU7CitzdGF0aWMgc3RydWN0IGRldmljZV9ub2RlKiBhd2Fjc19ub2RlOworc3RhdGljIHN0cnVjdCBkZXZpY2Vfbm9kZSogaTJzX25vZGU7CisKK3N0YXRpYyBjaGFyIGF3YWNzX25hbWVbNjRdOworc3RhdGljIGludCBhd2Fjc19yZXZpc2lvbjsKK3N0YXRpYyBpbnQgYXdhY3Nfc2xlZXBpbmc7CitzdGF0aWMgREVDTEFSRV9NVVRFWChkbWFzb3VuZF9zZW0pOworCitzdGF0aWMgaW50IHNvdW5kX2RldmljZV9pZDsJCS8qIGV4aXN0cyBhZnRlciBpTWFjIHJldkEgKi8KK3N0YXRpYyBpbnQgaHdfY2FuX2J5dGVzd2FwID0gMSA7CS8qIG1vc3QgcG1hYyBzb3VuZCBoL3cgY2FuICovCisKKy8qIG1vZGVsIGluZm8gKi8KKy8qIFRvIGJlIHJlcGxhY2VkIHdpdGggYmV0dGVyIGludGVyYWN0aW9uIHdpdGggcG1hY19mZWF0dXJlLmMgKi8KK3N0YXRpYyBpbnQgaXNfcGJvb2tfM1gwMDsKK3N0YXRpYyBpbnQgaXNfcGJvb2tfZzM7CisKKy8qIGV4cGFuc2lvbiBpbmZvICovCitzdGF0aWMgaW50IGhhc19wZXJjaDsKK3N0YXRpYyBpbnQgaGFzX3ppdmE7CisKKy8qIGZvciBlYXJsaWVyIHBvd2VyYm9va3Mgd2hpY2ggbmVlZCBmaWRkbGluZyB3aXRoIG1hYy1pbyB0byBlbmFibGUKKyAqIGNkIGV0Yy4KKyovCitzdGF0aWMgdW5zaWduZWQgY2hhciBfX2lvbWVtICpsYXRjaF9iYXNlOworc3RhdGljIHVuc2lnbmVkIGNoYXIgX19pb21lbSAqbWFjaW9fYmFzZTsKKworLyoKKyAqIFNwYWNlIGZvciB0aGUgREJETUEgY29tbWFuZCBibG9ja3MuCisgKi8KK3N0YXRpYyB2b2lkICphd2Fjc190eF9jbWRfc3BhY2U7CitzdGF0aWMgdm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqYXdhY3NfdHhfY21kczsKK3N0YXRpYyBpbnQgbnVtYmVyX29mX3R4X2NtZF9idWZmZXJzOworCitzdGF0aWMgdm9pZCAqYXdhY3NfcnhfY21kX3NwYWNlOworc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmF3YWNzX3J4X2NtZHM7CitzdGF0aWMgaW50IG51bWJlcl9vZl9yeF9jbWRfYnVmZmVyczsKKworLyoKKyAqIENhY2hlZCB2YWx1ZXMgb2YgQVdBQ1MgcmVnaXN0ZXJzICh3ZSBjYW4ndCByZWFkIHRoZW0pLgorICogRXhjZXB0IG9uIHRoZSBidXJndW5keSAoYW5kIHNjcmVhbWVyKS4gWFhYCisgKi8KKworaW50IGF3YWNzX3JlZ1s4XTsKK2ludCBhd2Fjc19yZWcxX3NhdmU7CisKKy8qIHRyYWNraW5nIHZhbHVlcyBmb3IgdGhlIG1peGVyIGNvbnRlbnRzCisqLworCitzdGF0aWMgaW50IHNwa192b2w7CitzdGF0aWMgaW50IGxpbmVfdm9sOworc3RhdGljIGludCBwYXNzdGhydV92b2w7CisKK3N0YXRpYyBpbnQgaXBfZ2FpbjsgICAgICAgICAgIC8qIG1pYyBwcmVhbXAgc2V0dGluZ3MgKi8KK3N0YXRpYyBpbnQgcmVjX2xldiA9IDB4NDU0NSA7IC8qIGRlZmF1bHQgQ0QgZ2FpbiA2OSAlICovCitzdGF0aWMgaW50IG1pY19sZXY7CitzdGF0aWMgaW50IGNkX2xldiA9IDB4NjM2MyA7IC8qIDk5ICUgKi8KK3N0YXRpYyBpbnQgbGluZV9sZXY7CisKK3N0YXRpYyBpbnQgaGRwX2Nvbm5lY3RlZDsKKworLyoKKyAqIFN0dWZmIGZvciBvdXRwdXR0aW5nIGEgYmVlcC4gIFRoZSB2YWx1ZXMgcmFuZ2UgZnJvbSAtMzI3IHRvICszMjcKKyAqIHNvIHdlIGNhbiBtdWx0aXBseSBieSBhbiBhbXBsaXR1ZGUgaW4gdGhlIHJhbmdlIDAuLjEwMCB0byBnZXQgYQorICogc2lnbmVkIHNob3J0IHZhbHVlIHRvIHB1dCBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqLworc3RhdGljIHNob3J0IGJlZXBfd2Zvcm1bMjU2XSA9IHsKKwkwLAk0MCwJNzksCTExNywJMTUzLAkxODcsCTIxOCwJMjQ1LAorCTI2OSwJMjg4LAkzMDQsCTMxNiwJMzIzLAkzMjcsCTMyNywJMzI0LAorCTMxOCwJMzEwLAkyOTksCTI4OCwJMjc1LAkyNjIsCTI0OSwJMjM2LAorCTIyNCwJMjEzLAkyMDQsCTE5NiwJMTkwLAkxODYsCTE4MywJMTgyLAorCTE4MiwJMTgzLAkxODYsCTE4OSwJMTkyLAkxOTYsCTIwMCwJMjAzLAorCTIwNiwJMjA4LAkyMDksCTIwOSwJMjA5LAkyMDcsCTIwNCwJMjAxLAorCTE5NywJMTkzLAkxODgsCTE4MywJMTc5LAkxNzQsCTE3MCwJMTY2LAorCTE2MywJMTYxLAkxNjAsCTE1OSwJMTU5LAkxNjAsCTE2MSwJMTYyLAorCTE2NCwJMTY2LAkxNjgsCTE2OSwJMTcxLAkxNzEsCTE3MSwJMTcwLAorCTE2OSwJMTY3LAkxNjMsCTE1OSwJMTU1LAkxNTAsCTE0NCwJMTM5LAorCTEzMywJMTI4LAkxMjIsCTExNywJMTEzLAkxMTAsCTEwNywJMTA1LAorCTEwMywJMTAzLAkxMDMsCTEwMywJMTA0LAkxMDQsCTEwNSwJMTA1LAorCTEwNSwJMTAzLAkxMDEsCTk3LAk5MiwJODYsCTc4LAk2OCwKKwk1OCwJNDUsCTMyLAkxOCwJMywJLTExLAktMjYsCS00MSwKKwktNTUsCS02OCwJLTc5LAktODgsCS05NSwJLTEwMCwJLTEwMiwJLTEwMiwKKwktOTksCS05MywJLTg1LAktNzUsCS02MiwJLTQ4LAktMzMsCS0xNiwKKwkwLAkxNiwJMzMsCTQ4LAk2MiwJNzUsCTg1LAk5MywKKwk5OSwJMTAyLAkxMDIsCTEwMCwJOTUsCTg4LAk3OSwJNjgsCisJNTUsCTQxLAkyNiwJMTEsCS0zLAktMTgsCS0zMiwJLTQ1LAorCS01OCwJLTY4LAktNzgsCS04NiwJLTkyLAktOTcsCS0xMDEsCS0xMDMsCisJLTEwNSwJLTEwNSwJLTEwNSwJLTEwNCwJLTEwNCwJLTEwMywJLTEwMywJLTEwMywKKwktMTAzLAktMTA1LAktMTA3LAktMTEwLAktMTEzLAktMTE3LAktMTIyLAktMTI4LAorCS0xMzMsCS0xMzksCS0xNDQsCS0xNTAsCS0xNTUsCS0xNTksCS0xNjMsCS0xNjcsCisJLTE2OSwJLTE3MCwJLTE3MSwJLTE3MSwJLTE3MSwJLTE2OSwJLTE2OCwJLTE2NiwKKwktMTY0LAktMTYyLAktMTYxLAktMTYwLAktMTU5LAktMTU5LAktMTYwLAktMTYxLAorCS0xNjMsCS0xNjYsCS0xNzAsCS0xNzQsCS0xNzksCS0xODMsCS0xODgsCS0xOTMsCisJLTE5NywJLTIwMSwJLTIwNCwJLTIwNywJLTIwOSwJLTIwOSwJLTIwOSwJLTIwOCwKKwktMjA2LAktMjAzLAktMjAwLAktMTk2LAktMTkyLAktMTg5LAktMTg2LAktMTgzLAorCS0xODIsCS0xODIsCS0xODMsCS0xODYsCS0xOTAsCS0xOTYsCS0yMDQsCS0yMTMsCisJLTIyNCwJLTIzNiwJLTI0OSwJLTI2MiwJLTI3NSwJLTI4OCwJLTI5OSwJLTMxMCwKKwktMzE4LAktMzI0LAktMzI3LAktMzI3LAktMzIzLAktMzE2LAktMzA0LAktMjg4LAorCS0yNjksCS0yNDUsCS0yMTgsCS0xODcsCS0xNTMsCS0xMTcsCS03OSwJLTQwLAorfTsKKworLyogYmVlcCBzdXBwb3J0ICovCisjZGVmaW5lIEJFRVBfU1JBVEUJMjIwNTAJLyogMjIwNTAgSHogc2FtcGxlIHJhdGUgKi8KKyNkZWZpbmUgQkVFUF9CVUZMRU4JNTEyCisjZGVmaW5lIEJFRVBfVk9MVU1FCTE1CS8qIDAgLSAxMDAgKi8KKworc3RhdGljIGludCBiZWVwX3ZvbCA9IEJFRVBfVk9MVU1FOworc3RhdGljIGludCBiZWVwX3BsYXlpbmc7CitzdGF0aWMgaW50IGF3YWNzX2JlZXBfc3RhdGU7CitzdGF0aWMgc2hvcnQgKmJlZXBfYnVmOworc3RhdGljIHZvaWQgKmJlZXBfZGJkbWFfY21kX3NwYWNlOworc3RhdGljIHZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmJlZXBfZGJkbWFfY21kOworCisvKiBCdXJndW5keSBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIGF3YWNzX2J1cmd1bmR5X3djdyh1bnNpZ25lZCBhZGRyLHVuc2lnbmVkIG5ld3ZhbCk7CitzdGF0aWMgdW5zaWduZWQgYXdhY3NfYnVyZ3VuZHlfcmN3KHVuc2lnbmVkIGFkZHIpOworc3RhdGljIHZvaWQgYXdhY3NfYnVyZ3VuZHlfd3JpdGVfdm9sdW1lKHVuc2lnbmVkIGFkZHJlc3MsIGludCB2b2x1bWUpOworc3RhdGljIGludCBhd2Fjc19idXJndW5keV9yZWFkX3ZvbHVtZSh1bnNpZ25lZCBhZGRyZXNzKTsKK3N0YXRpYyB2b2lkIGF3YWNzX2J1cmd1bmR5X3dyaXRlX212b2x1bWUodW5zaWduZWQgYWRkcmVzcywgaW50IHZvbHVtZSk7CitzdGF0aWMgaW50IGF3YWNzX2J1cmd1bmR5X3JlYWRfbXZvbHVtZSh1bnNpZ25lZCBhZGRyZXNzKTsKKworLyogd2Ugd2lsbCBhbGxvY2F0ZSBhIHNpbmdsZSAnZW1lcmdlbmN5JyBkYmRtYSBjbWQgYmxvY2sgdG8gdXNlIGlmIHRoZQorICAgdHggc3RhdHVzIGNvbWVzIHVwICJERUFEIi4gIFRoaXMgaGFwcGVucyBvbiBzb21lIFBvd2VyQ29tcHV0aW5nIFBtYWMKKyAgIGNsb25lcywgZWl0aGVyIG93aW5nIHRvIGEgYnVnIGluIGRiZG1hIG9yIHNvbWUgaW50ZXJhY3Rpb24gYmV0d2VlbgorICAgSURFIGFuZCBzb3VuZC4gIEhvd2V2ZXIsIHRoaXMgbWVhc3VyZSB3b3VsZCBkZWFsIHdpdGggREVBRCBzdGF0dXMgaWYKKyAgIGlmIGFwcGVhcmVkIGVsc2V3aGVyZS4KKworICAgZm9yIHRoZSBzYWtlIG9mIG1lbW9yeSBlZmZpY2llbmN5IHdlJ2xsIGFsbG9jYXRlIHRoaXMgY21kIGFzIHBhcnQgb2YKKyAgIHRoZSBiZWVwIGNtZCBzdHVmZi4KKyovCisKK3N0YXRpYyB2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICplbWVyZ2VuY3lfZGJkbWFfY21kOworCisjaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKy8qCisgKiBTdHVmZiBmb3IgcmVzdG9yaW5nIGFmdGVyIGEgc2xlZXAuCisgKi8KK3N0YXRpYyBpbnQgYXdhY3Nfc2xlZXBfbm90aWZ5KHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKTsKK3N0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgYXdhY3Nfc2xlZXBfbm90aWZpZXIgPSB7CisJYXdhY3Nfc2xlZXBfbm90aWZ5LCBTTEVFUF9MRVZFTF9TT1VORCwKK307CisjZW5kaWYgLyogQ09ORklHX1BNQUNfUEJPT0sgKi8KKworLyogZm9yIChzb2Z0KSBzYW1wbGUgcmF0ZSB0cmFuc2xhdGlvbnMgKi8KK2ludCBleHBhbmRfYmFsOwkJLyogQmFsYW5jZSBmYWN0b3IgZm9yIGV4cGFuZGluZyAobm90IHZvbHVtZSEpICovCitpbnQgZXhwYW5kX3JlYWRfYmFsOwkvKiBCYWxhbmNlIGZhY3RvciBmb3IgZXhwYW5kaW5nIHJlYWRzIChub3Qgdm9sdW1lISkgKi8KKworLyoqKiBMb3cgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9pZCAqUE1hY0FsbG9jKHVuc2lnbmVkIGludCBzaXplLCBpbnQgZmxhZ3MpOworc3RhdGljIHZvaWQgUE1hY0ZyZWUodm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IFBNYWNJcnFJbml0KHZvaWQpOworI2lmZGVmIE1PRFVMRQorc3RhdGljIHZvaWQgUE1hY0lycUNsZWFudXAodm9pZCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIFBNYWNTaWxlbmNlKHZvaWQpOworc3RhdGljIHZvaWQgUE1hY0luaXQodm9pZCk7CitzdGF0aWMgaW50IFBNYWNTZXRGb3JtYXQoaW50IGZvcm1hdCk7CitzdGF0aWMgaW50IFBNYWNTZXRWb2x1bWUoaW50IHZvbHVtZSk7CitzdGF0aWMgdm9pZCBQTWFjUGxheSh2b2lkKTsKK3N0YXRpYyB2b2lkIFBNYWNSZWNvcmQodm9pZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgcG1hY19hd2Fjc190eF9pbnRyKGludCBpcnEsIHZvaWQgKmRldmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgcG1hY19hd2Fjc19yeF9pbnRyKGludCBpcnEsIHZvaWQgKmRldmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgaXJxcmV0dXJuX3QgcG1hY19hd2Fjc19pbnRyKGludCBpcnEsIHZvaWQgKmRldmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CitzdGF0aWMgdm9pZCBhd2Fjc193cml0ZShpbnQgdmFsKTsKK3N0YXRpYyBpbnQgYXdhY3NfZ2V0X3ZvbHVtZShpbnQgcmVnLCBpbnQgbHNoaWZ0KTsKK3N0YXRpYyBpbnQgYXdhY3Nfdm9sdW1lX3NldHRlcihpbnQgdm9sdW1lLCBpbnQgbiwgaW50IG11dGUsIGludCBsc2hpZnQpOworCisKKy8qKiogTWlkIGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgUE1hY01peGVySW9jdGwodV9pbnQgY21kLCB1X2xvbmcgYXJnKTsKK3N0YXRpYyBpbnQgUE1hY1dyaXRlU3FTZXR1cCh2b2lkKTsKK3N0YXRpYyBpbnQgUE1hY1JlYWRTcVNldHVwKHZvaWQpOworc3RhdGljIHZvaWQgUE1hY0Fib3J0UmVhZCh2b2lkKTsKKworZXh0ZXJuIFRSQU5TIHRyYW5zQXdhY3NOb3JtYWwgOworZXh0ZXJuIFRSQU5TIHRyYW5zQXdhY3NFeHBhbmQgOworZXh0ZXJuIFRSQU5TIHRyYW5zQXdhY3NOb3JtYWxSZWFkIDsKK2V4dGVybiBUUkFOUyB0cmFuc0F3YWNzRXhwYW5kUmVhZCA7CisKK2V4dGVybiBpbnQgZGFjYV9pbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgZGFjYV9jbGVhbnVwKHZvaWQpOworZXh0ZXJuIGludCBkYWNhX3NldF92b2x1bWUodWludCBsZWZ0X3ZvbCwgdWludCByaWdodF92b2wpOworZXh0ZXJuIHZvaWQgZGFjYV9nZXRfdm9sdW1lKHVpbnQgKiBsZWZ0X3ZvbCwgdWludCAgKnJpZ2h0X3ZvbCk7CitleHRlcm4gaW50IGRhY2FfZW50ZXJfc2xlZXAodm9pZCk7CitleHRlcm4gaW50IGRhY2FfbGVhdmVfc2xlZXAodm9pZCk7CisKKyNkZWZpbmUgVFJZX0xPQ0soKQlcCisJaWYgKChyYyA9IGRvd25faW50ZXJydXB0aWJsZSgmZG1hc291bmRfc2VtKSkgIT0gMCkJXAorCQlyZXR1cm4gcmM7CisjZGVmaW5lIExPQ0soKQkJZG93bigmZG1hc291bmRfc2VtKTsKKworI2RlZmluZSBVTkxPQ0soKQl1cCgmZG1hc291bmRfc2VtKTsKKworLyogV2UgdXNlIGRpZmZlcmVudCB2ZXJzaW9ucyB0aGF0IHRoZSBvbmVzIHByb3ZpZGVkIGluIGRtYXNvdW5kLmgKKyAqIAorICogRklYTUU6IFVzZSBkaWZmZXJlbnQgbmFtZXMgOykKKyAqLworI3VuZGVmIElPQ1RMX0lOCisjdW5kZWYgSU9DVExfT1VUCisKKyNkZWZpbmUgSU9DVExfSU4oYXJnLCByZXQpCVwKKwlyYyA9IGdldF91c2VyKHJldCwgKGludCBfX3VzZXIgKikoYXJnKSk7IFwKKwlpZiAocmMpIGJyZWFrOworI2RlZmluZSBJT0NUTF9PVVQoYXJnLCByZXQpCVwKKwlpb2N0bF9yZXR1cm4yKChpbnQgX191c2VyICopKGFyZyksIHJldCkKKworc3RhdGljIGlubGluZSBpbnQgaW9jdGxfcmV0dXJuMihpbnQgX191c2VyICphZGRyLCBpbnQgdmFsdWUpCit7CisJcmV0dXJuIHZhbHVlIDwgMCA/IHZhbHVlIDogcHV0X3VzZXIodmFsdWUsIGFkZHIpOworfQorCisKKy8qKiogQUUgLSBUVU1CTEVSIC8gU05BUFBFUiBTVEFSVCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworaW50IGdwaW9fYXVkaW9fcmVzZXQsIGdwaW9fYXVkaW9fcmVzZXRfcG9sOworaW50IGdwaW9fYW1wX211dGUsIGdwaW9fYW1wX211dGVfcG9sOworaW50IGdwaW9faGVhZHBob25lX211dGUsIGdwaW9faGVhZHBob25lX211dGVfcG9sOworaW50IGdwaW9faGVhZHBob25lX2RldGVjdCwgZ3Bpb19oZWFkcGhvbmVfZGV0ZWN0X3BvbDsKK2ludCBncGlvX2hlYWRwaG9uZV9pcnE7CisKK2ludAorc2V0dXBfYXVkaW9fZ3Bpbyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyKiBjb21wYXRpYmxlLCBpbnQgKmdwaW9fYWRkciwgaW50KiBncGlvX3BvbCkKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wOworCXUzMiogcHA7CisJCisJbnAgPSBmaW5kX2RldmljZXMoImdwaW8iKTsKKwlpZiAoIW5wKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCW5wID0gbnAtPmNoaWxkOworCXdoaWxlKG5wICE9IDApIHsKKwkJaWYgKG5hbWUpIHsKKwkJCWNoYXIgKnByb3BlcnR5ID0gZ2V0X3Byb3BlcnR5KG5wLCJhdWRpby1ncGlvIixOVUxMKTsKKwkJCWlmIChwcm9wZXJ0eSAhPSAwICYmIHN0cmNtcChwcm9wZXJ0eSxuYW1lKSA9PSAwKQorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGNvbXBhdGlibGUgJiYgZGV2aWNlX2lzX2NvbXBhdGlibGUobnAsIGNvbXBhdGlibGUpKQorCQkJYnJlYWs7CisJCW5wID0gbnAtPnNpYmxpbmc7CisJfQorCWlmICghbnApCisJCXJldHVybiAtRU5PREVWOworCXBwID0gKHUzMiAqKWdldF9wcm9wZXJ0eShucCwgIkFBUEwsYWRkcmVzcyIsIE5VTEwpOworCWlmICghcHApCisJCXJldHVybiAtRU5PREVWOworCSpncGlvX2FkZHIgPSAoKnBwKSAmIDB4MDAwMGZmZmY7CisJcHAgPSAodTMyICopZ2V0X3Byb3BlcnR5KG5wLCAiYXVkaW8tZ3Bpby1hY3RpdmUtc3RhdGUiLCBOVUxMKTsKKwlpZiAocHApCisJCSpncGlvX3BvbCA9ICpwcDsKKwllbHNlCisJCSpncGlvX3BvbCA9IDE7CisJaWYgKG5wLT5uX2ludHJzID4gMCkKKwkJcmV0dXJuIG5wLT5pbnRyc1swXS5saW5lOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3dyaXRlX2F1ZGlvX2dwaW8oaW50IGdwaW9fYWRkciwgaW50IGRhdGEpCit7CisJaWYgKCFncGlvX2FkZHIpCisJCXJldHVybjsKKwlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9XUklURV9HUElPLCBOVUxMLCBncGlvX2FkZHIsIGRhdGEgPyAweDA1IDogMHgwNCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CityZWFkX2F1ZGlvX2dwaW8oaW50IGdwaW9fYWRkcikKK3sKKwlpZiAoIWdwaW9fYWRkcikKKwkJcmV0dXJuIDA7CisJcmV0dXJuICgocG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfUkVBRF9HUElPLCBOVUxMLCBncGlvX2FkZHIsIDApICYgMHgwMikgIT0wKTsKK30KKworLyoKKyAqIEhlYWRwaG9uZSBpbnRlcnJ1cHQgdmlhIEdQSU8gKFR1bWJsZXIsIFNuYXBwZXIsIERBQ0EpCisgKi8KK3N0YXRpYyBpcnFyZXR1cm5fdAoraGVhZHBob25lX2ludHIoaW50IGlycSwgdm9pZCAqZGV2aWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCWlmIChyZWFkX2F1ZGlvX2dwaW8oZ3Bpb19oZWFkcGhvbmVfZGV0ZWN0KSA9PSBncGlvX2hlYWRwaG9uZV9kZXRlY3RfcG9sKSB7CisJCXByaW50ayhLRVJOX0lORk8gIkF1ZGlvIGphY2sgcGx1Z2dlZCwgbXV0aW5nIHNwZWFrZXJzLlxuIik7CisJCXdyaXRlX2F1ZGlvX2dwaW8oZ3Bpb19oZWFkcGhvbmVfbXV0ZSwgIWdwaW9faGVhZHBob25lX211dGVfcG9sKTsKKwkJd3JpdGVfYXVkaW9fZ3BpbyhncGlvX2FtcF9tdXRlLCBncGlvX2FtcF9tdXRlX3BvbCk7CisJCXRhc19vdXRwdXRfZGV2aWNlX2NoYW5nZShzb3VuZF9kZXZpY2VfaWQsVEFTX09VVFBVVF9IRUFEUEhPTkVTLDApOworCX0gZWxzZSB7CisJCXByaW50ayhLRVJOX0lORk8gIkF1ZGlvIGphY2sgdW5wbHVnZ2VkLCBlbmFibGluZyBzcGVha2Vycy5cbiIpOworCQl3cml0ZV9hdWRpb19ncGlvKGdwaW9fYW1wX211dGUsICFncGlvX2FtcF9tdXRlX3BvbCk7CisJCXdyaXRlX2F1ZGlvX2dwaW8oZ3Bpb19oZWFkcGhvbmVfbXV0ZSwgZ3Bpb19oZWFkcGhvbmVfbXV0ZV9wb2wpOworCQl0YXNfb3V0cHV0X2RldmljZV9jaGFuZ2Uoc291bmRfZGV2aWNlX2lkLFRBU19PVVRQVVRfSU5URVJOQUxfU1BLUiwwKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKiBJbml0aWFsaXplIHR1bWJsZXIgKi8KKworc3RhdGljIGludAordGFzX2RtYXNvdW5kX2luaXQodm9pZCkKK3sKKwlzZXR1cF9hdWRpb19ncGlvKAorCQkiYXVkaW8taHctcmVzZXQiLAorCQlOVUxMLAorCQkmZ3Bpb19hdWRpb19yZXNldCwKKwkJJmdwaW9fYXVkaW9fcmVzZXRfcG9sKTsKKwlzZXR1cF9hdWRpb19ncGlvKAorCQkiYW1wLW11dGUiLAorCQlOVUxMLAorCQkmZ3Bpb19hbXBfbXV0ZSwKKwkJJmdwaW9fYW1wX211dGVfcG9sKTsKKwlzZXR1cF9hdWRpb19ncGlvKCJoZWFkcGhvbmUtbXV0ZSIsCisJCU5VTEwsCisJCSZncGlvX2hlYWRwaG9uZV9tdXRlLAorCQkmZ3Bpb19oZWFkcGhvbmVfbXV0ZV9wb2wpOworCWdwaW9faGVhZHBob25lX2lycSA9IHNldHVwX2F1ZGlvX2dwaW8oCisJCSJoZWFkcGhvbmUtZGV0ZWN0IiwKKwkJTlVMTCwKKwkJJmdwaW9faGVhZHBob25lX2RldGVjdCwKKwkJJmdwaW9faGVhZHBob25lX2RldGVjdF9wb2wpOworCS8qIEZpeCBzb21lIGJyb2tlbiBPRiBlbnRyaWVzIGluIGRlc2t0b3AgbWFjaGluZXMgKi8KKwlpZiAoIWdwaW9faGVhZHBob25lX2lycSkKKwkJZ3Bpb19oZWFkcGhvbmVfaXJxID0gc2V0dXBfYXVkaW9fZ3BpbygKKwkJCU5VTEwsCisJCQkia2V5d2VzdC1ncGlvMTUiLAorCQkJJmdwaW9faGVhZHBob25lX2RldGVjdCwKKwkJCSZncGlvX2hlYWRwaG9uZV9kZXRlY3RfcG9sKTsKKworCXdyaXRlX2F1ZGlvX2dwaW8oZ3Bpb19hdWRpb19yZXNldCwgZ3Bpb19hdWRpb19yZXNldF9wb2wpOworCW1zbGVlcCgxMDApOworCXdyaXRlX2F1ZGlvX2dwaW8oZ3Bpb19hdWRpb19yZXNldCwgIWdwaW9fYXVkaW9fcmVzZXRfcG9sKTsKKwltc2xlZXAoMTAwKTsKKyAgCWlmIChncGlvX2hlYWRwaG9uZV9pcnEpIHsKKwkJaWYgKHJlcXVlc3RfaXJxKGdwaW9faGVhZHBob25lX2lycSxoZWFkcGhvbmVfaW50ciwwLCJIZWFkcGhvbmUgZGV0ZWN0IixOVUxMKSA8IDApIHsKKyAgICAJCQlwcmludGsoS0VSTl9FUlIgInR1bWJsZXI6IENhbid0IHJlcXVlc3QgaGVhZHBob25lIGludGVycnVwdFxuIik7CisgICAgCQkJZ3Bpb19oZWFkcGhvbmVfaXJxID0gMDsKKyAgICAJCX0gZWxzZSB7CisJCQl1OCB2YWw7CisJCQkvKiBBY3RpdmF0ZSBoZWFkcGhvbmUgc3RhdHVzIGludGVycnVwdHMgKi8KKwkJCXZhbCA9IHBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1JFQURfR1BJTywgTlVMTCwgZ3Bpb19oZWFkcGhvbmVfZGV0ZWN0LCAwKTsKKwkJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1dSSVRFX0dQSU8sIE5VTEwsIGdwaW9faGVhZHBob25lX2RldGVjdCwgdmFsIHwgMHg4MCk7CisJCQkvKiBUcmlnZ2VyIGl0ICovCisgIAkJCWhlYWRwaG9uZV9pbnRyKDAsTlVMTCxOVUxMKTsKKyAgCQl9CisgIAl9CisgIAlpZiAoIWdwaW9faGVhZHBob25lX2lycSkgeworICAJCS8qIFNvbWUgbWFjaGluZSBlbnRlciB0aGlzIGNhc2UgPyAqLworICAJCXByaW50ayhLRVJOX1dBUk5JTkcgInR1bWJsZXI6IEhlYWRwaG9uZSBkZXRlY3QgSVJRIG5vdCBmb3VuZCwgZW5hYmxpbmcgYWxsIG91dHB1dHMgIVxuIik7CisgIAkJd3JpdGVfYXVkaW9fZ3BpbyhncGlvX2FtcF9tdXRlLCAhZ3Bpb19hbXBfbXV0ZV9wb2wpOworICAJCXdyaXRlX2F1ZGlvX2dwaW8oZ3Bpb19oZWFkcGhvbmVfbXV0ZSwgIWdwaW9faGVhZHBob25lX211dGVfcG9sKTsKKyAgCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50Cit0YXNfZG1hc291bmRfY2xlYW51cCh2b2lkKQoreworCWlmIChncGlvX2hlYWRwaG9uZV9pcnEpCisJCWZyZWVfaXJxKGdwaW9faGVhZHBob25lX2lycSwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFdlIGRvbid0IHN1cHBvcnQgNDhrIHlldCAqLworc3RhdGljIGludCB0YXNfZnJlcXNbMV0gPSB7IDQ0MTAwIH0gOworc3RhdGljIGludCB0YXNfZnJlcXNfb2tbMV0gPSB7IDEgfSA7CisKKy8qIGRvbid0IGtub3cgd2hhdCB0byBkbyByZWFsbHkgLSBqdXN0IGhhdmUgdG8gbGVhdmUgaXQgd2hlcmUKKyAqIE9GIGxlZnQgdGhpbmdzCisqLworCitzdGF0aWMgaW50Cit0YXNfc2V0X2ZyYW1lX3JhdGUodm9pZCkKK3sKKwlpZiAoaTJzKSB7CisJCW91dF9sZTMyKGkycyArIChJMlNfUkVHX1NFUklBTF9GT1JNQVQgPj4gMiksIDB4NDExOTAwMDApOworCQlvdXRfbGUzMihpMnMgKyAoSTJTX1JFR19EQVRBV09SRF9TSVpFUyA+PiAyKSwgMHgwMjAwMDIwMCk7CisJfQorCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSA0NDEwMCA7CisJYXdhY3NfcmF0ZV9pbmRleCA9IDAgOworCXJldHVybiA0NDEwMCA7Cit9CisKK3N0YXRpYyBpbnQKK3Rhc19taXhlcl9pb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisJaW50IF9fdXNlciAqYXJncCA9IChpbnQgX191c2VyICopYXJnOworCWludCBkYXRhOworCWludCByYzsKKworICAgICAgICByYz10YXNfZGV2aWNlX2lvY3RsKGNtZCwgYXJnKTsKKyAgICAgICAgaWYgKHJjICE9IC1FSU5WQUwpIHsKKyAgICAgICAgCXJldHVybiByYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoY21kICYgfjB4ZmYpID09IE1JWEVSX1dSSVRFKDApICYmCisgICAgICAgICAgICB0YXNfc3VwcG9ydGVkX21peGVycygpICYgKDE8PChjbWQgJiAweGZmKSkpIHsKKwkJcmMgPSBnZXRfdXNlcihkYXRhLCBhcmdwKTsKKyAgICAgICAgICAgICAgICBpZiAocmM8MCkgcmV0dXJuIHJjOworCQl0YXNfc2V0X21peGVyX2xldmVsKGNtZCAmIDB4ZmYsIGRhdGEpOworCQl0YXNfZ2V0X21peGVyX2xldmVsKGNtZCAmIDB4ZmYsICZkYXRhKTsKKwkJcmV0dXJuIGlvY3RsX3JldHVybjIoYXJncCwgZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjbWQgJiB+MHhmZikgPT0gTUlYRVJfUkVBRCgwKSAmJgorICAgICAgICAgICAgdGFzX3N1cHBvcnRlZF9taXhlcnMoKSAmICgxPDwoY21kICYgMHhmZikpKSB7CisJCXRhc19nZXRfbWl4ZXJfbGV2ZWwoY21kICYgMHhmZiwgJmRhdGEpOworCQlyZXR1cm4gaW9jdGxfcmV0dXJuMihhcmdwLCBkYXRhKTsKKyAgICAgICAgfQorCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLOgorCQlkYXRhID0gdGFzX3N1cHBvcnRlZF9taXhlcnMoKSB8IFNPVU5EX01BU0tfU1BFQUtFUjsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlM6CisJCWRhdGEgPSB0YXNfc3RlcmVvX21peGVycygpOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfQ0FQUzoKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6CisJCS8vIFhYWCBGSVhNRTogZmluZCBhIHdheSB0byBjaGVjayB3aGF0IGlzIHJlYWxseSBhdmFpbGFibGUgKi8KKwkJZGF0YSA9IFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDU1JDOgorCQlpZiAoYXdhY3NfcmVnWzBdICYgTUFTS19NVVhfQVVESU4pCisJCQlkYXRhIHw9IFNPVU5EX01BU0tfTElORTsKKwkJaWYgKGF3YWNzX3JlZ1swXSAmIE1BU0tfTVVYX01JQykKKwkJCWRhdGEgfD0gU09VTkRfTUFTS19NSUM7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDOgorIAkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJZGF0YSA9MDsKKyAJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisgCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1NQRUFLRVI6CS8qIHJlYWxseSBiZWxsIHZvbHVtZSAqLworIAkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKyAJCWJlZXBfdm9sID0gZGF0YSAmIDB4ZmY7CisgCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfU1BFQUtFUjoKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCAoYmVlcF92b2w8PDgpIHwgYmVlcF92b2wpOworIAkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9PVVRNQVNLOgorCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOgorCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAordGFzX2luaXRfZnJhbWVfcmF0ZXModW5zaWduZWQgaW50ICpwcm9wLCB1bnNpZ25lZCBpbnQgbCkKK3sKKwlpbnQgaSA7CisJaWYgKHByb3ApIHsKKwkJZm9yIChpPTA7IGk8MTsgaSsrKQorCQkJdGFzX2ZyZXFzX29rW2ldID0gMDsKKwkJZm9yIChsIC89IHNpemVvZihpbnQpOyBsID4gMDsgLS1sKSB7CisJCQl1bnNpZ25lZCBpbnQgciA9ICpwcm9wKys7CisJCQkvKiBBcHBsZSAnRml4ZWQnIGZvcm1hdCAqLworCQkJaWYgKHIgPj0gMHgxMDAwMCkKKwkJCQlyID4+PSAxNjsKKwkJCWZvciAoaSA9IDA7IGkgPCAxOyArK2kpIHsKKwkJCQlpZiAociA9PSB0YXNfZnJlcXNbaV0pIHsKKwkJCQkJdGFzX2ZyZXFzX29rW2ldID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCS8qIGVsc2Ugd2UgYXNzdW1lIHRoYXQgYWxsIHRoZSByYXRlcyBhcmUgYXZhaWxhYmxlICovCit9CisKKworLyoqKiBBRSAtIFRVTUJMRVIgLyBTTkFQUEVSIEVORCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworCisvKioqIExvdyBsZXZlbCBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBQQ0kgUG93ZXJNYWMsIHdpdGggQVdBQ1MsIFNjcmVhbWVyLCBCdXJndW5keSwgREFDQSBvciBUdW1ibGVyIGFuZCBEQkRNQS4KKyAqLworc3RhdGljIHZvaWQgKlBNYWNBbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiBrbWFsbG9jKHNpemUsIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgUE1hY0ZyZWUodm9pZCAqcHRyLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlrZnJlZShwdHIpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBQTWFjSXJxSW5pdCh2b2lkKQoreworCWlmIChhd2FjcykKKwkJaWYgKHJlcXVlc3RfaXJxKGF3YWNzX2lycSwgcG1hY19hd2Fjc19pbnRyLCAwLCAiQnVpbHQtaW4gU291bmQgbWlzYyIsIE5VTEwpKQorCQkJcmV0dXJuIDA7CisJaWYgKHJlcXVlc3RfaXJxKGF3YWNzX3R4X2lycSwgcG1hY19hd2Fjc190eF9pbnRyLCAwLCAiQnVpbHQtaW4gU291bmQgb3V0IiwgTlVMTCkKKwkgICAgfHwgcmVxdWVzdF9pcnEoYXdhY3NfcnhfaXJxLCBwbWFjX2F3YWNzX3J4X2ludHIsIDAsICJCdWlsdC1pbiBTb3VuZCBpbiIsIE5VTEwpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworI2lmZGVmIE1PRFVMRQorc3RhdGljIHZvaWQgUE1hY0lycUNsZWFudXAodm9pZCkKK3sKKwkvKiB0dXJuIG9mZiBpbnB1dCAmIG91dHB1dCBkbWEgKi8KKwlEQkRNQV9ET19TVE9QKGF3YWNzX3R4ZG1hKTsKKwlEQkRNQV9ET19TVE9QKGF3YWNzX3J4ZG1hKTsKKworCWlmIChhd2FjcykKKwkJLyogZGlzYWJsZSBpbnRlcnJ1cHRzIGZyb20gYXdhY3MgaW50ZXJmYWNlICovCisJCW91dF9sZTMyKCZhd2Fjcy0+Y29udHJvbCwgaW5fbGUzMigmYXdhY3MtPmNvbnRyb2wpICYgMHhmZmYpOworCQorCS8qIFN3aXRjaCBvZmYgdGhlIHNvdW5kIGNsb2NrICovCisJcG1hY19jYWxsX2ZlYXR1cmUoUE1BQ19GVFJfU09VTkRfQ0hJUF9FTkFCTEUsIGF3YWNzX25vZGUsIDAsIDApOworCS8qIE1ha2Ugc3VyZSBwcm9wZXIgYml0cyBhcmUgc2V0IG9uIHBpc21vICYgdGlwYiAqLworCWlmICgobWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2szLDEiKSB8fAorCSAgICBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazMsMiIpKSAmJiBhd2FjcykgeworCQlhd2Fjc19yZWdbMV0gfD0gTUFTS19QQVJPVVQwIHwgTUFTS19QQVJPVVQxOworCQlhd2Fjc193cml0ZShNQVNLX0FERFIxIHwgYXdhY3NfcmVnWzFdKTsKKwkJbXNsZWVwKDIwMCk7CisJfQorCWlmIChhd2FjcykKKwkJZnJlZV9pcnEoYXdhY3NfaXJxLCBOVUxMKTsKKwlmcmVlX2lycShhd2Fjc190eF9pcnEsIE5VTEwpOworCWZyZWVfaXJxKGF3YWNzX3J4X2lycSwgTlVMTCk7CisJCisJaWYgKGF3YWNzKQorCQlpb3VubWFwKGF3YWNzKTsKKwlpZiAoaTJzKQorCQlpb3VubWFwKGkycyk7CisJaW91bm1hcChhd2Fjc190eGRtYSk7CisJaW91bm1hcChhd2Fjc19yeGRtYSk7CisKKwlyZWxlYXNlX09GX3Jlc291cmNlKGF3YWNzX25vZGUsIDApOworCXJlbGVhc2VfT0ZfcmVzb3VyY2UoYXdhY3Nfbm9kZSwgMSk7CisJcmVsZWFzZV9PRl9yZXNvdXJjZShhd2Fjc19ub2RlLCAyKTsKKworCWlmIChhd2Fjc190eF9jbWRfc3BhY2UpCisJCWtmcmVlKGF3YWNzX3R4X2NtZF9zcGFjZSk7CisJaWYgKGF3YWNzX3J4X2NtZF9zcGFjZSkKKwkJa2ZyZWUoYXdhY3NfcnhfY21kX3NwYWNlKTsKKwlpZiAoYmVlcF9kYmRtYV9jbWRfc3BhY2UpCisJCWtmcmVlKGJlZXBfZGJkbWFfY21kX3NwYWNlKTsKKwlpZiAoYmVlcF9idWYpCisJCWtmcmVlKGJlZXBfYnVmKTsKKyNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworCXBtdV91bnJlZ2lzdGVyX3NsZWVwX25vdGlmaWVyKCZhd2Fjc19zbGVlcF9ub3RpZmllcik7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworc3RhdGljIHZvaWQgUE1hY1NpbGVuY2Uodm9pZCkKK3sKKwkvKiB0dXJuIG9mZiBvdXRwdXQgZG1hICovCisJREJETUFfRE9fU1RPUChhd2Fjc190eGRtYSk7Cit9CisKKy8qIGRvbid0IGtub3cgd2hhdCB0byBkbyByZWFsbHkgLSBqdXN0IGhhdmUgdG8gbGVhdmUgaXQgd2hlcmUKKyAqIE9GIGxlZnQgdGhpbmdzCisqLworCitzdGF0aWMgaW50IGRhY2Ffc2V0X2ZyYW1lX3JhdGUodm9pZCkKK3sKKwlpZiAoaTJzKSB7CisJCW91dF9sZTMyKGkycyArIChJMlNfUkVHX1NFUklBTF9GT1JNQVQgPj4gMiksIDB4NDExOTAwMDApOworCQlvdXRfbGUzMihpMnMgKyAoSTJTX1JFR19EQVRBV09SRF9TSVpFUyA+PiAyKSwgMHgwMjAwMDIwMCk7CisJfQorCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSA0NDEwMCA7CisJYXdhY3NfcmF0ZV9pbmRleCA9IDAgOworCXJldHVybiA0NDEwMCA7Cit9CisKK3N0YXRpYyBpbnQgYXdhY3NfZnJlcXNbOF0gPSB7CisJNDQxMDAsIDI5NDAwLCAyMjA1MCwgMTc2NDAsIDE0NzAwLCAxMTAyNSwgODgyMCwgNzM1MAorfTsKK3N0YXRpYyBpbnQgYXdhY3NfZnJlcXNfb2tbOF0gPSB7IDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEgfTsKKworc3RhdGljIGludAorYXdhY3Nfc2V0X2ZyYW1lX3JhdGUoaW50IGRlc2lyZWQsIGludCBjYXRjaF9yKQoreworCWludCB0b2xlcmFuY2UsIGkgPSA4IDsKKwkvKgorCSAqIElmIHdlIGhhdmUgYSBzYW1wbGUgcmF0ZSB3aGljaCBpcyB3aXRoaW4gY2F0Y2hSYWRpdXMgcGVyY2VudAorCSAqIG9mIHRoZSByZXF1ZXN0ZWQgdmFsdWUsIHdlIGRvbid0IGhhdmUgdG8gZXhwYW5kIHRoZSBzYW1wbGVzLgorCSAqIE90aGVyd2lzZSBjaG9vc2UgdGhlIG5leHQgaGlnaGVyIHJhdGUuCisJICogTi5CLjogYnVyZ3VuZHkgYXdhY3Mgb25seSB3b3JrcyBhdCA0NDEwMCBIei4KKwkgKi8KKwlkbyB7CisJCXRvbGVyYW5jZSA9IGNhdGNoX3IgKiBhd2Fjc19mcmVxc1stLWldIC8gMTAwOworCQlpZiAoYXdhY3NfZnJlcXNfb2tbaV0KKwkJICAgICYmIGRtYXNvdW5kLnNvZnQuc3BlZWQgPD0gYXdhY3NfZnJlcXNbaV0gKyB0b2xlcmFuY2UpCisJCQlicmVhazsKKwl9IHdoaWxlIChpID4gMCk7CisJZG1hc291bmQuaGFyZC5zcGVlZCA9IGF3YWNzX2ZyZXFzW2ldOworCWF3YWNzX3JhdGVfaW5kZXggPSBpOworCisJb3V0X2xlMzIoJmF3YWNzLT5jb250cm9sLCBNQVNLX0lFUEMgfCAoaSA8PCA4KSB8IDB4MTEgKTsKKwlhd2Fjc19yZWdbMV0gPSAoYXdhY3NfcmVnWzFdICYgfk1BU0tfU0FNUExFUkFURSkgfCAoaSA8PCAzKTsKKwlhd2Fjc193cml0ZShhd2Fjc19yZWdbMV0gfCBNQVNLX0FERFIxKTsKKwlyZXR1cm4gZG1hc291bmQuaGFyZC5zcGVlZDsKK30KKworc3RhdGljIGludAorYnVyZ3VuZHlfc2V0X2ZyYW1lX3JhdGUodm9pZCkKK3sKKwlhd2Fjc19yYXRlX2luZGV4ID0gMCA7CisJYXdhY3NfcmVnWzFdID0gKGF3YWNzX3JlZ1sxXSAmIH5NQVNLX1NBTVBMRVJBVEUpIDsKKwkvKiBYWFggZGlzYWJsZSBlcnJvciBpbnRlcnJ1cHQgb24gYnVyZ3VuZHkgZm9yIG5vdyAqLworCW91dF9sZTMyKCZhd2Fjcy0+Y29udHJvbCwgTUFTS19JRVBDIHwgMCB8IDB4MTEgfCBNQVNLX0lFRSk7CisJcmV0dXJuIDQ0MTAwIDsKK30KKworc3RhdGljIGludAorc2V0X2ZyYW1lX3JhdGUoaW50IGRlc2lyZWQsIGludCBjYXRjaF9yKQoreworCXN3aXRjaCAoYXdhY3NfcmV2aXNpb24pIHsKKwkJY2FzZSBBV0FDU19CVVJHVU5EWToKKwkJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSBidXJndW5keV9zZXRfZnJhbWVfcmF0ZSgpOworCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX1RVTUJMRVI6CisJCWNhc2UgQVdBQ1NfU05BUFBFUjoKKwkJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSB0YXNfc2V0X2ZyYW1lX3JhdGUoKTsKKwkJCWJyZWFrIDsKKwkJY2FzZSBBV0FDU19EQUNBOgorCQkJZG1hc291bmQuaGFyZC5zcGVlZCA9CisJCQkgIGRhY2Ffc2V0X2ZyYW1lX3JhdGUoKTsKKwkJCWJyZWFrIDsKKwkJZGVmYXVsdDoKKwkJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSBhd2Fjc19zZXRfZnJhbWVfcmF0ZShkZXNpcmVkLAorCQkJCQkJY2F0Y2hfcik7CisJCQlicmVhayA7CisJfQorCXJldHVybiBkbWFzb3VuZC5oYXJkLnNwZWVkIDsKK30KKworc3RhdGljIHZvaWQKK2F3YWNzX3JlY2FsaWJyYXRlKHZvaWQpCit7CisJLyogU29ycnkgZm9yIHRoZSBob3JyaWJsZSBkZWxheXMuLi4gSSBob3BlIHRvIGdldCB0aGF0IGltcHJvdmVkCisJICogYnkgbWFraW5nIHRoZSB3aG9sZSBQTSBwcm9jZXNzIGFzeW5jaHJvbm91cyBpbiBhIGZ1dHVyZSB2ZXJzaW9uCisJICovCisJbXNsZWVwKDc1MCk7CisJYXdhY3NfcmVnWzFdIHw9IE1BU0tfQ01VVEUgfCBNQVNLX0FNVVRFOworCWF3YWNzX3dyaXRlKGF3YWNzX3JlZ1sxXSB8IE1BU0tfUkVDQUxJQlJBVEUgfCBNQVNLX0FERFIxKTsKKwltc2xlZXAoMTAwMCk7CisJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzFdIHwgTUFTS19BRERSMSk7Cit9CisKK3N0YXRpYyB2b2lkIFBNYWNJbml0KHZvaWQpCit7CisJaW50IHRvbGVyYW5jZTsKKworCXN3aXRjaCAoZG1hc291bmQuc29mdC5mb3JtYXQpIHsKKwkgICAgY2FzZSBBRk1UX1MxNl9MRToKKwkgICAgY2FzZSBBRk1UX1UxNl9MRToKKwkJaWYgKGh3X2Nhbl9ieXRlc3dhcCkKKwkJCWRtYXNvdW5kLmhhcmQuZm9ybWF0ID0gQUZNVF9TMTZfTEU7CisJCWVsc2UKKwkJCWRtYXNvdW5kLmhhcmQuZm9ybWF0ID0gQUZNVF9TMTZfQkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRtYXNvdW5kLmhhcmQuZm9ybWF0ID0gQUZNVF9TMTZfQkU7CisJCWJyZWFrOworCX0KKwlkbWFzb3VuZC5oYXJkLnN0ZXJlbyA9IDE7CisJZG1hc291bmQuaGFyZC5zaXplID0gMTY7CisKKwkvKiBzZXQgZG1hc291bmQuaGFyZC5zcGVlZCAtIG9uIHRoZSBiYXNpcyBvZiB3aGF0IHdlIHdhbnQgKHNvZnQpCisJICogYW5kIHRoZSB0b2xlcmFuY2Ugd2UnbGwgYWxsb3cuCisJKi8KKwlzZXRfZnJhbWVfcmF0ZShkbWFzb3VuZC5zb2Z0LnNwZWVkLCBjYXRjaFJhZGl1cykgOworCisJdG9sZXJhbmNlID0gKGNhdGNoUmFkaXVzICogZG1hc291bmQuaGFyZC5zcGVlZCkgLyAxMDA7CisJaWYgKGRtYXNvdW5kLnNvZnQuc3BlZWQgPj0gZG1hc291bmQuaGFyZC5zcGVlZCAtIHRvbGVyYW5jZSkgeworCQlkbWFzb3VuZC50cmFuc193cml0ZSA9ICZ0cmFuc0F3YWNzTm9ybWFsOworCQlkbWFzb3VuZC50cmFuc19yZWFkID0gJnRyYW5zQXdhY3NOb3JtYWxSZWFkOworCX0gZWxzZSB7CisJCWRtYXNvdW5kLnRyYW5zX3dyaXRlID0gJnRyYW5zQXdhY3NFeHBhbmQ7CisJCWRtYXNvdW5kLnRyYW5zX3JlYWQgPSAmdHJhbnNBd2Fjc0V4cGFuZFJlYWQ7CisJfQorCisJaWYgKGF3YWNzKSB7CisJCWlmIChod19jYW5fYnl0ZXN3YXAgJiYgKGRtYXNvdW5kLmhhcmQuZm9ybWF0ID09IEFGTVRfUzE2X0xFKSkKKwkJCW91dF9sZTMyKCZhd2Fjcy0+Ynl0ZXN3YXAsIEJTX1ZBTCk7CisJCWVsc2UKKwkJCW91dF9sZTMyKCZhd2Fjcy0+Ynl0ZXN3YXAsIDApOworCX0KKwkKKwlleHBhbmRfYmFsID0gLWRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJZXhwYW5kX3JlYWRfYmFsID0gLWRtYXNvdW5kLnNvZnQuc3BlZWQ7Cit9CisKK3N0YXRpYyBpbnQgUE1hY1NldEZvcm1hdChpbnQgZm9ybWF0KQoreworCWludCBzaXplOworCWludCByZXFfZm9ybWF0ID0gZm9ybWF0OworCQkKKwlzd2l0Y2ggKGZvcm1hdCkgeworCWNhc2UgQUZNVF9RVUVSWToKKwkJcmV0dXJuIGRtYXNvdW5kLnNvZnQuZm9ybWF0OworCWNhc2UgQUZNVF9NVV9MQVc6CisJY2FzZSBBRk1UX0FfTEFXOgorCWNhc2UgQUZNVF9VODoKKwljYXNlIEFGTVRfUzg6CisJCXNpemUgPSA4OworCQlicmVhazsKKwljYXNlIEFGTVRfUzE2X0xFOgorCQlpZighaHdfY2FuX2J5dGVzd2FwKQorCQkJZm9ybWF0ID0gQUZNVF9TMTZfQkU7CisJY2FzZSBBRk1UX1MxNl9CRToKKwkJc2l6ZSA9IDE2OworCQlicmVhazsKKwljYXNlIEFGTVRfVTE2X0xFOgorCQlpZighaHdfY2FuX2J5dGVzd2FwKQorCQkJZm9ybWF0ID0gQUZNVF9VMTZfQkU7CisJY2FzZSBBRk1UX1UxNl9CRToKKwkJc2l6ZSA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OiAvKiA6LSkgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZDogdW5rbm93biBmb3JtYXQgMHgleCwgdXNpbmcgQUZNVF9VOFxuIiwKKwkJICAgICAgIGZvcm1hdCk7CisJCXNpemUgPSA4OworCQlmb3JtYXQgPSBBRk1UX1U4OworCX0KKwkKKwlpZiAocmVxX2Zvcm1hdCA9PSBmb3JtYXQpIHsKKwkJZG1hc291bmQuc29mdC5mb3JtYXQgPSBmb3JtYXQ7CisJCWRtYXNvdW5kLnNvZnQuc2l6ZSA9IHNpemU7CisJCWlmIChkbWFzb3VuZC5taW5EZXYgPT0gU05EX0RFVl9EU1ApIHsKKwkJCWRtYXNvdW5kLmRzcC5mb3JtYXQgPSBmb3JtYXQ7CisJCQlkbWFzb3VuZC5kc3Auc2l6ZSA9IHNpemU7CisJCX0KKwl9CisKKwlyZXR1cm4gZm9ybWF0OworfQorCisjZGVmaW5lIEFXQUNTX1ZPTFVNRV9UT19NQVNLKHgpCSgxNSAtICgoKCh4KSAtIDEpICogMTUpIC8gOTkpKQorI2RlZmluZSBBV0FDU19NQVNLX1RPX1ZPTFVNRSh5KQkoMTAwIC0gKCh5KSAqIDk5IC8gMTUpKQorCitzdGF0aWMgaW50IGF3YWNzX2dldF92b2x1bWUoaW50IHJlZywgaW50IGxzaGlmdCkKK3sKKwlpbnQgdm9sdW1lOworCisJdm9sdW1lID0gQVdBQ1NfTUFTS19UT19WT0xVTUUoKHJlZyA+PiBsc2hpZnQpICYgMHhmKTsKKwl2b2x1bWUgfD0gQVdBQ1NfTUFTS19UT19WT0xVTUUocmVnICYgMHhmKSA8PCA4OworCXJldHVybiB2b2x1bWU7Cit9CisKK3N0YXRpYyBpbnQgYXdhY3Nfdm9sdW1lX3NldHRlcihpbnQgdm9sdW1lLCBpbnQgbiwgaW50IG11dGUsIGludCBsc2hpZnQpCit7CisJaW50IHIxLCBybjsKKworCWlmIChtdXRlICYmIHZvbHVtZSA9PSAwKSB7CisJCXIxID0gYXdhY3NfcmVnWzFdIHwgbXV0ZTsKKwl9IGVsc2UgeworCQlyMSA9IGF3YWNzX3JlZ1sxXSAmIH5tdXRlOworCQlybiA9IGF3YWNzX3JlZ1tuXSAmIH4oMHhmIHwgKDB4ZiA8PCBsc2hpZnQpKTsKKwkJcm4gfD0gKChBV0FDU19WT0xVTUVfVE9fTUFTSyh2b2x1bWUgJiAweGZmKSAmIDB4ZikgPDwgbHNoaWZ0KTsKKwkJcm4gfD0gQVdBQ1NfVk9MVU1FX1RPX01BU0soKHZvbHVtZSA+PiA4KSAmIDB4ZmYpICYgMHhmOworCQlhd2Fjc19yZWdbbl0gPSBybjsKKwkJYXdhY3Nfd3JpdGUoKG4gPDwgMTIpIHwgcm4pOworCQl2b2x1bWUgPSBhd2Fjc19nZXRfdm9sdW1lKHJuLCBsc2hpZnQpOworCX0KKwlpZiAocjEgIT0gYXdhY3NfcmVnWzFdKSB7CisJCWF3YWNzX3JlZ1sxXSA9IHIxOworCQlhd2Fjc193cml0ZShyMSB8IE1BU0tfQUREUjEpOworCX0KKwlyZXR1cm4gdm9sdW1lOworfQorCitzdGF0aWMgaW50IFBNYWNTZXRWb2x1bWUoaW50IHZvbHVtZSkKK3sKKwlwcmludGsoS0VSTl9XQVJOSU5HICJCb2d1cyBjYWxsIHRvIFBNYWNTZXRWb2x1bWUgIVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGF3YWNzX3NldHVwX2Zvcl9iZWVwKGludCBzcGVlZCkKK3sKKwlvdXRfbGUzMigmYXdhY3MtPmNvbnRyb2wsCisJCSAoaW5fbGUzMigmYXdhY3MtPmNvbnRyb2wpICYgfjB4MWYwMCkKKwkJIHwgKChzcGVlZCA+IDAgPyBzcGVlZCA6IGF3YWNzX3JhdGVfaW5kZXgpIDw8IDgpKTsKKworCWlmIChod19jYW5fYnl0ZXN3YXAgJiYgKGRtYXNvdW5kLmhhcmQuZm9ybWF0ID09IEFGTVRfUzE2X0xFKSAmJiBzcGVlZCA9PSAtMSkKKwkJb3V0X2xlMzIoJmF3YWNzLT5ieXRlc3dhcCwgQlNfVkFMKTsKKwllbHNlCisJCW91dF9sZTMyKCZhd2Fjcy0+Ynl0ZXN3YXAsIDApOworfQorCisvKiBDSEVDSzogaG93IG11Y2ggb2YgdGhpcyAqcmVhbGx5KiBuZWVkcyBJUlFzIG1hc2tlZD8gKi8KK3N0YXRpYyB2b2lkIF9fUE1hY1BsYXkodm9pZCkKK3sKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKwlpbnQgbmV4dF9mcmcsIGNvdW50OworCisJY291bnQgPSAzMDAgOyAvKiA+IHR3byBjeWNsZXMgYXQgdGhlIGxvd2VzdCBzYW1wbGUgcmF0ZSAqLworCisJLyogd2hhdCB3ZSB3YW50IHRvIHNlbmQgbmV4dCAqLworCW5leHRfZnJnID0gKHdyaXRlX3NxLmZyb250ICsgd3JpdGVfc3EuYWN0aXZlKSAlIHdyaXRlX3NxLm1heF9jb3VudDsKKworCWlmIChhd2Fjc19iZWVwX3N0YXRlKSB7CisJCS8qIHNvdW5kIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBiZWVwcyAqLworCQkvKiBzdG9wIHRoZSBkbWEgY2hhbm5lbCAqLworCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYpOworCQl3aGlsZSAoIChpbl9sZTMyKCZhd2Fjc190eGRtYS0+c3RhdHVzKSAmIFJVTikgJiYgY291bnQtLSkKKwkJCXVkZWxheSgxKTsKKwkJaWYgKGF3YWNzKQorCQkJYXdhY3Nfc2V0dXBfZm9yX2JlZXAoLTEpOworCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNtZHB0ciwKKwkJCSB2aXJ0X3RvX2J1cygmKGF3YWNzX3R4X2NtZHNbbmV4dF9mcmddKSkpOworCisJCWJlZXBfcGxheWluZyA9IDA7CisJCWF3YWNzX2JlZXBfc3RhdGUgPSAwOworCX0KKwkvKiB0aGlzIHdvbid0IGFsbG93IG1vcmUgdGhhbiB0d28gZnJhZ3MgdG8gYmUgaW4gdGhlIG91dHB1dCBxdWV1ZSBhdAorCSAgIG9uY2UuIChvciBvbmUsIGlmIHRoZSBtYXggZnJhZ3MgaXMgMiAtIGJlY2F1c2UgY291bnQgY2FuJ3QgZXhjZWVkCisJICAgMiBpbiB0aGF0IGNhc2UpCisJKi8KKwl3aGlsZSAod3JpdGVfc3EuYWN0aXZlIDwgMiAmJiB3cml0ZV9zcS5hY3RpdmUgPCB3cml0ZV9zcS5jb3VudCkgeworCQljb3VudCA9ICh3cml0ZV9zcS5jb3VudCA9PSB3cml0ZV9zcS5hY3RpdmUgKyAxKSA/CisJCQkJd3JpdGVfc3EucmVhcl9zaXplOndyaXRlX3NxLmJsb2NrX3NpemUgOworCQlpZiAoY291bnQgPCB3cml0ZV9zcS5ibG9ja19zaXplKSB7CisJCQlpZiAoIXdyaXRlX3NxLnN5bmNpbmcpIC8qIGxhc3QgYmxvY2sgbm90IHlldCBmaWxsZWQsKi8KKwkJCQlicmVhazsgCS8qIGFuZCB3ZSdyZSBub3Qgc3luY2luZyBvciBQT1NULWVkICovCisJCQllbHNlIHsKKwkJCQkvKiBwcmV0ZW5kIHRoZSBibG9jayBpcyBmdWxsIHRvIGZvcmNlIGEgbmV3CisJCQkJICAgYmxvY2sgdG8gYmUgc3RhcnRlZCBvbiB0aGUgbmV4dCB3cml0ZSAqLworCQkJCXdyaXRlX3NxLnJlYXJfc2l6ZSA9IHdyaXRlX3NxLmJsb2NrX3NpemUgOworCQkJCXdyaXRlX3NxLnN5bmNpbmcgJj0gfjIgOyAvKiBjbGVhciBQT1NUICovCisJCQl9CisJCX0KKwkJY3AgPSAmYXdhY3NfdHhfY21kc1tuZXh0X2ZyZ107CisJCXN0X2xlMTYoJmNwLT5yZXFfY291bnQsIGNvdW50KTsKKwkJc3RfbGUxNigmY3AtPnhmZXJfc3RhdHVzLCAwKTsKKwkJc3RfbGUxNigmY3AtPmNvbW1hbmQsIE9VVFBVVF9NT1JFICsgSU5UUl9BTFdBWVMpOworCQkvKiBwdXQgYSBTVE9QIGF0IHRoZSBlbmQgb2YgdGhlIHF1ZXVlIC0gYnV0IG9ubHkgaWYgd2UgaGF2ZQorCQkgICBzcGFjZSBmb3IgaXQuICBUaGlzIG1lYW5zIHRoYXQsIGlmIHdlIHVuZGVyLXJ1biBhbmQgd2Ugb25seQorCQkgICBoYXZlIHR3byBmcmFnbWVudHMsIHdlIG1pZ2h0IHJlLXBsYXkgc291bmQgZnJvbSBhbiBleGlzdGluZworCQkgICBxdWV1ZWQgZnJhZy4gIEkgZ3Vlc3MgdGhlIHNvbHV0aW9uIHRvIHRoYXQgaXMgbm90IHRvIHNldCB0d28KKwkJICAgZnJhZ3MgaWYgeW91IGFyZSBsaWtlbHkgdG8gdW5kZXItcnVuLi4uCisJCSovCisJCWlmICh3cml0ZV9zcS5jb3VudCA8IHdyaXRlX3NxLm1heF9jb3VudCkgeworCQkJaWYgKCsrbmV4dF9mcmcgPj0gd3JpdGVfc3EubWF4X2NvdW50KQorCQkJCW5leHRfZnJnID0gMCA7IC8qIHdyYXAgKi8KKwkJCS8qIGlmIHdlIGdldCBoZXJlIHRoZW4gd2UndmUgdW5kZXJydW4gc28gd2Ugd2lsbCBzdG9wKi8KKwkJCXN0X2xlMTYoJmF3YWNzX3R4X2NtZHNbbmV4dF9mcmddLmNvbW1hbmQsIERCRE1BX1NUT1ApOworCQl9CisJCS8qIHNldCB0aGUgZGJkbWEgY29udHJvbGxlciBnb2luZywgaWYgaXQgaXMgbm90IGFscmVhZHkgKi8KKwkJaWYgKHdyaXRlX3NxLmFjdGl2ZSA9PSAwKQorCQkJb3V0X2xlMzIoJmF3YWNzX3R4ZG1hLT5jbWRwdHIsIHZpcnRfdG9fYnVzKGNwKSk7CisJCSh2b2lkKWluX2xlMzIoJmF3YWNzX3R4ZG1hLT5zdGF0dXMpOworCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNvbnRyb2wsICgoUlVOfFdBS0UpIDw8IDE2KSArIChSVU58V0FLRSkpOworCQkrK3dyaXRlX3NxLmFjdGl2ZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIFBNYWNQbGF5KHZvaWQpCit7CisJTE9DSygpOworCWlmICghYXdhY3Nfc2xlZXBpbmcpIHsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCQlfX1BNYWNQbGF5KCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKwl9CisJVU5MT0NLKCk7Cit9CisKK3N0YXRpYyB2b2lkIFBNYWNSZWNvcmQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJlYWRfc3EuYWN0aXZlKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCisJLyogVGhpcyBpcyBhbGwgd2UgaGF2ZSB0byBkby4uLi4uLkp1c3Qgc3RhcnQgaXQgdXAuCisJKi8KKwlvdXRfbGUzMigmYXdhY3NfcnhkbWEtPmNvbnRyb2wsICgoUlVOfFdBS0UpIDw8IDE2KSArIChSVU58V0FLRSkpOworCXJlYWRfc3EuYWN0aXZlID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKK30KKworLyogaWYgdGhlIFRYIHN0YXR1cyBjb21lcyB1cCAiREVBRCIgLSByZXBvcnRlZCBvbiBzb21lIFBvd2VyIENvbXB1dGluZyBtYWNoaW5lcworICAgd2UgbmVlZCB0byByZS1zdGFydCB0aGUgZGJkbWEgLSBidXQgZnJvbSBhIGRpZmZlcmVudCBwaHlzaWNhbCBzdGFydCBhZGRyZXNzCisgICBhbmQgd2l0aCBhIGRpZmZlcmVudCB0cmFuc2ZlciBsZW5ndGguICBJdCB3b3VsZCBnZXQgdmVyeSBtZXNzeSB0byBkbyB0aGlzCisgICB3aXRoIHRoZSBub3JtYWwgZGJkbWFfY21kIGJsb2NrcyAtIHdlIHdvdWxkIGhhdmUgdG8gcmUtd3JpdGUgdGhlIGJ1ZmZlciBzdGFydAorICAgYWRkcmVzc2VzIGVhY2ggdGltZS4gIFNvLCB3ZSB3aWxsIGtlZXAgYSBzaW5nbGUgZGJkbWFfY21kIGJsb2NrIHdoaWNoIGNhbiBiZQorICAgZmlkZGxlZCB3aXRoLgorICAgV2hlbiBERUFEIHN0YXR1cyBpcyBmaXJzdCByZXBvcnRlZCB0aGUgY29udGVudCBvZiB0aGUgZmF1bHRlZCBkYmRtYSBibG9jayBpcworICAgY29waWVkIGludG8gdGhlIGVtZXJnZW5jeSBidWZmZXIgYW5kIHdlIG5vdGUgdGhhdCB0aGUgYnVmZmVyIGlzIGluIHVzZS4KKyAgIHdlIHRoZW4gYnVtcCB0aGUgc3RhcnQgcGh5c2ljYWwgYWRkcmVzcyBieSB0aGUgYW1vdW50IHRoYXQgd2FzIHN1Y2Nlc3NmdWxseQorICAgb3V0cHV0IGJlZm9yZSBpdCBkaWVkLgorICAgT24gYW55IHN1YnNlcXVlbnQgREVBRCByZXN1bHQgd2UganVzdCBkbyB0aGUgYnVtcC11cHMgKHdlIGtub3cgdGhhdCB3ZSBhcmUKKyAgIGFscmVhZHkgdXNpbmcgdGhlIGVtZXJnZW5jeSBkYmRtYV9jbWQpLgorICAgQ0hFQ0s6IHRoaXMganVzdCB0cmllcyB0byAiZG8gaXQiLiAgSXQgaXMgcG9zc2libGUgdGhhdCB3ZSBzaG91bGQgYWJhbmRvbgorICAgeGZlcnMgd2hlbiB0aGUgbnVtYmVyIG9mIHJlc2lkdWFsIGJ5dGVzIGdldHMgYmVsb3cgYSBjZXJ0YWluIHZhbHVlIC0gSSBjYW4KKyAgIHNlZSB0aGF0IHRoaXMgbWlnaHQgY2F1c2UgYSBsb29wLWZvcmV2ZXIgaWYgdG9vIHNtYWxsIGEgdHJhbnNmZXIgY2F1c2VzCisgICBERUFEIHN0YXR1cy4gIEhvd2V2ZXIgdGhpcyBpcyBhIFRPRE8gZm9yIG5vdyAtIHdlJ2xsIHNlZSB3aGF0IGdldHMgcmVwb3J0ZWQuCisgICBXaGVuIHdlIGdldCBhIHN1Y2Nlc3NmdWwgdHJhbnNmZXIgcmVzdWx0IHdpdGggdGhlIGVtZXJnZW5jeSBidWZmZXIgd2UganVzdAorICAgcHJldGVuZCB0aGF0IGl0IGNvbXBsZXRlZCB1c2luZyB0aGUgb3JpZ2luYWwgZG1kbWFfY21kIGFuZCBjYXJyeSBvbi4gIFRoZQorICAgJ25leHRfY21kJyBmaWVsZCB3aWxsIGFscmVhZHkgcG9pbnQgYmFjayB0byB0aGUgb3JpZ2luYWwgbG9vcCBvZiBibG9ja3MuCisqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK3BtYWNfYXdhY3NfdHhfaW50cihpbnQgaXJxLCB2b2lkICpkZXZpZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaW50IGkgPSB3cml0ZV9zcS5mcm9udDsKKwlpbnQgc3RhdDsKKwlpbnQgaV9ub3dyYXAgPSB3cml0ZV9zcS5mcm9udDsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKwkvKiAhPSAwIHdoZW4gd2UgYXJlIGRlYWxpbmcgd2l0aCBhIERFQUQgeGZlciAqLworCXN0YXRpYyBpbnQgZW1lcmdlbmN5X2luX3VzZTsKKworCXNwaW5fbG9jaygmZG1hc291bmQubG9jayk7CisJd2hpbGUgKHdyaXRlX3NxLmFjdGl2ZSA+IDApIHsgLyogd2UgZXhwZWN0IHRvIGhhdmUgZG9uZSBzb21ldGhpbmcqLworCQlpZiAoZW1lcmdlbmN5X2luX3VzZSkgLyogd2UgYXJlIGRlYWxpbmcgd2l0aCBERUFEIHhmZXIgKi8KKwkJCWNwID0gZW1lcmdlbmN5X2RiZG1hX2NtZCA7CisJCWVsc2UKKwkJCWNwID0gJmF3YWNzX3R4X2NtZHNbaV07CisJCXN0YXQgPSBsZF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMpOworCQlpZiAoc3RhdCAmIERFQUQpIHsKKwkJCXVuc2lnbmVkIHNob3J0IHJlcSwgcmVzIDsKKwkJCXVuc2lnbmVkIGludCBwaHkgOworI2lmZGVmIERFQlVHX0RNQVNPVU5ECitwcmludGsoImRtYXNvdW5kX3BtYWM6IHR4LWlycTogeGZlciBkaWVkIC0gcGF0Y2hpbmcgaXQgdXAuLi5cbiIpIDsKKyNlbmRpZgorCQkJLyogdG8gY2xlYXIgREVBRCBzdGF0dXMgd2UgbXVzdCBmaXJzdCBjbGVhciBSVU4KKwkJCSAgIHNldCBpdCB0byBxdWllc2NlbnQgdG8gYmUgb24gdGhlIHNhZmUgc2lkZSAqLworCQkJKHZvaWQpaW5fbGUzMigmYXdhY3NfdHhkbWEtPnN0YXR1cyk7CisJCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNvbnRyb2wsCisJCQkJKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNik7CisJCQl3cml0ZV9zcS5kaWVkKysgOworCQkJaWYgKCFlbWVyZ2VuY3lfaW5fdXNlKSB7IC8qIG5ldyBwcm9ibGVtICovCisJCQkJbWVtY3B5KCh2b2lkICopZW1lcmdlbmN5X2RiZG1hX2NtZCwgKHZvaWQgKiljcCwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpKTsKKwkJCQllbWVyZ2VuY3lfaW5fdXNlID0gMTsKKwkJCQljcCA9IGVtZXJnZW5jeV9kYmRtYV9jbWQ7CisJCQl9CisJCQkvKiBub3cgYnVtcCB0aGUgdmFsdWVzIHRvIHJlZmxlY3QgdGhlIGFtb3VudAorCQkJICAgd2UgaGF2ZW4ndCB5ZXQgc2hpZnRlZCAqLworCQkJcmVxID0gbGRfbGUxNigmY3AtPnJlcV9jb3VudCk7CisJCQlyZXMgPSBsZF9sZTE2KCZjcC0+cmVzX2NvdW50KTsKKwkJCXBoeSA9IGxkX2xlMzIoJmNwLT5waHlfYWRkcik7CisJCQlwaHkgKz0gKHJlcSAtIHJlcyk7CisJCQlzdF9sZTE2KCZjcC0+cmVxX2NvdW50LCByZXMpOworCQkJc3RfbGUxNigmY3AtPnJlc19jb3VudCwgMCk7CisJCQlzdF9sZTE2KCZjcC0+eGZlcl9zdGF0dXMsIDApOworCQkJc3RfbGUzMigmY3AtPnBoeV9hZGRyLCBwaHkpOworCQkJc3RfbGUzMigmY3AtPmNtZF9kZXAsIHZpcnRfdG9fYnVzKCZhd2Fjc190eF9jbWRzWyhpKzEpJXdyaXRlX3NxLm1heF9jb3VudF0pKTsKKwkJCXN0X2xlMTYoJmNwLT5jb21tYW5kLCBPVVRQVVRfTU9SRSB8IEJSX0FMV0FZUyB8IElOVFJfQUxXQVlTKTsKKwkJCQorCQkJLyogcG9pbnQgYXQgb3VyIHBhdGNoZWQgdXAgY29tbWFuZCBibG9jayAqLworCQkJb3V0X2xlMzIoJmF3YWNzX3R4ZG1hLT5jbWRwdHIsIHZpcnRfdG9fYnVzKGNwKSk7CisJCQkvKiB3ZSBtdXN0IHJlLXN0YXJ0IHRoZSBjb250cm9sbGVyICovCisJCQkodm9pZClpbl9sZTMyKCZhd2Fjc190eGRtYS0+c3RhdHVzKTsKKwkJCS8qIHNob3VsZCBjb21wbGV0ZSBjbGVhcmluZyB0aGUgREVBRCBzdGF0dXMgKi8KKwkJCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y29udHJvbCwKKwkJCQkoKFJVTnxXQUtFKSA8PCAxNikgKyAoUlVOfFdBS0UpKTsKKwkJCWJyZWFrOyAvKiB0aGlzIGJsb2NrIGlzIHN0aWxsIGdvaW5nICovCisJCX0KKwkJaWYgKChzdGF0ICYgQUNUSVZFKSA9PSAwKQorCQkJYnJlYWs7CS8qIHRoaXMgZnJhbWUgaXMgc3RpbGwgZ29pbmcgKi8KKwkJaWYgKGVtZXJnZW5jeV9pbl91c2UpCisJCQllbWVyZ2VuY3lfaW5fdXNlID0gMCA7IC8qIGRvbmUgdGhhdCAqLworCQktLXdyaXRlX3NxLmNvdW50OworCQktLXdyaXRlX3NxLmFjdGl2ZTsKKwkJaV9ub3dyYXArKzsKKwkJaWYgKCsraSA+PSB3cml0ZV9zcS5tYXhfY291bnQpCisJCQlpID0gMDsKKwl9CisKKwkvKiBpZiB3ZSBzdG9wcGVkIGFuZCB3ZSB3ZXJlIG5vdCBzeW5jLWluZyAtIHRoZW4gd2UgdW5kZXItcmFuICovCisJaWYoIHdyaXRlX3NxLnN5bmNpbmcgPT0gMCApeworCQlzdGF0ID0gaW5fbGUzMigmYXdhY3NfdHhkbWEtPnN0YXR1cykgOworCQkvKiB3ZSBoaXQgdGhlIGRiZG1hX3N0b3AgKi8KKwkJaWYoIChzdGF0ICYgQUNUSVZFKSA9PSAwICkgd3JpdGVfc3EueHJ1bnMrKyA7CisJfQorCisJLyogaWYgd2UgdXNlZCBzb21lIGRhdGEgdXAgdGhlbiB3YWtlIHRoZSB3cml0ZXIgdG8gc3VwcGx5IHNvbWUgbW9yZSovCisJaWYgKGlfbm93cmFwICE9IHdyaXRlX3NxLmZyb250KQorCQlXQUtFX1VQKHdyaXRlX3NxLmFjdGlvbl9xdWV1ZSk7CisJd3JpdGVfc3EuZnJvbnQgPSBpOworCisJLyogYnV0IG1ha2Ugc3VyZSB3ZSBmdW5uZWwgd2hhdCB3ZSd2ZSBhbHJlYWR5IGdvdCAqL1wKKwkgaWYgKCFhd2Fjc19zbGVlcGluZykKKwkJX19QTWFjUGxheSgpOworCisJLyogbWFrZSB0aGUgd2FrZS1vbi1lbXB0eSBjb25kaXRpb25hbCBvbiBzeW5jaW5nICovCisJaWYgKCF3cml0ZV9zcS5hY3RpdmUgJiYgKHdyaXRlX3NxLnN5bmNpbmcgJiAxKSkKKwkJV0FLRV9VUCh3cml0ZV9zcS5zeW5jX3F1ZXVlKTsgLyogYW55IHRpbWUgd2UncmUgZW1wdHkgKi8KKwlzcGluX3VubG9jaygmZG1hc291bmQubG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorcG1hY19hd2Fjc19yeF9pbnRyKGludCBpcnEsIHZvaWQgKmRldmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgc3RhdCA7CisJLyogRm9yIHNvbWUgcmVhc29uIG9uIG15IFBvd2VyQm9vayBHMywgSSBnZXQgb25lIGludGVycnVwdAorCSAqIHdoZW4gdGhlIGludGVycnVwdCB2ZWN0b3IgaXMgaW5zdGFsbGVkIChsaWtlIHNvbWV0aGluZyBpcworCSAqIHBlbmRpbmcpLiAgVGhpcyBoYXBwZW5zIGJlZm9yZSB0aGUgZGJkbWEgaXMgaW5pdGlhbGl6ZWQgYnkKKwkgKiB1cywgc28gSSBqdXN0IGNoZWNrIHRoZSBjb21tYW5kIHBvaW50ZXIgYW5kIGlmIGl0IGlzIHplcm8sCisJICoganVzdCBibG93IGl0IG9mZi4KKwkgKi8KKwlpZiAoaW5fbGUzMigmYXdhY3NfcnhkbWEtPmNtZHB0cikgPT0gMCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJLyogV2UgYWxzbyB3YW50IHRvIGJsb3cgJ2VtIG9mZiB3aGVuIHNodXR0aW5nIGRvd24uCisJKi8KKwlpZiAocmVhZF9zcS5hY3RpdmUgPT0gMCkKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCisJc3Bpbl9sb2NrKCZkbWFzb3VuZC5sb2NrKTsKKwkvKiBDaGVjayBtdWx0aXBsZSBidWZmZXJzIGluIGNhc2Ugd2Ugd2VyZSBoZWxkIG9mZiBmcm9tCisJICogaW50ZXJydXB0IHByb2Nlc3NpbmcgZm9yIGEgbG9uZyB0aW1lLiAgR2VlemUsIEkgcmVhbGx5IGhvcGUKKwkgKiB0aGlzIGRvZXNuJ3QgaGFwcGVuLgorCSAqLworCXdoaWxlICgoc3RhdD1hd2Fjc19yeF9jbWRzW3JlYWRfc3EucmVhcl0ueGZlcl9zdGF0dXMpKSB7CisKKwkJLyogaWYgd2UgZ290IGEgIkRFQUQiIHN0YXR1cyB0aGVuIGp1c3QgbG9nIGl0IGZvciBub3cuCisJCSAgIGFuZCB0cnkgdG8gcmVzdGFydCBkbWEuCisJCSAgIFRPRE86IGZpZ3VyZSBvdXQgaG93IGJlc3QgdG8gZml4IGl0IHVwCisJCSovCisJCWlmIChzdGF0ICYgREVBRCl7CisjaWZkZWYgREVCVUdfRE1BU09VTkQKK3ByaW50aygiZG1hc291bmRfcG1hYzogcngtaXJxOiBESUVEIC0gYXR0ZW1wdGluZyByZXN1cmVjdGlvblxuIik7CisjZW5kaWYKKwkJCS8qIHRvIGNsZWFyIERFQUQgc3RhdHVzIHdlIG11c3QgZmlyc3QgY2xlYXIgUlVOCisJCQkgICBzZXQgaXQgdG8gcXVpZXNjZW50IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgKi8KKwkJCSh2b2lkKWluX2xlMzIoJmF3YWNzX3R4ZG1hLT5zdGF0dXMpOworCQkJb3V0X2xlMzIoJmF3YWNzX3R4ZG1hLT5jb250cm9sLAorCQkJCShSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYpOworCQkJYXdhY3NfcnhfY21kc1tyZWFkX3NxLnJlYXJdLnhmZXJfc3RhdHVzID0gMDsKKwkJCWF3YWNzX3J4X2NtZHNbcmVhZF9zcS5yZWFyXS5yZXNfY291bnQgPSAwOworCQkJcmVhZF9zcS5kaWVkKysgOworCQkJKHZvaWQpaW5fbGUzMigmYXdhY3NfdHhkbWEtPnN0YXR1cyk7CisJCQkvKiByZS1zdGFydCB0aGUgc2FtZSBibG9jayAqLworCQkJb3V0X2xlMzIoJmF3YWNzX3J4ZG1hLT5jbWRwdHIsCisJCQkJdmlydF90b19idXMoJmF3YWNzX3J4X2NtZHNbcmVhZF9zcS5yZWFyXSkpOworCQkJLyogd2UgbXVzdCByZS1zdGFydCB0aGUgY29udHJvbGxlciAqLworCQkJKHZvaWQpaW5fbGUzMigmYXdhY3NfcnhkbWEtPnN0YXR1cyk7CisJCQkvKiBzaG91bGQgY29tcGxldGUgY2xlYXJpbmcgdGhlIERFQUQgc3RhdHVzICovCisJCQlvdXRfbGUzMigmYXdhY3NfcnhkbWEtPmNvbnRyb2wsCisJCQkJKChSVU58V0FLRSkgPDwgMTYpICsgKFJVTnxXQUtFKSk7CisJCQlzcGluX3VubG9jaygmZG1hc291bmQubG9jayk7CisJCQlyZXR1cm4gSVJRX0hBTkRMRUQ7IC8qIHRyeSB0aGlzIGJsb2NrIGFnYWluICovCisJCX0KKwkJLyogQ2xlYXIgc3RhdHVzIGFuZCBtb3ZlIG9uIHRvIG5leHQgYnVmZmVyLgorCQkqLworCQlhd2Fjc19yeF9jbWRzW3JlYWRfc3EucmVhcl0ueGZlcl9zdGF0dXMgPSAwOworCQlyZWFkX3NxLnJlYXIrKzsKKworCQkvKiBXcmFwIHRoZSBidWZmZXIgcmluZy4KKwkJKi8KKwkJaWYgKHJlYWRfc3EucmVhciA+PSByZWFkX3NxLm1heF9hY3RpdmUpCisJCQlyZWFkX3NxLnJlYXIgPSAwOworCisJCS8qIElmIHdlIGhhdmUgY2F1Z2h0IHVwIHRvIHRoZSBmcm9udCBidWZmZXIsIGJ1bXAgaXQuCisJCSAqIFRoaXMgd2lsbCBjYXVzZSB3ZWlyZCAoYnV0IG5vdCBmYXRhbCkgcmVzdWx0cyBpZiB0aGUKKwkJICogcmVhZCBsb29wIGlzIGN1cnJlbnRseSB1c2luZyB0aGlzIGJ1ZmZlci4gIFRoZSB1c2VyIGlzCisJCSAqIGJlaGluZCBpbiB0aGlzIGNhc2UgYW55d2F5LCBzbyB3ZWlyZCB0aGluZ3MgYXJlIGdvaW5nCisJCSAqIHRvIGhhcHBlbi4KKwkJICovCisJCWlmIChyZWFkX3NxLnJlYXIgPT0gcmVhZF9zcS5mcm9udCkgeworCQkJcmVhZF9zcS5mcm9udCsrOworCQkJcmVhZF9zcS54cnVucysrIDsgLyogd2Ugb3ZlcmFuICovCisJCQlpZiAocmVhZF9zcS5mcm9udCA+PSByZWFkX3NxLm1heF9hY3RpdmUpCisJCQkJcmVhZF9zcS5mcm9udCA9IDA7CisJCX0KKwl9CisKKwlXQUtFX1VQKHJlYWRfc3EuYWN0aW9uX3F1ZXVlKTsKKwlzcGluX3VubG9jaygmZG1hc291bmQubG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorcG1hY19hd2Fjc19pbnRyKGludCBpcnEsIHZvaWQgKmRldmlkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgY3RybDsKKwlpbnQgc3RhdHVzOworCWludCByMTsKKworCXNwaW5fbG9jaygmZG1hc291bmQubG9jayk7CisJY3RybCA9IGluX2xlMzIoJmF3YWNzLT5jb250cm9sKTsKKwlzdGF0dXMgPSBpbl9sZTMyKCZhd2Fjcy0+Y29kZWNfc3RhdCk7CisKKwlpZiAoY3RybCAmIE1BU0tfUE9SVENIRykgeworCQkvKiB0ZXN0ZWQgb24gU2NyZWFtZXIsIHNob3VsZCB3b3JrIG9uIG90aGVycyB0b28gKi8KKwkJaWYgKGF3YWNzX3JldmlzaW9uID09IEFXQUNTX1NDUkVBTUVSKSB7CisJCQlpZiAoKChzdGF0dXMgJiBNQVNLX0hEUENPTk4pID4+IDMpICYmIChoZHBfY29ubmVjdGVkID09IDApKSB7CisJCQkJaGRwX2Nvbm5lY3RlZCA9IDE7CisJCQkJCisJCQkJcjEgPSBhd2Fjc19yZWdbMV0gfCBNQVNLX1NQS01VVEU7CisJCQkJYXdhY3NfcmVnWzFdID0gcjE7CisJCQkJYXdhY3Nfd3JpdGUocjEgfCBNQVNLX0FERFJfTVVURSk7CisJCQl9IGVsc2UgaWYgKCgoc3RhdHVzICYgTUFTS19IRFBDT05OKSA+PiAzID09IDApICYmIChoZHBfY29ubmVjdGVkID09IDEpKSB7CisJCQkJaGRwX2Nvbm5lY3RlZCA9IDA7CisJCQkJCisJCQkJcjEgPSBhd2Fjc19yZWdbMV0gJiB+TUFTS19TUEtNVVRFOworCQkJCWF3YWNzX3JlZ1sxXSA9IHIxOworCQkJCWF3YWNzX3dyaXRlKHIxIHwgTUFTS19BRERSX01VVEUpOworCQkJfQorCQl9CisJfQorCWlmIChjdHJsICYgTUFTS19DTlRMRVJSKSB7CisJCWludCBlcnIgPSAoaW5fbGUzMigmYXdhY3MtPmNvZGVjX3N0YXQpICYgTUFTS19FUlJDT0RFKSA+PiAxNjsKKwkJLyogQ0hFQ0s6IHdlIGp1c3Qgc3dhbGxvdyBidXJndW5keSBlcnJvcnMgYXQgdGhlIG1vbWVudC4uKi8KKwkJaWYgKGVyciAhPSAwICYmIGF3YWNzX3JldmlzaW9uICE9IEFXQUNTX0JVUkdVTkRZKQorCQkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZF9wbWFjOiBlcnJvciAleFxuIiwgZXJyKTsKKwl9CisJLyogV3JpdGluZyAxcyB0byB0aGUgQ05UTEVSUiBhbmQgUE9SVENIRyBiaXRzIGNsZWFycyB0aGVtLi4uICovCisJb3V0X2xlMzIoJmF3YWNzLT5jb250cm9sLCBjdHJsKTsKKwlzcGluX3VubG9jaygmZG1hc291bmQubG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZAorYXdhY3Nfd3JpdGUoaW50IHZhbCkKK3sKKwlpbnQgY291bnQgPSAzMDAgOworCWlmIChhd2Fjc19yZXZpc2lvbiA+PSBBV0FDU19EQUNBIHx8ICFhd2FjcykKKwkJcmV0dXJuIDsKKworCXdoaWxlICgoaW5fbGUzMigmYXdhY3MtPmNvZGVjX2N0cmwpICYgTUFTS19ORVdFQ01EKSAmJiBjb3VudC0tKQorCQl1ZGVsYXkoMSkgOwkvKiB0aW1lb3V0IGlzID4gMiBzYW1wbGVzIGF0IGxvd2VzdCByYXRlICovCisJb3V0X2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsLCB2YWwgfCAoYXdhY3Nfc3ViZnJhbWUgPDwgMjIpKTsKKwkodm9pZClpbl9sZTMyKCZhd2Fjcy0+Ynl0ZXN3YXApOworfQorCisvKiB0aGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBiZWVwIHRpbWVyIGV4cGlyZXMuLi4gaXQgd2lsbCBiZSBjYWxsZWQgZXZlbgorICAgaWYgdGhlIGJlZXAgaGFzIGJlZW4gb3ZlcmlkZGVuIGJ5IG90aGVyIHNvdW5kIG91dHB1dC4KKyovCitzdGF0aWMgdm9pZCBhd2Fjc19ub3NvdW5kKHVuc2lnbmVkIGxvbmcgeHgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQgPSA2MDAgOyAvKiA+IGZvdXIgc2FtcGxlcyBhdCBsb3dlc3QgcmF0ZSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKwlpZiAoYmVlcF9wbGF5aW5nKSB7CisJCXN0X2xlMTYoJmJlZXBfZGJkbWFfY21kLT5jb21tYW5kLCBEQkRNQV9TVE9QKTsKKwkJb3V0X2xlMzIoJmF3YWNzX3R4ZG1hLT5jb250cm9sLCAoUlVOfFBBVVNFfEZMVVNIfFdBS0UpIDw8IDE2KTsKKwkJd2hpbGUgKChpbl9sZTMyKCZhd2Fjc190eGRtYS0+c3RhdHVzKSAmIFJVTikgJiYgY291bnQtLSkKKwkJCXVkZWxheSgxKTsKKwkJaWYgKGF3YWNzKQorCQkJYXdhY3Nfc2V0dXBfZm9yX2JlZXAoLTEpOworCQliZWVwX3BsYXlpbmcgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBXZSBnZW5lcmF0ZSB0aGUgYmVlcCB3aXRoIGEgc2luZ2xlIGRiZG1hIGNvbW1hbmQgdGhhdCBsb29wcyBhIGJ1ZmZlcgorICogZm9yZXZlciAtIHdpdGhvdXQgZ2VuZXJhdGluZyBpbnRlcnJ1cHRzLgorICoKKyAqIFNvLCB0byBzdG9wIGl0IHlvdSBoYXZlIHRvIHN0b3AgZG1hIG91dHB1dCBhcyBwZXIgYXdhY3Nfbm9zb3VuZC4KKyAqLworc3RhdGljIGludCBhd2Fjc19iZWVwX2V2ZW50KHN0cnVjdCBpbnB1dF9kZXYgKmRldiwgdW5zaWduZWQgaW50IHR5cGUsCisJCXVuc2lnbmVkIGludCBjb2RlLCBpbnQgaHopCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYmVlcF9zcGVlZCA9IDA7CisJaW50IHNyYXRlOworCWludCBwZXJpb2QsIG5jeWNsZXMsIG5zYW1wbGVzOworCWludCBpLCBqLCBmOworCXNob3J0ICpwOworCXN0YXRpYyBpbnQgYmVlcF9oel9jYWNoZTsKKwlzdGF0aWMgaW50IGJlZXBfbnNhbXBsZXNfY2FjaGU7CisJc3RhdGljIGludCBiZWVwX3ZvbHVtZV9jYWNoZTsKKworCWlmICh0eXBlICE9IEVWX1NORCkKKwkJcmV0dXJuIC0xOworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgU05EX0JFTEw6CisJCWlmIChoeikKKwkJCWh6ID0gMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBTTkRfVE9ORToKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChiZWVwX2J1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwkvKiBxdWljay1oYWNrIGZpeCBmb3IgREFDQSwgQnVyZ3VuZHkgJiBUdW1ibGVyICovCisKKwlpZiAoYXdhY3NfcmV2aXNpb24gPj0gQVdBQ1NfREFDQSl7CisJCXNyYXRlID0gNDQxMDAgOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCA4ICYmIGF3YWNzX2ZyZXFzW2ldID49IEJFRVBfU1JBVEU7ICsraSkKKwkJCWlmIChhd2Fjc19mcmVxc19va1tpXSkKKwkJCQliZWVwX3NwZWVkID0gaTsKKwkJc3JhdGUgPSBhd2Fjc19mcmVxc1tiZWVwX3NwZWVkXTsKKwl9CisKKwlpZiAoaHogPD0gc3JhdGUgLyBCRUVQX0JVRkxFTiB8fCBoeiA+IHNyYXRlIC8gMikgeworCQkvKiBjYW5jZWwgYmVlcCBjdXJyZW50bHkgcGxheWluZyAqLworCQlhd2Fjc19ub3NvdW5kKDApOworCQlyZXR1cm4gMDsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCWlmIChiZWVwX3BsYXlpbmcgfHwgd3JpdGVfc3EuYWN0aXZlIHx8IGJlZXBfYnVmID09IE5VTEwpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CQkvKiB0b28gaGFyZCwgc29ycnkgOi0oICovCisJfQorCWJlZXBfcGxheWluZyA9IDE7CisJc3RfbGUxNigmYmVlcF9kYmRtYV9jbWQtPmNvbW1hbmQsIE9VVFBVVF9NT1JFICsgQlJfQUxXQVlTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisKKwlpZiAoaHogPT0gYmVlcF9oel9jYWNoZSAmJiBiZWVwX3ZvbCA9PSBiZWVwX3ZvbHVtZV9jYWNoZSkgeworCQluc2FtcGxlcyA9IGJlZXBfbnNhbXBsZXNfY2FjaGU7CisJfSBlbHNlIHsKKwkJcGVyaW9kID0gc3JhdGUgKiAyNTYgLyBoejsJLyogZml4ZWQgcG9pbnQgKi8KKwkJbmN5Y2xlcyA9IEJFRVBfQlVGTEVOICogMjU2IC8gcGVyaW9kOworCQluc2FtcGxlcyA9IChwZXJpb2QgKiBuY3ljbGVzKSA+PiA4OworCQlmID0gbmN5Y2xlcyAqIDY1NTM2IC8gbnNhbXBsZXM7CisJCWogPSAwOworCQlwID0gYmVlcF9idWY7CisJCWZvciAoaSA9IDA7IGkgPCBuc2FtcGxlczsgKytpLCBwICs9IDIpIHsKKwkJCXBbMF0gPSBwWzFdID0gYmVlcF93Zm9ybVtqID4+IDhdICogYmVlcF92b2w7CisJCQlqID0gKGogKyBmKSAmIDB4ZmZmZjsKKwkJfQorCQliZWVwX2h6X2NhY2hlID0gaHo7CisJCWJlZXBfdm9sdW1lX2NhY2hlID0gYmVlcF92b2w7CisJCWJlZXBfbnNhbXBsZXNfY2FjaGUgPSBuc2FtcGxlczsKKwl9CisKKwlzdF9sZTE2KCZiZWVwX2RiZG1hX2NtZC0+cmVxX2NvdW50LCBuc2FtcGxlcyo0KTsKKwlzdF9sZTE2KCZiZWVwX2RiZG1hX2NtZC0+eGZlcl9zdGF0dXMsIDApOworCXN0X2xlMzIoJmJlZXBfZGJkbWFfY21kLT5jbWRfZGVwLCB2aXJ0X3RvX2J1cyhiZWVwX2RiZG1hX2NtZCkpOworCXN0X2xlMzIoJmJlZXBfZGJkbWFfY21kLT5waHlfYWRkciwgdmlydF90b19idXMoYmVlcF9idWYpKTsKKwlhd2Fjc19iZWVwX3N0YXRlID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJaWYgKGJlZXBfcGxheWluZykgewkvKiBpLmUuIGhhdmVuJ3QgYmVlbiB0ZXJtaW5hdGVkIGFscmVhZHkgKi8KKwkJaW50IGNvdW50ID0gMzAwIDsKKwkJb3V0X2xlMzIoJmF3YWNzX3R4ZG1hLT5jb250cm9sLCAoUlVOfFdBS0V8RkxVU0h8UEFVU0UpIDw8IDE2KTsKKwkJd2hpbGUgKChpbl9sZTMyKCZhd2Fjc190eGRtYS0+c3RhdHVzKSAmIFJVTikgJiYgY291bnQtLSkKKwkJCXVkZWxheSgxKTsgLyogdGltZW91dCA+IDIgc2FtcGxlcyBhdCBsb3dlc3QgcmF0ZSovCisJCWlmIChhd2FjcykKKwkJCWF3YWNzX3NldHVwX2Zvcl9iZWVwKGJlZXBfc3BlZWQpOworCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNtZHB0ciwgdmlydF90b19idXMoYmVlcF9kYmRtYV9jbWQpKTsKKwkJKHZvaWQpaW5fbGUzMigmYXdhY3NfdHhkbWEtPnN0YXR1cyk7CisJCW91dF9sZTMyKCZhd2Fjc190eGRtYS0+Y29udHJvbCwgUlVOIHwgKFJVTiA8PCAxNikpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogdXNlZCBpbiBpbml0IGFuZCBmb3Igd2FrZS11cCAqLworCitzdGF0aWMgdm9pZAorbG9hZF9hd2Fjcyh2b2lkKQoreworCWF3YWNzX3dyaXRlKGF3YWNzX3JlZ1swXSArIE1BU0tfQUREUjApOworCWF3YWNzX3dyaXRlKGF3YWNzX3JlZ1sxXSArIE1BU0tfQUREUjEpOworCWF3YWNzX3dyaXRlKGF3YWNzX3JlZ1syXSArIE1BU0tfQUREUjIpOworCWF3YWNzX3dyaXRlKGF3YWNzX3JlZ1s0XSArIE1BU0tfQUREUjQpOworCisJaWYgKGF3YWNzX3JldmlzaW9uID09IEFXQUNTX1NDUkVBTUVSKSB7CisJCWF3YWNzX3dyaXRlKGF3YWNzX3JlZ1s1XSArIE1BU0tfQUREUjUpOworCQltc2xlZXAoMTAwKTsKKwkJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzZdICsgTUFTS19BRERSNik7CisJCW1zbGVlcCgyKTsKKwkJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzFdICsgTUFTS19BRERSMSk7CisJCWF3YWNzX3dyaXRlKGF3YWNzX3JlZ1s3XSArIE1BU0tfQUREUjcpOworCX0KKwlpZiAoYXdhY3MpIHsKKwkJaWYgKGh3X2Nhbl9ieXRlc3dhcCAmJiAoZG1hc291bmQuaGFyZC5mb3JtYXQgPT0gQUZNVF9TMTZfTEUpKQorCQkJb3V0X2xlMzIoJmF3YWNzLT5ieXRlc3dhcCwgQlNfVkFMKTsKKwkJZWxzZQorCQkJb3V0X2xlMzIoJmF3YWNzLT5ieXRlc3dhcCwgMCk7CisJfQorfQorCisjaWZkZWYgQ09ORklHX1BNQUNfUEJPT0sKKy8qCisgKiBTYXZlIHN0YXRlIHdoZW4gZ29pbmcgdG8gc2xlZXAsIHJlc3RvcmUgaXQgYWZ0ZXJ3YXJkcy4KKyAqLworLyogRklYTUU6IHNvcnQgb3V0IGRpc2FibGluZy9yZS1lbmFibGluZyBvZiByZWFkIHN0dWZmIGFzIHdlbGwgKi8KK3N0YXRpYyBpbnQgYXdhY3Nfc2xlZXBfbm90aWZ5KHN0cnVjdCBwbXVfc2xlZXBfbm90aWZpZXIgKnNlbGYsIGludCB3aGVuKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzd2l0Y2ggKHdoZW4pIHsKKwljYXNlIFBCT09LX1NMRUVQX05PVzoJCQorCQlMT0NLKCk7CisJCWF3YWNzX3NsZWVwaW5nID0gMTsKKwkJLyogVGVsbCB0aGUgcmVzdCBvZiB0aGUgZHJpdmVyIHdlIGFyZSBub3cgZ29pbmcgdG8gc2xlZXAgKi8KKwkJbWIoKTsKKwkJaWYgKGF3YWNzX3JldmlzaW9uID09IEFXQUNTX1NDUkVBTUVSIHx8CisJCSAgICBhd2Fjc19yZXZpc2lvbiA9PSBBV0FDU19BV0FDUykgeworCQkJYXdhY3NfcmVnMV9zYXZlID0gYXdhY3NfcmVnWzFdOworCQkJYXdhY3NfcmVnWzFdIHw9IE1BU0tfQU1VVEUgfCBNQVNLX0NNVVRFOworCQkJYXdhY3Nfd3JpdGUoTUFTS19BRERSMSB8IGF3YWNzX3JlZ1sxXSk7CisJCX0KKworCQlQTWFjU2lsZW5jZSgpOworCQkvKiBzdG9wIHJ4IC0gaWYgZ29pbmcgLSBhIGJpdCBvZiBhIGRhZnQgdXNlci4uLiBidXQgKi8KKwkJb3V0X2xlMzIoJmF3YWNzX3J4ZG1hLT5jb250cm9sLCAoUlVOfFdBS0V8RkxVU0ggPDwgMTYpKTsKKwkJLyogZGVueSBpbnRlcnJ1cHRzICovCisJCWlmIChhd2FjcykKKwkJCWRpc2FibGVfaXJxKGF3YWNzX2lycSk7CisJCWRpc2FibGVfaXJxKGF3YWNzX3R4X2lycSk7CisJCWRpc2FibGVfaXJxKGF3YWNzX3J4X2lycSk7CisJCS8qIENoaXAgc3BlY2lmaWMgc2xlZXAgY29kZSAqLworCQlzd2l0Y2ggKGF3YWNzX3JldmlzaW9uKSB7CisJCQljYXNlIEFXQUNTX1RVTUJMRVI6CisJCQljYXNlIEFXQUNTX1NOQVBQRVI6CisJCQkJd3JpdGVfYXVkaW9fZ3BpbyhncGlvX2hlYWRwaG9uZV9tdXRlLCBncGlvX2hlYWRwaG9uZV9tdXRlX3BvbCk7CisJCQkJd3JpdGVfYXVkaW9fZ3BpbyhncGlvX2FtcF9tdXRlLCBncGlvX2FtcF9tdXRlX3BvbCk7CisJCQkJdGFzX2VudGVyX3NsZWVwKCk7CisJCQkJd3JpdGVfYXVkaW9fZ3BpbyhncGlvX2F1ZGlvX3Jlc2V0LCBncGlvX2F1ZGlvX3Jlc2V0X3BvbCk7CisJCQkJYnJlYWsgOworCQkJY2FzZSBBV0FDU19EQUNBOgorCQkJCWRhY2FfZW50ZXJfc2xlZXAoKTsKKwkJCQlicmVhayA7CisJCQljYXNlIEFXQUNTX0JVUkdVTkRZOgorCQkJCWJyZWFrIDsKKwkJCWNhc2UgQVdBQ1NfU0NSRUFNRVI6CisJCQljYXNlIEFXQUNTX0FXQUNTOgorCQkJZGVmYXVsdDoKKwkJCQlvdXRfbGUzMigmYXdhY3MtPmNvbnRyb2wsIDB4MTEpIDsKKwkJCQlicmVhayA7CisJCX0KKwkJLyogRGlzYWJsZSBzb3VuZCBjbG9jayAqLworCQlwbWFjX2NhbGxfZmVhdHVyZShQTUFDX0ZUUl9TT1VORF9DSElQX0VOQUJMRSwgYXdhY3Nfbm9kZSwgMCwgMCk7CisJCS8qIEFjY29yZGluZyB0byBEYXJ3aW4sIHdlIGRvIHRoYXQgYWZ0ZXIgdHVybmluZyBvZmYgdGhlIHNvdW5kCisJCSAqIGNoaXAgY2xvY2suIEFsbCB0aGlzIHdpbGwgaGF2ZSB0byBiZSBjbGVhbmVkIHVwIG9uY2Ugd2UgcHJvcGVybHkKKwkJICogcGFyc2UgdGhlIE9GIHNvdW5kLW9iamVjdHMKKwkJICovCisJCWlmICgobWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2szLDEiKSB8fAorCQkgICAgbWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2szLDIiKSkgJiYgYXdhY3MpIHsKKwkJCWF3YWNzX3JlZ1sxXSB8PSBNQVNLX1BBUk9VVDAgfCBNQVNLX1BBUk9VVDE7CisJCQlhd2Fjc193cml0ZShNQVNLX0FERFIxIHwgYXdhY3NfcmVnWzFdKTsKKwkJCW1zbGVlcCgyMDApOworCQl9CisJCWJyZWFrOworCWNhc2UgUEJPT0tfV0FLRToKKwkJLyogRW5hYmxlIHNvdW5kIGNsb2NrICovCisJCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NPVU5EX0NISVBfRU5BQkxFLCBhd2Fjc19ub2RlLCAwLCAxKTsKKwkJaWYgKChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazMsMSIpIHx8CisJCSAgICBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazMsMiIpKSAmJiBhd2FjcykgeworCQkJbXNsZWVwKDEwMCk7CisJCQlhd2Fjc19yZWdbMV0gJj0gfihNQVNLX1BBUk9VVDAgfCBNQVNLX1BBUk9VVDEpOworCQkJYXdhY3Nfd3JpdGUoTUFTS19BRERSMSB8IGF3YWNzX3JlZ1sxXSk7CisJCQltc2xlZXAoMzAwKTsKKwkJfSBlbHNlCisJCQltc2xlZXAoMTAwMCk7CisgCQkvKiByZXN0b3JlIHNldHRpbmdzICovCisJCXN3aXRjaCAoYXdhY3NfcmV2aXNpb24pIHsKKwkJCWNhc2UgQVdBQ1NfVFVNQkxFUjoKKwkJCWNhc2UgQVdBQ1NfU05BUFBFUjoKKwkJCQl3cml0ZV9hdWRpb19ncGlvKGdwaW9faGVhZHBob25lX211dGUsIGdwaW9faGVhZHBob25lX211dGVfcG9sKTsKKwkJCQl3cml0ZV9hdWRpb19ncGlvKGdwaW9fYW1wX211dGUsIGdwaW9fYW1wX211dGVfcG9sKTsKKwkJCQl3cml0ZV9hdWRpb19ncGlvKGdwaW9fYXVkaW9fcmVzZXQsIGdwaW9fYXVkaW9fcmVzZXRfcG9sKTsKKwkJCQltc2xlZXAoMTAwKTsKKwkJCQl3cml0ZV9hdWRpb19ncGlvKGdwaW9fYXVkaW9fcmVzZXQsICFncGlvX2F1ZGlvX3Jlc2V0X3BvbCk7CisJCQkJbXNsZWVwKDE1MCk7CisJCQkJdGFzX2xlYXZlX3NsZWVwKCk7IC8qIFN0dWIgZm9yIG5vdyAqLworCQkJCWhlYWRwaG9uZV9pbnRyKDAsTlVMTCxOVUxMKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQVdBQ1NfREFDQToKKwkJCQltc2xlZXAoMTApOyAvKiBDaGVjayB0aGlzICEhISAqLworCQkJCWRhY2FfbGVhdmVfc2xlZXAoKTsKKwkJCQlicmVhayA7CQkvKiBkb250IGtub3cgaG93IHlldCAqLworCQkJY2FzZSBBV0FDU19CVVJHVU5EWToKKwkJCQlicmVhayA7CisJCQljYXNlIEFXQUNTX1NDUkVBTUVSOgorCQkJY2FzZSBBV0FDU19BV0FDUzoKKwkJCWRlZmF1bHQ6CisJCSAJCWxvYWRfYXdhY3MoKSA7CisJCQkJYnJlYWsgOworCQl9CisJCS8qIFJlY2FsaWJyYXRlIGNoaXAgKi8KKwkJaWYgKGF3YWNzX3JldmlzaW9uID09IEFXQUNTX1NDUkVBTUVSICYmIGF3YWNzKQorCQkJYXdhY3NfcmVjYWxpYnJhdGUoKTsKKwkJLyogTWFrZSBzdXJlIGRtYSBpcyBzdG9wcGVkICovCisJCVBNYWNTaWxlbmNlKCk7CisJCWlmIChhd2FjcykKKwkJCWVuYWJsZV9pcnEoYXdhY3NfaXJxKTsKKwkJZW5hYmxlX2lycShhd2Fjc190eF9pcnEpOworIAkJZW5hYmxlX2lycShhd2Fjc19yeF9pcnEpOworIAkJaWYgKGF3YWNzKSB7CisgCQkJLyogT0ssIGFsbG93IGludHMgYmFjayBhZ2FpbiAqLworCSAJCW91dF9sZTMyKCZhd2Fjcy0+Y29udHJvbCwgTUFTS19JRVBDCisgCQkJIAl8IChhd2Fjc19yYXRlX2luZGV4IDw8IDgpIHwgMHgxMQorIAkJCQkgfCAoYXdhY3NfcmV2aXNpb24gPCBBV0FDU19EQUNBID8gTUFTS19JRUU6IDApKTsKKyAJCX0KKyAJCWlmIChtYWNpb19iYXNlICYmIGlzX3Bib29rX2czKSB7CisJCQkvKiBGSVhNRTogc2hvdWxkIHJlc3RvcmUgdGhlIHNldHVwIHdlIGhhZC4uLiovCisJCQlvdXRfOChtYWNpb19iYXNlICsgMHgzNywgMyk7CisgCQl9IGVsc2UgaWYgKGlzX3Bib29rXzNYMDApIHsKKwkJCWluXzgobGF0Y2hfYmFzZSArIDB4MTkwKTsKKwkJfQorCQkvKiBSZW1vdmUgbXV0ZSAqLworCQlpZiAoYXdhY3NfcmV2aXNpb24gPT0gQVdBQ1NfU0NSRUFNRVIgfHwKKwkJICAgIGF3YWNzX3JldmlzaW9uID09IEFXQUNTX0FXQUNTKSB7CisJCQlhd2Fjc19yZWdbMV0gPSBhd2Fjc19yZWcxX3NhdmU7CisJCQlhd2Fjc193cml0ZShNQVNLX0FERFIxIHwgYXdhY3NfcmVnWzFdKTsKKwkJfQorIAkJYXdhY3Nfc2xlZXBpbmcgPSAwOworCQkvKiBSZXN1bWUgcGVuZGluZyBzb3VuZHMuICovCisJCS8qIHdlIGRvbid0IHRyeSB0byByZXN0YXJ0IGlucHV0Li4uICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJCV9fUE1hY1BsYXkoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCQlVTkxPQ0soKTsKKwl9CisJcmV0dXJuIFBCT09LX1NMRUVQX09LOworfQorI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCisKKworLyogQWxsIHRoZSBidXJndW5keSBmdW5jdGlvbnM6ICovCisKKy8qIFdhaXRzIGZvciBidXN5IGZsYWcgdG8gY2xlYXIgKi8KK2lubGluZSBzdGF0aWMgdm9pZAorYXdhY3NfYnVyZ3VuZHlfYnVzeV93YWl0KHZvaWQpCit7CisJaW50IGNvdW50ID0gNTA7IC8qID4gMiBzYW1wbGVzIGF0IDQ0azEgKi8KKwl3aGlsZSAoKGluX2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsKSAmIE1BU0tfTkVXRUNNRCkgJiYgY291bnQtLSkKKwkJdWRlbGF5KDEpIDsKK30KKworaW5saW5lIHN0YXRpYyB2b2lkCithd2Fjc19idXJndW5keV9leHRlbmRfd2FpdCh2b2lkKQoreworCWludCBjb3VudCA9IDUwIDsgLyogPiAyIHNhbXBsZXMgYXQgNDRrMSAqLworCXdoaWxlICgoIShpbl9sZTMyKCZhd2Fjcy0+Y29kZWNfc3RhdCkgJiBNQVNLX0VYVEVORCkpICYmIGNvdW50LS0pCisJCXVkZWxheSgxKSA7CisJY291bnQgPSA1MDsKKwl3aGlsZSAoKGluX2xlMzIoJmF3YWNzLT5jb2RlY19zdGF0KSAmIE1BU0tfRVhURU5EKSAmJiBjb3VudC0tKQorCQl1ZGVsYXkoMSk7Cit9CisKK3N0YXRpYyB2b2lkCithd2Fjc19idXJndW5keV93Y3codW5zaWduZWQgYWRkciwgdW5zaWduZWQgdmFsKQoreworCW91dF9sZTMyKCZhd2Fjcy0+Y29kZWNfY3RybCwgYWRkciArIDB4MjAwYzAwICsgKHZhbCAmIDB4ZmYpKTsKKwlhd2Fjc19idXJndW5keV9idXN5X3dhaXQoKTsKKwlvdXRfbGUzMigmYXdhY3MtPmNvZGVjX2N0cmwsIGFkZHIgKyAweDIwMGQwMCArKCh2YWw+PjgpICYgMHhmZikpOworCWF3YWNzX2J1cmd1bmR5X2J1c3lfd2FpdCgpOworCW91dF9sZTMyKCZhd2Fjcy0+Y29kZWNfY3RybCwgYWRkciArIDB4MjAwZTAwICsoKHZhbD4+MTYpICYgMHhmZikpOworCWF3YWNzX2J1cmd1bmR5X2J1c3lfd2FpdCgpOworCW91dF9sZTMyKCZhd2Fjcy0+Y29kZWNfY3RybCwgYWRkciArIDB4MjAwZjAwICsoKHZhbD4+MjQpICYgMHhmZikpOworCWF3YWNzX2J1cmd1bmR5X2J1c3lfd2FpdCgpOworfQorCitzdGF0aWMgdW5zaWduZWQKK2F3YWNzX2J1cmd1bmR5X3Jjdyh1bnNpZ25lZCBhZGRyKQoreworCXVuc2lnbmVkIHZhbCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHNob3VsZCBoYXZlIHRpbWVvdXRzIGhlcmUgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCisJb3V0X2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsLCBhZGRyICsgMHgxMDAwMDApOworCWF3YWNzX2J1cmd1bmR5X2J1c3lfd2FpdCgpOworCWF3YWNzX2J1cmd1bmR5X2V4dGVuZF93YWl0KCk7CisJdmFsICs9IChpbl9sZTMyKCZhd2Fjcy0+Y29kZWNfc3RhdCkgPj4gNCkgJiAweGZmOworCisJb3V0X2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsLCBhZGRyICsgMHgxMDAxMDApOworCWF3YWNzX2J1cmd1bmR5X2J1c3lfd2FpdCgpOworCWF3YWNzX2J1cmd1bmR5X2V4dGVuZF93YWl0KCk7CisJdmFsICs9ICgoaW5fbGUzMigmYXdhY3MtPmNvZGVjX3N0YXQpPj40KSAmIDB4ZmYpIDw8ODsKKworCW91dF9sZTMyKCZhd2Fjcy0+Y29kZWNfY3RybCwgYWRkciArIDB4MTAwMjAwKTsKKwlhd2Fjc19idXJndW5keV9idXN5X3dhaXQoKTsKKwlhd2Fjc19idXJndW5keV9leHRlbmRfd2FpdCgpOworCXZhbCArPSAoKGluX2xlMzIoJmF3YWNzLT5jb2RlY19zdGF0KT4+NCkgJiAweGZmKSA8PDE2OworCisJb3V0X2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsLCBhZGRyICsgMHgxMDAzMDApOworCWF3YWNzX2J1cmd1bmR5X2J1c3lfd2FpdCgpOworCWF3YWNzX2J1cmd1bmR5X2V4dGVuZF93YWl0KCk7CisJdmFsICs9ICgoaW5fbGUzMigmYXdhY3MtPmNvZGVjX3N0YXQpPj40KSAmIDB4ZmYpIDw8MjQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdmFsOworfQorCisKK3N0YXRpYyB2b2lkCithd2Fjc19idXJndW5keV93Y2IodW5zaWduZWQgYWRkciwgdW5zaWduZWQgdmFsKQoreworCW91dF9sZTMyKCZhd2Fjcy0+Y29kZWNfY3RybCwgYWRkciArIDB4MzAwMDAwICsgKHZhbCAmIDB4ZmYpKTsKKwlhd2Fjc19idXJndW5keV9idXN5X3dhaXQoKTsKK30KKworc3RhdGljIHVuc2lnbmVkCithd2Fjc19idXJndW5keV9yY2IodW5zaWduZWQgYWRkcikKK3sKKwl1bnNpZ25lZCB2YWwgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBzaG91bGQgaGF2ZSB0aW1lb3V0cyBoZXJlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKworCW91dF9sZTMyKCZhd2Fjcy0+Y29kZWNfY3RybCwgYWRkciArIDB4MTAwMDAwKTsKKwlhd2Fjc19idXJndW5keV9idXN5X3dhaXQoKTsKKwlhd2Fjc19idXJndW5keV9leHRlbmRfd2FpdCgpOworCXZhbCArPSAoaW5fbGUzMigmYXdhY3MtPmNvZGVjX3N0YXQpID4+IDQpICYgMHhmZjsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQKK2F3YWNzX2J1cmd1bmR5X2NoZWNrKHZvaWQpCit7CisJLyogQ2hlY2tzIHRvIHNlZSB0aGUgY2hpcCBpcyBhbGl2ZSBhbmQga2lja2luZyAqLworCWludCBlcnJvciA9IGluX2xlMzIoJmF3YWNzLT5jb2RlY19jdHJsKSAmIE1BU0tfRVJSQ09ERTsKKworCXJldHVybiBlcnJvciA9PSAweGYwMDAwOworfQorCitzdGF0aWMgaW50Cithd2Fjc19idXJndW5keV9pbml0KHZvaWQpCit7CisJaWYgKGF3YWNzX2J1cmd1bmR5X2NoZWNrKCkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZG1hc291bmRfcG1hYzogYnVyZ3VuZHkgbm90IHdvcmtpbmcgOi0oXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9PVVRQVVRFTkFCTEVTLAorCQkJICAgREVGX0JVUkdVTkRZX09VVFBVVEVOQUJMRVMpOworCWF3YWNzX2J1cmd1bmR5X3djYihNQVNLX0FERFJfQlVSR1VORFlfTU9SRV9PVVRQVVRFTkFCTEVTLAorCQkJICAgREVGX0JVUkdVTkRZX01PUkVfT1VUUFVURU5BQkxFUyk7CisJYXdhY3NfYnVyZ3VuZHlfd2N3KE1BU0tfQUREUl9CVVJHVU5EWV9PVVRQVVRTRUxFQ1RTLAorCQkJICAgREVGX0JVUkdVTkRZX09VVFBVVFNFTEVDVFMpOworCisJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9JTlBTRUwyMSwKKwkJCSAgIERFRl9CVVJHVU5EWV9JTlBTRUwyMSk7CisJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9JTlBTRUwzLAorCQkJICAgREVGX0JVUkdVTkRZX0lOUFNFTDMpOworCWF3YWNzX2J1cmd1bmR5X3djYihNQVNLX0FERFJfQlVSR1VORFlfR0FJTkNELAorCQkJICAgREVGX0JVUkdVTkRZX0dBSU5DRCk7CisJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9HQUlOTElORSwKKwkJCSAgIERFRl9CVVJHVU5EWV9HQUlOTElORSk7CisJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9HQUlOTUlDLAorCQkJICAgREVGX0JVUkdVTkRZX0dBSU5NSUMpOworCWF3YWNzX2J1cmd1bmR5X3djYihNQVNLX0FERFJfQlVSR1VORFlfR0FJTk1PREVNLAorCQkJICAgREVGX0JVUkdVTkRZX0dBSU5NT0RFTSk7CisKKwlhd2Fjc19idXJndW5keV93Y2IoTUFTS19BRERSX0JVUkdVTkRZX0FUVEVOU1BFQUtFUiwKKwkJCSAgIERFRl9CVVJHVU5EWV9BVFRFTlNQRUFLRVIpOworCWF3YWNzX2J1cmd1bmR5X3djYihNQVNLX0FERFJfQlVSR1VORFlfQVRURU5MSU5FT1VULAorCQkJICAgREVGX0JVUkdVTkRZX0FUVEVOTElORU9VVCk7CisJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9BVFRFTkhQLAorCQkJICAgREVGX0JVUkdVTkRZX0FUVEVOSFApOworCisJYXdhY3NfYnVyZ3VuZHlfd2N3KE1BU0tfQUREUl9CVVJHVU5EWV9NQVNURVJfVk9MVU1FLAorCQkJICAgREVGX0JVUkdVTkRZX01BU1RFUl9WT0xVTUUpOworCWF3YWNzX2J1cmd1bmR5X3djdyhNQVNLX0FERFJfQlVSR1VORFlfVk9MQ0QsCisJCQkgICBERUZfQlVSR1VORFlfVk9MQ0QpOworCWF3YWNzX2J1cmd1bmR5X3djdyhNQVNLX0FERFJfQlVSR1VORFlfVk9MTElORSwKKwkJCSAgIERFRl9CVVJHVU5EWV9WT0xMSU5FKTsKKwlhd2Fjc19idXJndW5keV93Y3coTUFTS19BRERSX0JVUkdVTkRZX1ZPTE1JQywKKwkJCSAgIERFRl9CVVJHVU5EWV9WT0xNSUMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorYXdhY3NfYnVyZ3VuZHlfd3JpdGVfdm9sdW1lKHVuc2lnbmVkIGFkZHJlc3MsIGludCB2b2x1bWUpCit7CisJaW50IGhhcmR2b2x1bWUsbHZvbHVtZSxydm9sdW1lOworCisJbHZvbHVtZSA9ICh2b2x1bWUgJiAweGZmKSA/ICh2b2x1bWUgJiAweGZmKSArIDE1NSA6IDA7CisJcnZvbHVtZSA9ICgodm9sdW1lID4+OCkmMHhmZikgPyAoKHZvbHVtZSA+PiA4KSYweGZmICkgKyAxNTUgOiAwOworCisJaGFyZHZvbHVtZSA9IGx2b2x1bWUgKyAocnZvbHVtZSA8PCAxNik7CisKKwlhd2Fjc19idXJndW5keV93Y3coYWRkcmVzcywgaGFyZHZvbHVtZSk7Cit9CisKK3N0YXRpYyBpbnQKK2F3YWNzX2J1cmd1bmR5X3JlYWRfdm9sdW1lKHVuc2lnbmVkIGFkZHJlc3MpCit7CisJaW50IHNvZnR2b2x1bWUsd3ZvbHVtZTsKKworCXd2b2x1bWUgPSBhd2Fjc19idXJndW5keV9yY3coYWRkcmVzcyk7CisKKwlzb2Z0dm9sdW1lID0gKHd2b2x1bWUgJiAweGZmKSAtIDE1NTsKKwlzb2Z0dm9sdW1lICs9ICgoKHd2b2x1bWUgPj4gMTYpICYgMHhmZikgLSAxNTUpPDw4OworCisJcmV0dXJuIHNvZnR2b2x1bWUgPiAwID8gc29mdHZvbHVtZSA6IDA7Cit9CisKK3N0YXRpYyBpbnQKK2F3YWNzX2J1cmd1bmR5X3JlYWRfbXZvbHVtZSh1bnNpZ25lZCBhZGRyZXNzKQoreworCWludCBsdm9sdW1lLHJ2b2x1bWUsd3ZvbHVtZTsKKworCXd2b2x1bWUgPSBhd2Fjc19idXJndW5keV9yY3coYWRkcmVzcyk7CisKKwl3dm9sdW1lICY9IDB4ZmZmZjsKKworCXJ2b2x1bWUgPSAod3ZvbHVtZSAmIDB4ZmYpIC0gMTU1OworCWx2b2x1bWUgPSAoKHd2b2x1bWUgJiAweGZmMDApPj44KSAtIDE1NTsKKworCXJldHVybiBsdm9sdW1lICsgKHJ2b2x1bWUgPDwgOCk7Cit9CisKK3N0YXRpYyB2b2lkCithd2Fjc19idXJndW5keV93cml0ZV9tdm9sdW1lKHVuc2lnbmVkIGFkZHJlc3MsIGludCB2b2x1bWUpCit7CisJaW50IGx2b2x1bWUscnZvbHVtZSxoYXJkdm9sdW1lOworCisJbHZvbHVtZSA9ICh2b2x1bWUgJjB4ZmYpID8gKHZvbHVtZSAmIDB4ZmYpICsgMTU1IDowOworCXJ2b2x1bWUgPSAoKHZvbHVtZSA+PjgpICYgMHhmZikgPyAodm9sdW1lID4+IDgpICsgMTU1IDowOworCisJaGFyZHZvbHVtZSA9IGx2b2x1bWUgKyAocnZvbHVtZSA8PCA4KTsKKwloYXJkdm9sdW1lICs9IChoYXJkdm9sdW1lIDw8IDE2KTsKKworCWF3YWNzX2J1cmd1bmR5X3djdyhhZGRyZXNzLCBoYXJkdm9sdW1lKTsKK30KKworLyogRW5kIGJ1cmd1bmR5IGZ1bmN0aW9ucyAqLworCisvKiBTZXQgdXAgb3V0cHV0IHZvbHVtZXMgb24gbWFjaGluZXMgd2l0aCB0aGUgJ3BlcmNoL3doaXNwZXInIGV4dGVuc2lvbiBjYXJkLgorICogdGhpcyBoYXMgYW4gU0dTIGkyYyBjaGlwICg3NDMzKSB3aGljaCBpcyBhY2Nlc3NlZCB1c2luZyB0aGUgY3VkYS4KKyAqCisgKiBUT0RPOiBzcGxpdCB0aGlzIG91dCBhbmQgbWFrZSB1c2Ugb2YgdGhlIG90aGVyIHBhcnRzIG9mIHRoZSBTR1MgY2hpcCB0bworICogZG8gQmFzcywgVHJlYmxlIGV0Yy4KKyAqLworCitzdGF0aWMgdm9pZAorYXdhY3NfZW5hYmxlX2FtcChpbnQgc3Brcl92b2wpCit7CisjaWZkZWYgQ09ORklHX0FEQl9DVURBCisJc3RydWN0IGFkYl9yZXF1ZXN0IHJlcTsKKworCWlmIChzeXNfY3RybGVyICE9IFNZU19DVFJMRVJfQ1VEQSkKKwkJcmV0dXJuOworCisJLyogdHVybiBvbiBoZWFkcGhvbmVzICovCisJY3VkYV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDUsIENVREFfUEFDS0VULCBDVURBX0dFVF9TRVRfSUlDLAorCQkgICAgIDB4OGEsIDQsIDApOworCXdoaWxlICghcmVxLmNvbXBsZXRlKSBjdWRhX3BvbGwoKTsKKwljdWRhX3JlcXVlc3QoJnJlcSwgTlVMTCwgNSwgQ1VEQV9QQUNLRVQsIENVREFfR0VUX1NFVF9JSUMsCisJCSAgICAgMHg4YSwgNiwgMCk7CisJd2hpbGUgKCFyZXEuY29tcGxldGUpIGN1ZGFfcG9sbCgpOworCisJLyogdHVybiBvbiBzcGVha2VyICovCisJY3VkYV9yZXF1ZXN0KCZyZXEsIE5VTEwsIDUsIENVREFfUEFDS0VULCBDVURBX0dFVF9TRVRfSUlDLAorCQkgICAgIDB4OGEsIDMsICgxMDAgLSAoc3Brcl92b2wgJiAweGZmKSkgKiAzMiAvIDEwMCk7CisJd2hpbGUgKCFyZXEuY29tcGxldGUpIGN1ZGFfcG9sbCgpOworCWN1ZGFfcmVxdWVzdCgmcmVxLCBOVUxMLCA1LCBDVURBX1BBQ0tFVCwgQ1VEQV9HRVRfU0VUX0lJQywKKwkJICAgICAweDhhLCA1LCAoMTAwIC0gKChzcGtyX3ZvbCA+PiA4KSAmIDB4ZmYpKSAqIDMyIC8gMTAwKTsKKwl3aGlsZSAoIXJlcS5jb21wbGV0ZSkgY3VkYV9wb2xsKCk7CisKKwljdWRhX3JlcXVlc3QoJnJlcSwgTlVMTCwgNSwgQ1VEQV9QQUNLRVQsCisJCSAgICAgQ1VEQV9HRVRfU0VUX0lJQywgMHg4YSwgMSwgMHgyOSk7CisJd2hpbGUgKCFyZXEuY29tcGxldGUpIGN1ZGFfcG9sbCgpOworI2VuZGlmIC8qIENPTkZJR19BREJfQ1VEQSAqLworfQorCisKKy8qKiogTWlkIGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKgorICogL2Rldi9taXhlciBhYnN0cmFjdGlvbgorICovCisKK3N0YXRpYyB2b2lkIGRvX2xpbmVfbGV2KGludCBkYXRhKQoreworCQlsaW5lX2xldiA9IGRhdGEgOworCQlhd2Fjc19yZWdbMF0gJj0gfk1BU0tfTVVYX0FVRElOOworCQlpZiAoKGRhdGEgJiAweGZmKSA+PSA1MCkKKwkJCWF3YWNzX3JlZ1swXSB8PSBNQVNLX01VWF9BVURJTjsKKwkJYXdhY3Nfd3JpdGUoTUFTS19BRERSMCB8IGF3YWNzX3JlZ1swXSk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2lwX2dhaW4oaW50IGRhdGEpCit7CisJaXBfZ2FpbiA9IGRhdGEgOworCWRhdGEgJj0gMHhmZjsKKwlhd2Fjc19yZWdbMF0gJj0gfk1BU0tfR0FJTkxJTkU7CisJaWYgKGF3YWNzX3JldmlzaW9uID09IEFXQUNTX1NDUkVBTUVSKSB7CisJCWF3YWNzX3JlZ1s2XSAmPSB+TUFTS19NSUNfQk9PU1QgOworCQlpZiAoZGF0YSA+PSAzMykgeworCQkJYXdhY3NfcmVnWzBdIHw9IE1BU0tfR0FJTkxJTkU7CisJCQlpZiggZGF0YSA+PSA2NikKKwkJCQlhd2Fjc19yZWdbNl0gfD0gTUFTS19NSUNfQk9PU1QgOworCQl9CisJCWF3YWNzX3dyaXRlKE1BU0tfQUREUjYgfCBhd2Fjc19yZWdbNl0pIDsKKwl9IGVsc2UgeworCQlpZiAoZGF0YSA+PSA1MCkKKwkJCWF3YWNzX3JlZ1swXSB8PSBNQVNLX0dBSU5MSU5FOworCX0KKwlhd2Fjc193cml0ZShNQVNLX0FERFIwIHwgYXdhY3NfcmVnWzBdKTsKK30KKworc3RhdGljIHZvaWQgZG9fbWljX2xldihpbnQgZGF0YSkKK3sKKwltaWNfbGV2ID0gZGF0YSA7CisJZGF0YSAmPSAweGZmOworCWF3YWNzX3JlZ1swXSAmPSB+TUFTS19NVVhfTUlDOworCWlmIChkYXRhID49IDUwKQorCQlhd2Fjc19yZWdbMF0gfD0gTUFTS19NVVhfTUlDOworCWF3YWNzX3dyaXRlKE1BU0tfQUREUjAgfCBhd2Fjc19yZWdbMF0pOworfQorCitzdGF0aWMgdm9pZCBkb19jZF9sZXYoaW50IGRhdGEpCit7CisJY2RfbGV2ID0gZGF0YSA7CisJYXdhY3NfcmVnWzBdICY9IH5NQVNLX01VWF9DRDsKKwlpZiAoKGRhdGEgJiAweGZmKSA+PSA1MCkKKwkJYXdhY3NfcmVnWzBdIHw9IE1BU0tfTVVYX0NEOworCWF3YWNzX3dyaXRlKE1BU0tfQUREUjAgfCBhd2Fjc19yZWdbMF0pOworfQorCitzdGF0aWMgdm9pZCBkb19yZWNfbGV2KGludCBkYXRhKQoreworCWludCBsZWZ0LCByaWdodCA7CisJcmVjX2xldiA9IGRhdGEgOworCS8qIG5lZWQgdG8gZnVkZ2UgdGhpcyB0byB1c2UgdGhlIHZvbHVtZSBzZXR0ZXIgcm91dGluZSAqLworCWxlZnQgPSAxMDAgLSAoZGF0YSAmIDB4ZmYpIDsgaWYoIGxlZnQgPCAwICkgbGVmdCA9IDAgOworCXJpZ2h0ID0gMTAwIC0gKChkYXRhID4+IDgpICYgMHhmZikgOyBpZiggcmlnaHQgPCAwICkgcmlnaHQgPSAwIDsKKwlsZWZ0IHw9IChyaWdodCA8PCA4ICk7CisJbGVmdCA9IGF3YWNzX3ZvbHVtZV9zZXR0ZXIobGVmdCwgMCwgMCwgNCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3Bhc3N0aHJ1X3ZvbChpbnQgZGF0YSkKK3sKKwlwYXNzdGhydV92b2wgPSBkYXRhIDsKKwlhd2Fjc19yZWdbMV0gJj0gfk1BU0tfTE9PUFRIUlU7CisJaWYgKGF3YWNzX3JldmlzaW9uID09IEFXQUNTX1NDUkVBTUVSKSB7CisJCWlmKCBkYXRhICkgeyAvKiBzd2l0Y2ggaXQgb24gZm9yIG5vbi16ZXJvICovCisJCQlhd2Fjc19yZWdbMV0gfD0gTUFTS19MT09QVEhSVTsKKwkJCWF3YWNzX3dyaXRlKE1BU0tfQUREUjEgfCBhd2Fjc19yZWdbMV0pOworCQl9CisJCWRhdGEgPSBhd2Fjc192b2x1bWVfc2V0dGVyKGRhdGEsIDUsIDAsIDYpIDsKKwl9IGVsc2UgeworCQlpZiAoKGRhdGEgJiAweGZmKSA+PSA1MCkKKwkJCWF3YWNzX3JlZ1sxXSB8PSBNQVNLX0xPT1BUSFJVOworCQlhd2Fjc193cml0ZShNQVNLX0FERFIxIHwgYXdhY3NfcmVnWzFdKTsKKwkJZGF0YSA9IChhd2Fjc19yZWdbMV0gJiBNQVNLX0xPT1BUSFJVKT8gMTAwOiAwOworCX0KK30KKworc3RhdGljIGludCBhd2Fjc19taXhlcl9pb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisJaW50IGRhdGE7CisJaW50IHJjOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfQ0FQUzoKKwkJLyogc2F5IHdlIHdpbGwgYWxsb3cgbXVsdGlwbGUgaW5wdXRzPyAgcHJvYi4gd3JvbmcKKwkJCXNvIEknbSBzd2l0Y2hpbmcgaXQgdG8gc2luZ2xlICovCisJCXJldHVybiBJT0NUTF9PVVQoYXJnLCAxKTsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSzoKKwkJZGF0YSAgPSBTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfU1BFQUtFUgorCQkJfCBTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QKKwkJCXwgU09VTkRfTUFTS19JR0FJTiB8IFNPVU5EX01BU0tfUkVDTEVWCisJCQl8IFNPVU5EX01BU0tfQUxUUENNCisJCQl8IFNPVU5EX01BU0tfTU9OSVRPUjsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1JFQ01BU0s6CisJCWRhdGEgPSBTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0Q7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkM6CisJCWRhdGEgPSAwOworCQlpZiAoYXdhY3NfcmVnWzBdICYgTUFTS19NVVhfQVVESU4pCisJCQlkYXRhIHw9IFNPVU5EX01BU0tfTElORTsKKwkJaWYgKGF3YWNzX3JlZ1swXSAmIE1BU0tfTVVYX01JQykKKwkJCWRhdGEgfD0gU09VTkRfTUFTS19NSUM7CisJCWlmIChhd2Fjc19yZWdbMF0gJiBNQVNLX01VWF9DRCkKKwkJCWRhdGEgfD0gU09VTkRfTUFTS19DRDsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9SRUNTUkM6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWRhdGEgJj0gKFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRCk7CisJCWF3YWNzX3JlZ1swXSAmPSB+KE1BU0tfTVVYX0NEIHwgTUFTS19NVVhfTUlDCisJCQkJICB8IE1BU0tfTVVYX0FVRElOKTsKKwkJaWYgKGRhdGEgJiBTT1VORF9NQVNLX0xJTkUpCisJCQlhd2Fjc19yZWdbMF0gfD0gTUFTS19NVVhfQVVESU47CisJCWlmIChkYXRhICYgU09VTkRfTUFTS19NSUMpCisJCQlhd2Fjc19yZWdbMF0gfD0gTUFTS19NVVhfTUlDOworCQlpZiAoZGF0YSAmIFNPVU5EX01BU0tfQ0QpCisJCQlhd2Fjc19yZWdbMF0gfD0gTUFTS19NVVhfQ0Q7CisJCWF3YWNzX3dyaXRlKGF3YWNzX3JlZ1swXSB8IE1BU0tfQUREUjApOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfU1RFUkVPREVWUzoKKwkJZGF0YSA9IFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19TUEVBS0VSfCBTT1VORF9NQVNLX1JFQ0xFViAgOworCQlpZiAoYXdhY3NfcmV2aXNpb24gPT0gQVdBQ1NfU0NSRUFNRVIpCisJCQlkYXRhIHw9IFNPVU5EX01BU0tfTU9OSVRPUiA7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlsaW5lX3ZvbCA9IGRhdGEgOworCQlhd2Fjc192b2x1bWVfc2V0dGVyKGRhdGEsIDIsIDAsIDYpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfVk9MVU1FOgorCQlyYyA9IElPQ1RMX09VVChhcmcsIGxpbmVfdm9sKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9TUEVBS0VSOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlzcGtfdm9sID0gZGF0YSA7CisJCWlmIChoYXNfcGVyY2gpCisJCQlhd2Fjc19lbmFibGVfYW1wKGRhdGEpOworCQllbHNlCisJCQkodm9pZClhd2Fjc192b2x1bWVfc2V0dGVyKGRhdGEsIDQsIE1BU0tfQ01VVEUsIDYpOworCQkvKiBmYWxsIHRob3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9TUEVBS0VSOgorCQlyYyA9IElPQ1RMX09VVChhcmcsIHNwa192b2wpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0FMVFBDTToJLyogcmVhbGx5IGJlbGwgdm9sdW1lICovCisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWJlZXBfdm9sID0gZGF0YSAmIDB4ZmY7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9BTFRQQ006CisJCXJjID0gSU9DVExfT1VUKGFyZywgYmVlcF92b2wpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0xJTkU6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWRvX2xpbmVfbGV2KGRhdGEpIDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0xJTkU6CisJCXJjID0gSU9DVExfT1VUKGFyZywgbGluZV9sZXYpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0lHQUlOOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlkb19pcF9nYWluKGRhdGEpIDsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0lHQUlOOgorCQlyYyA9IElPQ1RMX09VVChhcmcsIGlwX2dhaW4pOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX01JQzoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJZG9fbWljX2xldihkYXRhKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX01JQzoKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBtaWNfbGV2KTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9DRDoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJZG9fY2RfbGV2KGRhdGEpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfQ0Q6CisJCXJjID0gSU9DVExfT1VUKGFyZywgY2RfbGV2KTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9SRUNMRVY6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWRvX3JlY19sZXYoZGF0YSkgOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTEVWOgorCQlyYyA9IElPQ1RMX09VVChhcmcsIHJlY19sZXYpOworCQlicmVhazsKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX01PTklUT1IpOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlkb19wYXNzdGhydV92b2woZGF0YSkgOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfTU9OSVRPUik6CisJCXJjID0gSU9DVExfT1VUKGFyZywgcGFzc3RocnVfdm9sKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCX0KKwkKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGF3YWNzX21peGVyX2luaXQodm9pZCkKK3sKKwlhd2Fjc192b2x1bWVfc2V0dGVyKGxpbmVfdm9sLCAyLCAwLCA2KTsKKwlpZiAoaGFzX3BlcmNoKQorCQlhd2Fjc19lbmFibGVfYW1wKHNwa192b2wpOworCWVsc2UKKwkJKHZvaWQpYXdhY3Nfdm9sdW1lX3NldHRlcihzcGtfdm9sLCA0LCBNQVNLX0NNVVRFLCA2KTsKKwlkb19saW5lX2xldihsaW5lX2xldikgOworCWRvX2lwX2dhaW4oaXBfZ2FpbikgOworCWRvX21pY19sZXYobWljX2xldikgOworCWRvX2NkX2xldihjZF9sZXYpIDsKKwlkb19yZWNfbGV2KHJlY19sZXYpIDsKKwlkb19wYXNzdGhydV92b2wocGFzc3RocnVfdm9sKSA7Cit9CisKK3N0YXRpYyBpbnQgYnVyZ3VuZHlfbWl4ZXJfaW9jdGwodV9pbnQgY21kLCB1X2xvbmcgYXJnKQoreworCWludCBkYXRhOworCWludCByYzsKKworCS8qIFdlIGFyZSwgd2UgYXJlLCB3ZSBhcmUuLi4gQnVyZ3VuZHkgb3IgYmV0dGVyICovCisJc3dpdGNoKGNtZCkgeworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLOgorCQlkYXRhID0gU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX0NEIHwKKwkJCVNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwKKwkJCVNPVU5EX01BU0tfU1BFQUtFUiB8IFNPVU5EX01BU0tfQUxUUENNOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSzoKKwkJZGF0YSA9IFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDCisJCQl8IFNPVU5EX01BU0tfQ0Q7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkM6CisJCWRhdGEgPSAwOworCQlpZiAoYXdhY3NfcmVnWzBdICYgTUFTS19NVVhfQVVESU4pCisJCQlkYXRhIHw9IFNPVU5EX01BU0tfTElORTsKKwkJaWYgKGF3YWNzX3JlZ1swXSAmIE1BU0tfTVVYX01JQykKKwkJCWRhdGEgfD0gU09VTkRfTUFTS19NSUM7CisJCWlmIChhd2Fjc19yZWdbMF0gJiBNQVNLX01VWF9DRCkKKwkJCWRhdGEgfD0gU09VTkRfTUFTS19DRDsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9SRUNTUkM6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWRhdGEgJj0gKFNPVU5EX01BU0tfTElORQorCQkJIHwgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0NEKTsKKwkJYXdhY3NfcmVnWzBdICY9IH4oTUFTS19NVVhfQ0QgfCBNQVNLX01VWF9NSUMKKwkJCQkgIHwgTUFTS19NVVhfQVVESU4pOworCQlpZiAoZGF0YSAmIFNPVU5EX01BU0tfTElORSkKKwkJCWF3YWNzX3JlZ1swXSB8PSBNQVNLX01VWF9BVURJTjsKKwkJaWYgKGRhdGEgJiBTT1VORF9NQVNLX01JQykKKwkJCWF3YWNzX3JlZ1swXSB8PSBNQVNLX01VWF9NSUM7CisJCWlmIChkYXRhICYgU09VTkRfTUFTS19DRCkKKwkJCWF3YWNzX3JlZ1swXSB8PSBNQVNLX01VWF9DRDsKKwkJYXdhY3Nfd3JpdGUoYXdhY3NfcmVnWzBdIHwgTUFTS19BRERSMCk7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9TVEVSRU9ERVZTOgorCQlkYXRhID0gU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX1NQRUFLRVIKKwkJCXwgU09VTkRfTUFTS19SRUNMRVYgfCBTT1VORF9NQVNLX0NECisJCQl8IFNPVU5EX01BU0tfTElORTsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NBUFM6CisJCXJjID0gSU9DVExfT1VUKGFyZywgMCk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlhd2Fjc19idXJndW5keV93cml0ZV9tdm9sdW1lKE1BU0tfQUREUl9CVVJHVU5EWV9NQVNURVJfVk9MVU1FLCBkYXRhKTsKKwkJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwljYXNlIFNPVU5EX01JWEVSX1JFQURfVk9MVU1FOgorCQlyYyA9IElPQ1RMX09VVChhcmcsIGF3YWNzX2J1cmd1bmR5X3JlYWRfbXZvbHVtZShNQVNLX0FERFJfQlVSR1VORFlfTUFTVEVSX1ZPTFVNRSkpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1NQRUFLRVI6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWlmICghKGRhdGEgJiAweGZmKSkgeworCQkJLyogTXV0ZSB0aGUgbGVmdCBzcGVha2VyICovCisJCQlhd2Fjc19idXJndW5keV93Y2IoTUFTS19BRERSX0JVUkdVTkRZX01PUkVfT1VUUFVURU5BQkxFUywKKwkJCQkJICAgYXdhY3NfYnVyZ3VuZHlfcmNiKE1BU0tfQUREUl9CVVJHVU5EWV9NT1JFX09VVFBVVEVOQUJMRVMpICYgfjB4Mik7CisJCX0gZWxzZSB7CisJCQkvKiBVbm11dGUgdGhlIGxlZnQgc3BlYWtlciAqLworCQkJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9NT1JFX09VVFBVVEVOQUJMRVMsCisJCQkJCSAgIGF3YWNzX2J1cmd1bmR5X3JjYihNQVNLX0FERFJfQlVSR1VORFlfTU9SRV9PVVRQVVRFTkFCTEVTKSB8IDB4Mik7CisJCX0KKwkJaWYgKCEoZGF0YSAmIDB4ZmYwMCkpIHsKKwkJCS8qIE11dGUgdGhlIHJpZ2h0IHNwZWFrZXIgKi8KKwkJCWF3YWNzX2J1cmd1bmR5X3djYihNQVNLX0FERFJfQlVSR1VORFlfTU9SRV9PVVRQVVRFTkFCTEVTLAorCQkJCQkgICBhd2Fjc19idXJndW5keV9yY2IoTUFTS19BRERSX0JVUkdVTkRZX01PUkVfT1VUUFVURU5BQkxFUykgJiB+MHg0KTsKKwkJfSBlbHNlIHsKKwkJCS8qIFVubXV0ZSB0aGUgcmlnaHQgc3BlYWtlciAqLworCQkJYXdhY3NfYnVyZ3VuZHlfd2NiKE1BU0tfQUREUl9CVVJHVU5EWV9NT1JFX09VVFBVVEVOQUJMRVMsCisJCQkJCSAgIGF3YWNzX2J1cmd1bmR5X3JjYihNQVNLX0FERFJfQlVSR1VORFlfTU9SRV9PVVRQVVRFTkFCTEVTKSB8IDB4NCk7CisJCX0KKworCQlkYXRhID0gKCgoZGF0YSYweGZmKSoxNikvMTAwID4gMHhmID8gMHhmIDoKKwkJCSgoKGRhdGEmMHhmZikqMTYpLzEwMCkpICsKKwkJCSgoKChkYXRhPj44KSoxNikvMTAwID4gMHhmID8gMHhmIDoKKwkJCSAgKCgoKGRhdGE+PjgpKjE2KS8xMDApKSk8PDQpOworCisJCWF3YWNzX2J1cmd1bmR5X3djYihNQVNLX0FERFJfQlVSR1VORFlfQVRURU5TUEVBS0VSLCB+ZGF0YSk7CisJCQkJLyogRmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NQRUFLRVI6CisJCWRhdGEgPSBhd2Fjc19idXJndW5keV9yY2IoTUFTS19BRERSX0JVUkdVTkRZX0FUVEVOU1BFQUtFUik7CisJCWRhdGEgPSAoKChkYXRhICYgMHhmKSoxMDApLzE2KSArICgoKChkYXRhPj40KSoxMDApLzE2KTw8OCk7CisJCXJjID0gSU9DVExfT1VUKGFyZywgKH5kYXRhKSAmIDB4MDAwMGZmZmYpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0FMVFBDTToJLyogcmVhbGx5IGJlbGwgdm9sdW1lICovCisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWJlZXBfdm9sID0gZGF0YSAmIDB4ZmY7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0FMVFBDTToKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBiZWVwX3ZvbCk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfTElORToKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJYXdhY3NfYnVyZ3VuZHlfd3JpdGVfdm9sdW1lKE1BU0tfQUREUl9CVVJHVU5EWV9WT0xMSU5FLCBkYXRhKTsKKworCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9MSU5FOgorCQlkYXRhID0gYXdhY3NfYnVyZ3VuZHlfcmVhZF92b2x1bWUoTUFTS19BRERSX0JVUkdVTkRZX1ZPTExJTkUpOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX01JQzoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJCQkvKiBNaWMgaXMgbW9ubyBkZXZpY2UgKi8KKwkJZGF0YSA9IChkYXRhIDw8IDgpICsgKGRhdGEgPDwgMjQpOworCQlhd2Fjc19idXJndW5keV93cml0ZV92b2x1bWUoTUFTS19BRERSX0JVUkdVTkRZX1ZPTE1JQywgZGF0YSk7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX01JQzoKKwkJZGF0YSA9IGF3YWNzX2J1cmd1bmR5X3JlYWRfdm9sdW1lKE1BU0tfQUREUl9CVVJHVU5EWV9WT0xNSUMpOworCQlkYXRhIDw8PSAyNDsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9DRDoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJYXdhY3NfYnVyZ3VuZHlfd3JpdGVfdm9sdW1lKE1BU0tfQUREUl9CVVJHVU5EWV9WT0xDRCwgZGF0YSk7CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NEOgorCQlkYXRhID0gYXdhY3NfYnVyZ3VuZHlfcmVhZF92b2x1bWUoTUFTS19BRERSX0JVUkdVTkRZX1ZPTENEKTsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9SRUNMRVY6CisJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCWRhdGEgPSBhd2Fjc192b2x1bWVfc2V0dGVyKGRhdGEsIDAsIDAsIDQpOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTEVWOgorCQlkYXRhID0gYXdhY3NfZ2V0X3ZvbHVtZShhd2Fjc19yZWdbMF0sIDQpOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX09VVE1BU0s6CisJY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6CisJZGVmYXVsdDoKKwkJcmMgPSAtRUlOVkFMOworCX0KKwkKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZGFjYV9taXhlcl9pb2N0bCh1X2ludCBjbWQsIHVfbG9uZyBhcmcpCit7CisJaW50IGRhdGE7CisJaW50IHJjOworCisJLyogQW5kIHRoZSBEQUNBJ3Mgbm8gZ2VuaXVzIGVpdGhlciEgKi8KKworCXN3aXRjaChjbWQpIHsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfREVWTUFTSzoKKwkJZGF0YSA9IFNPVU5EX01BU0tfVk9MVU1FOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSzoKKwkJZGF0YSA9IDA7CisJCXJjID0gSU9DVExfT1VUKGFyZywgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkM6CisJCWRhdGEgPSAwOworCQlyYyA9IElPQ1RMX09VVChhcmcsIGRhdGEpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1JFQ1NSQzoKKwkJSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJZGF0YSA9MDsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlM6CisJCWRhdGEgPSBTT1VORF9NQVNLX1ZPTFVNRTsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0NBUFM6CisJCXJjID0gSU9DVExfT1VUKGFyZywgMCk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgorCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlkYWNhX3NldF92b2x1bWUoZGF0YSwgZGF0YSk7CisJCS8qIEZhbGwgdGhyb3VnaCAqLworCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9WT0xVTUU6CisJCWRhY2FfZ2V0X3ZvbHVtZSgmIGRhdGEsICZkYXRhKTsKKwkJcmMgPSBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9PVVRNQVNLOgorCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOgorCWRlZmF1bHQ6CisJCXJjID0gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IFBNYWNNaXhlcklvY3RsKHVfaW50IGNtZCwgdV9sb25nIGFyZykKK3sKKwlpbnQgcmM7CisJCisJLyogRGlmZmVyZW50IElPQ1RMUyBmb3IgYnVyZ3VuZHkgYW5kLCBldmVudHVhbGx5LCBEQUNBICYgVHVtYmxlciAqLworCisJVFJZX0xPQ0soKTsKKwkKKwlzd2l0Y2ggKGF3YWNzX3JldmlzaW9uKXsKKwkJY2FzZSBBV0FDU19CVVJHVU5EWToKKwkJCXJjID0gYnVyZ3VuZHlfbWl4ZXJfaW9jdGwoY21kLCBhcmcpOworCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX0RBQ0E6CisJCQlyYyA9IGRhY2FfbWl4ZXJfaW9jdGwoY21kLCBhcmcpOworCQkJYnJlYWs7CisJCWNhc2UgQVdBQ1NfVFVNQkxFUjoKKwkJY2FzZSBBV0FDU19TTkFQUEVSOgorCQkJcmMgPSB0YXNfbWl4ZXJfaW9jdGwoY21kLCBhcmcpOworCQkJYnJlYWsgOworCQlkZWZhdWx0OiAvKiA7LSkpICovCisJCQlyYyA9IGF3YWNzX21peGVyX2lvY3RsKGNtZCwgYXJnKTsKKwl9CisKKwlVTkxPQ0soKTsKKwkKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIFBNYWNNaXhlckluaXQodm9pZCkKK3sKKwlzd2l0Y2ggKGF3YWNzX3JldmlzaW9uKSB7CisJCWNhc2UgQVdBQ1NfVFVNQkxFUjoKKwkJICBwcmludGsoIkFFLUluaXQgdHVtYmxlciBtaXhlclxuIik7CisJCSAgYnJlYWsgOworCQljYXNlIEFXQUNTX1NOQVBQRVI6CisJCSAgcHJpbnRrKCJBRS1Jbml0IHNuYXBwZXIgbWl4ZXJcbiIpOworCQkgIGJyZWFrIDsKKwkJY2FzZSBBV0FDU19EQUNBOgorCQljYXNlIEFXQUNTX0JVUkdVTkRZOgorCQkJYnJlYWsgOwkvKiBkb24ndCBrbm93IHlldCAqLworCQljYXNlIEFXQUNTX0FXQUNTOgorCQljYXNlIEFXQUNTX1NDUkVBTUVSOgorCQlkZWZhdWx0OgorCQkJYXdhY3NfbWl4ZXJfaW5pdCgpIDsKKwkJCWJyZWFrIDsKKwl9Cit9CisKKy8qIFdyaXRlL1JlYWQgc3Egc2V0dXAgZnVuY3Rpb25zOgorICAgQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgZW5vdWdoIChvciBhbnkpIGRiZG1hIGNtZCBidWZmZXJzIGZvciB0aGUKKyAgIHVzZXIncyBmcmFnbWVudCBzZXR0aW5ncy4gIElmIG5vdCwgYWxsb2NhdGUgc29tZS4gSWYgdGhpcyBmYWlscyB3ZSB3aWxsCisgICBwb2ludCBhdCB0aGUgYmVlcCBidWZmZXIgLSBhcyBhbiBlbWVyZ2VuY3kgcHJvdmlzaW9uIC0gdG8gc3RvcCBkbWEgdHJvbXBpbmcKKyAgIG9uIHNvbWUgcmFuZG9tIGJpdCBvZiBtZW1vcnkgKGlmIHNvbWVvbmUgbGV0cyBpdCBnbyBhbnl3YXkpLgorICAgVGhlIGNvbW1hbmQgYnVmZmVycyBhcmUgdGhlbiBzZXQgdXAgdG8gcG9pbnQgdG8gdGhlIGZyYWdtZW50IGJ1ZmZlcnMKKyAgIChhbGxvY2F0ZWQgZWxzZXdoZXJlKS4gIFdlIG5lZWQgbisxIGNvbW1hbmRzIHRoZSBsYXN0IG9mIHdoaWNoIGhvbGRzCisgICBhIE5PUCArIGxvb3AgdG8gc3RhcnQuCisqLworCitzdGF0aWMgaW50IFBNYWNXcml0ZVNxU2V0dXAodm9pZCkKK3sKKwlpbnQgaSwgY291bnQgPSA2MDAgOworCXZvbGF0aWxlIHN0cnVjdCBkYmRtYV9jbWQgKmNwOworCisJTE9DSygpOworCQorCS8qIHN0b3AgdGhlIGNvbnRyb2xsZXIgZnJvbSBkb2luZyBhbnkgb3V0cHV0IC0gaWYgaXQgaXNuJ3QgYWxyZWFkeS4KKwkgICBpdCBfc2hvdWxkXyBiZSBiZWZvcmUgdGhpcyBpcyBjYWxsZWQgYW55d2F5ICovCisKKwlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRSkgPDwgMTYpOworCXdoaWxlICgoaW5fbGUzMigmYXdhY3NfdHhkbWEtPnN0YXR1cykgJiBSVU4pICYmIGNvdW50LS0pCisJCXVkZWxheSgxKTsKKyNpZmRlZiBERUJVR19ETUFTT1VORAoraWYgKGNvdW50IDw9IDApCisJcHJpbnRrKCJkbWFzb3VuZF9wbWFjOiB3cml0ZSBzcSBzZXR1cDogdGltZW91dCB3YWl0aW5nIGZvciBkbWEgdG8gc3RvcFxuIik7CisjZW5kaWYKKworCWlmICgod3JpdGVfc3EubWF4X2NvdW50ICsgMSkgPiBudW1iZXJfb2ZfdHhfY21kX2J1ZmZlcnMpIHsKKwkJaWYgKGF3YWNzX3R4X2NtZF9zcGFjZSkKKwkJCWtmcmVlKGF3YWNzX3R4X2NtZF9zcGFjZSk7CisJCW51bWJlcl9vZl90eF9jbWRfYnVmZmVycyA9IDA7CisKKwkJLyogd2UgbmVlZCBuYnVmcyArIDEgKGZvciB0aGUgbG9vcCkgYW5kIHdlIHNob3VsZCByZXF1ZXN0ICsgMQorCQkgICBhZ2FpbiBiZWNhdXNlIHRoZSBEQkRNQV9BTElHTiBtaWdodCBwdWxsIHRoZSBzdGFydCB1cCBieSB1cAorCQkgICB0byBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkgLSA0LgorCQkqLworCisJCWF3YWNzX3R4X2NtZF9zcGFjZSA9IGttYWxsb2MKKwkJCSgod3JpdGVfc3EubWF4X2NvdW50ICsgMSArIDEpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpLAorCQkJIEdGUF9LRVJORUwpOworCQlpZiAoYXdhY3NfdHhfY21kX3NwYWNlID09IE5VTEwpIHsKKwkJCS8qIGRvbid0IGxlYXZlIGl0IGRhbmdsaW5nIC0gbmFzdHkgYnV0IGJldHRlciB0aGFuIGEKKwkJCSAgIHJhbmRvbSBhZGRyZXNzICovCisJCQlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNtZHB0ciwgdmlydF90b19idXMoYmVlcF9kYmRtYV9jbWQpKTsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgImRtYXNvdW5kX3BtYWM6IGNhbid0IGFsbG9jYXRlIGRiZG1hIGNtZCBidWZmZXJzIgorCQkJICAgIiwgZHJpdmVyIGRpc2FibGVkXG4iKTsKKwkJCVVOTE9DSygpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJYXdhY3NfdHhfY21kcyA9ICh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICopCisJCQlEQkRNQV9BTElHTihhd2Fjc190eF9jbWRfc3BhY2UpOworCQludW1iZXJfb2ZfdHhfY21kX2J1ZmZlcnMgPSB3cml0ZV9zcS5tYXhfY291bnQgKyAxOworCX0KKworCWNwID0gYXdhY3NfdHhfY21kczsKKwltZW1zZXQoKHZvaWQgKiljcCwgMCwgKHdyaXRlX3NxLm1heF9jb3VudCsxKSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSk7CisJZm9yIChpID0gMDsgaSA8IHdyaXRlX3NxLm1heF9jb3VudDsgKytpLCArK2NwKSB7CisJCXN0X2xlMzIoJmNwLT5waHlfYWRkciwgdmlydF90b19idXMod3JpdGVfc3EuYnVmZmVyc1tpXSkpOworCX0KKwlzdF9sZTE2KCZjcC0+Y29tbWFuZCwgREJETUFfTk9QICsgQlJfQUxXQVlTKTsKKwlzdF9sZTMyKCZjcC0+Y21kX2RlcCwgdmlydF90b19idXMoYXdhY3NfdHhfY21kcykpOworCS8qIHBvaW50IHRoZSBjb250cm9sbGVyIGF0IHRoZSBjb21tYW5kIHN0YWNrIC0gcmVhZHkgdG8gZ28gKi8KKwlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNtZHB0ciwgdmlydF90b19idXMoYXdhY3NfdHhfY21kcykpOworCVVOTE9DSygpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IFBNYWNSZWFkU3FTZXR1cCh2b2lkKQoreworCWludCBpLCBjb3VudCA9IDYwMDsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKworCUxPQ0soKTsKKwkKKwkvKiBzdG9wIHRoZSBjb250cm9sbGVyIGZyb20gZG9pbmcgYW55IGlucHV0IC0gaWYgaXQgaXNuJ3QgYWxyZWFkeS4KKwkgICBpdCBfc2hvdWxkXyBiZSBiZWZvcmUgdGhpcyBpcyBjYWxsZWQgYW55d2F5ICovCisJCisJb3V0X2xlMzIoJmF3YWNzX3J4ZG1hLT5jb250cm9sLCAoUlVOfFBBVVNFfEZMVVNIfFdBS0UpIDw8IDE2KTsKKwl3aGlsZSAoKGluX2xlMzIoJmF3YWNzX3J4ZG1hLT5zdGF0dXMpICYgUlVOKSAmJiBjb3VudC0tKQorCQl1ZGVsYXkoMSk7CisjaWZkZWYgREVCVUdfRE1BU09VTkQKK2lmIChjb3VudCA8PSAwKQorCXByaW50aygiZG1hc291bmRfcG1hYzogcmVhZCBzcSBzZXR1cDogdGltZW91dCB3YWl0aW5nIGZvciBkbWEgdG8gc3RvcFxuIik7CisjZW5kaWYKKworCWlmICgocmVhZF9zcS5tYXhfY291bnQrMSkgPiBudW1iZXJfb2ZfcnhfY21kX2J1ZmZlcnMgKSB7CisJCWlmIChhd2Fjc19yeF9jbWRfc3BhY2UpCisJCQlrZnJlZShhd2Fjc19yeF9jbWRfc3BhY2UpOworCQludW1iZXJfb2ZfcnhfY21kX2J1ZmZlcnMgPSAwOworCisJCS8qIHdlIG5lZWQgbmJ1ZnMgKyAxIChmb3IgdGhlIGxvb3ApIGFuZCB3ZSBzaG91bGQgcmVxdWVzdCArIDEgYWdhaW4KKwkJICAgYmVjYXVzZSB0aGUgREJETUFfQUxJR04gbWlnaHQgcHVsbCB0aGUgc3RhcnQgdXAgYnkgdXAgdG8KKwkJICAgc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpIC0gNCAoYXNzdW1pbmcga21hbGxvYyBhbGlnbnMgMzIgYml0cykuCisJCSovCisKKwkJYXdhY3NfcnhfY21kX3NwYWNlID0ga21hbGxvYworCQkJKChyZWFkX3NxLm1heF9jb3VudCArIDEgKyAxKSAqIHNpemVvZihzdHJ1Y3QgZGJkbWFfY21kKSwKKwkJCSBHRlBfS0VSTkVMKTsKKwkJaWYgKGF3YWNzX3J4X2NtZF9zcGFjZSA9PSBOVUxMKSB7CisJCQkvKiBkb24ndCBsZWF2ZSBpdCBkYW5nbGluZyAtIG5hc3R5IGJ1dCBiZXR0ZXIgdGhhbiBhCisJCQkgICByYW5kb20gYWRkcmVzcyAqLworCQkJb3V0X2xlMzIoJmF3YWNzX3J4ZG1hLT5jbWRwdHIsIHZpcnRfdG9fYnVzKGJlZXBfZGJkbWFfY21kKSk7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSAgICJkbWFzb3VuZF9wbWFjOiBjYW4ndCBhbGxvY2F0ZSBkYmRtYSBjbWQgYnVmZmVycyIKKwkJCSAgICIsIGRyaXZlciBkaXNhYmxlZFxuIik7CisJCQlVTkxPQ0soKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWF3YWNzX3J4X2NtZHMgPSAodm9sYXRpbGUgc3RydWN0IGRiZG1hX2NtZCAqKQorCQkJREJETUFfQUxJR04oYXdhY3NfcnhfY21kX3NwYWNlKTsKKwkJbnVtYmVyX29mX3J4X2NtZF9idWZmZXJzID0gcmVhZF9zcS5tYXhfY291bnQgKyAxIDsKKwl9CisJY3AgPSBhd2Fjc19yeF9jbWRzOworCW1lbXNldCgodm9pZCAqKWNwLCAwLCAocmVhZF9zcS5tYXhfY291bnQrMSkgKiBzaXplb2Yoc3RydWN0IGRiZG1hX2NtZCkpOworCisJLyogU2V0IGRtYSBidWZmZXJzIHVwIGluIGEgbG9vcCAqLworCWZvciAoaSA9IDA7IGkgPCByZWFkX3NxLm1heF9jb3VudDsgaSsrLGNwKyspIHsKKwkJc3RfbGUzMigmY3AtPnBoeV9hZGRyLCB2aXJ0X3RvX2J1cyhyZWFkX3NxLmJ1ZmZlcnNbaV0pKTsKKwkJc3RfbGUxNigmY3AtPmNvbW1hbmQsIElOUFVUX01PUkUgKyBJTlRSX0FMV0FZUyk7CisJCXN0X2xlMTYoJmNwLT5yZXFfY291bnQsIHJlYWRfc3EuYmxvY2tfc2l6ZSk7CisJCXN0X2xlMTYoJmNwLT54ZmVyX3N0YXR1cywgMCk7CisJfQorCisJLyogVGhlIG5leHQgdHdvIGxpbmVzIG1ha2UgdGhlIHRoaW5nIGxvb3AgYXJvdW5kLgorCSovCisJc3RfbGUxNigmY3AtPmNvbW1hbmQsIERCRE1BX05PUCArIEJSX0FMV0FZUyk7CisJc3RfbGUzMigmY3AtPmNtZF9kZXAsIHZpcnRfdG9fYnVzKGF3YWNzX3J4X2NtZHMpKTsKKwkvKiBwb2ludCB0aGUgY29udHJvbGxlciBhdCB0aGUgY29tbWFuZCBzdGFjayAtIHJlYWR5IHRvIGdvICovCisJb3V0X2xlMzIoJmF3YWNzX3J4ZG1hLT5jbWRwdHIsIHZpcnRfdG9fYnVzKGF3YWNzX3J4X2NtZHMpKTsKKworCVVOTE9DSygpOworCXJldHVybiAwOworfQorCisvKiBUT0RPOiB0aGlzIG5lZWRzIHdvcmsgdG8gZ3VhcmFudGVlIHRoYXQgd2hlbiBpdCByZXR1cm5zIERNQSBoYXMgc3RvcHBlZAorICAgYnV0IGluIGEgbW9yZSBlbGVnYW50IHdheSB0aGFuIGlzIGRvbmUgaGVyZS4uLi4KKyovCisKK3N0YXRpYyB2b2lkIFBNYWNBYm9ydFJlYWQodm9pZCkKK3sKKwlpbnQgaTsKKwl2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICpjcDsKKworCUxPQ0soKTsKKwkvKiBnaXZlIGl0IGEgY2hhbmNlIHRvIHVwZGF0ZSB0aGUgb3V0cHV0IGFuZCBwcm92aWRlIHRoZSBJUlEKKwkgICB0aGF0IGlzIGV4cGVjdGVkLgorCSovCisKKwlvdXRfbGUzMigmYXdhY3NfcnhkbWEtPmNvbnRyb2wsICgoRkxVU0gpIDw8IDE2KSArIEZMVVNIICk7CisKKwljcCA9IGF3YWNzX3J4X2NtZHM7CisJZm9yIChpID0gMDsgaSA8IHJlYWRfc3EubWF4X2NvdW50OyBpKyssY3ArKykKKwkJc3RfbGUxNigmY3AtPmNvbW1hbmQsIERCRE1BX1NUT1ApOworCS8qCisJICogV2Ugc2hvdWxkIHByb2JhYmx5IHdhaXQgZm9yIHRoZSB0aGluZyB0byBzdG9wIGJlZm9yZSB3ZQorCSAqIHJlbGVhc2UgdGhlIG1lbW9yeS4KKwkgKi8KKworCW1zbGVlcCgxMDApIDsgLyogZ2l2ZSBpdCBhIChzbWFsbCkgY2hhbmNlIHRvIGFjdCAqLworCisJLyogYXBwbHkgdGhlIHNsZWRnZWhhbW1lciBhcHByb2FjaCAtIGp1c3Qgc3RvcCBpdCBub3cgKi8KKworCW91dF9sZTMyKCZhd2Fjc19yeGRtYS0+Y29udHJvbCwgKFJVTnxQQVVTRXxGTFVTSHxXQUtFKSA8PCAxNik7CisJVU5MT0NLKCk7Cit9CisKK2V4dGVybiBjaGFyICpnZXRfYWZtdF9zdHJpbmcoaW50KTsKK3N0YXRpYyBpbnQgUE1hY1N0YXRlSW5mbyhjaGFyICpiLCBzaXplX3Qgc3ApCit7CisJaW50IGksIGxlbiA9IDA7CisJbGVuID0gc3ByaW50ZihiLCJIVyByYXRlczogIik7CisJc3dpdGNoIChhd2Fjc19yZXZpc2lvbil7CisJCWNhc2UgQVdBQ1NfREFDQToKKwkJY2FzZSBBV0FDU19CVVJHVU5EWToKKwkJCWxlbiArPSBzcHJpbnRmKGIsIjQ0MTAwICIpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBBV0FDU19UVU1CTEVSOgorCQljYXNlIEFXQUNTX1NOQVBQRVI6CisJCQlmb3IgKGk9MDsgaTwxOyBpKyspeworCQkJCWlmICh0YXNfZnJlcXNfb2tbaV0pCisJCQkJCWxlbiArPSBzcHJpbnRmKGIrbGVuLCIlZCAiLCB0YXNfZnJlcXNbaV0pIDsKKwkJCX0KKwkJCWJyZWFrIDsKKwkJY2FzZSBBV0FDU19BV0FDUzoKKwkJY2FzZSBBV0FDU19TQ1JFQU1FUjoKKwkJZGVmYXVsdDoKKwkJCWZvciAoaT0wOyBpPDg7IGkrKyl7CisJCQkJaWYgKGF3YWNzX2ZyZXFzX29rW2ldKQorCQkJCQlsZW4gKz0gc3ByaW50ZihiK2xlbiwiJWQgIiwgYXdhY3NfZnJlcXNbaV0pIDsKKwkJCX0KKwkJCWJyZWFrIDsKKwl9CisJbGVuICs9IHNwcmludGYoYitsZW4sInMvc2VjXG4iKSA7CisJaWYgKGxlbiA8IHNwKSB7CisJCWxlbiArPSBzcHJpbnRmKGIrbGVuLCJIVyBBRk1UUzogIik7CisJCWkgPSBBRk1UX1UxNl9CRSA7CisJCXdoaWxlIChpKSB7CisJCQlpZiAoaSAmIGRtYXNvdW5kLm1hY2guaGFyZHdhcmVfYWZtdHMpCisJCQkJbGVuICs9IHNwcmludGYoYitsZW4sIiVzICIsCisJCQkJCWdldF9hZm10X3N0cmluZyhpICYgZG1hc291bmQubWFjaC5oYXJkd2FyZV9hZm10cykpOworCQkJaSA+Pj0gMSA7CisJCX0KKwkJbGVuICs9IHNwcmludGYoYitsZW4sIlxuIikgOworCX0KKwlyZXR1cm4gbGVuIDsKK30KKworLyoqKiBNYWNoaW5lIGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgU0VUVElOR1MgZGVmX2hhcmQgPSB7CisJLmZvcm1hdAk9IEFGTVRfUzE2X0JFLAorCS5zdGVyZW8JPSAxLAorCS5zaXplCT0gMTYsCisJLnNwZWVkCT0gNDQxMDAKK30gOworCitzdGF0aWMgU0VUVElOR1MgZGVmX3NvZnQgPSB7CisJLmZvcm1hdAk9IEFGTVRfUzE2X0JFLAorCS5zdGVyZW8JPSAxLAorCS5zaXplCT0gMTYsCisJLnNwZWVkCT0gNDQxMDAKK30gOworCitzdGF0aWMgTUFDSElORSBtYWNoUE1hYyA9IHsKKwkubmFtZQkJPSBhd2Fjc19uYW1lLAorCS5uYW1lMgkJPSAiUG93ZXJNYWMgQnVpbHQtaW4gU291bmQiLAorCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuZG1hX2FsbG9jCT0gUE1hY0FsbG9jLAorCS5kbWFfZnJlZQk9IFBNYWNGcmVlLAorCS5pcnFpbml0CT0gUE1hY0lycUluaXQsCisjaWZkZWYgTU9EVUxFCisJLmlycWNsZWFudXAJPSBQTWFjSXJxQ2xlYW51cCwKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwkuaW5pdAkJPSBQTWFjSW5pdCwKKwkuc2lsZW5jZQk9IFBNYWNTaWxlbmNlLAorCS5zZXRGb3JtYXQJPSBQTWFjU2V0Rm9ybWF0LAorCS5zZXRWb2x1bWUJPSBQTWFjU2V0Vm9sdW1lLAorCS5wbGF5CQk9IFBNYWNQbGF5LAorCS5yZWNvcmQJCT0gTlVMTCwJCS8qIGRlZmF1bHQgdG8gbm8gcmVjb3JkICovCisJLm1peGVyX2luaXQJPSBQTWFjTWl4ZXJJbml0LAorCS5taXhlcl9pb2N0bAk9IFBNYWNNaXhlcklvY3RsLAorCS53cml0ZV9zcV9zZXR1cAk9IFBNYWNXcml0ZVNxU2V0dXAsCisJLnJlYWRfc3Ffc2V0dXAJPSBQTWFjUmVhZFNxU2V0dXAsCisJLnN0YXRlX2luZm8JPSBQTWFjU3RhdGVJbmZvLAorCS5hYm9ydF9yZWFkCT0gUE1hY0Fib3J0UmVhZCwKKwkubWluX2RzcF9zcGVlZAk9IDczNTAsCisJLm1heF9kc3Bfc3BlZWQJPSA0NDEwMCwKKwkudmVyc2lvbgk9ICgoRE1BU09VTkRfQVdBQ1NfUkVWSVNJT048PDgpICsgRE1BU09VTkRfQVdBQ1NfRURJVElPTikKK307CisKKworLyoqKiBDb25maWcgJiBTZXR1cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDaGVjayBmb3IgcG1hYyBtb2RlbHMgdGhhdCB3ZSBjYXJlIGFib3V0IGluIHRlcm1zIG9mIHNwZWNpYWwgYWN0aW9ucy4KKyovCisKK3ZvaWQgX19pbml0CitzZXRfbW9kZWwodm9pZCkKK3sKKwkvKiBwb3J0YWJsZXMvbGFwLXRvcHMgKi8KKworCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIkFBUEwsMzQwMC8yNDAwIikgfHwKKwkgICAgbWFjaGluZV9pc19jb21wYXRpYmxlKCJBQVBMLDM1MDAiKSkJeworCQlpc19wYm9va18zWDAwID0gMSA7CisJfQorCWlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazEsMSIpICB8fCAvKiBsb21iYXJkICovCisJICAgIG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiQUFQTCxQb3dlckJvb2sxOTk4IikpeyAvKiB3YWxsc3RyZWV0ICovCisJCWlzX3Bib29rX2czID0gMSA7CisJCXJldHVybiA7CisJfQorfQorCisvKiBHZXQgdGhlIE9GIG5vZGUgdGhhdCB0ZWxscyB1cyBhYm91dCB0aGUgcmVnaXN0ZXJzLCBpbnRlcnJ1cHRzIGV0Yy4gdG8gdXNlCisgICBmb3Igc291bmQgSU8uCisKKyAgIE9uIG1vc3QgbWFjaGluZXMgdGhlIHNvdW5kIElPIE9GIG5vZGUgaXMgdGhlICdkYXZidXMnIG5vZGUuICBPbiBuZXdlciBwbWFjcworICAgd2l0aCBEQUNBICgmIFR1bWJsZXIpIHRoZSBub2RlIHRvIHVzZSBpcyBpMnMtYS4gIE9uIG11Y2ggb2xkZXIgbWFjaGluZXMgaS5lLgorICAgYmVmb3JlIDk1MDAgdGhlcmUgaXMgbm8gZGF2YnVzIG5vZGUgYW5kIHdlIGhhdmUgdG8gdXNlIHRoZSAnYXdhY3MnIHByb3BlcnR5LgorCisgIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSBzaWduYWwgdGhpcyBieSBzZXR0aW5nIHRoZSBjb2RlYyB2YWx1ZSAtIHNvIHRoYXQgdGhlCisgIGNvZGUgdGhhdCBsb29rcyBmb3IgY2hpcCBwcm9wZXJ0aWVzIGtub3dzIGhvdyB0byBnbyBhYm91dCBpdC4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUqIF9faW5pdAorZ2V0X3NuZF9pb19ub2RlKHZvaWQpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpucCA9IE5VTEw7CisKKwkvKiBzZXQgdXAgYXdhY3Nfbm9kZSBmb3IgZWFybHkgT0Ygd2hpY2ggZG9lc24ndCBoYXZlIGEgZnVsbCBzZXQgb2YKKwkgKiBwcm9wZXJ0aWVzIG9uIGRhdmJ1cworCSovCisKKwlhd2Fjc19ub2RlID0gZmluZF9kZXZpY2VzKCJhd2FjcyIpOworCWlmIChhd2Fjc19ub2RlKQorCQlhd2Fjc19yZXZpc2lvbiA9IEFXQUNTX0FXQUNTOworCisJLyogcG93ZXJtYWMgbW9kZWxzIGFmdGVyIDk1MDAgKG90aGVyIHRoYW4gdGhvc2Ugd2hpY2ggdXNlIERBQ0Egb3IKKwkgKiBUdW1ibGVyKSBoYXZlIGEgbm9kZSBjYWxsZWQgImRhdmJ1cyIuCisJICovCisJbnAgPSBmaW5kX2RldmljZXMoImRhdmJ1cyIpOworCS8qCisJICogaWYgd2UgZGlkbid0IGZpbmQgYSBkYXZidXMgZGV2aWNlLCB0cnkgJ2kycy1hJyBzaW5jZQorCSAqIHRoaXMgc2VlbXMgdG8gYmUgd2hhdCBpQm9va3MgKCYgVHVtYmxlcikgaGF2ZS4KKwkgKi8KKwlpZiAobnAgPT0gTlVMTCkKKwkJbnAgPSBpMnNfbm9kZSA9IGZpbmRfZGV2aWNlcygiaTJzLWEiKTsKKworCS8qIGlmIHdlIGRpZG4ndCBmaW5kIHRoaXMgLSBwZXJoYXBzIHdlIGFyZSBvbiBhbiBlYXJseSBtb2RlbAorCSAqIHdoaWNoIF9vbmx5XyBoYXMgYW4gJ2F3YWNzJyBub2RlCisJKi8KKwlpZiAobnAgPT0gTlVMTCAmJiBhd2Fjc19ub2RlKQorCQlucCA9IGF3YWNzX25vZGUgOworCisJLyogaWYgd2UgZmFpbGVkIGFsbCB0aGVzZSByZXR1cm4gbnVsbCAtIHRoaXMgd2lsbCBjYXVzZSB0aGUKKwkgKiBkcml2ZXIgdG8gZ2l2ZSB1cC4uLgorCSovCisJcmV0dXJuIG5wIDsKK30KKworLyogR2V0IHRoZSBPRiBub2RlIHRoYXQgY29udGFpbnMgdGhlIGluZm8gYWJvdXQgdGhlIHNvdW5kIGNoaXAsIGlucHV0cyBzLXJhdGVzCisgICBldGMuCisgICBUaGlzIG5vZGUgZG9lcyBub3QgZXhpc3QgKG9yIGNvbnRhaW5zIG11Y2ggcmVkdWNlZCBpbmZvKSBvbiBlYXJsaWVyIG1hY2hpbmVzCisgICB3ZSBoYXZlIHRvIGRlZHVjZSB0aGUgaW5mbyBvdGhlciB3YXlzIGZvciB0aGVzZS4KKyovCisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUqIF9faW5pdAorZ2V0X3NuZF9pbmZvX25vZGUoc3RydWN0IGRldmljZV9ub2RlICppbykKK3sKKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmluZm87CisKKwlpbmZvID0gZmluZF9kZXZpY2VzKCJzb3VuZCIpOworCXdoaWxlIChpbmZvICYmIGluZm8tPnBhcmVudCAhPSBpbykKKwkJaW5mbyA9IGluZm8tPm5leHQ7CisJcmV0dXJuIGluZm87Cit9CisKKy8qIEZpbmQgb3V0IHdoYXQgdHlwZSBvZiBjb2RlYyB3ZSBoYXZlLgorKi8KKworc3RhdGljIGludCBfX2luaXQKK2dldF9jb2RlY190eXBlKHN0cnVjdCBkZXZpY2Vfbm9kZSAqaW5mbykKK3sKKwkvKiBhbHJlYWR5IHNldCBpZiBwcmUtZGF2YnVzIG1vZGVsIGFuZCBpbmZvIHdpbGwgYmUgTlVMTCAqLworCWludCBjb2RlYyA9IGF3YWNzX3JldmlzaW9uIDsKKworCWlmIChpbmZvKSB7CisJCS8qIG11c3QgZG8gYXdhY3MgZmlyc3QgdG8gYWxsb3cgc2NyZWFtZXIgdG8gb3ZlcmlkZSBpdCAqLworCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoaW5mbywgImF3YWNzIikpCisJCQljb2RlYyA9IEFXQUNTX0FXQUNTIDsKKwkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGluZm8sICJzY3JlYW1lciIpKQorCQkJY29kZWMgPSBBV0FDU19TQ1JFQU1FUjsKKwkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGluZm8sICJidXJndW5keSIpKQorCQkJY29kZWMgPSBBV0FDU19CVVJHVU5EWSA7CisJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShpbmZvLCAiZGFjYSIpKQorCQkJY29kZWMgPSBBV0FDU19EQUNBOworCQlpZiAoZGV2aWNlX2lzX2NvbXBhdGlibGUoaW5mbywgInR1bWJsZXIiKSkKKwkJCWNvZGVjID0gQVdBQ1NfVFVNQkxFUjsKKwkJaWYgKGRldmljZV9pc19jb21wYXRpYmxlKGluZm8sICJzbmFwcGVyIikpCisJCQljb2RlYyA9IEFXQUNTX1NOQVBQRVI7CisJfQorCXJldHVybiBjb2RlYyA7Cit9CisKKy8qIGZpbmQgb3V0IHdoYXQgdHlwZSwgaWYgYW55LCBvZiBleHBhbnNpb24gY2FyZCB3ZSBoYXZlCisqLworc3RhdGljIHZvaWQgX19pbml0CitnZXRfZXhwYW5zaW9uX3R5cGUodm9pZCkKK3sKKwlpZiAoZmluZF9kZXZpY2VzKCJwZXJjaCIpICE9IE5VTEwpCisJCWhhc19wZXJjaCA9IDE7CisKKwlpZiAoZmluZF9kZXZpY2VzKCJwYi16aXZhLXBjIikgIT0gTlVMTCkKKwkJaGFzX3ppdmEgPSAxOworCS8qIG5lZWQgdG8gd29yayBvdXQgaG93IHdlIGRlYWwgd2l0aCBpTWFjIFNSUyBtb2R1bGUgKi8KK30KKworLyogc2V0IHVwIGZyYW1lIHJhdGVzLgorICogSSBzdXNwZWN0IHRoYXQgdGhlc2Ugcm91dGluZXMgZG9uJ3QgcXVpdGUgZ28gYWJvdXQgaXQgdGhlIHJpZ2h0IHdheToKKyAqIC0gd2hlcmUgdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSByYXRlIC0gSSB0aGluayB0aGF0IHRoZSBmaXJzdCBwcm9wZXJ0eQorICogdmFsdWUgaXMgdGhlIG51bWJlciBvZiByYXRlcy4KKyAqIFRPRE86IGNoZWNrIHNvbWUgbW9yZSBkZXZpY2UgdHJlZXMgYW5kIG1vZGlmeSBhY2NvcmRpbmdseQorICogICAgICAgU2V0IGRtYXNvdW5kLm1hY2gubWF4X2RzcF9yYXRlIG9uIHRoZSBiYXNpcyBvZiB0aGVzZSByb3V0aW5lcy4KKyovCisKK3N0YXRpYyB2b2lkIF9faW5pdAorYXdhY3NfaW5pdF9mcmFtZV9yYXRlcyh1bnNpZ25lZCBpbnQgKnByb3AsIHVuc2lnbmVkIGludCBsKQoreworCWludCBpIDsKKwlpZiAocHJvcCkgeworCQlmb3IgKGk9MDsgaTw4OyBpKyspCisJCQlhd2Fjc19mcmVxc19va1tpXSA9IDAgOworCQlmb3IgKGwgLz0gc2l6ZW9mKGludCk7IGwgPiAwOyAtLWwpIHsKKwkJCXVuc2lnbmVkIGludCByID0gKnByb3ArKzsKKwkJCS8qIEFwcGxlICdGaXhlZCcgZm9ybWF0ICovCisJCQlpZiAociA+PSAweDEwMDAwKQorCQkJCXIgPj49IDE2OworCQkJZm9yIChpID0gMDsgaSA8IDg7ICsraSkgeworCQkJCWlmIChyID09IGF3YWNzX2ZyZXFzW2ldKSB7CisJCQkJCWF3YWNzX2ZyZXFzX29rW2ldID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisJfQorCS8qIGVsc2Ugd2UgYXNzdW1lIHRoYXQgYWxsIHRoZSByYXRlcyBhcmUgYXZhaWxhYmxlICovCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorYnVyZ3VuZHlfaW5pdF9mcmFtZV9yYXRlcyh1bnNpZ25lZCBpbnQgKnByb3AsIHVuc2lnbmVkIGludCBsKQoreworCWludCB0ZW1wWzldIDsKKwlpbnQgaSA9IDAgOworCWlmIChwcm9wKSB7CisJCWZvciAobCAvPSBzaXplb2YoaW50KTsgbCA+IDA7IC0tbCkgeworCQkJdW5zaWduZWQgaW50IHIgPSAqcHJvcCsrOworCQkJLyogQXBwbGUgJ0ZpeGVkJyBmb3JtYXQgKi8KKwkJCWlmIChyID49IDB4MTAwMDApCisJCQkJciA+Pj0gMTY7CisJCQl0ZW1wW2ldID0gciA7CisJCQlpKysgOyBpZihpPj05KSBpPTg7CisJCX0KKwl9CisjaWZkZWYgREVCVUdfRE1BU09VTkQKK2lmIChpID4gMSl7CisJaW50IGo7CisJcHJpbnRrKCJkbWFzb3VuZF9wbWFjOiBidXJndW5keSB3aXRoIG11bHRpcGxlIGZyYW1lIHJhdGVzXG4iKTsKKwlmb3Ioaj0wOyBqPGk7IGorKykKKwkJcHJpbnRrKCIlZCAiLCB0ZW1wW2pdKSA7CisJcHJpbnRrKCJcbiIpIDsKK30KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBfX2luaXQKK2RhY2FfaW5pdF9mcmFtZV9yYXRlcyh1bnNpZ25lZCBpbnQgKnByb3AsIHVuc2lnbmVkIGludCBsKQoreworCWludCB0ZW1wWzldIDsKKwlpbnQgaSA9IDAgOworCWlmIChwcm9wKSB7CisJCWZvciAobCAvPSBzaXplb2YoaW50KTsgbCA+IDA7IC0tbCkgeworCQkJdW5zaWduZWQgaW50IHIgPSAqcHJvcCsrOworCQkJLyogQXBwbGUgJ0ZpeGVkJyBmb3JtYXQgKi8KKwkJCWlmIChyID49IDB4MTAwMDApCisJCQkJciA+Pj0gMTY7CisJCQl0ZW1wW2ldID0gciA7CisJCQlpKysgOyBpZihpPj05KSBpPTg7CisKKwkJfQorCX0KKyNpZmRlZiBERUJVR19ETUFTT1VORAoraWYgKGkgPiAxKXsKKwlpbnQgajsKKwlwcmludGsoImRtYXNvdW5kX3BtYWM6IERBQ0Egd2l0aCBtdWx0aXBsZSBmcmFtZSByYXRlc1xuIik7CisJZm9yKGo9MDsgajxpOyBqKyspCisJCXByaW50aygiJWQgIiwgdGVtcFtqXSkgOworCXByaW50aygiXG4iKSA7Cit9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgX19pbml0Citpbml0X2ZyYW1lX3JhdGVzKHVuc2lnbmVkIGludCAqcHJvcCwgdW5zaWduZWQgaW50IGwpCit7CisJc3dpdGNoIChhd2Fjc19yZXZpc2lvbikgeworCQljYXNlIEFXQUNTX1RVTUJMRVI6CisJCWNhc2UgQVdBQ1NfU05BUFBFUjoKKwkJCXRhc19pbml0X2ZyYW1lX3JhdGVzKHByb3AsIGwpOworCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX0RBQ0E6CisJCQlkYWNhX2luaXRfZnJhbWVfcmF0ZXMocHJvcCwgbCk7CisJCQlicmVhayA7CisJCWNhc2UgQVdBQ1NfQlVSR1VORFk6CisJCQlidXJndW5keV9pbml0X2ZyYW1lX3JhdGVzKHByb3AsIGwpOworCQkJYnJlYWsgOworCQlkZWZhdWx0OgorCQkJYXdhY3NfaW5pdF9mcmFtZV9yYXRlcyhwcm9wLCBsKTsKKwkJCWJyZWFrIDsKKwl9Cit9CisKKy8qIGZpbmQgdGhpbmdzL21hY2hpbmVzIHRoYXQgY2FuJ3QgZG8gbWFjLWlvIGJ5dGVzd2FwCisqLworCitzdGF0aWMgdm9pZCBfX2luaXQKK3NldF9od19ieXRlc3dhcChzdHJ1Y3QgZGV2aWNlX25vZGUgKmlvKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbWlvIDsKKwl1bnNpZ25lZCBpbnQga2wgPSAwIDsKKworCS8qIGlmIHNlZW1zIHRoYXQgS2V5bGFyZ28gY2FuJ3QgYnl0ZS1zd2FwICAqLworCisJZm9yIChtaW8gPSBpby0+cGFyZW50OyBtaW8gOyBtaW8gPSBtaW8tPnBhcmVudCkgeworCQlpZiAoc3RyY21wKG1pby0+bmFtZSwgIm1hYy1pbyIpID09IDApIHsKKwkJCWlmIChkZXZpY2VfaXNfY29tcGF0aWJsZShtaW8sICJLZXlsYXJnbyIpKQorCQkJCWtsID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorCWh3X2Nhbl9ieXRlc3dhcCA9ICFrbDsKK30KKworLyogQWxsb2NhdGUgdGhlIHJlc291cmNlcyBuZWNlc3NhcnkgZm9yIGJlZXAgZ2VuZXJhdGlvbi4gIFRoaXMgY2Fubm90IGJlIChxdWl0ZSkKKyAgIGRvbmUgc3RhdGljYWxseSAoeWV0KSBiZWNhdXNlIHdlIGNhbm5vdCBkbyB2aXJ0X3RvX2J1cygpIG9uIHN0YXRpYyB2YXJzIHdoZW4KKyAgIHRoZSBjb2RlIGlzIGxvYWRlZCBhcyBhIG1vZHVsZS4KKworICAgZm9yIHRoZSBzYWtlIG9mIHNhdmluZyB0aGUgcG9zc2liaWxpdHkgdGhhdCB0d28gYWxsb2NhdGlvbnMgd2lsbCBpbmN1ciB0aGUKKyAgIG92ZXJoZWFkIG9mIHR3byBwdWxsLXVwcyBpbiBEQkRNQV9BTElHTigpIHdlIGFsbG9jYXRlIHRoZSAnZW1lcmdlbmN5JyBkbWRtYQorICAgY29tbWFuZCBoZXJlIGFzIHdlbGwuLi4gZXZlbiB0aG8nIGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBiZWVwIHByb2Nlc3MuCisqLworCitpbnQzMl90CitfX2luaXQgc2V0dXBfYmVlcCh2b2lkKQoreworCS8qIEluaXRpYWxpemUgYmVlcCBzdHVmZiAqLworCS8qIHdhbnQgb25lIGNtZCBidWZmZXIgZm9yIGJlZXBzLCBhbmQgYSBzZWNvbmQgb25lIGZvciBlbWVyZ2VuY2llcworCSAgIC0gaS5lLiBkYmRtYSBlcnJvciBjb25kaXRpb25zLgorCSAgIGFzayBmb3IgdGhyZWUgdG8gYWxsb3cgZm9yIHB1bGwgdXAgaW4gREJETUFfQUxJR04oKS4KKwkqLworCWJlZXBfZGJkbWFfY21kX3NwYWNlID0KKwkJa21hbGxvYygoMiArIDEpICogc2l6ZW9mKHN0cnVjdCBkYmRtYV9jbWQpLCBHRlBfS0VSTkVMKTsKKwlpZihiZWVwX2RiZG1hX2NtZF9zcGFjZSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hc291bmRfcG1hYzogbm8gYmVlcCBkYmRtYSBjbWQgc3BhY2VcbiIpIDsKKwkJcmV0dXJuIC1FTk9NRU0gOworCX0KKwliZWVwX2RiZG1hX2NtZCA9ICh2b2xhdGlsZSBzdHJ1Y3QgZGJkbWFfY21kICopCisJCQlEQkRNQV9BTElHTihiZWVwX2RiZG1hX2NtZF9zcGFjZSk7CisJLyogc2V0IHVwIGVtZXJnZW5jeSBkYmRtYSBjbWQgKi8KKwllbWVyZ2VuY3lfZGJkbWFfY21kID0gYmVlcF9kYmRtYV9jbWQrMSA7CisJYmVlcF9idWYgPSAoc2hvcnQgKikga21hbGxvYyhCRUVQX0JVRkxFTiAqIDQsIEdGUF9LRVJORUwpOworCWlmIChiZWVwX2J1ZiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hc291bmRfcG1hYzogbm8gbWVtb3J5IGZvciBiZWVwIGJ1ZmZlclxuIik7CisJCWlmKCBiZWVwX2RiZG1hX2NtZF9zcGFjZSApIGtmcmVlKGJlZXBfZGJkbWFfY21kX3NwYWNlKSA7CisJCXJldHVybiAtRU5PTUVNIDsKKwl9CisJcmV0dXJuIDAgOworfQorCitzdGF0aWMgc3RydWN0IGlucHV0X2RldiBhd2Fjc19iZWVwX2RldiA9IHsKKwkuZXZiaXQJCT0geyBCSVQoRVZfU05EKSB9LAorCS5zbmRiaXQJCT0geyBCSVQoU05EX0JFTEwpIHwgQklUKFNORF9UT05FKSB9LAorCS5ldmVudAkJPSBhd2Fjc19iZWVwX2V2ZW50LAorCS5uYW1lCQk9ICJkbWFzb3VuZCBiZWVwZXIiLAorCS5waHlzCQk9ICJtYWNpby9pbnB1dDAiLCAvKiB3aGF0IHRoZSBoZWNrIGlzIHRoaXM/PyAqLworCS5pZAkJPSB7CisJCS5idXN0eXBlCT0gQlVTX0hPU1QsCisJfSwKK307CisKK2ludCBfX2luaXQgZG1hc291bmRfYXdhY3NfaW5pdCh2b2lkKQoreworCXN0cnVjdCBkZXZpY2Vfbm9kZSAqaW8gPSBOVUxMLCAqaW5mbyA9IE5VTEw7CisJaW50IHZvbCwgcmVzOworCisJaWYgKF9tYWNoaW5lICE9IF9NQUNIX1BtYWMpCisJCXJldHVybiAtRU5PREVWOworCisJYXdhY3Nfc3ViZnJhbWUgPSAwOworCWF3YWNzX3JldmlzaW9uID0gMDsKKwlod19jYW5fYnl0ZXN3YXAgPSAxIDsgLyogbW9zdCBjYW4gKi8KKworCS8qIGxvb2sgZm9yIG1vZGVscyB3ZSBuZWVkIHRvIGhhbmRsZSBzcGVjaWFsbHkgKi8KKwlzZXRfbW9kZWwoKSA7CisKKwkvKiBmaW5kIHRoZSBPRiBub2RlIHRoYXQgdGVsbHMgdXMgYWJvdXQgdGhlIGRiZG1hIHN0dWZmCisJKi8KKwlpbyA9IGdldF9zbmRfaW9fbm9kZSgpOworCWlmIChpbyA9PSBOVUxMKSB7CisjaWZkZWYgREVCVUdfRE1BU09VTkQKK3ByaW50aygiZG1hc291bmRfcG1hYzogY291bGRuJ3QgZmluZCBzb3VuZCBpbyBPRiBub2RlXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVOT0RFViA7CisJfQorCisJLyogZmluZCB0aGUgT0Ygbm9kZSB0aGF0IHRlbGxzIHVzIGFib3V0IHRoZSBzb3VuZCBzdWItc3lzdGVtCisJICogdGhpcyBkb2Vzbid0IGV4aXN0IG9uIHByZS1kYXZidXMgbWFjaGluZXMgKGVhcmxpZXIgdGhhbiA5NTAwKQorCSovCisJaWYgKGF3YWNzX3JldmlzaW9uICE9IEFXQUNTX0FXQUNTKSB7IC8qIHNldCBmb3IgcHJlLWRhdmJ1cyAqLworCQlpbmZvID0gZ2V0X3NuZF9pbmZvX25vZGUoaW8pIDsKKwkJaWYgKGluZm8gPT0gTlVMTCl7CisjaWZkZWYgREVCVUdfRE1BU09VTkQKK3ByaW50aygiZG1hc291bmRfcG1hYzogY291bGRuJ3QgZmluZCAnc291bmQnIE9GIG5vZGVcbiIpOworI2VuZGlmCisJCQlyZXR1cm4gLUVOT0RFViA7CisJCX0KKwl9CisKKwlhd2Fjc19yZXZpc2lvbiA9IGdldF9jb2RlY190eXBlKGluZm8pIDsKKwlpZiAoYXdhY3NfcmV2aXNpb24gPT0gMCkgeworI2lmZGVmIERFQlVHX0RNQVNPVU5ECitwcmludGsoImRtYXNvdW5kX3BtYWM6IGNvdWxkbid0IGZpbmQgYSBDb2RlYyB3ZSBjYW4gaGFuZGxlXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVOT0RFViA7IC8qIHdlIGRvbid0IGtub3cgdGhpcyB0eXBlIG9mIGgvdyAqLworCX0KKworCS8qIHNldCB1cCBwZXJjaCwgeml2YSwgU1JTIG9yIHdoYXRldmVyIGVsc2Ugd2UgaGF2ZSBhcyBzb3VuZAorCSAqICBleHBhbnNpb24uCisJKi8KKwlnZXRfZXhwYW5zaW9uX3R5cGUoKTsKKworCS8qIHdlJ3ZlIG5vdyBnb3QgZW5vdWdoIGluZm9ybWF0aW9uIHRvIG1ha2UgdXAgdGhlIGF1ZGlvIHRvcG9sb2d5LgorCSAqIHdlIHdpbGwgbWFwIHRoZSBzb3VuZCBwYXJ0IG9mIG1hYy1pbyBub3cgc28gdGhhdCB3ZSBjYW4gcHJvYmUgZm9yCisJICogb3RoZXIgaW5mbyBpZiBuZWNlc3NhcnkgKGVhcmx5IEFXQUNTIHdlIHdhbnQgdG8gcmVhZCBjaGlwIGlkcykKKwkgKi8KKworCWlmIChpby0+bl9hZGRycyA8IDMgfHwgaW8tPm5faW50cnMgPCAzKSB7CisJCS8qIE9LIC0gbWF5YmUgd2UgbmVlZCB0byB1c2UgdGhlICdhd2Fjcycgbm9kZSAob24gZWFybGllcgorCQkgKiBtYWNoaW5lcykuCisJCSovCisJCWlmIChhd2Fjc19ub2RlKSB7CisJCQlpbyA9IGF3YWNzX25vZGUgOworCQkJaWYgKGlvLT5uX2FkZHJzIDwgMyB8fCBpby0+bl9pbnRycyA8IDMpIHsKKwkJCQlwcmludGsoImRtYXNvdW5kX3BtYWM6IGNhbid0IHVzZSAlcyIKKwkJCQkJIiAoJWQgYWRkcnMsICVkIGludHJzKVxuIiwKKwkJICAgICAgCQkgaW8tPmZ1bGxfbmFtZSwgaW8tPm5fYWRkcnMsIGlvLT5uX2ludHJzKTsKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByaW50aygiZG1hc291bmRfcG1hYzogY2FuJ3QgdXNlICVzICglZCBhZGRycywgJWQgaW50cnMpXG4iLAorCQkgCSAgICAgIGlvLT5mdWxsX25hbWUsIGlvLT5uX2FkZHJzLCBpby0+bl9pbnRycyk7CisJCX0KKwl9CisKKwlpZiAoIXJlcXVlc3RfT0ZfcmVzb3VyY2UoaW8sIDAsIE5VTEwpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZG1hc291bmQ6IGNhbid0IHJlcXVlc3QgSU8gcmVzb3VyY2UgIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZiAoIXJlcXVlc3RfT0ZfcmVzb3VyY2UoaW8sIDEsICIgKHR4IGRtYSkiKSkgeworCQlyZWxlYXNlX09GX3Jlc291cmNlKGlvLCAwKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZDogY2FuJ3QgcmVxdWVzdCBUWCBETUEgcmVzb3VyY2UgIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghcmVxdWVzdF9PRl9yZXNvdXJjZShpbywgMiwgIiAocnggZG1hKSIpKSB7CisJCXJlbGVhc2VfT0ZfcmVzb3VyY2UoaW8sIDApOworCQlyZWxlYXNlX09GX3Jlc291cmNlKGlvLCAxKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZDogY2FuJ3QgcmVxdWVzdCBSWCBETUEgcmVzb3VyY2UgIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIGFsbCBPRiB2ZXJzaW9ucyBJJ3ZlIHNlZW4gdXNlIHRoaXMgdmFsdWUgKi8KKwlpZiAoaTJzX25vZGUpCisJCWkycyA9IGlvcmVtYXAoaW8tPmFkZHJzWzBdLmFkZHJlc3MsIDB4MTAwMCk7CisJZWxzZQorCQlhd2FjcyA9IGlvcmVtYXAoaW8tPmFkZHJzWzBdLmFkZHJlc3MsIDB4MTAwMCk7CisJYXdhY3NfdHhkbWEgPSBpb3JlbWFwKGlvLT5hZGRyc1sxXS5hZGRyZXNzLCAweDEwMCk7CisJYXdhY3NfcnhkbWEgPSBpb3JlbWFwKGlvLT5hZGRyc1syXS5hZGRyZXNzLCAweDEwMCk7CisKKwkvKiBmaXJzdCBvZiBhbGwgbWFrZSBzdXJlIHRoYXQgdGhlIGNoaXAgaXMgcG93ZXJlZCB1cC4uLi4qLworCXBtYWNfY2FsbF9mZWF0dXJlKFBNQUNfRlRSX1NPVU5EX0NISVBfRU5BQkxFLCBpbywgMCwgMSk7CisJaWYgKGF3YWNzX3JldmlzaW9uID09IEFXQUNTX1NDUkVBTUVSICYmIGF3YWNzKQorCQlhd2Fjc19yZWNhbGlicmF0ZSgpOworCisJYXdhY3NfaXJxID0gaW8tPmludHJzWzBdLmxpbmU7CisJYXdhY3NfdHhfaXJxID0gaW8tPmludHJzWzFdLmxpbmU7CisJYXdhY3NfcnhfaXJxID0gaW8tPmludHJzWzJdLmxpbmU7CisKKwkvKiBIYWNrIGZvciBsZWdhY3kgY3JhcCB0aGF0IHdpbGwgYmUga2lsbGVkIHNvbWVkYXkgKi8KKwlhd2Fjc19ub2RlID0gaW87CisKKwkvKiBpZiB3ZSBoYXZlIGFuIGF3YWNzIG9yIHNjcmVhbWVyIC0gcHJvYmUgdGhlIGNoaXAgdG8gbWFrZQorCSAqIHN1cmUgd2UgaGF2ZSB0aGUgcmlnaHQgcmV2aXNpb24uCisJKi8KKworCWlmIChhd2Fjc19yZXZpc2lvbiA8PSBBV0FDU19TQ1JFQU1FUil7CisJCXVpbnQzMl90IHRlbXAsIHJldiwgbWZnIDsKKwkJLyogZmluZCBvdXQgdGhlIGF3YWNzIHJldmlzaW9uIGZyb20gdGhlIGNoaXAgKi8KKwkJdGVtcCA9IGluX2xlMzIoJmF3YWNzLT5jb2RlY19zdGF0KTsKKwkJcmV2ID0gKHRlbXAgPj4gMTIpICYgMHhmOworCQltZmcgPSAodGVtcCA+PiAgOCkgJiAweGY7CisjaWZkZWYgREVCVUdfRE1BU09VTkQKK3ByaW50aygiZG1hc291bmRfcG1hYzogQXdhY3MvU2NyZWFtZXIgQ29kZWMgTWZjdDogJWQgUmV2ICVkXG4iLCBtZmcsIHJldik7CisjZW5kaWYKKwkJaWYgKHJldiA+PSBBV0FDU19TQ1JFQU1FUikKKwkJCWF3YWNzX3JldmlzaW9uID0gQVdBQ1NfU0NSRUFNRVIgOworCQllbHNlCisJCQlhd2Fjc19yZXZpc2lvbiA9IHJldiA7CisJfQorCisJZG1hc291bmQubWFjaCA9IG1hY2hQTWFjOworCisJLyogZmluZCBvdXQgb3RoZXIgYml0cyAmIHBpZWNlcyBmcm9tIE9GLCB0aGVzZSBtYXkgYmUgcHJlc2VudAorCSAgIG9ubHkgb24gc29tZSBtb2RlbHMgLi4uIHNvIGJlIGNhcmVmdWwuCisJKi8KKworCS8qIGluIHRoZSBhYnNlbmNlIG9mIGEgZnJhbWUgcmF0ZXMgcHJvcGVydHkgd2Ugd2lsbCB1c2UgdGhlIGRlZmF1bHRzCisJKi8KKworCWlmIChpbmZvKSB7CisJCXVuc2lnbmVkIGludCAqcHJvcCwgbDsKKworCQlzb3VuZF9kZXZpY2VfaWQgPSAwOworCQkvKiBkZXZpY2UgSUQgYXBwZWFycyBwb3N0IGczIGImdyAqLworCQlwcm9wID0gKHVuc2lnbmVkIGludCAqKWdldF9wcm9wZXJ0eShpbmZvLCAiZGV2aWNlLWlkIiwgTlVMTCk7CisJCWlmIChwcm9wICE9IDApCisJCQlzb3VuZF9kZXZpY2VfaWQgPSAqcHJvcDsKKworCQkvKiBsb29rIGZvciBhIHByb3BlcnR5IHNheWluZyB3aGF0IHNhbXBsZSByYXRlcworCQkgICBhcmUgYXZhaWxhYmxlICovCisKKwkJcHJvcCA9ICh1bnNpZ25lZCBpbnQgKilnZXRfcHJvcGVydHkoaW5mbywgInNhbXBsZS1yYXRlcyIsICZsKTsKKwkJaWYgKHByb3AgPT0gMCkKKwkJCXByb3AgPSAodW5zaWduZWQgaW50ICopIGdldF9wcm9wZXJ0eQorCQkJCShpbmZvLCAib3V0cHV0LWZyYW1lLXJhdGVzIiwgJmwpOworCisJCS8qIGlmIGl0J3MgdGhlcmUgdXNlIGl0IHRvIHNldCB1cCBmcmFtZSByYXRlcyAqLworCQlpbml0X2ZyYW1lX3JhdGVzKHByb3AsIGwpIDsKKwl9CisKKwlpZiAoYXdhY3MpCisJCW91dF9sZTMyKCZhd2Fjcy0+Y29udHJvbCwgMHgxMSk7IC8qIHNldCBldmVyeXRoaW5nIHF1aWVzZW50ICovCisKKwlzZXRfaHdfYnl0ZXN3YXAoaW8pIDsgLyogZmlndXJlIG91dCBpZiB0aGUgaC93IGNhbiBkbyBpdCAqLworCisjaWZkZWYgQ09ORklHX05WUkFNCisJLyogZ2V0IGRlZmF1bHQgdm9sdW1lIGZyb20gbnZyYW0gKi8KKwl2b2wgPSAoKHBtYWNfeHByYW1fcmVhZCggOCApICYgNyApIDw8IDEgKTsKKyNlbHNlCisJdm9sID0gMDsKKyNlbmRpZgorCisJLyogc2V0IHVwIHRyYWNraW5nIHZhbHVlcyAqLworCXNwa192b2wgPSB2b2wgKiAxMDAgOworCXNwa192b2wgLz0gNyA7IC8qIGdldCBzZXQgdmFsdWUgdG8gYSBwZXJjZW50YWdlICovCisJc3BrX3ZvbCB8PSAoc3BrX3ZvbCA8PCA4KSA7IC8qIGVxdWFsIGxlZnQgJiByaWdodCAqLworIAlsaW5lX3ZvbCA9IHBhc3N0aHJ1X3ZvbCA9IHNwa192b2wgOworCisJLyogZmlsbCByZWdzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIEFXQUNTICYgQnVyZ3VuZHkgKi8KKworCWF3YWNzX3JlZ1syXSA9IHZvbCArICh2b2wgPDwgNik7CisJYXdhY3NfcmVnWzRdID0gdm9sICsgKHZvbCA8PCA2KTsKKwlhd2Fjc19yZWdbNV0gPSB2b2wgKyAodm9sIDw8IDYpOyAvKiBzY3JlYW1lciBoYXMgbG9vcHRocnUgdm9sIGNvbnRyb2wgKi8KKwlhd2Fjc19yZWdbNl0gPSAwOyAvKiBtYXliZSBzaG91bGQgYmUgdm9sIDw8IDMgZm9yIFBDTUNJQSBzcGVha2VyICovCisJYXdhY3NfcmVnWzddID0gMDsKKworCWF3YWNzX3JlZ1swXSA9IE1BU0tfTVVYX0NEOworCWF3YWNzX3JlZ1sxXSA9IE1BU0tfTE9PUFRIUlU7CisKKwkvKiBGSVhNRTogT25seSBtYWNoaW5lcyB3aXRoIGV4dGVybmFsIFNSUyBtb2R1bGUgbmVlZCBNQVNLX1BBUk9VVCAqLworCWlmIChoYXNfcGVyY2ggfHwgc291bmRfZGV2aWNlX2lkID09IDB4NQorCSAgICB8fCAvKnNvdW5kX2RldmljZV9pZCA9PSAweDggfHwqLyBzb3VuZF9kZXZpY2VfaWQgPT0gMHhiKQorCQlhd2Fjc19yZWdbMV0gfD0gTUFTS19QQVJPVVQwIHwgTUFTS19QQVJPVVQxOworCisJc3dpdGNoIChhd2Fjc19yZXZpc2lvbikgeworCQljYXNlIEFXQUNTX1RVTUJMRVI6CisgICAgICAgICAgICAgICAgICAgICAgICB0YXNfcmVnaXN0ZXJfZHJpdmVyKCZ0YXMzMDAxY19ob29rcyk7CisJCQl0YXNfaW5pdChJMkNfRFJJVkVSSURfVEFTMzAwMUMsIEkyQ19EUklWRVJOQU1FX1RBUzMwMDFDKTsKKwkJCXRhc19kbWFzb3VuZF9pbml0KCk7CisJCQl0YXNfcG9zdF9pbml0KCk7CisJCQlicmVhayA7CisJCWNhc2UgQVdBQ1NfU05BUFBFUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhc19yZWdpc3Rlcl9kcml2ZXIoJnRhczMwMDRfaG9va3MpOworCQkJdGFzX2luaXQoSTJDX0RSSVZFUklEX1RBUzMwMDQsSTJDX0RSSVZFUk5BTUVfVEFTMzAwNCk7CisJCQl0YXNfZG1hc291bmRfaW5pdCgpOworCQkJdGFzX3Bvc3RfaW5pdCgpOworCQkJYnJlYWs7CisJCWNhc2UgQVdBQ1NfREFDQToKKwkJCWRhY2FfaW5pdCgpOworCQkJYnJlYWs7CQorCQljYXNlIEFXQUNTX0JVUkdVTkRZOgorCQkJYXdhY3NfYnVyZ3VuZHlfaW5pdCgpOworCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX1NDUkVBTUVSOgorCQljYXNlIEFXQUNTX0FXQUNTOgorCQlkZWZhdWx0OgorCQkJbG9hZF9hd2FjcygpOworCQkJYnJlYWsgOworCX0KKworCS8qIGVuYWJsZS9zZXQtdXAgZXh0ZXJuYWwgbW9kdWxlcyAtIHdoZW4gd2Uga25vdyBob3cgKi8KKworCWlmIChoYXNfcGVyY2gpCisJCWF3YWNzX2VuYWJsZV9hbXAoMTAwICogMHgxMDEpOworCisJLyogUmVzZXQgZGJkbWEgY2hhbm5lbHMgKi8KKwlvdXRfbGUzMigmYXdhY3NfdHhkbWEtPmNvbnRyb2wsIChSVU58UEFVU0V8RkxVU0h8V0FLRXxERUFEKSA8PCAxNik7CisJd2hpbGUgKGluX2xlMzIoJmF3YWNzX3R4ZG1hLT5zdGF0dXMpICYgUlVOKQorCQl1ZGVsYXkoMSk7CisJb3V0X2xlMzIoJmF3YWNzX3J4ZG1hLT5jb250cm9sLCAoUlVOfFBBVVNFfEZMVVNIfFdBS0V8REVBRCkgPDwgMTYpOworCXdoaWxlIChpbl9sZTMyKCZhd2Fjc19yeGRtYS0+c3RhdHVzKSAmIFJVTikKKwkJdWRlbGF5KDEpOworCisJLyogSW5pdGlhbGl6ZSBiZWVwIHN0dWZmICovCisJaWYgKChyZXM9c2V0dXBfYmVlcCgpKSkKKwkJcmV0dXJuIHJlcyA7CisKKyNpZmRlZiBDT05GSUdfUE1BQ19QQk9PSworCXBtdV9yZWdpc3Rlcl9zbGVlcF9ub3RpZmllcigmYXdhY3Nfc2xlZXBfbm90aWZpZXIpOworI2VuZGlmIC8qIENPTkZJR19QTUFDX1BCT09LICovCisKKwkvKiBQb3dlcmJvb2tzIGhhdmUgb2RkIHdheXMgb2YgZW5hYmxpbmcgaW5wdXRzIHN1Y2ggYXMKKwkgICBhbiBleHBhbnNpb24tYmF5IENEIG9yIHNvdW5kIGZyb20gYW4gaW50ZXJuYWwgbW9kZW0KKwkgICBvciBhIFBDLWNhcmQgbW9kZW0uICovCisJaWYgKGlzX3Bib29rXzNYMDApIHsKKwkJLyoKKwkJICogRW5hYmxlIENEIGFuZCBQQy1jYXJkIHNvdW5kIGlucHV0cy4KKwkJICogVGhpcyBpcyBkb25lIGJ5IHJlYWRpbmcgZnJvbSBhZGRyZXNzCisJCSAqIGYzMDFhMDAwLCArIDB4MTAgdG8gZW5hYmxlIHRoZSBleHBhbnNpb24tYmF5CisJCSAqIENEIHNvdW5kIGlucHV0LCArIDB4ODAgdG8gZW5hYmxlIHRoZSBQQy1jYXJkCisJCSAqIHNvdW5kIGlucHV0LiAgVGhlIDB4MTAwIGVuYWJsZXMgdGhlIFNDU0kgYnVzCisJCSAqIHRlcm1pbmF0b3IgcG93ZXIuCisJCSAqLworCQlsYXRjaF9iYXNlID0gaW9yZW1hcCAoMHhmMzAxYTAwMCwgMHgxMDAwKTsKKwkJaW5fOChsYXRjaF9iYXNlICsgMHgxOTApOworCisJfSBlbHNlIGlmIChpc19wYm9va19nMykgeworCQlzdHJ1Y3QgZGV2aWNlX25vZGUqIG1pbzsKKwkJbWFjaW9fYmFzZSA9IE5VTEw7CisJCWZvciAobWlvID0gaW8tPnBhcmVudDsgbWlvOyBtaW8gPSBtaW8tPnBhcmVudCkgeworCQkJaWYgKHN0cmNtcChtaW8tPm5hbWUsICJtYWMtaW8iKSA9PSAwCisJCQkgICAgJiYgbWlvLT5uX2FkZHJzID4gMCkgeworCQkJCW1hY2lvX2Jhc2UgPSBpb3JlbWFwKG1pby0+YWRkcnNbMF0uYWRkcmVzcywgMHg0MCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyoKKwkJICogRW5hYmxlIENEIHNvdW5kIGlucHV0LgorCQkgKiBUaGUgcmVsZXZhbnQgYml0cyBmb3Igd3JpdGluZyB0byB0aGlzIGJ5dGUgYXJlIDB4OGYuCisJCSAqIEkgaGF2ZW4ndCBmb3VuZCBvdXQgd2hhdCB0aGUgMHg4MCBiaXQgZG9lcy4KKwkJICogRm9yIHRoZSAweGYgYml0cywgd3JpdGluZyAzIG9yIDcgZW5hYmxlcyB0aGUgQ0QKKwkJICogaW5wdXQsIGFueSBvdGhlciB2YWx1ZSBkaXNhYmxlcyBpdC4gIFZhbHVlcworCQkgKiAxLCAzLCA1LCA3IGVuYWJsZSB0aGUgbWljcm9waG9uZS4gIFZhbHVlcyAwLCAyLAorCQkgKiA0LCA2LCA4IC0gZiBlbmFibGUgdGhlIGlucHV0IGZyb20gdGhlIG1vZGVtLgorCQkgKiAgLS0gcGF1bHVzLgorCQkgKi8KKwkJaWYgKG1hY2lvX2Jhc2UpCisJCQlvdXRfOChtYWNpb19iYXNlICsgMHgzNywgMyk7CisJfQorCisJaWYgKGh3X2Nhbl9ieXRlc3dhcCkKKyAJCWRtYXNvdW5kLm1hY2guaGFyZHdhcmVfYWZtdHMgPSAoQUZNVF9TMTZfQkUgfCBBRk1UX1MxNl9MRSkgOworIAllbHNlCisJCWRtYXNvdW5kLm1hY2guaGFyZHdhcmVfYWZtdHMgPSBBRk1UX1MxNl9CRSA7CisKKwkvKiBzaHV0IG91dCBjaGlwcyB0aGF0IGRvIG91dHB1dCBvbmx5LgorCSAqIG1heSBuZWVkIHRvIGV4dGVuZCB0aGlzIHRvIG1hY2hpbmVzIHdoaWNoIGhhdmUgbm8gaW5wdXRzIC0gZXZlbiB0aG8nCisJICogdGhleSB1c2Ugc2NyZWFtZXIgLSBJSVJDIG9uZSBvZiB0aGUgcG93ZXJib29rcyBpcyBsaWtlIHRoaXMuCisJICovCisKKwlpZiAoYXdhY3NfcmV2aXNpb24gIT0gQVdBQ1NfREFDQSkgeworCQlkbWFzb3VuZC5tYWNoLmNhcGFiaWxpdGllcyA9IERTUF9DQVBfRFVQTEVYIDsKKwkJZG1hc291bmQubWFjaC5yZWNvcmQgPSBQTWFjUmVjb3JkIDsKKwl9CisKKwlkbWFzb3VuZC5tYWNoLmRlZmF1bHRfaGFyZCA9IGRlZl9oYXJkIDsKKwlkbWFzb3VuZC5tYWNoLmRlZmF1bHRfc29mdCA9IGRlZl9zb2Z0IDsKKworCXN3aXRjaCAoYXdhY3NfcmV2aXNpb24pIHsKKwkJY2FzZSBBV0FDU19CVVJHVU5EWToKKwkJCXNwcmludGYoYXdhY3NfbmFtZSwgIlBvd2VyTWFjIEJ1cmd1bmR5ICIpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBBV0FDU19EQUNBOgorCQkJc3ByaW50Zihhd2Fjc19uYW1lLCAiUG93ZXJNYWMgREFDQSAiKSA7CisJCQlicmVhayA7CisJCWNhc2UgQVdBQ1NfVFVNQkxFUjoKKwkJCXNwcmludGYoYXdhY3NfbmFtZSwgIlBvd2VyTWFjIFR1bWJsZXIgIikgOworCQkJYnJlYWsgOworCQljYXNlIEFXQUNTX1NOQVBQRVI6CisJCQlzcHJpbnRmKGF3YWNzX25hbWUsICJQb3dlck1hYyBTbmFwcGVyICIpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBBV0FDU19TQ1JFQU1FUjoKKwkJCXNwcmludGYoYXdhY3NfbmFtZSwgIlBvd2VyTWFjIFNjcmVhbWVyICIpIDsKKwkJCWJyZWFrIDsKKwkJY2FzZSBBV0FDU19BV0FDUzoKKwkJZGVmYXVsdDoKKwkJCXNwcmludGYoYXdhY3NfbmFtZSwgIlBvd2VyTWFjIEFXQUNTIHJldiAlZCAiLCBhd2Fjc19yZXZpc2lvbikgOworCQkJYnJlYWsgOworCX0KKworCS8qCisJICogWFhYOiB3ZSBzaG91bGQgaGFuZGxlIGVycm9ycyBoZXJlLCBidXQgdGhhdCB3b3VsZCBtZWFuCisJICogcmV3cml0aW5nIHRoZSB3aG9sZSBpbml0IGNvZGUuICBsYXRlci4uCisJICovCisJaW5wdXRfcmVnaXN0ZXJfZGV2aWNlKCZhd2Fjc19iZWVwX2Rldik7CisKKwlyZXR1cm4gZG1hc291bmRfaW5pdCgpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZG1hc291bmRfYXdhY3NfY2xlYW51cCh2b2lkKQoreworCWlucHV0X3VucmVnaXN0ZXJfZGV2aWNlKCZhd2Fjc19iZWVwX2Rldik7CisKKwlzd2l0Y2ggKGF3YWNzX3JldmlzaW9uKSB7CisJCWNhc2UgQVdBQ1NfVFVNQkxFUjoKKwkJY2FzZSBBV0FDU19TTkFQUEVSOgorCQkJdGFzX2RtYXNvdW5kX2NsZWFudXAoKTsKKwkJCXRhc19jbGVhbnVwKCk7CisJCQlicmVhayA7CisJCWNhc2UgQVdBQ1NfREFDQToKKwkJCWRhY2FfY2xlYW51cCgpOworCQkJYnJlYWs7CisJfQorCWRtYXNvdW5kX2RlaW5pdCgpOworCit9CisKK01PRFVMRV9ERVNDUklQVElPTigiUG93ZXJNYWMgYnVpbHQtaW4gYXVkaW8gZHJpdmVyLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCittb2R1bGVfaW5pdChkbWFzb3VuZF9hd2Fjc19pbml0KTsKK21vZHVsZV9leGl0KGRtYXNvdW5kX2F3YWNzX2NsZWFudXApOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX2NvcmUuYyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkzMDJhMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9jb3JlLmMKQEAgLTAsMCArMSwxODI5IEBACisvKgorICogIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9jb3JlLmMKKyAqCisgKgorICogIE9TUy9GcmVlIGNvbXBhdGlibGUgQXRhcmkgVFQvRmFsY29uIGFuZCBBbWlnYSBETUEgc291bmQgZHJpdmVyIGZvcgorICogIExpbnV4L202OGsKKyAqICBFeHRlbmRlZCB0byBzdXBwb3J0IFBvd2VyIE1hY2ludG9zaCBmb3IgTGludXgvcHBjIGJ5IFBhdWwgTWFja2VycmFzCisgKgorICogIChjKSAxOTk1IGJ5IE1pY2hhZWwgU2NobHVldGVyICYgTWljaGFlbCBNYXJ0ZQorICoKKyAqICBNaWNoYWVsIFNjaGx1ZXRlciAobWljaGFlbEBkdWNrLnN5ZC5kZSkgZGlkIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgdGhlIFZGUworICogIGludGVyZmFjZSBhbmQgdGhlIHUtbGF3IHRvIHNpZ25lZCBieXRlIGNvbnZlcnNpb24uCisgKgorICogIE1pY2hhZWwgTWFydGUgKG1hcnRlQGluZm9ybWF0aWsudW5pLW11ZW5jaGVuLmRlKSBkaWQgdGhlIHNvdW5kIHF1ZXVlLAorICogIC9kZXYvbWl4ZXIsIC9kZXYvc25kc3RhdCBhbmQgY29tcGxlbWVudGVkIHRoZSBWRlMgaW50ZXJmYWNlLiBIZSB3b3VsZCBsaWtlCisgKiAgdG8gdGhhbms6CisgKiAgICAtIE1pY2hhZWwgU2NobHVldGVyIGZvciBpbml0aWFsIGlkZWFzIGFuZCBkb2N1bWVudGF0aW9uIG9uIHRoZSBNRlAgYW5kCisgKgl0aGUgRE1BIHNvdW5kIGhhcmR3YXJlLgorICogICAgLSBUaGVyYXB5PyBmb3IgdGhlaXIgQ0QgJ1Ryb3VibGVndW0nIHdoaWNoIHJlYWxseSBtYWRlIG1lIHJvY2suCisgKgorICogIC9kZXYvc25kc3RhdCBpcyBiYXNlZCBvbiBjb2RlIGJ5IEhhbm51IFNhdm9sYWluZW4sIHRoZSBhdXRob3Igb2YgdGhlCisgKiAgVm94V2FyZSBmYW1pbHkgb2YgZHJpdmVycy4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIEhpc3Rvcnk6CisgKgorICoJMTk5NS84LzI1CUZpcnN0IHJlbGVhc2UKKyAqCisgKgkxOTk1LzkvMDIJUm9tYW4gSG9kZWs6CisgKgkJCSAgLSBGaXhlZCBhdGFyaV9zdHJhbV9hbGxvYygpIGNhbGwsIHRoZSB0aW1lcgorICoJCQkgICAgcHJvZ3JhbW1pbmcgYW5kIHNldmVyYWwgcmFjZSBjb25kaXRpb25zCisgKgkxOTk1LzkvMTQJUm9tYW4gSG9kZWs6CisgKgkJCSAgLSBBZnRlciBzb21lIGRpc2N1c3Npb24gd2l0aCBNaWNoYWVsIFNjaGx1ZXRlciwKKyAqCQkJICAgIHJldmlzZWQgdGhlIGludGVycnVwdCBkaXNhYmxpbmcKKyAqCQkJICAtIFNsaWdodGx5IHNwZWVkZWQgdXAgVTgtPlM4IHRyYW5zbGF0aW9uIGJ5IHVzaW5nCisgKgkJCSAgICBsb25nIG9wZXJhdGlvbnMgd2hlcmUgcG9zc2libGUKKyAqCQkJICAtIEFkZGVkIDQ6MyBpbnRlcnBvbGF0aW9uIGZvciAvZGV2L2F1ZGlvCisgKgorICoJMTk5NS85LzIwCVRvcnN0ZW4gU2NoZXJlcjoKKyAqCQkJICAtIEZpeGVkIGEgYnVnIGluIHNxX3dyaXRlIGFuZCBjaGFuZ2VkIC9kZXYvYXVkaW8KKyAqCQkJICAgIGNvbnZlcnRpbmcgdG8gcGxheSBhdCAxMjUxN0h6IGluc3RlYWQgb2YgNjI1OEh6LgorICoKKyAqCTE5OTUvOS8yMwlUb3JzdGVuIFNjaGVyZXI6CisgKgkJCSAgLSBDaGFuZ2VkIHNxX2ludGVycnVwdCgpIGFuZCBzcV9wbGF5KCkgdG8gcHJlLXByb2dyYW0KKyAqCQkJICAgIHRoZSBETUEgZm9yIGFub3RoZXIgZnJhbWUgd2hpbGUgdGhlcmUncyBzdGlsbCBvbmUKKyAqCQkJICAgIHJ1bm5pbmcuIFRoaXMgYWxsb3dzIHRoZSBJUlEgcmVzcG9uc2UgdG8gYmUKKyAqCQkJICAgIGFyYml0cmFyaWx5IGRlbGF5ZWQgYW5kIHBsYXlpbmcgd2lsbCBzdGlsbCBjb250aW51ZS4KKyAqCisgKgkxOTk1LzEwLzE0CUd1ZW50aGVyIEtlbGxldGVyLCBUb3JzdGVuIFNjaGVyZXI6CisgKgkJCSAgLSBCZXR0ZXIgc3VwcG9ydCBmb3IgRmFsY29uIGF1ZGlvICh0aGUgRmFsY29uIGRvZXNuJ3QKKyAqCQkJICAgIHJhaXNlIGFuIElSUSBhdCB0aGUgZW5kIG9mIGEgZnJhbWUsIGJ1dCBhdCB0aGUKKyAqCQkJICAgIGJlZ2lubmluZyBpbnN0ZWFkISkuIHVzZXMgJ2lmIChjb2RlY19kbWEpJyBpbiBsb3RzCisgKgkJCSAgICBvZiBwbGFjZXMgdG8gc2ltcGx5IHN3aXRjaCBiZXR3ZWVuIEZhbGNvbiBhbmQgVFQKKyAqCQkJICAgIGNvZGUuCisgKgorICoJMTk5NS8xMS8wNglUb3JzdGVuIFNjaGVyZXI6CisgKgkJCSAgLSBTdGFydGVkIGludHJvZHVjaW5nIGEgaGFyZHdhcmUgYWJzdHJhY3Rpb24gc2NoZW1lCisgKgkJCSAgICAobWF5IHBlcmhhcHMgYWxzbyBzZXJ2ZSBmb3IgQW1pZ2FzPykKKyAqCQkJICAtIENhbiBub3cgcGxheSBzYW1wbGVzIGF0IGFsbW9zdCBhbGwgZnJlcXVlbmNpZXMgYnkKKyAqCQkJICAgIG1lYW5zIG9mIGEgbW9yZSBnZW5lcmFsaXplZCBleHBhbmQgcm91dGluZQorICoJCQkgIC0gVGFrZXMgYSBnb29kIGRlYWwgb2YgY2FyZSB0byBjdXQgZGF0YSBvbmx5IGF0CisgKgkJCSAgICBzYW1wbGUgc2l6ZXMKKyAqCQkJICAtIEJ1ZmZlciBzaXplIGlzIG5vdyBhIGtlcm5lbCBydW50aW1lIG9wdGlvbgorICoJCQkgIC0gSW1wbGVtZW50ZWQgZnN5bmMoKSAmIHNldmVyYWwgbWlub3IgaW1wcm92ZW1lbnRzCisgKgkJCUd1ZW50aGVyIEtlbGxldGVyOgorICoJCQkgIC0gVXNlZnVsIGhpbnRzIGFuZCBidWcgZml4ZXMKKyAqCQkJICAtIENyb3NzLWNoZWNrZWQgaXQgZm9yIEZhbGNvbnMKKyAqCisgKgkxOTk2LzMvOQlHZWVydCBVeXR0ZXJob2V2ZW46CisgKgkJCSAgLSBTdXBwb3J0IGFkZGVkIGZvciBBbWlnYSwgQS1sYXcsIDE2LWJpdCBsaXR0bGUKKyAqCQkJICAgIGVuZGlhbi4KKyAqCQkJICAtIFVuaWZpY2F0aW9uIHRvIGRyaXZlcnMvc291bmQvZG1hc291bmQuYy4KKyAqCisgKgkxOTk2LzQvNglNYXJ0aW4gTWl0Y2hlbGw6CisgKgkJCSAgLSBVcGRhdGVkIHRvIDEuMyBrZXJuZWwuCisgKgorICoJMTk5Ni82LzEzICAgICAgIFRvcGkgS2FuZXJ2YToKKyAqCQkJICAtIEZpeGVkIHRoaW5ncyB0aGF0IHdlcmUgYnJva2VuIChtYWlubHkgdGhlIGFtaWdhCisgKgkJCSAgICAxNC1iaXQgcm91dGluZXMpCisgKgkJCSAgLSAvZGV2L3NuZHN0YXQgc2hvd3Mgbm93IHRoZSByZWFsIGhhcmR3YXJlIGZyZXF1ZW5jeQorICoJCQkgIC0gVGhlIGxvd3Bhc3MgZmlsdGVyIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgbm93CisgKgorICoJMTk5Ni85LzI1CUdlZXJ0IFV5dHRlcmhvZXZlbjoKKyAqCQkJICAtIE1vZHVsYXJpemF0aW9uCisgKgorICoJMTk5OC82LzEwCUFuZHJlYXMgU2Nod2FiOgorICoJCQkgIC0gQ29udmVydGVkIHRvIHVzZSBzb3VuZF9jb3JlCisgKgorICoJMTk5OS8xMi8yOAlSaWNoYXJkIFppZGxpY2t5OgorICoJCQkgIC0gQWRkZWQgc3VwcG9ydCBmb3IgUTQwCisgKgorICoJMjAwMC8yLzI3CUdlZXJ0IFV5dHRlcmhvZXZlbjoKKyAqCQkJICAtIENsZWFuIHVwIGFuZCBzcGxpdCB0aGUgY29kZSBpbnRvIDQgcGFydHM6CisgKgkJCSAgICAgIG8gZG1hc291bmRfY29yZTogbWFjaGluZS1pbmRlcGVuZGVudCBjb2RlCisgKgkJCSAgICAgIG8gZG1hc291bmRfYXRhcmk6IEF0YXJpIFRUIGFuZCBGYWxjb24gc3VwcG9ydAorICoJCQkgICAgICBvIGRtYXNvdW5kX2F3YWNzOiBBcHBsZSBQb3dlck1hYyBzdXBwb3J0CisgKgkJCSAgICAgIG8gZG1hc291bmRfcGF1bGE6IEFtaWdhIHN1cHBvcnQKKyAqCisgKgkyMDAwLzMvMjUJR2VlcnQgVXl0dGVyaG9ldmVuOgorICoJCQkgIC0gSW50ZWdyYXRpb24gb2YgZG1hc291bmRfcTQwCisgKgkJCSAgLSBTbWFsbCBjbGVhbiB1cHMKKyAqCisgKgkyMDAxLzAxLzI2IFsxLjBdIElhaW4gU2FuZG9lCisgKgkJCSAgLSBtYWtlIC9kZXYvc25kc3RhdCBzaG93IHJldmlzaW9uICYgZWRpdGlvbiBpbmZvLgorICoJCQkgIC0gc2luY2UgZG1hc291bmQubWFjaC5zcV9zZXR1cCgpIGNhbiBmYWlsIG9uIHBtYWMKKyAqCQkJICAgIGl0cyB0eXBlIGhhcyBiZWVuIGNoYW5nZWQgdG8gaW50IGFuZCB0aGUgcmV0dXJucworICoJCQkgICAgYXJlIGNoZWNrZWQuCisgKgkJICAgWzEuMV0gIC0gc3RvcCBtaXNzaW5nIHRyYW5zbGF0aW9ucyBmcm9tIGJlaW5nIGNhbGxlZC4KKyAqCTIwMDEvMDIvMDggWzEuMl0gIC0gcmVtb3ZlIHVudXNlZCB0cmFuc2xhdGlvbiB0YWJsZXMgJiBtb3ZlIG1hY2hpbmUtCisgKgkJCSAgICBzcGVjaWZpYyB0YWJsZXMgdG8gbG93LWxldmVsLgorICoJCQkgIC0gcmV0dXJuIGNvcnJlY3QgaW5mby4gZm9yIFNORENUTF9EU1BfR0VURk1UUy4KKyAqCQkgICBbMS4zXSAgLSBpbXBsZW1lbnQgU05EQ1RMX0RTUF9HRVRDQVBTIGZ1bGx5LgorICoJCSAgIFsxLjRdICAtIG1ha2UgL2Rldi9zbmRzdGF0IHRleHQgbGVuZ3RoIHVzYWdlIGRldGVybWluaXN0aWMuCisgKgkJCSAgLSBtYWtlIC9kZXYvc25kc3RhdCBjYWxsIHRvIGxvdy1sZXZlbAorICoJCQkgICAgZG1hc291bmQubWFjaC5zdGF0ZV9pbmZvKCkgcGFzcyBtYXggc3BhY2UgdG8gbGwgZHJpdmVyLgorICoJCQkgIC0gdGlkeSBzdGFydHVwIGJhbm5lcnMgYW5kIG91dHB1dCBpbmZvLgorICoJCSAgIFsxLjVdICAtIHRpZHkgdXAgYSBsaXR0bGUgKHJlbW92ZWQgc29tZSB1bnVzZWQgI2RlZmluZXMgaW4KKyAqCQkJICAgIGRtYXNvdW5kLmgpCisgKgkJCSAgLSBmaXggdXAgSEFTX1JFQ09SRCBjb25kaXRpb25hbGlzYXRpb24uCisgKgkJCSAgLSBhZGQgcmVjb3JkIGNvZGUgaW4gcGxhY2VzIGl0IGlzIG1pc3NpbmcuLi4KKyAqCQkJICAtIGNoYW5nZSBidWYtc2l6ZXMgdG8gYnl0ZXMgdG8gYWxsb3cgPCAxa2IgZm9yIHBtYWMKKyAqCQkJICAgIGlmIHVzZXIgcGFyYW0gZW50cnkgaXMgPCAyNTYgdGhlIHZhbHVlIGlzIHRha2VuIHRvCisgKgkJCSAgICBiZSBpbiBrYiA+IDI1NiBpcyB0YWtlbiB0byBiZSBpbiBieXRlcy4KKyAqCQkJICAtIG1ha2UgZGVmYXVsdCBidWZmL2ZyYWcgcGFyYW1zIGNvbmRpdGlvbmFsIG9uCisgKgkJCSAgICBtYWNoaW5lIHRvIGFsbG93IHNtYWxsZXIgdmFsdWVzIGZvciBwbWFjLgorICoJCQkgIC0gbWFkZSB0aGUgaW9jdGxzLCByZWFkICYgd3JpdGUgY29tcGx5IHdpdGggdGhlIE9TUworICoJCQkgICAgcnVsZXMgb24gc2V0dGluZyBwYXJhbXMuCisgKgkJCSAgLSBhZGRlZCBwYXJzaW5nIG9mIF9zZXR1cCgpIHBhcmFtcyBmb3IgcmVjb3JkLgorICoJMjAwMS8wNC8wNCBbMS42XSAgLSBmaXggYnVnIHdoZXJlIHNhbXBsZSByYXRlcyBoaWdoZXIgdGhhbiBtYXhpbXVtIHdlcmUKKyAqCQkJICAgIGJlaW5nIHJlcG9ydGVkIGFzIE9LLgorICoJCQkgIC0gZml4IG9wZW4oKSB0byByZXR1cm4gLUVCVVNZIGFzIHBlciBPU1MgZG9jLiB3aGVuCisgKgkJCSAgICBhdWRpbyBpcyBpbiB1c2UgLSB0aGlzIGlzIGluZGVwZW5kZW50IG9mIE9fTk9CTE9DSy4KKyAqCQkJICAtIGZpeCBidWcgd2hlcmUgU05EQ1RMX0RTUF9QT1NUIHdhcyBibG9ja2luZy4KKyAqLworCisgLyogUmVjb3JkIGNhcGFiaWxpdHkgbm90ZXMgMzAvMDEvMjAwMToKKyAgKiBBdCBwcmVzZW50IHRoZXNlIG9ic2VydmF0aW9ucyBhcHBseSBvbmx5IHRvIHBtYWMgTEwgZHJpdmVyICh0aGUgb25seSBvbmUKKyAgKiB0aGF0IGNhbiBkbyByZWNvcmQsIGF0IHByZXNlbnQpLiAgSG93ZXZlciwgaWYgb3RoZXIgTEwgZHJpdmVycyBmb3IgbWFjaGluZXMKKyAgKiB3aXRoIHJlY29yZCBhcmUgYWRkZWQgdGhleSBtYXkgYXBwbHkuCisgICoKKyAgKiBUaGUgZnJhZ21lbnQgcGFyYW1ldGVycyBmb3IgdGhlIHJlY29yZCBhbmQgcGxheSBjaGFubmVscyBhcmUgc2VwYXJhdGUuCisgICogSG93ZXZlciwgaWYgdGhlIGRyaXZlciBpcyBvcGVuZWQgT19SRFdSIHRoZXJlIGlzIG5vIHdheSAoaW4gdGhlIGN1cnJlbnQgT1NTCisgICogQVBJKSB0byBzcGVjaWZ5IHRoZWlyIHZhbHVlcyBpbmRlcGVuZGVudGx5IGZvciB0aGUgcmVjb3JkIGFuZCBwbGF5YmFjaworICAqIGNoYW5uZWxzLiAgU2luY2UgdGhlIG9ubHkgY29tbW9uIGZhY3RvciBiZXR3ZWVuIHRoZSBpbnB1dCAmIG91dHB1dCBpcyB0aGUKKyAgKiBzYW1wbGUgcmF0ZSAob24gcG1hYykgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIG9wZW4gL2Rldi9kc3BYIE9fV1JPTkxZIGFuZAorICAqIC9kZXYvZHNwWSBPX1JET05MWS4gIFRoZSBpbnB1dCAmIG91dHB1dCBjaGFubmVscyBjb3VsZCB0aGVuIGhhdmUgZGlmZmVyZW50CisgICogY2hhcmFjdGVyaXN0aWNzIChvdGhlciB0aGFuIHRoZSBmaXJzdCB0aGF0IHNldHMgc2FtcGxlIHJhdGUgY2xhaW1pbmcgdGhlCisgICogcmlnaHQgdG8gc2V0IGl0IGZvciBldmVyKS4gIEFzIGl0IHN0YW5kcywgdGhlIGZvcm1hdCwgY2hhbm5lbHMsIG51bWJlciBvZgorICAqIGJpdHMgJiBzYW1wbGUgcmF0ZSBhcmUgYXNzdW1lZCB0byBiZSBjb21tb24uICBJbiB0aGUgZnV0dXJlIHBlcmhhcHMgdGhlc2UKKyAgKiBzaG91bGQgYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBMTCBkcml2ZXIgLSBhbmQgdGhlbiBpZiBhIGNhcmQgcmVhbGx5CisgICogZG9lcyBub3Qgc2hhcmUgaXRlbXMgYmV0d2VlbiByZWNvcmQgJiBwbGF5YmFjayB0aGV5IGNhbiBiZSBzcGVjaWZpZWQKKyAgKiBzZXBhcmF0ZWx5LgorKi8KKworLyogVGhyZWFkLXNhZmVuZXNzIG9mIHNoYXJlZF9yZXNvdXJjZXMgbm90ZXM6IDMxLzAxLzIwMDEKKyAqIElmIHRoZSB1c2VyIG9wZW5zIE9fUkRXUiBhbmQgdGhlbiBzcGxpdHMgcmVjb3JkICYgcGxheSBiZXR3ZWVuIHR3byB0aHJlYWRzCisgKiBib3RoIG9mIHdoaWNoIGluaGVyaXQgdGhlIGZkIC0gYW5kIHRoZW4gc3RhcnRzIGNoYW5naW5nIHRoaW5ncyBmcm9tIGJvdGgKKyAqIC0gd2Ugd2lsbCBoYXZlIGRpZmZpY3VsdHkgdGVsbGluZy4KKyAqCisgKiBJdCdzIGJhZCBhcHBsaWNhdGlvbiBjb2RpbmcgLSBidXQgLi4uCisgKiBUT0RPOiB0aGluayBhYm91dCBob3cgdG8gc29ydCB0aGlzIG91dC4uLiB3aXRob3V0IGJvZ2dpbmcgZXZlcnl0aGluZyBkb3duIGluCisgKiBzZW1hcGhvcmVzLgorICoKKyAqIFNpbWlsYXJseSwgdGhlIE9TUyBzcGVjIHNheXMgImFsbCBjaGFuZ2VzIHRvIHBhcmFtZXRlcnMgbXVzdCBiZSBiZXR3ZWVuCisgKiBvcGVuKCkgYW5kIHRoZSBmaXJzdCByZWFkKCkgb3Igd3JpdGUoKS4gLSBhbmQgYSBiaXQgbGF0ZXIgb24gKGJ5CisgKiBpbXBsaWNhdGlvbikgImJldHdlZW4gU05EQ1RMX0RTUF9SRVNFVCBhbmQgdGhlIGZpcnN0IHJlYWQoKSBvciB3cml0ZSgpIGFmdGVyCisgKiBpdCIuICBJZiB0aGUgYXBwIGlzIG11bHRpLXRocmVhZGVkIGFuZCB0aGlzIHJ1bGUgaXMgYnJva2VuIGJldHdlZW4gdGhyZWFkcworICogd2Ugd2lsbCBoYXZlIHRyb3VibGUgc3BvdHRpbmcgaXQgLSBhbmQgdGhlIGZhdWx0IHdpbGwgYmUgcmF0aGVyIG9ic2N1cmUgOi0oCisgKgorICogV2Ugd2lsbCB0cnkgYW5kIHB1dCBvdXQgYXQgbGVhc3QgYSBrbXNnIGlmIHdlIHNlZSBpdCBoYXBwZW4uLi4gYnV0IEkgdGhpbmsKKyAqIGl0IHdpbGwgYmUgcXVpdGUgaGFyZCB0byB0cmFwIGl0IHdpdGggYW4gLUVYWFggcmV0dXJuLi4uIGJlY2F1c2Ugd2UgY2FuJ3QKKyAqIHNlZSB0aGUgZmF1bHQgdW50aWwgYWZ0ZXIgdGhlIGRhbWFnZSBpcyBkb25lLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlICJkbWFzb3VuZC5oIgorCisjZGVmaW5lIERNQVNPVU5EX0NPUkVfUkVWSVNJT04gMQorI2RlZmluZSBETUFTT1VORF9DT1JFX0VESVRJT04gNgorCisgICAgLyoKKyAgICAgKiAgRGVjbGFyYXRpb25zCisgICAgICovCisKK2ludCBkbWFzb3VuZF9jYXRjaFJhZGl1cyA9IDA7CitNT0RVTEVfUEFSTShkbWFzb3VuZF9jYXRjaFJhZGl1cywgImkiKTsKKworc3RhdGljIHVuc2lnbmVkIGludCBudW1Xcml0ZUJ1ZnMgPSBERUZBVUxUX05fQlVGRkVSUzsKK01PRFVMRV9QQVJNKG51bVdyaXRlQnVmcywgImkiKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgd3JpdGVCdWZTaXplID0gREVGQVVMVF9CVUZGX1NJWkUgOwkvKiBpbiBieXRlcyAqLworTU9EVUxFX1BBUk0od3JpdGVCdWZTaXplLCAiaSIpOworCisjaWZkZWYgSEFTX1JFQ09SRAorc3RhdGljIHVuc2lnbmVkIGludCBudW1SZWFkQnVmcyA9IERFRkFVTFRfTl9CVUZGRVJTOworTU9EVUxFX1BBUk0obnVtUmVhZEJ1ZnMsICJpIik7CitzdGF0aWMgdW5zaWduZWQgaW50IHJlYWRCdWZTaXplID0gREVGQVVMVF9CVUZGX1NJWkU7CS8qIGluIGJ5dGVzICovCitNT0RVTEVfUEFSTShyZWFkQnVmU2l6ZSwgImkiKTsKKyNlbmRpZgorCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgc3FfdW5pdCA9IC0xOworc3RhdGljIGludCBtaXhlcl91bml0ID0gLTE7CitzdGF0aWMgaW50IHN0YXRlX3VuaXQgPSAtMTsKK3N0YXRpYyBpbnQgaXJxX2luc3RhbGxlZDsKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKworLyogc29mdHdhcmUgaW1wbGVtZW50ZWQgcmVjb3JkaW5nIHZvbHVtZSEgKi8KK3VpbnQgc29mdHdhcmVfaW5wdXRfdm9sdW1lID0gU1dfSU5QVVRfVk9MVU1FX1NDQUxFICogU1dfSU5QVVRfVk9MVU1FX0RFRkFVTFQ7CitFWFBPUlRfU1lNQk9MKHNvZnR3YXJlX2lucHV0X3ZvbHVtZSk7CisKKy8qIGNvbnRyb2wgb3ZlciB3aG8gY2FuIG1vZGlmeSByZXNvdXJjZXMgc2hhcmVkIGJldHdlZW4gcGxheS9yZWNvcmQgKi8KK3N0YXRpYyBtb2RlX3Qgc2hhcmVkX3Jlc291cmNlX293bmVyOworc3RhdGljIGludCBzaGFyZWRfcmVzb3VyY2VzX2luaXRpYWxpc2VkOworCisgICAgLyoKKyAgICAgKiAgTWlkIGxldmVsIHN0dWZmCisgICAgICovCisKK3N0cnVjdCBzb3VuZF9zZXR0aW5ncyBkbWFzb3VuZCA9IHsgLmxvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQgfTsKKworc3RhdGljIGlubGluZSB2b2lkIHNvdW5kX3NpbGVuY2Uodm9pZCkKK3sKKwlkbWFzb3VuZC5tYWNoLnNpbGVuY2UoKTsgLyogX01VU1RfIHN0b3AgRE1BICovCit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNvdW5kX3NldF9mb3JtYXQoaW50IGZvcm1hdCkKK3sKKwlyZXR1cm4gZG1hc291bmQubWFjaC5zZXRGb3JtYXQoZm9ybWF0KTsKK30KKworCitzdGF0aWMgaW50IHNvdW5kX3NldF9zcGVlZChpbnQgc3BlZWQpCit7CisJaWYgKHNwZWVkIDwgMCkKKwkJcmV0dXJuIGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisKKwkvKiB0cmFwIG91dC1vZi1yYW5nZSBzcGVlZCBzZXR0aW5ncy4KKwkgICBhdCBwcmVzZW50IHdlIGFsbG93IChhcmJpdHJhcmlseSkgbG93IHJhdGVzIC0gdXNpbmcgc29mdAorCSAgIHVwLWNvbnZlcnNpb24gLSBidXQgd2UgY2FuJ3QgYWxsb3cgPiBtYXggYmVjYXVzZSB0aGVyZSBpcworCSAgIG5vIHNvZnQgZG93bi1jb252ZXJzaW9uLgorCSovCisJaWYgKGRtYXNvdW5kLm1hY2gubWF4X2RzcF9zcGVlZCAmJgorCSAgIChzcGVlZCA+IGRtYXNvdW5kLm1hY2gubWF4X2RzcF9zcGVlZCkpCisJCXNwZWVkID0gZG1hc291bmQubWFjaC5tYXhfZHNwX3NwZWVkIDsKKworCWRtYXNvdW5kLnNvZnQuc3BlZWQgPSBzcGVlZDsKKworCWlmIChkbWFzb3VuZC5taW5EZXYgPT0gU05EX0RFVl9EU1ApCisJCWRtYXNvdW5kLmRzcC5zcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisKKwlyZXR1cm4gZG1hc291bmQuc29mdC5zcGVlZDsKK30KKworc3RhdGljIGludCBzb3VuZF9zZXRfc3RlcmVvKGludCBzdGVyZW8pCit7CisJaWYgKHN0ZXJlbyA8IDApCisJCXJldHVybiBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKworCXN0ZXJlbyA9ICEhc3RlcmVvOyAgICAvKiBzaG91bGQgYmUgMCBvciAxIG5vdyAqLworCisJZG1hc291bmQuc29mdC5zdGVyZW8gPSBzdGVyZW87CisJaWYgKGRtYXNvdW5kLm1pbkRldiA9PSBTTkRfREVWX0RTUCkKKwkJZG1hc291bmQuZHNwLnN0ZXJlbyA9IHN0ZXJlbzsKKworCXJldHVybiBzdGVyZW87Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvdW5kX2NvcHlfdHJhbnNsYXRlKFRSQU5TICp0cmFucywgY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwKKwkJCQkgICAgc2l6ZV90IHVzZXJDb3VudCwgdV9jaGFyIGZyYW1lW10sCisJCQkJICAgIHNzaXplX3QgKmZyYW1lVXNlZCwgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCAoKmN0X2Z1bmMpKGNvbnN0IHVfY2hhciBfX3VzZXIgKiwgc2l6ZV90LCB1X2NoYXIgKiwgc3NpemVfdCAqLCBzc2l6ZV90KTsKKworCXN3aXRjaCAoZG1hc291bmQuc29mdC5mb3JtYXQpIHsKKwkgICAgY2FzZSBBRk1UX01VX0xBVzoKKwkJY3RfZnVuYyA9IHRyYW5zLT5jdF91bGF3OworCQlicmVhazsKKwkgICAgY2FzZSBBRk1UX0FfTEFXOgorCQljdF9mdW5jID0gdHJhbnMtPmN0X2FsYXc7CisJCWJyZWFrOworCSAgICBjYXNlIEFGTVRfUzg6CisJCWN0X2Z1bmMgPSB0cmFucy0+Y3Rfczg7CisJCWJyZWFrOworCSAgICBjYXNlIEFGTVRfVTg6CisJCWN0X2Z1bmMgPSB0cmFucy0+Y3RfdTg7CisJCWJyZWFrOworCSAgICBjYXNlIEFGTVRfUzE2X0JFOgorCQljdF9mdW5jID0gdHJhbnMtPmN0X3MxNmJlOworCQlicmVhazsKKwkgICAgY2FzZSBBRk1UX1UxNl9CRToKKwkJY3RfZnVuYyA9IHRyYW5zLT5jdF91MTZiZTsKKwkJYnJlYWs7CisJICAgIGNhc2UgQUZNVF9TMTZfTEU6CisJCWN0X2Z1bmMgPSB0cmFucy0+Y3RfczE2bGU7CisJCWJyZWFrOworCSAgICBjYXNlIEFGTVRfVTE2X0xFOgorCQljdF9mdW5jID0gdHJhbnMtPmN0X3UxNmxlOworCQlicmVhazsKKwkgICAgZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCS8qIGlmIHRoZSB1c2VyIGhhcyByZXF1ZXN0ZWQgYSBub24tZXhpc3RlbnQgdHJhbnNsYXRpb24gZG9uJ3QgdHJ5CisJICAgdG8gY2FsbCBpdCBidXQganVzdCByZXR1cm4gMCBieXRlcyBtb3ZlZAorCSovCisJaWYgKGN0X2Z1bmMpCisJCXJldHVybiBjdF9mdW5jKHVzZXJQdHIsIHVzZXJDb3VudCwgZnJhbWUsIGZyYW1lVXNlZCwgZnJhbWVMZWZ0KTsKKwlyZXR1cm4gMDsKK30KKworICAgIC8qCisgICAgICogIC9kZXYvbWl4ZXIgYWJzdHJhY3Rpb24KKyAgICAgKi8KKworc3RhdGljIHN0cnVjdCB7CisgICAgaW50IGJ1c3k7CisgICAgaW50IG1vZGlmeV9jb3VudGVyOworfSBtaXhlcjsKKworc3RhdGljIGludCBtaXhlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICghdHJ5X21vZHVsZV9nZXQoZG1hc291bmQubWFjaC5vd25lcikpCisJCXJldHVybiAtRU5PREVWOworCW1peGVyLmJ1c3kgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1peGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJbG9ja19rZXJuZWwoKTsKKwltaXhlci5idXN5ID0gMDsKKwltb2R1bGVfcHV0KGRtYXNvdW5kLm1hY2gub3duZXIpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgbWl4ZXJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVfaW50IGNtZCwKKwkJICAgICAgIHVfbG9uZyBhcmcpCit7CisJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpCisJICAgIG1peGVyLm1vZGlmeV9jb3VudGVyKys7CisJc3dpdGNoIChjbWQpIHsKKwkgICAgY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIFNPVU5EX1ZFUlNJT04pOworCSAgICBjYXNlIFNPVU5EX01JWEVSX0lORk86CisJCXsKKwkJICAgIG1peGVyX2luZm8gaW5mbzsKKwkJICAgIG1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJICAgIHN0cmxjcHkoaW5mby5pZCwgZG1hc291bmQubWFjaC5uYW1lMiwgc2l6ZW9mKGluZm8uaWQpKTsKKwkJICAgIHN0cmxjcHkoaW5mby5uYW1lLCBkbWFzb3VuZC5tYWNoLm5hbWUyLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCSAgICBpbmZvLm1vZGlmeV9jb3VudGVyID0gbWl4ZXIubW9kaWZ5X2NvdW50ZXI7CisJCSAgICBpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQkgICAgcmV0dXJuIC1FRkFVTFQ7CisJCSAgICByZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoZG1hc291bmQubWFjaC5taXhlcl9pb2N0bCkKKwkgICAgcmV0dXJuIGRtYXNvdW5kLm1hY2gubWl4ZXJfaW9jdGwoY21kLCBhcmcpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtaXhlcl9mb3BzID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IG1peGVyX2lvY3RsLAorCS5vcGVuCQk9IG1peGVyX29wZW4sCisJLnJlbGVhc2UJPSBtaXhlcl9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgbWl4ZXJfaW5pdCh2b2lkKQoreworI2lmbmRlZiBNT0RVTEUKKwlpbnQgbWl4ZXJfdW5pdDsKKyNlbmRpZgorCW1peGVyX3VuaXQgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmbWl4ZXJfZm9wcywgLTEpOworCWlmIChtaXhlcl91bml0IDwgMCkKKwkJcmV0dXJuOworCisJbWl4ZXIuYnVzeSA9IDA7CisJZG1hc291bmQudHJlYmxlID0gMDsKKwlkbWFzb3VuZC5iYXNzID0gMDsKKwlpZiAoZG1hc291bmQubWFjaC5taXhlcl9pbml0KQorCSAgICBkbWFzb3VuZC5tYWNoLm1peGVyX2luaXQoKTsKK30KKworCisgICAgLyoKKyAgICAgKiAgU291bmQgcXVldWUgc3R1ZmYsIHRoZSBoZWFydCBvZiB0aGUgZHJpdmVyCisgICAgICovCisKK3N0cnVjdCBzb3VuZF9xdWV1ZSBkbWFzb3VuZF93cml0ZV9zcTsKK3N0YXRpYyB2b2lkIHNxX3Jlc2V0X291dHB1dCh2b2lkKSA7CisjaWZkZWYgSEFTX1JFQ09SRAorc3RydWN0IHNvdW5kX3F1ZXVlIGRtYXNvdW5kX3JlYWRfc3E7CitzdGF0aWMgdm9pZCBzcV9yZXNldF9pbnB1dCh2b2lkKSA7CisjZW5kaWYKKworc3RhdGljIGludCBzcV9hbGxvY2F0ZV9idWZmZXJzKHN0cnVjdCBzb3VuZF9xdWV1ZSAqc3EsIGludCBudW0sIGludCBzaXplKQoreworCWludCBpOworCisJaWYgKHNxLT5idWZmZXJzKQorCQlyZXR1cm4gMDsKKwlzcS0+bnVtQnVmcyA9IG51bTsKKwlzcS0+YnVmU2l6ZSA9IHNpemU7CisJc3EtPmJ1ZmZlcnMgPSBrbWFsbG9jIChudW0gKiBzaXplb2YoY2hhciAqKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzcS0+YnVmZmVycykKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CisJCXNxLT5idWZmZXJzW2ldID0gZG1hc291bmQubWFjaC5kbWFfYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCk7CisJCWlmICghc3EtPmJ1ZmZlcnNbaV0pIHsKKwkJCXdoaWxlIChpLS0pCisJCQkJZG1hc291bmQubWFjaC5kbWFfZnJlZShzcS0+YnVmZmVyc1tpXSwgc2l6ZSk7CisJCQlrZnJlZShzcS0+YnVmZmVycyk7CisJCQlzcS0+YnVmZmVycyA9IE5VTEw7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3FfcmVsZWFzZV9idWZmZXJzKHN0cnVjdCBzb3VuZF9xdWV1ZSAqc3EpCit7CisJaW50IGk7CisKKwlpZiAoc3EtPmJ1ZmZlcnMpIHsKKwkJZm9yIChpID0gMDsgaSA8IHNxLT5udW1CdWZzOyBpKyspCisJCQlkbWFzb3VuZC5tYWNoLmRtYV9mcmVlKHNxLT5idWZmZXJzW2ldLCBzcS0+YnVmU2l6ZSk7CisJCWtmcmVlKHNxLT5idWZmZXJzKTsKKwkJc3EtPmJ1ZmZlcnMgPSBOVUxMOworCX0KK30KKworCitzdGF0aWMgaW50IHNxX3NldHVwKHN0cnVjdCBzb3VuZF9xdWV1ZSAqc3EpCit7CisJaW50ICgqc2V0dXBfZnVuYykodm9pZCkgPSBOVUxMOworCWludCBoYXJkX2ZyYW1lIDsKKworCWlmIChzcS0+bG9ja2VkKSB7IC8qIGFyZSB3ZSBhbHJlYWR5IHNldD8gLSBhbmQgbm90IGNoYW5nZWFibGUgKi8KKyNpZmRlZiBERUJVR19ETUFTT1VORAorcHJpbnRrKCJkbWFzb3VuZF9jb3JlOiB0cmllZCB0byBzcV9zZXR1cCBhIGxvY2tlZCBxdWV1ZVxuIikgOworI2VuZGlmCisJCXJldHVybiAtRUlOVkFMIDsKKwl9CisJc3EtPmxvY2tlZCA9IDEgOyAvKiBkb24ndCB0aGluayB3ZSBoYXZlIGEgcmFjZSBwcm9iLiBoZXJlIF9jaGVja18gKi8KKworCS8qIG1ha2Ugc3VyZSB0aGF0IHRoZSBwYXJhbWV0ZXJzIGFyZSBzZXQgdXAKKwkgICBUaGlzIHNob3VsZCBoYXZlIGJlZW4gZG9uZSBhbHJlYWR5Li4uCisJKi8KKworCWRtYXNvdW5kLm1hY2guaW5pdCgpOworCisJLyogT0suICBJZiB0aGUgdXNlciBoYXMgc2V0IGZyYWdtZW50IHBhcmFtZXRlcnMgZXhwbGljaXRseSwgdGhlbiB3ZQorCSAgIHNob3VsZCBsZWF2ZSB0aGVtIGFsb25lLi4uIGFzIGxvbmcgYXMgdGhleSBhcmUgdmFsaWQuCisJICAgSW52YWxpZCB1c2VyIGZyYWdtZW50IHBhcmFtcyBjYW4gb2NjdXIgaWYgd2UgYWxsb3cgdGhlIHdob2xlIGJ1ZmZlcgorCSAgIHRvIGJlIHVzZWQgd2hlbiB0aGUgdXNlciByZXF1ZXN0cyB0aGUgZnJhZ21lbnRzIHNpemVzICh3aXRoIG5vIHNvZnQKKwkgICB4LWxhdGlvbikgYW5kIHRoZW4gdGhlIHVzZXIgc3Vic2VxdWVudGx5IHNldHMgYSBzb2Z0IHgtbGF0aW9uIHRoYXQKKwkgICByZXF1aXJlcyBpbmNyZWFzZWQgaW50ZXJuYWwgYnVmZmVyaW5nLgorCisJICAgT3Rod2Vyd2lzZSAoaWYgdGhlIHVzZXIgZGlkIG5vdCBzZXQgdGhlbSkgT1NTIHNheXMgdGhhdCB3ZSBzaG91bGQKKwkgICBzZWxlY3QgZnJhZyBwYXJhbXMgb24gdGhlIGJhc2lzIG9mIDAuNSBzIG91dHB1dCAmIDAuMSBzIGlucHV0CisJICAgbGF0ZW5jeS4gKFRPRE8uICBGb3Igbm93IHdlIHdpbGwgY29weSBpbiB0aGUgZGVmYXVsdHMuKQorCSovCisKKwlpZiAoc3EtPnVzZXJfZnJhZ3MgPD0gMCkgeworCQlzcS0+bWF4X2NvdW50ID0gc3EtPm51bUJ1ZnMgOworCQlzcS0+bWF4X2FjdGl2ZSA9IHNxLT5udW1CdWZzIDsKKwkJc3EtPmJsb2NrX3NpemUgPSBzcS0+YnVmU2l6ZTsKKwkJLyogc2V0IHVwIHRoZSB1c2VyIGluZm8gKi8KKwkJc3EtPnVzZXJfZnJhZ3MgPSBzcS0+bnVtQnVmcyA7CisJCXNxLT51c2VyX2ZyYWdfc2l6ZSA9IHNxLT5idWZTaXplIDsKKwkJc3EtPnVzZXJfZnJhZ19zaXplICo9CisJCQkoZG1hc291bmQuc29mdC5zaXplICogKGRtYXNvdW5kLnNvZnQuc3RlcmVvKzEpICkgOworCQlzcS0+dXNlcl9mcmFnX3NpemUgLz0KKwkJCShkbWFzb3VuZC5oYXJkLnNpemUgKiAoZG1hc291bmQuaGFyZC5zdGVyZW8rMSkgKSA7CisJfSBlbHNlIHsKKwkJLyogd29yayBvdXQgcmVxdWVzdGVkIGJsb2NrIHNpemUgKi8KKwkJc3EtPmJsb2NrX3NpemUgPSBzcS0+dXNlcl9mcmFnX3NpemUgOworCQlzcS0+YmxvY2tfc2l6ZSAqPQorCQkJKGRtYXNvdW5kLmhhcmQuc2l6ZSAqIChkbWFzb3VuZC5oYXJkLnN0ZXJlbysxKSApIDsKKwkJc3EtPmJsb2NrX3NpemUgLz0KKwkJCShkbWFzb3VuZC5zb2Z0LnNpemUgKiAoZG1hc291bmQuc29mdC5zdGVyZW8rMSkgKSA7CisJCS8qIHRoZSB1c2VyIHdhbnRzIHRvIHdyaXRlIGZyYWctc2l6ZSBjaHVua3MgKi8KKwkJc3EtPmJsb2NrX3NpemUgKj0gZG1hc291bmQuaGFyZC5zcGVlZCA7CisJCXNxLT5ibG9ja19zaXplIC89IGRtYXNvdW5kLnNvZnQuc3BlZWQgOworCQkvKiB0aGlzIG9ubHkgd29ya3MgZm9yIHNpemUgdmFsdWVzIHdoaWNoIGFyZSBwb3dlcnMgb2YgMiAqLworCQloYXJkX2ZyYW1lID0KKwkJCShkbWFzb3VuZC5oYXJkLnNpemUgKiAoZG1hc291bmQuaGFyZC5zdGVyZW8rMSkpLzggOworCQlzcS0+YmxvY2tfc2l6ZSArPSAgKGhhcmRfZnJhbWUgLSAxKSA7CisJCXNxLT5ibG9ja19zaXplICY9IH4oaGFyZF9mcmFtZSAtIDEpIDsgLyogbWFrZSBzdXJlIHdlIGFyZSBhbGlnbmVkICovCisJCS8qIGxldCdzIGp1c3QgY2hlY2sgZm9yIG9idmlvdXMgbWlzdGFrZXMgKi8KKwkJaWYgKCBzcS0+YmxvY2tfc2l6ZSA8PSAwIHx8IHNxLT5ibG9ja19zaXplID4gc3EtPmJ1ZlNpemUpIHsKKyNpZmRlZiBERUJVR19ETUFTT1VORAorcHJpbnRrKCJkbWFzb3VuZF9jb3JlOiBpbnZhbGlkIGZyYWcgc2l6ZSAodXNlciBzZXQgJWQpXG4iLCBzcS0+dXNlcl9mcmFnX3NpemUpIDsKKyNlbmRpZgorCQkJc3EtPmJsb2NrX3NpemUgPSBzcS0+YnVmU2l6ZSA7CisJCX0KKwkJaWYgKCBzcS0+dXNlcl9mcmFncyA8PSBzcS0+bnVtQnVmcyApIHsKKwkJCXNxLT5tYXhfY291bnQgPSBzcS0+dXNlcl9mcmFncyA7CisJCQkvKiBpZiB1c2VyIGhhcyBzZXQgbWF4X2FjdGl2ZSAtIHRoZW4gdXNlIGl0ICovCisJCQlzcS0+bWF4X2FjdGl2ZSA9IChzcS0+bWF4X2FjdGl2ZSA8PSBzcS0+bWF4X2NvdW50KSA/CisJCQkJc3EtPm1heF9hY3RpdmUgOiBzcS0+bWF4X2NvdW50IDsKKwkJfSBlbHNlIHsKKyNpZmRlZiBERUJVR19ETUFTT1VORAorcHJpbnRrKCJkbWFzb3VuZF9jb3JlOiBpbnZhbGlkIGZyYWcgY291bnQgKHVzZXIgc2V0ICVkKVxuIiwgc3EtPnVzZXJfZnJhZ3MpIDsKKyNlbmRpZgorCQkJc3EtPm1heF9jb3VudCA9CisJCQlzcS0+bWF4X2FjdGl2ZSA9IHNxLT5udW1CdWZzIDsKKwkJfQorCX0KKwlzcS0+ZnJvbnQgPSBzcS0+Y291bnQgPSBzcS0+cmVhcl9zaXplID0gMDsKKwlzcS0+c3luY2luZyA9IDA7CisJc3EtPmFjdGl2ZSA9IDA7CisKKwlpZiAoc3EgPT0gJndyaXRlX3NxKSB7CisJICAgIHNxLT5yZWFyID0gLTE7CisJICAgIHNldHVwX2Z1bmMgPSBkbWFzb3VuZC5tYWNoLndyaXRlX3NxX3NldHVwOworCX0KKyNpZmRlZiBIQVNfUkVDT1JECisJZWxzZSB7CisJICAgIHNxLT5yZWFyID0gMDsKKwkgICAgc2V0dXBfZnVuYyA9IGRtYXNvdW5kLm1hY2gucmVhZF9zcV9zZXR1cDsKKwl9CisjZW5kaWYKKwlpZiAoc2V0dXBfZnVuYykKKwkgICAgcmV0dXJuIHNldHVwX2Z1bmMoKTsKKwlyZXR1cm4gMCA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcV9wbGF5KHZvaWQpCit7CisJZG1hc291bmQubWFjaC5wbGF5KCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqc3JjLCBzaXplX3QgdUxlZnQsCisJCQlsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCB1V3JpdHRlbiA9IDA7CisJdV9jaGFyICpkZXN0OworCXNzaXplX3QgdVVzZWQgPSAwLCBiVXNlZCwgYkxlZnQ7CisJdW5zaWduZWQgbG9uZyBmbGFncyA7CisKKwkvKiArK1RlU2NoZTogSXMgc29tZXRoaW5nIGxpa2UgdGhpcyBuZWNlc3Nhcnk/CisJICogSGV5LCB0aGF0J3MgYW4gaG9uZXN0IHF1ZXN0aW9uISBPciBkb2VzIGFueSBvdGhlciBwYXJ0IG9mIHRoZQorCSAqIGZpbGVzeXN0ZW0gYWxyZWFkeSBjaGVja3MgdGhpcyBzaXR1YXRpb24/IEkgcmVhbGx5IGRvbid0IGtub3cuCisJICovCisJaWYgKHVMZWZ0ID09IDApCisJCXJldHVybiAwOworCisJLyogaW1wbGVtZW50IGFueSBjaGFuZ2VzIHdlIGhhdmUgbWFkZSB0byB0aGUgc29mdC9oYXJkIHBhcmFtcy4KKwkgICB0aGlzIGlzIG5vdCBzYXRpc2ZhY3RvcnkgcmVhbGx5LCBhbGwgd2UgaGF2ZSBkb25lIHVwIHRvIG5vdyBpcyB0bworCSAgIHNheSB3aGF0IHdlIHdvdWxkIGxpa2UgLSB0aGVyZSBoYXNuJ3QgYmVlbiBhbnkgcmVhbCBjaGVja2luZyBvZiBjYXBhYmlsaXR5CisJKi8KKworCWlmIChzaGFyZWRfcmVzb3VyY2VzX2luaXRpYWxpc2VkID09IDApIHsKKwkJZG1hc291bmQubWFjaC5pbml0KCkgOworCQlzaGFyZWRfcmVzb3VyY2VzX2luaXRpYWxpc2VkID0gMSA7CisJfQorCisJLyogc2V0IHVwIHRoZSBzcSBpZiBpdCBpcyBub3QgYWxyZWFkeSBkb25lLiBUaGlzIG1heSBzZWVtIGEgZHVtYiBwbGFjZQorCSAgIHRvIGRvIGl0IC0gYnV0IGl0IGlzIHdoYXQgT1NTIHJlcXVpcmVzLiAgSXQgbWVhbnMgdGhhdCB3cml0ZSgpIGNhbgorCSAgIHJldHVybiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvcnMuICBUbyBhdm9pZCB0aGlzIHBvc3NpYmlsaXR5IHVzZSB0aGUKKwkgICBHRVRCTEtTSVpFIG9yIEdFVE9TUEFDRSBpb2N0bHMgKGFmdGVyIHlvdSd2ZSBmaWRkbGVkIHdpdGggYWxsIHRoZQorCSAgIHBhcmFtcyB5b3Ugd2FudCB0byBjaGFuZ2UpIC0gdGhlc2UgaW9jdGxzIGFsc28gZm9yY2UgdGhlIHNldHVwLgorCSovCisKKwlpZiAod3JpdGVfc3EubG9ja2VkID09IDApIHsKKwkJaWYgKCh1V3JpdHRlbiA9IHNxX3NldHVwKCZ3cml0ZV9zcSkpIDwgMCkgcmV0dXJuIHVXcml0dGVuIDsKKwkJdVdyaXR0ZW4gPSAwIDsKKwl9CisKKy8qIEZJWE1FOiBJIHRoaW5rIHRoYXQgdGhpcyBtYXkgYmUgdGhlIHdyb25nIGJlaGF2aW91ciB3aGVuIHdlIGdldCBzdHJhcHBlZAorCWZvciB0aW1lIGFuZCB0aGUgY3B1IGlzIGNsb3NlIHRvIGJlaW5nIChvciBhY3R1YWxseSkgYmVoaW5kIGluIHNlbmRpbmcgZGF0YS4KKwktIGJlY2F1c2Ugd2UndmUgbG9zdCB0aGUgdGltZSB0aGF0IHRoZSBOIHNhbXBsZXMsIGFscmVhZHkgaW4gdGhlIGJ1ZmZlciwKKwl3b3VsZCBoYXZlIGdpdmVuIHVzIHRvIGdldCBoZXJlIHdpdGggdGhlIG5leHQgbG90IGZyb20gdGhlIHVzZXIuCisqLworCS8qIFRoZSBpbnRlcnJ1cHQgZG9lc24ndCBzdGFydCB0byBwbGF5IHRoZSBsYXN0LCBpbmNvbXBsZXRlIGZyYW1lLgorCSAqIFRodXMgd2UgY2FuIGFwcGVuZCB0byBpdCB3aXRob3V0IGRpc2FibGluZyB0aGUgaW50ZXJydXB0cyEgKE5vdGUKKwkgKiBhbHNvIHRoYXQgd3JpdGVfc3EucmVhciBpc24ndCBhZmZlY3RlZCBieSB0aGUgaW50ZXJydXB0LikKKwkgKi8KKworCS8qIGFzIG9mIDEuNiB0aGlzIGJlaGF2aW91ciBjaGFuZ2VzIGlmIFNORENUTF9EU1BfUE9TVCBoYXMgYmVlbiBpc3N1ZWQ6CisJICAgdGhpcyB3aWxsIG1pbWljIHRoZSBiZWhhdmlvdXIgb2Ygc3luY2luZyBhbmQgYWxsb3cgdGhlIHNxX3BsYXkoKSB0bworCSAgIHF1ZXVlIGEgcGFydGlhbCBmcmFnbWVudC4gIFNpbmNlIHNxX3BsYXkoKSBtYXkvd2lsbCBiZSBjYWxsZWQgZnJvbQorCSAgIHRoZSBJUlEgaGFuZGxlciAtIGF0IGxlYXN0IG9uIFBtYWMgd2UgaGF2ZSB0byBkZWFsIHdpdGggaXQuCisJICAgVGhlIHN0cmF0ZWd5IC0gcG9zc2libHkgbm90IG9wdGltdW0gLSBpcyB0byBraWxsIF9QT1NUIHN0YXR1cyBpZiB3ZQorCSAgIGdldCBoZXJlLiAgVGhpcyBzZWVtcywgYXQgbGVhc3QsIHJlYXNvbmFibGUgLSBpbiB0aGUgc2Vuc2UgdGhhdCBQT1NUCisJICAgaXMgc3VwcG9zZWQgdG8gaW5kaWNhdGUgdGhhdCB3ZSBtaWdodCBub3Qgd3JpdGUgYmVmb3JlIHRoZSBxdWV1ZQorCSAgIGlzIGRyYWluZWQgLSBhbmQgaWYgd2UgZ2V0IGhlcmUgaW4gdGltZSB0aGVuIGl0IGRvZXMgbm90IGFwcGx5LgorCSovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hc291bmQubG9jaywgZmxhZ3MpOworCXdyaXRlX3NxLnN5bmNpbmcgJj0gfjIgOyAvKiB0YWtlIG91dCBQT1NUIHN0YXR1cyAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYXNvdW5kLmxvY2ssIGZsYWdzKTsKKworCWlmICh3cml0ZV9zcS5jb3VudCA+IDAgJiYKKwkgICAgKGJMZWZ0ID0gd3JpdGVfc3EuYmxvY2tfc2l6ZS13cml0ZV9zcS5yZWFyX3NpemUpID4gMCkgeworCQlkZXN0ID0gd3JpdGVfc3EuYnVmZmVyc1t3cml0ZV9zcS5yZWFyXTsKKwkJYlVzZWQgPSB3cml0ZV9zcS5yZWFyX3NpemU7CisJCXVVc2VkID0gc291bmRfY29weV90cmFuc2xhdGUoZG1hc291bmQudHJhbnNfd3JpdGUsIHNyYywgdUxlZnQsCisJCQkJCSAgICAgZGVzdCwgJmJVc2VkLCBiTGVmdCk7CisJCWlmICh1VXNlZCA8PSAwKQorCQkJcmV0dXJuIHVVc2VkOworCQlzcmMgKz0gdVVzZWQ7CisJCXVXcml0dGVuICs9IHVVc2VkOworCQl1TGVmdCA9ICh1VXNlZCA8PSB1TGVmdCkgPyAodUxlZnQgLSB1VXNlZCkgOiAwIDsgLyogcGFyYW5vaWEgKi8KKwkJd3JpdGVfc3EucmVhcl9zaXplID0gYlVzZWQ7CisJfQorCisJd2hpbGUgKHVMZWZ0KSB7CisJCXdoaWxlICh3cml0ZV9zcS5jb3VudCA+PSB3cml0ZV9zcS5tYXhfYWN0aXZlKSB7CisJCQlzcV9wbGF5KCk7CisJCQlpZiAod3JpdGVfc3Eub3Blbl9tb2RlICYgT19OT05CTE9DSykKKwkJCQlyZXR1cm4gdVdyaXR0ZW4gPiAwID8gdVdyaXR0ZW4gOiAtRUFHQUlOOworCQkJU0xFRVAod3JpdGVfc3EuYWN0aW9uX3F1ZXVlKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gdVdyaXR0ZW4gPiAwID8gdVdyaXR0ZW4gOiAtRUlOVFI7CisJCX0KKworCQkvKiBIZXJlLCB3ZSBjYW4gYXZvaWQgZGlzYWJsaW5nIHRoZSBpbnRlcnJ1cHQgYnkgZmlyc3QKKwkJICogY29weWluZyBhbmQgdHJhbnNsYXRpbmcgdGhlIGRhdGEsIGFuZCB0aGVuIHVwZGF0aW5nCisJCSAqIHRoZSB3cml0ZV9zcSB2YXJpYWJsZXMuIFVudGlsIHRoaXMgaXMgZG9uZSwgdGhlIGludGVycnVwdAorCQkgKiB3b24ndCBzZWUgdGhlIG5ldyBmcmFtZSBhbmQgd2UgY2FuIHdvcmsgb24gaXQKKwkJICogdW5kaXN0dXJiZWQuCisJCSAqLworCisJCWRlc3QgPSB3cml0ZV9zcS5idWZmZXJzWyh3cml0ZV9zcS5yZWFyKzEpICUgd3JpdGVfc3EubWF4X2NvdW50XTsKKwkJYlVzZWQgPSAwOworCQliTGVmdCA9IHdyaXRlX3NxLmJsb2NrX3NpemU7CisJCXVVc2VkID0gc291bmRfY29weV90cmFuc2xhdGUoZG1hc291bmQudHJhbnNfd3JpdGUsIHNyYywgdUxlZnQsCisJCQkJCSAgICAgZGVzdCwgJmJVc2VkLCBiTGVmdCk7CisJCWlmICh1VXNlZCA8PSAwKQorCQkJYnJlYWs7CisJCXNyYyArPSB1VXNlZDsKKwkJdVdyaXR0ZW4gKz0gdVVzZWQ7CisJCXVMZWZ0ID0gKHVVc2VkIDw9IHVMZWZ0KSA/ICh1TGVmdCAtIHVVc2VkKSA6IDAgOyAvKiBwYXJhbm9pYSAqLworCQlpZiAoYlVzZWQpIHsKKwkJCXdyaXRlX3NxLnJlYXIgPSAod3JpdGVfc3EucmVhcisxKSAlIHdyaXRlX3NxLm1heF9jb3VudDsKKwkJCXdyaXRlX3NxLnJlYXJfc2l6ZSA9IGJVc2VkOworCQkJd3JpdGVfc3EuY291bnQrKzsKKwkJfQorCX0gLyogdVVzZWQgbWF5IGhhdmUgYmVlbiAwICovCisKKwlzcV9wbGF5KCk7CisKKwlyZXR1cm4gdVVzZWQgPCAwPyB1VXNlZDogdVdyaXR0ZW47Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3FfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwlpbnQgcmV0VmFsOworCQorCWlmICh3cml0ZV9zcS5sb2NrZWQgPT0gMCkgeworCQlpZiAoKHJldFZhbCA9IHNxX3NldHVwKCZ3cml0ZV9zcSkpIDwgMCkKKwkJCXJldHVybiByZXRWYWw7CisJCXJldHVybiAwOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgKQorCQlwb2xsX3dhaXQoZmlsZSwgJndyaXRlX3NxLmFjdGlvbl9xdWV1ZSwgd2FpdCk7CisjaWZkZWYgSEFTX1JFQ09SRAorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlwb2xsX3dhaXQoZmlsZSwgJnJlYWRfc3EuYWN0aW9uX3F1ZXVlLCB3YWl0KTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJaWYgKHJlYWRfc3EuYmxvY2tfc2l6ZSAtIHJlYWRfc3EucmVhcl9zaXplID4gMCkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKyNlbmRpZgorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJaWYgKHdyaXRlX3NxLmNvdW50IDwgd3JpdGVfc3EubWF4X2FjdGl2ZSB8fCB3cml0ZV9zcS5ibG9ja19zaXplIC0gd3JpdGVfc3EucmVhcl9zaXplID4gMCkKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJcmV0dXJuIG1hc2s7CisKK30KKworI2lmZGVmIEhBU19SRUNPUkQKKyAgICAvKgorICAgICAqICBIZXJlIGlzIGhvdyB0aGUgdmFsdWVzIGFyZSB1c2VkIGZvciByZWFkaW5nLgorICAgICAqICBUaGUgdmFsdWUgJ2FjdGl2ZScgc2ltcGx5IGluZGljYXRlcyB0aGUgRE1BIGlzIHJ1bm5pbmcuICBUaGlzIGlzIGRvbmUKKyAgICAgKiAgc28gdGhlIGRyaXZlciBzZW1hbnRpY3MgYXJlIERNQSBzdGFydHMgd2hlbiB0aGUgZmlyc3QgcmVhZCBpcyBwb3N0ZWQuCisgICAgICogIFRoZSB2YWx1ZSAnZnJvbnQnIGluZGljYXRlcyB0aGUgYnVmZmVyIHdlIHNob3VsZCBuZXh0IHNlbmQgdG8gdGhlIHVzZXIuCisgICAgICogIFRoZSB2YWx1ZSAncmVhcicgaW5kaWNhdGVzIHRoZSBidWZmZXIgdGhlIERNQSBpcyBjdXJyZW50bHkgZmlsbGluZy4KKyAgICAgKiAgV2hlbiAnZnJvbnQnID09ICdyZWFyJyB0aGUgYnVmZmVyICJyaW5nIiBpcyBlbXB0eSAod2UgYWx3YXlzIGhhdmUgYW4KKyAgICAgKiAgZW1wdHkgYXZhaWxhYmxlKS4gIFRoZSAncmVhcl9zaXplJyBpcyB1c2VkIHRvIHRyYWNrIHBhcnRpYWwgb2Zmc2V0cworICAgICAqICBpbnRvIHRoZSBidWZmZXIgd2UgYXJlIGN1cnJlbnRseSByZXR1cm5pbmcgdG8gdGhlIHVzZXIuCisKKyAgICAgKiAgVGhpcyBsZXZlbCAoPiBbMS41XSkgZG9lc24ndCBjYXJlIHdoYXQgc3RyYXRlZ3kgdGhlIExMIGRyaXZlciB1c2VzIHdpdGgKKyAgICAgKiAgRE1BIG9uIG92ZXItcnVuLiAgSXQgY2FuIGxlYXZlIGl0IHJ1bm5pbmcgKGFuZCBrZWVwIGFjdGl2ZSA9PSAxKSBvciBpdAorICAgICAqICBjYW4ga2lsbCBpdCBhbmQgc2V0IGFjdGl2ZSA9PSAwIGluIHdoaWNoIGNhc2UgdGhpcyByb3V0aW5lIHdpbGwgc3BvdAorICAgICAqICBpdCBhbmQgcmVzdGFydCB0aGUgRE1BLgorICAgICAqLworCitzdGF0aWMgc3NpemVfdCBzcV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqZHN0LCBzaXplX3QgdUxlZnQsCisJCSAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisKKwlzc2l6ZV90CXVSZWFkLCBiTGVmdCwgYlVzZWQsIHVVc2VkOworCisJaWYgKHVMZWZ0ID09IDApCisJCXJldHVybiAwOworCisJLyogY2F0ZXIgZm9yIHRoZSBjb21wYXRpYmlsaXR5IG1vZGUgLSByZWNvcmQgY29tcGlsZWQgaW4gYnV0IG5vIExMICovCisJaWYgKGRtYXNvdW5kLm1hY2gucmVjb3JkID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMIDsKKworCS8qIHNlZSBjb21tZW50IGluIHNxX3dyaXRlKCkKKwkqLworCisJaWYoIHNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPT0gMCkgeworCQlkbWFzb3VuZC5tYWNoLmluaXQoKSA7CisJCXNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPSAxIDsKKwl9CisKKwkvKiBzZXQgdXAgdGhlIHNxIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGRvbmUuIHNlZSBjb21tZW50cyBpbiBzcV93cml0ZSgpLgorCSovCisKKwlpZiAocmVhZF9zcS5sb2NrZWQgPT0gMCkgeworCQlpZiAoKHVSZWFkID0gc3Ffc2V0dXAoJnJlYWRfc3EpKSA8IDApCisJCQlyZXR1cm4gdVJlYWQgOworCX0KKworCXVSZWFkID0gMDsKKworCS8qIE1vdmUgd2hhdCB0aGUgdXNlciByZXF1ZXN0cywgZGVwZW5kaW5nIHVwb24gb3RoZXIgb3B0aW9ucy4KKwkqLworCXdoaWxlICh1TGVmdCA+IDApIHsKKworCQkvKiB3ZSBoYXBwZW5lZCB0byBnZXQgYmVoaW5kIGFuZCB0aGUgTEwgZHJpdmVyIGtpbGxlZCBETUEKKwkJICAgdGhlbiB3ZSBzaG91bGQgc2V0IGl0IGdvaW5nIGFnYWluLiAgVGhpcyBhbHNvIHNldHMgaXQKKwkJICAgZ29pbmcgdGhlIGZpcnN0IHRpbWUgdGhyb3VnaC4KKwkJKi8KKwkJaWYgKCAhcmVhZF9zcS5hY3RpdmUgKQorCQkJZG1hc291bmQubWFjaC5yZWNvcmQoKTsKKworCQkvKiBXaGVuIGZyb250ID09IHJlYXIsIHRoZSBETUEgaXMgbm90IGRvbmUgeWV0LgorCQkqLworCQl3aGlsZSAocmVhZF9zcS5mcm9udCA9PSByZWFkX3NxLnJlYXIpIHsKKwkJCWlmIChyZWFkX3NxLm9wZW5fbW9kZSAmIE9fTk9OQkxPQ0spIHsKKwkJCSAgICAgICByZXR1cm4gdVJlYWQgPiAwID8gdVJlYWQgOiAtRUFHQUlOOworCQkJfQorCQkJU0xFRVAocmVhZF9zcS5hY3Rpb25fcXVldWUpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiB1UmVhZCA+IDAgPyB1UmVhZCA6IC1FSU5UUjsKKwkJfQorCisJCS8qIFRoZSBhbW91bnQgd2UgbW92ZSBpcyBlaXRoZXIgd2hhdCBpcyBsZWZ0IGluIHRoZQorCQkgKiBjdXJyZW50IGJ1ZmZlciBvciB3aGF0IHRoZSB1c2VyIHdhbnRzLgorCQkgKi8KKwkJYkxlZnQgPSByZWFkX3NxLmJsb2NrX3NpemUgLSByZWFkX3NxLnJlYXJfc2l6ZTsKKwkJYlVzZWQgPSByZWFkX3NxLnJlYXJfc2l6ZTsKKwkJdVVzZWQgPSBzb3VuZF9jb3B5X3RyYW5zbGF0ZShkbWFzb3VuZC50cmFuc19yZWFkLCBkc3QsIHVMZWZ0LAorCQkJCQkgICAgIHJlYWRfc3EuYnVmZmVyc1tyZWFkX3NxLmZyb250XSwKKwkJCQkJICAgICAmYlVzZWQsIGJMZWZ0KTsKKwkJaWYgKHVVc2VkIDw9IDApCisJCQlyZXR1cm4gdVVzZWQ7CisJCWRzdCArPSB1VXNlZDsKKwkJdVJlYWQgKz0gdVVzZWQ7CisJCXVMZWZ0IC09IHVVc2VkOworCQlyZWFkX3NxLnJlYXJfc2l6ZSArPSBiVXNlZDsKKwkJaWYgKHJlYWRfc3EucmVhcl9zaXplID49IHJlYWRfc3EuYmxvY2tfc2l6ZSkgeworCQkJcmVhZF9zcS5yZWFyX3NpemUgPSAwOworCQkJcmVhZF9zcS5mcm9udCsrOworCQkJaWYgKHJlYWRfc3EuZnJvbnQgPj0gcmVhZF9zcS5tYXhfYWN0aXZlKQorCQkJCXJlYWRfc3EuZnJvbnQgPSAwOworCQl9CisJfQorCXJldHVybiB1UmVhZDsKK30KKyNlbmRpZiAvKiBIQVNfUkVDT1JEICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzcV9pbml0X3dhaXRxdWV1ZShzdHJ1Y3Qgc291bmRfcXVldWUgKnNxKQoreworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNxLT5hY3Rpb25fcXVldWUpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnNxLT5vcGVuX3F1ZXVlKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzcS0+c3luY19xdWV1ZSk7CisJc3EtPmJ1c3kgPSAwOworfQorCisjaWYgMCAvKiBibG9ja2luZyBvcGVuKCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBzcV93YWtlX3VwKHN0cnVjdCBzb3VuZF9xdWV1ZSAqc3EsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgbW9kZV90IG1vZGUpCit7CisJaWYgKGZpbGUtPmZfbW9kZSAmIG1vZGUpIHsKKwkJc3EtPmJ1c3kgPSAwOyAvKiBDSEVDSzogSVMgVEhJUyBPSz8/PyAqLworCQlXQUtFX1VQKHNxLT5vcGVuX3F1ZXVlKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGludCBzcV9vcGVuMihzdHJ1Y3Qgc291bmRfcXVldWUgKnNxLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgbW9kZV90IG1vZGUsCisJCSAgICBpbnQgbnVtYnVmcywgaW50IGJ1ZnNpemUpCit7CisJaW50IHJjID0gMDsKKworCWlmIChmaWxlLT5mX21vZGUgJiBtb2RlKSB7CisJCWlmIChzcS0+YnVzeSkgeworI2lmIDAgLyogYmxvY2tpbmcgb3BlbigpICovCisJCQlyYyA9IC1FQlVTWTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IC1FSU5UUjsKKwkJCXdoaWxlIChzcS0+YnVzeSkgeworCQkJCVNMRUVQKHNxLT5vcGVuX3F1ZXVlKTsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCXJldHVybiByYzsKKwkJCX0KKwkJCXJjID0gMDsKKyNlbHNlCisJCQkvKiBPU1MgbWFudWFsIHNheXMgd2Ugd2lsbCByZXR1cm4gRUJVU1kgcmVnYXJkbGVzcworCQkJICAgb2YgT19OT0JMT0NLLgorCQkJKi8KKwkJCXJldHVybiAtRUJVU1kgOworI2VuZGlmCisJCX0KKwkJc3EtPmJ1c3kgPSAxOyAvKiBMZXQncyBwbGF5IHNwb3QtdGhlLXJhY2UtY29uZGl0aW9uICovCisKKwkJLyogYWxsb2NhdGUgdGhlIGRlZmF1bHQgbnVtYmVyICYgc2l6ZSBvZiBidWZmZXJzLgorCQkgICAoaS5lLiBzcGVjaWZpZWQgaW4gX3NldHVwKCkgb3IgYXMgbW9kdWxlIHBhcmFtcykKKwkJICAgY2FuJ3QgYmUgY2hhbmdlZCBhdCB0aGUgbW9tZW50IC0gYnV0IF9jb3VsZF8gYmUgcGVyaGFwcworCQkgICBpbiB0aGUgc2V0ZnJhZ21lbnRzIGlvY3RsLgorCQkqLworCQlpZiAoKCByYyA9IHNxX2FsbG9jYXRlX2J1ZmZlcnMoc3EsIG51bWJ1ZnMsIGJ1ZnNpemUpKSkgeworI2lmIDAgLyogYmxvY2tpbmcgb3BlbigpICovCisJCQlzcV93YWtlX3VwKHNxLCBmaWxlLCBtb2RlKTsKKyNlbHNlCisJCQlzcS0+YnVzeSA9IDAgOworI2VuZGlmCisJCQlyZXR1cm4gcmM7CisJCX0KKworCQlzcS0+b3Blbl9tb2RlID0gZmlsZS0+Zl9tb2RlOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKyNkZWZpbmUgd3JpdGVfc3FfaW5pdF93YWl0cXVldWUoKQlzcV9pbml0X3dhaXRxdWV1ZSgmd3JpdGVfc3EpCisjaWYgMCAvKiBibG9ja2luZyBvcGVuKCkgKi8KKyNkZWZpbmUgd3JpdGVfc3Ffd2FrZV91cChmaWxlKQkJc3Ffd2FrZV91cCgmd3JpdGVfc3EsIGZpbGUsIEZNT0RFX1dSSVRFKQorI2VuZGlmCisjZGVmaW5lIHdyaXRlX3NxX3JlbGVhc2VfYnVmZmVycygpCXNxX3JlbGVhc2VfYnVmZmVycygmd3JpdGVfc3EpCisjZGVmaW5lIHdyaXRlX3NxX29wZW4oZmlsZSkJXAorCXNxX29wZW4yKCZ3cml0ZV9zcSwgZmlsZSwgRk1PREVfV1JJVEUsIG51bVdyaXRlQnVmcywgd3JpdGVCdWZTaXplICkKKworI2lmZGVmIEhBU19SRUNPUkQKKyNkZWZpbmUgcmVhZF9zcV9pbml0X3dhaXRxdWV1ZSgpCXNxX2luaXRfd2FpdHF1ZXVlKCZyZWFkX3NxKQorI2lmIDAgLyogYmxvY2tpbmcgb3BlbigpICovCisjZGVmaW5lIHJlYWRfc3Ffd2FrZV91cChmaWxlKQkJc3Ffd2FrZV91cCgmcmVhZF9zcSwgZmlsZSwgRk1PREVfUkVBRCkKKyNlbmRpZgorI2RlZmluZSByZWFkX3NxX3JlbGVhc2VfYnVmZmVycygpCXNxX3JlbGVhc2VfYnVmZmVycygmcmVhZF9zcSkKKyNkZWZpbmUgcmVhZF9zcV9vcGVuKGZpbGUpCVwKKwlzcV9vcGVuMigmcmVhZF9zcSwgZmlsZSwgRk1PREVfUkVBRCwgbnVtUmVhZEJ1ZnMsIHJlYWRCdWZTaXplICkKKyNlbHNlCisjZGVmaW5lIHJlYWRfc3FfaW5pdF93YWl0cXVldWUoKQlkbyB7fSB3aGlsZSAoMCkKKyNpZiAwIC8qIGJsb2NraW5nIG9wZW4oKSAqLworI2RlZmluZSByZWFkX3NxX3dha2VfdXAoZmlsZSkJCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIHJlYWRfc3FfcmVsZWFzZV9idWZmZXJzKCkJZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIHNxX3Jlc2V0X2lucHV0KCkJCWRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgc3Ffb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgcmM7CisKKwlpZiAoIXRyeV9tb2R1bGVfZ2V0KGRtYXNvdW5kLm1hY2gub3duZXIpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJjID0gd3JpdGVfc3Ffb3BlbihmaWxlKTsgLyogY2hlY2tzIHRoZSBmX21vZGUgKi8KKwlpZiAocmMpCisJCWdvdG8gb3V0OworI2lmZGVmIEhBU19SRUNPUkQKKwlpZiAoZG1hc291bmQubWFjaC5yZWNvcmQpIHsKKwkJcmMgPSByZWFkX3NxX29wZW4oZmlsZSk7IC8qIGNoZWNrcyB0aGUgZl9tb2RlICovCisJCWlmIChyYykKKwkJCWdvdG8gb3V0OworCX0gZWxzZSB7IC8qIG5vIHJlY29yZCBmdW5jdGlvbiBpbnN0YWxsZWQ7IGluIGNvbXBhdCBtb2RlICovCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkvKiBUT0RPOiBpZiBPX1JEV1IsIHJlbGVhc2UgYW55IHJlc291cmNlcyBncmFiYmVkIGJ5IHdyaXRlIHBhcnQgKi8KKwkJCXJjID0gLUVOWElPOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisjZWxzZSAvKiAhSEFTX1JFQ09SRCAqLworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCS8qIFRPRE86IGlmIE9fUkRXUiwgcmVsZWFzZSBhbnkgcmVzb3VyY2VzIGdyYWJiZWQgYnkgd3JpdGUgcGFydCAqLworCQlyYyA9IC1FTlhJTyA7IC8qIEkgdGhpbmsgdGhpcyBpcyB3aGF0IGlzIHJlcXVpcmVkIGJ5IG9wZW4oMikgKi8KKwkJZ290byBvdXQ7CisJfQorI2VuZGlmIC8qIEhBU19SRUNPUkQgKi8KKworCWlmIChkbWFzb3VuZC5tYWNoLnNxX29wZW4pCisJICAgIGRtYXNvdW5kLm1hY2guc3Ffb3BlbihmaWxlLT5mX21vZGUpOworCisJLyogQ0hFQ0sgd2hldGhlciB0aGlzIGlzIHNlbnNpYmxlIC0gaW4gdGhlIGNhc2UgdGhhdCBkc3AwIGNvdWxkIGJlIG9wZW5lZAorCSAgT19SRE9OTFkgYW5kIGRzcDEgY291bGQgYmUgb3BlbmVkIE9fV1JPTkxZCisJKi8KKworCWRtYXNvdW5kLm1pbkRldiA9IGltaW5vcihpbm9kZSkgJiAweDBmOworCisJLyogT0suIC0gd2Ugc2hvdWxkIG1ha2Ugc29tZSBhdHRlbXB0IGF0IGNvbnNpc3RlbmN5LiBBdCBsZWFzdCB0aGUgSCd3YXJlCisJICAgb3B0aW9ucyBzaG91bGQgYmUgc2V0IHdpdGggYSB2YWxpZCBtb2RlLiAgV2Ugd2lsbCBtYWtlIGl0IHRoYXQgdGhlIExMCisJICAgZHJpdmVyIG11c3Qgc3VwcGx5IGRlZmF1bHRzIGZvciBoYXJkICYgc29mdCBwYXJhbXMuCisJKi8KKworCWlmIChzaGFyZWRfcmVzb3VyY2Vfb3duZXIgPT0gMCkgeworCQkvKiB5b3UgY2FuIG1ha2UgdGhpcyBBRk1UX1U4L21vbm8vOEsgaWYgeW91IHdhbnQgdG8gbWltaWMgb2xkCisJCSAgIE9TUyBiZWhhdmlvdXIgLSB3aGlsZSB3ZSBzdGlsbCBoYXZlIHNvZnQgdHJhbnNsYXRpb25zIDstKSAqLworCQlkbWFzb3VuZC5zb2Z0ID0gZG1hc291bmQubWFjaC5kZWZhdWx0X3NvZnQgOworCQlkbWFzb3VuZC5kc3AgPSBkbWFzb3VuZC5tYWNoLmRlZmF1bHRfc29mdCA7CisJCWRtYXNvdW5kLmhhcmQgPSBkbWFzb3VuZC5tYWNoLmRlZmF1bHRfaGFyZCA7CisJfQorCisjaWZuZGVmIERNQVNPVU5EX1NUUklDVF9PU1NfQ09NUExJQU5DRQorCS8qIG5vbmUgb2YgdGhlIGN1cnJlbnQgTEwgZHJpdmVycyBjYW4gYWN0dWFsbHkgZG8gdGhpcyAibmF0aXZlIiBhdCB0aGUgbW9tZW50CisJICAgT1NTIGRvZXMgbm90IHJlYWxseSByZXF1aXJlIHVzIHRvIHN1cHBseSAvZGV2L2F1ZGlvIGlmIHdlIGNhbid0IGRvIGl0LgorCSovCisJaWYgKGRtYXNvdW5kLm1pbkRldiA9PSBTTkRfREVWX0FVRElPKSB7CisJCXNvdW5kX3NldF9zcGVlZCg4MDAwKTsKKwkJc291bmRfc2V0X3N0ZXJlbygwKTsKKwkJc291bmRfc2V0X2Zvcm1hdChBRk1UX01VX0xBVyk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gMDsKKyBvdXQ6CisJbW9kdWxlX3B1dChkbWFzb3VuZC5tYWNoLm93bmVyKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIHNxX3Jlc2V0X291dHB1dCh2b2lkKQoreworCXNvdW5kX3NpbGVuY2UoKTsgLyogdGhpcyBfbXVzdF8gc3RvcCBETUEsIHdlIG1pZ2h0IGJlIGFib3V0IHRvIGxvc2UgdGhlIGJ1ZmZlcnMgKi8KKwl3cml0ZV9zcS5hY3RpdmUgPSAwOworCXdyaXRlX3NxLmNvdW50ID0gMDsKKwl3cml0ZV9zcS5yZWFyX3NpemUgPSAwOworCS8qIHdyaXRlX3NxLmZyb250ID0gKHdyaXRlX3NxLnJlYXIrMSkgJSB3cml0ZV9zcS5tYXhfY291bnQ7Ki8KKwl3cml0ZV9zcS5mcm9udCA9IDAgOworCXdyaXRlX3NxLnJlYXIgPSAtMSA7IC8qIHNhbWUgYXMgZm9yIHNldC11cCAqLworCisJLyogT0sgLSB3ZSBjYW4gdW5sb2NrIHRoZSBwYXJhbWV0ZXJzIGFuZCBmcmFnbWVudCBzZXR0aW5ncyAqLworCXdyaXRlX3NxLmxvY2tlZCA9IDAgOworCXdyaXRlX3NxLnVzZXJfZnJhZ3MgPSAwIDsKKwl3cml0ZV9zcS51c2VyX2ZyYWdfc2l6ZSA9IDAgOworfQorCisjaWZkZWYgSEFTX1JFQ09SRAorCitzdGF0aWMgdm9pZCBzcV9yZXNldF9pbnB1dCh2b2lkKQoreworCWlmIChkbWFzb3VuZC5tYWNoLnJlY29yZCAmJiByZWFkX3NxLmFjdGl2ZSkgeworCQlpZiAoZG1hc291bmQubWFjaC5hYm9ydF9yZWFkKSB7IC8qIHRoaXMgcm91dGluZSBtdXN0IHJlYWxseSBiZSBwcmVzZW50ICovCisJCQlyZWFkX3NxLnN5bmNpbmcgPSAxIDsKKwkJCS8qIHRoaXMgY2FuIHVzZSB0aGUgcmVhZF9zcS5zeW5jX3F1ZXVlIHRvIHNsZWVwIGlmCisJCQkgICBuZWNlc3NhcnkgLSBpdCBzaG91bGQgbm90IHJldHVybiB1bnRpbCBETUEKKwkJCSAgIGlzIHJlYWxseSBzdG9wcGVkIC0gYmVjYXVzZSB3ZSBtaWdodCBkZWFsbG9jYXRlCisJCQkgICB0aGUgYnVmZmVycyBhcyB0aGUgbmV4dCBhY3Rpb24uLi4KKwkJCSovCisJCQlkbWFzb3VuZC5tYWNoLmFib3J0X3JlYWQoKSA7CisJCX0gZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIKKwkJCSJkbWFzb3VuZF9jb3JlOiAlcyBoYXMgbm8gYWJvcnRfcmVhZCgpISEgYWxsIGJldHMgYXJlIG9mZlxuIiwKKwkJCQlkbWFzb3VuZC5tYWNoLm5hbWUpIDsKKwkJfQorCX0KKwlyZWFkX3NxLnN5bmNpbmcgPQorCXJlYWRfc3EuYWN0aXZlID0KKwlyZWFkX3NxLmZyb250ID0KKwlyZWFkX3NxLmNvdW50ID0KKwlyZWFkX3NxLnJlYXIgPSAwIDsKKworCS8qIE9LIC0gd2UgY2FuIHVubG9jayB0aGUgcGFyYW1ldGVycyBhbmQgZnJhZ21lbnQgc2V0dGluZ3MgKi8KKwlyZWFkX3NxLmxvY2tlZCA9IDAgOworCXJlYWRfc3EudXNlcl9mcmFncyA9IDAgOworCXJlYWRfc3EudXNlcl9mcmFnX3NpemUgPSAwIDsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNxX3Jlc2V0KHZvaWQpCit7CisJc3FfcmVzZXRfb3V0cHV0KCkgOworCXNxX3Jlc2V0X2lucHV0KCkgOworCS8qIHdlIGNvdWxkIGNvbnNpZGVyIHJlc2V0dGluZyB0aGUgc2hhcmVkX3Jlc291cmNlc19vd25lciBoZXJlLi4uIGJ1dCBJCisJICAgdGhpbmsgaXQgaXMgcHJvYmFibHkgc3RpbGwgcmF0aGVyIG5vbi1vYnZpb3VzIHRvIGFwcGxpY2F0aW9uIHdyaXRlcgorCSovCisKKwkvKiB3ZSByZWxlYXNlIGV2ZXJ5dGhpbmcgZWxzZSB0aG91Z2ggKi8KKwlzaGFyZWRfcmVzb3VyY2VzX2luaXRpYWxpc2VkID0gMCA7Cit9CisKK3N0YXRpYyBpbnQgc3FfZnN5bmMoc3RydWN0IGZpbGUgKmZpbHAsIHN0cnVjdCBkZW50cnkgKmRlbnRyeSkKK3sKKwlpbnQgcmMgPSAwOworCWludCB0aW1lb3V0ID0gNTsKKworCXdyaXRlX3NxLnN5bmNpbmcgfD0gMTsKKwlzcV9wbGF5KCk7CS8qIHRoZXJlIG1heSBiZSBhbiBpbmNvbXBsZXRlIGZyYW1lIHdhaXRpbmcgKi8KKworCXdoaWxlICh3cml0ZV9zcS5hY3RpdmUpIHsKKwkJU0xFRVAod3JpdGVfc3Euc3luY19xdWV1ZSk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJLyogV2hpbGUgd2FpdGluZyBmb3IgYXVkaW8gb3V0cHV0IHRvIGRyYWluLCBhbgorCQkJICogaW50ZXJydXB0IG9jY3VycmVkLiAgU3RvcCBhdWRpbyBvdXRwdXQgaW1tZWRpYXRlbHkKKwkJCSAqIGFuZCBjbGVhciB0aGUgcXVldWUuICovCisJCQlzcV9yZXNldF9vdXRwdXQoKTsKKwkJCXJjID0gLUVJTlRSOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCEtLXRpbWVvdXQpIHsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImRtYXNvdW5kOiBUaW1lb3V0IGRyYWluaW5nIG91dHB1dFxuIik7CisJCQlzcV9yZXNldF9vdXRwdXQoKTsKKwkJCXJjID0gLUVJTzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogZmxhZyBubyBzeW5jIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB3ZSBoYWQgYSBEU1BfUE9TVCBvciBub3QgKi8KKwl3cml0ZV9zcS5zeW5jaW5nID0gMCA7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHNxX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJjID0gMDsKKworCWxvY2tfa2VybmVsKCk7CisKKyNpZmRlZiBIQVNfUkVDT1JECisJLyogcHJvYmFibHkgYmVzdCB0byBkbyB0aGUgcmVhZCBzaWRlIGZpcnN0IC0gc28gdGhhdCB0aW1lIHRha2VuIHRvIGRvIGl0CisJICAgb3ZlcmxhcHMgd2l0aCBwbGF5aW5nIGFueSByZW1haW5pbmcgb3V0cHV0IHNhbXBsZXMuCisJKi8KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzcV9yZXNldF9pbnB1dCgpIDsgLyogbWFrZSBzdXJlIGRtYSBpcyBzdG9wcGVkIGFuZCBhbGwgaXMgcXVpZXQgKi8KKwkJcmVhZF9zcV9yZWxlYXNlX2J1ZmZlcnMoKTsKKwkJcmVhZF9zcS5idXN5ID0gMDsKKwl9CisjZW5kaWYKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAod3JpdGVfc3EuYnVzeSkKKwkJCXJjID0gc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9kZW50cnkpOworCisJCXNxX3Jlc2V0X291dHB1dCgpIDsgLyogbWFrZSBzdXJlIGRtYSBpcyBzdG9wcGVkIGFuZCBhbGwgaXMgcXVpZXQgKi8KKwkJd3JpdGVfc3FfcmVsZWFzZV9idWZmZXJzKCk7CisJCXdyaXRlX3NxLmJ1c3kgPSAwOworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBzaGFyZWRfcmVzb3VyY2Vfb3duZXIpIHsgLyogaXQncyB1cyB0aGF0IGhhcyB0aGVtICovCisJCXNoYXJlZF9yZXNvdXJjZV9vd25lciA9IDAgOworCQlzaGFyZWRfcmVzb3VyY2VzX2luaXRpYWxpc2VkID0gMCA7CisJCWRtYXNvdW5kLmhhcmQgPSBkbWFzb3VuZC5tYWNoLmRlZmF1bHRfaGFyZCA7CisJfQorCisJbW9kdWxlX3B1dChkbWFzb3VuZC5tYWNoLm93bmVyKTsKKworI2lmIDAgLyogYmxvY2tpbmcgb3BlbigpICovCisJLyogV2FrZSB1cCBhIHByb2Nlc3Mgd2FpdGluZyBmb3IgdGhlIHF1ZXVlIGJlaW5nIHJlbGVhc2VkLgorCSAqIE5vdGU6IFRoZXJlIG1heSBiZSBzZXZlcmFsIHByb2Nlc3NlcyB3YWl0aW5nIGZvciBhIGNhbGwKKwkgKiB0byBvcGVuKCkgcmV0dXJuaW5nLiAqLworCisJLyogSWFpbjogaG1tIEkgZG9uJ3QgdW5kZXJzdGFuZCB0aGlzIG5leHQgY29tbWVudCAuLi4gKi8KKwkvKiBUaGVyZSBpcyBwcm9iYWJseSBhIERPUyBhdGFjayBoZXJlLiBUaGV5IGNoYW5nZSB0aGUgbW9kZSBmbGFnLiAqLworCS8qIFhYWCBhZGQgY2hlY2sgaGVyZSwqLworCXJlYWRfc3Ffd2FrZV91cChmaWxlKTsgLyogY2hlY2tzIGZfbW9kZSAqLworCXdyaXRlX3NxX3dha2VfdXAoZmlsZSk7IC8qIGNoZWNrcyBmX21vZGUgKi8KKyNlbmRpZiAvKiBibG9ja2luZyBvcGVuKCkgKi8KKworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiByYzsKK30KKworLyogaGVyZSB3ZSBzZWUgaWYgd2UgaGF2ZSBhIHJpZ2h0IHRvIG1vZGlmeSBmb3JtYXQsIGNoYW5uZWxzLCBzaXplIGFuZCBzbyBvbgorICAgaWYgbm8tb25lIGVsc2UgaGFzIGNsYWltZWQgaXQgYWxyZWFkeSB0aGVuIHdlIGRvLi4uCisKKyAgIFRPRE86IFdlIG1pZ2h0IGNoYW5nZSB0aGlzIHRvIG1hc2sgT19SRFdSIHN1Y2ggdGhhdCBvbmx5IG9uZSBvciB0aGUgb3RoZXIgY2hhbm5lbAorICAgaXMgdGhlIG93bmVyIC0gaWYgd2UgaGF2ZSBwcm9ibGVtcy4KKyovCisKK3N0YXRpYyBpbnQgc2hhcmVkX3Jlc291cmNlc19hcmVfbWluZShtb2RlX3QgbWQpCit7CisJaWYgKHNoYXJlZF9yZXNvdXJjZV9vd25lcikKKwkJcmV0dXJuIChzaGFyZWRfcmVzb3VyY2Vfb3duZXIgJiBtZCApIDsKKwllbHNlIHsKKwkJc2hhcmVkX3Jlc291cmNlX293bmVyID0gbWQgOworCQlyZXR1cm4gMSA7CisJfQorfQorCisvKiBpZiBlaXRoZXIgcXVldWUgaXMgbG9ja2VkIHdlIG11c3QgZGVueSB0aGUgcmlnaHQgdG8gY2hhbmdlIHNoYXJlZCBwYXJhbXMKKyovCisKK3N0YXRpYyBpbnQgcXVldWVzX2FyZV9xdWllc2NlbnQodm9pZCkKK3sKKyNpZmRlZiBIQVNfUkVDT1JECisJaWYgKGRtYXNvdW5kLm1hY2gucmVjb3JkKQorCQlpZiAocmVhZF9zcS5sb2NrZWQpCisJCQlyZXR1cm4gMCA7CisjZW5kaWYKKwlpZiAod3JpdGVfc3EubG9ja2VkKQorCQlyZXR1cm4gMCA7CisJcmV0dXJuIDEgOworfQorCisvKiBjaGVjayBhbmQgc2V0IGEgcXVldWUncyBmcmFnbWVudHMgcGVyIHVzZXIncyB3aXNoZXMuLi4KKyAgIHdlIHdpbGwgY2hlY2sgYWdhaW5zdCB0aGUgcHJlLWRlZmluZWQgbGl0ZXJhbHMgYW5kIHRoZSBhY3R1YWwgc2l6ZXMuCisgICBUaGlzIGlzIGEgYml0IGZyYXVnaHQgLSBiZWNhdXNlIHNvZnQgdHJhbnNsYXRpb25zIGNhbiBtZXNzIHdpdGggb3VyCisgICBidWZmZXIgcmVxdWlyZW1lbnRzICphZnRlciogdGhpcyBjYWxsIC0gT1NTIHNheXMgImNhbGwgc2V0ZnJhZ3MgZmlyc3QiCisqLworCisvKiBJdCBpcyBwb3NzaWJsZSB0byByZXBsYWNlIGFsbCB0aGUgLUVJTlZBTCByZXR1cm5zIHdpdGggYW4gb3ZlcnJpZGUgdGhhdAorICAganVzdCBwdXRzIHRoZSBhbGxvd2FibGUgdmFsdWUgaW4uICBUaGlzIG1heSBiZSB3aGF0IG1hbnkgT1NTIGFwcHMgcmVxdWlyZQorKi8KKworc3RhdGljIGludCBzZXRfcXVldWVfZnJhZ3Moc3RydWN0IHNvdW5kX3F1ZXVlICpzcSwgaW50IGJ1ZnMsIGludCBzaXplKQoreworCWlmIChzcS0+bG9ja2VkKSB7CisjaWZkZWYgREVCVUdfRE1BU09VTkQKK3ByaW50aygiZG1hc291bmRfY29yZTogdHJpZWQgdG8gc2V0X3F1ZXVlX2ZyYWdzIG9uIGEgbG9ja2VkIHF1ZXVlXG4iKSA7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUwgOworCX0KKworCWlmICgoc2l6ZSA8IE1JTl9GUkFHX1NJWkUpIHx8IChzaXplID4gTUFYX0ZSQUdfU0laRSkpCisJCXJldHVybiAtRUlOVkFMIDsKKwlzaXplID0gKDE8PHNpemUpIDsgLyogbm93IGluIGJ5dGVzICovCisJaWYgKHNpemUgPiBzcS0+YnVmU2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUwgOyAvKiB0aGlzIG1pZ2h0IHN0aWxsIG5vdCB3b3JrICovCisKKwlpZiAoYnVmcyA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTCA7CisJaWYgKGJ1ZnMgPiBzcS0+bnVtQnVmcykgLyogdGhlIHVzZXIgaXMgYWxsb3dlZCBzYXkgImRvbid0IGNhcmUiIHdpdGggMHg3ZmZmICovCisJCWJ1ZnMgPSBzcS0+bnVtQnVmcyA7CisKKwkvKiB0aGVyZSBpcywgY3VycmVudGx5LCBubyB3YXkgdG8gc3BlY2lmeSBtYXhfYWN0aXZlIHNlcGFyYXRlbHkKKwkgICBmcm9tIG1heF9jb3VudC4gIFRoaXMgY291bGQgYmUgYSBMTCBkcml2ZXIgaXNzdWUgLSBJIGd1ZXNzCisJICAgaWYgdGhlcmUgaXMgYSByZXF1aXJlbWVudCBmb3IgdGhlc2UgdmFsdWVzIHRvIGJlIGRpZmZlcmVudCB0aGVuCisJICB3ZSB3aWxsIGhhdmUgdG8gcGFzcyB0aGF0IGluZm8uIHVwIHRvIHRoaXMgbGV2ZWwuCisJKi8KKwlzcS0+dXNlcl9mcmFncyA9CisJc3EtPm1heF9hY3RpdmUgPSBidWZzIDsKKwlzcS0+dXNlcl9mcmFnX3NpemUgPSBzaXplIDsKKworCXJldHVybiAwIDsKK30KKworc3RhdGljIGludCBzcV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdV9pbnQgY21kLAorCQkgICAgdV9sb25nIGFyZykKK3sKKwlpbnQgdmFsLCByZXN1bHQ7CisJdV9sb25nIGZtdDsKKwlpbnQgZGF0YTsKKwlpbnQgc2l6ZSwgbmJ1ZnM7CisJYXVkaW9fYnVmX2luZm8gaW5mbzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlzcV9yZXNldCgpOworCQlyZXR1cm4gMDsKKwkJYnJlYWsgOworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgorCQlmbXQgPSBkbWFzb3VuZC5tYWNoLmhhcmR3YXJlX2FmbXRzIDsgLyogdGhpcyBpcyB3aGF0IE9TUyBzYXlzLi4gKi8KKwkJcmV0dXJuIElPQ1RMX09VVChhcmcsIGZtdCk7CisJCWJyZWFrIDsKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJLyogdGhpcyBzaG91bGQgdGVsbCB0aGUgY2FsbGVyIGFib3V0IGJ5dGVzIHRoYXQgdGhlIGFwcCBjYW4KKwkJICAgcmVhZC93cml0ZSAtIHRoZSBhcHAgZG9lc24ndCBjYXJlIGFib3V0IG91ciBpbnRlcm5hbCBidWZmZXJzLgorCQkgICBXZSBmb3JjZSBzcV9zZXR1cCgpIGhlcmUgYXMgcGVyIE9TUyAxLjEgKHdoaWNoIHNob3VsZAorCQkgICBjb21wdXRlIHRoZSB2YWx1ZXMgbmVjZXNzYXJ5KS4KKwkJICAgU2luY2UgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIHNwZWNpZnkgcmVhZC93cml0ZSBzZXBhcmF0ZWx5LCBmb3IKKwkJICAgZmRzIG9wZW5lZCBPX1JEV1IsIHRoZSB3cml0ZV9zcSB2YWx1ZXMgd2lsbCwgYXJiaXRyYXJpbHksIG92ZXJ3cml0ZQorCQkgICB0aGUgcmVhZF9zcSBvbmVzLgorCQkqLworCQlzaXplID0gMCA7CisjaWZkZWYgSEFTX1JFQ09SRAorCQlpZiAoZG1hc291bmQubWFjaC5yZWNvcmQgJiYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKSB7CisJCQlpZiAoICFyZWFkX3NxLmxvY2tlZCApCisJCQkJc3Ffc2V0dXAoJnJlYWRfc3EpIDsgLyogc2V0IHBhcmFtcyAqLworCQkJc2l6ZSA9IHJlYWRfc3EudXNlcl9mcmFnX3NpemUgOworCQl9CisjZW5kaWYKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoICF3cml0ZV9zcS5sb2NrZWQgKQorCQkJCXNxX3NldHVwKCZ3cml0ZV9zcSkgOworCQkJc2l6ZSA9IHdyaXRlX3NxLnVzZXJfZnJhZ19zaXplIDsKKwkJfQorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgc2l6ZSk7CisJCWJyZWFrIDsKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJLyogYWxsIHdlIGFyZSBnb2luZyB0byBkbyBpcyB0byB0ZWxsIHRoZSBMTCB0aGF0IGFueQorCQkgICBwYXJ0aWFsIGZyYWdzIGNhbiBiZSBxdWV1ZWQgZm9yIG91dHB1dC4KKwkJICAgVGhlIExMIHdpbGwgaGF2ZSB0byBjbGVhciB0aGlzIGZsYWcgd2hlbiBsYXN0IG91dHB1dAorCQkgICBpcyBxdWV1ZWQuCisJCSovCisJCXdyaXRlX3NxLnN5bmNpbmcgfD0gMHgyIDsKKwkJc3FfcGxheSgpIDsKKwkJcmV0dXJuIDAgOworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQkvKiBUaGlzIGNhbGwsIGVmZmVjdGl2ZWx5LCBoYXMgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIFNORENUTF9EU1BfUkVTRVQKKwkJICAgZXhjZXB0IHRoYXQgaXQgd2FpdHMgZm9yIG91dHB1dCB0byBmaW5pc2ggYmVmb3JlIHJlc2V0dGluZworCQkgICBldmVyeXRoaW5nIC0gcmVhZCwgaG93ZXZlciwgaXMga2lsbGVkIGltZWRpYXRlbHkuCisJCSovCisJCXJlc3VsdCA9IDAgOworCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIGRtYXNvdW5kLm1hY2gucmVjb3JkKQorCQkJc3FfcmVzZXRfaW5wdXQoKSA7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJcmVzdWx0ID0gc3FfZnN5bmMoZmlsZSwgZmlsZS0+Zl9kZW50cnkpOworCQkJc3FfcmVzZXRfb3V0cHV0KCkgOworCQl9CisJCS8qIGlmIHdlIGFyZSB0aGUgc2hhcmVkIHJlc291cmNlIG93bmVyIHRoZW4gcmVsZWFzZSB0aGVtICovCisJCWlmIChmaWxlLT5mX21vZGUgJiBzaGFyZWRfcmVzb3VyY2Vfb3duZXIpCisJCQlzaGFyZWRfcmVzb3VyY2VzX2luaXRpYWxpc2VkID0gMCA7CisJCXJldHVybiByZXN1bHQgOworCQlicmVhayA7CisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgZG1hc291bmQuc29mdC5zcGVlZCk7CisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorCQkvKiBjaGFuZ2luZyB0aGlzIG9uIHRoZSBmbHkgd2lsbCBoYXZlIHdlaXJkIGVmZmVjdHMgb24gdGhlIHNvdW5kLgorCQkgICBXaGVyZSB0aGVyZSBhcmUgcmF0ZSBjb252ZXJzaW9ucyBpbXBsZW1lbnRlZCBpbiBzb2Z0IGZvcm0gLSBpdAorCQkgICB3aWxsIGNhdXNlIHRoZSBfY3R4X3h4eCgpIGZ1bmN0aW9ucyB0byBiZSBzdWJzdGl0dXRlZC4KKwkJICAgSG93ZXZlciwgdGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55IHJlYXNvbiB0byBkaXMtYWxsb3cgaXQgZnJvbQorCQkgICBhIGRyaXZlciBwb3YuCisJCSovCisJCWlmIChzaGFyZWRfcmVzb3VyY2VzX2FyZV9taW5lKGZpbGUtPmZfbW9kZSkpIHsKKwkJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCQlkYXRhID0gc291bmRfc2V0X3NwZWVkKGRhdGEpIDsKKwkJCXNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPSAwIDsKKwkJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTCA7CisJCWJyZWFrIDsKKwkvKiBPU1Mgc2F5cyB0aGVzZSBuZXh0IDQgYWN0aW9ucyBhcmUgdW5kZWZpbmVkIHdoZW4gdGhlIGRldmljZSBpcworCSAgIGJ1c3kvYWN0aXZlIC0gd2Ugd2lsbCBqdXN0IHJldHVybiAtRUlOVkFMLgorCSAgIFRvIGJlIGFsbG93ZWQgdG8gY2hhbmdlIG9uZSAtIChhKSB5b3UgaGF2ZSB0byBvd24gdGhlIHJpZ2h0CisJICAgIChiKSB0aGUgcXVldWUocykgbXVzdCBiZSBxdWllc2NlbnQKKwkqLworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmIChzaGFyZWRfcmVzb3VyY2VzX2FyZV9taW5lKGZpbGUtPmZfbW9kZSkgJiYKKwkJICAgIHF1ZXVlc19hcmVfcXVpZXNjZW50KCkpIHsKKwkJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCQlzaGFyZWRfcmVzb3VyY2VzX2luaXRpYWxpc2VkID0gMCA7CisJCQlyZXR1cm4gSU9DVExfT1VUKGFyZywgc291bmRfc2V0X3N0ZXJlbyhkYXRhKSk7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUwgOworCQlicmVhayA7CisJY2FzZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFM6CisJCWlmIChzaGFyZWRfcmVzb3VyY2VzX2FyZV9taW5lKGZpbGUtPmZfbW9kZSkgJiYKKwkJICAgIHF1ZXVlc19hcmVfcXVpZXNjZW50KCkpIHsKKwkJCUlPQ1RMX0lOKGFyZywgZGF0YSk7CisJCQkvKiB0aGUgdXNlciBtaWdodCBhc2sgZm9yIDIwIGNoYW5uZWxzLCB3ZSB3aWxsIHJldHVybiAxIG9yIDIgKi8KKwkJCXNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPSAwIDsKKwkJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBzb3VuZF9zZXRfc3RlcmVvKGRhdGEtMSkrMSk7CisJCX0gZWxzZQorCQkJcmV0dXJuIC1FSU5WQUwgOworCQlicmVhayA7CisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJaWYgKHNoYXJlZF9yZXNvdXJjZXNfYXJlX21pbmUoZmlsZS0+Zl9tb2RlKSAmJgorCQkgICAgcXVldWVzX2FyZV9xdWllc2NlbnQoKSkgeworCQkgICAgCWludCBmb3JtYXQ7CisJCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQkJc2hhcmVkX3Jlc291cmNlc19pbml0aWFsaXNlZCA9IDAgOworCQkJZm9ybWF0ID0gc291bmRfc2V0X2Zvcm1hdChkYXRhKTsKKwkJCXJlc3VsdCA9IElPQ1RMX09VVChhcmcsIGZvcm1hdCk7CisJCQlpZiAocmVzdWx0IDwgMCkKKwkJCQlyZXR1cm4gcmVzdWx0OworCQkJaWYgKGZvcm1hdCAhPSBkYXRhICYmIGRhdGEgIT0gQUZNVF9RVUVSWSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiAwOworCQl9IGVsc2UKKwkJCXJldHVybiAtRUlOVkFMIDsKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlyZXR1cm4gLUVJTlZBTCA7CisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQkvKiB3ZSBjYW4gZG8gdGhpcyBpbmRlcGVuZGVudGx5IGZvciB0aGUgdHdvIHF1ZXVlcyAtIHdpdGggdGhlCisJCSAgIHByb3Zpc28gdGhhdCBmb3IgZmRzIG9wZW5lZCBPX1JEV1Igd2UgY2Fubm90IHNlcGFyYXRlIHRoZQorCQkgICBhY3Rpb25zIGFuZCBib3RoIHF1ZXVlcyB3aWxsIGJlIHNldCBwZXIgdGhlIGxhc3QgY2FsbC4KKwkJICAgTk9URTogdGhpcyBkb2VzICpOT1QqIGFjdHVhbGx5IHNldCB0aGUgcXVldWUgdXAgLSBtZXJlbHkKKwkJICAgcmVnaXN0ZXJzIG91ciBpbnRlbnRpb25zLgorCQkqLworCQlJT0NUTF9JTihhcmcsIGRhdGEpOworCQlyZXN1bHQgPSAwIDsKKwkJbmJ1ZnMgPSAoZGF0YSA+PiAxNikgJiAweDdmZmYgOyAvKiAweDdmZmYgaXMgJ3VzZSBtYXhpbXVtJyAqLworCQlzaXplID0gZGF0YSAmIDB4ZmZmZjsKKyNpZmRlZiBIQVNfUkVDT1JECisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgZG1hc291bmQubWFjaC5yZWNvcmQpIHsKKwkJCXJlc3VsdCA9IHNldF9xdWV1ZV9mcmFncygmcmVhZF9zcSwgbmJ1ZnMsIHNpemUpIDsKKwkJCWlmIChyZXN1bHQpCisJCQkJcmV0dXJuIHJlc3VsdCA7CisJCX0KKyNlbmRpZgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXJlc3VsdCA9IHNldF9xdWV1ZV9mcmFncygmd3JpdGVfc3EsIG5idWZzLCBzaXplKSA7CisJCQlpZiAocmVzdWx0KQorCQkJCXJldHVybiByZXN1bHQgOworCQl9CisJCS8qIE5PVEU6IHRoaXMgcmV0dXJuIHZhbHVlIGlzIGlycmVsZXZhbnQgLSBPU1Mgc3BlY2lmaWNhbGx5IHNheXMgdGhhdAorCQkgICB0aGUgdmFsdWUgaXMgJ3JhbmRvbScgYW5kIHRoYXQgdGhlIHVzZXIgX211c3RfIGNoZWNrIHRoZSBhY3R1YWwKKwkJICAgZnJhZ3MgdmFsdWVzIHVzaW5nIFNORENUTF9EU1BfR0VUQkxLU0laRSBvciBzaW1pbGFyICovCisJCXJldHVybiBJT0NUTF9PVVQoYXJnLCBkYXRhKTsKKwkJYnJlYWsgOworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCS8qCisJCSovCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCAhd3JpdGVfc3EubG9ja2VkICkKKwkJCQlzcV9zZXR1cCgmd3JpdGVfc3EpIDsKKwkJCWluZm8uZnJhZ21lbnRzID0gd3JpdGVfc3EubWF4X2FjdGl2ZSAtIHdyaXRlX3NxLmNvdW50OworCQkJaW5mby5mcmFnc3RvdGFsID0gd3JpdGVfc3EubWF4X2FjdGl2ZTsKKwkJCWluZm8uZnJhZ3NpemUgPSB3cml0ZV9zcS51c2VyX2ZyYWdfc2l6ZTsKKwkJCWluZm8uYnl0ZXMgPSBpbmZvLmZyYWdtZW50cyAqIGluZm8uZnJhZ3NpemU7CisJCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlCisJCQlyZXR1cm4gLUVJTlZBTCA7CisJCWJyZWFrIDsKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJdmFsID0gZG1hc291bmQubWFjaC5jYXBhYmlsaXRpZXMgJiAweGZmZmZmZjAwOworCQlyZXR1cm4gSU9DVExfT1VUKGFyZyx2YWwpOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIG1peGVyX2lvY3RsKGlub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBzcV9mb3BzID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IHNxX3dyaXRlLAorCS5wb2xsCQk9IHNxX3BvbGwsCisJLmlvY3RsCQk9IHNxX2lvY3RsLAorCS5vcGVuCQk9IHNxX29wZW4sCisJLnJlbGVhc2UJPSBzcV9yZWxlYXNlLAorI2lmZGVmIEhBU19SRUNPUkQKKwkucmVhZAkJPSBOVUxMCS8qIGRlZmF1bHQgdG8gbm8gcmVhZCBmb3IgY29tcGF0IG1vZGUgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIGludCBzcV9pbml0KHZvaWQpCit7CisjaWZuZGVmIE1PRFVMRQorCWludCBzcV91bml0OworI2VuZGlmCisKKyNpZmRlZiBIQVNfUkVDT1JECisJaWYgKGRtYXNvdW5kLm1hY2gucmVjb3JkKQorCQlzcV9mb3BzLnJlYWQgPSBzcV9yZWFkIDsKKyNlbmRpZgorCXNxX3VuaXQgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJnNxX2ZvcHMsIC0xKTsKKwlpZiAoc3FfdW5pdCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJkbWFzb3VuZF9jb3JlOiBjb3VsZG4ndCByZWdpc3RlciBmb3BzXG4iKSA7CisJCXJldHVybiBzcV91bml0IDsKKwl9CisKKwl3cml0ZV9zcV9pbml0X3dhaXRxdWV1ZSgpOworCXJlYWRfc3FfaW5pdF93YWl0cXVldWUoKTsKKworCS8qIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXN0b3JlZCBmb3IgZXZlcnkgY2xlYW4gb3BlbigpCisJICogaW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUgb3BlbigpcyAoZS5nLiBkc3AwICYgZHNwMSkgdGhleQorCSAqIHdpbGwgYmUgc2V0IHNvIGxvbmcgYXMgdGhlIHNoYXJlZCByZXNvdXJjZXMgaGF2ZSBubyBvd25lci4KKwkgKi8KKworCWlmIChzaGFyZWRfcmVzb3VyY2Vfb3duZXIgPT0gMCkgeworCQlkbWFzb3VuZC5zb2Z0ID0gZG1hc291bmQubWFjaC5kZWZhdWx0X3NvZnQgOworCQlkbWFzb3VuZC5oYXJkID0gZG1hc291bmQubWFjaC5kZWZhdWx0X2hhcmQgOworCQlkbWFzb3VuZC5kc3AgPSBkbWFzb3VuZC5tYWNoLmRlZmF1bHRfc29mdCA7CisJCXNoYXJlZF9yZXNvdXJjZXNfaW5pdGlhbGlzZWQgPSAwIDsKKwl9CisJcmV0dXJuIDAgOworfQorCisKKyAgICAvKgorICAgICAqICAvZGV2L3NuZHN0YXQKKyAgICAgKi8KKworLyogd2UgYWxsb3cgbW9yZSBzcGFjZSBmb3IgcmVjb3JkLWVuYWJsZWQgYmVjYXVzZSB0aGVyZSBhcmUgZXh0cmEgb3V0cHV0IGxpbmVzLgorICAgdGhlIG51bWJlciBoZXJlIG11c3QgaW5jbHVkZSB0aGUgYW1vdW50IHdlIGFyZSBwcmVwYXJlZCB0byBnaXZlIHRvIHRoZSBsb3ctbGV2ZWwKKyAgIGRyaXZlci4KKyovCisKKyNpZmRlZiBIQVNfUkVDT1JECisjZGVmaW5lIFNUQVRfQlVGRl9MRU4gMTAyNAorI2Vsc2UKKyNkZWZpbmUgU1RBVF9CVUZGX0xFTiA3NjgKKyNlbmRpZgorCisvKiB0aGlzIGlzIGhvdyBtdWNoIHNwYWNlIHdlIHdpbGwgYWxsb3cgdGhlIGxvdy1sZXZlbCBkcml2ZXIgdG8gdXNlCisgICBpbiB0aGUgc3RhdCBidWZmZXIuICBDdXJyZW50bHksIDIgKiAoODAgY2hhcmFjdGVyIGxpbmUgKyA8Tkw+KS4KKyAgIFdlIGRvIG5vdCBwb2xpY2UgdGhpcyAoaXQgaXMgdXAgdG8gdGhlIGxsIGRyaXZlciB0byBiZSBob25lc3QpLgorKi8KKworI2RlZmluZSBMT1dfTEVWRUxfU1RBVF9BTExPQyAxNjIKKworc3RhdGljIHN0cnVjdCB7CisgICAgaW50IGJ1c3k7CisgICAgY2hhciBidWZbU1RBVF9CVUZGX0xFTl07CS8qIHN0YXRlLmJ1ZiBzaG91bGQgbm90IG92ZXJmbG93ISAqLworICAgIGludCBsZW4sIHB0cjsKK30gc3RhdGU7CisKKy8qIHB1Ymxpc2ggdGhpcyBmdW5jdGlvbiBmb3IgdXNlIGJ5IGxvdy1sZXZlbCBjb2RlLCBpZiByZXF1aXJlZCAqLworCitjaGFyICpnZXRfYWZtdF9zdHJpbmcoaW50IGFmbXQpCit7CisgICAgICAgIHN3aXRjaChhZm10KSB7CisgICAgICAgICAgICBjYXNlIEFGTVRfTVVfTEFXOgorICAgICAgICAgICAgICAgIHJldHVybiAibXUtbGF3IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUZNVF9BX0xBVzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkEtbGF3IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUZNVF9VODoKKyAgICAgICAgICAgICAgICByZXR1cm4gInVuc2lnbmVkIDggYml0IjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUZNVF9TODoKKyAgICAgICAgICAgICAgICByZXR1cm4gInNpZ25lZCA4IGJpdCI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFGTVRfUzE2X0JFOgorICAgICAgICAgICAgICAgIHJldHVybiAic2lnbmVkIDE2IGJpdCBCRSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFGTVRfVTE2X0JFOgorICAgICAgICAgICAgICAgIHJldHVybiAidW5zaWduZWQgMTYgYml0IEJFIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUZNVF9TMTZfTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJzaWduZWQgMTYgYml0IExFIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUZNVF9VMTZfTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJ1bnNpZ25lZCAxNiBiaXQgTEUiOworICAgICAgICAgICAgICAgIGJyZWFrOworCSAgICBjYXNlIDA6CisJCXJldHVybiAiZm9ybWF0IG5vdCBzZXQiIDsKKwkJYnJlYWsgOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhayA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJFUlJPUjogVW5zdXBwb3J0ZWQgQUZNVF9YWFhYIGNvZGUiIDsKK30KKworc3RhdGljIGludCBzdGF0ZV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWNoYXIgKmJ1ZmZlciA9IHN0YXRlLmJ1ZjsKKwlpbnQgbGVuID0gMDsKKworCWlmIChzdGF0ZS5idXN5KQorCQlyZXR1cm4gLUVCVVNZOworCisJaWYgKCF0cnlfbW9kdWxlX2dldChkbWFzb3VuZC5tYWNoLm93bmVyKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJc3RhdGUucHRyID0gMDsKKwlzdGF0ZS5idXN5ID0gMTsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sICIlc0RNQSBzb3VuZCBkcml2ZXIgcmV2ICUwM2QgOlxuIiwKKwkJZG1hc291bmQubWFjaC5uYW1lLCAoRE1BU09VTkRfQ09SRV9SRVZJU0lPTjw8NCkgKworCQkoKGRtYXNvdW5kLm1hY2gudmVyc2lvbj4+OCkgJiAweDBmKSk7CisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwKKwkJIkNvcmUgZHJpdmVyIGVkaXRpb24gJTAyZC4lMDJkIDogJXMgZHJpdmVyIGVkaXRpb24gJTAyZC4lMDJkXG4iLAorCQlETUFTT1VORF9DT1JFX1JFVklTSU9OLCBETUFTT1VORF9DT1JFX0VESVRJT04sIGRtYXNvdW5kLm1hY2gubmFtZTIsCisJCShkbWFzb3VuZC5tYWNoLnZlcnNpb24gPj4gOCksIChkbWFzb3VuZC5tYWNoLnZlcnNpb24gJiAweGZmKSkgOworCisJLyogY2FsbCB0aGUgbG93LWxldmVsIG1vZHVsZSB0byBmaWxsIGluIGFueSBzdGF0IGluZm8uIHRoYXQgaXQgaGFzCisJICAgaWYgcHJlc2VudC4gIE1heGltdW0gYnVmZmVyIHVzYWdlIGlzIHNwZWNpZmllZC4KKwkqLworCisJaWYgKGRtYXNvdW5kLm1hY2guc3RhdGVfaW5mbykKKwkJbGVuICs9IGRtYXNvdW5kLm1hY2guc3RhdGVfaW5mbyhidWZmZXIrbGVuLAorCQkJKHNpemVfdCkgTE9XX0xFVkVMX1NUQVRfQUxMT0MpIDsKKworCS8qIG1ha2UgdXNhZ2Ugb2YgdGhlIHN0YXRlIGJ1ZmZlciBhcyBkZXRlcm1pbmlzdGljIGFzIHBvc3MuCisJICAgZXhjZXB0aW9uYWwgY29uZGl0aW9ucyBjb3VsZCBjYXVzZSBvdmVycnVuIC0gYW5kIHRoaXMgaXMgZmxhZ2dlZCBhcworCSAgIGEga2VybmVsIGVycm9yLgorCSovCisKKwkvKiBmb3JtYXRzIGFuZCBzZXR0aW5ncyAqLworCisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwiXHRcdCA9PT0gRm9ybWF0cyAmIHNldHRpbmdzID09PVxuIikgOworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIlBhcmFtZXRlciAlMjBzJTIwc1xuIiwic29mdCIsImhhcmQiKSA7CisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwiRm9ybWF0ICAgOiUyMHMlMjBzXG4iLAorCQlnZXRfYWZtdF9zdHJpbmcoZG1hc291bmQuc29mdC5mb3JtYXQpLAorCQlnZXRfYWZtdF9zdHJpbmcoZG1hc291bmQuaGFyZC5mb3JtYXQpKTsKKworCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIlNhbXAgUmF0ZTolMTRkIHMvc2VjJTE0ZCBzL3NlY1xuIiwKKwkJICAgICAgIGRtYXNvdW5kLnNvZnQuc3BlZWQsIGRtYXNvdW5kLmhhcmQuc3BlZWQpOworCisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwiQ2hhbm5lbHMgOiUyMHMlMjBzXG4iLAorCQkgICAgICAgZG1hc291bmQuc29mdC5zdGVyZW8gPyAic3RlcmVvIiA6ICJtb25vIiwKKwkJICAgICAgIGRtYXNvdW5kLmhhcmQuc3RlcmVvID8gInN0ZXJlbyIgOiAibW9ubyIgKTsKKworCS8qIHNvdW5kIHF1ZXVlIHN0YXR1cyAqLworCisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwiXHRcdCA9PT0gU291bmQgUXVldWUgc3RhdHVzID09PVxuIik7CisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwiQWxsb2NhdGVkOiU4cyU2c1xuIiwiQnVmZmVycyIsIlNpemUiKSA7CisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwiJTlzOiU4ZCU2ZFxuIiwKKwkJIndyaXRlIiwgd3JpdGVfc3EubnVtQnVmcywgd3JpdGVfc3EuYnVmU2l6ZSkgOworI2lmZGVmIEhBU19SRUNPUkQKKwlpZiAoZG1hc291bmQubWFjaC5yZWNvcmQpCisJCWxlbiArPSBzcHJpbnRmKGJ1ZmZlcitsZW4sIiU5czolOGQlNmRcbiIsCisJCQkicmVhZCIsIHJlYWRfc3EubnVtQnVmcywgcmVhZF9zcS5idWZTaXplKSA7CisjZW5kaWYKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLAorCQkiQ3VycmVudCAgOiBNYXhGcmcgRnJhZ1NpeiBNYXhBY3QgRnJudCBSZWFyICIKKwkJIkNudCBSclNpemUgQSBCIFMgTCAgeHJ1bnNcbiIpIDsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCIlOXM6JTdkJThkJTdkJTVkJTVkJTRkJTdkJTJkJTJkJTJkJTJkJTdkXG4iLAorCQkid3JpdGUiLCB3cml0ZV9zcS5tYXhfY291bnQsIHdyaXRlX3NxLmJsb2NrX3NpemUsCisJCXdyaXRlX3NxLm1heF9hY3RpdmUsIHdyaXRlX3NxLmZyb250LCB3cml0ZV9zcS5yZWFyLAorCQl3cml0ZV9zcS5jb3VudCwgd3JpdGVfc3EucmVhcl9zaXplLCB3cml0ZV9zcS5hY3RpdmUsCisJCXdyaXRlX3NxLmJ1c3ksIHdyaXRlX3NxLnN5bmNpbmcsIHdyaXRlX3NxLmxvY2tlZCwgd3JpdGVfc3EueHJ1bnMpIDsKKyNpZmRlZiBIQVNfUkVDT1JECisJaWYgKGRtYXNvdW5kLm1hY2gucmVjb3JkKQorCQlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCIlOXM6JTdkJThkJTdkJTVkJTVkJTRkJTdkJTJkJTJkJTJkJTJkJTdkXG4iLAorCQkJInJlYWQiLCByZWFkX3NxLm1heF9jb3VudCwgcmVhZF9zcS5ibG9ja19zaXplLAorCQkJcmVhZF9zcS5tYXhfYWN0aXZlLCByZWFkX3NxLmZyb250LCByZWFkX3NxLnJlYXIsCisJCQlyZWFkX3NxLmNvdW50LCByZWFkX3NxLnJlYXJfc2l6ZSwgcmVhZF9zcS5hY3RpdmUsCisJCQlyZWFkX3NxLmJ1c3ksIHJlYWRfc3Euc3luY2luZywgcmVhZF9zcS5sb2NrZWQsIHJlYWRfc3EueHJ1bnMpIDsKKyNlbmRpZgorI2lmZGVmIERFQlVHX0RNQVNPVU5ECitwcmludGsoImRtYXNvdW5kOiBzdGF0IGJ1ZmZlciB1c2VkICVkIGJ5dGVzXG4iLCBsZW4pIDsKKyNlbmRpZgorCisJaWYgKGxlbiA+PSBTVEFUX0JVRkZfTEVOKQorCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kX2NvcmU6IHN0YXQgYnVmZmVyIG92ZXJmbG93ZWQhXG4iKTsKKworCXN0YXRlLmxlbiA9IGxlbjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzdGF0ZV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWxvY2tfa2VybmVsKCk7CisJc3RhdGUuYnVzeSA9IDA7CisJbW9kdWxlX3B1dChkbWFzb3VuZC5tYWNoLm93bmVyKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0YXRlX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgbG9mZl90ICpwcG9zKQoreworCWludCBuID0gc3RhdGUubGVuIC0gc3RhdGUucHRyOworCWlmIChuID4gY291bnQpCisJCW4gPSBjb3VudDsKKwlpZiAobiA8PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJnN0YXRlLmJ1ZltzdGF0ZS5wdHJdLCBuKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3RhdGUucHRyICs9IG47CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN0YXRlX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHN0YXRlX3JlYWQsCisJLm9wZW4JCT0gc3RhdGVfb3BlbiwKKwkucmVsZWFzZQk9IHN0YXRlX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IHN0YXRlX2luaXQodm9pZCkKK3sKKyNpZm5kZWYgTU9EVUxFCisJaW50IHN0YXRlX3VuaXQ7CisjZW5kaWYKKwlzdGF0ZV91bml0ID0gcmVnaXN0ZXJfc291bmRfc3BlY2lhbCgmc3RhdGVfZm9wcywgU05EX0RFVl9TVEFUVVMpOworCWlmIChzdGF0ZV91bml0IDwgMCkKKwkJcmV0dXJuIHN0YXRlX3VuaXQgOworCXN0YXRlLmJ1c3kgPSAwOworCXJldHVybiAwIDsKK30KKworCisgICAgLyoKKyAgICAgKiAgQ29uZmlnICYgU2V0dXAKKyAgICAgKgorICAgICAqICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBfb25lXyBjaGlwc2V0LXNwZWNpZmljIGRyaXZlcgorICAgICAqLworCitpbnQgZG1hc291bmRfaW5pdCh2b2lkKQoreworCWludCByZXMgOworI2lmZGVmIE1PRFVMRQorCWlmIChpcnFfaW5zdGFsbGVkKQorCQlyZXR1cm4gLUVCVVNZOworI2VuZGlmCisKKwkvKiBTZXQgdXAgc291bmQgcXVldWUsIC9kZXYvYXVkaW8gYW5kIC9kZXYvZHNwLiAqLworCisJLyogU2V0IGRlZmF1bHQgc2V0dGluZ3MuICovCisJaWYgKChyZXMgPSBzcV9pbml0KCkpIDwgMCkKKwkJcmV0dXJuIHJlcyA7CisKKwkvKiBTZXQgdXAgL2Rldi9zbmRzdGF0LiAqLworCWlmICgocmVzID0gc3RhdGVfaW5pdCgpKSA8IDApCisJCXJldHVybiByZXMgOworCisJLyogU2V0IHVwIC9kZXYvbWl4ZXIuICovCisJbWl4ZXJfaW5pdCgpOworCisJaWYgKCFkbWFzb3VuZC5tYWNoLmlycWluaXQoKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkRNQSBzb3VuZCBkcml2ZXI6IEludGVycnVwdCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgTU9EVUxFCisJaXJxX2luc3RhbGxlZCA9IDE7CisjZW5kaWYKKworCXByaW50ayhLRVJOX0lORk8gIiVzIERNQSBzb3VuZCBkcml2ZXIgcmV2ICUwM2QgaW5zdGFsbGVkXG4iLAorCQlkbWFzb3VuZC5tYWNoLm5hbWUsIChETUFTT1VORF9DT1JFX1JFVklTSU9OPDw0KSArCisJCSgoZG1hc291bmQubWFjaC52ZXJzaW9uPj44KSAmIDB4MGYpKTsKKwlwcmludGsoS0VSTl9JTkZPCisJCSJDb3JlIGRyaXZlciBlZGl0aW9uICUwMmQuJTAyZCA6ICVzIGRyaXZlciBlZGl0aW9uICUwMmQuJTAyZFxuIiwKKwkJRE1BU09VTkRfQ09SRV9SRVZJU0lPTiwgRE1BU09VTkRfQ09SRV9FRElUSU9OLCBkbWFzb3VuZC5tYWNoLm5hbWUyLAorCQkoZG1hc291bmQubWFjaC52ZXJzaW9uID4+IDgpLCAoZG1hc291bmQubWFjaC52ZXJzaW9uICYgMHhmZikpIDsKKwlwcmludGsoS0VSTl9JTkZPICJXcml0ZSB3aWxsIHVzZSAlNGQgZnJhZ21lbnRzIG9mICU3ZCBieXRlcyBhcyBkZWZhdWx0XG4iLAorCQludW1Xcml0ZUJ1ZnMsIHdyaXRlQnVmU2l6ZSkgOworI2lmZGVmIEhBU19SRUNPUkQKKwlpZiAoZG1hc291bmQubWFjaC5yZWNvcmQpCisJCXByaW50ayhLRVJOX0lORk8KKwkJCSJSZWFkICB3aWxsIHVzZSAlNGQgZnJhZ21lbnRzIG9mICU3ZCBieXRlcyBhcyBkZWZhdWx0XG4iLAorCQkJbnVtUmVhZEJ1ZnMsIHJlYWRCdWZTaXplKSA7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisjaWZkZWYgTU9EVUxFCisKK3ZvaWQgZG1hc291bmRfZGVpbml0KHZvaWQpCit7CisJaWYgKGlycV9pbnN0YWxsZWQpIHsKKwkJc291bmRfc2lsZW5jZSgpOworCQlkbWFzb3VuZC5tYWNoLmlycWNsZWFudXAoKTsKKwkJaXJxX2luc3RhbGxlZCA9IDA7CisJfQorCisJd3JpdGVfc3FfcmVsZWFzZV9idWZmZXJzKCk7CisJcmVhZF9zcV9yZWxlYXNlX2J1ZmZlcnMoKTsKKworCWlmIChtaXhlcl91bml0ID49IDApCisJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIobWl4ZXJfdW5pdCk7CisJaWYgKHN0YXRlX3VuaXQgPj0gMCkKKwkJdW5yZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKHN0YXRlX3VuaXQpOworCWlmIChzcV91bml0ID49IDApCisJCXVucmVnaXN0ZXJfc291bmRfZHNwKHNxX3VuaXQpOworfQorCisjZWxzZSAvKiAhTU9EVUxFICovCisKK3N0YXRpYyBpbnQgZG1hc291bmRfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpbnRzWzZdLCBzaXplOworCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCS8qIGNoZWNrIHRoZSBib290c3RyYXAgcGFyYW1ldGVyIGZvciAiZG1hc291bmQ9IiAqLworCisJLyogRklYTUU6IG90aGVyIHRoYW4gaW4gdGhlIG1vc3QgbmFpdmUgb2YgY2FzZXMgdGhlcmUgaXMgbm8gc2Vuc2UgaW4gdGhlc2UKKwkgKgkgIGJ1ZmZlcnMgYmVpbmcgb3RoZXIgdGhhbiBwb3dlcnMgb2YgdHdvLiAgVGhpcyBpcyBub3QgY2hlY2tlZCB5ZXQuCisJICovCisKKwlzd2l0Y2ggKGludHNbMF0pIHsKKyNpZmRlZiBIQVNfUkVDT1JECisgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICBpZiAoKGludHNbNV0gPCAwKSB8fCAoaW50c1s1XSA+IE1BWF9DQVRDSF9SQURJVVMpKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJkbWFzb3VuZF9zZXR1cDogaW52YWxpZCBjYXRjaCByYWRpdXMsIHVzaW5nIGRlZmF1bHQgPSAlZFxuIiwgY2F0Y2hSYWRpdXMpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoUmFkaXVzID0gaW50c1s1XTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGlmIChpbnRzWzRdIDwgTUlOX0JVRkZFUlMpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImRtYXNvdW5kX3NldHVwOiBpbnZhbGlkIG51bWJlciBvZiByZWFkIGJ1ZmZlcnMsIHVzaW5nIGRlZmF1bHQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVJlYWRCdWZzKTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBudW1SZWFkQnVmcyA9IGludHNbNF07CisgICAgICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCisgICAgICAgIGNhc2UgMzoKKwkJaWYgKChzaXplID0gaW50c1szXSkgPCAyNTYpICAvKiBjaGVjayBmb3Igc21hbGwgYnVmZmVyIHNwZWNzICovCisJCQlzaXplIDw8PSAxMCA7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBNSU5fQlVGU0laRSB8fCBzaXplID4gTUFYX0JVRlNJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImRtYXNvdW5kX3NldHVwOiBpbnZhbGlkIHJlYWQgYnVmZmVyIHNpemUsIHVzaW5nIGRlZmF1bHQgPSAlZFxuIiwgcmVhZEJ1ZlNpemUpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRCdWZTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2ggKi8KKyNlbHNlCisJY2FzZSAzOgorCQlpZiAoKGludHNbM10gPCAwKSB8fCAoaW50c1szXSA+IE1BWF9DQVRDSF9SQURJVVMpKQorCQkJcHJpbnRrKCJkbWFzb3VuZF9zZXR1cDogaW52YWxpZCBjYXRjaCByYWRpdXMsIHVzaW5nIGRlZmF1bHQgPSAlZFxuIiwgY2F0Y2hSYWRpdXMpOworCQllbHNlCisJCQljYXRjaFJhZGl1cyA9IGludHNbM107CisJCS8qIGZhbGwgdGhyb3VnaCAqLworI2VuZGlmCisJY2FzZSAyOgorCQlpZiAoaW50c1sxXSA8IE1JTl9CVUZGRVJTKQorCQkJcHJpbnRrKCJkbWFzb3VuZF9zZXR1cDogaW52YWxpZCBudW1iZXIgb2YgYnVmZmVycywgdXNpbmcgZGVmYXVsdCA9ICVkXG4iLCBudW1Xcml0ZUJ1ZnMpOworCQllbHNlCisJCQludW1Xcml0ZUJ1ZnMgPSBpbnRzWzFdOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIDE6CisJCWlmICgoc2l6ZSA9IGludHNbMl0pIDwgMjU2KSAvKiBjaGVjayBmb3Igc21hbGwgYnVmZmVyIHNwZWNzICovCisJCQlzaXplIDw8PSAxMCA7CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBNSU5fQlVGU0laRSB8fCBzaXplID4gTUFYX0JVRlNJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoImRtYXNvdW5kX3NldHVwOiBpbnZhbGlkIHdyaXRlIGJ1ZmZlciBzaXplLCB1c2luZyBkZWZhdWx0ID0gJWRcbiIsIHdyaXRlQnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVCdWZTaXplID0gc2l6ZTsKKwljYXNlIDA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50aygiZG1hc291bmRfc2V0dXA6IGludmFsaWQgbnVtYmVyIG9mIGFyZ3VtZW50c1xuIik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiZG1hc291bmQ9IiwgZG1hc291bmRfc2V0dXApOworCisjZW5kaWYgLyogIU1PRFVMRSAqLworCisgICAgLyoKKyAgICAgKiAgQ29udmVyc2lvbiB0YWJsZXMKKyAgICAgKi8KKworI2lmZGVmIEhBU184QklUX1RBQkxFUworLyogOCBiaXQgbXUtbGF3ICovCisKK2NoYXIgZG1hc291bmRfdWxhdzJkbWE4W10gPSB7CisJLTEyNiwJLTEyMiwJLTExOCwJLTExNCwJLTExMCwJLTEwNiwJLTEwMiwJLTk4LAorCS05NCwJLTkwLAktODYsCS04MiwJLTc4LAktNzQsCS03MCwJLTY2LAorCS02MywJLTYxLAktNTksCS01NywJLTU1LAktNTMsCS01MSwJLTQ5LAorCS00NywJLTQ1LAktNDMsCS00MSwJLTM5LAktMzcsCS0zNSwJLTMzLAorCS0zMSwJLTMwLAktMjksCS0yOCwJLTI3LAktMjYsCS0yNSwJLTI0LAorCS0yMywJLTIyLAktMjEsCS0yMCwJLTE5LAktMTgsCS0xNywJLTE2LAorCS0xNiwJLTE1LAktMTUsCS0xNCwJLTE0LAktMTMsCS0xMywJLTEyLAorCS0xMiwJLTExLAktMTEsCS0xMCwJLTEwLAktOSwJLTksCS04LAorCS04LAktOCwJLTcsCS03LAktNywJLTcsCS02LAktNiwKKwktNiwJLTYsCS01LAktNSwJLTUsCS01LAktNCwJLTQsCisJLTQsCS00LAktNCwJLTQsCS0zLAktMywJLTMsCS0zLAorCS0zLAktMywJLTMsCS0zLAktMiwJLTIsCS0yLAktMiwKKwktMiwJLTIsCS0yLAktMiwJLTIsCS0yLAktMiwJLTIsCisJLTEsCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAorCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAktMSwKKwktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAktMSwJMCwKKwkxMjUsCTEyMSwJMTE3LAkxMTMsCTEwOSwJMTA1LAkxMDEsCTk3LAorCTkzLAk4OSwJODUsCTgxLAk3NywJNzMsCTY5LAk2NSwKKwk2MiwJNjAsCTU4LAk1NiwJNTQsCTUyLAk1MCwJNDgsCisJNDYsCTQ0LAk0MiwJNDAsCTM4LAkzNiwJMzQsCTMyLAorCTMwLAkyOSwJMjgsCTI3LAkyNiwJMjUsCTI0LAkyMywKKwkyMiwJMjEsCTIwLAkxOSwJMTgsCTE3LAkxNiwJMTUsCisJMTUsCTE0LAkxNCwJMTMsCTEzLAkxMiwJMTIsCTExLAorCTExLAkxMCwJMTAsCTksCTksCTgsCTgsCTcsCisJNywJNywJNiwJNiwJNiwJNiwJNSwJNSwKKwk1LAk1LAk0LAk0LAk0LAk0LAkzLAkzLAorCTMsCTMsCTMsCTMsCTIsCTIsCTIsCTIsCisJMiwJMiwJMiwJMiwJMSwJMSwJMSwJMSwKKwkxLAkxLAkxLAkxLAkxLAkxLAkxLAkxLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisJMCwJMCwJMCwJMCwJMCwJMCwJMCwJMCwKKwkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwCit9OworCisvKiA4IGJpdCBBLWxhdyAqLworCitjaGFyIGRtYXNvdW5kX2FsYXcyZG1hOFtdID0geworCS0yMiwJLTIxLAktMjQsCS0yMywJLTE4LAktMTcsCS0yMCwJLTE5LAorCS0zMCwJLTI5LAktMzIsCS0zMSwJLTI2LAktMjUsCS0yOCwJLTI3LAorCS0xMSwJLTExLAktMTIsCS0xMiwJLTksCS05LAktMTAsCS0xMCwKKwktMTUsCS0xNSwJLTE2LAktMTYsCS0xMywJLTEzLAktMTQsCS0xNCwKKwktODYsCS04MiwJLTk0LAktOTAsCS03MCwJLTY2LAktNzgsCS03NCwKKwktMTE4LAktMTE0LAktMTI2LAktMTIyLAktMTAyLAktOTgsCS0xMTAsCS0xMDYsCisJLTQzLAktNDEsCS00NywJLTQ1LAktMzUsCS0zMywJLTM5LAktMzcsCisJLTU5LAktNTcsCS02MywJLTYxLAktNTEsCS00OSwJLTU1LAktNTMsCisJLTIsCS0yLAktMiwJLTIsCS0yLAktMiwJLTIsCS0yLAorCS0yLAktMiwJLTIsCS0yLAktMiwJLTIsCS0yLAktMiwKKwktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCisJLTEsCS0xLAktMSwJLTEsCS0xLAktMSwJLTEsCS0xLAorCS02LAktNiwJLTYsCS02LAktNSwJLTUsCS01LAktNSwKKwktOCwJLTgsCS04LAktOCwJLTcsCS03LAktNywJLTcsCisJLTMsCS0zLAktMywJLTMsCS0zLAktMywJLTMsCS0zLAorCS00LAktNCwJLTQsCS00LAktNCwJLTQsCS00LAktNCwKKwkyMSwJMjAsCTIzLAkyMiwJMTcsCTE2LAkxOSwJMTgsCisJMjksCTI4LAkzMSwJMzAsCTI1LAkyNCwJMjcsCTI2LAorCTEwLAkxMCwJMTEsCTExLAk4LAk4LAk5LAk5LAorCTE0LAkxNCwJMTUsCTE1LAkxMiwJMTIsCTEzLAkxMywKKwk4NiwJODIsCTk0LAk5MCwJNzAsCTY2LAk3OCwJNzQsCisJMTE4LAkxMTQsCTEyNiwJMTIyLAkxMDIsCTk4LAkxMTAsCTEwNiwKKwk0MywJNDEsCTQ3LAk0NSwJMzUsCTMzLAkzOSwJMzcsCisJNTksCTU3LAk2MywJNjEsCTUxLAk0OSwJNTUsCTUzLAorCTEsCTEsCTEsCTEsCTEsCTEsCTEsCTEsCisJMSwJMSwJMSwJMSwJMSwJMSwJMSwJMSwKKwkwLAkwLAkwLAkwLAkwLAkwLAkwLAkwLAorCTAsCTAsCTAsCTAsCTAsCTAsCTAsCTAsCisJNSwJNSwJNSwJNSwJNCwJNCwJNCwJNCwKKwk3LAk3LAk3LAk3LAk2LAk2LAk2LAk2LAorCTIsCTIsCTIsCTIsCTIsCTIsCTIsCTIsCisJMywJMywJMywJMywJMywJMywJMywJMworfTsKKyNlbmRpZiAvKiBIQVNfOEJJVF9UQUJMRVMgKi8KKworICAgIC8qCisgICAgICogIFZpc2libGUgc3ltYm9scyBmb3IgbW9kdWxlcworICAgICAqLworCitFWFBPUlRfU1lNQk9MKGRtYXNvdW5kKTsKK0VYUE9SVF9TWU1CT0woZG1hc291bmRfaW5pdCk7CisjaWZkZWYgTU9EVUxFCitFWFBPUlRfU1lNQk9MKGRtYXNvdW5kX2RlaW5pdCk7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woZG1hc291bmRfd3JpdGVfc3EpOworI2lmZGVmIEhBU19SRUNPUkQKK0VYUE9SVF9TWU1CT0woZG1hc291bmRfcmVhZF9zcSk7CisjZW5kaWYKK0VYUE9SVF9TWU1CT0woZG1hc291bmRfY2F0Y2hSYWRpdXMpOworI2lmZGVmIEhBU184QklUX1RBQkxFUworRVhQT1JUX1NZTUJPTChkbWFzb3VuZF91bGF3MmRtYTgpOworRVhQT1JUX1NZTUJPTChkbWFzb3VuZF9hbGF3MmRtYTgpOworI2VuZGlmCitFWFBPUlRfU1lNQk9MKGdldF9hZm10X3N0cmluZykgOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3BhdWxhLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcGF1bGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NThkYjUzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3BhdWxhLmMKQEAgLTAsMCArMSw3NDMgQEAKKy8qCisgKiAgbGludXgvc291bmQvb3NzL2RtYXNvdW5kL2RtYXNvdW5kX3BhdWxhLmMKKyAqCisgKiAgQW1pZ2EgYFBhdWxhJyBETUEgU291bmQgRHJpdmVyCisgKgorICogIFNlZSBsaW51eC9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfY29yZS5jIGZvciBjb3B5cmlnaHQgYW5kIGNyZWRpdHMKKyAqICBwcmlvciB0byAyOC8wMS8yMDAxCisgKgorICogIDI4LzAxLzIwMDEgWzAuMV0gSWFpbiBTYW5kb2UKKyAqCQkgICAgIC0gYWRkZWQgdmVyc2lvbmluZworICoJCSAgICAgLSBwdXQgaW4gYW5kIHBvcHVsYXRlZCB0aGUgaGFyZHdhcmVfYWZtdHMgZmllbGQuCisgKiAgICAgICAgICAgICBbMC4yXSAtIHB1dCBpbiBTTkRDVExfRFNQX0dFVENBUFMgdmFsdWUuCisgKgkgICAgICAgWzAuM10gLSBwdXQgaW4gY29uc3RyYWludCBvbiBzdGF0ZSBidWZmZXIgdXNhZ2UuCisgKgkgICAgICAgWzAuNF0gLSBwdXQgaW4gZGVmYXVsdCBoYXJkL3NvZnQgc2V0dGluZ3MKKyovCisKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KKyNpbmNsdWRlIDxhc20vYW1pZ2Fody5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWludHMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorCisjaW5jbHVkZSAiZG1hc291bmQuaCIKKworI2RlZmluZSBETUFTT1VORF9QQVVMQV9SRVZJU0lPTiAwCisjZGVmaW5lIERNQVNPVU5EX1BBVUxBX0VESVRJT04gNAorCisgICAvKgorICAgICoJVGhlIG1pbmltdW0gcGVyaW9kIGZvciBhdWRpbyBkZXBlbmRzIG9uIGh0b3RhbCAoZm9yIE9DUy9FQ1MvQUdBKQorICAgICoJKEltcG9ydGVkIGZyb20gYXJjaC9tNjhrL2FtaWdhL2FtaXNvdW5kLmMpCisgICAgKi8KKworZXh0ZXJuIHZvbGF0aWxlIHVfc2hvcnQgYW1pZ2FfYXVkaW9fbWluX3BlcmlvZDsKKworCisgICAvKgorICAgICoJYW1pZ2FfbWtzb3VuZCgpIHNob3VsZCBiZSBhYmxlIHRvIHJlc3RvcmUgdGhlIHBlcmlvZCBhZnRlciBiZWVwaW5nCisgICAgKgkoSW1wb3J0ZWQgZnJvbSBhcmNoL202OGsvYW1pZ2EvYW1pc291bmQuYykKKyAgICAqLworCitleHRlcm4gdV9zaG9ydCBhbWlnYV9hdWRpb19wZXJpb2Q7CisKKworICAgLyoKKyAgICAqCUF1ZGlvIERNQSBtYXNrcworICAgICovCisKKyNkZWZpbmUgQU1JX0FVRElPX09GRgkoRE1BRl9BVUQwIHwgRE1BRl9BVUQxIHwgRE1BRl9BVUQyIHwgRE1BRl9BVUQzKQorI2RlZmluZSBBTUlfQVVESU9fOAkoRE1BRl9TRVRDTFIgfCBETUFGX01BU1RFUiB8IERNQUZfQVVEMCB8IERNQUZfQVVEMSkKKyNkZWZpbmUgQU1JX0FVRElPXzE0CShBTUlfQVVESU9fOCB8IERNQUZfQVVEMiB8IERNQUZfQVVEMykKKworCisgICAgLyoKKyAgICAgKiAgSGVscGVyIHBvaW50ZXJzIGZvciAxNigxNCktYml0IHNvdW5kCisgICAgICovCisKK3N0YXRpYyBpbnQgd3JpdGVfc3FfYmxvY2tfc2l6ZV9oYWxmLCB3cml0ZV9zcV9ibG9ja19zaXplX3F1YXJ0ZXI7CisKKworLyoqKiBMb3cgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK3N0YXRpYyB2b2lkICpBbWlBbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKTsKK3N0YXRpYyB2b2lkIEFtaUZyZWUodm9pZCAqb2JqLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CitzdGF0aWMgaW50IEFtaUlycUluaXQodm9pZCk7CisjaWZkZWYgTU9EVUxFCitzdGF0aWMgdm9pZCBBbWlJcnFDbGVhblVwKHZvaWQpOworI2VuZGlmCitzdGF0aWMgdm9pZCBBbWlTaWxlbmNlKHZvaWQpOworc3RhdGljIHZvaWQgQW1pSW5pdCh2b2lkKTsKK3N0YXRpYyBpbnQgQW1pU2V0Rm9ybWF0KGludCBmb3JtYXQpOworc3RhdGljIGludCBBbWlTZXRWb2x1bWUoaW50IHZvbHVtZSk7CitzdGF0aWMgaW50IEFtaVNldFRyZWJsZShpbnQgdHJlYmxlKTsKK3N0YXRpYyB2b2lkIEFtaVBsYXlOZXh0RnJhbWUoaW50IGluZGV4KTsKK3N0YXRpYyB2b2lkIEFtaVBsYXkodm9pZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgQW1pSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApOworCisjaWZkZWYgQ09ORklHX0hFQVJUQkVBVAorCisgICAgLyoKKyAgICAgKiAgSGVhcnRiZWF0IGludGVyZmVyZXMgd2l0aCBzb3VuZCBzaW5jZSB0aGUgNyBrSHogbG93LXBhc3MgZmlsdGVyIGFuZCB0aGUKKyAgICAgKiAgcG93ZXIgTEVEIGFyZSBjb250cm9sbGVkIGJ5IHRoZSBzYW1lIGxpbmUuCisgICAgICovCisKKyNpZmRlZiBDT05GSUdfQVBVUworI2RlZmluZSBtYWNoX2hlYXJ0YmVhdAlwcGNfbWQuaGVhcnRiZWF0CisjZW5kaWYKKworc3RhdGljIHZvaWQgKCpzYXZlZF9oZWFydGJlYXQpKGludCkgPSBOVUxMOworCitzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9oZWFydGJlYXQodm9pZCkKK3sKKwlpZiAobWFjaF9oZWFydGJlYXQpIHsKKwkgICAgc2F2ZWRfaGVhcnRiZWF0ID0gbWFjaF9oZWFydGJlYXQ7CisJICAgIG1hY2hfaGVhcnRiZWF0ID0gTlVMTDsKKwl9CisJQW1pU2V0VHJlYmxlKGRtYXNvdW5kLnRyZWJsZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfaGVhcnRiZWF0KHZvaWQpCit7CisJaWYgKHNhdmVkX2hlYXJ0YmVhdCkKKwkgICAgbWFjaF9oZWFydGJlYXQgPSBzYXZlZF9oZWFydGJlYXQ7Cit9CisjZWxzZSAvKiAhQ09ORklHX0hFQVJUQkVBVCAqLworI2RlZmluZSBkaXNhYmxlX2hlYXJ0YmVhdCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgZW5hYmxlX2hlYXJ0YmVhdCgpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiAhQ09ORklHX0hFQVJUQkVBVCAqLworCisKKy8qKiogTWlkIGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIHZvaWQgQW1pTWl4ZXJJbml0KHZvaWQpOworc3RhdGljIGludCBBbWlNaXhlcklvY3RsKHVfaW50IGNtZCwgdV9sb25nIGFyZyk7CitzdGF0aWMgaW50IEFtaVdyaXRlU3FTZXR1cCh2b2lkKTsKK3N0YXRpYyBpbnQgQW1pU3RhdGVJbmZvKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNwYWNlKTsKKworCisvKioqIFRyYW5zbGF0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qICsrVGVTY2hlOiByYWRpY2FsbHkgY2hhbmdlZCBmb3IgbmV3IGV4cGFuZGluZyBwdXJwb3Nlcy4uLgorICoKKyAqIFRoZXNlIHR3byByb3V0aW5lcyBub3cgZGVhbCB3aXRoIGNvcHlpbmcvZXhwYW5kaW5nL3RyYW5zbGF0aW5nIHRoZSBzYW1wbGVzCisgKiBmcm9tIHVzZXIgc3BhY2UgaW50byBvdXIgYnVmZmVyIGF0IHRoZSByaWdodCBmcmVxdWVuY3kuIFRoZXkgdGFrZSBjYXJlIGFib3V0CisgKiBob3cgbXVjaCBkYXRhIHRoZXJlJ3MgYWN0dWFsbHkgdG8gcmVhZCwgaG93IG11Y2ggYnVmZmVyIHNwYWNlIHRoZXJlIGlzIGFuZAorICogdG8gY29udmVydCBzYW1wbGVzIGludG8gdGhlIHJpZ2h0IGZyZXF1ZW5jeS9lbmNvZGluZy4gVGhleSB3aWxsIG9ubHkgd29yayBvbgorICogY29tcGxldGUgc2FtcGxlcyBzbyBpdCBtYXkgaGFwcGVuIHRoZXkgbGVhdmUgc29tZSBieXRlcyBpbiB0aGUgaW5wdXQgc3RyZWFtCisgKiBpZiB0aGUgdXNlciBkaWRuJ3Qgd3JpdGUgYSBtdWx0aXBsZSBvZiB0aGUgY3VycmVudCBzYW1wbGUgc2l6ZS4gVGhleSBib3RoCisgKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB0aGV5J3ZlIHVzZWQgZnJvbSBib3RoIHN0cmVhbXMgc28geW91IG1heSBkZXRlY3QKKyAqIHN1Y2ggYSBzaXR1YXRpb24uIEx1Y2tpbHkgYWxsIHByb2dyYW1zIHNob3VsZCBiZSBhYmxlIHRvIGNvcGUgd2l0aCB0aGF0LgorICoKKyAqIEkgdGhpbmsgSSd2ZSBvcHRpbWl6ZWQgYW55dGhpbmcgYXMgZmFyIGFzIG9uZSBjYW4gZG8gaW4gcGxhaW4gQywgYWxsCisgKiB2YXJpYWJsZXMgc2hvdWxkIGZpdCBpbiByZWdpc3RlcnMgYW5kIHRoZSBsb29wcyBhcmUgcmVhbGx5IHNob3J0LiBUaGVyZSdzCisgKiBvbmUgbG9vcCBmb3IgZXZlcnkgcG9zc2libGUgc2l0dWF0aW9uLiBXcml0aW5nIGEgbW9yZSBnZW5lcmFsaXplZCBhbmQgdGh1cworICogcGFyYW1ldGVyaXplZCBsb29wIHdvdWxkIG9ubHkgcHJvZHVjZSBzbG93ZXIgY29kZS4gRmVlbCBmcmVlIHRvIG9wdGltaXplCisgKiB0aGlzIGluIGFzc2VtYmxlciBpZiB5b3UgbGlrZS4gOikKKyAqCisgKiBJIHRoaW5rIHRoZXNlIHJvdXRpbmVzIGJlbG9uZyBoZXJlIGJlY2F1c2UgdGhleSdyZSBub3QgeWV0IHJlYWxseSBoYXJkd2FyZQorICogaW5kZXBlbmRlbnQsIGVzcGVjaWFsbHkgdGhlIGZhY3QgdGhhdCB0aGUgRmFsY29uIGNhbiBwbGF5IDE2Yml0IHNhbXBsZXMKKyAqIG9ubHkgaW4gc3RlcmVvIGlzIGhhcmRjb2RlZCBpbiBib3RoIG9mIHRoZW0hCisgKgorICogKytnZWVydDogc3BsaXQgaW4gZXZlbiBtb3JlIGZ1bmN0aW9ucyAob25lIHBlciBmb3JtYXQpCisgKi8KKworCisgICAgLyoKKyAgICAgKiAgTmF0aXZlIGZvcm1hdAorICAgICAqLworCitzdGF0aWMgc3NpemVfdCBhbWlfY3RfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNzaXplX3QgY291bnQsIHVzZWQ7CisKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CisJCXZvaWQgKnAgPSAmZnJhbWVbKmZyYW1lVXNlZF07CisJCWNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpICYgfjE7CisJCXVzZWQgPSBjb3VudDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHAsIHVzZXJQdHIsIGNvdW50KSkKKwkJCXJldHVybiAtRUZBVUxUOworCX0gZWxzZSB7CisJCXVfY2hhciAqbGVmdCA9ICZmcmFtZVsqZnJhbWVVc2VkPj4xXTsKKwkJdV9jaGFyICpyaWdodCA9IGxlZnQrd3JpdGVfc3FfYmxvY2tfc2l6ZV9oYWxmOworCQljb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KT4+MSAmIH4xOworCQl1c2VkID0gY291bnQqMjsKKwkJd2hpbGUgKGNvdW50ID4gMCkgeworCQkJaWYgKGdldF91c2VyKCpsZWZ0KyssIHVzZXJQdHIrKykKKwkJCSAgICB8fCBnZXRfdXNlcigqcmlnaHQrKywgdXNlclB0cisrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWNvdW50LS07CisJCX0KKwl9CisJKmZyYW1lVXNlZCArPSB1c2VkOworCXJldHVybiB1c2VkOworfQorCisKKyAgICAvKgorICAgICAqICBDb3B5IGFuZCBjb252ZXJ0IDggYml0IGRhdGEKKyAgICAgKi8KKworI2RlZmluZSBHRU5FUkFURV9BTUlfQ1Q4KGZ1bmNuYW1lLCBjb252c2FtcGxlKQkJCQlcCitzdGF0aWMgc3NpemVfdCBmdW5jbmFtZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCVwKKwkJCXVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCQlcCisJCQlzc2l6ZV90IGZyYW1lTGVmdCkJCQkJXAorewkJCQkJCQkJCVwKKwlzc2l6ZV90IGNvdW50LCB1c2VkOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CQkJCQlcCisJCXVfY2hhciAqcCA9ICZmcmFtZVsqZnJhbWVVc2VkXTsJCQkJXAorCQljb3VudCA9IG1pbl90KHNpemVfdCwgdXNlckNvdW50LCBmcmFtZUxlZnQpICYgfjE7CVwKKwkJdXNlZCA9IGNvdW50OwkJCQkJCVwKKwkJd2hpbGUgKGNvdW50ID4gMCkgewkJCQkJXAorCQkJdV9jaGFyIGRhdGE7CQkJCQlcCisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXNlclB0cisrKSkJCQlcCisJCQkJcmV0dXJuIC1FRkFVTFQ7CQkJCVwKKwkJCSpwKysgPSBjb252c2FtcGxlKGRhdGEpOwkJCVwKKwkJCWNvdW50LS07CQkJCQlcCisJCX0JCQkJCQkJXAorCX0gZWxzZSB7CQkJCQkJCVwKKwkJdV9jaGFyICpsZWZ0ID0gJmZyYW1lWypmcmFtZVVzZWQ+PjFdOwkJCVwKKwkJdV9jaGFyICpyaWdodCA9IGxlZnQrd3JpdGVfc3FfYmxvY2tfc2l6ZV9oYWxmOwkJXAorCQljb3VudCA9IG1pbl90KHNpemVfdCwgdXNlckNvdW50LCBmcmFtZUxlZnQpPj4xICYgfjE7CVwKKwkJdXNlZCA9IGNvdW50KjI7CQkJCQkJXAorCQl3aGlsZSAoY291bnQgPiAwKSB7CQkJCQlcCisJCQl1X2NoYXIgZGF0YTsJCQkJCVwKKwkJCWlmIChnZXRfdXNlcihkYXRhLCB1c2VyUHRyKyspKQkJCVwKKwkJCQlyZXR1cm4gLUVGQVVMVDsJCQkJXAorCQkJKmxlZnQrKyA9IGNvbnZzYW1wbGUoZGF0YSk7CQkJXAorCQkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCQkJXAorCQkJCXJldHVybiAtRUZBVUxUOwkJCQlcCisJCQkqcmlnaHQrKyA9IGNvbnZzYW1wbGUoZGF0YSk7CQkJXAorCQkJY291bnQtLTsJCQkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCSpmcmFtZVVzZWQgKz0gdXNlZDsJCQkJCQlcCisJcmV0dXJuIHVzZWQ7CQkJCQkJCVwKK30KKworI2RlZmluZSBBTUlfQ1RfVUxBVyh4KQkoZG1hc291bmRfdWxhdzJkbWE4Wyh4KV0pCisjZGVmaW5lIEFNSV9DVF9BTEFXKHgpCShkbWFzb3VuZF9hbGF3MmRtYThbKHgpXSkKKyNkZWZpbmUgQU1JX0NUX1U4KHgpCSgoeCkgXiAweDgwKQorCitHRU5FUkFURV9BTUlfQ1Q4KGFtaV9jdF91bGF3LCBBTUlfQ1RfVUxBVykKK0dFTkVSQVRFX0FNSV9DVDgoYW1pX2N0X2FsYXcsIEFNSV9DVF9BTEFXKQorR0VORVJBVEVfQU1JX0NUOChhbWlfY3RfdTgsIEFNSV9DVF9VOCkKKworCisgICAgLyoKKyAgICAgKiAgQ29weSBhbmQgY29udmVydCAxNiBiaXQgZGF0YQorICAgICAqLworCisjZGVmaW5lIEdFTkVSQVRFX0FNSV9DVF8xNihmdW5jbmFtZSwgY29udnNhbXBsZSkJCQlcCitzdGF0aWMgc3NpemVfdCBmdW5jbmFtZShjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCVwKKwkJCXVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCQlcCisJCQlzc2l6ZV90IGZyYW1lTGVmdCkJCQkJXAorewkJCQkJCQkJCVwKKwlzc2l6ZV90IGNvdW50LCB1c2VkOwkJCQkJCVwKKwl1X3Nob3J0IGRhdGE7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlpZiAoIWRtYXNvdW5kLnNvZnQuc3RlcmVvKSB7CQkJCQlcCisJCXVfY2hhciAqaGlnaCA9ICZmcmFtZVsqZnJhbWVVc2VkPj4xXTsJCQlcCisJCXVfY2hhciAqbG93ID0gaGlnaCt3cml0ZV9zcV9ibG9ja19zaXplX2hhbGY7CQlcCisJCWNvdW50ID0gbWluX3Qoc2l6ZV90LCB1c2VyQ291bnQsIGZyYW1lTGVmdCk+PjEgJiB+MTsJXAorCQl1c2VkID0gY291bnQqMjsJCQkJCQlcCisJCXdoaWxlIChjb3VudCA+IDApIHsJCQkJCVwKKwkJCWlmIChnZXRfdXNlcihkYXRhLCAoKHVfc2hvcnQgKil1c2VyUHRyKSsrKSkJXAorCQkJCXJldHVybiAtRUZBVUxUOwkJCQlcCisJCQlkYXRhID0gY29udnNhbXBsZShkYXRhKTsJCQlcCisJCQkqaGlnaCsrID0gZGF0YT4+ODsJCQkJXAorCQkJKmxvdysrID0gKGRhdGE+PjIpICYgMHgzZjsJCQlcCisJCQljb3VudC0tOwkJCQkJXAorCQl9CQkJCQkJCVwKKwl9IGVsc2UgewkJCQkJCQlcCisJCXVfY2hhciAqbGVmdGggPSAmZnJhbWVbKmZyYW1lVXNlZD4+Ml07CQkJXAorCQl1X2NoYXIgKmxlZnRsID0gbGVmdGgrd3JpdGVfc3FfYmxvY2tfc2l6ZV9xdWFydGVyOwlcCisJCXVfY2hhciAqcmlnaHRoID0gbGVmdGgrd3JpdGVfc3FfYmxvY2tfc2l6ZV9oYWxmOwlcCisJCXVfY2hhciAqcmlnaHRsID0gcmlnaHRoK3dyaXRlX3NxX2Jsb2NrX3NpemVfcXVhcnRlcjsJXAorCQljb3VudCA9IG1pbl90KHNpemVfdCwgdXNlckNvdW50LCBmcmFtZUxlZnQpPj4yICYgfjE7CVwKKwkJdXNlZCA9IGNvdW50KjQ7CQkJCQkJXAorCQl3aGlsZSAoY291bnQgPiAwKSB7CQkJCQlcCisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgKCh1X3Nob3J0ICopdXNlclB0cikrKykpCVwKKwkJCQlyZXR1cm4gLUVGQVVMVDsJCQkJXAorCQkJZGF0YSA9IGNvbnZzYW1wbGUoZGF0YSk7CQkJXAorCQkJKmxlZnRoKysgPSBkYXRhPj44OwkJCQlcCisJCQkqbGVmdGwrKyA9IChkYXRhPj4yKSAmIDB4M2Y7CQkJXAorCQkJaWYgKGdldF91c2VyKGRhdGEsICgodV9zaG9ydCAqKXVzZXJQdHIpKyspKQlcCisJCQkJcmV0dXJuIC1FRkFVTFQ7CQkJCVwKKwkJCWRhdGEgPSBjb252c2FtcGxlKGRhdGEpOwkJCVwKKwkJCSpyaWdodGgrKyA9IGRhdGE+Pjg7CQkJCVwKKwkJCSpyaWdodGwrKyA9IChkYXRhPj4yKSAmIDB4M2Y7CQkJXAorCQkJY291bnQtLTsJCQkJCVwKKwkJfQkJCQkJCQlcCisJfQkJCQkJCQkJXAorCSpmcmFtZVVzZWQgKz0gdXNlZDsJCQkJCQlcCisJcmV0dXJuIHVzZWQ7CQkJCQkJCVwKK30KKworI2RlZmluZSBBTUlfQ1RfUzE2QkUoeCkJKHgpCisjZGVmaW5lIEFNSV9DVF9VMTZCRSh4KQkoKHgpIF4gMHg4MDAwKQorI2RlZmluZSBBTUlfQ1RfUzE2TEUoeCkJKGxlMmJlMTYoKHgpKSkKKyNkZWZpbmUgQU1JX0NUX1UxNkxFKHgpCShsZTJiZTE2KCh4KSkgXiAweDgwMDApCisKK0dFTkVSQVRFX0FNSV9DVF8xNihhbWlfY3RfczE2YmUsIEFNSV9DVF9TMTZCRSkKK0dFTkVSQVRFX0FNSV9DVF8xNihhbWlfY3RfdTE2YmUsIEFNSV9DVF9VMTZCRSkKK0dFTkVSQVRFX0FNSV9DVF8xNihhbWlfY3RfczE2bGUsIEFNSV9DVF9TMTZMRSkKK0dFTkVSQVRFX0FNSV9DVF8xNihhbWlfY3RfdTE2bGUsIEFNSV9DVF9VMTZMRSkKKworCitzdGF0aWMgVFJBTlMgdHJhbnNBbWlnYSA9IHsKKwkuY3RfdWxhdwk9IGFtaV9jdF91bGF3LAorCS5jdF9hbGF3CT0gYW1pX2N0X2FsYXcsCisJLmN0X3M4CQk9IGFtaV9jdF9zOCwKKwkuY3RfdTgJCT0gYW1pX2N0X3U4LAorCS5jdF9zMTZiZQk9IGFtaV9jdF9zMTZiZSwKKwkuY3RfdTE2YmUJPSBhbWlfY3RfdTE2YmUsCisJLmN0X3MxNmxlCT0gYW1pX2N0X3MxNmxlLAorCS5jdF91MTZsZQk9IGFtaV9jdF91MTZsZSwKK307CisKKy8qKiogTG93IGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGlubGluZSB2b2lkIFN0b3BETUEodm9pZCkKK3sKKwljdXN0b20uYXVkWzBdLmF1ZHZvbCA9IGN1c3RvbS5hdWRbMV0uYXVkdm9sID0gMDsKKwljdXN0b20uYXVkWzJdLmF1ZHZvbCA9IGN1c3RvbS5hdWRbM10uYXVkdm9sID0gMDsKKwljdXN0b20uZG1hY29uID0gQU1JX0FVRElPX09GRjsKKwllbmFibGVfaGVhcnRiZWF0KCk7Cit9CisKK3N0YXRpYyB2b2lkICpBbWlBbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworCXJldHVybiBhbWlnYV9jaGlwX2FsbG9jKChsb25nKXNpemUsICJkbWFzb3VuZCBbUGF1bGFdIik7Cit9CisKK3N0YXRpYyB2b2lkIEFtaUZyZWUodm9pZCAqb2JqLCB1bnNpZ25lZCBpbnQgc2l6ZSkKK3sKKwlhbWlnYV9jaGlwX2ZyZWUgKG9iaik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IEFtaUlycUluaXQodm9pZCkKK3sKKwkvKiB0dXJuIG9mZiBETUEgZm9yIGF1ZGlvIGNoYW5uZWxzICovCisJU3RvcERNQSgpOworCisJLyogUmVnaXN0ZXIgaW50ZXJydXB0IGhhbmRsZXIuICovCisJaWYgKHJlcXVlc3RfaXJxKElSUV9BTUlHQV9BVUQwLCBBbWlJbnRlcnJ1cHQsIDAsICJETUEgc291bmQiLAorCQkJQW1pSW50ZXJydXB0KSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyB2b2lkIEFtaUlycUNsZWFuVXAodm9pZCkKK3sKKwkvKiB0dXJuIG9mZiBETUEgZm9yIGF1ZGlvIGNoYW5uZWxzICovCisJU3RvcERNQSgpOworCS8qIHJlbGVhc2UgdGhlIGludGVycnVwdCAqLworCWZyZWVfaXJxKElSUV9BTUlHQV9BVUQwLCBBbWlJbnRlcnJ1cHQpOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCitzdGF0aWMgdm9pZCBBbWlTaWxlbmNlKHZvaWQpCit7CisJLyogdHVybiBvZmYgRE1BIGZvciBhdWRpbyBjaGFubmVscyAqLworCVN0b3BETUEoKTsKK30KKworCitzdGF0aWMgdm9pZCBBbWlJbml0KHZvaWQpCit7CisJaW50IHBlcmlvZCwgaTsKKworCUFtaVNpbGVuY2UoKTsKKworCWlmIChkbWFzb3VuZC5zb2Z0LnNwZWVkKQorCQlwZXJpb2QgPSBhbWlnYV9jb2xvcmNsb2NrL2RtYXNvdW5kLnNvZnQuc3BlZWQtMTsKKwllbHNlCisJCXBlcmlvZCA9IGFtaWdhX2F1ZGlvX21pbl9wZXJpb2Q7CisJZG1hc291bmQuaGFyZCA9IGRtYXNvdW5kLnNvZnQ7CisJZG1hc291bmQudHJhbnNfd3JpdGUgPSAmdHJhbnNBbWlnYTsKKworCWlmIChwZXJpb2QgPCBhbWlnYV9hdWRpb19taW5fcGVyaW9kKSB7CisJCS8qIHdlIHdvdWxkIG5lZWQgdG8gc3F1ZWV6ZSB0aGUgc291bmQsIGJ1dCB3ZSB3b24ndCBkbyB0aGF0ICovCisJCXBlcmlvZCA9IGFtaWdhX2F1ZGlvX21pbl9wZXJpb2Q7CisJfSBlbHNlIGlmIChwZXJpb2QgPiA2NTUzNSkgeworCQlwZXJpb2QgPSA2NTUzNTsKKwl9CisJZG1hc291bmQuaGFyZC5zcGVlZCA9IGFtaWdhX2NvbG9yY2xvY2svKHBlcmlvZCsxKTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWN1c3RvbS5hdWRbaV0uYXVkcGVyID0gcGVyaW9kOworCWFtaWdhX2F1ZGlvX3BlcmlvZCA9IHBlcmlvZDsKK30KKworCitzdGF0aWMgaW50IEFtaVNldEZvcm1hdChpbnQgZm9ybWF0KQoreworCWludCBzaXplOworCisJLyogQW1pZ2Egc291bmQgRE1BIHN1cHBvcnRzIDhiaXQgYW5kIDE2Yml0IChwc2V1ZG8gMTQgYml0KSBtb2RlcyAqLworCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIEFGTVRfUVVFUlk6CisJCXJldHVybiBkbWFzb3VuZC5zb2Z0LmZvcm1hdDsKKwljYXNlIEFGTVRfTVVfTEFXOgorCWNhc2UgQUZNVF9BX0xBVzoKKwljYXNlIEFGTVRfVTg6CisJY2FzZSBBRk1UX1M4OgorCQlzaXplID0gODsKKwkJYnJlYWs7CisJY2FzZSBBRk1UX1MxNl9CRToKKwljYXNlIEFGTVRfVTE2X0JFOgorCWNhc2UgQUZNVF9TMTZfTEU6CisJY2FzZSBBRk1UX1UxNl9MRToKKwkJc2l6ZSA9IDE2OworCQlicmVhazsKKwlkZWZhdWx0OiAvKiA6LSkgKi8KKwkJc2l6ZSA9IDg7CisJCWZvcm1hdCA9IEFGTVRfUzg7CisJfQorCisJZG1hc291bmQuc29mdC5mb3JtYXQgPSBmb3JtYXQ7CisJZG1hc291bmQuc29mdC5zaXplID0gc2l6ZTsKKwlpZiAoZG1hc291bmQubWluRGV2ID09IFNORF9ERVZfRFNQKSB7CisJCWRtYXNvdW5kLmRzcC5mb3JtYXQgPSBmb3JtYXQ7CisJCWRtYXNvdW5kLmRzcC5zaXplID0gZG1hc291bmQuc29mdC5zaXplOworCX0KKwlBbWlJbml0KCk7CisKKwlyZXR1cm4gZm9ybWF0OworfQorCisKKyNkZWZpbmUgVk9MVU1FX1ZPWFdBUkVfVE9fQU1JKHYpIFwKKwkoKCh2KSA8IDApID8gMCA6ICgodikgPiAxMDApID8gNjQgOiAoKHYpICogNjQpLzEwMCkKKyNkZWZpbmUgVk9MVU1FX0FNSV9UT19WT1hXQVJFKHYpICgodikqMTAwLzY0KQorCitzdGF0aWMgaW50IEFtaVNldFZvbHVtZShpbnQgdm9sdW1lKQoreworCWRtYXNvdW5kLnZvbHVtZV9sZWZ0ID0gVk9MVU1FX1ZPWFdBUkVfVE9fQU1JKHZvbHVtZSAmIDB4ZmYpOworCWN1c3RvbS5hdWRbMF0uYXVkdm9sID0gZG1hc291bmQudm9sdW1lX2xlZnQ7CisJZG1hc291bmQudm9sdW1lX3JpZ2h0ID0gVk9MVU1FX1ZPWFdBUkVfVE9fQU1JKCh2b2x1bWUgJiAweGZmMDApID4+IDgpOworCWN1c3RvbS5hdWRbMV0uYXVkdm9sID0gZG1hc291bmQudm9sdW1lX3JpZ2h0OworCWlmIChkbWFzb3VuZC5oYXJkLnNpemUgPT0gMTYpIHsKKwkJaWYgKGRtYXNvdW5kLnZvbHVtZV9sZWZ0ID09IDY0ICYmIGRtYXNvdW5kLnZvbHVtZV9yaWdodCA9PSA2NCkgeworCQkJY3VzdG9tLmF1ZFsyXS5hdWR2b2wgPSAxOworCQkJY3VzdG9tLmF1ZFszXS5hdWR2b2wgPSAxOworCQl9IGVsc2UgeworCQkJY3VzdG9tLmF1ZFsyXS5hdWR2b2wgPSAwOworCQkJY3VzdG9tLmF1ZFszXS5hdWR2b2wgPSAwOworCQl9CisJfQorCXJldHVybiBWT0xVTUVfQU1JX1RPX1ZPWFdBUkUoZG1hc291bmQudm9sdW1lX2xlZnQpIHwKKwkgICAgICAgKFZPTFVNRV9BTUlfVE9fVk9YV0FSRShkbWFzb3VuZC52b2x1bWVfcmlnaHQpIDw8IDgpOworfQorCitzdGF0aWMgaW50IEFtaVNldFRyZWJsZShpbnQgdHJlYmxlKQoreworCWRtYXNvdW5kLnRyZWJsZSA9IHRyZWJsZTsKKwlpZiAodHJlYmxlIDwgNTApCisJCWNpYWEucHJhICY9IH4weDAyOworCWVsc2UKKwkJY2lhYS5wcmEgfD0gMHgwMjsKKwlyZXR1cm4gdHJlYmxlOworfQorCisKKyNkZWZpbmUgQU1JX1BMQVlfTE9BREVECQkxCisjZGVmaW5lIEFNSV9QTEFZX1BMQVlJTkcJMgorI2RlZmluZSBBTUlfUExBWV9NQVNLCQkzCisKKworc3RhdGljIHZvaWQgQW1pUGxheU5leHRGcmFtZShpbnQgaW5kZXgpCit7CisJdV9jaGFyICpzdGFydCwgKmNoMCwgKmNoMSwgKmNoMiwgKmNoMzsKKwl1X2xvbmcgc2l6ZTsKKworCS8qIHVzZWQgYnkgQW1pUGxheSgpIGlmIGFsbCBkb3VidHMgd2hldGhlciB0aGVyZSByZWFsbHkgaXMgc29tZXRoaW5nCisJICogdG8gYmUgcGxheWVkIGFyZSBhbHJlYWR5IHdpcGVkIG91dC4KKwkgKi8KKwlzdGFydCA9IHdyaXRlX3NxLmJ1ZmZlcnNbd3JpdGVfc3EuZnJvbnRdOworCXNpemUgPSAod3JpdGVfc3EuY291bnQgPT0gaW5kZXggPyB3cml0ZV9zcS5yZWFyX3NpemUKKwkJCQkJOiB3cml0ZV9zcS5ibG9ja19zaXplKT4+MTsKKworCWlmIChkbWFzb3VuZC5oYXJkLnN0ZXJlbykgeworCQljaDAgPSBzdGFydDsKKwkJY2gxID0gc3RhcnQrd3JpdGVfc3FfYmxvY2tfc2l6ZV9oYWxmOworCQlzaXplID4+PSAxOworCX0gZWxzZSB7CisJCWNoMCA9IHN0YXJ0OworCQljaDEgPSBzdGFydDsKKwl9CisKKwlkaXNhYmxlX2hlYXJ0YmVhdCgpOworCWN1c3RvbS5hdWRbMF0uYXVkdm9sID0gZG1hc291bmQudm9sdW1lX2xlZnQ7CisJY3VzdG9tLmF1ZFsxXS5hdWR2b2wgPSBkbWFzb3VuZC52b2x1bWVfcmlnaHQ7CisJaWYgKGRtYXNvdW5kLmhhcmQuc2l6ZSA9PSA4KSB7CisJCWN1c3RvbS5hdWRbMF0uYXVkbGMgPSAodV9zaG9ydCAqKVpUV09fUEFERFIoY2gwKTsKKwkJY3VzdG9tLmF1ZFswXS5hdWRsZW4gPSBzaXplOworCQljdXN0b20uYXVkWzFdLmF1ZGxjID0gKHVfc2hvcnQgKilaVFdPX1BBRERSKGNoMSk7CisJCWN1c3RvbS5hdWRbMV0uYXVkbGVuID0gc2l6ZTsKKwkJY3VzdG9tLmRtYWNvbiA9IEFNSV9BVURJT184OworCX0gZWxzZSB7CisJCXNpemUgPj49IDE7CisJCWN1c3RvbS5hdWRbMF0uYXVkbGMgPSAodV9zaG9ydCAqKVpUV09fUEFERFIoY2gwKTsKKwkJY3VzdG9tLmF1ZFswXS5hdWRsZW4gPSBzaXplOworCQljdXN0b20uYXVkWzFdLmF1ZGxjID0gKHVfc2hvcnQgKilaVFdPX1BBRERSKGNoMSk7CisJCWN1c3RvbS5hdWRbMV0uYXVkbGVuID0gc2l6ZTsKKwkJaWYgKGRtYXNvdW5kLnZvbHVtZV9sZWZ0ID09IDY0ICYmIGRtYXNvdW5kLnZvbHVtZV9yaWdodCA9PSA2NCkgeworCQkJLyogV2UgY2FuIHBsYXkgcHNldWRvIDE0LWJpdCBvbmx5IHdpdGggdGhlIG1heGltdW0gdm9sdW1lICovCisJCQljaDMgPSBjaDArd3JpdGVfc3FfYmxvY2tfc2l6ZV9xdWFydGVyOworCQkJY2gyID0gY2gxK3dyaXRlX3NxX2Jsb2NrX3NpemVfcXVhcnRlcjsKKwkJCWN1c3RvbS5hdWRbMl0uYXVkdm9sID0gMTsgIC8qIHdlIGFyZSBiZWluZyBhZmZlY3RlZCBieSB0aGUgYmVlcHMgKi8KKwkJCWN1c3RvbS5hdWRbM10uYXVkdm9sID0gMTsgIC8qIHJlc3RvcmluZyB2b2x1bWUgaGVyZSBoZWxwcyBhIGJpdCAqLworCQkJY3VzdG9tLmF1ZFsyXS5hdWRsYyA9ICh1X3Nob3J0ICopWlRXT19QQUREUihjaDIpOworCQkJY3VzdG9tLmF1ZFsyXS5hdWRsZW4gPSBzaXplOworCQkJY3VzdG9tLmF1ZFszXS5hdWRsYyA9ICh1X3Nob3J0ICopWlRXT19QQUREUihjaDMpOworCQkJY3VzdG9tLmF1ZFszXS5hdWRsZW4gPSBzaXplOworCQkJY3VzdG9tLmRtYWNvbiA9IEFNSV9BVURJT18xNDsKKwkJfSBlbHNlIHsKKwkJCWN1c3RvbS5hdWRbMl0uYXVkdm9sID0gMDsKKwkJCWN1c3RvbS5hdWRbM10uYXVkdm9sID0gMDsKKwkJCWN1c3RvbS5kbWFjb24gPSBBTUlfQVVESU9fODsKKwkJfQorCX0KKwl3cml0ZV9zcS5mcm9udCA9ICh3cml0ZV9zcS5mcm9udCsxKSAlIHdyaXRlX3NxLm1heF9jb3VudDsKKwl3cml0ZV9zcS5hY3RpdmUgfD0gQU1JX1BMQVlfTE9BREVEOworfQorCisKK3N0YXRpYyB2b2lkIEFtaVBsYXkodm9pZCkKK3sKKwlpbnQgbWluZnJhbWVzID0gMTsKKworCWN1c3RvbS5pbnRlbmEgPSBJRl9BVUQwOworCisJaWYgKHdyaXRlX3NxLmFjdGl2ZSAmIEFNSV9QTEFZX0xPQURFRCkgeworCQkvKiBUaGVyZSdzIGFscmVhZHkgYSBmcmFtZSBsb2FkZWQgKi8KKwkJY3VzdG9tLmludGVuYSA9IElGX1NFVENMUiB8IElGX0FVRDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAod3JpdGVfc3EuYWN0aXZlICYgQU1JX1BMQVlfUExBWUlORykKKwkJLyogSW5jcmVhc2UgdGhyZXNob2xkOiBmcmFtZSAxIGlzIGFscmVhZHkgYmVpbmcgcGxheWVkICovCisJCW1pbmZyYW1lcyA9IDI7CisKKwlpZiAod3JpdGVfc3EuY291bnQgPCBtaW5mcmFtZXMpIHsKKwkJLyogTm90aGluZyB0byBkbyAqLworCQljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgSUZfQVVEMDsKKwkJcmV0dXJuOworCX0KKworCWlmICh3cml0ZV9zcS5jb3VudCA8PSBtaW5mcmFtZXMgJiYKKwkgICAgd3JpdGVfc3EucmVhcl9zaXplIDwgd3JpdGVfc3EuYmxvY2tfc2l6ZSAmJiAhd3JpdGVfc3Euc3luY2luZykgeworCQkvKiBobW1tLCB0aGUgb25seSBleGlzdGluZyBmcmFtZSBpcyBub3QKKwkJICogeWV0IGZpbGxlZCBhbmQgd2UncmUgbm90IHN5bmNpbmc/CisJCSAqLworCQljdXN0b20uaW50ZW5hID0gSUZfU0VUQ0xSIHwgSUZfQVVEMDsKKwkJcmV0dXJuOworCX0KKworCUFtaVBsYXlOZXh0RnJhbWUobWluZnJhbWVzKTsKKworCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9BVUQwOworfQorCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBBbWlJbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwlpbnQgbWluZnJhbWVzID0gMTsKKworCWN1c3RvbS5pbnRlbmEgPSBJRl9BVUQwOworCisJaWYgKCF3cml0ZV9zcS5hY3RpdmUpIHsKKwkJLyogUGxheWluZyB3YXMgaW50ZXJydXB0ZWQgYW5kIHNxX3Jlc2V0KCkgaGFzIGFscmVhZHkgY2xlYXJlZAorCQkgKiB0aGUgc3EgdmFyaWFibGVzLCBzbyBiZXR0ZXIgZG9uJ3QgZG8gYW55dGhpbmcgaGVyZS4KKwkJICovCisJCVdBS0VfVVAod3JpdGVfc3Euc3luY19xdWV1ZSk7CisJCXJldHVybiBJUlFfSEFORExFRDsKKwl9CisKKwlpZiAod3JpdGVfc3EuYWN0aXZlICYgQU1JX1BMQVlfUExBWUlORykgeworCQkvKiBXZSd2ZSBqdXN0IGZpbmlzaGVkIGEgZnJhbWUgKi8KKwkJd3JpdGVfc3EuY291bnQtLTsKKwkJV0FLRV9VUCh3cml0ZV9zcS5hY3Rpb25fcXVldWUpOworCX0KKworCWlmICh3cml0ZV9zcS5hY3RpdmUgJiBBTUlfUExBWV9MT0FERUQpCisJCS8qIEluY3JlYXNlIHRocmVzaG9sZDogZnJhbWUgMSBpcyBhbHJlYWR5IGJlaW5nIHBsYXllZCAqLworCQltaW5mcmFtZXMgPSAyOworCisJLyogU2hpZnQgdGhlIGZsYWdzICovCisJd3JpdGVfc3EuYWN0aXZlID0gKHdyaXRlX3NxLmFjdGl2ZTw8MSkgJiBBTUlfUExBWV9NQVNLOworCisJaWYgKCF3cml0ZV9zcS5hY3RpdmUpCisJCS8qIE5vIGZyYW1lIGlzIHBsYXlpbmcsIGRpc2FibGUgYXVkaW8gRE1BICovCisJCVN0b3BETUEoKTsKKworCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFIgfCBJRl9BVUQwOworCisJaWYgKHdyaXRlX3NxLmNvdW50ID49IG1pbmZyYW1lcykKKwkJLyogVHJ5IHRvIHBsYXkgdGhlIG5leHQgZnJhbWUgKi8KKwkJQW1pUGxheSgpOworCisJaWYgKCF3cml0ZV9zcS5hY3RpdmUpCisJCS8qIE5vdGhpbmcgdG8gcGxheSBhbnltb3JlLgorCQkgICBXYWtlIHVwIGEgcHJvY2VzcyB3YWl0aW5nIGZvciBhdWRpbyBvdXRwdXQgdG8gZHJhaW4uICovCisJCVdBS0VfVVAod3JpdGVfc3Euc3luY19xdWV1ZSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKioqIE1pZCBsZXZlbCBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoKKyAqIC9kZXYvbWl4ZXIgYWJzdHJhY3Rpb24KKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgQW1pTWl4ZXJJbml0KHZvaWQpCit7CisJZG1hc291bmQudm9sdW1lX2xlZnQgPSA2NDsKKwlkbWFzb3VuZC52b2x1bWVfcmlnaHQgPSA2NDsKKwljdXN0b20uYXVkWzBdLmF1ZHZvbCA9IGRtYXNvdW5kLnZvbHVtZV9sZWZ0OworCWN1c3RvbS5hdWRbM10uYXVkdm9sID0gMTsJLyogRm9yIHBzZXVkbyAxNGJpdCAqLworCWN1c3RvbS5hdWRbMV0uYXVkdm9sID0gZG1hc291bmQudm9sdW1lX3JpZ2h0OworCWN1c3RvbS5hdWRbMl0uYXVkdm9sID0gMTsJLyogRm9yIHBzZXVkbyAxNGJpdCAqLworCWRtYXNvdW5kLnRyZWJsZSA9IDUwOworfQorCitzdGF0aWMgaW50IEFtaU1peGVySW9jdGwodV9pbnQgY21kLCB1X2xvbmcgYXJnKQoreworCWludCBkYXRhOworCXN3aXRjaCAoY21kKSB7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfUkVBRF9ERVZNQVNLOgorCQkgICAgcmV0dXJuIElPQ1RMX09VVChhcmcsIFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19UUkVCTEUpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfUkVDTUFTSzoKKwkJICAgIHJldHVybiBJT0NUTF9PVVQoYXJnLCAwKTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1NURVJFT0RFVlM6CisJCSAgICByZXR1cm4gSU9DVExfT1VUKGFyZywgU09VTkRfTUFTS19WT0xVTUUpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1JFQURfVk9MVU1FOgorCQkgICAgcmV0dXJuIElPQ1RMX09VVChhcmcsCisJCQkgICAgVk9MVU1FX0FNSV9UT19WT1hXQVJFKGRtYXNvdW5kLnZvbHVtZV9sZWZ0KSB8CisJCQkgICAgVk9MVU1FX0FNSV9UT19WT1hXQVJFKGRtYXNvdW5kLnZvbHVtZV9yaWdodCkgPDwgOCk7CisJICAgIGNhc2UgU09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FOgorCQkgICAgSU9DVExfSU4oYXJnLCBkYXRhKTsKKwkJICAgIHJldHVybiBJT0NUTF9PVVQoYXJnLCBkbWFzb3VuZF9zZXRfdm9sdW1lKGRhdGEpKTsKKwkgICAgY2FzZSBTT1VORF9NSVhFUl9SRUFEX1RSRUJMRToKKwkJICAgIHJldHVybiBJT0NUTF9PVVQoYXJnLCBkbWFzb3VuZC50cmVibGUpOworCSAgICBjYXNlIFNPVU5EX01JWEVSX1dSSVRFX1RSRUJMRToKKwkJICAgIElPQ1RMX0lOKGFyZywgZGF0YSk7CisJCSAgICByZXR1cm4gSU9DVExfT1VUKGFyZywgZG1hc291bmRfc2V0X3RyZWJsZShkYXRhKSk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCisKK3N0YXRpYyBpbnQgQW1pV3JpdGVTcVNldHVwKHZvaWQpCit7CisJd3JpdGVfc3FfYmxvY2tfc2l6ZV9oYWxmID0gd3JpdGVfc3EuYmxvY2tfc2l6ZT4+MTsKKwl3cml0ZV9zcV9ibG9ja19zaXplX3F1YXJ0ZXIgPSB3cml0ZV9zcV9ibG9ja19zaXplX2hhbGY+PjE7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBBbWlTdGF0ZUluZm8oY2hhciAqYnVmZmVyLCBzaXplX3Qgc3BhY2UpCit7CisJaW50IGxlbiA9IDA7CisJbGVuICs9IHNwcmludGYoYnVmZmVyK2xlbiwgIlx0c291bmQudm9sdW1lX2xlZnQgPSAlZCBbMC4uLjY0XVxuIiwKKwkJICAgICAgIGRtYXNvdW5kLnZvbHVtZV9sZWZ0KTsKKwlsZW4gKz0gc3ByaW50ZihidWZmZXIrbGVuLCAiXHRzb3VuZC52b2x1bWVfcmlnaHQgPSAlZCBbMC4uLjY0XVxuIiwKKwkJICAgICAgIGRtYXNvdW5kLnZvbHVtZV9yaWdodCk7CisJaWYgKGxlbiA+PSBzcGFjZSkgeworCQlwcmludGsoS0VSTl9FUlIgImRtYXNvdW5kX3BhdWxhOiBvdmVybG93ZWQgc3RhdGUgYnVmZmVyIGFsbG9jLlxuIikgOworCQlsZW4gPSBzcGFjZSA7CisJfQorCXJldHVybiBsZW47Cit9CisKKworLyoqKiBNYWNoaW5lIGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgU0VUVElOR1MgZGVmX2hhcmQgPSB7CisJLmZvcm1hdAk9IEFGTVRfUzgsCisJLnN0ZXJlbwk9IDAsCisJLnNpemUJPSA4LAorCS5zcGVlZAk9IDgwMDAKK30gOworCitzdGF0aWMgU0VUVElOR1MgZGVmX3NvZnQgPSB7CisJLmZvcm1hdAk9IEFGTVRfVTgsCisJLnN0ZXJlbwk9IDAsCisJLnNpemUJPSA4LAorCS5zcGVlZAk9IDgwMDAKK30gOworCitzdGF0aWMgTUFDSElORSBtYWNoQW1pZ2EgPSB7CisJLm5hbWUJCT0gIkFtaWdhIiwKKwkubmFtZTIJCT0gIkFNSUdBIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmRtYV9hbGxvYwk9IEFtaUFsbG9jLAorCS5kbWFfZnJlZQk9IEFtaUZyZWUsCisJLmlycWluaXQJPSBBbWlJcnFJbml0LAorI2lmZGVmIE1PRFVMRQorCS5pcnFjbGVhbnVwCT0gQW1pSXJxQ2xlYW5VcCwKKyNlbmRpZiAvKiBNT0RVTEUgKi8KKwkuaW5pdAkJPSBBbWlJbml0LAorCS5zaWxlbmNlCT0gQW1pU2lsZW5jZSwKKwkuc2V0Rm9ybWF0CT0gQW1pU2V0Rm9ybWF0LAorCS5zZXRWb2x1bWUJPSBBbWlTZXRWb2x1bWUsCisJLnNldFRyZWJsZQk9IEFtaVNldFRyZWJsZSwKKwkucGxheQkJPSBBbWlQbGF5LAorCS5taXhlcl9pbml0CT0gQW1pTWl4ZXJJbml0LAorCS5taXhlcl9pb2N0bAk9IEFtaU1peGVySW9jdGwsCisJLndyaXRlX3NxX3NldHVwCT0gQW1pV3JpdGVTcVNldHVwLAorCS5zdGF0ZV9pbmZvCT0gQW1pU3RhdGVJbmZvLAorCS5taW5fZHNwX3NwZWVkCT0gODAwMCwKKwkudmVyc2lvbgk9ICgoRE1BU09VTkRfUEFVTEFfUkVWSVNJT048PDgpIHwgRE1BU09VTkRfUEFVTEFfRURJVElPTiksCisJLmhhcmR3YXJlX2FmbXRzCT0gKEFGTVRfUzggfCBBRk1UX1MxNl9CRSksIC8qIGgnd2FyZS1zdXBwb3J0ZWQgZm9ybWF0cyAqb25seSogaGVyZSAqLworCS5jYXBhYmlsaXRpZXMJPSBEU1BfQ0FQX0JBVENIICAgICAgICAgIC8qIEFzIHBlciBTTkRDVExfRFNQX0dFVENBUFMgKi8KK307CisKKworLyoqKiBDb25maWcgJiBTZXR1cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ludCBfX2luaXQgZG1hc291bmRfcGF1bGFfaW5pdCh2b2lkKQoreworCWludCBlcnI7CisKKwlpZiAoTUFDSF9JU19BTUlHQSAmJiBBTUlHQUhXX1BSRVNFTlQoQU1JX0FVRElPKSkgeworCSAgICBpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihDVVNUT01fUEhZU0FERFIrMHhhMCwgMHg0MCwKKwkJCQkgICAgImRtYXNvdW5kIFtQYXVsYV0iKSkKKwkJcmV0dXJuIC1FQlVTWTsKKwkgICAgZG1hc291bmQubWFjaCA9IG1hY2hBbWlnYTsKKwkgICAgZG1hc291bmQubWFjaC5kZWZhdWx0X2hhcmQgPSBkZWZfaGFyZCA7CisJICAgIGRtYXNvdW5kLm1hY2guZGVmYXVsdF9zb2Z0ID0gZGVmX3NvZnQgOworCSAgICBlcnIgPSBkbWFzb3VuZF9pbml0KCk7CisJICAgIGlmIChlcnIpCisJCXJlbGVhc2VfbWVtX3JlZ2lvbihDVVNUT01fUEhZU0FERFIrMHhhMCwgMHg0MCk7CisJICAgIHJldHVybiBlcnI7CisJfSBlbHNlCisJICAgIHJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZG1hc291bmRfcGF1bGFfY2xlYW51cCh2b2lkKQoreworCWRtYXNvdW5kX2RlaW5pdCgpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihDVVNUT01fUEhZU0FERFIrMHhhMCwgMHg0MCk7Cit9CisKK21vZHVsZV9pbml0KGRtYXNvdW5kX3BhdWxhX2luaXQpOworbW9kdWxlX2V4aXQoZG1hc291bmRfcGF1bGFfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcTQwLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcTQwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJjMjVhMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9xNDAuYwpAQCAtMCwwICsxLDYzNCBAQAorLyoKKyAqICBsaW51eC9zb3VuZC9vc3MvZG1hc291bmQvZG1hc291bmRfcTQwLmMKKyAqCisgKiAgUTQwIERNQSBTb3VuZCBEcml2ZXIKKyAqCisgKiAgU2VlIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9jb3JlLmMgZm9yIGNvcHlyaWdodCBhbmQgY3JlZGl0cworICogIHByaW9yIHRvIDI4LzAxLzIwMDEKKyAqCisgKiAgMjgvMDEvMjAwMSBbMC4xXSBJYWluIFNhbmRvZQorICoJCSAgICAgLSBhZGRlZCB2ZXJzaW9uaW5nCisgKgkJICAgICAtIHB1dCBpbiBhbmQgcG9wdWxhdGVkIHRoZSBoYXJkd2FyZV9hZm10cyBmaWVsZC4KKyAqICAgICAgICAgICAgIFswLjJdIC0gcHV0IGluIFNORENUTF9EU1BfR0VUQ0FQUyB2YWx1ZS4KKyAqCSAgICAgICBbMC4zXSAtIHB1dCBpbiBkZWZhdWx0IGhhcmQvc29mdCBzZXR0aW5ncy4KKyAqLworCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vcTQwaW50cy5oPgorI2luY2x1ZGUgPGFzbS9xNDBfbWFzdGVyLmg+CisKKyNpbmNsdWRlICJkbWFzb3VuZC5oIgorCisjZGVmaW5lIERNQVNPVU5EX1E0MF9SRVZJU0lPTiAwCisjZGVmaW5lIERNQVNPVU5EX1E0MF9FRElUSU9OIDMKKworc3RhdGljIGludCBleHBhbmRfYmFsOwkvKiBCYWxhbmNlIGZhY3RvciBmb3IgZXhwYW5kaW5nIChub3Qgdm9sdW1lISkgKi8KK3N0YXRpYyBpbnQgZXhwYW5kX2RhdGE7CS8qIERhdGEgZm9yIGV4cGFuZGluZyAqLworCisKKy8qKiogTG93IGxldmVsIHN0dWZmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitzdGF0aWMgdm9pZCAqUTQwQWxsb2ModW5zaWduZWQgaW50IHNpemUsIGludCBmbGFncyk7CitzdGF0aWMgdm9pZCBRNDBGcmVlKHZvaWQgKiwgdW5zaWduZWQgaW50KTsKK3N0YXRpYyBpbnQgUTQwSXJxSW5pdCh2b2lkKTsKKyNpZmRlZiBNT0RVTEUKK3N0YXRpYyB2b2lkIFE0MElycUNsZWFuVXAodm9pZCk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIFE0MFNpbGVuY2Uodm9pZCk7CitzdGF0aWMgdm9pZCBRNDBJbml0KHZvaWQpOworc3RhdGljIGludCBRNDBTZXRGb3JtYXQoaW50IGZvcm1hdCk7CitzdGF0aWMgaW50IFE0MFNldFZvbHVtZShpbnQgdm9sdW1lKTsKK3N0YXRpYyB2b2lkIFE0MFBsYXlOZXh0RnJhbWUoaW50IGluZGV4KTsKK3N0YXRpYyB2b2lkIFE0MFBsYXkodm9pZCk7CitzdGF0aWMgaXJxcmV0dXJuX3QgUTQwU3RlcmVvSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApOworc3RhdGljIGlycXJldHVybl90IFE0ME1vbm9JbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgdm9pZCBRNDBJbnRlcnJ1cHQodm9pZCk7CisKKworLyoqKiBNaWQgbGV2ZWwgc3R1ZmYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKworLyogdXNlckNvdW50LCBmcmFtZVVzZWQsIGZyYW1lTGVmdCA9PSBieXRlIGNvdW50cyAqLworc3RhdGljIHNzaXplX3QgcTQwX2N0X2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJY2hhciAqdGFibGUgPSBkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9PSBBRk1UX01VX0xBVyA/IGRtYXNvdW5kX3VsYXcyZG1hODogZG1hc291bmRfYWxhdzJkbWE4OworCXNzaXplX3QgY291bnQsIHVzZWQ7CisJdV9jaGFyICpwID0gKHVfY2hhciAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisKKwl1c2VkID0gY291bnQgPSBtaW5fdChzaXplX3QsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKKwlpZiAoY29weV9mcm9tX3VzZXIocCx1c2VyUHRyLGNvdW50KSkKKwkgIHJldHVybiAtRUZBVUxUOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJKnAgPSB0YWJsZVsqcF0rMTI4OworCQlwKys7CisJCWNvdW50LS07CisJfQorCSpmcmFtZVVzZWQgKz0gdXNlZCA7CisJcmV0dXJuIHVzZWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgcTQwX2N0X3M4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwl1X2NoYXIgKnAgPSAodV9jaGFyICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKworCXVzZWQgPSBjb3VudCA9IG1pbl90KHNpemVfdCwgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCWlmIChjb3B5X2Zyb21fdXNlcihwLHVzZXJQdHIsY291bnQpKQorCSAgcmV0dXJuIC1FRkFVTFQ7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQkqcCA9ICpwICsgMTI4OworCQlwKys7CisJCWNvdW50LS07CisJfQorCSpmcmFtZVVzZWQgKz0gdXNlZDsKKwlyZXR1cm4gdXNlZDsKK30KKworc3RhdGljIHNzaXplX3QgcTQwX2N0X3U4KGNvbnN0IHVfY2hhciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwl1X2NoYXIgKnAgPSAodV9jaGFyICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKworCXVzZWQgPSBjb3VudCA9IG1pbl90KHNpemVfdCwgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCWlmIChjb3B5X2Zyb21fdXNlcihwLHVzZXJQdHIsY291bnQpKQorCSAgcmV0dXJuIC1FRkFVTFQ7CisJKmZyYW1lVXNlZCArPSB1c2VkOworCXJldHVybiB1c2VkOworfQorCisKKy8qIGEgYml0IHRvbyBjb21wbGljYXRlZCB0byBvcHRpbWlzZSByaWdodCBub3cgLi4qLworc3RhdGljIHNzaXplX3QgcTQwX2N0eF9sYXcoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJdW5zaWduZWQgY2hhciAqdGFibGUgPSAodW5zaWduZWQgY2hhciAqKQorCQkoZG1hc291bmQuc29mdC5mb3JtYXQgPT0gQUZNVF9NVV9MQVcgPyBkbWFzb3VuZF91bGF3MmRtYTg6IGRtYXNvdW5kX2FsYXcyZG1hOCk7CisJdW5zaWduZWQgaW50IGRhdGEgPSBleHBhbmRfZGF0YTsKKwl1X2NoYXIgKnAgPSAodV9jaGFyICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlpbnQgYmFsID0gZXhwYW5kX2JhbDsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdV9jaGFyIGM7CisJCWlmIChiYWwgPCAwKSB7CisJCQlpZiAodXNlckNvdW50ID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSB0YWJsZVtjXTsKKwkJCWRhdGEgKz0gMHg4MDsKKwkJCXVzZXJDb3VudC0tOworCQkJYmFsICs9IGhTcGVlZDsKKwkJfQorCQkqcCsrID0gZGF0YTsKKwkJZnJhbWVMZWZ0LS07CisJCWJhbCAtPSBzU3BlZWQ7CisJfQorCWV4cGFuZF9iYWwgPSBiYWw7CisJZXhwYW5kX2RhdGEgPSBkYXRhOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCk7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gdXRvdGFsOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHE0MF9jdHhfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXVfY2hhciAqcCA9ICh1X2NoYXIgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXVuc2lnbmVkIGludCBkYXRhID0gZXhwYW5kX2RhdGE7CisJaW50IGJhbCA9IGV4cGFuZF9iYWw7CisJaW50IGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJaW50IHV0b3RhbCwgZnRvdGFsOworCisKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdV9jaGFyIGM7CisJCWlmIChiYWwgPCAwKSB7CisJCQlpZiAodXNlckNvdW50ID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSBjIDsKKwkJCWRhdGEgKz0gMHg4MDsKKwkJCXVzZXJDb3VudC0tOworCQkJYmFsICs9IGhTcGVlZDsKKwkJfQorCQkqcCsrID0gZGF0YTsKKwkJZnJhbWVMZWZ0LS07CisJCWJhbCAtPSBzU3BlZWQ7CisJfQorCWV4cGFuZF9iYWwgPSBiYWw7CisJZXhwYW5kX2RhdGEgPSBkYXRhOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCk7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gdXRvdGFsOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHE0MF9jdHhfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXVfY2hhciAqcCA9ICh1X2NoYXIgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXVuc2lnbmVkIGludCBkYXRhID0gZXhwYW5kX2RhdGE7CisJaW50IGJhbCA9IGV4cGFuZF9iYWw7CisJaW50IGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJaW50IHV0b3RhbCwgZnRvdGFsOworCisJZnRvdGFsID0gZnJhbWVMZWZ0OworCXV0b3RhbCA9IHVzZXJDb3VudDsKKwl3aGlsZSAoZnJhbWVMZWZ0KSB7CisJCXVfY2hhciBjOworCQlpZiAoYmFsIDwgMCkgeworCQkJaWYgKHVzZXJDb3VudCA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGdldF91c2VyKGMsIHVzZXJQdHIrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkYXRhID0gYyA7CisJCQl1c2VyQ291bnQtLTsKKwkJCWJhbCArPSBoU3BlZWQ7CisJCX0KKwkJKnArKyA9IGRhdGE7CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCWV4cGFuZF9kYXRhID0gZGF0YTsKKwkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpIDsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiB1dG90YWw7Cit9CisKKy8qIGNvbXByZXNzaW5nIHZlcnNpb25zICovCitzdGF0aWMgc3NpemVfdCBxNDBfY3RjX2xhdyhjb25zdCB1X2NoYXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwl1bnNpZ25lZCBjaGFyICp0YWJsZSA9ICh1bnNpZ25lZCBjaGFyICopCisJCShkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9PSBBRk1UX01VX0xBVyA/IGRtYXNvdW5kX3VsYXcyZG1hODogZG1hc291bmRfYWxhdzJkbWE4KTsKKwl1bnNpZ25lZCBpbnQgZGF0YSA9IGV4cGFuZF9kYXRhOworCXVfY2hhciAqcCA9ICh1X2NoYXIgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCWludCBiYWwgPSBleHBhbmRfYmFsOworCWludCBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCWludCB1dG90YWwsIGZ0b3RhbDsKKyAKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdV9jaGFyIGM7CisJCXdoaWxlKGJhbDwwKSB7CisJCQlpZiAodXNlckNvdW50ID09IDApCisJCQkJZ290byBsb3V0OworCQkJaWYgKCEoYmFsPCgtaFNwZWVkKSkpIHsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgPSAweDgwICsgdGFibGVbY107CisJCQl9CisJCQl1c2VyUHRyKys7CisJCQl1c2VyQ291bnQtLTsKKwkJCWJhbCArPSBoU3BlZWQ7CisJCX0KKwkJKnArKyA9IGRhdGE7CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKyBsb3V0OgorCWV4cGFuZF9iYWwgPSBiYWw7CisJZXhwYW5kX2RhdGEgPSBkYXRhOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCk7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gdXRvdGFsOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHE0MF9jdGNfczgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXVfY2hhciAqcCA9ICh1X2NoYXIgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXVuc2lnbmVkIGludCBkYXRhID0gZXhwYW5kX2RhdGE7CisJaW50IGJhbCA9IGV4cGFuZF9iYWw7CisJaW50IGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJaW50IHV0b3RhbCwgZnRvdGFsOworCisJZnRvdGFsID0gZnJhbWVMZWZ0OworCXV0b3RhbCA9IHVzZXJDb3VudDsKKwl3aGlsZSAoZnJhbWVMZWZ0KSB7CisJCXVfY2hhciBjOworCQl3aGlsZSAoYmFsIDwgMCkgeworCQkJaWYgKHVzZXJDb3VudCA9PSAwKQorCQkJCWdvdG8gbG91dDsKKwkJCWlmICghKGJhbDwoLWhTcGVlZCkpKSB7CisJCQkJaWYgKGdldF91c2VyKGMsIHVzZXJQdHIpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhID0gYyArIDB4ODA7CisJCQl9CisJCQl1c2VyUHRyKys7CisJCQl1c2VyQ291bnQtLTsKKwkJCWJhbCArPSBoU3BlZWQ7CisJCX0KKwkJKnArKyA9IGRhdGE7CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKyBsb3V0OgorCWV4cGFuZF9iYWwgPSBiYWw7CisJZXhwYW5kX2RhdGEgPSBkYXRhOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCk7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gdXRvdGFsOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHE0MF9jdGNfdTgoY29uc3QgdV9jaGFyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXVfY2hhciAqcCA9ICh1X2NoYXIgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXVuc2lnbmVkIGludCBkYXRhID0gZXhwYW5kX2RhdGE7CisJaW50IGJhbCA9IGV4cGFuZF9iYWw7CisJaW50IGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJaW50IHV0b3RhbCwgZnRvdGFsOworCisJZnRvdGFsID0gZnJhbWVMZWZ0OworCXV0b3RhbCA9IHVzZXJDb3VudDsKKwl3aGlsZSAoZnJhbWVMZWZ0KSB7CisJCXVfY2hhciBjOworCQl3aGlsZSAoYmFsIDwgMCkgeworCQkJaWYgKHVzZXJDb3VudCA9PSAwKQorCQkJCWdvdG8gbG91dDsKKwkJCWlmICghKGJhbDwoLWhTcGVlZCkpKSB7CisJCQkJaWYgKGdldF91c2VyKGMsIHVzZXJQdHIpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhID0gYyA7CisJCQl9CisJCQl1c2VyUHRyKys7CisJCQl1c2VyQ291bnQtLTsKKwkJCWJhbCArPSBoU3BlZWQ7CisJCX0KKwkJKnArKyA9IGRhdGE7CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKyBsb3V0OgorCWV4cGFuZF9iYWwgPSBiYWw7CisJZXhwYW5kX2RhdGEgPSBkYXRhOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCkgOworCXV0b3RhbCAtPSB1c2VyQ291bnQ7CisJcmV0dXJuIHV0b3RhbDsKK30KKworCitzdGF0aWMgVFJBTlMgdHJhbnNRNDBOb3JtYWwgPSB7CisJcTQwX2N0X2xhdywgcTQwX2N0X2xhdywgcTQwX2N0X3M4LCBxNDBfY3RfdTgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKK307CisKK3N0YXRpYyBUUkFOUyB0cmFuc1E0MEV4cGFuZGluZyA9IHsKKwlxNDBfY3R4X2xhdywgcTQwX2N0eF9sYXcsIHE0MF9jdHhfczgsIHE0MF9jdHhfdTgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKK307CisKK3N0YXRpYyBUUkFOUyB0cmFuc1E0MENvbXByZXNzaW5nID0geworCXE0MF9jdGNfbGF3LCBxNDBfY3RjX2xhdywgcTQwX2N0Y19zOCwgcTQwX2N0Y191OCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTAorfTsKKworCisvKioqIExvdyBsZXZlbCBzdHVmZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkICpRNDBBbGxvYyh1bnNpZ25lZCBpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworICAgICAgICAgcmV0dXJuIGttYWxsb2Moc2l6ZSwgZmxhZ3MpOyAvKiBjaGFuZ2UgdG8gdm1hbGxvYyAqLworfQorCitzdGF0aWMgdm9pZCBRNDBGcmVlKHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IHNpemUpCit7CisJa2ZyZWUocHRyKTsKK30KKworc3RhdGljIGludCBfX2luaXQgUTQwSXJxSW5pdCh2b2lkKQoreworCS8qIFJlZ2lzdGVyIGludGVycnVwdCBoYW5kbGVyLiAqLworCXJlcXVlc3RfaXJxKFE0MF9JUlFfU0FNUExFLCBRNDBTdGVyZW9JbnRlcnJ1cHQsIDAsCisJCSAgICAiRE1BIHNvdW5kIiwgUTQwSW50ZXJydXB0KTsKKworCXJldHVybigxKTsKK30KKworCisjaWZkZWYgTU9EVUxFCitzdGF0aWMgdm9pZCBRNDBJcnFDbGVhblVwKHZvaWQpCit7CisgICAgICAgIG1hc3Rlcl9vdXRiKDAsU0FNUExFX0VOQUJMRV9SRUcpOworCWZyZWVfaXJxKFE0MF9JUlFfU0FNUExFLCBRNDBJbnRlcnJ1cHQpOworfQorI2VuZGlmIC8qIE1PRFVMRSAqLworCisKK3N0YXRpYyB2b2lkIFE0MFNpbGVuY2Uodm9pZCkKK3sKKyAgICAgICAgbWFzdGVyX291dGIoMCxTQU1QTEVfRU5BQkxFX1JFRyk7CisJKkRBQ19MRUZUPSpEQUNfUklHSFQ9MTI3OworfQorCitzdGF0aWMgY2hhciAqcTQwX3BwOworc3RhdGljIHVuc2lnbmVkIGludCBxNDBfc2M7CisKK3N0YXRpYyB2b2lkIFE0MFBsYXlOZXh0RnJhbWUoaW50IGluZGV4KQoreworCXVfY2hhciAqc3RhcnQ7CisJdV9sb25nIHNpemU7CisJdV9jaGFyIHNwZWVkOworCisJLyogdXNlZCBieSBRNDBQbGF5KCkgaWYgYWxsIGRvdWJ0cyB3aGV0aGVyIHRoZXJlIHJlYWxseSBpcyBzb21ldGhpbmcKKwkgKiB0byBiZSBwbGF5ZWQgYXJlIGFscmVhZHkgd2lwZWQgb3V0LgorCSAqLworCXN0YXJ0ID0gd3JpdGVfc3EuYnVmZmVyc1t3cml0ZV9zcS5mcm9udF07CisJc2l6ZSA9ICh3cml0ZV9zcS5jb3VudCA9PSBpbmRleCA/IHdyaXRlX3NxLnJlYXJfc2l6ZSA6IHdyaXRlX3NxLmJsb2NrX3NpemUpOworCisJcTQwX3BwPXN0YXJ0OworCXE0MF9zYz1zaXplOworCisJd3JpdGVfc3EuZnJvbnQgPSAod3JpdGVfc3EuZnJvbnQrMSkgJSB3cml0ZV9zcS5tYXhfY291bnQ7CisJd3JpdGVfc3EuYWN0aXZlKys7CisKKwlzcGVlZD0oZG1hc291bmQuaGFyZC5zcGVlZD09MTAwMDAgPyAwIDogMSk7CisKKwltYXN0ZXJfb3V0YiggMCxTQU1QTEVfRU5BQkxFX1JFRyk7CisJZnJlZV9pcnEoUTQwX0lSUV9TQU1QTEUsIFE0MEludGVycnVwdCk7CisJaWYgKGRtYXNvdW5kLnNvZnQuc3RlcmVvKQorCSAgCXJlcXVlc3RfaXJxKFE0MF9JUlFfU0FNUExFLCBRNDBTdGVyZW9JbnRlcnJ1cHQsIDAsCisJCSAgICAiUTQwIHNvdW5kIiwgUTQwSW50ZXJydXB0KTsKKwkgIGVsc2UKKwkgICAgICAgIHJlcXVlc3RfaXJxKFE0MF9JUlFfU0FNUExFLCBRNDBNb25vSW50ZXJydXB0LCAwLAorCQkgICAgIlE0MCBzb3VuZCIsIFE0MEludGVycnVwdCk7CisKKwltYXN0ZXJfb3V0Yiggc3BlZWQsIFNBTVBMRV9SQVRFX1JFRyk7CisJbWFzdGVyX291dGIoIDEsU0FNUExFX0NMRUFSX1JFRyk7CisJbWFzdGVyX291dGIoIDEsU0FNUExFX0VOQUJMRV9SRUcpOworfQorCitzdGF0aWMgdm9pZCBRNDBQbGF5KHZvaWQpCit7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAod3JpdGVfc3EuYWN0aXZlIHx8IHdyaXRlX3NxLmNvdW50PD0wICkgeworCQkvKiBUaGVyZSdzIGFscmVhZHkgYSBmcmFtZSBsb2FkZWQgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIG5vdGhpbmcgaW4gdGhlIHF1ZXVlICovCisJaWYgKHdyaXRlX3NxLmNvdW50IDw9IDEgJiYgd3JpdGVfc3EucmVhcl9zaXplIDwgd3JpdGVfc3EuYmxvY2tfc2l6ZSAmJiAhd3JpdGVfc3Euc3luY2luZykgeworCSAgICAgICAgIC8qIGhtbW0sIHRoZSBvbmx5IGV4aXN0aW5nIGZyYW1lIGlzIG5vdAorCQkgICogeWV0IGZpbGxlZCBhbmQgd2UncmUgbm90IHN5bmNpbmc/CisJCSAgKi8KKwkgICAgICAgICByZXR1cm47CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7CisJUTQwUGxheU5leHRGcmFtZSgxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWFzb3VuZC5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBRNDBTdGVyZW9JbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZHVtbXksIHN0cnVjdCBwdF9yZWdzICpmcCkKK3sKKwlzcGluX2xvY2soJmRtYXNvdW5kLmxvY2spOworICAgICAgICBpZiAocTQwX3NjPjEpeworICAgICAgICAgICAgKkRBQ19MRUZUPSpxNDBfcHArKzsKKwkgICAgKkRBQ19SSUdIVD0qcTQwX3BwKys7CisJICAgIHE0MF9zYyAtPTI7CisJICAgIG1hc3Rlcl9vdXRiKDEsU0FNUExFX0NMRUFSX1JFRyk7CisJfWVsc2UgUTQwSW50ZXJydXB0KCk7CisJc3Bpbl91bmxvY2soJmRtYXNvdW5kLmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KK3N0YXRpYyBpcnFyZXR1cm5fdCBRNDBNb25vSW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmR1bW15LCBzdHJ1Y3QgcHRfcmVncyAqZnApCit7CisJc3Bpbl9sb2NrKCZkbWFzb3VuZC5sb2NrKTsKKyAgICAgICAgaWYgKHE0MF9zYz4wKXsKKyAgICAgICAgICAgICpEQUNfTEVGVD0qcTQwX3BwOworCSAgICAqREFDX1JJR0hUPSpxNDBfcHArKzsKKwkgICAgcTQwX3NjIC0tOworCSAgICBtYXN0ZXJfb3V0YigxLFNBTVBMRV9DTEVBUl9SRUcpOworCX1lbHNlIFE0MEludGVycnVwdCgpOworCXNwaW5fdW5sb2NrKCZkbWFzb3VuZC5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CitzdGF0aWMgdm9pZCBRNDBJbnRlcnJ1cHQodm9pZCkKK3sKKwlpZiAoIXdyaXRlX3NxLmFjdGl2ZSkgeworCSAgICAgICAgICAvKiBwbGF5aW5nIHdhcyBpbnRlcnJ1cHRlZCBhbmQgc3FfcmVzZXQoKSBoYXMgYWxyZWFkeSBjbGVhcmVkCisJCSAgICogdGhlIHNxIHZhcmlhYmxlcywgc28gYmV0dGVyIGRvbid0IGRvIGFueXRoaW5nIGhlcmUuCisJCSAgICovCisJICAgICAgICAgICBXQUtFX1VQKHdyaXRlX3NxLnN5bmNfcXVldWUpOworCQkgICBtYXN0ZXJfb3V0YigwLFNBTVBMRV9FTkFCTEVfUkVHKTsgLyogYmV0dGVyIHNhZmUgKi8KKwkJICAgZ290byBleGl0OworCX0gZWxzZSB3cml0ZV9zcS5hY3RpdmU9MDsKKwl3cml0ZV9zcS5jb3VudC0tOworCVE0MFBsYXkoKTsKKworCWlmIChxNDBfc2M8MikKKwkgICAgICB7IC8qIHRoZXJlIHdhcyBub3RoaW5nIHRvIHBsYXksIGRpc2FibGUgaXJxICovCisJCW1hc3Rlcl9vdXRiKDAsU0FNUExFX0VOQUJMRV9SRUcpOworCQkqREFDX0xFRlQ9KkRBQ19SSUdIVD0xMjc7CisJICAgICAgfQorCVdBS0VfVVAod3JpdGVfc3EuYWN0aW9uX3F1ZXVlKTsKKworIGV4aXQ6CisJbWFzdGVyX291dGIoMSxTQU1QTEVfQ0xFQVJfUkVHKTsKK30KKworCitzdGF0aWMgdm9pZCBRNDBJbml0KHZvaWQpCit7CisJaW50IGksIGlkeDsKKwljb25zdCBpbnQgZnJlcVtdID0gezEwMDAwLCAyMDAwMH07CisKKwkvKiBzZWFyY2ggYSBmcmVxdWVuY3kgdGhhdCBmaXRzIGludG8gdGhlIGFsbG93ZWQgZXJyb3IgcmFuZ2UgKi8KKworCWlkeCA9IC0xOworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWlmICgoMTAwICogYWJzKGRtYXNvdW5kLnNvZnQuc3BlZWQgLSBmcmVxW2ldKSAvIGZyZXFbaV0pIDw9IGNhdGNoUmFkaXVzKQorCQkJaWR4ID0gaTsKKworCWRtYXNvdW5kLmhhcmQgPSBkbWFzb3VuZC5zb2Z0OworCS8qc291bmQuaGFyZC5zdGVyZW89MTsqLyAvKiBubyBsb25nZXIgdHJ1ZSAqLworCWRtYXNvdW5kLmhhcmQuc2l6ZT04OworCisJaWYgKGlkeCA+IC0xKSB7CisJCWRtYXNvdW5kLnNvZnQuc3BlZWQgPSBmcmVxW2lkeF07CisJCWRtYXNvdW5kLnRyYW5zX3dyaXRlID0gJnRyYW5zUTQwTm9ybWFsOworCX0gZWxzZQorCQlkbWFzb3VuZC50cmFuc193cml0ZSA9ICZ0cmFuc1E0MEV4cGFuZGluZzsKKworCVE0MFNpbGVuY2UoKTsKKworCWlmIChkbWFzb3VuZC5oYXJkLnNwZWVkID4gMjAyMDApIHsKKwkJLyogc3F1ZWV6ZSB0aGUgc291bmQsIHdlIGRvIHRoYXQgKi8KKwkJZG1hc291bmQuaGFyZC5zcGVlZCA9IDIwMDAwOworCQlkbWFzb3VuZC50cmFuc193cml0ZSA9ICZ0cmFuc1E0MENvbXByZXNzaW5nOworCX0gZWxzZSBpZiAoZG1hc291bmQuaGFyZC5zcGVlZCA+IDEwMDAwKSB7CisJCWRtYXNvdW5kLmhhcmQuc3BlZWQgPSAyMDAwMDsKKwl9IGVsc2UgeworCQlkbWFzb3VuZC5oYXJkLnNwZWVkID0gMTAwMDA7CisJfQorCWV4cGFuZF9iYWwgPSAtZG1hc291bmQuc29mdC5zcGVlZDsKK30KKworCitzdGF0aWMgaW50IFE0MFNldEZvcm1hdChpbnQgZm9ybWF0KQoreworCS8qIFE0MCBzb3VuZCBzdXBwb3J0cyBvbmx5IDhiaXQgbW9kZXMgKi8KKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBBRk1UX1FVRVJZOgorCQlyZXR1cm4oZG1hc291bmQuc29mdC5mb3JtYXQpOworCWNhc2UgQUZNVF9NVV9MQVc6CisJY2FzZSBBRk1UX0FfTEFXOgorCWNhc2UgQUZNVF9TODoKKwljYXNlIEFGTVRfVTg6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZvcm1hdCA9IEFGTVRfUzg7CisJfQorCisJZG1hc291bmQuc29mdC5mb3JtYXQgPSBmb3JtYXQ7CisJZG1hc291bmQuc29mdC5zaXplID0gODsKKwlpZiAoZG1hc291bmQubWluRGV2ID09IFNORF9ERVZfRFNQKSB7CisJCWRtYXNvdW5kLmRzcC5mb3JtYXQgPSBmb3JtYXQ7CisJCWRtYXNvdW5kLmRzcC5zaXplID0gODsKKwl9CisJUTQwSW5pdCgpOworCisJcmV0dXJuKGZvcm1hdCk7Cit9CisKK3N0YXRpYyBpbnQgUTQwU2V0Vm9sdW1lKGludCB2b2x1bWUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKiBNYWNoaW5lIGRlZmluaXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgU0VUVElOR1MgZGVmX2hhcmQgPSB7CisJLmZvcm1hdAk9IEFGTVRfVTgsCisJLnN0ZXJlbwk9IDAsCisJLnNpemUJPSA4LAorCS5zcGVlZAk9IDEwMDAwCit9IDsKKworc3RhdGljIFNFVFRJTkdTIGRlZl9zb2Z0ID0geworCS5mb3JtYXQJPSBBRk1UX1U4LAorCS5zdGVyZW8JPSAwLAorCS5zaXplCT0gOCwKKwkuc3BlZWQJPSA4MDAwCit9IDsKKworc3RhdGljIE1BQ0hJTkUgbWFjaFE0MCA9IHsKKwkubmFtZQkJPSAiUTQwIiwKKwkubmFtZTIJCT0gIlE0MCIsCisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5kbWFfYWxsb2MJPSBRNDBBbGxvYywKKwkuZG1hX2ZyZWUJPSBRNDBGcmVlLAorCS5pcnFpbml0CT0gUTQwSXJxSW5pdCwKKyNpZmRlZiBNT0RVTEUKKwkuaXJxY2xlYW51cAk9IFE0MElycUNsZWFuVXAsCisjZW5kaWYgLyogTU9EVUxFICovCisJLmluaXQJCT0gUTQwSW5pdCwKKwkuc2lsZW5jZQk9IFE0MFNpbGVuY2UsCisJLnNldEZvcm1hdAk9IFE0MFNldEZvcm1hdCwKKwkuc2V0Vm9sdW1lCT0gUTQwU2V0Vm9sdW1lLAorCS5wbGF5CQk9IFE0MFBsYXksCisgCS5taW5fZHNwX3NwZWVkCT0gMTAwMDAsCisJLnZlcnNpb24JPSAoKERNQVNPVU5EX1E0MF9SRVZJU0lPTjw8OCkgfCBETUFTT1VORF9RNDBfRURJVElPTiksCisJLmhhcmR3YXJlX2FmbXRzCT0gQUZNVF9VOCwgLyogaCd3YXJlLXN1cHBvcnRlZCBmb3JtYXRzICpvbmx5KiBoZXJlICovCisJLmNhcGFiaWxpdGllcwk9IERTUF9DQVBfQkFUQ0ggIC8qIEFzIHBlciBTTkRDVExfRFNQX0dFVENBUFMgKi8KK307CisKKworLyoqKiBDb25maWcgJiBTZXR1cCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKK2ludCBfX2luaXQgZG1hc291bmRfcTQwX2luaXQodm9pZCkKK3sKKwlpZiAoTUFDSF9JU19RNDApIHsKKwkgICAgZG1hc291bmQubWFjaCA9IG1hY2hRNDA7CisJICAgIGRtYXNvdW5kLm1hY2guZGVmYXVsdF9oYXJkID0gZGVmX2hhcmQgOworCSAgICBkbWFzb3VuZC5tYWNoLmRlZmF1bHRfc29mdCA9IGRlZl9zb2Z0IDsKKwkgICAgcmV0dXJuIGRtYXNvdW5kX2luaXQoKTsKKwl9IGVsc2UKKwkgICAgcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBkbWFzb3VuZF9xNDBfY2xlYW51cCh2b2lkKQoreworCWRtYXNvdW5kX2RlaW5pdCgpOworfQorCittb2R1bGVfaW5pdChkbWFzb3VuZF9xNDBfaW5pdCk7Cittb2R1bGVfZXhpdChkbWFzb3VuZF9xNDBfY2xlYW51cCk7CisKK01PRFVMRV9ERVNDUklQVElPTigiUTQwL1E2MCBzb3VuZCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDAxYy5jIGIvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIyN2M5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDAxYy5jCkBAIC0wLDAgKzEsODUwIEBACisvKgorICogRHJpdmVyIGZvciB0aGUgaTJjL2kycyBiYXNlZCBUQTMwMDQgc291bmQgY2hpcCB1c2VkCisgKiBvbiBzb21lIEFwcGxlIGhhcmR3YXJlLiBBbHNvIGtub3duIGFzICJzbmFwcGVyIi4KKyAqCisgKiBUb2JpYXMgU2FyZ2VhbnQgPHRvYmlhcy5zYXJnZWFudEBiaWdwb25kLmNvbT4KKyAqIEJhc2VkIHVwb24sIHRhczMwMDFjLmMgYnkgQ2hyaXN0b3BoZXIgQy4gQ2hpbWVsaXMgPGNocmlzQGRlYmlhbi5vcmc+OgorICoKKyAqICAgVE9ETzoKKyAqICAgLS0tLS0KKyAqICAgKiBFbmFibGUgY29udHJvbCBvdmVyIGlucHV0IGxpbmUgMiAoaXMgdGhpcyBjb25uZWN0ZWQ/KQorICogICAqIEltcGxlbWVudCBzbGVlcCBzdXBwb3J0IChhdCBsZWFzdCBtdXRlIGV2ZXJ5dGhpbmcgYW5kCisgKiAgICogc2V0IGdhaW5zIHRvIG1pbmltdW0gZHVyaW5nIHNsZWVwKQorICogICAqIExvb2sgaW50byBzb21lIG9mIERhcndpbidzIHR3ZWFrcyByZWdhcmRpbmcgdGhlIG11dGUKKyAqICAgKiBsaW5lcyAoZGVsYXlzICYgZGlmZmVyZW50IGJlaGF2aW91ciBvbiBzb21lIEhXKQorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9lcnJuby5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wcm9tLmg+CisKKyNpbmNsdWRlICJkbWFzb3VuZC5oIgorI2luY2x1ZGUgInRhc19jb21tb24uaCIKKyNpbmNsdWRlICJ0YXMzMDAxYy5oIgorCisjaW5jbHVkZSAidGFzX2lvY3RsLmgiCisKKyNkZWZpbmUgVEFTMzAwMUNfQklRVUFEX0ZJTFRFUl9DT1VOVCAgNgorI2RlZmluZSBUQVMzMDAxQ19CSVFVQURfQ0hBTk5FTF9DT1VOVCAyCisKKyNkZWZpbmUgVk9MX0RFRkFVTFQJKDEwMCAqIDQgLyA1KQorI2RlZmluZSBJTlBVVF9ERUZBVUxUCSgxMDAgKiA0IC8gNSkKKyNkZWZpbmUgQkFTU19ERUZBVUxUCSgxMDAgLyAyKQorI2RlZmluZSBUUkVCTEVfREVGQVVMVAkoMTAwIC8gMikKKworc3RydWN0IHRhczMwMDFjX2RhdGFfdCB7CisJc3RydWN0IHRhc19kYXRhX3Qgc3VwZXI7CisJaW50IGRldmljZV9pZDsKKwlpbnQgb3V0cHV0X2lkOworCWludCBzcGVha2VyX2lkOworCXN0cnVjdCB0YXNfZHJjZV90IGRyY2Vfc3RhdGU7Cit9OworCisKK3N0YXRpYyBjb25zdCB1bmlvbiB0YXNfYmlxdWFkX3QKK3RhczMwMDFjX2VxX3VuaXR5PXsKKwkuYnVmID0geyAweDEwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAgfQorfTsKKworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZGJfdG9fcmVndmFsKHNob3J0IGRiKSB7CisJaW50IHI9MDsKKworCXI9KGRiKzB4NTlhMCkgLyAweDYwOworCisJaWYgKHIgPCAweDkxKSByZXR1cm4gMHg5MTsKKwlpZiAociA+IDB4ZWYpIHJldHVybiAweGVmOworCXJldHVybiByOworfQorCitzdGF0aWMgaW5saW5lIHNob3J0IHF1YW50aXplX2RiKHNob3J0IGRiKSB7CisJcmV0dXJuIGRiX3RvX3JlZ3ZhbChkYikgKiAweDYwIC0gMHg1OWEwOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50CityZWdpc3Rlcl93aWR0aChlbnVtIHRhczMwMDFjX3JlZ190IHIpCit7CisJc3dpdGNoKHIpIHsKKwljYXNlIFRBUzMwMDFDX1JFR19NQ1I6CisgCWNhc2UgVEFTMzAwMUNfUkVHX1RSRUJMRToKKwljYXNlIFRBUzMwMDFDX1JFR19CQVNTOgorCQlyZXR1cm4gMTsKKworCWNhc2UgVEFTMzAwMUNfUkVHX0RSQzoKKwkJcmV0dXJuIDI7CisKKwljYXNlIFRBUzMwMDFDX1JFR19NSVhFUjE6CisJY2FzZSBUQVMzMDAxQ19SRUdfTUlYRVIyOgorCQlyZXR1cm4gMzsKKworCWNhc2UgVEFTMzAwMUNfUkVHX1ZPTFVNRToKKwkJcmV0dXJuIDY7CisKKwljYXNlIFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDA6CisJY2FzZSBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQxOgorCWNhc2UgVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMjoKKwljYXNlIFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDM6CisJY2FzZSBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQ0OgorCWNhc2UgVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFENToKKwljYXNlIFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDY6CisKKwljYXNlIFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQwOgorCWNhc2UgVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDE6CisJY2FzZSBUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMjoKKwljYXNlIFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQzOgorCWNhc2UgVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDQ6CisJY2FzZSBUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFENToKKwljYXNlIFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQ2OgorCQlyZXR1cm4gMTU7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX3dyaXRlX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQkJCWVudW0gdGFzMzAwMWNfcmVnX3QgcmVnX251bSwKKwkJCQljaGFyICpkYXRhLAorCQkJCXVpbnQgd3JpdGVfbW9kZSkKK3sKKwlpZiAocmVnX251bT09VEFTMzAwMUNfUkVHX01DUiB8fAorCSAgICByZWdfbnVtPT1UQVMzMDAxQ19SRUdfQkFTUyB8fAorCSAgICByZWdfbnVtPT1UQVMzMDAxQ19SRUdfVFJFQkxFKSB7CisJCXJldHVybiB0YXNfd3JpdGVfYnl0ZV9yZWdpc3Rlcigmc2VsZi0+c3VwZXIsCisJCQkJCSAgICAgICAodWludClyZWdfbnVtLAorCQkJCQkgICAgICAgKmRhdGEsCisJCQkJCSAgICAgICB3cml0ZV9tb2RlKTsKKwl9IGVsc2UgeworCQlyZXR1cm4gdGFzX3dyaXRlX3JlZ2lzdGVyKCZzZWxmLT5zdXBlciwKKwkJCQkJICAodWludClyZWdfbnVtLAorCQkJCQkgIHJlZ2lzdGVyX3dpZHRoKHJlZ19udW0pLAorCQkJCQkgIGRhdGEsCisJCQkJCSAgd3JpdGVfbW9kZSk7CisJfQorfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQkJZW51bSB0YXMzMDAxY19yZWdfdCByZWdfbnVtKQoreworCWlmIChyZWdfbnVtPT1UQVMzMDAxQ19SRUdfTUNSIHx8CisJICAgIHJlZ19udW09PVRBUzMwMDFDX1JFR19CQVNTIHx8CisJICAgIHJlZ19udW09PVRBUzMwMDFDX1JFR19UUkVCTEUpIHsKKwkJcmV0dXJuIHRhc19zeW5jX2J5dGVfcmVnaXN0ZXIoJnNlbGYtPnN1cGVyLAorCQkJCQkgICAgICAodWludClyZWdfbnVtLAorCQkJCQkgICAgICByZWdpc3Rlcl93aWR0aChyZWdfbnVtKSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRhc19zeW5jX3JlZ2lzdGVyKCZzZWxmLT5zdXBlciwKKwkJCQkJICh1aW50KXJlZ19udW0sCisJCQkJCSByZWdpc3Rlcl93aWR0aChyZWdfbnVtKSk7CisJfQorfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY19yZWFkX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQkJZW51bSB0YXMzMDAxY19yZWdfdCByZWdfbnVtLAorCQkJY2hhciAqZGF0YSwKKwkJCXVpbnQgd3JpdGVfbW9kZSkKK3sKKwlyZXR1cm4gdGFzX3JlYWRfcmVnaXN0ZXIoJnNlbGYtPnN1cGVyLAorCQkJCSAodWludClyZWdfbnVtLAorCQkJCSByZWdpc3Rlcl93aWR0aChyZWdfbnVtKSwKKwkJCQkgZGF0YSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0YXMzMDAxY19mYXN0X2xvYWQoc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZiwgaW50IGZhc3QpCit7CisJaWYgKGZhc3QpCisJCXNlbGYtPnN1cGVyLnNoYWRvd1tUQVMzMDAxQ19SRUdfTUNSXVswXSB8PSAweDgwOworCWVsc2UKKwkJc2VsZi0+c3VwZXIuc2hhZG93W1RBUzMwMDFDX1JFR19NQ1JdWzBdICY9IDB4N2Y7CisJcmV0dXJuIHRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTUNSKTsKK30KKworc3RhdGljIHVpbnQKK3RhczMwMDFjX3N1cHBvcnRlZF9taXhlcnMoc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZikKK3sKKwlyZXR1cm4gU09VTkRfTUFTS19WT0xVTUUgfAorCQlTT1VORF9NQVNLX1BDTSB8CisJCVNPVU5EX01BU0tfQUxUUENNIHwKKwkJU09VTkRfTUFTS19UUkVCTEUgfAorCQlTT1VORF9NQVNLX0JBU1M7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX21peGVyX2lzX3N0ZXJlbyhzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLGludCBtaXhlcikKK3sKKwlzd2l0Y2gobWl4ZXIpIHsKKwljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwkJcmV0dXJuIDE7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgdWludAordGFzMzAwMWNfc3RlcmVvX21peGVycyhzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmKQoreworCXVpbnQgcj10YXMzMDAxY19zdXBwb3J0ZWRfbWl4ZXJzKHNlbGYpOworCXVpbnQgaTsKKwkKKwlmb3IgKGk9MTsgaTxTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJaWYgKHImKDE8PGkpICYmICF0YXMzMDAxY19taXhlcl9pc19zdGVyZW8oc2VsZixpKSkKKwkJCXIgJj0gfigxPDxpKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfZ2V0X21peGVyX2xldmVsKHN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsaW50IG1peGVyLHVpbnQgKmxldmVsKQoreworCWlmICghc2VsZikKKwkJcmV0dXJuIC0xOworCQkKKwkqbGV2ZWw9c2VsZi0+c3VwZXIubWl4ZXJbbWl4ZXJdOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY19zZXRfbWl4ZXJfbGV2ZWwoc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZixpbnQgbWl4ZXIsdWludCBsZXZlbCkKK3sKKwlpbnQgcmM7CisJdGFzX3NoYWRvd190ICpzaGFkb3c7CisKKwl1aW50IHRlbXA7CisJdWludCBvZmZzZXQ9MDsKKworCWlmICghc2VsZikKKwkJcmV0dXJuIC0xOworCQkKKwlzaGFkb3c9c2VsZi0+c3VwZXIuc2hhZG93OworCisJaWYgKCF0YXMzMDAxY19taXhlcl9pc19zdGVyZW8oc2VsZixtaXhlcikpCisJCWxldmVsID0gdGFzX21vbm9fdG9fc3RlcmVvKGxldmVsKTsKKworCXN3aXRjaChtaXhlcikgeworCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQl0ZW1wID0gdGFzMzAwMWNfZ2Fpbi5tYXN0ZXJbbGV2ZWwmMHhmZl07CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfVk9MVU1FXVswXSA9ICh0ZW1wID4+IDE2KSAmIDB4ZmY7CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfVk9MVU1FXVsxXSA9ICh0ZW1wID4+IDgpICAmIDB4ZmY7CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfVk9MVU1FXVsyXSA9ICh0ZW1wID4+IDApICAmIDB4ZmY7CisJCXRlbXAgPSB0YXMzMDAxY19nYWluLm1hc3RlclsobGV2ZWw+PjgpJjB4ZmZdOworCQlzaGFkb3dbVEFTMzAwMUNfUkVHX1ZPTFVNRV1bM10gPSAodGVtcCA+PiAxNikgJiAweGZmOworCQlzaGFkb3dbVEFTMzAwMUNfUkVHX1ZPTFVNRV1bNF0gPSAodGVtcCA+PiA4KSAgJiAweGZmOworCQlzaGFkb3dbVEFTMzAwMUNfUkVHX1ZPTFVNRV1bNV0gPSAodGVtcCA+PiAwKSAgJiAweGZmOworCQlyYyA9IHRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfVk9MVU1FKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9BTFRQQ006CisJCS8qIHRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLCAxKTsgKi8KKwkJbGV2ZWwgPSB0YXNfbW9ub190b19zdGVyZW8obGV2ZWwpOworCQl0ZW1wID0gdGFzMzAwMWNfZ2Fpbi5taXhlcltsZXZlbCYweGZmXTsKKwkJc2hhZG93W1RBUzMwMDFDX1JFR19NSVhFUjJdW29mZnNldCswXSA9ICh0ZW1wID4+IDE2KSAmIDB4ZmY7CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfTUlYRVIyXVtvZmZzZXQrMV0gPSAodGVtcCA+PiA4KSAgJiAweGZmOworCQlzaGFkb3dbVEFTMzAwMUNfUkVHX01JWEVSMl1bb2Zmc2V0KzJdID0gKHRlbXAgPj4gMCkgICYgMHhmZjsKKwkJcmMgPSB0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX01JWEVSMik7CisJCS8qIHRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLCAwKTsgKi8KKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9QQ006CisJCS8qIHRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLCAxKTsgKi8KKwkJbGV2ZWwgPSB0YXNfbW9ub190b19zdGVyZW8obGV2ZWwpOworCQl0ZW1wID0gdGFzMzAwMWNfZ2Fpbi5taXhlcltsZXZlbCYweGZmXTsKKwkJc2hhZG93W1RBUzMwMDFDX1JFR19NSVhFUjFdW29mZnNldCswXSA9ICh0ZW1wID4+IDE2KSAmIDB4ZmY7CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfTUlYRVIxXVtvZmZzZXQrMV0gPSAodGVtcCA+PiA4KSAgJiAweGZmOworCQlzaGFkb3dbVEFTMzAwMUNfUkVHX01JWEVSMV1bb2Zmc2V0KzJdID0gKHRlbXAgPj4gMCkgICYgMHhmZjsKKwkJcmMgPSB0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX01JWEVSMSk7CisJCS8qIHRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLCAwKTsgKi8KKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9UUkVCTEU6CisJCXRlbXAgPSB0YXMzMDAxY19nYWluLnRyZWJsZVtsZXZlbCYweGZmXTsKKwkJc2hhZG93W1RBUzMwMDFDX1JFR19UUkVCTEVdWzBdPXRlbXAmMHhmZjsKKwkJcmMgPSB0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1RSRUJMRSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfQkFTUzoKKwkJdGVtcCA9IHRhczMwMDFjX2dhaW4uYmFzc1tsZXZlbCYweGZmXTsKKwkJc2hhZG93W1RBUzMwMDFDX1JFR19CQVNTXVswXT10ZW1wJjB4ZmY7CisJCXJjID0gdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19CQVNTKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSAtMTsKKwkJYnJlYWs7CisJfQorCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKwlzZWxmLT5zdXBlci5taXhlclttaXhlcl09bGV2ZWw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX2xlYXZlX3NsZWVwKHN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYpCit7CisJdW5zaWduZWQgY2hhciBtY3IgPSAoMTw8NikrKDI8PDQpKygyPDwyKTsKKworCWlmICghc2VsZikKKwkJcmV0dXJuIC0xOworCisJLyogTWFrZSBzdXJlIHNvbWV0aGluZyBhbnN3ZXJzIG9uIHRoZSBpMmMgYnVzICovCisJaWYgKHRhczMwMDFjX3dyaXRlX3JlZ2lzdGVyKHNlbGYsIFRBUzMwMDFDX1JFR19NQ1IsICZtY3IsCisJICAgIFdSSVRFX05PUk1BTHxGT1JDRV9XUklURSkgPCAwKQorCSAgICAJcmV0dXJuIC0xOworCisJdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsIDEpOworCisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQwKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDEpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMik7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQzKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDQpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFENSk7CisKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMCk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDEpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQyKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMyk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDQpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQ1KTsKKworCXRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLCAwKTsKKworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfQkFTUyk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19UUkVCTEUpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTUlYRVIxKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX01JWEVSMik7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19WT0xVTUUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX2VudGVyX3NsZWVwKHN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYpCit7CisJLyogU3R1YiBmb3Igbm93LCBidXQgSSBoYXZlIHRoZSBkZXRhaWxzIG9uIGxvdy1wb3dlciBtb2RlICovCisJaWYgKCFzZWxmKQorCQlyZXR1cm4gLTE7IAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY19zeW5jX2JpcXVhZCgJc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZiwKKwkJCXVfaW50IGNoYW5uZWwsCisJCQl1X2ludCBmaWx0ZXIpCit7CisJZW51bSB0YXMzMDAxY19yZWdfdCByZWc7CisKKwlpZiAoY2hhbm5lbCA+PSBUQVMzMDAxQ19CSVFVQURfQ0hBTk5FTF9DT1VOVCB8fAorCSAgICBmaWx0ZXIgID49IFRBUzMwMDFDX0JJUVVBRF9GSUxURVJfQ09VTlQpIHJldHVybiAtRUlOVkFMOworCisJcmVnPSggY2hhbm5lbCA/IFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQwIDogVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMCApICsgZmlsdGVyOworCisJcmV0dXJuIHRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixyZWcpOworfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY193cml0ZV9iaXF1YWRfc2hhZG93KAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQkJCXVfaW50IGNoYW5uZWwsCisJCQkJdV9pbnQgZmlsdGVyLAorCQkJCWNvbnN0IHVuaW9uIHRhc19iaXF1YWRfdCAqYmlxdWFkKQoreworCXRhc19zaGFkb3dfdCAqc2hhZG93PXNlbGYtPnN1cGVyLnNoYWRvdzsKKwllbnVtIHRhczMwMDFjX3JlZ190IHJlZzsKKworCWlmIChjaGFubmVsID49IFRBUzMwMDFDX0JJUVVBRF9DSEFOTkVMX0NPVU5UIHx8CisJICAgIGZpbHRlciAgPj0gVEFTMzAwMUNfQklRVUFEX0ZJTFRFUl9DT1VOVCkgcmV0dXJuIC1FSU5WQUw7CisKKwlyZWc9KCBjaGFubmVsID8gVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDAgOiBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQwICkgKyBmaWx0ZXI7CisKKwlTRVRfNF8yMChzaGFkb3dbcmVnXSwgMCxiaXF1YWQtPmNvZWZmLmIwKTsKKwlTRVRfNF8yMChzaGFkb3dbcmVnXSwgMyxiaXF1YWQtPmNvZWZmLmIxKTsKKwlTRVRfNF8yMChzaGFkb3dbcmVnXSwgNixiaXF1YWQtPmNvZWZmLmIyKTsKKwlTRVRfNF8yMChzaGFkb3dbcmVnXSwgOSxiaXF1YWQtPmNvZWZmLmExKTsKKwlTRVRfNF8yMChzaGFkb3dbcmVnXSwxMixiaXF1YWQtPmNvZWZmLmEyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY193cml0ZV9iaXF1YWQoCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsCisJCQl1X2ludCBjaGFubmVsLAorCQkJdV9pbnQgZmlsdGVyLAorCQkJY29uc3QgdW5pb24gdGFzX2JpcXVhZF90ICpiaXF1YWQpCit7CisJaW50IHJjOworCisJcmM9dGFzMzAwMWNfd3JpdGVfYmlxdWFkX3NoYWRvdyhzZWxmLCBjaGFubmVsLCBmaWx0ZXIsIGJpcXVhZCk7CisJaWYgKHJjIDwgMCkgcmV0dXJuIHJjOworCisJcmV0dXJuIHRhczMwMDFjX3N5bmNfYmlxdWFkKHNlbGYsIGNoYW5uZWwsIGZpbHRlcik7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX3dyaXRlX2JpcXVhZF9saXN0KAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQkJCXVfaW50IGZpbHRlcl9jb3VudCwKKwkJCQl1X2ludCBmbGFncywKKwkJCQlzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgKmJpcXVhZHMpCit7CisJaW50IGk7CisJaW50IHJjOworCisJaWYgKGZsYWdzICYgVEFTX0JJUVVBRF9GQVNUX0xPQUQpIHRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLDEpOworCisJZm9yIChpPTA7IGk8ZmlsdGVyX2NvdW50OyBpKyspIHsKKwkJcmM9dGFzMzAwMWNfd3JpdGVfYmlxdWFkKHNlbGYsCisJCQkJCSBiaXF1YWRzW2ldLmNoYW5uZWwsCisJCQkJCSBiaXF1YWRzW2ldLmZpbHRlciwKKwkJCQkJICZiaXF1YWRzW2ldLmRhdGEpOworCQlpZiAocmMgPCAwKSBicmVhazsKKwl9CisKKwlpZiAoZmxhZ3MgJiBUQVNfQklRVUFEX0ZBU1RfTE9BRCkgeworCQl0YXMzMDAxY19mYXN0X2xvYWQoc2VsZiwwKTsKKworCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0JBU1MpOworCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1RSRUJMRSk7CisJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTUlYRVIxKTsKKwkJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19NSVhFUjIpOworCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1ZPTFVNRSk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY19yZWFkX2JpcXVhZCgJc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZiwKKwkJCXVfaW50IGNoYW5uZWwsCisJCQl1X2ludCBmaWx0ZXIsCisJCQl1bmlvbiB0YXNfYmlxdWFkX3QgKmJpcXVhZCkKK3sKKwl0YXNfc2hhZG93X3QgKnNoYWRvdz1zZWxmLT5zdXBlci5zaGFkb3c7CisJZW51bSB0YXMzMDAxY19yZWdfdCByZWc7CisKKwlpZiAoY2hhbm5lbCA+PSBUQVMzMDAxQ19CSVFVQURfQ0hBTk5FTF9DT1VOVCB8fAorCSAgICBmaWx0ZXIgID49IFRBUzMwMDFDX0JJUVVBRF9GSUxURVJfQ09VTlQpIHJldHVybiAtRUlOVkFMOworCisJcmVnPSggY2hhbm5lbCA/IFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQwIDogVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMCApICsgZmlsdGVyOworCisJYmlxdWFkLT5jb2VmZi5iMD1HRVRfNF8yMChzaGFkb3dbcmVnXSwgMCk7CisJYmlxdWFkLT5jb2VmZi5iMT1HRVRfNF8yMChzaGFkb3dbcmVnXSwgMyk7CisJYmlxdWFkLT5jb2VmZi5iMj1HRVRfNF8yMChzaGFkb3dbcmVnXSwgNik7CisJYmlxdWFkLT5jb2VmZi5hMT1HRVRfNF8yMChzaGFkb3dbcmVnXSwgOSk7CisJYmlxdWFkLT5jb2VmZi5hMj1HRVRfNF8yMChzaGFkb3dbcmVnXSwxMik7CisJCisJcmV0dXJuIDA7CQorfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY19lcV9ydygJc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZiwKKwkJdV9pbnQgY21kLAorCQl1X2xvbmcgYXJnKQoreworCWludCByYzsKKwlzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgYmlxdWFkOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZiaXF1YWQsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoY21kICYgU0lPQ19JTikgeworCQlyYz10YXMzMDAxY193cml0ZV9iaXF1YWQoc2VsZiwgYmlxdWFkLmNoYW5uZWwsIGJpcXVhZC5maWx0ZXIsICZiaXF1YWQuZGF0YSk7CisJCWlmIChyYyAhPSAwKSByZXR1cm4gcmM7CisJfQorCisJaWYgKGNtZCAmIFNJT0NfT1VUKSB7CisJCXJjPXRhczMwMDFjX3JlYWRfYmlxdWFkKHNlbGYsIGJpcXVhZC5jaGFubmVsLCBiaXF1YWQuZmlsdGVyLCAmYmlxdWFkLmRhdGEpOworCQlpZiAocmMgIT0gMCkgcmV0dXJuIHJjOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmJpcXVhZCwgc2l6ZW9mKHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDAxY19lcV9saXN0X3J3KAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQkJdV9pbnQgY21kLAorCQkJdV9sb25nIGFyZykKK3sKKwlpbnQgcmM7CisJaW50IGZpbHRlcl9jb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGksajsKKwljaGFyIHN5bmNfcmVxdWlyZWRbMl1bNl07CisJc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGJpcXVhZDsKKwlzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX2xpc3RfdCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwltZW1zZXQoc3luY19yZXF1aXJlZCwwLHNpemVvZihzeW5jX3JlcXVpcmVkKSk7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmZpbHRlcl9jb3VudCwgJmFyZ3AtPmZpbHRlcl9jb3VudCwgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZmxhZ3MsICZhcmdwLT5mbGFncywgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjbWQgJiBTSU9DX0lOKSB7CisJfQorCisJZm9yIChpPTA7IGkgPCBmaWx0ZXJfY291bnQ7IGkrKykgeworCQlpZiAoY29weV9mcm9tX3VzZXIoJmJpcXVhZCwgJmFyZ3AtPmJpcXVhZHNbaV0sCisJCQkJICAgc2l6ZW9mKHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWlmIChjbWQgJiBTSU9DX0lOKSB7CisJCQlzeW5jX3JlcXVpcmVkW2JpcXVhZC5jaGFubmVsXVtiaXF1YWQuZmlsdGVyXT0xOworCQkJcmM9dGFzMzAwMWNfd3JpdGVfYmlxdWFkX3NoYWRvdyhzZWxmLCBiaXF1YWQuY2hhbm5lbCwgYmlxdWFkLmZpbHRlciwgJmJpcXVhZC5kYXRhKTsKKwkJCWlmIChyYyAhPSAwKSByZXR1cm4gcmM7CisJCX0KKworCQlpZiAoY21kICYgU0lPQ19PVVQpIHsKKwkJCXJjPXRhczMwMDFjX3JlYWRfYmlxdWFkKHNlbGYsIGJpcXVhZC5jaGFubmVsLCBiaXF1YWQuZmlsdGVyLCAmYmlxdWFkLmRhdGEpOworCQkJaWYgKHJjICE9IDApIHJldHVybiByYzsKKworCQkJaWYgKGNvcHlfdG9fdXNlcigmYXJncC0+YmlxdWFkc1tpXSwgJmJpcXVhZCwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QpKSkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9CisJfQorCisJaWYgKGNtZCAmIFNJT0NfSU4pIHsKKwkJaWYgKGZsYWdzICYgVEFTX0JJUVVBRF9GQVNUX0xPQUQpIHRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLDEpOworCQlmb3IgKGk9MDsgaTwyOyBpKyspIHsKKwkJCWZvciAoaj0wOyBqPDY7IGorKykgeworCQkJCWlmIChzeW5jX3JlcXVpcmVkW2ldW2pdKSB7CisJCQkJCXJjPXRhczMwMDFjX3N5bmNfYmlxdWFkKHNlbGYsIGksIGopOworCQkJCQlpZiAocmMgPCAwKSByZXR1cm4gcmM7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChmbGFncyAmIFRBU19CSVFVQURfRkFTVF9MT0FEKSB7CisJCQl0YXMzMDAxY19mYXN0X2xvYWQoc2VsZiwwKTsKKwkJCS8qIG5vdyB3ZSBuZWVkIHRvIHNldCB1cCB0aGUgbWl4ZXJzIGFnYWluLAorCQkJICAgYmVjYXVzZSBsZWF2aW5nIGZhc3QgbW9kZSByZXNldHMgdGhlbS4gKi8KKwkJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfQkFTUyk7CisJCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1RSRUJMRSk7CisJCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX01JWEVSMSk7CisJCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX01JWEVSMik7CisJCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1ZPTFVNRSk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfdXBkYXRlX2RyY2UoCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsCisJCQlpbnQgZmxhZ3MsCisJCQlzdHJ1Y3QgdGFzX2RyY2VfdCAqZHJjZSkKK3sKKwl0YXNfc2hhZG93X3QgKnNoYWRvdzsKKwlzaGFkb3c9c2VsZi0+c3VwZXIuc2hhZG93OworCisJc2hhZG93W1RBUzMwMDFDX1JFR19EUkNdWzFdID0gMHhjMTsKKworCWlmIChmbGFncyAmIFRBU19EUkNFX1RIUkVTSE9MRCkgeworCQlzZWxmLT5kcmNlX3N0YXRlLnRocmVzaG9sZD1xdWFudGl6ZV9kYihkcmNlLT50aHJlc2hvbGQpOworCQlzaGFkb3dbVEFTMzAwMUNfUkVHX0RSQ11bMl0gPSBkYl90b19yZWd2YWwoc2VsZi0+ZHJjZV9zdGF0ZS50aHJlc2hvbGQpOworCX0KKworCWlmIChmbGFncyAmIFRBU19EUkNFX0VOQUJMRSkgeworCQlzZWxmLT5kcmNlX3N0YXRlLmVuYWJsZSA9IGRyY2UtPmVuYWJsZTsKKwl9CisKKwlpZiAoIXNlbGYtPmRyY2Vfc3RhdGUuZW5hYmxlKSB7CisJCXNoYWRvd1tUQVMzMDAxQ19SRUdfRFJDXVswXSA9IDB4ZjA7CisJfQorCisjaWZkZWYgREVCVUdfRFJDRQorCXByaW50aygiRFJDRSBJT0NUTDogc2V0IFsgRU5BQkxFOiV4IFRIUkVTSDoleFxuIiwKKwkgICAgICAgc2VsZi0+ZHJjZV9zdGF0ZS5lbmFibGUsCisJICAgICAgIHNlbGYtPmRyY2Vfc3RhdGUudGhyZXNob2xkKTsKKworCXByaW50aygiRFJDRSBJT0NUTDogcmVnIFsgJTAyeCAlMDJ4IF1cbiIsCisJICAgICAgICh1bnNpZ25lZCBjaGFyKXNoYWRvd1tUQVMzMDAxQ19SRUdfRFJDXVswXSwKKwkgICAgICAgKHVuc2lnbmVkIGNoYXIpc2hhZG93W1RBUzMwMDFDX1JFR19EUkNdWzFdKTsKKyNlbmRpZgorCisJcmV0dXJuIHRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZiwgVEFTMzAwMUNfUkVHX0RSQyk7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX2RyY2VfcncoCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGYsCisJCQl1X2ludCBjbWQsCisJCQl1X2xvbmcgYXJnKQoreworCWludCByYzsKKwlzdHJ1Y3QgdGFzX2RyY2VfY3RybF90IGRyY2VfY3RybDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZHJjZV9jdHJsLCBhcmdwLCBzaXplb2Yoc3RydWN0IHRhc19kcmNlX2N0cmxfdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworI2lmZGVmIERFQlVHX0RSQ0UKKwlwcmludGsoIkRSQ0UgSU9DVEw6IGlucHV0IFsgRkxBR1M6JXggRU5BQkxFOiV4IFRIUkVTSDoleFxuIiwKKwkgICAgICAgZHJjZV9jdHJsLmZsYWdzLAorCSAgICAgICBkcmNlX2N0cmwuZGF0YS5lbmFibGUsCisJICAgICAgIGRyY2VfY3RybC5kYXRhLnRocmVzaG9sZCk7CisjZW5kaWYKKworCWlmIChjbWQgJiBTSU9DX0lOKSB7CisJCXJjID0gdGFzMzAwMWNfdXBkYXRlX2RyY2Uoc2VsZiwgZHJjZV9jdHJsLmZsYWdzLCAmZHJjZV9jdHJsLmRhdGEpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKworCWlmIChjbWQgJiBTSU9DX09VVCkgeworCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfRU5BQkxFKQorCQkJZHJjZV9jdHJsLmRhdGEuZW5hYmxlID0gc2VsZi0+ZHJjZV9zdGF0ZS5lbmFibGU7CisKKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX1RIUkVTSE9MRCkKKwkJCWRyY2VfY3RybC5kYXRhLnRocmVzaG9sZCA9IHNlbGYtPmRyY2Vfc3RhdGUudGhyZXNob2xkOworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmRyY2VfY3RybCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB0YXNfZHJjZV9jdHJsX3QpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3RhczMwMDFjX3VwZGF0ZV9kZXZpY2VfcGFyYW1ldGVycyhzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmKQoreworCWludCBpLGo7CisKKwlpZiAoIXNlbGYpIHJldHVybjsKKworCWlmIChzZWxmLT5vdXRwdXRfaWQgPT0gVEFTX09VVFBVVF9IRUFEUEhPTkVTKSB7CisJCXRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLCAxKTsKKworCQlmb3IgKGk9MDsgaTxUQVMzMDAxQ19CSVFVQURfQ0hBTk5FTF9DT1VOVDsgaSsrKSB7CisJCQlmb3IgKGo9MDsgajxUQVMzMDAxQ19CSVFVQURfRklMVEVSX0NPVU5UOyBqKyspIHsKKwkJCQl0YXMzMDAxY193cml0ZV9iaXF1YWQoc2VsZiwgaSwgaiwgJnRhczMwMDFjX2VxX3VuaXR5KTsKKwkJCX0KKwkJfQorCisJCXRhczMwMDFjX2Zhc3RfbG9hZChzZWxmLCAwKTsKKworCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0JBU1MpOworCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1RSRUJMRSk7CisJCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTUlYRVIxKTsKKwkJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19NSVhFUjIpOworCQkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1ZPTFVNRSk7CisKKwkJcmV0dXJuOworCX0KKworCWZvciAoaT0wOyB0YXMzMDAxY19lcV9wcmVmc1tpXTsgaSsrKSB7CisJCXN0cnVjdCB0YXNfZXFfcHJlZl90ICplcSA9IHRhczMwMDFjX2VxX3ByZWZzW2ldOworCisJCWlmIChlcS0+ZGV2aWNlX2lkID09IHNlbGYtPmRldmljZV9pZCAmJgorCQkgICAgKGVxLT5vdXRwdXRfaWQgPT0gMCB8fCBlcS0+b3V0cHV0X2lkID09IHNlbGYtPm91dHB1dF9pZCkgJiYKKwkJICAgIChlcS0+c3BlYWtlcl9pZCA9PSAwIHx8IGVxLT5zcGVha2VyX2lkID09IHNlbGYtPnNwZWFrZXJfaWQpKSB7CisKKwkJCXRhczMwMDFjX3VwZGF0ZV9kcmNlKHNlbGYsIFRBU19EUkNFX0FMTCwgZXEtPmRyY2UpOworCQkJdGFzMzAwMWNfd3JpdGVfYmlxdWFkX2xpc3Qoc2VsZiwgZXEtPmZpbHRlcl9jb3VudCwgVEFTX0JJUVVBRF9GQVNUX0xPQUQsIGVxLT5iaXF1YWRzKTsKKworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCit0YXMzMDAxY19kZXZpY2VfY2hhbmdlX2hhbmRsZXIodm9pZCAqc2VsZikKK3sKKwlpZiAoc2VsZikKKwkJdGFzMzAwMWNfdXBkYXRlX2RldmljZV9wYXJhbWV0ZXJzKHNlbGYpOworfQorCitzdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGRldmljZV9jaGFuZ2U7CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX291dHB1dF9kZXZpY2VfY2hhbmdlKAlzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmLAorCQkJCWludCBkZXZpY2VfaWQsCisJCQkJaW50IG91dHB1dF9pZCwKKwkJCQlpbnQgc3BlYWtlcl9pZCkKK3sKKwlzZWxmLT5kZXZpY2VfaWQ9ZGV2aWNlX2lkOworCXNlbGYtPm91dHB1dF9pZD1vdXRwdXRfaWQ7CisJc2VsZi0+c3BlYWtlcl9pZD1zcGVha2VyX2lkOworCisJc2NoZWR1bGVfd29yaygmZGV2aWNlX2NoYW5nZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX2RldmljZV9pb2N0bCgJc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZiwKKwkJCXVfaW50IGNtZCwKKwkJCXVfbG9uZyBhcmcpCit7CisJdWludCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFRBU19SRUFEX0VROgorCWNhc2UgVEFTX1dSSVRFX0VROgorCQlyZXR1cm4gdGFzMzAwMWNfZXFfcncoc2VsZiwgY21kLCBhcmcpOworCisJY2FzZSBUQVNfUkVBRF9FUV9MSVNUOgorCWNhc2UgVEFTX1dSSVRFX0VRX0xJU1Q6CisJCXJldHVybiB0YXMzMDAxY19lcV9saXN0X3J3KHNlbGYsIGNtZCwgYXJnKTsKKworCWNhc2UgVEFTX1JFQURfRVFfRklMVEVSX0NPVU5UOgorCQlwdXRfdXNlcihUQVMzMDAxQ19CSVFVQURfRklMVEVSX0NPVU5ULCBhcmdwKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRBU19SRUFEX0VRX0NIQU5ORUxfQ09VTlQ6CisJCXB1dF91c2VyKFRBUzMwMDFDX0JJUVVBRF9DSEFOTkVMX0NPVU5ULCBhcmdwKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFRBU19SRUFEX0RSQ0U6CisJY2FzZSBUQVNfV1JJVEVfRFJDRToKKwkJcmV0dXJuIHRhczMwMDFjX2RyY2Vfcncoc2VsZiwgY21kLCBhcmcpOworCisJY2FzZSBUQVNfUkVBRF9EUkNFX0NBUFM6CisJCXB1dF91c2VyKFRBU19EUkNFX0VOQUJMRSB8IFRBU19EUkNFX1RIUkVTSE9MRCwgYXJncCk7CisJCXJldHVybiAwOworCisJY2FzZSBUQVNfUkVBRF9EUkNFX01JTjoKKwljYXNlIFRBU19SRUFEX0RSQ0VfTUFYOiB7CisJCXN0cnVjdCB0YXNfZHJjZV9jdHJsX3QgZHJjZV9jdHJsOworCisJCWlmIChjb3B5X2Zyb21fdXNlcigmZHJjZV9jdHJsLCBhcmdwLAorCQkJCSAgIHNpemVvZihzdHJ1Y3QgdGFzX2RyY2VfY3RybF90KSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX1RIUkVTSE9MRCkgeworCQkJaWYgKGNtZCA9PSBUQVNfUkVBRF9EUkNFX01JTikgeworCQkJCWRyY2VfY3RybC5kYXRhLnRocmVzaG9sZD0tMzY8PDg7CisJCQl9IGVsc2UgeworCQkJCWRyY2VfY3RybC5kYXRhLnRocmVzaG9sZD0tNjw8ODsKKwkJCX0KKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmRyY2VfY3RybCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB0YXNfZHJjZV9jdHJsX3QpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX2luaXRfbWl4ZXIoc3RydWN0IHRhczMwMDFjX2RhdGFfdCAqc2VsZikKK3sKKwl1bnNpZ25lZCBjaGFyIG1jciA9ICgxPDw2KSsoMjw8NCkrKDI8PDIpOworCisJLyogTWFrZSBzdXJlIHNvbWV0aGluZyBhbnN3ZXJzIG9uIHRoZSBpMmMgYnVzICovCisJaWYgKHRhczMwMDFjX3dyaXRlX3JlZ2lzdGVyKHNlbGYsIFRBUzMwMDFDX1JFR19NQ1IsICZtY3IsCisJICAgIFdSSVRFX05PUk1BTHxGT1JDRV9XUklURSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwl0YXMzMDAxY19mYXN0X2xvYWQoc2VsZiwgMSk7CisKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDApOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMSk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQyKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDMpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFENCk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQ1KTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDYpOworCisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDApOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQxKTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMik7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDMpOworCSh2b2lkKXRhczMwMDFjX3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQ0KTsKKwkodm9pZCl0YXMzMDAxY19zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFENSk7CisJKHZvaWQpdGFzMzAwMWNfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDYpOworCisJdGFzMzAwMWNfZmFzdF9sb2FkKHNlbGYsIDApOworCisJdGFzMzAwMWNfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX1ZPTFVNRSwgVk9MX0RFRkFVTFQ8PDggfCBWT0xfREVGQVVMVCk7CisJdGFzMzAwMWNfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX1BDTSwgSU5QVVRfREVGQVVMVDw8OCB8IElOUFVUX0RFRkFVTFQpOworCXRhczMwMDFjX3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9BTFRQQ00sIDApOworCisJdGFzMzAwMWNfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX0JBU1MsIEJBU1NfREVGQVVMVCk7CisJdGFzMzAwMWNfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX1RSRUJMRSwgVFJFQkxFX0RFRkFVTFQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDFjX3VuaW5pdF9taXhlcihzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmKQoreworCXRhczMwMDFjX3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9WT0xVTUUsIDApOworCXRhczMwMDFjX3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9QQ00sICAgIDApOworCXRhczMwMDFjX3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9BTFRQQ00sIDApOworCisJdGFzMzAwMWNfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX0JBU1MsICAgMCk7CisJdGFzMzAwMWNfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX1RSRUJMRSwgMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwMWNfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB0YXMzMDAxY19kYXRhX3QgKnNlbGY7CisJc2l6ZV90IHN6ID0gc2l6ZW9mKCpzZWxmKSArIChUQVMzMDAxQ19SRUdfTUFYKnNpemVvZih0YXNfc2hhZG93X3QpKTsKKwlpbnQgaSwgajsKKworCXNlbGYgPSBrbWFsbG9jKHN6LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXNlbGYpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChzZWxmLCAwLCBzeik7CisKKwlzZWxmLT5zdXBlci5jbGllbnQgPSBjbGllbnQ7CisJc2VsZi0+c3VwZXIuc2hhZG93ID0gKHRhc19zaGFkb3dfdCAqKShzZWxmKzEpOworCXNlbGYtPm91dHB1dF9pZCA9IFRBU19PVVRQVVRfSEVBRFBIT05FUzsKKworCWRldl9zZXRfZHJ2ZGF0YSgmY2xpZW50LT5kZXYsIHNlbGYpOworCisJZm9yIChpID0gMDsgaSA8IFRBUzMwMDFDX0JJUVVBRF9DSEFOTkVMX0NPVU5UOyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBUQVMzMDAxQ19CSVFVQURfRklMVEVSX0NPVU5UOyBqKyspCisJCQl0YXMzMDAxY193cml0ZV9iaXF1YWRfc2hhZG93KHNlbGYsIGksIGosCisJCQkJJnRhczMwMDFjX2VxX3VuaXR5KTsKKworCUlOSVRfV09SSygmZGV2aWNlX2NoYW5nZSwgdGFzMzAwMWNfZGV2aWNlX2NoYW5nZV9oYW5kbGVyLCBzZWxmKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3RhczMwMDFjX3VuaW5pdChzdHJ1Y3QgdGFzMzAwMWNfZGF0YV90ICpzZWxmKQoreworCXRhczMwMDFjX3VuaW5pdF9taXhlcihzZWxmKTsKKwlrZnJlZShzZWxmKTsKK30KKworc3RydWN0IHRhc19kcml2ZXJfaG9va3NfdCB0YXMzMDAxY19ob29rcyA9IHsKKwkuaW5pdAkJCT0gKHRhc19ob29rX2luaXRfdCl0YXMzMDAxY19pbml0LAorCS5wb3N0X2luaXQJCT0gKHRhc19ob29rX3Bvc3RfaW5pdF90KXRhczMwMDFjX2luaXRfbWl4ZXIsCisJLnVuaW5pdAkJCT0gKHRhc19ob29rX3VuaW5pdF90KXRhczMwMDFjX3VuaW5pdCwKKwkuZ2V0X21peGVyX2xldmVsCT0gKHRhc19ob29rX2dldF9taXhlcl9sZXZlbF90KXRhczMwMDFjX2dldF9taXhlcl9sZXZlbCwKKwkuc2V0X21peGVyX2xldmVsCT0gKHRhc19ob29rX3NldF9taXhlcl9sZXZlbF90KXRhczMwMDFjX3NldF9taXhlcl9sZXZlbCwKKwkuZW50ZXJfc2xlZXAJCT0gKHRhc19ob29rX2VudGVyX3NsZWVwX3QpdGFzMzAwMWNfZW50ZXJfc2xlZXAsCisJLmxlYXZlX3NsZWVwCQk9ICh0YXNfaG9va19sZWF2ZV9zbGVlcF90KXRhczMwMDFjX2xlYXZlX3NsZWVwLAorCS5zdXBwb3J0ZWRfbWl4ZXJzCT0gKHRhc19ob29rX3N1cHBvcnRlZF9taXhlcnNfdCl0YXMzMDAxY19zdXBwb3J0ZWRfbWl4ZXJzLAorCS5taXhlcl9pc19zdGVyZW8JPSAodGFzX2hvb2tfbWl4ZXJfaXNfc3RlcmVvX3QpdGFzMzAwMWNfbWl4ZXJfaXNfc3RlcmVvLAorCS5zdGVyZW9fbWl4ZXJzCQk9ICh0YXNfaG9va19zdGVyZW9fbWl4ZXJzX3QpdGFzMzAwMWNfc3RlcmVvX21peGVycywKKwkub3V0cHV0X2RldmljZV9jaGFuZ2UJPSAodGFzX2hvb2tfb3V0cHV0X2RldmljZV9jaGFuZ2VfdCl0YXMzMDAxY19vdXRwdXRfZGV2aWNlX2NoYW5nZSwKKwkuZGV2aWNlX2lvY3RsCQk9ICh0YXNfaG9va19kZXZpY2VfaW9jdGxfdCl0YXMzMDAxY19kZXZpY2VfaW9jdGwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwMWMuaCBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDAxYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjBkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwMWMuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIHRoZSBpMmMvaTJzIGJhc2VkIFRBMzAwMWMgc291bmQgY2hpcCB1c2VkCisgKiBvbiBzb21lIEFwcGxlIGhhcmR3YXJlLiBBbHNvIGtub3duIGFzICJ0dW1ibGVyIi4KKyAqCisgKiAgVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogV3JpdHRlbiBieSBDaHJpc3RvcGhlciBDLiBDaGltZWxpcyA8Y2hyaXNAZGViaWFuLm9yZz4KKyAqLworCisjaWZuZGVmIF9UQVMzMDAxQ19IXworI2RlZmluZSBfVEFTMzAwMUNfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJ0YXNfY29tbW9uLmgiCisjaW5jbHVkZSAidGFzX2VxX3ByZWZzLmgiCisKKy8qCisgKiBNYWNyb3MgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSByZWdpc3RlcnMgdGhhdCB3ZSB3cml0ZSB0bworICogd2hlbiBzZXR0aW5nIHRoZSB2YXJpb3VzIHZhbHVlcy4KKyAqLworCisjZGVmaW5lIFRBUzMwMDFDX1ZFUlNJT04JIjAuMyIKKyNkZWZpbmUgVEFTMzAwMUNfREFURQkgICAgICAgICIyMDAxMTIxNCIKKworI2RlZmluZSBJMkNfRFJJVkVSTkFNRV9UQVMzMDAxQyAiVEFTMzAwMWMgZHJpdmVyIFYgIiBUQVMzMDAxQ19WRVJTSU9OCisjZGVmaW5lIEkyQ19EUklWRVJJRF9UQVMzMDAxQyAgIChJMkNfRFJJVkVSSURfVEFTX0JBU0UrMCkKKworZXh0ZXJuICBzdHJ1Y3QgdGFzX2RyaXZlcl9ob29rc190IHRhczMwMDFjX2hvb2tzOworZXh0ZXJuIHN0cnVjdCB0YXNfZ2Fpbl90IHRhczMwMDFjX2dhaW47CitleHRlcm4gc3RydWN0IHRhc19lcV9wcmVmX3QgKnRhczMwMDFjX2VxX3ByZWZzW107CisKK2VudW0gdGFzMzAwMWNfcmVnX3QgeworICBUQVMzMDAxQ19SRUdfTUNSICAgICAgICAgICAgICAgICAgICA9IDB4MDEsCisgIFRBUzMwMDFDX1JFR19EUkMgICAgICAgICAgICAgICAgICAgID0gMHgwMiwKKworICBUQVMzMDAxQ19SRUdfVk9MVU1FICAgICAgICAgICAgICAgICA9IDB4MDQsCisgIFRBUzMwMDFDX1JFR19UUkVCTEUgICAgICAgICAgICAgICAgID0gMHgwNSwKKyAgVEFTMzAwMUNfUkVHX0JBU1MgICAgICAgICAgICAgICAgICAgPSAweDA2LAorICBUQVMzMDAxQ19SRUdfTUlYRVIxICAgICAgICAgICAgICAgICA9IDB4MDcsCisgIFRBUzMwMDFDX1JFR19NSVhFUjIgICAgICAgICAgICAgICAgID0gMHgwOCwKKworICBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQwICAgICAgICAgICA9IDB4MGEsCisgIFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDEgICAgICAgICAgID0gMHgwYiwKKyAgVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFEMiAgICAgICAgICAgPSAweDBjLAorICBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQzICAgICAgICAgICA9IDB4MGQsCisgIFRBUzMwMDFDX1JFR19MRUZUX0JJUVVBRDQgICAgICAgICAgID0gMHgwZSwKKyAgVEFTMzAwMUNfUkVHX0xFRlRfQklRVUFENSAgICAgICAgICAgPSAweDBmLAorICBUQVMzMDAxQ19SRUdfTEVGVF9CSVFVQUQ2ICAgICAgICAgICA9IDB4MTAsCisgIAorICBUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMCAgICAgICAgICA9IDB4MTMsCisgIFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQxICAgICAgICAgID0gMHgxNCwKKyAgVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDIgICAgICAgICAgPSAweDE1LAorICBUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFEMyAgICAgICAgICA9IDB4MTYsCisgIFRBUzMwMDFDX1JFR19SSUdIVF9CSVFVQUQ0ICAgICAgICAgID0gMHgxNywKKyAgVEFTMzAwMUNfUkVHX1JJR0hUX0JJUVVBRDUgICAgICAgICAgPSAweDE4LAorICBUQVMzMDAxQ19SRUdfUklHSFRfQklRVUFENiAgICAgICAgICA9IDB4MTksCisKKyAgVEFTMzAwMUNfUkVHX01BWCAgICAgICAgICAgICAgICAgICAgPSAweDIwCit9OworCisjZW5kaWYgLyogX1RBUzMwMDFDX0hfICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwMWNfdGFibGVzLmMgYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwMWNfdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2OGZhOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDAxY190YWJsZXMuYwpAQCAtMCwwICsxLDM3NSBAQAorI2luY2x1ZGUgInRhc19jb21tb24uaCIKKyNpbmNsdWRlICJ0YXNfZXFfcHJlZnMuaCIKKworc3RhdGljIHN0cnVjdCB0YXNfZHJjZV90IGVxcF8wZV8yXzFfZHJjZSA9IHsKKyAgLmVuYWJsZSAgICAgPSAxLAorICAuYWJvdmUgICAgICA9IHsgLnZhbCA9IDMuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLmJlbG93ICAgICAgPSB7IC52YWwgPSAxLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC50aHJlc2hvbGQgID0gLTE1LjMzICAqICgxPDw4KSwKKyAgLmVuZXJneSAgICAgPSAyLjQgICAgICogKDE8PDEyKSwKKyAgLmF0dGFjayAgICAgPSAwLjAxMyAgICogKDE8PDEyKSwKKyAgLmRlY2F5ICAgICAgPSAwLjIxMiAgICogKDE8PDEyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgZXFwXzBlXzJfMV9iaXF1YWRzW109eworICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDAsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZDQUQzLCAweEUwNkE1OCwgMHgwRkNBRDMsIDB4RTA2QjA5LCAweDBGOTY1NyB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAxLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDA0MTczMSwgMHgwODJFNjMsIDB4MDQxNzMxLCAweEZEOEQwOCwgMHgwMkNGQkQgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkZEQzcsIDB4RTA1MjRDLCAweDBGQkZBQSwgMHhFMDUyNEMsIDB4MEZCRDcyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDMsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEYzRDM1LCAweEUyMjhDQSwgMHgwRUM3QjIsIDB4RTIyOENBLCAweDBFMDRFOCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA0LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGQ0VCRiwgMHhFMTgxQzIsIDB4MEYyNjU2LCAweEUxODFDMiwgMHgwRUY1MTYgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRUM0MTcsIDB4MDczRTIyLCAweDBCMDYzMywgMHgwNzNFMjIsIDB4MDlDQTRBIH0gfSB9LAorCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkNBRDMsIDB4RTA2QTU4LCAweDBGQ0FEMywgMHhFMDZCMDksIDB4MEY5NjU3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDQxNzMxLCAweDA4MkU2MywgMHgwNDE3MzEsIDB4RkQ4RDA4LCAweDAyQ0ZCRCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGRkRDNywgMHhFMDUyNEMsIDB4MEZCRkFBLCAweEUwNTI0QywgMHgwRkJENzIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRjNEMzUsIDB4RTIyOENBLCAweDBFQzdCMiwgMHhFMjI4Q0EsIDB4MEUwNEU4IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZDRUJGLCAweEUxODFDMiwgMHgwRjI2NTYsIDB4RTE4MUMyLCAweDBFRjUxNiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBFQzQxNywgMHgwNzNFMjIsIDB4MEIwNjMzLCAweDA3M0UyMiwgMHgwOUNBNEEgfSB9IH0sCit9OworCitzdGF0aWMgc3RydWN0IHRhc19lcV9wcmVmX3QgZXFwXzBlXzJfMSA9IHsKKyAgLnNhbXBsZV9yYXRlICAgPSA0NDEwMCwKKyAgLmRldmljZV9pZCAgICAgPSAweDBlLAorICAub3V0cHV0X2lkICAgICA9IFRBU19PVVRQVVRfRVhURVJOQUxfU1BLUiwKKyAgLnNwZWFrZXJfaWQgICAgPSAweDAxLAorCisgIC5kcmNlICAgICAgICAgID0gJmVxcF8wZV8yXzFfZHJjZSwKKworICAuZmlsdGVyX2NvdW50ICA9IDEyLAorICAuYmlxdWFkcyAgICAgICA9IGVxcF8wZV8yXzFfYmlxdWFkcworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2RyY2VfdCBlcXBfMTBfMV8wX2RyY2U9eworICAuZW5hYmxlICAgICA9IDEsCisgIC5hYm92ZSAgICAgID0geyAudmFsID0gMy4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAuYmVsb3cgICAgICA9IHsgLnZhbCA9IDEuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLnRocmVzaG9sZCAgPSAtMTIuNDYgICogKDE8PDgpLAorICAuZW5lcmd5ICAgICA9IDIuNCAgICAgKiAoMTw8MTIpLAorICAuYXR0YWNrICAgICA9IDAuMDEzICAgKiAoMTw8MTIpLAorICAuZGVjYXkgICAgICA9IDAuMjEyICAgKiAoMTw8MTIpLAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCBlcXBfMTBfMV8wX2JpcXVhZHNbXT17CisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRjRBMTIsIDB4RTE2QkRBLCAweDBGNEExMiwgMHhFMTczRjAsIDB4MEU5QzNBIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDJERDU0LCAweDA1QkFBOCwgMHgwMkRENTQsIDB4RjgwMDFELCAweDAzNzUzMiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBFMkZDNywgMHhFNEQ1REMsIDB4MEQ3NDc3LCAweEU0RDVEQywgMHgwQkE0M0YgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRTc4OTksIDB4RTY3Q0NBLCAweDBEMEU5MywgMHhFNjdDQ0EsIDB4MEI4NzJEIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDEwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAgfSB9IH0sCisKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGNEExMiwgMHhFMTZCREEsIDB4MEY0QTEyLCAweEUxNzNGMCwgMHgwRTlDM0EgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwMkRENTQsIDB4MDVCQUE4LCAweDAyREQ1NCwgMHhGODAwMUQsIDB4MDM3NTMyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEUyRkM3LCAweEU0RDVEQywgMHgwRDc0NzcsIDB4RTRENURDLCAweDBCQTQzRiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBFNzg5OSwgMHhFNjdDQ0EsIDB4MEQwRTkzLCAweEU2N0NDQSwgMHgwQjg3MkQgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCB9IH0gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2VxX3ByZWZfdCBlcXBfMTBfMV8wID0geworICAuc2FtcGxlX3JhdGUgICA9IDQ0MTAwLAorICAuZGV2aWNlX2lkICAgICA9IDB4MTAsCisgIC5vdXRwdXRfaWQgICAgID0gVEFTX09VVFBVVF9JTlRFUk5BTF9TUEtSLAorICAuc3BlYWtlcl9pZCAgICA9IDB4MDAsCisKKyAgLmRyY2UgICAgICAgICAgPSAmZXFwXzEwXzFfMF9kcmNlLAorCisgIC5maWx0ZXJfY291bnQgID0gMTIsCisgIC5iaXF1YWRzICAgICAgID0gZXFwXzEwXzFfMF9iaXF1YWRzCit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHN0cnVjdCB0YXNfZHJjZV90IGVxcF8xNV8yXzFfZHJjZT17CisgIC5lbmFibGUgICAgID0gMSwKKyAgLmFib3ZlICAgICAgPSB7IC52YWwgPSAzLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC5iZWxvdyAgICAgID0geyAudmFsID0gMS4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAudGhyZXNob2xkICA9IC0xNS4zMyAgKiAoMTw8OCksCisgIC5lbmVyZ3kgICAgID0gMi40ICAgICAqICgxPDwxMiksCisgIC5hdHRhY2sgICAgID0gMC4wMTMgICAqICgxPDwxMiksCisgIC5kZWNheSAgICAgID0gMC4yMTIgICAqICgxPDwxMiksCit9OworCitzdGF0aWMgc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGVxcF8xNV8yXzFfYmlxdWFkc1tdPXsKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGRTE0MywgMHhFMDUyMDQsIDB4MEZDQ0M1LCAweEUwNTI2NiwgMHgwRkFFNkIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMDIzODMsIDB4RTAzQTAzLCAweDBGQTMyNSwgMHhFMDNBMDMsIDB4MEZDNkE4IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZGMkFCLCAweEUwNjI4NSwgMHgwRkIyMEEsIDB4RTA2Mjg1LCAweDBGQTRCNSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGNTQ0RCwgMHhFMzU5NzEsIDB4MEQ4RjNBLCAweEUzNTk3MSwgMHgwQ0UzODggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxM0UxRDMsIDB4RjNFQ0I1LCAweDA0MjIyNywgMHhGM0VDQjUsIDB4MDgwM0ZBIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEFDMTE5LCAweDAzNDE4MSwgMHgwNzhBQjEsIDB4MDM0MTgxLCAweDAyNEJDQSB9IH0gfSwKKworICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDAsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZFMTQzLCAweEUwNTIwNCwgMHgwRkNDQzUsIDB4RTA1MjY2LCAweDBGQUU2QiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAxLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDEwMjM4MywgMHhFMDNBMDMsIDB4MEZBMzI1LCAweEUwM0EwMywgMHgwRkM2QTggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkYyQUIsIDB4RTA2Mjg1LCAweDBGQjIwQSwgMHhFMDYyODUsIDB4MEZBNEI1IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDMsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEY1NDRELCAweEUzNTk3MSwgMHgwRDhGM0EsIDB4RTM1OTcxLCAweDBDRTM4OCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA0LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDEzRTFEMywgMHhGM0VDQjUsIDB4MDQyMjI3LCAweEYzRUNCNSwgMHgwODAzRkEgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwQUMxMTksIDB4MDM0MTgxLCAweDA3OEFCMSwgMHgwMzQxODEsIDB4MDI0QkNBIH0gfSB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfZXFfcHJlZl90IGVxcF8xNV8yXzEgPSB7CisgIC5zYW1wbGVfcmF0ZSAgID0gNDQxMDAsCisgIC5kZXZpY2VfaWQgICAgID0gMHgxNSwKKyAgLm91dHB1dF9pZCAgICAgPSBUQVNfT1VUUFVUX0VYVEVSTkFMX1NQS1IsCisgIC5zcGVha2VyX2lkICAgID0gMHgwMSwKKworICAuZHJjZSAgICAgICAgICA9ICZlcXBfMTVfMl8xX2RyY2UsCisKKyAgLmZpbHRlcl9jb3VudCAgPSAxMiwKKyAgLmJpcXVhZHMgICAgICAgPSBlcXBfMTVfMl8xX2JpcXVhZHMKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgc3RydWN0IHRhc19kcmNlX3QgZXFwXzE1XzFfMF9kcmNlPXsKKyAgLmVuYWJsZSAgICAgPSAxLAorICAuYWJvdmUgICAgICA9IHsgLnZhbCA9IDMuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLmJlbG93ICAgICAgPSB7IC52YWwgPSAxLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC50aHJlc2hvbGQgID0gMC4wICAgICAqICgxPDw4KSwKKyAgLmVuZXJneSAgICAgPSAyLjQgICAgICogKDE8PDEyKSwKKyAgLmF0dGFjayAgICAgPSAwLjAxMyAgICogKDE8PDEyKSwKKyAgLmRlY2F5ICAgICAgPSAwLjIxMiAgICogKDE8PDEyKSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgZXFwXzE1XzFfMF9iaXF1YWRzW109eworICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDAsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZBRDA4LCAweEUwQTVFRiwgMHgwRkFEMDgsIDB4RTBBNzlELCAweDBGNUJCRSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAxLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDA0QjM4RCwgMHgwOTY3MUIsIDB4MDRCMzhELCAweDAwMEY3MSwgMHgwMkJFQzUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkREMzIsIDB4RTBBNTZGLCAweDBGOEE2OSwgMHhFMEE1NkYsIDB4MEY2NzlDIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDMsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZEMjg0LCAweEUxMzVGQiwgMHgwRjIxNjEsIDB4RTEzNUZCLCAweDBFRjNFNSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA0LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBFODFCMSwgMHhFNjI4M0YsIDB4MENFNDlELCAweEU2MjgzRiwgMHgwQjY2NEYgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRjJENjIsIDB4RTk4Nzk3LCAweDBEMUUxOSwgMHhFOTg3OTcsIDB4MEM0QjdCIH0gfSB9LAorCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkFEMDgsIDB4RTBBNUVGLCAweDBGQUQwOCwgMHhFMEE3OUQsIDB4MEY1QkJFIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDRCMzhELCAweDA5NjcxQiwgMHgwNEIzOEQsIDB4MDAwRjcxLCAweDAyQkVDNSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGREQzMiwgMHhFMEE1NkYsIDB4MEY4QTY5LCAweEUwQTU2RiwgMHgwRjY3OUMgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkQyODQsIDB4RTEzNUZCLCAweDBGMjE2MSwgMHhFMTM1RkIsIDB4MEVGM0U1IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEU4MUIxLCAweEU2MjgzRiwgMHgwQ0U0OUQsIDB4RTYyODNGLCAweDBCNjY0RiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGMkQ2MiwgMHhFOTg3OTcsIDB4MEQxRTE5LCAweEU5ODc5NywgMHgwQzRCN0IgfSB9IH0sCit9OworCitzdGF0aWMgc3RydWN0IHRhc19lcV9wcmVmX3QgZXFwXzE1XzFfMCA9IHsKKyAgLnNhbXBsZV9yYXRlICAgPSA0NDEwMCwKKyAgLmRldmljZV9pZCAgICAgPSAweDE1LAorICAub3V0cHV0X2lkICAgICA9IFRBU19PVVRQVVRfSU5URVJOQUxfU1BLUiwKKyAgLnNwZWFrZXJfaWQgICAgPSAweDAwLAorCisgIC5kcmNlICAgICAgICAgID0gJmVxcF8xNV8xXzBfZHJjZSwKKworICAuZmlsdGVyX2NvdW50ICA9IDEyLAorICAuYmlxdWFkcyAgICAgICA9IGVxcF8xNV8xXzBfYmlxdWFkcworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2RyY2VfdCBlcXBfMGZfMl8xX2RyY2U9eworICAuZW5hYmxlICAgICA9IDEsCisgIC5hYm92ZSAgICAgID0geyAudmFsID0gMy4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAuYmVsb3cgICAgICA9IHsgLnZhbCA9IDEuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLnRocmVzaG9sZCAgPSAtMTUuMzMgICogKDE8PDgpLAorICAuZW5lcmd5ICAgICA9IDIuNCAgICAgKiAoMTw8MTIpLAorICAuYXR0YWNrICAgICA9IDAuMDEzICAgKiAoMTw8MTIpLAorICAuZGVjYXkgICAgICA9IDAuMjEyICAgKiAoMTw8MTIpLAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCBlcXBfMGZfMl8xX2JpcXVhZHNbXT17CisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkUxNDMsIDB4RTA1MjA0LCAweDBGQ0NDNSwgMHhFMDUyNjYsIDB4MEZBRTZCIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTAyMzgzLCAweEUwM0EwMywgMHgwRkEzMjUsIDB4RTAzQTAzLCAweDBGQzZBOCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGRjJBQiwgMHhFMDYyODUsIDB4MEZCMjBBLCAweEUwNjI4NSwgMHgwRkE0QjUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRjU0NEQsIDB4RTM1OTcxLCAweDBEOEYzQSwgMHhFMzU5NzEsIDB4MENFMzg4IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTNFMUQzLCAweEYzRUNCNSwgMHgwNDIyMjcsIDB4RjNFQ0I1LCAweDA4MDNGQSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBBQzExOSwgMHgwMzQxODEsIDB4MDc4QUIxLCAweDAzNDE4MSwgMHgwMjRCQ0EgfSB9IH0sCisKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGRTE0MywgMHhFMDUyMDQsIDB4MEZDQ0M1LCAweEUwNTI2NiwgMHgwRkFFNkIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMDIzODMsIDB4RTAzQTAzLCAweDBGQTMyNSwgMHhFMDNBMDMsIDB4MEZDNkE4IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZGMkFCLCAweEUwNjI4NSwgMHgwRkIyMEEsIDB4RTA2Mjg1LCAweDBGQTRCNSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGNTQ0RCwgMHhFMzU5NzEsIDB4MEQ4RjNBLCAweEUzNTk3MSwgMHgwQ0UzODggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxM0UxRDMsIDB4RjNFQ0I1LCAweDA0MjIyNywgMHhGM0VDQjUsIDB4MDgwM0ZBIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEFDMTE5LCAweDAzNDE4MSwgMHgwNzhBQjEsIDB4MDM0MTgxLCAweDAyNEJDQSB9IH0gfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2VxX3ByZWZfdCBlcXBfMGZfMl8xID0geworICAuc2FtcGxlX3JhdGUgICA9IDQ0MTAwLAorICAuZGV2aWNlX2lkICAgICA9IDB4MGYsCisgIC5vdXRwdXRfaWQgICAgID0gVEFTX09VVFBVVF9FWFRFUk5BTF9TUEtSLAorICAuc3BlYWtlcl9pZCAgICA9IDB4MDEsCisKKyAgLmRyY2UgICAgICAgICAgPSAmZXFwXzBmXzJfMV9kcmNlLAorCisgIC5maWx0ZXJfY291bnQgID0gMTIsCisgIC5iaXF1YWRzICAgICAgID0gZXFwXzBmXzJfMV9iaXF1YWRzCit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIHN0cnVjdCB0YXNfZHJjZV90IGVxcF8wZl8xXzBfZHJjZT17CisgIC5lbmFibGUgICAgID0gMSwKKyAgLmFib3ZlICAgICAgPSB7IC52YWwgPSAzLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgIC5iZWxvdyAgICAgID0geyAudmFsID0gMS4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAudGhyZXNob2xkICA9IC0xNS4zMyAgKiAoMTw8OCksCisgIC5lbmVyZ3kgICAgID0gMi40ICAgICAqICgxPDwxMiksCisgIC5hdHRhY2sgICAgID0gMC4wMTMgICAqICgxPDwxMiksCisgIC5kZWNheSAgICAgID0gMC4yMTIgICAqICgxPDwxMiksCit9OworCitzdGF0aWMgc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGVxcF8wZl8xXzBfYmlxdWFkc1tdPXsKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAwLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGQ0FEMywgMHhFMDZBNTgsIDB4MEZDQUQzLCAweEUwNkIwOSwgMHgwRjk2NTcgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwNDE3MzEsIDB4MDgyRTYzLCAweDA0MTczMSwgMHhGRDhEMDgsIDB4MDJDRkJEIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDIsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZGREM3LCAweEUwNTI0QywgMHgwRkJGQUEsIDB4RTA1MjRDLCAweDBGQkQ3MiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAzLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGM0QzNSwgMHhFMjI4Q0EsIDB4MEVDN0IyLCAweEUyMjhDQSwgMHgwRTA0RTggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkNFQkYsIDB4RTE4MUMyLCAweDBGMjY1NiwgMHhFMTgxQzIsIDB4MEVGNTE2IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDUsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEVDNDE3LCAweDA3M0UyMiwgMHgwQjA2MzMsIDB4MDczRTIyLCAweDA5Q0E0QSB9IH0gfSwKKworICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDAsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEZDQUQzLCAweEUwNkE1OCwgMHgwRkNBRDMsIDB4RTA2QjA5LCAweDBGOTY1NyB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAxLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDA0MTczMSwgMHgwODJFNjMsIDB4MDQxNzMxLCAweEZEOEQwOCwgMHgwMkNGQkQgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRkZEQzcsIDB4RTA1MjRDLCAweDBGQkZBQSwgMHhFMDUyNEMsIDB4MEZCRDcyIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDMsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MEYzRDM1LCAweEUyMjhDQSwgMHgwRUM3QjIsIDB4RTIyOENBLCAweDBFMDRFOCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA0LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBGQ0VCRiwgMHhFMTgxQzIsIDB4MEYyNjU2LCAweEUxODFDMiwgMHgwRUY1MTYgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNSwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwRUM0MTcsIDB4MDczRTIyLCAweDBCMDYzMywgMHgwNzNFMjIsIDB4MDlDQTRBIH0gfSB9LAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfZXFfcHJlZl90IGVxcF8wZl8xXzAgPSB7CisgIC5zYW1wbGVfcmF0ZSAgID0gNDQxMDAsCisgIC5kZXZpY2VfaWQgICAgID0gMHgwZiwKKyAgLm91dHB1dF9pZCAgICAgPSBUQVNfT1VUUFVUX0lOVEVSTkFMX1NQS1IsCisgIC5zcGVha2VyX2lkICAgID0gMHgwMCwKKworICAuZHJjZSAgICAgICAgICA9ICZlcXBfMGZfMV8wX2RyY2UsCisKKyAgLmZpbHRlcl9jb3VudCAgPSAxMiwKKyAgLmJpcXVhZHMgICAgICAgPSBlcXBfMGZfMV8wX2JpcXVhZHMKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWMgdWludCB0YXMzMDAxY19tYXN0ZXJfdGFiW109eworCSAgICAgICAweDAsICAgICAgIDB4NzUsICAgICAgIDB4OWMsICAgICAgIDB4YmIsCisJICAgICAgMHhkYiwgICAgICAgMHhmYiwgICAgICAweDExZSwgICAgICAweDE0MywKKwkgICAgIDB4MTZiLCAgICAgIDB4MTk2LCAgICAgIDB4MWMzLCAgICAgIDB4MWY1LAorCSAgICAgMHgyMjksICAgICAgMHgyNjMsICAgICAgMHgyOWYsICAgICAgMHgyZTEsCisJICAgICAweDMyOCwgICAgICAweDM3MywgICAgICAweDNjNSwgICAgICAweDQxYiwKKwkgICAgIDB4NDc4LCAgICAgIDB4NGRjLCAgICAgIDB4NTQ3LCAgICAgIDB4NWI4LAorCSAgICAgMHg2MzMsICAgICAgMHg2YjUsICAgICAgMHg3NDAsICAgICAgMHg3ZDUsCisJICAgICAweDg3MywgICAgICAweDkxYywgICAgICAweDlkMiwgICAgICAweGE5MiwKKwkgICAgIDB4YjVlLCAgICAgIDB4YzM5LCAgICAgIDB4ZDIyLCAgICAgIDB4ZTE5LAorCSAgICAgMHhmMjAsICAgICAweDEwMzcsICAgICAweDExNjEsICAgICAweDEyOWUsCisJICAgIDB4MTNlZCwgICAgIDB4MTU1MSwgICAgIDB4MTZjYSwgICAgIDB4MTg1ZCwKKwkgICAgMHgxYTA4LCAgICAgMHgxYmNjLCAgICAgMHgxZGFjLCAgICAgMHgxZmE3LAorCSAgICAweDIxYzEsICAgICAweDIzZmEsICAgICAweDI2NTUsICAgICAweDI4ZDYsCisJICAgIDB4MmI3YywgICAgIDB4MmU0YSwgICAgIDB4MzE0MSwgICAgIDB4MzQ2NCwKKwkgICAgMHgzN2I0LCAgICAgMHgzYjM1LCAgICAgMHgzZWU5LCAgICAgMHg0MmQzLAorCSAgICAweDQ2ZjYsICAgICAweDRiNTMsICAgICAweDRmZjAsICAgICAweDU0Y2UsCisJICAgIDB4NTlmMiwgICAgIDB4NWY1ZiwgICAgIDB4NjUxOSwgICAgIDB4NmIyNCwKKwkgICAgMHg3MTgzLCAgICAgMHg3ODNjLCAgICAgMHg3ZjUzLCAgICAgMHg4NmNjLAorCSAgICAweDhlYWQsICAgICAweDk2ZmEsICAgICAweDlmYmEsICAgICAweGE4ZjIsCisJICAgIDB4YjJhNywgICAgIDB4YmNlMSwgICAgIDB4YzdhNSwgICAgIDB4ZDJmYSwKKwkgICAgMHhkZWU4LCAgICAgMHhlYjc1LCAgICAgMHhmOGFhLCAgICAweDEwNjhlLAorCSAgIDB4MTE1MmEsICAgIDB4MTI0ODcsICAgIDB4MTM0YWQsICAgIDB4MTQ1YTUsCisJICAgMHgxNTc3YiwgICAgMHgxNmEzNywgICAgMHgxN2RmNSwgICAgMHgxOTJiZCwKKwkgICAweDFhODkwLCAgICAweDFiZjdiLCAgICAweDFkNzhkLCAgICAweDFmMGQxLAorCSAgIDB4MjBiNTUsICAgIDB4MjI3MjcsICAgIDB4MjQ0NTYsICAgIDB4MjYyZjIsCisJICAgMHgyODMwYgorfTsKKworc3RhdGljIHVpbnQgdGFzMzAwMWNfbWl4ZXJfdGFiW109eworCSAgICAgICAweDAsICAgICAgMHg3NDgsICAgICAgMHg5YmUsICAgICAgMHhiYWYsCisJICAgICAweGRhNCwgICAgICAweGZiMSwgICAgIDB4MTFkZSwgICAgIDB4MTQzMSwKKwkgICAgMHgxNmFkLCAgICAgMHgxOTU5LCAgICAgMHgxYzM3LCAgICAgMHgxZjRiLAorCSAgICAweDIyOTgsICAgICAweDI2MjgsICAgICAweDI5ZmIsICAgICAweDJlMTIsCisJICAgIDB4MzI3ZCwgICAgIDB4MzczNCwgICAgIDB4M2M0NywgICAgIDB4NDFiNCwKKwkgICAgMHg0Nzg3LCAgICAgMHg0ZGJlLCAgICAgMHg1NDZkLCAgICAgMHg1Yjg2LAorCSAgICAweDYzMmUsICAgICAweDZiNTIsICAgICAweDc0MDAsICAgICAweDdkNTQsCisJICAgIDB4ODczYiwgICAgIDB4OTFjNiwgICAgIDB4OWQxYSwgICAgIDB4YTkyMCwKKwkgICAgMHhiNWU1LCAgICAgMHhjMzhjLCAgICAgMHhkMjFiLCAgICAgMHhlMThmLAorCSAgICAweGYxZjUsICAgIDB4MTAzNmEsICAgIDB4MTE2MGYsICAgIDB4MTI5ZDYsCisJICAgMHgxM2VkMCwgICAgMHgxNTUwYywgICAgMHgxNmNhMCwgICAgMHgxODVjOSwKKwkgICAweDFhMDdiLCAgICAweDFiY2MzLCAgICAweDFkYWI5LCAgICAweDFmYTc1LAorCSAgIDB4MjFjMGYsICAgIDB4MjNmYTMsICAgIDB4MjY1NTIsICAgIDB4MjhkNjQsCisJICAgMHgyYjdjOSwgICAgMHgyZTRhMiwgICAgMHgzMTQxMSwgICAgMHgzNDYzYiwKKwkgICAweDM3YjQ0LCAgICAweDNiMzUzLCAgICAweDNlZTk0LCAgICAweDQyZDMwLAorCSAgIDB4NDZmNTUsICAgIDB4NGI1MzMsICAgIDB4NGZlZmMsICAgIDB4NTRjZTUsCisJICAgMHg1OWYyNSwgICAgMHg1ZjVmNiwgICAgMHg2NTE5MywgICAgMHg2YjIzYywKKwkgICAweDcxODM1LCAgICAweDc4M2MzLCAgICAweDdmNTJjLCAgICAweDg2Y2MwLAorCSAgIDB4OGVhY2MsICAgIDB4OTZmYTUsICAgIDB4OWZiYTAsICAgIDB4YThmMWEsCisJICAgMHhiMmE3MSwgICAgMHhiY2UwYSwgICAgMHhjN2E0YSwgICAgMHhkMmZhMCwKKwkgICAweGRlZTdiLCAgICAweGViNzUyLCAgICAweGY4YTlmLCAgIDB4MTA2OGU0LAorCSAgMHgxMTUyYTMsICAgMHgxMjQ4NmEsICAgMHgxMzRhYzgsICAgMHgxNDVhNTUsCisJICAweDE1NzdhYywgICAweDE2YTM3MCwgICAweDE3ZGY1MSwgICAweDE5MmJjMiwKKwkgIDB4MWE4OGY4LCAgIDB4MWJmN2I3LCAgIDB4MWQ3OGM5LCAgIDB4MWYwZDA0LAorCSAgMHgyMGI1NDIsICAgMHgyMjcyNjgsICAgMHgyNDQ1NjQsICAgMHgyNjJmMjYsCisJICAweDI4MzBhZgorfTsKKworc3RhdGljIHVpbnQgdGFzMzAwMWNfdHJlYmxlX3RhYltdPXsKKwkgICAgICAweDk2LCAgICAgICAweDk1LCAgICAgICAweDk1LCAgICAgICAweDk0LAorCSAgICAgIDB4OTMsICAgICAgIDB4OTIsICAgICAgIDB4OTIsICAgICAgIDB4OTEsCisJICAgICAgMHg5MCwgICAgICAgMHg5MCwgICAgICAgMHg4ZiwgICAgICAgMHg4ZSwKKwkgICAgICAweDhkLCAgICAgICAweDhkLCAgICAgICAweDhjLCAgICAgICAweDhiLAorCSAgICAgIDB4OGEsICAgICAgIDB4OGEsICAgICAgIDB4ODksICAgICAgIDB4ODgsCisJICAgICAgMHg4OCwgICAgICAgMHg4NywgICAgICAgMHg4NiwgICAgICAgMHg4NSwKKwkgICAgICAweDg1LCAgICAgICAweDg0LCAgICAgICAweDgzLCAgICAgICAweDgzLAorCSAgICAgIDB4ODIsICAgICAgIDB4ODEsICAgICAgIDB4ODAsICAgICAgIDB4ODAsCisJICAgICAgMHg3ZiwgICAgICAgMHg3ZSwgICAgICAgMHg3ZSwgICAgICAgMHg3ZCwKKwkgICAgICAweDdjLCAgICAgICAweDdiLCAgICAgICAweDdiLCAgICAgICAweDdhLAorCSAgICAgIDB4NzksICAgICAgIDB4NzgsICAgICAgIDB4NzgsICAgICAgIDB4NzcsCisJICAgICAgMHg3NiwgICAgICAgMHg3NiwgICAgICAgMHg3NSwgICAgICAgMHg3NCwKKwkgICAgICAweDczLCAgICAgICAweDczLCAgICAgICAweDcyLCAgICAgICAweDcxLAorCSAgICAgIDB4NzEsICAgICAgIDB4NzAsICAgICAgIDB4NmUsICAgICAgIDB4NmQsCisJICAgICAgMHg2ZCwgICAgICAgMHg2YywgICAgICAgMHg2YiwgICAgICAgMHg2YSwKKwkgICAgICAweDY5LCAgICAgICAweDY4LCAgICAgICAweDY3LCAgICAgICAweDY2LAorCSAgICAgIDB4NjUsICAgICAgIDB4NjMsICAgICAgIDB4NjIsICAgICAgIDB4NjIsCisJICAgICAgMHg2MCwgICAgICAgMHg1ZiwgICAgICAgMHg1ZCwgICAgICAgMHg1YywKKwkgICAgICAweDVhLCAgICAgICAweDU4LCAgICAgICAweDU2LCAgICAgICAweDU1LAorCSAgICAgIDB4NTMsICAgICAgIDB4NTEsICAgICAgIDB4NGYsICAgICAgIDB4NGMsCisJICAgICAgMHg0YSwgICAgICAgMHg0OCwgICAgICAgMHg0NSwgICAgICAgMHg0MywKKwkgICAgICAweDQwLCAgICAgICAweDNkLCAgICAgICAweDNhLCAgICAgICAweDM3LAorCSAgICAgIDB4MzUsICAgICAgIDB4MzIsICAgICAgIDB4MmUsICAgICAgIDB4MmEsCisJICAgICAgMHgyNywgICAgICAgMHgyMiwgICAgICAgMHgxZSwgICAgICAgMHgxYSwKKwkgICAgICAweDE1LCAgICAgICAweDExLCAgICAgICAgMHhjLCAgICAgICAgMHg3LAorCSAgICAgICAweDEKK307CisKK3N0YXRpYyB1aW50IHRhczMwMDFjX2Jhc3NfdGFiW109eworCSAgICAgIDB4ODYsICAgICAgIDB4ODMsICAgICAgIDB4ODEsICAgICAgIDB4N2YsCisJICAgICAgMHg3ZCwgICAgICAgMHg3YiwgICAgICAgMHg3OSwgICAgICAgMHg3OCwKKwkgICAgICAweDc2LCAgICAgICAweDc1LCAgICAgICAweDc0LCAgICAgICAweDcyLAorCSAgICAgIDB4NzEsICAgICAgIDB4NmYsICAgICAgIDB4NmUsICAgICAgIDB4NmQsCisJICAgICAgMHg2YywgICAgICAgMHg2YiwgICAgICAgMHg2OSwgICAgICAgMHg2NywKKwkgICAgICAweDY1LCAgICAgICAweDY0LCAgICAgICAweDYxLCAgICAgICAweDYwLAorCSAgICAgIDB4NWUsICAgICAgIDB4NWQsICAgICAgIDB4NWMsICAgICAgIDB4NWIsCisJICAgICAgMHg1YSwgICAgICAgMHg1OSwgICAgICAgMHg1OCwgICAgICAgMHg1NywKKwkgICAgICAweDU2LCAgICAgICAweDU1LCAgICAgICAweDU1LCAgICAgICAweDU0LAorCSAgICAgIDB4NTMsICAgICAgIDB4NTIsICAgICAgIDB4NTAsICAgICAgIDB4NGYsCisJICAgICAgMHg0ZCwgICAgICAgMHg0YywgICAgICAgMHg0YiwgICAgICAgMHg0OSwKKwkgICAgICAweDQ3LCAgICAgICAweDQ1LCAgICAgICAweDQ0LCAgICAgICAweDQyLAorCSAgICAgIDB4NDEsICAgICAgIDB4M2YsICAgICAgIDB4M2UsICAgICAgIDB4M2QsCisJICAgICAgMHgzYywgICAgICAgMHgzYiwgICAgICAgMHgzOSwgICAgICAgMHgzOCwKKwkgICAgICAweDM3LCAgICAgICAweDM2LCAgICAgICAweDM1LCAgICAgICAweDM0LAorCSAgICAgIDB4MzMsICAgICAgIDB4MzEsICAgICAgIDB4MzAsICAgICAgIDB4MmYsCisJICAgICAgMHgyZSwgICAgICAgMHgyYywgICAgICAgMHgyYiwgICAgICAgMHgyYiwKKwkgICAgICAweDI5LCAgICAgICAweDI4LCAgICAgICAweDI3LCAgICAgICAweDI2LAorCSAgICAgIDB4MjUsICAgICAgIDB4MjQsICAgICAgIDB4MjIsICAgICAgIDB4MjEsCisJICAgICAgMHgyMCwgICAgICAgMHgxZSwgICAgICAgMHgxYywgICAgICAgMHgxOSwKKwkgICAgICAweDE4LCAgICAgICAweDE4LCAgICAgICAweDE3LCAgICAgICAweDE2LAorCSAgICAgIDB4MTUsICAgICAgIDB4MTQsICAgICAgIDB4MTMsICAgICAgIDB4MTIsCisJICAgICAgMHgxMSwgICAgICAgMHgxMCwgICAgICAgIDB4ZiwgICAgICAgIDB4ZSwKKwkgICAgICAgMHhkLCAgICAgICAgMHhiLCAgICAgICAgMHhhLCAgICAgICAgMHg5LAorCSAgICAgICAweDgsICAgICAgICAweDYsICAgICAgICAweDQsICAgICAgICAweDIsCisJICAgICAgIDB4MQorfTsKKworc3RydWN0IHRhc19nYWluX3QgdGFzMzAwMWNfZ2FpbiA9IHsKKyAgLm1hc3RlciAgPSB0YXMzMDAxY19tYXN0ZXJfdGFiLAorICAudHJlYmxlICA9IHRhczMwMDFjX3RyZWJsZV90YWIsCisgIC5iYXNzICAgID0gdGFzMzAwMWNfYmFzc190YWIsCisgIC5taXhlciAgID0gdGFzMzAwMWNfbWl4ZXJfdGFiCit9OworCitzdHJ1Y3QgdGFzX2VxX3ByZWZfdCAqdGFzMzAwMWNfZXFfcHJlZnNbXT17CisgICZlcXBfMGVfMl8xLAorICAmZXFwXzEwXzFfMCwKKyAgJmVxcF8xNV8yXzEsCisgICZlcXBfMTVfMV8wLAorICAmZXFwXzBmXzJfMSwKKyAgJmVxcF8wZl8xXzAsCisgIE5VTEwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwNC5jIGIvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmVhYWNhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDQuYwpAQCAtMCwwICsxLDExNDAgQEAKKy8qCisgKiBEcml2ZXIgZm9yIHRoZSBpMmMvaTJzIGJhc2VkIFRBMzAwNCBzb3VuZCBjaGlwIHVzZWQKKyAqIG9uIHNvbWUgQXBwbGUgaGFyZHdhcmUuIEFsc28ga25vd24gYXMgInNuYXBwZXIiLgorICoKKyAqIFRvYmlhcyBTYXJnZWFudCA8dG9iaWFzLnNhcmdlYW50QGJpZ3BvbmQuY29tPgorICogQmFzZWQgdXBvbiB0YXMzMDAxYy5jIGJ5IENocmlzdG9waGVyIEMuIENoaW1lbGlzIDxjaHJpc0BkZWJpYW4ub3JnPjoKKyAqCisgKiBJbnB1dCBzdXBwb3J0IGJ5IFJlbnpvIERhdm9saSA8cmVuem9AY3MudW5pYm8uaXQ+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCisjaW5jbHVkZSAiZG1hc291bmQuaCIKKyNpbmNsdWRlICJ0YXNfY29tbW9uLmgiCisjaW5jbHVkZSAidGFzMzAwNC5oIgorCisjaW5jbHVkZSAidGFzX2lvY3RsLmgiCisKKy8qICNkZWZpbmUgREVCVUdfRFJDRSAqLworCisjZGVmaW5lIFRBUzMwMDRfQklRVUFEX0ZJTFRFUl9DT1VOVCAgNworI2RlZmluZSBUQVMzMDA0X0JJUVVBRF9DSEFOTkVMX0NPVU5UIDIKKworI2RlZmluZSBWT0xfREVGQVVMVAkoMTAwICogNCAvIDUpCisjZGVmaW5lIElOUFVUX0RFRkFVTFQJKDEwMCAqIDQgLyA1KQorI2RlZmluZSBCQVNTX0RFRkFVTFQJKDEwMCAvIDIpCisjZGVmaW5lIFRSRUJMRV9ERUZBVUxUCSgxMDAgLyAyKQorCitzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgeworCXN0cnVjdCB0YXNfZGF0YV90IHN1cGVyOworCWludCBkZXZpY2VfaWQ7CisJaW50IG91dHB1dF9pZDsKKwlpbnQgc3BlYWtlcl9pZDsKKwlzdHJ1Y3QgdGFzX2RyY2VfdCBkcmNlX3N0YXRlOworfTsKKworI2RlZmluZSBNQUtFX1RJTUUoc2VjLHVzZWMpICgoKHNlYyk8PDEyKSArICg1MDAwMCsodXNlYy8xMCkqKDE8PDEyKSkvMTAwMDAwKQorCisjZGVmaW5lIE1BS0VfUkFUSU8oaSxmKSAoKChpKTw8OCkgKyAoKDUwMCsoZikqKDE8PDgpKS8xMDAwKSkKKworCitzdGF0aWMgY29uc3QgdW5pb24gdGFzX2JpcXVhZF90IHRhczMwMDRfZXFfdW5pdHkgPSB7CisJLmJ1ZgkJID0geyAweDEwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAgfSwKK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNfZHJjZV90IHRhczMwMDRfZHJjZV9taW4gPSB7CisJLmVuYWJsZQkJPSAxLAorCS5hYm92ZQkJPSB7IC52YWwgPSBNQUtFX1JBVElPKDE2LDApLCAuZXhwYW5kID0gMCB9LAorCS5iZWxvdwkJPSB7IC52YWwgPSBNQUtFX1JBVElPKDIsMCksIC5leHBhbmQgPSAwIH0sCisJLnRocmVzaG9sZAk9IC0weDU5YTAsCisJLmVuZXJneQkJPSBNQUtFX1RJTUUoMCwgIDE3MDApLAorCS5hdHRhY2sJCT0gTUFLRV9USU1FKDAsICAxNzAwKSwKKwkuZGVjYXkJCT0gTUFLRV9USU1FKDAsICAxNzAwKSwKK307CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCB0YXNfZHJjZV90IHRhczMwMDRfZHJjZV9tYXggPSB7CisJLmVuYWJsZQkJPSAxLAorCS5hYm92ZQkJPSB7IC52YWwgPSBNQUtFX1JBVElPKDEsNTAwKSwgLmV4cGFuZCA9IDEgfSwKKwkuYmVsb3cJCT0geyAudmFsID0gTUFLRV9SQVRJTygyLDApLCAuZXhwYW5kID0gMSB9LAorCS50aHJlc2hvbGQJPSAtMHgwLAorCS5lbmVyZ3kJCT0gTUFLRV9USU1FKDIsNDAwMDAwKSwKKwkuYXR0YWNrCQk9IE1BS0VfVElNRSgyLDQwMDAwMCksCisJLmRlY2F5CQk9IE1BS0VfVElNRSgyLDQwMDAwMCksCit9OworCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCB0aW1lX2NvbnN0YW50c1tdPXsKKwlNQUtFX1RJTUUoMCwgIDE3MDApLAorCU1BS0VfVElNRSgwLCAgMzUwMCksCisJTUFLRV9USU1FKDAsICA2NzAwKSwKKwlNQUtFX1RJTUUoMCwgMTMwMDApLAorCU1BS0VfVElNRSgwLCAyNjAwMCksCisJTUFLRV9USU1FKDAsIDUzMDAwKSwKKwlNQUtFX1RJTUUoMCwxMDYwMDApLAorCU1BS0VfVElNRSgwLDIxMjAwMCksCisJTUFLRV9USU1FKDAsNDI1MDAwKSwKKwlNQUtFX1RJTUUoMCw4NTAwMDApLAorCU1BS0VfVElNRSgxLDcwMDAwMCksCisJTUFLRV9USU1FKDIsNDAwMDAwKSwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBhYm92ZV90aHJlc2hvbGRfY29tcHJlc3Npb25fcmF0aW9bXT17CisJTUFLRV9SQVRJTyggMSwgNzApLAorCU1BS0VfUkFUSU8oIDEsMTQwKSwKKwlNQUtFX1JBVElPKCAxLDIzMCksCisJTUFLRV9SQVRJTyggMSwzMzApLAorCU1BS0VfUkFUSU8oIDEsNDUwKSwKKwlNQUtFX1JBVElPKCAxLDYwMCksCisJTUFLRV9SQVRJTyggMSw3ODApLAorCU1BS0VfUkFUSU8oIDIsICAwKSwKKwlNQUtFX1JBVElPKCAyLDI5MCksCisJTUFLRV9SQVRJTyggMiw2NzApLAorCU1BS0VfUkFUSU8oIDMsMjAwKSwKKwlNQUtFX1JBVElPKCA0LCAgMCksCisJTUFLRV9SQVRJTyggNSwzMzApLAorCU1BS0VfUkFUSU8oIDgsICAwKSwKKwlNQUtFX1JBVElPKDE2LCAgMCksCit9OworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgYWJvdmVfdGhyZXNob2xkX2V4cGFuc2lvbl9yYXRpb1tdPXsKKwlNQUtFX1JBVElPKDEsIDYwKSwKKwlNQUtFX1JBVElPKDEsMTMwKSwKKwlNQUtFX1JBVElPKDEsMTkwKSwKKwlNQUtFX1JBVElPKDEsMjUwKSwKKwlNQUtFX1JBVElPKDEsMzEwKSwKKwlNQUtFX1JBVElPKDEsMzgwKSwKKwlNQUtFX1JBVElPKDEsNDQwKSwKKwlNQUtFX1JBVElPKDEsNTAwKQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGJlbG93X3RocmVzaG9sZF9jb21wcmVzc2lvbl9yYXRpb1tdPXsKKwlNQUtFX1JBVElPKDEsIDcwKSwKKwlNQUtFX1JBVElPKDEsMTQwKSwKKwlNQUtFX1JBVElPKDEsMjMwKSwKKwlNQUtFX1JBVElPKDEsMzMwKSwKKwlNQUtFX1JBVElPKDEsNDUwKSwKKwlNQUtFX1JBVElPKDEsNjAwKSwKKwlNQUtFX1JBVElPKDEsNzgwKSwKKwlNQUtFX1JBVElPKDIsICAwKQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IGJlbG93X3RocmVzaG9sZF9leHBhbnNpb25fcmF0aW9bXT17CisJTUFLRV9SQVRJTygxLCA2MCksCisJTUFLRV9SQVRJTygxLDEzMCksCisJTUFLRV9SQVRJTygxLDE5MCksCisJTUFLRV9SQVRJTygxLDI1MCksCisJTUFLRV9SQVRJTygxLDMxMCksCisJTUFLRV9SQVRJTygxLDM4MCksCisJTUFLRV9SQVRJTygxLDQ0MCksCisJTUFLRV9SQVRJTygxLDUwMCksCisJTUFLRV9SQVRJTygxLDU2MCksCisJTUFLRV9SQVRJTygxLDYzMCksCisJTUFLRV9SQVRJTygxLDY5MCksCisJTUFLRV9SQVRJTygxLDc1MCksCisJTUFLRV9SQVRJTygxLDgxMCksCisJTUFLRV9SQVRJTygxLDg4MCksCisJTUFLRV9SQVRJTygxLDk0MCksCisJTUFLRV9SQVRJTygyLCAgMCkKK307CisKK3N0YXRpYyBpbmxpbmUgaW50CitzZWFyY2goCXVuc2lnbmVkIHNob3J0IHZhbCwKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqYXJyLAorCWNvbnN0IGludCBhcnJzaXplKSB7CisJLyoKKwkgKiBUaGlzIGNvdWxkIGJlIGEgYmluYXJ5IHNlYXJjaCwgYnV0IGZvciBzbWFsbCB0YWJsZXMsCisJICogYSBsaW5lYXIgc2VhcmNoIGlzIGxpa2VseSB0byBiZSBmYXN0ZXIKKwkgKi8KKworCWludCBpOworCisJZm9yIChpPTA7IGkgPCBhcnJzaXplOyBpKyspCisJCWlmIChhcnJbaV0gPj0gdmFsKQorCQkJZ290byBfMTsKKwlyZXR1cm4gYXJyc2l6ZS0xOworIF8xOgorCWlmIChpID09IDApCisJCXJldHVybiAwOworCXJldHVybiAoYXJyW2ldLXZhbCA8IHZhbC1hcnJbaS0xXSkgPyBpIDogaS0xOworfQorCisjZGVmaW5lIFNFQVJDSChhLCBiKSBzZWFyY2goYSwgYiwgQVJSQVlfU0laRShiKSkKKworc3RhdGljIGlubGluZSBpbnQKK3RpbWVfaW5kZXgodW5zaWduZWQgc2hvcnQgdGltZSkKK3sKKwlyZXR1cm4gU0VBUkNIKHRpbWUsIHRpbWVfY29uc3RhbnRzKTsKK30KKworCitzdGF0aWMgaW5saW5lIGludAorYWJvdmVfdGhyZXNob2xkX2NvbXByZXNzaW9uX2luZGV4KHVuc2lnbmVkIHNob3J0IHJhdGlvKQoreworCXJldHVybiBTRUFSQ0gocmF0aW8sIGFib3ZlX3RocmVzaG9sZF9jb21wcmVzc2lvbl9yYXRpbyk7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQKK2Fib3ZlX3RocmVzaG9sZF9leHBhbnNpb25faW5kZXgodW5zaWduZWQgc2hvcnQgcmF0aW8pCit7CisJcmV0dXJuIFNFQVJDSChyYXRpbywgYWJvdmVfdGhyZXNob2xkX2V4cGFuc2lvbl9yYXRpbyk7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQKK2JlbG93X3RocmVzaG9sZF9jb21wcmVzc2lvbl9pbmRleCh1bnNpZ25lZCBzaG9ydCByYXRpbykKK3sKKwlyZXR1cm4gU0VBUkNIKHJhdGlvLCBiZWxvd190aHJlc2hvbGRfY29tcHJlc3Npb25fcmF0aW8pOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50CitiZWxvd190aHJlc2hvbGRfZXhwYW5zaW9uX2luZGV4KHVuc2lnbmVkIHNob3J0IHJhdGlvKQoreworCXJldHVybiBTRUFSQ0gocmF0aW8sIGJlbG93X3RocmVzaG9sZF9leHBhbnNpb25fcmF0aW8pOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGNoYXIgZGJfdG9fcmVndmFsKHNob3J0IGRiKSB7CisJaW50IHI9MDsKKworCXI9KGRiKzB4NTlhMCkgLyAweDYwOworCisJaWYgKHIgPCAweDkxKSByZXR1cm4gMHg5MTsKKwlpZiAociA+IDB4ZWYpIHJldHVybiAweGVmOworCXJldHVybiByOworfQorCitzdGF0aWMgaW5saW5lIHNob3J0IHF1YW50aXplX2RiKHNob3J0IGRiKQoreworCXJldHVybiBkYl90b19yZWd2YWwoZGIpICogMHg2MCAtIDB4NTlhMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3JlZ2lzdGVyX3dpZHRoKGVudW0gdGFzMzAwNF9yZWdfdCByKQoreworCXN3aXRjaChyKSB7CisJY2FzZSBUQVMzMDA0X1JFR19NQ1I6CisgCWNhc2UgVEFTMzAwNF9SRUdfVFJFQkxFOgorCWNhc2UgVEFTMzAwNF9SRUdfQkFTUzoKKwljYXNlIFRBUzMwMDRfUkVHX0FOQUxPR19DVFJMOgorCWNhc2UgVEFTMzAwNF9SRUdfVEVTVDE6CisJY2FzZSBUQVMzMDA0X1JFR19URVNUMjoKKwljYXNlIFRBUzMwMDRfUkVHX01DUjI6CisJCXJldHVybiAxOworCisJY2FzZSBUQVMzMDA0X1JFR19MRUZUX0xPVURfQklRVUFEX0dBSU46CisJY2FzZSBUQVMzMDA0X1JFR19SSUdIVF9MT1VEX0JJUVVBRF9HQUlOOgorCQlyZXR1cm4gMzsKKworCWNhc2UgVEFTMzAwNF9SRUdfRFJDOgorCWNhc2UgVEFTMzAwNF9SRUdfVk9MVU1FOgorCQlyZXR1cm4gNjsKKworCWNhc2UgVEFTMzAwNF9SRUdfTEVGVF9NSVhFUjoKKwljYXNlIFRBUzMwMDRfUkVHX1JJR0hUX01JWEVSOgorCQlyZXR1cm4gOTsKKworCWNhc2UgVEFTMzAwNF9SRUdfVEVTVDoKKwkJcmV0dXJuIDEwOworCisJY2FzZSBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDA6CisJY2FzZSBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDE6CisJY2FzZSBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDI6CisJY2FzZSBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDM6CisJY2FzZSBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDQ6CisJY2FzZSBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDU6CisJY2FzZSBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDY6CisKKwljYXNlIFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDA6CisJY2FzZSBUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQxOgorCWNhc2UgVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMjoKKwljYXNlIFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDM6CisJY2FzZSBUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQ0OgorCWNhc2UgVEFTMzAwNF9SRUdfUklHSFRfQklRVUFENToKKwljYXNlIFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDY6CisKKwljYXNlIFRBUzMwMDRfUkVHX0xFRlRfTE9VRF9CSVFVQUQ6CisJY2FzZSBUQVMzMDA0X1JFR19SSUdIVF9MT1VEX0JJUVVBRDoKKwkJcmV0dXJuIDE1OworCisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X3dyaXRlX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsCisJCQllbnVtIHRhczMwMDRfcmVnX3QgcmVnX251bSwKKwkJCWNoYXIgKmRhdGEsCisJCQl1aW50IHdyaXRlX21vZGUpCit7CisJaWYgKHJlZ19udW09PVRBUzMwMDRfUkVHX01DUiB8fAorCSAgICByZWdfbnVtPT1UQVMzMDA0X1JFR19CQVNTIHx8CisJICAgIHJlZ19udW09PVRBUzMwMDRfUkVHX1RSRUJMRSB8fAorCSAgICByZWdfbnVtPT1UQVMzMDA0X1JFR19BTkFMT0dfQ1RSTCkgeworCQlyZXR1cm4gdGFzX3dyaXRlX2J5dGVfcmVnaXN0ZXIoJnNlbGYtPnN1cGVyLAorCQkJCQkgICAgICAgKHVpbnQpcmVnX251bSwKKwkJCQkJICAgICAgICpkYXRhLAorCQkJCQkgICAgICAgd3JpdGVfbW9kZSk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIHRhc193cml0ZV9yZWdpc3Rlcigmc2VsZi0+c3VwZXIsCisJCQkJCSAgKHVpbnQpcmVnX251bSwKKwkJCQkJICByZWdpc3Rlcl93aWR0aChyZWdfbnVtKSwKKwkJCQkJICBkYXRhLAorCQkJCQkgIHdyaXRlX21vZGUpOworCX0KK30KKworc3RhdGljIGludAordGFzMzAwNF9zeW5jX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsCisJCQllbnVtIHRhczMwMDRfcmVnX3QgcmVnX251bSkKK3sKKwlpZiAocmVnX251bT09VEFTMzAwNF9SRUdfTUNSIHx8CisJICAgIHJlZ19udW09PVRBUzMwMDRfUkVHX0JBU1MgfHwKKwkgICAgcmVnX251bT09VEFTMzAwNF9SRUdfVFJFQkxFIHx8CisJICAgIHJlZ19udW09PVRBUzMwMDRfUkVHX0FOQUxPR19DVFJMKSB7CisJCXJldHVybiB0YXNfc3luY19ieXRlX3JlZ2lzdGVyKCZzZWxmLT5zdXBlciwKKwkJCQkJICAgICAgKHVpbnQpcmVnX251bSwKKwkJCQkJICAgICAgcmVnaXN0ZXJfd2lkdGgocmVnX251bSkpOworCX0gZWxzZSB7CisJCXJldHVybiB0YXNfc3luY19yZWdpc3Rlcigmc2VsZi0+c3VwZXIsCisJCQkJCSAodWludClyZWdfbnVtLAorCQkJCQkgcmVnaXN0ZXJfd2lkdGgocmVnX251bSkpOworCX0KK30KKworc3RhdGljIGludAordGFzMzAwNF9yZWFkX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsCisJCQllbnVtIHRhczMwMDRfcmVnX3QgcmVnX251bSwKKwkJCWNoYXIgKmRhdGEsCisJCQl1aW50IHdyaXRlX21vZGUpCit7CisJcmV0dXJuIHRhc19yZWFkX3JlZ2lzdGVyKCZzZWxmLT5zdXBlciwKKwkJCQkgKHVpbnQpcmVnX251bSwKKwkJCQkgcmVnaXN0ZXJfd2lkdGgocmVnX251bSksCisJCQkJIGRhdGEpOworfQorCitzdGF0aWMgaW5saW5lIGludAordGFzMzAwNF9mYXN0X2xvYWQoc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmLCBpbnQgZmFzdCkKK3sKKwlpZiAoZmFzdCkKKwkJc2VsZi0+c3VwZXIuc2hhZG93W1RBUzMwMDRfUkVHX01DUl1bMF0gfD0gMHg4MDsKKwllbHNlCisJCXNlbGYtPnN1cGVyLnNoYWRvd1tUQVMzMDA0X1JFR19NQ1JdWzBdICY9IDB4N2Y7CisJcmV0dXJuIHRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX01DUik7Cit9CisKK3N0YXRpYyB1aW50Cit0YXMzMDA0X3N1cHBvcnRlZF9taXhlcnMoc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmKQoreworCXJldHVybiBTT1VORF9NQVNLX1ZPTFVNRSB8CisJCVNPVU5EX01BU0tfUENNIHwKKwkJU09VTkRfTUFTS19BTFRQQ00gfAorCQlTT1VORF9NQVNLX0lNSVggfAorCQlTT1VORF9NQVNLX1RSRUJMRSB8CisJCVNPVU5EX01BU0tfQkFTUyB8CisJCVNPVU5EX01BU0tfTUlDIHwKKwkJU09VTkRfTUFTS19MSU5FOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X21peGVyX2lzX3N0ZXJlbyhzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsIGludCBtaXhlcikKK3sKKwlzd2l0Y2gobWl4ZXIpIHsKKwljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwljYXNlIFNPVU5EX01JWEVSX0FMVFBDTToKKwljYXNlIFNPVU5EX01JWEVSX0lNSVg6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIHVpbnQKK3RhczMwMDRfc3RlcmVvX21peGVycyhzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYpCit7CisJdWludCByID0gdGFzMzAwNF9zdXBwb3J0ZWRfbWl4ZXJzKHNlbGYpOworCXVpbnQgaTsKKwkKKwlmb3IgKGk9MTsgaTxTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJaWYgKHImKDE8PGkpICYmICF0YXMzMDA0X21peGVyX2lzX3N0ZXJlbyhzZWxmLGkpKQorCQkJciAmPSB+KDE8PGkpOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X2dldF9taXhlcl9sZXZlbChzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsIGludCBtaXhlciwgdWludCAqbGV2ZWwpCit7CisJaWYgKCFzZWxmKQorCQlyZXR1cm4gLTE7CisKKwkqbGV2ZWwgPSBzZWxmLT5zdXBlci5taXhlclttaXhlcl07CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmLCBpbnQgbWl4ZXIsIHVpbnQgbGV2ZWwpCit7CisJaW50IHJjOworCXRhc19zaGFkb3dfdCAqc2hhZG93OworCXVpbnQgdGVtcDsKKwl1aW50IG9mZnNldD0wOworCisJaWYgKCFzZWxmKQorCQlyZXR1cm4gLTE7CisKKwlzaGFkb3cgPSBzZWxmLT5zdXBlci5zaGFkb3c7CisKKwlpZiAoIXRhczMwMDRfbWl4ZXJfaXNfc3RlcmVvKHNlbGYsbWl4ZXIpKQorCQlsZXZlbCA9IHRhc19tb25vX3RvX3N0ZXJlbyhsZXZlbCk7CisJc3dpdGNoKG1peGVyKSB7CisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCXRlbXAgPSB0YXMzMDA0X2dhaW4ubWFzdGVyW2xldmVsJjB4ZmZdOworCQlTRVRfNF8yMChzaGFkb3dbVEFTMzAwNF9SRUdfVk9MVU1FXSwgMCwgdGVtcCk7CisJCXRlbXAgPSB0YXMzMDA0X2dhaW4ubWFzdGVyWyhsZXZlbD4+OCkmMHhmZl07CisJCVNFVF80XzIwKHNoYWRvd1tUQVMzMDA0X1JFR19WT0xVTUVdLCAzLCB0ZW1wKTsKKwkJcmMgPSB0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19WT0xVTUUpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0lNSVg6CisJCW9mZnNldCArPSAzOworCWNhc2UgU09VTkRfTUlYRVJfQUxUUENNOgorCQlvZmZzZXQgKz0gMzsKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwkJLyoKKwkJICogRG9uJ3QgbG9hZCB0aGVzZSBpbiBmYXN0IG1vZGUuIFRoZSBkb2N1bWVudGF0aW9uCisJCSAqIHNheXMgaXQgY2FuIGJlIGRvbmUgaW4gZWl0aGVyIG1vZGUsIGJ1dCB0ZXN0aW5nIGl0CisJCSAqIHNob3dzIHRoYXQgZmFzdCBtb2RlIHByb2R1Y2VzIHVnbHkgY2xpY2tpbmcuCisJCSovCisJCS8qIHRhczMwMDRfZmFzdF9sb2FkKHNlbGYsMSk7ICovCisJCXRlbXAgPSB0YXMzMDA0X2dhaW4ubWl4ZXJbbGV2ZWwmMHhmZl07CisJCVNFVF80XzIwKHNoYWRvd1tUQVMzMDA0X1JFR19MRUZUX01JWEVSXSwgb2Zmc2V0LCB0ZW1wKTsKKwkJdGVtcCA9IHRhczMwMDRfZ2Fpbi5taXhlclsobGV2ZWw+PjgpJjB4ZmZdOworCQlTRVRfNF8yMChzaGFkb3dbVEFTMzAwNF9SRUdfUklHSFRfTUlYRVJdLCBvZmZzZXQsIHRlbXApOworCQlyYyA9IHRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfTUlYRVIpOworCQlpZiAocmMgPT0gMCkKKwkJCXJjPXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1JJR0hUX01JWEVSKTsKKwkJLyogdGFzMzAwNF9mYXN0X2xvYWQoc2VsZiwwKTsgKi8KKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9UUkVCTEU6CisJCXRlbXAgPSB0YXMzMDA0X2dhaW4udHJlYmxlW2xldmVsJjB4ZmZdOworCQlzaGFkb3dbVEFTMzAwNF9SRUdfVFJFQkxFXVswXT10ZW1wJjB4ZmY7CisJCXJjID0gdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfVFJFQkxFKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9CQVNTOgorCQl0ZW1wID0gdGFzMzAwNF9nYWluLmJhc3NbbGV2ZWwmMHhmZl07CisJCXNoYWRvd1tUQVMzMDA0X1JFR19CQVNTXVswXT10ZW1wJjB4ZmY7CisJCXJjID0gdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfQkFTUyk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQlpZiAoKGxldmVsJjB4ZmYpPjApIHsKKwkJCXNvZnR3YXJlX2lucHV0X3ZvbHVtZSA9IFNXX0lOUFVUX1ZPTFVNRV9TQ0FMRSAqIChsZXZlbCYweGZmKTsKKwkJCWlmIChzZWxmLT5zdXBlci5taXhlclttaXhlcl0gPT0gMCkgeworCQkJCXNlbGYtPnN1cGVyLm1peGVyW1NPVU5EX01JWEVSX0xJTkVdID0gMDsKKwkJCQlzaGFkb3dbVEFTMzAwNF9SRUdfQU5BTE9HX0NUUkxdWzBdPTB4YzI7CisJCQkJcmMgPSB0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19BTkFMT0dfQ1RSTCk7CisJCQl9IGVsc2UgcmM9MDsKKwkJfSBlbHNlIHsKKwkJCXNlbGYtPnN1cGVyLm1peGVyW1NPVU5EX01JWEVSX0xJTkVdID0gU1dfSU5QVVRfVk9MVU1FX0RFRkFVTFQ7CisJCQlzb2Z0d2FyZV9pbnB1dF92b2x1bWUgPSBTV19JTlBVVF9WT0xVTUVfU0NBTEUgKgorCQkJCShzZWxmLT5zdXBlci5taXhlcltTT1VORF9NSVhFUl9MSU5FXSYweGZmKTsKKwkJCXNoYWRvd1tUQVMzMDA0X1JFR19BTkFMT0dfQ1RSTF1bMF09MHgwMDsKKwkJCXJjID0gdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfQU5BTE9HX0NUUkwpOworCQl9CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfTElORToKKwkJaWYgKHNlbGYtPnN1cGVyLm1peGVyW1NPVU5EX01JWEVSX01JQ10gPT0gMCkgeworCQkJc29mdHdhcmVfaW5wdXRfdm9sdW1lID0gU1dfSU5QVVRfVk9MVU1FX1NDQUxFICogKGxldmVsJjB4ZmYpOworCQkJcmM9MDsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC0xOworCQlicmVhazsKKwl9CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCXNlbGYtPnN1cGVyLm1peGVyW21peGVyXSA9IGxldmVsOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X2xlYXZlX3NsZWVwKHN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZikKK3sKKwl1bnNpZ25lZCBjaGFyIG1jciA9ICgxPDw2KSsoMjw8NCkrKDI8PDIpOworCisJaWYgKCFzZWxmKQorCQlyZXR1cm4gLTE7CisKKwkvKiBNYWtlIHN1cmUgc29tZXRoaW5nIGFuc3dlcnMgb24gdGhlIGkyYyBidXMgKi8KKwlpZiAodGFzMzAwNF93cml0ZV9yZWdpc3RlcihzZWxmLCBUQVMzMDA0X1JFR19NQ1IsICZtY3IsCisJICAgIFdSSVRFX05PUk1BTCB8IEZPUkNFX1dSSVRFKSA8IDApCisJCXJldHVybiAtMTsKKworCXRhczMwMDRfZmFzdF9sb2FkKHNlbGYsIDEpOworCisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMCk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMSk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMik7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMyk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFENCk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFENSk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfUklHSFRfQklRVUFENik7CisKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDApOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMSk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQyKTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDMpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfQklRVUFENCk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQ1KTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDYpOworCisJdGFzMzAwNF9mYXN0X2xvYWQoc2VsZiwgMCk7CisKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19WT0xVTUUpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfTUlYRVIpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1JJR0hUX01JWEVSKTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19UUkVCTEUpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0JBU1MpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0FOQUxPR19DVFJMKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X2VudGVyX3NsZWVwKHN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZikKK3sKKwlpZiAoIXNlbGYpCisJCXJldHVybiAtMTsgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfc3luY19iaXF1YWQoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCXVfaW50IGNoYW5uZWwsCisJCQl1X2ludCBmaWx0ZXIpCit7CisJZW51bSB0YXMzMDA0X3JlZ190IHJlZzsKKworCWlmIChjaGFubmVsID49IFRBUzMwMDRfQklRVUFEX0NIQU5ORUxfQ09VTlQgfHwKKwkgICAgZmlsdGVyICA+PSBUQVMzMDA0X0JJUVVBRF9GSUxURVJfQ09VTlQpIHJldHVybiAtRUlOVkFMOworCisJcmVnPSggY2hhbm5lbCA/IFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDAgOiBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDAgKSArIGZpbHRlcjsKKworCXJldHVybiB0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixyZWcpOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X3dyaXRlX2JpcXVhZF9zaGFkb3coCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCQl1X2ludCBjaGFubmVsLAorCQkJCXVfaW50IGZpbHRlciwKKwkJCQljb25zdCB1bmlvbiB0YXNfYmlxdWFkX3QgKmJpcXVhZCkKK3sKKwl0YXNfc2hhZG93X3QgKnNoYWRvdz1zZWxmLT5zdXBlci5zaGFkb3c7CisJZW51bSB0YXMzMDA0X3JlZ190IHJlZzsKKworCWlmIChjaGFubmVsID49IFRBUzMwMDRfQklRVUFEX0NIQU5ORUxfQ09VTlQgfHwKKwkgICAgZmlsdGVyICA+PSBUQVMzMDA0X0JJUVVBRF9GSUxURVJfQ09VTlQpIHJldHVybiAtRUlOVkFMOworCisJcmVnPSggY2hhbm5lbCA/IFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDAgOiBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDAgKSArIGZpbHRlcjsKKworCVNFVF80XzIwKHNoYWRvd1tyZWddLCAwLGJpcXVhZC0+Y29lZmYuYjApOworCVNFVF80XzIwKHNoYWRvd1tyZWddLCAzLGJpcXVhZC0+Y29lZmYuYjEpOworCVNFVF80XzIwKHNoYWRvd1tyZWddLCA2LGJpcXVhZC0+Y29lZmYuYjIpOworCVNFVF80XzIwKHNoYWRvd1tyZWddLCA5LGJpcXVhZC0+Y29lZmYuYTEpOworCVNFVF80XzIwKHNoYWRvd1tyZWddLDEyLGJpcXVhZC0+Y29lZmYuYTIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfd3JpdGVfYmlxdWFkKAlzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsCisJCQl1X2ludCBjaGFubmVsLAorCQkJdV9pbnQgZmlsdGVyLAorCQkJY29uc3QgdW5pb24gdGFzX2JpcXVhZF90ICpiaXF1YWQpCit7CisJaW50IHJjOworCisJcmM9dGFzMzAwNF93cml0ZV9iaXF1YWRfc2hhZG93KHNlbGYsIGNoYW5uZWwsIGZpbHRlciwgYmlxdWFkKTsKKwlpZiAocmMgPCAwKSByZXR1cm4gcmM7CisKKwlyZXR1cm4gdGFzMzAwNF9zeW5jX2JpcXVhZChzZWxmLCBjaGFubmVsLCBmaWx0ZXIpOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X3dyaXRlX2JpcXVhZF9saXN0KAlzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsCisJCQkJdV9pbnQgZmlsdGVyX2NvdW50LAorCQkJCXVfaW50IGZsYWdzLAorCQkJCXN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCAqYmlxdWFkcykKK3sKKwlpbnQgaTsKKwlpbnQgcmM7CisKKwlpZiAoZmxhZ3MgJiBUQVNfQklRVUFEX0ZBU1RfTE9BRCkgdGFzMzAwNF9mYXN0X2xvYWQoc2VsZiwxKTsKKworCWZvciAoaT0wOyBpPGZpbHRlcl9jb3VudDsgaSsrKSB7CisJCXJjPXRhczMwMDRfd3JpdGVfYmlxdWFkKHNlbGYsCisJCQkJCWJpcXVhZHNbaV0uY2hhbm5lbCwKKwkJCQkJYmlxdWFkc1tpXS5maWx0ZXIsCisJCQkJCSZiaXF1YWRzW2ldLmRhdGEpOworCQlpZiAocmMgPCAwKSBicmVhazsKKwl9CisKKwlpZiAoZmxhZ3MgJiBUQVNfQklRVUFEX0ZBU1RfTE9BRCkgdGFzMzAwNF9mYXN0X2xvYWQoc2VsZiwwKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAordGFzMzAwNF9yZWFkX2JpcXVhZCgJc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmLAorCQkJdV9pbnQgY2hhbm5lbCwKKwkJCXVfaW50IGZpbHRlciwKKwkJCXVuaW9uIHRhc19iaXF1YWRfdCAqYmlxdWFkKQoreworCXRhc19zaGFkb3dfdCAqc2hhZG93PXNlbGYtPnN1cGVyLnNoYWRvdzsKKwllbnVtIHRhczMwMDRfcmVnX3QgcmVnOworCisJaWYgKGNoYW5uZWwgPj0gVEFTMzAwNF9CSVFVQURfQ0hBTk5FTF9DT1VOVCB8fAorCSAgICBmaWx0ZXIgID49IFRBUzMwMDRfQklRVUFEX0ZJTFRFUl9DT1VOVCkgcmV0dXJuIC1FSU5WQUw7CisKKwlyZWc9KCBjaGFubmVsID8gVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMCA6IFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMCApICsgZmlsdGVyOworCisJYmlxdWFkLT5jb2VmZi5iMD1HRVRfNF8yMChzaGFkb3dbcmVnXSwgMCk7CisJYmlxdWFkLT5jb2VmZi5iMT1HRVRfNF8yMChzaGFkb3dbcmVnXSwgMyk7CisJYmlxdWFkLT5jb2VmZi5iMj1HRVRfNF8yMChzaGFkb3dbcmVnXSwgNik7CisJYmlxdWFkLT5jb2VmZi5hMT1HRVRfNF8yMChzaGFkb3dbcmVnXSwgOSk7CisJYmlxdWFkLT5jb2VmZi5hMj1HRVRfNF8yMChzaGFkb3dbcmVnXSwxMik7CisJCisJcmV0dXJuIDA7CQorfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X2VxX3J3KAlzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsCisJCXVfaW50IGNtZCwKKwkJdV9sb25nIGFyZykKK3sKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgcmM7CisJc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGJpcXVhZDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSZiaXF1YWQsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QpKSkgeworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlpZiAoY21kICYgU0lPQ19JTikgeworCQlyYz10YXMzMDA0X3dyaXRlX2JpcXVhZChzZWxmLCBiaXF1YWQuY2hhbm5lbCwgYmlxdWFkLmZpbHRlciwgJmJpcXVhZC5kYXRhKTsKKwkJaWYgKHJjICE9IDApIHJldHVybiByYzsKKwl9CisKKwlpZiAoY21kICYgU0lPQ19PVVQpIHsKKwkJcmM9dGFzMzAwNF9yZWFkX2JpcXVhZChzZWxmLCBiaXF1YWQuY2hhbm5lbCwgYmlxdWFkLmZpbHRlciwgJmJpcXVhZC5kYXRhKTsKKwkJaWYgKHJjICE9IDApIHJldHVybiByYzsKKworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZiaXF1YWQsIHNpemVvZihzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwNF9lcV9saXN0X3J3KAlzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsCisJCQl1X2ludCBjbWQsCisJCQl1X2xvbmcgYXJnKQoreworCWludCByYyA9IDA7CisJaW50IGZpbHRlcl9jb3VudDsKKwlpbnQgZmxhZ3M7CisJaW50IGksajsKKwljaGFyIHN5bmNfcmVxdWlyZWRbVEFTMzAwNF9CSVFVQURfQ0hBTk5FTF9DT1VOVF1bVEFTMzAwNF9CSVFVQURfRklMVEVSX0NPVU5UXTsKKwlzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgYmlxdWFkOworCXN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfbGlzdF90IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKworCW1lbXNldChzeW5jX3JlcXVpcmVkLDAsc2l6ZW9mKHN5bmNfcmVxdWlyZWQpKTsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmZmlsdGVyX2NvdW50LCAmYXJncC0+ZmlsdGVyX2NvdW50LCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZmbGFncywgJmFyZ3AtPmZsYWdzLCBzaXplb2YoaW50KSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKGNtZCAmIFNJT0NfSU4pIHsKKwl9CisKKwlmb3IgKGk9MDsgaSA8IGZpbHRlcl9jb3VudDsgaSsrKSB7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmYmlxdWFkLCAmYXJncC0+YmlxdWFkc1tpXSwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHRhc19iaXF1YWRfY3RybF90KSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJaWYgKGNtZCAmIFNJT0NfSU4pIHsKKwkJCXN5bmNfcmVxdWlyZWRbYmlxdWFkLmNoYW5uZWxdW2JpcXVhZC5maWx0ZXJdPTE7CisJCQlyYz10YXMzMDA0X3dyaXRlX2JpcXVhZF9zaGFkb3coc2VsZiwgYmlxdWFkLmNoYW5uZWwsIGJpcXVhZC5maWx0ZXIsICZiaXF1YWQuZGF0YSk7CisJCQlpZiAocmMgIT0gMCkgcmV0dXJuIHJjOworCQl9CisKKwkJaWYgKGNtZCAmIFNJT0NfT1VUKSB7CisJCQlyYz10YXMzMDA0X3JlYWRfYmlxdWFkKHNlbGYsIGJpcXVhZC5jaGFubmVsLCBiaXF1YWQuZmlsdGVyLCAmYmlxdWFkLmRhdGEpOworCQkJaWYgKHJjICE9IDApIHJldHVybiByYzsKKworCQkJaWYgKGNvcHlfdG9fdXNlcigmYXJncC0+YmlxdWFkc1tpXSwgJmJpcXVhZCwKKwkJCQkJIHNpemVvZihzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QpKSkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQl9CisJfQorCisJaWYgKGNtZCAmIFNJT0NfSU4pIHsKKwkJLyoKKwkJICogVGhpcyBpcyBPSyBmb3IgdGhlIHRhczMwMDQuIEZvciB0aGUKKwkJICogdGFzMzAwMWMsIGdvaW5nIGludG8gZmFzdCBsb2FkIG1vZGUgY2F1c2VzCisJCSAqIHRoZSB0cmVibGUgYW5kIGJhc3MgdG8gYmUgcmVzZXQgdG8gMGRCLCBhbmQKKwkJICogdm9sdW1lIGNvbnRyb2xzIHRvIGJlIG11dGVkLgorCQkgKi8KKwkJaWYgKGZsYWdzICYgVEFTX0JJUVVBRF9GQVNUX0xPQUQpIHRhczMwMDRfZmFzdF9sb2FkKHNlbGYsMSk7CisJCWZvciAoaT0wOyBpPFRBUzMwMDRfQklRVUFEX0NIQU5ORUxfQ09VTlQ7IGkrKykgeworCQkJZm9yIChqPTA7IGo8VEFTMzAwNF9CSVFVQURfRklMVEVSX0NPVU5UOyBqKyspIHsKKwkJCQlpZiAoc3luY19yZXF1aXJlZFtpXVtqXSkgeworCQkJCQlyYz10YXMzMDA0X3N5bmNfYmlxdWFkKHNlbGYsIGksIGopOworCQkJCQlpZiAocmMgPCAwKSBnb3RvIG91dDsKKwkJCQl9CisJCQl9CisJCX0KKwlvdXQ6CisJCWlmIChmbGFncyAmIFRBU19CSVFVQURfRkFTVF9MT0FEKQorCQkJdGFzMzAwNF9mYXN0X2xvYWQoc2VsZiwwKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfdXBkYXRlX2RyY2UoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCWludCBmbGFncywKKwkJCXN0cnVjdCB0YXNfZHJjZV90ICpkcmNlKQoreworCXRhc19zaGFkb3dfdCAqc2hhZG93OworCWludCBpOworCXNoYWRvdz1zZWxmLT5zdXBlci5zaGFkb3c7CisKKwlpZiAoZmxhZ3MgJiBUQVNfRFJDRV9BQk9WRV9SQVRJTykgeworCQlzZWxmLT5kcmNlX3N0YXRlLmFib3ZlLmV4cGFuZCA9IGRyY2UtPmFib3ZlLmV4cGFuZDsKKwkJaWYgKGRyY2UtPmFib3ZlLnZhbCA9PSAoMTw8OCkpIHsKKwkJCXNlbGYtPmRyY2Vfc3RhdGUuYWJvdmUudmFsID0gMTw8ODsKKwkJCXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzBdID0gMHgwMjsKKwkJCQkJCisJCX0gZWxzZSBpZiAoZHJjZS0+YWJvdmUuZXhwYW5kKSB7CisJCQlpPWFib3ZlX3RocmVzaG9sZF9leHBhbnNpb25faW5kZXgoZHJjZS0+YWJvdmUudmFsKTsKKwkJCXNlbGYtPmRyY2Vfc3RhdGUuYWJvdmUudmFsPWFib3ZlX3RocmVzaG9sZF9leHBhbnNpb25fcmF0aW9baV07CisJCQlzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVswXSA9IDB4MGEgKyAoaTw8Myk7CisJCX0gZWxzZSB7CisJCQlpPWFib3ZlX3RocmVzaG9sZF9jb21wcmVzc2lvbl9pbmRleChkcmNlLT5hYm92ZS52YWwpOworCQkJc2VsZi0+ZHJjZV9zdGF0ZS5hYm92ZS52YWw9YWJvdmVfdGhyZXNob2xkX2NvbXByZXNzaW9uX3JhdGlvW2ldOworCQkJc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bMF0gPSAweDA4ICsgKGk8PDMpOworCQl9CisJfQorCisJaWYgKGZsYWdzICYgVEFTX0RSQ0VfQkVMT1dfUkFUSU8pIHsKKwkJc2VsZi0+ZHJjZV9zdGF0ZS5iZWxvdy5leHBhbmQgPSBkcmNlLT5iZWxvdy5leHBhbmQ7CisJCWlmIChkcmNlLT5iZWxvdy52YWwgPT0gKDE8PDgpKSB7CisJCQlzZWxmLT5kcmNlX3N0YXRlLmJlbG93LnZhbCA9IDE8PDg7CisJCQlzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVsxXSA9IDB4MDI7CisJCQkJCQorCQl9IGVsc2UgaWYgKGRyY2UtPmJlbG93LmV4cGFuZCkgeworCQkJaT1iZWxvd190aHJlc2hvbGRfZXhwYW5zaW9uX2luZGV4KGRyY2UtPmJlbG93LnZhbCk7CisJCQlzZWxmLT5kcmNlX3N0YXRlLmJlbG93LnZhbD1iZWxvd190aHJlc2hvbGRfZXhwYW5zaW9uX3JhdGlvW2ldOworCQkJc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bMV0gPSAweDA4ICsgKGk8PDMpOworCQl9IGVsc2UgeworCQkJaT1iZWxvd190aHJlc2hvbGRfY29tcHJlc3Npb25faW5kZXgoZHJjZS0+YmVsb3cudmFsKTsKKwkJCXNlbGYtPmRyY2Vfc3RhdGUuYmVsb3cudmFsPWJlbG93X3RocmVzaG9sZF9jb21wcmVzc2lvbl9yYXRpb1tpXTsKKwkJCXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzFdID0gMHgwYSArIChpPDwzKTsKKwkJfQorCX0KKworCWlmIChmbGFncyAmIFRBU19EUkNFX1RIUkVTSE9MRCkgeworCQlzZWxmLT5kcmNlX3N0YXRlLnRocmVzaG9sZD1xdWFudGl6ZV9kYihkcmNlLT50aHJlc2hvbGQpOworCQlzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVsyXSA9IGRiX3RvX3JlZ3ZhbChzZWxmLT5kcmNlX3N0YXRlLnRocmVzaG9sZCk7CisJfQorCisJaWYgKGZsYWdzICYgVEFTX0RSQ0VfRU5FUkdZKSB7CisJCWk9dGltZV9pbmRleChkcmNlLT5lbmVyZ3kpOworCQlzZWxmLT5kcmNlX3N0YXRlLmVuZXJneT10aW1lX2NvbnN0YW50c1tpXTsKKwkJc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bM10gPSAweDQwICsgKGk8PDQpOworCX0KKworCWlmIChmbGFncyAmIFRBU19EUkNFX0FUVEFDSykgeworCQlpPXRpbWVfaW5kZXgoZHJjZS0+YXR0YWNrKTsKKwkJc2VsZi0+ZHJjZV9zdGF0ZS5hdHRhY2s9dGltZV9jb25zdGFudHNbaV07CisJCXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzRdID0gMHg0MCArIChpPDw0KTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBUQVNfRFJDRV9ERUNBWSkgeworCQlpPXRpbWVfaW5kZXgoZHJjZS0+ZGVjYXkpOworCQlzZWxmLT5kcmNlX3N0YXRlLmRlY2F5PXRpbWVfY29uc3RhbnRzW2ldOworCQlzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVs1XSA9IDB4NDAgKyAoaTw8NCk7CisJfQorCisJaWYgKGZsYWdzICYgVEFTX0RSQ0VfRU5BQkxFKSB7CisJCXNlbGYtPmRyY2Vfc3RhdGUuZW5hYmxlID0gZHJjZS0+ZW5hYmxlOworCX0KKworCWlmICghc2VsZi0+ZHJjZV9zdGF0ZS5lbmFibGUpIHsKKwkJc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bMF0gfD0gMHgwMTsKKwl9CisKKyNpZmRlZiBERUJVR19EUkNFCisJcHJpbnRrKCJEUkNFOiBzZXQgWyBFTkFCTEU6JXggQUJPVkU6JXgvJXggQkVMT1c6JXgvJXggVEhSRVNIOiV4IEVORVJHWToleCBBVFRBQ0s6JXggREVDQVk6JXhcbiIsCisJICAgICAgIHNlbGYtPmRyY2Vfc3RhdGUuZW5hYmxlLAorCSAgICAgICBzZWxmLT5kcmNlX3N0YXRlLmFib3ZlLmV4cGFuZCxzZWxmLT5kcmNlX3N0YXRlLmFib3ZlLnZhbCwKKwkgICAgICAgc2VsZi0+ZHJjZV9zdGF0ZS5iZWxvdy5leHBhbmQsc2VsZi0+ZHJjZV9zdGF0ZS5iZWxvdy52YWwsCisJICAgICAgIHNlbGYtPmRyY2Vfc3RhdGUudGhyZXNob2xkLAorCSAgICAgICBzZWxmLT5kcmNlX3N0YXRlLmVuZXJneSwKKwkgICAgICAgc2VsZi0+ZHJjZV9zdGF0ZS5hdHRhY2ssCisJICAgICAgIHNlbGYtPmRyY2Vfc3RhdGUuZGVjYXkpOworCisJcHJpbnRrKCJEUkNFOiByZWcgWyAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCBdXG4iLAorCSAgICAgICAodW5zaWduZWQgY2hhcilzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVswXSwKKwkgICAgICAgKHVuc2lnbmVkIGNoYXIpc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bMV0sCisJICAgICAgICh1bnNpZ25lZCBjaGFyKXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzJdLAorCSAgICAgICAodW5zaWduZWQgY2hhcilzaGFkb3dbVEFTMzAwNF9SRUdfRFJDXVszXSwKKwkgICAgICAgKHVuc2lnbmVkIGNoYXIpc2hhZG93W1RBUzMwMDRfUkVHX0RSQ11bNF0sCisJICAgICAgICh1bnNpZ25lZCBjaGFyKXNoYWRvd1tUQVMzMDA0X1JFR19EUkNdWzVdKTsKKyNlbmRpZgorCisJcmV0dXJuIHRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLCBUQVMzMDA0X1JFR19EUkMpOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X2RyY2VfcncoCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZiwKKwkJCXVfaW50IGNtZCwKKwkJCXVfbG9uZyBhcmcpCit7CisJaW50IHJjOworCXN0cnVjdCB0YXNfZHJjZV9jdHJsX3QgZHJjZV9jdHJsOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZkcmNlX2N0cmwsIGFyZ3AsIHNpemVvZihzdHJ1Y3QgdGFzX2RyY2VfY3RybF90KSkpCisJCXJldHVybiAtRUZBVUxUOworCisjaWZkZWYgREVCVUdfRFJDRQorCXByaW50aygiRFJDRTogaW5wdXQgWyBGTEFHUzoleCBFTkFCTEU6JXggQUJPVkU6JXgvJXggQkVMT1c6JXgvJXggVEhSRVNIOiV4IEVORVJHWToleCBBVFRBQ0s6JXggREVDQVk6JXhcbiIsCisJICAgICAgIGRyY2VfY3RybC5mbGFncywKKwkgICAgICAgZHJjZV9jdHJsLmRhdGEuZW5hYmxlLAorCSAgICAgICBkcmNlX2N0cmwuZGF0YS5hYm92ZS5leHBhbmQsZHJjZV9jdHJsLmRhdGEuYWJvdmUudmFsLAorCSAgICAgICBkcmNlX2N0cmwuZGF0YS5iZWxvdy5leHBhbmQsZHJjZV9jdHJsLmRhdGEuYmVsb3cudmFsLAorCSAgICAgICBkcmNlX2N0cmwuZGF0YS50aHJlc2hvbGQsCisJICAgICAgIGRyY2VfY3RybC5kYXRhLmVuZXJneSwKKwkgICAgICAgZHJjZV9jdHJsLmRhdGEuYXR0YWNrLAorCSAgICAgICBkcmNlX2N0cmwuZGF0YS5kZWNheSk7CisjZW5kaWYKKworCWlmIChjbWQgJiBTSU9DX0lOKSB7CisJCXJjID0gdGFzMzAwNF91cGRhdGVfZHJjZShzZWxmLCBkcmNlX2N0cmwuZmxhZ3MsICZkcmNlX2N0cmwuZGF0YSk7CisJCWlmIChyYyA8IDApIHJldHVybiByYzsKKwl9CisKKwlpZiAoY21kICYgU0lPQ19PVVQpIHsKKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX0VOQUJMRSkKKwkJCWRyY2VfY3RybC5kYXRhLmVuYWJsZSA9IHNlbGYtPmRyY2Vfc3RhdGUuZW5hYmxlOworCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfQUJPVkVfUkFUSU8pCisJCQlkcmNlX2N0cmwuZGF0YS5hYm92ZSA9IHNlbGYtPmRyY2Vfc3RhdGUuYWJvdmU7CisJCWlmIChkcmNlX2N0cmwuZmxhZ3MgJiBUQVNfRFJDRV9CRUxPV19SQVRJTykKKwkJCWRyY2VfY3RybC5kYXRhLmJlbG93ID0gc2VsZi0+ZHJjZV9zdGF0ZS5iZWxvdzsKKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX1RIUkVTSE9MRCkKKwkJCWRyY2VfY3RybC5kYXRhLnRocmVzaG9sZCA9IHNlbGYtPmRyY2Vfc3RhdGUudGhyZXNob2xkOworCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfRU5FUkdZKQorCQkJZHJjZV9jdHJsLmRhdGEuZW5lcmd5ID0gc2VsZi0+ZHJjZV9zdGF0ZS5lbmVyZ3k7CisJCWlmIChkcmNlX2N0cmwuZmxhZ3MgJiBUQVNfRFJDRV9BVFRBQ0spCisJCQlkcmNlX2N0cmwuZGF0YS5hdHRhY2sgPSBzZWxmLT5kcmNlX3N0YXRlLmF0dGFjazsKKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX0RFQ0FZKQorCQkJZHJjZV9jdHJsLmRhdGEuZGVjYXkgPSBzZWxmLT5kcmNlX3N0YXRlLmRlY2F5OworCisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmRyY2VfY3RybCwKKwkJCQkgc2l6ZW9mKHN0cnVjdCB0YXNfZHJjZV9jdHJsX3QpKSkgeworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3RhczMwMDRfdXBkYXRlX2RldmljZV9wYXJhbWV0ZXJzKHN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZikKK3sKKwljaGFyIGRhdGE7CisJaW50IGk7CisKKwlpZiAoIXNlbGYpIHJldHVybjsKKworCWlmIChzZWxmLT5vdXRwdXRfaWQgPT0gVEFTX09VVFBVVF9IRUFEUEhPTkVTKSB7CisJCS8qIHR1cm4gb24gYWxsUGFzcyB3aGVuIGhlYWRwaG9uZXMgYXJlIHBsdWdnZWQgaW4gKi8KKwkJZGF0YSA9IDB4MDI7CisJfSBlbHNlIHsKKwkJZGF0YSA9IDB4MDA7CisJfQorCisJdGFzMzAwNF93cml0ZV9yZWdpc3RlcihzZWxmLCBUQVMzMDA0X1JFR19NQ1IyLCAmZGF0YSwgV1JJVEVfTk9STUFMIHwgRk9SQ0VfV1JJVEUpOworCisJZm9yIChpPTA7IHRhczMwMDRfZXFfcHJlZnNbaV07IGkrKykgeworCQlzdHJ1Y3QgdGFzX2VxX3ByZWZfdCAqZXEgPSB0YXMzMDA0X2VxX3ByZWZzW2ldOworCisJCWlmIChlcS0+ZGV2aWNlX2lkID09IHNlbGYtPmRldmljZV9pZCAmJgorCQkgICAgKGVxLT5vdXRwdXRfaWQgPT0gMCB8fCBlcS0+b3V0cHV0X2lkID09IHNlbGYtPm91dHB1dF9pZCkgJiYKKwkJICAgIChlcS0+c3BlYWtlcl9pZCA9PSAwIHx8IGVxLT5zcGVha2VyX2lkID09IHNlbGYtPnNwZWFrZXJfaWQpKSB7CisKKwkJCXRhczMwMDRfdXBkYXRlX2RyY2Uoc2VsZiwgVEFTX0RSQ0VfQUxMLCBlcS0+ZHJjZSk7CisJCQl0YXMzMDA0X3dyaXRlX2JpcXVhZF9saXN0KHNlbGYsIGVxLT5maWx0ZXJfY291bnQsIFRBU19CSVFVQURfRkFTVF9MT0FELCBlcS0+YmlxdWFkcyk7CisKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAordGFzMzAwNF9kZXZpY2VfY2hhbmdlX2hhbmRsZXIodm9pZCAqc2VsZikKK3sKKwlpZiAoIXNlbGYpIHJldHVybjsKKworCXRhczMwMDRfdXBkYXRlX2RldmljZV9wYXJhbWV0ZXJzKChzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKilzZWxmKTsKK30KKworc3RhdGljIHN0cnVjdCB3b3JrX3N0cnVjdCBkZXZpY2VfY2hhbmdlOworCitzdGF0aWMgaW50Cit0YXMzMDA0X291dHB1dF9kZXZpY2VfY2hhbmdlKAlzdHJ1Y3QgdGFzMzAwNF9kYXRhX3QgKnNlbGYsCisJCQkJaW50IGRldmljZV9pZCwKKwkJCQlpbnQgb3V0cHV0X2lkLAorCQkJCWludCBzcGVha2VyX2lkKQoreworCXNlbGYtPmRldmljZV9pZD1kZXZpY2VfaWQ7CisJc2VsZi0+b3V0cHV0X2lkPW91dHB1dF9pZDsKKwlzZWxmLT5zcGVha2VyX2lkPXNwZWFrZXJfaWQ7CisKKwlzY2hlZHVsZV93b3JrKCZkZXZpY2VfY2hhbmdlKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0YXMzMDA0X2RldmljZV9pb2N0bCgJc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmLAorCQkJdV9pbnQgY21kLAorCQkJdV9sb25nIGFyZykKK3sKKwl1aW50IF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVEFTX1JFQURfRVE6CisJY2FzZSBUQVNfV1JJVEVfRVE6CisJCXJldHVybiB0YXMzMDA0X2VxX3J3KHNlbGYsIGNtZCwgYXJnKTsKKworCWNhc2UgVEFTX1JFQURfRVFfTElTVDoKKwljYXNlIFRBU19XUklURV9FUV9MSVNUOgorCQlyZXR1cm4gdGFzMzAwNF9lcV9saXN0X3J3KHNlbGYsIGNtZCwgYXJnKTsKKworCWNhc2UgVEFTX1JFQURfRVFfRklMVEVSX0NPVU5UOgorCQlwdXRfdXNlcihUQVMzMDA0X0JJUVVBRF9GSUxURVJfQ09VTlQsIGFyZ3ApOworCQlyZXR1cm4gMDsKKworCWNhc2UgVEFTX1JFQURfRVFfQ0hBTk5FTF9DT1VOVDoKKwkJcHV0X3VzZXIoVEFTMzAwNF9CSVFVQURfQ0hBTk5FTF9DT1VOVCwgYXJncCk7CisJCXJldHVybiAwOworCisJY2FzZSBUQVNfUkVBRF9EUkNFOgorCWNhc2UgVEFTX1dSSVRFX0RSQ0U6CisJCXJldHVybiB0YXMzMDA0X2RyY2Vfcncoc2VsZiwgY21kLCBhcmcpOworCisJY2FzZSBUQVNfUkVBRF9EUkNFX0NBUFM6CisJCXB1dF91c2VyKFRBU19EUkNFX0VOQUJMRSAgICAgICAgIHwKKwkJCSBUQVNfRFJDRV9BQk9WRV9SQVRJTyAgICB8CisJCQkgVEFTX0RSQ0VfQkVMT1dfUkFUSU8gICAgfAorCQkJIFRBU19EUkNFX1RIUkVTSE9MRCAgICAgIHwKKwkJCSBUQVNfRFJDRV9FTkVSR1kgICAgICAgICB8CisJCQkgVEFTX0RSQ0VfQVRUQUNLICAgICAgICAgfAorCQkJIFRBU19EUkNFX0RFQ0FZLAorCQkJIGFyZ3ApOworCQlyZXR1cm4gMDsKKworCWNhc2UgVEFTX1JFQURfRFJDRV9NSU46CisJY2FzZSBUQVNfUkVBRF9EUkNFX01BWDogeworCQlzdHJ1Y3QgdGFzX2RyY2VfY3RybF90IGRyY2VfY3RybDsKKwkJY29uc3Qgc3RydWN0IHRhc19kcmNlX3QgKmRyY2VfY29weTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJmRyY2VfY3RybCwgYXJncCwKKwkJCQkgICBzaXplb2Yoc3RydWN0IHRhc19kcmNlX2N0cmxfdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCWlmIChjbWQgPT0gVEFTX1JFQURfRFJDRV9NSU4pIHsKKwkJCWRyY2VfY29weT0mdGFzMzAwNF9kcmNlX21pbjsKKwkJfSBlbHNlIHsKKwkJCWRyY2VfY29weT0mdGFzMzAwNF9kcmNlX21heDsKKwkJfQorCisJCWlmIChkcmNlX2N0cmwuZmxhZ3MgJiBUQVNfRFJDRV9BQk9WRV9SQVRJTykgeworCQkJZHJjZV9jdHJsLmRhdGEuYWJvdmU9ZHJjZV9jb3B5LT5hYm92ZTsKKwkJfQorCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfQkVMT1dfUkFUSU8pIHsKKwkJCWRyY2VfY3RybC5kYXRhLmJlbG93PWRyY2VfY29weS0+YmVsb3c7CisJCX0KKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX1RIUkVTSE9MRCkgeworCQkJZHJjZV9jdHJsLmRhdGEudGhyZXNob2xkPWRyY2VfY29weS0+dGhyZXNob2xkOworCQl9CisJCWlmIChkcmNlX2N0cmwuZmxhZ3MgJiBUQVNfRFJDRV9FTkVSR1kpIHsKKwkJCWRyY2VfY3RybC5kYXRhLmVuZXJneT1kcmNlX2NvcHktPmVuZXJneTsKKwkJfQorCQlpZiAoZHJjZV9jdHJsLmZsYWdzICYgVEFTX0RSQ0VfQVRUQUNLKSB7CisJCQlkcmNlX2N0cmwuZGF0YS5hdHRhY2s9ZHJjZV9jb3B5LT5hdHRhY2s7CisJCX0KKwkJaWYgKGRyY2VfY3RybC5mbGFncyAmIFRBU19EUkNFX0RFQ0FZKSB7CisJCQlkcmNlX2N0cmwuZGF0YS5kZWNheT1kcmNlX2NvcHktPmRlY2F5OworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmZHJjZV9jdHJsLAorCQkJCSBzaXplb2Yoc3RydWN0IHRhc19kcmNlX2N0cmxfdCkpKSB7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludAordGFzMzAwNF9pbml0X21peGVyKHN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZikKK3sKKwl1bnNpZ25lZCBjaGFyIG1jciA9ICgxPDw2KSsoMjw8NCkrKDI8PDIpOworCisJLyogTWFrZSBzdXJlIHNvbWV0aGluZyBhbnN3ZXJzIG9uIHRoZSBpMmMgYnVzICovCisJaWYgKHRhczMwMDRfd3JpdGVfcmVnaXN0ZXIoc2VsZiwgVEFTMzAwNF9SRUdfTUNSLCAmbWNyLAorCSAgICBXUklURV9OT1JNQUwgfCBGT1JDRV9XUklURSkgPCAwKQorCQlyZXR1cm4gLTE7CisKKwl0YXMzMDA0X2Zhc3RfbG9hZChzZWxmLCAxKTsKKworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDApOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDEpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDIpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDMpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDQpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDUpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDYpOworCisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQwKTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDEpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMik7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQzKTsKKwkodm9pZCl0YXMzMDA0X3N5bmNfcmVnaXN0ZXIoc2VsZixUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDQpOworCSh2b2lkKXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLFRBUzMwMDRfUkVHX0xFRlRfQklRVUFENSk7CisJKHZvaWQpdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQ2KTsKKworCXRhczMwMDRfc3luY19yZWdpc3RlcihzZWxmLCBUQVMzMDA0X1JFR19EUkMpOworCisJdGFzMzAwNF9zeW5jX3JlZ2lzdGVyKHNlbGYsIFRBUzMwMDRfUkVHX01DUjIpOworCisJdGFzMzAwNF9mYXN0X2xvYWQoc2VsZiwgMCk7CisKKwl0YXMzMDA0X3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9WT0xVTUUsIFZPTF9ERUZBVUxUPDw4IHwgVk9MX0RFRkFVTFQpOworCXRhczMwMDRfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX1BDTSwgSU5QVVRfREVGQVVMVDw8OCB8IElOUFVUX0RFRkFVTFQpOworCXRhczMwMDRfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX0FMVFBDTSwgMCk7CisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfSU1JWCwgMCk7CisKKwl0YXMzMDA0X3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9CQVNTLCBCQVNTX0RFRkFVTFQpOworCXRhczMwMDRfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX1RSRUJMRSwgVFJFQkxFX0RFRkFVTFQpOworCisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfTElORSxTV19JTlBVVF9WT0xVTUVfREVGQVVMVCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzMzAwNF91bmluaXRfbWl4ZXIoc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmKQoreworCXRhczMwMDRfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX1ZPTFVNRSwgMCk7CisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfUENNLCAwKTsKKwl0YXMzMDA0X3NldF9taXhlcl9sZXZlbChzZWxmLCBTT1VORF9NSVhFUl9BTFRQQ00sIDApOworCXRhczMwMDRfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX0lNSVgsIDApOworCisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfQkFTUywgMCk7CisJdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwoc2VsZiwgU09VTkRfTUlYRVJfVFJFQkxFLCAwKTsKKworCXRhczMwMDRfc2V0X21peGVyX2xldmVsKHNlbGYsIFNPVU5EX01JWEVSX0xJTkUsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3RhczMwMDRfaW5pdChzdHJ1Y3QgaTJjX2NsaWVudCAqY2xpZW50KQoreworCXN0cnVjdCB0YXMzMDA0X2RhdGFfdCAqc2VsZjsKKwlzaXplX3Qgc3ogPSBzaXplb2YoKnNlbGYpICsgKFRBUzMwMDRfUkVHX01BWCpzaXplb2YodGFzX3NoYWRvd190KSk7CisJY2hhciBkcmNlX2luaXRbXSA9IHsgMHg2OSwgMHgyMiwgMHg5ZiwgMHhiMCwgMHg2MCwgMHhhMCB9OworCWNoYXIgbWNyMiA9IDA7CisJaW50IGksIGo7CisKKwlzZWxmID0ga21hbGxvYyhzeiwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzZWxmKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQoc2VsZiwgMCwgc3opOworCisJc2VsZi0+c3VwZXIuY2xpZW50ID0gY2xpZW50OworCXNlbGYtPnN1cGVyLnNoYWRvdyA9ICh0YXNfc2hhZG93X3QgKikoc2VsZisxKTsKKwlzZWxmLT5vdXRwdXRfaWQgPSBUQVNfT1VUUFVUX0hFQURQSE9ORVM7CisKKwlkZXZfc2V0X2RydmRhdGEoJmNsaWVudC0+ZGV2LCBzZWxmKTsKKworCWZvciAoaSA9IDA7IGkgPCBUQVMzMDA0X0JJUVVBRF9DSEFOTkVMX0NPVU5UOyBpKyspCisJCWZvciAoaiA9IDA7IGo8VEFTMzAwNF9CSVFVQURfRklMVEVSX0NPVU5UOyBqKyspCisJCQl0YXMzMDA0X3dyaXRlX2JpcXVhZF9zaGFkb3coc2VsZiwgaSwgaiwKKwkJCQkJJnRhczMwMDRfZXFfdW5pdHkpOworCisJdGFzMzAwNF93cml0ZV9yZWdpc3RlcihzZWxmLCBUQVMzMDA0X1JFR19NQ1IyLCAmbWNyMiwgV1JJVEVfU0hBRE9XKTsKKwl0YXMzMDA0X3dyaXRlX3JlZ2lzdGVyKHNlbGYsIFRBUzMwMDRfUkVHX0RSQywgZHJjZV9pbml0LCBXUklURV9TSEFET1cpOworCisJSU5JVF9XT1JLKCZkZXZpY2VfY2hhbmdlLCB0YXMzMDA0X2RldmljZV9jaGFuZ2VfaGFuZGxlciwgc2VsZik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIAordGFzMzAwNF91bmluaXQoc3RydWN0IHRhczMwMDRfZGF0YV90ICpzZWxmKQoreworCXRhczMwMDRfdW5pbml0X21peGVyKHNlbGYpOworCWtmcmVlKHNlbGYpOworfQorCisKK3N0cnVjdCB0YXNfZHJpdmVyX2hvb2tzX3QgdGFzMzAwNF9ob29rcyA9IHsKKwkuaW5pdAkJCT0gKHRhc19ob29rX2luaXRfdCl0YXMzMDA0X2luaXQsCisJLnBvc3RfaW5pdAkJPSAodGFzX2hvb2tfcG9zdF9pbml0X3QpdGFzMzAwNF9pbml0X21peGVyLAorCS51bmluaXQJCQk9ICh0YXNfaG9va191bmluaXRfdCl0YXMzMDA0X3VuaW5pdCwKKwkuZ2V0X21peGVyX2xldmVsCT0gKHRhc19ob29rX2dldF9taXhlcl9sZXZlbF90KXRhczMwMDRfZ2V0X21peGVyX2xldmVsLAorCS5zZXRfbWl4ZXJfbGV2ZWwJPSAodGFzX2hvb2tfc2V0X21peGVyX2xldmVsX3QpdGFzMzAwNF9zZXRfbWl4ZXJfbGV2ZWwsCisJLmVudGVyX3NsZWVwCQk9ICh0YXNfaG9va19lbnRlcl9zbGVlcF90KXRhczMwMDRfZW50ZXJfc2xlZXAsCisJLmxlYXZlX3NsZWVwCQk9ICh0YXNfaG9va19sZWF2ZV9zbGVlcF90KXRhczMwMDRfbGVhdmVfc2xlZXAsCisJLnN1cHBvcnRlZF9taXhlcnMJPSAodGFzX2hvb2tfc3VwcG9ydGVkX21peGVyc190KXRhczMwMDRfc3VwcG9ydGVkX21peGVycywKKwkubWl4ZXJfaXNfc3RlcmVvCT0gKHRhc19ob29rX21peGVyX2lzX3N0ZXJlb190KXRhczMwMDRfbWl4ZXJfaXNfc3RlcmVvLAorCS5zdGVyZW9fbWl4ZXJzCQk9ICh0YXNfaG9va19zdGVyZW9fbWl4ZXJzX3QpdGFzMzAwNF9zdGVyZW9fbWl4ZXJzLAorCS5vdXRwdXRfZGV2aWNlX2NoYW5nZQk9ICh0YXNfaG9va19vdXRwdXRfZGV2aWNlX2NoYW5nZV90KXRhczMwMDRfb3V0cHV0X2RldmljZV9jaGFuZ2UsCisJLmRldmljZV9pb2N0bAkJPSAodGFzX2hvb2tfZGV2aWNlX2lvY3RsX3QpdGFzMzAwNF9kZXZpY2VfaW9jdGwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvdGFzMzAwNC5oIGIvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQ1ODRiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDQuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogSGVhZGVyIGZpbGUgZm9yIHRoZSBpMmMvaTJzIGJhc2VkIFRBMzAwNCBzb3VuZCBjaGlwIHVzZWQKKyAqIG9uIHNvbWUgQXBwbGUgaGFyZHdhcmUuIEFsc28ga25vd24gYXMgInR1bWJsZXIiLgorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiAgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBXcml0dGVuIGJ5IENocmlzdG9waGVyIEMuIENoaW1lbGlzIDxjaHJpc0BkZWJpYW4ub3JnPgorICovCisKKyNpZm5kZWYgX1RBUzMwMDRfSF8KKyNkZWZpbmUgX1RBUzMwMDRfSF8KKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNpbmNsdWRlICJ0YXNfY29tbW9uLmgiCisjaW5jbHVkZSAidGFzX2VxX3ByZWZzLmgiCisKKy8qCisgKiBNYWNyb3MgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSByZWdpc3RlcnMgdGhhdCB3ZSB3cml0ZSB0bworICogd2hlbiBzZXR0aW5nIHRoZSB2YXJpb3VzIHZhbHVlcy4KKyAqLworCisjZGVmaW5lIFRBUzMwMDRfVkVSU0lPTgkgICAgICAgICIwLjMiCisjZGVmaW5lIFRBUzMwMDRfREFURQkgICAgICAgICIyMDAxMTIxNCIKKworI2RlZmluZSBJMkNfRFJJVkVSTkFNRV9UQVMzMDA0ICJUQVMzMDA0IGRyaXZlciBWICIgVEFTMzAwNF9WRVJTSU9OCisjZGVmaW5lIEkyQ19EUklWRVJJRF9UQVMzMDA0ICAgIChJMkNfRFJJVkVSSURfVEFTX0JBU0UrMSkKKworZXh0ZXJuICBzdHJ1Y3QgdGFzX2RyaXZlcl9ob29rc190IHRhczMwMDRfaG9va3M7CitleHRlcm4gc3RydWN0IHRhc19nYWluX3QgdGFzMzAwNF9nYWluOworZXh0ZXJuIHN0cnVjdCB0YXNfZXFfcHJlZl90ICp0YXMzMDA0X2VxX3ByZWZzW107CisKK2VudW0gdGFzMzAwNF9yZWdfdCB7CisgIFRBUzMwMDRfUkVHX01DUiAgICAgICAgICAgICAgICAgICAgPSAweDAxLAorICBUQVMzMDA0X1JFR19EUkMgICAgICAgICAgICAgICAgICAgID0gMHgwMiwKKworICBUQVMzMDA0X1JFR19WT0xVTUUgICAgICAgICAgICAgICAgID0gMHgwNCwKKyAgVEFTMzAwNF9SRUdfVFJFQkxFICAgICAgICAgICAgICAgICA9IDB4MDUsCisgIFRBUzMwMDRfUkVHX0JBU1MgICAgICAgICAgICAgICAgICAgPSAweDA2LAorICBUQVMzMDA0X1JFR19MRUZUX01JWEVSICAgICAgICAgICAgID0gMHgwNywKKyAgVEFTMzAwNF9SRUdfUklHSFRfTUlYRVIgICAgICAgICAgICA9IDB4MDgsCisKKyAgVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQwICAgICAgICAgICA9IDB4MGEsCisgIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFEMSAgICAgICAgICAgPSAweDBiLAorICBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDIgICAgICAgICAgID0gMHgwYywKKyAgVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQzICAgICAgICAgICA9IDB4MGQsCisgIFRBUzMwMDRfUkVHX0xFRlRfQklRVUFENCAgICAgICAgICAgPSAweDBlLAorICBUQVMzMDA0X1JFR19MRUZUX0JJUVVBRDUgICAgICAgICAgID0gMHgwZiwKKyAgVEFTMzAwNF9SRUdfTEVGVF9CSVFVQUQ2ICAgICAgICAgICA9IDB4MTAsCisgIAorICBUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQwICAgICAgICAgID0gMHgxMywKKyAgVEFTMzAwNF9SRUdfUklHSFRfQklRVUFEMSAgICAgICAgICA9IDB4MTQsCisgIFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDIgICAgICAgICAgPSAweDE1LAorICBUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQzICAgICAgICAgID0gMHgxNiwKKyAgVEFTMzAwNF9SRUdfUklHSFRfQklRVUFENCAgICAgICAgICA9IDB4MTcsCisgIFRBUzMwMDRfUkVHX1JJR0hUX0JJUVVBRDUgICAgICAgICAgPSAweDE4LAorICBUQVMzMDA0X1JFR19SSUdIVF9CSVFVQUQ2ICAgICAgICAgID0gMHgxOSwKKworICBUQVMzMDA0X1JFR19MRUZUX0xPVURfQklRVUFEICAgICAgID0gMHgyMSwKKyAgVEFTMzAwNF9SRUdfUklHSFRfTE9VRF9CSVFVQUQgICAgICA9IDB4MjIsCisKKyAgVEFTMzAwNF9SRUdfTEVGVF9MT1VEX0JJUVVBRF9HQUlOICA9IDB4MjMsCisgIFRBUzMwMDRfUkVHX1JJR0hUX0xPVURfQklRVUFEX0dBSU4gPSAweDI0LAorCisgIFRBUzMwMDRfUkVHX1RFU1QgICAgICAgICAgICAgICAgICAgPSAweDI5LAorCisgIFRBUzMwMDRfUkVHX0FOQUxPR19DVFJMICAgICAgICAgICAgPSAweDQwLAorICBUQVMzMDA0X1JFR19URVNUMSAgICAgICAgICAgICAgICAgID0gMHg0MSwKKyAgVEFTMzAwNF9SRUdfVEVTVDIgICAgICAgICAgICAgICAgICA9IDB4NDIsCisgIFRBUzMwMDRfUkVHX01DUjIgICAgICAgICAgICAgICAgICAgPSAweDQzLAorCisgIFRBUzMwMDRfUkVHX01BWCAgICAgICAgICAgICAgICAgICAgPSAweDQ0Cit9OworCisjZW5kaWYgLyogX1RBUzMwMDRfSF8gKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDA0X3RhYmxlcy5jIGIvc291bmQvb3NzL2RtYXNvdW5kL3RhczMwMDRfdGFibGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxMGUwYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXMzMDA0X3RhYmxlcy5jCkBAIC0wLDAgKzEsMzAxIEBACisjaW5jbHVkZSAidGFzMzAwNC5oIgorI2luY2x1ZGUgInRhc19lcV9wcmVmcy5oIgorCitzdGF0aWMgc3RydWN0IHRhc19kcmNlX3QgZXFwXzE3XzFfMF9kcmNlPXsKKyAgICAuZW5hYmxlICAgICA9IDEsCisgICAgLmFib3ZlICAgICAgPSB7IC52YWwgPSAzLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgICAgLmJlbG93ICAgICAgPSB7IC52YWwgPSAxLjAgKiAoMTw8OCksIC5leHBhbmQgPSAwIH0sCisgICAgLnRocmVzaG9sZCAgPSAtMTkuMTIgICogKDE8PDgpLAorICAgIC5lbmVyZ3kgICAgID0gMi40ICAgICAqICgxPDwxMiksCisgICAgLmF0dGFjayAgICAgPSAwLjAxMyAgICogKDE8PDEyKSwKKyAgICAuZGVjYXkgICAgICA9IDAuMjEyICAgKiAoMTw8MTIpLAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCBlcXBfMTdfMV8wX2JpcXVhZHNbXT17CisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZmQwZDQsIDB4ZTA1ZTU2LCAweDBmZDBkNCwgMHhlMDVlZTEsIDB4MGZhMjM0IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDkxMGQ3LCAweDA4OGUxYSwgMHgwMzA2NTEsIDB4MDFkY2IxLCAweDAyYzg5MiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmZjg5NSwgMHhlMDk3MGIsIDB4MGY3ZjAwLCAweGUwOTcwYiwgMHgwZjc3OTUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZmQxYzQsIDB4ZTFhYzIyLCAweDBlYzhjZiwgMHhlMWFjMjIsIDB4MGU5YTk0IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGY3YzFjLCAweGUzY2MwMywgMHgwZGY3ODYsIDB4ZTNjYzAzLCAweDBkNzNhMiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDExZmI5MiwgMHhmNWExYTAsIDB4MDczY2QyLCAweGY1YTFhMCwgMHgwOTM4NjUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZTE3YTksIDB4MDY4YjZjLCAweDA4YTBlNSwgMHgwNjhiNmMsIDB4MDZiODhlIH0gfSB9LAorCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZmQwZDQsIDB4ZTA1ZTU2LCAweDBmZDBkNCwgMHhlMDVlZTEsIDB4MGZhMjM0IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDkxMGQ3LCAweDA4OGUxYSwgMHgwMzA2NTEsIDB4MDFkY2IxLCAweDAyYzg5MiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmZjg5NSwgMHhlMDk3MGIsIDB4MGY3ZjAwLCAweGUwOTcwYiwgMHgwZjc3OTUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZmQxYzQsIDB4ZTFhYzIyLCAweDBlYzhjZiwgMHhlMWFjMjIsIDB4MGU5YTk0IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGY3YzFjLCAweGUzY2MwMywgMHgwZGY3ODYsIDB4ZTNjYzAzLCAweDBkNzNhMiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDExZmI5MiwgMHhmNWExYTAsIDB4MDczY2QyLCAweGY1YTFhMCwgMHgwOTM4NjUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZTE3YTksIDB4MDY4YjZjLCAweDA4YTBlNSwgMHgwNjhiNmMsIDB4MDZiODhlIH0gfSB9Cit9OworCitzdGF0aWMgc3RydWN0IHRhc19lcV9wcmVmX3QgZXFwXzE3XzFfMCA9IHsKKyAgLnNhbXBsZV9yYXRlICAgPSA0NDEwMCwKKyAgLmRldmljZV9pZCAgICAgPSAweDE3LAorICAub3V0cHV0X2lkICAgICA9IFRBU19PVVRQVVRfSU5URVJOQUxfU1BLUiwKKyAgLnNwZWFrZXJfaWQgICAgPSAweDAwLAorCisgIC5kcmNlICAgICAgICAgID0gJmVxcF8xN18xXzBfZHJjZSwKKworICAuZmlsdGVyX2NvdW50ICA9IDE0LAorICAuYmlxdWFkcyAgICAgICA9IGVxcF8xN18xXzBfYmlxdWFkcworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2RyY2VfdCBlcXBfMThfMV8wX2RyY2U9eworICAuZW5hYmxlICAgICA9IDEsCisgIC5hYm92ZSAgICAgID0geyAudmFsID0gMy4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAuYmVsb3cgICAgICA9IHsgLnZhbCA9IDEuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLnRocmVzaG9sZCAgPSAtMTMuMTQgICogKDE8PDgpLAorICAuZW5lcmd5ICAgICA9IDIuNCAgICAgKiAoMTw8MTIpLAorICAuYXR0YWNrICAgICA9IDAuMDEzICAgKiAoMTw8MTIpLAorICAuZGVjYXkgICAgICA9IDAuMjEyICAgKiAoMTw8MTIpLAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCBlcXBfMThfMV8wX2JpcXVhZHNbXT17CisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZjU1MTQsIDB4ZTE1NWQ3LCAweDBmNTUxNCwgMHhlMTVjZmEsIDB4MGViMTRiIH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDZlYzMzLCAweDAyYWJlMywgMHgwMTVlZWYsIDB4Zjc2NGQ5LCAweDAzOTIyZCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBlZjVmMiwgMHhlNjdkMWYsIDB4MGJjZjM3LCAweGU2N2QxZiwgMHgwYWM1MjkgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZGIwNTAsIDB4ZTViZTRkLCAweDBkMGM3OCwgMHhlNWJlNGQsIDB4MGFiY2M4IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGYxMjk4LCAweGU2NGVjNiwgMHgwY2MwM2UsIDB4ZTY0ZWM2LCAweDBiZDJkNyB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBjNjQxYSwgMHgwNjUzN2EsIDB4MDhkMTU1LCAweDA2NTM3YSwgMHgwNTM1NzAgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwIH0gfSB9LAorCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZjU1MTQsIDB4ZTE1NWQ3LCAweDBmNTUxNCwgMHhlMTVjZmEsIDB4MGViMTRiIH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDZlYzMzLCAweDAyYWJlMywgMHgwMTVlZWYsIDB4Zjc2NGQ5LCAweDAzOTIyZCB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBlZjVmMiwgMHhlNjdkMWYsIDB4MGJjZjM3LCAweGU2N2QxZiwgMHgwYWM1MjkgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZGIwNTAsIDB4ZTViZTRkLCAweDBkMGM3OCwgMHhlNWJlNGQsIDB4MGFiY2M4IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGYxMjk4LCAweGU2NGVjNiwgMHgwY2MwM2UsIDB4ZTY0ZWM2LCAweDBiZDJkNyB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBjNjQxYSwgMHgwNjUzN2EsIDB4MDhkMTU1LCAweDA2NTM3YSwgMHgwNTM1NzAgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwIH0gfSB9Cit9OworCitzdGF0aWMgc3RydWN0IHRhc19lcV9wcmVmX3QgZXFwXzE4XzFfMCA9IHsKKyAgLnNhbXBsZV9yYXRlICAgPSA0NDEwMCwKKyAgLmRldmljZV9pZCAgICAgPSAweDE4LAorICAub3V0cHV0X2lkICAgICA9IFRBU19PVVRQVVRfSU5URVJOQUxfU1BLUiwKKyAgLnNwZWFrZXJfaWQgICAgPSAweDAwLAorCisgIC5kcmNlICAgICAgICAgID0gJmVxcF8xOF8xXzBfZHJjZSwKKworICAuZmlsdGVyX2NvdW50ICA9IDE0LAorICAuYmlxdWFkcyAgICAgICA9IGVxcF8xOF8xXzBfYmlxdWFkcworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2RyY2VfdCBlcXBfMWFfMV8wX2RyY2U9eworICAuZW5hYmxlICAgICA9IDEsCisgIC5hYm92ZSAgICAgID0geyAudmFsID0gMy4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAuYmVsb3cgICAgICA9IHsgLnZhbCA9IDEuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLnRocmVzaG9sZCAgPSAtMTAuNzUgICogKDE8PDgpLAorICAuZW5lcmd5ICAgICA9IDIuNCAgICAgKiAoMTw8MTIpLAorICAuYXR0YWNrICAgICA9IDAuMDEzICAgKiAoMTw8MTIpLAorICAuZGVjYXkgICAgICA9IDAuMjEyICAgKiAoMTw8MTIpLAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCBlcXBfMWFfMV8wX2JpcXVhZHNbXT17CisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZmI4ZmQsIDB4ZTA4ZTA0LCAweDBmYjhmZCwgMHhlMDhmNDAsIDB4MGY3MzM2IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDYzNzFkLCAweDBjNmUzYSwgMHgwNjM3MWQsIDB4MDViZmQzLCAweDAzMWNhMiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmYTFjMCwgMHhlMTg2OTIsIDB4MGYwMzBlLCAweGUxODY5MiwgMHgwZWE0Y2UgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZmU0OTUsIDB4ZTE3ZWZmLCAweDBmMDQ1MiwgMHhlMTdlZmYsIDB4MGVlOGU3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTAwODU3LCAweGU3ZTcxYywgMHgwZTk1OTksIDB4ZTdlNzFjLCAweDBlOWRmMSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmYjI2ZSwgMHgwNmE4MmMsIDB4MGRiMmI0LCAweDA2YTgyYywgMHgwZDY1MjIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMTQxOWQsIDB4ZjA2Y2JmLCAweDBhNGY2ZSwgMHhmMDZjYmYsIDB4MGI5MTBjIH0gfSB9LAorCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZmI4ZmQsIDB4ZTA4ZTA0LCAweDBmYjhmZCwgMHhlMDhmNDAsIDB4MGY3MzM2IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDYzNzFkLCAweDBjNmUzYSwgMHgwNjM3MWQsIDB4MDViZmQzLCAweDAzMWNhMiB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmYTFjMCwgMHhlMTg2OTIsIDB4MGYwMzBlLCAweGUxODY5MiwgMHgwZWE0Y2UgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZmU0OTUsIDB4ZTE3ZWZmLCAweDBmMDQ1MiwgMHhlMTdlZmYsIDB4MGVlOGU3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MTAwODU3LCAweGU3ZTcxYywgMHgwZTk1OTksIDB4ZTdlNzFjLCAweDBlOWRmMSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmYjI2ZSwgMHgwNmE4MmMsIDB4MGRiMmI0LCAweDA2YTgyYywgMHgwZDY1MjIgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgxMTQxOWQsIDB4ZjA2Y2JmLCAweDBhNGY2ZSwgMHhmMDZjYmYsIDB4MGI5MTBjIH0gfSB9Cit9OworCitzdGF0aWMgc3RydWN0IHRhc19lcV9wcmVmX3QgZXFwXzFhXzFfMCA9IHsKKyAgLnNhbXBsZV9yYXRlICAgPSA0NDEwMCwKKyAgLmRldmljZV9pZCAgICAgPSAweDFhLAorICAub3V0cHV0X2lkICAgICA9IFRBU19PVVRQVVRfSU5URVJOQUxfU1BLUiwKKyAgLnNwZWFrZXJfaWQgICAgPSAweDAwLAorCisgIC5kcmNlICAgICAgICAgID0gJmVxcF8xYV8xXzBfZHJjZSwKKworICAuZmlsdGVyX2NvdW50ICA9IDE0LAorICAuYmlxdWFkcyAgICAgICA9IGVxcF8xYV8xXzBfYmlxdWFkcworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBzdHJ1Y3QgdGFzX2RyY2VfdCBlcXBfMWNfMV8wX2RyY2U9eworICAuZW5hYmxlICAgICA9IDEsCisgIC5hYm92ZSAgICAgID0geyAudmFsID0gMy4wICogKDE8PDgpLCAuZXhwYW5kID0gMCB9LAorICAuYmVsb3cgICAgICA9IHsgLnZhbCA9IDEuMCAqICgxPDw4KSwgLmV4cGFuZCA9IDAgfSwKKyAgLnRocmVzaG9sZCAgPSAtMTQuMzQgICogKDE8PDgpLAorICAuZW5lcmd5ICAgICA9IDIuNCAgICAgKiAoMTw8MTIpLAorICAuYXR0YWNrICAgICA9IDAuMDEzICAgKiAoMTw8MTIpLAorICAuZGVjYXkgICAgICA9IDAuMjEyICAgKiAoMTw8MTIpLAorfTsKKworc3RhdGljIHN0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCBlcXBfMWNfMV8wX2JpcXVhZHNbXT17CisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZjRmOTUsIDB4ZTE2MGQ0LCAweDBmNGY5NSwgMHhlMTY4NmUsIDB4MGVhNmM1IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDY2YjkyLCAweDAyOTBkNCwgMHgwMTQ4YTAsIDB4ZjY4NTNmLCAweDAzYmZjNyB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmNTdkYywgMHhlNTFjOTEsIDB4MGRkMWNiLCAweGU1MWM5MSwgMHgwZDI5YTggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZGYxY2IsIDB4ZTRmYTg0LCAweDBkN2NkYywgMHhlNGZhODQsIDB4MGI2ZWE3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMCwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGViYTM2LCAweGU2YWE0OCwgMHgwYjlmNTIsIDB4ZTZhYTQ4LCAweDBhNTk4OSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDAsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBjYWYwMiwgMHgwNWVmOWQsIDB4MDg0YmViLCAweDA1ZWY5ZCwgMHgwNGZhZWUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAwLCAuZmlsdGVyID0gNiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZmM2ODYsIDB4ZTIyOTQ3LCAweDBlNGI1ZCwgMHhlMjI5NDcsIDB4MGUxMWU0IH0gfSB9LAorCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMCwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZjRmOTUsIDB4ZTE2MGQ0LCAweDBmNGY5NSwgMHhlMTY4NmUsIDB4MGVhNmM1IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDEsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MDY2YjkyLCAweDAyOTBkNCwgMHgwMTQ4YTAsIDB4ZjY4NTNmLCAweDAzYmZjNyB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSAyLCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBmNTdkYywgMHhlNTFjOTEsIDB4MGRkMWNiLCAweGU1MWM5MSwgMHgwZDI5YTggfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gMywgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZGYxY2IsIDB4ZTRmYTg0LCAweDBkN2NkYywgMHhlNGZhODQsIDB4MGI2ZWE3IH0gfSB9LAorICB7IC5jaGFubmVsID0gMSwgLmZpbHRlciA9IDQsIC5kYXRhID0geyAuY29lZmYgPSB7IDB4MGViYTM2LCAweGU2YWE0OCwgMHgwYjlmNTIsIDB4ZTZhYTQ4LCAweDBhNTk4OSB9IH0gfSwKKyAgeyAuY2hhbm5lbCA9IDEsIC5maWx0ZXIgPSA1LCAuZGF0YSA9IHsgLmNvZWZmID0geyAweDBjYWYwMiwgMHgwNWVmOWQsIDB4MDg0YmViLCAweDA1ZWY5ZCwgMHgwNGZhZWUgfSB9IH0sCisgIHsgLmNoYW5uZWwgPSAxLCAuZmlsdGVyID0gNiwgLmRhdGEgPSB7IC5jb2VmZiA9IHsgMHgwZmM2ODYsIDB4ZTIyOTQ3LCAweDBlNGI1ZCwgMHhlMjI5NDcsIDB4MGUxMWU0IH0gfSB9Cit9OworCitzdGF0aWMgc3RydWN0IHRhc19lcV9wcmVmX3QgZXFwXzFjXzFfMCA9IHsKKyAgLnNhbXBsZV9yYXRlICAgPSA0NDEwMCwKKyAgLmRldmljZV9pZCAgICAgPSAweDFjLAorICAub3V0cHV0X2lkICAgICA9IFRBU19PVVRQVVRfSU5URVJOQUxfU1BLUiwKKyAgLnNwZWFrZXJfaWQgICAgPSAweDAwLAorCisgIC5kcmNlICAgICAgICAgID0gJmVxcF8xY18xXzBfZHJjZSwKKworICAuZmlsdGVyX2NvdW50ICA9IDE0LAorICAuYmlxdWFkcyAgICAgICA9IGVxcF8xY18xXzBfYmlxdWFkcworfTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyB1aW50IHRhczMwMDRfbWFzdGVyX3RhYltdPXsKKwkgICAgICAgMHgwLCAgICAgICAweDc1LCAgICAgICAweDljLCAgICAgICAweGJiLAorCSAgICAgIDB4ZGIsICAgICAgIDB4ZmIsICAgICAgMHgxMWUsICAgICAgMHgxNDMsCisJICAgICAweDE2YiwgICAgICAweDE5NiwgICAgICAweDFjMywgICAgICAweDFmNSwKKwkgICAgIDB4MjI5LCAgICAgIDB4MjYzLCAgICAgIDB4MjlmLCAgICAgIDB4MmUxLAorCSAgICAgMHgzMjgsICAgICAgMHgzNzMsICAgICAgMHgzYzUsICAgICAgMHg0MWIsCisJICAgICAweDQ3OCwgICAgICAweDRkYywgICAgICAweDU0NywgICAgICAweDViOCwKKwkgICAgIDB4NjMzLCAgICAgIDB4NmI1LCAgICAgIDB4NzQwLCAgICAgIDB4N2Q1LAorCSAgICAgMHg4NzMsICAgICAgMHg5MWMsICAgICAgMHg5ZDIsICAgICAgMHhhOTIsCisJICAgICAweGI1ZSwgICAgICAweGMzOSwgICAgICAweGQyMiwgICAgICAweGUxOSwKKwkgICAgIDB4ZjIwLCAgICAgMHgxMDM3LCAgICAgMHgxMTYxLCAgICAgMHgxMjllLAorCSAgICAweDEzZWQsICAgICAweDE1NTEsICAgICAweDE2Y2EsICAgICAweDE4NWQsCisJICAgIDB4MWEwOCwgICAgIDB4MWJjYywgICAgIDB4MWRhYywgICAgIDB4MWZhNywKKwkgICAgMHgyMWMxLCAgICAgMHgyM2ZhLCAgICAgMHgyNjU1LCAgICAgMHgyOGQ2LAorCSAgICAweDJiN2MsICAgICAweDJlNGEsICAgICAweDMxNDEsICAgICAweDM0NjQsCisJICAgIDB4MzdiNCwgICAgIDB4M2IzNSwgICAgIDB4M2VlOSwgICAgIDB4NDJkMywKKwkgICAgMHg0NmY2LCAgICAgMHg0YjUzLCAgICAgMHg0ZmYwLCAgICAgMHg1NGNlLAorCSAgICAweDU5ZjIsICAgICAweDVmNWYsICAgICAweDY1MTksICAgICAweDZiMjQsCisJICAgIDB4NzE4MywgICAgIDB4NzgzYywgICAgIDB4N2Y1MywgICAgIDB4ODZjYywKKwkgICAgMHg4ZWFkLCAgICAgMHg5NmZhLCAgICAgMHg5ZmJhLCAgICAgMHhhOGYyLAorCSAgICAweGIyYTcsICAgICAweGJjZTEsICAgICAweGM3YTUsICAgICAweGQyZmEsCisJICAgIDB4ZGVlOCwgICAgIDB4ZWI3NSwgICAgIDB4ZjhhYSwgICAgMHgxMDY4ZSwKKwkgICAweDExNTJhLCAgICAweDEyNDg3LCAgICAweDEzNGFkLCAgICAweDE0NWE1LAorCSAgIDB4MTU3N2IsICAgIDB4MTZhMzcsICAgIDB4MTdkZjUsICAgIDB4MTkyYmQsCisJICAgMHgxYTg5MCwgICAgMHgxYmY3YiwgICAgMHgxZDc4ZCwgICAgMHgxZjBkMSwKKwkgICAweDIwYjU1LCAgICAweDIyNzI3LCAgICAweDI0NDU2LCAgICAweDI2MmYyLAorCSAgIDB4MjgzMGIKK307CisKK3N0YXRpYyB1aW50IHRhczMwMDRfbWl4ZXJfdGFiW109eworCSAgICAgICAweDAsICAgICAgMHg3NDgsICAgICAgMHg5YmUsICAgICAgMHhiYWYsCisJICAgICAweGRhNCwgICAgICAweGZiMSwgICAgIDB4MTFkZSwgICAgIDB4MTQzMSwKKwkgICAgMHgxNmFkLCAgICAgMHgxOTU5LCAgICAgMHgxYzM3LCAgICAgMHgxZjRiLAorCSAgICAweDIyOTgsICAgICAweDI2MjgsICAgICAweDI5ZmIsICAgICAweDJlMTIsCisJICAgIDB4MzI3ZCwgICAgIDB4MzczNCwgICAgIDB4M2M0NywgICAgIDB4NDFiNCwKKwkgICAgMHg0Nzg3LCAgICAgMHg0ZGJlLCAgICAgMHg1NDZkLCAgICAgMHg1Yjg2LAorCSAgICAweDYzMmUsICAgICAweDZiNTIsICAgICAweDc0MDAsICAgICAweDdkNTQsCisJICAgIDB4ODczYiwgICAgIDB4OTFjNiwgICAgIDB4OWQxYSwgICAgIDB4YTkyMCwKKwkgICAgMHhiNWU1LCAgICAgMHhjMzhjLCAgICAgMHhkMjFiLCAgICAgMHhlMThmLAorCSAgICAweGYxZjUsICAgIDB4MTAzNmEsICAgIDB4MTE2MGYsICAgIDB4MTI5ZDYsCisJICAgMHgxM2VkMCwgICAgMHgxNTUwYywgICAgMHgxNmNhMCwgICAgMHgxODVjOSwKKwkgICAweDFhMDdiLCAgICAweDFiY2MzLCAgICAweDFkYWI5LCAgICAweDFmYTc1LAorCSAgIDB4MjFjMGYsICAgIDB4MjNmYTMsICAgIDB4MjY1NTIsICAgIDB4MjhkNjQsCisJICAgMHgyYjdjOSwgICAgMHgyZTRhMiwgICAgMHgzMTQxMSwgICAgMHgzNDYzYiwKKwkgICAweDM3YjQ0LCAgICAweDNiMzUzLCAgICAweDNlZTk0LCAgICAweDQyZDMwLAorCSAgIDB4NDZmNTUsICAgIDB4NGI1MzMsICAgIDB4NGZlZmMsICAgIDB4NTRjZTUsCisJICAgMHg1OWYyNSwgICAgMHg1ZjVmNiwgICAgMHg2NTE5MywgICAgMHg2YjIzYywKKwkgICAweDcxODM1LCAgICAweDc4M2MzLCAgICAweDdmNTJjLCAgICAweDg2Y2MwLAorCSAgIDB4OGVhY2MsICAgIDB4OTZmYTUsICAgIDB4OWZiYTAsICAgIDB4YThmMWEsCisJICAgMHhiMmE3MSwgICAgMHhiY2UwYSwgICAgMHhjN2E0YSwgICAgMHhkMmZhMCwKKwkgICAweGRlZTdiLCAgICAweGViNzUyLCAgICAweGY4YTlmLCAgIDB4MTA2OGU0LAorCSAgMHgxMTUyYTMsICAgMHgxMjQ4NmEsICAgMHgxMzRhYzgsICAgMHgxNDVhNTUsCisJICAweDE1NzdhYywgICAweDE2YTM3MCwgICAweDE3ZGY1MSwgICAweDE5MmJjMiwKKwkgIDB4MWE4OGY4LCAgIDB4MWJmN2I3LCAgIDB4MWQ3OGM5LCAgIDB4MWYwZDA0LAorCSAgMHgyMGI1NDIsICAgMHgyMjcyNjgsICAgMHgyNDQ1NjQsICAgMHgyNjJmMjYsCisJICAweDI4MzBhZgorfTsKKworc3RhdGljIHVpbnQgdGFzMzAwNF90cmVibGVfdGFiW109eworCSAgICAgIDB4OTYsICAgICAgIDB4OTUsICAgICAgIDB4OTUsICAgICAgIDB4OTQsCisJICAgICAgMHg5MywgICAgICAgMHg5MiwgICAgICAgMHg5MiwgICAgICAgMHg5MSwKKwkgICAgICAweDkwLCAgICAgICAweDkwLCAgICAgICAweDhmLCAgICAgICAweDhlLAorCSAgICAgIDB4OGQsICAgICAgIDB4OGQsICAgICAgIDB4OGMsICAgICAgIDB4OGIsCisJICAgICAgMHg4YSwgICAgICAgMHg4YSwgICAgICAgMHg4OSwgICAgICAgMHg4OCwKKwkgICAgICAweDg4LCAgICAgICAweDg3LCAgICAgICAweDg2LCAgICAgICAweDg1LAorCSAgICAgIDB4ODUsICAgICAgIDB4ODQsICAgICAgIDB4ODMsICAgICAgIDB4ODMsCisJICAgICAgMHg4MiwgICAgICAgMHg4MSwgICAgICAgMHg4MCwgICAgICAgMHg4MCwKKwkgICAgICAweDdmLCAgICAgICAweDdlLCAgICAgICAweDdlLCAgICAgICAweDdkLAorCSAgICAgIDB4N2MsICAgICAgIDB4N2IsICAgICAgIDB4N2IsICAgICAgIDB4N2EsCisJICAgICAgMHg3OSwgICAgICAgMHg3OCwgICAgICAgMHg3OCwgICAgICAgMHg3NywKKwkgICAgICAweDc2LCAgICAgICAweDc2LCAgICAgICAweDc1LCAgICAgICAweDc0LAorCSAgICAgIDB4NzMsICAgICAgIDB4NzMsICAgICAgIDB4NzIsICAgICAgIDB4NzEsCisJICAgICAgMHg3MSwgICAgICAgMHg2OCwgICAgICAgMHg0NSwgICAgICAgMHg1YiwKKwkgICAgICAweDZkLCAgICAgICAweDZjLCAgICAgICAweDZiLCAgICAgICAweDZhLAorCSAgICAgIDB4NjksICAgICAgIDB4NjgsICAgICAgIDB4NjcsICAgICAgIDB4NjYsCisJICAgICAgMHg2NSwgICAgICAgMHg2MywgICAgICAgMHg2MiwgICAgICAgMHg2MiwKKwkgICAgICAweDYwLCAgICAgICAweDVlLCAgICAgICAweDVjLCAgICAgICAweDViLAorCSAgICAgIDB4NTksICAgICAgIDB4NTcsICAgICAgIDB4NTUsICAgICAgIDB4NTMsCisJICAgICAgMHg1MiwgICAgICAgMHg0ZiwgICAgICAgMHg0ZCwgICAgICAgMHg0YSwKKwkgICAgICAweDQ4LCAgICAgICAweDQ2LCAgICAgICAweDQzLCAgICAgICAweDQwLAorCSAgICAgIDB4M2QsICAgICAgIDB4M2EsICAgICAgIDB4MzYsICAgICAgIDB4MzMsCisJICAgICAgMHgyZiwgICAgICAgMHgyYywgICAgICAgMHgyNywgICAgICAgMHgyMywKKwkgICAgICAweDFmLCAgICAgICAweDFhLCAgICAgICAweDE1LCAgICAgICAgMHhmLAorCSAgICAgICAweDgsICAgICAgICAweDUsICAgICAgICAweDIsICAgICAgICAweDEsCisJICAgICAgIDB4MQorfTsKKworc3RhdGljIHVpbnQgdGFzMzAwNF9iYXNzX3RhYltdPXsKKwkgICAgICAweDk2LCAgICAgICAweDk1LCAgICAgICAweDk1LCAgICAgICAweDk0LAorCSAgICAgIDB4OTMsICAgICAgIDB4OTIsICAgICAgIDB4OTIsICAgICAgIDB4OTEsCisJICAgICAgMHg5MCwgICAgICAgMHg5MCwgICAgICAgMHg4ZiwgICAgICAgMHg4ZSwKKwkgICAgICAweDhkLCAgICAgICAweDhkLCAgICAgICAweDhjLCAgICAgICAweDhiLAorCSAgICAgIDB4OGEsICAgICAgIDB4OGEsICAgICAgIDB4ODksICAgICAgIDB4ODgsCisJICAgICAgMHg4OCwgICAgICAgMHg4NywgICAgICAgMHg4NiwgICAgICAgMHg4NSwKKwkgICAgICAweDg1LCAgICAgICAweDg0LCAgICAgICAweDgzLCAgICAgICAweDgzLAorCSAgICAgIDB4ODIsICAgICAgIDB4ODEsICAgICAgIDB4ODAsICAgICAgIDB4ODAsCisJICAgICAgMHg3ZiwgICAgICAgMHg3ZSwgICAgICAgMHg3ZSwgICAgICAgMHg3ZCwKKwkgICAgICAweDdjLCAgICAgICAweDdiLCAgICAgICAweDdiLCAgICAgICAweDdhLAorCSAgICAgIDB4NzksICAgICAgIDB4NzgsICAgICAgIDB4NzgsICAgICAgIDB4NzcsCisJICAgICAgMHg3NiwgICAgICAgMHg3NiwgICAgICAgMHg3NSwgICAgICAgMHg3NCwKKwkgICAgICAweDczLCAgICAgICAweDczLCAgICAgICAweDcyLCAgICAgICAweDcxLAorCSAgICAgIDB4NzAsICAgICAgIDB4NmYsICAgICAgIDB4NmUsICAgICAgIDB4NmQsCisJICAgICAgMHg2YywgICAgICAgMHg2YiwgICAgICAgMHg2YSwgICAgICAgMHg2YSwKKwkgICAgICAweDY5LCAgICAgICAweDY3LCAgICAgICAweDY2LCAgICAgICAweDY2LAorCSAgICAgIDB4NjUsICAgICAgIDB4NjMsICAgICAgIDB4NjIsICAgICAgIDB4NjIsCisJICAgICAgMHg2MSwgICAgICAgMHg2MCwgICAgICAgMHg1ZSwgICAgICAgMHg1ZCwKKwkgICAgICAweDViLCAgICAgICAweDU5LCAgICAgICAweDU3LCAgICAgICAweDU1LAorCSAgICAgIDB4NTMsICAgICAgIDB4NTEsICAgICAgIDB4NGYsICAgICAgIDB4NGMsCisJICAgICAgMHg0YSwgICAgICAgMHg0OCwgICAgICAgMHg0NiwgICAgICAgMHg0NCwKKwkgICAgICAweDQxLCAgICAgICAweDNlLCAgICAgICAweDNiLCAgICAgICAweDM4LAorCSAgICAgIDB4MzYsICAgICAgIDB4MzMsICAgICAgIDB4MmYsICAgICAgIDB4MmIsCisJICAgICAgMHgyOCwgICAgICAgMHgyNCwgICAgICAgMHgyMCwgICAgICAgMHgxYywKKwkgICAgICAweDE3LCAgICAgICAweDEyLCAgICAgICAgMHhkLCAgICAgICAgMHg3LAorCSAgICAgICAweDEKK307CisKK3N0cnVjdCB0YXNfZ2Fpbl90IHRhczMwMDRfZ2Fpbj17CisgIC5tYXN0ZXIgID0gdGFzMzAwNF9tYXN0ZXJfdGFiLAorICAudHJlYmxlICA9IHRhczMwMDRfdHJlYmxlX3RhYiwKKyAgLmJhc3MgICAgPSB0YXMzMDA0X2Jhc3NfdGFiLAorICAubWl4ZXIgICA9IHRhczMwMDRfbWl4ZXJfdGFiCit9OworCitzdHJ1Y3QgdGFzX2VxX3ByZWZfdCAqdGFzMzAwNF9lcV9wcmVmc1tdPXsKKyAgJmVxcF8xN18xXzAsCisgICZlcXBfMThfMV8wLAorICAmZXFwXzFhXzFfMCwKKyAgJmVxcF8xY18xXzAsCisgIE5VTEwKK307CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvdGFzX2NvbW1vbi5jIGIvc291bmQvb3NzL2RtYXNvdW5kL3Rhc19jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZhMWZlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL3Rhc19jb21tb24uYwpAQCAtMCwwICsxLDIxNCBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc3lzY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vZXJybm8uaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcHJvbS5oPgorCisjaW5jbHVkZSAidGFzX2NvbW1vbi5oIgorCisjZGVmaW5lIENBTEwwKHByb2MpCQkJCQkJCQlcCisJZG8gewkJCQkJCQkJCVwKKwkJc3RydWN0IHRhc19kYXRhX3QgKnNlbGY7CQkJCQlcCisJCWlmICghdGFzX2NsaWVudCB8fCBkcml2ZXJfaG9va3MgPT0gTlVMTCkJCQlcCisJCQlyZXR1cm4gLTE7CQkJCQkJXAorCQlzZWxmID0gZGV2X2dldF9kcnZkYXRhKCZ0YXNfY2xpZW50LT5kZXYpOwkJCVwKKwkJaWYgKGRyaXZlcl9ob29rcy0+cHJvYykJCQkJCQlcCisJCQlyZXR1cm4gZHJpdmVyX2hvb2tzLT5wcm9jKHNlbGYpOwkJCVwKKwkJZWxzZQkJCQkJCQkJXAorCQkJcmV0dXJuIC1FSU5WQUw7CQkJCQkJXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQ0FMTChwcm9jLGFyZy4uLikJCQkJCQkJXAorCWRvIHsJCQkJCQkJCQlcCisJCXN0cnVjdCB0YXNfZGF0YV90ICpzZWxmOwkJCQkJXAorCQlpZiAoIXRhc19jbGllbnQgfHwgZHJpdmVyX2hvb2tzID09IE5VTEwpCQkJXAorCQkJcmV0dXJuIC0xOwkJCQkJCVwKKwkJc2VsZiA9IGRldl9nZXRfZHJ2ZGF0YSgmdGFzX2NsaWVudC0+ZGV2KTsJCQlcCisJCWlmIChkcml2ZXJfaG9va3MtPnByb2MpCQkJCQkJXAorCQkJcmV0dXJuIGRyaXZlcl9ob29rcy0+cHJvYyhzZWxmLCAjIyBhcmcpOwkJXAorCQllbHNlCQkJCQkJCQlcCisJCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCisJfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdTggdGFzX2kyY19hZGRyZXNzID0gMHgzNDsKK3N0YXRpYyBzdHJ1Y3QgaTJjX2NsaWVudCAqdGFzX2NsaWVudDsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX25vZGUqIHRhc19ub2RlOworCitzdGF0aWMgaW50IHRhc19hdHRhY2hfYWRhcHRlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKik7CitzdGF0aWMgaW50IHRhc19kZXRhY2hfY2xpZW50KHN0cnVjdCBpMmNfY2xpZW50ICopOworCitzdHJ1Y3QgaTJjX2RyaXZlciB0YXNfZHJpdmVyID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubmFtZQkJPSAidGFzIiwKKwkuZmxhZ3MJCT0gSTJDX0RGX05PVElGWSwKKwkuYXR0YWNoX2FkYXB0ZXIJPSB0YXNfYXR0YWNoX2FkYXB0ZXIsCisJLmRldGFjaF9jbGllbnQJPSB0YXNfZGV0YWNoX2NsaWVudCwKK307CisKK3N0cnVjdCB0YXNfZHJpdmVyX2hvb2tzX3QgKmRyaXZlcl9ob29rczsKKworaW50Cit0YXNfcmVnaXN0ZXJfZHJpdmVyKHN0cnVjdCB0YXNfZHJpdmVyX2hvb2tzX3QgKmhvb2tzKQoreworCWRyaXZlcl9ob29rcyA9IGhvb2tzOworCXJldHVybiAwOworfQorCitpbnQKK3Rhc19nZXRfbWl4ZXJfbGV2ZWwoaW50IG1peGVyLCB1aW50ICpsZXZlbCkKK3sKKwlDQUxMKGdldF9taXhlcl9sZXZlbCxtaXhlcixsZXZlbCk7Cit9CisKK2ludAordGFzX3NldF9taXhlcl9sZXZlbChpbnQgbWl4ZXIsdWludCBsZXZlbCkKK3sKKwlDQUxMKHNldF9taXhlcl9sZXZlbCxtaXhlcixsZXZlbCk7Cit9CisKK2ludAordGFzX2VudGVyX3NsZWVwKHZvaWQpCit7CisJQ0FMTDAoZW50ZXJfc2xlZXApOworfQorCitpbnQKK3Rhc19sZWF2ZV9zbGVlcCh2b2lkKQoreworCUNBTEwwKGxlYXZlX3NsZWVwKTsKK30KKworaW50Cit0YXNfc3VwcG9ydGVkX21peGVycyh2b2lkKQoreworCUNBTEwwKHN1cHBvcnRlZF9taXhlcnMpOworfQorCitpbnQKK3Rhc19taXhlcl9pc19zdGVyZW8oaW50IG1peGVyKQoreworCUNBTEwobWl4ZXJfaXNfc3RlcmVvLG1peGVyKTsKK30KKworaW50Cit0YXNfc3RlcmVvX21peGVycyh2b2lkKQoreworCUNBTEwwKHN0ZXJlb19taXhlcnMpOworfQorCitpbnQKK3Rhc19vdXRwdXRfZGV2aWNlX2NoYW5nZShpbnQgZGV2aWNlX2lkLGludCBsYXlvdXRfaWQsaW50IHNwZWFrZXJfaWQpCit7CisJQ0FMTChvdXRwdXRfZGV2aWNlX2NoYW5nZSxkZXZpY2VfaWQsbGF5b3V0X2lkLHNwZWFrZXJfaWQpOworfQorCitpbnQKK3Rhc19kZXZpY2VfaW9jdGwodV9pbnQgY21kLCB1X2xvbmcgYXJnKQoreworCUNBTEwoZGV2aWNlX2lvY3RsLGNtZCxhcmcpOworfQorCitpbnQKK3Rhc19wb3N0X2luaXQodm9pZCkKK3sKKwlDQUxMMChwb3N0X2luaXQpOworfQorCitzdGF0aWMgaW50Cit0YXNfZGV0ZWN0X2NsaWVudChzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIGludCBhZGRyZXNzKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjbGllbnRfbmFtZSA9ICJ0YXMgRGlnaXRhbCBFcXVhbGl6ZXIiOworCXN0cnVjdCBpMmNfY2xpZW50ICpuZXdfY2xpZW50OworCWludCByYyA9IC1FTk9ERVY7CisKKwlpZiAoIWRyaXZlcl9ob29rcykgeworCQlwcmludGsoS0VSTl9FUlIgInRhc19kZXRlY3RfY2xpZW50IGNhbGxlZCB3aXRoIG5vIGhvb2tzICFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJCisJbmV3X2NsaWVudCA9IGttYWxsb2Moc2l6ZW9mKCpuZXdfY2xpZW50KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFuZXdfY2xpZW50KQorCQlyZXR1cm4gLUVOT01FTTsKKwltZW1zZXQobmV3X2NsaWVudCwgMCwgc2l6ZW9mKCpuZXdfY2xpZW50KSk7CisKKwluZXdfY2xpZW50LT5hZGRyID0gYWRkcmVzczsKKwluZXdfY2xpZW50LT5hZGFwdGVyID0gYWRhcHRlcjsKKwluZXdfY2xpZW50LT5kcml2ZXIgPSAmdGFzX2RyaXZlcjsKKwlzdHJsY3B5KG5ld19jbGllbnQtPm5hbWUsIGNsaWVudF9uYW1lLCBERVZJQ0VfTkFNRV9TSVpFKTsKKworICAgICAgICBpZiAoZHJpdmVyX2hvb2tzLT5pbml0KG5ld19jbGllbnQpKQorCQlnb3RvIGJhaWw7CisKKwkvKiBUZWxsIHRoZSBpMmMgbGF5ZXIgYSBuZXcgY2xpZW50IGhhcyBhcnJpdmVkICovCisJaWYgKGkyY19hdHRhY2hfY2xpZW50KG5ld19jbGllbnQpKSB7CisJCWRyaXZlcl9ob29rcy0+dW5pbml0KGRldl9nZXRfZHJ2ZGF0YSgmbmV3X2NsaWVudC0+ZGV2KSk7CisJCWdvdG8gYmFpbDsKKwl9CisKKwl0YXNfY2xpZW50ID0gbmV3X2NsaWVudDsKKwlyZXR1cm4gMDsKKyBiYWlsOgorCXRhc19jbGllbnQgPSBOVUxMOworCWtmcmVlKG5ld19jbGllbnQpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAordGFzX2F0dGFjaF9hZGFwdGVyKHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlpZiAoIXN0cm5jbXAoYWRhcHRlci0+bmFtZSwgIm1hYy1pbyIsIDYpKQorCQlyZXR1cm4gdGFzX2RldGVjdF9jbGllbnQoYWRhcHRlciwgdGFzX2kyY19hZGRyZXNzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordGFzX2RldGFjaF9jbGllbnQoc3RydWN0IGkyY19jbGllbnQgKmNsaWVudCkKK3sKKwlpZiAoY2xpZW50ID09IHRhc19jbGllbnQpIHsKKwkJZHJpdmVyX2hvb2tzLT51bmluaXQoZGV2X2dldF9kcnZkYXRhKCZjbGllbnQtPmRldikpOworCisJCWkyY19kZXRhY2hfY2xpZW50KGNsaWVudCk7CisJCWtmcmVlKGNsaWVudCk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkCit0YXNfY2xlYW51cCh2b2lkKQoreworCWkyY19kZWxfZHJpdmVyKCZ0YXNfZHJpdmVyKTsKK30KKworaW50IF9faW5pdAordGFzX2luaXQoaW50IGRyaXZlcl9pZCwgY29uc3QgY2hhciAqZHJpdmVyX25hbWUpCit7CisJdTMyKiBwYWRkcjsKKworCXByaW50ayhLRVJOX0lORk8gInRhcyBkcml2ZXIgWyVzXSlcbiIsIGRyaXZlcl9uYW1lKTsKKworI2lmbmRlZiBDT05GSUdfSTJDX0tFWVdFU1QKKwlyZXF1ZXN0X21vZHVsZSgiaTJjLWtleXdlc3QiKTsKKyNlbmRpZgorCXRhc19ub2RlID0gZmluZF9kZXZpY2VzKCJkZXEiKTsKKwlpZiAodGFzX25vZGUgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJcGFkZHIgPSAodTMyICopZ2V0X3Byb3BlcnR5KHRhc19ub2RlLCAiaTJjLWFkZHJlc3MiLCBOVUxMKTsKKwlpZiAocGFkZHIpIHsKKwkJdGFzX2kyY19hZGRyZXNzID0gKCpwYWRkcikgPj4gMTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidXNpbmcgaTJjIGFkZHJlc3M6IDB4JXggZnJvbSBkZXZpY2UtdHJlZVxuIiwKKwkJCQl0YXNfaTJjX2FkZHJlc3MpOworCX0gZWxzZSAgICAKKwkJcHJpbnRrKEtFUk5fSU5GTyAidXNpbmcgaTJjIGFkZHJlc3M6IDB4JXggKGRlZmF1bHQpXG4iLAorCQkJCXRhc19pMmNfYWRkcmVzcyk7CisKKwlyZXR1cm4gaTJjX2FkZF9kcml2ZXIoJnRhc19kcml2ZXIpOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2RtYXNvdW5kL3Rhc19jb21tb24uaCBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXNfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E2ZDQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXNfY29tbW9uLmgKQEAgLTAsMCArMSwyODQgQEAKKyNpZm5kZWYgX1RBU19DT01NT05fSF8KKyNkZWZpbmUgX1RBU19DT01NT05fSF8KKworI2luY2x1ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGFzbS9zdHJpbmcuaD4KKworI2RlZmluZSBJMkNfRFJJVkVSSURfVEFTX0JBU0UgICAoMHhGRUJBKQorCisjZGVmaW5lIFNFVF80XzIwKHNoYWRvdywgb2Zmc2V0LCB2YWwpICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQkoc2hhZG93KVsob2Zmc2V0KSswXSA9ICgodmFsKSA+PiAxNikgJiAweGZmOyBcCisJCShzaGFkb3cpWyhvZmZzZXQpKzFdID0gKCh2YWwpID4+IDgpICAmIDB4ZmY7IFwKKwkJKHNoYWRvdylbKG9mZnNldCkrMl0gPSAoKHZhbCkgPj4gMCkgICYgMHhmZjsgXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgR0VUXzRfMjAoc2hhZG93LCBvZmZzZXQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJKCgodV9pbnQpKChzaGFkb3cpWyhvZmZzZXQpKzBdKSA8PCAxNikgfCAgICAgICAgICAgICBcCisJICgodV9pbnQpKChzaGFkb3cpWyhvZmZzZXQpKzFdKSA8PCAgOCkgfCAgICAgICAgICAgICBcCisJICgodV9pbnQpKChzaGFkb3cpWyhvZmZzZXQpKzJdKSA8PCAgMCkpCisKKworI2RlZmluZSBUQVNfQklRVUFEX0ZBU1RfTE9BRCAweDAxCisKKyNkZWZpbmUgVEFTX0RSQ0VfRU5BQkxFICAgICAgICAgICAweDAxCisjZGVmaW5lIFRBU19EUkNFX0FCT1ZFX1JBVElPICAgICAgMHgwMgorI2RlZmluZSBUQVNfRFJDRV9CRUxPV19SQVRJTyAgICAgIDB4MDQKKyNkZWZpbmUgVEFTX0RSQ0VfVEhSRVNIT0xEICAgICAgICAweDA4CisjZGVmaW5lIFRBU19EUkNFX0VORVJHWSAgICAgICAgICAgMHgxMAorI2RlZmluZSBUQVNfRFJDRV9BVFRBQ0sgICAgICAgICAgIDB4MjAKKyNkZWZpbmUgVEFTX0RSQ0VfREVDQVkgICAgICAgICAgICAweDQwCisKKyNkZWZpbmUgVEFTX0RSQ0VfQUxMICAgICAgICAgICAgICAweDdmCisKKworI2RlZmluZSBUQVNfT1VUUFVUX0hFQURQSE9ORVMgICAgIDB4MDAKKyNkZWZpbmUgVEFTX09VVFBVVF9JTlRFUk5BTF9TUEtSICAweDAxCisjZGVmaW5lIFRBU19PVVRQVVRfRVhURVJOQUxfU1BLUiAgMHgwMgorCisKK3VuaW9uIHRhc19iaXF1YWRfdCB7CisJc3RydWN0IHsKKwkJaW50IGIwLGIxLGIyLGExLGEyOworCX0gY29lZmY7CisJaW50IGJ1Zls1XTsKK307CisKK3N0cnVjdCB0YXNfYmlxdWFkX2N0cmxfdCB7CisJdV9pbnQgY2hhbm5lbDo0OworCXVfaW50IGZpbHRlcjo0OworCisJdW5pb24gdGFzX2JpcXVhZF90IGRhdGE7Cit9OworCitzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX2xpc3RfdCB7CisJaW50IGZsYWdzOworCWludCBmaWx0ZXJfY291bnQ7CisJc3RydWN0IHRhc19iaXF1YWRfY3RybF90IGJpcXVhZHNbMF07Cit9OworCitzdHJ1Y3QgdGFzX3JhdGlvX3QgeworCXVuc2lnbmVkIHNob3J0IHZhbDsgICAgLyogOC44ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwl1bnNpZ25lZCBzaG9ydCBleHBhbmQ7IC8qIDAgPSBjb21wcmVzcywgITAgPSBleHBhbmQuICovCit9OworCitzdHJ1Y3QgdGFzX2RyY2VfdCB7CisJdW5zaWduZWQgc2hvcnQgZW5hYmxlOworCXN0cnVjdCB0YXNfcmF0aW9fdCBhYm92ZTsKKwlzdHJ1Y3QgdGFzX3JhdGlvX3QgYmVsb3c7CisJc2hvcnQgdGhyZXNob2xkOyAgICAgICAvKiBkQiwgICAgICAgOC44IHNpZ25lZCAgICAqLworCXVuc2lnbmVkIHNob3J0IGVuZXJneTsgLyogc2Vjb25kcywgIDQuMTIgdW5zaWduZWQgKi8KKwl1bnNpZ25lZCBzaG9ydCBhdHRhY2s7IC8qIHNlY29uZHMsICA0LjEyIHVuc2lnbmVkICovCisJdW5zaWduZWQgc2hvcnQgZGVjYXk7ICAvKiBzZWNvbmRzLCAgNC4xMiB1bnNpZ25lZCAqLworfTsKKworc3RydWN0IHRhc19kcmNlX2N0cmxfdCB7CisJdWludCBmbGFnczsKKworCXN0cnVjdCB0YXNfZHJjZV90IGRhdGE7Cit9OworCitzdHJ1Y3QgdGFzX2dhaW5fdAoreworICB1bnNpZ25lZCBpbnQgKm1hc3RlcjsKKyAgdW5zaWduZWQgaW50ICp0cmVibGU7CisgIHVuc2lnbmVkIGludCAqYmFzczsKKyAgdW5zaWduZWQgaW50ICptaXhlcjsKK307CisKK3R5cGVkZWYgY2hhciB0YXNfc2hhZG93X3RbMHg0NV07CisKK3N0cnVjdCB0YXNfZGF0YV90Cit7CisJc3RydWN0IGkyY19jbGllbnQgKmNsaWVudDsKKwl0YXNfc2hhZG93X3QgKnNoYWRvdzsKKwl1aW50IG1peGVyW1NPVU5EX01JWEVSX05SREVWSUNFU107Cit9OworCit0eXBlZGVmIGludCAoKnRhc19ob29rX2luaXRfdCkoc3RydWN0IGkyY19jbGllbnQgKik7Cit0eXBlZGVmIGludCAoKnRhc19ob29rX3Bvc3RfaW5pdF90KShzdHJ1Y3QgdGFzX2RhdGFfdCAqKTsKK3R5cGVkZWYgdm9pZCAoKnRhc19ob29rX3VuaW5pdF90KShzdHJ1Y3QgdGFzX2RhdGFfdCAqKTsKKwordHlwZWRlZiBpbnQgKCp0YXNfaG9va19nZXRfbWl4ZXJfbGV2ZWxfdCkoc3RydWN0IHRhc19kYXRhX3QgKixpbnQsdWludCAqKTsKK3R5cGVkZWYgaW50ICgqdGFzX2hvb2tfc2V0X21peGVyX2xldmVsX3QpKHN0cnVjdCB0YXNfZGF0YV90ICosaW50LHVpbnQpOworCit0eXBlZGVmIGludCAoKnRhc19ob29rX2VudGVyX3NsZWVwX3QpKHN0cnVjdCB0YXNfZGF0YV90ICopOwordHlwZWRlZiBpbnQgKCp0YXNfaG9va19sZWF2ZV9zbGVlcF90KShzdHJ1Y3QgdGFzX2RhdGFfdCAqKTsKKwordHlwZWRlZiBpbnQgKCp0YXNfaG9va19zdXBwb3J0ZWRfbWl4ZXJzX3QpKHN0cnVjdCB0YXNfZGF0YV90ICopOwordHlwZWRlZiBpbnQgKCp0YXNfaG9va19taXhlcl9pc19zdGVyZW9fdCkoc3RydWN0IHRhc19kYXRhX3QgKixpbnQpOwordHlwZWRlZiBpbnQgKCp0YXNfaG9va19zdGVyZW9fbWl4ZXJzX3QpKHN0cnVjdCB0YXNfZGF0YV90ICopOworCit0eXBlZGVmIGludCAoKnRhc19ob29rX291dHB1dF9kZXZpY2VfY2hhbmdlX3QpKHN0cnVjdCB0YXNfZGF0YV90ICosaW50LGludCxpbnQpOwordHlwZWRlZiBpbnQgKCp0YXNfaG9va19kZXZpY2VfaW9jdGxfdCkoc3RydWN0IHRhc19kYXRhX3QgKix1X2ludCx1X2xvbmcpOworCitzdHJ1Y3QgdGFzX2RyaXZlcl9ob29rc190IHsKKwkvKgorCSAqIEFsbCBoYXJkd2FyZSBpbml0aWFsaXNhdGlvbiBtdXN0IGJlIHBlcmZvcm1lZCBpbgorCSAqIHBvc3RfaW5pdCgpLCBhcyB0YXNfZG1hc291bmRfaW5pdCgpIGRvZXMgYSBoYXJkd2FyZSByZXNldC4KKwkgKgorCSAqIGluaXQoKSBpcyBjYWxsZWQgYmVmb3JlIHRhc19kbWFzb3VuZF9pbml0KCkgc28gdGhhdAorCSAqIG91cHV0X2RldmljZV9jaGFuZ2UoKSBpcyBhbHdheXMgY2FsbGVkIGFmdGVyIGkyYyBkcml2ZXIKKwkgKiBpbml0aWFsaXNhdGlvbi4gVGhlIGltcGxpY2F0aW9uIGlzIHRoYXQKKwkgKiBvdXRwdXRfZGV2aWNlX2NoYW5nZSgpIG11c3QgY29wZSB3aXRoIHRoZSBmYWN0IHRoYXQgaXQKKwkgKiBtYXkgYmUgY2FsbGVkIGJlZm9yZSBwb3N0X2luaXQoKS4KKwkgKi8KKworCXRhc19ob29rX2luaXRfdCAgICAgICAgICAgICAgICAgICBpbml0OworCXRhc19ob29rX3Bvc3RfaW5pdF90ICAgICAgICAgICAgICBwb3N0X2luaXQ7CisJdGFzX2hvb2tfdW5pbml0X3QgICAgICAgICAgICAgICAgIHVuaW5pdDsKKworCXRhc19ob29rX2dldF9taXhlcl9sZXZlbF90ICAgICAgICBnZXRfbWl4ZXJfbGV2ZWw7CisJdGFzX2hvb2tfc2V0X21peGVyX2xldmVsX3QgICAgICAgIHNldF9taXhlcl9sZXZlbDsKKworCXRhc19ob29rX2VudGVyX3NsZWVwX3QgICAgICAgICAgICBlbnRlcl9zbGVlcDsKKwl0YXNfaG9va19sZWF2ZV9zbGVlcF90ICAgICAgICAgICAgbGVhdmVfc2xlZXA7CisKKwl0YXNfaG9va19zdXBwb3J0ZWRfbWl4ZXJzX3QgICAgICAgc3VwcG9ydGVkX21peGVyczsKKwl0YXNfaG9va19taXhlcl9pc19zdGVyZW9fdCAgICAgICAgbWl4ZXJfaXNfc3RlcmVvOworCXRhc19ob29rX3N0ZXJlb19taXhlcnNfdCAgICAgICAgICBzdGVyZW9fbWl4ZXJzOworCisJdGFzX2hvb2tfb3V0cHV0X2RldmljZV9jaGFuZ2VfdCAgIG91dHB1dF9kZXZpY2VfY2hhbmdlOworCXRhc19ob29rX2RldmljZV9pb2N0bF90ICAgICAgICAgICBkZXZpY2VfaW9jdGw7Cit9OworCitlbnVtIHRhc193cml0ZV9tb2RlX3QgeworCVdSSVRFX0hXICAgICA9IDB4MDEsCisJV1JJVEVfU0hBRE9XID0gMHgwMiwKKwlXUklURV9OT1JNQUwgPSAweDAzLAorCUZPUkNFX1dSSVRFICA9IDB4MDQKK307CisKK3N0YXRpYyBpbmxpbmUgdWludAordGFzX21vbm9fdG9fc3RlcmVvKHVpbnQgbW9ubykKK3sKKwltb25vICY9MHhmZjsKKwlyZXR1cm4gbW9ubyB8IChtb25vPDw4KTsKK30KKworLyoKKyAqIFRvZG86IG1ha2UgdGhlc2UgZnVuY3Rpb25zIGEgYml0IG1vcmUgZWZmaWNpZW50ICEKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3Rhc193cml0ZV9yZWdpc3RlcigJc3RydWN0IHRhc19kYXRhX3QgKnNlbGYsCisJCQl1aW50IHJlZ19udW0sCisJCQl1aW50IHJlZ193aWR0aCwKKwkJCWNoYXIgKmRhdGEsCisJCQl1aW50IHdyaXRlX21vZGUpCit7CisJaW50IHJjOworCisJaWYgKHJlZ193aWR0aD09MCB8fCBkYXRhPT1OVUxMIHx8IHNlbGY9PU5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCWlmICghKHdyaXRlX21vZGUgJiBGT1JDRV9XUklURSkgJiYKKwkgICAgIW1lbWNtcChkYXRhLHNlbGYtPnNoYWRvd1tyZWdfbnVtXSxyZWdfd2lkdGgpKQorCSAgICAJcmV0dXJuIDA7CisKKwlpZiAod3JpdGVfbW9kZSAmIFdSSVRFX1NIQURPVykKKwkJbWVtY3B5KHNlbGYtPnNoYWRvd1tyZWdfbnVtXSxkYXRhLHJlZ193aWR0aCk7CisJaWYgKHdyaXRlX21vZGUgJiBXUklURV9IVykgeworCQlyYz1pMmNfc21idXNfd3JpdGVfYmxvY2tfZGF0YShzZWxmLT5jbGllbnQsCisJCQkJCSAgICAgIHJlZ19udW0sCisJCQkJCSAgICAgIHJlZ193aWR0aCwKKwkJCQkJICAgICAgZGF0YSk7CisJCWlmIChyYyA8IDApIHsKKwkJCXByaW50aygidGFzOiBJMkMgYmxvY2sgd3JpdGUgZmFpbGVkIFxuIik7ICAKKwkJCXJldHVybiByYzsgCisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0YXNfc3luY19yZWdpc3RlcigJc3RydWN0IHRhc19kYXRhX3QgKnNlbGYsCisJCQl1aW50IHJlZ19udW0sCisJCQl1aW50IHJlZ193aWR0aCkKK3sKKwlpbnQgcmM7CisKKwlpZiAocmVnX3dpZHRoPT0wIHx8IHNlbGY9PU5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCXJjPWkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKHNlbGYtPmNsaWVudCwKKwkJCQkgICAgICByZWdfbnVtLAorCQkJCSAgICAgIHJlZ193aWR0aCwKKwkJCQkgICAgICBzZWxmLT5zaGFkb3dbcmVnX251bV0pOworCWlmIChyYyA8IDApIHsKKwkJcHJpbnRrKCJ0YXM6IEkyQyBibG9jayB3cml0ZSBmYWlsZWQgXG4iKTsKKwkJcmV0dXJuIHJjOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3Rhc193cml0ZV9ieXRlX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzX2RhdGFfdCAqc2VsZiwKKwkJCQl1aW50IHJlZ19udW0sCisJCQkJY2hhciBkYXRhLAorCQkJCXVpbnQgd3JpdGVfbW9kZSkKK3sKKwlpZiAoc2VsZj09TlVMTCkKKwkJcmV0dXJuIC0xOworCWlmICghKHdyaXRlX21vZGUgJiBGT1JDRV9XUklURSkgJiYgZGF0YSAhPSBzZWxmLT5zaGFkb3dbcmVnX251bV1bMF0pCisJCXJldHVybiAwOworCWlmICh3cml0ZV9tb2RlICYgV1JJVEVfU0hBRE9XKQorCQlzZWxmLT5zaGFkb3dbcmVnX251bV1bMF09ZGF0YTsKKwlpZiAod3JpdGVfbW9kZSAmIFdSSVRFX0hXKSB7CisJCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKHNlbGYtPmNsaWVudCwgcmVnX251bSwgZGF0YSkgPCAwKSB7CisJCQlwcmludGsoInRhczogSTJDIGJ5dGUgd3JpdGUgZmFpbGVkIFxuIik7ICAKKwkJCXJldHVybiAtMTsgCisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit0YXNfc3luY19ieXRlX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzX2RhdGFfdCAqc2VsZiwKKwkJCXVpbnQgcmVnX251bSwKKwkJCXVpbnQgcmVnX3dpZHRoKQoreworCWlmIChyZWdfd2lkdGg9PTAgfHwgc2VsZj09TlVMTCkKKwkJcmV0dXJuIC0xOworCWlmIChpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKAorCSAgICBzZWxmLT5jbGllbnQsIHJlZ19udW0sIHNlbGYtPnNoYWRvd1tyZWdfbnVtXVswXSkgPCAwKSB7CisJCXByaW50aygidGFzOiBJMkMgYnl0ZSB3cml0ZSBmYWlsZWQgXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3Rhc19yZWFkX3JlZ2lzdGVyKAlzdHJ1Y3QgdGFzX2RhdGFfdCAqc2VsZiwKKwkJCXVpbnQgcmVnX251bSwKKwkJCXVpbnQgcmVnX3dpZHRoLAorCQkJY2hhciAqZGF0YSkKK3sKKwlpZiAocmVnX3dpZHRoPT0wIHx8IGRhdGE9PU5VTEwgfHwgc2VsZj09TlVMTCkKKwkJcmV0dXJuIC0xOworCW1lbWNweShkYXRhLHNlbGYtPnNoYWRvd1tyZWdfbnVtXSxyZWdfd2lkdGgpOworCXJldHVybiAwOworfQorCitleHRlcm4gaW50IHRhc19yZWdpc3Rlcl9kcml2ZXIoc3RydWN0IHRhc19kcml2ZXJfaG9va3NfdCAqaG9va3MpOworCitleHRlcm4gaW50IHRhc19nZXRfbWl4ZXJfbGV2ZWwoaW50IG1peGVyLHVpbnQgKmxldmVsKTsKK2V4dGVybiBpbnQgdGFzX3NldF9taXhlcl9sZXZlbChpbnQgbWl4ZXIsdWludCBsZXZlbCk7CitleHRlcm4gaW50IHRhc19lbnRlcl9zbGVlcCh2b2lkKTsKK2V4dGVybiBpbnQgdGFzX2xlYXZlX3NsZWVwKHZvaWQpOworZXh0ZXJuIGludCB0YXNfc3VwcG9ydGVkX21peGVycyh2b2lkKTsKK2V4dGVybiBpbnQgdGFzX21peGVyX2lzX3N0ZXJlbyhpbnQgbWl4ZXIpOworZXh0ZXJuIGludCB0YXNfc3RlcmVvX21peGVycyh2b2lkKTsKK2V4dGVybiBpbnQgdGFzX291dHB1dF9kZXZpY2VfY2hhbmdlKGludCxpbnQsaW50KTsKK2V4dGVybiBpbnQgdGFzX2RldmljZV9pb2N0bCh1X2ludCwgdV9sb25nKTsKKworZXh0ZXJuIHZvaWQgdGFzX2NsZWFudXAodm9pZCk7CitleHRlcm4gaW50IHRhc19pbml0KGludCBkcml2ZXJfaWQsY29uc3QgY2hhciAqZHJpdmVyX25hbWUpOworZXh0ZXJuIGludCB0YXNfcG9zdF9pbml0KHZvaWQpOworCisjZW5kaWYgLyogX1RBU19DT01NT05fSF8gKi8KKy8qCisgKiBMb2NhbCBWYXJpYWJsZXM6CisgKiB0YWItd2lkdGg6IDgKKyAqIGluZGVudC10YWJzLW1vZGU6IHQKKyAqIGMtYmFzaWMtb2Zmc2V0OiA4CisgKiBFbmQ6CisgKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC90YXNfZXFfcHJlZnMuaCBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXNfZXFfcHJlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTk5NGVkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2RtYXNvdW5kL3Rhc19lcV9wcmVmcy5oCkBAIC0wLDAgKzEsMjQgQEAKKyNpZm5kZWYgX1RBU19FUV9QUkVGU19IXworI2RlZmluZSBfVEFTX0VRX1BSRUZTX0hfCisKK3N0cnVjdCB0YXNfZXFfcHJlZl90IHsKKwl1X2ludCBzYW1wbGVfcmF0ZTsKKwl1X2ludCBkZXZpY2VfaWQ7CisJdV9pbnQgb3V0cHV0X2lkOworCXVfaW50IHNwZWFrZXJfaWQ7CisKKwlzdHJ1Y3QgdGFzX2RyY2VfdCAqZHJjZTsKKworCXVfaW50IGZpbHRlcl9jb3VudDsKKwlzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QgKmJpcXVhZHM7Cit9OworCisjZW5kaWYgLyogX1RBU19FUV9QUkVGU19IXyAqLworCisvKgorICogTG9jYWwgVmFyaWFibGVzOgorICogdGFiLXdpZHRoOiA4CisgKiBpbmRlbnQtdGFicy1tb2RlOiB0CisgKiBjLWJhc2ljLW9mZnNldDogOAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZG1hc291bmQvdGFzX2lvY3RsLmggYi9zb3VuZC9vc3MvZG1hc291bmQvdGFzX2lvY3RsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjYWUzYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC90YXNfaW9jdGwuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9UQVNfSU9DVExfSF8KKyNkZWZpbmUgX1RBU19JT0NUTF9IXworCisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisKKworI2RlZmluZSBUQVNfUkVBRF9FUSAgICAgICAgICAgICAgX1NJT1IoJ3QnLDAsc3RydWN0IHRhc19iaXF1YWRfY3RybF90KQorI2RlZmluZSBUQVNfV1JJVEVfRVEgICAgICAgICAgICAgX1NJT1coJ3QnLDAsc3RydWN0IHRhc19iaXF1YWRfY3RybF90KQorCisjZGVmaW5lIFRBU19SRUFEX0VRX0xJU1QgICAgICAgICBfU0lPUigndCcsMSxzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QpCisjZGVmaW5lIFRBU19XUklURV9FUV9MSVNUICAgICAgICBfU0lPVygndCcsMSxzdHJ1Y3QgdGFzX2JpcXVhZF9jdHJsX3QpCisKKyNkZWZpbmUgVEFTX1JFQURfRVFfRklMVEVSX0NPVU5UICBfU0lPUigndCcsMixpbnQpCisjZGVmaW5lIFRBU19SRUFEX0VRX0NIQU5ORUxfQ09VTlQgX1NJT1IoJ3QnLDMsaW50KQorCisjZGVmaW5lIFRBU19SRUFEX0RSQ0UgICAgICAgICAgICBfU0lPUigndCcsNCxzdHJ1Y3QgdGFzX2RyY2VfY3RybF90KQorI2RlZmluZSBUQVNfV1JJVEVfRFJDRSAgICAgICAgICAgX1NJT1coJ3QnLDQsc3RydWN0IHRhc19kcmNlX2N0cmxfdCkKKworI2RlZmluZSBUQVNfUkVBRF9EUkNFX0NBUFMgICAgICAgX1NJT1IoJ3QnLDUsaW50KQorI2RlZmluZSBUQVNfUkVBRF9EUkNFX01JTiAgICAgICAgX1NJT1IoJ3QnLDYsaW50KQorI2RlZmluZSBUQVNfUkVBRF9EUkNFX01BWCAgICAgICAgX1NJT1IoJ3QnLDcsaW50KQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9kbWFzb3VuZC90cmFuc18xNi5jIGIvc291bmQvb3NzL2RtYXNvdW5kL3RyYW5zXzE2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1NjJlOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9kbWFzb3VuZC90cmFuc18xNi5jCkBAIC0wLDAgKzEsODk3IEBACisvKgorICogIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC90cmFuc18xNi5jCisgKgorICogIDE2IGJpdCB0cmFuc2xhdGlvbiByb3V0aW5lcy4gIE9ubHkgdXNlZCBieSBQb3dlciBtYWMgYXQgcHJlc2VudC4KKyAqCisgKiAgU2VlIGxpbnV4L3NvdW5kL29zcy9kbWFzb3VuZC9kbWFzb3VuZF9jb3JlLmMgZm9yIGNvcHlyaWdodCBhbmQKKyAqICBoaXN0b3J5IHByaW9yIHRvIDA4LzAyLzIwMDEuCisgKgorICogIDA4LzAyLzIwMDEgSWFpbiBTYW5kb2UKKyAqCQlzcGxpdCBmcm9tIGRtYXNvdW5kX2F3YWNzLmMKKyAqICAxMS8yOS8yMDAzIFJlbnpvIERhdm9saSAoS2luZyBFbnpvKQorICogIAktIGlucHV0IHJlc2FtcGxpbmcgKGZvciBzb2Z0IHJhdGUgPCBoYXJkIHJhdGUpCisgKiAgCS0gc29mdHdhcmUgbGluZSBpbiBnYWluIGNvbnRyb2wKKyAqLworCisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlICJkbWFzb3VuZC5oIgorCitzdGF0aWMgc2hvcnQgZG1hc291bmRfYWxhdzJkbWExNltdIDsKK3N0YXRpYyBzaG9ydCBkbWFzb3VuZF91bGF3MmRtYTE2W10gOworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X2xhdyhjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3RfczgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgcG1hY19jdF91OChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3MxNihjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3RfdTE2KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpOworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0eF9sYXcoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X3M4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgcG1hY19jdHhfdTgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCk7CitzdGF0aWMgc3NpemVfdCBwbWFjX2N0eF9zMTYoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X3UxNihjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpOworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3MxNl9yZWFkKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpOworc3RhdGljIHNzaXplX3QgcG1hY19jdF91MTZfcmVhZChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KTsKKworLyoqKiBUcmFuc2xhdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IGV4cGFuZF9kYXRhOwkvKiBEYXRhIGZvciBleHBhbmRpbmcgKi8KKworc3RhdGljIHNzaXplX3QgcG1hY19jdF9sYXcoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzaG9ydCAqdGFibGUgPSBkbWFzb3VuZC5zb2Z0LmZvcm1hdCA9PSBBRk1UX01VX0xBVworCQk/IGRtYXNvdW5kX3VsYXcyZG1hMTYgOiBkbWFzb3VuZF9hbGF3MmRtYTE2OworCXNzaXplX3QgY291bnQsIHVzZWQ7CisJc2hvcnQgKnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCWludCB2YWwsIHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCisJZnJhbWVMZWZ0ID4+PSAyOworCWlmIChzdGVyZW8pCisJCXVzZXJDb3VudCA+Pj0gMTsKKwl1c2VkID0gY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQl1X2NoYXIgZGF0YTsKKwkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdmFsID0gdGFibGVbZGF0YV07CisJCSpwKysgPSB2YWw7CisJCWlmIChzdGVyZW8pIHsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCB1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdmFsID0gdGFibGVbZGF0YV07CisJCX0KKwkJKnArKyA9IHZhbDsKKwkJY291bnQtLTsKKwl9CisJKmZyYW1lVXNlZCArPSB1c2VkICogNDsKKwlyZXR1cm4gc3RlcmVvPyB1c2VkICogMjogdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3M4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNzaXplX3QgY291bnQsIHVzZWQ7CisJc2hvcnQgKnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCWludCB2YWwsIHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCisJZnJhbWVMZWZ0ID4+PSAyOworCWlmIChzdGVyZW8pCisJCXVzZXJDb3VudCA+Pj0gMTsKKwl1c2VkID0gY291bnQgPSBtaW5fdCh1bnNpZ25lZCBsb25nLCB1c2VyQ291bnQsIGZyYW1lTGVmdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQl1X2NoYXIgZGF0YTsKKwkJaWYgKGdldF91c2VyKGRhdGEsIHVzZXJQdHIrKykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdmFsID0gZGF0YSA8PCA4OworCQkqcCsrID0gdmFsOworCQlpZiAoc3RlcmVvKSB7CisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXNlclB0cisrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXZhbCA9IGRhdGEgPDwgODsKKwkJfQorCQkqcCsrID0gdmFsOworCQljb3VudC0tOworCX0KKwkqZnJhbWVVc2VkICs9IHVzZWQgKiA0OworCXJldHVybiBzdGVyZW8/IHVzZWQgKiAyOiB1c2VkOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3RfdTgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwlzaG9ydCAqcCA9IChzaG9ydCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJaW50IHZhbCwgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisKKwlmcmFtZUxlZnQgPj49IDI7CisJaWYgKHN0ZXJlbykKKwkJdXNlckNvdW50ID4+PSAxOworCXVzZWQgPSBjb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXVfY2hhciBkYXRhOworCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXNlclB0cisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2YWwgPSAoZGF0YSBeIDB4ODApIDw8IDg7CisJCSpwKysgPSB2YWw7CisJCWlmIChzdGVyZW8pIHsKKwkJCWlmIChnZXRfdXNlcihkYXRhLCB1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdmFsID0gKGRhdGEgXiAweDgwKSA8PCA4OworCQl9CisJCSpwKysgPSB2YWw7CisJCWNvdW50LS07CisJfQorCSpmcmFtZVVzZWQgKz0gdXNlZCAqIDQ7CisJcmV0dXJuIHN0ZXJlbz8gdXNlZCAqIDI6IHVzZWQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgcG1hY19jdF9zMTYoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlzc2l6ZV90IGNvdW50LCB1c2VkOworCWludCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKwlzaG9ydCAqZnAgPSAoc2hvcnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCisJZnJhbWVMZWZ0ID4+PSAyOworCXVzZXJDb3VudCA+Pj0gKHN0ZXJlbz8gMjogMSk7CisJdXNlZCA9IGNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCWlmICghc3RlcmVvKSB7CisJCXNob3J0IF9fdXNlciAqdXAgPSAoc2hvcnQgX191c2VyICopIHVzZXJQdHI7CisJCXdoaWxlIChjb3VudCA+IDApIHsKKwkJCXNob3J0IGRhdGE7CisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXArKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkqZnArKyA9IGRhdGE7CisJCQkqZnArKyA9IGRhdGE7CisJCQljb3VudC0tOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGZwLCB1c2VyUHRyLCBjb3VudCAqIDQpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCSpmcmFtZVVzZWQgKz0gdXNlZCAqIDQ7CisJcmV0dXJuIHN0ZXJlbz8gdXNlZCAqIDQ6IHVzZWQgKiAyOworfQorCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3UxNihjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNzaXplX3QgY291bnQsIHVzZWQ7CisJaW50IG1hc2sgPSAoZG1hc291bmQuc29mdC5mb3JtYXQgPT0gQUZNVF9VMTZfTEU/IDB4MDA4MDogMHg4MDAwKTsKKwlpbnQgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisJc2hvcnQgKmZwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlzaG9ydCBfX3VzZXIgKnVwID0gKHNob3J0IF9fdXNlciAqKSB1c2VyUHRyOworCisJZnJhbWVMZWZ0ID4+PSAyOworCXVzZXJDb3VudCA+Pj0gKHN0ZXJlbz8gMjogMSk7CisJdXNlZCA9IGNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc2hvcnQgZGF0YTsKKwkJaWYgKGdldF91c2VyKGRhdGEsIHVwKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWRhdGEgXj0gbWFzazsKKwkJKmZwKysgPSBkYXRhOworCQlpZiAoc3RlcmVvKSB7CisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXArKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkYXRhIF49IG1hc2s7CisJCX0KKwkJKmZwKysgPSBkYXRhOworCQljb3VudC0tOworCX0KKwkqZnJhbWVVc2VkICs9IHVzZWQgKiA0OworCXJldHVybiBzdGVyZW8/IHVzZWQgKiA0OiB1c2VkICogMjsKK30KKworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0eF9sYXcoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXVuc2lnbmVkIHNob3J0ICp0YWJsZSA9ICh1bnNpZ25lZCBzaG9ydCAqKQorCQkoZG1hc291bmQuc29mdC5mb3JtYXQgPT0gQUZNVF9NVV9MQVcKKwkJID8gZG1hc291bmRfdWxhdzJkbWExNiA6IGRtYXNvdW5kX2FsYXcyZG1hMTYpOworCXVuc2lnbmVkIGludCBkYXRhID0gZXhwYW5kX2RhdGE7CisJdW5zaWduZWQgaW50ICpwID0gKHVuc2lnbmVkIGludCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJaW50IGJhbCA9IGV4cGFuZF9iYWw7CisJaW50IGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJaW50IHV0b3RhbCwgZnRvdGFsOworCWludCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwlpZiAoc3RlcmVvKQorCQl1c2VyQ291bnQgPj49IDE7CisJZnRvdGFsID0gZnJhbWVMZWZ0OworCXV0b3RhbCA9IHVzZXJDb3VudDsKKwl3aGlsZSAoZnJhbWVMZWZ0KSB7CisJCXVfY2hhciBjOworCQlpZiAoYmFsIDwgMCkgeworCQkJaWYgKHVzZXJDb3VudCA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGdldF91c2VyKGMsIHVzZXJQdHIrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlkYXRhID0gdGFibGVbY107CisJCQlpZiAoc3RlcmVvKSB7CisJCQkJaWYgKGdldF91c2VyKGMsIHVzZXJQdHIrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgPSAoZGF0YSA8PCAxNikgKyB0YWJsZVtjXTsKKwkJCX0gZWxzZQorCQkJCWRhdGEgPSAoZGF0YSA8PCAxNikgKyBkYXRhOworCQkJdXNlckNvdW50LS07CisJCQliYWwgKz0gaFNwZWVkOworCQl9CisJCSpwKysgPSBkYXRhOworCQlmcmFtZUxlZnQtLTsKKwkJYmFsIC09IHNTcGVlZDsKKwl9CisJZXhwYW5kX2JhbCA9IGJhbDsKKwlleHBhbmRfZGF0YSA9IGRhdGE7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KSAqIDQ7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gc3RlcmVvPyB1dG90YWwgKiAyOiB1dG90YWw7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X3M4KGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJdW5zaWduZWQgaW50ICpwID0gKHVuc2lnbmVkIGludCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJdW5zaWduZWQgaW50IGRhdGEgPSBleHBhbmRfZGF0YTsKKwlpbnQgYmFsID0gZXhwYW5kX2JhbDsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisJaW50IHV0b3RhbCwgZnRvdGFsOworCisJZnJhbWVMZWZ0ID4+PSAyOworCWlmIChzdGVyZW8pCisJCXVzZXJDb3VudCA+Pj0gMTsKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJdV9jaGFyIGM7CisJCWlmIChiYWwgPCAwKSB7CisJCQlpZiAodXNlckNvdW50ID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWRhdGEgPSBjIDw8IDg7CisJCQlpZiAoc3RlcmVvKSB7CisJCQkJaWYgKGdldF91c2VyKGMsIHVzZXJQdHIrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCWRhdGEgPSAoZGF0YSA8PCAxNikgKyAoYyA8PCA4KTsKKwkJCX0gZWxzZQorCQkJCWRhdGEgPSAoZGF0YSA8PCAxNikgKyBkYXRhOworCQkJdXNlckNvdW50LS07CisJCQliYWwgKz0gaFNwZWVkOworCQl9CisJCSpwKysgPSBkYXRhOworCQlmcmFtZUxlZnQtLTsKKwkJYmFsIC09IHNTcGVlZDsKKwl9CisJZXhwYW5kX2JhbCA9IGJhbDsKKwlleHBhbmRfZGF0YSA9IGRhdGE7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KSAqIDQ7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gc3RlcmVvPyB1dG90YWwgKiAyOiB1dG90YWw7Cit9CisKKworc3RhdGljIHNzaXplX3QgcG1hY19jdHhfdTgoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwl1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwl1bnNpZ25lZCBpbnQgZGF0YSA9IGV4cGFuZF9kYXRhOworCWludCBiYWwgPSBleHBhbmRfYmFsOworCWludCBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCWludCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisKKwlmcmFtZUxlZnQgPj49IDI7CisJaWYgKHN0ZXJlbykKKwkJdXNlckNvdW50ID4+PSAxOworCWZ0b3RhbCA9IGZyYW1lTGVmdDsKKwl1dG90YWwgPSB1c2VyQ291bnQ7CisJd2hpbGUgKGZyYW1lTGVmdCkgeworCQl1X2NoYXIgYzsKKwkJaWYgKGJhbCA8IDApIHsKKwkJCWlmICh1c2VyQ291bnQgPT0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChnZXRfdXNlcihjLCB1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZGF0YSA9IChjIF4gMHg4MCkgPDwgODsKKwkJCWlmIChzdGVyZW8pIHsKKwkJCQlpZiAoZ2V0X3VzZXIoYywgdXNlclB0cisrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArICgoYyBeIDB4ODApIDw8IDgpOworCQkJfSBlbHNlCisJCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIGRhdGE7CisJCQl1c2VyQ291bnQtLTsKKwkJCWJhbCArPSBoU3BlZWQ7CisJCX0KKwkJKnArKyA9IGRhdGE7CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKwlleHBhbmRfYmFsID0gYmFsOworCWV4cGFuZF9kYXRhID0gZGF0YTsKKwkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDI6IHV0b3RhbDsKK30KKworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0eF9zMTYoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgICB1X2NoYXIgZnJhbWVbXSwgc3NpemVfdCAqZnJhbWVVc2VkLAorCQkJICAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXVuc2lnbmVkIGludCAqcCA9ICh1bnNpZ25lZCBpbnQgKikgJmZyYW1lWypmcmFtZVVzZWRdOworCXVuc2lnbmVkIGludCBkYXRhID0gZXhwYW5kX2RhdGE7CisJdW5zaWduZWQgc2hvcnQgX191c2VyICp1cCA9ICh1bnNpZ25lZCBzaG9ydCBfX3VzZXIgKikgdXNlclB0cjsKKwlpbnQgYmFsID0gZXhwYW5kX2JhbDsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisJaW50IHV0b3RhbCwgZnRvdGFsOworCisJZnJhbWVMZWZ0ID4+PSAyOworCXVzZXJDb3VudCA+Pj0gKHN0ZXJlbz8gMjogMSk7CisJZnRvdGFsID0gZnJhbWVMZWZ0OworCXV0b3RhbCA9IHVzZXJDb3VudDsKKwl3aGlsZSAoZnJhbWVMZWZ0KSB7CisJCXVuc2lnbmVkIHNob3J0IGM7CisJCWlmIChiYWwgPCAwKSB7CisJCQlpZiAodXNlckNvdW50ID09IDApCisJCQkJYnJlYWs7CisJCQlpZiAoZ2V0X3VzZXIoZGF0YSwgdXArKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoc3RlcmVvKSB7CisJCQkJaWYgKGdldF91c2VyKGMsIHVwKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlkYXRhID0gKGRhdGEgPDwgMTYpICsgYzsKKwkJCX0gZWxzZQorCQkJCWRhdGEgPSAoZGF0YSA8PCAxNikgKyBkYXRhOworCQkJdXNlckNvdW50LS07CisJCQliYWwgKz0gaFNwZWVkOworCQl9CisJCSpwKysgPSBkYXRhOworCQlmcmFtZUxlZnQtLTsKKwkJYmFsIC09IHNTcGVlZDsKKwl9CisJZXhwYW5kX2JhbCA9IGJhbDsKKwlleHBhbmRfZGF0YSA9IGRhdGE7CisJKmZyYW1lVXNlZCArPSAoZnRvdGFsIC0gZnJhbWVMZWZ0KSAqIDQ7CisJdXRvdGFsIC09IHVzZXJDb3VudDsKKwlyZXR1cm4gc3RlcmVvPyB1dG90YWwgKiA0OiB1dG90YWwgKiAyOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHBtYWNfY3R4X3UxNihjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJaW50IG1hc2sgPSAoZG1hc291bmQuc29mdC5mb3JtYXQgPT0gQUZNVF9VMTZfTEU/IDB4MDA4MDogMHg4MDAwKTsKKwl1bnNpZ25lZCBpbnQgKnAgPSAodW5zaWduZWQgaW50ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwl1bnNpZ25lZCBpbnQgZGF0YSA9IGV4cGFuZF9kYXRhOworCXVuc2lnbmVkIHNob3J0IF9fdXNlciAqdXAgPSAodW5zaWduZWQgc2hvcnQgX191c2VyICopIHVzZXJQdHI7CisJaW50IGJhbCA9IGV4cGFuZF9iYWw7CisJaW50IGhTcGVlZCA9IGRtYXNvdW5kLmhhcmQuc3BlZWQsIHNTcGVlZCA9IGRtYXNvdW5kLnNvZnQuc3BlZWQ7CisJaW50IHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCWludCB1dG90YWwsIGZ0b3RhbDsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwl1c2VyQ291bnQgPj49IChzdGVyZW8/IDI6IDEpOworCWZ0b3RhbCA9IGZyYW1lTGVmdDsKKwl1dG90YWwgPSB1c2VyQ291bnQ7CisJd2hpbGUgKGZyYW1lTGVmdCkgeworCQl1bnNpZ25lZCBzaG9ydCBjOworCQlpZiAoYmFsIDwgMCkgeworCQkJaWYgKHVzZXJDb3VudCA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGdldF91c2VyKGRhdGEsIHVwKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJZGF0YSBePSBtYXNrOworCQkJaWYgKHN0ZXJlbykgeworCQkJCWlmIChnZXRfdXNlcihjLCB1cCsrKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJZGF0YSA9IChkYXRhIDw8IDE2KSArIChjIF4gbWFzayk7CisJCQl9IGVsc2UKKwkJCQlkYXRhID0gKGRhdGEgPDwgMTYpICsgZGF0YTsKKwkJCXVzZXJDb3VudC0tOworCQkJYmFsICs9IGhTcGVlZDsKKwkJfQorCQkqcCsrID0gZGF0YTsKKwkJZnJhbWVMZWZ0LS07CisJCWJhbCAtPSBzU3BlZWQ7CisJfQorCWV4cGFuZF9iYWwgPSBiYWw7CisJZXhwYW5kX2RhdGEgPSBkYXRhOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCkgKiA0OworCXV0b3RhbCAtPSB1c2VyQ291bnQ7CisJcmV0dXJuIHN0ZXJlbz8gdXRvdGFsICogNDogdXRvdGFsICogMjsKK30KKworLyogZGF0YSBpbiByb3V0aW5lcy4uLiAqLworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3M4X3JlYWQoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwlzaG9ydCAqcCA9IChzaG9ydCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJaW50IHZhbCwgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisKKwlmcmFtZUxlZnQgPj49IDI7CisJaWYgKHN0ZXJlbykKKwkJdXNlckNvdW50ID4+PSAxOworCXVzZWQgPSBjb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXVfY2hhciBkYXRhOworCisJCXZhbCA9ICpwKys7CisJCXZhbCA9ICh2YWwgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCWRhdGEgPSB2YWwgPj4gODsKKwkJaWYgKHB1dF91c2VyKGRhdGEsICh1X2NoYXIgX191c2VyICopdXNlclB0cisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoc3RlcmVvKSB7CisJCQl2YWwgPSAqcDsKKwkJCXZhbCA9ICh2YWwgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCQlkYXRhID0gdmFsID4+IDg7CisJCQlpZiAocHV0X3VzZXIoZGF0YSwgKHVfY2hhciBfX3VzZXIgKil1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXArKzsKKwkJY291bnQtLTsKKwl9CisJKmZyYW1lVXNlZCArPSB1c2VkICogNDsKKwlyZXR1cm4gc3RlcmVvPyB1c2VkICogMjogdXNlZDsKK30KKworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0X3U4X3JlYWQoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgc3NpemVfdCBmcmFtZUxlZnQpCit7CisJc3NpemVfdCBjb3VudCwgdXNlZDsKKwlzaG9ydCAqcCA9IChzaG9ydCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJaW50IHZhbCwgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisKKwlmcmFtZUxlZnQgPj49IDI7CisJaWYgKHN0ZXJlbykKKwkJdXNlckNvdW50ID4+PSAxOworCXVzZWQgPSBjb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXVfY2hhciBkYXRhOworCisJCXZhbCA9ICpwKys7CisJCXZhbCA9ICh2YWwgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCWRhdGEgPSAodmFsID4+IDgpIF4gMHg4MDsKKwkJaWYgKHB1dF91c2VyKGRhdGEsICh1X2NoYXIgX191c2VyICopdXNlclB0cisrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoc3RlcmVvKSB7CisJCQl2YWwgPSAqcDsKKwkJCXZhbCA9ICh2YWwgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCQlkYXRhID0gKHZhbCA+PiA4KSBeIDB4ODA7CisJCQlpZiAocHV0X3VzZXIoZGF0YSwgKHVfY2hhciBfX3VzZXIgKil1c2VyUHRyKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXArKzsKKwkJY291bnQtLTsKKwl9CisJKmZyYW1lVXNlZCArPSB1c2VkICogNDsKKwlyZXR1cm4gc3RlcmVvPyB1c2VkICogMjogdXNlZDsKK30KKworc3RhdGljIHNzaXplX3QgcG1hY19jdF9zMTZfcmVhZChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNzaXplX3QgY291bnQsIHVzZWQ7CisJaW50IHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCXNob3J0ICpmcCA9IChzaG9ydCAqKSAmZnJhbWVbKmZyYW1lVXNlZF07CisJc2hvcnQgX191c2VyICp1cCA9IChzaG9ydCBfX3VzZXIgKikgdXNlclB0cjsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwl1c2VyQ291bnQgPj49IChzdGVyZW8/IDI6IDEpOworCXVzZWQgPSBjb3VudCA9IG1pbl90KHVuc2lnbmVkIGxvbmcsIHVzZXJDb3VudCwgZnJhbWVMZWZ0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNob3J0IGRhdGE7CisKKwkJZGF0YSA9ICpmcCsrOworCQlkYXRhID0gKGRhdGEgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCWlmIChwdXRfdXNlcihkYXRhLCB1cCsrKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoc3RlcmVvKSB7CisJCQlkYXRhID0gKmZwOworCQkJZGF0YSA9IChkYXRhICogc29mdHdhcmVfaW5wdXRfdm9sdW1lKSA+PiA3OworCQkJaWYgKHB1dF91c2VyKGRhdGEsIHVwKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWZwKys7CisJCWNvdW50LS07CisgCX0KKwkqZnJhbWVVc2VkICs9IHVzZWQgKiA0OworCXJldHVybiBzdGVyZW8/IHVzZWQgKiA0OiB1c2VkICogMjsKK30KKworc3RhdGljIHNzaXplX3QgcG1hY19jdF91MTZfcmVhZChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNzaXplX3QgY291bnQsIHVzZWQ7CisJaW50IG1hc2sgPSAoZG1hc291bmQuc29mdC5mb3JtYXQgPT0gQUZNVF9VMTZfTEU/IDB4MDA4MDogMHg4MDAwKTsKKwlpbnQgc3RlcmVvID0gZG1hc291bmQuc29mdC5zdGVyZW87CisJc2hvcnQgKmZwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlzaG9ydCBfX3VzZXIgKnVwID0gKHNob3J0IF9fdXNlciAqKSB1c2VyUHRyOworCisJZnJhbWVMZWZ0ID4+PSAyOworCXVzZXJDb3VudCA+Pj0gKHN0ZXJlbz8gMjogMSk7CisJdXNlZCA9IGNvdW50ID0gbWluX3QodW5zaWduZWQgbG9uZywgdXNlckNvdW50LCBmcmFtZUxlZnQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJaW50IGRhdGE7CisKKwkJZGF0YSA9ICpmcCsrOworCQlkYXRhID0gKGRhdGEgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCWRhdGEgXj0gbWFzazsKKwkJaWYgKHB1dF91c2VyKGRhdGEsIHVwKyspKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChzdGVyZW8pIHsKKwkJCWRhdGEgPSAqZnA7CisJCQlkYXRhID0gKGRhdGEgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCQlkYXRhIF49IG1hc2s7CisJCQlpZiAocHV0X3VzZXIoZGF0YSwgdXArKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJZnArKzsKKwkJY291bnQtLTsKKwl9CisJKmZyYW1lVXNlZCArPSB1c2VkICogNDsKKwlyZXR1cm4gc3RlcmVvPyB1c2VkICogNDogdXNlZCAqIDI7Cit9CisKKy8qIGRhdGEgaW4gcm91dGluZXMgKHJlZHVjaW5nIHNwZWVkKS4uLiAqLworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0eF9zOF9yZWFkKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNob3J0ICpwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlpbnQgYmFsID0gZXhwYW5kX3JlYWRfYmFsOworCWludCB2YWxsLHZhbHIsIHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCWludCBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCWludCB1dG90YWwsIGZ0b3RhbDsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwlpZiAoc3RlcmVvKQorCQl1c2VyQ291bnQgPj49IDE7CisJZnRvdGFsID0gZnJhbWVMZWZ0OworCXV0b3RhbCA9IHVzZXJDb3VudDsKKwl3aGlsZSAoZnJhbWVMZWZ0KSB7CisJCXVfY2hhciBkYXRhOworCisJCWlmIChiYWw8MCAmJiB1c2VyQ291bnQgPT0gMCkKKwkJCWJyZWFrOworCQl2YWxsID0gKnArKzsKKwkJdmFsbCA9ICh2YWxsICogc29mdHdhcmVfaW5wdXRfdm9sdW1lKSA+PiA3OworCQlpZiAoc3RlcmVvKSB7CisJCQl2YWxyID0gKnA7CisJCQl2YWxyID0gKHZhbHIgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCX0KKwkJcCsrOworCQlpZiAoYmFsIDwgMCkgeworCQkJZGF0YSA9IHZhbGwgPj4gODsKKwkJCWlmIChwdXRfdXNlcihkYXRhLCAodV9jaGFyIF9fdXNlciAqKXVzZXJQdHIrKykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoc3RlcmVvKSB7CisJCQkJZGF0YSA9IHZhbHIgPj4gODsKKwkJCQlpZiAocHV0X3VzZXIoZGF0YSwgKHVfY2hhciBfX3VzZXIgKil1c2VyUHRyKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCXVzZXJDb3VudC0tOworCQkJYmFsICs9IGhTcGVlZDsKKwkJfQorCQlmcmFtZUxlZnQtLTsKKwkJYmFsIC09IHNTcGVlZDsKKwl9CisJZXhwYW5kX3JlYWRfYmFsPWJhbDsKKwkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDI6IHV0b3RhbDsKK30KKworCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0eF91OF9yZWFkKGNvbnN0IHVfY2hhciBfX3VzZXIgKnVzZXJQdHIsIHNpemVfdCB1c2VyQ291bnQsCisJCQkgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCXNob3J0ICpwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlpbnQgYmFsID0gZXhwYW5kX3JlYWRfYmFsOworCWludCB2YWxsLHZhbHIsIHN0ZXJlbyA9IGRtYXNvdW5kLnNvZnQuc3RlcmVvOworCWludCBoU3BlZWQgPSBkbWFzb3VuZC5oYXJkLnNwZWVkLCBzU3BlZWQgPSBkbWFzb3VuZC5zb2Z0LnNwZWVkOworCWludCB1dG90YWwsIGZ0b3RhbDsKKworCWZyYW1lTGVmdCA+Pj0gMjsKKwlpZiAoc3RlcmVvKQorCQl1c2VyQ291bnQgPj49IDE7CisJZnRvdGFsID0gZnJhbWVMZWZ0OworCXV0b3RhbCA9IHVzZXJDb3VudDsKKwl3aGlsZSAoZnJhbWVMZWZ0KSB7CisJCXVfY2hhciBkYXRhOworCisJCWlmIChiYWw8MCAmJiB1c2VyQ291bnQgPT0gMCkKKwkJCWJyZWFrOworCisJCXZhbGwgPSAqcCsrOworCQl2YWxsID0gKHZhbGwgKiBzb2Z0d2FyZV9pbnB1dF92b2x1bWUpID4+IDc7CisJCWlmIChzdGVyZW8pIHsKKwkJCXZhbHIgPSAqcDsKKwkJCXZhbHIgPSAodmFsciAqIHNvZnR3YXJlX2lucHV0X3ZvbHVtZSkgPj4gNzsKKwkJfQorCQlwKys7CisJCWlmIChiYWwgPCAwKSB7CisJCQlkYXRhID0gKHZhbGwgPj4gOCkgXiAweDgwOworCQkJaWYgKHB1dF91c2VyKGRhdGEsICh1X2NoYXIgX191c2VyICopdXNlclB0cisrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChzdGVyZW8pIHsKKwkJCQlkYXRhID0gKHZhbHIgPj4gOCkgXiAweDgwOworCQkJCWlmIChwdXRfdXNlcihkYXRhLCAodV9jaGFyIF9fdXNlciAqKXVzZXJQdHIrKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJdXNlckNvdW50LS07CisJCQliYWwgKz0gaFNwZWVkOworCQl9CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKwlleHBhbmRfcmVhZF9iYWw9YmFsOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCkgKiA0OworCXV0b3RhbCAtPSB1c2VyQ291bnQ7CisJcmV0dXJuIHN0ZXJlbz8gdXRvdGFsICogMjogdXRvdGFsOworfQorCitzdGF0aWMgc3NpemVfdCBwbWFjX2N0eF9zMTZfcmVhZChjb25zdCB1X2NoYXIgX191c2VyICp1c2VyUHRyLCBzaXplX3QgdXNlckNvdW50LAorCQkJICAgdV9jaGFyIGZyYW1lW10sIHNzaXplX3QgKmZyYW1lVXNlZCwKKwkJCSAgIHNzaXplX3QgZnJhbWVMZWZ0KQoreworCWludCBiYWwgPSBleHBhbmRfcmVhZF9iYWw7CisJc2hvcnQgKmZwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlzaG9ydCBfX3VzZXIgKnVwID0gKHNob3J0IF9fdXNlciAqKSB1c2VyUHRyOworCWludCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisKKwlmcmFtZUxlZnQgPj49IDI7CisJdXNlckNvdW50ID4+PSAoc3RlcmVvPyAyOiAxKTsKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJaW50IGRhdGFsLGRhdGFyOworCisJCWlmIChiYWw8MCAmJiB1c2VyQ291bnQgPT0gMCkKKwkJCWJyZWFrOworCisJCWRhdGFsID0gKmZwKys7CisJCWRhdGFsID0gKGRhdGFsICogc29mdHdhcmVfaW5wdXRfdm9sdW1lKSA+PiA3OworCQlpZiAoc3RlcmVvKSB7CisJCQlkYXRhciA9ICpmcDsKKwkJCWRhdGFyID0gKGRhdGFyICogc29mdHdhcmVfaW5wdXRfdm9sdW1lKSA+PiA3OworCQl9CisJCWZwKys7CisJCWlmIChiYWwgPCAwKSB7CisJCQlpZiAocHV0X3VzZXIoZGF0YWwsIHVwKyspKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHN0ZXJlbykgeworCQkJCWlmIChwdXRfdXNlcihkYXRhciwgdXArKykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJdXNlckNvdW50LS07CisJCQliYWwgKz0gaFNwZWVkOworCQl9CisJCWZyYW1lTGVmdC0tOworCQliYWwgLT0gc1NwZWVkOworCX0KKwlleHBhbmRfcmVhZF9iYWw9YmFsOworCSpmcmFtZVVzZWQgKz0gKGZ0b3RhbCAtIGZyYW1lTGVmdCkgKiA0OworCXV0b3RhbCAtPSB1c2VyQ291bnQ7CisJcmV0dXJuIHN0ZXJlbz8gdXRvdGFsICogNDogdXRvdGFsICogMjsKK30KKworc3RhdGljIHNzaXplX3QgcG1hY19jdHhfdTE2X3JlYWQoY29uc3QgdV9jaGFyIF9fdXNlciAqdXNlclB0ciwgc2l6ZV90IHVzZXJDb3VudCwKKwkJCSAgIHVfY2hhciBmcmFtZVtdLCBzc2l6ZV90ICpmcmFtZVVzZWQsCisJCQkgICBzc2l6ZV90IGZyYW1lTGVmdCkKK3sKKwlpbnQgYmFsID0gZXhwYW5kX3JlYWRfYmFsOworCWludCBtYXNrID0gKGRtYXNvdW5kLnNvZnQuZm9ybWF0ID09IEFGTVRfVTE2X0xFPyAweDAwODA6IDB4ODAwMCk7CisJc2hvcnQgKmZwID0gKHNob3J0ICopICZmcmFtZVsqZnJhbWVVc2VkXTsKKwlzaG9ydCBfX3VzZXIgKnVwID0gKHNob3J0IF9fdXNlciAqKSB1c2VyUHRyOworCWludCBzdGVyZW8gPSBkbWFzb3VuZC5zb2Z0LnN0ZXJlbzsKKwlpbnQgaFNwZWVkID0gZG1hc291bmQuaGFyZC5zcGVlZCwgc1NwZWVkID0gZG1hc291bmQuc29mdC5zcGVlZDsKKwlpbnQgdXRvdGFsLCBmdG90YWw7CisKKwlmcmFtZUxlZnQgPj49IDI7CisJdXNlckNvdW50ID4+PSAoc3RlcmVvPyAyOiAxKTsKKwlmdG90YWwgPSBmcmFtZUxlZnQ7CisJdXRvdGFsID0gdXNlckNvdW50OworCXdoaWxlIChmcmFtZUxlZnQpIHsKKwkJaW50IGRhdGFsLGRhdGFyOworCisJCWlmIChiYWw8MCAmJiB1c2VyQ291bnQgPT0gMCkKKwkJCWJyZWFrOworCisJCWRhdGFsID0gKmZwKys7CisJCWRhdGFsID0gKGRhdGFsICogc29mdHdhcmVfaW5wdXRfdm9sdW1lKSA+PiA3OworCQlkYXRhbCBePSBtYXNrOworCQlpZiAoc3RlcmVvKSB7CisJCQlkYXRhciA9ICpmcDsKKwkJCWRhdGFyID0gKGRhdGFyICogc29mdHdhcmVfaW5wdXRfdm9sdW1lKSA+PiA3OworCQkJZGF0YXIgXj0gbWFzazsKKwkJfQorCQlmcCsrOworCQlpZiAoYmFsIDwgMCkgeworCQkJaWYgKHB1dF91c2VyKGRhdGFsLCB1cCsrKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChzdGVyZW8pIHsKKwkJCQlpZiAocHV0X3VzZXIoZGF0YXIsIHVwKyspKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJCXVzZXJDb3VudC0tOworCQkJYmFsICs9IGhTcGVlZDsKKwkJfQorCQlmcmFtZUxlZnQtLTsKKwkJYmFsIC09IHNTcGVlZDsKKwl9CisJZXhwYW5kX3JlYWRfYmFsPWJhbDsKKwkqZnJhbWVVc2VkICs9IChmdG90YWwgLSBmcmFtZUxlZnQpICogNDsKKwl1dG90YWwgLT0gdXNlckNvdW50OworCXJldHVybiBzdGVyZW8/IHV0b3RhbCAqIDQ6IHV0b3RhbCAqIDI7Cit9CisKKworVFJBTlMgdHJhbnNBd2Fjc05vcm1hbCA9IHsKKwkuY3RfdWxhdz0JcG1hY19jdF9sYXcsCisJLmN0X2FsYXc9CXBtYWNfY3RfbGF3LAorCS5jdF9zOD0JCXBtYWNfY3RfczgsCisJLmN0X3U4PQkJcG1hY19jdF91OCwKKwkuY3RfczE2YmU9CXBtYWNfY3RfczE2LAorCS5jdF91MTZiZT0JcG1hY19jdF91MTYsCisJLmN0X3MxNmxlPQlwbWFjX2N0X3MxNiwKKwkuY3RfdTE2bGU9CXBtYWNfY3RfdTE2LAorfTsKKworVFJBTlMgdHJhbnNBd2Fjc0V4cGFuZCA9IHsKKwkuY3RfdWxhdz0JcG1hY19jdHhfbGF3LAorCS5jdF9hbGF3PQlwbWFjX2N0eF9sYXcsCisJLmN0X3M4PQkJcG1hY19jdHhfczgsCisJLmN0X3U4PQkJcG1hY19jdHhfdTgsCisJLmN0X3MxNmJlPQlwbWFjX2N0eF9zMTYsCisJLmN0X3UxNmJlPQlwbWFjX2N0eF91MTYsCisJLmN0X3MxNmxlPQlwbWFjX2N0eF9zMTYsCisJLmN0X3UxNmxlPQlwbWFjX2N0eF91MTYsCit9OworCitUUkFOUyB0cmFuc0F3YWNzTm9ybWFsUmVhZCA9IHsKKwkuY3Rfczg9CQlwbWFjX2N0X3M4X3JlYWQsCisJLmN0X3U4PQkJcG1hY19jdF91OF9yZWFkLAorCS5jdF9zMTZiZT0JcG1hY19jdF9zMTZfcmVhZCwKKwkuY3RfdTE2YmU9CXBtYWNfY3RfdTE2X3JlYWQsCisJLmN0X3MxNmxlPQlwbWFjX2N0X3MxNl9yZWFkLAorCS5jdF91MTZsZT0JcG1hY19jdF91MTZfcmVhZCwKK307CisKK1RSQU5TIHRyYW5zQXdhY3NFeHBhbmRSZWFkID0geworCS5jdF9zOD0JCXBtYWNfY3R4X3M4X3JlYWQsCisJLmN0X3U4PQkJcG1hY19jdHhfdThfcmVhZCwKKwkuY3RfczE2YmU9CXBtYWNfY3R4X3MxNl9yZWFkLAorCS5jdF91MTZiZT0JcG1hY19jdHhfdTE2X3JlYWQsCisJLmN0X3MxNmxlPQlwbWFjX2N0eF9zMTZfcmVhZCwKKwkuY3RfdTE2bGU9CXBtYWNfY3R4X3UxNl9yZWFkLAorfTsKKworLyogdHJhbnNsYXRpb24gdGFibGVzICovCisvKiAxNiBiaXQgbXUtbGF3ICovCisKK3N0YXRpYyBzaG9ydCBkbWFzb3VuZF91bGF3MmRtYTE2W10gPSB7CisJLTMyMTI0LAktMzExMDAsCS0zMDA3NiwJLTI5MDUyLAktMjgwMjgsCS0yNzAwNCwJLTI1OTgwLAktMjQ5NTYsCisJLTIzOTMyLAktMjI5MDgsCS0yMTg4NCwJLTIwODYwLAktMTk4MzYsCS0xODgxMiwJLTE3Nzg4LAktMTY3NjQsCisJLTE1OTk2LAktMTU0ODQsCS0xNDk3MiwJLTE0NDYwLAktMTM5NDgsCS0xMzQzNiwJLTEyOTI0LAktMTI0MTIsCisJLTExOTAwLAktMTEzODgsCS0xMDg3NiwJLTEwMzY0LAktOTg1MiwJLTkzNDAsCS04ODI4LAktODMxNiwKKwktNzkzMiwJLTc2NzYsCS03NDIwLAktNzE2NCwJLTY5MDgsCS02NjUyLAktNjM5NiwJLTYxNDAsCisJLTU4ODQsCS01NjI4LAktNTM3MiwJLTUxMTYsCS00ODYwLAktNDYwNCwJLTQzNDgsCS00MDkyLAorCS0zOTAwLAktMzc3MiwJLTM2NDQsCS0zNTE2LAktMzM4OCwJLTMyNjAsCS0zMTMyLAktMzAwNCwKKwktMjg3NiwJLTI3NDgsCS0yNjIwLAktMjQ5MiwJLTIzNjQsCS0yMjM2LAktMjEwOCwJLTE5ODAsCisJLTE4ODQsCS0xODIwLAktMTc1NiwJLTE2OTIsCS0xNjI4LAktMTU2NCwJLTE1MDAsCS0xNDM2LAorCS0xMzcyLAktMTMwOCwJLTEyNDQsCS0xMTgwLAktMTExNiwJLTEwNTIsCS05ODgsCS05MjQsCisJLTg3NiwJLTg0NCwJLTgxMiwJLTc4MCwJLTc0OCwJLTcxNiwJLTY4NCwJLTY1MiwKKwktNjIwLAktNTg4LAktNTU2LAktNTI0LAktNDkyLAktNDYwLAktNDI4LAktMzk2LAorCS0zNzIsCS0zNTYsCS0zNDAsCS0zMjQsCS0zMDgsCS0yOTIsCS0yNzYsCS0yNjAsCisJLTI0NCwJLTIyOCwJLTIxMiwJLTE5NiwJLTE4MCwJLTE2NCwJLTE0OCwJLTEzMiwKKwktMTIwLAktMTEyLAktMTA0LAktOTYsCS04OCwJLTgwLAktNzIsCS02NCwKKwktNTYsCS00OCwJLTQwLAktMzIsCS0yNCwJLTE2LAktOCwJMCwKKwkzMjEyNCwJMzExMDAsCTMwMDc2LAkyOTA1MiwJMjgwMjgsCTI3MDA0LAkyNTk4MCwJMjQ5NTYsCisJMjM5MzIsCTIyOTA4LAkyMTg4NCwJMjA4NjAsCTE5ODM2LAkxODgxMiwJMTc3ODgsCTE2NzY0LAorCTE1OTk2LAkxNTQ4NCwJMTQ5NzIsCTE0NDYwLAkxMzk0OCwJMTM0MzYsCTEyOTI0LAkxMjQxMiwKKwkxMTkwMCwJMTEzODgsCTEwODc2LAkxMDM2NCwJOTg1MiwJOTM0MCwJODgyOCwJODMxNiwKKwk3OTMyLAk3Njc2LAk3NDIwLAk3MTY0LAk2OTA4LAk2NjUyLAk2Mzk2LAk2MTQwLAorCTU4ODQsCTU2MjgsCTUzNzIsCTUxMTYsCTQ4NjAsCTQ2MDQsCTQzNDgsCTQwOTIsCisJMzkwMCwJMzc3MiwJMzY0NCwJMzUxNiwJMzM4OCwJMzI2MCwJMzEzMiwJMzAwNCwKKwkyODc2LAkyNzQ4LAkyNjIwLAkyNDkyLAkyMzY0LAkyMjM2LAkyMTA4LAkxOTgwLAorCTE4ODQsCTE4MjAsCTE3NTYsCTE2OTIsCTE2MjgsCTE1NjQsCTE1MDAsCTE0MzYsCisJMTM3MiwJMTMwOCwJMTI0NCwJMTE4MCwJMTExNiwJMTA1MiwJOTg4LAk5MjQsCisJODc2LAk4NDQsCTgxMiwJNzgwLAk3NDgsCTcxNiwJNjg0LAk2NTIsCisJNjIwLAk1ODgsCTU1NiwJNTI0LAk0OTIsCTQ2MCwJNDI4LAkzOTYsCisJMzcyLAkzNTYsCTM0MCwJMzI0LAkzMDgsCTI5MiwJMjc2LAkyNjAsCisJMjQ0LAkyMjgsCTIxMiwJMTk2LAkxODAsCTE2NCwJMTQ4LAkxMzIsCisJMTIwLAkxMTIsCTEwNCwJOTYsCTg4LAk4MCwJNzIsCTY0LAorCTU2LAk0OCwJNDAsCTMyLAkyNCwJMTYsCTgsCTAsCit9OworCisvKiAxNiBiaXQgQS1sYXcgKi8KKworc3RhdGljIHNob3J0IGRtYXNvdW5kX2FsYXcyZG1hMTZbXSA9IHsKKwktNTUwNCwJLTUyNDgsCS02MDE2LAktNTc2MCwJLTQ0ODAsCS00MjI0LAktNDk5MiwJLTQ3MzYsCisJLTc1NTIsCS03Mjk2LAktODA2NCwJLTc4MDgsCS02NTI4LAktNjI3MiwJLTcwNDAsCS02Nzg0LAorCS0yNzUyLAktMjYyNCwJLTMwMDgsCS0yODgwLAktMjI0MCwJLTIxMTIsCS0yNDk2LAktMjM2OCwKKwktMzc3NiwJLTM2NDgsCS00MDMyLAktMzkwNCwJLTMyNjQsCS0zMTM2LAktMzUyMCwJLTMzOTIsCisJLTIyMDE2LAktMjA5OTIsCS0yNDA2NCwJLTIzMDQwLAktMTc5MjAsCS0xNjg5NiwJLTE5OTY4LAktMTg5NDQsCisJLTMwMjA4LAktMjkxODQsCS0zMjI1NiwJLTMxMjMyLAktMjYxMTIsCS0yNTA4OCwJLTI4MTYwLAktMjcxMzYsCisJLTExMDA4LAktMTA0OTYsCS0xMjAzMiwJLTExNTIwLAktODk2MCwJLTg0NDgsCS05OTg0LAktOTQ3MiwKKwktMTUxMDQsCS0xNDU5MiwJLTE2MTI4LAktMTU2MTYsCS0xMzA1NiwJLTEyNTQ0LAktMTQwODAsCS0xMzU2OCwKKwktMzQ0LAktMzI4LAktMzc2LAktMzYwLAktMjgwLAktMjY0LAktMzEyLAktMjk2LAorCS00NzIsCS00NTYsCS01MDQsCS00ODgsCS00MDgsCS0zOTIsCS00NDAsCS00MjQsCisJLTg4LAktNzIsCS0xMjAsCS0xMDQsCS0yNCwJLTgsCS01NiwJLTQwLAorCS0yMTYsCS0yMDAsCS0yNDgsCS0yMzIsCS0xNTIsCS0xMzYsCS0xODQsCS0xNjgsCisJLTEzNzYsCS0xMzEyLAktMTUwNCwJLTE0NDAsCS0xMTIwLAktMTA1NiwJLTEyNDgsCS0xMTg0LAorCS0xODg4LAktMTgyNCwJLTIwMTYsCS0xOTUyLAktMTYzMiwJLTE1NjgsCS0xNzYwLAktMTY5NiwKKwktNjg4LAktNjU2LAktNzUyLAktNzIwLAktNTYwLAktNTI4LAktNjI0LAktNTkyLAorCS05NDQsCS05MTIsCS0xMDA4LAktOTc2LAktODE2LAktNzg0LAktODgwLAktODQ4LAorCTU1MDQsCTUyNDgsCTYwMTYsCTU3NjAsCTQ0ODAsCTQyMjQsCTQ5OTIsCTQ3MzYsCisJNzU1MiwJNzI5NiwJODA2NCwJNzgwOCwJNjUyOCwJNjI3MiwJNzA0MCwJNjc4NCwKKwkyNzUyLAkyNjI0LAkzMDA4LAkyODgwLAkyMjQwLAkyMTEyLAkyNDk2LAkyMzY4LAorCTM3NzYsCTM2NDgsCTQwMzIsCTM5MDQsCTMyNjQsCTMxMzYsCTM1MjAsCTMzOTIsCisJMjIwMTYsCTIwOTkyLAkyNDA2NCwJMjMwNDAsCTE3OTIwLAkxNjg5NiwJMTk5NjgsCTE4OTQ0LAorCTMwMjA4LAkyOTE4NCwJMzIyNTYsCTMxMjMyLAkyNjExMiwJMjUwODgsCTI4MTYwLAkyNzEzNiwKKwkxMTAwOCwJMTA0OTYsCTEyMDMyLAkxMTUyMCwJODk2MCwJODQ0OCwJOTk4NCwJOTQ3MiwKKwkxNTEwNCwJMTQ1OTIsCTE2MTI4LAkxNTYxNiwJMTMwNTYsCTEyNTQ0LAkxNDA4MCwJMTM1NjgsCisJMzQ0LAkzMjgsCTM3NiwJMzYwLAkyODAsCTI2NCwJMzEyLAkyOTYsCisJNDcyLAk0NTYsCTUwNCwJNDg4LAk0MDgsCTM5MiwJNDQwLAk0MjQsCisJODgsCTcyLAkxMjAsCTEwNCwJMjQsCTgsCTU2LAk0MCwKKwkyMTYsCTIwMCwJMjQ4LAkyMzIsCTE1MiwJMTM2LAkxODQsCTE2OCwKKwkxMzc2LAkxMzEyLAkxNTA0LAkxNDQwLAkxMTIwLAkxMDU2LAkxMjQ4LAkxMTg0LAorCTE4ODgsCTE4MjQsCTIwMTYsCTE5NTIsCTE2MzIsCTE1NjgsCTE3NjAsCTE2OTYsCisJNjg4LAk2NTYsCTc1MiwJNzIwLAk1NjAsCTUyOCwJNjI0LAk1OTIsCisJOTQ0LAk5MTIsCTEwMDgsCTk3NiwJODE2LAk3ODQsCTg4MCwJODQ4LAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxLzgwMTAuaCBiL3NvdW5kL29zcy9lbXUxMGsxLzgwMTAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWM2YzQyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvODAxMC5oCkBAIC0wLDAgKzEsNzM3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICA4MDEwLmgKKyAqICAgICBDb3B5cmlnaHQgMTk5OS0yMDAxIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlCQkgICAgQXV0aG9yCSAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tCQkgICAgLS0tLS0tCSAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveAkgICAgQ2xlYW5lZCBvZiA4Yml0IGNoYXJzLCBET1MKKyAqCQkJCQkgICAgbGluZSBlbmRpbmdzCisgKiAgICAgRGVjZW1iZXIgOCwgMTk5OSAgICAgSm9uIFRheWxvcgkgICAgQWRkZWQgbG90cyBvZiBuZXcgcmVnaXN0ZXIgaW5mbworICogICAgIE1heSAxNiwgMjAwMSAgICAgICAgIERhbmllbCBCZXJ0cmFuZCBBZGRlZCB1bm9mZmljaWFsIERCRyByZWdpc3RlciBpbmZvCisgKiAgICAgT2N0LU5vdiAyMDAxICAgICAgICAgRC5CLiAgICAgICAgICAgIEFkZGVkIHVub2ZmaWNpYWwgQXVkaWd5IHJlZ2lzdGVycyAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisKKyNpZm5kZWYgXzgwMTBfSAorI2RlZmluZSBfODAxMF9ICisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvLyBEcml2ZXIgdmVyc2lvbjoKKyNkZWZpbmUgTUFKT1JfVkVSIDAKKyNkZWZpbmUgTUlOT1JfVkVSIDIwCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjIwYSIKKworCisvLyBBdWRpZ3kgc3BlY2lmeSByZWdpc3RlcnMgYXJlIHByZWZpeGVkIHdpdGggJ0FfJworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogUENJIGZ1bmN0aW9uIDAgcmVnaXN0ZXJzLCBhZGRyZXNzID0gPHZhbD4gKyBQQ0lCQVNFMAkJCQkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBUUgkJCTB4MDAJCS8qIEluZGV4ZWQgcmVnaXN0ZXIgc2V0IHBvaW50ZXIgcmVnaXN0ZXIJKi8KKwkJCQkJCS8qIE5PVEU6IFRoZSBDSEFOTkVMTlVNIGFuZCBBRERSRVNTIHdvcmRzIGNhbgkqLworCQkJCQkJLyogYmUgbW9kaWZpZWQgaW5kZXBlbmRlbnRseSBvZiBlYWNoIG90aGVyLgkqLworI2RlZmluZSBQVFJfQ0hBTk5FTE5VTV9NQVNLCTB4MDAwMDAwM2YJLyogRm9yIGVhY2ggcGVyLWNoYW5uZWwgcmVnaXN0ZXIsIGluZGljYXRlcyB0aGUJKi8KKwkJCQkJCS8qIGNoYW5uZWwgbnVtYmVyIG9mIHRoZSByZWdpc3RlciB0byBiZQkJKi8KKwkJCQkJCS8qIGFjY2Vzc2VkLiAgRm9yIG5vbiBwZXItY2hhbm5lbCByZWdpc3RlcnMgdGhlCSovCisJCQkJCQkvKiB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHplcm8uCQkJKi8KKyNkZWZpbmUgUFRSX0FERFJFU1NfTUFTSwkweDA3ZmYwMDAwCS8qIFJlZ2lzdGVyIGluZGV4CQkJCSovCisKKyNkZWZpbmUgREFUQQkJCTB4MDQJCS8qIEluZGV4ZWQgcmVnaXN0ZXIgc2V0IGRhdGEgcmVnaXN0ZXIJCSovCisKKyNkZWZpbmUgSVBSCQkJMHgwOAkJLyogR2xvYmFsIGludGVycnVwdCBwZW5kaW5nIHJlZ2lzdGVyCQkqLworCQkJCQkJLyogQ2xlYXIgcGVuZGluZyBpbnRlcnJ1cHRzIGJ5IHdyaXRpbmcgYSAxIHRvCSovCisJCQkJCQkvKiB0aGUgcmVsZXZhbnQgYml0cyBhbmQgemVybyB0byB0aGUgb3RoZXIgYml0cwkqLworCisvKiBUaGUgbmV4dCB0d28gaW50ZXJydXB0cyBhcmUgZm9yIHRoZSBtaWRpIHBvcnQgb24gdGhlIEF1ZGlneSBEcml2ZSAoQV9NUFUxKQkJCSovCisjZGVmaW5lIEFfSVBSX01JRElUUkFOU0JVRkVNUFRZMgkweDEwMDAwMDAwCS8qIE1JREkgVUFSVCB0cmFuc21pdCBidWZmZXIgZW1wdHkJCSovCisjZGVmaW5lIEFfSVBSX01JRElSRUNWQlVGRU1QVFkyCTB4MDgwMDAwMDAJLyogTUlESSBVQVJUIHJlY2VpdmUgYnVmZmVyIGVtcHR5CQkqLworCisjZGVmaW5lIElQUl9TQU1QTEVSQVRFVFJBQ0tFUgkweDAxMDAwMDAwCS8qIFNhbXBsZSByYXRlIHRyYWNrZXIgbG9jayBzdGF0dXMgY2hhbmdlCSovCisjZGVmaW5lIElQUl9GWERTUAkJMHgwMDgwMDAwMAkvKiBFbmFibGUgRlggRFNQIGludGVycnVwdHMJCQkqLworI2RlZmluZSBJUFJfRk9SQ0VJTlQJCTB4MDA0MDAwMDAJLyogRm9yY2UgU291bmQgQmxhc3RlciBpbnRlcnJ1cHQJCSovCisjZGVmaW5lIElQUl9QQ0lFUlJPUgkJMHgwMDIwMDAwMAkvKiBQQ0kgYnVzIGVycm9yCQkJCSovCisjZGVmaW5lIElQUl9WT0xJTkNSCQkweDAwMTAwMDAwCS8qIFZvbHVtZSBpbmNyZW1lbnQgYnV0dG9uIHByZXNzZWQJCSovCisjZGVmaW5lIElQUl9WT0xERUNSCQkweDAwMDgwMDAwCS8qIFZvbHVtZSBkZWNyZW1lbnQgYnV0dG9uIHByZXNzZWQJCSovCisjZGVmaW5lIElQUl9NVVRFCQkweDAwMDQwMDAwCS8qIE11dGUgYnV0dG9uIHByZXNzZWQJCQkJKi8KKyNkZWZpbmUgSVBSX01JQ0JVRkZVTEwJCTB4MDAwMjAwMDAJLyogTWljcm9waG9uZSBidWZmZXIgZnVsbAkJCSovCisjZGVmaW5lIElQUl9NSUNCVUZIQUxGRlVMTAkweDAwMDEwMDAwCS8qIE1pY3JvcGhvbmUgYnVmZmVyIGhhbGYgZnVsbAkJCSovCisjZGVmaW5lIElQUl9BRENCVUZGVUxMCQkweDAwMDA4MDAwCS8qIEFEQyBidWZmZXIgZnVsbAkJCQkqLworI2RlZmluZSBJUFJfQURDQlVGSEFMRkZVTEwJMHgwMDAwNDAwMAkvKiBBREMgYnVmZmVyIGhhbGYgZnVsbAkJCQkqLworI2RlZmluZSBJUFJfRUZYQlVGRlVMTAkJMHgwMDAwMjAwMAkvKiBFZmZlY3RzIGJ1ZmZlciBmdWxsCQkJCSovCisjZGVmaW5lIElQUl9FRlhCVUZIQUxGRlVMTAkweDAwMDAxMDAwCS8qIEVmZmVjdHMgYnVmZmVyIGhhbGYgZnVsbAkJCSovCisjZGVmaW5lIElQUl9HUFNQRElGU1RBVFVTQ0hBTkdFCTB4MDAwMDA4MDAJLyogR1BTUERJRiBjaGFubmVsIHN0YXR1cyBjaGFuZ2UJCSovCisjZGVmaW5lIElQUl9DRFJPTVNUQVRVU0NIQU5HRQkweDAwMDAwNDAwCS8qIENELVJPTSBjaGFubmVsIHN0YXR1cyBjaGFuZ2UJCQkqLworI2RlZmluZSBJUFJfSU5URVJWQUxUSU1FUgkweDAwMDAwMjAwCS8qIEludGVydmFsIHRpbWVyIHRlcm1pbmFsIGNvdW50CQkqLworI2RlZmluZSBJUFJfTUlESVRSQU5TQlVGRU1QVFkJMHgwMDAwMDEwMAkvKiBNSURJIFVBUlQgdHJhbnNtaXQgYnVmZmVyIGVtcHR5CQkqLworI2RlZmluZSBJUFJfTUlESVJFQ1ZCVUZFTVBUWQkweDAwMDAwMDgwCS8qIE1JREkgVUFSVCByZWNlaXZlIGJ1ZmZlciBlbXB0eQkJKi8KKyNkZWZpbmUgSVBSX0NIQU5ORUxMT09QCQkweDAwMDAwMDQwCS8qIE9uZSBvciBtb3JlIGNoYW5uZWwgbG9vcCBpbnRlcnJ1cHRzIHBlbmRpbmcJKi8KKyNkZWZpbmUgSVBSX0NIQU5ORUxOVU1CRVJNQVNLCTB4MDAwMDAwM2YJLyogV2hlbiBJUFJfQ0hBTk5FTExPT1AgaXMgc2V0LCBpbmRpY2F0ZXMgdGhlCSovCisJCQkJCQkvKiBIaWdoZXN0IHNldCBjaGFubmVsIGluIENMSVBMIG9yIENMSVBILiAgV2hlbgkqLworCQkJCQkJLyogSVAgaXMgd3JpdHRlbiB3aXRoIENMIHNldCwgdGhlIGJpdCBpbiBDTElQTAkqLworCQkJCQkJLyogb3IgQ0xJUEggY29ycmVzcG9uZGluZyB0byB0aGUgQ0lOIHZhbHVlIAkqLworCQkJCQkJLyogd3JpdHRlbiB3aWxsIGJlIGNsZWFyZWQuCQkJKi8KKyNkZWZpbmUgQV9JUFJfTUlESVRSQU5TQlVGRU1QVFkxCUlQUl9NSURJVFJBTlNCVUZFTVBUWQkvKiBNSURJIFVBUlQgdHJhbnNtaXQgYnVmZmVyIGVtcHR5CQkqLworI2RlZmluZSBBX0lQUl9NSURJUkVDVkJVRkVNUFRZMQlJUFJfTUlESVJFQ1ZCVUZFTVBUWQkvKiBNSURJIFVBUlQgcmVjZWl2ZSBidWZmZXIgZW1wdHkJCSovCisKKworCisjZGVmaW5lIElOVEUJCQkweDBjCQkvKiBJbnRlcnJ1cHQgZW5hYmxlIHJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgSU5URV9WSVJUVUFMU0JfTUFTSwkweGMwMDAwMDAwCS8qIFZpcnR1YWwgU291bmRibGFzdGVyIEkvTyBwb3J0IGNhcHR1cmUJKi8KKyNkZWZpbmUgSU5URV9WSVJUVUFMU0JfMjIwCTB4MDAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MjIwLTB4MjJmCSovCisjZGVmaW5lIElOVEVfVklSVFVBTFNCXzI0MAkweDQwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDI0MAkJKi8KKyNkZWZpbmUgSU5URV9WSVJUVUFMU0JfMjYwCTB4ODAwMDAwMDAJLyogQ2FwdHVyZSBhdCBJL08gYmFzZSBhZGRyZXNzIDB4MjYwCQkqLworI2RlZmluZSBJTlRFX1ZJUlRVQUxTQl8yODAJMHhjMDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgyODAJCSovCisjZGVmaW5lIElOVEVfVklSVFVBTE1QVV9NQVNLCTB4MzAwMDAwMDAJLyogVmlydHVhbCBNUFUgSS9PIHBvcnQgY2FwdHVyZQkJCSovCisjZGVmaW5lIElOVEVfVklSVFVBTE1QVV8zMDAJMHgwMDAwMDAwMAkvKiBDYXB0dXJlIGF0IEkvTyBiYXNlIGFkZHJlc3MgMHgzMDAtMHgzMDEJKi8KKyNkZWZpbmUgSU5URV9WSVJUVUFMTVBVXzMxMAkweDEwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDMxMAkJKi8KKyNkZWZpbmUgSU5URV9WSVJUVUFMTVBVXzMyMAkweDIwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDMyMAkJKi8KKyNkZWZpbmUgSU5URV9WSVJUVUFMTVBVXzMzMAkweDMwMDAwMDAwCS8qIENhcHR1cmUgYXQgSS9PIGJhc2UgYWRkcmVzcyAweDMzMAkJKi8KKyNkZWZpbmUgSU5URV9NQVNURVJETUFFTkFCTEUJMHgwODAwMDAwMAkvKiBNYXN0ZXIgRE1BIGVtdWxhdGlvbiBhdCAweDAwMC0weDAwZgkJKi8KKyNkZWZpbmUgSU5URV9TTEFWRURNQUVOQUJMRQkweDA0MDAwMDAwCS8qIFNsYXZlIERNQSBlbXVsYXRpb24gYXQgMHgwYzAtMHgwZGYJCSovCisjZGVmaW5lIElOVEVfTUFTVEVSUElDRU5BQkxFCTB4MDIwMDAwMDAJLyogTWFzdGVyIFBJQyBlbXVsYXRpb24gYXQgMHgwMjAtMHgwMjEJCSovCisjZGVmaW5lIElOVEVfU0xBVkVQSUNFTkFCTEUJMHgwMTAwMDAwMAkvKiBTbGF2ZSBQSUMgZW11bGF0aW9uIGF0IDB4MGEwLTB4MGExCQkqLworI2RlZmluZSBJTlRFX1ZTQkVOQUJMRQkJMHgwMDgwMDAwMAkvKiBFbmFibGUgdmlydHVhbCBTb3VuZGJsYXN0ZXIJCQkqLworI2RlZmluZSBJTlRFX0FETElCRU5BQkxFCTB4MDA0MDAwMDAJLyogRW5hYmxlIEFkTGliIGVtdWxhdGlvbiBhdCAweDM4OC0weDM4YgkqLworI2RlZmluZSBJTlRFX01QVUVOQUJMRQkJMHgwMDIwMDAwMAkvKiBFbmFibGUgdmlydHVhbCBNUFUJCQkJKi8KKyNkZWZpbmUgSU5URV9GT1JDRUlOVAkJMHgwMDEwMDAwMAkvKiBDb250aW51b3VzbHkgYXNzZXJ0IElOVEFOCQkJKi8KKworI2RlZmluZSBJTlRFX01SSEFOREVOQUJMRQkweDAwMDgwMDAwCS8qIEVuYWJsZSB0aGUgIk1yLiBIYW5kIiBsb2dpYwkJCSovCisJCQkJCQkvKiBOT1RFOiBUaGVyZSBpcyBubyByZWFzb24gdG8gdXNlIHRoaXMgdW5kZXIJKi8KKwkJCQkJCS8qIExpbnV4LCBhbmQgaXQgd2lsbCBjYXVzZSBvZGQgaGFyZHdhcmUgCSovCisJCQkJCQkvKiBiZWhhdmlvciBhbmQgcG9zc2libHkgcmFuZG9tIHNlZ2ZhdWx0cyBhbmQJKi8KKwkJCQkJCS8qIGxvY2t1cHMgaWYgZW5hYmxlZC4JCQkJKi8KKworLyogVGhlIG5leHQgdHdvIGludGVycnVwdHMgYXJlIGZvciB0aGUgbWlkaSBwb3J0IG9uIHRoZSBBdWRpZ3kgRHJpdmUgKEFfTVBVMSkJCQkqLworI2RlZmluZSBBX0lOVEVfTUlESVRYRU5BQkxFMgkweDAwMDIwMDAwCS8qIEVuYWJsZSBNSURJIHRyYW5zbWl0LWJ1ZmZlci1lbXB0eSBpbnRlcnJ1cHRzCSovCisjZGVmaW5lIEFfSU5URV9NSURJUlhFTkFCTEUyCTB4MDAwMTAwMDAJLyogRW5hYmxlIE1JREkgcmVjZWl2ZS1idWZmZXItZW1wdHkgaW50ZXJydXB0cwkqLworCisKKyNkZWZpbmUgSU5URV9TQU1QTEVSQVRFVFJBQ0tFUgkweDAwMDAyMDAwCS8qIEVuYWJsZSBzYW1wbGUgcmF0ZSB0cmFja2VyIGludGVycnVwdHMJKi8KKwkJCQkJCS8qIE5PVEU6IFRoaXMgYml0IG11c3QgYWx3YXlzIGJlIGVuYWJsZWQgICAgICAgCSovCisjZGVmaW5lIElOVEVfRlhEU1BFTkFCTEUJMHgwMDAwMTAwMAkvKiBFbmFibGUgRlggRFNQIGludGVycnVwdHMJCQkqLworI2RlZmluZSBJTlRFX1BDSUVSUk9SRU5BQkxFCTB4MDAwMDA4MDAJLyogRW5hYmxlIFBDSSBidXMgZXJyb3IgaW50ZXJydXB0cwkJKi8KKyNkZWZpbmUgSU5URV9WT0xJTkNSRU5BQkxFCTB4MDAwMDA0MDAJLyogRW5hYmxlIHZvbHVtZSBpbmNyZW1lbnQgYnV0dG9uIGludGVycnVwdHMJKi8KKyNkZWZpbmUgSU5URV9WT0xERUNSRU5BQkxFCTB4MDAwMDAyMDAJLyogRW5hYmxlIHZvbHVtZSBkZWNyZW1lbnQgYnV0dG9uIGludGVycnVwdHMJKi8KKyNkZWZpbmUgSU5URV9NVVRFRU5BQkxFCQkweDAwMDAwMTAwCS8qIEVuYWJsZSBtdXRlIGJ1dHRvbiBpbnRlcnJ1cHRzCQkqLworI2RlZmluZSBJTlRFX01JQ0JVRkVOQUJMRQkweDAwMDAwMDgwCS8qIEVuYWJsZSBtaWNyb3Bob25lIGJ1ZmZlciBpbnRlcnJ1cHRzCQkqLworI2RlZmluZSBJTlRFX0FEQ0JVRkVOQUJMRQkweDAwMDAwMDQwCS8qIEVuYWJsZSBBREMgYnVmZmVyIGludGVycnVwdHMJCQkqLworI2RlZmluZSBJTlRFX0VGWEJVRkVOQUJMRQkweDAwMDAwMDIwCS8qIEVuYWJsZSBFZmZlY3RzIGJ1ZmZlciBpbnRlcnJ1cHRzCQkqLworI2RlZmluZSBJTlRFX0dQU1BESUZFTkFCTEUJMHgwMDAwMDAxMAkvKiBFbmFibGUgR1BTUERJRiBzdGF0dXMgaW50ZXJydXB0cwkJKi8KKyNkZWZpbmUgSU5URV9DRFNQRElGRU5BQkxFCTB4MDAwMDAwMDgJLyogRW5hYmxlIENEU1BESUYgc3RhdHVzIGludGVycnVwdHMJCSovCisjZGVmaW5lIElOVEVfSU5URVJWQUxUSU1FUkVOQgkweDAwMDAwMDA0CS8qIEVuYWJsZSBpbnRlcnZhbCB0aW1lciBpbnRlcnJ1cHRzCQkqLworI2RlZmluZSBJTlRFX01JRElUWEVOQUJMRQkweDAwMDAwMDAyCS8qIEVuYWJsZSBNSURJIHRyYW5zbWl0LWJ1ZmZlci1lbXB0eSBpbnRlcnJ1cHRzCSovCisjZGVmaW5lIElOVEVfTUlESVJYRU5BQkxFCTB4MDAwMDAwMDEJLyogRW5hYmxlIE1JREkgcmVjZWl2ZS1idWZmZXItZW1wdHkgaW50ZXJydXB0cwkqLworCisvKiBUaGUgbmV4dCB0d28gaW50ZXJydXB0cyBhcmUgZm9yIHRoZSBtaWRpIHBvcnQgb24gdGhlIEF1ZGlneSAoQV9NUFUyKQkqLworI2RlZmluZSBBX0lOVEVfTUlESVRYRU5BQkxFMSAgCUlOVEVfTUlESVRYRU5BQkxFCisjZGVmaW5lIEFfSU5URV9NSURJUlhFTkFCTEUxCUlOVEVfTUlESVJYRU5BQkxFCisKKyNkZWZpbmUgV0MJCQkweDEwCQkvKiBXYWxsIENsb2NrIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFdDX1NBTVBMRUNPVU5URVJfTUFTSwkweDAzRkZGRkMwCS8qIFNhbXBsZSBwZXJpb2RzIGVsYXBzZWQgc2luY2UgcmVzZXQJCSovCisjZGVmaW5lIFdDX1NBTVBMRUNPVU5URVIJMHgxNDA2MDAxMAorI2RlZmluZSBXQ19DVVJSRU5UQ0hBTk5FTAkweDAwMDAwMDNGCS8qIENoYW5uZWwgWzAuLjYzXSBjdXJyZW50bHkgYmVpbmcgc2VydmljZWQJKi8KKwkJCQkJCS8qIE5PVEU6IEVhY2ggY2hhbm5lbCB0YWtlcyAxLzY0dGggb2YgYSBzYW1wbGUJKi8KKwkJCQkJCS8qIHBlcmlvZCB0byBiZSBzZXJ2aWNlZC4JCQkqLworCisjZGVmaW5lIEhDRkcJCQkweDE0CQkvKiBIYXJkd2FyZSBjb25maWcgcmVnaXN0ZXIJCQkqLworCQkJCQkJLyogTk9URTogVGhlcmUgaXMgbm8gcmVhc29uIHRvIHVzZSB0aGUgbGVnYWN5CSovCisJCQkJCQkvKiBTb3VuZEJsYXN0ZXIgZW11bGF0aW9uIHN0dWZmIGRlc2NyaWJlZCBiZWxvdwkqLworCQkJCQkJLyogdW5kZXIgTGludXgsIGFuZCBhbGwga2luZHMgb2Ygd2VpcmQgaGFyZHdhcmUJKi8KKwkJCQkJCS8qIGJlaGF2aW9yIGNhbiByZXN1bHQgaWYgeW91IHRyeS4gIERvbid0LgkqLworI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfTUFTSwkweGUwMDAwMDAwCS8qIExlZ2FjeSBmdW5jdGlvbiBudW1iZXIgCQkJKi8KKyNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX01QVQkweDAwMDAwMDAwCS8qIExlZ2FjeSBNUFUJIAkJCQkqLworI2RlZmluZSBIQ0ZHX0xFR0FDWUZVTkNfU0IJMHg0MDAwMDAwMAkvKiBMZWdhY3kgU0IJCQkJCSovCisjZGVmaW5lIEhDRkdfTEVHQUNZRlVOQ19BRAkweDYwMDAwMDAwCS8qIExlZ2FjeSBBRAkJCQkJKi8KKyNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX01QSUMJMHg4MDAwMDAwMAkvKiBMZWdhY3kgTVBJQwkJCQkJKi8KKyNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX01ETUEJMHhhMDAwMDAwMAkvKiBMZWdhY3kgTURNQQkJCQkJKi8KKyNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX1NQQ0kJMHhjMDAwMDAwMAkvKiBMZWdhY3kgU1BDSQkJCQkJKi8KKyNkZWZpbmUgSENGR19MRUdBQ1lGVU5DX1NETUEJMHhlMDAwMDAwMAkvKiBMZWdhY3kgU0RNQQkJCQkJKi8KKyNkZWZpbmUgSENGR19JT0NBUFRVUkVBRERSCTB4MWYwMDAwMDAJLyogVGhlIDQgTFNCcyBvZiB0aGUgY2FwdHVyZWQgSS9PIGFkZHJlc3MuCSovCisjZGVmaW5lIEhDRkdfTEVHQUNZV1JJVEUJMHgwMDgwMDAwMAkvKiAxID0gd3JpdGUsIDAgPSByZWFkIAkJCQkqLworI2RlZmluZSBIQ0ZHX0xFR0FDWVdPUkQJCTB4MDA0MDAwMDAJLyogMSA9IHdvcmQsIDAgPSBieXRlIAkJCQkqLworI2RlZmluZSBIQ0ZHX0xFR0FDWUlOVAkJMHgwMDIwMDAwMAkvKiAxID0gbGVnYWN5IGV2ZW50IGNhcHR1cmVkLiBXcml0ZSAxIHRvIGNsZWFyLgkqLworCQkJCQkJLyogTk9URTogVGhlIHJlc3Qgb2YgdGhlIGJpdHMgaW4gdGhpcyByZWdpc3RlcgkqLworCQkJCQkJLyogX2FyZV8gcmVsZXZhbnQgdW5kZXIgTGludXguCQkJKi8KKyNkZWZpbmUgSENGR19DT0RFQ0ZPUk1BVF9NQVNLCTB4MDAwNzAwMDAJLyogQ09ERUMgZm9ybWF0CQkJCQkqLworI2RlZmluZSBIQ0ZHX0NPREVDRk9STUFUX0FDOTcJMHgwMDAwMDAwMAkvKiBBQzk3IENPREVDIGZvcm1hdCAtLSBQcmltYXJ5IE91dHB1dAkJKi8KKyNkZWZpbmUgSENGR19DT0RFQ0ZPUk1BVF9JMlMJMHgwMDAxMDAwMAkvKiBJMlMgQ09ERUMgZm9ybWF0IC0tIFNlY29uZGFyeSAoUmVhcikgT3V0cHV0CSovCisjZGVmaW5lIEhDRkdfR1BJTlBVVDAJCTB4MDAwMDQwMDAJLyogRXh0ZXJuYWwgcGluMTEyCQkJCSovCisjZGVmaW5lIEhDRkdfR1BJTlBVVDEJCTB4MDAwMDIwMDAJLyogRXh0ZXJuYWwgcGluMTEwCQkJCSovCisKKyNkZWZpbmUgSENGR19HUE9VVFBVVF9NQVNLCTB4MDAwMDFjMDAJLyogRXh0ZXJuYWwgcGlucyB3aGljaCBtYXkgYmUgY29udHJvbGxlZAkqLworI2RlZmluZSBIQ0ZHX0dQT1VUMAkJMHgwMDAwMTAwMAkvKiBzZXQgdG8gZW5hYmxlIGRpZ2l0YWwgb3V0IG9uIDUuMSBjYXJkcwkqLworCisjZGVmaW5lIEhDRkdfSk9ZRU5BQkxFICAgICAgCTB4MDAwMDAyMDAJLyogSW50ZXJuYWwgam95c3RpY2sgZW5hYmxlICAgIAkJCSovCisjZGVmaW5lIEhDRkdfUEhBU0VUUkFDS0VOQUJMRQkweDAwMDAwMTAwCS8qIFBoYXNlIHRyYWNraW5nIGVuYWJsZQkJCSovCisJCQkJCQkvKiAxID0gRm9yY2UgYWxsIDMgYXN5bmMgZGlnaXRhbCBpbnB1dHMgdG8gdXNlCSovCisJCQkJCQkvKiB0aGUgc2FtZSBhc3luYyBzYW1wbGUgcmF0ZSB0cmFja2VyIChaVklERU8pCSovCisjZGVmaW5lIEhDRkdfQUMzRU5BQkxFX01BU0sJMHgweDAwMDBlMAkvKiBBQzMgYXN5bmMgaW5wdXQgY29udHJvbCAtIE5vdCBpbXBsZW1lbnRlZAkqLworI2RlZmluZSBIQ0ZHX0FDM0VOQUJMRV9aVklERU8JMHgwMDAwMDA4MAkvKiBDaGFubmVscyAwIGFuZCAxIHJlcGxhY2UgWlZJREVPCQkqLworI2RlZmluZSBIQ0ZHX0FDM0VOQUJMRV9DRFNQRElGCTB4MDAwMDAwNDAJLyogQ2hhbm5lbHMgMCBhbmQgMSByZXBsYWNlIENEU1BESUYJCSovCisjZGVmaW5lIEhDRkdfQUMzRU5BQkxFX0dQU1BESUYgIDB4MDAwMDAwMjAgICAgICAvKiBDaGFubmVscyAwIGFuZCAxIHJlcGxhY2UgR1BTUERJRiAgICAgICAgICAgICAqLworI2RlZmluZSBIQ0ZHX0FVVE9NVVRFCQkweDAwMDAwMDEwCS8qIFdoZW4gc2V0LCB0aGUgYXN5bmMgc2FtcGxlIHJhdGUgY29udmVydG9ycwkqLworCQkJCQkJLyogd2lsbCBhdXRvbWF0aWNhbGx5IG11dGUgdGhlaXIgb3V0cHV0IHdoZW4JKi8KKwkJCQkJCS8qIHRoZXkgYXJlIG5vdCByYXRlLWxvY2tlZCB0byB0aGUgZXh0ZXJuYWwJKi8KKwkJCQkJCS8qIGFzeW5jIGF1ZGlvIHNvdXJjZSAgCQkJCSovCisjZGVmaW5lIEhDRkdfTE9DS1NPVU5EQ0FDSEUJMHgwMDAwMDAwOAkvKiAxID0gQ2FuY2VsIGJ1c3RtYXN0ZXIgYWNjZXNzZXMgdG8gc291bmRjYWNoZSAqLworCQkJCQkJLyogTk9URTogVGhpcyBzaG91bGQgZ2VuZXJhbGx5IG5ldmVyIGJlIHVzZWQuICAJKi8KKyNkZWZpbmUgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sJMHgwMDAwMDAwNAkvKiAxID0gQ2FuY2VsIGJ1c3RtYXN0ZXIgYWNjZXNzZXMgdG8gdGFua2NhY2hlCSovCisJCQkJCQkvKiBOT1RFOiBUaGlzIHNob3VsZCBnZW5lcmFsbHkgbmV2ZXIgYmUgdXNlZC4gIAkqLworI2RlZmluZSBIQ0ZHX0xPQ0tUQU5LQ0FDSEUJMHgwMTAyMDAxNAorI2RlZmluZSBIQ0ZHX01VVEVCVVRUT05FTkFCTEUJMHgwMDAwMDAwMgkvKiAxID0gTWFzdGVyIG11dGUgYnV0dG9uIHNldHMgQVVESU9FTkFCTEUgPSAwLgkqLworCQkJCQkJLyogTk9URTogVGhpcyBpcyBhICdjaGVhcCcgd2F5IHRvIGltcGxlbWVudCBhCSovCisJCQkJCQkvKiBtYXN0ZXIgbXV0ZSBmdW5jdGlvbiBvbiB0aGUgbXV0ZSBidXR0b24sIGFuZAkqLworCQkJCQkJLyogaW4gZ2VuZXJhbCBzaG91bGQgbm90IGJlIHVzZWQgdW5sZXNzIGEgbW9yZQkqLworCQkJCQkJLyogc29waGlzdGljYXRlZCBtYXN0ZXIgbXV0ZSBmdW5jdGlvbiBoYXMgbm90CSovCisJCQkJCQkvKiBiZWVuIHdyaXR0ZW4uICAgICAgIAkJCQkqLworI2RlZmluZSBIQ0ZHX0FVRElPRU5BQkxFCTB4MDAwMDAwMDEJLyogMCA9IENPREVDcyB0cmFuc21pdCB6ZXJvLXZhbHVlZCBzYW1wbGVzCSovCisJCQkJCQkvKiBTaG91bGQgYmUgc2V0IHRvIDEgd2hlbiB0aGUgRU1VMTBLMSBpcwkqLworCQkJCQkJLyogY29tcGxldGVseSBpbml0aWFsaXplZC4JCQkqLworCisvL0ZvciBBdWRpZ3ksIE1QVSBwb3J0IG1vdmUgdG8gMHg3MC0weDc0IHB0ciByZWdpc3RlcgorCisjZGVmaW5lIE1VREFUQQkJCTB4MTgJCS8qIE1QVTQwMSBkYXRhIHJlZ2lzdGVyICg4IGJpdHMpICAgICAgIAkJKi8KKworI2RlZmluZSBNVUNNRAkJCTB4MTkJCS8qIE1QVTQwMSBjb21tYW5kIHJlZ2lzdGVyICg4IGJpdHMpICAgIAkJKi8KKyNkZWZpbmUgTVVDTURfUkVTRVQJCTB4ZmYJCS8qIFJFU0VUIGNvbW1hbmQJCQkJKi8KKyNkZWZpbmUgTVVDTURfRU5URVJVQVJUTU9ERQkweDNmCQkvKiBFbnRlcl9VQVJUX21vZGUgY29tbWFuZAkJCSovCisJCQkJCQkvKiBOT1RFOiBBbGwgb3RoZXIgY29tbWFuZHMgYXJlIGlnbm9yZWQJCSovCisKKyNkZWZpbmUgTVVTVEFUCQkJTVVDTUQJCS8qIE1QVTQwMSBzdGF0dXMgcmVnaXN0ZXIgKDggYml0cykgICAgIAkJKi8KKyNkZWZpbmUgTVVTVEFUX0lSRFlOCQkweDgwCQkvKiAwID0gTUlESSBkYXRhIG9yIGNvbW1hbmQgQUNLCQkJKi8KKyNkZWZpbmUgTVVTVEFUX09SRFlOCQkweDQwCQkvKiAwID0gTVVEQVRBIGNhbiBhY2NlcHQgYSBjb21tYW5kIG9yIGRhdGEJKi8KKworI2RlZmluZSBBX0lPQ0ZHCQkJMHgxOAkJLyogR1BJTyBvbiBBdWRpZ3kgY2FyZCAoMTZiaXRzKQkJCSovCisjZGVmaW5lIEFfR1BJTlBVVF9NQVNLCQkweGZmMDAKKyNkZWZpbmUgQV9HUE9VVFBVVF9NQVNLCQkweDAwZmYKKworI2RlZmluZSBUSU1FUgkJCTB4MWEJCS8qIFRpbWVyIHRlcm1pbmFsIGNvdW50IHJlZ2lzdGVyICgxNi1iaXQpCSovCisJCQkJCQkvKiBOT1RFOiBBZnRlciB0aGUgcmF0ZSBpcyBjaGFuZ2VkLCBhIG1heGltdW0JKi8KKwkJCQkJCS8qIG9mIDEwMjQgc2FtcGxlIHBlcmlvZHMgc2hvdWxkIGJlIGFsbG93ZWQJKi8KKwkJCQkJCS8qIGJlZm9yZSB0aGUgbmV3IHJhdGUgaXMgZ3VhcmFudGVlZCBhY2N1cmF0ZS4JKi8KKyNkZWZpbmUgVElNRVJfUkFURV9NQVNLCQkweDAzZmYJCS8qIFRpbWVyIGludGVycnVwdCByYXRlIGluIHNhbXBsZSBwZXJpb2RzCSovCisJCQkJCQkvKiAwID09IDEwMjQgcGVyaW9kcywgWzEuLjRdIGFyZSBub3QgdXNlZnVsCSovCisKKyNkZWZpbmUgQUM5N0RBVEEJCTB4MWMJCS8qIEFDOTcgcmVnaXN0ZXIgc2V0IGRhdGEgcmVnaXN0ZXIgKDE2IGJpdCkJKi8KKworI2RlZmluZSBBQzk3QUREUkVTUwkJMHgxZQkJLyogQUM5NyByZWdpc3RlciBzZXQgYWRkcmVzcyByZWdpc3RlciAoOCBiaXQpCSovCisjZGVmaW5lIEFDOTdBRERSRVNTX1JFQURZCTB4ODAJCS8qIFJlYWQtb25seSBiaXQsIHJlZmxlY3RzIENPREVDIFJFQURZIHNpZ25hbAkqLworI2RlZmluZSBBQzk3QUREUkVTU19BRERSRVNTCTB4N2YJCS8qIEFkZHJlc3Mgb2YgaW5kZXhlZCBBQzk3IHJlZ2lzdGVyCQkqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBFbXUxMGsxIHBvaW50ZXItb2Zmc2V0IHJlZ2lzdGVyIHNldCwgYWNjZXNzZWQgdGhyb3VnaCB0aGUgUFRSIGFuZCBEQVRBIHJlZ2lzdGVycwkJCSovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQ1BGCQkJMHgwMAkJLyogQ3VycmVudCBwaXRjaCBhbmQgZnJhY3Rpb24gcmVnaXN0ZXIJCQkqLworI2RlZmluZSBDUEZfQ1VSUkVOVFBJVENIX01BU0sJMHhmZmZmMDAwMAkvKiBDdXJyZW50IHBpdGNoIChsaW5lYXIsIDB4NDAwMCA9PSB1bml0eSBwaXRjaCBzaGlmdCkgCSovCisjZGVmaW5lIENQRl9DVVJSRU5UUElUQ0gJMHgxMDEwMDAwMAorI2RlZmluZSBDUEZfU1RFUkVPX01BU0sJCTB4MDAwMDgwMDAJLyogMSA9IEV2ZW4gY2hhbm5lbCBpbnRlcmxlYXZlLCBvZGQgY2hhbm5lbCBsb2NrZWQJKi8KKyNkZWZpbmUgQ1BGX1NUT1BfTUFTSwkJMHgwMDAwNDAwMAkvKiAxID0gQ3VycmVudCBwaXRjaCBmb3JjZWQgdG8gMAkJCSovCisjZGVmaW5lIENQRl9GUkFDQUREUkVTU19NQVNLCTB4MDAwMDNmZmYJLyogTGluZWFyIGZyYWN0aW9uYWwgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBjaGFubmVsCSovCisKKyNkZWZpbmUgUFRSWAkJCTB4MDEJCS8qIFBpdGNoIHRhcmdldCBhbmQgc2VuZCBBL0IgYW1vdW50cyByZWdpc3RlcgkJKi8KKyNkZWZpbmUgUFRSWF9QSVRDSFRBUkdFVF9NQVNLCTB4ZmZmZjAwMDAJLyogUGl0Y2ggdGFyZ2V0IG9mIHNwZWNpZmllZCBjaGFubmVsCQkJKi8KKyNkZWZpbmUgUFRSWF9QSVRDSFRBUkdFVAkweDEwMTAwMDAxCisjZGVmaW5lIFBUUlhfRlhTRU5EQU1PVU5UX0FfTUFTSyAweDAwMDBmZjAwCS8qIExpbmVhciBsZXZlbCBvZiBjaGFubmVsIG91dHB1dCBzZW50IHRvIEZYIHNlbmQgYnVzIEEJKi8KKyNkZWZpbmUgUFRSWF9GWFNFTkRBTU9VTlRfQQkweDA4MDgwMDAxCisjZGVmaW5lIFBUUlhfRlhTRU5EQU1PVU5UX0JfTUFTSyAweDAwMDAwMGZmCS8qIExpbmVhciBsZXZlbCBvZiBjaGFubmVsIG91dHB1dCBzZW50IHRvIEZYIHNlbmQgYnVzIEIJKi8KKyNkZWZpbmUgUFRSWF9GWFNFTkRBTU9VTlRfQgkweDA4MDAwMDAxCisKKyNkZWZpbmUgQ1ZDRgkJCTB4MDIJCS8qIEN1cnJlbnQgdm9sdW1lIGFuZCBmaWx0ZXIgY3V0b2ZmIHJlZ2lzdGVyCQkqLworI2RlZmluZSBDVkNGX0NVUlJFTlRWT0xfTUFTSwkweGZmZmYwMDAwCS8qIEN1cnJlbnQgbGluZWFyIHZvbHVtZSBvZiBzcGVjaWZpZWQgY2hhbm5lbAkJKi8KKyNkZWZpbmUgQ1ZDRl9DVVJSRU5UVk9MCQkweDEwMTAwMDAyCisjZGVmaW5lIENWQ0ZfQ1VSUkVOVEZJTFRFUl9NQVNLCTB4MDAwMGZmZmYJLyogQ3VycmVudCBmaWx0ZXIgY3V0b2ZmIGZyZXF1ZW5jeSBvZiBzcGVjaWZpZWQgY2hhbm5lbAkqLworI2RlZmluZSBDVkNGX0NVUlJFTlRGSUxURVIJMHgxMDAwMDAwMgorCisjZGVmaW5lIFZURlQJCQkweDAzCQkvKiBWb2x1bWUgdGFyZ2V0IGFuZCBmaWx0ZXIgY3V0b2ZmIHRhcmdldCByZWdpc3RlcgkqLworI2RlZmluZSBWVEZUX1ZPTFVNRVRBUkdFVF9NQVNLCTB4ZmZmZjAwMDAJLyogVm9sdW1lIHRhcmdldCBvZiBzcGVjaWZpZWQgY2hhbm5lbAkJCSovCisjZGVmaW5lIFZURlRfRklMVEVSVEFSR0VUX01BU0sJMHgwMDAwZmZmZgkvKiBGaWx0ZXIgY3V0b2ZmIHRhcmdldCBvZiBzcGVjaWZpZWQgY2hhbm5lbAkJKi8KKworI2RlZmluZSBaMQkJCTB4MDUJCS8qIEZpbHRlciBkZWxheSBtZW1vcnkgMSByZWdpc3RlcgkJCSovCisKKyNkZWZpbmUgWjIJCQkweDA0CQkvKiBGaWx0ZXIgZGVsYXkgbWVtb3J5IDIgcmVnaXN0ZXIJCQkqLworCisjZGVmaW5lIFBTU1QJCQkweDA2CQkvKiBTZW5kIEMgYW1vdW50IGFuZCBsb29wIHN0YXJ0IGFkZHJlc3MgcmVnaXN0ZXIJKi8KKyNkZWZpbmUgUFNTVF9GWFNFTkRBTU9VTlRfQ19NQVNLIDB4ZmYwMDAwMDAJLyogTGluZWFyIGxldmVsIG9mIGNoYW5uZWwgb3V0cHV0IHNlbnQgdG8gRlggc2VuZCBidXMgQwkqLworCisjZGVmaW5lIFBTU1RfRlhTRU5EQU1PVU5UX0MJMHgwODE4MDAwNgorCisjZGVmaW5lIFBTU1RfTE9PUFNUQVJUQUREUl9NQVNLCTB4MDBmZmZmZmYJLyogTG9vcCBzdGFydCBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgY2hhbm5lbAkJKi8KKyNkZWZpbmUgUFNTVF9MT09QU1RBUlRBRERSCTB4MTgwMDAwMDYKKworI2RlZmluZSBEU0wJCQkweDA3CQkvKiBTZW5kIEQgYW1vdW50IGFuZCBsb29wIHN0YXJ0IGFkZHJlc3MgcmVnaXN0ZXIJKi8KKyNkZWZpbmUgRFNMX0ZYU0VOREFNT1VOVF9EX01BU0sJMHhmZjAwMDAwMAkvKiBMaW5lYXIgbGV2ZWwgb2YgY2hhbm5lbCBvdXRwdXQgc2VudCB0byBGWCBzZW5kIGJ1cyBECSovCisKKyNkZWZpbmUgRFNMX0ZYU0VOREFNT1VOVF9ECTB4MDgxODAwMDcKKworI2RlZmluZSBEU0xfTE9PUEVOREFERFJfTUFTSwkweDAwZmZmZmZmCS8qIExvb3AgZW5kIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBjaGFubmVsCQkqLworI2RlZmluZSBEU0xfTE9PUEVOREFERFIJCTB4MTgwMDAwMDcKKworI2RlZmluZSBDQ0NBCQkJMHgwOAkJLyogRmlsdGVyIFEsIGludGVycC4gUk9NLCBieXRlIHNpemUsIGN1ci4gYWRkciByZWdpc3RlciAqLworI2RlZmluZSBDQ0NBX1JFU09OQU5DRQkJMHhmMDAwMDAwMAkvKiBMb3dwYXNzIGZpbHRlciByZXNvbmFuY2UgKFEpIGhlaWdodAkJCSovCisjZGVmaW5lIENDQ0FfSU5URVJQUk9NTUFTSwkweDBlMDAwMDAwCS8qIFNlbGVjdHMgcGFzc2JhbmQgb2YgaW50ZXJwb2xhdGlvbiBST00JCSovCisJCQkJCQkvKiAxID09IGZ1bGwgYmFuZCwgNyA9PSBsb3dwYXNzCQkJCSovCisJCQkJCQkvKiBST00gMCBpcyB1c2VkIHdoZW4gcGl0Y2ggc2hpZnRpbmcgZG93bndhcmQgb3IgbGVzcwkqLworCQkJCQkJLyogdGhlbiAzIHNlbWl0b25lcyB1cHdhcmQuICBJbmNyZWFzaW5nbHkgaGlnaGVyIFJPTQkqLworCQkJCQkJLyogbnVtYmVycyBhcmUgdXNlZCwgdHlwaWNhbGx5IGluIHN0ZXBzIG9mIDMgc2VtaXRvbmVzLAkqLworCQkJCQkJLyogYXMgdXB3YXJkIHBpdGNoIHNoaWZ0aW5nIGlzIHBlcmZvcm1lZC4JCSovCisjZGVmaW5lIENDQ0FfSU5URVJQUk9NXzAJMHgwMDAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gMAkJCQkqLworI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV8xCTB4MDIwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDEJCQkJKi8KKyNkZWZpbmUgQ0NDQV9JTlRFUlBST01fMgkweDA0MDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSAyCQkJCSovCisjZGVmaW5lIENDQ0FfSU5URVJQUk9NXzMJMHgwNjAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gMwkJCQkqLworI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV80CTB4MDgwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDQJCQkJKi8KKyNkZWZpbmUgQ0NDQV9JTlRFUlBST01fNQkweDBhMDAwMDAwCS8qIFNlbGVjdCBpbnRlcnBvbGF0aW9uIFJPTSA1CQkJCSovCisjZGVmaW5lIENDQ0FfSU5URVJQUk9NXzYJMHgwYzAwMDAwMAkvKiBTZWxlY3QgaW50ZXJwb2xhdGlvbiBST00gNgkJCQkqLworI2RlZmluZSBDQ0NBX0lOVEVSUFJPTV83CTB4MGUwMDAwMDAJLyogU2VsZWN0IGludGVycG9sYXRpb24gUk9NIDcJCQkJKi8KKyNkZWZpbmUgQ0NDQV84QklUU0VMRUNUCQkweDAxMDAwMDAwCS8qIDEgPSBTb3VuZCBtZW1vcnkgZm9yIHRoaXMgY2hhbm5lbCB1c2VzIDgtYml0IHNhbXBsZXMJKi8KKyNkZWZpbmUgQ0NDQV9DVVJSQUREUl9NQVNLCTB4MDBmZmZmZmYJLyogQ3VycmVudCBhZGRyZXNzIG9mIHRoZSBzZWxlY3RlZCBjaGFubmVsCQkqLworI2RlZmluZSBDQ0NBX0NVUlJBRERSCQkweDE4MDAwMDA4CisKKyNkZWZpbmUgQ0NSCQkJMHgwOQkJLyogQ2FjaGUgY29udHJvbCByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDQ1JfQ0FDSEVJTlZBTElEU0laRQkweDA3MTkwMDA5CisjZGVmaW5lIENDUl9DQUNIRUlOVkFMSURTSVpFX01BU0sJMHhmZTAwMDAwMAkvKiBOdW1iZXIgb2YgaW52YWxpZCBzYW1wbGVzIGNhY2hlIGZvciB0aGlzIGNoYW5uZWwgICAgCSovCisjZGVmaW5lIENDUl9DQUNIRUxPT1BGTEFHCTB4MDEwMDAwMDAJLyogMSA9IENhY2hlIGhhcyBhIGxvb3Agc2VydmljZSBwZW5kaW5nCQkJKi8KKyNkZWZpbmUgQ0NSX0lOVEVSTEVBVkVEU0FNUExFUwkweDAwODAwMDAwCS8qIDEgPSBBIGNhY2hlIHNlcnZpY2Ugd2lsbCBmZXRjaCBpbnRlcmxlYXZlZCBzYW1wbGVzCSovCisjZGVmaW5lIENDUl9XT1JEU0laRURTQU1QTEVTCTB4MDA0MDAwMDAJLyogMSA9IEEgY2FjaGUgc2VydmljZSB3aWxsIGZldGNoIHdvcmQgc2l6ZWQgc2FtcGxlcwkqLworI2RlZmluZSBDQ1JfUkVBREFERFJFU1MJCTB4MDYxMDAwMDkKKyNkZWZpbmUgQ0NSX1JFQURBRERSRVNTX01BU0sJMHgwMDNmMDAwMAkvKiBMb2NhdGlvbiBvZiBjYWNoZSBqdXN0IGJleW9uZCBjdXJyZW50IGNhY2hlIHNlcnZpY2UJKi8KKyNkZWZpbmUgQ0NSX0xPT1BJTlZBTFNJWkUJMHgwMDAwZmUwMAkvKiBOdW1iZXIgb2YgaW52YWxpZCBzYW1wbGVzIGluIGNhY2hlIHByaW9yIHRvIGxvb3AJKi8KKwkJCQkJCS8qIE5PVEU6IFRoaXMgaXMgdmFsaWQgb25seSBpZiBDQUNIRUxPT1BGTEFHIGlzIHNldAkqLworI2RlZmluZSBDQ1JfTE9PUEZMQUcJCTB4MDAwMDAxMDAJLyogU2V0IGZvciBhIHNpbmdsZSBzYW1wbGUgcGVyaW9kIHdoZW4gYSBsb29wIG9jY3VycwkqLworI2RlZmluZSBDQ1JfQ0FDSEVMT09QQUREUkhJCTB4MDAwMDAwZmYJLyogRFNMX0xPT1BTVEFSVEFERFIncyBoaSBieXRlIGlmIENBQ0hFTE9PUEZMQUcgaXMgc2V0CSovCisKKyNkZWZpbmUgQ0xQCQkJMHgwYQkJLyogQ2FjaGUgbG9vcCByZWdpc3RlciAodmFsaWQgaWYgQ0NSX0NBQ0hFTE9PUEZMQUcgPSAxKSAqLworCQkJCQkJLyogTk9URTogVGhpcyByZWdpc3RlciBpcyBub3JtYWxseSBub3QgdXNlZAkJKi8KKyNkZWZpbmUgQ0xQX0NBQ0hFTE9PUEFERFIJMHgwMDAwZmZmZgkvKiBDYWNoZSBsb29wIGFkZHJlc3MgKERTTF9MT09QU1RBUlRBRERSIFswLi4xNV0pCSovCisKKyNkZWZpbmUgRlhSVAkJCTB4MGIJCS8qIEVmZmVjdHMgc2VuZCByb3V0aW5nIHJlZ2lzdGVyCQkJKi8KKwkJCQkJCS8qIE5PVEU6IEl0IGlzIGlsbGVnYWwgdG8gYXNzaWduIHRoZSBzYW1lIHJvdXRpbmcgdG8JKi8KKwkJCQkJCS8qIHR3byBlZmZlY3RzIHNlbmRzLgkJCQkJKi8KKyNkZWZpbmUgRlhSVF9DSEFOTkVMQQkJMHgwMDBmMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBBCSovCisjZGVmaW5lIEZYUlRfQ0hBTk5FTEIJCTB4MDBmMDAwMDAJLyogRWZmZWN0cyBzZW5kIGJ1cyBudW1iZXIgZm9yIGNoYW5uZWwncyBlZmZlY3RzIHNlbmQgQgkqLworI2RlZmluZSBGWFJUX0NIQU5ORUxDCQkweDBmMDAwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEMJKi8KKyNkZWZpbmUgRlhSVF9DSEFOTkVMRAkJMHhmMDAwMDAwMAkvKiBFZmZlY3RzIHNlbmQgYnVzIG51bWJlciBmb3IgY2hhbm5lbCdzIGVmZmVjdHMgc2VuZCBECSovCisKKyNkZWZpbmUgTUFQQQkJCTB4MGMJCS8qIENhY2hlIG1hcCBBCQkJCQkJKi8KKworI2RlZmluZSBNQVBCCQkJMHgwZAkJLyogQ2FjaGUgbWFwIEIJCQkJCQkqLworCisjZGVmaW5lIE1BUF9QVEVfTUFTSwkJMHhmZmZmZTAwMAkvKiBUaGUgMTkgTVNCcyBvZiB0aGUgUFRFIGluZGV4ZWQgYnkgdGhlIFBUSQkJKi8KKyNkZWZpbmUgTUFQX1BUSV9NQVNLCQkweDAwMDAxZmZmCS8qIFRoZSAxMyBiaXQgaW5kZXggdG8gb25lIG9mIHRoZSA4MTkyIFBURSBkd29yZHMgICAgICAJKi8KKworI2RlZmluZSBFTlZWT0wJCQkweDEwCQkvKiBWb2x1bWUgZW52ZWxvcGUgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgRU5WVk9MX01BU0sJCTB4MDAwMGZmZmYJLyogQ3VycmVudCB2YWx1ZSBvZiB2b2x1bWUgZW52ZWxvcGUgc3RhdGUgdmFyaWFibGUJKi8gIAorCQkJCQkJLyogMHg4MDAwLW4gPT0gNjY2Km4gdXNlYyBkZWxheQkgICAgICAgCQkJKi8KKworI2RlZmluZSBBVEtITERWIAkJMHgxMQkJLyogVm9sdW1lIGVudmVsb3BlIGhvbGQgYW5kIGF0dGFjayByZWdpc3RlcgkJKi8KKyNkZWZpbmUgQVRLSExEVl9QSEFTRTAJCTB4MDAwMDgwMDAJLyogMCA9IEJlZ2luIGF0dGFjayBwaGFzZQkJCQkqLworI2RlZmluZSBBVEtITERWX0hPTERUSU1FX01BU0sJMHgwMDAwN2YwMAkvKiBFbnZlbG9wZSBob2xkIHRpbWUgKDEyNy1uID09IG4qODguMm1zZWMpCQkqLworI2RlZmluZSBBVEtITERWX0FUVEFDS1RJTUVfTUFTSwkweDAwMDAwMDdmCS8qIEVudmVsb3BlIGF0dGFjayB0aW1lLCBsb2cgZW5jb2RlZAkJCSovCisJCQkJCQkvKiAwID0gaW5maW5pdGUsIDEgPSAxMC45bXNlYywgLi4uIDB4N2YgPSA1LjVtc2VjCSovCisKKyNkZWZpbmUgRENZU1VTViAJCTB4MTIJCS8qIFZvbHVtZSBlbnZlbG9wZSBzdXN0YWluIGFuZCBkZWNheSByZWdpc3RlcgkJKi8KKyNkZWZpbmUgRENZU1VTVl9QSEFTRTFfTUFTSwkweDAwMDA4MDAwCS8qIDAgPSBCZWdpbiBhdHRhY2sgcGhhc2UsIDEgPSBiZWdpbiByZWxlYXNlIHBoYXNlCSovCisjZGVmaW5lIERDWVNVU1ZfU1VTVEFJTkxFVkVMX01BU0sgMHgwMDAwN2YwMAkvKiAxMjcgPSBmdWxsLCAwID0gb2ZmLCAwLjc1ZEIgaW5jcmVtZW50cwkJKi8KKyNkZWZpbmUgRENZU1VTVl9DSEFOTkVMRU5BQkxFX01BU0sgMHgwMDAwMDA4MAkvKiAxID0gSW5oaWJpdCBlbnZlbG9wZSBlbmdpbmUgZnJvbSB3cml0aW5nIHZhbHVlcyBpbgkqLworCQkJCQkJLyogdGhpcyBjaGFubmVsIGFuZCBmcm9tIHdyaXRpbmcgdG8gcGl0Y2gsIGZpbHRlciBhbmQJKi8KKwkJCQkJCS8qIHZvbHVtZSB0YXJnZXRzLgkJCQkJKi8KKyNkZWZpbmUgRENZU1VTVl9ERUNBWVRJTUVfTUFTSwkweDAwMDAwMDdmCS8qIFZvbHVtZSBlbnZlbG9wZSBkZWNheSB0aW1lLCBsb2cgZW5jb2RlZCAgICAgCQkqLworCQkJCQkJLyogMCA9IDQzLjdtc2VjLCAxID0gMjEuOG1zZWMsIDB4N2YgPSAyMm1zZWMJCSovCisKKyNkZWZpbmUgTEZPVkFMMSAJCTB4MTMJCS8qIE1vZHVsYXRpb24gTEZPIHZhbHVlCQkJCQkqLworI2RlZmluZSBMRk9WQUxfTUFTSwkJMHgwMDAwZmZmZgkvKiBDdXJyZW50IHZhbHVlIG9mIG1vZHVsYXRpb24gTEZPIHN0YXRlIHZhcmlhYmxlCSovCisJCQkJCQkvKiAweDgwMDAtbiA9PSA2NjYqbiB1c2VjIGRlbGF5CQkJCSovCisKKyNkZWZpbmUgRU5WVkFMCQkJMHgxNAkJLyogTW9kdWxhdGlvbiBlbnZlbG9wZSByZWdpc3RlcgkJCQkqLworI2RlZmluZSBFTlZWQUxfTUFTSwkJMHgwMDAwZmZmZgkvKiBDdXJyZW50IHZhbHVlIG9mIG1vZHVsYXRpb24gZW52ZWxvcGUgc3RhdGUgdmFyaWFibGUgCSovCisJCQkJCQkvKiAweDgwMDAtbiA9PSA2NjYqbiB1c2VjIGRlbGF5CQkJCSovCisKKyNkZWZpbmUgQVRLSExETQkJCTB4MTUJCS8qIE1vZHVsYXRpb24gZW52ZWxvcGUgaG9sZCBhbmQgYXR0YWNrIHJlZ2lzdGVyCQkqLworI2RlZmluZSBBVEtITERNX1BIQVNFMAkJMHgwMDAwODAwMAkvKiAwID0gQmVnaW4gYXR0YWNrIHBoYXNlCQkJCSovCisjZGVmaW5lIEFUS0hMRE1fSE9MRFRJTUUJMHgwMDAwN2YwMAkvKiBFbnZlbG9wZSBob2xkIHRpbWUgKDEyNy1uID09IG4qNDJtc2VjKQkJKi8KKyNkZWZpbmUgQVRLSExETV9BVFRBQ0tUSU1FCTB4MDAwMDAwN2YJLyogRW52ZWxvcGUgYXR0YWNrIHRpbWUsIGxvZyBlbmNvZGVkCQkJKi8KKwkJCQkJCS8qIDAgPSBpbmZpbml0ZSwgMSA9IDExbXNlYywgLi4uIDB4N2YgPSA1LjVtc2VjCQkqLworCisjZGVmaW5lIERDWVNVU00JCQkweDE2CQkvKiBNb2R1bGF0aW9uIGVudmVsb3BlIGRlY2F5IGFuZCBzdXN0YWluIHJlZ2lzdGVyCSovCisjZGVmaW5lIERDWVNVU01fUEhBU0UxX01BU0sJMHgwMDAwODAwMAkvKiAwID0gQmVnaW4gYXR0YWNrIHBoYXNlLCAxID0gYmVnaW4gcmVsZWFzZSBwaGFzZQkqLworI2RlZmluZSBEQ1lTVVNNX1NVU1RBSU5MRVZFTF9NQVNLIDB4MDAwMDdmMDAJLyogMTI3ID0gZnVsbCwgMCA9IG9mZiwgMC43NWRCIGluY3JlbWVudHMJCSovCisjZGVmaW5lIERDWVNVU01fREVDQVlUSU1FX01BU0sJMHgwMDAwMDA3ZgkvKiBFbnZlbG9wZSBkZWNheSB0aW1lLCBsb2cgZW5jb2RlZAkJCSovCisJCQkJCQkvKiAwID0gNDMuN21zZWMsIDEgPSAyMS44bXNlYywgMHg3ZiA9IDIybXNlYwkJKi8KKworI2RlZmluZSBMRk9WQUwyIAkJMHgxNwkJLyogVmlicmF0byBMRk8gcmVnaXN0ZXIJCQkJCSovCisjZGVmaW5lIExGT1ZBTDJfTUFTSwkJMHgwMDAwZmZmZgkvKiBDdXJyZW50IHZhbHVlIG9mIHZpYnJhdG8gTEZPIHN0YXRlIHZhcmlhYmxlIAkJKi8KKwkJCQkJCS8qIDB4ODAwMC1uID09IDY2NipuIHVzZWMgZGVsYXkJCQkJKi8KKworI2RlZmluZSBJUAkJCTB4MTgJCS8qIEluaXRpYWwgcGl0Y2ggcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgSVBfTUFTSwkJCTB4MDAwMGZmZmYJLyogRXhwb25lbnRpYWwgaW5pdGlhbCBwaXRjaCBzaGlmdAkJCSovCisJCQkJCQkvKiA0IGJpdHMgb2Ygb2N0YXZlLCAxMiBiaXRzIG9mIGZyYWN0aW9uYWwgb2N0YXZlCSovCisjZGVmaW5lIElQX1VOSVRZCQkweDAwMDBlMDAwCS8qIFVuaXR5IHBpdGNoIHNoaWZ0CQkJCQkqLworCisjZGVmaW5lIElGQVROCQkJMHgxOQkJLyogSW5pdGlhbCBmaWx0ZXIgY3V0b2ZmIGFuZCBhdHRlbnVhdGlvbiByZWdpc3RlcgkqLworI2RlZmluZSBJRkFUTl9GSUxURVJDVVRPRkZfTUFTSwkweDAwMDBmZjAwCS8qIEluaXRpYWwgZmlsdGVyIGN1dG9mZiBmcmVxdWVuY3kgaW4gZXhwb25lbnRpYWwgdW5pdHMJKi8KKwkJCQkJCS8qIDYgbW9zdCBzaWduaWZpY2FudCBiaXRzIGFyZSBzZW1pdG9uZXMJCSovCisJCQkJCQkvKiAyIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgYXJlIGZyYWN0aW9ucwkJKi8KKyNkZWZpbmUgSUZBVE5fRklMVEVSQ1VUT0ZGCTB4MDgwODAwMTkKKyNkZWZpbmUgSUZBVE5fQVRURU5VQVRJT05fTUFTSwkweDAwMDAwMGZmCS8qIEluaXRpYWwgYXR0ZW51YXRpb24gaW4gMC4zNzVkQiBzdGVwcwkJCSovCisjZGVmaW5lIElGQVROX0FUVEVOVUFUSU9OCTB4MDgwMDAwMTkKKworCisjZGVmaW5lIFBFRkUJCQkweDFhCQkvKiBQaXRjaCBlbnZlbG9wZSBhbmQgZmlsdGVyIGVudmVsb3BlIGFtb3VudCByZWdpc3RlcgkqLworI2RlZmluZSBQRUZFX1BJVENIQU1PVU5UX01BU0sJMHgwMDAwZmYwMAkvKiBQaXRjaCBlbnZsb3BlIGFtb3VudAkJCQkJKi8KKwkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgKy8tIG9uZSBvY3RhdmUgcGVhayBleHRyZW1lcwkqLworI2RlZmluZSBQRUZFX1BJVENIQU1PVU5UCTB4MDgwODAwMWEKKyNkZWZpbmUgUEVGRV9GSUxURVJBTU9VTlRfTUFTSwkweDAwMDAwMGZmCS8qIEZpbHRlciBlbnZsb3BlIGFtb3VudAkJCQkqLworCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gc2l4IG9jdGF2ZXMgcGVhayBleHRyZW1lcyAqLworI2RlZmluZSBQRUZFX0ZJTFRFUkFNT1VOVAkweDA4MDAwMDFhCisjZGVmaW5lIEZNTU9ECQkJMHgxYgkJLyogVmlicmF0by9maWx0ZXIgbW9kdWxhdGlvbiBmcm9tIExGTyByZWdpc3RlcgkJKi8KKyNkZWZpbmUgRk1NT0RfTU9EVklCUkFUTwkweDAwMDBmZjAwCS8qIFZpYnJhdG8gTEZPIG1vZHVsYXRpb24gZGVwdGgJCQkJKi8KKwkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgKy8tIG9uZSBvY3RhdmUgZXh0cmVtZXMJKi8KKyNkZWZpbmUgRk1NT0RfTU9GSUxURVIJCTB4MDAwMDAwZmYJLyogRmlsdGVyIExGTyBtb2R1bGF0aW9uIGRlcHRoCQkJCSovCisJCQkJCQkvKiBTaWduZWQgMidzIGNvbXBsZW1lbnQsICsvLSB0aHJlZSBvY3RhdmUgZXh0cmVtZXMJKi8KKworCisjZGVmaW5lIFRSRU1GUlEgCQkweDFjCQkvKiBUcmVtb2xvIGFtb3VudCBhbmQgbW9kdWxhdGlvbiBMRk8gZnJlcXVlbmN5IHJlZ2lzdGVyCSovCisjZGVmaW5lIFRSRU1GUlFfREVQVEgJCTB4MDAwMGZmMDAJLyogVHJlbW9sbyBkZXB0aAkJCQkJKi8KKwkJCQkJCS8qIFNpZ25lZCAyJ3MgY29tcGxlbWVudCwgd2l0aCArLy0gMTJkQiBleHRyZW1lcwkqLworI2RlZmluZSBUUkVNRlJRX0ZSRVFVRU5DWQkweDAwMDAwMGZmCS8qIFRyZW1vbG8gTEZPIGZyZXF1ZW5jeQkJCQkqLworCQkJCQkJLyogPz9IeiBzdGVwcywgbWF4aW11bSBvZiA/PyBIei4JCQkqLworCisjZGVmaW5lIEZNMkZSUTIgCQkweDFkCQkvKiBWaWJyYXRvIGFtb3VudCBhbmQgdmlicmF0byBMRk8gZnJlcXVlbmN5IHJlZ2lzdGVyCSovCisjZGVmaW5lIEZNMkZSUTJfREVQVEgJCTB4MDAwMGZmMDAJLyogVmlicmF0byBMRk8gdmlicmF0byBkZXB0aAkJCQkqLworCQkJCQkJLyogU2lnbmVkIDIncyBjb21wbGVtZW50LCArLy0gb25lIG9jdGF2ZSBleHRyZW1lcwkqLworI2RlZmluZSBGTTJGUlEyX0ZSRVFVRU5DWQkweDAwMDAwMGZmCS8qIFZpYnJhdG8gTEZPIGZyZXF1ZW5jeQkJCQkqLworCQkJCQkJLyogMC4wMzlIeiBzdGVwcywgbWF4aW11bSBvZiA5Ljg1IEh6LgkJCSovCisKKyNkZWZpbmUgVEVNUEVOViAJCTB4MWUJCS8qIFRlbXBvcnkgZW52ZWxvcGUgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgVEVNUEVOVl9NQVNLCQkweDAwMDBmZmZmCS8qIDE2LWJpdCB2YWx1ZQkJCQkJCSovCisJCQkJCQkvKiBOT1RFOiBBbGwgY2hhbm5lbHMgY29udGFpbiBpbnRlcm5hbCB2YXJpYWJsZXM7IGRvCSovCisJCQkJCQkvKiBub3Qgd3JpdGUgdG8gdGhlc2UgbG9jYXRpb25zLgkJCSovCisKKyNkZWZpbmUgQ0QwCQkJMHgyMAkJLyogQ2FjaGUgZGF0YSAwIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENEMQkJCTB4MjEJCS8qIENhY2hlIGRhdGEgMSByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDRDIJCQkweDIyCQkvKiBDYWNoZSBkYXRhIDIgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQ0QzCQkJMHgyMwkJLyogQ2FjaGUgZGF0YSAzIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENENAkJCTB4MjQJCS8qIENhY2hlIGRhdGEgNCByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDRDUJCQkweDI1CQkvKiBDYWNoZSBkYXRhIDUgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQ0Q2CQkJMHgyNgkJLyogQ2FjaGUgZGF0YSA2IHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENENwkJCTB4MjcJCS8qIENhY2hlIGRhdGEgNyByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDRDgJCQkweDI4CQkvKiBDYWNoZSBkYXRhIDggcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQ0Q5CQkJMHgyOQkJLyogQ2FjaGUgZGF0YSA5IHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENEQQkJCTB4MmEJCS8qIENhY2hlIGRhdGEgQSByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDREIJCQkweDJiCQkvKiBDYWNoZSBkYXRhIEIgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQ0RDCQkJMHgyYwkJLyogQ2FjaGUgZGF0YSBDIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIENERAkJCTB4MmQJCS8qIENhY2hlIGRhdGEgRCByZWdpc3RlcgkJCQkqLworI2RlZmluZSBDREUJCQkweDJlCQkvKiBDYWNoZSBkYXRhIEUgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQ0RGCQkJMHgyZgkJLyogQ2FjaGUgZGF0YSBGIHJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgUFRCCQkJMHg0MAkJLyogUGFnZSB0YWJsZSBiYXNlIHJlZ2lzdGVyCQkJCSovCisjZGVmaW5lIFBUQl9NQVNLCQkweGZmZmZmMDAwCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIHBhZ2UgdGFibGUgaW4gaG9zdCBtZW1vcnkJKi8KKworI2RlZmluZSBUQ0IJCQkweDQxCQkvKiBUYW5rIGNhY2hlIGJhc2UgcmVnaXN0ZXIgICAgCQkJCSovCisjZGVmaW5lIFRDQl9NQVNLCQkweGZmZmZmMDAwCS8qIFBoeXNpY2FsIGFkZHJlc3Mgb2YgdGhlIGJvdHRvbSBvZiBob3N0IGJhc2VkIFRSQU0JKi8KKworI2RlZmluZSBBRENDUgkJCTB4NDIJCS8qIEFEQyBzYW1wbGUgcmF0ZS9zdGVyZW8gY29udHJvbCByZWdpc3RlcgkJKi8KKyNkZWZpbmUgQURDQ1JfUkNIQU5FTkFCTEUJMHgwMDAwMDAxMAkvKiBFbmFibGVzIHJpZ2h0IGNoYW5uZWwgZm9yIHdyaXRpbmcgdG8gdGhlIGhvc3QgICAgICAgCSovCisjZGVmaW5lIEFEQ0NSX0xDSEFORU5BQkxFCTB4MDAwMDAwMDgJLyogRW5hYmxlcyBsZWZ0IGNoYW5uZWwgZm9yIHdyaXRpbmcgdG8gdGhlIGhvc3QJCSovCisJCQkJCQkvKiBOT1RFOiBUbyBndWFyYW50ZWUgcGhhc2UgY29oZXJlbmN5LCBib3RoIGNoYW5uZWxzCSovCisJCQkJCQkvKiBtdXN0IGJlIGRpc2FibGVkIHByaW9yIHRvIGVuYWJsaW5nIGJvdGggY2hhbm5lbHMuCSovCisjZGVmaW5lIEFfQURDQ1JfUkNIQU5FTkFCTEUJMHgwMDAwMDAyMAorI2RlZmluZSBBX0FEQ0NSX0xDSEFORU5BQkxFCTB4MDAwMDAwMTAKKworI2RlZmluZSBBX0FEQ0NSX1NBTVBMRVJBVEVfTUFTSyAweDAwMDAwMDBGICAgICAgLyogQXVkaWd5IHNhbXBsZSByYXRlIGNvbnZlcnRvciBvdXRwdXQgcmF0ZQkJKi8KKyNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV9NQVNLCTB4MDAwMDAwMDcJLyogU2FtcGxlIHJhdGUgY29udmVydG9yIG91dHB1dCByYXRlCQkJKi8KKworI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzQ4CTB4MDAwMDAwMDAJLyogNDhrSHogc2FtcGxlIHJhdGUJCQkJCSovCisjZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfNDQJMHgwMDAwMDAwMQkvKiA0NC4xa0h6IHNhbXBsZSByYXRlCQkJCQkqLworI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzMyCTB4MDAwMDAwMDIJLyogMzJrSHogc2FtcGxlIHJhdGUJCQkJCSovCisjZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMjQJMHgwMDAwMDAwMwkvKiAyNGtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KKyNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV8yMgkweDAwMDAwMDA0CS8qIDIyLjA1a0h6IHNhbXBsZSByYXRlCQkJCQkqLworI2RlZmluZSBBRENDUl9TQU1QTEVSQVRFXzE2CTB4MDAwMDAwMDUJLyogMTZrSHogc2FtcGxlIHJhdGUJCQkJCSovCisjZGVmaW5lIEFEQ0NSX1NBTVBMRVJBVEVfMTEJMHgwMDAwMDAwNgkvKiAxMS4wMjVrSHogc2FtcGxlIHJhdGUJCQkJKi8KKyNkZWZpbmUgQURDQ1JfU0FNUExFUkFURV84CTB4MDAwMDAwMDcJLyogOGtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KKworI2RlZmluZSBBX0FEQ0NSX1NBTVBMRVJBVEVfMTIJMHgwMDAwMDAwNgkvKiAxMmtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KKyNkZWZpbmUgQV9BRENDUl9TQU1QTEVSQVRFXzExCTB4MDAwMDAwMDcJLyogMTEuMDI1a0h6IHNhbXBsZSByYXRlCQkJCSovCisjZGVmaW5lIEFfQURDQ1JfU0FNUExFUkFURV84CTB4MDAwMDAwMDgJLyogOGtIeiBzYW1wbGUgcmF0ZQkJCQkJKi8KKworI2RlZmluZSBGWFdDCQkJMHg0MwkJLyogRlggb3V0cHV0IHdyaXRlIGNoYW5uZWxzIHJlZ2lzdGVyCQkJKi8KKwkJCQkJCS8qIFdoZW4gc2V0LCBlYWNoIGJpdCBlbmFibGVzIHRoZSB3cml0aW5nIG9mIHRoZQkqLworCQkJCQkJLyogY29ycmVzcG9uZGluZyBGWCBvdXRwdXQgY2hhbm5lbCAoaW50ZXJuYWwgcmVnaXN0ZXJzICAqLworCQkJCQkJLyogMHgyMC0weDNmKSBpbnRvIGhvc3QgbWVtb3J5LiBUaGlzIG1vZGUgb2YgcmVjb3JkaW5nCSovCisJCQkJCQkvKiBpcyAxNmJpdCwgNDhLSHogb25seS4gQWxsIDMyCWNoYW5uZWxzIGNhbiBiZSBlbmFibGVkICovCisJCQkJCQkvKiBzaW11bHRhbmVvdXNseS4JCQkJCSovCisjZGVmaW5lIFRDQlMJCQkweDQ0CQkvKiBUYW5rIGNhY2hlIGJ1ZmZlciBzaXplIHJlZ2lzdGVyCQkJKi8KKyNkZWZpbmUgVENCU19NQVNLCQkweDAwMDAwMDA3CS8qIFRhbmsgY2FjaGUgYnVmZmVyIHNpemUgZmllbGQJCQkJKi8KKyNkZWZpbmUgVENCU19CVUZGU0laRV8xNksJMHgwMDAwMDAwMAorI2RlZmluZSBUQ0JTX0JVRkZTSVpFXzMySwkweDAwMDAwMDAxCisjZGVmaW5lIFRDQlNfQlVGRlNJWkVfNjRLCTB4MDAwMDAwMDIKKyNkZWZpbmUgVENCU19CVUZGU0laRV8xMjhLCTB4MDAwMDAwMDMKKyNkZWZpbmUgVENCU19CVUZGU0laRV8yNTZLCTB4MDAwMDAwMDQKKyNkZWZpbmUgVENCU19CVUZGU0laRV81MTJLCTB4MDAwMDAwMDUKKyNkZWZpbmUgVENCU19CVUZGU0laRV8xMDI0SwkweDAwMDAwMDA2CisjZGVmaW5lIFRDQlNfQlVGRlNJWkVfMjA0OEsJMHgwMDAwMDAwNworCisjZGVmaW5lIE1JQ0JBCQkJMHg0NQkJLyogQUM5NyBtaWNyb3Bob25lIGJ1ZmZlciBhZGRyZXNzIHJlZ2lzdGVyCQkqLworI2RlZmluZSBNSUNCQV9NQVNLCQkweGZmZmZmMDAwCS8qIDIwIGJpdCBiYXNlIGFkZHJlc3MJCQkJCSovCisKKyNkZWZpbmUgQURDQkEJCQkweDQ2CQkvKiBBREMgYnVmZmVyIGFkZHJlc3MgcmVnaXN0ZXIJCQkJKi8KKyNkZWZpbmUgQURDQkFfTUFTSwkJMHhmZmZmZjAwMAkvKiAyMCBiaXQgYmFzZSBhZGRyZXNzCQkJCQkqLworCisjZGVmaW5lIEZYQkEJCQkweDQ3CQkvKiBGWCBCdWZmZXIgQWRkcmVzcyAqLworI2RlZmluZSBGWEJBX01BU0sJCTB4ZmZmZmYwMDAJLyogMjAgYml0IGJhc2UgYWRkcmVzcwkJCQkJKi8KKworI2RlZmluZSBNSUNCUwkJCTB4NDkJCS8qIE1pY3JvcGhvbmUgYnVmZmVyIHNpemUgcmVnaXN0ZXIJCQkqLworCisjZGVmaW5lIEFEQ0JTCQkJMHg0YQkJLyogQURDIGJ1ZmZlciBzaXplIHJlZ2lzdGVyCQkJCSovCisKKyNkZWZpbmUgRlhCUwkJCTB4NGIJCS8qIEZYIGJ1ZmZlciBzaXplIHJlZ2lzdGVyCQkJCSovCisKKy8qIFRoZSBmb2xsb3dpbmcgbWFzayB2YWx1ZXMgZGVmaW5lIHRoZSBzaXplIG9mIHRoZSBBREMsIE1JWCBhbmQgRlggYnVmZmVycyBpbiBieXRlcyAqLworI2RlZmluZSBBRENCU19CVUZTSVpFX05PTkUJMHgwMDAwMDAwMAorI2RlZmluZSBBRENCU19CVUZTSVpFXzM4NAkweDAwMDAwMDAxCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNDQ4CTB4MDAwMDAwMDIKKyNkZWZpbmUgQURDQlNfQlVGU0laRV81MTIJMHgwMDAwMDAwMworI2RlZmluZSBBRENCU19CVUZTSVpFXzY0MAkweDAwMDAwMDA0CisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNzY4CTB4MDAwMDAwMDUKKyNkZWZpbmUgQURDQlNfQlVGU0laRV84OTYJMHgwMDAwMDAwNgorI2RlZmluZSBBRENCU19CVUZTSVpFXzEwMjQJMHgwMDAwMDAwNworI2RlZmluZSBBRENCU19CVUZTSVpFXzEyODAJMHgwMDAwMDAwOAorI2RlZmluZSBBRENCU19CVUZTSVpFXzE1MzYJMHgwMDAwMDAwOQorI2RlZmluZSBBRENCU19CVUZTSVpFXzE3OTIJMHgwMDAwMDAwYQorI2RlZmluZSBBRENCU19CVUZTSVpFXzIwNDgJMHgwMDAwMDAwYgorI2RlZmluZSBBRENCU19CVUZTSVpFXzI1NjAJMHgwMDAwMDAwYworI2RlZmluZSBBRENCU19CVUZTSVpFXzMwNzIJMHgwMDAwMDAwZAorI2RlZmluZSBBRENCU19CVUZTSVpFXzM1ODQJMHgwMDAwMDAwZQorI2RlZmluZSBBRENCU19CVUZTSVpFXzQwOTYJMHgwMDAwMDAwZgorI2RlZmluZSBBRENCU19CVUZTSVpFXzUxMjAJMHgwMDAwMDAxMAorI2RlZmluZSBBRENCU19CVUZTSVpFXzYxNDQJMHgwMDAwMDAxMQorI2RlZmluZSBBRENCU19CVUZTSVpFXzcxNjgJMHgwMDAwMDAxMgorI2RlZmluZSBBRENCU19CVUZTSVpFXzgxOTIJMHgwMDAwMDAxMworI2RlZmluZSBBRENCU19CVUZTSVpFXzEwMjQwCTB4MDAwMDAwMTQKKyNkZWZpbmUgQURDQlNfQlVGU0laRV8xMjI4OAkweDAwMDAwMDE1CisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMTQzNjYJMHgwMDAwMDAxNgorI2RlZmluZSBBRENCU19CVUZTSVpFXzE2Mzg0CTB4MDAwMDAwMTcKKyNkZWZpbmUgQURDQlNfQlVGU0laRV8yMDQ4MAkweDAwMDAwMDE4CisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfMjQ1NzYJMHgwMDAwMDAxOQorI2RlZmluZSBBRENCU19CVUZTSVpFXzI4NjcyCTB4MDAwMDAwMWEKKyNkZWZpbmUgQURDQlNfQlVGU0laRV8zMjc2OAkweDAwMDAwMDFiCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNDA5NjAJMHgwMDAwMDAxYworI2RlZmluZSBBRENCU19CVUZTSVpFXzQ5MTUyCTB4MDAwMDAwMWQKKyNkZWZpbmUgQURDQlNfQlVGU0laRV81NzM0NAkweDAwMDAwMDFlCisjZGVmaW5lIEFEQ0JTX0JVRlNJWkVfNjU1MzYJMHgwMDAwMDAxZgorCisKKyNkZWZpbmUgQ0RDUwkJCTB4NTAJCS8qIENELVJPTSBkaWdpdGFsIGNoYW5uZWwgc3RhdHVzIHJlZ2lzdGVyCSovCisKKyNkZWZpbmUgR1BTQ1MJCQkweDUxCQkvKiBHZW5lcmFsIFB1cnBvc2UgU1BESUYgY2hhbm5lbCBzdGF0dXMgcmVnaXN0ZXIqLworCisjZGVmaW5lIERCRwkJCTB4NTIJCS8qIERPIE5PVCBQUk9HUkFNIFRISVMgUkVHSVNURVIhISEgTUFZIERFU1RST1kgQ0hJUCAqLworCisvKiBkZWZpbml0aW9ucyBmb3IgZGVidWcgcmVnaXN0ZXIgLSB0YWtlbiBmcm9tIHRoZSBhbHNhIGRyaXZlcnMgKi8KKyNkZWZpbmUgREJHX1pDICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMCAgICAgIC8qIHplcm8gdHJhbSBjb3VudGVyICovCisjZGVmaW5lIERCR19TQVRVUkFUSU9OX09DQ1VSRUQgIDB4MDIwMDAwMDAgICAgICAvKiBzYXR1cmF0aW9uIGNvbnRyb2wgKi8KKyNkZWZpbmUgREJHX1NBVFVSQVRJT05fQUREUiAgICAgMHgwMWZmMDAwMCAgICAgIC8qIHNhdHVyYXRpb24gYWRkcmVzcyAqLworI2RlZmluZSBEQkdfU0lOR0xFX1NURVAgICAgICAgICAweDAwMDA4MDAwICAgICAgLyogc2luZ2xlIHN0ZXAgbW9kZSAqLworI2RlZmluZSBEQkdfU1RFUCAgICAgICAgICAgICAgICAweDAwMDA0MDAwICAgICAgLyogc3RhcnQgc2luZ2xlIHN0ZXAgKi8KKyNkZWZpbmUgREJHX0NPTkRJVElPTl9DT0RFICAgICAgMHgwMDAwM2UwMCAgICAgIC8qIGNvbmRpdGlvbiBjb2RlICovCisjZGVmaW5lIERCR19TSU5HTEVfU1RFUF9BRERSICAgIDB4MDAwMDAxZmYgICAgICAvKiBzaW5nbGUgc3RlcCBhZGRyZXNzICovCisKKworI2RlZmluZSBSRUc1MwkJCTB4NTMJCS8qIERPIE5PVCBQUk9HUkFNIFRISVMgUkVHSVNURVIhISEgTUFZIERFU1RST1kgQ0hJUCAqLworCisjZGVmaW5lIEFfREJHCQkJIDB4NTMKKyNkZWZpbmUgQV9EQkdfU0lOR0xFX1NURVAJIDB4MDAwMjAwMDAJLyogU2V0IHRvIHplcm8gdG8gc3RhcnQgZHNwICovCisjZGVmaW5lIEFfREJHX1pDCQkgMHg0MDAwMDAwMAkvKiB6ZXJvIHRyYW0gY291bnRlciAqLworI2RlZmluZSBBX0RCR19TVEVQX0FERFIJCSAweDAwMDAwM2ZmCisjZGVmaW5lIEFfREJHX1NBVFVSQVRJT05fT0NDVVJFRCAweDIwMDAwMDAwCisjZGVmaW5lIEFfREJHX1NBVFVSQVRJT05fQUREUgkgMHgwZmZjMDAwMAorCisjZGVmaW5lIFNQQ1MwCQkJMHg1NAkJLyogU1BESUYgb3V0cHV0IENoYW5uZWwgU3RhdHVzIDAgcmVnaXN0ZXIJKi8KKworI2RlZmluZSBTUENTMQkJCTB4NTUJCS8qIFNQRElGIG91dHB1dCBDaGFubmVsIFN0YXR1cyAxIHJlZ2lzdGVyCSovCisKKyNkZWZpbmUgU1BDUzIJCQkweDU2CQkvKiBTUERJRiBvdXRwdXQgQ2hhbm5lbCBTdGF0dXMgMiByZWdpc3RlcgkqLworCisjZGVmaW5lIFNQQ1NfQ0xLQUNDWU1BU0sJMHgzMDAwMDAwMAkvKiBDbG9jayBhY2N1cmFjeQkJCQkqLworI2RlZmluZSBTUENTX0NMS0FDQ1lfMTAwMFBQTQkweDAwMDAwMDAwCS8qIDEwMDAgcGFydHMgcGVyIG1pbGxpb24JCQkqLworI2RlZmluZSBTUENTX0NMS0FDQ1lfNTBQUE0JMHgxMDAwMDAwMAkvKiA1MCBwYXJ0cyBwZXIgbWlsbGlvbgkJCQkqLworI2RlZmluZSBTUENTX0NMS0FDQ1lfVkFSSUFCTEUJMHgyMDAwMDAwMAkvKiBWYXJpYWJsZSBhY2N1cmFjeQkJCQkqLworI2RlZmluZSBTUENTX1NBTVBMRVJBVEVNQVNLCTB4MGYwMDAwMDAJLyogU2FtcGxlIHJhdGUJCQkJCSovCisjZGVmaW5lIFNQQ1NfU0FNUExFUkFURV80NAkweDAwMDAwMDAwCS8qIDQ0LjFrSHogc2FtcGxlIHJhdGUJCQkJKi8KKyNkZWZpbmUgU1BDU19TQU1QTEVSQVRFXzQ4CTB4MDIwMDAwMDAJLyogNDhrSHogc2FtcGxlIHJhdGUJCQkJKi8KKyNkZWZpbmUgU1BDU19TQU1QTEVSQVRFXzMyCTB4MDMwMDAwMDAJLyogMzJrSHogc2FtcGxlIHJhdGUJCQkJKi8KKyNkZWZpbmUgU1BDU19DSEFOTkVMTlVNTUFTSwkweDAwZjAwMDAwCS8qIENoYW5uZWwgbnVtYmVyCQkJCSovCisjZGVmaW5lIFNQQ1NfQ0hBTk5FTE5VTV9VTlNQRUMJMHgwMDAwMDAwMAkvKiBVbnNwZWNpZmllZCBjaGFubmVsIG51bWJlcgkJCSovCisjZGVmaW5lIFNQQ1NfQ0hBTk5FTE5VTV9MRUZUCTB4MDAxMDAwMDAJLyogTGVmdCBjaGFubmVsCQkJCQkqLworI2RlZmluZSBTUENTX0NIQU5ORUxOVU1fUklHSFQJMHgwMDIwMDAwMAkvKiBSaWdodCBjaGFubmVsCQkJCSovCisjZGVmaW5lIFNQQ1NfU09VUkNFTlVNTUFTSwkweDAwMGYwMDAwCS8qIFNvdXJjZSBudW1iZXIJCQkJKi8KKyNkZWZpbmUgU1BDU19TT1VSQ0VOVU1fVU5TUEVDCTB4MDAwMDAwMDAJLyogVW5zcGVjaWZpZWQgc291cmNlIG51bWJlcgkJCSovCisjZGVmaW5lIFNQQ1NfR0VORVJBVElPTlNUQVRVUwkweDAwMDA4MDAwCS8qIE9yaWdpbmFsaXR5IGZsYWcgKHNlZSBJRUMtOTU4IHNwZWMpCQkqLworI2RlZmluZSBTUENTX0NBVEVHT1JZQ09ERU1BU0sJMHgwMDAwN2YwMAkvKiBDYXRlZ29yeSBjb2RlIChzZWUgSUVDLTk1OCBzcGVjKQkJKi8KKyNkZWZpbmUgU1BDU19NT0RFTUFTSwkJMHgwMDAwMDBjMAkvKiBNb2RlIChzZWUgSUVDLTk1OCBzcGVjKQkJCSovCisjZGVmaW5lIFNQQ1NfRU1QSEFTSVNNQVNLCTB4MDAwMDAwMzgJLyogRW1waGFzaXMJCQkJCSovCisjZGVmaW5lIFNQQ1NfRU1QSEFTSVNfTk9ORQkweDAwMDAwMDAwCS8qIE5vIGVtcGhhc2lzCQkJCQkqLworI2RlZmluZSBTUENTX0VNUEhBU0lTXzUwXzE1CTB4MDAwMDAwMDgJLyogNTAvMTUgdXNlYyAyIGNoYW5uZWwJCQkJKi8KKyNkZWZpbmUgU1BDU19DT1BZUklHSFQJCTB4MDAwMDAwMDQJLyogQ29weXJpZ2h0IGFzc2VydGVkIGZsYWcgLS0gZG8gbm90IG1vZGlmeQkqLworI2RlZmluZSBTUENTX05PVEFVRElPREFUQQkweDAwMDAwMDAyCS8qIDAgPSBEaWdpdGFsIGF1ZGlvLCAxID0gbm90IGF1ZGlvCQkqLworI2RlZmluZSBTUENTX1BST0ZFU1NJT05BTAkweDAwMDAwMDAxCS8qIDAgPSBDb25zdW1lciAoSUVDLTk1OCksIDEgPSBwcm8gKEFFUzMtMTk5MikJKi8KKworLyogVGhlIDMyLWJpdCBDTEl4IGFuZCBTT0x4IHJlZ2lzdGVycyBhbGwgaGF2ZSBvbmUgYml0IHBlciBjaGFubmVsIGNvbnRyb2wvc3RhdHVzICAgICAgCQkqLworI2RlZmluZSBDTElFTAkJCTB4NTgJCS8qIENoYW5uZWwgbG9vcCBpbnRlcnJ1cHQgZW5hYmxlIGxvdyByZWdpc3RlcgkqLworCisjZGVmaW5lIENMSUVICQkJMHg1OQkJLyogQ2hhbm5lbCBsb29wIGludGVycnVwdCBlbmFibGUgaGlnaCByZWdpc3RlcgkqLworCisjZGVmaW5lIENMSVBMCQkJMHg1YQkJLyogQ2hhbm5lbCBsb29wIGludGVycnVwdCBwZW5kaW5nIGxvdyByZWdpc3RlcgkqLworCisjZGVmaW5lIENMSVBICQkJMHg1YgkJLyogQ2hhbm5lbCBsb29wIGludGVycnVwdCBwZW5kaW5nIGhpZ2ggcmVnaXN0ZXIJKi8KKworI2RlZmluZSBTT0xFTAkJCTB4NWMJCS8qIFN0b3Agb24gbG9vcCBlbmFibGUgbG93IHJlZ2lzdGVyCQkqLworCisjZGVmaW5lIFNPTEVICQkJMHg1ZAkJLyogU3RvcCBvbiBsb29wIGVuYWJsZSBoaWdoIHJlZ2lzdGVyCQkqLworCisjZGVmaW5lIFNQQllQQVNTCQkweDVlCQkvKiBTUERJRiBCWVBBU1MgbW9kZSByZWdpc3RlcgkJCSovCisjZGVmaW5lIFNQQllQQVNTX0VOQUJMRQkJMHgwMDAwMDAwMQkvKiBFbmFibGUgU1BESUYgYnlwYXNzIG1vZGUJCQkqLworCisjZGVmaW5lIEFDOTdTTE9UCQkweDVmCQkvKiBhZGRpdGlvbmFsIEFDOTcgc2xvdHMgZW5hYmxlIGJpdHMgKi8KKyNkZWZpbmUgQUM5N1NMT1RfQ05UUgkJMHgxMAkJLyogQ2VudGVyIGVuYWJsZSAqLworI2RlZmluZSBBQzk3U0xPVF9MRkUJCTB4MjAJCS8qIExGRSBlbmFibGUgKi8KKworI2RlZmluZSBDRFNSQ1MJCQkweDYwCQkvKiBDRC1ST00gU2FtcGxlIFJhdGUgQ29udmVydGVyIHN0YXR1cyByZWdpc3RlcgkqLworCisjZGVmaW5lIEdQU1JDUwkJCTB4NjEJCS8qIEdlbmVyYWwgUHVycG9zZSBTUERJRiBzYW1wbGUgcmF0ZSBjdnQgc3RhdHVzICovCisKKyNkZWZpbmUgWlZTUkNTCQkJMHg2MgkJLyogWlZpZGVvIHNhbXBsZSByYXRlIGNvbnZlcnRlciBzdGF0dXMJCSovCisJCQkJCQkvKiBOT1RFOiBUaGlzIG9uZSBoYXMgbm8gU1BESUZMT0NLRUQgZmllbGQJKi8KKwkJCQkJCS8qIEFzc3VtZXMgc2FtcGxlIGxvY2sJCQkJKi8KKworLyogVGhlc2UgdGhyZWUgYml0ZmllbGRzIGFwcGx5IHRvIENEU1JDUywgR1BTUkNTLCBhbmQgKGV4Y2VwdCBhcyBub3RlZCkgWlZTUkNTLgkJCSovCisjZGVmaW5lIFNSQ1NfU1BESUZMT0NLRUQJMHgwMjAwMDAwMAkvKiBTUERJRiBzdHJlYW0gbG9ja2VkCQkJCSovCisjZGVmaW5lIFNSQ1NfUkFURUxPQ0tFRAkJMHgwMTAwMDAwMAkvKiBTYW1wbGUgcmF0ZSBsb2NrZWQJCQkJKi8KKyNkZWZpbmUgU1JDU19FU1RTQU1QTEVSQVRFCTB4MDAwN2ZmZmYJLyogRG8gbm90IG1vZGlmeSB0aGlzIGZpZWxkLgkJCSovCisKKworLyogTm90ZSB0aGF0IHRoZXNlIHZhbHVlcyBjYW4gdmFyeSArLy0gYnkgYSBzbWFsbCBhbW91bnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgU1JDU19TUERJRlJBVEVfNDQJMHgwMDAzYWNkOQorI2RlZmluZSBTUkNTX1NQRElGUkFURV80OAkweDAwMDQwMDAwCisjZGVmaW5lIFNSQ1NfU1BESUZSQVRFXzk2CTB4MDAwODAwMDAKKworI2RlZmluZSBNSUNJRFggICAgICAgICAgICAgICAgICAweDYzICAgICAgICAgICAgLyogTWljcm9waG9uZSByZWNvcmRpbmcgYnVmZmVyIGluZGV4IHJlZ2lzdGVyICAgKi8KKyNkZWZpbmUgTUlDSURYX01BU0sgICAgICAgICAgICAgMHgwMDAwZmZmZiAgICAgIC8qIDE2LWJpdCB2YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIE1JQ0lEWF9JRFgJCTB4MTAwMDAwNjMKKworI2RlZmluZSBBX0FEQ0lEWAkJMHg2MworI2RlZmluZSBBX0FEQ0lEWF9JRFgJCTB4MTAwMDAwNjMKKworI2RlZmluZSBBRENJRFgJCQkweDY0CQkvKiBBREMgcmVjb3JkaW5nIGJ1ZmZlciBpbmRleCByZWdpc3RlcgkJKi8KKyNkZWZpbmUgQURDSURYX01BU0sJCTB4MDAwMGZmZmYJLyogMTYgYml0IGluZGV4IGZpZWxkCQkJCSovCisjZGVmaW5lIEFEQ0lEWF9JRFgJCTB4MTAwMDAwNjQKKworI2RlZmluZSBGWElEWAkJCTB4NjUJCS8qIEZYIHJlY29yZGluZyBidWZmZXIgaW5kZXggcmVnaXN0ZXIJCSovCisjZGVmaW5lIEZYSURYX01BU0sJCTB4MDAwMGZmZmYJLyogMTYtYml0IHZhbHVlCQkJCQkqLworI2RlZmluZSBGWElEWF9JRFgJCTB4MTAwMDAwNjUKKworLyogVGhpcyBpcyB0aGUgTVBVIHBvcnQgb24gdGhlIGNhcmQgKHZpYSB0aGUgZ2FtZSBwb3J0KQkJCQkJCSovCisjZGVmaW5lIEFfTVVEQVRBMQkJMHg3MAorI2RlZmluZSBBX01VQ01EMQkJMHg3MQorI2RlZmluZSBBX01VU1RBVDEJCUFfTVVDTUQxCisKKy8qIFRoaXMgaXMgdGhlIE1QVSBwb3J0IG9uIHRoZSBBdWRpZ3kgRHJpdmUgCQkJCQkJCSovCisjZGVmaW5lIEFfTVVEQVRBMgkJMHg3MgorI2RlZmluZSBBX01VQ01EMgkJMHg3MworI2RlZmluZSBBX01VU1RBVDIJCUFfTVVDTUQyCQorCisvKiBUaGUgbmV4dCB0d28gYXJlIHRoZSBBdWRpZ3kgZXF1aXZhbGVudCBvZiBGWFdDCQkJCQkJKi8KKy8qIHRoZSBBdWRpZ3kgY2FuIHJlY29yZCBhbnkgb3V0cHV0ICgxNmJpdCwgNDhrSHosIHVwIHRvIDY0IGNoYW5uZWwgc2ltdWx0YW5lb3VzbHkpIAkJKi8KKy8qIEVhY2ggYml0IHNlbGVjdHMgYSBjaGFubmVsIGZvciByZWNvcmRpbmcgKi8KKyNkZWZpbmUgQV9GWFdDMQkJCTB4NzQgICAgICAgICAgICAvKiBTZWxlY3RzIDB4N2YtMHg2MCBmb3IgRlggcmVjb3JkaW5nICAgICAgICAgICAqLworI2RlZmluZSBBX0ZYV0MyCQkJMHg3NQkJLyogU2VsZWN0cyAweDlmLTB4ODAgZm9yIEZYIHJlY29yZGluZyAgICAgICAgICAgKi8KKworI2RlZmluZSBBX1NQRElGX1NBTVBMRVJBVEUJMHg3NgkJLyogU2V0IHRoZSBzYW1wbGUgcmF0ZSBvZiBTUERJRiBvdXRwdXQJCSovCisjZGVmaW5lIEFfU1BESUZfNDgwMDAJCTB4MDAwMDAwODAKKyNkZWZpbmUgQV9TUERJRl80NDEwMAkJMHgwMDAwMDAwMAorI2RlZmluZSBBX1NQRElGXzk2MDAwCQkweDAwMDAwMDQwCisKKyNkZWZpbmUgQV9GWFJUMgkJCTB4N2MKKyNkZWZpbmUgQV9GWFJUX0NIQU5ORUxFCQkweDAwMDAwMDNmCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEUJKi8KKyNkZWZpbmUgQV9GWFJUX0NIQU5ORUxGCQkweDAwMDAzZjAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEYJKi8KKyNkZWZpbmUgQV9GWFJUX0NIQU5ORUxHCQkweDAwM2YwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEcJKi8KKyNkZWZpbmUgQV9GWFJUX0NIQU5ORUxICQkweDNmMDAwMDAwCS8qIEVmZmVjdHMgc2VuZCBidXMgbnVtYmVyIGZvciBjaGFubmVsJ3MgZWZmZWN0cyBzZW5kIEgJKi8KKworI2RlZmluZSBBX1NFTkRBTU9VTlRTCQkweDdkCisjZGVmaW5lIEFfRlhTRU5EQU1PVU5UX0VfTUFTSwkweGZmMDAwMDAwCisjZGVmaW5lIEFfRlhTRU5EQU1PVU5UX0ZfTUFTSwkweDAwZmYwMDAwCisjZGVmaW5lIEFfRlhTRU5EQU1PVU5UX0dfTUFTSwkweDAwMDBmZjAwCisjZGVmaW5lIEFfRlhTRU5EQU1PVU5UX0hfTUFTSwkweDAwMDAwMGZmCisKKy8qIFRoZSBzZW5kIGFtb3VudHMgZm9yIHRoaXMgb25lIGFyZSB0aGUgc2FtZSBhcyB1c2VkIHdpdGggdGhlIGVtdTEwazEgKi8KKyNkZWZpbmUgQV9GWFJUMQkJCTB4N2UKKyNkZWZpbmUgQV9GWFJUX0NIQU5ORUxBCQkweDAwMDAwMDNmCisjZGVmaW5lIEFfRlhSVF9DSEFOTkVMQgkJMHgwMDAwM2YwMAorI2RlZmluZSBBX0ZYUlRfQ0hBTk5FTEMJCTB4MDAzZjAwMDAKKyNkZWZpbmUgQV9GWFJUX0NIQU5ORUxECQkweDNmMDAwMDAwCisKKworLyogRWFjaCBGWCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXIgaXMgMzIgYml0cyBpbiBsZW5ndGgsIGFsbCBiaXRzIGFyZSB1c2VkCQkJKi8KKyNkZWZpbmUgRlhHUFJFR0JBU0UJCTB4MTAwCQkvKiBGWCBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzIGJhc2UgICAgICAgCSovCisjZGVmaW5lIEFfRlhHUFJFR0JBU0UJCTB4NDAwCQkvKiBBdWRpZ3kgR1BScywgMHg0MDAgdG8gMHg1ZmYJCQkqLworLyogVGFuayBhdWRpbyBkYXRhIGlzIGxvZ2FyaXRobWljYWxseSBjb21wcmVzc2VkIGRvd24gdG8gMTYgYml0cyBiZWZvcmUgd3JpdGluZyB0byBUUkFNIGFuZCBpcwkqLworLyogZGVjb21wcmVzc2VkIGJhY2sgdG8gMjAgYml0cyBvbiBhIHJlYWQuICBUaGVyZSBhcmUgYSB0b3RhbCBvZiAxNjAgbG9jYXRpb25zLCB0aGUgbGFzdCAzMgkqLworLyogbG9jYXRpb25zIGFyZSBmb3IgZXh0ZXJuYWwgVFJBTS4gCQkJCQkJCQkqLworI2RlZmluZSBUQU5LTUVNREFUQVJFR0JBU0UJMHgyMDAJCS8qIFRhbmsgbWVtb3J5IGRhdGEgcmVnaXN0ZXJzIGJhc2UgICAgIAkJKi8KKyNkZWZpbmUgVEFOS01FTURBVEFSRUdfTUFTSwkweDAwMGZmZmZmCS8qIDIwIGJpdCB0YW5rIGF1ZGlvIGRhdGEgZmllbGQJCQkqLworCisvKiBDb21iaW5lZCBhZGRyZXNzIGZpZWxkIGFuZCBtZW1vcnkgb3Bjb2RlIG9yIGZsYWcgZmllbGQuICAxNjAgbG9jYXRpb25zLCBsYXN0IDMyIGFyZSBleHRlcm5hbAkqLworI2RlZmluZSBUQU5LTUVNQUREUlJFR0JBU0UJMHgzMDAJCS8qIFRhbmsgbWVtb3J5IGFkZHJlc3MgcmVnaXN0ZXJzIGJhc2UJCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX0FERFJfTUFTSyAweDAwMGZmZmZmCS8qIDIwIGJpdCB0YW5rIGFkZHJlc3MgZmllbGQJCQkqLworI2RlZmluZSBUQU5LTUVNQUREUlJFR19DTEVBUgkweDAwODAwMDAwCS8qIENsZWFyIHRhbmsgbWVtb3J5CQkJCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX0FMSUdOCTB4MDA0MDAwMDAJLyogQWxpZ24gcmVhZCBvciB3cml0ZSByZWxhdGl2ZSB0byB0YW5rIGFjY2VzcwkqLworI2RlZmluZSBUQU5LTUVNQUREUlJFR19XUklURQkweDAwMjAwMDAwCS8qIFdyaXRlIHRvIHRhbmsgbWVtb3J5CQkJCSovCisjZGVmaW5lIFRBTktNRU1BRERSUkVHX1JFQUQJMHgwMDEwMDAwMAkvKiBSZWFkIGZyb20gdGFuayBtZW1vcnkJCQkqLworCisjZGVmaW5lIE1JQ1JPQ09ERUJBU0UJCTB4NDAwCQkvKiBNaWNyb2NvZGUgZGF0YSBiYXNlIGFkZHJlc3MJCQkqLworCisvKiBFYWNoIERTUCBtaWNyb2NvZGUgaW5zdHJ1Y3Rpb24gaXMgbWFwcGVkIGludG8gMiBkb3VibGV3b3JkcyAJCQkJCSovCisvKiBOT1RFOiBXaGVuIHdyaXRpbmcsIGFsd2F5cyB3cml0ZSB0aGUgTE8gZG91Ymxld29yZCBmaXJzdC4gIFJlYWRzIGNhbiBiZSBpbiBlaXRoZXIgb3JkZXIuCSovCisjZGVmaW5lIExPV09SRF9PUFhfTUFTSwkJMHgwMDBmZmMwMAkvKiBJbnN0cnVjdGlvbiBvcGVyYW5kIFgJCQkqLworI2RlZmluZSBMT1dPUkRfT1BZX01BU0sJCTB4MDAwMDAzZmYJLyogSW5zdHJ1Y3Rpb24gb3BlcmFuZCBZCQkJKi8KKyNkZWZpbmUgSElXT1JEX09QQ09ERV9NQVNLCTB4MDBmMDAwMDAJLyogSW5zdHJ1Y3Rpb24gb3Bjb2RlCQkJCSovCisjZGVmaW5lIEhJV09SRF9SRVNVTFRfTUFTSwkweDAwMGZmYzAwCS8qIEluc3RydWN0aW9uIHJlc3VsdAkJCQkqLworI2RlZmluZSBISVdPUkRfT1BBX01BU0sJCTB4MDAwMDAzZmYJLyogSW5zdHJ1Y3Rpb24gb3BlcmFuZCBBCQkJKi8KKworCisvKiBBdWRpZ3kgU291bmRjYXJkIGhhdmUgYSBkaWZmZXJlbnQgaW5zdHJ1Y3Rpb24gZm9ybWF0ICovCisjZGVmaW5lIEFVRElHWV9DT0RFQkFTRQkJMHg2MDAKKyNkZWZpbmUgQV9MT1dPUkRfT1BZX01BU0sJMHgwMDAwMDdmZgkJCisjZGVmaW5lIEFfTE9XT1JEX09QWF9NQVNLCTB4MDA3ZmYwMDAKKyNkZWZpbmUgQV9ISVdPUkRfT1BDT0RFX01BU0sJMHgwZjAwMDAwMAorI2RlZmluZSBBX0hJV09SRF9SRVNVTFRfTUFTSwkweDAwN2ZmMDAwCisjZGVmaW5lIEFfSElXT1JEX09QQV9NQVNLCTB4MDAwMDA3ZmYKKworCisjZW5kaWYgLyogXzgwMTBfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvTWFrZWZpbGUgYi9zb3VuZC9vc3MvZW11MTBrMS9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2FmOWNjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvTWFrZWZpbGUKQEAgLTAsMCArMSwxNyBAQAorIyBNYWtlZmlsZSBmb3IgQ3JlYXRpdmUgTGFicyBFTVUxMEsxIAorIworIyAxMiBBcHIgMjAwMCBSdWkgU291c2EKKworb2JqLSQoQ09ORklHX1NPVU5EX0VNVTEwSzEpICs9IGVtdTEwazEubworCitlbXUxMGsxLW9ianMgOj0gYXVkaW8ubyBjYXJkbWkubyBjYXJkbW8ubyBjYXJkd2kubyBjYXJkd28ubyBlY2FyZC5vIFwKKyAgICAgICAgICAgICAgICBlZnhtZ3IubyBlbXVhZHhtZy5vIGh3YWNjZXNzLm8gaXJxbWdyLm8gbWFpbi5vIG1pZGkubyBcCisgICAgICAgICAgICAgICAgbWl4ZXIubyBwYXNzdGhyb3VnaC5vIHJlY21nci5vIHRpbWVyLm8gdm9pY2VtZ3IubworCitpZmRlZiBERUJVRworICAgIEVYVFJBX0NGTEFHUyArPSAtREVNVTEwSzFfREVCVUcKK2VuZGlmCisKK2lmZGVmIENPTkZJR19NSURJX0VNVTEwSzEKKyAgICBFWFRSQV9DRkxBR1MgKz0gLURFTVUxMEsxX1NFUVVFTkNFUgorZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTRkNTkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5jCkBAIC0wLDAgKzEsMTU4OCBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgYXVkaW8uYyAtLSAvZGV2L2RzcCBpbnRlcmZhY2UgZm9yIGVtdTEwazEgZHJpdmVyCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKiAgICAgTm92ZW1iZXIgMiwgMTk5OQkgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuZWQgdXAgdHlwZXMvbGVha3MKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKworI2luY2x1ZGUgImh3YWNjZXNzLmgiCisjaW5jbHVkZSAiY2FyZHdvLmgiCisjaW5jbHVkZSAiY2FyZHdpLmgiCisjaW5jbHVkZSAicmVjbWdyLmgiCisjaW5jbHVkZSAiaXJxbWdyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICI4MDEwLmgiCisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9vZnJhZyhzdHJ1Y3Qgd29pbnN0ICopOworc3RhdGljIHZvaWQgY2FsY3VsYXRlX2lmcmFnKHN0cnVjdCB3aWluc3QgKik7CisKK3N0YXRpYyB2b2lkIGVtdTEwazFfd2F2ZW91dF9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpOworc3RhdGljIHZvaWQgZW11MTBrMV93YXZlaW5fYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKTsKKworLyogQXVkaW8gZmlsZSBvcGVyYXRpb25zICovCitzdGF0aWMgc3NpemVfdCBlbXUxMGsxX2F1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OworCXNzaXplX3QgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBEKDMsICJlbXUxMGsxX2F1ZGlvX3JlYWQoKSwgYnVmZmVyPSVwLCBjb3VudD0lZFxuIiwgYnVmZmVyLCAodTMyKSBjb3VudCk7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCWlmICh3aWluc3QtPm1tYXBwZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCisJaWYgKHdpaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpIHsKKwkJY2FsY3VsYXRlX2lmcmFnKHdpaW5zdCk7CisKKwkJd2hpbGUgKGVtdTEwazFfd2F2ZWluX29wZW4od2F2ZV9kZXYpIDwgMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd2F2ZV9kZXYtPmNhcmQtPm9wZW5fd2FpdCk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJdTMyIGJ5dGVzdG9jb3B5OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoISh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQorCQkgICAgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9JTlBVVCkpCisJCQllbXUxMGsxX3dhdmVpbl9zdGFydCh3YXZlX2Rldik7CisKKwkJZW11MTBrMV93YXZlaW5fdXBkYXRlKHdhdmVfZGV2LT5jYXJkLCB3aWluc3QpOworCQllbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZSh3aWluc3QsICZieXRlc3RvY29weSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJRFBEKDMsICJieXRlc3RvY29weSAtLT4gJWRcbiIsIGJ5dGVzdG9jb3B5KTsKKworCQlpZiAoKGJ5dGVzdG9jb3B5ID49IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpCisJCSAgICB8fCAoYnl0ZXN0b2NvcHkgPj0gY291bnQpKSB7CisJCQlieXRlc3RvY29weSA9IG1pbl90KHUzMiwgYnl0ZXN0b2NvcHksIGNvdW50KTsKKworCQkJZW11MTBrMV93YXZlaW5feGZlcmRhdGEod2lpbnN0LCAodTggX191c2VyICopYnVmZmVyLCAmYnl0ZXN0b2NvcHkpOworCisJCQljb3VudCAtPSBieXRlc3RvY29weTsKKwkJCWJ1ZmZlciArPSBieXRlc3RvY29weTsKKwkJCXJldCArPSBieXRlc3RvY29weTsKKwkJfQorCisJCWlmIChjb3VudCA+IDApIHsKKwkJCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkgICAgfHwgKCEod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX0lOUFVUKSkpCisJCQkJcmV0dXJuIChyZXQgPyByZXQgOiAtRUFHQUlOKTsKKworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd2lpbnN0LT53YWl0X3F1ZXVlKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiAocmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTKTsKKworCQl9CisJfQorCisJRFBEKDMsICJieXRlcyBjb3BpZWQgLT4gJWRcbiIsICh1MzIpIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBlbXUxMGsxX2F1ZGlvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBEKDMsICJlbXUxMGsxX2F1ZGlvX3dyaXRlKCksIGJ1ZmZlcj0lcCwgY291bnQ9JWRcbiIsIGJ1ZmZlciwgKHUzMikgY291bnQpOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCWlmICh3b2luc3QtPm1tYXBwZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5YSU87CisJfQorCS8vIFRoaXMgaXMgZm9yIGVtdTEwazEgcmV2cyBsZXNzIHRoYW4gNywgd2UgbmVlZCB0byBnbyB0aHJvdWdoIHRyYW0KKwlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMSkgeworCQlpbnQgcjsKKwkJCisJCXdvaW5zdC0+YnVmZmVyLm9zc2ZyYWdzaGlmdCA9IFBUX0JMT0NLU0laRV9MT0cyOworCQl3b2luc3QtPmJ1ZmZlci5udW1mcmFncyA9IFBUX0JMT0NLQ09VTlQ7CisJCWNhbGN1bGF0ZV9vZnJhZyh3b2luc3QpOworCQkKKwkJciA9IGVtdTEwazFfcHRfd3JpdGUoZmlsZSwgYnVmZmVyLCBjb3VudCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcjsKKwl9CisKKwlpZiAod29pbnN0LT5zdGF0ZSA9PSBXQVZFX1NUQVRFX0NMT1NFRCkgeworCQljYWxjdWxhdGVfb2ZyYWcod29pbnN0KTsKKworCQl3aGlsZSAoZW11MTBrMV93YXZlb3V0X29wZW4od2F2ZV9kZXYpIDwgMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmd2F2ZV9kZXYtPmNhcmQtPm9wZW5fd2FpdCk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCXJldCA9IDA7CisJaWYgKGNvdW50ICUgd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJzYW1wbGUpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKwljb3VudCAvPSB3b2luc3QtPm51bV92b2ljZXM7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXUzMiBieXRlc3RvY29weTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKKwkJZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHdvaW5zdCwgJmJ5dGVzdG9jb3B5KTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJRFBEKDMsICJieXRlc3RvY29weSAtLT4gJWRcbiIsIGJ5dGVzdG9jb3B5KTsKKworCQlpZiAoKGJ5dGVzdG9jb3B5ID49IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUpCisJCSAgICB8fCAoYnl0ZXN0b2NvcHkgPj0gY291bnQpKSB7CisKKwkJCWJ5dGVzdG9jb3B5ID0gbWluX3QodTMyLCBieXRlc3RvY29weSwgY291bnQpOworCisJCQllbXUxMGsxX3dhdmVvdXRfeGZlcmRhdGEod29pbnN0LCAodTggX191c2VyICopIGJ1ZmZlciwgJmJ5dGVzdG9jb3B5KTsKKworCQkJY291bnQgLT0gYnl0ZXN0b2NvcHk7CisJCQlidWZmZXIgKz0gYnl0ZXN0b2NvcHkgKiB3b2luc3QtPm51bV92b2ljZXM7CisJCQlyZXQgKz0gYnl0ZXN0b2NvcHkgKiB3b2luc3QtPm51bV92b2ljZXM7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJCXdvaW5zdC0+dG90YWxfY29waWVkICs9IGJ5dGVzdG9jb3B5OworCisJCQlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQorCQkJICAgICYmICh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfT1VUUFVUKQorCQkJICAgICYmICh3b2luc3QtPnRvdGFsX2NvcGllZCA+PSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSkKKwkJCQllbXUxMGsxX3dhdmVvdXRfc3RhcnQod2F2ZV9kZXYpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCisJCWlmIChjb3VudCA+IDApIHsKKwkJCWlmICgoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkgICAgfHwgKCEod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkpKQorCQkJCXJldHVybiAocmV0ID8gcmV0IDogLUVBR0FJTik7CisKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJndvaW5zdC0+d2FpdF9xdWV1ZSk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gKHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUyk7CisJCX0KKwl9CisKKwlEUEQoMywgImJ5dGVzIGNvcGllZCAtPiAlZFxuIiwgKHUzMikgcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZW11MTBrMV9hdWRpb19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gTlVMTDsKKwlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSBOVUxMOworCWludCB2YWwgPSAwOworCXUzMiBieXRlc3RvY29weTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCURQRig0LCAiZW11MTBrMV9hdWRpb19pb2N0bCgpXG4iKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQl3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorCQlEUEYoMiwgIk9TU19HRVRWRVJTSU9OOlxuIik7CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJRFBGKDIsICJTTkRDVExfRFNQX1JFU0VUOlxuIik7CisJCXdhdmVfZGV2LT5lbmFibGViaXRzID0gUENNX0VOQUJMRV9PVVRQVVQgfCBQQ01fRU5BQkxFX0lOUFVUOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgeworCQkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7CisJCQl9CisKKwkJCXdvaW5zdC0+bW1hcHBlZCA9IDA7CisJCQl3b2luc3QtPnRvdGFsX2NvcGllZCA9IDA7CisJCQl3b2luc3QtPnRvdGFsX3BsYXllZCA9IDA7CisJCQl3b2luc3QtPmJsb2NrcyA9IDA7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQl9CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKKwkJCQllbXUxMGsxX3dhdmVpbl9jbG9zZSh3YXZlX2Rldik7CisJCQl9CisKKwkJCXdpaW5zdC0+bW1hcHBlZCA9IDA7CisJCQl3aWluc3QtPnRvdGFsX3JlY29yZGVkID0gMDsKKwkJCXdpaW5zdC0+YmxvY2tzID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQl9CisKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKwkJRFBGKDIsICJTTkRDVExfRFNQX1NZTkM6XG4iKTsKKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgeworCisJCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCisJCQkJCXdoaWxlICgod29pbnN0LT50b3RhbF9wbGF5ZWQgPCB3b2luc3QtPnRvdGFsX2NvcGllZCkKKwkJCQkJICAgICAgICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCQkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZ3b2luc3QtPndhaXRfcXVldWUpOworCQkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCQl9CisJCQkJZW11MTBrMV93YXZlb3V0X2Nsb3NlKHdhdmVfZGV2KTsKKwkJCX0KKworCQkJd29pbnN0LT5tbWFwcGVkID0gMDsKKwkJCXdvaW5zdC0+dG90YWxfY29waWVkID0gMDsKKwkJCXdvaW5zdC0+dG90YWxfcGxheWVkID0gMDsKKwkJCXdvaW5zdC0+YmxvY2tzID0gMDsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCX0KKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgeworCQkJCWVtdTEwazFfd2F2ZWluX2Nsb3NlKHdhdmVfZGV2KTsKKwkJCX0KKworCQkJd2lpbnN0LT5tbWFwcGVkID0gMDsKKwkJCXdpaW5zdC0+dG90YWxfcmVjb3JkZWQgPSAwOworCQkJd2lpbnN0LT5ibG9ja3MgPSAwOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCURQRigyLCAiU05EQ1RMX0RTUF9TRVREVVBMRVg6XG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJRFBGKDIsICJTTkRDVExfRFNQX0dFVENBUFM6XG4iKTsKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8CisJCQkJRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQIHwKKwkJCQlEU1BfQ0FQX0NPUFJPQ3wgRFNQX0NBUF9NVUxUSSwgcCk7CisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorCQlEUEYoMiwgIlNORENUTF9EU1BfU1BFRUQ6XG4iKTsKKworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURQRCgyLCAidmFsIGlzICVkXG4iLCB2YWwpOworCisJCWlmICh2YWwgPiAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7CisKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCQlmb3JtYXQgPSB3aWluc3QtPmZvcm1hdDsKKwkJCQlmb3JtYXQuc2FtcGxpbmdyYXRlID0gdmFsOworCisJCQkJaWYgKGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisKKwkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGU7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJCURQRCgyLCAic2V0IHJlY29yZGluZyBzYW1wbGluZyByYXRlIC0+ICVkXG4iLCB2YWwpOworCQkJfQorCisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQkJZm9ybWF0ID0gd29pbnN0LT5mb3JtYXQ7CisJCQkJZm9ybWF0LnNhbXBsaW5ncmF0ZSA9IHZhbDsKKworCQkJCWlmIChlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHdhdmVfZGV2LCAmZm9ybWF0KSA8IDApIHsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCX0KKworCQkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKKworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQkJRFBEKDIsICJzZXQgcGxheWJhY2sgc2FtcGxpbmcgcmF0ZSAtPiAlZFxuIiwgdmFsKTsKKwkJCX0KKworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCX0gZWxzZSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGU7CisJCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGU7CisKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJRFBGKDIsICJTTkRDVExfRFNQX1NURVJFTzpcbiIpOworCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJRFBEKDIsICIgdmFsIGlzICVkXG4iLCB2YWwpOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWZvcm1hdCA9IHdpaW5zdC0+Zm9ybWF0OworCQkJZm9ybWF0LmNoYW5uZWxzID0gdmFsID8gMiA6IDE7CisKKwkJCWlmIChlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5jaGFubmVscyAtIDE7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJRFBEKDIsICJzZXQgcmVjb3JkaW5nIHN0ZXJlbyAtPiAlZFxuIiwgdmFsKTsKKwkJfQorCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlmb3JtYXQgPSB3b2luc3QtPmZvcm1hdDsKKwkJCWZvcm1hdC5jaGFubmVscyA9IHZhbCA/IDIgOiAxOworCisJCQlpZiAoZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCXZhbCA9IHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzIC0gMTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCURQRCgyLCAic2V0IHBsYXliYWNrIHN0ZXJlbyAtPiAlZFxuIiwgdmFsKTsKKwkJfQorCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlEUEYoMiwgIlNORENUTF9EU1BfQ0hBTk5FTFM6XG4iKTsKKworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURQRCgyLCAiIHZhbCBpcyAlZFxuIiwgdmFsKTsKKworCQlpZiAodmFsID4gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQkJZm9ybWF0ID0gd2lpbnN0LT5mb3JtYXQ7CisJCQkJZm9ybWF0LmNoYW5uZWxzID0gdmFsOworCisJCQkJaWYgKGVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJmZvcm1hdCkgPCAwKSB7CisJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHM7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQlEUEQoMiwgInNldCByZWNvcmRpbmcgbnVtYmVyIG9mIGNoYW5uZWxzIC0+ICVkXG4iLCB2YWwpOworCQkJfQorCisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQkJZm9ybWF0ID0gd29pbnN0LT5mb3JtYXQ7CisJCQkJZm9ybWF0LmNoYW5uZWxzID0gdmFsOworCisJCQkJaWYgKGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuY2hhbm5lbHM7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQlEUEQoMiwgInNldCBwbGF5YmFjayBudW1iZXIgb2YgY2hhbm5lbHMgLT4gJWRcbiIsIHZhbCk7CisJCQl9CisKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQl9IGVsc2UgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHM7CisJCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5jaGFubmVsczsKKworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKKwkJRFBGKDIsICJTTkRDVExfRFNQX0dFVEZNVFM6XG4iKTsKKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXZhbCA9IEFGTVRfUzE2X0xFOworCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJdmFsID0gQUZNVF9TMTZfTEUgfCBBRk1UX1U4OworCQkJaWYgKGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmd2F2ZV9kZXYtPmNhcmQtPm1nciwKKwkJCQkJCSAgICAgd2F2ZV9kZXYtPmNhcmQtPnB0LnBhdGNoX25hbWUsIAorCQkJCQkJICAgICB3YXZlX2Rldi0+Y2FyZC0+cHQuZW5hYmxlX2dwcl9uYW1lKSA+PSAwKQorCQkJCXZhbCB8PSBBRk1UX0FDMzsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CS8qIFNhbWUgYXMgU05EQ1RMX0RTUF9TQU1QTEVTSVpFICovCisJCURQRigyLCAiU05EQ1RMX0RTUF9TRVRGTVQ6XG4iKTsKKworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCURQRCgyLCAiIHZhbCBpcyAlZFxuIiwgdmFsKTsKKworCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RydWN0IHdhdmVfZm9ybWF0IGZvcm1hdDsKKworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJCWZvcm1hdCA9IHdpaW5zdC0+Zm9ybWF0OworCQkJCWZvcm1hdC5pZCA9IHZhbDsKKworCQkJCWlmIChlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuaWQ7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQlEUEQoMiwgInNldCByZWNvcmRpbmcgZm9ybWF0IC0+ICVkXG4iLCB2YWwpOworCQkJfQorCisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQkJZm9ybWF0ID0gd29pbnN0LT5mb3JtYXQ7CisJCQkJZm9ybWF0LmlkID0gdmFsOworCisJCQkJaWYgKGVtdTEwazFfd2F2ZW91dF9zZXRmb3JtYXQod2F2ZV9kZXYsICZmb3JtYXQpIDwgMCkgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCisJCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuaWQ7CisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQlEUEQoMiwgInNldCBwbGF5YmFjayBmb3JtYXQgLT4gJWRcbiIsIHZhbCk7CisJCQl9CisKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQl9IGVsc2UgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuaWQ7CisJCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5pZDsKKworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQl2YWwgPSB3aWluc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbDsKKwkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbDsKKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXZhbCA9IHdpaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZTsKKwkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQl2YWwgPSB3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGU7CisKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJdmFsID0gd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHM7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJdmFsID0gd29pbnN0LT5mb3JtYXQuY2hhbm5lbHM7CisKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJCURQRigyLCAiU09VTkRfUENNX1dSSVRFX0ZJTFRFUjogbm90IGltcGxlbWVudGVkXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKwkJRFBGKDIsICJTT1VORF9QQ01fUkVBRF9GSUxURVI6IG5vdCBpbXBsZW1lbnRlZFxuIik7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwkJRFBGKDIsICJTTkRDVExfRFNQX1NFVFNZTkNSTzogbm90IGltcGxlbWVudGVkXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJRFBGKDIsICJTTkRDVExfRFNQX0dFVFRSSUdHRVI6XG4iKTsKKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgKHdhdmVfZGV2LT5lbmFibGViaXRzICYgUENNX0VOQUJMRV9PVVRQVVQpKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmICh3YXZlX2Rldi0+ZW5hYmxlYml0cyAmIFBDTV9FTkFCTEVfSU5QVVQpKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJRFBGKDIsICJTTkRDVExfRFNQX1NFVFRSSUdHRVI6XG4iKTsKKworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQl3YXZlX2Rldi0+ZW5hYmxlYml0cyB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikKKwkJCQkJZW11MTBrMV93YXZlb3V0X3N0YXJ0KHdhdmVfZGV2KTsKKwkJCX0gZWxzZSB7CisJCQkJd2F2ZV9kZXYtPmVuYWJsZWJpdHMgJj0gflBDTV9FTkFCTEVfT1VUUFVUOworCQkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQorCQkJCQllbXUxMGsxX3dhdmVvdXRfc3RvcCh3YXZlX2Rldik7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQl9CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQl3YXZlX2Rldi0+ZW5hYmxlYml0cyB8PSBQQ01fRU5BQkxFX0lOUFVUOworCQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKQorCQkJCQllbXUxMGsxX3dhdmVpbl9zdGFydCh3YXZlX2Rldik7CisJCQl9IGVsc2UgeworCQkJCXdhdmVfZGV2LT5lbmFibGViaXRzICY9IH5QQ01fRU5BQkxFX0lOUFVUOworCQkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKQorCQkJCQllbXUxMGsxX3dhdmVpbl9zdG9wKHdhdmVfZGV2KTsKKwkJCX0KKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQl7CisJCQlhdWRpb19idWZfaW5mbyBpbmZvOworCisJCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUT1NQQUNFOlxuIik7CisKKwkJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikgeworCQkJCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKKwkJCQllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOworCQkJCWluZm8uYnl0ZXMgPSBieXRlc3RvY29weTsKKwkJCX0gZWxzZSB7CisJCQkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7CisJCQkJaW5mby5ieXRlcyA9IHdvaW5zdC0+YnVmZmVyLnNpemU7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJaW5mby5ieXRlcyAqPSB3b2luc3QtPm51bV92b2ljZXM7CisJCQlpbmZvLmZyYWdzaXplID0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSAqIHdvaW5zdC0+bnVtX3ZvaWNlczsKKwkJCWluZm8uZnJhZ3N0b3RhbCA9IHdvaW5zdC0+YnVmZmVyLm51bWZyYWdzICogd29pbnN0LT5udW1fdm9pY2VzOworCQkJaW5mby5mcmFnbWVudHMgPSBpbmZvLmJ5dGVzIC8gaW5mby5mcmFnc2l6ZTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCXsKKwkJCWF1ZGlvX2J1Zl9pbmZvIGluZm87CisKKwkJCURQRig0LCAiU05EQ1RMX0RTUF9HRVRJU1BBQ0U6XG4iKTsKKworCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7CisJCQkJZW11MTBrMV93YXZlaW5fdXBkYXRlKHdhdmVfZGV2LT5jYXJkLCB3aWluc3QpOworCQkJCWVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHdpaW5zdCwgJmJ5dGVzdG9jb3B5KTsKKwkJCQlpbmZvLmJ5dGVzID0gYnl0ZXN0b2NvcHk7CisJCQl9IGVsc2UgeworCQkJCWNhbGN1bGF0ZV9pZnJhZyh3aWluc3QpOworCQkJCWluZm8uYnl0ZXMgPSAwOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWluZm8uZnJhZ3N0b3RhbCA9IHdpaW5zdC0+YnVmZmVyLm51bWZyYWdzOworCQkJaW5mby5mcmFnbWVudHMgPSBpbmZvLmJ5dGVzIC8gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKKwkJCWluZm8uZnJhZ3NpemUgPSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOworCisJCQlpZiAoY29weV90b191c2VyKHAsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlEUEYoMiwgIlNORENUTF9EU1BfTk9OQkxPQ0s6XG4iKTsKKworCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJRFBGKDQsICJTTkRDVExfRFNQX0dFVE9ERUxBWTpcbiIpOworCisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKKwkJCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKKwkJCWVtdTEwazFfd2F2ZW91dF9nZXR4ZmVyc2l6ZSh3b2luc3QsICZieXRlc3RvY29weSk7CisJCQl2YWwgPSB3b2luc3QtPmJ1ZmZlci5zaXplIC0gYnl0ZXN0b2NvcHk7CisJCX0gZWxzZQorCQkJdmFsID0gMDsKKworCQl2YWwgKj0gd29pbnN0LT5udW1fdm9pY2VzOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQl7CisJCQljb3VudF9pbmZvIGNpbmZvOworCisJCQlEUEYoNCwgIlNORENUTF9EU1BfR0VUSVBUUjogXG4iKTsKKworCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKKwkJCQllbXUxMGsxX3dhdmVpbl91cGRhdGUod2F2ZV9kZXYtPmNhcmQsIHdpaW5zdCk7CisJCQkJY2luZm8ucHRyID0gd2lpbnN0LT5idWZmZXIuaHdfcG9zOworCQkJCWNpbmZvLmJ5dGVzID0gY2luZm8ucHRyICsgd2lpbnN0LT50b3RhbF9yZWNvcmRlZCAtIHdpaW5zdC0+dG90YWxfcmVjb3JkZWQgJSB3aWluc3QtPmJ1ZmZlci5zaXplOworCQkJCWNpbmZvLmJsb2NrcyA9IGNpbmZvLmJ5dGVzIC8gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSAtIHdpaW5zdC0+YmxvY2tzOworCQkJCXdpaW5zdC0+YmxvY2tzID0gY2luZm8uYnl0ZXMgLyB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOworCQkJfSBlbHNlIHsKKwkJCQljaW5mby5wdHIgPSAwOworCQkJCWNpbmZvLmJ5dGVzID0gMDsKKwkJCQljaW5mby5ibG9ja3MgPSAwOworCQkJfQorCisJCQlpZiAod2lpbnN0LT5tbWFwcGVkKQorCQkJCXdpaW5zdC0+YnVmZmVyLmJ5dGVzdG9jb3B5ICU9IHdpaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAoY29weV90b191c2VyKHAsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJeworCQkJY291bnRfaW5mbyBjaW5mbzsKKworCQkJRFBGKDQsICJTTkRDVExfRFNQX0dFVE9QVFI6XG4iKTsKKworCQkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOIHx8IAorCQkJICAgICgod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMSkgJiYgd2F2ZV9kZXYtPmNhcmQtPnB0LnN0YXRlKSkgeworCQkJCWludCBudW1fZnJhZ21lbnRzOworCisJCQkJaWYgKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoID09IDEpIHsKKwkJCQkJZW11MTBrMV9wdF93YXZlb3V0X3VwZGF0ZSh3YXZlX2Rldik7CisJCQkJCWNpbmZvLmJ5dGVzID0gd29pbnN0LT50b3RhbF9wbGF5ZWQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJZW11MTBrMV93YXZlb3V0X3VwZGF0ZSh3b2luc3QpOworCQkJCQljaW5mby5ieXRlcyA9IHdvaW5zdC0+dG90YWxfcGxheWVkOworCQkJCX0KKworCQkJCWNpbmZvLnB0ciA9IHdvaW5zdC0+YnVmZmVyLmh3X3BvczsKKwkJCQludW1fZnJhZ21lbnRzID0gY2luZm8uYnl0ZXMgLyB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplOworCQkJCWNpbmZvLmJsb2NrcyA9IG51bV9mcmFnbWVudHMgLSB3b2luc3QtPmJsb2NrczsKKwkJCQl3b2luc3QtPmJsb2NrcyA9IG51bV9mcmFnbWVudHM7CisKKwkJCQljaW5mby5ieXRlcyAqPSB3b2luc3QtPm51bV92b2ljZXM7CisJCQkJY2luZm8ucHRyICo9IHdvaW5zdC0+bnVtX3ZvaWNlczsKKwkJCX0gZWxzZSB7CisJCQkJY2luZm8ucHRyID0gMDsKKwkJCQljaW5mby5ieXRlcyA9IDA7CisJCQkJY2luZm8uYmxvY2tzID0gMDsKKwkJCX0KKworCQkJaWYgKHdvaW5zdC0+bW1hcHBlZCkKKwkJCQl3b2luc3QtPmJ1ZmZlci5mcmVlX2J5dGVzICU9IHdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemU7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCQlpZiAoY29weV90b191c2VyKHAsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJRFBGKDIsICJTTkRDVExfRFNQX0dFVEJMS1NJWkU6XG4iKTsKKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJY2FsY3VsYXRlX29mcmFnKHdvaW5zdCk7CisJCQl2YWwgPSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplICogd29pbnN0LT5udW1fdm9pY2VzOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwkJCWNhbGN1bGF0ZV9pZnJhZyh3aWluc3QpOworCQkJdmFsID0gd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZTsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCX0KKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKCEod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkKKwkJCSAgICAmJiAod2F2ZV9kZXYtPmVuYWJsZWJpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkKKwkJCSAgICAmJiAod29pbnN0LT50b3RhbF9jb3BpZWQgPiAwKSkKKwkJCQllbXUxMGsxX3dhdmVvdXRfc3RhcnQod2F2ZV9kZXYpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJfQorCisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJRFBGKDIsICJTTkRDVExfRFNQX1NVQkRJVklERTogbm90IGltcGxlbWVudGVkXG4iKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCURQRigyLCAiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDpcbiIpOworCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJRFBEKDIsICJ2YWwgaXMgJSN4XG4iLCB2YWwpOworCisJCWlmICh2YWwgPT0gMCkKKwkJCXJldHVybiAtRUlPOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJLyogZGlnaXRhbCBwYXNzLXRocm91Z2ggZnJhZ21lbnQgY291bnQgYW5kIHNpemUgYXJlIGZpeGVkIHZhbHVlcyAqLworCQkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4gfHwgKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoID09IDEpKQorCQkJCXJldHVybiAtRUlOVkFMOwkvKiB0b28gbGF0ZSB0byBjaGFuZ2UgKi8KKworCQkJd29pbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJd29pbnN0LT5idWZmZXIubnVtZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJfQorCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAod2lpbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfT1BFTikKKwkJCQlyZXR1cm4gLUVJTlZBTDsJLyogdG9vIGxhdGUgdG8gY2hhbmdlICovCisKKwkJCXdpaW5zdC0+YnVmZmVyLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXdpaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCX0KKworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0NPUFJfTE9BRDoKKwkJeworCQkJY29wcl9idWZmZXIgKmJ1ZjsKKwkJCXUzMiBpOworCisJCQlEUEYoNCwgIlNORENUTF9DT1BSX0xPQUQ6XG4iKTsKKworCQkJYnVmID0ga21hbGxvYyhzaXplb2YoY29wcl9idWZmZXIpLCBHRlBfS0VSTkVMKTsKKwkJCWlmICghYnVmKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBwLCBzaXplb2YoY29wcl9idWZmZXIpKSkgeworCQkJCWtmcmVlIChidWYpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCisJCQlpZiAoKGJ1Zi0+Y29tbWFuZCAhPSBDTURfUkVBRCkgJiYgKGJ1Zi0+Y29tbWFuZCAhPSBDTURfV1JJVEUpKSB7CisJCQkJa2ZyZWUgKGJ1Zik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmIChidWYtPmNvbW1hbmQgPT0gQ01EX1dSSVRFKSB7CisJCQkJCisjaWZkZWYgREJHRU1VCisJCQkJaWYgKChidWYtPm9mZnMgPCAwKSB8fCAoYnVmLT5vZmZzICsgYnVmLT5sZW4gPiAweGUwMCkgfHwgKGJ1Zi0+bGVuID4gMTAwMCkpIHsKKyNlbHNlCisJCQkJaWYgKCgoYnVmLT5vZmZzIDwgMHgxMDApIHx8IChidWYtPm9mZnMgKyBidWYtPmxlbiA+ICh3YXZlX2Rldi0+Y2FyZC0+aXNfYXVkaWd5ID8gMHhlMDAgOiAweDgwMCkpIHx8IChidWYtPmxlbiA+IDEwMDApCisJCQkJKSAmJiAhKAorCQkJCQkvL2FueSByZWdpc3RlciBhbGxvd2VkIHJhdyBhY2Nlc3MgdG8gdXNlcnMgZ29lcyBoZXJlOgorCQkJCQkoYnVmLT5vZmZzID09IERCRyB8fAorCQkJCQkgIGJ1Zi0+b2ZmcyA9PSBBX0RCRykKKwkJCQkJJiYgKGJ1Zi0+bGVuID09IDEpKSkgeworI2VuZGlmCQkKKwkJCQkJa2ZyZWUoYnVmKTsKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoKGJ1Zi0+b2ZmcyA8IDApIHx8IChidWYtPm9mZnMgKyBidWYtPmxlbiA+IDB4ZTAwKSB8fCAoYnVmLT5sZW4gPiAxMDAwKSkgeworCQkJCQlrZnJlZShidWYpOworCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCQl9CisJCQl9CQkJCisJCQkJCisJCQlpZiAoKCh1bnNpZ25lZClidWYtPmZsYWdzKSA+IDB4M2YpCisJCQkJYnVmLT5mbGFncyA9IDA7CisKKwkJCWlmIChidWYtPmNvbW1hbmQgPT0gQ01EX1JFQUQpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgYnVmLT5sZW47IGkrKykKKwkJCQkJKCh1MzIgKikgYnVmLT5kYXRhKVtpXSA9IHNibGl2ZV9yZWFkcHRyKHdhdmVfZGV2LT5jYXJkLCBidWYtPm9mZnMgKyBpLCBidWYtPmZsYWdzKTsKKworCQkJCWlmIChjb3B5X3RvX3VzZXIocCwgYnVmLCBzaXplb2YoY29wcl9idWZmZXIpKSkgeworCQkJCQlrZnJlZShidWYpOworCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWZvciAoaSA9IDA7IGkgPCBidWYtPmxlbjsgaSsrKQorCQkJCQlzYmxpdmVfd3JpdGVwdHIod2F2ZV9kZXYtPmNhcmQsIGJ1Zi0+b2ZmcyArIGksIGJ1Zi0+ZmxhZ3MsICgodTMyICopIGJ1Zi0+ZGF0YSlbaV0pOworCQkJfQorCisJCQlrZnJlZSAoYnVmKTsKKwkJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgkJLyogRGVmYXVsdCBpcyB1bnJlY29nbml6ZWQgY29tbWFuZCAqLworCQlEUEQoMiwgImRlZmF1bHQ6ICUjeFxuIiwgY21kKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHBhZ2UgKmVtdTEwazFfbW1fbm9wYWdlIChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgaW50ICp0eXBlKQoreworCXN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2ID0gdm1hLT52bV9wcml2YXRlX2RhdGE7CisJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKKwlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OworCXN0cnVjdCBwYWdlICpkbWFwYWdlOworCXVuc2lnbmVkIGxvbmcgcGdvZmY7CisJaW50IHJkLCB3cjsKKworCURQRigzLCAiZW11MTBrMV9tbV9ub3BhZ2UoKVxuIik7CisJRFBEKDMsICJhZGRyOiAlI2x4XG4iLCBhZGRyZXNzKTsKKworCWlmIChhZGRyZXNzID4gdm1hLT52bV9lbmQpIHsKKwkJRFBGKDEsICJFWElULCByZXR1cm5pbmcgTk9QQUdFX1NJR0JVU1xuIik7CisJCXJldHVybiBOT1BBR0VfU0lHQlVTOyAvKiBEaXNhbGxvdyBtcmVtYXAgKi8KKwl9CisKKwlwZ29mZiA9IHZtYS0+dm1fcGdvZmYgKyAoKGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZUKTsKKwlpZiAod29pbnN0ICE9IE5VTEwpCisJCXdyID0gd29pbnN0LT5tbWFwcGVkOworCWVsc2UKKwkJd3IgPSAwOworCisJaWYgKHdpaW5zdCAhPSBOVUxMKQorCQlyZCA9IHdpaW5zdC0+bW1hcHBlZDsKKwllbHNlCisJCXJkID0gMDsKKworCS8qIGlmIGZ1bGwtZHVwbGV4IChyZWFkK3dyaXRlKSBhbmQgd2UgaGF2ZSB0d28gc2V0cyBvZiBidWZzLAorCSogdGhlbiB0aGUgcGxheWJhY2sgYnVmZmVycyBjb21lIGZpcnN0LCBzZXogc291bmRjYXJkLmMgKi8KKwlpZiAod3IpIHsKKwkJaWYgKHBnb2ZmID49IHdvaW5zdC0+YnVmZmVyLnBhZ2VzKSB7CisJCQlwZ29mZiAtPSB3b2luc3QtPmJ1ZmZlci5wYWdlczsKKwkJCWRtYXBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKCh1OCAqKSB3aWluc3QtPmJ1ZmZlci5hZGRyICsgcGdvZmYgKiBQQUdFX1NJWkUpOworCQl9IGVsc2UKKwkJCWRtYXBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKHdvaW5zdC0+dm9pY2VbMF0ubWVtLmFkZHJbcGdvZmZdKTsKKwl9IGVsc2UgeworCQlkbWFwYWdlID0gdmlydF90b19wYWdlICgodTggKikgd2lpbnN0LT5idWZmZXIuYWRkciArIHBnb2ZmICogUEFHRV9TSVpFKTsKKwl9CisKKwlnZXRfcGFnZSAoZG1hcGFnZSk7CisKKwlEUEQoMywgInBhZ2U6ICUjbHhcbiIsICh1bnNpZ25lZCBsb25nKSBkbWFwYWdlKTsKKwlpZiAodHlwZSkKKwkJKnR5cGUgPSBWTV9GQVVMVF9NSU5PUjsKKwlyZXR1cm4gZG1hcGFnZTsKK30KKworc3RhdGljIHN0cnVjdCB2bV9vcGVyYXRpb25zX3N0cnVjdCBlbXUxMGsxX21tX29wcyA9IHsKKwkubm9wYWdlICAgICAgICAgPSBlbXUxMGsxX21tX25vcGFnZSwKK307CisKK3N0YXRpYyBpbnQgZW11MTBrMV9hdWRpb19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIG1heF9wYWdlcywgbl9wYWdlcywgcGdvZmZzZXQ7CisJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gTlVMTDsKKwlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwgImVtdTEwazFfYXVkaW9fbW1hcCgpXG4iKTsKKworCW1heF9wYWdlcyA9IDA7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgeworCQl3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBObyBtJ21hcHBpbmcgcG9zc2libGUgZm9yIG11bHRpY2hhbm5lbCAqLworCQlpZiAod29pbnN0LT5udW1fdm9pY2VzID4gMSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKHdvaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpIHsKKwkJCWNhbGN1bGF0ZV9vZnJhZyh3b2luc3QpOworCisJCQlpZiAoZW11MTBrMV93YXZlb3V0X29wZW4od2F2ZV9kZXYpIDwgMCkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCQkJCUVSUk9SKCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKworCQl3b2luc3QtPm1tYXBwZWQgPSAxOworCQltYXhfcGFnZXMgKz0gd29pbnN0LT5idWZmZXIucGFnZXM7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCX0KKworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgeworCQl3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHdpaW5zdC0+c3RhdGUgPT0gV0FWRV9TVEFURV9DTE9TRUQpIHsKKwkJCWNhbGN1bGF0ZV9pZnJhZyh3aWluc3QpOworCisJCQlpZiAoZW11MTBrMV93YXZlaW5fb3Blbih3YXZlX2RldikgPCAwKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJCQkJRVJST1IoKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCisJCXdpaW5zdC0+bW1hcHBlZCA9IDE7CisJCW1heF9wYWdlcyArPSB3aWluc3QtPmJ1ZmZlci5wYWdlczsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisJfQorCisJbl9wYWdlcyA9ICgodm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0KSArIFBBR0VfU0laRSAtIDEpID4+IFBBR0VfU0hJRlQ7CisJcGdvZmZzZXQgPSB2bWEtPnZtX3Bnb2ZmOworCisJRFBEKDIsICJ2bWFfc3RhcnQ6ICUjbHgsIHZtYV9lbmQ6ICUjbHgsIHZtYV9vZmZzZXQ6ICVsZFxuIiwgdm1hLT52bV9zdGFydCwgdm1hLT52bV9lbmQsIHBnb2Zmc2V0KTsKKwlEUEQoMiwgIm5fcGFnZXM6ICVsZCwgbWF4X3BhZ2VzOiAlbGRcbiIsIG5fcGFnZXMsIG1heF9wYWdlcyk7CisKKwlpZiAocGdvZmZzZXQgKyBuX3BhZ2VzID4gbWF4X3BhZ2VzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CisJdm1hLT52bV9vcHMgPSAmZW11MTBrMV9tbV9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSB3YXZlX2RldjsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlbXUxMGsxX2F1ZGlvX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKwlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldjsKKworCURQRigyLCAiZW11MTBrMV9hdWRpb19vcGVuKClcbiIpOworCisJLyogQ2hlY2sgZm9yIGNvcnJlY3QgZGV2aWNlIHRvIG9wZW4gKi8KKworCWxpc3RfZm9yX2VhY2goZW50cnksICZlbXUxMGsxX2RldnMpIHsKKwkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXUxMGsxX2NhcmQsIGxpc3QpOworCisJCWlmICghKChjYXJkLT5hdWRpb19kZXYgXiBtaW5vcikgJiB+MHhmKSB8fCAhKChjYXJkLT5hdWRpb19kZXYxIF4gbWlub3IpICYgfjB4ZikpCisJCQlnb3RvIG1hdGNoOworCX0KKworCXJldHVybiAtRU5PREVWOworCittYXRjaDoKKworCXdhdmVfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSksIEdGUF9LRVJORUwpOworCisJaWYgKHdhdmVfZGV2ID09IE5VTEwpIHsgCisJCUVSUk9SKCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXdhdmVfZGV2LT5jYXJkID0gY2FyZDsKKwl3YXZlX2Rldi0+d2lpbnN0ID0gTlVMTDsKKwl3YXZlX2Rldi0+d29pbnN0ID0gTlVMTDsKKwl3YXZlX2Rldi0+ZW5hYmxlYml0cyA9IFBDTV9FTkFCTEVfT1VUUFVUIHwgUENNX0VOQUJMRV9JTlBVVDsJLyogRGVmYXVsdCAqLworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJLyogUmVjb3JkaW5nICovCisJCXN0cnVjdCB3aWluc3QgKndpaW5zdDsKKworCQlpZiAoKHdpaW5zdCA9IChzdHJ1Y3Qgd2lpbnN0ICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3aWluc3QpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkJRVJST1IoKTsKKwkJCWtmcmVlKHdhdmVfZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJd2lpbnN0LT5yZWNzcmMgPSBjYXJkLT53YXZlaW4ucmVjc3JjOworICAgICAgICAgICAgICAgIHdpaW5zdC0+Znh3YyA9IGNhcmQtPndhdmVpbi5meHdjOworCisJCXN3aXRjaCAod2lpbnN0LT5yZWNzcmMpIHsKKwkJY2FzZSBXQVZFUkVDT1JEX0FDOTc6CisJCQl3aWluc3QtPmZvcm1hdC5pZCA9IEFGTVRfUzE2X0xFOworCQkJd2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlID0gODAwMDsKKwkJCXdpaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID0gMTY7CisJCQl3aWluc3QtPmZvcm1hdC5jaGFubmVscyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBXQVZFUkVDT1JEX01JQzoKKwkJCXdpaW5zdC0+Zm9ybWF0LmlkID0gQUZNVF9TMTZfTEU7CisJCQl3aWluc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgPSA4MDAwOworCQkJd2lpbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPSAxNjsKKwkJCXdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFdBVkVSRUNPUkRfRlg6CisJCQl3aWluc3QtPmZvcm1hdC5pZCA9IEFGTVRfUzE2X0xFOworCQkJd2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlID0gNDgwMDA7CisJCQl3aWluc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCA9IDE2OworCQkJd2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgPSBod2VpZ2h0MzIod2lpbnN0LT5meHdjKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJa2ZyZWUod2F2ZV9kZXYpOworCQkJa2ZyZWUod2lpbnN0KTsKKwkJCUJVRygpOworCQkJYnJlYWs7CisJCX0KKworCQl3aWluc3QtPnN0YXRlID0gV0FWRV9TVEFURV9DTE9TRUQ7CisKKwkJd2lpbnN0LT5idWZmZXIub3NzZnJhZ3NoaWZ0ID0gMDsKKwkJd2lpbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSA9IDA7CisJCXdpaW5zdC0+YnVmZmVyLm51bWZyYWdzID0gMDsKKworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ3aWluc3QtPndhaXRfcXVldWUpOworCisJCXdpaW5zdC0+bW1hcHBlZCA9IDA7CisJCXdpaW5zdC0+dG90YWxfcmVjb3JkZWQgPSAwOworCQl3aWluc3QtPmJsb2NrcyA9IDA7CisJCXNwaW5fbG9ja19pbml0KCZ3aWluc3QtPmxvY2spOworCQl0YXNrbGV0X2luaXQoJndpaW5zdC0+dGltZXIudGFza2xldCwgZW11MTBrMV93YXZlaW5fYmgsICh1bnNpZ25lZCBsb25nKSB3YXZlX2Rldik7CisJCXdhdmVfZGV2LT53aWluc3QgPSB3aWluc3Q7CisJCWVtdTEwazFfd2F2ZWluX3NldGZvcm1hdCh3YXZlX2RldiwgJndpaW5zdC0+Zm9ybWF0KTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RydWN0IHdvaW5zdCAqd29pbnN0OworCQlpbnQgaTsKKworCQlpZiAoKHdvaW5zdCA9IChzdHJ1Y3Qgd29pbnN0ICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB3b2luc3QpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQkJRVJST1IoKTsKKwkJCWtmcmVlKHdhdmVfZGV2KTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisKKwkJaWYgKHdhdmVfZGV2LT53aWluc3QgIT0gTlVMTCkgeworCQkJd29pbnN0LT5mb3JtYXQgPSB3YXZlX2Rldi0+d2lpbnN0LT5mb3JtYXQ7CisJCX0gZWxzZSB7CisJCQl3b2luc3QtPmZvcm1hdC5pZCA9IEFGTVRfVTg7CisJCQl3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgPSA4MDAwOworCQkJd29pbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPSA4OworCQkJd29pbnN0LT5mb3JtYXQuY2hhbm5lbHMgPSAxOworCQl9CisKKwkJd29pbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfQ0xPU0VEOworCisJCXdvaW5zdC0+YnVmZmVyLmZyYWdtZW50X3NpemUgPSAwOworCQl3b2luc3QtPmJ1ZmZlci5vc3NmcmFnc2hpZnQgPSAwOworCQl3b2luc3QtPmJ1ZmZlci5udW1mcmFncyA9IDA7CisJCXdvaW5zdC0+ZGV2aWNlID0gKGNhcmQtPmF1ZGlvX2RldjEgPT0gbWlub3IpOworCQl3b2luc3QtPnRpbWVyLnN0YXRlID0gVElNRVJfU1RBVEVfVU5JTlNUQUxMRUQ7CisJCXdvaW5zdC0+bnVtX3ZvaWNlcyA9IDE7CisJCWZvciAoaSA9IDA7IGkgPCBXQVZFT1VUX01BWFZPSUNFUzsgaSsrKSB7CisJCQl3b2luc3QtPnZvaWNlW2ldLnVzYWdlID0gVk9JQ0VfVVNBR0VfRlJFRTsKKwkJCXdvaW5zdC0+dm9pY2VbaV0ubWVtLmVtdXBhZ2VpbmRleCA9IC0xOworCQl9CisKKwkJaW5pdF93YWl0cXVldWVfaGVhZCgmd29pbnN0LT53YWl0X3F1ZXVlKTsKKworCQl3b2luc3QtPm1tYXBwZWQgPSAwOworCQl3b2luc3QtPnRvdGFsX2NvcGllZCA9IDA7CisJCXdvaW5zdC0+dG90YWxfcGxheWVkID0gMDsKKwkJd29pbnN0LT5ibG9ja3MgPSAwOworCQlzcGluX2xvY2tfaW5pdCgmd29pbnN0LT5sb2NrKTsKKwkJdGFza2xldF9pbml0KCZ3b2luc3QtPnRpbWVyLnRhc2tsZXQsIGVtdTEwazFfd2F2ZW91dF9iaCwgKHVuc2lnbmVkIGxvbmcpIHdhdmVfZGV2KTsKKwkJd2F2ZV9kZXYtPndvaW5zdCA9IHdvaW5zdDsKKwkJZW11MTBrMV93YXZlb3V0X3NldGZvcm1hdCh3YXZlX2RldiwgJndvaW5zdC0+Zm9ybWF0KTsKKwl9CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSAodm9pZCAqKSB3YXZlX2RldjsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBlbXUxMGsxX2F1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCisJRFBGKDIsICJlbXUxMGsxX2F1ZGlvX3JlbGVhc2UoKVxuIik7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCWlmKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoPT0yKQorCQkJY2FyZC0+cHQuc3RhdGU9UFRfU1RBVEVfUExBWUlORzsKKwkJaWYgKHdvaW5zdC0+Zm9ybWF0LnBhc3N0aHJvdWdoICYmIGNhcmQtPnB0LnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKXsKKwkJCXNwaW5fbG9jaygmY2FyZC0+cHQubG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbXUxMGsxX3B0X3N0b3AoY2FyZCk7CisJCQlzcGluX3VubG9jaygmY2FyZC0+cHQubG9jayk7CisJCX0KKwkJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX09QRU4pIHsKKwkJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSB7CisJCQkJaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CisJCQkJCXdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkKKwkJCQkJICAgICAgICYmICh3b2luc3QtPnRvdGFsX3BsYXllZCA8IHdvaW5zdC0+dG90YWxfY29waWVkKSkgeworCQkJCQkJRFBGKDQsICJCdWZmZXIgaGFzbid0IGJlZW4gdG90YWxseSBwbGF5ZWQsIHNsZWVwLi4uLlxuIik7CisJCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKwkJCQkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJndvaW5zdC0+d2FpdF9xdWV1ZSk7CisJCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCS8qIHJlbW92ZSB0aGUgdGFza2xldCAqLworCQl0YXNrbGV0X2tpbGwoJndvaW5zdC0+dGltZXIudGFza2xldCk7CisJCWtmcmVlKHdhdmVfZGV2LT53b2luc3QpOworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7CisJCQllbXUxMGsxX3dhdmVpbl9jbG9zZSh3YXZlX2Rldik7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJdGFza2xldF9raWxsKCZ3aWluc3QtPnRpbWVyLnRhc2tsZXQpOworCQlrZnJlZSh3YXZlX2Rldi0+d2lpbnN0KTsKKwl9CisKKwlrZnJlZSh3YXZlX2Rldik7CisKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmY2FyZC0+b3Blbl93YWl0KSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYXJkLT5vcGVuX3dhaXQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIEZJWE1FIHNvcnQgb3V0IHBvbGwoKSArIG1tYXAoKSAqLworc3RhdGljIHVuc2lnbmVkIGludCBlbXUxMGsxX2F1ZGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCXUzMiBieXRlc3RvY29weTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBGKDQsICJlbXUxMGsxX2F1ZGlvX3BvbGwoKVxuIik7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXBvbGxfd2FpdChmaWxlLCAmd29pbnN0LT53YWl0X3F1ZXVlLCB3YWl0KTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlwb2xsX3dhaXQoZmlsZSwgJndpaW5zdC0+d2FpdF9xdWV1ZSwgd2FpdCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCWlmICh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7CisJCQllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7CisJCQllbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUod29pbnN0LCAmYnl0ZXN0b2NvcHkpOworCisJCQlpZiAoYnl0ZXN0b2NvcHkgPj0gd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9IGVsc2UKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCisJCWlmICh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9PUEVOKSB7CisJCQllbXUxMGsxX3dhdmVpbl91cGRhdGUod2F2ZV9kZXYtPmNhcmQsIHdpaW5zdCk7CisJCQllbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZSh3aWluc3QsICZieXRlc3RvY29weSk7CisKKwkJCWlmIChieXRlc3RvY29weSA+PSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKQorCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgdm9pZCBjYWxjdWxhdGVfb2ZyYWcoc3RydWN0IHdvaW5zdCAqd29pbnN0KQoreworCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciAqYnVmZmVyID0gJndvaW5zdC0+YnVmZmVyOworCXUzMiBmcmFnc2l6ZTsKKworCWlmIChidWZmZXItPmZyYWdtZW50X3NpemUpCisJCXJldHVybjsKKworCWlmICghYnVmZmVyLT5vc3NmcmFnc2hpZnQpIHsKKwkJZnJhZ3NpemUgPSAod29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZSAqIHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAqIFdBVkVPVVRfREVGQVVMVEZSQUdMRU4pIC8gMTAwMCAtIDE7CisKKwkJd2hpbGUgKGZyYWdzaXplKSB7CisJCQlmcmFnc2l6ZSA+Pj0gMTsKKwkJCWJ1ZmZlci0+b3NzZnJhZ3NoaWZ0Kys7CisJCX0KKwl9CisKKwlpZiAoYnVmZmVyLT5vc3NmcmFnc2hpZnQgPCBXQVZFT1VUX01JTkZSQUdTSElGVCkKKwkJYnVmZmVyLT5vc3NmcmFnc2hpZnQgPSBXQVZFT1VUX01JTkZSQUdTSElGVDsKKworCWJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA9IDEgPDwgYnVmZmVyLT5vc3NmcmFnc2hpZnQ7CisKKwl3aGlsZSAoYnVmZmVyLT5mcmFnbWVudF9zaXplICogV0FWRU9VVF9NSU5GUkFHUyA+IFdBVkVPVVRfTUFYQlVGU0laRSkKKwkJYnVmZmVyLT5mcmFnbWVudF9zaXplID4+PSAxOworCisJLyogbm93IHdlIGFyZSBzdXJlIHRoYXQ6CisJICgyXldBVkVPVVRfTUlORlJBR1NISUZUKSA8PSAoZnJhZ21lbnRfc2l6ZSA9IDJebikgPD0gKFdBVkVPVVRfTUFYQlVGU0laRSAvIFdBVkVPVVRfTUlORlJBR1MpCisJKi8KKworCWlmICghYnVmZmVyLT5udW1mcmFncykgeworCQl1MzIgbnVtZnJhZ3M7CisKKwkJbnVtZnJhZ3MgPSAod29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZSAqIHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAqIFdBVkVPVVRfREVGQVVMVEJVRkxFTikgLworCQkJICAgKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIDEwMDApIC0gMTsKKworCQlidWZmZXItPm51bWZyYWdzID0gMTsKKworCQl3aGlsZSAobnVtZnJhZ3MpIHsKKwkJCW51bWZyYWdzID4+PSAxOworCQkJYnVmZmVyLT5udW1mcmFncyA8PD0gMTsKKwkJfQorCX0KKworCWlmIChidWZmZXItPm51bWZyYWdzIDwgV0FWRU9VVF9NSU5GUkFHUykKKwkJYnVmZmVyLT5udW1mcmFncyA9IFdBVkVPVVRfTUlORlJBR1M7CisKKwlpZiAoYnVmZmVyLT5udW1mcmFncyAqIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSA+IFdBVkVPVVRfTUFYQlVGU0laRSkKKwkJYnVmZmVyLT5udW1mcmFncyA9IFdBVkVPVVRfTUFYQlVGU0laRSAvIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZTsKKworCWlmIChidWZmZXItPm51bWZyYWdzIDwgV0FWRU9VVF9NSU5GUkFHUykKKwkJQlVHKCk7CisKKwlidWZmZXItPnNpemUgPSBidWZmZXItPmZyYWdtZW50X3NpemUgKiBidWZmZXItPm51bWZyYWdzOworCWJ1ZmZlci0+cGFnZXMgPSBidWZmZXItPnNpemUgLyBQQUdFX1NJWkUgKyAoKGJ1ZmZlci0+c2l6ZSAlIFBBR0VfU0laRSkgPyAxIDogMCk7CisKKwlEUEQoMiwgIiBjYWxjdWxhdGVkIHBsYXliYWNrIGZyYWdtZW50X3NpemUgLT4gJWRcbiIsIGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSk7CisJRFBEKDIsICIgY2FsY3VsYXRlZCBwbGF5YmFjayBudW1mcmFncyAtPiAlZFxuIiwgYnVmZmVyLT5udW1mcmFncyk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9pZnJhZyhzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QpCit7CisJc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlciA9ICZ3aWluc3QtPmJ1ZmZlcjsKKwl1MzIgZnJhZ3NpemUsIGJ1ZnNpemUsIHNpemVbNF07CisJaW50IGksIGo7CisKKwlpZiAoYnVmZmVyLT5mcmFnbWVudF9zaXplKQorCQlyZXR1cm47CisKKwlpZiAoIWJ1ZmZlci0+b3NzZnJhZ3NoaWZ0KSB7CisJCWZyYWdzaXplID0gKHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2VjICogV0FWRUlOX0RFRkFVTFRGUkFHTEVOKSAvIDEwMDAgLSAxOworCisJCXdoaWxlIChmcmFnc2l6ZSkgeworCQkJZnJhZ3NpemUgPj49IDE7CisJCQlidWZmZXItPm9zc2ZyYWdzaGlmdCsrOworCQl9CisJfQorCisJaWYgKGJ1ZmZlci0+b3NzZnJhZ3NoaWZ0IDwgV0FWRUlOX01JTkZSQUdTSElGVCkKKwkJYnVmZmVyLT5vc3NmcmFnc2hpZnQgPSBXQVZFSU5fTUlORlJBR1NISUZUOworCisJYnVmZmVyLT5mcmFnbWVudF9zaXplID0gMSA8PCBidWZmZXItPm9zc2ZyYWdzaGlmdDsKKworCXdoaWxlIChidWZmZXItPmZyYWdtZW50X3NpemUgKiBXQVZFSU5fTUlORlJBR1MgPiBXQVZFSU5fTUFYQlVGU0laRSkKKwkJYnVmZmVyLT5mcmFnbWVudF9zaXplID4+PSAxOworCisJLyogbm93IHdlIGFyZSBzdXJlIHRoYXQ6CisJICAgKDJeV0FWRUlOX01JTkZSQUdTSElGVCkgPD0gKGZyYWdtZW50X3NpemUgPSAyXm4pIDw9IChXQVZFSU5fTUFYQlVGU0laRSAvIFdBVkVJTl9NSU5GUkFHUykKKyAgICAgICAgKi8KKworCisJaWYgKCFidWZmZXItPm51bWZyYWdzKQorCQlidWZmZXItPm51bWZyYWdzID0gKHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2VjICogV0FWRUlOX0RFRkFVTFRCVUZMRU4pIC8gKGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIDEwMDApIC0gMTsKKworCWlmIChidWZmZXItPm51bWZyYWdzIDwgV0FWRUlOX01JTkZSQUdTKQorCQlidWZmZXItPm51bWZyYWdzID0gV0FWRUlOX01JTkZSQUdTOworCisJaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgKiBidWZmZXItPmZyYWdtZW50X3NpemUgPiBXQVZFSU5fTUFYQlVGU0laRSkKKwkJYnVmZmVyLT5udW1mcmFncyA9IFdBVkVJTl9NQVhCVUZTSVpFIC8gYnVmZmVyLT5mcmFnbWVudF9zaXplOworCisJaWYgKGJ1ZmZlci0+bnVtZnJhZ3MgPCBXQVZFSU5fTUlORlJBR1MpCisJCUJVRygpOworCisJYnVmc2l6ZSA9IGJ1ZmZlci0+ZnJhZ21lbnRfc2l6ZSAqIGJ1ZmZlci0+bnVtZnJhZ3M7CisKKwkvKiB0aGUgYnVmZmVyIHNpemUgZm9yIHJlY29yZGluZyBpcyByZXN0cmljdGVkIHRvIGNlcnRhaW4gdmFsdWVzLCBhZGp1c3QgaXQgbm93ICovCisJaWYgKGJ1ZnNpemUgPj0gMHgxMDAwMCkgeworCQlidWZmZXItPnNpemUgPSAweDEwMDAwOworCQlidWZmZXItPnNpemVyZWd2YWwgPSAweDFmOworCX0gZWxzZSB7CisJCWJ1ZmZlci0+c2l6ZSA9IDA7CisJCXNpemVbMF0gPSAzODQ7CisJCXNpemVbMV0gPSA0NDg7CisJCXNpemVbMl0gPSA1MTI7CisJCXNpemVbM10gPSA2NDA7CisKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJCWZvciAoaiA9IDA7IGogPCA0OyBqKyspCisJCQkJaWYgKGJ1ZnNpemUgPj0gc2l6ZVtqXSkgeworCQkJCQlidWZmZXItPnNpemUgPSBzaXplW2pdOworCQkJCQlzaXplW2pdICo9IDI7CisJCQkJCWJ1ZmZlci0+c2l6ZXJlZ3ZhbCA9IGkgKiA0ICsgaiArIDE7CisJCQkJfSBlbHNlCisJCQkJCWdvdG8gZXhpdGxvb3A7CisJICAgICAgZXhpdGxvb3A6CisJCWlmIChidWZmZXItPnNpemUgPT0gMCkgeworCQkJYnVmZmVyLT5zaXplID0gMzg0OworCQkJYnVmZmVyLT5zaXplcmVndmFsID0gMHgwMTsKKwkJfQorCX0KKworCS8qIGFkanVzdCB0aGUgZnJhZ21lbnQgc2l6ZSBzbyB0aGF0IGJ1ZmZlciBzaXplIGlzIGFuIGludGVnZXIgbXVsdGlwbGUgKi8KKwl3aGlsZSAoYnVmZmVyLT5zaXplICUgYnVmZmVyLT5mcmFnbWVudF9zaXplKQorCQlidWZmZXItPmZyYWdtZW50X3NpemUgPj49IDE7CisKKwlidWZmZXItPm51bWZyYWdzID0gYnVmZmVyLT5zaXplIC8gYnVmZmVyLT5mcmFnbWVudF9zaXplOworCWJ1ZmZlci0+cGFnZXMgPSAgYnVmZmVyLT5zaXplIC8gUEFHRV9TSVpFICsgKChidWZmZXItPnNpemUgJSBQQUdFX1NJWkUpID8gMSA6IDApOworCisJRFBEKDIsICIgY2FsY3VsYXRlZCByZWNvcmRpbmcgZnJhZ21lbnRfc2l6ZSAtPiAlZFxuIiwgYnVmZmVyLT5mcmFnbWVudF9zaXplKTsKKwlEUEQoMiwgIiBjYWxjdWxhdGVkIHJlY29yZGluZyBudW1mcmFncyAtPiAlZFxuIiwgYnVmZmVyLT5udW1mcmFncyk7CisJRFBEKDIsICIgYnVmZmVyIHNpemUgcmVnaXN0ZXIgLT4gJSMwNHhcbiIsIGJ1ZmZlci0+c2l6ZXJlZ3ZhbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGVtdTEwazFfd2F2ZWluX2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSkKK3sKKwlzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldiA9IChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopIHJlZmRhdGE7CisJc3RydWN0IHdpaW5zdCAqd2lpbnN0ID0gd2F2ZV9kZXYtPndpaW5zdDsKKwl1MzIgYnl0ZXN0b2NvcHk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghd2lpbnN0KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2lpbnN0LT5sb2NrLCBmbGFncyk7CisKKwlpZiAoISh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCWVtdTEwazFfd2F2ZWluX3VwZGF0ZSh3YXZlX2Rldi0+Y2FyZCwgd2lpbnN0KTsKKwllbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZSh3aWluc3QsICZieXRlc3RvY29weSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCWlmIChieXRlc3RvY29weSA+PSB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSB7CisJIAlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmd2lpbnN0LT53YWl0X3F1ZXVlKSkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmd2lpbnN0LT53YWl0X3F1ZXVlKTsKKwl9IGVsc2UKKwkJRFBEKDMsICJOb3QgZW5vdWdoIHRyYW5zZmVyIHNpemUsICVkXG4iLCBieXRlc3RvY29weSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGVtdTEwazFfd2F2ZW91dF9iaCh1bnNpZ25lZCBsb25nIHJlZmRhdGEpCit7CisJc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSByZWZkYXRhOworCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7CisJdTMyIGJ5dGVzdG9jb3B5OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIXdvaW5zdCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCEod29pbnN0LT5zdGF0ZSAmIFdBVkVfU1RBVEVfU1RBUlRFRCkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwllbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHdvaW5zdCk7CisJZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHdvaW5zdCwgJmJ5dGVzdG9jb3B5KTsKKworCWlmICh3b2luc3QtPmJ1ZmZlci5maWxsX3NpbGVuY2UpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJCWVtdTEwazFfd2F2ZW91dF9maWxsc2lsZW5jZSh3b2luc3QpOworCX0gZWxzZQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCWlmIChieXRlc3RvY29weSA+PSB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSB7CisJCWlmICh3YWl0cXVldWVfYWN0aXZlKCZ3b2luc3QtPndhaXRfcXVldWUpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ3b2luc3QtPndhaXRfcXVldWUpOworCX0gZWxzZQorCQlEUEQoMywgIk5vdCBlbm91Z2ggdHJhbnNmZXIgc2l6ZSAtPiAlZFxuIiwgYnl0ZXN0b2NvcHkpOworCisJcmV0dXJuOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gZW11MTBrMV9hdWRpb19yZWFkLAorCS53cml0ZQkJPSBlbXUxMGsxX2F1ZGlvX3dyaXRlLAorCS5wb2xsCQk9IGVtdTEwazFfYXVkaW9fcG9sbCwKKwkuaW9jdGwJCT0gZW11MTBrMV9hdWRpb19pb2N0bCwKKwkubW1hcAkJPSBlbXUxMGsxX2F1ZGlvX21tYXAsCisJLm9wZW4JCT0gZW11MTBrMV9hdWRpb19vcGVuLAorCS5yZWxlYXNlCT0gZW11MTBrMV9hdWRpb19yZWxlYXNlLAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2F1ZGlvLmggYi9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZWU4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9hdWRpby5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIGF1ZGlvLmMgLS0gL2Rldi9kc3AgaW50ZXJmYWNlIGZvciBlbXUxMGsxIGRyaXZlcgorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICogICAgIE5vdmVtYmVyIDIsIDE5OTkJICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwIHR5cGVzL2xlYWtzCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9BVURJT19ICisjZGVmaW5lIF9BVURJT19ICisKK3N0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UKK3sKKyAgICAgICAgc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKKyAgICAgICAgc3RydWN0IHdpaW5zdCAqd2lpbnN0OworICAgICAgICBzdHJ1Y3Qgd29pbnN0ICp3b2luc3Q7CisgICAgICAgIHUxNiBlbmFibGViaXRzOworfTsKKworI2VuZGlmIC8qIF9BVURJT19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDU4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuYwpAQCAtMCwwICsxLDgzMiBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgc2JsaXZlX21pLmMgLSBNSURJIFVBUlQgaW5wdXQgSEFMIGZvciBlbXUxMGsxIGRyaXZlcgorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294ICAgICAgICBjbGVhbiB1cAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9qaWZmaWVzLmg+CisKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgIjgwMTAuaCIKKyNpbmNsdWRlICJjYXJkbWkuaCIKKyNpbmNsdWRlICJpcnFtZ3IuaCIKKworCitzdGF0aWMgaW50IGVtdTEwazFfbXB1aW5fY2FsbGJhY2soc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHUzMiBtc2csIHVuc2lnbmVkIGxvbmcgZGF0YSwgdTMyIGJ5dGVzdmFsaWQpOworCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlSW5pdChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqKTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVFbnRyeShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7CitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlUGFyc2Uoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUzQnl0ZUtleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7CitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlM0J5dGVWZWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKiwgdTgpOworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTJCeXRlKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGUyQnl0ZUtleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7CitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMihzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7CitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMktleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7CitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMyhzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7CitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM0tleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7CitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM1ZlbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqLCB1OCk7CitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzRXhOb3JtKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNSZWFsKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKKworCitzdGF0aWMgc3RydWN0IHsKKwlpbnQgKCpGbikgKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHU4KTsKK30gbWlkaXN0YXRlZm5bXSA9IHsKKworCXsKKwlzYmxpdmVfbWlTdGF0ZVBhcnNlfSwgeworCXNibGl2ZV9taVN0YXRlM0J5dGV9LAkvKiAweDhuLCAweDluLCAweEFuLCAweEJuLCAweEVuICovCisJeworCXNibGl2ZV9taVN0YXRlM0J5dGVLZXl9LAkvKiBCeXRlIDEgICAgICAgICAgICAgICAgICAgICAgICovCisJeworCXNibGl2ZV9taVN0YXRlM0J5dGVWZWx9LAkvKiBCeXRlIDIgICAgICAgICAgICAgICAgICAgICAgICovCisJeworCXNibGl2ZV9taVN0YXRlMkJ5dGV9LAkvKiAweENuLCAweERuICAgICAgICAgICAgICAgICAgICovCisJeworCXNibGl2ZV9taVN0YXRlMkJ5dGVLZXl9LAkvKiBCeXRlIDEgICAgICAgICAgICAgICAgICAgICAgICovCisJeworCXNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMn0sCS8qIDB4RjEgLCAweEYzICAgICAgICAgICAgICAgICAgKi8KKwl7CisJc2JsaXZlX21pU3RhdGVTeXNDb21tb24yS2V5fSwJLyogMHhGMSAsIDB4RjMsIEJ5dGUgMSAgICAgICAgICAqLworCXsKKwlzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjN9LAkvKiAweEYyICAgICAgICAgICAgICAgICAgICAgICAgICovCisJeworCXNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM0tleX0sCS8qIDB4RjIgLCBCeXRlIDEgICAgICAgICAgICAgICAgKi8KKwl7CisJc2JsaXZlX21pU3RhdGVTeXNDb21tb24zVmVsfSwJLyogMHhGMiAsIEJ5dGUgMiAgICAgICAgICAgICAgICAqLworCXsKKwlzYmxpdmVfbWlTdGF0ZVN5c0V4Tm9ybX0sCS8qIDB4RjAsIDB4RjcsIE5vcm1hbCBtb2RlICAgICAgKi8KKwl7CisJc2JsaXZlX21pU3RhdGVTeXNSZWFsfQkvKiAweEY0IC0gMHhGNiAsMHhGOCAtIDB4RkYgICAgICovCit9OworCisKKy8qIEluc3RhbGxzIHRoZSBJUlEgaGFuZGxlciBmb3IgdGhlIE1QVSBpbiBwb3J0ICAgICAgICAgICAgICAgICAqLworCisvKiBhbmQgaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IGVtdTEwazFfbXB1aW5fb3BlbihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgbWlkaV9vcGVuaW5mbyAqb3BlbmluZm8pCit7CisJc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKKworCURQRigyLCAiZW11MTBrMV9tcHVpbl9vcGVuXG4iKTsKKworCWlmICghKGNhcmRfbXB1aW4tPnN0YXR1cyAmIEZMQUdTX0FWQUlMQUJMRSkpCisJCXJldHVybiAtMTsKKworCS8qIENvcHkgb3BlbiBpbmZvIGFuZCBtYXJrIGNoYW5uZWwgYXMgaW4gdXNlICovCisJY2FyZF9tcHVpbi0+b3BlbmluZm8gPSAqb3BlbmluZm87CisJY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19BVkFJTEFCTEU7CS8qIGNsZWFyICovCisJY2FyZF9tcHVpbi0+c3RhdHVzIHw9IEZMQUdTX1JFQURZOwkvKiBzZXQgKi8KKwljYXJkX21wdWluLT5zdGF0dXMgJj0gfkZMQUdTX01JRE1fU1RBUlRFRDsJLyogY2xlYXIgKi8KKwljYXJkX21wdWluLT5maXJzdG1pZGlxID0gTlVMTDsKKwljYXJkX21wdWluLT5sYXN0bWlkaXEgPSBOVUxMOworCWNhcmRfbXB1aW4tPnFoZWFkID0gMDsKKwljYXJkX21wdWluLT5xdGFpbCA9IDA7CisKKwlzYmxpdmVfbWlTdGF0ZUluaXQoY2FyZF9tcHVpbik7CisKKwllbXUxMGsxX21wdV9yZXNldChjYXJkKTsKKwllbXUxMGsxX21wdV9hY3F1aXJlKGNhcmQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbXUxMGsxX21wdWluX2Nsb3NlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKKworCURQRigyLCAiZW11MTBrMV9tcHVpbl9jbG9zZSgpXG4iKTsKKworCS8qIENoZWNrIGlmIHRoZXJlIGFyZSBwZW5kaW5nIGlucHV0IFN5c0V4IGJ1ZmZlcnMgKi8KKwlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSAhPSBOVUxMKSB7CisJCUVSUk9SKCk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBEaXNhYmxlIFJYIGludGVycnVwdCAqLworCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElSWEVOQUJMRSA6IElOVEVfTUlESVJYRU5BQkxFKTsKKworCWVtdTEwazFfbXB1X3JlbGVhc2UoY2FyZCk7CisKKwljYXJkX21wdWluLT5zdGF0dXMgfD0gRkxBR1NfQVZBSUxBQkxFOwkvKiBzZXQgKi8KKwljYXJkX21wdWluLT5zdGF0dXMgJj0gfkZMQUdTX01JRE1fU1RBUlRFRDsJLyogY2xlYXIgKi8KKworCXJldHVybiAwOworfQorCisvKiBBZGRzIE1JREkgYnVmZmVyIHRvIGxvY2FsIHF1ZXVlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IGVtdTEwazFfbXB1aW5fYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgc3RydWN0IG1pZGlfaGRyICptaWRpaGRyKQoreworCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBGKDIsICJlbXUxMGsxX21wdWluX2FkZF9idWZmZXIoKVxuIik7CisKKwkvKiBVcGRhdGUgTUlESSBidWZmZXIgZmxhZ3MgKi8KKwltaWRpaGRyLT5mbGFncyB8PSBNSURJQlVGX0lOUVVFVUU7CS8qIHNldCAqLworCW1pZGloZHItPmZsYWdzICY9IH5NSURJQlVGX0RPTkU7CS8qIGNsZWFyICovCisKKwlpZiAoKG1pZGlxID0gKHN0cnVjdCBtaWRpX3F1ZXVlICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX3F1ZXVlKSwgR0ZQX0FUT01JQykpID09IE5VTEwpIHsKKwkJLyogTWVzc2FnZSBsb3N0ICovCisJCXJldHVybiAtMTsKKwl9CisKKwltaWRpcS0+bmV4dCA9IE5VTEw7CisJbWlkaXEtPnF0eXBlID0gMTsKKwltaWRpcS0+bGVuZ3RoID0gbWlkaWhkci0+YnVmZmVybGVuZ3RoOworCW1pZGlxLT5zaXplTGVmdCA9IG1pZGloZHItPmJ1ZmZlcmxlbmd0aDsKKwltaWRpcS0+bWlkaWJ5dGUgPSBtaWRpaGRyLT5kYXRhOworCW1pZGlxLT5yZWZkYXRhID0gKHVuc2lnbmVkIGxvbmcpIG1pZGloZHI7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPT0gTlVMTCkgeworCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXE7CisJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IG1pZGlxOworCX0gZWxzZSB7CisJCShjYXJkX21wdWluLT5sYXN0bWlkaXEpLT5uZXh0ID0gbWlkaXE7CisJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IG1pZGlxOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKiBGaXJzdCBzZXQgdGhlIFRpbWUgU3RhbXAgaWYgTUlESSBJTiBoYXMgbm90IHN0YXJ0ZWQuICAgICAgICAgKi8KKworLyogVGhlbiBlbmFibGUgUlggSXJxLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKK2ludCBlbXUxMGsxX21wdWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKKwl1OCBkdW1teTsKKworCURQRigyLCAiZW11MTBrMV9tcHVpbl9zdGFydCgpXG4iKTsKKworCS8qIFNldCB0aW1lc3RhbXAgaWYgbm90IHNldCAqLworCWlmIChjYXJkX21wdWluLT5zdGF0dXMgJiBGTEFHU19NSURNX1NUQVJURUQpIHsKKwkJRFBGKDIsICJUaW1lIFN0YW1wIG5vdCBjaGFuZ2VkXG4iKTsKKwl9IGVsc2UgeworCQl3aGlsZSAoIWVtdTEwazFfbXB1X3JlYWRfZGF0YShjYXJkLCAmZHVtbXkpKTsKKworCQljYXJkX21wdWluLT5zdGF0dXMgfD0gRkxBR1NfTUlETV9TVEFSVEVEOwkvKiBzZXQgKi8KKworCQkvKiBTZXQgbmV3IHRpbWUgc3RhbXAgKi8KKwkJY2FyZF9tcHVpbi0+dGltZXN0YXJ0ID0gKGppZmZpZXMgKiAxMDAwKSAvIEhaOworCQlEUEQoMiwgIk5ldyBUaW1lIFN0YW1wID0gJWRcbiIsIGNhcmRfbXB1aW4tPnRpbWVzdGFydCk7CisKKwkJY2FyZF9tcHVpbi0+cWhlYWQgPSAwOworCQljYXJkX21wdWluLT5xdGFpbCA9IDA7CisKKwkJZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJUlhFTkFCTEUgOiBJTlRFX01JRElSWEVOQUJMRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIERpc2FibGUgdGhlIFJYIElycS4gIElmIGEgcGFydGlhbCByZWNvcmRlZCBidWZmZXIgICAgICAgICAgICAqLworCisvKiBleGlzdCwgc2VuZCBpdCB1cCB0byBJTUlESSBsZXZlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IGVtdTEwazFfbXB1aW5fc3RvcChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47CisJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwgImVtdTEwazFfbXB1aW5fc3RvcCgpXG4iKTsKKworCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElSWEVOQUJMRSA6IElOVEVfTUlESVJYRU5BQkxFKTsKKworCWNhcmRfbXB1aW4tPnN0YXR1cyAmPSB+RkxBR1NfTUlETV9TVEFSVEVEOwkvKiBjbGVhciAqLworCisJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKKworCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7CisJCWlmIChtaWRpcSAhPSBOVUxMKSB7CisJCQlpZiAobWlkaXEtPnNpemVMZWZ0ID09IG1pZGlxLT5sZW5ndGgpCisJCQkJbWlkaXEgPSBOVUxMOworCQkJZWxzZSB7CisJCQkJY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OworCQkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpCisJCQkJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7CisJCQl9CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKG1pZGlxKSB7CisJCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdFUlJPUiwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKKwkJCWtmcmVlKG1pZGlxKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBEaXNhYmxlIHRoZSBSWCBJcnEuICBJZiBhbnkgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworLyogZXhpc3QsIHNlbmQgaXQgdXAgdG8gSU1JREkgbGV2ZWwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCitpbnQgZW11MTBrMV9tcHVpbl9yZXNldChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluID0gY2FyZC0+bXB1aW47CisJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCisJRFBGKDIsICJlbXUxMGsxX21wdWluX3Jlc2V0KClcbiIpOworCisJZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBjYXJkLT5pc19hdWRpZ3kgPyBBX0lOVEVfTUlESVJYRU5BQkxFIDogSU5URV9NSURJUlhFTkFCTEUpOworCisJd2hpbGUgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKKwkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOworCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7CisKKwkJaWYgKG1pZGlxLT5zaXplTGVmdCA9PSBtaWRpcS0+bGVuZ3RoKQorCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HREFUQSwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKKwkJZWxzZQorCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HRVJST1IsICh1bnNpZ25lZCBsb25nKSBtaWRpcSwgMCk7CisKKwkJa2ZyZWUobWlkaXEpOworCX0KKworCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7CisJY2FyZF9tcHVpbi0+c3RhdHVzICY9IH5GTEFHU19NSURNX1NUQVJURUQ7CisKKwlyZXR1cm4gMDsKK30KKworLyogUGFzc2VzIHRoZSBtZXNzYWdlIHdpdGggdGhlIGRhdGEgYmFjayB0byB0aGUgY2xpZW50ICAgICAgICAgICovCisKKy8qIHZpYSBJUlEgJiBEUEMgY2FsbGJhY2tzIHRvIFJpbmcgMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RhdGljIGludCBlbXUxMGsxX21wdWluX2NhbGxiYWNrKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1MzIgbXNnLCB1bnNpZ25lZCBsb25nIGRhdGEsIHUzMiBieXRlc3ZhbGlkKQoreworCXVuc2lnbmVkIGxvbmcgdGltZWluOworCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKKwl1bnNpZ25lZCBsb25nIGNhbGxiYWNrX21zZ1szXTsKKwlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7CisKKwkvKiBDYWxsZWQgZHVyaW5nIElTUi4gVGhlIGRhdGEgJiBjb2RlIHRvdWNoZWQgYXJlOgorCSAqIDEuIGNhcmRfbXB1aW4KKwkgKiAyLiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCisJICovCisKKwl0aW1laW4gPSBjYXJkX21wdWluLT50aW1laW47CisJaWYgKGNhcmRfbXB1aW4tPnRpbWVzdGFydCA8PSB0aW1laW4pCisJCWNhbGxiYWNrX21zZ1swXSA9IHRpbWVpbiAtIGNhcmRfbXB1aW4tPnRpbWVzdGFydDsKKwllbHNlCisJCWNhbGxiYWNrX21zZ1swXSA9ICh+MHgwTCAtIGNhcmRfbXB1aW4tPnRpbWVzdGFydCkgKyB0aW1laW47CisKKwlpZiAobXNnID09IElDQVJETUlESV9JTkRBVEEgfHwgbXNnID09IElDQVJETUlESV9JTkRBVEFFUlJPUikgeworCQljYWxsYmFja19tc2dbMV0gPSBkYXRhOworCQljYWxsYmFja19tc2dbMl0gPSBieXRlc3ZhbGlkOworCQlEUEQoMiwgImVtdTEwazFfbXB1aW5fY2FsbGJhY2s6IG1pZGltc2cgPSAlI2x4XG4iLCBkYXRhKTsKKwl9IGVsc2UgeworCQltaWRpcSA9IChzdHJ1Y3QgbWlkaV9xdWV1ZSAqKSBkYXRhOworCQltaWRpaGRyID0gKHN0cnVjdCBtaWRpX2hkciAqKSBtaWRpcS0+cmVmZGF0YTsKKworCQljYWxsYmFja19tc2dbMV0gPSBtaWRpcS0+bGVuZ3RoIC0gbWlkaXEtPnNpemVMZWZ0OworCQljYWxsYmFja19tc2dbMl0gPSBtaWRpcS0+cmVmZGF0YTsKKwkJbWlkaWhkci0+ZmxhZ3MgJj0gfk1JRElCVUZfSU5RVUVVRTsKKwkJbWlkaWhkci0+ZmxhZ3MgfD0gTUlESUJVRl9ET05FOworCisJCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSBtaWRpcS0+bGVuZ3RoIC0gbWlkaXEtPnNpemVMZWZ0OworCX0KKworCS8qIE5vdGlmeSBjbGllbnQgdGhhdCBTeXNleCBidWZmZXIgaGFzIGJlZW4gc2VudCAqLworCWVtdTEwazFfbWlkaV9jYWxsYmFjayhtc2csIGNhcmRfbXB1aW4tPm9wZW5pbmZvLnJlZmRhdGEsIGNhbGxiYWNrX21zZyk7CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbXUxMGsxX21wdWluX2JoKHVuc2lnbmVkIGxvbmcgcmVmZGF0YSkKK3sKKwl1OCBkYXRhOworCXVuc2lnbmVkIGlkeDsKKwlzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiA9IChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqKSByZWZkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3aGlsZSAoY2FyZF9tcHVpbi0+cWhlYWQgIT0gY2FyZF9tcHVpbi0+cXRhaWwpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKKwkJaWR4ID0gY2FyZF9tcHVpbi0+cWhlYWQ7CisJCWRhdGEgPSBjYXJkX21wdWluLT5taWRpcVtpZHhdLmRhdGE7CisJCWNhcmRfbXB1aW4tPnRpbWVpbiA9IGNhcmRfbXB1aW4tPm1pZGlxW2lkeF0udGltZWluOworCQlpZHggPSAoaWR4ICsgMSkgJSBNSURJSU5fTUFYX0JVRkZFUl9TSVpFOworCQljYXJkX21wdWluLT5xaGVhZCA9IGlkeDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOworCisJCXNibGl2ZV9taVN0YXRlRW50cnkoY2FyZF9tcHVpbiwgZGF0YSk7CisJfQorCisJcmV0dXJuOworfQorCisvKiBJUlEgY2FsbGJhY2sgaGFuZGxlciByb3V0aW5lIGZvciB0aGUgTVBVIGluIHBvcnQgKi8KKworaW50IGVtdTEwazFfbXB1aW5faXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGlkeDsKKwl1bnNpZ25lZCBjb3VudDsKKwl1OCBNUFVJdmFsdWU7CisJc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4gPSBjYXJkLT5tcHVpbjsKKworCS8qIElSUSBzZXJ2aWNlIHJvdXRpbmUuIFRoZSBkYXRhIGFuZCBjb2RlIHRvdWNoZWQgYXJlOgorCSAqIDEuIGNhcmRfbXB1aW4KKwkgKi8KKworCWNvdW50ID0gMDsKKwlpZHggPSBjYXJkX21wdWluLT5xdGFpbDsKKworCXdoaWxlICgxKSB7CisJCWlmIChlbXUxMGsxX21wdV9yZWFkX2RhdGEoY2FyZCwgJk1QVUl2YWx1ZSkgPCAwKSB7CisJCQlicmVhazsKKwkJfSBlbHNlIHsKKwkJCSsrY291bnQ7CisJCQljYXJkX21wdWluLT5taWRpcVtpZHhdLmRhdGEgPSBNUFVJdmFsdWU7CisJCQljYXJkX21wdWluLT5taWRpcVtpZHhdLnRpbWVpbiA9IChqaWZmaWVzICogMTAwMCkgLyBIWjsKKwkJCWlkeCA9IChpZHggKyAxKSAlIE1JRElJTl9NQVhfQlVGRkVSX1NJWkU7CisJCX0KKwl9CisKKwlpZiAoY291bnQpIHsKKwkJY2FyZF9tcHVpbi0+cXRhaWwgPSBpZHg7CisKKwkJdGFza2xldF9oaV9zY2hlZHVsZSgmY2FyZF9tcHVpbi0+dGFza2xldCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogICBTdXBwb3J0aW5nIGZ1bmN0aW9ucyBmb3IgTWlkaS1JbiBJbnRlcnByZXRhdGlvbiBTdGF0ZSBNYWNoaW5lICAgICAgICAgICAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIG1hY3JvICovCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlSW5pdChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbikKK3sKKwljYXJkX21wdWluLT5zdGF0dXMgPSAwOwkvKiBGb3IgTUlESSBydW5uaW5nIHN0YXR1cyAqLworCWNhcmRfbXB1aW4tPmZzdGF0dXMgPSAwOwkvKiBGb3IgMHhGbiBzdGF0dXMgb25seSAqLworCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl9QQVJTRTsKKwljYXJkX21wdWluLT5sYXN0c3RhdGUgPSBTVElOX1BBUlNFOworCWNhcmRfbXB1aW4tPmRhdGEgPSAwOworCWNhcmRfbXB1aW4tPnRpbWVzdGFydCA9IDA7CisJY2FyZF9tcHVpbi0+dGltZWluID0gMDsKKworCXJldHVybiAwOworfQorCisvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtYWNybyAqLworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZUVudHJ5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQoreworCXJldHVybiBtaWRpc3RhdGVmbltjYXJkX21wdWluLT5jdXJzdGF0ZV0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVQYXJzZShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKK3sKKwlzd2l0Y2ggKGRhdGEgJiAweGYwKSB7CisJY2FzZSAweDgwOgorCWNhc2UgMHg5MDoKKwljYXNlIDB4QTA6CisJY2FzZSAweEIwOgorCWNhc2UgMHhFMDoKKwkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzNCWVRFOworCQlicmVhazsKKworCWNhc2UgMHhDMDoKKwljYXNlIDB4RDA6CisJCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8yQllURTsKKwkJYnJlYWs7CisKKwljYXNlIDB4RjA6CisJCS8qIFN5c3RlbSBtZXNzYWdlcyBkbyBub3QgYWZmZWN0IHRoZSBwcmV2aW91cyBydW5uaW5nIHN0YXR1cyEgKi8KKwkJc3dpdGNoIChkYXRhICYgMHgwZikgeworCQljYXNlIDB4MDoKKwkJCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IGNhcmRfbXB1aW4tPmN1cnN0YXRlOworCQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19FWF9OT1JNOworCisJCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgeworCQkJCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKKworCQkJCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKKwkJCQkqbWlkaXEtPm1pZGlieXRlID0gZGF0YTsKKwkJCQktLW1pZGlxLT5zaXplTGVmdDsKKwkJCQkrK21pZGlxLT5taWRpYnl0ZTsKKwkJCX0KKworCQkJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKKworCQljYXNlIDB4NzoKKwkJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCAweGY3LCAwKTsKKwkJCXJldHVybiAtMTsKKworCQljYXNlIDB4MjoKKwkJCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IGNhcmRfbXB1aW4tPmN1cnN0YXRlOworCQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fMzsKKwkJCWJyZWFrOworCisJCWNhc2UgMHgxOgorCQljYXNlIDB4MzoKKwkJCWNhcmRfbXB1aW4tPmxhc3RzdGF0ZSA9IGNhcmRfbXB1aW4tPmN1cnN0YXRlOworCQkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fMjsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQkvKiBpbmNsdWRlcyAweEY0IC0gMHhGNiwgMHhGOCAtIDB4RkYgKi8KKwkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKKwkJfQorCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFBGKDIsICJCVUc6IGRlZmF1bHQgY2FzZSBoaXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIG1pZGlzdGF0ZWZuW2NhcmRfbXB1aW4tPmN1cnN0YXRlXS5GbihjYXJkX21wdWluLCBkYXRhKTsKK30KKworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQoreworCXU4IHRlbXAgPSBkYXRhICYgMHhmMDsKKworCWlmICh0ZW1wIDwgMHg4MCkgeworCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl8zQllURV9LRVldLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworCX0gZWxzZSBpZiAodGVtcCA8PSAweGUwICYmIHRlbXAgIT0gMHhjMCAmJiB0ZW1wICE9IDB4ZDApIHsKKwkJY2FyZF9tcHVpbi0+c3RhdHVzID0gZGF0YTsKKwkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOXzNCWVRFX0tFWTsKKworCQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOworCX0KKworCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1BBUlNFXS5GbihjYXJkX21wdWluLCBkYXRhKTsKK30KKworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQorLyogYnl0ZSAxICovCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlpZiAoZGF0YSA+IDB4N2YpIHsKKwkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCisJCWlmIChkYXRhID4gMHhmNykKKwkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKKworCQkvKiBJbnZhbGlkIGRhdGEhICovCisJCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7CisKKwkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1BBUlNFOworCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcpIGRhdGEpIDw8IDg7CisJCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+c3RhdHVzOworCisJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOworCisJCXJldHVybiAtMTsKKwl9CisKKwljYXJkX21wdWluLT5kYXRhID0gZGF0YTsKKwljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fM0JZVEVfVkVMOworCisJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKK30KKworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTNCeXRlVmVsKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQorLyogYnl0ZSAyICovCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlpZiAoZGF0YSA+IDB4N2YpIHsKKwkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCisJCWlmIChkYXRhID4gMHhmNykKKwkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKKworCQkvKiBJbnZhbGlkIGRhdGEhICovCisJCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7CisKKwkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1BBUlNFOworCQl0bXAgPSAoKHVuc2lnbmVkIGxvbmcpIGRhdGEpIDw8IDg7CisJCXRtcCB8PSBjYXJkX21wdWluLT5kYXRhOworCQl0bXAgPSB0bXAgPDwgODsKKwkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7CisKKwkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8zQllURTsKKwl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKKwl0bXAgPSB0bXAgPDwgODsKKwl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmRhdGE7CisJdG1wID0gdG1wIDw8IDg7CisJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7CisKKwllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEEsIHRtcCwgMyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZTJCeXRlKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQoreworCXU4IHRlbXAgPSBkYXRhICYgMHhmMDsKKworCWlmICgodGVtcCA9PSAweGMwKSB8fCAodGVtcCA9PSAweGQwKSkgeworCQljYXJkX21wdWluLT5zdGF0dXMgPSBkYXRhOworCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fMkJZVEVfS0VZOworCisJCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7CisJfQorCisJaWYgKHRlbXAgPCAweDgwKQorCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl8yQllURV9LRVldLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworCisJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fUEFSU0VdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlMkJ5dGVLZXkoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCisvKiBieXRlIDEgKi8KK3sKKwl1bnNpZ25lZCBsb25nIHRtcDsKKworCWlmIChkYXRhID4gMHg3ZikgeworCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KKwkJaWYgKGRhdGEgPiAweGY3KQorCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworCisJCS8qIEludmFsaWQgZGF0YSEgKi8KKwkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKKworCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fUEFSU0U7CisJCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOworCQl0bXAgPSB0bXAgPDwgODsKKwkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5zdGF0dXM7CisKKwkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBRVJST1IsIHRtcCwgMCk7CisKKwkJcmV0dXJuIC0xOworCX0KKworCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gU1RJTl8yQllURTsKKwl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKKwl0bXAgPSB0bXAgPDwgODsKKwl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPnN0YXR1czsKKworCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgdG1wLCAyKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uMihzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKK3sKKwljYXJkX21wdWluLT5mc3RhdHVzID0gZGF0YTsKKwljYXJkX21wdWluLT5jdXJzdGF0ZSA9IFNUSU5fU1lTX0NPTU1PTl8yX0tFWTsKKworCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Cit9CisKK3N0YXRpYyBpbnQgc2JsaXZlX21pU3RhdGVTeXNDb21tb24yS2V5KHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQorLyogYnl0ZSAxICovCit7CisJdW5zaWduZWQgbG9uZyB0bXA7CisKKwlpZiAoZGF0YSA+IDB4N2YpIHsKKwkJLyogUmVhbC10aW1lIG1lc3NhZ2VzIGNoZWNrICovCisJCWlmIChkYXRhID4gMHhmNykKKwkJCXJldHVybiBtaWRpc3RhdGVmbltTVElOX1NZU19SRUFMXS5GbihjYXJkX21wdWluLCBkYXRhKTsKKworCQkvKiBJbnZhbGlkIGRhdGEhICovCisJCURQRigyLCAiSW52YWxpZCBkYXRhIVxuIik7CisKKwkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7CisJCXRtcCA9ICh1bnNpZ25lZCBsb25nKSBkYXRhOworCQl0bXAgPSB0bXAgPDwgODsKKwkJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5mc3RhdHVzOworCisJCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQUVSUk9SLCB0bXAsIDApOworCisJCXJldHVybiAtMTsKKwl9CisKKwljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKKwl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKKwl0bXAgPSB0bXAgPDwgODsKKwl0bXAgfD0gKHVuc2lnbmVkIGxvbmcpIGNhcmRfbXB1aW4tPmZzdGF0dXM7CisKKwllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEEsIHRtcCwgMik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c0NvbW1vbjMoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCit7CisJY2FyZF9tcHVpbi0+ZnN0YXR1cyA9IGRhdGE7CisJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fM19LRVk7CisKKwlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM0tleShzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKKy8qIGJ5dGUgMSAqLworeworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJaWYgKGRhdGEgPiAweDdmKSB7CisJCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLworCQlpZiAoZGF0YSA+IDB4ZjcpCisJCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7CisKKwkJLyogSW52YWxpZCBkYXRhISAqLworCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOworCisJCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOworCQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKKwkJdG1wID0gdG1wIDw8IDg7CisJCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKKworCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJY2FyZF9tcHVpbi0+ZGF0YSA9IGRhdGE7CisJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBTVElOX1NZU19DT01NT05fM19WRUw7CisKKwlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzQ29tbW9uM1ZlbChzdHJ1Y3QgZW11MTBrMV9tcHVpbiAqY2FyZF9tcHVpbiwgdTggZGF0YSkKKy8qIGJ5dGUgMiAqLworeworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJaWYgKGRhdGEgPiAweDdmKSB7CisJCS8qIFJlYWwtdGltZSBtZXNzYWdlcyBjaGVjayAqLworCQlpZiAoZGF0YSA+IDB4ZjcpCisJCQlyZXR1cm4gbWlkaXN0YXRlZm5bU1RJTl9TWVNfUkVBTF0uRm4oY2FyZF9tcHVpbiwgZGF0YSk7CisKKwkJLyogSW52YWxpZCBkYXRhISAqLworCQlEUEYoMiwgIkludmFsaWQgZGF0YSFcbiIpOworCisJCWNhcmRfbXB1aW4tPmN1cnN0YXRlID0gY2FyZF9tcHVpbi0+bGFzdHN0YXRlOworCQl0bXAgPSAodW5zaWduZWQgbG9uZykgZGF0YTsKKwkJdG1wID0gdG1wIDw8IDg7CisJCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZGF0YTsKKwkJdG1wID0gdG1wIDw8IDg7CisJCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKKworCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkRBVEFFUlJPUiwgdG1wLCAwKTsKKworCQlyZXR1cm4gLTE7CisJfQorCisJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7CisJdG1wID0gKHVuc2lnbmVkIGxvbmcpIGRhdGE7CisJdG1wID0gdG1wIDw8IDg7CisJdG1wIHw9ICh1bnNpZ25lZCBsb25nKSBjYXJkX21wdWluLT5kYXRhOworCXRtcCA9IHRtcCA8PCA4OworCXRtcCB8PSAodW5zaWduZWQgbG9uZykgY2FyZF9tcHVpbi0+ZnN0YXR1czsKKworCWVtdTEwazFfbXB1aW5fY2FsbGJhY2soY2FyZF9tcHVpbiwgSUNBUkRNSURJX0lOREFUQSwgdG1wLCAzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNibGl2ZV9taVN0YXRlU3lzRXhOb3JtKHN0cnVjdCBlbXUxMGsxX21wdWluICpjYXJkX21wdWluLCB1OCBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoKGRhdGEgPiAweDdmKSAmJiAoZGF0YSAhPSAweGY3KSkgeworCQkvKiBSZWFsLXRpbWUgbWVzc2FnZXMgY2hlY2sgKi8KKwkJaWYgKGRhdGEgPiAweGY3KQorCQkJcmV0dXJuIG1pZGlzdGF0ZWZuW1NUSU5fU1lTX1JFQUxdLkZuKGNhcmRfbXB1aW4sIGRhdGEpOworCisJCS8qIEludmFsaWQgRGF0YSEgKi8KKwkJRFBGKDIsICJJbnZhbGlkIGRhdGEhXG4iKTsKKworCQljYXJkX21wdWluLT5jdXJzdGF0ZSA9IGNhcmRfbXB1aW4tPmxhc3RzdGF0ZTsKKworCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSkgeworCQkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCisJCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7CisJCQkqbWlkaXEtPm1pZGlieXRlID0gZGF0YTsKKwkJCS0tbWlkaXEtPnNpemVMZWZ0OworCQkJKyttaWRpcS0+bWlkaWJ5dGU7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdWluLT5sb2NrLCBmbGFncyk7CisKKwkJCWNhcmRfbXB1aW4tPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKKwkJCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxID09IE5VTEwpCisJCQkJY2FyZF9tcHVpbi0+bGFzdG1pZGlxID0gTlVMTDsKKworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOworCisJCQllbXUxMGsxX21wdWluX2NhbGxiYWNrKGNhcmRfbXB1aW4sIElDQVJETUlESV9JTkxPTkdFUlJPUiwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKKworCQkJa2ZyZWUobWlkaXEpOworCQl9CisKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChjYXJkX21wdWluLT5maXJzdG1pZGlxKSB7CisJCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKKworCQltaWRpcSA9IGNhcmRfbXB1aW4tPmZpcnN0bWlkaXE7CisJCSptaWRpcS0+bWlkaWJ5dGUgPSBkYXRhOworCQktLW1pZGlxLT5zaXplTGVmdDsKKwkJKyttaWRpcS0+bWlkaWJ5dGU7CisJfQorCisJaWYgKGRhdGEgPT0gMHhmNykgeworCQkvKiBFbmQgb2YgU3lzZXggYnVmZmVyICovCisJCS8qIFNlbmQgZG93biB0aGUgYnVmZmVyICovCisKKwkJY2FyZF9tcHVpbi0+Y3Vyc3RhdGUgPSBjYXJkX21wdWluLT5sYXN0c3RhdGU7CisKKwkJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKKwkJCXN0cnVjdCBtaWRpX3F1ZXVlICptaWRpcTsKKworCQkJbWlkaXEgPSBjYXJkX21wdWluLT5maXJzdG1pZGlxOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOworCisJCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7CisJCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9PSBOVUxMKQorCQkJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKKworCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HREFUQSwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKKworCQkJa2ZyZWUobWlkaXEpOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGNhcmRfbXB1aW4tPmZpcnN0bWlkaXEpIHsKKwkJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCisJCW1pZGlxID0gY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcTsKKworCQlpZiAobWlkaXEtPnNpemVMZWZ0ID09IDApIHsKKwkJCS8qIFNwZWNpYWwgY2FzZSAqLworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZF9tcHVpbi0+bG9jaywgZmxhZ3MpOworCisJCQljYXJkX21wdWluLT5maXJzdG1pZGlxID0gbWlkaXEtPm5leHQ7CisJCQlpZiAoY2FyZF9tcHVpbi0+Zmlyc3RtaWRpcSA9PSBOVUxMKQorCQkJCWNhcmRfbXB1aW4tPmxhc3RtaWRpcSA9IE5VTEw7CisKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1aW4tPmxvY2ssIGZsYWdzKTsKKworCQkJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5MT05HREFUQSwgKHVuc2lnbmVkIGxvbmcpIG1pZGlxLCAwKTsKKworCQkJa2ZyZWUobWlkaXEpOworCisJCQlyZXR1cm4gQ1RTVEFUVVNfTkVYVF9CWVRFOworCQl9CisJfQorCisJcmV0dXJuIENUU1RBVFVTX05FWFRfQllURTsKK30KKworc3RhdGljIGludCBzYmxpdmVfbWlTdGF0ZVN5c1JlYWwoc3RydWN0IGVtdTEwazFfbXB1aW4gKmNhcmRfbXB1aW4sIHU4IGRhdGEpCit7CisJZW11MTBrMV9tcHVpbl9jYWxsYmFjayhjYXJkX21wdWluLCBJQ0FSRE1JRElfSU5EQVRBLCBkYXRhLCAxKTsKKworCXJldHVybiBDVFNUQVRVU19ORVhUX0JZVEU7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtaS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMmMyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbWkuaApAQCAtMCwwICsxLDk3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBzYmxpdmVfbWkuaAorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICogICAgIE5vdmVtYmVyIDIsIDE5OTkgICAgIEFsYW4gQ294ICAgICAgICBjbGVhbmVkIHVwCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaWZuZGVmIF9DQVJETUlfSAorI2RlZmluZSBfQ0FSRE1JX0gKKworI2luY2x1ZGUgImljYXJkbWlkLmgiCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKK3R5cGVkZWYgZW51bQoreworCVNUSU5fUEFSU0UgPSAwLAorCVNUSU5fM0JZVEUsICAgICAgICAgICAgICAgICAgICAgLyogMHg4MCwgMHg5MCwgMHhBMCwgMHhCMCwgMHhFMCAqLworCVNUSU5fM0JZVEVfS0VZLCAgICAgICAgICAgICAgICAgLyogQnl0ZSAxICovCisJU1RJTl8zQllURV9WRUwsICAgICAgICAgICAgICAgICAvKiBCeXRlIDEgKi8KKwlTVElOXzJCWVRFLCAgICAgICAgICAgICAgICAgICAgIC8qIDB4QzAsIDB4RDAgKi8KKwlTVElOXzJCWVRFX0tFWSwgICAgICAgICAgICAgICAgIC8qIEJ5dGUgMSAqLworCVNUSU5fU1lTX0NPTU1PTl8yLCAgICAgICAgICAgICAgLyogMHhGMSwgMHhGMyAgKi8KKwlTVElOX1NZU19DT01NT05fMl9LRVksCisJU1RJTl9TWVNfQ09NTU9OXzMsICAgICAgICAgICAgICAvKiAweEYyICovCisJU1RJTl9TWVNfQ09NTU9OXzNfS0VZLAorCVNUSU5fU1lTX0NPTU1PTl8zX1ZFTCwKKwlTVElOX1NZU19FWF9OT1JNLCAgICAgICAgICAgICAgIC8qIDB4RjAsIE5vcm1hbCBtb2RlICovCisJU1RJTl9TWVNfUkVBTAorfSBtaWRpX2luX3N0YXRlOworCisKKy8qIGZsYWdzIGZvciBjYXJkIE1JREkgaW4gb2JqZWN0ICovCisjZGVmaW5lIEZMQUdTX01JRE1fU1RBUlRFRCAgICAgICAgICAweDAwMDAxMDAwICAgICAgLy8gRGF0YSBoYXMgc3RhcnRlZCB0byBjb21lIGluIGFmdGVyIE1pZG0gU3RhcnQKKyNkZWZpbmUgTUlESUlOX01BWF9CVUZGRVJfU0laRSAgICAgIDIwMCAgICAgICAgICAgICAvLyBEZWZpbml0aW9uIGZvciBzdHJ1Y3QgZW11MTBrMV9tcHVpbgorCitzdHJ1Y3QgbWlkaV9kYXRhCit7CisJdTggZGF0YTsKKwl1MzIgdGltZWluOworfTsKKworc3RydWN0IGVtdTEwazFfbXB1aW4KK3sKKwlzcGlubG9ja190ICAgICAgICBsb2NrOworCXN0cnVjdCBtaWRpX3F1ZXVlICpmaXJzdG1pZGlxOworCXN0cnVjdCBtaWRpX3F1ZXVlICpsYXN0bWlkaXE7CisJdW5zaWduZWQgICAgICAgICAgcWhlYWQsIHF0YWlsOworCXN0cnVjdCBtaWRpX2RhdGEgIG1pZGlxW01JRElJTl9NQVhfQlVGRkVSX1NJWkVdOworCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0YXNrbGV0OworCXN0cnVjdCBtaWRpX29wZW5pbmZvICAgIG9wZW5pbmZvOworCisJLyogRm9yIE1JREkgc3RhdGUgbWFjaGluZSAqLworCXU4ICAgICAgICAgICAgICBzdGF0dXM7ICAgICAgICAvKiBGb3IgTUlESSBydW5uaW5nIHN0YXR1cyAqLworCXU4ICAgICAgICAgICAgICBmc3RhdHVzOyAgICAgICAvKiBGb3IgMHhGbiBzdGF0dXMgb25seSAqLworCW1pZGlfaW5fc3RhdGUgICBjdXJzdGF0ZTsKKwltaWRpX2luX3N0YXRlICAgbGFzdHN0YXRlOworCXUzMiAgICAgICAgICAgICB0aW1lc3RhcnQ7CisJdTMyICAgICAgICAgICAgIHRpbWVpbjsKKwl1OCAgICAgICAgICAgICAgZGF0YTsKK307CisKK2ludCBlbXUxMGsxX21wdWluX29wZW4oc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgbWlkaV9vcGVuaW5mbyAqKTsKK2ludCBlbXUxMGsxX21wdWluX2Nsb3NlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7CitpbnQgZW11MTBrMV9tcHVpbl9hZGRfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX21wdWluICosIHN0cnVjdCBtaWRpX2hkciAqKTsKK2ludCBlbXUxMGsxX21wdWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7CitpbnQgZW11MTBrMV9tcHVpbl9zdG9wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7CitpbnQgZW11MTBrMV9tcHVpbl9yZXNldChzdHJ1Y3QgZW11MTBrMV9jYXJkICopOworCitpbnQgZW11MTBrMV9tcHVpbl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Cit2b2lkIGVtdTEwazFfbXB1aW5fYmgodW5zaWduZWQgbG9uZyk7CisKKyNlbmRpZiAgLyogX0NBUkRNSV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uYyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MzhkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkbW8uYwpAQCAtMCwwICsxLDIyOSBAQAorLyogICAgIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBjYXJkbW8uYyAtIE1JREkgVUFSVCBvdXRwdXQgSEFMIGZvciBlbXUxMGsxIGRyaXZlciAKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCisgKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3ggICAgICAgIGNsZWFuZWQgdXAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAorICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKKyAqICAgICBVU0EuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqLworCisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorCisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKyNpbmNsdWRlICI4MDEwLmgiCisjaW5jbHVkZSAiY2FyZG1vLmgiCisjaW5jbHVkZSAiaXJxbWdyLmgiCisKKy8qIEluc3RhbGxzIHRoZSBJUlEgaGFuZGxlciBmb3IgdGhlIE1QVSBvdXQgcG9ydCAgICAgICAgICAgICAgICoKKyAqIGFuZCBpbml0aWFsaXplIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCitpbnQgZW11MTBrMV9tcHVvdXRfb3BlbihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgbWlkaV9vcGVuaW5mbyAqb3BlbmluZm8pCit7CisJc3RydWN0IGVtdTEwazFfbXB1b3V0ICpjYXJkX21wdW91dCA9IGNhcmQtPm1wdW91dDsKKworCURQRigyLCAiZW11MTBrMV9tcHVvdXRfb3BlbigpXG4iKTsKKworCWlmICghKGNhcmRfbXB1b3V0LT5zdGF0dXMgJiBGTEFHU19BVkFJTEFCTEUpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBDb3B5IG9wZW4gaW5mbyBhbmQgbWFyayBjaGFubmVsIGFzIGluIHVzZSAqLworCWNhcmRfbXB1b3V0LT5pbnRyID0gMDsKKwljYXJkX21wdW91dC0+b3BlbmluZm8gPSAqb3BlbmluZm87CisJY2FyZF9tcHVvdXQtPnN0YXR1cyAmPSB+RkxBR1NfQVZBSUxBQkxFOworCWNhcmRfbXB1b3V0LT5sYXN0c3RhdHVzID0gMHg4MDsKKwljYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9IE5VTEw7CisJY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSA9IE5VTEw7CisKKwllbXUxMGsxX21wdV9yZXNldChjYXJkKTsKKwllbXUxMGsxX21wdV9hY3F1aXJlKGNhcmQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbXUxMGsxX21wdW91dF9jbG9zZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXN0cnVjdCBlbXUxMGsxX21wdW91dCAqY2FyZF9tcHVvdXQgPSBjYXJkLT5tcHVvdXQ7CisJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCXN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBGKDIsICJlbXUxMGsxX21wdW91dF9jbG9zZSgpXG4iKTsKKworCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgY2FyZC0+aXNfYXVkaWd5ID8gQV9JTlRFX01JRElUWEVOQUJMRSA6IElOVEVfTUlESVRYRU5BQkxFKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUgKGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxICE9IE5VTEwpIHsKKwkJbWlkaXEgPSBjYXJkX21wdW91dC0+Zmlyc3RtaWRpcTsKKwkJbWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikgbWlkaXEtPnJlZmRhdGE7CisKKwkJY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPSBtaWRpcS0+bmV4dDsKKworCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKKwkJa2ZyZWUobWlkaWhkcik7CisJCWtmcmVlKG1pZGlxKTsKKwl9CisKKwljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gTlVMTDsKKworCWVtdTEwazFfbXB1X3JlbGVhc2UoY2FyZCk7CisKKwljYXJkX21wdW91dC0+c3RhdHVzIHw9IEZMQUdTX0FWQUlMQUJMRTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmRfbXB1b3V0LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogSWYgdGhlcmUgaXNuJ3QgZW5vdWdoIGJ1ZmZlciBzcGFjZSwgcmVqZWN0IE1pZGkgQnVmZmVyLiAgICAgKgorKiBPdGhlcndpc2UsIGRpc2FibGUgVFgsIGNyZWF0ZSBvYmplY3QgdG8gaG9sZCBNaWRpICAgICAgICAgICAgKgorKiAgdWZmZXIsIHVwZGF0ZSBidWZmZXIgZmxhZ3MgYW5kIG90aGVyIHBhcmFtZXRlcnMgICAgICAgICAgICAgKgorKiBiZWZvcmUgZW5hYmxpbmcgVFggYWdhaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworaW50IGVtdTEwazFfbXB1b3V0X2FkZF9idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IG1pZGlfaGRyICptaWRpaGRyKQoreworCXN0cnVjdCBlbXUxMGsxX21wdW91dCAqY2FyZF9tcHVvdXQgPSBjYXJkLT5tcHVvdXQ7CisJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwgImVtdTEwazFfbXB1b3V0X2FkZF9idWZmZXIoKVxuIik7CisKKwlpZiAoY2FyZF9tcHVvdXQtPnN0YXRlID09IENBUkRNSURJT1VUX1NUQVRFX1NVU1BFTkQpCisJCXJldHVybiAwOworCisJbWlkaWhkci0+ZmxhZ3MgfD0gTUlESUJVRl9JTlFVRVVFOworCW1pZGloZHItPmZsYWdzICY9IH5NSURJQlVGX0RPTkU7CisKKwlpZiAoKG1pZGlxID0gKHN0cnVjdCBtaWRpX3F1ZXVlICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX3F1ZXVlKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJLyogTWVzc2FnZSBsb3N0ICovCisJCXJldHVybiAtMTsKKwl9CisKKwltaWRpcS0+bmV4dCA9IE5VTEw7CisJbWlkaXEtPnF0eXBlID0gMTsKKwltaWRpcS0+bGVuZ3RoID0gbWlkaWhkci0+YnVmZmVybGVuZ3RoOworCW1pZGlxLT5zaXplTGVmdCA9IG1pZGloZHItPmJ1ZmZlcmxlbmd0aDsKKwltaWRpcS0+bWlkaWJ5dGUgPSBtaWRpaGRyLT5kYXRhOworCisJbWlkaXEtPnJlZmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWlkaWhkcjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxID09IE5VTEwpIHsKKwkJY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgPSBtaWRpcTsKKwkJY2FyZF9tcHVvdXQtPmxhc3RtaWRpcSA9IG1pZGlxOworCX0gZWxzZSB7CisJCShjYXJkX21wdW91dC0+bGFzdG1pZGlxKS0+bmV4dCA9IG1pZGlxOworCQljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gbWlkaXE7CisJfQorCisJY2FyZF9tcHVvdXQtPmludHIgPSAwOworCisJZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJVFhFTkFCTEUgOiBJTlRFX01JRElUWEVOQUJMRSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW11MTBrMV9tcHVvdXRfYmgodW5zaWduZWQgbG9uZyByZWZkYXRhKQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSAoc3RydWN0IGVtdTEwazFfY2FyZCAqKSByZWZkYXRhOworCXN0cnVjdCBlbXUxMGsxX21wdW91dCAqY2FyZF9tcHVvdXQgPSBjYXJkLT5tcHVvdXQ7CisJaW50IGNCeXRlU2VudCA9IDA7CisJc3RydWN0IG1pZGlfcXVldWUgKm1pZGlxOworCXN0cnVjdCBtaWRpX3F1ZXVlICpkb25lcSA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkX21wdW91dC0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUgKGNhcmRfbXB1b3V0LT5maXJzdG1pZGlxICE9IE5VTEwpIHsKKwkJbWlkaXEgPSBjYXJkX21wdW91dC0+Zmlyc3RtaWRpcTsKKworCQl3aGlsZSAoY0J5dGVTZW50IDwgNCAmJiBtaWRpcS0+c2l6ZUxlZnQpIHsKKwkJCWlmIChlbXUxMGsxX21wdV93cml0ZV9kYXRhKGNhcmQsICptaWRpcS0+bWlkaWJ5dGUpIDwgMCkgeworCQkJCURQRigyLCAiZW11MTBrMV9tcHVvdXREcGNDYWxsYmFjayBlcnJvciEhXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJKytjQnl0ZVNlbnQ7CisJCQkJLS1taWRpcS0+c2l6ZUxlZnQ7CisJCQkJKyttaWRpcS0+bWlkaWJ5dGU7CisJCQl9CisJCX0KKworCQlpZiAobWlkaXEtPnNpemVMZWZ0ID09IDApIHsKKwkJCWlmIChkb25lcSA9PSBOVUxMKQorCQkJCWRvbmVxID0gbWlkaXE7CisJCQljYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9IG1pZGlxLT5uZXh0OworCQl9IGVsc2UKKwkJCWJyZWFrOworCX0KKworCWlmIChjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSA9PSBOVUxMKQorCQljYXJkX21wdW91dC0+bGFzdG1pZGlxID0gTlVMTDsKKworCWlmIChkb25lcSAhPSBOVUxMKSB7CisJCXdoaWxlIChkb25lcSAhPSBjYXJkX21wdW91dC0+Zmlyc3RtaWRpcSkgeworCQkJdW5zaWduZWQgbG9uZyBjYWxsYmFja19tc2dbM107CisKKwkJCW1pZGlxID0gZG9uZXE7CisJCQlkb25lcSA9IG1pZGlxLT5uZXh0OworCisJCQlpZiAobWlkaXEtPnF0eXBlKSB7CisJCQkJY2FsbGJhY2tfbXNnWzBdID0gMDsKKwkJCQljYWxsYmFja19tc2dbMV0gPSBtaWRpcS0+bGVuZ3RoOworCQkJCWNhbGxiYWNrX21zZ1syXSA9IG1pZGlxLT5yZWZkYXRhOworCisJCQkJZW11MTBrMV9taWRpX2NhbGxiYWNrKElDQVJETUlESV9PVVRMT05HREFUQSwgY2FyZF9tcHVvdXQtPm9wZW5pbmZvLnJlZmRhdGEsIGNhbGxiYWNrX21zZyk7CisJCQl9IGVsc2UgaWYgKCgodTgpIG1pZGlxLT5yZWZkYXRhKSA8IDB4RjAgJiYgKCh1OCkgbWlkaXEtPnJlZmRhdGEpID4gMHg3RikKKwkJCQljYXJkX21wdW91dC0+bGFzdHN0YXR1cyA9ICh1OCkgbWlkaXEtPnJlZmRhdGE7CisKKwkJCWtmcmVlKG1pZGlxKTsKKwkJfQorCX0KKworCWlmICgoY2FyZF9tcHVvdXQtPmZpcnN0bWlkaXEgIT0gTlVMTCkgfHwgY0J5dGVTZW50KSB7CisJCWNhcmRfbXB1b3V0LT5pbnRyID0gMDsKKwkJZW11MTBrMV9pcnFfZW5hYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJVFhFTkFCTEUgOiBJTlRFX01JRElUWEVOQUJMRSk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZF9tcHVvdXQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybjsKK30KKworaW50IGVtdTEwazFfbXB1b3V0X2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQgKmNhcmRfbXB1b3V0ID0gY2FyZC0+bXB1b3V0OworCisJRFBGKDQsICJlbXUxMGsxX21wdW91dF9pcnFoYW5kbGVyXG4iKTsKKworCWNhcmRfbXB1b3V0LT5pbnRyID0gMTsKKwllbXUxMGsxX2lycV9kaXNhYmxlKGNhcmQsIGNhcmQtPmlzX2F1ZGlneSA/IEFfSU5URV9NSURJVFhFTkFCTEUgOiBJTlRFX01JRElUWEVOQUJMRSk7CisKKwl0YXNrbGV0X2hpX3NjaGVkdWxlKCZjYXJkX21wdW91dC0+dGFza2xldCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5oIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZG1vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyNmViMwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmRtby5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIGNhcmRtby5oCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKiAgICAgTm92ZW1iZXIgMiwgMTk5OSAgICAgQWxhbiBDb3gJICAgIGNsZWFuZWQgdXAKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX0NBUkRNT19ICisjZGVmaW5lIF9DQVJETU9fSAorCisjaW5jbHVkZSAiaWNhcmRtaWQuaCIKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKworI2RlZmluZSBDQVJETUlESU9VVF9TVEFURV9ERUZBVUxUICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgQ0FSRE1JRElPVVRfU1RBVEVfU1VTUEVORCAgICAweDAwMDAwMDAxCisKK3N0cnVjdCBlbXUxMGsxX21wdW91dAoreworCXUzMgkJCXN0YXR1czsKKwl1MzIJCQlzdGF0ZTsKKwl2b2xhdGlsZSBpbnQJCWludHI7CisJc3RydWN0IG1pZGlfcXVldWUJKmZpcnN0bWlkaXE7CisJc3RydWN0IG1pZGlfcXVldWUJKmxhc3RtaWRpcTsKKwl1OAkJCWxhc3RzdGF0dXM7CisJc3RydWN0IHRhc2tsZXRfc3RydWN0IAl0YXNrbGV0OworCXNwaW5sb2NrX3QJCWxvY2s7CisJc3RydWN0IG1pZGlfb3BlbmluZm8Jb3BlbmluZm87Cit9OworCitpbnQgZW11MTBrMV9tcHVvdXRfb3BlbihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBtaWRpX29wZW5pbmZvICopOworaW50IGVtdTEwazFfbXB1b3V0X2Nsb3NlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7CitpbnQgZW11MTBrMV9tcHVvdXRfYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBtaWRpX2hkciAqKTsKKworaW50IGVtdTEwazFfbXB1b3V0X2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK3ZvaWQgZW11MTBrMV9tcHVvdXRfYmgodW5zaWduZWQgbG9uZyk7CisKKyNlbmRpZiAgLyogX0NBUkRNT19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuYyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYmY0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuYwpAQCAtMCwwICsxLDM3MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgY2FyZHdpLmMgLSBQQ00gaW5wdXQgSEFMIGZvciBlbXUxMGsxIGRyaXZlcgorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgInRpbWVyLmgiCisjaW5jbHVkZSAicmVjbWdyLmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJjYXJkd2kuaCIKKworLyoqCisgKiBxdWVyeV9mb3JtYXQgLSByZXR1cm5zIGEgdmFsaWQgc291bmQgZm9ybWF0CisgKgorICogVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhIHZhbGlkIHNvdW5kIGZvcm1hdCBhcyBjbG9zZQorICogdG8gdGhlIHJlcXVlc3RlZCBvbmUgYXMgcG9zc2libGUuIAorICovCitzdGF0aWMgdm9pZCBxdWVyeV9mb3JtYXQoaW50IHJlY3NyYywgc3RydWN0IHdhdmVfZm9ybWF0ICp3YXZlX2ZtdCkKK3sKKworCXN3aXRjaCAocmVjc3JjKSB7CisJY2FzZSBXQVZFUkVDT1JEX0FDOTc6CisKKwkJaWYgKCh3YXZlX2ZtdC0+Y2hhbm5lbHMgIT0gMSkgJiYgKHdhdmVfZm10LT5jaGFubmVscyAhPSAyKSkKKwkJCXdhdmVfZm10LT5jaGFubmVscyA9IDI7CisKKwkJaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4QkI4MCArIDB4QUM0NCkgLyAyKQorCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4QkI4MDsKKwkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHhBQzQ0ICsgMHg3RDAwKSAvIDIpCisJCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHhBQzQ0OworCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweDdEMDAgKyAweDVEQzApIC8gMikKKwkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDdEMDA7CisJCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4NURDMCArIDB4NTYyMikgLyAyKQorCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4NURDMDsKKwkJZWxzZSBpZiAod2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA+PSAoMHg1NjIyICsgMHgzRTgwKSAvIDIpCisJCQl3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID0gMHg1NjIyOworCQllbHNlIGlmICh3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlID49ICgweDNFODAgKyAweDJCMTEpIC8gMikKKwkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSAweDNFODA7CisJCWVsc2UgaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gKDB4MkIxMSArIDB4MUY0MCkgLyAyKQorCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4MkIxMTsKKwkJZWxzZQorCQkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4MUY0MDsKKworCQlzd2l0Y2ggKHdhdmVfZm10LT5pZCkgeworCQljYXNlIEFGTVRfUzE2X0xFOgorCQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gMTY7CisJCQlicmVhazsKKwkJY2FzZSBBRk1UX1U4OgorCQkJd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID0gODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJd2F2ZV9mbXQtPmlkID0gQUZNVF9TMTZfTEU7CisJCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKKwkJCWJyZWFrOworCQl9CisKKwkJYnJlYWs7CisKKwkvKiB0aGVzZSBjYW4ndCBiZSBjaGFuZ2VkIGZyb20gdGhlIG9yaWdpbmFsIHZhbHVlcyAqLworCWNhc2UgV0FWRVJFQ09SRF9NSUM6CisJY2FzZSBXQVZFUkVDT1JEX0ZYOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwl3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsID0gd2F2ZV9mbXQtPmJpdHNwZXJjaGFubmVsID4+IDM7CisJd2F2ZV9mbXQtPmJ5dGVzcGVyc2FtcGxlID0gd2F2ZV9mbXQtPmNoYW5uZWxzICogd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbDsKKwl3YXZlX2ZtdC0+Ynl0ZXNwZXJzZWMgPSB3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGUgKiB3YXZlX2ZtdC0+c2FtcGxpbmdyYXRlOworCXdhdmVfZm10LT5ieXRlc3BlcnZvaWNlc2FtcGxlID0gd2F2ZV9mbXQtPmJ5dGVzcGVyc2FtcGxlOworfQorCitzdGF0aWMgaW50IGFsbG9jX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQoreworCWJ1ZmZlci0+YWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGJ1ZmZlci0+c2l6ZSAqIGJ1ZmZlci0+Y292LAorCQkJCQkgICAgJmJ1ZmZlci0+ZG1hX2hhbmRsZSk7CisJaWYgKGJ1ZmZlci0+YWRkciA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcikKK3sKKwlpZiAoYnVmZmVyLT5hZGRyICE9IE5VTEwpCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgYnVmZmVyLT5zaXplICogYnVmZmVyLT5jb3YsCisJCQkJICAgIGJ1ZmZlci0+YWRkciwgYnVmZmVyLT5kbWFfaGFuZGxlKTsKK30KKworaW50IGVtdTEwazFfd2F2ZWluX29wZW4oc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisJc3RydWN0IHdpaW5zdCAqKndpaW5zdF90bXAgPSBOVUxMOworCXUxNiBkZWxheTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRFBGKDIsICJlbXUxMGsxX3dhdmVpbl9vcGVuKClcbiIpOworCisJc3dpdGNoICh3aWluc3QtPnJlY3NyYykgeworCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgorCQl3aWluc3RfdG1wID0gJmNhcmQtPndhdmVpbi5hYzk3OworCQlicmVhazsKKwljYXNlIFdBVkVSRUNPUkRfTUlDOgorCQl3aWluc3RfdG1wID0gJmNhcmQtPndhdmVpbi5taWM7CisJCWJyZWFrOworCWNhc2UgV0FWRVJFQ09SRF9GWDoKKwkJd2lpbnN0X3RtcCA9ICZjYXJkLT53YXZlaW4uZng7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCWlmICgqd2lpbnN0X3RtcCAhPSBOVUxMKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKworCSp3aWluc3RfdG1wID0gd2lpbnN0OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCS8qIGhhbmRsZSA4IGJpdCByZWNvcmRpbmcgKi8KKwlpZiAod2lpbnN0LT5mb3JtYXQuYnl0ZXNwZXJjaGFubmVsID09IDEpIHsKKwkJaWYgKHdpaW5zdC0+YnVmZmVyLnNpemUgPiAweDgwMDApIHsKKwkJCXdpaW5zdC0+YnVmZmVyLnNpemUgPSAweDgwMDA7CisJCQl3aWluc3QtPmJ1ZmZlci5zaXplcmVndmFsID0gMHgxZjsKKwkJfSBlbHNlCisJCQl3aWluc3QtPmJ1ZmZlci5zaXplcmVndmFsICs9IDQ7CisKKwkJd2lpbnN0LT5idWZmZXIuY292ID0gMjsKKwl9IGVsc2UKKwkJd2lpbnN0LT5idWZmZXIuY292ID0gMTsKKworCWlmIChhbGxvY19idWZmZXIoY2FyZCwgJndpaW5zdC0+YnVmZmVyKSA8IDApIHsKKwkJRVJST1IoKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWVtdTEwazFfc2V0X3JlY29yZF9zcmMoY2FyZCwgd2lpbnN0KTsKKworCWVtdTEwazFfcmVzZXRfcmVjb3JkKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7CisKKwl3aWluc3QtPmJ1ZmZlci5od19wb3MgPSAwOworCXdpaW5zdC0+YnVmZmVyLnBvcyA9IDA7CisJd2lpbnN0LT5idWZmZXIuYnl0ZXN0b2NvcHkgPSAwOworCisJZGVsYXkgPSAoNDgwMDAgKiB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSAvIHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2VjOworCisJZW11MTBrMV90aW1lcl9pbnN0YWxsKGNhcmQsICZ3aWluc3QtPnRpbWVyLCBkZWxheSAvIDIpOworCisJd2lpbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfT1BFTjsKKworCXJldHVybiAwOworfQorCit2b2lkIGVtdTEwazFfd2F2ZWluX2Nsb3NlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKKwlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwgImVtdTEwazFfd2F2ZWluX2Nsb3NlKClcbiIpOworCisJZW11MTBrMV93YXZlaW5fc3RvcCh3YXZlX2Rldik7CisKKwllbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChjYXJkLCAmd2lpbnN0LT50aW1lcik7CisKKwlmcmVlX2J1ZmZlcihjYXJkLCAmd2lpbnN0LT5idWZmZXIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKHdhdmVfZGV2LT53aWluc3QtPnJlY3NyYykgeworCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgorCQljYXJkLT53YXZlaW4uYWM5NyA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgV0FWRVJFQ09SRF9NSUM6CisJCWNhcmQtPndhdmVpbi5taWMgPSBOVUxMOworCQlicmVhazsKKwljYXNlIFdBVkVSRUNPUkRfRlg6CisJCWNhcmQtPndhdmVpbi5meCA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUJVRygpOworCQlicmVhazsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJd2lpbnN0LT5zdGF0ZSA9IFdBVkVfU1RBVEVfQ0xPU0VEOworfQorCit2b2lkIGVtdTEwazFfd2F2ZWluX3N0YXJ0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKKwlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OworCisJRFBGKDIsICJlbXUxMGsxX3dhdmVpbl9zdGFydCgpXG4iKTsKKworCWVtdTEwazFfc3RhcnRfcmVjb3JkKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7CisJZW11MTBrMV90aW1lcl9lbmFibGUod2F2ZV9kZXYtPmNhcmQsICZ3aWluc3QtPnRpbWVyKTsKKworCXdpaW5zdC0+c3RhdGUgfD0gV0FWRV9TVEFURV9TVEFSVEVEOworfQorCit2b2lkIGVtdTEwazFfd2F2ZWluX3N0b3Aoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCXN0cnVjdCB3aWluc3QgKndpaW5zdCA9IHdhdmVfZGV2LT53aWluc3Q7CisKKwlEUEYoMiwgImVtdTEwazFfd2F2ZWluX3N0b3AoKVxuIik7CisKKwlpZiAoISh3aWluc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkKKwkJcmV0dXJuOworCisJZW11MTBrMV90aW1lcl9kaXNhYmxlKGNhcmQsICZ3aWluc3QtPnRpbWVyKTsKKwllbXUxMGsxX3N0b3BfcmVjb3JkKGNhcmQsICZ3aWluc3QtPmJ1ZmZlcik7CisKKwl3aWluc3QtPnN0YXRlICY9IH5XQVZFX1NUQVRFX1NUQVJURUQ7Cit9CisKK2ludCBlbXUxMGsxX3dhdmVpbl9zZXRmb3JtYXQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYsIHN0cnVjdCB3YXZlX2Zvcm1hdCAqZm9ybWF0KQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKKwlzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QgPSB3YXZlX2Rldi0+d2lpbnN0OworCXUxNiBkZWxheTsKKworCURQRigyLCAiZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KClcbiIpOworCisJaWYgKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCisJCXJldHVybiAtMTsKKworCXF1ZXJ5X2Zvcm1hdCh3aWluc3QtPnJlY3NyYywgZm9ybWF0KTsKKworCWlmICgod2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlICE9IGZvcm1hdC0+c2FtcGxpbmdyYXRlKQorCSAgICB8fCAod2lpbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgIT0gZm9ybWF0LT5iaXRzcGVyY2hhbm5lbCkKKwkgICAgfHwgKHdpaW5zdC0+Zm9ybWF0LmNoYW5uZWxzICE9IGZvcm1hdC0+Y2hhbm5lbHMpKSB7CisKKwkJd2lpbnN0LT5mb3JtYXQgPSAqZm9ybWF0OworCisJCWlmICh3aWluc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKQorCQkJcmV0dXJuIDA7CisKKwkJd2lpbnN0LT5idWZmZXIuc2l6ZSAqPSB3aWluc3QtPmJ1ZmZlci5jb3Y7CisKKwkJaWYgKHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyY2hhbm5lbCA9PSAxKSB7CisJCQl3aWluc3QtPmJ1ZmZlci5jb3YgPSAyOworCQkJd2lpbnN0LT5idWZmZXIuc2l6ZSAvPSB3aWluc3QtPmJ1ZmZlci5jb3Y7CisJCX0gZWxzZQorCQkJd2lpbnN0LT5idWZmZXIuY292ID0gMTsKKworCQllbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChjYXJkLCAmd2lpbnN0LT50aW1lcik7CisKKwkJZGVsYXkgPSAoNDgwMDAgKiB3aWluc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplKSAvIHdpaW5zdC0+Zm9ybWF0LmJ5dGVzcGVyc2VjOworCisJCWVtdTEwazFfdGltZXJfaW5zdGFsbChjYXJkLCAmd2lpbnN0LT50aW1lciwgZGVsYXkgLyAyKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbXUxMGsxX3dhdmVpbl9nZXR4ZmVyc2l6ZShzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QsIHUzMiAqIHNpemUpCit7CisJc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlciA9ICZ3aWluc3QtPmJ1ZmZlcjsKKworCSpzaXplID0gYnVmZmVyLT5ieXRlc3RvY29weTsKKworCWlmICh3aWluc3QtPm1tYXBwZWQpCisJCXJldHVybjsKKworCWlmICgqc2l6ZSA+IGJ1ZmZlci0+c2l6ZSkgeworCQkqc2l6ZSA9IGJ1ZmZlci0+c2l6ZTsKKwkJYnVmZmVyLT5wb3MgPSBidWZmZXItPmh3X3BvczsKKwkJYnVmZmVyLT5ieXRlc3RvY29weSA9IGJ1ZmZlci0+c2l6ZTsKKwkJRFBGKDEsICJidWZmZXIgb3ZlcnJ1blxuIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb3B5X2Jsb2NrKHU4IF9fdXNlciAqZHN0LCB1OCAqIHNyYywgdTMyIHN0ciwgdTMyIGxlbiwgdTggY292KQoreworCWlmIChjb3YgPT0gMSkKKwkJX19jb3B5X3RvX3VzZXIoZHN0LCBzcmMgKyBzdHIsIGxlbik7CisJZWxzZSB7CisJCXU4IGJ5dGU7CisJCXUzMiBpOworCisJCXNyYyArPSAxICsgMiAqIHN0cjsKKworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJCWJ5dGUgPSBzcmNbMiAqIGldIF4gMHg4MDsKKwkJCV9fY29weV90b191c2VyKGRzdCArIGksICZieXRlLCAxKTsKKwkJfQorCX0KK30KKwordm9pZCBlbXUxMGsxX3dhdmVpbl94ZmVyZGF0YShzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QsIHU4IF9fdXNlciAqZGF0YSwgdTMyICogc2l6ZSkKK3sKKwlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOworCXUzMiBzaXpldG9jb3B5LCBzaXpldG9jb3B5X25vdywgc3RhcnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNpemV0b2NvcHkgPSBtaW5fdCh1MzIsIGJ1ZmZlci0+c2l6ZSwgKnNpemUpOworCSpzaXplID0gc2l6ZXRvY29weTsKKworCWlmICghc2l6ZXRvY29weSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndpaW5zdC0+bG9jaywgZmxhZ3MpOworCXN0YXJ0ID0gYnVmZmVyLT5wb3M7CisJYnVmZmVyLT5wb3MgKz0gc2l6ZXRvY29weTsKKwlidWZmZXItPnBvcyAlPSBidWZmZXItPnNpemU7CisJYnVmZmVyLT5ieXRlc3RvY29weSAtPSBzaXpldG9jb3B5OworCXNpemV0b2NvcHlfbm93ID0gYnVmZmVyLT5zaXplIC0gc3RhcnQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3aWluc3QtPmxvY2ssIGZsYWdzKTsKKworCWlmIChzaXpldG9jb3B5ID4gc2l6ZXRvY29weV9ub3cpIHsKKwkJc2l6ZXRvY29weSAtPSBzaXpldG9jb3B5X25vdzsKKworCQljb3B5X2Jsb2NrKGRhdGEsIGJ1ZmZlci0+YWRkciwgc3RhcnQsIHNpemV0b2NvcHlfbm93LCBidWZmZXItPmNvdik7CisJCWNvcHlfYmxvY2soZGF0YSArIHNpemV0b2NvcHlfbm93LCBidWZmZXItPmFkZHIsIDAsIHNpemV0b2NvcHksIGJ1ZmZlci0+Y292KTsKKwl9IGVsc2UgeworCQljb3B5X2Jsb2NrKGRhdGEsIGJ1ZmZlci0+YWRkciwgc3RhcnQsIHNpemV0b2NvcHksIGJ1ZmZlci0+Y292KTsKKwl9Cit9CisKK3ZvaWQgZW11MTBrMV93YXZlaW5fdXBkYXRlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3aWluc3QgKndpaW5zdCkKK3sKKwl1MzIgaHdfcG9zOworCXUzMiBkaWZmOworCisJLyogVGhlcmUgaXMgbm8gYWN0dWFsIHN0YXJ0IHlldCAqLworCWlmICghKHdpaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKSB7CisJCWh3X3BvcyA9IHdpaW5zdC0+YnVmZmVyLmh3X3BvczsKKwl9IGVsc2UgeworCQkvKiBod19wb3MgaW4gYnl0ZSB1bml0cyAqLworCQlod19wb3MgPSBzYmxpdmVfcmVhZHB0cihjYXJkLCB3aWluc3QtPmJ1ZmZlci5pZHhyZWcsIDApIC8gd2lpbnN0LT5idWZmZXIuY292OworCX0KKworCWRpZmYgPSAod2lpbnN0LT5idWZmZXIuc2l6ZSArIGh3X3BvcyAtIHdpaW5zdC0+YnVmZmVyLmh3X3BvcykgJSB3aWluc3QtPmJ1ZmZlci5zaXplOworCXdpaW5zdC0+dG90YWxfcmVjb3JkZWQgKz0gZGlmZjsKKwl3aWluc3QtPmJ1ZmZlci5ieXRlc3RvY29weSArPSBkaWZmOworCisJd2lpbnN0LT5idWZmZXIuaHdfcG9zID0gaHdfcG9zOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmggYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd2kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWNmYjliCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZHdpLmgKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgY2FyZHdpLmggLS0gaGVhZGVyIGZpbGUgZm9yIGNhcmQgd2F2ZSBpbnB1dCBmdW5jdGlvbnMKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisjaWZuZGVmIF9DQVJEV0lfSAorI2RlZmluZSBfQ0FSRFdJX0gKKworI2luY2x1ZGUgImljYXJkd2F2LmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJ0aW1lci5oIgorCitzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciB7CisJdTE2IG9zc2ZyYWdzaGlmdDsKKyAgICAgICAgdTMyIGZyYWdtZW50X3NpemU7CisgICAgICAgIHUzMiBudW1mcmFnczsKKwl1MzIgaHdfcG9zOwkJLyogaGFyZHdhcmUgY3Vyc29yIHBvc2l0aW9uICovCisJdTMyIHBvczsJCS8qIHNvZnR3YXJlIGN1cnNvciBwb3NpdGlvbiAqLworCXUzMiBieXRlc3RvY29weTsJLyogYnl0ZXMgb2YgcmVjb3JkZWQgZGF0YSBhdmFpbGFibGUgKi8KKwl1MzIgc2l6ZTsKKwl1MzIgcGFnZXM7CisJdTMyIHNpemVyZWc7CisJdTMyIHNpemVyZWd2YWw7CisgICAgICAgIHUzMiBhZGRycmVnOworICAgICAgICB1MzIgaWR4cmVnOworICAgICAgICB1MzIgYWRjY3RsOworCXZvaWQgKmFkZHI7CisJdTggY292OworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsJCit9OworCitzdHJ1Y3Qgd2lpbnN0Cit7CisJdTggc3RhdGU7CisJc3RydWN0IGVtdV90aW1lciB0aW1lcjsKKwlzdHJ1Y3Qgd2F2ZV9mb3JtYXQgZm9ybWF0OworCXN0cnVjdCB3YXZlaW5fYnVmZmVyIGJ1ZmZlcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOworCXU4IG1tYXBwZWQ7CisJdTMyIHRvdGFsX3JlY29yZGVkOwkvKiB0b3RhbCBieXRlcyByZWFkKCkgZnJvbSBkZXZpY2UgKi8KKwl1MzIgYmxvY2tzOworCXNwaW5sb2NrX3QgbG9jazsKKwl1OCByZWNzcmM7CisJdTE2IGZ4d2M7Cit9OworCisjZGVmaW5lIFdBVkVJTl9NQVhCVUZTSVpFCTY1NTM2CisjZGVmaW5lIFdBVkVJTl9NSU5CVUZTSVpFCTM2OAorCisjZGVmaW5lIFdBVkVJTl9ERUZBVUxURlJBR0xFTgkxMDAgCisjZGVmaW5lIFdBVkVJTl9ERUZBVUxUQlVGTEVOCTEwMDAKKworI2RlZmluZSBXQVZFSU5fTUlORlJBR1NISUZUCTggCisjZGVmaW5lIFdBVkVJTl9NSU5GUkFHUwkJMgorCitpbnQgZW11MTBrMV93YXZlaW5fb3BlbihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwordm9pZCBlbXUxMGsxX3dhdmVpbl9jbG9zZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwordm9pZCBlbXUxMGsxX3dhdmVpbl9zdGFydChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwordm9pZCBlbXUxMGsxX3dhdmVpbl9zdG9wKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Cit2b2lkIGVtdTEwazFfd2F2ZWluX2dldHhmZXJzaXplKHN0cnVjdCB3aWluc3QgKiwgdTMyICopOwordm9pZCBlbXUxMGsxX3dhdmVpbl94ZmVyZGF0YShzdHJ1Y3Qgd2lpbnN0ICosIHU4IF9fdXNlciAqLCB1MzIgKik7CitpbnQgZW11MTBrMV93YXZlaW5fc2V0Zm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKiwgc3RydWN0IHdhdmVfZm9ybWF0ICopOwordm9pZCBlbXUxMGsxX3dhdmVpbl91cGRhdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgd2lpbnN0ICopOworCisKKyNlbmRpZiAvKiBfQ0FSRFdJX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5jIGIvc291bmQvb3NzL2VtdTEwazEvY2FyZHdvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRkYWNhNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5jCkBAIC0wLDAgKzEsNjQzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBjYXJkd28uYyAtIFBDTSBvdXRwdXQgSEFMIGZvciBlbXUxMGsxIGRyaXZlcgorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgIjgwMTAuaCIKKyNpbmNsdWRlICJ2b2ljZW1nci5oIgorI2luY2x1ZGUgImNhcmR3by5oIgorI2luY2x1ZGUgImF1ZGlvLmgiCisKK3N0YXRpYyB1MzIgc2FtcGxlcmF0ZV90b19saW5lYXJwaXRjaCh1MzIgc2FtcGxpbmdyYXRlKQoreworCXNhbXBsaW5ncmF0ZSA9IChzYW1wbGluZ3JhdGUgPDwgOCkgLyAzNzU7CisJcmV0dXJuIChzYW1wbGluZ3JhdGUgPj4gMSkgKyAoc2FtcGxpbmdyYXRlICYgMSk7Cit9CisKK3N0YXRpYyB2b2lkIHF1ZXJ5X2Zvcm1hdChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2Rldiwgc3RydWN0IHdhdmVfZm9ybWF0ICp3YXZlX2ZtdCkKK3sKKwlpbnQgaSwgaiwgZG9fcGFzc3Rocm91Z2ggPSAwLCBpc19hYzMgPSAwOworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCisJaWYgKCh3YXZlX2ZtdC0+Y2hhbm5lbHMgPiAyKSAmJiAod2F2ZV9mbXQtPmlkICE9IEFGTVRfUzE2X0xFKSAmJiAod2F2ZV9mbXQtPmlkICE9IEFGTVRfVTgpKQorCQl3YXZlX2ZtdC0+Y2hhbm5lbHMgPSAyOworCisJaWYgKCh3YXZlX2ZtdC0+Y2hhbm5lbHMgPCAxKSB8fCAod2F2ZV9mbXQtPmNoYW5uZWxzID4gV0FWRU9VVF9NQVhWT0lDRVMpKQorCQl3YXZlX2ZtdC0+Y2hhbm5lbHMgPSAyOworCisJaWYgKHdhdmVfZm10LT5jaGFubmVscyA9PSAyKQorCQl3b2luc3QtPm51bV92b2ljZXMgPSAxOworCWVsc2UKKwkJd29pbnN0LT5udW1fdm9pY2VzID0gd2F2ZV9mbXQtPmNoYW5uZWxzOworCisJaWYgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPj0gMHgyZWUwMCkKKwkJd2F2ZV9mbXQtPnNhbXBsaW5ncmF0ZSA9IDB4MmVlMDA7CisKKwl3YXZlX2ZtdC0+cGFzc3Rocm91Z2ggPSAwOworCWRvX3Bhc3N0aHJvdWdoID0gaXNfYWMzID0gMDsKKworCWlmIChjYXJkLT5wdC5zZWxlY3RlZCkKKwkJZG9fcGFzc3Rocm91Z2ggPSAxOworCisJc3dpdGNoICh3YXZlX2ZtdC0+aWQpIHsKKwljYXNlIEFGTVRfUzE2X0xFOgorCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKKwkJYnJlYWs7CisJY2FzZSBBRk1UX1U4OgorCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSA4OworCQlicmVhazsKKwljYXNlIEFGTVRfQUMzOgorCQlkb19wYXNzdGhyb3VnaCA9IDE7CisJCWlzX2FjMyA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXdhdmVfZm10LT5pZCA9IEFGTVRfUzE2X0xFOworCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKKwkJYnJlYWs7CisJfQkKKwlpZiAoZG9fcGFzc3Rocm91Z2gpIHsKKwkJLyogY3VycmVudGx5IG9ubHkgb25lIHdhdmVvdXQgaW5zdGFuY2UgbWF5IHVzZSBwYXNzLXRocm91Z2ggKi8KKwkJaWYgKHdvaW5zdC0+c3RhdGUgIT0gV0FWRV9TVEFURV9DTE9TRUQgfHwgCisJCSAgICBjYXJkLT5wdC5zdGF0ZSAhPSBQVF9TVEFURV9JTkFDVElWRSB8fAorCQkgICAgKHdhdmVfZm10LT5zYW1wbGluZ3JhdGUgIT0gNDgwMDAgJiYgIWlzX2FjMykpIHsKKwkJCURQRigyLCAidW5hYmxlIHRvIHNldCBwYXNzLXRocm91Z2ggbW9kZVxuIik7CisJCX0gZWxzZSBpZiAoVVNFX1BUX01FVEhPRDEpIHsKKwkJCWkgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgY2FyZC0+cHQucGF0Y2hfbmFtZSwgY2FyZC0+cHQuaW50cl9ncHJfbmFtZSk7CisJCQlqID0gZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKCZjYXJkLT5tZ3IsIGNhcmQtPnB0LnBhdGNoX25hbWUsIGNhcmQtPnB0LmVuYWJsZV9ncHJfbmFtZSk7CisJCQlpZiAoaSA8IDAgfHwgaiA8IDApCisJCQkJRFBGKDIsICJ1bmFibGUgdG8gc2V0IHBhc3MtdGhyb3VnaCBtb2RlXG4iKTsKKwkJCWVsc2UgeworCQkJCXdhdmVfZm10LT5zYW1wbGluZ3JhdGUgPSA0ODAwMDsKKwkJCQl3YXZlX2ZtdC0+Y2hhbm5lbHMgPSAyOworCQkJCWNhcmQtPnB0LnBvc19ncHIgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgY2FyZC0+cHQucGF0Y2hfbmFtZSwKKwkJCQkJCQkJCSAgICBjYXJkLT5wdC5wb3NfZ3ByX25hbWUpOworCQkJCXdhdmVfZm10LT5wYXNzdGhyb3VnaCA9IDE7CisJCQkJY2FyZC0+cHQuaW50cl9ncHIgPSBpOworCQkJCWNhcmQtPnB0LmVuYWJsZV9ncHIgPSBqOworCQkJCWNhcmQtPnB0LnN0YXRlID0gUFRfU1RBVEVfSU5BQ1RJVkU7CisJCQkKKwkJCQlEUEQoMiwgImlzX2FjMyBpcyAlZFxuIiwgaXNfYWMzKTsKKwkJCQljYXJkLT5wdC5hYzNkYXRhID0gaXNfYWMzOworCQkJCXdhdmVfZm10LT5iaXRzcGVyY2hhbm5lbCA9IDE2OworCQkJfQorCQl9ZWxzZXsKKwkJCURQRigyLCAiVXNpbmcgUGFzc3Rocm91Z2ggTWV0aG9kIDJcbiIpOworCQkJY2FyZC0+cHQuZW5hYmxlX2dwciA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCBjYXJkLT5wdC5wYXRjaF9uYW1lLAorCQkJCQkJCQkgICAgICAgY2FyZC0+cHQuZW5hYmxlX2dwcl9uYW1lKTsKKwkJCXdhdmVfZm10LT5wYXNzdGhyb3VnaCA9IDI7CisJCQl3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPSAxNjsKKwkJfQorCX0KKworCXdhdmVfZm10LT5ieXRlc3BlcmNoYW5uZWwgPSB3YXZlX2ZtdC0+Yml0c3BlcmNoYW5uZWwgPj4gMzsKKwl3YXZlX2ZtdC0+Ynl0ZXNwZXJzYW1wbGUgPSB3YXZlX2ZtdC0+Y2hhbm5lbHMgKiB3YXZlX2ZtdC0+Ynl0ZXNwZXJjaGFubmVsOworCXdhdmVfZm10LT5ieXRlc3BlcnNlYyA9IHdhdmVfZm10LT5ieXRlc3BlcnNhbXBsZSAqIHdhdmVfZm10LT5zYW1wbGluZ3JhdGU7CisKKwlpZiAod2F2ZV9mbXQtPmNoYW5uZWxzID09IDIpCisJCXdhdmVfZm10LT5ieXRlc3BlcnZvaWNlc2FtcGxlID0gd2F2ZV9mbXQtPmNoYW5uZWxzICogd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbDsKKwllbHNlCisJCXdhdmVfZm10LT5ieXRlc3BlcnZvaWNlc2FtcGxlID0gd2F2ZV9mbXQtPmJ5dGVzcGVyY2hhbm5lbDsKK30KKworc3RhdGljIGludCBnZXRfdm9pY2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1bnNpZ25lZCBpbnQgdm9pY2VudW0pCit7CisJc3RydWN0IGVtdV92b2ljZSAqdm9pY2UgPSAmd29pbnN0LT52b2ljZVt2b2ljZW51bV07CisKKwkvKiBBbGxvY2F0ZSB2b2ljZXMgaGVyZSwgaWYgbm8gdm9pY2VzIGF2YWlsYWJsZSwgcmV0dXJuIGVycm9yLiAqLworCisJdm9pY2UtPnVzYWdlID0gVk9JQ0VfVVNBR0VfUExBWUJBQ0s7CisKKwl2b2ljZS0+ZmxhZ3MgPSAwOworCisJaWYgKHdvaW5zdC0+Zm9ybWF0LmNoYW5uZWxzID09IDIpCisJCXZvaWNlLT5mbGFncyB8PSBWT0lDRV9GTEFHU19TVEVSRU87CisKKwlpZiAod29pbnN0LT5mb3JtYXQuYml0c3BlcmNoYW5uZWwgPT0gMTYpCisJCXZvaWNlLT5mbGFncyB8PSBWT0lDRV9GTEFHU18xNkJJVDsKKworCWlmIChlbXUxMGsxX3ZvaWNlX2FsbG9jKGNhcmQsIHZvaWNlKSA8IDApIHsKKwkJdm9pY2UtPnVzYWdlID0gVk9JQ0VfVVNBR0VfRlJFRTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIENhbGN1bGF0ZSBwaXRjaCAqLworCXZvaWNlLT5pbml0aWFsX3BpdGNoID0gKHUxNikgKHNyVG9QaXRjaCh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUpID4+IDgpOworCXZvaWNlLT5waXRjaF90YXJnZXQgPSBzYW1wbGVyYXRlX3RvX2xpbmVhcnBpdGNoKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSk7CisKKwlEUEQoMiwgIkluaXRpYWwgcGl0Y2ggLS0+ICUjeFxuIiwgdm9pY2UtPmluaXRpYWxfcGl0Y2gpOworCisJdm9pY2UtPnN0YXJ0bG9vcCA9ICh2b2ljZS0+bWVtLmVtdXBhZ2VpbmRleCA8PCAxMikgLworCSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOworCXZvaWNlLT5lbmRsb29wID0gdm9pY2UtPnN0YXJ0bG9vcCArIHdvaW5zdC0+YnVmZmVyLnNpemUgLyB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOworCXZvaWNlLT5zdGFydCA9IHZvaWNlLT5zdGFydGxvb3A7CisKKwkKKwl2b2ljZS0+cGFyYW1zWzBdLnZvbHVtZV90YXJnZXQgPSAweGZmZmY7CisJdm9pY2UtPnBhcmFtc1swXS5pbml0aWFsX2ZjID0gMHhmZjsKKwl2b2ljZS0+cGFyYW1zWzBdLmluaXRpYWxfYXR0biA9IDB4MDA7CisJdm9pY2UtPnBhcmFtc1swXS5ieWFtcGxfZW52X3N1c3RhaW4gPSAweDdmOworCXZvaWNlLT5wYXJhbXNbMF0uYnlhbXBsX2Vudl9kZWNheSA9IDB4N2Y7CisKKwkKKwlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKSB7CisJCWlmICh3b2luc3QtPmZvcm1hdC5wYXNzdGhyb3VnaCA9PSAyKSB7CisJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyAgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZyAgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QVF07CisJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZzIgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZzIgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUFRdOworCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2RjYmEgPSAweGZmOworCQkJdm9pY2UtPnBhcmFtc1sxXS5zZW5kX2RjYmEgPSAweGZmMDA7CisJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfaGdmZSA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9oZ2ZlPTA7CisJCX0gZWxzZSB7CisJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfZGNiYSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTEVGVF07CisJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfaGdmZSA9IGNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfTEVGVF07CisJCQl2b2ljZS0+cGFyYW1zWzFdLnNlbmRfZGNiYSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfUklHSFRdOworCQkJdm9pY2UtPnBhcmFtc1sxXS5zZW5kX2hnZmUgPSBjYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX1JJR0hUXTsKKworCQkJaWYgKHdvaW5zdC0+ZGV2aWNlKSB7CisJCQkJLy8gL2Rldi9kcHMxCisJCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcgID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNMV07CisJCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcyID0gdm9pY2UtPnBhcmFtc1sxXS5zZW5kX3JvdXRpbmcyID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTTFdOworCQkJfSBlbHNlIHsKKwkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyAgPSB2b2ljZS0+cGFyYW1zWzFdLnNlbmRfcm91dGluZyAgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ01dOworCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IHZvaWNlLT5wYXJhbXNbMV0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ01dOworCQkJfQorCQl9CisJCQorCQl2b2ljZS0+cGFyYW1zWzFdLnZvbHVtZV90YXJnZXQgPSAweGZmZmY7CisJCXZvaWNlLT5wYXJhbXNbMV0uaW5pdGlhbF9mYyA9IDB4ZmY7CisJCXZvaWNlLT5wYXJhbXNbMV0uaW5pdGlhbF9hdHRuID0gMHgwMDsKKwkJdm9pY2UtPnBhcmFtc1sxXS5ieWFtcGxfZW52X3N1c3RhaW4gPSAweDdmOworCQl2b2ljZS0+cGFyYW1zWzFdLmJ5YW1wbF9lbnZfZGVjYXkgPSAweDdmOworCX0gZWxzZSB7CisJCWlmICh3b2luc3QtPm51bV92b2ljZXMgPiAxKSB7CisJCQkvLyBNdWx0aWNoYW5uZWwgcGNtCisJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfZGNiYT0weGZmOworCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2hnZmU9MDsKKwkJCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKKwkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyA9IDB4M2YzZjNmMDAgKyBjYXJkLT5tY2hhbm5lbF9meCArIHZvaWNlbnVtOworCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IDB4M2YzZjNmM2Y7CisJCQl9IGVsc2UgeworCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nID0gMHhmZmYwICsgY2FyZC0+bWNoYW5uZWxfZnggKyB2b2ljZW51bTsKKwkJCX0KKwkJCQorCQl9IGVsc2UgeworCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2RjYmEgPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX01PTk9dOworCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX2hnZmUgPSBjYXJkLT53YXZlb3V0LnNlbmRfaGdmZVtTRU5EX01PTk9dOworCisJCQlpZiAod29pbnN0LT5kZXZpY2UpIHsKKwkJCQl2b2ljZS0+cGFyYW1zWzBdLnNlbmRfcm91dGluZyA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTTFdOworCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ00xXTsKKwkJCX0gZWxzZSB7CisJCQkJdm9pY2UtPnBhcmFtc1swXS5zZW5kX3JvdXRpbmcgPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ01dOworCQkJCXZvaWNlLT5wYXJhbXNbMF0uc2VuZF9yb3V0aW5nMiA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QQ01dOworCQkJfQorCQl9CisJfQorCisJRFBEKDIsICJ2b2ljZTogc3RhcnRsb29wPSUjeCwgZW5kbG9vcD0lI3hcbiIsIHZvaWNlLT5zdGFydGxvb3AsIHZvaWNlLT5lbmRsb29wKTsKKworCWVtdTEwazFfdm9pY2VfcGxheWJhY2tfc2V0dXAodm9pY2UpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlbXUxMGsxX3dhdmVvdXRfb3BlbihzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7CisJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKKwlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgKmJ1ZmZlciA9ICZ3b2luc3QtPmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQgdm9pY2VudW07CisJdTE2IGRlbGF5OworCisJRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfb3BlbigpXG4iKTsKKworCWZvciAodm9pY2VudW0gPSAwOyB2b2ljZW51bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VudW0rKykgeworCQlpZiAoZW11MTBrMV92b2ljZV9hbGxvY19idWZmZXIoY2FyZCwgJndvaW5zdC0+dm9pY2Vbdm9pY2VudW1dLm1lbSwgd29pbnN0LT5idWZmZXIucGFnZXMpIDwgMCkgeworCQkJRVJST1IoKTsKKwkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQlpZiAoZ2V0X3ZvaWNlKGNhcmQsIHdvaW5zdCwgdm9pY2VudW0pIDwgMCkgeworCQkJRVJST1IoKTsKKwkJCWVtdTEwazFfd2F2ZW91dF9jbG9zZSh3YXZlX2Rldik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlidWZmZXItPmZpbGxfc2lsZW5jZSA9IDA7CisJYnVmZmVyLT5zaWxlbmNlX2J5dGVzID0gMDsKKwlidWZmZXItPnNpbGVuY2VfcG9zID0gMDsKKwlidWZmZXItPmh3X3BvcyA9IDA7CisJYnVmZmVyLT5mcmVlX2J5dGVzID0gd29pbnN0LT5idWZmZXIuc2l6ZTsKKworCWRlbGF5ID0gKDQ4MDAwICogd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkgLworCQkgKHdvaW5zdC0+Zm9ybWF0LnNhbXBsaW5ncmF0ZSAqIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUpOworCisJZW11MTBrMV90aW1lcl9pbnN0YWxsKGNhcmQsICZ3b2luc3QtPnRpbWVyLCBkZWxheSk7CisKKwl3b2luc3QtPnN0YXRlID0gV0FWRV9TVEFURV9PUEVOOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW11MTBrMV93YXZlb3V0X2Nsb3NlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCXVuc2lnbmVkIGludCB2b2ljZW51bTsKKworCURQRigyLCAiZW11MTBrMV93YXZlb3V0X2Nsb3NlKClcbiIpOworCisJZW11MTBrMV93YXZlb3V0X3N0b3Aod2F2ZV9kZXYpOworCisJZW11MTBrMV90aW1lcl91bmluc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIpOworCisJZm9yICh2b2ljZW51bSA9IDA7IHZvaWNlbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZW51bSsrKSB7CisJCWVtdTEwazFfdm9pY2VfZnJlZSgmd29pbnN0LT52b2ljZVt2b2ljZW51bV0pOworCQllbXUxMGsxX3ZvaWNlX2ZyZWVfYnVmZmVyKGNhcmQsICZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXS5tZW0pOworCX0KKworCXdvaW5zdC0+c3RhdGUgPSBXQVZFX1NUQVRFX0NMT1NFRDsKK30KKwordm9pZCBlbXUxMGsxX3dhdmVvdXRfc3RhcnQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCXN0cnVjdCB3b2luc3QgKndvaW5zdCA9IHdhdmVfZGV2LT53b2luc3Q7CisJc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OworCisJRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfc3RhcnQoKVxuIik7CisKKwlpZiAod29pbnN0LT5mb3JtYXQucGFzc3Rocm91Z2ggPT0gMikgeworCQllbXUxMGsxX3B0X3NldHVwKHdhdmVfZGV2KTsKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIChjYXJkLT5pc19hdWRpZ3kgPyBBX0dQUl9CQVNFIDogR1BSX0JBU0UpICsgcHQtPmVuYWJsZV9ncHIsIDAsIDEpOworCQlwdC0+c3RhdGUgPSBQVF9TVEFURV9QTEFZSU5HOworCX0KKworCS8qIEFjdHVhbCBzdGFydCAqLworCWVtdTEwazFfdm9pY2VzX3N0YXJ0KHdvaW5zdC0+dm9pY2UsIHdvaW5zdC0+bnVtX3ZvaWNlcywgd29pbnN0LT50b3RhbF9wbGF5ZWQpOworCisJZW11MTBrMV90aW1lcl9lbmFibGUoY2FyZCwgJndvaW5zdC0+dGltZXIpOworCisJd29pbnN0LT5zdGF0ZSB8PSBXQVZFX1NUQVRFX1NUQVJURUQ7Cit9CisKK2ludCBlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2LCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQgKmZvcm1hdCkKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7CisJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKKwl1bnNpZ25lZCBpbnQgdm9pY2VudW07CisJdTE2IGRlbGF5OworCisJRFBGKDIsICJlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KClcbiIpOworCisJaWYgKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpCisJCXJldHVybiAtMTsKKworCXF1ZXJ5X2Zvcm1hdCh3YXZlX2RldiwgZm9ybWF0KTsKKworCWlmICh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgIT0gZm9ybWF0LT5zYW1wbGluZ3JhdGUgfHwKKwkgICAgd29pbnN0LT5mb3JtYXQuY2hhbm5lbHMgIT0gZm9ybWF0LT5jaGFubmVscyB8fAorCSAgICB3b2luc3QtPmZvcm1hdC5iaXRzcGVyY2hhbm5lbCAhPSBmb3JtYXQtPmJpdHNwZXJjaGFubmVsKSB7CisKKwkJd29pbnN0LT5mb3JtYXQgPSAqZm9ybWF0OworCisJCWlmICh3b2luc3QtPnN0YXRlID09IFdBVkVfU1RBVEVfQ0xPU0VEKQorCQkJcmV0dXJuIDA7CisKKwkJZW11MTBrMV90aW1lcl91bmluc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIpOworCisJCWZvciAodm9pY2VudW0gPSAwOyB2b2ljZW51bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VudW0rKykgeworCQkJZW11MTBrMV92b2ljZV9mcmVlKCZ3b2luc3QtPnZvaWNlW3ZvaWNlbnVtXSk7CisKKwkJCWlmIChnZXRfdm9pY2UoY2FyZCwgd29pbnN0LCB2b2ljZW51bSkgPCAwKSB7CisJCQkJRVJST1IoKTsKKwkJCQllbXUxMGsxX3dhdmVvdXRfY2xvc2Uod2F2ZV9kZXYpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCisJCWRlbGF5ID0gKDQ4MDAwICogd29pbnN0LT5idWZmZXIuZnJhZ21lbnRfc2l6ZSkgLworCQkJICh3b2luc3QtPmZvcm1hdC5zYW1wbGluZ3JhdGUgKiB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlKTsKKworCQllbXUxMGsxX3RpbWVyX2luc3RhbGwoY2FyZCwgJndvaW5zdC0+dGltZXIsIGRlbGF5KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbXUxMGsxX3dhdmVvdXRfc3RvcChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7CisJc3RydWN0IHdvaW5zdCAqd29pbnN0ID0gd2F2ZV9kZXYtPndvaW5zdDsKKworCURQRigyLCAiZW11MTBrMV93YXZlb3V0X3N0b3AoKVxuIik7CisKKwlpZiAoISh3b2luc3QtPnN0YXRlICYgV0FWRV9TVEFURV9TVEFSVEVEKSkKKwkJcmV0dXJuOworCisJZW11MTBrMV90aW1lcl9kaXNhYmxlKGNhcmQsICZ3b2luc3QtPnRpbWVyKTsKKworCS8qIFN0b3AgYWN0dWFsIHZvaWNlcyAqLworCWVtdTEwazFfdm9pY2VzX3N0b3Aod29pbnN0LT52b2ljZSwgd29pbnN0LT5udW1fdm9pY2VzKTsKKworCWVtdTEwazFfd2F2ZW91dF91cGRhdGUod29pbnN0KTsKKworCXdvaW5zdC0+c3RhdGUgJj0gfldBVkVfU1RBVEVfU1RBUlRFRDsKK30KKworLyoqCisgKiBlbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUgLQorICoKKyAqIGdpdmVzIHRoZSB0b3RhbCBmcmVlIGJ5dGVzIG9uIHRoZSB2b2ljZSBidWZmZXIsIGluY2x1ZGluZyBzaWxlbmNlIGJ5dGVzCisgKiAoYmFzaWNhbGx5OiB0b3RhbF9mcmVlX2J5dGVzID0gZnJlZV9ieXRlcyArIHNpbGVuY2VfYnl0ZXMpLgorICoKKyAqLwordm9pZCBlbXUxMGsxX3dhdmVvdXRfZ2V0eGZlcnNpemUoc3RydWN0IHdvaW5zdCAqd29pbnN0LCB1MzIgKnRvdGFsX2ZyZWVfYnl0ZXMpCit7CisJc3RydWN0IHdhdmVvdXRfYnVmZmVyICpidWZmZXIgPSAmd29pbnN0LT5idWZmZXI7CisJaW50IHBlbmRpbmdfYnl0ZXM7CisKKwlpZiAod29pbnN0LT5tbWFwcGVkKSB7CisJCSp0b3RhbF9mcmVlX2J5dGVzID0gYnVmZmVyLT5mcmVlX2J5dGVzOworCQlyZXR1cm47CisJfQorCisJcGVuZGluZ19ieXRlcyA9IGJ1ZmZlci0+c2l6ZSAtIGJ1ZmZlci0+ZnJlZV9ieXRlczsKKworCWJ1ZmZlci0+ZmlsbF9zaWxlbmNlID0gKHBlbmRpbmdfYnl0ZXMgPCAoc2lnbmVkKSBidWZmZXItPmZyYWdtZW50X3NpemUgKiAyKSA/IDEgOiAwOworCisJaWYgKHBlbmRpbmdfYnl0ZXMgPiAoc2lnbmVkKSBidWZmZXItPnNpbGVuY2VfYnl0ZXMpIHsKKwkJKnRvdGFsX2ZyZWVfYnl0ZXMgPSAoYnVmZmVyLT5mcmVlX2J5dGVzICsgYnVmZmVyLT5zaWxlbmNlX2J5dGVzKTsKKwl9IGVsc2UgeworCQkqdG90YWxfZnJlZV9ieXRlcyA9IGJ1ZmZlci0+c2l6ZTsKKwkJYnVmZmVyLT5zaWxlbmNlX2J5dGVzID0gcGVuZGluZ19ieXRlczsKKwkJaWYgKHBlbmRpbmdfYnl0ZXMgPCAwKSB7CisJCQlidWZmZXItPnNpbGVuY2VfcG9zID0gYnVmZmVyLT5od19wb3M7CisJCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgPSAwOworCQkJYnVmZmVyLT5mcmVlX2J5dGVzID0gYnVmZmVyLT5zaXplOworCQkJRFBGKDEsICJidWZmZXIgdW5kZXJydW5cbiIpOworCQl9CisJfQorfQorCisvKioKKyAqIGNvcHlfYmxvY2sgLQorICoKKyAqIGNvcGllcyBhIGJsb2NrIG9mIHBjbSBkYXRhIHRvIGEgdm9pY2UgYnVmZmVyLgorICogTm90aWNlIHRoYXQgdGhlIHZvaWNlIGJ1ZmZlciBpcyBhY3R1YWxseSBhIHNldCBvZiBkaXNqb2ludGVkIG1lbW9yeSBwYWdlcy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGNvcHlfYmxvY2sodm9pZCAqKmRzdCwgdTMyIHN0ciwgdTggX191c2VyICpzcmMsIHUzMiBsZW4pCit7CisJdW5zaWduZWQgaW50IHBnOworCXVuc2lnbmVkIGludCBwZ29mZjsKKwl1bnNpZ25lZCBpbnQgazsKKworCXBnID0gc3RyIC8gUEFHRV9TSVpFOworCXBnb2ZmID0gc3RyICUgUEFHRV9TSVpFOworCisJaWYgKGxlbiA+IFBBR0VfU0laRSAtIHBnb2ZmKSB7CisJCWsgPSBQQUdFX1NJWkUgLSBwZ29mZjsKKwkJaWYgKF9fY29weV9mcm9tX3VzZXIoKHU4ICopZHN0W3BnXSArIHBnb2ZmLCBzcmMsIGspKQorCQkJcmV0dXJuOworCQlsZW4gLT0gazsKKwkJd2hpbGUgKGxlbiA+IFBBR0VfU0laRSkgeworCQkJaWYgKF9fY29weV9mcm9tX3VzZXIoZHN0WysrcGddLCBzcmMgKyBrLCBQQUdFX1NJWkUpKQorCQkJCXJldHVybjsKKwkJCWsgKz0gUEFHRV9TSVpFOworCQkJbGVuIC09IFBBR0VfU0laRTsKKwkJfQorCQlpZiAoX19jb3B5X2Zyb21fdXNlcihkc3RbKytwZ10sIHNyYyArIGssIGxlbikpCisJCQlyZXR1cm47CisKKwl9IGVsc2UKKwkJX19jb3B5X2Zyb21fdXNlcigodTggKilkc3RbcGddICsgcGdvZmYsIHNyYywgbGVuKTsKK30KKworLyoqCisgKiBjb3B5X2lsdl9ibG9jayAtCisgKgorICogY29waWVzIGEgYmxvY2sgb2YgcGNtIGRhdGEgY29udGFpbmluZyBuIGludGVybGVhdmVkIGNoYW5uZWxzIHRvIG4gbW9ubyB2b2ljZSBidWZmZXJzLgorICogTm90aWNlIHRoYXQgdGhlIHZvaWNlIGJ1ZmZlciBpcyBhY3R1YWxseSBhIHNldCBvZiBkaXNqb2ludGVkIG1lbW9yeSBwYWdlcy4KKyAqCisgKi8KK3N0YXRpYyB2b2lkIGNvcHlfaWx2X2Jsb2NrKHN0cnVjdCB3b2luc3QgKndvaW5zdCwgdTMyIHN0ciwgdTggX191c2VyICpzcmMsIHUzMiBsZW4pIAoreworICAgICAgICB1bnNpZ25lZCBpbnQgcGc7CisJdW5zaWduZWQgaW50IHBnb2ZmOworCXVuc2lnbmVkIGludCB2b2ljZV9udW07CisJc3RydWN0IGVtdV92b2ljZSAqdm9pY2UgPSB3b2luc3QtPnZvaWNlOworCisJcGcgPSBzdHIgLyBQQUdFX1NJWkU7CisJcGdvZmYgPSBzdHIgJSBQQUdFX1NJWkU7CisKKwl3aGlsZSAobGVuKSB7IAorCQlmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspIHsKKwkJCWlmIChfX2NvcHlfZnJvbV91c2VyKCh1OCAqKSh2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSkgKyBwZ29mZiwgc3JjLCB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlKSkKKwkJCQlyZXR1cm47CisJCQlzcmMgKz0gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKKwkJfQorCisJCWxlbiAtPSB3b2luc3QtPmZvcm1hdC5ieXRlc3BlcnZvaWNlc2FtcGxlOworCisJCXBnb2ZmICs9IHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGU7CisJCWlmIChwZ29mZiA+PSBQQUdFX1NJWkUpIHsKKwkJCXBnb2ZmID0gMDsKKwkJCXBnKys7CisJCX0KKwl9Cit9CisKKy8qKgorICogZmlsbF9ibG9jayAtCisgKgorICogZmlsbHMgYSBzZXQgdm9pY2UgYnVmZmVycyB3aXRoIGEgYmxvY2sgb2YgYSBnaXZlbiBzYW1wbGUuCisgKgorICovCitzdGF0aWMgdm9pZCBmaWxsX2Jsb2NrKHN0cnVjdCB3b2luc3QgKndvaW5zdCwgdTMyIHN0ciwgdTggZGF0YSwgdTMyIGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgcGc7CisJdW5zaWduZWQgaW50IHBnb2ZmOworCXVuc2lnbmVkIGludCB2b2ljZV9udW07CisgICAgICAgIHN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlID0gd29pbnN0LT52b2ljZTsKKwl1bnNpZ25lZCBpbnQgIGs7CisKKwlwZyA9IHN0ciAvIFBBR0VfU0laRTsKKwlwZ29mZiA9IHN0ciAlIFBBR0VfU0laRTsKKworCWlmIChsZW4gPiBQQUdFX1NJWkUgLSBwZ29mZikgeworCQlrID0gUEFHRV9TSVpFIC0gcGdvZmY7CisJCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKKwkJCW1lbXNldCgodTggKil2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSArIHBnb2ZmLCBkYXRhLCBrKTsKKwkJbGVuIC09IGs7CisJCXdoaWxlIChsZW4gPiBQQUdFX1NJWkUpIHsKKwkJCXBnKys7CisJCQlmb3IgKHZvaWNlX251bSA9IDA7IHZvaWNlX251bSA8IHdvaW5zdC0+bnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspCisJCQkJbWVtc2V0KHZvaWNlW3ZvaWNlX251bV0ubWVtLmFkZHJbcGddLCBkYXRhLCBQQUdFX1NJWkUpOworCisJCQlsZW4gLT0gUEFHRV9TSVpFOworCQl9CisJCXBnKys7CisJCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKKwkJCW1lbXNldCh2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSwgZGF0YSwgbGVuKTsKKworCX0gZWxzZSB7CisJCWZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgd29pbnN0LT5udW1fdm9pY2VzOyB2b2ljZV9udW0rKykKKwkJCW1lbXNldCgodTggKil2b2ljZVt2b2ljZV9udW1dLm1lbS5hZGRyW3BnXSArIHBnb2ZmLCBkYXRhLCBsZW4pOworCX0KK30KKworLyoqCisgKiBlbXUxMGsxX3dhdmVvdXRfeGZlcmRhdGEgLQorICoKKyAqIGNvcGllcyBwY20gZGF0YSB0byB0aGUgdm9pY2UgYnVmZmVyLiBTaWxlbmNlIHNhbXBsZXMKKyAqIHByZXZpb3VzbHkgYWRkZWQgdG8gdGhlIGJ1ZmZlciBhcmUgb3ZlcndyaXR0ZW4uCisgKgorICovCit2b2lkIGVtdTEwazFfd2F2ZW91dF94ZmVyZGF0YShzdHJ1Y3Qgd29pbnN0ICp3b2luc3QsIHU4IF9fdXNlciAqZGF0YSwgdTMyICpzaXplKQoreworCXN0cnVjdCB3YXZlb3V0X2J1ZmZlciAqYnVmZmVyID0gJndvaW5zdC0+YnVmZmVyOworCXN0cnVjdCB2b2ljZV9tZW0gKm1lbSA9ICZ3b2luc3QtPnZvaWNlWzBdLm1lbTsKKwl1MzIgc2l6ZXRvY29weSwgc2l6ZXRvY29weV9ub3csIHN0YXJ0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzaXpldG9jb3B5ID0gbWluX3QodTMyLCBidWZmZXItPnNpemUsICpzaXplKTsKKwkqc2l6ZSA9IHNpemV0b2NvcHk7CisKKwlpZiAoIXNpemV0b2NvcHkpCisJCXJldHVybjsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJc3RhcnQgPSAoYnVmZmVyLT5zaXplICsgYnVmZmVyLT5zaWxlbmNlX3BvcyAtIGJ1ZmZlci0+c2lsZW5jZV9ieXRlcykgJSBidWZmZXItPnNpemU7CisKKwlpZiAoc2l6ZXRvY29weSA+IGJ1ZmZlci0+c2lsZW5jZV9ieXRlcykgeworCQlidWZmZXItPnNpbGVuY2VfcG9zICs9IHNpemV0b2NvcHkgLSBidWZmZXItPnNpbGVuY2VfYnl0ZXM7CisJCWJ1ZmZlci0+ZnJlZV9ieXRlcyAtPSBzaXpldG9jb3B5IC0gYnVmZmVyLT5zaWxlbmNlX2J5dGVzOworCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgPSAwOworCX0gZWxzZQorCQlidWZmZXItPnNpbGVuY2VfYnl0ZXMgLT0gc2l6ZXRvY29weTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvaW5zdC0+bG9jaywgZmxhZ3MpOworCisJc2l6ZXRvY29weV9ub3cgPSBidWZmZXItPnNpemUgLSBzdGFydDsKKwlpZiAoc2l6ZXRvY29weSA+IHNpemV0b2NvcHlfbm93KSB7CisJCXNpemV0b2NvcHkgLT0gc2l6ZXRvY29weV9ub3c7CisJCWlmICh3b2luc3QtPm51bV92b2ljZXMgPiAxKSB7CisJCQljb3B5X2lsdl9ibG9jayh3b2luc3QsIHN0YXJ0LCBkYXRhLCBzaXpldG9jb3B5X25vdyk7CisJCQljb3B5X2lsdl9ibG9jayh3b2luc3QsIDAsIGRhdGEgKyBzaXpldG9jb3B5X25vdyAqIHdvaW5zdC0+bnVtX3ZvaWNlcywgc2l6ZXRvY29weSk7CisJCX0gZWxzZSB7CisJCQljb3B5X2Jsb2NrKG1lbS0+YWRkciwgc3RhcnQsIGRhdGEsIHNpemV0b2NvcHlfbm93KTsKKwkJCWNvcHlfYmxvY2sobWVtLT5hZGRyLCAwLCBkYXRhICsgc2l6ZXRvY29weV9ub3csIHNpemV0b2NvcHkpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHdvaW5zdC0+bnVtX3ZvaWNlcyA+IDEpCisJCQljb3B5X2lsdl9ibG9jayh3b2luc3QsIHN0YXJ0LCBkYXRhLCBzaXpldG9jb3B5KTsKKwkJZWxzZQorCQkJY29weV9ibG9jayhtZW0tPmFkZHIsIHN0YXJ0LCBkYXRhLCBzaXpldG9jb3B5KTsKKwl9Cit9CisKKy8qKgorICogZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlIC0KKyAqCisgKiBhZGRzIHNhbXBsZXMgb2Ygc2lsZW5jZSB0byB0aGUgdm9pY2UgYnVmZmVyIHNvIHRoYXQgd2UKKyAqIGRvbid0IGxvb3Agb3ZlciBzdGFsZSBwY20gZGF0YS4KKyAqCisgKi8KK3ZvaWQgZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlKHN0cnVjdCB3b2luc3QgKndvaW5zdCkKK3sKKwlzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgKmJ1ZmZlciA9ICZ3b2luc3QtPmJ1ZmZlcjsKKwl1MzIgc2l6ZXRvY29weSwgc2l6ZXRvY29weV9ub3csIHN0YXJ0OworCXU4IGZpbGxkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzaXpldG9jb3B5ID0gYnVmZmVyLT5mcmFnbWVudF9zaXplOworCisJaWYgKHdvaW5zdC0+Zm9ybWF0LmJpdHNwZXJjaGFubmVsID09IDE2KQorCQlmaWxsZGF0YSA9IDB4MDA7CisJZWxzZQorCQlmaWxsZGF0YSA9IDB4ODA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd29pbnN0LT5sb2NrLCBmbGFncyk7CisJYnVmZmVyLT5zaWxlbmNlX2J5dGVzICs9IHNpemV0b2NvcHk7CisJYnVmZmVyLT5mcmVlX2J5dGVzIC09IHNpemV0b2NvcHk7CisJYnVmZmVyLT5zaWxlbmNlX3BvcyAlPSBidWZmZXItPnNpemU7CisJc3RhcnQgPSBidWZmZXItPnNpbGVuY2VfcG9zOworCWJ1ZmZlci0+c2lsZW5jZV9wb3MgKz0gc2l6ZXRvY29weTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b2luc3QtPmxvY2ssIGZsYWdzKTsKKworCXNpemV0b2NvcHlfbm93ID0gYnVmZmVyLT5zaXplIC0gc3RhcnQ7CisKKwlpZiAoc2l6ZXRvY29weSA+IHNpemV0b2NvcHlfbm93KSB7CisJCXNpemV0b2NvcHkgLT0gc2l6ZXRvY29weV9ub3c7CisJCWZpbGxfYmxvY2sod29pbnN0LCBzdGFydCwgZmlsbGRhdGEsIHNpemV0b2NvcHlfbm93KTsKKwkJZmlsbF9ibG9jayh3b2luc3QsIDAsIGZpbGxkYXRhLCBzaXpldG9jb3B5KTsKKwl9IGVsc2UgeworCQlmaWxsX2Jsb2NrKHdvaW5zdCwgc3RhcnQsIGZpbGxkYXRhLCBzaXpldG9jb3B5KTsKKwl9Cit9CisKKy8qKgorICogZW11MTBrMV93YXZlb3V0X3VwZGF0ZSAtCisgKgorICogdXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHZvaWNlIGJ1ZmZlciBoYXJkd2FyZSBwb2ludGVyIChod19wb3MpCisgKiBhbmQgdGhlIG51bWJlciBvZiBmcmVlIGJ5dGVzIG9uIHRoZSBidWZmZXIgKGZyZWVfYnl0ZXMpLgorICogVGhlIGZyZWUgYnl0ZXMgX2Rvbid0XyBpbmNsdWRlIHNpbGVuY2UgYnl0ZXMgdGhhdCBtYXkgaGF2ZSBiZWVuCisgKiBhZGRlZCB0byB0aGUgYnVmZmVyLgorICoKKyAqLwordm9pZCBlbXUxMGsxX3dhdmVvdXRfdXBkYXRlKHN0cnVjdCB3b2luc3QgKndvaW5zdCkKK3sKKwl1MzIgaHdfcG9zOworCXUzMiBkaWZmOworCisJLyogVGhlcmUgaXMgbm8gYWN0dWFsIHN0YXJ0IHlldCAqLworCWlmICghKHdvaW5zdC0+c3RhdGUgJiBXQVZFX1NUQVRFX1NUQVJURUQpKSB7CisJCWh3X3BvcyA9IHdvaW5zdC0+YnVmZmVyLmh3X3BvczsKKwl9IGVsc2UgeworCQkvKiBod19wb3MgaW4gc2FtcGxlIHVuaXRzICovCisJCWh3X3BvcyA9IHNibGl2ZV9yZWFkcHRyKHdvaW5zdC0+dm9pY2VbMF0uY2FyZCwgQ0NDQV9DVVJSQUREUiwgd29pbnN0LT52b2ljZVswXS5udW0pOworCisJCWlmKGh3X3BvcyA8IHdvaW5zdC0+dm9pY2VbMF0uc3RhcnQpCisJCQlod19wb3MgKz0gd29pbnN0LT5idWZmZXIuc2l6ZSAvIHdvaW5zdC0+Zm9ybWF0LmJ5dGVzcGVydm9pY2VzYW1wbGUgLSB3b2luc3QtPnZvaWNlWzBdLnN0YXJ0OworCQllbHNlCisJCQlod19wb3MgLT0gd29pbnN0LT52b2ljZVswXS5zdGFydDsKKworCQlod19wb3MgKj0gd29pbnN0LT5mb3JtYXQuYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKKwl9CisKKwlkaWZmID0gKHdvaW5zdC0+YnVmZmVyLnNpemUgKyBod19wb3MgLSB3b2luc3QtPmJ1ZmZlci5od19wb3MpICUgd29pbnN0LT5idWZmZXIuc2l6ZTsKKwl3b2luc3QtPnRvdGFsX3BsYXllZCArPSBkaWZmOworCXdvaW5zdC0+YnVmZmVyLmZyZWVfYnl0ZXMgKz0gZGlmZjsKKwl3b2luc3QtPmJ1ZmZlci5od19wb3MgPSBod19wb3M7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uaCBiL3NvdW5kL29zcy9lbXUxMGsxL2NhcmR3by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZWNlODgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9jYXJkd28uaApAQCAtMCwwICsxLDkwIEBACisvKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIGNhcmR3by5oIC0tIGhlYWRlciBmaWxlIGZvciBjYXJkIHdhdmUgb3V0IGZ1bmN0aW9ucworICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAorICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKKyAqICAgICBVU0EuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqLworCisjaWZuZGVmIF9DQVJEV09fSAorI2RlZmluZSBfQ0FSRFdPX0gKKworI2luY2x1ZGUgImljYXJkd2F2LmgiCisjaW5jbHVkZSAiYXVkaW8uaCIKKyNpbmNsdWRlICJ2b2ljZW1nci5oIgorI2luY2x1ZGUgInRpbWVyLmgiCisKKy8qIHNldHRpbmcgdGhpcyB0byBvdGhlciB0aGFuIGEgcG93ZXIgb2YgdHdvIG1heSBicmVhayBzb21lIGFwcGxpY2F0aW9ucyAqLworI2RlZmluZSBXQVZFT1VUX01BWEJVRlNJWkUJTUFYQlVGU0laRQorCisjZGVmaW5lIFdBVkVPVVRfREVGQVVMVEZSQUdMRU4JMjAgLyogVGltZSB0byBwbGF5IGEgZnJhZ21lbnQgaW4gbXMgKGxhdGVuY3kpICovCisjZGVmaW5lIFdBVkVPVVRfREVGQVVMVEJVRkxFTgk1MDAgLyogVGltZSB0byBwbGF5IHRoZSBlbnRpcmUgYnVmZmVyIGluIG1zICovCisKKyNkZWZpbmUgV0FWRU9VVF9NSU5GUkFHU0hJRlQJNiAvKiBNaW5pbXVtIGZyYWdtZW50IHNpemUgaW4gYnl0ZXMgaXMgMl42ICovCisjZGVmaW5lIFdBVkVPVVRfTUlORlJBR1MJMyAvKiBfZG9uJ3RfIGdvIGJlbGxvdyAzLCBpdCB3b3VsZCBicmVhayBzaWxlbmNlIGZpbGxpbmcgKi8KKyNkZWZpbmUgV0FWRU9VVF9NQVhWT0lDRVMJNgorCitzdHJ1Y3Qgd2F2ZW91dF9idWZmZXIgeworCXUxNiBvc3NmcmFnc2hpZnQ7CisJdTMyIG51bWZyYWdzOworCXUzMiBmcmFnbWVudF9zaXplOwkvKiBpbiBieXRlcyB1bml0cyAqLworCXUzMiBzaXplOwkJLyogaW4gYnl0ZXMgdW5pdHMgKi8KKwl1MzIgcGFnZXM7CQkvKiBidWZmZXIgc2l6ZSBpbiBwYWdlIHVuaXRzKi8KKwl1MzIgc2lsZW5jZV9wb3M7CS8qIHNvZnR3YXJlIGN1cnNvciBwb3NpdGlvbiAoaW5jbHVkaW5nIHNpbGVuY2UgYnl0ZXMpICovCisJdTMyIGh3X3BvczsJCS8qIGhhcmR3YXJlIGN1cnNvciBwb3NpdGlvbiAqLworCXUzMiBmcmVlX2J5dGVzOwkJLyogZnJlZSBieXRlcyBhdmFpbGFibGUgb24gdGhlIGJ1ZmZlciAobm90IGluY2x1ZGluZyBzaWxlbmNlIGJ5dGVzKSAqLworCXU4IGZpbGxfc2lsZW5jZTsKKwl1MzIgc2lsZW5jZV9ieXRlczsgICAgICAvKiBzaWxlbmNlIGJ5dGVzIG9uIHRoZSBidWZmZXIgKi8KK307CisKK3N0cnVjdCB3b2luc3QgCit7CisJdTggc3RhdGU7CisJdTggbnVtX3ZvaWNlczsKKwlzdHJ1Y3QgZW11X3ZvaWNlIHZvaWNlW1dBVkVPVVRfTUFYVk9JQ0VTXTsKKwlzdHJ1Y3QgZW11X3RpbWVyIHRpbWVyOworCXN0cnVjdCB3YXZlX2Zvcm1hdCBmb3JtYXQ7CisJc3RydWN0IHdhdmVvdXRfYnVmZmVyIGJ1ZmZlcjsKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0X3F1ZXVlOworCXU4IG1tYXBwZWQ7CisJdTMyIHRvdGFsX2NvcGllZDsJLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4oKSB0byB0aGUgYnVmZmVyIChleGNsdWRpbmcgc2lsZW5jZSkgKi8KKwl1MzIgdG90YWxfcGxheWVkOwkvKiB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcGxheWVkIGluY2x1ZGluZyBzaWxlbmNlICovCisJdTMyIGJsb2NrczsKKwl1OCBkZXZpY2U7CisJc3BpbmxvY2tfdCBsb2NrOworfTsKKworaW50IGVtdTEwazFfd2F2ZW91dF9vcGVuKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKik7Cit2b2lkIGVtdTEwazFfd2F2ZW91dF9jbG9zZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICopOwordm9pZCBlbXUxMGsxX3dhdmVvdXRfc3RhcnQoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKK3ZvaWQgZW11MTBrMV93YXZlb3V0X3N0b3Aoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKTsKK3ZvaWQgZW11MTBrMV93YXZlb3V0X2dldHhmZXJzaXplKHN0cnVjdCB3b2luc3QqLCB1MzIgKik7Cit2b2lkIGVtdTEwazFfd2F2ZW91dF94ZmVyZGF0YShzdHJ1Y3Qgd29pbnN0KiwgdTggX191c2VyICosIHUzMiAqKTsKK3ZvaWQgZW11MTBrMV93YXZlb3V0X2ZpbGxzaWxlbmNlKHN0cnVjdCB3b2luc3QqKTsKK2ludCBlbXUxMGsxX3dhdmVvdXRfc2V0Zm9ybWF0KHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UqLCBzdHJ1Y3Qgd2F2ZV9mb3JtYXQqKTsKK3ZvaWQgZW11MTBrMV93YXZlb3V0X3VwZGF0ZShzdHJ1Y3Qgd29pbnN0Kik7CisKKyNlbmRpZiAvKiBfQ0FSRFdPX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZTYzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9lY2FyZC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIGVjYXJkLmMgLSBFLWNhcmQgaW5pdGlhbGl6YXRpb24gY29kZQorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAorICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKKyAqICAgICBVU0EuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqLyAKKworI2luY2x1ZGUgImVjYXJkLmgiCisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKworLyogUHJpdmF0ZSByb3V0aW5lcyAqLworc3RhdGljIHZvaWQgZWNhcmRfc2V0YWRjZ2FpbihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCBlY2FyZF9zdGF0ZSAqLCB1MTYpOworc3RhdGljIHZvaWQgZWNhcmRfd3JpdGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmdW5jIFNldCB0aGUgZ2FpbiBvZiB0aGUgRUNBUkQncyBDUzMzMTAgVHJpbS9nYWluIGNvbnRyb2xsZXIuICBUaGUKKyAqIHRyaW0gdmFsdWUgY29uc2lzdHMgb2YgYSAxNmJpdCB2YWx1ZSB3aGljaCBpcyBjb21wb3NlZCBvZiB0d28KKyAqIDggYml0IGdhaW4vdHJpbSB2YWx1ZXMsIG9uZSBmb3IgdGhlIGxlZnQgY2hhbm5lbCBhbmQgb25lIGZvciB0aGUKKyAqIHJpZ2h0IGNoYW5uZWwuICBUaGUgZm9sbG93aW5nIHRhYmxlIG1hcHMgZnJvbSB0aGUgR2Fpbi9BdHRlbnVhdGlvbgorICogdmFsdWUgaW4gZGVjaWJlbHMgaW50byB0aGUgY29ycmVzcG9uZGluZyBiaXQgcGF0dGVybiBmb3IgYSBzaW5nbGUKKyAqIGNoYW5uZWwuCisgKi8KKworc3RhdGljIHZvaWQgZWNhcmRfc2V0YWRjZ2FpbihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZWNhcmRfc3RhdGUgKmVjYXJkLCB1MTYgZ2FpbikKK3sKKwl1MzIgY3VycmJpdDsKKwllY2FyZC0+YWRjX2dhaW4gPSBnYWluOworCisJLyogRW5hYmxlIHdyaXRpbmcgdG8gdGhlIFRSSU0gcmVnaXN0ZXJzICovCisJZWNhcmRfd3JpdGUoY2FyZCwgZWNhcmQtPmNvbnRyb2xfYml0cyAmIH5FQ19UUklNX0NTTik7CisKKwkvKiBEbyBpdCBhZ2FpbiB0byBpbnN1cmUgdGhhdCB3ZSBtZWV0IGhvbGQgdGltZSByZXF1aXJlbWVudHMgKi8KKwllY2FyZF93cml0ZShjYXJkLCBlY2FyZC0+Y29udHJvbF9iaXRzICYgfkVDX1RSSU1fQ1NOKTsKKworCWZvciAoY3VycmJpdCA9ICgxTCA8PCAxNSk7IGN1cnJiaXQ7IGN1cnJiaXQgPj49IDEpIHsKKworCQl1MzIgdmFsdWUgPSBlY2FyZC0+Y29udHJvbF9iaXRzICYgfihFQ19UUklNX0NTTnxFQ19UUklNX1NEQVRBKTsKKworCQlpZiAoZ2FpbiAmIGN1cnJiaXQpCisJCSAgICAgIHZhbHVlIHw9IEVDX1RSSU1fU0RBVEE7CisKKwkJLyogQ2xvY2sgdGhlIGJpdCAqLworCQllY2FyZF93cml0ZShjYXJkLCB2YWx1ZSk7CisJCWVjYXJkX3dyaXRlKGNhcmQsIHZhbHVlIHwgRUNfVFJJTV9TQ0xLKTsKKwkJZWNhcmRfd3JpdGUoY2FyZCwgdmFsdWUpOworCX0KKworCWVjYXJkX3dyaXRlKGNhcmQsIGVjYXJkLT5jb250cm9sX2JpdHMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEBmdW5jIENsb2NrIGJpdHMgaW50byB0aGUgRWNhcmQncyBjb250cm9sIGxhdGNoLiAgVGhlIEVjYXJkIHVzZXMgYQorICogIGNvbnRyb2wgbGF0Y2ggd2lsbCBpcyBsb2FkZWQgYml0LXNlcmlhbGx5IGJ5IHRvZ2dsaW5nIHRoZSBNb2RlbSBjb250cm9sCisgKiAgbGluZXMgZnJvbSBmdW5jdGlvbiAyIG9uIHRoZSBFODAxMC4gIFRoaXMgZnVuY3Rpb24gaGlkZXMgdGhlc2UgZGV0YWlscworICogIGFuZCBwcmVzZW50cyB0aGUgaWxsdXNpb24gdGhhdCB3ZSBhcmUgYWN0dWFsbHkgd3JpdGluZyB0byBhIGRpc3RpbmN0CisgKiAgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyB2b2lkIGVjYXJkX3dyaXRlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiB2YWx1ZSkKK3sKKwl1MTYgY291bnQ7CisJdTMyIGRhdGEsIGhjdmFsdWU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwloY3ZhbHVlID0gaW5sKGNhcmQtPmlvYmFzZSArIEhDRkcpICYgfihIT09LTl9CSVR8SEFORE5fQklUfFBVTFNFTl9CSVQpOworCisJb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlKTsKKworCWZvciAoY291bnQgPSAwIDsgY291bnQgPCBFQ19OVU1fQ09OVFJPTF9CSVRTOyBjb3VudCsrKSB7CisJCisJCS8qIFNldCB1cCB0aGUgdmFsdWUgKi8KKwkJZGF0YSA9ICgodmFsdWUgJiAweDEpID8gUFVMU0VOX0JJVCA6IDApOworCQl2YWx1ZSA+Pj0gMTsKKworCQlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUgfCBkYXRhKTsKKworCQkvKiBDbG9jayB0aGUgc2hpZnQgcmVnaXN0ZXIgKi8KKwkJb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlIHwgZGF0YSB8IEhBTkROX0JJVCk7CisJCW91dGwoY2FyZC0+aW9iYXNlICsgSENGRywgaGN2YWx1ZSB8IGRhdGEpOworCX0KKworCS8qIExhdGNoIHRoZSBiaXRzICovCisJb3V0bChjYXJkLT5pb2Jhc2UgKyBIQ0ZHLCBoY3ZhbHVlIHwgSE9PS05fQklUKTsKKwlvdXRsKGNhcmQtPmlvYmFzZSArIEhDRkcsIGhjdmFsdWUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkIF9fZGV2aW5pdCBlbXUxMGsxX2VjYXJkX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwl1MzIgaGN2YWx1ZTsKKwlzdHJ1Y3QgZWNhcmRfc3RhdGUgZWNhcmQ7CisKKwkvKiBTZXQgdXAgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKwllY2FyZC5tdXgwX3NldHRpbmcgPSBFQ19ERUZBVUxUX1NQRElGMF9TRUw7CisJZWNhcmQubXV4MV9zZXR0aW5nID0gRUNfREVGQVVMVF9TUERJRjFfU0VMOworCWVjYXJkLm11eDJfc2V0dGluZyA9IDA7CisJZWNhcmQuYWRjX2dhaW4gPSBFQ19ERUZBVUxUX0FEQ19HQUlOOworCWVjYXJkLmNvbnRyb2xfYml0cyA9IEVDX1JBV19SVU5fTU9ERSB8IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFQ19TUERJRjBfU0VMRUNUKGVjYXJkLm11eDBfc2V0dGluZykgfAorCQkJICAgICBFQ19TUERJRjFfU0VMRUNUKGVjYXJkLm11eDFfc2V0dGluZyk7CisKKworCS8qIFN0ZXAgMDogU2V0IHRoZSBjb2RlYyB0eXBlIGluIHRoZSBoYXJkd2FyZSBjb250cm9sIHJlZ2lzdGVyIAorCSAqIGFuZCBlbmFibGUgYXVkaW8gb3V0cHV0ICovCisJaGN2YWx1ZSA9IGVtdTEwazFfcmVhZGZuMChjYXJkLCBIQ0ZHKTsKKwllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIGhjdmFsdWUgfCBIQ0ZHX0FVRElPRU5BQkxFIHwgSENGR19DT0RFQ0ZPUk1BVF9JMlMpOworCisJLyogU3RlcCAxOiBUdXJuIG9mZiB0aGUgbGVkIGFuZCBkZWFzc2VydCBUUklNX0NTICovCisJZWNhcmRfd3JpdGUoY2FyZCwgRUNfQURDQ0FMIHwgRUNfTEVETiB8IEVDX1RSSU1fQ1NOKTsKKworCS8qIFN0ZXAgMjogQ2FsaWJyYXRlIHRoZSBBREMgYW5kIERBQyAqLworCWVjYXJkX3dyaXRlKGNhcmQsIEVDX0RBQ0NBTCB8IEVDX0xFRE4gfCBFQ19UUklNX0NTTik7CisKKwkvKiBTdGVwIDM6IFdhaXQgZm9yIGF3aGlsZTsgRklYTUU6IElzIHRoaXMgY29ycmVjdD8gKi8KKworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlX3RpbWVvdXQoSFopOworCisJLyogU3RlcCA0OiBTd2l0Y2ggb2ZmIHRoZSBEQUMgYW5kIEFEQyBjYWxpYnJhdGlvbi4gIE5vdGUKKwkgKiBUaGF0IEFEQ19DQUwgaXMgYWN0dWFsbHkgYW4gaW52ZXJ0ZWQgc2lnbmFsLCBzbyB3ZSBhc3NlcnQKKwkgKiBpdCBoZXJlIHRvIHN0b3AgY2FsaWJyYXRpb24uICAqLworCWVjYXJkX3dyaXRlKGNhcmQsIEVDX0FEQ0NBTCB8IEVDX0xFRE4gfCBFQ19UUklNX0NTTik7CisKKwkvKiBTdGVwIDQ6IFN3aXRjaCBpbnRvIHJ1biBtb2RlICovCisJZWNhcmRfd3JpdGUoY2FyZCwgZWNhcmQuY29udHJvbF9iaXRzKTsKKworCS8qIFN0ZXAgNTogU2V0IHRoZSBhbmFsb2cgaW5wdXQgZ2FpbiAqLworCWVjYXJkX3NldGFkY2dhaW4oY2FyZCwgJmVjYXJkLCBlY2FyZC5hZGNfZ2Fpbik7Cit9CisKKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZWNhcmQuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdhZWFkMQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2VjYXJkLmgKQEAgLTAsMCArMSwxMTMgQEAKKy8qICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgZWNhcmQuaAorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCisgKiAgICAgVVNBLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKi8gCisKKyNpZm5kZWYgX0VDQVJEX0gKKyNkZWZpbmUgX0VDQVJEX0gKKworI2luY2x1ZGUgIjgwMTAuaCIKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKworLyogSW4gQTEgU2lsaWNvbiwgdGhlc2UgYml0cyBhcmUgaW4gdGhlIEhDIHJlZ2lzdGVyICovCisjZGVmaW5lIEhPT0tOX0JJVCAgICgxTCA8PCAxMikKKyNkZWZpbmUgSEFORE5fQklUICAgKDFMIDw8IDExKQorI2RlZmluZSBQVUxTRU5fQklUICAoMUwgPDwgMTApCisKKyNkZWZpbmUgRUNfR0RJMSAoMSA8PCAxMykKKyNkZWZpbmUgRUNfR0RJMCAoMSA8PCAxNCkKKworI2RlZmluZSBFQ19OVU1fQ09OVFJPTF9CSVRTIDIwCisKKyNkZWZpbmUgRUNfQUMzX0RBVEFfU0VMTiAgMHgwMDAxTAorI2RlZmluZSBFQ19FRV9EQVRBX1NFTCAgICAweDAwMDJMCisjZGVmaW5lIEVDX0VFX0NOVFJMX1NFTE4gIDB4MDAwNEwKKyNkZWZpbmUgRUNfRUVDTEsgICAgICAgICAgMHgwMDA4TAorI2RlZmluZSBFQ19FRUNTICAgICAgICAgICAweDAwMTBMCisjZGVmaW5lIEVDX0VFU0RPICAgICAgICAgIDB4MDAyMEwKKyNkZWZpbmUgRUNfVFJJTV9DU04JICAweDAwNDBMCisjZGVmaW5lIEVDX1RSSU1fU0NMSwkgIDB4MDA4MEwKKyNkZWZpbmUgRUNfVFJJTV9TREFUQQkgIDB4MDEwMEwKKyNkZWZpbmUgRUNfVFJJTV9NVVRFTgkgIDB4MDIwMEwKKyNkZWZpbmUgRUNfQURDQ0FMCSAgMHgwNDAwTAorI2RlZmluZSBFQ19BRENSU1ROCSAgMHgwODAwTAorI2RlZmluZSBFQ19EQUNDQUwJICAweDEwMDBMCisjZGVmaW5lIEVDX0RBQ01VVEVOCSAgMHgyMDAwTAorI2RlZmluZSBFQ19MRUROCQkgIDB4NDAwMEwKKworI2RlZmluZSBFQ19TUERJRjBfU0VMX1NISUZUCTE1CisjZGVmaW5lIEVDX1NQRElGMV9TRUxfU0hJRlQJMTcJCisjZGVmaW5lIEVDX1NQRElGMF9TRUxfTUFTSwkoMHgzTCA8PCBFQ19TUERJRjBfU0VMX1NISUZUKQorI2RlZmluZSBFQ19TUERJRjFfU0VMX01BU0sJKDB4N0wgPDwgRUNfU1BESUYxX1NFTF9TSElGVCkKKyNkZWZpbmUgRUNfU1BESUYwX1NFTEVDVChfeCkgKCgoX3gpIDw8IEVDX1NQRElGMF9TRUxfU0hJRlQpICYgRUNfU1BESUYwX1NFTF9NQVNLKQorI2RlZmluZSBFQ19TUERJRjFfU0VMRUNUKF94KSAoKChfeCkgPDwgRUNfU1BESUYxX1NFTF9TSElGVCkgJiBFQ19TUERJRjFfU0VMX01BU0spCisjZGVmaW5lIEVDX0NVUlJFTlRfUFJPTV9WRVJTSU9OIDB4MDEgLyogU2VsZi1leHBsYW5hdG9yeS4gIFRoaXMgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYmUgaW5jcmVtZW50ZWQgYW55IHRpbWUgdGhlIEVFUFJPTSdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9ybWF0IGlzIGNoYW5nZWQuICAqLworCisjZGVmaW5lIEVDX0VFUFJPTV9TSVpFCSAgICAgICAgMHg0MCAvKiBFQ0FSRCBFRVBST00gaGFzIDY0IDE2LWJpdCB3b3JkcyAqLworCisvKiBBZGRyZXNzZXMgZm9yIHNwZWNpYWwgdmFsdWVzIHN0b3JlZCBpbiB0byBFRVBST00gKi8KKyNkZWZpbmUgRUNfUFJPTV9WRVJTSU9OX0FERFIJMHgyMAkvKiBBZGRyZXNzIG9mIHRoZSBjdXJyZW50IHByb20gdmVyc2lvbiAqLworI2RlZmluZSBFQ19CT0FSRFJFVjBfQUREUgkweDIxCS8qIExTVyBvZiBib2FyZCByZXYgKi8KKyNkZWZpbmUgRUNfQk9BUkRSRVYxX0FERFIgCTB4MjIJLyogTVNXIG9mIGJvYXJkIHJldiAqLyAKKworI2RlZmluZSBFQ19MQVNUX1BST01GSUxFX0FERFIJMHgyZgorCisjZGVmaW5lIEVDX1NFUklBTE5VTV9BREQJMHgzMAkvKiBGaXJzdCB3b3JkIG9mIHNlcmlhbCBudW1iZXIuICBUaGUgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogY2FuIGJlIHVwIHRvIDMwIGNoYXJhY3RlcnMgaW4gbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGlzIHN0b3JlZCBhcyBhIE5VTEwtdGVybWluYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEFTQ0lJIHN0cmluZy4gIEFueSB1bnVzZWQgYnl0ZXMgbXVzdCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGZpbGxlZCB3aXRoIHplcm9zICovCisjZGVmaW5lIEVDX0NIRUNLU1VNX0FERFIJMHgzZiAgICAvKiBMb2NhdGlvbiBhdCB3aGljaCBjaGVja3N1bSBpcyBzdG9yZWQgKi8KKworCisKKy8qIE1vc3Qgb2YgdGhpcyBzdHVmZiBpcyBwcmV0dHkgc2VsZi1ldmlkZW50LiAgQWNjb3JkaW5nIHRvIHRoZSBoYXJkd2FyZSAKKyAqIGR1ZGVzLCB3ZSBuZWVkIHRvIGxlYXZlIHRoZSBBRENDQUwgYml0IGxvdyBpbiBvcmRlciB0byBhdm9pZCBhIERDIAorICogb2Zmc2V0IHByb2JsZW0uICBXZWlyZC4KKyAqLworI2RlZmluZSBFQ19SQVdfUlVOX01PREUJKEVDX0RBQ01VVEVOIHwgRUNfQURDUlNUTiB8IEVDX1RSSU1fTVVURU4gfCBFQ19UUklNX0NTTikKKworCisjZGVmaW5lIEVDX0RFRkFVTFRfQURDX0dBSU4gICAweEM0QzQKKyNkZWZpbmUgRUNfREVGQVVMVF9TUERJRjBfU0VMIDB4MAorI2RlZmluZSBFQ19ERUZBVUxUX1NQRElGMV9TRUwgMHg0CisKKyNkZWZpbmUgSENfRUEgMHgwMUwKKworLyogRUNBUkQgc3RhdGUgc3RydWN0dXJlLiAgVGhpcyBzdHJ1Y3R1cmUgbWFpbnRhaW5zIHRoZSBzdGF0ZQorICogZm9yIHZhcmlvdXMgcG9ydGlvbnMgb2YgdGhlIEVDQVJEJ3Mgb25ib2FyZCBoYXJkd2FyZS4KKyAqLworc3RydWN0IGVjYXJkX3N0YXRlIHsKKwl1MzIgY29udHJvbF9iaXRzOworCXUxNiBhZGNfZ2FpbjsKKwl1MTYgbXV4MF9zZXR0aW5nOworCXUxNiBtdXgxX3NldHRpbmc7CisJdTE2IG11eDJfc2V0dGluZzsKK307CisKK3ZvaWQgZW11MTBrMV9lY2FyZF9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKikgX19kZXZpbml0OworCisjZW5kaWYgLyogX0VDQVJEX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5jIGIvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1ODY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2VmeG1nci5jCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBlZnhtZ3IuYworICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAorICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKKyAqICAgICBVU0EuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqLworCisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKyNpbmNsdWRlICJlZnhtZ3IuaCIKKworaW50IGVtdTEwazFfZmluZF9jb250cm9sX2dwcihzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqbWdyLCBjb25zdCBjaGFyICpwYXRjaF9uYW1lLCBjb25zdCBjaGFyICpncHJfbmFtZSkKK3sKKyAgICAgICAgc3RydWN0IGRzcF9wYXRjaCAqcGF0Y2g7CisJc3RydWN0IGRzcF9ycGF0Y2ggKnJwYXRjaDsKKwljaGFyIHNbUEFUQ0hfTkFNRV9TSVpFICsgNF07CisJdW5zaWduZWQgbG9uZyAqZ3ByX3VzZWQ7CisJaW50IGk7CisKKwlEUEQoMiwgImVtdTEwazFfZmluZF9jb250cm9sX2dwcigpOiAlcyAlc1xuIiwgcGF0Y2hfbmFtZSwgZ3ByX25hbWUpOworCisJcnBhdGNoID0gJm1nci0+cnBhdGNoOworCWlmICghc3RyY21wKHJwYXRjaC0+bmFtZSwgcGF0Y2hfbmFtZSkpIHsKKwkJZ3ByX3VzZWQgPSBycGF0Y2gtPmdwcl91c2VkOworCQlnb3RvIG1hdGNoOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBtZ3ItPmN1cnJlbnRfcGFnZXMgKiBQQVRDSEVTX1BFUl9QQUdFOyBpKyspIHsKKwkJcGF0Y2ggPSBQQVRDSChtZ3IsIGkpOworCQkJc3ByaW50ZihzLCIlcyIsIHBhdGNoLT5uYW1lKTsKKworCQlpZiAoIXN0cmNtcChzLCBwYXRjaF9uYW1lKSkgeworCQkJZ3ByX3VzZWQgPSBwYXRjaC0+Z3ByX3VzZWQ7CisJCQlnb3RvIG1hdGNoOworCQl9CisJfQorCisJcmV0dXJuIC0xOworCisgIG1hdGNoOgorCWZvciAoaSA9IDA7IGkgPCBOVU1fR1BSUzsgaSsrKQorCQlpZiAobWdyLT5ncHJbaV0udHlwZSA9PSBHUFJfVFlQRV9DT05UUk9MICYmCisJCSAgICB0ZXN0X2JpdChpLCBncHJfdXNlZCkgJiYKKwkJICAgICFzdHJjbXAobWdyLT5ncHJbaV0ubmFtZSwgZ3ByX25hbWUpKQorCQkJcmV0dXJuIGk7CisKKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgZW11MTBrMV9zZXRfY29udHJvbF9ncHIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgaW50IGFkZHIsIHMzMiB2YWwsIGludCBmbGFnKQoreworCXN0cnVjdCBwYXRjaF9tYW5hZ2VyICptZ3IgPSAmY2FyZC0+bWdyOworCisJRFBEKDIsICJlbXUxMGsxX3NldF9jb250cm9sX2dwcigpOiAlZCAleFxuIiwgYWRkciwgdmFsKTsKKworCWlmIChhZGRyIDwgMCB8fCBhZGRyID49IE5VTV9HUFJTKQorCQlyZXR1cm47CisKKwkvL2ZpeG1lOiBvbmNlIHBhdGNoIG1hbmFnZXIgaXMgdXAsIHJlbWVtYmVyIHRvIGZpeCB0aGlzIGZvciB0aGUgYXVkaWd5CisJaWYgKGNhcmQtPmlzX2F1ZGlneSkgeworCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9HUFJfQkFTRSArIGFkZHIsIDAsIHZhbCk7CisJfSBlbHNlIHsKKwkJaWYgKGZsYWcpCisJCQl2YWwgKz0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgR1BSX0JBU0UgKyBhZGRyLCAwKTsKKwkJaWYgKHZhbCA+IG1nci0+Z3ByW2FkZHJdLm1heCkKKwkJCXZhbCA9IG1nci0+Z3ByW2FkZHJdLm1heDsKKwkJZWxzZSBpZiAodmFsIDwgbWdyLT5ncHJbYWRkcl0ubWluKQorCQkJdmFsID0gbWdyLT5ncHJbYWRkcl0ubWluOworCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgR1BSX0JBU0UgKyBhZGRyLCAwLCB2YWwpOworCX0KKwkKKwkKK30KKworLy9UT0RPOiBtYWtlIHRoaXMgY29uZmlndXJhYmxlOgorI2RlZmluZSBWT0xDVFJMX0NIQU5ORUwgU09VTkRfTUlYRVJfVk9MVU1FCisjZGVmaW5lIFZPTENUUkxfU1RFUF9TSVpFICAgICAgICA1CisKKy8vQW4gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIHNldHRpbmcgT1NTIG1peGVyIGNvbnRyb2xzLgorc3RhdGljIHZvaWQgZW11MTBrMV9zZXRfb3NzX3ZvbChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBpbnQgb3NzX21peGVyLAorCQkJCXVuc2lnbmVkIGludCBsZWZ0LCB1bnNpZ25lZCBpbnQgcmlnaHQpCit7CisJZXh0ZXJuIGNoYXIgdm9sdW1lX3BhcmFtc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdOworCisJY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX21peGVyXSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7CisKKwlpZiAoIWNhcmQtPmlzX2FwcykKKwkJY2FyZC0+YWM5Ny0+d3JpdGVfbWl4ZXIoY2FyZC0+YWM5Nywgb3NzX21peGVyLCBsZWZ0LCByaWdodCk7CisJCisJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCBjYXJkLT5tZ3IuY3RybF9ncHJbb3NzX21peGVyXVswXSwgbGVmdCwKKwkJCSAgICAgICB2b2x1bWVfcGFyYW1zW29zc19taXhlcl0pOworCisJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCBjYXJkLT5tZ3IuY3RybF9ncHJbb3NzX21peGVyXVsxXSwgcmlnaHQsCisJCQkgICAgICAgdm9sdW1lX3BhcmFtc1tvc3NfbWl4ZXJdKTsKK30KKworLy9GSVhNRTogbXV0ZSBzaG91bGQgdW5tdXRlIHdoZW4gcHJlc3NlZCBhIHNlY29uZCB0aW1lCit2b2lkIGVtdTEwazFfbXV0ZV9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJaW50IG9zc19jaGFubmVsID0gVk9MQ1RSTF9DSEFOTkVMOworCWludCBsZWZ0LCByaWdodDsKKwlzdGF0aWMgaW50IHZhbDsKKworCWlmICh2YWwpIHsKKwkJbGVmdCA9IHZhbCAmIDB4ZmY7CisJCXJpZ2h0ID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCXZhbCA9IDA7CisJfSBlbHNlIHsKKwkJdmFsID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX2NoYW5uZWxdOworCQlsZWZ0ID0gMDsKKwkJcmlnaHQgPSAwOworCX0KKworCWVtdTEwazFfc2V0X29zc192b2woY2FyZCwgb3NzX2NoYW5uZWwsIGxlZnQsIHJpZ2h0KTsKK30KKwordm9pZCBlbXUxMGsxX3ZvbGluY3JfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCWludCBvc3NfY2hhbm5lbCA9IFZPTENUUkxfQ0hBTk5FTDsKKwlpbnQgbGVmdCwgcmlnaHQ7CisKKwlsZWZ0ID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX2NoYW5uZWxdICYgMHhmZjsKKwlyaWdodCA9IChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfY2hhbm5lbF0gPj4gOCkgJiAweGZmOworCisJaWYgKChsZWZ0ICs9IFZPTENUUkxfU1RFUF9TSVpFKSA+IDEwMCkKKwkJbGVmdCA9IDEwMDsKKworCWlmICgocmlnaHQgKz0gVk9MQ1RSTF9TVEVQX1NJWkUpID4gMTAwKQorCQlyaWdodCA9IDEwMDsKKworCWVtdTEwazFfc2V0X29zc192b2woY2FyZCwgb3NzX2NoYW5uZWwsIGxlZnQsIHJpZ2h0KTsKK30KKwordm9pZCBlbXUxMGsxX3ZvbGRlY3JfaXJxaGFuZGxlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCWludCBvc3NfY2hhbm5lbCA9IFZPTENUUkxfQ0hBTk5FTDsKKwlpbnQgbGVmdCwgcmlnaHQ7CisKKwlsZWZ0ID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbb3NzX2NoYW5uZWxdICYgMHhmZjsKKwlyaWdodCA9IChjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfY2hhbm5lbF0gPj4gOCkgJiAweGZmOworCisJaWYgKChsZWZ0IC09IFZPTENUUkxfU1RFUF9TSVpFKSA8IDApCisJCWxlZnQgPSAwOworCisJaWYgKChyaWdodCAtPSBWT0xDVFJMX1NURVBfU0laRSkgPCAwKQorCQlyaWdodCA9IDA7CisKKwllbXUxMGsxX3NldF9vc3Nfdm9sKGNhcmQsIG9zc19jaGFubmVsLCBsZWZ0LCByaWdodCk7Cit9CisKK3ZvaWQgZW11MTBrMV9zZXRfdm9sdW1lX2dwcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBpbnQgYWRkciwgczMyIHZvbCwgaW50IHNjYWxlKQoreworCXN0cnVjdCBwYXRjaF9tYW5hZ2VyICptZ3IgPSAmY2FyZC0+bWdyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzdGF0aWMgY29uc3QgczMyIGxvZzJsaW5bNF0gPXsgICAgICAgICAgIC8vICBhdHRlbnVhdGlvbiAoZEIpCisJCTB4N2ZmZmZmZmYsICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIDAuMCAgICAgICAgIAorCQkweDdmZmZmZmZmICogMC44NDA4OTY0MTUyNTM3MTUgLCAvLyAgICAgICAxLjUgICAgICAgICAgCisJCTB4N2ZmZmZmZmYgKiAwLjcwNzEwNjc4MTE4NjU0OCwgIC8vICAgICAgIDMuMAorCQkweDdmZmZmZmZmICogMC41OTQ2MDM1NTc1MDEzNjEgLCAvLyAgICAgICA0LjUKKwl9OworCisJaWYgKGFkZHIgPCAwKQorCQlyZXR1cm47CisKKwl2b2wgPSAoMTAwIC0gdm9sICkgKiBzY2FsZSAvIDEwMDsKKworCS8vIFRoYW5rcyB0byB0aGUgY29tcC5kc3AgbmV3c2dyb3VwIGZvciB0aGlzIG5lYXQgdHJpY2s6CisJdm9sID0gKHZvbCA+PSBzY2FsZSkgPyAwIDogKGxvZzJsaW5bdm9sICYgM10gPj4gKHZvbCA+PiAyKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWdyLT5sb2NrLCBmbGFncyk7CisJZW11MTBrMV9zZXRfY29udHJvbF9ncHIoY2FyZCwgYWRkciwgdm9sLCAwKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtZ3ItPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBlbXUxMGsxX2RzcF9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChjYXJkLT5wdC5zdGF0ZSAhPSBQVF9TVEFURV9JTkFDVElWRSkgeworCQl1MzIgYmM7CisJCWJjID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgR1BSX0JBU0UgKyBjYXJkLT5wdC5pbnRyX2dwciwgMCk7CisJCWlmIChiYyAhPSAwKSB7CisJCQlEUEQoMywgInB0IGludGVycnVwdCwgYmMgPSAlZFxuIiwgYmMpOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnB0LmxvY2ssIGZsYWdzKTsKKwkJCWNhcmQtPnB0LmJsb2Nrc19wbGF5ZWQgPSBiYzsKKwkJCWlmIChjYXJkLT5wdC5ibG9ja3NfcGxheWVkID49IGNhcmQtPnB0LmJsb2Nrc19jb3BpZWQpIHsKKwkJCQlEUEYoMSwgImJ1ZmZlciB1bmRlcnJ1biBpbiBwYXNzdGhyb3VnaCBwbGF5YmFja1xuIik7CisJCQkJZW11MTBrMV9wdF9zdG9wKGNhcmQpOworCQkJfQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZjYXJkLT5wdC53YWl0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnB0LmxvY2ssIGZsYWdzKTsKKwkJfQorCX0KK30KKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmggYi9zb3VuZC9vc3MvZW11MTBrMS9lZnhtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjQ4ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvZWZ4bWdyLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8qICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgc2JsaXZlX2Z4LmgKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMgCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAKKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UgCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciAKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyAKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAKKyAqIAorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyAKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIAorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgCisgKiAgICAgVVNBLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKi8KKworI2lmbmRlZiBfRUZYTUdSX0gKKyNkZWZpbmUgX0VGWE1HUl9ICisKK3N0cnVjdCBlbXVfZWZ4X2luZm9fdHsKKwlpbnQgb3Bjb2RlX3NoaWZ0OworCWludCBoaWdoX29wZXJhbmRfc2hpZnQ7CisJaW50IGluc3RydWN0aW9uX3N0YXJ0OworCWludCBncHJfYmFzZTsKKwlpbnQgb3V0cHV0X2Jhc2U7Cit9OworCisKKyNkZWZpbmUgV1JJVEVfRUZYKGEsIGIsIGMpIHNibGl2ZV93cml0ZXB0cigoYSksIGVtdV9lZnhfaW5mb1tjYXJkLT5pc19hdWRpZ3ldLmluc3RydWN0aW9uX3N0YXJ0ICsgKGIpLCAwLCAoYykpCisKKyNkZWZpbmUgT1Aob3AsIHosIHcsIHgsIHkpIFwKKwlkbyB7IFdSSVRFX0VGWChjYXJkLCAocGMpICogMiwgKCh4KSA8PCBlbXVfZWZ4X2luZm9bY2FyZC0+aXNfYXVkaWd5XS5oaWdoX29wZXJhbmRfc2hpZnQpIHwgKHkpKTsgXAorCVdSSVRFX0VGWChjYXJkLCAocGMpICogMiArIDEsICgob3ApIDw8IGVtdV9lZnhfaW5mb1tjYXJkLT5pc19hdWRpZ3ldLm9wY29kZV9zaGlmdCApIHwgKCh6KSA8PCBlbXVfZWZ4X2luZm9bY2FyZC0+aXNfYXVkaWd5XS5oaWdoX29wZXJhbmRfc2hpZnQpIHwgKHcpKTsgXAorCSsrcGM7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTlVNX0lOUFVUUyAweDIwCisjZGVmaW5lIE5VTV9PVVRQVVRTIDB4MjAKKyNkZWZpbmUgTlVNX0dQUlMgMHgxMDAKKworI2RlZmluZSBBX05VTV9JTlBVVFMgMHg2MAorI2RlZmluZSBBX05VTV9PVVRQVVRTIDB4NjAgIC8vZml4bWU6IHRoaXMgbWF5IG9yIG1heSBub3QgYmUgdHJ1ZQorI2RlZmluZSBBX05VTV9HUFJTIDB4MjAwCisKKyNkZWZpbmUgR1BSX05BTUVfU0laRSAgIDMyCisjZGVmaW5lIFBBVENIX05BTUVfU0laRSAzMgorCitzdHJ1Y3QgZHNwX3JwYXRjaCB7CisJY2hhciBuYW1lW1BBVENIX05BTUVfU0laRV07CisJdTE2IGNvZGVfc3RhcnQ7CisJdTE2IGNvZGVfc2l6ZTsKKworCXVuc2lnbmVkIGxvbmcgZ3ByX3VzZWRbTlVNX0dQUlMgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgKyAxXTsKKwl1bnNpZ25lZCBsb25nIGdwcl9pbnB1dFtOVU1fR1BSUyAvIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KSArIDFdOworCXVuc2lnbmVkIGxvbmcgcm91dGVbTlVNX09VVFBVVFNdOworCXVuc2lnbmVkIGxvbmcgcm91dGVfdltOVU1fT1VUUFVUU107Cit9OworCitzdHJ1Y3QgZHNwX3BhdGNoIHsKKwljaGFyIG5hbWVbUEFUQ0hfTkFNRV9TSVpFXTsKKwl1OCBpZDsKKwl1bnNpZ25lZCBsb25nIGlucHV0OwkvKiBiaXRtYXAgb2YgdGhlIGxpbmVzIHVzZWQgYXMgaW5wdXRzICovCisJdW5zaWduZWQgbG9uZyBvdXRwdXQ7CS8qIGJpdG1hcCBvZiB0aGUgbGluZXMgdXNlZCBhcyBvdXRwdXRzICovCisJdTE2IGNvZGVfc3RhcnQ7CisJdTE2IGNvZGVfc2l6ZTsKKworCXVuc2lnbmVkIGxvbmcgZ3ByX3VzZWRbTlVNX0dQUlMgLyAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkgKyAxXTsJLyogYml0bWFwIG9mIHVzZWQgZ3BycyAqLworCXVuc2lnbmVkIGxvbmcgZ3ByX2lucHV0W05VTV9HUFJTIC8gKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpICsgMV07CisJdTggdHJhbWxfaXN0YXJ0OwkvKiBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBpbnRlcm5hbCB0cmFtIGxpbmVzIHVzZWQgKi8KKwl1OCB0cmFtbF9pc2l6ZTsJCS8qIG51bWJlciBvZiBpbnRlcm5hbCB0cmFtIGxpbmVzIHVzZWQgKi8KKworCXU4IHRyYW1sX2VzdGFydDsKKwl1OCB0cmFtbF9lc2l6ZTsKKworCXUxNiB0cmFtYl9pc3RhcnQ7ICAgICAgICAvKiBzdGFydGluZyBhZGRyZXNzIG9mIHRoZSBpbnRlcm5hbCB0cmFtIG1lbW9yeSB1c2VkICovCisJdTE2IHRyYW1iX2lzaXplOyAgICAgICAgIC8qIGFtb3VudCBvZiBpbnRlcm5hbCBtZW1vcnkgdXNlZCAqLworCXUzMiB0cmFtYl9lc3RhcnQ7CisJdTMyIHRyYW1iX2VzaXplOworfTsKKworc3RydWN0IGRzcF9ncHIgeworCXU4IHR5cGU7CQkJLyogZ3ByIHR5cGUsIFNUQVRJQywgRFlOQU1JQywgSU5QVVQsIE9VVFBVVCwgQ09OVFJPTCAqLworCWNoYXIgbmFtZVtHUFJfTkFNRV9TSVpFXTsJLyogZ3ByIHZhbHVlLCBvbmx5IHZhbGlkIGZvciBjb250cm9sIGdwcnMgKi8KKwlzMzIgbWluLCBtYXg7CQkJLyogdmFsdWUgcmFuZ2UgZm9yIHRoaXMgZ3ByLCBvbmx5IHZhbGlkIGZvciBjb250cm9sIGdwcnMgKi8KKwl1OCBsaW5lOwkJCS8qIHdoaWNoIGlucHV0L291dHB1dCBsaW5lIGlzIHRoZSBncHIgYXR0YWNoZWQsIG9ubHkgdmFsaWQgZm9yIGlucHV0L291dHB1dCBncHJzICovCisJdTggdXNhZ2U7Cit9OworCitlbnVtIHsKKwlHUFJfVFlQRV9OVUxMID0gMCwKKwlHUFJfVFlQRV9JTywKKwlHUFJfVFlQRV9TVEFUSUMsCisJR1BSX1RZUEVfRFlOQU1JQywKKwlHUFJfVFlQRV9DT05UUk9MLAorCUdQUl9UWVBFX0NPTlNUQU5UCit9OworCisjZGVmaW5lIEdQUl9CQVNFIDB4MTAwCisjZGVmaW5lIE9VVFBVVF9CQVNFIDB4MjAKKworI2RlZmluZSBBX0dQUl9CQVNFIDB4NDAwCisjZGVmaW5lIEFfT1VUUFVUX0JBU0UgMHg2MAorCisjZGVmaW5lIE1BWF9QQVRDSEVTX1BBR0VTIDMyCisKK3N0cnVjdCBwYXRjaF9tYW5hZ2VyIHsKKwl2b2lkICpwYXRjaFtNQVhfUEFUQ0hFU19QQUdFU107CisJaW50IGN1cnJlbnRfcGFnZXM7CisJc3RydWN0IGRzcF9ycGF0Y2ggcnBhdGNoOworCXN0cnVjdCBkc3BfZ3ByIGdwcltOVU1fR1BSU107ICAgLyogZ3ByIHVzYWdlIHRhYmxlICovCisJc3BpbmxvY2tfdCBsb2NrOworCXMxNiBjdHJsX2dwcltTT1VORF9NSVhFUl9OUkRFVklDRVNdWzJdOworfTsKKworI2RlZmluZSBQQVRDSEVTX1BFUl9QQUdFIChQQUdFX1NJWkUgLyBzaXplb2Yoc3RydWN0IGRzcF9wYXRjaCkpCisKKyNkZWZpbmUgUEFUQ0gobWdyLCBpKSAoKHN0cnVjdCBkc3BfcGF0Y2ggKikgKG1nciktPnBhdGNoWyhpKSAvIFBBVENIRVNfUEVSX1BBR0VdICsgKGkpICUgUEFUQ0hFU19QRVJfUEFHRSkKKworLyogUENNIHZvbHVtZSBjb250cm9sICovCisjZGVmaW5lIFRNUF9QQ01fTCAgICAgMHgxMDAgLy90ZW1wIFBDTSBMIChhZnRlciB0aGUgdm9sIGNvbnRyb2wpICAgICAgIAorI2RlZmluZSBUTVBfUENNX1IgICAgIDB4MTAxCisjZGVmaW5lIFZPTF9QQ01fTCAgICAgMHgxMDIgLy92b2wgUENNCisjZGVmaW5lIFZPTF9QQ01fUiAgICAgMHgxMDMKKworLyogUm91dGluZyBwYXRjaCAqLworI2RlZmluZSBUTVBfQUNfTCAgICAgIDB4MTA0IC8vdG1wIGFjOTcgb3V0CisjZGVmaW5lIFRNUF9BQ19SICAgICAgMHgxMDUKKyNkZWZpbmUgVE1QX1JFQVJfTCAgICAweDEwNiAvL291dHB1dCAtIFRlbXAgUmVhcgorI2RlZmluZSBUTVBfUkVBUl9SICAgIDB4MTA3CisjZGVmaW5lIFRNUF9ESUdJX0wgICAgMHgxMDggLy9vdXRwdXQgLSBUZW1wIGRpZ2l0YWwKKyNkZWZpbmUgVE1QX0RJR0lfUiAgICAweDEwOQorI2RlZmluZSBEU1BfVk9MX0wgICAgIDB4MTBhIC8vIG1haW4gZHNwIHZvbHVtZQorI2RlZmluZSBEU1BfVk9MX1IgICAgIDB4MTBiCisKKy8qIGh3IGlucHV0cyAqLworI2RlZmluZSBQQ01fSU5fTCAJMHgwMAorI2RlZmluZSBQQ01fSU5fUiAJMHgwMQorCisjZGVmaW5lIFBDTTFfSU5fTCAgICAgICAgMHgwNAorI2RlZmluZSBQQ00xX0lOX1IgICAgICAgIDB4MDUKKy8vbXV0aWxjaGFubmVsIHBsYXliYWNrIHN0cmVhbSBhcHBlYXIgaGVyZToKKworI2RlZmluZSBNVUxUSV9GUk9OVF9MCTB4MDgKKyNkZWZpbmUgTVVMVElfRlJPTlRfUgkweDA5CisjZGVmaW5lIE1VTFRJX1JFQVJfTAkweDBhCisjZGVmaW5lIE1VTFRJX1JFQVJfUgkweDBiCisjZGVmaW5lIE1VTFRJX0NFTlRFUgkweDBjCisjZGVmaW5lIE1VTFRJX0xGRQkweDBkCisKKyNkZWZpbmUgQUM5N19JTl9MCTB4MTAKKyNkZWZpbmUgQUM5N19JTl9SCTB4MTEKKyNkZWZpbmUgU1BESUZfQ0RfTAkweDEyCisjZGVmaW5lIFNQRElGX0NEX1IJMHgxMworCisvKiBodyBvdXRwdXRzICovCisjZGVmaW5lIEFDOTdfRlJPTlRfTAkweDIwCisjZGVmaW5lIEFDOTdfRlJPTlRfUgkweDIxCisjZGVmaW5lIERJR0lUQUxfT1VUX0wJMHgyMgorI2RlZmluZSBESUdJVEFMX09VVF9SCTB4MjMKKyNkZWZpbmUgRElHSVRBTF9DRU5URVIJMHgyNAorI2RlZmluZSBESUdJVEFMX0xGRQkweDI1CisKKyNkZWZpbmUgQU5BTE9HX1JFQVJfTAkweDI4CisjZGVmaW5lIEFOQUxPR19SRUFSX1IJMHgyOQorI2RlZmluZSBBRENfUkVDX0wJMHgyYQorI2RlZmluZSBBRENfUkVDX1IJMHgyYgorCisjZGVmaW5lIEFOQUxPR19DRU5URVIJMHgzMQorI2RlZmluZSBBTkFMT0dfTEZFCTB4MzIKKworCisjZGVmaW5lIElOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCBubSwgbG4sIGkpCQlcCitkbyB7CQkJCQkJCVwKKwlwYXRjaCA9IFBBVENIKG1nciwgcGF0Y2hfbik7CQkJXAorCXN0cmNweShwYXRjaC0+bmFtZSwgbm0pOwkJCVwKKwlwYXRjaC0+Y29kZV9zdGFydCA9IHBjICogMjsJCQlcCisJcGF0Y2gtPmlucHV0ID0gKDE8PCgweDFmJmxuKSk7CQkJXAorCXBhdGNoLT5vdXRwdXQ9ICgxPDwoMHgxZiZsbikpOwkJCVwKKwlwYXRjaC0+aWQgPSBpOwkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIElOUFVUX1BBVENIX0VORChwYXRjaCkJCQkJXAorZG8gewkJCQkJCQlcCisJcGF0Y2gtPmNvZGVfc2l6ZSA9IHBjICogMiAtIHBhdGNoLT5jb2RlX3N0YXJ0OwlcCisJcGF0Y2hfbisrOwkJCQkJXAorfSB3aGlsZSgwKQorCisKKyNkZWZpbmUgUk9VVElOR19QQVRDSF9TVEFSVChwYXRjaCwgbm0pCVwKK2RvIHsJCQkJCVwKKwlwYXRjaCA9ICZtZ3ItPnJwYXRjaDsJCVwKKwlzdHJjcHkocGF0Y2gtPm5hbWUsIG5tKTsJXAorCXBhdGNoLT5jb2RlX3N0YXJ0ID0gcGMgKiAyOwlcCit9IHdoaWxlKDApCisKKyNkZWZpbmUgUk9VVElOR19QQVRDSF9FTkQocGF0Y2gpCQkJXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJcGF0Y2gtPmNvZGVfc2l6ZSA9IHBjICogMiAtIHBhdGNoLT5jb2RlX3N0YXJ0OyAgICAgIFwKK30gd2hpbGUoMCkKKworI2RlZmluZSBDT05ORUNUKGlucHV0LCBvdXRwdXQpIHNldF9iaXQoaW5wdXQsICZycGF0Y2gtPnJvdXRlWyhvdXRwdXQpIC0gT1VUUFVUX0JBU0VdKTsKKworI2RlZmluZSBDT05ORUNUX1YoaW5wdXQsIG91dHB1dCkgc2V0X2JpdChpbnB1dCwgJnJwYXRjaC0+cm91dGVfdlsob3V0cHV0KSAtIE9VVFBVVF9CQVNFXSk7CisKKyNkZWZpbmUgT1VUUFVUX1BBVENIX1NUQVJUKHBhdGNoLCBubSwgbG4sIGkpCQlcCitkbyB7CQkJCQkJCVwKKwlwYXRjaCA9IFBBVENIKG1nciwgcGF0Y2hfbik7CQkJXAorCXN0cmNweShwYXRjaC0+bmFtZSwgbm0pOwkJCVwKKwlwYXRjaC0+Y29kZV9zdGFydCA9IHBjICogMjsJCQlcCisJcGF0Y2gtPmlucHV0ID0gKDE8PCgweDFmJmxuKSk7CQkJXAorCXBhdGNoLT5vdXRwdXQ9ICgxPDwoMHgxZiZsbikpOwkJCVwKKwlwYXRjaC0+aWQgPSBpOwkJCQkJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIE9VVFBVVF9QQVRDSF9FTkQocGF0Y2gpCQkJCVwKK2RvIHsJCQkJCQkJXAorCXBhdGNoLT5jb2RlX3NpemUgPSBwYyAqIDIgLSBwYXRjaC0+Y29kZV9zdGFydDsJXAorCXBhdGNoX24rKzsJCQkJCVwKK30gd2hpbGUoMCkKKworI2RlZmluZSBHRVRfT1VUUFVUX0dQUihwYXRjaCwgZywgbG4pCQkJXAorZG8gewkJCQkJCQlcCisJbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLnR5cGUgPSBHUFJfVFlQRV9JTzsJXAorCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS51c2FnZSsrOwkJXAorCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS5saW5lID0gbG47CQlcCisJc2V0X2JpdCgoZykgLSBHUFJfQkFTRSwgcGF0Y2gtPmdwcl91c2VkKTsJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEdFVF9JTlBVVF9HUFIocGF0Y2gsIGcsIGxuKQkJCVwKK2RvIHsJCQkJCQkJXAorCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS50eXBlID0gR1BSX1RZUEVfSU87CVwKKwltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0udXNhZ2UrKzsJCVwKKwltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0ubGluZSA9IGxuOwkJXAorCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfdXNlZCk7CVwKKwlzZXRfYml0KChnKSAtIEdQUl9CQVNFLCBwYXRjaC0+Z3ByX2lucHV0KTsJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEdFVF9EWU5BTUlDX0dQUihwYXRjaCwgZykJCQkJXAorZG8gewkJCQkJCQkJXAorCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS50eXBlID0gR1BSX1RZUEVfRFlOQU1JQzsJXAorCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS51c2FnZSsrOwkJCVwKKwlzZXRfYml0KChnKSAtIEdQUl9CQVNFLCBwYXRjaC0+Z3ByX3VzZWQpOyAgICAgICAgICAJXAorfSB3aGlsZSgwKQorCisjZGVmaW5lIEdFVF9DT05UUk9MX0dQUihwYXRjaCwgZywgbm0sIGEsIGIpCQkJXAorZG8gewkJCQkJCQkJXAorCXN0cmNweShtZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0ubmFtZSwgbm0pOwkJXAorCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS50eXBlID0gR1BSX1RZUEVfQ09OVFJPTDsJXAorCW1nci0+Z3ByWyhnKSAtIEdQUl9CQVNFXS51c2FnZSsrOwkJCVwKKwltZ3ItPmdwclsoZykgLSBHUFJfQkFTRV0ubWluID0gYTsJCQlcCisJbWdyLT5ncHJbKGcpIC0gR1BSX0JBU0VdLm1heCA9IGI7CQkJXAorCXNibGl2ZV93cml0ZXB0cihjYXJkLCBnLCAwLCBiKTsJCQkJXAorCXNldF9iaXQoKGcpIC0gR1BSX0JBU0UsIHBhdGNoLT5ncHJfdXNlZCk7CQlcCit9IHdoaWxlKDApCisKKyNlbmRpZiAvKiBfRUZYTUdSX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2VtdWFkeG1nLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9lbXVhZHhtZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZDJkNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9lbXVhZHhtZy5jCkBAIC0wLDAgKzEsMTA0IEBACisKKy8qICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgZW11YWR4bWcuYyAtIEFkZHJlc3Mgc3BhY2UgbWFuYWdlciBmb3IgZW11MTBrMSBkcml2ZXIgCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAorICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAorICogICAgIFVTQS4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICovCisKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorCisvKiBBbGxvY2F0ZXMgZW11IGFkZHJlc3Mgc3BhY2UgKi8KKworaW50IGVtdTEwazFfYWRkeG1ncl9hbGxvYyh1MzIgc2l6ZSwgc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwl1MTYgKnBhZ2V0YWJsZSA9IGNhcmQtPmVtdXBhZ2V0YWJsZTsKKwl1MTYgaW5kZXggPSAwOworCXUxNiBudW1wYWdlczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogQ29udmVydCBieXRlcyB0byBwYWdlcyAqLworCW51bXBhZ2VzID0gKHNpemUgLyBFTVVQQUdFU0laRSkgKyAoKHNpemUgJSBFTVVQQUdFU0laRSkgPyAxIDogMCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJd2hpbGUgKGluZGV4IDwgKE1BWFBBR0VTIC0gMSkpIHsKKwkJaWYgKHBhZ2V0YWJsZVtpbmRleF0gJiAweDgwMDApIHsKKwkJCS8qIFRoaXMgYmxvY2sgb2YgcGFnZXMgaXMgaW4gdXNlLCBqdW1wIHRvIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBibG9jay4gKi8KKwkJCWluZGV4ICs9IChwYWdldGFibGVbaW5kZXhdICYgMHg3ZmZmKTsKKwkJfSBlbHNlIHsKKwkJCS8qIEZvdW5kIGZyZWUgYmxvY2sgKi8KKwkJCWlmIChwYWdldGFibGVbaW5kZXhdID49IG51bXBhZ2VzKSB7CisKKwkJCQkvKiBCbG9jayBpcyBsYXJnZSBlbm91Z2ggKi8KKworCQkJCS8qIElmIGZyZWUgYmxvY2sgaXMgbGFyZ2VyIHRoYW4gdGhlIGJsb2NrIHJlcXVlc3RlZAorCQkJCSAqIHRoZW4gYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBibG9jayByZW1haW5pbmcgKi8KKwkJCQlpZiAocGFnZXRhYmxlW2luZGV4XSA+IG51bXBhZ2VzKQorCQkJCQlwYWdldGFibGVbaW5kZXggKyBudW1wYWdlc10gPSBwYWdldGFibGVbaW5kZXhdIC0gbnVtcGFnZXM7CisKKwkJCQlwYWdldGFibGVbaW5kZXhdID0gKG51bXBhZ2VzIHwgMHg4MDAwKTsJLyogTWFyayBibG9jayBhcyB1c2VkICovCisKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJCQlyZXR1cm4gaW5kZXg7CisJCQl9IGVsc2UgeworCQkJCS8qIEJsb2NrIHRvbyBzbWFsbCwganVtcCB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgYmxvY2sgKi8KKwkJCQlpbmRleCArPSBwYWdldGFibGVbaW5kZXhdOworCQkJfQorCQl9CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIC0xOworfQorCisvKiBGcmVlcyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGVtdSBhZGRyZXNzIHNwYWNlLiAqLworCit2b2lkIGVtdTEwazFfYWRkeG1ncl9mcmVlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBpbmRleCkKK3sKKwl1MTYgKnBhZ2V0YWJsZSA9IGNhcmQtPmVtdXBhZ2V0YWJsZTsKKwl1MTYgb3JpZ3NpemUgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHBhZ2V0YWJsZVtpbmRleF0gJiAweDgwMDApIHsKKwkJLyogQmxvY2sgaXMgYWxsb2NhdGVkIC0gbWFyayBibG9jayBhcyBmcmVlICovCisJCW9yaWdzaXplID0gcGFnZXRhYmxlW2luZGV4XSAmIDB4N2ZmZjsKKwkJcGFnZXRhYmxlW2luZGV4XSA9IG9yaWdzaXplOworCisJCS8qIElmIG5leHQgYmxvY2sgaXMgZnJlZSwgd2UgY29uY2F0IGJvdGggYmxvY2tzICovCisJCWlmICghKHBhZ2V0YWJsZVtpbmRleCArIG9yaWdzaXplXSAmIDB4ODAwMCkpCisJCQlwYWdldGFibGVbaW5kZXhdICs9IHBhZ2V0YWJsZVtpbmRleCArIG9yaWdzaXplXSAmIDB4N2ZmZjsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5jIGIvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGMxNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvaHdhY2Nlc3MuYwpAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgaHdhY2Nlc3MuYyAtLSBIYXJkd2FyZSBhY2Nlc3MgbGF5ZXIKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqICAgICBEZWNlbWJlciA5LCAxOTk5ICAgICBKb24gVGF5bG9yICAgICAgcmV3cm90ZSB0aGUgSS9PIHN1YnN5c3RlbQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKyNpbmNsdWRlICI4MDEwLmgiCisjaW5jbHVkZSAiaWNhcmRtaWQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogRnVuY3Rpb24gOiBzclRvUGl0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIElucHV0ICAgIDogc2FtcGxlUmF0ZSAtIHNhbXBsaW5nIHJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorKiBSZXR1cm4gICA6IHBpdGNoIHZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyogQWJvdXQgICAgOiBjb252ZXJ0IHNhbXBsaW5nIHJhdGUgdG8gcGl0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisqIE5vdGUgICAgIDogZm9yIDgwMTAsIHNhbXBsaW5nIHJhdGUgaXMgYXQgNDhrSHosIHRoaXMgZnVuY3Rpb24gc2hvdWxkICAgKgorKiAgICAgICAgICAgIGJlIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit1MzIgc3JUb1BpdGNoKHUzMiBzYW1wbGVSYXRlKQoreworCWludCBpOworCisJLyogRklYTUU6IFRoZXNlIHRhYmxlcyBzaG91bGQgYmUgZGVmaW5lZCBpbiBhIGhlYWRlcmZpbGUgKi8KKwlzdGF0aWMgdTMyIGxvZ01hZ1RhYmxlWzEyOF0gPSB7CisJCTB4MDAwMDAsIDB4MDJkZmMsIDB4MDViOWUsIDB4MDg4ZTYsIDB4MGI1ZDYsIDB4MGUyNmYsIDB4MTBlYjMsIDB4MTNhYTIsCisJCTB4MTY2M2YsIDB4MTkxOGEsIDB4MWJjODQsIDB4MWU3MmUsIDB4MjExOGIsIDB4MjNiOWEsIDB4MjY1NWQsIDB4MjhlZDUsCisJCTB4MmI4MDMsIDB4MmUwZTgsIDB4MzA5ODUsIDB4MzMxZGIsIDB4MzU5ZWIsIDB4MzgxYjYsIDB4M2E5M2QsIDB4M2QwODEsCisJCTB4M2Y3ODIsIDB4NDFlNDIsIDB4NDQ0YzEsIDB4NDZiMDEsIDB4NDkxMDEsIDB4NGI2YzQsIDB4NGRjNDksIDB4NTAxOTEsCisJCTB4NTI2OWUsIDB4NTRiNmYsIDB4NTcwMDYsIDB4NTk0NjMsIDB4NWI4ODgsIDB4NWRjNzQsIDB4NjAwMjksIDB4NjIzYTcsCisJCTB4NjQ2ZWUsIDB4NjZhMDAsIDB4NjhjZGQsIDB4NmFmODYsIDB4NmQxZmEsIDB4NmY0M2MsIDB4NzE2NGIsIDB4NzM4MjksCisJCTB4NzU5ZDQsIDB4NzdiNGYsIDB4NzljOWEsIDB4N2JkYjUsIDB4N2RlYTEsIDB4N2ZmNWUsIDB4ODFmZWQsIDB4ODQwNGUsCisJCTB4ODYwODIsIDB4ODgwODksIDB4OGEwNjQsIDB4OGMwMTQsIDB4OGRmOTgsIDB4OGZlZjEsIDB4OTFlMjAsIDB4OTNkMjYsCisJCTB4OTVjMDEsIDB4OTdhYjQsIDB4OTk5M2UsIDB4OWI3OWYsIDB4OWQ1ZDksIDB4OWYzZWMsIDB4YTExZDgsIDB4YTJmOWQsCisJCTB4YTRkM2MsIDB4YTZhYjUsIDB4YTg4MDgsIDB4YWE1MzcsIDB4YWMyNDEsIDB4YWRmMjYsIDB4YWZiZTcsIDB4YjE4ODUsCisJCTB4YjM1MDAsIDB4YjUxNTcsIDB4YjZkOGMsIDB4Yjg5OWYsIDB4YmE1OGYsIDB4YmMxNWUsIDB4YmRkMGMsIDB4YmY4OTksCisJCTB4YzE0MDQsIDB4YzJmNTAsIDB4YzRhN2IsIDB4YzY1ODcsIDB4YzgwNzMsIDB4YzliM2YsIDB4Y2I1ZWQsIDB4Y2QwN2MsCisJCTB4Y2VhZWMsIDB4ZDA1M2YsIDB4ZDFmNzMsIDB4ZDM5OGEsIDB4ZDUzODQsIDB4ZDZkNjAsIDB4ZDg3MjAsIDB4ZGEwYzMsCisJCTB4ZGJhNGEsIDB4ZGQzYjQsIDB4ZGVkMDMsIDB4ZTA2MzYsIDB4ZTFmNGUsIDB4ZTM4NGEsIDB4ZTUxMmMsIDB4ZTY5ZjMsCisJCTB4ZTgyOWYsIDB4ZTliMzEsIDB4ZWIzYTksIDB4ZWNjMDgsIDB4ZWU0NGMsIDB4ZWZjNzgsIDB4ZjE0OGEsIDB4ZjJjODMsCisJCTB4ZjQ0NjMsIDB4ZjVjMmEsIDB4ZjczZGEsIDB4ZjhiNzEsIDB4ZmEyZjAsIDB4ZmJhNTcsIDB4ZmQxYTcsIDB4ZmU4ZGYKKwl9OworCisJc3RhdGljIGNoYXIgbG9nU2xvcGVUYWJsZVsxMjhdID0geworCQkweDVjLCAweDVjLCAweDViLCAweDVhLCAweDVhLCAweDU5LCAweDU4LCAweDU4LAorCQkweDU3LCAweDU2LCAweDU2LCAweDU1LCAweDU1LCAweDU0LCAweDUzLCAweDUzLAorCQkweDUyLCAweDUyLCAweDUxLCAweDUxLCAweDUwLCAweDUwLCAweDRmLCAweDRmLAorCQkweDRlLCAweDRkLCAweDRkLCAweDRkLCAweDRjLCAweDRjLCAweDRiLCAweDRiLAorCQkweDRhLCAweDRhLCAweDQ5LCAweDQ5LCAweDQ4LCAweDQ4LCAweDQ3LCAweDQ3LAorCQkweDQ3LCAweDQ2LCAweDQ2LCAweDQ1LCAweDQ1LCAweDQ1LCAweDQ0LCAweDQ0LAorCQkweDQzLCAweDQzLCAweDQzLCAweDQyLCAweDQyLCAweDQyLCAweDQxLCAweDQxLAorCQkweDQxLCAweDQwLCAweDQwLCAweDQwLCAweDNmLCAweDNmLCAweDNmLCAweDNlLAorCQkweDNlLCAweDNlLCAweDNkLCAweDNkLCAweDNkLCAweDNjLCAweDNjLCAweDNjLAorCQkweDNiLCAweDNiLCAweDNiLCAweDNiLCAweDNhLCAweDNhLCAweDNhLCAweDM5LAorCQkweDM5LCAweDM5LCAweDM5LCAweDM4LCAweDM4LCAweDM4LCAweDM4LCAweDM3LAorCQkweDM3LCAweDM3LCAweDM3LCAweDM2LCAweDM2LCAweDM2LCAweDM2LCAweDM1LAorCQkweDM1LCAweDM1LCAweDM1LCAweDM0LCAweDM0LCAweDM0LCAweDM0LCAweDM0LAorCQkweDMzLCAweDMzLCAweDMzLCAweDMzLCAweDMyLCAweDMyLCAweDMyLCAweDMyLAorCQkweDMyLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMxLCAweDMwLCAweDMwLAorCQkweDMwLCAweDMwLCAweDMwLCAweDJmLCAweDJmLCAweDJmLCAweDJmLCAweDJmCisJfTsKKworCWlmIChzYW1wbGVSYXRlID09IDApCisJCXJldHVybiAwOwkvKiBCYWlsIG91dCBpZiBubyBsZWFkaW5nICIxIiAqLworCisJc2FtcGxlUmF0ZSAqPSAxMTE4NTsJLyogU2NhbGUgNDgwMDAgdG8gMHgyMDAwMjM4MCAqLworCisJZm9yIChpID0gMzE7IGkgPiAwOyBpLS0pIHsKKwkJaWYgKHNhbXBsZVJhdGUgJiAweDgwMDAwMDAwKSB7CS8qIERldGVjdCBsZWFkaW5nICIxIiAqLworCQkJcmV0dXJuICh1MzIpICgoKHMzMikgKGkgLSAxNSkgPDwgMjApICsKKwkJCQkgICAgICBsb2dNYWdUYWJsZVsweDdmICYgKHNhbXBsZVJhdGUgPj4gMjQpXSArCisJCQkJICAgICAgKDB4N2YgJiAoc2FtcGxlUmF0ZSA+PiAxNykpICogbG9nU2xvcGVUYWJsZVsweDdmICYgKHNhbXBsZVJhdGUgPj4gMjQpXSk7CisJCX0KKwkJc2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGUgPDwgMTsKKwl9CisKKwlEUEYoMiwgInNyVG9QaXRjaDogQlVHIVxuIik7CisJcmV0dXJuIDA7CQkvKiBTaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBwb2ludCAqLworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiB3cml0ZS9yZWFkIFBDSSBmdW5jdGlvbiAwIHJlZ2lzdGVycyAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBlbXUxMGsxX3dyaXRlZm4wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiByZWcsIHUzMiBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmVnICYgMHhmZjAwMDAwMCkgeworCQl1MzIgbWFzazsKKwkJdTggc2l6ZSwgb2Zmc2V0OworCisJCXNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7CisJCW9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKKwkJbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKKwkJZGF0YSA9IChkYXRhIDw8IG9mZnNldCkgJiBtYXNrOworCQlyZWcgJj0gMHg3ZjsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQlkYXRhIHw9IGlubChjYXJkLT5pb2Jhc2UgKyByZWcpICYgfm1hc2s7CisJCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgcmVnKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCX0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgcmVnKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybjsKK30KKworI2lmZGVmIERCR0VNVQordm9pZCBlbXUxMGsxX3dyaXRlZm4wXzIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHJlZywgdTMyIGRhdGEsIGludCBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKHNpemUgPT0gMzIpCisJCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgKHJlZyAmIDB4MUYpKTsKKwllbHNlIGlmIChzaXplID09IDE2KQorCQlvdXR3KGRhdGEsIGNhcmQtPmlvYmFzZSArIChyZWcgJiAweDFGKSk7CisJZWxzZQorCQlvdXRiKGRhdGEsIGNhcmQtPmlvYmFzZSArIChyZWcgJiAweDFGKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm47Cit9CisjZW5kaWYgIC8qICBEQkdFTVUgICovCisKK3UzMiBlbXUxMGsxX3JlYWRmbjAoc3RydWN0IGVtdTEwazFfY2FyZCAqIGNhcmQsIHUzMiByZWcpCit7CisJdTMyIHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHJlZyAmIDB4ZmYwMDAwMDApIHsKKwkJdTMyIG1hc2s7CisJCXU4IHNpemUsIG9mZnNldDsKKworCQlzaXplID0gKHJlZyA+PiAyNCkgJiAweDNmOworCQlvZmZzZXQgPSAocmVnID4+IDE2KSAmIDB4MWY7CisJCW1hc2sgPSAoKDEgPDwgc2l6ZSkgLSAxKSA8PCBvZmZzZXQ7CisJCXJlZyAmPSAweDdmOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCXZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyByZWcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuICh2YWwgJiBtYXNrKSA+PiBvZmZzZXQ7CisgICAgICAgIH0gZWxzZSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCXZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyByZWcpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiB2YWw7CisJfQorfQorCit2b2lkIGVtdTEwazFfdGltZXJfc2V0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKiBjYXJkLCB1MTYgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlvdXR3KGRhdGEgJiBUSU1FUl9SQVRFX01BU0ssIGNhcmQtPmlvYmFzZSArIFRJTUVSKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogd3JpdGUvcmVhZCBFbXUxMGsxIHBvaW50ZXItb2Zmc2V0IHJlZ2lzdGVyIHNldCwgYWNjZXNzZWQgdGhyb3VnaCAgICAgICoKKyogIHRoZSBQVFIgYW5kIERBVEEgcmVnaXN0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFfUFRSX0FERFJFU1NfTUFTSyAweDBmZmYwMDAwCit2b2lkIHNibGl2ZV93cml0ZXB0cihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgcmVnLCB1MzIgY2hhbm5lbCwgdTMyIGRhdGEpCit7CisJdTMyIHJlZ3B0cjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJcmVncHRyID0gKChyZWcgPDwgMTYpICYgQV9QVFJfQUREUkVTU19NQVNLKSB8IChjaGFubmVsICYgUFRSX0NIQU5ORUxOVU1fTUFTSyk7CisKKwlpZiAocmVnICYgMHhmZjAwMDAwMCkgeworCQl1MzIgbWFzazsKKwkJdTggc2l6ZSwgb2Zmc2V0OworCisJCXNpemUgPSAocmVnID4+IDI0KSAmIDB4M2Y7CisJCW9mZnNldCA9IChyZWcgPj4gMTYpICYgMHgxZjsKKwkJbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKKwkJZGF0YSA9IChkYXRhIDw8IG9mZnNldCkgJiBtYXNrOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCW91dGwocmVncHRyLCBjYXJkLT5pb2Jhc2UgKyBQVFIpOworCQlkYXRhIHw9IGlubChjYXJkLT5pb2Jhc2UgKyBEQVRBKSAmIH5tYXNrOworCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIERBVEEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJb3V0bChyZWdwdHIsIGNhcmQtPmlvYmFzZSArIFBUUik7CisJCW91dGwoZGF0YSwgY2FyZC0+aW9iYXNlICsgREFUQSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qIC4uLiA6ICBkYXRhLCByZWcsIC4uLiAsIFRBR0xJU1RfRU5EICovCit2b2lkIHNibGl2ZV93cml0ZXB0cl90YWcoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIGNoYW5uZWwsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICB1MzIgcmVnOworCisJdmFfc3RhcnQoYXJncywgY2hhbm5lbCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCXdoaWxlICgocmVnID0gdmFfYXJnKGFyZ3MsIHUzMikpICE9IFRBR0xJU1RfRU5EKSB7CisJCXUzMiBkYXRhID0gdmFfYXJnKGFyZ3MsIHUzMik7CisJCXUzMiByZWdwdHIgPSAoKChyZWcgPDwgMTYpICYgQV9QVFJfQUREUkVTU19NQVNLKQorCQkJICAgICAgfCAoY2hhbm5lbCAmIFBUUl9DSEFOTkVMTlVNX01BU0spKTsKKwkJb3V0bChyZWdwdHIsIGNhcmQtPmlvYmFzZSArIFBUUik7CisJCWlmIChyZWcgJiAweGZmMDAwMDAwKSB7CisJCQlpbnQgc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQgPSAocmVnID4+IDE2KSAmIDB4MWY7CisJCQl1MzIgbWFzayA9ICgoMSA8PCBzaXplKSAtIDEpIDw8IG9mZnNldDsKKwkJCWRhdGEgPSAoZGF0YSA8PCBvZmZzZXQpICYgbWFzazsKKworCQkJZGF0YSB8PSBpbmwoY2FyZC0+aW9iYXNlICsgREFUQSkgJiB+bWFzazsKKwkJfQorCQlvdXRsKGRhdGEsIGNhcmQtPmlvYmFzZSArIERBVEEpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwl2YV9lbmQoYXJncyk7CisKKwlyZXR1cm47Cit9CisKK3UzMiBzYmxpdmVfcmVhZHB0cihzdHJ1Y3QgZW11MTBrMV9jYXJkICogY2FyZCwgdTMyIHJlZywgdTMyIGNoYW5uZWwpCit7CisJdTMyIHJlZ3B0ciwgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlyZWdwdHIgPSAoKHJlZyA8PCAxNikgJiBBX1BUUl9BRERSRVNTX01BU0spIHwgKGNoYW5uZWwgJiBQVFJfQ0hBTk5FTE5VTV9NQVNLKTsKKworCWlmIChyZWcgJiAweGZmMDAwMDAwKSB7CisJCXUzMiBtYXNrOworCQl1OCBzaXplLCBvZmZzZXQ7CisKKwkJc2l6ZSA9IChyZWcgPj4gMjQpICYgMHgzZjsKKwkJb2Zmc2V0ID0gKHJlZyA+PiAxNikgJiAweDFmOworCQltYXNrID0gKCgxIDw8IHNpemUpIC0gMSkgPDwgb2Zmc2V0OworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCW91dGwocmVncHRyLCBjYXJkLT5pb2Jhc2UgKyBQVFIpOworCQl2YWwgPSBpbmwoY2FyZC0+aW9iYXNlICsgREFUQSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlyZXR1cm4gKHZhbCAmIG1hc2spID4+IG9mZnNldDsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQlvdXRsKHJlZ3B0ciwgY2FyZC0+aW9iYXNlICsgUFRSKTsKKwkJdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIERBVEEpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIHZhbDsKKwl9Cit9CisKK3ZvaWQgZW11MTBrMV9pcnFfZW5hYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHUzMiBpcnFfbWFzaykKK3sKKwl1MzIgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwiZW11MTBrMV9pcnFfZW5hYmxlKClcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgdmFsID0gaW5sKGNhcmQtPmlvYmFzZSArIElOVEUpIHwgaXJxX21hc2s7CisgICAgICAgIG91dGwodmFsLCBjYXJkLT5pb2Jhc2UgKyBJTlRFKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuOworfQorCit2b2lkIGVtdTEwazFfaXJxX2Rpc2FibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIGlycV9tYXNrKQoreworICAgICAgICB1MzIgdmFsOworICAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgICAgIERQRigyLCJlbXUxMGsxX2lycV9kaXNhYmxlKClcbiIpOworCisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHZhbCA9IGlubChjYXJkLT5pb2Jhc2UgKyBJTlRFKSAmIH5pcnFfbWFzazsKKyAgICAgICAgb3V0bCh2YWwsIGNhcmQtPmlvYmFzZSArIElOVEUpOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybjsKK30KKwordm9pZCBlbXUxMGsxX2NsZWFyX3N0b3Bfb25fbG9vcChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1MzIgdm9pY2VudW0pCit7CisJLyogVm9pY2UgaW50ZXJydXB0ICovCisJaWYgKHZvaWNlbnVtID49IDMyKQorCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgU09MRUggfCAoKDB4MDEwMCB8ICh2b2ljZW51bSAtIDMyKSkgPDwgMTYpLCAwLCAwKTsKKwllbHNlCisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBTT0xFTCB8ICgoMHgwMTAwIHwgdm9pY2VudW0pIDw8IDE2KSwgMCwgMCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNibGl2ZV93Y3dhaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTMyIHdhaXQpCit7CisJdm9sYXRpbGUgdW5zaWduZWQgdUNvdW50OworCXUzMiBuZXd0aW1lID0gMCwgY3VydGltZTsKKworCWN1cnRpbWUgPSBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgV0NfU0FNUExFQ09VTlRFUik7CisJd2hpbGUgKHdhaXQtLSkgeworCQl1Q291bnQgPSAwOworCQl3aGlsZSAodUNvdW50KysgPCBUSU1FT1VUKSB7CisJCQluZXd0aW1lID0gZW11MTBrMV9yZWFkZm4wKGNhcmQsIFdDX1NBTVBMRUNPVU5URVIpOworCQkJaWYgKG5ld3RpbWUgIT0gY3VydGltZSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmICh1Q291bnQgPj0gVElNRU9VVCkKKwkJCWJyZWFrOworCisJCWN1cnRpbWUgPSBuZXd0aW1lOworCX0KK30KKwordTE2IGVtdTEwazFfYWM5N19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCXUxNiBkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJb3V0YihyZWcsIGNhcmQtPmlvYmFzZSArIEFDOTdBRERSRVNTKTsKKwlkYXRhID0gaW53KGNhcmQtPmlvYmFzZSArIEFDOTdEQVRBKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBkYXRhOworfQorCit2b2lkIGVtdTEwazFfYWM5N193cml0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZywgdTE2IHZhbHVlKQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJb3V0YihyZWcsIGNhcmQtPmlvYmFzZSArIEFDOTdBRERSRVNTKTsKKwlvdXR3KHZhbHVlLCBjYXJkLT5pb2Jhc2UgKyBBQzk3REFUQSk7CisJb3V0YiggQUM5N19FWFRFTkRFRF9JRCwgY2FyZC0+aW9iYXNlICsgQUM5N0FERFJFU1MpOyAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyogICAgICAgICAgICBNUFUgYWNjZXNzIGZ1bmN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBlbXUxMGsxX21wdV93cml0ZV9kYXRhKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHU4IGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKGNhcmQtPmlzX2F1ZGlneSkgeworCQlpZiAoKHNibGl2ZV9yZWFkcHRyKGNhcmQsIEFfTVVTVEFULDApICYgTVVTVEFUX09SRFlOKSA9PSAwKSB7CisJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9NVURBVEEsIDAsIGRhdGEpOworCQkJcmV0ID0gMDsKKwkJfSBlbHNlCisJCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJCWlmICgoaW5iKGNhcmQtPmlvYmFzZSArIE1VU1RBVCkgJiBNVVNUQVRfT1JEWU4pID09IDApIHsKKwkJCW91dGIoZGF0YSwgY2FyZC0+aW9iYXNlICsgTVVEQVRBKTsKKwkJCXJldCA9IDA7CisJCX0gZWxzZQorCQkJcmV0ID0gLTE7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK2ludCBlbXUxMGsxX21wdV9yZWFkX2RhdGEoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgdTggKiBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKworCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKKwkJaWYgKChzYmxpdmVfcmVhZHB0cihjYXJkLCBBX01VU1RBVCwwKSAmIE1VU1RBVF9JUkRZTikgPT0gMCkgeworCQkJKmRhdGEgPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBBX01VREFUQSwwKTsKKwkJCXJldCA9IDA7CisJCX0gZWxzZQorCQkJcmV0ID0gLTE7CisJfSBlbHNlIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoKGluYihjYXJkLT5pb2Jhc2UgKyBNVVNUQVQpICYgTVVTVEFUX0lSRFlOKSA9PSAwKSB7CisJCQkqZGF0YSA9IGluYihjYXJkLT5pb2Jhc2UgKyBNVURBVEEpOworCQkJcmV0ID0gMDsKKwkJfSBlbHNlCisJCQlyZXQgPSAtMTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworaW50IGVtdTEwazFfbXB1X3Jlc2V0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJdTggc3RhdHVzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwgImVtdTEwazFfbXB1X3Jlc2V0KClcbiIpOworCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKKwkJaWYgKGNhcmQtPm1wdWFjcWNvdW50ID09IDApIHsKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX01VQ01ELCAwLCBNVUNNRF9SRVNFVCk7CisJCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOworCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfTVVDTUQsIDAsIE1VQ01EX1JFU0VUKTsKKwkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7CisJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9NVUNNRCwgMCwgTVVDTURfRU5URVJVQVJUTU9ERSk7CisJCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOworCQkJc3RhdHVzID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgQV9NVURBVEEsIDApOworCQkJaWYgKHN0YXR1cyA9PSAweGZlKQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCXJldHVybiAtMTsKKwkJfQorCisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCWlmIChjYXJkLT5tcHVhY3Fjb3VudCA9PSAwKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQkJb3V0YihNVUNNRF9SRVNFVCwgY2FyZC0+aW9iYXNlICsgTVVDTUQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQkJb3V0YihNVUNNRF9SRVNFVCwgY2FyZC0+aW9iYXNlICsgTVVDTUQpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJCQlzYmxpdmVfd2N3YWl0KGNhcmQsIDgpOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQkJb3V0YihNVUNNRF9FTlRFUlVBUlRNT0RFLCBjYXJkLT5pb2Jhc2UgKyBNVUNNRCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJCXNibGl2ZV93Y3dhaXQoY2FyZCwgOCk7CisKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCQlzdGF0dXMgPSBpbmIoY2FyZC0+aW9iYXNlICsgTVVEQVRBKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkJaWYgKHN0YXR1cyA9PSAweGZlKQorCQkJCXJldHVybiAwOworCQkJZWxzZQorCQkJCXJldHVybiAtMTsKKwkJfQorCisJCXJldHVybiAwOworCX0KK30KKworaW50IGVtdTEwazFfbXB1X2FjcXVpcmUoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwkvKiBGSVhNRTogVGhpcyBzaG91bGQgYmUgYSBtYWNybyAqLworCSsrY2FyZC0+bXB1YWNxY291bnQ7CisKKwlyZXR1cm4gMDsKK30KKworaW50IGVtdTEwazFfbXB1X3JlbGVhc2Uoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwkvKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgYSBtYWNybyAqLworCS0tY2FyZC0+bXB1YWNxY291bnQ7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2h3YWNjZXNzLmggYi9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNDIyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9od2FjY2Vzcy5oCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBod2FjY2Vzcy5oCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUJCSAgICBBdXRob3IJICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0JCSAgICAtLS0tLS0JICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfSFdBQ0NFU1NfSAorI2RlZmluZSBfSFdBQ0NFU1NfSAorCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgImVmeG1nci5oIgorI2luY2x1ZGUgInBhc3N0aHJvdWdoLmgiCisjaW5jbHVkZSAibWlkaS5oIgorCisjZGVmaW5lIEVNVVBBR0VTSVpFICAgICA0MDk2ICAgICAgICAgICAgLyogZG9uJ3QgY2hhbmdlICovCisjZGVmaW5lIE5VTV9HICAgICAgICAgICA2NCAgICAgICAgICAgICAgLyogdXNlIGFsbCBjaGFubmVscyAqLworI2RlZmluZSBOVU1fRlhTRU5EUyAgICAgNCAgICAgICAgICAgICAgIC8qIGRvbid0IGNoYW5nZSAqLworLyogc2V0dGluZyB0aGlzIHRvIG90aGVyIHRoYW4gYSBwb3dlciBvZiB0d28gbWF5IGJyZWFrIHNvbWUgYXBwbGljYXRpb25zICovCisjZGVmaW5lIE1BWEJVRlNJWkUJNjU1MzYKKyNkZWZpbmUgTUFYUEFHRVMJODE5MiAKKyNkZWZpbmUgQlVGTUFYUEFHRVMgICAgIChNQVhCVUZTSVpFIC8gUEFHRV9TSVpFKQorCisjZGVmaW5lIEZMQUdTX0FWQUlMQUJMRSAgICAgMHgwMDAxCisjZGVmaW5lIEZMQUdTX1JFQURZICAgICAgICAgMHgwMDAyCisKK3N0cnVjdCBtZW1oYW5kbGUKK3sKKwlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisJdm9pZCAqYWRkcjsKKwl1MzIgc2l6ZTsKK307CisKKyNkZWZpbmUgREVCVUdfTEVWRUwgMgorCisjaWZkZWYgRU1VMTBLMV9ERUJVRworIyBkZWZpbmUgRFBEKGxldmVsLHgseS4uLikgZG8ge2lmKGxldmVsIDw9IERFQlVHX0xFVkVMKSBwcmludGsoIEtFUk5fTk9USUNFICJlbXUxMGsxOiAlczogJWQ6ICIgeCAsIF9fRklMRV9fICwgX19MSU5FX18gLCB5ICk7fSB3aGlsZSgwKQorIyBkZWZpbmUgRFBGKGxldmVsLHgpICAgZG8ge2lmKGxldmVsIDw9IERFQlVHX0xFVkVMKSBwcmludGsoIEtFUk5fTk9USUNFICJlbXUxMGsxOiAlczogJWQ6ICIgeCAsIF9fRklMRV9fICwgX19MSU5FX18gKTt9IHdoaWxlKDApCisjZWxzZQorIyBkZWZpbmUgRFBEKGxldmVsLHgseS4uLikgZG8geyB9IHdoaWxlICgwKSAvKiBub3QgZGVidWdnaW5nOiBub3RoaW5nICovCisjIGRlZmluZSBEUEYobGV2ZWwseCkgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmIC8qIEVNVTEwSzFfREVCVUcgKi8KKworI2RlZmluZSBFUlJPUigpIERQRigxLCJlcnJvclxuIikKKworLyogREFUQSBTVFJVQ1RVUkVTICovCisKK3N0cnVjdCBlbXUxMGsxX3dhdmVvdXQKK3sKKwl1MzIgc2VuZF9yb3V0aW5nWzNdOworCS8vIGF1ZGlneSBvbmx5OgorCXUzMiBzZW5kX3JvdXRpbmcyWzNdOworCisJdTMyIHNlbmRfZGNiYVszXTsKKwkvLyBhdWRpZ3kgb25seToKKwl1MzIgc2VuZF9oZ2ZlWzNdOworfTsKKyNkZWZpbmUgUk9VVEVfUENNIDAKKyNkZWZpbmUgUk9VVEVfUFQgMQorI2RlZmluZSBST1VURV9QQ00xIDIKKworI2RlZmluZSBTRU5EX01PTk8gMAorI2RlZmluZSBTRU5EX0xFRlQgMQorI2RlZmluZSBTRU5EX1JJR0hUIDIKKworc3RydWN0IGVtdTEwazFfd2F2ZWluCit7CisgICAgICAgIHN0cnVjdCB3aWluc3QgKmFjOTc7CisgICAgICAgIHN0cnVjdCB3aWluc3QgKm1pYzsKKyAgICAgICAgc3RydWN0IHdpaW5zdCAqZng7CisKKyAgICAgICAgdTggcmVjc3JjOworICAgICAgICB1MzIgZnh3YzsKK307CisKKyNkZWZpbmUgQ01EX1JFQUQgMQorI2RlZmluZSBDTURfV1JJVEUgMgorCitzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCB7CisgICAgICAgIHUzMiBjbWQ7CisgICAgICAgIHUzMiB2YWxbOTBdOworfTsKKworLyogYm9ndXMgaW9jdGxzIG51bWJlcnMgdG8gZXNjYXBlIGZyb20gT1NTIG1peGVyIGxpbWl0YXRpb25zICovCisjZGVmaW5lIENNRF9XUklURUZOMCAgICAgICAgICAgIF9JT1coJ0QnLCAwLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKKyNkZWZpbmUgQ01EX1JFQURGTjAJCV9JT1IoJ0QnLCAxLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCisjZGVmaW5lIENNRF9XUklURVBUUgkJX0lPVygnRCcsIDIsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX1JFQURQVFIJCV9JT1IoJ0QnLCAzLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCisjZGVmaW5lIENNRF9TRVRSRUNTUkMJCV9JT1coJ0QnLCA0LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCisjZGVmaW5lIENNRF9HRVRSRUNTUkMJCV9JT1IoJ0QnLCA1LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCisjZGVmaW5lIENNRF9HRVRWT0lDRVBBUkFNCV9JT1IoJ0QnLCA2LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCisjZGVmaW5lIENNRF9TRVRWT0lDRVBBUkFNCV9JT1coJ0QnLCA3LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCisjZGVmaW5lIENNRF9HRVRQQVRDSAkJX0lPUignRCcsIDgsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX0dFVEdQUgkJX0lPUignRCcsIDksIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX0dFVENUTEdQUiAgICAgICAgICAgX0lPUignRCcsIDEwLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKKyNkZWZpbmUgQ01EX1NFVFBBVENICQlfSU9XKCdEJywgMTEsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSAKKyNkZWZpbmUgQ01EX1NFVEdQUgkJX0lPVygnRCcsIDEyLCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkgCisjZGVmaW5lIENNRF9TRVRDVExHUFIJCV9JT1coJ0QnLCAxMywgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCisjZGVmaW5lIENNRF9TRVRHUE9VVAkJX0lPVygnRCcsIDE0LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKKyNkZWZpbmUgQ01EX0dFVEdQUjJPU1MJCV9JT1IoJ0QnLCAxNSwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCisjZGVmaW5lIENNRF9TRVRHUFIyT1NTCQlfSU9XKCdEJywgMTYsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQorI2RlZmluZSBDTURfU0VUTUNIX0ZYCQlfSU9XKCdEJywgMTcsIHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKQorI2RlZmluZSBDTURfU0VUUEFTU1RIUk9VR0gJX0lPVygnRCcsIDE4LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKKyNkZWZpbmUgQ01EX1BSSVZBVEUzX1ZFUlNJT04JX0lPVygnRCcsIDE5LCBzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkKKyNkZWZpbmUgQ01EX0FDOTdfQk9PU1QJCV9JT1coJ0QnLCAyMCwgc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpCisKKy8vdXAgdGhpcyBudW1iZXIgd2hlbiBicmVha2luZyBjb21wYXRpYmlsaXR5CisjZGVmaW5lIFBSSVZBVEUzX1ZFUlNJT04gMgorCitzdHJ1Y3QgZW11MTBrMV9jYXJkIAoreworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBtZW1oYW5kbGUJdmlydHVhbHBhZ2V0YWJsZTsKKwlzdHJ1Y3QgbWVtaGFuZGxlCXRhbmttZW07CisJc3RydWN0IG1lbWhhbmRsZQlzaWxlbnRwYWdlOworCisJc3BpbmxvY2tfdAkJbG9jazsKKworCXU4CQkJdm9pY2V0YWJsZVtOVU1fR107CisJdTE2CQkJZW11cGFnZXRhYmxlW01BWFBBR0VTXTsKKworCXN0cnVjdCBsaXN0X2hlYWQJdGltZXJzOworCXUxNgkJCXRpbWVyX2RlbGF5OworCXNwaW5sb2NrX3QJCXRpbWVyX2xvY2s7CisKKwlzdHJ1Y3QgcGNpX2RldgkJKnBjaV9kZXY7CisJdW5zaWduZWQgbG9uZyAgICAgICAgICAgaW9iYXNlOworCXVuc2lnbmVkIGxvbmcJCWxlbmd0aDsKKwl1bnNpZ25lZCBzaG9ydAkJbW9kZWw7CisJdW5zaWduZWQgaW50IGlycTsgCisKKwlpbnQJYXVkaW9fZGV2OworCWludAlhdWRpb19kZXYxOworCWludAltaWRpX2RldjsKKyNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgorCWludCBzZXFfZGV2OworCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKnNlcV9taWRpZGV2OworI2VuZGlmCisKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NzsKKwlpbnQgYWM5N19zdXBwb3J0ZWRfbWl4ZXJzOworCWludCBhYzk3X3N0ZXJlb19taXhlcnM7CisKKwkvKiBOdW1iZXIgb2YgZmlyc3QgZnggdm9pY2UgZm9yIG11bHRpY2hhbm5lbCBvdXRwdXQgKi8KKwl1OCBtY2hhbm5lbF9meDsKKwlzdHJ1Y3QgZW11MTBrMV93YXZlb3V0CXdhdmVvdXQ7CisJc3RydWN0IGVtdTEwazFfd2F2ZWluCXdhdmVpbjsKKwlzdHJ1Y3QgZW11MTBrMV9tcHVvdXQJKm1wdW91dDsKKwlzdHJ1Y3QgZW11MTBrMV9tcHVpbgkqbXB1aW47CisKKwlzdHJ1Y3Qgc2VtYXBob3JlCW9wZW5fc2VtOworCW1vZGVfdAkJCW9wZW5fbW9kZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdAlvcGVuX3dhaXQ7CisKKwl1MzIJICAgIG1wdWFjcWNvdW50OwkgIC8vIE1wdSBhY3F1aXJlIGNvdW50CisJdTMyCSAgICBoYXNfdG9zbGluazsJICAgICAgIC8vIFRPU0xpbmsgZGV0ZWN0aW9uCisKKwl1OCBjaGlwcmV2OyAgICAgICAgICAgICAgICAgICAgLyogQ2hpcCByZXZpc2lvbiAgICAgICAgICAgICAgICAqLworCXU4IGlzX2F1ZGlneTsKKwl1OCBpc19hcHM7CisKKwlzdHJ1Y3QgcGF0Y2hfbWFuYWdlciBtZ3I7CisJc3RydWN0IHB0X2RhdGEgcHQ7Cit9OworCitpbnQgZW11MTBrMV9hZGR4bWdyX2FsbG9jKHUzMiwgc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK3ZvaWQgZW11MTBrMV9hZGR4bWdyX2ZyZWUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBpbnQpOworCitpbnQgZW11MTBrMV9maW5kX2NvbnRyb2xfZ3ByKHN0cnVjdCBwYXRjaF9tYW5hZ2VyICosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK3ZvaWQgZW11MTBrMV9zZXRfY29udHJvbF9ncHIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBpbnQgLCBzMzIsIGludCApOworCit2b2lkIGVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBpbnQsIHMzMiwgaW50KTsKKworCisjZGVmaW5lIFZPTF82QklUIDB4NDAKKyNkZWZpbmUgVk9MXzVCSVQgMHgyMAorI2RlZmluZSBWT0xfNEJJVCAweDEwCisKKyNkZWZpbmUgVElNRU9VVCAJCSAgICAxNjM4NAorCit1MzIgc3JUb1BpdGNoKHUzMik7CisKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGVtdTEwazFfZGV2czsKKworLyogSGFyZHdhcmUgQWJzdHJhY3Rpb24gTGF5ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLworCit2b2lkIGVtdTEwazFfd3JpdGVmbjAoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIsIHUzMik7Cit2b2lkIGVtdTEwazFfd3JpdGVmbjBfMihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMiwgdTMyLCBpbnQpOwordTMyIGVtdTEwazFfcmVhZGZuMChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7CisKK3ZvaWQgZW11MTBrMV90aW1lcl9zZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MTYpOworCit2b2lkIHNibGl2ZV93cml0ZXB0cihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMiwgdTMyLCB1MzIpOwordm9pZCBzYmxpdmVfd3JpdGVwdHJfdGFnKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTMyLCAuLi4pOworI2RlZmluZSBUQUdMSVNUX0VORAkwCisKK3UzMiBzYmxpdmVfcmVhZHB0cihzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMiAsIHUzMiApOworCit2b2lkIGVtdTEwazFfaXJxX2VuYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7Cit2b2lkIGVtdTEwazFfaXJxX2Rpc2FibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1MzIpOwordm9pZCBlbXUxMGsxX2NsZWFyX3N0b3Bfb25fbG9vcChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHUzMik7CisKKy8qIEFDOTcgQ29kZWMgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9uICovCit1MTYgZW11MTBrMV9hYzk3X3JlYWQoc3RydWN0IGFjOTdfY29kZWMgKiwgdTgpOwordm9pZCBlbXUxMGsxX2FjOTdfd3JpdGUoc3RydWN0IGFjOTdfY29kZWMgKiwgdTgsIHUxNik7CisKKy8qIE1QVSBhY2Nlc3MgZnVuY3Rpb24qLworaW50IGVtdTEwazFfbXB1X3dyaXRlX2RhdGEoc3RydWN0IGVtdTEwazFfY2FyZCAqLCB1OCk7CitpbnQgZW11MTBrMV9tcHVfcmVhZF9kYXRhKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgdTggKik7CitpbnQgZW11MTBrMV9tcHVfcmVzZXQoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK2ludCBlbXUxMGsxX21wdV9hY3F1aXJlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7CitpbnQgZW11MTBrMV9tcHVfcmVsZWFzZShzdHJ1Y3QgZW11MTBrMV9jYXJkICopOworCisjZW5kaWYgIC8qIF9IV0FDQ0VTU19IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZG1pZC5oIGIvc291bmQvb3NzL2VtdTEwazEvaWNhcmRtaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTZlZjQxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvaWNhcmRtaWQuaApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgaXNibGl2ZV9taWQuaAorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfSUNBUkRNSURJX0gKKyNkZWZpbmUgX0lDQVJETUlESV9ICisKKy8qIE1JREkgZGVmaW5lcyAqLworI2RlZmluZSBNSURJX0RBVEFfRklSU1QgICAgICAgICAgICAgICAgIDB4MDAKKyNkZWZpbmUgTUlESV9EQVRBX0xBU1QgICAgICAgICAgICAgICAgICAweDdGCisjZGVmaW5lIE1JRElfU1RBVFVTX0ZJUlNUICAgICAgICAgICAgICAgMHg4MAorI2RlZmluZSBNSURJX1NUQVRVU19MQVNUICAgICAgICAgICAgICAgIDB4RkYKKworLyogQ2hhbm5lbCBzdGF0dXMgYnl0ZXMgKi8KKyNkZWZpbmUgTUlESV9TVEFUVVNfQ0hBTk5FTF9GSVJTVCAgICAgICAweDgwCisjZGVmaW5lIE1JRElfU1RBVFVTX0NIQU5ORUxfTEFTVCAgICAgICAgMHhFMAorI2RlZmluZSBNSURJX1NUQVRVU19DSEFOTkVMX01BU0sgICAgICAgIDB4RjAKKworLyogQ2hhbm5lbCB2b2ljZSBtZXNzYWdlcyAqLworI2RlZmluZSBNSURJX1ZPSUNFX05PVEVfT0ZGICAgICAgICAgICAgIDB4ODAKKyNkZWZpbmUgTUlESV9WT0lDRV9OT1RFX09OICAgICAgICAgICAgICAweDkwCisjZGVmaW5lIE1JRElfVk9JQ0VfUE9MWV9QUkVTU1VSRSAgICAgICAgMHhBMAorI2RlZmluZSBNSURJX1ZPSUNFX0NPTlRST0xfQ0hBTkdFICAgICAgIDB4QjAKKyNkZWZpbmUgTUlESV9WT0lDRV9QUk9HUkFNX0NIQU5HRSAgICAgICAweEMwCisjZGVmaW5lIE1JRElfVk9JQ0VfQ0hBTk5FTF9QUkVTU1VSRSAgICAgMHhEMAorI2RlZmluZSBNSURJX1ZPSUNFX1BJVENIX0JFTkQgICAgICAgICAgIDB4RTAKKworLyogQ2hhbm5lbCBtb2RlIG1lc3NhZ2VzICovCisjZGVmaW5lIE1JRElfTU9ERV9DSEFOTkVMICAgICAgICAgICAgICAgTUlESV9WT0lDRV9DT05UUk9MX0NIQU5HRQorCisvKiBTeXN0ZW0gc3RhdHVzIGJ5dGVzICovCisjZGVmaW5lIE1JRElfU1RBVFVTX1NZU1RFTV9GSVJTVCAgICAgICAgMHhGMAorI2RlZmluZSBNSURJX1NUQVRVU19TWVNURU1fTEFTVCAgICAgICAgIDB4RkYKKworLyogU3lzdGVtIGV4Y2x1c2l2ZSBtZXNzYWdlcyAqLworI2RlZmluZSBNSURJX1NZU0VYX0JFR0lOICAgICAgICAgICAgICAgIDB4RjAKKyNkZWZpbmUgTUlESV9TWVNFWF9FT1ggICAgICAgICAgICAgICAgICAweEY3CisKKy8qIFN5c3RlbSBjb21tb24gbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUlESV9DT01NT05fVENRRiAgICAgICAgICAgICAgICAweEYxCS8qIFRpbWUgY29kZSBxdWFydGVyIGZyYW1lICAqLworI2RlZmluZSBNSURJX0NPTU1PTl9TT05HX1BPU0lUSU9OICAgICAgIDB4RjIKKyNkZWZpbmUgTUlESV9DT01NT05fU09OR19TRUxFQ1QgICAgICAgICAweEYzCisjZGVmaW5lIE1JRElfQ09NTU9OX1VOREVGSU5FRF9GNCAgICAgICAgMHhGNAorI2RlZmluZSBNSURJX0NPTU1PTl9VTkRFRklORURfRjUgICAgICAgIDB4RjUKKyNkZWZpbmUgTUlESV9DT01NT05fVFVORV9SRVFVRVNUICAgICAgICAweEY2CisKKy8qIFN5c3RlbSByZWFsLXRpbWUgbWVzc2FnZXMgKi8KKyNkZWZpbmUgTUlESV9SVElNRV9USU1JTkdfQ0xPQ0sgICAgICAgICAweEY4CisjZGVmaW5lIE1JRElfUlRJTUVfVU5ERUZJTkVEX0Y5ICAgICAgICAgMHhGOQorI2RlZmluZSBNSURJX1JUSU1FX1NUQVJUICAgICAgICAgICAgICAgIDB4RkEKKyNkZWZpbmUgTUlESV9SVElNRV9DT05USU5VRSAgICAgICAgICAgICAweEZCCisjZGVmaW5lIE1JRElfUlRJTUVfU1RPUCAgICAgICAgICAgICAgICAgMHhGQworI2RlZmluZSBNSURJX1JUSU1FX1VOREVGSU5FRF9GRCAgICAgICAgIDB4RkQKKyNkZWZpbmUgTUlESV9SVElNRV9BQ1RJVkVfU0VOU0lORyAgICAgICAweEZFCisjZGVmaW5lIE1JRElfUlRJTUVfU1lTVEVNX1JFU0VUICAgICAgICAgMHhGRgorCisvKiBGbGFncyBmb3IgZmxhZ3MgcGFybSBvZiBtaWRpT3V0Q2FjaGVQYXRjaGVzKCksIG1pZGlPdXRDYWNoZURydW1QYXRjaGVzKCkgKi8KKyNkZWZpbmUgTUlESV9DQUNIRV9BTEwgICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIE1JRElfQ0FDSEVfQkVTVEZJVCAgICAgICAgICAgICAgMgorI2RlZmluZSBNSURJX0NBQ0hFX1FVRVJZICAgICAgICAgICAgICAgIDMKKyNkZWZpbmUgTUlESV9VTkNBQ0hFICAgICAgICAgICAgICAgICAgICA0CisKKy8qIEV2ZW50IGRlY2xhcmF0aW9ucyBmb3IgTVBVIElSUSBDYWxsYmFja3MgKi8KKyNkZWZpbmUgSUNBUkRNSURJX0lOTE9OR0RBVEEgICAgICAgICAgICAweDAwMDAwMDAxIC8qIE1JTV9MT05HREFUQSAqLworI2RlZmluZSBJQ0FSRE1JRElfSU5MT05HRVJST1IgICAgICAgICAgIDB4MDAwMDAwMDIgLyogTUlNX0xPTkdFUlJPUiAqLworI2RlZmluZSBJQ0FSRE1JRElfT1VUTE9OR0RBVEEgICAgICAgICAgIDB4MDAwMDAwMDQgLyogTU9NX0RPTkUgZm9yIE1QVSBPVVQgYnVmZmVyICovCisjZGVmaW5lIElDQVJETUlESV9JTkRBVEEgICAgICAgICAgICAgICAgMHgwMDAwMDAxMCAvKiBNSU1fREFUQSAqLworI2RlZmluZSBJQ0FSRE1JRElfSU5EQVRBRVJST1IgICAgICAgICAgIDB4MDAwMDAwMjAgLyogTUlNX0VSUk9SICovCisKKy8qIERlY2xhcmF0aW9uIGZvciBmbGFncyBpbiBDQVJETUlESUJVRkZFUkhEUiAqLworLyogTWFrZSBpdCB0aGUgc2FtZSBhcyBNSERSX0RPTkUsIE1IRFJfSU5RVUVVRSBpbiBtbXN5c3RlbS5oICovCisjZGVmaW5lIE1JRElCVUZfRE9ORSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQorI2RlZmluZSBNSURJQlVGX0lOUVVFVUUgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDQKKworLyogRGVjbGFyYXRpb24gZm9yIG1zZyBwYXJhbWV0ZXIgaW4gbWlkaUNhbGxiYWNrRm4gKi8KKyNkZWZpbmUgSUNBUkRNSURJX09VVEJVRkZFUk9LICAgICAgICAgICAweDAwMDAwMDAxCisjZGVmaW5lIElDQVJETUlESV9JTk1JRElPSyAgICAgICAgICAgICAgMHgwMDAwMDAwMgorCisvKiBEZWNsYXJhdGlvbiBmb3IgdGVjaG5vbG9neSBpbiBzdHJ1Y3QgbWlkaV9jYXBzICovCisjZGVmaW5lIE1UX01JRElQT1JUICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMQkvKiBJbiBvcmlnaW5hbCBNSURJT1VUQ0FQUyBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgTVRfRk1TWU5USCAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA0CS8qIEluIG9yaWdpbmFsIE1JRElPVVRDQVBTIHN0cnVjdHVyZSAqLworI2RlZmluZSBNVF9BV0VTWU5USCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgTVRfUENJU1lOVEggICAgICAgICAgICAgICAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIE1UX1BDSVNZTlRINjQgICAgICAgICAgICAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBDQVJETUlESV9BV0VNQVNLICAgICAgICAgICAgICAgIDB4MDAwMEYwMDAKKworZW51bSBMb2NhbEVycm9yQ29kZQoreworICAgICAgICBDVFNUQVRVU19OT1RFTkFCTEVEID0gMHg3MDAwLAorICAgICAgICBDVFNUQVRVU19SRUFEWSwKKyAgICAgICAgQ1RTVEFUVVNfQlVTWSwKKyAgICAgICAgQ1RTVEFUVVNfREFUQUFWQUlMLAorICAgICAgICBDVFNUQVRVU19OT0RBVEEsCisgICAgICAgIENUU1RBVFVTX05FWFRfQllURQorfTsKKworLyogTUlESSBkYXRhIGJsb2NrIGhlYWRlciAqLworc3RydWN0IG1pZGlfaGRyCit7CisJdTggKnJlc2VydmVkOwkJLyogUG9pbnRlciB0byBvcmlnaW5hbCBsb2NrZWQgZGF0YSBibG9jayAqLworCXUzMiBidWZmZXJsZW5ndGg7CS8qIExlbmd0aCBvZiBkYXRhIGluIGRhdGEgYmxvY2sgKi8KKwl1MzIgYnl0ZXNyZWNvcmRlZDsJLyogVXNlZCBmb3IgaW5wdXQgb25seSAqLworCXUzMiB1c2VyOwkJLyogRm9yIGNsaWVudCdzIHVzZSAqLworCXUzMiBmbGFnczsJCS8qIEFzc29ydGVkIGZsYWdzIChzZWUgZGVmaW5lcykgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CS8qIFJlc2VydmVkIGZvciBkcml2ZXIgKi8KKwl1OCAqZGF0YTsJCS8qIFNlY29uZCBjb3B5IG9mIGZpcnN0IHBvaW50ZXIgKi8KK307CisKKy8qIEVudW1lcmF0aW9uIGZvciBTZXRDb250cm9sICovCitlbnVtCit7CisJTUlESU9CSlZPTFVNRSA9IDB4MSwKKwlNSURJUVVFUllBQ1RJVkVJTlNUCit9OworCitzdHJ1Y3QgbWlkaV9xdWV1ZQoreworCXN0cnVjdCBtaWRpX3F1ZXVlICAqbmV4dDsKKwl1MzIgcXR5cGU7ICAgICAgICAgICAgLyogMCA9IHNob3J0IG1lc3NhZ2UsIDEgPSBsb25nIGRhdGEgKi8KKwl1MzIgbGVuZ3RoOworCXUzMiBzaXplTGVmdDsKKwl1OCAqbWlkaWJ5dGU7CisJdW5zaWduZWQgbG9uZyByZWZkYXRhOworfTsKKworc3RydWN0IG1pZGlfb3BlbmluZm8KK3sKKwl1MzIgICAgIGNic2l6ZTsKKwl1MzIgICAgIGZsYWdzOworCXVuc2lnbmVkIGxvbmcgIHJlZmRhdGE7CisJdTMyICAgICBzdHJlYW1pZDsKK307CisKK2ludCBlbXUxMGsxX21pZGlfY2FsbGJhY2sodW5zaWduZWQgbG9uZyAsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcgKik7CisKKyNlbmRpZiAvKiBfSUNBUkRNSURJX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2ljYXJkd2F2LmggYi9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZHdhdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmU0MDkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9pY2FyZHdhdi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgaWNhcmR3YXYuaAorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICogCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcyAKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tIAorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZSAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIAorICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIAorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIAorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuIAorICogCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIAorICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCAKKyAqICAgICBVU0EuIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqLworCisjaWZuZGVmIF9JQ0FSRFdBVl9ICisjZGVmaW5lIF9JQ0FSRFdBVl9ICisKK3N0cnVjdCB3YXZlX2Zvcm1hdCAKK3sKKwlpbnQgaWQ7CisJaW50IHNhbXBsaW5ncmF0ZTsKKwl1OCBiaXRzcGVyY2hhbm5lbDsKKwl1OCBjaGFubmVsczsJCS8qIDEgPSBNb25vLCAyID0gU3RlcmVvLCAzLCAuLi4gPSBNdWx0aWNoYW5uZWwgKi8KKwl1OCBieXRlc3BlcmNoYW5uZWw7CisJdTggYnl0ZXNwZXJ2b2ljZXNhbXBsZTsKKwl1OCBieXRlc3BlcnNhbXBsZTsKKwlpbnQgYnl0ZXNwZXJzZWM7CisJdTggcGFzc3Rocm91Z2g7Cit9OworCisvKiBlbXUxMGsxX3dhdmUgc3RhdGVzICovCisjZGVmaW5lIFdBVkVfU1RBVEVfT1BFTgkJMHgwMQkKKyNkZWZpbmUgV0FWRV9TVEFURV9TVEFSVEVECTB4MDIKKyNkZWZpbmUgV0FWRV9TVEFURV9DTE9TRUQJMHgwNAorCisjZW5kaWYgLyogX0lDQVJEV0FWX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5jIGIvc291bmQvb3NzL2VtdTEwazEvaXJxbWdyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE5YjQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5jCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBpcnFtZ3IuYyAtIElSUSBtYW5hZ2VyIGZvciBlbXUxMGsxIGRyaXZlcgorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgImh3YWNjZXNzLmgiCisjaW5jbHVkZSAiODAxMC5oIgorI2luY2x1ZGUgImNhcmRtaS5oIgorI2luY2x1ZGUgImNhcmRtby5oIgorI2luY2x1ZGUgImlycW1nci5oIgorCisvKiBJbnRlcnJ1cHQgaGFuZGxlciAqLworCitpcnFyZXR1cm5fdCBlbXUxMGsxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSAoc3RydWN0IGVtdTEwazFfY2FyZCAqKSBkZXZfaWQ7CisJdTMyIGlycXN0YXR1cywgaXJxc3RhdHVzX3RtcDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwlEUEQoNCwgImVtdTEwazFfaW50ZXJydXB0IGNhbGxlZCwgaXJxID0gICV1XG4iLCBpcnEpOworCisJLyoKKwkgKiogTk9URSA6CisJICoqIFdlIGRvIGEgJ3doaWxlIGxvb3AnIGhlcmUgY29zIG9uIGNlcnRhaW4gbWFjaGluZXMsIHdpdGggYm90aAorCSAqKiBwbGF5YmFjayBhbmQgcmVjb3JkaW5nIGdvaW5nIG9uIGF0IHRoZSBzYW1lIHRpbWUsIElSUXMgd2lsbAorCSAqKiBzdG9wIGNvbWluZyBpbiBhZnRlciBhIHdoaWxlLiBDaGVja2luZyBJUE5EIGluZGVlZCBzaG93cyB0aGF0CisJICoqIHRoZXJlIGFyZSBpbnRlcnJ1cHRzIHBlbmRpbmcgYnV0IHRoZSBQSUMgc2F5cyBubyBJUlFzIHBlbmRpbmcuCisJICoqIEkgc3VzcGVjdCB0aGF0IHNvbWUgYm9hcmRzIG5lZWQgZWRnZS10cmlnZ2VyZWQgSVJRcyBidXQgYXJlIG5vdAorCSAqKiBnZXR0aW5nIHRoYXQgY29uZGl0aW9uIGlmIHdlIGRvbid0IGNvbXBsZXRlbHkgY2xlYXIgdGhlIElQTkQKKwkgKiogKG1ha2Ugc3VyZSBubyBtb3JlIGludGVycnVwdHMgYXJlIHBlbmRpbmcpLgorCSAqKiAtIEVyaWMKKwkgKi8KKworCXdoaWxlICgoaXJxc3RhdHVzID0gaW5sKGNhcmQtPmlvYmFzZSArIElQUikpKSB7CisJCURQRCg0LCAiaXJxIHN0YXR1cyAlI3hcbiIsIGlycXN0YXR1cyk7CisKKwkJaXJxc3RhdHVzX3RtcCA9IGlycXN0YXR1czsKKworCQlpZiAoaXJxc3RhdHVzICYgSVJRVFlQRV9USU1FUikgeworCQkJZW11MTBrMV90aW1lcl9pcnFoYW5kbGVyKGNhcmQpOworCQkJaXJxc3RhdHVzICY9IH5JUlFUWVBFX1RJTUVSOworCQl9CisKKwkJaWYgKGlycXN0YXR1cyAmIElSUVRZUEVfRFNQKSB7CisJCQllbXUxMGsxX2RzcF9pcnFoYW5kbGVyKGNhcmQpOworCQkJaXJxc3RhdHVzICY9IH5JUlFUWVBFX0RTUDsKKwkJfQorCisJCWlmIChpcnFzdGF0dXMgJiBJUlFUWVBFX01QVUlOKSB7CisJCQllbXUxMGsxX21wdWluX2lycWhhbmRsZXIoY2FyZCk7CisJCQlpcnFzdGF0dXMgJj0gfklSUVRZUEVfTVBVSU47CisJCX0KKworCQlpZiAoaXJxc3RhdHVzICYgSVJRVFlQRV9NUFVPVVQpIHsKKwkJCWVtdTEwazFfbXB1b3V0X2lycWhhbmRsZXIoY2FyZCk7CisJCQlpcnFzdGF0dXMgJj0gfklSUVRZUEVfTVBVT1VUOworCQl9CisKKwkJaWYgKGlycXN0YXR1cyAmIElQUl9NVVRFKSB7CisJCQllbXUxMGsxX211dGVfaXJxaGFuZGxlcihjYXJkKTsKKwkJCWlycXN0YXR1cyAmPX5JUFJfTVVURTsKKwkJfQorCisJCWlmIChpcnFzdGF0dXMgJiBJUFJfVk9MSU5DUikgeworCQkJZW11MTBrMV92b2xpbmNyX2lycWhhbmRsZXIoY2FyZCk7CisJCQlpcnFzdGF0dXMgJj1+SVBSX1ZPTElOQ1I7CisJCX0KKworCQlpZiAoaXJxc3RhdHVzICYgSVBSX1ZPTERFQ1IpIHsKKwkJCWVtdTEwazFfdm9sZGVjcl9pcnFoYW5kbGVyKGNhcmQpOworCQkJaXJxc3RhdHVzICY9fklQUl9WT0xERUNSOworCQl9CisKKwkJaWYgKGlycXN0YXR1cyl7CisJCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IFdhcm5pbmcsIHVuaGFuZGxlZCBpbnRlcnJ1cHQ6ICUjMDh4XG4iLCBpcnFzdGF0dXMpOworCQkJLy9tYWtlIHN1cmUgYW55IGludGVycnVwdHMgd2UgZG9uJ3QgaGFuZGxlIGFyZSBkaXNhYmxlZDoKKwkJCWVtdTEwazFfaXJxX2Rpc2FibGUoY2FyZCwgfihJTlRFX01JRElSWEVOQUJMRSB8IElOVEVfTUlESVRYRU5BQkxFIHwgSU5URV9JTlRFUlZBTFRJTUVSRU5CIHwKKwkJCQkJCUlOVEVfVk9MREVDUkVOQUJMRSB8IElOVEVfVk9MSU5DUkVOQUJMRSB8IElOVEVfTVVURUVOQUJMRSB8CisJCQkJCQlJTlRFX0ZYRFNQRU5BQkxFKSk7CisJCX0KKworCQkvKiBhY2tub3dsZWRnZSBpbnRlcnJ1cHQgKi8KKwkJb3V0bChpcnFzdGF0dXNfdG1wLCBjYXJkLT5pb2Jhc2UgKyBJUFIpOworCQloYW5kbGVkID0gMTsKKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuaCBiL3NvdW5kL29zcy9lbXUxMGsxL2lycW1nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlN2M5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9pcnFtZ3IuaApAQCAtMCwwICsxLDUyIEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBpcnEuaAorICogICAgIENvcHlyaWdodCAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzCisgKiAgICAgLS0tLSAgICAgICAgICAgICAgICAgLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLQorICogICAgIE9jdG9iZXIgMjAsIDE5OTkgICAgIEJlcnRyYW5kIExlZSAgICBiYXNlIGNvZGUgcmVsZWFzZQorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2lmbmRlZiBfSVJRX0gKKyNkZWZpbmUgX0lSUV9ICisKKy8qIEVNVSBJcnEgVHlwZXMgKi8KKyNkZWZpbmUgSVJRVFlQRV9QQ0lCVVNFUlJPUglJUFJfUENJRVJST1IKKyNkZWZpbmUgSVJRVFlQRV9NSVhFUkJVVFRPTgkoSVBSX1ZPTElOQ1IgfCBJUFJfVk9MREVDUiB8IElQUl9NVVRFKQorI2RlZmluZSBJUlFUWVBFX1ZPSUNFCQkoSVBSX0NIQU5ORUxMT09QIHwgSVBSX0NIQU5ORUxOVU1CRVJNQVNLKQorI2RlZmluZSBJUlFUWVBFX1JFQ09SRAkJKElQUl9BRENCVUZGVUxMIHwgSVBSX0FEQ0JVRkhBTEZGVUxMIHwgSVBSX01JQ0JVRkZVTEwgfCBJUFJfTUlDQlVGSEFMRkZVTEwgfCBJUFJfRUZYQlVGRlVMTCB8IElQUl9FRlhCVUZIQUxGRlVMTCkKKyNkZWZpbmUgSVJRVFlQRV9NUFVPVVQJCShJUFJfTUlESVRSQU5TQlVGRU1QVFkgfCBBX0lQUl9NSURJVFJBTlNCVUZFTVBUWTIpIAorI2RlZmluZSBJUlFUWVBFX01QVUlOCQkoSVBSX01JRElSRUNWQlVGRU1QVFkgfCBBX0lQUl9NSURJUkVDVkJVRkVNUFRZMikKKyNkZWZpbmUgSVJRVFlQRV9USU1FUgkJSVBSX0lOVEVSVkFMVElNRVIKKyNkZWZpbmUgSVJRVFlQRV9TUERJRgkJKElQUl9HUFNQRElGU1RBVFVTQ0hBTkdFIHwgSVBSX0NEUk9NU1RBVFVTQ0hBTkdFKQorI2RlZmluZSBJUlFUWVBFX0RTUAkJSVBSX0ZYRFNQCisKK3ZvaWQgZW11MTBrMV90aW1lcl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKik7Cit2b2lkIGVtdTEwazFfZHNwX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK3ZvaWQgZW11MTBrMV9tdXRlX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK3ZvaWQgZW11MTBrMV92b2xpbmNyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKK3ZvaWQgZW11MTBrMV92b2xkZWNyX2lycWhhbmRsZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqKTsKKworI2VuZGlmIC8qIF9JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvbWFpbi5jIGIvc291bmQvb3NzL2VtdTEwazEvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOTA1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9tYWluLmMKQEAgLTAsMCArMSwxNDc1IEBACisgLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgbWFpbi5jIC0gQ3JlYXRpdmUgRU1VMTBLMSBhdWRpbyBkcml2ZXIKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cCBzdHVmZgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBTdXBwb3J0ZWQgZGV2aWNlczoKKyAqICAgICAgL2Rldi9kc3A6ICAgICAgICBTdGFuZGFyZCAvZGV2L2RzcCBkZXZpY2UsIE9TUy1jb21wYXRpYmxlCisgKiAgICAgIC9kZXYvZHNwMTogICAgICAgUm91dGVzIHRvIHJlYXIgc3BlYWtlcnMgb25seQkgCisgKiAgICAgIC9kZXYvbWl4ZXI6ICAgICAgU3RhbmRhcmQgL2Rldi9taXhlciBkZXZpY2UsIE9TUy1jb21wYXRpYmxlCisgKiAgICAgIC9kZXYvbWlkaTogICAgICAgUmF3IE1JREkgVUFSVCBkZXZpY2UsIG1vc3RseSBPU1MtY29tcGF0aWJsZQorICoJL2Rldi9zZXF1ZW5jZXI6ICBTZXF1ZW5jZXIgSW50ZXJmYWNlIChyZXF1aXJlcyBzb3VuZC5vKQorICoKKyAqICAgICAgUmV2aXNpb24gaGlzdG9yeToKKyAqICAgICAgMC4xIGJldGEgSW5pdGlhbCByZWxlYXNlCisgKiAgICAgIDAuMiBMb3dlcmVkIGluaXRpYWwgbWl4ZXIgdm9sLiBJbXByb3ZlZCBvbiBzdHV0dGVyaW5nIHdhdmUgcGxheWJhY2suIEFkZGVkIE1JREkgVUFSVCBzdXBwb3J0LgorICogICAgICAwLjMgRml4ZWQgbWl4ZXIgcm91dGluZyBidWcsIGFkZGVkIEFQUywgam95c3RpY2sgc3VwcG9ydC4KKyAqICAgICAgMC40IEFkZGVkIHJlYXItY2hhbm5lbCwgU1BESUYgc3VwcG9ydC4KKyAqCTAuNSBTb3VyY2UgY2xlYW51cCwgU01QIGZpeGVzLCBtdWx0aW9wZW4gc3VwcG9ydCwgNjQgYml0IGFyY2ggZml4ZXMsCisgKgkgICAgbW92ZWQgYmgncyB0byB0YXNrbGV0cywgbW92ZWQgdG8gdGhlIG5ldyBQQ0kgZHJpdmVyIGluaXRpYWxpemF0aW9uIHN0eWxlLgorICoJMC42IE1ha2UgdXNlIG9mIHBjaV9hbGxvY19jb25zaXN0ZW50LCBpbXByb3ZlIGNvbXBhdGliaWxpdHkgbGF5ZXIgZm9yIDIuMiBrZXJuZWxzLAorICoJICAgIGNvZGUgcmVvcmdhbml6YXRpb24gYW5kIGNsZWFudXAuCisgKgkwLjcgU3VwcG9ydCBmb3IgdGhlIEVtdS1BUFMuIEJ1ZyBmaXhlcyBmb3Igdm9pY2UgY2FjaGUgc2V0dXAsIG1tYXBlZCBzb3VuZCArIHBvbGwoKS4KKyAqICAgICAgICAgIFN1cHBvcnQgZm9yIHNldHRpbmcgZXh0ZXJuYWwgVFJBTSBzaXplLgorICogICAgICAwLjggTWFrZSB1c2Ugb2YgdGhlIGtlcm5lbCBhYzk3IGludGVyZmFjZS4gU3VwcG9ydCBmb3IgYSBkc3AgcGF0Y2ggbWFuYWdlci4KKyAqICAgICAgMC45IFJlLWVuYWJsZXMgcmVhciBzcGVha2VycyB2b2x1bWUgY29udHJvbHMKKyAqICAgICAwLjEwIEluaXRpYWxpemVzIHJlYXIgc3BlYWtlciB2b2x1bWUuCisgKgkgICAgRHluYW1pYyBwYXRjaCBzdG9yYWdlIGFsbG9jYXRpb24uCisgKgkgICAgTmV3IHByaXZhdGUgaW9jdGxzIHRvIGNoYW5nZSBjb250cm9sIGdwciB2YWx1ZXMuCisgKgkgICAgRW5hYmxlIHZvbHVtZSBjb250cm9sIGludGVycnVwdHMuCisgKgkgICAgQnkgZGVmYXVsdCBlbmFibGUgZHNwIHJvdXRlcyB0byBkaWdpdGFsIG91dC4gCisgKiAgICAgMC4xMSBGaXhlZCBmeCAvIDQgcHJvYmxlbS4KKyAqICAgICAwLjEyIEltcGxlbWVudGVkIG1tYXBlZCBmb3IgcmVjb3JkaW5nLgorICoJICAgIEZpeGVkIGJ1Zzogbm90IHVucmVzZXJ2aW5nIG1tYXBlZCBidWZmZXIgcGFnZXMuCisgKgkgICAgSVJRIGhhbmRsZXIgY2xlYW51cC4KKyAqICAgICAwLjEzIEZpeGVkIHByb2JsZW0gd2l0aCBkc3AxCisgKiAgICAgICAgICBTaW1wbGlmaWVkIGRzcCBwYXRjaCB3cml0aW5nIChpbnNpZGUgdGhlIGRyaXZlcikKKyAqCSAgICBGaXhlZCBzZXZlcmFsIGJ1Z3MgZm91bmQgYnkgdGhlIFN0YW5mb3JkIHRvb2xzCisgKiAgICAgMC4xNCBOZXcgY29udHJvbCBncHIgdG8gb3NzIG1peGVyIG1hcHBpbmcgZmVhdHVyZSAoQ2hyaXMgUHVybmVsbCkKKyAqICAgICAgICAgIEFkZGVkIEFDMyBQYXNzdGhyb3VnaCBTdXBwb3J0IChKdWhhIFlyam9sYSkKKyAqICAgICAgICAgIEFkZGVkIFN1cHBvcnQgZm9yIDUuMSBjYXJkcyAoZGlnaXRhbCBvdXQgYW5kIHRoZSB0aGlyZCBhbmFsb2cgb3V0KQorICogICAgIDAuMTUgQWRkZWQgU2VxdWVuY2VyIFN1cHBvcnQgKERhbmllbCBNYWNrKQorICogICAgICAgICAgU3VwcG9ydCBmb3IgbXVsdGljaGFubmVsIHBjbSBwbGF5YmFjayAoRWR1YXJkIEhhc2VubGVpdGhuZXIpCisgKiAgICAgMC4xNiBNaXhlciBpbXByb3ZlbWVudHMsIGFkZGVkIG9sZCB0cmVibGUvYmFzcyBzdXBwb3J0IChEYW5pZWwgQmVydHJhbmQpCisgKiAgICAgICAgICBTbWFsbCBjb2RlIGZvcm1hdCBjbGVhbnVwLgorICogICAgICAgICAgRGVhZGxvY2sgYnVnIGZpeCBmb3IgZW11MTBrMV92b2x4eHhfaXJxaGFuZGxlcigpLgorICogICAgIDAuMTcgRml4IGZvciBtaXhlciBTT1VORF9NSVhFUl9JTkZPIGlvY3RsLgorICoJICAgIEZpeCBmb3IgSElHSE1FTSBtYWNoaW5lcyAoZW11MTBrMSBjYW4gb25seSBkbyAzMSBiaXQgYnVzIG1hc3RlcikgCisgKgkgICAgbWlkaSBwb2xsIGluaXRpYWwgaW1wbGVtZW50YXRpb24uCisgKgkgICAgU21hbGwgbWl4ZXIgZml4ZXMvY2xlYW51cHMuCisgKgkgICAgSW1wcm92ZWQgc3VwcG9ydCBmb3IgNS4xIGNhcmRzLgorICogICAgIDAuMTggRml4IGZvciBwb3NzaWJsZSBsZWFrIGluIHBjaV9hbGxvY19jb25zaXN0ZW50KCkKKyAqICAgICAgICAgIENsZWFuZWQgdXAgcG9sbCgpIGZ1bmN0aW9ucyAoYXVkaW8gYW5kIG1pZGkpLiBEb24ndCBzdGFydCBpbnB1dC4KKyAqCSAgICBSZXN0cmljdCBETUEgcGFnZXMgdXNlZCB0byA1MTJNaWIgcmFuZ2UuCisgKgkgICAgTmV3IEFDOTdfQk9PU1QgbWl4ZXIgaW9jdGwuCisgKiAgICAwLjE5YSBBZGRlZCBTdXBwb3J0IGZvciBBdWRpZ3kgQ2FyZHMKKyAqCSAgICBSZWFsIGZpeCBmb3Iga2VybmVsIHdpdGggaGlnaG1lbSBzdXBwb3J0IChjYXN0IGRtYV9oYW5kbGUgdG8gdTMyKS4KKyAqCSAgICBGaXggcmVjb3JkaW5nIGJ1ZmZlcmluZyBwYXJhbWV0ZXJzIGNhbGN1bGF0aW9uLgorICoJICAgIFVzZSB1bnNpZ25lZCBsb25nIGZvciB2YXJpYWJsZXMgaW4gYml0IG9wcy4KKyAqICAgIDAuMjBhIEZpeGVkIHJlY29yZGluZyBzdGFydHVwCisgKgkgICAgRml4ZWQgdGltZXIgcmF0ZSBzZXR0aW5nIChpdCdzIGEgMTYtYml0IHJlZ2lzdGVyKQorICoJMC4yMSBDb252ZXJ0ZWQgY29kZSB0byB1c2UgcGNpX25hbWUoKSBpbnN0ZWFkIG9mIGFjY2Vzc2luZyBzbG90X25hbWUKKyAqCSAgICBkaXJlY3RseSAoRXVnZW5lIFRlbykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIFRoZXNlIGFyZSBvbmx5IGluY2x1ZGVkIG9uY2UgcGVyIG1vZHVsZSAqLworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisKKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorI2luY2x1ZGUgIjgwMTAuaCIKKyNpbmNsdWRlICJlZnhtZ3IuaCIKKyNpbmNsdWRlICJjYXJkd28uaCIKKyNpbmNsdWRlICJjYXJkd2kuaCIKKyNpbmNsdWRlICJjYXJkbW8uaCIKKyNpbmNsdWRlICJjYXJkbWkuaCIKKyNpbmNsdWRlICJyZWNtZ3IuaCIKKyNpbmNsdWRlICJlY2FyZC5oIgorCisKKyNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgorI2RlZmluZSBNSURJX1NZTlRIX05BTUUgIkVNVTEwSzEgTUlESSIKKyNkZWZpbmUgTUlESV9TWU5USF9DQVBTIFNZTlRIX0NBUF9JTlBVVAorIAorI2luY2x1ZGUgIi4uL3NvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgIi4uL21pZGlfc3ludGguaCIKKworLyogdGhpcyBzaG91bGQgYmUgaW4gZGV2X3RhYmxlLmggKi8KKyNkZWZpbmUgU05EQ0FSRF9FTVUxMEsxIDQ2CisjZW5kaWYKKyAKKworLyogdGhlIGVtdTEwazEgX3NlZW1zXyB0byBvbmx5IHN1cHBvcnRzIDI5IGJpdCAoNTEyTWlCKSBiaXQgYnVzIG1hc3RlciAqLworI2RlZmluZSBFTVUxMEsxX0RNQV9NQVNLICAgICAgICAgICAgICAgIDB4MWZmZmZmZmYJLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLworCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfQ1JFQVRJVkUKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9DUkVBVElWRSAweDExMDIKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfRU1VMTBLMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0VNVTEwSzEgMHgwMDAyCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9DUkVBVElWRV9BVURJR1kKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9DUkVBVElWRV9BVURJR1kgMHgwMDA0CisjZW5kaWYKKworI2RlZmluZSBFTVVfQVBTX1NVQklECTB4NDAwMTExMDIKKyAKK2VudW0geworCUVNVTEwSzEgPSAwLAorCUFVRElHWSwKK307CisKK3N0YXRpYyBjaGFyICpjYXJkX25hbWVzW10gX19kZXZpbml0ZGF0YSA9IHsKKwkiRU1VMTBLMSIsCisJIkF1ZGlneSIsCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgZW11MTBrMV9wY2lfdGJsW10gPSB7CisJe1BDSV9WRU5ET1JfSURfQ1JFQVRJVkUsIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfRU1VMTBLMSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgRU1VMTBLMX0sCisJe1BDSV9WRU5ET1JfSURfQ1JFQVRJVkUsIFBDSV9ERVZJQ0VfSURfQ1JFQVRJVkVfQVVESUdZLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBVURJR1l9LAorCXswLH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBlbXUxMGsxX3BjaV90YmwpOworCisvKiBHbG9iYWwgdmFyIGluc3RhbnRpYXRpb24gKi8KKworTElTVF9IRUFEKGVtdTEwazFfZGV2cyk7CisKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfYXVkaW9fZm9wczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfbWl4ZXJfZm9wczsKK2V4dGVybiBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9mb3BzOworCisjaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIGVtdTEwazFfbWlkaV9vcGVyYXRpb25zOworI2VuZGlmCisKK2V4dGVybiBpcnFyZXR1cm5fdCBlbXUxMGsxX2ludGVycnVwdChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKnMpOworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX2F1ZGlvX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwkvKiBBc3NpZ24gZGVmYXVsdCBwbGF5YmFjayB2b2ljZSBwYXJhbWV0ZXJzICovCisJaWYgKGNhcmQtPmlzX2F1ZGlneSkKKwkJY2FyZC0+bWNoYW5uZWxfZnggPSAwOworCWVsc2UKKwkJY2FyZC0+bWNoYW5uZWxfZnggPSA4OworCisKKwlpZiAoY2FyZC0+aXNfYXVkaWd5KSB7CisJCS8qIG1vbm8gdm9pY2UgKi8KKwkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9NT05PXSA9IDB4ZmZmZmZmZmY7CisJCWNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfTU9OT10gPSAweDAwMDBmZmZmOworCQorCQkvKiBzdGVyZW8gdm9pY2UgKi8KKwkJLyogbGVmdCAqLworCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX0xFRlRdID0gMHgwMGZmMDBmZjsKKwkJY2FyZC0+d2F2ZW91dC5zZW5kX2hnZmVbU0VORF9MRUZUXSA9IDB4MDAwMDdmN2Y7CQorCQkvKiByaWdodCAqLworCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX1JJR0hUXSA9IDB4ZmYwMGZmMDA7CisJCWNhcmQtPndhdmVvdXQuc2VuZF9oZ2ZlW1NFTkRfUklHSFRdID0gMHgwMDAwN2Y3ZjsKKworCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QQ01dID0gMHgwMzAyMDEwMDsgLy8gUmVndWxhciBwY20KKwkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmcyW1JPVVRFX1BDTV0gPSAweDA3MDYwNTA0OworCisJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BUXSA9IDB4M2YzZjNkM2M7IC8vIFBhc3N0aHJvdWdoCisJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nMltST1VURV9QVF0gPSAweDNmM2YzZjNmOworCQkKKwkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbUk9VVEVfUENNMV0gPSAweDAzMDIwMTAwOyAvLyBTcGFyZQorCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZzJbUk9VVEVfUENNMV0gPSAweDA3MDYwNDA0OworCQkKKwl9IGVsc2UgeworCQkvKiBtb25vIHZvaWNlICovCisJCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhW1NFTkRfTU9OT10gPSAweDAwMDBmZmZmOworCQorCQkvKiBzdGVyZW8gdm9pY2UgKi8KKwkJLyogbGVmdCAqLworCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVtTRU5EX0xFRlRdID0gMHgwMDAwMDBmZjsKKwkJLyogcmlnaHQgKi8KKwkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbU0VORF9SSUdIVF0gPSAweDAwMDBmZjAwOworCisJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTV0gPSAweDMyMTA7IC8vIHBjbQorCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1tST1VURV9QVF0gPSAweDMyMTA7IC8vIHBhc3N0aHJvdWdoCisJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nW1JPVVRFX1BDTTFdID0gMHg3NjU0OyAvLyAvZGV2L2RzcDEKKwl9CisKKwkvKiBBc3NpZ24gZGVmYXVsdCByZWNvcmRpbmcgcGFyYW1ldGVycyAqLworCS8qIEZJWE1FICovCisJaWYgKGNhcmQtPmlzX2FwcykKKwkJY2FyZC0+d2F2ZWluLnJlY3NyYyA9IFdBVkVSRUNPUkRfRlg7CisJZWxzZQorCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9BQzk3OworCisJY2FyZC0+d2F2ZWluLmZ4d2MgPSAweDAwMDM7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGVtdTEwazFfYXVkaW9fY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX3JlZ2lzdGVyX2RldmljZXMoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwljYXJkLT5hdWRpb19kZXYgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmVtdTEwazFfYXVkaW9fZm9wcywgLTEpOworCWlmIChjYXJkLT5hdWRpb19kZXYgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IHJlZ2lzdGVyIGZpcnN0IGF1ZGlvIGRldmljZSFcbiIpOworCQlnb3RvIGVycl9kZXY7CisJfQorCisJY2FyZC0+YXVkaW9fZGV2MSA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZW11MTBrMV9hdWRpb19mb3BzLCAtMSk7CisJaWYgKGNhcmQtPmF1ZGlvX2RldjEgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IHJlZ2lzdGVyIHNlY29uZCBhdWRpbyBkZXZpY2UhXG4iKTsKKwkJZ290byBlcnJfZGV2MTsKKwl9CisKKwljYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmZW11MTBrMV9taXhlcl9mb3BzLCAtMSk7CisJaWYgKGNhcmQtPmFjOTctPmRldl9taXhlciA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgbWl4ZXIgZGV2aWNlXG4iKTsKKwkJZ290byBlcnJfbWl4ZXI7CisgICAgICAgIH0KKworCWNhcmQtPm1pZGlfZGV2ID0gcmVnaXN0ZXJfc291bmRfbWlkaSgmZW11MTBrMV9taWRpX2ZvcHMsIC0xKTsKKwlpZiAoY2FyZC0+bWlkaV9kZXYgPCAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgbWlkaSBkZXZpY2UhXG4iKTsKKwkJZ290byBlcnJfbWlkaTsKKyAgICAgICAgfQorCisjaWZkZWYgRU1VMTBLMV9TRVFVRU5DRVIKKwljYXJkLT5zZXFfZGV2ID0gc291bmRfYWxsb2NfbWlkaWRldigpOworCWlmIChjYXJkLT5zZXFfZGV2ID09IC0xKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJlbXUxMGsxOiB1bmFibGUgdG8gcmVnaXN0ZXIgc2VxdWVuY2VyIGRldmljZSEiKTsKKwllbHNlIHsKKwkJc3RkX21pZGlfc3ludGgubWlkaV9kZXYgPSBjYXJkLT5zZXFfZGV2OworCQltaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0gPSAKKwkJCShzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zICopCisJCQlrbWFsbG9jKHNpemVvZihzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7CisKKwkJaWYgKG1pZGlfZGV2c1tjYXJkLT5zZXFfZGV2XSA9PSBOVUxMKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IHVuYWJsZSB0byBhbGxvY2F0ZSBtZW1vcnkhIik7CisJCQlzb3VuZF91bmxvYWRfbWlkaWRldihjYXJkLT5zZXFfZGV2KTsKKwkJCWNhcmQtPnNlcV9kZXYgPSAtMTsKKwkJCS8qIHJldHVybiB3aXRob3V0IGVycm9yICovCisJCX0gZWxzZSB7CisJCQltZW1jcHkoKGNoYXIgKiltaWRpX2RldnNbY2FyZC0+c2VxX2Rldl0sIAorCQkJCShjaGFyICopJmVtdTEwazFfbWlkaV9vcGVyYXRpb25zLCAKKwkJCQlzaXplb2Yoc3RydWN0IG1pZGlfb3BlcmF0aW9ucykpOworCQkJbWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdLT5kZXZjID0gY2FyZDsKKwkJCXNlcXVlbmNlcl9pbml0KCk7CisJCQljYXJkLT5zZXFfbWlkaWRldiA9IE5VTEw7CisJCX0KKwl9CisjZW5kaWYKKwlyZXR1cm4gMDsKKworZXJyX21pZGk6CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3LT5kZXZfbWl4ZXIpOworZXJyX21peGVyOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmF1ZGlvX2Rldik7CitlcnJfZGV2MToKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChjYXJkLT5hdWRpb19kZXYpOworZXJyX2RldjoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgZW11MTBrMV91bnJlZ2lzdGVyX2RldmljZXMoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKyNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgorCWlmIChjYXJkLT5zZXFfZGV2ID4gLTEpIHsKKwkJa2ZyZWUobWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdKTsKKwkJbWlkaV9kZXZzW2NhcmQtPnNlcV9kZXZdID0gTlVMTDsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYoY2FyZC0+c2VxX2Rldik7CisJCWNhcmQtPnNlcV9kZXYgPSAtMTsKKwl9CisjZW5kaWYKKworCXVucmVnaXN0ZXJfc291bmRfbWlkaShjYXJkLT5taWRpX2Rldik7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3LT5kZXZfbWl4ZXIpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmF1ZGlvX2RldjEpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmF1ZGlvX2Rldik7Cit9CisKK3N0YXRpYyBpbnQgZW11MTBrMV9pbmZvX3Byb2MgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgICAgaW50IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gZGF0YTsKKwlpbnQgbGVuID0gMDsKKwkKKwlpZiAoY2FyZCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiRHJpdmVyIFZlcnNpb24gOiAlc1xuIiwgRFJJVkVSX1ZFUlNJT04pOworCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiQ2FyZCB0eXBlICAgICAgOiAlc1xuIiwgY2FyZC0+aXNfYXBzID8gIkFwcyIgOiAoY2FyZC0+aXNfYXVkaWd5ID8gIkF1ZGlneSIgOiAiRW11MTBrMSIpKTsKKwlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIlJldmlzaW9uICAgICAgIDogJWRcbiIsIGNhcmQtPmNoaXByZXYpOworCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiTW9kZWwgICAgICAgICAgOiAlIzA2eFxuIiwgY2FyZC0+bW9kZWwpOworCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiSU8gICAgICAgICAgICAgOiAlIzA2bHgtJSMwNmx4XG4iLCBjYXJkLT5pb2Jhc2UsIGNhcmQtPmlvYmFzZSArIGNhcmQtPmxlbmd0aCAtIDEpOworCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiSVJRICAgICAgICAgICAgOiAlZFxuXG4iLCBjYXJkLT5pcnEpOworCQorCWxlbiArPSBzcHJpbnRmIChwYWdlICsgbGVuLCAiUmVnaXN0ZXJlZCAvZGV2IEVudHJpZXM6XG4iKTsKKwlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvZHNwJWRcbiIsIGNhcmQtPmF1ZGlvX2RldiAvIDE2KTsKKwlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvZHNwJWRcbiIsIGNhcmQtPmF1ZGlvX2RldjEgLyAxNik7CisJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICIvZGV2L21peGVyJWRcbiIsIGNhcmQtPmFjOTctPmRldl9taXhlciAvIDE2KTsKKwlsZW4gKz0gc3ByaW50ZiAocGFnZSArIGxlbiwgIi9kZXYvbWlkaSVkXG4iLCBjYXJkLT5taWRpX2RldiAvIDE2KTsKKworI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCisJbGVuICs9IHNwcmludGYgKHBhZ2UgKyBsZW4sICIvZGV2L3NlcXVlbmNlclxuIik7CisjZW5kaWYKKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfcHJvY19pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJY2hhciBzWzQ4XTsKKworCWlmICghcHJvY19ta2RpciAoImRyaXZlci9lbXUxMGsxIiwgTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gY3JlYXRlIHByb2MgZGlyZWN0b3J5IGRyaXZlci9lbXUxMGsxXG4iKTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOworCWlmICghcHJvY19ta2RpciAocywgTlVMTCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gY3JlYXRlIHByb2MgZGlyZWN0b3J5ICVzXG4iLCBzKTsKKwkJZ290byBlcnJfZW11MTBrMV9wcm9jOworCX0KKworCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzL2luZm8iLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CisJaWYgKCFjcmVhdGVfcHJvY19yZWFkX2VudHJ5IChzLCAwLCBOVUxMLCBlbXUxMGsxX2luZm9fcHJvYywgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gY3JlYXRlIHByb2MgZW50cnkgJXNcbiIsIHMpOworCQlnb3RvIGVycl9kZXZfcHJvYzsKKwl9CisKKwlpZiAoIWNhcmQtPmlzX2FwcykgeworCQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcy9hYzk3IiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOworCQlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKHMsIDAsIE5VTEwsIGFjOTdfcmVhZF9wcm9jLCBjYXJkLT5hYzk3KSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiB1bmFibGUgdG8gY3JlYXRlIHByb2MgZW50cnkgJXNcbiIsIHMpOworCQkJZ290byBlcnJfcHJvY19hYzk3OworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9wcm9jX2FjOTc6CisJc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMvaW5mbyIsIHBjaV9uYW1lKGNhcmQtPnBjaV9kZXYpKTsKKwlyZW1vdmVfcHJvY19lbnRyeShzLCBOVUxMKTsKKworZXJyX2Rldl9wcm9jOgorCXNwcmludGYocywgImRyaXZlci9lbXUxMGsxLyVzIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOworCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOworCitlcnJfZW11MTBrMV9wcm9jOgorCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvZW11MTBrMSIsIE5VTEwpOworCitlcnJfb3V0OgorCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBlbXUxMGsxX3Byb2NfY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCWNoYXIgc1s0OF07CisKKwlpZiAoIWNhcmQtPmlzX2FwcykgeworCQlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcy9hYzk3IiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOworCQlyZW1vdmVfcHJvY19lbnRyeShzLCBOVUxMKTsKKwl9CisKKwlzcHJpbnRmKHMsICJkcml2ZXIvZW11MTBrMS8lcy9pbmZvIiwgcGNpX25hbWUoY2FyZC0+cGNpX2RldikpOworCXJlbW92ZV9wcm9jX2VudHJ5KHMsIE5VTEwpOworCisJc3ByaW50ZihzLCAiZHJpdmVyL2VtdTEwazEvJXMiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CisJcmVtb3ZlX3Byb2NfZW50cnkocywgTlVMTCk7CisJCQorCXJlbW92ZV9wcm9jX2VudHJ5KCJkcml2ZXIvZW11MTBrMSIsIE5VTEwpOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlbXUxMGsxX21peGVyX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgID0gYWM5N19hbGxvY19jb2RlYygpOworCQorCWlmKGNvZGVjID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCBhbGxvY2F0ZSBtaXhlclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwljYXJkLT5hYzk3ID0gY29kZWM7CisJY2FyZC0+YWM5Ny0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKworCWlmICghY2FyZC0+aXNfYXBzKSB7CisJCWNhcmQtPmFjOTctPmlkID0gMDsKKwkJY2FyZC0+YWM5Ny0+Y29kZWNfcmVhZCA9IGVtdTEwazFfYWM5N19yZWFkOworICAgICAgICAJY2FyZC0+YWM5Ny0+Y29kZWNfd3JpdGUgPSBlbXUxMGsxX2FjOTdfd3JpdGU7CisKKwkJaWYgKGFjOTdfcHJvYmVfY29kZWMgKGNhcmQtPmFjOTcpID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogdW5hYmxlIHRvIHByb2JlIEFDOTcgY29kZWNcbiIpOworCQkJZ290byBlcnJfb3V0OworCQl9CisJCS8qIDUuMTogRW5hYmxlIHRoZSBhZGRpdGlvbmFsIEFDOTcgU2xvdHMgYW5kIHVubXV0ZSBleHRyYSBjaGFubmVscyBvbiBBQzk3IGNvZGVjICovCisJCWlmIChjb2RlYy0+Y29kZWNfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCkgJiAweDAwODApeworCQkJcHJpbnRrKEtFUk5fSU5GTyAiZW11MTBrMTogU0JMaXZlISA1LjEgY2FyZCBkZXRlY3RlZFxuIik7IAorCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFDOTdTTE9ULCAwLCBBQzk3U0xPVF9DTlRSIHwgQUM5N1NMT1RfTEZFKTsKKwkJCWNvZGVjLT5jb2RlY193cml0ZShjb2RlYywgQUM5N19TVVJST1VORF9NQVNURVIsIDB4MCk7CisJCX0KKworCQkvLyBGb3JjZSA1Yml0OgkJICAgIAorCQkvL2NhcmQtPmFjOTctPmJpdF9yZXNvbHV0aW9uPTU7CisKKwkJLyogdGhlc2Ugd2lsbCBzdG9yZSB0aGUgb3JpZ2luYWwgdmFsdWVzIGFuZCBuZXZlciBiZSBtb2RpZmllZCAqLworCQljYXJkLT5hYzk3X3N1cHBvcnRlZF9taXhlcnMgPSBjYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzOworCQljYXJkLT5hYzk3X3N0ZXJlb19taXhlcnMgPSBjYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzOworCX0KKworCXJldHVybiAwOworCisgZXJyX291dDoKKyAJYWM5N19yZWxlYXNlX2NvZGVjKGNhcmQtPmFjOTcpOworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgdm9pZCBlbXUxMGsxX21peGVyX2NsZWFudXAoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwlhYzk3X3JlbGVhc2VfY29kZWMoY2FyZC0+YWM5Nyk7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfbWlkaV9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJaW50IHJldDsKKworCWNhcmQtPm1wdW91dCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX21wdW91dCksIEdGUF9LRVJORUwpOworCWlmIChjYXJkLT5tcHVvdXQgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJlbXUxMGsxOiBVbmFibGUgdG8gYWxsb2NhdGUgZW11MTBrMV9tcHVvdXQ6IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXQxOworCX0KKworCW1lbXNldChjYXJkLT5tcHVvdXQsIDAsIHNpemVvZihzdHJ1Y3QgZW11MTBrMV9tcHVvdXQpKTsKKworCWNhcmQtPm1wdW91dC0+aW50ciA9IDE7CisJY2FyZC0+bXB1b3V0LT5zdGF0dXMgPSBGTEFHU19BVkFJTEFCTEU7CisJY2FyZC0+bXB1b3V0LT5zdGF0ZSA9IENBUkRNSURJT1VUX1NUQVRFX0RFRkFVTFQ7CisKKwl0YXNrbGV0X2luaXQoJmNhcmQtPm1wdW91dC0+dGFza2xldCwgZW11MTBrMV9tcHVvdXRfYmgsICh1bnNpZ25lZCBsb25nKSBjYXJkKTsKKworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5tcHVvdXQtPmxvY2spOworCisJY2FyZC0+bXB1aW4gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZW11MTBrMV9tcHVpbiksIEdGUF9LRVJORUwpOworCWlmIChjYXJkLT5tcHVpbiA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVtdTEwazE6IFVuYWJsZSB0byBhbGxvY2F0ZSBlbXUxMGsxX21wdWluOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycl9vdXQyOworCX0KKworCW1lbXNldChjYXJkLT5tcHVpbiwgMCwgc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX21wdWluKSk7CisKKwljYXJkLT5tcHVpbi0+c3RhdHVzID0gRkxBR1NfQVZBSUxBQkxFOworCisJdGFza2xldF9pbml0KCZjYXJkLT5tcHVpbi0+dGFza2xldCwgZW11MTBrMV9tcHVpbl9iaCwgKHVuc2lnbmVkIGxvbmcpIGNhcmQtPm1wdWluKTsKKworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5tcHVpbi0+bG9jayk7CisKKwkvKiBSZXNldCB0aGUgTVBVIHBvcnQgKi8KKwlpZiAoZW11MTBrMV9tcHVfcmVzZXQoY2FyZCkgPCAwKSB7CisJCUVSUk9SKCk7CisJCXJldCA9IC1FSU87CisJCWdvdG8gZXJyX291dDM7CisJfQorCisJcmV0dXJuIDA7CisKK2Vycl9vdXQzOgorCWtmcmVlKGNhcmQtPm1wdWluKTsKK2Vycl9vdXQyOgorCWtmcmVlKGNhcmQtPm1wdW91dCk7CitlcnJfb3V0MToKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBlbXUxMGsxX21pZGlfY2xlYW51cChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCXRhc2tsZXRfa2lsbCgmY2FyZC0+bXB1b3V0LT50YXNrbGV0KTsKKwlrZnJlZShjYXJkLT5tcHVvdXQpOworCisJdGFza2xldF9raWxsKCZjYXJkLT5tcHVpbi0+dGFza2xldCk7CisJa2ZyZWUoY2FyZC0+bXB1aW4pOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdm9pY2VfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9HOyBpKyspCisJCWNhcmQtPnZvaWNldGFibGVbaV0gPSBWT0lDRV9VU0FHRV9GUkVFOworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgdGltZXJfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCUlOSVRfTElTVF9IRUFEKCZjYXJkLT50aW1lcnMpOworCWNhcmQtPnRpbWVyX2RlbGF5ID0gVElNRVJfU1RPUFBFRDsKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+dGltZXJfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBhZGR4bWdyX2luaXQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwl1MzIgY291bnQ7CisKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNQVhQQUdFUzsgY291bnQrKykKKwkJY2FyZC0+ZW11cGFnZXRhYmxlW2NvdW50XSA9IDA7CisKKwkvKiBNYXJrIGZpcnN0IHBhZ2UgYXMgdXNlZCAqLworCS8qIFRoaXMgcGFnZSBpcyByZXNlcnZlZCBieSB0aGUgZHJpdmVyICovCisJY2FyZC0+ZW11cGFnZXRhYmxlWzBdID0gMHg4MDAxOworCWNhcmQtPmVtdXBhZ2V0YWJsZVsxXSA9IE1BWFBBR0VTIC0gMTsKK30KKworc3RhdGljIHZvaWQgZnhfY2xlYW51cChzdHJ1Y3QgcGF0Y2hfbWFuYWdlciAqbWdyKQoreworCWludCBpOworCWZvcihpID0gMDsgaSA8IG1nci0+Y3VycmVudF9wYWdlczsgaSsrKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIG1nci0+cGF0Y2hbaV0pOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBmeF9pbml0KHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHBhdGNoX21hbmFnZXIgKm1nciA9ICZjYXJkLT5tZ3I7CisJc3RydWN0IGRzcF9wYXRjaCAqcGF0Y2g7CisJc3RydWN0IGRzcF9ycGF0Y2ggKnJwYXRjaDsKKwlzMzIgbGVmdCwgcmlnaHQ7CisJaW50IGk7CisJdTMyIHBjID0gMDsKKwl1MzIgcGF0Y2hfbj0wOworCXN0cnVjdCBlbXVfZWZ4X2luZm9fdCBlbXVfZWZ4X2luZm9bMl09CisJCXt7IDIwLCAxMCwgMHg0MDAsIDB4MTAwLCAweDIwIH0sCisJCSB7IDI0LCAxMiwgMHg2MDAsIDB4NDAwLCAweDYwIH0sCisJCX07IAorCQkJCisKKwlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspIHsKKwkJbWdyLT5jdHJsX2dwcltpXVswXSA9IC0xOworCQltZ3ItPmN0cmxfZ3ByW2ldWzFdID0gLTE7CisJfQorCisKKwlpZiAoY2FyZC0+aXNfYXVkaWd5KQorCQltZ3ItPmN1cnJlbnRfcGFnZXMgPSAoMiArIFBBVENIRVNfUEVSX1BBR0UgLSAxKSAvIFBBVENIRVNfUEVSX1BBR0U7CisJZWxzZQorCQkvKiAhISBUaGUgbnVtYmVyIGJlbG93IG11c3QgZXF1YWwgdGhlIG51bWJlciBvZiBwYXRjaGVzLCBjdXJyZW50bHkgMTEgISEgKi8KKwkJbWdyLT5jdXJyZW50X3BhZ2VzID0gKDExICsgUEFUQ0hFU19QRVJfUEFHRSAtIDEpIC8gUEFUQ0hFU19QRVJfUEFHRTsKKwkKKwlmb3IgKGkgPSAwOyBpIDwgbWdyLT5jdXJyZW50X3BhZ2VzOyBpKyspIHsKKwkJbWdyLT5wYXRjaFtpXSA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAobWdyLT5wYXRjaFtpXSA9PSBOVUxMKSB7CisJCQltZ3ItPmN1cnJlbnRfcGFnZXMgPSBpOworCQkJZnhfY2xlYW51cChtZ3IpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkJbWVtc2V0KG1nci0+cGF0Y2hbaV0sIDAsIFBBR0VfU0laRSk7CisJfQorCisJaWYgKGNhcmQtPmlzX2F1ZGlneSkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTAyNDsgaSsrKQorCQkJT1AoMHhmLCAweDBjMCwgMHgwYzAsIDB4MGNmLCAweDBjMCk7CisKKwkJZm9yIChpID0gMDsgaSA8IDUxMiA7IGkrKykKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX0dQUl9CQVNFK2ksMCwwKTsKKworCQlwYz0wOworCisJCS8vUGNtIGlucHV0IHZvbHVtZQorCQlPUCgwLCAweDQwMiwgMHgwYzAsIDB4NDA2LCAweDAwMCk7CisJCU9QKDAsIDB4NDAzLCAweDBjMCwgMHg0MDcsIDB4MDAxKTsKKworCQkvL0NELURpZ2l0YWwgaW5wdXQgVm9sdW1lCisJCU9QKDAsIDB4NDA0LCAweDBjMCwgMHg0MGQsIDB4NDIpOworCQlPUCgwLCAweDQwNSwgMHgwYzAsIDB4NDBmLCAweDQzKTsKKworCQkvLyBDRCArIFBDTSAKKwkJT1AoNiwgMHg0MDAsIDB4MGMwLCAweDQwMiwgMHg0MDQpOworCQlPUCg2LCAweDQwMSwgMHgwYzAsIDB4NDAzLCAweDQwNSk7CisJCQorCQkvLyBGcm9udCBPdXRwdXQgKyBNYXN0ZXIgVm9sdW1lCisJCU9QKDAsIDB4NjgsIDB4MGMwLCAweDQwOCwgMHg0MDApOworCQlPUCgwLCAweDY5LCAweDBjMCwgMHg0MDksIDB4NDAxKTsKKworCQkvLyBBZGQtaW4gYW5hbG9nIGlucHV0cyBmb3Igb3RoZXIgc3BlYWtlcnMKKwkJT1AoNiwgMHg0MDAsIDB4NDAsIDB4NDAwLCAweGMwKTsKKwkJT1AoNiwgMHg0MDEsIDB4NDEsIDB4NDAxLCAweGMwKTsKKworCQkvLyBEaWdpdGFsIEZyb250ICsgTWFzdGVyIFZvbHVtZQorCQlPUCgwLCAweDYwLCAweDBjMCwgMHg0MDgsIDB4NDAwKTsKKwkJT1AoMCwgMHg2MSwgMHgwYzAsIDB4NDA5LCAweDQwMSk7CisKKwkJLy8gUmVhciBPdXRwdXQgKyBSZWFyIFZvbHVtZQorCQlPUCgwLCAweDA2ZSwgMHgwYzAsIDB4NDE5LCAweDQwMCk7CisJCU9QKDAsIDB4MDZmLCAweDBjMCwgMHg0MWEsIDB4NDAxKTsJCQorCisJCS8vIERpZ2l0YWwgUmVhciBPdXRwdXQgKyBSZWFyIFZvbHVtZQorCQlPUCgwLCAweDA2NiwgMHgwYzAsIDB4NDE5LCAweDQwMCk7CisJCU9QKDAsIDB4MDY3LCAweDBjMCwgMHg0MWEsIDB4NDAxKTsJCQorCisJCS8vIEF1ZGlneSBEcml2ZSwgSGVhZHBob25lIG91dAorCQlPUCg2LCAweDY0LCAweDBjMCwgMHgwYzAsIDB4NDAwKTsKKwkJT1AoNiwgMHg2NSwgMHgwYzAsIDB4MGMwLCAweDQwMSk7CisKKwkJLy8gYWM5NyBSZWNvcmRpbmcKKwkJT1AoNiwgMHg3NiwgMHgwYzAsIDB4MGMwLCAweDQwKTsKKwkJT1AoNiwgMHg3NywgMHgwYzAsIDB4MGMwLCAweDQxKTsKKwkJCisJCS8vIENlbnRlciA9IHN1YiA9IExlZnQvMiArIFJpZ2h0LzIKKwkJT1AoMHhlLCAweDQwMCwgMHg0MDEsIDB4Y2QsIDB4NDAwKTsKKworCQkvLyBjZW50ZXIvc3ViICBWb2x1bWUgKG1hc3RlcikKKwkJT1AoMCwgMHgwNmEsIDB4MGMwLCAweDQwOCwgMHg0MDApOworCQlPUCgwLCAweDA2YiwgMHgwYzAsIDB4NDA5LCAweDQwMCk7CisKKwkJLy8gRGlnaXRhbCBjZW50ZXIvc3ViICBWb2x1bWUgKG1hc3RlcikKKwkJT1AoMCwgMHgwNjIsIDB4MGMwLCAweDQwOCwgMHg0MDApOworCQlPUCgwLCAweDA2MywgMHgwYzAsIDB4NDA5LCAweDQwMCk7CisKKwkJUk9VVElOR19QQVRDSF9TVEFSVChycGF0Y2gsICJSb3V0aW5nIik7CisJCVJPVVRJTkdfUEFUQ0hfRU5EKHJwYXRjaCk7CisKKwkJLyogZGVsaW1pdGVyIHBhdGNoICovCisJCXBhdGNoID0gUEFUQ0gobWdyLCBwYXRjaF9uKTsKKwkJcGF0Y2gtPmNvZGVfc2l6ZSA9IDA7CisKKwkKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIDB4NTMsIDAsIDApOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCA1MTIgOyBpKyspCisJCQlPUCg2LCAweDQwLCAweDQwLCAweDQwLCAweDQwKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCisJCQkJCSAgICBGWEdQUkVHQkFTRSArIGksIDAsCisJCQkJCSAgICBUQU5LTUVNQUREUlJFR0JBU0UgKyBpLCAwLAorCQkJCQkgICAgVEFHTElTVF9FTkQpOworCisJCQorCQlwYyA9IDA7CisKKwkJLy9maXJzdCBmcmVlIEdQUiA9IDB4MTFiCisJCisJCQorCQkvKiBGWCB2b2x1bWUgY29ycmVjdGlvbiBhbmQgVm9sdW1lIGNvbnRyb2wqLworCQlJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlBjbSBMIHZvbCIsIDB4MCwgMCk7CisJCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDEwMCwgMHgwKTsKKwkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwNiwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOworCQlHRVRfRFlOQU1JQ19HUFIocGF0Y2gsIDB4MTEyKTsKKworCQlPUCg0LCAweDExMiwgMHg0MCwgUENNX0lOX0wsIDB4NDQpOyAvLyo0CQorCQlPUCgwLCAweDEwMCwgMHgwNDAsIDB4MTEyLCAweDEwNik7ICAvLyp2b2wJCisJCUlOUFVUX1BBVENIX0VORChwYXRjaCk7CisKKworCQlJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlBjbSBSIHZvbCIsIDB4MSwgMCk7CisJCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDEwMSwgMHgxKTsKKwkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwNywgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOworCQlHRVRfRFlOQU1JQ19HUFIocGF0Y2gsIDB4MTEyKTsKKworCQlPUCg0LCAweDExMiwgMHg0MCwgUENNX0lOX1IsIDB4NDQpOyAKKwkJT1AoMCwgMHgxMDEsIDB4MDQwLCAweDExMiwgMHgxMDcpOworCisJCUlOUFVUX1BBVENIX0VORChwYXRjaCk7CisKKworCQkvLyBDRC1EaWdpdGFsIEluIFZvbHVtZSBjb250cm9sCQorCQlJTlBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIkNELURpZ2l0YWwgVm9sIEwiLCAweDEyLCAwKTsKKwkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTBjLCAweDEyKTsKKwkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwZCwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOworCisJCU9QKDAsIDB4MTBjLCAweDA0MCwgU1BESUZfQ0RfTCwgMHgxMGQpOworCQlJTlBVVF9QQVRDSF9FTkQocGF0Y2gpOworCisJCUlOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiQ0QtRGlnaXRhbCBWb2wgUiIsIDB4MTMsIDApOworCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMGUsIDB4MTMpOworCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTBmLCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7CisKKwkJT1AoMCwgMHgxMGUsIDB4MDQwLCBTUERJRl9DRF9SLCAweDEwZik7CisJCUlOUFVUX1BBVENIX0VORChwYXRjaCk7CisKKwkJLy9Wb2x1bWUgQ29ycmVjdGlvbiBmb3IgTXVsdGktY2hhbm5lbCBJbnB1dHMJCisJCUlOUFVUX1BBVENIX1NUQVJUKHBhdGNoLCAiTXVsdGktQ2hhbm5lbCBHYWluIiwgMHgwOCwgMCk7CisJCXBhdGNoLT5pbnB1dD1wYXRjaC0+b3V0cHV0PTB4M0YwMDsKKworCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTMsIE1VTFRJX0ZST05UX0wpOworCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTQsIE1VTFRJX0ZST05UX1IpOworCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTUsIE1VTFRJX1JFQVJfTCk7CisJCUdFVF9PVVRQVVRfR1BSKHBhdGNoLCAweDExNiwgTVVMVElfUkVBUl9SKTsKKwkJR0VUX09VVFBVVF9HUFIocGF0Y2gsIDB4MTE3LCBNVUxUSV9DRU5URVIpOworCQlHRVRfT1VUUFVUX0dQUihwYXRjaCwgMHgxMTgsIE1VTFRJX0xGRSk7CisKKwkJT1AoNCwgMHgxMTMsIDB4NDAsIE1VTFRJX0ZST05UX0wsIDB4NDQpOworCQlPUCg0LCAweDExNCwgMHg0MCwgTVVMVElfRlJPTlRfUiwgMHg0NCk7CisJCU9QKDQsIDB4MTE1LCAweDQwLCBNVUxUSV9SRUFSX0wsIDB4NDQpOworCQlPUCg0LCAweDExNiwgMHg0MCwgTVVMVElfUkVBUl9SLCAweDQ0KTsKKwkJT1AoNCwgMHgxMTcsIDB4NDAsIE1VTFRJX0NFTlRFUiwgMHg0NCk7CisJCU9QKDQsIDB4MTE4LCAweDQwLCBNVUxUSV9MRkUsIDB4NDQpOworCQorCQlJTlBVVF9QQVRDSF9FTkQocGF0Y2gpOworCisKKwkJLy9Sb3V0aW5nIHBhdGNoIHN0YXJ0CQorCQlST1VUSU5HX1BBVENIX1NUQVJUKHJwYXRjaCwgIlJvdXRpbmciKTsKKwkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTAwLCAweDApOworCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMDEsIDB4MSk7CisJCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDEwYywgMHgxMik7CisJCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDEwZSwgMHgxMyk7CisJCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExMywgTVVMVElfRlJPTlRfTCk7CisJCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExNCwgTVVMVElfRlJPTlRfUik7CisJCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExNSwgTVVMVElfUkVBUl9MKTsKKwkJR0VUX0lOUFVUX0dQUihycGF0Y2gsIDB4MTE2LCBNVUxUSV9SRUFSX1IpOworCQlHRVRfSU5QVVRfR1BSKHJwYXRjaCwgMHgxMTcsIE1VTFRJX0NFTlRFUik7CisJCUdFVF9JTlBVVF9HUFIocnBhdGNoLCAweDExOCwgTVVMVElfTEZFKTsKKworCQlHRVRfRFlOQU1JQ19HUFIocnBhdGNoLCAweDEwMik7CisJCUdFVF9EWU5BTUlDX0dQUihycGF0Y2gsIDB4MTAzKTsKKworCQlHRVRfT1VUUFVUX0dQUihycGF0Y2gsIDB4MTA0LCAweDgpOworCQlHRVRfT1VUUFVUX0dQUihycGF0Y2gsIDB4MTA1LCAweDkpOworCQlHRVRfT1VUUFVUX0dQUihycGF0Y2gsIDB4MTBhLCAweDIpOworCQlHRVRfT1VUUFVUX0dQUihycGF0Y2gsIDB4MTBiLCAweDMpOworCQkKKwkJCisJCS8qIGlucHV0IGJ1ZmZlciAqLworCQlPUCg2LCAweDEwMiwgQUM5N19JTl9MLCAweDQwLCAweDQwKTsKKwkJT1AoNiwgMHgxMDMsIEFDOTdfSU5fUiwgMHg0MCwgMHg0MCk7CisKKworCQkvKiBEaWdpdGFsIEluICsgUENNICsgTVVMVElfRlJPTlQtPiBBQzk3IG91dCAoZnJvbnQgc3BlYWtlcnMpKi8KKwkJT1AoNiwgQUM5N19GUk9OVF9MLCAweDEwMCwgMHgxMGMsIDB4MTEzKTsKKworCQlDT05ORUNUKE1VTFRJX0ZST05UX0wsIEFDOTdfRlJPTlRfTCk7CisJCUNPTk5FQ1QoUENNX0lOX0wsIEFDOTdfRlJPTlRfTCk7CisJCUNPTk5FQ1QoU1BESUZfQ0RfTCwgQUM5N19GUk9OVF9MKTsKKworCQlPUCg2LCBBQzk3X0ZST05UX1IsIDB4MTAxLCAweDEwZSwgMHgxMTQpOworCisJCUNPTk5FQ1QoTVVMVElfRlJPTlRfUiwgQUM5N19GUk9OVF9SKTsKKwkJQ09OTkVDVChQQ01fSU5fUiwgQUM5N19GUk9OVF9SKTsKKwkJQ09OTkVDVChTUERJRl9DRF9SLCBBQzk3X0ZST05UX1IpOworCisJCS8qIERpZ2l0YWwgSW4gKyBQQ00gKyBBQzk3IEluICsgUENNMSArIE1VTFRJX1JFQVIgLS0+IFJlYXIgQ2hhbm5lbCAqLyAKKwkJT1AoNiwgMHgxMDQsIFBDTTFfSU5fTCwgMHgxMDAsIDB4MTE1KTsKKwkJT1AoNiwgMHgxMDQsIDB4MTA0LCAweDEwYywgMHgxMDIpOworCisJCUNPTk5FQ1QoTVVMVElfUkVBUl9MLCBBTkFMT0dfUkVBUl9MKTsKKwkJQ09OTkVDVChBQzk3X0lOX0wsIEFOQUxPR19SRUFSX0wpOworCQlDT05ORUNUKFBDTV9JTl9MLCBBTkFMT0dfUkVBUl9MKTsKKwkJQ09OTkVDVChTUERJRl9DRF9MLCBBTkFMT0dfUkVBUl9MKTsKKwkJQ09OTkVDVChQQ00xX0lOX0wsIEFOQUxPR19SRUFSX0wpOworCisJCU9QKDYsIDB4MTA1LCBQQ00xX0lOX1IsIDB4MTAxLCAweDExNik7CisJCU9QKDYsIDB4MTA1LCAweDEwNSwgMHgxMGUsIDB4MTAzKTsKKworCQlDT05ORUNUKE1VTFRJX1JFQVJfUiwgQU5BTE9HX1JFQVJfUik7CisJCUNPTk5FQ1QoQUM5N19JTl9SLCBBTkFMT0dfUkVBUl9SKTsKKwkJQ09OTkVDVChQQ01fSU5fUiwgQU5BTE9HX1JFQVJfUik7CisJCUNPTk5FQ1QoU1BESUZfQ0RfUiwgQU5BTE9HX1JFQVJfUik7CisJCUNPTk5FQ1QoUENNMV9JTl9SLCBBTkFMT0dfUkVBUl9SKTsKKworCQkvKiBEaWdpdGFsIEluICsgUENNICsgQUM5NyBJbiArIE1VTFRJX0ZST05UIC0tPiBEaWdpdGFsIG91dCAqLworCQlPUCg2LCAweDEwYiwgMHgxMDAsIDB4MTAyLCAweDEwYyk7CisJCU9QKDYsIDB4MTBiLCAweDEwYiwgMHgxMTMsIDB4NDApOworCisJCUNPTk5FQ1QoTVVMVElfRlJPTlRfTCwgRElHSVRBTF9PVVRfTCk7CisJCUNPTk5FQ1QoUENNX0lOX0wsIERJR0lUQUxfT1VUX0wpOworCQlDT05ORUNUKEFDOTdfSU5fTCwgRElHSVRBTF9PVVRfTCk7CisJCUNPTk5FQ1QoU1BESUZfQ0RfTCwgRElHSVRBTF9PVVRfTCk7CisKKwkJT1AoNiwgMHgxMGEsIDB4MTAxLCAweDEwMywgMHgxMGUpOworCQlPUCg2LCAweDEwYiwgMHgxMGIsIDB4MTE0LCAweDQwKTsKKworCQlDT05ORUNUKE1VTFRJX0ZST05UX1IsIERJR0lUQUxfT1VUX1IpOworCQlDT05ORUNUKFBDTV9JTl9SLCBESUdJVEFMX09VVF9SKTsKKwkJQ09OTkVDVChBQzk3X0lOX1IsIERJR0lUQUxfT1VUX1IpOworCQlDT05ORUNUKFNQRElGX0NEX1IsIERJR0lUQUxfT1VUX1IpOworCisJCS8qIEFDOTcgSW4gLS0+IEFEQyBSZWNvcmRpbmcgQnVmZmVyICovCisJCU9QKDYsIEFEQ19SRUNfTCwgMHgxMDIsIDB4NDAsIDB4NDApOworCisJCUNPTk5FQ1QoQUM5N19JTl9MLCBBRENfUkVDX0wpOworCisJCU9QKDYsIEFEQ19SRUNfUiwgMHgxMDMsIDB4NDAsIDB4NDApOworCisJCUNPTk5FQ1QoQUM5N19JTl9SLCBBRENfUkVDX1IpOworCisKKwkJLyogZngxMjpBbmFsb2ctQ2VudGVyICovCisJCU9QKDYsIEFOQUxPR19DRU5URVIsIDB4MTE3LCAweDQwLCAweDQwKTsKKwkJQ09OTkVDVChNVUxUSV9DRU5URVIsIEFOQUxPR19DRU5URVIpOworCisJCS8qIGZ4MTE6QW5hbG9nLUxGRSAqLworCQlPUCg2LCBBTkFMT0dfTEZFLCAweDExOCwgMHg0MCwgMHg0MCk7CisJCUNPTk5FQ1QoTVVMVElfTEZFLCBBTkFMT0dfTEZFKTsKKworCQkvKiBmeDEyOkRpZ2l0YWwtQ2VudGVyICovCisJCU9QKDYsIERJR0lUQUxfQ0VOVEVSLCAweDExNywgMHg0MCwgMHg0MCk7CisJCUNPTk5FQ1QoTVVMVElfQ0VOVEVSLCBESUdJVEFMX0NFTlRFUik7CisJCQorCQkvKiBmeDExOkFuYWxvZy1MRkUgKi8KKwkJT1AoNiwgRElHSVRBTF9MRkUsIDB4MTE4LCAweDQwLCAweDQwKTsKKwkJQ09OTkVDVChNVUxUSV9MRkUsIERJR0lUQUxfTEZFKTsKKwkKKwkJUk9VVElOR19QQVRDSF9FTkQocnBhdGNoKTsKKworCisJCS8vIFJlYXIgdm9sdW1lIGNvbnRyb2wJCisJCU9VVFBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlZvbCBSZWFyIEwiLCAweDgsIDApOworCQlHRVRfSU5QVVRfR1BSKHBhdGNoLCAweDEwNCwgMHg4KTsKKwkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDExOSwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOworCisJCU9QKDAsIEFOQUxPR19SRUFSX0wsIDB4MDQwLCAweDEwNCwgMHgxMTkpOworCQlPVVRQVVRfUEFUQ0hfRU5EKHBhdGNoKTsKKworCQlPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJWb2wgUmVhciBSIiwgMHg5LCAwKTsKKwkJR0VUX0lOUFVUX0dQUihwYXRjaCwgMHgxMDUsIDB4OSk7CisJCUdFVF9DT05UUk9MX0dQUihwYXRjaCwgMHgxMWEsICJWb2wiLCAwLCAweDdmZmZmZmZmKTsKKworCQlPUCgwLCBBTkFMT0dfUkVBUl9SLCAweDA0MCwgMHgxMDUsIDB4MTFhKTsKKwkJT1VUUFVUX1BBVENIX0VORChwYXRjaCk7CisKKworCQkvL01hc3RlciB2b2x1bWUgY29udHJvbCBvbiBmcm9udC1kaWdpdGFsCQorCQlPVVRQVVRfUEFUQ0hfU1RBUlQocGF0Y2gsICJWb2wgTWFzdGVyIEwiLCAweDIsIDEpOworCQlHRVRfSU5QVVRfR1BSKHBhdGNoLCAweDEwYSwgMHgyKTsKKwkJR0VUX0NPTlRST0xfR1BSKHBhdGNoLCAweDEwOCwgIlZvbCIsIDAsIDB4N2ZmZmZmZmYpOworCisJCU9QKDAsIERJR0lUQUxfT1VUX0wsIDB4MDQwLCAweDEwYSwgMHgxMDgpOworCQlPVVRQVVRfUEFUQ0hfRU5EKHBhdGNoKTsKKworCisJCU9VVFBVVF9QQVRDSF9TVEFSVChwYXRjaCwgIlZvbCBNYXN0ZXIgUiIsIDB4MywgMSk7CisJCUdFVF9JTlBVVF9HUFIocGF0Y2gsIDB4MTBiLCAweDMpOworCQlHRVRfQ09OVFJPTF9HUFIocGF0Y2gsIDB4MTA5LCAiVm9sIiwgMCwgMHg3ZmZmZmZmZik7CisKKwkJT1AoMCwgRElHSVRBTF9PVVRfUiwgMHgwNDAsIDB4MTBiLCAweDEwOSk7CisJCU9VVFBVVF9QQVRDSF9FTkQocGF0Y2gpOworCisKKwkJLyogZGVsaW1pdGVyIHBhdGNoICovCisJCXBhdGNoID0gUEFUQ0gobWdyLCBwYXRjaF9uKTsKKwkJcGF0Y2gtPmNvZGVfc2l6ZSA9IDA7CisKKwkKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIERCRywgMCwgMCk7CisJfQorCisJc3Bpbl9sb2NrX2luaXQoJm1nci0+bG9jayk7CisKKwkvLyBTZXQgdXAgVm9sdW1lIGNvbnRyb2xzLCB0cnkgdG8ga2VlcCB0aGlzIHRoZSBzYW1lIGZvciBib3RoIEF1ZGlneSBhbmQgTGl2ZQorCisJLy9NYXN0ZXIgdm9sdW1lCisJbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9WT0xVTUVdWzBdID0gODsKKwltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX1ZPTFVNRV1bMV0gPSA5OworCisJbGVmdCA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX1ZPTFVNRV0gJiAweGZmOworCXJpZ2h0ID0gKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX1ZPTFVNRV0gPj4gOCkgJiAweGZmOworCisJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCA4LCBsZWZ0LCAxIDw8IGNhcmQtPmFjOTctPmJpdF9yZXNvbHV0aW9uKTsKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDksIHJpZ2h0LCAxIDw8IGNhcmQtPmFjOTctPmJpdF9yZXNvbHV0aW9uKTsKKworCS8vUmVhciB2b2x1bWUKKwltZ3ItPmN0cmxfZ3ByWyBTT1VORF9NSVhFUl9PR0FJTiBdWzBdID0gMHgxOTsKKwltZ3ItPmN0cmxfZ3ByWyBTT1VORF9NSVhFUl9PR0FJTiBdWzFdID0gMHgxYTsKKworCWxlZnQgPSByaWdodCA9IDY3OworCWNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX09HQUlOXSA9IChyaWdodCA8PCA4KSB8IGxlZnQ7CisKKwljYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzIHw9IFNPVU5EX01BU0tfT0dBSU47CisJY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVycyB8PSBTT1VORF9NQVNLX09HQUlOOworCisJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCAweDE5LCBsZWZ0LCBWT0xfNUJJVCk7CisJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCAweDFhLCByaWdodCwgVk9MXzVCSVQpOworCisJLy9QQ00gVm9sdW1lCisJbWdyLT5jdHJsX2dwcltTT1VORF9NSVhFUl9QQ01dWzBdID0gNjsKKwltZ3ItPmN0cmxfZ3ByW1NPVU5EX01JWEVSX1BDTV1bMV0gPSA3OworCisJbGVmdCA9IGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX1BDTV0gJiAweGZmOworCXJpZ2h0ID0gKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW1NPVU5EX01JWEVSX1BDTV0gPj4gOCkgJiAweGZmOworCisJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCA2LCBsZWZ0LCBWT0xfNUJJVCk7CisJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCA3LCByaWdodCwgVk9MXzVCSVQpOworCisJLy9DRC1EaWdpdGFsIFZvbHVtZQorCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfRElHSVRBTDFdWzBdID0gMHhkOworCW1nci0+Y3RybF9ncHJbU09VTkRfTUlYRVJfRElHSVRBTDFdWzFdID0gMHhmOworCisJbGVmdCA9IHJpZ2h0ID0gNjc7CisJY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfRElHSVRBTDFdID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsgCisKKwljYXJkLT5hYzk3LT5zdXBwb3J0ZWRfbWl4ZXJzIHw9IFNPVU5EX01BU0tfRElHSVRBTDE7CisJY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVycyB8PSBTT1VORF9NQVNLX0RJR0lUQUwxOworCisJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCAweGQsIGxlZnQsIFZPTF81QklUKTsKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIDB4ZiwgcmlnaHQsIFZPTF81QklUKTsKKworCisJLy9oYXJkIHdpcmUgdGhlIGFjOTcncyBwY20sIHBjbSB2b2x1bWUgaXMgZG9uZSBhYm92ZSB1c2luZyBkc3AgY29kZS4KKwlpZiAoY2FyZC0+aXNfYXVkaWd5KQorCQkvL2ZvciBBdWRpZ3ksIHdlIG11dGUgaXQgYW5kIHVzZSB0aGUgcGhpbGlwcyA2IGNoYW5uZWwgREFDIGluc3RlYWQKKwkJZW11MTBrMV9hYzk3X3dyaXRlKGNhcmQtPmFjOTcsIDB4MTgsIDB4ODAwMCk7CisJZWxzZQorCQkvL0ZvciB0aGUgTGl2ZSB3ZSBoYXJkd2lyZSBpdCB0byBmdWxsIHZvbHVtZQorCQllbXUxMGsxX2FjOTdfd3JpdGUoY2FyZC0+YWM5NywgMHgxOCwgMHgwKTsKKworCS8vcmVtb3ZlIGl0IGZyb20gdGhlIGFjOTdfY29kZWMncyBjb250cm9sCisJY2FyZC0+YWM5N19zdXBwb3J0ZWRfbWl4ZXJzICY9IH5TT1VORF9NQVNLX1BDTTsKKwljYXJkLT5hYzk3X3N0ZXJlb19taXhlcnMgJj0gflNPVU5EX01BU0tfUENNOworCisJLy9zZXQgSWdhaW4gdG8gMGRCIGJ5IGRlZmF1bHQsIG1heWJlIGNvbnNpZGVyIGhhcmR3aXJpbmcgaXQgaGVyZS4KKwllbXUxMGsxX2FjOTdfd3JpdGUoY2FyZC0+YWM5NywgQUM5N19SRUNPUkRfR0FJTiwgMHgwMDAwKTsKKwljYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtTT1VORF9NSVhFUl9JR0FJTl0gPSAweDEwMTsgCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaHdfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCWludCBuQ2g7CisJdTMyIHBhZ2Vjb3VudDsgLyogdG1wICovCisJaW50IHJldDsKKworCS8qIERpc2FibGUgYXVkaW8gYW5kIGxvY2sgY2FjaGUgKi8KKwllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfTE9DS1NPVU5EQ0FDSEUgfCBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSyB8IEhDRkdfTVVURUJVVFRPTkVOQUJMRSk7CisKKwkvKiBSZXNldCByZWNvcmRpbmcgYnVmZmVycyAqLworCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwKKwkJCSAgICBNSUNCUywgQURDQlNfQlVGU0laRV9OT05FLAorCQkJICAgIE1JQ0JBLCAwLAorCQkJICAgIEZYQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKKwkJCSAgICBGWEJBLCAwLAorCQkJICAgIEFEQ0JTLCBBRENCU19CVUZTSVpFX05PTkUsCisJCQkgICAgQURDQkEsIDAsCisJCQkgICAgVEFHTElTVF9FTkQpOworCisJLyogRGlzYWJsZSBjaGFubmVsIGludGVycnVwdCAqLworCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSU5URSwgMCk7CisJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAorCQkJICAgIENMSUVMLCAwLAorCQkJICAgIENMSUVILCAwLAorCQkJICAgIFNPTEVMLCAwLAorCQkJICAgIFNPTEVILCAwLAorCQkJICAgIFRBR0xJU1RfRU5EKTsKKworCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKKwkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLDAsCisJCQkJICAgIDB4NWUsMHhmMDAsCisJCQkJICAgIDB4NWYsMHgzLAorCQkJCSAgICBUQUdMSVNUX0VORCk7CisJfQorCisJLyogSW5pdCBlbnZlbG9wZSBlbmdpbmUgKi8KKwlmb3IgKG5DaCA9IDA7IG5DaCA8IE5VTV9HOyBuQ2grKykgeworCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIG5DaCwKKwkJCQkgICAgRENZU1VTViwgMCwKKwkJCQkgICAgSVAsIDAsCisJCQkJICAgIFZURlQsIDB4ZmZmZiwKKwkJCQkgICAgQ1ZDRiwgMHhmZmZmLAorCQkJCSAgICBQVFJYLCAwLAorCQkJCSAgICAvL0NQRiwgMCwKKwkJCQkgICAgQ0NSLCAwLAorCisJCQkJICAgIFBTU1QsIDAsCisJCQkJICAgIERTTCwgMHgxMCwKKwkJCQkgICAgQ0NDQSwgMCwKKwkJCQkgICAgWjEsIDAsCisJCQkJICAgIFoyLCAwLAorCQkJCSAgICBGWFJULCAweGQwMWMwMDAwLAorCisJCQkJICAgIEFUS0hMRE0sIDAsCisJCQkJICAgIERDWVNVU00sIDAsCisJCQkJICAgIElGQVROLCAweGZmZmYsCisJCQkJICAgIFBFRkUsIDAsCisJCQkJICAgIEZNTU9ELCAwLAorCQkJCSAgICBUUkVNRlJRLCAyNCwJLyogMSBIeiAqLworCQkJCSAgICBGTTJGUlEyLCAyNCwJLyogMSBIeiAqLworCQkJCSAgICBURU1QRU5WLCAwLAorCisJCQkJICAgIC8qKiogVGhlc2UgYXJlIGxhc3Qgc28gT0ZGIHByZXZlbnRzIHdyaXRpbmcgKioqLworCQkJCSAgICBMRk9WQUwyLCAwLAorCQkJCSAgICBMRk9WQUwxLCAwLAorCQkJCSAgICBBVEtITERWLCAwLAorCQkJCSAgICBFTlZWT0wsIDAsCisJCQkJICAgIEVOVlZBTCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRBR0xJU1RfRU5EKTsKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgbkNoLCAwKTsKKwkJLyoKKwkJICBBdWRpZ3kgRlhSVCBpbml0aWFsaXphdGlvbgorCQkgIHJldmVyc2VkIGVuZydkLCBtYXkgbm90IGJlIGFjY3VyYXRlLgorCQkgKi8KKwkJaWYgKGNhcmQtPmlzX2F1ZGlneSkgeworCQkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLG5DaCwKKwkJCQkJICAgIDB4NGMsMHgwLAorCQkJCQkgICAgMHg0ZCwweDAsCisJCQkJCSAgICAweDRlLDB4MCwKKwkJCQkJICAgIDB4NGYsMHgwLAorCQkJCQkgICAgQV9GWFJUMSwgMHgzZjNmM2YzZiwKKwkJCQkJICAgIEFfRlhSVDIsIDB4M2YzZjNmM2YsCisJCQkJCSAgICBBX1NFTkRBTU9VTlRTLCAwLAorCQkJCQkgICAgVEFHTElTVF9FTkQpOworCQl9CisJfQorCQorCisJLyoKKwkgKiogSW5pdCB0byAweDAyMTA5MjA0IDoKKwkgKiogQ2xvY2sgYWNjdXJhY3kgICAgPSAwICAgICAoMTAwMHBwbSkKKwkgKiogU2FtcGxlIFJhdGUgICAgICAgPSAyICAgICAoNDhrSHopCisJICoqIEF1ZGlvIENoYW5uZWwgICAgID0gMSAgICAgKExlZnQgb2YgMikKKwkgKiogU291cmNlIE51bWJlciAgICAgPSAwICAgICAoVW5zcGVjaWZpZWQpCisJICoqIEdlbmVyYXRpb24gU3RhdHVzID0gMSAgICAgKE9yaWdpbmFsIGZvciBDYXQgQ29kZSAxMikKKwkgKiogQ2F0IENvZGUgICAgICAgICAgPSAxMiAgICAoRGlnaXRhbCBTaWduYWwgTWl4ZXIpCisJICoqIE1vZGUgICAgICAgICAgICAgID0gMCAgICAgKE1vZGUgMCkKKwkgKiogRW1waGFzaXMgICAgICAgICAgPSAwICAgICAoTm9uZSkKKwkgKiogQ1AgICAgICAgICAgICAgICAgPSAxICAgICAoQ29weXJpZ2h0IHVuYXNzZXJ0ZWQpCisJICoqIEFOICAgICAgICAgICAgICAgID0gMCAgICAgKERpZ2l0YWwgYXVkaW8pCisJICoqIFAgICAgICAgICAgICAgICAgID0gMCAgICAgKENvbnN1bWVyKQorCSAqLworCisJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCAwLAorCisJCQkgICAgLyogU1BESUYwICovCisJCQkgICAgU1BDUzAsIChTUENTX0NMS0FDQ1lfMTAwMFBQTSB8IDB4MDAyMDAwMDAwIHwKKwkJCQkgICAgU1BDU19DSEFOTkVMTlVNX0xFRlQgfCBTUENTX1NPVVJDRU5VTV9VTlNQRUMgfCBTUENTX0dFTkVSQVRJT05TVEFUVVMgfCAweDAwMDAxMjAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQpLAorCisJCQkgICAgLyogU1BESUYxICovCisJCQkgICAgU1BDUzEsIChTUENTX0NMS0FDQ1lfMTAwMFBQTSB8IDB4MDAyMDAwMDAwIHwKKwkJCQkgICAgU1BDU19DSEFOTkVMTlVNX0xFRlQgfCBTUENTX1NPVVJDRU5VTV9VTlNQRUMgfCBTUENTX0dFTkVSQVRJT05TVEFUVVMgfCAweDAwMDAxMjAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQpLAorCisJCQkgICAgLyogU1BESUYyICYgU1BESUYzICovCisJCQkgICAgU1BDUzIsIChTUENTX0NMS0FDQ1lfMTAwMFBQTSB8IDB4MDAyMDAwMDAwIHwKKwkJCQkgICAgU1BDU19DSEFOTkVMTlVNX0xFRlQgfCBTUENTX1NPVVJDRU5VTV9VTlNQRUMgfCBTUENTX0dFTkVSQVRJT05TVEFUVVMgfCAweDAwMDAxMjAwIHwgU1BDU19FTVBIQVNJU19OT05FIHwgU1BDU19DT1BZUklHSFQpLAorCisJCQkgICAgVEFHTElTVF9FTkQpOworCisJaWYgKGNhcmQtPmlzX2F1ZGlneSAmJiAoY2FyZC0+Y2hpcHJldiA9PSA0KSkgeworCQkvKiBIYWNrcyBmb3IgQWxpY2UzIHRvIHdvcmsgaW5kZXBlbmRlbnQgb2YgaGFQMTZWIGRyaXZlciAqLworCQl1MzIgdG1wOworCisJCS8vU2V0dXAgU1JDTXVsdGlfSTJTIFNhbXBsaW5nUmF0ZQorCQl0bXAgPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBBX1NQRElGX1NBTVBMRVJBVEUsIDApOworCQl0bXAgJj0gMHhmZmZmZjFmZjsKKwkJdG1wIHw9ICgweDI8PDkpOworCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQV9TUERJRl9TQU1QTEVSQVRFLCAwLCB0bXApOworCisJCS8qIFNldHVwIFNSQ1NlbCAoRW5hYmxlIFNwZGlmLEkyUyBTUkNNdWx0aSkgKi8KKwkJZW11MTBrMV93cml0ZWZuMChjYXJkLCAweDIwLCAweDYwMDAwMCk7CisJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgMHgyNCwgMHgxNCk7CisKKwkJLyogU2V0dXAgU1JDTXVsdGkgSW5wdXQgQXVkaW8gRW5hYmxlICovCisJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgMHgyMCwgMHg2RTAwMDApOworCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIDB4MjQsIDB4RkYwMEZGMDApOworCX0KKworCXJldCA9IGZ4X2luaXQoY2FyZCk7CQkvKiBpbml0aWFsaXplIGVmZmVjdHMgZW5naW5lICovCisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwljYXJkLT50YW5rbWVtLnNpemUgPSAwOworCisJY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5zaXplID0gTUFYUEFHRVMgKiBzaXplb2YodTMyKTsKKworCWNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuc2l6ZSwgJmNhcmQtPnZpcnR1YWxwYWdldGFibGUuZG1hX2hhbmRsZSk7CisJaWYgKGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkciA9PSBOVUxMKSB7CisJCUVSUk9SKCk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyMDsKKwl9CisKKwljYXJkLT5zaWxlbnRwYWdlLnNpemUgPSBFTVVQQUdFU0laRTsKKworCWNhcmQtPnNpbGVudHBhZ2UuYWRkciA9IHBjaV9hbGxvY19jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnNpbGVudHBhZ2Uuc2l6ZSwgJmNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSk7CisJaWYgKGNhcmQtPnNpbGVudHBhZ2UuYWRkciA9PSBOVUxMKSB7CisJCUVSUk9SKCk7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyMTsKKwl9CisKKwlmb3IgKHBhZ2Vjb3VudCA9IDA7IHBhZ2Vjb3VudCA8IE1BWFBBR0VTOyBwYWdlY291bnQrKykKKwkJKCh1MzIgKikgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyKVtwYWdlY291bnRdID0gY3B1X3RvX2xlMzIoKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpIHwgcGFnZWNvdW50KTsKKworCS8qIEluaXQgcGFnZSB0YWJsZSAmIHRhbmsgbWVtb3J5IGJhc2UgcmVnaXN0ZXIgKi8KKwlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCisJCQkgICAgUFRCLCAodTMyKSBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmRtYV9oYW5kbGUsCisJCQkgICAgVENCLCAwLAorCQkJICAgIFRDQlMsIDAsCisJCQkgICAgVEFHTElTVF9FTkQpOworCisJZm9yIChuQ2ggPSAwOyBuQ2ggPCBOVU1fRzsgbkNoKyspIHsKKwkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCBuQ2gsCisJCQkJICAgIE1BUEEsIE1BUF9QVElfTUFTSyB8ICgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSwKKwkJCQkgICAgTUFQQiwgTUFQX1BUSV9NQVNLIHwgKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpLAorCQkJCSAgICBUQUdMSVNUX0VORCk7CisJfQorCisJLyogSG9rYXksIG5vdyBlbmFibGUgdGhlIEFVRCBiaXQgKi8KKwkvKiBFbmFibGUgQXVkaW8gPSAxICovCisJLyogTXV0ZSBEaXNhYmxlIEF1ZGlvID0gMCAqLworCS8qIExvY2sgVGFuayBNZW1vcnkgPSAxICovCisJLyogTG9jayBTb3VuZCBNZW1vcnkgPSAwICovCisJLyogQXV0byBNdXRlID0gMSAqLworCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKKwkJaWYgKGNhcmQtPmNoaXByZXYgPT0gNCkKKwkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19BVURJT0VOQUJMRSAgfCBIQ0ZHX0FDM0VOQUJMRV9DRFNQRElGIHwgSENGR19BQzNFTkFCTEVfR1BTUERJRiB8IEhDRkdfQVVUT01VVEUgfCBIQ0ZHX0pPWUVOQUJMRSk7CisJCWVsc2UKKwkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19BVURJT0VOQUJMRSAgfCBIQ0ZHX0FVVE9NVVRFIHwgSENGR19KT1lFTkFCTEUpOworCX0gZWxzZSB7CisJCWlmIChjYXJkLT5tb2RlbCA9PSAweDIwIHx8IGNhcmQtPm1vZGVsID09IDB4YzQwMCB8fAorCQkgKGNhcmQtPm1vZGVsID09IDB4MjEgJiYgY2FyZC0+Y2hpcHJldiA8IDYpKQorCSAgICAgICAgCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGRywgSENGR19BVURJT0VOQUJMRSAgfCBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSyB8IEhDRkdfQVVUT01VVEUpOworCQllbHNlCisJCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfQVVESU9FTkFCTEUgIHwgSENGR19MT0NLVEFOS0NBQ0hFX01BU0sgfCBIQ0ZHX0FVVE9NVVRFIHwgSENGR19KT1lFTkFCTEUpOworCX0KKwkvKiBFbmFibGUgVm9sX0N0cmwgaXJxcyAqLworCWVtdTEwazFfaXJxX2VuYWJsZShjYXJkLCBJTlRFX1ZPTElOQ1JFTkFCTEUgfCBJTlRFX1ZPTERFQ1JFTkFCTEUgfCBJTlRFX01VVEVFTkFCTEUgfCBJTlRFX0ZYRFNQRU5BQkxFKTsKKworCWlmIChjYXJkLT5pc19hdWRpZ3kgJiYgKGNhcmQtPmNoaXByZXYgPT0gNCkpIHsKKwkJLyogVW5tdXRlIEFuYWxvZyBub3cuICBTZXQgR1BPNiB0byAxIGZvciBBcG9sbG8uCisJCSAqIFRoaXMgaGFzIHRvIGJlIGRvbmUgYWZ0ZXIgaW5pdCBBTGljZTMgSTJTT3V0IGJleW9uZCA0OEtIei4KKwkJICogU28sIHNlcXVlbmNlIGlzIGltcG9ydGFudC4gKi8KKwkJdTMyIHRtcCA9IGVtdTEwazFfcmVhZGZuMChjYXJkLCBBX0lPQ0ZHKTsKKwkJdG1wIHw9IDB4MDA0MDsKKwkJZW11MTBrMV93cml0ZWZuMChjYXJkLCBBX0lPQ0ZHLCB0bXApOworCX0KKwkKKwkvKiBGSVhNRTogVE9TTGluayBkZXRlY3Rpb24gKi8KKwljYXJkLT5oYXNfdG9zbGluayA9IDA7CisKKwkvKiBJbml0aWFsaXplIGRpZ2l0YWwgcGFzc3Rocm91Z2ggdmFyaWFibGVzICovCisJY2FyZC0+cHQucG9zX2dwciA9IGNhcmQtPnB0LmludHJfZ3ByID0gY2FyZC0+cHQuZW5hYmxlX2dwciA9IC0xOworCWNhcmQtPnB0LnNlbGVjdGVkID0gMDsKKwljYXJkLT5wdC5zdGF0ZSA9IFBUX1NUQVRFX0lOQUNUSVZFOworCWNhcmQtPnB0LnNwY3NfdG9fdXNlID0gMHgwMTsKKwljYXJkLT5wdC5wYXRjaF9uYW1lID0gIkFDM3Bhc3MiOworCWNhcmQtPnB0LmludHJfZ3ByX25hbWUgPSAiY291bnQiOworCWNhcmQtPnB0LmVuYWJsZV9ncHJfbmFtZSA9ICJlbmFibGUiOworCWNhcmQtPnB0LnBvc19ncHJfbmFtZSA9ICJwdHIiOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5wdC5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5wdC53YWl0KTsKKworLyoJdG1wID0gc2JsaXZlX3JlYWRmbjAoY2FyZCwgSENGRyk7CisJaWYgKHRtcCAmIChIQ0ZHX0dQSU5QVVQwIHwgSENGR19HUElOUFVUMSkpIHsKKwkJc2JsaXZlX3dyaXRlZm4wKGNhcmQsIEhDRkcsIHRtcCB8IDB4ODAwKTsKKworCQl1ZGVsYXkoNTEyKTsKKworCQlpZiAodG1wICE9IChzYmxpdmVfcmVhZGZuMChjYXJkLCBIQ0ZHKSAmIH4weDgwMCkpIHsKKwkJCWNhcmQtPmhhc190b3NsaW5rID0gMTsKKwkJCXNibGl2ZV93cml0ZWZuMChjYXJkLCBIQ0ZHLCB0bXApOworCQl9CisJfQorKi8KKwlyZXR1cm4gMDsKKworICBlcnIxOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5zaXplLCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuZG1hX2hhbmRsZSk7CisgIGVycjA6CisJZnhfY2xlYW51cCgmY2FyZC0+bWdyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfaW5pdChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkKQoreworCS8qIEluaXQgQ2FyZCAqLworCWlmIChod19pbml0KGNhcmQpIDwgMCkKKwkJcmV0dXJuIC0xOworCisJdm9pY2VfaW5pdChjYXJkKTsKKwl0aW1lcl9pbml0KGNhcmQpOworCWFkZHhtZ3JfaW5pdChjYXJkKTsKKworCURQRCgyLCAiICBodyBjb250cm9sIHJlZ2lzdGVyIC0+ICUjeFxuIiwgZW11MTBrMV9yZWFkZm4wKGNhcmQsIEhDRkcpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBlbXUxMGsxX2NsZWFudXAoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwlpbnQgY2g7CisKKwllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIElOVEUsIDApOworCisJLyoqIFNodXRkb3duIHRoZSBjaGlwICoqLworCWZvciAoY2ggPSAwOyBjaCA8IE5VTV9HOyBjaCsrKQorCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgRENZU1VTViwgY2gsIDApOworCisJZm9yIChjaCA9IDA7IGNoIDwgTlVNX0c7IGNoKyspIHsKKwkJc2JsaXZlX3dyaXRlcHRyX3RhZyhjYXJkLCBjaCwKKwkJCQkgICAgVlRGVCwgMCwKKwkJCQkgICAgQ1ZDRiwgMCwKKwkJCQkgICAgUFRSWCwgMCwKKwkJCQkgICAgLy9DUEYsIDAsCisJCQkJICAgIFRBR0xJU1RfRU5EKTsKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgY2gsIDApOworCX0KKworCS8qIERpc2FibGUgYXVkaW8gYW5kIGxvY2sgY2FjaGUgKi8KKwllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkcsIEhDRkdfTE9DS1NPVU5EQ0FDSEUgfCBIQ0ZHX0xPQ0tUQU5LQ0FDSEVfTUFTSyB8IEhDRkdfTVVURUJVVFRPTkVOQUJMRSk7CisKKwlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFRCLCAwLAorCisJCQkgICAgLyogUmVzZXQgcmVjb3JkaW5nIGJ1ZmZlcnMgKi8KKwkJCSAgICBNSUNCUywgQURDQlNfQlVGU0laRV9OT05FLAorCQkJICAgIE1JQ0JBLCAwLAorCQkJICAgIEZYQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKKwkJCSAgICBGWEJBLCAwLAorCQkJICAgIEZYV0MsIDAsCisJCQkgICAgQURDQlMsIEFEQ0JTX0JVRlNJWkVfTk9ORSwKKwkJCSAgICBBRENCQSwgMCwKKwkJCSAgICBUQ0JTLCAwLAorCQkJICAgIFRDQiwgMCwKKwkJCSAgICBEQkcsIDB4ODAwMCwKKworCQkJICAgIC8qIERpc2FibGUgY2hhbm5lbCBpbnRlcnJ1cHQgKi8KKwkJCSAgICBDTElFTCwgMCwKKwkJCSAgICBDTElFSCwgMCwKKwkJCSAgICBTT0xFTCwgMCwKKwkJCSAgICBTT0xFSCwgMCwKKwkJCSAgICBUQUdMSVNUX0VORCk7CisKKwlpZiAoY2FyZC0+aXNfYXVkaWd5KQorCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgMCwgQV9EQkcsICBBX0RCR19TSU5HTEVfU1RFUCk7CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGNhcmQtPnBjaV9kZXYsIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuc2l6ZSwgY2FyZC0+dmlydHVhbHBhZ2V0YWJsZS5hZGRyLCBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmRtYV9oYW5kbGUpOworCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+c2lsZW50cGFnZS5zaXplLCBjYXJkLT5zaWxlbnRwYWdlLmFkZHIsIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSk7CisJCisJaWYoY2FyZC0+dGFua21lbS5zaXplICE9IDApCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgY2FyZC0+dGFua21lbS5zaXplLCBjYXJkLT50YW5rbWVtLmFkZHIsIGNhcmQtPnRhbmttZW0uZG1hX2hhbmRsZSk7CisKKwkvKiByZWxlYXNlIHBhdGNoIHN0b3JhZ2UgbWVtb3J5ICovCisJZnhfY2xlYW51cCgmY2FyZC0+bWdyKTsKK30KKworLyogRHJpdmVyIGluaXRpYWxpemF0aW9uIHJvdXRpbmUgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IGVtdTEwazFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKKwl1MzIgc3Vic3lzdmlkOworCWludCByZXQ7CisKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCBFTVUxMEsxX0RNQV9NQVNLKSkgeworCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGFyY2hpdGVjdHVyZSBkb2VzIG5vdCBzdXBwb3J0IDI5Yml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOworCisJaWYgKChjYXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVtdTEwazFfY2FyZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBvdXQgb2YgbWVtb3J5XG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKHN0cnVjdCBlbXUxMGsxX2NhcmQpKTsKKworCWNhcmQtPmlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lfZGV2LCAwKTsKKwljYXJkLT5sZW5ndGggPSBwY2lfcmVzb3VyY2VfbGVuKHBjaV9kZXYsIDApOyAKKworCWlmIChyZXF1ZXN0X3JlZ2lvbihjYXJkLT5pb2Jhc2UsIGNhcmQtPmxlbmd0aCwgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IElPIHNwYWNlIGluIHVzZVxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfcmVnaW9uOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBjYXJkKTsKKworCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKKwljYXJkLT5wY2lfZGV2ID0gcGNpX2RldjsKKworCS8qIFJlc2VydmUgSVJRIExpbmUgKi8KKwlpZiAocmVxdWVzdF9pcnEoY2FyZC0+aXJxLCBlbXUxMGsxX2ludGVycnVwdCwgU0FfU0hJUlEsIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIGNhcmQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogSVJRIGluIHVzZVxuIik7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9SRVZJU0lPTl9JRCwgJmNhcmQtPmNoaXByZXYpOworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaV9kZXYsIFBDSV9TVUJTWVNURU1fSUQsICZjYXJkLT5tb2RlbCk7CisKKwlwcmludGsoS0VSTl9JTkZPICJlbXUxMGsxOiAlcyByZXYgJWQgbW9kZWwgJSMwNHggZm91bmQsIElPIGF0ICUjMDRseC0lIzA0bHgsIElSUSAlZFxuIiwKKwkJY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZC0+Y2hpcHJldiwgY2FyZC0+bW9kZWwsIGNhcmQtPmlvYmFzZSwKKwkJY2FyZC0+aW9iYXNlICsgY2FyZC0+bGVuZ3RoIC0gMSwgY2FyZC0+aXJxKTsKKworCWlmIChwY2lfaWQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0NSRUFUSVZFX0FVRElHWSkKKwkJY2FyZC0+aXNfYXVkaWd5ID0gMTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCBQQ0lfU1VCU1lTVEVNX1ZFTkRPUl9JRCwgJnN1YnN5c3ZpZCk7CisJY2FyZC0+aXNfYXBzID0gKHN1YnN5c3ZpZCA9PSBFTVVfQVBTX1NVQklEKTsKKworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKKwlpbml0X01VVEVYKCZjYXJkLT5vcGVuX3NlbSk7CisJY2FyZC0+b3Blbl9tb2RlID0gMDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5vcGVuX3dhaXQpOworCisJcmV0ID0gZW11MTBrMV9hdWRpb19pbml0KGNhcmQpOworCWlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgaW5pdGlhbGl6ZSBhdWRpbyBkZXZpY2VzXG4iKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycl9hdWRpbzsKKyAgICAgICAgfQorCisJcmV0ID0gZW11MTBrMV9taXhlcl9pbml0KGNhcmQpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGluaXRpYWxpemUgQUM5NyBjb2RlY1xuIik7CisgICAgICAgICAgICAgICAgZ290byBlcnJfbWl4ZXI7CisJfQorCisJcmV0ID0gZW11MTBrMV9taWRpX2luaXQoY2FyZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlbXUxMGsxOiBjYW5ub3QgcmVnaXN0ZXIgbWlkaSBkZXZpY2VcbiIpOworCQlnb3RvIGVycl9taWRpOworCX0KKworCXJldCA9IGVtdTEwazFfaW5pdChjYXJkKTsKKwlpZiAocmV0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgImVtdTEwazE6IGNhbm5vdCBpbml0aWFsaXplIGRldmljZVxuIik7CisJCWdvdG8gZXJyX2VtdTEwazFfaW5pdDsKKwl9CisKKwlpZiAoY2FyZC0+aXNfYXBzKQorCQllbXUxMGsxX2VjYXJkX2luaXQoY2FyZCk7CisKKwlyZXQgPSBlbXUxMGsxX3JlZ2lzdGVyX2RldmljZXMoY2FyZCk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3JlZ2lzdGVyOworCisJLyogcHJvYyBlbnRyaWVzIG11c3QgYmUgY3JlYXRlZCBhZnRlciByZWdpc3RlcmluZyBkZXZpY2VzLCBhcworCSAqIGVtdTEwazFfaW5mb19wcm9jIHByaW50cyBjYXJkLT5hdWRpb19kZXYgJmNvLiAqLworCXJldCA9IGVtdTEwazFfcHJvY19pbml0KGNhcmQpOworCWlmIChyZXQgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZW11MTBrMTogY2Fubm90IGluaXRpYWxpemUgcHJvYyBkaXJlY3RvcnlcbiIpOworICAgICAgICAgICAgICAgIGdvdG8gZXJyX3Byb2M7CisJfQorCQorCWxpc3RfYWRkKCZjYXJkLT5saXN0LCAmZW11MTBrMV9kZXZzKTsKKworCXJldHVybiAwOworCitlcnJfcHJvYzoKKwllbXUxMGsxX3VucmVnaXN0ZXJfZGV2aWNlcyhjYXJkKTsKKworZXJyX3JlZ2lzdGVyOgorCWVtdTEwazFfY2xlYW51cChjYXJkKTsKKwkKK2Vycl9lbXUxMGsxX2luaXQ6CisJZW11MTBrMV9taWRpX2NsZWFudXAoY2FyZCk7CisKK2Vycl9taWRpOgorCWVtdTEwazFfbWl4ZXJfY2xlYW51cChjYXJkKTsKKworZXJyX21peGVyOgorCWVtdTEwazFfYXVkaW9fY2xlYW51cChjYXJkKTsKKworZXJyX2F1ZGlvOgorCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisKK2Vycl9pcnE6CisJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCBjYXJkLT5sZW5ndGgpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKKworZXJyX3JlZ2lvbjoKKwlrZnJlZShjYXJkKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBlbXUxMGsxX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCisJbGlzdF9kZWwoJmNhcmQtPmxpc3QpOworCisJZW11MTBrMV91bnJlZ2lzdGVyX2RldmljZXMoY2FyZCk7CisJZW11MTBrMV9jbGVhbnVwKGNhcmQpOworCWVtdTEwazFfbWlkaV9jbGVhbnVwKGNhcmQpOworCWVtdTEwazFfbWl4ZXJfY2xlYW51cChjYXJkKTsKKwllbXUxMGsxX3Byb2NfY2xlYW51cChjYXJkKTsKKwllbXUxMGsxX2F1ZGlvX2NsZWFudXAoY2FyZCk7CQorCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCBjYXJkLT5sZW5ndGgpOworCWtmcmVlKGNhcmQpOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKK30KKworTU9EVUxFX0FVVEhPUigiQmVydHJhbmQgTGVlLCBDYWkgWWluZy4gKEVtYWlsIHRvOiBlbXUxMGsxLWRldmVsQGxpc3RzLnNvdXJjZWZvcmdlLm5ldCkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQ3JlYXRpdmUgRU1VMTBLMSBQQ0kgQXVkaW8gRHJpdmVyIHYiIERSSVZFUl9WRVJTSU9OICJcbkNvcHlyaWdodCAoQykgMTk5OSBDcmVhdGl2ZSBUZWNobm9sb2d5IEx0ZC4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGVtdTEwazFfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiZW11MTBrMSIsCisJLmlkX3RhYmxlCT0gZW11MTBrMV9wY2lfdGJsLAorCS5wcm9iZQkJPSBlbXUxMGsxX3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoZW11MTBrMV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgZW11MTBrMV9pbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkNyZWF0aXZlIEVNVTEwSzEgUENJIEF1ZGlvIERyaXZlciwgdmVyc2lvbiAiIERSSVZFUl9WRVJTSU9OICIsICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOworCisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZW11MTBrMV9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVtdTEwazFfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmVtdTEwazFfcGNpX2RyaXZlcik7CisKKwlyZXR1cm47Cit9CisKK21vZHVsZV9pbml0KGVtdTEwazFfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQoZW11MTBrMV9jbGVhbnVwX21vZHVsZSk7CisKKyNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgorCisvKiBpbiBtaWRpLmMgKi8KK2V4dGVybiBpbnQgZW11MTBrMV9zZXFfbWlkaV9vcGVuKGludCBkZXYsIGludCBtb2RlLCAKKwkJCQl2b2lkICgqaW5wdXQpKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKSwKKwkJCQl2b2lkICgqb3V0cHV0KShpbnQgZGV2KSk7CitleHRlcm4gdm9pZCBlbXUxMGsxX3NlcV9taWRpX2Nsb3NlKGludCBkZXYpOworZXh0ZXJuIGludCBlbXUxMGsxX3NlcV9taWRpX291dChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSk7CitleHRlcm4gaW50IGVtdTEwazFfc2VxX21pZGlfc3RhcnRfcmVhZChpbnQgZGV2KTsKK2V4dGVybiBpbnQgZW11MTBrMV9zZXFfbWlkaV9lbmRfcmVhZChpbnQgZGV2KTsKK2V4dGVybiB2b2lkIGVtdTEwazFfc2VxX21pZGlfa2ljayhpbnQgZGV2KTsKK2V4dGVybiBpbnQgZW11MTBrMV9zZXFfbWlkaV9idWZmZXJfc3RhdHVzKGludCBkZXYpOworCitzdGF0aWMgc3RydWN0IG1pZGlfb3BlcmF0aW9ucyBlbXUxMGsxX21pZGlfb3BlcmF0aW9ucyA9Cit7CisJVEhJU19NT0RVTEUsCisJeyJFTVUxMEsxIE1JREkiLCAwLCAwLCBTTkRDQVJEX0VNVTEwSzF9LAorCSZzdGRfbWlkaV9zeW50aCwKKwl7MH0sCisJZW11MTBrMV9zZXFfbWlkaV9vcGVuLAorCWVtdTEwazFfc2VxX21pZGlfY2xvc2UsCisJTlVMTCwKKwllbXUxMGsxX3NlcV9taWRpX291dCwKKwllbXUxMGsxX3NlcV9taWRpX3N0YXJ0X3JlYWQsCisJZW11MTBrMV9zZXFfbWlkaV9lbmRfcmVhZCwKKwllbXUxMGsxX3NlcV9taWRpX2tpY2ssCisJTlVMTCwKKwllbXUxMGsxX3NlcV9taWRpX2J1ZmZlcl9zdGF0dXMsCisJTlVMTAorfTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9taWRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkZWEzZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuYwpAQCAtMCwwICsxLDYxMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgbWlkaS5jIC0gL2Rldi9taWRpIGludGVyZmFjZSBmb3IgZW11MTBrMSBkcml2ZXIKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKyNpbmNsdWRlICJjYXJkbW8uaCIKKyNpbmNsdWRlICJjYXJkbWkuaCIKKyNpbmNsdWRlICJtaWRpLmgiCisKKyNpZmRlZiBFTVUxMEsxX1NFUVVFTkNFUgorI2luY2x1ZGUgIi4uL3NvdW5kX2NvbmZpZy5oIgorI2VuZGlmCisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobWlkaV9zcGlubG9jayBfX2F0dHJpYnV0ZSgodW51c2VkKSkpOworCitzdGF0aWMgdm9pZCBpbml0X21pZGlfaGRyKHN0cnVjdCBtaWRpX2hkciAqbWlkaWhkcikKK3sKKwltaWRpaGRyLT5idWZmZXJsZW5ndGggPSBNSURJSU5fQlVGTEVOOworCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSAwOworCW1pZGloZHItPmZsYWdzID0gMDsKK30KKworc3RhdGljIGludCBtaWRpaW5fYWRkX2J1ZmZlcihzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2Rldiwgc3RydWN0IG1pZGlfaGRyICoqbWlkaWhkcnB0cikKK3sKKwlzdHJ1Y3QgbWlkaV9oZHIgKm1pZGloZHI7CisKKwlpZiAoKG1pZGloZHIgPSAoc3RydWN0IG1pZGlfaGRyICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCUVSUk9SKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWluaXRfbWlkaV9oZHIobWlkaWhkcik7CisKKwlpZiAoKG1pZGloZHItPmRhdGEgPSAodTggKikga21hbGxvYyhNSURJSU5fQlVGTEVOLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlFUlJPUigpOworCQlrZnJlZShtaWRpaGRyKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChlbXUxMGsxX21wdWluX2FkZF9idWZmZXIobWlkaV9kZXYtPmNhcmQtPm1wdWluLCBtaWRpaGRyKSA8IDApIHsKKwkJRVJST1IoKTsKKwkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7CisJCWtmcmVlKG1pZGloZHIpOworCQlyZXR1cm4gLTE7CisJfQorCisJKm1pZGloZHJwdHIgPSBtaWRpaGRyOworCWxpc3RfYWRkX3RhaWwoJm1pZGloZHItPmxpc3QsICZtaWRpX2Rldi0+bWlkX2hkcnMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW11MTBrMV9taWRpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gTlVMTDsKKwlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCURQRigyLCAiZW11MTBrMV9taWRpX29wZW4oKVxuIik7CisKKwkvKiBDaGVjayBmb3IgY29ycmVjdCBkZXZpY2UgdG8gb3BlbiAqLworCWxpc3RfZm9yX2VhY2goZW50cnksICZlbXUxMGsxX2RldnMpIHsKKwkJY2FyZCA9IGxpc3RfZW50cnkoZW50cnksIHN0cnVjdCBlbXUxMGsxX2NhcmQsIGxpc3QpOworCisJCWlmIChjYXJkLT5taWRpX2RldiA9PSBtaW5vcikKKwkJCWdvdG8gbWF0Y2g7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7CisKK21hdGNoOgorI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCisJaWYgKGNhcmQtPnNlcV9taWRpZGV2KQkvKiBjYXJkIGlzIG9wZW5lZCBieSBzZXF1ZW5jZXIgKi8KKwkJcmV0dXJuIC1FQlVTWTsKKyNlbmRpZgorCisJLyogV2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmY2FyZC0+b3Blbl9zZW0pOworCXdoaWxlIChjYXJkLT5vcGVuX21vZGUgJiAoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJmNhcmQtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQl1cCgmY2FyZC0+b3Blbl9zZW0pOworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZjYXJkLT5vcGVuX3dhaXQpOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJfQorCisJCWRvd24oJmNhcmQtPm9wZW5fc2VtKTsKKwl9CisKKwlpZiAoKG1pZGlfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKikga21hbGxvYyhzaXplb2YoKm1pZGlfZGV2KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbWlkaV9kZXYtPmNhcmQgPSBjYXJkOworCW1pZGlfZGV2LT5taXN0YXRlID0gTUlESUlOX1NUQVRFX1NUT1BQRUQ7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWlkaV9kZXYtPm9XYWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX2Rldi0+aVdhaXQpOworCW1pZGlfZGV2LT5pcmQgPSAwOworCW1pZGlfZGV2LT5pd3IgPSAwOworCW1pZGlfZGV2LT5pY250ID0gMDsKKwlJTklUX0xJU1RfSEVBRCgmbWlkaV9kZXYtPm1pZF9oZHJzKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCBtaWRpX29wZW5pbmZvIGRzQ2FyZE1pZGlPcGVuSW5mbzsKKwkJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyMTsKKwkJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyMjsKKworCQlkc0NhcmRNaWRpT3BlbkluZm8ucmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpX2RldjsKKworCQlpZiAoZW11MTBrMV9tcHVpbl9vcGVuKGNhcmQsICZkc0NhcmRNaWRpT3BlbkluZm8pIDwgMCkgeworCQkJRVJST1IoKTsKKwkJCWtmcmVlKG1pZGlfZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJLyogQWRkIHR3byBidWZmZXJzIHRvIHJlY2VpdmUgc3lzZXggYnVmZmVyICovCisJCWlmIChtaWRpaW5fYWRkX2J1ZmZlcihtaWRpX2RldiwgJm1pZGloZHIxKSA8IDApIHsKKwkJCWtmcmVlKG1pZGlfZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisKKwkJaWYgKG1pZGlpbl9hZGRfYnVmZmVyKG1pZGlfZGV2LCAmbWlkaWhkcjIpIDwgMCkgeworCQkJbGlzdF9kZWwoJm1pZGloZHIxLT5saXN0KTsKKwkJCWtmcmVlKG1pZGloZHIxLT5kYXRhKTsKKwkJCWtmcmVlKG1pZGloZHIxKTsKKwkJCWtmcmVlKG1pZGlfZGV2KTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0cnVjdCBtaWRpX29wZW5pbmZvIGRzQ2FyZE1pZGlPcGVuSW5mbzsKKworCQlkc0NhcmRNaWRpT3BlbkluZm8ucmVmZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBtaWRpX2RldjsKKworCQlpZiAoZW11MTBrMV9tcHVvdXRfb3BlbihjYXJkLCAmZHNDYXJkTWlkaU9wZW5JbmZvKSA8IDApIHsKKwkJCUVSUk9SKCk7CisJCQlrZnJlZShtaWRpX2Rldik7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCX0KKworCWZpbGUtPnByaXZhdGVfZGF0YSA9ICh2b2lkICopIG1pZGlfZGV2OworCisJY2FyZC0+b3Blbl9tb2RlIHw9IChmaWxlLT5mX21vZGUgPDwgRk1PREVfTUlESV9TSElGVCkgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSk7CisKKwl1cCgmY2FyZC0+b3Blbl9zZW0pOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVtdTEwazFfbWlkaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7CisKKwlsb2NrX2tlcm5lbCgpOworCisJY2FyZCA9IG1pZGlfZGV2LT5jYXJkOworCURQRigyLCAiZW11MTBrMV9taWRpX3JlbGVhc2UoKVxuIik7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKSB7CisKKwkJCXdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgKGNhcmQtPm1wdW91dC0+Zmlyc3RtaWRpcSAhPSBOVUxMKSkgeworCQkJCURQRig0LCAiQ2Fubm90IGNsb3NlIC0gYnVmZmVycyBub3QgZW1wdHlcbiIpOworCisJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmbWlkaV9kZXYtPm9XYWl0KTsKKworCQkJfQorCQl9CisKKwkJZW11MTBrMV9tcHVvdXRfY2xvc2UoY2FyZCk7CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOworCisJCWlmIChtaWRpX2Rldi0+bWlzdGF0ZSA9PSBNSURJSU5fU1RBVEVfU1RBUlRFRCkgeworCQkJZW11MTBrMV9tcHVpbl9zdG9wKGNhcmQpOworCQkJbWlkaV9kZXYtPm1pc3RhdGUgPSBNSURJSU5fU1RBVEVfU1RPUFBFRDsKKwkJfQorCisJCWVtdTEwazFfbXB1aW5fcmVzZXQoY2FyZCk7CisJCWVtdTEwazFfbXB1aW5fY2xvc2UoY2FyZCk7CisKKwkJd2hpbGUgKCFsaXN0X2VtcHR5KCZtaWRpX2Rldi0+bWlkX2hkcnMpKSB7CisJCQltaWRpaGRyID0gbGlzdF9lbnRyeShtaWRpX2Rldi0+bWlkX2hkcnMubmV4dCwgc3RydWN0IG1pZGlfaGRyLCBsaXN0KTsKKworCQkJbGlzdF9kZWwobWlkaV9kZXYtPm1pZF9oZHJzLm5leHQpOworCQkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7CisJCQlrZnJlZShtaWRpaGRyKTsKKwkJfQorCX0KKworCWtmcmVlKG1pZGlfZGV2KTsKKworCWRvd24oJmNhcmQtPm9wZW5fc2VtKTsKKwljYXJkLT5vcGVuX21vZGUgJj0gfigoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpKTsKKwl1cCgmY2FyZC0+b3Blbl9zZW0pOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmY2FyZC0+b3Blbl93YWl0KTsKKworCXVubG9ja19rZXJuZWwoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBlbXUxMGsxX21pZGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwb3MpCit7CisJc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQgPSAwOworCXUxNiBjbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQRCg0LCAiZW11MTBrMV9taWRpX3JlYWQoKSwgY291bnQgJSN4XG4iLCAodTMyKSBjb3VudCk7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChtaWRpX2Rldi0+bWlzdGF0ZSA9PSBNSURJSU5fU1RBVEVfU1RPUFBFRCkgeworCQlpZiAoZW11MTBrMV9tcHVpbl9zdGFydChtaWRpX2Rldi0+Y2FyZCkgPCAwKSB7CisJCQlFUlJPUigpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQltaWRpX2Rldi0+bWlzdGF0ZSA9IE1JRElJTl9TVEFURV9TVEFSVEVEOworCX0KKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJY250ID0gTUlESUlOX0JVRkxFTiAtIG1pZGlfZGV2LT5pcmQ7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKKworCQlpZiAobWlkaV9kZXYtPmljbnQgPCBjbnQpCisJCQljbnQgPSBtaWRpX2Rldi0+aWNudDsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47CisJCQlEUEYoMiwgIiBHbyB0byBzbGVlcC4uLlxuIik7CisKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJm1pZGlfZGV2LT5pV2FpdCk7CisKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBtaWRpX2Rldi0+aUJ1ZiArIG1pZGlfZGV2LT5pcmQsIGNudCkpIHsKKwkJCUVSUk9SKCk7CisJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVGQVVMVDsKKwkJfQorCisJCW1pZGlfZGV2LT5pcmQgKz0gY250OworCQltaWRpX2Rldi0+aXJkICU9IE1JRElJTl9CVUZMRU47CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKKworCQltaWRpX2Rldi0+aWNudCAtPSBjbnQ7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOworCisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKworCQlpZiAobWlkaV9kZXYtPmljbnQgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGVtdTEwazFfbWlkaV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwb3MpCit7CisJc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEQoNCwgImVtdTEwazFfbWlkaV93cml0ZSgpLCBjb3VudD0lI3hcbiIsICh1MzIpIGNvdW50KTsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoKG1pZGloZHIgPSAoc3RydWN0IG1pZGlfaGRyICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX2hkciksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1pZGloZHItPmJ1ZmZlcmxlbmd0aCA9IGNvdW50OworCW1pZGloZHItPmJ5dGVzcmVjb3JkZWQgPSAwOworCW1pZGloZHItPmZsYWdzID0gMDsKKworCWlmICgobWlkaWhkci0+ZGF0YSA9ICh1OCAqKSBrbWFsbG9jKGNvdW50LCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlFUlJPUigpOworCQlrZnJlZShtaWRpaGRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGNvcHlfZnJvbV91c2VyKG1pZGloZHItPmRhdGEsIGJ1ZmZlciwgY291bnQpKSB7CisJCWtmcmVlKG1pZGloZHItPmRhdGEpOworCQlrZnJlZShtaWRpaGRyKTsKKwkJcmV0dXJuIC1FRkFVTFQ7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKKworCWlmIChlbXUxMGsxX21wdW91dF9hZGRfYnVmZmVyKG1pZGlfZGV2LT5jYXJkLCBtaWRpaGRyKSA8IDApIHsKKwkJRVJST1IoKTsKKwkJa2ZyZWUobWlkaWhkci0+ZGF0YSk7CisJCWtmcmVlKG1pZGloZHIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pZGlfc3BpbmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBlbXUxMGsxX21pZGlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKm1pZGlfZGV2ID0gKHN0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJRFBGKDQsICJlbXUxMGsxX21pZGlfcG9sbCgpIGNhbGxlZFxuIik7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXBvbGxfd2FpdChmaWxlLCAmbWlkaV9kZXYtPm9XYWl0LCB3YWl0KTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlwb2xsX3dhaXQoZmlsZSwgJm1pZGlfZGV2LT5pV2FpdCwgd2FpdCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKG1pZGlfZGV2LT5taXN0YXRlID09IE1JRElJTl9TVEFURV9TVEFSVEVEKQorCQkJaWYgKG1pZGlfZGV2LT5pY250ID4gMCkKKwkJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG1hc2s7Cit9CisKK2ludCBlbXUxMGsxX21pZGlfY2FsbGJhY2sodW5zaWduZWQgbG9uZyBtc2csIHVuc2lnbmVkIGxvbmcgcmVmZGF0YSwgdW5zaWduZWQgbG9uZyAqcG1zZykKK3sKKwlzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICptaWRpX2RldiA9IChzdHJ1Y3QgZW11MTBrMV9taWRpZGV2aWNlICopIHJlZmRhdGE7CisJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJRFBGKDQsICJlbXUxMGsxX21pZGlfY2FsbGJhY2soKVxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOworCisJc3dpdGNoIChtc2cpIHsKKwljYXNlIElDQVJETUlESV9PVVRMT05HREFUQToKKwkJbWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikgcG1zZ1syXTsKKworCQlrZnJlZShtaWRpaGRyLT5kYXRhKTsKKwkJa2ZyZWUobWlkaWhkcik7CisJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmbWlkaV9kZXYtPm9XYWl0KTsKKworCQlicmVhazsKKworCWNhc2UgSUNBUkRNSURJX0lOTE9OR0RBVEE6CisJCW1pZGloZHIgPSAoc3RydWN0IG1pZGlfaGRyICopIHBtc2dbMl07CisKKwkJZm9yIChpID0gMDsgaSA8IG1pZGloZHItPmJ5dGVzcmVjb3JkZWQ7IGkrKykgeworCQkJbWlkaV9kZXYtPmlCdWZbbWlkaV9kZXYtPml3cisrXSA9IG1pZGloZHItPmRhdGFbaV07CisJCQltaWRpX2Rldi0+aXdyICU9IE1JRElJTl9CVUZMRU47CisJCX0KKworCQltaWRpX2Rldi0+aWNudCArPSBtaWRpaGRyLT5ieXRlc3JlY29yZGVkOworCisJCWlmIChtaWRpX2Rldi0+bWlzdGF0ZSA9PSBNSURJSU5fU1RBVEVfU1RBUlRFRCkgeworCQkJaW5pdF9taWRpX2hkcihtaWRpaGRyKTsKKwkJCWVtdTEwazFfbXB1aW5fYWRkX2J1ZmZlcihtaWRpX2Rldi0+Y2FyZC0+bXB1aW4sIG1pZGloZHIpOworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZtaWRpX2Rldi0+aVdhaXQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBJQ0FSRE1JRElfSU5EQVRBOgorCQl7CisJCQl1OCAqcEJ1ZiA9ICh1OCAqKSAmIHBtc2dbMV07CisJCQl1MTYgYnl0ZXN2YWxpZCA9IHBtc2dbMl07CisKKwkJCWZvciAoaSA9IDA7IGkgPCBieXRlc3ZhbGlkOyBpKyspIHsKKwkJCQltaWRpX2Rldi0+aUJ1ZlttaWRpX2Rldi0+aXdyKytdID0gcEJ1ZltpXTsKKwkJCQltaWRpX2Rldi0+aXdyICU9IE1JRElJTl9CVUZMRU47CisJCQl9CisKKwkJCW1pZGlfZGV2LT5pY250ICs9IGJ5dGVzdmFsaWQ7CisJCX0KKworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJm1pZGlfZGV2LT5pV2FpdCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoJCS8qIFVua25vd24gbWVzc2FnZSAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogTUlESSBmaWxlIG9wZXJhdGlvbnMgKi8KK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgZW11MTBrMV9taWRpX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGVtdTEwazFfbWlkaV9yZWFkLAorCS53cml0ZQkJPSBlbXUxMGsxX21pZGlfd3JpdGUsCisJLnBvbGwJCT0gZW11MTBrMV9taWRpX3BvbGwsCisJLm9wZW4JCT0gZW11MTBrMV9taWRpX29wZW4sCisJLnJlbGVhc2UJPSBlbXUxMGsxX21pZGlfcmVsZWFzZSwKK307CisKKworI2lmZGVmIEVNVTEwSzFfU0VRVUVOQ0VSCisKKy8qIGZ1bmN0aW9ucyB1c2VkIGZvciBzZXF1ZW5jZXIgYWNjZXNzICovCisKK2ludCBlbXUxMGsxX3NlcV9taWRpX29wZW4oaW50IGRldiwgaW50IG1vZGUsCisJCQkJdm9pZCAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKKwkJCQl2b2lkICgqb3V0cHV0KSAoaW50IGRldikpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgbWlkaV9vcGVuaW5mbyBkc0NhcmRNaWRpT3BlbkluZm87CisJc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqbWlkaV9kZXY7CisKKwlpZiAobWlkaV9kZXZzW2Rldl0gPT0gTlVMTCB8fCBtaWRpX2RldnNbZGV2XS0+ZGV2YyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhcmQgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmIChjYXJkLT5vcGVuX21vZGUpCQkvKiBjYXJkIGlzIG9wZW5lZCBuYXRpdmUgKi8KKwkJcmV0dXJuIC1FQlVTWTsKKwkJCQorCURQRigyLCAiZW11MTBrMV9zZXFfbWlkaV9vcGVuKClcbiIpOworCQorCWlmICgobWlkaV9kZXYgPSAoc3RydWN0IGVtdTEwazFfbWlkaWRldmljZSAqKSBrbWFsbG9jKHNpemVvZigqbWlkaV9kZXYpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltaWRpX2Rldi0+Y2FyZCA9IGNhcmQ7CisJbWlkaV9kZXYtPm1pc3RhdGUgPSBNSURJSU5fU1RBVEVfU1RPUFBFRDsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX2Rldi0+b1dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1pZGlfZGV2LT5pV2FpdCk7CisJbWlkaV9kZXYtPmlyZCA9IDA7CisJbWlkaV9kZXYtPml3ciA9IDA7CisJbWlkaV9kZXYtPmljbnQgPSAwOworCUlOSVRfTElTVF9IRUFEKCZtaWRpX2Rldi0+bWlkX2hkcnMpOworCisJZHNDYXJkTWlkaU9wZW5JbmZvLnJlZmRhdGEgPSAodW5zaWduZWQgbG9uZykgbWlkaV9kZXY7CisKKwlpZiAoZW11MTBrMV9tcHVvdXRfb3BlbihjYXJkLCAmZHNDYXJkTWlkaU9wZW5JbmZvKSA8IDApIHsKKwkJRVJST1IoKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY2FyZC0+c2VxX21pZGlkZXYgPSBtaWRpX2RldjsKKwkJCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZW11MTBrMV9zZXFfbWlkaV9jbG9zZShpbnQgZGV2KQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7CisKKwlEUEYoMiwgImVtdTEwazFfc2VxX21pZGlfY2xvc2UoKVxuIik7CisJaWYgKG1pZGlfZGV2c1tkZXZdID09IE5VTEwgfHwgbWlkaV9kZXZzW2Rldl0tPmRldmMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJY2FyZCA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCWVtdTEwazFfbXB1b3V0X2Nsb3NlKGNhcmQpOworCisJaWYgKGNhcmQtPnNlcV9taWRpZGV2KSB7CisJCWtmcmVlKGNhcmQtPnNlcV9taWRpZGV2KTsKKwkJY2FyZC0+c2VxX21pZGlkZXYgPSBOVUxMOworCX0KK30KKworaW50IGVtdTEwazFfc2VxX21pZGlfb3V0KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKQoreworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQ7CisJc3RydWN0IG1pZGlfaGRyICptaWRpaGRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobWlkaV9kZXZzW2Rldl0gPT0gTlVMTCB8fCBtaWRpX2RldnNbZGV2XS0+ZGV2YyA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhcmQgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmICgobWlkaWhkciA9IChzdHJ1Y3QgbWlkaV9oZHIgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfaGRyKSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJbWlkaWhkci0+YnVmZmVybGVuZ3RoID0gMTsKKwltaWRpaGRyLT5ieXRlc3JlY29yZGVkID0gMDsKKwltaWRpaGRyLT5mbGFncyA9IDA7CisKKwlpZiAoKG1pZGloZHItPmRhdGEgPSAodTggKikga21hbGxvYygxLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlFUlJPUigpOworCQlrZnJlZShtaWRpaGRyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJKihtaWRpaGRyLT5kYXRhKSA9IG1pZGlfYnl0ZTsKKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOworCisJaWYgKGVtdTEwazFfbXB1b3V0X2FkZF9idWZmZXIoY2FyZCwgbWlkaWhkcikgPCAwKSB7CisJCUVSUk9SKCk7CisJCWtmcmVlKG1pZGloZHItPmRhdGEpOworCQlrZnJlZShtaWRpaGRyKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWlkaV9zcGlubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWRpX3NwaW5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGVtdTEwazFfc2VxX21pZGlfc3RhcnRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCitpbnQgZW11MTBrMV9zZXFfbWlkaV9lbmRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCit2b2lkIGVtdTEwazFfc2VxX21pZGlfa2ljayhpbnQgZGV2KQoreworfQorCitpbnQgZW11MTBrMV9zZXFfbWlkaV9idWZmZXJfc3RhdHVzKGludCBkZXYpCit7CisJaW50IGNvdW50OworCXN0cnVjdCBtaWRpX3F1ZXVlICpxdWV1ZTsKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOworCisJaWYgKG1pZGlfZGV2c1tkZXZdID09IE5VTEwgfHwgbWlkaV9kZXZzW2Rldl0tPmRldmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljb3VudCA9IDA7CisKKwljYXJkID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7CisJcXVldWUgPSBjYXJkLT5tcHVvdXQtPmZpcnN0bWlkaXE7CisKKwl3aGlsZSAocXVldWUgIT0gTlVMTCkgeworCQljb3VudCsrOworCQlpZiAocXVldWUgPT0gY2FyZC0+bXB1b3V0LT5sYXN0bWlkaXEpCisJCQlicmVhazsKKworCQlxdWV1ZSA9IHF1ZXVlLT5uZXh0OworCX0KKworCXJldHVybiBjb3VudDsKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuaCBiL3NvdW5kL29zcy9lbXUxMGsxL21pZGkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDU5ZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvbWlkaS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qICAgICAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgbWlkaS5oCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAorICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAorICogICAgIFVTQS4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICovIAorCisjaWZuZGVmIF9NSURJX0gKKyNkZWZpbmUgX01JRElfSAorCisjZGVmaW5lIEZNT0RFX01JRElfU0hJRlQgMworI2RlZmluZSBGTU9ERV9NSURJX1JFQUQgIChGTU9ERV9SRUFEIDw8IEZNT0RFX01JRElfU0hJRlQpCisjZGVmaW5lIEZNT0RFX01JRElfV1JJVEUgKEZNT0RFX1dSSVRFIDw8IEZNT0RFX01JRElfU0hJRlQpCisKKyNkZWZpbmUgTUlESUlOX1NUQVRFX1NUQVJURUQgMHgwMDAwMDAwMQorI2RlZmluZSBNSURJSU5fU1RBVEVfU1RPUFBFRCAweDAwMDAwMDAyCisKKyNkZWZpbmUgTUlESUlOX0JVRkxFTiAxMDI0CisKK3N0cnVjdCBlbXUxMGsxX21pZGlkZXZpY2UKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOworCXUzMiBtaXN0YXRlOworCXdhaXRfcXVldWVfaGVhZF90IG9XYWl0OworCXdhaXRfcXVldWVfaGVhZF90IGlXYWl0OworCXM4IGlCdWZbTUlESUlOX0JVRkxFTl07CisJdTE2IGlyZCwgaXdyLCBpY250OworCXN0cnVjdCBsaXN0X2hlYWQgbWlkX2hkcnM7Cit9OworCisvKiB1bmNvbW1lbnQgbmV4dCBsaW5lIHRvIHVzZSBtaWRpIHBvcnQgb24gQXVkaWd5IGRyaXZlICovCisvLyNkZWZpbmUgVVNFX0FVRElHWV9EUklWRV9NSURJCisKKyNpZmRlZiBVU0VfQVVESUdZX0RSSVZFX01JREkKKyNkZWZpbmUgQV9NVURBVEEJQV9NVURBVEEyCisjZGVmaW5lIEFfTVVDTUQJCUFfTVVDTUQyCisjZGVmaW5lIEFfTVVTVEFUCUFfTVVDTUQyCisjZGVmaW5lIEFfSVBSX01JRElUUkFOU0JVRkVNUFRZCUFfSVBSX01JRElUUkFOU0JVRkVNUFRZMgorI2RlZmluZSBBX0lQUl9NSURJUkVDVkJVRkVNUFRZCUFfSVBSX01JRElSRUNWQlVGRU1QVFkyCisjZGVmaW5lIEFfSU5URV9NSURJVFhFTkFCTEUJQV9JTlRFX01JRElUWEVOQUJMRTIKKyNkZWZpbmUgQV9JTlRFX01JRElSWEVOQUJMRQlBX0lOVEVfTUlESVJYRU5BQkxFMgorI2Vsc2UKKyNkZWZpbmUgQV9NVURBVEEJQV9NVURBVEExCisjZGVmaW5lIEFfTVVDTUQJCUFfTVVDTUQxCisjZGVmaW5lIEFfTVVTVEFUCUFfTVVDTUQxCisjZGVmaW5lIEFfSVBSX01JRElUUkFOU0JVRkVNUFRZCUFfSVBSX01JRElUUkFOU0JVRkVNUFRZMQorI2RlZmluZSBBX0lQUl9NSURJUkVDVkJVRkVNUFRZCUFfSVBSX01JRElSRUNWQlVGRU1QVFkxCisjZGVmaW5lIEFfSU5URV9NSURJVFhFTkFCTEUJQV9JTlRFX01JRElUWEVOQUJMRTEKKyNkZWZpbmUgQV9JTlRFX01JRElSWEVOQUJMRQlBX0lOVEVfTUlESVJYRU5BQkxFMQorI2VuZGlmCisKKworI2VuZGlmIC8qIF9NSURJX0ggKi8KKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2VtdTEwazEvbWl4ZXIuYyBiL3NvdW5kL29zcy9lbXUxMGsxL21peGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjYWFhMwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lbXUxMGsxL21peGVyLmMKQEAgLTAsMCArMSw2OTAgQEAKKy8qCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIG1peGVyLmMgLSAvZGV2L21peGVyIGludGVyZmFjZSBmb3IgZW11MTBrMSBkcml2ZXIKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqICAgICBOb3ZlbWJlciAyLCAxOTk5ICAgICBBbGFuIENveCAgICAgICAgY2xlYW5lZCB1cCBzdHVmZgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksCisgKiAgICAgVVNBLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2luY2x1ZGUgImh3YWNjZXNzLmgiCisjaW5jbHVkZSAiODAxMC5oIgorI2luY2x1ZGUgInJlY21nci5oIgorCisKK3N0YXRpYyBjb25zdCB1MzIgYmFzc190YWJsZVs0MV1bNV0gPSB7CisJeyAweDNlNGY4NDRmLCAweDg0ZWQ0Y2MzLCAweDNjYzY5OTI3LCAweDdiMDM1NTNhLCAweGM0ZGE4NDg2IH0sCisJeyAweDNlNjlhMTdhLCAweDg0YzI4MGZiLCAweDNjZDc3Y2Q0LCAweDdiMmYyYTZmLCAweGM0YjA4ZDFkIH0sCisJeyAweDNlODJmZjQyLCAweDg0OTk5MWQ1LCAweDNjZTc0NjZiLCAweDdiNTkxN2M2LCAweGM0ODg2M2VlIH0sCisJeyAweDNlOWJhYjNjLCAweDg0NzI2N2YwLCAweDNjZjVmZmU4LCAweDdiODEzNTYwLCAweGM0NjFmMjJjIH0sCisJeyAweDNlYjNiMjc1LCAweDg0NGNlZDI5LCAweDNkMDNiMjk1LCAweDdiYTc5YTFjLCAweGM0M2QyMjNiIH0sCisJeyAweDNlY2IyMTc0LCAweDg0MjkwYzhiLCAweDNkMTA2NzE0LCAweDdiY2M1YmEzLCAweGM0MTlkZmE1IH0sCisJeyAweDNlZTIwNDRiLCAweDg0MDZiMjQ0LCAweDNkMWMyNTYxLCAweDdiZWY4ZTc3LCAweGMzZjgxNzBmIH0sCisJeyAweDNlZjg2Njk4LCAweDgzZTVjYjk2LCAweDNkMjZmNGQ4LCAweDdjMTE0NjAwLCAweGMzZDdiNjI1IH0sCisJeyAweDNmMGU1MzkwLCAweDgzYzY0NmM5LCAweDNkMzBkYzM5LCAweDdjMzE5NDk4LCAweGMzYjhhYjk3IH0sCisJeyAweDNmMjNkNjBiLCAweDgzYTgxMzIxLCAweDNkMzllMWFmLCAweDdjNTA4YjljLCAweGMzOWFlNzA0IH0sCisJeyAweDNmMzhmODg0LCAweDgzOGIyMGQyLCAweDNkNDIwYWQyLCAweDdjNmUzYjc1LCAweGMzN2U1OGYxIH0sCisJeyAweDNmNGRjNTJjLCAweDgzNmY2MGVmLCAweDNkNDk1Y2FiLCAweDdjOGFiM2E2LCAweGMzNjJmMmJlIH0sCisJeyAweDNmNjI0NWU4LCAweDgzNTRjNTY1LCAweDNkNGZkYmI4LCAweDdjYTYwMmQ2LCAweGMzNDhhNjliIH0sCisJeyAweDNmNzY4NDVmLCAweDgzM2I0MGVjLCAweDNkNTU4YmYwLCAweDdjYzAzNmRmLCAweGMzMmY2NzdjIH0sCisJeyAweDNmOGE4YTAzLCAweDgzMjJjNmZiLCAweDNkNWE3MGM0LCAweDdjZDk1Y2Q3LCAweGMzMTcyOTBiIH0sCisJeyAweDNmOWU2MDE0LCAweDgzMGI0YmMzLCAweDNkNWU4ZDI1LCAweDdjZjE4MTFhLCAweGMyZmZkZmE1IH0sCisJeyAweDNmYjIwZmFlLCAweDgyZjRjNDIwLCAweDNkNjFlMzdmLCAweDdkMDhhZjU2LCAweGMyZTk4MDRhIH0sCisJeyAweDNmYzVhMWNjLCAweDgyZGYyNTkyLCAweDNkNjQ3NWMzLCAweDdkMWVmMjk0LCAweGMyZDQwMDk2IH0sCisJeyAweDNmZDkxZjU1LCAweDgyY2E2NjMyLCAweDNkNjY0NTY0LCAweDdkMzQ1NTQxLCAweGMyYmY1NmI5IH0sCisJeyAweDNmZWM5MTIwLCAweDgyYjY3Y2FjLCAweDNkNjc1MzU2LCAweDdkNDhlMTM4LCAweGMyYWI3OTZlIH0sCisJeyAweDQwMDAwMDAwLCAweDgyYTM2MDM3LCAweDNkNjdhMDEyLCAweDdkNWM5ZmM5LCAweGMyOTg1ZmVlIH0sCisJeyAweDQwMTM3NGM3LCAweDgyOTEwODhhLCAweDNkNjcyYjkzLCAweDdkNmY5OWMzLCAweGMyODYwMWYyIH0sCisJeyAweDQwMjZmODU3LCAweDgyN2Y2ZGQ3LCAweDNkNjVmNTU5LCAweDdkODFkNzdjLCAweGMyNzQ1N2EzIH0sCisJeyAweDQwM2E5MzlmLCAweDgyNmU4OGM1LCAweDNkNjNmYzYzLCAweDdkOTM2MGQ0LCAweGMyNjM1OTk2IH0sCisJeyAweDQwNGU0ZmFmLCAweDgyNWU1MjY2LCAweDNkNjEzZjMyLCAweDdkYTQzZDQyLCAweGMyNTMwMGM2IH0sCisJeyAweDQwNjIzNWJhLCAweDgyNGVjNDM0LCAweDNkNWRiYmMzLCAweDdkYjQ3M2Q3LCAweGMyNDM0NjhlIH0sCisJeyAweDQwNzY0ZjFmLCAweDgyM2ZkODBjLCAweDNkNTk2ZjhmLCAweDdkYzQwYjQ0LCAweGMyMzQyNGEyIH0sCisJeyAweDQwOGFhNTc2LCAweDgyMzE4ODI0LCAweDNkNTQ1Nzg3LCAweDdkZDMwOWUyLCAweGMyMjU5NTA5IH0sCisJeyAweDQwOWY0Mjk2LCAweDgyMjNjZjBiLCAweDNkNGU3MDEyLCAweDdkZTE3NWI1LCAweGMyMTc5MjE4IH0sCisJeyAweDQwYjQzMGEwLCAweDgyMTZhN2ExLCAweDNkNDdiNTA1LCAweDdkZWY1NDc1LCAweGMyMGExNjcwIH0sCisJeyAweDQwYzk3YTBhLCAweDgyMGEwZDEyLCAweDNkNDAyMWExLCAweDdkZmNhYjhkLCAweGMxZmQxY2Y1IH0sCisJeyAweDQwZGYyOWE2LCAweDgxZmRmYWQ2LCAweDNkMzdiMDhkLCAweDdlMDk4MDI4LCAweGMxZjBhMGNhIH0sCisJeyAweDQwZjU0YWIxLCAweDgxZjI2Y2E5LCAweDNkMmU1YmQxLCAweDdlMTVkNzJiLCAweGMxZTQ5ZDUyIH0sCisJeyAweDQxMGJlOGRhLCAweDgxZTc1ZTg5LCAweDNkMjQxY2NlLCAweDdlMjFiNTQ0LCAweGMxZDkwZTI0IH0sCisJeyAweDQxMjMxMDUxLCAweDgxZGNjY2IzLCAweDNkMThlYzM3LCAweDdlMmQxZWU2LCAweGMxY2RlZjEwIH0sCisJeyAweDQxM2FjZGQwLCAweDgxZDJiMzllLCAweDNkMGNjMjBhLCAweDdlMzgxODRlLCAweGMxYzMzYzEzIH0sCisJeyAweDQxNTMyZWE3LCAweDgxYzkwZmZiLCAweDNjZmY5NTg1LCAweDdlNDJhNThiLCAweGMxYjhmMTVhIH0sCisJeyAweDQxNmM0MGNkLCAweDgxYmZkZWIyLCAweDNjZjE1ZDIxLCAweDdlNGNjYTdjLCAweGMxYWYwYjNmIH0sCisJeyAweDQxODYxMmVhLCAweDgxYjcxY2RjLCAweDNjZTIwZTg1LCAweDdlNTY4YWQzLCAweGMxYTU4NjQwIH0sCisJeyAweDQxYTBiNDY1LCAweDgxYWVjN2M1LCAweDNjZDE5ZTdjLCAweDdlNWZlYTFlLCAweGMxOWM1ZjAzIH0sCisJeyAweDQxYmMzNTczLCAweDgxYTZkY2VhLCAweDNjYzAwMGU5LCAweDdlNjhlYmMyLCAweGMxOTM5MjUwIH0KK307CisKK3N0YXRpYyBjb25zdCB1MzIgdHJlYmxlX3RhYmxlWzQxXVs1XSA9IHsKKwl7IDB4MDEyNWNiYTksIDB4ZmVkNWRlYmQsIDB4MDA1OTliNmMsIDB4MGQyNTA2ZGEsIDB4ZmE4NWIzNTQgfSwKKwl7IDB4MDE0MmY2N2UsIDB4ZmViMDMxNjMsIDB4MDA2NmNkMGYsIDB4MGQxNGM2OWQsIDB4ZmE5MTQ0NzMgfSwKKwl7IDB4MDE2MzI4YmQsIDB4ZmU4NjAxNTgsIDB4MDA3NWI3ZjIsIDB4MGQwM2ViMjcsIDB4ZmE5ZDMyZDIgfSwKKwl7IDB4MDE4NmI0MzgsIDB4ZmU1NmM5ODIsIDB4MDA4NjkyMzQsIDB4MGNmMjcwNDgsIDB4ZmFhOTdmY2EgfSwKKwl7IDB4MDFhZGYzNTgsIDB4ZmUyMWY1ZmUsIDB4MDA5OTk4NDIsIDB4MGNlMDUxYzIsIDB4ZmFiNjJjYTUgfSwKKwl7IDB4MDFkOTQ5ZmEsIDB4ZmRlNmUyODcsIDB4MDBhZjBkOGQsIDB4MGNjZDhiNGEsIDB4ZmFjMzNhYTcgfSwKKwl7IDB4MDIwOTI2NjksIDB4ZmRhNGQ4YmYsIDB4MDBjNzNkNGMsIDB4MGNiYTE4ODQsIDB4ZmFkMGFiMDcgfSwKKwl7IDB4MDIzZTAyNjgsIDB4ZmQ1YjBlNGEsIDB4MDBlMjdiNTQsIDB4MGNhNWY1MDksIDB4ZmFkZTdlZjIgfSwKKwl7IDB4MDI3ODY0NWMsIDB4ZmQwOGEyYjAsIDB4MDEwMTI1MDksIDB4MGM5MTFjNjMsIDB4ZmFlY2I3ODggfSwKKwl7IDB4MDJiOGUwOTEsIDB4ZmNhYzlkMWEsIDB4MDEyM2EyNjIsIDB4MGM3YjhhMTQsIDB4ZmFmYjU1ZGYgfSwKKwl7IDB4MDMwMDFhOWEsIDB4ZmM0NWU5Y2UsIDB4MDE0YTY3MDksIDB4MGM2NTM5OGYsIDB4ZmIwYTVhZmYgfSwKKwl7IDB4MDM0ZWM2ZDcsIDB4ZmJkMzU3NmIsIDB4MDE3NWYzOTcsIDB4MGM0ZTI2NDMsIDB4ZmIxOWM3ZTQgfSwKKwl7IDB4MDNhNWFjMTUsIDB4ZmI1MzkzZWUsIDB4MDFhNmQ2ZWQsIDB4MGMzNjRiOTQsIDB4ZmIyOTlkN2MgfSwKKwl7IDB4MDQwNWE1NjIsIDB4ZmFjNTI5NjgsIDB4MDFkZGFmYWUsIDB4MGMxZGE0ZTIsIDB4ZmIzOWRjYTUgfSwKKwl7IDB4MDQ2ZmEzZmUsIDB4ZmEyNjdhNjYsIDB4MDIxYjJkZGQsIDB4MGMwNDJkOGQsIDB4ZmI0YTg2MzEgfSwKKwl7IDB4MDRlNGIxN2YsIDB4Zjk3NWJlMGYsIDB4MDI2MDE0OWYsIDB4MGJlOWUwZjIsIDB4ZmI1YjlhZTAgfSwKKwl7IDB4MDU2NWYyMjAsIDB4ZjhiMGZiZTUsIDB4MDJhZDNjMjksIDB4MGJjZWJhNzMsIDB4ZmI2ZDFiNjAgfSwKKwl7IDB4MDVmNGE3NDUsIDB4ZjdkNjA3MjIsIDB4MDMwMzkzZDQsIDB4MGJiMmI1NzgsIDB4ZmI3ZjA4NGQgfSwKKwl7IDB4MDY5MjMyMzYsIDB4ZjZlMjc5YmQsIDB4MDM2NDI0NjUsIDB4MGI5NWNkNzUsIDB4ZmI5MTYyMzMgfSwKKwl7IDB4MDc0MDE3MTMsIDB4ZjVkM2FlZjksIDB4MDNkMDEyODMsIDB4MGI3N2ZkZWQsIDB4ZmJhNDI5ODQgfSwKKwl7IDB4MDgwMDAwMDAsIDB4ZjRhNmJkODgsIDB4MDQ0OGExNjEsIDB4MGI1OTQyNzgsIDB4ZmJiNzVlOWYgfSwKKwl7IDB4MDhkM2MwOTcsIDB4ZjM1ODcxMzEsIDB4MDRjZjM1YTQsIDB4MGIzOTk2YzksIDB4ZmJjYjAxY2IgfSwKKwl7IDB4MDliZDU5YTIsIDB4ZjFlNTQzZjksIDB4MDU2NTU4ODAsIDB4MGIxOGY2YjIsIDB4ZmJkZjEzMzMgfSwKKwl7IDB4MGFiZWZkMGYsIDB4ZjA0OTU2Y2EsIDB4MDYwY2JiMTIsIDB4MGFmNzVlMmMsIDB4ZmJmMzkyZTggfSwKKwl7IDB4MGJkYjEyM2UsIDB4ZWU4MDY5ODQsIDB4MDZjNzM5ZmUsIDB4MGFkNGM5NjIsIDB4ZmMwODgwZGQgfSwKKwl7IDB4MGQxNDNhOTQsIDB4ZWM4NWQyODcsIDB4MDc5NmUxNTAsIDB4MGFiMTM0YjAsIDB4ZmMxZGRjZTUgfSwKKwl7IDB4MGU2ZDU2NjQsIDB4ZWE1NDc1OTgsIDB4MDg3ZGYwYTAsIDB4MGE4YzljYjYsIDB4ZmMzM2E2YWQgfSwKKwl7IDB4MGZlOThhMmEsIDB4ZTdlNmJhMzUsIDB4MDk3ZWRmODMsIDB4MGE2NmZlNWIsIDB4ZmM0OWRkYzIgfSwKKwl7IDB4MTE4YzQ0MjEsIDB4ZTUzNjgxM2EsIDB4MGE5YzYyNDgsIDB4MGE0MDU2ZDcsIDB4ZmM2MDgxODUgfSwKKwl7IDB4MTM1OTQyMmUsIDB4ZTIzZDE5ZWIsIDB4MGJkOTZlZmIsIDB4MGExOGEzYmYsIDB4ZmM3NzkxMmMgfSwKKwl7IDB4MTU1NDk4MmIsIDB4ZGVmMzM2NDUsIDB4MGQzOTQyYmQsIDB4MDllZmUzMTIsIDB4ZmM4ZjBiYzEgfSwKKwl7IDB4MTc4MmI2OGEsIDB4ZGI1MGRlYjEsIDB4MGViZjY3NmQsIDB4MDljNjEzM2YsIDB4ZmNhNmYwMTkgfSwKKwl7IDB4MTllODcxNWQsIDB4ZDc0ZDY0ZmQsIDB4MTA2ZmI5OTksIDB4MDk5YjMzMzcsIDB4ZmNiZjNjZDYgfSwKKwl7IDB4MWM4YjA3YjgsIDB4ZDJkZjU2YWIsIDB4MTI0ZTZlYzgsIDB4MDk2ZjQyNzQsIDB4ZmNkN2YwNjAgfSwKKwl7IDB4MWY3MDJiNmQsIDB4Y2RmYzZlOTIsIDB4MTQ2MDFjMTAsIDB4MDk0MjQxMGIsIDB4ZmNmMTA4ZTUgfSwKKwl7IDB4MjI5ZTA5MzMsIDB4Yzg5OTg1Y2QsIDB4MTZhOWJjZmEsIDB4MDkxNDJmYjUsIDB4ZmQwYTg0NTEgfSwKKwl7IDB4MjYxYjUxMTgsIDB4YzJhYTg0MDksIDB4MTkzMGJhYjYsIDB4MDhlNTBmZGMsIDB4ZmQyNDYwNGQgfSwKKwl7IDB4MjllZjNmNWQsIDB4YmMyMjRmMjgsIDB4MWJmYWYzOTYsIDB4MDhiNGUzYWEsIDB4ZmQzZTlhM2IgfSwKKwl7IDB4MmUyMWE1OWIsIDB4YjRmMmJhNDYsIDB4MWYwZWMyZDYsIDB4MDg4M2FlMTUsIDB4ZmQ1OTJmMzMgfSwKKwl7IDB4MzJiYWY0NGIsIDB4YWQwYzc0MjksIDB4MjI3MzA4YTMsIDB4MDg1MTcyZWIsIDB4ZmQ3NDFiZmQgfSwKKwl7IDB4MzdjNDQ0OGIsIDB4YTQ1ZWY1MWQsIDB4MjYyZjMyNjcsIDB4MDgxZTM2ZGMsIDB4ZmQ4ZjVkMTQgfQorfTsKKworCitzdGF0aWMgdm9pZCBzZXRfYmFzcyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBpbnQgbCwgaW50IHIpCit7CisJaW50IGk7CisKKwlsID0gKGwgKiA0MCArIDUwKSAvIDEwMDsKKwlyID0gKHIgKiA0MCArIDUwKSAvIDEwMDsKKworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCAoY2FyZC0+aXNfYXVkaWd5ID8gQV9HUFJfQkFTRSA6IEdQUl9CQVNFKSArIGNhcmQtPm1nci5jdHJsX2dwcltTT1VORF9NSVhFUl9CQVNTXVswXSArIGksIDAsIGJhc3NfdGFibGVbbF1baV0pOworfQorCitzdGF0aWMgdm9pZCBzZXRfdHJlYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIGludCBsLCBpbnQgcikKK3sKKwlpbnQgaTsKKworCWwgPSAobCAqIDQwICsgNTApIC8gMTAwOworCXIgPSAociAqIDQwICsgNTApIC8gMTAwOworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIChjYXJkLT5pc19hdWRpZ3kgPyBBX0dQUl9CQVNFIDogR1BSX0JBU0UpICsgY2FyZC0+bWdyLmN0cmxfZ3ByW1NPVU5EX01JWEVSX1RSRUJMRV1bMF0gKyBpICwgMCwgdHJlYmxlX3RhYmxlW2xdW2ldKTsKK30KKworY29uc3QgY2hhciB2b2x1bWVfcGFyYW1zW1NPVU5EX01JWEVSX05SREVWSUNFU109IHsKKy8qIFVzZWQgYnkgdGhlIGFjOTcgZHJpdmVyICovCisJW1NPVU5EX01JWEVSX1ZPTFVNRV0JPQlWT0xfNkJJVCwKKwlbU09VTkRfTUlYRVJfQkFTU10JPQlWT0xfNEJJVCwKKwlbU09VTkRfTUlYRVJfVFJFQkxFXQk9CVZPTF80QklULAorCVtTT1VORF9NSVhFUl9QQ01dCT0JVk9MXzVCSVQsCisJW1NPVU5EX01JWEVSX1NQRUFLRVJdCT0JVk9MXzRCSVQsCisJW1NPVU5EX01JWEVSX0xJTkVdCT0JVk9MXzVCSVQsCisJW1NPVU5EX01JWEVSX01JQ10JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfQ0RdCT0JVk9MXzVCSVQsCisJW1NPVU5EX01JWEVSX0FMVFBDTV0JPQlWT0xfNkJJVCwKKwlbU09VTkRfTUlYRVJfSUdBSU5dCT0JVk9MXzRCSVQsCisJW1NPVU5EX01JWEVSX0xJTkUxXQk9CVZPTF81QklULAorCVtTT1VORF9NSVhFUl9QSE9ORUlOXQk9IAlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfUEhPTkVPVVRdCT0gCVZPTF82QklULAorCVtTT1VORF9NSVhFUl9WSURFT10JPQlWT0xfNUJJVCwKKy8qIE5vdCB1c2VkIGJ5IHRoZSBhYzk3IGRyaXZlciAqLworCVtTT1VORF9NSVhFUl9TWU5USF0JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfSU1JWF0JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfUkVDTEVWXQk9CVZPTF81QklULAorCVtTT1VORF9NSVhFUl9PR0FJTl0JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfTElORTJdCT0JVk9MXzVCSVQsCisJW1NPVU5EX01JWEVSX0xJTkUzXQk9CVZPTF81QklULAorCVtTT1VORF9NSVhFUl9ESUdJVEFMMV0JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfRElHSVRBTDJdCT0JVk9MXzVCSVQsCisJW1NPVU5EX01JWEVSX0RJR0lUQUwzXQk9CVZPTF81QklULAorCVtTT1VORF9NSVhFUl9SQURJT10JPQlWT0xfNUJJVCwKKwlbU09VTkRfTUlYRVJfTU9OSVRPUl0JPQlWT0xfNUJJVAorfTsKKworLyogTWl4ZXIgZmlsZSBvcGVyYXRpb25zICovCitzdGF0aWMgaW50IGVtdTEwazFfcHJpdmF0ZV9taXhlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCAqY3RsOworCXN0cnVjdCBkc3BfcGF0Y2ggKnBhdGNoOworCXUzMiBzaXplLCBwYWdlOworCWludCBhZGRyLCBzaXplX3JlZywgaSwgcmV0OworCXVuc2lnbmVkIGludCBpZCwgY2g7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMzoKKworCQljdGwgPSAoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwgKikga21hbGxvYyhzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGN0bCA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGN0bCwgYXJncCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpIHsKKwkJCWtmcmVlKGN0bCk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJldCA9IDA7CisJCXN3aXRjaCAoY3RsLT5jbWQpIHsKKyNpZmRlZiBEQkdFTVUKKwkJY2FzZSBDTURfV1JJVEVGTjA6CisJCQllbXUxMGsxX3dyaXRlZm4wXzIoY2FyZCwgY3RsLT52YWxbMF0sIGN0bC0+dmFsWzFdLCBjdGwtPnZhbFsyXSk7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIENNRF9XUklURVBUUjoKKyNpZmRlZiBEQkdFTVUKKwkJCWlmIChjdGwtPnZhbFsxXSA+PSAweDQwIHx8IGN0bC0+dmFsWzBdID49IDB4MTAwMCkgeworI2Vsc2UKKwkJCWlmIChjdGwtPnZhbFsxXSA+PSAweDQwIHx8IGN0bC0+dmFsWzBdID49IDB4MTAwMCB8fCAoKGN0bC0+dmFsWzBdIDwgMHgxMDAgKSAmJgorCQkgICAgLy9BbnkgcmVnaXN0ZXIgYWxsb3dlZCByYXcgYWNjZXNzIGdvZXMgaGVyZToKKwkJCQkgICAgIChjdGwtPnZhbFswXSAhPSBBX1NQRElGX1NBTVBMRVJBVEUpICYmIChjdGwtPnZhbFswXSAhPSBBX0RCRykKKwkJCSkKKwkJCQkpIHsKKyNlbmRpZgorCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgY3RsLT52YWxbMF0sIGN0bC0+dmFsWzFdLCBjdGwtPnZhbFsyXSk7CisJCQlicmVhazsKKworCQljYXNlIENNRF9SRUFERk4wOgorCQkJY3RsLT52YWxbMl0gPSBlbXUxMGsxX3JlYWRmbjAoY2FyZCwgY3RsLT52YWxbMF0pOworCisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCisJCQkJcmV0ID0gLUVGQVVMVDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfUkVBRFBUUjoKKwkJCWlmIChjdGwtPnZhbFsxXSA+PSAweDQwIHx8IChjdGwtPnZhbFswXSAmIDB4N2ZmKSA+IDB4ZmYpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoKGN0bC0+dmFsWzBdICYgMHg3ZmYpID4gMHgzZikKKwkJCQljdGwtPnZhbFsxXSA9IDB4MDA7CisKKwkJCWN0bC0+dmFsWzJdID0gc2JsaXZlX3JlYWRwdHIoY2FyZCwgY3RsLT52YWxbMF0sIGN0bC0+dmFsWzFdKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQorCQkJCXJldCA9IC1FRkFVTFQ7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX1NFVFJFQ1NSQzoKKwkJCXN3aXRjaCAoY3RsLT52YWxbMF0pIHsKKwkJCWNhc2UgV0FWRVJFQ09SRF9BQzk3OgorCQkJCWlmIChjYXJkLT5pc19hcHMpIHsKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJY2FyZC0+d2F2ZWluLnJlY3NyYyA9IFdBVkVSRUNPUkRfQUM5NzsKKwkJCQlicmVhazsKKworCQkJY2FzZSBXQVZFUkVDT1JEX01JQzoKKwkJCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9NSUM7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgV0FWRVJFQ09SRF9GWDoKKwkJCQljYXJkLT53YXZlaW4ucmVjc3JjID0gV0FWRVJFQ09SRF9GWDsKKwkJCQljYXJkLT53YXZlaW4uZnh3YyA9IGN0bC0+dmFsWzFdICYgMHhmZmZmOworCisJCQkJaWYgKCFjYXJkLT53YXZlaW4uZnh3YykKKwkJCQkJcmV0ID0gLUVJTlZBTDsKKworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENNRF9HRVRSRUNTUkM6CisJCQljdGwtPnZhbFswXSA9IGNhcmQtPndhdmVpbi5yZWNzcmM7CisJCQljdGwtPnZhbFsxXSA9IGNhcmQtPndhdmVpbi5meHdjOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQorCQkJCXJldCA9IC1FRkFVTFQ7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX0dFVFZPSUNFUEFSQU06CisJCQljdGwtPnZhbFswXSA9IGNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzBdOworCQkJY3RsLT52YWxbMV0gPSBjYXJkLT53YXZlb3V0LnNlbmRfZGNiYVswXTsKKworCQkJY3RsLT52YWxbMl0gPSBjYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1sxXTsKKwkJCWN0bC0+dmFsWzNdID0gY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMV07CisKKwkJCWN0bC0+dmFsWzRdID0gY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMl07CisJCQljdGwtPnZhbFs1XSA9IGNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzJdOworCisJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIGN0bCwgc2l6ZW9mKHN0cnVjdCBtaXhlcl9wcml2YXRlX2lvY3RsKSkpCisJCQkJcmV0ID0gLUVGQVVMVDsKKworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfU0VUVk9JQ0VQQVJBTToKKwkJCWNhcmQtPndhdmVvdXQuc2VuZF9yb3V0aW5nWzBdID0gY3RsLT52YWxbMF07CisJCQljYXJkLT53YXZlb3V0LnNlbmRfZGNiYVswXSA9IGN0bC0+dmFsWzFdOworCisJCQljYXJkLT53YXZlb3V0LnNlbmRfcm91dGluZ1sxXSA9IGN0bC0+dmFsWzJdOworCQkJY2FyZC0+d2F2ZW91dC5zZW5kX2RjYmFbMV0gPSBjdGwtPnZhbFszXTsKKworCQkJY2FyZC0+d2F2ZW91dC5zZW5kX3JvdXRpbmdbMl0gPSBjdGwtPnZhbFs0XTsKKwkJCWNhcmQtPndhdmVvdXQuc2VuZF9kY2JhWzJdID0gY3RsLT52YWxbNV07CisKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBDTURfU0VUTUNIX0ZYOgorCQkJY2FyZC0+bWNoYW5uZWxfZnggPSBjdGwtPnZhbFswXSAmIDB4MDAwZjsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBDTURfR0VUUEFUQ0g6CisJCQlpZiAoY3RsLT52YWxbMF0gPT0gMCkgeworCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNhcmQtPm1nci5ycGF0Y2gsIHNpemVvZihzdHJ1Y3QgZHNwX3JwYXRjaCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJcmV0ID0gLUVGQVVMVDsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKChjdGwtPnZhbFswXSAtIDEpIC8gUEFUQ0hFU19QRVJfUEFHRSA+PSBjYXJkLT5tZ3IuY3VycmVudF9wYWdlcykgeworCQkJCQlyZXQgPSAtRUlOVkFMOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlpZiAoY29weV90b191c2VyKGFyZ3AsIFBBVENIKCZjYXJkLT5tZ3IsIGN0bC0+dmFsWzBdIC0gMSksIHNpemVvZihzdHJ1Y3QgZHNwX3BhdGNoKSkpCisJCQkJCXJldCA9IC1FRkFVTFQ7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX0dFVEdQUjoKKwkJCWlkID0gY3RsLT52YWxbMF07CisKKwkJCWlmIChpZCA+IE5VTV9HUFJTKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2FyZC0+bWdyLmdwcltpZF0sIHNpemVvZihzdHJ1Y3QgZHNwX2dwcikpKQorCQkJCXJldCA9IC1FRkFVTFQ7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX0dFVENUTEdQUjoKKwkJCWFkZHIgPSBlbXUxMGsxX2ZpbmRfY29udHJvbF9ncHIoJmNhcmQtPm1nciwgKGNoYXIgKikgY3RsLT52YWwsICYoKGNoYXIgKikgY3RsLT52YWwpW1BBVENIX05BTUVfU0laRV0pOworCQkJY3RsLT52YWxbMF0gPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBhZGRyLCAwKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQorCQkJCXJldCA9IC1FRkFVTFQ7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX1NFVFBBVENIOgorCQkJaWYgKGN0bC0+dmFsWzBdID09IDApCisJCQkJbWVtY3B5KCZjYXJkLT5tZ3IucnBhdGNoLCAmY3RsLT52YWxbMV0sIHNpemVvZihzdHJ1Y3QgZHNwX3JwYXRjaCkpOworCQkJZWxzZSB7CisJCQkJcGFnZSA9IChjdGwtPnZhbFswXSAtIDEpIC8gUEFUQ0hFU19QRVJfUEFHRTsKKwkJCQlpZiAocGFnZSA+IE1BWF9QQVRDSEVTX1BBR0VTKSB7CisJCQkJCXJldCA9IC1FSU5WQUw7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCWlmIChwYWdlID49IGNhcmQtPm1nci5jdXJyZW50X3BhZ2VzKSB7CisJCQkJCWZvciAoaSA9IGNhcmQtPm1nci5jdXJyZW50X3BhZ2VzOyBpIDwgcGFnZSArIDE7IGkrKykgeworCQkJCSAgICAgICAgICAgICAgICBjYXJkLT5tZ3IucGF0Y2hbaV0gPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwkJCQkJCWlmKGNhcmQtPm1nci5wYXRjaFtpXSA9PSBOVUxMKSB7CisJCQkJCQkJY2FyZC0+bWdyLmN1cnJlbnRfcGFnZXMgPSBpOworCQkJCQkJCXJldCA9IC1FTk9NRU07CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQltZW1zZXQoY2FyZC0+bWdyLnBhdGNoW2ldLCAwLCBQQUdFX1NJWkUpOworCQkJCQl9CisJCQkJCWNhcmQtPm1nci5jdXJyZW50X3BhZ2VzID0gcGFnZSArIDE7CisJCQkJfQorCisJCQkJcGF0Y2ggPSBQQVRDSCgmY2FyZC0+bWdyLCBjdGwtPnZhbFswXSAtIDEpOworCisJCQkJbWVtY3B5KHBhdGNoLCAmY3RsLT52YWxbMV0sIHNpemVvZihzdHJ1Y3QgZHNwX3BhdGNoKSk7CisKKwkJCQlpZiAocGF0Y2gtPmNvZGVfc2l6ZSA9PSAwKSB7CisJCQkJCWZvcihpID0gcGFnZSArIDE7IGkgPCBjYXJkLT5tZ3IuY3VycmVudF9wYWdlczsgaSsrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBjYXJkLT5tZ3IucGF0Y2hbaV0pOworCisJCQkJCWNhcmQtPm1nci5jdXJyZW50X3BhZ2VzID0gcGFnZSArIDE7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfU0VUR1BSOgorCQkJaWYgKGN0bC0+dmFsWzBdID4gTlVNX0dQUlMpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQltZW1jcHkoJmNhcmQtPm1nci5ncHJbY3RsLT52YWxbMF1dLCAmY3RsLT52YWxbMV0sIHNpemVvZihzdHJ1Y3QgZHNwX2dwcikpOworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfU0VUQ1RMR1BSOgorCQkJYWRkciA9IGVtdTEwazFfZmluZF9jb250cm9sX2dwcigmY2FyZC0+bWdyLCAoY2hhciAqKSBjdGwtPnZhbCwgKGNoYXIgKikgY3RsLT52YWwgKyBQQVRDSF9OQU1FX1NJWkUpOworCQkJZW11MTBrMV9zZXRfY29udHJvbF9ncHIoY2FyZCwgYWRkciwgKigoczMyICopKChjaGFyICopIGN0bC0+dmFsICsgMiAqIFBBVENIX05BTUVfU0laRSkpLCAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX1NFVEdQT1VUOgorCQkJaWYgKCAoKGN0bC0+dmFsWzBdID4gMikgJiYgKCFjYXJkLT5pc19hdWRpZ3kpKQorCQkJICAgICB8fCAoY3RsLT52YWxbMF0gPiAxNSkgfHwgY3RsLT52YWxbMV0gPiAxKSB7CisJCQkJcmV0PSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoY2FyZC0+aXNfYXVkaWd5KQorCQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgKDEgPDwgMjQpIHwgKChjdGwtPnZhbFswXSkgPDwgMTYpIHwgQV9JT0NGRywgY3RsLT52YWxbMV0pOworCQkJZWxzZQorCQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgKDEgPDwgMjQpIHwgKCgoY3RsLT52YWxbMF0pICsgMTApIDw8IDE2KSB8IEhDRkcsIGN0bC0+dmFsWzFdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX0dFVEdQUjJPU1M6CisJCQlpZCA9IGN0bC0+dmFsWzBdOworCQkJY2ggPSBjdGwtPnZhbFsxXTsKKworCQkJaWYgKGlkID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCBjaCA+PSAyKSB7CisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJY3RsLT52YWxbMl0gPSBjYXJkLT5tZ3IuY3RybF9ncHJbaWRdW2NoXTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBjdGwsIHNpemVvZihzdHJ1Y3QgbWl4ZXJfcHJpdmF0ZV9pb2N0bCkpKQorCQkJCXJldCA9IC1FRkFVTFQ7CisKKwkJCWJyZWFrOworCisJCWNhc2UgQ01EX1NFVEdQUjJPU1M6CisJCQlpZCA9IGN0bC0+dmFsWzBdOworCQkJLyogMCA9PSBsZWZ0LCAxID09IHJpZ2h0ICovCisJCQljaCA9IGN0bC0+dmFsWzFdOworCQkJYWRkciA9IGN0bC0+dmFsWzJdOworCisJCQlpZiAoaWQgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8IGNoID49IDIpIHsKKwkJCQlyZXQgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCisJCQljYXJkLT5tZ3IuY3RybF9ncHJbaWRdW2NoXSA9IGFkZHI7CisKKwkJCWlmIChjYXJkLT5pc19hcHMpCisJCQkJYnJlYWs7CisKKwkJCWlmIChhZGRyID49IDApIHsKKwkJCQl1bnNpZ25lZCBpbnQgc3RhdGUgPSBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtpZF07CisKKwkJCQlpZiAoY2ggPT0gMSkgeworCQkJCQlzdGF0ZSA+Pj0gODsKKwkJCQkJY2FyZC0+YWM5Ny0+c3RlcmVvX21peGVycyB8PSAoMSA8PCBpZCk7CisJCQkJfQorCisJCQkJY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVycyB8PSAoMSA8PCBpZCk7CisKKwkJCQlpZiAoaWQgPT0gU09VTkRfTUlYRVJfVFJFQkxFKSB7CisJCQkJCXNldF90cmVibGUoY2FyZCwgY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaWRdICYgMHhmZiwgKGNhcmQtPmFjOTctPm1peGVyX3N0YXRlW2lkXSA+PiA4KSAmIDB4ZmYpOworCQkJCX0gZWxzZSBpZiAoaWQgPT0gU09VTkRfTUlYRVJfQkFTUykgeworCQkJCQlzZXRfYmFzcyhjYXJkLCBjYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtpZF0gJiAweGZmLCAoY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaWRdID4+IDgpICYgMHhmZik7CisJCQkJfSBlbHNlCisJCQkJCWVtdTEwazFfc2V0X3ZvbHVtZV9ncHIoY2FyZCwgYWRkciwgc3RhdGUgJiAweGZmLAorCQkJCQkJCSAgICAgICB2b2x1bWVfcGFyYW1zW2lkXSk7CisJCQl9IGVsc2UgeworCQkJCWNhcmQtPmFjOTctPnN0ZXJlb19taXhlcnMgJj0gfigxIDw8IGlkKTsKKwkJCQljYXJkLT5hYzk3LT5zdGVyZW9fbWl4ZXJzIHw9IGNhcmQtPmFjOTdfc3RlcmVvX21peGVyczsKKworCQkJCWlmIChjaCA9PSAwKSB7CisJCQkJCWNhcmQtPmFjOTctPnN1cHBvcnRlZF9taXhlcnMgJj0gfigxIDw8IGlkKTsKKwkJCQkJY2FyZC0+YWM5Ny0+c3VwcG9ydGVkX21peGVycyB8PSBjYXJkLT5hYzk3X3N1cHBvcnRlZF9taXhlcnM7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfU0VUUEFTU1RIUk9VR0g6CisJCQljYXJkLT5wdC5zZWxlY3RlZCA9IGN0bC0+dmFsWzBdID8gMSA6IDA7CisJCQlpZiAoY2FyZC0+cHQuc3RhdGUgIT0gUFRfU1RBVEVfSU5BQ1RJVkUpCisJCQkJYnJlYWs7CisKKwkJCWNhcmQtPnB0LnNwY3NfdG9fdXNlID0gY3RsLT52YWxbMF0gJiAweDA3OworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfUFJJVkFURTNfVkVSU0lPTjoKKwkJCWN0bC0+dmFsWzBdID0gUFJJVkFURTNfVkVSU0lPTjsJLy9wcml2YXRlMyB2ZXJzaW9uCisJCQljdGwtPnZhbFsxXSA9IE1BSk9SX1ZFUjsJLy9tYWpvciBkcml2ZXIgdmVyc2lvbgorCQkJY3RsLT52YWxbMl0gPSBNSU5PUl9WRVI7CS8vbWlub3IgZHJpdmVyIHZlcnNpb24KKwkJCWN0bC0+dmFsWzNdID0gY2FyZC0+aXNfYXVkaWd5OwkvLzE9Y2FyZCBpcyBhdWRpZ3kKKworCQkJaWYgKGNhcmQtPmlzX2F1ZGlneSkKKwkJCQljdGwtPnZhbFs0XT1lbXUxMGsxX3JlYWRmbjAoY2FyZCwgMHgxOCk7CisKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgY3RsLCBzaXplb2Yoc3RydWN0IG1peGVyX3ByaXZhdGVfaW9jdGwpKSkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisKKwkJY2FzZSBDTURfQUM5N19CT09TVDoKKwkJCWlmIChjdGwtPnZhbFswXSkKKwkJCQllbXUxMGsxX2FjOTdfd3JpdGUoY2FyZC0+YWM5NywgMHgxOCwgMHgwKTsJCisJCQllbHNlCisJCQkJZW11MTBrMV9hYzk3X3dyaXRlKGNhcmQtPmFjOTcsIDB4MTgsIDB4MDgwOCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWtmcmVlKGN0bCk7CisJCXJldHVybiByZXQ7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFNDoKKworCQlpZiAoY29weV9mcm9tX3VzZXIoJnNpemUsIGFyZ3AsIHNpemVvZihzaXplKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlEUEQoMiwgIkV4dGVybmFsIHRyYW0gc2l6ZSAlI3hcbiIsIHNpemUpOworCisJCWlmIChzaXplID4gMHgxZmZmZmYpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlzaXplX3JlZyA9IDA7CisKKwkJaWYgKHNpemUgIT0gMCkgeworCQkJc2l6ZSA9IChzaXplIC0gMSkgPj4gMTQ7CisKKwkJCXdoaWxlIChzaXplKSB7CisJCQkJc2l6ZSA+Pj0gMTsKKwkJCQlzaXplX3JlZysrOworCQkJfQorCisJCQlzaXplID0gMHg0MDAwIDw8IHNpemVfcmVnOworCQl9CisKKwkJRFBEKDIsICJFeHRlcm5hbCB0cmFtIHNpemUgJSN4ICUjeFxuIiwgc2l6ZSwgc2l6ZV9yZWcpOworCisJCWlmIChzaXplICE9IGNhcmQtPnRhbmttZW0uc2l6ZSkgeworCQkJaWYgKGNhcmQtPnRhbmttZW0uc2l6ZSA+IDApIHsKKwkJCQllbXUxMGsxX3dyaXRlZm4wKGNhcmQsIEhDRkdfTE9DS1RBTktDQUNIRSwgMSk7CisKKwkJCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIDAsIFRDQiwgMCwgVENCUywgMCwgVEFHTElTVF9FTkQpOworCisJCQkJcGNpX2ZyZWVfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBjYXJkLT50YW5rbWVtLnNpemUsIGNhcmQtPnRhbmttZW0uYWRkciwgY2FyZC0+dGFua21lbS5kbWFfaGFuZGxlKTsKKworCQkJCWNhcmQtPnRhbmttZW0uc2l6ZSA9IDA7CisJCQl9CisKKwkJCWlmIChzaXplICE9IDApIHsKKwkJCQljYXJkLT50YW5rbWVtLmFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBzaXplLCAmY2FyZC0+dGFua21lbS5kbWFfaGFuZGxlKTsKKwkJCQlpZiAoY2FyZC0+dGFua21lbS5hZGRyID09IE5VTEwpCisJCQkJCXJldHVybiAtRU5PTUVNOworCisJCQkJY2FyZC0+dGFua21lbS5zaXplID0gc2l6ZTsKKworCQkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgMCwgVENCLCAodTMyKSBjYXJkLT50YW5rbWVtLmRtYV9oYW5kbGUsIFRDQlMsKHUzMikgc2l6ZV9yZWcsIFRBR0xJU1RfRU5EKTsKKworCQkJCWVtdTEwazFfd3JpdGVmbjAoY2FyZCwgSENGR19MT0NLVEFOS0NBQ0hFLCAwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBlbXUxMGsxX2RzcF9taXhlcihzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgb3NzX21peGVyLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl1bnNpZ25lZCBpbnQgbGVmdCwgcmlnaHQ7CisJaW50IHZhbDsKKwlpbnQgc2NhbGU7CisKKwljYXJkLT5hYzk3LT5tb2RjbnQrKzsKKworCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKiBjbGVhbnNlIGlucHV0IGEgbGl0dGxlICovCisJcmlnaHQgPSAoKHZhbCA+PiA4KSAgJiAweGZmKTsKKwlsZWZ0ID0gKHZhbCAgJiAweGZmKTsKKworCWlmIChyaWdodCA+IDEwMCkgcmlnaHQgPSAxMDA7CisJaWYgKGxlZnQgPiAxMDApIGxlZnQgPSAxMDA7CisKKwljYXJkLT5hYzk3LT5taXhlcl9zdGF0ZVtvc3NfbWl4ZXJdID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsKKwlpZiAob3NzX21peGVyID09IFNPVU5EX01JWEVSX1RSRUJMRSkgeworCQlzZXRfdHJlYmxlKGNhcmQsIGxlZnQsIHJpZ2h0KTsKKwkJcmV0dXJuIDA7CisJfSBpZiAob3NzX21peGVyID09IFNPVU5EX01JWEVSX0JBU1MpIHsKKwkJc2V0X2Jhc3MoY2FyZCwgbGVmdCwgcmlnaHQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAob3NzX21peGVyID09IFNPVU5EX01JWEVSX1ZPTFVNRSkKKwkJc2NhbGUgPSAxIDw8IGNhcmQtPmFjOTctPmJpdF9yZXNvbHV0aW9uOworCWVsc2UKKwkJc2NhbGUgPSB2b2x1bWVfcGFyYW1zW29zc19taXhlcl07CisKKwllbXUxMGsxX3NldF92b2x1bWVfZ3ByKGNhcmQsIGNhcmQtPm1nci5jdHJsX2dwcltvc3NfbWl4ZXJdWzBdLCBsZWZ0LCBzY2FsZSk7CisJZW11MTBrMV9zZXRfdm9sdW1lX2dwcihjYXJkLCBjYXJkLT5tZ3IuY3RybF9ncHJbb3NzX21peGVyXVsxXSwgcmlnaHQsIHNjYWxlKTsKKworCWlmIChjYXJkLT5hYzk3X3N1cHBvcnRlZF9taXhlcnMgJiAoMSA8PCBvc3NfbWl4ZXIpKQorCQljYXJkLT5hYzk3LT53cml0ZV9taXhlcihjYXJkLT5hYzk3LCBvc3NfbWl4ZXIsIGxlZnQsIHJpZ2h0KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVtdTEwazFfbWl4ZXJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByZXQ7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBpbnQgb3NzX21peGVyID0gX0lPQ19OUihjbWQpOworCQorCXJldCA9IC1FSU5WQUw7CisJaWYgKCFjYXJkLT5pc19hcHMpIHsKKwkJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCQltaXhlcl9pbmZvIGluZm87CisKKwkJCXN0cmxjcHkoaW5mby5pZCwgY2FyZC0+YWM5Ny0+bmFtZSwgc2l6ZW9mKGluZm8uaWQpKTsKKworCQkJaWYgKGNhcmQtPmlzX2F1ZGlneSkKKwkJCQlzdHJsY3B5KGluZm8ubmFtZSwgIkF1ZGlneSAtIEVtdTEwazEiLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCQllbHNlCisJCQkJc3RybGNweShpbmZvLm5hbWUsICJDcmVhdGl2ZSBTQkxpdmUgLSBFbXUxMGsxIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQkJCQorCQkJaW5mby5tb2RpZnlfY291bnRlciA9IGNhcmQtPmFjOTctPm1vZGNudDsKKworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICgoX1NJT0NfRElSKGNtZCkgPT0gKF9TSU9DX1dSSVRFfF9TSU9DX1JFQUQpKSAmJiBvc3NfbWl4ZXIgPD0gU09VTkRfTUlYRVJfTlJERVZJQ0VTKQorCQkJcmV0ID0gZW11MTBrMV9kc3BfbWl4ZXIoY2FyZCwgb3NzX21peGVyLCBhcmcpOworCQllbHNlCisJCQlyZXQgPSBjYXJkLT5hYzk3LT5taXhlcl9pb2N0bChjYXJkLT5hYzk3LCBjbWQsIGFyZyk7CisJfQorCQorCWlmIChyZXQgPCAwKQorCQlyZXQgPSBlbXUxMGsxX3ByaXZhdGVfbWl4ZXIoY2FyZCwgY21kLCBhcmcpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlbXUxMGsxX21peGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCURQRig0LCAiZW11MTBrMV9taXhlcl9vcGVuKClcbiIpOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmVtdTEwazFfZGV2cykgeworCQljYXJkID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdTEwazFfY2FyZCwgbGlzdCk7CisKKwkJaWYgKGNhcmQtPmFjOTctPmRldl9taXhlciA9PSBtaW5vcikKKwkJCWdvdG8gbWF0Y2g7CisJfQorCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICAgIG1hdGNoOgorCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQ7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZW11MTBrMV9taXhlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCURQRig0LCAiZW11MTBrMV9taXhlcl9yZWxlYXNlKClcbiIpOworCXJldHVybiAwOworfQorCitzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVtdTEwazFfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IGVtdTEwazFfbWl4ZXJfaW9jdGwsCisJLm9wZW4JCT0gZW11MTBrMV9taXhlcl9vcGVuLAorCS5yZWxlYXNlCT0gZW11MTBrMV9taXhlcl9yZWxlYXNlLAorfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmMgYi9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwOTRiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5jCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBwYXNzdGhyb3VnaC5jIC0tIEVtdTEwazEgZGlnaXRhbCBwYXNzdGhyb3VnaAorICogICAgIENvcHlyaWdodCAoQykgMjAwMSAgSnVoYSBZcmr2bOQgPGp5cmpvbGFAY2MuaHV0LmZpPgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgTWF5IDE1LCAyMDAxCSAgICBKdWhhIFlyavZs5AkgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisgICAgICAgICAgICAgICAgICAgICAgIAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorCisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKyNpbmNsdWRlICJjYXJkd28uaCIKKyNpbmNsdWRlICJjYXJkd2kuaCIKKyNpbmNsdWRlICJyZWNtZ3IuaCIKKyNpbmNsdWRlICJpcnFtZ3IuaCIKKyNpbmNsdWRlICJhdWRpby5oIgorI2luY2x1ZGUgIjgwMTAuaCIKKworc3RhdGljIHZvaWQgcHRfcHV0c2FtcGxlcyhzdHJ1Y3QgcHRfZGF0YSAqcHQsIHUxNiAqcHRyLCB1MTYgbGVmdCwgdTE2IHJpZ2h0KQoreworCXVuc2lnbmVkIGludCBpZHg7CisKKwlwdHJbcHQtPmNvcHlwdHJdID0gbGVmdDsKKwlpZHggPSBwdC0+Y29weXB0ciArIFBUX1NBTVBMRVMvMjsKKwlpZHggJT0gUFRfU0FNUExFUzsKKwlwdHJbaWR4XSA9IHJpZ2h0OworfQorCitzdGF0aWMgaW5saW5lIGludCBwdF9jYW5fd3JpdGUoc3RydWN0IHB0X2RhdGEgKnB0KQoreworCXJldHVybiBwdC0+YmxvY2tzX2NvcGllZCA8IHB0LT5ibG9ja3NfcGxheWVkICsgODsKK30KKworc3RhdGljIGludCBwdF93YWl0X2Zvcl93cml0ZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlZGV2LCBpbnQgbm9uYmxvY2spCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVkZXYtPmNhcmQ7CisJc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OworCisJaWYgKG5vbmJsb2NrICYmICFwdF9jYW5fd3JpdGUocHQpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwl3aGlsZSAoIXB0X2Nhbl93cml0ZShwdCkgJiYgcHQtPnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKSB7CisJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnB0LT53YWl0KTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwl9CisJaWYgKHB0LT5zdGF0ZSA9PSBQVF9TVEFURV9JTkFDVElWRSkKKwkJcmV0dXJuIC1FQUdBSU47CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHRfcHV0YmxvY2soc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYsIHUxNiAqYmxvY2ssIGludCBub25ibG9jaykKK3sKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCXN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQgPSB3YXZlX2Rldi0+Y2FyZDsKKwlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7CisJdTE2ICpwdHIgPSAodTE2ICopIGNhcmQtPnRhbmttZW0uYWRkcjsKKwlpbnQgaSA9IDAsIHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXIgPSBwdF93YWl0X2Zvcl93cml0ZSh3YXZlX2Rldiwgbm9uYmxvY2spOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIHI7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnB0LmxvY2ssIGZsYWdzKTsKKwl3aGlsZSAoaSA8IFBUX0JMT0NLU0FNUExFUykgeworCQlwdF9wdXRzYW1wbGVzKHB0LCBwdHIsIGJsb2NrWzIqaV0sIGJsb2NrWzIqaSsxXSk7CisJCWlmIChwdC0+Y29weXB0ciA9PSAwKQorCQkJcHQtPmNvcHlwdHIgPSBQVF9TQU1QTEVTOworCQlwdC0+Y29weXB0ci0tOworCQlpKys7CisJfQorCXdvaW5zdC0+dG90YWxfY29waWVkICs9IFBUX0JMT0NLU0laRTsKKwlwdC0+YmxvY2tzX2NvcGllZCsrOworCWlmIChwdC0+YmxvY2tzX2NvcGllZCA+PSA0ICYmIHB0LT5zdGF0ZSAhPSBQVF9TVEFURV9QTEFZSU5HKSB7CisJCURQRigyLCAiYWN0aXZhdGluZyBkaWdpdGFsIHBhc3MtdGhyb3VnaCBwbGF5YmFja1xuIik7CisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBHUFJfQkFTRSArIHB0LT5lbmFibGVfZ3ByLCAwLCAxKTsKKwkJcHQtPnN0YXRlID0gUFRfU1RBVEVfUExBWUlORzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+cHQubG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCitpbnQgZW11MTBrMV9wdF9zZXR1cChzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKK3sKKwl1MzIgYml0czsKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gd2F2ZV9kZXYtPmNhcmQ7CisJc3RydWN0IHB0X2RhdGEgKnB0ID0gJmNhcmQtPnB0OworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlwdC0+b2xkX3NwY3NbaV0gPSBzYmxpdmVfcmVhZHB0cihjYXJkLCBTUENTMCArIGksIDApOworCQlpZiAocHQtPnNwY3NfdG9fdXNlICYgKDEgPDwgaSkpIHsKKwkJCURQRCgyLCAidXNpbmcgUy9QRElGIHBvcnQgJWRcbiIsIGkpOworCQkJYml0cyA9IFNQQ1NfQ0xLQUNDWV8xMDAwUFBNIHwgU1BDU19TQU1QTEVSQVRFXzQ4IHwKKwkJCQlTUENTX0NIQU5ORUxOVU1fTEVGVCB8IFNQQ1NfU09VUkNFTlVNX1VOU1BFQyB8IFNQQ1NfR0VORVJBVElPTlNUQVRVUyB8CisJCQkJMHgwMDAwMTIwMCB8IFNQQ1NfRU1QSEFTSVNfTk9ORSB8IFNQQ1NfQ09QWVJJR0hUOworCQkJaWYgKHB0LT5hYzNkYXRhKQorCQkJCWJpdHMgfD0gU1BDU19OT1RBVURJT0RBVEE7CisJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgU1BDUzAgKyBpLCAwLCBiaXRzKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3NpemVfdCBlbXUxMGsxX3B0X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQpCit7CisJc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqd2F2ZV9kZXYgPSAoc3RydWN0IGVtdTEwazFfd2F2ZWRldmljZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHdhdmVfZGV2LT5jYXJkOworCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZjYXJkLT5wdDsKKwlpbnQgbm9uYmxvY2ssIGksIHIsIGJsb2NrcywgYmxvY2tzX2NvcGllZCwgYnl0ZXNfY29waWVkID0gMDsKKworCURQRCgzLCAiZW11MTBrMV9wdF93cml0ZSgpOiAlZCBieXRlc1xuIiwgY291bnQpOworCQorCW5vbmJsb2NrID0gZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0s7CisJCisJaWYgKGNhcmQtPnRhbmttZW0uc2l6ZSA8IFBUX1NBTVBMRVMqMikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHB0LT5zdGF0ZSA9PSBQVF9TVEFURV9JTkFDVElWRSkgeworCQlEUEYoMiwgImJ1ZnB0ciBpbml0XG4iKTsKKwkJcHQtPnBsYXlwdHIgPSBQVF9TQU1QTEVTLTE7CisJCXB0LT5jb3B5cHRyID0gUFRfSU5JVFBUUjsKKwkJcHQtPmJsb2Nrc19wbGF5ZWQgPSBwdC0+YmxvY2tzX2NvcGllZCA9IDA7CisJCW1lbXNldChjYXJkLT50YW5rbWVtLmFkZHIsIDAsIGNhcmQtPnRhbmttZW0uc2l6ZSk7CisJCXB0LT5zdGF0ZSA9IFBUX1NUQVRFX0FDVElWQVRFRDsKKwkJcHQtPmJ1ZiA9IGttYWxsb2MoUFRfQkxPQ0tTSVpFLCBHRlBfS0VSTkVMKTsKKwkJcHQtPnByZXBlbmRfc2l6ZSA9IDA7CisJCWlmIChwdC0+YnVmID09IE5VTEwpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJZW11MTBrMV9wdF9zZXR1cCh3YXZlX2Rldik7CisJfQorCWlmIChwdC0+cHJlcGVuZF9zaXplKSB7CisJCWludCBuZWVkZWQgPSBQVF9CTE9DS1NJWkUgLSBwdC0+cHJlcGVuZF9zaXplOworCisJCURQRCgzLCAicHJlcGVuZCBzaXplICVkLCBwcmVwZW5kaW5nICVkIGJ5dGVzXG4iLCBwdC0+cHJlcGVuZF9zaXplLCBuZWVkZWQpOworCQlpZiAoY291bnQgPCBuZWVkZWQpIHsKKwkJCWNvcHlfZnJvbV91c2VyKHB0LT5idWYgKyBwdC0+cHJlcGVuZF9zaXplLCBidWZmZXIsIGNvdW50KTsKKwkJCXB0LT5wcmVwZW5kX3NpemUgKz0gY291bnQ7CisJCQlEUEQoMywgInByZXBlbmQgc2l6ZSBub3cgJWRcbiIsIHB0LT5wcmVwZW5kX3NpemUpOworCQkJcmV0dXJuIGNvdW50OworCQl9CisJCWNvcHlfZnJvbV91c2VyKHB0LT5idWYgKyBwdC0+cHJlcGVuZF9zaXplLCBidWZmZXIsIG5lZWRlZCk7CisJCXIgPSBwdF9wdXRibG9jayh3YXZlX2RldiwgKHUxNiAqKSBwdC0+YnVmLCBub25ibG9jayk7CisJCWlmIChyKQorCQkJcmV0dXJuIHI7CisJCWJ5dGVzX2NvcGllZCArPSBuZWVkZWQ7CisJCXB0LT5wcmVwZW5kX3NpemUgPSAwOworCX0KKwlibG9ja3MgPSAoY291bnQtYnl0ZXNfY29waWVkKS9QVF9CTE9DS1NJWkU7CisJYmxvY2tzX2NvcGllZCA9IDA7CisJd2hpbGUgKGJsb2NrcyA+IDApIHsKKwkJdTE2IF9fdXNlciAqYnVmcHRyID0gKHUxNiBfX3VzZXIgKikgYnVmZmVyICsgKGJ5dGVzX2NvcGllZC8yKTsKKwkJY29weV9mcm9tX3VzZXIocHQtPmJ1ZiwgYnVmcHRyLCBQVF9CTE9DS1NJWkUpOworCQlyID0gcHRfcHV0YmxvY2sod2F2ZV9kZXYsICh1MTYgKilwdC0+YnVmLCBub25ibG9jayk7CisJCWlmIChyKSB7CisJCQlpZiAoYnl0ZXNfY29waWVkKQorCQkJCXJldHVybiBieXRlc19jb3BpZWQ7CisJCQllbHNlCisJCQkJcmV0dXJuIHI7CisJCX0KKwkJYnl0ZXNfY29waWVkICs9IFBUX0JMT0NLU0laRTsKKwkJYmxvY2tzLS07CisJCWJsb2Nrc19jb3BpZWQrKzsKKwl9CisJaSA9IGNvdW50IC0gYnl0ZXNfY29waWVkOworCWlmIChpKSB7CisJCXB0LT5wcmVwZW5kX3NpemUgPSBpOworCQljb3B5X2Zyb21fdXNlcihwdC0+YnVmLCBidWZmZXIgKyBieXRlc19jb3BpZWQsIGkpOworCQlieXRlc19jb3BpZWQgKz0gaTsKKwkJRFBEKDMsICJmaWxsaW5nIHByZXBlbmQgYnVmZmVyIHdpdGggJWQgYnl0ZXMiLCBpKTsKKwl9CisJcmV0dXJuIGJ5dGVzX2NvcGllZDsKK30KKwordm9pZCBlbXUxMGsxX3B0X3N0b3Aoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCkKK3sKKwlzdHJ1Y3QgcHRfZGF0YSAqcHQgPSAmY2FyZC0+cHQ7CisJaW50IGk7CisKKwlpZiAocHQtPnN0YXRlICE9IFBUX1NUQVRFX0lOQUNUSVZFKSB7CisJCURQRigyLCAiZGlnaXRhbCBwYXNzLXRocm91Z2ggc3RvcHBlZFxuIik7CisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCAoY2FyZC0+aXNfYXVkaWd5ID8gQV9HUFJfQkFTRSA6IEdQUl9CQVNFKSArIHB0LT5lbmFibGVfZ3ByLCAwLCAwKTsKKwkJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0LT5zcGNzX3RvX3VzZSAmICgxIDw8IGkpKQorCQkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBTUENTMCArIGksIDAsIHB0LT5vbGRfc3Bjc1tpXSk7CisJCX0KKwkJcHQtPnN0YXRlID0gUFRfU1RBVEVfSU5BQ1RJVkU7CisJCWlmKHB0LT5idWYpCisJCQlrZnJlZShwdC0+YnVmKTsKKwl9Cit9CisKK3ZvaWQgZW11MTBrMV9wdF93YXZlb3V0X3VwZGF0ZShzdHJ1Y3QgZW11MTBrMV93YXZlZGV2aWNlICp3YXZlX2RldikKK3sKKwlzdHJ1Y3Qgd29pbnN0ICp3b2luc3QgPSB3YXZlX2Rldi0+d29pbnN0OworCXN0cnVjdCBwdF9kYXRhICpwdCA9ICZ3YXZlX2Rldi0+Y2FyZC0+cHQ7CisJdTMyIHBvczsKKworCWlmIChwdC0+c3RhdGUgPT0gUFRfU1RBVEVfUExBWUlORyAmJiBwdC0+cG9zX2dwciA+PSAwKSB7CisJCXBvcyA9IHNibGl2ZV9yZWFkcHRyKHdhdmVfZGV2LT5jYXJkLCBHUFJfQkFTRSArIHB0LT5wb3NfZ3ByLCAwKTsKKwkJaWYgKHBvcyA+IFBUX0JMT0NLU0FNUExFUykKKwkJCXBvcyA9IFBUX0JMT0NLU0FNUExFUzsKKwkJcG9zID0gNCAqIChQVF9CTE9DS1NBTVBMRVMgLSBwb3MpOworCX0gZWxzZQorCQlwb3MgPSAwOworCXdvaW5zdC0+dG90YWxfcGxheWVkID0gcHQtPmJsb2Nrc19wbGF5ZWQgKiB3b2luc3QtPmJ1ZmZlci5mcmFnbWVudF9zaXplICsgcG9zOworCXdvaW5zdC0+YnVmZmVyLmh3X3BvcyA9IHBvczsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3Bhc3N0aHJvdWdoLmggYi9zb3VuZC9vc3MvZW11MTBrMS9wYXNzdGhyb3VnaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMGNjOTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvcGFzc3Rocm91Z2guaApAQCAtMCwwICsxLDk5IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICBwYXNzdGhyb3VnaC5oIC0tIEVtdTEwazEgZGlnaXRhbCBwYXNzdGhyb3VnaCBoZWFkZXIgZmlsZQorICogICAgIENvcHlyaWdodCAoQykgMjAwMSAgSnVoYSBZcmr2bOQgPGp5cmpvbGFAY2MuaHV0LmZpPgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgTWF5IDE1LCAyMDAxCSAgICBKdWhhIFlyavZs5CAgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX1BBU1NUSFJPVUdIX0gKKyNkZWZpbmUgX1BBU1NUSFJPVUdIX0gKKworI2luY2x1ZGUgImF1ZGlvLmgiCisKKy8qIG51bWJlciBvZiAxNi1iaXQgc3RlcmVvIHNhbXBsZXMgaW4gWFRSQU0gYnVmZmVyICovCisjZGVmaW5lIFBUX1NBTVBMRVMgMHg4MDAwCisjZGVmaW5lIFBUX0JMT0NLU0FNUExFUyAweDQwMAorI2RlZmluZSBQVF9CTE9DS1NJWkUgKFBUX0JMT0NLU0FNUExFUyo0KQorI2RlZmluZSBQVF9CTE9DS1NJWkVfTE9HMiAxMgorI2RlZmluZSBQVF9CTE9DS0NPVU5UIChQVF9TQU1QTEVTL1BUX0JMT0NLU0FNUExFUykKKyNkZWZpbmUgUFRfSU5JVFBUUiAoUFRfU0FNUExFUy8yLTEpCisKKyNkZWZpbmUgUFRfU1RBVEVfSU5BQ1RJVkUgMAorI2RlZmluZSBQVF9TVEFURV9BQ1RJVkFURUQgMQorI2RlZmluZSBQVF9TVEFURV9QTEFZSU5HIDIKKworLyogcGFzc3Rocm91Z2ggc3RydWN0ICovCitzdHJ1Y3QgcHRfZGF0YQoreworCXU4CXNlbGVjdGVkLCBzdGF0ZSwgc3Bjc190b191c2U7CisJaW50CWludHJfZ3ByLCBlbmFibGVfZ3ByLCBwb3NfZ3ByOworCXUzMglibG9ja3NfcGxheWVkLCBibG9ja3NfY29waWVkLCBvbGRfc3Bjc1szXTsKKwl1MzIJcGxheXB0ciwgY29weXB0cjsKKwl1MzIJcHJlcGVuZF9zaXplOworCXU4CSpidWY7CisJdTgJYWMzZGF0YTsKKworCWNoYXIJKnBhdGNoX25hbWUsICppbnRyX2dwcl9uYW1lLCAqZW5hYmxlX2dwcl9uYW1lLCAqcG9zX2dwcl9uYW1lOworCisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwlzcGlubG9ja190IGxvY2s7Cit9OworCisvKgorICBQYXNzdGhyb3VnaCBjYW4gYmUgZG9uZSBpbiB0d28gbWV0aG9kczoKKworICBNZXRob2QgMSA6IHRyYW0KKyAgICAgSW4gb3JpZ2luYWwgZW11MTBrMSwgd2UgY291bGRuJ3QgYnlwYXNzIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXJzLiBFdmVuIGF0IDQ4a0h6CisgICAgICh0aGUgaW50ZXJuYWwgc2FtcGxlIHJhdGUgb2YgdGhlIGVtdTEwazEpIHRoZSBzYW1wbGVzIHdvdWxkIGdldCBtZXNzZWQgdXAuCisgICAgIFRvIG92ZXIgY29tZSB0aGlzLCBzYW1wbGVzIGFyZSBjb3BpZWQgaW50byB0aGUgdHJhbSBhbmQgYSBzcGVjaWFsIGRzcCBwYXRjaCBjb3BpZXMKKyAgICAgdGhlIHNhbXBsZXMgb3V0IGFuZCBnZW5lcmF0ZXMgaW50ZXJydXB0cyB3aGVuIGEgYmxvY2sgaGFzIGZpbm5pc2hlZCBwbGF5aW5nLgorCisgIE1ldGhvZCAyIDogSW50ZXJwb2xhdG9yIGJ5cGFzcworCisgICAgIENyZWF0aXZlIGZpeGVkIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0IHByb2JsZW0gaW4gZW11MTBrMSByZXYgNyBhbmQgaGlnaGVyCisgICAgIChpbmNsdWRpbmcgdGhlIGVtdTEwazIgKGF1ZGlneSkpLiBUaGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIHJlZ3VsYXIsIGFuZCBtdWNoIHNpbXBsZXIKKyAgICAgcGxheWJhY2sgbWV0aG9kLiAKKworCisgIEluIGJvdGggbWV0aG9kcywgZHNwIGNvZGUgaXMgdXNlZCB0byBtdXggYXVkaW8gYW5kIHBhc3N0aHJvdWdoLiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgc3BkaWYKKyAgZG9lc24ndCByZWNlaXZlIGF1ZGlvIGFuZCBwYXN0aHJvdWdoIGRhdGEgYXQgdGhlIHNhbWUgdGltZS4gVGhlIHNwZGlmIGZsYWcgU1BDU19OT1RBVURJT0RBVEEKKyAgaXMgc2V0IHRvIHRlbGwgCisKKyAqLworCisvLyBlbXUxMGsxIHJldnMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDcgY2FuIHVzZSBtZXRob2QyCisKKyNkZWZpbmUgVVNFX1BUX01FVEhPRDIgIChjYXJkLT5pc19hdWRpZ3kpCisjZGVmaW5lIFVTRV9QVF9NRVRIT0QxCSFVU0VfUFRfTUVUSE9EMgorCitzc2l6ZV90IGVtdTEwazFfcHRfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIHNpemVfdCBjb3VudCk7CisKK2ludCBlbXUxMGsxX3B0X3NldHVwKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KTsKK3ZvaWQgZW11MTBrMV9wdF9zdG9wKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpOwordm9pZCBlbXUxMGsxX3B0X3dhdmVvdXRfdXBkYXRlKHN0cnVjdCBlbXUxMGsxX3dhdmVkZXZpY2UgKndhdmVfZGV2KTsKKworI2VuZGlmIC8qIF9QQVNTVEhST1VHSF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuYyBiL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzNmZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuYwpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgcmVjbWdyLmMgLS0gUmVjb3JkaW5nIG1hbmFnZXIgZm9yIGVtdTEwazEgZHJpdmVyCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgIERhdGUgICAgICAgICAgICAgICAgIEF1dGhvciAgICAgICAgICBTdW1tYXJ5IG9mIGNoYW5nZXMKKyAqICAgICAtLS0tICAgICAgICAgICAgICAgICAtLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogICAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwKKyAqICAgICBVU0EuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSAiODAxMC5oIgorI2luY2x1ZGUgInJlY21nci5oIgorCit2b2lkIGVtdTEwazFfcmVzZXRfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpCit7CisJRFBGKDIsICJlbXUxMGsxX3Jlc2V0X3JlY29yZCgpXG4iKTsKKworCXNibGl2ZV93cml0ZXB0cihjYXJkLCBidWZmZXItPnNpemVyZWcsIDAsIEFEQ0JTX0JVRlNJWkVfTk9ORSk7CisKKwlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgYnVmZmVyLT5zaXplcmVnLCAwLCBidWZmZXItPnNpemVyZWd2YWwpOwkKKworCXdoaWxlIChzYmxpdmVfcmVhZHB0cihjYXJkLCBidWZmZXItPmlkeHJlZywgMCkpCisJCXVkZWxheSg1KTsKK30KKwordm9pZCBlbXUxMGsxX3N0YXJ0X3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyKQoreworCURQRigyLCAiZW11MTBrMV9zdGFydF9yZWNvcmQoKVxuIik7CisKKwlpZiAoYnVmZmVyLT5hZGNjdGwpCisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBRENDUiwgMCwgYnVmZmVyLT5hZGNjdGwpOworfQorCit2b2lkIGVtdTEwazFfc3RvcF9yZWNvcmQoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHdhdmVpbl9idWZmZXIgKmJ1ZmZlcikKK3sKKwlEUEYoMiwgImVtdTEwazFfc3RvcF9yZWNvcmQoKVxuIik7CisKKwkvKiBEaXNhYmxlIHJlY29yZCB0cmFuc2ZlciAqLworCWlmIChidWZmZXItPmFkY2N0bCkKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFEQ0NSLCAwLCAwKTsKK30KKwordm9pZCBlbXUxMGsxX3NldF9yZWNvcmRfc3JjKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3aWluc3QgKndpaW5zdCkKK3sKKwlzdHJ1Y3Qgd2F2ZWluX2J1ZmZlciAqYnVmZmVyID0gJndpaW5zdC0+YnVmZmVyOworCisJRFBGKDIsICJlbXUxMGsxX3NldF9yZWNvcmRfc3JjKClcbiIpOworCisJc3dpdGNoICh3aWluc3QtPnJlY3NyYykgeworCisJY2FzZSBXQVZFUkVDT1JEX0FDOTc6CisJCURQRigyLCAicmVjb3JkaW5nIHNvdXJjZTogQUM5N1xuIik7CisJCWJ1ZmZlci0+c2l6ZXJlZyA9IEFEQ0JTOworCQlidWZmZXItPmFkZHJyZWcgPSBBRENCQTsKKwkJYnVmZmVyLT5pZHhyZWcgPSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0lEWF9JRFggOiBBRENJRFhfSURYOworCisJCXN3aXRjaCAod2lpbnN0LT5mb3JtYXQuc2FtcGxpbmdyYXRlKSB7CisJCWNhc2UgMHhCQjgwOgorCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzQ4OworCQkJYnJlYWs7CisJCWNhc2UgMHhBQzQ0OgorCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzQ0OworCQkJYnJlYWs7CisJCWNhc2UgMHg3RDAwOgorCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzMyOworCQkJYnJlYWs7CisJCWNhc2UgMHg1REMwOgorCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzI0OworCQkJYnJlYWs7CisJCWNhc2UgMHg1NjIyOgorCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzIyOworCQkJYnJlYWs7CisJCWNhc2UgMHgzRTgwOgorCQkJYnVmZmVyLT5hZGNjdGwgPSBBRENDUl9TQU1QTEVSQVRFXzE2OworCQkJYnJlYWs7CisJCS8vIEZJWE1FOiBhdWRpZ3kgc3VwcG9ydHMgMTJrSHogcmVjb3JkaW5nCisJCS8qCisJCWNhc2UgPz8/PzoKKwkJCWJ1ZmZlci0+YWRjY3RsID0gQV9BRENDUl9TQU1QTEVSQVRFXzEyOworCQkJYnJlYWs7CisJCSovCisJCWNhc2UgMHgyQjExOgorCQkJYnVmZmVyLT5hZGNjdGwgPSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0NSX1NBTVBMRVJBVEVfMTEgOiBBRENDUl9TQU1QTEVSQVRFXzExOworCQkJYnJlYWs7CisJCWNhc2UgMHgxRjQwOgorCQkJYnVmZmVyLT5hZGNjdGwgPSBjYXJkLT5pc19hdWRpZ3kgPyBBX0FEQ0NSX1NBTVBMRVJBVEVfOCA6IEFEQ0NSX1NBTVBMRVJBVEVfODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQlVHKCk7CisJCQlicmVhazsKKwkJfQorCisJCWJ1ZmZlci0+YWRjY3RsIHw9IGNhcmQtPmlzX2F1ZGlneSA/IEFfQURDQ1JfTENIQU5FTkFCTEUgOiBBRENDUl9MQ0hBTkVOQUJMRTsKKworCQlpZiAod2lpbnN0LT5mb3JtYXQuY2hhbm5lbHMgPT0gMikKKwkJCWJ1ZmZlci0+YWRjY3RsIHw9IGNhcmQtPmlzX2F1ZGlneSA/IEFfQURDQ1JfUkNIQU5FTkFCTEUgOiBBRENDUl9SQ0hBTkVOQUJMRTsKKworCQlicmVhazsKKworCWNhc2UgV0FWRVJFQ09SRF9NSUM6CisJCURQRigyLCAicmVjb3JkaW5nIHNvdXJjZTogTUlDXG4iKTsKKwkJYnVmZmVyLT5zaXplcmVnID0gTUlDQlM7CisJCWJ1ZmZlci0+YWRkcnJlZyA9IE1JQ0JBOworCQlidWZmZXItPmlkeHJlZyA9IE1JQ0lEWF9JRFg7CisJCWJ1ZmZlci0+YWRjY3RsID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFdBVkVSRUNPUkRfRlg6CisJCURQRigyLCAicmVjb3JkaW5nIHNvdXJjZTogRlhcbiIpOworCQlidWZmZXItPnNpemVyZWcgPSBGWEJTOworCQlidWZmZXItPmFkZHJyZWcgPSBGWEJBOworCQlidWZmZXItPmlkeHJlZyA9IEZYSURYX0lEWDsKKwkJYnVmZmVyLT5hZGNjdGwgPSAwOworCisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBGWFdDLCAwLCB3aWluc3QtPmZ4d2MpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlCVUcoKTsKKwkJYnJlYWs7CisJfQorCisJRFBEKDIsICJidXMgYWRkeDogJSNseFxuIiwgKHVuc2lnbmVkIGxvbmcpIGJ1ZmZlci0+ZG1hX2hhbmRsZSk7CisKKwlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgYnVmZmVyLT5hZGRycmVnLCAwLCAodTMyKWJ1ZmZlci0+ZG1hX2hhbmRsZSk7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuaCBiL3NvdW5kL29zcy9lbXUxMGsxL3JlY21nci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ODc2NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS9yZWNtZ3IuaApAQCAtMCwwICsxLDQ4IEBACisvKiAgICAgCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgIHJlY21nci5oCisgKiAgICAgQ29weXJpZ2h0IDE5OTksIDIwMDAgQ3JlYXRpdmUgTGFicywgSW5jLiAKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCisgKiAKKyAqICAgICBEYXRlICAgICAgICAgICAgICAgICBBdXRob3IgICAgICAgICAgU3VtbWFyeSBvZiBjaGFuZ2VzIAorICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0gCisgKiAgICAgT2N0b2JlciAyMCwgMTk5OSAgICAgQmVydHJhbmQgTGVlICAgIGJhc2UgY29kZSByZWxlYXNlIAorICogCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKKyAqIAorICogICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCisgKiAgICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgCisgKiAgICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uIAorICogCisgKiAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIAorICogICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIAorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgCisgKiAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gCisgKiAKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgCisgKiAgICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSAKKyAqICAgICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIAorICogICAgIFVTQS4gCisgKiAKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAorICovCisKKyNpZm5kZWYgX1JFQ09SRE1HUl9ICisjZGVmaW5lIF9SRUNPUkRNR1JfSAorCisjaW5jbHVkZSAiaHdhY2Nlc3MuaCIKKyNpbmNsdWRlICJjYXJkd2kuaCIKKworLyogUmVjb3JkaW5nIHJlc291cmNlcyAqLworI2RlZmluZSBXQVZFUkVDT1JEX0FDOTcJCTB4MDEKKyNkZWZpbmUgV0FWRVJFQ09SRF9NSUMJCTB4MDIKKyNkZWZpbmUgV0FWRVJFQ09SRF9GWAkJMHgwMworCit2b2lkIGVtdTEwazFfcmVzZXRfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB3YXZlaW5fYnVmZmVyICpidWZmZXIpOwordm9pZCBlbXUxMGsxX3N0YXJ0X3JlY29yZChzdHJ1Y3QgZW11MTBrMV9jYXJkICosIHN0cnVjdCB3YXZlaW5fYnVmZmVyICopOwordm9pZCBlbXUxMGsxX3N0b3BfcmVjb3JkKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHdhdmVpbl9idWZmZXIgKik7Cit2b2lkIGVtdTEwazFfc2V0X3JlY29yZF9zcmMoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3Qgd2lpbnN0ICp3aWluc3QpOworCisjZW5kaWYgLyogX1JFQ09SRE1HUl9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS90aW1lci5jIGIvc291bmQvb3NzL2VtdTEwazEvdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTBkMzA3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvdGltZXIuYwpAQCAtMCwwICsxLDE3NiBAQAorCisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICB0aW1lci5jCisgKiAgICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIGluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKy8qIDMvNi8yMDAwCUltcHJvdmVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudCB0aW1lciBkZWxheXMgIFJ1aSBTb3VzYSAqLworCisvKiA0LzMvMjAwMAlJbXBsZW1lbnRlZCB0aW1lciBsaXN0IHVzaW5nIGxpc3QuaCAJICAgICBSdWkgU291c2EgKi8KKworI2luY2x1ZGUgImh3YWNjZXNzLmgiCisjaW5jbHVkZSAiODAxMC5oIgorI2luY2x1ZGUgImlycW1nci5oIgorI2luY2x1ZGUgInRpbWVyLmgiCisKKy8qIFRyeSB0byBzY2hlZHVsZSBvbmx5IG9uY2UgcGVyIGZyYWdtZW50ICovCisKK3ZvaWQgZW11MTBrMV90aW1lcl9pcnFoYW5kbGVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQpCit7CisJc3RydWN0IGVtdV90aW1lciAqdDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCXNwaW5fbG9jaygmY2FyZC0+dGltZXJfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2FyZC0+dGltZXJzKSB7CisJCXQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11X3RpbWVyLCBsaXN0KTsKKworCQlpZiAodC0+c3RhdGUgJiBUSU1FUl9TVEFURV9BQ1RJVkUpIHsKKwkJCXQtPmNvdW50Kys7CisJCQlpZiAodC0+Y291bnQgPT0gdC0+Y291bnRfbWF4KSB7CisJCQkJdC0+Y291bnQgPSAwOworCQkJCXRhc2tsZXRfaGlfc2NoZWR1bGUoJnQtPnRhc2tsZXQpOworCQkJfQorCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmNhcmQtPnRpbWVyX2xvY2spOworCisJcmV0dXJuOworfQorCit2b2lkIGVtdTEwazFfdGltZXJfaW5zdGFsbChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZW11X3RpbWVyICp0aW1lciwgdTE2IGRlbGF5KQoreworCXN0cnVjdCBlbXVfdGltZXIgKnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZWxheSA8IDUpCisJCWRlbGF5ID0gNTsKKworCXRpbWVyLT5kZWxheSA9IGRlbGF5OworCXRpbWVyLT5zdGF0ZSA9IFRJTUVSX1NUQVRFX0lOU1RBTExFRDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7CisKKwl0aW1lci0+Y291bnRfbWF4ID0gdGltZXItPmRlbGF5IC8gKGNhcmQtPnRpbWVyX2RlbGF5IDwgMTAyNCA/IGNhcmQtPnRpbWVyX2RlbGF5IDogMTAyNCk7CisJdGltZXItPmNvdW50ID0gdGltZXItPmNvdW50X21heCAtIDE7CisKKwlsaXN0X2FkZCgmdGltZXItPmxpc3QsICZjYXJkLT50aW1lcnMpOworCisJaWYgKGNhcmQtPnRpbWVyX2RlbGF5ID4gZGVsYXkpIHsKKwkJaWYgKGNhcmQtPnRpbWVyX2RlbGF5ID09IFRJTUVSX1NUT1BQRUQpCisJCQllbXUxMGsxX2lycV9lbmFibGUoY2FyZCwgSU5URV9JTlRFUlZBTFRJTUVSRU5CKTsKKworCQljYXJkLT50aW1lcl9kZWxheSA9IGRlbGF5OworCQlkZWxheSA9IChkZWxheSA8IDEwMjQgPyBkZWxheSA6IDEwMjQpOworCisJCWVtdTEwazFfdGltZXJfc2V0KGNhcmQsIGRlbGF5KTsKKworCQlsaXN0X2Zvcl9lYWNoKGVudHJ5LCAmY2FyZC0+dGltZXJzKSB7CisJCQl0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdV90aW1lciwgbGlzdCk7CisKKwkJCXQtPmNvdW50X21heCA9IHQtPmRlbGF5IC8gZGVsYXk7CisJCQkvKiBkb24ndCB3YW50IHRvIHRoaW5rIG11Y2gsIGp1c3QgZm9yY2Ugc2NoZWR1bGluZyAKKwkJCSAgIG9uIHRoZSBuZXh0IGludGVycnVwdCAqLworCQkJdC0+Y291bnQgPSB0LT5jb3VudF9tYXggLSAxOworCQl9CisKKwkJRFBEKDIsICJ0aW1lciByYXRlIC0tPiAldVxuIiwgZGVsYXkpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKKworCXJldHVybjsKK30KKwordm9pZCBlbXUxMGsxX3RpbWVyX3VuaW5zdGFsbChzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZW11X3RpbWVyICp0aW1lcikKK3sKKwlzdHJ1Y3QgZW11X3RpbWVyICp0OworCXN0cnVjdCBsaXN0X2hlYWQgKmVudHJ5OworCXUxNiBkZWxheSA9IFRJTUVSX1NUT1BQRUQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh0aW1lci0+c3RhdGUgPT0gVElNRVJfU1RBVEVfVU5JTlNUQUxMRUQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2RlbCgmdGltZXItPmxpc3QpOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNhcmQtPnRpbWVycykgeworCQl0ID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGVtdV90aW1lciwgbGlzdCk7CisKKwkJaWYgKHQtPmRlbGF5IDwgZGVsYXkpCisJCQlkZWxheSA9IHQtPmRlbGF5OworCX0KKworCWlmIChjYXJkLT50aW1lcl9kZWxheSAhPSBkZWxheSkgeworCQljYXJkLT50aW1lcl9kZWxheSA9IGRlbGF5OworCisJCWlmIChkZWxheSA9PSBUSU1FUl9TVE9QUEVEKQorCQkJZW11MTBrMV9pcnFfZGlzYWJsZShjYXJkLCBJTlRFX0lOVEVSVkFMVElNRVJFTkIpOworCQllbHNlIHsKKwkJCWRlbGF5ID0gKGRlbGF5IDwgMTAyNCA/IGRlbGF5IDogMTAyNCk7CisKKwkJCWVtdTEwazFfdGltZXJfc2V0KGNhcmQsIGRlbGF5KTsKKworCQkJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNhcmQtPnRpbWVycykgeworCQkJCXQgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgZW11X3RpbWVyLCBsaXN0KTsKKworCQkJCXQtPmNvdW50X21heCA9IHQtPmRlbGF5IC8gZGVsYXk7CisJCQkJdC0+Y291bnQgPSB0LT5jb3VudF9tYXggLSAxOworCQkJfQorCQl9CisKKwkJRFBEKDIsICJ0aW1lciByYXRlIC0tPiAldVxuIiwgZGVsYXkpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKKworCXRpbWVyLT5zdGF0ZSA9IFRJTUVSX1NUQVRFX1VOSU5TVEFMTEVEOworCisJcmV0dXJuOworfQorCit2b2lkIGVtdTEwazFfdGltZXJfZW5hYmxlKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCBlbXVfdGltZXIgKnRpbWVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOworCXRpbWVyLT5zdGF0ZSB8PSBUSU1FUl9TVEFURV9BQ1RJVkU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+dGltZXJfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuOworfQorCit2b2lkIGVtdTEwazFfdGltZXJfZGlzYWJsZShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZW11X3RpbWVyICp0aW1lcikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPnRpbWVyX2xvY2ssIGZsYWdzKTsKKwl0aW1lci0+c3RhdGUgJj0gflRJTUVSX1NUQVRFX0FDVElWRTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT50aW1lcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm47Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS90aW1lci5oIGIvc291bmQvb3NzL2VtdTEwazEvdGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjU0M2I0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvdGltZXIuaApAQCAtMCwwICsxLDU0IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICB0aW1lci5oCisgKiAgICAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwIENyZWF0aXZlIExhYnMsIEluYy4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKworI2lmbmRlZiBfVElNRVJfSAorI2RlZmluZSBfVElNRVJfSAorCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlICJod2FjY2Vzcy5oIgorCitzdHJ1Y3QgZW11X3RpbWVyIAoreworCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgdGFza2xldDsKKwl1OCBzdGF0ZTsgCisJdTE2IGNvdW50OwkJCQkvKiBjdXJyZW50IG51bWJlciBvZiBpbnRlcnJ1cHRzICovCisJdTE2IGNvdW50X21heDsJCQkJLyogbnVtYmVyIG9mIGludGVycnVwdHMgbmVlZGVkIHRvIHNjaGVkdWxlIHRoZSBiaCAqLworCXUxNiBkZWxheTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0aW1lciBkZWxheSAqLworfTsKKwordm9pZCBlbXUxMGsxX3RpbWVyX2luc3RhbGwoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3RpbWVyICosIHUxNik7Cit2b2lkIGVtdTEwazFfdGltZXJfdW5pbnN0YWxsKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV90aW1lciAqKTsKK3ZvaWQgZW11MTBrMV90aW1lcl9lbmFibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3RpbWVyICopOwordm9pZCBlbXUxMGsxX3RpbWVyX2Rpc2FibGUoc3RydWN0IGVtdTEwazFfY2FyZCAqLCBzdHJ1Y3QgZW11X3RpbWVyICopOworCisjZGVmaW5lIFRJTUVSX1NUT1BQRUQgCQkJMHhmZmZmIAorI2RlZmluZSBUSU1FUl9TVEFURV9JTlNUQUxMRUQgCQkweDAxCisjZGVmaW5lIFRJTUVSX1NUQVRFX0FDVElWRQkJMHgwMgorI2RlZmluZSBUSU1FUl9TVEFURV9VTklOU1RBTExFRCAJMHgwNAorCisjZW5kaWYgLyogX1RJTUVSX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lbXUxMGsxL3ZvaWNlbWdyLmMgYi9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OGI2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5jCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICB2b2ljZW1nci5jIC0gVm9pY2UgbWFuYWdlciBmb3IgZW11MTBrMSBkcml2ZXIKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpbmNsdWRlICJ2b2ljZW1nci5oIgorI2luY2x1ZGUgIjgwMTAuaCIKKworI2RlZmluZSBQSVRDSF80ODAwMCAweDAwMDA0MDAwCisjZGVmaW5lIFBJVENIXzk2MDAwIDB4MDAwMDgwMDAKKyNkZWZpbmUgUElUQ0hfODUwMDAgMHgwMDAwNzE1NQorI2RlZmluZSBQSVRDSF84MDcyNiAweDAwMDA2YmEyCisjZGVmaW5lIFBJVENIXzY3ODgyIDB4MDAwMDVhODIKKyNkZWZpbmUgUElUQ0hfNTcwODEgMHgwMDAwNGMxYworCitzdGF0aWMgdTMyIGVtdTEwazFfc2VsZWN0X2ludGVycHJvbShzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLAorCQkJCSAgICBzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSkKK3sKKwlpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0PT1QSVRDSF80ODAwMCkKKwkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzA7CisJZWxzZSBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0PFBJVENIXzQ4MDAwKQorCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMTsKKwllbHNlICBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0Pj1QSVRDSF85NjAwMCkKKwkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzA7CisJZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfODUwMDApCisJCXJldHVybiBDQ0NBX0lOVEVSUFJPTV82OworCWVsc2UgIGlmKHZvaWNlLT5waXRjaF90YXJnZXQ+PVBJVENIXzgwNzI2KQorCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fNTsKKwllbHNlICBpZih2b2ljZS0+cGl0Y2hfdGFyZ2V0Pj1QSVRDSF82Nzg4MikKKwkJcmV0dXJuIENDQ0FfSU5URVJQUk9NXzQ7CisJZWxzZSAgaWYodm9pY2UtPnBpdGNoX3RhcmdldD49UElUQ0hfNTcwODEpCisJCXJldHVybiBDQ0NBX0lOVEVSUFJPTV8zOworCWVsc2UgIAorCQlyZXR1cm4gQ0NDQV9JTlRFUlBST01fMjsKK30KKworCisvKioKKyAqIGVtdTEwazFfdm9pY2VfYWxsb2NfYnVmZmVyIC0KKyAqCisgKiBhbGxvY2F0ZXMgdGhlIG1lbW9yeSBidWZmZXIgZm9yIGEgdm9pY2UuIFR3byBwYWdlIHRhYmxlcyBhcmUga2VwdCBmb3IgZWFjaCBidWZmZXIuCisgKiBPbmUgKGRtYV9oYW5kbGUpIGtlZXBzIHRyYWNrIG9mIHRoZSBob3N0IG1lbW9yeSBwYWdlcyB1c2VkIGFuZCB0aGUgb3RoZXIgKHZpcnR1YWxwYWdldGFibGUpCisgKiBpcyBwYXNzZWQgdG8gdGhlIGRldmljZSBzbyB0aGF0IGl0IGNhbiBkbyBETUEgdG8gaG9zdCBtZW1vcnkuCisgKgorICovCitpbnQgZW11MTBrMV92b2ljZV9hbGxvY19idWZmZXIoc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCwgc3RydWN0IHZvaWNlX21lbSAqbWVtLCB1MzIgcGFnZXMpCit7CisJdTMyIHBhZ2VpbmRleCwgcGFnZWNvdW50OworCXUzMiBidXNhZGR4OworCWludCBpOworCisJRFBEKDIsICJyZXF1ZXN0ZWQgcGFnZXMgaXM6ICVkXG4iLCBwYWdlcyk7CisKKwlpZiAoKG1lbS0+ZW11cGFnZWluZGV4ID0gZW11MTBrMV9hZGR4bWdyX2FsbG9jKHBhZ2VzICogUEFHRV9TSVpFLCBjYXJkKSkgPCAwKQorCXsKKwkJRFBGKDEsICJjb3VsZG4ndCBhbGxvY2F0ZSBlbXUxMGsxIGFkZHJlc3Mgc3BhY2VcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogRmlsbCBpbiB2aXJ0dWFsIG1lbW9yeSB0YWJsZSAqLworCWZvciAocGFnZWNvdW50ID0gMDsgcGFnZWNvdW50IDwgcGFnZXM7IHBhZ2Vjb3VudCsrKSB7CisJCWlmICgobWVtLT5hZGRyW3BhZ2Vjb3VudF0gPSBwY2lfYWxsb2NfY29uc2lzdGVudChjYXJkLT5wY2lfZGV2LCBQQUdFX1NJWkUsICZtZW0tPmRtYV9oYW5kbGVbcGFnZWNvdW50XSkpCisJCQk9PSBOVUxMKSB7CisJCQltZW0tPnBhZ2VzID0gcGFnZWNvdW50OworCQkJRFBGKDEsICJjb3VsZG4ndCBhbGxvY2F0ZSBkbWEgbWVtb3J5XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCURQRCgyLCAiVmlydHVhbCBBZGR4OiAlcFxuIiwgbWVtLT5hZGRyW3BhZ2Vjb3VudF0pOworCisJCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkUgLyBFTVVQQUdFU0laRTsgaSsrKSB7CisJCQlidXNhZGR4ID0gKHUzMikgbWVtLT5kbWFfaGFuZGxlW3BhZ2Vjb3VudF0gKyBpICogRU1VUEFHRVNJWkU7CisKKwkJCURQRCgzLCAiQnVzIEFkZHg6ICUjeFxuIiwgYnVzYWRkeCk7CisKKwkJCXBhZ2VpbmRleCA9IG1lbS0+ZW11cGFnZWluZGV4ICsgcGFnZWNvdW50ICogUEFHRV9TSVpFIC8gRU1VUEFHRVNJWkUgKyBpOworCisJCQkoKHUzMiAqKSBjYXJkLT52aXJ0dWFscGFnZXRhYmxlLmFkZHIpW3BhZ2VpbmRleF0gPSBjcHVfdG9fbGUzMigoYnVzYWRkeCAqIDIpIHwgcGFnZWluZGV4KTsKKwkJfQorCX0KKworCW1lbS0+cGFnZXMgPSBwYWdlY291bnQ7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBlbXUxMGsxX3ZvaWNlX2ZyZWVfYnVmZmVyIC0KKyAqCisgKiBmcmVlcyB0aGUgbWVtb3J5IGJ1ZmZlciBmb3IgYSB2b2ljZS4KKyAqLwordm9pZCBlbXUxMGsxX3ZvaWNlX2ZyZWVfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKmNhcmQsIHN0cnVjdCB2b2ljZV9tZW0gKm1lbSkKK3sKKwl1MzIgcGFnZWNvdW50LCBwYWdlaW5kZXg7CisJaW50IGk7CisKKwlpZiAobWVtLT5lbXVwYWdlaW5kZXggPCAwKQorCQlyZXR1cm47CisKKwlmb3IgKHBhZ2Vjb3VudCA9IDA7IHBhZ2Vjb3VudCA8IG1lbS0+cGFnZXM7IHBhZ2Vjb3VudCsrKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQoY2FyZC0+cGNpX2RldiwgUEFHRV9TSVpFLAorCQkJCQltZW0tPmFkZHJbcGFnZWNvdW50XSwKKwkJCQkJbWVtLT5kbWFfaGFuZGxlW3BhZ2Vjb3VudF0pOworCisJCWZvciAoaSA9IDA7IGkgPCBQQUdFX1NJWkUgLyBFTVVQQUdFU0laRTsgaSsrKSB7CisJCQlwYWdlaW5kZXggPSBtZW0tPmVtdXBhZ2VpbmRleCArIHBhZ2Vjb3VudCAqIFBBR0VfU0laRSAvIEVNVVBBR0VTSVpFICsgaTsKKwkJCSgodTMyICopIGNhcmQtPnZpcnR1YWxwYWdldGFibGUuYWRkcilbcGFnZWluZGV4XSA9CisJCQkJY3B1X3RvX2xlMzIoKCh1MzIpIGNhcmQtPnNpbGVudHBhZ2UuZG1hX2hhbmRsZSAqIDIpIHwgcGFnZWluZGV4KTsKKwkJfQorCX0KKworCWVtdTEwazFfYWRkeG1ncl9mcmVlKGNhcmQsIG1lbS0+ZW11cGFnZWluZGV4KTsKKwltZW0tPmVtdXBhZ2VpbmRleCA9IC0xOworfQorCitpbnQgZW11MTBrMV92b2ljZV9hbGxvYyhzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkLCBzdHJ1Y3QgZW11X3ZvaWNlICp2b2ljZSkKK3sKKwl1OCAqdm9pY2V0YWJsZSA9IGNhcmQtPnZvaWNldGFibGU7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQRigyLCAiZW11MTBrMV92b2ljZV9hbGxvYygpXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPKSB7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRzsgaSArPSAyKQorCQkJaWYgKCh2b2ljZXRhYmxlW2ldID09IFZPSUNFX1VTQUdFX0ZSRUUpICYmICh2b2ljZXRhYmxlW2kgKyAxXSA9PSBWT0lDRV9VU0FHRV9GUkVFKSkgeworCQkJCXZvaWNldGFibGVbaV0gPSB2b2ljZS0+dXNhZ2U7CisJCQkJdm9pY2V0YWJsZVtpICsgMV0gPSB2b2ljZS0+dXNhZ2U7CisJCQkJYnJlYWs7CisJCQl9CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IE5VTV9HOyBpKyspCisJCQlpZiAodm9pY2V0YWJsZVtpXSA9PSBWT0lDRV9VU0FHRV9GUkVFKSB7CisJCQkJdm9pY2V0YWJsZVtpXSA9IHZvaWNlLT51c2FnZTsKKwkJCQlicmVhazsKKwkJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoaSA+PSBOVU1fRykKKwkJcmV0dXJuIC0xOworCisJdm9pY2UtPmNhcmQgPSBjYXJkOworCXZvaWNlLT5udW0gPSBpOworCisJZm9yIChpID0gMDsgaSA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGkrKykgeworCQlEUEQoMiwgIiB2b2ljZSBhbGxvY2F0ZWQgLT4gJWRcbiIsIHZvaWNlLT5udW0gKyBpKTsKKworCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBpLCBJRkFUTiwgMHhmZmZmLAorCQkJCQkJCURDWVNVU1YsIDAsCisJCQkJCQkJVlRGVCwgMHgwMDAwZmZmZiwKKwkJCQkJCQlQVFJYLCAwLAorCQkJCQkJCVRBR0xJU1RfRU5EKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBlbXUxMGsxX3ZvaWNlX2ZyZWUoc3RydWN0IGVtdV92b2ljZSAqdm9pY2UpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHZvaWNlLT5jYXJkOworCWludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlEUEYoMiwgImVtdTEwazFfdm9pY2VfZnJlZSgpXG4iKTsKKworCWlmICh2b2ljZS0+dXNhZ2UgPT0gVk9JQ0VfVVNBR0VfRlJFRSkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGkrKykgeworCQlEUEQoMiwgIiB2b2ljZSByZWxlYXNlZCAtPiAlZFxuIiwgdm9pY2UtPm51bSArIGkpOworCisJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgdm9pY2UtPm51bSArIGksIERDWVNVU1YsIDAsIAorCQkJCQkJCVZURlQsIDB4MDAwMGZmZmYsCisJCQkJCQkJUFRSWF9QSVRDSFRBUkdFVCwgMCwKKwkJCQkJCQlDVkNGLCAweDAwMDBmZmZmLAorCQkJCQkJCS8vQ1BGLCAwLAorCQkJCQkJCVRBR0xJU1RfRU5EKTsKKwkJCisJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDUEYsIHZvaWNlLT5udW0gKyBpLCAwKTsKKwl9CisKKwl2b2ljZS0+dXNhZ2UgPSBWT0lDRV9VU0FHRV9GUkVFOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWNhcmQtPnZvaWNldGFibGVbdm9pY2UtPm51bV0gPSBWT0lDRV9VU0FHRV9GUkVFOworCisJaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykKKwkJY2FyZC0+dm9pY2V0YWJsZVt2b2ljZS0+bnVtICsgMV0gPSBWT0lDRV9VU0FHRV9GUkVFOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkIGVtdTEwazFfdm9pY2VfcGxheWJhY2tfc2V0dXAoc3RydWN0IGVtdV92b2ljZSAqdm9pY2UpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IHZvaWNlLT5jYXJkOworCXUzMiBzdGFydDsKKwlpbnQgaTsKKworCURQRigyLCAiZW11MTBrMV92b2ljZV9wbGF5YmFja19zZXR1cCgpXG4iKTsKKworCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pIHsKKwkJLyogU2V0IHN0ZXJlbyBiaXQgKi8KKwkJc3RhcnQgPSAyODsKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgdm9pY2UtPm51bSwgQ1BGX1NURVJFT19NQVNLKTsKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgdm9pY2UtPm51bSArIDEsIENQRl9TVEVSRU9fTUFTSyk7CisJfSBlbHNlIHsKKwkJc3RhcnQgPSAzMDsKKwkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENQRiwgdm9pY2UtPm51bSwgMCk7CisJfQorCisJaWYoISh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU18xNkJJVCkpCisJCXN0YXJ0ICo9IDI7CisKKwl2b2ljZS0+c3RhcnQgKz0gc3RhcnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTyA/IDIgOiAxKTsgaSsrKSB7CisJCWlmIChjYXJkLT5pc19hdWRpZ3kpIHsKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBBX0ZYUlQxLCB2b2ljZS0+bnVtICsgaSwgdm9pY2UtPnBhcmFtc1tpXS5zZW5kX3JvdXRpbmcpOworCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEFfRlhSVDIsIHZvaWNlLT5udW0gKyBpLCB2b2ljZS0+cGFyYW1zW2ldLnNlbmRfcm91dGluZzIpOworCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsICBBX1NFTkRBTU9VTlRTLCB2b2ljZS0+bnVtICsgaSwgdm9pY2UtPnBhcmFtc1tpXS5zZW5kX2hnZmUpOworCQl9IGVsc2UgeworCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIEZYUlQsIHZvaWNlLT5udW0gKyBpLCB2b2ljZS0+cGFyYW1zW2ldLnNlbmRfcm91dGluZyA8PCAxNik7CisJCX0KKworCQkvKiBTdG9wIENBICovCisJCS8qIEFzc3VtcHRpb24gdGhhdCBQVCBpcyBhbHJlYWR5IDAgc28gbm8gaGFybSBvdmVyd3JpdGluZyAqLworCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgUFRSWCwgdm9pY2UtPm51bSArIGksICgodm9pY2UtPnBhcmFtc1tpXS5zZW5kX2RjYmEgJiAweGZmKSA8PCA4KQorCQkJCXwgKCh2b2ljZS0+cGFyYW1zW2ldLnNlbmRfZGNiYSAmIDB4ZmYwMCkgPj4gOCkpOworCisJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgdm9pY2UtPm51bSArIGksCisJCQkJLyogQ1NMLCBTVCwgQ0EgKi8KKwkJCQkgICAgRFNMLCB2b2ljZS0+ZW5kbG9vcCB8ICh2b2ljZS0+cGFyYW1zW2ldLnNlbmRfZGNiYSAmIDB4ZmYwMDAwMDApLAorCQkJCSAgICBQU1NULCB2b2ljZS0+c3RhcnRsb29wIHwgKCh2b2ljZS0+cGFyYW1zW2ldLnNlbmRfZGNiYSAmIDB4MDBmZjAwMDApIDw8IDgpLAorCQkJCSAgICBDQ0NBLCAodm9pY2UtPnN0YXJ0KSB8ICBlbXUxMGsxX3NlbGVjdF9pbnRlcnByb20oY2FyZCx2b2ljZSkgfAorCQkJCSAgICAgICAgKCh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU18xNkJJVCkgPyAwIDogQ0NDQV84QklUU0VMRUNUKSwKKwkJCQkgICAgLyogQ2xlYXIgZmlsdGVyIGRlbGF5IG1lbW9yeSAqLworCQkJCSAgICBaMSwgMCwKKwkJCQkgICAgWjIsIDAsCisJCQkJICAgIC8qIEludmFsaWRhdGUgbWFwcyAqLworCQkJCSAgICBNQVBBLCBNQVBfUFRJX01BU0sgfCAoKHUzMikgY2FyZC0+c2lsZW50cGFnZS5kbWFfaGFuZGxlICogMiksCisJCQkJICAgIE1BUEIsIE1BUF9QVElfTUFTSyB8ICgodTMyKSBjYXJkLT5zaWxlbnRwYWdlLmRtYV9oYW5kbGUgKiAyKSwKKwkJCQkvKiBtb2R1bGF0aW9uIGVudmVsb3BlICovCisJCQkJICAgIENWQ0YsIDB4MDAwMGZmZmYsCisJCQkJICAgIFZURlQsIDB4MDAwMGZmZmYsCisJCQkJICAgIEFUS0hMRE0sIDAsCisJCQkJICAgIERDWVNVU00sIDB4MDA3ZiwKKwkJCQkgICAgTEZPVkFMMSwgMHg4MDAwLAorCQkJCSAgICBMRk9WQUwyLCAweDgwMDAsCisJCQkJICAgIEZNTU9ELCAwLAorCQkJCSAgICBUUkVNRlJRLCAwLAorCQkJCSAgICBGTTJGUlEyLCAwLAorCQkJCSAgICBFTlZWQUwsIDB4ODAwMCwKKwkJCQkvKiB2b2x1bWUgZW52ZWxvcGUgKi8KKwkJCQkgICAgQVRLSExEViwgMHg3ZjdmLAorCQkJCSAgICBFTlZWT0wsIDB4ODAwMCwKKwkJCQkvKiBmaWx0ZXIgZW52ZWxvcGUgKi8KKwkJCQkgICAgUEVGRV9GSUxURVJBTU9VTlQsIDB4N2YsCisJCQkJLyogcGl0Y2ggZW52ZWxvcGUgKi8KKwkJCQkgICAgUEVGRV9QSVRDSEFNT1VOVCwgMCwgVEFHTElTVF9FTkQpOworCisJCXZvaWNlLT5wYXJhbXNbaV0uZmNfdGFyZ2V0ID0gMHhmZmZmOworCX0KK30KKwordm9pZCBlbXUxMGsxX3ZvaWNlc19zdGFydChzdHJ1Y3QgZW11X3ZvaWNlICpmaXJzdF92b2ljZSwgdW5zaWduZWQgaW50IG51bV92b2ljZXMsIGludCBzZXQpCit7CisJc3RydWN0IGVtdTEwazFfY2FyZCAqY2FyZCA9IGZpcnN0X3ZvaWNlLT5jYXJkOworCXN0cnVjdCBlbXVfdm9pY2UgKnZvaWNlOworCXVuc2lnbmVkIGludCB2b2ljZW51bTsKKwlpbnQgajsKKworCURQRigyLCAiZW11MTBrMV92b2ljZXNfc3RhcnQoKVxuIik7CisKKwlmb3IgKHZvaWNlbnVtID0gMDsgdm9pY2VudW0gPCBudW1fdm9pY2VzOyB2b2ljZW51bSsrKQorCXsKKwkJdm9pY2UgPSBmaXJzdF92b2ljZSArIHZvaWNlbnVtOworCisJCWlmICghc2V0KSB7CisJCQl1MzIgY3JhLCBjY2lzLCBjcywgc2FtcGxlOworCQkJaWYgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTykgeworCQkJCWNyYSA9IDY0OworCQkJCWNjaXMgPSAyODsKKwkJCQljcyA9IDQ7CisJCQl9IGVsc2UgeworCQkJCWNyYSA9IDY0OworCQkJCWNjaXMgPSAzMDsKKwkJCQljcyA9IDI7CisJCQl9CisKKwkJCWlmKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTXzE2QklUKSB7CisJCQkJc2FtcGxlID0gMHgwMDAwMDAwMDsKKwkJCX0gZWxzZSB7CisJCQkJc2FtcGxlID0gMHg4MDgwODA4MDsJCQorCQkJCWNjaXMgKj0gMjsKKwkJCX0KKworCQkJZm9yKGogPSAwOyBqIDwgY3M7IGorKykKKwkgICAgICAgIAkgICAgICAgIHNibGl2ZV93cml0ZXB0cihjYXJkLCBDRDAgKyBqLCB2b2ljZS0+bnVtLCBzYW1wbGUpOworCisJCQkvKiBSZXNldCBjYWNoZSAqLworCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZS0+bnVtLCAwKTsKKwkJCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pCisJCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENDUl9DQUNIRUlOVkFMSURTSVpFLCB2b2ljZS0+bnVtICsgMSwgMCk7CisKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfUkVBREFERFJFU1MsIHZvaWNlLT5udW0sIGNyYSk7CisKKwkJCWlmICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8pCisJCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIENDUl9SRUFEQUREUkVTUywgdm9pY2UtPm51bSArIDEsIGNyYSk7CisKKwkJCS8qIEZpbGwgY2FjaGUgKi8KKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBDQ1JfQ0FDSEVJTlZBTElEU0laRSwgdm9pY2UtPm51bSwgY2Npcyk7CisJCX0KKworCQlmb3IgKGogPSAwOyBqIDwgKHZvaWNlLT5mbGFncyAmIFZPSUNFX0ZMQUdTX1NURVJFTyA/IDIgOiAxKTsgaisrKSB7CisJCQlzYmxpdmVfd3JpdGVwdHJfdGFnKGNhcmQsIHZvaWNlLT5udW0gKyBqLAorCQkJCSAgICBJRkFUTiwgKHZvaWNlLT5wYXJhbXNbal0uaW5pdGlhbF9mYyA8PCA4KSB8IHZvaWNlLT5wYXJhbXNbal0uaW5pdGlhbF9hdHRuLAorCQkJCSAgICBWVEZULCAodm9pY2UtPnBhcmFtc1tqXS52b2x1bWVfdGFyZ2V0IDw8IDE2KSB8IHZvaWNlLT5wYXJhbXNbal0uZmNfdGFyZ2V0LAorCQkJCSAgICBDVkNGLCAodm9pY2UtPnBhcmFtc1tqXS52b2x1bWVfdGFyZ2V0IDw8IDE2KSB8IHZvaWNlLT5wYXJhbXNbal0uZmNfdGFyZ2V0LAorCQkJCSAgICBEQ1lTVVNWLCAodm9pY2UtPnBhcmFtc1tqXS5ieWFtcGxfZW52X3N1c3RhaW4gPDwgOCkgfCB2b2ljZS0+cGFyYW1zW2pdLmJ5YW1wbF9lbnZfZGVjYXksCisJCQkJICAgIFRBR0xJU1RfRU5EKTsKKwkKKwkJCWVtdTEwazFfY2xlYXJfc3RvcF9vbl9sb29wKGNhcmQsIHZvaWNlLT5udW0gKyBqKTsKKwkJfQorCX0KKworCisgICAgICAgIGZvciAodm9pY2VudW0gPSAwOyB2b2ljZW51bSA8IG51bV92b2ljZXM7IHZvaWNlbnVtKyspCisJeworCQl2b2ljZSA9IGZpcnN0X3ZvaWNlICsgdm9pY2VudW07CisKKwkJZm9yIChqID0gMDsgaiA8ICh2b2ljZS0+ZmxhZ3MgJiBWT0lDRV9GTEFHU19TVEVSRU8gPyAyIDogMSk7IGorKykgeworCQkJc2JsaXZlX3dyaXRlcHRyKGNhcmQsIFBUUlhfUElUQ0hUQVJHRVQsIHZvaWNlLT5udW0gKyBqLCB2b2ljZS0+cGl0Y2hfdGFyZ2V0KTsKKworCQkJaWYgKGogPT0gMCkKKwkJCQlzYmxpdmVfd3JpdGVwdHIoY2FyZCwgQ1BGX0NVUlJFTlRQSVRDSCwgdm9pY2UtPm51bSwgdm9pY2UtPnBpdGNoX3RhcmdldCk7CisKKwkJCXNibGl2ZV93cml0ZXB0cihjYXJkLCBJUCwgdm9pY2UtPm51bSArIGosIHZvaWNlLT5pbml0aWFsX3BpdGNoKTsKKwkJfQorCX0KK30KKwordm9pZCBlbXUxMGsxX3ZvaWNlc19zdG9wKHN0cnVjdCBlbXVfdm9pY2UgKmZpcnN0X3ZvaWNlLCBpbnQgbnVtX3ZvaWNlcykKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkID0gZmlyc3Rfdm9pY2UtPmNhcmQ7CisJc3RydWN0IGVtdV92b2ljZSAqdm9pY2U7CisJdW5zaWduZWQgaW50IHZvaWNlX251bTsKKwlpbnQgajsKKworCURQRigyLCAiZW11MTBrMV92b2ljZV9zdG9wKClcbiIpOworCisgICAgICAgIGZvciAodm9pY2VfbnVtID0gMDsgdm9pY2VfbnVtIDwgbnVtX3ZvaWNlczsgdm9pY2VfbnVtKyspCisJeworCQl2b2ljZSA9IGZpcnN0X3ZvaWNlICsgdm9pY2VfbnVtOworCisJCWZvciAoaiA9IDA7IGogPCAodm9pY2UtPmZsYWdzICYgVk9JQ0VfRkxBR1NfU1RFUkVPID8gMiA6IDEpOyBqKyspIHsKKwkJCXNibGl2ZV93cml0ZXB0cl90YWcoY2FyZCwgdm9pY2UtPm51bSArIGosCisJCQkJCQlQVFJYX1BJVENIVEFSR0VULCAwLAorCQkJCQkJQ1BGX0NVUlJFTlRQSVRDSCwgMCwKKwkJCQkJCUlGQVROLCAweGZmZmYsCisJCQkJCQlWVEZULCAweDAwMDBmZmZmLAorCQkJCQkJQ1ZDRiwgMHgwMDAwZmZmZiwKKwkJCQkJCUlQLCAwLAorCQkJCQkJVEFHTElTVF9FTkQpOworCQl9CisJfQorfQorCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZW11MTBrMS92b2ljZW1nci5oIGIvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTlhOGNiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VtdTEwazEvdm9pY2VtZ3IuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgc2JsaXZlX3ZvaWNlLmggLS0gRU1VIFZvaWNlIFJlc291cmNlIE1hbmFnZXIgaGVhZGVyIGZpbGUKKyAqICAgICBDb3B5cmlnaHQgMTk5OSwgMjAwMCBDcmVhdGl2ZSBMYWJzLCBJbmMuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgRGF0ZSAgICAgICAgICAgICAgICAgQXV0aG9yICAgICAgICAgIFN1bW1hcnkgb2YgY2hhbmdlcworICogICAgIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLSAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0KKyAqICAgICBPY3RvYmVyIDIwLCAxOTk5ICAgICBCZXJ0cmFuZCBMZWUgICAgYmFzZSBjb2RlIHJlbGVhc2UKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqICAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LAorICogICAgIFVTQS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCisKKyNpZm5kZWYgX1ZPSUNFTUdSX0gKKyNkZWZpbmUgX1ZPSUNFTUdSX0gKKworI2luY2x1ZGUgImh3YWNjZXNzLmgiCisKKy8qIHN0cnVjdCBlbXVfdm9pY2UudXNhZ2UgZmxhZ3MgKi8KKyNkZWZpbmUgVk9JQ0VfVVNBR0VfRlJFRQkJMHgwMQorI2RlZmluZSBWT0lDRV9VU0FHRV9NSURJCQkweDAyCisjZGVmaW5lIFZPSUNFX1VTQUdFX1BMQVlCQUNLCQkweDA0CisKKy8qIHN0cnVjdCBlbXVfdm9pY2UuZmxhZ3MgZmxhZ3MgKi8KKyNkZWZpbmUgVk9JQ0VfRkxBR1NfU1RFUkVPCQkweDAyCisjZGVmaW5lIFZPSUNFX0ZMQUdTXzE2QklUCQkweDA0CisKK3N0cnVjdCB2b2ljZV9wYXJhbQoreworCS8qIEZYIGJ1cyBhbW91bnQgc2VuZCAqLworCisJdTMyIHNlbmRfcm91dGluZzsKKwkvLyBhdWRpZ3kgb25seToKKwl1MzIgc2VuZF9yb3V0aW5nMjsKKworCXUzMiBzZW5kX2RjYmE7CisJLy8gYXVkaWd5IG9ubHk6CisJdTMyIHNlbmRfaGdmZTsKKworCisJdTMyIGluaXRpYWxfZmM7CisJdTMyIGZjX3RhcmdldDsKKworCXUzMiBpbml0aWFsX2F0dG47CisJdTMyIHZvbHVtZV90YXJnZXQ7CisKKwl1MzIgYnlhbXBsX2Vudl9zdXN0YWluOworCXUzMiBieWFtcGxfZW52X2RlY2F5OworfTsKKworc3RydWN0IHZvaWNlX21lbSB7CisJaW50IGVtdXBhZ2VpbmRleDsKKwl2b2lkICphZGRyW0JVRk1BWFBBR0VTXTsKKwlkbWFfYWRkcl90IGRtYV9oYW5kbGVbQlVGTUFYUEFHRVNdOworCXUzMiBwYWdlczsKK307CisKK3N0cnVjdCBlbXVfdm9pY2UKK3sKKwlzdHJ1Y3QgZW11MTBrMV9jYXJkICpjYXJkOworCXU4IHVzYWdlOwkJLyogRnJlZSwgTUlESSwgcGxheWJhY2sgKi8KKwl1OCBudW07CQkJLyogVm9pY2UgSUQgKi8KKwl1OCBmbGFnczsJCS8qIFN0ZXJlby9tb25vLCA4LzE2IGJpdCAqLworCisJdTMyIHN0YXJ0bG9vcDsKKwl1MzIgZW5kbG9vcDsKKwl1MzIgc3RhcnQ7CisKKwl1MzIgaW5pdGlhbF9waXRjaDsKKwl1MzIgcGl0Y2hfdGFyZ2V0OworCisJc3RydWN0IHZvaWNlX3BhcmFtIHBhcmFtc1syXTsKKworCXN0cnVjdCB2b2ljZV9tZW0gbWVtOworfTsKKworaW50IGVtdTEwazFfdm9pY2VfYWxsb2NfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHZvaWNlX21lbSAqLCB1MzIpOwordm9pZCBlbXUxMGsxX3ZvaWNlX2ZyZWVfYnVmZmVyKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IHZvaWNlX21lbSAqKTsKK2ludCBlbXUxMGsxX3ZvaWNlX2FsbG9jKHN0cnVjdCBlbXUxMGsxX2NhcmQgKiwgc3RydWN0IGVtdV92b2ljZSAqKTsKK3ZvaWQgZW11MTBrMV92b2ljZV9mcmVlKHN0cnVjdCBlbXVfdm9pY2UgKik7Cit2b2lkIGVtdTEwazFfdm9pY2VfcGxheWJhY2tfc2V0dXAoc3RydWN0IGVtdV92b2ljZSAqKTsKK3ZvaWQgZW11MTBrMV92b2ljZXNfc3RhcnQoc3RydWN0IGVtdV92b2ljZSAqLCB1bnNpZ25lZCBpbnQsIGludCk7Cit2b2lkIGVtdTEwazFfdm9pY2VzX3N0b3Aoc3RydWN0IGVtdV92b2ljZSAqLCBpbnQpOworCisjZW5kaWYgLyogX1ZPSUNFTUdSX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9lczEzNzAuYyBiL3NvdW5kL29zcy9lczEzNzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTYwOTFjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2VzMTM3MC5jCkBAIC0wLDAgKzEsMjc4OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgICBlczEzNzAuYyAgLS0gIEVuc29uaXEgRVMxMzcwL0FzYWhpIEthc2VpIEFLNDUzMSBhdWRpbyBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSwgMjAwMyAgVGhvbWFzIFNhaWxlciAodC5zYWlsZXJAYWx1bW5pLmV0aHouY2gpCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIERhdmlkIEMuIE5pZW1pCisgKgorICoKKyAqIE1vZHVsZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyczoKKyAqICAgbGluZW91dCAgaWYgMSB0aGUgTElORSBqYWNrIGlzIHVzZWQgYXMgYW4gb3V0cHV0IGluc3RlYWQgb2YgYW4gaW5wdXQuCisgKiAgICAgICAgICAgIExJTkUgdGhlbiBjb250YWlucyB0aGUgdW5taXhlZCBkc3Agb3V0cHV0LiBUaGlzIGNhbiBiZSB1c2VkCisgKiAgICAgICAgICAgIHRvIG1ha2UgdGhlIGNhcmQgYSBmb3VyIGNoYW5uZWwgb25lOiB1c2UgZHNwIHRvIG91dHB1dCB0d28KKyAqICAgICAgICAgICAgY2hhbm5lbHMgdG8gTElORSBhbmQgZGFjIHRvIG91dHB1dCB0aGUgb3RoZXIgdHdvIGNoYW5uZWxzIHRvCisgKiAgICAgICAgICAgIFNQS1IuIFNldCB0aGUgbWl4ZXIgdG8gb25seSBvdXRwdXQgc3ludGggdG8gU1BLUi4KKyAqICAgbWljYmlhcyAgc2V0cyB0aGUgKzVWIGJpYXMgdG8gdGhlIG1pYyBpZiB1c2luZyBhbiBlbGVjdHJldG1pYy4KKyAqICAgICAgICAgICAgCisgKgorICogIE5vdGU6IHN5bmMgbW9kZSBpcyBub3QgeWV0IHN1cHBvcnRlZCAoaS5lLiBydW5uaW5nIGRzcCBhbmQgZGFjIGZyb20gdGhlIHNhbWUKKyAqICBjbG9jayBzb3VyY2UpCisgKgorICogIFN1cHBvcnRlZCBkZXZpY2VzOgorICogIC9kZXYvZHNwICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21peGVyICBzdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L2RzcDEgICBhZGRpdGlvbmFsIERBQywgbGlrZSAvZGV2L2RzcCwgYnV0IG91dHB1dCBvbmx5LAorICogICAgICAgICAgICAgIG9ubHkgNTUxMiwgMTEwMjUsIDIyMDUwIGFuZCA0NDEwMCBzYW1wbGVzL3MsCisgKiAgICAgICAgICAgICAgb3V0cHV0cyB0byBtaXhlciAiU1lOVEgiIHNldHRpbmcKKyAqICAvZGV2L21pZGkgICBzaW1wbGUgTUlESSBVQVJUIGludGVyZmFjZSwgbm8gaW9jdGwKKyAqCisgKiAgTk9URTogdGhlIGNhcmQgZG9lcyBub3QgaGF2ZSBhbnkgRk0vV2F2ZXRhYmxlIHN5bnRoZXNpemVyLCBpdCBpcyBzdXBwb3NlZAorICogIHRvIGJlIGRvbmUgaW4gc29mdHdhcmUuIFRoYXQgaXMgd2hhdCAvZGV2L2RhYyBpcyBmb3IuIEJ5IG5vdyAoUTIgMTk5OCkKKyAqICB0aGVyZSBhcmUgc2V2ZXJhbCBNSURJIHRvIFBDTSAoV0FWKSBwYWNrYWdlcywgb25lIG9mIHRoZW0gaXMgdGltaWRpdHkuCisgKgorICogIFJldmlzaW9uIGhpc3RvcnkKKyAqICAgIDI2LjAzLjE5OTggICAwLjEgICBJbml0aWFsIHJlbGVhc2UKKyAqICAgIDMxLjAzLjE5OTggICAwLjIgICBGaXggYnVnIGluIEdFVE9TUEFDRQorICogICAgMDQuMDQuMTk5OCAgIDAuMyAgIE1ha2UgaXQgd29yayAoYWdhaW4pIHVuZGVyIDIuMC4zMworICogICAgICAgICAgICAgICAgICAgICAgIEZpeCBtaXhlciB3cml0ZSBvcGVyYXRpb24gbm90IHJldHVybmluZyB0aGUgYWN0dWFsCisgKiAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MKKyAqICAgIDA1LjA0LjE5OTggICAwLjQgICBGaXJzdCBhdHRlbXB0IGF0IHVzaW5nIHRoZSBuZXcgUENJIHN0dWZmCisgKiAgICAyOS4wNC4xOTk4ICAgMC41ICAgRml4IGhhbmcgd2hlbiBeQyBpcyBwcmVzc2VkIG9uIGFtcAorICogICAgMDcuMDUuMTk5OCAgIDAuNiAgIERvbid0IGRvdWJsZSBsb2NrIGFyb3VuZCBzdG9wXyooKSBpbiAqX3JlbGVhc2UoKQorICogICAgMTAuMDUuMTk5OCAgIDAuNyAgIEZpcnN0IHN0YWIgYXQgYSBzaW1wbGUgbWlkaSBpbnRlcmZhY2UgKG5vIGJlbGxzJndoaXN0bGVzKQorICogICAgMTQuMDUuMTk5OCAgIDAuOCAgIERvbid0IGFsbG93IGV4Y2Vzc2l2ZSBpbnRlcnJ1cHQgcmF0ZXMKKyAqICAgIDA4LjA2LjE5OTggICAwLjkgICBGaXJzdCByZWxlYXNlIHVzaW5nIEFsYW4gQ294JyBzb3VuZGNvcmUgaW5zdGVhZCBvZgorICogICAgICAgICAgICAgICAgICAgICAgIG1pc2NkZXZpY2UKKyAqICAgIDA1LjA3LjE5OTggICAwLjEwICBGaXhlZCB0aGUgZHJpdmVyIHRvIGNvcnJlY3RseSBtYWludGluIE9TUyBzdHlsZSB2b2x1bWUKKyAqICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncyAobm90IHN1cmUgaWYgdGhpcyBzaG91bGQgYmUgc3RhbmRhcmQpCisgKiAgICAgICAgICAgICAgICAgICAgICAgRml4ZWQgbWFueSByZWZlcmVuY2VzOiBmX2ZsYWdzIHNob3VsZCBiZSBmX21vZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAtLSBHZXJhbGQgQnJpdHRvbiA8Z2JyaXR0b25AbWl0LmVkdT4KKyAqICAgIDAzLjA4LjE5OTggICAwLjExICBOb3cgbWl4ZXIgYmVoYXZpb3VyIGNhbiBiYXNpY2FsbHkgYmUgc2VsZWN0ZWQgYmV0d2VlbgorICogICAgICAgICAgICAgICAgICAgICAgICJPU1MgZG9jdW1lbnRlZCIgYW5kICJPU1MgYWN0dWFsIiBiZWhhdmlvdXIKKyAqICAgICAgICAgICAgICAgICAgICAgICBGaXhlZCBtaXhlciB0YWJsZSB0aGFua3MgdG8gSGFrYW4uTGVubmVzdGFsQGx1LmVyaXNvZnQuc2UKKyAqICAgICAgICAgICAgICAgICAgICAgICBPbiBtb2R1bGUgc3RhcnR1cCwgc2V0IERBQzIgdG8gMTFrU1BTIGluc3RlYWQgb2YgNS41a1NQUywKKyAqICAgICAgICAgICAgICAgICAgICAgICBhcyBpdCBwcm9kdWNlcyBhbiBhbm5veWluZyBzc3NzaCBpbiB0aGUgbG93ZXIgc2FtcGxpbmcgcmF0ZQorICogICAgICAgICAgICAgICAgICAgICAgIERvIG5vdCBpbmNsdWRlIG1vZHZlcnNpb25zLmgKKyAqICAgIDIyLjA4LjE5OTggICAwLjEyICBNaXhlciByZWdpc3RlcnMgYWN0dWFsbHkgaGF2ZSA1IGluc3RlYWQgb2YgNCBiaXRzCisgKiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlZCBvdXQgYnkgSXRhaSBOYWhzaG9uCisgKiAgICAzMS4wOC4xOTk4ICAgMC4xMyAgRml4IHJlYWxwbGF5ZXIgcHJvYmxlbXMgLSBkYWMuY291bnQgaXNzdWVzCisgKiAgICAwOC4xMC4xOTk4ICAgMC4xNCAgSm95c3RpY2sgc3VwcG9ydCBmaXhlZAorICoJCSAgICAgICAgIC0tIE9saXZlciBOZXVrdW0gPGMxODhAb3JnLmNoZW1pZS51bmktbXVlbmNoZW4uZGU+CisgKiAgICAxMC4xMi4xOTk4ICAgMC4xNSAgRml4IGRyYWluX2RhYyB0cnlpbmcgdG8gd2FpdCBvbiBub3QgeWV0IGluaXRpYWxpemVkIERNQQorICogICAgMTYuMTIuMTk5OCAgIDAuMTYgIERvbid0IHdha2UgdXAgYXBwIHVudGlsIHRoZXJlIGFyZSBmcmFnc2l6ZSBieXRlcyB0byByZWFkL3dyaXRlCisgKiAgICAwNi4wMS4xOTk5ICAgMC4xNyAgcmVtb3ZlIHRoZSBzaWxseSBTQV9JTlRFUlJVUFQgZmxhZy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBob3BlZnVsbHkga2lsbGVkIHRoZSBlZ2NzIHNlY3Rpb24gdHlwZSBjb25mbGljdAorICogICAgMTIuMDMuMTk5OSAgIDAuMTggIGNpbmZvLmJsb2NrcyBzaG91bGQgYmUgcmVzZXQgYWZ0ZXIgR0VUeFBUUiBpb2N0bC4KKyAqICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBieSBKb2hhbiBNYWVzIDxqb21hQHRlbGluZHVzLmJlPgorICogICAgMjIuMDMuMTk5OSAgIDAuMTkgIHJldHVybiBFQUdBSU4gaW5zdGVhZCBvZiBFQlVTWSB3aGVuIE9fTk9OQkxPQ0sKKyAqICAgICAgICAgICAgICAgICAgICAgICByZWFkL3dyaXRlIGNhbm5vdCBiZSBleGVjdXRlZAorICogICAgMDcuMDQuMTk5OSAgIDAuMjAgIGltcGxlbWVudGVkIHRoZSBmb2xsb3dpbmcgaW9jdGwnczogU09VTkRfUENNX1JFQURfUkFURSwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgU09VTkRfUENNX1JFQURfQ0hBTk5FTFMsIFNPVU5EX1BDTV9SRUFEX0JJVFM7IAorICogICAgICAgICAgICAgICAgICAgICAgIEFscGhhIGZpeGVzIHJlcG9ydGVkIGJ5IFBldGVyIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBqb3lzdGljayBhZGRyZXNzIGhhbmRsaW5nIG1pZ2h0IHN0aWxsIGJlIHdyb25nIG9uIGFyY2hzCisgKiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgdGhhbiBpMzg2CisgKiAgICAxMC4wNS4xOTk5ICAgMC4yMSAgQWRkZWQgc3VwcG9ydCBmb3IgYW4gZWxlY3RyZXQgbWljIGZvciBTQiBQQ0k2NAorICogICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBMaW51eCBrZXJuZWwgc291bmQgZHJpdmVyLiBUaGlzIG1vZCBhbHNvIHN0cmFpZ2h0ZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICBvdXQgdGhlIHF1ZXN0aW9uIG1hcmtzIGFyb3VuZCB0aGUgbWljIGltcGVkYW5jZSBzZXR0aW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgKG1pY3opLiBGcm9tIEtpbS5CZXJ0c0BmaXN1Yi5tYWlsLmFiYi5jb20KKyAqICAgIDExLjA1LjE5OTkgICAwLjIyICBJbXBsZW1lbnRlZCB0aGUgSU1JWCBjYWxsIHRvIG11dGUgcmVjb3JkaW5nIG1vbml0b3IuCisgKiAgICAgICAgICAgICAgICAgICAgICAgR3VlbnRlciBHZWlnZXIgPGdlaWdlckBlcHkuY28uYXQ+CisgKiAgICAxNS4wNi4xOTk5ICAgMC4yMyAgRml4IGJhZCBhbGxvY2F0aW9uIGJ1Zy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBUaGFua3MgdG8gRGV0aSBGbGllZ2wgPGZsaWVnbEBpbi50dW0uZGU+CisgKiAgICAyOC4wNi4xOTk5ICAgMC4yNCAgQWRkIHBjaV9zZXRfbWFzdGVyCisgKiAgICAwMi4wOC4xOTk5ICAgMC4yNSAgQWRkZWQgd29ya2Fyb3VuZCBmb3IgdGhlICJwaGFudG9tIHdyaXRlIiBidWcgZmlyc3QKKyAqICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGVkIGJ5IERhdmUgU2hhcnBsZXNzIGZyb20gQW5jaG9yIEdhbWVzCisgKiAgICAwMy4wOC4xOTk5ICAgMC4yNiAgYWRhcHQgdG8gTGludXMnIG5ldyBfX3NldHVwL19faW5pdGNhbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBrZXJuZWwgY29tbWFuZCBsaW5lIG9wdGlvbiAiZXMxMzcwPWpveXN0aWNrWyxsaW5lb3V0WyxtaWNiaWFzXV0iCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBDT05GSUdfU09VTkRfRVMxMzcwX0pPWVBPUlRfQk9PVCBrbHVkZ2UKKyAqICAgIDEyLjA4LjE5OTkgICAwLjI3ICBtb2R1bGVfaW5pdC9fX3NldHVwIGZpeGVzCisgKiAgICAxOS4wOC4xOTk5ICAgMC4yOCAgU09VTkRfTUlYRVJfSU1JWCBmaXhlcywgcmVwb3J0ZWQgYnkgR2lhbmx1Y2EgPGdpYWxsdWNhQG1haWwudGlzY2FsaW5ldC5pdD4KKyAqICAgIDMxLjA4LjE5OTkgICAwLjI5ICBhZGQgc3Bpbl9sb2NrX2luaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZCBjdXJyZW50LT5zdGF0ZSA9IHggd2l0aCBzZXRfY3VycmVudF9zdGF0ZSh4KQorICogICAgMDMuMDkuMTk5OSAgIDAuMzAgIGNoYW5nZSByZWFkIHNlbWFudGljcyBmb3IgTUlESSB0byBtYXRjaAorICogICAgICAgICAgICAgICAgICAgICAgIE9TUyBtb3JlIGNsb3NlbHk7IHJlbW92ZSBwb3NzaWJsZSB3YWtldXAgcmFjZQorICogICAgMjguMTAuMTk5OSAgIDAuMzEgIE1vcmUgd2FpdHF1ZXVlIHJhY2VzIGZpeGVkCisgKiAgICAwOC4wMS4yMDAwICAgMC4zMiAgUHJldmVudCBzb21lIGlvY3RsJ3MgZnJvbSByZXR1cm5pbmcgYmFkIGNvdW50IHZhbHVlcyBvbiB1bmRlcnJ1bi9vdmVycnVuOworICogICAgICAgICAgICAgICAgICAgICAgIFRpbSBKYW5paydzIEJTRSAoQmVkZXZpbGxlZCBTb3VuZCBFbmdpbmUpIGZvdW5kIHRoaXMKKyAqICAgIDA3LjAyLjIwMDAgICAwLjMzICBVc2UgcGNpX2FsbG9jX2NvbnNpc3RlbnQgYW5kIHBjaV9yZWdpc3Rlcl9kcml2ZXIKKyAqICAgIDIxLjExLjIwMDAgICAwLjM0ICBJbml0aWFsaXplIGRtYSBidWZmZXJzIGluIHBvbGwsIG90aGVyd2lzZSBwb2xsIG1heSByZXR1cm4gYSBib2d1cyBtYXNrCisgKiAgICAxMi4xMi4yMDAwICAgMC4zNSAgTW9yZSBkbWEgYnVmZmVyIGluaXRpYWxpemF0aW9ucywgcGF0Y2ggZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgIFRqZWVyZCBNdWxkZXIgPHRqZWVyZC5tdWxkZXJAZnVqaXRzdS1zaWVtZW5zLmNvbT4KKyAqICAgIDA3LjAxLjIwMDEgICAwLjM2ICBUaW1lb3V0IGNoYW5nZSBpbiB3cmNvZGVjIGFzIHJlcXVlc3RlZCBieSBGcmFuayBLbGVtbSA8cGZrQGZ1Y2hzLm9mZmwudW5pLWplbmEuZGU+CisgKiAgICAzMS4wMS4yMDAxICAgMC4zNyAgUmVnaXN0ZXIvVW5yZWdpc3RlciBnYW1lcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgIEZpeCBTRVRUUklHR0VSIG5vbiBPU1MgQVBJIGNvbmZvcm1pdHkKKyAqICAgIDAzLjAxLjIwMDMgICAwLjM4ICBvcGVuX21vZGUgZml4ZXMgZnJvbSBHZW9yZyBBY2hlciA8YWNoZXJAaW4udHVtLmRlPgorICoKKyAqIHNvbWUgaW1wb3J0YW50IHRoaW5ncyBtaXNzaW5nIGluIEVuc29uaXEgZG9jdW1lbnRhdGlvbjoKKyAqCisgKiBFeHBlcmltZW50YWwgUENMS0RJViByZXN1bHRzOiAgcGxheSB0aGUgc2FtZSB3YXZlZm9ybXMgb24gYm90aCBEQUMxIGFuZCBEQUMyCisgKiBhbmQgdmFyeSBQQ0xLRElWIHRvIG9idGFpbiB6ZXJvIGJlYXQuCisgKiAgNTUxMnNwczogIDI1NAorICogNDQxMDBzcHM6ICAgMzAKKyAqIHNlZW1zIHRvIGJlIGZzID0gMTQxMTIwMC8oUENMS0RJVisyKQorICoKKyAqIHNob3VsZCBmaW5kIG91dCB3aGVuIGN1cnJfc2FtcGxlX2N0IGlzIGNsZWFyZWQgYW5kCisgKiB3aGVyZSBleGFjdGx5IHRoZSBDQ0IgZmV0Y2hlcyBkYXRhCisgKgorICogVGhlIGNhcmQgdXNlcyBhIDIyLjU3OTIgTUh6IGNyeXN0YWwuCisgKiBUaGUgTElORUlOIGphY2sgbWF5IGJlIGNvbnZlcnRlZCB0byBhbiBBT1VUIGphY2sgYnkKKyAqIHNldHRpbmcgcGluIDQ3IChYQ1RMMCkgb2YgdGhlIEVTMTM3MCB0byBoaWdoLgorICogUGluIDQ4IChYQ1RMMSkgb2YgdGhlIEVTMTM3MCBzZXRzIHRoZSArNVYgYmlhcyBmb3IgYW4gZWxlY3RyZXRtaWMKKyAqIAorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisjZGVmaW5lIERCRyh4KSB7fQorLyojZGVmaW5lIERCRyh4KSB7eH0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0VOU09OSVEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FTlNPTklRICAgICAgICAweDEyNzQgICAgCisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcwCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzAgMHg1MDAwCisjZW5kaWYKKworI2RlZmluZSBFUzEzNzBfTUFHSUMgICgoUENJX1ZFTkRPUl9JRF9FTlNPTklRPDwxNil8UENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MCkKKworI2RlZmluZSBFUzEzNzBfRVhURU5UICAgICAgICAgICAgIDB4NDAKKyNkZWZpbmUgSk9ZX0VYVEVOVCAgICAgICAgICAgICAgICA4CisKKyNkZWZpbmUgRVMxMzcwX1JFR19DT05UUk9MICAgICAgICAweDAwCisjZGVmaW5lIEVTMTM3MF9SRUdfU1RBVFVTICAgICAgICAgMHgwNAorI2RlZmluZSBFUzEzNzBfUkVHX1VBUlRfREFUQSAgICAgIDB4MDgKKyNkZWZpbmUgRVMxMzcwX1JFR19VQVJUX1NUQVRVUyAgICAweDA5CisjZGVmaW5lIEVTMTM3MF9SRUdfVUFSVF9DT05UUk9MICAgMHgwOQorI2RlZmluZSBFUzEzNzBfUkVHX1VBUlRfVEVTVCAgICAgIDB4MGEKKyNkZWZpbmUgRVMxMzcwX1JFR19NRU1QQUdFICAgICAgICAweDBjCisjZGVmaW5lIEVTMTM3MF9SRUdfQ09ERUMgICAgICAgICAgMHgxMAorI2RlZmluZSBFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MIDB4MjAKKyNkZWZpbmUgRVMxMzcwX1JFR19EQUMxX1NDT1VOVCAgICAweDI0CisjZGVmaW5lIEVTMTM3MF9SRUdfREFDMl9TQ09VTlQgICAgMHgyOAorI2RlZmluZSBFUzEzNzBfUkVHX0FEQ19TQ09VTlQgICAgIDB4MmMKKworI2RlZmluZSBFUzEzNzBfUkVHX0RBQzFfRlJBTUVBRFIgICAgMHhjMzAKKyNkZWZpbmUgRVMxMzcwX1JFR19EQUMxX0ZSQU1FQ05UICAgIDB4YzM0CisjZGVmaW5lIEVTMTM3MF9SRUdfREFDMl9GUkFNRUFEUiAgICAweGMzOAorI2RlZmluZSBFUzEzNzBfUkVHX0RBQzJfRlJBTUVDTlQgICAgMHhjM2MKKyNkZWZpbmUgRVMxMzcwX1JFR19BRENfRlJBTUVBRFIgICAgIDB4ZDMwCisjZGVmaW5lIEVTMTM3MF9SRUdfQURDX0ZSQU1FQ05UICAgICAweGQzNAorI2RlZmluZSBFUzEzNzBfUkVHX1BIQU5UT01fRlJBTUVBRFIgMHhkMzgKKyNkZWZpbmUgRVMxMzcwX1JFR19QSEFOVE9NX0ZSQU1FQ05UIDB4ZDNjCisKKyNkZWZpbmUgRVMxMzcwX0ZNVF9VOF9NT05PICAgICAwCisjZGVmaW5lIEVTMTM3MF9GTVRfVThfU1RFUkVPICAgMQorI2RlZmluZSBFUzEzNzBfRk1UX1MxNl9NT05PICAgIDIKKyNkZWZpbmUgRVMxMzcwX0ZNVF9TMTZfU1RFUkVPICAzCisjZGVmaW5lIEVTMTM3MF9GTVRfU1RFUkVPICAgICAgMQorI2RlZmluZSBFUzEzNzBfRk1UX1MxNiAgICAgICAgIDIKKyNkZWZpbmUgRVMxMzcwX0ZNVF9NQVNLICAgICAgICAzCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGRhYzFfc2FtcGxlcmF0ZVtdID0geyA1NTEyLCAxMTAyNSwgMjIwNTAsIDQ0MTAwIH07CisKKyNkZWZpbmUgREFDMl9TUlRPRElWKHgpICgoKDE0MTEyMDArKHgpLzIpLyh4KSktMikKKyNkZWZpbmUgREFDMl9ESVZUT1NSKHgpICgxNDExMjAwLygoeCkrMikpCisKKyNkZWZpbmUgQ1RSTF9BRENfU1RPUCAgIDB4ODAwMDAwMDAgIC8qIDEgPSBBREMgc3RvcHBlZCAqLworI2RlZmluZSBDVFJMX1hDVEwxICAgICAgMHg0MDAwMDAwMCAgLyogZWxlY3RyZXQgbWljIGJpYXMgKi8KKyNkZWZpbmUgQ1RSTF9PUEVOICAgICAgIDB4MjAwMDAwMDAgIC8qIG5vIGZ1bmN0aW9uLCBjYW4gYmUgcmVhZCBhbmQgd3JpdHRlbiAqLworI2RlZmluZSBDVFJMX1BDTEtESVYgICAgMHgxZmZmMDAwMCAgLyogQURDL0RBQzIgY2xvY2sgZGl2aWRlciAqLworI2RlZmluZSBDVFJMX1NIX1BDTEtESVYgMTYKKyNkZWZpbmUgQ1RSTF9NU0ZNVFNFTCAgIDB4MDAwMDgwMDAgIC8qIE1QRUcgc2VyaWFsIGRhdGEgZm10OiAwID0gU29ueSwgMSA9IEkyUyAqLworI2RlZmluZSBDVFJMX01fU0JCICAgICAgMHgwMDAwNDAwMCAgLyogREFDMiBjbG9jazogMCA9IFBDTEtESVYsIDEgPSBNUEVHICovCisjZGVmaW5lIENUUkxfV1RTUlNFTCAgICAweDAwMDAzMDAwICAvKiBEQUMxIGNsb2NrIGZyZXE6IDA9NTUxMiwgMT0xMTAyNSwgMj0yMjA1MCwgMz00NDEwMCAqLworI2RlZmluZSBDVFJMX1NIX1dUU1JTRUwgMTIKKyNkZWZpbmUgQ1RSTF9EQUNfU1lOQyAgIDB4MDAwMDA4MDAgIC8qIDEgPSBEQUMyIHJ1bnMgb2ZmIERBQzEgY2xvY2sgKi8KKyNkZWZpbmUgQ1RSTF9DQ0JfSU5UUk0gIDB4MDAwMDA0MDAgIC8qIDEgPSBDQ0IgInZvaWNlIiBpbnRzIGVuYWJsZWQgKi8KKyNkZWZpbmUgQ1RSTF9NX0NCICAgICAgIDB4MDAwMDAyMDAgIC8qIHJlY29yZGluZyBzb3VyY2U6IDAgPSBBREMsIDEgPSBNUEVHICovCisjZGVmaW5lIENUUkxfWENUTDAgICAgICAweDAwMDAwMTAwICAvKiAwID0gTGluZSBpbiwgMSA9IExpbmUgb3V0ICovCisjZGVmaW5lIENUUkxfQlJFUSAgICAgICAweDAwMDAwMDgwICAvKiAxID0gdGVzdCBtb2RlIChpbnRlcm5hbCBtZW0gdGVzdCkgKi8KKyNkZWZpbmUgQ1RSTF9EQUMxX0VOICAgIDB4MDAwMDAwNDAgIC8qIGVuYWJsZSBEQUMxICovCisjZGVmaW5lIENUUkxfREFDMl9FTiAgICAweDAwMDAwMDIwICAvKiBlbmFibGUgREFDMiAqLworI2RlZmluZSBDVFJMX0FEQ19FTiAgICAgMHgwMDAwMDAxMCAgLyogZW5hYmxlIEFEQyAqLworI2RlZmluZSBDVFJMX1VBUlRfRU4gICAgMHgwMDAwMDAwOCAgLyogZW5hYmxlIE1JREkgdWFydCAqLworI2RlZmluZSBDVFJMX0pZU1RLX0VOICAgMHgwMDAwMDAwNCAgLyogZW5hYmxlIEpveXN0aWNrIHBvcnQgKHByZXN1bWFibHkgYXQgYWRkcmVzcyAweDIwMCkgKi8KKyNkZWZpbmUgQ1RSTF9DRENfRU4gICAgIDB4MDAwMDAwMDIgIC8qIGVuYWJsZSBzZXJpYWwgKENPREVDKSBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgQ1RSTF9TRVJSX0RJUyAgIDB4MDAwMDAwMDEgIC8qIDEgPSBkaXNhYmxlIFBDSSBTRVJSIHNpZ25hbCAqLworCisjZGVmaW5lIFNUQVRfSU5UUiAgICAgICAweDgwMDAwMDAwICAvKiB3aXJlZCBvciBvZiBhbGwgaW50ZXJydXB0IGJpdHMgKi8KKyNkZWZpbmUgU1RBVF9DU1RBVCAgICAgIDB4MDAwMDA0MDAgIC8qIDEgPSBjb2RlYyBidXN5IG9yIGNvZGVjIHdyaXRlIGluIHByb2dyZXNzICovCisjZGVmaW5lIFNUQVRfQ0JVU1kgICAgICAweDAwMDAwMjAwICAvKiAxID0gY29kZWMgYnVzeSAqLworI2RlZmluZSBTVEFUX0NXUklQICAgICAgMHgwMDAwMDEwMCAgLyogMSA9IGNvZGVjIHdyaXRlIGluIHByb2dyZXNzICovCisjZGVmaW5lIFNUQVRfVkMgICAgICAgICAweDAwMDAwMDYwICAvKiBDQ0IgaW50IHNvdXJjZSwgMD1EQUMxLCAxPURBQzIsIDI9QURDLCAzPXVuZGVmICovCisjZGVmaW5lIFNUQVRfU0hfVkMgICAgICA1CisjZGVmaW5lIFNUQVRfTUNDQiAgICAgICAweDAwMDAwMDEwICAvKiBDQ0IgaW50IHBlbmRpbmcgKi8KKyNkZWZpbmUgU1RBVF9VQVJUICAgICAgIDB4MDAwMDAwMDggIC8qIFVBUlQgaW50IHBlbmRpbmcgKi8KKyNkZWZpbmUgU1RBVF9EQUMxICAgICAgIDB4MDAwMDAwMDQgIC8qIERBQzEgaW50IHBlbmRpbmcgKi8KKyNkZWZpbmUgU1RBVF9EQUMyICAgICAgIDB4MDAwMDAwMDIgIC8qIERBQzIgaW50IHBlbmRpbmcgKi8KKyNkZWZpbmUgU1RBVF9BREMgICAgICAgIDB4MDAwMDAwMDEgIC8qIEFEQyBpbnQgcGVuZGluZyAqLworCisjZGVmaW5lIFVTVEFUX1JYSU5UICAgICAweDgwICAgICAgICAvKiBVQVJUIHJ4IGludCBwZW5kaW5nICovCisjZGVmaW5lIFVTVEFUX1RYSU5UICAgICAweDA0ICAgICAgICAvKiBVQVJUIHR4IGludCBwZW5kaW5nICovCisjZGVmaW5lIFVTVEFUX1RYUkRZICAgICAweDAyICAgICAgICAvKiBVQVJUIHR4IHJlYWR5ICovCisjZGVmaW5lIFVTVEFUX1JYUkRZICAgICAweDAxICAgICAgICAvKiBVQVJUIHJ4IHJlYWR5ICovCisKKyNkZWZpbmUgVUNUUkxfUlhJTlRFTiAgIDB4ODAgICAgICAgIC8qIDEgPSBlbmFibGUgUlggaW50cyAqLworI2RlZmluZSBVQ1RSTF9UWElOVEVOICAgMHg2MCAgICAgICAgLyogVFggaW50IGVuYWJsZSBmaWVsZCBtYXNrICovCisjZGVmaW5lIFVDVFJMX0VOQV9UWElOVCAweDIwICAgICAgICAvKiBlbmFibGUgVFggaW50ICovCisjZGVmaW5lIFVDVFJMX0NOVFJMICAgICAweDAzICAgICAgICAvKiBjb250cm9sIGZpZWxkICovCisjZGVmaW5lIFVDVFJMX0NOVFJMX1NXUiAweDAzICAgICAgICAvKiBzb2Z0d2FyZSByZXNldCBjb21tYW5kICovCisKKyNkZWZpbmUgU0NUUkxfUDJFTkRJTkMgICAgMHgwMDM4MDAwMCAgLyogICovCisjZGVmaW5lIFNDVFJMX1NIX1AyRU5ESU5DIDE5CisjZGVmaW5lIFNDVFJMX1AyU1RJTkMgICAgIDB4MDAwNzAwMDAgIC8qICAqLworI2RlZmluZSBTQ1RSTF9TSF9QMlNUSU5DICAxNgorI2RlZmluZSBTQ1RSTF9SMUxPT1BTRUwgICAweDAwMDA4MDAwICAvKiAwID0gbG9vcCBtb2RlICovCisjZGVmaW5lIFNDVFJMX1AyTE9PUFNFTCAgIDB4MDAwMDQwMDAgIC8qIDAgPSBsb29wIG1vZGUgKi8KKyNkZWZpbmUgU0NUUkxfUDFMT09QU0VMICAgMHgwMDAwMjAwMCAgLyogMCA9IGxvb3AgbW9kZSAqLworI2RlZmluZSBTQ1RSTF9QMlBBVVNFICAgICAweDAwMDAxMDAwICAvKiAxID0gcGF1c2UgbW9kZSAqLworI2RlZmluZSBTQ1RSTF9QMVBBVVNFICAgICAweDAwMDAwODAwICAvKiAxID0gcGF1c2UgbW9kZSAqLworI2RlZmluZSBTQ1RSTF9SMUlOVEVOICAgICAweDAwMDAwNDAwICAvKiBlbmFibGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFNDVFJMX1AySU5URU4gICAgIDB4MDAwMDAyMDAgIC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0NUUkxfUDFJTlRFTiAgICAgMHgwMDAwMDEwMCAgLyogZW5hYmxlIGludGVycnVwdCAqLworI2RlZmluZSBTQ1RSTF9QMVNDVFJMRCAgICAweDAwMDAwMDgwICAvKiByZWxvYWQgc2FtcGxlIGNvdW50IHJlZ2lzdGVyIGZvciBEQUMxICovCisjZGVmaW5lIFNDVFJMX1AyREFDU0VOICAgIDB4MDAwMDAwNDAgIC8qIDEgPSBEQUMyIHBsYXkgYmFjayBsYXN0IHNhbXBsZSB3aGVuIGRpc2FibGVkICovCisjZGVmaW5lIFNDVFJMX1IxU0VCICAgICAgIDB4MDAwMDAwMjAgIC8qIDEgPSAxNmJpdCAqLworI2RlZmluZSBTQ1RSTF9SMVNNQiAgICAgICAweDAwMDAwMDEwICAvKiAxID0gc3RlcmVvICovCisjZGVmaW5lIFNDVFJMX1IxRk1UICAgICAgIDB4MDAwMDAwMzAgIC8qIGZvcm1hdCBtYXNrICovCisjZGVmaW5lIFNDVFJMX1NIX1IxRk1UICAgIDQKKyNkZWZpbmUgU0NUUkxfUDJTRUIgICAgICAgMHgwMDAwMDAwOCAgLyogMSA9IDE2Yml0ICovCisjZGVmaW5lIFNDVFJMX1AyU01CICAgICAgIDB4MDAwMDAwMDQgIC8qIDEgPSBzdGVyZW8gKi8KKyNkZWZpbmUgU0NUUkxfUDJGTVQgICAgICAgMHgwMDAwMDAwYyAgLyogZm9ybWF0IG1hc2sgKi8KKyNkZWZpbmUgU0NUUkxfU0hfUDJGTVQgICAgMgorI2RlZmluZSBTQ1RSTF9QMVNFQiAgICAgICAweDAwMDAwMDAyICAvKiAxID0gMTZiaXQgKi8KKyNkZWZpbmUgU0NUUkxfUDFTTUIgICAgICAgMHgwMDAwMDAwMSAgLyogMSA9IHN0ZXJlbyAqLworI2RlZmluZSBTQ1RSTF9QMUZNVCAgICAgICAweDAwMDAwMDAzICAvKiBmb3JtYXQgbWFzayAqLworI2RlZmluZSBTQ1RSTF9TSF9QMUZNVCAgICAwCisKKy8qIG1pc2Mgc3R1ZmYgKi8KKworI2RlZmluZSBGTU9ERV9EQUMgICAgICAgICA0ICAgICAgICAgICAvKiBzbGlnaHQgbWlzdXNlIG9mIG1vZGVfdCAqLworCisvKiBNSURJIGJ1ZmZlciBzaXplcyAqLworCisjZGVmaW5lIE1JRElJTkJVRiAgMjU2CisjZGVmaW5lIE1JRElPVVRCVUYgMjU2CisKKyNkZWZpbmUgRk1PREVfTUlESV9TSElGVCAzCisjZGVmaW5lIEZNT0RFX01JRElfUkVBRCAgKEZNT0RFX1JFQUQgPDwgRk1PREVfTUlESV9TSElGVCkKKyNkZWZpbmUgRk1PREVfTUlESV9XUklURSAoRk1PREVfV1JJVEUgPDwgRk1PREVfTUlESV9TSElGVCkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBlczEzNzBfc3RhdGUgeworCS8qIG1hZ2ljICovCisJdW5zaWduZWQgaW50IG1hZ2ljOworCisJLyogbGlzdCBvZiBlczEzNzAgZGV2aWNlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2czsKKworCS8qIHRoZSBjb3JyZXNwb25kaW5nIHBjaV9kZXYgc3RydWN0dXJlICovCisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfYXVkaW87CisJaW50IGRldl9taXhlcjsKKwlpbnQgZGV2X2RhYzsKKwlpbnQgZGV2X21pZGk7CisJCisJLyogaGFyZHdhcmUgcmVzb3VyY2VzICovCisJdW5zaWduZWQgbG9uZyBpbzsgLyogbG9uZyBmb3IgU1BBUkMgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOworCisJLyogbWl4ZXIgcmVnaXN0ZXJzOyB0aGVyZSBpcyBubyBIVyByZWFkYmFjayAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0IHZvbFsxMF07CisJCXVuc2lnbmVkIGludCByZWNzcmM7CisJCXVuc2lnbmVkIGludCBtb2RjbnQ7CisJCXVuc2lnbmVkIHNob3J0IG1pY3ByZWFtcDsKKwkgICAgICAgIHVuc2lnbmVkIGludCBpbWl4OworCX0gbWl4OworCisJLyogd2F2ZSBzdHVmZiAqLworCXVuc2lnbmVkIGN0cmw7CisJdW5zaWduZWQgc2N0cmw7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwltb2RlX3Qgb3Blbl9tb2RlOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCXN0cnVjdCBkbWFidWYgeworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hYWRkcjsKKwkJdW5zaWduZWQgYnVmb3JkZXI7CisJCXVuc2lnbmVkIG51bWZyYWc7CisJCXVuc2lnbmVkIGZyYWdzaGlmdDsKKwkJdW5zaWduZWQgaHdwdHIsIHN3cHRyOworCQl1bnNpZ25lZCB0b3RhbF9ieXRlczsKKwkJaW50IGNvdW50OworCQl1bnNpZ25lZCBlcnJvcjsgLyogb3Zlci91bmRlcnJ1biAqLworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCisJCXVuc2lnbmVkIGZyYWdzaXplOworCQl1bnNpZ25lZCBkbWFzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKwkJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIG1hcHBlZDoxOworCQl1bnNpZ25lZCByZWFkeToxOworCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CisJCXVuc2lnbmVkIGVuYWJsZWQ6MTsKKwkJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OworCQlpbnQgb3NzbWF4ZnJhZ3M7CisJCXVuc2lnbmVkIHN1YmRpdmlzaW9uOworCX0gZG1hX2RhYzEsIGRtYV9kYWMyLCBkbWFfYWRjOworCisJLyogVGhlIGZvbGxvd2luZyBidWZmZXIgaXMgdXNlZCB0byBwb2ludCB0aGUgcGhhbnRvbSB3cml0ZSBjaGFubmVsIHRvLiAqLworCXVuc2lnbmVkIGNoYXIgKmJ1Z2J1Zl9jcHU7CisJZG1hX2FkZHJfdCBidWdidWZfZG1hOworCisJLyogbWlkaSBzdHVmZiAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGlyZCwgaXdyLCBpY250OworCQl1bnNpZ25lZCBvcmQsIG93ciwgb2NudDsKKwkJd2FpdF9xdWV1ZV9oZWFkX3QgaXdhaXQ7CisJCXdhaXRfcXVldWVfaGVhZF90IG93YWl0OworCQl1bnNpZ25lZCBjaGFyIGlidWZbTUlESUlOQlVGXTsKKwkJdW5zaWduZWQgY2hhciBvYnVmW01JRElPVVRCVUZdOworCX0gbWlkaTsKKworCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIExJU1RfSEVBRChkZXZzKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbGQyKHVuc2lnbmVkIGludCB4KQoreworCXVuc2lnbmVkIHIgPSAwOworCQorCWlmICh4ID49IDB4MTAwMDApIHsKKwkJeCA+Pj0gMTY7CisJCXIgKz0gMTY7CisJfQorCWlmICh4ID49IDB4MTAwKSB7CisJCXggPj49IDg7CisJCXIgKz0gODsKKwl9CisJaWYgKHggPj0gMHgxMCkgeworCQl4ID4+PSA0OworCQlyICs9IDQ7CisJfQorCWlmICh4ID49IDQpIHsKKwkJeCA+Pj0gMjsKKwkJciArPSAyOworCX0KKwlpZiAoeCA+PSAyKQorCQlyKys7CisJcmV0dXJuIHI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCB3cmNvZGVjKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgaWR4LCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyB0bW8gPSBqaWZmaWVzICsgSFovMTAsIGo7CisJCisJZG8geworCQlqID0gamlmZmllczsKKwkJaWYgKCEoaW5sKHMtPmlvK0VTMTM3MF9SRUdfU1RBVFVTKSAmIFNUQVRfQ1NUQVQpKSB7CisJCQlvdXR3KCgoKHVuc2lnbmVkIHNob3J0KWlkeCk8PDgpfGRhdGEsIHMtPmlvK0VTMTM3MF9SRUdfQ09ERUMpOworCQkJcmV0dXJuOworCQl9CisJCXNjaGVkdWxlKCk7CisJfSB3aGlsZSAoKHNpZ25lZCkodG1vLWopID4gMCk7CisJcHJpbnRrKEtFUk5fRVJSICJlczEzNzA6IHdyaXRlIHRvIGNvZGVjIHJlZ2lzdGVyIHRpbWVvdXRcbiIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfYWRjKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+Y3RybCAmPSB+Q1RSTF9BRENfRU47CisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2RhYzEoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5jdHJsICY9IH5DVFJMX0RBQzFfRU47CisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2RhYzIoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5jdHJsICY9IH5DVFJMX0RBQzJfRU47CisJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2RhYzEoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGZyYWdyZW1haW4sIGZzaGlmdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+Y3RybCAmIENUUkxfREFDMV9FTikgJiYgKHMtPmRtYV9kYWMxLm1hcHBlZCB8fCBzLT5kbWFfZGFjMS5jb3VudCA+IDApCisJICAgICYmIHMtPmRtYV9kYWMxLnJlYWR5KSB7CisJCXMtPmN0cmwgfD0gQ1RSTF9EQUMxX0VOOworCQlzLT5zY3RybCA9IChzLT5zY3RybCAmIH4oU0NUUkxfUDFMT09QU0VMIHwgU0NUUkxfUDFQQVVTRSB8IFNDVFJMX1AxU0NUUkxEKSkgfCBTQ1RSTF9QMUlOVEVOOworCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJZnJhZ3JlbWFpbiA9ICgoLSBzLT5kbWFfZGFjMS5od3B0cikgJiAocy0+ZG1hX2RhYzEuZnJhZ3NpemUtMSkpOworCQlmc2hpZnQgPSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUDFGTVQpID4+IFNDVFJMX1NIX1AxRk1UXTsKKwkJaWYgKGZyYWdyZW1haW4gPCAyKmZzaGlmdCkKKwkJCWZyYWdyZW1haW4gPSBzLT5kbWFfZGFjMS5mcmFnc2l6ZTsKKwkJb3V0bCgoZnJhZ3JlbWFpbiA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcwX1JFR19EQUMxX1NDT1VOVCk7CisJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwkJb3V0bCgocy0+ZG1hX2RhYzEuZnJhZ3NpemUgPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MF9SRUdfREFDMV9TQ09VTlQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMyKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBmcmFncmVtYWluLCBmc2hpZnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPmN0cmwgJiBDVFJMX0RBQzJfRU4pICYmIChzLT5kbWFfZGFjMi5tYXBwZWQgfHwgcy0+ZG1hX2RhYzIuY291bnQgPiAwKQorCSAgICAmJiBzLT5kbWFfZGFjMi5yZWFkeSkgeworCQlzLT5jdHJsIHw9IENUUkxfREFDMl9FTjsKKwkJcy0+c2N0cmwgPSAocy0+c2N0cmwgJiB+KFNDVFJMX1AyTE9PUFNFTCB8IFNDVFJMX1AyUEFVU0UgfCBTQ1RSTF9QMkRBQ1NFTiB8IAorCQkJCQkgU0NUUkxfUDJFTkRJTkMgfCBTQ1RSTF9QMlNUSU5DKSkgfCBTQ1RSTF9QMklOVEVOIHwKKwkJCSgoKHMtPnNjdHJsICYgU0NUUkxfUDJGTVQpID8gMiA6IDEpIDw8IFNDVFJMX1NIX1AyRU5ESU5DKSB8IAorCQkJKDAgPDwgU0NUUkxfU0hfUDJTVElOQyk7CisJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCQlmcmFncmVtYWluID0gKCgtIHMtPmRtYV9kYWMyLmh3cHRyKSAmIChzLT5kbWFfZGFjMi5mcmFnc2l6ZS0xKSk7CisJCWZzaGlmdCA9IHNhbXBsZV9zaGlmdFsocy0+c2N0cmwgJiBTQ1RSTF9QMkZNVCkgPj4gU0NUUkxfU0hfUDJGTVRdOworCQlpZiAoZnJhZ3JlbWFpbiA8IDIqZnNoaWZ0KQorCQkJZnJhZ3JlbWFpbiA9IHMtPmRtYV9kYWMyLmZyYWdzaXplOworCQlvdXRsKChmcmFncmVtYWluID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzBfUkVHX0RBQzJfU0NPVU5UKTsKKwkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOworCQlvdXRsKChzLT5kbWFfZGFjMi5mcmFnc2l6ZSA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcwX1JFR19EQUMyX1NDT1VOVCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgZnJhZ3JlbWFpbiwgZnNoaWZ0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5jdHJsICYgQ1RSTF9BRENfRU4pICYmIChzLT5kbWFfYWRjLm1hcHBlZCB8fCBzLT5kbWFfYWRjLmNvdW50IDwgKHNpZ25lZCkocy0+ZG1hX2FkYy5kbWFzaXplIC0gMipzLT5kbWFfYWRjLmZyYWdzaXplKSkKKwkgICAgJiYgcy0+ZG1hX2FkYy5yZWFkeSkgeworCQlzLT5jdHJsIHw9IENUUkxfQURDX0VOOworCQlzLT5zY3RybCA9IChzLT5zY3RybCAmIH5TQ1RSTF9SMUxPT1BTRUwpIHwgU0NUUkxfUjFJTlRFTjsKKwkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCWZyYWdyZW1haW4gPSAoKC0gcy0+ZG1hX2FkYy5od3B0cikgJiAocy0+ZG1hX2FkYy5mcmFnc2l6ZS0xKSk7CisJCWZzaGlmdCA9IHNhbXBsZV9zaGlmdFsocy0+c2N0cmwgJiBTQ1RSTF9SMUZNVCkgPj4gU0NUUkxfU0hfUjFGTVRdOworCQlpZiAoZnJhZ3JlbWFpbiA8IDIqZnNoaWZ0KQorCQkJZnJhZ3JlbWFpbiA9IHMtPmRtYV9hZGMuZnJhZ3NpemU7CisJCW91dGwoKGZyYWdyZW1haW4gPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MF9SRUdfQURDX1NDT1VOVCk7CisJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwkJb3V0bCgocy0+ZG1hX2FkYy5mcmFnc2l6ZSA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcwX1JFR19BRENfU0NPVU5UKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAoMTctUEFHRV9TSElGVCkKKyNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKKworc3RhdGljIGlubGluZSB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWlmIChkYi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIsIGRiLT5yYXdidWYsIGRiLT5kbWFhZGRyKTsKKwl9CisJZGItPnJhd2J1ZiA9IE5VTEw7CisJZGItPm1hcHBlZCA9IGRiLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIsIHVuc2lnbmVkIHJhdGUsIHVuc2lnbmVkIGZtdCwgdW5zaWduZWQgcmVnKQoreworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBieXRlcGVyc2VjOworCXVuc2lnbmVkIGJ1ZnM7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJZGItPmh3cHRyID0gZGItPnN3cHRyID0gZGItPnRvdGFsX2J5dGVzID0gZGItPmNvdW50ID0gZGItPmVycm9yID0gZGItPmVuZGNsZWFyZWQgPSAwOworCWlmICghZGItPnJhd2J1ZikgeworCQlkYi0+cmVhZHkgPSBkYi0+bWFwcGVkID0gMDsKKwkJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkKKwkJCWlmICgoZGItPnJhd2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHMtPmRldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAmZGItPmRtYWFkZHIpKSkKKwkJCQlicmVhazsKKwkJaWYgKCFkYi0+cmF3YnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWRiLT5idWZvcmRlciA9IG9yZGVyOworCQkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisJfQorCWZtdCAmPSBFUzEzNzBfRk1UX01BU0s7CisJYnl0ZXBlcnNlYyA9IHJhdGUgPDwgc2FtcGxlX3NoaWZ0W2ZtdF07CisJYnVmcyA9IFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXI7CisJaWYgKGRiLT5vc3NmcmFnc2hpZnQpIHsKKwkJaWYgKCgxMDAwIDw8IGRiLT5vc3NmcmFnc2hpZnQpIDwgYnl0ZXBlcnNlYykKKwkJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAwKTsKKwkJZWxzZQorCQkJZGItPmZyYWdzaGlmdCA9IGRiLT5vc3NmcmFnc2hpZnQ7CisJfSBlbHNlIHsKKwkJZGItPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjLzEwMC8oZGItPnN1YmRpdmlzaW9uID8gZGItPnN1YmRpdmlzaW9uIDogMSkpOworCQlpZiAoZGItPmZyYWdzaGlmdCA8IDMpCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gMzsKKwl9CisJZGItPm51bWZyYWcgPSBidWZzID4+IGRiLT5mcmFnc2hpZnQ7CisJd2hpbGUgKGRiLT5udW1mcmFnIDwgNCAmJiBkYi0+ZnJhZ3NoaWZ0ID4gMykgeworCQlkYi0+ZnJhZ3NoaWZ0LS07CisJCWRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OworCX0KKwlkYi0+ZnJhZ3NpemUgPSAxIDw8IGRiLT5mcmFnc2hpZnQ7CisJaWYgKGRiLT5vc3NtYXhmcmFncyA+PSA0ICYmIGRiLT5vc3NtYXhmcmFncyA8IGRiLT5udW1mcmFnKQorCQlkYi0+bnVtZnJhZyA9IGRiLT5vc3NtYXhmcmFnczsKKwlkYi0+ZnJhZ3NhbXBsZXMgPSBkYi0+ZnJhZ3NpemUgPj4gc2FtcGxlX3NoaWZ0W2ZtdF07CisJZGItPmRtYXNpemUgPSBkYi0+bnVtZnJhZyA8PCBkYi0+ZnJhZ3NoaWZ0OworCW1lbXNldChkYi0+cmF3YnVmLCAoZm10ICYgRVMxMzcwX0ZNVF9TMTYpID8gMCA6IDB4ODAsIGRiLT5kbWFzaXplKTsKKwlvdXRsKChyZWcgPj4gOCkgJiAxNSwgcy0+aW8rRVMxMzcwX1JFR19NRU1QQUdFKTsKKwlvdXRsKGRiLT5kbWFhZGRyLCBzLT5pbysocmVnICYgMHhmZikpOworCW91dGwoKGRiLT5kbWFzaXplID4+IDIpLTEsIHMtPmlvKygocmVnICsgNCkgJiAweGZmKSk7CisJZGItPmVuYWJsZWQgPSAxOworCWRiLT5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2FkYyhzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzKQoreworCXN0b3BfYWRjKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYywgREFDMl9ESVZUT1NSKChzLT5jdHJsICYgQ1RSTF9QQ0xLRElWKSA+PiBDVFJMX1NIX1BDTEtESVYpLAorCQkJICAgKHMtPnNjdHJsID4+IFNDVFJMX1NIX1IxRk1UKSAmIEVTMTM3MF9GTVRfTUFTSywgRVMxMzcwX1JFR19BRENfRlJBTUVBRFIpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9kYWMyKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJc3RvcF9kYWMyKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYzIsIERBQzJfRElWVE9TUigocy0+Y3RybCAmIENUUkxfUENMS0RJVikgPj4gQ1RSTF9TSF9QQ0xLRElWKSwKKwkJCSAgIChzLT5zY3RybCA+PiBTQ1RSTF9TSF9QMkZNVCkgJiBFUzEzNzBfRk1UX01BU0ssIEVTMTM3MF9SRUdfREFDMl9GUkFNRUFEUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2RhYzEoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcykKK3sKKwlzdG9wX2RhYzEocyk7CisJcmV0dXJuIHByb2dfZG1hYnVmKHMsICZzLT5kbWFfZGFjMSwgZGFjMV9zYW1wbGVyYXRlWyhzLT5jdHJsICYgQ1RSTF9XVFNSU0VMKSA+PiBDVFJMX1NIX1dUU1JTRUxdLAorCQkJICAgKHMtPnNjdHJsID4+IFNDVFJMX1NIX1AxRk1UKSAmIEVTMTM3MF9GTVRfTUFTSywgRVMxMzcwX1JFR19EQUMxX0ZSQU1FQURSKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRfaHdwdHIoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIsIHVuc2lnbmVkIHJlZykKK3sKKwl1bnNpZ25lZCBod3B0ciwgZGlmZjsKKworCW91dGwoKHJlZyA+PiA4KSAmIDE1LCBzLT5pbytFUzEzNzBfUkVHX01FTVBBR0UpOworCWh3cHRyID0gKGlubChzLT5pbysocmVnICYgMHhmZikpID4+IDE0KSAmIDB4M2ZmZmM7CisJZGlmZiA9IChkYi0+ZG1hc2l6ZSArIGh3cHRyIC0gZGItPmh3cHRyKSAlIGRiLT5kbWFzaXplOworCWRiLT5od3B0ciA9IGh3cHRyOworCXJldHVybiBkaWZmOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfYWR2YW5jZSh2b2lkICpidWYsIHVuc2lnbmVkIGJzaXplLCB1bnNpZ25lZCBicHRyLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoYnB0ciArIGxlbiA+IGJzaXplKSB7CisJCXVuc2lnbmVkIHggPSBic2l6ZSAtIGJwdHI7CisJCW1lbXNldCgoKGNoYXIgKilidWYpICsgYnB0ciwgYywgeCk7CisJCWJwdHIgPSAwOworCQlsZW4gLT0geDsKKwl9CisJbWVtc2V0KCgoY2hhciAqKWJ1ZikgKyBicHRyLCBjLCBsZW4pOworfQorCisvKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCEgKi8KK3N0YXRpYyB2b2lkIGVzMTM3MF91cGRhdGVfcHRyKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMpCit7CisJaW50IGRpZmY7CisKKwkvKiB1cGRhdGUgQURDIHBvaW50ZXIgKi8KKwlpZiAocy0+Y3RybCAmIENUUkxfQURDX0VOKSB7CisJCWRpZmYgPSBnZXRfaHdwdHIocywgJnMtPmRtYV9hZGMsIEVTMTM3MF9SRUdfQURDX0ZSQU1FQ05UKTsKKwkJcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQlzLT5kbWFfYWRjLmNvdW50ICs9IGRpZmY7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgCisJCQl3YWtlX3VwKCZzLT5kbWFfYWRjLndhaXQpOworCQlpZiAoIXMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtICgoMyAqIHMtPmRtYV9hZGMuZnJhZ3NpemUpID4+IDEpKSkgeworCQkJCXMtPmN0cmwgJj0gfkNUUkxfQURDX0VOOworCQkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwkJCQlzLT5kbWFfYWRjLmVycm9yKys7CisJCQl9CisJCX0KKwl9CisJLyogdXBkYXRlIERBQzEgcG9pbnRlciAqLworCWlmIChzLT5jdHJsICYgQ1RSTF9EQUMxX0VOKSB7CisJCWRpZmYgPSBnZXRfaHdwdHIocywgJnMtPmRtYV9kYWMxLCBFUzEzNzBfUkVHX0RBQzFfRlJBTUVDTlQpOworCQlzLT5kbWFfZGFjMS50b3RhbF9ieXRlcyArPSBkaWZmOworCQlpZiAocy0+ZG1hX2RhYzEubWFwcGVkKSB7CisJCQlzLT5kbWFfZGFjMS5jb3VudCArPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMxLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYzEuZnJhZ3NpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYzEud2FpdCk7CisJCX0gZWxzZSB7CisJCQlzLT5kbWFfZGFjMS5jb3VudCAtPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMxLmNvdW50IDw9IDApIHsKKwkJCQlzLT5jdHJsICY9IH5DVFJMX0RBQzFfRU47CisJCQkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOworCQkJCXMtPmRtYV9kYWMxLmVycm9yKys7CisJCQl9IGVsc2UgaWYgKHMtPmRtYV9kYWMxLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYzEuZnJhZ3NpemUgJiYgIXMtPmRtYV9kYWMxLmVuZGNsZWFyZWQpIHsKKwkJCQljbGVhcl9hZHZhbmNlKHMtPmRtYV9kYWMxLnJhd2J1Ziwgcy0+ZG1hX2RhYzEuZG1hc2l6ZSwgcy0+ZG1hX2RhYzEuc3dwdHIsIAorCQkJCQkgICAgICBzLT5kbWFfZGFjMS5mcmFnc2l6ZSwgKHMtPnNjdHJsICYgU0NUUkxfUDFTRUIpID8gMCA6IDB4ODApOworCQkJCXMtPmRtYV9kYWMxLmVuZGNsZWFyZWQgPSAxOworCQkJfQorCQkJaWYgKHMtPmRtYV9kYWMxLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjMS5mcmFnc2l6ZSA8PSAoc2lnbmVkKXMtPmRtYV9kYWMxLmRtYXNpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYzEud2FpdCk7CisJCX0KKwl9CisJLyogdXBkYXRlIERBQzIgcG9pbnRlciAqLworCWlmIChzLT5jdHJsICYgQ1RSTF9EQUMyX0VOKSB7CisJCWRpZmYgPSBnZXRfaHdwdHIocywgJnMtPmRtYV9kYWMyLCBFUzEzNzBfUkVHX0RBQzJfRlJBTUVDTlQpOworCQlzLT5kbWFfZGFjMi50b3RhbF9ieXRlcyArPSBkaWZmOworCQlpZiAocy0+ZG1hX2RhYzIubWFwcGVkKSB7CisJCQlzLT5kbWFfZGFjMi5jb3VudCArPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMyLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYzIud2FpdCk7CisJCX0gZWxzZSB7CisJCQlzLT5kbWFfZGFjMi5jb3VudCAtPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMyLmNvdW50IDw9IDApIHsKKwkJCQlzLT5jdHJsICY9IH5DVFJMX0RBQzJfRU47CisJCQkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOworCQkJCXMtPmRtYV9kYWMyLmVycm9yKys7CisJCQl9IGVsc2UgaWYgKHMtPmRtYV9kYWMyLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUgJiYgIXMtPmRtYV9kYWMyLmVuZGNsZWFyZWQpIHsKKwkJCQljbGVhcl9hZHZhbmNlKHMtPmRtYV9kYWMyLnJhd2J1Ziwgcy0+ZG1hX2RhYzIuZG1hc2l6ZSwgcy0+ZG1hX2RhYzIuc3dwdHIsIAorCQkJCQkgICAgICBzLT5kbWFfZGFjMi5mcmFnc2l6ZSwgKHMtPnNjdHJsICYgU0NUUkxfUDJTRUIpID8gMCA6IDB4ODApOworCQkJCXMtPmRtYV9kYWMyLmVuZGNsZWFyZWQgPSAxOworCQkJfQorCQkJaWYgKHMtPmRtYV9kYWMyLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjMi5mcmFnc2l6ZSA8PSAoc2lnbmVkKXMtPmRtYV9kYWMyLmRtYXNpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYzIud2FpdCk7CisJCX0KKwl9Cit9CisKKy8qIGhvbGQgc3BpbmxvY2sgZm9yIHRoZSBmb2xsb3dpbmchICovCitzdGF0aWMgdm9pZCBlczEzNzBfaGFuZGxlX21pZGkoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCWludCB3YWtlOworCisJaWYgKCEocy0+Y3RybCAmIENUUkxfVUFSVF9FTikpCisJCXJldHVybjsKKwl3YWtlID0gMDsKKwl3aGlsZSAoaW5iKHMtPmlvK0VTMTM3MF9SRUdfVUFSVF9TVEFUVVMpICYgVVNUQVRfUlhSRFkpIHsKKwkJY2ggPSBpbmIocy0+aW8rRVMxMzcwX1JFR19VQVJUX0RBVEEpOworCQlpZiAocy0+bWlkaS5pY250IDwgTUlESUlOQlVGKSB7CisJCQlzLT5taWRpLmlidWZbcy0+bWlkaS5pd3JdID0gY2g7CisJCQlzLT5taWRpLml3ciA9IChzLT5taWRpLml3ciArIDEpICUgTUlESUlOQlVGOworCQkJcy0+bWlkaS5pY250Kys7CisJCX0KKwkJd2FrZSA9IDE7CisJfQorCWlmICh3YWtlKQorCQl3YWtlX3VwKCZzLT5taWRpLml3YWl0KTsKKwl3YWtlID0gMDsKKwl3aGlsZSAoKGluYihzLT5pbytFUzEzNzBfUkVHX1VBUlRfU1RBVFVTKSAmIFVTVEFUX1RYUkRZKSAmJiBzLT5taWRpLm9jbnQgPiAwKSB7CisJCW91dGIocy0+bWlkaS5vYnVmW3MtPm1pZGkub3JkXSwgcy0+aW8rRVMxMzcwX1JFR19VQVJUX0RBVEEpOworCQlzLT5taWRpLm9yZCA9IChzLT5taWRpLm9yZCArIDEpICUgTUlESU9VVEJVRjsKKwkJcy0+bWlkaS5vY250LS07CisJCWlmIChzLT5taWRpLm9jbnQgPCBNSURJT1VUQlVGLTE2KQorCQkJd2FrZSA9IDE7CisJfQorCWlmICh3YWtlKQorCQl3YWtlX3VwKCZzLT5taWRpLm93YWl0KTsKKwlvdXRiKChzLT5taWRpLm9jbnQgPiAwKSA/IFVDVFJMX1JYSU5URU4gfCBVQ1RSTF9FTkFfVFhJTlQgOiBVQ1RSTF9SWElOVEVOLCBzLT5pbytFUzEzNzBfUkVHX1VBUlRfQ09OVFJPTCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBlczEzNzBfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisgICAgICAgIHN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWRldl9pZDsKKwl1bnNpZ25lZCBpbnQgaW50c3JjLCBzY3RsOworCQorCS8qIGZhc3RwYXRoIG91dCwgdG8gZWFzZSBpbnRlcnJ1cHQgc2hhcmluZyAqLworCWludHNyYyA9IGlubChzLT5pbytFUzEzNzBfUkVHX1NUQVRVUyk7CisJaWYgKCEoaW50c3JjICYgMHg4MDAwMDAwMCkpCisJCXJldHVybiBJUlFfTk9ORTsKKwlzcGluX2xvY2soJnMtPmxvY2spOworCS8qIGNsZWFyIGF1ZGlvIGludGVycnVwdHMgZmlyc3QgKi8KKwlzY3RsID0gcy0+c2N0cmw7CisJaWYgKGludHNyYyAmIFNUQVRfQURDKQorCQlzY3RsICY9IH5TQ1RSTF9SMUlOVEVOOworCWlmIChpbnRzcmMgJiBTVEFUX0RBQzEpCisJCXNjdGwgJj0gflNDVFJMX1AxSU5URU47CisJaWYgKGludHNyYyAmIFNUQVRfREFDMikKKwkJc2N0bCAmPSB+U0NUUkxfUDJJTlRFTjsKKwlvdXRsKHNjdGwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCWVzMTM3MF91cGRhdGVfcHRyKHMpOworCWVzMTM3MF9oYW5kbGVfbWlkaShzKTsKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9tYWdpY1tdID0gS0VSTl9DUklUICJlczEzNzA6IGludmFsaWQgbWFnaWMgdmFsdWVcbiI7CisKKyNkZWZpbmUgVkFMSURBVEVfU1RBVEUocykgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKCEocykgfHwgKHMpLT5tYWdpYyAhPSBFUzEzNzBfTUFHSUMpIHsgXAorCQlwcmludGsoaW52YWxpZF9tYWdpYyk7ICAgICAgICAgICAgXAorCQlyZXR1cm4gLUVOWElPOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCB2b2xpZHg6NDsKKwl1bnNpZ25lZCBsZWZ0OjQ7CisJdW5zaWduZWQgcmlnaHQ6NDsKKwl1bnNpZ25lZCBzdGVyZW86MTsKKwl1bnNpZ25lZCByZWNtYXNrOjEzOworCXVuc2lnbmVkIGF2YWlsOjE7Cit9IG1peHRhYmxlW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7CisJW1NPVU5EX01JWEVSX1ZPTFVNRV0gPSB7IDAsIDB4MCwgMHgxLCAxLCAweDAwMDAsIDEgfSwgICAvKiBtYXN0ZXIgKi8KKwlbU09VTkRfTUlYRVJfUENNXSAgICA9IHsgMSwgMHgyLCAweDMsIDEsIDB4MDQwMCwgMSB9LCAgIC8qIHZvaWNlICovCisJW1NPVU5EX01JWEVSX1NZTlRIXSAgPSB7IDIsIDB4NCwgMHg1LCAxLCAweDAwNjAsIDEgfSwgICAvKiBGTSAqLworCVtTT1VORF9NSVhFUl9DRF0gICAgID0geyAzLCAweDYsIDB4NywgMSwgMHgwMDA2LCAxIH0sICAgLyogQ0QgKi8KKwlbU09VTkRfTUlYRVJfTElORV0gICA9IHsgNCwgMHg4LCAweDksIDEsIDB4MDAxOCwgMSB9LCAgIC8qIExpbmUgKi8KKwlbU09VTkRfTUlYRVJfTElORTFdICA9IHsgNSwgMHhhLCAweGIsIDEsIDB4MTgwMCwgMSB9LCAgIC8qIEFVWCAqLworCVtTT1VORF9NSVhFUl9MSU5FMl0gID0geyA2LCAweGMsIDB4MCwgMCwgMHgwMTAwLCAxIH0sICAgLyogTW9ubzEgKi8KKwlbU09VTkRfTUlYRVJfTElORTNdICA9IHsgNywgMHhkLCAweDAsIDAsIDB4MDIwMCwgMSB9LCAgIC8qIE1vbm8yICovCisJW1NPVU5EX01JWEVSX01JQ10gICAgPSB7IDgsIDB4ZSwgMHgwLCAwLCAweDAwMDEsIDEgfSwgICAvKiBNaWMgKi8KKwlbU09VTkRfTUlYRVJfT0dBSU5dICA9IHsgOSwgMHhmLCAweDAsIDAsIDB4MDAwMCwgMSB9ICAgIC8qIG1vbm8gb3V0ICovCit9OworCitzdGF0aWMgdm9pZCBzZXRfcmVjc3JjKHN0cnVjdCBlczEzNzBfc3RhdGUgKnMsIHVuc2lnbmVkIGludCB2YWwpCit7CisJdW5zaWduZWQgaW50IGksIGo7CisKKwlmb3IgKGogPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKSB7CisJCWlmICghKHZhbCAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIW1peHRhYmxlW2ldLnJlY21hc2spIHsKKwkJCXZhbCAmPSB+KDEgPDwgaSk7CisJCQljb250aW51ZTsKKwkJfQorCQlqIHw9IG1peHRhYmxlW2ldLnJlY21hc2s7CisJfQorCXMtPm1peC5yZWNzcmMgPSB2YWw7CisJd3Jjb2RlYyhzLCAweDEyLCBqICYgMHhkNSk7CisJd3Jjb2RlYyhzLCAweDEzLCBqICYgMHhhYSk7CisJd3Jjb2RlYyhzLCAweDE0LCAoaiA+PiA4KSAmIDB4MTcpOworCXdyY29kZWMocywgMHgxNSwgKGogPj4gOCkgJiAweDBmKTsKKwlpID0gKGogJiAweDM3ZikgfCAoKGogPDwgMSkgJiAweDMwMDApIHwgMHhjNjA7CisJaWYgKCFzLT5taXguaW1peCkgeworCQlpICY9IDB4ZmY2MDsgIC8qIG11dGUgcmVjb3JkIGFuZCBsaW5lIG1vbml0b3IgKi8KKwl9CisJd3Jjb2RlYyhzLCAweDEwLCBpKTsKKwl3cmNvZGVjKHMsIDB4MTEsIGkgPj4gOCk7Cit9CisKK3N0YXRpYyBpbnQgbWl4ZXJfaW9jdGwoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgdmFsOworCXVuc2lnbmVkIGNoYXIgbCwgciwgcmwsIHJyOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfUFJJVkFURTEpIHsKKwkJLyogZW5hYmxlL2Rpc2FibGUvcXVlcnkgbWl4ZXIgcHJlYW1wICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gLTEpIHsKKwkJCXMtPm1peC5taWNwcmVhbXAgPSAhIXZhbDsKKwkJCXdyY29kZWMocywgMHgxOSwgcy0+bWl4Lm1pY3ByZWFtcCk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC5taWNwcmVhbXAsIHApOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUyKSB7CisJCS8qIGVuYWJsZS9kaXNhYmxlL3F1ZXJ5IHVzZSBvZiBsaW5laW4gYXMgc2Vjb25kIGxpbmVvdXQgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAtMSkgeworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh2YWwpCisJCQkJcy0+Y3RybCB8PSBDVFJMX1hDVEwwOworCQkJZWxzZQorCQkJCXMtPmN0cmwgJj0gfkNUUkxfWENUTDA7CisJCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5jdHJsICYgQ1RSTF9YQ1RMMCkgPyAxIDogMCwgcCk7CisJfQorCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfUFJJVkFURTMpIHsKKwkJLyogZW5hYmxlL2Rpc2FibGUvcXVlcnkgbWljcm9waG9uZSBpbXBlZGFuY2Ugc2V0dGluZyAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IC0xKSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKHZhbCkKKwkJCQlzLT5jdHJsIHw9IENUUkxfWENUTDE7CisJCQllbHNlCisJCQkJcy0+Y3RybCAmPSB+Q1RSTF9YQ1RMMTsKKwkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPmN0cmwgJiBDVFJMX1hDVEwxKSA/IDEgOiAwLCBwKTsKKwl9CisgICAgICAgIGlmIChjbWQgPT0gU09VTkRfTUlYRVJfSU5GTykgeworCQltaXhlcl9pbmZvIGluZm87CisJCXN0cm5jcHkoaW5mby5pZCwgIkVTMTM3MCIsIHNpemVvZihpbmZvLmlkKSk7CisJCXN0cm5jcHkoaW5mby5uYW1lLCAiRW5zb25pcSBFUzEzNzAiLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCWluZm8ubW9kaWZ5X2NvdW50ZXIgPSBzLT5taXgubW9kY250OworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjbWQgPT0gU09VTkRfT0xEX01JWEVSX0lORk8pIHsKKwkJX29sZF9taXhlcl9pbmZvIGluZm87CisJCXN0cm5jcHkoaW5mby5pZCwgIkVTMTM3MCIsIHNpemVvZihpbmZvLmlkKSk7CisJCXN0cm5jcHkoaW5mby5uYW1lLCAiRW5zb25pcSBFUzEzNzAiLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCWlmIChfSU9DX1RZUEUoY21kKSAhPSAnTScgfHwgX1NJT0NfU0laRShjbWQpICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICBpZiAoX1NJT0NfRElSKGNtZCkgPT0gX1NJT0NfUkVBRCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlICovCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnJlY3NyYywgcCk7CisJCQkKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgZGV2aWNlICovCisJCQl2YWwgPSBTT1VORF9NQVNLX0lNSVg7CisJCQlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspCisJCQkJaWYgKG1peHRhYmxlW2ldLmF2YWlsKQorCQkJCQl2YWwgfD0gMSA8PCBpOworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJZm9yICh2YWwgPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQkJCWlmIChtaXh0YWJsZVtpXS5yZWNtYXNrKQorCQkJCQl2YWwgfD0gMSA8PCBpOworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQkKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6IC8qIE1peGVyIGNoYW5uZWxzIHN1cHBvcnRpbmcgc3RlcmVvICovCisJCQlmb3IgKHZhbCA9IGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspCisJCQkJaWYgKG1peHRhYmxlW2ldLnN0ZXJlbykKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkJCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCQkKKwkJY2FzZSBTT1VORF9NSVhFUl9JTUlYOgorCQkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC5pbWl4LCBwKTsKKworCQlkZWZhdWx0OgorCQkJaSA9IF9JT0NfTlIoY21kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCAhbWl4dGFibGVbaV0uYXZhaWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbbWl4dGFibGVbaV0udm9saWR4XSwgcCk7CisJCX0KKwl9CisgICAgICAgIGlmIChfU0lPQ19ESVIoY21kKSAhPSAoX1NJT0NfUkVBRHxfU0lPQ19XUklURSkpIAorCQlyZXR1cm4gLUVJTlZBTDsKKwlzLT5taXgubW9kY250Kys7CisJc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKKworCWNhc2UgU09VTkRfTUlYRVJfSU1JWDoKKwkJaWYgKGdldF91c2VyKHMtPm1peC5pbWl4LCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfcmVjc3JjKHMsIHMtPm1peC5yZWNzcmMpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzZXRfcmVjc3JjKHMsIHZhbCk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJaSA9IF9JT0NfTlIoY21kKTsKKwkJaWYgKGkgPj0gU09VTkRfTUlYRVJfTlJERVZJQ0VTIHx8ICFtaXh0YWJsZVtpXS5hdmFpbCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOworCQlpZiAobWl4dGFibGVbaV0uc3RlcmVvKSB7CisJCQlyID0gKHZhbCA+PiA4KSAmIDB4ZmY7CisJCQlpZiAociA+IDEwMCkKKwkJCQlyID0gMTAwOworCQkJaWYgKGwgPCA3KSB7CisJCQkJcmwgPSAweDgwOworCQkJCWwgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlybCA9IDMxIC0gKChsIC0gNykgLyAzKTsKKwkJCQlsID0gKDMxIC0gcmwpICogMyArIDc7CisJCQl9CisJCQlpZiAociA8IDcpIHsKKwkJCQlyciA9IDB4ODA7CisJCQkJciA9IDA7CisJCQl9IGVsc2UgeworCQkJCXJyID0gIDMxIC0gKChyIC0gNykgLyAzKTsKKwkJCQlyID0gKDMxIC0gcnIpICogMyArIDc7CisJCQl9CisJCQl3cmNvZGVjKHMsIG1peHRhYmxlW2ldLnJpZ2h0LCBycik7CisJCX0gZWxzZSB7IAorCQkJaWYgKG1peHRhYmxlW2ldLmxlZnQgPT0gMTUpIHsKKwkJCQlpZiAobCA8IDIpIHsKKwkJCQkJcnIgPSBybCA9IDB4ODA7CisJCQkJCXIgPSBsID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlybCA9IDcgLSAoKGwgLSAyKSAvIDE0KTsKKwkJCQkJciA9IGwgPSAoNyAtIHJsKSAqIDE0ICsgMjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChsIDwgNykgeworCQkJCQlybCA9IDB4ODA7CisJCQkJCXIgPSBsID0gMDsKKwkJCQl9IGVsc2UgeworCQkJCQlybCA9IDMxIC0gKChsIC0gNykgLyAzKTsKKwkJCQkJciA9IGwgPSAoMzEgLSBybCkgKiAzICsgNzsKKwkJCQl9CisJCQl9CisJCX0KKwkJd3Jjb2RlYyhzLCBtaXh0YWJsZVtpXS5sZWZ0LCBybCk7CisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCXMtPm1peC52b2xbbWl4dGFibGVbaV0udm9saWR4XSA9ICgodW5zaWduZWQgaW50KXIgPDwgOCkgfCBsOworI2Vsc2UKKwkJcy0+bWl4LnZvbFttaXh0YWJsZVtpXS52b2xpZHhdID0gdmFsOworI2VuZGlmCisgICAgICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbbWl4dGFibGVbaV0udm9saWR4XSwgcCk7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBlczEzNzBfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGVzMTM3MF9zdGF0ZSwgZGV2cyk7CisJCWlmIChzLT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVzMTM3MF9yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJCisJVkFMSURBVEVfU1RBVEUocyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcwX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIG1peGVyX2lvY3RsKChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlczEzNzBfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IGVzMTM3MF9pb2N0bF9taXhkZXYsCisJLm9wZW4JCT0gZXMxMzcwX29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlCT0gZXMxMzcwX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjMShzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzLCBpbnQgbm9uYmxvY2spCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQsIHRtbzsKKwkKKwlpZiAocy0+ZG1hX2RhYzEubWFwcGVkIHx8ICFzLT5kbWFfZGFjMS5yZWFkeSkKKwkJcmV0dXJuIDA7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMS53YWl0LCAmd2FpdCk7CisgICAgICAgIGZvciAoOzspIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzEuY291bnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobm9uYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMS53YWl0LCAmd2FpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgICAgICAgICB9CisJCXRtbyA9IDMgKiBIWiAqIChjb3VudCArIHMtPmRtYV9kYWMxLmZyYWdzaXplKSAvIDIKKwkJCS8gZGFjMV9zYW1wbGVyYXRlWyhzLT5jdHJsICYgQ1RSTF9XVFNSU0VMKSA+PiBDVFJMX1NIX1dUU1JTRUxdOworCQl0bW8gPj49IHNhbXBsZV9zaGlmdFsocy0+c2N0cmwgJiBTQ1RSTF9QMUZNVCkgPj4gU0NUUkxfU0hfUDFGTVRdOworCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vICsgMSkpCisJCQlEQkcocHJpbnRrKEtFUk5fREVCVUcgImVzMTM3MDogZG1hIHRpbWVkIG91dD8/XG4iKTspCisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMxLndhaXQsICZ3YWl0KTsKKyAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRyYWluX2RhYzIoc3RydWN0IGVzMTM3MF9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50LCB0bW87CisKKwlpZiAocy0+ZG1hX2RhYzIubWFwcGVkIHx8ICFzLT5kbWFfZGFjMi5yZWFkeSkKKwkJcmV0dXJuIDA7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7CisgICAgICAgIGZvciAoOzspIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzIuY291bnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobm9uYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgICAgICAgICB9CisJCXRtbyA9IDMgKiBIWiAqIChjb3VudCArIHMtPmRtYV9kYWMyLmZyYWdzaXplKSAvIDIKKwkJCS8gREFDMl9ESVZUT1NSKChzLT5jdHJsICYgQ1RSTF9QQ0xLRElWKSA+PiBDVFJMX1NIX1BDTEtESVYpOworCQl0bW8gPj49IHNhbXBsZV9zaGlmdFsocy0+c2N0cmwgJiBTQ1RSTF9QMkZNVCkgPj4gU0NUUkxfU0hfUDJGTVRdOworCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vICsgMSkpCisJCQlEQkcocHJpbnRrKEtFUk5fREVCVUcgImVzMTM3MDogZG1hIHRpbWVkIG91dD8/XG4iKTspCisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMyLndhaXQsICZ3YWl0KTsKKyAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNzaXplX3QgZXMxMzcwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWRvd24oJnMtPnNlbSk7CQorCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJZ290byBvdXQ7CisgICAgICAgIAorCWFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXN3cHRyID0gcy0+ZG1hX2FkYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2FkYy5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA8IGNudCkKKwkJCWNudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5lbmFibGVkKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJdXAoJnMtPnNlbSk7CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWRvd24oJnMtPnNlbSk7CisJCQlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCQl7CisJCQkJcmV0ID0gLUVOWElPOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPmRtYV9hZGMucmF3YnVmICsgc3dwdHIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmRtYV9hZGMuc3dwdHIgPSBzd3B0cjsKKwkJcy0+ZG1hX2FkYy5jb3VudCAtPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlpZiAocy0+ZG1hX2FkYy5lbmFibGVkKQorCQkJc3RhcnRfYWRjKHMpOworCX0KK291dDoKKwl1cCgmcy0+c2VtKTsKKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9hZGMud2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZXMxMzcwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlkb3duKCZzLT5zZW0pOwkKKwlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSkKKwkJZ290byBvdXQ7CisJcmV0ID0gMDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMyLndhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChzLT5kbWFfZGFjMi5jb3VudCA8IDApIHsKKwkJCXMtPmRtYV9kYWMyLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMyLnN3cHRyID0gcy0+ZG1hX2RhYzIuaHdwdHI7CisJCX0KKwkJc3dwdHIgPSBzLT5kbWFfZGFjMi5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYzIuZG1hc2l6ZS1zd3B0cjsKKwkJaWYgKHMtPmRtYV9kYWMyLmNvdW50ICsgY250ID4gcy0+ZG1hX2RhYzIuZG1hc2l6ZSkKKwkJCWNudCA9IHMtPmRtYV9kYWMyLmRtYXNpemUgLSBzLT5kbWFfZGFjMi5jb3VudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChzLT5kbWFfZGFjMi5lbmFibGVkKQorCQkJCXN0YXJ0X2RhYzIocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXVwKCZzLT5zZW0pOworCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBvdXQ7CQorCQkJfQorCQkJZG93bigmcy0+c2VtKTsKKwkJCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpCisJCQl7CisJCQlyZXQgPSAtRU5YSU87CisJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihzLT5kbWFfZGFjMi5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYzIuZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+ZG1hX2RhYzIuc3dwdHIgPSBzd3B0cjsKKwkJcy0+ZG1hX2RhYzIuY291bnQgKz0gY250OworCQlzLT5kbWFfZGFjMi5lbmRjbGVhcmVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWlmIChzLT5kbWFfZGFjMi5lbmFibGVkKQorCQkJc3RhcnRfZGFjMihzKTsKKwl9CitvdXQ6CisJdXAoJnMtPnNlbSk7CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMi53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCBlczEzNzBfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYzIocykpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfZGFjMi53YWl0LCB3YWl0KTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2FkYyhzKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJZXMxMzcwX3VwZGF0ZV9wdHIocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfYWRjLmZyYWdzaXplKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHMtPmRtYV9kYWMyLm1hcHBlZCkgeworCQkJaWYgKHMtPmRtYV9kYWMyLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUpIAorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0gZWxzZSB7CisJCQlpZiAoKHNpZ25lZClzLT5kbWFfZGFjMi5kbWFzaXplID49IHMtPmRtYV9kYWMyLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjMi5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBlczEzNzBfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRiOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJZG93bigmcy0+c2VtKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjMihzKSkgIT0gMCkgeworCQkJZ290byBvdXQ7CisJCX0KKwkJZGIgPSAmcy0+ZG1hX2RhYzI7CisJfSBlbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkgIT0gMCkgeworCQkJZ290byBvdXQ7CisJCX0KKwkJZGIgPSAmcy0+ZG1hX2FkYzsKKwl9IGVsc2UgIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJCXZpcnRfdG9fcGh5cyhkYi0+cmF3YnVmKSA+PiBQQUdFX1NISUZULAorCQkJCXNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIG91dDsKKwl9CisJZGItPm1hcHBlZCA9IDE7CitvdXQ6CisJdXAoJnMtPnNlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgYXVkaW9fYnVmX2luZm8gYWJpbmZvOworICAgICAgICBjb3VudF9pbmZvIGNpbmZvOworCWludCBjb3VudDsKKwlpbnQgdmFsLCBtYXBwZWQsIHJldDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworICAgICAgICBtYXBwZWQgPSAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiBzLT5kbWFfZGFjMi5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMyKHMsIDAvKmZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKi8pOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8IERTUF9DQVBfVFJJR0dFUiB8IERTUF9DQVBfTU1BUCwgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMyKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfZGFjMi5zd3B0ciA9IHMtPmRtYV9kYWMyLmh3cHRyID0gcy0+ZG1hX2RhYzIuY291bnQgPSBzLT5kbWFfZGFjMi50b3RhbF9ieXRlcyA9IDA7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2FkYy5od3B0ciA9IHMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlpZiAocy0+b3Blbl9tb2RlICYgKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaWYgKHZhbCA8IDQwMDApCisJCQkJdmFsID0gNDAwMDsKKwkJCWlmICh2YWwgPiA1MDAwMCkKKwkJCQl2YWwgPSA1MDAwMDsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3RvcF9kYWMyKHMpOworCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IHMtPmRtYV9kYWMyLnJlYWR5ID0gMDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlzLT5jdHJsID0gKHMtPmN0cmwgJiB+Q1RSTF9QQ0xLRElWKSB8IChEQUMyX1NSVE9ESVYodmFsKSA8PCBDVFJMX1NIX1BDTEtESVYpOworCQkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQl9CisJCXJldHVybiBwdXRfdXNlcihEQUMyX0RJVlRPU1IoKHMtPmN0cmwgJiBDVFJMX1BDTEtESVYpID4+IENUUkxfU0hfUENMS0RJViksIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAodmFsKQorCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1IxU01COworCQkJZWxzZQorCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9SMVNNQjsKKwkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMyKHMpOworCQkJcy0+ZG1hX2RhYzIucmVhZHkgPSAwOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh2YWwpCisJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDJTTUI7CisJCQllbHNlCisJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AyU01COworCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgfQorCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlzLT5zY3RybCB8PSBTQ1RSTF9SMVNNQjsKKwkJCQllbHNlCisJCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9SMVNNQjsKKwkJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYzIocyk7CisJCQkJcy0+ZG1hX2RhYzIucmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMlNNQjsKKwkJCQllbHNlCisJCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMlNNQjsKKwkJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBTQ1RSTF9SMVNNQiA6IFNDVFJMX1AyU01CKSkgPyAyIDogMSwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRXxBRk1UX1U4LCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKKwkJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUjFTRUI7CisJCQkJZWxzZQorCQkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUjFTRUI7CisJCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMyKHMpOworCQkJCXMtPmRtYV9kYWMyLnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1AyU0VCOworCQkJCWVsc2UKKwkJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AyU0VCOworCQkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IFNDVFJMX1IxU0VCIDogU0NUUkxfUDJTRUIpKSA/IAorCQkJCUFGTVRfUzE2X0xFIDogQUZNVF9VOCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5jdHJsICYgQ1RSTF9BRENfRU4pIAorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5jdHJsICYgQ1RSTF9EQUMyX0VOKSAKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJcy0+ZG1hX2FkYy5lbmFibGVkID0gMTsKKwkJCQlzdGFydF9hZGMocyk7CisJCQl9IGVsc2UgeworCQkJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDA7CisJCQkJc3RvcF9hZGMocyk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzLT5kbWFfZGFjMi5lbmFibGVkID0gMTsKKwkJCQlzdGFydF9kYWMyKHMpOworCQkJfSBlbHNlIHsKKwkJCQlzLT5kbWFfZGFjMi5lbmFibGVkID0gMDsKKwkJCQlzdG9wX2RhYzIocyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMihzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MF91cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfZGFjMi5mcmFnc2l6ZTsKKwkJY291bnQgPSBzLT5kbWFfZGFjMi5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBzLT5kbWFfZGFjMi5kbWFzaXplIC0gY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfZGFjMi5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2RhYzIuZnJhZ3NoaWZ0OyAgICAgIAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MF91cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bWZyYWc7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsgICAgICAKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorICAgICAgICAgICAgICAgIGZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMihzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MF91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNvdW50ID0gcy0+ZG1hX2RhYzIuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJcmV0dXJuIHB1dF91c2VyKGNvdW50LCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzBfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXM7CisJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsKKyAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSBzLT5kbWFfYWRjLmh3cHRyOworCQlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCQlzLT5kbWFfYWRjLmNvdW50ICY9IHMtPmRtYV9hZGMuZnJhZ3NpemUtMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcwX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjMi50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfZGFjMi5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfZGFjMi5mcmFnc2hpZnQ7CisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2RhYzIuaHdwdHI7CisJCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpCisJCQlzLT5kbWFfZGFjMi5jb3VudCAmPSBzLT5kbWFfZGFjMi5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX2RhYzIocykpKQorCQkJCXJldHVybiB2YWw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYzIuZnJhZ3NpemUsIHApOworCQl9CisJCWlmICgodmFsID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCXJldHVybiB2YWw7CisJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLmZyYWdzaXplLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSA0OworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJcy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2RhYzIub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJCWlmIChzLT5kbWFfZGFjMi5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQkJcy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2RhYzIub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9kYWMyLm9zc21heGZyYWdzID0gNDsKKwkJfQorCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbikgfHwKKwkJICAgIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5kbWFfZGFjMi5zdWJkaXZpc2lvbikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gdmFsOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlzLT5kbWFfZGFjMi5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIoREFDMl9ESVZUT1NSKChzLT5jdHJsICYgQ1RSTF9QQ0xLRElWKSA+PiBDVFJMX1NIX1BDTEtESVYpLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IFNDVFJMX1IxU01CIDogU0NUUkxfUDJTTUIpKSA/CisJCQkJMiA6IDEsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBTQ1RSTF9SMVNFQiA6IFNDVFJMX1AyU0VCKSkgPyAKKwkJCQkxNiA6IDgsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCQorCX0KKwlyZXR1cm4gbWl4ZXJfaW9jdGwocywgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IGVzMTM3MF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGVzMTM3MF9zdGF0ZSwgZGV2cyk7CisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSkpKQorCQlzLT5jdHJsID0gKHMtPmN0cmwgJiB+Q1RSTF9QQ0xLRElWKSB8IChEQUMyX1NSVE9ESVYoODAwMCkgPDwgQ1RSTF9TSF9QQ0xLRElWKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gMDsKKwkJcy0+ZG1hX2FkYy5lbmFibGVkID0gMTsKKwkJcy0+c2N0cmwgJj0gflNDVFJMX1IxRk1UOworCQlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQkJcy0+c2N0cmwgfD0gRVMxMzcwX0ZNVF9TMTZfTU9OTyA8PCBTQ1RSTF9TSF9SMUZNVDsKKwkJZWxzZQorCQkJcy0+c2N0cmwgfD0gRVMxMzcwX0ZNVF9VOF9NT05PIDw8IFNDVFJMX1NIX1IxRk1UOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYzIub3NzbWF4ZnJhZ3MgPSBzLT5kbWFfZGFjMi5zdWJkaXZpc2lvbiA9IDA7CisJCXMtPmRtYV9kYWMyLmVuYWJsZWQgPSAxOworCQlzLT5zY3RybCAmPSB+U0NUUkxfUDJGTVQ7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlzLT5zY3RybCB8PSBFUzEzNzBfRk1UX1MxNl9NT05PIDw8IFNDVFJMX1NIX1AyRk1UOworCQllbHNlCisJCQlzLT5zY3RybCB8PSBFUzEzNzBfRk1UX1U4X01PTk8gPDwgU0NUUkxfU0hfUDJGTVQ7CisJfQorCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+b3Blbl9tb2RlIHw9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJaW5pdF9NVVRFWCgmcy0+c2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWRyYWluX2RhYzIocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RvcF9kYWMyKHMpOworCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9kYWMyKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RvcF9hZGMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKKwl9CisJcy0+b3Blbl9tb2RlICY9IH4oZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXMxMzcwX2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGVzMTM3MF9yZWFkLAorCS53cml0ZQkJPSBlczEzNzBfd3JpdGUsCisJLnBvbGwJCT0gZXMxMzcwX3BvbGwsCisJLmlvY3RsCQk9IGVzMTM3MF9pb2N0bCwKKwkubW1hcAkJPSBlczEzNzBfbW1hcCwKKwkub3BlbgkJPSBlczEzNzBfb3BlbiwKKwkucmVsZWFzZQk9IGVzMTM3MF9yZWxlYXNlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzc2l6ZV90IGVzMTM3MF93cml0ZV9kYWMoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHMtPmRtYV9kYWMxLmNvdW50IDwgMCkgeworCQkJcy0+ZG1hX2RhYzEuY291bnQgPSAwOworCQkJcy0+ZG1hX2RhYzEuc3dwdHIgPSBzLT5kbWFfZGFjMS5od3B0cjsKKwkJfQorCQlzd3B0ciA9IHMtPmRtYV9kYWMxLnN3cHRyOworCQljbnQgPSBzLT5kbWFfZGFjMS5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+ZG1hX2RhYzEuY291bnQgKyBjbnQgPiBzLT5kbWFfZGFjMS5kbWFzaXplKQorCQkJY250ID0gcy0+ZG1hX2RhYzEuZG1hc2l6ZSAtIHMtPmRtYV9kYWMxLmNvdW50OworCQlpZiAoY250IDw9IDApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKHMtPmRtYV9kYWMxLmVuYWJsZWQpCisJCQkJc3RhcnRfZGFjMShzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYzEucmF3YnVmICsgc3dwdHIsIGJ1ZmZlciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9kYWMxLmRtYXNpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmRtYV9kYWMxLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9kYWMxLmNvdW50ICs9IGNudDsKKwkJcy0+ZG1hX2RhYzEuZW5kY2xlYXJlZCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlpZiAocy0+ZG1hX2RhYzEuZW5hYmxlZCkKKwkJCXN0YXJ0X2RhYzEocyk7CisJfQorICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXMxMzcwX3BvbGxfZGFjKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9kYWMxKHMpKQorCQlyZXR1cm4gMDsKKwlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMxLndhaXQsIHdhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJZXMxMzcwX3VwZGF0ZV9wdHIocyk7CisJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkgeworCQlpZiAocy0+ZG1hX2RhYzEuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfZGFjMS5mcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfSBlbHNlIHsKKwkJaWYgKChzaWduZWQpcy0+ZG1hX2RhYzEuZG1hc2l6ZSA+PSBzLT5kbWFfZGFjMS5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYzEuZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcwX21tYXBfZGFjKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoISh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlsb2NrX2tlcm5lbCgpOworCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKKwkJZ290byBvdXQ7CisJcmV0ID0gLUVJTlZBTDsKKwlpZiAodm1hLT52bV9wZ29mZiAhPSAwKQorCQlnb3RvIG91dDsKKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBzLT5kbWFfZGFjMS5idWZvcmRlcikpCisJCWdvdG8gb3V0OworCXJldCA9IC1FQUdBSU47CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQl2aXJ0X3RvX3BoeXMocy0+ZG1hX2RhYzEucmF3YnVmKSA+PiBQQUdFX1NISUZULAorCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlnb3RvIG91dDsKKwlzLT5kbWFfZGFjMS5tYXBwZWQgPSAxOworCXJldCA9IDA7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcwX2lvY3RsX2RhYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKyAgICAgICAgY291bnRfaW5mbyBjaW5mbzsKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgY3RybDsKKwlpbnQgdmFsLCByZXQ7CisJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKwkJcmV0dXJuIGRyYWluX2RhYzEocywgMC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sqLyk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJc3RvcF9kYWMxKHMpOworCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJcy0+ZG1hX2RhYzEuc3dwdHIgPSBzLT5kbWFfZGFjMS5od3B0ciA9IHMtPmRtYV9kYWMxLmNvdW50ID0gcy0+ZG1hX2RhYzEudG90YWxfYnl0ZXMgPSAwOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlzdG9wX2RhYzEocyk7CisJCQlzLT5kbWFfZGFjMS5yZWFkeSA9IDA7CisJCQlmb3IgKGN0cmwgPSAwOyBjdHJsIDw9IDI7IGN0cmwrKykKKwkJCQlpZiAodmFsIDwgKGRhYzFfc2FtcGxlcmF0ZVtjdHJsXSArIGRhYzFfc2FtcGxlcmF0ZVtjdHJsKzFdKSAvIDIpCisJCQkJCWJyZWFrOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCXMtPmN0cmwgPSAocy0+Y3RybCAmIH5DVFJMX1dUU1JTRUwpIHwgKGN0cmwgPDwgQ1RSTF9TSF9XVFNSU0VMKTsKKwkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoZGFjMV9zYW1wbGVyYXRlWyhzLT5jdHJsICYgQ1RSTF9XVFNSU0VMKSA+PiBDVFJMX1NIX1dUU1JTRUxdLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJc3RvcF9kYWMxKHMpOworCQlzLT5kbWFfZGFjMS5yZWFkeSA9IDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmICh2YWwpCisJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMVNNQjsKKwkJZWxzZQorCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AxU01COworCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlpZiAocy0+ZG1hX2RhYzEubWFwcGVkKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJc3RvcF9kYWMxKHMpOworCQkJcy0+ZG1hX2RhYzEucmVhZHkgPSAwOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh2YWwgPj0gMikKKwkJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMVNNQjsKKwkJCWVsc2UKKwkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUDFTTUI7CisJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgU0NUUkxfUDFTTUIpID8gMiA6IDEsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrICovCisgICAgICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFfEFGTVRfVTgsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlzdG9wX2RhYzEocyk7CisJCQlzLT5kbWFfZGFjMS5yZWFkeSA9IDA7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKKwkJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMVNFQjsKKwkJCWVsc2UKKwkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUDFTRUI7CisJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzBfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgU0NUUkxfUDFTRUIpID8gQUZNVF9TMTZfTEUgOiBBRk1UX1U4LCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfUE9TVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5jdHJsICYgQ1RSTF9EQUMxX0VOKSA/IFBDTV9FTkFCTEVfT1VUUFVUIDogMCwgcCk7CisJCQkJCQkKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCQlpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJcy0+ZG1hX2RhYzEuZW5hYmxlZCA9IDE7CisJCQlzdGFydF9kYWMxKHMpOworCQl9IGVsc2UgeworCQkJcy0+ZG1hX2RhYzEuZW5hYmxlZCA9IDA7CisJCQlzdG9wX2RhYzEocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcwX3VwZGF0ZV9wdHIocyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMxLmZyYWdzaXplOworCQljb3VudCA9IHMtPmRtYV9kYWMxLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMxLmRtYXNpemUgLSBjb3VudDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMxLm51bWZyYWc7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjMS5mcmFnc2hpZnQ7ICAgICAgCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKyAgICAgICAgICAgICAgICBmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MF91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNvdW50ID0gcy0+ZG1hX2RhYzEuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJcmV0dXJuIHB1dF91c2VyKGNvdW50LCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MF91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYzEudG90YWxfYnl0ZXM7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzEuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2RhYzEuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMxLmh3cHRyOworCQlpZiAocy0+ZG1hX2RhYzEubWFwcGVkKQorCQkJcy0+ZG1hX2RhYzEuY291bnQgJj0gcy0+ZG1hX2RhYzEuZnJhZ3NpemUtMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSkKKwkJCXJldHVybiB2YWw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMxLmZyYWdzaXplLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcy0+ZG1hX2RhYzEub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQlzLT5kbWFfZGFjMS5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQlpZiAocy0+ZG1hX2RhYzEub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCXMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCWlmIChzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCXMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA9IDE1OworCQlpZiAocy0+ZG1hX2RhYzEub3NzbWF4ZnJhZ3MgPCA0KQorCQkJcy0+ZG1hX2RhYzEub3NzbWF4ZnJhZ3MgPSA0OworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlpZiAocy0+ZG1hX2RhYzEuc3ViZGl2aXNpb24pCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcy0+ZG1hX2RhYzEuc3ViZGl2aXNpb24gPSB2YWw7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJcmV0dXJuIHB1dF91c2VyKGRhYzFfc2FtcGxlcmF0ZVsocy0+Y3RybCAmIENUUkxfV1RTUlNFTCkgPj4gQ1RSTF9TSF9XVFNSU0VMXSwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmIFNDVFJMX1AxU01CKSA/IDIgOiAxLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+c2N0cmwgJiBTQ1RSTF9QMVNFQikgPyAxNiA6IDgsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCQorCX0KKwlyZXR1cm4gbWl4ZXJfaW9jdGwocywgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IGVzMTM3MF9vcGVuX2RhYyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBlczEzNzBfc3RhdGUsIGRldnMpOworCQlpZiAoISgocy0+ZGV2X2RhYyBeIG1pbm9yKSAmIH4weGYpKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAJLyogd2UgYWxsb3cgb3BlbmluZyB3aXRoIE9fUkRXUiwgbW9zdCBwcm9ncmFtcyBkbyBpdCBhbHRob3VnaCB0aGV5IHdpbGwgb25seSB3cml0ZSAqLworI2lmIDAKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJcmV0dXJuIC1FUEVSTTsKKyNlbmRpZgorCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBGTU9ERV9EQUMpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCXMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9kYWMxLm9zc21heGZyYWdzID0gcy0+ZG1hX2RhYzEuc3ViZGl2aXNpb24gPSAwOworCXMtPmRtYV9kYWMxLmVuYWJsZWQgPSAxOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+Y3RybCA9IChzLT5jdHJsICYgfkNUUkxfV1RTUlNFTCkgfCAoMSA8PCBDVFJMX1NIX1dUU1JTRUwpOworICAgICAgCXMtPnNjdHJsICY9IH5TQ1RSTF9QMUZNVDsKKwlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQlzLT5zY3RybCB8PSBFUzEzNzBfRk1UX1MxNl9NT05PIDw8IFNDVFJMX1NIX1AxRk1UOworCWVsc2UKKwkJcy0+c2N0cmwgfD0gRVMxMzcwX0ZNVF9VOF9NT05PIDw8IFNDVFJMX1NIX1AxRk1UOworCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+b3Blbl9tb2RlIHw9IEZNT0RFX0RBQzsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBlczEzNzBfcmVsZWFzZV9kYWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlkcmFpbl9kYWMxKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJc3RvcF9kYWMxKHMpOworCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjMSk7CisJcy0+b3Blbl9tb2RlICY9IH5GTU9ERV9EQUM7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVzMTM3MF9kYWNfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLndyaXRlCQk9IGVzMTM3MF93cml0ZV9kYWMsCisJLnBvbGwJCT0gZXMxMzcwX3BvbGxfZGFjLAorCS5pb2N0bAkJPSBlczEzNzBfaW9jdGxfZGFjLAorCS5tbWFwCQk9IGVzMTM3MF9tbWFwX2RhYywKKwkub3BlbgkJPSBlczEzNzBfb3Blbl9kYWMsCisJLnJlbGVhc2UJPSBlczEzNzBfcmVsZWFzZV9kYWMsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNzaXplX3QgZXMxMzcwX21pZGlfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcwX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0ID0gMDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPm1pZGkuaXdhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXB0ciA9IHMtPm1pZGkuaXJkOworCQljbnQgPSBNSURJSU5CVUYgLSBwdHI7CisJCWlmIChzLT5taWRpLmljbnQgPCBjbnQpCisJCQljbnQgPSBzLT5taWRpLmljbnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPm1pZGkuaWJ1ZiArIHB0ciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESUlOQlVGOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5taWRpLmlyZCA9IHB0cjsKKwkJcy0+bWlkaS5pY250IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWJyZWFrOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLml3YWl0LCAmd2FpdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZXMxMzcwX21pZGlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHB0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0ID0gMDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXB0ciA9IHMtPm1pZGkub3dyOworCQljbnQgPSBNSURJT1VUQlVGIC0gcHRyOworCQlpZiAocy0+bWlkaS5vY250ICsgY250ID4gTUlESU9VVEJVRikKKwkJCWNudCA9IE1JRElPVVRCVUYgLSBzLT5taWRpLm9jbnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJZXMxMzcwX2hhbmRsZV9taWRpKHMpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihzLT5taWRpLm9idWYgKyBwdHIsIGJ1ZmZlciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESU9VVEJVRjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+bWlkaS5vd3IgPSBwdHI7CisJCXMtPm1pZGkub2NudCArPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzBfaGFuZGxlX21pZGkocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVzMTM3MF9taWRpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgZXMxMzcwX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXBvbGxfd2FpdChmaWxlLCAmcy0+bWlkaS5vd2FpdCwgd2FpdCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXBvbGxfd2FpdChmaWxlLCAmcy0+bWlkaS5pd2FpdCwgd2FpdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+bWlkaS5pY250ID4gMCkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChzLT5taWRpLm9jbnQgPCBNSURJT1VUQlVGKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGVzMTM3MF9taWRpX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGVzMTM3MF9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZXMxMzcwX3N0YXRlLCBkZXZzKTsKKwkJaWYgKHMtPmRldl9taWRpID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCQlzLT5taWRpLm9yZCA9IHMtPm1pZGkub3dyID0gcy0+bWlkaS5vY250ID0gMDsKKwkJb3V0YihVQ1RSTF9DTlRSTF9TV1IsIHMtPmlvK0VTMTM3MF9SRUdfVUFSVF9DT05UUk9MKTsKKwkJb3V0YigwLCBzLT5pbytFUzEzNzBfUkVHX1VBUlRfQ09OVFJPTCk7CisJCW91dGIoMCwgcy0+aW8rRVMxMzcwX1JFR19VQVJUX1RFU1QpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5taWRpLmlyZCA9IHMtPm1pZGkuaXdyID0gcy0+bWlkaS5pY250ID0gMDsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXMtPm1pZGkub3JkID0gcy0+bWlkaS5vd3IgPSBzLT5taWRpLm9jbnQgPSAwOworCX0KKwlzLT5jdHJsIHw9IENUUkxfVUFSVF9FTjsKKwlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJZXMxMzcwX2hhbmRsZV9taWRpKHMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBlczEzNzBfbWlkaV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNvdW50LCB0bW87CisKKwlWQUxJREFURV9TVEFURShzKTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCWZvciAoOzspIHsKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQljb3VudCA9IHMtPm1pZGkub2NudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChjb3VudCA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAKKwkJCQlicmVhazsKKwkJCXRtbyA9IChjb3VudCAqIEhaKSAvIDMxMDA7CisJCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID8gOiAxKSAmJiB0bW8pCisJCQkJREJHKHByaW50ayhLRVJOX0RFQlVHICJlczEzNzA6IG1pZGkgdGltZWQgb3V0Pz9cbiIpOykKKwkJfQorCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCX0KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJcy0+b3Blbl9tb2RlICY9IH4oKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUR8Rk1PREVfTUlESV9XUklURSkpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+b3Blbl9tb2RlICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpKSkgeworCQlzLT5jdHJsICY9IH5DVFJMX1VBUlRfRU47CisJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcwX1JFR19DT05UUk9MKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlczEzNzBfbWlkaV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBlczEzNzBfbWlkaV9yZWFkLAorCS53cml0ZQkJPSBlczEzNzBfbWlkaV93cml0ZSwKKwkucG9sbAkJPSBlczEzNzBfbWlkaV9wb2xsLAorCS5vcGVuCQk9IGVzMTM3MF9taWRpX29wZW4sCisJLnJlbGVhc2UJPSBlczEzNzBfbWlkaV9yZWxlYXNlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGRldmljZXM7IG9ubHkgdXNlZCBmb3IgY29tbWFuZCBsaW5lIHBhcmFtcyAqLworI2RlZmluZSBOUl9ERVZJQ0UgNQorCitzdGF0aWMgaW50IGxpbmVvdXRbTlJfREVWSUNFXTsKK3N0YXRpYyBpbnQgbWljYmlhc1tOUl9ERVZJQ0VdOworCitzdGF0aWMgdW5zaWduZWQgaW50IGRldmluZGV4OworCittb2R1bGVfcGFyYW1fYXJyYXkobGluZW91dCwgYm9vbCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGxpbmVvdXQsICJpZiAxIHRoZSBMSU5FIGlucHV0IGlzIGNvbnZlcnRlZCB0byBMSU5FIG91dCIpOworbW9kdWxlX3BhcmFtX2FycmF5KG1pY2JpYXMsIGJvb2wsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhtaWNiaWFzLCAic2V0cyB0aGUgKzVWIGJpYXMgZm9yIGFuIGVsZWN0cmV0IG1pY3JvcGhvbmUiKTsKKworTU9EVUxFX0FVVEhPUigiVGhvbWFzIE0uIFNhaWxlciwgc2FpbGVyQGlmZS5lZS5ldGh6LmNoLCBoYjlqbnhAaGI5dy5jaGUuZXUiKTsKK01PRFVMRV9ERVNDUklQVElPTigiRVMxMzcwIEF1ZGlvUENJIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGluaXR2b2wgeworCWludCBtaXhjaDsKKwlpbnQgdm9sOworfSBpbml0dm9sW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9QQ00sIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfU1lOVEgsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfQ0QsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfTElORSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FMSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FMiwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FMywgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9NSUMsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfT0dBSU4sIDB4NDA0MCB9Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlczEzNzBfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnM7CisJc3RydWN0IGdhbWVwb3J0ICpncCA9IE5VTEw7CisJbW1fc2VnbWVudF90IGZzOworCWludCBpLCB2YWwsIHJldDsKKworCWlmICgocmV0PXBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpKQorCQlyZXR1cm4gcmV0OworCisJaWYgKCAhKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDApICYgSU9SRVNPVVJDRV9JTykgfHwKKwkgICAgICFwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKQorCSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHBjaWRldi0+aXJxID09IDApIAorCQlyZXR1cm4gLUVOT0RFVjsKKwlpID0gcGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIDB4ZmZmZmZmZmYpOworCWlmIChpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgImVzMTM3MDogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlyZXR1cm4gaTsKKwl9CisJaWYgKCEocyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlczEzNzBfc3RhdGUpLCBHRlBfS0VSTkVMKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXMxMzcwOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IGVzMTM3MF9zdGF0ZSkpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9hZGMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYzEud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYzIud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5taWRpLml3YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5taWRpLm93YWl0KTsKKwlpbml0X01VVEVYKCZzLT5vcGVuX3NlbSk7CisJc3Bpbl9sb2NrX2luaXQoJnMtPmxvY2spOworCXMtPm1hZ2ljID0gRVMxMzcwX01BR0lDOworCXMtPmRldiA9IHBjaWRldjsKKwlzLT5pbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOworCXMtPmlycSA9IHBjaWRldi0+aXJxOworCWlmICghcmVxdWVzdF9yZWdpb24ocy0+aW8sIEVTMTM3MF9FWFRFTlQsICJlczEzNzAiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImVzMTM3MDogaW8gcG9ydHMgJSNseC0lI2x4IGluIHVzZVxuIiwgcy0+aW8sIHMtPmlvK0VTMTM3MF9FWFRFTlQtMSk7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBlcnJfcmVnaW9uOworCX0KKwlpZiAoKHJldD1yZXF1ZXN0X2lycShzLT5pcnEsIGVzMTM3MF9pbnRlcnJ1cHQsIFNBX1NISVJRLCAiZXMxMzcwIixzKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlczEzNzA6IGlycSAldSBpbiB1c2VcbiIsIHMtPmlycSk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwkvKiBpbml0aWFsaXplIGNvZGVjIHJlZ2lzdGVycyAqLworCS8qIG5vdGU6IHNldHRpbmcgQ1RSTF9TRVJSX0RJUyBpcyByZXBvcnRlZCB0byBicmVhaworCSAqIG1pYyBiaWFzIHNldHRpbmcgKGJ5IEtpbS5CZXJ0c0BmaXN1Yi5tYWlsLmFiYi5jb20pICovCisJcy0+Y3RybCA9IENUUkxfQ0RDX0VOIHwgKERBQzJfU1JUT0RJVig4MDAwKSA8PCBDVFJMX1NIX1BDTEtESVYpIHwgKDEgPDwgQ1RSTF9TSF9XVFNSU0VMKTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKDB4MjAwLCBKT1lfRVhURU5ULCAiZXMxMzcwIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlczEzNzA6IGpveXN0aWNrIGlvIHBvcnQgMHgyMDAgaW4gdXNlXG4iKTsKKwl9IGVsc2UgaWYgKCEocy0+Z2FtZXBvcnQgPSBncCA9IGdhbWVwb3J0X2FsbG9jYXRlX3BvcnQoKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJlczEzNzA6IGNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCXJlbGVhc2VfcmVnaW9uKDB4MjAwLCBKT1lfRVhURU5UKTsKKwl9IGVsc2UgeworCQlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkVTUzEzNzAiKTsKKwkJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShzLT5kZXYpKTsKKwkJZ3AtPmRldi5wYXJlbnQgPSAmcy0+ZGV2LT5kZXY7CisJCWdwLT5pbyA9IDB4MjAwOworCQlzLT5jdHJsIHw9IENUUkxfSllTVEtfRU47CisJfQorCWlmIChsaW5lb3V0W2RldmluZGV4XSkKKwkJcy0+Y3RybCB8PSBDVFJMX1hDVEwwOworCWlmIChtaWNiaWFzW2RldmluZGV4XSkKKwkJcy0+Y3RybCB8PSBDVFJMX1hDVEwxOworCXMtPnNjdHJsID0gMDsKKwlwcmludGsoS0VSTl9JTkZPICJlczEzNzA6IGZvdW5kIGFkYXB0ZXIgYXQgaW8gJSNseCBpcnEgJXVcbiIKKwkgICAgICAgS0VSTl9JTkZPICJlczEzNzA6IGZlYXR1cmVzOiBqb3lzdGljayAlcywgbGluZSAlcywgbWljIGltcGVkYW5jZSAlc1xuIiwKKwkgICAgICAgcy0+aW8sIHMtPmlycSwgKHMtPmN0cmwgJiBDVFJMX0pZU1RLX0VOKSA/ICJvbiIgOiAib2ZmIiwKKwkgICAgICAgKHMtPmN0cmwgJiBDVFJMX1hDVEwwKSA/ICJvdXQiIDogImluIiwKKwkJICAgICAgIChzLT5jdHJsICYgQ1RSTF9YQ1RMMSkgPyAiMSIgOiAiMCIpOworCS8qIHJlZ2lzdGVyIGRldmljZXMgKi8KKwlpZiAoKHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZXMxMzcwX2F1ZGlvX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXJldCA9IHMtPmRldl9hdWRpbzsKKwkJZ290byBlcnJfZGV2MTsKKwl9CisJaWYgKChzLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmZXMxMzcwX21peGVyX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXJldCA9IHMtPmRldl9taXhlcjsKKwkJZ290byBlcnJfZGV2MjsKKwl9CisJaWYgKChzLT5kZXZfZGFjID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlczEzNzBfZGFjX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXJldCA9IHMtPmRldl9kYWM7CisJCWdvdG8gZXJyX2RldjM7CisJfQorCWlmICgocy0+ZGV2X21pZGkgPSByZWdpc3Rlcl9zb3VuZF9taWRpKCZlczEzNzBfbWlkaV9mb3BzLCAtMSkpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfbWlkaTsKKwkJZ290byBlcnJfZGV2NDsKKwl9CisJLyogaW5pdGlhbGl6ZSB0aGUgY2hpcHMgKi8KKwlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MF9SRUdfQ09OVFJPTCk7CisJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcwX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJLyogcG9pbnQgcGhhbnRvbSB3cml0ZSBjaGFubmVsIHRvICJidWdidWYiICovCisJcy0+YnVnYnVmX2NwdSA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHBjaWRldiwxNiwmcy0+YnVnYnVmX2RtYSk7CisJaWYgKCFzLT5idWdidWZfY3B1KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyX2RldjU7CisJfQorCW91dGwoKEVTMTM3MF9SRUdfUEhBTlRPTV9GUkFNRUFEUiA+PiA4KSAmIDE1LCBzLT5pbytFUzEzNzBfUkVHX01FTVBBR0UpOworCW91dGwocy0+YnVnYnVmX2RtYSwgcy0+aW8rKEVTMTM3MF9SRUdfUEhBTlRPTV9GUkFNRUFEUiAmIDB4ZmYpKTsKKwlvdXRsKDAsIHMtPmlvKyhFUzEzNzBfUkVHX1BIQU5UT01fRlJBTUVDTlQgJiAweGZmKSk7CisJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsgIC8qIGVuYWJsZSBidXMgbWFzdGVyaW5nICovCisJd3Jjb2RlYyhzLCAweDE2LCAzKTsgLyogbm8gUlNULCBQRCAqLworCXdyY29kZWMocywgMHgxNywgMCk7IC8qIENPREVDIEFEQyBhbmQgQ09ERUMgREFDIHVzZSB7TFIsQn1DTEsyIGFuZCBydW4gb2ZmIHRoZSBMUkNMSzIgUExMOyBwcm9ncmFtIERBQ19TWU5DPTAhISAgKi8KKwl3cmNvZGVjKHMsIDB4MTgsIDApOyAvKiByZWNvcmRpbmcgc291cmNlIGlzIG1peGVyICovCisJd3Jjb2RlYyhzLCAweDE5LCBzLT5taXgubWljcHJlYW1wID0gMSk7IC8qIHR1cm4gb24gTUlDIHByZWFtcCAqLworCXMtPm1peC5pbWl4ID0gMTsKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCXZhbCA9IFNPVU5EX01BU0tfTElORXxTT1VORF9NQVNLX1NZTlRIfFNPVU5EX01BU0tfQ0Q7CisJbWl4ZXJfaW9jdGwocywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGluaXR2b2wpL3NpemVvZihpbml0dm9sWzBdKTsgaSsrKSB7CisJCXZhbCA9IGluaXR2b2xbaV0udm9sOworCQltaXhlcl9pb2N0bChzLCBpbml0dm9sW2ldLm1peGNoLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwl9CisJc2V0X2ZzKGZzKTsKKworCS8qIHJlZ2lzdGVyIGdhbWVwb3J0ICovCisJaWYgKGdwKQorCQlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKKworCS8qIHN0b3JlIGl0IGluIHRoZSBkcml2ZXIgZmllbGQgKi8KKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBzKTsKKwkvKiBwdXQgaXQgaW50byBkcml2ZXIgbGlzdCAqLworCWxpc3RfYWRkX3RhaWwoJnMtPmRldnMsICZkZXZzKTsKKwkvKiBpbmNyZW1lbnQgZGV2aW5kZXggKi8KKwlpZiAoZGV2aW5kZXggPCBOUl9ERVZJQ0UtMSkKKwkJZGV2aW5kZXgrKzsKKwlyZXR1cm4gMDsKKworIGVycl9kZXY1OgorCXVucmVnaXN0ZXJfc291bmRfbWlkaShzLT5kZXZfbWlkaSk7CisgZXJyX2RldjQ6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2RhYyk7CisgZXJyX2RldjM6CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5kZXZfbWl4ZXIpOworIGVycl9kZXYyOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisgZXJyX2RldjE6CisJcHJpbnRrKEtFUk5fRVJSICJlczEzNzA6IGNhbm5vdCByZWdpc3RlciBtaXNjIGRldmljZVxuIik7CisJZnJlZV9pcnEocy0+aXJxLCBzKTsKKwlpZiAocy0+Z2FtZXBvcnQpIHsKKwkJcmVsZWFzZV9yZWdpb24ocy0+Z2FtZXBvcnQtPmlvLCBKT1lfRVhURU5UKTsKKwkJZ2FtZXBvcnRfZnJlZV9wb3J0KHMtPmdhbWVwb3J0KTsKKwl9CisgZXJyX2lycToKKwlyZWxlYXNlX3JlZ2lvbihzLT5pbywgRVMxMzcwX0VYVEVOVCk7CisgZXJyX3JlZ2lvbjoKKwlrZnJlZShzKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZXMxMzcwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBlczEzNzBfc3RhdGUgKnMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghcykKKwkJcmV0dXJuOworCWxpc3RfZGVsKCZzLT5kZXZzKTsKKwlvdXRsKENUUkxfU0VSUl9ESVMgfCAoMSA8PCBDVFJMX1NIX1dUU1JTRUwpLCBzLT5pbytFUzEzNzBfUkVHX0NPTlRST0wpOyAvKiBzd2l0Y2ggZXZlcnl0aGluZyBvZmYgKi8KKwlvdXRsKDAsIHMtPmlvK0VTMTM3MF9SRUdfU0VSSUFMX0NPTlRST0wpOyAvKiBjbGVhciBzZXJpYWwgaW50ZXJydXB0cyAqLworCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisJaWYgKHMtPmdhbWVwb3J0KSB7CisJCWludCBncGlvID0gcy0+Z2FtZXBvcnQtPmlvOworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQocy0+Z2FtZXBvcnQpOworCQlyZWxlYXNlX3JlZ2lvbihncGlvLCBKT1lfRVhURU5UKTsKKwl9CisJcmVsZWFzZV9yZWdpb24ocy0+aW8sIEVTMTM3MF9FWFRFTlQpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5kZXZfbWl4ZXIpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9kYWMpOworCXVucmVnaXN0ZXJfc291bmRfbWlkaShzLT5kZXZfbWlkaSk7CisJcGNpX2ZyZWVfY29uc2lzdGVudChkZXYsIDE2LCBzLT5idWdidWZfY3B1LCBzLT5idWdidWZfZG1hKTsKKwlrZnJlZShzKTsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzAsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBlczEzNzBfZHJpdmVyID0geworCS5uYW1lCQk9ICJlczEzNzAiLAorCS5pZF90YWJsZQk9IGlkX3RhYmxlLAorCS5wcm9iZQkJPSBlczEzNzBfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChlczEzNzBfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfZXMxMzcwKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiZXMxMzcwOiB2ZXJzaW9uIHYwLjM4IHRpbWUgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmZXMxMzcwX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2VzMTM3MCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gImVzMTM3MDogdW5sb2FkaW5nXG4iKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmVzMTM3MF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X2VzMTM3MCk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2VzMTM3MCk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE1PRFVMRQorCisvKiBmb3JtYXQgaXM6IGVzMTM3MD1saW5lb3V0WyxtaWNiaWFzXV0gKi8KKworc3RhdGljIGludCBfX2luaXQgZXMxMzcwX3NldHVwKGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgdW5zaWduZWQgX19pbml0ZGF0YSBucl9kZXYgPSAwOworCisJaWYgKG5yX2RldiA+PSBOUl9ERVZJQ0UpCisJCXJldHVybiAwOworCisJKHZvaWQpCisJKChnZXRfb3B0aW9uKCZzdHIsJmxpbmVvdXQgW25yX2Rldl0pID09IDIpCisJICYmIGdldF9vcHRpb24oJnN0ciwmbWljYmlhcyBbbnJfZGV2XSkKKwkpOworCisJbnJfZGV2Kys7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImVzMTM3MD0iLCBlczEzNzBfc2V0dXApOworCisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZXMxMzcxLmMgYi9zb3VuZC9vc3MvZXMxMzcxLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwZmRkYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9lczEzNzEuYwpAQCAtMCwwICsxLDMwOTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqICAgICAgZXMxMzcxLmMgIC0tICBDcmVhdGl2ZSBFbnNvbmlxIEVTMTM3MS4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAxLCAyMDAzICBUaG9tYXMgU2FpbGVyICh0LnNhaWxlckBhbHVtbmkuZXRoei5jaCkKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogU3BlY2lhbCB0aGFua3MgdG8gRW5zb25pcQorICoKKyAqICBTdXBwb3J0ZWQgZGV2aWNlczoKKyAqICAvZGV2L2RzcCAgICBzdGFuZGFyZCAvZGV2L2RzcCBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCisgKiAgL2Rldi9taXhlciAgc3RhbmRhcmQgL2Rldi9taXhlciBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCisgKiAgL2Rldi9kc3AxICAgYWRkaXRpb25hbCBEQUMsIGxpa2UgL2Rldi9kc3AsIGJ1dCBvdXRwdXRzIHRvIG1peGVyICJTWU5USCIgc2V0dGluZworICogIC9kZXYvbWlkaSAgIHNpbXBsZSBNSURJIFVBUlQgaW50ZXJmYWNlLCBubyBpb2N0bAorICoKKyAqICBOT1RFOiB0aGUgY2FyZCBkb2VzIG5vdCBoYXZlIGFueSBGTS9XYXZldGFibGUgc3ludGhlc2l6ZXIsIGl0IGlzIHN1cHBvc2VkCisgKiAgdG8gYmUgZG9uZSBpbiBzb2Z0d2FyZS4gVGhhdCBpcyB3aGF0IC9kZXYvZGFjIGlzIGZvci4gQnkgbm93IChRMiAxOTk4KQorICogIHRoZXJlIGFyZSBzZXZlcmFsIE1JREkgdG8gUENNIChXQVYpIHBhY2thZ2VzLCBvbmUgb2YgdGhlbSBpcyB0aW1pZGl0eS4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMDQuMDYuMTk5OCAgIDAuMSAgIEluaXRpYWwgcmVsZWFzZQorICogICAgICAgICAgICAgICAgICAgICAgIE1peGVyIHN0dWZmIHNob3VsZCBiZSBvdmVyaGF1bGVkOyBlc3BlY2lhbGx5IG9wdGlvbmFsIEFDOTcgbWl4ZXIgYml0cworICogICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBkZXRlY3RlZC4gVGhpcyByZXN1bHRzIGluIHN0cmFuZ2UgYmVoYXZpb3VyIG9mIHNvbWUgbWl4ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncywgbGlrZSBtYXN0ZXIgdm9sdW1lIGFuZCBtaWMuCisgKiAgICAwOC4wNi4xOTk4ICAgMC4yICAgRmlyc3QgcmVsZWFzZSB1c2luZyBBbGFuIENveCcgc291bmRjb3JlIGluc3RlYWQgb2YgbWlzY2RldmljZQorICogICAgMDMuMDguMTk5OCAgIDAuMyAgIERvIG5vdCBpbmNsdWRlIG1vZHZlcnNpb25zLmgKKyAqICAgICAgICAgICAgICAgICAgICAgICBOb3cgbWl4ZXIgYmVoYXZpb3VyIGNhbiBiYXNpY2FsbHkgYmUgc2VsZWN0ZWQgYmV0d2VlbgorICogICAgICAgICAgICAgICAgICAgICAgICJPU1MgZG9jdW1lbnRlZCIgYW5kICJPU1MgYWN0dWFsIiBiZWhhdmlvdXIKKyAqICAgIDMxLjA4LjE5OTggICAwLjQgICBGaXggcmVhbHBsYXllciBwcm9ibGVtcyAtIGRhYy5jb3VudCBpc3N1ZXMKKyAqICAgIDI3LjEwLjE5OTggICAwLjUgICBGaXggam95c3RpY2sgc3VwcG9ydAorICogICAgICAgICAgICAgICAgICAgICAgIC0tIE9saXZlciBOZXVrdW0gKGMxODhAb3JnLmNoZW1pZS51bmktbXVlbmNoZW4uZGUpCisgKiAgICAxMC4xMi4xOTk4ICAgMC42ICAgRml4IGRyYWluX2RhYyB0cnlpbmcgdG8gd2FpdCBvbiBub3QgeWV0IGluaXRpYWxpemVkIERNQQorICogICAgMjMuMTIuMTk5OCAgIDAuNyAgIEZpeCBhIGZldyBmX2ZpbGUgJiBGTU9ERV8gYnVncworICogICAgICAgICAgICAgICAgICAgICAgIERvbid0IHdha2UgdXAgYXBwIHVudGlsIHRoZXJlIGFyZSBmcmFnc2l6ZSBieXRlcyB0byByZWFkL3dyaXRlCisgKiAgICAwNi4wMS4xOTk5ICAgMC44ICAgcmVtb3ZlIHRoZSBzaWxseSBTQV9JTlRFUlJVUFQgZmxhZy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBob3BlZnVsbHkga2lsbGVkIHRoZSBlZ2NzIHNlY3Rpb24gdHlwZSBjb25mbGljdAorICogICAgMTIuMDMuMTk5OSAgIDAuOSAgIGNpbmZvLmJsb2NrcyBzaG91bGQgYmUgcmVzZXQgYWZ0ZXIgR0VUeFBUUiBpb2N0bC4KKyAqICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZCBieSBKb2hhbiBNYWVzIDxqb21hQHRlbGluZHVzLmJlPgorICogICAgMjIuMDMuMTk5OSAgIDAuMTAgIHJldHVybiBFQUdBSU4gaW5zdGVhZCBvZiBFQlVTWSB3aGVuIE9fTk9OQkxPQ0sKKyAqICAgICAgICAgICAgICAgICAgICAgICByZWFkL3dyaXRlIGNhbm5vdCBiZSBleGVjdXRlZAorICogICAgMDcuMDQuMTk5OSAgIDAuMTEgIGltcGxlbWVudGVkIHRoZSBmb2xsb3dpbmcgaW9jdGwnczogU09VTkRfUENNX1JFQURfUkFURSwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgU09VTkRfUENNX1JFQURfQ0hBTk5FTFMsIFNPVU5EX1BDTV9SRUFEX0JJVFM7IAorICogICAgICAgICAgICAgICAgICAgICAgIEFscGhhIGZpeGVzIHJlcG9ydGVkIGJ5IFBldGVyIEpvbmVzIDxwam9uZXNAcmVkaGF0LmNvbT4KKyAqICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyIEFscGhhIGZpeCAod2FpdF9zcmNfcmVhZHkgaW4gaW5pdCByb3V0aW5lKQorICogICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGJ5ICJJdmFuIE4uIEtva3NoYXlza3kiIDxpbmtAanVyYXNzaWMucGFyay5tc3UucnU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogam95c3RpY2sgYWRkcmVzcyBoYW5kbGluZyBtaWdodCBzdGlsbCBiZSB3cm9uZyBvbiBhcmNocworICogICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHRoYW4gaTM4NgorICogICAgMTUuMDYuMTk5OSAgIDAuMTIgIEZpeCBiYWQgYWxsb2NhdGlvbiBidWcuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVGhhbmtzIHRvIERldGkgRmxpZWdsIDxmbGllZ2xAaW4udHVtLmRlPgorICogICAgMjguMDYuMTk5OSAgIDAuMTMgIEFkZCBwY2lfc2V0X21hc3RlcgorICogICAgMDMuMDguMTk5OSAgIDAuMTQgIGFkYXB0IHRvIExpbnVzJyBuZXcgX19zZXR1cC9fX2luaXRjYWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gImVzMTM3MT1qb3lzdGlja2FkZHIiCisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBDT05GSUdfU09VTkRfRVMxMzcxX0pPWVBPUlRfQk9PVCBrbHVkZ2UKKyAqICAgIDEwLjA4LjE5OTkgICAwLjE1ICAoUmUpYWRkZWQgUy9QRElGIG1vZHVsZSBvcHRpb24gZm9yIGNhcmRzIHJldmlzaW9uID49IDQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgSW5pdGlhbCB2ZXJzaW9uIGJ5IERhdmUgUGxhdHQgPGRwbGF0dEBzbnVsYnVnLm10dmlldy5jYS51cz4uCisgKiAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlX2luaXQvX19zZXR1cCBmaXhlcworICogICAgMDguMTYuMTk5OSAgIDAuMTYgIEpvZSBDb3RlbGxlc2UgPGpvZWNAZW5zb25pcS5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgQWRkZWQgZGV0ZWN0aW9uIGZvciBFUzEzNzEgcmV2aXNpb24gSUQgc28gdGhhdCB3ZSBjYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3QgdGhlIEVTMTM3MyBhbmQgbGF0ZXIgcGFydHMuCisgKiAgICAgICAgICAgICAgICAgICAgICAgYWRkZWQgQUM5NyAjZGVmaW5lcyBmb3IgcmVhZGFiaWxpdHkKKyAqICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBhIC9wcm9jIGZpbGUgc3lzdGVtIGZvciBkdW1waW5nIGhhcmR3YXJlIHN0YXRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZCBTUkMgYW5kIENPREVDIHcvciBmdW5jdGlvbnMgdG8gYWNjb21tb2RhdGUgYnVncworICogICAgICAgICAgICAgICAgICAgICAgIGluIHNvbWUgdmVyc2lvbnMgb2YgdGhlIEVTMTM3eCBjaGlwcy4KKyAqICAgIDMxLjA4LjE5OTkgICAwLjE3ICBhZGQgc3Bpbl9sb2NrX2luaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlZCBjdXJyZW50LT5zdGF0ZSA9IHggd2l0aCBzZXRfY3VycmVudF9zdGF0ZSh4KQorICogICAgMDMuMDkuMTk5OSAgIDAuMTggIGNoYW5nZSByZWFkIHNlbWFudGljcyBmb3IgTUlESSB0byBtYXRjaAorICogICAgICAgICAgICAgICAgICAgICAgIE9TUyBtb3JlIGNsb3NlbHk7IHJlbW92ZSBwb3NzaWJsZSB3YWtldXAgcmFjZQorICogICAgMjEuMTAuMTk5OSAgIDAuMTkgIFJvdW5kIHNhbXBsaW5nIHJhdGVzLCByZXF1ZXN0ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICBLYXNhbWF0c3UgS2VuaWNoaSA8dDI5dzAyNjdAaXAubWVkaWEua3lvdG8tdS5hYy5qcD4KKyAqICAgIDI3LjEwLjE5OTkgICAwLjIwICBBZGRlZCBTaWdtYVRlbCAzRCBlbmhhbmNlbWVudCBzdHJpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICBDb2RlYyBJRCBwcmludGluZyBjaGFuZ2VzCisgKiAgICAyOC4xMC4xOTk5ICAgMC4yMSAgTW9yZSB3YWl0cXVldWUgcmFjZXMgZml4ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICBKb2UgQ290ZWxsZXNlIDxqb2VjQGVuc29uaXEuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgUENJIGRldGVjdGlvbiByb3V0aW5lIHNvIHdlIGNhbiBtb3JlIGVhc2lseQorICogICAgICAgICAgICAgICAgICAgICAgIGRldGVjdCBFUzEzN3ggY2hpcCBhbmQgZGVyaXZhdGl2ZXMuCisgKiAgICAwNS4wMS4yMDAwICAgMC4yMiAgU2hvdWxkIG5vdyB3b3JrIHdpdGggcmV2NyBib2FyZHM7IHBhdGNoIGJ5CisgKiAgICAgICAgICAgICAgICAgICAgICAgRXJpYyBMZW1hciwgZWxlbWFyQGNzLndhc2hpbmd0b24uZWR1CisgKiAgICAwOC4wMS4yMDAwICAgMC4yMyAgUHJldmVudCBzb21lIGlvY3RsJ3MgZnJvbSByZXR1cm5pbmcgYmFkIGNvdW50IHZhbHVlcyBvbiB1bmRlcnJ1bi9vdmVycnVuOworICogICAgICAgICAgICAgICAgICAgICAgIFRpbSBKYW5paydzIEJTRSAoQmVkZXZpbGxlZCBTb3VuZCBFbmdpbmUpIGZvdW5kIHRoaXMKKyAqICAgIDA3LjAyLjIwMDAgICAwLjI0ICBVc2UgcGNpX2FsbG9jX2NvbnNpc3RlbnQgYW5kIHBjaV9yZWdpc3Rlcl9kcml2ZXIKKyAqICAgIDA3LjAyLjIwMDAgICAwLjI1ICBVc2UgYWM5N19jb2RlYworICogICAgMDEuMDMuMjAwMCAgIDAuMjYgIFNQRElGIHBhdGNoIGJ5IE1pa2FlbCBCb3VpbGxvdCA8bWlrYWVsLmJvdWlsbG90QGJpZ2Zvb3QuY29tPgorICogICAgICAgICAgICAgICAgICAgICAgIFVzZSBwY2lfbW9kdWxlX2luaXQKKyAqICAgIDIxLjExLjIwMDAgICAwLjI3ICBJbml0aWFsaXplIGRtYSBidWZmZXJzIGluIHBvbGwsIG90aGVyd2lzZSBwb2xsIG1heSByZXR1cm4gYSBib2d1cyBtYXNrCisgKiAgICAxMi4xMi4yMDAwICAgMC4yOCAgTW9yZSBkbWEgYnVmZmVyIGluaXRpYWxpemF0aW9ucywgcGF0Y2ggZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgIFRqZWVyZCBNdWxkZXIgPHRqZWVyZC5tdWxkZXJAZnVqaXRzdS1zaWVtZW5zLmNvbT4KKyAqICAgIDA1LjAxLjIwMDEgICAwLjI5ICBIb3BlZnVsbHkgdXBkYXRlcyB3aWxsIG5vdCBiZSByZXF1aXJlZCBhbnltb3JlIHdoZW4gQ3JlYXRpdmUgYnVtcHMKKyAqICAgICAgICAgICAgICAgICAgICAgICB0aGUgQ1Q1ODgwIHJldmlzaW9uLgorICogICAgICAgICAgICAgICAgICAgICAgIHN1Z2dlc3RlZCBieSBTdGVwaGFuIE38bGxlciA8c211ZWxsZXJAY2hyb25veC5kZT4KKyAqICAgIDMxLjAxLjIwMDEgICAwLjMwICBSZWdpc3Rlci9VbnJlZ2lzdGVyIGdhbWVwb3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgRml4IFNFVFRSSUdHRVIgbm9uIE9TUyBBUEkgY29uZm9ybWl0eQorICogICAgMTQuMDcuMjAwMSAgIDAuMzEgIEFkZCBsaXN0IG9mIGxhcHRvcHMgbmVlZGluZyBhbXBsaWZpZXIgY29udHJvbAorICogICAgMDMuMDEuMjAwMyAgIDAuMzIgIG9wZW5fbW9kZSBmaXhlcyBmcm9tIEdlb3JnIEFjaGVyIDxhY2hlckBpbi50dW0uZGU+CisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjdW5kZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisjZGVmaW5lIEVTMTM3MV9ERUJVRworI2RlZmluZSBEQkcoeCkge30KKy8qI2RlZmluZSBEQkcoeCkge3h9Ki8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9FTlNPTklRCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfRU5TT05JUSAgICAgICAgMHgxMjc0ICAgIAorI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9FQ1RJVkEKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FQ1RJVkEgICAgICAgICAweDExMDIKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzEKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FTlNPTklRX0VTMTM3MSAweDEzNzEKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9DVDU4ODAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MCAweDU4ODAKKyNlbmRpZgorCisjaWZuZGVmIFBDSV9ERVZJQ0VfSURfRUNUSVZBX0VWMTkzOAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VDVElWQV9FVjE5MzggMHg4OTM4CisjZW5kaWYKKworLyogRVMxMzcxIGNoaXAgSUQgKi8KKy8qIFRoaXMgaXMgYSBsaXR0bGUgY29uZnVzaW5nIGJlY2F1c2UgYWxsIEVTMTM3MSBjb21wYXRpYmxlIGNoaXBzIGhhdmUgdGhlCisgICBzYW1lIERFVklDRV9JRCwgdGhlIG9ubHkgdGhpbmcgZGlmZmVyZW50aWF0aW5nIHRoZW0gaXMgdGhlIFJFVl9JRCBmaWVsZC4KKyAgIFRoaXMgaXMgb25seSBzaWduaWZpY2FudCBpZiB5b3Ugd2FudCB0byBlbmFibGUgZmVhdHVyZXMgb24gdGhlIGxhdGVyIHBhcnRzLgorICAgWWVzLCBJIGtub3cgaXQncyBzdHVwaWQgYW5kIHdoeSBkaWRuJ3Qgd2UgdXNlIHRoZSBzdWIgSURzPworKi8KKyNkZWZpbmUgRVMxMzcxUkVWX0VTMTM3M19BICAweDA0CisjZGVmaW5lIEVTMTM3MVJFVl9FUzEzNzNfQiAgMHgwNgorI2RlZmluZSBFUzEzNzFSRVZfQ1Q1ODgwX0EgIDB4MDcKKyNkZWZpbmUgQ1Q1ODgwUkVWX0NUNTg4MF9DICAweDAyCisjZGVmaW5lIENUNTg4MFJFVl9DVDU4ODBfRCAgMHgwMworI2RlZmluZSBFUzEzNzFSRVZfRVMxMzcxX0IgIDB4MDkKKyNkZWZpbmUgRVYxOTM4UkVWX0VWMTkzOF9BICAweDAwCisjZGVmaW5lIEVTMTM3MVJFVl9FUzEzNzNfOCAgMHgwOAorCisjZGVmaW5lIEVTMTM3MV9NQUdJQyAgKChQQ0lfVkVORE9SX0lEX0VOU09OSVE8PDE2KXxQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxKQorCisjZGVmaW5lIEVTMTM3MV9FWFRFTlQgICAgICAgICAgICAgMHg0MAorI2RlZmluZSBKT1lfRVhURU5UICAgICAgICAgICAgICAgIDgKKworI2RlZmluZSBFUzEzNzFfUkVHX0NPTlRST0wgICAgICAgIDB4MDAKKyNkZWZpbmUgRVMxMzcxX1JFR19TVEFUVVMgICAgICAgICAweDA0IC8qIG9uIHRoZSA1ODgwIGl0IGlzIGNvbnRyb2wvc3RhdHVzICovCisjZGVmaW5lIEVTMTM3MV9SRUdfVUFSVF9EQVRBICAgICAgMHgwOAorI2RlZmluZSBFUzEzNzFfUkVHX1VBUlRfU1RBVFVTICAgIDB4MDkKKyNkZWZpbmUgRVMxMzcxX1JFR19VQVJUX0NPTlRST0wgICAweDA5CisjZGVmaW5lIEVTMTM3MV9SRUdfVUFSVF9URVNUICAgICAgMHgwYQorI2RlZmluZSBFUzEzNzFfUkVHX01FTVBBR0UgICAgICAgIDB4MGMKKyNkZWZpbmUgRVMxMzcxX1JFR19TUkNPTlYgICAgICAgICAweDEwCisjZGVmaW5lIEVTMTM3MV9SRUdfQ09ERUMgICAgICAgICAgMHgxNAorI2RlZmluZSBFUzEzNzFfUkVHX0xFR0FDWSAgICAgICAgIDB4MTgKKyNkZWZpbmUgRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCAweDIwCisjZGVmaW5lIEVTMTM3MV9SRUdfREFDMV9TQ09VTlQgICAgMHgyNAorI2RlZmluZSBFUzEzNzFfUkVHX0RBQzJfU0NPVU5UICAgIDB4MjgKKyNkZWZpbmUgRVMxMzcxX1JFR19BRENfU0NPVU5UICAgICAweDJjCisKKyNkZWZpbmUgRVMxMzcxX1JFR19EQUMxX0ZSQU1FQURSICAweGMzMAorI2RlZmluZSBFUzEzNzFfUkVHX0RBQzFfRlJBTUVDTlQgIDB4YzM0CisjZGVmaW5lIEVTMTM3MV9SRUdfREFDMl9GUkFNRUFEUiAgMHhjMzgKKyNkZWZpbmUgRVMxMzcxX1JFR19EQUMyX0ZSQU1FQ05UICAweGMzYworI2RlZmluZSBFUzEzNzFfUkVHX0FEQ19GUkFNRUFEUiAgIDB4ZDMwCisjZGVmaW5lIEVTMTM3MV9SRUdfQURDX0ZSQU1FQ05UICAgMHhkMzQKKworI2RlZmluZSBFUzEzNzFfRk1UX1U4X01PTk8gICAgIDAKKyNkZWZpbmUgRVMxMzcxX0ZNVF9VOF9TVEVSRU8gICAxCisjZGVmaW5lIEVTMTM3MV9GTVRfUzE2X01PTk8gICAgMgorI2RlZmluZSBFUzEzNzFfRk1UX1MxNl9TVEVSRU8gIDMKKyNkZWZpbmUgRVMxMzcxX0ZNVF9TVEVSRU8gICAgICAxCisjZGVmaW5lIEVTMTM3MV9GTVRfUzE2ICAgICAgICAgMgorI2RlZmluZSBFUzEzNzFfRk1UX01BU0sgICAgICAgIDMKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaXplW10gPSB7IDEsIDIsIDIsIDQgfTsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2hpZnRbXSA9IHsgMCwgMSwgMSwgMiB9OworCisjZGVmaW5lIENUUkxfUkVDRU5fQiAgICAweDA4MDAwMDAwICAvKiAxID0gZG9uJ3QgbWl4IGFuYWxvZyBpbiB0byBkaWdpdGFsIG91dCAqLworI2RlZmluZSBDVFJMX1NQRElGRU5fQiAgMHgwNDAwMDAwMAorI2RlZmluZSBDVFJMX0pPWV9TSElGVCAgMjQKKyNkZWZpbmUgQ1RSTF9KT1lfTUFTSyAgIDMKKyNkZWZpbmUgQ1RSTF9KT1lfMjAwICAgIDB4MDAwMDAwMDAgIC8qIGpveXN0aWNrIGJhc2UgYWRkcmVzcyAqLworI2RlZmluZSBDVFJMX0pPWV8yMDggICAgMHgwMTAwMDAwMAorI2RlZmluZSBDVFJMX0pPWV8yMTAgICAgMHgwMjAwMDAwMAorI2RlZmluZSBDVFJMX0pPWV8yMTggICAgMHgwMzAwMDAwMAorI2RlZmluZSBDVFJMX0dQSU9fSU4wICAgMHgwMDEwMDAwMCAgLyogZ2VuZXJhbCBwdXJwb3NlIGlucHV0cy9vdXRwdXRzICovCisjZGVmaW5lIENUUkxfR1BJT19JTjEgICAweDAwMjAwMDAwCisjZGVmaW5lIENUUkxfR1BJT19JTjIgICAweDAwNDAwMDAwCisjZGVmaW5lIENUUkxfR1BJT19JTjMgICAweDAwODAwMDAwCisjZGVmaW5lIENUUkxfR1BJT19PVVQwICAweDAwMDEwMDAwCisjZGVmaW5lIENUUkxfR1BJT19PVVQxICAweDAwMDIwMDAwCisjZGVmaW5lIENUUkxfR1BJT19PVVQyICAweDAwMDQwMDAwCisjZGVmaW5lIENUUkxfR1BJT19PVVQzICAweDAwMDgwMDAwCisjZGVmaW5lIENUUkxfTVNGTVRTRUwgICAweDAwMDA4MDAwICAvKiBNUEVHIHNlcmlhbCBkYXRhIGZtdDogMCA9IFNvbnksIDEgPSBJMlMgKi8KKyNkZWZpbmUgQ1RSTF9TWU5DUkVTICAgIDB4MDAwMDQwMDAgIC8qIEFDOTcgd2FybSByZXNldCAqLworI2RlZmluZSBDVFJMX0FEQ1NUT1AgICAgMHgwMDAwMjAwMCAgLyogc3RvcCBBREMgdHJhbnNmZXJzICovCisjZGVmaW5lIENUUkxfUFdSX0lOVFJNICAweDAwMDAxMDAwICAvKiAxID0gcG93ZXIgbGV2ZWwgaW50cyBlbmFibGVkICovCisjZGVmaW5lIENUUkxfTV9DQiAgICAgICAweDAwMDAwODAwICAvKiByZWNvcmRpbmcgc291cmNlOiAwID0gQURDLCAxID0gTVBFRyAqLworI2RlZmluZSBDVFJMX0NDQl9JTlRSTSAgMHgwMDAwMDQwMCAgLyogMSA9IENDQiAidm9pY2UiIGludHMgZW5hYmxlZCAqLworI2RlZmluZSBDVFJMX1BETEVWMCAgICAgMHgwMDAwMDAwMCAgLyogcG93ZXIgZG93biBsZXZlbCAqLworI2RlZmluZSBDVFJMX1BETEVWMSAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBDVFJMX1BETEVWMiAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBDVFJMX1BETEVWMyAgICAgMHgwMDAwMDMwMAorI2RlZmluZSBDVFJMX0JSRVEgICAgICAgMHgwMDAwMDA4MCAgLyogMSA9IHRlc3QgbW9kZSAoaW50ZXJuYWwgbWVtIHRlc3QpICovCisjZGVmaW5lIENUUkxfREFDMV9FTiAgICAweDAwMDAwMDQwICAvKiBlbmFibGUgREFDMSAqLworI2RlZmluZSBDVFJMX0RBQzJfRU4gICAgMHgwMDAwMDAyMCAgLyogZW5hYmxlIERBQzIgKi8KKyNkZWZpbmUgQ1RSTF9BRENfRU4gICAgIDB4MDAwMDAwMTAgIC8qIGVuYWJsZSBBREMgKi8KKyNkZWZpbmUgQ1RSTF9VQVJUX0VOICAgIDB4MDAwMDAwMDggIC8qIGVuYWJsZSBNSURJIHVhcnQgKi8KKyNkZWZpbmUgQ1RSTF9KWVNUS19FTiAgIDB4MDAwMDAwMDQgIC8qIGVuYWJsZSBKb3lzdGljayBwb3J0ICovCisjZGVmaW5lIENUUkxfWFRBTENMS0RJUyAweDAwMDAwMDAyICAvKiAxID0gZGlzYWJsZSBjcnlzdGFsIGNsb2NrIGlucHV0ICovCisjZGVmaW5lIENUUkxfUENJQ0xLRElTICAweDAwMDAwMDAxICAvKiAxID0gZGlzYWJsZSBQQ0kgY2xvY2sgZGlzdHJpYnV0aW9uICovCisKKworI2RlZmluZSBTVEFUX0lOVFIgICAgICAgMHg4MDAwMDAwMCAgLyogd2lyZWQgb3Igb2YgYWxsIGludGVycnVwdCBiaXRzICovCisjZGVmaW5lIENTVEFUXzU4ODBfQUM5N19SU1QgMHgyMDAwMDAwMCAvKiBDVDU4ODAgUmVzZXQgYml0ICovCisjZGVmaW5lIFNUQVRfRU5fU1BESUYgICAweDAwMDQwMDAwICAvKiBlbmFibGUgUy9QRElGIGNpcmN1aXRyeSAqLworI2RlZmluZSBTVEFUX1RTX1NQRElGICAgMHgwMDAyMDAwMCAgLyogdGVzdCBTL1BESUYgY2lyY3VpdHJ5ICovCisjZGVmaW5lIFNUQVRfVEVTVE1PREUgICAweDAwMDEwMDAwICAvKiB0ZXN0IEFTSUMgKi8KKyNkZWZpbmUgU1RBVF9TWU5DX0VSUiAgIDB4MDAwMDAxMDAgIC8qIDEgPSBjb2RlYyBzeW5jIGVycm9yICovCisjZGVmaW5lIFNUQVRfVkMgICAgICAgICAweDAwMDAwMGMwICAvKiBDQ0IgaW50IHNvdXJjZSwgMD1EQUMxLCAxPURBQzIsIDI9QURDLCAzPXVuZGVmICovCisjZGVmaW5lIFNUQVRfU0hfVkMgICAgICA2CisjZGVmaW5lIFNUQVRfTVBXUiAgICAgICAweDAwMDAwMDIwICAvKiBwb3dlciBsZXZlbCBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU1RBVF9NQ0NCICAgICAgIDB4MDAwMDAwMTAgIC8qIENDQiBpbnQgcGVuZGluZyAqLworI2RlZmluZSBTVEFUX1VBUlQgICAgICAgMHgwMDAwMDAwOCAgLyogVUFSVCBpbnQgcGVuZGluZyAqLworI2RlZmluZSBTVEFUX0RBQzEgICAgICAgMHgwMDAwMDAwNCAgLyogREFDMSBpbnQgcGVuZGluZyAqLworI2RlZmluZSBTVEFUX0RBQzIgICAgICAgMHgwMDAwMDAwMiAgLyogREFDMiBpbnQgcGVuZGluZyAqLworI2RlZmluZSBTVEFUX0FEQyAgICAgICAgMHgwMDAwMDAwMSAgLyogQURDIGludCBwZW5kaW5nICovCisKKyNkZWZpbmUgVVNUQVRfUlhJTlQgICAgIDB4ODAgICAgICAgIC8qIFVBUlQgcnggaW50IHBlbmRpbmcgKi8KKyNkZWZpbmUgVVNUQVRfVFhJTlQgICAgIDB4MDQgICAgICAgIC8qIFVBUlQgdHggaW50IHBlbmRpbmcgKi8KKyNkZWZpbmUgVVNUQVRfVFhSRFkgICAgIDB4MDIgICAgICAgIC8qIFVBUlQgdHggcmVhZHkgKi8KKyNkZWZpbmUgVVNUQVRfUlhSRFkgICAgIDB4MDEgICAgICAgIC8qIFVBUlQgcnggcmVhZHkgKi8KKworI2RlZmluZSBVQ1RSTF9SWElOVEVOICAgMHg4MCAgICAgICAgLyogMSA9IGVuYWJsZSBSWCBpbnRzICovCisjZGVmaW5lIFVDVFJMX1RYSU5URU4gICAweDYwICAgICAgICAvKiBUWCBpbnQgZW5hYmxlIGZpZWxkIG1hc2sgKi8KKyNkZWZpbmUgVUNUUkxfRU5BX1RYSU5UIDB4MjAgICAgICAgIC8qIGVuYWJsZSBUWCBpbnQgKi8KKyNkZWZpbmUgVUNUUkxfQ05UUkwgICAgIDB4MDMgICAgICAgIC8qIGNvbnRyb2wgZmllbGQgKi8KKyNkZWZpbmUgVUNUUkxfQ05UUkxfU1dSIDB4MDMgICAgICAgIC8qIHNvZnR3YXJlIHJlc2V0IGNvbW1hbmQgKi8KKworLyogc2FtcGxlIHJhdGUgY29udmVydGVyICovCisjZGVmaW5lIFNSQ19PS1NUQVRFICAgICAgICAxCisKKyNkZWZpbmUgU1JDX1JBTUFERFJfTUFTSyAgIDB4ZmUwMDAwMDAKKyNkZWZpbmUgU1JDX1JBTUFERFJfU0hJRlQgIDI1CisjZGVmaW5lIFNSQ19EQUMxRlJFRVpFICAgICAoMVVMIDw8IDIxKQorI2RlZmluZSBTUkNfREFDMkZSRUVaRSAgICAgICgxVUwgPDwgMjApCisjZGVmaW5lIFNSQ19BRENGUkVFWkUgICAgICAoMVVMIDw8IDE5KQorCisKKyNkZWZpbmUgU1JDX1dFICAgICAgICAgICAgIDB4MDEwMDAwMDAgIC8qIHJlYWQvd3JpdGUgY29udHJvbCBmb3IgU1JDIFJBTSAqLworI2RlZmluZSBTUkNfQlVTWSAgICAgICAgICAgMHgwMDgwMDAwMCAgLyogU1JDIGJ1c3kgKi8KKyNkZWZpbmUgU1JDX0RJUyAgICAgICAgICAgIDB4MDA0MDAwMDAgIC8qIDEgPSBkaXNhYmxlIFNSQyAqLworI2RlZmluZSBTUkNfRERBQzEgICAgICAgICAgMHgwMDIwMDAwMCAgLyogMSA9IGRpc2FibGUgYWNjdW0gdXBkYXRlIGZvciBEQUMxICovCisjZGVmaW5lIFNSQ19EREFDMiAgICAgICAgICAweDAwMTAwMDAwICAvKiAxID0gZGlzYWJsZSBhY2N1bSB1cGRhdGUgZm9yIERBQzIgKi8KKyNkZWZpbmUgU1JDX0RBREMgICAgICAgICAgIDB4MDAwODAwMDAgIC8qIDEgPSBkaXNhYmxlIGFjY3VtIHVwZGF0ZSBmb3IgQURDMiAqLworI2RlZmluZSBTUkNfQ1RMTUFTSyAgICAgICAgMHgwMDc4MDAwMAorI2RlZmluZSBTUkNfUkFNREFUQV9NQVNLICAgMHgwMDAwZmZmZgorI2RlZmluZSBTUkNfUkFNREFUQV9TSElGVCAgMAorCisjZGVmaW5lIFNSQ1JFR19BREMgICAgICAweDc4CisjZGVmaW5lIFNSQ1JFR19EQUMxICAgICAweDcwCisjZGVmaW5lIFNSQ1JFR19EQUMyICAgICAweDc0CisjZGVmaW5lIFNSQ1JFR19WT0xfQURDICAweDZjCisjZGVmaW5lIFNSQ1JFR19WT0xfREFDMSAweDdjCisjZGVmaW5lIFNSQ1JFR19WT0xfREFDMiAweDdlCisKKyNkZWZpbmUgU1JDUkVHX1RSVU5DX04gICAgIDB4MDAKKyNkZWZpbmUgU1JDUkVHX0lOVF9SRUdTICAgIDB4MDEKKyNkZWZpbmUgU1JDUkVHX0FDQ1VNX0ZSQUMgIDB4MDIKKyNkZWZpbmUgU1JDUkVHX1ZGUkVRX0ZSQUMgIDB4MDMKKworI2RlZmluZSBDT0RFQ19QSVJEICAgICAgICAweDAwODAwMDAwICAvKiAwID0gd3JpdGUgQUM5NyByZWdpc3RlciAqLworI2RlZmluZSBDT0RFQ19QSUFERF9NQVNLICAweDAwN2YwMDAwCisjZGVmaW5lIENPREVDX1BJQUREX1NISUZUIDE2CisjZGVmaW5lIENPREVDX1BJREFUX01BU0sgIDB4MDAwMGZmZmYKKyNkZWZpbmUgQ09ERUNfUElEQVRfU0hJRlQgMAorCisjZGVmaW5lIENPREVDX1JEWSAgICAgICAgIDB4ODAwMDAwMDAgIC8qIEFDOTcgcmVhZCBkYXRhIHZhbGlkICovCisjZGVmaW5lIENPREVDX1dJUCAgICAgICAgIDB4NDAwMDAwMDAgIC8qIEFDOTcgd3JpdGUgaW4gcHJvZ3Jlc3MgKi8KKyNkZWZpbmUgQ09ERUNfUE9SRCAgICAgICAgMHgwMDgwMDAwMCAgLyogMCA9IHdyaXRlIEFDOTcgcmVnaXN0ZXIgKi8KKyNkZWZpbmUgQ09ERUNfUE9BRERfTUFTSyAgMHgwMDdmMDAwMAorI2RlZmluZSBDT0RFQ19QT0FERF9TSElGVCAxNgorI2RlZmluZSBDT0RFQ19QT0RBVF9NQVNLICAweDAwMDBmZmZmCisjZGVmaW5lIENPREVDX1BPREFUX1NISUZUIDAKKworCisjZGVmaW5lIExFR0FDWV9KRkFTVCAgICAgIDB4ODAwMDAwMDAgIC8qIGZhc3Qgam95c3RpY2sgdGltaW5nICovCisjZGVmaW5lIExFR0FDWV9GSVJRICAgICAgIDB4MDEwMDAwMDAgIC8qIGZvcmNlIElSUSAqLworCisjZGVmaW5lIFNDVFJMX0RBQ1RFU1QgICAgIDB4MDA0MDAwMDAgIC8qIDEgPSBEQUMgdGVzdCwgdGVzdCB2ZWN0b3IgZ2VuZXJhdGlvbiBwdXJwb3NlcyAqLworI2RlZmluZSBTQ1RSTF9QMkVORElOQyAgICAweDAwMzgwMDAwICAvKiAgKi8KKyNkZWZpbmUgU0NUUkxfU0hfUDJFTkRJTkMgMTkKKyNkZWZpbmUgU0NUUkxfUDJTVElOQyAgICAgMHgwMDA3MDAwMCAgLyogICovCisjZGVmaW5lIFNDVFJMX1NIX1AyU1RJTkMgIDE2CisjZGVmaW5lIFNDVFJMX1IxTE9PUFNFTCAgIDB4MDAwMDgwMDAgIC8qIDAgPSBsb29wIG1vZGUgKi8KKyNkZWZpbmUgU0NUUkxfUDJMT09QU0VMICAgMHgwMDAwNDAwMCAgLyogMCA9IGxvb3AgbW9kZSAqLworI2RlZmluZSBTQ1RSTF9QMUxPT1BTRUwgICAweDAwMDAyMDAwICAvKiAwID0gbG9vcCBtb2RlICovCisjZGVmaW5lIFNDVFJMX1AyUEFVU0UgICAgIDB4MDAwMDEwMDAgIC8qIDEgPSBwYXVzZSBtb2RlICovCisjZGVmaW5lIFNDVFJMX1AxUEFVU0UgICAgIDB4MDAwMDA4MDAgIC8qIDEgPSBwYXVzZSBtb2RlICovCisjZGVmaW5lIFNDVFJMX1IxSU5URU4gICAgIDB4MDAwMDA0MDAgIC8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KKyNkZWZpbmUgU0NUUkxfUDJJTlRFTiAgICAgMHgwMDAwMDIwMCAgLyogZW5hYmxlIGludGVycnVwdCAqLworI2RlZmluZSBTQ1RSTF9QMUlOVEVOICAgICAweDAwMDAwMTAwICAvKiBlbmFibGUgaW50ZXJydXB0ICovCisjZGVmaW5lIFNDVFJMX1AxU0NUUkxEICAgIDB4MDAwMDAwODAgIC8qIHJlbG9hZCBzYW1wbGUgY291bnQgcmVnaXN0ZXIgZm9yIERBQzEgKi8KKyNkZWZpbmUgU0NUUkxfUDJEQUNTRU4gICAgMHgwMDAwMDA0MCAgLyogMSA9IERBQzIgcGxheSBiYWNrIGxhc3Qgc2FtcGxlIHdoZW4gZGlzYWJsZWQgKi8KKyNkZWZpbmUgU0NUUkxfUjFTRUIgICAgICAgMHgwMDAwMDAyMCAgLyogMSA9IDE2Yml0ICovCisjZGVmaW5lIFNDVFJMX1IxU01CICAgICAgIDB4MDAwMDAwMTAgIC8qIDEgPSBzdGVyZW8gKi8KKyNkZWZpbmUgU0NUUkxfUjFGTVQgICAgICAgMHgwMDAwMDAzMCAgLyogZm9ybWF0IG1hc2sgKi8KKyNkZWZpbmUgU0NUUkxfU0hfUjFGTVQgICAgNAorI2RlZmluZSBTQ1RSTF9QMlNFQiAgICAgICAweDAwMDAwMDA4ICAvKiAxID0gMTZiaXQgKi8KKyNkZWZpbmUgU0NUUkxfUDJTTUIgICAgICAgMHgwMDAwMDAwNCAgLyogMSA9IHN0ZXJlbyAqLworI2RlZmluZSBTQ1RSTF9QMkZNVCAgICAgICAweDAwMDAwMDBjICAvKiBmb3JtYXQgbWFzayAqLworI2RlZmluZSBTQ1RSTF9TSF9QMkZNVCAgICAyCisjZGVmaW5lIFNDVFJMX1AxU0VCICAgICAgIDB4MDAwMDAwMDIgIC8qIDEgPSAxNmJpdCAqLworI2RlZmluZSBTQ1RSTF9QMVNNQiAgICAgICAweDAwMDAwMDAxICAvKiAxID0gc3RlcmVvICovCisjZGVmaW5lIFNDVFJMX1AxRk1UICAgICAgIDB4MDAwMDAwMDMgIC8qIGZvcm1hdCBtYXNrICovCisjZGVmaW5lIFNDVFJMX1NIX1AxRk1UICAgIDAKKworCisvKiBtaXNjIHN0dWZmICovCisjZGVmaW5lIFBPTExfQ09VTlQgICAweDEwMDAKKyNkZWZpbmUgRk1PREVfREFDICAgICAgICAgNCAgICAgICAgICAgLyogc2xpZ2h0IG1pc3VzZSBvZiBtb2RlX3QgKi8KKworLyogTUlESSBidWZmZXIgc2l6ZXMgKi8KKworI2RlZmluZSBNSURJSU5CVUYgIDI1NgorI2RlZmluZSBNSURJT1VUQlVGIDI1NgorCisjZGVmaW5lIEZNT0RFX01JRElfU0hJRlQgMworI2RlZmluZSBGTU9ERV9NSURJX1JFQUQgIChGTU9ERV9SRUFEIDw8IEZNT0RFX01JRElfU0hJRlQpCisjZGVmaW5lIEZNT0RFX01JRElfV1JJVEUgKEZNT0RFX1dSSVRFIDw8IEZNT0RFX01JRElfU0hJRlQpCisKKyNkZWZpbmUgRVMxMzcxX01PRFVMRV9OQU1FICJlczEzNzEiCisjZGVmaW5lIFBGWCBFUzEzNzFfTU9EVUxFX05BTUUgIjogIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IGVzMTM3MV9zdGF0ZSB7CisJLyogbWFnaWMgKi8KKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisKKwkvKiBsaXN0IG9mIGVzMTM3MSBkZXZpY2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBkZXZzOworCisJLyogdGhlIGNvcnJlc3BvbmRpbmcgcGNpX2RldiBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCisJLyogc291bmRjb3JlIHN0dWZmICovCisJaW50IGRldl9hdWRpbzsKKwlpbnQgZGV2X2RhYzsKKwlpbnQgZGV2X21pZGk7CisJCisJLyogaGFyZHdhcmUgcmVzb3VyY2VzICovCisJdW5zaWduZWQgbG9uZyBpbzsgLyogbG9uZyBmb3IgU1BBUkMgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOworCisJLyogUENJIElEJ3MgKi8KKwl1MTYgdmVuZG9yOworCXUxNiBkZXZpY2U7CisgICAgICAgIHU4IHJldjsgLyogdGhlIGNoaXAgcmV2aXNpb24gKi8KKworCS8qIG9wdGlvbnMgKi8KKwlpbnQgc3BkaWZfdm9sdW1lOyAvKiBTL1BESUYgb3V0cHV0IGlzIGVuYWJsZWQgaWYgIT0gLTEgKi8KKworI2lmZGVmIEVTMTM3MV9ERUJVRworICAgICAgICAvKiBkZWJ1ZyAvcHJvYyBlbnRyeSAqLworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHM7CisjZW5kaWYgLyogRVMxMzcxX0RFQlVHICovCisKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CisKKwkvKiB3YXZlIHN0dWZmICovCisJdW5zaWduZWQgY3RybDsKKwl1bnNpZ25lZCBzY3RybDsKKwl1bnNpZ25lZCBkYWMxcmF0ZSwgZGFjMnJhdGUsIGFkY3JhdGU7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwltb2RlX3Qgb3Blbl9tb2RlOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCXN0cnVjdCBkbWFidWYgeworCQl2b2lkICpyYXdidWY7CisJCWRtYV9hZGRyX3QgZG1hYWRkcjsKKwkJdW5zaWduZWQgYnVmb3JkZXI7CisJCXVuc2lnbmVkIG51bWZyYWc7CisJCXVuc2lnbmVkIGZyYWdzaGlmdDsKKwkJdW5zaWduZWQgaHdwdHIsIHN3cHRyOworCQl1bnNpZ25lZCB0b3RhbF9ieXRlczsKKwkJaW50IGNvdW50OworCQl1bnNpZ25lZCBlcnJvcjsgLyogb3Zlci91bmRlcnJ1biAqLworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCisJCXVuc2lnbmVkIGZyYWdzaXplOworCQl1bnNpZ25lZCBkbWFzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKwkJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIG1hcHBlZDoxOworCQl1bnNpZ25lZCByZWFkeToxOworCQl1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CisJCXVuc2lnbmVkIGVuYWJsZWQ6MTsKKwkJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OworCQlpbnQgb3NzbWF4ZnJhZ3M7CisJCXVuc2lnbmVkIHN1YmRpdmlzaW9uOworCX0gZG1hX2RhYzEsIGRtYV9kYWMyLCBkbWFfYWRjOworCisJLyogbWlkaSBzdHVmZiAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGlyZCwgaXdyLCBpY250OworCQl1bnNpZ25lZCBvcmQsIG93ciwgb2NudDsKKwkJd2FpdF9xdWV1ZV9oZWFkX3QgaXdhaXQ7CisJCXdhaXRfcXVldWVfaGVhZF90IG93YWl0OworCQl1bnNpZ25lZCBjaGFyIGlidWZbTUlESUlOQlVGXTsKKwkJdW5zaWduZWQgY2hhciBvYnVmW01JRElPVVRCVUZdOworCX0gbWlkaTsKKworCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7CisJc3RydWN0IHNlbWFwaG9yZSBzZW07Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIExJU1RfSEVBRChkZXZzKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbGQyKHVuc2lnbmVkIGludCB4KQoreworCXVuc2lnbmVkIHIgPSAwOworCQorCWlmICh4ID49IDB4MTAwMDApIHsKKwkJeCA+Pj0gMTY7CisJCXIgKz0gMTY7CisJfQorCWlmICh4ID49IDB4MTAwKSB7CisJCXggPj49IDg7CisJCXIgKz0gODsKKwl9CisJaWYgKHggPj0gMHgxMCkgeworCQl4ID4+PSA0OworCQlyICs9IDQ7CisJfQorCWlmICh4ID49IDQpIHsKKwkJeCA+Pj0gMjsKKwkJciArPSAyOworCX0KKwlpZiAoeCA+PSAyKQorCQlyKys7CisJcmV0dXJuIHI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdW5zaWduZWQgd2FpdF9zcmNfcmVhZHkoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBpbnQgdCwgcjsKKworCWZvciAodCA9IDA7IHQgPCBQT0xMX0NPVU5UOyB0KyspIHsKKwkJaWYgKCEoKHIgPSBpbmwocy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVikpICYgU1JDX0JVU1kpKQorCQkJcmV0dXJuIHI7CisJCXVkZWxheSgxKTsKKwl9CisJcHJpbnRrKEtFUk5fREVCVUcgUEZYICJzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgdGltZW91dCByID0gMHglMDh4XG4iLCByKTsKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHVuc2lnbmVkIHNyY19yZWFkKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHVuc2lnbmVkIHJlZykKK3sKKyAgICAgICAgdW5zaWduZWQgaW50IHRlbXAsaSxvcmlnOworCisgICAgICAgIC8qIHdhaXQgZm9yIHJlYWR5ICovCisgICAgICAgIHRlbXAgPSB3YWl0X3NyY19yZWFkeSAocyk7CisKKyAgICAgICAgLyogd2UgY2FuIG9ubHkgYWNjZXNzIHRoZSBTUkMgYXQgY2VydGFpbiB0aW1lcywgbWFrZSBzdXJlCisgICAgICAgICAgIHdlJ3JlIGFsbG93ZWQgdG8gYmVmb3JlIHdlIHJlYWQgKi8KKyAgICAgICAgICAgCisgICAgICAgIG9yaWcgPSB0ZW1wOworICAgICAgICAvKiBleHBvc2UgdGhlIFNSQyBzdGF0ZSBiaXRzICovCisgICAgICAgIG91dGwgKCAodGVtcCAmIFNSQ19DVExNQVNLKSB8IChyZWcgPDwgU1JDX1JBTUFERFJfU0hJRlQpIHwgMHgxMDAwMFVMLAorICAgICAgICAgICAgICAgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CisKKyAgICAgICAgLyogbm93LCB3YWl0IGZvciBidXN5IGFuZCB0aGUgY29ycmVjdCB0aW1lIHRvIHJlYWQgKi8KKyAgICAgICAgdGVtcCA9IHdhaXRfc3JjX3JlYWR5IChzKTsKKworICAgICAgICBpZiAoICh0ZW1wICYgMHgwMDg3MDAwMFVMICkgIT0gKCBTUkNfT0tTVEFURSA8PCAxNiApKXsKKyAgICAgICAgICAgICAgICAvKiB3YWl0IGZvciB0aGUgcmlnaHQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxQT0xMX0NPVU5UOyBpKyspeworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IGlubCAocy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICh0ZW1wICYgMHgwMDg3MDAwMFVMICkgPT0gKCBTUkNfT0tTVEFURSA8PCAxNiApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBoaWRlIHRoZSBzdGF0ZSBiaXRzICovCisgICAgICAgIG91dGwgKChvcmlnICYgU1JDX0NUTE1BU0spIHwgKHJlZyA8PCBTUkNfUkFNQUREUl9TSElGVCksIHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpOworICAgICAgICByZXR1cm4gdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIAorfQorCitzdGF0aWMgdm9pZCBzcmNfd3JpdGUoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgdW5zaWduZWQgcmVnLCB1bnNpZ25lZCBkYXRhKQoreworICAgICAgCisJdW5zaWduZWQgaW50IHI7CisKKwlyID0gd2FpdF9zcmNfcmVhZHkocykgJiAoU1JDX0RJUyB8IFNSQ19EREFDMSB8IFNSQ19EREFDMiB8IFNSQ19EQURDKTsKKwlyIHw9IChyZWcgPDwgU1JDX1JBTUFERFJfU0hJRlQpICYgU1JDX1JBTUFERFJfTUFTSzsKKwlyIHw9IChkYXRhIDw8IFNSQ19SQU1EQVRBX1NISUZUKSAmIFNSQ19SQU1EQVRBX01BU0s7CisJb3V0bChyIHwgU1JDX1dFLCBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKKworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbW9zdCBvZiB0aGUgZm9sbG93aW5nIGhlcmUgaXMgYmxhY2sgbWFnaWMgKi8KK3N0YXRpYyB2b2lkIHNldF9hZGNfcmF0ZShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG4sIHRydW5jbSwgZnJlcTsKKworCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDQwMDApCisJCXJhdGUgPSA0MDAwOworCW4gPSByYXRlIC8gMzAwMDsKKwlpZiAoKDEgPDwgbikgJiAoKDEgPDwgMTUpIHwgKDEgPDwgMTMpIHwgKDEgPDwgMTEpIHwgKDEgPDwgOSkpKQorCQluLS07CisJdHJ1bmNtID0gKDIxICogbiAtIDEpIHwgMTsKKyAgICAgICAgZnJlcSA9ICgoNDgwMDBVTCA8PCAxNSkgLyByYXRlKSAqIG47CisJcy0+YWRjcmF0ZSA9ICg0ODAwMFVMIDw8IDE1KSAvIChmcmVxIC8gbik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAocmF0ZSA+PSAyNDAwMCkgeworCQlpZiAodHJ1bmNtID4gMjM5KQorCQkJdHJ1bmNtID0gMjM5OworCQlzcmNfd3JpdGUocywgU1JDUkVHX0FEQytTUkNSRUdfVFJVTkNfTiwgCisJCQkgICgoKDIzOSAtIHRydW5jbSkgPj4gMSkgPDwgOSkgfCAobiA8PCA0KSk7CisJfSBlbHNlIHsKKwkJaWYgKHRydW5jbSA+IDExOSkKKwkJCXRydW5jbSA9IDExOTsKKwkJc3JjX3dyaXRlKHMsIFNSQ1JFR19BREMrU1JDUkVHX1RSVU5DX04sIAorCQkJICAweDgwMDAgfCAoKCgxMTkgLSB0cnVuY20pID4+IDEpIDw8IDkpIHwgKG4gPDwgNCkpOworCX0JCQorCXNyY193cml0ZShzLCBTUkNSRUdfQURDK1NSQ1JFR19JTlRfUkVHUywgCisJCSAgKHNyY19yZWFkKHMsIFNSQ1JFR19BREMrU1JDUkVHX0lOVF9SRUdTKSAmIDB4MDBmZikgfAorCQkgICgoZnJlcSA+PiA1KSAmIDB4ZmMwMCkpOworCXNyY193cml0ZShzLCBTUkNSRUdfQURDK1NSQ1JFR19WRlJFUV9GUkFDLCBmcmVxICYgMHg3ZmZmKTsKKwlzcmNfd3JpdGUocywgU1JDUkVHX1ZPTF9BREMsIG4gPDwgOCk7CisJc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfQURDKzEsIG4gPDwgOCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCisKK3N0YXRpYyB2b2lkIHNldF9kYWMxX3JhdGUoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBmcmVxLCByOworCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgNDAwMCkKKwkJcmF0ZSA9IDQwMDA7CisgICAgICAgIGZyZXEgPSAoKHJhdGUgPDwgMTUpICsgMTUwMCkgLyAzMDAwOworCXMtPmRhYzFyYXRlID0gKGZyZXEgKiAzMDAwICsgMTYzODQpID4+IDE1OworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJciA9ICh3YWl0X3NyY19yZWFkeShzKSAmIChTUkNfRElTIHwgU1JDX0REQUMyIHwgU1JDX0RBREMpKSB8IFNSQ19EREFDMTsKKwlvdXRsKHIsIHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpOworCXNyY193cml0ZShzLCBTUkNSRUdfREFDMStTUkNSRUdfSU5UX1JFR1MsIAorCQkgIChzcmNfcmVhZChzLCBTUkNSRUdfREFDMStTUkNSRUdfSU5UX1JFR1MpICYgMHgwMGZmKSB8CisJCSAgKChmcmVxID4+IDUpICYgMHhmYzAwKSk7CisJc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMxK1NSQ1JFR19WRlJFUV9GUkFDLCBmcmVxICYgMHg3ZmZmKTsKKwlyID0gKHdhaXRfc3JjX3JlYWR5KHMpICYgKFNSQ19ESVMgfCBTUkNfRERBQzIgfCBTUkNfREFEQykpOworCW91dGwociwgcy0+aW8gKyBFUzEzNzFfUkVHX1NSQ09OVik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGFjMl9yYXRlKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZnJlcSwgcjsKKworCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDQwMDApCisJCXJhdGUgPSA0MDAwOworICAgICAgICBmcmVxID0gKChyYXRlIDw8IDE1KSArIDE1MDApIC8gMzAwMDsKKwlzLT5kYWMycmF0ZSA9IChmcmVxICogMzAwMCArIDE2Mzg0KSA+PiAxNTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXIgPSAod2FpdF9zcmNfcmVhZHkocykgJiAoU1JDX0RJUyB8IFNSQ19EREFDMSB8IFNSQ19EQURDKSkgfCBTUkNfRERBQzI7CisJb3V0bChyLCBzLT5pbyArIEVTMTM3MV9SRUdfU1JDT05WKTsKKwlzcmNfd3JpdGUocywgU1JDUkVHX0RBQzIrU1JDUkVHX0lOVF9SRUdTLCAKKwkJICAoc3JjX3JlYWQocywgU1JDUkVHX0RBQzIrU1JDUkVHX0lOVF9SRUdTKSAmIDB4MDBmZikgfAorCQkgICgoZnJlcSA+PiA1KSAmIDB4ZmMwMCkpOworCXNyY193cml0ZShzLCBTUkNSRUdfREFDMitTUkNSRUdfVkZSRVFfRlJBQywgZnJlcSAmIDB4N2ZmZik7CisJciA9ICh3YWl0X3NyY19yZWFkeShzKSAmIChTUkNfRElTIHwgU1JDX0REQUMxIHwgU1JDX0RBREMpKTsKKwlvdXRsKHIsIHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzcmNfaW5pdChzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKworICAgICAgICAvKiBiZWZvcmUgd2UgZW5hYmxlIG9yIGRpc2FibGUgdGhlIFNSQyB3ZSBuZWVkCisgICAgICAgICAgIHRvIHdhaXQgZm9yIGl0IHRvIGJlY29tZSByZWFkeSAqLworICAgICAgICB3YWl0X3NyY19yZWFkeShzKTsKKworICAgICAgICBvdXRsKFNSQ19ESVMsIHMtPmlvICsgRVMxMzcxX1JFR19TUkNPTlYpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAweDgwOyBpKyspCisgICAgICAgICAgICAgICAgc3JjX3dyaXRlKHMsIGksIDApOworCisgICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfREFDMStTUkNSRUdfVFJVTkNfTiwgMTYgPDwgNCk7CisgICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfREFDMStTUkNSRUdfSU5UX1JFR1MsIDE2IDw8IDEwKTsKKyAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMyK1NSQ1JFR19UUlVOQ19OLCAxNiA8PCA0KTsKKyAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19EQUMyK1NSQ1JFR19JTlRfUkVHUywgMTYgPDwgMTApOworICAgICAgICBzcmNfd3JpdGUocywgU1JDUkVHX1ZPTF9BREMsIDEgPDwgMTIpOworICAgICAgICBzcmNfd3JpdGUocywgU1JDUkVHX1ZPTF9BREMrMSwgMSA8PCAxMik7CisgICAgICAgIHNyY193cml0ZShzLCBTUkNSRUdfVk9MX0RBQzEsIDEgPDwgMTIpOworICAgICAgICBzcmNfd3JpdGUocywgU1JDUkVHX1ZPTF9EQUMxKzEsIDEgPDwgMTIpOworICAgICAgICBzcmNfd3JpdGUocywgU1JDUkVHX1ZPTF9EQUMyLCAxIDw8IDEyKTsKKyAgICAgICAgc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfREFDMisxLCAxIDw8IDEyKTsKKyAgICAgICAgc2V0X2FkY19yYXRlKHMsIDIyMDUwKTsKKyAgICAgICAgc2V0X2RhYzFfcmF0ZShzLCAyMjA1MCk7CisgICAgICAgIHNldF9kYWMyX3JhdGUocywgMjIwNTApOworCisgICAgICAgIC8qIFdBUk5JTkc6CisgICAgICAgICAqIGVuYWJsaW5nIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgd2l0aG91dCBwcm9wZXJseSBwcm9ncmFtbWluZworICAgICAgICAgKiBpdHMgcGFyYW1ldGVycyBjYXVzZXMgdGhlIGNoaXAgdG8gbG9jayB1cCAodGhlIFNSQyBidXN5IGJpdCB3aWxsCisgICAgICAgICAqIGJlIHN0dWNrIGhpZ2gsIGFuZCBJJ3ZlIGZvdW5kIG5vIHdheSB0byByZWN0aWZ5IHRoaXMgb3RoZXIgdGhhbgorICAgICAgICAgKiBwb3dlciBjeWNsZSkKKyAgICAgICAgICovCisgICAgICAgIHdhaXRfc3JjX3JlYWR5KHMpOworICAgICAgICBvdXRsKDAsIHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHdyY29kZWMoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCBhZGRyLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgdCwgeDsKKyAgICAgICAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlmb3IgKHQgPSAwOyB0IDwgUE9MTF9DT1VOVDsgdCsrKQorCQlpZiAoIShpbmwocy0+aW8rRVMxMzcxX1JFR19DT0RFQykgJiBDT0RFQ19XSVApKQorCQkJYnJlYWs7CisKKyAgICAgICAgLyogc2F2ZSB0aGUgY3VycmVudCBzdGF0ZSBmb3IgbGF0ZXIgKi8KKyAgICAgICAgeCA9IHdhaXRfc3JjX3JlYWR5KHMpOworCisgICAgICAgIC8qIGVuYWJsZSBTUkMgc3RhdGUgZGF0YSBpbiBTUkMgbXV4ICovCisJb3V0bCgoeCAmIChTUkNfRElTIHwgU1JDX0REQUMxIHwgU1JDX0REQUMyIHwgU1JDX0RBREMpKSB8IDB4MDAwMTAwMDAsCisJICAgICBzLT5pbytFUzEzNzFfUkVHX1NSQ09OVik7CisKKyAgICAgICAgLyogd2FpdCBmb3Igbm90IGJ1c3kgKHN0YXRlIDApIGZpcnN0IHRvIGF2b2lkCisgICAgICAgICAgIHRyYW5zaXRpb24gc3RhdGVzICovCisgICAgICAgIGZvciAodD0wOyB0PFBPTExfQ09VTlQ7IHQrKyl7CisgICAgICAgICAgICAgICAgaWYoKGlubChzLT5pbytFUzEzNzFfUkVHX1NSQ09OVikgJiAweDAwODcwMDAwKSA9PTAgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIHdhaXQgZm9yIGEgU0FGRSB0aW1lIHRvIHdyaXRlIGFkZHIvZGF0YSBhbmQgdGhlbiBkbyBpdCwgZGFtbWl0ICovCisgICAgICAgIGZvciAodD0wOyB0PFBPTExfQ09VTlQ7IHQrKyl7CisgICAgICAgICAgICAgICAgaWYoKGlubChzLT5pbytFUzEzNzFfUkVHX1NSQ09OVikgJiAweDAwODcwMDAwKSA9PTB4MDAwMTAwMDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHVkZWxheSgxKTsKKyAgICAgICAgfQorCisJb3V0bCgoKGFkZHIgPDwgQ09ERUNfUE9BRERfU0hJRlQpICYgQ09ERUNfUE9BRERfTUFTSykgfAorCSAgICAgKChkYXRhIDw8IENPREVDX1BPREFUX1NISUZUKSAmIENPREVDX1BPREFUX01BU0spLCBzLT5pbytFUzEzNzFfUkVHX0NPREVDKTsKKworCS8qIHJlc3RvcmUgU1JDIHJlZyAqLworCXdhaXRfc3JjX3JlYWR5KHMpOworCW91dGwoeCwgcy0+aW8rRVMxMzcxX1JFR19TUkNPTlYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHUxNiByZGNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggYWRkcikKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgdCwgeDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCisgICAgICAgIC8qIHdhaXQgZm9yIFdJUCB0byBnbyBhd2F5ICovCisJZm9yICh0ID0gMDsgdCA8IDB4MTAwMDsgdCsrKQorCQlpZiAoIShpbmwocy0+aW8rRVMxMzcxX1JFR19DT0RFQykgJiBDT0RFQ19XSVApKQorCQkJYnJlYWs7CisKKwkvKiBzYXZlIHRoZSBjdXJyZW50IHN0YXRlIGZvciBsYXRlciAqLworCXggPSAod2FpdF9zcmNfcmVhZHkocykgJiAoU1JDX0RJUyB8IFNSQ19EREFDMSB8IFNSQ19EREFDMiB8IFNSQ19EQURDKSk7CisKKwkvKiBlbmFibGUgU1JDIHN0YXRlIGRhdGEgaW4gU1JDIG11eCAqLworCW91dGwoIHggfCAweDAwMDEwMDAwLAorICAgICAgICAgICAgICBzLT5pbytFUzEzNzFfUkVHX1NSQ09OVik7CisKKyAgICAgICAgLyogd2FpdCBmb3Igbm90IGJ1c3kgKHN0YXRlIDApIGZpcnN0IHRvIGF2b2lkCisgICAgICAgICAgIHRyYW5zaXRpb24gc3RhdGVzICovCisgICAgICAgIGZvciAodD0wOyB0PFBPTExfQ09VTlQ7IHQrKyl7CisgICAgICAgICAgICAgICAgaWYoKGlubChzLT5pbytFUzEzNzFfUkVHX1NSQ09OVikgJiAweDAwODcwMDAwKSA9PTAgKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB1ZGVsYXkoMSk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8qIHdhaXQgZm9yIGEgU0FGRSB0aW1lIHRvIHdyaXRlIGFkZHIvZGF0YSBhbmQgdGhlbiBkbyBpdCwgZGFtbWl0ICovCisgICAgICAgIGZvciAodD0wOyB0PFBPTExfQ09VTlQ7IHQrKyl7CisgICAgICAgICAgICAgICAgaWYoKGlubChzLT5pbytFUzEzNzFfUkVHX1NSQ09OVikgJiAweDAwODcwMDAwKSA9PTB4MDAwMTAwMDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIHVkZWxheSgxKTsKKyAgICAgICAgfQorCisJb3V0bCgoKGFkZHIgPDwgQ09ERUNfUE9BRERfU0hJRlQpICYgQ09ERUNfUE9BRERfTUFTSykgfCBDT0RFQ19QT1JELCBzLT5pbytFUzEzNzFfUkVHX0NPREVDKTsKKwkvKiByZXN0b3JlIFNSQyByZWcgKi8KKwl3YWl0X3NyY19yZWFkeShzKTsKKwlvdXRsKHgsIHMtPmlvK0VTMTM3MV9SRUdfU1JDT05WKTsKKworICAgICAgICAvKiB3YWl0IGZvciBXSVAgYWdhaW4gKi8KKwlmb3IgKHQgPSAwOyB0IDwgMHgxMDAwOyB0KyspCisJCWlmICghKGlubChzLT5pbytFUzEzNzFfUkVHX0NPREVDKSAmIENPREVDX1dJUCkpCisJCQlicmVhazsKKyAgICAgICAgCisJLyogbm93IHdhaXQgZm9yIHRoZSBzdGlua2luJyBkYXRhIChSRFkpICovCisJZm9yICh0ID0gMDsgdCA8IFBPTExfQ09VTlQ7IHQrKykKKwkJaWYgKCh4ID0gaW5sKHMtPmlvK0VTMTM3MV9SRUdfQ09ERUMpKSAmIENPREVDX1JEWSkKKwkJCWJyZWFrOworICAgICAgICAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuICgoeCAmIENPREVDX1BJREFUX01BU0spID4+IENPREVDX1BJREFUX1NISUZUKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmN0cmwgJj0gfkNUUkxfQURDX0VOOworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9kYWMxKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+Y3RybCAmPSB+Q1RSTF9EQUMxX0VOOworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9kYWMyKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+Y3RybCAmPSB+Q1RSTF9EQUMyX0VOOworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMxKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBmcmFncmVtYWluLCBmc2hpZnQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPmN0cmwgJiBDVFJMX0RBQzFfRU4pICYmIChzLT5kbWFfZGFjMS5tYXBwZWQgfHwgcy0+ZG1hX2RhYzEuY291bnQgPiAwKQorCSAgICAmJiBzLT5kbWFfZGFjMS5yZWFkeSkgeworCQlzLT5jdHJsIHw9IENUUkxfREFDMV9FTjsKKwkJcy0+c2N0cmwgPSAocy0+c2N0cmwgJiB+KFNDVFJMX1AxTE9PUFNFTCB8IFNDVFJMX1AxUEFVU0UgfCBTQ1RSTF9QMVNDVFJMRCkpIHwgU0NUUkxfUDFJTlRFTjsKKwkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCWZyYWdyZW1haW4gPSAoKC0gcy0+ZG1hX2RhYzEuaHdwdHIpICYgKHMtPmRtYV9kYWMxLmZyYWdzaXplLTEpKTsKKwkJZnNoaWZ0ID0gc2FtcGxlX3NoaWZ0WyhzLT5zY3RybCAmIFNDVFJMX1AxRk1UKSA+PiBTQ1RSTF9TSF9QMUZNVF07CisJCWlmIChmcmFncmVtYWluIDwgMipmc2hpZnQpCisJCQlmcmFncmVtYWluID0gcy0+ZG1hX2RhYzEuZnJhZ3NpemU7CisJCW91dGwoKGZyYWdyZW1haW4gPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MV9SRUdfREFDMV9TQ09VTlQpOworCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJCW91dGwoKHMtPmRtYV9kYWMxLmZyYWdzaXplID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzFfUkVHX0RBQzFfU0NPVU5UKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworc3RhdGljIHZvaWQgc3RhcnRfZGFjMihzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgZnJhZ3JlbWFpbiwgZnNoaWZ0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5jdHJsICYgQ1RSTF9EQUMyX0VOKSAmJiAocy0+ZG1hX2RhYzIubWFwcGVkIHx8IHMtPmRtYV9kYWMyLmNvdW50ID4gMCkKKwkgICAgJiYgcy0+ZG1hX2RhYzIucmVhZHkpIHsKKwkJcy0+Y3RybCB8PSBDVFJMX0RBQzJfRU47CisJCXMtPnNjdHJsID0gKHMtPnNjdHJsICYgfihTQ1RSTF9QMkxPT1BTRUwgfCBTQ1RSTF9QMlBBVVNFIHwgU0NUUkxfUDJEQUNTRU4gfCAKKwkJCQkJIFNDVFJMX1AyRU5ESU5DIHwgU0NUUkxfUDJTVElOQykpIHwgU0NUUkxfUDJJTlRFTiB8CisJCQkoKChzLT5zY3RybCAmIFNDVFJMX1AyRk1UKSA/IDIgOiAxKSA8PCBTQ1RSTF9TSF9QMkVORElOQykgfCAKKwkJCSgwIDw8IFNDVFJMX1NIX1AyU1RJTkMpOworCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJZnJhZ3JlbWFpbiA9ICgoLSBzLT5kbWFfZGFjMi5od3B0cikgJiAocy0+ZG1hX2RhYzIuZnJhZ3NpemUtMSkpOworCQlmc2hpZnQgPSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUDJGTVQpID4+IFNDVFJMX1NIX1AyRk1UXTsKKwkJaWYgKGZyYWdyZW1haW4gPCAyKmZzaGlmdCkKKwkJCWZyYWdyZW1haW4gPSBzLT5kbWFfZGFjMi5mcmFnc2l6ZTsKKwkJb3V0bCgoZnJhZ3JlbWFpbiA+PiBmc2hpZnQpIC0gMSwgcy0+aW8rRVMxMzcxX1JFR19EQUMyX1NDT1VOVCk7CisJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwkJb3V0bCgocy0+ZG1hX2RhYzIuZnJhZ3NpemUgPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MV9SRUdfREFDMl9TQ09VTlQpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGZyYWdyZW1haW4sIGZzaGlmdDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+Y3RybCAmIENUUkxfQURDX0VOKSAmJiAocy0+ZG1hX2FkYy5tYXBwZWQgfHwgcy0+ZG1hX2FkYy5jb3VudCA8IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtIDIqcy0+ZG1hX2FkYy5mcmFnc2l6ZSkpCisJICAgICYmIHMtPmRtYV9hZGMucmVhZHkpIHsKKwkJcy0+Y3RybCB8PSBDVFJMX0FEQ19FTjsKKwkJcy0+c2N0cmwgPSAocy0+c2N0cmwgJiB+U0NUUkxfUjFMT09QU0VMKSB8IFNDVFJMX1IxSU5URU47CisJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQlmcmFncmVtYWluID0gKCgtIHMtPmRtYV9hZGMuaHdwdHIpICYgKHMtPmRtYV9hZGMuZnJhZ3NpemUtMSkpOworCQlmc2hpZnQgPSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUjFGTVQpID4+IFNDVFJMX1NIX1IxRk1UXTsKKwkJaWYgKGZyYWdyZW1haW4gPCAyKmZzaGlmdCkKKwkJCWZyYWdyZW1haW4gPSBzLT5kbWFfYWRjLmZyYWdzaXplOworCQlvdXRsKChmcmFncmVtYWluID4+IGZzaGlmdCkgLSAxLCBzLT5pbytFUzEzNzFfUkVHX0FEQ19TQ09VTlQpOworCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJCW91dGwoKHMtPmRtYV9hZGMuZnJhZ3NpemUgPj4gZnNoaWZ0KSAtIDEsIHMtPmlvK0VTMTM3MV9SRUdfQURDX1NDT1VOVCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIERNQUJVRl9ERUZBVUxUT1JERVIgKDE3LVBBR0VfU0hJRlQpCisjZGVmaW5lIERNQUJVRl9NSU5PUkRFUiAxCisKKworc3RhdGljIGlubGluZSB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWlmIChkYi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIsIGRiLT5yYXdidWYsIGRiLT5kbWFhZGRyKTsKKwl9CisJZGItPnJhd2J1ZiA9IE5VTEw7CisJZGItPm1hcHBlZCA9IGRiLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIsIHVuc2lnbmVkIHJhdGUsIHVuc2lnbmVkIGZtdCwgdW5zaWduZWQgcmVnKQoreworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBieXRlcGVyc2VjOworCXVuc2lnbmVkIGJ1ZnM7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJZGItPmh3cHRyID0gZGItPnN3cHRyID0gZGItPnRvdGFsX2J5dGVzID0gZGItPmNvdW50ID0gZGItPmVycm9yID0gZGItPmVuZGNsZWFyZWQgPSAwOworCWlmICghZGItPnJhd2J1ZikgeworCQlkYi0+cmVhZHkgPSBkYi0+bWFwcGVkID0gMDsKKwkJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkKKwkJCWlmICgoZGItPnJhd2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHMtPmRldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAmZGItPmRtYWFkZHIpKSkKKwkJCQlicmVhazsKKwkJaWYgKCFkYi0+cmF3YnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWRiLT5idWZvcmRlciA9IG9yZGVyOworCQkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisJfQorCWZtdCAmPSBFUzEzNzFfRk1UX01BU0s7CisJYnl0ZXBlcnNlYyA9IHJhdGUgPDwgc2FtcGxlX3NoaWZ0W2ZtdF07CisJYnVmcyA9IFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXI7CisJaWYgKGRiLT5vc3NmcmFnc2hpZnQpIHsKKwkJaWYgKCgxMDAwIDw8IGRiLT5vc3NmcmFnc2hpZnQpIDwgYnl0ZXBlcnNlYykKKwkJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAwKTsKKwkJZWxzZQorCQkJZGItPmZyYWdzaGlmdCA9IGRiLT5vc3NmcmFnc2hpZnQ7CisJfSBlbHNlIHsKKwkJZGItPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjLzEwMC8oZGItPnN1YmRpdmlzaW9uID8gZGItPnN1YmRpdmlzaW9uIDogMSkpOworCQlpZiAoZGItPmZyYWdzaGlmdCA8IDMpCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gMzsKKwl9CisJZGItPm51bWZyYWcgPSBidWZzID4+IGRiLT5mcmFnc2hpZnQ7CisJd2hpbGUgKGRiLT5udW1mcmFnIDwgNCAmJiBkYi0+ZnJhZ3NoaWZ0ID4gMykgeworCQlkYi0+ZnJhZ3NoaWZ0LS07CisJCWRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OworCX0KKwlkYi0+ZnJhZ3NpemUgPSAxIDw8IGRiLT5mcmFnc2hpZnQ7CisJaWYgKGRiLT5vc3NtYXhmcmFncyA+PSA0ICYmIGRiLT5vc3NtYXhmcmFncyA8IGRiLT5udW1mcmFnKQorCQlkYi0+bnVtZnJhZyA9IGRiLT5vc3NtYXhmcmFnczsKKwlkYi0+ZnJhZ3NhbXBsZXMgPSBkYi0+ZnJhZ3NpemUgPj4gc2FtcGxlX3NoaWZ0W2ZtdF07CisJZGItPmRtYXNpemUgPSBkYi0+bnVtZnJhZyA8PCBkYi0+ZnJhZ3NoaWZ0OworCW1lbXNldChkYi0+cmF3YnVmLCAoZm10ICYgRVMxMzcxX0ZNVF9TMTYpID8gMCA6IDB4ODAsIGRiLT5kbWFzaXplKTsKKwlvdXRsKChyZWcgPj4gOCkgJiAxNSwgcy0+aW8rRVMxMzcxX1JFR19NRU1QQUdFKTsKKwlvdXRsKGRiLT5kbWFhZGRyLCBzLT5pbysocmVnICYgMHhmZikpOworCW91dGwoKGRiLT5kbWFzaXplID4+IDIpLTEsIHMtPmlvKygocmVnICsgNCkgJiAweGZmKSk7CisJZGItPmVuYWJsZWQgPSAxOworCWRiLT5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2FkYyhzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXN0b3BfYWRjKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYywgcy0+YWRjcmF0ZSwgKHMtPnNjdHJsID4+IFNDVFJMX1NIX1IxRk1UKSAmIEVTMTM3MV9GTVRfTUFTSywgCisJCQkgICBFUzEzNzFfUkVHX0FEQ19GUkFNRUFEUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2RhYzIoc3RydWN0IGVzMTM3MV9zdGF0ZSAqcykKK3sKKwlzdG9wX2RhYzIocyk7CisJcmV0dXJuIHByb2dfZG1hYnVmKHMsICZzLT5kbWFfZGFjMiwgcy0+ZGFjMnJhdGUsIChzLT5zY3RybCA+PiBTQ1RSTF9TSF9QMkZNVCkgJiBFUzEzNzFfRk1UX01BU0ssIAorCQkJICAgRVMxMzcxX1JFR19EQUMyX0ZSQU1FQURSKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfZGFjMShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCXN0b3BfZGFjMShzKTsKKwlyZXR1cm4gcHJvZ19kbWFidWYocywgJnMtPmRtYV9kYWMxLCBzLT5kYWMxcmF0ZSwgKHMtPnNjdHJsID4+IFNDVFJMX1NIX1AxRk1UKSAmIEVTMTM3MV9GTVRfTUFTSywKKwkJCSAgIEVTMTM3MV9SRUdfREFDMV9GUkFNRUFEUik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X2h3cHRyKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiLCB1bnNpZ25lZCByZWcpCit7CisJdW5zaWduZWQgaHdwdHIsIGRpZmY7CisKKwlvdXRsKChyZWcgPj4gOCkgJiAxNSwgcy0+aW8rRVMxMzcxX1JFR19NRU1QQUdFKTsKKwlod3B0ciA9IChpbmwocy0+aW8rKHJlZyAmIDB4ZmYpKSA+PiAxNCkgJiAweDNmZmZjOworCWRpZmYgPSAoZGItPmRtYXNpemUgKyBod3B0ciAtIGRiLT5od3B0cikgJSBkYi0+ZG1hc2l6ZTsKKwlkYi0+aHdwdHIgPSBod3B0cjsKKwlyZXR1cm4gZGlmZjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2FkdmFuY2Uodm9pZCAqYnVmLCB1bnNpZ25lZCBic2l6ZSwgdW5zaWduZWQgYnB0ciwgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKGJwdHIgKyBsZW4gPiBic2l6ZSkgeworCQl1bnNpZ25lZCB4ID0gYnNpemUgLSBicHRyOworCQltZW1zZXQoKChjaGFyICopYnVmKSArIGJwdHIsIGMsIHgpOworCQlicHRyID0gMDsKKwkJbGVuIC09IHg7CisJfQorCW1lbXNldCgoKGNoYXIgKilidWYpICsgYnB0ciwgYywgbGVuKTsKK30KKworLyogY2FsbCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgdm9pZCBlczEzNzFfdXBkYXRlX3B0cihzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzKQoreworCWludCBkaWZmOworCisJLyogdXBkYXRlIEFEQyBwb2ludGVyICovCisJaWYgKHMtPmN0cmwgJiBDVFJMX0FEQ19FTikgeworCQlkaWZmID0gZ2V0X2h3cHRyKHMsICZzLT5kbWFfYWRjLCBFUzEzNzFfUkVHX0FEQ19GUkFNRUNOVCk7CisJCXMtPmRtYV9hZGMudG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJcy0+ZG1hX2FkYy5jb3VudCArPSBkaWZmOworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpIAorCQkJd2FrZV91cCgmcy0+ZG1hX2FkYy53YWl0KTsKKwkJaWYgKCFzLT5kbWFfYWRjLm1hcHBlZCkgeworCQkJaWYgKHMtPmRtYV9hZGMuY291bnQgPiAoc2lnbmVkKShzLT5kbWFfYWRjLmRtYXNpemUgLSAoKDMgKiBzLT5kbWFfYWRjLmZyYWdzaXplKSA+PiAxKSkpIHsKKwkJCQlzLT5jdHJsICY9IH5DVFJMX0FEQ19FTjsKKwkJCQlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJCQkJcy0+ZG1hX2FkYy5lcnJvcisrOworCQkJfQorCQl9CisJfQorCS8qIHVwZGF0ZSBEQUMxIHBvaW50ZXIgKi8KKwlpZiAocy0+Y3RybCAmIENUUkxfREFDMV9FTikgeworCQlkaWZmID0gZ2V0X2h3cHRyKHMsICZzLT5kbWFfZGFjMSwgRVMxMzcxX1JFR19EQUMxX0ZSQU1FQ05UKTsKKwkJcy0+ZG1hX2RhYzEudG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkgeworCQkJcy0+ZG1hX2RhYzEuY291bnQgKz0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjMS5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMxLmZyYWdzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMxLndhaXQpOworCQl9IGVsc2UgeworCQkJcy0+ZG1hX2RhYzEuY291bnQgLT0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjMS5jb3VudCA8PSAwKSB7CisJCQkJcy0+Y3RybCAmPSB+Q1RSTF9EQUMxX0VOOworCQkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwkJCQlzLT5kbWFfZGFjMS5lcnJvcisrOworCQkJfSBlbHNlIGlmIChzLT5kbWFfZGFjMS5jb3VudCA8PSAoc2lnbmVkKXMtPmRtYV9kYWMxLmZyYWdzaXplICYmICFzLT5kbWFfZGFjMS5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzLT5kbWFfZGFjMS5yYXdidWYsIHMtPmRtYV9kYWMxLmRtYXNpemUsIHMtPmRtYV9kYWMxLnN3cHRyLCAKKwkJCQkJICAgICAgcy0+ZG1hX2RhYzEuZnJhZ3NpemUsIChzLT5zY3RybCAmIFNDVFJMX1AxU0VCKSA/IDAgOiAweDgwKTsKKwkJCQlzLT5kbWFfZGFjMS5lbmRjbGVhcmVkID0gMTsKKwkJCX0KKwkJCWlmIChzLT5kbWFfZGFjMS5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYzEuZnJhZ3NpemUgPD0gKHNpZ25lZClzLT5kbWFfZGFjMS5kbWFzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMxLndhaXQpOworCQl9CisJfQorCS8qIHVwZGF0ZSBEQUMyIHBvaW50ZXIgKi8KKwlpZiAocy0+Y3RybCAmIENUUkxfREFDMl9FTikgeworCQlkaWZmID0gZ2V0X2h3cHRyKHMsICZzLT5kbWFfZGFjMiwgRVMxMzcxX1JFR19EQUMyX0ZSQU1FQ05UKTsKKwkJcy0+ZG1hX2RhYzIudG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJaWYgKHMtPmRtYV9kYWMyLm1hcHBlZCkgeworCQkJcy0+ZG1hX2RhYzIuY291bnQgKz0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjMi5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMyLmZyYWdzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMyLndhaXQpOworCQl9IGVsc2UgeworCQkJcy0+ZG1hX2RhYzIuY291bnQgLT0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjMi5jb3VudCA8PSAwKSB7CisJCQkJcy0+Y3RybCAmPSB+Q1RSTF9EQUMyX0VOOworCQkJCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwkJCQlzLT5kbWFfZGFjMi5lcnJvcisrOworCQkJfSBlbHNlIGlmIChzLT5kbWFfZGFjMi5jb3VudCA8PSAoc2lnbmVkKXMtPmRtYV9kYWMyLmZyYWdzaXplICYmICFzLT5kbWFfZGFjMi5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzLT5kbWFfZGFjMi5yYXdidWYsIHMtPmRtYV9kYWMyLmRtYXNpemUsIHMtPmRtYV9kYWMyLnN3cHRyLCAKKwkJCQkJICAgICAgcy0+ZG1hX2RhYzIuZnJhZ3NpemUsIChzLT5zY3RybCAmIFNDVFJMX1AyU0VCKSA/IDAgOiAweDgwKTsKKwkJCQlzLT5kbWFfZGFjMi5lbmRjbGVhcmVkID0gMTsKKwkJCX0KKwkJCWlmIChzLT5kbWFfZGFjMi5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUgPD0gKHNpZ25lZClzLT5kbWFfZGFjMi5kbWFzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMyLndhaXQpOworCQl9CisJfQorfQorCisvKiBob2xkIHNwaW5sb2NrIGZvciB0aGUgZm9sbG93aW5nISAqLworc3RhdGljIHZvaWQgZXMxMzcxX2hhbmRsZV9taWRpKHN0cnVjdCBlczEzNzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgY2hhciBjaDsKKwlpbnQgd2FrZTsKKworCWlmICghKHMtPmN0cmwgJiBDVFJMX1VBUlRfRU4pKQorCQlyZXR1cm47CisJd2FrZSA9IDA7CisJd2hpbGUgKGluYihzLT5pbytFUzEzNzFfUkVHX1VBUlRfU1RBVFVTKSAmIFVTVEFUX1JYUkRZKSB7CisJCWNoID0gaW5iKHMtPmlvK0VTMTM3MV9SRUdfVUFSVF9EQVRBKTsKKwkJaWYgKHMtPm1pZGkuaWNudCA8IE1JRElJTkJVRikgeworCQkJcy0+bWlkaS5pYnVmW3MtPm1pZGkuaXdyXSA9IGNoOworCQkJcy0+bWlkaS5pd3IgPSAocy0+bWlkaS5pd3IgKyAxKSAlIE1JRElJTkJVRjsKKwkJCXMtPm1pZGkuaWNudCsrOworCQl9CisJCXdha2UgPSAxOworCX0KKwlpZiAod2FrZSkKKwkJd2FrZV91cCgmcy0+bWlkaS5pd2FpdCk7CisJd2FrZSA9IDA7CisJd2hpbGUgKChpbmIocy0+aW8rRVMxMzcxX1JFR19VQVJUX1NUQVRVUykgJiBVU1RBVF9UWFJEWSkgJiYgcy0+bWlkaS5vY250ID4gMCkgeworCQlvdXRiKHMtPm1pZGkub2J1ZltzLT5taWRpLm9yZF0sIHMtPmlvK0VTMTM3MV9SRUdfVUFSVF9EQVRBKTsKKwkJcy0+bWlkaS5vcmQgPSAocy0+bWlkaS5vcmQgKyAxKSAlIE1JRElPVVRCVUY7CisJCXMtPm1pZGkub2NudC0tOworCQlpZiAocy0+bWlkaS5vY250IDwgTUlESU9VVEJVRi0xNikKKwkJCXdha2UgPSAxOworCX0KKwlpZiAod2FrZSkKKwkJd2FrZV91cCgmcy0+bWlkaS5vd2FpdCk7CisJb3V0Yigocy0+bWlkaS5vY250ID4gMCkgPyBVQ1RSTF9SWElOVEVOIHwgVUNUUkxfRU5BX1RYSU5UIDogVUNUUkxfUlhJTlRFTiwgcy0+aW8rRVMxMzcxX1JFR19VQVJUX0NPTlRST0wpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgZXMxMzcxX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilkZXZfaWQ7CisJdW5zaWduZWQgaW50IGludHNyYywgc2N0bDsKKwkKKwkvKiBmYXN0cGF0aCBvdXQsIHRvIGVhc2UgaW50ZXJydXB0IHNoYXJpbmcgKi8KKwlpbnRzcmMgPSBpbmwocy0+aW8rRVMxMzcxX1JFR19TVEFUVVMpOworCWlmICghKGludHNyYyAmIDB4ODAwMDAwMDApKQorCQlyZXR1cm4gSVJRX05PTkU7CisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwkvKiBjbGVhciBhdWRpbyBpbnRlcnJ1cHRzIGZpcnN0ICovCisJc2N0bCA9IHMtPnNjdHJsOworCWlmIChpbnRzcmMgJiBTVEFUX0FEQykKKwkJc2N0bCAmPSB+U0NUUkxfUjFJTlRFTjsKKwlpZiAoaW50c3JjICYgU1RBVF9EQUMxKQorCQlzY3RsICY9IH5TQ1RSTF9QMUlOVEVOOworCWlmIChpbnRzcmMgJiBTVEFUX0RBQzIpCisJCXNjdGwgJj0gflNDVFJMX1AySU5URU47CisJb3V0bChzY3RsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwllczEzNzFfdXBkYXRlX3B0cihzKTsKKwllczEzNzFfaGFuZGxlX21pZGkocyk7CisJc3Bpbl91bmxvY2soJnMtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGludmFsaWRfbWFnaWNbXSA9IEtFUk5fQ1JJVCBQRlggImludmFsaWQgbWFnaWMgdmFsdWVcbiI7CisKKyNkZWZpbmUgVkFMSURBVEVfU1RBVEUocykgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKCEocykgfHwgKHMpLT5tYWdpYyAhPSBFUzEzNzFfTUFHSUMpIHsgXAorCQlwcmludGsoaW52YWxpZF9tYWdpYyk7ICAgICAgICAgICAgXAorCQlyZXR1cm4gLUVOWElPOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBDb252ZXJzaW9uIHRhYmxlIGZvciBTL1BESUYgUENNIHZvbHVtZSBlbXVsYXRpb24gdGhyb3VnaCB0aGUgU1JDICovCisvKiBkQi1saW5lYXIgdGFibGUgb2YgREFDIHZvbCB2YWx1ZXM7IC0wZEIgdG8gLTQ2LjVkQiB3aXRoIG11dGUgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBEQUNWb2xUYWJsZVsxMDFdID0KK3sKKwkweDEwMDAsIDB4MGYyYSwgMHgwZTYwLCAweDBkYTAsIDB4MGNlYSwgMHgwYzNlLCAweDBiOWEsIDB4MGFmZiwKKwkweDBhNmQsIDB4MDllMSwgMHgwOTVlLCAweDA4ZTEsIDB4MDg2YSwgMHgwN2ZhLCAweDA3OGYsIDB4MDcyYSwKKwkweDA2Y2IsIDB4MDY3MCwgMHgwNjFhLCAweDA1YzksIDB4MDU3YiwgMHgwNTMyLCAweDA0ZWQsIDB4MDRhYiwKKwkweDA0NmQsIDB4MDQzMiwgMHgwM2ZhLCAweDAzYzUsIDB4MDM5MiwgMHgwMzYzLCAweDAzMzUsIDB4MDMwYiwKKwkweDAyZTIsIDB4MDJiYywgMHgwMjk3LCAweDAyNzUsIDB4MDI1NCwgMHgwMjM1LCAweDAyMTcsIDB4MDFmYiwKKwkweDAxZTEsIDB4MDFjOCwgMHgwMWIwLCAweDAxOTksIDB4MDE4NCwgMHgwMTcwLCAweDAxNWQsIDB4MDE0YiwKKwkweDAxMzksIDB4MDEyOSwgMHgwMTE5LCAweDAxMGIsIDB4MDBmZCwgMHgwMGYwLCAweDAwZTMsIDB4MDBkNywKKwkweDAwY2MsIDB4MDBjMSwgMHgwMGI3LCAweDAwYWUsIDB4MDBhNSwgMHgwMDljLCAweDAwOTQsIDB4MDA4YywKKwkweDAwODUsIDB4MDA3ZSwgMHgwMDc3LCAweDAwNzEsIDB4MDA2YiwgMHgwMDY2LCAweDAwNjAsIDB4MDA1YiwKKwkweDAwNTcsIDB4MDA1MiwgMHgwMDRlLCAweDAwNGEsIDB4MDA0NiwgMHgwMDQyLCAweDAwM2YsIDB4MDAzYywKKwkweDAwMzgsIDB4MDAzNiwgMHgwMDMzLCAweDAwMzAsIDB4MDAyZSwgMHgwMDJiLCAweDAwMjksIDB4MDAyNywKKwkweDAwMjUsIDB4MDAyMywgMHgwMDIxLCAweDAwMWYsIDB4MDAxZSwgMHgwMDFjLCAweDAwMWIsIDB4MDAxOSwKKwkweDAwMTgsIDB4MDAxNywgMHgwMDE2LCAweDAwMTQsIDB4MDAwMAorfTsKKworLyoKKyAqIHdoZW4gd2UgYXJlIGluIFMvUERJRiBtb2RlLCB3ZSB3YW50IHRvIGRpc2FibGUgYW55IGFuYWxvZyBvdXRwdXQgc28KKyAqIHdlIGZpbHRlciB0aGUgbWl4ZXIgaW9jdGxzIAorICovCitzdGF0aWMgaW50IG1peGRldl9pb2N0bChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJaW50IHZhbDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBsZWZ0LCByaWdodDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCS8qIGZpbHRlciBtaXhlciBpb2N0bHMgdG8gY2F0Y2ggUENNIGFuZCBNQVNURVIgdm9sdW1lIHdoZW4gaW4gUy9QRElGIG1vZGUgKi8KKwlpZiAocy0+c3BkaWZfdm9sdW1lID09IC0xKQorCQlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRToKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX1BDTTogICAvKiB1c2UgU1JDIGZvciBQQ00gdm9sdW1lICovCisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyaWdodCA9ICgodmFsID4+IDgpICAmIDB4ZmYpOworCQlsZWZ0ID0gKHZhbCAgJiAweGZmKTsKKwkJaWYgKHJpZ2h0ID4gMTAwKQorCQkJcmlnaHQgPSAxMDA7CisJCWlmIChsZWZ0ID4gMTAwKQorCQkJbGVmdCA9IDEwMDsKKwkJcy0+c3BkaWZfdm9sdW1lID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc3JjX3dyaXRlKHMsIFNSQ1JFR19WT0xfREFDMiwgREFDVm9sVGFibGVbMTAwIC0gbGVmdF0pOworCQlzcmNfd3JpdGUocywgU1JDUkVHX1ZPTF9EQUMyKzEsIERBQ1ZvbFRhYmxlWzEwMCAtIHJpZ2h0XSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJCisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1BDTToKKwkJcmV0dXJuIHB1dF91c2VyKHMtPnNwZGlmX3ZvbHVtZSwgKGludCBfX3VzZXIgKilhcmcpOworCX0KKwlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogQUM5NyBNaXhlciBSZWdpc3RlciB0byBDb25uZWN0aW9ucyBtYXBwaW5nIG9mIHRoZSBDb25jZXJ0IDk3IGJvYXJkCisgKgorICogQUM5N19NQVNURVJfVk9MX1NURVJFTyAgIExpbmUgT3V0CisgKiBBQzk3X01BU1RFUl9WT0xfTU9OTyAgICAgVEFEIE91dHB1dAorICogQUM5N19QQ0JFRVBfVk9MICAgICAgICAgIG5vbmUKKyAqIEFDOTdfUEhPTkVfVk9MICAgICAgICAgICBUQUQgSW5wdXQgKG1vbm8pCisgKiBBQzk3X01JQ19WT0wgICAgICAgICAgICAgTUlDIElucHV0IChtb25vKQorICogQUM5N19MSU5FSU5fVk9MICAgICAgICAgIExpbmUgSW5wdXQgKHN0ZXJlbykKKyAqIEFDOTdfQ0RfVk9MICAgICAgICAgICAgICBDRCBJbnB1dCAoc3RlcmVvKQorICogQUM5N19WSURFT19WT0wgICAgICAgICAgIG5vbmUKKyAqIEFDOTdfQVVYX1ZPTCAgICAgICAgICAgICBBdXggSW5wdXQgKHN0ZXJlbykKKyAqIEFDOTdfUENNT1VUX1ZPTCAgICAgICAgICBXYXZlIE91dHB1dCAoc3RlcmVvKQorICovCisKK3N0YXRpYyBpbnQgZXMxMzcxX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBlczEzNzFfc3RhdGUsIGRldnMpOworCQlpZiAocy0+Y29kZWMtPmRldl9taXhlciA9PSBtaW5vcikKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwkKKwlWQUxJREFURV9TVEFURShzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBlczEzNzFfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gcy0+Y29kZWM7CisKKwlyZXR1cm4gbWl4ZGV2X2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlczEzNzFfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IGVzMTM3MV9pb2N0bF9taXhkZXYsCisJLm9wZW4JCT0gZXMxMzcxX29wZW5fbWl4ZGV2LAorCS5yZWxlYXNlCT0gZXMxMzcxX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjMShzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCBpbnQgbm9uYmxvY2spCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQsIHRtbzsKKwkKKwlpZiAocy0+ZG1hX2RhYzEubWFwcGVkIHx8ICFzLT5kbWFfZGFjMS5yZWFkeSkKKwkJcmV0dXJuIDA7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMS53YWl0LCAmd2FpdCk7CisgICAgICAgIGZvciAoOzspIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworICAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzEuY291bnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobm9uYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMS53YWl0LCAmd2FpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FQlVTWTsKKyAgICAgICAgICAgICAgICB9CisJCXRtbyA9IDMgKiBIWiAqIChjb3VudCArIHMtPmRtYV9kYWMxLmZyYWdzaXplKSAvIDIgLyBzLT5kYWMxcmF0ZTsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPnNjdHJsICYgU0NUUkxfUDFGTVQpID4+IFNDVFJMX1NIX1AxRk1UXTsKKwkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyArIDEpKQorCQkJREJHKHByaW50ayhLRVJOX0RFQlVHIFBGWCAiZGFjMSBkbWEgdGltZWQgb3V0Pz9cbiIpOykKKyAgICAgICAgfQorICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzEud2FpdCwgJndhaXQpOworICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjMihzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzLCBpbnQgbm9uYmxvY2spCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQsIHRtbzsKKworCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQgfHwgIXMtPmRtYV9kYWMyLnJlYWR5KQorCQlyZXR1cm4gMDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMyLndhaXQsICZ3YWl0KTsKKyAgICAgICAgZm9yICg7OykgeworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9kYWMyLmNvdW50OworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDw9IDApCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKG5vbmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgICAgICAgICAgfQorCQl0bW8gPSAzICogSFogKiAoY291bnQgKyBzLT5kbWFfZGFjMi5mcmFnc2l6ZSkgLyAyIC8gcy0+ZGFjMnJhdGU7CisJCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0WyhzLT5zY3RybCAmIFNDVFJMX1AyRk1UKSA+PiBTQ1RSTF9TSF9QMkZNVF07CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gKyAxKSkKKwkJCURCRyhwcmludGsoS0VSTl9ERUJVRyBQRlggImRhYzIgZG1hIHRpbWVkIG91dD8/XG4iKTspCisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMyLndhaXQsICZ3YWl0KTsKKyAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNzaXplX3QgZXMxMzcxX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWRvd24oJnMtPnNlbSk7CisJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQlnb3RvIG91dDI7CisJCisJYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9hZGMud2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc3dwdHIgPSBzLT5kbWFfYWRjLnN3cHRyOworCQljbnQgPSBzLT5kbWFfYWRjLmRtYXNpemUtc3dwdHI7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50IDwgY250KQorCQkJY250ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChzLT5kbWFfYWRjLmVuYWJsZWQpCisJCQkJc3RhcnRfYWRjKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQl1cCgmcy0+c2VtKTsKKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWdvdG8gb3V0MjsKKwkJCX0KKwkJCWRvd24oJnMtPnNlbSk7CisJCQlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCQl7CisJCQkJcmV0ID0gLUVOWElPOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPmRtYV9hZGMucmF3YnVmICsgc3dwdHIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmRtYV9hZGMuc3dwdHIgPSBzd3B0cjsKKwkJcy0+ZG1hX2FkYy5jb3VudCAtPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlpZiAocy0+ZG1hX2FkYy5lbmFibGVkKQorCQkJc3RhcnRfYWRjKHMpOworCX0KK291dDoKKwl1cCgmcy0+c2VtKTsKK291dDI6CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9hZGMud2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZXMxMzcxX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKHMtPmRtYV9kYWMyLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWRvd24oJnMtPnNlbSk7CQorCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYzIocykpKQorCQlnb3RvIG91dDM7CisJcmV0ID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYzIud2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHMtPmRtYV9kYWMyLmNvdW50IDwgMCkgeworCQkJcy0+ZG1hX2RhYzIuY291bnQgPSAwOworCQkJcy0+ZG1hX2RhYzIuc3dwdHIgPSBzLT5kbWFfZGFjMi5od3B0cjsKKwkJfQorCQlzd3B0ciA9IHMtPmRtYV9kYWMyLnN3cHRyOworCQljbnQgPSBzLT5kbWFfZGFjMi5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+ZG1hX2RhYzIuY291bnQgKyBjbnQgPiBzLT5kbWFfZGFjMi5kbWFzaXplKQorCQkJY250ID0gcy0+ZG1hX2RhYzIuZG1hc2l6ZSAtIHMtPmRtYV9kYWMyLmNvdW50OworCQlpZiAoY250IDw9IDApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKHMtPmRtYV9kYWMyLmVuYWJsZWQpCisJCQkJc3RhcnRfZGFjMihzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gb3V0OworCQkJfQkKKwkJCXVwKCZzLT5zZW0pOworCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBvdXQyOworCQkJfQorCQkJZG93bigmcy0+c2VtKTsKKwkJCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpCisJCQl7CisJCQkJcmV0ID0gLUVOWElPOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKHMtPmRtYV9kYWMyLnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfZGFjMi5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfZGFjMi5zd3B0ciA9IHN3cHRyOworCQlzLT5kbWFfZGFjMi5jb3VudCArPSBjbnQ7CisJCXMtPmRtYV9kYWMyLmVuZGNsZWFyZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9kYWMyLmVuYWJsZWQpCisJCQlzdGFydF9kYWMyKHMpOworCX0KK291dDoKKwl1cCgmcy0+c2VtKTsKK291dDI6CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMyLndhaXQsICZ3YWl0KTsKK291dDM6CQorCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXMxMzcxX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzID0gKHN0cnVjdCBlczEzNzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9kYWMyKHMpKQorCQkJcmV0dXJuIDA7CisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2RhYzIud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9hZGMocykpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfYWRjLndhaXQsIHdhaXQpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWVzMTM3MV91cGRhdGVfcHRyKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHMtPmRtYV9kYWMyLm1hcHBlZCkgeworCQkJaWYgKHMtPmRtYV9kYWMyLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYzIuZnJhZ3NpemUpIAorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0gZWxzZSB7CisJCQlpZiAoKHNpZ25lZClzLT5kbWFfZGFjMi5kbWFzaXplID49IHMtPmRtYV9kYWMyLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjMi5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBlczEzNzFfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRiOworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJZG93bigmcy0+c2VtKTsKKwkKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjMihzKSkgIT0gMCkgeworCQkJZ290byBvdXQ7CisJCX0KKwkJZGIgPSAmcy0+ZG1hX2RhYzI7CisJfSBlbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkgIT0gMCkgeworCQkJZ290byBvdXQ7CisJCX0KKwkJZGIgPSAmcy0+ZG1hX2FkYzsKKwl9IGVsc2UgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkJdmlydF90b19waHlzKGRiLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCXJldCA9IC1FQUdBSU47CisJCWdvdG8gb3V0OworCX0KKwlkYi0+bWFwcGVkID0gMTsKK291dDoKKwl1cCgmcy0+c2VtKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBlczEzNzFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBhdWRpb19idWZfaW5mbyBhYmluZm87CisgICAgICAgIGNvdW50X2luZm8gY2luZm87CisJaW50IGNvdW50OworCWludCB2YWwsIG1hcHBlZCwgcmV0OworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisgICAgICAgIG1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIHMtPmRtYV9kYWMyLm1hcHBlZCkgfHwKKwkJKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiBzLT5kbWFfYWRjLm1hcHBlZCk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIGRyYWluX2RhYzIocywgMC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sqLyk7CisJCXJldHVybiAwOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYzIocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9kYWMyLnN3cHRyID0gcy0+ZG1hX2RhYzIuaHdwdHIgPSBzLT5kbWFfZGFjMi5jb3VudCA9IHMtPmRtYV9kYWMyLnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0gcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPSAwOworCQl9CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJc2V0X2FkY19yYXRlKHMsIHZhbCk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYzIocyk7CisJCQkJcy0+ZG1hX2RhYzIucmVhZHkgPSAwOworCQkJCXNldF9kYWMyX3JhdGUocywgdmFsKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+YWRjcmF0ZSA6IHMtPmRhYzJyYXRlLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlpZiAodmFsKQorCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1IxU01COworCQkJZWxzZQorCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9SMVNNQjsKKwkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMyKHMpOworCQkJcy0+ZG1hX2RhYzIucmVhZHkgPSAwOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh2YWwpCisJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDJTTUI7CisJCQllbHNlCisJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AyU01COworCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgfQorCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlzLT5zY3RybCB8PSBTQ1RSTF9SMVNNQjsKKwkJCQllbHNlCisJCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9SMVNNQjsKKwkJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYzIocyk7CisJCQkJcy0+ZG1hX2RhYzIucmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMlNNQjsKKwkJCQllbHNlCisJCQkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMlNNQjsKKwkJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBTQ1RSTF9SMVNNQiA6IFNDVFJMX1AyU01CKSkgPyAyIDogMSwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRXxBRk1UX1U4LCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKKwkJCQkJcy0+c2N0cmwgfD0gU0NUUkxfUjFTRUI7CisJCQkJZWxzZQorCQkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUjFTRUI7CisJCQkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMyKHMpOworCQkJCXMtPmRtYV9kYWMyLnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCXMtPnNjdHJsIHw9IFNDVFJMX1AyU0VCOworCQkJCWVsc2UKKwkJCQkJcy0+c2N0cmwgJj0gflNDVFJMX1AyU0VCOworCQkJCW91dGwocy0+c2N0cmwsIHMtPmlvK0VTMTM3MV9SRUdfU0VSSUFMX0NPTlRST0wpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IFNDVFJMX1IxU0VCIDogU0NUUkxfUDJTRUIpKSA/IAorCQkJCUFGTVRfUzE2X0xFIDogQUZNVF9VOCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5jdHJsICYgQ1RSTF9BRENfRU4pIAorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5jdHJsICYgQ1RSTF9EQUMyX0VOKSAKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJcy0+ZG1hX2FkYy5lbmFibGVkID0gMTsKKwkJCQlzdGFydF9hZGMocyk7CisJCQl9IGVsc2UgeworCQkJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDA7CisJCQkJc3RvcF9hZGMocyk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzLT5kbWFfZGFjMi5lbmFibGVkID0gMTsKKwkJCQlzdGFydF9kYWMyKHMpOworCQkJfSBlbHNlIHsKKwkJCQlzLT5kbWFfZGFjMi5lbmFibGVkID0gMDsKKwkJCQlzdG9wX2RhYzIocyk7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMihzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MV91cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfZGFjMi5mcmFnc2l6ZTsKKwkJY291bnQgPSBzLT5kbWFfZGFjMi5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBzLT5kbWFfZGFjMi5kbWFzaXplIC0gY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfZGFjMi5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2RhYzIuZnJhZ3NoaWZ0OyAgICAgIAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MV91cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bWZyYWc7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsgICAgICAKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorICAgICAgICAgICAgICAgIGZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjMi5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMihzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNvdW50ID0gcy0+ZG1hX2RhYzIuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJcmV0dXJuIHB1dF91c2VyKGNvdW50LCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzFfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXM7CisJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsKKyAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSBzLT5kbWFfYWRjLmh3cHRyOworCQlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCQlzLT5kbWFfYWRjLmNvdW50ICY9IHMtPmRtYV9hZGMuZnJhZ3NpemUtMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9kYWMyLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMyKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjMi50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfZGFjMi5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBjaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfZGFjMi5mcmFnc2hpZnQ7CisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2RhYzIuaHdwdHI7CisJCWlmIChzLT5kbWFfZGFjMi5tYXBwZWQpCisJCQlzLT5kbWFfZGFjMi5jb3VudCAmPSBzLT5kbWFfZGFjMi5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX2RhYzIocykpKQorCQkJCXJldHVybiB2YWw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYzIuZnJhZ3NpemUsIHApOworCQl9CisJCWlmICgodmFsID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCXJldHVybiB2YWw7CisJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLmZyYWdzaXplLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSA0OworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJcy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2RhYzIub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJCWlmIChzLT5kbWFfZGFjMi5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9kYWMyLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQkJcy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2RhYzIub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9kYWMyLm9zc21heGZyYWdzID0gNDsKKwkJfQorCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbikgfHwKKwkJICAgIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5kbWFfZGFjMi5zdWJkaXZpc2lvbikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gdmFsOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlzLT5kbWFfZGFjMi5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+YWRjcmF0ZSA6IHMtPmRhYzJyYXRlLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IFNDVFJMX1IxU01CIDogU0NUUkxfUDJTTUIpKSA/IDIgOiAxLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBTQ1RSTF9SMVNFQiA6IFNDVFJMX1AyU0VCKSkgPyAxNiA6IDgsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCQorCX0KKwlyZXR1cm4gbWl4ZGV2X2lvY3RsKHMtPmNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZXMxMzcxX3N0YXRlLCBkZXZzKTsKKwkJaWYgKCEoKHMtPmRldl9hdWRpbyBeIG1pbm9yKSAmIH4weGYpKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgZmlsZS0+Zl9tb2RlKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gMDsKKwkJcy0+ZG1hX2FkYy5lbmFibGVkID0gMTsKKwkJc2V0X2FkY19yYXRlKHMsIDgwMDApOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+ZG1hX2RhYzIub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYzIub3NzbWF4ZnJhZ3MgPSBzLT5kbWFfZGFjMi5zdWJkaXZpc2lvbiA9IDA7CisJCXMtPmRtYV9kYWMyLmVuYWJsZWQgPSAxOworCQlzZXRfZGFjMl9yYXRlKHMsIDgwMDApOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPnNjdHJsICY9IH5TQ1RSTF9SMUZNVDsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCXMtPnNjdHJsIHw9IEVTMTM3MV9GTVRfUzE2X01PTk8gPDwgU0NUUkxfU0hfUjFGTVQ7CisJCWVsc2UKKwkJCXMtPnNjdHJsIHw9IEVTMTM3MV9GTVRfVThfTU9OTyA8PCBTQ1RSTF9TSF9SMUZNVDsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMkZNVDsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCXMtPnNjdHJsIHw9IEVTMTM3MV9GTVRfUzE2X01PTk8gPDwgU0NUUkxfU0hfUDJGTVQ7CisJCWVsc2UKKwkJCXMtPnNjdHJsIHw9IEVTMTM3MV9GTVRfVThfTU9OTyA8PCBTQ1RSTF9TSF9QMkZNVDsKKwl9CisJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCWluaXRfTVVURVgoJnMtPnNlbSk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVzMTM3MV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlkcmFpbl9kYWMyKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0b3BfZGFjMihzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9kYWMyKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RvcF9hZGMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKKwl9CisJcy0+b3Blbl9tb2RlICY9IH4oZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZXMxMzcxX2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGVzMTM3MV9yZWFkLAorCS53cml0ZQkJPSBlczEzNzFfd3JpdGUsCisJLnBvbGwJCT0gZXMxMzcxX3BvbGwsCisJLmlvY3RsCQk9IGVzMTM3MV9pb2N0bCwKKwkubW1hcAkJPSBlczEzNzFfbW1hcCwKKwkub3BlbgkJPSBlczEzNzFfb3BlbiwKKwkucmVsZWFzZQk9IGVzMTM3MV9yZWxlYXNlLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzc2l6ZV90IGVzMTM3MV93cml0ZV9kYWMoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKHMtPmRtYV9kYWMxLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjMS53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAocy0+ZG1hX2RhYzEuY291bnQgPCAwKSB7CisJCQlzLT5kbWFfZGFjMS5jb3VudCA9IDA7CisJCQlzLT5kbWFfZGFjMS5zd3B0ciA9IHMtPmRtYV9kYWMxLmh3cHRyOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYzEuc3dwdHI7CisJCWNudCA9IHMtPmRtYV9kYWMxLmRtYXNpemUtc3dwdHI7CisJCWlmIChzLT5kbWFfZGFjMS5jb3VudCArIGNudCA+IHMtPmRtYV9kYWMxLmRtYXNpemUpCisJCQljbnQgPSBzLT5kbWFfZGFjMS5kbWFzaXplIC0gcy0+ZG1hX2RhYzEuY291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2RhYzEuZW5hYmxlZCkKKwkJCQlzdGFydF9kYWMxKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihzLT5kbWFfZGFjMS5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYzEuZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+ZG1hX2RhYzEuc3dwdHIgPSBzd3B0cjsKKwkJcy0+ZG1hX2RhYzEuY291bnQgKz0gY250OworCQlzLT5kbWFfZGFjMS5lbmRjbGVhcmVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWlmIChzLT5kbWFfZGFjMS5lbmFibGVkKQorCQkJc3RhcnRfZGFjMShzKTsKKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMxLndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVzMTM3MV9wb2xsX2RhYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghcy0+ZG1hX2RhYzEucmVhZHkgJiYgcHJvZ19kbWFidWZfZGFjMShzKSkKKwkJcmV0dXJuIDA7CisJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfZGFjMS53YWl0LCB3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWVzMTM3MV91cGRhdGVfcHRyKHMpOworCWlmIChzLT5kbWFfZGFjMS5tYXBwZWQpIHsKKwkJaWYgKHMtPmRtYV9kYWMxLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYzEuZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0gZWxzZSB7CisJCWlmICgoc2lnbmVkKXMtPmRtYV9kYWMxLmRtYXNpemUgPj0gcy0+ZG1hX2RhYzEuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMxLmZyYWdzaXplKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGVzMTM3MV9tbWFwX2RhYyhzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQ7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYzEocykpICE9IDApCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgcy0+ZG1hX2RhYzEuYnVmb3JkZXIpKQorCQlnb3RvIG91dDsKKwlyZXQgPSAtRUFHQUlOOworCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJdmlydF90b19waHlzKHMtPmRtYV9kYWMxLnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCXNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJZ290byBvdXQ7CisJcy0+ZG1hX2RhYzEubWFwcGVkID0gMTsKKwlyZXQgPSAwOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVzMTM3MV9pb2N0bF9kYWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBhdWRpb19idWZfaW5mbyBhYmluZm87CisgICAgICAgIGNvdW50X2luZm8gY2luZm87CisJaW50IGNvdW50OworCWludCB2YWwsIHJldDsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlyZXR1cm4gZHJhaW5fZGFjMShzLCAwLypmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyovKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlzdG9wX2RhYzEocyk7CisJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQlzLT5kbWFfZGFjMS5zd3B0ciA9IHMtPmRtYV9kYWMxLmh3cHRyID0gcy0+ZG1hX2RhYzEuY291bnQgPSBzLT5kbWFfZGFjMS50b3RhbF9ieXRlcyA9IDA7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCXN0b3BfZGFjMShzKTsKKwkJCXMtPmRtYV9kYWMxLnJlYWR5ID0gMDsKKwkJCXNldF9kYWMxX3JhdGUocywgdmFsKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIocy0+ZGFjMXJhdGUsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXN0b3BfZGFjMShzKTsKKwkJcy0+ZG1hX2RhYzEucmVhZHkgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAodmFsKQorCQkJcy0+c2N0cmwgfD0gU0NUUkxfUDFTTUI7CisJCWVsc2UKKwkJCXMtPnNjdHJsICY9IH5TQ1RSTF9QMVNNQjsKKwkJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMCkgeworCQkJc3RvcF9kYWMxKHMpOworCQkJcy0+ZG1hX2RhYzEucmVhZHkgPSAwOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmICh2YWwgPj0gMikKKwkJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMVNNQjsKKwkJCWVsc2UKKwkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUDFTTUI7CisJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgU0NUUkxfUDFTTUIpID8gMiA6IDEsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrICovCisgICAgICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFfEFGTVRfVTgsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlzdG9wX2RhYzEocyk7CisJCQlzLT5kbWFfZGFjMS5yZWFkeSA9IDA7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKKwkJCQlzLT5zY3RybCB8PSBTQ1RSTF9QMVNFQjsKKwkJCWVsc2UKKwkJCQlzLT5zY3RybCAmPSB+U0NUUkxfUDFTRUI7CisJCQlvdXRsKHMtPnNjdHJsLCBzLT5pbytFUzEzNzFfUkVHX1NFUklBTF9DT05UUk9MKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgU0NUUkxfUDFTRUIpID8gQUZNVF9TMTZfTEUgOiBBRk1UX1U4LCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfUE9TVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5jdHJsICYgQ1RSTF9EQUMxX0VOKSA/IFBDTV9FTkFCTEVfT1VUUFVUIDogMCwgcCk7CisJCQkJCQkKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCQlpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJcy0+ZG1hX2RhYzEuZW5hYmxlZCA9IDE7CisJCQlzdGFydF9kYWMxKHMpOworCQl9IGVsc2UgeworCQkJcy0+ZG1hX2RhYzEuZW5hYmxlZCA9IDA7CisJCQlzdG9wX2RhYzEocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIXMtPmRtYV9kYWMxLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXMxMzcxX3VwZGF0ZV9wdHIocyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMxLmZyYWdzaXplOworCQljb3VudCA9IHMtPmRtYV9kYWMxLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMxLmRtYXNpemUgLSBjb3VudDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMxLm51bWZyYWc7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjMS5mcmFnc2hpZnQ7ICAgICAgCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKyAgICAgICAgICAgICAgICBmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNvdW50ID0gcy0+ZG1hX2RhYzEuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJcmV0dXJuIHB1dF91c2VyKGNvdW50LCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCFzLT5kbWFfZGFjMS5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfZGFjMShzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWVzMTM3MV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYzEudG90YWxfYnl0ZXM7CisJCWNvdW50ID0gcy0+ZG1hX2RhYzEuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2RhYzEuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMxLmh3cHRyOworCQlpZiAocy0+ZG1hX2RhYzEubWFwcGVkKQorCQkJcy0+ZG1hX2RhYzEuY291bnQgJj0gcy0+ZG1hX2RhYzEuZnJhZ3NpemUtMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMxKHMpKSkKKwkJCXJldHVybiB2YWw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMxLmZyYWdzaXplLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcy0+ZG1hX2RhYzEub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQlzLT5kbWFfZGFjMS5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQlpZiAocy0+ZG1hX2RhYzEub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCXMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCWlmIChzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCXMtPmRtYV9kYWMxLm9zc2ZyYWdzaGlmdCA9IDE1OworCQlpZiAocy0+ZG1hX2RhYzEub3NzbWF4ZnJhZ3MgPCA0KQorCQkJcy0+ZG1hX2RhYzEub3NzbWF4ZnJhZ3MgPSA0OworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQlpZiAocy0+ZG1hX2RhYzEuc3ViZGl2aXNpb24pCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcy0+ZG1hX2RhYzEuc3ViZGl2aXNpb24gPSB2YWw7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJcmV0dXJuIHB1dF91c2VyKHMtPmRhYzFyYXRlLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnNjdHJsICYgU0NUUkxfUDFTTUIpID8gMiA6IDEsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5zY3RybCAmIFNDVFJMX1AxU0VCKSA/IDE2IDogOCwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgorICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCisJfQorCXJldHVybiBtaXhkZXZfaW9jdGwocy0+Y29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBlczEzNzFfb3Blbl9kYWMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZXMxMzcxX3N0YXRlLCBkZXZzKTsKKwkJaWYgKCEoKHMtPmRldl9kYWMgXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisgICAgICAgCS8qIHdlIGFsbG93IG9wZW5pbmcgd2l0aCBPX1JEV1IsIG1vc3QgcHJvZ3JhbXMgZG8gaXQgYWx0aG91Z2ggdGhleSB3aWxsIG9ubHkgd3JpdGUgKi8KKyNpZiAwCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXJldHVybiAtRVBFUk07CisjZW5kaWYKKwlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCXJldHVybiAtRUlOVkFMOworICAgICAgIAlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgRk1PREVfREFDKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKwlzLT5kbWFfZGFjMS5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjMS5vc3NtYXhmcmFncyA9IHMtPmRtYV9kYWMxLnN1YmRpdmlzaW9uID0gMDsKKwlzLT5kbWFfZGFjMS5lbmFibGVkID0gMTsKKwlzZXRfZGFjMV9yYXRlKHMsIDgwMDApOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+c2N0cmwgJj0gflNDVFJMX1AxRk1UOworCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCXMtPnNjdHJsIHw9IEVTMTM3MV9GTVRfUzE2X01PTk8gPDwgU0NUUkxfU0hfUDFGTVQ7CisJZWxzZQorCQlzLT5zY3RybCB8PSBFUzEzNzFfRk1UX1U4X01PTk8gPDwgU0NUUkxfU0hfUDFGTVQ7CisJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPm9wZW5fbW9kZSB8PSBGTU9ERV9EQUM7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX3JlbGVhc2VfZGFjKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJZHJhaW5fZGFjMShzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJZG93bigmcy0+b3Blbl9zZW0pOworCXN0b3BfZGFjMShzKTsKKwlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYzEpOworCXMtPm9wZW5fbW9kZSAmPSB+Rk1PREVfREFDOworCXVwKCZzLT5vcGVuX3NlbSk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlczEzNzFfZGFjX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS53cml0ZQkJPSBlczEzNzFfd3JpdGVfZGFjLAorCS5wb2xsCQk9IGVzMTM3MV9wb2xsX2RhYywKKwkuaW9jdGwJCT0gZXMxMzcxX2lvY3RsX2RhYywKKwkubW1hcAkJPSBlczEzNzFfbW1hcF9kYWMsCisJLm9wZW4JCT0gZXMxMzcxX29wZW5fZGFjLAorCS5yZWxlYXNlCT0gZXMxMzcxX3JlbGVhc2VfZGFjLAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBzc2l6ZV90IGVzMTM3MV9taWRpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHB0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCXJldCA9IDA7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLml3YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlwdHIgPSBzLT5taWRpLmlyZDsKKwkJY250ID0gTUlESUlOQlVGIC0gcHRyOworCQlpZiAocy0+bWlkaS5pY250IDwgY250KQorCQkJY250ID0gcy0+bWlkaS5pY250OworCQlpZiAoY250IDw9IDApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5taWRpLmlidWYgKyBwdHIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlwdHIgPSAocHRyICsgY250KSAlIE1JRElJTkJVRjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+bWlkaS5pcmQgPSBwdHI7CisJCXMtPm1pZGkuaWNudCAtPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlicmVhazsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLml3YWl0LCAmd2FpdCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZXMxMzcxX21pZGlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHB0cjsKKwlpbnQgY250OworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0ID0gMDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXB0ciA9IHMtPm1pZGkub3dyOworCQljbnQgPSBNSURJT1VUQlVGIC0gcHRyOworCQlpZiAocy0+bWlkaS5vY250ICsgY250ID4gTUlESU9VVEJVRikKKwkJCWNudCA9IE1JRElPVVRCVUYgLSBzLT5taWRpLm9jbnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJZXMxMzcxX2hhbmRsZV9taWRpKHMpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihzLT5taWRpLm9idWYgKyBwdHIsIGJ1ZmZlciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESU9VVEJVRjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+bWlkaS5vd3IgPSBwdHI7CisJCXMtPm1pZGkub2NudCArPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllczEzNzFfaGFuZGxlX21pZGkocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXMxMzcxX21pZGlfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSAoc3RydWN0IGVzMTM3MV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5taWRpLm93YWl0LCB3YWl0KTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5taWRpLml3YWl0LCB3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5taWRpLmljbnQgPiAwKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHMtPm1pZGkub2NudCA8IE1JRElPVVRCVUYpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgZXMxMzcxX21pZGlfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBlczEzNzFfc3RhdGUsIGRldnMpOworCQlpZiAocy0+ZGV2X21pZGkgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiAoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPm9wZW5fbW9kZSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKSkpIHsKKwkJcy0+bWlkaS5pcmQgPSBzLT5taWRpLml3ciA9IHMtPm1pZGkuaWNudCA9IDA7CisJCXMtPm1pZGkub3JkID0gcy0+bWlkaS5vd3IgPSBzLT5taWRpLm9jbnQgPSAwOworCQlvdXRiKFVDVFJMX0NOVFJMX1NXUiwgcy0+aW8rRVMxMzcxX1JFR19VQVJUX0NPTlRST0wpOworCQlvdXRiKDAsIHMtPmlvK0VTMTM3MV9SRUdfVUFSVF9DT05UUk9MKTsKKwkJb3V0YigwLCBzLT5pbytFUzEzNzFfUkVHX1VBUlRfVEVTVCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+bWlkaS5vcmQgPSBzLT5taWRpLm93ciA9IHMtPm1pZGkub2NudCA9IDA7CisJfQorCXMtPmN0cmwgfD0gQ1RSTF9VQVJUX0VOOworCW91dGwocy0+Y3RybCwgcy0+aW8rRVMxMzcxX1JFR19DT05UUk9MKTsKKwllczEzNzFfaGFuZGxlX21pZGkocyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPm9wZW5fbW9kZSB8PSAoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRCB8IEZNT0RFX01JRElfV1JJVEUpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGVzMTM3MV9taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGVzMTM3MV9zdGF0ZSAqcyA9IChzdHJ1Y3QgZXMxMzcxX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY291bnQsIHRtbzsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCWZvciAoOzspIHsKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQljb3VudCA9IHMtPm1pZGkub2NudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChjb3VudCA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCWJyZWFrOworCQkJdG1vID0gKGNvdW50ICogSFopIC8gMzEwMDsKKwkJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyA6IDEpICYmIHRtbykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyBQRlggIm1pZGkgdGltZWQgb3V0Pz9cbiIpOworCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJfQorCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlzLT5vcGVuX21vZGUgJj0gfigoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRHxGTU9ERV9NSURJX1dSSVRFKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCXMtPmN0cmwgJj0gfkNUUkxfVUFSVF9FTjsKKwkJb3V0bChzLT5jdHJsLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVzMTM3MV9taWRpX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGVzMTM3MV9taWRpX3JlYWQsCisJLndyaXRlCQk9IGVzMTM3MV9taWRpX3dyaXRlLAorCS5wb2xsCQk9IGVzMTM3MV9taWRpX3BvbGwsCisJLm9wZW4JCT0gZXMxMzcxX21pZGlfb3BlbiwKKwkucmVsZWFzZQk9IGVzMTM3MV9taWRpX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIHdlJ2xsIGNyZWF0ZSBhIHByb2MgZGV2aWNlIHRoYXQgZHVtcHMgdGhlCisgKiBDT0RFQyBjaGlwc3RhdGUKKyAqLworCisjaWZkZWYgRVMxMzcxX0RFQlVHCitzdGF0aWMgaW50IHByb2NfZXMxMzcxX2R1bXAgKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBmcG9zLCBpbnQgbGVuZ3RoLCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZXMxMzcxX3N0YXRlICpzOworICAgICAgICBpbnQgY250LCBsZW4gPSAwOworCisJaWYgKGxpc3RfZW1wdHkoJmRldnMpKQorCQlyZXR1cm4gMDsKKwlzID0gbGlzdF9lbnRyeShkZXZzLm5leHQsIHN0cnVjdCBlczEzNzFfc3RhdGUsIGRldnMpOworICAgICAgICAvKiBwcmludCBvdXQgaGVhZGVyICovCisgICAgICAgIGxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlx0XHRDcmVhdGl2ZSBFUzEzN3ggRGVidWcgRHVtcC1vLW1hdGljXG4iKTsKKworICAgICAgICAvKiBwcmludCBvdXQgQ09ERUMgc3RhdGUgKi8KKyAgICAgICAgbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgIkFDOTcgQ09ERUMgc3RhdGVcbiIpOworCWZvciAoY250PTA7IGNudCA8PSAweDdlOyBjbnQgPSBjbnQgKzIpCisgICAgICAgICAgICAgICAgbGVuKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAicmVnOjB4JTAyeCAgdmFsOjB4JTA0eFxuIiwgY250LCByZGNvZGVjKHMtPmNvZGVjLCBjbnQpKTsKKworICAgICAgICBpZiAoZnBvcyA+PWxlbil7CisgICAgICAgICAgICAgICAgKnN0YXJ0ID0gYnVmOworICAgICAgICAgICAgICAgICplb2YgPTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgKnN0YXJ0ID0gYnVmICsgZnBvczsKKyAgICAgICAgaWYgKChsZW4gLT0gZnBvcykgPiBsZW5ndGgpCisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgKmVvZiA9MTsKKyAgICAgICAgcmV0dXJuIGxlbjsKKworfQorI2VuZGlmIC8qIEVTMTM3MV9ERUJVRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbWF4aW11bSBudW1iZXIgb2YgZGV2aWNlczsgb25seSB1c2VkIGZvciBjb21tYW5kIGxpbmUgcGFyYW1zICovCisjZGVmaW5lIE5SX0RFVklDRSA1CisKK3N0YXRpYyBpbnQgc3BkaWZbTlJfREVWSUNFXTsKK3N0YXRpYyBpbnQgbm9taXhbTlJfREVWSUNFXTsKK3N0YXRpYyBpbnQgYW1wbGlmaWVyW05SX0RFVklDRV07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGV2aW5kZXg7CisKK21vZHVsZV9wYXJhbV9hcnJheShzcGRpZiwgYm9vbCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHNwZGlmLCAiaWYgMSB0aGUgb3V0cHV0IGlzIGluIFMvUERJRiBkaWdpdGFsIG1vZGUiKTsKK21vZHVsZV9wYXJhbV9hcnJheShub21peCwgYm9vbCwgTlVMTCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG5vbWl4LCAiaWYgMSBubyBhbmFsb2cgYXVkaW8gaXMgbWl4ZWQgdG8gdGhlIGRpZ2l0YWwgb3V0cHV0Iik7Cittb2R1bGVfcGFyYW1fYXJyYXkoYW1wbGlmaWVyLCBib29sLCBOVUxMLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoYW1wbGlmaWVyLCAiU2V0IHRvIDEgaWYgdGhlIG1hY2hpbmUgbmVlZHMgdGhlIGFtcCBjb250cm9sIGVuYWJsaW5nIChtYW55IGxhcHRvcHMpIik7CisKK01PRFVMRV9BVVRIT1IoIlRob21hcyBNLiBTYWlsZXIsIHNhaWxlckBpZmUuZWUuZXRoei5jaCwgaGI5am54QGhiOXcuY2hlLmV1Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVTMTM3MSBBdWRpb1BDSTk3IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGluaXR2b2wgeworCWludCBtaXhjaDsKKwlpbnQgdm9sOworfSBpbml0dm9sW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFNPVU5EX01JWEVSX1dSSVRFX0xJTkUsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfQ0QsIDB4NDA0MCB9LAorCXsgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfVklERU8pLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX0xJTkUxLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1BDTSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsIDB4NDA0MCB9LAorCXsgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfUEhPTkVPVVQpLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX09HQUlOLCAweDQwNDAgfSwKKwl7IE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1BIT05FSU4pLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1NQRUFLRVIsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfTUlDLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1JFQ0xFViwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9JR0FJTiwgMHg0MDQwIH0KK307CisKK3N0YXRpYyBzdHJ1Y3QKK3sKKwlzaG9ydCBzdmlkLCBzZGlkOworfSBhbXBsaWZpZXJfbmVlZGVkW10gPSAKK3sKKwl7IDB4MTA3QiwgMHgyMTUwIH0sCQkvKiBHYXRld2F5IFNvbG8gMjE1MCAqLworCXsgMHgxM0JELCAweDEwMEMgfSwJCS8qIE1lYml1cyBQQy1NSjEwMFYgKi8KKwl7IDB4MTEwMiwgMHg1OTM4IH0sCQkvKiBUYXJnYSBYdGVuZGVyIDMwMCAqLworCXsgMHgxMTAyLCAweDg5MzggfSwJCS8qIElQQyBub3RlYm9vayAqLworCXsgUENJX0FOWV9JRCwgUENJX0FOWV9JRCB9Cit9OworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBlczEzNzFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnM7CisJc3RydWN0IGdhbWVwb3J0ICpncDsKKwltbV9zZWdtZW50X3QgZnM7CisJaW50IGksIGdwaW8sIHZhbCwgcmVzID0gLTE7CisJaW50IGlkeDsKKwl1bnNpZ25lZCBsb25nIHRtbzsKKwlzaWduZWQgbG9uZyB0bW8yOworCXVuc2lnbmVkIGludCBjc3NyOworCisJaWYgKChyZXM9cGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkpCisJCXJldHVybiByZXM7CisKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpZGV2LCAwKSAmIElPUkVTT1VSQ0VfSU8pKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocGNpZGV2LT5pcnEgPT0gMCkgCisJCXJldHVybiAtRU5PREVWOworCWkgPSBwY2lfc2V0X2RtYV9tYXNrKHBjaWRldiwgMHhmZmZmZmZmZik7CisJaWYgKGkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZXMxMzcxOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAzMmJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCXJldHVybiBpOworCX0KKwlpZiAoIShzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGVzMTM3MV9zdGF0ZSksIEdGUF9LRVJORUwpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAib3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBlczEzNzFfc3RhdGUpKTsKKwkKKwlzLT5jb2RlYyA9IGFjOTdfYWxsb2NfY29kZWMoKTsKKwlpZihzLT5jb2RlYyA9PSBOVUxMKQorCQlnb3RvIGVycl9jb2RlYzsKKwkJCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjMS53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjMi53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm1pZGkuaXdhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm1pZGkub3dhaXQpOworCWluaXRfTVVURVgoJnMtPm9wZW5fc2VtKTsKKwlzcGluX2xvY2tfaW5pdCgmcy0+bG9jayk7CisJcy0+bWFnaWMgPSBFUzEzNzFfTUFHSUM7CisJcy0+ZGV2ID0gcGNpZGV2OworCXMtPmlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CisJcy0+aXJxID0gcGNpZGV2LT5pcnE7CisJcy0+dmVuZG9yID0gcGNpZGV2LT52ZW5kb3I7CisJcy0+ZGV2aWNlID0gcGNpZGV2LT5kZXZpY2U7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZzLT5yZXYpOworCXMtPmNvZGVjLT5wcml2YXRlX2RhdGEgPSBzOworCXMtPmNvZGVjLT5pZCA9IDA7CisJcy0+Y29kZWMtPmNvZGVjX3JlYWQgPSByZGNvZGVjOworCXMtPmNvZGVjLT5jb2RlY193cml0ZSA9IHdyY29kZWM7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlggImZvdW5kIGNoaXAsIHZlbmRvciBpZCAweCUwNHggZGV2aWNlIGlkIDB4JTA0eCByZXZpc2lvbiAweCUwMnhcbiIsCisJICAgICAgIHMtPnZlbmRvciwgcy0+ZGV2aWNlLCBzLT5yZXYpOworCWlmICghcmVxdWVzdF9yZWdpb24ocy0+aW8sIEVTMTM3MV9FWFRFTlQsICJlczEzNzEiKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpbyBwb3J0cyAlI2x4LSUjbHggaW4gdXNlXG4iLCBzLT5pbywgcy0+aW8rRVMxMzcxX0VYVEVOVC0xKTsKKwkJcmVzID0gLUVCVVNZOworCQlnb3RvIGVycl9yZWdpb247CisJfQorCWlmICgocmVzPXJlcXVlc3RfaXJxKHMtPmlycSwgZXMxMzcxX2ludGVycnVwdCwgU0FfU0hJUlEsICJlczEzNzEiLHMpKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJpcnEgJXUgaW4gdXNlXG4iLCBzLT5pcnEpOworCQlnb3RvIGVycl9pcnE7CisJfQorCXByaW50ayhLRVJOX0lORk8gUEZYICJmb3VuZCBlczEzNzEgcmV2ICVkIGF0IGlvICUjbHggaXJxICV1XG4iLAorCSAgICAgICBzLT5yZXYsIHMtPmlvLCBzLT5pcnEpOworCS8qIHJlZ2lzdGVyIGRldmljZXMgKi8KKwlpZiAoKHJlcz0ocy0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZlczEzNzFfYXVkaW9fZm9wcywtMSkpKTwwKQorCQlnb3RvIGVycl9kZXYxOworCWlmICgocmVzPShzLT5jb2RlYy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmVzMTM3MV9taXhlcl9mb3BzLCAtMSkpKSA8IDApCisJCWdvdG8gZXJyX2RldjI7CisJaWYgKChyZXM9KHMtPmRldl9kYWMgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmVzMTM3MV9kYWNfZm9wcywgLTEpKSkgPCAwKQorCQlnb3RvIGVycl9kZXYzOworCWlmICgocmVzPShzLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJmVzMTM3MV9taWRpX2ZvcHMsIC0xKSkpPDAgKQorCQlnb3RvIGVycl9kZXY0OworI2lmZGVmIEVTMTM3MV9ERUJVRworCS8qIGluaXRpYWxpemUgdGhlIGRlYnVnIHByb2MgZGV2aWNlICovCisJcy0+cHMgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJlczEzNzEiLDAsTlVMTCxwcm9jX2VzMTM3MV9kdW1wLE5VTEwpOworI2VuZGlmIC8qIEVTMTM3MV9ERUJVRyAqLworCQorCS8qIGluaXRpYWxpemUgY29kZWMgcmVnaXN0ZXJzICovCisJcy0+Y3RybCA9IDA7CisKKwkvKiBDaGVjayBhbXBsaWZpZXIgcmVxdWlyZW1lbnRzICovCisJCisJaWYgKGFtcGxpZmllcltkZXZpbmRleF0pCisJCXMtPmN0cmwgfD0gQ1RSTF9HUElPX09VVDA7CisJZWxzZSBmb3IoaWR4ID0gMDsgYW1wbGlmaWVyX25lZWRlZFtpZHhdLnN2aWQgIT0gUENJX0FOWV9JRDsgaWR4KyspCisJeworCQlpZihwY2lkZXYtPnN1YnN5c3RlbV92ZW5kb3IgPT0gYW1wbGlmaWVyX25lZWRlZFtpZHhdLnN2aWQgJiYKKwkJICAgcGNpZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IGFtcGxpZmllcl9uZWVkZWRbaWR4XS5zZGlkKQorCQl7CisgICAgICAgICAgICAgICAgICAgIAlzLT5jdHJsIHw9IENUUkxfR1BJT19PVVQwOyAgIC8qIHR1cm4gaW50ZXJuYWwgYW1wbGlmaWVyIG9uICovCisgICAgICAgICAgICAgICAgICAgIAlwcmludGsoS0VSTl9JTkZPIFBGWCAiRW5hYmxpbmcgaW50ZXJuYWwgYW1wbGlmaWVyLlxuIik7CisJCX0KKwl9CisKKwlmb3IgKGdwaW8gPSAweDIxODsgZ3BpbyA+PSAweDIwMDsgZ3BpbyAtPSAweDA4KQorCQlpZiAocmVxdWVzdF9yZWdpb24oZ3BpbywgSk9ZX0VYVEVOVCwgImVzMTM3MSIpKQorCQkJYnJlYWs7CisKKwlpZiAoZ3BpbyA8IDB4MjAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIGZyZWUgam95c3RpY2sgYWRkcmVzcyBmb3VuZFxuIik7CisJfSBlbHNlIGlmICghKHMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImNhbiBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBnYW1lcG9ydFxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQpOworCX0gZWxzZSB7CisJCWdhbWVwb3J0X3NldF9uYW1lKGdwLCAiRVNTMTM3MSBHYW1lcG9ydCIpOworCQlnYW1lcG9ydF9zZXRfcGh5cyhncCwgImlzYSUwNHgvZ2FtZXBvcnQwIiwgZ3Bpbyk7CisJCWdwLT5kZXYucGFyZW50ID0gJnMtPmRldi0+ZGV2OworCQlncC0+aW8gPSBncGlvOworCQlzLT5jdHJsIHw9IENUUkxfSllTVEtfRU4gfCAoKChncGlvID4+IDMpICYgQ1RSTF9KT1lfTUFTSykgPDwgQ1RSTF9KT1lfU0hJRlQpOworCX0KKworCXMtPnNjdHJsID0gMDsKKwljc3NyID0gMDsKKwlzLT5zcGRpZl92b2x1bWUgPSAtMTsKKwkvKiBjaGVjayB0byBzZWUgaWYgcy9wZGlmIG1vZGUgaXMgYmVpbmcgcmVxdWVzdGVkICovCisJaWYgKHNwZGlmW2RldmluZGV4XSkgeworCQlpZiAocy0+cmV2ID49IDQpIHsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJlbmFibGluZyBTL1BESUYgb3V0cHV0XG4iKTsKKwkJCXMtPnNwZGlmX3ZvbHVtZSA9IDA7CisJCQljc3NyIHw9IFNUQVRfRU5fU1BESUY7CisJCQlzLT5jdHJsIHw9IENUUkxfU1BESUZFTl9COworCQkJaWYgKG5vbWl4W2RldmluZGV4XSkgLyogZG9uJ3QgbWl4IGFuYWxvZyBpbnB1dHMgdG8gcy9wZGlmIG91dHB1dCAqLworCQkJCXMtPmN0cmwgfD0gQ1RSTF9SRUNFTl9COworCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAicmV2aXNpb24gJWQgZG9lcyBub3Qgc3VwcG9ydCBTL1BESUZcbiIsIHMtPnJldik7CisJCX0KKwl9CisJLyogaW5pdGlhbGl6ZSB0aGUgY2hpcHMgKi8KKwlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJb3V0bChzLT5zY3RybCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7CisJb3V0bChMRUdBQ1lfSkZBU1QsIHMtPmlvK0VTMTM3MV9SRUdfTEVHQUNZKTsKKwlwY2lfc2V0X21hc3RlcihwY2lkZXYpOyAgLyogZW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KKwkvKiBpZiB3ZSBhcmUgYSA1ODgwIHR1cm4gb24gdGhlIEFDOTcgKi8KKwlpZiAocy0+dmVuZG9yID09IFBDSV9WRU5ET1JfSURfRU5TT05JUSAmJgorCSAgICAoKHMtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfQ1Q1ODgwICYmIHMtPnJldiA+PSBDVDU4ODBSRVZfQ1Q1ODgwX0MpIHx8IAorCSAgICAgKHMtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxICYmIHMtPnJldiA9PSBFUzEzNzFSRVZfQ1Q1ODgwX0EpIHx8IAorCSAgICAgKHMtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0VOU09OSVFfRVMxMzcxICYmIHMtPnJldiA9PSBFUzEzNzFSRVZfRVMxMzczXzgpKSkgeyAKKwkJY3NzciB8PSBDU1RBVF81ODgwX0FDOTdfUlNUOworCQlvdXRsKGNzc3IsIHMtPmlvK0VTMTM3MV9SRUdfU1RBVFVTKTsKKwkJLyogbmVlZCB0byBkZWxheSBhcm91bmQgMjBtcyhibGVlY2gpIHRvIGdpdmUKKwkJICAgc29tZSBDT0RFQ3MgZW5vdWdoIHRpbWUgdG8gd2FrZXVwICovCisJCXRtbyA9IGppZmZpZXMgKyAoSFogLyA1MCkgKyAxOworCQlmb3IgKDs7KSB7CisJCQl0bW8yID0gdG1vIC0gamlmZmllczsKKwkJCWlmICh0bW8yIDw9IDApCisJCQkJYnJlYWs7CisJCQlzY2hlZHVsZV90aW1lb3V0KHRtbzIpOworCQl9CisJfQorCS8qIEFDOTcgd2FybSByZXNldCB0byBzdGFydCB0aGUgYml0Y2xrICovCisJb3V0bChzLT5jdHJsIHwgQ1RSTF9TWU5DUkVTLCBzLT5pbytFUzEzNzFfUkVHX0NPTlRST0wpOworCXVkZWxheSgyKTsKKwlvdXRsKHMtPmN0cmwsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7CisJLyogaW5pdCB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVyICovCisJc3JjX2luaXQocyk7CisJLyogY29kZWMgaW5pdCAqLworCWlmICghYWM5N19wcm9iZV9jb2RlYyhzLT5jb2RlYykpIHsKKwkJcmVzID0gLUVOT0RFVjsKKwkJZ290byBlcnJfZ3A7CisJfQorCS8qIHNldCBkZWZhdWx0IHZhbHVlcyAqLworCisJZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwl2YWwgPSBTT1VORF9NQVNLX0xJTkU7CisJbWl4ZGV2X2lvY3RsKHMtPmNvZGVjLCBTT1VORF9NSVhFUl9XUklURV9SRUNTUkMsICh1bnNpZ25lZCBsb25nKSZ2YWwpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaW5pdHZvbCkvc2l6ZW9mKGluaXR2b2xbMF0pOyBpKyspIHsKKwkJdmFsID0gaW5pdHZvbFtpXS52b2w7CisJCW1peGRldl9pb2N0bChzLT5jb2RlYywgaW5pdHZvbFtpXS5taXhjaCwgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJfQorCS8qIG11dGUgbWFzdGVyIGFuZCBQQ00gd2hlbiBpbiBTL1BESUYgbW9kZSAqLworCWlmIChzLT5zcGRpZl92b2x1bWUgIT0gLTEpIHsKKwkJdmFsID0gMHgwMDAwOworCQlzLT5jb2RlYy0+bWl4ZXJfaW9jdGwocy0+Y29kZWMsIFNPVU5EX01JWEVSX1dSSVRFX1ZPTFVNRSwgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisJCXMtPmNvZGVjLT5taXhlcl9pb2N0bChzLT5jb2RlYywgU09VTkRfTUlYRVJfV1JJVEVfUENNLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwl9CisJc2V0X2ZzKGZzKTsKKwkvKiB0dXJuIG9uIFMvUERJRiBvdXRwdXQgZHJpdmVyIGlmIHJlcXVlc3RlZCAqLworCW91dGwoY3Nzciwgcy0+aW8rRVMxMzcxX1JFR19TVEFUVVMpOworCisJLyogcmVnaXN0ZXIgZ2FtZXBvcnQgKi8KKwlpZiAocy0+Z2FtZXBvcnQpCisJCWdhbWVwb3J0X3JlZ2lzdGVyX3BvcnQocy0+Z2FtZXBvcnQpOworCisJLyogc3RvcmUgaXQgaW4gdGhlIGRyaXZlciBmaWVsZCAqLworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHMpOworCS8qIHB1dCBpdCBpbnRvIGRyaXZlciBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmcy0+ZGV2cywgJmRldnMpOworCS8qIGluY3JlbWVudCBkZXZpbmRleCAqLworCWlmIChkZXZpbmRleCA8IE5SX0RFVklDRS0xKQorCQlkZXZpbmRleCsrOworICAgICAgIAlyZXR1cm4gMDsKKworIGVycl9ncDoKKwlpZiAocy0+Z2FtZXBvcnQpIHsKKwkJcmVsZWFzZV9yZWdpb24ocy0+Z2FtZXBvcnQtPmlvLCBKT1lfRVhURU5UKTsKKwkJZ2FtZXBvcnRfZnJlZV9wb3J0KHMtPmdhbWVwb3J0KTsKKwl9CisjaWZkZWYgRVMxMzcxX0RFQlVHCisJaWYgKHMtPnBzKQorCQlyZW1vdmVfcHJvY19lbnRyeSgiZXMxMzcxIiwgTlVMTCk7CisjZW5kaWYKKwl1bnJlZ2lzdGVyX3NvdW5kX21pZGkocy0+ZGV2X21pZGkpOworIGVycl9kZXY0OgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9kYWMpOworIGVycl9kZXYzOgorCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+Y29kZWMtPmRldl9taXhlcik7CisgZXJyX2RldjI6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKyBlcnJfZGV2MToKKwlwcmludGsoS0VSTl9FUlIgUEZYICJjYW5ub3QgcmVnaXN0ZXIgbWlzYyBkZXZpY2VcbiIpOworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisgZXJyX2lycToKKwlyZWxlYXNlX3JlZ2lvbihzLT5pbywgRVMxMzcxX0VYVEVOVCk7CisgZXJyX3JlZ2lvbjoKKyBlcnJfY29kZWM6CisJYWM5N19yZWxlYXNlX2NvZGVjKHMtPmNvZGVjKTsKKwlrZnJlZShzKTsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBfX2RldmV4aXQgZXMxMzcxX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBlczEzNzFfc3RhdGUgKnMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghcykKKwkJcmV0dXJuOworCWxpc3RfZGVsKCZzLT5kZXZzKTsKKyNpZmRlZiBFUzEzNzFfREVCVUcKKwlpZiAocy0+cHMpCisJCXJlbW92ZV9wcm9jX2VudHJ5KCJlczEzNzEiLCBOVUxMKTsKKyNlbmRpZiAvKiBFUzEzNzFfREVCVUcgKi8KKwlvdXRsKDAsIHMtPmlvK0VTMTM3MV9SRUdfQ09OVFJPTCk7IC8qIHN3aXRjaCBldmVyeXRoaW5nIG9mZiAqLworCW91dGwoMCwgcy0+aW8rRVMxMzcxX1JFR19TRVJJQUxfQ09OVFJPTCk7IC8qIGNsZWFyIHNlcmlhbCBpbnRlcnJ1cHRzICovCisJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJZnJlZV9pcnEocy0+aXJxLCBzKTsKKwlpZiAocy0+Z2FtZXBvcnQpIHsKKwkJaW50IGdwaW8gPSBzLT5nYW1lcG9ydC0+aW87CisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIEpPWV9FWFRFTlQpOworCX0KKwlyZWxlYXNlX3JlZ2lvbihzLT5pbywgRVMxMzcxX0VYVEVOVCk7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLT5kZXZfbWl4ZXIpOworCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9kYWMpOworCXVucmVnaXN0ZXJfc291bmRfbWlkaShzLT5kZXZfbWlkaSk7CisJYWM5N19yZWxlYXNlX2NvZGVjKHMtPmNvZGVjKTsKKwlrZnJlZShzKTsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0VOU09OSVEsIFBDSV9ERVZJQ0VfSURfRU5TT05JUV9FUzEzNzEsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKwl7IFBDSV9WRU5ET1JfSURfRU5TT05JUSwgUENJX0RFVklDRV9JRF9FTlNPTklRX0NUNTg4MCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCB9LAorCXsgUENJX1ZFTkRPUl9JRF9FQ1RJVkEsIFBDSV9ERVZJQ0VfSURfRUNUSVZBX0VWMTkzOCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGVzMTM3MV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gImVzMTM3MSIsCisJLmlkX3RhYmxlCT0gaWRfdGFibGUsCisJLnByb2JlCQk9IGVzMTM3MV9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGVzMTM3MV9yZW1vdmUpLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9lczEzNzEodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAidmVyc2lvbiB2MC4zMiB0aW1lICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJmVzMTM3MV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9lczEzNzEodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAidW5sb2FkaW5nXG4iKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmVzMTM3MV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X2VzMTM3MSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2VzMTM3MSk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE1PRFVMRQorCisvKiBmb3JtYXQgaXM6IGVzMTM3MT1bc3BkaWYsW25vbWl4LFthbXBsaWZpZXJdXV0gKi8KKworc3RhdGljIGludCBfX2luaXQgZXMxMzcxX3NldHVwKGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgdW5zaWduZWQgX19pbml0ZGF0YSBucl9kZXYgPSAwOworCisJaWYgKG5yX2RldiA+PSBOUl9ERVZJQ0UpCisJCXJldHVybiAwOworCisJKHZvaWQpCisgICAgICAgICgoZ2V0X29wdGlvbigmc3RyLCAmc3BkaWZbbnJfZGV2XSkgPT0gMikKKyAgICAgICAgICYmIChnZXRfb3B0aW9uKCZzdHIsICZub21peFtucl9kZXZdKSA9PSAyKQorICAgICAgICAgJiYgKGdldF9vcHRpb24oJnN0ciwgJmFtcGxpZmllcltucl9kZXZdKSkpOworCisJbnJfZGV2Kys7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImVzMTM3MT0iLCBlczEzNzFfc2V0dXApOworCisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZXNzc29sbzEuYyBiL3NvdW5kL29zcy9lc3Nzb2xvMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiM2I5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZXNzc29sbzEuYwpAQCAtMCwwICsxLDI0OTcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgICBlc3Nzb2xvMS5jICAtLSAgRVNTIFRlY2hub2xvZ3kgU29sbzEgKEVTMTk0NikgYXVkaW8gZHJpdmVyLgorICoKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDEsIDIwMDMgIFRob21hcyBTYWlsZXIgKHQuc2FpbGVyQGFsdW1uaS5ldGh6LmNoKQorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBNb2R1bGUgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnM6CisgKiAgIG5vbmUgc28gZmFyCisgKgorICogIFN1cHBvcnRlZCBkZXZpY2VzOgorICogIC9kZXYvZHNwICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21peGVyICBzdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21pZGkgICBzaW1wbGUgTUlESSBVQVJUIGludGVyZmFjZSwgbm8gaW9jdGwKKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMTAuMTEuMTk5OCAgIDAuMSAgIEluaXRpYWwgcmVsZWFzZSAod2l0aG91dCBhbnkgaGFyZHdhcmUpCisgKiAgICAyMi4wMy4xOTk5ICAgMC4yICAgY2luZm8uYmxvY2tzIHNob3VsZCBiZSByZXNldCBhZnRlciBHRVR4UFRSIGlvY3RsLgorICogICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEpvaGFuIE1hZXMgPGpvbWFAdGVsaW5kdXMuYmU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVBR0FJTiBpbnN0ZWFkIG9mIEVCVVNZIHdoZW4gT19OT05CTE9DSworICogICAgICAgICAgICAgICAgICAgICAgIHJlYWQvd3JpdGUgY2Fubm90IGJlIGV4ZWN1dGVkCisgKiAgICAwNy4wNC4xOTk5ICAgMC4zICAgaW1wbGVtZW50ZWQgdGhlIGZvbGxvd2luZyBpb2N0bCdzOiBTT1VORF9QQ01fUkVBRF9SQVRFLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUywgU09VTkRfUENNX1JFQURfQklUUzsgCisgKiAgICAgICAgICAgICAgICAgICAgICAgQWxwaGEgZml4ZXMgcmVwb3J0ZWQgYnkgUGV0ZXIgSm9uZXMgPHBqb25lc0ByZWRoYXQuY29tPgorICogICAgMTUuMDYuMTk5OSAgIDAuNCAgIEZpeCBiYWQgYWxsb2NhdGlvbiBidWcuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVGhhbmtzIHRvIERldGkgRmxpZWdsIDxmbGllZ2xAaW4udHVtLmRlPgorICogICAgMjguMDYuMTk5OSAgIDAuNSAgIEFkZCBwY2lfc2V0X21hc3RlcgorICogICAgMTIuMDguMTk5OSAgIDAuNiAgIEZpeCBNSURJIFVBUlQgY3Jhc2hpbmcgdGhlIGRyaXZlcgorICogICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWQgbWl4ZXIgc2VtYW50aWNzIGZyb20gT1NTIGRvY3VtZW50ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvdXIgdG8gT1NTICJjb2RlIGJlaGF2aW91ciIuCisgKiAgICAgICAgICAgICAgICAgICAgICAgUmVjb3JkaW5nIG1pZ2h0IGFjdHVhbGx5IHdvcmsgbm93LgorICogICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWFsIERETUEgY29udHJvbGxlciBhZGRyZXNzIHJlZ2lzdGVyIGlzIGF0IFBDSSBjb25maWcKKyAqICAgICAgICAgICAgICAgICAgICAgICAweDYwLCB3aGlsZSB0aGUgcmVnaXN0ZXIgYXQgMHgxOCBpcyB1c2VkIGFzIGEgcGxhY2Vob2xkZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBmb3IgQklPUyBhZGRyZXNzIGFsbG9jYXRpb24uIFRoaXMgcmVnaXN0ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICBpcyBzdXBwb3NlZCB0byBiZSBjb3BpZWQgaW50byAweDYwLCBhY2NvcmRpbmcKKyAqICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgU29sbzEgZGF0YXNoZWV0LiBXaGVuIEkgZG8gdGhhdCwgSSBjYW4gYWNjZXNzCisgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIERETUEgcmVnaXN0ZXJzIGV4Y2VwdCB0aGUgbWFzayBiaXQsIHdoaWNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgaXMgc3R1Y2sgYXQgMS4gV2hlbiBJIGNvcHkgdGhlIGNvbnRlbnRzIG9mIDB4MTggKzB4MTAKKyAqICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgRERNQSBiYXNlIHJlZ2lzdGVyLCBldmVyeXRoaW5nIHNlZW1zIHRvIHdvcmsuCisgKiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGZ1biBwYXJ0IGlzIHRoYXQgdGhlIFdpbmRvd3MgU29sbzEgZHJpdmVyIGRvZXNuJ3QKKyAqICAgICAgICAgICAgICAgICAgICAgICBzZWVtIHRvIGRvIHRoZXNlIHRyaWNrcy4KKyAqICAgICAgICAgICAgICAgICAgICAgICBCdWdzIHJlbWFpbmluZzogcGxvcHMgYW5kIGNsaWNrcyB3aGVuIHN0YXJ0aW5nL3N0b3BwaW5nIHBsYXliYWNrCisgKiAgICAzMS4wOC4xOTk5ICAgMC43ICAgYWRkIHNwaW5fbG9ja19pbml0CisgKiAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgY3VycmVudC0+c3RhdGUgPSB4IHdpdGggc2V0X2N1cnJlbnRfc3RhdGUoeCkKKyAqICAgIDAzLjA5LjE5OTkgICAwLjggICBjaGFuZ2UgcmVhZCBzZW1hbnRpY3MgZm9yIE1JREkgdG8gbWF0Y2gKKyAqICAgICAgICAgICAgICAgICAgICAgICBPU1MgbW9yZSBjbG9zZWx5OyByZW1vdmUgcG9zc2libGUgd2FrZXVwIHJhY2UKKyAqICAgIDA3LjEwLjE5OTkgICAwLjkgICBGaXggaW5pdGlhbGl6YXRpb247IGNvbXBsYWluIGlmIHNlcXVlbmNlciB3cml0ZXMgdGltZSBvdXQKKyAqICAgICAgICAgICAgICAgICAgICAgICBSZXZpc2VkIHJlc291cmNlIGdyYWJiaW5nIGZvciB0aGUgRk0gc3ludGhlc2l6ZXIKKyAqICAgIDI4LjEwLjE5OTkgICAwLjEwICBNb3JlIHdhaXRxdWV1ZSByYWNlcyBmaXhlZAorICogICAgMDkuMTIuMTk5OSAgIDAuMTEgIFdvcmsgYXJvdW5kIHN0dXBpZCBBbHBoYSBwb3J0IGlzc3VlICh2aXJ0X3RvX2J1cyhrbWFsbG9jKEdGUF9ETUEpKSA+IDE2TSkKKyAqICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxpbmcgcmVjb3JkaW5nIG9uIEFscGhhCisgKiAgICAxMi4wMS4yMDAwICAgMC4xMiAgUHJldmVudCBzb21lIGlvY3RsJ3MgZnJvbSByZXR1cm5pbmcgYmFkIGNvdW50IHZhbHVlcyBvbiB1bmRlcnJ1bi9vdmVycnVuOworICogICAgICAgICAgICAgICAgICAgICAgIFRpbSBKYW5paydzIEJTRSAoQmVkZXZpbGxlZCBTb3VuZCBFbmdpbmUpIGZvdW5kIHRoaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ3JhdGVkIChha2EgcmVkaWQgOC0pKSBBUE0gc3VwcG9ydCBwYXRjaCBieSBaYWNoIEJyb3duCisgKiAgICAwNy4wMi4yMDAwICAgMC4xMyAgVXNlIHBjaV9hbGxvY19jb25zaXN0ZW50IGFuZCBwY2lfcmVnaXN0ZXJfZHJpdmVyCisgKiAgICAxOS4wMi4yMDAwICAgMC4xNCAgVXNlIHBjaV9kbWFfc3VwcG9ydGVkIHRvIGRldGVybWluZSBpZiByZWNvcmRpbmcgc2hvdWxkIGJlIGRpc2FibGVkCisgKiAgICAxMy4wMy4yMDAwICAgMC4xNSAgUmVpbnRyb2R1Y2UgaW5pdGlhbGl6YXRpb24gb2YgYSBjb3VwbGUgb2YgUENJIGNvbmZpZyBzcGFjZSByZWdpc3RlcnMKKyAqICAgIDIxLjExLjIwMDAgICAwLjE2ICBJbml0aWFsaXplIGRtYSBidWZmZXJzIGluIHBvbGwsIG90aGVyd2lzZSBwb2xsIG1heSByZXR1cm4gYSBib2d1cyBtYXNrCisgKiAgICAxMi4xMi4yMDAwICAgMC4xNyAgTW9yZSBkbWEgYnVmZmVyIGluaXRpYWxpemF0aW9ucywgcGF0Y2ggZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgIFRqZWVyZCBNdWxkZXIgPHRqZWVyZC5tdWxkZXJAZnVqaXRzdS1zaWVtZW5zLmNvbT4KKyAqICAgIDMxLjAxLjIwMDEgICAwLjE4ICBSZWdpc3Rlci9VbnJlZ2lzdGVyIGdhbWVwb3J0LCBvcmlnaW5hbCBwYXRjaCBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgTmF0aGFuaWVsIERhdyA8ZGF3QGNzLmNtdS5lZHU+CisgKiAgICAgICAgICAgICAgICAgICAgICAgRml4IFNFVFRSSUdHRVIgbm9uIE9TUyBBUEkgY29uZm9ybWl0eQorICogICAgMTAuMDMuMjAwMSAgICAgICAgIHByb3ZpZGUgYWJzIGZ1bmN0aW9uLCBwcmV2ZW50IHBpY2tpbmcgdXAgYSBib2d1cyBrZXJuZWwgbWFjcm8KKyAqICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWJzLiBCdWcgcmVwb3J0IGJ5IEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4KKyAqICAgIDE1LjA1LjIwMDEgICAgICAgICBwY2lfZW5hYmxlX2RldmljZSBtb3ZlZCwgcmV0dXJuIHZhbHVlcyBpbiBwcm9iZSBjbGVhbmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgdXAuIE1hcmN1cyBNZWlzc25lciA8bW1AY2FsZGVyYS5kZT4KKyAqICAgIDIyLjA1LjIwMDEgICAwLjE5ICBtb3JlIGNsZWFudXBzLCBjaGFuZ2VkIFBNIHRvIFBDSSAyLjQgc3R5bGUsIGdvdCByaWQKKyAqICAgICAgICAgICAgICAgICAgICAgICBvZiBnbG9iYWwgbGlzdCBvZiBkZXZpY2VzLCB1c2luZyBwY2kgZGV2aWNlIGRhdGEuCisgKiAgICAgICAgICAgICAgICAgICAgICAgTWFyY3VzIE1laXNzbmVyIDxtbUBjYWxkZXJhLmRlPgorICogICAgMDMuMDEuMjAwMyAgIDAuMjAgIG9wZW5fbW9kZSBmaXhlcyBmcm9tIEdlb3JnIEFjaGVyIDxhY2hlckBpbi50dW0uZGU+CisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgCisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvd2FpdC5oPgorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZG0uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyN1bmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9FU1MKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9FU1MgICAgICAgICAweDEyNWQKKyNlbmRpZgorI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0VTU19TT0xPMQorI2RlZmluZSBQQ0lfREVWSUNFX0lEX0VTU19TT0xPMSAgIDB4MTk2OQorI2VuZGlmCisKKyNkZWZpbmUgU09MTzFfTUFHSUMgICgoUENJX1ZFTkRPUl9JRF9FU1M8PDE2KXxQQ0lfREVWSUNFX0lEX0VTU19TT0xPMSkKKworI2RlZmluZSBERE1BQkFTRV9PRkZTRVQgICAgICAgICAgIDAgICAgLyogY2hpcCBidWcgd29ya2Fyb3VuZCBrbHVkZ2UgKi8KKyNkZWZpbmUgRERNQUJBU0VfRVhURU5UICAgICAgICAgICAxNgorCisjZGVmaW5lIElPQkFTRV9FWFRFTlQgICAgICAgICAgICAgMTYKKyNkZWZpbmUgU0JCQVNFX0VYVEVOVCAgICAgICAgICAgICAxNgorI2RlZmluZSBWQ0JBU0VfRVhURU5UICAgICAgICAgICAgIChERE1BQkFTRV9FWFRFTlQrRERNQUJBU0VfT0ZGU0VUKQorI2RlZmluZSBNUFVCQVNFX0VYVEVOVCAgICAgICAgICAgIDQKKyNkZWZpbmUgR1BCQVNFX0VYVEVOVCAgICAgICAgICAgICA0CisjZGVmaW5lIEdBTUVQT1JUX0VYVEVOVAkJICA0CisKKyNkZWZpbmUgRk1TWU5USF9FWFRFTlQgICAgICAgICAgICA0CisKKy8qIE1JREkgYnVmZmVyIHNpemVzICovCisKKyNkZWZpbmUgTUlESUlOQlVGICAyNTYKKyNkZWZpbmUgTUlESU9VVEJVRiAyNTYKKworI2RlZmluZSBGTU9ERV9NSURJX1NISUZUIDMKKyNkZWZpbmUgRk1PREVfTUlESV9SRUFEICAoRk1PREVfUkVBRCA8PCBGTU9ERV9NSURJX1NISUZUKQorI2RlZmluZSBGTU9ERV9NSURJX1dSSVRFIChGTU9ERV9XUklURSA8PCBGTU9ERV9NSURJX1NISUZUKQorCisjZGVmaW5lIEZNT0RFX0RNRk0gMHgxMAorCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgc29sbzFfZHJpdmVyOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IHNvbG8xX3N0YXRlIHsKKwkvKiBtYWdpYyAqLworCXVuc2lnbmVkIGludCBtYWdpYzsKKworCS8qIHRoZSBjb3JyZXNwb25kaW5nIHBjaV9kZXYgc3RydWN0dXJlICovCisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfYXVkaW87CisJaW50IGRldl9taXhlcjsKKwlpbnQgZGV2X21pZGk7CisJaW50IGRldl9kbWZtOworCisJLyogaGFyZHdhcmUgcmVzb3VyY2VzICovCisJdW5zaWduZWQgbG9uZyBpb2Jhc2UsIHNiYmFzZSwgdmNiYXNlLCBkZG1hYmFzZSwgbXB1YmFzZTsgLyogbG9uZyBmb3IgU1BBUkMgKi8KKwl1bnNpZ25lZCBpbnQgaXJxOworCisJLyogbWl4ZXIgcmVnaXN0ZXJzICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgc2hvcnQgdm9sWzEwXTsKKwkJdW5zaWduZWQgaW50IHJlY3NyYzsKKwkJdW5zaWduZWQgaW50IG1vZGNudDsKKwkJdW5zaWduZWQgc2hvcnQgbWljcHJlYW1wOworCX0gbWl4OworCisJLyogd2F2ZSBzdHVmZiAqLworCXVuc2lnbmVkIGZtdDsKKwl1bnNpZ25lZCBjaGFubmVsczsKKwl1bnNpZ25lZCByYXRlOworCXVuc2lnbmVkIGNoYXIgY2xrZGl2OworCXVuc2lnbmVkIGVuYTsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCW1vZGVfdCBvcGVuX21vZGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCisJc3RydWN0IGRtYWJ1ZiB7CisJCXZvaWQgKnJhd2J1ZjsKKwkJZG1hX2FkZHJfdCBkbWFhZGRyOworCQl1bnNpZ25lZCBidWZvcmRlcjsKKwkJdW5zaWduZWQgbnVtZnJhZzsKKwkJdW5zaWduZWQgZnJhZ3NoaWZ0OworCQl1bnNpZ25lZCBod3B0ciwgc3dwdHI7CisJCXVuc2lnbmVkIHRvdGFsX2J5dGVzOworCQlpbnQgY291bnQ7CisJCXVuc2lnbmVkIGVycm9yOyAvKiBvdmVyL3VuZGVycnVuICovCisJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJCS8qIHJlZHVuZGFudCwgYnV0IG1ha2VzIGNhbGN1bGF0aW9ucyBlYXNpZXIgKi8KKwkJdW5zaWduZWQgZnJhZ3NpemU7CisJCXVuc2lnbmVkIGRtYXNpemU7CisJCXVuc2lnbmVkIGZyYWdzYW1wbGVzOworCQkvKiBPU1Mgc3R1ZmYgKi8KKwkJdW5zaWduZWQgbWFwcGVkOjE7CisJCXVuc2lnbmVkIHJlYWR5OjE7CisJCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKKwkJdW5zaWduZWQgZW5hYmxlZDoxOworCQl1bnNpZ25lZCBvc3NmcmFnc2hpZnQ7CisJCWludCBvc3NtYXhmcmFnczsKKwkJdW5zaWduZWQgc3ViZGl2aXNpb247CisJfSBkbWFfZGFjLCBkbWFfYWRjOworCisJLyogbWlkaSBzdHVmZiAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGlyZCwgaXdyLCBpY250OworCQl1bnNpZ25lZCBvcmQsIG93ciwgb2NudDsKKwkJd2FpdF9xdWV1ZV9oZWFkX3QgaXdhaXQ7CisJCXdhaXRfcXVldWVfaGVhZF90IG93YWl0OworCQlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKwkJdW5zaWduZWQgY2hhciBpYnVmW01JRElJTkJVRl07CisJCXVuc2lnbmVkIGNoYXIgb2J1ZltNSURJT1VUQlVGXTsKKwl9IG1pZGk7CisKKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9zZXEoc3RydWN0IHNvbG8xX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisgICAgICAgIGludCBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiB0aGUgbG9jYWxfaXJxX3NhdmUgc3R1bnQgaXMgdG8gc2VuZCB0aGUgZGF0YSB3aXRoaW4gdGhlIGNvbW1hbmQgd2luZG93ICovCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAweGZmZmY7IGkrKykgeworCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKCEoaW5iKHMtPnNiYmFzZSsweGMpICYgMHg4MCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGIoZGF0YSwgcy0+c2JiYXNlKzB4Yyk7CisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJfQorCXByaW50ayhLRVJOX0VSUiAiZXNzc29sbzE6IHdyaXRlX3NlcSB0aW1lb3V0XG4iKTsKKwlvdXRiKGRhdGEsIHMtPnNiYmFzZSsweGMpOworfQorCitzdGF0aWMgaW5saW5lIGludCByZWFkX3NlcShzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgKmRhdGEpCit7CisgICAgICAgIGludCBpOworCisgICAgICAgIGlmICghZGF0YSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDB4ZmZmZjsgaSsrKQorICAgICAgICAgICAgICAgIGlmIChpbmIocy0+c2JiYXNlKzB4ZSkgJiAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZGF0YSA9IGluYihzLT5zYmJhc2UrMHhhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIH0KKwlwcmludGsoS0VSTl9FUlIgImVzc3NvbG8xOiByZWFkX3NlcSB0aW1lb3V0XG4iKTsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlc2V0X2N0cmwoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworICAgICAgICBpbnQgaTsKKworICAgICAgICBvdXRiKDMsIHMtPnNiYmFzZSs2KTsgLyogY2xlYXIgc2VxdWVuY2VyIGFuZCBGSUZPICovCisgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIG91dGIoMCwgcy0+c2JiYXNlKzYpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMHhmZmZmOyBpKyspCisgICAgICAgICAgICAgICAgaWYgKGluYihzLT5zYmJhc2UrMHhlKSAmIDB4ODApCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5iKHMtPnNiYmFzZSsweGEpID09IDB4YWEpIHsKKwkJCQl3cml0ZV9zZXEocywgMHhjNik7IC8qIGVudGVyIGVuaGFuY2VkIG1vZGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisJCQl9CisgICAgICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9jdHJsKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwl3cml0ZV9zZXEocywgcmVnKTsKKwl3cml0ZV9zZXEocywgZGF0YSk7Cit9CisKKyNpZiAwIC8qIHVudXNlZCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVhZF9jdHJsKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciByZWcpCit7CisgICAgICAgIHVuc2lnbmVkIGNoYXIgcjsKKworCXdyaXRlX3NlcShzLCAweGMwKTsKKwl3cml0ZV9zZXEocywgcmVnKTsKKwlyZWFkX3NlcShzLCAmcik7CisJcmV0dXJuIHI7Cit9CisjZW5kaWYgLyogdW51c2VkICovCisKK3N0YXRpYyB2b2lkIHdyaXRlX21peGVyKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciByZWcsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlvdXRiKHJlZywgcy0+c2JiYXNlKzQpOworCW91dGIoZGF0YSwgcy0+c2JiYXNlKzUpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciByZWFkX21peGVyKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciByZWcpCit7CisJb3V0YihyZWcsIHMtPnNiYmFzZSs0KTsKKwlyZXR1cm4gaW5iKHMtPnNiYmFzZSs1KTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbGQyKHVuc2lnbmVkIGludCB4KQoreworCXVuc2lnbmVkIHIgPSAwOworCQorCWlmICh4ID49IDB4MTAwMDApIHsKKwkJeCA+Pj0gMTY7CisJCXIgKz0gMTY7CisJfQorCWlmICh4ID49IDB4MTAwKSB7CisJCXggPj49IDg7CisJCXIgKz0gODsKKwl9CisJaWYgKHggPj0gMHgxMCkgeworCQl4ID4+PSA0OworCQlyICs9IDQ7CisJfQorCWlmICh4ID49IDQpIHsKKwkJeCA+Pj0gMjsKKwkJciArPSAyOworCX0KKwlpZiAoeCA+PSAyKQorCQlyKys7CisJcmV0dXJuIHI7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9kYWMoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmVuYSAmPSB+Rk1PREVfV1JJVEU7CisJd3JpdGVfbWl4ZXIocywgMHg3OCwgMHgxMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPmVuYSAmIEZNT0RFX1dSSVRFKSAmJiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwgcy0+ZG1hX2RhYy5jb3VudCA+IDApICYmIHMtPmRtYV9kYWMucmVhZHkpIHsKKwkJcy0+ZW5hIHw9IEZNT0RFX1dSSVRFOworCQl3cml0ZV9taXhlcihzLCAweDc4LCAweDEyKTsKKwkJdWRlbGF5KDEwKTsKKwkJd3JpdGVfbWl4ZXIocywgMHg3OCwgMHgxMyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdG9wX2FkYyhzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+ZW5hICY9IH5GTU9ERV9SRUFEOworCXdyaXRlX2N0cmwocywgMHhiOCwgMHhlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJaWYgKCEocy0+ZW5hICYgRk1PREVfUkVBRCkgJiYgKHMtPmRtYV9hZGMubWFwcGVkIHx8IHMtPmRtYV9hZGMuY291bnQgPCAoc2lnbmVkKShzLT5kbWFfYWRjLmRtYXNpemUgLSAyKnMtPmRtYV9hZGMuZnJhZ3NpemUpKQorCSAgICAmJiBzLT5kbWFfYWRjLnJlYWR5KSB7CisJCXMtPmVuYSB8PSBGTU9ERV9SRUFEOworCQl3cml0ZV9jdHJsKHMsIDB4YjgsIDB4Zik7CisjaWYgMAorCQlwcmludGsoS0VSTl9ERUJVRyAic29sbzE6IERNQWJ1ZmZlcjogMHglMDhseFxuIiwgKGxvbmcpcy0+ZG1hX2FkYy5yYXdidWYpOworCQlwcmludGsoS0VSTl9ERUJVRyAic29sbzE6IERNQTogbWFzazogMHglMDJ4IGNudDogMHglMDR4IGFkZHI6IDB4JTA4eCAgc3RhdDogMHglMDJ4XG4iLCAKKwkJICAgICAgIGluYihzLT5kZG1hYmFzZSsweGYpLCBpbncocy0+ZGRtYWJhc2UrNCksIGlubChzLT5kZG1hYmFzZSksIGluYihzLT5kZG1hYmFzZSs4KSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBvdXRiKDAsIHMtPmRkbWFiYXNlKzB4ZCk7IC8qIG1hc3RlciByZXNldCAqLworCQlvdXRiKDEsIHMtPmRkbWFiYXNlKzB4Zik7ICAvKiBtYXNrICovCisJCW91dGIoMHg1NC8qMHgxNCovLCBzLT5kZG1hYmFzZSsweGIpOyAgLyogRE1BX01PREVfUkVBRCB8IERNQV9NT0RFX0FVVE9JTklUICovCisJCW91dGwodmlydF90b19idXMocy0+ZG1hX2FkYy5yYXdidWYpLCBzLT5kZG1hYmFzZSk7CisJCW91dHcocy0+ZG1hX2FkYy5kbWFzaXplLTEsIHMtPmRkbWFiYXNlKzQpOworCQlvdXRiKDAsIHMtPmRkbWFiYXNlKzB4Zik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xOiBzdGFydCBETUE6IHJlZyBCODogMHglMDJ4ICBTQnN0YXQ6IDB4JTAyeFxuIgorCSAgICAgICBLRVJOX0RFQlVHICJzb2xvMTogRE1BOiBzdGF0OiAweCUwMnggIGNudDogMHglMDR4ICBtYXNrOiAweCUwMnhcbiIsIAorCSAgICAgICByZWFkX2N0cmwocywgMHhiOCksIGluYihzLT5zYmJhc2UrMHhjKSwgCisJICAgICAgIGluYihzLT5kZG1hYmFzZSs4KSwgaW53KHMtPmRkbWFiYXNlKzQpLCBpbmIocy0+ZGRtYWJhc2UrMHhmKSk7CisJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xOiBBMTogMHglMDJ4ICBBMjogMHglMDJ4ICBBNDogMHglMDJ4ICBBNTogMHglMDJ4ICBBODogMHglMDJ4XG4iICAKKwkgICAgICAgS0VSTl9ERUJVRyAic29sbzE6IEIxOiAweCUwMnggIEIyOiAweCUwMnggIEI0OiAweCUwMnggIEI3OiAweCUwMnggIEI4OiAweCUwMnggIEI5OiAweCUwMnhcbiIsCisJICAgICAgIHJlYWRfY3RybChzLCAweGExKSwgcmVhZF9jdHJsKHMsIDB4YTIpLCByZWFkX2N0cmwocywgMHhhNCksIHJlYWRfY3RybChzLCAweGE1KSwgcmVhZF9jdHJsKHMsIDB4YTgpLCAKKwkgICAgICAgcmVhZF9jdHJsKHMsIDB4YjEpLCByZWFkX2N0cmwocywgMHhiMiksIHJlYWRfY3RybChzLCAweGI0KSwgcmVhZF9jdHJsKHMsIDB4YjcpLCByZWFkX2N0cmwocywgMHhiOCksIAorCSAgICAgICByZWFkX2N0cmwocywgMHhiOSkpOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIERNQUJVRl9ERUZBVUxUT1JERVIgKDE1LVBBR0VfU0hJRlQpCisjZGVmaW5lIERNQUJVRl9NSU5PUkRFUiAxCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWlmIChkYi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIsIGRiLT5yYXdidWYsIGRiLT5kbWFhZGRyKTsKKwl9CisJZGItPnJhd2J1ZiA9IE5VTEw7CisJZGItPm1hcHBlZCA9IGRiLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IHNvbG8xX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYikKK3sKKwlpbnQgb3JkZXI7CisJdW5zaWduZWQgYnl0ZXNwZXJzZWM7CisJdW5zaWduZWQgYnVmcywgc2FtcGxlX3NoaWZ0ID0gMDsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CisKKwlkYi0+aHdwdHIgPSBkYi0+c3dwdHIgPSBkYi0+dG90YWxfYnl0ZXMgPSBkYi0+Y291bnQgPSBkYi0+ZXJyb3IgPSBkYi0+ZW5kY2xlYXJlZCA9IDA7CisJaWYgKCFkYi0+cmF3YnVmKSB7CisJCWRiLT5yZWFkeSA9IGRiLT5tYXBwZWQgPSAwOworICAgICAgICAgICAgICAgIGZvciAob3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOyBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pCisJCQlpZiAoKGRiLT5yYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBvcmRlciwgJmRiLT5kbWFhZGRyKSkpCisJCQkJYnJlYWs7CisJCWlmICghZGItPnJhd2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlkYi0+YnVmb3JkZXIgPSBvcmRlcjsKKwkJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCX0KKwlpZiAocy0+Zm10ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9VMTZfTEUpKQorCQlzYW1wbGVfc2hpZnQrKzsKKwlpZiAocy0+Y2hhbm5lbHMgPiAxKQorCQlzYW1wbGVfc2hpZnQrKzsKKwlieXRlc3BlcnNlYyA9IHMtPnJhdGUgPDwgc2FtcGxlX3NoaWZ0OworCWJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworCWlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVzcGVyc2VjKQorCQkJZGItPmZyYWdzaGlmdCA9IGxkMihieXRlc3BlcnNlYy8xMDAwKTsKKwkJZWxzZQorCQkJZGItPmZyYWdzaGlmdCA9IGRiLT5vc3NmcmFnc2hpZnQ7CisJfSBlbHNlIHsKKwkJZGItPmZyYWdzaGlmdCA9IGxkMihieXRlc3BlcnNlYy8xMDAvKGRiLT5zdWJkaXZpc2lvbiA/IGRiLT5zdWJkaXZpc2lvbiA6IDEpKTsKKwkJaWYgKGRiLT5mcmFnc2hpZnQgPCAzKQorCQkJZGItPmZyYWdzaGlmdCA9IDM7CisJfQorCWRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl9CisJZGItPmZyYWdzaXplID0gMSA8PCBkYi0+ZnJhZ3NoaWZ0OworCWlmIChkYi0+b3NzbWF4ZnJhZ3MgPj0gNCAmJiBkYi0+b3NzbWF4ZnJhZ3MgPCBkYi0+bnVtZnJhZykKKwkJZGItPm51bWZyYWcgPSBkYi0+b3NzbWF4ZnJhZ3M7CisJZGItPmZyYWdzYW1wbGVzID0gZGItPmZyYWdzaXplID4+IHNhbXBsZV9zaGlmdDsKKwlkYi0+ZG1hc2l6ZSA9IGRiLT5udW1mcmFnIDw8IGRiLT5mcmFnc2hpZnQ7CisJZGItPmVuYWJsZWQgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9hZGMoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgdmE7CisJaW50IGM7CisKKwlzdG9wX2FkYyhzKTsKKwkvKiBjaGVjayBpZiBQQ0kgaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgMjRiaXQgYnVzbWFzdGVyIERNQSAqLworCWlmIChzLT5kZXYtPmRtYV9tYXNrID4gMHhmZmZmZmYpCisJCXJldHVybiAtRUlPOworCWlmICgoYyA9IHByb2dfZG1hYnVmKHMsICZzLT5kbWFfYWRjKSkpCisJCXJldHVybiBjOworCXZhID0gcy0+ZG1hX2FkYy5kbWFhZGRyOworCWlmICgodmEgJiB+KCgxPDwyNCktMSkpKQorCQlwYW5pYygic29sbzE6IGJ1ZmZlciBhYm92ZSAxNk0gYm91bmRhcnkiKTsKKwlvdXRiKDAsIHMtPmRkbWFiYXNlKzB4ZCk7ICAvKiBjbGVhciAqLworCW91dGIoMSwgcy0+ZGRtYWJhc2UrMHhmKTsgLyogbWFzayAqLworCS8qb3V0YigwLCBzLT5kZG1hYmFzZSs4KTsqLyAgLyogZW5hYmxlIChlbmFibGUgaXMgYWN0aXZlIGxvdyEpICovCisJb3V0YigweDU0LCBzLT5kZG1hYmFzZSsweGIpOyAgLyogRE1BX01PREVfUkVBRCB8IERNQV9NT0RFX0FVVE9JTklUICovCisJb3V0bCh2YSwgcy0+ZGRtYWJhc2UpOworCW91dHcocy0+ZG1hX2FkYy5kbWFzaXplLTEsIHMtPmRkbWFiYXNlKzQpOworCWMgPSAtIHMtPmRtYV9hZGMuZnJhZ3NhbXBsZXM7CisJd3JpdGVfY3RybChzLCAweGE0LCBjKTsKKwl3cml0ZV9jdHJsKHMsIDB4YTUsIGMgPj4gOCk7CisJb3V0YigwLCBzLT5kZG1hYmFzZSsweGYpOworCXMtPmRtYV9hZGMucmVhZHkgPSAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9kYWMoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgdmE7CisJaW50IGM7CisKKwlzdG9wX2RhYyhzKTsKKwlpZiAoKGMgPSBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2RhYykpKQorCQlyZXR1cm4gYzsKKwltZW1zZXQocy0+ZG1hX2RhYy5yYXdidWYsIChzLT5mbXQgJiAoQUZNVF9VOCB8IEFGTVRfVTE2X0xFKSkgPyAwIDogMHg4MCwgcy0+ZG1hX2RhYy5kbWFzaXplKTsgLyogYWxtb3N0IGNvcnJlY3QgZm9yIFUxNiAqLworCXZhID0gcy0+ZG1hX2RhYy5kbWFhZGRyOworCWlmICgodmEgXiAodmEgKyBzLT5kbWFfZGFjLmRtYXNpemUgLSAxKSkgJiB+KCgxPDwyMCktMSkpCisJCXBhbmljKCJzb2xvMTogYnVmZmVyIGNyb3NzZXMgMU0gYm91bmRhcnkiKTsKKwlvdXRsKHZhLCBzLT5pb2Jhc2UpOworCS8qIHdhcm5pbmc6IHMtPmRtYV9kYWMuZG1hc2l6ZSAmIDB4ZmZmZiBtdXN0IG5vdCBiZSB6ZXJvISBpLmUuIHRoaXMgbGltaXRzIHVzIHRvIGEgMzJrIGJ1ZmZlciAqLworCW91dHcocy0+ZG1hX2RhYy5kbWFzaXplLCBzLT5pb2Jhc2UrNCk7CisJYyA9IC0gcy0+ZG1hX2RhYy5mcmFnc2FtcGxlczsKKwl3cml0ZV9taXhlcihzLCAweDc0LCBjKTsKKwl3cml0ZV9taXhlcihzLCAweDc2LCBjID4+IDgpOworCW91dGIoMHhhLCBzLT5pb2Jhc2UrNik7CisJcy0+ZG1hX2RhYy5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9hZHZhbmNlKHZvaWQgKmJ1ZiwgdW5zaWduZWQgYnNpemUsIHVuc2lnbmVkIGJwdHIsIHVuc2lnbmVkIGxlbiwgdW5zaWduZWQgY2hhciBjKQoreworCWlmIChicHRyICsgbGVuID4gYnNpemUpIHsKKwkJdW5zaWduZWQgeCA9IGJzaXplIC0gYnB0cjsKKwkJbWVtc2V0KCgoY2hhciAqKWJ1ZikgKyBicHRyLCBjLCB4KTsKKwkJYnB0ciA9IDA7CisJCWxlbiAtPSB4OworCX0KKwltZW1zZXQoKChjaGFyICopYnVmKSArIGJwdHIsIGMsIGxlbik7Cit9CisKKy8qIGNhbGwgd2l0aCBzcGlubG9jayBoZWxkISAqLworCitzdGF0aWMgdm9pZCBzb2xvMV91cGRhdGVfcHRyKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcykKK3sKKwlpbnQgZGlmZjsKKwl1bnNpZ25lZCBod3B0cjsKKworCS8qIHVwZGF0ZSBBREMgcG9pbnRlciAqLworCWlmIChzLT5lbmEgJiBGTU9ERV9SRUFEKSB7CisJCWh3cHRyID0gKHMtPmRtYV9hZGMuZG1hc2l6ZSAtIDEgLSBpbncocy0+ZGRtYWJhc2UrNCkpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworICAgICAgICAgICAgICAgIGRpZmYgPSAocy0+ZG1hX2FkYy5kbWFzaXplICsgaHdwdHIgLSBzLT5kbWFfYWRjLmh3cHRyKSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKyAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLmh3cHRyID0gaHdwdHI7CisJCXMtPmRtYV9hZGMudG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJcy0+ZG1hX2FkYy5jb3VudCArPSBkaWZmOworI2lmIDAKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xOiByZDogaHdwdHIgJXUgc3dwdHIgJXUgZG1hc2l6ZSAldSBjb3VudCAldVxuIiwKKwkJICAgICAgIHMtPmRtYV9hZGMuaHdwdHIsIHMtPmRtYV9hZGMuc3dwdHIsIHMtPmRtYV9hZGMuZG1hc2l6ZSwgcy0+ZG1hX2FkYy5jb3VudCk7CisjZW5kaWYKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2FkYy53YWl0KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID4gKHNpZ25lZCkocy0+ZG1hX2FkYy5kbWFzaXplIC0gKCgzICogcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgPj4gMSkpKSB7CisJCQkJcy0+ZW5hICY9IH5GTU9ERV9SRUFEOworCQkJCXdyaXRlX2N0cmwocywgMHhiOCwgMHhlKTsKKwkJCQlzLT5kbWFfYWRjLmVycm9yKys7CisJCQl9CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IDApCisJCQkJd2FrZV91cCgmcy0+ZG1hX2FkYy53YWl0KTsKKwkJfQorCX0KKwkvKiB1cGRhdGUgREFDIHBvaW50ZXIgKi8KKwlpZiAocy0+ZW5hICYgRk1PREVfV1JJVEUpIHsKKyAgICAgICAgICAgICAgICBod3B0ciA9IChzLT5kbWFfZGFjLmRtYXNpemUgLSBpbncocy0+aW9iYXNlKzQpKSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKyAgICAgICAgICAgICAgICBkaWZmID0gKHMtPmRtYV9kYWMuZG1hc2l6ZSArIGh3cHRyIC0gcy0+ZG1hX2RhYy5od3B0cikgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5od3B0ciA9IGh3cHRyOworCQlzLT5kbWFfZGFjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisjaWYgMAorCQlwcmludGsoS0VSTl9ERUJVRyAic29sbzE6IHdyOiBod3B0ciAldSBzd3B0ciAldSBkbWFzaXplICV1IGNvdW50ICV1XG4iLAorCQkgICAgICAgcy0+ZG1hX2RhYy5od3B0ciwgcy0+ZG1hX2RhYy5zd3B0ciwgcy0+ZG1hX2RhYy5kbWFzaXplLCBzLT5kbWFfZGFjLmNvdW50KTsKKyNlbmRpZgorCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgKz0gZGlmZjsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZzLT5kbWFfZGFjLndhaXQpOworCQl9IGVsc2UgeworCQkJcy0+ZG1hX2RhYy5jb3VudCAtPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPD0gMCkgeworCQkJCXMtPmVuYSAmPSB+Rk1PREVfV1JJVEU7CisJCQkJd3JpdGVfbWl4ZXIocywgMHg3OCwgMHgxMik7CisJCQkJcy0+ZG1hX2RhYy5lcnJvcisrOworCQkJfSBlbHNlIGlmIChzLT5kbWFfZGFjLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSAmJiAhcy0+ZG1hX2RhYy5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzLT5kbWFfZGFjLnJhd2J1Ziwgcy0+ZG1hX2RhYy5kbWFzaXplLCBzLT5kbWFfZGFjLnN3cHRyLAorCQkJCQkgICAgICBzLT5kbWFfZGFjLmZyYWdzaXplLCAocy0+Zm10ICYgKEFGTVRfVTggfCBBRk1UX1UxNl9MRSkpID8gMCA6IDB4ODApOworCQkJCXMtPmRtYV9kYWMuZW5kY2xlYXJlZCA9IDE7CisJCQl9CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA8IChzaWduZWQpcy0+ZG1hX2RhYy5kbWFzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMud2FpdCk7CisJCX0KKwl9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBwcm9nX2NvZGVjKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBmZGl2LCBmaWx0ZXI7CisJdW5zaWduZWQgY2hhciBjOworCisJcmVzZXRfY3RybChzKTsKKwl3cml0ZV9zZXEocywgMHhkMyk7CisJLyogcHJvZ3JhbSBzYW1wbGluZyByYXRlcyAqLworCWZpbHRlciA9IHMtPnJhdGUgKiA5IC8gMjA7IC8qIFNldCBmaWx0ZXIgcm9sbC1vZmYgdG8gOTAlIG9mIHJhdGUvMiAqLworCWZkaXYgPSAyNTYgLSA3MTYwMDAwIC8gKGZpbHRlciAqIDgyKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXdyaXRlX2N0cmwocywgMHhhMSwgcy0+Y2xrZGl2KTsKKwl3cml0ZV9jdHJsKHMsIDB4YTIsIGZkaXYpOworCXdyaXRlX21peGVyKHMsIDB4NzAsIHMtPmNsa2Rpdik7CisJd3JpdGVfbWl4ZXIocywgMHg3MiwgZmRpdik7CisJLyogcHJvZ3JhbSBBREMgcGFyYW1ldGVycyAqLworCXdyaXRlX2N0cmwocywgMHhiOCwgMHhlKTsKKwl3cml0ZV9jdHJsKHMsIDB4YjksIC8qMHgxKi8wKTsKKwl3cml0ZV9jdHJsKHMsIDB4YTgsIChzLT5jaGFubmVscyA+IDEpID8gMHgxMSA6IDB4MTIpOworCWMgPSAweGQwOworCWlmIChzLT5mbXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSkpCisJCWMgfD0gMHgwNDsKKwlpZiAocy0+Zm10ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9TOCkpCisJCWMgfD0gMHgyMDsKKwlpZiAocy0+Y2hhbm5lbHMgPiAxKQorCQljIF49IDB4NDg7CisJd3JpdGVfY3RybChzLCAweGI3LCAoYyAmIDB4NzApIHwgMSk7CisJd3JpdGVfY3RybChzLCAweGI3LCBjKTsKKwl3cml0ZV9jdHJsKHMsIDB4YjEsIDB4NTApOworCXdyaXRlX2N0cmwocywgMHhiMiwgMHg1MCk7CisJLyogcHJvZ3JhbSBEQUMgcGFyYW1ldGVycyAqLworCWMgPSAweDQwOworCWlmIChzLT5mbXQgJiAoQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSkpCisJCWMgfD0gMTsKKwlpZiAocy0+Zm10ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9TOCkpCisJCWMgfD0gNDsKKwlpZiAocy0+Y2hhbm5lbHMgPiAxKQorCQljIHw9IDI7CisJd3JpdGVfbWl4ZXIocywgMHg3YSwgYyk7CisJd3JpdGVfbWl4ZXIocywgMHg3OCwgMHgxMCk7CisJcy0+ZW5hID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPSBLRVJOX0NSSVQgInNvbG8xOiBpbnZhbGlkIG1hZ2ljIHZhbHVlXG4iOworCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICghKHMpIHx8IChzKS0+bWFnaWMgIT0gU09MTzFfTUFHSUMpIHsgXAorCQlwcmludGsoaW52YWxpZF9tYWdpYyk7ICAgICAgICAgICAgXAorCQlyZXR1cm4gLUVOWElPOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IG1peGVyX2lvY3RsKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcywgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtaXhlcl9zcmNbOF0gPSB7CisJCVNPVU5EX01BU0tfTUlDLCBTT1VORF9NQVNLX01JQywgU09VTkRfTUFTS19DRCwgU09VTkRfTUFTS19WT0xVTUUsCisJCVNPVU5EX01BU0tfTUlDLCAwLCBTT1VORF9NQVNLX0xJTkUsIDAKKwl9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1peHRhYmxlMVtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCQlbU09VTkRfTUlYRVJfUENNXSAgICAgPSAxLCAgIC8qIHZvaWNlICovCisJCVtTT1VORF9NSVhFUl9TWU5USF0gICA9IDIsICAgLyogRk0gKi8KKwkJW1NPVU5EX01JWEVSX0NEXSAgICAgID0gMywgICAvKiBDRCAqLworCQlbU09VTkRfTUlYRVJfTElORV0gICAgPSA0LCAgIC8qIExpbmUgKi8KKwkJW1NPVU5EX01JWEVSX0xJTkUxXSAgID0gNSwgICAvKiBBVVggKi8KKwkJW1NPVU5EX01JWEVSX01JQ10gICAgID0gNiwgICAvKiBNaWMgKi8KKwkJW1NPVU5EX01JWEVSX0xJTkUyXSAgID0gNywgICAvKiBNb25vIGluICovCisJCVtTT1VORF9NSVhFUl9TUEVBS0VSXSA9IDgsICAgLyogU3BlYWtlciAqLworCQlbU09VTkRfTUlYRVJfUkVDTEVWXSAgPSA5LCAgIC8qIFJlY29yZGluZyBsZXZlbCAqLworCQlbU09VTkRfTUlYRVJfVk9MVU1FXSAgPSAxMCAgIC8qIE1hc3RlciBWb2x1bWUgKi8KKwl9OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIG1peHJlZ1tdID0geworCQkweDdjLCAgIC8qIHZvaWNlICovCisJCTB4MzYsICAgLyogRk0gKi8KKwkJMHgzOCwgICAvKiBDRCAqLworCQkweDNlLCAgIC8qIExpbmUgKi8KKwkJMHgzYSwgICAvKiBBVVggKi8KKwkJMHgxYSwgICAvKiBNaWMgKi8KKwkJMHg2ZCAgICAvKiBNb25vIGluICovCisJfTsKKwl1bnNpZ25lZCBjaGFyIGwsIHIsIHJsLCByciwgdmlkeDsKKwlpbnQgaSwgdmFsOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMSkgeworCQkvKiBlbmFibGUvZGlzYWJsZS9xdWVyeSBtaXhlciBwcmVhbXAgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAtMSkgeworCQkJdmFsID0gdmFsID8gMHhmZiA6IDB4Zjc7CisJCQl3cml0ZV9taXhlcihzLCAweDdkLCAocmVhZF9taXhlcihzLCAweDdkKSB8IDB4MDgpICYgdmFsKTsKKwkJfQorCQl2YWwgPSAocmVhZF9taXhlcihzLCAweDdkKSAmIDB4MDgpID8gMSA6IDA7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUyKSB7CisJCS8qIGVuYWJsZS9kaXNhYmxlL3F1ZXJ5IHNwYXRpYWxpemVyICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gLTEpIHsKKwkJCXZhbCAmPSAweDNmOworCQkJd3JpdGVfbWl4ZXIocywgMHg1MiwgdmFsKTsKKwkJCXdyaXRlX21peGVyKHMsIDB4NTAsIHZhbCA/IDB4MDggOiAwKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIocmVhZF9taXhlcihzLCAweDUyKSwgcCk7CisJfQorICAgICAgICBpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKKwkJbWl4ZXJfaW5mbyBpbmZvOworCQlzdHJuY3B5KGluZm8uaWQsICJTb2xvMSIsIHNpemVvZihpbmZvLmlkKSk7CisJCXN0cm5jcHkoaW5mby5uYW1lLCAiRVNTIFNvbG8xIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpbmZvLm1vZGlmeV9jb3VudGVyID0gcy0+bWl4Lm1vZGNudDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CisJCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCQlzdHJuY3B5KGluZm8uaWQsICJTb2xvMSIsIHNpemVvZihpbmZvLmlkKSk7CisJCXN0cm5jcHkoaW5mby5uYW1lLCAiRVNTIFNvbG8xIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjbWQgPT0gT1NTX0dFVFZFUlNJT04pCisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKwlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ00nIHx8IF9TSU9DX1NJWkUoY21kKSAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgaWYgKF9TSU9DX0RJUihjbWQpID09IF9TSU9DX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJcmV0dXJuIHB1dF91c2VyKG1peGVyX3NyY1tyZWFkX21peGVyKHMsIDB4MWMpICYgN10sIHApOworCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIGRldmljZSAqLworCQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19TWU5USCB8IFNPVU5EX01BU0tfQ0QgfAorCQkJCQlTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19NSUMgfAorCQkJCQlTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfTElORTIgfCBTT1VORF9NQVNLX1JFQ0xFViB8CisJCQkJCVNPVU5EX01BU0tfU1BFQUtFUiwgcCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRCB8IFNPVU5EX01BU0tfVk9MVU1FLCBwKTsKKworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogLyogTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gKi8KKwkJCXJldHVybiBwdXRfdXNlcihTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfU1lOVEggfCBTT1VORF9NQVNLX0NEIHwKKwkJCQkJU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19MSU5FMSB8IFNPVU5EX01BU0tfTUlDIHwKKwkJCQkJU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX0xJTkUyIHwgU09VTkRfTUFTS19SRUNMRVYsIHApOworCQkJCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX0NBUF9FWENMX0lOUFVULCBwKTsKKworCQlkZWZhdWx0OgorCQkJaSA9IF9JT0NfTlIoY21kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCAhKHZpZHggPSBtaXh0YWJsZTFbaV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sW3ZpZHgtMV0sIHApOworCQl9CisJfQorICAgICAgICBpZiAoX1NJT0NfRElSKGNtZCkgIT0gKF9TSU9DX1JFQUR8X1NJT0NfV1JJVEUpKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisJcy0+bWl4Lm1vZGNudCsrOworCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlICovCisjaWYgMAorCSAgICAgICAgeworCQkJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgcmVnc1tdID0geworCQkJCTB4MWMsIDB4MWEsIDB4MzYsIDB4MzgsIDB4M2EsIDB4M2MsIDB4M2UsIDB4NjAsIDB4NjIsIDB4NmQsIDB4N2MKKwkJCX07CisJCQlpbnQgaTsKKwkJCQorCQkJZm9yIChpID0gMDsgaSA8IHNpemVvZihyZWdzKTsgaSsrKQorCQkJCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMTogbWl4ZXIgcmVnIDB4JTAyeDogMHglMDJ4XG4iLAorCQkJCSAgICAgICByZWdzW2ldLCByZWFkX21peGVyKHMsIHJlZ3NbaV0pKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMTogY3RybCByZWcgMHglMDJ4OiAweCUwMnhcbiIsCisJCQkgICAgICAgMHhiNCwgcmVhZF9jdHJsKHMsIDB4YjQpKTsKKwkJfQorI2VuZGlmCisJICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworICAgICAgICAgICAgICAgIGkgPSBod2VpZ2h0MzIodmFsKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaSA+IDEpIAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsICY9IH5taXhlcl9zcmNbcmVhZF9taXhlcihzLCAweDFjKSAmIDddOworCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCQlpZiAobWl4ZXJfc3JjW2ldICYgdmFsKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChpID4gNykKKwkJCXJldHVybiAwOworCQl3cml0ZV9taXhlcihzLCAweDFjLCBpKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbCA9IHZhbCAmIDB4ZmY7CisJCWlmIChsID4gMTAwKQorCQkJbCA9IDEwMDsKKwkJciA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlpZiAociA+IDEwMCkKKwkJCXIgPSAxMDA7CisJCWlmIChsIDwgNikgeworCQkJcmwgPSAweDQwOworCQkJbCA9IDA7CisJCX0gZWxzZSB7CisJCQlybCA9IChsICogMiAtIDExKSAvIDM7CisJCQlsID0gKHJsICogMyArIDExKSAvIDI7CisJCX0KKwkJaWYgKHIgPCA2KSB7CisJCQlyciA9IDB4NDA7CisJCQlyID0gMDsKKwkJfSBlbHNlIHsKKwkJCXJyID0gKHIgKiAyIC0gMTEpIC8gMzsKKwkJCXIgPSAocnIgKiAzICsgMTEpIC8gMjsKKwkJfQorCQl3cml0ZV9taXhlcihzLCAweDYwLCBybCk7CisJCXdyaXRlX21peGVyKHMsIDB4NjIsIHJyKTsKKyNpZmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKyAgICAgICAgICAgICAgICBzLT5taXgudm9sWzldID0gKCh1bnNpZ25lZCBpbnQpciA8PCA4KSB8IGw7CisjZWxzZQorICAgICAgICAgICAgICAgIHMtPm1peC52b2xbOV0gPSB2YWw7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbOV0sIHApOworCisJY2FzZSBTT1VORF9NSVhFUl9TUEVBS0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOworCQllbHNlIGlmIChsIDwgMikKKwkJCWwgPSAyOworCQlybCA9IChsIC0gMikgLyAxNDsKKwkJbCA9IHJsICogMTQgKyAyOworCQl3cml0ZV9taXhlcihzLCAweDNjLCBybCk7CisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisgICAgICAgICAgICAgICAgcy0+bWl4LnZvbFs3XSA9IGwgKiAweDEwMTsKKyNlbHNlCisgICAgICAgICAgICAgICAgcy0+bWl4LnZvbFs3XSA9IHZhbDsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFs3XSwgcCk7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbCA9ICh2YWwgPDwgMSkgJiAweDFmZTsKKwkJaWYgKGwgPiAyMDApCisJCQlsID0gMjAwOworCQllbHNlIGlmIChsIDwgNSkKKwkJCWwgPSA1OworCQlyID0gKHZhbCA+PiA3KSAmIDB4MWZlOworCQlpZiAociA+IDIwMCkKKwkJCXIgPSAyMDA7CisJCWVsc2UgaWYgKHIgPCA1KQorCQkJciA9IDU7CisJCXJsID0gKGwgLSA1KSAvIDEzOworCQlyciA9IChyIC0gNSkgLyAxMzsKKwkJciA9IChybCAqIDEzICsgNSkgLyAyOworCQlsID0gKHJyICogMTMgKyA1KSAvIDI7CisJCXdyaXRlX2N0cmwocywgMHhiNCwgKHJsIDw8IDQpIHwgcnIpOworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworICAgICAgICAgICAgICAgIHMtPm1peC52b2xbOF0gPSAoKHVuc2lnbmVkIGludClyIDw8IDgpIHwgbDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcy0+bWl4LnZvbFs4XSA9IHZhbDsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFs4XSwgcCk7CisKKwlkZWZhdWx0OgorCQlpID0gX0lPQ19OUihjbWQpOworCQlpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgISh2aWR4ID0gbWl4dGFibGUxW2ldKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gKHZhbCA8PCAxKSAmIDB4MWZlOworCQlpZiAobCA+IDIwMCkKKwkJCWwgPSAyMDA7CisJCWVsc2UgaWYgKGwgPCA1KQorCQkJbCA9IDU7CisJCXIgPSAodmFsID4+IDcpICYgMHgxZmU7CisJCWlmIChyID4gMjAwKQorCQkJciA9IDIwMDsKKwkJZWxzZSBpZiAociA8IDUpCisJCQlyID0gNTsKKwkJcmwgPSAobCAtIDUpIC8gMTM7CisJCXJyID0gKHIgLSA1KSAvIDEzOworCQlyID0gKHJsICogMTMgKyA1KSAvIDI7CisJCWwgPSAocnIgKiAxMyArIDUpIC8gMjsKKwkJd3JpdGVfbWl4ZXIocywgbWl4cmVnW3ZpZHgtMV0sIChybCA8PCA0KSB8IHJyKTsKKyNpZmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKyAgICAgICAgICAgICAgICBzLT5taXgudm9sW3ZpZHgtMV0gPSAoKHVuc2lnbmVkIGludClyIDw8IDgpIHwgbDsKKyNlbHNlCisgICAgICAgICAgICAgICAgcy0+bWl4LnZvbFt2aWR4LTFdID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sW3ZpZHgtMV0sIHApOworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc29sbzFfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSBOVUxMOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKKworCXdoaWxlICgocGNpX2RldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZGV2KSkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2cjsKKwkJZHJ2ciA9IHBjaV9kZXZfZHJpdmVyIChwY2lfZGV2KTsKKwkJaWYgKGRydnIgIT0gJnNvbG8xX2RyaXZlcikKKwkJCWNvbnRpbnVlOworCQlzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSopcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCQlpZiAoIXMpCisJCQljb250aW51ZTsKKwkJaWYgKHMtPmRldl9taXhlciA9PSBtaW5vcikKKwkJCWJyZWFrOworCX0KKwlpZiAoIXMpCisJCXJldHVybiAtRU5PREVWOworICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzb2xvMV9yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc29sbzFfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlyZXR1cm4gbWl4ZXJfaW9jdGwoKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YSwgY21kLCBhcmcpOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29sbzFfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IHNvbG8xX2lvY3RsX21peGRldiwKKwkub3BlbgkJPSBzb2xvMV9vcGVuX21peGRldiwKKwkucmVsZWFzZQk9IHNvbG8xX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgZHJhaW5fZGFjKHN0cnVjdCBzb2xvMV9zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50OworCXVuc2lnbmVkIHRtbzsKKwkKKwlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCXJldHVybiAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisgICAgICAgIGZvciAoOzspIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9kYWMuY291bnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobm9uYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICAgICAgICAgIH0KKwkJdG1vID0gMyAqIEhaICogKGNvdW50ICsgcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgLyAyIC8gcy0+cmF0ZTsKKwkJaWYgKHMtPmZtdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFKSkKKwkJCXRtbyA+Pj0gMTsKKwkJaWYgKHMtPmNoYW5uZWxzID4gMSkKKwkJCXRtbyA+Pj0gMTsKKyAgICAgICAgICAgICAgICBpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vICsgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAic29sbzE6IGRtYSB0aW1lZCBvdXQ/P1xuIik7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCBzb2xvMV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmcy0+ZG1hX2FkYy53YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzd3B0ciA9IHMtPmRtYV9hZGMuc3dwdHI7CisJCWNudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZS1zd3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMuY291bnQgPCBjbnQpCisJCQljbnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoY250IDw9IDApCisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisjaWZkZWYgREVCVUdSRUMKKwkJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xX3JlYWQ6IHJlZyBCODogMHglMDJ4ICBETUFzdGF0OiAweCUwMnggIERNQWNudDogMHglMDR4ICBTQnN0YXQ6IDB4JTAyeCAgY250OiAldVxuIiwgCisJCSAgICAgICByZWFkX2N0cmwocywgMHhiOCksIGluYihzLT5kZG1hYmFzZSs4KSwgaW53KHMtPmRkbWFiYXNlKzQpLCBpbmIocy0+c2JiYXNlKzB4YyksIGNudCk7CisjZW5kaWYKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5lbmFibGVkKQorCQkJCXN0YXJ0X2FkYyhzKTsKKyNpZmRlZiBERUJVR1JFQworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xX3JlYWQ6IHJlZ3M6IEExOiAweCUwMnggIEEyOiAweCUwMnggIEE0OiAweCUwMnggIEE1OiAweCUwMnggIEE4OiAweCUwMnhcbiIKKwkJCSAgICAgICBLRVJOX0RFQlVHICJzb2xvMV9yZWFkOiByZWdzOiBCMTogMHglMDJ4ICBCMjogMHglMDJ4ICBCNzogMHglMDJ4ICBCODogMHglMDJ4ICBCOTogMHglMDJ4XG4iCisJCQkgICAgICAgS0VSTl9ERUJVRyAic29sbzFfcmVhZDogRE1BOiBhZGRyOiAweCUwOHggY250OiAweCUwNHggc3RhdDogMHglMDJ4IG1hc2s6IDB4JTAyeFxuIiAgCisJCQkgICAgICAgS0VSTl9ERUJVRyAic29sbzFfcmVhZDogU0JzdGF0OiAweCUwMnggIGNudDogJXVcbiIsCisJCQkgICAgICAgcmVhZF9jdHJsKHMsIDB4YTEpLCByZWFkX2N0cmwocywgMHhhMiksIHJlYWRfY3RybChzLCAweGE0KSwgcmVhZF9jdHJsKHMsIDB4YTUpLCByZWFkX2N0cmwocywgMHhhOCksIAorCQkJICAgICAgIHJlYWRfY3RybChzLCAweGIxKSwgcmVhZF9jdHJsKHMsIDB4YjIpLCByZWFkX2N0cmwocywgMHhiNyksIHJlYWRfY3RybChzLCAweGI4KSwgcmVhZF9jdHJsKHMsIDB4YjkpLCAKKwkJCSAgICAgICBpbmwocy0+ZGRtYWJhc2UpLCBpbncocy0+ZGRtYWJhc2UrNCksIGluYihzLT5kZG1hYmFzZSs4KSwgaW5iKHMtPmRkbWFiYXNlKzE1KSwgaW5iKHMtPnNiYmFzZSsweGMpLCBjbnQpOworI2VuZGlmCisJCQlpZiAoaW5iKHMtPmRkbWFiYXNlKzE1KSAmIDEpCisJCQkJcHJpbnRrKEtFUk5fRVJSICJzb2xvMTogY2Fubm90IHN0YXJ0IHJlY29yZGluZywgRERNQSBtYXNrIGJpdCBzdHVjayBhdCAxXG4iKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKyNpZmRlZiBERUJVR1JFQworCQkJcHJpbnRrKEtFUk5fREVCVUcgInNvbG8xX3JlYWQ6IHJlZ3M6IEExOiAweCUwMnggIEEyOiAweCUwMnggIEE0OiAweCUwMnggIEE1OiAweCUwMnggIEE4OiAweCUwMnhcbiIKKwkJCSAgICAgICBLRVJOX0RFQlVHICJzb2xvMV9yZWFkOiByZWdzOiBCMTogMHglMDJ4ICBCMjogMHglMDJ4ICBCNzogMHglMDJ4ICBCODogMHglMDJ4ICBCOTogMHglMDJ4XG4iCisJCQkgICAgICAgS0VSTl9ERUJVRyAic29sbzFfcmVhZDogRE1BOiBhZGRyOiAweCUwOHggY250OiAweCUwNHggc3RhdDogMHglMDJ4IG1hc2s6IDB4JTAyeFxuIiAgCisJCQkgICAgICAgS0VSTl9ERUJVRyAic29sbzFfcmVhZDogU0JzdGF0OiAweCUwMnggIGNudDogJXVcbiIsCisJCQkgICAgICAgcmVhZF9jdHJsKHMsIDB4YTEpLCByZWFkX2N0cmwocywgMHhhMiksIHJlYWRfY3RybChzLCAweGE0KSwgcmVhZF9jdHJsKHMsIDB4YTUpLCByZWFkX2N0cmwocywgMHhhOCksIAorCQkJICAgICAgIHJlYWRfY3RybChzLCAweGIxKSwgcmVhZF9jdHJsKHMsIDB4YjIpLCByZWFkX2N0cmwocywgMHhiNyksIHJlYWRfY3RybChzLCAweGI4KSwgcmVhZF9jdHJsKHMsIDB4YjkpLCAKKwkJCSAgICAgICBpbmwocy0+ZGRtYWJhc2UpLCBpbncocy0+ZGRtYWJhc2UrNCksIGluYihzLT5kZG1hYmFzZSs4KSwgaW5iKHMtPmRkbWFiYXNlKzE1KSwgaW5iKHMtPnNiYmFzZSsweGMpLCBjbnQpOworI2VuZGlmCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPmRtYV9hZGMucmF3YnVmICsgc3dwdHIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmRtYV9hZGMuc3dwdHIgPSBzd3B0cjsKKwkJcy0+ZG1hX2FkYy5jb3VudCAtPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlpZiAocy0+ZG1hX2FkYy5lbmFibGVkKQorCQkJc3RhcnRfYWRjKHMpOworI2lmZGVmIERFQlVHUkVDCisJCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMV9yZWFkOiByZWcgQjg6IDB4JTAyeCAgRE1Bc3RhdDogMHglMDJ4ICBETUFjbnQ6IDB4JTA0eCAgU0JzdGF0OiAweCUwMnhcbiIsIAorCQkgICAgICAgcmVhZF9jdHJsKHMsIDB4YjgpLCBpbmIocy0+ZGRtYWJhc2UrOCksIGludyhzLT5kZG1hYmFzZSs0KSwgaW5iKHMtPnNiYmFzZSsweGMpKTsKKyNlbmRpZgorCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2FkYy53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzb2xvMV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzc2l6ZV90IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHN3cHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQlyZXR1cm4gcmV0OworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMV93cml0ZTogcmVnIDcwOiAweCUwMnggIDcxOiAweCUwMnggIDcyOiAweCUwMnggIDc0OiAweCUwMnggIDc2OiAweCUwMnggIDc4OiAweCUwMnggIDdBOiAweCUwMnhcbiIKKwkgICAgICAgS0VSTl9ERUJVRyAic29sbzFfd3JpdGU6IERNQTogYWRkcjogMHglMDh4ICBjbnQ6IDB4JTA0eCAgc3RhdDogMHglMDJ4ICBTQnN0YXQ6IDB4JTAyeFxuIiwgCisJICAgICAgIHJlYWRfbWl4ZXIocywgMHg3MCksIHJlYWRfbWl4ZXIocywgMHg3MSksIHJlYWRfbWl4ZXIocywgMHg3MiksIHJlYWRfbWl4ZXIocywgMHg3NCksIHJlYWRfbWl4ZXIocywgMHg3NiksCisJICAgICAgIHJlYWRfbWl4ZXIocywgMHg3OCksIHJlYWRfbWl4ZXIocywgMHg3YSksIGlubChzLT5pb2Jhc2UpLCBpbncocy0+aW9iYXNlKzQpLCBpbmIocy0+aW9iYXNlKzYpLCBpbmIocy0+c2JiYXNlKzB4YykpOworCXByaW50ayhLRVJOX0RFQlVHICJzb2xvMV93cml0ZTogcmVnIDc4OiAweCUwMnggIHJlZyA3QTogMHglMDJ4ICBETUFjbnQ6IDB4JTA0eCAgRE1Bc3RhdDogMHglMDJ4ICBTQnN0YXQ6IDB4JTAyeFxuIiwgCisJICAgICAgIHJlYWRfbWl4ZXIocywgMHg3OCksIHJlYWRfbWl4ZXIocywgMHg3YSksIGludyhzLT5pb2Jhc2UrNCksIGluYihzLT5pb2Jhc2UrNiksIGluYihzLT5zYmJhc2UrMHhjKSk7CisjZW5kaWYKKwlyZXQgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsJCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA8IDApIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgPSAwOworCQkJcy0+ZG1hX2RhYy5zd3B0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCX0KKwkJc3dwdHIgPSBzLT5kbWFfZGFjLnN3cHRyOworCQljbnQgPSBzLT5kbWFfZGFjLmRtYXNpemUtc3dwdHI7CisJCWlmIChzLT5kbWFfZGFjLmNvdW50ICsgY250ID4gcy0+ZG1hX2RhYy5kbWFzaXplKQorCQkJY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChzLT5kbWFfZGFjLmVuYWJsZWQpCisJCQkJc3RhcnRfZGFjKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihzLT5kbWFfZGFjLnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmRtYV9kYWMuc3dwdHIgPSBzd3B0cjsKKwkJcy0+ZG1hX2RhYy5jb3VudCArPSBjbnQ7CisJCXMtPmRtYV9kYWMuZW5kY2xlYXJlZCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlpZiAocy0+ZG1hX2RhYy5lbmFibGVkKQorCQkJc3RhcnRfZGFjKHMpOworCX0KKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCBzb2xvMV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgcHJvZ19kbWFidWZfZGFjKHMpKQorCQkJcmV0dXJuIDA7CisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2RhYy53YWl0LCB3YWl0KTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2FkYyhzKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc29sbzFfdXBkYXRlX3B0cihzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0gZWxzZSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IDApCisJCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2lnbmVkKXMtPmRtYV9kYWMuZG1hc2l6ZSA+IHMtPmRtYV9kYWMuY291bnQpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKKworc3RhdGljIGludCBzb2xvMV9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRiOworCWludCByZXQgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkgIT0gMCkKKwkJCWdvdG8gb3V0OworCQlkYiA9ICZzLT5kbWFfZGFjOworCX0gZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpICE9IDApCisJCQlnb3RvIG91dDsKKwkJZGIgPSAmcy0+ZG1hX2FkYzsKKwl9IGVsc2UgCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkKKwkJZ290byBvdXQ7CisJcmV0ID0gLUVBR0FJTjsKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQl2aXJ0X3RvX3BoeXMoZGItPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCQlzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCWdvdG8gb3V0OworCWRiLT5tYXBwZWQgPSAxOworCXJldCA9IDA7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc29sbzFfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc29sbzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgYXVkaW9fYnVmX2luZm8gYWJpbmZvOworICAgICAgICBjb3VudF9pbmZvIGNpbmZvOworCWludCB2YWwsIG1hcHBlZCwgcmV0LCBjb3VudDsKKyAgICAgICAgaW50IGRpdjEsIGRpdjI7CisgICAgICAgIHVuc2lnbmVkIHJhdGUxLCByYXRlMjsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworICAgICAgICBtYXBwZWQgPSAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiBzLT5kbWFfZGFjLm1hcHBlZCkgfHwKKwkJKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiBzLT5kbWFfYWRjLm1hcHBlZCk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIGRyYWluX2RhYyhzLCAwLypmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyovKTsKKwkJcmV0dXJuIDA7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfZGFjLnN3cHRyID0gcy0+ZG1hX2RhYy5od3B0ciA9IHMtPmRtYV9kYWMuY291bnQgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0gcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPSAwOworCQl9CisJCXByb2dfY29kZWMocyk7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3RvcF9kYWMocyk7CisJCQlzLT5kbWFfYWRjLnJlYWR5ID0gcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQkvKiBwcm9ncmFtIHNhbXBsaW5nIHJhdGVzICovCisJCQlpZiAodmFsID4gNDgwMDApCisJCQkJdmFsID0gNDgwMDA7CisJCQlpZiAodmFsIDwgNjMwMCkKKwkJCQl2YWwgPSA2MzAwOworCQkJZGl2MSA9ICg3NjgwMDAgKyB2YWwgLyAyKSAvIHZhbDsKKwkJCXJhdGUxID0gKDc2ODAwMCArIGRpdjEgLyAyKSAvIGRpdjE7CisJCQlkaXYxID0gLWRpdjE7CisJCQlkaXYyID0gKDc5MzgwMCArIHZhbCAvIDIpIC8gdmFsOworCQkJcmF0ZTIgPSAoNzkzODAwICsgZGl2MiAvIDIpIC8gZGl2MjsKKwkJCWRpdjIgPSAoLWRpdjIpICYgMHg3ZjsKKwkJCWlmIChhYnModmFsIC0gcmF0ZTIpIDwgYWJzKHZhbCAtIHJhdGUxKSkgeworCQkJCXJhdGUxID0gcmF0ZTI7CisJCQkJZGl2MSA9IGRpdjI7CisJCQl9CisJCQlzLT5yYXRlID0gcmF0ZTE7CisJCQlzLT5jbGtkaXYgPSBkaXYxOworCQkJcHJvZ19jb2RlYyhzKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIocy0+cmF0ZSwgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXN0b3BfYWRjKHMpOworCQlzdG9wX2RhYyhzKTsKKwkJcy0+ZG1hX2FkYy5yZWFkeSA9IHMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkvKiBwcm9ncmFtIGNoYW5uZWxzICovCisJCXMtPmNoYW5uZWxzID0gdmFsID8gMiA6IDE7CisJCXByb2dfY29kZWMocyk7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3RvcF9kYWMocyk7CisJCQlzLT5kbWFfYWRjLnJlYWR5ID0gcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQkvKiBwcm9ncmFtIGNoYW5uZWxzICovCisJCQlzLT5jaGFubmVscyA9ICh2YWwgPj0gMikgPyAyIDogMTsKKwkJCXByb2dfY29kZWMocyk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHMtPmNoYW5uZWxzLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRXxBRk1UX1UxNl9MRXxBRk1UX1M4fEFGTVRfVTgsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IHMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJLyogcHJvZ3JhbSBmb3JtYXQgKi8KKwkJCWlmICh2YWwgIT0gQUZNVF9TMTZfTEUgJiYgdmFsICE9IEFGTVRfVTE2X0xFICYmIAorCQkJICAgIHZhbCAhPSBBRk1UX1M4ICYmIHZhbCAhPSBBRk1UX1U4KQorCQkJCXZhbCA9IEFGTVRfVTg7CisJCQlzLT5mbXQgPSB2YWw7CisJCQlwcm9nX2NvZGVjKHMpOworCQl9CisJCXJldHVybiBwdXRfdXNlcihzLT5mbXQsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCXZhbCA9IDA7CisJCWlmIChmaWxlLT5mX21vZGUgJiBzLT5lbmEgJiBGTU9ERV9SRUFEKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBzLT5lbmEgJiBGTU9ERV9XUklURSkKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSB7CisJCQkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJCXMtPmRtYV9kYWMuZW5hYmxlZCA9IDE7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJCWlmIChpbmIocy0+ZGRtYWJhc2UrMTUpICYgMSkKKwkJCQkJcHJpbnRrKEtFUk5fRVJSICJzb2xvMTogY2Fubm90IHN0YXJ0IHJlY29yZGluZywgRERNQSBtYXNrIGJpdCBzdHVjayBhdCAxXG4iKTsKKwkJCX0gZWxzZSB7CisJCQkJcy0+ZG1hX2RhYy5lbmFibGVkID0gMDsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCX0KKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgeworCQkJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzLT5kbWFfZGFjLmVuYWJsZWQgPSAxOworCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCX0gZWxzZSB7CisJCQkJcy0+ZG1hX2RhYy5lbmFibGVkID0gMDsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2RhYyhzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXNvbG8xX3VwZGF0ZV9wdHIocyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisJCWNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLmRtYXNpemUgLSBjb3VudDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMubnVtZnJhZzsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OyAgICAgIAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXNvbG8xX3VwZGF0ZV9wdHIocyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ3NpemU7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy5jb3VudDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9hZGMubnVtZnJhZzsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OyAgICAgIAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorICAgICAgICAgICAgICAgIGZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzb2xvMV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNvdW50ID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworCQlyZXR1cm4gcHV0X3VzZXIoY291bnQsIHApOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXNvbG8xX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IHMtPmRtYV9hZGMuY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSBzLT5kbWFfYWRjLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzb2xvMV91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJCXMtPmRtYV9kYWMuY291bnQgJj0gcy0+ZG1hX2RhYy5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisjaWYgMAorCQlwcmludGsoS0VSTl9ERUJVRyAiZXNzc29sbzE6IEdFVE9QVFI6IGJ5dGVzICV1IGJsb2NrcyAldSBwdHIgJXUsIGJ1Zm9yZGVyICV1IG51bWZyYWcgJXUgZnJhZ3NoaWZ0ICV1XG4iCisJCSAgICAgICBLRVJOX0RFQlVHICJlc3Nzb2xvMTogc3dwdHIgJXUgY291bnQgJXUgZnJhZ3NpemUgJXUgZG1hc2l6ZSAldSBmcmFnc2FtcGxlcyAldVxuIiwKKwkJICAgICAgIGNpbmZvLmJ5dGVzLCBjaW5mby5ibG9ja3MsIGNpbmZvLnB0ciwgcy0+ZG1hX2RhYy5idWZvcmRlciwgcy0+ZG1hX2RhYy5udW1mcmFnLCBzLT5kbWFfZGFjLmZyYWdzaGlmdCwKKwkJICAgICAgIHMtPmRtYV9kYWMuc3dwdHIsIHMtPmRtYV9kYWMuY291bnQsIHMtPmRtYV9kYWMuZnJhZ3NpemUsIHMtPmRtYV9kYWMuZG1hc2l6ZSwgcy0+ZG1hX2RhYy5mcmFnc2FtcGxlcyk7CisjZW5kaWYKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICgodmFsID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQlyZXR1cm4gdmFsOworCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9kYWMuZnJhZ3NpemUsIHApOworCQl9CisJCWlmICgodmFsID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCXJldHVybiB2YWw7CisJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLmZyYWdzaXplLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSA0OworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9IDQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24pIHx8CisJCSAgICAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gdmFsOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gdmFsOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcihzLT5yYXRlLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlyZXR1cm4gcHV0X3VzZXIocy0+Y2hhbm5lbHMsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoQUZNVF9TOHxBRk1UX1U4KSkgPyA4IDogMTYsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJCQorCX0KKwlyZXR1cm4gbWl4ZXJfaW9jdGwocywgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IHNvbG8xX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RvcF9kYWMocyk7CisJCW91dGIoMCwgcy0+aW9iYXNlKzYpOyAgLyogZGlzYWJsZSBETUEgKi8KKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9kYWMpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdG9wX2FkYyhzKTsKKwkJb3V0YigxLCBzLT5kZG1hYmFzZSsweGYpOyAvKiBtYXNrIERNQSBjaGFubmVsICovCisJCW91dGIoMCwgcy0+ZGRtYWJhc2UrMHhkKTsgLyogRE1BIG1hc3RlciBjbGVhciAqLworCQlkZWFsbG9jX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYyk7CisJfQorCXMtPm9wZW5fbW9kZSAmPSB+KEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb2xvMV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisJCisJd2hpbGUgKChwY2lfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBjaV9kZXYpKSAhPSBOVUxMKSB7CisJCXN0cnVjdCBwY2lfZHJpdmVyICpkcnZyOworCisJCWRydnIgPSBwY2lfZGV2X2RyaXZlcihwY2lfZGV2KTsKKwkJaWYgKGRydnIgIT0gJnNvbG8xX2RyaXZlcikKKwkJCWNvbnRpbnVlOworCQlzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSopcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCQlpZiAoIXMpCisJCQljb250aW51ZTsKKwkJaWYgKCEoKHMtPmRldl9hdWRpbyBeIG1pbm9yKSAmIH4weGYpKQorCQkJYnJlYWs7CisJfQorCWlmICghcykKKwkJcmV0dXJuIC1FTk9ERVY7CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJcy0+Zm10ID0gQUZNVF9VODsKKwlzLT5jaGFubmVscyA9IDE7CisJcy0+cmF0ZSA9IDgwMDA7CisJcy0+Y2xrZGl2ID0gOTYgfCAweDgwOworCXMtPmVuYSA9IDA7CisJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IDA7CisJcy0+ZG1hX2FkYy5lbmFibGVkID0gMTsKKwlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSBzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gMDsKKwlzLT5kbWFfZGFjLmVuYWJsZWQgPSAxOworCXMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXByb2dfY29kZWMocyk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29sbzFfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gc29sbzFfcmVhZCwKKwkud3JpdGUJCT0gc29sbzFfd3JpdGUsCisJLnBvbGwJCT0gc29sbzFfcG9sbCwKKwkuaW9jdGwJCT0gc29sbzFfaW9jdGwsCisJLm1tYXAJCT0gc29sbzFfbW1hcCwKKwkub3BlbgkJPSBzb2xvMV9vcGVuLAorCS5yZWxlYXNlCT0gc29sbzFfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBob2xkIHNwaW5sb2NrIGZvciB0aGUgZm9sbG93aW5nISAqLworc3RhdGljIHZvaWQgc29sbzFfaGFuZGxlX21pZGkoc3RydWN0IHNvbG8xX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGNoYXIgY2g7CisJaW50IHdha2U7CisKKwlpZiAoIShzLT5tcHViYXNlKSkKKwkJcmV0dXJuOworCXdha2UgPSAwOworCXdoaWxlICghKGluYihzLT5tcHViYXNlKzEpICYgMHg4MCkpIHsKKwkJY2ggPSBpbmIocy0+bXB1YmFzZSk7CisJCWlmIChzLT5taWRpLmljbnQgPCBNSURJSU5CVUYpIHsKKwkJCXMtPm1pZGkuaWJ1ZltzLT5taWRpLml3cl0gPSBjaDsKKwkJCXMtPm1pZGkuaXdyID0gKHMtPm1pZGkuaXdyICsgMSkgJSBNSURJSU5CVUY7CisJCQlzLT5taWRpLmljbnQrKzsKKwkJfQorCQl3YWtlID0gMTsKKwl9CisJaWYgKHdha2UpCisJCXdha2VfdXAoJnMtPm1pZGkuaXdhaXQpOworCXdha2UgPSAwOworCXdoaWxlICghKGluYihzLT5tcHViYXNlKzEpICYgMHg0MCkgJiYgcy0+bWlkaS5vY250ID4gMCkgeworCQlvdXRiKHMtPm1pZGkub2J1ZltzLT5taWRpLm9yZF0sIHMtPm1wdWJhc2UpOworCQlzLT5taWRpLm9yZCA9IChzLT5taWRpLm9yZCArIDEpICUgTUlESU9VVEJVRjsKKwkJcy0+bWlkaS5vY250LS07CisJCWlmIChzLT5taWRpLm9jbnQgPCBNSURJT1VUQlVGLTE2KQorCQkJd2FrZSA9IDE7CisJfQorCWlmICh3YWtlKQorCQl3YWtlX3VwKCZzLT5taWRpLm93YWl0KTsKK30KKworc3RhdGljIGlycXJldHVybl90IHNvbG8xX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZGV2X2lkOworCXVuc2lnbmVkIGludCBpbnRzcmM7CisJCisJLyogZmFzdHBhdGggb3V0LCB0byBlYXNlIGludGVycnVwdCBzaGFyaW5nICovCisJaW50c3JjID0gaW5iKHMtPmlvYmFzZSs3KTsgLyogZ2V0IGludGVycnVwdCBzb3VyY2UocykgKi8KKwlpZiAoIWludHNyYykKKwkJcmV0dXJuIElSUV9OT05FOworCSh2b2lkKWluYihzLT5zYmJhc2UrMHhlKTsgIC8qIGNsZWFyIGludGVycnVwdCAqLworCXNwaW5fbG9jaygmcy0+bG9jayk7CisJLyogY2xlYXIgYXVkaW8gaW50ZXJydXB0cyBmaXJzdCAqLworCWlmIChpbnRzcmMgJiAweDIwKQorCQl3cml0ZV9taXhlcihzLCAweDdhLCByZWFkX21peGVyKHMsIDB4N2EpICYgMHg3Zik7CisJc29sbzFfdXBkYXRlX3B0cihzKTsKKwlzb2xvMV9oYW5kbGVfbWlkaShzKTsKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBzb2xvMV9taWRpX3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc29sbzFfaGFuZGxlX21pZGkocyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPm1pZGkudGltZXIuZXhwaXJlcyA9IGppZmZpZXMrMTsKKwlhZGRfdGltZXIoJnMtPm1pZGkudGltZXIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNzaXplX3Qgc29sbzFfbWlkaV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0ID0gMDsKKwlhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5pd2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcHRyID0gcy0+bWlkaS5pcmQ7CisJCWNudCA9IE1JRElJTkJVRiAtIHB0cjsKKwkJaWYgKHMtPm1pZGkuaWNudCA8IGNudCkKKwkJCWNudCA9IHMtPm1pZGkuaWNudDsKKwkJaWYgKGNudCA8PSAwKQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcy0+bWlkaS5pYnVmICsgcHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJcHRyID0gKHB0ciArIGNudCkgJSBNSURJSU5CVUY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPm1pZGkuaXJkID0gcHRyOworCQlzLT5taWRpLmljbnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJYnJlYWs7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+bWlkaS5pd2FpdCwgJndhaXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvbG8xX21pZGlfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc29sbzFfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKGNvdW50ID09IDApCisJCXJldHVybiAwOworCXJldCA9IDA7CisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlwdHIgPSBzLT5taWRpLm93cjsKKwkJY250ID0gTUlESU9VVEJVRiAtIHB0cjsKKwkJaWYgKHMtPm1pZGkub2NudCArIGNudCA+IE1JRElPVVRCVUYpCisJCQljbnQgPSBNSURJT1VUQlVGIC0gcy0+bWlkaS5vY250OworCQlpZiAoY250IDw9IDApIHsKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNvbG8xX2hhbmRsZV9taWRpKHMpOworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihzLT5taWRpLm9idWYgKyBwdHIsIGJ1ZmZlciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESU9VVEJVRjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+bWlkaS5vd3IgPSBwdHI7CisJCXMtPm1pZGkub2NudCArPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzb2xvMV9oYW5kbGVfbWlkaShzKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCBzb2xvMV9taWRpX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKGZpbGUtPmZfZmxhZ3MgJiBGTU9ERV9XUklURSkKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5taWRpLm93YWl0LCB3YWl0KTsKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1JFQUQpCisJCXBvbGxfd2FpdChmaWxlLCAmcy0+bWlkaS5pd2FpdCwgd2FpdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKHMtPm1pZGkuaWNudCA+IDApCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX2ZsYWdzICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHMtPm1pZGkub2NudCA8IE1JRElPVVRCVUYpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgc29sbzFfbWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSBOVUxMOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKKworCXdoaWxlICgocGNpX2RldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwY2lfZGV2KSkgIT0gTlVMTCkgeworCQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2cjsKKworCQlkcnZyID0gcGNpX2Rldl9kcml2ZXIocGNpX2Rldik7CisJCWlmIChkcnZyICE9ICZzb2xvMV9kcml2ZXIpCisJCQljb250aW51ZTsKKwkJcyA9IChzdHJ1Y3Qgc29sbzFfc3RhdGUqKXBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwkJaWYgKCFzKQorCQkJY29udGludWU7CisJCWlmIChzLT5kZXZfbWlkaSA9PSBtaW5vcikKKwkJCWJyZWFrOworCX0KKwlpZiAoIXMpCisJCXJldHVybiAtRU5PREVWOworICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCQlzLT5taWRpLm9yZCA9IHMtPm1pZGkub3dyID0gcy0+bWlkaS5vY250ID0gMDsKKwkJb3V0YigweGZmLCBzLT5tcHViYXNlKzEpOyAvKiByZXNldCBjb21tYW5kICovCisJCW91dGIoMHgzZiwgcy0+bXB1YmFzZSsxKTsgLyogdWFydCBjb21tYW5kICovCisJCWlmICghKGluYihzLT5tcHViYXNlKzEpICYgMHg4MCkpCisJCQlpbmIocy0+bXB1YmFzZSk7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCQlvdXRiKDB4YjAsIHMtPmlvYmFzZSArIDcpOyAvKiBlbmFibGUgQTEsIEEyLCBNUFUgaXJxJ3MgKi8KKwkJaW5pdF90aW1lcigmcy0+bWlkaS50aW1lcik7CisJCXMtPm1pZGkudGltZXIuZXhwaXJlcyA9IGppZmZpZXMrMTsKKwkJcy0+bWlkaS50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpczsKKwkJcy0+bWlkaS50aW1lci5mdW5jdGlvbiA9IHNvbG8xX21pZGlfdGltZXI7CisJCWFkZF90aW1lcigmcy0+bWlkaS50aW1lcik7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+bWlkaS5vcmQgPSBzLT5taWRpLm93ciA9IHMtPm1pZGkub2NudCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzb2xvMV9taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gKHN0cnVjdCBzb2xvMV9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNvdW50LCB0bW87CisKKwlWQUxJREFURV9TVEFURShzKTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCWZvciAoOzspIHsKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQljb3VudCA9IHMtPm1pZGkub2NudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChjb3VudCA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCWJyZWFrOworCQkJdG1vID0gKGNvdW50ICogSFopIC8gMzEwMDsKKwkJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyA6IDEpICYmIHRtbykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAic29sbzE6IG1pZGkgdGltZWQgb3V0Pz9cbiIpOworCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJfQorCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlzLT5vcGVuX21vZGUgJj0gfigoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRHxGTU9ERV9NSURJX1dSSVRFKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCW91dGIoMHgzMCwgcy0+aW9iYXNlICsgNyk7IC8qIGVuYWJsZSBBMSwgQTIgaXJxJ3MgKi8KKwkJZGVsX3RpbWVyKCZzLT5taWRpLnRpbWVyKTsJCQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHNvbG8xX21pZGlfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gc29sbzFfbWlkaV9yZWFkLAorCS53cml0ZQkJPSBzb2xvMV9taWRpX3dyaXRlLAorCS5wb2xsCQk9IHNvbG8xX21pZGlfcG9sbCwKKwkub3BlbgkJPSBzb2xvMV9taWRpX29wZW4sCisJLnJlbGVhc2UJPSBzb2xvMV9taWRpX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzb2xvMV9kbWZtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvcF9vZmZzZXRbMThdID0geworCQkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAorCQkweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELAorCQkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1CisJfTsKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbV9mbV92b2ljZSB2OworCXN0cnVjdCBkbV9mbV9ub3RlIG47CisJc3RydWN0IGRtX2ZtX3BhcmFtcyBwOworCXVuc2lnbmVkIGludCBpbzsKKwl1bnNpZ25lZCBpbnQgcmVnYjsKKworCXN3aXRjaCAoY21kKSB7CQkKKwljYXNlIEZNX0lPQ1RMX1JFU0VUOgorCQlmb3IgKHJlZ2IgPSAweGIwOyByZWdiIDwgMHhiOTsgcmVnYisrKSB7CisJCQlvdXRiKHJlZ2IsIHMtPnNiYmFzZSk7CisJCQlvdXRiKDAsIHMtPnNiYmFzZSsxKTsKKwkJCW91dGIocmVnYiwgcy0+c2JiYXNlKzIpOworCQkJb3V0YigwLCBzLT5zYmJhc2UrMyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIEZNX0lPQ1RMX1BMQVlfTk9URToKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZuLCAodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihuKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKG4udm9pY2UgPj0gMTgpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKG4udm9pY2UgPj0gOSkgeworCQkJcmVnYiA9IG4udm9pY2UgLSA5OworCQkJaW8gPSBzLT5zYmJhc2UrMjsKKwkJfSBlbHNlIHsKKwkJCXJlZ2IgPSBuLnZvaWNlOworCQkJaW8gPSBzLT5zYmJhc2U7CisJCX0KKwkJb3V0YigweGEwICsgcmVnYiwgaW8pOworCQlvdXRiKG4uZm51bSAmIDB4ZmYsIGlvKzEpOworCQlvdXRiKDB4YjAgKyByZWdiLCBpbyk7CisJCW91dGIoKChuLmZudW0gPj4gOCkgJiAzKSB8ICgobi5vY3RhdmUgJiA3KSA8PCAyKSB8ICgobi5rZXlfb24gJiAxKSA8PCA1KSwgaW8rMSk7CisJCXJldHVybiAwOworCisJY2FzZSBGTV9JT0NUTF9TRVRfVk9JQ0U6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2LnZvaWNlID49IDE4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJlZ2IgPSBvcF9vZmZzZXRbdi52b2ljZV07CisJCWlvID0gcy0+c2JiYXNlICsgKCh2Lm9wICYgMSkgPDwgMSk7CisJCW91dGIoMHgyMCArIHJlZ2IsIGlvKTsKKwkJb3V0YigoKHYuYW0gJiAxKSA8PCA3KSB8ICgodi52aWJyYXRvICYgMSkgPDwgNikgfCAoKHYuZG9fc3VzdGFpbiAmIDEpIDw8IDUpIHwgCisJCSAgICAgKCh2LmtiZF9zY2FsZSAmIDEpIDw8IDQpIHwgKHYuaGFybW9uaWMgJiAweGYpLCBpbysxKTsKKwkJb3V0YigweDQwICsgcmVnYiwgaW8pOworCQlvdXRiKCgodi5zY2FsZV9sZXZlbCAmIDB4MykgPDwgNikgfCAodi52b2x1bWUgJiAweDNmKSwgaW8rMSk7CisJCW91dGIoMHg2MCArIHJlZ2IsIGlvKTsKKwkJb3V0YigoKHYuYXR0YWNrICYgMHhmKSA8PCA0KSB8ICh2LmRlY2F5ICYgMHhmKSwgaW8rMSk7CisJCW91dGIoMHg4MCArIHJlZ2IsIGlvKTsKKwkJb3V0YigoKHYuc3VzdGFpbiAmIDB4ZikgPDwgNCkgfCAodi5yZWxlYXNlICYgMHhmKSwgaW8rMSk7CisJCW91dGIoMHhlMCArIHJlZ2IsIGlvKTsKKwkJb3V0Yih2LndhdmVmb3JtICYgMHg3LCBpbysxKTsKKwkJaWYgKG4udm9pY2UgPj0gOSkgeworCQkJcmVnYiA9IG4udm9pY2UgLSA5OworCQkJaW8gPSBzLT5zYmJhc2UrMjsKKwkJfSBlbHNlIHsKKwkJCXJlZ2IgPSBuLnZvaWNlOworCQkJaW8gPSBzLT5zYmJhc2U7CisJCX0KKwkJb3V0YigweGMwICsgcmVnYiwgaW8pOworCQlvdXRiKCgodi5yaWdodCAmIDEpIDw8IDUpIHwgKCh2LmxlZnQgJiAxKSA8PCA0KSB8ICgodi5mZWVkYmFjayAmIDcpIDw8IDEpIHwKKwkJICAgICAodi5jb25uZWN0aW9uICYgMSksIGlvKzEpOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBGTV9JT0NUTF9TRVRfUEFSQU1TOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsICh2b2lkIF9fdXNlciAqKWFyZywgc2l6ZW9mKHApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlvdXRiKDB4MDgsIHMtPnNiYmFzZSk7CisJCW91dGIoKHAua2JkX3NwbGl0ICYgMSkgPDwgNiwgcy0+c2JiYXNlKzEpOworCQlvdXRiKDB4YmQsIHMtPnNiYmFzZSk7CisJCW91dGIoKChwLmFtX2RlcHRoICYgMSkgPDwgNykgfCAoKHAudmliX2RlcHRoICYgMSkgPDwgNikgfCAoKHAucmh5dGhtICYgMSkgPDwgNSkgfCAoKHAuYmFzcyAmIDEpIDw8IDQpIHwKKwkJICAgICAoKHAuc25hcmUgJiAxKSA8PCAzKSB8ICgocC50b210b20gJiAxKSA8PCAyKSB8ICgocC5jeW1iYWwgJiAxKSA8PCAxKSB8IChwLmhpaGF0ICYgMSksIHMtPnNiYmFzZSsxKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIEZNX0lPQ1RMX1NFVF9PUEw6CisJCW91dGIoNCwgcy0+c2JiYXNlKzIpOworCQlvdXRiKGFyZywgcy0+c2JiYXNlKzMpOworCQlyZXR1cm4gMDsKKworCWNhc2UgRk1fSU9DVExfU0VUX01PREU6CisJCW91dGIoNSwgcy0+c2JiYXNlKzIpOworCQlvdXRiKGFyZyAmIDEsIHMtPnNiYmFzZSszKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc29sbzFfZG1mbV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IHNvbG8xX3N0YXRlICpzID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisKKwl3aGlsZSAoKHBjaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGNpX2RldikpICE9IE5VTEwpIHsKKwkJc3RydWN0IHBjaV9kcml2ZXIgKmRydnI7CisKKwkJZHJ2ciA9IHBjaV9kZXZfZHJpdmVyKHBjaV9kZXYpOworCQlpZiAoZHJ2ciAhPSAmc29sbzFfZHJpdmVyKQorCQkJY29udGludWU7CisJCXMgPSAoc3RydWN0IHNvbG8xX3N0YXRlKilwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJCWlmICghcykKKwkJCWNvbnRpbnVlOworCQlpZiAocy0+ZGV2X2RtZm0gPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisJaWYgKCFzKQorCQlyZXR1cm4gLUVOT0RFVjsKKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIEZNT0RFX0RNRk0pIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24ocy0+c2JiYXNlLCBGTVNZTlRIX0VYVEVOVCwgIkVTUyBTb2xvMSIpKSB7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXByaW50ayhLRVJOX0VSUiAic29sbzE6IEZNIHN5bnRoIGlvIHBvcnRzIGluIHVzZSwgb3BsMyBsb2FkZWQ/XG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJLyogaW5pdCB0aGUgc3R1ZmYgKi8KKwlvdXRiKDEsIHMtPnNiYmFzZSk7CisJb3V0YigweDIwLCBzLT5zYmJhc2UrMSk7IC8qIGVuYWJsZSB3YXZlZm9ybXMgKi8KKwlvdXRiKDQsIHMtPnNiYmFzZSsyKTsKKwlvdXRiKDAsIHMtPnNiYmFzZSszKTsgIC8qIG5vIDRvcCBlbmFibGVkICovCisJb3V0Yig1LCBzLT5zYmJhc2UrMik7CisJb3V0YigxLCBzLT5zYmJhc2UrMyk7ICAvKiBlbmFibGUgT1BMMyAqLworCXMtPm9wZW5fbW9kZSB8PSBGTU9ERV9ETUZNOworCXVwKCZzLT5vcGVuX3NlbSk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHNvbG8xX2RtZm1fcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCByZWdiOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJcy0+b3Blbl9tb2RlICY9IH5GTU9ERV9ETUZNOworCWZvciAocmVnYiA9IDB4YjA7IHJlZ2IgPCAweGI5OyByZWdiKyspIHsKKwkJb3V0YihyZWdiLCBzLT5zYmJhc2UpOworCQlvdXRiKDAsIHMtPnNiYmFzZSsxKTsKKwkJb3V0YihyZWdiLCBzLT5zYmJhc2UrMik7CisJCW91dGIoMCwgcy0+c2JiYXNlKzMpOworCX0KKwlyZWxlYXNlX3JlZ2lvbihzLT5zYmJhc2UsIEZNU1lOVEhfRVhURU5UKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc29sbzFfZG1mbV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gc29sbzFfZG1mbV9pb2N0bCwKKwkub3BlbgkJPSBzb2xvMV9kbWZtX29wZW4sCisJLnJlbGVhc2UJPSBzb2xvMV9kbWZtX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0cnVjdCBpbml0dm9sIHsKKwlpbnQgbWl4Y2g7CisJaW50IHZvbDsKK30gaW5pdHZvbFtdIF9fZGV2aW5pdGRhdGEgPSB7CisJeyBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfUENNLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1NZTlRILCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX0NELCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX0xJTkUsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfTElORTEsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfTElORTIsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfUkVDTEVWLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1NQRUFLRVIsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfTUlDLCAweDQwNDAgfQorfTsKKworc3RhdGljIGludCBzZXR1cF9zb2xvMShzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IHMtPmRldjsKKwltbV9zZWdtZW50X3QgZnM7CisJaW50IGksIHZhbDsKKworCS8qIGluaXRpYWxpemUgRERNQSBiYXNlIGFkZHJlc3MgKi8KKwlwcmludGsoS0VSTl9ERUJVRyAic29sbzE6IGRkbWEgYmFzZSBhZGRyZXNzOiAweCVseFxuIiwgcy0+ZGRtYWJhc2UpOworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIDB4NjAsIChzLT5kZG1hYmFzZSAmICh+MHhmKSkgfCAxKTsKKwkvKiBzZXQgRE1BIHBvbGljeSB0byBERE1BLCBJUlEgZW11bGF0aW9uIG9mZiAoQ0xLUlVOIGRpc2FibGVkIGZvciBub3cpICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIDB4NTAsIDApOworCS8qIGRpc2FibGUgbGVnYWN5IGF1ZGlvIGFkZHJlc3MgZGVjb2RlICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgMHg0MCwgMHg5MDdmKTsKKworCS8qIGluaXRpYWxpemUgdGhlIGNoaXBzICovCisJaWYgKCFyZXNldF9jdHJsKHMpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiZXNzc29sbzE6IGNhbm5vdCByZXNldCBjb250cm9sbGVyXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlvdXRiKDB4YjAsIHMtPmlvYmFzZSs3KTsgLyogZW5hYmxlIEExLCBBMiwgTVBVIGlycSdzICovCisJCisJLyogaW5pdGlhbGl6ZSBtaXhlciByZWdzICovCisJd3JpdGVfbWl4ZXIocywgMHg3ZiwgMCk7IC8qIGRpc2FibGUgbXVzaWMgZGlnaXRhbCByZWNvcmRpbmcgKi8KKwl3cml0ZV9taXhlcihzLCAweDdkLCAweDBjKTsgLyogZW5hYmxlIG1pYyBwcmVhbXAsIE1PTk9fT1VUIGlzIDJuZCBEQUMgcmlnaHQgY2hhbm5lbCAqLworCXdyaXRlX21peGVyKHMsIDB4NjQsIDB4NDUpOyAvKiB2b2x1bWUgY29udHJvbCAqLworCXdyaXRlX21peGVyKHMsIDB4NDgsIDB4MTApOyAvKiBlbmFibGUgbXVzaWMgREFDL0VTNnh4IGludGVyZmFjZSAqLworCXdyaXRlX21peGVyKHMsIDB4NTAsIDApOyAgLyogZGlzYWJsZSBzcGF0aWFsaXplciAqLworCXdyaXRlX21peGVyKHMsIDB4NTIsIDApOworCXdyaXRlX21peGVyKHMsIDB4MTQsIDApOyAgLyogREFDMSBtaW5pbXVtIHZvbHVtZSAqLworCXdyaXRlX21peGVyKHMsIDB4NzEsIDB4MjApOyAvKiBlbmFibGUgbmV3IDB4QTEgcmVnIGZvcm1hdCAqLworCW91dGIoMCwgcy0+ZGRtYWJhc2UrMHhkKTsgLyogRE1BIG1hc3RlciBjbGVhciAqLworCW91dGIoMSwgcy0+ZGRtYWJhc2UrMHhmKTsgLyogbWFzayBjaGFubmVsICovCisJLypvdXRiKDAsIHMtPmRkbWFiYXNlKzB4OCk7Ki8gLyogZW5hYmxlIGNvbnRyb2xsZXIgKGVuYWJsZSBpcyBsb3cgYWN0aXZlISEpICovCisKKwlwY2lfc2V0X21hc3RlcihwY2lkZXYpOyAgLyogZW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KKwkKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyhLRVJORUxfRFMpOworCXZhbCA9IFNPVU5EX01BU0tfTElORTsKKwltaXhlcl9pb2N0bChzLCBTT1VORF9NSVhFUl9XUklURV9SRUNTUkMsICh1bnNpZ25lZCBsb25nKSZ2YWwpOworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoaW5pdHZvbCkvc2l6ZW9mKGluaXR2b2xbMF0pOyBpKyspIHsKKwkJdmFsID0gaW5pdHZvbFtpXS52b2w7CisJCW1peGVyX2lvY3RsKHMsIGluaXR2b2xbaV0ubWl4Y2gsICh1bnNpZ25lZCBsb25nKSZ2YWwpOworCX0KKwl2YWwgPSAxOyAvKiBlbmFibGUgbWljIHByZWFtcCAqLworCW1peGVyX2lvY3RsKHMsIFNPVU5EX01JWEVSX1BSSVZBVEUxLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwlzZXRfZnMoZnMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citzb2xvMV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpIHsKKwlzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMgPSAoc3RydWN0IHNvbG8xX3N0YXRlKilwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisJaWYgKCFzKQorCQlyZXR1cm4gMTsKKwlvdXRiKDAsIHMtPmlvYmFzZSs2KTsKKwkvKiBETUEgbWFzdGVyIGNsZWFyICovCisJb3V0YigwLCBzLT5kZG1hYmFzZSsweGQpOyAKKwkvKiByZXNldCBzZXF1ZW5jZXIgYW5kIEZJRk8gKi8KKwlvdXRiKDMsIHMtPnNiYmFzZSs2KTsgCisJLyogdHVybiBvZmYgRERNQSBjb250cm9sbGVyIGFkZHJlc3Mgc3BhY2UgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocy0+ZGV2LCAweDYwLCAwKTsgCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3NvbG8xX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikgeworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc29sbzFfc3RhdGUqKXBjaV9nZXRfZHJ2ZGF0YShwY2lfZGV2KTsKKwlpZiAoIXMpCisJCXJldHVybiAxOworCXNldHVwX3NvbG8xKHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzb2xvMV9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3Qgc29sbzFfc3RhdGUgKnMsIGludCBpb19wb3J0KQoreworCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvX3BvcnQsIEdBTUVQT1JUX0VYVEVOVCwgIkVTUyBTb2xvMSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29sbzE6IGdhbWVwb3J0IGlvIHBvcnRzIGFyZSBpbiB1c2VcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CisJaWYgKCFncCkgeworCQlwcmludGsoS0VSTl9FUlIgInNvbG8xOiBjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3JlZ2lvbihpb19wb3J0LCBHQU1FUE9SVF9FWFRFTlQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIkVTUyBTb2xvMSBHYW1lcG9ydCIpOworCWdhbWVwb3J0X3NldF9waHlzKGdwLCAiaXNhJTA0eC9nYW1lcG9ydDAiLCBpb19wb3J0KTsKKwlncC0+ZGV2LnBhcmVudCA9ICZzLT5kZXYtPmRldjsKKwlncC0+aW8gPSBpb19wb3J0OworCisJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc29sbzFfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQoreworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqczsKKwlpbnQgZ3BpbzsKKwlpbnQgcmV0OworCisgCWlmICgocmV0PXBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpKQorCQlyZXR1cm4gcmV0OworCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDApICYgSU9SRVNPVVJDRV9JTykgfHwKKwkgICAgIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpZGV2LCAxKSAmIElPUkVTT1VSQ0VfSU8pIHx8CisJICAgICEocGNpX3Jlc291cmNlX2ZsYWdzKHBjaWRldiwgMikgJiBJT1JFU09VUkNFX0lPKSB8fAorCSAgICAhKHBjaV9yZXNvdXJjZV9mbGFncyhwY2lkZXYsIDMpICYgSU9SRVNPVVJDRV9JTykpCisJCXJldHVybiAtRU5PREVWOworCWlmIChwY2lkZXYtPmlycSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIFJlY29yZGluZyByZXF1aXJlcyAyNC1iaXQgRE1BLCBzbyBhdHRlbXB0IHRvIHNldCBkbWEgbWFzaworCSAqIHRvIDI0IGJpdHMgZmlyc3QsIHRoZW4gMzIgYml0cyAocGxheWJhY2sgb25seSkgaWYgdGhhdCBmYWlscy4KKwkgKi8KKwlpZiAocGNpX3NldF9kbWFfbWFzayhwY2lkZXYsIDB4MDBmZmZmZmYpICYmCisJICAgIHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCAweGZmZmZmZmZmKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzb2xvMTogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMjRiaXQgb3IgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoIShzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHNvbG8xX3N0YXRlKSwgR0ZQX0tFUk5FTCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvbG8xOiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IHNvbG8xX3N0YXRlKSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5pd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5vd2FpdCk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5tYWdpYyA9IFNPTE8xX01BR0lDOworCXMtPmRldiA9IHBjaWRldjsKKwlzLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKTsKKwlzLT5zYmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAxKTsKKwlzLT52Y2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAyKTsKKwlzLT5kZG1hYmFzZSA9IHMtPnZjYmFzZSArIERETUFCQVNFX09GRlNFVDsKKwlzLT5tcHViYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMyk7CisJZ3BpbyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDQpOworCXMtPmlycSA9IHBjaWRldi0+aXJxOworCXJldCA9IC1FQlVTWTsKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvYmFzZSwgSU9CQVNFX0VYVEVOVCwgIkVTUyBTb2xvMSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29sbzE6IGlvIHBvcnRzIGluIHVzZVxuIik7CisJCWdvdG8gZXJyX3JlZ2lvbjE7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24ocy0+c2JiYXNlK0ZNU1lOVEhfRVhURU5ULCBTQkJBU0VfRVhURU5ULUZNU1lOVEhfRVhURU5ULCAiRVNTIFNvbG8xIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb2xvMTogaW8gcG9ydHMgaW4gdXNlXG4iKTsKKwkJZ290byBlcnJfcmVnaW9uMjsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzLT5kZG1hYmFzZSwgRERNQUJBU0VfRVhURU5ULCAiRVNTIFNvbG8xIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb2xvMTogaW8gcG9ydHMgaW4gdXNlXG4iKTsKKwkJZ290byBlcnJfcmVnaW9uMzsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzLT5tcHViYXNlLCBNUFVCQVNFX0VYVEVOVCwgIkVTUyBTb2xvMSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29sbzE6IGlvIHBvcnRzIGluIHVzZVxuIik7CisJCWdvdG8gZXJyX3JlZ2lvbjQ7CisJfQorCWlmICgocmV0PXJlcXVlc3RfaXJxKHMtPmlycSxzb2xvMV9pbnRlcnJ1cHQsU0FfU0hJUlEsIkVTUyBTb2xvMSIscykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic29sbzE6IGlycSAldSBpbiB1c2VcbiIsIHMtPmlycSk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCWlmICgocy0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZzb2xvMV9hdWRpb19mb3BzLCAtMSkpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfYXVkaW87CisJCWdvdG8gZXJyX2RldjE7CisJfQorCWlmICgocy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJnNvbG8xX21peGVyX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXJldCA9IHMtPmRldl9taXhlcjsKKwkJZ290byBlcnJfZGV2MjsKKwl9CisJaWYgKChzLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJnNvbG8xX21pZGlfZm9wcywgLTEpKSA8IDApIHsKKwkJcmV0ID0gcy0+ZGV2X21pZGk7CisJCWdvdG8gZXJyX2RldjM7CisJfQorCWlmICgocy0+ZGV2X2RtZm0gPSByZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKCZzb2xvMV9kbWZtX2ZvcHMsIDE1IC8qID8/ICovKSkgPCAwKSB7CisJCXJldCA9IHMtPmRldl9kbWZtOworCQlnb3RvIGVycl9kZXY0OworCX0KKwlpZiAoc2V0dXBfc29sbzEocykpIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnI7CisJfQorCS8qIHJlZ2lzdGVyIGdhbWVwb3J0ICovCisJc29sbzFfcmVnaXN0ZXJfZ2FtZXBvcnQocywgZ3Bpbyk7CisJLyogc3RvcmUgaXQgaW4gdGhlIGRyaXZlciBmaWVsZCAqLworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHMpOworCXJldHVybiAwOworCisgZXJyOgorCXVucmVnaXN0ZXJfc291bmRfc3BlY2lhbChzLT5kZXZfZG1mbSk7CisgZXJyX2RldjQ6CisJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKHMtPmRldl9taWRpKTsKKyBlcnJfZGV2MzoKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmRldl9taXhlcik7CisgZXJyX2RldjI6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKyBlcnJfZGV2MToKKwlwcmludGsoS0VSTl9FUlIgInNvbG8xOiBpbml0aWFsaXNhdGlvbiBlcnJvclxuIik7CisJZnJlZV9pcnEocy0+aXJxLCBzKTsKKyBlcnJfaXJxOgorCXJlbGVhc2VfcmVnaW9uKHMtPm1wdWJhc2UsIE1QVUJBU0VfRVhURU5UKTsKKyBlcnJfcmVnaW9uNDoKKwlyZWxlYXNlX3JlZ2lvbihzLT5kZG1hYmFzZSwgRERNQUJBU0VfRVhURU5UKTsKKyBlcnJfcmVnaW9uMzoKKwlyZWxlYXNlX3JlZ2lvbihzLT5zYmJhc2UrRk1TWU5USF9FWFRFTlQsIFNCQkFTRV9FWFRFTlQtRk1TWU5USF9FWFRFTlQpOworIGVycl9yZWdpb24yOgorCXJlbGVhc2VfcmVnaW9uKHMtPmlvYmFzZSwgSU9CQVNFX0VYVEVOVCk7CisgZXJyX3JlZ2lvbjE6CisJa2ZyZWUocyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHNvbG8xX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBzb2xvMV9zdGF0ZSAqcyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCQorCWlmICghcykKKwkJcmV0dXJuOworCS8qIHN0b3AgRE1BIGNvbnRyb2xsZXIgKi8KKwlvdXRiKDAsIHMtPmlvYmFzZSs2KTsKKwlvdXRiKDAsIHMtPmRkbWFiYXNlKzB4ZCk7IC8qIERNQSBtYXN0ZXIgY2xlYXIgKi8KKwlvdXRiKDMsIHMtPnNiYmFzZSs2KTsgLyogcmVzZXQgc2VxdWVuY2VyIGFuZCBGSUZPICovCisJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHMtPmRldiwgMHg2MCwgMCk7IC8qIHR1cm4gb2ZmIERETUEgY29udHJvbGxlciBhZGRyZXNzIHNwYWNlICovCisJZnJlZV9pcnEocy0+aXJxLCBzKTsKKwlpZiAocy0+Z2FtZXBvcnQpIHsKKwkJaW50IGdwaW8gPSBzLT5nYW1lcG9ydC0+aW87CisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChzLT5nYW1lcG9ydCk7CisJCXJlbGVhc2VfcmVnaW9uKGdwaW8sIEdBTUVQT1JUX0VYVEVOVCk7CisJfQorCXJlbGVhc2VfcmVnaW9uKHMtPmlvYmFzZSwgSU9CQVNFX0VYVEVOVCk7CisJcmVsZWFzZV9yZWdpb24ocy0+c2JiYXNlK0ZNU1lOVEhfRVhURU5ULCBTQkJBU0VfRVhURU5ULUZNU1lOVEhfRVhURU5UKTsKKwlyZWxlYXNlX3JlZ2lvbihzLT5kZG1hYmFzZSwgRERNQUJBU0VfRVhURU5UKTsKKwlyZWxlYXNlX3JlZ2lvbihzLT5tcHViYXNlLCBNUFVCQVNFX0VYVEVOVCk7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmRldl9taXhlcik7CisJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKHMtPmRldl9taWRpKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX3NwZWNpYWwocy0+ZGV2X2RtZm0pOworCWtmcmVlKHMpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKwl7IFBDSV9WRU5ET1JfSURfRVNTLCBQQ0lfREVWSUNFX0lEX0VTU19TT0xPMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCB9LAorCXsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHNvbG8xX2RyaXZlciA9IHsKKwkubmFtZQkJPSAiRVNTIFNvbG8xIiwKKwkuaWRfdGFibGUJPSBpZF90YWJsZSwKKwkucHJvYmUJCT0gc29sbzFfcHJvYmUsCisJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChzb2xvMV9yZW1vdmUpLAorCS5zdXNwZW5kCT0gc29sbzFfc3VzcGVuZCwKKwkucmVzdW1lCQk9IHNvbG8xX3Jlc3VtZSwKK307CisKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zb2xvMSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gInNvbG8xOiB2ZXJzaW9uIHYwLjIwIHRpbWUgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIik7CisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnNvbG8xX2RyaXZlcik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgTS4gU2FpbGVyLCBzYWlsZXJAaWZlLmVlLmV0aHouY2gsIGhiOWpueEBoYjl3LmNoZS5ldSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFU1MgU29sbzEgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfc29sbzEodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJzb2xvMTogdW5sb2FkaW5nXG4iKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnNvbG8xX2RyaXZlcik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCittb2R1bGVfaW5pdChpbml0X3NvbG8xKTsKK21vZHVsZV9leGl0KGNsZWFudXBfc29sbzEpOworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZm9ydGUuYyBiL3NvdW5kL29zcy9mb3J0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MDZiYzkwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2ZvcnRlLmMKQEAgLTAsMCArMSwyMTM3IEBACisvKgorICogZm9ydGUuYyAtIEZvcnRlTWVkaWEgRk04MDEgT1NTIERyaXZlcgorICoKKyAqIFdyaXR0ZW4gYnkgTWFydGluIEsuIFBldGVyc2VuIDxta3BAbWtwLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICogUG9ydGlvbnMgQ29weXJpZ2h0IChDKSAyMDAzIE1hcnRpbiBLLiBQZXRlcnNlbgorICoKKyAqIExhdGVzdCB2ZXJzaW9uOiBodHRwOi8vbWtwLm5ldC9mb3J0ZS8KKyAqCisgKiBCYXNlZCB1cG9uIHRoZSBBTFNBIEZNODAxIGRyaXZlciBieSBKYXJvc2xhdiBLeXNlbGEgYW5kIE9TUyBkcml2ZXJzCisgKiBieSBUaG9tYXMgU2FpbGVyLCBBbGFuIENveCwgWmFjaCBCcm93biwgYW5kIEplZmYgR2FyemlrLiAgVGhhbmtzCisgKiBndXlzIQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqIDIgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKKyAqIFVTQQorICoKKyAqLworIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2RlZmluZSBEUklWRVJfTkFNRQkiZm9ydGUiCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OIAkiJElkOiBmb3J0ZS5jLHYgMS42MyAyMDAzLzAzLzAxIDA1OjMyOjQyIG1rcCBFeHAgJCIKKyNkZWZpbmUgUEZYIAkJRFJJVkVSX05BTUUgIjogIgorCisjdW5kZWYgTV9ERUJVRworCisjaWZkZWYgTV9ERUJVRworI2RlZmluZSBEUFJJTlRLKGFyZ3MuLi4pIHByaW50ayhLRVJOX1dBUk5JTkcgYXJncykKKyNlbHNlCisjZGVmaW5lIERQUklOVEsoYXJncy4uLikKKyNlbmRpZgorCisvKiBDYXJkIGNhcGFiaWxpdGllcyAqLworI2RlZmluZSBGT1JURV9DQVBTICAgICAgICAgICAgICAoRFNQX0NBUF9NTUFQIHwgRFNQX0NBUF9UUklHR0VSKQorCisvKiBTdXBwb3J0ZWQgYXVkaW8gZm9ybWF0cyAqLworI2RlZmluZSBGT1JURV9GTVRTCQkoQUZNVF9VOCB8IEFGTVRfUzE2X0xFKQorCisvKiBCdWZmZXJzICovCisjZGVmaW5lIEZPUlRFX01JTl9GUkFHX1NJWkUgICAgIDI1NgorI2RlZmluZSBGT1JURV9NQVhfRlJBR19TSVpFICAgICBQQUdFX1NJWkUKKyNkZWZpbmUgRk9SVEVfREVGX0ZSQUdfU0laRSAgICAgMjU2CisjZGVmaW5lIEZPUlRFX01JTl9GUkFHTUVOVFMgICAgIDIKKyNkZWZpbmUgRk9SVEVfTUFYX0ZSQUdNRU5UUyAgICAgMjU2CisjZGVmaW5lIEZPUlRFX0RFRl9GUkFHTUVOVFMgICAgIDIKKyNkZWZpbmUgRk9SVEVfTUlOX0JVRl9NU0VDUyAgICAgNTAwCisjZGVmaW5lIEZPUlRFX01BWF9CVUZfTVNFQ1MgICAgIDEwMDAKKworLyogUENJIEJBUnMgKi8KKyNkZWZpbmUgRk9SVEVfUENNX1ZPTCAgICAgICAgICAgMHgwMCAgICAvKiBQQ00gT3V0cHV0IFZvbHVtZSAqLworI2RlZmluZSBGT1JURV9GTV9WT0wgICAgICAgICAgICAweDAyICAgIC8qIEZNIE91dHB1dCBWb2x1bWUgKi8KKyNkZWZpbmUgRk9SVEVfSTJTX1ZPTCAgICAgICAgICAgMHgwNCAgICAvKiBJMlMgVm9sdW1lICovCisjZGVmaW5lIEZPUlRFX1JFQ19TUkMgICAgICAgICAgIDB4MDYgICAgLyogUmVjb3JkIFNvdXJjZSAqLworI2RlZmluZSBGT1JURV9QTFlfQ1RSTCAgICAgICAgICAweDA4ICAgIC8qIFBsYXliYWNrIENvbnRyb2wgKi8KKyNkZWZpbmUgRk9SVEVfUExZX0NPVU5UICAgICAgICAgMHgwYSAgICAvKiBQbGF5YmFjayBDb3VudCAqLworI2RlZmluZSBGT1JURV9QTFlfQlVGMSAgICAgICAgICAweDBjICAgIC8qIFBsYXliYWNrIEJ1ZmZlciBJICovCisjZGVmaW5lIEZPUlRFX1BMWV9CVUYyICAgICAgICAgIDB4MTAgICAgLyogUGxheWJhY2sgQnVmZmVyIElJICovCisjZGVmaW5lIEZPUlRFX0NBUF9DVFJMICAgICAgICAgIDB4MTQgICAgLyogQ2FwdHVyZSBDb250cm9sICovCisjZGVmaW5lIEZPUlRFX0NBUF9DT1VOVCAgICAgICAgIDB4MTYgICAgLyogQ2FwdHVyZSBDb3VudCAqLworI2RlZmluZSBGT1JURV9DQVBfQlVGMSAgICAgICAgICAweDE4ICAgIC8qIENhcHR1cmUgQnVmZmVyIEkgKi8KKyNkZWZpbmUgRk9SVEVfQ0FQX0JVRjIgICAgICAgICAgMHgxYyAgICAvKiBDYXB0dXJlIEJ1ZmZlciBJSSAqLworI2RlZmluZSBGT1JURV9DT0RFQ19DVFJMICAgICAgICAweDIyICAgIC8qIENvZGVjIENvbnRyb2wgKi8KKyNkZWZpbmUgRk9SVEVfSTJTX01PREUgICAgICAgICAgMHgyNCAgICAvKiBJMlMgTW9kZSBDb250cm9sICovCisjZGVmaW5lIEZPUlRFX1ZPTFVNRSAgICAgICAgICAgIDB4MjYgICAgLyogVm9sdW1lIFVwL0Rvd24vTXV0ZSBTdGF0dXMgKi8KKyNkZWZpbmUgRk9SVEVfSTJDX0NUUkwgICAgICAgICAgMHgyOSAgICAvKiBJMkMgQ29udHJvbCAqLworI2RlZmluZSBGT1JURV9BQzk3X0NNRCAgICAgICAgICAweDJhICAgIC8qIEFDJzk3IENvbW1hbmQgKi8KKyNkZWZpbmUgRk9SVEVfQUM5N19EQVRBICAgICAgICAgMHgyYyAgICAvKiBBQyc5NyBEYXRhICovCisjZGVmaW5lIEZPUlRFX01QVTQwMV9EQVRBICAgICAgIDB4MzAgICAgLyogTVBVNDAxIERhdGEgKi8KKyNkZWZpbmUgRk9SVEVfTVBVNDAxX0NNRCAgICAgICAgMHgzMSAgICAvKiBNUFU0MDEgQ29tbWFuZCAqLworI2RlZmluZSBGT1JURV9HUElPX0NUUkwgICAgICAgICAweDUyICAgIC8qIEdlbmVyYWwgUHVycG9zZSBJL08gQ29udHJvbCAqLworI2RlZmluZSBGT1JURV9HRU5fQ1RSTCAgICAgICAgICAweDU0ICAgIC8qIEdlbmVyYWwgQ29udHJvbCAqLworI2RlZmluZSBGT1JURV9JUlFfTUFTSyAgICAgICAgICAweDU2ICAgIC8qIEludGVycnVwdCBNYXNrICovCisjZGVmaW5lIEZPUlRFX0lSUV9TVEFUVVMgICAgICAgIDB4NWEgICAgLyogSW50ZXJydXB0IFN0YXR1cyAqLworI2RlZmluZSBGT1JURV9PUEwzX0JBTkswICAgICAgICAweDY4ICAgIC8qIE9QTDMgU3RhdHVzIFJlYWQgLyBCYW5rIDAgV3JpdGUgKi8KKyNkZWZpbmUgRk9SVEVfT1BMM19EQVRBMCAgICAgICAgMHg2OSAgICAvKiBPUEwzIERhdGEgMCBXcml0ZSAqLworI2RlZmluZSBGT1JURV9PUEwzX0JBTksxICAgICAgICAweDZhICAgIC8qIE9QTDMgQmFuayAxIFdyaXRlICovCisjZGVmaW5lIEZPUlRFX09QTDNfREFUQTEgICAgICAgIDB4NmIgICAgLyogT1BMMyBCYW5rIDEgV3JpdGUgKi8KKyNkZWZpbmUgRk9SVEVfUE9XRVJET1dOICAgICAgICAgMHg3MCAgICAvKiBCbG9ja3MgUG93ZXIgRG93biBDb250cm9sICovCisKKyNkZWZpbmUgRk9SVEVfQ0FQX09GRlNFVCAgICAgICAgRk9SVEVfQ0FQX0NUUkwgLSBGT1JURV9QTFlfQ1RSTAorCisjZGVmaW5lIEZPUlRFX0FDOTdfQUREUl9TSElGVCAgIDEwCisKKy8qIFBsYXliYWNrIGFuZCByZWNvcmQgY29udHJvbCByZWdpc3RlciBiaXRzICovCisjZGVmaW5lIEZPUlRFX0JVRjFfTEFTVCAgICAgICAgICgxPDwxKQorI2RlZmluZSBGT1JURV9CVUYyX0xBU1QgICAgICAgICAoMTw8MikKKyNkZWZpbmUgRk9SVEVfU1RBUlQgICAgICAgICAgICAgKDE8PDUpCisjZGVmaW5lIEZPUlRFX1BBVVNFICAgICAgICAgICAgICgxPDw2KQorI2RlZmluZSBGT1JURV9JTU1FRF9TVE9QICAgICAgICAoMTw8NykKKyNkZWZpbmUgRk9SVEVfUkFURV9TSElGVCAgICAgICAgOAorI2RlZmluZSBGT1JURV9SQVRFX01BU0sgICAgICAgICAoMTUgPDwgRk9SVEVfUkFURV9TSElGVCkKKyNkZWZpbmUgRk9SVEVfQ0hBTk5FTFNfNCAgICAgICAgKDE8PDEyKSAvKiBQbGF5YmFjayBvbmx5ICovCisjZGVmaW5lIEZPUlRFX0NIQU5ORUxTXzYgICAgICAgICgyPDwxMikgLyogUGxheWJhY2sgb25seSAqLworI2RlZmluZSBGT1JURV9DSEFOTkVMU182TVMgICAgICAoMzw8MTIpIC8qIFBsYXliYWNrIG9ubHkgKi8KKyNkZWZpbmUgRk9SVEVfQ0hBTk5FTFNfTUFTSyAgICAgKDM8PDEyKQorI2RlZmluZSBGT1JURV8xNkJJVCAgICAgICAgICAgICAoMTw8MTQpCisjZGVmaW5lIEZPUlRFX1NURVJFTyAgICAgICAgICAgICgxPDwxNSkKKworLyogSVJRIHN0YXR1cyBiaXRzICovCisjZGVmaW5lIEZPUlRFX0lSUV9QTEFZQkFDSyAgICAgICgxPDw4KQorI2RlZmluZSBGT1JURV9JUlFfQ0FQVFVSRSAgICAgICAoMTw8OSkKKyNkZWZpbmUgRk9SVEVfSVJRX1ZPTFVNRSAgICAgICAgKDE8PDE0KQorI2RlZmluZSBGT1JURV9JUlFfTVBVICAgICAgICAgICAoMTw8MTUpCisKKy8qIENPREVDIGNvbnRyb2wgKi8KKyNkZWZpbmUgRk9SVEVfQ0NfQ09ERUNfUkVTRVQgICAgKDE8PDUpCisjZGVmaW5lIEZPUlRFX0NDX0FDOTdfUkVTRVQgICAgICgxPDw2KQorCisvKiBBQzk3IGNtZCAqLworI2RlZmluZSBGT1JURV9BQzk3X1dSSVRFICAgICAgICAoMDw8NykKKyNkZWZpbmUgRk9SVEVfQUM5N19SRUFEICAgICAgICAgKDE8PDcpCisjZGVmaW5lIEZPUlRFX0FDOTdfRFBfSU5WQUxJRCAgICgwPDw4KQorI2RlZmluZSBGT1JURV9BQzk3X0RQX1ZBTElEICAgICAoMTw8OCkKKyNkZWZpbmUgRk9SVEVfQUM5N19QT1JUX1JEWSAgICAgKDA8PDkpCisjZGVmaW5lIEZPUlRFX0FDOTdfUE9SVF9CU1kgICAgICgxPDw5KQorCisKK3N0cnVjdCBmb3J0ZV9jaGFubmVsIHsKKyAgICAgICAgY29uc3QgY2hhciAJCSpuYW1lOworCisJdW5zaWduZWQgc2hvcnQJCWN0cmw7IAkJLyogQ3RybCBCQVIgY29udGVudHMgKi8KKwl1bnNpZ25lZCBsb25nIAkJaW9iYXNlOwkJLyogQ3RybCBCQVIgYWRkcmVzcyAqLworCisJd2FpdF9xdWV1ZV9oZWFkX3QJd2FpdDsKKworCXZvaWQgCQkJKmJ1ZjsgCQkvKiBCdWZmZXIgKi8KKwlkbWFfYWRkcl90CQlidWZfaGFuZGxlOyAJLyogQnVmZmVyIGhhbmRsZSAqLworCisgICAgICAgIHVuc2lnbmVkIGludCAJCXJlY29yZDsKKwl1bnNpZ25lZCBpbnQJCWZvcm1hdDsKKyAgICAgICAgdW5zaWduZWQgaW50CQlyYXRlOworCXVuc2lnbmVkIGludAkJc3RlcmVvOworCisJdW5zaWduZWQgaW50CQlmcmFnX3N6OyAJLyogQ3VycmVudCBmcmFnbWVudCBzaXplICovCisJdW5zaWduZWQgaW50CQlmcmFnX251bTsgCS8qIEN1cnJlbnQgIyBvZiBmcmFnbWVudHMgKi8KKwl1bnNpZ25lZCBpbnQJCWZyYWdfbXNlY3M7ICAgICAvKiBNaWxsaXNlY29uZHMgcGVyIGZyYWcgKi8KKwl1bnNpZ25lZCBpbnQJCWJ1Zl9zejsJCS8qIEN1cnJlbnQgYnVmZmVyIHNpemUgKi8KKworCXVuc2lnbmVkIGludAkJaHdwdHI7CQkvKiBUYWlsICovCisJdW5zaWduZWQgaW50CQlzd3B0cjsgCQkvKiBIZWFkICovCisJdW5zaWduZWQgaW50CQlmaWxsZWRfZnJhZ3M7IAkvKiBGcmFnbWVudHMgY3VycmVudGx5IGZ1bGwgKi8KKwl1bnNpZ25lZCBpbnQJCW5leHRfYnVmOwkvKiBJbmRleCBvZiBuZXh0IGJ1ZmZlciAqLworCisJdW5zaWduZWQgaW50CQlhY3RpdmU7CQkvKiBDaGFubmVsIGN1cnJlbnRseSBpbiB1c2UgKi8KKwl1bnNpZ25lZCBpbnQJCW1hcHBlZDsJCS8qIG1tYXAgKi8KKworCXVuc2lnbmVkIGludAkJYnVmX3BhZ2VzOwkvKiBSZWFsIHNpemUgb2YgYnVmZmVyICovCisJdW5zaWduZWQgaW50CQlucl9pcnFzOwkvKiBOdW1iZXIgb2YgaW50ZXJydXB0cyAqLworCXVuc2lnbmVkIGludAkJYnl0ZXM7CQkvKiBUb3RhbCBieXRlcyAqLworCXVuc2lnbmVkIGludAkJcmVzaWR1ZTsJLyogUGFydGlhbCBmcmFnbWVudCAqLworfTsKKworCitzdHJ1Y3QgZm9ydGVfY2hpcCB7CisJc3RydWN0IHBjaV9kZXYJCSpwY2lfZGV2OworCXVuc2lnbmVkIGxvbmcJCWlvYmFzZTsKKwlpbnQJCQlpcnE7CisKKwlzdHJ1Y3Qgc2VtYXBob3JlCW9wZW5fc2VtOyAJLyogRGV2aWNlIGFjY2VzcyAqLworCXNwaW5sb2NrX3QJCWxvY2s7CQkvKiBTdGF0ZSAqLworCisJc3BpbmxvY2tfdAkJYWM5N19sb2NrOworCXN0cnVjdCBhYzk3X2NvZGVjCSphYzk3OworCisJaW50CQkJbXVsdGljaGFubmVsOworCWludAkJCWRzcDsgCQkvKiBPU1MgaGFuZGxlICovCisJaW50ICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjsJLyogbW1hcCBJL08gdHJpZ2dlciAqLworCisJc3RydWN0IGZvcnRlX2NoYW5uZWwJcGxheTsKKwlzdHJ1Y3QgZm9ydGVfY2hhbm5lbAlyZWM7Cit9OworCisKK3N0YXRpYyBpbnQgY2hhbm5lbHNbXSA9IHsgMiwgNCwgNiwgfTsKK3N0YXRpYyBpbnQgcmF0ZXNbXSAgICA9IHsgNTUwMCwgODAwMCwgOTYwMCwgMTEwMjUsIDE2MDAwLCAxOTIwMCwgCisJCQkgIDIyMDUwLCAzMjAwMCwgMzg0MDAsIDQ0MTAwLCA0ODAwMCwgfTsKKworc3RhdGljIHN0cnVjdCBmb3J0ZV9jaGlwICpmb3J0ZTsKK3N0YXRpYyBpbnQgZm91bmQ7CisKKworLyogQUM5NyBDb2RlYyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qKiAKKyAqIGZvcnRlX2FjOTdfd2FpdDoKKyAqIEBjaGlwOglmbTgwMSBpbnN0YW5jZSB3aG9zZSBBQzk3IGNvZGVjIHRvIHdhaXQgb24KKyAqCisgKiBGSVhNRToKKyAqCQlTdG9wIGJ1c3ktd2FpdGluZworICovCisKK3N0YXRpYyBpbmxpbmUgaW50Citmb3J0ZV9hYzk3X3dhaXQgKHN0cnVjdCBmb3J0ZV9jaGlwICpjaGlwKQoreworCWludCBpID0gMTAwMDA7CisKKwl3aGlsZSAoIChpbncgKGNoaXAtPmlvYmFzZSArIEZPUlRFX0FDOTdfQ01EKSAmIEZPUlRFX0FDOTdfUE9SVF9CU1kpIAorCQkmJiBpLS0gKQorCQljcHVfcmVsYXgoKTsKKworCXJldHVybiBpID09IDA7Cit9CisKKworLyoqCisgKiBmb3J0ZV9hYzk3X3JlYWQ6CisgKiBAY29kZWM6CUFDOTcgY29kZWMgdG8gcmVhZCBmcm9tCisgKiBAcmVnOglyZWdpc3RlciB0byByZWFkCisgKi8KKworc3RhdGljIHUxNgorZm9ydGVfYWM5N19yZWFkIChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZykKK3sKKwl1MTYgcmV0ID0gMDsKKwlzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2sgKCZjaGlwLT5hYzk3X2xvY2spOworCisJLyogS25vY2ssIGtub2NrICovCisJaWYgKGZvcnRlX2FjOTdfd2FpdCAoY2hpcCkpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImFjOTdfcmVhZDogU2VyaWFsIGJ1cyBidXN5XG4iKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyogU2VuZCByZWFkIGNvbW1hbmQgKi8KKwlvdXR3IChyZWcgfCAoMTw8NyksIGNoaXAtPmlvYmFzZSArIEZPUlRFX0FDOTdfQ01EKTsKKworCWlmIChmb3J0ZV9hYzk3X3dhaXQgKGNoaXApKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJhYzk3X3JlYWQ6IEJ1cyBidXN5IHJlYWRpbmcgcmVnIDB4JXhcbiIsCisJCQlyZWcpOworCQlnb3RvIG91dDsKKwl9CisJCisJLyogU2FuaXR5IGNoZWNraW5nICovCisJaWYgKGludyAoY2hpcC0+aW9iYXNlICsgRk9SVEVfQUM5N19DTUQpICYgRk9SVEVfQUM5N19EUF9JTlZBTElEKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJhYzk3X3JlYWQ6IEludmFsaWQgZGF0YSBwb3J0Iik7CisJCWdvdG8gb3V0OworCX0KKworCS8qIEZldGNoIHJlc3VsdCAqLworCXJldCA9IGludyAoY2hpcC0+aW9iYXNlICsgRk9SVEVfQUM5N19EQVRBKTsKKworIG91dDoKKwlzcGluX3VubG9jayAoJmNoaXAtPmFjOTdfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworCisvKioKKyAqIGZvcnRlX2FjOTdfd3JpdGU6CisgKiBAY29kZWM6CUFDOTcgY29kZWMgdG8gc2VuZCBjb21tYW5kIHRvCisgKiBAcmVnOglyZWdpc3RlciB0byB3cml0ZQorICogQHZhbDoJdmFsdWUgdG8gd3JpdGUKKyAqLworCitzdGF0aWMgdm9pZAorZm9ydGVfYWM5N193cml0ZSAoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWwpCit7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXAgPSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCisJc3Bpbl9sb2NrICgmY2hpcC0+YWM5N19sb2NrKTsKKworCS8qIEtub2NrLCBrbm9jayAqLworCWlmIChmb3J0ZV9hYzk3X3dhaXQgKGNoaXApKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJhYzk3X3dyaXRlOiBTZXJpYWwgYnVzIGJ1c3lcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwlvdXR3ICh2YWwsIGNoaXAtPmlvYmFzZSArIEZPUlRFX0FDOTdfREFUQSk7CisJb3V0YiAocmVnIHwgRk9SVEVfQUM5N19XUklURSwgY2hpcC0+aW9iYXNlICsgRk9SVEVfQUM5N19DTUQpOworCisJLyogV2FpdCBmb3IgY29tcGxldGlvbiAqLworCWlmIChmb3J0ZV9hYzk3X3dhaXQgKGNoaXApKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJhYzk3X3dyaXRlOiBCdXMgYnVzeSBhZnRlciB3cml0ZVxuIik7CisJCWdvdG8gb3V0OworCX0KKworIG91dDoKKwlzcGluX3VubG9jayAoJmNoaXAtPmFjOTdfbG9jayk7Cit9CisKKworLyogTWl4ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qKgorICogZm9ydGVfbWl4ZXJfb3BlbjoKKyAqIEBpbm9kZToJCQorICogQGZpbGU6CQkKKyAqLworCitzdGF0aWMgaW50Citmb3J0ZV9taXhlcl9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcCA9IGZvcnRlOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNoaXAtPmFjOTc7CisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBmb3J0ZV9taXhlcl9yZWxlYXNlOgorICogQGlub2RlOgkJCisgKiBAZmlsZToJCQorICovCisKK3N0YXRpYyBpbnQKK2ZvcnRlX21peGVyX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCS8qIFdlIHdpbGwgd2VsZWFzZSBXb2Rld2ljayAqLworCXJldHVybiAwOworfQorCisKKy8qKgorICogZm9ydGVfbWl4ZXJfaW9jdGw6CisgKiBAaW5vZGU6CQkKKyAqIEBmaWxlOgkJCisgKi8KKworc3RhdGljIGludAorZm9ydGVfbWl4ZXJfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCAKKwkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwgKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZm9ydGVfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgICAgICAgICAJPSBub19sbHNlZWssCisJLmlvY3RsICAgICAgICAgIAk9IGZvcnRlX21peGVyX2lvY3RsLAorCS5vcGVuICAgICAgICAgICAJPSBmb3J0ZV9taXhlcl9vcGVuLAorCS5yZWxlYXNlICAgICAgICAJPSBmb3J0ZV9taXhlcl9yZWxlYXNlLAorfTsKKworCisvKiBDaGFubmVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKiAKKyAqIGZvcnRlX2NoYW5uZWxfcmVzZXQ6CisgKiBAY2hhbm5lbDoJQ2hhbm5lbCB0byByZXNldAorICogCisgKiBMb2NraW5nOglNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgdm9pZAorZm9ydGVfY2hhbm5lbF9yZXNldCAoc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLT5pb2Jhc2UpCisJCXJldHVybjsKKworCURQUklOVEsgKCIlczogY2hhbm5lbCA9ICVzXG4iLCBfX0ZVTkNUSU9OX18sIGNoYW5uZWwtPm5hbWUpOworCisJY2hhbm5lbC0+Y3RybCAmPSB+Rk9SVEVfU1RBUlQ7CisJb3V0dyAoY2hhbm5lbC0+Y3RybCwgY2hhbm5lbC0+aW9iYXNlICsgRk9SVEVfUExZX0NUUkwpOworCQorCS8qIFdlIGFsd2F5cyBwbGF5IGF0IGxlYXN0IHR3byBmcmFnbWVudHMsIGhlbmNlIHRoZXNlIGRlZmF1bHRzICovCisgCWNoYW5uZWwtPmh3cHRyID0gY2hhbm5lbC0+ZnJhZ19zejsKKwljaGFubmVsLT5uZXh0X2J1ZiA9IDE7CisJY2hhbm5lbC0+c3dwdHIgPSAwOworCWNoYW5uZWwtPmZpbGxlZF9mcmFncyA9IDA7CisJY2hhbm5lbC0+YWN0aXZlID0gMDsKKwljaGFubmVsLT5ieXRlcyA9IDA7CisJY2hhbm5lbC0+bnJfaXJxcyA9IDA7CisJY2hhbm5lbC0+bWFwcGVkID0gMDsKKwljaGFubmVsLT5yZXNpZHVlID0gMDsKK30KKworCisvKiogCisgKiBmb3J0ZV9jaGFubmVsX3N0YXJ0OgorICogQGNoYW5uZWw6IAlDaGFubmVsIHRvIHN0YXJ0IChyZWNvcmQvcGxheWJhY2spCisgKgorICogTG9ja2luZzoJTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQgaW5saW5lCitmb3J0ZV9jaGFubmVsX3N0YXJ0IChzdHJ1Y3QgZm9ydGVfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwtPmlvYmFzZSB8fCBjaGFubmVsLT5hY3RpdmUpIAorCQlyZXR1cm47CisKKwljaGFubmVsLT5jdHJsICY9IH4oRk9SVEVfUEFVU0UgfCBGT1JURV9CVUYxX0xBU1QgfCBGT1JURV9CVUYyX0xBU1QKKwkJCSAgIHwgRk9SVEVfSU1NRURfU1RPUCk7CisJY2hhbm5lbC0+Y3RybCB8PSBGT1JURV9TVEFSVDsKKwljaGFubmVsLT5hY3RpdmUgPSAxOworCW91dHcgKGNoYW5uZWwtPmN0cmwsIGNoYW5uZWwtPmlvYmFzZSArIEZPUlRFX1BMWV9DVFJMKTsKK30KKworCisvKiogCisgKiBmb3J0ZV9jaGFubmVsX3N0b3A6CisgKiBAY2hhbm5lbDogCUNoYW5uZWwgdG8gc3RvcAorICoKKyAqIExvY2tpbmc6CU11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIGlubGluZQorZm9ydGVfY2hhbm5lbF9zdG9wIChzdHJ1Y3QgZm9ydGVfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwtPmlvYmFzZSkgCisJCXJldHVybjsKKworCWNoYW5uZWwtPmN0cmwgJj0gfihGT1JURV9TVEFSVCB8IEZPUlRFX1BBVVNFKTsJCisJY2hhbm5lbC0+Y3RybCB8PSBGT1JURV9JTU1FRF9TVE9QOworCisJY2hhbm5lbC0+YWN0aXZlID0gMDsKKwlvdXR3IChjaGFubmVsLT5jdHJsLCBjaGFubmVsLT5pb2Jhc2UgKyBGT1JURV9QTFlfQ1RSTCk7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9wYXVzZToKKyAqIEBjaGFubmVsOiAJQ2hhbm5lbCB0byBwYXVzZQorICoKKyAqIExvY2tpbmc6CU11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyB2b2lkIGlubGluZQorZm9ydGVfY2hhbm5lbF9wYXVzZSAoc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLT5pb2Jhc2UpIAorCQlyZXR1cm47CisKKwljaGFubmVsLT5jdHJsIHw9IEZPUlRFX1BBVVNFOworCisJY2hhbm5lbC0+YWN0aXZlID0gMDsKKwlvdXR3IChjaGFubmVsLT5jdHJsLCBjaGFubmVsLT5pb2Jhc2UgKyBGT1JURV9QTFlfQ1RSTCk7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9yYXRlOgorICogQGNoYW5uZWw6IAlDaGFubmVsIHdob3NlIHJhdGUgdG8gc2V0LiAgUGxheWJhY2sgYW5kIHJlY29yZCBhcmUKKyAqICAgICAgICAgICAJaW5kZXBlbmRlbnQuCisgKiBAcmF0ZTogICAgCUNoYW5uZWwgcmF0ZSBpbiBIegorICoKKyAqIExvY2tpbmc6CU11c3QgYmUgY2FsbGVkIHdpdGggbG9jayBoZWxkLgorICovCisKK3N0YXRpYyBpbnQKK2ZvcnRlX2NoYW5uZWxfcmF0ZSAoc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwsIHVuc2lnbmVkIGludCByYXRlKQoreworCWludCBuZXdfcmF0ZTsKKworCWlmICghY2hhbm5lbCB8fCAhY2hhbm5lbC0+aW9iYXNlKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBUaGUgRk04MDEgb25seSBzdXBwb3J0cyBhIGhhbmRmdWwgb2YgZml4ZWQgZnJlcXVlbmNpZXMuCisJICogV2UgZmluZCB0aGUgdmFsdWUgY2xvc2VzdCB0byB3aGF0IHVzZXJsYW5kIHJlcXVlc3RlZC4KKwkgKi8KKwlpZiAgICAgIChyYXRlIDw9IDYyNTApICB7IHJhdGUgPSA1NTAwOyAgbmV3X3JhdGUgPSAgMDsgfQorCWVsc2UgaWYgKHJhdGUgPD0gODgwMCkgIHsgcmF0ZSA9IDgwMDA7ICBuZXdfcmF0ZSA9ICAxOyB9CisJZWxzZSBpZiAocmF0ZSA8PSAxMDMxMikgeyByYXRlID0gOTYwMDsgIG5ld19yYXRlID0gIDI7IH0KKwllbHNlIGlmIChyYXRlIDw9IDEzNTEyKSB7IHJhdGUgPSAxMTAyNTsgbmV3X3JhdGUgPSAgMzsgfQorCWVsc2UgaWYgKHJhdGUgPD0gMTc2MDApIHsgcmF0ZSA9IDE2MDAwOyBuZXdfcmF0ZSA9ICA0OyB9CisJZWxzZSBpZiAocmF0ZSA8PSAyMDYyNSkgeyByYXRlID0gMTkyMDA7IG5ld19yYXRlID0gIDU7IH0KKwllbHNlIGlmIChyYXRlIDw9IDI3MDI1KSB7IHJhdGUgPSAyMjA1MDsgbmV3X3JhdGUgPSAgNjsgfQorCWVsc2UgaWYgKHJhdGUgPD0gMzUyMDApIHsgcmF0ZSA9IDMyMDAwOyBuZXdfcmF0ZSA9ICA3OyB9CisJZWxzZSBpZiAocmF0ZSA8PSA0MTI1MCkgeyByYXRlID0gMzg0MDA7IG5ld19yYXRlID0gIDg7IH0KKwllbHNlIGlmIChyYXRlIDw9IDQ2MDUwKSB7IHJhdGUgPSA0NDEwMDsgbmV3X3JhdGUgPSAgOTsgfQorCWVsc2UgICAgICAgICAgICAgICAgICAgIHsgcmF0ZSA9IDQ4MDAwOyBuZXdfcmF0ZSA9IDEwOyB9CisKKwljaGFubmVsLT5jdHJsICY9IH5GT1JURV9SQVRFX01BU0s7CisJY2hhbm5lbC0+Y3RybCB8PSBuZXdfcmF0ZSA8PCBGT1JURV9SQVRFX1NISUZUOworCWNoYW5uZWwtPnJhdGUgPSByYXRlOworCisJRFBSSU5USyAoIiVzOiAlcyByYXRlID0gJWRcbiIsIF9fRlVOQ1RJT05fXywgY2hhbm5lbC0+bmFtZSwgcmF0ZSk7CisKKwlyZXR1cm4gcmF0ZTsKK30KKworCisvKiogCisgKiBmb3J0ZV9jaGFubmVsX2Zvcm1hdDoKKyAqIEBjaGFubmVsOiAJQ2hhbm5lbCB3aG9zZSBhdWRpbyBmb3JtYXQgdG8gc2V0CisgKiBAZm9ybWF0OiAgCU9TUyBmb3JtYXQgSUQKKyAqCisgKiBMb2NraW5nOglNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2sgaGVsZC4KKyAqLworCitzdGF0aWMgaW50Citmb3J0ZV9jaGFubmVsX2Zvcm1hdCAoc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwsIGludCBmb3JtYXQpCit7CisJaWYgKCFjaGFubmVsIHx8ICFjaGFubmVsLT5pb2Jhc2UpIAorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZm9ybWF0KSB7CisKKwljYXNlIEFGTVRfUVVFUlk6CisJCWJyZWFrOworCQorCWNhc2UgQUZNVF9VODoKKwkJY2hhbm5lbC0+Y3RybCAmPSB+Rk9SVEVfMTZCSVQ7CisJCWNoYW5uZWwtPmZvcm1hdCA9IEFGTVRfVTg7CisJCWJyZWFrOworCisJY2FzZSBBRk1UX1MxNl9MRToKKwlkZWZhdWx0OgorCQljaGFubmVsLT5jdHJsIHw9IEZPUlRFXzE2QklUOworCQljaGFubmVsLT5mb3JtYXQgPSBBRk1UX1MxNl9MRTsKKwkJYnJlYWs7CisJfQorCisJRFBSSU5USyAoIiVzOiAlcyB3YW50ICVkIGZvcm1hdCwgZ290ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGNoYW5uZWwtPm5hbWUsIAorCQkgZm9ybWF0LCBjaGFubmVsLT5mb3JtYXQpOworCisJcmV0dXJuIGNoYW5uZWwtPmZvcm1hdDsKK30KKworCisvKiogCisgKiBmb3J0ZV9jaGFubmVsX3N0ZXJlbzoKKyAqIEBjaGFubmVsOiAJQ2hhbm5lbCB0byB0b2dnbGUKKyAqIEBzdGVyZW86ICAJMCBmb3IgTW9ubywgMSBmb3IgU3RlcmVvCisgKgorICogTG9ja2luZzoJTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIGludAorZm9ydGVfY2hhbm5lbF9zdGVyZW8gKHN0cnVjdCBmb3J0ZV9jaGFubmVsICpjaGFubmVsLCB1bnNpZ25lZCBpbnQgc3RlcmVvKQoreworCWludCByZXQ7CisKKwlpZiAoIWNoYW5uZWwgfHwgIWNoYW5uZWwtPmlvYmFzZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlEUFJJTlRLICgiJXM6ICVzIHN0ZXJlbyA9ICVkXG4iLCBfX0ZVTkNUSU9OX18sIGNoYW5uZWwtPm5hbWUsIHN0ZXJlbyk7CisKKwlzd2l0Y2ggKHN0ZXJlbykgeworCisJY2FzZSAwOgorCQljaGFubmVsLT5jdHJsICY9IH4oRk9SVEVfU1RFUkVPIHwgRk9SVEVfQ0hBTk5FTFNfTUFTSyk7CisJCWNoYW5uZWwtPiBzdGVyZW8gPSBzdGVyZW87CisJCXJldCA9IHN0ZXJlbzsKKwkJYnJlYWs7CisKKwljYXNlIDE6CisJCWNoYW5uZWwtPmN0cmwgJj0gfkZPUlRFX0NIQU5ORUxTX01BU0s7CisJCWNoYW5uZWwtPmN0cmwgfD0gRk9SVEVfU1RFUkVPOworCQljaGFubmVsLT4gc3RlcmVvID0gc3RlcmVvOworCQlyZXQgPSBzdGVyZW87CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFBSSU5USyAoIlVuc3VwcG9ydGVkIGNoYW5uZWwgZm9ybWF0Iik7CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9idWZmZXI6CisgKiBAY2hhbm5lbDoJQ2hhbm5lbCB3aG9zZSBidWZmZXIgdG8gc2V0IHVwCisgKgorICogTG9ja2luZzoJTXVzdCBiZSBjYWxsZWQgd2l0aCBsb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQKK2ZvcnRlX2NoYW5uZWxfYnVmZmVyIChzdHJ1Y3QgZm9ydGVfY2hhbm5lbCAqY2hhbm5lbCwgaW50IHN6LCBpbnQgbnVtKQoreworCXVuc2lnbmVkIGludCBtc2Vjcywgc2hpZnQ7CisKKwkvKiBHbyBhd2F5LCBJJ20gYnVzeSAqLworCWlmIChjaGFubmVsLT5maWxsZWRfZnJhZ3MgfHwgY2hhbm5lbC0+Ynl0ZXMpCisJCXJldHVybjsKKworCS8qIEZyYWdtZW50IHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KKwlzaGlmdCA9IDA7IHN6Kys7CisJd2hpbGUgKHN6ID4+PSAxKQorCQlzaGlmdCsrOworCWNoYW5uZWwtPmZyYWdfc3ogPSAxIDw8IHNoaWZ0OworCisJLyogUm91bmQgZnJhZ21lbnQgc2l6ZSB0byBzb21ldGhpbmcgcmVhc29uYWJsZSAqLworCWlmIChjaGFubmVsLT5mcmFnX3N6IDwgRk9SVEVfTUlOX0ZSQUdfU0laRSkKKwkJY2hhbm5lbC0+ZnJhZ19zeiA9IEZPUlRFX01JTl9GUkFHX1NJWkU7CisKKwlpZiAoY2hhbm5lbC0+ZnJhZ19zeiA+IEZPUlRFX01BWF9GUkFHX1NJWkUpCisJCWNoYW5uZWwtPmZyYWdfc3ogPSBGT1JURV9NQVhfRlJBR19TSVpFOworCisJLyogRmluZCBmcmFnbWVudCBsZW5ndGggaW4gbWlsbGlzZWNvbmRzICovCisJbXNlY3MgPSBjaGFubmVsLT5mcmFnX3N6IC8KKwkJKGNoYW5uZWwtPmZvcm1hdCA9PSBBRk1UX1MxNl9MRSA/IDIgOiAxKSAvCisJCShjaGFubmVsLT5zdGVyZW8gPyAyIDogMSkgLworCQkoY2hhbm5lbC0+cmF0ZSAvIDEwMDApOworCisJY2hhbm5lbC0+ZnJhZ19tc2VjcyA9IG1zZWNzOworCisJLyogUGljayBhIHN1aXRhYmxlIG51bWJlciBvZiBmcmFnbWVudHMgKi8KKwlpZiAobXNlY3MgKiBudW0gPCBGT1JURV9NSU5fQlVGX01TRUNTKQorCSAgICAgbnVtID0gRk9SVEVfTUlOX0JVRl9NU0VDUyAvIG1zZWNzOworCisJaWYgKG1zZWNzICogbnVtID4gRk9SVEVfTUFYX0JVRl9NU0VDUykKKwkgICAgIG51bSA9IEZPUlRFX01BWF9CVUZfTVNFQ1MgLyBtc2VjczsKKworCS8qIEZyYWdtZW50IG51bWJlciBtdXN0IGJlIGEgcG93ZXIgb2YgMiAqLworCXNoaWZ0ID0gMDsJCisJd2hpbGUgKG51bSA+Pj0gMSkKKwkJc2hpZnQrKzsKKwljaGFubmVsLT5mcmFnX251bSA9IDEgPDwgKHNoaWZ0ICsgMSk7CisKKwkvKiBSb3VuZCBmcmFnbWVudCBudW1iZXIgdG8gc29tZXRoaW5nIHJlYXNvbmFibGUgKi8KKwlpZiAoY2hhbm5lbC0+ZnJhZ19udW0gPCBGT1JURV9NSU5fRlJBR01FTlRTKQorCQljaGFubmVsLT5mcmFnX251bSA9IEZPUlRFX01JTl9GUkFHTUVOVFM7CisKKwlpZiAoY2hhbm5lbC0+ZnJhZ19udW0gPiBGT1JURV9NQVhfRlJBR01FTlRTKQorCQljaGFubmVsLT5mcmFnX251bSA9IEZPUlRFX01BWF9GUkFHTUVOVFM7CisKKwljaGFubmVsLT5idWZfc3ogPSBjaGFubmVsLT5mcmFnX3N6ICogY2hhbm5lbC0+ZnJhZ19udW07CisKKwlEUFJJTlRLICgiJXM6ICVzIGZyYWdfc3ogPSAlZCwgZnJhZ19udW0gPSAlZCwgYnVmX3N6ID0gJWRcbiIsCisJCSBfX0ZVTkNUSU9OX18sIGNoYW5uZWwtPm5hbWUsIGNoYW5uZWwtPmZyYWdfc3osIAorCQkgY2hhbm5lbC0+ZnJhZ19udW0sIGNoYW5uZWwtPmJ1Zl9zeik7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9wcmVwOgorICogQGNoYW5uZWw6CUNoYW5uZWwgd2hvc2UgYnVmZmVyIHRvIHByZXBhcmUKKyAqCisgKiBMb2NraW5nOglMb2NrIGhlbGQuCisgKi8KKworc3RhdGljIHZvaWQKK2ZvcnRlX2NoYW5uZWxfcHJlcCAoc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJaW50IGk7CisJCisJaWYgKGNoYW5uZWwtPmJ1ZikKKwkJcmV0dXJuOworCisJZm9ydGVfY2hhbm5lbF9idWZmZXIgKGNoYW5uZWwsIGNoYW5uZWwtPmZyYWdfc3osIGNoYW5uZWwtPmZyYWdfbnVtKTsKKwljaGFubmVsLT5idWZfcGFnZXMgPSBjaGFubmVsLT5idWZfc3ogPj4gUEFHRV9TSElGVDsKKworCWlmIChjaGFubmVsLT5idWZfc3ogJSBQQUdFX1NJWkUpCisJCWNoYW5uZWwtPmJ1Zl9wYWdlcysrOworCisJRFBSSU5USyAoIiVzOiAlcyBmcmFnX3N6ID0gJWQsIGZyYWdfbnVtID0gJWQsIGJ1Zl9zeiA9ICVkLCBwZyA9ICVkXG4iLCAKKwkJIF9fRlVOQ1RJT05fXywgY2hhbm5lbC0+bmFtZSwgY2hhbm5lbC0+ZnJhZ19zeiwgCisJCSBjaGFubmVsLT5mcmFnX251bSwgY2hhbm5lbC0+YnVmX3N6LCBjaGFubmVsLT5idWZfcGFnZXMpOworCisJLyogRE1BIGJ1ZmZlciAqLworCWNoYW5uZWwtPmJ1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50IChmb3J0ZS0+cGNpX2RldiwgCisJCQkJCSAgICAgY2hhbm5lbC0+YnVmX3BhZ2VzICogUEFHRV9TSVpFLAorCQkJCQkgICAgICZjaGFubmVsLT5idWZfaGFuZGxlKTsKKworCWlmICghY2hhbm5lbC0+YnVmIHx8ICFjaGFubmVsLT5idWZfaGFuZGxlKQorCQlCVUcoKTsKKworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKGNoYW5uZWwtPmJ1Zik7CisJCisJLyogRklYTUU6IGNhbiB0aGlzIGdvIGF3YXkgPyAqLworCWZvciAoaSA9IDAgOyBpIDwgY2hhbm5lbC0+YnVmX3BhZ2VzIDsgaSsrKQorCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSsrKTsKKworCS8qIFByZXAgYnVmZmVyIHJlZ2lzdGVycyAqLworCW91dHcgKGNoYW5uZWwtPmZyYWdfc3ogLSAxLCBjaGFubmVsLT5pb2Jhc2UgKyBGT1JURV9QTFlfQ09VTlQpOworCW91dGwgKGNoYW5uZWwtPmJ1Zl9oYW5kbGUsIGNoYW5uZWwtPmlvYmFzZSArIEZPUlRFX1BMWV9CVUYxKTsKKwlvdXRsIChjaGFubmVsLT5idWZfaGFuZGxlICsgY2hhbm5lbC0+ZnJhZ19zeiwgCisJICAgICAgY2hhbm5lbC0+aW9iYXNlICsgRk9SVEVfUExZX0JVRjIpOworCisJLyogUmVzZXQgaHdwdHIgKi8KKyAJY2hhbm5lbC0+aHdwdHIgPSBjaGFubmVsLT5mcmFnX3N6OworCWNoYW5uZWwtPm5leHRfYnVmID0gMTsKKworCURQUklOVEsgKCIlczogJXMgYnVmZmVyIEAgJXAgKCVwKVxuIiwgX19GVU5DVElPTl9fLCBjaGFubmVsLT5uYW1lLCAKKwkJIGNoYW5uZWwtPmJ1ZiwgY2hhbm5lbC0+YnVmX2hhbmRsZSk7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9kcmFpbjoKKyAqIEBjaGlwOgkKKyAqIEBjaGFubmVsOgkKKyAqCisgKiBMb2NraW5nOglEb24ndCBob2xkIHRoZSBsb2NrLgorICovCisKK3N0YXRpYyBpbmxpbmUgaW50Citmb3J0ZV9jaGFubmVsX2RyYWluIChzdHJ1Y3QgZm9ydGVfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSAod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCURQUklOVEsgKCIlc1xuIiwgX19GVU5DVElPTl9fKTsKKworCWlmIChjaGFubmVsLT5tYXBwZWQpIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUgKCZmb3J0ZS0+bG9jaywgZmxhZ3MpOworCQlmb3J0ZV9jaGFubmVsX3N0b3AgKGNoYW5uZWwpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZm9ydGUtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUgKCZmb3J0ZS0+bG9jaywgZmxhZ3MpOworCWFkZF93YWl0X3F1ZXVlICgmY2hhbm5lbC0+d2FpdCwgJndhaXQpOworCisJZm9yICg7OykgeworCQlpZiAoY2hhbm5lbC0+YWN0aXZlID09IDAgfHwgY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzID09IDEpCisJCQlicmVhazsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmZm9ydGUtPmxvY2ssIGZsYWdzKTsKKworCQlfX3NldF9jdXJyZW50X3N0YXRlIChUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZSgpOworCisJCXNwaW5fbG9ja19pcnFzYXZlICgmZm9ydGUtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlmb3J0ZV9jaGFubmVsX3N0b3AgKGNoYW5uZWwpOworCWZvcnRlX2NoYW5uZWxfcmVzZXQgKGNoYW5uZWwpOworCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlICgmY2hhbm5lbC0+d2FpdCwgJndhaXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZmb3J0ZS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqIAorICogZm9ydGVfY2hhbm5lbF9pbml0OgorICogQGNoaXA6IAlGb3J0ZSBjaGlwIGluc3RhbmNlIHRoZSBjaGFubmVsIGhhbmdzIG9mZgorICogQGNoYW5uZWw6IAlDaGFubmVsIHRvIGluaXRpYWxpemUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCSAgICAgICAgSW5pdGlhbGl6ZXMgYSBjaGFubmVsLCBzZXRzIGRlZmF1bHRzLCBhbmQgYWxsb2NhdGVzCisgKgkgICAgICAgIGJ1ZmZlcnMuCisgKgorICogTG9ja2luZzoJTm8gbG9jayBoZWxkLgorICovCisKK3N0YXRpYyBpbnQKK2ZvcnRlX2NoYW5uZWxfaW5pdCAoc3RydWN0IGZvcnRlX2NoaXAgKmNoaXAsIHN0cnVjdCBmb3J0ZV9jaGFubmVsICpjaGFubmVsKQoreworCURQUklOVEsgKCIlczogY2hpcCBpb2Jhc2UgQCAlcFxuIiwgX19GVU5DVElPTl9fLCAodm9pZCAqKWNoaXAtPmlvYmFzZSk7CisKKwlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisJbWVtc2V0IChjaGFubmVsLCAweDAsIHNpemVvZiAoKmNoYW5uZWwpKTsKKworCWlmIChjaGFubmVsID09ICZjaGlwLT5wbGF5KSB7CisJCWNoYW5uZWwtPm5hbWUgPSAiUENNX09VVCI7CisJCWNoYW5uZWwtPmlvYmFzZSA9IGNoaXAtPmlvYmFzZTsKKwkJRFBSSU5USyAoIiVzOiBQQ00tT1VUIGlvYmFzZSBAICVwXG4iLCBfX0ZVTkNUSU9OX18sCisJCQkgKHZvaWQgKikgY2hhbm5lbC0+aW9iYXNlKTsKKwl9CisJZWxzZSBpZiAoY2hhbm5lbCA9PSAmY2hpcC0+cmVjKSB7CisJCWNoYW5uZWwtPm5hbWUgPSAiUENNX0lOIjsKKwkJY2hhbm5lbC0+aW9iYXNlID0gY2hpcC0+aW9iYXNlICsgRk9SVEVfQ0FQX09GRlNFVDsKKwkJY2hhbm5lbC0+cmVjb3JkID0gMTsKKwkJRFBSSU5USyAoIiVzOiBQQ00tSU4gaW9iYXNlIEAgJXBcbiIsIF9fRlVOQ1RJT05fXywgCisJCQkgKHZvaWQgKikgY2hhbm5lbC0+aW9iYXNlKTsKKwl9CisJZWxzZQorCQlCVUcoKTsKKworCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZjaGFubmVsLT53YWl0KTsKKworCS8qIERlZmF1bHRzOiA0OGtIeiwgMTYtYml0LCBzdGVyZW8gKi8KKwljaGFubmVsLT5jdHJsID0gaW53IChjaGFubmVsLT5pb2Jhc2UgKyBGT1JURV9QTFlfQ1RSTCk7CisJZm9ydGVfY2hhbm5lbF9yZXNldCAoY2hhbm5lbCk7CisJZm9ydGVfY2hhbm5lbF9zdGVyZW8gKGNoYW5uZWwsIDEpOworCWZvcnRlX2NoYW5uZWxfZm9ybWF0IChjaGFubmVsLCBBRk1UX1MxNl9MRSk7CisJZm9ydGVfY2hhbm5lbF9yYXRlIChjaGFubmVsLCA0ODAwMCk7CisJY2hhbm5lbC0+ZnJhZ19zeiA9IEZPUlRFX0RFRl9GUkFHX1NJWkU7CisJY2hhbm5lbC0+ZnJhZ19udW0gPSBGT1JURV9ERUZfRlJBR01FTlRTOworCisJY2hpcC0+dHJpZ2dlciA9IDA7CisJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiogCisgKiBmb3J0ZV9jaGFubmVsX2ZyZWU6CisgKiBAY2hpcDoJQ2hpcCB0aGlzIGNoYW5uZWwgaGFuZ3Mgb2ZmCisgKiBAY2hhbm5lbDoJQ2hhbm5lbCB0byBudWtlIAorICoKKyAqIERlc2NyaXB0aW9uOgorICogCQlSZXNldHMgY2hhbm5lbCBhbmQgZnJlZXMgYnVmZmVycy4KKyAqCisgKiBMb2NraW5nOglIb2xkIHlvdXIgaG9yc2VzLgorICovCisKK3N0YXRpYyB2b2lkCitmb3J0ZV9jaGFubmVsX2ZyZWUgKHN0cnVjdCBmb3J0ZV9jaGlwICpjaGlwLCBzdHJ1Y3QgZm9ydGVfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlEUFJJTlRLICgiJXM6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIGNoYW5uZWwtPm5hbWUpOworCisJaWYgKCFjaGFubmVsLT5idWZfaGFuZGxlKQorCQlyZXR1cm47CisKKwlwY2lfZnJlZV9jb25zaXN0ZW50IChjaGlwLT5wY2lfZGV2LCBjaGFubmVsLT5idWZfcGFnZXMgKiBQQUdFX1NJWkUsIAorCQkJICAgICBjaGFubmVsLT5idWYsIGNoYW5uZWwtPmJ1Zl9oYW5kbGUpOworCQorCW1lbXNldCAoY2hhbm5lbCwgMHgwLCBzaXplb2YgKCpjaGFubmVsKSk7Cit9CisKKworLyogRFNQIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qKgorICogZm9ydGVfZHNwX2lvY3RsOgorICovCisKK3N0YXRpYyBpbnQKK2ZvcnRlX2RzcF9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsCisJCSB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgaXZhbD0wLCByZXQsIHJ2YWw9MCwgcmQsIHdyLCBjb3VudDsKKwlzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgYXVkaW9fYnVmX2luZm8gYWJpOworCXN0cnVjdCBjb3VudF9pbmZvIGNpbmZvOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisJY2hpcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwkKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXdyID0gMTsKKwllbHNlIAorCQl3ciA9IDA7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJcmQgPSAxOworCWVsc2UKKwkJcmQgPSAwOworCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlciAoU09VTkRfVkVSU0lPTiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJRFBSSU5USyAoIiVzOiBHRVRDQVBTXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWl2YWwgPSBGT1JURV9DQVBTOyAvKiBEVVBMRVggKi8KKwkJcmV0dXJuIHB1dF91c2VyIChpdmFsLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgorCQlEUFJJTlRLICgiJXM6IEdFVEZNVFNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaXZhbCA9IEZPUlRFX0ZNVFM7IC8qIFU4LCAxNkxFICovCisJCXJldHVybiBwdXRfdXNlciAoaXZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOgkvKiBVOCwgMTZMRSAqLworCQlEUFJJTlRLICgiJXM6IFNFVEZNVFxuIiwgX19GVU5DVElPTl9fKTsKKworCQlpZiAoZ2V0X3VzZXIgKGl2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCWlmIChyZCkgeworCQkJZm9ydGVfY2hhbm5lbF9zdG9wICgmY2hpcC0+cmVjKTsKKwkJCXJ2YWwgPSBmb3J0ZV9jaGFubmVsX2Zvcm1hdCAoJmNoaXAtPnJlYywgaXZhbCk7CisJCX0KKworCQlpZiAod3IpIHsKKwkJCWZvcnRlX2NoYW5uZWxfc3RvcCAoJmNoaXAtPnJlYyk7CisJCQlydmFsID0gZm9ydGVfY2hhbm5lbF9mb3JtYXQgKCZjaGlwLT5wbGF5LCBpdmFsKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCQorCQlyZXR1cm4gcHV0X3VzZXIgKHJ2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoJLyogMCAtIG1vbm8sIDEgLSBzdGVyZW8gKi8KKwkJRFBSSU5USyAoIiVzOiBTVEVSRU9cbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaWYgKGdldF91c2VyIChpdmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAocmQpIHsKKwkJCWZvcnRlX2NoYW5uZWxfc3RvcCAoJmNoaXAtPnJlYyk7CisJCQlydmFsID0gZm9ydGVfY2hhbm5lbF9zdGVyZW8gKCZjaGlwLT5yZWMsIGl2YWwpOworCQl9CisKKwkJaWYgKHdyKSB7CisJCQlmb3J0ZV9jaGFubmVsX3N0b3AgKCZjaGlwLT5yZWMpOworCQkJcnZhbCA9IGZvcnRlX2NoYW5uZWxfc3RlcmVvICgmY2hpcC0+cGxheSwgaXZhbCk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlciAocnZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6IC8qIDEgLSBtb25vLCAyIC0gc3RlcmVvICovCisJCURQUklOVEsgKCIlczogQ0hBTk5FTFNcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaWYgKGdldF91c2VyIChpdmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAocmQpIHsKKwkJCWZvcnRlX2NoYW5uZWxfc3RvcCAoJmNoaXAtPnJlYyk7CisJCQlydmFsID0gZm9ydGVfY2hhbm5lbF9zdGVyZW8gKCZjaGlwLT5yZWMsIGl2YWwtMSkgKyAxOworCQl9CisKKwkJaWYgKHdyKSB7CisJCQlmb3J0ZV9jaGFubmVsX3N0b3AgKCZjaGlwLT5wbGF5KTsKKwkJCXJ2YWwgPSBmb3J0ZV9jaGFubmVsX3N0ZXJlbyAoJmNoaXAtPnBsYXksIGl2YWwtMSkgKyAxOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIgKHJ2YWwsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorCQlEUFJJTlRLICgiJXM6IFNQRUVEXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlmIChnZXRfdXNlciAoaXZhbCwgcCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVGQVVMVDsKKworCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJaWYgKHJkKSB7CisJCQlmb3J0ZV9jaGFubmVsX3N0b3AgKCZjaGlwLT5yZWMpOworCQkJcnZhbCA9IGZvcnRlX2NoYW5uZWxfcmF0ZSAoJmNoaXAtPnJlYywgaXZhbCk7CisJCX0KKworCQlpZiAod3IpIHsKKwkJCWZvcnRlX2NoYW5uZWxfc3RvcCAoJmNoaXAtPnBsYXkpOworCQkJcnZhbCA9IGZvcnRlX2NoYW5uZWxfcmF0ZSAoJmNoaXAtPnBsYXksIGl2YWwpOworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIocnZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJRFBSSU5USyAoIiVzOiBHRVRCTEtTSVpFXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAocmQpCisJCQlpdmFsID0gY2hpcC0+cmVjLmZyYWdfc3o7CisKKwkJaWYgKHdyKQorCQkJaXZhbCA9IGNoaXAtPnBsYXkuZnJhZ19zejsKKworCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlciAoaXZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCURQUklOVEsgKCIlczogUkVTRVRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCWlmIChyZCkKKwkJCWZvcnRlX2NoYW5uZWxfcmVzZXQgKCZjaGlwLT5yZWMpOworCisJCWlmICh3cikKKwkJCWZvcnRlX2NoYW5uZWxfcmVzZXQgKCZjaGlwLT5wbGF5KTsKKworCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworICAgICAgICAgICAgICAgIHJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCURQUklOVEsgKCIlczogU1lOQ1xuIiwgX19GVU5DVElPTl9fKTsKKworCQlpZiAod3IpCisJCQlyZXQgPSBmb3J0ZV9jaGFubmVsX2RyYWluICgmY2hpcC0+cGxheSk7CisKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJRFBSSU5USyAoIiVzOiBQT1NUXG4iLCBfX0ZVTkNUSU9OX18pOworCisJCWlmICh3cikgeworCQkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCQlpZiAoY2hpcC0+cGxheS5maWxsZWRfZnJhZ3MpCisJCQkJZm9ydGVfY2hhbm5lbF9zdGFydCAoJmNoaXAtPnBsYXkpOworCisJCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKwkJfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCURQUklOVEsgKCIlczogU0VURlJBR01FTlRcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaWYgKGdldF91c2VyIChpdmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAocmQpIHsKKwkJCWZvcnRlX2NoYW5uZWxfYnVmZmVyICgmY2hpcC0+cmVjLCBpdmFsICYgMHhmZmZmLCAKKwkJCQkJICAgICAgKGl2YWwgPj4gMTYpICYgMHhmZmZmKTsKKwkJCWl2YWwgPSAoY2hpcC0+cmVjLmZyYWdfbnVtIDw8IDE2KSArIGNoaXAtPnJlYy5mcmFnX3N6OworCQl9CisKKwkJaWYgKHdyKSB7CisJCQlmb3J0ZV9jaGFubmVsX2J1ZmZlciAoJmNoaXAtPnBsYXksIGl2YWwgJiAweGZmZmYsIAorCQkJCQkgICAgICAoaXZhbCA+PiAxNikgJiAweGZmZmYpOworCQkJaXZhbCA9IChjaGlwLT5wbGF5LmZyYWdfbnVtIDw8IDE2KSArY2hpcC0+cGxheS5mcmFnX3N6OworCQl9CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJcmV0dXJuIHB1dF91c2VyIChpdmFsLCBwKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJRFBSSU5USyAoIiVzOiBHRVRJU1BBQ0VcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaWYgKCFyZCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlhYmkuZnJhZ3N0b3RhbCA9IGNoaXAtPnJlYy5mcmFnX251bTsKKwkJYWJpLmZyYWdzaXplID0gY2hpcC0+cmVjLmZyYWdfc3o7CisJCQkKKwkJaWYgKGNoaXAtPnJlYy5tYXBwZWQpIHsKKwkJCWFiaS5mcmFnbWVudHMgPSBjaGlwLT5yZWMuZnJhZ19udW0gLSAyOworCQkJYWJpLmJ5dGVzID0gYWJpLmZyYWdtZW50cyAqIGFiaS5mcmFnc2l6ZTsKKwkJfQorCQllbHNlIHsKKwkJCWFiaS5mcmFnbWVudHMgPSBjaGlwLT5yZWMuZmlsbGVkX2ZyYWdzOworCQkJYWJpLmJ5dGVzID0gYWJpLmZyYWdtZW50cyAqIGFiaS5mcmFnc2l6ZTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCXJldHVybiBjb3B5X3RvX3VzZXIgKGFyZ3AsICZhYmksIHNpemVvZiAoYWJpKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlEUFJJTlRLICgiJXM6IEdFVElQVFJcbiIsIF9fRlVOQ1RJT05fXyk7CisKKwkJaWYgKCFyZCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAoY2hpcC0+cmVjLmFjdGl2ZSkgCisJCQljaW5mby5wdHIgPSBjaGlwLT5yZWMuaHdwdHI7CisJCWVsc2UKKwkJCWNpbmZvLnB0ciA9IDA7CisKKwkJY2luZm8uYnl0ZXMgPSBjaGlwLT5yZWMuYnl0ZXM7CisJCWNpbmZvLmJsb2NrcyA9IGNoaXAtPnJlYy5ucl9pcnFzOworCQljaGlwLT5yZWMubnJfaXJxcyA9IDA7CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJcmV0dXJuIGNvcHlfdG9fdXNlciAoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIXdyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCQorCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJYWJpLmZyYWdzdG90YWwgPSBjaGlwLT5wbGF5LmZyYWdfbnVtOworCQlhYmkuZnJhZ3NpemUgPSBjaGlwLT5wbGF5LmZyYWdfc3o7CisKKwkJaWYgKGNoaXAtPnBsYXkubWFwcGVkKSB7CisJCQlhYmkuZnJhZ21lbnRzID0gY2hpcC0+cGxheS5mcmFnX251bSAtIDI7CisJCQlhYmkuYnl0ZXMgPSBjaGlwLT5wbGF5LmJ1Zl9zejsKKwkJfQorCQllbHNlIHsKKwkJCWFiaS5mcmFnbWVudHMgPSBjaGlwLT5wbGF5LmZyYWdfbnVtIC0gCisJCQkJY2hpcC0+cGxheS5maWxsZWRfZnJhZ3M7CisKKwkJCWlmIChjaGlwLT5wbGF5LnJlc2lkdWUpCisJCQkJYWJpLmZyYWdtZW50cy0tOworCisJCQlhYmkuYnl0ZXMgPSBhYmkuZnJhZ21lbnRzICogYWJpLmZyYWdzaXplICsKKwkJCQljaGlwLT5wbGF5LnJlc2lkdWU7CisJCX0KKworCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKwkJCisJCXJldHVybiBjb3B5X3RvX3VzZXIgKGFyZ3AsICZhYmksIHNpemVvZiAoYWJpKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlpZiAoIXdyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCWlmIChjaGlwLT5wbGF5LmFjdGl2ZSkgCisJCQljaW5mby5wdHIgPSBjaGlwLT5wbGF5Lmh3cHRyOworCQllbHNlCisJCQljaW5mby5wdHIgPSAwOworCisJCWNpbmZvLmJ5dGVzID0gY2hpcC0+cGxheS5ieXRlczsKKwkJY2luZm8uYmxvY2tzID0gY2hpcC0+cGxheS5ucl9pcnFzOworCQljaGlwLT5wbGF5Lm5yX2lycXMgPSAwOworCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCXJldHVybiBjb3B5X3RvX3VzZXIgKGFyZ3AsICZjaW5mbywgc2l6ZW9mIChjaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIXdyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCWlmICghY2hpcC0+cGxheS5hY3RpdmUpIHsKKwkJCWl2YWwgPSAwOworCQl9CisJCWVsc2UgaWYgKGNoaXAtPnBsYXkubWFwcGVkKSB7CisJCQljb3VudCA9IGludyAoY2hpcC0+cGxheS5pb2Jhc2UgKyBGT1JURV9QTFlfQ09VTlQpICsgMTsKKwkJCWl2YWwgPSBjaGlwLT5wbGF5LmZyYWdfc3ogLSBjb3VudDsKKwkJfQorCQllbHNlIHsKKwkJCWl2YWwgPSBjaGlwLT5wbGF5LmZpbGxlZF9mcmFncyAqIGNoaXAtPnBsYXkuZnJhZ19zejsKKworCQkJaWYgKGNoaXAtPnBsYXkucmVzaWR1ZSkKKwkJCQlpdmFsICs9IGNoaXAtPnBsYXkuZnJhZ19zeiAtIGNoaXAtPnBsYXkucmVzaWR1ZTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCXJldHVybiBwdXRfdXNlciAoaXZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlEUFJJTlRLICgiJXM6IFNFVERVUExFWFxuIiwgX19GVU5DVElPTl9fKTsKKworCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQlEUFJJTlRLICgiJXM6IEdFVFRSSUdHRVJcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQorCQlyZXR1cm4gcHV0X3VzZXIgKGNoaXAtPnRyaWdnZXIsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKworCQlpZiAoZ2V0X3VzZXIgKGl2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJRFBSSU5USyAoIiVzOiBTRVRUUklHR0VSICVkXG4iLCBfX0ZVTkNUSU9OX18sIGl2YWwpOworCisJCWlmICh3cikgeworCQkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCQlpZiAoaXZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKQorCQkJCWZvcnRlX2NoYW5uZWxfc3RhcnQgKCZjaGlwLT5wbGF5KTsKKwkJCWVsc2UgewkJCisJCQkJY2hpcC0+dHJpZ2dlciA9IDE7CisJCQkJZm9ydGVfY2hhbm5lbF9wcmVwICgmY2hpcC0+cGxheSk7CisJCQkJZm9ydGVfY2hhbm5lbF9zdG9wICgmY2hpcC0+cGxheSk7CisJCQl9CisKKwkJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCQl9CisJCWVsc2UgaWYgKHJkKSB7CisJCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJCWlmIChpdmFsICYgUENNX0VOQUJMRV9JTlBVVCkKKwkJCQlmb3J0ZV9jaGFubmVsX3N0YXJ0ICgmY2hpcC0+cmVjKTsKKwkJCWVsc2UgewkJCisJCQkJY2hpcC0+dHJpZ2dlciA9IDE7CisJCQkJZm9ydGVfY2hhbm5lbF9wcmVwICgmY2hpcC0+cmVjKTsKKwkJCQlmb3J0ZV9jaGFubmVsX3N0b3AgKCZjaGlwLT5yZWMpOworCQkJfQorCisJCQlzcGluX3VubG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKwkJfQorCisJCXJldHVybiAwOworCQkKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCURQUklOVEsgKCIlczogUENNX1JFQURfUkFURVxuIiwgX19GVU5DVElPTl9fKTsJCQorCQlyZXR1cm4gcHV0X3VzZXIgKGNoaXAtPnBsYXkucmF0ZSwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlEUFJJTlRLICgiJXM6IFBDTV9SRUFEX0NIQU5ORUxTXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXR1cm4gcHV0X3VzZXIgKGNoaXAtPnBsYXkuc3RlcmVvLCBwKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJRFBSSU5USyAoIiVzOiBQQ01fUkVBRF9CSVRTXG4iLCBfX0ZVTkNUSU9OX18pOwkJCisJCXJldHVybiBwdXRfdXNlciAoY2hpcC0+cGxheS5mb3JtYXQsIHApOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlEUFJJTlRLICgiJXM6IERTUF9OT05CTE9DS1xuIiwgX19GVU5DVElPTl9fKTsJCQorICAgICAgICAgICAgICAgIGZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlEUFJJTlRLICgiVW5zdXBwb3J0ZWQgaW9jdGw6ICV4ICglcClcbiIsIGNtZCwgYXJncCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCisKKy8qKgorICogZm9ydGVfZHNwX29wZW46CisgKi8KKworc3RhdGljIGludCAKK2ZvcnRlX2RzcF9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcCA9IGZvcnRlOyAvKiBGSVhNRTogSEFDSyBGUk9NIEhFTEwhICovCisKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJaWYgKGRvd25fdHJ5bG9jayAoJmNoaXAtPm9wZW5fc2VtKSkgeworCQkJRFBSSU5USyAoIiVzOiByZXR1cm5pbmcgLUVBR0FJTlxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9CisJfQorCWVsc2UgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmY2hpcC0+b3Blbl9zZW0pKSB7CisJCQlEUFJJTlRLICgiJXM6IHJldHVybmluZyAtRVJFU1RBUlRTWVNcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gZm9ydGU7CisKKwlEUFJJTlRLICgiJXM6IGRzcCBvcGVuZWQgYnkgJWRcbiIsIF9fRlVOQ1RJT05fXywgY3VycmVudC0+cGlkKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJZm9ydGVfY2hhbm5lbF9pbml0IChmb3J0ZSwgJmZvcnRlLT5wbGF5KTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlmb3J0ZV9jaGFubmVsX2luaXQgKGZvcnRlLCAmZm9ydGUtPnJlYyk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKworLyoqCisgKiBmb3J0ZV9kc3BfcmVsZWFzZToKKyAqLworCitzdGF0aWMgaW50IAorZm9ydGVfZHNwX3JlbGVhc2UgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBmb3J0ZV9jaGlwICpjaGlwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWludCByZXQgPSAwOworCisJRFBSSU5USyAoIiVzOiBjaGlwIEAgJXBcbiIsIF9fRlVOQ1RJT05fXywgY2hpcCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJZm9ydGVfY2hhbm5lbF9kcmFpbiAoJmNoaXAtPnBsYXkpOworCisJCXNwaW5fbG9ja19pcnEgKCZjaGlwLT5sb2NrKTsKKworIAkJZm9ydGVfY2hhbm5lbF9mcmVlIChjaGlwLCAmY2hpcC0+cGxheSk7CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisgICAgICAgIH0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXdoaWxlIChjaGlwLT5yZWMuZmlsbGVkX2ZyYWdzID4gMCkKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24gKCZjaGlwLT5yZWMud2FpdCk7CisKKwkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCWZvcnRlX2NoYW5uZWxfc3RvcCAoJmNoaXAtPnJlYyk7CisJCWZvcnRlX2NoYW5uZWxfZnJlZSAoY2hpcCwgJmNoaXAtPnJlYyk7CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisJfQorCisJdXAgKCZjaGlwLT5vcGVuX3NlbSk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogZm9ydGVfZHNwX3BvbGw6CisgKgorICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgCitmb3J0ZV9kc3BfcG9sbCAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgZm9ydGVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwljaGlwID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWNoYW5uZWwgPSAmY2hpcC0+cGxheTsKKworCQlpZiAoY2hhbm5lbC0+YWN0aXZlKQorCQkJcG9sbF93YWl0IChmaWxlLCAmY2hhbm5lbC0+d2FpdCwgd2FpdCk7CisKKwkJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJCWlmIChjaGFubmVsLT5mcmFnX251bSAtIGNoYW5uZWwtPmZpbGxlZF9mcmFncyA+IDApCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisJCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWNoYW5uZWwgPSAmY2hpcC0+cmVjOworCisJCWlmIChjaGFubmVsLT5hY3RpdmUpCisJCQlwb2xsX3dhaXQgKGZpbGUsICZjaGFubmVsLT53YWl0LCB3YWl0KTsKKworCQlzcGluX2xvY2tfaXJxICgmY2hpcC0+bG9jayk7CisKKwkJaWYgKGNoYW5uZWwtPmZpbGxlZF9mcmFncyA+IDApCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2hpcC0+bG9jayk7CisJfQorCisJcmV0dXJuIG1hc2s7Cit9CisKKworLyoqCisgKiBmb3J0ZV9kc3BfbW1hcDoKKyAqLworCitzdGF0aWMgaW50Citmb3J0ZV9kc3BfbW1hcCAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBmb3J0ZV9jaGlwICpjaGlwOworCXN0cnVjdCBmb3J0ZV9jaGFubmVsICpjaGFubmVsOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgcmV0OworCisJY2hpcCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCURQUklOVEsgKCIlczogc3RhcnQgJWxYaCwgc2l6ZSAlbGQsIHBnb2ZmICVsZFxuIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICB2bWEtPnZtX3N0YXJ0LCB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsIHZtYS0+dm1fcGdvZmYpOworCisJc3Bpbl9sb2NrX2lycSAoJmNoaXAtPmxvY2spOworCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSAmJiBjaGlwLT5wbGF5LmFjdGl2ZSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworCX0KKworICAgICAgICBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQgJiYgY2hpcC0+cmVjLmFjdGl2ZSkgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gb3V0OworICAgICAgICB9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWNoYW5uZWwgPSAmY2hpcC0+cGxheTsKKwllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQljaGFubmVsID0gJmNoaXAtPnJlYzsKKwllbHNlIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJZm9ydGVfY2hhbm5lbF9wcmVwIChjaGFubmVsKTsKKwljaGFubmVsLT5tYXBwZWQgPSAxOworCisgICAgICAgIGlmICh2bWEtPnZtX3Bnb2ZmICE9IDApIHsKKwkJcmV0ID0gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKwl9CisKKyAgICAgICAgc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworICAgICAgICBpZiAoc2l6ZSA+IGNoYW5uZWwtPmJ1Zl9wYWdlcyAqIFBBR0VfU0laRSkgeworCQlEUFJJTlRLICgiJXM6IHNpemUgKCVsZCkgPiBidWZfc3ogKCVkKSBcbiIsIF9fRlVOQ1RJT05fXywKKwkJCSBzaXplLCBjaGFubmVsLT5idWZfc3opOworCQlyZXQgPSAtRUlOVkFMOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCX0KKworICAgICAgICBpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCSAgICAgIHZpcnRfdG9fcGh5cyhjaGFubmVsLT5idWYpID4+IFBBR0VfU0hJRlQsCisJCQkgICAgICBzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpIHsKKwkJRFBSSU5USyAoIiVzOiByZW1hcCBlbCBhIG5vIHdvcmtvXG4iLCBfX0ZVTkNUSU9OX18pOworCQlyZXQgPSAtRUFHQUlOOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworCX0KKworICAgICAgICByZXQgPSAwOworCisgb3V0OgorCXNwaW5fdW5sb2NrX2lycSAoJmNoaXAtPmxvY2spOworICAgICAgICByZXR1cm4gcmV0OworfQorCisKKy8qKgorICogZm9ydGVfZHNwX3dyaXRlOgorICovCisKK3N0YXRpYyBzc2l6ZV90IAorZm9ydGVfZHNwX3dyaXRlIChzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCAKKwkJIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcDsKKwlzdHJ1Y3QgZm9ydGVfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgaSA9IGJ5dGVzLCBzeiA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghYWNjZXNzX29rIChWRVJJRllfUkVBRCwgYnVmZmVyLCBieXRlcykpCisJCXJldHVybiAtRUZBVUxUOworCisJY2hpcCA9IChzdHJ1Y3QgZm9ydGVfY2hpcCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlpZiAoIWNoaXApCisJCUJVRygpOworCisJY2hhbm5lbCA9ICZjaGlwLT5wbGF5OworCisJaWYgKCFjaGFubmVsKQorCQlCVUcoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJLyogU2V0IHVwIGJ1ZmZlcnMgd2l0aCB0aGUgcmlnaHQgZnJhZ21lbnQgc2l6ZSAqLworCWZvcnRlX2NoYW5uZWxfcHJlcCAoY2hhbm5lbCk7CisKKwl3aGlsZSAoaSkgeworCQkvKiBBbGwgZnJhZ21lbnQgYnVmZmVycyBpbiB1c2UgLT4gd2FpdCAqLworCQlpZiAoY2hhbm5lbC0+ZnJhZ19udW0gLSBjaGFubmVsLT5maWxsZWRfZnJhZ3MgPT0gMCkgeworCQkJREVDTEFSRV9XQUlUUVVFVUUgKHdhaXQsIGN1cnJlbnQpOworCisJCQkvKiBGb3IgdHJpZ2dlciBvciBub24tYmxvY2tpbmcgb3BlcmF0aW9uLCBnZXQgb3V0ICovCisJCQlpZiAoY2hpcC0+dHJpZ2dlciB8fCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZjaGlwLT5sb2NrLCBmbGFncyk7CisJCQkJcmV0dXJuIC1FQUdBSU47CisJCQl9CisKKwkJCS8qIE90aGVyd2lzZSB3YWl0IGZvciBidWZmZXJzICovCisJCQlhZGRfd2FpdF9xdWV1ZSAoJmNoYW5uZWwtPndhaXQsICZ3YWl0KTsKKworCQkJZm9yICg7OykgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZjaGlwLT5sb2NrLCBmbGFncyk7CisKKwkJCQlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZSgpOworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUgKCZjaGlwLT5sb2NrLCBmbGFncyk7CisKKwkJCQlpZiAoY2hhbm5lbC0+ZnJhZ19udW0gLSBjaGFubmVsLT5maWxsZWRfZnJhZ3MpCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlyZW1vdmVfd2FpdF9xdWV1ZSAoJmNoYW5uZWwtPndhaXQsICZ3YWl0KTsKKwkJCXNldF9jdXJyZW50X3N0YXRlIChUQVNLX1JVTk5JTkcpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQkJfQorCQl9CisKKwkJaWYgKGNoYW5uZWwtPnJlc2lkdWUpCisJCQlzeiA9IGNoYW5uZWwtPnJlc2lkdWU7CisJCWVsc2UgaWYgKGkgPiBjaGFubmVsLT5mcmFnX3N6KQorCQkJc3ogPSBjaGFubmVsLT5mcmFnX3N6OworCQllbHNlCisJCQlzeiA9IGk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY29weV9mcm9tX3VzZXIgKCh2b2lkICopIGNoYW5uZWwtPmJ1ZiArIGNoYW5uZWwtPnN3cHRyLCBidWZmZXIsIHN6KSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXNwaW5fbG9ja19pcnFzYXZlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJCS8qIEFkdmFuY2Ugc29mdHdhcmUgcG9pbnRlciAqLworCQlidWZmZXIgKz0gc3o7CisJCWNoYW5uZWwtPnN3cHRyICs9IHN6OworCQljaGFubmVsLT5zd3B0ciAlPSBjaGFubmVsLT5idWZfc3o7CisJCWkgLT0gc3o7CisKKwkJLyogT25seSBidW1wIGZpbGxlZF9mcmFncyBpZiBhIGZ1bGwgZnJhZ21lbnQgaGFzIGJlZW4gd3JpdHRlbiAqLworCQlpZiAoY2hhbm5lbC0+c3dwdHIgJSBjaGFubmVsLT5mcmFnX3N6ID09IDApIHsKKwkJCWNoYW5uZWwtPmZpbGxlZF9mcmFncysrOworCQkJY2hhbm5lbC0+cmVzaWR1ZSA9IDA7CisJCX0KKwkJZWxzZQorCQkJY2hhbm5lbC0+cmVzaWR1ZSA9IGNoYW5uZWwtPmZyYWdfc3ogLSBzejsKKworCQkvKiBJZiBwbGF5YmFjayBpc24ndCBhY3RpdmUsIHN0YXJ0IGl0ICovCisJCWlmIChjaGFubmVsLT5hY3RpdmUgPT0gMCAmJiBjaGlwLT50cmlnZ2VyID09IDApCisJCQlmb3J0ZV9jaGFubmVsX3N0YXJ0IChjaGFubmVsKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIGJ5dGVzIC0gaTsKK30KKworCisvKioKKyAqIGZvcnRlX2RzcF9yZWFkOgorICovCisKK3N0YXRpYyBzc2l6ZV90IAorZm9ydGVfZHNwX3JlYWQgKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIAorCQlsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXA7CisJc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWw7CisJdW5zaWduZWQgaW50IGkgPSBieXRlcywgc3o7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghYWNjZXNzX29rIChWRVJJRllfV1JJVEUsIGJ1ZmZlciwgYnl0ZXMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWNoaXAgPSAoc3RydWN0IGZvcnRlX2NoaXAgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFjaGlwKQorCQlCVUcoKTsKKworCWNoYW5uZWwgPSAmY2hpcC0+cmVjOworCisJaWYgKCFjaGFubmVsKQorCQlCVUcoKTsKKworCXNwaW5fbG9ja19pcnFzYXZlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJLyogU2V0IHVwIGJ1ZmZlcnMgd2l0aCB0aGUgcmlnaHQgZnJhZ21lbnQgc2l6ZSAqLworCWZvcnRlX2NoYW5uZWxfcHJlcCAoY2hhbm5lbCk7CisKKwkvKiBTdGFydCByZWNvcmRpbmcgKi8KKwlpZiAoIWNoaXAtPnRyaWdnZXIpCisJCWZvcnRlX2NoYW5uZWxfc3RhcnQgKGNoYW5uZWwpOworCisJd2hpbGUgKGkpIHsKKwkJLyogTm8gZnJhZ21lbnQgYnVmZmVycyBpbiB1c2UgLT4gd2FpdCAqLworCQlpZiAoY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzID09IDApIHsKKwkJCURFQ0xBUkVfV0FJVFFVRVVFICh3YWl0LCBjdXJyZW50KTsKKworCQkJLyogRm9yIHRyaWdnZXIgbW9kZSBvcGVyYXRpb24sIGdldCBvdXQgKi8KKwkJCWlmIChjaGlwLT50cmlnZ2VyKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCX0KKworCQkJYWRkX3dhaXRfcXVldWUgKCZjaGFubmVsLT53YWl0LCAmd2FpdCk7CisKKwkJCWZvciAoOzspIHsKKwkJCQlpZiAoY2hhbm5lbC0+YWN0aXZlID09IDApCisJCQkJCWJyZWFrOworCisJCQkJaWYgKGNoYW5uZWwtPmZpbGxlZF9mcmFncykKKwkJCQkJYnJlYWs7CisJCQkJCQkKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCisJCQkJc2V0X2N1cnJlbnRfc3RhdGUgKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQkJc2NoZWR1bGUoKTsKKworCQkJCXNwaW5fbG9ja19pcnFzYXZlICgmY2hpcC0+bG9jaywgZmxhZ3MpOworCQkJfQorCisJCQlzZXRfY3VycmVudF9zdGF0ZSAoVEFTS19SVU5OSU5HKTsKKwkJCXJlbW92ZV93YWl0X3F1ZXVlICgmY2hhbm5lbC0+d2FpdCwgJndhaXQpOworCQl9CisKKwkJaWYgKGkgPiBjaGFubmVsLT5mcmFnX3N6KQorCQkJc3ogPSBjaGFubmVsLT5mcmFnX3N6OworCQllbHNlCisJCQlzeiA9IGk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSAoJmNoaXAtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY29weV90b191c2VyIChidWZmZXIsICh2b2lkICopY2hhbm5lbC0+YnVmK2NoYW5uZWwtPnN3cHRyLCBzeikpIHsKKwkJCURQUklOVEsgKCIlczogY29weV90b191c2VyIGZhaWxlZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUgKCZjaGlwLT5sb2NrLCBmbGFncyk7CisKKwkJLyogQWR2YW5jZSBzb2Z0d2FyZSBwb2ludGVyICovCisJCWJ1ZmZlciArPSBzejsKKwkJaWYgKGNoYW5uZWwtPmZpbGxlZF9mcmFncyA+IDApCisJCQljaGFubmVsLT5maWxsZWRfZnJhZ3MtLTsKKwkJY2hhbm5lbC0+c3dwdHIgKz0gY2hhbm5lbC0+ZnJhZ19zejsKKwkJY2hhbm5lbC0+c3dwdHIgJT0gY2hhbm5lbC0+YnVmX3N6OworCQlpIC09IHN6OworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUgKCZjaGlwLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gYnl0ZXMgLSBpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZvcnRlX2RzcF9mb3BzID0geworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlayAgICAgCQk9ICZub19sbHNlZWssCisJLnJlYWQgICAgICAgCQk9ICZmb3J0ZV9kc3BfcmVhZCwKKwkud3JpdGUgICAgICAJCT0gJmZvcnRlX2RzcF93cml0ZSwKKwkucG9sbCAgICAgICAJCT0gJmZvcnRlX2RzcF9wb2xsLAorCS5pb2N0bCAgICAgIAkJPSAmZm9ydGVfZHNwX2lvY3RsLAorCS5vcGVuICAgICAgIAkJPSAmZm9ydGVfZHNwX29wZW4sCisJLnJlbGVhc2UgICAgCQk9ICZmb3J0ZV9kc3BfcmVsZWFzZSwKKwkubW1hcAkJCT0gJmZvcnRlX2RzcF9tbWFwLAorfTsKKworCisvKiBDb21tb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyoqCisgKiBmb3J0ZV9pbnRlcnJ1cHQ6CisgKi8KKworc3RhdGljIGlycXJldHVybl90Citmb3J0ZV9pbnRlcnJ1cHQgKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXAgPSBkZXZfaWQ7CisJc3RydWN0IGZvcnRlX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCXUxNiBzdGF0dXMsIGNvdW50OyAKKworCXN0YXR1cyA9IGludyAoY2hpcC0+aW9iYXNlICsgRk9SVEVfSVJRX1NUQVRVUyk7CisKKwkvKiBJZiB0aGlzIGlzIG5vdCBmb3IgdXMsIGdldCBvdXR0YSBoZXJlIEFTQVAgKi8KKwlpZiAoKHN0YXR1cyAmIChGT1JURV9JUlFfUExBWUJBQ0sgfCBGT1JURV9JUlFfQ0FQVFVSRSkpID09IDApCisJCXJldHVybiBJUlFfTk9ORTsKKwkKKwlpZiAoc3RhdHVzICYgRk9SVEVfSVJRX1BMQVlCQUNLKSB7CisJCWNoYW5uZWwgPSAmY2hpcC0+cGxheTsKKworCQlzcGluX2xvY2sgKCZjaGlwLT5sb2NrKTsKKworCQlpZiAoY2hhbm5lbC0+ZnJhZ19zeiA9PSAwKQorCQkJZ290byBwYWNrOworCisJCS8qIERlY2xhcmUgYSBmcmFnbWVudCBkb25lICovCisJCWlmIChjaGFubmVsLT5maWxsZWRfZnJhZ3MgPiAwKQorCQkJY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzLS07CisJCWNoYW5uZWwtPmJ5dGVzICs9IGNoYW5uZWwtPmZyYWdfc3o7CisJCWNoYW5uZWwtPm5yX2lycXMrKzsKKwkJCisJCS8qIEZsaXAtZmxvcCBiZXR3ZWVuIGJ1ZmZlciBJIGFuZCBJSSAqLworCQljaGFubmVsLT5uZXh0X2J1ZiBePSAxOworCisJCS8qIEFkdmFuY2UgaGFyZHdhcmUgcG9pbnRlciBieSBmcmFnbWVudCBzaXplIGFuZCB3cmFwIGFyb3VuZCAqLworCQljaGFubmVsLT5od3B0ciArPSBjaGFubmVsLT5mcmFnX3N6OworCQljaGFubmVsLT5od3B0ciAlPSBjaGFubmVsLT5idWZfc3o7CisKKwkJLyogQnVmZmVyIEkgb3IgYnVmZmVyIElJIEJBUiAqLworICAgICAgICAgICAgICAgIG91dGwgKGNoYW5uZWwtPmJ1Zl9oYW5kbGUgKyBjaGFubmVsLT5od3B0ciwgCisJCSAgICAgIGNoYW5uZWwtPm5leHRfYnVmID09IDAgPworCQkgICAgICBjaGFubmVsLT5pb2Jhc2UgKyBGT1JURV9QTFlfQlVGMSA6CisJCSAgICAgIGNoYW5uZWwtPmlvYmFzZSArIEZPUlRFX1BMWV9CVUYyKTsKKworCQkvKiBJZiB0aGUgY3VycmVudGx5IHBsYXlpbmcgZnJhZ21lbnQgaXMgbGFzdCwgc2NoZWR1bGUgcGF1c2UgKi8KKwkJaWYgKGNoYW5uZWwtPmZpbGxlZF9mcmFncyA9PSAxKSAKKwkJCWZvcnRlX2NoYW5uZWxfcGF1c2UgKGNoYW5uZWwpOworCisJcGFjazoKKwkJLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisgICAgICAgICAgICAgICAgb3V0dyAoRk9SVEVfSVJRX1BMQVlCQUNLLCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9JUlFfU1RBVFVTKTsKKworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSAoJmNoYW5uZWwtPndhaXQpKSAKKwkJCXdha2VfdXBfYWxsICgmY2hhbm5lbC0+d2FpdCk7CisKKwkJc3Bpbl91bmxvY2sgKCZjaGlwLT5sb2NrKTsKKwl9CisKKwlpZiAoc3RhdHVzICYgRk9SVEVfSVJRX0NBUFRVUkUpIHsKKwkJY2hhbm5lbCA9ICZjaGlwLT5yZWM7CisJCXNwaW5fbG9jayAoJmNoaXAtPmxvY2spOworCisJCS8qIE9uZSBmcmFnbWVudCBmaWxsZWQgKi8KKwkJY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzKys7CisKKwkJLyogR2V0ICMgb2YgY29tcGxldGVkIGJ5dGVzICovCisJCWNvdW50ID0gaW53IChjaGFubmVsLT5pb2Jhc2UgKyBGT1JURV9QTFlfQ09VTlQpICsgMTsKKworCQlpZiAoY291bnQgPT0gMCkgeworCQkJRFBSSU5USyAoIiVzOiBsYXN0LCBmaWxsZWRfZnJhZ3MgPSAlZFxuIiwgX19GVU5DVElPTl9fLAorCQkJCSBjaGFubmVsLT5maWxsZWRfZnJhZ3MpOworCQkJY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzID0gMDsKKwkJCWdvdG8gcmFjazsKKwkJfQorCisJCS8qIEJ1ZmZlciBJIG9yIGJ1ZmZlciBJSSBCQVIgKi8KKyAgICAgICAgICAgICAgICBvdXRsIChjaGFubmVsLT5idWZfaGFuZGxlICsgY2hhbm5lbC0+aHdwdHIsIAorCQkgICAgICBjaGFubmVsLT5uZXh0X2J1ZiA9PSAwID8KKwkJICAgICAgY2hhbm5lbC0+aW9iYXNlICsgRk9SVEVfUExZX0JVRjEgOgorCQkgICAgICBjaGFubmVsLT5pb2Jhc2UgKyBGT1JURV9QTFlfQlVGMik7CisKKwkJLyogRmxpcC1mbG9wIGJldHdlZW4gYnVmZmVyIEkgYW5kIElJICovCisJCWNoYW5uZWwtPm5leHRfYnVmIF49IDE7CisKKwkJLyogQWR2YW5jZSBoYXJkd2FyZSBwb2ludGVyIGJ5IGZyYWdtZW50IHNpemUgYW5kIHdyYXAgYXJvdW5kICovCisJCWNoYW5uZWwtPmh3cHRyICs9IGNoYW5uZWwtPmZyYWdfc3o7CisJCWNoYW5uZWwtPmh3cHRyICU9IGNoYW5uZWwtPmJ1Zl9zejsKKworCQkvKiBPdXQgb2YgYnVmZmVycyAqLworCQlpZiAoY2hhbm5lbC0+ZmlsbGVkX2ZyYWdzID09IGNoYW5uZWwtPmZyYWdfbnVtIC0gMSkKKwkJCWZvcnRlX2NoYW5uZWxfc3RvcCAoY2hhbm5lbCk7CisJcmFjazoKKwkJLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0ICovCisgICAgICAgICAgICAgICAgb3V0dyAoRk9SVEVfSVJRX0NBUFRVUkUsIGNoaXAtPmlvYmFzZSArIEZPUlRFX0lSUV9TVEFUVVMpOworCisJCXNwaW5fdW5sb2NrICgmY2hpcC0+bG9jayk7CisKKwkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUgKCZjaGFubmVsLT53YWl0KSkKKwkJCXdha2VfdXBfYWxsICgmY2hhbm5lbC0+d2FpdCk7CQkKKwl9CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKworLyoqCisgKiBmb3J0ZV9wcm9jX3JlYWQ6CisgKi8KKworc3RhdGljIGludAorZm9ydGVfcHJvY19yZWFkIChjaGFyICpwYWdlLCBjaGFyICoqc3RhcnQsIG9mZl90IG9mZiwgaW50IGNvdW50LCAKKwkJIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCWludCBpID0gMCwgcF9yYXRlLCBwX2NoYW4sIHJfcmF0ZTsKKwl1bnNpZ25lZCBzaG9ydCBwX3JlZywgcl9yZWc7CisKKwlpICs9IHNwcmludGYgKHBhZ2UsICJGb3J0ZU1lZGlhIEZNODAxIE9TUyBMaXRlIGRyaXZlclxuJXNcbiBcbiIsIAorCQkgICAgICBEUklWRVJfVkVSU0lPTik7CisKKwlpZiAoIWZvcnRlLT5pb2Jhc2UpCisJCXJldHVybiBpOworCisJcF9yYXRlID0gcF9jaGFuID0gLTE7CisJcF9yZWcgID0gaW53IChmb3J0ZS0+aW9iYXNlICsgRk9SVEVfUExZX0NUUkwpOworCXBfcmF0ZSA9IChwX3JlZyA+PiA4KSAmIDE1OworCXBfY2hhbiA9IChwX3JlZyA+PiAxMikgJiAzOworCisgCWlmIChwX3JhdGUgPj0gMCB8fCBwX3JhdGUgPD0gMTApCisJCXBfcmF0ZSA9IHJhdGVzW3BfcmF0ZV07CisKKwlpZiAocF9jaGFuID49IDAgfHwgcF9jaGFuIDw9IDIpCisJCXBfY2hhbiA9IGNoYW5uZWxzW3BfY2hhbl07CisKKwlyX3JhdGUgPSAtMTsKKwlyX3JlZyAgPSBpbncgKGZvcnRlLT5pb2Jhc2UgKyBGT1JURV9DQVBfQ1RSTCk7CisJcl9yYXRlID0gKHJfcmVnID4+IDgpICYgMTU7CisKKyAJaWYgKHJfcmF0ZSA+PSAwIHx8IHJfcmF0ZSA8PSAxMCkKKwkJcl9yYXRlID0gcmF0ZXNbcl9yYXRlXTsgCisKKwlpICs9IHNwcmludGYgKHBhZ2UgKyBpLAorCQkgICAgICAiICAgICAgICAgICAgIFBsYXliYWNrICBDYXB0dXJlXG4iCisJCSAgICAgICJGSUZPIGVtcHR5IDogJS0zcyAgICAgICAlLTNzXG4iCisJCSAgICAgICJCdWYxIExhc3QgIDogJS0zcyAgICAgICAlLTNzXG4iCisJCSAgICAgICJCdWYyIExhc3QgIDogJS0zcyAgICAgICAlLTNzXG4iCisJCSAgICAgICJTdGFydGVkICAgIDogJS0zcyAgICAgICAlLTNzXG4iCisJCSAgICAgICJQYXVzZWQgICAgIDogJS0zcyAgICAgICAlLTNzXG4iCisJCSAgICAgICJJbW1lZCBTdG9wIDogJS0zcyAgICAgICAlLTNzXG4iCisJCSAgICAgICJSYXRlICAgICAgIDogJS01ZCAgICAgJS01ZFxuIgorCQkgICAgICAiQ2hhbm5lbHMgICA6ICUtNWQgICAgIC1cbiIKKwkJICAgICAgIjE2LWJpdCAgICAgOiAlLTNzICAgICAgICUtM3NcbiIKKwkJICAgICAgIlN0ZXJlbyAgICAgOiAlLTNzICAgICAgICUtM3NcbiIKKwkJICAgICAgIiBcbiIKKwkJICAgICAgIkJ1ZmZlciBTeiAgOiAlLTZkICAgICUtNmRcbiIKKwkJICAgICAgIkZyYWcgU3ogICAgOiAlLTZkICAgICUtNmRcbiIKKwkJICAgICAgIkZyYWcgTnVtICAgOiAlLTZkICAgICUtNmRcbiIKKwkJICAgICAgIkZyYWcgbXNlY3MgOiAlLTZkICAgICUtNmRcbiIKKwkJICAgICAgIlVzZWQgRnJhZ3MgOiAlLTZkICAgICUtNmRcbiIKKwkJICAgICAgIk1hcHBlZCAgICAgOiAlLTNzICAgICAgICUtM3NcbiIsCisJCSAgICAgIHBfcmVnICYgMTw8MCAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHJfcmVnICYgMTw8MCAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHBfcmVnICYgMTw8MSAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHJfcmVnICYgMTw8MSAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHBfcmVnICYgMTw8MiAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHJfcmVnICYgMTw8MiAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHBfcmVnICYgMTw8NSAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHJfcmVnICYgMTw8NSAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHBfcmVnICYgMTw8NiAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHJfcmVnICYgMTw8NiAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHBfcmVnICYgMTw8NyAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHJfcmVnICYgMTw8NyAgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHBfcmF0ZSwgcl9yYXRlLAorCQkgICAgICBwX2NoYW4sCisJCSAgICAgIHBfcmVnICYgMTw8MTQgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHJfcmVnICYgMTw8MTQgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHBfcmVnICYgMTw8MTUgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIHJfcmVnICYgMTw8MTUgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIGZvcnRlLT5wbGF5LmJ1Zl9zeiwgICAgICAgZm9ydGUtPnJlYy5idWZfc3osCisJCSAgICAgIGZvcnRlLT5wbGF5LmZyYWdfc3osICAgICAgZm9ydGUtPnJlYy5mcmFnX3N6LAorCQkgICAgICBmb3J0ZS0+cGxheS5mcmFnX251bSwgICAgIGZvcnRlLT5yZWMuZnJhZ19udW0sCisJCSAgICAgIGZvcnRlLT5wbGF5LmZyYWdfbXNlY3MsICAgZm9ydGUtPnJlYy5mcmFnX21zZWNzLAorCQkgICAgICBmb3J0ZS0+cGxheS5maWxsZWRfZnJhZ3MsIGZvcnRlLT5yZWMuZmlsbGVkX2ZyYWdzLAorCQkgICAgICBmb3J0ZS0+cGxheS5tYXBwZWQgPyAieWVzIiA6ICJubyIsCisJCSAgICAgIGZvcnRlLT5yZWMubWFwcGVkID8gInllcyIgOiAibm8iCisJCSk7CisKKwlyZXR1cm4gaTsKK30KKworCisvKioKKyAqIGZvcnRlX3Byb2NfaW5pdDoKKyAqCisgKiBDcmVhdGVzIGRyaXZlciBpbmZvIGVudHJpZXMgaW4gL3Byb2MKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCAKK2ZvcnRlX3Byb2NfaW5pdCAodm9pZCkKK3sKKwlpZiAoIXByb2NfbWtkaXIgKCJkcml2ZXIvZm9ydGUiLCBOVUxMKSkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIWNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKCJkcml2ZXIvZm9ydGUvY2hpcCIsIDAsIE5VTEwsIGZvcnRlX3Byb2NfcmVhZCwgZm9ydGUpKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5ICgiZHJpdmVyL2ZvcnRlIiwgTlVMTCk7CisJCXJldHVybiAtRUlPOworCX0KKworCWlmICghY3JlYXRlX3Byb2NfcmVhZF9lbnRyeSgiZHJpdmVyL2ZvcnRlL2FjOTciLCAwLCBOVUxMLCBhYzk3X3JlYWRfcHJvYywgZm9ydGUtPmFjOTcpKSB7CisJCXJlbW92ZV9wcm9jX2VudHJ5ICgiZHJpdmVyL2ZvcnRlL2NoaXAiLCBOVUxMKTsKKwkJcmVtb3ZlX3Byb2NfZW50cnkgKCJkcml2ZXIvZm9ydGUiLCBOVUxMKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBmb3J0ZV9wcm9jX3JlbW92ZToKKyAqCisgKiBSZW1vdmVzIGRyaXZlciBpbmZvIGVudHJpZXMgaW4gL3Byb2MKKyAqLworCitzdGF0aWMgdm9pZAorZm9ydGVfcHJvY19yZW1vdmUgKHZvaWQpCit7CisJcmVtb3ZlX3Byb2NfZW50cnkgKCJkcml2ZXIvZm9ydGUvYWM5NyIsIE5VTEwpOworCXJlbW92ZV9wcm9jX2VudHJ5ICgiZHJpdmVyL2ZvcnRlL2NoaXAiLCBOVUxMKTsKKwlyZW1vdmVfcHJvY19lbnRyeSAoImRyaXZlci9mb3J0ZSIsIE5VTEwpOwkKK30KKworCisvKioKKyAqIGZvcnRlX2NoaXBfaW5pdDoKKyAqIEBjaGlwOglDaGlwIGluc3RhbmNlIHRvIGluaXRpYWxpemUKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqIAkJUmVzZXRzIGNoaXAsIGNvbmZpZ3VyZXMgY29kZWMgYW5kIHJlZ2lzdGVycyB0aGUgZHJpdmVyIHdpdGgKKyAqIAkJdGhlIHNvdW5kIHN1YnN5c3RlbS4KKyAqCisgKiAJCVByZXNzIGFuZCBob2xkIFN0YXJ0IGZvciA4IHNlY3MsIHRoZW4gc3dpdGNoIG9uIFJ1bgorICogCQlhbmQgaG9sZCBmb3IgNCBzZWNvbmRzLiAgTGV0IGdvIG9mIFN0YXJ0LiAgTnVtYmVycworICogCQlhc3N1bWUgYSBwcm9wZXJseSBvaWxlZCBUV0cuCisgKi8KKworc3RhdGljIGludCBfX2RldmluaXQKK2ZvcnRlX2NoaXBfaW5pdCAoc3RydWN0IGZvcnRlX2NoaXAgKmNoaXApCit7CisJdTggcmV2aXNpb247CisJdTE2IGNtZHc7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNoaXAtPnBjaV9kZXYsIFBDSV9SRVZJU0lPTl9JRCwgJnJldmlzaW9uKTsKKworCWlmIChyZXZpc2lvbiA+PSAweEIxKSB7CisJCWNoaXAtPm11bHRpY2hhbm5lbCA9IDE7CisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiTXVsdGktY2hhbm5lbCBkZXZpY2UgZGV0ZWN0ZWQuXG4iKTsKKwl9CisKKwkvKiBSZXNldCBjaGlwICovCisJb3V0dyAoRk9SVEVfQ0NfQ09ERUNfUkVTRVQgfCBGT1JURV9DQ19BQzk3X1JFU0VULCAKKwkgICAgICBjaGlwLT5pb2Jhc2UgKyBGT1JURV9DT0RFQ19DVFJMKTsKKwl1ZGVsYXkoMTAwKTsKKwlvdXR3ICgwLCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9DT0RFQ19DVFJMKTsKKworCS8qIFJlcXVlc3QgcmVhZCBmcm9tIEFDOTcgKi8KKwlvdXR3IChGT1JURV9BQzk3X1JFQUQgfCAoMCA8PCBGT1JURV9BQzk3X0FERFJfU0hJRlQpLCAKKwkgICAgICBjaGlwLT5pb2Jhc2UgKyBGT1JURV9BQzk3X0NNRCk7CisJbWRlbGF5KDc1MCk7CisKKwlpZiAoKGludyAoY2hpcC0+aW9iYXNlICsgRk9SVEVfQUM5N19DTUQpICYgKDM8PDgpKSAhPSAoMTw8OCkpIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gUEZYICJBQzk3IGNvZGVjIG5vdCByZXNwb25kaW5nIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIEluaXQgdm9sdW1lICovCisJb3V0dyAoMHgwODA4LCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9QQ01fVk9MKTsKKwlvdXR3ICgweDlmMWYsIGNoaXAtPmlvYmFzZSArIEZPUlRFX0ZNX1ZPTCk7CisJb3V0dyAoMHg4ODA4LCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9JMlNfVk9MKTsKKworCS8qIEkyUyBjb250cm9sIC0gSTJTIG1vZGUgKi8KKwlvdXR3ICgweDAwMDMsIGNoaXAtPmlvYmFzZSArIEZPUlRFX0kyU19NT0RFKTsKKworCS8qIEludGVycnVwdCBzZXR1cCAtIHVubWFzayBQTEFZQkFDSyAmIENBUFRVUkUgKi8KKwljbWR3ID0gaW53IChjaGlwLT5pb2Jhc2UgKyBGT1JURV9JUlFfTUFTSyk7CisJY21kdyAmPSB+MHgwMDAzOworCW91dHcgKGNtZHcsIGNoaXAtPmlvYmFzZSArIEZPUlRFX0lSUV9NQVNLKTsKKworCS8qIEludGVycnVwdCBjbGVhciAqLworCW91dHcgKEZPUlRFX0lSUV9QTEFZQkFDS3xGT1JURV9JUlFfQ0FQVFVSRSwgCisJICAgICAgY2hpcC0+aW9iYXNlICsgRk9SVEVfSVJRX1NUQVRVUyk7CisKKwkvKiBTZXQgdXAgdGhlIEFDOTcgY29kZWMgKi8KKwlpZiAoKGNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwljb2RlYy0+cHJpdmF0ZV9kYXRhID0gY2hpcDsKKwljb2RlYy0+Y29kZWNfcmVhZCA9IGZvcnRlX2FjOTdfcmVhZDsKKwljb2RlYy0+Y29kZWNfd3JpdGUgPSBmb3J0ZV9hYzk3X3dyaXRlOworCWNvZGVjLT5pZCA9IDA7CisKKwlpZiAoYWM5N19wcm9iZV9jb2RlYyAoY29kZWMpID09IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImNvZGVjIHByb2JlIGZhaWxlZFxuIik7CisJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBSZWdpc3RlciBtaXhlciAqLworCWlmICgoY29kZWMtPmRldl9taXhlciA9IAorCSAgICAgcmVnaXN0ZXJfc291bmRfbWl4ZXIgKCZmb3J0ZV9taXhlcl9mb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY291bGRuJ3QgcmVnaXN0ZXIgbWl4ZXIhXG4iKTsKKwkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWNoaXAtPmFjOTcgPSBjb2RlYzsKKworCS8qIFJlZ2lzdGVyIERTUCAqLworCWlmICgoY2hpcC0+ZHNwID0gcmVnaXN0ZXJfc291bmRfZHNwICgmZm9ydGVfZHNwX2ZvcHMsIC0xKSApIDwgMCkgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiY291bGRuJ3QgcmVnaXN0ZXIgZHNwIVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBSZWdpc3RlciB3aXRoIC9wcm9jICovCisJaWYgKGZvcnRlX3Byb2NfaW5pdCgpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJjb3VsZG4ndCBhZGQgZW50cmllcyB0byAvcHJvYyFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKiBmb3J0ZV9wcm9iZToKKyAqIEBwY2lfZGV2OglQQ0kgc3RydWN0IGZvciBwcm9iZWQgZGV2aWNlCisgKiBAcGNpX2lkOgkKKyAqCisgKiBEZXNjcmlwdGlvbjoKKyAqCQlBbGxvY2F0ZXMgY2hpcCBpbnN0YW5jZSwgSS9PIHJlZ2lvbiwgYW5kIElSUQorICovCitzdGF0aWMgaW50IF9faW5pdCAKK2ZvcnRlX3Byb2JlIChzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdHJ1Y3QgZm9ydGVfY2hpcCAqY2hpcDsKKwlpbnQgcmV0ID0gMDsKKworCS8qIEZJWE1FOiBTdXBwb3J0IG1vcmUgdGhhbiBvbmUgY2hpcCAqLworCWlmIChmb3VuZCsrKQorCQlyZXR1cm4gLUVJTzsKKworCS8qIElnbml0aW9uICovCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlIChwY2lfZGV2KSkKKwkJcmV0dXJuIC1FSU87CisKKwlwY2lfc2V0X21hc3RlciAocGNpX2Rldik7CisKKwkvKiBBbGxvY2F0ZSBjaGlwIGluc3RhbmNlIGFuZCBjb25maWd1cmUgKi8KKwlmb3J0ZSA9IChzdHJ1Y3QgZm9ydGVfY2hpcCAqKSAKKwkJa21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZm9ydGVfY2hpcCksIEdGUF9LRVJORUwpOworCWNoaXAgPSBmb3J0ZTsKKworCWlmIChjaGlwID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgUEZYICJPdXQgb2YgbWVtb3J5Iik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldCAoY2hpcCwgMCwgc2l6ZW9mIChzdHJ1Y3QgZm9ydGVfY2hpcCkpOworCWNoaXAtPnBjaV9kZXYgPSBwY2lfZGV2OworCisJaW5pdF9NVVRFWCgmY2hpcC0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0ICgmY2hpcC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQgKCZjaGlwLT5hYzk3X2xvY2spOworCisJaWYgKCEgcmVxdWVzdF9yZWdpb24gKHBjaV9yZXNvdXJjZV9zdGFydCAocGNpX2RldiwgMCksCisJCQkgICAgICBwY2lfcmVzb3VyY2VfbGVuIChwY2lfZGV2LCAwKSwgRFJJVkVSX05BTUUpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIFBGWCAiVW5hYmxlIHRvIHJlc2VydmUgSS9PIHNwYWNlIik7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJY2hpcC0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwY2lfZGV2LCAwKTsKKwljaGlwLT5pcnEgPSBwY2lfZGV2LT5pcnE7CisKKwlpZiAocmVxdWVzdF9pcnEgKGNoaXAtPmlycSwgZm9ydGVfaW50ZXJydXB0LCBTQV9TSElSUSwgRFJJVkVSX05BTUUsCisJCQkgY2hpcCkpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgUEZYICJVbmFibGUgdG8gcmVzZXJ2ZSBJUlEiKTsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJvcjsKKwl9CQkKKwkKKwlwY2lfc2V0X2RydmRhdGEgKHBjaV9kZXYsIGNoaXApOworCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJGTTgwMSBjaGlwIGZvdW5kIGF0IDB4JTA0bFgtMHglMDRsWCBJUlEgJXVcbiIsIAorCQljaGlwLT5pb2Jhc2UsIHBjaV9yZXNvdXJjZV9lbmQgKHBjaV9kZXYsIDApLCBjaGlwLT5pcnEpOworCisJLyogUG93ZXIgaXQgdXAgKi8KKwlpZiAoKHJldCA9IGZvcnRlX2NoaXBfaW5pdCAoY2hpcCkpID09IDApCisJCXJldHVybiAwOworCisgZXJyb3I6CisJaWYgKGNoaXAtPmlycSkKKwkJZnJlZV9pcnEgKGNoaXAtPmlycSwgY2hpcCk7CisKKwlpZiAoY2hpcC0+aW9iYXNlKSAKKwkJcmVsZWFzZV9yZWdpb24gKHBjaV9yZXNvdXJjZV9zdGFydCAocGNpX2RldiwgMCksCisJCQkJcGNpX3Jlc291cmNlX2xlbiAocGNpX2RldiwgMCkpOworCQkKKwlrZnJlZSAoY2hpcCk7CisKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICogZm9ydGVfcmVtb3ZlOgorICogQHBjaV9kZXY6CVBDSSBkZXZpY2UgdG8gdW5jbGFpbQorICoKKyAqLworCitzdGF0aWMgdm9pZCAKK2ZvcnRlX3JlbW92ZSAoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IGZvcnRlX2NoaXAgKmNoaXAgPSBwY2lfZ2V0X2RydmRhdGEgKHBjaV9kZXYpOworCisJaWYgKGNoaXAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogVHVybiB2b2x1bWUgZG93biB0byBhdm9pZCBwb3BwaW5nICovCisJb3V0dyAoMHgxZjFmLCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9QQ01fVk9MKTsKKwlvdXR3ICgweDFmMWYsIGNoaXAtPmlvYmFzZSArIEZPUlRFX0ZNX1ZPTCk7CisJb3V0dyAoMHgxZjFmLCBjaGlwLT5pb2Jhc2UgKyBGT1JURV9JMlNfVk9MKTsKKworCWZvcnRlX3Byb2NfcmVtb3ZlKCk7CisJZnJlZV9pcnEgKGNoaXAtPmlycSwgY2hpcCk7CisJcmVsZWFzZV9yZWdpb24gKGNoaXAtPmlvYmFzZSwgcGNpX3Jlc291cmNlX2xlbiAocGNpX2RldiwgMCkpOworCisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AgKGNoaXAtPmRzcCk7CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlciAoY2hpcC0+YWM5Ny0+ZGV2X21peGVyKTsKKwlhYzk3X3JlbGVhc2VfY29kZWMoY2hpcC0+YWM5Nyk7CisJa2ZyZWUgKGNoaXApOworCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJkcml2ZXIgcmVsZWFzZWRcbiIpOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBmb3J0ZV9wY2lfaWRzW10gPSB7CisJeyAweDEzMTksIDB4MDgwMSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMCwgfSwKKwl7IDAsIH0KK307CisKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGZvcnRlX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJCQk9IERSSVZFUl9OQU1FLAorCS5pZF90YWJsZQkJPSBmb3J0ZV9wY2lfaWRzLAorCS5wcm9iZQkgCQk9IGZvcnRlX3Byb2JlLAorCS5yZW1vdmUJCQk9IGZvcnRlX3JlbW92ZSwKKworfTsKKworCisvKioKKyAqIGZvcnRlX2luaXRfbW9kdWxlOgorICoKKyAqLworCitzdGF0aWMgaW50IF9faW5pdAorZm9ydGVfaW5pdF9tb2R1bGUgKHZvaWQpCit7CisJcHJpbnRrIChLRVJOX0lORk8gUEZYIERSSVZFUl9WRVJTSU9OICJcbiIpOworCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIgKCZmb3J0ZV9wY2lfZHJpdmVyKTsKK30KKworCisvKioKKyAqIGZvcnRlX2NsZWFudXBfbW9kdWxlOgorICoKKyAqLworCitzdGF0aWMgdm9pZCBfX2V4aXQgCitmb3J0ZV9jbGVhbnVwX21vZHVsZSAodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIgKCZmb3J0ZV9wY2lfZHJpdmVyKTsKK30KKworCittb2R1bGVfaW5pdChmb3J0ZV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChmb3J0ZV9jbGVhbnVwX21vZHVsZSk7CisKK01PRFVMRV9BVVRIT1IoIk1hcnRpbiBLLiBQZXRlcnNlbiA8bWtwQG1rcC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkZvcnRlTWVkaWEgRk04MDEgT1NTIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBmb3J0ZV9wY2lfaWRzKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ndXMuaCBiL3NvdW5kL29zcy9ndXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDUyNzFiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2d1cy5oCkBAIC0wLDAgKzEsMjQgQEAKKworI2luY2x1ZGUgImFkMTg0OC5oIgorCisvKglGcm9tIGd1c19jYXJkLmMgKi8KK2ludCBndXNfc2V0X21pZGlfaXJxKGludCBudW0pOworaXJxcmV0dXJuX3QgZ3VzaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogZHVtbXkpOworCisvKglGcm9tIGd1c193YXZlLmMgKi8KK2ludCBndXNfd2F2ZV9kZXRlY3QoaW50IGJhc2VhZGRyKTsKK3ZvaWQgZ3VzX3dhdmVfaW5pdChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOwordm9pZCBndXNfd2F2ZV91bmxvYWQgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZyk7Cit2b2lkIGd1c192b2ljZV9pcnEodm9pZCk7Cit2b2lkIGd1c193cml0ZTgoaW50IHJlZywgdW5zaWduZWQgaW50IGRhdGEpOwordm9pZCBndXN3YXZlX2RtYV9pcnEodm9pZCk7Cit2b2lkIGd1c19kZWxheSh2b2lkKTsKK2ludCBndXNfZGVmYXVsdF9taXhlcl9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZyk7Cit2b2lkIGd1c190aW1lcl9jb21tYW5kICh1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IHZhbCk7CisKKy8qCUZyb20gZ3VzX21pZGkuYyAqLwordm9pZCBndXNfbWlkaV9pbml0KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZyk7Cit2b2lkIGd1c19taWRpX2ludGVycnVwdChpbnQgZHVtbXkpOworCisvKglGcm9tIGljczIxMDEuYyAqLworaW50IGljczIxMDFfbWl4ZXJfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ndXNfY2FyZC5jIGIvc291bmQvb3NzL2d1c19jYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiMjk3NwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9ndXNfY2FyZC5jCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogc291bmQvZ3VzX2NhcmQuYworICoKKyAqIERldGVjdGlvbiByb3V0aW5lIGZvciB0aGUgR3JhdmlzIFVsdHJhc291bmQuCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqCisgKiBGcmFuayB2YW4gZGUgUG9sIDogRml4ZWQgR1VTIE1BWCBpbnRlcnJ1cHQgaGFuZGxpbmcsIGVuYWJsZWQgc2ltdWx0YW5pb3VzCisgKiAgICAgICAgICAgICAgICAgICAgdXNhZ2Ugb2YgQ1M0MjMxQSBjb2RlYywgR1VTIHdhdmUgYW5kIE1JREkgZm9yIEdVUyBNQVguCisgKiBDaHJpc3RvcGggSGVsbHdpZzogQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdCwgc2ltcGxlIGNsZWFudXBzLgorICoKKyAqIFN0YXR1czoKKyAqICAgICAgICAgICAgICBUZXN0ZWQuLi4gCisgKi8KKyAgICAgIAorIAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiZ3VzLmgiCisjaW5jbHVkZSAiZ3VzX2h3LmgiCisKK2lycXJldHVybl90IGd1c2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpOworCitpbnQgICAgICAgICAgICAgZ3VzX2Jhc2UgPSAwLCBndXNfaXJxID0gMCwgZ3VzX2RtYSA9IDA7CitpbnQgICAgICAgICAgICAgZ3VzX25vX3dhdmVfZG1hID0gMDsgCitleHRlcm4gaW50ICAgICAgZ3VzX3dhdmVfdm9sdW1lOworZXh0ZXJuIGludCAgICAgIGd1c19wY21fdm9sdW1lOworZXh0ZXJuIGludCAgICAgIGhhdmVfZ3VzX21heDsKK2ludCAgICAgICAgICAgICBndXNfcG5wX2ZsYWcgPSAwOworI2lmZGVmIENPTkZJR19TT1VORF9HVVMxNgorc3RhdGljIGludCAgICAgIGRiMTY7CS8qIEhhcyBhIEd1czE2IEFEMTg0OCBvbiBpdCAqLworI2VuZGlmCisKK3N0YXRpYyB2b2lkIF9faW5pdCBhdHRhY2hfZ3VzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlndXNfd2F2ZV9pbml0KGh3X2NvbmZpZyk7CisKKwlpZiAoc291bmRfYWxsb2NfZG1hKGh3X2NvbmZpZy0+ZG1hLCAiR1VTIikpCisJCXByaW50ayhLRVJOX0VSUiAiZ3VzX2NhcmQuYzogQ2FuJ3QgYWxsb2NhdGUgRE1BIGNoYW5uZWwgJWRcbiIsIGh3X2NvbmZpZy0+ZG1hKTsKKwlpZiAoaHdfY29uZmlnLT5kbWEyICE9IC0xICYmIGh3X2NvbmZpZy0+ZG1hMiAhPSBod19jb25maWctPmRtYSkKKwkJaWYgKHNvdW5kX2FsbG9jX2RtYShod19jb25maWctPmRtYTIsICJHVVMoMikiKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiZ3VzX2NhcmQuYzogQ2FuJ3QgYWxsb2NhdGUgRE1BIGNoYW5uZWwgJWRcbiIsIGh3X2NvbmZpZy0+ZG1hMik7CisJZ3VzX21pZGlfaW5pdChod19jb25maWcpOworCWlmKHJlcXVlc3RfaXJxKGh3X2NvbmZpZy0+aXJxLCBndXNpbnRyLCAwLCAgIkdyYXZpcyBVbHRyYXNvdW5kIiwgaHdfY29uZmlnKTwwKQorCQlwcmludGsoS0VSTl9FUlIgImd1c19jYXJkLmM6IFVuYWJsZSB0byBhbGxvY2F0ZSBJUlEgJWRcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfZ3VzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgICAgICAgICAgICAgaXJxOworCWludCAgICAgICAgICAgICBpb19hZGRyOworCisJaWYgKGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlID09IDEpCisJCWd1c19wbnBfZmxhZyA9IDE7CisKKwlpcnEgPSBod19jb25maWctPmlycTsKKworCWlmIChod19jb25maWctPmNhcmRfc3VidHlwZSA9PSAwKQkvKiBHVVMvTUFYL0FDRSAqLworCQlpZiAoaXJxICE9IDMgJiYgaXJxICE9IDUgJiYgaXJxICE9IDcgJiYgaXJxICE9IDkgJiYKKwkJICAgIGlycSAhPSAxMSAmJiBpcnEgIT0gMTIgJiYgaXJxICE9IDE1KQorCQkgIHsKKwkJCSAgcHJpbnRrKEtFUk5fRVJSICJHVVM6IFVuc3VwcG9ydGVkIElSUSAlZFxuIiwgaXJxKTsKKwkJCSAgcmV0dXJuIDA7CisJCSAgfQorCWlmIChndXNfd2F2ZV9kZXRlY3QoaHdfY29uZmlnLT5pb19iYXNlKSkKKwkJcmV0dXJuIDE7CisKKyNpZm5kZWYgRVhDTFVERV9HVVNfSU9ERVRFQ1QKKworCS8qCisJICogTG9vayBhdCB0aGUgcG9zc2libGUgYmFzZSBhZGRyZXNzZXMgKDB4MlgwLCBYPTEsIDIsIDMsIDQsIDUsIDYpCisJICovCisKKwlmb3IgKGlvX2FkZHIgPSAweDIxMDsgaW9fYWRkciA8PSAweDI2MDsgaW9fYWRkciArPSAweDEwKSB7CisJCWlmIChpb19hZGRyID09IGh3X2NvbmZpZy0+aW9fYmFzZSkJLyogQWxyZWFkeSB0ZXN0ZWQgKi8KKwkJCWNvbnRpbnVlOworCQlpZiAoZ3VzX3dhdmVfZGV0ZWN0KGlvX2FkZHIpKSB7CisJCQlod19jb25maWctPmlvX2Jhc2UgPSBpb19hZGRyOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisjZW5kaWYKKworCXByaW50aygiTk8gR1VTIGNhcmQgZm91bmQgIVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfZ3VzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlEREIocHJpbnRrKCJ1bmxvYWRfZ3VzKCV4KVxuIiwgaHdfY29uZmlnLT5pb19iYXNlKSk7CisKKwlndXNfd2F2ZV91bmxvYWQoaHdfY29uZmlnKTsKKworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMTYpOworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSArIDB4MTAwLCAxMik7CQkvKiAweDEwYy0+IGlzIE1BWCAqLworCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCBod19jb25maWcpOworCisJc291bmRfZnJlZV9kbWEoaHdfY29uZmlnLT5kbWEpOworCisJaWYgKGh3X2NvbmZpZy0+ZG1hMiAhPSAtMSAmJiBod19jb25maWctPmRtYTIgIT0gaHdfY29uZmlnLT5kbWEpCisJCXNvdW5kX2ZyZWVfZG1hKGh3X2NvbmZpZy0+ZG1hMik7Cit9CisKK2lycXJldHVybl90IGd1c2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpCit7CisJdW5zaWduZWQgY2hhciBzcmM7CisJZXh0ZXJuIGludCBndXNfdGltZXJfZW5hYmxlZDsKKwlpbnQgaGFuZGxlZCA9IDA7CisKKyNpZmRlZiBDT05GSUdfU09VTkRfR1VTTUFYCisJaWYgKGhhdmVfZ3VzX21heCkgeworCQlzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcgPSBkZXZfaWQ7CisJCWFkaW50cihpcnEsICh2b2lkICopaHdfY29uZmlnLT5zbG90c1sxXSwgTlVMTCk7CisJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NPVU5EX0dVUzE2CisJaWYgKGRiMTYpIHsKKwkJc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnID0gZGV2X2lkOworCQlhZGludHIoaXJxLCAodm9pZCAqKWh3X2NvbmZpZy0+c2xvdHNbM10sIE5VTEwpOworCX0KKyNlbmRpZgorCisJd2hpbGUgKDEpCisJeworCQlpZiAoIShzcmMgPSBpbmIodV9JcnFTdGF0dXMpKSkKKwkJCWJyZWFrOworCQloYW5kbGVkID0gMTsKKwkJaWYgKHNyYyAmIERNQV9UQ19JUlEpCisJCXsKKwkJCWd1c3dhdmVfZG1hX2lycSgpOworCQl9CisJCWlmIChzcmMgJiAoTUlESV9UWF9JUlEgfCBNSURJX1JYX0lSUSkpCisJCXsKKwkJCWd1c19taWRpX2ludGVycnVwdCgwKTsKKwkJfQorCQlpZiAoc3JjICYgKEdGMV9USU1FUjFfSVJRIHwgR0YxX1RJTUVSMl9JUlEpKQorCQl7CisJCQlpZiAoZ3VzX3RpbWVyX2VuYWJsZWQpCisJCQkJc291bmRfdGltZXJfaW50ZXJydXB0KCk7CisJCQlndXNfd3JpdGU4KDB4NDUsIDApOwkvKiBBY2sgSVJRICovCisJCQlndXNfdGltZXJfY29tbWFuZCg0LCAweDgwKTsJCS8qIFJlc2V0IElSUSBmbGFncyAqLworCQl9CisJCWlmIChzcmMgJiAoV0FWRVRBQkxFX0lSUSB8IEVOVkVMT1BFX0lSUSkpCisJCQlndXNfdm9pY2VfaXJxKCk7CisJfQorCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKgorICoJU29tZSBleHRyYSBjb2RlIGZvciB0aGUgMTYgYml0IHNhbXBsaW5nIG9wdGlvbgorICovCisKKyNpZmRlZiBDT05GSUdfU09VTkRfR1VTMTYKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9ndXNfZGIxNihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJc3RydWN0IHJlc291cmNlICpwb3J0czsKKworCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0LCAiYWQxODQ4Iik7CisJaWYgKCFwb3J0cykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFkMTg0OF9kZXRlY3QocG9ydHMsIE5VTEwsIGh3X2NvbmZpZy0+b3NwKSkgeworCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlndXNfcGNtX3ZvbHVtZSA9IDEwMDsKKwlndXNfd2F2ZV92b2x1bWUgPSA5MDsKKworCWh3X2NvbmZpZy0+c2xvdHNbM10gPSBhZDE4NDhfaW5pdCgiR1VTIDE2IGJpdCBzYW1wbGluZyIsIHBvcnRzLAorCQkJCQkgIGh3X2NvbmZpZy0+aXJxLAorCQkJCQkgIGh3X2NvbmZpZy0+ZG1hLAorCQkJCQkgIGh3X2NvbmZpZy0+ZG1hLCAwLAorCQkJCQkgIGh3X2NvbmZpZy0+b3NwLAorCQkJCQkgIFRISVNfTU9EVUxFKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9ndXNfZGIxNihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisKKwlhZDE4NDhfdW5sb2FkKGh3X2NvbmZpZy0+aW9fYmFzZSwKKwkJICAgICAgaHdfY29uZmlnLT5pcnEsCisJCSAgICAgIGh3X2NvbmZpZy0+ZG1hLAorCQkgICAgICBod19jb25maWctPmRtYSwgMCk7CisJc291bmRfdW5sb2FkX2F1ZGlvZGV2KGh3X2NvbmZpZy0+c2xvdHNbM10pOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU09VTkRfR1VTMTYKK3N0YXRpYyBpbnQgZ3VzMTY7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU09VTkRfR1VTTUFYCitzdGF0aWMgaW50IG5vX3dhdmVfZG1hOyAgIC8qIFNldCBpZiBubyBkbWEgaXMgdG8gYmUgdXNlZCBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdmUgdGFibGUgKEdGMSBjaGlwKSAqLworI2VuZGlmCisKKworLyoKKyAqICAgIE5vdGUgRE1BMiBvZiAtMSBoYXMgdGhlIHJpZ2h0IG1lYW5pbmcgaW4gdGhlIEdVUyBkcml2ZXIgYXMgd2VsbAorICogICAgICBhcyBoZXJlLiAKKyAqLworCitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpbyA9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGlycSA9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGRtYSA9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGRtYTE2ID0gLTE7CS8qIFNldCB0aGlzIGZvciBtb2R1bGVzIHRoYXQgbmVlZCBpdCAqLworc3RhdGljIGludCBfX2luaXRkYXRhIHR5cGUgPSAwOwkJLyogMSBmb3IgUG5QICovCisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYTE2LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHR5cGUsIGludCwgMCk7CisjaWZkZWYgQ09ORklHX1NPVU5EX0dVU01BWAorbW9kdWxlX3BhcmFtKG5vX3dhdmVfZG1hLCBpbnQsIDApOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NPVU5EX0dVUzE2Cittb2R1bGVfcGFyYW0oZGIxNiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShndXMxNiwgaW50LCAwKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2d1cyh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIkdyYXZpcyBVbHRyYXNvdW5kIGF1ZGlvIGRyaXZlciBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk2XG4iKTsKKworCWNmZy5pb19iYXNlID0gaW87CisJY2ZnLmlycSA9IGlycTsKKwljZmcuZG1hID0gZG1hOworCWNmZy5kbWEyID0gZG1hMTY7CisJY2ZnLmNhcmRfc3VidHlwZSA9IHR5cGU7CisjaWZkZWYgQ09ORklHX1NPVU5EX0dVU01BWAorCWd1c19ub193YXZlX2RtYSA9IG5vX3dhdmVfZG1hOworI2VuZGlmCisKKwlpZiAoY2ZnLmlvX2Jhc2UgPT0gLTEgfHwgY2ZnLmRtYSA9PSAtMSB8fCBjZmcuaXJxID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSS9PLCBJUlEsIGFuZCBETUEgYXJlIG1hbmRhdG9yeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworI2lmZGVmIENPTkZJR19TT1VORF9HVVMxNgorCWlmIChndXMxNiAmJiBpbml0X2d1c19kYjE2KCZjZmcpKQorCQlkYjE2ID0gMTsKKyNlbmRpZgorCWlmICghcHJvYmVfZ3VzKCZjZmcpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlhdHRhY2hfZ3VzKCZjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX2d1cyh2b2lkKQoreworI2lmZGVmIENPTkZJR19TT1VORF9HVVMxNgorCWlmIChkYjE2KQorCQl1bmxvYWRfZ3VzX2RiMTYoJmNmZyk7CisjZW5kaWYKKwl1bmxvYWRfZ3VzKCZjZmcpOworfQorCittb2R1bGVfaW5pdChpbml0X2d1cyk7Cittb2R1bGVfZXhpdChjbGVhbnVwX2d1cyk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9ndXMoY2hhciAqc3RyKQoreworCS8qIGlvLCBpcnEsIGRtYSwgZG1hMiAqLworCWludCBpbnRzWzVdOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisJaW8JPSBpbnRzWzFdOworCWlycQk9IGludHNbMl07CisJZG1hCT0gaW50c1szXTsKKwlkbWExNgk9IGludHNbNF07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgiZ3VzPSIsIHNldHVwX2d1cyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ndXNfaHcuaCBiL3NvdW5kL29zcy9ndXNfaHcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTdhMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2d1c19ody5oCkBAIC0wLDAgKzEsNTAgQEAKKworLyoKKyAqIEkvTyBhZGRyZXNzZXMKKyAqLworCisjZGVmaW5lIHVfQmFzZQkJCShndXNfYmFzZSArIDB4MDAwKQorI2RlZmluZSB1X01peGVyCQkJdV9CYXNlCisjZGVmaW5lIHVfU3RhdHVzCQkoZ3VzX2Jhc2UgKyAweDAwNikKKyNkZWZpbmUgdV9UaW1lckNvbnRyb2wJCShndXNfYmFzZSArIDB4MDA4KQorI2RlZmluZSB1X1RpbWVyRGF0YQkJKGd1c19iYXNlICsgMHgwMDkpCisjZGVmaW5lIHVfSVJRRE1BQ29udHJvbAkJKGd1c19iYXNlICsgMHgwMGIpCisjZGVmaW5lIHVfTWlkaUNvbnRyb2wJCShndXNfYmFzZSArIDB4MTAwKQorI2RlZmluZSAJTUlESV9SRVNFVAkJMHgwMworI2RlZmluZQkJTUlESV9FTkFCTEVfWE1JVAkweDIwCisjZGVmaW5lCQlNSURJX0VOQUJMRV9SQ1YJCTB4ODAKKyNkZWZpbmUgdV9NaWRpU3RhdHVzCQl1X01pZGlDb250cm9sCisjZGVmaW5lCQlNSURJX1JDVl9GVUxMCQkweDAxCisjZGVmaW5lIAlNSURJX1hNSVRfRU1QVFkJCTB4MDIKKyNkZWZpbmUgCU1JRElfRlJBTUVfRVJSCQkweDEwCisjZGVmaW5lIAlNSURJX09WRVJSVU4JCTB4MjAKKyNkZWZpbmUgCU1JRElfSVJRX1BFTkQJCTB4ODAKKyNkZWZpbmUgdV9NaWRpRGF0YQkJKGd1c19iYXNlICsgMHgxMDEpCisjZGVmaW5lIHVfVm9pY2UJCQkoZ3VzX2Jhc2UgKyAweDEwMikKKyNkZWZpbmUgdV9Db21tYW5kCQkoZ3VzX2Jhc2UgKyAweDEwMykKKyNkZWZpbmUgdV9EYXRhTG8JCShndXNfYmFzZSArIDB4MTA0KQorI2RlZmluZSB1X0RhdGFIaQkJKGd1c19iYXNlICsgMHgxMDUpCisjZGVmaW5lIHVfTWl4RGF0YSAgICAgICAgICAgICAgIChndXNfYmFzZSArIDB4MTA2KSAgIC8qIFJldi4gMy43KyBtaXhpbmcgKi8KKyNkZWZpbmUgdV9NaXhTZWxlY3QgICAgICAgICAgICAgKGd1c19iYXNlICsgMHg1MDYpICAgLyogcmVnaXN0ZXJzLiAgICAgICAqLworI2RlZmluZSB1X0lycVN0YXR1cwkJdV9TdGF0dXMKKyMJZGVmaW5lIE1JRElfVFhfSVJRCQkweDAxCS8qIHBlbmRpbmcgTUlESSB4bWl0IElSUSAqLworIwlkZWZpbmUgTUlESV9SWF9JUlEJCTB4MDIJLyogcGVuZGluZyBNSURJIHJlY3YgSVJRICovCisjCWRlZmluZSBHRjFfVElNRVIxX0lSUQkJMHgwNAkvKiBnZW5lcmFsIHB1cnBvc2UgdGltZXIgKi8KKyMJZGVmaW5lIEdGMV9USU1FUjJfSVJRCQkweDA4CS8qIGdlbmVyYWwgcHVycG9zZSB0aW1lciAqLworIwlkZWZpbmUgV0FWRVRBQkxFX0lSUQkJMHgyMAkvKiBwZW5kaW5nIHdhdmV0YWJsZSBJUlEgKi8KKyMJZGVmaW5lIEVOVkVMT1BFX0lSUQkJMHg0MAkvKiBwZW5kaW5nIHZvbHVtZSBlbnZlbG9wZSBJUlEgKi8KKyMJZGVmaW5lIERNQV9UQ19JUlEJCTB4ODAJLyogcGVuZGluZyBkbWEgdGMgSVJRICovCisKKyNkZWZpbmUgSUNTMjEwMQkJMQorIwlkZWZpbmUgSUNTX01JWERFVlMJNgorIwlkZWZpbmUgREVWX01JQwkJMAorIwlkZWZpbmUgREVWX0xJTkUJCTEKKyMJZGVmaW5lIERFVl9DRAkJMgorIwlkZWZpbmUgREVWX0dGMQkJMworIwlkZWZpbmUgREVWX1VOVVNFRAk0CisjCWRlZmluZSBERVZfVk9MCQk1CisKKyMJZGVmaW5lIENITl9MRUZUCQkwCisjCWRlZmluZSBDSE5fUklHSFQJMQorI2RlZmluZSBDUzQyMzEJCTIKKyNkZWZpbmUgdV9EUkFNSU8JCShndXNfYmFzZSArIDB4MTA3KQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2d1c19saW5lYXJ2b2wuaCBiL3NvdW5kL29zcy9ndXNfbGluZWFydm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FkMGMzMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9ndXNfbGluZWFydm9sLmgKQEAgLTAsMCArMSwxOCBAQAorc3RhdGljIHVuc2lnbmVkIHNob3J0IGd1c19saW5lYXJ2b2xbMTI4XSA9IHsKKyAweDAwMDAsIDB4MDhmZiwgMHgwOWZmLCAweDBhODAsIDB4MGFmZiwgMHgwYjQwLCAweDBiODAsIDB4MGJjMCwKKyAweDBiZmYsIDB4MGMyMCwgMHgwYzQwLCAweDBjNjAsIDB4MGM4MCwgMHgwY2EwLCAweDBjYzAsIDB4MGNlMCwKKyAweDBjZmYsIDB4MGQxMCwgMHgwZDIwLCAweDBkMzAsIDB4MGQ0MCwgMHgwZDUwLCAweDBkNjAsIDB4MGQ3MCwKKyAweDBkODAsIDB4MGQ5MCwgMHgwZGEwLCAweDBkYjAsIDB4MGRjMCwgMHgwZGQwLCAweDBkZTAsIDB4MGRmMCwKKyAweDBkZmYsIDB4MGUwOCwgMHgwZTEwLCAweDBlMTgsIDB4MGUyMCwgMHgwZTI4LCAweDBlMzAsIDB4MGUzOCwKKyAweDBlNDAsIDB4MGU0OCwgMHgwZTUwLCAweDBlNTgsIDB4MGU2MCwgMHgwZTY4LCAweDBlNzAsIDB4MGU3OCwKKyAweDBlODAsIDB4MGU4OCwgMHgwZTkwLCAweDBlOTgsIDB4MGVhMCwgMHgwZWE4LCAweDBlYjAsIDB4MGViOCwKKyAweDBlYzAsIDB4MGVjOCwgMHgwZWQwLCAweDBlZDgsIDB4MGVlMCwgMHgwZWU4LCAweDBlZjAsIDB4MGVmOCwKKyAweDBlZmYsIDB4MGYwNCwgMHgwZjA4LCAweDBmMGMsIDB4MGYxMCwgMHgwZjE0LCAweDBmMTgsIDB4MGYxYywKKyAweDBmMjAsIDB4MGYyNCwgMHgwZjI4LCAweDBmMmMsIDB4MGYzMCwgMHgwZjM0LCAweDBmMzgsIDB4MGYzYywKKyAweDBmNDAsIDB4MGY0NCwgMHgwZjQ4LCAweDBmNGMsIDB4MGY1MCwgMHgwZjU0LCAweDBmNTgsIDB4MGY1YywKKyAweDBmNjAsIDB4MGY2NCwgMHgwZjY4LCAweDBmNmMsIDB4MGY3MCwgMHgwZjc0LCAweDBmNzgsIDB4MGY3YywKKyAweDBmODAsIDB4MGY4NCwgMHgwZjg4LCAweDBmOGMsIDB4MGY5MCwgMHgwZjk0LCAweDBmOTgsIDB4MGY5YywKKyAweDBmYTAsIDB4MGZhNCwgMHgwZmE4LCAweDBmYWMsIDB4MGZiMCwgMHgwZmI0LCAweDBmYjgsIDB4MGZiYywKKyAweDBmYzAsIDB4MGZjNCwgMHgwZmM4LCAweDBmY2MsIDB4MGZkMCwgMHgwZmQ0LCAweDBmZDgsIDB4MGZkYywKKyAweDBmZTAsIDB4MGZlNCwgMHgwZmU4LCAweDBmZWMsIDB4MGZmMCwgMHgwZmY0LCAweDBmZjgsIDB4MGZmYworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ndXNfbWlkaS5jIGIvc291bmQvb3NzL2d1c19taWRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ4ZjU3YwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9ndXNfbWlkaS5jCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogc291bmQvZ3VzMl9taWRpLmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgdGhlIEdVUyBNaWRpIEludGVyZmFjZS4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICogQ2hhbmdlczoKKyAqIDExLTEwLTIwMDAJQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Ymt6QGxpbnV4LWlkZS5vcmc+CisgKgkJQWRkZWQgX19pbml0IHRvIGd1c19taWRpX2luaXQoKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgImd1cy5oIgorI2luY2x1ZGUgImd1c19ody5oIgorCitzdGF0aWMgaW50ICAgICAgbWlkaV9idXN5LCBpbnB1dF9vcGVuZWQ7CitzdGF0aWMgaW50ICAgICAgbXlfZGV2Oworc3RhdGljIGludCAgICAgIG91dHB1dF91c2VkOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgZ3VzX21pZGlfY29udHJvbDsKK3N0YXRpYyB2b2lkICAgICAoKm1pZGlfaW5wdXRfaW50cikgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSk7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRtcF9xdWV1ZVsyNTZdOworZXh0ZXJuIGludCAgICAgIGd1c19wbnBfZmxhZzsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcWxlbjsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHFoZWFkLCBxdGFpbDsKK2V4dGVybiBpbnQgICAgICBndXNfYmFzZSwgZ3VzX2lycSwgZ3VzX2RtYTsKK2V4dGVybiBpbnQgICAgICpndXNfb3NwOworZXh0ZXJuIHNwaW5sb2NrX3QgZ3VzX2xvY2s7CisKK3N0YXRpYyBpbnQgR1VTX01JRElfU1RBVFVTKHZvaWQpCit7CisJcmV0dXJuIGluYih1X01pZGlTdGF0dXMpOworfQorCitzdGF0aWMgaW50IGd1c19taWRpX29wZW4oaW50IGRldiwgaW50IG1vZGUsIHZvaWQgKCppbnB1dCkgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSksIHZvaWQgKCpvdXRwdXQpIChpbnQgZGV2KSkKK3sKKwlpZiAobWlkaV9idXN5KQorCXsKKy8qCQlwcmludGsoIkdVUzogTWlkaSBidXN5XG4iKTsqLworCQlyZXR1cm4gLUVCVVNZOworCX0KKwlvdXRiKChNSURJX1JFU0VUKSwgdV9NaWRpQ29udHJvbCk7CisJZ3VzX2RlbGF5KCk7CisKKwlndXNfbWlkaV9jb250cm9sID0gMDsKKwlpbnB1dF9vcGVuZWQgPSAwOworCisJaWYgKG1vZGUgPT0gT1BFTl9SRUFEIHx8IG1vZGUgPT0gT1BFTl9SRUFEV1JJVEUpCisJCWlmICghZ3VzX3BucF9mbGFnKQorCQl7CisJCQlndXNfbWlkaV9jb250cm9sIHw9IE1JRElfRU5BQkxFX1JDVjsKKwkJCWlucHV0X29wZW5lZCA9IDE7CisJCX0KKwlvdXRiKChndXNfbWlkaV9jb250cm9sKSwgdV9NaWRpQ29udHJvbCk7CS8qIEVuYWJsZSAqLworCisJbWlkaV9idXN5ID0gMTsKKwlxbGVuID0gcWhlYWQgPSBxdGFpbCA9IG91dHB1dF91c2VkID0gMDsKKwltaWRpX2lucHV0X2ludHIgPSBpbnB1dDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGR1bXBfdG9fbWlkaSh1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgIG9rID0gMDsKKworCW91dHB1dF91c2VkID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jaywgZmxhZ3MpOworCisJaWYgKEdVU19NSURJX1NUQVRVUygpICYgTUlESV9YTUlUX0VNUFRZKQorCXsKKwkJb2sgPSAxOworCQlvdXRiKChtaWRpX2J5dGUpLCB1X01pZGlEYXRhKTsKKwl9CisJZWxzZQorCXsKKwkJLyoKKwkJICogRW5hYmxlIE1pZGkgeG1pdCBpbnRlcnJ1cHRzIChhZ2FpbikKKwkJICovCisJCWd1c19taWRpX2NvbnRyb2wgfD0gTUlESV9FTkFCTEVfWE1JVDsKKwkJb3V0YigoZ3VzX21pZGlfY29udHJvbCksIHVfTWlkaUNvbnRyb2wpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwlyZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19taWRpX2Nsb3NlKGludCBkZXYpCit7CisJLyoKKwkgKiBSZXNldCBGSUZPIHBvaW50ZXJzLCBkaXNhYmxlIGludHJzCisJICovCisKKwlvdXRiKChNSURJX1JFU0VUKSwgdV9NaWRpQ29udHJvbCk7CisJbWlkaV9idXN5ID0gMDsKK30KKworc3RhdGljIGludCBndXNfbWlkaV9vdXQoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJLyoKKwkgKiBEcmFpbiB0aGUgbG9jYWwgcXVldWUgZmlyc3QKKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssIGZsYWdzKTsKKworCXdoaWxlIChxbGVuICYmIGR1bXBfdG9fbWlkaSh0bXBfcXVldWVbcWhlYWRdKSkKKwl7CisJCXFsZW4tLTsKKwkJcWhlYWQrKzsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCisJLyoKKwkgKglPdXRwdXQgdGhlIGJ5dGUgaWYgdGhlIGxvY2FsIHF1ZXVlIGlzIGVtcHR5LgorCSAqLworCisJaWYgKCFxbGVuKQorCQlpZiAoZHVtcF90b19taWRpKG1pZGlfYnl0ZSkpCisJCQlyZXR1cm4gMTsJLyoKKwkJCQkJICogT0sKKwkJCQkJICovCisKKwkvKgorCSAqCVB1dCB0byB0aGUgbG9jYWwgcXVldWUKKwkgKi8KKworCWlmIChxbGVuID49IDI1NikKKwkJcmV0dXJuIDA7CS8qCisJCQkJICogTG9jYWwgcXVldWUgZnVsbAorCQkJCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jaywgZmxhZ3MpOworCisJdG1wX3F1ZXVlW3F0YWlsXSA9IG1pZGlfYnl0ZTsKKwlxbGVuKys7CisJcXRhaWwrKzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBndXNfbWlkaV9zdGFydF9yZWFkKGludCBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3VzX21pZGlfZW5kX3JlYWQoaW50IGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZ3VzX21pZGlfa2ljayhpbnQgZGV2KQoreworfQorCitzdGF0aWMgaW50IGd1c19taWRpX2J1ZmZlcl9zdGF0dXMoaW50IGRldikKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlpZiAoIW91dHB1dF91c2VkKQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jaywgZmxhZ3MpOworCisJaWYgKHFsZW4gJiYgZHVtcF90b19taWRpKHRtcF9xdWV1ZVtxaGVhZF0pKQorCXsKKwkJcWxlbi0tOworCQlxaGVhZCsrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJcmV0dXJuIChxbGVuID4gMCkgfHwgIShHVVNfTUlESV9TVEFUVVMoKSAmIE1JRElfWE1JVF9FTVBUWSk7Cit9CisKKyNkZWZpbmUgTUlESV9TWU5USF9OQU1FCSJHcmF2aXMgVWx0cmFzb3VuZCBNaWRpIgorI2RlZmluZSBNSURJX1NZTlRIX0NBUFMJU1lOVEhfQ0FQX0lOUFVUCisjaW5jbHVkZSAibWlkaV9zeW50aC5oIgorCitzdGF0aWMgc3RydWN0IG1pZGlfb3BlcmF0aW9ucyBndXNfbWlkaV9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmluZm8JCT0geyJHcmF2aXMgVWx0cmFTb3VuZCBNaWRpIiwgMCwgMCwgU05EQ0FSRF9HVVN9LAorCS5jb252ZXJ0ZXIJPSAmc3RkX21pZGlfc3ludGgsCisJLmluX2luZm8JPSB7MH0sCisJLm9wZW4JCT0gZ3VzX21pZGlfb3BlbiwKKwkuY2xvc2UJCT0gZ3VzX21pZGlfY2xvc2UsCisJLm91dHB1dGMJPSBndXNfbWlkaV9vdXQsCisJLnN0YXJ0X3JlYWQJPSBndXNfbWlkaV9zdGFydF9yZWFkLAorCS5lbmRfcmVhZAk9IGd1c19taWRpX2VuZF9yZWFkLAorCS5raWNrCQk9IGd1c19taWRpX2tpY2ssCisJLmJ1ZmZlcl9zdGF0dXMJPSBndXNfbWlkaV9idWZmZXJfc3RhdHVzLAorfTsKKwordm9pZCBfX2luaXQgZ3VzX21pZGlfaW5pdChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJaW50IGRldiA9IHNvdW5kX2FsbG9jX21pZGlkZXYoKTsKKworCWlmIChkZXYgPT0gLTEpCisJeworCQlwcmludGsoS0VSTl9JTkZPICJndXNfbWlkaTogVG9vIG1hbnkgbWlkaSBkZXZpY2VzIGRldGVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlvdXRiKChNSURJX1JFU0VUKSwgdV9NaWRpQ29udHJvbCk7CisKKwlzdGRfbWlkaV9zeW50aC5taWRpX2RldiA9IG15X2RldiA9IGRldjsKKwlod19jb25maWctPnNsb3RzWzJdID0gZGV2OworCW1pZGlfZGV2c1tkZXZdID0gJmd1c19taWRpX29wZXJhdGlvbnM7CisJc2VxdWVuY2VyX2luaXQoKTsKKwlyZXR1cm47Cit9CisKK3ZvaWQgZ3VzX21pZGlfaW50ZXJydXB0KGludCBkdW1teSkKK3sKKwl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyIHN0YXQsIGRhdGE7CisJaW50IHRpbWVvdXQgPSAxMDsKKworCXNwaW5fbG9jaygmZ3VzX2xvY2spOworCisJd2hpbGUgKHRpbWVvdXQtLSA+IDAgJiYgKHN0YXQgPSBHVVNfTUlESV9TVEFUVVMoKSkgJiAoTUlESV9SQ1ZfRlVMTCB8IE1JRElfWE1JVF9FTVBUWSkpCisJeworCQlpZiAoc3RhdCAmIE1JRElfUkNWX0ZVTEwpCisJCXsKKwkJCWRhdGEgPSBpbmIodV9NaWRpRGF0YSk7CisJCQlpZiAoaW5wdXRfb3BlbmVkKQorCQkJCW1pZGlfaW5wdXRfaW50cihteV9kZXYsIGRhdGEpOworCQl9CisJCWlmIChzdGF0ICYgTUlESV9YTUlUX0VNUFRZKQorCQl7CisJCQl3aGlsZSAocWxlbiAmJiBkdW1wX3RvX21pZGkodG1wX3F1ZXVlW3FoZWFkXSkpCisJCQl7CisJCQkJcWxlbi0tOworCQkJCXFoZWFkKys7CisJCQl9CisJCQlpZiAoIXFsZW4pCisJCQl7CisJCQkgICAgICAvKgorCQkJICAgICAgICogRGlzYWJsZSBNaWRpIG91dHB1dCBpbnRlcnJ1cHRzLCBzaW5jZSBubyBkYXRhIGluIHRoZSBidWZmZXIKKwkJCSAgICAgICAqLworCQkJICAgICAgZ3VzX21pZGlfY29udHJvbCAmPSB+TUlESV9FTkFCTEVfWE1JVDsKKwkJCSAgICAgIG91dGIoKGd1c19taWRpX2NvbnRyb2wpLCB1X01pZGlDb250cm9sKTsKKwkJCSAgICAgIG91dGIoKGd1c19taWRpX2NvbnRyb2wpLCB1X01pZGlDb250cm9sKTsKKwkJCX0KKwkJfQorCX0KKwlzcGluX3VubG9jaygmZ3VzX2xvY2spOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2d1c192b2wuYyBiL3NvdW5kL29zcy9ndXNfdm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFlNjkyNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9ndXNfdm9sLmMKQEAgLTAsMCArMSwxNTMgQEAKKworLyoKKyAqIGd1c192b2wuYyAtIENvbXB1dGUgdm9sdW1lIGZvciBHVVMuCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJndXMuaCIKKyNpbmNsdWRlICJndXNfbGluZWFydm9sLmgiCisKKyNkZWZpbmUgR1VTX1ZPTFVNRQlndXNfd2F2ZV92b2x1bWUKKworCitleHRlcm4gaW50ICAgICAgZ3VzX3dhdmVfdm9sdW1lOworCisvKgorICogQ2FsY3VsYXRlIGd1cyB2b2x1bWUgZnJvbSBub3RlIHZlbG9jaXR5LCBtYWluIHZvbHVtZSwgZXhwcmVzc2lvbiwgYW5kCisgKiBpbnRyaW5zaWMgcGF0Y2ggdm9sdW1lIGdpdmVuIGluIHBhdGNoIGxpYnJhcnkuICBFeHByZXNzaW9uIGlzIG11bHRpcGxpZWQKKyAqIGluLCBzbyBpdCBlbXBoYXNpemVzIGRpZmZlcmVuY2VzIGluIG5vdGUgdmVsb2NpdHksIHdoaWxlIG1haW4gdm9sdW1lIGlzCisgKiBhZGRlZCBpbiAtLSBJIGRvbid0IGtub3cgd2hldGhlciB0aGlzIGlzIHJpZ2h0LCBidXQgaXQgc2VlbXMgcmVhc29uYWJsZSB0bworICogbWUuICAoSW4gdGhlIHByZXZpb3VzIHN0YWdlLCBtYWluIHZvbHVtZSBjb250cm9sbGVyIG1lc3NhZ2VzIHdlcmUgY2hhbmdlZAorICogdG8gZXhwcmVzc2lvbiBjb250cm9sbGVyIG1lc3NhZ2VzLCBpZiB0aGV5IHdlcmUgZm91bmQgdG8gYmUgdXNlZCBmb3IKKyAqIGR5bmFtaWMgdm9sdW1lIGFkanVzdG1lbnRzLCBzbyBoZXJlLCBtYWluIHZvbHVtZSBjYW4gYmUgYXNzdW1lZCB0byBiZQorICogY29uc3RhbnQgdGhyb3VnaG91dCBhIHNvbmcuKQorICoKKyAqIEludHJpbnNpYyBwYXRjaCB2b2x1bWUgaXMgYWRkZWQgaW4sIGJ1dCBpZiBvdmVyIDY0IGlzIGFsc28gbXVsdGlwbGllZCBpbiwgc28KKyAqIHdlIGNhbiBnaXZlIGEgYmlnIGJvb3N0IHRvIHZlcnkgd2VhayB2b2ljZXMgbGlrZSBueWxvbiBndWl0YXIgYW5kIHRoZQorICogYmFzc2VzLiAgVGhlIG5vcm1hbCB2YWx1ZSBpcyA2NC4gIFN0cmluZ3MgYXJlIGFzc2lnbmVkIGxvd2VyIHZhbHVlcy4KKyAqLworCit1bnNpZ25lZCBzaG9ydCBndXNfYWRhZ2lvX3ZvbChpbnQgdmVsLCBpbnQgbWFpbnYsIGludCB4cG4sIGludCB2b2ljZXYpCit7CisJaW50IGksIG0sIG4sIHg7CisKKworCS8qCisJICogQSB2b2ljZSB2b2x1bWUgb2YgNjQgaXMgY29uc2lkZXJlZCBuZXV0cmFsLCBzbyBhZGp1c3QgdGhlIG1haW4gdm9sdW1lIGlmCisJICogc29tZXRoaW5nIG90aGVyIHRoYW4gdGhpcyBuZXV0cmFsIHZhbHVlIHdhcyBhc3NpZ25lZCBpbiB0aGUgcGF0Y2gKKwkgKiBsaWJyYXJ5LgorCSAqLworCXggPSAyNTYgKyA2ICogKHZvaWNldiAtIDY0KTsKKworCS8qCisJICogQm9vc3QgZXhwcmVzc2lvbiBieSB2b2ljZSB2b2x1bWUgYWJvdmUgbmV1dHJhbC4KKwkgKi8KKwkgCisJaWYgKHZvaWNldiA+IDY1KQorCQl4cG4gKz0gdm9pY2V2IC0gNjQ7CisJeHBuICs9ICh2b2ljZXYgLSA2NCkgLyAyOworCisJLyoKKwkgKiBDb21iaW5lIG11bHRpcGxpY2F0aXZlIGFuZCBsZXZlbCBjb21wb25lbnRzLgorCSAqLworCXggPSB2ZWwgKiB4cG4gKiA2ICsgKHZvaWNldiAvIDQpICogeDsKKworI2lmZGVmIEdVU19WT0xVTUUKKwkvKgorCSAqIEZ1cnRoZXIgYWRqdXN0bWVudCBieSBpbnN0YWxsYXRpb24tc3BlY2lmaWMgbWFzdGVyIHZvbHVtZSBjb250cm9sCisJICogKGRlZmF1bHQgNjApLgorCSAqLworCXggPSAoeCAqIEdVU19WT0xVTUUgKiBHVVNfVk9MVU1FKSAvIDEwMDAwOworI2VuZGlmCisKKyNpZmRlZiBHVVNfVVNFX0NITl9NQUlOX1ZPTFVNRQorCS8qCisJICogRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHRoZSBjaGFubmVsIG1haW4gdm9sdW1lCisJICovCisKKwltYWludiA9IChtYWludiAvIDIpICsgNjQ7CS8qIFNjYWxlIHRvIDY0IHRvIDEyNyAqLworCXggPSAoeCAqIG1haW52ICogbWFpbnYpIC8gMTYzODQ7CisjZW5kaWYKKworCWlmICh4IDwgMikKKwkJcmV0dXJuICgwKTsKKwllbHNlIGlmICh4ID49IDY1NTM1KQorCQlyZXR1cm4gKCgxNSA8PCA4KSB8IDI1NSk7CisKKwkvKgorCSAqIENvbnZlcnQgdG8gR1VTJ3MgbG9nYXJpdGhtaWMgZm9ybSB3aXRoIDQgYml0IGV4cG9uZW50IGkgYW5kIDggYml0CisJICogbWFudGlzc2EgbS4KKwkgKi8KKwkgCisJbiA9IHg7CisJaSA9IDc7CisJaWYgKG4gPCAxMjgpCisJeworCQkgIHdoaWxlIChpID4gMCAmJiBuIDwgKDEgPDwgaSkpCisJCQkgIGktLTsKKwl9CisJZWxzZQorCXsKKwkJd2hpbGUgKG4gPiAyNTUpCisJCXsKKwkJCSAgbiA+Pj0gMTsKKwkJCSAgaSsrOworCQl9CisJfQorCS8qCisJICogTWFudGlzc2EgaXMgcGFydCBvZiBsaW5lYXIgdm9sdW1lIG5vdCBleHByZXNzZWQgaW4gZXhwb25lbnQuICAoVGhpcyBpcworCSAqIG5vdCBxdWl0ZSBsaWtlIHJlYWwgbG9ncyAtLSBJIHdvbmRlciBpZiBpdCdzIHJpZ2h0LikKKwkgKi8KKwltID0geCAtICgxIDw8IGkpOworCisJLyoKKwkgKiBBZGp1c3QgbWFudGlzc2EgdG8gOCBiaXRzLgorCSAqLworCWlmIChtID4gMCkKKwl7CisJCWlmIChpID4gOCkKKwkJCW0gPj49IGkgLSA4OworCQllbHNlIGlmIChpIDwgOCkKKwkJCW0gPDw9IDggLSBpOworCX0KKwlyZXR1cm4gKChpIDw8IDgpICsgbSk7Cit9CisKKy8qCisgKiBWb2x1bWUtdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBsaW5lYXIgdmFsdWVzLiBWb2x1bWUgaXMgYmFzZWQgb24gdGhlCisgKiB2YWx1ZSBzdXBwbGllZCB3aXRoIFNFUV9TVEFSVF9OT1RFKCksIGNoYW5uZWwgbWFpbiB2b2x1bWUgKGlmIGNvbXBpbGVkIGluKQorICogYW5kIHRoZSB2b2x1bWUgc2V0IGJ5IHRoZSBtaXhlci1kZXZpY2UgKGRlZmF1bHQgNjAlKS4KKyAqLworCit1bnNpZ25lZCBzaG9ydCBndXNfbGluZWFyX3ZvbChpbnQgdm9sLCBpbnQgbWFpbnZvbCkKK3sKKwlpbnQgbWl4ZXJfbWFpbnZvbDsKKworCWlmICh2b2wgPD0gMCkKKwkJdm9sID0gMDsKKwllbHNlIGlmICh2b2wgPj0gMTI3KQorCQl2b2wgPSAxMjc7CisKKyNpZmRlZiBHVVNfVk9MVU1FCisJbWl4ZXJfbWFpbnZvbCA9IEdVU19WT0xVTUU7CisjZWxzZQorCW1peGVyX21haW52b2wgPSAxMDA7CisjZW5kaWYKKworI2lmZGVmIEdVU19VU0VfQ0hOX01BSU5fVk9MVU1FCisJaWYgKG1haW52b2wgPD0gMCkKKwkJbWFpbnZvbCA9IDA7CisJZWxzZSBpZiAobWFpbnZvbCA+PSAxMjcpCisJCW1haW52b2wgPSAxMjc7CisjZWxzZQorCW1haW52b2wgPSAxMjc7CisjZW5kaWYKKwlyZXR1cm4gZ3VzX2xpbmVhcnZvbFsoKCh2b2wgKiBtYWludm9sKSAvIDEyNykgKiBtaXhlcl9tYWludm9sKSAvIDEwMF07Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvZ3VzX3dhdmUuYyBiL3NvdW5kL29zcy9ndXNfd2F2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MmQ1MTgKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvZ3VzX3dhdmUuYwpAQCAtMCwwICsxLDM0NjQgQEAKKy8qCisgKiBzb3VuZC9ndXNfd2F2ZS5jCisgKgorICogRHJpdmVyIGZvciB0aGUgR3JhdmlzIFVsdHJhU291bmQgd2F2ZSB0YWJsZSBzeW50aC4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICoKKyAqIFRob21hcyBTYWlsZXIgICAgOiBpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKiBGcmFuayB2YW4gZGUgUG9sIDogRml4ZWQgR1VTIE1BWCBpbnRlcnJ1cHQgaGFuZGxpbmcuIEVuYWJsZWQgc2ltdWx0YW5pb3VzCisgKiAgICAgICAgICAgICAgICAgICAgdXNhZ2Ugb2YgQ1M0MjMxQSBjb2RlYywgR1VTIHdhdmUgYW5kIE1JREkgZm9yIEdVUyBNQVguCisgKiBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDogYWRkZWQgc29tZSBfX2luaXQvX19leGl0CisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+IAorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNkZWZpbmUgR1VTUE5QX0FVVE9ERVRFQ1QKKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgPGxpbnV4L3VsdHJhc291bmQuaD4KKworI2luY2x1ZGUgImd1cy5oIgorI2luY2x1ZGUgImd1c19ody5oIgorCisjZGVmaW5lIEdVU19CQU5LX1NJWkUgKCgoaXdfbW9kZSkgPyAyNTYqMTAyNCoxMDI0IDogMjU2KjEwMjQpKQorCisjZGVmaW5lIE1BWF9TQU1QTEUJMTUwCisjZGVmaW5lIE1BWF9QQVRDSAkyNTYKKworI2RlZmluZSBOT1RfU0FNUExFCTB4ZmZmZgorCitzdHJ1Y3Qgdm9pY2VfaW5mbworeworCXVuc2lnbmVkIGxvbmcgICBvcmlnX2ZyZXE7CisJdW5zaWduZWQgbG9uZyAgIGN1cnJlbnRfZnJlcTsKKwl1bnNpZ25lZCBsb25nICAgbW9kZTsKKwlpbnQgICAgICAgICAgICAgZml4ZWRfcGl0Y2g7CisJaW50ICAgICAgICAgICAgIGJlbmRlcjsKKwlpbnQgICAgICAgICAgICAgYmVuZGVyX3JhbmdlOworCWludCAgICAgICAgICAgICBwYW5uaW5nOworCWludCAgICAgICAgICAgICBtaWRpX3ZvbHVtZTsKKwl1bnNpZ25lZCBpbnQgICAgaW5pdGlhbF92b2x1bWU7CisJdW5zaWduZWQgaW50ICAgIGN1cnJlbnRfdm9sdW1lOworCWludCAgICAgICAgICAgICBsb29wX2lycV9tb2RlLCBsb29wX2lycV9wYXJtOworI2RlZmluZSBMTU9ERV9GSU5JU0gJCTEKKyNkZWZpbmUgTE1PREVfUENNCQkyCisjZGVmaW5lIExNT0RFX1BDTV9TVE9QCQkzCisJaW50ICAgICAgICAgICAgIHZvbHVtZV9pcnFfbW9kZSwgdm9sdW1lX2lycV9wYXJtOworI2RlZmluZSBWTU9ERV9IQUxUCQkxCisjZGVmaW5lIFZNT0RFX0VOVkVMT1BFCQkyCisjZGVmaW5lIFZNT0RFX1NUQVJUX05PVEUJMworCisJaW50ICAgICAgICAgICAgIGVudl9waGFzZTsKKwl1bnNpZ25lZCBjaGFyICAgZW52X3JhdGVbNl07CisJdW5zaWduZWQgY2hhciAgIGVudl9vZmZzZXRbNl07CisKKwkvKgorCSAqIFZvbHVtZSBjb21wdXRhdGlvbiBwYXJhbWV0ZXJzIGZvciBndXNfYWRhZ2lvX3ZvbCgpCisJICovCisJaW50CQltYWluX3ZvbCwgZXhwcmVzc2lvbl92b2wsIHBhdGNoX3ZvbDsKKworCS8qIFZhcmlhYmxlcyBmb3IgIlVsdHJhY2xpY2siIHJlbW92YWwgKi8KKwlpbnQgICAgICAgICAgICAgZGV2X3BlbmRpbmcsIG5vdGVfcGVuZGluZywgdm9sdW1lX3BlbmRpbmcsCisJICAgICAgICAgICAgICAgIHNhbXBsZV9wZW5kaW5nOworCWNoYXIgICAgICAgICAgICBraWxsX3BlbmRpbmc7CisJbG9uZyAgICAgICAgICAgIG9mZnNldF9wZW5kaW5nOworCit9OworCitzdGF0aWMgc3RydWN0IHZvaWNlX2FsbG9jX2luZm8gKnZvaWNlX2FsbG9jOworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gKmd1c19od19jb25maWc7CitleHRlcm4gaW50ICAgICAgZ3VzX2Jhc2U7CitleHRlcm4gaW50ICAgICAgZ3VzX2lycSwgZ3VzX2RtYTsKK2V4dGVybiBpbnQgICAgICBndXNfcG5wX2ZsYWc7CitleHRlcm4gaW50ICAgICAgZ3VzX25vX3dhdmVfZG1hOworc3RhdGljIGludCAgICAgIGd1c19kbWEyID0gLTE7CitzdGF0aWMgaW50ICAgICAgZHVhbF9kbWFfbW9kZTsKK3N0YXRpYyBsb25nICAgICBndXNfbWVtX3NpemU7CitzdGF0aWMgbG9uZyAgICAgZnJlZV9tZW1fcHRyOworc3RhdGljIGludCAgICAgIGd1c19idXN5Oworc3RhdGljIGludCAgICAgIGd1c19ub19kbWE7CitzdGF0aWMgaW50ICAgICAgbnJfdm9pY2VzOworc3RhdGljIGludCAgICAgIGd1c19kZXZudW07CitzdGF0aWMgaW50ICAgICAgdm9sdW1lX2Jhc2UsIHZvbHVtZV9zY2FsZSwgdm9sdW1lX21ldGhvZDsKK3N0YXRpYyBpbnQgICAgICBndXNfcmVjbWFzayA9IFNPVU5EX01BU0tfTUlDOworc3RhdGljIGludCAgICAgIHJlY29yZGluZ19hY3RpdmU7CitzdGF0aWMgaW50ICAgICAgb25seV9yZWFkX2FjY2VzczsKK3N0YXRpYyBpbnQgICAgICBvbmx5XzhfYml0czsKKworc3RhdGljIGludCAgICAgIGl3X21vZGUgPSAwOworaW50ICAgICAgICAgICAgIGd1c193YXZlX3ZvbHVtZSA9IDYwOworaW50ICAgICAgICAgICAgIGd1c19wY21fdm9sdW1lID0gODA7CitpbnQgICAgICAgICAgICAgaGF2ZV9ndXNfbWF4ID0gMDsKK3N0YXRpYyBpbnQgICAgICBndXNfbGluZV92b2wgPSAxMDAsIGd1c19taWNfdm9sOworc3RhdGljIHVuc2lnbmVkIGNoYXIgbWl4X2ltYWdlID0gMHgwMDsKKworaW50ICAgICAgICAgICAgIGd1c190aW1lcl9lbmFibGVkID0gMDsKKworLyoKKyAqIEN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGRyaXZlciBkb2Vzbid0IGFsbG93IHN5bnRoIGFuZCBQQ00gZnVuY3Rpb25zCisgKiBhdCB0aGUgc2FtZSB0aW1lLiBUaGUgYWN0aXZlX2RldmljZSBzcGVjaWZpZXMgdGhlIGFjdGl2ZSBkcml2ZXIKKyAqLworCitzdGF0aWMgaW50ICAgICAgYWN0aXZlX2RldmljZTsKKworI2RlZmluZSBHVVNfREVWX1dBVkUJCTEJLyogV2F2ZSB0YWJsZSBzeW50aCAqLworI2RlZmluZSBHVVNfREVWX1BDTV9ET05FCTIJLyogUENNIGRldmljZSwgdHJhbnNmZXIgZG9uZSAqLworI2RlZmluZSBHVVNfREVWX1BDTV9DT05USU5VRQkzCS8qIFBDTSBkZXZpY2UsIHRyYW5zZmVyIGRvbmUgY2guIDEvMiAqLworCitzdGF0aWMgaW50ICAgICAgZ3VzX2F1ZGlvX3NwZWVkOworc3RhdGljIGludCAgICAgIGd1c19hdWRpb19jaGFubmVsczsKK3N0YXRpYyBpbnQgICAgICBndXNfYXVkaW9fYml0czsKK3N0YXRpYyBpbnQgICAgICBndXNfYXVkaW9fYnNpemU7CitzdGF0aWMgY2hhciAgICAgYm91bmNlX2J1Zls4ICogMTAyNF07CS8qIE11c3QgbWF0Y2ggdmFsdWUgc2V0IHRvIG1heF9mcmFnbWVudCAqLworCitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQoZHJhbV9zbGVlcGVyKTsKKworLyoKKyAqIFZhcmlhYmxlcyBhbmQgYnVmZmVycyBmb3IgUENNIG91dHB1dAorICovCisKKyNkZWZpbmUgTUFYX1BDTV9CVUZGRVJTCQkoMTI4Kk1BWF9SRUFMVElNRV9GQUNUT1IpCS8qIERvbid0IGNoYW5nZSAqLworCitzdGF0aWMgaW50ICAgICAgcGNtX2JzaXplLCBwY21fbmJsaywgcGNtX2JhbmtzaXplOworc3RhdGljIGludCAgICAgIHBjbV9kYXRhc2l6ZVtNQVhfUENNX0JVRkZFUlNdOworc3RhdGljIHZvbGF0aWxlIGludCBwY21faGVhZCwgcGNtX3RhaWwsIHBjbV9xbGVuOworc3RhdGljIHZvbGF0aWxlIGludCBwY21fYWN0aXZlOworc3RhdGljIHZvbGF0aWxlIGludCBkbWFfYWN0aXZlOworc3RhdGljIGludCAgICAgIHBjbV9vcGVuZWQ7CitzdGF0aWMgaW50ICAgICAgcGNtX2N1cnJlbnRfZGV2Oworc3RhdGljIGludCAgICAgIHBjbV9jdXJyZW50X2Jsb2NrOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcGNtX2N1cnJlbnRfYnVmOworc3RhdGljIGludCAgICAgIHBjbV9jdXJyZW50X2NvdW50Oworc3RhdGljIGludCAgICAgIHBjbV9jdXJyZW50X2ludHJmbGFnOworREVGSU5FX1NQSU5MT0NLKGd1c19sb2NrKTsKKworZXh0ZXJuIGludCAgICAgKmd1c19vc3A7CisKK3N0YXRpYyBzdHJ1Y3Qgdm9pY2VfaW5mbyB2b2ljZXNbMzJdOworCitzdGF0aWMgaW50ICAgICAgZnJlcV9kaXZfdGFibGVbXSA9Cit7CisJNDQxMDAsCQkJLyogMTQgKi8KKwk0MTE2MCwJCQkvKiAxNSAqLworCTM4NTg3LAkJCS8qIDE2ICovCisJMzYzMTcsCQkJLyogMTcgKi8KKwkzNDMwMCwJCQkvKiAxOCAqLworCTMyNDk0LAkJCS8qIDE5ICovCisJMzA4NzAsCQkJLyogMjAgKi8KKwkyOTQwMCwJCQkvKiAyMSAqLworCTI4MDYzLAkJCS8qIDIyICovCisJMjY4NDMsCQkJLyogMjMgKi8KKwkyNTcyNSwJCQkvKiAyNCAqLworCTI0Njk2LAkJCS8qIDI1ICovCisJMjM3NDYsCQkJLyogMjYgKi8KKwkyMjg2NiwJCQkvKiAyNyAqLworCTIyMDUwLAkJCS8qIDI4ICovCisJMjEyODksCQkJLyogMjkgKi8KKwkyMDU4MCwJCQkvKiAzMCAqLworCTE5OTE2LAkJCS8qIDMxICovCisJMTkyOTMJCQkvKiAzMiAqLworfTsKKworc3RhdGljIHN0cnVjdCBwYXRjaF9pbmZvICpzYW1wbGVzOworc3RhdGljIGxvbmcgICAgIHNhbXBsZV9wdHJzW01BWF9TQU1QTEUgKyAxXTsKK3N0YXRpYyBpbnQgICAgICBzYW1wbGVfbWFwWzMyXTsKK3N0YXRpYyBpbnQgICAgICBmcmVlX3NhbXBsZTsKK3N0YXRpYyBpbnQgICAgICBtaXhlcl90eXBlOworCisKK3N0YXRpYyBpbnQgICAgICBwYXRjaF90YWJsZVtNQVhfUEFUQ0hdOworc3RhdGljIGludCAgICAgIHBhdGNoX21hcFszMl07CisKK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfaW5mbyBndXNfaW5mbyA9IHsKKwkiR3JhdmlzIFVsdHJhU291bmQiLCAwLCBTWU5USF9UWVBFX1NBTVBMRSwgU0FNUExFX1RZUEVfR1VTLCAKKwkwLCAxNiwgMCwgTUFYX1BBVENICit9OworCitzdGF0aWMgdm9pZCAgICAgZ3VzX3Bva2UobG9uZyBhZGRyLCB1bnNpZ25lZCBjaGFyIGRhdGEpOworc3RhdGljIHZvaWQgICAgIGNvbXB1dGVfYW5kX3NldF92b2x1bWUoaW50IHZvaWNlLCBpbnQgdm9sdW1lLCBpbnQgcmFtcF90aW1lKTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBndXNfYWRhZ2lvX3ZvbChpbnQgdmVsLCBpbnQgbWFpbnYsIGludCB4cG4sIGludCB2b2ljZXYpOworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGd1c19saW5lYXJfdm9sKGludCB2b2wsIGludCBtYWludm9sKTsKK3N0YXRpYyB2b2lkICAgICBjb21wdXRlX3ZvbHVtZShpbnQgdm9pY2UsIGludCB2b2x1bWUpOworc3RhdGljIHZvaWQgICAgIGRvX3ZvbHVtZV9pcnEoaW50IHZvaWNlKTsKK3N0YXRpYyB2b2lkICAgICBzZXRfaW5wdXRfdm9sdW1lcyh2b2lkKTsKK3N0YXRpYyB2b2lkICAgICBndXNfdG1yX2luc3RhbGwoaW50IGlvX2Jhc2UpOworCisjZGVmaW5lCUlOU1RBTlRfUkFNUAkJLTEJLyogSW5zdGFudCBjaGFuZ2UuIE5vIHJhbXBpbmcgKi8KKyNkZWZpbmUgRkFTVF9SQU1QCQkwCS8qIEZhc3Rlc3QgcG9zc2libGUgcmFtcCAqLworCitzdGF0aWMgdm9pZCByZXNldF9zYW1wbGVfbWVtb3J5KHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDw9IE1BWF9TQU1QTEU7IGkrKykKKwkJc2FtcGxlX3B0cnNbaV0gPSAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJc2FtcGxlX21hcFtpXSA9IC0xOworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKQorCQlwYXRjaF9tYXBbaV0gPSAtMTsKKworCWd1c19wb2tlKDAsIDApOwkJLyogUHV0IGEgc2lsZW50IHNhbXBsZSB0byB0aGUgYmVnaW5uaW5nICovCisJZ3VzX3Bva2UoMSwgMCk7CisJZnJlZV9tZW1fcHRyID0gMjsKKworCWZyZWVfc2FtcGxlID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfUEFUQ0g7IGkrKykKKwkJcGF0Y2hfdGFibGVbaV0gPSBOT1RfU0FNUExFOworfQorCit2b2lkIGd1c19kZWxheSh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJaW5iKHVfRFJBTUlPKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3Bva2UobG9uZyBhZGRyLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CQkJCS8qIFdyaXRlcyBhIGJ5dGUgdG8gdGhlIERSQU0gKi8KKwlvdXRiKCgweDQzKSwgdV9Db21tYW5kKTsKKwlvdXRiKChhZGRyICYgMHhmZiksIHVfRGF0YUxvKTsKKwlvdXRiKCgoYWRkciA+PiA4KSAmIDB4ZmYpLCB1X0RhdGFIaSk7CisKKwlvdXRiKCgweDQ0KSwgdV9Db21tYW5kKTsKKwlvdXRiKCgoYWRkciA+PiAxNikgJiAweGZmKSwgdV9EYXRhSGkpOworCW91dGIoKGRhdGEpLCB1X0RSQU1JTyk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGd1c19wZWVrKGxvbmcgYWRkcikKK3sJCQkJLyogUmVhZHMgYSBieXRlIGZyb20gdGhlIERSQU0gKi8KKwl1bnNpZ25lZCBjaGFyICAgdG1wOworCisJb3V0YigoMHg0MyksIHVfQ29tbWFuZCk7CisJb3V0YigoYWRkciAmIDB4ZmYpLCB1X0RhdGFMbyk7CisJb3V0YigoKGFkZHIgPj4gOCkgJiAweGZmKSwgdV9EYXRhSGkpOworCisJb3V0YigoMHg0NCksIHVfQ29tbWFuZCk7CisJb3V0YigoKGFkZHIgPj4gMTYpICYgMHhmZiksIHVfRGF0YUhpKTsKKwl0bXAgPSBpbmIodV9EUkFNSU8pOworCisJcmV0dXJuIHRtcDsKK30KKwordm9pZCBndXNfd3JpdGU4KGludCByZWcsIHVuc2lnbmVkIGludCBkYXRhKQorewkJCQkvKiBXcml0ZXMgdG8gYW4gaW5kaXJlY3QgcmVnaXN0ZXIgKDggYml0KSAqLworCW91dGIoKHJlZyksIHVfQ29tbWFuZCk7CisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIChkYXRhICYgMHhmZikpLCB1X0RhdGFIaSk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGd1c19yZWFkOChpbnQgcmVnKQorewkJCQkKKwkvKiBSZWFkcyBmcm9tIGFuIGluZGlyZWN0IHJlZ2lzdGVyICg4IGJpdCkuIE9mZnNldCAweDgwLiAqLworCXVuc2lnbmVkIGNoYXIgICB2YWw7CisKKwlvdXRiKChyZWcgfCAweDgwKSwgdV9Db21tYW5kKTsKKwl2YWwgPSBpbmIodV9EYXRhSGkpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3VzX2xvb2s4KGludCByZWcpCit7CisJLyogUmVhZHMgZnJvbSBhbiBpbmRpcmVjdCByZWdpc3RlciAoOCBiaXQpLiBObyBhZGRpdGlvbmFsIG9mZnNldC4gKi8KKwl1bnNpZ25lZCBjaGFyICAgdmFsOworCisJb3V0YigocmVnKSwgdV9Db21tYW5kKTsKKwl2YWwgPSBpbmIodV9EYXRhSGkpOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQgZ3VzX3dyaXRlMTYoaW50IHJlZywgdW5zaWduZWQgaW50IGRhdGEpCit7CisJLyogV3JpdGVzIHRvIGFuIGluZGlyZWN0IHJlZ2lzdGVyICgxNiBiaXQpICovCisJb3V0YigocmVnKSwgdV9Db21tYW5kKTsKKworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAoZGF0YSAmIDB4ZmYpKSwgdV9EYXRhTG8pOworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAoKGRhdGEgPj4gOCkgJiAweGZmKSksIHVfRGF0YUhpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIHNob3J0IGd1c19yZWFkMTYoaW50IHJlZykKK3sKKwkvKiBSZWFkcyBmcm9tIGFuIGluZGlyZWN0IHJlZ2lzdGVyICgxNiBiaXQpLiBPZmZzZXQgMHg4MC4gKi8KKwl1bnNpZ25lZCBjaGFyICAgaGksIGxvOworCisJb3V0YigocmVnIHwgMHg4MCksIHVfQ29tbWFuZCk7CisKKwlsbyA9IGluYih1X0RhdGFMbyk7CisJaGkgPSBpbmIodV9EYXRhSGkpOworCisJcmV0dXJuICgoaGkgPDwgOCkgJiAweGZmMDApIHwgbG87Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBndXNfbG9vazE2KGludCByZWcpCit7CQkKKwkvKiBSZWFkcyBmcm9tIGFuIGluZGlyZWN0IHJlZ2lzdGVyICgxNiBiaXQpLiBObyBhZGRpdGlvbmFsIG9mZnNldC4gKi8KKwl1bnNpZ25lZCBjaGFyICAgaGksIGxvOworCisJb3V0YigocmVnKSwgdV9Db21tYW5kKTsKKworCWxvID0gaW5iKHVfRGF0YUxvKTsKKwloaSA9IGluYih1X0RhdGFIaSk7CisKKwlyZXR1cm4gKChoaSA8PCA4KSAmIDB4ZmYwMCkgfCBsbzsKK30KKworc3RhdGljIHZvaWQgZ3VzX3dyaXRlX2FkZHIoaW50IHJlZywgdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBpbnQgZnJhYywgaW50IGlzMTZiaXQpCit7CisJLyogV3JpdGVzIGFuIDI0IGJpdCBtZW1vcnkgYWRkcmVzcyAqLworCXVuc2lnbmVkIGxvbmcgICBob2xkX2FkZHJlc3M7CisKKwlpZiAoaXMxNmJpdCkKKwl7CisJCWlmIChpd19tb2RlKQorCQl7CisJCQkvKiBJbnRlcndhdmUgc3Blc2lmaWMgYWRkcmVzcyB0cmFuc2xhdGlvbnMgKi8KKwkJCWFkZHJlc3MgPj49IDE7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKgorCQkJICogU3BlY2lhbCBwcm9jZXNzaW5nIHJlcXVpcmVkIGZvciAxNiBiaXQgcGF0Y2hlcworCQkJICovCisKKwkJCWhvbGRfYWRkcmVzcyA9IGFkZHJlc3M7CisJCQlhZGRyZXNzID0gYWRkcmVzcyA+PiAxOworCQkJYWRkcmVzcyAmPSAweDAwMDFmZmZmTDsKKwkJCWFkZHJlc3MgfD0gKGhvbGRfYWRkcmVzcyAmIDB4MDAwYzAwMDBMKTsKKwkJfQorCX0KKwlndXNfd3JpdGUxNihyZWcsICh1bnNpZ25lZCBzaG9ydCkgKChhZGRyZXNzID4+IDcpICYgMHhmZmZmKSk7CisJZ3VzX3dyaXRlMTYocmVnICsgMSwgKHVuc2lnbmVkIHNob3J0KSAoKGFkZHJlc3MgPDwgOSkgJiAweGZmZmYpCisJCSAgICArIChmcmFjIDw8IDUpKTsKKwkvKiBDb3VsZCB3cml0aW5nIHR3aWNlIGZpeCBwcm9ibGVtcyB3aXRoIEdVU19WT0lDRV9QT1MoKT8gTGV0J3MgdHJ5LiAqLworCWd1c19kZWxheSgpOworCWd1c193cml0ZTE2KHJlZywgKHVuc2lnbmVkIHNob3J0KSAoKGFkZHJlc3MgPj4gNykgJiAweGZmZmYpKTsKKwlndXNfd3JpdGUxNihyZWcgKyAxLCAodW5zaWduZWQgc2hvcnQpICgoYWRkcmVzcyA8PCA5KSAmIDB4ZmZmZikKKwkJICAgICsgKGZyYWMgPDwgNSkpOworfQorCitzdGF0aWMgdm9pZCBndXNfc2VsZWN0X3ZvaWNlKGludCB2b2ljZSkKK3sKKwlpZiAodm9pY2UgPCAwIHx8IHZvaWNlID4gMzEpCisJCXJldHVybjsKKwlvdXRiKCh2b2ljZSksIHVfVm9pY2UpOworfQorCitzdGF0aWMgdm9pZCBndXNfc2VsZWN0X21heF92b2ljZXMoaW50IG52b2ljZXMpCit7CisJaWYgKGl3X21vZGUpCisJCW52b2ljZXMgPSAzMjsKKwlpZiAobnZvaWNlcyA8IDE0KQorCQludm9pY2VzID0gMTQ7CisJaWYgKG52b2ljZXMgPiAzMikKKwkJbnZvaWNlcyA9IDMyOworCisJdm9pY2VfYWxsb2MtPm1heF92b2ljZSA9IG5yX3ZvaWNlcyA9IG52b2ljZXM7CisJZ3VzX3dyaXRlOCgweDBlLCAobnZvaWNlcyAtIDEpIHwgMHhjMCk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c192b2ljZV9vbih1bnNpZ25lZCBpbnQgbW9kZSkKK3sKKwlndXNfd3JpdGU4KDB4MDAsICh1bnNpZ25lZCBjaGFyKSAobW9kZSAmIDB4ZmMpKTsKKwlndXNfZGVsYXkoKTsKKwlndXNfd3JpdGU4KDB4MDAsICh1bnNpZ25lZCBjaGFyKSAobW9kZSAmIDB4ZmMpKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3ZvaWNlX29mZih2b2lkKQoreworCWd1c193cml0ZTgoMHgwMCwgZ3VzX3JlYWQ4KDB4MDApIHwgMHgwMyk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c192b2ljZV9tb2RlKHVuc2lnbmVkIGludCBtKQoreworCXVuc2lnbmVkIGNoYXIgICBtb2RlID0gKHVuc2lnbmVkIGNoYXIpIChtICYgMHhmZik7CisKKwlndXNfd3JpdGU4KDB4MDAsIChndXNfcmVhZDgoMHgwMCkgJiAweDAzKSB8CisJCSAgIChtb2RlICYgMHhmYykpOwkvKiBEb24ndCB0b3VjaCBsYXN0IHR3byBiaXRzICovCisJZ3VzX2RlbGF5KCk7CisJZ3VzX3dyaXRlOCgweDAwLCAoZ3VzX3JlYWQ4KDB4MDApICYgMHgwMykgfCAobW9kZSAmIDB4ZmMpKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3ZvaWNlX2ZyZXEodW5zaWduZWQgbG9uZyBmcmVxKQoreworCXVuc2lnbmVkIGxvbmcgICBkaXZpc29yID0gZnJlcV9kaXZfdGFibGVbbnJfdm9pY2VzIC0gMTRdOworCXVuc2lnbmVkIHNob3J0ICBmYzsKKworCS8qIEludGVyd2F2ZSBwbGF5cyBhdCA0NDEwMCBIeiB3aXRoIGFueSBudW1iZXIgb2Ygdm9pY2VzICovCisJaWYgKGl3X21vZGUpCisJCWZjID0gKHVuc2lnbmVkIHNob3J0KSAoKChmcmVxIDw8IDkpICsgKDQ0MTAwID4+IDEpKSAvIDQ0MTAwKTsKKwllbHNlCisJCWZjID0gKHVuc2lnbmVkIHNob3J0KSAoKChmcmVxIDw8IDkpICsgKGRpdmlzb3IgPj4gMSkpIC8gZGl2aXNvcik7CisJZmMgPSBmYyA8PCAxOworCisJZ3VzX3dyaXRlMTYoMHgwMSwgZmMpOworfQorCitzdGF0aWMgdm9pZCBndXNfdm9pY2Vfdm9sdW1lKHVuc2lnbmVkIGludCB2b2wpCit7CisJZ3VzX3dyaXRlOCgweDBkLCAweDAzKTsJLyogU3RvcCByYW1wIGJlZm9yZSBzZXR0aW5nIHZvbHVtZSAqLworCWd1c193cml0ZTE2KDB4MDksICh1bnNpZ25lZCBzaG9ydCkgKHZvbCA8PCA0KSk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c192b2ljZV9iYWxhbmNlKHVuc2lnbmVkIGludCBiYWxhbmNlKQoreworCWd1c193cml0ZTgoMHgwYywgKHVuc2lnbmVkIGNoYXIpIChiYWxhbmNlICYgMHhmZikpOworfQorCitzdGF0aWMgdm9pZCBndXNfcmFtcF9yYW5nZSh1bnNpZ25lZCBpbnQgbG93LCB1bnNpZ25lZCBpbnQgaGlnaCkKK3sKKwlndXNfd3JpdGU4KDB4MDcsICh1bnNpZ25lZCBjaGFyKSAoKGxvdyA+PiA0KSAmIDB4ZmYpKTsKKwlndXNfd3JpdGU4KDB4MDgsICh1bnNpZ25lZCBjaGFyKSAoKGhpZ2ggPj4gNCkgJiAweGZmKSk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19yYW1wX3JhdGUodW5zaWduZWQgaW50IHNjYWxlLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwlndXNfd3JpdGU4KDB4MDYsICh1bnNpZ25lZCBjaGFyKSAoKChzY2FsZSAmIDB4MDMpIDw8IDYpIHwgKHJhdGUgJiAweDNmKSkpOworfQorCitzdGF0aWMgdm9pZCBndXNfcmFtcG9uKHVuc2lnbmVkIGludCBtKQoreworCXVuc2lnbmVkIGNoYXIgICBtb2RlID0gKHVuc2lnbmVkIGNoYXIpIChtICYgMHhmZik7CisKKwlndXNfd3JpdGU4KDB4MGQsIG1vZGUgJiAweGZjKTsKKwlndXNfZGVsYXkoKTsKKwlndXNfd3JpdGU4KDB4MGQsIG1vZGUgJiAweGZjKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3JhbXBfbW9kZSh1bnNpZ25lZCBpbnQgbSkKK3sKKwl1bnNpZ25lZCBjaGFyIG1vZGUgPSAodW5zaWduZWQgY2hhcikgKG0gJiAweGZmKTsKKworCWd1c193cml0ZTgoMHgwZCwgKGd1c19yZWFkOCgweDBkKSAmIDB4MDMpIHwKKwkJICAgKG1vZGUgJiAweGZjKSk7CS8qIExlYXZlIHRoZSBsYXN0IDIgYml0cyBhbG9uZSAqLworCWd1c19kZWxheSgpOworCWd1c193cml0ZTgoMHgwZCwgKGd1c19yZWFkOCgweDBkKSAmIDB4MDMpIHwgKG1vZGUgJiAweGZjKSk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19yYW1wb2ZmKHZvaWQpCit7CisJZ3VzX3dyaXRlOCgweDBkLCAweDAzKTsKK30KKworc3RhdGljIHZvaWQgZ3VzX3NldF92b2ljZV9wb3MoaW50IHZvaWNlLCBsb25nIHBvc2l0aW9uKQoreworCWludCBzYW1wbGVfbm87CisKKwlpZiAoKHNhbXBsZV9ubyA9IHNhbXBsZV9tYXBbdm9pY2VdKSAhPSAtMSkgeworCQlpZiAocG9zaXRpb24gPCBzYW1wbGVzW3NhbXBsZV9ub10ubGVuKSB7CisJCQlpZiAodm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX21vZGUgPT0gVk1PREVfU1RBUlRfTk9URSkKKwkJCQl2b2ljZXNbdm9pY2VdLm9mZnNldF9wZW5kaW5nID0gcG9zaXRpb247CisJCQllbHNlCisJCQkJZ3VzX3dyaXRlX2FkZHIoMHgwYSwgc2FtcGxlX3B0cnNbc2FtcGxlX25vXSArIHBvc2l0aW9uLCAwLAorCQkJCSBzYW1wbGVzW3NhbXBsZV9ub10ubW9kZSAmIFdBVkVfMTZfQklUUyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGd1c192b2ljZV9pbml0KGludCB2b2ljZSkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCWd1c192b2ljZV92b2x1bWUoMCk7CisJZ3VzX3ZvaWNlX29mZigpOworCWd1c193cml0ZV9hZGRyKDB4MGEsIDAsIDAsIDApOwkvKiBTZXQgY3VycmVudCBwb3NpdGlvbiB0byAwICovCisJZ3VzX3dyaXRlOCgweDAwLCAweDAzKTsJLyogVm9pY2Ugb2ZmICovCisJZ3VzX3dyaXRlOCgweDBkLCAweDAzKTsJLyogUmFtcGluZyBvZmYgKi8KKwl2b2ljZV9hbGxvYy0+bWFwW3ZvaWNlXSA9IDA7CisJdm9pY2VfYWxsb2MtPmFsbG9jX3RpbWVzW3ZvaWNlXSA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCit9CisKK3N0YXRpYyB2b2lkIGd1c192b2ljZV9pbml0MihpbnQgdm9pY2UpCit7CisJdm9pY2VzW3ZvaWNlXS5wYW5uaW5nID0gMDsKKwl2b2ljZXNbdm9pY2VdLm1vZGUgPSAwOworCXZvaWNlc1t2b2ljZV0ub3JpZ19mcmVxID0gMjAwMDA7CisJdm9pY2VzW3ZvaWNlXS5jdXJyZW50X2ZyZXEgPSAyMDAwMDsKKwl2b2ljZXNbdm9pY2VdLmJlbmRlciA9IDA7CisJdm9pY2VzW3ZvaWNlXS5iZW5kZXJfcmFuZ2UgPSAyMDA7CisJdm9pY2VzW3ZvaWNlXS5pbml0aWFsX3ZvbHVtZSA9IDA7CisJdm9pY2VzW3ZvaWNlXS5jdXJyZW50X3ZvbHVtZSA9IDA7CisJdm9pY2VzW3ZvaWNlXS5sb29wX2lycV9tb2RlID0gMDsKKwl2b2ljZXNbdm9pY2VdLmxvb3BfaXJxX3Bhcm0gPSAwOworCXZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlID0gMDsKKwl2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfcGFybSA9IDA7CisJdm9pY2VzW3ZvaWNlXS5lbnZfcGhhc2UgPSAwOworCXZvaWNlc1t2b2ljZV0ubWFpbl92b2wgPSAxMjc7CisJdm9pY2VzW3ZvaWNlXS5wYXRjaF92b2wgPSAxMjc7CisJdm9pY2VzW3ZvaWNlXS5leHByZXNzaW9uX3ZvbCA9IDEyNzsKKwl2b2ljZXNbdm9pY2VdLnNhbXBsZV9wZW5kaW5nID0gLTE7CisJdm9pY2VzW3ZvaWNlXS5maXhlZF9waXRjaCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0ZXBfZW52ZWxvcGUoaW50IHZvaWNlKQoreworCXVuc2lnbmVkICAgICAgICB2b2wsIHByZXZfdm9sLCBwaGFzZTsKKwl1bnNpZ25lZCBjaGFyICAgcmF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKHZvaWNlc1t2b2ljZV0ubW9kZSAmIFdBVkVfU1VTVEFJTl9PTiAmJiB2b2ljZXNbdm9pY2VdLmVudl9waGFzZSA9PSAyKQorCXsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCWd1c19yYW1wb2ZmKCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJcmV0dXJuOworCQkvKgorCQkgKiBTdXN0YWluIHBoYXNlIGJlZ2lucy4gQ29udGludWUgZW52ZWxvcGUgYWZ0ZXIgcmVjZWl2aW5nIG5vdGUgb2ZmLgorCQkgKi8KKwl9CisJaWYgKHZvaWNlc1t2b2ljZV0uZW52X3BoYXNlID49IDUpCisJeworCQkvKiBFbnZlbG9wZSBmaW5pc2hlZC4gU2hvb3QgdGhlIHZvaWNlIGRvd24gKi8KKwkJZ3VzX3ZvaWNlX2luaXQodm9pY2UpOworCQlyZXR1cm47CisJfQorCXByZXZfdm9sID0gdm9pY2VzW3ZvaWNlXS5jdXJyZW50X3ZvbHVtZTsKKwlwaGFzZSA9ICsrdm9pY2VzW3ZvaWNlXS5lbnZfcGhhc2U7CisJY29tcHV0ZV92b2x1bWUodm9pY2UsIHZvaWNlc1t2b2ljZV0ubWlkaV92b2x1bWUpOworCXZvbCA9IHZvaWNlc1t2b2ljZV0uaW5pdGlhbF92b2x1bWUgKiB2b2ljZXNbdm9pY2VdLmVudl9vZmZzZXRbcGhhc2VdIC8gMjU1OworCXJhdGUgPSB2b2ljZXNbdm9pY2VdLmVudl9yYXRlW3BoYXNlXTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisKKwlndXNfdm9pY2Vfdm9sdW1lKHByZXZfdm9sKTsKKworCisJZ3VzX3dyaXRlOCgweDA2LCByYXRlKTsJLyogUmFtcGluZyByYXRlICovCisKKwl2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZSA9IFZNT0RFX0VOVkVMT1BFOworCisJaWYgKCgodm9sIC0gcHJldl92b2wpIC8gNjQpID09IDApCS8qIE5vIHNpZ25pZmljYW50IHZvbHVtZSBjaGFuZ2UgKi8KKwl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJc3RlcF9lbnZlbG9wZSh2b2ljZSk7CQkvKiBDb250aW51ZSB0aGUgZW52ZWxvcGUgb24gdGhlIG5leHQgc3RlcCAqLworCQlyZXR1cm47CisJfQorCWlmICh2b2wgPiBwcmV2X3ZvbCkKKwl7CisJCWlmICh2b2wgPj0gKDQwOTYgLSA2NCkpCisJCQl2b2wgPSA0MDk2IC0gNjU7CisJCWd1c19yYW1wX3JhbmdlKDAsIHZvbCk7CisJCWd1c19yYW1wb24oMHgyMCk7CS8qIEluY3JlYXNpbmcgdm9sdW1lLCB3aXRoIElSUSAqLworCX0KKwllbHNlCisJeworCQlpZiAodm9sIDw9IDY0KQorCQkJdm9sID0gNjU7CisJCWd1c19yYW1wX3JhbmdlKHZvbCwgNDAzMCk7CisJCWd1c19yYW1wb24oMHg2MCk7CS8qIERlY3JlYXNpbmcgdm9sdW1lLCB3aXRoIElSUSAqLworCX0KKwl2b2ljZXNbdm9pY2VdLmN1cnJlbnRfdm9sdW1lID0gdm9sOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgaW5pdF9lbnZlbG9wZShpbnQgdm9pY2UpCit7CisJdm9pY2VzW3ZvaWNlXS5lbnZfcGhhc2UgPSAtMTsKKwl2b2ljZXNbdm9pY2VdLmN1cnJlbnRfdm9sdW1lID0gNjQ7CisKKwlzdGVwX2VudmVsb3BlKHZvaWNlKTsKK30KKworc3RhdGljIHZvaWQgc3RhcnRfcmVsZWFzZShpbnQgdm9pY2UpCit7CisJaWYgKGd1c19yZWFkOCgweDAwKSAmIDB4MDMpCisJCXJldHVybjsJCS8qIFZvaWNlIGFscmVhZHkgc3RvcHBlZCAqLworCisJdm9pY2VzW3ZvaWNlXS5lbnZfcGhhc2UgPSAyOwkvKiBXaWxsIGJlIGluY3JlbWVudGVkIGJ5IHN0ZXBfZW52ZWxvcGUgKi8KKworCXZvaWNlc1t2b2ljZV0uY3VycmVudF92b2x1bWUgPSB2b2ljZXNbdm9pY2VdLmluaXRpYWxfdm9sdW1lID0KKwkJCQkJCWd1c19yZWFkMTYoMHgwOSkgPj4gNDsJLyogR2V0IGN1cnJlbnQgdm9sdW1lICovCisKKwl2b2ljZXNbdm9pY2VdLm1vZGUgJj0gfldBVkVfU1VTVEFJTl9PTjsKKwlndXNfcmFtcG9mZigpOworCXN0ZXBfZW52ZWxvcGUodm9pY2UpOworfQorCitzdGF0aWMgdm9pZCBndXNfdm9pY2VfZmFkZShpbnQgdm9pY2UpCit7CisJaW50IGluc3RyX25vID0gc2FtcGxlX21hcFt2b2ljZV0sIGlzMTZiaXRzOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCisJaWYgKGluc3RyX25vIDwgMCB8fCBpbnN0cl9ubyA+IE1BWF9TQU1QTEUpCisJeworCQlndXNfd3JpdGU4KDB4MDAsIDB4MDMpOwkvKiBIYXJkIHN0b3AgKi8KKwkJdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCXJldHVybjsKKwl9CisJaXMxNmJpdHMgPSAoc2FtcGxlc1tpbnN0cl9ub10ubW9kZSAmIFdBVkVfMTZfQklUUykgPyAxIDogMDsJLyogOCBvciAxNiBiaXRzICovCisKKwlpZiAodm9pY2VzW3ZvaWNlXS5tb2RlICYgV0FWRV9FTlZFTE9QRVMpCisJeworCQlzdGFydF9yZWxlYXNlKHZvaWNlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQlyZXR1cm47CisJfQorCS8qCisJICogUmFtcCB0aGUgdm9sdW1lIGRvd24gYnV0IG5vdCB0b28gcXVpY2tseS4KKwkgKi8KKwlpZiAoKGludCkgKGd1c19yZWFkMTYoMHgwOSkgPj4gNCkgPCAxMDApCS8qIEdldCBjdXJyZW50IHZvbHVtZSAqLworCXsKKwkJZ3VzX3ZvaWNlX29mZigpOworCQlndXNfcmFtcG9mZigpOworCQlndXNfdm9pY2VfaW5pdCh2b2ljZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlndXNfcmFtcF9yYW5nZSg2NSwgNDAzMCk7CisJZ3VzX3JhbXBfcmF0ZSgyLCA0KTsKKwlndXNfcmFtcG9uKDB4NDAgfCAweDIwKTsJLyogRG93biwgb25jZSwgd2l0aCBJUlEgKi8KKwl2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZSA9IFZNT0RFX0hBTFQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBndXNfcmVzZXQodm9pZCkKK3sKKwlpbnQgaTsKKworCWd1c19zZWxlY3RfbWF4X3ZvaWNlcygyNCk7CisJdm9sdW1lX2Jhc2UgPSAzMDcxOworCXZvbHVtZV9zY2FsZSA9IDQ7CisJdm9sdW1lX21ldGhvZCA9IFZPTF9NRVRIT0RfQURBR0lPOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJeworCQlndXNfdm9pY2VfaW5pdChpKTsJLyogVHVybiB2b2ljZSBvZmYgKi8KKwkJZ3VzX3ZvaWNlX2luaXQyKGkpOworCX0KK30KKworc3RhdGljIHZvaWQgZ3VzX2luaXRpYWxpemUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgZG1hX2ltYWdlLCBpcnFfaW1hZ2UsIHRtcDsKKworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGd1c19pcnFfbWFwWzE2XSA9IAl7CisJCTAsIDAsIDAsIDMsIDAsIDIsIDAsIDQsIDAsIDEsIDAsIDUsIDYsIDAsIDAsIDcKKwl9OworCisJc3RhdGljIHVuc2lnbmVkIGNoYXIgZ3VzX2RtYV9tYXBbOF0gPSB7CisJCTAsIDEsIDAsIDIsIDAsIDMsIDQsIDUKKwl9OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwlndXNfd3JpdGU4KDB4NGMsIDApOwkvKiBSZXNldCBHRjEgKi8KKwlndXNfZGVsYXkoKTsKKwlndXNfZGVsYXkoKTsKKworCWd1c193cml0ZTgoMHg0YywgMSk7CS8qIFJlbGVhc2UgUmVzZXQgKi8KKwlndXNfZGVsYXkoKTsKKwlndXNfZGVsYXkoKTsKKworCS8qCisJICogQ2xlYXIgYWxsIGludGVycnVwdHMKKwkgKi8KKworCWd1c193cml0ZTgoMHg0MSwgMCk7CS8qIERNQSBjb250cm9sICovCisJZ3VzX3dyaXRlOCgweDQ1LCAwKTsJLyogVGltZXIgY29udHJvbCAqLworCWd1c193cml0ZTgoMHg0OSwgMCk7CS8qIFNhbXBsZSBjb250cm9sICovCisKKwlndXNfc2VsZWN0X21heF92b2ljZXMoMjQpOworCisJaW5iKHVfU3RhdHVzKTsJCS8qIFRvdWNoIHRoZSBzdGF0dXMgcmVnaXN0ZXIgKi8KKworCWd1c19sb29rOCgweDQxKTsJLyogQ2xlYXIgYW55IHBlbmRpbmcgRE1BIElSUXMgKi8KKwlndXNfbG9vazgoMHg0OSk7CS8qIENsZWFyIGFueSBwZW5kaW5nIHNhbXBsZSBJUlFzICovCisJZ3VzX3JlYWQ4KDB4MGYpOwkvKiBDbGVhciBwZW5kaW5nIElSUXMgKi8KKworCWd1c19yZXNldCgpOwkJLyogUmVzZXRzIGFsbCB2b2ljZXMgKi8KKworCWd1c19sb29rOCgweDQxKTsJLyogQ2xlYXIgYW55IHBlbmRpbmcgRE1BIElSUXMgKi8KKwlndXNfbG9vazgoMHg0OSk7CS8qIENsZWFyIGFueSBwZW5kaW5nIHNhbXBsZSBJUlFzICovCisJZ3VzX3JlYWQ4KDB4MGYpOwkvKiBDbGVhciBwZW5kaW5nIElSUXMgKi8KKworCWd1c193cml0ZTgoMHg0YywgNyk7CS8qIE1hc3RlciByZXNldCB8IERBQyBlbmFibGUgfCBJUlEgZW5hYmxlICovCisKKwkvKgorCSAqIFNldCB1cCBmb3IgRGlnaXRhbCBBU0lDCisJICovCisKKwlvdXRiKCgweDA1KSwgZ3VzX2Jhc2UgKyAweDBmKTsKKworCW1peF9pbWFnZSB8PSAweDAyOwkvKiBEaXNhYmxlIGxpbmUgb3V0IChmb3IgYSBtb21lbnQpICovCisJb3V0YigobWl4X2ltYWdlKSwgdV9NaXhlcik7CisKKwlvdXRiKCgweDAwKSwgdV9JUlFETUFDb250cm9sKTsKKworCW91dGIoKDB4MDApLCBndXNfYmFzZSArIDB4MGYpOworCisJLyoKKwkgKiBOb3cgc2V0IHVwIHRoZSBETUEgYW5kIElSUSBpbnRlcmZhY2UKKwkgKgorCSAqIFRoZSBHVVMgc3VwcG9ydHMgdHdvIElSUXMgYW5kIHR3byBETUFzLgorCSAqCisJICogSnVzdCBvbmUgRE1BIGNoYW5uZWwgaXMgdXNlZC4gVGhpcyBwcmV2ZW50cyBzaW11bHRhbmVvdXMgQURDIGFuZCBEQUMuCisJICogQWRkaW5nIHRoaXMgc3VwcG9ydCByZXF1aXJlcyBzaWduaWZpY2FudCBjaGFuZ2VzIHRvIHRoZSBkbWFidWYuYywgZHNwLmMKKwkgKiBhbmQgYXVkaW8uYyBhbHNvLgorCSAqLworCisJaXJxX2ltYWdlID0gMDsKKwl0bXAgPSBndXNfaXJxX21hcFtndXNfaXJxXTsKKwlpZiAoIWd1c19wbnBfZmxhZyAmJiAhdG1wKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nISBHVVMgSVJRIG5vdCBzZWxlY3RlZFxuIik7CisJaXJxX2ltYWdlIHw9IHRtcDsKKwlpcnFfaW1hZ2UgfD0gMHg0MDsJLyogQ29tYmluZSBJUlExIChHRjEpIGFuZCBJUlEyIChNaWRpKSAqLworCisJZHVhbF9kbWFfbW9kZSA9IDE7CisJaWYgKGd1c19kbWEyID09IGd1c19kbWEgfHwgZ3VzX2RtYTIgPT0gLTEpCisJeworCQlkdWFsX2RtYV9tb2RlID0gMDsKKwkJZG1hX2ltYWdlID0gMHg0MDsJLyogQ29tYmluZSBETUExIChEUkFNKSBhbmQgSVJRMiAoQURDKSAqLworCisJCXRtcCA9IGd1c19kbWFfbWFwW2d1c19kbWFdOworCQlpZiAoIXRtcCkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhcm5pbmchIEdVUyBETUEgbm90IHNlbGVjdGVkXG4iKTsKKworCQlkbWFfaW1hZ2UgfD0gdG1wOworCX0KKwllbHNlCisJeworCQkvKiBTZXR1cCBkdWFsIERNQSBjaGFubmVsIG1vZGUgZm9yIEdVUyBNQVggKi8KKworCQlkbWFfaW1hZ2UgPSBndXNfZG1hX21hcFtndXNfZG1hXTsKKwkJaWYgKCFkbWFfaW1hZ2UpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nISBHVVMgRE1BIG5vdCBzZWxlY3RlZFxuIik7CisKKwkJdG1wID0gZ3VzX2RtYV9tYXBbZ3VzX2RtYTJdIDw8IDM7CisJCWlmICghdG1wKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXJuaW5nISBJbnZhbGlkIEdVUyBNQVggRE1BXG4iKTsKKwkJCXRtcCA9IDB4NDA7CQkvKiBDb21iaW5lIERNQSBjaGFubmVscyAqLworCQkJICAgIGR1YWxfZG1hX21vZGUgPSAwOworCQl9CisJCWRtYV9pbWFnZSB8PSB0bXA7CisJfQorCisJLyoKKwkgKiBGb3Igc29tZSByZWFzb24gdGhlIElSUSBhbmQgRE1BIGFkZHJlc3NlcyBtdXN0IGJlIHdyaXR0ZW4gdHdpY2UKKwkgKi8KKworCS8qCisJICogRG9pbmcgaXQgZmlyc3QgdGltZQorCSAqLworCisJb3V0YigobWl4X2ltYWdlKSwgdV9NaXhlcik7CS8qIFNlbGVjdCBETUEgY29udHJvbCAqLworCW91dGIoKGRtYV9pbWFnZSB8IDB4ODApLCB1X0lSUURNQUNvbnRyb2wpOwkvKiBTZXQgRE1BIGFkZHJlc3MgKi8KKworCW91dGIoKG1peF9pbWFnZSB8IDB4NDApLCB1X01peGVyKTsJLyogU2VsZWN0IElSUSBjb250cm9sICovCisJb3V0YigoaXJxX2ltYWdlKSwgdV9JUlFETUFDb250cm9sKTsJLyogU2V0IElSUSBhZGRyZXNzICovCisKKwkvKgorCSAqIERvaW5nIGl0IHNlY29uZCB0aW1lCisJICovCisKKwlvdXRiKChtaXhfaW1hZ2UpLCB1X01peGVyKTsJLyogU2VsZWN0IERNQSBjb250cm9sICovCisJb3V0YigoZG1hX2ltYWdlKSwgdV9JUlFETUFDb250cm9sKTsJLyogU2V0IERNQSBhZGRyZXNzICovCisKKwlvdXRiKChtaXhfaW1hZ2UgfCAweDQwKSwgdV9NaXhlcik7CS8qIFNlbGVjdCBJUlEgY29udHJvbCAqLworCW91dGIoKGlycV9pbWFnZSksIHVfSVJRRE1BQ29udHJvbCk7CS8qIFNldCBJUlEgYWRkcmVzcyAqLworCisJZ3VzX3NlbGVjdF92b2ljZSgwKTsJLyogVGhpcyBkaXNhYmxlcyB3cml0ZXMgdG8gSVJRL0RNQSByZWcgKi8KKworCW1peF9pbWFnZSAmPSB+MHgwMjsJLyogRW5hYmxlIGxpbmUgb3V0ICovCisJbWl4X2ltYWdlIHw9IDB4MDg7CS8qIEVuYWJsZSBJUlEgKi8KKwlvdXRiKChtaXhfaW1hZ2UpLCB1X01peGVyKTsJLyoKKwkJCQkJICogVHVybiBtaXhlciBjaGFubmVscyBvbgorCQkJCQkgKiBOb3RlISBNaWMgaW4gaXMgbGVmdCBvZmYuCisJCQkJCSAqLworCisJZ3VzX3NlbGVjdF92b2ljZSgwKTsJLyogVGhpcyBkaXNhYmxlcyB3cml0ZXMgdG8gSVJRL0RNQSByZWcgKi8KKworCWd1c2ludHIoZ3VzX2lycSwgKHZvaWQgKilndXNfaHdfY29uZmlnLCBOVUxMKTsJLyogU2VydmUgcGVuZGluZyBpbnRlcnJ1cHRzICovCisKKwlpbmIodV9TdGF0dXMpOwkJLyogVG91Y2ggdGhlIHN0YXR1cyByZWdpc3RlciAqLworCisJZ3VzX2xvb2s4KDB4NDEpOwkvKiBDbGVhciBhbnkgcGVuZGluZyBETUEgSVJRcyAqLworCWd1c19sb29rOCgweDQ5KTsJLyogQ2xlYXIgYW55IHBlbmRpbmcgc2FtcGxlIElSUXMgKi8KKworCWd1c19yZWFkOCgweDBmKTsJLyogQ2xlYXIgcGVuZGluZyBJUlFzICovCisKKwlpZiAoaXdfbW9kZSkKKwkJZ3VzX3dyaXRlOCgweDE5LCBndXNfcmVhZDgoMHgxOSkgfCAweDAxKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7Cit9CisKKworc3RhdGljIHZvaWQgX19pbml0IHBucF9tZW1faW5pdCh2b2lkKQoreworI2luY2x1ZGUgIml3bWVtLmgiCisjZGVmaW5lIENIVU5LX1NJWkUgKDI1NioxMDI0KQorI2RlZmluZSBCQU5LX1NJWkUgKDQqMTAyNCoxMDI0KQorI2RlZmluZSBDSFVOS1NfUEVSX0JBTksgKEJBTktfU0laRS9DSFVOS19TSVpFKQorCisJaW50IGJhbmssIGNodW5rLCBhZGRyLCB0b3RhbCA9IDA7CisJaW50IGJhbmtfc2l6ZXNbNF07CisJaW50IGksIGosIGJpdHMgPSAtMSwgdGVzdGJpdHMgPSAtMSwgbmJhbmtzID0gMDsKKworCS8qCisJICogVGhpcyByb3V0aW5lIGRldGVybWluZXMgd2hhdCBraW5kIG9mIFJBTSBpcyBpbnN0YWxsZWQgaW4gZWFjaCBvZiB0aGUgZm91cgorCSAqIFNJTU0gYmFua3MgYW5kIGNvbmZpZ3VyZXMgdGhlIERSQU0gYWRkcmVzcyBkZWNvZGUgbG9naWMgYWNjb3JkaW5nbHkuCisJICovCisKKwkvKgorCSAqICAgIFBsYWNlIHRoZSBjaGlwIGludG8gZW5oYW5jZWQgbW9kZQorCSAqLworCWd1c193cml0ZTgoMHgxOSwgZ3VzX3JlYWQ4KDB4MTkpIHwgMHgwMSk7CisJZ3VzX3dyaXRlOCgweDUzLCBndXNfbG9vazgoMHg1MykgJiB+MHgwMik7CS8qIFNlbGVjdCBEUkFNIEkvTyBhY2Nlc3MgKi8KKworCS8qCisJICogU2V0IG1lbW9yeSBjb25maWd1cmF0aW9uIHRvIDQgRFJBTSBiYW5rcyBvZiA0TSBpbiBlYWNoICgxNk0gdG90YWwpLgorCSAqLworCisJZ3VzX3dyaXRlMTYoMHg1MiwgKGd1c19sb29rMTYoMHg1MikgJiAweGZmZjApIHwgMHgwMDBjKTsKKworCS8qCisJICogUGVyZm9ybSB0aGUgRFJBTSBzaXplIGRldGVjdGlvbiBmb3IgZWFjaCBiYW5rIGluZGl2aWR1YWxseS4KKwkgKi8KKwlmb3IgKGJhbmsgPSAwOyBiYW5rIDwgNDsgYmFuaysrKQorCXsKKwkJaW50IHNpemUgPSAwOworCisJCWFkZHIgPSBiYW5rICogQkFOS19TSVpFOworCisJCS8qIENsZWFuIGNoZWNrIHBvaW50cyBvZiBlYWNoIGNodW5rICovCisJCWZvciAoY2h1bmsgPSAwOyBjaHVuayA8IENIVU5LU19QRVJfQkFOSzsgY2h1bmsrKykKKwkJeworCQkJZ3VzX3Bva2UoYWRkciArIGNodW5rICogQ0hVTktfU0laRSArIDBMLCAweDAwKTsKKwkJCWd1c19wb2tlKGFkZHIgKyBjaHVuayAqIENIVU5LX1NJWkUgKyAxTCwgMHgwMCk7CisJCX0KKworCQkvKiBXcml0ZSBhIHZhbHVlIHRvIGVhY2ggY2h1bmsgcG9pbnQgYW5kIHZlcmlmeSB0aGUgcmVzdWx0ICovCisJCWZvciAoY2h1bmsgPSAwOyBjaHVuayA8IENIVU5LU19QRVJfQkFOSzsgY2h1bmsrKykKKwkJeworCQkJZ3VzX3Bva2UoYWRkciArIGNodW5rICogQ0hVTktfU0laRSArIDBMLCAweDU1KTsKKwkJCWd1c19wb2tlKGFkZHIgKyBjaHVuayAqIENIVU5LX1NJWkUgKyAxTCwgMHhBQSk7CisKKwkJCWlmIChndXNfcGVlayhhZGRyICsgY2h1bmsgKiBDSFVOS19TSVpFICsgMEwpID09IDB4NTUgJiYKKwkJCQlndXNfcGVlayhhZGRyICsgY2h1bmsgKiBDSFVOS19TSVpFICsgMUwpID09IDB4QUEpCisJCQl7CisJCQkJLyogT0suIFRoZXJlIGlzIFJBTS4gTm93IGNoZWNrIGZvciBwb3NzaWJsZSBzaGFkb3dzICovCisJCQkJaW50IG9rID0gMSwgY2h1bmsyOworCisJCQkJZm9yIChjaHVuazIgPSAwOyBvayAmJiBjaHVuazIgPCBjaHVuazsgY2h1bmsyKyspCisJCQkJCWlmIChndXNfcGVlayhhZGRyICsgY2h1bmsyICogQ0hVTktfU0laRSArIDBMKSB8fAorCQkJCQkJCWd1c19wZWVrKGFkZHIgKyBjaHVuazIgKiBDSFVOS19TSVpFICsgMUwpKQorCQkJCQkJb2sgPSAwOwkvKiBBZGRyZXNzaW5nIHdyYXBzICovCisKKwkJCQlpZiAob2spCisJCQkJCXNpemUgPSAoY2h1bmsgKyAxKSAqIENIVU5LX1NJWkU7CisJCQl9CisJCQlndXNfcG9rZShhZGRyICsgY2h1bmsgKiBDSFVOS19TSVpFICsgMEwsIDB4MDApOworCQkJZ3VzX3Bva2UoYWRkciArIGNodW5rICogQ0hVTktfU0laRSArIDFMLCAweDAwKTsKKwkJfQorCQliYW5rX3NpemVzW2JhbmtdID0gc2l6ZTsKKwkJaWYgKHNpemUpCisJCQluYmFua3MgPSBiYW5rICsgMTsKKwkJRERCKHByaW50aygiSW50ZXJ3YXZlOiBCYW5rICVkLCBzaXplPSVka1xuIiwgYmFuaywgc2l6ZSAvIDEwMjQpKTsKKwl9CisKKwlpZiAobmJhbmtzID09IDApCS8qIE5vIFJBTSAtIEdpdmUgdXAgKi8KKwl7CisJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IEFuIEludGVyd2F2ZSBhdWRpbyBjaGlwIGRldGVjdGVkIGJ1dCBubyBEUkFNXG4iKTsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogVW5hYmxlIHRvIHdvcmsgd2l0aCB0aGlzIGNhcmQuXG4iKTsKKwkJZ3VzX3dyaXRlOCgweDE5LCBndXNfcmVhZDgoMHgxOSkgJiB+MHgwMSk7CisJCWd1c19tZW1fc2l6ZSA9IDA7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIE5vdyB3ZSBrbm93IGhvdyBtdWNoIERSQU0gdGhlcmUgaXMgaW4gZWFjaCBiYW5rLiBUaGUgbmV4dCBzdGVwIGlzCisJICogdG8gZmluZCBhIERSQU0gc2l6ZSBlbmNvZGluZyAoMCB0byAxMikgd2hpY2ggaXMgYmVzdCBmb3IgdGhlIGNvbWJpbmF0aW9uCisJICogd2UgaGF2ZS4KKwkgKgorCSAqIEZpcnN0IHRyeSBpZiBhbnkgb2YgdGhlIHBvc3NpYmxlIGFsdGVybmF0aXZlcyBtYXRjaGVzIGV4YWN0bHkgdGhlIGFtb3VudAorCSAqIG9mIG1lbW9yeSB3ZSBoYXZlLgorCSAqLworCisJZm9yIChpID0gMDsgYml0cyA9PSAtMSAmJiBpIDwgMTM7IGkrKykKKwl7CisJCWJpdHMgPSBpOworCisJCWZvciAoaiA9IDA7IGJpdHMgIT0gLTEgJiYgaiA8IDQ7IGorKykKKwkJCWlmIChtZW1fZGVjb2RlW2ldW2pdICE9IGJhbmtfc2l6ZXNbal0pCisJCQkJYml0cyA9IC0xOwkvKiBObyBoaXQgKi8KKwl9CisKKwkvKgorCSAqIElmIG5lY2Vzc2FyeSwgdHJ5IHRvIGZpbmQgYSBjb21iaW5hdGlvbiB3aGVyZSBvdGhlciB0aGFuIHRoZSBsYXN0CisJICogYmFuayBtYXRjaGVzIG91ciBjb25maWd1cmF0aW9uIGFuZCB0aGUgbGFzdCBiYW5rIGlzIGxlZnQgb3ZlcnNpemVkLgorCSAqIEluIHRoaXMgd2F5IHdlIGRvbid0IGxlYXZlIGhvbGVzIGluIHRoZSBtaWRkbGUgb2YgbWVtb3J5LgorCSAqLworCisJaWYgKGJpdHMgPT0gLTEpCQkvKiBObyBsdWNrIHlldCAqLworCXsKKwkJZm9yIChpID0gMDsgYml0cyA9PSAtMSAmJiBpIDwgMTM7IGkrKykKKwkJeworCQkJYml0cyA9IGk7CisKKwkJCWZvciAoaiA9IDA7IGJpdHMgIT0gLTEgJiYgaiA8IG5iYW5rcyAtIDE7IGorKykKKwkJCQlpZiAobWVtX2RlY29kZVtpXVtqXSAhPSBiYW5rX3NpemVzW2pdKQorCQkJCQliaXRzID0gLTE7CS8qIE5vIGhpdCAqLworCQkJaWYgKG1lbV9kZWNvZGVbaV1bbmJhbmtzIC0gMV0gPCBiYW5rX3NpemVzW25iYW5rcyAtIDFdKQorCQkJCWJpdHMgPSAtMTsJLyogVGhlIGxhc3QgYmFuayBpcyB0b28gc21hbGwgKi8KKwkJfQorCX0KKwkvKgorIAkgKiBUaGUgbGFzdCByZXNvcnQgaXMgdG8gc2VhcmNoIGZvciBhIGNvbWJpbmF0aW9uIHdoZXJlIHRoZSBiYW5rcyBhcmUKKyAJICogc21hbGxlciB0aGFuIHRoZSBhY3R1YWwgU0lNTXMuIFRoaXMgbGVhdmVzIHNvbWUgbWVtb3J5IGluIHRoZSBiYW5rcworIAkgKiB1bnVzZWQgYnV0IGRvZXNuJ3QgbGVhdmUgaG9sZXMgaW4gdGhlIERSQU0gYWRkcmVzcyBzcGFjZS4KKyAJICovCisgCWlmIChiaXRzID09IC0xKQkJLyogTm8gbHVjayB5ZXQgKi8KKyAJeworIAkJZm9yIChpID0gMDsgaSA8IDEzOyBpKyspCisgCQl7CisgCQkJdGVzdGJpdHMgPSBpOworIAkJCWZvciAoaiA9IDA7IHRlc3RiaXRzICE9IC0xICYmIGogPCBuYmFua3MgLSAxOyBqKyspCisgCQkJCWlmIChtZW1fZGVjb2RlW2ldW2pdID4gYmFua19zaXplc1tqXSkgeworIAkJCQkJdGVzdGJpdHMgPSAtMTsKKyAJCQkJfQorIAkJCWlmKHRlc3RiaXRzID4gYml0cykgYml0cyA9IHRlc3RiaXRzOworIAkJfQorIAkJaWYgKGJpdHMgIT0gLTEpCisgCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICJJbnRlcndhdmU6IENhbid0IHVzZSBhbGwgaW5zdGFsbGVkIFJBTS5cbiIpOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiSW50ZXJ3YXZlOiBUcnkgcmVvcmRlcmluZyBTSU1NUy5cbiIpOworCQl9CisJCXByaW50ayhLRVJOX0lORk8gIkludGVyd2F2ZTogQ2FuJ3QgZmluZCB3b3JraW5nIERSQU0gZW5jb2RpbmcuXG4iKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSW50ZXJ3YXZlOiBEZWZhdWx0aW5nIHRvIDI1NmsuIFRyeSByZW9yZGVyaW5nIFNJTU1TLlxuIik7CisJCWJpdHMgPSAwOworCX0KKwlEREIocHJpbnRrKCJJbnRlcndhdmU6IFNlbGVjdGluZyBEUkFNIGFkZHJlc3NpbmcgbW9kZSAlZFxuIiwgYml0cykpOworCisJZm9yIChiYW5rID0gMDsgYmFuayA8IDQ7IGJhbmsrKykKKwl7CisJCUREQihwcmludGsoIiAgQmFuayAlZCwgbWVtPSVkayAobGltaXQgJWRrKVxuIiwgYmFuaywgYmFua19zaXplc1tiYW5rXSAvIDEwMjQsIG1lbV9kZWNvZGVbYml0c11bYmFua10gLyAxMDI0KSk7CisKKwkJaWYgKGJhbmtfc2l6ZXNbYmFua10gPiBtZW1fZGVjb2RlW2JpdHNdW2JhbmtdKQorCQkJdG90YWwgKz0gbWVtX2RlY29kZVtiaXRzXVtiYW5rXTsKKwkJZWxzZQorCQkJdG90YWwgKz0gYmFua19zaXplc1tiYW5rXTsKKwl9CisKKwlEREIocHJpbnRrKCJUb3RhbCAlZGsgb2YgRFJBTSAoZW5oYW5jZWQgbW9kZSlcbiIsIHRvdGFsIC8gMTAyNCkpOworCisJLyoKKwkgKiAgICBTZXQgdGhlIG1lbW9yeSBhZGRyZXNzaW5nIG1vZGUuCisJICovCisJZ3VzX3dyaXRlMTYoMHg1MiwgKGd1c19sb29rMTYoMHg1MikgJiAweGZmZjApIHwgYml0cyk7CisKKy8qICAgICAgTGVhdmUgdGhlIGNoaXAgaW50byBlbmhhbmNlZCBtb2RlLiBEaXNhYmxlIExGTyAgKi8KKwlndXNfbWVtX3NpemUgPSB0b3RhbDsKKwlpd19tb2RlID0gMTsKKwlndXNfd3JpdGU4KDB4MTksIChndXNfcmVhZDgoMHgxOSkgfCAweDAxKSAmIH4weDAyKTsKK30KKworaW50IF9faW5pdCBndXNfd2F2ZV9kZXRlY3QoaW50IGJhc2VhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgICBpLCBtYXhfbWVtID0gMTAyNEw7CisJdW5zaWduZWQgbG9uZyAgIGxvYzsKKwl1bnNpZ25lZCBjaGFyICAgdmFsOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlYWRkciwgMTYsICJHVVMiKSkKKwkJcmV0dXJuIDA7CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihiYXNlYWRkciArIDB4MTAwLCAxMiwgIkdVUyIpKSB7IC8qIDB4MTBjLT4gaXMgTUFYICovCisJCXJlbGVhc2VfcmVnaW9uKGJhc2VhZGRyLCAxNik7CisJCXJldHVybiAwOworCX0KKworCWd1c19iYXNlID0gYmFzZWFkZHI7CisKKwlndXNfd3JpdGU4KDB4NGMsIDApOwkvKiBSZXNldCBHRjEgKi8KKwlndXNfZGVsYXkoKTsKKwlndXNfZGVsYXkoKTsKKworCWd1c193cml0ZTgoMHg0YywgMSk7CS8qIFJlbGVhc2UgUmVzZXQgKi8KKwlndXNfZGVsYXkoKTsKKwlndXNfZGVsYXkoKTsKKworI2lmZGVmIEdVU1BOUF9BVVRPREVURUNUCisJdmFsID0gZ3VzX2xvb2s4KDB4NWIpOwkvKiBWZXJzaW9uIG51bWJlciByZWdpc3RlciAqLworCWd1c193cml0ZTgoMHg1YiwgfnZhbCk7CS8qIEludmVydCBhbGwgYml0cyAqLworCisJaWYgKChndXNfbG9vazgoMHg1YikgJiAweGYwKSA9PSAodmFsICYgMHhmMCkpCS8qIE5vIGNoYW5nZSAqLworCXsKKwkJaWYgKChndXNfbG9vazgoMHg1YikgJiAweDBmKSA9PSAoKH52YWwpICYgMHgwZikpCS8qIENoYW5nZSAqLworCQl7CisJCQlEREIocHJpbnRrKCJJbnRlcndhdmUgY2hpcCB2ZXJzaW9uICVkIGRldGVjdGVkXG4iLCAodmFsICYgMHhmMCkgPj4gNCkpOworCQkJZ3VzX3BucF9mbGFnID0gMTsKKwkJfQorCQllbHNlCisJCXsKKwkJCUREQihwcmludGsoIk5vdCBhbiBJbnRlcndhdmUgY2hpcCAoJXgpXG4iLCBndXNfbG9vazgoMHg1YikpKTsKKwkJCWd1c19wbnBfZmxhZyA9IDA7CisJCX0KKwl9CisJZ3VzX3dyaXRlOCgweDViLCB2YWwpOwkvKiBSZXN0b3JlIGFsbCBiaXRzICovCisjZW5kaWYKKworCWlmIChndXNfcG5wX2ZsYWcpCisJCXBucF9tZW1faW5pdCgpOworCWlmIChpd19tb2RlKQorCQlyZXR1cm4gMTsKKworCS8qIFNlZSBpZiB0aGVyZSBpcyBmaXJzdCBibG9jayB0aGVyZS4uLi4gKi8KKwlndXNfcG9rZSgwTCwgMHhhYSk7CisJaWYgKGd1c19wZWVrKDBMKSAhPSAweGFhKSB7CisJCXJlbGVhc2VfcmVnaW9uKGJhc2VhZGRyICsgMHgxMDAsIDEyKTsKKwkJcmVsZWFzZV9yZWdpb24oYmFzZWFkZHIsIDE2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogTm93IHplcm8gaXQgb3V0IHNvIHRoYXQgSSBjYW4gY2hlY2sgZm9yIG1pcnJvcmluZyAuLiAqLworCWd1c19wb2tlKDBMLCAweDAwKTsKKwlmb3IgKGkgPSAxTDsgaSA8IG1heF9tZW07IGkrKykKKwl7CisJCWludCBuLCBmYWlsZWQ7CisKKwkJLyogY2hlY2sgZm9yIG1pcnJvcmluZyAuLi4gKi8KKwkJaWYgKGd1c19wZWVrKDBMKSAhPSAwKQorCQkJYnJlYWs7CisJCWxvYyA9IGkgPDwgMTA7CisKKwkJZm9yIChuID0gbG9jIC0gMSwgZmFpbGVkID0gMDsgbiA8PSBsb2M7IG4rKykKKwkJeworCQkJZ3VzX3Bva2UobG9jLCAweGFhKTsKKwkJCWlmIChndXNfcGVlayhsb2MpICE9IDB4YWEpCisJCQkJZmFpbGVkID0gMTsKKwkJCWd1c19wb2tlKGxvYywgMHg1NSk7CisJCQlpZiAoZ3VzX3BlZWsobG9jKSAhPSAweDU1KQorCQkJCWZhaWxlZCA9IDE7CisJCX0KKwkJaWYgKGZhaWxlZCkKKwkJCWJyZWFrOworCX0KKwlndXNfbWVtX3NpemUgPSBpIDw8IDEwOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGd1c3dhdmVfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKworCXN3aXRjaCAoY21kKSAKKwl7CisJCWNhc2UgU05EQ1RMX1NZTlRIX0lORk86CisJCQlndXNfaW5mby5ucl92b2ljZXMgPSBucl92b2ljZXM7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJmd1c19pbmZvLCBzaXplb2YoZ3VzX2luZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1NFUV9SRVNFVFNBTVBMRVM6CisJCQlyZXNldF9zYW1wbGVfbWVtb3J5KCk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9TRVFfUEVSQ01PREU6CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9TWU5USF9NRU1BVkw6CisJCQlyZXR1cm4gKGd1c19tZW1fc2l6ZSA9PSAwKSA/IDAgOiBndXNfbWVtX3NpemUgLSBmcmVlX21lbV9wdHIgLSAzMjsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitzdGF0aWMgaW50IGd1c3dhdmVfc2V0X2luc3RyKGludCBkZXYsIGludCB2b2ljZSwgaW50IGluc3RyX25vKQoreworCWludCBzYW1wbGVfbm87CisKKwlpZiAoaW5zdHJfbm8gPCAwIHx8IGluc3RyX25vID4gTUFYX1BBVENIKQorCQlpbnN0cl9ubyA9IDA7CS8qIERlZmF1bHQgdG8gYWNvdXN0aWMgcGlhbm8gKi8KKworCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPiAzMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX21vZGUgPT0gVk1PREVfU1RBUlRfTk9URSkKKwl7CisJCXZvaWNlc1t2b2ljZV0uc2FtcGxlX3BlbmRpbmcgPSBpbnN0cl9ubzsKKwkJcmV0dXJuIDA7CisJfQorCXNhbXBsZV9ubyA9IHBhdGNoX3RhYmxlW2luc3RyX25vXTsKKwlwYXRjaF9tYXBbdm9pY2VdID0gLTE7CisKKwlpZiAoc2FtcGxlX25vID09IE5PVF9TQU1QTEUpCisJeworLyoJCXByaW50aygiR1VTOiBVbmRlZmluZWQgcGF0Y2ggJWQgZm9yIHZvaWNlICVkXG4iLCBpbnN0cl9ubywgdm9pY2UpOyovCisJCXJldHVybiAtRUlOVkFMOwkvKiBQYXRjaCBub3QgZGVmaW5lZCAqLworCX0KKwlpZiAoc2FtcGxlX3B0cnNbc2FtcGxlX25vXSA9PSAtMSkJLyogU2FtcGxlIG5vdCBsb2FkZWQgKi8KKwl7CisvKgkJcHJpbnRrKCJHVVM6IFNhbXBsZSAjJWQgbm90IGxvYWRlZCBmb3IgcGF0Y2ggJWQgKHZvaWNlICVkKVxuIiwgc2FtcGxlX25vLCBpbnN0cl9ubywgdm9pY2UpOyovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzYW1wbGVfbWFwW3ZvaWNlXSA9IHNhbXBsZV9ubzsKKwlwYXRjaF9tYXBbdm9pY2VdID0gaW5zdHJfbm87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3Vzd2F2ZV9raWxsX25vdGUoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgbm90ZSwgaW50IHZlbG9jaXR5KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCS8qIHZvaWNlX2FsbG9jLT5tYXBbdm9pY2VdID0gMHhmZmZmOyAqLworCWlmICh2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZSA9PSBWTU9ERV9TVEFSVF9OT1RFKQorCXsKKwkJdm9pY2VzW3ZvaWNlXS5raWxsX3BlbmRpbmcgPSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJfQorCWVsc2UKKwl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJZ3VzX3ZvaWNlX2ZhZGUodm9pY2UpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBndXN3YXZlX2FmdGVydG91Y2goaW50IGRldiwgaW50IHZvaWNlLCBpbnQgcHJlc3N1cmUpCit7Cit9CisKK3N0YXRpYyB2b2lkIGd1c3dhdmVfcGFubmluZyhpbnQgZGV2LCBpbnQgdm9pY2UsIGludCB2YWx1ZSkKK3sKKwlpZiAodm9pY2UgPj0gMCB8fCB2b2ljZSA8IDMyKQorCQl2b2ljZXNbdm9pY2VdLnBhbm5pbmcgPSB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgZ3Vzd2F2ZV92b2x1bWVfbWV0aG9kKGludCBkZXYsIGludCBtb2RlKQoreworCWlmIChtb2RlID09IFZPTF9NRVRIT0RfTElORUFSIHx8IG1vZGUgPT0gVk9MX01FVEhPRF9BREFHSU8pCisJCXZvbHVtZV9tZXRob2QgPSBtb2RlOworfQorCitzdGF0aWMgdm9pZCBjb21wdXRlX3ZvbHVtZShpbnQgdm9pY2UsIGludCB2b2x1bWUpCit7CisJaWYgKHZvbHVtZSA8IDEyOCkKKwkJdm9pY2VzW3ZvaWNlXS5taWRpX3ZvbHVtZSA9IHZvbHVtZTsKKworCXN3aXRjaCAodm9sdW1lX21ldGhvZCkKKwl7CisJCWNhc2UgVk9MX01FVEhPRF9BREFHSU86CisJCQl2b2ljZXNbdm9pY2VdLmluaXRpYWxfdm9sdW1lID0KKwkJCQlndXNfYWRhZ2lvX3ZvbCh2b2ljZXNbdm9pY2VdLm1pZGlfdm9sdW1lLCB2b2ljZXNbdm9pY2VdLm1haW5fdm9sLAorCQkJCQl2b2ljZXNbdm9pY2VdLmV4cHJlc3Npb25fdm9sLAorCQkJCQl2b2ljZXNbdm9pY2VdLnBhdGNoX3ZvbCk7CisJCQlicmVhazsKKworCQljYXNlIFZPTF9NRVRIT0RfTElORUFSOgkvKiBUb3RhbGx5IGlnbm9yZXMgcGF0Y2gtdm9sdW1lIGFuZCBleHByZXNzaW9uICovCisJCQl2b2ljZXNbdm9pY2VdLmluaXRpYWxfdm9sdW1lID0gZ3VzX2xpbmVhcl92b2wodm9sdW1lLCB2b2ljZXNbdm9pY2VdLm1haW5fdm9sKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQl2b2ljZXNbdm9pY2VdLmluaXRpYWxfdm9sdW1lID0gdm9sdW1lX2Jhc2UgKworCQkJCSh2b2ljZXNbdm9pY2VdLm1pZGlfdm9sdW1lICogdm9sdW1lX3NjYWxlKTsKKwl9CisKKwlpZiAodm9pY2VzW3ZvaWNlXS5pbml0aWFsX3ZvbHVtZSA+IDQwMzApCisJCXZvaWNlc1t2b2ljZV0uaW5pdGlhbF92b2x1bWUgPSA0MDMwOworfQorCitzdGF0aWMgdm9pZCBjb21wdXRlX2FuZF9zZXRfdm9sdW1lKGludCB2b2ljZSwgaW50IHZvbHVtZSwgaW50IHJhbXBfdGltZSkKK3sKKwlpbnQgY3VyciwgdGFyZ2V0LCByYXRlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljb21wdXRlX3ZvbHVtZSh2b2ljZSwgdm9sdW1lKTsKKwl2b2ljZXNbdm9pY2VdLmN1cnJlbnRfdm9sdW1lID0gdm9pY2VzW3ZvaWNlXS5pbml0aWFsX3ZvbHVtZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJLyoKKwkgKiBDQVVUSU9OISBJbnRlcnJ1cHRzIGRpc2FibGVkLiBFbmFibGUgdGhlbSBiZWZvcmUgcmV0dXJuaW5nCisJICovCisKKwlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKworCWN1cnIgPSBndXNfcmVhZDE2KDB4MDkpID4+IDQ7CisJdGFyZ2V0ID0gdm9pY2VzW3ZvaWNlXS5pbml0aWFsX3ZvbHVtZTsKKworCWlmIChyYW1wX3RpbWUgPT0gSU5TVEFOVF9SQU1QKQorCXsKKwkJZ3VzX3JhbXBvZmYoKTsKKwkJZ3VzX3ZvaWNlX3ZvbHVtZSh0YXJnZXQpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCXJldHVybjsKKwl9CisJaWYgKHJhbXBfdGltZSA9PSBGQVNUX1JBTVApCisJCXJhdGUgPSA2MzsKKwllbHNlCisJCXJhdGUgPSAxNjsKKwlndXNfcmFtcF9yYXRlKDAsIHJhdGUpOworCisJaWYgKCh0YXJnZXQgLSBjdXJyKSAvIDY0ID09IDApCS8qIENsb3NlIGVub3VnaCB0byB0YXJnZXQuICovCisJeworCQlndXNfcmFtcG9mZigpOworCQlndXNfdm9pY2Vfdm9sdW1lKHRhcmdldCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAodGFyZ2V0ID4gY3VycikKKwl7CisJCWlmICh0YXJnZXQgPiAoNDA5NSAtIDY1KSkKKwkJCXRhcmdldCA9IDQwOTUgLSA2NTsKKwkJZ3VzX3JhbXBfcmFuZ2UoY3VyciwgdGFyZ2V0KTsKKwkJZ3VzX3JhbXBvbigweDAwKTsJLyogUmFtcCB1cCwgb25jZSwgbm8gSVJRICovCisJfQorCWVsc2UKKwl7CisJCWlmICh0YXJnZXQgPCA2NSkKKwkJCXRhcmdldCA9IDY1OworCisJCWd1c19yYW1wX3JhbmdlKHRhcmdldCwgY3Vycik7CisJCWd1c19yYW1wb24oMHg0MCk7CS8qIFJhbXAgZG93biwgb25jZSwgbm8gaXJxICovCisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgZHluYW1pY192b2x1bWVfY2hhbmdlKGludCB2b2ljZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHN0YXR1czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwlzdGF0dXMgPSBndXNfcmVhZDgoMHgwMCk7CS8qIEdldCB2b2ljZSBzdGF0dXMgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisKKwlpZiAoc3RhdHVzICYgMHgwMykKKwkJcmV0dXJuOwkJLyogVm9pY2Ugd2FzIG5vdCBydW5uaW5nICovCisKKwlpZiAoISh2b2ljZXNbdm9pY2VdLm1vZGUgJiBXQVZFX0VOVkVMT1BFUykpCisJeworCQljb21wdXRlX2FuZF9zZXRfdm9sdW1lKHZvaWNlLCB2b2ljZXNbdm9pY2VdLm1pZGlfdm9sdW1lLCAxKTsKKwkJcmV0dXJuOworCX0KKwkKKwkvKgorCSAqIFZvaWNlIGlzIHJ1bm5pbmcgYW5kIGhhcyBlbnZlbG9wZXMuCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCXN0YXR1cyA9IGd1c19yZWFkOCgweDBkKTsJLyogUmFtcGluZyBzdGF0dXMgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisKKwlpZiAoc3RhdHVzICYgMHgwMykJLyogU3VzdGFpbiBwaGFzZT8gKi8KKwl7CisJCWNvbXB1dGVfYW5kX3NldF92b2x1bWUodm9pY2UsIHZvaWNlc1t2b2ljZV0ubWlkaV92b2x1bWUsIDEpOworCQlyZXR1cm47CisJfQorCWlmICh2b2ljZXNbdm9pY2VdLmVudl9waGFzZSA8IDApCisJCXJldHVybjsKKworCWNvbXB1dGVfdm9sdW1lKHZvaWNlLCB2b2ljZXNbdm9pY2VdLm1pZGlfdm9sdW1lKTsKKworfQorCitzdGF0aWMgdm9pZCBndXN3YXZlX2NvbnRyb2xsZXIoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgY3RybF9udW0sIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyAgIGZyZXE7CisKKwlpZiAodm9pY2UgPCAwIHx8IHZvaWNlID4gMzEpCisJCXJldHVybjsKKworCXN3aXRjaCAoY3RybF9udW0pCisJeworCQljYXNlIENUUkxfUElUQ0hfQkVOREVSOgorCQkJdm9pY2VzW3ZvaWNlXS5iZW5kZXIgPSB2YWx1ZTsKKworCQkJaWYgKHZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlICE9IFZNT0RFX1NUQVJUX05PVEUpCisJCQl7CisJCQkJZnJlcSA9IGNvbXB1dGVfZmluZXR1bmUodm9pY2VzW3ZvaWNlXS5vcmlnX2ZyZXEsIHZhbHVlLCB2b2ljZXNbdm9pY2VdLmJlbmRlcl9yYW5nZSwgMCk7CisJCQkJdm9pY2VzW3ZvaWNlXS5jdXJyZW50X2ZyZXEgPSBmcmVxOworCisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJCQlndXNfdm9pY2VfZnJlcShmcmVxKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIENUUkxfUElUQ0hfQkVOREVSX1JBTkdFOgorCQkJdm9pY2VzW3ZvaWNlXS5iZW5kZXJfcmFuZ2UgPSB2YWx1ZTsKKwkJCWJyZWFrOworCQljYXNlIENUTF9FWFBSRVNTSU9OOgorCQkJdmFsdWUgLz0gMTI4OworCQljYXNlIENUUkxfRVhQUkVTU0lPTjoKKwkJCWlmICh2b2x1bWVfbWV0aG9kID09IFZPTF9NRVRIT0RfQURBR0lPKQorCQkJeworCQkJCXZvaWNlc1t2b2ljZV0uZXhwcmVzc2lvbl92b2wgPSB2YWx1ZTsKKwkJCQlpZiAodm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX21vZGUgIT0gVk1PREVfU1RBUlRfTk9URSkKKwkJCQkJZHluYW1pY192b2x1bWVfY2hhbmdlKHZvaWNlKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgQ1RMX1BBTjoKKwkJCXZvaWNlc1t2b2ljZV0ucGFubmluZyA9ICh2YWx1ZSAqIDIpIC0gMTI4OworCQkJYnJlYWs7CisKKwkJY2FzZSBDVExfTUFJTl9WT0xVTUU6CisJCQl2YWx1ZSA9ICh2YWx1ZSAqIDEwMCkgLyAxNjM4MzsKKworCQljYXNlIENUUkxfTUFJTl9WT0xVTUU6CisJCQl2b2ljZXNbdm9pY2VdLm1haW5fdm9sID0gdmFsdWU7CisJCQlpZiAodm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX21vZGUgIT0gVk1PREVfU1RBUlRfTk9URSkKKwkJCQlkeW5hbWljX3ZvbHVtZV9jaGFuZ2Uodm9pY2UpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBndXN3YXZlX3N0YXJ0X25vdGUyKGludCBkZXYsIGludCB2b2ljZSwgaW50IG5vdGVfbnVtLCBpbnQgdm9sdW1lKQoreworCWludCBzYW1wbGUsIGJlc3Rfc2FtcGxlLCBiZXN0X2RlbHRhLCBkZWx0YV9mcmVxOworCWludCBpczE2Yml0cywgc2FtcGxlcCwgcGF0Y2gsIHBhbjsKKwl1bnNpZ25lZCBsb25nICAgbm90ZV9mcmVxLCBiYXNlX25vdGUsIGZyZXEsIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgICBtb2RlID0gMDsKKworCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPiAzMSkKKwl7CisvKgkJcHJpbnRrKCJHVVM6IEludmFsaWQgdm9pY2VcbiIpOyovCisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAobm90ZV9udW0gPT0gMjU1KQorCXsKKwkJaWYgKHZvaWNlc1t2b2ljZV0ubW9kZSAmIFdBVkVfRU5WRUxPUEVTKQorCQl7CisJCQl2b2ljZXNbdm9pY2VdLm1pZGlfdm9sdW1lID0gdm9sdW1lOworCQkJZHluYW1pY192b2x1bWVfY2hhbmdlKHZvaWNlKTsKKwkJCXJldHVybiAwOworCQl9CisJCWNvbXB1dGVfYW5kX3NldF92b2x1bWUodm9pY2UsIHZvbHVtZSwgMSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoKHBhdGNoID0gcGF0Y2hfbWFwW3ZvaWNlXSkgPT0gLTEpCisJCXJldHVybiAtRUlOVkFMOworCWlmICgoc2FtcGxlcCA9IHBhdGNoX3RhYmxlW3BhdGNoXSkgPT0gTk9UX1NBTVBMRSkKKwl7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlub3RlX2ZyZXEgPSBub3RlX3RvX2ZyZXEobm90ZV9udW0pOworCisJLyoKKwkgKiBGaW5kIGEgc2FtcGxlIHdpdGhpbiBhIHBhdGNoIHNvIHRoYXQgdGhlIG5vdGVfZnJlcSBpcyBiZXR3ZWVuIGxvd19ub3RlCisJICogYW5kIGhpZ2hfbm90ZS4KKwkgKi8KKwlzYW1wbGUgPSAtMTsKKworCWJlc3Rfc2FtcGxlID0gc2FtcGxlcDsKKwliZXN0X2RlbHRhID0gMTAwMDAwMDsKKwl3aGlsZSAoc2FtcGxlcCAhPSAwICYmIHNhbXBsZXAgIT0gTk9UX1NBTVBMRSAmJiBzYW1wbGUgPT0gLTEpCisJeworCQlkZWx0YV9mcmVxID0gbm90ZV9mcmVxIC0gc2FtcGxlc1tzYW1wbGVwXS5iYXNlX25vdGU7CisJCWlmIChkZWx0YV9mcmVxIDwgMCkKKwkJCWRlbHRhX2ZyZXEgPSAtZGVsdGFfZnJlcTsKKwkJaWYgKGRlbHRhX2ZyZXEgPCBiZXN0X2RlbHRhKQorCQl7CisJCQliZXN0X3NhbXBsZSA9IHNhbXBsZXA7CisJCQliZXN0X2RlbHRhID0gZGVsdGFfZnJlcTsKKwkJfQorCQlpZiAoc2FtcGxlc1tzYW1wbGVwXS5sb3dfbm90ZSA8PSBub3RlX2ZyZXEgJiYKKwkJCW5vdGVfZnJlcSA8PSBzYW1wbGVzW3NhbXBsZXBdLmhpZ2hfbm90ZSkKKwkJeworCQkJc2FtcGxlID0gc2FtcGxlcDsKKwkJfQorCQllbHNlCisJCQlzYW1wbGVwID0gc2FtcGxlc1tzYW1wbGVwXS5rZXk7CS8qIExpbmsgdG8gbmV4dCBzYW1wbGUgKi8KKwkgIH0KKwlpZiAoc2FtcGxlID09IC0xKQorCQlzYW1wbGUgPSBiZXN0X3NhbXBsZTsKKworCWlmIChzYW1wbGUgPT0gLTEpCisJeworLyoJCXByaW50aygiR1VTOiBQYXRjaCAlZCBub3QgZGVmaW5lZCBmb3Igbm90ZSAlZFxuIiwgcGF0Y2gsIG5vdGVfbnVtKTsqLworCQlyZXR1cm4gMDsJLyogU2hvdWxkIHBsYXkgZGVmYXVsdCBwYXRjaCA/Pz8gKi8KKwl9CisJaXMxNmJpdHMgPSAoc2FtcGxlc1tzYW1wbGVdLm1vZGUgJiBXQVZFXzE2X0JJVFMpID8gMSA6IDA7CisJdm9pY2VzW3ZvaWNlXS5tb2RlID0gc2FtcGxlc1tzYW1wbGVdLm1vZGU7CisJdm9pY2VzW3ZvaWNlXS5wYXRjaF92b2wgPSBzYW1wbGVzW3NhbXBsZV0udm9sdW1lOworCisJaWYgKGl3X21vZGUpCisJCWd1c193cml0ZTgoMHgxNSwgMHgwMCk7CQkvKiBSQU0sIFJlc2V0IHZvaWNlIGRlYWN0aXZhdGUgYml0IG9mIFNNU0kgKi8KKworCWlmICh2b2ljZXNbdm9pY2VdLm1vZGUgJiBXQVZFX0VOVkVMT1BFUykKKwl7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCA2OyBpKyspCisJCXsKKwkJCXZvaWNlc1t2b2ljZV0uZW52X3JhdGVbaV0gPSBzYW1wbGVzW3NhbXBsZV0uZW52X3JhdGVbaV07CisJCQl2b2ljZXNbdm9pY2VdLmVudl9vZmZzZXRbaV0gPSBzYW1wbGVzW3NhbXBsZV0uZW52X29mZnNldFtpXTsKKwkJfQorCX0KKwlzYW1wbGVfbWFwW3ZvaWNlXSA9IHNhbXBsZTsKKworCWlmICh2b2ljZXNbdm9pY2VdLmZpeGVkX3BpdGNoKQkvKiBGaXhlZCBwaXRjaCAqLworCXsKKwkJICBmcmVxID0gc2FtcGxlc1tzYW1wbGVdLmJhc2VfZnJlcTsKKwl9CisJZWxzZQorCXsKKwkJYmFzZV9ub3RlID0gc2FtcGxlc1tzYW1wbGVdLmJhc2Vfbm90ZSAvIDEwMDsKKwkJbm90ZV9mcmVxIC89IDEwMDsKKworCQlmcmVxID0gc2FtcGxlc1tzYW1wbGVdLmJhc2VfZnJlcSAqIG5vdGVfZnJlcSAvIGJhc2Vfbm90ZTsKKwl9CisKKwl2b2ljZXNbdm9pY2VdLm9yaWdfZnJlcSA9IGZyZXE7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBwaXRjaCBiZW5kZXIgbWF5IGhhdmUgYmVlbiBzZXQgYmVmb3JlIHBsYXlpbmcgdGhlIG5vdGUsIHdlCisJICogaGF2ZSB0byBjYWxjdWxhdGUgdGhlIGJlbmRpbmcgbm93LgorCSAqLworCisJZnJlcSA9IGNvbXB1dGVfZmluZXR1bmUodm9pY2VzW3ZvaWNlXS5vcmlnX2ZyZXEsIHZvaWNlc1t2b2ljZV0uYmVuZGVyLAorCQkJCXZvaWNlc1t2b2ljZV0uYmVuZGVyX3JhbmdlLCAwKTsKKwl2b2ljZXNbdm9pY2VdLmN1cnJlbnRfZnJlcSA9IGZyZXE7CisKKwlwYW4gPSAoc2FtcGxlc1tzYW1wbGVdLnBhbm5pbmcgKyB2b2ljZXNbdm9pY2VdLnBhbm5pbmcpIC8gMzI7CisJcGFuICs9IDc7CisJaWYgKHBhbiA8IDApCisJCXBhbiA9IDA7CisJaWYgKHBhbiA+IDE1KQorCQlwYW4gPSAxNTsKKworCWlmIChzYW1wbGVzW3NhbXBsZV0ubW9kZSAmIFdBVkVfMTZfQklUUykKKwl7CisJCW1vZGUgfD0gMHgwNDsJLyogMTYgYml0cyAqLworCQlpZiAoKHNhbXBsZV9wdHJzW3NhbXBsZV0gLyBHVVNfQkFOS19TSVpFKSAhPQorCQkJKChzYW1wbGVfcHRyc1tzYW1wbGVdICsgc2FtcGxlc1tzYW1wbGVdLmxlbikgLyBHVVNfQkFOS19TSVpFKSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIkdVUzogU2FtcGxlIGFkZHJlc3MgZXJyb3JcbiIpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCWd1c192b2ljZV9vZmYoKTsKKwlndXNfcmFtcG9mZigpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCisJaWYgKHZvaWNlc1t2b2ljZV0ubW9kZSAmIFdBVkVfRU5WRUxPUEVTKQorCXsKKwkJY29tcHV0ZV92b2x1bWUodm9pY2UsIHZvbHVtZSk7CisJCWluaXRfZW52ZWxvcGUodm9pY2UpOworCX0KKwllbHNlCisJeworCQljb21wdXRlX2FuZF9zZXRfdm9sdW1lKHZvaWNlLCB2b2x1bWUsIDApOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisKKwlpZiAoc2FtcGxlc1tzYW1wbGVdLm1vZGUgJiBXQVZFX0xPT1BfQkFDSykKKwkJZ3VzX3dyaXRlX2FkZHIoMHgwYSwgc2FtcGxlX3B0cnNbc2FtcGxlXSArIHNhbXBsZXNbc2FtcGxlXS5sZW4gLQorCQkJdm9pY2VzW3ZvaWNlXS5vZmZzZXRfcGVuZGluZywgMCwgaXMxNmJpdHMpOwkvKiBzdGFydD1lbmQgKi8KKwllbHNlCisJCWd1c193cml0ZV9hZGRyKDB4MGEsIHNhbXBsZV9wdHJzW3NhbXBsZV0gKyB2b2ljZXNbdm9pY2VdLm9mZnNldF9wZW5kaW5nLCAwLCBpczE2Yml0cyk7CS8qIFNhbXBsZSBzdGFydD1iZWdpbiAqLworCisJaWYgKHNhbXBsZXNbc2FtcGxlXS5tb2RlICYgV0FWRV9MT09QSU5HKQorCXsKKwkJbW9kZSB8PSAweDA4OworCisJCWlmIChzYW1wbGVzW3NhbXBsZV0ubW9kZSAmIFdBVkVfQklESVJfTE9PUCkKKwkJCW1vZGUgfD0gMHgxMDsKKworCQlpZiAoc2FtcGxlc1tzYW1wbGVdLm1vZGUgJiBXQVZFX0xPT1BfQkFDSykKKwkJeworCQkJZ3VzX3dyaXRlX2FkZHIoMHgwYSwgc2FtcGxlX3B0cnNbc2FtcGxlXSArIHNhbXBsZXNbc2FtcGxlXS5sb29wX2VuZCAtCisJCQkJCSAgIHZvaWNlc1t2b2ljZV0ub2Zmc2V0X3BlbmRpbmcsCisJCQkJCSAgIChzYW1wbGVzW3NhbXBsZV0uZnJhY3Rpb25zID4+IDQpICYgMHgwZiwgaXMxNmJpdHMpOworCQkJbW9kZSB8PSAweDQwOworCQl9CisJCWd1c193cml0ZV9hZGRyKDB4MDIsIHNhbXBsZV9wdHJzW3NhbXBsZV0gKyBzYW1wbGVzW3NhbXBsZV0ubG9vcF9zdGFydCwKKwkJCXNhbXBsZXNbc2FtcGxlXS5mcmFjdGlvbnMgJiAweDBmLCBpczE2Yml0cyk7CS8qIExvb3Agc3RhcnQgbG9jYXRpb24gKi8KKwkJZ3VzX3dyaXRlX2FkZHIoMHgwNCwgc2FtcGxlX3B0cnNbc2FtcGxlXSArIHNhbXBsZXNbc2FtcGxlXS5sb29wX2VuZCwKKwkJCShzYW1wbGVzW3NhbXBsZV0uZnJhY3Rpb25zID4+IDQpICYgMHgwZiwgaXMxNmJpdHMpOwkvKiBMb29wIGVuZCBsb2NhdGlvbiAqLworCX0KKwllbHNlCisJeworCQltb2RlIHw9IDB4MjA7CS8qIExvb3AgSVJRIGF0IHRoZSBlbmQgKi8KKwkJdm9pY2VzW3ZvaWNlXS5sb29wX2lycV9tb2RlID0gTE1PREVfRklOSVNIOwkvKiBSYW1wIGRvd24gYXQgdGhlIGVuZCAqLworCQl2b2ljZXNbdm9pY2VdLmxvb3BfaXJxX3Bhcm0gPSAxOworCQlndXNfd3JpdGVfYWRkcigweDAyLCBzYW1wbGVfcHRyc1tzYW1wbGVdLCAwLCBpczE2Yml0cyk7CS8qIExvb3Agc3RhcnQgbG9jYXRpb24gKi8KKwkJZ3VzX3dyaXRlX2FkZHIoMHgwNCwgc2FtcGxlX3B0cnNbc2FtcGxlXSArIHNhbXBsZXNbc2FtcGxlXS5sZW4gLSAxLAorCQkJKHNhbXBsZXNbc2FtcGxlXS5mcmFjdGlvbnMgPj4gNCkgJiAweDBmLCBpczE2Yml0cyk7CS8qIExvb3AgZW5kIGxvY2F0aW9uICovCisJfQorCWd1c192b2ljZV9mcmVxKGZyZXEpOworCWd1c192b2ljZV9iYWxhbmNlKHBhbik7CisJZ3VzX3ZvaWNlX29uKG1vZGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKworCXJldHVybiAwOworfQorCisvKgorICogTmV3IGd1c3dhdmVfc3RhcnRfbm90ZSBieSBBbmRyZXcgSi4gUm9iaW5zb24gYXR0ZW1wdHMgdG8gbWluaW1pemUgY2xpY2tpbmcKKyAqIHdoZW4gdGhlIG5vdGUgcGxheWluZyBvbiB0aGUgdm9pY2UgaXMgY2hhbmdlZC4gIEl0IHVzZXMgdm9sdW1lCisgKiByYW1waW5nLgorICovCisKK3N0YXRpYyBpbnQgZ3Vzd2F2ZV9zdGFydF9ub3RlKGludCBkZXYsIGludCB2b2ljZSwgaW50IG5vdGVfbnVtLCBpbnQgdm9sdW1lKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG1vZGU7CisJaW50IHJldF92YWwgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwlpZiAobm90ZV9udW0gPT0gMjU1KQorCXsKKwkJaWYgKHZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlID09IFZNT0RFX1NUQVJUX05PVEUpCisJCXsKKwkJCXZvaWNlc1t2b2ljZV0udm9sdW1lX3BlbmRpbmcgPSB2b2x1bWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZXRfdmFsID0gZ3Vzd2F2ZV9zdGFydF9ub3RlMihkZXYsIHZvaWNlLCBub3RlX251bSwgdm9sdW1lKTsKKwkJfQorCX0KKwllbHNlCisJeworCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJbW9kZSA9IGd1c19yZWFkOCgweDAwKTsKKwkJaWYgKG1vZGUgJiAweDIwKQorCQkJZ3VzX3dyaXRlOCgweDAwLCBtb2RlICYgMHhkZik7CS8qIE5vIGludGVycnVwdCEgKi8KKworCQl2b2ljZXNbdm9pY2VdLm9mZnNldF9wZW5kaW5nID0gMDsKKwkJdm9pY2VzW3ZvaWNlXS5raWxsX3BlbmRpbmcgPSAwOworCQl2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZSA9IDA7CisJCXZvaWNlc1t2b2ljZV0ubG9vcF9pcnFfbW9kZSA9IDA7CisKKwkJaWYgKHZvaWNlc1t2b2ljZV0uc2FtcGxlX3BlbmRpbmcgPj0gMCkKKwkJeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOwkvKiBSdW4gdGVtcG9yYXJpbHkgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQgKi8KKwkJCWd1c3dhdmVfc2V0X2luc3RyKHZvaWNlc1t2b2ljZV0uZGV2X3BlbmRpbmcsIHZvaWNlLCB2b2ljZXNbdm9pY2VdLnNhbXBsZV9wZW5kaW5nKTsKKwkJCXZvaWNlc1t2b2ljZV0uc2FtcGxlX3BlbmRpbmcgPSAtMTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsJLyogUmVzZWxlY3QgdGhlIHZvaWNlIChqdXN0IHRvIGJlIHN1cmUpICovCisJCX0KKwkJaWYgKChtb2RlICYgMHgwMSkgfHwgKGludCkgKChndXNfcmVhZDE2KDB4MDkpID4+IDQpIDwgKHVuc2lnbmVkKSAyMDY1KSkKKwkJeworCQkJcmV0X3ZhbCA9IGd1c3dhdmVfc3RhcnRfbm90ZTIoZGV2LCB2b2ljZSwgbm90ZV9udW0sIHZvbHVtZSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQl2b2ljZXNbdm9pY2VdLmRldl9wZW5kaW5nID0gZGV2OworCQkJdm9pY2VzW3ZvaWNlXS5ub3RlX3BlbmRpbmcgPSBub3RlX251bTsKKwkJCXZvaWNlc1t2b2ljZV0udm9sdW1lX3BlbmRpbmcgPSB2b2x1bWU7CisJCQl2b2ljZXNbdm9pY2VdLnZvbHVtZV9pcnFfbW9kZSA9IFZNT0RFX1NUQVJUX05PVEU7CisKKwkJCWd1c19yYW1wb2ZmKCk7CisJCQlndXNfcmFtcF9yYW5nZSgyMDAwLCA0MDY1KTsKKwkJCWd1c19yYW1wX3JhdGUoMCwgNjMpOwkvKiBGYXN0ZXN0IHBvc3NpYmxlIHJhdGUgKi8KKwkJCWd1c19yYW1wb24oMHgyMCB8IDB4NDApOwkvKiBSYW1wIGRvd24sIG9uY2UsIGlycSAqLworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworc3RhdGljIHZvaWQgZ3Vzd2F2ZV9yZXNldChpbnQgZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspCisJeworCQlndXNfdm9pY2VfaW5pdChpKTsKKwkJZ3VzX3ZvaWNlX2luaXQyKGkpOworCX0KK30KKworc3RhdGljIGludCBndXN3YXZlX29wZW4oaW50IGRldiwgaW50IG1vZGUpCit7CisJaW50IGVycjsKKworCWlmIChndXNfYnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXZvaWNlX2FsbG9jLT50aW1lc3RhbXAgPSAwOworCisJaWYgKGd1c19ub193YXZlX2RtYSkgeworCQlndXNfbm9fZG1hID0gMTsKKwl9IGVsc2UgeworCQlpZiAoKGVyciA9IERNQWJ1Zl9vcGVuX2RtYShndXNfZGV2bnVtKSkgPCAwKQorCQl7CisJCQkvKiBwcmludGsoICJHVVM6IExvYWRpbmcgc2FtcGxlcyB3aXRob3V0IERNQVxuIik7ICovCisJCQlndXNfbm9fZG1hID0gMTsJLyogVXBsb2FkIHNhbXBsZXMgdXNpbmcgUElPICovCisJCX0KKwkJZWxzZQorCQkJZ3VzX25vX2RtYSA9IDA7CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZHJhbV9zbGVlcGVyKTsKKwlndXNfYnVzeSA9IDE7CisJYWN0aXZlX2RldmljZSA9IEdVU19ERVZfV0FWRTsKKworCWd1c2ludHIoZ3VzX2lycSwgKHZvaWQgKilndXNfaHdfY29uZmlnLCBOVUxMKTsJLyogU2VydmUgcGVuZGluZyBpbnRlcnJ1cHRzICovCisJZ3VzX2luaXRpYWxpemUoKTsKKwlndXNfcmVzZXQoKTsKKwlndXNpbnRyKGd1c19pcnEsICh2b2lkICopZ3VzX2h3X2NvbmZpZywgTlVMTCk7CS8qIFNlcnZlIHBlbmRpbmcgaW50ZXJydXB0cyAqLworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGd1c3dhdmVfY2xvc2UoaW50IGRldikKK3sKKwlndXNfYnVzeSA9IDA7CisJYWN0aXZlX2RldmljZSA9IDA7CisJZ3VzX3Jlc2V0KCk7CisKKwlpZiAoIWd1c19ub19kbWEpCisJCURNQWJ1Zl9jbG9zZV9kbWEoZ3VzX2Rldm51bSk7Cit9CisKK3N0YXRpYyBpbnQgZ3Vzd2F2ZV9sb2FkX3BhdGNoKGludCBkZXYsIGludCBmb3JtYXQsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLAorCQkgICBpbnQgb2ZmcywgaW50IGNvdW50LCBpbnQgcG1ncl9mbGFnKQoreworCXN0cnVjdCBwYXRjaF9pbmZvIHBhdGNoOworCWludCBpbnN0cjsKKwlsb25nIHNpemVvZl9wYXRjaDsKKworCXVuc2lnbmVkIGxvbmcgYmxrX3N6LCBibGtfZW5kLCBsZWZ0LCBzcmNfb2ZmcywgdGFyZ2V0OworCisJc2l6ZW9mX3BhdGNoID0gKGxvbmcpICZwYXRjaC5kYXRhWzBdIC0gKGxvbmcpICZwYXRjaDsJLyogSGVhZGVyIHNpemUgKi8KKworCWlmIChmb3JtYXQgIT0gR1VTX1BBVENIKQorCXsKKy8qCQlwcmludGsoIkdVUyBFcnJvcjogSW52YWxpZCBwYXRjaCBmb3JtYXQgKGtleSkgMHgleFxuIiwgZm9ybWF0KTsqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGNvdW50IDwgc2l6ZW9mX3BhdGNoKQorCXsKKy8qCQkgIHByaW50aygiR1VTIEVycm9yOiBQYXRjaCBoZWFkZXIgdG9vIHNob3J0XG4iKTsqLworCQkgIHJldHVybiAtRUlOVkFMOworCX0KKwljb3VudCAtPSBzaXplb2ZfcGF0Y2g7CisKKwlpZiAoZnJlZV9zYW1wbGUgPj0gTUFYX1NBTVBMRSkKKwl7CisvKgkJICBwcmludGsoIkdVUzogU2FtcGxlIHRhYmxlIGZ1bGxcbiIpOyovCisJCSAgcmV0dXJuIC1FTk9TUEM7CisJfQorCS8qCisJICogQ29weSB0aGUgaGVhZGVyIGZyb20gdXNlciBzcGFjZSBidXQgaWdub3JlIHRoZSBmaXJzdCBieXRlcyB3aGljaCBoYXZlCisJICogYmVlbiB0cmFuc2ZlcnJlZCBhbHJlYWR5LgorCSAqLworCisJaWYgKGNvcHlfZnJvbV91c2VyKCYoKGNoYXIgKikgJnBhdGNoKVtvZmZzXSwgJihhZGRyKVtvZmZzXSwKKwkJCSAgIHNpemVvZl9wYXRjaCAtIG9mZnMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChwYXRjaC5tb2RlICYgV0FWRV9ST00pCisJCXJldHVybiAtRUlOVkFMOworCWlmIChndXNfbWVtX3NpemUgPT0gMCkKKwkJcmV0dXJuIC1FTk9TUEM7CisKKwlpbnN0ciA9IHBhdGNoLmluc3RyX25vOworCisJaWYgKGluc3RyIDwgMCB8fCBpbnN0ciA+IE1BWF9QQVRDSCkKKwl7CisvKgkJcHJpbnRrKEtFUk5fRVJSICJHVVM6IEludmFsaWQgcGF0Y2ggbnVtYmVyICVkXG4iLCBpbnN0cik7Ki8KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjb3VudCA8IHBhdGNoLmxlbikKKwl7CisvKgkJcHJpbnRrKEtFUk5fRVJSICJHVVMgV2FybmluZzogUGF0Y2ggcmVjb3JkIHRvbyBzaG9ydCAoJWQ8JWQpXG4iLCBjb3VudCwgKGludCkgcGF0Y2gubGVuKTsqLworCQlwYXRjaC5sZW4gPSBjb3VudDsKKwl9CisJaWYgKHBhdGNoLmxlbiA8PSAwIHx8IHBhdGNoLmxlbiA+IGd1c19tZW1fc2l6ZSkKKwl7CisvKgkJcHJpbnRrKEtFUk5fRVJSICJHVVM6IEludmFsaWQgc2FtcGxlIGxlbmd0aCAlZFxuIiwgKGludCkgcGF0Y2gubGVuKTsqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHBhdGNoLm1vZGUgJiBXQVZFX0xPT1BJTkcpCisJeworCQlpZiAocGF0Y2gubG9vcF9zdGFydCA8IDAgfHwgcGF0Y2gubG9vcF9zdGFydCA+PSBwYXRjaC5sZW4pCisJCXsKKy8qCQkJcHJpbnRrKEtFUk5fRVJSICJHVVM6IEludmFsaWQgbG9vcCBzdGFydFxuIik7Ki8KKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChwYXRjaC5sb29wX2VuZCA8IHBhdGNoLmxvb3Bfc3RhcnQgfHwgcGF0Y2gubG9vcF9lbmQgPiBwYXRjaC5sZW4pCisJCXsKKy8qCQkJcHJpbnRrKEtFUk5fRVJSICJHVVM6IEludmFsaWQgbG9vcCBlbmRcbiIpOyovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwlmcmVlX21lbV9wdHIgPSAoZnJlZV9tZW1fcHRyICsgMzEpICYgfjMxOwkvKiAzMiBieXRlIGFsaWdubWVudCAqLworCisJaWYgKHBhdGNoLm1vZGUgJiBXQVZFXzE2X0JJVFMpCisJeworCQkvKgorCQkgKiAxNiBiaXQgc2FtcGxlcyBtdXN0IGZpdCBvbmUgMjU2ayBiYW5rLgorCQkgKi8KKwkJaWYgKHBhdGNoLmxlbiA+PSBHVVNfQkFOS19TSVpFKQorCQl7CisvKgkJCSBwcmludGsoIkdVUzogU2FtcGxlICgxNiBiaXQpIHRvbyBsb25nICVkXG4iLCAoaW50KSBwYXRjaC5sZW4pOyovCisJCQlyZXR1cm4gLUVOT1NQQzsKKwkJfQorCQlpZiAoKGZyZWVfbWVtX3B0ciAvIEdVU19CQU5LX1NJWkUpICE9CisJCQkoKGZyZWVfbWVtX3B0ciArIHBhdGNoLmxlbikgLyBHVVNfQkFOS19TSVpFKSkKKwkJeworCQkJdW5zaWduZWQgbG9uZyAgIHRtcF9tZW0gPQkKKwkJCQkvKiBBbGlnbiB0byAyNTZLICovCisJCQkJCSgoZnJlZV9tZW1fcHRyIC8gR1VTX0JBTktfU0laRSkgKyAxKSAqIEdVU19CQU5LX1NJWkU7CisKKwkJCWlmICgodG1wX21lbSArIHBhdGNoLmxlbikgPiBndXNfbWVtX3NpemUpCisJCQkJcmV0dXJuIC1FTk9TUEM7CisKKwkJCWZyZWVfbWVtX3B0ciA9IHRtcF9tZW07CQkvKiBUaGlzIGxlYXZlcyB1bnVzYWJsZSBtZW1vcnkgKi8KKwkJfQorCX0KKwlpZiAoKGZyZWVfbWVtX3B0ciArIHBhdGNoLmxlbikgPiBndXNfbWVtX3NpemUpCisJCXJldHVybiAtRU5PU1BDOworCisJc2FtcGxlX3B0cnNbZnJlZV9zYW1wbGVdID0gZnJlZV9tZW1fcHRyOworCisJLyoKKwkgKiBUcmVtb2xvIGlzIG5vdCBwb3NzaWJsZSB3aXRoIGVudmVsb3BlcworCSAqLworCisJaWYgKHBhdGNoLm1vZGUgJiBXQVZFX0VOVkVMT1BFUykKKwkJcGF0Y2gubW9kZSAmPSB+V0FWRV9UUkVNT0xPOworCisJaWYgKCEocGF0Y2gubW9kZSAmIFdBVkVfRlJBQ1RJT05TKSkKKwl7CisJCSAgcGF0Y2guZnJhY3Rpb25zID0gMDsKKwl9CisJbWVtY3B5KChjaGFyICopICZzYW1wbGVzW2ZyZWVfc2FtcGxlXSwgJnBhdGNoLCBzaXplb2ZfcGF0Y2gpOworCisJLyoKKwkgKiBMaW5rIHRoaXNfb25lIHNhbXBsZSB0byB0aGUgbGlzdCBvZiBzYW1wbGVzIGZvciBwYXRjaCAnaW5zdHInLgorCSAqLworCisJc2FtcGxlc1tmcmVlX3NhbXBsZV0ua2V5ID0gcGF0Y2hfdGFibGVbaW5zdHJdOworCXBhdGNoX3RhYmxlW2luc3RyXSA9IGZyZWVfc2FtcGxlOworCisJLyoKKwkgKiBVc2UgRE1BIHRvIHRyYW5zZmVyIHRoZSB3YXZlIGRhdGEgdG8gdGhlIERSQU0KKwkgKi8KKworCWxlZnQgPSBwYXRjaC5sZW47CisJc3JjX29mZnMgPSAwOworCXRhcmdldCA9IGZyZWVfbWVtX3B0cjsKKworCXdoaWxlIChsZWZ0KQkJLyogTm90IGNvbXBsZXRlbHkgdHJhbnNmZXJyZWQgeWV0ICovCisJeworCQlibGtfc3ogPSBhdWRpb19kZXZzW2d1c19kZXZudW1dLT5kbWFwX291dC0+Ynl0ZXNfaW5fdXNlOworCQlpZiAoYmxrX3N6ID4gbGVmdCkKKwkJCWJsa19zeiA9IGxlZnQ7CisKKwkJLyoKKwkJICogRE1BIGNhbm5vdCBjcm9zcyBiYW5rICgyNTZrKSBib3VuZGFyaWVzLiBDaGVjayBmb3IgdGhhdC4KKwkJICovCisJCSAKKwkJYmxrX2VuZCA9IHRhcmdldCArIGJsa19zejsKKworCQlpZiAoKHRhcmdldCAvIEdVU19CQU5LX1NJWkUpICE9IChibGtfZW5kIC8gR1VTX0JBTktfU0laRSkpCisJCXsKKwkJCS8qIFNwbGl0IHRoZSBibG9jayAqLworCQkJYmxrX2VuZCAmPSB+KEdVU19CQU5LX1NJWkUgLSAxKTsKKwkJCWJsa19zeiA9IGJsa19lbmQgLSB0YXJnZXQ7CisJCX0KKwkJaWYgKGd1c19ub19kbWEpCisJCXsKKwkJCS8qCisJCQkgKiBGb3Igc29tZSByZWFzb24gdGhlIERNQSBpcyBub3QgcG9zc2libGUuIFdlIGhhdmUgdG8gdXNlIFBJTy4KKwkJCSAqLworCQkJbG9uZyBpOworCQkJdW5zaWduZWQgY2hhciBkYXRhOworCisJCQlmb3IgKGkgPSAwOyBpIDwgYmxrX3N6OyBpKyspCisJCQl7CisJCQkJZ2V0X3VzZXIoKih1bnNpZ25lZCBjaGFyICopICZkYXRhLCAodW5zaWduZWQgY2hhciBfX3VzZXIgKikgJigoYWRkcilbc2l6ZW9mX3BhdGNoICsgaV0pKTsKKwkJCQlpZiAocGF0Y2gubW9kZSAmIFdBVkVfVU5TSUdORUQpCisJCQkJCWlmICghKHBhdGNoLm1vZGUgJiBXQVZFXzE2X0JJVFMpIHx8IChpICYgMHgwMSkpCisJCQkJCQlkYXRhIF49IDB4ODA7CS8qIENvbnZlcnQgdG8gc2lnbmVkICovCisJCQkJZ3VzX3Bva2UodGFyZ2V0ICsgaSwgZGF0YSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGhvbGRfYWRkcmVzczsKKwkJCXVuc2lnbmVkIGNoYXIgZG1hX2NvbW1hbmQ7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQlpZiAoYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+ZG1hcF9vdXQtPnJhd19idWYgPT0gTlVMTCkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgIkdVUzogRE1BIGJ1ZmZlciA9PSBOVUxMXG4iKTsKKwkJCQlyZXR1cm4gLUVOT1NQQzsKKwkJCX0KKwkJCS8qCisJCQkgKiBPSywgbW92ZSBub3cuIEZpcnN0IGluIGFuZCB0aGVuIG91dC4KKwkJCSAqLworCisJCQlpZiAoY29weV9mcm9tX3VzZXIoYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+ZG1hcF9vdXQtPnJhd19idWYsCisJCQkJCSAgICYoYWRkcilbc2l6ZW9mX3BhdGNoICsgc3JjX29mZnNdLAorCQkJCQkgICBibGtfc3opKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3dyaXRlOCgweDQxLCAwKTsJLyogRGlzYWJsZSBHRjEgRE1BICovCisJCQlETUFidWZfc3RhcnRfZG1hKGd1c19kZXZudW0sIGF1ZGlvX2RldnNbZ3VzX2Rldm51bV0tPmRtYXBfb3V0LT5yYXdfYnVmX3BoeXMsCisJCQkJYmxrX3N6LCBETUFfTU9ERV9XUklURSk7CisKKwkJCS8qCisJCQkgKiBTZXQgdGhlIERSQU0gYWRkcmVzcyBmb3IgdGhlIHdhdmUgZGF0YQorCQkJICovCisKKwkJCWlmIChpd19tb2RlKQorCQkJeworCQkJCS8qIERpZmZlcmVudCBhZGRyZXNzIHRyYW5zbGF0aW9uIGluIGVuaGFuY2VkIG1vZGUgKi8KKworCQkJCXVuc2lnbmVkIGNoYXIgICBoaTsKKworCQkJCWlmIChndXNfZG1hID4gNCkKKwkJCQkJYWRkcmVzcyA9IHRhcmdldCA+PiAxOwkvKiBDb252ZXJ0IHRvIDE2IGJpdCB3b3JkIGFkZHJlc3MgKi8KKwkJCQllbHNlCisJCQkJCWFkZHJlc3MgPSB0YXJnZXQ7CisKKwkJCQloaSA9ICh1bnNpZ25lZCBjaGFyKSAoKGFkZHJlc3MgPj4gMTYpICYgMHhmMCk7CisJCQkJaGkgKz0gKHVuc2lnbmVkIGNoYXIpIChhZGRyZXNzICYgMHgwZik7CisKKwkJCQlndXNfd3JpdGUxNigweDQyLCAoYWRkcmVzcyA+PiA0KSAmIDB4ZmZmZik7CS8qIERNQSBhZGRyZXNzIChsb3cpICovCisJCQkJZ3VzX3dyaXRlOCgweDUwLCBoaSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJYWRkcmVzcyA9IHRhcmdldDsKKwkJCQlpZiAoYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+ZG1hcF9vdXQtPmRtYSA+IDMpCisJCQkJeworCQkJCQlob2xkX2FkZHJlc3MgPSBhZGRyZXNzOworCQkJCQlhZGRyZXNzID0gYWRkcmVzcyA+PiAxOworCQkJCQlhZGRyZXNzICY9IDB4MDAwMWZmZmZMOworCQkJCQlhZGRyZXNzIHw9IChob2xkX2FkZHJlc3MgJiAweDAwMGMwMDAwTCk7CisJCQkJfQorCQkJCWd1c193cml0ZTE2KDB4NDIsIChhZGRyZXNzID4+IDQpICYgMHhmZmZmKTsJLyogRFJBTSBETUEgYWRkcmVzcyAqLworCQkJfQorCisJCQkvKgorCQkJICogU3RhcnQgdGhlIERNQSB0cmFuc2ZlcgorCQkJICovCisKKwkJCWRtYV9jb21tYW5kID0gMHgyMTsJCS8qIElSUSBlbmFibGUsIERNQSBzdGFydCAqLworCQkJaWYgKHBhdGNoLm1vZGUgJiBXQVZFX1VOU0lHTkVEKQorCQkJCWRtYV9jb21tYW5kIHw9IDB4ODA7CS8qIEludmVydCBNU0IgKi8KKwkJCWlmIChwYXRjaC5tb2RlICYgV0FWRV8xNl9CSVRTKQorCQkJCWRtYV9jb21tYW5kIHw9IDB4NDA7CS8qIDE2IGJpdCBfREFUQV8gKi8KKwkJCWlmIChhdWRpb19kZXZzW2d1c19kZXZudW1dLT5kbWFwX291dC0+ZG1hID4gMykKKwkJCQlkbWFfY29tbWFuZCB8PSAweDA0OwkvKiAxNiBiaXQgRE1BIF9jaGFubmVsXyAqLworCQkJCisJCQkvKgorCQkJICogU2xlZXAgaGVyZSB1bnRpbCB0aGUgRFJBTSBETUEgZG9uZSBpbnRlcnJ1cHQgaXMgc2VydmVkCisJCQkgKi8KKwkJCWFjdGl2ZV9kZXZpY2UgPSBHVVNfREVWX1dBVkU7CisJCQlndXNfd3JpdGU4KDB4NDEsIGRtYV9jb21tYW5kKTsJLyogTGV0cyBnbyBsdXRlZXQgKD1idWdzKSAqLworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7IC8qIG9wZW5zIGEgcmFjZSAqLworCQkJaWYgKCFpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmRyYW1fc2xlZXBlciwgSFopKQorCQkJCXByaW50aygiR1VTOiBETUEgVHJhbnNmZXIgdGltZWQgb3V0XG4iKTsKKwkJfQorCisJCS8qCisJCSAqIE5vdyB0aGUgbmV4dCBwYXJ0CisJCSAqLworCisJCWxlZnQgLT0gYmxrX3N6OworCQlzcmNfb2ZmcyArPSBibGtfc3o7CisJCXRhcmdldCArPSBibGtfc3o7CisKKwkJZ3VzX3dyaXRlOCgweDQxLCAwKTsJLyogU3RvcCBETUEgKi8KKwl9CisKKwlmcmVlX21lbV9wdHIgKz0gcGF0Y2gubGVuOworCWZyZWVfc2FtcGxlKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGd1c3dhdmVfaHdfY29udHJvbChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyICpldmVudF9yZWMpCit7CisJaW50IHZvaWNlLCBjbWQ7CisJdW5zaWduZWQgc2hvcnQgcDEsIHAyOworCXVuc2lnbmVkIGludCBwbG9uZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJY21kID0gZXZlbnRfcmVjWzJdOworCXZvaWNlID0gZXZlbnRfcmVjWzNdOworCXAxID0gKih1bnNpZ25lZCBzaG9ydCAqKSAmZXZlbnRfcmVjWzRdOworCXAyID0gKih1bnNpZ25lZCBzaG9ydCAqKSAmZXZlbnRfcmVjWzZdOworCXBsb25nID0gKih1bnNpZ25lZCBpbnQgKikgJmV2ZW50X3JlY1s0XTsKKworCWlmICgodm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX21vZGUgPT0gVk1PREVfU1RBUlRfTk9URSkgJiYKKwkJKGNtZCAhPSBfR1VTX1ZPSUNFU0FNUExFKSAmJiAoY21kICE9IF9HVVNfVk9JQ0VfUE9TKSkKKwkJZG9fdm9sdW1lX2lycSh2b2ljZSk7CisKKwlzd2l0Y2ggKGNtZCkKKwl7CisJCWNhc2UgX0dVU19OVU1WT0lDRVM6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCQlndXNfc2VsZWN0X21heF92b2ljZXMocDEpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1ZPSUNFU0FNUExFOgorCQkJZ3Vzd2F2ZV9zZXRfaW5zdHIoZGV2LCB2b2ljZSwgcDEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1ZPSUNFT046CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCQlwMSAmPSB+MHgyMDsJLyogRG9uJ3QgYWxsb3cgaW50ZXJydXB0cyAqLworCQkJZ3VzX3ZvaWNlX29uKHAxKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgX0dVU19WT0lDRU9GRjoKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJCWd1c192b2ljZV9vZmYoKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgX0dVU19WT0lDRUZBREU6CisJCQlndXNfdm9pY2VfZmFkZSh2b2ljZSk7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfVk9JQ0VNT0RFOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQkJcDEgJj0gfjB4MjA7CS8qIERvbid0IGFsbG93IGludGVycnVwdHMgKi8KKwkJCWd1c192b2ljZV9tb2RlKHAxKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgX0dVU19WT0lDRUJBTEE6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCQlndXNfdm9pY2VfYmFsYW5jZShwMSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfVk9JQ0VGUkVROgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQkJZ3VzX3ZvaWNlX2ZyZXEocGxvbmcpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1ZPSUNFVk9MOgorCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQkJZ3VzX3ZvaWNlX3ZvbHVtZShwMSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfVk9JQ0VWT0wyOgkvKiBKdXN0IHVwZGF0ZSB0aGUgc29mdHdhcmUgdm9pY2UgbGV2ZWwgKi8KKwkJCXZvaWNlc1t2b2ljZV0uaW5pdGlhbF92b2x1bWUgPSB2b2ljZXNbdm9pY2VdLmN1cnJlbnRfdm9sdW1lID0gcDE7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfUkFNUFJBTkdFOgorCQkJaWYgKHZvaWNlc1t2b2ljZV0ubW9kZSAmIFdBVkVfRU5WRUxPUEVTKQorCQkJCWJyZWFrOwkvKiBOTy1OTyAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQkJZ3VzX3JhbXBfcmFuZ2UocDEsIHAyKTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgX0dVU19SQU1QUkFURToKKwkJCWlmICh2b2ljZXNbdm9pY2VdLm1vZGUgJiBXQVZFX0VOVkVMT1BFUykKKwkJCQlicmVhazsJLyogTkpFVC1OSkVUICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCQlndXNfcmFtcF9yYXRlKHAxLCBwMik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfUkFNUE1PREU6CisJCQlpZiAodm9pY2VzW3ZvaWNlXS5tb2RlICYgV0FWRV9FTlZFTE9QRVMpCisJCQkJYnJlYWs7CS8qIE5PLU5PICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJCQlwMSAmPSB+MHgyMDsJLyogRG9uJ3QgYWxsb3cgaW50ZXJydXB0cyAqLworCQkJZ3VzX3JhbXBfbW9kZShwMSk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfUkFNUE9OOgorCQkJaWYgKHZvaWNlc1t2b2ljZV0ubW9kZSAmIFdBVkVfRU5WRUxPUEVTKQorCQkJCWJyZWFrOwkvKiBFSS1FSSAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCQkJcDEgJj0gfjB4MjA7CS8qIERvbid0IGFsbG93IGludGVycnVwdHMgKi8KKwkJCWd1c19yYW1wb24ocDEpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1JBTVBPRkY6CisJCQlpZiAodm9pY2VzW3ZvaWNlXS5tb2RlICYgV0FWRV9FTlZFTE9QRVMpCisJCQkJYnJlYWs7CS8qIE5FSi1ORUogKi8KKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJCWd1c19yYW1wb2ZmKCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIF9HVVNfVk9MVU1FX1NDQUxFOgorCQkJdm9sdW1lX2Jhc2UgPSBwMTsKKwkJCXZvbHVtZV9zY2FsZSA9IHAyOworCQkJYnJlYWs7CisKKwkJY2FzZSBfR1VTX1ZPSUNFX1BPUzoKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJCWd1c19zZXRfdm9pY2VfcG9zKHZvaWNlLCBwbG9uZyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGd1c19hdWRpb19zZXRfc3BlZWQoaW50IHNwZWVkKQoreworCWlmIChzcGVlZCA8PSAwKQorCQlzcGVlZCA9IGd1c19hdWRpb19zcGVlZDsKKworCWlmIChzcGVlZCA8IDQwMDApCisJCXNwZWVkID0gNDAwMDsKKworCWlmIChzcGVlZCA+IDQ0MTAwKQorCQlzcGVlZCA9IDQ0MTAwOworCisJZ3VzX2F1ZGlvX3NwZWVkID0gc3BlZWQ7CisKKwlpZiAob25seV9yZWFkX2FjY2VzcykKKwl7CisJCS8qIENvbXB1dGUgbmVhcmVzdCB2YWxpZCByZWNvcmRpbmcgc3BlZWQgIGFuZCByZXR1cm4gaXQgKi8KKworCQkvKiBzcGVlZCA9ICg5ODc4NDAwIC8gKGd1c19hdWRpb19zcGVlZCArIDIpKSAvIDE2OyAqLworCQlzcGVlZCA9ICgoKDk4Nzg0MDAgKyBndXNfYXVkaW9fc3BlZWQgLyAyKSAvIChndXNfYXVkaW9fc3BlZWQgKyAyKSkgKyA4KSAvIDE2OworCQlzcGVlZCA9ICg5ODc4NDAwIC8gKHNwZWVkICogMTYpKSAtIDI7CisJfQorCXJldHVybiBzcGVlZDsKK30KKworc3RhdGljIGludCBndXNfYXVkaW9fc2V0X2NoYW5uZWxzKGludCBjaGFubmVscykKK3sKKwlpZiAoIWNoYW5uZWxzKQorCQlyZXR1cm4gZ3VzX2F1ZGlvX2NoYW5uZWxzOworCWlmIChjaGFubmVscyA+IDIpCisJCWNoYW5uZWxzID0gMjsKKwlpZiAoY2hhbm5lbHMgPCAxKQorCQljaGFubmVscyA9IDE7CisJZ3VzX2F1ZGlvX2NoYW5uZWxzID0gY2hhbm5lbHM7CisJcmV0dXJuIGNoYW5uZWxzOworfQorCitzdGF0aWMgaW50IGd1c19hdWRpb19zZXRfYml0cyhpbnQgYml0cykKK3sKKwlpZiAoIWJpdHMpCisJCXJldHVybiBndXNfYXVkaW9fYml0czsKKworCWlmIChiaXRzICE9IDggJiYgYml0cyAhPSAxNikKKwkJYml0cyA9IDg7CisKKwlpZiAob25seV84X2JpdHMpCisJCWJpdHMgPSA4OworCisJZ3VzX2F1ZGlvX2JpdHMgPSBiaXRzOworCXJldHVybiBiaXRzOworfQorCitzdGF0aWMgaW50IGd1c19hdWRpb19pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWludCB2YWw7CisKKwlzd2l0Y2ggKGNtZCkgCisJeworCQljYXNlIFNPVU5EX1BDTV9XUklURV9SQVRFOgorCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl2YWwgPSBndXNfYXVkaW9fc2V0X3NwZWVkKHZhbCk7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCQl2YWwgPSBndXNfYXVkaW9fc3BlZWQ7CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJdmFsID0gZ3VzX2F1ZGlvX3NldF9jaGFubmVscyh2YWwgKyAxKSAtIDE7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX1BDTV9XUklURV9DSEFOTkVMUzoKKwkJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXZhbCA9IGd1c19hdWRpb19zZXRfY2hhbm5lbHModmFsKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCQl2YWwgPSBndXNfYXVkaW9fY2hhbm5lbHM7CisJCQlicmVhazsKKwkJCisJCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl2YWwgPSBndXNfYXVkaW9fc2V0X2JpdHModmFsKTsKKwkJCWJyZWFrOworCQkKKwkJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQkJdmFsID0gZ3VzX2F1ZGlvX2JpdHM7CisJCQlicmVhazsKKwkJCisJCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoJCS8qIE5PVCBQT1NTSUJMRSAqLworCQljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKwkJCXZhbCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZyk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19hdWRpb19yZXNldChpbnQgZGV2KQoreworCWlmIChyZWNvcmRpbmdfYWN0aXZlKQorCXsKKwkJZ3VzX3dyaXRlOCgweDQ5LCAweDAwKTsJLyogSGFsdCByZWNvcmRpbmcgKi8KKwkJc2V0X2lucHV0X3ZvbHVtZXMoKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2F2ZWRfaXdfbW9kZTsJLyogQSBoYWNrIGhhY2sgaGFjayAqLworCitzdGF0aWMgaW50IGd1c19hdWRpb19vcGVuKGludCBkZXYsIGludCBtb2RlKQoreworCWlmIChndXNfYnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmIChndXNfcG5wX2ZsYWcgJiYgbW9kZSAmIE9QRU5fUkVBRCkKKwl7CisvKgkJcHJpbnRrKEtFUk5fRVJSICJHVVM6IEF1ZGlvIGRldmljZSAjJWQgaXMgcGxheWJhY2sgb25seS5cbiIsIGRldik7Ki8KKwkJcmV0dXJuIC1FSU87CisJfQorCWd1c19pbml0aWFsaXplKCk7CisKKwlndXNfYnVzeSA9IDE7CisJYWN0aXZlX2RldmljZSA9IDA7CisKKwlzYXZlZF9pd19tb2RlID0gaXdfbW9kZTsKKwlpZiAoaXdfbW9kZSkKKwl7CisJCS8qIFRoZXJlIGFyZSBzb21lIHByb2JsZW1zIHdpdGggYXVkaW8gaW4gZW5oYW5jZWQgbW9kZSBzbyBkaXNhYmxlIGl0ICovCisJCWd1c193cml0ZTgoMHgxOSwgZ3VzX3JlYWQ4KDB4MTkpICYgfjB4MDEpOwkvKiBEaXNhYmxlIGVuaGFuY2VkIG1vZGUgKi8KKwkJaXdfbW9kZSA9IDA7CisJfQorCisJZ3VzX3Jlc2V0KCk7CisJcmVzZXRfc2FtcGxlX21lbW9yeSgpOworCWd1c19zZWxlY3RfbWF4X3ZvaWNlcygxNCk7CisKKwlwY21fYWN0aXZlID0gMDsKKwlkbWFfYWN0aXZlID0gMDsKKwlwY21fb3BlbmVkID0gMTsKKwlpZiAobW9kZSAmIE9QRU5fUkVBRCkKKwl7CisJCXJlY29yZGluZ19hY3RpdmUgPSAxOworCQlzZXRfaW5wdXRfdm9sdW1lcygpOworCX0KKwlvbmx5X3JlYWRfYWNjZXNzID0gIShtb2RlICYgT1BFTl9XUklURSk7CisJb25seV84X2JpdHMgPSBtb2RlICYgT1BFTl9SRUFEOworCWlmIChvbmx5XzhfYml0cykKKwkJYXVkaW9fZGV2c1tkZXZdLT5mb3JtYXRfbWFzayA9IEFGTVRfVTg7CisJZWxzZQorCQlhdWRpb19kZXZzW2Rldl0tPmZvcm1hdF9tYXNrID0gQUZNVF9VOCB8IEFGTVRfUzE2X0xFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19hdWRpb19jbG9zZShpbnQgZGV2KQoreworCWl3X21vZGUgPSBzYXZlZF9pd19tb2RlOworCWd1c19yZXNldCgpOworCWd1c19idXN5ID0gMDsKKwlwY21fb3BlbmVkID0gMDsKKwlhY3RpdmVfZGV2aWNlID0gMDsKKworCWlmIChyZWNvcmRpbmdfYWN0aXZlKQorCXsKKwkJZ3VzX3dyaXRlOCgweDQ5LCAweDAwKTsJLyogSGFsdCByZWNvcmRpbmcgKi8KKwkJc2V0X2lucHV0X3ZvbHVtZXMoKTsKKwl9CisJcmVjb3JkaW5nX2FjdGl2ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19hdWRpb191cGRhdGVfdm9sdW1lKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdm9pY2U7CisKKwlpZiAocGNtX2FjdGl2ZSAmJiBwY21fb3BlbmVkKQorCQlmb3IgKHZvaWNlID0gMDsgdm9pY2UgPCBndXNfYXVkaW9fY2hhbm5lbHM7IHZvaWNlKyspCisJCXsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJCQlndXNfc2VsZWN0X3ZvaWNlKHZvaWNlKTsKKwkJCWd1c19yYW1wb2ZmKCk7CisJCQlndXNfdm9pY2Vfdm9sdW1lKDE1MzAgKyAoMjUgKiBndXNfcGNtX3ZvbHVtZSkpOworCQkJZ3VzX3JhbXBfcmFuZ2UoNjUsIDE1MzAgKyAoMjUgKiBndXNfcGNtX3ZvbHVtZSkpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQl9Cit9CisKK3N0YXRpYyB2b2lkIHBsYXlfbmV4dF9wY21fYmxvY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBzcGVlZCA9IGd1c19hdWRpb19zcGVlZDsKKwlpbnQgdGhpc19vbmUsIGlzMTZiaXRzLCBjaG47CisJdW5zaWduZWQgbG9uZyBkcmFtX2xvYzsKKwl1bnNpZ25lZCBjaGFyIG1vZGVbMl0sIHJhbXBfbW9kZVsyXTsKKworCWlmICghcGNtX3FsZW4pCisJCXJldHVybjsKKworCXRoaXNfb25lID0gcGNtX2hlYWQ7CisKKwlmb3IgKGNobiA9IDA7IGNobiA8IGd1c19hdWRpb19jaGFubmVsczsgY2huKyspCisJeworCQltb2RlW2Nobl0gPSAweDAwOworCQlyYW1wX21vZGVbY2huXSA9IDB4MDM7CS8qIFJhbXBpbmcgYW5kIHJvbGxvdmVyIG9mZiAqLworCisJCWlmIChjaG4gPT0gMCkKKwkJeworCQkJbW9kZVtjaG5dIHw9IDB4MjA7CS8qIExvb3AgSVJRICovCisJCQl2b2ljZXNbY2huXS5sb29wX2lycV9tb2RlID0gTE1PREVfUENNOworCQl9CisJCWlmIChndXNfYXVkaW9fYml0cyAhPSA4KQorCQl7CisJCQlpczE2Yml0cyA9IDE7CisJCQltb2RlW2Nobl0gfD0gMHgwNDsJLyogMTYgYml0IGRhdGEgKi8KKwkJfQorCQllbHNlCisJCQlpczE2Yml0cyA9IDA7CisKKwkJZHJhbV9sb2MgPSB0aGlzX29uZSAqIHBjbV9ic2l6ZTsKKwkJZHJhbV9sb2MgKz0gY2huICogcGNtX2JhbmtzaXplOworCisJCWlmICh0aGlzX29uZSA9PSAocGNtX25ibGsgLSAxKSkJLyogTGFzdCBmcmFnbWVudCBvZiB0aGUgRFJBTSBidWZmZXIgKi8KKwkJeworCQkJbW9kZVtjaG5dIHw9IDB4MDg7CS8qIEVuYWJsZSBsb29wICovCisJCQlyYW1wX21vZGVbY2huXSA9IDB4MDM7CS8qIERpc2FibGUgcm9sbG92ZXIgYml0ICovCisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAoY2huID09IDApCisJCQkJcmFtcF9tb2RlW2Nobl0gPSAweDA0OwkvKiBFbmFibGUgcm9sbG92ZXIgYml0ICovCisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJZ3VzX3NlbGVjdF92b2ljZShjaG4pOworCQlndXNfdm9pY2VfZnJlcShzcGVlZCk7CisKKwkJaWYgKGd1c19hdWRpb19jaGFubmVscyA9PSAxKQorCQkJZ3VzX3ZvaWNlX2JhbGFuY2UoNyk7CQkvKiBtb25vICovCisJCWVsc2UgaWYgKGNobiA9PSAwKQorCQkJZ3VzX3ZvaWNlX2JhbGFuY2UoMCk7CQkvKiBsZWZ0ICovCisJCWVsc2UKKwkJCWd1c192b2ljZV9iYWxhbmNlKDE1KTsJCS8qIHJpZ2h0ICovCisKKwkJaWYgKCFwY21fYWN0aXZlKQkvKiBQbGF5YmFjayBub3QgYWxyZWFkeSBhY3RpdmUgKi8KKwkJeworCQkJLyoKKwkJCSAqIFRoZSBwbGF5YmFjayB3YXMgbm90IHN0YXJ0ZWQgeWV0IChvciB0aGVyZSBoYXMgYmVlbiBhIHBhdXNlKS4KKwkJCSAqIFN0YXJ0IHRoZSB2b2ljZSAoYWdhaW4pIGFuZCBhc2sgZm9yIGEgcm9sbG92ZXIgaXJxIGF0IHRoZSBlbmQgb2YKKwkJCSAqIHRoaXNfb25lIGJsb2NrLiBJZiB0aGlzX29uZSBvbmUgaXMgbGFzdCBvZiB0aGUgYnVmZmVycywgdXNlIGp1c3QKKwkJCSAqIHRoZSBub3JtYWwgbG9vcCB3aXRoIGlycS4KKwkJCSAqLworCisJCQlndXNfdm9pY2Vfb2ZmKCk7CisJCQlndXNfcmFtcG9mZigpOworCQkJZ3VzX3ZvaWNlX3ZvbHVtZSgxNTMwICsgKDI1ICogZ3VzX3BjbV92b2x1bWUpKTsKKwkJCWd1c19yYW1wX3JhbmdlKDY1LCAxNTMwICsgKDI1ICogZ3VzX3BjbV92b2x1bWUpKTsKKworCQkJZ3VzX3dyaXRlX2FkZHIoMHgwYSwgY2huICogcGNtX2JhbmtzaXplLCAwLCBpczE2Yml0cyk7CS8qIFN0YXJ0aW5nIHBvc2l0aW9uICovCisJCQlndXNfd3JpdGVfYWRkcigweDAyLCBjaG4gKiBwY21fYmFua3NpemUsIDAsIGlzMTZiaXRzKTsJLyogTG9vcCBzdGFydCAqLworCisJCQlpZiAoY2huICE9IDApCisJCQkJZ3VzX3dyaXRlX2FkZHIoMHgwNCwgcGNtX2JhbmtzaXplICsgKHBjbV9ic2l6ZSAqIHBjbV9uYmxrKSAtIDEsCisJCQkJCQkgICAwLCBpczE2Yml0cyk7CS8qIExvb3AgZW5kIGxvY2F0aW9uICovCisJCX0KKwkJaWYgKGNobiA9PSAwKQorCQkJZ3VzX3dyaXRlX2FkZHIoMHgwNCwgZHJhbV9sb2MgKyBwY21fYnNpemUgLSAxLAorCQkJCQkgMCwgaXMxNmJpdHMpOwkvKiBMb29wIGVuZCBsb2NhdGlvbiAqLworCQllbHNlCisJCQltb2RlW2Nobl0gfD0gMHgwODsJLyogRW5hYmxlIGxvb3BpbmcgKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCX0KKwlmb3IgKGNobiA9IDA7IGNobiA8IGd1c19hdWRpb19jaGFubmVsczsgY2huKyspCisJeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQlndXNfc2VsZWN0X3ZvaWNlKGNobik7CisJCWd1c193cml0ZTgoMHgwZCwgcmFtcF9tb2RlW2Nobl0pOworCQlpZiAoaXdfbW9kZSkKKwkJCWd1c193cml0ZTgoMHgxNSwgMHgwMCk7CS8qIFJlc2V0IHZvaWNlIGRlYWN0aXZhdGUgYml0IG9mIFNNU0kgKi8KKwkJZ3VzX3ZvaWNlX29uKG1vZGVbY2huXSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwl9CisJcGNtX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGd1c190cmFuc2Zlcl9vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsCisJCQkgIGludCB0b3RhbF9jb3VudCwgaW50IGludHJmbGFnLCBpbnQgY2huKQoreworCS8qCisJICogVGhpcyByb3V0aW5lIHRyYW5zZmVycyBvbmUgYmxvY2sgb2YgYXVkaW8gZGF0YSB0byB0aGUgRFJBTS4gSW4gbW9ubyBtb2RlCisJICogaXQncyBjYWxsZWQganVzdCBvbmNlLiBXaGVuIGluIHN0ZXJlbyBtb2RlLCB0aGlzX29uZSByb3V0aW5lIGlzIGNhbGxlZAorCSAqIG9uY2UgZm9yIGJvdGggY2hhbm5lbHMuCisJICoKKwkgKiBUaGUgbGVmdC9tb25vIGNoYW5uZWwgZGF0YSBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgYmVnaW5uaW5nIG9mIGRyYW0gYW5kIHRoZQorCSAqIHJpZ2h0IGRhdGEgdG8gdGhlIGFyZWEgcG9pbnRlZCBieSBndXNfcGFnZV9zaXplLgorCSAqLworCisJaW50IHRoaXNfb25lLCBjb3VudDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgZG1hX2NvbW1hbmQ7CisJdW5zaWduZWQgbG9uZyBhZGRyZXNzLCBob2xkX2FkZHJlc3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCisJY291bnQgPSB0b3RhbF9jb3VudCAvIGd1c19hdWRpb19jaGFubmVsczsKKworCWlmIChjaG4gPT0gMCkKKwl7CisJCWlmIChwY21fcWxlbiA+PSBwY21fbmJsaykKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdVUyBXYXJuaW5nOiBQQ00gYnVmZmVycyBvdXQgb2Ygc3luY1xuIik7CisKKwkJdGhpc19vbmUgPSBwY21fY3VycmVudF9ibG9jayA9IHBjbV90YWlsOworCQlwY21fcWxlbisrOworCQlwY21fdGFpbCA9IChwY21fdGFpbCArIDEpICUgcGNtX25ibGs7CisJCXBjbV9kYXRhc2l6ZVt0aGlzX29uZV0gPSBjb3VudDsKKwl9CisJZWxzZQorCQl0aGlzX29uZSA9IHBjbV9jdXJyZW50X2Jsb2NrOworCisJZ3VzX3dyaXRlOCgweDQxLCAwKTsJLyogRGlzYWJsZSBHRjEgRE1BICovCisJRE1BYnVmX3N0YXJ0X2RtYShkZXYsIGJ1ZiArIChjaG4gKiBjb3VudCksIGNvdW50LCBETUFfTU9ERV9XUklURSk7CisKKwlhZGRyZXNzID0gdGhpc19vbmUgKiBwY21fYnNpemU7CisJYWRkcmVzcyArPSBjaG4gKiBwY21fYmFua3NpemU7CisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID4gMykKKwl7CisJCWhvbGRfYWRkcmVzcyA9IGFkZHJlc3M7CisJCWFkZHJlc3MgPSBhZGRyZXNzID4+IDE7CisJCWFkZHJlc3MgJj0gMHgwMDAxZmZmZkw7CisJCWFkZHJlc3MgfD0gKGhvbGRfYWRkcmVzcyAmIDB4MDAwYzAwMDBMKTsKKwl9CisJZ3VzX3dyaXRlMTYoMHg0MiwgKGFkZHJlc3MgPj4gNCkgJiAweGZmZmYpOwkvKiBEUkFNIERNQSBhZGRyZXNzICovCisKKwlkbWFfY29tbWFuZCA9IDB4MjE7CS8qIElSUSBlbmFibGUsIERNQSBzdGFydCAqLworCisJaWYgKGd1c19hdWRpb19iaXRzICE9IDgpCisJCWRtYV9jb21tYW5kIHw9IDB4NDA7CS8qIDE2IGJpdCBfREFUQV8gKi8KKwllbHNlCisJCWRtYV9jb21tYW5kIHw9IDB4ODA7CS8qIEludmVydCBNU0IgKi8KKworCWlmIChhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPiAzKQorCQlkbWFfY29tbWFuZCB8PSAweDA0OwkvKiAxNiBiaXQgRE1BIGNoYW5uZWwgKi8KKworCWd1c193cml0ZTgoMHg0MSwgZG1hX2NvbW1hbmQpOwkvKiBLaWNrIHN0YXJ0ICovCisKKwlpZiAoY2huID09IChndXNfYXVkaW9fY2hhbm5lbHMgLSAxKSkJLyogTGFzdCBjaGFubmVsICovCisJeworCQkvKgorCQkgKiBMYXN0IChyaWdodCBvciBtb25vKSBjaGFubmVsIGRhdGEKKwkJICovCisJCWRtYV9hY3RpdmUgPSAxOwkvKiBETUEgc3RhcnRlZC4gVGhlcmUgaXMgYSB1bmFja25vd2xlZGdlZCBidWZmZXIgKi8KKwkJYWN0aXZlX2RldmljZSA9IEdVU19ERVZfUENNX0RPTkU7CisJCWlmICghcGNtX2FjdGl2ZSAmJiAocGNtX3FsZW4gPiAxIHx8IGNvdW50IDwgcGNtX2JzaXplKSkKKwkJeworCQkJcGxheV9uZXh0X3BjbV9ibG9jaygpOworCQl9CisJfQorCWVsc2UKKwl7CisJCS8qCisJCSAqIExlZnQgY2hhbm5lbCBkYXRhLiBUaGUgcmlnaHQgY2hhbm5lbAorCQkgKiBpcyB0cmFuc2ZlcnJlZCBhZnRlciBETUEgaW50ZXJydXB0CisJCSAqLworCQlhY3RpdmVfZGV2aWNlID0gR1VTX0RFVl9QQ01fQ09OVElOVUU7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBndXNfdW5pbnRlcmxlYXZlOChjaGFyICpidWYsIGludCBsKQoreworLyogVGhpcyByb3V0aW5lIHVuaW50ZXJsZWF2ZXMgOCBiaXQgc3RlcmVvIG91dHB1dCAoTFJMUkxSLT5MTExSUlIpICovCisJaW50IGksIHAgPSAwLCBoYWxmc2l6ZSA9IGwgLyAyOworCWNoYXIgKmJ1ZjIgPSBidWYgKyBoYWxmc2l6ZSwgKnNyYyA9IGJvdW5jZV9idWY7CisKKwltZW1jcHkoYm91bmNlX2J1ZiwgYnVmLCBsKTsKKworCWZvciAoaSA9IDA7IGkgPCBoYWxmc2l6ZTsgaSsrKQorCXsKKwkJYnVmW2ldID0gc3JjW3ArK107CS8qIExlZnQgY2hhbm5lbCAqLworCQlidWYyW2ldID0gc3JjW3ArK107CS8qIFJpZ2h0IGNoYW5uZWwgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGd1c191bmludGVybGVhdmUxNihzaG9ydCAqYnVmLCBpbnQgbCkKK3sKKy8qIFRoaXMgcm91dGluZSB1bmludGVybGVhdmVzIDE2IGJpdCBzdGVyZW8gb3V0cHV0IChMUkxSTFItPkxMTFJSUikgKi8KKwlpbnQgaSwgcCA9IDAsIGhhbGZzaXplID0gbCAvIDI7CisJc2hvcnQgKmJ1ZjIgPSBidWYgKyBoYWxmc2l6ZSwgKnNyYyA9IChzaG9ydCAqKSBib3VuY2VfYnVmOworCisJbWVtY3B5KGJvdW5jZV9idWYsIChjaGFyICopIGJ1ZiwgbCAqIDIpOworCisJZm9yIChpID0gMDsgaSA8IGhhbGZzaXplOyBpKyspCisJeworCQlidWZbaV0gPSBzcmNbcCsrXTsJLyogTGVmdCBjaGFubmVsICovCisJCWJ1ZjJbaV0gPSBzcmNbcCsrXTsJLyogUmlnaHQgY2hhbm5lbCAqLworCX0KK30KKworc3RhdGljIHZvaWQgZ3VzX2F1ZGlvX291dHB1dF9ibG9jayhpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IHRvdGFsX2NvdW50LAorCQkgICAgICAgaW50IGludHJmbGFnKQoreworCXN0cnVjdCBkbWFfYnVmZnBhcm1zICpkbWFwID0gYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dDsKKworCWRtYXAtPmZsYWdzIHw9IERNQV9OT0RNQSB8IERNQV9OT1RJTUVPVVQ7CisKKwlwY21fY3VycmVudF9idWYgPSBidWY7CisJcGNtX2N1cnJlbnRfY291bnQgPSB0b3RhbF9jb3VudDsKKwlwY21fY3VycmVudF9pbnRyZmxhZyA9IGludHJmbGFnOworCXBjbV9jdXJyZW50X2RldiA9IGRldjsKKwlpZiAoZ3VzX2F1ZGlvX2NoYW5uZWxzID09IDIpCisJeworCQljaGFyICpiID0gZG1hcC0+cmF3X2J1ZiArIChidWYgLSBkbWFwLT5yYXdfYnVmX3BoeXMpOworCisJCWlmIChndXNfYXVkaW9fYml0cyA9PSA4KQorCQkJZ3VzX3VuaW50ZXJsZWF2ZTgoYiwgdG90YWxfY291bnQpOworCQllbHNlCisJCQlndXNfdW5pbnRlcmxlYXZlMTYoKHNob3J0ICopIGIsIHRvdGFsX2NvdW50IC8gMik7CisJfQorCWd1c190cmFuc2Zlcl9vdXRwdXRfYmxvY2soZGV2LCBidWYsIHRvdGFsX2NvdW50LCBpbnRyZmxhZywgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGd1c19hdWRpb19zdGFydF9pbnB1dChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IGNvdW50LAorCQkgICAgICBpbnQgaW50cmZsYWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIG1vZGU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZ3VzX2xvY2ssZmxhZ3MpOworCisJRE1BYnVmX3N0YXJ0X2RtYShkZXYsIGJ1ZiwgY291bnQsIERNQV9NT0RFX1JFQUQpOworCW1vZGUgPSAweGEwOwkJLyogRE1BIElSUSBlbmFibGVkLCBpbnZlcnQgTVNCICovCisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEgPiAzKQorCQltb2RlIHw9IDB4MDQ7CS8qIDE2IGJpdCBETUEgY2hhbm5lbCAqLworCWlmIChndXNfYXVkaW9fY2hhbm5lbHMgPiAxKQorCQltb2RlIHw9IDB4MDI7CS8qIFN0ZXJlbyAqLworCW1vZGUgfD0gMHgwMTsJCS8qIERNQSBlbmFibGUgKi8KKworCWd1c193cml0ZTgoMHg0OSwgbW9kZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGd1c19hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJdW5zaWduZWQgaW50IHJhdGU7CisKKwlndXNfYXVkaW9fYnNpemUgPSBic2l6ZTsKKwlhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmZsYWdzIHw9IERNQV9OT0RNQTsKKwlyYXRlID0gKCgoOTg3ODQwMCArIGd1c19hdWRpb19zcGVlZCAvIDIpIC8gKGd1c19hdWRpb19zcGVlZCArIDIpKSArIDgpIC8gMTY7CisKKwlndXNfd3JpdGU4KDB4NDgsIHJhdGUgJiAweGZmKTsJLyogU2V0IHNhbXBsaW5nIHJhdGUgKi8KKworCWlmIChndXNfYXVkaW9fYml0cyAhPSA4KQorCXsKKy8qCQlwcmludGsoIkdVUyBFcnJvcjogMTYgYml0IHJlY29yZGluZyBub3Qgc3VwcG9ydGVkXG4iKTsqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3VzX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJaW50IGk7CisKKwlsb25nIG1lbV9wdHIsIG1lbV9zaXplOworCisJYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZmxhZ3MgfD0gRE1BX05PRE1BIHwgRE1BX05PVElNRU9VVDsKKwltZW1fcHRyID0gMDsKKwltZW1fc2l6ZSA9IGd1c19tZW1fc2l6ZSAvIGd1c19hdWRpb19jaGFubmVsczsKKworCWlmIChtZW1fc2l6ZSA+ICgyNTYgKiAxMDI0KSkKKwkJbWVtX3NpemUgPSAyNTYgKiAxMDI0OworCisJcGNtX2JzaXplID0gYnNpemUgLyBndXNfYXVkaW9fY2hhbm5lbHM7CisJcGNtX2hlYWQgPSBwY21fdGFpbCA9IHBjbV9xbGVuID0gMDsKKworCXBjbV9uYmxrID0gMjsJCS8qIE1BWF9QQ01fQlVGRkVSUzsgKi8KKwlpZiAoKHBjbV9ic2l6ZSAqIHBjbV9uYmxrKSA+IG1lbV9zaXplKQorCQlwY21fbmJsayA9IG1lbV9zaXplIC8gcGNtX2JzaXplOworCisJZm9yIChpID0gMDsgaSA8IHBjbV9uYmxrOyBpKyspCisJCXBjbV9kYXRhc2l6ZVtpXSA9IDA7CisKKwlwY21fYmFua3NpemUgPSBwY21fbmJsayAqIHBjbV9ic2l6ZTsKKworCWlmIChndXNfYXVkaW9fYml0cyAhPSA4ICYmIHBjbV9iYW5rc2l6ZSA9PSAoMjU2ICogMTAyNCkpCisJCXBjbV9uYmxrLS07CisJZ3VzX3dyaXRlOCgweDQxLCAwKTsJLyogRGlzYWJsZSBHRjEgRE1BICovCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3VzX2xvY2FsX3FsZW4oaW50IGRldikKK3sKKwlyZXR1cm4gcGNtX3FsZW47Cit9CisKKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgZ3VzX2F1ZGlvX2RyaXZlciA9Cit7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gZ3VzX2F1ZGlvX29wZW4sCisJLmNsb3NlCQkJPSBndXNfYXVkaW9fY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBndXNfYXVkaW9fb3V0cHV0X2Jsb2NrLAorCS5zdGFydF9pbnB1dAkJPSBndXNfYXVkaW9fc3RhcnRfaW5wdXQsCisJLmlvY3RsCQkJPSBndXNfYXVkaW9faW9jdGwsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gZ3VzX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBndXNfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0LAorCS5oYWx0X2lvCQk9IGd1c19hdWRpb19yZXNldCwKKwkubG9jYWxfcWxlbgkJPSBndXNfbG9jYWxfcWxlbiwKK307CisKK3N0YXRpYyB2b2lkIGd1c3dhdmVfc2V0dXBfdm9pY2UoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgY2huKQoreworCXN0cnVjdCBjaGFubmVsX2luZm8gKmluZm8gPSAmc3ludGhfZGV2c1tkZXZdLT5jaG5faW5mb1tjaG5dOworCisJZ3Vzd2F2ZV9zZXRfaW5zdHIoZGV2LCB2b2ljZSwgaW5mby0+cGdtX251bSk7CisJdm9pY2VzW3ZvaWNlXS5leHByZXNzaW9uX3ZvbCA9IGluZm8tPmNvbnRyb2xsZXJzW0NUTF9FWFBSRVNTSU9OXTsJLyogSnVzdCBNU0IgKi8KKwl2b2ljZXNbdm9pY2VdLm1haW5fdm9sID0gKGluZm8tPmNvbnRyb2xsZXJzW0NUTF9NQUlOX1ZPTFVNRV0gKiAxMDApIC8gKHVuc2lnbmVkKSAxMjg7CisJdm9pY2VzW3ZvaWNlXS5wYW5uaW5nID0gKGluZm8tPmNvbnRyb2xsZXJzW0NUTF9QQU5dICogMikgLSAxMjg7CisJdm9pY2VzW3ZvaWNlXS5iZW5kZXIgPSAwOworCXZvaWNlc1t2b2ljZV0uYmVuZGVyX3JhbmdlID0gaW5mby0+YmVuZGVyX3JhbmdlOworCisJaWYgKGNobiA9PSA5KQorCQl2b2ljZXNbdm9pY2VdLmZpeGVkX3BpdGNoID0gMTsKK30KKworc3RhdGljIHZvaWQgZ3Vzd2F2ZV9iZW5kZXIoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgdmFsdWUpCit7CisJaW50IGZyZXE7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJdm9pY2VzW3ZvaWNlXS5iZW5kZXIgPSB2YWx1ZSAtIDgxOTI7CisJZnJlcSA9IGNvbXB1dGVfZmluZXR1bmUodm9pY2VzW3ZvaWNlXS5vcmlnX2ZyZXEsIHZhbHVlIC0gODE5Miwgdm9pY2VzW3ZvaWNlXS5iZW5kZXJfcmFuZ2UsIDApOworCXZvaWNlc1t2b2ljZV0uY3VycmVudF9mcmVxID0gZnJlcTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJZ3VzX3NlbGVjdF92b2ljZSh2b2ljZSk7CisJZ3VzX3ZvaWNlX2ZyZXEoZnJlcSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGd1c3dhdmVfYWxsb2MoaW50IGRldiwgaW50IGNobiwgaW50IG5vdGUsIHN0cnVjdCB2b2ljZV9hbGxvY19pbmZvICphbGxvYykKK3sKKwlpbnQgaSwgcCwgYmVzdCA9IC0xLCBiZXN0X3RpbWUgPSAweDdmZmZmZmZmOworCisJcCA9IGFsbG9jLT5wdHI7CisJLyoKKwkgKiBGaXJzdCBsb29rIGZvciBhIGNvbXBsZXRlbHkgc3RvcHBlZCB2b2ljZQorCSAqLworCisJZm9yIChpID0gMDsgaSA8IGFsbG9jLT5tYXhfdm9pY2U7IGkrKykKKwl7CisJCWlmIChhbGxvYy0+bWFwW3BdID09IDApCisJCXsKKwkJCWFsbG9jLT5wdHIgPSBwOworCQkJcmV0dXJuIHA7CisJCX0KKwkJaWYgKGFsbG9jLT5hbGxvY190aW1lc1twXSA8IGJlc3RfdGltZSkKKwkJeworCQkJYmVzdCA9IHA7CisJCQliZXN0X3RpbWUgPSBhbGxvYy0+YWxsb2NfdGltZXNbcF07CisJCX0KKwkJcCA9IChwICsgMSkgJSBhbGxvYy0+bWF4X3ZvaWNlOworCX0KKworCS8qCisJICogVGhlbiBsb29rIGZvciBhIHJlbGVhc2luZyB2b2ljZQorCSAqLworCisJZm9yIChpID0gMDsgaSA8IGFsbG9jLT5tYXhfdm9pY2U7IGkrKykKKwl7CisJCWlmIChhbGxvYy0+bWFwW3BdID09IDB4ZmZmZikKKwkJeworCQkJYWxsb2MtPnB0ciA9IHA7CisJCQlyZXR1cm4gcDsKKwkJfQorCQlwID0gKHAgKyAxKSAlIGFsbG9jLT5tYXhfdm9pY2U7CisJfQorCWlmIChiZXN0ID49IDApCisJCXAgPSBiZXN0OworCisJYWxsb2MtPnB0ciA9IHA7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyBndXN3YXZlX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaWQJCT0gIkdVUyIsCisJLmluZm8JCT0gJmd1c19pbmZvLAorCS5taWRpX2Rldgk9IDAsCisJLnN5bnRoX3R5cGUJPSBTWU5USF9UWVBFX1NBTVBMRSwKKwkuc3ludGhfc3VidHlwZQk9IFNBTVBMRV9UWVBFX0dVUywKKwkub3BlbgkJPSBndXN3YXZlX29wZW4sCisJLmNsb3NlCQk9IGd1c3dhdmVfY2xvc2UsCisJLmlvY3RsCQk9IGd1c3dhdmVfaW9jdGwsCisJLmtpbGxfbm90ZQk9IGd1c3dhdmVfa2lsbF9ub3RlLAorCS5zdGFydF9ub3RlCT0gZ3Vzd2F2ZV9zdGFydF9ub3RlLAorCS5zZXRfaW5zdHIJPSBndXN3YXZlX3NldF9pbnN0ciwKKwkucmVzZXQJCT0gZ3Vzd2F2ZV9yZXNldCwKKwkuaHdfY29udHJvbAk9IGd1c3dhdmVfaHdfY29udHJvbCwKKwkubG9hZF9wYXRjaAk9IGd1c3dhdmVfbG9hZF9wYXRjaCwKKwkuYWZ0ZXJ0b3VjaAk9IGd1c3dhdmVfYWZ0ZXJ0b3VjaCwKKwkuY29udHJvbGxlcgk9IGd1c3dhdmVfY29udHJvbGxlciwKKwkucGFubmluZwk9IGd1c3dhdmVfcGFubmluZywKKwkudm9sdW1lX21ldGhvZAk9IGd1c3dhdmVfdm9sdW1lX21ldGhvZCwKKwkuYmVuZGVyCQk9IGd1c3dhdmVfYmVuZGVyLAorCS5hbGxvY192b2ljZQk9IGd1c3dhdmVfYWxsb2MsCisJLnNldHVwX3ZvaWNlCT0gZ3Vzd2F2ZV9zZXR1cF92b2ljZQorfTsKKworc3RhdGljIHZvaWQgc2V0X2lucHV0X3ZvbHVtZXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgbWFzayA9IDB4ZmYgJiB+MHgwNjsJLyogSnVzdCBsaW5lIG91dCBlbmFibGVkICovCisKKwlpZiAoaGF2ZV9ndXNfbWF4KQkvKiBEb24ndCBkaXN0dXJiIEdVUyBNQVggKi8KKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKworCS8qCisJICogICAgRW5hYmxlIGNoYW5uZWxzIGhhdmluZyB2b2wgPiAxMCUKKwkgKiAgICAgIE5vdGUhIGJpdCAweDAxIG1lYW5zIHRoZSBsaW5lIGluIERJU0FCTEVEIHdoaWxlIDB4MDQgbWVhbnMKKwkgKiAgICAgICAgICAgIHRoZSBtaWMgaW4gRU5BQkxFRC4KKwkgKi8KKwlpZiAoZ3VzX2xpbmVfdm9sID4gMTApCisJCW1hc2sgJj0gfjB4MDE7CisJaWYgKGd1c19taWNfdm9sID4gMTApCisJCW1hc2sgfD0gMHgwNDsKKworCWlmIChyZWNvcmRpbmdfYWN0aXZlKQorCXsKKwkJLyoKKwkJICogICAgRGlzYWJsZSBjaGFubmVsLCBpZiBub3Qgc2VsZWN0ZWQgZm9yIHJlY29yZGluZworCQkgKi8KKwkJaWYgKCEoZ3VzX3JlY21hc2sgJiBTT1VORF9NQVNLX0xJTkUpKQorCQkJbWFzayB8PSAweDAxOworCQlpZiAoIShndXNfcmVjbWFzayAmIFNPVU5EX01BU0tfTUlDKSkKKwkJCW1hc2sgJj0gfjB4MDQ7CisJfQorCW1peF9pbWFnZSAmPSB+MHgwNzsKKwltaXhfaW1hZ2UgfD0gbWFzayAmIDB4MDc7CisJb3V0YigobWl4X2ltYWdlKSwgdV9NaXhlcik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7Cit9CisKKyNkZWZpbmUgTUlYX0RFVlMJKFNPVU5EX01BU0tfTUlDfFNPVU5EX01BU0tfTElORXwgXAorCQkJIFNPVU5EX01BU0tfU1lOVEh8U09VTkRfTUFTS19QQ00pCisKK2ludCBndXNfZGVmYXVsdF9taXhlcl9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWludCB2b2wsIHZhbDsKKworCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpICE9ICdNJykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGFyZywgc2l6ZW9mKGludCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChfU0lPQ19ESVIoY21kKSAmIF9TSU9DX1dSSVRFKSAKKwl7CisJCWlmIChfX2dldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXN3aXRjaCAoY21kICYgMHhmZikgCisJCXsKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCWd1c19yZWNtYXNrID0gdmFsICYgTUlYX0RFVlM7CisJCQkJaWYgKCEoZ3VzX3JlY21hc2sgJiAoU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0xJTkUpKSkKKwkJCQkJZ3VzX3JlY21hc2sgPSBTT1VORF9NQVNLX01JQzsKKwkJCQkvKiBOb3RlISBJbnB1dCB2b2x1bWVzIGFyZSB1cGRhdGVkIGR1cmluZyBuZXh0IG9wZW4gZm9yIHJlY29yZGluZyAqLworCQkJCXZhbCA9IGd1c19yZWNtYXNrOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX01JQzoKKwkJCQl2b2wgPSB2YWwgJiAweGZmOworCQkJCWlmICh2b2wgPCAwKQorCQkJCQl2b2wgPSAwOworCQkJCWlmICh2b2wgPiAxMDApCisJCQkJCXZvbCA9IDEwMDsKKwkJCQlndXNfbWljX3ZvbCA9IHZvbDsKKwkJCQlzZXRfaW5wdXRfdm9sdW1lcygpOworCQkJCXZhbCA9IHZvbCB8ICh2b2wgPDwgOCk7CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFNPVU5EX01JWEVSX0xJTkU6CisJCQkJdm9sID0gdmFsICYgMHhmZjsKKwkJCQlpZiAodm9sIDwgMCkKKwkJCQkJdm9sID0gMDsKKwkJCQlpZiAodm9sID4gMTAwKQorCQkJCQl2b2wgPSAxMDA7CisJCQkJZ3VzX2xpbmVfdm9sID0gdm9sOworCQkJCXNldF9pbnB1dF92b2x1bWVzKCk7CisJCQkJdmFsID0gdm9sIHwgKHZvbCA8PCA4KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9QQ006CisJCQkJZ3VzX3BjbV92b2x1bWUgPSB2YWwgJiAweGZmOworCQkJCWlmIChndXNfcGNtX3ZvbHVtZSA8IDApCisJCQkJCWd1c19wY21fdm9sdW1lID0gMDsKKwkJCQlpZiAoZ3VzX3BjbV92b2x1bWUgPiAxMDApCisJCQkJCWd1c19wY21fdm9sdW1lID0gMTAwOworCQkJCWd1c19hdWRpb191cGRhdGVfdm9sdW1lKCk7CisJCQkJdmFsID0gZ3VzX3BjbV92b2x1bWUgfCAoZ3VzX3BjbV92b2x1bWUgPDwgOCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1lOVEg6CisJCQkJZ3VzX3dhdmVfdm9sdW1lID0gdmFsICYgMHhmZjsKKwkJCQlpZiAoZ3VzX3dhdmVfdm9sdW1lIDwgMCkKKwkJCQkJZ3VzX3dhdmVfdm9sdW1lID0gMDsKKwkJCQlpZiAoZ3VzX3dhdmVfdm9sdW1lID4gMTAwKQorCQkJCQlndXNfd2F2ZV92b2x1bWUgPSAxMDA7CisJCQkJaWYgKGFjdGl2ZV9kZXZpY2UgPT0gR1VTX0RFVl9XQVZFKSAKKwkJCQl7CisJCQkJCWludCB2b2ljZTsKKwkJCQkJZm9yICh2b2ljZSA9IDA7IHZvaWNlIDwgbnJfdm9pY2VzOyB2b2ljZSsrKQorCQkJCQlkeW5hbWljX3ZvbHVtZV9jaGFuZ2Uodm9pY2UpOwkvKiBBcHBseSB0aGUgbmV3IHZvbCAqLworCQkJCX0KKwkJCQl2YWwgPSBndXNfd2F2ZV92b2x1bWUgfCAoZ3VzX3dhdmVfdm9sdW1lIDw8IDgpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCWVsc2UKKwl7CisJCXN3aXRjaCAoY21kICYgMHhmZikgCisJCXsKKwkJCS8qCisJCQkgKiBSZXR1cm4gcGFyYW1ldGVycworCQkJICovCisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQl2YWwgPSBndXNfcmVjbWFzazsKKwkJCQlicmVhazsKKwkJCQkJCisJCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCQkJdmFsID0gTUlYX0RFVlM7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoKKwkJCQl2YWwgPSAwOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQkJdmFsID0gU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0xJTkU7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCQl2YWwgPSAwOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX01JQzoKKwkJCQl2YWwgPSBndXNfbWljX3ZvbCB8IChndXNfbWljX3ZvbCA8PCA4KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9MSU5FOgorCQkJCXZhbCA9IGd1c19saW5lX3ZvbCB8IChndXNfbGluZV92b2wgPDwgOCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfUENNOgorCQkJCXZhbCA9IGd1c19wY21fdm9sdW1lIHwgKGd1c19wY21fdm9sdW1lIDw8IDgpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQkJCXZhbCA9IGd1c193YXZlX3ZvbHVtZSB8IChndXNfd2F2ZV92b2x1bWUgPDwgOCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisJcmV0dXJuIF9fcHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBndXNfbWl4ZXJfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmlkCT0gIkdVUyIsCisJLm5hbWUJPSAiR3JhdmlzIFVsdHJhc291bmQiLAorCS5pb2N0bAk9IGd1c19kZWZhdWx0X21peGVyX2lvY3RsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBndXNfZGVmYXVsdF9taXhlcl9pbml0KHZvaWQpCit7CisJaW50IG47CisKKwlpZiAoKG4gPSBzb3VuZF9hbGxvY19taXhlcmRldigpKSAhPSAtMSkKKwl7CQorCQkvKgorCQkgKiBEb24ndCBpbnN0YWxsIGlmIHRoZXJlIGlzIGFub3RoZXIKKwkJICogbWl4ZXIKKwkJICovCisJCW1peGVyX2RldnNbbl0gPSAmZ3VzX21peGVyX29wZXJhdGlvbnM7CisJfQorCWlmIChoYXZlX2d1c19tYXgpCisJeworCQkvKgorCQkgKiAgRW5hYmxlIGFsbCBtaXhlciBjaGFubmVscyBvbiB0aGUgR0YxIHNpZGUuIE90aGVyd2lzZSByZWNvcmRpbmcgd2lsbAorCQkgKiAgbm90IGJlIHBvc3NpYmxlIHVzaW5nIEdVUyBNQVguCisJCSAqLworCQltaXhfaW1hZ2UgJj0gfjB4MDc7CisJCW1peF9pbWFnZSB8PSAweDA0OwkvKiBBbGwgY2hhbm5lbHMgZW5hYmxlZCAqLworCQlvdXRiKChtaXhfaW1hZ2UpLCB1X01peGVyKTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3ZvaWQgX19pbml0IGd1c193YXZlX2luaXQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB2YWw7CisJY2hhciAqbW9kZWxfbnVtID0gIjIuNCI7CisJY2hhciB0bXBbNjRdOworCWludCBndXNfdHlwZSA9IDB4MjQ7CS8qIDIuNCAqLworCisJaW50IGlycSA9IGh3X2NvbmZpZy0+aXJxLCBkbWEgPSBod19jb25maWctPmRtYSwgZG1hMiA9IGh3X2NvbmZpZy0+ZG1hMjsKKwlpbnQgc2RldjsKKworCWh3X2NvbmZpZy0+c2xvdHNbMF0gPSAtMTsJLyogTm8gd2F2ZSAqLworCWh3X2NvbmZpZy0+c2xvdHNbMV0gPSAtMTsJLyogTm8gYWQxODQ4ICovCisJaHdfY29uZmlnLT5zbG90c1s0XSA9IC0xOwkvKiBObyBhdWRpbyAqLworCWh3X2NvbmZpZy0+c2xvdHNbNV0gPSAtMTsJLyogTm8gbWl4ZXIgKi8KKworCWlmICghZ3VzX3BucF9mbGFnKQorCXsKKwkJaWYgKGlycSA8IDAgfHwgaXJxID4gMTUpCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1IhIEludmFsaWQgSVJRIyVkLiBHVVMgRGlzYWJsZWQiLCBpcnEpOworCQkJcmV0dXJuOworCQl9CisJfQorCQorCWlmIChkbWEgPCAwIHx8IGRtYSA+IDcgfHwgZG1hID09IDQpCisJeworCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SISBJbnZhbGlkIERNQSMlZC4gR1VTIERpc2FibGVkIiwgZG1hKTsKKwkJcmV0dXJuOworCX0KKwlndXNfaXJxID0gaXJxOworCWd1c19kbWEgPSBkbWE7CisJZ3VzX2RtYTIgPSBkbWEyOworCWd1c19od19jb25maWcgPSBod19jb25maWc7CisKKwlpZiAoZ3VzX2RtYTIgPT0gLTEpCisJCWd1c19kbWEyID0gZG1hOworCisJLyoKKwkgKiBUcnkgdG8gaWRlbnRpZnkgdGhlIEdVUyBtb2RlbC4KKwkgKgorCSAqICBWZXJzaW9ucyA8IDMuNiBkb24ndCBoYXZlIHRoZSBkaWdpdGFsIEFTSUMuIFRyeSB0byBwcm9iZSBpdCBmaXJzdC4KKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jayxmbGFncyk7CisJb3V0YigoMHgyMCksIGd1c19iYXNlICsgMHgwZik7CisJdmFsID0gaW5iKGd1c19iYXNlICsgMHgwZik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCisJaWYgKGd1c19wbnBfZmxhZyB8fCAodmFsICE9IDB4ZmYgJiYgKHZhbCAmIDB4MDYpKSkJLyogU2hvdWxkIGJlIDB4MDI/PyAqLworCXsKKwkJaW50ICAgICAgICAgICAgIGFkX2ZsYWdzID0gMDsKKworCQlpZiAoZ3VzX3BucF9mbGFnKQorCQkJYWRfZmxhZ3MgPSAweDEyMzQ1Njc4OwkvKiBJbnRlcndhdmUgIm1hZ2ljIiAqLworCQkvKgorCQkgKiBJdCBoYXMgdGhlIGRpZ2l0YWwgQVNJQyBzbyB0aGUgY2FyZCBpcyBhdCBsZWFzdCB2My40LgorCQkgKiBOZXh0IHRyeSB0byBkZXRlY3QgdGhlIHRydWUgbW9kZWwuCisJCSAqLworCisJCWlmIChndXNfcG5wX2ZsYWcpCS8qIEhhY2sgaGFjayBoYWNrICovCisJCQl2YWwgPSAxMDsKKwkJZWxzZQorCQkJdmFsID0gaW5iKHVfTWl4U2VsZWN0KTsKKworCQkvKgorCQkgKiBWYWx1ZSAyNTUgbWVhbnMgcHJlLTMuNyB3aGljaCBkb24ndCBoYXZlIG1peGVyLgorCQkgKiBWYWx1ZXMgNSB0aHJ1IDkgbWVhbiB2My43IHdoaWNoIGhhcyBhIElDUzIxMDEgbWl4ZXIuCisJCSAqIDEwIGFuZCBhYm92ZSBpcyBHVVMgTUFYIHdoaWNoIGhhcyB0aGUgQ1M0MjMxIGNvZGVjL21peGVyLgorCQkgKgorCQkgKi8KKworCQlpZiAodmFsID09IDI1NSB8fCB2YWwgPCA1KQorCQl7CisJCQltb2RlbF9udW0gPSAiMy40IjsKKwkJCWd1c190eXBlID0gMHgzNDsKKwkJfQorCQllbHNlIGlmICh2YWwgPCAxMCkKKwkJeworCQkJbW9kZWxfbnVtID0gIjMuNyI7CisJCQlndXNfdHlwZSA9IDB4Mzc7CisJCQltaXhlcl90eXBlID0gSUNTMjEwMTsKKwkJCXJlcXVlc3RfcmVnaW9uKHVfTWl4U2VsZWN0LCAxLCAiR1VTIG1peGVyIik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCQkJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihndXNfYmFzZSArIDB4MTBjLCA0LCAiYWQxODQ4Iik7CisJCQltb2RlbF9udW0gPSAiTUFYIjsKKwkJCWd1c190eXBlID0gMHg0MDsKKwkJCW1peGVyX3R5cGUgPSBDUzQyMzE7CisjaWZkZWYgQ09ORklHX1NPVU5EX0dVU01BWAorCQkJeworCQkJCXVuc2lnbmVkIGNoYXIgICBtYXhfY29uZmlnID0gMHg0MDsJLyogQ29kZWMgZW5hYmxlICovCisKKwkJCQlpZiAoZ3VzX2RtYTIgPT0gLTEpCisJCQkJCWd1c19kbWEyID0gZ3VzX2RtYTsKKworCQkJCWlmIChndXNfZG1hID4gMykKKwkJCQkJbWF4X2NvbmZpZyB8PSAweDEwOwkJLyogMTYgYml0IGNhcHR1cmUgRE1BICovCisKKwkJCQlpZiAoZ3VzX2RtYTIgPiAzKQorCQkJCQltYXhfY29uZmlnIHw9IDB4MjA7CQkvKiAxNiBiaXQgcGxheWJhY2sgRE1BICovCisKKwkJCQltYXhfY29uZmlnIHw9IChndXNfYmFzZSA+PiA0KSAmIDB4MGY7CS8qIEV4dHJhY3QgdGhlIFggZnJvbSAyWDAgKi8KKworCQkJCW91dGIoKG1heF9jb25maWcpLCBndXNfYmFzZSArIDB4MTA2KTsJLyogVWx0cmFNYXggY29udHJvbCAqLworCQkJfQorCisJCQlpZiAoIXBvcnRzKQorCQkJCWdvdG8gbm9fY3M0MjMxOworCisJCQlpZiAoYWQxODQ4X2RldGVjdChwb3J0cywgJmFkX2ZsYWdzLCBod19jb25maWctPm9zcCkpCisJCQl7CisJCQkJY2hhciAgICAgICAgICAgKm5hbWUgPSAiR1VTIE1BWCI7CisJCQkJaW50ICAgICAgICAgICAgIG9sZF9udW1fbWl4ZXJzID0gbnVtX21peGVyczsKKworCQkJCWlmIChndXNfcG5wX2ZsYWcpCisJCQkJCW5hbWUgPSAiR1VTIFBuUCI7CisKKwkJCQlndXNfbWljX3ZvbCA9IGd1c19saW5lX3ZvbCA9IGd1c19wY21fdm9sdW1lID0gMTAwOworCQkJCWd1c193YXZlX3ZvbHVtZSA9IDkwOworCQkJCWhhdmVfZ3VzX21heCA9IDE7CisJCQkJaWYgKGh3X2NvbmZpZy0+bmFtZSkKKwkJCQkJbmFtZSA9IGh3X2NvbmZpZy0+bmFtZTsKKworCQkJCWh3X2NvbmZpZy0+c2xvdHNbMV0gPSBhZDE4NDhfaW5pdChuYW1lLCBwb3J0cywKKwkJCQkJCQktaXJxLCBndXNfZG1hMiwJLyogUGxheWJhY2sgRE1BICovCisJCQkJCQkJZ3VzX2RtYSwJLyogQ2FwdHVyZSBETUEgKi8KKwkJCQkJCQkxLAkJLyogU2hhcmUgRE1BIGNoYW5uZWxzIHdpdGggR0YxICovCisJCQkJCQkJaHdfY29uZmlnLT5vc3AsCisJCQkJCQkJVEhJU19NT0RVTEUpOworCisJCQkJaWYgKG51bV9taXhlcnMgPiBvbGRfbnVtX21peGVycykKKwkJCQl7CisJCQkJCS8qIEdVUyBoYXMgaXQncyBvd24gbWl4ZXIgbWFwICovCisJCQkJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUxLCBTT1VORF9NSVhFUl9TWU5USCk7CisJCQkJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUyLCBTT1VORF9NSVhFUl9DRCk7CisJCQkJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUzLCBTT1VORF9NSVhFUl9MSU5FKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIHsKKwkJCQlyZWxlYXNlX3JlZ2lvbihndXNfYmFzZSArIDB4MTBjLCA0KTsKKwkJCW5vX2NzNDIzMToKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJHVVM6IE5vIENTNDIzMSA/PyIpOworCQkJfQorI2Vsc2UKKwkJCXByaW50ayhLRVJOX0VSUiAiR1VTIE1BWCBmb3VuZCwgYnV0IG5vdCBjb21waWxlZCBpblxuIik7CisjZW5kaWYKKwkJfQorCX0KKwllbHNlCisJeworCQkvKgorCQkgKiBBU0lDIG5vdCBkZXRlY3RlZCBzbyB0aGUgY2FyZCBtdXN0IGJlIDIuMiBvciAyLjQuCisJCSAqIFRoZXJlIGNvdWxkIHN0aWxsIGJlIHRoZSAxNi1iaXQvbWl4ZXIgZGF1Z2h0ZXIgY2FyZC4KKwkJICovCisJfQorCisJaWYgKGh3X2NvbmZpZy0+bmFtZSkKKwkJc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIiVzICglZGspIiwgaHdfY29uZmlnLT5uYW1lLAorCQkJIChpbnQpIGd1c19tZW1fc2l6ZSAvIDEwMjQpOworCWVsc2UgaWYgKGd1c19wbnBfZmxhZykKKwkJc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIkdyYXZpcyBVbHRyYVNvdW5kIFBuUCAoJWRrKSIsCisJCQkgKGludCkgZ3VzX21lbV9zaXplIC8gMTAyNCk7CisJZWxzZQorCQlzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiR3JhdmlzIFVsdHJhU291bmQgJXMgKCVkaykiLCBtb2RlbF9udW0sCisJCQkgKGludCkgZ3VzX21lbV9zaXplIC8gMTAyNCk7CisKKworCXNhbXBsZXMgPSAoc3RydWN0IHBhdGNoX2luZm8gKil2bWFsbG9jKChNQVhfU0FNUExFICsgMSkgKiBzaXplb2YoKnNhbXBsZXMpKTsKKwlpZiAoc2FtcGxlcyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiZ3VzX2luaXQ6IENhbnQgYWxsb2NhdGUgbWVtb3J5IGZvciBpbnN0cnVtZW50IHRhYmxlc1xuIik7CisJCXJldHVybjsKKwl9CisJY29uZl9wcmludGYodG1wLCBod19jb25maWcpOworCXN0cmxjcHkoZ3VzX2luZm8ubmFtZSwgdG1wLCBzaXplb2YoZ3VzX2luZm8ubmFtZSkpOworCisJaWYgKChzZGV2ID0gc291bmRfYWxsb2Nfc3ludGhkZXYoKSkgPT0gLTEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgImd1c19pbml0OiBUb28gbWFueSBzeW50aGVzaXplcnNcbiIpOworCWVsc2UKKwl7CisJCXZvaWNlX2FsbG9jID0gJmd1c3dhdmVfb3BlcmF0aW9ucy5hbGxvYzsKKwkJaWYgKGl3X21vZGUpCisJCQlndXN3YXZlX29wZXJhdGlvbnMuaWQgPSAiSVdBVkUiOworCQlod19jb25maWctPnNsb3RzWzBdID0gc2RldjsKKwkJc3ludGhfZGV2c1tzZGV2XSA9ICZndXN3YXZlX29wZXJhdGlvbnM7CisJCXNlcXVlbmNlcl9pbml0KCk7CisJCWd1c190bXJfaW5zdGFsbChndXNfYmFzZSArIDgpOworCX0KKworCXJlc2V0X3NhbXBsZV9tZW1vcnkoKTsKKworCWd1c19pbml0aWFsaXplKCk7CisJCisJaWYgKChndXNfbWVtX3NpemUgPiAwKSAmJiAhZ3VzX25vX3dhdmVfZG1hKQorCXsKKwkJaHdfY29uZmlnLT5zbG90c1s0XSA9IC0xOworCQlpZiAoKGd1c19kZXZudW0gPSBzb3VuZF9pbnN0YWxsX2F1ZGlvZHJ2KEFVRElPX0RSSVZFUl9WRVJTSU9OLAorCQkJCQkiVWx0cmFzb3VuZCIsCisJCQkJCSZndXNfYXVkaW9fZHJpdmVyLAorCQkJCQlzaXplb2Yoc3RydWN0IGF1ZGlvX2RyaXZlciksCisJCQkJCU5FRURTX1JFU1RBUlQgfAorCQkgICAgICAgICAgICAgICAgICAgCSgoIWl3X21vZGUgJiYgZG1hMiAhPSBkbWEgJiYgZG1hMiAhPSAtMSkgPworCQkJCQkJRE1BX0RVUExFWCA6IDApLAorCQkJCQlBRk1UX1U4IHwgQUZNVF9TMTZfTEUsCisJCQkJCU5VTEwsIGRtYSwgZG1hMikpIDwgMCkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJaHdfY29uZmlnLT5zbG90c1s0XSA9IGd1c19kZXZudW07CisJCWF1ZGlvX2RldnNbZ3VzX2Rldm51bV0tPm1pbl9mcmFnbWVudCA9IDk7CS8qIDUxMmsgKi8KKwkJYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+bWF4X2ZyYWdtZW50ID0gMTE7CS8qIDhrIChtdXN0IG1hdGNoIHNpemUgb2YgYm91bmNlX2J1ZiAqLworCQlhdWRpb19kZXZzW2d1c19kZXZudW1dLT5taXhlcl9kZXYgPSAtMTsJLyogTmV4dCBtaXhlciMgKi8KKwkJYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+ZmxhZ3MgfD0gRE1BX0hBUkRTVE9QOworCX0KKwkKKwkvKgorCSAqICBNaXhlciBkZXBlbmRlbnQgaW5pdGlhbGl6YXRpb24uCisJICovCisKKwlzd2l0Y2ggKG1peGVyX3R5cGUpCisJeworCQljYXNlIElDUzIxMDE6CisJCQlndXNfbWljX3ZvbCA9IGd1c19saW5lX3ZvbCA9IGd1c19wY21fdm9sdW1lID0gMTAwOworCQkJZ3VzX3dhdmVfdm9sdW1lID0gOTA7CisJCQlyZXF1ZXN0X3JlZ2lvbih1X01peFNlbGVjdCwgMSwgIkdVUyBtaXhlciIpOworCQkJaHdfY29uZmlnLT5zbG90c1s1XSA9IGljczIxMDFfbWl4ZXJfaW5pdCgpOworCQkJYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+bWl4ZXJfZGV2ID0gaHdfY29uZmlnLT5zbG90c1s1XTsJLyogTmV4dCBtaXhlciMgKi8KKwkJCXJldHVybjsKKworCQljYXNlIENTNDIzMToKKwkJCS8qIEluaXRpYWxpemVkIGVsc2V3aGVyZSAoYWQxODQ4LmMpICovCisJCWRlZmF1bHQ6CisJCQlod19jb25maWctPnNsb3RzWzVdID0gZ3VzX2RlZmF1bHRfbWl4ZXJfaW5pdCgpOworCQkJYXVkaW9fZGV2c1tndXNfZGV2bnVtXS0+bWl4ZXJfZGV2ID0gaHdfY29uZmlnLT5zbG90c1s1XTsJLyogTmV4dCBtaXhlciMgKi8KKwkJCXJldHVybjsKKwl9Cit9CisKK3ZvaWQgX19leGl0IGd1c193YXZlX3VubG9hZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisjaWZkZWYgQ09ORklHX1NPVU5EX0dVU01BWAorCWlmIChoYXZlX2d1c19tYXgpCisJeworCQlhZDE4NDhfdW5sb2FkKGd1c19iYXNlICsgMHgxMGMsCisJCQkJLWd1c19pcnEsCisJCQkJZ3VzX2RtYTIsCS8qIFBsYXliYWNrIERNQSAqLworCQkJCWd1c19kbWEsCS8qIENhcHR1cmUgRE1BICovCisJCQkJMSk7CS8qIFNoYXJlIERNQSBjaGFubmVscyB3aXRoIEdGMSAqLworCX0KKyNlbmRpZgorCisJaWYgKG1peGVyX3R5cGUgPT0gSUNTMjEwMSkKKwl7CisJCXJlbGVhc2VfcmVnaW9uKHVfTWl4U2VsZWN0LCAxKTsKKwl9CisJaWYgKGh3X2NvbmZpZy0+c2xvdHNbMF0gIT0gLTEpCisJCXNvdW5kX3VubG9hZF9zeW50aGRldihod19jb25maWctPnNsb3RzWzBdKTsKKwlpZiAoaHdfY29uZmlnLT5zbG90c1sxXSAhPSAtMSkKKwkJc291bmRfdW5sb2FkX2F1ZGlvZGV2KGh3X2NvbmZpZy0+c2xvdHNbMV0pOworCWlmIChod19jb25maWctPnNsb3RzWzJdICE9IC0xKQorCQlzb3VuZF91bmxvYWRfbWlkaWRldihod19jb25maWctPnNsb3RzWzJdKTsKKwlpZiAoaHdfY29uZmlnLT5zbG90c1s0XSAhPSAtMSkKKwkJc291bmRfdW5sb2FkX2F1ZGlvZGV2KGh3X2NvbmZpZy0+c2xvdHNbNF0pOworCWlmIChod19jb25maWctPnNsb3RzWzVdICE9IC0xKQorCQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYoaHdfY29uZmlnLT5zbG90c1s1XSk7CisJCisJdmZyZWUoc2FtcGxlcyk7CisJc2FtcGxlcz1OVUxMOworfQorLyogY2FsbGVkIGluIGludGVycnVwdCBjb250ZXh0ICovCitzdGF0aWMgdm9pZCBkb19sb29wX2lycShpbnQgdm9pY2UpCit7CisJdW5zaWduZWQgY2hhciAgIHRtcDsKKwlpbnQgICAgICAgICAgICAgbW9kZSwgcGFybTsKKworCXNwaW5fbG9jaygmZ3VzX2xvY2spOworCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCisJdG1wID0gZ3VzX3JlYWQ4KDB4MDApOworCXRtcCAmPSB+MHgyMDsJCS8qCisJCQkJICogRGlzYWJsZSB3YXZlIElSUSBmb3IgdGhpc19vbmUgdm9pY2UKKwkJCQkgKi8KKwlndXNfd3JpdGU4KDB4MDAsIHRtcCk7CisKKwlpZiAodG1wICYgMHgwMykJCS8qIFZvaWNlIHN0b3BwZWQgKi8KKwkJdm9pY2VfYWxsb2MtPm1hcFt2b2ljZV0gPSAwOworCisJbW9kZSA9IHZvaWNlc1t2b2ljZV0ubG9vcF9pcnFfbW9kZTsKKwl2b2ljZXNbdm9pY2VdLmxvb3BfaXJxX21vZGUgPSAwOworCXBhcm0gPSB2b2ljZXNbdm9pY2VdLmxvb3BfaXJxX3Bhcm07CisKKwlzd2l0Y2ggKG1vZGUpCisJeworCQljYXNlIExNT0RFX0ZJTklTSDoJLyoKKwkJCQkJICogRmluYWwgbG9vcCBmaW5pc2hlZCwgc2hvb3Qgdm9sdW1lIGRvd24KKwkJCQkJICovCisKKwkJCWlmICgoaW50KSAoZ3VzX3JlYWQxNigweDA5KSA+PiA0KSA8IDEwMCkJLyoKKwkJCQkJCQkJCSAqIEdldCBjdXJyZW50IHZvbHVtZQorCQkJCQkJCQkJICovCisJCQl7CisJCQkJZ3VzX3ZvaWNlX29mZigpOworCQkJCWd1c19yYW1wb2ZmKCk7CisJCQkJZ3VzX3ZvaWNlX2luaXQodm9pY2UpOworCQkJCWJyZWFrOworCQkJfQorCQkJZ3VzX3JhbXBfcmFuZ2UoNjUsIDQwNjUpOworCQkJZ3VzX3JhbXBfcmF0ZSgwLCA2Myk7CQkvKgorCQkJCQkJCSAqIEZhc3Rlc3QgcG9zc2libGUgcmF0ZQorCQkJCQkJCSAqLworCQkJZ3VzX3JhbXBvbigweDIwIHwgMHg0MCk7CS8qCisJCQkJCQkJICogUmFtcCBkb3duLCBvbmNlLCBpcnEKKwkJCQkJCQkgKi8KKwkJCXZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlID0gVk1PREVfSEFMVDsKKwkJCWJyZWFrOworCisJCWNhc2UgTE1PREVfUENNX1NUT1A6CisJCQlwY21fYWN0aXZlID0gMDsJLyogU2lnbmFsIHRvIHRoZSBwbGF5X25leHRfcGNtX2Jsb2NrIHJvdXRpbmUgKi8KKwkJY2FzZSBMTU9ERV9QQ006CisJCXsKKwkJCXBjbV9xbGVuLS07CisJCQlwY21faGVhZCA9IChwY21faGVhZCArIDEpICUgcGNtX25ibGs7CisJCQlpZiAocGNtX3FsZW4gJiYgcGNtX2FjdGl2ZSkKKwkJCXsKKwkJCQlwbGF5X25leHRfcGNtX2Jsb2NrKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogVW5kZXJydW4uIEp1c3Qgc3RvcCB0aGUgdm9pY2UgKi8KKwkJCQlndXNfc2VsZWN0X3ZvaWNlKDApOwkvKiBMZWZ0IGNoYW5uZWwgKi8KKwkJCQlndXNfdm9pY2Vfb2ZmKCk7CisJCQkJZ3VzX3JhbXBvZmYoKTsKKwkJCQlndXNfc2VsZWN0X3ZvaWNlKDEpOwkvKiBSaWdodCBjaGFubmVsICovCisJCQkJZ3VzX3ZvaWNlX29mZigpOworCQkJCWd1c19yYW1wb2ZmKCk7CisJCQkJcGNtX2FjdGl2ZSA9IDA7CisJCQl9CisKKwkJCS8qCisJCQkgKiBJZiB0aGUgcXVldWUgd2FzIGZ1bGwgYmVmb3JlIHRoaXMgaW50ZXJydXB0LCB0aGUgRE1BIHRyYW5zZmVyIHdhcworCQkJICogc3VzcGVuZGVkLiBMZXQgaXQgY29udGludWUgbm93LgorCQkJICovCisJCQkKKwkJCWlmIChhdWRpb19kZXZzW2d1c19kZXZudW1dLT5kbWFwX291dC0+cWxlbiA+IDApCisJCQkJRE1BYnVmX291dHB1dGludHIoZ3VzX2Rldm51bSwgMCk7CisJCX0KKwkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmZ3VzX2xvY2spOworfQorCitzdGF0aWMgdm9pZCBkb192b2x1bWVfaXJxKGludCB2b2ljZSkKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKwlpbnQgbW9kZSwgcGFybTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmd1c19sb2NrLGZsYWdzKTsKKworCWd1c19zZWxlY3Rfdm9pY2Uodm9pY2UpOworCXRtcCA9IGd1c19yZWFkOCgweDBkKTsKKwl0bXAgJj0gfjB4MjA7CQkvKgorCQkJCSAqIERpc2FibGUgdm9sdW1lIHJhbXAgSVJRCisJCQkJICovCisJZ3VzX3dyaXRlOCgweDBkLCB0bXApOworCisJbW9kZSA9IHZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlOworCXZvaWNlc1t2b2ljZV0udm9sdW1lX2lycV9tb2RlID0gMDsKKwlwYXJtID0gdm9pY2VzW3ZvaWNlXS52b2x1bWVfaXJxX3Bhcm07CisKKwlzd2l0Y2ggKG1vZGUpCisJeworCQljYXNlIFZNT0RFX0hBTFQ6CS8qIERlY2F5IHBoYXNlIGZpbmlzaGVkICovCisJCQlpZiAoaXdfbW9kZSkKKwkJCQlndXNfd3JpdGU4KDB4MTUsIDB4MDIpOwkvKiBTZXQgdm9pY2UgZGVhY3RpdmF0ZSBiaXQgb2YgU01TSSAqLworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworCQkJZ3VzX3ZvaWNlX2luaXQodm9pY2UpOworCQkJYnJlYWs7CisKKwkJY2FzZSBWTU9ERV9FTlZFTE9QRToKKwkJCWd1c19yYW1wb2ZmKCk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZndXNfbG9jayxmbGFncyk7CisJCQlzdGVwX2VudmVsb3BlKHZvaWNlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVk1PREVfU1RBUlRfTk9URToKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwkJCWd1c3dhdmVfc3RhcnRfbm90ZTIodm9pY2VzW3ZvaWNlXS5kZXZfcGVuZGluZywgdm9pY2UsCisJCQkJICAgICAgdm9pY2VzW3ZvaWNlXS5ub3RlX3BlbmRpbmcsIHZvaWNlc1t2b2ljZV0udm9sdW1lX3BlbmRpbmcpOworCQkJaWYgKHZvaWNlc1t2b2ljZV0ua2lsbF9wZW5kaW5nKQorCQkJCWd1c3dhdmVfa2lsbF9ub3RlKHZvaWNlc1t2b2ljZV0uZGV2X3BlbmRpbmcsIHZvaWNlLAorCQkJCQkgIHZvaWNlc1t2b2ljZV0ubm90ZV9wZW5kaW5nLCAwKTsKKworCQkJaWYgKHZvaWNlc1t2b2ljZV0uc2FtcGxlX3BlbmRpbmcgPj0gMCkKKwkJCXsKKwkJCQlndXN3YXZlX3NldF9pbnN0cih2b2ljZXNbdm9pY2VdLmRldl9wZW5kaW5nLCB2b2ljZSwKKwkJCQkJdm9pY2VzW3ZvaWNlXS5zYW1wbGVfcGVuZGluZyk7CisJCQkJdm9pY2VzW3ZvaWNlXS5zYW1wbGVfcGVuZGluZyA9IC0xOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmd1c19sb2NrLGZsYWdzKTsKKwl9Cit9CisvKiBjYWxsZWQgaW4gaXJxIGNvbnRleHQgKi8KK3ZvaWQgZ3VzX3ZvaWNlX2lycSh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgd2F2ZV9pZ25vcmUgPSAwLCB2b2x1bWVfaWdub3JlID0gMDsKKwl1bnNpZ25lZCBsb25nIHZvaWNlX2JpdDsKKworCXVuc2lnbmVkIGNoYXIgc3JjLCB2b2ljZTsKKworCXdoaWxlICgxKQorCXsKKwkJc3JjID0gZ3VzX3JlYWQ4KDB4MGYpOwkvKgorCQkJCQkgKiBHZXQgc291cmNlIGluZm8KKwkJCQkJICovCisJCXZvaWNlID0gc3JjICYgMHgxZjsKKwkJc3JjICY9IDB4YzA7CisKKwkJaWYgKHNyYyA9PSAoMHg4MCB8IDB4NDApKQorCQkJcmV0dXJuOwkvKgorCQkJCSAqIE5vIGludGVycnVwdAorCQkJCSAqLworCisJCXZvaWNlX2JpdCA9IDEgPDwgdm9pY2U7CisKKwkJaWYgKCEoc3JjICYgMHg4MCkpCS8qCisJCQkJCSAqIFdhdmUgSVJRIHBlbmRpbmcKKwkJCQkJICovCisJCQlpZiAoISh3YXZlX2lnbm9yZSAmIHZvaWNlX2JpdCkgJiYgKGludCkgdm9pY2UgPCBucl92b2ljZXMpCS8qCisJCQkJCQkJCQkJCSAqIE5vdCBkb25lCisJCQkJCQkJCQkJCSAqIHlldAorCQkJCQkJCQkJCQkgKi8KKwkJCXsKKwkJCQl3YXZlX2lnbm9yZSB8PSB2b2ljZV9iaXQ7CisJCQkJZG9fbG9vcF9pcnEodm9pY2UpOworCQkJfQorCQlpZiAoIShzcmMgJiAweDQwKSkJLyoKKwkJCQkJICogVm9sdW1lIElSUSBwZW5kaW5nCisJCQkJCSAqLworCQkJaWYgKCEodm9sdW1lX2lnbm9yZSAmIHZvaWNlX2JpdCkgJiYgKGludCkgdm9pY2UgPCBucl92b2ljZXMpCS8qCisJCQkJCQkJCQkJCSAgICogTm90IGRvbmUKKwkJCQkJCQkJCQkJICAgKiB5ZXQKKwkJCQkJCQkJCQkJICovCisJCQl7CisJCQkJdm9sdW1lX2lnbm9yZSB8PSB2b2ljZV9iaXQ7CisJCQkJZG9fdm9sdW1lX2lycSh2b2ljZSk7CisJCQl9CisJfQorfQorCit2b2lkIGd1c3dhdmVfZG1hX2lycSh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgICBzdGF0dXM7CisKKwlzdGF0dXMgPSBndXNfbG9vazgoMHg0MSk7CS8qIEdldCBETUEgSVJRIFN0YXR1cyAqLworCWlmIChzdGF0dXMgJiAweDQwKQkvKiBETUEgaW50ZXJydXB0IHBlbmRpbmcgKi8KKwkJc3dpdGNoIChhY3RpdmVfZGV2aWNlKQorCQl7CisJCQljYXNlIEdVU19ERVZfV0FWRToKKwkJCQl3YWtlX3VwKCZkcmFtX3NsZWVwZXIpOworCQkJCWJyZWFrOworCisJCQljYXNlIEdVU19ERVZfUENNX0NPTlRJTlVFOgkvKiBMZWZ0IGNoYW5uZWwgZGF0YSB0cmFuc2ZlcnJlZCAqLworCQkJCWd1c193cml0ZTgoMHg0MSwgMCk7CS8qIERpc2FibGUgR0YxIERNQSAqLworCQkJCWd1c190cmFuc2Zlcl9vdXRwdXRfYmxvY2socGNtX2N1cnJlbnRfZGV2LCBwY21fY3VycmVudF9idWYsCisJCQkJCQlwY21fY3VycmVudF9jb3VudCwKKwkJCQkJCXBjbV9jdXJyZW50X2ludHJmbGFnLCAxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBHVVNfREVWX1BDTV9ET05FOgkvKiBSaWdodCBvciBtb25vIGNoYW5uZWwgZGF0YSB0cmFuc2ZlcnJlZCAqLworCQkJCWd1c193cml0ZTgoMHg0MSwgMCk7CS8qIERpc2FibGUgR0YxIERNQSAqLworCQkJCWlmIChwY21fcWxlbiA8IHBjbV9uYmxrKQorCQkJCXsKKwkJCQkJZG1hX2FjdGl2ZSA9IDA7CisJCQkJCWlmIChndXNfYnVzeSkKKwkJCQkJeworCQkJCQkJaWYgKGF1ZGlvX2RldnNbZ3VzX2Rldm51bV0tPmRtYXBfb3V0LT5xbGVuID4gMCkKKwkJCQkJCQlETUFidWZfb3V0cHV0aW50cihndXNfZGV2bnVtLCAwKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwl9CisJc3RhdHVzID0gZ3VzX2xvb2s4KDB4NDkpOwkvKgorCQkJCQkgKiBHZXQgU2FtcGxpbmcgSVJRIFN0YXR1cworCQkJCQkgKi8KKwlpZiAoc3RhdHVzICYgMHg0MCkJLyoKKwkJCQkgKiBTYW1wbGluZyBJcnEgcGVuZGluZworCQkJCSAqLworCXsKKwkJRE1BYnVmX2lucHV0aW50cihndXNfZGV2bnVtKTsKKwl9Cit9CisKKy8qCisgKiBUaW1lciBzdHVmZgorICovCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgc2VsZWN0X2FkZHIsIGRhdGFfYWRkcjsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgY3Vycl90aW1lcjsKKwordm9pZCBndXNfdGltZXJfY29tbWFuZCh1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IHZhbCkKK3sKKwlpbnQgaTsKKworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAoYWRkciAmIDB4ZmYpKSwgc2VsZWN0X2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJaW5iKHNlbGVjdF9hZGRyKTsKKworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAodmFsICYgMHhmZikpLCBkYXRhX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJaW5iKHNlbGVjdF9hZGRyKTsKK30KKworc3RhdGljIHZvaWQgYXJtX3RpbWVyKGludCB0aW1lciwgdW5zaWduZWQgaW50IGludGVydmFsKQoreworCWN1cnJfdGltZXIgPSB0aW1lcjsKKworCWlmICh0aW1lciA9PSAxKQorCXsKKwkJZ3VzX3dyaXRlOCgweDQ2LCAyNTYgLSBpbnRlcnZhbCk7CS8qIFNldCBjb3VudGVyIGZvciB0aW1lciAxICovCisJCWd1c193cml0ZTgoMHg0NSwgMHgwNCk7CQkJLyogRW5hYmxlIHRpbWVyIDEgSVJRICovCisJCWd1c190aW1lcl9jb21tYW5kKDB4MDQsIDB4MDEpOwkJLyogU3RhcnQgdGltZXIgMSAqLworCX0KKwllbHNlCisJeworCQlndXNfd3JpdGU4KDB4NDcsIDI1NiAtIGludGVydmFsKTsJLyogU2V0IGNvdW50ZXIgZm9yIHRpbWVyIDIgKi8KKwkJZ3VzX3dyaXRlOCgweDQ1LCAweDA4KTsJCQkvKiBFbmFibGUgdGltZXIgMiBJUlEgKi8KKwkJZ3VzX3RpbWVyX2NvbW1hbmQoMHgwNCwgMHgwMik7CQkvKiBTdGFydCB0aW1lciAyICovCisJfQorCisJZ3VzX3RpbWVyX2VuYWJsZWQgPSAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGd1c190bXJfc3RhcnQoaW50IGRldiwgdW5zaWduZWQgaW50IHVzZWNzX3Blcl90aWNrKQoreworCWludCB0aW1lcl9ubywgcmVzb2x1dGlvbjsKKwlpbnQgZGl2aXNvcjsKKworCWlmICh1c2Vjc19wZXJfdGljayA+ICgyNTYgKiA4MCkpCisJeworCQl0aW1lcl9ubyA9IDI7CisJCXJlc29sdXRpb24gPSAzMjA7CS8qIHVzZWMgKi8KKwl9CisJZWxzZQorCXsKKwkJdGltZXJfbm8gPSAxOworCQlyZXNvbHV0aW9uID0gODA7CS8qIHVzZWMgKi8KKwl9CisJZGl2aXNvciA9ICh1c2Vjc19wZXJfdGljayArIChyZXNvbHV0aW9uIC8gMikpIC8gcmVzb2x1dGlvbjsKKwlhcm1fdGltZXIodGltZXJfbm8sIGRpdmlzb3IpOworCisJcmV0dXJuIGRpdmlzb3IgKiByZXNvbHV0aW9uOworfQorCitzdGF0aWMgdm9pZCBndXNfdG1yX2Rpc2FibGUoaW50IGRldikKK3sKKwlndXNfd3JpdGU4KDB4NDUsIDApOwkvKiBEaXNhYmxlIGJvdGggdGltZXJzICovCisJZ3VzX3RpbWVyX2VuYWJsZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBndXNfdG1yX3Jlc3RhcnQoaW50IGRldikKK3sKKwlpZiAoY3Vycl90aW1lciA9PSAxKQorCQlndXNfd3JpdGU4KDB4NDUsIDB4MDQpOwkJLyogU3RhcnQgdGltZXIgMSBhZ2FpbiAqLworCWVsc2UKKwkJZ3VzX3dyaXRlOCgweDQ1LCAweDA4KTsJCS8qIFN0YXJ0IHRpbWVyIDIgYWdhaW4gKi8KKwlndXNfdGltZXJfZW5hYmxlZCA9IDE7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc291bmRfbG93bGV2X3RpbWVyIGd1c190bXIgPQoreworCTAsCisJMSwKKwlndXNfdG1yX3N0YXJ0LAorCWd1c190bXJfZGlzYWJsZSwKKwlndXNfdG1yX3Jlc3RhcnQKK307CisKK3N0YXRpYyB2b2lkIGd1c190bXJfaW5zdGFsbChpbnQgaW9fYmFzZSkKK3sKKwlzdHJ1Y3Qgc291bmRfbG93bGV2X3RpbWVyICp0bXI7CisKKwlzZWxlY3RfYWRkciA9IGlvX2Jhc2U7CisJZGF0YV9hZGRyID0gaW9fYmFzZSArIDE7CisKKwl0bXIgPSAmZ3VzX3RtcjsKKworI2lmZGVmIFRISVNfR0VUU19GSVhFRAorCXNvdW5kX3RpbWVyX2luaXQoJmd1c190bXIsICJHVVMiKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2hhbDIuYyBiL3NvdW5kL29zcy9oYWwyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlOTdjNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9oYWwyLmMKQEAgLTAsMCArMSwxNTU3IEBACisvKgorICogIERyaXZlciBmb3IgQTIgYXVkaW8gc3lzdGVtIHVzZWQgaW4gU0dJIG1hY2hpbmVzCisgKiAgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIExhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4KKyAqICAKKyAqICBCYXNlZCBvbiBVbGYgQ2FybHNzb24ncyBjb2RlLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzIAorICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogIFN1cHBvcnRlZCBkZXZpY2VzOgorICogIC9kZXYvZHNwICAgIHN0YW5kYXJkIGRzcCBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCisgKiAgL2Rldi9taXhlcglzdGFuZGFyZCBtaXhlciBkZXZpY2UsIChtb3N0bHkpIE9TUyBjb21wYXRpYmxlCisgKgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vc2dpL2hwYzMuaD4KKyNpbmNsdWRlIDxhc20vc2dpL2lwMjIuaD4KKworI2luY2x1ZGUgImhhbDIuaCIKKworI2lmIDAKKyNkZWZpbmUgREVCVUcoYXJncy4uLikJCXByaW50ayhhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREVCVUcoYXJncy4uLikKKyNlbmRpZgorCisjaWYgMCAKKyNkZWZpbmUgREVCVUdfTUlYKGFyZ3MuLi4pCXByaW50ayhhcmdzKQorI2Vsc2UKKyNkZWZpbmUgREVCVUdfTUlYKGFyZ3MuLi4pCisjZW5kaWYKKworLyoKKyAqIEJlZm9yZSB0b3VjaGluZyB0aGVzZSBsb29rIGhvdyBpdCB3b3Jrcy4gSXQgaXMgYSBiaXQgdW51c3VhbCBJIGtub3csCisgKiBidXQgaXQgaGVscHMgdG8ga2VlcCB0aGluZ3Mgc2ltcGxlLiBUaGlzIGRyaXZlciBpcyBjb25zaWRlcmVkIGNvbXBsZXRlCisgKiBhbmQgSSB3b24ndCBhZGQgYW55IG5ldyBmZWF0dXJlcyBhbHRob3VnaCBoYXJkd2FyZSBoYXMgbWFueSBjb29sCisgKiBjYXBhYmlsaXRpZXMuCisgKiAoSGlzdG9yaWNhbCBub3RlOiBIQUwyIGRyaXZlciB3YXMgZmlyc3Qgd3JpdHRlbiBieSBVbGYgQ2FybHNzb24gLSBBTFNBCisgKiAwLjMgcnVubmluZyB3aXRoIDIuMi54IGtlcm5lbC4gVGhlbiBBTFNBIGNoYW5nZWQgY29tcGxldGVseSBhbmQgaXQKKyAqIHNlZW1lZCBlYXNpZXIgdG8gbWUgdG8gd3JpdGUgT1NTIGRyaXZlciBmcm9tIHNjcmF0Y2ggLSB0aGlzIG9uZS4gTm93CisgKiB3aGVuIEFMU0EgaXMgb2ZmaWNpYWwgcGFydCBvZiAyLjYga2VybmVsIGl0J3MgdGltZSB0byB3cml0ZSBBTFNBIGRyaXZlcgorICogdXNpbmcgKGhvcGVmdWxseSkgZmluYWwgdmVyc2lvbiBvZiBBTFNBIGludGVyZmFjZSkKKyAqLworI2RlZmluZSBIMl9CTE9DS19TSVpFCTEwMjQKKyNkZWZpbmUgSDJfQURDX0JVRlNJWkUJODE5MgorI2RlZmluZSBIMl9EQUNfQlVGU0laRQkxNjgzNAorCitzdHJ1Y3QgaGFsMl9wYnVzIHsKKwlzdHJ1Y3QgaHBjM19wYnVzX2RtYWNyZWdzICpwYnVzOworCWludCBwYnVzbnI7CisJdW5zaWduZWQgaW50IGN0cmw7CQkvKiBDdXJyZW50IHN0YXRlIG9mIHBidXMtPnBiZG1hX2N0cmwgKi8KK307CisKK3N0cnVjdCBoYWwyX2Rlc2MgeworCXN0cnVjdCBocGNfZG1hX2Rlc2MgZGVzYzsKKwl1MzIgY250OwkJCS8qIGRvbid0IHRvdWNoLCBpdCBpcyBhbHNvIHBhZGRpbmcgKi8KK307CisKK3N0cnVjdCBoYWwyX2NvZGVjIHsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisJc3RydWN0IGhhbDJfZGVzYyAqZGVzYzsKKwlpbnQgZGVzY19jb3VudDsKKwlpbnQgdGFpbCwgaGVhZDsJCQkvKiB0YWlsIGluZGV4LCBoZWFkIGluZGV4ICovCisJc3RydWN0IGhhbDJfcGJ1cyBwYnVzOworCXVuc2lnbmVkIGludCBmb3JtYXQ7CQkvKiBBdWRpbyBkYXRhIGZvcm1hdCAqLworCWludCB2b2ljZXM7CQkJLyogbW9uby9zdGVyZW8gKi8KKwl1bnNpZ25lZCBpbnQgc2FtcGxlX3JhdGU7CisJdW5zaWduZWQgaW50IG1hc3RlcjsJCS8qIE1hc3RlciBmcmVxdWVuY3kgKi8KKwl1bnNpZ25lZCBzaG9ydCBtb2Q7CQkvKiBNT0QgdmFsdWUgKi8KKwl1bnNpZ25lZCBzaG9ydCBpbmM7CQkvKiBJTkMgdmFsdWUgKi8KKworCXdhaXRfcXVldWVfaGVhZF90IGRtYV93YWl0OworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIHNlbTsKKworCWludCB1c2Vjb3VudDsJCQkvKiByZWNvcmRpbmcgYW5kIHBsYXliYWNrIGFyZQorCQkJCQkgKiBpbmRlcGVuZGVudCAqLworfTsKKworI2RlZmluZSBIMl9NSVhfT1VUUFVUX0FUVAkwCisjZGVmaW5lIEgyX01JWF9JTlBVVF9HQUlOCTEKKyNkZWZpbmUgSDJfTUlYRVJTCQkyCitzdHJ1Y3QgaGFsMl9taXhlciB7CisJaW50IG1vZGNudDsKKwl1bnNpZ25lZCBpbnQgbWFzdGVyOworCXVuc2lnbmVkIGludCB2b2x1bWVbSDJfTUlYRVJTXTsKK307CisKK3N0cnVjdCBoYWwyX2NhcmQgeworCWludCBkZXZfZHNwOwkJCS8qIGF1ZGlvIGRldmljZSAqLworCWludCBkZXZfbWl4ZXI7CQkJLyogbWl4ZXIgZGV2aWNlICovCisJaW50IGRldl9taWRpOwkJCS8qIG1pZGkgZGV2aWNlICovCisKKwlzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqY3RsX3JlZ3M7CS8qIEhBTDIgY3RsIHJlZ2lzdGVycyAqLworCXN0cnVjdCBoYWwyX2Flc19yZWdzICphZXNfcmVnczsJLyogSEFMMiBhZXMgcmVnaXN0ZXJzICovCisJc3RydWN0IGhhbDJfdm9sX3JlZ3MgKnZvbF9yZWdzOwkvKiBIQUwyIHZvbCByZWdpc3RlcnMgKi8KKwlzdHJ1Y3QgaGFsMl9zeW5fcmVncyAqc3luX3JlZ3M7CS8qIEhBTDIgc3luIHJlZ2lzdGVycyAqLworCisJc3RydWN0IGhhbDJfY29kZWMgZGFjOworCXN0cnVjdCBoYWwyX2NvZGVjIGFkYzsKKwlzdHJ1Y3QgaGFsMl9taXhlciBtaXhlcjsKK307CisKKyNkZWZpbmUgSDJfSU5ESVJFQ1RfV0FJVChyZWdzKQl3aGlsZSAocmVncy0+aXNyICYgSDJfSVNSX1RTVEFUVVMpOworCisjZGVmaW5lIEgyX1JFQURfQUREUihhZGRyKQkoYWRkciB8ICgxPDw3KSkKKyNkZWZpbmUgSDJfV1JJVEVfQUREUihhZGRyKQkoYWRkcikKKworc3RhdGljIGNoYXIgKmhhbDJzdHIgPSAiSEFMMiI7CisKKy8qCisgKiBJIGRvdWJ0IGFueW9uZSBoYXMgYSBtYWNoaW5lIHdpdGggdHdvIEhBTDIgY2FyZHMuIEl0J3MgcG9zc2libGUgdG8KKyAqIGhhdmUgdHdvIEhQQydzLCBzbyBpdCBpcyBwcm9iYWJseSBwb3NzaWJsZSB0byBoYXZlIHR3byBIQUwyIGNhcmRzLgorICogVHJ5IHRvIGRlYWwgd2l0aCBpdCwgYnV0IG5vdGUgdGhhdCBpdCBpcyBub3QgdGVzdGVkLgorICovCisjZGVmaW5lIE1BWENBUkRTCTIKK3N0YXRpYyBzdHJ1Y3QgaGFsMl9jYXJkKiBoYWwyX2NhcmRbTUFYQ0FSRFNdOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBjaGFyIGlkeDo0LCBhdmFpbDoxOworfSBtaXh0YWJsZVtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCVtTT1VORF9NSVhFUl9QQ01dCT0geyBIMl9NSVhfT1VUUFVUX0FUVCwgMSB9LAkvKiB2b2ljZSAqLworCVtTT1VORF9NSVhFUl9NSUNdCT0geyBIMl9NSVhfSU5QVVRfR0FJTiwgMSB9LAkvKiBtaWMgKi8KK307CisKKyNkZWZpbmUgSDJfU1VQUE9SVEVEX0ZPUk1BVFMJKEFGTVRfUzE2X0xFIHwgQUZNVF9TMTZfQkUpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYWwyX2lzcl93cml0ZShzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgdmFsKQoreworCWhhbDItPmN0bF9yZWdzLT5pc3IgPSB2YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTE2IGhhbDJfaXNyX2xvb2soc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKK3sKKwlyZXR1cm4gaGFsMi0+Y3RsX3JlZ3MtPmlzcjsKK30KKworc3RhdGljIGlubGluZSB1MTYgaGFsMl9yZXZfbG9vayhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCXJldHVybiBoYWwyLT5jdGxfcmVncy0+cmV2OworfQorCisjaWZkZWYgSEFMMl9EVU1QX1JFR1MKK3N0YXRpYyB1MTYgaGFsMl9pX2xvb2sxNihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgYWRkcikKK3sKKwlzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqcmVncyA9IGhhbDItPmN0bF9yZWdzOworCisJcmVncy0+aWFyID0gSDJfUkVBRF9BRERSKGFkZHIpOworCUgyX0lORElSRUNUX1dBSVQocmVncyk7CisJcmV0dXJuIHJlZ3MtPmlkcjA7Cit9CisjZW5kaWYKKworc3RhdGljIHUzMiBoYWwyX2lfbG9vazMyKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIHUxNiBhZGRyKQoreworCXUzMiByZXQ7CisJc3RydWN0IGhhbDJfY3RsX3JlZ3MgKnJlZ3MgPSBoYWwyLT5jdGxfcmVnczsKKworCXJlZ3MtPmlhciA9IEgyX1JFQURfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworCXJldCA9IHJlZ3MtPmlkcjAgJiAweGZmZmY7CisJcmVncy0+aWFyID0gSDJfUkVBRF9BRERSKGFkZHIgfCAweDEpOworCUgyX0lORElSRUNUX1dBSVQocmVncyk7CisJcmV0IHw9IChyZWdzLT5pZHIwICYgMHhmZmZmKSA8PCAxNjsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBoYWwyX2lfd3JpdGUxNihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgYWRkciwgdTE2IHZhbCkKK3sKKwlzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqcmVncyA9IGhhbDItPmN0bF9yZWdzOworCisJcmVncy0+aWRyMCA9IHZhbDsKKwlyZWdzLT5pZHIxID0gMDsKKwlyZWdzLT5pZHIyID0gMDsKKwlyZWdzLT5pZHIzID0gMDsKKwlyZWdzLT5pYXIgPSBIMl9XUklURV9BRERSKGFkZHIpOworCUgyX0lORElSRUNUX1dBSVQocmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbDJfaV93cml0ZTMyKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIHUxNiBhZGRyLCB1MzIgdmFsKQoreworCXN0cnVjdCBoYWwyX2N0bF9yZWdzICpyZWdzID0gaGFsMi0+Y3RsX3JlZ3M7CisKKwlyZWdzLT5pZHIwID0gdmFsICYgMHhmZmZmOworCXJlZ3MtPmlkcjEgPSB2YWwgPj4gMTY7CisJcmVncy0+aWRyMiA9IDA7CisJcmVncy0+aWRyMyA9IDA7CisJcmVncy0+aWFyID0gSDJfV1JJVEVfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBoYWwyX2lfc2V0Yml0MTYoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgdTE2IGFkZHIsIHUxNiBiaXQpCit7CisJc3RydWN0IGhhbDJfY3RsX3JlZ3MgKnJlZ3MgPSBoYWwyLT5jdGxfcmVnczsKKworCXJlZ3MtPmlhciA9IEgyX1JFQURfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworCXJlZ3MtPmlkcjAgPSAocmVncy0+aWRyMCAmIDB4ZmZmZikgfCBiaXQ7CisJcmVncy0+aWRyMSA9IDA7CisJcmVncy0+aWRyMiA9IDA7CisJcmVncy0+aWRyMyA9IDA7CisJcmVncy0+aWFyID0gSDJfV1JJVEVfQUREUihhZGRyKTsKKwlIMl9JTkRJUkVDVF9XQUlUKHJlZ3MpOworfQorCitzdGF0aWMgdm9pZCBoYWwyX2lfc2V0Yml0MzIoc3RydWN0IGhhbDJfY2FyZCAqaGFsMiwgdTE2IGFkZHIsIHUzMiBiaXQpCit7CisJdTMyIHRtcDsKKwlzdHJ1Y3QgaGFsMl9jdGxfcmVncyAqcmVncyA9IGhhbDItPmN0bF9yZWdzOworCisJcmVncy0+aWFyID0gSDJfUkVBRF9BRERSKGFkZHIpOworCUgyX0lORElSRUNUX1dBSVQocmVncyk7CisJdG1wID0gKHJlZ3MtPmlkcjAgJiAweGZmZmYpIHwgKHJlZ3MtPmlkcjEgPDwgMTYpIHwgYml0OworCXJlZ3MtPmlkcjAgPSB0bXAgJiAweGZmZmY7CisJcmVncy0+aWRyMSA9IHRtcCA+PiAxNjsKKwlyZWdzLT5pZHIyID0gMDsKKwlyZWdzLT5pZHIzID0gMDsKKwlyZWdzLT5pYXIgPSBIMl9XUklURV9BRERSKGFkZHIpOworCUgyX0lORElSRUNUX1dBSVQocmVncyk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbDJfaV9jbGVhcmJpdDE2KHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIHUxNiBhZGRyLCB1MTYgYml0KQoreworCXN0cnVjdCBoYWwyX2N0bF9yZWdzICpyZWdzID0gaGFsMi0+Y3RsX3JlZ3M7CisKKwlyZWdzLT5pYXIgPSBIMl9SRUFEX0FERFIoYWRkcik7CisJSDJfSU5ESVJFQ1RfV0FJVChyZWdzKTsKKwlyZWdzLT5pZHIwID0gKHJlZ3MtPmlkcjAgJiAweGZmZmYpICYgfmJpdDsKKwlyZWdzLT5pZHIxID0gMDsKKwlyZWdzLT5pZHIyID0gMDsKKwlyZWdzLT5pZHIzID0gMDsKKwlyZWdzLT5pYXIgPSBIMl9XUklURV9BRERSKGFkZHIpOworCUgyX0lORElSRUNUX1dBSVQocmVncyk7Cit9CisKKyNpZiAwCitzdGF0aWMgdm9pZCBoYWwyX2lfY2xlYXJiaXQzMihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1MTYgYWRkciwgdTMyIGJpdCkKK3sKKwl1MzIgdG1wOworCWhhbDJfY3RsX3JlZ3NfdCAqcmVncyA9IGhhbDItPmN0bF9yZWdzOworCisJcmVncy0+aWFyID0gSDJfUkVBRF9BRERSKGFkZHIpOworCUgyX0lORElSRUNUX1dBSVQocmVncyk7CisJdG1wID0gKChyZWdzLT5pZHIwICYgMHhmZmZmKSB8IChyZWdzLT5pZHIxIDw8IDE2KSkgJiB+Yml0OworCXJlZ3MtPmlkcjAgPSB0bXAgJiAweGZmZmY7CisJcmVncy0+aWRyMSA9IHRtcCA+PiAxNjsKKwlyZWdzLT5pZHIyID0gMDsKKwlyZWdzLT5pZHIzID0gMDsKKwlyZWdzLT5pYXIgPSBIMl9XUklURV9BRERSKGFkZHIpOworCUgyX0lORElSRUNUX1dBSVQocmVncyk7Cit9CisjZW5kaWYKKworI2lmZGVmIEhBTDJfRFVNUF9SRUdTCitzdGF0aWMgdm9pZCBoYWwyX2R1bXBfcmVncyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCURFQlVHKCJpc3I6ICUwOGh4ICIsIGhhbDJfaXNyX2xvb2soaGFsMikpOworCURFQlVHKCJyZXY6ICUwOGh4XG4iLCBoYWwyX3Jldl9sb29rKGhhbDIpKTsKKwlERUJVRygicmVsYXk6ICUwNGh4XG4iLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9SRUxBWV9DKSk7CisJREVCVUcoInBvcnQgZW46ICUwNGh4ICIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0RNQV9QT1JUX0VOKSk7CisJREVCVUcoImRtYSBlbmQ6ICUwNGh4ICIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0RNQV9FTkQpKTsKKwlERUJVRygiZG1hIGRydjogJTA0aHhcbiIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0RNQV9EUlYpKTsKKwlERUJVRygic3luIGN0bDogJTA0aHggIiwgaGFsMl9pX2xvb2sxNihoYWwyLCBIMklfU1lOVEhfQykpOworCURFQlVHKCJhZXNyeCBjdGw6ICUwNGh4ICIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0FFU1JYX0MpKTsKKwlERUJVRygiYWVzdHggY3RsOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9BRVNUWF9DKSk7CisJREVCVUcoImRhYyBjdGwxOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9BRENfQzEpKTsKKwlERUJVRygiZGFjIGN0bDI6ICUwOHggIiwgaGFsMl9pX2xvb2szMihoYWwyLCBIMklfQURDX0MyKSk7CisJREVCVUcoImFkYyBjdGwxOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9EQUNfQzEpKTsKKwlERUJVRygiYWRjIGN0bDI6ICUwOHggIiwgaGFsMl9pX2xvb2szMihoYWwyLCBIMklfREFDX0MyKSk7CisJREVCVUcoInN5biBtYXA6ICUwNGh4XG4iLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9TWU5USF9NQVBfQykpOworCURFQlVHKCJicmVzMSBjdGwxOiAlMDRoeCAiLCBoYWwyX2lfbG9vazE2KGhhbDIsIEgySV9CUkVTMV9DMSkpOworCURFQlVHKCJicmVzMSBjdGwyOiAlMDR4ICIsIGhhbDJfaV9sb29rMzIoaGFsMiwgSDJJX0JSRVMxX0MyKSk7CisJREVCVUcoImJyZXMyIGN0bDE6ICUwNGh4ICIsIGhhbDJfaV9sb29rMTYoaGFsMiwgSDJJX0JSRVMyX0MxKSk7CisJREVCVUcoImJyZXMyIGN0bDI6ICUwNHggIiwgaGFsMl9pX2xvb2szMihoYWwyLCBIMklfQlJFUzJfQzIpKTsKKwlERUJVRygiYnJlczMgY3RsMTogJTA0aHggIiwgaGFsMl9pX2xvb2sxNihoYWwyLCBIMklfQlJFUzNfQzEpKTsKKwlERUJVRygiYnJlczMgY3RsMjogJTA0eFxuIiwgaGFsMl9pX2xvb2szMihoYWwyLCBIMklfQlJFUzNfQzIpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGhhbDJfY2FyZCogaGFsMl9kc3BfZmluZF9jYXJkKGludCBtaW5vcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhDQVJEUzsgaSsrKQorCQlpZiAoaGFsMl9jYXJkW2ldICE9IE5VTEwgJiYgaGFsMl9jYXJkW2ldLT5kZXZfZHNwID09IG1pbm9yKQorCQkJcmV0dXJuIGhhbDJfY2FyZFtpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBoYWwyX2NhcmQqIGhhbDJfbWl4ZXJfZmluZF9jYXJkKGludCBtaW5vcikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhDQVJEUzsgaSsrKQorCQlpZiAoaGFsMl9jYXJkW2ldICE9IE5VTEwgJiYgaGFsMl9jYXJkW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQlyZXR1cm4gaGFsMl9jYXJkW2ldOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBoYWwyX2luY19oZWFkKHN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYykKK3sKKwljb2RlYy0+aGVhZCsrOworCWlmIChjb2RlYy0+aGVhZCA9PSBjb2RlYy0+ZGVzY19jb3VudCkKKwkJY29kZWMtPmhlYWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBoYWwyX2luY190YWlsKHN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYykKK3sKKwljb2RlYy0+dGFpbCsrOworCWlmIChjb2RlYy0+dGFpbCA9PSBjb2RlYy0+ZGVzY19jb3VudCkKKwkJY29kZWMtPnRhaWwgPSAwOworfQorCitzdGF0aWMgdm9pZCBoYWwyX2RhY19pbnRlcnJ1cHQoc3RydWN0IGhhbDJfY29kZWMgKmRhYykKK3sKKwlpbnQgcnVubmluZzsKKworCXNwaW5fbG9jaygmZGFjLT5sb2NrKTsKKwkvKiBpZiB0YWlsIGJ1ZmZlciBjb250YWlucyB6ZXJvIHNhbXBsZXMgRE1BIHN0cmVhbSB3YXMgYWxyZWFkeQorCSAqIHN0b3BwZWQgKi8KKwlydW5uaW5nID0gZGFjLT5kZXNjW2RhYy0+dGFpbF0uY250OworCWRhYy0+ZGVzY1tkYWMtPnRhaWxdLmNudCA9IDA7CisJZGFjLT5kZXNjW2RhYy0+dGFpbF0uZGVzYy5jbnRpbmZvID0gSFBDRE1BX1hJRSB8IEhQQ0RNQV9FT1g7CisJLyogd2UganVzdCBwcm9jY2Vzc2VkIGVtcHR5IGJ1ZmZlciwgZG9uJ3QgdXBkYXRlIHRhaWwgcG9pbnRlciAqLworCWlmIChydW5uaW5nKQorCQloYWwyX2luY190YWlsKGRhYyk7CisJc3Bpbl91bmxvY2soJmRhYy0+bG9jayk7CisKKwl3YWtlX3VwKCZkYWMtPmRtYV93YWl0KTsKK30KKworc3RhdGljIHZvaWQgaGFsMl9hZGNfaW50ZXJydXB0KHN0cnVjdCBoYWwyX2NvZGVjICphZGMpCit7CisJaW50IHJ1bm5pbmc7CisKKwlzcGluX2xvY2soJmFkYy0+bG9jayk7CisJLyogaWYgaGVhZCBidWZmZXIgY29udGFpbnMgbm9uemVybyBzYW1wbGVzIERNQSBzdHJlYW0gd2FzIGFscmVhZHkKKwkgKiBzdG9wcGVkICovCisJcnVubmluZyA9ICFhZGMtPmRlc2NbYWRjLT5oZWFkXS5jbnQ7CisJYWRjLT5kZXNjW2FkYy0+aGVhZF0uY250ID0gSDJfQkxPQ0tfU0laRTsKKwlhZGMtPmRlc2NbYWRjLT5oZWFkXS5kZXNjLmNudGluZm8gPSBIUENETUFfWElFIHwgSFBDRE1BX0VPUjsKKwkvKiB3ZSBqdXN0IHByb2NjZXNzZWQgZW1wdHkgYnVmZmVyLCBkb24ndCB1cGRhdGUgaGVhZCBwb2ludGVyICovCisJaWYgKHJ1bm5pbmcpCisJCWhhbDJfaW5jX2hlYWQoYWRjKTsKKwlzcGluX3VubG9jaygmYWRjLT5sb2NrKTsKKworCXdha2VfdXAoJmFkYy0+ZG1hX3dhaXQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgaGFsMl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyID0gKHN0cnVjdCBoYWwyX2NhcmQqKWRldl9pZDsKKwlpcnFyZXR1cm5fdCByZXQgPSBJUlFfTk9ORTsKKworCS8qIGRlY2lkZSB3aGF0IGNhdXNlZCB0aGlzIGludGVycnVwdCAqLworCWlmIChoYWwyLT5kYWMucGJ1cy5wYnVzLT5wYmRtYV9jdHJsICYgSFBDM19QRE1BQ1RSTF9JTlQpIHsKKwkJaGFsMl9kYWNfaW50ZXJydXB0KCZoYWwyLT5kYWMpOworCQlyZXQgPSBJUlFfSEFORExFRDsKKwl9CisJaWYgKGhhbDItPmFkYy5wYnVzLnBidXMtPnBiZG1hX2N0cmwgJiBIUEMzX1BETUFDVFJMX0lOVCkgeworCQloYWwyX2FkY19pbnRlcnJ1cHQoJmhhbDItPmFkYyk7CisJCXJldCA9IElSUV9IQU5ETEVEOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGhhbDJfY29tcHV0ZV9yYXRlKHN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdW5zaWduZWQgc2hvcnQgbW9kOworCQorCURFQlVHKCJyYXRlOiAlZFxuIiwgcmF0ZSk7CisJCisJaWYgKHJhdGUgPCA0MDAwKSByYXRlID0gNDAwMDsKKwllbHNlIGlmIChyYXRlID4gNDgwMDApIHJhdGUgPSA0ODAwMDsKKworCWlmICg0NDEwMCAlIHJhdGUgPCA0ODAwMCAlIHJhdGUpIHsKKwkJbW9kID0gNCAqIDQ0MTAwIC8gcmF0ZTsKKwkJY29kZWMtPm1hc3RlciA9IDQ0MTAwOworCX0gZWxzZSB7CisJCW1vZCA9IDQgKiA0ODAwMCAvIHJhdGU7CisJCWNvZGVjLT5tYXN0ZXIgPSA0ODAwMDsKKwl9CisKKwljb2RlYy0+aW5jID0gNDsKKwljb2RlYy0+bW9kID0gbW9kOworCXJhdGUgPSA0ICogY29kZWMtPm1hc3RlciAvIG1vZDsKKworCURFQlVHKCJyZWFsX3JhdGU6ICVkXG4iLCByYXRlKTsKKworCXJldHVybiByYXRlOworfQorCitzdGF0aWMgdm9pZCBoYWwyX3NldF9kYWNfcmF0ZShzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCXVuc2lnbmVkIGludCBtYXN0ZXIgPSBoYWwyLT5kYWMubWFzdGVyOworCWludCBpbmMgPSBoYWwyLT5kYWMuaW5jOworCWludCBtb2QgPSBoYWwyLT5kYWMubW9kOworCisJREVCVUcoIm1hc3RlcjogJWQgaW5jOiAlZCBtb2Q6ICVkXG4iLCBtYXN0ZXIsIGluYywgbW9kKTsKKwkKKwloYWwyX2lfd3JpdGUxNihoYWwyLCBIMklfQlJFUzFfQzEsIChtYXN0ZXIgPT0gNDQxMDApID8gMSA6IDApOworCWhhbDJfaV93cml0ZTMyKGhhbDIsIEgySV9CUkVTMV9DMiwgKCgweGZmZmYgJiAoaW5jIC0gbW9kIC0gMSkpIDw8IDE2KSB8IGluYyk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbDJfc2V0X2FkY19yYXRlKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIpCit7CisJdW5zaWduZWQgaW50IG1hc3RlciA9IGhhbDItPmFkYy5tYXN0ZXI7CisJaW50IGluYyA9IGhhbDItPmFkYy5pbmM7CisJaW50IG1vZCA9IGhhbDItPmFkYy5tb2Q7CisKKwlERUJVRygibWFzdGVyOiAlZCBpbmM6ICVkIG1vZDogJWRcbiIsIG1hc3RlciwgaW5jLCBtb2QpOworCQorCWhhbDJfaV93cml0ZTE2KGhhbDIsIEgySV9CUkVTMl9DMSwgKG1hc3RlciA9PSA0NDEwMCkgPyAxIDogMCk7CisJaGFsMl9pX3dyaXRlMzIoaGFsMiwgSDJJX0JSRVMyX0MyLCAoKDB4ZmZmZiAmIChpbmMgLSBtb2QgLSAxKSkgPDwgMTYpIHwgaW5jKTsKK30KKworc3RhdGljIHZvaWQgaGFsMl9zZXR1cF9kYWMoc3RydWN0IGhhbDJfY2FyZCAqaGFsMikKK3sKKwl1bnNpZ25lZCBpbnQgZmlmb2JlZywgZmlmb2VuZCwgaGlnaHdhdGVyLCBzYW1wbGVfc2l6ZTsKKwlzdHJ1Y3QgaGFsMl9wYnVzICpwYnVzID0gJmhhbDItPmRhYy5wYnVzOworCisJREVCVUcoImhhbDJfc2V0dXBfZGFjXG4iKTsKKwkKKwkvKiBOb3cgd2Ugc2V0IHVwIHNvbWUgUEJVUyBpbmZvcm1hdGlvbi4gVGhlIFBCVVMgbmVlZHMgaW5mb3JtYXRpb24gYWJvdXQKKwkgKiB3aGF0IHBvcnRpb24gb2YgdGhlIGZpZm8gaXQgd2lsbCB1c2UuIElmIGl0J3MgcmVjZWl2aW5nIG9yCisJICogdHJhbnNtaXR0aW5nLCBhbmQgZmluYWxseSB3aGV0aGVyIHRoZSBzdHJlYW0gaXMgbGl0dGxlIGVuZGlhbiBvciBiaWcKKwkgKiBlbmRpYW4uIFRoZSBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIGxhdGVyLCBvbiB0aGUgc3RhcnQgY2FsbC4KKwkgKi8KKwlzYW1wbGVfc2l6ZSA9IDIgKiBoYWwyLT5kYWMudm9pY2VzOworCS8qIEZpZm8gc2hvdWxkIGJlIHNldCB0byBob2xkIGV4YWN0bHkgZm91ciBzYW1wbGVzLiBIaWdod2F0ZXIgbWFyaworCSAqIHNob3VsZCBiZSBzZXQgdG8gdHdvIHNhbXBsZXMuICovCisJaGlnaHdhdGVyID0gKHNhbXBsZV9zaXplICogMikgPj4gMTsJLyogaGFsZndvcmRzICovCisJZmlmb2JlZyA9IDA7CQkJCS8qIHBsYXliYWNrIGlzIGZpcnN0ICovCisJZmlmb2VuZCA9IChzYW1wbGVfc2l6ZSAqIDQpID4+IDM7CS8qIGRvdWJsZXdvcmRzICovCisJcGJ1cy0+Y3RybCA9IEhQQzNfUERNQUNUUkxfUlQgfCBIUEMzX1BETUFDVFJMX0xEIHwKKwkJICAgICAoaGlnaHdhdGVyIDw8IDgpIHwgKGZpZm9iZWcgPDwgMTYpIHwgKGZpZm9lbmQgPDwgMjQpIHwKKwkJICAgICAoaGFsMi0+ZGFjLmZvcm1hdCAmIEFGTVRfUzE2X0xFID8gSFBDM19QRE1BQ1RSTF9TRUwgOiAwKTsKKwkvKiBXZSBkaXNhYmxlIGV2ZXJ5dGhpbmcgYmVmb3JlIHdlIGRvIGFueXRoaW5nIGF0IGFsbCAqLworCXBidXMtPnBidXMtPnBiZG1hX2N0cmwgPSBIUEMzX1BETUFDVFJMX0xEOworCWhhbDJfaV9jbGVhcmJpdDE2KGhhbDIsIEgySV9ETUFfUE9SVF9FTiwgSDJJX0RNQV9QT1JUX0VOX0NPREVDVFgpOworCS8qIFNldHVwIHRoZSBIQUwyIGZvciBwbGF5YmFjayAqLworCWhhbDJfc2V0X2RhY19yYXRlKGhhbDIpOworCS8qIFNldCBlbmRpYW5lc3MgKi8KKwlpZiAoaGFsMi0+ZGFjLmZvcm1hdCAmIEFGTVRfUzE2X0xFKQorCQloYWwyX2lfc2V0Yml0MTYoaGFsMiwgSDJJX0RNQV9FTkQsIEgySV9ETUFfRU5EX0NPREVDVFgpOworCWVsc2UKKwkJaGFsMl9pX2NsZWFyYml0MTYoaGFsMiwgSDJJX0RNQV9FTkQsIEgySV9ETUFfRU5EX0NPREVDVFgpOworCS8qIFNldCBETUEgYnVzICovCisJaGFsMl9pX3NldGJpdDE2KGhhbDIsIEgySV9ETUFfRFJWLCAoMSA8PCBwYnVzLT5wYnVzbnIpKTsKKwkvKiBXZSBhcmUgdXNpbmcgMXN0IEJyZXNlbmhhbSBjbG9jayBnZW5lcmF0b3IgZm9yIHBsYXliYWNrICovCisJaGFsMl9pX3dyaXRlMTYoaGFsMiwgSDJJX0RBQ19DMSwgKHBidXMtPnBidXNuciA8PCBIMklfQzFfRE1BX1NISUZUKQorCQkJfCAoMSA8PCBIMklfQzFfQ0xLSURfU0hJRlQpCisJCQl8IChoYWwyLT5kYWMudm9pY2VzIDw8IEgySV9DMV9EQVRBVF9TSElGVCkpOworfQorCitzdGF0aWMgdm9pZCBoYWwyX3NldHVwX2FkYyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCXVuc2lnbmVkIGludCBmaWZvYmVnLCBmaWZvZW5kLCBoaWdod2F0ZXIsIHNhbXBsZV9zaXplOworCXN0cnVjdCBoYWwyX3BidXMgKnBidXMgPSAmaGFsMi0+YWRjLnBidXM7CisKKwlERUJVRygiaGFsMl9zZXR1cF9hZGNcbiIpOworCisJc2FtcGxlX3NpemUgPSAyICogaGFsMi0+YWRjLnZvaWNlczsKKwloaWdod2F0ZXIgPSAoc2FtcGxlX3NpemUgKiAyKSA+PiAxOwkJLyogaGFsZndvcmRzICovCisJZmlmb2JlZyA9ICg0ICogNCkgPj4gMzsJCQkJLyogcmVjb3JkIGlzIHNlY29uZCAqLworCWZpZm9lbmQgPSAoNCAqIDQgKyBzYW1wbGVfc2l6ZSAqIDQpID4+IDM7CS8qIGRvdWJsZXdvcmRzICovCisJcGJ1cy0+Y3RybCA9IEhQQzNfUERNQUNUUkxfUlQgfCBIUEMzX1BETUFDVFJMX1JDViB8IEhQQzNfUERNQUNUUkxfTEQgfCAKKwkJICAgICAoaGlnaHdhdGVyIDw8IDgpIHwgKGZpZm9iZWcgPDwgMTYpIHwgKGZpZm9lbmQgPDwgMjQpIHwKKwkJICAgICAoaGFsMi0+YWRjLmZvcm1hdCAmIEFGTVRfUzE2X0xFID8gSFBDM19QRE1BQ1RSTF9TRUwgOiAwKTsKKwlwYnVzLT5wYnVzLT5wYmRtYV9jdHJsID0gSFBDM19QRE1BQ1RSTF9MRDsKKwloYWwyX2lfY2xlYXJiaXQxNihoYWwyLCBIMklfRE1BX1BPUlRfRU4sIEgySV9ETUFfUE9SVF9FTl9DT0RFQ1IpOworCS8qIFNldHVwIHRoZSBIQUwyIGZvciByZWNvcmQgKi8KKwloYWwyX3NldF9hZGNfcmF0ZShoYWwyKTsKKwkvKiBTZXQgZW5kaWFuZXNzICovCisJaWYgKGhhbDItPmFkYy5mb3JtYXQgJiBBRk1UX1MxNl9MRSkKKwkJaGFsMl9pX3NldGJpdDE2KGhhbDIsIEgySV9ETUFfRU5ELCBIMklfRE1BX0VORF9DT0RFQ1IpOworCWVsc2UKKwkJaGFsMl9pX2NsZWFyYml0MTYoaGFsMiwgSDJJX0RNQV9FTkQsIEgySV9ETUFfRU5EX0NPREVDUik7CisJLyogU2V0IERNQSBidXMgKi8KKwloYWwyX2lfc2V0Yml0MTYoaGFsMiwgSDJJX0RNQV9EUlYsICgxIDw8IHBidXMtPnBidXNucikpOworCS8qIFdlIGFyZSB1c2luZyAybmQgQnJlc2VuaGFtIGNsb2NrIGdlbmVyYXRvciBmb3IgcmVjb3JkICovCisJaGFsMl9pX3dyaXRlMTYoaGFsMiwgSDJJX0FEQ19DMSwgKHBidXMtPnBidXNuciA8PCBIMklfQzFfRE1BX1NISUZUKQorCQkJfCAoMiA8PCBIMklfQzFfQ0xLSURfU0hJRlQpCisJCQl8IChoYWwyLT5hZGMudm9pY2VzIDw8IEgySV9DMV9EQVRBVF9TSElGVCkpOworfQorCitzdGF0aWMgZG1hX2FkZHJfdCBoYWwyX2Rlc2NfYWRkcihzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMsIGludCBpKQoreworCWlmICgtLWkgPCAwKQorCQlpID0gY29kZWMtPmRlc2NfY291bnQgLSAxOworCXJldHVybiBjb2RlYy0+ZGVzY1tpXS5kZXNjLnBuZXh0OworfQorCitzdGF0aWMgdm9pZCBoYWwyX3N0YXJ0X2RhYyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCXN0cnVjdCBoYWwyX2NvZGVjICpkYWMgPSAmaGFsMi0+ZGFjOworCXN0cnVjdCBoYWwyX3BidXMgKnBidXMgPSAmZGFjLT5wYnVzOworCisJcGJ1cy0+cGJ1cy0+cGJkbWFfZHB0ciA9IGhhbDJfZGVzY19hZGRyKGRhYywgZGFjLT50YWlsKTsKKwlwYnVzLT5wYnVzLT5wYmRtYV9jdHJsID0gcGJ1cy0+Y3RybCB8IEhQQzNfUERNQUNUUkxfQUNUOworCS8qIGVuYWJsZSBEQUMgKi8KKwloYWwyX2lfc2V0Yml0MTYoaGFsMiwgSDJJX0RNQV9QT1JUX0VOLCBIMklfRE1BX1BPUlRfRU5fQ09ERUNUWCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbDJfc3RhcnRfYWRjKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIpCit7CisJc3RydWN0IGhhbDJfY29kZWMgKmFkYyA9ICZoYWwyLT5hZGM7CisJc3RydWN0IGhhbDJfcGJ1cyAqcGJ1cyA9ICZhZGMtPnBidXM7CisKKwlwYnVzLT5wYnVzLT5wYmRtYV9kcHRyID0gaGFsMl9kZXNjX2FkZHIoYWRjLCBhZGMtPmhlYWQpOworCXBidXMtPnBidXMtPnBiZG1hX2N0cmwgPSBwYnVzLT5jdHJsIHwgSFBDM19QRE1BQ1RSTF9BQ1Q7CisJLyogZW5hYmxlIEFEQyAqLworCWhhbDJfaV9zZXRiaXQxNihoYWwyLCBIMklfRE1BX1BPUlRfRU4sIEgySV9ETUFfUE9SVF9FTl9DT0RFQ1IpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGFsMl9zdG9wX2RhYyhzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCWhhbDItPmRhYy5wYnVzLnBidXMtPnBiZG1hX2N0cmwgPSBIUEMzX1BETUFDVFJMX0xEOworCS8qIFRoZSBIQUwyIGl0c2VsZiBtYXkgcmVtYWluIGVuYWJsZWQgc2FmZWx5ICovCit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBoYWwyX3N0b3BfYWRjKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIpCit7CisJaGFsMi0+YWRjLnBidXMucGJ1cy0+cGJkbWFfY3RybCA9IEhQQzNfUERNQUNUUkxfTEQ7Cit9CisKK3N0YXRpYyBpbnQgaGFsMl9hbGxvY19kbWFidWYoc3RydWN0IGhhbDJfY29kZWMgKmNvZGVjLCBpbnQgc2l6ZSwKKwkJCSAgICAgaW50IGNvdW50LCBpbnQgY250aW5mbywgaW50IGRpcikKK3sKKwlzdHJ1Y3QgaGFsMl9kZXNjICpkZXNjLCAqZG1hX2FkZHI7CisJaW50IGk7CisKKwlERUJVRygiYWxsb2NhdGluZyAlZGsgRE1BIGJ1ZmZlci5cbiIsIHNpemUgLyAxMDI0KTsKKworCWNvZGVjLT5idWZmZXIgPSAodW5zaWduZWQgY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTCB8IEdGUF9ETUEsCisJCQkJCQkJICBnZXRfb3JkZXIoc2l6ZSkpOworCWlmICghY29kZWMtPmJ1ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisJZGVzYyA9IGRtYV9hbGxvY19jb2hlcmVudChOVUxMLCBjb3VudCAqIHNpemVvZihzdHJ1Y3QgaGFsMl9kZXNjKSwKKwkJCQkgIChkbWFfYWRkcl90ICopJmRtYV9hZGRyLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRlc2MpIHsKKwkJZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZyljb2RlYy0+YnVmZmVyLCBnZXRfb3JkZXIoc2l6ZSkpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJY29kZWMtPmRlc2MgPSBkZXNjOworCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCWRlc2MtPmRlc2MucGJ1ZiA9IGRtYV9tYXBfc2luZ2xlKE5VTEwsCisJCQkodm9pZCAqKShjb2RlYy0+YnVmZmVyICsgaSAqIEgyX0JMT0NLX1NJWkUpLAorCQkJSDJfQkxPQ0tfU0laRSwgZGlyKTsKKwkJZGVzYy0+ZGVzYy5jbnRpbmZvID0gY250aW5mbzsKKwkJZGVzYy0+ZGVzYy5wbmV4dCA9IChpID09IGNvdW50IC0gMSkgPworCQkJCSAgICh1MzIpZG1hX2FkZHIgOiAodTMyKShkbWFfYWRkciArIGkgKyAxKTsKKwkJZGVzYy0+Y250ID0gMDsKKwkJZGVzYysrOworCX0KKwljb2RlYy0+ZGVzY19jb3VudCA9IGNvdW50OworCWNvZGVjLT5oZWFkID0gY29kZWMtPnRhaWwgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbDJfYWxsb2NfZGFjX2RtYWJ1ZihzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIGhhbDJfYWxsb2NfZG1hYnVmKGNvZGVjLCBIMl9EQUNfQlVGU0laRSwKKwkJCQkgSDJfREFDX0JVRlNJWkUgLyBIMl9CTE9DS19TSVpFLAorCQkJCSBIUENETUFfWElFIHwgSFBDRE1BX0VPWCwKKwkJCQkgRE1BX1RPX0RFVklDRSk7Cit9CisKK3N0YXRpYyBpbnQgaGFsMl9hbGxvY19hZGNfZG1hYnVmKHN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gaGFsMl9hbGxvY19kbWFidWYoY29kZWMsIEgyX0FEQ19CVUZTSVpFLAorCQkJCSBIMl9BRENfQlVGU0laRSAvIEgyX0JMT0NLX1NJWkUsCisJCQkJIEhQQ0RNQV9YSUUgfCBIMl9CTE9DS19TSVpFLAorCQkJCSBETUFfVE9fREVWSUNFKTsKK30KKworc3RhdGljIHZvaWQgaGFsMl9mcmVlX2RtYWJ1ZihzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMsIGludCBzaXplLCBpbnQgZGlyKQoreworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJaW50IGk7CisKKwlkbWFfYWRkciA9IGNvZGVjLT5kZXNjW2NvZGVjLT5kZXNjX2NvdW50IC0gMV0uZGVzYy5wbmV4dDsKKwlmb3IgKGkgPSAwOyBpIDwgY29kZWMtPmRlc2NfY291bnQ7IGkrKykKKwkJZG1hX3VubWFwX3NpbmdsZShOVUxMLCBjb2RlYy0+ZGVzY1tpXS5kZXNjLnBidWYsCisJCQkJIEgyX0JMT0NLX1NJWkUsIGRpcik7CisJZG1hX2ZyZWVfY29oZXJlbnQoTlVMTCwgY29kZWMtPmRlc2NfY291bnQgKiBzaXplb2Yoc3RydWN0IGhhbDJfZGVzYyksCisJCQkgICh2b2lkICopY29kZWMtPmRlc2MsIGRtYV9hZGRyKTsKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKWNvZGVjLT5idWZmZXIsIGdldF9vcmRlcihzaXplKSk7Cit9CisKK3N0YXRpYyB2b2lkIGhhbDJfZnJlZV9kYWNfZG1hYnVmKHN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYykKK3sKKwlyZXR1cm4gaGFsMl9mcmVlX2RtYWJ1Zihjb2RlYywgSDJfREFDX0JVRlNJWkUsIERNQV9UT19ERVZJQ0UpOworfQorCitzdGF0aWMgdm9pZCBoYWwyX2ZyZWVfYWRjX2RtYWJ1ZihzdHJ1Y3QgaGFsMl9jb2RlYyAqY29kZWMpCit7CisJcmV0dXJuIGhhbDJfZnJlZV9kbWFidWYoY29kZWMsIEgyX0FEQ19CVUZTSVpFLCBETUFfRlJPTV9ERVZJQ0UpOworfQorCisvKiAKKyAqIEFkZCAnY291bnQnIGJ5dGVzIHRvICdidWZmZXInIGZyb20gRE1BIHJpbmcgYnVmZmVycy4gUmV0dXJuIG51bWJlciBvZgorICogYnl0ZXMgYWRkZWQgb3IgLUVGQVVMVCBpZiBjb3B5X2Zyb21fdXNlciBmYWlsZWQuCisgKi8KK3N0YXRpYyBpbnQgaGFsMl9nZXRfYnVmZmVyKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIGNoYXIgKmJ1ZmZlciwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHNpemUsIHJldCA9IDA7CisJdW5zaWduZWQgY2hhciAqYnVmOworCXN0cnVjdCBoYWwyX2Rlc2MgKnRhaWw7CisJc3RydWN0IGhhbDJfY29kZWMgKmFkYyA9ICZoYWwyLT5hZGM7CisKKwlERUJVRygiZ2V0dGluZyAlZCBieXRlcyAiLCBjb3VudCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYWRjLT5sb2NrLCBmbGFncyk7CisJdGFpbCA9ICZhZGMtPmRlc2NbYWRjLT50YWlsXTsKKwkvKiBlbmFibGUgRE1BIHN0cmVhbSBpZiB0aGVyZSBhcmUgbm8gZGF0YSAqLworCWlmICghdGFpbC0+Y250ICYmICEoYWRjLT5wYnVzLnBidXMtPnBiZG1hX2N0cmwgJiBIUEMzX1BETUFDVFJMX0lTQUNUKSkKKwkJaGFsMl9zdGFydF9hZGMoaGFsMik7CisJd2hpbGUgKHRhaWwtPmNudCA+IDAgJiYgY291bnQgPiAwKSB7CisJCXNpemUgPSBtaW4oKGludCl0YWlsLT5jbnQsIGNvdW50KTsKKwkJYnVmID0gJmFkYy0+YnVmZmVyWyhhZGMtPnRhaWwgKyAxKSAqIEgyX0JMT0NLX1NJWkUgLSB0YWlsLT5jbnRdOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGMtPmxvY2ssIGZsYWdzKTsKKwkJZG1hX3N5bmNfc2luZ2xlKE5VTEwsIHRhaWwtPmRlc2MucGJ1Ziwgc2l6ZSwgRE1BX0ZST01fREVWSUNFKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGJ1Ziwgc2l6ZSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRjLT5sb2NrLCBmbGFncyk7CisJCXRhaWwtPmNudCAtPSBzaXplOworCQkvKiBidWZmZXIgaXMgZW1wdHksIHVwZGF0ZSB0YWlsIHBvaW50ZXIgKi8KKwkJaWYgKHRhaWwtPmNudCA9PSAwKSB7CisJCQl0YWlsLT5kZXNjLmNudGluZm8gPSBIUENETUFfWElFIHwgSDJfQkxPQ0tfU0laRTsKKwkJCWhhbDJfaW5jX3RhaWwoYWRjKTsKKwkJCXRhaWwgPSAmYWRjLT5kZXNjW2FkYy0+dGFpbF07CisJCQkvKiBlbmFibGUgRE1BIHN0cmVhbSBhZ2FpbiBpZiBuZWVkZWQgKi8KKwkJCWlmICghKGFkYy0+cGJ1cy5wYnVzLT5wYmRtYV9jdHJsICYgSFBDM19QRE1BQ1RSTF9JU0FDVCkpCisJCQkJaGFsMl9zdGFydF9hZGMoaGFsMik7CisJCX0KKwkJYnVmZmVyICs9IHNpemU7CisJCXJldCArPSBzaXplOworCQljb3VudCAtPSBzaXplOworCisJCURFQlVHKCIoJWQpICIsIHNpemUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGMtPmxvY2ssIGZsYWdzKTsKK291dDoKKwlERUJVRygiXG4iKTsKKworCXJldHVybiByZXQ7Cit9IAorCisvKiAKKyAqIEFkZCAnY291bnQnIGJ5dGVzIGZyb20gJ2J1ZmZlcicgdG8gRE1BIHJpbmcgYnVmZmVycy4gUmV0dXJuIG51bWJlciBvZgorICogYnl0ZXMgYWRkZWQgb3IgLUVGQVVMVCBpZiBjb3B5X2Zyb21fdXNlciBmYWlsZWQuCisgKi8KK3N0YXRpYyBpbnQgaGFsMl9hZGRfYnVmZmVyKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIGNoYXIgKmJ1ZmZlciwgaW50IGNvdW50KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciAqYnVmOworCWludCBzaXplLCByZXQgPSAwOworCXN0cnVjdCBoYWwyX2Rlc2MgKmhlYWQ7CisJc3RydWN0IGhhbDJfY29kZWMgKmRhYyA9ICZoYWwyLT5kYWM7CisKKwlERUJVRygiYWRkaW5nICVkIGJ5dGVzICIsIGNvdW50KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkYWMtPmxvY2ssIGZsYWdzKTsKKwloZWFkID0gJmRhYy0+ZGVzY1tkYWMtPmhlYWRdOworCXdoaWxlIChoZWFkLT5jbnQgPT0gMCAmJiBjb3VudCA+IDApIHsKKwkJc2l6ZSA9IG1pbigoaW50KUgyX0JMT0NLX1NJWkUsIGNvdW50KTsKKwkJYnVmID0gJmRhYy0+YnVmZmVyW2RhYy0+aGVhZCAqIEgyX0JMT0NLX1NJWkVdOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYnVmZmVyLCBzaXplKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisJCWRtYV9zeW5jX3NpbmdsZShOVUxMLCBoZWFkLT5kZXNjLnBidWYsIHNpemUsIERNQV9UT19ERVZJQ0UpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGFjLT5sb2NrLCBmbGFncyk7CisJCWhlYWQtPmRlc2MuY250aW5mbyA9IHNpemUgfCBIUENETUFfWElFOworCQloZWFkLT5jbnQgPSBzaXplOworCQlidWZmZXIgKz0gc2l6ZTsKKwkJcmV0ICs9IHNpemU7CisJCWNvdW50IC09IHNpemU7CisJCWhhbDJfaW5jX2hlYWQoZGFjKTsKKwkJaGVhZCA9ICZkYWMtPmRlc2NbZGFjLT5oZWFkXTsKKworCQlERUJVRygiKCVkKSAiLCBzaXplKTsKKwl9CisJaWYgKCEoZGFjLT5wYnVzLnBidXMtPnBiZG1hX2N0cmwgJiBIUEMzX1BETUFDVFJMX0lTQUNUKSAmJiByZXQgPiAwKQorCQloYWwyX3N0YXJ0X2RhYyhoYWwyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWMtPmxvY2ssIGZsYWdzKTsKK291dDoKKwlERUJVRygiXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNkZWZpbmUgaGFsMl9yZXNldF9kYWNfcG9pbnRlcihoYWwyKQloYWwyX3Jlc2V0X3BvaW50ZXIoaGFsMiwgMSkKKyNkZWZpbmUgaGFsMl9yZXNldF9hZGNfcG9pbnRlcihoYWwyKQloYWwyX3Jlc2V0X3BvaW50ZXIoaGFsMiwgMCkKK3N0YXRpYyB2b2lkIGhhbDJfcmVzZXRfcG9pbnRlcihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCBpbnQgaXNfZGFjKQoreworCWludCBpOworCXN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYyA9IChpc19kYWMpID8gJmhhbDItPmRhYyA6ICZoYWwyLT5hZGM7CisKKwlERUJVRygiaGFsMl9yZXNldF9wb2ludGVyXG4iKTsKKworCWZvciAoaSA9IDA7IGkgPCBjb2RlYy0+ZGVzY19jb3VudDsgaSsrKSB7CisJCWNvZGVjLT5kZXNjW2ldLmNudCA9IDA7CisJCWNvZGVjLT5kZXNjW2ldLmRlc2MuY250aW5mbyA9IEhQQ0RNQV9YSUUgfCAoaXNfZGFjKSA/CisJCQkJCSAgICAgIEhQQ0RNQV9FT1ggOiBIMl9CTE9DS19TSVpFOworCX0KKwljb2RlYy0+aGVhZCA9IGNvZGVjLT50YWlsID0gMDsKK30KKworc3RhdGljIGludCBoYWwyX3N5bmNfZGFjKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIpCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IGhhbDJfY29kZWMgKmRhYyA9ICZoYWwyLT5kYWM7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaWduZWQgbG9uZyB0aW1lb3V0ID0gMTAwMCAqIEgyX0JMT0NLX1NJWkUgKiAyICogZGFjLT52b2ljZXMgKgorCQkJICAgICAgSFogLyBkYWMtPnNhbXBsZV9yYXRlIC8gOTAwOworCisJd2hpbGUgKGRhYy0+cGJ1cy5wYnVzLT5wYmRtYV9jdHJsICYgSFBDM19QRE1BQ1RSTF9JU0FDVCkgeworCQlhZGRfd2FpdF9xdWV1ZSgmZGFjLT5kbWFfd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGFjLT5sb2NrLCBmbGFncyk7CisJCWlmIChkYWMtPmRlc2NbZGFjLT50YWlsXS5jbnQpCisJCQlyZXQgPSAtRVRJTUU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRhYy0+bG9jaywgZmxhZ3MpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCWlmIChyZXQpIHsKKwkJCWhhbDJfc3RvcF9kYWMoaGFsMik7CisJCQloYWwyX3Jlc2V0X2RhY19wb2ludGVyKGhhbDIpOworCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZkYWMtPmRtYV93YWl0LCAmd2FpdCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBoYWwyX3dyaXRlX21peGVyKHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIsIGludCBpbmRleCwgaW50IHZvbCkKK3sKKwl1bnNpZ25lZCBpbnQgbCwgciwgdG1wOworCisJREVCVUdfTUlYKCJtaXhlciAlZCB3cml0ZVxuIiwgaW5kZXgpOworCisJaWYgKGluZGV4ID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCAhbWl4dGFibGVbaW5kZXhdLmF2YWlsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXIgPSAodm9sID4+IDgpICYgMHhmZjsKKwlpZiAociA+IDEwMCkKKwkJciA9IDEwMDsKKwlsID0gdm9sICYgMHhmZjsKKwlpZiAobCA+IDEwMCkKKwkJbCA9IDEwMDsKKworCWhhbDItPm1peGVyLnZvbHVtZVttaXh0YWJsZVtpbmRleF0uaWR4XSA9IGwgfCAociA8PCA4KTsKKworCXN3aXRjaCAobWl4dGFibGVbaW5kZXhdLmlkeCkgeworCWNhc2UgSDJfTUlYX09VVFBVVF9BVFQ6CisKKwkJREVCVUdfTUlYKCJvdXRwdXQgYXR0ZW51YXRvciAlZCwlZFxuIiwgbCwgcik7CisKKwkJaWYgKHIgfCBsKSB7CisJCQl0bXAgPSBoYWwyX2lfbG9vazMyKGhhbDIsIEgySV9EQUNfQzIpOworCQkJdG1wICY9IH4oSDJJX0MyX0xfQVRUX00gfCBIMklfQzJfUl9BVFRfTSB8IEgySV9DMl9NVVRFKTsKKworCQkJLyogQXR0ZW51YXRvciBoYXMgZml2ZSBiaXRzICovCisJCQlsID0gMzEgKiAoMTAwIC0gbCkgLyA5OTsKKwkJCXIgPSAzMSAqICgxMDAgLSByKSAvIDk5OworCisJCQlERUJVR19NSVgoImxlZnQ6ICVkLCByaWdodCAlZFxuIiwgbCwgcik7CisKKwkJCXRtcCB8PSAobCA8PCBIMklfQzJfTF9BVFRfU0hJRlQpICYgSDJJX0MyX0xfQVRUX007CisJCQl0bXAgfD0gKHIgPDwgSDJJX0MyX1JfQVRUX1NISUZUKSAmIEgySV9DMl9SX0FUVF9NOworCQkJaGFsMl9pX3dyaXRlMzIoaGFsMiwgSDJJX0RBQ19DMiwgdG1wKTsKKwkJfSBlbHNlIAorCQkJaGFsMl9pX3NldGJpdDMyKGhhbDIsIEgySV9EQUNfQzIsIEgySV9DMl9NVVRFKTsKKwkJYnJlYWs7CisJY2FzZSBIMl9NSVhfSU5QVVRfR0FJTjoKKworCQlERUJVR19NSVgoImlucHV0IGdhaW4gJWQsJWRcbiIsIGwsIHIpOworCisJCXRtcCA9IGhhbDJfaV9sb29rMzIoaGFsMiwgSDJJX0FEQ19DMik7CisJCXRtcCAmPSB+KEgySV9DMl9MX0dBSU5fTSB8IEgySV9DMl9SX0dBSU5fTSk7CisKKwkJLyogR2FpbiBjb250cm9sIGhhcyBmb3VyIGJpdHMgKi8KKwkJbCA9IDE2ICogbCAvIDEwMDsKKwkJciA9IDE2ICogciAvIDEwMDsKKworCQlERUJVR19NSVgoImxlZnQ6ICVkLCByaWdodCAlZFxuIiwgbCwgcik7CisKKwkJdG1wIHw9IChsIDw8IEgySV9DMl9MX0dBSU5fU0hJRlQpICYgSDJJX0MyX0xfR0FJTl9NOworCQl0bXAgfD0gKHIgPDwgSDJJX0MyX1JfR0FJTl9TSElGVCkgJiBIMklfQzJfUl9HQUlOX007CisJCWhhbDJfaV93cml0ZTMyKGhhbDIsIEgySV9BRENfQzIsIHRtcCk7CisKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhhbDJfaW5pdF9taXhlcihzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQlpZiAobWl4dGFibGVbaV0uYXZhaWwpCisJCQloYWwyLT5taXhlci52b2x1bWVbbWl4dGFibGVbaV0uaWR4XSA9IDEwMCB8ICgxMDAgPDwgOCk7CisKKwkvKiBkaXNhYmxlIGF0dGVudWF0b3IgKi8KKwloYWwyX2lfd3JpdGUzMihoYWwyLCBIMklfREFDX0MyLCAwKTsKKwkvKiBzZXQgbWF4IGlucHV0IGdhaW4gKi8KKwloYWwyX2lfd3JpdGUzMihoYWwyLCBIMklfQURDX0MyLCBIMklfQzJfTVVURSB8CisJCQkoSDJJX0MyX0xfR0FJTl9NIDw8IEgySV9DMl9MX0dBSU5fU0hJRlQpIHwKKwkJCShIMklfQzJfUl9HQUlOX00gPDwgSDJJX0MyX1JfR0FJTl9TSElGVCkpOworCS8qIHNldCBtYXggdm9sdW1lICovCisJaGFsMi0+bWl4ZXIubWFzdGVyID0gMHhmZjsKKwloYWwyLT52b2xfcmVncy0+bGVmdCA9IDB4ZmY7CisJaGFsMi0+dm9sX3JlZ3MtPnJpZ2h0ID0gMHhmZjsKK30KKworLyoKKyAqIFhYWDogbGF0ZXIgaSdsbCBpbXBsZW1lbnQgbWl4ZXIgZm9yIG1haW4gdm9sdW1lIHdoaWNoIHdpbGwgYmUgZGlzYWJsZWQKKyAqIGJ5IGRlZmF1bHQuIGVuYWJsaW5nIGl0IHVzZXJzIHdpbGwgYmUgYWxsb3dlZCB0byBoYXZlIG1hc3RlciB2b2x1bWUgbGV2ZWwKKyAqIGNvbnRyb2wgb24gcGFuZWwgaW4gdGhlaXIgZmF2b3VyaXRlIFggZGVza3RvcAorICovCitzdGF0aWMgdm9pZCBoYWwyX3ZvbHVtZV9jb250cm9sKGludCBkaXJlY3Rpb24pCit7CisJdW5zaWduZWQgaW50IG1hc3RlciA9IGhhbDJfY2FyZFswXS0+bWl4ZXIubWFzdGVyOworCXN0cnVjdCBoYWwyX3ZvbF9yZWdzICp2b2wgPSBoYWwyX2NhcmRbMF0tPnZvbF9yZWdzOworCisJLyogdm9sdW1lIHVwICovCisJaWYgKGRpcmVjdGlvbiA+IDAgJiYgbWFzdGVyIDwgMHhmZikKKwkJbWFzdGVyKys7CisJLyogdm9sdW1lIGRvd24gKi8KKwllbHNlIGlmIChkaXJlY3Rpb24gPCAwICYmIG1hc3RlciA+IDApCisJCW1hc3Rlci0tOworCS8qIFRPRE86IG11dGUvdW5tdXRlICovCisJdm9sLT5sZWZ0ID0gbWFzdGVyOworCXZvbC0+cmlnaHQgPSBtYXN0ZXI7CisJaGFsMl9jYXJkWzBdLT5taXhlci5tYXN0ZXIgPSBtYXN0ZXI7Cit9CisKK3N0YXRpYyBpbnQgaGFsMl9taXhlcl9pb2N0bChzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCB2YWw7CisKKyAgICAgICAgaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCW1peGVyX2luZm8gaW5mbzsKKworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCXN0cmxjcHkoaW5mby5pZCwgaGFsMnN0ciwgc2l6ZW9mKGluZm8uaWQpKTsKKwkJc3RybGNweShpbmZvLm5hbWUsIGhhbDJzdHIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaW5mby5tb2RpZnlfY291bnRlciA9IGhhbDItPm1peGVyLm1vZGNudDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjbWQgPT0gU09VTkRfT0xEX01JWEVSX0lORk8pIHsKKwkJX29sZF9taXhlcl9pbmZvIGluZm87CisKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQlzdHJsY3B5KGluZm8uaWQsIGhhbDJzdHIsIHNpemVvZihpbmZvLmlkKSk7CisJCXN0cmxjcHkoaW5mby5uYW1lLCBoYWwyc3RyLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IE9TU19HRVRWRVJTSU9OKQorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgKGludCAqKWFyZyk7CisKKwlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ00nIHx8IF9JT0NfU0laRShjbWQpICE9IHNpemVvZihpbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgICAgIGlmIChfSU9DX0RJUihjbWQpID09IF9JT0NfUkVBRCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJCS8qIEdpdmUgdGhlIGN1cnJlbnQgcmVjb3JkIHNvdXJjZSAqLworCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCXZhbCA9IDA7CS8qIEZJWE1FICovCisJCQlicmVhazsKKwkJLyogR2l2ZSB0aGUgc3VwcG9ydGVkIG1peGVycywgYWxsIG9mIHRoZW0gc3VwcG9ydCBzdGVyZW8gKi8KKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOiB7CisJCQlpbnQgaTsKKworCQkJZm9yICh2YWwgPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQkJCWlmIChtaXh0YWJsZVtpXS5hdmFpbCkKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCWJyZWFrOworCQkJfQorCQkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQl2YWwgPSAwOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJdmFsID0gMDsKKwkJCWJyZWFrOworCQkvKiBSZWFkIGEgc3BlY2lmaWMgbWl4ZXIgKi8KKwkJZGVmYXVsdDogeworCQkJaW50IGkgPSBfSU9DX05SKGNtZCk7CisKKwkJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCAhbWl4dGFibGVbaV0uYXZhaWwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl2YWwgPSBoYWwyLT5taXhlci52b2x1bWVbbWl4dGFibGVbaV0uaWR4XTsKKwkJCWJyZWFrOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKilhcmcpOworCX0KKworICAgICAgICBpZiAoX0lPQ19ESVIoY21kKSAhPSAoX0lPQ19XUklURXxfSU9DX1JFQUQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWhhbDItPm1peGVyLm1vZGNudCsrOworCisJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCXJldHVybiAtRUZBVUxUOworCisJc3dpdGNoIChfSU9DX05SKGNtZCkpIHsKKwkvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQlyZXR1cm4gMDsJLyogRklYTUUgKi8KKwlkZWZhdWx0OgorCQlyZXR1cm4gaGFsMl93cml0ZV9taXhlcihoYWwyLCBfSU9DX05SKGNtZCksIHZhbCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFsMl9vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyID0gaGFsMl9taXhlcl9maW5kX2NhcmQoaW1pbm9yKGlub2RlKSk7CisKKwlpZiAoaGFsMikgeworCQlmaWxlLT5wcml2YXRlX2RhdGEgPSBoYWwyOworCQlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7CisJfQorCXJldHVybiAtRU5PREVWOworfQorCitzdGF0aWMgaW50IGhhbDJfcmVsZWFzZV9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaGFsMl9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBoYWwyX21peGVyX2lvY3RsKChzdHJ1Y3QgaGFsMl9jYXJkICopZmlsZS0+cHJpdmF0ZV9kYXRhLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgaGFsMl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgCisJCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCB2YWw7CisJc3RydWN0IGhhbDJfY2FyZCAqaGFsMiA9IChzdHJ1Y3QgaGFsMl9jYXJkICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBoYWwyX3N5bmNfZGFjKGhhbDIpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfTVVMVEksIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaGFsMl9zdG9wX2FkYyhoYWwyKTsKKwkJCWhhbDJfcmVzZXRfYWRjX3BvaW50ZXIoaGFsMik7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQloYWwyX3N0b3BfZGFjKGhhbDIpOworCQkJaGFsMl9yZXNldF9kYWNfcG9pbnRlcihoYWwyKTsKKwkJfQorCQlyZXR1cm4gMDsKKworIAljYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQloYWwyX3N0b3BfYWRjKGhhbDIpOworCQkJdmFsID0gaGFsMl9jb21wdXRlX3JhdGUoJmhhbDItPmFkYywgdmFsKTsKKwkJCWhhbDItPmFkYy5zYW1wbGVfcmF0ZSA9IHZhbDsKKwkJCWhhbDJfc2V0X2FkY19yYXRlKGhhbDIpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaGFsMl9zdG9wX2RhYyhoYWwyKTsKKwkJCXZhbCA9IGhhbDJfY29tcHV0ZV9yYXRlKCZoYWwyLT5kYWMsIHZhbCk7CisJCQloYWwyLT5kYWMuc2FtcGxlX3JhdGUgPSB2YWw7CisJCQloYWwyX3NldF9kYWNfcmF0ZShoYWwyKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQloYWwyX3N0b3BfYWRjKGhhbDIpOworCQkJaGFsMi0+YWRjLnZvaWNlcyA9ICh2YWwpID8gMiA6IDE7CisJCQloYWwyX3NldHVwX2FkYyhoYWwyKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWhhbDJfc3RvcF9kYWMoaGFsMik7CisJCQloYWwyLT5kYWMudm9pY2VzID0gKHZhbCkgPyAyIDogMTsKKwkJCWhhbDJfc2V0dXBfZGFjKGhhbDIpOworICAgICAgICAgICAgICAgIH0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQloYWwyX3N0b3BfYWRjKGhhbDIpOworCQkJCWhhbDItPmFkYy52b2ljZXMgPSAodmFsID09IDEpID8gMSA6IDI7CisJCQkJaGFsMl9zZXR1cF9hZGMoaGFsMik7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQloYWwyX3N0b3BfZGFjKGhhbDIpOworCQkJCWhhbDItPmRhYy52b2ljZXMgPSAodmFsID09IDEpID8gMSA6IDI7CisJCQkJaGFsMl9zZXR1cF9kYWMoaGFsMik7CisJCQl9CisJCX0KKwkJdmFsID0gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQl2YWwgPSBoYWwyLT5hZGMudm9pY2VzOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQl2YWwgPSBoYWwyLT5kYWMudm9pY2VzOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayAqLworICAgICAgICAgICAgICAgIHJldHVybiBwdXRfdXNlcihIMl9TVVBQT1JURURfRk9STUFUUywgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3RzIE9ORSBmbXQqLworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWlmICghKHZhbCAmIEgyX1NVUFBPUlRFRF9GT1JNQVRTKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJaGFsMl9zdG9wX2FkYyhoYWwyKTsKKwkJCQloYWwyLT5hZGMuZm9ybWF0ID0gdmFsOworCQkJCWhhbDJfc2V0dXBfYWRjKGhhbDIpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJaGFsMl9zdG9wX2RhYyhoYWwyKTsKKwkJCQloYWwyLT5kYWMuZm9ybWF0ID0gdmFsOworCQkJCWhhbDJfc2V0dXBfZGFjKGhhbDIpOworCQkJfQorCQl9IGVsc2UgeworCQkJdmFsID0gLUVJTlZBTDsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCXZhbCA9IGhhbDItPmFkYy5mb3JtYXQ7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQkJdmFsID0gaGFsMi0+ZGFjLmZvcm1hdDsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6IHsKKwkJYXVkaW9fYnVmX2luZm8gaW5mbzsKKwkJaW50IGk7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCXN0cnVjdCBoYWwyX2NvZGVjICpkYWMgPSAmaGFsMi0+ZGFjOworCisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpbmZvLmZyYWdtZW50cyA9IDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYWMtPmxvY2ssIGZsYWdzKTsKKwkJZm9yIChpID0gMDsgaSA8IGRhYy0+ZGVzY19jb3VudDsgaSsrKQorCQkJaWYgKGRhYy0+ZGVzY1tpXS5jbnQgPT0gMCkKKwkJCQlpbmZvLmZyYWdtZW50cysrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWMtPmxvY2ssIGZsYWdzKTsKKwkJaW5mby5mcmFnc3RvdGFsID0gZGFjLT5kZXNjX2NvdW50OworCQlpbmZvLmZyYWdzaXplID0gSDJfQkxPQ0tfU0laRTsKKyAgICAgICAgICAgICAgICBpbmZvLmJ5dGVzID0gaW5mby5mcmFnc2l6ZSAqIGluZm8uZnJhZ21lbnRzOworCisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpID8gLUVGQVVMVCA6IDA7CisJfQorCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRTogeworCQlhdWRpb19idWZfaW5mbyBpbmZvOworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJc3RydWN0IGhhbDJfY29kZWMgKmFkYyA9ICZoYWwyLT5hZGM7CisKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaW5mby5mcmFnbWVudHMgPSAwOworCQlpbmZvLmJ5dGVzID0gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFkYy0+bG9jaywgZmxhZ3MpOworCQlmb3IgKGkgPSAwOyBpIDwgYWRjLT5kZXNjX2NvdW50OyBpKyspCisJCQlpZiAoYWRjLT5kZXNjW2ldLmNudCA+IDApIHsKKwkJCQlpbmZvLmZyYWdtZW50cysrOworCQkJCWluZm8uYnl0ZXMgKz0gYWRjLT5kZXNjW2ldLmNudDsKKwkJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRjLT5sb2NrLCBmbGFncyk7CisJCWluZm8uZnJhZ3N0b3RhbCA9IGFkYy0+ZGVzY19jb3VudDsKKwkJaW5mby5mcmFnc2l6ZSA9IEgyX0JMT0NLX1NJWkU7CisKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmluZm8sIHNpemVvZihpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwl9CisKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJcmV0dXJuIHB1dF91c2VyKEgyX0JMT0NLX1NJWkUsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJdmFsID0gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQl2YWwgPSBoYWwyLT5hZGMuc2FtcGxlX3JhdGU7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXZhbCA9IGhhbDItPmRhYy5zYW1wbGVfcmF0ZTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKWFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQl2YWwgPSAtRUlOVkFMOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXZhbCA9IGhhbDItPmFkYy52b2ljZXM7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXZhbCA9IGhhbDItPmRhYy52b2ljZXM7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlyZXR1cm4gcHV0X3VzZXIoMTYsIChpbnQgKilhcmcpOworCX0KKworCXJldHVybiBoYWwyX21peGVyX2lvY3RsKGhhbDIsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIHNzaXplX3QgaGFsMl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWZmZXIsCisJCQkgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3NpemVfdCBlcnI7CisJc3RydWN0IGhhbDJfY2FyZCAqaGFsMiA9IChzdHJ1Y3QgaGFsMl9jYXJkICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaGFsMl9jb2RlYyAqYWRjID0gJmhhbDItPmFkYzsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCWlmIChkb3duX2ludGVycnVwdGlibGUoJmFkYy0+c2VtKSkKKwkJcmV0dXJuIC1FSU5UUjsKKwlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJZXJyID0gaGFsMl9nZXRfYnVmZmVyKGhhbDIsIGJ1ZmZlciwgY291bnQpOworCQllcnIgPSBlcnIgPT0gMCA/IC1FQUdBSU4gOiBlcnI7CisJfSBlbHNlIHsKKwkJZG8geworCQkJLyogfjEwJSBsb25nZXIgKi8KKwkJCXNpZ25lZCBsb25nIHRpbWVvdXQgPSAxMDAwICogSDJfQkxPQ0tfU0laRSAqCisJCQkJMiAqIGFkYy0+dm9pY2VzICogSFogLyBhZGMtPnNhbXBsZV9yYXRlIC8gOTAwOworCQkJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkJCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCQkJc3NpemVfdCBjbnQgPSAwOworCisJCQllcnIgPSBoYWwyX2dldF9idWZmZXIoaGFsMiwgYnVmZmVyLCBjb3VudCk7CisJCQlpZiAoZXJyID4gMCkgeworCQkJCWNvdW50IC09IGVycjsKKwkJCQljbnQgKz0gZXJyOworCQkJCWJ1ZmZlciArPSBlcnI7CisJCQkJZXJyID0gY250OworCQkJfQorCQkJaWYgKGNvdW50ID4gMCAmJiBlcnIgPj0gMCkgeworCQkJCWFkZF93YWl0X3F1ZXVlKCZhZGMtPmRtYV93YWl0LCAmd2FpdCk7CisJCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCQlzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGMtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAoIWFkYy0+ZGVzY1thZGMtPnRhaWxdLmNudCkKKwkJCQkJZXJyID0gLUVBR0FJTjsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGMtPmxvY2ssIGZsYWdzKTsKKwkJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJCWVyciA9IC1FUkVTVEFSVFNZUzsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmYWRjLT5kbWFfd2FpdCwgJndhaXQpOworCQkJCWlmIChlcnIgPCAwKSB7CisJCQkJCWhhbDJfc3RvcF9hZGMoaGFsMik7CisJCQkJCWhhbDJfcmVzZXRfYWRjX3BvaW50ZXIoaGFsMik7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlIChjb3VudCA+IDAgJiYgZXJyID49IDApOworCX0KKwl1cCgmYWRjLT5zZW0pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHNzaXplX3QgaGFsMl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzc2l6ZV90IGVycjsKKwljaGFyICpidWYgPSAoY2hhciopIGJ1ZmZlcjsKKwlzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyID0gKHN0cnVjdCBoYWwyX2NhcmQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBoYWwyX2NvZGVjICpkYWMgPSAmaGFsMi0+ZGFjOworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisJaWYgKGRvd25faW50ZXJydXB0aWJsZSgmZGFjLT5zZW0pKQorCQlyZXR1cm4gLUVJTlRSOworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQllcnIgPSBoYWwyX2FkZF9idWZmZXIoaGFsMiwgYnVmLCBjb3VudCk7CisJCWVyciA9IGVyciA9PSAwID8gLUVBR0FJTiA6IGVycjsKKwl9IGVsc2UgeworCQlkbyB7CisJCQkvKiB+MTAlIGxvbmdlciAqLworCQkJc2lnbmVkIGxvbmcgdGltZW91dCA9IDEwMDAgKiBIMl9CTE9DS19TSVpFICoKKwkJCQkyICogZGFjLT52b2ljZXMgKiBIWiAvIGRhYy0+c2FtcGxlX3JhdGUgLyA5MDA7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCQkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJCQlzc2l6ZV90IGNudCA9IDA7CisKKwkJCWVyciA9IGhhbDJfYWRkX2J1ZmZlcihoYWwyLCBidWYsIGNvdW50KTsKKwkJCWlmIChlcnIgPiAwKSB7CisJCQkJY291bnQgLT0gZXJyOworCQkJCWNudCArPSBlcnI7CisJCQkJYnVmICs9IGVycjsKKwkJCQllcnIgPSBjbnQ7CisJCQl9CisJCQlpZiAoY291bnQgPiAwICYmIGVyciA+PSAwKSB7CisJCQkJYWRkX3dhaXRfcXVldWUoJmRhYy0+ZG1hX3dhaXQsICZ3YWl0KTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQkJCXNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRhYy0+bG9jaywgZmxhZ3MpOworCQkJCWlmIChkYWMtPmRlc2NbZGFjLT5oZWFkXS5jbnQpCisJCQkJCWVyciA9IC1FQUdBSU47CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGFjLT5sb2NrLCBmbGFncyk7CisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCQllcnIgPSAtRVJFU1RBUlRTWVM7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRhYy0+ZG1hX3dhaXQsICZ3YWl0KTsKKwkJCQlpZiAoZXJyIDwgMCkgeworCQkJCQloYWwyX3N0b3BfZGFjKGhhbDIpOworCQkJCQloYWwyX3Jlc2V0X2RhY19wb2ludGVyKGhhbDIpOworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoY291bnQgPiAwICYmIGVyciA+PSAwKTsKKwl9CisJdXAoJmRhYy0+c2VtKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaGFsMl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisJc3RydWN0IGhhbDJfY2FyZCAqaGFsMiA9IChzdHJ1Y3QgaGFsMl9jYXJkICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOworCisJCXBvbGxfd2FpdChmaWxlLCAmYWRjLT5kbWFfd2FpdCwgd2FpdCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZhZGMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGFkYy0+ZGVzY1thZGMtPnRhaWxdLmNudCA+IDApCisJCQltYXNrIHw9IFBPTExJTjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYWRjLT5sb2NrLCBmbGFncyk7CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0cnVjdCBoYWwyX2NvZGVjICpkYWMgPSAmaGFsMi0+ZGFjOworCisJCXBvbGxfd2FpdChmaWxlLCAmZGFjLT5kbWFfd2FpdCwgd2FpdCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkYWMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRhYy0+ZGVzY1tkYWMtPmhlYWRdLmNudCA9PSAwKQorCQkJbWFzayB8PSBQT0xMT1VUOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkYWMtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBoYWwyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyID0gaGFsMl9kc3BfZmluZF9jYXJkKGltaW5vcihpbm9kZSkpOworCisJaWYgKCFoYWwyKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBoYWwyOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0cnVjdCBoYWwyX2NvZGVjICphZGMgPSAmaGFsMi0+YWRjOworCisJCWlmIChhZGMtPnVzZWNvdW50KQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJLyogT1NTIHNwZWMgd2FudGVkIHVzIHRvIHVzZSA4IGJpdCwgOCBrSHogbW9ubyBieSBkZWZhdWx0LAorCQkgKiBidXQgSEFMMiBjYW4ndCBkbyA4Yml0IGF1ZGlvICovCisJCWFkYy0+Zm9ybWF0ID0gQUZNVF9TMTZfQkU7CisJCWFkYy0+dm9pY2VzID0gMTsKKwkJYWRjLT5zYW1wbGVfcmF0ZSA9IGhhbDJfY29tcHV0ZV9yYXRlKGFkYywgODAwMCk7CisJCWhhbDJfc2V0X2FkY19yYXRlKGhhbDIpOworCQllcnIgPSBoYWwyX2FsbG9jX2FkY19kbWFidWYoYWRjKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWhhbDJfc2V0dXBfYWRjKGhhbDIpOworCQlhZGMtPnVzZWNvdW50Kys7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdHJ1Y3QgaGFsMl9jb2RlYyAqZGFjID0gJmhhbDItPmRhYzsKKworCQlpZiAoZGFjLT51c2Vjb3VudCkKKwkJCXJldHVybiAtRUJVU1k7CisJCWRhYy0+Zm9ybWF0ID0gQUZNVF9TMTZfQkU7CisJCWRhYy0+dm9pY2VzID0gMTsKKwkJZGFjLT5zYW1wbGVfcmF0ZSA9IGhhbDJfY29tcHV0ZV9yYXRlKGRhYywgODAwMCk7CisJCWhhbDJfc2V0X2RhY19yYXRlKGhhbDIpOworCQllcnIgPSBoYWwyX2FsbG9jX2RhY19kbWFidWYoZGFjKTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisJCWhhbDJfc2V0dXBfZGFjKGhhbDIpOworCQlkYWMtPnVzZWNvdW50Kys7CisJfQorCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IGhhbDJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyID0gKHN0cnVjdCBoYWwyX2NhcmQgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RydWN0IGhhbDJfY29kZWMgKmFkYyA9ICZoYWwyLT5hZGM7CisKKwkJZG93bigmYWRjLT5zZW0pOworCQloYWwyX3N0b3BfYWRjKGhhbDIpOworCQloYWwyX2ZyZWVfYWRjX2RtYWJ1ZihhZGMpOworCQlhZGMtPnVzZWNvdW50LS07CisJCXVwKCZhZGMtPnNlbSk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdHJ1Y3QgaGFsMl9jb2RlYyAqZGFjID0gJmhhbDItPmRhYzsKKworCQlkb3duKCZkYWMtPnNlbSk7CisJCWhhbDJfc3luY19kYWMoaGFsMik7CisJCWhhbDJfZnJlZV9kYWNfZG1hYnVmKGRhYyk7CisJCWRhYy0+dXNlY291bnQtLTsKKwkJdXAoJmRhYy0+c2VtKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaGFsMl9hdWRpb19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBoYWwyX3JlYWQsCisJLndyaXRlCQk9IGhhbDJfd3JpdGUsCisJLnBvbGwJCT0gaGFsMl9wb2xsLAorCS5pb2N0bAkJPSBoYWwyX2lvY3RsLAorCS5vcGVuCQk9IGhhbDJfb3BlbiwKKwkucmVsZWFzZQk9IGhhbDJfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhhbDJfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IGhhbDJfaW9jdGxfbWl4ZGV2LAorCS5vcGVuCQk9IGhhbDJfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSBoYWwyX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworc3RhdGljIHZvaWQgaGFsMl9pbml0X2NvZGVjKHN0cnVjdCBoYWwyX2NvZGVjICpjb2RlYywgc3RydWN0IGhwYzNfcmVncyAqaHBjMywKKwkJCSAgICBpbnQgaW5kZXgpCit7CisJY29kZWMtPnBidXMucGJ1c25yID0gaW5kZXg7CisJY29kZWMtPnBidXMucGJ1cyA9ICZocGMzLT5wYmRtYVtpbmRleF07CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY29kZWMtPmRtYV93YWl0KTsKKwlpbml0X01VVEVYKCZjb2RlYy0+c2VtKTsKKwlzcGluX2xvY2tfaW5pdCgmY29kZWMtPmxvY2spOworfQorCitzdGF0aWMgaW50IGhhbDJfZGV0ZWN0KHN0cnVjdCBoYWwyX2NhcmQgKmhhbDIpCit7CisJdW5zaWduZWQgc2hvcnQgYm9hcmQsIG1ham9yLCBtaW5vcjsKKwl1bnNpZ25lZCBzaG9ydCByZXY7CisKKwkvKiByZXNldCBIQUwyICovCisJaGFsMl9pc3Jfd3JpdGUoaGFsMiwgMCk7CisJLyogcmVsZWFzZSByZXNldCAqLworCWhhbDJfaXNyX3dyaXRlKGhhbDIsIEgyX0lTUl9HTE9CQUxfUkVTRVRfTiB8IEgyX0lTUl9DT0RFQ19SRVNFVF9OKTsKKworCWhhbDJfaV93cml0ZTE2KGhhbDIsIEgySV9SRUxBWV9DLCBIMklfUkVMQVlfQ19TVEFURSk7IAorCWlmICgocmV2ID0gaGFsMl9yZXZfbG9vayhoYWwyKSkgJiBIMl9SRVZfQVVESU9fUFJFU0VOVCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlib2FyZCA9IChyZXYgJiBIMl9SRVZfQk9BUkRfTSkgPj4gMTI7CisJbWFqb3IgPSAocmV2ICYgSDJfUkVWX01BSk9SX0NISVBfTSkgPj4gNDsKKwltaW5vciA9IChyZXYgJiBIMl9SRVZfTUlOT1JfQ0hJUF9NKTsKKworCXByaW50ayhLRVJOX0lORk8gIlNHSSBIQUwyIHJldmlzaW9uICVpLiVpLiVpXG4iLAorCSAgICAgICBib2FyZCwgbWFqb3IsIG1pbm9yKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbDJfaW5pdF9jYXJkKHN0cnVjdCBoYWwyX2NhcmQgKipwaGFsMiwgc3RydWN0IGhwYzNfcmVncyAqaHBjMykKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgaGFsMl9jYXJkICpoYWwyOworCisJaGFsMiA9IChzdHJ1Y3QgaGFsMl9jYXJkICopIGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBoYWwyX2NhcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWhhbDIpCisJCXJldHVybiAtRU5PTUVNOworCW1lbXNldChoYWwyLCAwLCBzaXplb2Yoc3RydWN0IGhhbDJfY2FyZCkpOworCisJaGFsMi0+Y3RsX3JlZ3MgPSAoc3RydWN0IGhhbDJfY3RsX3JlZ3MgKilocGMzLT5wYnVzX2V4dHJlZ3NbMF07CisJaGFsMi0+YWVzX3JlZ3MgPSAoc3RydWN0IGhhbDJfYWVzX3JlZ3MgKilocGMzLT5wYnVzX2V4dHJlZ3NbMV07CisJaGFsMi0+dm9sX3JlZ3MgPSAoc3RydWN0IGhhbDJfdm9sX3JlZ3MgKilocGMzLT5wYnVzX2V4dHJlZ3NbMl07CisJaGFsMi0+c3luX3JlZ3MgPSAoc3RydWN0IGhhbDJfc3luX3JlZ3MgKilocGMzLT5wYnVzX2V4dHJlZ3NbM107CisKKwlpZiAoaGFsMl9kZXRlY3QoaGFsMikgPCAwKSB7CisJCXJldCA9IC1FTk9ERVY7CisJCWdvdG8gZnJlZV9jYXJkOworCX0KKworCWhhbDJfaW5pdF9jb2RlYygmaGFsMi0+ZGFjLCBocGMzLCAwKTsKKwloYWwyX2luaXRfY29kZWMoJmhhbDItPmFkYywgaHBjMywgMSk7CisKKwkvKgorCSAqIEFsbCBETUEgY2hhbm5lbCBpbnRlcmZhY2VzIGluIEhBTDIgYXJlIGRlc2lnbmVkIHRvIG9wZXJhdGUgd2l0aAorCSAqIFBCVVMgcHJvZ3JhbW1lZCBmb3IgMiBjeWNsZXMgaW4gRDMsIDIgY3ljbGVzIGluIEQ0IGFuZCAyIGN5Y2xlcworCSAqIGluIEQ1LiBIQUwyIGlzIGEgMTYtYml0IGRldmljZSB3aGljaCBjYW4gYWNjZXB0IGJvdGggYmlnIGFuZCBsaXR0bGUKKwkgKiBlbmRpYW4gZm9ybWF0LiBJdCBhc3N1bWVzIHRoYXQgZXZlbiBhZGRyZXNzIGJ5dGVzIGFyZSBvbiBoaWdoCisJICogcG9ydGlvbiBvZiBQQlVTICgxNTo4KSBhbmQgYXNzdW1lcyB0aGF0IEhQQzMgaXMgcHJvZ3JhbW1lZCB0bworCSAqIGFjY2VwdCBhIGxpdmUgKHVuc3luY2hyb25pemVkKSB2ZXJzaW9uIG9mIFBfRFJFUV9OIGZyb20gSEFMMi4KKwkgKi8KKyNkZWZpbmUgSEFMMl9QQlVTX0RNQUNGRyAoKDAgPDwgSFBDM19ETUFDRkdfRDNSX1NISUZUKSB8IFwKKwkJCSAgKDIgPDwgSFBDM19ETUFDRkdfRDRSX1NISUZUKSB8IFwKKwkJCSAgKDIgPDwgSFBDM19ETUFDRkdfRDVSX1NISUZUKSB8IFwKKwkJCSAgKDAgPDwgSFBDM19ETUFDRkdfRDNXX1NISUZUKSB8IFwKKwkJCSAgKDIgPDwgSFBDM19ETUFDRkdfRDRXX1NISUZUKSB8IFwKKwkJCSAgKDIgPDwgSFBDM19ETUFDRkdfRDVXX1NISUZUKSB8IFwKKwkJCQlIUEMzX0RNQUNGR19EUzE2IHwgXAorCQkJCUhQQzNfRE1BQ0ZHX0VWRU5ISSB8IFwKKwkJCQlIUEMzX0RNQUNGR19SVElNRSB8IFwKKwkJCSAgKDggPDwgSFBDM19ETUFDRkdfQlVSU1RfU0hJRlQpIHwgXAorCQkJCUhQQzNfRE1BQ0ZHX0RSUUxJVkUpCisJLyoKKwkgKiBJZ25vcmUgd2hhdCdzIG1lbnRpb25lZCBpbiB0aGUgc3BlY2lmaWNhdGlvbiBhbmQgd3JpdGUgdmFsdWUgd2hpY2gKKwkgKiB3b3JrcyBpbiBUaGUgUmVhbCBXb3JsZCAoVE0pCisJICovCisJaHBjMy0+cGJ1c19kbWFjZmdbaGFsMi0+ZGFjLnBidXMucGJ1c25yXVswXSA9IDB4ODIwODg0NDsKKwlocGMzLT5wYnVzX2RtYWNmZ1toYWwyLT5hZGMucGJ1cy5wYnVzbnJdWzBdID0gMHg4MjA4ODQ0OworCisJaWYgKHJlcXVlc3RfaXJxKFNHSV9IUENETUFfSVJRLCBoYWwyX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQloYWwyc3RyLCBoYWwyKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkhBTDI6IENhbid0IGdldCBpcnEgJWRcbiIsIFNHSV9IUENETUFfSVJRKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byBmcmVlX2NhcmQ7CisJfQorCisJaGFsMi0+ZGV2X2RzcCA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmaGFsMl9hdWRpb19mb3BzLCAtMSk7CisJaWYgKGhhbDItPmRldl9kc3AgPCAwKSB7CisJCXJldCA9IGhhbDItPmRldl9kc3A7CisJCWdvdG8gZnJlZV9pcnE7CisJfQorCisJaGFsMi0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmhhbDJfbWl4ZXJfZm9wcywgLTEpOworCWlmIChoYWwyLT5kZXZfbWl4ZXIgPCAwKSB7CisJCXJldCA9IGhhbDItPmRldl9taXhlcjsKKwkJZ290byB1bnJlZ2lzdGVyX2RzcDsKKwl9CisKKwloYWwyX2luaXRfbWl4ZXIoaGFsMik7CisKKwkqcGhhbDIgPSBoYWwyOworCXJldHVybiAwOwordW5yZWdpc3Rlcl9kc3A6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoaGFsMi0+ZGV2X2RzcCk7CitmcmVlX2lycToKKwlmcmVlX2lycShTR0lfSFBDRE1BX0lSUSwgaGFsMik7CitmcmVlX2NhcmQ6CisJa2ZyZWUoaGFsMik7CisKKwlyZXR1cm4gcmV0OworfQorCitleHRlcm4gdm9pZCAoKmluZHlfdm9sdW1lX2J1dHRvbikoaW50KTsKKworLyogCisgKiBBc3N1bWluZyBvbmx5IG9uZSBIQUwyIGNhcmQuIE1haWwgbWUgaWYgeW91IGV2ZXIgbWVldCBtYWNoaW5lIHdpdGgKKyAqIG1vcmUgdGhhbiBvbmUuCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IGluaXRfaGFsMih2b2lkKQoreworCWludCBpLCBlcnJvcjsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhDQVJEUzsgaSsrKQorCQloYWwyX2NhcmRbaV0gPSBOVUxMOworCisJZXJyb3IgPSBoYWwyX2luaXRfY2FyZCgmaGFsMl9jYXJkWzBdLCBocGMzYzApOworCisJLyogbGV0IEluZHkncyB2b2x1bWUgYnV0dG9ucyB3b3JrICovCisJaWYgKCFlcnJvciAmJiAhaXAyMl9pc19mdWxsaG91c2UoKSkKKwkJaW5keV92b2x1bWVfYnV0dG9uID0gaGFsMl92b2x1bWVfY29udHJvbDsKKworCXJldHVybiBlcnJvcjsKKworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXhpdF9oYWwyKHZvaWQpCit7CisJaW50IGk7CisKKwkvKiB1bnJlZ2lzdGVyIHZvbHVtZSBidXRvbnMgY2FsbGJhY2sgZnVuY3Rpb24gKi8KKwlpbmR5X3ZvbHVtZV9idXR0b24gPSBOVUxMOworCQorCWZvciAoaSA9IDA7IGkgPCBNQVhDQVJEUzsgaSsrKQorCQlpZiAoaGFsMl9jYXJkW2ldKSB7CisJCQlmcmVlX2lycShTR0lfSFBDRE1BX0lSUSwgaGFsMl9jYXJkW2ldKTsKKwkJCXVucmVnaXN0ZXJfc291bmRfZHNwKGhhbDJfY2FyZFtpXS0+ZGV2X2RzcCk7CisJCQl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGhhbDJfY2FyZFtpXS0+ZGV2X21peGVyKTsKKwkJCWtmcmVlKGhhbDJfY2FyZFtpXSk7CisJfQorfQorCittb2R1bGVfaW5pdChpbml0X2hhbDIpOworbW9kdWxlX2V4aXQoZXhpdF9oYWwyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPU1MgY29tcGF0aWJsZSBkcml2ZXIgZm9yIFNHSSBIQUwyIGF1ZGlvIik7CitNT0RVTEVfQVVUSE9SKCJMYWRpc2xhdiBNaWNobCIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL2hhbDIuaCBiL3NvdW5kL29zcy9oYWwyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkM2I1MgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9oYWwyLmgKQEAgLTAsMCArMSwyNDggQEAKKyNpZm5kZWYgX19IQUwyX0gKKyNkZWZpbmUgX19IQUwyX0gKKworLyoKKyAqICBEcml2ZXIgZm9yIEhBTDIgc291bmQgcHJvY2Vzc29ycworICogIENvcHlyaWdodCAoYykgMTk5OSBVbGYgQ2FybHNzb24gPHVsZmNAYnVuLmZhbGtlbmJlcmcuc2U+CisgKiAgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDAyLCAyMDAzIExhZGlzbGF2IE1pY2hsIDxsYWRpc0BsaW51eC1taXBzLm9yZz4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcyAKKyAqICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgorI2luY2x1ZGUgPGFzbS9zZ2kvaHBjMy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworLyogSW5kaXJlY3Qgc3RhdHVzIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgSDJfSVNSX1RTVEFUVVMJCTB4MDEJLyogUk86IHRyYW5zYWN0aW9uIHN0YXR1cyAxPWJ1c3kgKi8KKyNkZWZpbmUgSDJfSVNSX1VTVEFUVVMJCTB4MDIJLyogUk86IHV0aW1lIHN0YXR1cyBiaXQgMT1hcm1lZCAqLworI2RlZmluZSBIMl9JU1JfUVVBRF9NT0RFCTB4MDQJLyogY29kZWMgbW9kZSAwPWluZGlnbyAxPXF1YWQgKi8KKyNkZWZpbmUgSDJfSVNSX0dMT0JBTF9SRVNFVF9OCTB4MDgJLyogY2hpcCBnbG9iYWwgcmVzZXQgMD1yZXNldCAqLworI2RlZmluZSBIMl9JU1JfQ09ERUNfUkVTRVRfTgkweDEwCS8qIGNvZGVjL3N5bnRoIHJlc2V0IDA9cmVzZXQgICovCisKKy8qIFJldmlzaW9uIHJlZ2lzdGVyICovCisKKyNkZWZpbmUgSDJfUkVWX0FVRElPX1BSRVNFTlQJMHg4MDAwCS8qIFJPOiBhdWRpbyBwcmVzZW50IDA9cHJlc2VudCAqLworI2RlZmluZSBIMl9SRVZfQk9BUkRfTQkJMHg3MDAwCS8qIFJPOiBiaXRzIDE0OjEyLCBib2FyZCByZXZpc2lvbiAqLworI2RlZmluZSBIMl9SRVZfTUFKT1JfQ0hJUF9NCTB4MDBGMAkvKiBSTzogYml0cyA3OjQsIG1ham9yIGNoaXAgcmV2aXNpb24gKi8KKyNkZWZpbmUgSDJfUkVWX01JTk9SX0NISVBfTQkweDAwMEYJLyogUk86IGJpdHMgMzowLCBtaW5vciBjaGlwIHJldmlzaW9uICovCisKKy8qIEluZGlyZWN0IGFkZHJlc3MgcmVnaXN0ZXIgKi8KKworLyoKKyAqIEFkZHJlc3Mgb2YgaW5kaXJlY3QgaW50ZXJuYWwgcmVnaXN0ZXIgdG8gYmUgYWNjZXNzZWQuIEEgd3JpdGUgdG8gdGhpcworICogcmVnaXN0ZXIgaW5pdGlhdGVzIHJlYWQgb3Igd3JpdGUgYWNjZXNzIHRvIHRoZSBpbmRpcmVjdCByZWdpc3RlcnMgaW4gdGhlCisgKiBIQUwyLiBOb3RlIHRoYXQgdGhlcmUgYWYgZm91ciBpbmRpcmVjdCBkYXRhIHJlZ2lzdGVycyBmb3Igd3JpdGUgYWNjZXNzIHRvCisgKiByZWdpc3RlcnMgbGFyZ2VyIHRoYW4gMTYgYnl0ZS4KKyAqLworCisjZGVmaW5lIEgyX0lBUl9UWVBFX00JCTB4RjAwMAkvKiBiaXRzIDE1OjEyLCB0eXBlIG9mIGZ1bmN0aW9uYWwgKi8KKwkJCQkJLyogYmxvY2sgdGhlIHJlZ2lzdGVyIHJlc2lkZXMgaW4gKi8KKwkJCQkJLyogMT1ETUEgUG9ydCAqLworCQkJCQkvKiA5PUdsb2JhbCBETUEgQ29udHJvbCAqLworCQkJCQkvKiAyPUJyZXNlbmhhbSAqLworCQkJCQkvKiAzPVVuaXggVGltZXIgKi8KKyNkZWZpbmUgSDJfSUFSX05VTV9NCQkweDBGMDAJLyogYml0cyAxMTo4IGluc3RhbmNlIG9mIHRoZSAqLworCQkJCQkvKiBibG9ja2luIHdoaWNoIHRoZSBpbmRpcmVjdCAqLworCQkJCQkvKiByZWdpc3RlciByZXNpZGVzICovCisJCQkJCS8qIElmIElBUl9UWVBFX009RE1BIFBvcnQ6ICovCisJCQkJCS8qIDE9U3ludGggSW4gKi8KKwkJCQkJLyogMj1BRVMgSW4gKi8KKwkJCQkJLyogMz1BRVMgT3V0ICovCisJCQkJCS8qIDQ9REFDIE91dCAqLworCQkJCQkvKiA1PUFEQyBPdXQgKi8KKwkJCQkJLyogNj1TeW50aCBDb250cm9sICovCisJCQkJCS8qIElmIElBUl9UWVBFX009R2xvYmFsIERNQSBDb250cm9sOiAqLworCQkJCQkvKiAxPUNvbnRyb2wgKi8KKwkJCQkJLyogSWYgSUFSX1RZUEVfTT1CcmVzZW5oYW06ICovCisJCQkJCS8qIDE9QnJlc2VuaGFtIENsb2NrIEdlbiAxICovCisJCQkJCS8qIDI9QnJlc2VuaGFtIENsb2NrIEdlbiAyICovCisJCQkJCS8qIDM9QnJlc2VuaGFtIENsb2NrIEdlbiAzICovCisJCQkJCS8qIElmIElBUl9UWVBFX009VW5peCBUaW1lcjogKi8KKwkJCQkJLyogMT1Vbml4IFRpbWVyICovCisjZGVmaW5lIEgyX0lBUl9BQ0NFU1NfU0VMRUNUCTB4MDA4MAkvKiAxPXJlYWQgMD13cml0ZSAqLworI2RlZmluZSBIMl9JQVJfUEFSQU0JCTB4MDAwQwkvKiBQYXJhbWV0ZXIgU2VsZWN0ICovCisjZGVmaW5lIEgyX0lBUl9SQl9JTkRFWF9NCTB4MDAwMwkvKiBSZWFkIEJhY2sgSW5kZXggKi8KKwkJCQkJLyogMDA6d29yZDAgKi8KKwkJCQkJLyogMDE6d29yZDEgKi8KKwkJCQkJLyogMTA6d29yZDIgKi8KKwkJCQkJLyogMTE6d29yZDMgKi8KKy8qCisgKiBIQUwyIGludGVybmFsIGFkZHJlc3NpbmcKKyAqCisgKiBUaGUgSEFMMiBoYXMgImluZGlyZWN0IHJlZ2lzdGVycyIgKGlkcikgd2hpY2ggYXJlIGFjY2Vzc2VkIGJ5IHdyaXRpbmcgdG8gdGhlCisgKiBJbmRpcmVjdCBEYXRhIHJlZ2lzdGVycy4gV3JpdGUgdGhlIGFkZHJlc3MgdG8gdGhlIEluZGlyZWN0IEFkZHJlc3MgcmVnaXN0ZXIKKyAqIHRvIHRyYW5zZmVyIHRoZSBkYXRhLgorICoKKyAqIFdlIGRlZmluZSB0aGUgSDJJUl8qIHRvIHRoZSByZWFkIGFkZHJlc3MgYW5kIEgySVdfKiB0byB0aGUgd3JpdGUgYWRkcmVzcyBhbmQKKyAqIEgySV8qIHRvIGJlIGZpZWxkcyBpbiB3aGF0ZXZlciByZWdpc3RlciBpcyByZWZlcnJlZCB0by4KKyAqCisgKiBXaGVuIHdlIHdyaXRlIHRvIGluZGlyZWN0IHJlZ2lzdGVycyB3aGljaCBhcmUgbGFyZ2VyIHRoYW4gb25lIHdvcmQgKDE2IGJpdCkKKyAqIHdlIGhhdmUgdG8gZmlsbCBtb3JlIHRoYW4gb25lIGluZGlyZWN0IHJlZ2lzdGVyIGJlZm9yZSB3cml0aW5nLiBXaGVuIHdlIHJlYWQKKyAqIGJhY2sgaG93ZXZlciB3ZSBoYXZlIHRvIHJlYWQgc2V2ZXJhbCB0aW1lcywgZWFjaCB0aW1lIHdpdGggZGlmZmVyZW50IFJlYWQKKyAqIEJhY2sgSW5kZXhlcyAodGhlcmUgYXJlIGRlZnMgZm9yIGRvaW5nIHRoaXMgZWFzaWx5KS4KKyAqLworCisvKgorICogUmVsYXkgQ29udHJvbAorICovCisjZGVmaW5lIEgySV9SRUxBWV9DCQkweDkxMDAKKyNkZWZpbmUgSDJJX1JFTEFZX0NfU1RBVEUJMHgwMQkJLyogc3RhdGUgb2YgUkVMQVkgcGluIHNpZ25hbCAqLworCisvKiBETUEgcG9ydCBlbmFibGUgKi8KKworI2RlZmluZSBIMklfRE1BX1BPUlRfRU4JCTB4OTEwNAorI2RlZmluZSBIMklfRE1BX1BPUlRfRU5fU1lfSU4JMHgwMQkJLyogU3ludGhfaW4gRE1BIHBvcnQgKi8KKyNkZWZpbmUgSDJJX0RNQV9QT1JUX0VOX0FFU1JYCTB4MDIJCS8qIEFFUyByZWNlaXZlciBETUEgcG9ydCAqLworI2RlZmluZSBIMklfRE1BX1BPUlRfRU5fQUVTVFgJMHgwNAkJLyogQUVTIHRyYW5zbWl0dGVyIERNQSBwb3J0ICovCisjZGVmaW5lIEgySV9ETUFfUE9SVF9FTl9DT0RFQ1RYCTB4MDgJCS8qIENPREVDIHRyYW5zbWl0IERNQSBwb3J0ICovCisjZGVmaW5lIEgySV9ETUFfUE9SVF9FTl9DT0RFQ1IJMHgxMAkJLyogQ09ERUMgcmVjZWl2ZSBETUEgcG9ydCAqLworCisjZGVmaW5lIEgySV9ETUFfRU5ECQkweDkxMDggCQkvKiBnbG9iYWwgZG1hIGVuZGlhbiBzZWxlY3QgKi8KKyNkZWZpbmUgSDJJX0RNQV9FTkRfU1lfSU4JMHgwMQkJLyogU3ludGhfaW4gRE1BIHBvcnQgKi8KKyNkZWZpbmUgSDJJX0RNQV9FTkRfQUVTUlgJMHgwMgkJLyogQUVTIHJlY2VpdmVyIERNQSBwb3J0ICovCisjZGVmaW5lIEgySV9ETUFfRU5EX0FFU1RYCTB4MDQJCS8qIEFFUyB0cmFuc21pdHRlciBETUEgcG9ydCAqLworI2RlZmluZSBIMklfRE1BX0VORF9DT0RFQ1RYCTB4MDgJCS8qIENPREVDIHRyYW5zbWl0IERNQSBwb3J0ICovCisjZGVmaW5lIEgySV9ETUFfRU5EX0NPREVDUgkweDEwCQkvKiBDT0RFQyByZWNlaXZlIERNQSBwb3J0ICovCisJCQkJCQkvKiAwPWJfZW5kIDE9bF9lbmQgKi8KKworI2RlZmluZSBIMklfRE1BX0RSVgkJMHg5MTBDICAJLyogZ2xvYmFsIFBCVVMgRE1BIGVuYWJsZSAqLworCisjZGVmaW5lIEgySV9TWU5USF9DCQkweDExMDQJCS8qIFN5bnRoIERNQSBjb250cm9sICovCisKKyNkZWZpbmUgSDJJX0FFU1JYX0MJCTB4MTIwNAkgCS8qIEFFUyBSWCBkbWEgY29udHJvbCAqLworCisjZGVmaW5lIEgySV9DX1RTX0VOCQkweDIwCQkvKiBUaW1lc3RhbXAgZW5hYmxlICovCisjZGVmaW5lIEgySV9DX1RTX0ZSTVQJCTB4NDAJCS8qIFRpbWVzdGFtcCBmb3JtYXQgKi8KKyNkZWZpbmUgSDJJX0NfTkFVRElPCQkweDgwCQkvKiBTaWduIGV4dGVuZCAqLworCisvKiBBRVNSWCBDVEwsIDE2IGJpdCAqLworCisjZGVmaW5lIEgySV9BRVNUWF9DCQkweDEzMDQJCS8qIEFFUyBUWCBETUEgY29udHJvbCAqLworI2RlZmluZSBIMklfQUVTVFhfQ19DTEtJRF9TSElGVAkzCQkvKiBCcmVzZW5oYW0gQ2xvY2sgR2VuIDEtMyAqLworI2RlZmluZSBIMklfQUVTVFhfQ19DTEtJRF9NCTB4MTgKKyNkZWZpbmUgSDJJX0FFU1RYX0NfREFUQVRfU0hJRlQJOAkJLyogMT1tb25vIDI9c3RlcmVvICgzPXF1YWQpICovCisjZGVmaW5lIEgySV9BRVNUWF9DX0RBVEFUX00JMHgzMDAKKworLyogQ09ERUMgcmVnaXN0ZXJzICovCisKKyNkZWZpbmUgSDJJX0RBQ19DMQkJMHgxNDA0IAkJLyogREFDIERNQSBjb250cm9sLCAxNiBiaXQgKi8KKyNkZWZpbmUgSDJJX0RBQ19DMgkJMHgxNDA4CQkvKiBEQUMgRE1BIGNvbnRyb2wsIDMyIGJpdCAqLworI2RlZmluZSBIMklfQURDX0MxCQkweDE1MDQgCQkvKiBBREMgRE1BIGNvbnRyb2wsIDE2IGJpdCAqLworI2RlZmluZSBIMklfQURDX0MyCQkweDE1MDgJCS8qIEFEQyBETUEgY29udHJvbCwgMzIgYml0ICovCisKKy8qIEJpdHMgaW4gQ1RMMSByZWdpc3RlciAqLworCisjZGVmaW5lIEgySV9DMV9ETUFfU0hJRlQJMAkJLyogRE1BIGNoYW5uZWwgKi8KKyNkZWZpbmUgSDJJX0MxX0RNQV9NCQkweDcKKyNkZWZpbmUgSDJJX0MxX0NMS0lEX1NISUZUCTMJCS8qIEJyZXNlbmhhbSBDbG9jayBHZW4gMS0zICovCisjZGVmaW5lIEgySV9DMV9DTEtJRF9NCQkweDE4CisjZGVmaW5lIEgySV9DMV9EQVRBVF9TSElGVAk4CQkvKiAxPW1vbm8gMj1zdGVyZW8gKDM9cXVhZCkgKi8KKyNkZWZpbmUgSDJJX0MxX0RBVEFUX00JCTB4MzAwCisKKy8qIEJpdHMgaW4gQ1RMMiByZWdpc3RlciAqLworCisjZGVmaW5lIEgySV9DMl9SX0dBSU5fU0hJRlQJMAkJLyogcmlnaHQgYS9kIGlucHV0IGdhaW4gKi8JCisjZGVmaW5lIEgySV9DMl9SX0dBSU5fTQkJMHhmCQorI2RlZmluZSBIMklfQzJfTF9HQUlOX1NISUZUCTQJCS8qIGxlZnQgYS9kIGlucHV0IGdhaW4gKi8KKyNkZWZpbmUgSDJJX0MyX0xfR0FJTl9NCQkweGYwCisjZGVmaW5lIEgySV9DMl9SX1NFTAkJMHgxMDAJCS8qIHJpZ2h0IGlucHV0IHNlbGVjdCAqLworI2RlZmluZSBIMklfQzJfTF9TRUwJCTB4MjAwCQkvKiBsZWZ0IGlucHV0IHNlbGVjdCAqLworI2RlZmluZSBIMklfQzJfTVVURQkJMHg0MDAJCS8qIG11dGUgKi8KKyNkZWZpbmUgSDJJX0MyX0RPMQkJMHgwMDAxMDAwMAkvKiBkaWdpdGFsIG91dHB1dCBwb3J0IGJpdCAwICovCisjZGVmaW5lIEgySV9DMl9ETzIJCTB4MDAwMjAwMDAJLyogZGlnaXRhbCBvdXRwdXQgcG9ydCBiaXQgMSAqLworI2RlZmluZSBIMklfQzJfUl9BVFRfU0hJRlQJMTgJCS8qIHJpZ2h0IGQvYSBvdXRwdXQgLSAqLworI2RlZmluZSBIMklfQzJfUl9BVFRfTQkJMHgwMDdjMDAwMAkvKiBhdHRlbnVhdGlvbiAqLworI2RlZmluZSBIMklfQzJfTF9BVFRfU0hJRlQJMjMJCS8qIGxlZnQgZC9hIG91dHB1dCAtICovCisjZGVmaW5lIEgySV9DMl9MX0FUVF9NCQkweDBmODAwMDAwCS8qIGF0dGVudWF0aW9uICovCisKKyNkZWZpbmUgSDJJX1NZTlRIX01BUF9DCQkweDExMDQJCS8qIHN5bnRoIGRtYSBoYW5kc2hha2UgY3RybCAqLworCisvKiBDbG9jayBnZW5lcmF0b3IgQ1RMIDEsIDE2IGJpdCAqLworCisjZGVmaW5lIEgySV9CUkVTMV9DMQkJMHgyMTA0CisjZGVmaW5lIEgySV9CUkVTMl9DMQkJMHgyMjA0CisjZGVmaW5lIEgySV9CUkVTM19DMQkJMHgyMzA0CisKKyNkZWZpbmUgSDJJX0JSRVNfQzFfU0hJRlQJMAkJLyogMD00OC4wIDE9NDQuMSAyPWFlc19yeCAqLworI2RlZmluZSBIMklfQlJFU19DMV9NCQkweDAzCisJCQkJCisvKiBDbG9jayBnZW5lcmF0b3IgQ1RMIDIsIDMyIGJpdCAqLworCisjZGVmaW5lIEgySV9CUkVTMV9DMgkJMHgyMTA4CisjZGVmaW5lIEgySV9CUkVTMl9DMgkJMHgyMjA4CisjZGVmaW5lIEgySV9CUkVTM19DMgkJMHgyMzA4CisKKyNkZWZpbmUgSDJJX0JSRVNfQzJfSU5DX1NISUZUCTAJCS8qIGluY3JlbWVudCB2YWx1ZSAqLworI2RlZmluZSBIMklfQlJFU19DMl9JTkNfTQkweGZmZmYKKyNkZWZpbmUgSDJJX0JSRVNfQzJfTU9EX1NISUZUCTE2CQkvKiBtb2Rjb250cm9sIHZhbHVlICovCisjZGVmaW5lIEgySV9CUkVTX0MyX01PRF9NCTB4ZmZmZjAwMDAJLyogbW9kY3RybD0weGZmZmYmKG1vZGluYy0xKSAqLworCisvKiBVbml4IHRpbWVyLCA2NCBiaXQgKi8KKworI2RlZmluZSBIMklfVVRJTUUJCTB4MzEwNAorI2RlZmluZSBIMklfVVRJTUVfMF9MRAkJMHhmZmZmCQkvKiBtaWNyb3NlY29uZHMsIExTQidzICovCisjZGVmaW5lIEgySV9VVElNRV8xX0xEMAkJMHgwZgkJLyogbWljcm9zZWNvbmRzLCBNU0IncyAqLworI2RlZmluZSBIMklfVVRJTUVfMV9MRDEJCTB4ZjAJCS8qIHRlbnRocyBvZiBtaWNyb3NlY29uZHMgKi8KKyNkZWZpbmUgSDJJX1VUSU1FXzJfTEQJCTB4ZmZmZgkJLyogc2Vjb25kcywgTFNCJ3MgKi8KKyNkZWZpbmUgSDJJX1VUSU1FXzNfTEQJCTB4ZmZmZgkJLyogc2Vjb25kcywgTVNCJ3MgKi8KKworc3RydWN0IGhhbDJfY3RsX3JlZ3MgeworCXUzMiBfdW51c2VkMFs0XTsKKwl2b2xhdGlsZSB1MzIgaXNyOwkJLyogMHgxMCBTdGF0dXMgUmVnaXN0ZXIgKi8KKwl1MzIgX3VudXNlZDFbM107CisJdm9sYXRpbGUgdTMyIHJldjsJCS8qIDB4MjAgUmV2aXNpb24gUmVnaXN0ZXIgKi8KKwl1MzIgX3VudXNlZDJbM107CisJdm9sYXRpbGUgdTMyIGlhcjsJCS8qIDB4MzAgSW5kaXJlY3QgQWRkcmVzcyBSZWdpc3RlciAqLworCXUzMiBfdW51c2VkM1szXTsKKwl2b2xhdGlsZSB1MzIgaWRyMDsJCS8qIDB4NDAgSW5kaXJlY3QgRGF0YSBSZWdpc3RlciAwICovCisJdTMyIF91bnVzZWQ0WzNdOworCXZvbGF0aWxlIHUzMiBpZHIxOwkJLyogMHg1MCBJbmRpcmVjdCBEYXRhIFJlZ2lzdGVyIDEgKi8KKwl1MzIgX3VudXNlZDVbM107CisJdm9sYXRpbGUgdTMyIGlkcjI7CQkvKiAweDYwIEluZGlyZWN0IERhdGEgUmVnaXN0ZXIgMiAqLworCXUzMiBfdW51c2VkNlszXTsKKwl2b2xhdGlsZSB1MzIgaWRyMzsJCS8qIDB4NzAgSW5kaXJlY3QgRGF0YSBSZWdpc3RlciAzICovCit9OworCitzdHJ1Y3QgaGFsMl9hZXNfcmVncyB7CisJdm9sYXRpbGUgdTMyIHJ4X3N0YXRbMl07CS8qIFN0YXR1cyByZWdpc3RlcnMgKi8KKwl2b2xhdGlsZSB1MzIgcnhfY3JbMl07CQkvKiBDb250cm9sIHJlZ2lzdGVycyAqLworCXZvbGF0aWxlIHUzMiByeF91ZFs0XTsJCS8qIFVzZXIgZGF0YSB3aW5kb3cgKi8KKwl2b2xhdGlsZSB1MzIgcnhfc3RbMjRdOwkJLyogQ2hhbm5lbCBzdGF0dXMgZGF0YSAqLworCQorCXZvbGF0aWxlIHUzMiB0eF9zdGF0WzFdOwkvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KKwl2b2xhdGlsZSB1MzIgdHhfY3JbM107CQkvKiBDb250cm9sIHJlZ2lzdGVycyAqLworCXZvbGF0aWxlIHUzMiB0eF91ZFs0XTsJCS8qIFVzZXIgZGF0YSB3aW5kb3cgKi8KKwl2b2xhdGlsZSB1MzIgdHhfc3RbMjRdOwkJLyogQ2hhbm5lbCBzdGF0dXMgZGF0YSAqLworfTsKKworc3RydWN0IGhhbDJfdm9sX3JlZ3MgeworCXZvbGF0aWxlIHUzMiByaWdodDsJCS8qIFJpZ2h0IHZvbHVtZSAqLworCXZvbGF0aWxlIHUzMiBsZWZ0OwkJLyogTGVmdCB2b2x1bWUgKi8KK307CisKK3N0cnVjdCBoYWwyX3N5bl9yZWdzIHsKKwl1MzIgX3VudXNlZDBbMl07CisJdm9sYXRpbGUgdTMyIHBhZ2U7CQkvKiBET0MgUGFnZSByZWdpc3RlciAqLworCXZvbGF0aWxlIHUzMiByZWdzZWw7CQkvKiBET0MgUmVnaXN0ZXIgc2VsZWN0aW9uICovCisJdm9sYXRpbGUgdTMyIGRsb3c7CQkvKiBET0MgRGF0YSBsb3cgKi8KKwl2b2xhdGlsZSB1MzIgZGhpZ2g7CQkvKiBET0MgRGF0YSBoaWdoICovCisJdm9sYXRpbGUgdTMyIGlycTsJCS8qIElSUSBTdGF0dXMgKi8KKwl2b2xhdGlsZSB1MzIgZHJhbTsJCS8qIERSQU0gQWNjZXNzICovCit9OworCisjZW5kaWYJLyogX19IQUwyX0ggKi8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9oYXJtb255LmMgYi9zb3VuZC9vc3MvaGFybW9ueS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTlkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvaGFybW9ueS5jCkBAIC0wLDAgKzEsMTMzMCBAQAorLyoKKyAJZHJpdmVycy9zb3VuZC9oYXJtb255LmMgCisKKwlUaGlzIGlzIGEgc291bmQgZHJpdmVyIGZvciBBU1AncyBhbmQgTGFzaSdzIEhhcm1vbnkgc291bmQgY2hpcAorCWFuZCBpcyB1bmxpa2VseSB0byBiZSB1c2VkIGZvciBhbnl0aGluZyBvdGhlciB0aGFuIG9uIGEgSFAgUEEtUklTQy4KKworCUhhcm1vbnkgaXMgZm91bmQgaW4gSFAgNzEycywgNzE1L25ldyBhbmQgbWFueSBvdGhlciBHU0MgYmFzZWQgbWFjaGluZXMuCisJT24gb2xkZXIgNzE1IG1hY2hpbmVzIHlvdSdsbCBmaW5kIHRoZSB0ZWNobmljYWxseSBpZGVudGljYWwgY2hpcCAKKwljYWxsZWQgJ1ZpdmFjZScuIEJvdGggSGFybW9ueSBhbmQgVmljYWNlIGFyZSBzdXBwb3J0ZWQgYnkgdGhpcyBkcml2ZXIuCisKKwlDb3B5cmlnaHQgMjAwMCAoYykgTGludXhjYXJlIENhbmFkYSwgQWxleCBkZVZyaWVzIDxhbGV4QG9uZWZpc2h0d28uY2E+CisJQ29weXJpZ2h0IDIwMDAtMjAwMyAoYykgSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPgorCUNvcHlyaWdodCAyMDAxIChjKSBNYXR0aGlldSBEZWxhaGF5ZSA8ZGVsYWhheW1AZXNpZWUuZnI+CisJQ29weXJpZ2h0IDIwMDEgKGMpIEplYW4tQ2hyaXN0b3BoZSBWYXVnZW9pcyA8dmF1Z2VvaWpAZXNpZWUuZnI+CisJQ29weXJpZ2h0IDIwMDQgKGMpIFN0dWFydCBCcmFkeSA8c2RicmFkeUBudGx3b3JsZC5jb20+CisKKwkJCQkKK1RPRE86CisJLSBmaXggU05EQ1RMX0RTUF9HRVRPU1BBQ0UgYW5kIFNORENUTF9EU1BfR0VUSVNQQUNFIGlvY3RscyB0bworCQlyZXR1cm4gdGhlIHJlYWwgdmFsdWVzCisJLSBhZGQgcHJpdmF0ZSBpb2N0bCBmb3Igc2VsZWN0aW5nIGxpbmUtIG9yIG1pY3JvcGhvbmUgaW5wdXQKKwkJKG9ubHkgb25lIG9mIHRoZW0gaXMgYXZhaWxhYmxlIGF0IHRoZSBzYW1lIHRpbWUpCisJLSBhZGQgbW9kdWxlIHBhcmFtZXRlcnMKKwktIGltcGxlbWVudCBtbWFwIGZ1bmN0aW9uYWxpdHkKKwktIGltcGxlbWVudCBnYWluIG1ldGVyID8KKwktIC4uLgorKi8KKworI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorCisjaW5jbHVkZSA8YXNtL3BhcmlzYy1kZXZpY2UuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisKKyNkZWZpbmUgUEZYICJoYXJtb255OiAiCisjZGVmaW5lIEhBUk1PTllfVkVSU0lPTiAiVjAuOWEiCisKKyN1bmRlZiBERUJVRworI2lmZGVmIERFQlVHCisjIGRlZmluZSBEUFJJTlRLIHByaW50ayAKKyNlbHNlCisjIGRlZmluZSBEUFJJTlRLKHgsLi4uKQorI2VuZGlmCisKKworI2RlZmluZSBNQVhfQlVGUyAxMAkJLyogbWF4aW11bSBudW1iZXIgb2Ygcm90YXRpbmcgYnVmZmVycyAqLworI2RlZmluZSBIQVJNT05ZX0JVRl9TSVpFIDQwOTYJLyogbmVlZHMgdG8gYmUgYSBtdWx0aXBsZSBvZiBQQUdFX1NJWkUgKDQwOTYpISAqLworCisjZGVmaW5lIENOVExfQwkJMHg4MDAwMDAwMAorI2RlZmluZQlDTlRMX1NUCQkweDAwMDAwMDIwCisjZGVmaW5lIENOVExfNDQxMDAJMHgwMDAwMDAxNQkvKiBIQVJNT05ZX1NSXzQ0S0haICovCisjZGVmaW5lIENOVExfODAwMAkweDAwMDAwMDA4CS8qIEhBUk1PTllfU1JfOEtIWiAqLworCisjZGVmaW5lIEdBSU5DVExfSEUJMHgwODAwMDAwMAorI2RlZmluZSBHQUlOQ1RMX0xFCTB4MDQwMDAwMDAKKyNkZWZpbmUgR0FJTkNUTF9TRQkweDAyMDAwMDAwCisKKyNkZWZpbmUgRFNUQVRVU19QTgkweDAwMDAwMjAwCisjZGVmaW5lIERTVEFUVVNfUk4JMHgwMDAwMDAwMgorCisjZGVmaW5lIERTVEFUVVNfSUUJMHg4MDAwMDAwMAorCisjZGVmaW5lIEhBUk1PTllfREZfMTZCSVRfTElORUFSCTAKKyNkZWZpbmUgSEFSTU9OWV9ERl84QklUX1VMQVcJMQorI2RlZmluZSBIQVJNT05ZX0RGXzhCSVRfQUxBVwkyCisKKyNkZWZpbmUgSEFSTU9OWV9TU19NT05PCQkwCisjZGVmaW5lIEhBUk1PTllfU1NfU1RFUkVPCTEKKworI2RlZmluZSBIQVJNT05ZX1NSXzhLSFoJCTB4MDgKKyNkZWZpbmUgSEFSTU9OWV9TUl8xNktIWgkweDA5CisjZGVmaW5lIEhBUk1PTllfU1JfMjdLSFoJMHgwQQorI2RlZmluZSBIQVJNT05ZX1NSXzMyS0haCTB4MEIKKyNkZWZpbmUgSEFSTU9OWV9TUl80OEtIWgkweDBFCisjZGVmaW5lIEhBUk1PTllfU1JfOUtIWgkJMHgwRgorI2RlZmluZSBIQVJNT05ZX1NSXzVLSFoJCTB4MTAKKyNkZWZpbmUgSEFSTU9OWV9TUl8xMUtIWgkweDExCisjZGVmaW5lIEhBUk1PTllfU1JfMThLSFoJMHgxMgorI2RlZmluZSBIQVJNT05ZX1NSXzIyS0haCTB4MTMKKyNkZWZpbmUgSEFSTU9OWV9TUl8zN0tIWgkweDE0CisjZGVmaW5lIEhBUk1PTllfU1JfNDRLSFoJMHgxNQorI2RlZmluZSBIQVJNT05ZX1NSXzMzS0haCTB4MTYKKyNkZWZpbmUgSEFSTU9OWV9TUl82S0haCQkweDE3CisKKy8qCisgKiBTb21lIG1hZ2ljcyBudW1iZXJzIHVzZWQgdG8gYXV0by1kZXRlY3QgZmlsZSBmb3JtYXRzCisgKi8KKworI2RlZmluZSBIQVJNT05ZX01BR0lDXzhCX1VMQVcJMQorI2RlZmluZSBIQVJNT05ZX01BR0lDXzhCX0FMQVcJMjcKKyNkZWZpbmUgSEFSTU9OWV9NQUdJQ18xNkJfTElORUFSIDMKKyNkZWZpbmUgSEFSTU9OWV9NQUdJQ19NT05PCTEKKyNkZWZpbmUgSEFSTU9OWV9NQUdJQ19TVEVSRU8JMgorCisvKgorICogQ2hhbm5lbHMgUG9zaXRpb25zIGluIG1peGVyIHJlZ2lzdGVyCisgKi8KKworI2RlZmluZSBHQUlOX0hFX1NISUZUICAgMjcKKyNkZWZpbmUgR0FJTl9IRV9NQVNLICAgICggMSA8PCBHQUlOX0hFX1NISUZUKSAKKyNkZWZpbmUgR0FJTl9MRV9TSElGVCAgIDI2CisjZGVmaW5lIEdBSU5fTEVfTUFTSyAgICAoIDEgPDwgR0FJTl9MRV9TSElGVCkgCisjZGVmaW5lIEdBSU5fU0VfU0hJRlQgICAyNQorI2RlZmluZSBHQUlOX1NFX01BU0sgICAgKCAxIDw8IEdBSU5fU0VfU0hJRlQpIAorI2RlZmluZSBHQUlOX0lTX1NISUZUICAgMjQKKyNkZWZpbmUgR0FJTl9JU19NQVNLICAgICggMSA8PCBHQUlOX0lTX1NISUZUKSAKKyNkZWZpbmUgR0FJTl9NQV9TSElGVCAgIDIwCisjZGVmaW5lIEdBSU5fTUFfTUFTSyAgICAoIDB4MGYgPDwgR0FJTl9NQV9TSElGVCkgCisjZGVmaW5lIEdBSU5fTElfU0hJRlQgICAxNgorI2RlZmluZSBHQUlOX0xJX01BU0sgICAgKCAweDBmIDw8IEdBSU5fTElfU0hJRlQpIAorI2RlZmluZSBHQUlOX1JJX1NISUZUICAgMTIKKyNkZWZpbmUgR0FJTl9SSV9NQVNLICAgICggMHgwZiA8PCBHQUlOX1JJX1NISUZUKSAKKyNkZWZpbmUgR0FJTl9MT19TSElGVCAgIDYKKyNkZWZpbmUgR0FJTl9MT19NQVNLICAgICggMHgzZiA8PCBHQUlOX0xPX1NISUZUKSAKKyNkZWZpbmUgR0FJTl9ST19TSElGVCAgIDAKKyNkZWZpbmUgR0FJTl9ST19NQVNLICAgICggMHgzZiA8PCBHQUlOX1JPX1NISUZUKSAKKworCisjZGVmaW5lIE1BWF9PVVRQVVRfTEVWRUwgIChHQUlOX1JPX01BU0sgPj4gR0FJTl9ST19TSElGVCkKKyNkZWZpbmUgTUFYX0lOUFVUX0xFVkVMICAgKEdBSU5fUklfTUFTSyA+PiBHQUlOX1JJX1NISUZUKQorI2RlZmluZSBNQVhfTU9OSVRPUl9MRVZFTCAoR0FJTl9NQV9NQVNLID4+IEdBSU5fTUFfU0hJRlQpCisKKyNkZWZpbmUgTUlYRVJfSU5URVJOQUwgICBTT1VORF9NSVhFUl9MSU5FMQorI2RlZmluZSBNSVhFUl9MSU5FT1VUICAgIFNPVU5EX01JWEVSX0xJTkUyCisjZGVmaW5lIE1JWEVSX0hFQURQSE9ORVMgU09VTkRfTUlYRVJfTElORTMKKworI2RlZmluZSBNQVNLX0lOVEVSTkFMICAgU09VTkRfTUFTS19MSU5FMQorI2RlZmluZSBNQVNLX0xJTkVPVVQgICAgU09VTkRfTUFTS19MSU5FMgorI2RlZmluZSBNQVNLX0hFQURQSE9ORVMgU09VTkRfTUFTS19MSU5FMworCisvKgorICogQ2hhbm5lbHMgTWFzayBpbiBtaXhlciByZWdpc3RlcgorICovCisKKyNkZWZpbmUgR0FJTl9UT1RBTF9TSUxFTkNFIDB4MDBGMDBGRkYKKyNkZWZpbmUgR0FJTl9ERUZBVUxUICAgICAgIDB4MEZGMDAwMDAKKworCitzdHJ1Y3QgaGFybW9ueV9ocGEgeworCXU4CXVudXNlZDAwMDsKKwl1OAlpZDsKKwl1OAl0ZWxlc2hhcmVfaWQ7CisJdTgJdW51c2VkMDAzOworCXUzMglyZXNldDsKKwl1MzIJY250bDsKKwl1MzIJZ2FpbmN0bDsKKwl1MzIJcG54dGFkZDsKKwl1MzIJcGN1cmFkZDsKKwl1MzIJcm54dGFkZDsKKwl1MzIJcmN1cmFkZDsKKwl1MzIJZHN0YXR1czsKKwl1MzIJb3Y7CisJdTMyCXBpbzsKKwl1MzIJdW51c2VkMDJjOworCXUzMgl1bnVzZWQwMzBbM107CisJdTMyCWRpYWc7Cit9OworCitzdHJ1Y3QgaGFybW9ueV9kZXYgeworCXN0cnVjdCBoYXJtb255X2hwYSAqaHBhOworCXN0cnVjdCBwYXJpc2NfZGV2aWNlICpkZXY7CisJdTMyIGN1cnJlbnRfZ2FpbjsKKwl1MzIgZGFjX3JhdGU7CQkvKiA4MDAwIC4uLiA0ODAwMCAoSHopICovCisJdTggZGF0YV9mb3JtYXQ7CQkvKiBIQVJNT05ZX0RGX3h4X0JJVF94eHggKi8KKwl1OCBzYW1wbGVfcmF0ZTsJCS8qIEhBUk1PTllfU1JfeHhfS0haICovCisJdTggc3RlcmVvX3NlbGVjdDsJLyogSEFSTU9OWV9TU19NT05PIG9yIEhBUk1PTllfU1NfU1RFUkVPICovCisJaW50IGZvcm1hdF9pbml0aWFsaXplZCAgOjE7CisJaW50IHN1c3BlbmRlZF9wbGF5aW5nICAgOjE7CisJaW50IHN1c3BlbmRlZF9yZWNvcmRpbmcgOjE7CisJCisJaW50IGJsb2NrZWRfcGxheWluZyAgICAgOjE7CisJaW50IGJsb2NrZWRfcmVjb3JkaW5nICAgOjE7CisJaW50IGF1ZGlvX29wZW4JCToxOworCWludCBtaXhlcl9vcGVuCQk6MTsKKwkKKwl3YWl0X3F1ZXVlX2hlYWRfdCB3cV9wbGF5LCB3cV9yZWNvcmQ7CisJaW50IGZpcnN0X2ZpbGxlZF9wbGF5OwkvKiBmaXJzdCBidWZmZXIgY29udGFpbmluZyBkYXRhIChuZXh0IHRvIHBsYXkpICovCisJaW50IG5iX2ZpbGxlZF9wbGF5OyAKKwlpbnQgcGxheV9vZmZzZXQ7CisJaW50IGZpcnN0X2ZpbGxlZF9yZWNvcmQ7CisJaW50IG5iX2ZpbGxlZF9yZWNvcmQ7CisJCQorCWludCBkc3BfdW5pdCwgbWl4ZXJfdW5pdDsKK307CisKKworc3RhdGljIHN0cnVjdCBoYXJtb255X2RldiBoYXJtb255OworCisKKy8qCisgKiBEeW5hbWljIHNvdW5kIGJ1ZmZlciBhbGxvY2F0aW9uIGFuZCBETUEgbWVtb3J5CisgKi8KKworc3RydWN0IGhhcm1vbnlfYnVmZmVyIHsKKwl1bnNpZ25lZCBjaGFyICphZGRyOworCWRtYV9hZGRyX3QgZG1hX2hhbmRsZTsKKwlpbnQgZG1hX2NvaGVyZW50OwkvKiBaZXJvIGlmIGRtYV9hbGxvY19jb2hlcmVudCgpIGZhaWxzICovCisJdW5zaWduZWQgaW50IGxlbjsKK307CisKKy8qCisgKiBIYXJtb255IG1lbW9yeSBidWZmZXJzCisgKi8KKworc3RhdGljIHN0cnVjdCBoYXJtb255X2J1ZmZlciBwbGF5ZWRfYnVmLCByZWNvcmRlZF9idWYsIHNpbGVudCwgZ3JhdmV5YXJkOworCisKKyNkZWZpbmUgQ0hFQ0tfV0JBQ0tfSU5WX09GRlNFVChiLG9mZnNldCxsZW4pIFwKKyAgICAgICAgZG8geyBpZiAoIWIuZG1hX2NvaGVyZW50KSBcCisJCWRtYV9jYWNoZV93YmFja19pbnYoKHVuc2lnbmVkIGxvbmcpYi5hZGRyK29mZnNldCxsZW4pOyBcCisJfSB3aGlsZSAoMCkgCisKKwkKK3N0YXRpYyBpbnQgX19pbml0IGhhcm1vbnlfYWxsb2NfYnVmZmVyKHN0cnVjdCBoYXJtb255X2J1ZmZlciAqYiwgCisJCXVuc2lnbmVkIGludCBidWZmZXJfY291bnQpCit7CisJYi0+bGVuID0gYnVmZmVyX2NvdW50ICogSEFSTU9OWV9CVUZfU0laRTsKKwliLT5hZGRyID0gZG1hX2FsbG9jX2NvaGVyZW50KCZoYXJtb255LmRldi0+ZGV2LCAKKwkJCSAgYi0+bGVuLCAmYi0+ZG1hX2hhbmRsZSwgR0ZQX0tFUk5FTHxHRlBfRE1BKTsKKwlpZiAoYi0+YWRkciAmJiBiLT5kbWFfaGFuZGxlKSB7CisJCWItPmRtYV9jb2hlcmVudCA9IDE7CisJCURQUklOVEsoS0VSTl9JTkZPIFBGWCAiY29oZXJlbnQgbWVtb3J5OiAweCVseCwgcGxheWVkX2J1ZjogMHglbHhcbiIsCisJCQkJKHVuc2lnbmVkIGxvbmcpYi0+ZG1hX2hhbmRsZSwgKHVuc2lnbmVkIGxvbmcpYi0+YWRkcik7CisJfSBlbHNlIHsKKwkJYi0+ZG1hX2NvaGVyZW50ID0gMDsKKwkJLyoga21hbGxvYygpZWQgbWVtb3J5IHdpbGwgSFBNQyBvbiBjY2lvIG1hY2hpbmVzICEgKi8KKwkJYi0+YWRkciA9IGttYWxsb2MoYi0+bGVuLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFiLT5hZGRyKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJjb3VsZG4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQliLT5kbWFfaGFuZGxlID0gX19wYShiLT5hZGRyKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoYXJtb255X2ZyZWVfYnVmZmVyKHN0cnVjdCBoYXJtb255X2J1ZmZlciAqYikKK3sKKwlpZiAoIWItPmFkZHIpCisJCXJldHVybjsKKworCWlmIChiLT5kbWFfY29oZXJlbnQpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZoYXJtb255LmRldi0+ZGV2LAorCQkJCWItPmxlbiwgYi0+YWRkciwgYi0+ZG1hX2hhbmRsZSk7CisJZWxzZQorCQlrZnJlZShiLT5hZGRyKTsKKworCW1lbXNldChiLCAwLCBzaXplb2YoKmIpKTsKK30KKworCisKKy8qCisgKiBMb3ctTGV2ZWwgc291bmQtY2hpcCBwcm9ncmFtbWluZworICovCisKK3N0YXRpYyB2b2lkIF9faW5saW5lX18gaGFybW9ueV93YWl0X0NOVEwodm9pZCkKK3sKKwkvKiBXYWl0IHVudGlsIHdlJ3JlIG91dCBvZiBjb250cm9sIG1vZGUgKi8KKwl3aGlsZSAoZ3NjX3JlYWRsKCZoYXJtb255LmhwYS0+Y250bCkgJiBDTlRMX0MpCisJCS8qIHdhaXQgKi8gOworfQorCisKK3N0YXRpYyB2b2lkIGhhcm1vbnlfdXBkYXRlX2NvbnRyb2wodm9pZCkgCit7CisJdTMyIGRlZmF1bHRfY250bDsKKwkKKwkvKiBTZXQgQ05UTCAqLworCWRlZmF1bHRfY250bCA9IChDTlRMX0MgfCAgCQkvKiBUaGUgQyBiaXQgKi8KKwkJKGhhcm1vbnkuZGF0YV9mb3JtYXQgPDwgNikgfAkvKiBTZXQgdGhlIGRhdGEgZm9ybWF0ICovCisJCShoYXJtb255LnN0ZXJlb19zZWxlY3QgPDwgNSkgfAkvKiBTdGVyZW8gc2VsZWN0ICovCisJCShoYXJtb255LnNhbXBsZV9yYXRlKSk7CQkvKiBTZXQgc2FtcGxlIHJhdGUgKi8KKwloYXJtb255LmZvcm1hdF9pbml0aWFsaXplZCA9IDE7CisJCisJLyogaW5pdGlhbGl6ZSBDTlRMICovCisJZ3NjX3dyaXRlbChkZWZhdWx0X2NudGwsICZoYXJtb255LmhwYS0+Y250bCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhcm1vbnlfc2V0X2NvbnRyb2wodTggZGF0YV9mb3JtYXQsIHU4IHNhbXBsZV9yYXRlLCB1OCBzdGVyZW9fc2VsZWN0KSAKK3sKKwloYXJtb255LnNhbXBsZV9yYXRlID0gc2FtcGxlX3JhdGU7CisJaGFybW9ueS5kYXRhX2Zvcm1hdCA9IGRhdGFfZm9ybWF0OworCWhhcm1vbnkuc3RlcmVvX3NlbGVjdCA9IHN0ZXJlb19zZWxlY3Q7CisJaGFybW9ueV91cGRhdGVfY29udHJvbCgpOworfQorCitzdGF0aWMgdm9pZCBoYXJtb255X3NldF9yYXRlKHU4IGRhdGFfcmF0ZSkgCit7CisJaGFybW9ueS5zYW1wbGVfcmF0ZSA9IGRhdGFfcmF0ZTsKKwloYXJtb255X3VwZGF0ZV9jb250cm9sKCk7Cit9CisKK3N0YXRpYyBpbnQgaGFybW9ueV9kZXRlY3RfcmF0ZShpbnQgKmZyZXEpCit7CisJaW50IG5ld3JhdGU7CisJc3dpdGNoICgqZnJlcSkgeworCWNhc2UgODAwMDoJbmV3cmF0ZSA9IEhBUk1PTllfU1JfOEtIWjsJYnJlYWs7CisJY2FzZSAxNjAwMDoJbmV3cmF0ZSA9IEhBUk1PTllfU1JfMTZLSFo7CWJyZWFrOyAKKwljYXNlIDI3NDI4OgluZXdyYXRlID0gSEFSTU9OWV9TUl8yN0tIWjsJYnJlYWs7IAorCWNhc2UgMzIwMDA6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzMyS0haOwlicmVhazsgCisJY2FzZSA0ODAwMDoJbmV3cmF0ZSA9IEhBUk1PTllfU1JfNDhLSFo7CWJyZWFrOyAKKwljYXNlIDk2MDA6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzlLSFo7CWJyZWFrOyAKKwljYXNlIDU1MTI6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzVLSFo7CWJyZWFrOyAKKwljYXNlIDExMDI1OgluZXdyYXRlID0gSEFSTU9OWV9TUl8xMUtIWjsJYnJlYWs7IAorCWNhc2UgMTg5MDA6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzE4S0haOwlicmVhazsgCisJY2FzZSAyMjA1MDoJbmV3cmF0ZSA9IEhBUk1PTllfU1JfMjJLSFo7CWJyZWFrOyAKKwljYXNlIDM3ODAwOgluZXdyYXRlID0gSEFSTU9OWV9TUl8zN0tIWjsJYnJlYWs7IAorCWNhc2UgNDQxMDA6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzQ0S0haOwlicmVhazsgCisJY2FzZSAzMzA3NToJbmV3cmF0ZSA9IEhBUk1PTllfU1JfMzNLSFo7CWJyZWFrOyAKKwljYXNlIDY2MTU6CW5ld3JhdGUgPSBIQVJNT05ZX1NSXzZLSFo7CWJyZWFrOyAKKwlkZWZhdWx0OgluZXdyYXRlID0gSEFSTU9OWV9TUl84S0haOyAKKwkJCSpmcmVxID0gODAwMDsJCQlicmVhazsKKwl9CisJcmV0dXJuIG5ld3JhdGU7Cit9CisKK3N0YXRpYyB2b2lkIGhhcm1vbnlfc2V0X2Zvcm1hdCh1OCBkYXRhX2Zvcm1hdCkgCit7CisJaGFybW9ueS5kYXRhX2Zvcm1hdCA9IGRhdGFfZm9ybWF0OworCWhhcm1vbnlfdXBkYXRlX2NvbnRyb2woKTsKK30KKworc3RhdGljIHZvaWQgaGFybW9ueV9zZXRfc3RlcmVvKHU4IHN0ZXJlb19zZWxlY3QpIAoreworCWhhcm1vbnkuc3RlcmVvX3NlbGVjdCA9IHN0ZXJlb19zZWxlY3Q7CisJaGFybW9ueV91cGRhdGVfY29udHJvbCgpOworfQorCitzdGF0aWMgdm9pZCBoYXJtb255X2Rpc2FibGVfaW50ZXJydXB0cyh2b2lkKSAKK3sKKwloYXJtb255X3dhaXRfQ05UTCgpOworCWdzY193cml0ZWwoMCwgJmhhcm1vbnkuaHBhLT5kc3RhdHVzKTsgCit9CisKK3N0YXRpYyB2b2lkIGhhcm1vbnlfZW5hYmxlX2ludGVycnVwdHModm9pZCkgCit7CisJaGFybW9ueV93YWl0X0NOVEwoKTsKKwlnc2Nfd3JpdGVsKERTVEFUVVNfSUUsICZoYXJtb255LmhwYS0+ZHN0YXR1cyk7IAorfQorCisvKgorICogaGFybW9ueV9zaWxlbmNlKCkKKyAqCisgKiBUaGlzIHN1YnJvdXRpbmUgZmlsbHMgaW4gYSBidWZmZXIgc3RhcnRpbmcgYXQgbG9jYXRpb24gc3RhcnQgYW5kCisgKiBzaWxlbmNlcyBmb3IgbGVuZ3RoIGJ5dGVzLiAgVGhpcyByZWZlcmVuY2VzIHRoZSBjdXJyZW50CisgKiBjb25maWd1cmF0aW9uIG9mIHRoZSBhdWRpbyBmb3JtYXQuCisgKgorICovCisKK3N0YXRpYyB2b2lkIGhhcm1vbnlfc2lsZW5jZShzdHJ1Y3QgaGFybW9ueV9idWZmZXIgKmJ1ZmZlciwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSAKK3sKKwl1OCBzaWxlbmNlX2NoYXI7CisKKwkvKiBEZXNwaXRlIHdoYXQgeW91IGhlYXIsIHNpbGVuY2UgaXMgZGlmZmVyZW50IGluCisJICAgZGlmZmVyZW50IGF1ZGlvIGZvcm1hdHMuICAqLworCXN3aXRjaCAoaGFybW9ueS5kYXRhX2Zvcm1hdCkgeworCQljYXNlIEhBUk1PTllfREZfOEJJVF9VTEFXOglzaWxlbmNlX2NoYXIgPSAweDU1OyBicmVhazsKKwkJY2FzZSBIQVJNT05ZX0RGXzhCSVRfQUxBVzoJc2lsZW5jZV9jaGFyID0gMHhmZjsgYnJlYWs7CisJCWNhc2UgSEFSTU9OWV9ERl8xNkJJVF9MSU5FQVI6CS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgkJCXNpbGVuY2VfY2hhciA9IDA7CisJfQorCisJbWVtc2V0KGJ1ZmZlci0+YWRkcitzdGFydCwgc2lsZW5jZV9jaGFyLCBsZW5ndGgpOworfQorCisKK3N0YXRpYyBpbnQgaGFybW9ueV9hdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChoYXJtb255LmF1ZGlvX29wZW4pIAorCQlyZXR1cm4gLUVCVVNZOworCQorCWhhcm1vbnkuYXVkaW9fb3BlbiA9IDE7CisJaGFybW9ueS5zdXNwZW5kZWRfcGxheWluZyA9IGhhcm1vbnkuc3VzcGVuZGVkX3JlY29yZGluZyA9IDE7CisJaGFybW9ueS5ibG9ja2VkX3BsYXlpbmcgICA9IGhhcm1vbnkuYmxvY2tlZF9yZWNvcmRpbmcgICA9IDA7CisJaGFybW9ueS5maXJzdF9maWxsZWRfcGxheSA9IGhhcm1vbnkuZmlyc3RfZmlsbGVkX3JlY29yZCA9IDA7CisJaGFybW9ueS5uYl9maWxsZWRfcGxheSAgICA9IGhhcm1vbnkubmJfZmlsbGVkX3JlY29yZCAgICA9IDA7CisJaGFybW9ueS5wbGF5X29mZnNldCA9IDA7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaGFybW9ueS53cV9wbGF5KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZoYXJtb255LndxX3JlY29yZCk7CisJCisJLyogU3RhcnQgb2ZmIGluIGEgYmFsYW5jZWQgbW9kZS4gKi8KKwloYXJtb255X3NldF9jb250cm9sKEhBUk1PTllfREZfOEJJVF9VTEFXLCBIQVJNT05ZX1NSXzhLSFosIEhBUk1PTllfU1NfTU9OTyk7CisJaGFybW9ueV91cGRhdGVfY29udHJvbCgpOworCWhhcm1vbnkuZm9ybWF0X2luaXRpYWxpemVkID0gMDsKKworCS8qIENsZWFyIG91dCBhbGwgdGhlIGJ1ZmZlcnMgYW5kIGZsdXNoIHRvIGNhY2hlICovCisJaGFybW9ueV9zaWxlbmNlKCZwbGF5ZWRfYnVmLCAwLCBIQVJNT05ZX0JVRl9TSVpFKk1BWF9CVUZTKTsKKwlDSEVDS19XQkFDS19JTlZfT0ZGU0VUKHBsYXllZF9idWYsIDAsIEhBUk1PTllfQlVGX1NJWkUqTUFYX0JVRlMpOworCQorCXJldHVybiAwOworfQorCisvKgorICogUmVsZWFzZSAoY2xvc2UpIHRoZSBhdWRpbyBkZXZpY2UuCisgKi8KKworc3RhdGljIGludCBoYXJtb255X2F1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKCFoYXJtb255LmF1ZGlvX29wZW4pIAorCQlyZXR1cm4gLUVCVVNZOworCQorCWhhcm1vbnkuYXVkaW9fb3BlbiA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgcmVjb3JkZWQgZGF0YSBvZmYgdGhlIGF1ZGlvIGRldmljZS4KKyAqLworCitzdGF0aWMgc3NpemVfdCBoYXJtb255X2F1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgdG90YWxfY291bnQgPSAoaW50KSBzaXplX2NvdW50OworCWludCBjb3VudCA9IDA7CisJaW50IGJ1Zl90b19yZWFkOworCisJd2hpbGUgKGNvdW50PHRvdGFsX2NvdW50KSB7CisJCS8qIFdhaXQgdW50aWwgd2UncmUgb3V0IG9mIGNvbnRyb2wgbW9kZSAqLworCQloYXJtb255X3dhaXRfQ05UTCgpOworCQkKKwkJLyogRmlndXJlIG91dCB3aGljaCBidWZmZXIgdG8gZmlsbCBpbiAqLworCQlpZiAoaGFybW9ueS5uYl9maWxsZWRfcmVjb3JkIDw9IDIpIHsKKwkJCWhhcm1vbnkuYmxvY2tlZF9yZWNvcmRpbmcgPSAxOworCQkgICAgICAgIGlmIChoYXJtb255LnN1c3BlbmRlZF9yZWNvcmRpbmcpIHsKKwkJCQloYXJtb255LnN1c3BlbmRlZF9yZWNvcmRpbmcgPSAwOworCQkJCWhhcm1vbnlfZW5hYmxlX2ludGVycnVwdHMoKTsKKwkJCX0KKwkJCQkJCQkKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJmhhcm1vbnkud3FfcmVjb3JkKTsKKwkJCWhhcm1vbnkuYmxvY2tlZF9yZWNvcmRpbmcgPSAwOworCQl9CisJCQorCQlpZiAoaGFybW9ueS5uYl9maWxsZWRfcmVjb3JkIDwgMikKKwkJCXJldHVybiAtRUJVU1k7CisJCQorCQlidWZfdG9fcmVhZCA9IGhhcm1vbnkuZmlyc3RfZmlsbGVkX3JlY29yZDsKKworCQkvKiBDb3B5IHRoZSBwYWdlIHRvIGFuIGFsaWduZWQgYnVmZmVyICovCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyK2NvdW50LCByZWNvcmRlZF9idWYuYWRkciArCisJCQkJIChIQVJNT05ZX0JVRl9TSVpFKmJ1Zl90b19yZWFkKSwKKwkJCQkgSEFSTU9OWV9CVUZfU0laRSkpIHsKKwkJCWNvdW50ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCQorCQloYXJtb255Lm5iX2ZpbGxlZF9yZWNvcmQtLTsKKwkJaGFybW9ueS5maXJzdF9maWxsZWRfcmVjb3JkKys7CisJCWhhcm1vbnkuZmlyc3RfZmlsbGVkX3JlY29yZCAlPSBNQVhfQlVGUzsKKwkJCQkKKwkJY291bnQgKz0gSEFSTU9OWV9CVUZfU0laRTsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisKKworCisvKgorICogSGVyZSBpcyB0aGUgcGxhY2Ugd2hlcmUgd2UgdHJ5IHRvIHJlY29nbml6ZSBmaWxlIGZvcm1hdC4KKyAqIFN1bi9OZVhUIC5hdSBmaWxlcyBiZWdpbiB3aXRoIHRoZSBzdHJpbmcgLnNuZAorICogQXQgb2Zmc2V0IDEyIGlzIHNwZWNpZmllZCB0aGUgZW5jb2RpbmcuCisgKiBBdCBvZmZzZXQgMTYgaXMgc3BlY2lmaWVkIHNwZWVkIHJhdGUKKyAqIEF0IE9mZnNldCAyMCBpcyBzcGVjaWZpZWQgdGhlIG51bWJlcnMgb2Ygdm9pY2VzCisgKi8KKworI2RlZmluZSBmb3VyX2J5dGVzX3RvX3UzMihzdGFydCkgKGZpbGVfaGVhZGVyW3N0YXJ0XSA8PCAyNCl8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX2hlYWRlcltzdGFydCsxXSA8PCAxNil8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWxlX2hlYWRlcltzdGFydCsyXSA8PCA4KXxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbGVfaGVhZGVyW3N0YXJ0KzNdKTsKKworI2RlZmluZSB0ZXN0X3JhdGUodGVzdGVkLHJlYWxfdmFsdWUsaGFybW9ueV92YWx1ZSkgaWYgKCh0ZXN0ZWQpPD0ocmVhbF92YWx1ZSkpXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorCitzdGF0aWMgaW50IGhhcm1vbnlfZm9ybWF0X2F1dG9fZGV0ZWN0KGNvbnN0IGNoYXIgKmJ1ZmZlciwgaW50IGJsb2NrX3NpemUpCit7CisJdTggZmlsZV9oZWFkZXJbMjRdOworCXUzMiBzdGFydF9zdHJpbmc7CisJaW50IHJldCA9IDA7CisJCisJaWYgKGJsb2NrX3NpemU+MjQpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKGZpbGVfaGVhZGVyLCBidWZmZXIsIHNpemVvZihmaWxlX2hlYWRlcikpKQorCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQorCQlzdGFydF9zdHJpbmcgPSBmb3VyX2J5dGVzX3RvX3UzMigwKTsKKwkJCisJCWlmICgoZmlsZV9oZWFkZXJbNF09PTApICYmIChzdGFydF9zdHJpbmc9PTB4MkU3MzZFNjQpKSB7CisJCQl1MzIgZm9ybWF0OworCQkJdTMyIG5iX3ZvaWNlczsKKwkJCXUzMiBzcGVlZDsKKwkJCQorCQkJZm9ybWF0ID0gZm91cl9ieXRlc190b191MzIoMTIpOworCQkJbmJfdm9pY2VzID0gZm91cl9ieXRlc190b191MzIoMjApOworCQkJc3BlZWQgPSBmb3VyX2J5dGVzX3RvX3UzMigxNik7CisJCQkKKwkJCXN3aXRjaCAoZm9ybWF0KSB7CisJCQljYXNlIEhBUk1PTllfTUFHSUNfOEJfVUxBVzoKKwkJCQloYXJtb255LmRhdGFfZm9ybWF0ID0gSEFSTU9OWV9ERl84QklUX1VMQVc7CisJCQkJYnJlYWs7CisJCQljYXNlIEhBUk1PTllfTUFHSUNfOEJfQUxBVzoKKwkJCQloYXJtb255LmRhdGFfZm9ybWF0ID0gSEFSTU9OWV9ERl84QklUX0FMQVc7CisJCQkJYnJlYWs7CisJCQljYXNlIEhBUk1PTllfTUFHSUNfMTZCX0xJTkVBUjoKKwkJCQloYXJtb255LmRhdGFfZm9ybWF0ID0gSEFSTU9OWV9ERl8xNkJJVF9MSU5FQVI7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWhhcm1vbnlfc2V0X2NvbnRyb2woSEFSTU9OWV9ERl8xNkJJVF9MSU5FQVIsCisJCQkJCQlIQVJNT05ZX1NSXzQ0S0haLCBIQVJNT05ZX1NTX1NURVJFTyk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlzd2l0Y2ggKG5iX3ZvaWNlcykgeworCQkJY2FzZSBIQVJNT05ZX01BR0lDX01PTk86CisJCQkJaGFybW9ueS5zdGVyZW9fc2VsZWN0ID0gSEFSTU9OWV9TU19NT05POworCQkJCWJyZWFrOworCQkJY2FzZSBIQVJNT05ZX01BR0lDX1NURVJFTzoKKwkJCQloYXJtb255LnN0ZXJlb19zZWxlY3QgPSBIQVJNT05ZX1NTX1NURVJFTzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJaGFybW9ueS5zdGVyZW9fc2VsZWN0ID0gSEFSTU9OWV9TU19NT05POworCQkJCWJyZWFrOworCQkJfQorCQkJaGFybW9ueV9zZXRfcmF0ZShoYXJtb255X2RldGVjdF9yYXRlKCZzcGVlZCkpOworCQkJaGFybW9ueS5kYWNfcmF0ZSA9IHNwZWVkOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJaGFybW9ueV9zZXRfY29udHJvbChIQVJNT05ZX0RGXzhCSVRfVUxBVywgSEFSTU9OWV9TUl84S0haLCBIQVJNT05ZX1NTX01PTk8pOworb3V0OgorCXJldHVybiByZXQ7Cit9CisjdW5kZWYgZm91cl9ieXRlc190b191MzIKKworCitzdGF0aWMgc3NpemVfdCBoYXJtb255X2F1ZGlvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHRvdGFsX2NvdW50ID0gKGludCkgc2l6ZV9jb3VudDsKKwlpbnQgY291bnQgPSAwOworCWludCBmcmFtZV9zaXplOworCWludCBidWZfdG9fZmlsbDsKKwlpbnQgZnJlc2hfYnVmZmVyOworCisJaWYgKCFoYXJtb255LmZvcm1hdF9pbml0aWFsaXplZCkgeworCQlpZiAoaGFybW9ueV9mb3JtYXRfYXV0b19kZXRlY3QoYnVmZmVyLCB0b3RhbF9jb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJCisJd2hpbGUgKGNvdW50PHRvdGFsX2NvdW50KSB7CisJCS8qIFdhaXQgdW50aWwgd2UncmUgb3V0IG9mIGNvbnRyb2wgbW9kZSAqLworCQloYXJtb255X3dhaXRfQ05UTCgpOworCisJCS8qIEZpZ3VyZSBvdXQgd2hpY2ggYnVmZmVyIHRvIGZpbGwgaW4gKi8KKwkJaWYgKGhhcm1vbnkubmJfZmlsbGVkX3BsYXkrMiA+PSBNQVhfQlVGUyAmJiAhaGFybW9ueS5wbGF5X29mZnNldCkgeworCQkJaGFybW9ueS5ibG9ja2VkX3BsYXlpbmcgPSAxOworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmaGFybW9ueS53cV9wbGF5KTsKKwkJCWhhcm1vbnkuYmxvY2tlZF9wbGF5aW5nID0gMDsKKwkJfQorCQlpZiAoaGFybW9ueS5uYl9maWxsZWRfcGxheSsyID49IE1BWF9CVUZTICYmICFoYXJtb255LnBsYXlfb2Zmc2V0KQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJCisJCQorCQlidWZfdG9fZmlsbCA9IChoYXJtb255LmZpcnN0X2ZpbGxlZF9wbGF5K2hhcm1vbnkubmJfZmlsbGVkX3BsYXkpOyAKKwkJaWYgKGhhcm1vbnkucGxheV9vZmZzZXQpIHsKKwkJCWJ1Zl90b19maWxsLS07CisJCQlidWZfdG9fZmlsbCArPSBNQVhfQlVGUzsKKwkJfQorCQlidWZfdG9fZmlsbCAlPSBNQVhfQlVGUzsKKwkJCisJCWZyZXNoX2J1ZmZlciA9IChoYXJtb255LnBsYXlfb2Zmc2V0ID09IDApOworCQkKKwkJLyogRmlndXJlIG91dCB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgKi8KKwkJaWYgKCh0b3RhbF9jb3VudC1jb3VudCkgPj0gSEFSTU9OWV9CVUZfU0laRSAtIGhhcm1vbnkucGxheV9vZmZzZXQpIHsKKwkJCWZyYW1lX3NpemUgPSBIQVJNT05ZX0JVRl9TSVpFIC0gaGFybW9ueS5wbGF5X29mZnNldDsKKwkJfSBlbHNlIHsKKwkJCWZyYW1lX3NpemUgPSB0b3RhbF9jb3VudCAtIGNvdW50OworCQkJLyogQ2xlYXIgb3V0IHRoZSBidWZmZXIsIHNpbmNlIHRoZXJlIHdlJ2xsIG9ubHkgYmUgCisJCQkgICBvdmVybGF5aW5nIHBhcnQgb2YgdGhlIG9sZCBidWZmZXIgd2l0aCB0aGUgbmV3IG9uZSAqLworCQkJaGFybW9ueV9zaWxlbmNlKCZwbGF5ZWRfYnVmLCAKKwkJCQlIQVJNT05ZX0JVRl9TSVpFKmJ1Zl90b19maWxsK2ZyYW1lX3NpemUraGFybW9ueS5wbGF5X29mZnNldCwKKwkJCQlIQVJNT05ZX0JVRl9TSVpFLWZyYW1lX3NpemUtaGFybW9ueS5wbGF5X29mZnNldCk7CisJCX0KKworCQkvKiBDb3B5IHRoZSBwYWdlIHRvIGFuIGFsaWduZWQgYnVmZmVyICovCisJCWlmIChjb3B5X2Zyb21fdXNlcihwbGF5ZWRfYnVmLmFkZHIgKyhIQVJNT05ZX0JVRl9TSVpFKmJ1Zl90b19maWxsKSArIGhhcm1vbnkucGxheV9vZmZzZXQsIAorCQkJCSAgIGJ1ZmZlcitjb3VudCwgZnJhbWVfc2l6ZSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ0hFQ0tfV0JBQ0tfSU5WX09GRlNFVChwbGF5ZWRfYnVmLCAoSEFSTU9OWV9CVUZfU0laRSpidWZfdG9fZmlsbCArIGhhcm1vbnkucGxheV9vZmZzZXQpLCAKKwkJCQlmcmFtZV9zaXplKTsKKwkKKwkJaWYgKGZyZXNoX2J1ZmZlcikKKwkJCWhhcm1vbnkubmJfZmlsbGVkX3BsYXkrKzsKKwkJCisJCWNvdW50ICs9IGZyYW1lX3NpemU7CisJCWhhcm1vbnkucGxheV9vZmZzZXQgKz0gZnJhbWVfc2l6ZTsKKwkJaGFybW9ueS5wbGF5X29mZnNldCAlPSBIQVJNT05ZX0JVRl9TSVpFOworCQlpZiAoaGFybW9ueS5zdXNwZW5kZWRfcGxheWluZyAmJiAoaGFybW9ueS5uYl9maWxsZWRfcGxheT49NCkpCisJCQloYXJtb255X2VuYWJsZV9pbnRlcnJ1cHRzKCk7CisJfQorCQorCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBoYXJtb255X2F1ZGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwkKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAoIWhhcm1vbnkuc3VzcGVuZGVkX3JlY29yZGluZykKKwkJCXBvbGxfd2FpdChmaWxlLCAmaGFybW9ueS53cV9yZWNvcmQsIHdhaXQpOworCQlpZiAoaGFybW9ueS5uYl9maWxsZWRfcmVjb3JkKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoIWhhcm1vbnkuc3VzcGVuZGVkX3BsYXlpbmcpCisJCQlwb2xsX3dhaXQoZmlsZSwgJmhhcm1vbnkud3FfcGxheSwgd2FpdCk7CisJCWlmIChoYXJtb255Lm5iX2ZpbGxlZF9wbGF5KQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBoYXJtb255X2F1ZGlvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXVuc2lnbmVkIGludCBjbWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCBpdmFsLCBuZXdfZm9ybWF0OworCWludCBmcmFnX3NpemUsIGZyYWdfYnVmOworCXN0cnVjdCBhdWRpb19idWZfaW5mbyBpbmZvOworCQorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlpdmFsID0gRFNQX0NBUF9EVVBMRVg7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKKwkJaXZhbCA9IChBRk1UX1MxNl9CRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVyApOyAKKwkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKKwkKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOgorCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKSAKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoaXZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlzd2l0Y2ggKGl2YWwpIHsKKwkJCWNhc2UgQUZNVF9NVV9MQVc6CW5ld19mb3JtYXQgPSBIQVJNT05ZX0RGXzhCSVRfVUxBVzsgYnJlYWs7CisJCQljYXNlIEFGTVRfQV9MQVc6CW5ld19mb3JtYXQgPSBIQVJNT05ZX0RGXzhCSVRfQUxBVzsgYnJlYWs7CisJCQljYXNlIEFGTVRfUzE2X0JFOgluZXdfZm9ybWF0ID0gSEFSTU9OWV9ERl8xNkJJVF9MSU5FQVI7IGJyZWFrOworCQkJZGVmYXVsdDogeworCQkJCURQUklOVEsoS0VSTl9XQVJOSU5HIFBGWCAKKwkJCQkJInVuc3VwcG9ydGVkIHNvdW5kIGZvcm1hdCAweCUwNHggcmVxdWVzdGVkLlxuIiwKKwkJCQkJaXZhbCk7CisJCQkJaXZhbCA9IEFGTVRfUzE2X0JFOworCQkJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisJCQl9CisJCQl9CisJCQloYXJtb255X3NldF9mb3JtYXQobmV3X2Zvcm1hdCk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoaGFybW9ueS5kYXRhX2Zvcm1hdCkgeworCQkJY2FzZSBIQVJNT05ZX0RGXzhCSVRfVUxBVzoJaXZhbCA9IEFGTVRfTVVfTEFXOyBicmVhazsKKwkJCWNhc2UgSEFSTU9OWV9ERl84QklUX0FMQVc6CWl2YWwgPSBBRk1UX0FfTEFXOyAgYnJlYWs7CisJCQljYXNlIEhBUk1PTllfREZfMTZCSVRfTElORUFSOglpdmFsID0gQUZNVF9VMTZfQkU7IGJyZWFrOworCQkJZGVmYXVsdDogaXZhbCA9IDA7CisJCQl9CisJCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCQl9CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCWl2YWwgPSBoYXJtb255LmRhY19yYXRlOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWhhcm1vbnlfc2V0X3JhdGUoaGFybW9ueV9kZXRlY3RfcmF0ZSgmaXZhbCkpOworCQloYXJtb255LmRhY19yYXRlID0gaXZhbDsKKwkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoaXZhbCAhPSAwICYmIGl2YWwgIT0gMSkKKwkJCXJldHVybiAtRUlOVkFMOworCQloYXJtb255X3NldF9zdGVyZW8oaXZhbCk7CisgCQlyZXR1cm4gMDsKKyAKKyAJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorIAkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKKyAJCQlyZXR1cm4gLUVGQVVMVDsKKyAJCWlmIChpdmFsICE9IDEgJiYgaXZhbCAhPSAyKSB7CisgCQkJaXZhbCA9IGhhcm1vbnkuc3RlcmVvX3NlbGVjdCA9PSBIQVJNT05ZX1NTX01PTk8gPyAxIDogMjsKKyAJCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworIAkJfQorIAkJaGFybW9ueV9zZXRfc3RlcmVvKGl2YWwtMSk7CisgCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpdmFsID0gSEFSTU9OWV9CVUZfU0laRTsKKwkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKyAgICAgICAgICAgICAgICBmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoIWhhcm1vbnkuc3VzcGVuZGVkX3JlY29yZGluZykgeworCQkJLyogVE9ETzogc3RvcF9yZWNvcmRpbmcoKSAqLworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZnJhZ19zaXplID0gaXZhbCAmIDB4ZmZmZjsKKwkJZnJhZ19idWYgPSAoaXZhbD4+MTYpICYgMHhmZmZmOworCQkvKiBUT0RPOiBXZSB1c2UgaGFyZGNvZGVkIGZyYWdtZW50IHNpemVzIGFuZCBudW1iZXJzIGZvciBub3cgKi8KKwkJZnJhZ19zaXplID0gMTI7ICAvKiA0MDk2ID09IDJeMTIgKi8KKwkJZnJhZ19idWYgID0gTUFYX0JVRlM7CisJCWl2YWwgPSAoZnJhZ19idWYgPDwgMTYpICsgZnJhZ19zaXplOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCQkKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaW5mby5mcmFnc3RvdGFsID0gTUFYX0JVRlM7CisgICAgICAgICAgICAgICAgaW5mby5mcmFnbWVudHMgPSBNQVhfQlVGUyAtIGhhcm1vbnkubmJfZmlsbGVkX3BsYXk7CisJCWluZm8uZnJhZ3NpemUgPSBIQVJNT05ZX0JVRl9TSVpFOworICAgICAgICAgICAgICAgIGluZm8uYnl0ZXMgPSBpbmZvLmZyYWdtZW50cyAqIGluZm8uZnJhZ3NpemU7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpbmZvLmZyYWdzdG90YWwgPSBNQVhfQlVGUzsKKyAgICAgICAgICAgICAgICBpbmZvLmZyYWdtZW50cyA9IC8qTUFYX0JVRlMtKi8gaGFybW9ueS5uYl9maWxsZWRfcmVjb3JkOworCQlpbmZvLmZyYWdzaXplID0gSEFSTU9OWV9CVUZfU0laRTsKKyAgICAgICAgICAgICAgICBpbmZvLmJ5dGVzID0gaW5mby5mcmFnbWVudHMgKiBpbmZvLmZyYWdzaXplOworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSA/IC1FRkFVTFQgOiAwOworCQorCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlyZXR1cm4gMDsKKwl9CisJCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworLyoKKyAqIGhhcm1vbnlfaW50ZXJydXB0KCkKKyAqCisgKiBoYXJtb255IGludGVycnVwdGlvbiBzZXJ2aWNlIHJvdXRpbmUKKyAqIAorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBoYXJtb255X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXYsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXUzMiBkc3RhdHVzOworCXN0cnVjdCBoYXJtb255X2hwYSAqaHBhOworCisJLyogU2V0dXAgdGhlIGhwYSAqLworCWhwYSA9ICgoc3RydWN0IGhhcm1vbnlfZGV2ICopZGV2KS0+aHBhOworCWhhcm1vbnlfd2FpdF9DTlRMKCk7CisKKwkvKiBSZWFkIGRzdGF0dXMgYW5kIHBjdXJhZGQgKHRoZSBjdXJyZW50IGFkZHJlc3MpICovCisJZHN0YXR1cyA9IGdzY19yZWFkbCgmaHBhLT5kc3RhdHVzKTsKKwkKKwkvKiBUdXJuIG9mZiBpbnRlcnJ1cHRzICovCisJaGFybW9ueV9kaXNhYmxlX2ludGVycnVwdHMoKTsKKwkKKwkvKiBDaGVjayBpZiB0aGlzIGlzIGEgcmVxdWVzdCB0byBnZXQgdGhlIG5leHQgcGxheSBidWZmZXIgKi8KKwlpZiAoZHN0YXR1cyAmIERTVEFUVVNfUE4pIHsKKwkJaWYgKCFoYXJtb255Lm5iX2ZpbGxlZF9wbGF5KSB7CisJCQloYXJtb255LnN1c3BlbmRlZF9wbGF5aW5nID0gMTsKKwkJCWdzY193cml0ZWwoKHVuc2lnbmVkIGxvbmcpc2lsZW50LmRtYV9oYW5kbGUsICZocGEtPnBueHRhZGQpOworCQkJCQkJCisJCQlpZiAoIWhhcm1vbnkuc3VzcGVuZGVkX3JlY29yZGluZykKKwkJCQloYXJtb255X2VuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCX0gZWxzZSB7CisJCQloYXJtb255LnN1c3BlbmRlZF9wbGF5aW5nID0gMDsKKwkJCWdzY193cml0ZWwoKHVuc2lnbmVkIGxvbmcpcGxheWVkX2J1Zi5kbWFfaGFuZGxlICsgCisJCQkJCShIQVJNT05ZX0JVRl9TSVpFKmhhcm1vbnkuZmlyc3RfZmlsbGVkX3BsYXkpLAorCQkJCQkmaHBhLT5wbnh0YWRkKTsKKwkJCWhhcm1vbnkuZmlyc3RfZmlsbGVkX3BsYXkrKzsKKwkJCWhhcm1vbnkuZmlyc3RfZmlsbGVkX3BsYXkgJT0gTUFYX0JVRlM7CisJCQloYXJtb255Lm5iX2ZpbGxlZF9wbGF5LS07CisJCQkKKwkJICAgICAgIAloYXJtb255X2VuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCX0KKwkJCisJCWlmIChoYXJtb255LmJsb2NrZWRfcGxheWluZykKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGFybW9ueS53cV9wbGF5KTsKKwl9CisJCisJLyogQ2hlY2sgaWYgd2UncmUgYmVpbmcgYXNrZWQgdG8gZmlsbCBpbiBhIHJlY29yZGluZyBidWZmZXIgKi8KKwlpZiAoZHN0YXR1cyAmIERTVEFUVVNfUk4pIHsKKwkJaWYoKGhhcm1vbnkubmJfZmlsbGVkX3JlY29yZCsyPj1NQVhfQlVGUykgfHwgaGFybW9ueS5zdXNwZW5kZWRfcmVjb3JkaW5nKQorCQl7CisJCQloYXJtb255Lm5iX2ZpbGxlZF9yZWNvcmQgPSAwOworCQkJaGFybW9ueS5maXJzdF9maWxsZWRfcmVjb3JkID0gMDsKKwkJCWhhcm1vbnkuc3VzcGVuZGVkX3JlY29yZGluZyA9IDE7CisJCQlnc2Nfd3JpdGVsKCh1bnNpZ25lZCBsb25nKWdyYXZleWFyZC5kbWFfaGFuZGxlLCAmaHBhLT5ybnh0YWRkKTsKKwkJCWlmICghaGFybW9ueS5zdXNwZW5kZWRfcGxheWluZykKKwkJCQloYXJtb255X2VuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCX0gZWxzZSB7CisJCQlpbnQgYnVmX3RvX2ZpbGw7CisJCQlidWZfdG9fZmlsbCA9IChoYXJtb255LmZpcnN0X2ZpbGxlZF9yZWNvcmQraGFybW9ueS5uYl9maWxsZWRfcmVjb3JkKSAlIE1BWF9CVUZTOworCQkJQ0hFQ0tfV0JBQ0tfSU5WX09GRlNFVChyZWNvcmRlZF9idWYsIEhBUk1PTllfQlVGX1NJWkUqYnVmX3RvX2ZpbGwsIEhBUk1PTllfQlVGX1NJWkUpOworCQkJZ3NjX3dyaXRlbCgodW5zaWduZWQgbG9uZylyZWNvcmRlZF9idWYuZG1hX2hhbmRsZSArCisJCQkJCUhBUk1PTllfQlVGX1NJWkUqYnVmX3RvX2ZpbGwsCisJCQkJCSZocGEtPnJueHRhZGQpOworCQkJaGFybW9ueS5uYl9maWxsZWRfcmVjb3JkKys7CisJCQloYXJtb255X2VuYWJsZV9pbnRlcnJ1cHRzKCk7CisJCX0KKworCQlpZiAoaGFybW9ueS5ibG9ja2VkX3JlY29yZGluZyAmJiBoYXJtb255Lm5iX2ZpbGxlZF9yZWNvcmQ+MykKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmaGFybW9ueS53cV9yZWNvcmQpOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qCisgKiBTb3VuZCBwbGF5aW5nIGZ1bmN0aW9ucworICovCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhhcm1vbnlfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gaGFybW9ueV9hdWRpb19yZWFkLAorCS53cml0ZQkJPSBoYXJtb255X2F1ZGlvX3dyaXRlLAorCS5wb2xsCQk9IGhhcm1vbnlfYXVkaW9fcG9sbCwKKwkuaW9jdGwJCT0gaGFybW9ueV9hdWRpb19pb2N0bCwKKwkub3BlbgkJPSBoYXJtb255X2F1ZGlvX29wZW4sCisJLnJlbGVhc2UJPSBoYXJtb255X2F1ZGlvX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50IGhhcm1vbnlfYXVkaW9faW5pdCh2b2lkKQoreworCS8qIFJlcXVlc3QgdGhhdCBJUlEgKi8KKwlpZiAocmVxdWVzdF9pcnEoaGFybW9ueS5kZXYtPmlycSwgaGFybW9ueV9pbnRlcnJ1cHQsIDAgLCJoYXJtb255IiwgJmhhcm1vbnkpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkVycm9yIHJlcXVlc3RpbmcgaXJxICVkLlxuIiwgaGFybW9ueS5kZXYtPmlycSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworICAgCWhhcm1vbnkuZHNwX3VuaXQgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmhhcm1vbnlfYXVkaW9fZm9wcywgLTEpOworCWlmIChoYXJtb255LmRzcF91bml0IDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJFcnJvciByZWdpc3RlcmluZyBkc3BcbiIpOworCQlmcmVlX2lycShoYXJtb255LmRldi0+aXJxLCAmaGFybW9ueSk7CisJCXJldHVybiAtRUZBVUxUOworCX0KKwkKKwkvKiBDbGVhciB0aGUgYnVmZmVycyBzbyB5b3UgZG9uJ3QgZW5kIHVwIHdpdGggY3JhcCBpbiB0aGUgYnVmZmVycy4gKi8gCisJaGFybW9ueV9zaWxlbmNlKCZwbGF5ZWRfYnVmLCAwLCBIQVJNT05ZX0JVRl9TSVpFKk1BWF9CVUZTKTsKKworCS8qIE1ha2Ugc3VyZSB0aGlzIG1ha2VzIGl0IHRvIGNhY2hlICovCisJQ0hFQ0tfV0JBQ0tfSU5WX09GRlNFVChwbGF5ZWRfYnVmLCAwLCBIQVJNT05ZX0JVRl9TSVpFKk1BWF9CVUZTKTsKKworCS8qIENsZWFyIG91dCB0aGUgc2lsZW50IGJ1ZmZlciBhbmQgZmx1c2ggdG8gY2FjaGUgKi8KKwloYXJtb255X3NpbGVuY2UoJnNpbGVudCwgMCwgSEFSTU9OWV9CVUZfU0laRSk7CisJQ0hFQ0tfV0JBQ0tfSU5WX09GRlNFVChzaWxlbnQsIDAsIEhBUk1PTllfQlVGX1NJWkUpOworCQorCWhhcm1vbnkuYXVkaW9fb3BlbiA9IDA7CisJCisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIG1peGVyIGZ1bmN0aW9ucyAKKyAqLworCitzdGF0aWMgdm9pZCBoYXJtb255X21peGVyX3NldF9nYWluKHZvaWQpCit7CisJaGFybW9ueV93YWl0X0NOVEwoKTsKKwlnc2Nfd3JpdGVsKGhhcm1vbnkuY3VycmVudF9nYWluLCAmaGFybW9ueS5ocGEtPmdhaW5jdGwpOworfQorCisvKiAKKyAqICBSZWFkIGdhaW4gb2Ygc2VsZWN0ZWQgY2hhbm5lbC4KKyAqICBUaGUgT1NTIHJhdGUgaXMgZnJvbSAwIChzaWxlbnQpIHRvIDEwMCAtPiBuZWVkIHNvbWUgY29udmVyc2lvbnMKKyAqCisgKiAgVGhlIGhhcm1vbnkgZ2FpbiBhcmUgYXR0ZW51YXRpb24gZm9yIG91dHB1dCBhbmQgbW9uaXRvciBnYWluLgorICogICAgICAgICAgICAgICAgICAgaXMgYW1wbGlmYWN0aW9uIGZvciBpbnB1dCBnYWluCisgKi8KKyNkZWZpbmUgdG9faGFybW9ueV9sZXZlbChsZXZlbCxtYXgpICgobGV2ZWwpKm1heC8xMDApCisjZGVmaW5lIHRvX29zc19sZXZlbChsZXZlbCxtYXgpICgobGV2ZWwpKjEwMC9tYXgpCisKK3N0YXRpYyBpbnQgaGFybW9ueV9taXhlcl9nZXRfbGV2ZWwoaW50IGNoYW5uZWwpCit7CisJaW50IGxlZnRfbGV2ZWw7CisJaW50IHJpZ2h0X2xldmVsOworCisJc3dpdGNoIChjaGFubmVsKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJbGVmdF9sZXZlbCAgPSAoaGFybW9ueS5jdXJyZW50X2dhaW4gJiBHQUlOX0xPX01BU0spID4+IEdBSU5fTE9fU0hJRlQ7CisJCQlyaWdodF9sZXZlbCA9IChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIEdBSU5fUk9fTUFTSykgPj4gR0FJTl9ST19TSElGVDsKKwkJCWxlZnRfbGV2ZWwgID0gdG9fb3NzX2xldmVsKE1BWF9PVVRQVVRfTEVWRUwgLSBsZWZ0X2xldmVsLCBNQVhfT1VUUFVUX0xFVkVMKTsKKwkJCXJpZ2h0X2xldmVsID0gdG9fb3NzX2xldmVsKE1BWF9PVVRQVVRfTEVWRUwgLSByaWdodF9sZXZlbCwgTUFYX09VVFBVVF9MRVZFTCk7CisJCQlyZXR1cm4gKHJpZ2h0X2xldmVsIDw8IDgpK2xlZnRfbGV2ZWw7CisJCQkKKwkJY2FzZSBTT1VORF9NSVhFUl9JR0FJTjoKKwkJCWxlZnRfbGV2ZWwgPSAoaGFybW9ueS5jdXJyZW50X2dhaW4gJiBHQUlOX0xJX01BU0spID4+IEdBSU5fTElfU0hJRlQ7CisJCQlyaWdodF9sZXZlbD0gKGhhcm1vbnkuY3VycmVudF9nYWluICYgR0FJTl9SSV9NQVNLKSA+PiBHQUlOX1JJX1NISUZUOworCQkJbGVmdF9sZXZlbCA9IHRvX29zc19sZXZlbChsZWZ0X2xldmVsLCBNQVhfSU5QVVRfTEVWRUwpOworCQkJcmlnaHRfbGV2ZWw9IHRvX29zc19sZXZlbChyaWdodF9sZXZlbCwgTUFYX0lOUFVUX0xFVkVMKTsKKwkJCXJldHVybiAocmlnaHRfbGV2ZWwgPDwgOCkrbGVmdF9sZXZlbDsKKwkJCQorCQljYXNlIFNPVU5EX01JWEVSX01PTklUT1I6CisJCQlsZWZ0X2xldmVsID0gKGhhcm1vbnkuY3VycmVudF9nYWluICYgR0FJTl9NQV9NQVNLKSA+PiBHQUlOX01BX1NISUZUOworCQkJbGVmdF9sZXZlbCA9IHRvX29zc19sZXZlbChNQVhfTU9OSVRPUl9MRVZFTC1sZWZ0X2xldmVsLCBNQVhfTU9OSVRPUl9MRVZFTCk7CisJCQlyZXR1cm4gKGxlZnRfbGV2ZWwgPDwgOCkrbGVmdF9sZXZlbDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworCisvKgorICogU29tZSBjb252ZXJzaW9ucyBmb3IgdGhlIHNhbWUgcmVhc29ucy4KKyAqIFdlIGdpdmUgYmFjayB0aGUgbmV3IHJlYWwgdmFsdWUocykgZHVlIHRvCisgKiB0aGUgcmVzY2FsZS4KKyAqLworCitzdGF0aWMgaW50IGhhcm1vbnlfbWl4ZXJfc2V0X2xldmVsKGludCBjaGFubmVsLCBpbnQgdmFsdWUpCit7CisJaW50IGxlZnRfbGV2ZWw7CisJaW50IHJpZ2h0X2xldmVsOworCWludCBuZXdfbGVmdF9sZXZlbDsKKwlpbnQgbmV3X3JpZ2h0X2xldmVsOworCisJcmlnaHRfbGV2ZWwgPSAodmFsdWUgJiAweDAwMDBmZjAwKSA+PiA4OworCWxlZnRfbGV2ZWwgPSB2YWx1ZSAmIDB4MDAwMDAwZmY7CisJaWYgKHJpZ2h0X2xldmVsID4gMTAwKSByaWdodF9sZXZlbCA9IDEwMDsKKwlpZiAobGVmdF9sZXZlbCA+IDEwMCkgbGVmdF9sZXZlbCA9IDEwMDsKKyAgCisJc3dpdGNoIChjaGFubmVsKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJcmlnaHRfbGV2ZWwgPSB0b19oYXJtb255X2xldmVsKDEwMC1yaWdodF9sZXZlbCwgTUFYX09VVFBVVF9MRVZFTCk7CisJCQlsZWZ0X2xldmVsICA9IHRvX2hhcm1vbnlfbGV2ZWwoMTAwLWxlZnRfbGV2ZWwsIE1BWF9PVVRQVVRfTEVWRUwpOworCQkJbmV3X3JpZ2h0X2xldmVsID0gdG9fb3NzX2xldmVsKE1BWF9PVVRQVVRfTEVWRUwgLSByaWdodF9sZXZlbCwgTUFYX09VVFBVVF9MRVZFTCk7CisJCQluZXdfbGVmdF9sZXZlbCAgPSB0b19vc3NfbGV2ZWwoTUFYX09VVFBVVF9MRVZFTCAtIGxlZnRfbGV2ZWwsIE1BWF9PVVRQVVRfTEVWRUwpOworCQkJaGFybW9ueS5jdXJyZW50X2dhaW4gPSAoaGFybW9ueS5jdXJyZW50X2dhaW4gJiB+KEdBSU5fTE9fTUFTSyB8IEdBSU5fUk9fTUFTSykpIAorCQkJCQl8IChsZWZ0X2xldmVsIDw8IEdBSU5fTE9fU0hJRlQpIHwgKHJpZ2h0X2xldmVsIDw8IEdBSU5fUk9fU0hJRlQpOworCQkJaGFybW9ueV9taXhlcl9zZXRfZ2FpbigpOworCQkJcmV0dXJuIChuZXdfcmlnaHRfbGV2ZWwgPDwgOCkgKyBuZXdfbGVmdF9sZXZlbDsKKwkJCQorCQljYXNlIFNPVU5EX01JWEVSX0lHQUlOOgorCQkJcmlnaHRfbGV2ZWwgPSB0b19oYXJtb255X2xldmVsKHJpZ2h0X2xldmVsLCBNQVhfSU5QVVRfTEVWRUwpOworCQkJbGVmdF9sZXZlbCAgPSB0b19oYXJtb255X2xldmVsKGxlZnRfbGV2ZWwsIE1BWF9JTlBVVF9MRVZFTCk7CisJCQluZXdfcmlnaHRfbGV2ZWwgPSB0b19vc3NfbGV2ZWwocmlnaHRfbGV2ZWwsIE1BWF9JTlBVVF9MRVZFTCk7CisJCQluZXdfbGVmdF9sZXZlbCAgPSB0b19vc3NfbGV2ZWwobGVmdF9sZXZlbCwgTUFYX0lOUFVUX0xFVkVMKTsKKwkJCWhhcm1vbnkuY3VycmVudF9nYWluID0gKGhhcm1vbnkuY3VycmVudF9nYWluICYgfihHQUlOX0xJX01BU0sgfCBHQUlOX1JJX01BU0spKQorCQkJCQl8IChsZWZ0X2xldmVsIDw8IEdBSU5fTElfU0hJRlQpIHwgKHJpZ2h0X2xldmVsIDw8IEdBSU5fUklfU0hJRlQpOworCQkJaGFybW9ueV9taXhlcl9zZXRfZ2FpbigpOworCQkJcmV0dXJuIChuZXdfcmlnaHRfbGV2ZWwgPDwgOCkgKyBuZXdfbGVmdF9sZXZlbDsKKwkKKwkJY2FzZSBTT1VORF9NSVhFUl9NT05JVE9SOgorCQkJbGVmdF9sZXZlbCA9IHRvX2hhcm1vbnlfbGV2ZWwoMTAwLWxlZnRfbGV2ZWwsIE1BWF9NT05JVE9SX0xFVkVMKTsKKwkJCW5ld19sZWZ0X2xldmVsID0gdG9fb3NzX2xldmVsKE1BWF9NT05JVE9SX0xFVkVMLWxlZnRfbGV2ZWwsIE1BWF9NT05JVE9SX0xFVkVMKTsKKwkJCWhhcm1vbnkuY3VycmVudF9nYWluID0gKGhhcm1vbnkuY3VycmVudF9nYWluICYgfkdBSU5fTUFfTUFTSykgfCAobGVmdF9sZXZlbCA8PCBHQUlOX01BX1NISUZUKTsKKwkJCWhhcm1vbnlfbWl4ZXJfc2V0X2dhaW4oKTsKKwkJCXJldHVybiAobmV3X2xlZnRfbGV2ZWwgPDwgOCkgKyBuZXdfbGVmdF9sZXZlbDsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworI3VuZGVmIHRvX2hhcm1vbnlfbGV2ZWwKKyN1bmRlZiB0b19vc3NfbGV2ZWwKKworLyogCisgKiBSZXR1cm4gdGhlIHNlbGVjdGVkIGlucHV0IGRldmljZSAobWljIG9yIGxpbmUpCisgKi8KKworc3RhdGljIGludCBoYXJtb255X21peGVyX2dldF9yZWNtYXNrKHZvaWQpIAoreworCWludCBjdXJyZW50X2lucHV0X2xpbmU7CisJCisJY3VycmVudF9pbnB1dF9saW5lID0gKGhhcm1vbnkuY3VycmVudF9nYWluICYgR0FJTl9JU19NQVNLKSAKKwkJCQkgICAgPj4gR0FJTl9JU19TSElGVDsKKwlpZiAoY3VycmVudF9pbnB1dF9saW5lKSAKKwkJcmV0dXJuIFNPVU5EX01BU0tfTUlDOworCisJcmV0dXJuIFNPVU5EX01BU0tfTElORTsKK30KKworLyoKKyAqIFNldCB0aGUgaW5wdXQgKG9ubHkgb25lIGF0IHRpbWUsIGFyYml0cmFyeSBwcmlvcml0eSB0byBsaW5lIGluKQorICovCisKK3N0YXRpYyBpbnQgaGFybW9ueV9taXhlcl9zZXRfcmVjbWFzayhpbnQgcmVjbWFzaykKK3sKKwlpbnQgbmV3X2lucHV0X2xpbmU7CisJaW50IG5ld19pbnB1dF9tYXNrOworCWludCBjdXJyZW50X2lucHV0X2xpbmU7CisJCisJY3VycmVudF9pbnB1dF9saW5lID0gKGhhcm1vbnkuY3VycmVudF9nYWluICYgR0FJTl9JU19NQVNLKQorCQkJCSAgICA+PiBHQUlOX0lTX1NISUZUOworCWlmICgoY3VycmVudF9pbnB1dF9saW5lICYmICgocmVjbWFzayAmIFNPVU5EX01BU0tfTElORSkgfHwgIShyZWNtYXNrICYgU09VTkRfTUFTS19NSUMpKSkgfHwKKwkJKCFjdXJyZW50X2lucHV0X2xpbmUgJiYgKChyZWNtYXNrICYgU09VTkRfTUFTS19MSU5FKSAmJiAhKHJlY21hc2sgJiBTT1VORF9NQVNLX01JQykpKSkgeworCQluZXdfaW5wdXRfbGluZSA9IDA7CisJCW5ld19pbnB1dF9tYXNrID0gU09VTkRfTUFTS19MSU5FOworCX0gZWxzZSB7CisJCW5ld19pbnB1dF9saW5lID0gMTsKKwkJbmV3X2lucHV0X21hc2sgPSBTT1VORF9NQVNLX01JQzsKKwl9CisJaGFybW9ueS5jdXJyZW50X2dhaW4gPSAoKGhhcm1vbnkuY3VycmVudF9nYWluICYgfkdBSU5fSVNfTUFTSykgfCAKKwkJCQkobmV3X2lucHV0X2xpbmUgPDwgR0FJTl9JU19TSElGVCApKTsKKwloYXJtb255X21peGVyX3NldF9nYWluKCk7CisJcmV0dXJuIG5ld19pbnB1dF9tYXNrOworfQorCisKKy8qIAorICogZ2l2ZSB0aGUgYWN0aXZlIG91dGxpbmVzCisgKi8KKworc3RhdGljIGludCBoYXJtb255X21peGVyX2dldF9vdXRtYXNrKHZvaWQpCit7CisJaW50IG91dG1hc2sgPSAwOworCQorCWlmIChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIEdBSU5fU0VfTUFTSykgb3V0bWFzayB8PSBNQVNLX0lOVEVSTkFMOworCWlmIChoYXJtb255LmN1cnJlbnRfZ2FpbiAmIEdBSU5fTEVfTUFTSykgb3V0bWFzayB8PSBNQVNLX0xJTkVPVVQ7CisJaWYgKGhhcm1vbnkuY3VycmVudF9nYWluICYgR0FJTl9IRV9NQVNLKSBvdXRtYXNrIHw9IE1BU0tfSEVBRFBIT05FUzsKKwkKKwlyZXR1cm4gb3V0bWFzazsKK30KKworCitzdGF0aWMgaW50IGhhcm1vbnlfbWl4ZXJfc2V0X291dG1hc2soaW50IG91dG1hc2spCit7CisJaWYgKG91dG1hc2sgJiBNQVNLX0lOVEVSTkFMKSAKKwkJaGFybW9ueS5jdXJyZW50X2dhaW4gfD0gR0FJTl9TRV9NQVNLOworCWVsc2UgCisJCWhhcm1vbnkuY3VycmVudF9nYWluICY9IH5HQUlOX1NFX01BU0s7CisJCisJaWYgKG91dG1hc2sgJiBNQVNLX0xJTkVPVVQpIAorCQloYXJtb255LmN1cnJlbnRfZ2FpbiB8PSBHQUlOX0xFX01BU0s7CisJZWxzZSAKKwkJaGFybW9ueS5jdXJyZW50X2dhaW4gJj0gfkdBSU5fTEVfTUFTSzsKKwkKKwlpZiAob3V0bWFzayAmIE1BU0tfSEVBRFBIT05FUykgCisJCWhhcm1vbnkuY3VycmVudF9nYWluIHw9IEdBSU5fSEVfTUFTSzsgCisJZWxzZSAKKwkJaGFybW9ueS5jdXJyZW50X2dhaW4gJj0gfkdBSU5fSEVfTUFTSzsKKwkKKwloYXJtb255X21peGVyX3NldF9nYWluKCk7CisKKwlyZXR1cm4gKG91dG1hc2sgJiAoTUFTS19JTlRFUk5BTCB8IE1BU0tfTElORU9VVCB8IE1BU0tfSEVBRFBIT05FUykpOworfQorCisvKgorICogVGhpcyBjb2RlIGlzIGluc3BpcmVkIGZyb20gc2JfbWl4ZXIuYworICovCisKK3N0YXRpYyBpbnQgaGFybW9ueV9taXhlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwgc3RydWN0IGZpbGUgKiBmaWxlLAorCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgdmFsOworCWludCByZXQ7CisKKwlpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pIHsKKwkJbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisgICAgICAgICAgICAgICAgc3RybmNweShpbmZvLmlkLCAiaGFybW9ueSIsIHNpemVvZihpbmZvLmlkKS0xKTsKKyAgICAgICAgICAgICAgICBzdHJuY3B5KGluZm8ubmFtZSwgIkhhcm1vbnkgYXVkaW8iLCBzaXplb2YoaW5mby5uYW1lKS0xKTsKKyAgICAgICAgICAgICAgICBpbmZvLm1vZGlmeV9jb3VudGVyID0gMTsgLyogPyAqLworICAgICAgICAgICAgICAgIGlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwkKKwlpZiAoY21kID09IE9TU19HRVRWRVJTSU9OKQorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgKGludCAqKWFyZyk7CisKKwkvKiByZWFkICovCisJdmFsID0gMDsKKwlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0NBUFMpOgorCQlyZXQgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJYnJlYWs7CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1NURVJFT0RFVlMpOgorCQlyZXQgPSBTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfSUdBSU47CisJCWJyZWFrOworCQkKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfUkVDTUFTSyk6CisJCXJldCA9IFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19MSU5FOworCQlicmVhazsKKwljYXNlIE1JWEVSX1JFQUQoU09VTkRfTUlYRVJfREVWTUFTSyk6CisJCXJldCA9IFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19JR0FJTiB8CisJCQlTT1VORF9NQVNLX01PTklUT1I7CisJCWJyZWFrOworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9PVVRNQVNLKToKKwkJcmV0ID0gTUFTS19JTlRFUk5BTCB8IE1BU0tfTElORU9VVCB8CisJCQlNQVNLX0hFQURQSE9ORVM7CisJCWJyZWFrOworCQkKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX1JFQ1NSQyk6CisJCXJldCA9IGhhcm1vbnlfbWl4ZXJfc2V0X3JlY21hc2sodmFsKTsKKwkJYnJlYWs7CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX1JFQ1NSQyk6CisJCXJldCA9IGhhcm1vbnlfbWl4ZXJfZ2V0X3JlY21hc2soKTsKKwkJYnJlYWs7CisJICAgICAgCisJY2FzZSBNSVhFUl9XUklURShTT1VORF9NSVhFUl9PVVRTUkMpOgorCQlyZXQgPSBoYXJtb255X21peGVyX3NldF9vdXRtYXNrKHZhbCk7CisJCWJyZWFrOworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9PVVRTUkMpOgorCQlyZXQgPSBoYXJtb255X21peGVyX2dldF9vdXRtYXNrKCk7CisJCWJyZWFrOworCQorCWNhc2UgTUlYRVJfV1JJVEUoU09VTkRfTUlYRVJfVk9MVU1FKToKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX0lHQUlOKToKKwljYXNlIE1JWEVSX1dSSVRFKFNPVU5EX01JWEVSX01PTklUT1IpOgorCQlyZXQgPSBoYXJtb255X21peGVyX3NldF9sZXZlbChjbWQgJiAweGZmLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9WT0xVTUUpOgorCWNhc2UgTUlYRVJfUkVBRChTT1VORF9NSVhFUl9JR0FJTik6CisJY2FzZSBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX01PTklUT1IpOgorCQlyZXQgPSBoYXJtb255X21peGVyX2dldF9sZXZlbChjbWQgJiAweGZmKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAocHV0X3VzZXIocmV0LCAoaW50ICopYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBoYXJtb255X21peGVyX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKGhhcm1vbnkubWl4ZXJfb3BlbikgCisJCXJldHVybiAtRUJVU1k7CisJaGFybW9ueS5taXhlcl9vcGVuID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBoYXJtb255X21peGVyX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKCFoYXJtb255Lm1peGVyX29wZW4pIAorCQlyZXR1cm4gLUVCVVNZOworCWhhcm1vbnkubWl4ZXJfb3BlbiA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhhcm1vbnlfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLm9wZW4JCT0gaGFybW9ueV9taXhlcl9vcGVuLAorCS5yZWxlYXNlCT0gaGFybW9ueV9taXhlcl9yZWxlYXNlLAorCS5pb2N0bAkJPSBoYXJtb255X21peGVyX2lvY3RsLAorfTsKKworCisvKgorICogTXV0ZSBhbGwgdGhlIG91dHB1dCBhbmQgcmVzZXQgSGFybW9ueS4KKyAqLworCitzdGF0aWMgdm9pZCBfX2luaXQgaGFybW9ueV9taXhlcl9yZXNldCh2b2lkKQoreworCWhhcm1vbnkuY3VycmVudF9nYWluID0gR0FJTl9UT1RBTF9TSUxFTkNFOworCWhhcm1vbnlfbWl4ZXJfc2V0X2dhaW4oKTsKKwloYXJtb255X3dhaXRfQ05UTCgpOworCWdzY193cml0ZWwoMSwgJmhhcm1vbnkuaHBhLT5yZXNldCk7CisJbWRlbGF5KDUwKTsJCS8qIHdhaXQgNTAgbXMgKi8KKwlnc2Nfd3JpdGVsKDAsICZoYXJtb255LmhwYS0+cmVzZXQpOworCWhhcm1vbnkuY3VycmVudF9nYWluID0gR0FJTl9ERUZBVUxUOworCWhhcm1vbnlfbWl4ZXJfc2V0X2dhaW4oKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaGFybW9ueV9taXhlcl9pbml0KHZvaWQpCit7CisJLyogUmVnaXN0ZXIgdGhlIGRldmljZSBmaWxlIG9wZXJhdGlvbnMgKi8KKwloYXJtb255Lm1peGVyX3VuaXQgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmaGFybW9ueV9taXhlcl9mb3BzLCAtMSk7CisJaWYgKGhhcm1vbnkubWl4ZXJfdW5pdCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIkVycm9yIFJlZ2lzdGVyaW5nIE1peGVyIERyaXZlclxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKyAgCisJaGFybW9ueV9taXhlcl9yZXNldCgpOworCWhhcm1vbnkubWl4ZXJfb3BlbiA9IDA7CisJCisJcmV0dXJuIDA7Cit9CisKKworCisvKiAKKyAqIFRoaXMgaXMgdGhlIGNhbGxiYWNrIHRoYXQncyBjYWxsZWQgYnkgdGhlIGludmVudG9yeSBoYXJkd2FyZSBjb2RlIAorICogaWYgaXQgZmluZHMgYSBtYXRjaCB0byB0aGUgcmVnaXN0ZXJlZCBkcml2ZXIuIAorICovCitzdGF0aWMgaW50IF9fZGV2aW5pdAoraGFybW9ueV9kcml2ZXJfcHJvYmUoc3RydWN0IHBhcmlzY19kZXZpY2UgKmRldikKK3sKKwl1OAlpZDsKKwl1OAlyZXY7CisJdTMyCWNudGw7CisJaW50CXJldDsKKworCWlmIChoYXJtb255LmhwYSkgeworCQkvKiBXZSBvbmx5IHN1cHBvcnQgb25lIEhhcm1vbnkgYXQgdGhpcyB0aW1lICovCisJCXByaW50ayhLRVJOX0VSUiBQRlggImRyaXZlciBhbHJlYWR5IHJlZ2lzdGVyZWRcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmICghZGV2LT5pcnEpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAibm8gaXJxIGZvdW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogU2V0IHRoZSBIUEEgb2YgaGFybW9ueSAqLworCWhhcm1vbnkuaHBhID0gKHN0cnVjdCBoYXJtb255X2hwYSAqKWRldi0+aHBhOworCWhhcm1vbnkuZGV2ID0gZGV2OworCisJLyogR3JhYiB0aGUgSUQgYW5kIHJldmlzaW9uIGZyb20gdGhlIGRldmljZSAqLworCWlkID0gZ3NjX3JlYWRiKCZoYXJtb255LmhwYS0+aWQpOworCWlmICgoaWQgfCAxKSAhPSAweDE1KSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJ3cm9uZyBoYXJtb255IGlkIDB4JTAyeFxuIiwgaWQpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKwljbnRsID0gZ3NjX3JlYWRsKCZoYXJtb255LmhwYS0+Y250bCk7CisJcmV2ID0gKGNudGw+PjIwKSAmIDB4ZmY7CisKKwlwcmludGsoS0VSTl9JTkZPICJMYXNpIEhhcm1vbnkgQXVkaW8gZHJpdmVyICIgSEFSTU9OWV9WRVJTSU9OICIsICIKKwkJCSJoL3cgaWQgJWksIHJldi4gJWkgYXQgMHglbHgsIElSUSAlaVxuIiwKKwkJCWlkLCByZXYsIGRldi0+aHBhLCBoYXJtb255LmRldi0+aXJxKTsKKwkKKwkvKiBNYWtlIHN1cmUgdGhlIGNvbnRyb2wgYml0IGlzbid0IHNldCwgYWx0aG91Z2ggSSBkb24ndCB0aGluayBpdCAKKwkgICBldmVyIGlzLiAqLworCWlmIChjbnRsICYgQ05UTF9DKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJDTlRMIGJ1c3lcbiIpOworCQloYXJtb255LmhwYSA9IDA7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgbWVtb3J5IGJ1ZmZlcnMgKi8KKwlpZiAoaGFybW9ueV9hbGxvY19idWZmZXIoJnBsYXllZF9idWYsIE1BWF9CVUZTKSB8fCAKKwkgICAgaGFybW9ueV9hbGxvY19idWZmZXIoJnJlY29yZGVkX2J1ZiwgTUFYX0JVRlMpIHx8CisJICAgIGhhcm1vbnlfYWxsb2NfYnVmZmVyKCZncmF2ZXlhcmQsIDEpIHx8CisJICAgIGhhcm1vbnlfYWxsb2NfYnVmZmVyKCZzaWxlbnQsIDEpKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBvdXRfZXJyOworCX0KKworCS8qIEluaXRpYWxpemUgL2Rldi9taXhlciBhbmQgL2Rldi9hdWRpbyAgKi8KKwlpZiAoKHJldD1oYXJtb255X21peGVyX2luaXQoKSkpIAorCQlnb3RvIG91dF9lcnI7CisJaWYgKChyZXQ9aGFybW9ueV9hdWRpb19pbml0KCkpKSAKKwkJZ290byBvdXRfZXJyOworCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJaGFybW9ueS5ocGEgPSAwOworCWhhcm1vbnlfZnJlZV9idWZmZXIoJnBsYXllZF9idWYpOworCWhhcm1vbnlfZnJlZV9idWZmZXIoJnJlY29yZGVkX2J1Zik7CisJaGFybW9ueV9mcmVlX2J1ZmZlcigmZ3JhdmV5YXJkKTsKKwloYXJtb255X2ZyZWVfYnVmZmVyKCZzaWxlbnQpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHN0cnVjdCBwYXJpc2NfZGV2aWNlX2lkIGhhcm1vbnlfdGJsW10gPSB7CisgLyogeyBIUEhXX0ZJTywgSFZFUlNJT05fUkVWX0FOWV9JRCwgSFZFUlNJT05fQU5ZX0lELCAweDAwMDdBIH0sIEJ1c2htYXN0ZXIvRmxvdW5kZXIgKi8KKyB7IEhQSFdfRklPLCBIVkVSU0lPTl9SRVZfQU5ZX0lELCBIVkVSU0lPTl9BTllfSUQsIDB4MDAwN0IgfSwgLyogNzEyLzcxNSBBdWRpbyAqLworIHsgSFBIV19GSU8sIEhWRVJTSU9OX1JFVl9BTllfSUQsIEhWRVJTSU9OX0FOWV9JRCwgMHgwMDA3RSB9LCAvKiBQYWNlIEF1ZGlvICovCisgeyBIUEhXX0ZJTywgSFZFUlNJT05fUkVWX0FOWV9JRCwgSFZFUlNJT05fQU5ZX0lELCAweDAwMDdGIH0sIC8qIE91dGZpZWxkIC8gQ29yYWwgSUkgKi8KKyB7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGFyaXNjLCBoYXJtb255X3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGFyaXNjX2RyaXZlciBoYXJtb255X2RyaXZlciA9IHsKKwkubmFtZQkJPSAiTGFzaSBIYXJtb255IiwKKwkuaWRfdGFibGUJPSBoYXJtb255X3RibCwKKwkucHJvYmUJCT0gaGFybW9ueV9kcml2ZXJfcHJvYmUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2hhcm1vbnkodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfcGFyaXNjX2RyaXZlcigmaGFybW9ueV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9oYXJtb255KHZvaWQpCit7CisJZnJlZV9pcnEoaGFybW9ueS5kZXYtPmlycSwgJmhhcm1vbnkpOworCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoaGFybW9ueS5taXhlcl91bml0KTsKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChoYXJtb255LmRzcF91bml0KTsKKwloYXJtb255X2ZyZWVfYnVmZmVyKCZwbGF5ZWRfYnVmKTsKKwloYXJtb255X2ZyZWVfYnVmZmVyKCZyZWNvcmRlZF9idWYpOworCWhhcm1vbnlfZnJlZV9idWZmZXIoJmdyYXZleWFyZCk7CisJaGFybW9ueV9mcmVlX2J1ZmZlcigmc2lsZW50KTsKKwl1bnJlZ2lzdGVyX3BhcmlzY19kcml2ZXIoJmhhcm1vbnlfZHJpdmVyKTsKK30KKworCitNT0RVTEVfQVVUSE9SKCJBbGV4IERlVnJpZXMgPGFsZXhAb25lZmlzaHR3by5jYT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSGFybW9ueSBzb3VuZCBkcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoaW5pdF9oYXJtb255KTsKK21vZHVsZV9leGl0KGNsZWFudXBfaGFybW9ueSk7CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9oZXgyaGV4LmMgYi9zb3VuZC9vc3MvaGV4MmhleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NjBmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvaGV4MmhleC5jCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogaGV4MmhleCByZWFkcyBzdGRpbiBpbiBJbnRlbCBIRVggZm9ybWF0IGFuZCBwcm9kdWNlcyBhbgorICogKHVuc2lnbmVkIGNoYXIpIGFycmF5IHdoaWNoIGNvbnRhaW5zIHRoZSBieXRlcyBhbmQgd3JpdGVzIGl0CisgKiB0byBzdGRvdXQgdXNpbmcgQyBzeW50YXgKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBBQkFORE9OKHdoeSkgeyBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCB3aHkpOyBleGl0KDEpOyB9CisjZGVmaW5lIE1BWF9TSVpFICgyNTYqMTAyNCkKK3Vuc2lnbmVkIGNoYXIgYnVmW01BWF9TSVpFXTsKKworaW50IGxvYWRoZXgoRklMRSAqaW5mLCB1bnNpZ25lZCBjaGFyICpidWYpCit7CisJaW50IGw9MCwgYywgaTsKKworCXdoaWxlICgoYz1nZXRjKGluZikpIT1FT0YpCisJeworCQlpZiAoYyA9PSAnOicpCS8qIFN5bmMgd2l0aCBiZWdpbm5pbmcgb2YgbGluZSAqLworCQl7CisJCQlpbnQgbiwgY2hlY2s7CisJCQl1bnNpZ25lZCBjaGFyIHN1bTsKKwkJCWludCBhZGRyOworCQkJaW50IGxpbmV0eXBlOworCisJCQlpZiAoZnNjYW5mKGluZiwgIiUwMngiLCAmbikgIT0gMSkKKwkJCSAgIEFCQU5ET04oIkZpbGUgZm9ybWF0IGVycm9yIik7CisJCQlzdW0gPSBuOworCisJCQlpZiAoZnNjYW5mKGluZiwgIiUwNHgiLCAmYWRkcikgIT0gMSkKKwkJCSAgIEFCQU5ET04oIkZpbGUgZm9ybWF0IGVycm9yIik7CisJCQlzdW0gKz0gYWRkci8yNTY7CisJCQlzdW0gKz0gYWRkciUyNTY7CisKKwkJCWlmIChmc2NhbmYoaW5mLCAiJTAyeCIsICZsaW5ldHlwZSkgIT0gMSkKKwkJCSAgIEFCQU5ET04oIkZpbGUgZm9ybWF0IGVycm9yIik7CisJCQlzdW0gKz0gbGluZXR5cGU7CisKKwkJCWlmIChsaW5ldHlwZSAhPSAwKQorCQkJICAgY29udGludWU7CisKKwkJCWZvciAoaT0wO2k8bjtpKyspCisJCQl7CisJCQkJaWYgKGZzY2FuZihpbmYsICIlMDJ4IiwgJmMpICE9IDEpCisJCQkgICAJICAgQUJBTkRPTigiRmlsZSBmb3JtYXQgZXJyb3IiKTsKKwkJCQlpZiAoYWRkciA+PSBNQVhfU0laRSkKKwkJCQkgICBBQkFORE9OKCJGaWxlIHRvbyBsYXJnZSIpOworCQkJCWJ1ZlthZGRyKytdID0gYzsKKwkJCQlpZiAoYWRkciA+IGwpCisJCQkJICAgbCA9IGFkZHI7CisJCQkJc3VtICs9IGM7CisJCQl9CisKKwkJCWlmIChmc2NhbmYoaW5mLCAiJTAyeCIsICZjaGVjaykgIT0gMSkKKwkJCSAgIEFCQU5ET04oIkZpbGUgZm9ybWF0IGVycm9yIik7CisKKwkJCXN1bSA9IH5zdW0gKyAxOworCQkJaWYgKGNoZWNrICE9IHN1bSkKKwkJCSAgIEFCQU5ET04oIkxpbmUgY2hlY2tzdW0gZXJyb3IiKTsKKwkJfQorCX0KKworCXJldHVybiBsOworfQorCitpbnQgbWFpbiggaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBhcmd2IFtdICkKK3sKKwljb25zdCBjaGFyICogdmFybGluZTsKKwlpbnQgaSxsOworCWludCBpZD0wOworCisJaWYoYXJndlsxXSAmJiBzdHJjbXAoYXJndlsxXSwgIi1pIik9PTApCisJeworCQlhcmd2Kys7CisJCWFyZ2MtLTsKKwkJaWQ9MTsKKwl9CisJaWYoYXJndlsxXT09TlVMTCkKKwl7CisJCWZwcmludGYoc3RkZXJyLCJoZXgyaGV4OiBbLWldIGZpbGVuYW1lXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJdmFybGluZSA9IGFyZ3ZbMV07CisJbCA9IGxvYWRoZXgoc3RkaW4sIGJ1Zik7CisKKwlwcmludGYoIi8qXG4gKlx0IENvbXB1dGVyIGdlbmVyYXRlZCBmaWxlLiBEbyBub3QgZWRpdC5cbiAqL1xuIik7CisgICAgICAgIHByaW50Zigic3RhdGljIGludCAlc19sZW4gPSAlZDtcbiIsIHZhcmxpbmUsIGwpOworCXByaW50Zigic3RhdGljIHVuc2lnbmVkIGNoYXIgJXNbXSAlcyA9IHtcbiIsIHZhcmxpbmUsIGlkPyJfX2luaXRkYXRhIjoiIik7CisKKwlmb3IgKGk9MDtpPGw7aSsrKQorCXsKKwkJaWYgKGkpIHByaW50ZigiLCIpOworCQlpZiAoaSAmJiAhKGkgJSAxNikpIHByaW50ZigiXG4iKTsKKwkJcHJpbnRmKCIweCUwMngiLCBidWZbaV0pOworCX0KKworCXByaW50ZigiXG59O1xuXG4iKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9pODEwX2F1ZGlvLmMgYi9zb3VuZC9vc3MvaTgxMF9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOWY2NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvaTgxMF9hdWRpby5jCkBAIC0wLDAgKzEsMzY1OCBAQAorLyoKKyAqCUludGVsIGk4MTAgYW5kIGZyaWVuZHMgSUNIIGRyaXZlciBmb3IgTGludXgKKyAqCUFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKgorICogIEJ1aWx0IGZyb206CisgKglMb3cgbGV2ZWwgY29kZTogIFphY2ggQnJvd24gKG9yaWdpbmFsIG5vbndvcmtpbmcgaTgxMCBPU1MgZHJpdmVyKQorICoJCQkgSmFyb3NsYXYgS3lzZWxhIDxwZXJleEBzdXNlLmN6PiAod29ya2luZyBBTFNBIGRyaXZlcikKKyAqCisgKglGcmFtZXdvcms6IFRob21hcyBTYWlsZXIgPHNhaWxlckBpZmUuZWUuZXRoei5jaD4KKyAqCUV4dGVuZGVkIGJ5OiBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4gIAorICoJCQlhbmQgb3RoZXJzLi4KKyAqCisgKiAgSGFyZHdhcmUgUHJvdmlkZWQgQnk6CisgKglBbmFsb2cgRGV2aWNlcyAoQSBtYWpvciBBQzk3IGNvZGVjIG1ha2VyKQorICoJSW50ZWwgQ29ycCAgKHlvdSd2ZSBwcm9iYWJseSBoZWFyZCBvZiB0aGVtIGFscmVhZHkpCisgKgorICogIEFDOTcgY2x1ZXMgYW5kIGFzc2lzdGFuY2UgcHJvdmlkZWQgYnkKKyAqCUFuYWxvZyBEZXZpY2VzCisgKglaYWNoICdGdWZ1JyBCcm93bgorICoJSmVmZiBHYXJ6aWsKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICoJSW50ZWwgODEwIHRoZW9yeSBvZiBvcGVyYXRpb24KKyAqCisgKglUaGUgY2hpcHNldCBwcm92aWRlcyB0aHJlZSBETUEgY2hhbm5lbHMgdGhhdCB0YWxrIHRvIGFuIEFDOTcKKyAqCUNPREVDIChBQzk3IGlzIGEgZGlnaXRhbC9hbmFsb2cgbWl4ZXIgc3RhbmRhcmQpLiBBdCBpdHMgc2ltcGxlc3QKKyAqCXlvdSBnZXQgNDhLaHogYXVkaW8gd2l0aCBiYXNpYyB2b2x1bWUgYW5kIG1peGVyIGNvbnRyb2xzLiBBdCB0aGUKKyAqCWJlc3QgeW91IGdldCByYXRlIGFkYXB0aW9uIGluIHRoZSBjb2RlYy4gV2Ugc2V0IHRoZSBjYXJkIHVwIHNvCisgKgl0aGF0IHdlIG5ldmVyIHRha2UgY29tcGxldGlvbiBpbnRlcnJ1cHRzIGJ1dCBpbnN0ZWFkIGtlZXAgdGhlIGNhcmQKKyAqCWNoYXNpbmcgaXRzIHRhaWwgYXJvdW5kIGEgcmluZyBidWZmZXIuIFRoaXMgaXMgbmVlZGVkIGZvciBtbWFwCisgKgltb2RlIGF1ZGlvIGFuZCBoYXBwZW5zIHRvIHdvcmsgcmF0aGVyIHdlbGwgZm9yIG5vbi1tbWFwIG1vZGVzIHRvby4KKyAqCisgKglUaGUgYm9hcmQgaGFzIG9uZSBvdXRwdXQgY2hhbm5lbCBmb3IgUENNIGF1ZGlvIChzdXBwb3J0ZWQpIGFuZAorICoJYSBzdGVyZW8gbGluZSBpbiBhbmQgbW9ubyBtaWNyb3Bob25lIGlucHV0LiBBZ2FpbiB0aGVzZSBhcmUgbm9ybWFsbHkKKyAqCWxvY2tlZCB0byA0OEtoeiBvbmx5LiBSaWdodCBub3cgcmVjb3JkaW5nIGlzIG5vdCBmaW5pc2hlZC4KKyAqCisgKglUaGVyZSBpcyBubyBtaWRpIHN1cHBvcnQsIG5vIHN5bnRoIHN1cHBvcnQuIFVzZSB0aW1pZGl0eS4gVG8gZ2V0CisgKgllc2Qgd29ya2luZyB5b3UgbmVlZCB0byB1c2UgZXNkIC1yIDQ4MDAwIGFzIGl0IHdvbid0IHByb2JlIDQ4S0h6CisgKglieSBkZWZhdWx0LiBtcGcxMjMgY2FuJ3QgaGFuZGxlIDQ4S2h6IG9ubHkgYXVkaW8gc28gdXNlIHhtbXMuCisgKgorICoJRml4IFRoZSBTb3VuZCBPbiBEZWxsCisgKgorICoJTm90IGV2ZXJ5b25lIHVzZXMgNDhLSHouIFdlIGtub3cgb2Ygbm8gd2F5IHRvIGRldGVjdCB0aGlzIHJlbGlhYmx5CisgKglhbmQgY2VydGFpbmx5IG5vdCB0byBnZXQgdGhlIHJpZ2h0IGRhdGEuIElmIHlvdXIgaTgxMCBhdWRpbyBzb3VuZHMKKyAqCXN0dXBpZCB5b3UgbWF5IG5lZWQgdG8gaW52ZXN0aWdhdGUgb3RoZXIgc3BlZWRzLiBBY2NvcmRpbmcgdG8gQW5hbG9nCisgKgl0aGV5IHRlbmQgdG8gdXNlIGEgMTQuMzE4TUh6IGNsb2NrIHdoaWNoIGdpdmVzIHlvdSBhIGJhc2UgcmF0ZSBvZgorICoJNDExOTRIei4KKyAqCisgKglUaGlzIGlzIGF2YWlsYWJsZSB2aWEgdGhlICdmdHNvZGVsbD0xJyBvcHRpb24uIAorICoKKyAqCUlmIHlvdSBuZWVkIHRvIGZvcmNlIGEgc3BlY2lmaWMgcmF0ZSBzZXQgdGhlIGNsb2NraW5nPSBvcHRpb24KKyAqCisgKglUaGlzIGRyaXZlciBpcyBjdXJzZWQuIChCZW4gTGFIYWlzZSkKKyAqCisgKiAgSUNIIDMgY2F2ZWF0cworICoJSW50ZWwgZXJyYXRhICM3IGZvciBJQ0gzIElPLiBXZSBuZWVkIHRvIGRpc2FibGUgU01JIHN0dWZmCisgKgl3aGVuIGNvZGVjIHByb2JpbmcuIFtOb3QgWWV0IERvbmVdCisgKgorICogIElDSCA0IGNhdmVhdHMKKyAqCisgKglUaGUgSUNINCBoYXMgdGhlIGZlYXR1cmUsIHRoYXQgdGhlIGNvZGVjIElEIGRvZXNuJ3QgaGF2ZSB0byBiZSAKKyAqCWNvbmdydWVudCB3aXRoIHRoZSBJTyBjb25uZWN0aW9uLgorICogCisgKglUaGVyZWZvcmUsIGZyb20gZHJpdmVyIHZlcnNpb24gMC4yMyBvbiwgdGhlcmUgaXMgYSAiY29kZWMgSUQiIDwtPgorICoJIklPIHJlZ2lzdGVyIGJhc2Ugb2Zmc2V0IiBtYXBwaW5nIChjYXJkLT5hYzk3X2lkX21hcCkgZmllbGQuCisgKiAgIAorICoJSnVlcmdlbiAiR2VvcmdlIiBTYXdpbnNraSAoanNhdykgCisgKi8KKyAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjEuMDEiCisKKyNkZWZpbmUgTU9EVUxPUDIoYSwgYikgKChhKSAmICgoYikgLSAxKSkKKyNkZWZpbmUgTUFTS1AyKGEsIGIpICgoYSkgJiB+KChiKSAtIDEpKQorCitzdGF0aWMgaW50IGZ0c29kZWxsOworc3RhdGljIGludCBzdHJpY3RfY2xvY2tpbmc7CitzdGF0aWMgdW5zaWduZWQgaW50IGNsb2NraW5nOworc3RhdGljIGludCBzcGRpZl9sb2NrZWQ7CitzdGF0aWMgaW50IGFjOTdfcXVpcmsgPSBBQzk3X1RVTkVfREVGQVVMVDsKKworLy8jZGVmaW5lIERFQlVHCisvLyNkZWZpbmUgREVCVUcyCisvLyNkZWZpbmUgREVCVUdfSU5URVJSVVBUUworLy8jZGVmaW5lIERFQlVHX01NQVAKKy8vI2RlZmluZSBERUJVR19NTUlPCisKKyNkZWZpbmUgQURDX1JVTk5JTkcJMQorI2RlZmluZSBEQUNfUlVOTklORwkyCisKKyNkZWZpbmUgSTgxMF9GTVRfMTZCSVQJMQorI2RlZmluZSBJODEwX0ZNVF9TVEVSRU8JMgorI2RlZmluZSBJODEwX0ZNVF9NQVNLCTMKKworI2RlZmluZSBTUERJRl9PTgkweDAwMDQKKyNkZWZpbmUgU1VSUl9PTgkJMHgwMDEwCisjZGVmaW5lIENFTlRFUl9MRkVfT04JMHgwMDIwCisjZGVmaW5lIFZPTF9NVVRFRAkweDgwMDAKKworLyogdGhlIDgxMCdzIGFycmF5IG9mIHBvaW50ZXJzIHRvIGRhdGEgYnVmZmVycyAqLworCitzdHJ1Y3Qgc2dfaXRlbSB7CisjZGVmaW5lIEJVU0FERFJfTUFTSwkweEZGRkZGRkZFCisJdTMyIGJ1c2FkZHI7CQorI2RlZmluZSBDT05fSU9DIAkweDgwMDAwMDAwIC8qIGludGVycnVwdCBvbiBjb21wbGV0aW9uICovCisjZGVmaW5lIENPTl9CVUZQQUQJMHg0MDAwMDAwMCAvKiBwYWQgdW5kZXJydW4gd2l0aCBsYXN0IHNhbXBsZSwgZWxzZSAwICovCisjZGVmaW5lIENPTl9CVUZMRU5fTUFTSwkweDAwMDBmZmZmIC8qIGJ1ZmZlciBsZW5ndGggaW4gc2FtcGxlcyAqLworCXUzMiBjb250cm9sOworfTsKKworLyogYW4gaW5zdGFuY2Ugb2YgdGhlIGk4MTAgY2hhbm5lbCAqLworI2RlZmluZSBTR19MRU4gMzIKK3N0cnVjdCBpODEwX2NoYW5uZWwgCit7CisJLyogdGhlc2Ugc2cgZ3V5cyBzaG91bGQgcHJvYmFibHkgYmUgYWxsb2NhdGVkCisJICAgc2VwYXJhdGVseSBhcyBub2NhY2hlLiBNdXN0IGJlIDggYnl0ZSBhbGlnbmVkICovCisJc3RydWN0IHNnX2l0ZW0gc2dbU0dfTEVOXTsJLyogMzIqOCAqLworCXUzMiBvZmZzZXQ7CQkJLyogNCAqLworCXUzMiBwb3J0OwkJCS8qIDQgKi8KKwl1MzIgdXNlZDsKKwl1MzIgbnVtOworfTsKKworLyoKKyAqIHdlIGhhdmUgMyBzZXBhcmF0ZSBkbWEgZW5naW5lcy4gIHBjbSBpbiwgcGNtIG91dCwgYW5kIG1pYy4KKyAqIGVhY2ggZG1hIGVuZ2luZSBoYXMgY29udHJvbGxpbmcgcmVnaXN0ZXJzLiAgVGhlc2UgZ29vZnkKKyAqIG5hbWVzIGFyZSBmcm9tIHRoZSBkYXRhc2hlZXQsIGJ1dCBtYWtlIGl0IGVhc3kgdG8gd3JpdGUKKyAqIGNvZGUgd2hpbGUgbGVhZmluZyB0aHJvdWdoIGl0LgorICoKKyAqIElDSDQgaGFzIDYgZG1hIGVuZ2luZXMsIHBjbSBpbiwgcGNtIG91dCwgbWljLCBwY20gaW4gMiwgCisgKiBtaWMgaW4gMiwgcy9wZGlmLiAgIE9mIHNwZWNpYWwgaW50ZXJlc3QgaXMgdGhlIGZhY3QgdGhhdAorICogdGhlIHVwcGVyIDMgRE1BIGVuZ2luZXMgb24gdGhlIElDSDQgKm11c3QqIGJlIGFjY2Vzc2VkCisgKiB2aWEgbW1pbyBhY2Nlc3MgaW5zdGVhZCBvZiBwaW8gYWNjZXNzLgorICovCisKKyNkZWZpbmUgRU5VTV9FTkdJTkUoUFJFLERJRykgCQkJCQkJCQkJXAorZW51bSB7CQkJCQkJCQkJCQkJXAorCVBSRSMjX0JBU0UgPQkweCMjRElHIyMwLAkJLyogQmFzZSBBZGRyZXNzICovCQkJCVwKKwlQUkUjI19CREJBUiA9CTB4IyNESUcjIzAsCQkvKiBCdWZmZXIgRGVzY3JpcHRvciBsaXN0IEJhc2UgQWRkcmVzcyAqLwlcCisJUFJFIyNfQ0lWID0JMHgjI0RJRyMjNCwJCS8qIEN1cnJlbnQgSW5kZXggVmFsdWUgKi8JCQlcCisJUFJFIyNfTFZJID0JMHgjI0RJRyMjNSwJCS8qIExhc3QgVmFsaWQgSW5kZXggKi8JCQkJXAorCVBSRSMjX1NSID0JMHgjI0RJRyMjNiwJCS8qIFN0YXR1cyBSZWdpc3RlciAqLwkJCQlcCisJUFJFIyNfUElDQiA9CTB4IyNESUcjIzgsCQkvKiBQb3NpdGlvbiBJbiBDdXJyZW50IEJ1ZmZlciAqLwkJXAorCVBSRSMjX1BJViA9CTB4IyNESUcjI2EsCQkvKiBQcmVmZXRjaGVkIEluZGV4IFZhbHVlICovCQkJXAorCVBSRSMjX0NSID0JMHgjI0RJRyMjYgkJLyogQ29udHJvbCBSZWdpc3RlciAqLwkJCQlcCit9CisKK0VOVU1fRU5HSU5FKE9GRiwwKTsJLyogT2Zmc2V0cyAqLworRU5VTV9FTkdJTkUoUEksMCk7CS8qIFBDTSBJbiAqLworRU5VTV9FTkdJTkUoUE8sMSk7CS8qIFBDTSBPdXQgKi8KK0VOVU1fRU5HSU5FKE1DLDIpOwkvKiBNaWMgSW4gKi8KKworZW51bSB7CisJR0xPQl9DTlQgPQkweDJjLAkJCS8qIEdsb2JhbCBDb250cm9sICovCisJR0xPQl9TVEEgPSAJMHgzMCwJCQkvKiBHbG9iYWwgU3RhdHVzICovCisJQ0FTCSA9IAkweDM0CQkJLyogQ29kZWMgV3JpdGUgU2VtYXBob3JlIFJlZ2lzdGVyICovCit9OworCitFTlVNX0VOR0lORShNQzIsNCk7ICAgICAvKiBNaWMgSW4gMiAqLworRU5VTV9FTkdJTkUoUEkyLDUpOyAgICAgLyogUENNIEluIDIgKi8KK0VOVU1fRU5HSU5FKFNQLDYpOyAgICAgIC8qIFMvUERJRiAqLworCitlbnVtIHsKKwlTRE0gPSAgICAgICAgICAgMHg4MCAgICAgICAgICAgICAgICAgICAgLyogU0RBVEFfSU4gTWFwIFJlZ2lzdGVyICovCit9OworCisvKiBpbnRlcnJ1cHRzIGZvciBhIGRtYSBlbmdpbmUgKi8KKyNkZWZpbmUgRE1BX0lOVF9GSUZPCQkoMTw8NCkgIC8qIGZpZm8gdW5kZXIvb3ZlciBmbG93ICovCisjZGVmaW5lIERNQV9JTlRfQ09NUExFVEUJKDE8PDMpICAvKiBidWZmZXIgcmVhZC93cml0ZSBjb21wbGV0ZSBhbmQgaW9jIHNldCAqLworI2RlZmluZSBETUFfSU5UX0xWSQkJKDE8PDIpICAvKiBsYXN0IHZhbGlkIGRvbmUgKi8KKyNkZWZpbmUgRE1BX0lOVF9DRUxWCQkoMTw8MSkgIC8qIGxhc3QgdmFsaWQgaXMgY3VycmVudCAqLworI2RlZmluZSBETUFfSU5UX0RDSAkJKDEpCS8qIERNQSBDb250cm9sbGVyIEhhbHRlZCAoaGFwcGVucyBvbiBMVkkgaW50ZXJydXB0cykgKi8KKyNkZWZpbmUgRE1BX0lOVF9NQVNLIChETUFfSU5UX0ZJRk98RE1BX0lOVF9DT01QTEVURXxETUFfSU5UX0xWSSkKKworLyogaW50ZXJydXB0cyBmb3IgdGhlIHdob2xlIGNoaXAgKi8KKyNkZWZpbmUgSU5UX1NFQwkJKDE8PDExKQorI2RlZmluZSBJTlRfUFJJCQkoMTw8MTApCisjZGVmaW5lIElOVF9NQwkJKDE8PDcpCisjZGVmaW5lIElOVF9QTwkJKDE8PDYpCisjZGVmaW5lIElOVF9QSQkJKDE8PDUpCisjZGVmaW5lIElOVF9NTwkJKDE8PDIpCisjZGVmaW5lIElOVF9OSQkJKDE8PDEpCisjZGVmaW5lIElOVF9HUEkJCSgxPDwwKQorI2RlZmluZSBJTlRfTUFTSyAoSU5UX1NFQ3xJTlRfUFJJfElOVF9NQ3xJTlRfUE98SU5UX1BJfElOVF9NT3xJTlRfTkl8SU5UX0dQSSkKKworLyogbWFnaWMgbnVtYmVycyB0byBwcm90ZWN0IG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgSTgxMF9DQVJEX01BR0lDCQkweDUwNzI2OTZFIC8qICJQcmluIiAqLworI2RlZmluZSBJODEwX1NUQVRFX01BR0lDCTB4NjM2NTczNzMgLyogImNlc3MiICovCisjZGVmaW5lIEk4MTBfRE1BX01BU0sJCTB4ZmZmZmZmZmYgLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLworI2RlZmluZSBOUl9IV19DSAkJMworCisvKiBtYXhpbnVtIG51bWJlciBvZiBBQzk3IGNvZGVjcyBjb25uZWN0ZWQsIEFDOTcgMi4wIGRlZmluZWQgNCAqLworI2RlZmluZSBOUl9BQzk3ICAgICAgICAgICAgICAgICA0CisKKy8qIFBsZWFzZSBub3RlIHRoYXQgYW4gOGJpdCBtb25vIHN0cmVhbSBpcyBub3QgdmFsaWQgb24gdGhpcyBjYXJkLCB5b3UgbXVzdCBoYXZlIGEgMTZiaXQgKi8KKy8qIHN0cmVhbSBhdCBhIG1pbmltdW0gZm9yIHRoaXMgY2FyZCB0byBiZSBoYXBweSAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaXplW10gPSB7IDEsIDIsIDIsIDQgfTsKKy8qIFNhbXBsZXMgYXJlIDE2Yml0IHZhbHVlcywgc28gd2UgYXJlIHNoaWZ0aW5nIHRvIGEgd29yZCwgbm90IHRvIGEgYnl0ZSwgaGVuY2Ugc2hpZnQgKi8KKy8qIHZhbHVlcyBhcmUgb25lIGxlc3MgdGhhbiBtaWdodCBiZSBleHBlY3RlZCAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAtMSwgMCwgMCwgMSB9OworCitlbnVtIHsKKwlJQ0g4MjgwMUFBID0gMCwKKwlJQ0g4MjkwMUFCLAorCUlOVEVMNDQwTVgsCisJSU5URUxJQ0gyLAorCUlOVEVMSUNIMywKKwlJTlRFTElDSDQsCisJSU5URUxJQ0g1LAorCVNJNzAxMiwKKwlOVklESUFfTkZPUkNFLAorCUFNRDc2OCwKKwlBTUQ4MTExCit9OworCitzdGF0aWMgY2hhciAqIGNhcmRfbmFtZXNbXSA9IHsKKwkiSW50ZWwgSUNIIDgyODAxQUEiLAorCSJJbnRlbCBJQ0ggODI5MDFBQiIsCisJIkludGVsIDQ0ME1YIiwKKwkiSW50ZWwgSUNIMiIsCisJIkludGVsIElDSDMiLAorCSJJbnRlbCBJQ0g0IiwKKwkiSW50ZWwgSUNINSIsCisJIlNpUyA3MDEyIiwKKwkiTlZJRElBIG5Gb3JjZSBBdWRpbyIsCisJIkFNRCA3NjgiLAorCSJBTUQtODExMSBJT0h1YiIKK307CisKKy8qIFRoZXNlIGFyZSBjYXBhYmlsaXRpZXMgKGFuZCBidWdzKSB0aGUgY2hpcHNldHMgX2Nhbl8gaGF2ZSAqLworc3RhdGljIHN0cnVjdCB7CisJaW50MTZfdCAgICAgIG5yX2FjOTc7CisjZGVmaW5lIENBUF9NTUlPICAgICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQ0FQXzIwQklUX0FVRElPX1NVUFBPUlQgIDB4MDAwMgorCXVfaW50MTZfdCBmbGFnczsKK30gY2FyZF9jYXBbXSA9IHsKKwl7ICAxLCAweDAwMDAgfSwgLyogSUNIODI4MDFBQSAqLworCXsgIDEsIDB4MDAwMCB9LCAvKiBJQ0g4MjkwMUFCICovCisJeyAgMSwgMHgwMDAwIH0sIC8qIElOVEVMNDQwTVggKi8KKwl7ICAxLCAweDAwMDAgfSwgLyogSU5URUxJQ0gyICovCisJeyAgMiwgMHgwMDAwIH0sIC8qIElOVEVMSUNIMyAqLworIAl7ICAzLCAweDAwMDMgfSwgLyogSU5URUxJQ0g0ICovCisJeyAgMywgMHgwMDAzIH0sIC8qIElOVEVMSUNINSAqLworCS8qQEZJWE1FIHRvIGJlIHZlcmlmaWVkKi8JeyAgMiwgMHgwMDAwIH0sIC8qIFNJNzAxMiAqLworCS8qQEZJWE1FIHRvIGJlIHZlcmlmaWVkKi8JeyAgMiwgMHgwMDAwIH0sIC8qIE5WSURJQV9ORk9SQ0UgKi8KKwkvKkBGSVhNRSB0byBiZSB2ZXJpZmllZCovCXsgIDIsIDB4MDAwMCB9LCAvKiBBTUQ3NjggKi8KKwkvKkBGSVhNRSB0byBiZSB2ZXJpZmllZCovCXsgIDMsIDB4MDAwMSB9LCAvKiBBTUQ4MTExICovCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaTgxMF9wY2lfdGJsIFtdID0geworCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQUFfNSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSUNIODI4MDFBQX0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl81LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBJQ0g4MjkwMUFCfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF80NDBNWCwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5URUw0NDBNWH0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFCQV80LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBJTlRFTElDSDJ9LAorCXtQQ0lfVkVORE9SX0lEX0lOVEVMLCBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxQ0FfNSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5URUxJQ0gzfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzUsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIElOVEVMSUNINH0sCisJe1BDSV9WRU5ET1JfSURfSU5URUwsIFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFFQl81LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBJTlRFTElDSDV9LAorCXtQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzcwMTIsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFNJNzAxMn0sCisJe1BDSV9WRU5ET1JfSURfTlZJRElBLCBQQ0lfREVWSUNFX0lEX05WSURJQV9NQ1AxX0FVRElPLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBOVklESUFfTkZPUkNFfSwKKwl7UENJX1ZFTkRPUl9JRF9OVklESUEsIFBDSV9ERVZJQ0VfSURfTlZJRElBX01DUDJfQVVESU8sCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIE5WSURJQV9ORk9SQ0V9LAorCXtQQ0lfVkVORE9SX0lEX05WSURJQSwgUENJX0RFVklDRV9JRF9OVklESUFfTUNQM19BVURJTywKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgTlZJRElBX05GT1JDRX0sCisJe1BDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF9PUFVTXzc0NDUsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFNRDc2OH0sCisJe1BDSV9WRU5ET1JfSURfQU1ELCBQQ0lfREVWSUNFX0lEX0FNRF84MTExX0FVRElPLAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBBTUQ4MTExfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9FU0JfNSwKKwkgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgSU5URUxJQ0g0fSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFTCwgUENJX0RFVklDRV9JRF9JTlRFTF9JQ0g2XzE4LAorCSBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBJTlRFTElDSDR9LAorCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBpODEwX3BjaV90YmwpOworCisjaWZkZWYgQ09ORklHX1BNCisjZGVmaW5lIFBNX1NVU1BFTkRFRChjYXJkKSAoY2FyZC0+cG1fc3VzcGVuZGVkKQorI2Vsc2UKKyNkZWZpbmUgUE1fU1VTUEVOREVEKGNhcmQpICgwKQorI2VuZGlmCisKKy8qICJzb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AgKi8KK3N0cnVjdCBpODEwX3N0YXRlIHsKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZDsJLyogQ2FyZCBpbmZvICovCisKKwkvKiBzaW5nbGUgb3BlbiBsb2NrIG1lY2hhbmlzbSwgb25seSB1c2VkIGZvciByZWNvcmRpbmcgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCS8qIGZpbGUgbW9kZSAqLworCW1vZGVfdCBvcGVuX21vZGU7CisKKwkvKiB2aXJ0dWFsIGNoYW5uZWwgbnVtYmVyICovCisJaW50IHZpcnQ7CisKKyNpZmRlZiBDT05GSUdfUE0KKwl1bnNpZ25lZCBpbnQgcG1fc2F2ZWRfZGFjX3JhdGUscG1fc2F2ZWRfYWRjX3JhdGU7CisjZW5kaWYKKwlzdHJ1Y3QgZG1hYnVmIHsKKwkJLyogd2F2ZSBzYW1wbGUgc3R1ZmYgKi8KKwkJdW5zaWduZWQgaW50IHJhdGU7CisJCXVuc2lnbmVkIGNoYXIgZm10LCBlbmFibGUsIHRyaWdnZXI7CisKKwkJLyogaGFyZHdhcmUgY2hhbm5lbCAqLworCQlzdHJ1Y3QgaTgxMF9jaGFubmVsICpyZWFkX2NoYW5uZWw7CisJCXN0cnVjdCBpODEwX2NoYW5uZWwgKndyaXRlX2NoYW5uZWw7CisKKwkJLyogT1NTIGJ1ZmZlciBtYW5hZ2VtZW50IHN0dWZmICovCisJCXZvaWQgKnJhd2J1ZjsKKwkJZG1hX2FkZHJfdCBkbWFfaGFuZGxlOworCQl1bnNpZ25lZCBidWZvcmRlcjsKKwkJdW5zaWduZWQgbnVtZnJhZzsKKwkJdW5zaWduZWQgZnJhZ3NoaWZ0OworCisJCS8qIG91ciBidWZmZXIgYWN0cyBsaWtlIGEgY2lyY3VsYXIgcmluZyAqLworCQl1bnNpZ25lZCBod3B0cjsJCS8qIHdoZXJlIGRtYSBsYXN0IHN0YXJ0ZWQsIHVwZGF0ZWQgYnkgdXBkYXRlX3B0ciAqLworCQl1bnNpZ25lZCBzd3B0cjsJCS8qIHdoZXJlIGRyaXZlciBsYXN0IGNsZWFyL2ZpbGxlZCwgdXBkYXRlZCBieSByZWFkL3dyaXRlICovCisJCWludCBjb3VudDsJCS8qIGJ5dGVzIHRvIGJlIGNvbnN1bWVkIG9yIGJlZW4gZ2VuZXJhdGVkIGJ5IGRtYSBtYWNoaW5lICovCisJCXVuc2lnbmVkIHRvdGFsX2J5dGVzOwkvKiB0b3RhbCBieXRlcyBkbWFlZCBieSBoYXJkd2FyZSAqLworCisJCXVuc2lnbmVkIGVycm9yOwkJLyogbnVtYmVyIG9mIG92ZXIvdW5kZXJydW5zICovCisJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CS8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLworCisJCS8qIHJlZHVuZGFudCwgYnV0IG1ha2VzIGNhbGN1bGF0aW9ucyBlYXNpZXIgKi8KKwkJLyogd2hhdCB0aGUgaGFyZHdhcmUgdXNlcyAqLworCQl1bnNpZ25lZCBkbWFzaXplOworCQl1bnNpZ25lZCBmcmFnc2l6ZTsKKwkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7CisKKwkJLyogd2hhdCB3ZSB0ZWxsIHRoZSB1c2VyIHRvIGV4cGVjdCAqLworCQl1bnNpZ25lZCB1c2VyZnJhZ3M7CisJCXVuc2lnbmVkIHVzZXJmcmFnc2l6ZTsKKworCQkvKiBPU1Mgc3R1ZmYgKi8KKwkJdW5zaWduZWQgbWFwcGVkOjE7CisJCXVuc2lnbmVkIHJlYWR5OjE7CisJCXVuc2lnbmVkIHVwZGF0ZV9mbGFnOworCQl1bnNpZ25lZCBvc3NmcmFnc2l6ZTsKKwkJdW5zaWduZWQgb3NzbWF4ZnJhZ3M7CisJCXVuc2lnbmVkIHN1YmRpdmlzaW9uOworCX0gZG1hYnVmOworfTsKKworCitzdHJ1Y3QgaTgxMF9jYXJkIHsKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisKKwkvKiBXZSBrZWVwIGk4MTAgY2FyZHMgaW4gYSBsaW5rZWQgbGlzdCAqLworCXN0cnVjdCBpODEwX2NhcmQgKm5leHQ7CisKKwkvKiBUaGUgaTgxMCBoYXMgYSBjZXJ0YWluIGFtb3VudCBvZiBjcm9zcyBjaGFubmVsIGludGVyYWN0aW9uCisJICAgc28gd2UgdXNlIGEgc2luZ2xlIHBlciBjYXJkIGxvY2sgKi8KKwlzcGlubG9ja190IGxvY2s7CisJCisJLyogQ29udHJvbCBBQzk3IGFjY2VzcyBzZXJpYWxpemF0aW9uICovCisJc3BpbmxvY2tfdCBhYzk3X2xvY2s7CisKKwkvKiBQQ0kgZGV2aWNlIHN0dWZmICovCisJc3RydWN0IHBjaV9kZXYgKiBwY2lfZGV2OworCXUxNiBwY2lfaWQ7CisJdTE2IHBjaV9pZF9pbnRlcm5hbDsgLyogdXNlZCB0byBhY2Nlc3MgY2FyZF9jYXBbXSAqLworI2lmZGVmIENPTkZJR19QTQkKKwl1MTYgcG1fc3VzcGVuZGVkOworCWludCBwbV9zYXZlZF9taXhlcl9zZXR0aW5nc1tTT1VORF9NSVhFUl9OUkRFVklDRVNdW05SX0FDOTddOworI2VuZGlmCisJLyogc291bmRjb3JlIHN0dWZmICovCisJaW50IGRldl9hdWRpbzsKKworCS8qIHN0cnVjdHVyZXMgZm9yIGFic3RyYWN0aW9uIG9mIGhhcmR3YXJlIGZhY2lsaXRpZXMsIGNvZGVjcywgYmFua3MgYW5kIGNoYW5uZWxzKi8KKwl1MTYgICAgYWM5N19pZF9tYXBbTlJfQUM5N107CisJc3RydWN0IGFjOTdfY29kZWMgKmFjOTdfY29kZWNbTlJfQUM5N107CisJc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlc1tOUl9IV19DSF07CisJc3RydWN0IGk4MTBfY2hhbm5lbCAqY2hhbm5lbDsJLyogMToxIHRvIHN0YXRlc1tdIGJ1dCBkaWZmLiBsaWZldGltZSAqLworCWRtYV9hZGRyX3QgY2hhbmRtYTsKKworCXUxNiBhYzk3X2ZlYXR1cmVzOworCXUxNiBhYzk3X3N0YXR1czsKKwl1MTYgY2hhbm5lbHM7CisJCisJLyogaGFyZHdhcmUgcmVzb3VyY2VzICovCisJdW5zaWduZWQgbG9uZyBhYzk3YmFzZTsKKwl1bnNpZ25lZCBsb25nIGlvYmFzZTsKKwl1MzIgaXJxOworCisJdW5zaWduZWQgbG9uZyBhYzk3YmFzZV9tbWlvX3BoeXM7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2VfbW1pb19waHlzOworCXVfaW50OF90IF9faW9tZW0gKmFjOTdiYXNlX21taW87CisJdV9pbnQ4X3QgX19pb21lbSAqaW9iYXNlX21taW87CisKKwlpbnQgICAgICAgICAgIHVzZV9tbWlvOworCQorCS8qIEZ1bmN0aW9uIHN1cHBvcnQgKi8KKwlzdHJ1Y3QgaTgxMF9jaGFubmVsICooKmFsbG9jX3BjbV9jaGFubmVsKShzdHJ1Y3QgaTgxMF9jYXJkICopOworCXN0cnVjdCBpODEwX2NoYW5uZWwgKigqYWxsb2NfcmVjX3BjbV9jaGFubmVsKShzdHJ1Y3QgaTgxMF9jYXJkICopOworCXN0cnVjdCBpODEwX2NoYW5uZWwgKigqYWxsb2NfcmVjX21pY19jaGFubmVsKShzdHJ1Y3QgaTgxMF9jYXJkICopOworCXZvaWQgKCpmcmVlX3BjbV9jaGFubmVsKShzdHJ1Y3QgaTgxMF9jYXJkICosIGludCBjaGFuKTsKKworCS8qIFdlIGhhdmUgYSAqdmVyeSogbG9uZyBpbml0IHRpbWUgcG9zc2libHksIHNvIHVzZSB0aGlzIHRvIGJsb2NrICovCisJLyogYXR0ZW1wdHMgdG8gb3BlbiBvdXIgZGV2aWNlcyBiZWZvcmUgd2UgYXJlIHJlYWR5IChzdG9wcyBvb3BzJ2VzKSAqLworCWludCBpbml0aWFsaXppbmc7Cit9OworCisvKiBleHRyYWN0IHJlZ2lzdGVyIG9mZnNldCBmcm9tIGNvZGVjIHN0cnVjdCAqLworI2RlZmluZSBJT19SRUdfT0ZGKGNvZGVjKSAoKChzdHJ1Y3QgaTgxMF9jYXJkICopIGNvZGVjLT5wcml2YXRlX2RhdGEpLT5hYzk3X2lkX21hcFtjb2RlYy0+aWRdKQorCisjZGVmaW5lIEk4MTBfSU9SRUFEKHNpemUsIHR5cGUsIGNhcmQsIG9mZikJCQkJXAorKHsJCQkJCQkJCQlcCisJdHlwZSB2YWw7CQkJCQkJCVwKKwlpZiAoY2FyZC0+dXNlX21taW8pCQkJCQkJXAorCQl2YWw9cmVhZCMjc2l6ZShjYXJkLT5pb2Jhc2VfbW1pbytvZmYpOwkJCVwKKwllbHNlCQkJCQkJCQlcCisJCXZhbD1pbiMjc2l6ZShjYXJkLT5pb2Jhc2Urb2ZmKTsJCQkJXAorCXZhbDsJCQkJCQkJCVwKK30pCisKKyNkZWZpbmUgSTgxMF9JT1JFQURMKGNhcmQsIG9mZikJCUk4MTBfSU9SRUFEKGwsIHUzMiwgY2FyZCwgb2ZmKQorI2RlZmluZSBJODEwX0lPUkVBRFcoY2FyZCwgb2ZmKQkJSTgxMF9JT1JFQUQodywgdTE2LCBjYXJkLCBvZmYpCisjZGVmaW5lIEk4MTBfSU9SRUFEQihjYXJkLCBvZmYpCQlJODEwX0lPUkVBRChiLCB1OCwgIGNhcmQsIG9mZikKKworI2RlZmluZSBJODEwX0lPV1JJVEUoc2l6ZSwgdmFsLCBjYXJkLCBvZmYpCQkJCVwKKyh7CQkJCQkJCQkJXAorCWlmIChjYXJkLT51c2VfbW1pbykJCQkJCQlcCisJCXdyaXRlIyNzaXplKHZhbCwgY2FyZC0+aW9iYXNlX21taW8rb2ZmKTsJCVwKKwllbHNlCQkJCQkJCQlcCisJCW91dCMjc2l6ZSh2YWwsIGNhcmQtPmlvYmFzZStvZmYpOwkJCVwKK30pCisKKyNkZWZpbmUgSTgxMF9JT1dSSVRFTCh2YWwsIGNhcmQsIG9mZikJSTgxMF9JT1dSSVRFKGwsIHZhbCwgY2FyZCwgb2ZmKQorI2RlZmluZSBJODEwX0lPV1JJVEVXKHZhbCwgY2FyZCwgb2ZmKQlJODEwX0lPV1JJVEUodywgdmFsLCBjYXJkLCBvZmYpCisjZGVmaW5lIEk4MTBfSU9XUklURUIodmFsLCBjYXJkLCBvZmYpCUk4MTBfSU9XUklURShiLCB2YWwsIGNhcmQsIG9mZikKKworI2RlZmluZSBHRVRfQ0lWKGNhcmQsIHBvcnQpIE1PRFVMT1AyKEk4MTBfSU9SRUFEQigoY2FyZCksIChwb3J0KSArIE9GRl9DSVYpLCBTR19MRU4pCisjZGVmaW5lIEdFVF9MVkkoY2FyZCwgcG9ydCkgTU9EVUxPUDIoSTgxMF9JT1JFQURCKChjYXJkKSwgKHBvcnQpICsgT0ZGX0xWSSksIFNHX0xFTikKKworLyogc2V0IExWSSBmcm9tIENJViAqLworI2RlZmluZSBDSVZfVE9fTFZJKGNhcmQsIHBvcnQsIG9mZikgXAorCUk4MTBfSU9XUklURUIoTU9EVUxPUDIoR0VUX0NJVigoY2FyZCksIChwb3J0KSkgKyAob2ZmKSwgU0dfTEVOKSwgKGNhcmQpLCAocG9ydCkgKyBPRkZfTFZJKQorCitzdGF0aWMgc3RydWN0IGFjOTdfcXVpcmsgYWM5N19xdWlya3NbXSBfX2RldmluaXRkYXRhID0geworCXsKKwkJLnZlbmRvciA9IDB4MGUxMSwKKwkJLmRldmljZSA9IDB4MDBiOCwKKwkJLm5hbWUgPSAiQ29tcGFxIEV2byBENTEwQyIsCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTAyOCwKKwkJLmRldmljZSA9IDB4MDBkOCwKKwkJLm5hbWUgPSAiRGVsbCBQcmVjaXNpb24gNTMwIiwgICAvKiBBRDE4ODUgKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDI4LAorCQkuZGV2aWNlID0gMHgwMTI2LAorCQkubmFtZSA9ICJEZWxsIE9wdGlwbGV4IEdYMjYwIiwgIC8qIEFEMTk4MUEgKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMDI4LAorCQkuZGV2aWNlID0gMHgwMTJkLAorCQkubmFtZSA9ICJEZWxsIFByZWNpc2lvbiA0NTAiLCAgIC8qIEFEMTk4MUIqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7ICAgICAgIC8qIEZJWE1FOiB3aGljaCBjb2RlYz8gKi8KKwkJLnZlbmRvciA9IDB4MTAzYywKKwkJLmRldmljZSA9IDB4MDBjMywKKwkJLm5hbWUgPSAiSGV3bGV0dC1QYWNrYXJkIG9uYm9hcmQiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwM2MsCisJCS5kZXZpY2UgPSAweDEyZjEsCisJCS5uYW1lID0gIkhQIHh3ODIwMCIsICAgIC8qIEFEMTk4MUIqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwM2MsCisJCS5kZXZpY2UgPSAweDMwMDgsCisJCS5uYW1lID0gIkhQIHh3NDIwMCIsICAgIC8qIEFEMTk4MUIqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwZjEsCisJCS5kZXZpY2UgPSAweDI2NjUsCisJCS5uYW1lID0gIkZ1aml0c3UtU2llbWVucyBDZWxzaXVzIiwgICAgICAvKiBBRDE5ODE/ICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTBmMSwKKwkJLmRldmljZSA9IDB4Mjg4NSwKKwkJLm5hbWUgPSAiQU1ENjQgTW9ibyIsICAgLyogQUxDNjUwICovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTEwYSwKKwkJLmRldmljZSA9IDB4MDA1NiwKKwkJLm5hbWUgPSAiRnVqaXRzdS1TaWVtZW5zIFNjZW5pYyIsICAgICAgIC8qIEFEMTk4MT8gKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxMWQ0LAorCQkuZGV2aWNlID0gMHg1Mzc1LAorCQkubmFtZSA9ICJBREkgQUQxOTg1IChkaXNjcmV0ZSkiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDE0NjIsCisJCS5kZXZpY2UgPSAweDU0NzAsCisJCS5uYW1lID0gIk1TSSBQNCBBVFggNjQ1IFVsdHJhIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHgxNzM0LAorCQkuZGV2aWNlID0gMHgwMDg4LAorCQkubmFtZSA9ICJGdWppdHN1LVNpZW1lbnMgRDE1MjIiLAkvKiBBRDE5ODEgKi8KKwkJLnR5cGUgPSBBQzk3X1RVTkVfSFBfT05MWQorCX0sCisJeworCQkudmVuZG9yID0gMHg4MDg2LAorCQkuZGV2aWNlID0gMHg0ODU2LAorCQkubmFtZSA9ICJJbnRlbCBEODQ1V04gKDgyODAxQkEpIiwKKwkJLnR5cGUgPSBBQzk3X1RVTkVfU1dBUF9IUAorCX0sCisJeworCQkudmVuZG9yID0gMHg4MDg2LAorCQkuZGV2aWNlID0gMHg0ZDQ0LAorCQkubmFtZSA9ICJJbnRlbCBEODUwRU1WMiIsICAgICAgIC8qIEFEMTg4NSAqLworCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDgwODYsCisJCS5kZXZpY2UgPSAweDRkNTYsCisJCS5uYW1lID0gIkludGVsIElDSC9BRDE4ODUiLAorCQkudHlwZSA9IEFDOTdfVFVORV9IUF9PTkxZCisJfSwKKwl7CisJCS52ZW5kb3IgPSAweDEwMjgsCisJCS5kZXZpY2UgPSAweDAxMmQsCisJCS5uYW1lID0gIkRlbGwgUHJlY2lzaW9uIDQ1MCIsICAgLyogQUQxOTgxQiovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTAzYywKKwkJLmRldmljZSA9IDB4MzAwOCwKKwkJLm5hbWUgPSAiSFAgeHc0MjAwIiwgICAgLyogQUQxOTgxQiovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsKKwkJLnZlbmRvciA9IDB4MTAzYywKKwkJLmRldmljZSA9IDB4MTJmMSwKKwkJLm5hbWUgPSAiSFAgeHc4MjAwIiwgICAgLyogQUQxOTgxQiovCisJCS50eXBlID0gQUM5N19UVU5FX0hQX09OTFkKKwl9LAorCXsgfSAvKiB0ZXJtaW5hdG9yICovCit9OworCitzdGF0aWMgc3RydWN0IGk4MTBfY2FyZCAqZGV2cyA9IE5VTEw7CisKK3N0YXRpYyBpbnQgaTgxMF9vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CitzdGF0aWMgaW50IGk4MTBfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZyk7CitzdGF0aWMgdTE2IGk4MTBfYWM5N19nZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnKTsKK3N0YXRpYyB2b2lkIGk4MTBfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmRldiwgdTggcmVnLCB1MTYgZGF0YSk7CitzdGF0aWMgdTE2IGk4MTBfYWM5N19nZXRfbW1pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcpOworc3RhdGljIHZvaWQgaTgxMF9hYzk3X3NldF9tbWlvKHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZywgdTE2IGRhdGEpOworc3RhdGljIHUxNiBpODEwX2FjOTdfZ2V0X2lvKHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZyk7CitzdGF0aWMgdm9pZCBpODEwX2FjOTdfc2V0X2lvKHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZywgdTE2IGRhdGEpOworCitzdGF0aWMgc3RydWN0IGk4MTBfY2hhbm5lbCAqaTgxMF9hbGxvY19wY21fY2hhbm5lbChzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkKQoreworCWlmKGNhcmQtPmNoYW5uZWxbMV0udXNlZD09MSkKKwkJcmV0dXJuIE5VTEw7CisJY2FyZC0+Y2hhbm5lbFsxXS51c2VkPTE7CisJcmV0dXJuICZjYXJkLT5jaGFubmVsWzFdOworfQorCitzdGF0aWMgc3RydWN0IGk4MTBfY2hhbm5lbCAqaTgxMF9hbGxvY19yZWNfcGNtX2NoYW5uZWwoc3RydWN0IGk4MTBfY2FyZCAqY2FyZCkKK3sKKwlpZihjYXJkLT5jaGFubmVsWzBdLnVzZWQ9PTEpCisJCXJldHVybiBOVUxMOworCWNhcmQtPmNoYW5uZWxbMF0udXNlZD0xOworCXJldHVybiAmY2FyZC0+Y2hhbm5lbFswXTsKK30KKworc3RhdGljIHN0cnVjdCBpODEwX2NoYW5uZWwgKmk4MTBfYWxsb2NfcmVjX21pY19jaGFubmVsKHN0cnVjdCBpODEwX2NhcmQgKmNhcmQpCit7CisJaWYoY2FyZC0+Y2hhbm5lbFsyXS51c2VkPT0xKQorCQlyZXR1cm4gTlVMTDsKKwljYXJkLT5jaGFubmVsWzJdLnVzZWQ9MTsKKwlyZXR1cm4gJmNhcmQtPmNoYW5uZWxbMl07Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkLCBpbnQgY2hhbm5lbCkKK3sKKwljYXJkLT5jaGFubmVsW2NoYW5uZWxdLnVzZWQ9MDsKK30KKworc3RhdGljIGludCBpODEwX3ZhbGlkX3NwZGlmX3JhdGUgKCBzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIGludCByYXRlICkKK3sKKwl1bnNpZ25lZCBsb25nIGlkID0gMEw7CisKKwlpZCA9IChpODEwX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1ZFTkRPUl9JRDEpIDw8IDE2KTsKKwlpZCB8PSBpODEwX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1ZFTkRPUl9JRDIpICYgMHhmZmZmOworI2lmZGVmIERFQlVHCisJcHJpbnRrICggImk4MTBfYXVkaW86IGNvZGVjID0gJXMsIGNvZGVjX2lkID0gMHglMDhseFxuIiwgY29kZWMtPm5hbWUsIGlkKTsKKyNlbmRpZgorCXN3aXRjaCAoIGlkICkgeworCQljYXNlIDB4NDE0NDUzNjE6IC8qIEFEMTg4NiAqLworCQkJaWYgKHJhdGUgPT0gNDgwMDApIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBhbGwgb3RoZXIgY29kZWNzLCB1bnRpbCB3ZSBrbm93IG90aGVyd2lhZSAqLworCQkJaWYgKHJhdGUgPT0gNDgwMDAgfHwgcmF0ZSA9PSA0NDEwMCB8fCByYXRlID09IDMyMDAwKSB7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlicmVhazsKKwl9CisJcmV0dXJuICgwKTsKK30KKworLyogaTgxMF9zZXRfc3BkaWZfb3V0cHV0CisgKiAKKyAqICBDb25maWd1cmUgdGhlIFMvUERJRiBvdXRwdXQgdHJhbnNtaXR0ZXIuIFdoZW4gd2UgdHVybiBvbgorICogIFMvUERJRiwgd2UgdHVybiBvZmYgdGhlIGFuYWxvZyBvdXRwdXQuIFRoaXMgbWF5IG5vdCBiZQorICogIHRoZSByaWdodCB0aGluZyB0byBkby4KKyAqCisgKiAgQXNzdW1wdGlvbnM6CisgKiAgICAgVGhlIERTUCBzYW1wbGUgcmF0ZSBtdXN0IGFscmVhZHkgYmUgc2V0IHRvIGEgc3VwcG9ydGVkCisgKiAgICAgUy9QRElGIHJhdGUgKDMya0h6LCA0NC4xa0h6LCBvciA0OGtIeikgb3Igd2UgYWJvcnQuCisgKi8KK3N0YXRpYyBpbnQgaTgxMF9zZXRfc3BkaWZfb3V0cHV0KHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSwgaW50IHNsb3RzLCBpbnQgcmF0ZSkKK3sKKwlpbnQJdm9sOworCWludAlhdWRfcmVnOworCWludAlyID0gMDsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBzdGF0ZS0+Y2FyZC0+YWM5N19jb2RlY1swXTsKKworCWlmKCFjb2RlYy0+Y29kZWNfb3BzLT5kaWdpdGFsKSB7CisJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmPSB+U1BESUZfT047CisJfSBlbHNlIHsKKwkJaWYgKCBzbG90cyA9PSAtMSApIHsgLyogVHVybiBvZmYgUy9QRElGICovCisJCQljb2RlYy0+Y29kZWNfb3BzLT5kaWdpdGFsKGNvZGVjLCAwLCAwLCAwKTsKKwkJCS8qIElmIHRoZSB2b2x1bWUgd2Fzbid0IG11dGVkIGJlZm9yZSB3ZSB0dXJuZWQgb24gUy9QRElGLCB1bm11dGUgaXQgKi8KKwkJCWlmICggIShzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBWT0xfTVVURUQpICkgeworCQkJCWF1ZF9yZWcgPSBpODEwX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPKTsKKwkJCQlpODEwX2FjOTdfc2V0KGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCAoYXVkX3JlZyAmIH5WT0xfTVVURUQpKTsKKwkJCX0KKwkJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmPSB+KFZPTF9NVVRFRCB8IFNQRElGX09OKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdm9sID0gaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19NQVNURVJfVk9MX1NURVJFTyk7CisJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyA9IHZvbCAmIFZPTF9NVVRFRDsKKwkJCisJCXIgPSBjb2RlYy0+Y29kZWNfb3BzLT5kaWdpdGFsKGNvZGVjLCBzbG90cywgcmF0ZSwgMCk7CisKKwkJaWYocikKKwkJCXN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyB8PSBTUERJRl9PTjsKKwkJZWxzZQorCQkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICY9IH5TUERJRl9PTjsKKworCQkvKiBNdXRlIHRoZSBhbmFsb2cgb3V0cHV0ICovCisJCS8qIFNob3VsZCB0aGlzIG9ubHkgbXV0ZSB0aGUgUENNIHZvbHVtZT8/PyAqLworCQlpODEwX2FjOTdfc2V0KGNvZGVjLCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCAodm9sIHwgVk9MX01VVEVEKSk7CisJfQorCXJldHVybiByOworfQorCisvKiBpODEwX3NldF9kYWNfY2hhbm5lbHMKKyAqCisgKiAgQ29uZmlndXJlIHRoZSBjb2RlYydzIG11bHRpLWNoYW5uZWwgREFDcworICoKKyAqICBUaGUgbG9naWMgaXMgYmFja3dhcmRzLiBTZXR0aW5nIHRoZSBiaXQgdG8gMSB0dXJucyBvZmYgdGhlIERBQy4gCisgKgorICogIFdoYXQgYWJvdXQgdGhlIElDSD8gV2UgY3VycmVudGx5IGNvbmZpZ3VyZSBpdCB1c2luZyB0aGUKKyAqICBTTkRDVExfRFNQX0NIQU5ORUxTIGlvY3RsLiAgSWYgd2UncmUgdHVybm5pbmcgb24gdGhlIERBQywgCisgKiAgZG9lcyB0aGF0IGltcGx5IHRoYXQgd2Ugd2FudCB0aGUgSUNIIHNldCB0byBzdXBwb3J0CisgKiAgdGhlc2UgY2hhbm5lbHM/CisgKiAgCisgKiAgVE9ETzoKKyAqICAgIHZhaWxpZGF0ZSB0aGF0IHRoZSBjb2RlYyByZWFsbHkgc3VwcG9ydHMgdGhlc2UgREFDcworICogICAgYmVmb3JlIHR1cm5pbmcgdGhlbSBvbi4gCisgKi8KK3N0YXRpYyB2b2lkIGk4MTBfc2V0X2RhY19jaGFubmVscyhzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUsIGludCBjaGFubmVsKQoreworCWludAlhdWRfcmVnOworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IHN0YXRlLT5jYXJkLT5hYzk3X2NvZGVjWzBdOworCQorCS8qIE5vIGNvZGVjLCBubyBzZXR1cCAqLworCQorCWlmKGNvZGVjID09IE5VTEwpCisJCXJldHVybjsKKworCWF1ZF9yZWcgPSBpODEwX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisJYXVkX3JlZyB8PSBBQzk3X0VBX1BSSSB8IEFDOTdfRUFfUFJKIHwgQUM5N19FQV9QUks7CisJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICY9IH4oU1VSUl9PTiB8IENFTlRFUl9MRkVfT04pOworCisJc3dpdGNoICggY2hhbm5lbCApIHsKKwkJY2FzZSAyOiAvKiBhbHdheXMgZW5hYmxlZCAqLworCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWF1ZF9yZWcgJj0gfkFDOTdfRUFfUFJKOworCQkJc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzIHw9IFNVUlJfT047CisJCQlicmVhazsKKwkJY2FzZSA2OgorCQkJYXVkX3JlZyAmPSB+KEFDOTdfRUFfUFJKIHwgQUM5N19FQV9QUkkgfCBBQzk3X0VBX1BSSyk7CisJCQlzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgfD0gU1VSUl9PTiB8IENFTlRFUl9MRkVfT047CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKwlpODEwX2FjOTdfc2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX1NUQVRVUywgYXVkX3JlZyk7CisKK30KKworCisvKiBzZXQgcGxheWJhY2sgc2FtcGxlIHJhdGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTgxMF9zZXRfZGFjX3JhdGUoc3RydWN0IGk4MTBfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IHJhdGUpCit7CQorCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXUzMiBuZXdfcmF0ZTsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM9c3RhdGUtPmNhcmQtPmFjOTdfY29kZWNbMF07CisJCisJaWYoIShzdGF0ZS0+Y2FyZC0+YWM5N19mZWF0dXJlcyYweDAwMDEpKQorCXsKKwkJZG1hYnVmLT5yYXRlID0gY2xvY2tpbmc7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJBc2tlZCBmb3IgJWQgSHosIGJ1dCBhYzk3X2ZlYXR1cmVzIHNheXMgd2Ugb25seSBkbyAlZEh6LiAgU29ycnkhXG4iLAorCQkgICAgICAgcmF0ZSxjbG9ja2luZyk7CisjZW5kaWYJCSAgICAgICAKKwkJcmV0dXJuIGNsb2NraW5nOworCX0KKwkJCQorCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDgwMDApCisJCXJhdGUgPSA4MDAwOworCWRtYWJ1Zi0+cmF0ZSA9IHJhdGU7CisJCQorCS8qCisJICoJQWRqdXN0IGZvciBtaXNjbG9ja2VkIGNyYXAKKwkgKi8KKwlyYXRlID0gKCByYXRlICogY2xvY2tpbmcpLzQ4MDAwOworCWlmKHN0cmljdF9jbG9ja2luZyAmJiByYXRlIDwgODAwMCkgeworCQlyYXRlID0gODAwMDsKKwkJZG1hYnVmLT5yYXRlID0gKHJhdGUgKiA0ODAwMCkvY2xvY2tpbmc7CisJfQorCisgICAgICAgIG5ld19yYXRlPWFjOTdfc2V0X2RhY19yYXRlKGNvZGVjLCByYXRlKTsKKwlpZihuZXdfcmF0ZSAhPSByYXRlKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IChuZXdfcmF0ZSAqIDQ4MDAwKS9jbG9ja2luZzsKKwl9CisjaWZkZWYgREVCVUcKKwlwcmludGsoImk4MTBfYXVkaW86IGNhbGxlZCBpODEwX3NldF9kYWNfcmF0ZSA6IGFza2VkIGZvciAlZCwgZ290ICVkXG4iLCByYXRlLCBkbWFidWYtPnJhdGUpOworI2VuZGlmCisJcmF0ZSA9IG5ld19yYXRlOworCXJldHVybiBkbWFidWYtPnJhdGU7Cit9CisKKy8qIHNldCByZWNvcmRpbmcgc2FtcGxlIHJhdGUgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaTgxMF9zZXRfYWRjX3JhdGUoc3RydWN0IGk4MTBfc3RhdGUgKiBzdGF0ZSwgdW5zaWduZWQgaW50IHJhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdTMyIG5ld19yYXRlOworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYz1zdGF0ZS0+Y2FyZC0+YWM5N19jb2RlY1swXTsKKwkKKwlpZighKHN0YXRlLT5jYXJkLT5hYzk3X2ZlYXR1cmVzJjB4MDAwMSkpCisJeworCQlkbWFidWYtPnJhdGUgPSBjbG9ja2luZzsKKwkJcmV0dXJuIGNsb2NraW5nOworCX0KKwkJCQorCWlmIChyYXRlID4gNDgwMDApCisJCXJhdGUgPSA0ODAwMDsKKwlpZiAocmF0ZSA8IDgwMDApCisJCXJhdGUgPSA4MDAwOworCWRtYWJ1Zi0+cmF0ZSA9IHJhdGU7CisKKwkvKgorCSAqCUFkanVzdCBmb3IgbWlzY2xvY2tlZCBjcmFwCisJICovCisJIAorCXJhdGUgPSAoIHJhdGUgKiBjbG9ja2luZykvNDgwMDA7CisJaWYoc3RyaWN0X2Nsb2NraW5nICYmIHJhdGUgPCA4MDAwKSB7CisJCXJhdGUgPSA4MDAwOworCQlkbWFidWYtPnJhdGUgPSAocmF0ZSAqIDQ4MDAwKS9jbG9ja2luZzsKKwl9CisKKwluZXdfcmF0ZSA9IGFjOTdfc2V0X2FkY19yYXRlKGNvZGVjLCByYXRlKTsKKwkKKwlpZihuZXdfcmF0ZSAhPSByYXRlKSB7CisJCWRtYWJ1Zi0+cmF0ZSA9IChuZXdfcmF0ZSAqIDQ4MDAwKS9jbG9ja2luZzsKKwkJcmF0ZSA9IG5ld19yYXRlOworCX0KKyNpZmRlZiBERUJVRworCXByaW50aygiaTgxMF9hdWRpbzogY2FsbGVkIGk4MTBfc2V0X2FkY19yYXRlIDogcmF0ZSA9ICVkLyVkXG4iLCBkbWFidWYtPnJhdGUsIHJhdGUpOworI2VuZGlmCisJcmV0dXJuIGRtYWJ1Zi0+cmF0ZTsKK30KKworLyogZ2V0IGN1cnJlbnQgcGxheWJhY2svcmVjb3JkaW5nIGRtYSBidWZmZXIgcG9pbnRlciAoYnl0ZSBvZmZzZXQgZnJvbSBMQkEpLAorICAgY2FsbGVkIHdpdGggc3BpbmxvY2sgaGVsZCEgKi8KKyAgIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBpODEwX2dldF9kbWFfYWRkcihzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUsIGludCByZWMpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgaW50IGNpdiwgb2Zmc2V0LCBwb3J0LCBwb3J0X3BpY2IsIGJ5dGVzID0gMjsKKwkKKwlpZiAoIWRtYWJ1Zi0+ZW5hYmxlKQorCQlyZXR1cm4gMDsKKworCWlmIChyZWMpCisJCXBvcnQgPSBkbWFidWYtPnJlYWRfY2hhbm5lbC0+cG9ydDsKKwllbHNlCisJCXBvcnQgPSBkbWFidWYtPndyaXRlX2NoYW5uZWwtPnBvcnQ7CisKKwlpZihzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxMikgeworCQlwb3J0X3BpY2IgPSBwb3J0ICsgT0ZGX1NSOworCQlieXRlcyA9IDE7CisJfSBlbHNlCisJCXBvcnRfcGljYiA9IHBvcnQgKyBPRkZfUElDQjsKKworCWRvIHsKKwkJY2l2ID0gR0VUX0NJVihzdGF0ZS0+Y2FyZCwgcG9ydCk7CisJCW9mZnNldCA9IEk4MTBfSU9SRUFEVyhzdGF0ZS0+Y2FyZCwgcG9ydF9waWNiKTsKKwkJLyogTXVzdCBoYXZlIGEgZGVsYXkgaGVyZSEgKi8gCisJCWlmKG9mZnNldCA9PSAwKQorCQkJdWRlbGF5KDEpOworCQkvKiBSZXJlYWQgYm90aCByZWdpc3RlcnMgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoYXQgdG90YWwKKwkJICogb2Zmc2V0IGZyb20gdGhlIGZpcnN0IHJlYWRpbmcgdG8gdGhlIHNlY29uZCBpcyAwLgorCQkgKiBUaGVyZSBpcyBhbiBpc3N1ZSB3aXRoIFNpUyBoYXJkd2FyZSB3aGVyZSBpdCB3aWxsIGNvdW50CisJCSAqIHBpY2IgZG93biB0byAwLCB0aGVuIHVwZGF0ZSBjaXYgdG8gdGhlIG5leHQgdmFsdWUsCisJCSAqIHRoZW4gc2V0IHRoZSBuZXcgcGljYiB0byBmcmFnc2l6ZSBieXRlcy4gIFdlIGNhbiBjYXRjaAorCQkgKiBpdCBiZXR3ZWVuIHRoZSBjaXYgdXBkYXRlIGFuZCB0aGUgcGljYiB1cGRhdGUsIG1ha2luZworCQkgKiBpdCBsb29rIGFzIHRob3VnaCB3ZSBhcmUgMSBmcmFnc2l6ZSBhaGVhZCBvZiB3aGVyZSB3ZQorCQkgKiBhcmUuICBUaGUgbmV4dCB0byB3ZSBnZXQgdGhlIGFkZHJlc3MgdGhvdWdoLCBpdCB3aWxsCisJCSAqIGJlIGJhY2sgaW4gdGhlIHJpZ2h0IHBsYWNlLCBhbmQgd2Ugd2lsbCBzdWRkZW5seSB0aGluaworCQkgKiB3ZSBqdXN0IHdlbnQgZm9yd2FyZCBkbWFzaXplIC0gZnJhZ3NpemUgYnl0ZXMsIGNhdXNpbmcKKwkJICogdG90YWxseSBzdHVwaWQgKmh1Z2UqIGRtYSBvdmVycnVuIG1lc3NhZ2VzLiAgV2UgYXJlCisJCSAqIGFzc3VtaW5nIHRoYXQgdGhlIDF1cyBkZWxheSBpcyBtb3JlIHRoYW4gbG9uZyBlbm91Z2gKKwkJICogdGhhdCB3ZSB3b24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IHRoZSBjaGlwIHN0aWxsIGJlaW5nCisJCSAqIG91dCBvZiBzeW5jIHdpdGggcmVhbGl0eSA7LSkKKwkJICovCisJfSB3aGlsZSAoY2l2ICE9IEdFVF9DSVYoc3RhdGUtPmNhcmQsIHBvcnQpIHx8IG9mZnNldCAhPSBJODEwX0lPUkVBRFcoc3RhdGUtPmNhcmQsIHBvcnRfcGljYikpOworCQkgCisJcmV0dXJuICgoKGNpdiArIDEpICogZG1hYnVmLT5mcmFnc2l6ZSAtIChieXRlcyAqIG9mZnNldCkpCisJCSUgZG1hYnVmLT5kbWFzaXplKTsKK30KKworLyogU3RvcCByZWNvcmRpbmcgKGxvY2sgaGVsZCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3BfYWRjKHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisKKwlkbWFidWYtPmVuYWJsZSAmPSB+QURDX1JVTk5JTkc7CisJSTgxMF9JT1dSSVRFQigwLCBjYXJkLCBQSV9DUik7CisJLy8gd2FpdCBmb3IgdGhlIGNhcmQgdG8gYWNrbm93bGVkZ2Ugc2h1dGRvd24KKwl3aGlsZSggSTgxMF9JT1JFQURCKGNhcmQsIFBJX0NSKSAhPSAwICkgOworCS8vIG5vdyBjbGVhciBhbnkgbGF0ZW50IGludGVycnVwdCBiaXRzIChsaWtlIHRoZSBoYWx0IGJpdCkKKwlpZihjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDEyKQorCQlJODEwX0lPV1JJVEVCKCBJODEwX0lPUkVBREIoY2FyZCwgUElfUElDQiksIGNhcmQsIFBJX1BJQ0IgKTsKKwllbHNlCisJCUk4MTBfSU9XUklURUIoIEk4MTBfSU9SRUFEQihjYXJkLCBQSV9TUiksIGNhcmQsIFBJX1NSICk7CisJSTgxMF9JT1dSSVRFTCggSTgxMF9JT1JFQURMKGNhcmQsIEdMT0JfU1RBKSAmIElOVF9QSSwgY2FyZCwgR0xPQl9TVEEpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RvcF9hZGMoc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fc3RhcnRfYWRjKHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKworCWlmIChkbWFidWYtPmNvdW50IDwgZG1hYnVmLT5kbWFzaXplICYmIGRtYWJ1Zi0+cmVhZHkgJiYgIWRtYWJ1Zi0+ZW5hYmxlICYmCisJICAgIChkbWFidWYtPnRyaWdnZXIgJiBQQ01fRU5BQkxFX0lOUFVUKSkgeworCQlkbWFidWYtPmVuYWJsZSB8PSBBRENfUlVOTklORzsKKwkJLy8gSW50ZXJydXB0IGVuYWJsZSwgTFZJIGVuYWJsZSwgRE1BIGVuYWJsZQorCQlJODEwX0lPV1JJVEVCKDB4MTAgfCAweDA0IHwgMHgwMSwgc3RhdGUtPmNhcmQsIFBJX0NSKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RhcnRfYWRjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIHN0b3AgcGxheWJhY2sgKGxvY2sgaGVsZCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N0b3BfZGFjKHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisKKwlkbWFidWYtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7CisJSTgxMF9JT1dSSVRFQigwLCBjYXJkLCBQT19DUik7CisJLy8gd2FpdCBmb3IgdGhlIGNhcmQgdG8gYWNrbm93bGVkZ2Ugc2h1dGRvd24KKwl3aGlsZSggSTgxMF9JT1JFQURCKGNhcmQsIFBPX0NSKSAhPSAwICkgOworCS8vIG5vdyBjbGVhciBhbnkgbGF0ZW50IGludGVycnVwdCBiaXRzIChsaWtlIHRoZSBoYWx0IGJpdCkKKwlpZihjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDEyKQorCQlJODEwX0lPV1JJVEVCKCBJODEwX0lPUkVBREIoY2FyZCwgUE9fUElDQiksIGNhcmQsIFBPX1BJQ0IgKTsKKwllbHNlCisJCUk4MTBfSU9XUklURUIoIEk4MTBfSU9SRUFEQihjYXJkLCBQT19TUiksIGNhcmQsIFBPX1NSICk7CisJSTgxMF9JT1dSSVRFTCggSTgxMF9JT1JFQURMKGNhcmQsIEdMT0JfU1RBKSAmIElOVF9QTywgY2FyZCwgR0xPQl9TVEEpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCV9fc3RvcF9kYWMoc3RhdGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX3N0YXJ0X2RhYyhzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisKKwlpZiAoZG1hYnVmLT5jb3VudCA+IDAgJiYgZG1hYnVmLT5yZWFkeSAmJiAhZG1hYnVmLT5lbmFibGUgJiYKKwkgICAgKGRtYWJ1Zi0+dHJpZ2dlciAmIFBDTV9FTkFCTEVfT1VUUFVUKSkgeworCQlkbWFidWYtPmVuYWJsZSB8PSBEQUNfUlVOTklORzsKKwkJLy8gSW50ZXJydXB0IGVuYWJsZSwgTFZJIGVuYWJsZSwgRE1BIGVuYWJsZQorCQlJODEwX0lPV1JJVEVCKDB4MTAgfCAweDA0IHwgMHgwMSwgc3RhdGUtPmNhcmQsIFBPX0NSKTsKKwl9Cit9CitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlfX3N0YXJ0X2RhYyhzdGF0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCisjZGVmaW5lIERNQUJVRl9ERUZBVUxUT1JERVIgKDE2LVBBR0VfU0hJRlQpCisjZGVmaW5lIERNQUJVRl9NSU5PUkRFUiAxCisKKy8qIGFsbG9jYXRlIERNQSBidWZmZXIsIHBsYXliYWNrIGFuZCByZWNvcmRpbmcgYnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgc2VwYXJhdGVseSAqLworc3RhdGljIGludCBhbGxvY19kbWFidWYoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXZvaWQgKnJhd2J1Zj0gTlVMTDsKKwlpbnQgb3JkZXIsIHNpemU7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSBhbnkgb3NzIGZyYWcgcGFyYW1zLCB0aGVuIHVzZSBvdXIgZGVmYXVsdCBvbmVzICovCisJaWYoZG1hYnVmLT5vc3NtYXhmcmFncyA9PSAwKQorCQlkbWFidWYtPm9zc21heGZyYWdzID0gNDsKKwlpZihkbWFidWYtPm9zc2ZyYWdzaXplID09IDApCisJCWRtYWJ1Zi0+b3NzZnJhZ3NpemUgPSAoUEFHRV9TSVpFPDxETUFCVUZfREVGQVVMVE9SREVSKS9kbWFidWYtPm9zc21heGZyYWdzOworCXNpemUgPSBkbWFidWYtPm9zc2ZyYWdzaXplICogZG1hYnVmLT5vc3NtYXhmcmFnczsKKworCWlmKGRtYWJ1Zi0+cmF3YnVmICYmIChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgPT0gc2l6ZSkKKwkJcmV0dXJuIDA7CisJLyogYWxsb2MgZW5vdWdoIHRvIHNhdGlzZnkgdGhlIG9zcyBwYXJhbXMgKi8KKwlmb3IgKG9yZGVyID0gRE1BQlVGX0RFRkFVTFRPUkRFUjsgb3JkZXIgPj0gRE1BQlVGX01JTk9SREVSOyBvcmRlci0tKSB7CisJCWlmICggKFBBR0VfU0laRTw8b3JkZXIpID4gc2l6ZSApCisJCQljb250aW51ZTsKKwkJaWYgKChyYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChzdGF0ZS0+Y2FyZC0+cGNpX2RldiwKKwkJCQkJCSAgIFBBR0VfU0laRSA8PCBvcmRlciwKKwkJCQkJCSAgICZkbWFidWYtPmRtYV9oYW5kbGUpKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoIXJhd2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKworI2lmZGVmIERFQlVHCisJcHJpbnRrKCJpODEwX2F1ZGlvOiBhbGxvY2F0ZWQgJWxkIChvcmRlciA9ICVkKSBieXRlcyBhdCAlcFxuIiwKKwkgICAgICAgUEFHRV9TSVpFIDw8IG9yZGVyLCBvcmRlciwgcmF3YnVmKTsKKyNlbmRpZgorCisJZG1hYnVmLT5yZWFkeSAgPSBkbWFidWYtPm1hcHBlZCA9IDA7CisJZG1hYnVmLT5yYXdidWYgPSByYXdidWY7CisJZG1hYnVmLT5idWZvcmRlciA9IG9yZGVyOworCQorCS8qIG5vdyBtYXJrIHRoZSBwYWdlcyBhcyByZXNlcnZlZDsgb3RoZXJ3aXNlIHJlbWFwX3Bmbl9yYW5nZSBkb2Vzbid0IGRvIHdoYXQgd2Ugd2FudCAqLworCXBlbmQgPSB2aXJ0X3RvX3BhZ2UocmF3YnVmICsgKFBBR0VfU0laRSA8PCBvcmRlcikgLSAxKTsKKwlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UocmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKKworCXJldHVybiAwOworfQorCisvKiBmcmVlIERNQSBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIGRlYWxsb2NfZG1hYnVmKHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CisKKwlpZiAoZG1hYnVmLT5yYXdidWYpIHsKKwkJLyogdW5kbyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAqLworCQlwZW5kID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHN0YXRlLT5jYXJkLT5wY2lfZGV2LCBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlciwKKwkJCQkgICAgZG1hYnVmLT5yYXdidWYsIGRtYWJ1Zi0+ZG1hX2hhbmRsZSk7CisJfQorCWRtYWJ1Zi0+cmF3YnVmID0gTlVMTDsKKwlkbWFidWYtPm1hcHBlZCA9IGRtYWJ1Zi0+cmVhZHkgPSAwOworfQorCitzdGF0aWMgaW50IHByb2dfZG1hYnVmKHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSwgdW5zaWduZWQgcmVjKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXN0cnVjdCBpODEwX2NoYW5uZWwgKmM7CisJc3RydWN0IHNnX2l0ZW0gKnNnOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKwl1bnNpZ25lZCBmcmFnaW50OworCWludCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJaWYoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykKKwkJX19zdG9wX2RhYyhzdGF0ZSk7CisJaWYoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKKwkJX19zdG9wX2FkYyhzdGF0ZSk7CisJZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7CisJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZXJyb3IgPSAwOworCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJLyogYWxsb2NhdGUgRE1BIGJ1ZmZlciwgbGV0IGFsbG9jX2RtYWJ1ZiBkZXRlcm1pbmUgaWYgd2UgYXJlIGFscmVhZHkKKwkgKiBhbGxvY2F0ZWQgd2VsbCBlbm91Z2ggb3IgaWYgd2Ugc2hvdWxkIHJlcGxhY2UgdGhlIGN1cnJlbnQgYnVmZmVyCisJICogKGFzc3VtaW5nIG9uZSBpcyBhbHJlYWR5IGFsbG9jYXRlZCwgaWYgaXQgaXNuJ3QsIHRoZW4gYWxsb2NhdGUgaXQpLgorCSAqLworCWlmICgocmV0ID0gYWxsb2NfZG1hYnVmKHN0YXRlKSkpCisJCXJldHVybiByZXQ7CisKKwkvKiBGSVhNRTogZmlndXJlIG91dCBhbGwgdGhpcyBPU1MgZnJhZ21lbnQgc3R1ZmYgKi8KKwkvKiBJIGRpZCwgaXQgbm93IGRvZXMgd2hhdCBpdCBzaG91bGQgYWNjb3JkaW5nIHRvIHRoZSBPU1MgQVBJLiAgREwgKi8KKwkvKiBXZSBtYXkgbm90IGhhdmUgcmVhbGxvY2VkIG91ciBkbWFidWYsIGJ1dCB0aGUgZnJhZ21lbnQgc2l6ZSB0bworCSAqIGZyYWdtZW50IG51bWJlciByYXRpbyBtYXkgaGF2ZSBjaGFuZ2VkLCBzbyBnbyBhaGVhZCBhbmQgcmVwcm9ncmFtCisJICogdGhpbmdzCisJICovCisJZG1hYnVmLT5kbWFzaXplID0gUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXI7CisJZG1hYnVmLT5udW1mcmFnID0gU0dfTEVOOworCWRtYWJ1Zi0+ZnJhZ3NpemUgPSBkbWFidWYtPmRtYXNpemUvZG1hYnVmLT5udW1mcmFnOworCWRtYWJ1Zi0+ZnJhZ3NhbXBsZXMgPSBkbWFidWYtPmZyYWdzaXplID4+IDE7CisJZG1hYnVmLT5mcmFnc2hpZnQgPSBmZnMoZG1hYnVmLT5mcmFnc2l6ZSkgLSAxOworCWRtYWJ1Zi0+dXNlcmZyYWdzaXplID0gZG1hYnVmLT5vc3NmcmFnc2l6ZTsKKwlkbWFidWYtPnVzZXJmcmFncyA9IGRtYWJ1Zi0+ZG1hc2l6ZS9kbWFidWYtPm9zc2ZyYWdzaXplOworCisJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAwLCBkbWFidWYtPmRtYXNpemUpOworCisJaWYoZG1hYnVmLT5vc3NtYXhmcmFncyA9PSA0KSB7CisJCWZyYWdpbnQgPSA4OworCX0gZWxzZSBpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA9PSA4KSB7CisJCWZyYWdpbnQgPSA0OworCX0gZWxzZSBpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA9PSAxNikgeworCQlmcmFnaW50ID0gMjsKKwl9IGVsc2UgeworCQlmcmFnaW50ID0gMTsKKwl9CisJLyoKKwkgKglOb3cgc2V0IHVwIHRoZSByaW5nIAorCSAqLworCWlmKGRtYWJ1Zi0+cmVhZF9jaGFubmVsKQorCQljID0gZG1hYnVmLT5yZWFkX2NoYW5uZWw7CisJZWxzZQorCQljID0gZG1hYnVmLT53cml0ZV9jaGFubmVsOworCXdoaWxlKGMgIT0gTlVMTCkgeworCQlzZz0mYy0+c2dbMF07CisJCS8qCisJCSAqCUxvYWQgdXAgMzIgc2cgZW50cmllcyBhbmQgdGFrZSBhbiBpbnRlcnJ1cHQgYXQgaGFsZgorCQkgKgl3YXkgKHdlIG1pZ2h0IHdhbnQgbW9yZSBpbnRlcnJ1cHRzIGxhdGVyLi4pIAorCQkgKi8KKwkgIAorCQlmb3IoaT0wO2k8ZG1hYnVmLT5udW1mcmFnO2krKykKKwkJeworCQkJc2ctPmJ1c2FkZHI9KHUzMilkbWFidWYtPmRtYV9oYW5kbGUrZG1hYnVmLT5mcmFnc2l6ZSppOworCQkJLy8gdGhlIGNhcmQgd2lsbCBhbHdheXMgYmUgZG9pbmcgMTZiaXQgc3RlcmVvCisJCQlzZy0+Y29udHJvbD1kbWFidWYtPmZyYWdzYW1wbGVzOworCQkJaWYoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1NJXzcwMTIpCisJCQkJc2ctPmNvbnRyb2wgPDw9IDE7CisJCQlzZy0+Y29udHJvbHw9Q09OX0JVRlBBRDsKKwkJCS8vIHNldCB1cyB1cCB0byBnZXQgSU9DIGludGVycnVwdHMgYXMgb2Z0ZW4gYXMgbmVlZGVkIHRvCisJCQkvLyBzYXRpc2Z5IG51bWZyYWcgcmVxdWlyZW1lbnRzLCBubyBtb3JlCisJCQlpZiggKChpKzEpICUgZnJhZ2ludCkgPT0gMCkgeworCQkJCXNnLT5jb250cm9sfD1DT05fSU9DOworCQkJfQorCQkJc2crKzsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJSTgxMF9JT1dSSVRFQigyLCBzdGF0ZS0+Y2FyZCwgYy0+cG9ydCtPRkZfQ1IpOyAgIC8qIHJlc2V0IERNQSBtYWNoaW5lICovCisJCXdoaWxlKCBJODEwX0lPUkVBREIoc3RhdGUtPmNhcmQsIGMtPnBvcnQrT0ZGX0NSKSAmIDB4MDIgKSA7CisJCUk4MTBfSU9XUklURUwoKHUzMilzdGF0ZS0+Y2FyZC0+Y2hhbmRtYSArCisJCSAgICBjLT5udW0qc2l6ZW9mKHN0cnVjdCBpODEwX2NoYW5uZWwpLAorCQkgICAgc3RhdGUtPmNhcmQsIGMtPnBvcnQrT0ZGX0JEQkFSKTsKKwkJQ0lWX1RPX0xWSShzdGF0ZS0+Y2FyZCwgYy0+cG9ydCwgMCk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZihjICE9IGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbCkKKwkJCWMgPSBkbWFidWYtPndyaXRlX2NoYW5uZWw7CisJCWVsc2UKKwkJCWMgPSBOVUxMOworCX0KKwkKKwkvKiBzZXQgdGhlIHJlYWR5IGZsYWcgZm9yIHRoZSBkbWEgYnVmZmVyICovCisJZG1hYnVmLT5yZWFkeSA9IDE7CisKKyNpZmRlZiBERUJVRworCXByaW50aygiaTgxMF9hdWRpbzogcHJvZ19kbWFidWYsIHNhbXBsZSByYXRlID0gJWQsIGZvcm1hdCA9ICVkLFxuXHRudW1mcmFnID0gJWQsICIKKwkgICAgICAgImZyYWdzaXplID0gJWQgZG1hc2l6ZSA9ICVkXG4iLAorCSAgICAgICBkbWFidWYtPnJhdGUsIGRtYWJ1Zi0+Zm10LCBkbWFidWYtPm51bWZyYWcsCisJICAgICAgIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+ZG1hc2l6ZSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2k4MTBfdXBkYXRlX2x2aShzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUsIGludCByZWMpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJaW50IHgsIHBvcnQ7CisJaW50IHRyaWdnZXI7CisJaW50IGNvdW50LCBmcmFnc2l6ZTsKKwl2b2lkICgqc3RhcnQpKHN0cnVjdCBpODEwX3N0YXRlICopOworCisJY291bnQgPSBkbWFidWYtPmNvdW50OworCWlmIChyZWMpIHsKKwkJcG9ydCA9IGRtYWJ1Zi0+cmVhZF9jaGFubmVsLT5wb3J0OworCQl0cmlnZ2VyID0gUENNX0VOQUJMRV9JTlBVVDsKKwkJc3RhcnQgPSBfX3N0YXJ0X2FkYzsKKwkJY291bnQgPSBkbWFidWYtPmRtYXNpemUgLSBjb3VudDsKKwl9IGVsc2UgeworCQlwb3J0ID0gZG1hYnVmLT53cml0ZV9jaGFubmVsLT5wb3J0OworCQl0cmlnZ2VyID0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCXN0YXJ0ID0gX19zdGFydF9kYWM7CisJfQorCisJLyogRG8gbm90IHByb2Nlc3MgcGFydGlhbCBmcmFnbWVudHMuICovCisJZnJhZ3NpemUgPSBkbWFidWYtPmZyYWdzaXplOworCWlmIChjb3VudCA8IGZyYWdzaXplKQorCQlyZXR1cm47CisKKwkvKiBpZiB3ZSBhcmUgY3VycmVudGx5IHN0b3BwZWQsIHRoZW4gb3VyIENJViBpcyBhY3R1YWxseSBzZXQgdG8gb3VyCisJICogKmxhc3QqIHNnIHNlZ21lbnQgYW5kIHdlIGFyZSByZWFkeSB0byB3cmFwIHRvIHRoZSBuZXh0LiAgSG93ZXZlciwKKwkgKiBpZiB3ZSBzZXQgb3VyIExWSSB0byB0aGUgbGFzdCBzZyBzZWdtZW50LCB0aGVuIGl0IHdvbid0IHdyYXAgdG8KKwkgKiB0aGUgbmV4dCBzZyBzZWdtZW50LCBpdCB3b24ndCBldmVuIGdldCBhIHN0YXJ0LiAgU28sIGluc3RlYWQsIHdoZW4KKwkgKiB3ZSBhcmUgc3RvcHBlZCwgd2Ugc2V0IGJvdGggdGhlIExWSSB2YWx1ZSBhbmQgYWxzbyB3ZSBpbmNyZW1lbnQKKwkgKiB0aGUgQ0lWIHZhbHVlIHRvIHRoZSBuZXh0IHNnIHNlZ21lbnQgdG8gYmUgcGxheWVkIHNvIHRoYXQgd2hlbgorCSAqIHdlIGNhbGwgc3RhcnQsIHRoaW5ncyB3aWxsIG9wZXJhdGUgcHJvcGVybHkuICBTaW5jZSB0aGUgQ0lWIGNhbid0CisJICogYmUgd3JpdHRlbiB0byBkaXJlY3RseSBmb3IgdGhpcyBwdXJwb3NlLCB3ZSBzZXQgdGhlIExWSSB0byBDSVYgKyAxCisJICogdGVtcG9yYXJpbHkuICBPbmNlIHRoZSBlbmdpbmUgaGFzIHN0YXJ0ZWQgd2Ugc2V0IHRoZSBMVkkgdG8gaXRzCisJICogZmluYWwgdmFsdWUuCisJICovCisJaWYgKCFkbWFidWYtPmVuYWJsZSAmJiBkbWFidWYtPnJlYWR5KSB7CisJCWlmICghKGRtYWJ1Zi0+dHJpZ2dlciAmIHRyaWdnZXIpKQorCQkJcmV0dXJuOworCisJCUNJVl9UT19MVkkoc3RhdGUtPmNhcmQsIHBvcnQsIDEpOworCisJCXN0YXJ0KHN0YXRlKTsKKwkJd2hpbGUgKCEoSTgxMF9JT1JFQURCKHN0YXRlLT5jYXJkLCBwb3J0ICsgT0ZGX0NSKSAmICgoMTw8NCkgfCAoMTw8MikpKSkKKwkJCTsKKwl9CisKKwkvKiBNQVNLUDIoc3dwdHIsIGZyYWdzaXplKSAtIDEgaXMgdGhlIHRhaWwgb2Ygb3VyIHRyYW5zZmVyICovCisJeCA9IE1PRFVMT1AyKE1BU0tQMihkbWFidWYtPnN3cHRyLCBmcmFnc2l6ZSkgLSAxLCBkbWFidWYtPmRtYXNpemUpOworCXggPj49IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCUk4MTBfSU9XUklURUIoeCwgc3RhdGUtPmNhcmQsIHBvcnQgKyBPRkZfTFZJKTsKK30KKworc3RhdGljIHZvaWQgaTgxMF91cGRhdGVfbHZpKHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSwgaW50IHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYoIWRtYWJ1Zi0+cmVhZHkpCisJCXJldHVybjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlfX2k4MTBfdXBkYXRlX2x2aShzdGF0ZSwgcmVjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworfQorCisvKiB1cGRhdGUgYnVmZmVyIG1hbmFuZ2VtZW50IHBvaW50ZXJzLCBlc3BlY2lhbGx5LCBkbWFidWYtPmNvdW50IGFuZCBkbWFidWYtPmh3cHRyICovCitzdGF0aWMgdm9pZCBpODEwX3VwZGF0ZV9wdHIoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGh3cHRyOworCXVuc2lnbmVkIGZyYWdtYXNrLCBkbWFtYXNrOworCWludCBkaWZmOworCisJZnJhZ21hc2sgPSBNQVNLUDIofjAsIGRtYWJ1Zi0+ZnJhZ3NpemUpOworCWRtYW1hc2sgPSBNT0RVTE9QMih+MCwgZG1hYnVmLT5kbWFzaXplKTsKKworCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIEFEQyAqLworCWlmIChkbWFidWYtPmVuYWJsZSA9PSBBRENfUlVOTklORykgeworCQkvKiB1cGRhdGUgaGFyZHdhcmUgcG9pbnRlciAqLworCQlod3B0ciA9IGk4MTBfZ2V0X2RtYV9hZGRyKHN0YXRlLCAxKSAmIGZyYWdtYXNrOworCQlkaWZmID0gKGh3cHRyIC0gZG1hYnVmLT5od3B0cikgJiBkbWFtYXNrOworI2lmIGRlZmluZWQoREVCVUdfSU5URVJSVVBUUykgfHwgZGVmaW5lZChERUJVR19NTUFQKQorCQlwcmludGsoIkFEQyBIV1AgJWQsJWQsJWRcbiIsIGh3cHRyLCBkbWFidWYtPmh3cHRyLCBkaWZmKTsKKyNlbmRpZgorCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJZG1hYnVmLT5jb3VudCArPSBkaWZmOworCQlpZiAoZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQkJLyogYnVmZmVyIHVuZGVycnVuIG9yIGJ1ZmZlciBvdmVycnVuICovCisJCQkvKiB0aGlzIGlzIG5vcm1hbCBmb3IgdGhlIGVuZCBvZiBhIHJlYWQgKi8KKwkJCS8qIG9ubHkgZ2l2ZSBhbiBlcnJvciBpZiB3ZSB3ZW50IHBhc3QgdGhlICovCisJCQkvKiBsYXN0IHZhbGlkIHNnIGVudHJ5ICovCisJCQlpZiAoR0VUX0NJVihzdGF0ZS0+Y2FyZCwgUElfQkFTRSkgIT0KKwkJCSAgICBHRVRfTFZJKHN0YXRlLT5jYXJkLCBQSV9CQVNFKSkgeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgImk4MTBfYXVkaW86IERNQSBvdmVycnVuIG9uIHJlYWRcbiIpOworCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKKwkJCX0KKwkJfQorCQlpZiAoZGlmZikKKwkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJfQorCS8qIGVycm9yIGhhbmRsaW5nIGFuZCBwcm9jZXNzIHdha2UgdXAgZm9yIERBQyAqLworCWlmIChkbWFidWYtPmVuYWJsZSA9PSBEQUNfUlVOTklORykgeworCQkvKiB1cGRhdGUgaGFyZHdhcmUgcG9pbnRlciAqLworCQlod3B0ciA9IGk4MTBfZ2V0X2RtYV9hZGRyKHN0YXRlLCAwKSAmIGZyYWdtYXNrOworCQlkaWZmID0gKGh3cHRyIC0gZG1hYnVmLT5od3B0cikgJiBkbWFtYXNrOworI2lmIGRlZmluZWQoREVCVUdfSU5URVJSVVBUUykgfHwgZGVmaW5lZChERUJVR19NTUFQKQorCQlwcmludGsoIkRBQyBIV1AgJWQsJWQsJWRcbiIsIGh3cHRyLCBkbWFidWYtPmh3cHRyLCBkaWZmKTsKKyNlbmRpZgorCQlkbWFidWYtPmh3cHRyID0gaHdwdHI7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCQlpZiAoZG1hYnVmLT5jb3VudCA8IDApIHsKKwkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biAqLworCQkJLyogdGhpcyBpcyBub3JtYWwgZm9yIHRoZSBlbmQgb2YgYSB3cml0ZSAqLworCQkJLyogb25seSBnaXZlIGFuIGVycm9yIGlmIHdlIHdlbnQgcGFzdCB0aGUgKi8KKwkJCS8qIGxhc3QgdmFsaWQgc2cgZW50cnkgKi8KKwkJCWlmIChHRVRfQ0lWKHN0YXRlLT5jYXJkLCBQT19CQVNFKSAhPQorCQkJICAgIEdFVF9MVkkoc3RhdGUtPmNhcmQsIFBPX0JBU0UpKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTgxMF9hdWRpbzogRE1BIG92ZXJydW4gb24gd3JpdGVcbiIpOworCQkJCXByaW50aygiaTgxMF9hdWRpbzogQ0lWICVkLCBMVkkgJWQsIGh3cHRyICV4LCAiCisJCQkJCSJjb3VudCAlZFxuIiwKKwkJCQkJR0VUX0NJVihzdGF0ZS0+Y2FyZCwgUE9fQkFTRSksCisJCQkJCUdFVF9MVkkoc3RhdGUtPmNhcmQsIFBPX0JBU0UpLAorCQkJCQlkbWFidWYtPmh3cHRyLCBkbWFidWYtPmNvdW50KTsKKwkJCQlkbWFidWYtPmVycm9yKys7CisJCQl9CisJCX0KKwkJaWYgKGRpZmYpCisJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgaTgxMF9nZXRfZnJlZV93cml0ZV9zcGFjZShzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJaW50IGZyZWU7CisKKwlpODEwX3VwZGF0ZV9wdHIoc3RhdGUpOworCS8vIGNhdGNoIHVuZGVycnVucyBkdXJpbmcgcGxheWJhY2sKKwlpZiAoZG1hYnVmLT5jb3VudCA8IDApIHsKKwkJZG1hYnVmLT5jb3VudCA9IDA7CisJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOworCX0KKwlmcmVlID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKwlpZihmcmVlIDwgMCkKKwkJcmV0dXJuKDApOworCXJldHVybihmcmVlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaTgxMF9nZXRfYXZhaWxhYmxlX3JlYWRfZGF0YShzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJaW50IGF2YWlsOworCisJaTgxMF91cGRhdGVfcHRyKHN0YXRlKTsKKwkvLyBjYXRjaCBvdmVycnVucyBkdXJpbmcgcmVjb3JkCisJaWYgKGRtYWJ1Zi0+Y291bnQgPiBkbWFidWYtPmRtYXNpemUpIHsKKwkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJfQorCWF2YWlsID0gZG1hYnVmLT5jb3VudDsKKwlpZihhdmFpbCA8IDApCisJCXJldHVybigwKTsKKwlyZXR1cm4oYXZhaWwpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9wYXJ0aWFsX2ZyYWcoc3RydWN0IGRtYWJ1ZiAqZG1hYnVmKQoreworCXVuc2lnbmVkIGZyYWdzaXplOworCXVuc2lnbmVkIHN3cHRyLCBsZW47CisKKwlmcmFnc2l6ZSA9IGRtYWJ1Zi0+ZnJhZ3NpemU7CisJc3dwdHIgPSBkbWFidWYtPnN3cHRyOworCWxlbiA9IGZyYWdzaXplIC0gTU9EVUxPUDIoZG1hYnVmLT5zd3B0ciwgZnJhZ3NpemUpOworCWlmIChsZW4gPT0gZnJhZ3NpemUpCisJCXJldHVybjsKKworCW1lbXNldChkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCAnXDAnLCBsZW4pOworCWRtYWJ1Zi0+c3dwdHIgPSBNT0RVTE9QMihzd3B0ciArIGxlbiwgZG1hYnVmLT5kbWFzaXplKTsKKwlkbWFidWYtPmNvdW50ICs9IGxlbjsKK30KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IGk4MTBfc3RhdGUgKnN0YXRlLCBpbnQgc2lnbmFsc19hbGxvd2VkKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyB0bW87CisJaW50IGNvdW50OworCisJaWYgKCFkbWFidWYtPnJlYWR5KQorCQlyZXR1cm4gMDsKKwlpZihkbWFidWYtPm1hcHBlZCkgeworCQlzdG9wX2RhYyhzdGF0ZSk7CisJCXJldHVybiAwOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJZmlsbF9wYXJ0aWFsX2ZyYWcoZG1hYnVmKTsKKworCS8qIAorCSAqIFRoaXMgd2lsbCBtYWtlIHN1cmUgdGhhdCBvdXIgTFZJIGlzIGNvcnJlY3QsIHRoYXQgb3VyCisJICogcG9pbnRlciBpcyB1cGRhdGVkLCBhbmQgdGhhdCB0aGUgREFDIGlzIHJ1bm5pbmcuICBXZQorCSAqIGhhdmUgdG8gZm9yY2UgdGhlIHNldHRpbmcgb2YgZG1hYnVmLT50cmlnZ2VyIHRvIGF2b2lkCisJICogYW55IHBvc3NpYmxlIGRlYWRsb2Nrcy4KKwkgKi8KKwlkbWFidWYtPnRyaWdnZXIgPSBQQ01fRU5BQkxFX09VVFBVVDsKKwlfX2k4MTBfdXBkYXRlX2x2aShzdGF0ZSwgMCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOworCWZvciAoOzspIHsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaTgxMF91cGRhdGVfcHRyKHN0YXRlKTsKKwkJY291bnQgPSBkbWFidWYtPmNvdW50OworCisJCS8qIEl0IHNlZW1zIHRoYXQgd2UgaGF2ZSB0byBzZXQgdGhlIGN1cnJlbnQgc3RhdGUgdG8KKwkJICogVEFTS19JTlRFUlJVUFRJQkxFIGV2ZXJ5IHRpbWUgdG8gbWFrZSB0aGUgcHJvY2VzcworCQkgKiByZWFsbHkgZ28gdG8gc2xlZXAuICBUaGlzIGFsc28gaGFzIHRvIGJlICphZnRlciogdGhlCisJCSAqIHVwZGF0ZV9wdHIoKSBjYWxsIGJlY2F1c2UgdXBkYXRlX3B0ciBpcyBsaWtlbHkgdG8KKwkJICogZG8gYSB3YWtlX3VwKCkgd2hpY2ggd2lsbCB1bnNldCB0aGlzIGJlZm9yZSB3ZSBldmVyCisJCSAqIHRyeSB0byBzbGVlcCwgcmVzdWxpbmcgaW4gYSB0aWdodCBsb29wIGluIHRoaXMgY29kZQorCQkgKiBpbnN0ZWFkIG9mIGFjdHVhbGx5IHNsZWVwaW5nIGFuZCB3YWl0aW5nIGZvciBhbgorCQkgKiBpbnRlcnJ1cHQgdG8gd2FrZSB1cyB1cCEKKwkJICovCisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoc2lnbmFsc19hbGxvd2VkID8KKwkJCQkgICAgVEFTS19JTlRFUlJVUFRJQkxFIDogVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisKKyAgICAgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgc2lnbmFsc19hbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKwkJLyoKKwkJICogc2V0IHRoZSB0aW1lb3V0IHRvIHNpZ25pZmljYW50bHkgbG9uZ2VyIHRoYW4gaXQgKnNob3VsZCoKKwkJICogdGFrZSBmb3IgdGhlIERBQyB0byBkcmFpbiB0aGUgRE1BIGJ1ZmZlcgorCQkgKi8KKwkJdG1vID0gKGNvdW50ICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSk7CisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPj0gMiA/IHRtbyA6IDIpKXsKKwkJCXByaW50ayhLRVJOX0VSUiAiaTgxMF9hdWRpbzogZHJhaW5fZGFjLCBkbWEgdGltZW91dD9cbiIpOworCQkJY291bnQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CisJaWYoY291bnQgPiAwICYmIHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpICYmIHNpZ25hbHNfYWxsb3dlZCkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlzdG9wX2RhYyhzdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBfY2hhbm5lbF9pbnRlcnJ1cHQoc3RydWN0IGk4MTBfY2FyZCAqY2FyZCkKK3sKKwlpbnQgaSwgY291bnQ7CisJCisjaWZkZWYgREVCVUdfSU5URVJSVVBUUworCXByaW50aygiQ0hBTk5FTCAiKTsKKyNlbmRpZgorCWZvcihpPTA7aTxOUl9IV19DSDtpKyspCisJeworCQlzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV07CisJCXN0cnVjdCBpODEwX2NoYW5uZWwgKmM7CisJCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwkJdW5zaWduZWQgbG9uZyBwb3J0OworCQl1MTYgc3RhdHVzOworCQkKKwkJaWYoIXN0YXRlKQorCQkJY29udGludWU7CisJCWlmKCFzdGF0ZS0+ZG1hYnVmLnJlYWR5KQorCQkJY29udGludWU7CisJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQlpZihkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSB7CisJCQljPWRtYWJ1Zi0+d3JpdGVfY2hhbm5lbDsKKwkJfSBlbHNlIGlmKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpIHsKKwkJCWM9ZG1hYnVmLT5yZWFkX2NoYW5uZWw7CisJCX0gZWxzZQkvKiBUaGlzIGNhbiBvY2N1ciBnb2luZyBmcm9tIFIvVyB0byBjbG9zZSAqLworCQkJY29udGludWU7CisJCQorCQlwb3J0ID0gYy0+cG9ydDsKKworCQlpZihjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDEyKQorCQkJc3RhdHVzID0gSTgxMF9JT1JFQURXKGNhcmQsIHBvcnQgKyBPRkZfUElDQik7CisJCWVsc2UKKwkJCXN0YXR1cyA9IEk4MTBfSU9SRUFEVyhjYXJkLCBwb3J0ICsgT0ZGX1NSKTsKKworI2lmZGVmIERFQlVHX0lOVEVSUlVQVFMKKwkJcHJpbnRrKCJOVU0gJWQgUE9SVCAlWCBJUlEgKCBTVCVkICIsIGMtPm51bSwgYy0+cG9ydCwgc3RhdHVzKTsKKyNlbmRpZgorCQlpZihzdGF0dXMgJiBETUFfSU5UX0NPTVBMRVRFKQorCQl7CisJCQkvKiBvbmx5IHdha2VfdXAoKSB3YWl0ZXJzIGlmIHRoaXMgaW50ZXJydXB0IHNpZ25hbHMKKwkJCSAqIHVzIGJlaW5nIGJleW9uZCBhIHVzZXJmcmFnc2l6ZSBvZiBkYXRhIG9wZW4gb3IKKwkJCSAqIGF2YWlsYWJsZSwgYW5kIGk4MTBfdXBkYXRlX3B0cigpIGRvZXMgdGhhdCBmb3IKKwkJCSAqIHVzCisJCQkgKi8KKwkJCWk4MTBfdXBkYXRlX3B0cihzdGF0ZSk7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUUworCQkJcHJpbnRrKCJDT01QICVkICIsIGRtYWJ1Zi0+aHdwdHIgLworCQkJCQlkbWFidWYtPmZyYWdzaXplKTsKKyNlbmRpZgorCQl9CisJCWlmKHN0YXR1cyAmIChETUFfSU5UX0xWSSB8IERNQV9JTlRfRENIKSkKKwkJeworCQkJLyogd2FrZV91cCgpIHVuY29uZGl0aW9uYWxseSBvbiBMVkkgYW5kIERDSCAqLworCQkJaTgxMF91cGRhdGVfcHRyKHN0YXRlKTsKKwkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUUworCQkJaWYoc3RhdHVzICYgRE1BX0lOVF9MVkkpCisJCQkJcHJpbnRrKCJMVkkgIik7CisJCQlpZihzdGF0dXMgJiBETUFfSU5UX0RDSCkKKwkJCQlwcmludGsoIkRDSCAtIik7CisjZW5kaWYKKwkJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJCWlmKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpCisJCQkJY291bnQgPSBkbWFidWYtPmRtYXNpemUgLSBjb3VudDsKKwkJCWlmIChjb3VudCA+PSAoaW50KWRtYWJ1Zi0+ZnJhZ3NpemUpIHsKKwkJCQlJODEwX0lPV1JJVEVCKEk4MTBfSU9SRUFEQihjYXJkLCBwb3J0K09GRl9DUikgfCAxLCBjYXJkLCBwb3J0K09GRl9DUik7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUUworCQkJCXByaW50aygiIENPTlRJTlVFICIpOworI2VuZGlmCisJCQl9IGVsc2UgeworCQkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKQorCQkJCQlfX3N0b3BfZGFjKHN0YXRlKTsKKwkJCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKKwkJCQkJX19zdG9wX2FkYyhzdGF0ZSk7CisJCQkJZG1hYnVmLT5lbmFibGUgPSAwOworI2lmZGVmIERFQlVHX0lOVEVSUlVQVFMKKwkJCQlwcmludGsoIiBTVE9QICIpOworI2VuZGlmCisJCQl9CisJCX0KKwkJaWYoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfU0lfNzAxMikKKwkJCUk4MTBfSU9XUklURVcoc3RhdHVzICYgRE1BX0lOVF9NQVNLLCBjYXJkLCBwb3J0ICsgT0ZGX1BJQ0IpOworCQllbHNlCisJCQlJODEwX0lPV1JJVEVXKHN0YXR1cyAmIERNQV9JTlRfTUFTSywgY2FyZCwgcG9ydCArIE9GRl9TUik7CisJfQorI2lmZGVmIERFQlVHX0lOVEVSUlVQVFMKKwlwcmludGsoIilcbiIpOworI2VuZGlmCit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpODEwX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQgPSAoc3RydWN0IGk4MTBfY2FyZCAqKWRldl9pZDsKKwl1MzIgc3RhdHVzOworCisJc3Bpbl9sb2NrKCZjYXJkLT5sb2NrKTsKKworCXN0YXR1cyA9IEk4MTBfSU9SRUFETChjYXJkLCBHTE9CX1NUQSk7CisKKwlpZighKHN0YXR1cyAmIElOVF9NQVNLKSkgCisJeworCQlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CisJCXJldHVybiBJUlFfTk9ORTsgIC8qIG5vdCBmb3IgdXMgKi8KKwl9CisKKwlpZihzdGF0dXMgJiAoSU5UX1BPfElOVF9QSXxJTlRfTUMpKQorCQlpODEwX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQpOworCisgCS8qIGNsZWFyICdlbSAqLworCUk4MTBfSU9XUklURUwoc3RhdHVzICYgSU5UX01BU0ssIGNhcmQsIEdMT0JfU1RBKTsKKwlzcGluX3VubG9jaygmY2FyZC0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMKKyAgIHdhaXRpbmcgdG8gYmUgY29waWVkIHRvIHRoZSB1c2VyJ3MgYnVmZmVyLiAgSXQgaXMgZmlsbGVkIGJ5IHRoZSBkbWEKKyAgIG1hY2hpbmUgYW5kIGRyYWluZWQgYnkgdGhpcyBsb29wLiAqLworCitzdGF0aWMgc3NpemVfdCBpODEwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgaTgxMF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkPXN0YXRlID8gc3RhdGUtPmNhcmQgOiBOVUxMOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN3cHRyOworCWludCBjbnQ7CisJaW50IHBlbmRpbmc7CisgICAgICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXRhLCBjdXJyZW50KTsKKworI2lmZGVmIERFQlVHMgorCXByaW50aygiaTgxMF9hdWRpbzogaTgxMF9yZWFkIGNhbGxlZCwgY291bnQgPSAlZFxuIiwgY291bnQpOworI2VuZGlmCisKKwlpZiAoZG1hYnVmLT5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcpCisJCXJldHVybiAtRU5PREVWOworCWlmICghZG1hYnVmLT5yZWFkX2NoYW5uZWwpIHsKKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCWRtYWJ1Zi0+cmVhZF9jaGFubmVsID0gY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKGNhcmQpOworCQlpZiAoIWRtYWJ1Zi0+cmVhZF9jaGFubmVsKSB7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDEpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSAwOworCisJcGVuZGluZyA9IDA7CisKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXRhKTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKFBNX1NVU1BFTkRFRChjYXJkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkgcmV0ID0gLUVBR0FJTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisJCWNudCA9IGk4MTBfZ2V0X2F2YWlsYWJsZV9yZWFkX2RhdGEoc3RhdGUpOworCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisJCS8vIHRoaXMgaXMgdG8gbWFrZSB0aGUgY29weV90b191c2VyIHNpbXBsZXIgYmVsb3cKKwkJaWYoY250ID4gKGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyKSkKKwkJCWNudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHN3cHRyOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJdW5zaWduZWQgbG9uZyB0bW87CisJCQkvKgorCQkJICogRG9uJ3QgbGV0IHVzIGRlYWRsb2NrLiAgVGhlIEFEQyB3b24ndCBzdGFydCBpZgorCQkJICogZG1hYnVmLT50cmlnZ2VyIGlzbid0IHNldC4gIEEgY2FsbCB0byBTRVRUUklHR0VSCisJCQkgKiBjb3VsZCBoYXZlIHR1cm5lZCBpdCBvZmYgYWZ0ZXIgd2Ugc2V0IGl0IHRvIG9uCisJCQkgKiBwcmV2aW91c2x5LgorCQkJICovCisJCQlkbWFidWYtPnRyaWdnZXIgPSBQQ01fRU5BQkxFX0lOUFVUOworCQkJLyoKKwkJCSAqIFRoaXMgZG9lcyB0aHJlZSB0aGluZ3MuICBVcGRhdGVzIExWSSB0byBiZSBjb3JyZWN0LAorCQkJICogbWFrZXMgc3VyZSB0aGUgQURDIGlzIHJ1bm5pbmcsIGFuZCB1cGRhdGVzIHRoZQorCQkJICogaHdwdHIuCisJCQkgKi8KKwkJCWk4MTBfdXBkYXRlX2x2aShzdGF0ZSwxKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KSByZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJCS8qIFNldCB0aGUgdGltZW91dCB0byBob3cgbG9uZyBpdCB3b3VsZCB0YWtlIHRvIGZpbGwKKwkJCSAqIHR3byBvZiBvdXIgYnVmZmVycy4gIElmIHdlIGhhdmVuJ3QgYmVlbiB3b2tlIHVwCisJCQkgKiBieSB0aGVuLCB0aGVuIHdlIGtub3cgc29tZXRoaW5nIGlzIHdyb25nLgorCQkJICovCisJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFogKiAyKSAvIChkbWFidWYtPnJhdGUgKiA0KTsKKwkJCS8qIFRoZXJlIGFyZSB0d28gc2l0dWF0aW9ucyB3aGVuIHNsZWVwX29uX3RpbWVvdXQgcmV0dXJucywgb25lIGlzIHdoZW4KKwkJCSAgIHRoZSBpbnRlcnJ1cHQgaXMgc2VydmljZWQgY29ycmVjdGx5IGFuZCB0aGUgcHJvY2VzcyBpcyB3YWtlZCB1cCBieQorCQkJICAgSVNSIE9OIFRJTUUuIEFub3RoZXIgaXMgd2hlbiB0aW1lb3V0IGlzIGV4cGlyZWQsIHdoaWNoIG1lYW5zIHRoYXQKKwkJCSAgIGVpdGhlciBpbnRlcnJ1cHQgaXMgTk9UIHNlcnZpY2VkIGNvcnJlY3RseSAocGVuZGluZyBpbnRlcnJ1cHQpIG9yIGl0CisJCQkgICBpcyBUT08gTEFURSBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAoc2NoZWR1bGVyIGxhdGVuY3kpCisJCQkgICB3aGljaCByZXN1bHRzIGluIGEgKHBvdGVudGlhbCkgYnVmZmVyIG92ZXJydW4uIEFuZCB3b3JzZSwgdGhlcmUgaXMKKwkJCSAgIE5PVEhJTkcgd2UgY2FuIGRvIHRvIHByZXZlbnQgaXQuICovCisJCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vID49IDIgPyB0bW8gOiAyKSkgeworI2lmZGVmIERFQlVHCisJCQkJcHJpbnRrKEtFUk5fRVJSICJpODEwX2F1ZGlvOiByZWNvcmRpbmcgc2NoZWR1bGUgdGltZW91dCwgIgorCQkJCSAgICAgICAiZG1hc3ogJXUgZnJhZ3N6ICV1IGNvdW50ICVpIGh3cHRyICV1IHN3cHRyICV1XG4iLAorCQkJCSAgICAgICBkbWFidWYtPmRtYXNpemUsIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+Y291bnQsCisJCQkJICAgICAgIGRtYWJ1Zi0+aHdwdHIsIGRtYWJ1Zi0+c3dwdHIpOworI2VuZGlmCisJCQkJLyogYSBidWZmZXIgb3ZlcnJ1biwgd2UgZGVsYXkgdGhlIHJlY292ZXJ5IHVudGlsIG5leHQgdGltZSB0aGUKKwkJCQkgICB3aGlsZSBsb29wIGJlZ2luIGFuZCB3ZSBSRUFMTFkgaGF2ZSBzcGFjZSB0byByZWNvcmQgKi8KKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCXJldCA9IHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIGRvbmU7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkgcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCXN3cHRyID0gTU9EVUxPUDIoc3dwdHIgKyBjbnQsIGRtYWJ1Zi0+ZG1hc2l6ZSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIGlmIChQTV9TVVNQRU5ERUQoY2FyZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKwkJZG1hYnVmLT5zd3B0ciA9IHN3cHRyOworCQlwZW5kaW5nID0gZG1hYnVmLT5jb3VudCAtPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJfQorIGRvbmU6CisJcGVuZGluZyA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHBlbmRpbmc7CisJaWYgKGRtYWJ1Zi0+ZW5hYmxlIHx8IHBlbmRpbmcgPj0gZG1hYnVmLT51c2VyZnJhZ3NpemUpCisJCWk4MTBfdXBkYXRlX2x2aShzdGF0ZSwgMSk7CisgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgd2FpdGluZyB0byBiZSBkbWEgdG8KKyAgIHRoZSBzb3VuZGNhcmQuICBpdCBpcyBkcmFpbmVkIGJ5IHRoZSBkbWEgbWFjaGluZSBhbmQgZmlsbGVkIGJ5IHRoaXMgbG9vcC4gKi8KK3N0YXRpYyBzc2l6ZV90IGk4MTBfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgaTgxMF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkPXN0YXRlID8gc3RhdGUtPmNhcmQgOiBOVUxMOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN3cHRyID0gMDsKKwlpbnQgcGVuZGluZzsKKwlpbnQgY250OworICAgICAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0YSwgY3VycmVudCk7CisKKyNpZmRlZiBERUJVRzIKKwlwcmludGsoImk4MTBfYXVkaW86IGk4MTBfd3JpdGUgY2FsbGVkLCBjb3VudCA9ICVkXG4iLCBjb3VudCk7CisjZW5kaWYKKworCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoZG1hYnVmLT5lbmFibGUgJiBBRENfUlVOTklORykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFkbWFidWYtPndyaXRlX2NoYW5uZWwpIHsKKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCWRtYWJ1Zi0+d3JpdGVfY2hhbm5lbCA9IGNhcmQtPmFsbG9jX3BjbV9jaGFubmVsKGNhcmQpOworCQlpZighZG1hYnVmLT53cml0ZV9jaGFubmVsKQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpKQorCQlyZXR1cm4gcmV0OworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKworCXBlbmRpbmcgPSAwOworCisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0YSk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBpZiAoUE1fU1VTUEVOREVEKGNhcmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0KSByZXQgPSAtRUFHQUlOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworCQljbnQgPSBpODEwX2dldF9mcmVlX3dyaXRlX3NwYWNlKHN0YXRlKTsKKwkJc3dwdHIgPSBkbWFidWYtPnN3cHRyOworCQkvKiBCb3VuZCB0aGUgbWF4aW11bSBzaXplIHRvIGhvdyBtdWNoIHdlIGNhbiBjb3B5IHRvIHRoZQorCQkgKiBkbWEgYnVmZmVyIGJlZm9yZSB3ZSBoaXQgdGhlIGVuZC4gIElmIHdlIGhhdmUgbW9yZSB0bworCQkgKiBjb3B5IHRoZW4gaXQgd2lsbCBnZXQgZG9uZSBpbiBhIHNlY29uZCBwYXNzIG9mIHRoaXMKKwkJICogbG9vcCBzdGFydGluZyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmKGNudCA+IChkbWFidWYtPmRtYXNpemUgLSBzd3B0cikpCisJCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworI2lmZGVmIERFQlVHMgorCQlwcmludGsoS0VSTl9JTkZPICJpODEwX2F1ZGlvOiBpODEwX3dyaXRlOiAlZCBieXRlcyBhdmFpbGFibGUgc3BhY2VcbiIsIGNudCk7CisjZW5kaWYKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJdW5zaWduZWQgbG9uZyB0bW87CisJCQkvLyBUaGVyZSBpcyBkYXRhIHdhaXRpbmcgdG8gYmUgcGxheWVkCisJCQkvKgorCQkJICogRm9yY2UgdGhlIHRyaWdnZXIgc2V0dGluZyBzaW5jZSB3ZSB3b3VsZAorCQkJICogZGVhZGxvY2sgd2l0aCBpdCBzZXQgYW55IG90aGVyIHdheQorCQkJICovCisJCQlkbWFidWYtPnRyaWdnZXIgPSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJCWk4MTBfdXBkYXRlX2x2aShzdGF0ZSwwKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KSByZXQgPSAtRUFHQUlOOworCQkJCWdvdG8gcmV0OworCQkJfQorCQkJLyogTm90IHN0cmljdGx5IGNvcnJlY3QgYnV0IHdvcmtzICovCisJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFogKiAyKSAvIChkbWFidWYtPnJhdGUgKiA0KTsKKwkJCS8qIFRoZXJlIGFyZSB0d28gc2l0dWF0aW9ucyB3aGVuIHNsZWVwX29uX3RpbWVvdXQgcmV0dXJucywgb25lIGlzIHdoZW4KKwkJCSAgIHRoZSBpbnRlcnJ1cHQgaXMgc2VydmljZWQgY29ycmVjdGx5IGFuZCB0aGUgcHJvY2VzcyBpcyB3YWtlZCB1cCBieQorCQkJICAgSVNSIE9OIFRJTUUuIEFub3RoZXIgaXMgd2hlbiB0aW1lb3V0IGlzIGV4cGlyZWQsIHdoaWNoIG1lYW5zIHRoYXQKKwkJCSAgIGVpdGhlciBpbnRlcnJ1cHQgaXMgTk9UIHNlcnZpY2VkIGNvcnJlY3RseSAocGVuZGluZyBpbnRlcnJ1cHQpIG9yIGl0CisJCQkgICBpcyBUT08gTEFURSBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAoc2NoZWR1bGVyIGxhdGVuY3kpCisJCQkgICB3aGljaCByZXN1bHRzIGluIGEgKHBvdGVudGlhbCkgYnVmZmVyIHVuZGVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzCisJCQkgICBOT1RISU5HIHdlIGNhbiBkbyB0byBwcmV2ZW50IGl0LiAqLworCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA+PSAyID8gdG1vIDogMikpIHsKKyNpZmRlZiBERUJVRworCQkJCXByaW50ayhLRVJOX0VSUiAiaTgxMF9hdWRpbzogcGxheWJhY2sgc2NoZWR1bGUgdGltZW91dCwgIgorCQkJCSAgICAgICAiZG1hc3ogJXUgZnJhZ3N6ICV1IGNvdW50ICVpIGh3cHRyICV1IHN3cHRyICV1XG4iLAorCQkJCSAgICAgICBkbWFidWYtPmRtYXNpemUsIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+Y291bnQsCisJCQkJICAgICAgIGRtYWJ1Zi0+aHdwdHIsIGRtYWJ1Zi0+c3dwdHIpOworI2VuZGlmCisJCQkJLyogYSBidWZmZXIgdW5kZXJydW4sIHdlIGRlbGF5IHRoZSByZWNvdmVyeSB1bnRpbCBuZXh0IHRpbWUgdGhlCisJCQkJICAgd2hpbGUgbG9vcCBiZWdpbiBhbmQgd2UgUkVBTExZIGhhdmUgZGF0YSB0byBwbGF5ICovCisJCQkJLy9yZXR1cm4gcmV0OworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpIHJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1Zitzd3B0cixidWZmZXIsY250KSkgeworCQkJaWYgKCFyZXQpIHJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIHJldDsKKwkJfQorCisJCXN3cHRyID0gTU9EVUxPUDIoc3dwdHIgKyBjbnQsIGRtYWJ1Zi0+ZG1hc2l6ZSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKFBNX1NVU1BFTkRFRChjYXJkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKKwkJcGVuZGluZyA9IGRtYWJ1Zi0+Y291bnQgKz0gY250OworCisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl9CityZXQ6CisJaWYgKGRtYWJ1Zi0+ZW5hYmxlIHx8IHBlbmRpbmcgPj0gZG1hYnVmLT51c2VyZnJhZ3NpemUpCisJCWk4MTBfdXBkYXRlX2x2aShzdGF0ZSwgMCk7CisgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0YSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCBpODEwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGk4MTBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlpZighZG1hYnVmLT5yZWFkeSkKKwkJcmV0dXJuIDA7CisJcG9sbF93YWl0KGZpbGUsICZkbWFidWYtPndhaXQsIHdhaXQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HIHx8CisJICAgIGRtYWJ1Zi0+dHJpZ2dlciAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJaWYgKGk4MTBfZ2V0X2F2YWlsYWJsZV9yZWFkX2RhdGEoc3RhdGUpID49IAorCQkgICAgKHNpZ25lZClkbWFidWYtPnVzZXJmcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgREFDX1JVTk5JTkcgfHwKKwkgICAgZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJaWYgKGk4MTBfZ2V0X2ZyZWVfd3JpdGVfc3BhY2Uoc3RhdGUpID49CisJCSAgICAoc2lnbmVkKWRtYWJ1Zi0+dXNlcmZyYWdzaXplKQorCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBpODEwX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgaTgxMF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJaWYgKCFkbWFidWYtPndyaXRlX2NoYW5uZWwgJiYKKwkJICAgIChkbWFidWYtPndyaXRlX2NoYW5uZWwgPQorCQkgICAgIHN0YXRlLT5jYXJkLT5hbGxvY19wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCkpID09IE5VTEwpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgeworCQlpZiAoIWRtYWJ1Zi0+cmVhZF9jaGFubmVsICYmCisJCSAgICAoZG1hYnVmLT5yZWFkX2NoYW5uZWwgPSAKKwkJICAgICBzdGF0ZS0+Y2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkKSkgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVCVVNZOworCQkJZ290byBvdXQ7CisJCX0KKwl9CisJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpICE9IDApCisJCWdvdG8gb3V0OworCisJcmV0ID0gLUVJTlZBTDsKKwlpZiAodm1hLT52bV9wZ29mZiAhPSAwKQorCQlnb3RvIG91dDsKKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSkKKwkJZ290byBvdXQ7CisJcmV0ID0gLUVBR0FJTjsKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCSAgICAgdmlydF90b19waHlzKGRtYWJ1Zi0+cmF3YnVmKSA+PiBQQUdFX1NISUZULAorCQkJICAgICBzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCWdvdG8gb3V0OworCWRtYWJ1Zi0+bWFwcGVkID0gMTsKKwlkbWFidWYtPnRyaWdnZXIgPSAwOworCXJldCA9IDA7CisjaWZkZWYgREVCVUdfTU1BUAorCXByaW50aygiaTgxMF9hdWRpbzogbW1hcCdlZCAlbGQgYnl0ZXMgb2YgZGF0YSBzcGFjZVxuIiwgc2l6ZSk7CisjZW5kaWYKK291dDoKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBpODEwX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGk4MTBfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGk4MTBfY2hhbm5lbCAqYyA9IE5VTEw7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhdWRpb19idWZfaW5mbyBhYmluZm87CisJY291bnRfaW5mbyBjaW5mbzsKKwl1bnNpZ25lZCBpbnQgaV9nbG9iX2NudDsKKwlpbnQgdmFsID0gMCwgcmV0OworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IHN0YXRlLT5jYXJkLT5hYzk3X2NvZGVjWzBdOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisjaWZkZWYgREVCVUcKKwlwcmludGsoImk4MTBfYXVkaW86IGk4MTBfaW9jdGwsIGFyZz0weCV4LCBjbWQ9IiwgYXJnID8gKnAgOiAwKTsKKyNlbmRpZgorCisJc3dpdGNoIChjbWQpIAorCXsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiT1NTX0dFVFZFUlNJT05cbiIpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfUkVTRVRcbiIpOworI2VuZGlmCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlpZiAoZG1hYnVmLT5lbmFibGUgPT0gREFDX1JVTk5JTkcpIHsKKwkJCWMgPSBkbWFidWYtPndyaXRlX2NoYW5uZWw7CisJCQlfX3N0b3BfZGFjKHN0YXRlKTsKKwkJfQorCQlpZiAoZG1hYnVmLT5lbmFibGUgPT0gQURDX1JVTk5JTkcpIHsKKwkJCWMgPSBkbWFidWYtPnJlYWRfY2hhbm5lbDsKKwkJCV9fc3RvcF9hZGMoc3RhdGUpOworCQl9CisJCWlmIChjICE9IE5VTEwpIHsKKwkJCUk4MTBfSU9XUklURUIoMiwgc3RhdGUtPmNhcmQsIGMtPnBvcnQrT0ZGX0NSKTsgICAvKiByZXNldCBETUEgbWFjaGluZSAqLworCQkJd2hpbGUgKCBJODEwX0lPUkVBREIoc3RhdGUtPmNhcmQsIGMtPnBvcnQrT0ZGX0NSKSAmIDIgKQorCQkJCWNwdV9yZWxheCgpOworCQkJSTgxMF9JT1dSSVRFTCgodTMyKXN0YXRlLT5jYXJkLT5jaGFuZG1hICsKKwkJCSAgICBjLT5udW0qc2l6ZW9mKHN0cnVjdCBpODEwX2NoYW5uZWwpLAorCQkJICAgIHN0YXRlLT5jYXJkLCBjLT5wb3J0K09GRl9CREJBUik7CisJCQlDSVZfVE9fTFZJKHN0YXRlLT5jYXJkLCBjLT5wb3J0LCAwKTsKKwkJfQorCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCXN5bmNocm9uaXplX2lycShzdGF0ZS0+Y2FyZC0+cGNpX2Rldi0+aXJxKTsKKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKKwkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TWU5DXG4iKTsKKyNlbmRpZgorCQlpZiAoZG1hYnVmLT5lbmFibGUgIT0gREFDX1JVTk5JTkcgfHwgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQlyZXR1cm4gMDsKKwkJaWYoKHZhbCA9IGRyYWluX2RhYyhzdGF0ZSwgMSkpKQorCQkJcmV0dXJuIHZhbDsKKwkJZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOiAvKiBzZXQgc21hcGxlIHJhdGUgKi8KKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfU1BFRURcbiIpOworI2VuZGlmCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPj0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJaWYgKCAoc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICYgU1BESUZfT04pICkgeyAgLyogUy9QRElGIEVuYWJsZWQgKi8KKwkJCQkJLyogQUQxODg2IG9ubHkgc3VwcG9ydHMgNDgwMDAsIG5lZWQgdG8gY2hlY2sgdGhhdCAqLworCQkJCQlpZiAoIGk4MTBfdmFsaWRfc3BkaWZfcmF0ZSAoIGNvZGVjLCB2YWwgKSApIHsKKwkJCQkJCS8qIFNldCBEQUMgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAlpODEwX3NldF9zcGRpZl9vdXRwdXQgKCBzdGF0ZSwgLTEsIDAgKTsKKwkJCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQkJCQlpODEwX3NldF9kYWNfcmF0ZShzdGF0ZSwgdmFsKTsKKwkJCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQkJCQkvKiBTZXQgUy9QRElGIHRyYW5zbWl0dGVyIHJhdGUuICovCisJCQkJCQlpODEwX3NldF9zcGRpZl9vdXRwdXQgKCBzdGF0ZSwgQUM5N19FQV9TUFNBXzNfNCwgdmFsICk7CisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggISAoc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICYgU1BESUZfT04pICkgeworCQkJCQkJCXZhbCA9IGRtYWJ1Zi0+cmF0ZTsKKwkJCQkJCX0KKwkJCQkJfSBlbHNlIHsgLyogTm90IGEgdmFsaWQgcmF0ZSBmb3IgUy9QRElGLCBpZ25vcmUgaXQgKi8KKwkJCQkJCXZhbCA9IGRtYWJ1Zi0+cmF0ZTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQlpODEwX3NldF9kYWNfcmF0ZShzdGF0ZSwgdmFsKTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlpODEwX3NldF9hZGNfcmF0ZShzdGF0ZSwgdmFsKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnJhdGUsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzogLyogc2V0IHN0ZXJlbyBvciBtb25vIGNoYW5uZWwgKi8KKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfU1RFUkVPXG4iKTsKKyNlbmRpZgorCQlpZiAoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykgeworCQkJc3RvcF9kYWMoc3RhdGUpOworCQl9CisJCWlmIChkbWFidWYtPmVuYWJsZSAmIEFEQ19SVU5OSU5HKSB7CisJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKDEsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpKQorCQkJCXJldHVybiB2YWw7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDEpKSkKKwkJCQlyZXR1cm4gdmFsOworCQl9CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVEJMS1NJWkUgJWRcbiIsIGRtYWJ1Zi0+dXNlcmZyYWdzaXplKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoZG1hYnVmLT51c2VyZnJhZ3NpemUsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrIG9mIHN1cHBvcnRlZCBzYW1wbGUgZm9ybWF0Ki8KKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfR0VURk1UU1xuIik7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdCBzYW1wbGUgZm9ybWF0ICovCisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZNVFxuIik7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfQ0hBTk5FTFNcbiIpOworI2VuZGlmCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKHZhbCA+IDApIHsKKwkJCWlmIChkbWFidWYtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSB7CisJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJfQorCQkJaWYgKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpIHsKKwkJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlyZXR1cm4gcHV0X3VzZXIoc3RhdGUtPmNhcmQtPmNoYW5uZWxzLCBwKTsKKwkJfQorCisJCS8qIElDSCBhbmQgSUNIMCBvbmx5IHN1cHBvcnQgMiBjaGFubmVscyAqLworCQlpZiAoIHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMUFBXzUKKwkJICAgICB8fCBzdGF0ZS0+Y2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URUxfODI4MDFBQl81KSAKKwkJCXJldHVybiBwdXRfdXNlcigyLCBwKTsKKwkKKwkJLyogTXVsdGktY2hhbm5lbCBzdXBwb3J0IHdhcyBhZGRlZCB3aXRoIElDSDIuIEJpdHMgaW4gKi8KKwkJLyogR2xvYmFsIFN0YXR1cyBhbmQgR2xvYmFsIENvbnRyb2wgcmVnaXN0ZXIgYXJlIG5vdyAgKi8KKwkJLyogdXNlZCB0byBpbmRpY2F0ZSB0aGlzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIGlfZ2xvYl9jbnQgPSBJODEwX0lPUkVBREwoc3RhdGUtPmNhcmQsIEdMT0JfQ05UKTsKKworCQkvKiBDdXJyZW50ICMgb2YgY2hhbm5lbHMgZW5hYmxlZCAqLworCQlpZiAoIGlfZ2xvYl9jbnQgJiAweDAxMDAwMDAgKQorCQkJcmV0ID0gNDsKKwkJZWxzZSBpZiAoIGlfZ2xvYl9jbnQgJiAweDAyMDAwMDAgKQorCQkJcmV0ID0gNjsKKwkJZWxzZQorCQkJcmV0ID0gMjsKKworCQlzd2l0Y2ggKCB2YWwgKSB7CisJCQljYXNlIDI6IC8qIDIgY2hhbm5lbHMgaXMgYWx3YXlzIHN1cHBvcnRlZCAqLworCQkJCUk4MTBfSU9XUklURUwoaV9nbG9iX2NudCAmIDB4ZmZjZmZmZmYsCisJCQkJICAgICBzdGF0ZS0+Y2FyZCwgR0xPQl9DTlQpOworCQkJCS8qIERvIHdlIG5lZWQgdG8gY2hhbmdlIG1peGVyIHNldHRpbmdzPz8/PyAgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgNDogLyogU3VwcG9ydGVkIG9uIHNvbWUgY2hpcHNldHMsIGJldHRlciBjaGVjayBmaXJzdCAqLworCQkJCWlmICggc3RhdGUtPmNhcmQtPmNoYW5uZWxzID49IDQgKSB7CisJCQkJCUk4MTBfSU9XUklURUwoKGlfZ2xvYl9jbnQgJiAweGZmY2ZmZmZmKSB8IDB4MTAwMDAwLAorCQkJCQkgICAgICBzdGF0ZS0+Y2FyZCwgR0xPQl9DTlQpOworCQkJCQkvKiBEbyB3ZSBuZWVkIHRvIGNoYW5nZSBtaXhlciBzZXR0aW5ncz8/PyAqLworCQkJCX0gZWxzZSB7CisJCQkJCXZhbCA9IHJldDsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIDY6IC8qIFN1cHBvcnRlZCBvbiBzb21lIGNoaXBzZXRzLCBiZXR0ZXIgY2hlY2sgZmlyc3QgKi8KKwkJCQlpZiAoIHN0YXRlLT5jYXJkLT5jaGFubmVscyA+PSA2ICkgeworCQkJCQlJODEwX0lPV1JJVEVMKChpX2dsb2JfY250ICYgMHhmZmNmZmZmZikgfCAweDIwMDAwMCwKKwkJCQkJICAgICAgc3RhdGUtPmNhcmQsIEdMT0JfQ05UKTsKKwkJCQkJLyogRG8gd2UgbmVlZCB0byBjaGFuZ2UgbWl4ZXIgc2V0dGluZ3M/Pz8gKi8KKwkJCQl9IGVsc2UgeworCQkJCQl2YWwgPSByZXQ7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDogLyogbm90aGluZyBlbHNlIGlzIGV2ZXIgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwc2V0ICovCisJCQkJdmFsID0gcmV0OworCQkJCWJyZWFrOworCQl9CisKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDogLyogdGhlIHVzZXIgaGFzIHNlbnQgYWxsIGRhdGEgYW5kIGlzIG5vdGlmeWluZyB1cyAqLworCQkvKiB3ZSB1cGRhdGUgdGhlIHN3cHRyIHRvIHRoZSBlbmQgb2YgdGhlIGxhc3Qgc2cgc2VnbWVudCB0aGVuIHJldHVybiAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9QT1NUXG4iKTsKKyNlbmRpZgorCQlpZighZG1hYnVmLT5yZWFkeSB8fCAoZG1hYnVmLT5lbmFibGUgIT0gREFDX1JVTk5JTkcpKQorCQkJcmV0dXJuIDA7CisJCWlmKChkbWFidWYtPnN3cHRyICUgZG1hYnVmLT5mcmFnc2l6ZSkgIT0gMCkgeworCQkJdmFsID0gZG1hYnVmLT5mcmFnc2l6ZSAtIChkbWFidWYtPnN3cHRyICUgZG1hYnVmLT5mcmFnc2l6ZSk7CisJCQlkbWFidWYtPnN3cHRyICs9IHZhbDsKKwkJCWRtYWJ1Zi0+Y291bnQgKz0gdmFsOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKGRtYWJ1Zi0+c3ViZGl2aXNpb24pCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NVQkRJVklERSAlZFxuIiwgdmFsKTsKKyNlbmRpZgorCQlkbWFidWYtPnN1YmRpdmlzaW9uID0gdmFsOworCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJZG1hYnVmLT5vc3NmcmFnc2l6ZSA9IDE8PCh2YWwgJiAweGZmZmYpOworCQlkbWFidWYtPm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCWlmICghZG1hYnVmLT5vc3NmcmFnc2l6ZSB8fCAhZG1hYnVmLT5vc3NtYXhmcmFncykKKwkJCXJldHVybiAtRUlOVkFMOworCQkvKgorCQkgKiBCb3VuZCB0aGUgZnJhZyBzaXplIGludG8gb3VyIGFsbG93ZWQgcmFuZ2Ugb2YgMjU2IC0gNDA5NgorCQkgKi8KKwkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NpemUgPCAyNTYpCisJCQlkbWFidWYtPm9zc2ZyYWdzaXplID0gMjU2OworCQllbHNlIGlmIChkbWFidWYtPm9zc2ZyYWdzaXplID4gNDA5NikKKwkJCWRtYWJ1Zi0+b3NzZnJhZ3NpemUgPSA0MDk2OworCQkvKgorCQkgKiBUaGUgbnVtZnJhZ3MgY291bGQgYmUgc29tZXRoaW5nIHJlYXNvbmFibGUsIG9yIGl0IGNvdWxkCisJCSAqIGJlIDB4ZmZmZiBtZWFuaW5nICJHaXZlIG1lIGFzIG11Y2ggYXMgcG9zc2libGUiLiAgU28sCisJCSAqIHdlIGNoZWNrIHRoZSBudW1mcmFncyAqIGZyYWdzaXplIGRvZXNuJ3QgZXhjZWVkIG91cgorCQkgKiA2NGsgYnVmZmVyIGxpbWl0LCBub3IgaXMgaXQgbGVzcyB0aGFuIG91ciA4ayBtaW5pbXVtLgorCQkgKiBJZiBpdCBmYWlscyBlaXRoZXIgb25lIG9mIHRoZXNlIGNoZWNrcywgdGhlbiBhZGp1c3QgdGhlCisJCSAqIG51bWJlciBvZiBmcmFnbWVudHMsIG5vdCB0aGUgc2l6ZSBvZiB0aGVtLiAgSXQncyBPSyBpZgorCQkgKiBvdXIgbnVtYmVyIG9mIGZyYWdtZW50cyBkb2Vzbid0IGVxdWFsIDMyIG9yIGFueXRoaW5nCisJCSAqIGxpa2Ugb3VyIGhhcmR3YXJlIGJhc2VkIG51bWJlciBub3cgc2luY2Ugd2UgYXJlIHVzaW5nCisJCSAqIGEgZGlmZmVyZW50IGZyYWcgY291bnQgZm9yIHRoZSBoYXJkd2FyZS4gIEJlZm9yZSB3ZSBnZXQKKwkJICogaW50byB0aGlzIHRob3VnaCwgYm91bmQgdGhlIG1heGZyYWdzIHRvIGF2b2lkIG92ZXJmbG93CisJCSAqIGlzc3Vlcy4gIEEgcmVhc29uYWJsZSBib3VuZCB3b3VsZCBiZSA2NGsgLyAyNTYgc2luY2Ugb3VyCisJCSAqIG1heGltdW0gYnVmZmVyIHNpemUgaXMgNjRrIGFuZCBvdXIgbWluaW11bSBmcmFnIHNpemUgaXMKKwkJICogMjU2LiAgT24gdGhlIG90aGVyIGVuZCwgb3VyIG1pbmltdW0gYnVmZmVyIHNpemUgaXMgOGsgYW5kCisJCSAqIG91ciBtYXhpbXVtIGZyYWcgc2l6ZSBpcyA0aywgc28gdGhlIGxvd2VyIGJvdW5kIHNob3VsZAorCQkgKiBiZSAyLgorCQkgKi8KKworCQlpZihkbWFidWYtPm9zc21heGZyYWdzID4gMjU2KQorCQkJZG1hYnVmLT5vc3NtYXhmcmFncyA9IDI1NjsKKwkJZWxzZSBpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA8IDIpCisJCQlkbWFidWYtPm9zc21heGZyYWdzID0gMjsKKworCQl2YWwgPSBkbWFidWYtPm9zc2ZyYWdzaXplICogZG1hYnVmLT5vc3NtYXhmcmFnczsKKwkJd2hpbGUgKHZhbCA8IDgxOTIpIHsKKwkJICAgIHZhbCA8PD0gMTsKKwkJICAgIGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPDw9IDE7CisJCX0KKwkJd2hpbGUgKHZhbCA+IDY1NTM2KSB7CisJCSAgICB2YWwgPj49IDE7CisJCSAgICBkbWFidWYtPm9zc21heGZyYWdzID4+PSAxOworCQl9CisJCWRtYWJ1Zi0+cmVhZHkgPSAwOworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVCAweCV4LCAlZCwgJWRcbiIsIHZhbCwKKwkJCWRtYWJ1Zi0+b3NzZnJhZ3NpemUsIGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MpOworI2VuZGlmCisKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaTgxMF91cGRhdGVfcHRyKHN0YXRlKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT51c2VyZnJhZ3NpemU7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT51c2VyZnJhZ3M7CisJCWlmIChkbWFidWYtPm1hcHBlZCkKKyAJCQlhYmluZm8uYnl0ZXMgPSBkbWFidWYtPmRtYXNpemU7CisgIAkJZWxzZQorIAkJCWFiaW5mby5ieXRlcyA9IGk4MTBfZ2V0X2ZyZWVfd3JpdGVfc3BhY2Uoc3RhdGUpOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzIC8gZG1hYnVmLT51c2VyZnJhZ3NpemU7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisjaWYgZGVmaW5lZChERUJVRykgfHwgZGVmaW5lZChERUJVR19NTUFQKQorCQlwcmludGsoIlNORENUTF9EU1BfR0VUT1NQQUNFICVkLCAlZCwgJWQsICVkXG4iLCBhYmluZm8uYnl0ZXMsCisJCQlhYmluZm8uZnJhZ3NpemUsIGFiaW5mby5mcmFnbWVudHMsIGFiaW5mby5mcmFnc3RvdGFsKTsKKyNlbmRpZgorCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQl2YWwgPSBpODEwX2dldF9mcmVlX3dyaXRlX3NwYWNlKHN0YXRlKTsKKwkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOworCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCQljaW5mby5ibG9ja3MgPSB2YWwvZG1hYnVmLT51c2VyZnJhZ3NpemU7CisJCWlmIChkbWFidWYtPm1hcHBlZCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9PVVRQVVQpKSB7CisJCQlkbWFidWYtPmNvdW50ICs9IHZhbDsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSAoZG1hYnVmLT5zd3B0ciArIHZhbCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQlfX2k4MTBfdXBkYXRlX2x2aShzdGF0ZSwgMCk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX01NQVApCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRPUFRSICVkLCAlZCwgJWQsICVkXG4iLCBjaW5mby5ieXRlcywKKwkJCWNpbmZvLmJsb2NrcywgY2luZm8ucHRyLCBkbWFidWYtPmNvdW50KTsKKyNlbmRpZgorCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYoc3RhdGUsIDEpKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWFiaW5mby5ieXRlcyA9IGk4MTBfZ2V0X2F2YWlsYWJsZV9yZWFkX2RhdGEoc3RhdGUpOworCQlhYmluZm8uZnJhZ3NpemUgPSBkbWFidWYtPnVzZXJmcmFnc2l6ZTsKKwkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPnVzZXJmcmFnczsKKwkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyAvIGRtYWJ1Zi0+dXNlcmZyYWdzaXplOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVElTUEFDRSAlZCwgJWQsICVkLCAlZFxuIiwgYWJpbmZvLmJ5dGVzLAorCQkJYWJpbmZvLmZyYWdzaXplLCBhYmluZm8uZnJhZ21lbnRzLCBhYmluZm8uZnJhZ3N0b3RhbCk7CisjZW5kaWYKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIWRtYWJ1Zi0+cmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQl2YWwgPSBpODEwX2dldF9hdmFpbGFibGVfcmVhZF9kYXRhKHN0YXRlKTsKKwkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOworCQljaW5mby5ibG9ja3MgPSB2YWwvZG1hYnVmLT51c2VyZnJhZ3NpemU7CisJCWNpbmZvLnB0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCWlmIChkbWFidWYtPm1hcHBlZCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9JTlBVVCkpIHsKKwkJCWRtYWJ1Zi0+Y291bnQgLT0gdmFsOworCQkJZG1hYnVmLT5zd3B0ciA9IChkbWFidWYtPnN3cHRyICsgdmFsKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJCV9faTgxMF91cGRhdGVfbHZpKHN0YXRlLCAxKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworI2lmIGRlZmluZWQoREVCVUcpIHx8IGRlZmluZWQoREVCVUdfTU1BUCkKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVElQVFIgJWQsICVkLCAlZCwgJWRcbiIsIGNpbmZvLmJ5dGVzLAorCQkJY2luZm8uYmxvY2tzLCBjaW5mby5wdHIsIGRtYWJ1Zi0+Y291bnQpOworI2VuZGlmCisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9OT05CTE9DS1xuIik7CisjZW5kaWYKKwkJZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRDQVBTXG4iKTsKKyNlbmRpZgorCSAgICByZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9SRUFMVElNRXxEU1BfQ0FQX1RSSUdHRVJ8RFNQX0NBUF9NTUFQfERTUF9DQVBfQklORCwKKwkJCSAgICBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRUUklHR0VSIDB4JXhcbiIsIGRtYWJ1Zi0+dHJpZ2dlcik7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKGRtYWJ1Zi0+dHJpZ2dlciwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKERFQlVHX01NQVApCisJCXByaW50aygiU05EQ1RMX0RTUF9TRVRUUklHR0VSIDB4JXhcbiIsIHZhbCk7CisjZW5kaWYKKwkJLyogc2lsZW50bHkgaWdub3JlIGludmFsaWQgUENNX0VOQUJMRV94eHggYml0cywKKwkJICogbGlrZSB0aGUgb3RoZXIgZHJpdmVycyBkbworCQkgKi8KKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCApKQorCQkJdmFsICY9IH5QQ01fRU5BQkxFX0lOUFVUOworCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSApKQorCQkJdmFsICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKKwkJaWYoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmICEodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgJiYgZG1hYnVmLT5lbmFibGUgPT0gQURDX1JVTk5JTkcpIHsKKwkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJfQorCQlpZigoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmICEodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpICYmIGRtYWJ1Zi0+ZW5hYmxlID09IERBQ19SVU5OSU5HKSB7CisJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCX0KKwkJZG1hYnVmLT50cmlnZ2VyID0gdmFsOworCQlpZigodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpICYmICEoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORykpIHsKKwkJCWlmICghZG1hYnVmLT53cml0ZV9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT53cml0ZV9jaGFubmVsID0gc3RhdGUtPmNhcmQtPmFsbG9jX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkKTsKKwkJCQlpZiAoIWRtYWJ1Zi0+d3JpdGVfY2hhbm5lbCkKKwkJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCX0KKwkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKGRtYWJ1Zi0+bWFwcGVkKSB7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQkJaTgxMF91cGRhdGVfcHRyKHN0YXRlKTsKKwkJCQlkbWFidWYtPmNvdW50ID0gMDsKKwkJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwkJCQlkbWFidWYtPmNvdW50ID0gaTgxMF9nZXRfZnJlZV93cml0ZV9zcGFjZShzdGF0ZSk7CisJCQkJZG1hYnVmLT5zd3B0ciA9IChkbWFidWYtPnN3cHRyICsgZG1hYnVmLT5jb3VudCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWk4MTBfdXBkYXRlX2x2aShzdGF0ZSwgMCk7CisJCQlzdGFydF9kYWMoc3RhdGUpOworCQl9CisJCWlmKCh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSAmJiAhKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpKSB7CisJCQlpZiAoIWRtYWJ1Zi0+cmVhZF9jaGFubmVsKSB7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJZG1hYnVmLT5yZWFkX2NoYW5uZWwgPSBzdGF0ZS0+Y2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKHN0YXRlLT5jYXJkKTsKKwkJCQlpZiAoIWRtYWJ1Zi0+cmVhZF9jaGFubmVsKQorCQkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpKQorCQkJCXJldHVybiByZXQ7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQlpODEwX3VwZGF0ZV9wdHIoc3RhdGUpOworCQkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOworCQkJCWRtYWJ1Zi0+Y291bnQgPSAwOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpODEwX3VwZGF0ZV9sdmkoc3RhdGUsIDEpOworCQkJc3RhcnRfYWRjKHN0YXRlKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX1NFVERVUExFWFxuIik7CisjZW5kaWYKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWk4MTBfdXBkYXRlX3B0cihzdGF0ZSk7CisJCXZhbCA9IGRtYWJ1Zi0+Y291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9ERUxBWSAlZFxuIiwgZG1hYnVmLT5jb3VudCk7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9SQVRFICVkXG4iLCBkbWFidWYtPnJhdGUpOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihkbWFidWYtPnJhdGUsIHApOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoMiwgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9CSVRTXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEUsIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NFVFNQRElGOiAvKiBTZXQgUy9QRElGIENvbnRyb2wgcmVnaXN0ZXIgKi8KKyNpZmRlZiBERUJVRworCQlwcmludGsoIlNORENUTF9EU1BfU0VUU1BESUZcbiIpOworI2VuZGlmCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLyogQ2hlY2sgdG8gbWFrZSBzdXJlIHRoZSBjb2RlYyBzdXBwb3J0cyBTL1BESUYgdHJhbnNtaXR0ZXIgKi8KKworCQlpZigoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiA0KSkgeworCQkJLyogbWFzayBvdXQgdGhlIHRyYW5zbWl0dGVyIHNwZWVkIGJpdHMgc28gdGhlIHVzZXIgY2FuJ3Qgc2V0IHRoZW0gKi8KKwkJCXZhbCAmPSB+MHgzMDAwOworCisJCQkvKiBBZGQgdGhlIGN1cnJlbnQgdHJhbnNtaXR0ZXIgc3BlZWQgYml0cyB0byB0aGUgcGFzc2VkIHZhbHVlICovCisJCQlyZXQgPSBpODEwX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1NQRElGX0NPTlRST0wpOworCQkJdmFsIHw9IChyZXQgJiAweDMwMDApOworCisJCQlpODEwX2FjOTdfc2V0KGNvZGVjLCBBQzk3X1NQRElGX0NPTlRST0wsIHZhbCk7CisJCQlpZihpODEwX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1NQRElGX0NPTlRST0wpICE9IHZhbCApIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IFVuYWJsZSB0byBzZXQgUy9QRElGIGNvbmZpZ3VyYXRpb24gdG8gMHglMDR4LlxuIiwgdmFsKTsKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCX0KKwkJfQorI2lmZGVmIERFQlVHCisJCWVsc2UgCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpODEwX2F1ZGlvOiBTL1BESUYgdHJhbnNtaXR0ZXIgbm90IGF2YWxpYmxlLlxuIik7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUU1BESUY6IC8qIEdldCBTL1BESUYgQ29udHJvbCByZWdpc3RlciAqLworI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9HRVRTUERJRlxuIik7CisjZW5kaWYKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBDaGVjayB0byBtYWtlIHN1cmUgdGhlIGNvZGVjIHN1cHBvcnRzIFMvUERJRiB0cmFuc21pdHRlciAqLworCisJCWlmKCEoc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiA0KSkgeworI2lmZGVmIERFQlVHCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpODEwX2F1ZGlvOiBTL1BESUYgdHJhbnNtaXR0ZXIgbm90IGF2YWxpYmxlLlxuIik7CisjZW5kaWYKKwkJCXZhbCA9IDA7CisJCX0gZWxzZSB7CisJCQl2YWwgPSBpODEwX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1NQRElGX0NPTlRST0wpOworCQl9CisJCS8vcmV0dXJuIHB1dF91c2VyKCh2YWwgJiAweGNmZmYpLCBwKTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisgICAJCQkKKwljYXNlIFNORENUTF9EU1BfR0VUQ0hBTk5FTE1BU0s6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLXG4iKTsKKyNlbmRpZgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQkKKwkJLyogQmFzZWQgb24gQUMnOTcgREFDIHN1cHBvcnQsIG5vdCBJQ0ggaGFyZHdhcmUgKi8KKwkJdmFsID0gRFNQX0JJTkRfRlJPTlQ7CisJCWlmICggc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiAweDAwMDQgKQorCQkJdmFsIHw9IERTUF9CSU5EX1NQRElGOworCisJCWlmICggc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiAweDAwODAgKQorCQkJdmFsIHw9IERTUF9CSU5EX1NVUlI7CisJCWlmICggc3RhdGUtPmNhcmQtPmFjOTdfZmVhdHVyZXMgJiAweDAxNDAgKQorCQkJdmFsIHw9IERTUF9CSU5EX0NFTlRFUl9MRkU7CisKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfQklORF9DSEFOTkVMOgorI2lmZGVmIERFQlVHCisJCXByaW50aygiU05EQ1RMX0RTUF9CSU5EX0NIQU5ORUxcbiIpOworI2VuZGlmCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICggdmFsID09IERTUF9CSU5EX1FVRVJZICkgeworCQkJdmFsID0gRFNQX0JJTkRfRlJPTlQ7IC8qIEFsd2F5cyByZXBvcnQgdGhpcyBhcyBiZWluZyBlbmFibGVkICovCisJCQlpZiAoIHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OICkgCisJCQkJdmFsIHw9IERTUF9CSU5EX1NQRElGOworCQkJZWxzZSB7CisJCQkJaWYgKCBzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBTVVJSX09OICkKKwkJCQkJdmFsIHw9IERTUF9CSU5EX1NVUlI7CisJCQkJaWYgKCBzdGF0ZS0+Y2FyZC0+YWM5N19zdGF0dXMgJiBDRU5URVJfTEZFX09OICkKKwkJCQkJdmFsIHw9IERTUF9CSU5EX0NFTlRFUl9MRkU7CisJCQl9CisJCX0gZWxzZSB7ICAvKiBOb3QgYSBxdWVyeSwgc2V0IGl0ICovCisJCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoIGRtYWJ1Zi0+ZW5hYmxlID09IERBQ19SVU5OSU5HICkgeworCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCX0KKwkJCWlmICggdmFsICYgRFNQX0JJTkRfU1BESUYgKSB7ICAvKiBUdXJuIG9uIFNQRElGICovCisJCQkJLyogIE9rLCB0aGlzIHNob3VsZCBwcm9iYWJseSBkZWZpbmUgd2hhdCBzbG90cworCQkJCSAqICB0byB1c2UuIEZvciBub3csIHdlJ2xsIG9ubHkgc2V0IGl0IHRvIHRoZQorCQkJCSAqICBkZWZhdWx0czoKKwkJCQkgKiAKKwkJCQkgKiAgIG5vbiBtdWx0aWNoYW5uZWwgY29kZWMgbWFwcyB0byBzbG90cyAzJjQKKwkJCQkgKiAgIDIgY2hhbm5lbCBjb2RlYyBtYXBzIHRvIHNsb3RzIDcmOAorCQkJCSAqICAgNCBjaGFubmVsIGNvZGVjIG1hcHMgdG8gc2xvdHMgNiY5CisJCQkJICogICA2IGNoYW5uZWwgY29kZWMgbWFwcyB0byBzbG90cyAxMCYxMQorCQkJCSAqCisJCQkJICogIHRoZXJlIHNob3VsZCBiZSBzb21lIHdheSBmb3IgdGhlIGFwcCB0bworCQkJCSAqICBzZWxlY3QgdGhlIHNsb3QgYXNzaWdubWVudC4KKwkJCQkgKi8KKwkKKwkJCQlpODEwX3NldF9zcGRpZl9vdXRwdXQgKCBzdGF0ZSwgQUM5N19FQV9TUFNBXzNfNCwgZG1hYnVmLT5yYXRlICk7CisJCQkJaWYgKCAhKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OKSApCisJCQkJCXZhbCAmPSB+RFNQX0JJTkRfU1BESUY7CisJCQl9IGVsc2UgeworCQkJCWludCBtYXNrOworCQkJCWludCBjaGFubmVsczsKKworCQkJCS8qIFR1cm4gb2ZmIFMvUERJRiBpZiBpdCB3YXMgb24gKi8KKwkJCQlpZiAoIHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNQRElGX09OICkgCisJCQkJCWk4MTBfc2V0X3NwZGlmX291dHB1dCAoIHN0YXRlLCAtMSwgMCApOworCQkJCQorCQkJCW1hc2sgPSB2YWwgJiAoRFNQX0JJTkRfRlJPTlQgfCBEU1BfQklORF9TVVJSIHwgRFNQX0JJTkRfQ0VOVEVSX0xGRSk7CisJCQkJc3dpdGNoIChtYXNrKSB7CisJCQkJCWNhc2UgRFNQX0JJTkRfRlJPTlQ6CisJCQkJCQljaGFubmVscyA9IDI7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBEU1BfQklORF9GUk9OVHxEU1BfQklORF9TVVJSOgorCQkJCQkJY2hhbm5lbHMgPSA0OworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgRFNQX0JJTkRfRlJPTlR8RFNQX0JJTkRfU1VSUnxEU1BfQklORF9DRU5URVJfTEZFOgorCQkJCQkJY2hhbm5lbHMgPSA2OworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6CisJCQkJCQl2YWwgPSBEU1BfQklORF9GUk9OVDsKKwkJCQkJCWNoYW5uZWxzID0gMjsKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpODEwX3NldF9kYWNfY2hhbm5lbHMgKCBzdGF0ZSwgY2hhbm5lbHMgKTsKKworCQkJCS8qIGNoZWNrIHRoYXQgdGhleSByZWFsbHkgZ290IHR1cm5lZCBvbiAqLworCQkJCWlmICghKHN0YXRlLT5jYXJkLT5hYzk3X3N0YXR1cyAmIFNVUlJfT04pKQorCQkJCQl2YWwgJj0gfkRTUF9CSU5EX1NVUlI7CisJCQkJaWYgKCEoc3RhdGUtPmNhcmQtPmFjOTdfc3RhdHVzICYgQ0VOVEVSX0xGRV9PTikpCisJCQkJCXZhbCAmPSB+RFNQX0JJTkRfQ0VOVEVSX0xGRTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisjaWZkZWYgREVCVUcKKwkJcHJpbnRrKCJTTkRDVExfKiAtRUlOVkFMXG4iKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpID0gMDsKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gZGV2czsKKwlzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGUgPSBOVUxMOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9IE5VTEw7CisKKwkvKiBmaW5kIGFuIGF2YWlhYmxlIHZpcnR1YWwgY2hhbm5lbCAoaW5zdGFuY2Ugb2YgL2Rldi9kc3ApICovCisJd2hpbGUgKGNhcmQgIT0gTlVMTCkgeworCQkvKgorCQkgKiBJZiB3ZSBhcmUgaW5pdGlhbGl6aW5nIGFuZCB0aGVuIGZhaWwsIGNhcmQgY291bGQgZ28KKwkJICogYXdheSB1bnVleHBlY3RlZGx5IHdoaWxlIHdlIGFyZSBpbiB0aGUgZm9yKCkgbG9vcC4KKwkJICogU28sIGNoZWNrIGZvciBjYXJkIG9uIGVhY2ggaXRlcmF0aW9uIGJlZm9yZSB3ZSBjaGVjaworCQkgKiBmb3IgY2FyZC0+aW5pdGlhbGl6aW5nIHRvIGF2b2lkIGEgcG9zc2libGUgb29wcy4KKwkJICogVGhpcyB1c3VhbGx5IG9ubHkgbWF0dGVycyBmb3IgdGltZXMgd2hlbiB0aGUgZHJpdmVyIGlzCisJCSAqIGF1dG9sb2FkZWQgYnkga21vZC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCA1MCAmJiBjYXJkICYmIGNhcmQtPmluaXRpYWxpemluZzsgaSsrKSB7CisJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV90aW1lb3V0KEhaLzIwKTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgTlJfSFdfQ0ggJiYgY2FyZCAmJiAhY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspIHsKKwkJCWlmIChjYXJkLT5zdGF0ZXNbaV0gPT0gTlVMTCkgeworCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzW2ldID0gKHN0cnVjdCBpODEwX3N0YXRlICopCisJCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpODEwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKHN0YXRlID09IE5VTEwpCisJCQkJCXJldHVybiAtRU5PTUVNOworCQkJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKHN0cnVjdCBpODEwX3N0YXRlKSk7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJCQkJZ290byBmb3VuZF92aXJ0OworCQkJfQorCQl9CisJCWNhcmQgPSBjYXJkLT5uZXh0OworCX0KKwkvKiBubyBtb3JlIHZpcnR1YWwgY2hhbm5lbCBhdmFpYWJsZSAqLworCWlmICghc3RhdGUpCisJCXJldHVybiAtRU5PREVWOworCitmb3VuZF92aXJ0OgorCS8qIGluaXRpYWxpemUgdGhlIHZpcnR1YWwgY2hhbm5lbCAqLworCXN0YXRlLT52aXJ0ID0gaTsKKwlzdGF0ZS0+Y2FyZCA9IGNhcmQ7CisJc3RhdGUtPm1hZ2ljID0gSTgxMF9TVEFURV9NQUdJQzsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWFidWYtPndhaXQpOworCWluaXRfTVVURVgoJnN0YXRlLT5vcGVuX3NlbSk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gc3RhdGU7CisJZG1hYnVmLT50cmlnZ2VyID0gMDsKKworCS8qIGFsbG9jYXRlIGhhcmR3YXJlIGNoYW5uZWxzICovCisJaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZigoZG1hYnVmLT5yZWFkX2NoYW5uZWwgPSBjYXJkLT5hbGxvY19yZWNfcGNtX2NoYW5uZWwoY2FyZCkpID09IE5VTEwpIHsKKwkJCWtmcmVlIChjYXJkLT5zdGF0ZXNbaV0pOworCQkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJZG1hYnVmLT50cmlnZ2VyIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWk4MTBfc2V0X2FkY19yYXRlKHN0YXRlLCA4MDAwKTsKKwl9CisJaWYoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYoKGRtYWJ1Zi0+d3JpdGVfY2hhbm5lbCA9IGNhcmQtPmFsbG9jX3BjbV9jaGFubmVsKGNhcmQpKSA9PSBOVUxMKSB7CisJCQkvKiBtYWtlIHN1cmUgd2UgZnJlZSB0aGUgcmVjb3JkIGNoYW5uZWwgYWxsb2NhdGVkIGFib3ZlICovCisJCQlpZihmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoY2FyZCxkbWFidWYtPnJlYWRfY2hhbm5lbC0+bnVtKTsKKwkJCWtmcmVlIChjYXJkLT5zdGF0ZXNbaV0pOworCQkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJLyogSW5pdGlhbGl6ZSB0byA4a0h6PyAgV2hhdCBpZiB3ZSBkb24ndCBzdXBwb3J0IDhrSHo/ICovCisJCS8qICBMZXQncyBjaGFuZ2UgdGhpcyB0byBjaGVjayBmb3IgUy9QRElGIHN0dWZmICovCisJCisJCWRtYWJ1Zi0+dHJpZ2dlciB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJaWYgKCBzcGRpZl9sb2NrZWQgKSB7CisJCQlpODEwX3NldF9kYWNfcmF0ZShzdGF0ZSwgc3BkaWZfbG9ja2VkKTsKKwkJCWk4MTBfc2V0X3NwZGlmX291dHB1dChzdGF0ZSwgQUM5N19FQV9TUFNBXzNfNCwgc3BkaWZfbG9ja2VkKTsKKwkJfSBlbHNlIHsKKwkJCWk4MTBfc2V0X2RhY19yYXRlKHN0YXRlLCA4MDAwKTsKKwkJCS8qIFB1dCB0aGUgQUNMaW5rIGluIDIgY2hhbm5lbCBtb2RlIGJ5IGRlZmF1bHQgKi8KKwkJCWkgPSBJODEwX0lPUkVBREwoY2FyZCwgR0xPQl9DTlQpOworCQkJSTgxMF9JT1dSSVRFTChpICYgMHhmZmNmZmZmZiwgY2FyZCwgR0xPQl9DTlQpOworCQl9CisJfQorCQkKKwkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgZm9ybWF0LiBBY2NvcmRpbmcgdG8gT1NTIFByb2dyYW1tZXIncyBHdWlkZSAgL2Rldi9kc3AKKwkgICBzaG91bGQgYmUgZGVmYXVsdCB0byB1bnNpZ25lZCA4LWJpdHMsIG1vbm8sIHdpdGggc2FtcGxlIHJhdGUgOGtIeiBhbmQKKwkgICAvZGV2L2RzcFcgd2lsbCBhY2NlcHQgMTYtYml0cyBzYW1wbGUsIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IHRob3NlIHNvIHdlCisJICAgc2V0IGl0IGltbWVkaWF0ZWx5IHRvIHN0ZXJlbyBhbmQgMTZiaXQsIHdoaWNoIGlzIGFsbCB3ZSBkbyBzdXBwb3J0ICovCisJZG1hYnVmLT5mbXQgfD0gSTgxMF9GTVRfMTZCSVQgfCBJODEwX0ZNVF9TVEVSRU87CisJZG1hYnVmLT5vc3NmcmFnc2l6ZSA9IDA7CisJZG1hYnVmLT5vc3NtYXhmcmFncyAgPSAwOworCWRtYWJ1Zi0+c3ViZGl2aXNpb24gID0gMDsKKworCXN0YXRlLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgaTgxMF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgaTgxMF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2tfa2VybmVsKCk7CisKKwkvKiBzdG9wIERNQSBzdGF0ZSBtYWNoaW5lIGFuZCBmcmVlIERNQSBidWZmZXJzL2NoYW5uZWxzICovCisJaWYoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJZHJhaW5fZGFjKHN0YXRlLCAwKTsKKwl9CisJaWYoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQlzdG9wX2FkYyhzdGF0ZSk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJZGVhbGxvY19kbWFidWYoc3RhdGUpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT53cml0ZV9jaGFubmVsLT5udW0pOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdGF0ZS0+Y2FyZC0+ZnJlZV9wY21fY2hhbm5lbChzdGF0ZS0+Y2FyZCwgZG1hYnVmLT5yZWFkX2NoYW5uZWwtPm51bSk7CisJfQorCisJc3RhdGUtPmNhcmQtPnN0YXRlc1tzdGF0ZS0+dmlydF0gPSBOVUxMOworCWtmcmVlKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJdW5sb2NrX2tlcm5lbCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpODEwX2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IGk4MTBfcmVhZCwKKwkud3JpdGUJCT0gaTgxMF93cml0ZSwKKwkucG9sbAkJPSBpODEwX3BvbGwsCisJLmlvY3RsCQk9IGk4MTBfaW9jdGwsCisJLm1tYXAJCT0gaTgxMF9tbWFwLAorCS5vcGVuCQk9IGk4MTBfb3BlbiwKKwkucmVsZWFzZQk9IGk4MTBfcmVsZWFzZSwKK307CisKKy8qIFdyaXRlIEFDOTcgY29kZWMgcmVnaXN0ZXJzICovCisKK3N0YXRpYyB1MTYgaTgxMF9hYzk3X2dldF9tbWlvKHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7CisJaW50IGNvdW50ID0gMTAwOworCXUxNiByZWdfc2V0ID0gSU9fUkVHX09GRihkZXYpIHwgKHJlZyYweDdmKTsKKwkKKwl3aGlsZShjb3VudC0tICYmIChyZWFkYihjYXJkLT5pb2Jhc2VfbW1pbyArIENBUykgJiAxKSkgCisJCXVkZWxheSgxKTsKKwkKKyNpZmRlZiBERUJVR19NTUlPCisJeworCQl1MTYgYW5zID0gcmVhZHcoY2FyZC0+YWM5N2Jhc2VfbW1pbyArIHJlZ19zZXQpOworCQlwcmludGsoS0VSTl9ERUJVRyAiaTgxMF9hdWRpbzogYWM5N19nZXRfbW1pbyglZCkgLT4gMHglMDRYXG4iLCAoKGludCkgcmVnX3NldCkgJiAweGZmZmYsICh1MzIpIGFucyk7CisJCXJldHVybiBhbnM7CisJfQorI2Vsc2UKKwlyZXR1cm4gcmVhZHcoY2FyZC0+YWM5N2Jhc2VfbW1pbyArIHJlZ19zZXQpOworI2VuZGlmCit9CisKK3N0YXRpYyB1MTYgaTgxMF9hYzk3X2dldF9pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcpCit7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZCA9IGRldi0+cHJpdmF0ZV9kYXRhOworCWludCBjb3VudCA9IDEwMDsKKwl1MTYgcmVnX3NldCA9IElPX1JFR19PRkYoZGV2KSB8IChyZWcmMHg3Zik7CisJCisJd2hpbGUoY291bnQtLSAmJiAoSTgxMF9JT1JFQURCKGNhcmQsIENBUykgJiAxKSkgCisJCXVkZWxheSgxKTsKKwkKKwlyZXR1cm4gaW53KGNhcmQtPmFjOTdiYXNlICsgcmVnX3NldCk7Cit9CisKK3N0YXRpYyB2b2lkIGk4MTBfYWM5N19zZXRfbW1pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiBkYXRhKQoreworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKKwlpbnQgY291bnQgPSAxMDA7CisJdTE2IHJlZ19zZXQgPSBJT19SRUdfT0ZGKGRldikgfCAocmVnJjB4N2YpOworCQorCXdoaWxlKGNvdW50LS0gJiYgKHJlYWRiKGNhcmQtPmlvYmFzZV9tbWlvICsgQ0FTKSAmIDEpKSAKKwkJdWRlbGF5KDEpOworCQorCXdyaXRldyhkYXRhLCBjYXJkLT5hYzk3YmFzZV9tbWlvICsgcmVnX3NldCk7CisKKyNpZmRlZiBERUJVR19NTUlPCisJcHJpbnRrKEtFUk5fREVCVUcgImk4MTBfYXVkaW86IGFjOTdfc2V0X21taW8oMHglMDRYLCAlZClcbiIsICh1MzIpIGRhdGEsICgoaW50KSByZWdfc2V0KSAmIDB4ZmZmZik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgaTgxMF9hYzk3X3NldF9pbyhzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiBkYXRhKQoreworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKKwlpbnQgY291bnQgPSAxMDA7CisJdTE2IHJlZ19zZXQgPSBJT19SRUdfT0ZGKGRldikgfCAocmVnJjB4N2YpOworCQorCXdoaWxlKGNvdW50LS0gJiYgKEk4MTBfSU9SRUFEQihjYXJkLCBDQVMpICYgMSkpIAorCQl1ZGVsYXkoMSk7CisJCisgICAgICAgIG91dHcoZGF0YSwgY2FyZC0+YWM5N2Jhc2UgKyByZWdfc2V0KTsKK30KKworc3RhdGljIHUxNiBpODEwX2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gZGV2LT5wcml2YXRlX2RhdGE7CisJdTE2IHJldDsKKwkKKwlzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJaWYgKGNhcmQtPnVzZV9tbWlvKSB7CisJCXJldCA9IGk4MTBfYWM5N19nZXRfbW1pbyhkZXYsIHJlZyk7CisJfQorCWVsc2UgeworCQlyZXQgPSBpODEwX2FjOTdfZ2V0X2lvKGRldiwgcmVnKTsKKwl9CisJc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgaTgxMF9hYzk3X3NldChzdHJ1Y3QgYWM5N19jb2RlYyAqZGV2LCB1OCByZWcsIHUxNiBkYXRhKQoreworCXN0cnVjdCBpODEwX2NhcmQgKmNhcmQgPSBkZXYtPnByaXZhdGVfZGF0YTsKKwkKKwlzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJaWYgKGNhcmQtPnVzZV9tbWlvKSB7CisJCWk4MTBfYWM5N19zZXRfbW1pbyhkZXYsIHJlZywgZGF0YSk7CisJfQorCWVsc2UgeworCQlpODEwX2FjOTdfc2V0X2lvKGRldiwgcmVnLCBkYXRhKTsKKwl9CisJc3Bpbl91bmxvY2soJmNhcmQtPmFjOTdfbG9jayk7Cit9CisKKworLyogT1NTIC9kZXYvbWl4ZXIgZmlsZSBvcGVyYXRpb24gbWV0aG9kcyAqLworCitzdGF0aWMgaW50IGk4MTBfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGk7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gZGV2czsKKworCWZvciAoY2FyZCA9IGRldnM7IGNhcmQgIT0gTlVMTDsgY2FyZCA9IGNhcmQtPm5leHQpIHsKKwkJLyoKKwkJICogSWYgd2UgYXJlIGluaXRpYWxpemluZyBhbmQgdGhlbiBmYWlsLCBjYXJkIGNvdWxkIGdvCisJCSAqIGF3YXkgdW51ZXhwZWN0ZWRseSB3aGlsZSB3ZSBhcmUgaW4gdGhlIGZvcigpIGxvb3AuCisJCSAqIFNvLCBjaGVjayBmb3IgY2FyZCBvbiBlYWNoIGl0ZXJhdGlvbiBiZWZvcmUgd2UgY2hlY2sKKwkJICogZm9yIGNhcmQtPmluaXRpYWxpemluZyB0byBhdm9pZCBhIHBvc3NpYmxlIG9vcHMuCisJCSAqIFRoaXMgdXN1YWxseSBvbmx5IG1hdHRlcnMgZm9yIHRpbWVzIHdoZW4gdGhlIGRyaXZlciBpcworCQkgKiBhdXRvbG9hZGVkIGJ5IGttb2QuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgNTAgJiYgY2FyZCAmJiBjYXJkLT5pbml0aWFsaXppbmc7IGkrKykgeworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfdGltZW91dChIWi8yMCk7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTcgJiYgY2FyZCAmJiAhY2FyZC0+aW5pdGlhbGl6aW5nOyBpKyspIAorCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJgorCQkJICAgIGNhcmQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlciA9PSBtaW5vcikgeworCQkJCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQtPmFjOTdfY29kZWNbaV07CisJCQkJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworCQkJfQorCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIGludCBpODEwX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBpODEwX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBpODEwX2lvY3RsX21peGRldiwKKwkub3BlbgkJPSBpODEwX29wZW5fbWl4ZGV2LAorfTsKKworLyogQUM5NyBjb2RlYyBpbml0aWFsaXNhdGlvbi4gIFRoZXNlIHNtYWxsIGZ1bmN0aW9ucyBleGlzdCBzbyB3ZSBkb24ndAorICAgZHVwbGljYXRlIGNvZGUgYmV0d2VlbiBtb2R1bGUgaW5pdCBhbmQgYXBtIHJlc3VtZSAqLworCitzdGF0aWMgaW5saW5lIGludCBpODEwX2FjOTdfZXhpc3RzKHN0cnVjdCBpODEwX2NhcmQgKmNhcmQsIGludCBhYzk3X251bWJlcikKK3sKKwl1MzIgcmVnID0gSTgxMF9JT1JFQURMKGNhcmQsIEdMT0JfU1RBKTsKKwlzd2l0Y2ggKGFjOTdfbnVtYmVyKSB7CisJY2FzZSAwOgorCQlyZXR1cm4gcmVnICYgKDE8PDgpOworCWNhc2UgMTogCisJCXJldHVybiByZWcgJiAoMTw8OSk7CisJY2FzZSAyOgorCQlyZXR1cm4gcmVnICYgKDE8PDI4KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGk4MTBfYWM5N19lbmFibGVfdmFyaWFibGVfcmF0ZShzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJaTgxMF9hYzk3X3NldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIDkpOworCWk4MTBfYWM5N19zZXQoY29kZWMsQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCSAgICAgIGk4MTBfYWM5N19nZXQoY29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKXwweEU4MDApOworCQorCXJldHVybiAoaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpJjEpOworfQorCisKK3N0YXRpYyBpbnQgaTgxMF9hYzk3X3Byb2JlX2FuZF9wb3dlcnVwKHN0cnVjdCBpODEwX2NhcmQgKmNhcmQsc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCS8qIFJldHVybnMgMCBvbiBmYWlsdXJlICovCisJaW50IGk7CisKKwlpZiAoYWM5N19wcm9iZV9jb2RlYyhjb2RlYykgPT0gMCkgcmV0dXJuIDA7CisJCisJLyogcG93ZXIgaXQgYWxsIHVwICovCisJaTgxMF9hYzk3X3NldChjb2RlYywgQUM5N19QT1dFUl9DT05UUk9MLAorCQkgICAgICBpODEwX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X1BPV0VSX0NPTlRST0wpICYgfjB4N2YwMCk7CisKKwkvKiB3YWl0IGZvciBhbmFsb2cgcmVhZHkgKi8KKwlmb3IgKGk9MTAwOyBpICYmICgoaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19QT1dFUl9DT05UUk9MKSAmIDB4ZikgIT0gMHhmKTsgaS0tKQorCXsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KEhaLzIwKTsKKwl9IAorCXJldHVybiBpOworfQorCitzdGF0aWMgaW50IGlzX25ld19pY2godTE2IHBjaV9pZCkKK3sKKwlzd2l0Y2ggKHBjaV9pZCkgeworCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF84MjgwMURCXzU6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMXzgyODAxRUJfNToKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfRVNCXzU6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX0lDSDZfMTg6CisJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBpY2hfdXNlX21taW8oc3RydWN0IGk4MTBfY2FyZCAqY2FyZCkKK3sKKwlyZXR1cm4gaXNfbmV3X2ljaChjYXJkLT5wY2lfaWQpICYmIGNhcmQtPnVzZV9tbWlvOworfQorCisvKioKKyAqCWk4MTBfYWM5N19wb3dlcl91cF9idXMJLQlicmluZyB1cCBBQzk3IGxpbmsKKyAqCUBjYXJkIDogSUNIIGF1ZGlvIGRldmljZSB0byBwb3dlciB1cAorICoKKyAqCUJyaW5nIHVwIHRoZSBBQ0xpbmsgQUM5NyBjb2RlYyBidXMKKyAqLworIAorc3RhdGljIGludCBpODEwX2FjOTdfcG93ZXJfdXBfYnVzKHN0cnVjdCBpODEwX2NhcmQgKmNhcmQpCit7CQorCXUzMiByZWcgPSBJODEwX0lPUkVBREwoY2FyZCwgR0xPQl9DTlQpOworCWludCBpOworCWludCBwcmltYXJ5X2NvZGVjX2lkID0gMDsKKworCWlmKChyZWcmMik9PTApCS8qIENvbGQgcmVxdWlyZWQgKi8KKwkJcmVnfD0yOworCWVsc2UKKwkJcmVnfD00OwkvKiBXYXJtICovCisJCQorCXJlZyY9fjg7CS8qIEFDTGluayBvbiAqLworCQorCS8qIEF0IHRoaXMgcG9pbnQgd2UgZGVhc3NlcnQgQUNfUkVTRVQgIyAqLworCUk4MTBfSU9XUklURUwocmVnICwgY2FyZCwgR0xPQl9DTlQpOworCisJLyogV2UgbXVzdCBub3cgYWxsb3cgdGltZSBmb3IgdGhlIENvZGVjIGluaXRpYWxpc2F0aW9uLgorCSAgIDYwMG1TIGlzIHRoZSBzcGVjaWZpZWQgdGltZSAqLworCSAgIAkKKwlmb3IoaT0wO2k8MTA7aSsrKQorCXsKKwkJaWYoKEk4MTBfSU9SRUFETChjYXJkLCBHTE9CX0NOVCkmNCk9PTApCisJCQlicmVhazsKKworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoSFovMjApOworCX0KKwlpZihpPT0xMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiaTgxMF9hdWRpbzogQUMnOTcgcmVzZXQgZmFpbGVkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KEhaLzIpOworCisJLyoKKwkgKglTZWUgaWYgdGhlIHByaW1hcnkgY29kZWMgY29tZXMgcmVhZHkuIFRoaXMgbXVzdCBoYXBwZW4KKwkgKgliZWZvcmUgd2Ugc3RhcnQgZG9pbmcgRE1BIHN0dWZmCisJICovCQorCS8qIHNlZSBpODEwX2FjOTdfaW5pdCBmb3IgdGhlIG5leHQgMTAgbGluZXMgKGpzYXcpICovCisJaWYgKGNhcmQtPnVzZV9tbWlvKQorCQlyZWFkdyhjYXJkLT5hYzk3YmFzZV9tbWlvKTsKKwllbHNlCisJCWludyhjYXJkLT5hYzk3YmFzZSk7CisJaWYgKGljaF91c2VfbW1pbyhjYXJkKSkgeworCQlwcmltYXJ5X2NvZGVjX2lkID0gKGludCkgcmVhZGwoY2FyZC0+aW9iYXNlX21taW8gKyBTRE0pICYgMHgzOworCQlwcmludGsoS0VSTl9JTkZPICJpODEwX2F1ZGlvOiBQcmltYXJ5IGNvZGVjIGhhcyBJRCAlZFxuIiwKKwkJICAgICAgIHByaW1hcnlfY29kZWNfaWQpOworCX0KKworCWlmKCEgaTgxMF9hYzk3X2V4aXN0cyhjYXJkLCBwcmltYXJ5X2NvZGVjX2lkKSkKKwl7CisJCXByaW50ayhLRVJOX0lORk8gImk4MTBfYXVkaW86IENvZGVjIG5vdCByZWFkeS4uIHdhaXQuLiAiKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlzY2hlZHVsZV90aW1lb3V0KEhaKTsJLyogYWN0dWFsbHkgNjAwbVMgYnkgdGhlIHNwZWMgKi8KKworCQlpZihpODEwX2FjOTdfZXhpc3RzKGNhcmQsIHByaW1hcnlfY29kZWNfaWQpKQorCQkJcHJpbnRrKCJPS1xuIik7CisJCWVsc2UgCisJCQlwcmludGsoIm5vIHJlc3BvbnNlLlxuIik7CisJfQorCWlmIChjYXJkLT51c2VfbW1pbykKKwkJcmVhZHcoY2FyZC0+YWM5N2Jhc2VfbW1pbyk7CisJZWxzZQorCQlpbncoY2FyZC0+YWM5N2Jhc2UpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpODEwX2FjOTdfaW5pdChzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkKQoreworCWludCBudW1fYWM5NyA9IDA7CisJaW50IGFjOTdfaWQ7CisJaW50IHRvdGFsX2NoYW5uZWxzID0gMDsKKwlpbnQgbnJfYWM5N19tYXggPSBjYXJkX2NhcFtjYXJkLT5wY2lfaWRfaW50ZXJuYWxdLm5yX2FjOTc7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCXUxNiBlaWQ7CisJdTMyIHJlZzsKKworCWlmKCFpODEwX2FjOTdfcG93ZXJfdXBfYnVzKGNhcmQpKSByZXR1cm4gMDsKKworCS8qIE51bWJlciBvZiBjaGFubmVscyBzdXBwb3J0ZWQgKi8KKwkvKiBXaGF0IGFib3V0IHRoZSBjb2RlYz8gIEp1c3QgYmVjYXVzZSB0aGUgSUNIIHN1cHBvcnRzICovCisJLyogbXVsdGlwbGUgY2hhbm5lbHMgZG9lc24ndCBtZWFuIHRoZSBjb2RlYyBkb2VzLiAgICAgICAqLworCS8qIHdlJ2xsIGhhdmUgdG8gbW9kaWZ5IHRoaXMgaW4gdGhlIGNvZGVjIHNlY3Rpb24gYmVsb3cgKi8KKwkvKiB0byByZWZsZWN0IHdoYXQgdGhlIGNvZGVjIGhhcy4gICAgICAgICAgICAgICAgICAgICAgICovCisJLyogSUNIIGFuZCBJQ0gwIG9ubHkgc3VwcG9ydCAyIGNoYW5uZWxzIHNvIGRvbid0IGJvdGhlciAqLworCS8qIHRvIGNoZWNrLi4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWNhcmQtPmNoYW5uZWxzID0gMjsKKwlyZWcgPSBJODEwX0lPUkVBREwoY2FyZCwgR0xPQl9TVEEpOworCWlmICggcmVnICYgMHgwMjAwMDAwICkKKwkJY2FyZC0+Y2hhbm5lbHMgPSA2OworCWVsc2UgaWYgKCByZWcgJiAweDAxMDAwMDAgKQorCQljYXJkLT5jaGFubmVscyA9IDQ7CisJcHJpbnRrKEtFUk5fSU5GTyAiaTgxMF9hdWRpbzogQXVkaW8gQ29udHJvbGxlciBzdXBwb3J0cyAlZCBjaGFubmVscy5cbiIsIGNhcmQtPmNoYW5uZWxzKTsKKwlwcmludGsoS0VSTl9JTkZPICJpODEwX2F1ZGlvOiBEZWZhdWx0aW5nIHRvIGJhc2UgMiBjaGFubmVsIG1vZGUuXG4iKTsKKwlyZWcgPSBJODEwX0lPUkVBREwoY2FyZCwgR0xPQl9DTlQpOworCUk4MTBfSU9XUklURUwocmVnICYgMHhmZmNmZmZmZiwgY2FyZCwgR0xPQl9DTlQpOworCQkKKwlmb3IgKG51bV9hYzk3ID0gMDsgbnVtX2FjOTcgPCBOUl9BQzk3OyBudW1fYWM5NysrKSAKKwkJY2FyZC0+YWM5N19jb2RlY1tudW1fYWM5N10gPSBOVUxMOworCisJLypARklYTUUgSSBkb24ndCBrbm93LCBpZiBJJ20gcGxheWluZyB0byBzYWZlIGhlcmUuLi4gKGpzYXcpICovCisJaWYgKChucl9hYzk3X21heCA+IDIpICYmICFjYXJkLT51c2VfbW1pbykgbnJfYWM5N19tYXggPSAyOworCisJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgbnJfYWM5N19tYXg7IG51bV9hYzk3KyspIHsKKwkJLyogY29kZWMgcmVzZXQgKi8KKwkJcHJpbnRrKEtFUk5fSU5GTyAiaTgxMF9hdWRpbzogUmVzZXR0aW5nIGNvbm5lY3Rpb24gJWRcbiIsIG51bV9hYzk3KTsKKwkJaWYgKGNhcmQtPnVzZV9tbWlvKQorCQkJcmVhZHcoY2FyZC0+YWM5N2Jhc2VfbW1pbyArIDB4ODAqbnVtX2FjOTcpOworCQllbHNlCisJCQlpbncoY2FyZC0+YWM5N2Jhc2UgKyAweDgwKm51bV9hYzk3KTsKKworCQkvKiBJZiB3ZSBoYXZlIHRoZSBTREFUQV9JTiBNYXAgUmVnaXN0ZXIsIGFzIG9uIElDSDQsIHdlCisJCSAgIGRvIG5vdCBsb29wIHRocnUgYWxsIHBvc3NpYmxlIGNvZGVjIElEcyBidXQgdGhydSBhbGwgCisJCSAgIHBvc3NpYmxlIElPIGNoYW5uZWxzLiBCaXQgMDoxIG9mIFNETSB0aGVuIGhvbGRzIHRoZSAKKwkJICAgbGFzdCBjb2RlYyBJRCBzcG9rZW4gdG8uIAorCQkqLworCQlpZiAoaWNoX3VzZV9tbWlvKGNhcmQpKSB7CisJCQlhYzk3X2lkID0gKGludCkgcmVhZGwoY2FyZC0+aW9iYXNlX21taW8gKyBTRE0pICYgMHgzOworCQkJcHJpbnRrKEtFUk5fSU5GTyAiaTgxMF9hdWRpbzogQ29ubmVjdGlvbiAlZCB3aXRoIGNvZGVjIGlkICVkXG4iLAorCQkJICAgICAgIG51bV9hYzk3LCBhYzk3X2lkKTsKKwkJfQorCQllbHNlIHsKKwkJCWFjOTdfaWQgPSBudW1fYWM5NzsKKwkJfQorCisJCS8qIFRoZSBJQ0ggcHJvZ3JhbW1lcidzIHJlZmVyZW5jZSBzYXlzIHlvdSBzaG91bGQgICAqLworCQkvKiBjaGVjayB0aGUgcmVhZHkgc3RhdHVzIGJlZm9yZSBwcm9iaW5nLiBTbyB3ZSBjaGsgKi8KKwkJLyogICBXaGF0IGRvIHdlIGRvIGlmIGl0J3Mgbm90IHJlYWR5PyAgV2FpdCBhbmQgdHJ5ICovCisJCS8qICAgYWdhaW4sIG9yIGFib3J0PyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCQlpZiAoIWk4MTBfYWM5N19leGlzdHMoY2FyZCwgYWM5N19pZCkpIHsKKwkJCWlmKG51bV9hYzk3ID09IDApCisJCQkJcHJpbnRrKEtFUk5fRVJSICJpODEwX2F1ZGlvOiBQcmltYXJ5IGNvZGVjIG5vdCByZWFkeS5cbiIpOworCQl9CisJCQorCQlpZiAoKGNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogaW5pdGlhbGl6ZSBzb21lIGJhc2ljIGNvZGVjIGluZm9ybWF0aW9uLCBvdGhlciBmaWVsZHMgd2lsbCBiZSBmaWxsZWQKKwkJICAgaW4gYWM5N19wcm9iZV9jb2RlYyAqLworCQljb2RlYy0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKwkJY29kZWMtPmlkID0gYWM5N19pZDsKKwkJY2FyZC0+YWM5N19pZF9tYXBbYWM5N19pZF0gPSBudW1fYWM5NyAqIDB4ODA7CisKKwkJaWYgKGNhcmQtPnVzZV9tbWlvKSB7CQorCQkJY29kZWMtPmNvZGVjX3JlYWQgPSBpODEwX2FjOTdfZ2V0X21taW87CisJCQljb2RlYy0+Y29kZWNfd3JpdGUgPSBpODEwX2FjOTdfc2V0X21taW87CisJCX0KKwkJZWxzZSB7CisJCQljb2RlYy0+Y29kZWNfcmVhZCA9IGk4MTBfYWM5N19nZXRfaW87CisJCQljb2RlYy0+Y29kZWNfd3JpdGUgPSBpODEwX2FjOTdfc2V0X2lvOworCQl9CisJCisJCWlmKCFpODEwX2FjOTdfcHJvYmVfYW5kX3Bvd2VydXAoY2FyZCxjb2RlYykpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiaTgxMF9hdWRpbzogdGltZWQgb3V0IHdhaXRpbmcgZm9yIGNvZGVjICVkIGFuYWxvZyByZWFkeS5cbiIsIGFjOTdfaWQpOworCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKKwkJCWJyZWFrOwkvKiBpdCBkaWRuJ3Qgd29yayAqLworCQl9CisJCS8qIFN0b3JlIHN0YXRlIGluZm9ybWF0aW9uIGFib3V0IFMvUERJRiB0cmFuc21pdHRlciAqLworCQljYXJkLT5hYzk3X3N0YXR1cyA9IDA7CisJCQorCQkvKiBEb24ndCBhdHRlbXB0IHRvIGdldCBlaWQgdW50aWwgcG93ZXJ1cCBpcyBjb21wbGV0ZSAqLworCQllaWQgPSBpODEwX2FjOTdfZ2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX0lEKTsKKworCQlpZihlaWQ9PTB4RkZGRikKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiaTgxMF9hdWRpbzogbm8gY29kZWMgYXR0YWNoZWQgP1xuIik7CisJCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOworCQkJYnJlYWs7CisJCX0KKwkJCisJCS8qIENoZWNrIGZvciBhbiBBQzk3IDEuMCBzb2Z0IG1vZGVtIChJRDEpICovCisJCQorCQlpZihjb2RlYy0+bW9kZW0pCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImk4MTBfYXVkaW86IGNvZGVjICVkIGlzIGEgc29mdG1vZGVtIC0gc2tpcHBpbmcuXG4iLCBhYzk3X2lkKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisJCQljb250aW51ZTsKKwkJfQorCQkKKwkJY2FyZC0+YWM5N19mZWF0dXJlcyA9IGVpZDsKKworCQkvKiBOb3cgY2hlY2sgdGhlIGNvZGVjIGZvciB1c2VmdWwgZmVhdHVyZXMgdG8gbWFrZSB1cCBmb3IKKwkJICAgdGhlIGR1bWJuZXNzIG9mIHRoZSA4MTAgaGFyZHdhcmUgZW5naW5lICovCisKKwkJaWYoIShlaWQmMHgwMDAxKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgImk4MTBfYXVkaW86IG9ubHkgNDhLaHogcGxheWJhY2sgYXZhaWxhYmxlLlxuIik7CisJCWVsc2UKKwkJeworCQkJaWYoIWk4MTBfYWM5N19lbmFibGVfdmFyaWFibGVfcmF0ZShjb2RlYykpIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJpODEwX2F1ZGlvOiBDb2RlYyByZWZ1c2VkIHRvIGFsbG93IFZSQSwgdXNpbmcgNDhLaHogb25seS5cbiIpOworCQkJCWNhcmQtPmFjOTdfZmVhdHVyZXMmPX4xOworCQkJfQkJCQorCQl9CisgICAJCQorCQkvKiBUdXJuIG9uIHRoZSBhbXBsaWZpZXIgKi8KKworCQljb2RlYy0+Y29kZWNfd3JpdGUoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCwgCisJCQkgY29kZWMtPmNvZGVjX3JlYWQoY29kZWMsIEFDOTdfUE9XRVJfQ09OVFJPTCkgJiB+MHg4MDAwKTsKKwkJCQkKKwkJLyogRGV0ZXJtaW5lIGhvdyBtYW55IGNoYW5uZWxzIHRoZSBjb2RlYyhzKSBzdXBwb3J0ICAgKi8KKwkJLyogICAtIFRoZSBwcmltYXJ5IGNvZGVjIGFsd2F5cyBzdXBwb3J0cyAyICAgICAgICAgICAgKi8KKwkJLyogICAtIElmIHRoZSBjb2RlYyBzdXBwb3J0cyBBTUFQLCBzdXJyb3VuZCBEQUNzIHdpbGwgKi8KKwkJLyogICAgIGF1dG9tYXRpY2xseSBnZXQgYXNzaWduZWQgdG8gc2xvdHMuICAgICAgICAgICAgKi8KKwkJLyogICAgICogQ2hlY2sgZm9yIHN1cnJvdW5kIERBQ3MgYW5kIGluY3JlbWVudCBpZiAgICAgKi8KKwkJLyogICAgICAgZm91bmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwkJLyogICAtIEVsc2UgY2hlY2sgaWYgdGhlIGNvZGVjIGlzIHJldmlzaW9uIDIuMiAgICAgICAgKi8KKwkJLyogICAgICogSWYgc3Vycm91bmQgREFDcyBleGlzdCwgYXNzaWduIHRoZW0gdG8gc2xvdHMgKi8KKwkJLyogICAgICAgYW5kIGluY3JlbWVudCBjaGFubmVsIGNvdW50LiAgICAgICAgICAgICAgICAgKi8KKworCQkvKiBBbGwgb2YgdGhpcyBvbmx5IGFwcGxpZXMgdG8gSUNIMiBhbmQgYWJvdmUuIElDSCAgICAqLworCQkvKiBhbmQgSUNIMCBvbmx5IHN1cHBvcnQgMiBjaGFubmVscy4gIElDSDIgd2lsbCBvbmx5ICAqLworCQkvKiBzdXBwb3J0IG11bHRpcGxlIGNvZGVjcyBpbiBhICJzcGxpdCBhdWRpbyIgY29uZmlnLiAqLworCQkvKiBhcyBkZXNjcmliZWQgYWJvdmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisJCS8qIFRPRE86IFJlbW92ZSBhbGwgdGhlIGRlYnVnZ2luZyBtZXNzYWdlcyEgICAgICAgICAgICovCisKKwkJaWYoKGVpZCAmIDB4YzAwMCkgPT0gMCkgLyogcHJpbWFyeSBjb2RlYyAqLworCQkJdG90YWxfY2hhbm5lbHMgKz0gMjsgCisKKwkJaWYoZWlkICYgMHgyMDApIHsgLyogR09PRCwgQU1BUCBzdXBwb3J0ICovCisJCQlpZiAoZWlkICYgMHgwMDgwKSAvKiBML1IgU3Vycm91bmQgY2hhbm5lbHMgKi8KKwkJCQl0b3RhbF9jaGFubmVscyArPSAyOworCQkJaWYgKGVpZCAmIDB4MDE0MCkgLyogTEZFIGFuZCBDZW50ZXIgY2hhbm5lbHMgKi8KKwkJCQl0b3RhbF9jaGFubmVscyArPSAyOworCQkJcHJpbnRrKCJpODEwX2F1ZGlvOiBBQyc5NyBjb2RlYyAlZCBzdXBwb3J0cyBBTUFQLCB0b3RhbCBjaGFubmVscyA9ICVkXG4iLCBhYzk3X2lkLCB0b3RhbF9jaGFubmVscyk7CisJCX0gZWxzZSBpZiAoZWlkICYgMHgwNDAwKSB7ICAvKiB0aGlzIG9ubHkgd29ya3Mgb24gMi4yIGNvbXBsaWFudCBjb2RlY3MgKi8KKwkJCWVpZCAmPSAweGZmY2Y7CisJCQlpZigoZWlkICYgMHhjMDAwKSAhPSAwKQl7CisJCQkJc3dpdGNoICggdG90YWxfY2hhbm5lbHMgKSB7CisJCQkJCWNhc2UgMjoKKwkJCQkJCS8qIFNldCBkc2ExLCBkc2EwIHRvIDAxICovCisJCQkJCQllaWQgfD0gMHgwMDEwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNDoKKwkJCQkJCS8qIFNldCBkc2ExLCBkc2EwIHRvIDEwICovCisJCQkJCQllaWQgfD0gMHgwMDIwOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgNjoKKwkJCQkJCS8qIFNldCBkc2ExLCBkc2EwIHRvIDExICovCisJCQkJCQllaWQgfD0gMHgwMDMwOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCXRvdGFsX2NoYW5uZWxzICs9IDI7CisJCQl9CisJCQlpODEwX2FjOTdfc2V0KGNvZGVjLCBBQzk3X0VYVEVOREVEX0lELCBlaWQpOworCQkJZWlkID0gaTgxMF9hYzk3X2dldChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCk7CisJCQlwcmludGsoImk4MTBfYXVkaW86IEFDJzk3IGNvZGVjICVkLCBuZXcgRUlEIHZhbHVlID0gMHglMDR4XG4iLCBhYzk3X2lkLCBlaWQpOworCQkJaWYgKGVpZCAmIDB4MDA4MCkgLyogTC9SIFN1cnJvdW5kIGNoYW5uZWxzICovCisJCQkJdG90YWxfY2hhbm5lbHMgKz0gMjsKKwkJCWlmIChlaWQgJiAweDAxNDApIC8qIExGRSBhbmQgQ2VudGVyIGNoYW5uZWxzICovCisJCQkJdG90YWxfY2hhbm5lbHMgKz0gMjsKKwkJCXByaW50aygiaTgxMF9hdWRpbzogQUMnOTcgY29kZWMgJWQsIERBQyBtYXAgY29uZmlndXJlZCwgdG90YWwgY2hhbm5lbHMgPSAlZFxuIiwgYWM5N19pZCwgdG90YWxfY2hhbm5lbHMpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJpODEwX2F1ZGlvOiBBQyc5NyBjb2RlYyAlZCBVbmFibGUgdG8gbWFwIHN1cnJvdW5kIERBQydzIChvciBEQUMncyBub3QgcHJlc2VudCksIHRvdGFsIGNoYW5uZWxzID0gJWRcbiIsIGFjOTdfaWQsIHRvdGFsX2NoYW5uZWxzKTsKKwkJfQorCisJCWlmICgoY29kZWMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZpODEwX21peGVyX2ZvcHMsIC0xKSkgPCAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IGNvdWxkbid0IHJlZ2lzdGVyIG1peGVyIVxuIik7CisJCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOworCQkJYnJlYWs7CisJCX0KKworCQljYXJkLT5hYzk3X2NvZGVjW251bV9hYzk3XSA9IGNvZGVjOworCX0KKworCS8qIHR1bmUgdXAgdGhlIHByaW1hcnkgY29kZWMgKi8KKwlhYzk3X3R1bmVfaGFyZHdhcmUoY2FyZC0+cGNpX2RldiwgYWM5N19xdWlya3MsIGFjOTdfcXVpcmspOworCisJLyogcGljayB0aGUgbWluaW11bSBvZiBjaGFubmVscyBzdXBwb3J0ZWQgYnkgSUNIeCBvciBjb2RlYyhzKSAqLworCWNhcmQtPmNoYW5uZWxzID0gKGNhcmQtPmNoYW5uZWxzID4gdG90YWxfY2hhbm5lbHMpP3RvdGFsX2NoYW5uZWxzOmNhcmQtPmNoYW5uZWxzOworCisJcmV0dXJuIG51bV9hYzk3OworfQorCitzdGF0aWMgdm9pZCBfX2RldmluaXQgaTgxMF9jb25maWd1cmVfY2xvY2tpbmcgKHZvaWQpCit7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgaTgxMF9zdGF0ZSAqc3RhdGU7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmOworCXVuc2lnbmVkIGludCBpLCBvZmZzZXQsIG5ld19vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWNhcmQgPSBkZXZzOworCS8qIFdlIGNvdWxkIHRyeSB0byBzZXQgdGhlIGNsb2NraW5nIGZvciBtdWx0aXBsZSBjYXJkcywgYnV0IGNhbiB5b3UgZXZlbiBoYXZlCisJICogbW9yZSB0aGFuIG9uZSBpODEwIGluIGEgbWFjaGluZT8gIEJlc2lkZXMsIGNsb2NraW5nIGlzIGdsb2JhbCwgc28gdW5sZXNzCisJICogc29tZW9uZSBhY3R1YWxseSB0aGlua3MgbW9yZSB0aGFuIG9uZSBpODEwIGluIGEgbWFjaGluZSBpcyBwb3NzaWJsZSBhbmQKKwkgKiBkZWNpZGVzIHRvIHJld3JpdGUgdGhhdCBsaXR0bGUgYml0LCBzZXR0aW5nIHRoZSByYXRlIGZvciBtb3JlIHRoYW4gb25lIGNhcmQKKwkgKiBpcyBhIHdhc3RlIG9mIHRpbWUuCisJICovCisJaWYoY2FyZCAhPSBOVUxMKSB7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzWzBdID0gKHN0cnVjdCBpODEwX3N0YXRlICopCisJCQkJCWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpODEwX3N0YXRlKSwgR0ZQX0tFUk5FTCk7CisJCWlmIChzdGF0ZSA9PSBOVUxMKQorCQkJcmV0dXJuOworCQltZW1zZXQoc3RhdGUsIDAsIHNpemVvZihzdHJ1Y3QgaTgxMF9zdGF0ZSkpOworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKworCQlkbWFidWYtPndyaXRlX2NoYW5uZWwgPSBjYXJkLT5hbGxvY19wY21fY2hhbm5lbChjYXJkKTsKKwkJc3RhdGUtPnZpcnQgPSAwOworCQlzdGF0ZS0+Y2FyZCA9IGNhcmQ7CisJCXN0YXRlLT5tYWdpYyA9IEk4MTBfU1RBVEVfTUFHSUM7CisJCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7CisJCWluaXRfTVVURVgoJnN0YXRlLT5vcGVuX3NlbSk7CisJCWRtYWJ1Zi0+Zm10ID0gSTgxMF9GTVRfU1RFUkVPIHwgSTgxMF9GTVRfMTZCSVQ7CisJCWRtYWJ1Zi0+dHJpZ2dlciA9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlpODEwX3NldF9zcGRpZl9vdXRwdXQoc3RhdGUsIC0xLCAwKTsKKwkJaTgxMF9zZXRfZGFjX2NoYW5uZWxzKHN0YXRlLCAyKTsKKwkJaTgxMF9zZXRfZGFjX3JhdGUoc3RhdGUsIDQ4MDAwKTsKKwkJaWYocHJvZ19kbWFidWYoc3RhdGUsIDApICE9IDApIHsKKwkJCWdvdG8gY29uZmlnX291dF9ub2RtYWJ1ZjsKKwkJfQorCQlpZihkbWFidWYtPmRtYXNpemUgPCAxNjM4NCkgeworCQkJZ290byBjb25maWdfb3V0OworCQl9CisJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPmRtYXNpemU7CisJCUNJVl9UT19MVkkoY2FyZCwgZG1hYnVmLT53cml0ZV9jaGFubmVsLT5wb3J0LCAtMSk7CisJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkJc3RhcnRfZGFjKHN0YXRlKTsKKwkJb2Zmc2V0ID0gaTgxMF9nZXRfZG1hX2FkZHIoc3RhdGUsIDApOworCQltZGVsYXkoNTApOworCQluZXdfb2Zmc2V0ID0gaTgxMF9nZXRfZG1hX2FkZHIoc3RhdGUsIDApOworCQlzdG9wX2RhYyhzdGF0ZSk7CisJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwkJaSA9IG5ld19vZmZzZXQgLSBvZmZzZXQ7CisjaWZkZWYgREVCVUdfSU5URVJSVVBUUworCQlwcmludGsoImk4MTBfYXVkaW86ICVkIGJ5dGVzIGluIDUwIG1pbGxpc2Vjb25kc1xuIiwgaSk7CisjZW5kaWYKKwkJaWYoaSA9PSAwKQorCQkJZ290byBjb25maWdfb3V0OworCQlpID0gaSAvIDQgKiAyMDsKKwkJaWYgKGkgPiA0ODUwMCB8fCBpIDwgNDc1MDApIHsKKwkJCWNsb2NraW5nID0gY2xvY2tpbmcgKiBjbG9ja2luZyAvIGk7CisJCQlwcmludGsoImk4MTBfYXVkaW86IHNldHRpbmcgY2xvY2tpbmcgdG8gJWRcbiIsIGNsb2NraW5nKTsKKwkJfQorY29uZmlnX291dDoKKwkJZGVhbGxvY19kbWFidWYoc3RhdGUpOworY29uZmlnX291dF9ub2RtYWJ1ZjoKKwkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsc3RhdGUtPmRtYWJ1Zi53cml0ZV9jaGFubmVsLT5udW0pOworCQlrZnJlZShzdGF0ZSk7CisJCWNhcmQtPnN0YXRlc1swXSA9IE5VTEw7CisJfQorfQorCisvKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyIG5vdywgdGhleSBhcmUgZGVmZXJlZCAKKyAgIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSBvcGVuL3JlYWQvd3JpdGUvaW9jdGwvbW1hcCkgKi8KKyAgIAorc3RhdGljIGludCBfX2RldmluaXQgaTgxMF9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaV9pZCkKK3sKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIEk4MTBfRE1BX01BU0spKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTgxMF9hdWRpbzogYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQiCisJCSAgICAgICAiIDMyYml0IFBDSSBidXNtYXN0ZXIgRE1BXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCQorCWlmICgoY2FyZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpODEwX2NhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGNhcmQsIDAsIHNpemVvZigqY2FyZCkpOworCisJY2FyZC0+aW5pdGlhbGl6aW5nID0gMTsKKwljYXJkLT5wY2lfZGV2ID0gcGNpX2RldjsKKwljYXJkLT5wY2lfaWQgPSBwY2lfaWQtPmRldmljZTsKKwljYXJkLT5hYzk3YmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGNpX2RldiwgMCk7CisJY2FyZC0+aW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwY2lfZGV2LCAxKTsKKworCWlmICghKGNhcmQtPmFjOTdiYXNlKSB8fCAhKGNhcmQtPmlvYmFzZSkpIHsKKwkJY2FyZC0+YWM5N2Jhc2UgPSAwOworCQljYXJkLT5pb2Jhc2UgPSAwOworCX0KKworCS8qIGlmIGNoaXBzZXQgY291bGQgaGF2ZSBtbWlvIGNhcGFiaWxpdHksIGNoZWNrIGl0ICovIAorCWlmIChjYXJkX2NhcFtwY2lfaWQtPmRyaXZlcl9kYXRhXS5mbGFncyAmIENBUF9NTUlPKSB7CisJCWNhcmQtPmFjOTdiYXNlX21taW9fcGh5cyA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGNpX2RldiwgMik7CisJCWNhcmQtPmlvYmFzZV9tbWlvX3BoeXMgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBjaV9kZXYsIDMpOworCisJCWlmICgoY2FyZC0+YWM5N2Jhc2VfbW1pb19waHlzKSAmJiAoY2FyZC0+aW9iYXNlX21taW9fcGh5cykpIHsKKwkJCWNhcmQtPnVzZV9tbWlvID0gMTsKKwkJfQorCQllbHNlIHsKKwkJCWNhcmQtPmFjOTdiYXNlX21taW9fcGh5cyA9IDA7CisJCQljYXJkLT5pb2Jhc2VfbW1pb19waHlzID0gMDsKKwkJfQorCX0KKworCWlmICghKGNhcmQtPnVzZV9tbWlvKSAmJiAoIShjYXJkLT5pb2Jhc2UpIHx8ICEoY2FyZC0+YWM5N2Jhc2UpKSkgeworCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IE5vIEkvTyByZXNvdXJjZXMgYXZhaWxhYmxlLlxuIik7CisJCWdvdG8gb3V0X21lbTsKKwl9CisKKwljYXJkLT5pcnEgPSBwY2lfZGV2LT5pcnE7CisJY2FyZC0+bmV4dCA9IGRldnM7CisJY2FyZC0+bWFnaWMgPSBJODEwX0NBUkRfTUFHSUM7CisjaWZkZWYgQ09ORklHX1BNCisJY2FyZC0+cG1fc3VzcGVuZGVkPTA7CisjZW5kaWYKKwlzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CisJc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmFjOTdfbG9jayk7CisJZGV2cyA9IGNhcmQ7CisKKwlwY2lfc2V0X21hc3RlcihwY2lfZGV2KTsKKworCXByaW50ayhLRVJOX0lORk8gImk4MTA6ICVzIGZvdW5kIGF0IElPIDB4JTA0bHggYW5kIDB4JTA0bHgsICIKKwkgICAgICAgIk1FTSAweCUwNGx4IGFuZCAweCUwNGx4LCBJUlEgJWRcbiIsCisJICAgICAgIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0sIAorCSAgICAgICBjYXJkLT5pb2Jhc2UsIGNhcmQtPmFjOTdiYXNlLCAKKwkgICAgICAgY2FyZC0+YWM5N2Jhc2VfbW1pb19waHlzLCBjYXJkLT5pb2Jhc2VfbW1pb19waHlzLAorCSAgICAgICBjYXJkLT5pcnEpOworCisJY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBpODEwX2FsbG9jX3BjbV9jaGFubmVsOworCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IGk4MTBfYWxsb2NfcmVjX3BjbV9jaGFubmVsOworCWNhcmQtPmFsbG9jX3JlY19taWNfY2hhbm5lbCA9IGk4MTBfYWxsb2NfcmVjX21pY19jaGFubmVsOworCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBpODEwX2ZyZWVfcGNtX2NoYW5uZWw7CisKKwlpZiAoKGNhcmQtPmNoYW5uZWwgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LAorCSAgICBzaXplb2Yoc3RydWN0IGk4MTBfY2hhbm5lbCkqTlJfSFdfQ0gsICZjYXJkLT5jaGFuZG1hKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgImk4MTA6IGNhbm5vdCBhbGxvY2F0ZSBjaGFubmVsIERNQSBtZW1vcnlcbiIpOworCQlnb3RvIG91dF9tZW07CisJfQorCisJeyAvKiBXZSBtYXkgZGlzcG9zZSBvZiB0aGlzIGFsdG9nZXRoZXIgc29tZSB0aW1lIHNvb24sIHNvLi4uICovCisJCXN0cnVjdCBpODEwX2NoYW5uZWwgKmNwID0gY2FyZC0+Y2hhbm5lbDsKKworCQljcFswXS5vZmZzZXQgPSAwOworCQljcFswXS5wb3J0ID0gMHgwMDsKKwkJY3BbMF0ubnVtID0gMDsKKwkJY3BbMV0ub2Zmc2V0ID0gMDsKKwkJY3BbMV0ucG9ydCA9IDB4MTA7CisJCWNwWzFdLm51bSA9IDE7CisJCWNwWzJdLm9mZnNldCA9IDA7CisJCWNwWzJdLnBvcnQgPSAweDIwOworCQljcFsyXS5udW0gPSAyOworCX0KKworCS8qIGNsYWltIG91ciBpb3NwYWNlIGFuZCBpcnEgKi8KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGNhcmQtPmlvYmFzZSwgNjQsIGNhcmRfbmFtZXNbcGNpX2lkLT5kcml2ZXJfZGF0YV0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiaTgxMF9hdWRpbzogdW5hYmxlIHRvIGFsbG9jYXRlIHJlZ2lvbiAlbHhcbiIsIGNhcmQtPmlvYmFzZSk7CisJCWdvdG8gb3V0X3JlZ2lvbjE7CisJfQorCWlmICghcmVxdWVzdF9yZWdpb24oY2FyZC0+YWM5N2Jhc2UsIDI1NiwgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJpODEwX2F1ZGlvOiB1bmFibGUgdG8gYWxsb2NhdGUgcmVnaW9uICVseFxuIiwgY2FyZC0+YWM5N2Jhc2UpOworCQlnb3RvIG91dF9yZWdpb24yOworCX0KKworCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZpODEwX2ludGVycnVwdCwgU0FfU0hJUlEsCisJCQljYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdLCBjYXJkKSkgeworCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IHVuYWJsZSB0byBhbGxvY2F0ZSBpcnEgJWRcbiIsIGNhcmQtPmlycSk7CisJCWdvdG8gb3V0X3BpbzsKKwl9CisKKwlpZiAoY2FyZC0+dXNlX21taW8pIHsKKwkJaWYgKHJlcXVlc3RfbWVtX3JlZ2lvbihjYXJkLT5hYzk3YmFzZV9tbWlvX3BoeXMsIDUxMiwgImljaF9hdWRpbyBNTUJBUiIpKSB7CisJCQlpZiAoKGNhcmQtPmFjOTdiYXNlX21taW8gPSBpb3JlbWFwKGNhcmQtPmFjOTdiYXNlX21taW9fcGh5cywgNTEyKSkpIHsgLypARklYTUUgY2FuIGlvcmVtYXAgZmFpbD8gZG9uJ3Qga25vdyAoanNhdykgKi8KKwkJCQlpZiAocmVxdWVzdF9tZW1fcmVnaW9uKGNhcmQtPmlvYmFzZV9tbWlvX3BoeXMsIDI1NiwgImljaF9hdWRpbyBNQkJBUiIpKSB7CisJCQkJCWlmICgoY2FyZC0+aW9iYXNlX21taW8gPSBpb3JlbWFwKGNhcmQtPmlvYmFzZV9tbWlvX3BoeXMsIDI1NikpKSB7CisJCQkJCQlwcmludGsoS0VSTl9JTkZPICJpODEwOiAlcyBtbWlvIGF0IDB4JTA0bHggYW5kIDB4JTA0bHhcbiIsCisJCQkJCQkgICAgICAgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgCisJCQkJCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIGNhcmQtPmFjOTdiYXNlX21taW8sIAorCQkJCQkJICAgICAgICh1bnNpZ25lZCBsb25nKSBjYXJkLT5pb2Jhc2VfbW1pbyk7IAorCQkJCQl9CisJCQkJCWVsc2UgeworCQkJCQkJaW91bm1hcChjYXJkLT5hYzk3YmFzZV9tbWlvKTsKKwkJCQkJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5hYzk3YmFzZV9tbWlvX3BoeXMsIDUxMik7CisJCQkJCQlyZWxlYXNlX21lbV9yZWdpb24oY2FyZC0+aW9iYXNlX21taW9fcGh5cywgNTEyKTsKKwkJCQkJCWNhcmQtPnVzZV9tbWlvID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIHsKKwkJCQkJaW91bm1hcChjYXJkLT5hYzk3YmFzZV9tbWlvKTsKKwkJCQkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmFjOTdiYXNlX21taW9fcGh5cywgNTEyKTsKKwkJCQkJY2FyZC0+dXNlX21taW8gPSAwOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCWNhcmQtPnVzZV9tbWlvID0gMDsKKwkJfQorCX0KKworCS8qIGluaXRpYWxpemUgQUM5NyBjb2RlYyBhbmQgcmVnaXN0ZXIgL2Rldi9taXhlciAqLworCWlmIChpODEwX2FjOTdfaW5pdChjYXJkKSA8PSAwKSB7CisJCWZyZWVfaXJxKGNhcmQtPmlycSwgY2FyZCk7CisJCWdvdG8gb3V0X2lvc3BhY2U7CisJfQorCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBjYXJkKTsKKworCWlmKGNsb2NraW5nID09IDApIHsKKwkJY2xvY2tpbmcgPSA0ODAwMDsKKwkJaTgxMF9jb25maWd1cmVfY2xvY2tpbmcoKTsKKwl9CisKKwkvKiByZWdpc3RlciAvZGV2L2RzcCAqLworCWlmICgoY2FyZC0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZpODEwX2F1ZGlvX2ZvcHMsIC0xKSkgPCAwKSB7CisJCWludCBpOworCQlwcmludGsoS0VSTl9FUlIgImk4MTBfYXVkaW86IGNvdWxkbid0IHJlZ2lzdGVyIERTUCBkZXZpY2UhXG4iKTsKKwkJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKwkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykKKwkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCkgeworCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIpOworCQkJYWM5N19yZWxlYXNlX2NvZGVjKGNhcmQtPmFjOTdfY29kZWNbaV0pOworCQl9CisJCWdvdG8gb3V0X2lvc3BhY2U7CisJfQorCisgCWNhcmQtPmluaXRpYWxpemluZyA9IDA7CisJcmV0dXJuIDA7CisKK291dF9pb3NwYWNlOgorCWlmIChjYXJkLT51c2VfbW1pbykgeworCQlpb3VubWFwKGNhcmQtPmFjOTdiYXNlX21taW8pOworCQlpb3VubWFwKGNhcmQtPmlvYmFzZV9tbWlvKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmFjOTdiYXNlX21taW9fcGh5cywgNTEyKTsKKwkJcmVsZWFzZV9tZW1fcmVnaW9uKGNhcmQtPmlvYmFzZV9tbWlvX3BoeXMsIDI1Nik7CisJfQorb3V0X3BpbzoJCisJcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCA2NCk7CitvdXRfcmVnaW9uMjoKKwlyZWxlYXNlX3JlZ2lvbihjYXJkLT5hYzk3YmFzZSwgMjU2KTsKK291dF9yZWdpb24xOgorCXBjaV9mcmVlX2NvbnNpc3RlbnQocGNpX2Rldiwgc2l6ZW9mKHN0cnVjdCBpODEwX2NoYW5uZWwpKk5SX0hXX0NILAorCSAgICBjYXJkLT5jaGFubmVsLCBjYXJkLT5jaGFuZG1hKTsKK291dF9tZW06CisJa2ZyZWUoY2FyZCk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBpODEwX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCS8qIGZyZWUgaGFyZHdhcmUgcmVzb3VyY2VzICovCisJZnJlZV9pcnEoY2FyZC0+aXJxLCBkZXZzKTsKKwlyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIDY0KTsKKwlyZWxlYXNlX3JlZ2lvbihjYXJkLT5hYzk3YmFzZSwgMjU2KTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KHBjaV9kZXYsIHNpemVvZihzdHJ1Y3QgaTgxMF9jaGFubmVsKSpOUl9IV19DSCwKKwkJCSAgICBjYXJkLT5jaGFubmVsLCBjYXJkLT5jaGFuZG1hKTsKKwlpZiAoY2FyZC0+dXNlX21taW8pIHsKKwkJaW91bm1hcChjYXJkLT5hYzk3YmFzZV9tbWlvKTsKKwkJaW91bm1hcChjYXJkLT5pb2Jhc2VfbW1pbyk7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5hYzk3YmFzZV9tbWlvX3BoeXMsIDUxMik7CisJCXJlbGVhc2VfbWVtX3JlZ2lvbihjYXJkLT5pb2Jhc2VfbW1pb19waHlzLCAyNTYpOworCX0KKworCS8qIHVucmVnaXN0ZXIgYXVkaW8gZGV2aWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCisJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKKwkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2ldKTsKKwkJCWNhcmQtPmFjOTdfY29kZWNbaV0gPSBOVUxMOworCQl9CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKKwlrZnJlZShjYXJkKTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCBpODEwX3BtX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKmRldiwgcG1fbWVzc2FnZV90IHBtX3N0YXRlKQoreworICAgICAgICBzdHJ1Y3QgaTgxMF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisgICAgICAgIHN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKwlpbnQgaSxudW1fYWM5NzsKKyNpZmRlZiBERUJVRworCXByaW50aygiaTgxMF9hdWRpbzogaTgxMF9wbV9zdXNwZW5kIGNhbGxlZFxuIik7CisjZW5kaWYKKwlpZighY2FyZCkgcmV0dXJuIDA7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwljYXJkLT5wbV9zdXNwZW5kZWQ9MTsKKwlmb3IoaT0wO2k8TlJfSFdfQ0g7aSsrKSB7CisJCXN0YXRlID0gY2FyZC0+c3RhdGVzW2ldOworCQlpZighc3RhdGUpIGNvbnRpbnVlOworCQkvKiB0aGlzIGhhcHBlbnMgb25seSBpZiB0aGVyZSBhcmUgb3BlbiBmaWxlcyAqLworCQlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwkJaWYoZG1hYnVmLT5lbmFibGUgJiBEQUNfUlVOTklORyB8fAorCQkgICAoZG1hYnVmLT5jb3VudCAmJiAoZG1hYnVmLT50cmlnZ2VyICYgUENNX0VOQUJMRV9PVVRQVVQpKSkgeworCQkJc3RhdGUtPnBtX3NhdmVkX2RhY19yYXRlPWRtYWJ1Zi0+cmF0ZTsKKwkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJfSBlbHNlIHsKKwkJCXN0YXRlLT5wbV9zYXZlZF9kYWNfcmF0ZT0wOworCQl9CisJCWlmKGRtYWJ1Zi0+ZW5hYmxlICYgQURDX1JVTk5JTkcpIHsKKwkJCXN0YXRlLT5wbV9zYXZlZF9hZGNfcmF0ZT1kbWFidWYtPnJhdGU7CQorCQkJc3RvcF9hZGMoc3RhdGUpOworCQl9IGVsc2UgeworCQkJc3RhdGUtPnBtX3NhdmVkX2FkY19yYXRlPTA7CisJCX0KKwkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKKwkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCS8qIHNhdmUgbWl4ZXIgc2V0dGluZ3MgKi8KKwlmb3IgKG51bV9hYzk3ID0gMDsgbnVtX2FjOTcgPCBOUl9BQzk3OyBudW1fYWM5NysrKSB7CisJCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IGNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddOworCQlpZighY29kZWMpIGNvbnRpbnVlOworCQlmb3IoaT0wO2k8IFNPVU5EX01JWEVSX05SREVWSUNFUyA7aSsrKSB7CisJCQlpZigoc3VwcG9ydGVkX21peGVyKGNvZGVjLGkpKSAmJgorCQkJICAgKGNvZGVjLT5yZWFkX21peGVyKSkgeworCQkJCWNhcmQtPnBtX3NhdmVkX21peGVyX3NldHRpbmdzW2ldW251bV9hYzk3XT0KKwkJCQkJY29kZWMtPnJlYWRfbWl4ZXIoY29kZWMsaSk7CisJCQl9CisJCX0KKwl9CisJcGNpX3NhdmVfc3RhdGUoZGV2KTsgLyogWFhYIGRvIHdlIG5lZWQgdGhpcz8gKi8KKwlwY2lfZGlzYWJsZV9kZXZpY2UoZGV2KTsgLyogZGlzYWJsZSBidXNtYXN0ZXJpbmcgKi8KKwlwY2lfc2V0X3Bvd2VyX3N0YXRlKGRldiwzKTsgLyogWnp6LiAqLworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBpODEwX3BtX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBudW1fYWM5NyxpPTA7CisJc3RydWN0IGk4MTBfY2FyZCAqY2FyZD1wY2lfZ2V0X2RydmRhdGEoZGV2KTsKKwlwY2lfZW5hYmxlX2RldmljZShkZXYpOworCXBjaV9yZXN0b3JlX3N0YXRlIChkZXYpOworCisJLyogb2JzZXJ2YXRpb24gb2YgYSB0b3NoaWJhIHBvcnRlZ2UgMzQ0MGN0IHN1Z2dlc3RzIHRoYXQgdGhlIAorCSAgIGhhcmR3YXJlIGhhcyB0byBiZSBtb3JlIG9yIGxlc3MgY29tcGxldGVseSByZWluaXRpYWxpemVkIGZyb20KKwkgICBzY3JhdGNoIGFmdGVyIGFuIGFwbSBzdXNwZW5kLiAgV29ya3MgRm9yIE1lLiAgIC1kYW4gKi8KKworCWk4MTBfYWM5N19wb3dlcl91cF9idXMoY2FyZCk7CisKKwlmb3IgKG51bV9hYzk3ID0gMDsgbnVtX2FjOTcgPCBOUl9BQzk3OyBudW1fYWM5NysrKSB7CisJCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IGNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddOworCQkvKiBjaGVjayB0aGV5IGhhdmVuJ3Qgc3RvbGVuIHRoZSBoYXJkd2FyZSB3aGlsZSB3ZSB3ZXJlCisJCSAgIGF3YXkgKi8KKwkJaWYoIWNvZGVjIHx8ICFpODEwX2FjOTdfZXhpc3RzKGNhcmQsbnVtX2FjOTcpKSB7CisJCQlpZihudW1fYWM5NykgY29udGludWU7CisJCQllbHNlIEJVRygpOworCQl9CisJCWlmKCFpODEwX2FjOTdfcHJvYmVfYW5kX3Bvd2VydXAoY2FyZCxjb2RlYykpIEJVRygpOworCQkKKwkJaWYoKGNhcmQtPmFjOTdfZmVhdHVyZXMmMHgwMDAxKSkgeworCQkJLyogYXQgcHJvYmUgdGltZSB3ZSBmb3VuZCB3ZSBjb3VsZCBkbyB2YXJpYWJsZQorCQkJICAgcmF0ZXMsIGJ1dCBBUE0gc3VzcGVuZCBoYXMgbWFkZSBpdCBmb3JnZXQKKwkJCSAgIGl0cyBtYWdpY2FsIHBvd2VycyAqLworCQkJaWYoIWk4MTBfYWM5N19lbmFibGVfdmFyaWFibGVfcmF0ZShjb2RlYykpIEJVRygpOworCQl9CisJCS8qIHdlIGxvc3Qgb3VyIG1peGVyIHNldHRpbmdzLCBzbyByZXN0b3JlIHRoZW0gKi8KKwkJZm9yKGk9MDtpPCBTT1VORF9NSVhFUl9OUkRFVklDRVMgO2krKykgeworCQkJaWYoc3VwcG9ydGVkX21peGVyKGNvZGVjLGkpKXsKKwkJCQlpbnQgdmFsPWNhcmQtPgorCQkJCQlwbV9zYXZlZF9taXhlcl9zZXR0aW5nc1tpXVtudW1fYWM5N107CisJCQkJY29kZWMtPm1peGVyX3N0YXRlW2ldPXZhbDsKKwkJCQljb2RlYy0+d3JpdGVfbWl4ZXIoY29kZWMsaSwKKwkJCQkJCSAgICh2YWwgICYgMHhmZikgLAorCQkJCQkJICAgKCh2YWwgPj4gOCkgICYgMHhmZikgKTsKKwkJCX0KKwkJfQorCX0KKworCS8qIHdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgc2FtcGxlIHJhdGUgZnJvbSB3aGF0ZXZlciBpdCB3YXMgKi8KKwlmb3IoaT0wO2k8TlJfSFdfQ0g7aSsrKSB7CisJCXN0cnVjdCBpODEwX3N0YXRlICogc3RhdGU9Y2FyZC0+c3RhdGVzW2ldOworCQlpZihzdGF0ZSkgeworCQkJaWYoc3RhdGUtPnBtX3NhdmVkX2FkY19yYXRlKQorCQkJCWk4MTBfc2V0X2FkY19yYXRlKHN0YXRlLHN0YXRlLT5wbV9zYXZlZF9hZGNfcmF0ZSk7CisJCQlpZihzdGF0ZS0+cG1fc2F2ZWRfZGFjX3JhdGUpCisJCQkJaTgxMF9zZXRfZGFjX3JhdGUoc3RhdGUsc3RhdGUtPnBtX3NhdmVkX2RhY19yYXRlKTsKKwkJfQorCX0KKworCQorICAgICAgICBjYXJkLT5wbV9zdXNwZW5kZWQgPSAwOworCisJLyogYW55IHByb2Nlc3NlcyB0aGF0IHdlcmUgcmVhZGluZy93cml0aW5nIGR1cmluZyB0aGUgc3VzcGVuZAorCSAgIHByb2JhYmx5IGVuZGVkIHVwIGhlcmUgKi8KKwlmb3IoaT0wO2k8TlJfSFdfQ0g7aSsrKSB7CisJCXN0cnVjdCBpODEwX3N0YXRlICpzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXTsKKwkJaWYoc3RhdGUpIHdha2VfdXAoJnN0YXRlLT5kbWFidWYud2FpdCk7CisgICAgICAgIH0KKworCXJldHVybiAwOworfQkKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8KKworTU9EVUxFX0FVVEhPUigiVGhlIExpbnV4IGtlcm5lbCB0ZWFtIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkludGVsIDgxMCBhdWRpbyBzdXBwb3J0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cittb2R1bGVfcGFyYW0oZnRzb2RlbGwsIGludCwgMDQ0NCk7Cittb2R1bGVfcGFyYW0oY2xvY2tpbmcsIHVpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKHN0cmljdF9jbG9ja2luZywgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShzcGRpZl9sb2NrZWQsIGludCwgMDQ0NCk7CisKKyNkZWZpbmUgSTgxMF9NT0RVTEVfTkFNRSAiaTgxMF9hdWRpbyIKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGk4MTBfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSBJODEwX01PRFVMRV9OQU1FLAorCS5pZF90YWJsZQk9IGk4MTBfcGNpX3RibCwKKwkucHJvYmUJCT0gaTgxMF9wcm9iZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGk4MTBfcmVtb3ZlKSwKKyNpZmRlZiBDT05GSUdfUE0KKwkuc3VzcGVuZAk9IGk4MTBfcG1fc3VzcGVuZCwKKwkucmVzdW1lCQk9IGk4MTBfcG1fcmVzdW1lLAorI2VuZGlmIC8qIENPTkZJR19QTSAqLworfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBpODEwX2luaXRfbW9kdWxlICh2b2lkKQoreworCWludCByZXR2YWw7CisKKwlwcmludGsoS0VSTl9JTkZPICJJbnRlbCA4MTAgKyBBQzk3IEF1ZGlvLCB2ZXJzaW9uICIKKwkgICAgICAgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIik7CisKKwlyZXR2YWwgPSBwY2lfcmVnaXN0ZXJfZHJpdmVyKCZpODEwX3BjaV9kcml2ZXIpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlpZihmdHNvZGVsbCAhPSAwKSB7CisJCXByaW50aygiaTgxMF9hdWRpbzogZnRzb2RlbGwgaXMgbm93IGEgZGVwcmVjYXRlZCBvcHRpb24uXG4iKTsKKwl9CisJaWYoc3BkaWZfbG9ja2VkID4gMCApIHsKKwkJaWYoc3BkaWZfbG9ja2VkID09IDMyMDAwIHx8IHNwZGlmX2xvY2tlZCA9PSA0NDEwMCB8fCBzcGRpZl9sb2NrZWQgPT0gNDgwMDApIHsKKwkJCXByaW50aygiaTgxMF9hdWRpbzogRW5hYmxpbmcgUy9QRElGIGF0IHNhbXBsZSByYXRlICVkSHouXG4iLCBzcGRpZl9sb2NrZWQpOworCQl9IGVsc2UgeworCQkJcHJpbnRrKCJpODEwX2F1ZGlvOiBTL1BESUYgY2FuIG9ubHkgYmUgbG9ja2VkIHRvIDMyMDAwLCA0NDEwMCwgb3IgNDgwMDBIei5cbiIpOworCQkJc3BkaWZfbG9ja2VkID0gMDsKKwkJfQorCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGk4MTBfY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpODEwX3BjaV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpODEwX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KGk4MTBfY2xlYW51cF9tb2R1bGUpOworCisvKgorTG9jYWwgVmFyaWFibGVzOgorYy1iYXNpYy1vZmZzZXQ6IDgKK0VuZDoKKyovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvaWNzMjEwMS5jIGIvc291bmQvb3NzL2ljczIxMDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWYzYmU4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2ljczIxMDEuYwpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIHNvdW5kL2ljczIxMDEuYworICoKKyAqIERyaXZlciBmb3IgdGhlIElDUzIxMDEgbWl4ZXIgb2YgR1VTIHYzLjcuCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBUaG9tYXMgU2FpbGVyICAgOiBpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKiBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDogYWRkZWQgX19pbml0IHRvIGljczIxMDFfbWl4ZXJfaW5pdCgpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgPGxpbnV4L3VsdHJhc291bmQuaD4KKworI2luY2x1ZGUgImd1cy5oIgorI2luY2x1ZGUgImd1c19ody5oIgorCisjZGVmaW5lIE1JWF9ERVZTCShTT1VORF9NQVNLX01JQ3xTT1VORF9NQVNLX0xJTkV8IFwKKwkJCSBTT1VORF9NQVNLX1NZTlRIfCBcCisgIAkJCSBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19WT0xVTUUpCisKK2V4dGVybiBpbnQgICAgICpndXNfb3NwOworZXh0ZXJuIGludCAgICAgIGd1c19iYXNlOworZXh0ZXJuIHNwaW5sb2NrX3QgZ3VzX2xvY2s7CitzdGF0aWMgaW50ICAgICAgdm9sdW1lc1tJQ1NfTUlYREVWU107CitzdGF0aWMgaW50ICAgICAgbGVmdF9maXhbSUNTX01JWERFVlNdID0KK3sxLCAxLCAxLCAyLCAxLCAyfTsKK3N0YXRpYyBpbnQgICAgICByaWdodF9maXhbSUNTX01JWERFVlNdID0KK3syLCAyLCAyLCAxLCAyLCAxfTsKKworc3RhdGljIGludCBzY2FsZV92b2woaW50IHZvbCkKK3sKKwkvKgorCSAqICBFeHBlcmltZW50YWwgdm9sdW1lIHNjYWxpbmcgYnkgUmlzdG8gS2Fua2t1bmVuLgorCSAqICBUaGlzIHNob3VsZCBnaXZlIHNtb290aGVyIHZvbHVtZSByZXNwb25zZSB0aGFuIGp1c3QKKwkgKiAgYSBwbGFpbiBtdWx0aXBsaWNhdGlvbi4KKwkgKi8KKwkgCisJaW50IGU7CisKKwlpZiAodm9sIDwgMCkKKwkJdm9sID0gMDsKKwlpZiAodm9sID4gMTAwKQorCQl2b2wgPSAxMDA7CisJdm9sID0gKDMxICogdm9sICsgNTApIC8gMTAwOworCWUgPSAwOworCWlmICh2b2wpCisJeworCQl3aGlsZSAodm9sIDwgMTYpCisJCXsKKwkJCXZvbCA8PD0gMTsKKwkJCWUtLTsKKwkJfQorCQl2b2wgLT0gMTY7CisJCWUgKz0gNzsKKwl9CisJcmV0dXJuICgoZSA8PCA0KSArIHZvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX21peChpbnQgZGV2LCBpbnQgY2huLCBpbnQgdm9sKQoreworCWludCAqc2VsZWN0b3I7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY3RybF9hZGRyID0gZGV2IDw8IDM7CisJaW50IGF0dG5fYWRkciA9IGRldiA8PCAzOworCisJdm9sID0gc2NhbGVfdm9sKHZvbCk7CisKKwlpZiAoY2huID09IENITl9MRUZUKQorCXsKKwkJc2VsZWN0b3IgPSBsZWZ0X2ZpeDsKKwkJY3RybF9hZGRyIHw9IDB4MDA7CisJCWF0dG5fYWRkciB8PSAweDAyOworCX0KKwllbHNlCisJeworCQlzZWxlY3RvciA9IHJpZ2h0X2ZpeDsKKwkJY3RybF9hZGRyIHw9IDB4MDE7CisJCWF0dG5fYWRkciB8PSAweDAzOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZndXNfbG9jaywgZmxhZ3MpOworCW91dGIoKGN0cmxfYWRkciksIHVfTWl4U2VsZWN0KTsKKwlvdXRiKChzZWxlY3RvcltkZXZdKSwgdV9NaXhEYXRhKTsKKwlvdXRiKChhdHRuX2FkZHIpLCB1X01peFNlbGVjdCk7CisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIHZvbCksIHVfTWl4RGF0YSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ3VzX2xvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHNldF92b2x1bWVzKGludCBkZXYsIGludCB2b2wpCit7CisJaW50IGxlZnQgPSB2b2wgJiAweDAwZmY7CisJaW50IHJpZ2h0ID0gKHZvbCA+PiA4KSAmIDB4MDBmZjsKKworCWlmIChsZWZ0IDwgMCkKKwkJbGVmdCA9IDA7CisJaWYgKGxlZnQgPiAxMDApCisJCWxlZnQgPSAxMDA7CisJaWYgKHJpZ2h0IDwgMCkKKwkJcmlnaHQgPSAwOworCWlmIChyaWdodCA+IDEwMCkKKwkJcmlnaHQgPSAxMDA7CisKKwl3cml0ZV9taXgoZGV2LCBDSE5fTEVGVCwgbGVmdCk7CisJd3JpdGVfbWl4KGRldiwgQ0hOX1JJR0hULCByaWdodCk7CisKKwl2b2wgPSBsZWZ0ICsgKHJpZ2h0IDw8IDgpOworCXZvbHVtZXNbZGV2XSA9IHZvbDsKKwlyZXR1cm4gdm9sOworfQorCitzdGF0aWMgaW50IGljczIxMDFfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgdmFsOworCQorCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpID09ICdNJykgeworCQlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkgeworCQkJCisJCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzd2l0Y2ggKGNtZCAmIDB4ZmYpIHsKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCXJldHVybiBndXNfZGVmYXVsdF9taXhlcl9pb2N0bChkZXYsIGNtZCwgYXJnKTsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQkJdmFsID0gc2V0X3ZvbHVtZXMoREVWX01JQywgdmFsKTsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgU09VTkRfTUlYRVJfQ0Q6CisJCQkJdmFsID0gc2V0X3ZvbHVtZXMoREVWX0NELCB2YWwpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX0xJTkU6CisJCQkJdmFsID0gc2V0X3ZvbHVtZXMoREVWX0xJTkUsIHZhbCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1lOVEg6CisJCQkJdmFsID0gc2V0X3ZvbHVtZXMoREVWX0dGMSwgdmFsKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCQkJdmFsID0gc2V0X3ZvbHVtZXMoREVWX1ZPTCwgdmFsKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoY21kICYgMHhmZikgeworCQkJCS8qCisJCQkJICogUmV0dXJuIHBhcmFtZXRlcnMKKwkJCQkgKi8KKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCXJldHVybiBndXNfZGVmYXVsdF9taXhlcl9pb2N0bChkZXYsIGNtZCwgYXJnKTsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJCXZhbCA9IE1JWF9ERVZTOyAKKwkJCQlicmVhazsKKworCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJCXZhbCA9IFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX1NZTlRIIHwgU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX01JQzsgCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJCQl2YWwgPSBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfTElORTsgCisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQkJdmFsID0gMDsgCisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQkJCXZhbCA9IHZvbHVtZXNbREVWX01JQ107CisJCQkJYnJlYWs7CisJCQkJCisJCQljYXNlIFNPVU5EX01JWEVSX0xJTkU6CisJCQkJdmFsID0gdm9sdW1lc1tERVZfTElORV07CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfQ0Q6CisJCQkJdmFsID0gdm9sdW1lc1tERVZfQ0RdOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwkJCQl2YWwgPSB2b2x1bWVzW0RFVl9WT0xdOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQkJCXZhbCA9IHZvbHVtZXNbREVWX0dGMV07IAorCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOworCQl9CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgaWNzMjEwMV9taXhlcl9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWQJPSAiSUNTMjEwMSIsCisJLm5hbWUJPSAiSUNTMjEwMSBNdWx0aW1lZGlhIE1peGVyIiwKKwkuaW9jdGwJPSBpY3MyMTAxX21peGVyX2lvY3RsCit9OworCitpbnQgX19pbml0IGljczIxMDFfbWl4ZXJfaW5pdCh2b2lkKQoreworCWludCBpOworCWludCBuOworCisJaWYgKChuID0gc291bmRfYWxsb2NfbWl4ZXJkZXYoKSkgIT0gLTEpCisJeworCQltaXhlcl9kZXZzW25dID0gJmljczIxMDFfbWl4ZXJfb3BlcmF0aW9uczsKKworCQkvKgorCQkgKiBTb21lIEdVUyB2My43IGNhcmRzIGhhZCBzb21lIGNoYW5uZWxzIGZsaXBwZWQuIERpc2FibGUKKwkJICogdGhlIGZsaXBwaW5nIGZlYXR1cmUgaWYgdGhlIG1vZGVsIGlkIGlzIG90aGVyIHRoYW4gNS4KKwkJICovCisKKwkJaWYgKGluYih1X01peFNlbGVjdCkgIT0gNSkKKwkJeworCQkJZm9yIChpID0gMDsgaSA8IElDU19NSVhERVZTOyBpKyspCisJCQkJbGVmdF9maXhbaV0gPSAxOworCQkJZm9yIChpID0gMDsgaSA8IElDU19NSVhERVZTOyBpKyspCisJCQkJcmlnaHRfZml4W2ldID0gMjsKKwkJfQorCQlzZXRfdm9sdW1lcyhERVZfR0YxLCAweDVhNWEpOworCQlzZXRfdm9sdW1lcyhERVZfQ0QsIDB4NWE1YSk7CisJCXNldF92b2x1bWVzKERFVl9NSUMsIDB4MDAwMCk7CisJCXNldF92b2x1bWVzKERFVl9MSU5FLCAweDVhNWEpOworCQlzZXRfdm9sdW1lcyhERVZfVk9MLCAweDVhNWEpOworCQlzZXRfdm9sdW1lcyhERVZfVU5VU0VELCAweDAwMDApOworCX0KKwlyZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9pdGU4MTcyLmMgYi9zb3VuZC9vc3MvaXRlODE3Mi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Zjg3OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvaXRlODE3Mi5jCkBAIC0wLDAgKzEsMjI1OSBAQAorLyoKKyAqICAgICAgaXRlODE3Mi5jICAtLSAgSVRFIElUODE3MkcgU291bmQgRHJpdmVyLgorICoKKyAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCisgKiAgICAgICAgIAlzdGV2ZWxAbXZpc3RhLmNvbSBvciBzb3VyY2VAbXZpc3RhLmNvbQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqICB1bmRlciAgdGhlIHRlcm1zIG9mICB0aGUgR05VIEdlbmVyYWwgIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUSElTICBTT0ZUV0FSRSAgSVMgUFJPVklERUQgICBgYEFTICBJUycnIEFORCAgIEFOWSAgRVhQUkVTUyBPUiBJTVBMSUVECisgKiAgV0FSUkFOVElFUywgICBJTkNMVURJTkcsIEJVVCBOT1QgIExJTUlURUQgIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiAgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOCisgKiAgTk8gIEVWRU5UICBTSEFMTCAgIFRIRSBBVVRIT1IgIEJFICAgIExJQUJMRSBGT1IgQU5ZICAgRElSRUNULCBJTkRJUkVDVCwKKyAqICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKKyAqICBOT1QgTElNSVRFRCAgIFRPLCBQUk9DVVJFTUVOVCBPRiAgU1VCU1RJVFVURSBHT09EUyAgT1IgU0VSVklDRVM7IExPU1MgT0YKKyAqICBVU0UsIERBVEEsICBPUiBQUk9GSVRTOyBPUiAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqICBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqICAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqICBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSAgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqICA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKgorICogTW9kdWxlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzOgorICoKKyAqICBTdXBwb3J0ZWQgZGV2aWNlczoKKyAqICAvZGV2L2RzcCAgICBzdGFuZGFyZCBPU1MgL2Rldi9kc3AgZGV2aWNlCisgKiAgL2Rldi9taXhlciAgc3RhbmRhcmQgT1NTIC9kZXYvbWl4ZXIgZGV2aWNlCisgKgorICogTm90ZXM6CisgKgorICogIDEuIE11Y2ggb2YgdGhlIE9TUyBidWZmZXIgYWxsb2NhdGlvbiwgaW9jdGwncywgYW5kIG1tYXAnaW5nIGFyZQorICogICAgIHRha2VuLCBzbGlnaHRseSBtb2RpZmllZCBvciBub3QgYXQgYWxsLCBmcm9tIHRoZSBFUzEzNzEgZHJpdmVyLAorICogICAgIHNvIHJlZmVyIHRvIHRoZSBjcmVkaXRzIGluIGVzMTM3MS5jIGZvciB0aG9zZS4gVGhlIHJlc3Qgb2YgdGhlCisgKiAgICAgY29kZSAocHJvYmUsIG9wZW4sIHJlYWQsIHdyaXRlLCB0aGUgSVNSLCBldGMuKSBpcyBuZXcuCisgKiAgMi4gVGhlIGZvbGxvd2luZyBzdXBwb3J0IGlzIHVudGVzdGVkOgorICogICAgICAqIE1lbW9yeSBtYXBwaW5nIHRoZSBhdWRpbyBidWZmZXJzLCBhbmQgdGhlIGlvY3RsIGNvbnRyb2xzIHRoYXQgZ28KKyAqICAgICAgICB3aXRoIGl0LgorICogICAgICAqIFMvUERJRiBvdXRwdXQuCisgKiAgICAgICogSTJTIHN1cHBvcnQuCisgKiAgMy4gVGhlIGZvbGxvd2luZyBpcyBub3Qgc3VwcG9ydGVkOgorICogICAgICAqIGxlZ2FjeSBhdWRpbyBtb2RlLgorICogIDQuIFN1cHBvcnQgZm9yIHZvbHVtZSBidXR0b24gaW50ZXJydXB0cyBpcyBpbXBsZW1lbnRlZCBidXQgZG9lc24ndAorICogICAgIHdvcmsgeWV0LgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAwMi4wOC4yMDAxICBJbml0aWFsIHJlbGVhc2UKKyAqICAgIDA2LjIyLjIwMDEgIEFkZGVkIEkyUyBzdXBwb3J0CisgKiAgICAwNy4zMC4yMDAzICBSZW1vdmVkIGluaXRpYWxpc2F0aW9uIHRvIHplcm8gZm9yIHN0YXRpYyB2YXJpYWJsZXMKKyAqCQkgICAoc3BkaWZbTlJfREVWSUNFXSwgaTJzX2ZtdFtOUl9ERVZJQ0VdLCBhbmQgZGV2aW5kZXgpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXQ4MTcyL2l0ODE3Mi5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI3VuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworI2RlZmluZSBJVDgxNzJfREVCVUcKKyN1bmRlZiBJVDgxNzJfVkVSQk9TRV9ERUJVRworI2RlZmluZSBEQkcoeCkge30KKworI2RlZmluZSBJVDgxNzJfTU9EVUxFX05BTUUgIklUODE3MiBhdWRpbyIKKyNkZWZpbmUgUEZYIElUODE3Ml9NT0RVTEVfTkFNRQorCisjaWZkZWYgSVQ4MTcyX0RFQlVHCisjZGVmaW5lIGRiZyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fREVCVUcgUEZYICI6ICIgZm9ybWF0ICJcbiIgLCAjIyBhcmcpCisjZWxzZQorI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisjZGVmaW5lIGVycihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fRVJSIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI2RlZmluZSBpbmZvKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9JTkZPIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI2RlZmluZSB3YXJuKGZvcm1hdCwgYXJnLi4uKSBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorCisKKyNkZWZpbmUgSVQ4MTcyX01PRFVMRV9OQU1FICJJVDgxNzIgYXVkaW8iCisjZGVmaW5lIFBGWCBJVDgxNzJfTU9EVUxFX05BTUUKKworI2lmZGVmIElUODE3Ml9ERUJVRworI2RlZmluZSBkYmcoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0RFQlVHIFBGWCAiOiAiIGZvcm1hdCAiXG4iICwgIyMgYXJnKQorI2Vsc2UKKyNkZWZpbmUgZGJnKGZvcm1hdCwgYXJnLi4uKSBkbyB7fSB3aGlsZSAoMCkKKyNlbmRpZgorI2RlZmluZSBlcnIoZm9ybWF0LCBhcmcuLi4pIHByaW50ayhLRVJOX0VSUiBQRlggIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgaW5mbyhmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fSU5GTyBQRlggIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKyNkZWZpbmUgd2Fybihmb3JtYXQsIGFyZy4uLikgcHJpbnRrKEtFUk5fV0FSTklORyBQRlggIjogIiBmb3JtYXQgIlxuIiAsICMjIGFyZykKKworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKKworCisvKgorICogQXVkaW8gQ29udHJvbGxlciByZWdpc3RlciBiaXQgZGVmaW5pdGlvbnMgZm9sbG93LiBTZWUKKyAqIGluY2x1ZGUvYXNtL2l0ODE3Mi9pdDgxNzIuaCBmb3IgcmVnaXN0ZXIgb2Zmc2V0cy4KKyAqLworCisvKiBQQ00gT3V0IFZvbHVtZSBSZWcgKi8KKyNkZWZpbmUgUENNT1ZfUENNT00JKDE8PDE1KQkvKiBQQ00gT3V0IE11dGUgZGVmYXVsdCAxOiBtdXRlICovCisjZGVmaW5lCVBDTU9WX1BDTVJDR19CSVQgOAkvKiBQQ00gUmlnaHQgY2hhbm5lbCBHYWluICovCisjZGVmaW5lCVBDTU9WX1BDTVJDR19NQVNLICgweDFmPDxQQ01PVl9QQ01SQ0dfQklUKQorI2RlZmluZSBQQ01PVl9QQ01MQ0dfQklUIDAJLyogUENNIExlZnQgY2hhbm5lbCBnYWluICAqLworI2RlZmluZSBQQ01PVl9QQ01MQ0dfTUFTSyAweDFmCisKKy8qIEZNIE91dCBWb2x1bWUgUmVnICovCisjZGVmaW5lIEZNT1ZfRk1PTSAgICAgICAoMTw8MTUpCS8qIEZNIE91dCBNdXRlIGRlZmF1bHQgMTogbXV0ZSAqLworI2RlZmluZQlGTU9WX0ZNUkNHX0JJVAk4CS8qIEZNIFJpZ2h0IGNoYW5uZWwgR2FpbiAqLworI2RlZmluZQlGTU9WX0ZNUkNHX01BU0sgKDB4MWY8PEZNT1ZfRk1SQ0dfQklUKQorI2RlZmluZSBGTU9WX0ZNTENHX0JJVAkwCS8qIEZNIExlZnQgY2hhbm5lbCBnYWluICAqLworI2RlZmluZSBGTU9WX0ZNTENHX01BU0sgMHgxZgorCisvKiBJMlMgT3V0IFZvbHVtZSBSZWcgKi8KKyNkZWZpbmUgSTJTVl9JMlNPTQkgKDE8PDE1KSAvKiBJMlMgT3V0IE11dGUgZGVmYXVsdCAxOiBtdXRlICovCisjZGVmaW5lCUkyU1ZfSTJTUkNHX0JJVAkgOAkgLyogSTJTIFJpZ2h0IGNoYW5uZWwgR2FpbiAqLworI2RlZmluZQlJMlNWX0kyU1JDR19NQVNLICgweDFmPDxJMlNWX0kyU1JDR19CSVQpCisjZGVmaW5lIEkyU1ZfSTJTTENHX0JJVAkgMAkgLyogSTJTIExlZnQgY2hhbm5lbCBnYWluICAqLworI2RlZmluZSBJMlNWX0kyU0xDR19NQVNLIDB4MWYKKworLyogRGlnaXRhbCBSZWNvcmRpbmcgU291cmNlIFNlbGVjdCBSZWcgKi8KKyNkZWZpbmUJRFJTU19CSVQgICAwCisjZGVmaW5lCURSU1NfTUFTSyAgMHgwNworI2RlZmluZSAgIERSU1NfQUM5N19QUklNIDAKKyNkZWZpbmUgICBEUlNTX0ZNICAgICAgICAxCisjZGVmaW5lICAgRFJTU19JMlMgICAgICAgMgorI2RlZmluZSAgIERSU1NfUENNICAgICAgIDMKKyNkZWZpbmUgICBEUlNTX0FDOTdfU0VDICA0CisKKy8qIFBsYXliYWNrL0NhcHR1cmUgQ2hhbm5lbCBDb250cm9sIFJlZ2lzdGVycyAqLworI2RlZmluZQlDQ19TTQkgICAgICAgICgxPDwxNSkJLyogU3RlcmVvLCBNb25lIDA6IG1vbm8gMTogc3RlcmVvICovCisjZGVmaW5lCUNDX0RGCSAgICAgICAgKDE8PDE0KQkvKiBEYXRhIEZvcm1hdCAwOiA4IGJpdCAxOiAxNiBiaXQgKi8KKyNkZWZpbmUgQ0NfRk1UX0JJVCAgICAgIDE0CisjZGVmaW5lIENDX0ZNVF9NQVNLICAgICAoMHgwMzw8Q0NfRk1UX0JJVCkKKyNkZWZpbmUgQ0NfQ0ZfQklUICAgICAgIDEyICAgICAgLyogQ2hhbm5lbCBmb3JtYXQgKFBsYXliYWNrIG9ubHkpICovCisjZGVmaW5lIENDX0NGX01BU0sgICAgICAoMHgwMzw8Q0NfQ0ZfQklUKQorI2RlZmluZQkgIENDX0NGXzIJMAorI2RlZmluZSAgIENDX0NGXzQJKDE8PENDX0NGX0JJVCkKKyNkZWZpbmUgICBDQ19DRl82CSgyPDxDQ19DRl9CSVQpCisjZGVmaW5lIENDX1NSX0JJVCAgICAgICA4ICAgICAgIC8qIHNhbXBsZSBSYXRlICovCisjZGVmaW5lIENDX1NSX01BU0sgICAgICAoMHgwZjw8Q0NfU1JfQklUKQorI2RlZmluZQkgIENDX1NSXzU1MDAJMAorI2RlZmluZQkgIENDX1NSXzgwMDAJKDE8PENDX1NSX0JJVCkKKyNkZWZpbmUJICBDQ19TUl85NjAwCSgyPDxDQ19TUl9CSVQpCisjZGVmaW5lCSAgQ0NfU1JfMTEwMjUJKDM8PENDX1NSX0JJVCkKKyNkZWZpbmUJICBDQ19TUl8xNjAwMAkoNDw8Q0NfU1JfQklUKQorI2RlZmluZQkgIENDX1NSXzE5MjAwCSg1PDxDQ19TUl9CSVQpCisjZGVmaW5lCSAgQ0NfU1JfMjIwNTAJKDY8PENDX1NSX0JJVCkKKyNkZWZpbmUJICBDQ19TUl8zMjAwMAkoNzw8Q0NfU1JfQklUKQorI2RlZmluZQkgIENDX1NSXzM4NDAwCSg4PDxDQ19TUl9CSVQpCisjZGVmaW5lCSAgQ0NfU1JfNDQxMDAJKDk8PENDX1NSX0JJVCkKKyNkZWZpbmUJICBDQ19TUl80ODAwMAkoMTA8PENDX1NSX0JJVCkKKyNkZWZpbmUJQ0NfQ1NQCSAgICAgICAgKDE8PDcpCS8qIENoYW5uZWwgc3RvcCAKKwkJCQkgKiAwOiBFbmQgb2YgQ3VycmVudCBidWZmZXIKKwkJCQkgKiAxOiBJbW1lZGlhdGVseSBzdG9wIHdoZW4gcmVjIHN0b3AgKi8KKyNkZWZpbmUgQ0NfQ1AJICAgICAgICAoMTw8NikJLyogQ2hhbm5lbCBwYXVzZSAwOiBub3JtYWwsIDE6IHBhdXNlICovCisjZGVmaW5lCUNDX0NBCSAgICAgICAgKDE8PDUpCS8qIENoYW5uZWwgQWN0aW9uIDA6IFN0b3AgLCAxOiBzdGFydCAqLworI2RlZmluZQlDQ19DQjJMICAgICAgICAgKDE8PDIpCS8qIEN1ci4gYnVmLiAyIHhmciBpcyBsYXN0IDA6IE5vLCAxOiBZZXMgKi8KKyNkZWZpbmUgQ0NfQ0IxTCAgICAgICAgICgxPDwxKQkvKiBDdXIuIGJ1Zi4gMSB4ZnIgaXMgbGFzdCAwOiBObywgMTogWWVzICovCisjZGVmaW5lIENDX0RFCSAgICAgICAgMQkvKiBERkMvREZJRk8gRGF0YSBFbXB0eSAxOiBlbXB0eSwgMDogbm90IGVtcHR5CisJCQkJICogKFBsYXliYWNrIG9ubHkpCisJCQkJICovCisKKy8qIENvZGVjIENvbnRyb2wgUmVnICovCisjZGVmaW5lIENPREVDQ19HTUUJKDE8PDkpCS8qIEFDOTcgR1BJTyBNb2RlIGVuYWJsZSAqLworI2RlZmluZQlDT0RFQ0NfQVRNCSgxPDw4KQkvKiBBQzk3IEFURSB0ZXN0IG1vZGUgMDogdGVzdCAxOiBub3JtYWwgKi8KKyNkZWZpbmUJQ09ERUNDX1dSCSgxPDw2KQkvKiBBQzk3IFdhcm4gcmVzZXQgMTogd2FybSByZXNldCAsIDA6IE5vcm1hbCAqLworI2RlZmluZQlDT0RFQ0NfQ1IJKDE8PDUpCS8qIEFDOTcgQ29sZCByZXNldCAxOiBDb2xkIHJlc2V0ICwgMDogTm9ybWFsICovCisKKworLyogSTJTIENvbnRyb2wgUmVnCSovCisjZGVmaW5lCUkyU01DX1NSX0JJVAkgNgkvKiBJMlMgU2FtcGxpbmcgcmF0ZSAKKwkJCQkgKiAwMDogNDhLSHosIDAxOiA0NC4xIEtIeiwgMTA6IDMyIDMyIEtIeiAqLworI2RlZmluZQlJMlNNQ19TUl9NQVNLICAgICgweDAzPDxJMlNNQ19TUl9CSVQpCisjZGVmaW5lCSAgSTJTTUNfU1JfNDgwMDAgMAorI2RlZmluZQkgIEkyU01DX1NSXzQ0MTAwICgxPDxJMlNNQ19TUl9CSVQpCisjZGVmaW5lCSAgSTJTTUNfU1JfMzIwMDAgKDI8PEkyU01DX1NSX0JJVCkKKyNkZWZpbmUJSTJTTUNfU1JTUwkgKDE8PDUpCS8qIFNhbXBsZSBSYXRlIFNvdXJjZSBTZWxlY3QgMTpTL1csIDA6IEgvVyAqLworI2RlZmluZSBJMlNNQ19JMlNGX0JJVAkgMAkvKiBJMlMgRm9ybWF0ICovCisjZGVmaW5lIEkyU01DX0kyU0ZfTUFTSyAgMHgwMworI2RlZmluZSAgIEkyU01DX0kyU0ZfREFDIDAKKyNkZWZpbmUgICBJMlNNQ19JMlNGX0FEQyAyCisjZGVmaW5lICAgSTJTTUNfSTJTRl9JMlMgMworCisKKy8qIFZvbHVtZSB1cCwgRG93biwgTXV0ZSAqLworI2RlZmluZQlWU19WTVAJKDE8PDIpCS8qIFZvbHVtZSBtdXRlIDE6IHB1c2hlZCwgMDogbm90ICovCisjZGVmaW5lCVZTX1ZEUAkoMTw8MSkJLyogVm9sdW1lIERvd24gMTogcHVzaGVkLCAwOiBub3QgKi8KKyNkZWZpbmUgVlNfVlVQCTEJLyogVm9saW1lIFVwIDE6IHB1c2hlZCwgMDogbm90ICovCisKKy8qIFNSQywgTWl4ZXIgdGVzdCBjb250cm9sL0RGQyBzdGF0dXMgcmVnICovCisjZGVmaW5lIFNSQ1NfRFBVU0MgICAgICAoMTw8NSkJLyogREZDIFBsYXliYWNrIHVuZGVycnVuIFN0YXR1cy9jbGVhciAqLworI2RlZmluZQlTUkNTX0RDT1NDCSgxPDw0KQkvKiBERkMgQ2FwdHVyZSBPdmVycnVuIFN0YXR1cy9jbGVhciAqLworI2RlZmluZSBTUkNTX1NJUwkoMTw8MykJLyogU1JDIGlucHV0IHNlbGVjdCAxOiBNaXhlciwgMDogQ29kZWMgSS9GICovCisjZGVmaW5lIFNSQ1NfQ0RJU19CSVQJMAkvKiBDb2RlYyBEYXRhIElucHV0IFNlbGVjdCAqLworI2RlZmluZSBTUkNTX0NESVNfTUFTSyAgMHgwNworI2RlZmluZSAgIFNSQ1NfQ0RJU19NSVhFUiAwCisjZGVmaW5lICAgU1JDU19DRElTX1BDTSAgIDEKKyNkZWZpbmUgICBTUkNTX0NESVNfSTJTICAgMgorI2RlZmluZSAgIFNSQ1NfQ0RJU19GTSAgICAzCisjZGVmaW5lICAgU1JDU19DRElTX0RGQyAgIDQKKworCisvKiBDb2RlYyBJbmRleCBSZWcgY29tbWFuZCBQb3J0ICovCisjZGVmaW5lIENJUkNQX0NJRF9CSVQgICAxMAorI2RlZmluZSBDSVJDUF9DSURfTUFTSyAgKDB4MDM8PENJUkNQX0NJRF9CSVQpCisjZGVmaW5lIENJUkNQX0NQUwkoMTw8OSkJLyogQ29tbWFuZCBQb3J0IFN0YXR1cyAwOiByZWFkeSwgMTogYnVzeSAqLworI2RlZmluZQlDSVJDUF9EUFZGCSgxPDw4KQkvKiBEYXRhIFBvcnQgVmFsaWQgRmxhZyAwOiBpbnZhbGlzLCAxOiB2YWxpZCAqLworI2RlZmluZSBDSVJDUF9SV0MJKDE8PDcpCS8qIFJlYWQvd3JpdGUgY29tbWFuZCAqLworI2RlZmluZSBDSVJDUF9DSUFfQklUICAgMAorI2RlZmluZSBDSVJDUF9DSUFfTUFTSyAgMHgwMDdGCS8qIENvZGVjIEluZGV4IEFkZHJlc3MgKi8KKworLyogVGVzdCBNb2RlIENvbnRyb2wvVGVzdCBncm91cCBTZWxlY3QgQ29udHJvbCAqLworCisvKiBHZW5lcmFsIENvbnRyb2wgUmVnICovCisjZGVmaW5lIEdDX1ZEQ19CSVQJNgkvKiBWb2x1bWUgRGl2aXNpb24gQ29udHJvbCAqLworI2RlZmluZSBHQ19WRENfTUFTSyAgICAgKDB4MDM8PEdDX1ZEQ19CSVQpCisjZGVmaW5lICAgR0NfVkRDX05PTkUgICAwCisjZGVmaW5lICAgR0NfVkRDX0RJVjIgICAoMTw8R0NfVkRDX0JJVCkKKyNkZWZpbmUgICBHQ19WRENfRElWNCAgICgyPDxHQ19WRENfQklUKQorI2RlZmluZQlHQ19TT0UJICAgICAgICAoMTw8MikJLyogUy9QRElGIE91dHB1dCBlbmFibGUgKi8KKyNkZWZpbmUJR0NfU1dSCSAgICAgICAgMQkvKiBTb2Z0d2FyZSB3YXJuIHJlc2V0ICovCisKKy8qIEludGVycnVwdCBtYXNrIENvbnRyb2wgUmVnICovCisjZGVmaW5lCUlNQ19WQ0lNCSgxPDw2KQkvKiBWb2x1bWUgQ05UTCBpbnRlcnJ1cHQgbWFzayAqLworI2RlZmluZQlJTUNfQ0NJTQkoMTw8MSkJLyogQ2FwdHVyZSBDaGFuLiBpdGVycnVwdCBtYXNrICovCisjZGVmaW5lCUlNQ19QQ0lNCTEJLyogUGxheWJhY2sgQ2hhbi4gaW50ZXJydXB0IG1hc2sgKi8KKworLyogSW50ZXJydXB0IHN0YXR1cy9jbGVhciByZWcgKi8KKyNkZWZpbmUJSVNDX1ZDSQkgICAgICAgICgxPDw2KQkvKiBWb2x1bWUgQ05UTCBpbnRlcnJ1cHQgMTogY2xlYXJzICovCisjZGVmaW5lCUlTQ19DQ0kJICAgICAgICAoMTw8MSkJLyogQ2FwdHVyZSBDaGFuLiBpbnRlcnJ1cHQgMTogY2xlYXJzICAqLworI2RlZmluZQlJU0NfUENJCSAgICAgICAgMQkvKiBQbGF5YmFjayBDaGFuLiBpbnRlcnJ1cHQgMTogY2xlYXJzICovCisKKy8qIG1pc2Mgc3R1ZmYgKi8KKyNkZWZpbmUgUE9MTF9DT1VOVCAgIDB4NTAwMAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogRGVmaW5lIERJR0lUQUwxIGFzIHRoZSBJMlMgY2hhbm5lbCwgc2luY2UgaXQgaXMgbm90IGxpc3RlZCBpbgorICogc291bmRjYXJkLmguCisgKi8KKyNkZWZpbmUgU09VTkRfTUlYRVJfSTJTICAgICAgICBTT1VORF9NSVhFUl9ESUdJVEFMMQorI2RlZmluZSBTT1VORF9NQVNLX0kyUyAgICAgICAgIFNPVU5EX01BU0tfRElHSVRBTDEKKyNkZWZpbmUgU09VTkRfTUlYRVJfUkVBRF9JMlMgICBNSVhFUl9SRUFEKFNPVU5EX01JWEVSX0kyUykKKyNkZWZpbmUgU09VTkRfTUlYRVJfV1JJVEVfSTJTICBNSVhFUl9XUklURShTT1VORF9NSVhFUl9JMlMpCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgaXQ4MTcyX3N0YXRlIHsKKwkvKiBsaXN0IG9mIGl0ODE3MiBkZXZpY2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBkZXZzOworCisJLyogdGhlIGNvcnJlc3BvbmRpbmcgcGNpX2RldiBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCisJLyogc291bmRjb3JlIHN0dWZmICovCisJaW50IGRldl9hdWRpbzsKKworCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXVuc2lnbmVkIGxvbmcgaW87CisJdW5zaWduZWQgaW50IGlycTsKKworCS8qIFBDSSBJRCdzICovCisJdTE2IHZlbmRvcjsKKwl1MTYgZGV2aWNlOworCXU4IHJldjsgLyogdGhlIGNoaXAgcmV2aXNpb24gKi8KKworCS8qIG9wdGlvbnMgKi8KKwlpbnQgc3BkaWZfdm9sdW1lOyAvKiBTL1BESUYgb3V0cHV0IGlzIGVuYWJsZWQgaWYgIT0gLTEgKi8KKwlpbnQgaTJzX3ZvbHVtZTsgICAvKiBjdXJyZW50IEkyUyBvdXQgdm9sdW1lLCBpbiBPU1MgZm9ybWF0ICovCisJaW50IGkyc19yZWNvcmRpbmc7LyogMSA9IHJlY29yZGluZyBmcm9tIEkyUywgMCA9IG5vdCAqLworICAgIAorI2lmZGVmIElUODE3Ml9ERUJVRworCS8qIGRlYnVnIC9wcm9jIGVudHJ5ICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwczsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjOTdfcHM7CisjZW5kaWYgLyogSVQ4MTcyX0RFQlVHICovCisKKwlzdHJ1Y3QgYWM5N19jb2RlYyBjb2RlYzsKKworCXVuc2lnbmVkIHNob3J0IHBjYywgY2FwY2M7CisJdW5zaWduZWQgZGFjcmF0ZSwgYWRjcmF0ZTsKKworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCW1vZGVfdCBvcGVuX21vZGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCisJc3RydWN0IGRtYWJ1ZiB7CisJCXZvaWQgKnJhd2J1ZjsKKwkJZG1hX2FkZHJfdCBkbWFhZGRyOworCQl1bnNpZ25lZCBidWZvcmRlcjsKKwkJdW5zaWduZWQgbnVtZnJhZzsKKwkJdW5zaWduZWQgZnJhZ3NoaWZ0OworCQl2b2lkKiBuZXh0SW47CisJCXZvaWQqIG5leHRPdXQ7CisJCWludCBjb3VudDsKKwkJaW50IGN1ckJ1ZlB0cjsKKwkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CisJCXVuc2lnbmVkIGVycm9yOyAvKiBvdmVyL3VuZGVycnVuICovCisJCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CisJCS8qIHJlZHVuZGFudCwgYnV0IG1ha2VzIGNhbGN1bGF0aW9ucyBlYXNpZXIgKi8KKwkJdW5zaWduZWQgZnJhZ3NpemU7CisJCXVuc2lnbmVkIGRtYXNpemU7CisJCXVuc2lnbmVkIGZyYWdzYW1wbGVzOworCQkvKiBPU1Mgc3R1ZmYgKi8KKwkJdW5zaWduZWQgbWFwcGVkOjE7CisJCXVuc2lnbmVkIHJlYWR5OjE7CisJCXVuc2lnbmVkIHN0b3BwZWQ6MTsKKwkJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OworCQlpbnQgb3NzbWF4ZnJhZ3M7CisJCXVuc2lnbmVkIHN1YmRpdmlzaW9uOworCX0gZG1hX2RhYywgZG1hX2FkYzsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgTElTVF9IRUFEKGRldnMpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsZDIodW5zaWduZWQgaW50IHgpCit7CisJdW5zaWduZWQgciA9IDA7CisJCisJaWYgKHggPj0gMHgxMDAwMCkgeworCQl4ID4+PSAxNjsKKwkJciArPSAxNjsKKwl9CisJaWYgKHggPj0gMHgxMDApIHsKKwkJeCA+Pj0gODsKKwkJciArPSA4OworCX0KKwlpZiAoeCA+PSAweDEwKSB7CisJCXggPj49IDQ7CisJCXIgKz0gNDsKKwl9CisJaWYgKHggPj0gNCkgeworCQl4ID4+PSAyOworCQlyICs9IDI7CisJfQorCWlmICh4ID49IDIpCisJCXIrKzsKKwlyZXR1cm4gcjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIGl0ODE3Ml9kZWxheShpbnQgbXNlYykKK3sKKwl1bnNpZ25lZCBsb25nIHRtbzsKKwlzaWduZWQgbG9uZyB0bW8yOworCisJaWYgKGluX2ludGVycnVwdCgpKQorCQlyZXR1cm47CisgICAgCisJdG1vID0gamlmZmllcyArIChtc2VjKkhaKS8xMDAwOworCWZvciAoOzspIHsKKwkJdG1vMiA9IHRtbyAtIGppZmZpZXM7CisJCWlmICh0bW8yIDw9IDApCisJCQlicmVhazsKKwkJc2NoZWR1bGVfdGltZW91dCh0bW8yKTsKKwl9Cit9CisKKworc3RhdGljIHVuc2lnbmVkIHNob3J0CitnZXRfY29tcGF0X3JhdGUodW5zaWduZWQqIHJhdGUpCit7CisJdW5zaWduZWQgcmF0ZV9vdXQgPSAqcmF0ZTsKKwl1bnNpZ25lZCBzaG9ydCBzcjsKKyAgICAKKwlpZiAocmF0ZV9vdXQgPj0gNDYwNTApIHsKKwkJc3IgPSBDQ19TUl80ODAwMDsgcmF0ZV9vdXQgPSA0ODAwMDsKKwl9IGVsc2UgaWYgKHJhdGVfb3V0ID49IDQxMjUwKSB7CisJCXNyID0gQ0NfU1JfNDQxMDA7IHJhdGVfb3V0ID0gNDQxMDA7CisJfSBlbHNlIGlmIChyYXRlX291dCA+PSAzNTIwMCkgeworCQlzciA9IENDX1NSXzM4NDAwOyByYXRlX291dCA9IDM4NDAwOworCX0gZWxzZSBpZiAocmF0ZV9vdXQgPj0gMjcwMjUpIHsKKwkJc3IgPSBDQ19TUl8zMjAwMDsgcmF0ZV9vdXQgPSAzMjAwMDsKKwl9IGVsc2UgaWYgKHJhdGVfb3V0ID49IDIwNjI1KSB7CisJCXNyID0gQ0NfU1JfMjIwNTA7IHJhdGVfb3V0ID0gMjIwNTA7CisJfSBlbHNlIGlmIChyYXRlX291dCA+PSAxNzYwMCkgeworCQlzciA9IENDX1NSXzE5MjAwOyByYXRlX291dCA9IDE5MjAwOworCX0gZWxzZSBpZiAocmF0ZV9vdXQgPj0gMTM1MTMpIHsKKwkJc3IgPSBDQ19TUl8xNjAwMDsgcmF0ZV9vdXQgPSAxNjAwMDsKKwl9IGVsc2UgaWYgKHJhdGVfb3V0ID49IDEwMzEzKSB7CisJCXNyID0gQ0NfU1JfMTEwMjU7IHJhdGVfb3V0ID0gMTEwMjU7CisJfSBlbHNlIGlmIChyYXRlX291dCA+PSA4ODAwKSB7CisJCXNyID0gQ0NfU1JfOTYwMDsgcmF0ZV9vdXQgPSA5NjAwOworCX0gZWxzZSBpZiAocmF0ZV9vdXQgPj0gNjc1MCkgeworCQlzciA9IENDX1NSXzgwMDA7IHJhdGVfb3V0ID0gODAwMDsKKwl9IGVsc2UgeworCQlzciA9IENDX1NSXzU1MDA7IHJhdGVfb3V0ID0gNTUwMDsKKwl9CisKKwkqcmF0ZSA9IHJhdGVfb3V0OworCXJldHVybiBzcjsKK30KKworc3RhdGljIHZvaWQgc2V0X2FkY19yYXRlKHN0cnVjdCBpdDgxNzJfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzaG9ydCBzcjsKKyAgICAKKwlzciA9IGdldF9jb21wYXRfcmF0ZSgmcmF0ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmNhcGNjICY9IH5DQ19TUl9NQVNLOworCXMtPmNhcGNjIHw9IHNyOworCW91dHcocy0+Y2FwY2MsIHMtPmlvK0lUX0FDX0NBUENDKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlzLT5hZGNyYXRlID0gcmF0ZTsKK30KKworCitzdGF0aWMgdm9pZCBzZXRfZGFjX3JhdGUoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IHNyOworICAgIAorCXNyID0gZ2V0X2NvbXBhdF9yYXRlKCZyYXRlKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+cGNjICY9IH5DQ19TUl9NQVNLOworCXMtPnBjYyB8PSBzcjsKKwlvdXR3KHMtPnBjYywgcy0+aW8rSVRfQUNfUENDKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlzLT5kYWNyYXRlID0gcmF0ZTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHUxNiByZGNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggYWRkcikKK3sKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzID0gKHN0cnVjdCBpdDgxNzJfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgY2lyY3AsIGRhdGE7CisJaW50IGk7CisgICAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBQT0xMX0NPVU5UOyBpKyspCisJCWlmICghKGludyhzLT5pbytJVF9BQ19DSVJDUCkgJiBDSVJDUF9DUFMpKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJyZGNvZGVjOiBjb2RlYyByZWFkeSBwb2xsIGV4cGlyZWQhIik7CisKKwljaXJjcCA9IGFkZHIgJiBDSVJDUF9DSUFfTUFTSzsKKwljaXJjcCB8PSAoY29kZWMtPmlkIDw8IENJUkNQX0NJRF9CSVQpOworCWNpcmNwIHw9IENJUkNQX1JXQzsgLy8gcmVhZCBjb21tYW5kCisJb3V0dyhjaXJjcCwgcy0+aW8rSVRfQUNfQ0lSQ1ApOworCisJLyogbm93IHdhaXQgZm9yIHRoZSBkYXRhICovCisJZm9yIChpID0gMDsgaSA8IFBPTExfQ09VTlQ7IGkrKykKKwkJaWYgKGludyhzLT5pbytJVF9BQ19DSVJDUCkgJiBDSVJDUF9EUFZGKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJyZGNvZGVjOiByZWFkIHBvbGwgZXhwaXJlZCEiKTsKKworCWRhdGEgPSBpbncocy0+aW8rSVRfQUNfQ0lSRFApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBkYXRhOworfQorCisKK3N0YXRpYyB2b2lkIHdyY29kZWMoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCBhZGRyLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzID0gKHN0cnVjdCBpdDgxNzJfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgY2lyY3A7CisJaW50IGk7CisgICAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBQT0xMX0NPVU5UOyBpKyspCisJCWlmICghKGludyhzLT5pbytJVF9BQ19DSVJDUCkgJiBDSVJDUF9DUFMpKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gUE9MTF9DT1VOVCkKKwkJZXJyKCJ3cmNvZGVjOiBjb2RlYyByZWFkeSBwb2xsIGV4cGlyZWQhIik7CisKKwljaXJjcCA9IGFkZHIgJiBDSVJDUF9DSUFfTUFTSzsKKwljaXJjcCB8PSAoY29kZWMtPmlkIDw8IENJUkNQX0NJRF9CSVQpOworCWNpcmNwICY9IH5DSVJDUF9SV0M7IC8vIHdyaXRlIGNvbW1hbmQKKworCW91dHcoZGF0YSwgIHMtPmlvK0lUX0FDX0NJUkRQKTsgIC8vIHNlbmQgZGF0YSBmaXJzdAorCW91dHcoY2lyY3AsIHMtPmlvK0lUX0FDX0NJUkNQKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCB3YWl0Y29kZWMoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCXVuc2lnbmVkIHNob3J0IHRlbXA7CisKKwkvKiBjb2RlY193YWl0IGlzIHVzZWQgdG8gd2FpdCBmb3IgYSByZWFkeSBzdGF0ZSBhZnRlcgorCSAgIGFuIEFDOTdfUkVTRVQuICovCisJaXQ4MTcyX2RlbGF5KDEwKTsKKworCXRlbXAgPSByZGNvZGVjKGNvZGVjLCAweDI2KTsKKworCS8vIElmIHBvd2VyIGRvd24sIHBvd2VyIHVwCisJaWYgKHRlbXAgJiAweDNmMDApIHsKKwkJLy8gUG93ZXIgb24KKwkJd3Jjb2RlYyhjb2RlYywgMHgyNiwgMCk7CisJCWl0ODE3Ml9kZWxheSgxMDApOworCQkvLyBSZXJlYWQKKwkJdGVtcCA9IHJkY29kZWMoY29kZWMsIDB4MjYpOworCX0KKyAgICAKKwkvLyBDaGVjayBpZiBDb2RlYyBSRUYsQU5MLERBQyxBREMgcmVhZHkqKiovCisJaWYgKCh0ZW1wICYgMHgzZjBmKSAhPSAweDAwMGYpIHsKKwkJZXJyKCJjb2RlYyByZWcgMjYgc3RhdHVzICgweCV4KSBub3QgcmVhZHkhISIsIHRlbXApOworCQlyZXR1cm47CisJfQorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9hZGMoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1hYnVmKiBkYiA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBpbWM7CisgICAgCisJaWYgKGRiLT5zdG9wcGVkKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJcy0+Y2FwY2MgJj0gfihDQ19DQSB8IENDX0NQIHwgQ0NfQ0IyTCB8IENDX0NCMUwpOworCXMtPmNhcGNjIHw9IENDX0NTUDsKKwlvdXR3KHMtPmNhcGNjLCBzLT5pbytJVF9BQ19DQVBDQyk7CisgICAgCisJLy8gZGlzYWJsZSBjYXB0dXJlIGludGVycnVwdAorCWltYyA9IGluYihzLT5pbytJVF9BQ19JTUMpOworCW91dGIoaW1jIHwgSU1DX0NDSU0sIHMtPmlvK0lUX0FDX0lNQyk7CisKKwlkYi0+c3RvcHBlZCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9kYWMoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1hYnVmKiBkYiA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBpbWM7CisgICAgCisJaWYgKGRiLT5zdG9wcGVkKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJcy0+cGNjICY9IH4oQ0NfQ0EgfCBDQ19DUCB8IENDX0NCMkwgfCBDQ19DQjFMKTsKKwlzLT5wY2MgfD0gQ0NfQ1NQOworCW91dHcocy0+cGNjLCBzLT5pbytJVF9BQ19QQ0MpOworICAgIAorCS8vIGRpc2FibGUgcGxheWJhY2sgaW50ZXJydXB0CisJaW1jID0gaW5iKHMtPmlvK0lUX0FDX0lNQyk7CisJb3V0YihpbWMgfCBJTUNfUENJTSwgcy0+aW8rSVRfQUNfSU1DKTsKKworCWRiLT5zdG9wcGVkID0gMTsKKyAgICAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1hYnVmKiBkYiA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciBpbWM7CisJdW5zaWduZWQgbG9uZyBidWYxLCBidWYyOworICAgIAorCWlmICghZGItPnN0b3BwZWQpCisJCXJldHVybjsKKyAgICAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJLy8gcmVzZXQgQnVmZmVyIDEgYW5kIDIgcG9pbnRlcnMgdG8gbmV4dE91dCBhbmQgbmV4dE91dCtmcmFnc2l6ZQorCWJ1ZjEgPSB2aXJ0X3RvX2J1cyhkYi0+bmV4dE91dCk7CisJYnVmMiA9IGJ1ZjEgKyBkYi0+ZnJhZ3NpemU7CisJaWYgKGJ1ZjIgPj0gZGItPmRtYWFkZHIgKyBkYi0+ZG1hc2l6ZSkKKwkJYnVmMiAtPSBkYi0+ZG1hc2l6ZTsKKyAgICAKKwlvdXRsKGJ1ZjEsIHMtPmlvK0lUX0FDX1BDQjFTVEEpOworCW91dGwoYnVmMiwgcy0+aW8rSVRfQUNfUENCMlNUQSk7CisJZGItPmN1ckJ1ZlB0ciA9IElUX0FDX1BDQjFTVEE7CisgICAgCisJLy8gZW5hYmxlIHBsYXliYWNrIGludGVycnVwdAorCWltYyA9IGluYihzLT5pbytJVF9BQ19JTUMpOworCW91dGIoaW1jICYgfklNQ19QQ0lNLCBzLT5pbytJVF9BQ19JTUMpOworCisJcy0+cGNjICY9IH4oQ0NfQ1NQIHwgQ0NfQ1AgfCBDQ19DQjJMIHwgQ0NfQ0IxTCk7CisJcy0+cGNjIHw9IENDX0NBOworCW91dHcocy0+cGNjLCBzLT5pbytJVF9BQ19QQ0MpOworICAgIAorCWRiLT5zdG9wcGVkID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30JCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYqIGRiID0gJnMtPmRtYV9hZGM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGltYzsKKwl1bnNpZ25lZCBsb25nIGJ1ZjEsIGJ1ZjI7CisgICAgCisJaWYgKCFkYi0+c3RvcHBlZCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCS8vIHJlc2V0IEJ1ZmZlciAxIGFuZCAyIHBvaW50ZXJzIHRvIG5leHRJbiBhbmQgbmV4dEluK2ZyYWdzaXplCisJYnVmMSA9IHZpcnRfdG9fYnVzKGRiLT5uZXh0SW4pOworCWJ1ZjIgPSBidWYxICsgZGItPmZyYWdzaXplOworCWlmIChidWYyID49IGRiLT5kbWFhZGRyICsgZGItPmRtYXNpemUpCisJCWJ1ZjIgLT0gZGItPmRtYXNpemU7CisgICAgCisJb3V0bChidWYxLCBzLT5pbytJVF9BQ19DQVBCMVNUQSk7CisJb3V0bChidWYyLCBzLT5pbytJVF9BQ19DQVBCMlNUQSk7CisJZGItPmN1ckJ1ZlB0ciA9IElUX0FDX0NBUEIxU1RBOworCisJLy8gZW5hYmxlIGNhcHR1cmUgaW50ZXJydXB0CisJaW1jID0gaW5iKHMtPmlvK0lUX0FDX0lNQyk7CisJb3V0YihpbWMgJiB+SU1DX0NDSU0sIHMtPmlvK0lUX0FDX0lNQyk7CisKKwlzLT5jYXBjYyAmPSB+KENDX0NTUCB8IENDX0NQIHwgQ0NfQ0IyTCB8IENDX0NCMUwpOworCXMtPmNhcGNjIHw9IENDX0NBOworCW91dHcocy0+Y2FwY2MsIHMtPmlvK0lUX0FDX0NBUENDKTsKKyAgICAKKwlkYi0+c3RvcHBlZCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNy1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCitzdGF0aWMgaW5saW5lIHZvaWQgZGVhbGxvY19kbWFidWYoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcywgc3RydWN0IGRtYWJ1ZiAqZGIpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJaWYgKGRiLT5yYXdidWYpIHsKKwkJLyogdW5kbyBtYXJraW5nIHRoZSBwYWdlcyBhcyByZXNlcnZlZCAqLworCQlwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKworCQkJCSAgICAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHMtPmRldiwgUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlciwKKwkJCQkgICAgZGItPnJhd2J1ZiwgZGItPmRtYWFkZHIpOworCX0KKwlkYi0+cmF3YnVmID0gZGItPm5leHRJbiA9IGRiLT5uZXh0T3V0ID0gTlVMTDsKKwlkYi0+bWFwcGVkID0gZGItPnJlYWR5ID0gMDsKK30KKworc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzLCBzdHJ1Y3QgZG1hYnVmICpkYiwKKwkJICAgICAgIHVuc2lnbmVkIHJhdGUsIHVuc2lnbmVkIGZtdCwgdW5zaWduZWQgcmVnKQoreworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBieXRlcGVyc2VjOworCXVuc2lnbmVkIGJ1ZnM7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJaWYgKCFkYi0+cmF3YnVmKSB7CisJCWRiLT5yZWFkeSA9IGRiLT5tYXBwZWQgPSAwOworCQlmb3IgKG9yZGVyID0gRE1BQlVGX0RFRkFVTFRPUkRFUjsKKwkJICAgICBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IG9yZGVyLS0pCisJCQlpZiAoKGRiLT5yYXdidWYgPQorCQkJICAgICBwY2lfYWxsb2NfY29uc2lzdGVudChzLT5kZXYsCisJCQkJCQkgIFBBR0VfU0laRSA8PCBvcmRlciwKKwkJCQkJCSAgJmRiLT5kbWFhZGRyKSkpCisJCQkJYnJlYWs7CisJCWlmICghZGItPnJhd2J1ZikKKwkJCXJldHVybiAtRU5PTUVNOworCQlkYi0+YnVmb3JkZXIgPSBvcmRlcjsKKwkJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOworCQkgICBvdGhlcndpc2UgcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCisJCXBlbmQgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1ZiArCisJCQkJICAgIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpOworCQlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCX0KKworCWRiLT5jb3VudCA9IDA7CisJZGItPm5leHRJbiA9IGRiLT5uZXh0T3V0ID0gZGItPnJhd2J1ZjsKKyAgICAKKwlieXRlcGVyc2VjID0gcmF0ZSA8PCBzYW1wbGVfc2hpZnRbZm10XTsKKwlidWZzID0gUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcjsKKwlpZiAoZGItPm9zc2ZyYWdzaGlmdCkgeworCQlpZiAoKDEwMDAgPDwgZGItPm9zc2ZyYWdzaGlmdCkgPCBieXRlcGVyc2VjKQorCQkJZGItPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjLzEwMDApOworCQllbHNlCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gZGItPm9zc2ZyYWdzaGlmdDsKKwl9IGVsc2UgeworCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwLyhkYi0+c3ViZGl2aXNpb24gPworCQkJCQkJICAgIGRiLT5zdWJkaXZpc2lvbiA6IDEpKTsKKwkJaWYgKGRiLT5mcmFnc2hpZnQgPCAzKQorCQkJZGItPmZyYWdzaGlmdCA9IDM7CisJfQorCWRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl9CisJZGItPmZyYWdzaXplID0gMSA8PCBkYi0+ZnJhZ3NoaWZ0OworCWlmIChkYi0+b3NzbWF4ZnJhZ3MgPj0gNCAmJiBkYi0+b3NzbWF4ZnJhZ3MgPCBkYi0+bnVtZnJhZykKKwkJZGItPm51bWZyYWcgPSBkYi0+b3NzbWF4ZnJhZ3M7CisJZGItPmZyYWdzYW1wbGVzID0gZGItPmZyYWdzaXplID4+IHNhbXBsZV9zaGlmdFtmbXRdOworCWRiLT5kbWFzaXplID0gZGItPm51bWZyYWcgPDwgZGItPmZyYWdzaGlmdDsKKwltZW1zZXQoZGItPnJhd2J1ZiwgKGZtdCAmIChDQ19ERj4+Q0NfRk1UX0JJVCkpID8gMCA6IDB4ODAsIGJ1ZnMpOworICAgIAorI2lmZGVmIElUODE3Ml9WRVJCT1NFX0RFQlVHCisJZGJnKCJyYXRlPSVkLCBmcmFnc2l6ZT0lZCwgbnVtZnJhZz0lZCwgZG1hc2l6ZT0lZCIsCisJICAgIHJhdGUsIGRiLT5mcmFnc2l6ZSwgZGItPm51bWZyYWcsIGRiLT5kbWFzaXplKTsKKyNlbmRpZgorCisJLy8gc2V0IGRhdGEgbGVuZ3RoIHJlZ2lzdGVyCisJb3V0dyhkYi0+ZnJhZ3NpemUsIHMtPmlvK3JlZysyKTsKKwlkYi0+cmVhZHkgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX2FkYyhzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzKQoreworCXN0b3BfYWRjKHMpOworCXJldHVybiBwcm9nX2RtYWJ1ZihzLCAmcy0+ZG1hX2FkYywgcy0+YWRjcmF0ZSwKKwkJCSAgIChzLT5jYXBjYyAmIENDX0ZNVF9NQVNLKSA+PiBDQ19GTVRfQklULAorCQkJICAgSVRfQUNfQ0FQQ0MpOworfQorCitzdGF0aWMgaW5saW5lIGludCBwcm9nX2RtYWJ1Zl9kYWMoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcykKK3sKKwlzdG9wX2RhYyhzKTsKKwlyZXR1cm4gcHJvZ19kbWFidWYocywgJnMtPmRtYV9kYWMsIHMtPmRhY3JhdGUsCisJCQkgICAocy0+cGNjICYgQ0NfRk1UX01BU0spID4+IENDX0ZNVF9CSVQsCisJCQkgICBJVF9BQ19QQ0MpOworfQorCisKKy8qIGhvbGQgc3BpbmxvY2sgZm9yIHRoZSBmb2xsb3dpbmchICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpdDgxNzJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcyA9IChzdHJ1Y3QgaXQ4MTcyX3N0YXRlICopZGV2X2lkOworCXN0cnVjdCBkbWFidWYqIGRhYyA9ICZzLT5kbWFfZGFjOworCXN0cnVjdCBkbWFidWYqIGFkYyA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkIGNoYXIgaXNjLCB2czsKKwl1bnNpZ25lZCBzaG9ydCB2b2wsIG11dGU7CisJdW5zaWduZWQgbG9uZyBuZXdwdHI7CisgICAgCisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKworCWlzYyA9IGluYihzLT5pbytJVF9BQ19JU0MpOworCisJLyogZmFzdHBhdGggb3V0LCB0byBlYXNlIGludGVycnVwdCBzaGFyaW5nICovCisJaWYgKCEoaXNjICYgKElTQ19WQ0kgfCBJU0NfQ0NJIHwgSVNDX1BDSSkpKSB7CisJCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKyAgICAKKwkvKiBjbGVhciBhdWRpbyBpbnRlcnJ1cHRzIGZpcnN0ICovCisJb3V0Yihpc2MgfCBJU0NfVkNJIHwgSVNDX0NDSSB8IElTQ19QQ0ksIHMtPmlvK0lUX0FDX0lTQyk7CisgICAgCisJLyogaGFuZGxlIHZvbHVtZSBidXR0b24gZXZlbnRzIChpZ25vcmUgaWYgUy9QRElGIGVuYWJsZWQpICovCisJaWYgKChpc2MgJiBJU0NfVkNJKSAmJiBzLT5zcGRpZl92b2x1bWUgPT0gLTEpIHsKKwkJdnMgPSBpbmIocy0+aW8rSVRfQUNfVlMpOworCQlvdXRiKDAsIHMtPmlvK0lUX0FDX1ZTKTsKKwkJdm9sID0gaW53KHMtPmlvK0lUX0FDX1BDTU9WKTsKKwkJbXV0ZSA9IHZvbCAmIFBDTU9WX1BDTU9NOworCQl2b2wgJj0gUENNT1ZfUENNTENHX01BU0s7CisJCWlmICgodnMgJiBWU19WVVApICYmIHZvbCA+IDApCisJCQl2b2wtLTsKKwkJaWYgKCh2cyAmIFZTX1ZEUCkgJiYgdm9sIDwgMHgxZikKKwkJCXZvbCsrOworCQl2b2wgfD0gKHZvbCA8PCBQQ01PVl9QQ01SQ0dfQklUKTsKKwkJaWYgKHZzICYgVlNfVk1QKQorCQkJdm9sIHw9IChtdXRlIF4gUENNT1ZfUENNT00pOworCQlvdXR3KHZvbCwgcy0+aW8rSVRfQUNfUENNT1YpOworCX0KKyAgICAKKwkvKiB1cGRhdGUgY2FwdHVyZSBwb2ludGVycyAqLworCWlmIChpc2MgJiBJU0NfQ0NJKSB7CisJCWlmIChhZGMtPmNvdW50ID4gYWRjLT5kbWFzaXplIC0gYWRjLT5mcmFnc2l6ZSkgeworCQkJLy8gT3ZlcnJ1bi4gU3RvcCBBREMgYW5kIGxvZyB0aGUgZXJyb3IKKwkJCXN0b3BfYWRjKHMpOworCQkJYWRjLT5lcnJvcisrOworCQkJZGJnKCJhZGMgb3ZlcnJ1biIpOworCQl9IGVsc2UgeworCQkJbmV3cHRyID0gdmlydF90b19idXMoYWRjLT5uZXh0SW4pICsgMiphZGMtPmZyYWdzaXplOworCQkJaWYgKG5ld3B0ciA+PSBhZGMtPmRtYWFkZHIgKyBhZGMtPmRtYXNpemUpCisJCQkJbmV3cHRyIC09IGFkYy0+ZG1hc2l6ZTsKKwkgICAgCisJCQlvdXRsKG5ld3B0ciwgcy0+aW8rYWRjLT5jdXJCdWZQdHIpOworCQkJYWRjLT5jdXJCdWZQdHIgPSAoYWRjLT5jdXJCdWZQdHIgPT0gSVRfQUNfQ0FQQjFTVEEpID8KKwkJCQlJVF9BQ19DQVBCMlNUQSA6IElUX0FDX0NBUEIxU1RBOworCSAgICAKKwkJCWFkYy0+bmV4dEluICs9IGFkYy0+ZnJhZ3NpemU7CisJCQlpZiAoYWRjLT5uZXh0SW4gPj0gYWRjLT5yYXdidWYgKyBhZGMtPmRtYXNpemUpCisJCQkJYWRjLT5uZXh0SW4gLT0gYWRjLT5kbWFzaXplOworCSAgICAKKwkJCWFkYy0+Y291bnQgKz0gYWRjLT5mcmFnc2l6ZTsKKwkJCWFkYy0+dG90YWxfYnl0ZXMgKz0gYWRjLT5mcmFnc2l6ZTsKKworCQkJLyogd2FrZSB1cCBhbnlib2R5IGxpc3RlbmluZyAqLworCQkJaWYgKHdhaXRxdWV1ZV9hY3RpdmUoJmFkYy0+d2FpdCkpCisJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZhZGMtPndhaXQpOworCQl9CisJfQorICAgIAorCS8qIHVwZGF0ZSBwbGF5YmFjayBwb2ludGVycyAqLworCWlmIChpc2MgJiBJU0NfUENJKSB7CisJCW5ld3B0ciA9IHZpcnRfdG9fYnVzKGRhYy0+bmV4dE91dCkgKyAyKmRhYy0+ZnJhZ3NpemU7CisJCWlmIChuZXdwdHIgPj0gZGFjLT5kbWFhZGRyICsgZGFjLT5kbWFzaXplKQorCQkJbmV3cHRyIC09IGRhYy0+ZG1hc2l6ZTsKKwkKKwkJb3V0bChuZXdwdHIsIHMtPmlvK2RhYy0+Y3VyQnVmUHRyKTsKKwkJZGFjLT5jdXJCdWZQdHIgPSAoZGFjLT5jdXJCdWZQdHIgPT0gSVRfQUNfUENCMVNUQSkgPworCQkJSVRfQUNfUENCMlNUQSA6IElUX0FDX1BDQjFTVEE7CisJCisJCWRhYy0+bmV4dE91dCArPSBkYWMtPmZyYWdzaXplOworCQlpZiAoZGFjLT5uZXh0T3V0ID49IGRhYy0+cmF3YnVmICsgZGFjLT5kbWFzaXplKQorCQkJZGFjLT5uZXh0T3V0IC09IGRhYy0+ZG1hc2l6ZTsKKwkKKwkJZGFjLT5jb3VudCAtPSBkYWMtPmZyYWdzaXplOworCQlkYWMtPnRvdGFsX2J5dGVzICs9IGRhYy0+ZnJhZ3NpemU7CisKKwkJLyogd2FrZSB1cCBhbnlib2R5IGxpc3RlbmluZyAqLworCQlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZGFjLT53YWl0KSkKKwkJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmZGFjLT53YWl0KTsKKwkKKwkJaWYgKGRhYy0+Y291bnQgPD0gMCkKKwkJCXN0b3BfZGFjKHMpOworCX0KKyAgICAKKwlzcGluX3VubG9jaygmcy0+bG9jayk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBpdDgxNzJfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBpdDgxNzJfc3RhdGUgKnM7CisKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IGl0ODE3Ml9zdGF0ZSwgZGV2cyk7CisJCWlmIChzLT5jb2RlYy5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgaXQ4MTcyX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB1MTYKK2N2dF9vc3N2b2wodW5zaWduZWQgaW50IGdhaW4pCit7CisJdTE2IHJldDsKKyAgICAKKwlpZiAoZ2FpbiA9PSAwKQorCQlyZXR1cm4gMDsKKyAgICAKKwlpZiAoZ2FpbiA+IDEwMCkKKwkJZ2FpbiA9IDEwMDsKKyAgICAKKwlyZXQgPSAoMTAwIC0gZ2FpbiArIDMyKSAvIDQ7CisJcmV0ID0gcmV0ID4gMzEgPyAzMSA6IHJldDsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyBpbnQgbWl4ZGV2X2lvY3RsKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBpdDgxNzJfc3RhdGUgKnMgPSAoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGxlZnQsIHJpZ2h0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHZhbDsKKwl1MTYgdm9sOworICAgIAorCS8qCisJICogV2hlbiB3ZSBhcmUgaW4gUy9QRElGIG1vZGUsIHdlIHdhbnQgdG8gZGlzYWJsZSBhbnkgYW5hbG9nIG91dHB1dCBzbworCSAqIHdlIGZpbHRlciB0aGUgbWFzdGVyL1BDTSBjaGFubmVsIHZvbHVtZSBpb2N0bHMuCisJICoKKwkgKiBBbHNvIGZpbHRlciBJMlMgY2hhbm5lbCwgd2hpY2ggQUMnOTcga25vd3Mgbm90aGluZyBhYm91dC4KKwkgKi8KKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUU6CisJCS8vIGlmIG5vdCBpbiBTL1BESUYgbW9kZSwgcGFzcyB0byBBQyc5NworCQlpZiAocy0+c3BkaWZfdm9sdW1lID09IC0xKQorCQkJYnJlYWs7CisJCXJldHVybiAwOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUENNOgorCQkvLyBpZiBub3QgaW4gUy9QRElGIG1vZGUsIHBhc3MgdG8gQUMnOTcKKwkJaWYgKHMtPnNwZGlmX3ZvbHVtZSA9PSAtMSkKKwkJCWJyZWFrOworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyaWdodCA9ICgodmFsID4+IDgpICAmIDB4ZmYpOworCQlsZWZ0ID0gKHZhbCAgJiAweGZmKTsKKwkJaWYgKHJpZ2h0ID4gMTAwKQorCQkJcmlnaHQgPSAxMDA7CisJCWlmIChsZWZ0ID4gMTAwKQorCQkJbGVmdCA9IDEwMDsKKwkJcy0+c3BkaWZfdm9sdW1lID0gKHJpZ2h0IDw8IDgpIHwgbGVmdDsKKwkJdm9sID0gY3Z0X29zc3ZvbChsZWZ0KTsKKwkJdm9sIHw9IChjdnRfb3Nzdm9sKHJpZ2h0KSA8PCBQQ01PVl9QQ01SQ0dfQklUKTsKKwkJaWYgKHZvbCA9PSAwKQorCQkJdm9sID0gUENNT1ZfUENNT007IC8vIG11dGUKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJb3V0dyh2b2wsIHMtPmlvK0lUX0FDX1BDTU9WKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcHV0X3VzZXIocy0+c3BkaWZfdm9sdW1lLCAoaW50ICopYXJnKTsKKwljYXNlIFNPVU5EX01JWEVSX1JFQURfUENNOgorCQkvLyBpZiBub3QgaW4gUy9QRElGIG1vZGUsIHBhc3MgdG8gQUMnOTcKKwkJaWYgKHMtPnNwZGlmX3ZvbHVtZSA9PSAtMSkKKwkJCWJyZWFrOworCQlyZXR1cm4gcHV0X3VzZXIocy0+c3BkaWZfdm9sdW1lLCAoaW50ICopYXJnKTsKKwljYXNlIFNPVU5EX01JWEVSX1dSSVRFX0kyUzoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmlnaHQgPSAoKHZhbCA+PiA4KSAgJiAweGZmKTsKKwkJbGVmdCA9ICh2YWwgICYgMHhmZik7CisJCWlmIChyaWdodCA+IDEwMCkKKwkJCXJpZ2h0ID0gMTAwOworCQlpZiAobGVmdCA+IDEwMCkKKwkJCWxlZnQgPSAxMDA7CisJCXMtPmkyc192b2x1bWUgPSAocmlnaHQgPDwgOCkgfCBsZWZ0OworCQl2b2wgPSBjdnRfb3Nzdm9sKGxlZnQpOworCQl2b2wgfD0gKGN2dF9vc3N2b2wocmlnaHQpIDw8IEkyU1ZfSTJTUkNHX0JJVCk7CisJCWlmICh2b2wgPT0gMCkKKwkJCXZvbCA9IEkyU1ZfSTJTT007IC8vIG11dGUKKwkJb3V0dyh2b2wsIHMtPmlvK0lUX0FDX0kyU1YpOworCQlyZXR1cm4gcHV0X3VzZXIocy0+aTJzX3ZvbHVtZSwgKGludCAqKWFyZyk7CisJY2FzZSBTT1VORF9NSVhFUl9SRUFEX0kyUzoKKwkJcmV0dXJuIHB1dF91c2VyKHMtPmkyc192b2x1bWUsIChpbnQgKilhcmcpOworCWNhc2UgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICYgU09VTkRfTUFTS19JMlMpIHsKKwkJCXMtPmkyc19yZWNvcmRpbmcgPSAxOworCQkJb3V0YihEUlNTX0kyUywgcy0+aW8rSVRfQUNfRFJTUyk7CisJCQlyZXR1cm4gMDsKKwkJfSBlbHNlIHsKKwkJCXMtPmkyc19yZWNvcmRpbmcgPSAwOworCQkJb3V0YihEUlNTX0FDOTdfUFJJTSwgcy0+aW8rSVRfQUNfRFJTUyk7CisJCQkvLyBub3cgbGV0IEFDJzk3IHNlbGVjdCByZWNvcmQgc291cmNlCisJCQlicmVhazsKKwkJfQorCWNhc2UgU09VTkRfTUlYRVJfUkVBRF9SRUNTUkM6CisJCWlmIChzLT5pMnNfcmVjb3JkaW5nKQorCQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX01BU0tfSTJTLCAoaW50ICopYXJnKTsKKwkJZWxzZQorCQkJLy8gbGV0IEFDJzk3IHJlcG9ydCByZWNvcmRpbmcgc291cmNlCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgaXQ4MTcyX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzID0gKHN0cnVjdCBpdDgxNzJfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gJnMtPmNvZGVjOworCisJcmV0dXJuIG1peGRldl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaXQ4MTcyX21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBpdDgxNzJfaW9jdGxfbWl4ZGV2LAorCS5vcGVuCQk9IGl0ODE3Ml9vcGVuX21peGRldiwKKwkucmVsZWFzZQk9IGl0ODE3Ml9yZWxlYXNlX21peGRldiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGRyYWluX2RhYyhzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzLCBpbnQgbm9uYmxvY2spCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQsIHRtbzsKKwkKKwlpZiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwgIXMtPmRtYV9kYWMucmVhZHkgfHwgcy0+ZG1hX2RhYy5zdG9wcGVkKQorCQlyZXR1cm4gMDsKKworCWZvciAoOzspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQkvL2lmIChub25ibG9jaykKKwkJLy9yZXR1cm4gLUVCVVNZOworCQl0bW8gPSAxMDAwICogY291bnQgLyBzLT5kYWNyYXRlOworCQl0bW8gPj49IHNhbXBsZV9zaGlmdFsocy0+cGNjICYgQ0NfRk1UX01BU0spID4+IENDX0ZNVF9CSVRdOworCQlpdDgxNzJfZGVsYXkodG1vKTsKKwl9CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICogQ29weSBhdWRpbyBkYXRhIHRvL2Zyb20gdXNlciBidWZmZXIgZnJvbS90byBkbWEgYnVmZmVyLCB0YWtpbmcgY2FyZQorICogdGhhdCB3ZSB3cmFwIHdoZW4gcmVhZGluZy93cml0aW5nIHRoZSBkbWEgYnVmZmVyLiBSZXR1cm5zIGFjdHVhbCBieXRlCisgKiBjb3VudCB3cml0dGVuIHRvIG9yIHJlYWQgZnJvbSB0aGUgZG1hIGJ1ZmZlci4KKyAqLworc3RhdGljIGludCBjb3B5X2RtYWJ1Zl91c2VyKHN0cnVjdCBkbWFidWYgKmRiLCBjaGFyKiB1c2VyYnVmLAorCQkJICAgIGludCBjb3VudCwgaW50IHRvX3VzZXIpCit7CisJY2hhciogYnVmcHRyID0gdG9fdXNlciA/IGRiLT5uZXh0T3V0IDogZGItPm5leHRJbjsKKwljaGFyKiBidWZlbmQgPSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemU7CisJCisJaWYgKGJ1ZnB0ciArIGNvdW50ID4gYnVmZW5kKSB7CisJCWludCBwYXJ0aWFsID0gKGludCkoYnVmZW5kIC0gYnVmcHRyKTsKKwkJaWYgKHRvX3VzZXIpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlcmJ1ZiwgYnVmcHRyLCBwYXJ0aWFsKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjb3B5X3RvX3VzZXIodXNlcmJ1ZiArIHBhcnRpYWwsIGRiLT5yYXdidWYsCisJCQkJCSBjb3VudCAtIHBhcnRpYWwpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9IGVsc2UgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZnB0ciwgdXNlcmJ1ZiwgcGFydGlhbCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZGItPnJhd2J1ZiwKKwkJCQkJICAgdXNlcmJ1ZiArIHBhcnRpYWwsCisJCQkJCSAgIGNvdW50IC0gcGFydGlhbCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAodG9fdXNlcikgeworCQkJaWYgKGNvcHlfdG9fdXNlcih1c2VyYnVmLCBidWZwdHIsIGNvdW50KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihidWZwdHIsIHVzZXJidWYsIGNvdW50KSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCX0KKwkKKwlyZXR1cm4gY291bnQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgaXQ4MTcyX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgKmJ1ZmZlciwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBpdDgxNzJfc3RhdGUgKnMgPSAoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9ICZzLT5kbWFfYWRjOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNudCwgcmVtYWluZGVyLCBhdmFpbDsKKworCWlmIChkYi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8vIHdhaXQgZm9yIHNhbXBsZXMgaW4gY2FwdHVyZSBidWZmZXIKKwkJZG8geworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChkYi0+c3RvcHBlZCkKKwkJCQlzdGFydF9hZGMocyk7CisJCQlhdmFpbCA9IGRiLT5jb3VudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChhdmFpbCA8PSAwKSB7CisJCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJCWlmICghcmV0KQorCQkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmZGItPndhaXQpOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKGF2YWlsIDw9IDApOworCisJCS8vIGNvcHkgZnJvbSBuZXh0T3V0IHRvIHVzZXIKKwkJaWYgKChjbnQgPSBjb3B5X2RtYWJ1Zl91c2VyKGRiLCBidWZmZXIsIGNvdW50ID4gYXZhaWwgPworCQkJCQkgICAgYXZhaWwgOiBjb3VudCwgMSkpIDwgMCkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlkYi0+Y291bnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkJZGItPm5leHRPdXQgKz0gY250OworCQlpZiAoZGItPm5leHRPdXQgPj0gZGItPnJhd2J1ZiArIGRiLT5kbWFzaXplKQorCQkJZGItPm5leHRPdXQgLT0gZGItPmRtYXNpemU7CQorCisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwl9IC8vIHdoaWxlIChjb3VudCA+IDApCisKKwkvKgorCSAqIFNlZSBpZiB0aGUgZG1hIGJ1ZmZlciBjb3VudCBhZnRlciB0aGlzIHJlYWQgY2FsbCBpcworCSAqIGFsaWduZWQgb24gYSBmcmFnc2l6ZSBib3VuZGFyeS4gSWYgbm90LCByZWFkIGZyb20KKwkgKiBidWZmZXIgdW50aWwgd2UgcmVhY2ggYSBib3VuZGFyeSwgYW5kIGxldCdzIGhvcGUgdGhpcworCSAqIGlzIGp1c3QgdGhlIGxhc3QgcmVtYWluZGVyIG9mIGFuIGF1ZGlvIHJlY29yZC4gSWYgbm90CisJICogaXQgbWVhbnMgdGhlIHVzZXIgaXMgbm90IHJlYWRpbmcgaW4gZnJhZ3NpemUgY2h1bmtzLCBpbgorCSAqIHdoaWNoIGNhc2UgaXQncyBoaXMvaGVyIGZhdWx0IHRoYXQgdGhlcmUgYXJlIGF1ZGlvIGdhcHMKKwkgKiBpbiB0aGVpciByZWNvcmQuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZW1haW5kZXIgPSBkYi0+Y291bnQgJSBkYi0+ZnJhZ3NpemU7CisJaWYgKHJlbWFpbmRlcikgeworCQlkYi0+bmV4dE91dCArPSByZW1haW5kZXI7CisJCWlmIChkYi0+bmV4dE91dCA+PSBkYi0+cmF3YnVmICsgZGItPmRtYXNpemUpCisJCQlkYi0+bmV4dE91dCAtPSBkYi0+ZG1hc2l6ZTsKKwkJZGItPmNvdW50IC09IHJlbWFpbmRlcjsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgaXQ4MTcyX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcyA9IChzdHJ1Y3QgaXQ4MTcyX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRiID0gJnMtPmRtYV9kYWM7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY250LCByZW1haW5kZXIsIGF2YWlsOworCisJaWYgKGRiLT5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSAwOworICAgIAorCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLy8gd2FpdCBmb3Igc3BhY2UgaW4gcGxheWJhY2sgYnVmZmVyCisJCWRvIHsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQlhdmFpbCA9IGRiLT5kbWFzaXplIC0gZGItPmNvdW50OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGF2YWlsIDw9IDApIHsKKwkJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZkYi0+d2FpdCk7CisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCWlmICghcmV0KQorCQkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoYXZhaWwgPD0gMCk7CisJCisJCS8vIGNvcHkgdG8gbmV4dEluCisJCWlmICgoY250ID0gY29weV9kbWFidWZfdXNlcihkYiwgKGNoYXIqKWJ1ZmZlciwKKwkJCQkJICAgIGNvdW50ID4gYXZhaWwgPworCQkJCQkgICAgYXZhaWwgOiBjb3VudCwgMCkpIDwgMCkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlkYi0+Y291bnQgKz0gY250OworCQlpZiAoZGItPnN0b3BwZWQpCisJCQlzdGFydF9kYWMocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkKKwkJZGItPm5leHRJbiArPSBjbnQ7CisJCWlmIChkYi0+bmV4dEluID49IGRiLT5yYXdidWYgKyBkYi0+ZG1hc2l6ZSkKKwkJCWRiLT5uZXh0SW4gLT0gZGItPmRtYXNpemU7CisJCisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwl9IC8vIHdoaWxlIChjb3VudCA+IDApCisJCisJLyoKKwkgKiBTZWUgaWYgdGhlIGRtYSBidWZmZXIgY291bnQgYWZ0ZXIgdGhpcyB3cml0ZSBjYWxsIGlzCisJICogYWxpZ25lZCBvbiBhIGZyYWdzaXplIGJvdW5kYXJ5LiBJZiBub3QsIGZpbGwgYnVmZmVyCisJICogd2l0aCBzaWxlbmNlIHRvIHRoZSBuZXh0IGJvdW5kYXJ5LCBhbmQgbGV0J3MgaG9wZSB0aGlzCisJICogaXMganVzdCB0aGUgbGFzdCByZW1haW5kZXIgb2YgYW4gYXVkaW8gcGxheWJhY2suIElmIG5vdAorCSAqIGl0IG1lYW5zIHRoZSB1c2VyIGlzIG5vdCBzZW5kaW5nIHVzIGZyYWdzaXplIGNodW5rcywgaW4KKwkgKiB3aGljaCBjYXNlIGl0J3MgaGlzL2hlciBmYXVsdCB0aGF0IHRoZXJlIGFyZSBhdWRpbyBnYXBzCisJICogaW4gdGhlaXIgcGxheWJhY2suCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZW1haW5kZXIgPSBkYi0+Y291bnQgJSBkYi0+ZnJhZ3NpemU7CisJaWYgKHJlbWFpbmRlcikgeworCQlpbnQgZmlsbF9jbnQgPSBkYi0+ZnJhZ3NpemUgLSByZW1haW5kZXI7CisJCW1lbXNldChkYi0+bmV4dEluLCAwLCBmaWxsX2NudCk7CisJCWRiLT5uZXh0SW4gKz0gZmlsbF9jbnQ7CisJCWlmIChkYi0+bmV4dEluID49IGRiLT5yYXdidWYgKyBkYi0+ZG1hc2l6ZSkKKwkJCWRiLT5uZXh0SW4gLT0gZGItPmRtYXNpemU7CisJCWRiLT5jb3VudCArPSBmaWxsX2NudDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXQ4MTcyX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCBpdDgxNzJfc3RhdGUgKnMgPSAoc3RydWN0IGl0ODE3Ml9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfZGFjLndhaXQsIHdhaXQpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfYWRjLndhaXQsIHdhaXQpOworCX0KKwkKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkgeworCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplKSAKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9IGVsc2UgeworCQkJaWYgKChzaWduZWQpcy0+ZG1hX2RhYy5kbWFzaXplID49CisJCQkgICAgcy0+ZG1hX2RhYy5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCBpdDgxNzJfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqcyA9IChzdHJ1Y3QgaXQ4MTcyX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRiOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkKKwkJZGIgPSAmcy0+ZG1hX2RhYzsKKwllbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkKKwkJZGIgPSAmcy0+ZG1hX2FkYzsKKwllbHNlIHsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJICAgICB2aXJ0X3RvX3BoeXMoZGItPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCWRiLT5tYXBwZWQgPSAxOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworCisjaWZkZWYgSVQ4MTcyX1ZFUkJPU0VfREVCVUcKK3N0YXRpYyBzdHJ1Y3QgaW9jdGxfc3RyX3QgeworCXVuc2lnbmVkIGludCBjbWQ7CisJY29uc3QgY2hhciogc3RyOworfSBpb2N0bF9zdHJbXSA9IHsKKwl7U05EQ1RMX0RTUF9SRVNFVCwgIlNORENUTF9EU1BfUkVTRVQifSwKKwl7U05EQ1RMX0RTUF9TWU5DLCAiU05EQ1RMX0RTUF9TWU5DIn0sCisJe1NORENUTF9EU1BfU1BFRUQsICJTTkRDVExfRFNQX1NQRUVEIn0sCisJe1NORENUTF9EU1BfU1RFUkVPLCAiU05EQ1RMX0RTUF9TVEVSRU8ifSwKKwl7U05EQ1RMX0RTUF9HRVRCTEtTSVpFLCAiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIn0sCisJe1NORENUTF9EU1BfU0FNUExFU0laRSwgIlNORENUTF9EU1BfU0FNUExFU0laRSJ9LAorCXtTTkRDVExfRFNQX0NIQU5ORUxTLCAiU05EQ1RMX0RTUF9DSEFOTkVMUyJ9LAorCXtTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFMsICJTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFMifSwKKwl7U09VTkRfUENNX1dSSVRFX0ZJTFRFUiwgIlNPVU5EX1BDTV9XUklURV9GSUxURVIifSwKKwl7U05EQ1RMX0RTUF9QT1NULCAiU05EQ1RMX0RTUF9QT1NUIn0sCisJe1NORENUTF9EU1BfU1VCRElWSURFLCAiU05EQ1RMX0RTUF9TVUJESVZJREUifSwKKwl7U05EQ1RMX0RTUF9TRVRGUkFHTUVOVCwgIlNORENUTF9EU1BfU0VURlJBR01FTlQifSwKKwl7U05EQ1RMX0RTUF9HRVRGTVRTLCAiU05EQ1RMX0RTUF9HRVRGTVRTIn0sCisJe1NORENUTF9EU1BfU0VURk1ULCAiU05EQ1RMX0RTUF9TRVRGTVQifSwKKwl7U05EQ1RMX0RTUF9HRVRPU1BBQ0UsICJTTkRDVExfRFNQX0dFVE9TUEFDRSJ9LAorCXtTTkRDVExfRFNQX0dFVElTUEFDRSwgIlNORENUTF9EU1BfR0VUSVNQQUNFIn0sCisJe1NORENUTF9EU1BfTk9OQkxPQ0ssICJTTkRDVExfRFNQX05PTkJMT0NLIn0sCisJe1NORENUTF9EU1BfR0VUQ0FQUywgIlNORENUTF9EU1BfR0VUQ0FQUyJ9LAorCXtTTkRDVExfRFNQX0dFVFRSSUdHRVIsICJTTkRDVExfRFNQX0dFVFRSSUdHRVIifSwKKwl7U05EQ1RMX0RTUF9TRVRUUklHR0VSLCAiU05EQ1RMX0RTUF9TRVRUUklHR0VSIn0sCisJe1NORENUTF9EU1BfR0VUSVBUUiwgIlNORENUTF9EU1BfR0VUSVBUUiJ9LAorCXtTTkRDVExfRFNQX0dFVE9QVFIsICJTTkRDVExfRFNQX0dFVE9QVFIifSwKKwl7U05EQ1RMX0RTUF9NQVBJTkJVRiwgIlNORENUTF9EU1BfTUFQSU5CVUYifSwKKwl7U05EQ1RMX0RTUF9NQVBPVVRCVUYsICJTTkRDVExfRFNQX01BUE9VVEJVRiJ9LAorCXtTTkRDVExfRFNQX1NFVFNZTkNSTywgIlNORENUTF9EU1BfU0VUU1lOQ1JPIn0sCisJe1NORENUTF9EU1BfU0VURFVQTEVYLCAiU05EQ1RMX0RTUF9TRVREVVBMRVgifSwKKwl7U05EQ1RMX0RTUF9HRVRPREVMQVksICJTTkRDVExfRFNQX0dFVE9ERUxBWSJ9LAorCXtTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLLCAiU05EQ1RMX0RTUF9HRVRDSEFOTkVMTUFTSyJ9LAorCXtTTkRDVExfRFNQX0JJTkRfQ0hBTk5FTCwgIlNORENUTF9EU1BfQklORF9DSEFOTkVMIn0sCisJe09TU19HRVRWRVJTSU9OLCAiT1NTX0dFVFZFUlNJT04ifSwKKwl7U09VTkRfUENNX1JFQURfUkFURSwgIlNPVU5EX1BDTV9SRUFEX1JBVEUifSwKKwl7U09VTkRfUENNX1JFQURfQ0hBTk5FTFMsICJTT1VORF9QQ01fUkVBRF9DSEFOTkVMUyJ9LAorCXtTT1VORF9QQ01fUkVBRF9CSVRTLCAiU09VTkRfUENNX1JFQURfQklUUyJ9LAorCXtTT1VORF9QQ01fUkVBRF9GSUxURVIsICJTT1VORF9QQ01fUkVBRF9GSUxURVIifQorfTsKKyNlbmRpZiAgICAKKworc3RhdGljIGludCBpdDgxNzJfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQl1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzID0gKHN0cnVjdCBpdDgxNzJfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlhdWRpb19idWZfaW5mbyBhYmluZm87CisJY291bnRfaW5mbyBjaW5mbzsKKwlpbnQgY291bnQ7CisJaW50IHZhbCwgbWFwcGVkLCByZXQsIGRpZmY7CisKKwltYXBwZWQgPSAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSAmJiBzLT5kbWFfZGFjLm1hcHBlZCkgfHwKKwkJKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiBzLT5kbWFfYWRjLm1hcHBlZCk7CisKKyNpZmRlZiBJVDgxNzJfVkVSQk9TRV9ERUJVRworCWZvciAoY291bnQ9MDsgY291bnQ8c2l6ZW9mKGlvY3RsX3N0cikvc2l6ZW9mKGlvY3RsX3N0clswXSk7IGNvdW50KyspIHsKKwkJaWYgKGlvY3RsX3N0cltjb3VudF0uY21kID09IGNtZCkKKwkJCWJyZWFrOworCX0KKwlpZiAoY291bnQgPCBzaXplb2YoaW9jdGxfc3RyKS9zaXplb2YoaW9jdGxfc3RyWzBdKSkKKwkJZGJnKCJpb2N0bCAlcywgYXJnPTB4JTA4eCIsCisJCSAgICBpb2N0bF9zdHJbY291bnRdLnN0ciwgKHVuc2lnbmVkIGludClhcmcpOworCWVsc2UKKwkJZGJnKCJpb2N0bCB1bmtub3duLCAweCV4IiwgY21kKTsKKyNlbmRpZgorICAgIAorCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfRFVQTEVYIHwgRFNQX0NBUF9SRUFMVElNRSB8CisJCQkJRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCAoaW50ICopYXJnKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9IDA7CisJCQlzLT5kbWFfZGFjLm5leHRJbiA9IHMtPmRtYV9kYWMubmV4dE91dCA9CisJCQkJcy0+ZG1hX2RhYy5yYXdidWY7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfYWRjLmNvdW50ID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9IDA7CisJCQlzLT5kbWFfYWRjLm5leHRJbiA9IHMtPmRtYV9hZGMubmV4dE91dCA9CisJCQkJcy0+ZG1hX2FkYy5yYXdidWY7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPj0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzZXRfYWRjX3JhdGUocywgdmFsKTsKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzZXRfZGFjX3JhdGUocywgdmFsKTsKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/CisJCQkJcy0+YWRjcmF0ZSA6IHMtPmRhY3JhdGUsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJaWYgKHZhbCkKKwkJCQlzLT5jYXBjYyB8PSBDQ19TTTsKKwkJCWVsc2UKKwkJCQlzLT5jYXBjYyAmPSB+Q0NfU007CisJCQlvdXR3KHMtPmNhcGNjLCBzLT5pbytJVF9BQ19DQVBDQyk7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJaWYgKHZhbCkKKwkJCQlzLT5wY2MgfD0gQ0NfU007CisJCQllbHNlCisJCQkJcy0+cGNjICY9IH5DQ19TTTsKKwkJCW91dHcocy0+cGNjLCBzLT5pbytJVF9BQ19QQ0MpOworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlpZiAodmFsID49IDIpIHsKKwkJCQkJdmFsID0gMjsKKwkJCQkJcy0+Y2FwY2MgfD0gQ0NfU007CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJcy0+Y2FwY2MgJj0gfkNDX1NNOworCQkJCW91dHcocy0+Y2FwY2MsIHMtPmlvK0lUX0FDX0NBUENDKTsKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzd2l0Y2ggKHZhbCkgeworCQkJCWNhc2UgMToKKwkJCQkJcy0+cGNjICY9IH5DQ19TTTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAyOgorCQkJCQlzLT5wY2MgfD0gQ0NfU007CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCS8vIEZJWCEgc3VwcG9ydCBtdWx0aWNoYW5uZWw/Pz8KKwkJCQkJdmFsID0gMjsKKwkJCQkJcy0+cGNjIHw9IENDX1NNOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJb3V0dyhzLT5wY2MsIHMtPmlvK0lUX0FDX1BDQyk7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKilhcmcpOworCQkKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgKi8KKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFfEFGTVRfVTgsIChpbnQgKilhcmcpOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3RzIE9ORSBmbXQqLworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKKwkJCQkJcy0+Y2FwY2MgfD0gQ0NfREY7CisJCQkJZWxzZSB7CisJCQkJCXZhbCA9IEFGTVRfVTg7CisJCQkJCXMtPmNhcGNjICY9IH5DQ19ERjsKKwkJCQl9CisJCQkJb3V0dyhzLT5jYXBjYywgcy0+aW8rSVRfQUNfQ0FQQ0MpOworCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCXMtPnBjYyB8PSBDQ19ERjsKKwkJCQllbHNlIHsKKwkJCQkJdmFsID0gQUZNVF9VODsKKwkJCQkJcy0+cGNjICY9IH5DQ19ERjsKKwkJCQl9CisJCQkJb3V0dyhzLT5wY2MsIHMtPmlvK0lUX0FDX1BDQyk7CisJCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQkJdmFsID0gKHMtPmNhcGNjICYgQ0NfREYpID8KKwkJCQkJQUZNVF9TMTZfTEUgOiBBRk1UX1U4OworCQkJZWxzZQorCQkJCXZhbCA9IChzLT5wY2MgJiBDQ19ERikgPworCQkJCQlBRk1UX1MxNl9MRSA6IEFGTVRfVTg7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKWFyZyk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiAhcy0+ZG1hX2FkYy5zdG9wcGVkKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiAhcy0+ZG1hX2RhYy5zdG9wcGVkKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKilhcmcpOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCWVsc2UKKwkJCQlzdG9wX2FkYyhzKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkKKwkJCQlzdGFydF9kYWMocyk7CisJCQllbHNlCisJCQkJc3RvcF9kYWMocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlpZiAoIXMtPmRtYV9kYWMuc3RvcHBlZCkKKwkJCWNvdW50IC09IChzLT5kbWFfZGFjLmZyYWdzaXplIC0KKwkJCQkgIGludyhzLT5pbytJVF9BQ19QQ0RMKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gY291bnQ7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYy5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OyAgICAgIAorCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPworCQkJLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmICghcy0+ZG1hX2FkYy5zdG9wcGVkKQorCQkJY291bnQgKz0gKHMtPmRtYV9hZGMuZnJhZ3NpemUgLQorCQkJCSAgaW53KHMtPmlvK0lUX0FDX0NBUENETCkpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCWFiaW5mby5ieXRlcyA9IGNvdW50OworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9hZGMubnVtZnJhZzsKKwkJYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsgICAgICAKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8KKwkJCS1FRkFVTFQgOiAwOworCQkKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlpZiAoIXMtPmRtYV9kYWMuc3RvcHBlZCkKKwkJCWNvdW50IC09IChzLT5kbWFfZGFjLmZyYWdzaXplIC0KKwkJCQkgIGludyhzLT5pbytJVF9BQ19QQ0RMKSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJcmV0dXJuIHB1dF91c2VyKGNvdW50LCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljaW5mby5ieXRlcyA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXM7CisJCWNvdW50ID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJaWYgKCFzLT5kbWFfYWRjLnN0b3BwZWQpIHsKKwkJCWRpZmYgPSBzLT5kbWFfYWRjLmZyYWdzaXplIC0gaW53KHMtPmlvK0lUX0FDX0NBUENETCk7CisJCQljb3VudCArPSBkaWZmOworCQkJY2luZm8uYnl0ZXMgKz0gZGlmZjsKKwkJCWNpbmZvLnB0ciA9IGlubChzLT5pbytzLT5kbWFfYWRjLmN1ckJ1ZlB0cikgLQorCQkJCXMtPmRtYV9hZGMuZG1hYWRkcjsKKwkJfSBlbHNlCisJCQljaW5mby5wdHIgPSB2aXJ0X3RvX2J1cyhzLT5kbWFfYWRjLm5leHRJbikgLQorCQkJCXMtPmRtYV9hZGMuZG1hYWRkcjsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSBzLT5kbWFfYWRjLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJY2luZm8uYmxvY2tzID0gY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzOworCQljb3VudCA9IHMtPmRtYV9kYWMuY291bnQ7CisJCWlmICghcy0+ZG1hX2RhYy5zdG9wcGVkKSB7CisJCQlkaWZmID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZSAtIGludyhzLT5pbytJVF9BQ19DQVBDREwpOworCQkJY291bnQgLT0gZGlmZjsKKwkJCWNpbmZvLmJ5dGVzICs9IGRpZmY7CisJCQljaW5mby5wdHIgPSBpbmwocy0+aW8rcy0+ZG1hX2RhYy5jdXJCdWZQdHIpIC0KKwkJCQlzLT5kbWFfZGFjLmRtYWFkZHI7CisJCX0gZWxzZQorCQkJY2luZm8ucHRyID0gdmlydF90b19idXMocy0+ZG1hX2RhYy5uZXh0T3V0KSAtCisJCQkJcy0+ZG1hX2RhYy5kbWFhZGRyOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCQlzLT5kbWFfZGFjLmNvdW50ICY9IHMtPmRtYV9kYWMuZnJhZ3NpemUtMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworCQljaW5mby5ibG9ja3MgPSBjb3VudCA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgKGludCAqKWFyZyk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLmZyYWdzaXplLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IDQ7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9IDQ7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKSB8fAorCQkgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMiAmJiB2YWwgIT0gNCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gdmFsOworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSB2YWw7CisJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJcmV0dXJuIHJldDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/CisJCQkJcy0+YWRjcmF0ZSA6IHMtPmRhY3JhdGUsIChpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlyZXR1cm4gcHV0X3VzZXIoKHMtPmNhcGNjICYgQ0NfU00pID8gMiA6IDEsCisJCQkJCShpbnQgKilhcmcpOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnBjYyAmIENDX1NNKSA/IDIgOiAxLAorCQkJCQkoaW50ICopYXJnKTsKKwkgICAgCisJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXJldHVybiBwdXRfdXNlcigocy0+Y2FwY2MgJiBDQ19ERikgPyAxNiA6IDgsCisJCQkJCShpbnQgKilhcmcpOworCQllbHNlCisJCQlyZXR1cm4gcHV0X3VzZXIoKHMtPnBjYyAmIENDX0RGKSA/IDE2IDogOCwKKwkJCQkJKGludCAqKWFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIG1peGRldl9pb2N0bCgmcy0+Y29kZWMsIGNtZCwgYXJnKTsKK30KKworCitzdGF0aWMgaW50IGl0ODE3Ml9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBpdDgxNzJfc3RhdGUgKnM7CisJaW50IHJldDsKKyAgICAKKyNpZmRlZiBJVDgxNzJfVkVSQk9TRV9ERUJVRworCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykKKwkJZGJnKCIlczogbm9uLWJsb2NraW5nIiwgX19GVU5DVElPTl9fKTsKKwllbHNlCisJCWRiZygiJXM6IGJsb2NraW5nIiwgX19GVU5DVElPTl9fKTsKKyNlbmRpZgorCQorCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgaXQ4MTcyX3N0YXRlLCBkZXZzKTsKKwkJaWYgKCEoKHMtPmRldl9hdWRpbyBeIG1pbm9yKSAmIH4weGYpKQorCQkJYnJlYWs7CisJfQorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBmaWxlLT5mX21vZGUpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9CisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9IDA7CisJCXMtPmNhcGNjICY9IH4oQ0NfU00gfCBDQ19ERik7CisJCXNldF9hZGNfcmF0ZShzLCA4MDAwKTsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCXMtPmNhcGNjIHw9IENDX0RGOworCQlvdXR3KHMtPmNhcGNjLCBzLT5pbytJVF9BQ19DQVBDQyk7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjLm9zc21heGZyYWdzID0KKwkJCXMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzID0gMDsKKwkJcy0+cGNjICY9IH4oQ0NfU00gfCBDQ19ERik7CisJCXNldF9kYWNfcmF0ZShzLCA4MDAwKTsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCXMtPnBjYyB8PSBDQ19ERjsKKwkJb3V0dyhzLT5wY2MsIHMtPmlvK0lUX0FDX1BDQyk7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKyAgICAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlzLT5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBpdDgxNzJfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzID0gKHN0cnVjdCBpdDgxNzJfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKyNpZmRlZiBJVDgxNzJfVkVSQk9TRV9ERUJVRworCWRiZyhfX0ZVTkNUSU9OX18pOworI2VuZGlmCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWRyYWluX2RhYyhzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJZG93bigmcy0+b3Blbl9zZW0pOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdG9wX2RhYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9kYWMpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdG9wX2FkYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9hZGMpOworCX0KKwlzLT5vcGVuX21vZGUgJj0gKCh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSk7CisJdXAoJnMtPm9wZW5fc2VtKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGl0ODE3Ml9hdWRpb19mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkucmVhZAkJPSBpdDgxNzJfcmVhZCwKKwkud3JpdGUJCT0gaXQ4MTcyX3dyaXRlLAorCS5wb2xsCQk9IGl0ODE3Ml9wb2xsLAorCS5pb2N0bAkJPSBpdDgxNzJfaW9jdGwsCisJLm1tYXAJCT0gaXQ4MTcyX21tYXAsCisJLm9wZW4JCT0gaXQ4MTcyX29wZW4sCisJLnJlbGVhc2UJPSBpdDgxNzJfcmVsZWFzZSwKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCB3ZSdsbCBjcmVhdGUgYSBwcm9jIGRldmljZSB0aGF0IGR1bXBzIHRoZQorICogQ09ERUMgY2hpcHN0YXRlCisgKi8KKworI2lmZGVmIElUODE3Ml9ERUJVRworc3RhdGljIGludCBwcm9jX2l0ODE3Ml9kdW1wIChjaGFyICpidWYsIGNoYXIgKipzdGFydCwgb2ZmX3QgZnBvcywKKwkJCSAgICAgaW50IGxlbmd0aCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGl0ODE3Ml9zdGF0ZSAqczsKKwlpbnQgY250LCBsZW4gPSAwOworCisJaWYgKGxpc3RfZW1wdHkoJmRldnMpKQorCQlyZXR1cm4gMDsKKwlzID0gbGlzdF9lbnRyeShkZXZzLm5leHQsIHN0cnVjdCBpdDgxNzJfc3RhdGUsIGRldnMpOworCisJLyogcHJpbnQgb3V0IGhlYWRlciAqLworCWxlbiArPSBzcHJpbnRmKGJ1ZiArIGxlbiwgIlxuXHRcdElUODE3MiBBdWRpbyBEZWJ1Z1xuXG4iKTsKKworCS8vIHByaW50IG91dCBkaWdpdGFsIGNvbnRyb2xsZXIgc3RhdGUKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiSVQ4MTcyIEF1ZGlvIENvbnRyb2xsZXIgcmVnaXN0ZXJzXG4iKTsKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwljbnQ9MDsKKwl3aGlsZSAoY250IDwgMHg3MikgeworCQlpZiAoY250ID09IElUX0FDX1BDQjFTVEEgfHwgY250ID09IElUX0FDX1BDQjJTVEEgfHwKKwkJICAgIGNudCA9PSBJVF9BQ19DQVBCMVNUQSB8fCBjbnQgPT0gSVRfQUNfQ0FQQjJTVEEgfHwKKwkJICAgIGNudCA9PSBJVF9BQ19QRkRQKSB7CisJCQlsZW4rPSBzcHJpbnRmIChidWYgKyBsZW4sICJyZWcgJTAyeCA9ICUwOHhcbiIsCisJCQkJICAgICAgIGNudCwgaW5sKHMtPmlvK2NudCkpOworCQkJY250ICs9IDQ7CisJCX0gZWxzZSB7CisJCQlsZW4rPSBzcHJpbnRmIChidWYgKyBsZW4sICJyZWcgJTAyeCA9ICUwNHhcbiIsCisJCQkJICAgICAgIGNudCwgaW53KHMtPmlvK2NudCkpOworCQkJY250ICs9IDI7CisJCX0KKwl9CisgICAgCisJLyogcHJpbnQgb3V0IENPREVDIHN0YXRlICovCisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgIlxuQUM5NyBDT0RFQyByZWdpc3RlcnNcbiIpOworCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlmb3IgKGNudD0wOyBjbnQgPD0gMHg3ZTsgY250ID0gY250ICsyKQorCQlsZW4rPSBzcHJpbnRmIChidWYgKyBsZW4sICJyZWcgJTAyeCA9ICUwNHhcbiIsCisJCQkgICAgICAgY250LCByZGNvZGVjKCZzLT5jb2RlYywgY250KSk7CisKKwlpZiAoZnBvcyA+PWxlbil7CisJCSpzdGFydCA9IGJ1ZjsKKwkJKmVvZiA9MTsKKwkJcmV0dXJuIDA7CisJfQorCSpzdGFydCA9IGJ1ZiArIGZwb3M7CisJaWYgKChsZW4gLT0gZnBvcykgPiBsZW5ndGgpCisJCXJldHVybiBsZW5ndGg7CisJKmVvZiA9MTsKKwlyZXR1cm4gbGVuOworCit9CisjZW5kaWYgLyogSVQ4MTcyX0RFQlVHICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBtYXhpbXVtIG51bWJlciBvZiBkZXZpY2VzOyBvbmx5IHVzZWQgZm9yIGNvbW1hbmQgbGluZSBwYXJhbXMgKi8KKyNkZWZpbmUgTlJfREVWSUNFIDUKKworc3RhdGljIGludCBzcGRpZltOUl9ERVZJQ0VdOworc3RhdGljIGludCBpMnNfZm10W05SX0RFVklDRV07CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGV2aW5kZXg7CisKK01PRFVMRV9QQVJNKHNwZGlmLCAiMS0iIF9fTU9EVUxFX1NUUklORyhOUl9ERVZJQ0UpICJpIik7CitNT0RVTEVfUEFSTV9ERVNDKHNwZGlmLCAiaWYgMSB0aGUgUy9QRElGIGRpZ2l0YWwgb3V0cHV0IGlzIGVuYWJsZWQiKTsKK01PRFVMRV9QQVJNKGkyc19mbXQsICIxLSIgX19NT0RVTEVfU1RSSU5HKE5SX0RFVklDRSkgImkiKTsKK01PRFVMRV9QQVJNX0RFU0MoaTJzX2ZtdCwgInRoZSBmb3JtYXQgb2YgSTJTIik7CisKK01PRFVMRV9BVVRIT1IoIk1vbnRhIFZpc3RhIFNvZnR3YXJlLCBzdGV2ZWxAbXZpc3RhLmNvbSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJJVDgxNzIgQXVkaW8gRHJpdmVyIik7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCBpdDgxNzJfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwKKwkJCQkgIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lpZCkKK3sKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzOworCWludCBpLCB2YWw7CisJdW5zaWduZWQgc2hvcnQgcGNpc3IsIHZvbDsKKwl1bnNpZ25lZCBjaGFyIGxlZ2FjeSwgaW1jOworCWNoYXIgcHJvY19zdHJbODBdOworICAgIAorCWlmIChwY2lkZXYtPmlycSA9PSAwKSAKKwkJcmV0dXJuIC0xOworCisJaWYgKCEocyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBpdDgxNzJfc3RhdGUpLCBHRlBfS0VSTkVMKSkpIHsKKwkJZXJyKCJhbGxvYyBvZiBkZXZpY2Ugc3RydWN0IGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCQorCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IGl0ODE3Ml9zdGF0ZSkpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9hZGMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXQpOworCWluaXRfTVVURVgoJnMtPm9wZW5fc2VtKTsKKwlzcGluX2xvY2tfaW5pdCgmcy0+bG9jayk7CisJcy0+ZGV2ID0gcGNpZGV2OworCXMtPmlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CisJcy0+aXJxID0gcGNpZGV2LT5pcnE7CisJcy0+dmVuZG9yID0gcGNpZGV2LT52ZW5kb3I7CisJcy0+ZGV2aWNlID0gcGNpZGV2LT5kZXZpY2U7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZzLT5yZXYpOworCXMtPmNvZGVjLnByaXZhdGVfZGF0YSA9IHM7CisJcy0+Y29kZWMuaWQgPSAwOworCXMtPmNvZGVjLmNvZGVjX3JlYWQgPSByZGNvZGVjOworCXMtPmNvZGVjLmNvZGVjX3dyaXRlID0gd3Jjb2RlYzsKKwlzLT5jb2RlYy5jb2RlY193YWl0ID0gd2FpdGNvZGVjOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzLT5pbywgcGNpX3Jlc291cmNlX2xlbihwY2lkZXYsMCksCisJCQkgICAgSVQ4MTcyX01PRFVMRV9OQU1FKSkgeworCQllcnIoImlvIHBvcnRzICUjbHgtPiUjbHggaW4gdXNlIiwKKwkJICAgIHMtPmlvLCBzLT5pbyArIHBjaV9yZXNvdXJjZV9sZW4ocGNpZGV2LDApLTEpOworCQlnb3RvIGVycl9yZWdpb247CisJfQorCWlmIChyZXF1ZXN0X2lycShzLT5pcnEsIGl0ODE3Ml9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwKKwkJCUlUODE3Ml9NT0RVTEVfTkFNRSwgcykpIHsKKwkJZXJyKCJpcnEgJXUgaW4gdXNlIiwgcy0+aXJxKTsKKwkJZ290byBlcnJfaXJxOworCX0KKworCWluZm8oIklPIGF0ICUjbHgsIElSUSAlZCIsIHMtPmlvLCBzLT5pcnEpOworCisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCWlmICgocy0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZpdDgxNzJfYXVkaW9fZm9wcywgLTEpKSA8IDApCisJCWdvdG8gZXJyX2RldjE7CisJaWYgKChzLT5jb2RlYy5kZXZfbWl4ZXIgPQorCSAgICAgcmVnaXN0ZXJfc291bmRfbWl4ZXIoJml0ODE3Ml9taXhlcl9mb3BzLCAtMSkpIDwgMCkKKwkJZ290byBlcnJfZGV2MjsKKworI2lmZGVmIElUODE3Ml9ERUJVRworCS8qIGluaXRpYWxpemUgdGhlIGRlYnVnIHByb2MgZGV2aWNlICovCisJcy0+cHMgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5KElUODE3Ml9NT0RVTEVfTkFNRSwgMCwgTlVMTCwKKwkJCQkgICAgICAgcHJvY19pdDgxNzJfZHVtcCwgTlVMTCk7CisjZW5kaWYgLyogSVQ4MTcyX0RFQlVHICovCisJCisJLyoKKwkgKiBSZXNldCB0aGUgQXVkaW8gZGV2aWNlIHVzaW5nIHRoZSBJVDgxNzIgUENJIFJlc2V0IHJlZ2lzdGVyLiBUaGlzCisJICogY3JlYXRlcyBhbiBhdWRpYmxlIGRvdWJsZSBjbGljayBvbiBhIHNwZWFrZXIgY29ubmVjdGVkIHRvIExpbmUtb3V0LgorCSAqLworCUlUX0lPX1JFQUQxNihJVF9QTV9QQ0lTUiwgcGNpc3IpOworCXBjaXNyIHw9IElUX1BNX1BDSVNSX0FDU1I7CisJSVRfSU9fV1JJVEUxNihJVF9QTV9QQ0lTUiwgcGNpc3IpOworCS8qIHdhaXQgdXAgdG8gMTAwbXNlYyBmb3IgcmVzZXQgdG8gY29tcGxldGUgKi8KKwlmb3IgKGk9MDsgcGNpc3IgJiBJVF9QTV9QQ0lTUl9BQ1NSOyBpKyspIHsKKwkJaXQ4MTcyX2RlbGF5KDEwKTsKKwkJaWYgKGkgPT0gMTApCisJCQlicmVhazsKKwkJSVRfSU9fUkVBRDE2KElUX1BNX1BDSVNSLCBwY2lzcik7CisJfQorCWlmIChpID09IDEwKSB7CisJCWVycigiY2hpcCByZXNldCB0aW1lb3V0ISIpOworCQlnb3RvIGVycl9kZXYzOworCX0KKyAgICAKKwkvKiBlbmFibGUgcGNpIGlvIGFuZCBidXMgbWFzdGVyaW5nICovCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpCisJCWdvdG8gZXJyX2RldjM7CisJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsKKworCS8qIGdldCBvdXQgb2YgbGVnYWN5IG1vZGUgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZSAocGNpZGV2LCAweDQwLCAmbGVnYWN5KTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUgKHBjaWRldiwgMHg0MCwgbGVnYWN5ICYgfjEpOworICAgIAorCXMtPnNwZGlmX3ZvbHVtZSA9IC0xOworCS8qIGNoZWNrIHRvIHNlZSBpZiBzL3BkaWYgbW9kZSBpcyBiZWluZyByZXF1ZXN0ZWQgKi8KKwlpZiAoc3BkaWZbZGV2aW5kZXhdKSB7CisJCWluZm8oImVuYWJsaW5nIFMvUERJRiBvdXRwdXQiKTsKKwkJcy0+c3BkaWZfdm9sdW1lID0gMDsKKwkJb3V0YihHQ19TT0UsIHMtPmlvK0lUX0FDX0dDKTsKKwl9IGVsc2UgeworCQlpbmZvKCJkaXNhYmxpbmcgUy9QRElGIG91dHB1dCIpOworCQlvdXRiKDAsIHMtPmlvK0lUX0FDX0dDKTsKKwl9CisgICAgCisJLyogY2hlY2sgdG8gc2VlIGlmIEkyUyBmb3JtYXQgcmVxdWVzdGVkICovCisJaWYgKGkyc19mbXRbZGV2aW5kZXhdKSB7CisJCWluZm8oInNldHRpbmcgSTJTIGZvcm1hdCB0byAweCUwMngiLCBpMnNfZm10W2RldmluZGV4XSk7CisJCW91dGIoaTJzX2ZtdFtkZXZpbmRleF0sIHMtPmlvK0lUX0FDX0kyU01DKTsKKwl9IGVsc2UgeworCQlvdXRiKEkyU01DX0kyU0ZfSTJTLCBzLT5pbytJVF9BQ19JMlNNQyk7CisJfQorCisJLyogY29sZCByZXNldCB0aGUgQUM5NyAqLworCW91dHcoQ09ERUNDX0NSLCBzLT5pbytJVF9BQ19DT0RFQ0MpOworCXVkZWxheSgxMDAwKTsKKwlvdXR3KDAsIHMtPmlvK0lUX0FDX0NPREVDQyk7CisJLyogbmVlZCB0byBkZWxheSBhcm91bmQgNTAwbXNlYyhibGVlY2gpIHRvIGdpdmUKKwkgICBzb21lIENPREVDcyBlbm91Z2ggdGltZSB0byB3YWtldXAgKi8KKwlpdDgxNzJfZGVsYXkoNTAwKTsKKyAgICAKKwkvKiBBQzk3IHdhcm0gcmVzZXQgdG8gc3RhcnQgdGhlIGJpdGNsayAqLworCW91dHcoQ09ERUNDX1dSLCBzLT5pbytJVF9BQ19DT0RFQ0MpOworCXVkZWxheSgxMDAwKTsKKwlvdXR3KDAsIHMtPmlvK0lUX0FDX0NPREVDQyk7CisgICAgCisJLyogY29kZWMgaW5pdCAqLworCWlmICghYWM5N19wcm9iZV9jb2RlYygmcy0+Y29kZWMpKQorCQlnb3RvIGVycl9kZXYzOworCisJLyogYWRkIEkyUyBhcyBhbGxvd2FibGUgcmVjb3JkaW5nIHNvdXJjZSAqLworCXMtPmNvZGVjLnJlY29yZF9zb3VyY2VzIHw9IFNPVU5EX01BU0tfSTJTOworCQorCS8qIEVuYWJsZSBWb2x1bWUgYnV0dG9uIGludGVycnVwdHMgKi8KKwlpbWMgPSBpbmIocy0+aW8rSVRfQUNfSU1DKTsKKwlvdXRiKGltYyAmIH5JTUNfVkNJTSwgcy0+aW8rSVRfQUNfSU1DKTsKKworCS8qIFVuLW11dGUgUENNIGFuZCBGTSBvdXQgb24gdGhlIGNvbnRyb2xsZXIgKi8KKwl2b2wgPSBpbncocy0+aW8rSVRfQUNfUENNT1YpOworCW91dHcodm9sICYgflBDTU9WX1BDTU9NLCBzLT5pbytJVF9BQ19QQ01PVik7CisJdm9sID0gaW53KHMtPmlvK0lUX0FDX0ZNT1YpOworCW91dHcodm9sICYgfkZNT1ZfRk1PTSwgcy0+aW8rSVRfQUNfRk1PVik7CisgICAgCisJLyogc2V0IGNoYW5uZWwgZGVmYXVsdHMgdG8gOC1iaXQsIG1vbm8sIDggS2h6ICovCisJcy0+cGNjID0gMDsKKwlzLT5jYXBjYyA9IDA7CisJc2V0X2RhY19yYXRlKHMsIDgwMDApOworCXNldF9hZGNfcmF0ZShzLCA4MDAwKTsKKworCS8qIHNldCBtaWMgdG8gYmUgdGhlIHJlY29yZGluZyBzb3VyY2UgKi8KKwl2YWwgPSBTT1VORF9NQVNLX01JQzsKKwltaXhkZXZfaW9jdGwoJnMtPmNvZGVjLCBTT1VORF9NSVhFUl9XUklURV9SRUNTUkMsCisJCSAgICAgKHVuc2lnbmVkIGxvbmcpJnZhbCk7CisKKwkvKiBtdXRlIEFDJzk3IG1hc3RlciBhbmQgUENNIHdoZW4gaW4gUy9QRElGIG1vZGUgKi8KKwlpZiAocy0+c3BkaWZfdm9sdW1lICE9IC0xKSB7CisJCXZhbCA9IDB4MDAwMDsKKwkJcy0+Y29kZWMubWl4ZXJfaW9jdGwoJnMtPmNvZGVjLCBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsCisJCQkJICAgICAodW5zaWduZWQgbG9uZykmdmFsKTsKKwkJcy0+Y29kZWMubWl4ZXJfaW9jdGwoJnMtPmNvZGVjLCBTT1VORF9NSVhFUl9XUklURV9QQ00sCisJCQkJICAgICAodW5zaWduZWQgbG9uZykmdmFsKTsKKwl9CisgICAgCisjaWZkZWYgSVQ4MTcyX0RFQlVHCisJc3ByaW50Zihwcm9jX3N0ciwgImRyaXZlci8lcy8lZC9hYzk3IiwgSVQ4MTcyX01PRFVMRV9OQU1FLAorCQlzLT5jb2RlYy5pZCk7CisJcy0+YWM5N19wcyA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkgKHByb2Nfc3RyLCAwLCBOVUxMLAorCQkJCQkgICAgIGFjOTdfcmVhZF9wcm9jLCAmcy0+Y29kZWMpOworI2VuZGlmCisgICAgCisJLyogc3RvcmUgaXQgaW4gdGhlIGRyaXZlciBmaWVsZCAqLworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsIHMpOworCXBjaWRldi0+ZG1hX21hc2sgPSAweGZmZmZmZmZmOworCS8qIHB1dCBpdCBpbnRvIGRyaXZlciBsaXN0ICovCisJbGlzdF9hZGRfdGFpbCgmcy0+ZGV2cywgJmRldnMpOworCS8qIGluY3JlbWVudCBkZXZpbmRleCAqLworCWlmIChkZXZpbmRleCA8IE5SX0RFVklDRS0xKQorCQlkZXZpbmRleCsrOworCXJldHVybiAwOworCisgZXJyX2RldjM6CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5jb2RlYy5kZXZfbWl4ZXIpOworIGVycl9kZXYyOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisgZXJyX2RldjE6CisJZXJyKCJjYW5ub3QgcmVnaXN0ZXIgbWlzYyBkZXZpY2UiKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworIGVycl9pcnE6CisJcmVsZWFzZV9yZWdpb24ocy0+aW8sIHBjaV9yZXNvdXJjZV9sZW4ocGNpZGV2LDApKTsKKyBlcnJfcmVnaW9uOgorCWtmcmVlKHMpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IGl0ODE3Ml9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgaXQ4MTcyX3N0YXRlICpzID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoIXMpCisJCXJldHVybjsKKwlsaXN0X2RlbCgmcy0+ZGV2cyk7CisjaWZkZWYgSVQ4MTcyX0RFQlVHCisJaWYgKHMtPnBzKQorCQlyZW1vdmVfcHJvY19lbnRyeShJVDgxNzJfTU9EVUxFX05BTUUsIE5VTEwpOworI2VuZGlmIC8qIElUODE3Ml9ERUJVRyAqLworCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCWZyZWVfaXJxKHMtPmlycSwgcyk7CisJcmVsZWFzZV9yZWdpb24ocy0+aW8sIHBjaV9yZXNvdXJjZV9sZW4oZGV2LDApKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+Y29kZWMuZGV2X21peGVyKTsKKwlrZnJlZShzKTsKKwlwY2lfc2V0X2RydmRhdGEoZGV2LCBOVUxMKTsKK30KKworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpZF90YWJsZVtdID0geworCXsgUENJX1ZFTkRPUl9JRF9JVEUsIFBDSV9ERVZJQ0VfSURfSVRFX0lUODE3MkdfQVVESU8sIFBDSV9BTllfSUQsCisJICBQQ0lfQU5ZX0lELCAwLCAwIH0sCisJeyAwLCB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgaXQ4MTcyX2RyaXZlciA9IHsKKwkubmFtZSA9IElUODE3Ml9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUgPSBpZF90YWJsZSwKKwkucHJvYmUgPSBpdDgxNzJfcHJvYmUsCisJLnJlbW92ZSA9IF9fZGV2ZXhpdF9wKGl0ODE3Ml9yZW1vdmUpCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2l0ODE3Mih2b2lkKQoreworCWluZm8oInZlcnNpb24gdjAuNSB0aW1lICIgX19USU1FX18gIiAiIF9fREFURV9fKTsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZpdDgxNzJfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfaXQ4MTcyKHZvaWQpCit7CisJaW5mbygidW5sb2FkaW5nIik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZpdDgxNzJfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9pdDgxNzIpOworbW9kdWxlX2V4aXQoY2xlYW51cF9pdDgxNzIpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBNT0RVTEUKKworLyogZm9ybWF0IGlzOiBpdDgxNzI9W3NwZGlmXSxbaTJzOjxJMlMgZm9ybWF0Pl0gKi8KKworc3RhdGljIGludCBfX2luaXQgaXQ4MTcyX3NldHVwKGNoYXIgKm9wdGlvbnMpCit7CisJY2hhciogdGhpc19vcHQ7CisJc3RhdGljIHVuc2lnbmVkIF9faW5pdGRhdGEgbnJfZGV2ID0gMDsKKworCWlmIChucl9kZXYgPj0gTlJfREVWSUNFKQorCQlyZXR1cm4gMDsKKworCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCisJCXJldHVybiAwOworCisJd2hpbGUgKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSB7CisJCWlmICghKnRoaXNfb3B0KQorCQkJY29udGludWU7CisJCWlmICghc3RybmNtcCh0aGlzX29wdCwgInNwZGlmIiwgNSkpIHsKKwkJCXNwZGlmW25yX2Rldl0gPSAxOworCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiaTJzOiIsIDQpKSB7CisJCQlpZiAoIXN0cm5jbXAodGhpc19vcHQrNCwgImRhYyIsIDMpKQorCQkJCWkyc19mbXRbbnJfZGV2XSA9IEkyU01DX0kyU0ZfREFDOworCQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQrNCwgImFkYyIsIDMpKQorCQkJCWkyc19mbXRbbnJfZGV2XSA9IEkyU01DX0kyU0ZfQURDOworCQkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQrNCwgImkycyIsIDMpKQorCQkJCWkyc19mbXRbbnJfZGV2XSA9IEkyU01DX0kyU0ZfSTJTOworCQl9CisJfQorCisJbnJfZGV2Kys7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIml0ODE3Mj0iLCBpdDgxNzJfc2V0dXApOworCisjZW5kaWYgLyogTU9EVUxFICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvaXdtZW0uaCBiL3NvdW5kL29zcy9pd21lbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzQ1ZmJjCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2l3bWVtLmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIHNvdW5kL2l3bWVtLmgKKyAqCisgKiBEUkFNIHNpemUgZW5jb2RpbmcgdGFibGUgZm9yIEFNRCBJbnRlcndhdmUgY2hpcC4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqIENoYW5nZXM6CisgKiBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6CTogYWRkZWQgX19pbml0ZGF0YSB0byBtZW1fZGVjb2RlCisgKi8KKworCisjZGVmaW5lIEsgMTAyNAorI2RlZmluZSBNICgxMDI0KkspCitzdGF0aWMgaW50IG1lbV9kZWNvZGVbXVs0XSBfX2luaXRkYXRhID0KK3sKKy8qCUJhbmswCUJhbmsxCUJhbmsyCUJhbmszCUVuY29kaW5nIGJpdHMJKi8KKwl7MjU2KkssCTAsCTAsCTB9LAkJLyogIDAgKi8KKwl7MjU2KkssCTI1NipLLAkwLAkwfSwJCS8qICAxICovCisJezI1NipLLAkyNTYqSywJMjU2KkssCTI1NipLfSwJCS8qICAyICovCisJezI1NipLLAkxKk0sCTAsCTB9LAkJLyogIDMgKi8KKwl7MjU2KkssCTEqTSwJMSpNLAkxKk19LAkJLyogIDQgKi8KKwl7MjU2KkssCTI1NipLLAkxKk0sCTB9LAkJLyogIDUgKi8KKwl7MjU2KkssCTI1NipLLAkxKk0sCTEqTX0sCQkvKiAgNiAqLworCXsxKk0sCTAsCTAsCTB9LAkJLyogIDcgKi8KKwl7MSpNLAkxKk0sCTAsCTB9LAkJLyogIDggKi8KKwl7MSpNLAkxKk0sCTEqTSwJMSpNfSwJCS8qICA5ICovCisJezQqTSwJMCwJMCwJMH0sCQkvKiAxMCAqLworCXs0Kk0sCTQqTSwJMCwJMH0sCQkvKiAxMSAqLworCXs0Kk0sCTQqTSwJNCpNLAk0Kk19CQkvKiAxMiAqLworfTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9rYWhsdWEuYyBiL3NvdW5kL29zcy9rYWhsdWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDhjNWVmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL2thaGx1YS5jCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICoJSW5pdGlhbGlzYXRpb24gY29kZSBmb3IgQ3lyaXgvTmF0U2VtaSBWU0ExIHNvZnRhdWRpbworICoKKyAqCShDKSBDb3B5cmlnaHQgMjAwMyBSZWQgSGF0IEluYyA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqIFhwcmVzc0F1ZGlvKHRtKSBpcyB1c2VkIG9uIHRoZSBDeXJpeCBNZWRpYUdYIChub3cgTmF0U2VtaSBHZW9kZSkgc3lzdGVtcy4KKyAqIFRoZSBvbGRlciB2ZXJzaW9uIChWU0ExKSBwcm92aWRlcyBmYWlybHkgZ29vZCBzb3VuZGJsYXN0ZXIgZW11bGF0aW9uCisgKiBhbHRob3VnaCB0aGVyZSBhcmUgYSBjb3VwbGUgb2YgYnVnczogbGFyZ2UgRE1BIGJ1ZmZlcnMgYnJlYWsgcmVjb3JkLAorICogYW5kIHRoZSBNUFUgZXZlbnQgaGFuZGxpbmcgc2VlbXMgc3VzcGVjdC4gVlNBMiBhbGxvd3MgdGhlIG5hdGl2ZSBkcml2ZXIKKyAqIHRvIGNvbnRyb2wgdGhlIEFDOTcgYXVkaW8gZW5naW5lIGRpcmVjdGx5IGFuZCByZXF1aXJlcyBhIGRpZmZlcmVudCBkcml2ZXIuCisgKgorICogVGhhbmtzIHRvIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgZm9yIHByb3ZpZGluZyB0aGUgbmVlZGVkIGluZm9ybWF0aW9uCisgKiBvbiB0aGUgWHByZXNzQXVkaW8odG0pIGludGVybmFscy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogVE8gRE86CisgKglJbnZlc3RpZ2F0ZSB3aGV0aGVyIHdlIGNhbiBwb3J0YWJseSBzdXBwb3J0IENvZ25hYyAoNTUyMCkgaW4gdGhlCisgKglzYW1lIG1hbm5lci4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgInNiLmgiCisKKy8qCisgKglSZWFkIGEgc291bmRibGFzdGVyIGNvbXBhdGlibGUgbWl4ZXIgcmVnaXN0ZXIuCisgKglJbiB0aGlzIGNhc2Ugd2UgYXJlIGFjdHVhbGx5IHJlYWRpbmcgYW4gU01JIHRyYXAKKyAqCW5vdCByZWFsIGhhcmR3YXJlLgorICovCisKK3N0YXRpYyB1OCBfX2RldmluaXQgbWl4ZXJfcmVhZCh1bnNpZ25lZCBsb25nIGlvLCB1OCByZWcpCit7CisJb3V0YihyZWcsIGlvICsgNCk7CisJdWRlbGF5KDIwKTsKKwlyZWcgPSBpbmIoaW8gKyA1KTsKKwl1ZGVsYXkoMjApOworCXJldHVybiByZWc7Cit9CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHByb2JlX29uZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwlzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWc7CisJdW5zaWduZWQgbG9uZyBiYXNlOworCXZvaWQgX19pb21lbSAqbWVtOworCXVuc2lnbmVkIGxvbmcgaW87CisJdTE2IG1hcDsKKwl1OCBpcnEsIGRtYTgsIGRtYTE2OworCWludCBvbGRxdWlldDsKKwlleHRlcm4gaW50IHNiX2JlX3F1aWV0OworCQkKKwliYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOworCWlmKGJhc2UgPT0gMFVMKQorCQlyZXR1cm4gMTsKKwkKKwltZW0gPSBpb3JlbWFwKGJhc2UsIDEyOCk7CisJaWYobWVtID09IDBVTCkKKwkJcmV0dXJuIDE7CisJbWFwID0gcmVhZHcobWVtICsgMHgxOCk7CS8qIFJlYWQgdGhlIFNNSSBlbmFibGVzICovCisJaW91bm1hcChtZW0pOworCQorCS8qIE1hcCBiaXRzCisJCTA6MQkqIDB4MjAgKyAweDIwMCA9IHNiIGJhc2UKKwkJMglzYiBlbmFibGUKKwkJMwlhZGxpYiBlbmFibGUKKwkJNQlNUFUgZW5hYmxlIDB4MzMwCisJCTYJTVBVIGVuYWJsZSAweDMwMAorCQkKKwkgICBUaGUgb3RoZXIgYml0cyBtYXkgYmUgdXNlZCBpbnRlcm5hbGx5IHNvIG11c3QgYmUgbWFza2VkICovCisKKwlpbyA9IDB4MjIwICsgMHgyMCAqIChtYXAgJiAzKTsJICAgCisJCisJaWYobWFwICYgKDE8PDIpKQorCQlwcmludGsoS0VSTl9JTkZPICJrYWhsdWE6IFhwcmVzc0F1ZGlvIGF0IDB4JWx4XG4iLCBpbyk7CisJZWxzZQorCQlyZXR1cm4gMTsKKwkJCisJaWYobWFwICYgKDE8PDUpKQorCQlwcmludGsoS0VSTl9JTkZPICJrYWhsdWE6IE1QVSBhdCAweDMwMFxuIik7CisJZWxzZSBpZihtYXAgJiAoMTw8NikpCisJCXByaW50ayhLRVJOX0lORk8gImthaGx1YTogTVBVIGF0IDB4MzMwXG4iKTsKKwkKKwlpcnEgPSBtaXhlcl9yZWFkKGlvLCAweDgwKSAmIDB4MEY7CisJZG1hOCA9IG1peGVyX3JlYWQoaW8sIDB4ODEpOworCisJLy8gcHJpbnRrKCJJUlE9JXggTUFQPSV4IERNQT0leFxuIiwgaXJxLCBtYXAsIGRtYTgpOworCQorCWlmKGRtYTggJiAweDIwKQorCQlkbWExNiA9IDU7CisJZWxzZSBpZihkbWE4ICYgMHg0MCkKKwkJZG1hMTYgPSA2OworCWVsc2UgaWYoZG1hOCAmIDB4ODApCisJCWRtYTE2ID0gNzsKKwllbHNlCisJeworCQlwcmludGsoS0VSTl9FUlIgImthaGx1YTogTm8gMTZiaXQgRE1BIGVuYWJsZWQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCQkKKwlpZihkbWE4ICYgMHgwMSkKKwkJZG1hOCA9IDA7CisJZWxzZSBpZihkbWE4ICYgMHgwMikKKwkJZG1hOCA9IDE7CisJZWxzZSBpZihkbWE4ICYgMHgwOCkKKwkJZG1hOCA9IDM7CisJZWxzZQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJrYWhsdWE6IE5vIDhiaXQgRE1BIGVuYWJsZWQuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCQorCWlmKGlycSAmIDEpCisJCWlycSA9IDk7CisJZWxzZSBpZihpcnEgJiAyKQorCQlpcnEgPSA1OworCWVsc2UgaWYoaXJxICYgNCkKKwkJaXJxID0gNzsKKwllbHNlIGlmKGlycSAmIDgpCisJCWlycSA9IDEwOworCWVsc2UKKwl7CisJCXByaW50ayhLRVJOX0VSUiAia2FobHVhOiBTQiBJUlEgbm90IHNldC5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisJCisJcHJpbnRrKEtFUk5fSU5GTyAia2FobHVhOiBYcHJlc3NBdWRpbyBvbiBJUlEgJWQsIERNQSAlZCwgJWRcbiIsCisJCWlycSwgZG1hOCwgZG1hMTYpOworCQorCWh3X2NvbmZpZyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBhZGRyZXNzX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZihod19jb25maWcgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAia2FobHVhOiBvdXQgb2YgbWVtb3J5LlxuIik7CisJCXJldHVybiAxOworCX0KKwltZW1zZXQoaHdfY29uZmlnLCAwLCBzaXplb2YoKmh3X2NvbmZpZykpOworCQorCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBod19jb25maWcpOworCQorCWh3X2NvbmZpZy0+aW9fYmFzZSA9IGlvOworCWh3X2NvbmZpZy0+aXJxID0gaXJxOworCWh3X2NvbmZpZy0+ZG1hID0gZG1hODsKKwlod19jb25maWctPmRtYTIgPSBkbWExNjsKKwlod19jb25maWctPm5hbWUgPSAiQ3lyaXggWHByZXNzQXVkaW8iOworCWh3X2NvbmZpZy0+ZHJpdmVyX3VzZV8xID0gU0JfTk9fTUlESSB8IFNCX1BDSV9JUlE7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvLCAxNiwgInNvdW5kYmxhc3RlciIpKQorCQlnb3RvIGVycl9vdXRfZnJlZTsKKwkKKwlpZihzYl9kc3BfZGV0ZWN0KGh3X2NvbmZpZywgMCwgMCwgTlVMTCk9PTApCisJeworCQlwcmludGsoS0VSTl9FUlIgImthaGx1YTogYXVkaW8gbm90IHJlc3BvbmRpbmcuXG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oaW8sIDE2KTsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCisJb2xkcXVpZXQgPSBzYl9iZV9xdWlldDsJCisJc2JfYmVfcXVpZXQgPSAxOworCWlmKHNiX2RzcF9pbml0KGh3X2NvbmZpZywgVEhJU19NT0RVTEUpKQorCXsKKwkJc2JfYmVfcXVpZXQgPSBvbGRxdWlldDsKKwkJZ290byBlcnJfb3V0X2ZyZWU7CisJfQorCXNiX2JlX3F1aWV0ID0gb2xkcXVpZXQ7CisJCisJcmV0dXJuIDA7CisKK2Vycl9vdXRfZnJlZToKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoaHdfY29uZmlnKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHJlbW92ZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCit7CisJc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOworCXNiX2RzcF91bmxvYWQoaHdfY29uZmlnLCAwKTsKKwlwY2lfc2V0X2RydmRhdGEocGRldiwgTlVMTCk7CisJa2ZyZWUoaHdfY29uZmlnKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxhbiBDb3giKTsKK01PRFVMRV9ERVNDUklQVElPTigiS2FobHVhIFZTQTEgUENJIEF1ZGlvIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKKy8qCisgKgk1NTMwIG9ubHkuIFRoZSA1NTEwLzU1MjAgZGVjb2RlIGlzIGRpZmZlcmVudC4KKyAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRfdGJsW10gPSB7CisJeyBQQ0lfVkVORE9SX0lEX0NZUklYLCBQQ0lfREVWSUNFX0lEX0NZUklYXzU1MzBfQVVESU8sIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIDAgfSwKKwl7IH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpZF90YmwpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIga2FobHVhX2RyaXZlciA9IHsKKwkubmFtZQkJPSAia2FobHVhIiwKKwkuaWRfdGFibGUJPSBpZF90YmwsCisJLnByb2JlCQk9IHByb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHJlbW92ZV9vbmUpLAorfTsKKworCitzdGF0aWMgaW50IF9faW5pdCBrYWhsdWFfaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJDeXJpeCBLYWhsdWEgVlNBMSBYcHJlc3NBdWRpbyBzdXBwb3J0IChjKSBDb3B5cmlnaHQgMjAwMyBSZWQgSGF0IEluY1xuIik7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgma2FobHVhX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBrYWhsdWFfY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJmthaGx1YV9kcml2ZXIpOworfQorCisKK21vZHVsZV9pbml0KGthaGx1YV9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdChrYWhsdWFfY2xlYW51cF9tb2R1bGUpOworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbWFkMTYuYyBiL3NvdW5kL29zcy9tYWQxNi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MDY3ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbWFkMTYuYwpAQCAtMCwwICsxLDEwOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogbWFkMTYuYworICoKKyAqIEluaXRpYWxpemF0aW9uIGNvZGUgZm9yIE9QVGkgTUFEMTYgY29tcGF0aWJsZSBhdWRpbyBjaGlwcy4gSW5jbHVkaW5nCisgKgorICogICAgICBPUFRpIDgyQzkyOCAgICAgTUFEMTYgICAgICAgICAgIChyZXBsYWNlZCBieSBDOTI5KQorICogICAgICBPQUsgT1RJLTYwMUQgICAgTW96YXJ0CisgKiAgICAgIE9BSyBPVEktNjA1CU1vemFydAkJKGxhdGVyIHZlcnNpb24gd2l0aCBNUFU0MDEgTWlkaSkKKyAqICAgICAgT1BUaSA4MkM5MjkgICAgIE1BRDE2IFBybworICogICAgICBPUFRpIDgyQzkzMAorICogICAgICBPUFRpIDgyQzkyNAorICoKKyAqIFRoZXNlIGF1ZGlvIGludGVyZmFjZSBjaGlwcyBkb24ndCBwcm9kdWNlIHNvdW5kIHRoZW1zZWx2ZXMuIFRoZXkganVzdAorICogY29ubmVjdCBzb21lIG90aGVyIGNvbXBvbmVudHMgKE9QTC1bMjM0XSBhbmQgYSBXU1MgY29tcGF0aWJsZSBjb2RlYykKKyAqIHRvIHRoZSBQQyBidXMgYW5kIHBlcmZvcm0gSS9PLCBETUEgYW5kIElSUSBhZGRyZXNzIGRlY29kaW5nLiBUaGVyZSBpcworICogYWxzbyBhIFVBUlQgZm9yIHRoZSBNUFUtNDAxIG1vZGUgKG5vdCA4MkM5MjgvTW96YXJ0KS4KKyAqIFRoZSBNb3phcnQgY2hpcCBhcHBlYXJzIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgODJDOTI4LCBhbHRob3VnaCBsYXRlcgorICogaXNzdWVzIG9mIHRoZSBjYXJkLCB1c2luZyB0aGUgT1RJLTYwNSBjaGlwLCBoYXZlIGFuIE1QVS00MDEgY29tcGF0aWJsZSBNaWRpCisgKiBwb3J0LiBUaGlzIHBvcnQgaXMgY29uZmlndXJlZCBkaWZmZXJlbnRseSB0byB0aGF0IG9mIHRoZSBPUFRpIGF1ZGlvIGNoaXBzLgorICoKKyAqCUNoYW5nZXMKKyAqCQorICoJQWxhbiBDb3gJCUNsZWFuIHVwLCBhZGRlZCBtb2R1bGUgc2VsZWN0aW9ucy4KKyAqCisgKglBLiBXaWsJCQlBZGRlZCBzdXBwb3J0IGZvciBPcHRpOTI0IFBuUC4KKyAqCQkJCUltcHJvdmVkIGRlYnVnZ2luZyBzdXBwb3J0LgkxNi1NYXktMTk5OAorICoJCQkJRml4ZWQgYnVnLgkJCTE2LUp1bi0xOTk4CisgKgorICogICAgICBUb3JzdGVuIER1d2UgICAgICAgICAgICBNYWRlIE9wdGk5MjQgUG5QIHN1cHBvcnQgbm9uLWRlc3RydWN0aXZlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJMjMtRGVjLTE5OTgKKyAqCisgKglQYXVsIEdyYXlzb24JCUFkZGVkIHN1cHBvcnQgZm9yIE1pZGkgb24gbGF0ZXIgTW96YXJ0IGNhcmRzLgorICoJCQkJCQkJCTI1LU5vdi0xOTk5CisgKglDaHJpc3RvcGggSGVsbHdpZwlBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0LgorICoJQXJuYWxkbyBDLiBkZSBNZWxvCWdvdCByaWQgb2YgYXR0YWNoX3VhcnQ0MDEgICAgICAgMjEtU2VwLTIwMDAKKyAqCisgKglQYXZlbCBSYWJlbAkJQ2xlYW4gdXAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3YtMjAwMAorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAiYWQxODQ4LmgiCisjaW5jbHVkZSAic2IuaCIKKyNpbmNsdWRlICJtcHU0MDEuaCIKKworc3RhdGljIGludCAgICAgIG1hZDE2X2NvbmY7CitzdGF0aWMgaW50ICAgICAgbWFkMTZfY2RzZWw7CitzdGF0aWMgc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKKyNkZWZpbmUgQzkyOAkxCisjZGVmaW5lIE1PWkFSVAkyCisjZGVmaW5lIEM5MjkJMworI2RlZmluZSBDOTMwCTQKKyNkZWZpbmUgQzkyNCAgICA1CisKKy8qCisgKiAgICBSZWdpc3RlcnMKKyAqCisgKiAgICAgIFRoZSBNQUQxNiBvY2N1cGllcyBJL08gcG9ydHMgMHhmOGQgdG8gMHhmOTMgKGZpeGVkIGxvY2F0aW9ucykuCisgKiAgICAgIEFsbCBwb3J0cyBhcmUgaW5hY3RpdmUgYnkgZGVmYXVsdC4gVGhleSBjYW4gYmUgYWN0aXZhdGVkIGJ5CisgKiAgICAgIHdyaXRpbmcgMHhFMiBvciAweEUzIHRvIHRoZSBwYXNzd29yZCByZWdpc3Rlci4gVGhlIHBhc3N3b3JkIGlzIHZhbGlkCisgKiAgICAgIG9ubHkgdW50aWwgdGhlIG5leHQgSS9PIHJlYWQgb3Igd3JpdGUuCisgKgorICogICAgICA4MkM5MzAgdXNlcyAweEU0IGFzIHRoZSBwYXNzd29yZCBhbmQgaW5kaXJlY3QgYWRkcmVzc2luZyB0byBhY2Nlc3MKKyAqICAgICAgdGhlIGNvbmZpZyByZWdpc3RlcnMuCisgKi8KKworI2RlZmluZSBNQzBfUE9SVAkweGY4YwkvKiBEdW1teSBwb3J0ICovCisjZGVmaW5lIE1DMV9QT1JUCTB4ZjhkCS8qIFNCIGFkZHJlc3MsIENELVJPTSBpbnRlcmZhY2UgdHlwZSwgam95c3RpY2sgKi8KKyNkZWZpbmUgTUMyX1BPUlQJMHhmOGUJLyogQ0QtUk9NIGFkZHJlc3MsIElSUSwgRE1BLCBwbHVzIE9QTDQgYml0ICovCisjZGVmaW5lIE1DM19QT1JUCTB4ZjhmCisjZGVmaW5lIFBBU1NXRF9SRUcJMHhmOGYKKyNkZWZpbmUgTUM0X1BPUlQJMHhmOTAKKyNkZWZpbmUgTUM1X1BPUlQJMHhmOTEKKyNkZWZpbmUgTUM2X1BPUlQJMHhmOTIKKyNkZWZpbmUgTUM3X1BPUlQJMHhmOTMKKyNkZWZpbmUgTUM4X1BPUlQJMHhmOTQKKyNkZWZpbmUgTUM5X1BPUlQJMHhmOTUKKyNkZWZpbmUgTUMxMF9QT1JUCTB4Zjk2CisjZGVmaW5lIE1DMTFfUE9SVAkweGY5NworI2RlZmluZSBNQzEyX1BPUlQJMHhmOTgKKworc3RhdGljIGludCAgICAgIGJvYXJkX3R5cGUgPSBDOTI4OworCitzdGF0aWMgaW50ICAgICAqbWFkMTZfb3NwOworc3RhdGljIGludAljOTMxX2RldGVjdGVkOwkvKiBtaW5vciBkaWZmZXJlbmNlcyBmcm9tIEM5MzAgKi8KK3N0YXRpYyBjaGFyCWM5MjRwbnA7CS8qICIgICAgICIgICAgICAgICAgICIgICAgQzkyNCAqLworc3RhdGljIGludAlkZWJ1ZzsgIAkvKiBkZWJ1Z2dpbmcgb3V0cHV0ICovCisKKyNpZmRlZiBEREIKKyN1bmRlZiBEREIKKyNlbmRpZgorI2RlZmluZSBEREIoeCkgZG8ge2lmIChkZWJ1ZykgeDt9IHdoaWxlICgwKQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBtYWRfcmVhZChpbnQgcG9ydCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgdG1wOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCisJc3dpdGNoIChib2FyZF90eXBlKQkvKiBPdXRwdXQgcGFzc3dvcmQgKi8KKwl7CisJCWNhc2UgQzkyODoKKwkJY2FzZSBNT1pBUlQ6CisJCQlvdXRiKCgweEUyKSwgUEFTU1dEX1JFRyk7CisJCQlicmVhazsKKworCQljYXNlIEM5Mjk6CisJCQlvdXRiKCgweEUzKSwgUEFTU1dEX1JFRyk7CisJCQlicmVhazsKKworCQljYXNlIEM5MzA6CisJCQkvKiBvdXRiKCggMHhFNCksICBQQVNTV0RfUkVHKTsgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgQzkyNDoKKwkJCS8qIHRoZSBjOTI0IGhhcyBpdHMgcG9ydHMgcmVsb2NhdGVkIGJ5IC0xMjggaWYKKwkJCSAgIFBuUCBpcyBlbmFibGVkICAtYXcgKi8KKwkJCWlmICghYzkyNHBucCkKKwkJCQlvdXRiKCgweEU1KSwgUEFTU1dEX1JFRyk7IGVsc2UKKwkJCQlvdXRiKCgweEU1KSwgUEFTU1dEX1JFRyAtIDB4ODApOworCQkJYnJlYWs7CisJfQorCisJaWYgKGJvYXJkX3R5cGUgPT0gQzkzMCkKKwl7CisJCW91dGIoKHBvcnQgLSBNQzBfUE9SVCksIDB4ZTBlKTsJLyogV3JpdGUgdG8gaW5kZXggcmVnICovCisJCXRtcCA9IGluYigweGUwZik7CS8qIFJlYWQgZnJvbSBkYXRhIHJlZyAqLworCX0KKwllbHNlCisJCWlmICghYzkyNHBucCkKKwkJCXRtcCA9IGluYihwb3J0KTsgZWxzZQorCQkJdG1wID0gaW5iKHBvcnQtMHg4MCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisKKwlyZXR1cm4gdG1wOworfQorCitzdGF0aWMgdm9pZCBtYWRfd3JpdGUoaW50IHBvcnQsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisKKwlzd2l0Y2ggKGJvYXJkX3R5cGUpCS8qIE91dHB1dCBwYXNzd29yZCAqLworCXsKKwkJY2FzZSBDOTI4OgorCQljYXNlIE1PWkFSVDoKKwkJCW91dGIoKDB4RTIpLCBQQVNTV0RfUkVHKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQzkyOToKKwkJCW91dGIoKDB4RTMpLCBQQVNTV0RfUkVHKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQzkzMDoKKwkJCS8qIG91dGIoKCAweEU0KSwgIFBBU1NXRF9SRUcpOyAqLworCQkJYnJlYWs7CisKKwkJY2FzZSBDOTI0OgorCQkJaWYgKCFjOTI0cG5wKQorCQkJCW91dGIoKDB4RTUpLCBQQVNTV0RfUkVHKTsgZWxzZQorCQkJCW91dGIoKDB4RTUpLCBQQVNTV0RfUkVHIC0gMHg4MCk7CisJCQlicmVhazsKKwl9CisKKwlpZiAoYm9hcmRfdHlwZSA9PSBDOTMwKQorCXsKKwkJb3V0YigocG9ydCAtIE1DMF9QT1JUKSwgMHhlMGUpOwkvKiBXcml0ZSB0byBpbmRleCByZWcgKi8KKwkJb3V0YigoKHVuc2lnbmVkIGNoYXIpICh2YWx1ZSAmIDB4ZmYpKSwgMHhlMGYpOworCX0KKwllbHNlCisJCWlmICghYzkyNHBucCkKKwkJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAodmFsdWUgJiAweGZmKSksIHBvcnQpOyBlbHNlCisJCQlvdXRiKCgodW5zaWduZWQgY2hhcikgKHZhbHVlICYgMHhmZikpLCBwb3J0LTB4ODApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkZXRlY3RfYzkzMCh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgICB0bXAgPSBtYWRfcmVhZChNQzFfUE9SVCk7CisKKwlpZiAoKHRtcCAmIDB4MDYpICE9IDB4MDYpCisJeworCQlEREIocHJpbnRrKCJXcm9uZyBDOTMwIHNpZ25hdHVyZSAoJXgpXG4iLCB0bXApKTsKKwkJLyogcmV0dXJuIDA7ICovCisJfQorCW1hZF93cml0ZShNQzFfUE9SVCwgMCk7CisKKwlpZiAobWFkX3JlYWQoTUMxX1BPUlQpICE9IDB4MDYpCisJeworCQlEREIocHJpbnRrKCJXcm9uZyBDOTMwIHNpZ25hdHVyZTIgKCV4KVxuIiwgdG1wKSk7CisJCS8qIHJldHVybiAwOyAqLworCX0KKwltYWRfd3JpdGUoTUMxX1BPUlQsIHRtcCk7CS8qIFJlc3RvcmUgYml0cyAqLworCisJbWFkX3dyaXRlKE1DN19QT1JULCAwKTsKKwlpZiAoKHRtcCA9IG1hZF9yZWFkKE1DN19QT1JUKSkgIT0gMCkKKwl7CisJCUREQihwcmludGsoIk1DNyBub3Qgd3JpdGFibGUgKCV4KVxuIiwgdG1wKSk7CisJCXJldHVybiAwOworCX0KKwltYWRfd3JpdGUoTUM3X1BPUlQsIDB4Y2IpOworCWlmICgodG1wID0gbWFkX3JlYWQoTUM3X1BPUlQpKSAhPSAweGNiKQorCXsKKwkJRERCKHByaW50aygiTUM3IG5vdCB3cml0YWJsZTIgKCV4KVxuIiwgdG1wKSk7CisJCXJldHVybiAwOworCX0KKworCXRtcCA9IG1hZF9yZWFkKE1DMF9QT1JUKzE4KTsKKwlpZiAodG1wID09IDB4ZmYgfHwgdG1wID09IDB4MDApCisJCXJldHVybiAxOworCS8qIFdlIHByb2JhYmx5IGhhdmUgYSBDOTMxICovCisJRERCKHByaW50aygiRGV0ZWN0ZWQgQzkzMSBjb25maWc9MHglMDJ4XG4iLCB0bXApKTsKKwljOTMxX2RldGVjdGVkID0gMTsKKworCS8qCisgICAgICAgICAqIFdlIGNhbm5vdCBjb25maWd1cmUgdGhlIGNoaXAgaWYgaXQgaXMgaW4gUG5QIG1vZGUuCisgICAgICAgICAqIElmIHdlIGhhdmUgYSBDU04gYXNzaWduZWQgKGJpdCA4IGluIE1DMTMpIHdlIGZpcnN0IHRyeQorICAgICAgICAgKiBhIHNvZnR3YXJlIHJlc2V0LCB0aGVuIGEgc29mdHdhcmUgcG93ZXIgb2ZmLCBmaW5hbGx5CisgICAgICAgICAqIENsZWFyaW5nIFBuUCBtb2RlLiBUaGUgbGFzdCBvcHRpb24gaXMgbm90CisJICogQml0IDggaW4gTUMxMyAKKyAgICAgICAgICovCisJaWYgKChtYWRfcmVhZChNQzBfUE9SVCsxMykgJiAweDgwKSA9PSAwKQorCQlyZXR1cm4gMTsKKworCS8qIFNvZnR3YXJlIHJlc2V0ICovCisJbWFkX3dyaXRlKE1DOV9QT1JULCAweDAyKTsKKwltYWRfd3JpdGUoTUM5X1BPUlQsIDB4MDApOworCisJaWYgKChtYWRfcmVhZChNQzBfUE9SVCsxMykgJiAweDgwKSA9PSAwKQorCQlyZXR1cm4gMTsKKwkKKwkvKiBQb3dlciBvZmYsIGFuZCBvbiBhZ2FpbiAqLworCW1hZF93cml0ZShNQzlfUE9SVCwgMHhjMik7CisJbWFkX3dyaXRlKE1DOV9QT1JULCAweGMwKTsKKworCWlmICgobWFkX3JlYWQoTUMwX1BPUlQrMTMpICYgMHg4MCkgPT0gMCkKKwkJcmV0dXJuIDE7CisJCisjaWYgMAkKKwkvKiBGb3JjZSBvZmYgUG5QIG1vZGUuIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkIGJlY2F1c2UKKwkgKiB0aGUgUG5QIGJpb3Mgd2lsbCBub3QgcmVjb2duaXplIHRoZSBjaGlwIG9uIHRoZSBuZXh0CisJICogd2FybSBib290IGFuZCBtYXkgYXNzaWduZCBkaWZmZXJlbnQgcmVzb3VyY2VzIHRvIG90aGVyCisJICogUG5QL1BDSSBjYXJkcy4KKwkgKi8KKwltYWRfd3JpdGUoTUMwX1BPUlQrMTcsIDB4MDQpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRldGVjdF9tYWQxNih2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgdG1wLCB0bXAyLCBiaXQ7CisJaW50IGksIHBvcnQ7CisKKwkvKgorCSAqIENoZWNrIHRoYXQgcmVhZGluZyBhIHJlZ2lzdGVyIGRvZXNuJ3QgcmV0dXJuIGJ1cyBmbG9hdCAoMHhmZikKKwkgKiB3aGVuIHRoZSBjYXJkIGlzIGFjY2Vzc2VkIHVzaW5nIHBhc3N3b3JkLiBUaGlzIG1heSBmYWlsIGluIGNhc2UKKwkgKiB0aGUgY2FyZCBpcyBpbiBsb3cgcG93ZXIgbW9kZS4gTm9ybWFsbHkgYXQgbGVhc3QgdGhlIHBvd2VyIHNhdmluZworCSAqIG1vZGUgYml0IHNob3VsZCBiZSAwLgorCSAqLworCisJaWYgKCh0bXAgPSBtYWRfcmVhZChNQzFfUE9SVCkpID09IDB4ZmYpCisJeworCQlEREIocHJpbnRrKCJNQzFfUE9SVCByZXR1cm5lZCAweGZmXG4iKSk7CisJCXJldHVybiAwOworCX0KKwlmb3IgKGkgPSAweGY4ZDsgaSA8PSAweGY5ODsgaSsrKQorCQlpZiAoIWM5MjRwbnApCisJCQlEREIocHJpbnRrKCJQb3J0ICUweCAoaW5pdCB2YWx1ZSkgPSAlMHhcbiIsIGksIG1hZF9yZWFkKGkpKSk7CisJCWVsc2UKKwkJCUREQihwcmludGsoIlBvcnQgJTB4IChpbml0IHZhbHVlKSA9ICUweFxuIiwgaS0weDgwLCBtYWRfcmVhZChpKSkpOworCisJaWYgKGJvYXJkX3R5cGUgPT0gQzkzMCkKKwkJcmV0dXJuIGRldGVjdF9jOTMwKCk7CisKKwkvKgorCSAqIE5vdyBjaGVjayB0aGF0IHRoZSBnYXRlIGlzIGNsb3NlZCBvbiBmaXJzdCBJL08gYWZ0ZXIgd3JpdGluZworCSAqIHRoZSBwYXNzd29yZC4gKFRoaXMgaXMgaG93IGEgTUFEMTYgY29tcGF0aWJsZSBjYXJkIHdvcmtzKS4KKwkgKi8KKworCWlmICgodG1wMiA9IGluYihNQzFfUE9SVCkpID09IHRtcCkJLyogSXQgZGlkbid0IGNsb3NlICovCisJeworCQlEREIocHJpbnRrKCJNQzFfUE9SVCBkaWRuJ3QgY2xvc2UgYWZ0ZXIgcmVhZCAoMHglMDJ4KVxuIiwgdG1wMikpOworCQlyZXR1cm4gMDsKKwl9CisKKwliaXQgID0gKGM5MjRwbnApID8gICAgIDB4MjAgOiAweDgwOworCXBvcnQgPSAoYzkyNHBucCkgPyBNQzJfUE9SVCA6IE1DMV9QT1JUOworCisJdG1wID0gbWFkX3JlYWQocG9ydCk7CisJbWFkX3dyaXRlKHBvcnQsIHRtcCBeIGJpdCk7CS8qIFRvZ2dsZSBhIGJpdCAqLworCWlmICgodG1wMiA9IG1hZF9yZWFkKHBvcnQpKSAhPSAodG1wIF4gYml0KSkJLyogQ29tcGFyZSB0aGUgYml0ICovCisJeworCQltYWRfd3JpdGUocG9ydCwgdG1wKTsJLyogUmVzdG9yZSAqLworCQlEREIocHJpbnRrKCJCaXQgcmV2ZXJ0IHRlc3QgZmFpbGVkICgweCUwMngsIDB4JTAyeClcbiIsIHRtcCwgdG1wMikpOworCQlyZXR1cm4gMDsKKwl9CisJbWFkX3dyaXRlKHBvcnQsIHRtcCk7CS8qIFJlc3RvcmUgKi8KKwlyZXR1cm4gMTsJCS8qIEJpbmdvICovCit9CisKK3N0YXRpYyBpbnQgX19pbml0IHdzc19pbml0KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBJTyBwb3J0IHJldHVybnMgdmFsaWQgc2lnbmF0dXJlLiBUaGUgb3JpZ2luYWwgTVMgU291bmQKKwkgKiBzeXN0ZW0gcmV0dXJucyAweDA0IHdoaWxlIHNvbWUgY2FyZHMgKEF1ZGlvVHJpeCBQcm8gZm9yIGV4YW1wbGUpCisJICogcmV0dXJuIDB4MDAuCisJICovCisKKwlpZiAoKGluYihod19jb25maWctPmlvX2Jhc2UgKyAzKSAmIDB4M2YpICE9IDB4MDQgJiYKKwkgICAgKGluYihod19jb25maWctPmlvX2Jhc2UgKyAzKSAmIDB4M2YpICE9IDB4MDApCisJeworCQlEREIocHJpbnRrKCJObyBNU1Mgc2lnbmF0dXJlIGRldGVjdGVkIG9uIHBvcnQgMHgleCAoMHgleClcbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSwgaW5iKGh3X2NvbmZpZy0+aW9fYmFzZSArIDMpKSk7CisJCXJldHVybiAwOworCX0KKwkvKgorCSAqIENoZWNrIHRoYXQgRE1BMCBpcyBub3QgaW4gdXNlIHdpdGggYSA4IGJpdCBib2FyZC4KKwkgKi8KKwlpZiAoaHdfY29uZmlnLT5kbWEgPT0gMCAmJiBpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgMykgJiAweDgwKQorCXsKKwkJcHJpbnRrKCJNU1M6IENhbid0IHVzZSBETUEwIHdpdGggYSA4IGJpdCBjYXJkL3Nsb3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGh3X2NvbmZpZy0+aXJxID4gOSAmJiBpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgMykgJiAweDgwKQorCQlwcmludGsoS0VSTl9FUlIgIk1TUzogQ2FuJ3QgdXNlIElSUSVkIHdpdGggYSA4IGJpdCBjYXJkL3Nsb3RcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19pbml0IGluaXRfYzkzMChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGNoYXIgY2ZnID0gMDsKKworCWNmZyB8PSAoMHgwZiAmIG1hZDE2X2NvbmYpOworCisJaWYoYzkzMV9kZXRlY3RlZCkKKwl7CisJCS8qIEJpdCAwIGhhcyByZXZlcnNkIG1lYW5pbmcuIEJpdHMgMSBhbmQgMiBzZXNlCisJCSAgIHJldmVyc2VkIG9uIHdyaXRlLgorCQkgICBTdXBwb3J0IG9ubHkgSURFIGNkcm9tLiBJREUgcG9ydCBwcm9ncmFtbWVkCisJCSAgIHNvbWV3aGVyZSBlbHNlLiAqLworCQljZmcgPSAgKGNmZyAmIDB4MDkpIF4gMHgwNzsKKwl9CisJY2ZnIHw9IGJhc2UgPDwgNDsKKwltYWRfd3JpdGUoTUMxX1BPUlQsIGNmZyk7CisKKwkvKiBNQzIgaXMgQ0QgY29uZmlndXJhdGlvbi4gRG9uJ3QgdG91Y2ggaXQuICovCisKKwltYWRfd3JpdGUoTUMzX1BPUlQsIDApOwkvKiBEaXNhYmxlIFNCIG1vZGUgSVJRIGFuZCBETUEgKi8KKworCS8qIGJpdCAyIG9mIE1DNCByZXZlcnNlcyBpdCdzIG1lYW5pbmcgYmV0d2VlbiB0aGUgQzkzMAorCSAgIGFuZCB0aGUgQzkzMS4gKi8KKwljZmcgPSBjOTMxX2RldGVjdGVkID8gMHgwNCA6IDB4MDA7CisKKwlpZihtYWQxNl9jZHNlbCAmIDB4MjApCisJCW1hZF93cml0ZShNQzRfUE9SVCwgMHg2MnxjZmcpOyAgLyogb3BsNCAqLworCWVsc2UKKwkJbWFkX3dyaXRlKE1DNF9QT1JULCAweDUyfGNmZyk7ICAvKiBvcGwzICovCisKKwltYWRfd3JpdGUoTUM1X1BPUlQsIDB4M0MpOwkvKiBJbml0IGl0IGludG8gbW9kZTIgKi8KKwltYWRfd3JpdGUoTUM2X1BPUlQsIDB4MDIpOwkvKiBFbmFibGUgV1NTLCBEaXNhYmxlIE1QVSBhbmQgU0IgKi8KKwltYWRfd3JpdGUoTUM3X1BPUlQsIDB4Q0IpOworCW1hZF93cml0ZShNQzEwX1BPUlQsIDB4MTEpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBjaGlwX2RldGVjdCh2b2lkKQoreworCWludCBpOworCisJLyoKKwkgKiAgICBUaGVuIHRyeSB0byBkZXRlY3Qgd2l0aCB0aGUgb2xkIHBhc3N3b3JkCisJICovCisJYm9hcmRfdHlwZSA9IEM5MjQ7CisKKwlEREIocHJpbnRrKCJEZXRlY3QgdXNpbmcgcGFzc3dvcmQgPSAweEU1XG4iKSk7CisJCisJaWYgKGRldGVjdF9tYWQxNigpKSB7CisJCXJldHVybiAxOworCX0KKwkKKwlib2FyZF90eXBlID0gQzkyODsKKworCUREQihwcmludGsoIkRldGVjdCB1c2luZyBwYXNzd29yZCA9IDB4RTJcbiIpKTsKKworCWlmIChkZXRlY3RfbWFkMTYoKSkKKwl7CisJCXVuc2lnbmVkIGNoYXIgbW9kZWw7CisKKwkJaWYgKCgobW9kZWwgPSBtYWRfcmVhZChNQzNfUE9SVCkpICYgMHgwMykgPT0gMHgwMykgeworCQkJRERCKHByaW50aygibWFkMTYuYzogTW96YXJ0IGRldGVjdGVkXG4iKSk7CisJCQlib2FyZF90eXBlID0gTU9aQVJUOworCQl9IGVsc2UgeworCQkJRERCKHByaW50aygibWFkMTYuYzogODJDOTI4IGRldGVjdGVkPz8/XG4iKSk7CisJCQlib2FyZF90eXBlID0gQzkyODsKKwkJfQorCQlyZXR1cm4gMTsKKwl9CisKKwlib2FyZF90eXBlID0gQzkyOTsKKworCUREQihwcmludGsoIkRldGVjdCB1c2luZyBwYXNzd29yZCA9IDB4RTNcbiIpKTsKKworCWlmIChkZXRlY3RfbWFkMTYoKSkKKwl7CisJCUREQihwcmludGsoIm1hZDE2LmM6IDgyQzkyOSBkZXRlY3RlZFxuIikpOworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoaW5iKFBBU1NXRF9SRUcpICE9IDB4ZmYpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBGaXJzdCByZWxvY2F0ZSBNQyMgcmVnaXN0ZXJzIHRvIDB4ZTBlLzB4ZTBmLCBkaXNhYmxlIHBhc3N3b3JkIAorCSAqLworCisJb3V0YigoMHhFNCksIFBBU1NXRF9SRUcpOworCW91dGIoKDB4ODApLCBQQVNTV0RfUkVHKTsKKworCWJvYXJkX3R5cGUgPSBDOTMwOworCisJRERCKHByaW50aygiRGV0ZWN0IHVzaW5nIHBhc3N3b3JkID0gMHhFNFxuIikpOworCisJZm9yIChpID0gMHhmOGQ7IGkgPD0gMHhmOTM7IGkrKykKKwkJRERCKHByaW50aygicG9ydCAlMDN4ID0gJTAyeFxuIiwgaSwgbWFkX3JlYWQoaSkpKTsKKworICAgICAgICBpZihkZXRlY3RfbWFkMTYoKSkgeworCQlEREIocHJpbnRrKCJtYWQxNi5jOiA4MkM5MzAgZGV0ZWN0ZWRcbiIpKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogVGhlIEM5MzEgaGFzIHRoZSBwYXNzd29yZCByZWcgYXQgRjhEICovCisJb3V0YigoMHhFNCksIDB4RjhEKTsKKwlvdXRiKCgweDgwKSwgMHhGOEQpOworCUREQihwcmludGsoIkRldGVjdCB1c2luZyBwYXNzd29yZCA9IDB4RTQgZm9yIEM5MzFcbiIpKTsKKworCWlmIChkZXRlY3RfbWFkMTYoKSkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlib2FyZF90eXBlID0gQzkyNDsKKwljOTI0cG5wKys7CisJRERCKHByaW50aygiRGV0ZWN0IHVzaW5nIHBhc3N3b3JkID0gMHhFNSAoYWdhaW4pLCBwb3J0IG9mZnNldCAtMHg4MFxuIikpOworCWlmIChkZXRlY3RfbWFkMTYoKSkgeworCQlEREIocHJpbnRrKCJtYWQxNi5jOiA4MkM5MjQgUG5QIGRldGVjdGVkXG4iKSk7CisJCXJldHVybiAxOworCX0KKwkKKwljOTI0cG5wPTA7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfbWFkMTYoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgdG1wOworCXVuc2lnbmVkIGNoYXIgY3M0MjMxX21vZGUgPSAwOworCisJaW50IGFkX2ZsYWdzID0gMDsKKworCXNpZ25lZCBjaGFyIGJpdHM7CisKKwlzdGF0aWMgY2hhciAgICAgZG1hX2JpdHNbNF0gPSB7CisJCTEsIDIsIDAsIDMKKwl9OworCisJaW50IGNvbmZpZ19wb3J0ID0gaHdfY29uZmlnLT5pb19iYXNlICsgMCwgdmVyc2lvbl9wb3J0ID0gaHdfY29uZmlnLT5pb19iYXNlICsgMzsKKwlpbnQgZG1hID0gaHdfY29uZmlnLT5kbWEsIGRtYTIgPSBod19jb25maWctPmRtYTI7CisJdW5zaWduZWQgY2hhciBkbWEyX2JpdCA9IDA7CisJaW50IGJhc2U7CisJc3RydWN0IHJlc291cmNlICpwb3J0czsKKworCW1hZDE2X29zcCA9IGh3X2NvbmZpZy0+b3NwOworCisJc3dpdGNoIChod19jb25maWctPmlvX2Jhc2UpIHsKKwljYXNlIDB4NTMwOgorCQliYXNlID0gMDsKKwkJYnJlYWs7CisJY2FzZSAweGU4MDoKKwkJYmFzZSA9IDE7CisJCWJyZWFrOworCWNhc2UgMHhmNDA6CisJCWJhc2UgPSAyOworCQlicmVhazsKKwljYXNlIDB4NjA0OgorCQliYXNlID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJNQUQxNi9Nb3phcnQ6IEJhZCBXU1MgYmFzZSBhZGRyZXNzIDB4JXhcbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChkbWEgIT0gMCAmJiBkbWEgIT0gMSAmJiBkbWEgIT0gMykgeworCQlwcmludGsoS0VSTl9FUlIgIk1TUzogQmFkIERNQSAlZFxuIiwgZG1hKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiAgICBDaGVjayB0aGF0IGFsbCBwb3J0cyByZXR1cm4gMHhmZiAoYnVzIGZsb2F0KSB3aGVuIG5vIHBhc3N3b3JkCisJICogICAgICBpcyB3cml0dGVuIHRvIHRoZSBwYXNzd29yZCByZWdpc3Rlci4KKwkgKi8KKworCUREQihwcmludGsoIi0tLSBEZXRlY3RpbmcgTUFEMTYgLyBNb3phcnQgLS0tXG4iKSk7CisJaWYgKCFjaGlwX2RldGVjdCgpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoaHdfY29uZmlnLT5pcnEpIHsKKwljYXNlIDc6CisJCWJpdHMgPSA4OworCQlicmVhazsKKwljYXNlIDk6CisJCWJpdHMgPSAweDEwOworCQlicmVhazsKKwljYXNlIDEwOgorCQliaXRzID0gMHgxODsKKwkJYnJlYWs7CisJY2FzZSAxMjoKKwkJYml0cyA9IDB4MjA7CisJCWJyZWFrOworCWNhc2UgNToJLyogQWxzbyBJUlE1IGlzIHBvc3NpYmxlIG9uIEM5MzAgKi8KKwkJaWYgKGJvYXJkX3R5cGUgPT0gQzkzMCB8fCBjOTI0cG5wKSB7CisJCQliaXRzID0gMHgyODsKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJNQUQxNi9Nb3phcnQ6IEJhZCBJUlEgJWRcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UgKyA0LCA0LCAiYWQxODQ4Iik7CisJaWYgKCFwb3J0cykgeworCQlwcmludGsoS0VSTl9FUlIgIk1TUzogSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDQsICJtYWQxNiBXU1MgY29uZmlnIikpIHsKKwkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlICsgNCwgNCk7CisJCXByaW50ayhLRVJOX0VSUiAiTVNTOiBJL08gcG9ydCBjb25mbGljdFxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChib2FyZF90eXBlID09IEM5MzApIHsKKwkJaW5pdF9jOTMwKGh3X2NvbmZpZywgYmFzZSk7CisJCWdvdG8gZ290X2l0OworCX0KKworCWZvciAoaSA9IDB4ZjhkOyBpIDw9IDB4ZjkzOyBpKyspIHsKKwkJaWYgKCFjOTI0cG5wKQorCQkJRERCKHByaW50aygicG9ydCAlMDN4ID0gJTAyeFxuIiwgaSwgbWFkX3JlYWQoaSkpKTsKKwkJZWxzZQorCQkJRERCKHByaW50aygicG9ydCAlMDN4ID0gJTAyeFxuIiwgaS0weDgwLCBtYWRfcmVhZChpKSkpOworCX0KKworLyoKKyAqIFNldCB0aGUgV1NTIGFkZHJlc3MKKyAqLworCisJdG1wID0gKG1hZF9yZWFkKE1DMV9QT1JUKSAmIDB4MGYpIHwgMHg4MDsJLyogRW5hYmxlIFdTUywgRGlzYWJsZSBTQiAqLworCXRtcCB8PSBiYXNlIDw8IDQ7CS8qIFdTUyBwb3J0IHNlbGVjdCBiaXRzICovCisKKwkvKgorCSAqIFNldCBvcHRpb25hbCBDRC1ST00gYW5kIGpveXN0aWNrIHNldHRpbmdzLgorCSAqLworCisJdG1wICY9IH4weDBmOworCXRtcCB8PSAobWFkMTZfY29uZiAmIDB4MGYpOwkvKiBDRC1ST00gYW5kIGpveXN0aWNrIGJpdHMgKi8KKwltYWRfd3JpdGUoTUMxX1BPUlQsIHRtcCk7CisKKwl0bXAgPSBtYWQxNl9jZHNlbDsKKwltYWRfd3JpdGUoTUMyX1BPUlQsIHRtcCk7CisJbWFkX3dyaXRlKE1DM19QT1JULCAweGYwKTsJLyogRGlzYWJsZSBTQiAqLworCisJaWYgKGJvYXJkX3R5cGUgPT0gQzkyNCkJLyogU3BlY2lmaWMgQzkyNCBpbml0IHZhbHVlcyAqLworCXsKKwkJbWFkX3dyaXRlKE1DNF9QT1JULCAweEEwKTsKKwkJbWFkX3dyaXRlKE1DNV9QT1JULCAweDA1KTsKKwkJbWFkX3dyaXRlKE1DNl9QT1JULCAweDAzKTsKKwl9CisJaWYgKCFhZDE4NDhfZGV0ZWN0KHBvcnRzLCAmYWRfZmxhZ3MsIG1hZDE2X29zcCkpCisJCWdvdG8gZmFpbDsKKworCWlmIChhZF9mbGFncyAmIChBRF9GX0NTNDIzMSB8IEFEX0ZfQ1M0MjQ4KSkKKwkJY3M0MjMxX21vZGUgPSAweDAyOwkvKiBDUzQyNDgvQ1M0MjMxIHN5bmMgZGVsYXkgc3dpdGNoICovCisKKwlpZiAoYm9hcmRfdHlwZSA9PSBDOTI5KQorCXsKKwkJbWFkX3dyaXRlKE1DNF9QT1JULCAweGEyKTsKKwkJbWFkX3dyaXRlKE1DNV9QT1JULCAweEE1IHwgY3M0MjMxX21vZGUpOworCQltYWRfd3JpdGUoTUM2X1BPUlQsIDB4MDMpOwkvKiBEaXNhYmxlIE1QVTQwMSAqLworCX0KKwllbHNlCisJeworCQltYWRfd3JpdGUoTUM0X1BPUlQsIDB4MDIpOworCQltYWRfd3JpdGUoTUM1X1BPUlQsIDB4MzAgfCBjczQyMzFfbW9kZSk7CisJfQorCisJZm9yIChpID0gMHhmOGQ7IGkgPD0gMHhmOTM7IGkrKykgeworCQlpZiAoIWM5MjRwbnApCisJCQlEREIocHJpbnRrKCJwb3J0ICUwM3ggYWZ0ZXIgaW5pdCA9ICUwMnhcbiIsIGksIG1hZF9yZWFkKGkpKSk7CisJCWVsc2UKKwkJCUREQihwcmludGsoInBvcnQgJTAzeCBhZnRlciBpbml0ID0gJTAyeFxuIiwgaS0weDgwLCBtYWRfcmVhZChpKSkpOworCX0KKworZ290X2l0OgorCWFkX2ZsYWdzID0gMDsKKwlpZiAoIWFkMTg0OF9kZXRlY3QocG9ydHMsICZhZF9mbGFncywgbWFkMTZfb3NwKSkKKwkJZ290byBmYWlsOworCisJaWYgKCF3c3NfaW5pdChod19jb25maWcpKQorCQlnb3RvIGZhaWw7CisKKwkvKgorCSAqIFNldCB0aGUgSVJRIGFuZCBETUEgYWRkcmVzc2VzLgorCSAqLworCQorCW91dGIoKGJpdHMgfCAweDQwKSwgY29uZmlnX3BvcnQpOworCWlmICgoaW5iKHZlcnNpb25fcG9ydCkgJiAweDQwKSA9PSAwKQorCQlwcmludGsoS0VSTl9FUlIgIltJUlEgQ29uZmxpY3Q/XVxuIik7CisKKwkvKgorCSAqIEhhbmRsZSB0aGUgY2FwdHVyZSBETUEgY2hhbm5lbAorCSAqLworCisJaWYgKGFkX2ZsYWdzICYgQURfRl9DUzQyMzEgJiYgZG1hMiAhPSAtMSAmJiBkbWEyICE9IGRtYSkKKwl7CisJCWlmICghKChkbWEgPT0gMCAmJiBkbWEyID09IDEpIHx8CisJCQkoZG1hID09IDEgJiYgZG1hMiA9PSAwKSB8fAorCQkJKGRtYSA9PSAzICYmIGRtYTIgPT0gMCkpKQorCQl7CQkvKiBVbnN1cHBvcnRlZCBjb21iaW5hdGlvbi4gVHJ5IHRvIHN3YXAgY2hhbm5lbHMgKi8KKwkJCWludCB0bXAgPSBkbWE7CisKKwkJCWRtYSA9IGRtYTI7CisJCQlkbWEyID0gdG1wOworCQl9CisJCWlmICgoZG1hID09IDAgJiYgZG1hMiA9PSAxKSB8fCAoZG1hID09IDEgJiYgZG1hMiA9PSAwKSB8fAorCQkJKGRtYSA9PSAzICYmIGRtYTIgPT0gMCkpCisJCXsKKwkJCWRtYTJfYml0ID0gMHgwNDsJLyogRW5hYmxlIGNhcHR1cmUgRE1BICovCisJCX0KKwkJZWxzZQorCQl7CisJCQlwcmludGsoIk1BRDE2OiBJbnZhbGlkIGNhcHR1cmUgRE1BXG4iKTsKKwkJCWRtYTIgPSBkbWE7CisJCX0KKwl9CisJZWxzZSBkbWEyID0gZG1hOworCisJb3V0YigoYml0cyB8IGRtYV9iaXRzW2RtYV0gfCBkbWEyX2JpdCksIGNvbmZpZ19wb3J0KTsJLyogV3JpdGUgSVJRK0RNQSBzZXR1cCAqLworCisJaHdfY29uZmlnLT5zbG90c1swXSA9IGFkMTg0OF9pbml0KCJtYWQxNiBXU1MiLCBwb3J0cywKKwkJCQkJICBod19jb25maWctPmlycSwKKwkJCQkJICBkbWEsCisJCQkJCSAgZG1hMiwgMCwKKwkJCQkJICBod19jb25maWctPm9zcCwKKwkJCQkJICBUSElTX01PRFVMRSk7CisJcmV0dXJuIDE7CisKK2ZhaWw6CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlICsgNCwgNCk7CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfbWFkMTZfbXB1KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKworCWlmIChib2FyZF90eXBlIDwgQzkyOSkJLyogRWFybHkgY2hpcC4gTm8gTVBVIHN1cHBvcnQuIEp1c3QgU0IgTUlESSAqLworCXsKKworI2lmZGVmIENPTkZJR19NQUQxNl9PTERDQVJECisKKwkJdG1wID0gbWFkX3JlYWQoTUMzX1BPUlQpOworCisJCS8qIAorCQkgKiBNQUQxNiBTQiBiYXNlIGlzIGRlZmluZWQgYnkgdGhlIFdTUyBiYXNlLiBJdCBjYW5ub3QgYmUgY2hhbmdlZCAKKwkJICogYWxvbmUuCisJCSAqIElnbm9yZSBjb25maWd1cmVkIEkvTyBiYXNlLiBVc2UgdGhlIGFjdGl2ZSBzZXR0aW5nLiAKKwkJICovCisKKwkJaWYgKG1hZF9yZWFkKE1DMV9QT1JUKSAmIDB4MjApCisJCQlod19jb25maWctPmlvX2Jhc2UgPSAweDI0MDsKKwkJZWxzZQorCQkJaHdfY29uZmlnLT5pb19iYXNlID0gMHgyMjA7CisKKwkJc3dpdGNoIChod19jb25maWctPmlycSkKKwkJeworCQkJY2FzZSA1OgorCQkJCXRtcCA9ICh0bXAgJiAweDNmKSB8IDB4ODA7CisJCQkJYnJlYWs7CisJCQljYXNlIDc6CisJCQkJdG1wID0gKHRtcCAmIDB4M2YpOworCQkJCWJyZWFrOworCQkJY2FzZSAxMToKKwkJCQl0bXAgPSAodG1wICYgMHgzZikgfCAweDQwOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9FUlIgIm1hZDE2L01vemFydDogSW52YWxpZCBNSURJIElSUVxuIik7CisJCQkJcmV0dXJuIDA7CisJCX0KKworCQltYWRfd3JpdGUoTUMzX1BPUlQsIHRtcCB8IDB4MDQpOworCQlod19jb25maWctPmRyaXZlcl91c2VfMSA9IFNCX01JRElfT05MWTsKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDE2LCAic291bmRibGFzdGVyIikpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFzYl9kc3BfZGV0ZWN0KGh3X2NvbmZpZywgMCwgMCwgTlVMTCkpIHsKKwkJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMTYpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAobWFkX3JlYWQoTUMxX1BPUlQpICYgMHgyMCkKKwkJCWh3X2NvbmZpZy0+aW9fYmFzZSA9IDB4MjQwOworCQllbHNlCisJCQlod19jb25maWctPmlvX2Jhc2UgPSAweDIyMDsKKworCQlod19jb25maWctPm5hbWUgPSAiTWFkMTYvTW96YXJ0IjsKKwkJc2JfZHNwX2luaXQoaHdfY29uZmlnLCBUSElTX01PRFVMRSk7CisJCXJldHVybiAxOworI2Vsc2UKKwkJLyogYXNzdW1pbmcgYWxsIGxhdGVyIE1vemFydCBjYXJkcyBhcmUgaWRlbnRpZmllZCBhcworCQkgKiBlaXRoZXIgODJDOTI4IG9yIE1vemFydC4gSWYgc28sIGZvbGxvd2luZyBjb2RlIGF0dGVtcHRzCisJCSAqIHRvIHNldCBNUFUgcmVnaXN0ZXIuIFRPRE8gLSBhZGQgcHJvYmluZworCQkgKi8KKworCQl0bXAgPSBtYWRfcmVhZChNQzhfUE9SVCk7CisKKwkJc3dpdGNoIChod19jb25maWctPmlycSkKKwkJeworCQkJY2FzZSA1OgorCQkJCXRtcCB8PSAweDA4OworCQkJCWJyZWFrOworCQkJY2FzZSA3OgorCQkJCXRtcCB8PSAweDEwOworCQkJCWJyZWFrOworCQkJY2FzZSA5OgorCQkJCXRtcCB8PSAweDE4OworCQkJCWJyZWFrOworCQkJY2FzZSAxMDoKKwkJCQl0bXAgfD0gMHgyMDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMTE6CisJCQkJdG1wIHw9IDB4Mjg7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAibWFkMTYvTU9aQVJUOiBpbnZhbGlkIG1wdV9pcnFcbiIpOworCQkJCXJldHVybiAwOworCQl9CisKKwkJc3dpdGNoIChod19jb25maWctPmlvX2Jhc2UpCisJCXsKKwkJCWNhc2UgMHgzMDA6CisJCQkJdG1wIHw9IDB4MDE7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MzEwOgorCQkJCXRtcCB8PSAweDAzOworCQkJCWJyZWFrOworCQkJY2FzZSAweDMyMDoKKwkJCQl0bXAgfD0gMHgwNTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgzMzA6CisJCQkJdG1wIHw9IDB4MDc7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50ayhLRVJOX0VSUiAibWFkMTYvTU9aQVJUOiBpbnZhbGlkIG1wdV9pb1xuIik7CisJCQkJcmV0dXJuIDA7CisJCX0KKworCQltYWRfd3JpdGUoTUM4X1BPUlQsIHRtcCk7CS8qIHdyaXRlIE1QVSBwb3J0IHBhcmFtZXRlcnMgKi8KKwkJZ290byBwcm9iZV80MDE7CisjZW5kaWYKKwl9CisJdG1wID0gbWFkX3JlYWQoTUM2X1BPUlQpICYgMHg4MzsKKwl0bXAgfD0gMHg4MDsJCS8qIE1QVS00MDEgZW5hYmxlICovCisKKwkvKiBTZXQgdGhlIE1QVSBiYXNlIGJpdHMgKi8KKworCXN3aXRjaCAoaHdfY29uZmlnLT5pb19iYXNlKQorCXsKKwkJY2FzZSAweDMwMDoKKwkJCXRtcCB8PSAweDYwOworCQkJYnJlYWs7CisJCWNhc2UgMHgzMTA6CisJCQl0bXAgfD0gMHg0MDsKKwkJCWJyZWFrOworCQljYXNlIDB4MzIwOgorCQkJdG1wIHw9IDB4MjA7CisJCQlicmVhazsKKwkJY2FzZSAweDMzMDoKKwkJCXRtcCB8PSAweDAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIk1BRDE2OiBJbnZhbGlkIE1JREkgcG9ydCAweCV4XG4iLCBod19jb25maWctPmlvX2Jhc2UpOworCQkJcmV0dXJuIDA7CisJfQorCisJLyogU2V0IHRoZSBNUFUgSVJRIGJpdHMgKi8KKworCXN3aXRjaCAoaHdfY29uZmlnLT5pcnEpCisJeworCQljYXNlIDU6CisJCQl0bXAgfD0gMHgxMDsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQl0bXAgfD0gMHgxODsKKwkJCWJyZWFrOworCQljYXNlIDk6CisJCQl0bXAgfD0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIDEwOgorCQkJdG1wIHw9IDB4MDg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiTUFEMTY6IEludmFsaWQgTUlESSBJUlEgJWRcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJCWJyZWFrOworCX0KKwkJCQorCW1hZF93cml0ZShNQzZfUE9SVCwgdG1wKTsJLyogV3JpdGUgTVBVNDAxIGNvbmZpZyAqLworCisjaWZuZGVmIENPTkZJR19NQUQxNl9PTERDQVJECitwcm9iZV80MDE6CisjZW5kaWYKKwlod19jb25maWctPmRyaXZlcl91c2VfMSA9IFNCX01JRElfT05MWTsKKwlod19jb25maWctPm5hbWUgPSAiTWFkMTYvTW96YXJ0IjsKKwlyZXR1cm4gcHJvYmVfdWFydDQwMShod19jb25maWcsIFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9tYWQxNihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJYWQxODQ4X3VubG9hZChod19jb25maWctPmlvX2Jhc2UgKyA0LAorCQkJaHdfY29uZmlnLT5pcnEsCisJCQlod19jb25maWctPmRtYSwKKwkJCWh3X2NvbmZpZy0+ZG1hMiwgMCk7CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKKwlzb3VuZF91bmxvYWRfYXVkaW9kZXYoaHdfY29uZmlnLT5zbG90c1swXSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfbWFkMTZfbXB1KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKyNpZmRlZiBDT05GSUdfTUFEMTZfT0xEQ0FSRAorCWlmIChib2FyZF90eXBlIDwgQzkyOSkJLyogRWFybHkgY2hpcC4gTm8gTVBVIHN1cHBvcnQuIEp1c3QgU0IgTUlESSAqLworCXsKKwkJc2JfZHNwX3VubG9hZChod19jb25maWcsIDApOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwl1bmxvYWRfdWFydDQwMShod19jb25maWcpOworfQorCitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7CitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXB1OworCitzdGF0aWMgaW50IGZvdW5kX21wdTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIG1wdV9pbyA9IDA7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXB1X2lycSA9IDA7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8gPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWExNiA9IC0xOyAvKiBTZXQgdGhpcyBmb3IgbW9kdWxlcyB0aGF0IG5lZWQgaXQgKi8KK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBjZHR5cGUgPSAwOworc3RhdGljIGludCBfX2luaXRkYXRhIGNkaXJxID0gMDsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBjZHBvcnQgPSAweDM0MDsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBjZGRtYSA9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIG9wbDQgPSAwOworc3RhdGljIGludCBfX2luaXRkYXRhIGpveXN0aWNrID0gMDsKKworbW9kdWxlX3BhcmFtKG1wdV9pbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtcHVfaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWExNiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2R0eXBlLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNkaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGNkcG9ydCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjZGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShvcGw0LCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGpveXN0aWNrLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgMDY0NCk7CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWFfbWFwWzJdWzhdID0KK3sKKwl7MHgwMywgLTEsIC0xLCAtMSwgLTEsIDB4MDAsIDB4MDEsIDB4MDJ9LAorCXsweDAzLCAtMSwgMHgwMSwgMHgwMCwgLTEsIC0xLCAtMSwgLTF9Cit9OworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxX21hcFsxNl0gPQoreworCTB4MDAsIC0xLCAtMSwgMHgwQSwKKwktMSwgMHgwNCwgLTEsIDB4MDgsCisJLTEsIDB4MTAsIDB4MTQsIDB4MTgsCisJLTEsIC0xLCAtMSwgLTEKK307CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IG1hZDE2X3JlZ2lzdGVyX2dhbWVwb3J0KGludCBpb19wb3J0KQoreworCWlmICghcmVxdWVzdF9yZWdpb24oaW9fcG9ydCwgMSwgIm1hZDE2IGdhbWVwb3J0IikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWQxNjogZ2FtZXBvcnQgYWRkcmVzcyAweCUjeCBhbHJlYWR5IGluIHVzZVxuIiwgaW9fcG9ydCk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJZ2FtZXBvcnQgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CisJaWYgKCFnYW1lcG9ydCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hZDE2OiBjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3JlZ2lvbihpb19wb3J0LCAxKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJZ2FtZXBvcnRfc2V0X25hbWUoZ2FtZXBvcnQsICJNQUQxNiBHYW1lcG9ydCIpOworCWdhbWVwb3J0X3NldF9waHlzKGdhbWVwb3J0LCAiaXNhJTA0eC9nYW1lcG9ydDAiLCBpb19wb3J0KTsKKwlnYW1lcG9ydC0+aW8gPSBpb19wb3J0OworCisJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChnYW1lcG9ydCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9tYWQxNih2b2lkKQoreworCWludCBkbWF0eXBlID0gMDsKKworCXByaW50ayhLRVJOX0lORk8gIk1BRDE2IGF1ZGlvIGRyaXZlciBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk2XG4iKTsKKworCXByaW50ayhLRVJOX0lORk8gIkNEUk9NICIpOworCXN3aXRjaCAoY2R0eXBlKQorCXsKKwkJY2FzZSAweDAwOgorCQkJcHJpbnRrKCJEaXNhYmxlZCIpOworCQkJY2RpcnEgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgwMjoKKwkJCXByaW50aygiU29ueSBDRFUzMUEiKTsKKwkJCWRtYXR5cGUgPSAxOworCQkJaWYoY2RkbWEgPT0gLTEpIGNkZG1hID0gMzsKKwkJCWJyZWFrOworCQljYXNlIDB4MDQ6CisJCQlwcmludGsoIk1pdHN1bWkiKTsKKwkJCWRtYXR5cGUgPSAwOworCQkJaWYoY2RkbWEgPT0gLTEpIGNkZG1hID0gNTsKKwkJCWJyZWFrOworCQljYXNlIDB4MDY6CisJCQlwcmludGsoIlBhbmFzb25pYyBMYXNlcm1hdGUiKTsKKwkJCWRtYXR5cGUgPSAxOworCQkJaWYoY2RkbWEgPT0gLTEpIGNkZG1hID0gMzsKKwkJCWJyZWFrOworCQljYXNlIDB4MDg6CisJCQlwcmludGsoIlNlY29uZGFyeSBJREUiKTsKKwkJCWRtYXR5cGUgPSAwOworCQkJaWYoY2RkbWEgPT0gLTEpIGNkZG1hID0gNTsKKwkJCWJyZWFrOworCQljYXNlIDB4MEE6CisJCQlwcmludGsoIlByaW1hcnkgSURFIik7CisJCQlkbWF0eXBlID0gMDsKKwkJCWlmKGNkZG1hID09IC0xKSBjZGRtYSA9IDU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50aygiXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBDRFJPTSB0eXBlXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogICAgQnVpbGQgdGhlIGNvbmZpZyB3b3JkcworCSAqLworCisJbWFkMTZfY29uZiA9IChqb3lzdGljayBeIDEpIHwgY2R0eXBlOworCW1hZDE2X2Nkc2VsID0gMDsKKwlpZiAob3BsNCkKKwkJbWFkMTZfY2RzZWwgfD0gMHgyMDsKKworCWlmKGNkdHlwZSl7CisJCWlmIChjZGRtYSA+IDcgfHwgY2RkbWEgPCAwIHx8IGRtYV9tYXBbZG1hdHlwZV1bY2RkbWFdID09IC0xKQorCQl7CisJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgIkludmFsaWQgQ0RST00gRE1BXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChjZGRtYSkKKwkJCXByaW50aygiLCBETUEgJWQiLCBjZGRtYSk7CisJCWVsc2UKKwkJCXByaW50aygiLCBubyBETUEiKTsKKworCQlpZiAoIWNkaXJxKQorCQkJcHJpbnRrKCIsIG5vIElSUSIpOworCQllbHNlIGlmIChjZGlycSA8IDAgfHwgY2RpcnEgPiAxNSB8fCBpcnFfbWFwW2NkaXJxXSA9PSAtMSkKKwkJeworCQkJcHJpbnRrKCIsIGludmFsaWQgSVJRIChkaXNhYmxpbmcpIik7CisJCQljZGlycSA9IDA7CisJCX0KKwkJZWxzZSBwcmludGsoIiwgSVJRICVkIiwgY2RpcnEpOworCisJCW1hZDE2X2Nkc2VsIHw9IGRtYV9tYXBbZG1hdHlwZV1bY2RkbWFdOworCisJCWlmIChjZHR5cGUgPCAweDA4KQorCQl7CisJCQlzd2l0Y2ggKGNkcG9ydCkKKwkJCXsKKwkJCQljYXNlIDB4MzQwOgorCQkJCQltYWQxNl9jZHNlbCB8PSAweDAwOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MzMwOgorCQkJCQltYWQxNl9jZHNlbCB8PSAweDQwOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MzYwOgorCQkJCQltYWQxNl9jZHNlbCB8PSAweDgwOworCQkJCQlicmVhazsKKwkJCQljYXNlIDB4MzIwOgorCQkJCQltYWQxNl9jZHNlbCB8PSAweEMwOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlwcmludGsoS0VSTl9FUlIgIlVua25vd24gQ0RST00gSS9PIGJhc2UgJWRcbiIsIGNkcG9ydCk7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCW1hZDE2X2Nkc2VsIHw9IGlycV9tYXBbY2RpcnFdOworCX0KKworCXByaW50aygiLlxuIik7CisKKwljZmcuaW9fYmFzZSA9IGlvOworCWNmZy5pcnEgPSBpcnE7CisJY2ZnLmRtYSA9IGRtYTsKKwljZmcuZG1hMiA9IGRtYTE2OworCisJaWYgKGNmZy5pb19iYXNlID09IC0xIHx8IGNmZy5kbWEgPT0gLTEgfHwgY2ZnLmlycSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgIkkvTywgRE1BIGFuZCBpcnEgYXJlIG1hbmRhdG9yeVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oTUMwX1BPUlQsIDEyLCAibWFkMTYiKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWlmICghcHJvYmVfbWFkMTYoJmNmZykpIHsKKwkJcmVsZWFzZV9yZWdpb24oTUMwX1BPUlQsIDEyKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJY2ZnX21wdS5pb19iYXNlID0gbXB1X2lvOworCWNmZ19tcHUuaXJxID0gbXB1X2lycTsKKworCWZvdW5kX21wdSA9IHByb2JlX21hZDE2X21wdSgmY2ZnX21wdSk7CisKKwlpZiAoam95c3RpY2spCisJCW1hZDE2X3JlZ2lzdGVyX2dhbWVwb3J0KDB4MjAxKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9tYWQxNih2b2lkKQoreworCWlmIChmb3VuZF9tcHUpCisJCXVubG9hZF9tYWQxNl9tcHUoJmNmZ19tcHUpOworCWlmIChnYW1lcG9ydCkgeworCQkvKiB0aGUgZ2FtZXBvcnQgd2FzIGluaXRpYWxpemVkIHNvIHdlIG11c3QgZnJlZSBpdCB1cCAqLworCQlnYW1lcG9ydF91bnJlZ2lzdGVyX3BvcnQoZ2FtZXBvcnQpOworCQlnYW1lcG9ydCA9IE5VTEw7CisJCXJlbGVhc2VfcmVnaW9uKDB4MjAxLCAxKTsKKwl9CisJdW5sb2FkX21hZDE2KCZjZmcpOworCXJlbGVhc2VfcmVnaW9uKE1DMF9QT1JULCAxMik7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbWFkMTYpOworbW9kdWxlX2V4aXQoY2xlYW51cF9tYWQxNik7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9tYWQxNihjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSAqLworCWludCBpbnRzWzhdOworCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKworCWlvCSA9IGludHNbMV07CisJaXJxCSA9IGludHNbMl07CisJZG1hCSA9IGludHNbM107CisJZG1hMTYJID0gaW50c1s0XTsKKwltcHVfaW8JID0gaW50c1s1XTsKKwltcHVfaXJxICA9IGludHNbNl07CisJam95c3RpY2sgPSBpbnRzWzddOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm1hZDE2PSIsIHNldHVwX21hZDE2KTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21hZXN0cm8uYyBiL3NvdW5kL29zcy9tYWVzdHJvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkMmRiNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tYWVzdHJvLmMKQEAgLTAsMCArMSwzODMyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiAgICAgIEVTUyBNYWVzdHJvL01hZXN0cm8tMi9NYWVzdHJvLTJFIGRyaXZlciBmb3IgTGludXggMi5bMjNdLngKKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICAgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICoJKGMpIENvcHlyaWdodCAxOTk5CSBBbGFuIENveCA8YWxhbi5jb3hAbGludXgub3JnPgorICoKKyAqCUJhc2VkIGhlYXZpbHkgb24gU29uaWNWaWJlcy5jOgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSAgVGhvbWFzIFNhaWxlciAoc2FpbGVyQGlmZS5lZS5ldGh6LmNoKQorICoKKyAqCUhlYXZpbHkgbW9kaWZpZWQgYnkgWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4gYmFzZWQgb24gbHVuY2gKKyAqCXdpdGggRVNTIGVuZ2luZWVycy4gIE1hbnkgdGhhbmtzIHRvIEhvd2FyZCBLaW0gZm9yIHByb3ZpZGluZyAKKyAqCWNvbnRhY3RzIGFuZCBoYXJkd2FyZS4gIEhvbm9yYWJsZSBtZW50aW9uIGdvZXMgdG8gRXJpYyAKKyAqCUJyb21iYXVnaCBmb3IgYWxsIHNvcnRzIG9mIHRoaW5ncy4gIEJlc3QgcmVnYXJkcyB0byB0aGUgCisgKglwcm9wcmlldG9ycyBvZiBIYWNrIENlbnRyYWwgZm9yIGZpbmUgbG9kZ2luZy4KKyAqCisgKiAgU3VwcG9ydGVkIGRldmljZXM6CisgKiAgL2Rldi9kc3AwLTMgICAgc3RhbmRhcmQgL2Rldi9kc3AgZGV2aWNlLCAobW9zdGx5KSBPU1MgY29tcGF0aWJsZQorICogIC9kZXYvbWl4ZXIgIHN0YW5kYXJkIC9kZXYvbWl4ZXIgZGV2aWNlLCAobW9zdGx5KSBPU1MgY29tcGF0aWJsZQorICoKKyAqICBIYXJkd2FyZSBEZXNjcmlwdGlvbgorICoKKyAqCUEgd29ya2luZyBNYWVzdHJvIHNldHVwIGNvbnRhaW5zIHRoZSBNYWVzdHJvIGNoaXAgd2lyZWQgdG8gYSAKKyAqCWNvZGVjIG9yIDIuICBJbiB0aGUgTWFlc3RybyB3ZSBoYXZlIHRoZSBBUFVzLCB0aGUgQVNTUCwgYW5kIHRoZQorICoJV2F2ZWNhY2hlLiAgVGhlIEFQVXMgY2FuIGJlIHRob3VnaCBvZiBhcyB2aXJ0dWFsIGF1ZGlvIHJvdXRpbmcKKyAqCWNoYW5uZWxzLiAgVGhleSBjYW4gdGFrZSBkYXRhIGZyb20gYSBudW1iZXIgb2Ygc291cmNlcyBhbmQgcGVyZm9ybQorICoJYmFzaWMgZW5jb2RpbmdzIG9mIHRoZSBkYXRhLiAgVGhlIHdhdmVjYWNoZSBpcyBhIHN0b3JlaG91c2UgZm9yCisgKglQQ00gZGF0YS4gIFR5cGljYWxseSBpdCBkZWFscyB3aXRoIFBDSSBhbmQgaW50ZXJyYWN0cyB3aXRoIHRoZQorICoJQVBVcy4gIFRoZSBBU1NQIGlzIGEgd2Fja3kgRFNQIGxpa2UgZGV2aWNlIHRoYXQgRVNTIGlzIGxvdGgKKyAqCXRvIHJlbGVhc2UgZG9jcyBvbi4gIFRoYW5rZnVsbHkgaXQgaXNuJ3QgcmVxdWlyZWQgb24gdGhlIE1hZXN0cm8KKyAqCXVudGlsIHlvdSBzdGFydCBkb2luZyBpbnNhbmUgdGhpbmdzIGxpa2UgRk0gZW11bGF0aW9uIGFuZCBzdXJyb3VuZAorICoJZW5jb2RpbmcuICBUaGUgY29kZWNzIGFyZSBhbG1vc3QgYWx3YXlzIEFDLTk3IGNvbXBsaWFudCBjb2RlY3MsIAorICoJYnV0IGl0IGFwcGVhcnMgdGhhdCBlYXJseSBNYWVzdHJvcyBtYXkgaGF2ZSBoYWQgUFQxMDEgKGFuIEVTUworICoJcGFydD8pIHdpcmVkIHRvIHRoZW0uICBUaGUgb25seSByZWFsIGRpZmZlcmVuY2UgaW4gdGhlIE1hZXN0cm8KKyAqCWZhbWlsaWVzIGlzIGV4dGVybmFsIGdvb3AgbGlrZSBkb2NraW5nIGNhcGFiaWxpdHksIG1lbW9yeSBmb3IKKyAqCXRoZSBBU1NQLCBhbmQgaW5pdGlhbGl6YXRpb24gZGlmZmVyZW5jZXMuCisgKgorICogIERyaXZlciBPcGVyYXRpb24KKyAqCisgKglXZSBvbmx5IGRyaXZlIHRoZSBBUFUvV2F2ZWNhY2hlIGFzIHR5cGljYWwgREFDcyBhbmQgZHJpdmUgdGhlCisgKgltaXhlcnMgaW4gdGhlIGNvZGVjcy4gIFRoZXJlIGFyZSA2NCBBUFVzLiAgV2UgYXNzaWduIDYgdG8gZWFjaAorICoJL2Rldi9kc3A/IGRldmljZS4gIDIgY2hhbm5lbHMgZm9yIG91dHB1dCwgYW5kIDQgY2hhbm5lbHMgZm9yCisgKglpbnB1dC4KKyAqCisgKglFYWNoIEFQVSBjYW4gZG8gYSBudW1iZXIgb2YgdGhpbmdzLCBidXQgd2Ugb25seSByZWFsbHkgdXNlCisgKgkzIGJhc2ljIGZ1bmN0aW9ucy4gIEZvciBwbGF5YmFjayB3ZSB1c2UgdGhlbSB0byBjb252ZXJ0IFBDTQorICoJZGF0YSBmZXRjaGVkIG92ZXIgUENJIGJ5IHRoZSB3YXZlY2FoY2hlIGludG8gYW5hbG9nIGRhdGEgdGhhdAorICoJaXMgaGFuZGVkIHRvIHRoZSBjb2RlYy4gIE9uZSBBUFUgZm9yIG1vbm8sIGFuZCBhIHBhaXIgZm9yIHN0ZXJlby4KKyAqCVdoZW4gaW4gc3RlcmVvLCB0aGUgY29tYmluYXRpb24gb2Ygc21hcnRzIGluIHRoZSBBUFUgYW5kIFdhdmVjYWNoZQorICoJZGVjaWRlIHdoaWNoIHdhdmVjYWNoZSBnZXRzIHRoZSBsZWZ0IG9yIHJpZ2h0IGNoYW5uZWwuCisgKgorICoJRm9yIHJlY29yZCB3ZSBzdGlsbCB1c2UgdGhlIG9sZCBvdmVybHkgbW9ubyBzeXN0ZW0uICBGb3IgZWFjaCBpbgorICoJY29taW5nIGNoYW5uZWwgdGhlIGRhdGEgY29tZXMgaW4gZnJvbSB0aGUgY29kZWMsIHRocm91Z2ggYSAnaW5wdXQnCisgKglBUFUsIHRocm91Z2ggYW5vdGhlciByYXRlIGNvbnZlcnRlciBBUFUsIGFuZCB0aGVuIGludG8gbWVtb3J5IHZpYQorICoJdGhlIHdhdmVjYWNoZSBhbmQgUENJLiAgSWYgaXRzIHN0ZXJlbywgd2UgbWFzaCBpdCBiYWNrIGludG8gTFJMUiBpbgorICoJc29mdHdhcmUuICBUaGUgcGFzcyBiZXR3ZWVuIHRoZSAyIEFQVXMgaXMgc3VwcG9zZWRseSB3aGF0IHJlcXVpcmVzIHVzCisgKgl0byBoYXZlIGEgNTEyIGJ5dGUgYnVmZmVyIHNpdHRpbmcgYXJvdW5kIGluIHdhdmVjYWNoZS9tZW1vcnkuCisgKgorICoJVGhlIHdhdmVjYWNoZSBtYWtlcyBvdXIgbGlmZSBldmVuIG1vcmUgZnVuLiAgRmlyc3Qgb2ZmLCBpdCBjYW4KKyAqCW9ubHkgYWRkcmVzcyB0aGUgZmlyc3QgMjggYml0cyBvZiBQQ0kgYWRkcmVzcyBzcGFjZSwgbWFraW5nIGl0CisgKgl1c2VsZXNzIG9uIHF1aXRlIGEgZmV3IGFyY2hpdGVjdHVyZXMuICBTZWNvbmRseSwgaXRzIGluc2FuZS4KKyAqCUl0IGNsYWltcyB0byBmZXRjaCBmcm9tIDQgcmVnaW9ucyBvZiBQQ0kgc3BhY2UsIGVhY2ggNCBtZWcgaW4gbGVuZ3RoLgorICoJQnV0IHRoYXQgZG9lc24ndCByZWFsbHkgd29yay4gIFlvdSBjYW4gb25seSB1c2UgMSByZWdpb24uICBTbyBhbGwgb3VyCisgKglhbGxvY2F0aW9ucyBoYXZlIHRvIGJlIGluIDRtZWcgb2YgZWFjaCBvdGhlci4gIEJvb28uICBIaXNzLgorICoJU28gd2UgaGF2ZSBhIG1vZHVsZSBwYXJhbWV0ZXIsIGRzcHNfb3JkZXIsIHRoYXQgaXMgdGhlIG9yZGVyIG9mCisgKgl0aGUgbnVtYmVyIG9mIGRzcHMgdG8gcHJvdmlkZS4gIEFsbCB0aGVpciBidWZmZXIgc3BhY2UgaXMgYWxsb2NhdGVkCisgKglvbiBvcGVuIHRpbWUuICBUaGUgc29uaWN2aWJlcyBPU1Mgcm91dGluZXMgd2UgaW5oZXJpdGVkIHJlYWxseSB3YW50CisgKglwb3dlciBvZiAyIGJ1ZmZlcnMsIHNvIHdlIGhhdmUgYWxsIHRob3NlIG5leHQgdG8gZWFjaCBvdGhlciwgdGhlbgorICoJNTEyIGJ5dGUgcmVnaW9ucyBmb3IgdGhlIHJlY29yZGluZyB3YXZlY2FjaGVzLiAgVGhpcyBlbmRzIHVwCisgKgl3YXN0aW5nIHF1aXRlIGEgYml0IG9mIG1lbW9yeS4gIFRoZSBvbmx5IGZpeGVzIEkgY2FuIHNlZSB3b3VsZCBiZSAKKyAqCWdldHRpbmcgYSBrZXJuZWwgYWxsb2NhdG9yIHRoYXQgY291bGQgd29yayBpbiB6b25lcywgb3IgZmlndXJpbmcgb3V0CisgKglqdXN0IGhvdyB0byBjb2VyY2UgdGhlIFdQIGludG8gZG9pbmcgd2hhdCB3ZSB3YW50LgorICoKKyAqCVRoZSBpbmRpcmVjdGlvbiBvZiB0aGUgdmFyaW91cyByZWdpc3RlcnMgbWVhbnMgd2UgaGF2ZSB0byBzcGlubG9jaworICoJbmVhcmx5IGFsbCByZWdpc3RlciBhY2Nlc3Nlcy4gIFdlIGhhdmUgdGhlIG1haW4gcmVnaXN0ZXIgaW5kaXJlY3Rpb24KKyAqCWxpa2UgdGhlIHdhdmUgY2FjaGUsIG1hZXN0cm8gcmVnaXN0ZXJzLCBldGMuICBUaGVuIHdlIGhhdmUgYmVhc3RzCisgKglsaWtlIHRoZSBBUFUgaW50ZXJmYWNlIHRoYXQgaXMgaW5kaXJlY3QgcmVnaXN0ZXJzIGdvdHRlbiBhdCB0aHJvdWdoCisgKgl0aGUgbWFpbiBtYWVzdHJvIGluZGlyZWN0aW9uLiAgT3VjaC4gIFdlIHNwaW5sb2NrIGFyb3VuZCB0aGUgYWN0dWFsCisgKglwb3J0cyBvbiBhIHBlciBjYXJkIGJhc2lzLiAgVGhpcyBtZWFucyBzcGlubG9jayBhY3Rpdml0eSBhdCBlYWNoIElPCisgKglvcGVyYXRpb24sIGJ1dCB0aGUgb25seSBJTyBvcGVyYXRpb24gY2x1c3RlcnMgYXJlIGluIG5vbiBjcml0aWNhbCAKKyAqCXBhdGhzIGFuZCBpdCBtYWtlcyB0aGUgY29kZSBmYXIgZWFzaWVyIHRvIGZvbGxvdy4gIEludGVycnVwdHMgYXJlCisgKglibG9ja2VkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2tzIGJlY2F1c2UgdGhlIGludCBoYW5kbGVyIGhhcyB0bworICoJZ2V0IGF0IHNvbWUgb2YgdGhlbSA6KC4gIFRoZSBtaXhlciBpbnRlcmZhY2UgZG9lc24ndCwgaG93ZXZlci4KKyAqCVdlIGFsc28gaGF2ZSBhbiBPU1Mgc3RhdGUgbG9jayB0aGF0IGlzIHRocm93biBhcm91bmQgaW4gYSBmZXcKKyAqCXBsYWNlcy4KKyAqCisgKglUaGlzIGRyaXZlciBoYXMgYnJ1dGUgZm9yY2UgQVBNIHN1c3BlbmQgc3VwcG9ydC4gIFdlIGNhdGNoIHN1c3BlbmQKKyAqCW5vdGlmaWNhdGlvbnMgYW5kIHN0b3AgYWxsIHdvcmsgYmVpbmcgZG9uZSBvbiB0aGUgY2hpcC4gIEFueSBwZW9wbGUKKyAqCXRoYXQgdHJ5IGJldHdlZW4gdGhpcyBzaHV0ZG93biBhbmQgdGhlIHJlYWwgc3VzcGVuZCBvcGVyYXRpb24gd2lsbAorICoJYmUgcHV0IHRvIHNsZWVwLiAgV2hlbiB3ZSByZXN1bWUgd2UgcmVzdG9yZSBvdXIgc29mdHdhcmUgc3RhdGUgb24KKyAqCXRoZSBjaGlwIGFuZCB3YWtlIHVwIHRoZSBwZW9wbGUgdGhhdCB3ZXJlIHVzaW5nIGl0LiAgVGhlIGNvZGUgdGhhdHMKKyAqCWJlaW5nIHVzZWQgbm93IGlzIHF1aXRlIGRpcnR5IGFuZCBhc3N1bWVzIHdlJ3JlIG9uIGEgdW5pLXByb2Nlc3NvcgorICoJbWFjaGluZS4gIE11Y2ggb2YgaXQgd2lsbCBuZWVkIHRvIGJlIGNsZWFuZWQgdXAgZm9yIFNNUCBBQ1BJIG9yIAorICoJc2ltaWxhci4KKyAqCisgKglXZSBhbHNvIHBheSBhdHRlbnRpb24gdG8gUENJIHBvd2VyIG1hbmFnZW1lbnQgbm93LiAgVGhlIGRyaXZlcgorICoJd2lsbCBwb3dlciBkb3duIHVuaXRzIG9mIHRoZSBjaGlwIHRoYXQgaXQga25vd3MgYXJlbid0IG5lZWRlZC4KKyAqCVRoZSBXYXZlUHJvY2Vzc29yIGFuZCBjb21wYW55IGFyZSBvbmx5IHBvd2VyZWQgb24gd2hlbiBwZW9wbGUKKyAqCWhhdmUgL2Rldi9kc3AqcyBvcGVuLiAgT24gcmVtb3ZhbCB0aGUgZHJpdmVyIHdpbGwKKyAqCXBvd2VyIGRvd24gdGhlIG1hZXN0cm8gZW50aXJlbHkuICBUaGVyZSBjb3VsZCBzdGlsbCBiZQorICoJdHJvdWJsZSB3aXRoIEJJT1NlbiB0aGF0IG1hZ2ljYWxseSBjaGFuZ2UgcG93ZXIgc3RhdGVzIAorICoJdGhlbXNlbHZlcywgYnV0IHdlJ2xsIHNlZS4gIAorICoJCisgKiBIaXN0b3J5CisgKiAgdjAuMTUgLSBNYXkgMjEgMjAwMSAtIE1hcmN1cyBNZWlzc25lciA8bW1AY2FsZGVyYS5kZT4KKyAqICAgICAgUG9ydGVkIHRvIExpbnV4IDIuNCBQQ0kgQVBJLiBTb21lIGNsZWFuIHVwcywgZ2xvYmFsIGRldnMgbGlzdAorICogICAgICByZW1vdmVkIChub3cgdXNpbmcgcGNpIGRldmljZSBkcml2ZXIgZGF0YSkuCisgKiAgICAgIFBNIG5lZWRzIHRvIGJlIHBvbGlzaGVkIHN0aWxsLiBCdW1wZWQgdmVyc2lvbi4KKyAqICAoc3RpbGwga2luZCBvZiB2MC4xNCkgTWF5IDEzIDIwMDEgLSBCZW4gUGZhZmYgPHBmYWZmYmVuQG1zdS5lZHU+CisgKiAgICAgIEFkZCBzdXBwb3J0IGZvciA5NzggZG9ja2luZyBhbmQgYmFzaWMgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2wKKyAqICAoc3RpbGwga2luZCBvZiB2MC4xNCkgTm92IDIzIC0gQWxhbiBDb3ggPGFsYW5AcmVkaGF0LmNvbT4KKyAqCUFkZCBjbG9ja2luZz0gZm9yIHBlb3BsZSB3aXRoIHNlcmlvdXNseSB3YXJwZWQgaGFyZHdhcmUKKyAqICAoc3RpbGwgdjAuMTQpIE5vdiAxMCAyMDAwIC0gQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Ymt6QGxpbnV4LWlkZS5vcmc+CisgKglhZGQgX19pbml0IHRvIG1hZXN0cm9fYWM5N19pbml0KCkgYW5kIG1hZXN0cm9faW5zdGFsbCgpCisgKiAgKHN0aWxsIGJhc2VkIG9uIHYwLjE0KSBNYXIgMjkgMjAwMCAtIFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPgorICoJbW92ZSB0byAyLjMgcG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2UsIHdoaWNoCisgKgkJcmVxdWlyZWQgaGFja2luZyBzb21lIHN1c3BlbmQvcmVzdW1lL2NoZWNrIHBhdGhzIAorICoJbWFrZSBzdGF0aWMgY29tcGlsYXRpb24gd29yaworICogIHYwLjE0IC0gSmFuIDI4IDIwMDAgLSBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KKyAqCWFkZCBQQ0kgcG93ZXIgbWFuYWdlbWVudCB0aHJvdWdoIEFDUEkgcmVncy4KKyAqCXdlIG5vdyBzaHV0IGRvd24gb24gbWFjaGluZSByZWJvb3QvaGFsdAorICoJbGVhdmUgc2NhcnkgUENJIGNvbmZpZyBpdGVtcyBhbG9uZSAoaXNhIHN0dWZmLCBtb3N0bHkpCisgKgllbmFibGUgMTkyMXMsIGl0IHNlZW1zIG9ubHkgbWluZSB3YXMgYnJva2UuCisgKglmaXggc3dhcHBlZCBsZWZ0L3JpZ2h0IHBjbSBkYWMuICBoYXIgaGFyLgorICoJdXAgYm9iIGZyZXEsIGluY3JlYXNlIGJ1ZmZlcnMsIGZpeCBwb2ludGVycyBhdCB1bmRlcmZsb3cKKyAqCXNpbGx5IGNvbXBpbGF0aW9uIHByb2JsZW1zCisgKiAgdjAuMTMgLSBOb3YgMTggMTk5OSAtIFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPgorICoJZml4IG5lYyBWZXJzYXM/ICBtYW4gd291bGQgdGhhdCBiZSBjb29sLgorICogIHYwLjEyIC0gTm92IDEyIDE5OTkgLSBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KKyAqCWJyb3duIGJhZyB2b2x1bWUgbWF4IGZpeC4uCisgKiAgdjAuMTEgLSBOb3YgMTEgMTk5OSAtIFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPgorICoJdXNlIHByb3BlciBzdGVyZW8gYXB1IGRlY29kaW5nLCBtbWFwL3dyaXRlIHNob3VsZCB3b3JrLgorICoJbWFrZSB2b2x1bWUgc2xpZGVycyBtb3JlIHVzZWZ1bCwgdHdlYWsgcmF0ZSBjYWxjdWxhdGlvbi4KKyAqCWZpeCBsYW1lIDhiaXQgZm9ybWF0IHJlcG9ydGluZyBidWcuICBkdWguIGFwbSBhcHUgc2F2aW5nIGJ1Z2xldCBhbHNvCisgKglmaXggbWFlc3RybyAxIGNsb2NrIGZyZXEgImJ1ZyIsIHJlbW92ZSBwdDEwMSBzdXBwb3J0CisgKiAgdjAuMTAgLSBPY3QgMjggMTk5OSAtIFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPgorICoJYWhhLCBzbywgc29tZXRpbWVzIHRoZSBXUCB3cml0ZXMgYSBzdGF0dXMgd29yZCB0byBvZmZzZXQgMAorICoJICBmcm9tIG9uZSBvZiB0aGUgUENNQkFScy4gIHJlYXJyYW5nZSBhbGxvY2F0aW9uIGFjY29yZGluZ2x5Li4KKyAqCSAgY2hlZXJzIGFnYWluIHRvIEVyaWMgZm9yIGJlaW5nIGEgZ29vZCBoYWNrZXIgaW4gaW52ZXN0aWdhdGluZyB0aGlzLgorICoJSmVyb2VuIEhvb2dlcnZvcnN0IHN1Ym1pdHMgNzUwMCBmaXggb3V0IG9mIG5vd2hlcmUuICB5YXkuICA6KQorICogIHYwLjA5IC0gT2N0IDIzIDE5OTkgLSBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KKyAqCWFkZGVkIEFQTSBzdXBwb3J0LgorICoJcmUtb3JkZXIgc29tZXRoaW5nIHN1Y2ggdGhhdCBzb21lIDJFcyBub3cgd29yay4gIE1hZ2ljIQorICoJbmV3IGNvZGVjIHJlc2V0IHJvdXRpbmUuICBtYWRlIHNvbWUgY29kZWNzIGNvbWUgdG8gbGlmZS4KKyAqCWZpeCBjbGVhcl9hZHZhbmNlLCBzeW5jIHNvbWUgY29udHJvbCB3aXRoIEVTUy4KKyAqCW5vdyB3cml0ZSB0byBhbGwgYmFzZSByZWdzIHRvIGJlIHBhcmFub2lkLgorICogIHYwLjA4IC0gT2N0IDIwIDE5OTkgLSBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KKyAqCUZpeCBpbml0aWFsIGJ1ZmxlbiBidWcuICBJIGFtIHNvIHNtYXJ0LiAgYWxzbyBzbXAgY29tcGlsaW5nLi4KKyAqCUkgb3dlIEVyaWMgeWV0IGFub3RoZXIgYmVlcjogZml4ZWQgcmVjbWFzaywgaWdhaW4sIAorICoJICBtdXRpbmcsIGFuZCBhZGMgc3luYyBjb25zaXN0ZW5jeS4gIEdvIFRlYW0uCisgKiAgdjAuMDcgLSBPY3QgNCAxOTk5IC0gWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CisgKgl0d2VhayBhZGMvZGFjLCBmb3JtYXRpbmcsIGFuZCBzdHVmZiB0byBhbGxvdyBmdWxsIGR1cGxleAorICoJYWxsb2NhdGUgZHNwcyBtZW1vcnkgYXQgb3BlbigpIHNvIHdlIGNhbiBmaXQgaW4gdGhlIHdhdmVjYWNoZSB3aW5kb3cKKyAqCWZpeCB3YXZlY2FjaGUgYnJhaW5kYW1hZ2UuICBhZ2Fpbi4gIG5vIG1vcmUgc2NyaWJibGluZz8KKyAqCWZpeCBlc3MgMTkyMSBjb2RlYyBidWcgb24gc29tZSBsYXB0b3BzLgorICoJZml4IGR1bWIgcGNpIHNjYW5uaW5nIGJ1ZworICoJc3RhcnRlZCAyLjMgY2xlYW51cCwgcmVkaWQgc3BpbmxvY2tzLCBsaXR0bGUgY2xlYW51cHMKKyAqICB2MC4wNiAtIFNlcCAyMCAxOTk5IC0gWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CisgKglmaXggd2F2ZWNhY2hlIHRoaW5rb3MuICBsaW1pdCB0byAxIC9kZXYvZHNwLgorICoJZXJpYyBpcyB3ZWFyaW5nIGhpcyB0aGlua2luZyB0b3F1ZSB0aGlzIHdlZWsuCisgKgkJc3BvdHRlZCBhcHUgbW9kZSBidWdzIGFuZCBnYWluIHJhbXBpbmcgcHJvYmxlbQorICoJZG9uJ3QgdG91Y2ggd2VpcmQgbWl4ZXIgcmVncywgbWFrZSByZWNtYXNrIG9wdGlvbmFsCisgKglmaXhlZCBpZ2FpbiBpbnZlcnNpb24sIGRlZmF1bHRzIGZvciBtaXhlcnMsIGNsZWFuIHVwIHJlY19zdGFydAorICoJbWFrZSBtb25vIHJlY29yZGluZyB3b3JrLgorICoJcmVwb3J0IHN1YnN5c3RlbSBzdHVmZiwgcGxlYXNlIHNlbmQgcmVwb3J0cy4KKyAqCWxpdHRsZXM6IHBhcmFsbGVsIG91dCwgYW1wIG5vdworICogIHYwLjA1IC0gU2VwIDE3IDE5OTkgLSBaYWNoIEJyb3duIDx6YWJAcmVkaGF0LmNvbT4KKyAqCW1lcmdlZCBhbmQgZml4ZWQgdXAgRXJpYydzIGluaXRpYWwgcmVjb3JkaW5nIGNvZGUKKyAqCW11bmdlZCBmb3JtYXQgaGFuZGxpbmcgdG8gY2F0Y2ggbWlzdXNlLCBuZWVkcyByZXdyaXRlLgorICoJcmV2ZXJ0IHJpbmcgYnVzIGluaXQsIGZpeHVwIHNoYXJlZCBpbnQsIGFkZCBwY2kgYnVzbWFzdGVyIHNldHRpbmcKKyAqCWZpeCBtaXhlciBvc3MgaW50ZXJmYWNlLCBmaXggbWljIG11dGUgYW5kIHJlY21hc2sKKyAqCW1hc2sgb2ZmIHVuc3VwcG9ydGVkIG1peGVycywgcmVzZXQgd2l0aCBhbGwgMXMsIG1vZHVsYXJpemUgZGVmYXVsdHMKKyAqCW1ha2Ugc3VyZSBib2IgaXMgcnVubmluZyB3aGlsZSB3ZSBuZWVkIGl0CisgKglnb3QgcmlkIG9mIGRldmljZSBsaW1pdCwgaW5pdGlhbCBtaW5pbWFsIGFwbSBob29rcworICoJcHVsbCBvdXQgZGVhZCBjb2RlL2luY2x1ZGVzLCBvbmx5IGFsbG93IG11bHRpbWVkaWEvYXVkaW8gbWFlc3Ryb3MKKyAqICB2MC4wNCAtIFNlcCAwMSAxOTk5IC0gWmFjaCBCcm93biA8emFiQHJlZGhhdC5jb20+CisgKgljb3BpZWQgbWVtb3J5IGxlYWsgZml4IGZyb20gc29uaWN2aWJlcyBkcml2ZXIKKyAqCWRpZmZlcmVudCBhYzk3IHJlc2V0LCBwbGF5IHdpdGggMi4wIGFjOTcsIHNpbXBsaWZ5IHJpbmcgYnVzIHNldHVwCisgKglib2IgZnJlcSBjb2RlLCByZWdpb24gc2FuaXR5LCBqaXR0ZXIgc3luYyBmaXg7IGFsbCBmcm9tIEVyaWMgCisgKgorICogVE9ETworICoJZml4IGJvYiBmcmVxdWVuY3kKKyAqCWVuZGlhbm5lc3MKKyAqCWRvIHNtYXJ0IHRoaW5ncyB3aXRoIGFjOTcgMi4wIGJpdHMuCisgKglkdWFsIGNvZGVjcworICoJbGVhdmUgNTQtPjYxIG9wZW4KKyAqCisgKglpdCBhbHNvIHdvdWxkIGJlIGZ1biB0byBoYXZlIGEgbW9kZSB0aGF0IHdvdWxkIG5vdCB1c2UgcGNpIGRtYSBhdCBhbGwKKyAqCWJ1dCB3b3VsZCBjb3B5IGludG8gdGhlIHdhdmVjYWNoZSBvbiBib2FyZCBtZW1vcnkgYW5kIHVzZSB0aGF0IAorICoJb24gYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGxpa2UgdGhlIG1hZXN0cm8ncyBwY2kgZG1hIGlja2luZXNzLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGFzbS9jdXJyZW50Lmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgPGxpbnV4L3BtLmg+CitzdGF0aWMgaW50IG1hZXN0cm9fcG1fY2FsbGJhY2soc3RydWN0IHBtX2RldiAqZGV2LCBwbV9yZXF1ZXN0X3QgcnFzdCwgdm9pZCAqZCk7CisKKyNpbmNsdWRlICJtYWVzdHJvLmgiCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtYWVzdHJvX3BjaV9kcml2ZXI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1fREVCVUcgMQorCisjaWZkZWYgTV9ERUJVRworc3RhdGljIGludCBkZWJ1ZzsKKyNkZWZpbmUgTV9wcmludGsoYXJncy4uLikge2lmIChkZWJ1ZykgcHJpbnRrKGFyZ3MpO30KKyNlbHNlCisjZGVmaW5lIE1fcHJpbnRrKHgpCisjZW5kaWYKKworLyogd2UgdHJ5IHRvIHNldHVwIDJeKGRzcHNfb3JkZXIpIC9kZXYvZHNwIGRldmljZXMgKi8KK3N0YXRpYyBpbnQgZHNwc19vcmRlcjsKKy8qIHdoZXRoZXIgb3Igbm90IHdlIG1lc3MgYXJvdW5kIHdpdGggcG93ZXIgbWFuYWdlbWVudCAqLworc3RhdGljIGludCB1c2VfcG09MjsgLyogc2V0IHRvIDEgZm9yIGZvcmNlICovCisvKiBjbG9ja2luZyBmb3IgYnJva2VuIGhhcmR3YXJlIC0gYSBmZXcgbGFwdG9wcyBzZWVtIHRvIHVzZSBhIDUwS2h6IGNsb2NrCisJaWUgaW5zbW9kIHdpdGggY2xvY2tpbmc9NTAwMDAgb3Igc28gKi8KKwkKK3N0YXRpYyBpbnQgY2xvY2tpbmc9NDgwMDA7CisKK01PRFVMRV9BVVRIT1IoIlphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+LCBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJFU1MgTWFlc3RybyBEcml2ZXIiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworI2lmZGVmIE1fREVCVUcKK21vZHVsZV9wYXJhbShkZWJ1ZywgYm9vbCwgMDY0NCk7CisjZW5kaWYKK21vZHVsZV9wYXJhbShkc3BzX29yZGVyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHVzZV9wbSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShjbG9ja2luZywgaW50LCAwKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIERSSVZFUl9WRVJTSU9OICIwLjE1IgorCisjaWZuZGVmIFBDSV9WRU5ET1JfRVNTCisjZGVmaW5lIFBDSV9WRU5ET1JfRVNTCQkJMHgxMjVECisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0VTUzE5NjgJMHgxOTY4CQkvKiBNYWVzdHJvIDIJKi8KKyNkZWZpbmUgUENJX0RFVklDRV9JRF9FU1NfRVNTMTk3OCAgICAgIAkweDE5NzgJCS8qIE1hZXN0cm8gMkUJKi8KKworI2RlZmluZSBQQ0lfVkVORE9SX0VTU19PTEQJCTB4MTI4NQkJLyogUGxhdGZvcm0gVGVjaCwgCisJCQkJCQl0aGUgcGVvcGxlIHRoZSBtYWVzdHJvIAorCQkJCQkJd2FzIGJvdWdodCBmcm9tICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfRVNTX0VTUzAxMDAJMHgwMTAwCQkvKiBtYWVzdHJvIDEgKi8KKyNlbmRpZiAvKiBQQ0lfVkVORE9SX0VTUyAqLworCisjZGVmaW5lIEVTU19DSEFOX0hBUkQJCTB4MTAwCisKKy8qIE5FQyBWZXJzYXMgPyAqLworI2RlZmluZSBORUNfVkVSU0FfU1VCSUQxCTB4ODA1ODEwMzMKKyNkZWZpbmUgTkVDX1ZFUlNBX1NVQklEMgkweDgwM2MxMDMzCisKKworLyogY2hhbmdlZCBzbyB0aGF0IEkgY291bGQgYWN0dWFsbHkgZmluZCBhbGwgdGhlCisJcmVmZXJlbmNlcyBhbmQgZml4IHRoZW0gdXAuICBpdCdzIGEgbGl0dGxlIG1vcmUgcmVhZGFibGUgbm93LiAqLworI2RlZmluZSBFU1NfRk1UX1NURVJFTwkweDAxCisjZGVmaW5lIEVTU19GTVRfMTZCSVQJMHgwMgorI2RlZmluZSBFU1NfRk1UX01BU0sJMHgwMworI2RlZmluZSBFU1NfREFDX1NISUZUCTAgICAKKyNkZWZpbmUgRVNTX0FEQ19TSElGVAk0CisKKyNkZWZpbmUgRVNTX1NUQVRFX01BR0lDCQkweDEyNUQxOTY4CisjZGVmaW5lIEVTU19DQVJEX01BR0lDCQkweDE5MjgzNzQ2CisKKyNkZWZpbmUgREFDX1JVTk5JTkcJCTEKKyNkZWZpbmUgQURDX1JVTk5JTkcJCTIKKworI2RlZmluZSBNQVhfRFNQX09SREVSCTIKKyNkZWZpbmUgTUFYX0RTUFMJKDE8PE1BWF9EU1BfT1JERVIpCisjZGVmaW5lIE5SX0RTUFMJCSgxPDxkc3BzX29yZGVyKQorI2RlZmluZSBOUl9JRFJTCQkzMgorCisjZGVmaW5lIE5SX0FQVVMJCTY0CisjZGVmaW5lIE5SX0FQVV9SRUdTCTE2CisKKy8qIGFjcGkgc3RhdGVzICovCitlbnVtIHsKKwlBQ1BJX0QwPTAsCisJQUNQSV9EMSwKKwlBQ1BJX0QyLAorCUFDUElfRDMKK307CisKKy8qIGJpdHMgaW4gdGhlIGFjcGkgbWFza3MgKi8KKyNkZWZpbmUgQUNQSV8xMk1IWgkoIDEgPDwgMTUpCisjZGVmaW5lIEFDUElfMjRNSFoJKCAxIDw8IDE0KQorI2RlZmluZSBBQ1BJXzk3OAkoIDEgPDwgMTMpCisjZGVmaW5lIEFDUElfU1BESUYJKCAxIDw8IDEyKQorI2RlZmluZSBBQ1BJX0dMVUUJKCAxIDw8IDExKQorI2RlZmluZSBBQ1BJX18xMAkoIDEgPDwgMTApIC8qIHJlc2VydmVkICovCisjZGVmaW5lIEFDUElfUENJSU5UCSggMSA8PCA5KQorI2RlZmluZSBBQ1BJX0hWCQkoIDEgPDwgOCkgLyogaGFyZHdhcmUgdm9sdW1lICovCisjZGVmaW5lIEFDUElfR1BJTwkoIDEgPDwgNykKKyNkZWZpbmUgQUNQSV9BU1NQCSggMSA8PCA2KQorI2RlZmluZSBBQ1BJX1NCCQkoIDEgPDwgNSkgLyogc2IgZW11bCAqLworI2RlZmluZSBBQ1BJX0ZNCQkoIDEgPDwgNCkgLyogZm0gZW11bCAqLworI2RlZmluZSBBQ1BJX1JCCQkoIDEgPDwgMykgLyogcmluZ2J1cyAvIGFjbGluayAqLworI2RlZmluZSBBQ1BJX01JREkJKCAxIDw8IDIpIAorI2RlZmluZSBBQ1BJX0dQCQkoIDEgPDwgMSkgLyogZ2FtZSBwb3J0ICovCisjZGVmaW5lIEFDUElfV1AJCSggMSA8PCAwKSAvKiB3YXZlIHByb2Nlc3NvciAqLworCisjZGVmaW5lIEFDUElfQUxMCSgweGZmZmYpCisjZGVmaW5lIEFDUElfU0xFRVAJKH4oQUNQSV9TUERJRnxBQ1BJX0FTU1B8QUNQSV9TQnxBQ1BJX0ZNfCBcCisJCQlBQ1BJX01JREl8QUNQSV9HUHxBQ1BJX1dQKSkKKyNkZWZpbmUgQUNQSV9OT05FCShBQ1BJX18xMCkKKworLyogdGhlc2UgbWFza3MgaW5kaWNhdGUgd2hpY2ggdW5pdHMgd2UgY2FyZSBhYm91dCBhdAorCXdoaWNoIHN0YXRlcyAqLworc3RhdGljIHUxNiBhY3BpX3N0YXRlX21hc2tbXSA9IHsKKwlbQUNQSV9EMF0gPSBBQ1BJX0FMTCwKKwlbQUNQSV9EMV0gPSBBQ1BJX1NMRUVQLAorCVtBQ1BJX0QyXSA9IEFDUElfU0xFRVAsCisJW0FDUElfRDNdID0gQUNQSV9OT05FCit9OworCitzdGF0aWMgY2hhciB2ZXJzaW9uW10gX19kZXZpbml0ZGF0YSA9CitLRVJOX0lORk8gIm1hZXN0cm86IHZlcnNpb24gIiBEUklWRVJfVkVSU0lPTiAiIHRpbWUgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIjsKKworCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKKworZW51bSBjYXJkX3R5cGVzX3QgeworCVRZUEVfTUFFU1RSTywKKwlUWVBFX01BRVNUUk8yLAorCVRZUEVfTUFFU1RSTzJFCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY2FyZF9uYW1lc1tdPXsKKwlbVFlQRV9NQUVTVFJPXSA9ICJFU1MgTWFlc3RybyIsCisJW1RZUEVfTUFFU1RSTzJdID0gIkVTUyBNYWVzdHJvIDIiLAorCVtUWVBFX01BRVNUUk8yRV0gPSAiRVNTIE1hZXN0cm8gMkUiCit9OworCitzdGF0aWMgaW50IGNsb2NrX2ZyZXFbXT17CisJW1RZUEVfTUFFU1RST10gPSAoNDkxNTIwMDBMIC8gMTAyNEwpLAorCVtUWVBFX01BRVNUUk8yXSA9ICg1MDAwMDAwMEwgLyAxMDI0TCksCisJW1RZUEVfTUFFU1RSTzJFXSA9ICg1MDAwMDAwMEwgLyAxMDI0TCkKK307CisKK3N0YXRpYyBpbnQgbWFlc3Ryb19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpidWYpOworCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIG1hZXN0cm9fbmIgPSB7bWFlc3Ryb19ub3RpZmllciwgTlVMTCwgMH07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgZXNzX3N0YXRlIHsKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisJLyogRklYTUU6IHdlIHByb2JhYmx5IHdhbnQgc3VibWl4ZXJzIGluIGhlcmUsIGJ1dCBvbmx5IG9uZSByZWNvcmQgcGFpciAqLworCXU4IGFwdVs2XTsJCS8qIGwvciBvdXRwdXQsIGwvciBpbnRwdXQgY29udmVydGVycywgbC9yIGlucHV0IGFwdXMgKi8KKwl1OCBhcHVfbW9kZVs2XTsJCS8qIFJ1bm5pbmcgbW9kZSBmb3IgdGhpcyBBUFUgKi8KKwl1OCBhcHVfcGFuWzZdOwkJLyogUGFubmluZyBzZXR1cCBmb3IgdGhpcyBBUFUgKi8KKwl1MzIgYXB1X2Jhc2VbNl07CS8qIGJhc2UgYWRkcmVzcyBmb3IgdGhpcyBhcHUgKi8KKwlzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQ7CS8qIENhcmQgaW5mbyAqLworCS8qIHdhdmUgc3R1ZmYgKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZWFkYywgcmF0ZWRhYzsKKwl1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlOworCisJaW50IGluZGV4OworCisJLyogdGhpcyBsb2NrcyBhcm91bmQgdGhlIG9zcyBzdGF0ZSBpbiB0aGUgZHJpdmVyICovCisJc3BpbmxvY2tfdCBsb2NrOworCS8qIG9ubHkgbGV0IDEgYmUgb3BlbmluZyBhdCBhIHRpbWUgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKwltb2RlX3Qgb3Blbl9tb2RlOworCisJLyogc291bmRjb3JlIHN0dWZmICovCisJaW50IGRldl9hdWRpbzsKKworCXN0cnVjdCBkbWFidWYgeworCQl2b2lkICpyYXdidWY7CisJCXVuc2lnbmVkIGJ1Zm9yZGVyOworCQl1bnNpZ25lZCBudW1mcmFnOworCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CisJCS8qIFhYWCB6YWIgLSBzd3B0ciBvbmx5IGluIGhlcmUgc28gdGhhdCBpdCBjYW4gYmUgcmVmZXJlbmNlZCBieQorCQkJY2xlYXJfYWR2YW5jZSwgYXMgZmFyIGFzIEkgY2FuIHRlbGwgOiggKi8KKwkJdW5zaWduZWQgaHdwdHIsIHN3cHRyOworCQl1bnNpZ25lZCB0b3RhbF9ieXRlczsKKwkJaW50IGNvdW50OworCQl1bnNpZ25lZCBlcnJvcjsgLyogb3Zlci91bmRlcnJ1biAqLworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCisJCXVuc2lnbmVkIGZyYWdzaXplOworCQl1bnNpZ25lZCBkbWFzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKwkJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIG1hcHBlZDoxOworCQl1bnNpZ25lZCByZWFkeToxOwkvKiBvdXIgb3NzIGJ1ZmZlcnMgYXJlIHJlYWR5IHRvIGdvICovCisJCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKKwkJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OworCQlpbnQgb3NzbWF4ZnJhZ3M7CisJCXVuc2lnbmVkIHN1YmRpdmlzaW9uOworCQl1MTYgYmFzZTsJCS8qIE9mZnNldCBmb3IgcHRyICovCisJfSBkbWFfZGFjLCBkbWFfYWRjOworCisJLyogcG9pbnRlciB0byBlYWNoIGRzcD9zIHBpZWNlIG9mIHRoZSBhcHUtPnNyYyBidWZmZXIgcGFnZSAqLworCXZvaWQgKm1peGJ1ZjsKKworfTsKKwkKK3N0cnVjdCBlc3NfY2FyZCB7CisJdW5zaWduZWQgaW50IG1hZ2ljOworCisJLyogV2Uga2VlcCBtYWVzdHJvIGNhcmRzIGluIGEgbGlua2VkIGxpc3QgKi8KKwlzdHJ1Y3QgZXNzX2NhcmQgKm5leHQ7CisKKwlpbnQgZGV2X21peGVyOworCisJaW50IGNhcmRfdHlwZTsKKworCS8qIGFzIG1vc3Qgb2YgdGhpcyBpcyBzdGF0aWMsCisJCXBlcmhhcHMgaXQgc2hvdWxkIGJlIGEgcG9pbnRlciB0byBhIGdsb2JhbCBzdHJ1Y3QgKi8KKwlzdHJ1Y3QgbWl4ZXJfZ29vIHsKKwkJaW50IG1vZGNudDsKKwkJaW50IHN1cHBvcnRlZF9taXhlcnM7CisJCWludCBzdGVyZW9fbWl4ZXJzOworCQlpbnQgcmVjb3JkX3NvdXJjZXM7CisJCS8qIHRoZSBjYWxsZXIgbXVzdCBndWFyYW50ZWUgYXJnIHNhbml0eSBiZWZvcmUgY2FsbGluZyB0aGVzZSAqLworLyoJCWludCAoKnJlYWRfbWl4ZXIpKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgaW50IGluZGV4KTsqLworCQl2b2lkICgqd3JpdGVfbWl4ZXIpKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCxpbnQgbWl4ZXIsIHVuc2lnbmVkIGludCBsZWZ0LHVuc2lnbmVkIGludCByaWdodCk7CisJCWludCAoKnJlY21hc2tfaW8pKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCxpbnQgcncsaW50IG1hc2spOworCQl1bnNpZ25lZCBpbnQgbWl4ZXJfc3RhdGVbU09VTkRfTUlYRVJfTlJERVZJQ0VTXTsKKwl9IG1peDsKKwkKKwlpbnQgcG93ZXJfcmVnczsKKwkJCisJaW50IGluX3N1c3BlbmQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgc3VzcGVuZF9xdWV1ZTsKKworCXN0cnVjdCBlc3Nfc3RhdGUgY2hhbm5lbHNbTUFYX0RTUFNdOworCXUxNiBtYWVzdHJvX21hcFtOUl9JRFJTXTsJLyogUmVnaXN0ZXIgbWFwICovCisJLyogd2UgaGF2ZSB0byBzdG9yZSB0aGlzIGp1bmsgc28gdGhhdCB3ZSBjYW4gY29tZSBiYWNrIGZyb20gYQorCQlzdXNwZW5kICovCisJdTE2IGFwdV9tYXBbTlJfQVBVU11bTlJfQVBVX1JFR1NdOwkvKiBjb250ZW50cyBvZiBhcHUgcmVncyAqLworCisJLyogdGhpcyBsb2NrcyBhcm91bmQgdGhlIHBoeXNpY2FsIHJlZ2lzdGVycyBvbiB0aGUgY2FyZCAqLworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qIG1lbW9yeSBmb3IgdGhpcyBjYXJkLi4gd2F2ZWNhY2hlIGxpbWl0ZWQgOigqLworCXZvaWQgKmRtYXBhZ2VzOworCWludCBkbWFvcmRlcjsKKworCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisJdTMyIGlvYmFzZTsKKwl1MzIgaXJxOworCisJaW50IGJvYl9mcmVxOworCWNoYXIgZHNwc19vcGVuOworCisJaW50IGRvY2tfbXV0ZV92b2w7Cit9OworCitzdGF0aWMgdm9pZCBzZXRfbWl4ZXIoc3RydWN0IGVzc19jYXJkICpjYXJkLHVuc2lnbmVkIGludCBtaXhlciwgdW5zaWduZWQgaW50IHZhbCApOworCitzdGF0aWMgdW5zaWduZWQgCitsZDIodW5zaWduZWQgaW50IHgpCit7CisJdW5zaWduZWQgciA9IDA7CisJCisJaWYgKHggPj0gMHgxMDAwMCkgeworCQl4ID4+PSAxNjsKKwkJciArPSAxNjsKKwl9CisJaWYgKHggPj0gMHgxMDApIHsKKwkJeCA+Pj0gODsKKwkJciArPSA4OworCX0KKwlpZiAoeCA+PSAweDEwKSB7CisJCXggPj49IDQ7CisJCXIgKz0gNDsKKwl9CisJaWYgKHggPj0gNCkgeworCQl4ID4+PSAyOworCQlyICs9IDI7CisJfQorCWlmICh4ID49IDIpCisJCXIrKzsKKwlyZXR1cm4gcjsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgY2hlY2tfc3VzcGVuZChzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICoJRVNTIE1hZXN0cm8gQUM5NyBjb2RlYyBwcm9ncmFtbWluZyBpbnRlcmZhY2UuCisgKi8KKwkgCitzdGF0aWMgdm9pZCBtYWVzdHJvX2FjOTdfc2V0KHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgdTggY21kLCB1MTYgdmFsKQoreworCWludCBpbyA9IGNhcmQtPmlvYmFzZTsKKwlpbnQgaTsKKwkvKgorCSAqCVdhaXQgZm9yIHRoZSBjb2RlYyBidXMgdG8gYmUgZnJlZSAKKwkgKi8KKworCWNoZWNrX3N1c3BlbmQoY2FyZCk7CisJIAorCWZvcihpPTA7aTwxMDAwMDtpKyspCisJeworCQlpZighKGluYihpbytFU1NfQUM5N19JTkRFWCkmMSkpIAorCQkJYnJlYWs7CisJfQorCS8qCisJICoJV3JpdGUgdGhlIGJ1cworCSAqLyAKKwlvdXR3KHZhbCwgaW8rRVNTX0FDOTdfREFUQSk7CisJbWRlbGF5KDEpOworCW91dGIoY21kLCBpbytFU1NfQUM5N19JTkRFWCk7CisJbWRlbGF5KDEpOworfQorCitzdGF0aWMgdTE2IG1hZXN0cm9fYWM5N19nZXQoc3RydWN0IGVzc19jYXJkICpjYXJkLCB1OCBjbWQpCit7CisJaW50IGlvID0gY2FyZC0+aW9iYXNlOworCWludCBzYW5pdHk9MTAwMDA7CisJdTE2IGRhdGE7CisJaW50IGk7CisJCisJY2hlY2tfc3VzcGVuZChjYXJkKTsKKwkvKgorCSAqCVdhaXQgZm9yIHRoZSBjb2RlYyBidXMgdG8gYmUgZnJlZSAKKwkgKi8KKwkgCisJZm9yKGk9MDtpPDEwMDAwO2krKykKKwl7CisJCWlmKCEoaW5iKGlvK0VTU19BQzk3X0lOREVYKSYxKSkKKwkJCWJyZWFrOworCX0KKworCW91dGIoY21kfDB4ODAsIGlvK0VTU19BQzk3X0lOREVYKTsKKwltZGVsYXkoMSk7CisJCisJd2hpbGUoaW5iKGlvK0VTU19BQzk3X0lOREVYKSYxKQorCXsKKwkJc2FuaXR5LS07CisJCWlmKCFzYW5pdHkpCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAibWFlc3RybzogYWM5NyBjb2RlYyB0aW1lb3V0IHJlYWRpbmcgMHgleC5cbiIsY21kKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWRhdGE9aW53KGlvK0VTU19BQzk3X0RBVEEpOworCW1kZWxheSgxKTsKKwlyZXR1cm4gZGF0YTsKK30KKworLyogT1NTIGludGVyZmFjZSB0byB0aGUgYWM5N3MuLiAqLworCisjZGVmaW5lIEFDOTdfU1RFUkVPX01BU0sgKFNPVU5EX01BU0tfVk9MVU1FfFwKKwlTT1VORF9NQVNLX1BDTXxTT1VORF9NQVNLX0xJTkV8U09VTkRfTUFTS19DRHxcCisJU09VTkRfTUFTS19WSURFT3xTT1VORF9NQVNLX0xJTkUxfFNPVU5EX01BU0tfSUdBSU4pCisKKyNkZWZpbmUgQUM5N19TVVBQT1JURURfTUFTSyAoQUM5N19TVEVSRU9fTUFTSyB8IFwKKwlTT1VORF9NQVNLX0JBU1N8U09VTkRfTUFTS19UUkVCTEV8U09VTkRfTUFTS19NSUN8XAorCVNPVU5EX01BU0tfU1BFQUtFUikKKworI2RlZmluZSBBQzk3X1JFQ09SRF9NQVNLIChTT1VORF9NQVNLX01JQ3xcCisJU09VTkRfTUFTS19DRHwgU09VTkRfTUFTS19WSURFT3wgU09VTkRfTUFTS19MSU5FMXwgU09VTkRfTUFTS19MSU5FfFwKKwlTT1VORF9NQVNLX1BIT05FSU4pCisKKyNkZWZpbmUgc3VwcG9ydGVkX21peGVyKENBUkQsRk9PKSAoIENBUkQtPm1peC5zdXBwb3J0ZWRfbWl4ZXJzICYgKDE8PEZPTykgKQorCisvKiB0aGlzIHRhYmxlIGhhcyBkZWZhdWx0IG1peGVyIHZhbHVlcyBmb3IgYWxsIE9TUyBtaXhlcnMuCisJYmUgc3VyZSB0byBmaWxsIGl0IGluIGlmIHlvdSBhZGQgb3NzIG1peGVycworCXRvIGFueW9uZSdzIHN1cHBvcnRlZCBtaXhlciBkZWZpbmVzICovCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbWl4ZXJfZGVmYXVsdHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9IHsKKwlbU09VTkRfTUlYRVJfVk9MVU1FXSA9ICAgICAgICAgIDB4MzIzMiwKKwlbU09VTkRfTUlYRVJfQkFTU10gPSAgICAgICAgICAgIDB4MzIzMiwKKwlbU09VTkRfTUlYRVJfVFJFQkxFXSA9ICAgICAgICAgIDB4MzIzMiwKKwlbU09VTkRfTUlYRVJfU1BFQUtFUl0gPSAgICAgICAgIDB4MzIzMiwKKwlbU09VTkRfTUlYRVJfTUlDXSA9ICAgICAweDgwMDAsIC8qIGFubm95aW5nICovCisJW1NPVU5EX01JWEVSX0xJTkVdID0gICAgMHgzMjMyLAorCVtTT1VORF9NSVhFUl9DRF0gPSAgICAgIDB4MzIzMiwKKwlbU09VTkRfTUlYRVJfVklERU9dID0gICAweDMyMzIsCisJW1NPVU5EX01JWEVSX0xJTkUxXSA9ICAgMHgzMjMyLAorCVtTT1VORF9NSVhFUl9QQ01dID0gICAgICAgICAgICAgMHgzMjMyLAorCVtTT1VORF9NSVhFUl9JR0FJTl0gPSAgICAgICAgICAgMHgzMjMyCit9OworCQorc3RhdGljIHN0cnVjdCBhYzk3X21peGVyX2h3IHsKKwl1bnNpZ25lZCBjaGFyIG9mZnNldDsKKwlpbnQgc2NhbGU7Cit9IGFjOTdfaHdbU09VTkRfTUlYRVJfTlJERVZJQ0VTXT0geworCVtTT1VORF9NSVhFUl9WT0xVTUVdCT0JezB4MDIsNjN9LAorCVtTT1VORF9NSVhFUl9CQVNTXQk9CXsweDA4LDE1fSwKKwlbU09VTkRfTUlYRVJfVFJFQkxFXQk9CXsweDA4LDE1fSwKKwlbU09VTkRfTUlYRVJfU1BFQUtFUl0JPQl7MHgwYSwxNX0sCisJW1NPVU5EX01JWEVSX01JQ10JPQl7MHgwZSwzMX0sCisJW1NPVU5EX01JWEVSX0xJTkVdCT0JezB4MTAsMzF9LAorCVtTT1VORF9NSVhFUl9DRF0JPQl7MHgxMiwzMX0sCisJW1NPVU5EX01JWEVSX1ZJREVPXQk9CXsweDE0LDMxfSwKKwlbU09VTkRfTUlYRVJfTElORTFdCT0JezB4MTYsMzF9LAorCVtTT1VORF9NSVhFUl9QQ01dCT0JezB4MTgsMzF9LAorCVtTT1VORF9NSVhFUl9JR0FJTl0JPQl7MHgxYywxNX0KK307CisKKyNpZiAwIC8qICpzaHJ1ZyogcmVtb3ZlZCBzaW1wbHkgYmVjYXVzZSB3ZSBuZXZlciB1c2VkIGl0LgorCQlmZWVsIGZyZWUgdG8gaW1wbGVtZW50IGFnYWluIGlmIG5lZWRlZCAqLworCisvKiByZWFkcyB0aGUgZ2l2ZW4gT1NTIG1peGVyIGZyb20gdGhlIGFjOTcKKwl0aGUgY2FsbGVyIG11c3QgaGF2ZSBpbnN1cmVkIHRoYXQgdGhlIGFjOTcga25vd3MKKwlhYm91dCB0aGF0IGdpdmVuIG1peGVyLCBhbmQgc2hvdWxkIGJlIGhvbGRpbmcgYQorCXNwaW5sb2NrIGZvciB0aGUgY2FyZCAqLworc3RhdGljIGludCBhYzk3X3JlYWRfbWl4ZXIoc3RydWN0IGVzc19jYXJkICpjYXJkLCBpbnQgbWl4ZXIpIAoreworCXUxNiB2YWw7CisJaW50IHJldD0wOworCXN0cnVjdCBhYzk3X21peGVyX2h3ICptaCA9ICZhYzk3X2h3W21peGVyXTsKKworCXZhbCA9IG1hZXN0cm9fYWM5N19nZXQoY2FyZCwgbWgtPm9mZnNldCk7CisKKwlpZihBQzk3X1NURVJFT19NQVNLICYgKDE8PG1peGVyKSkgeworCQkvKiBuaWNlIHN0ZXJlbyBtaXhlcnMgLi4gKi8KKwkJaW50IGxlZnQscmlnaHQ7CisKKwkJbGVmdCA9ICh2YWwgPj4gOCkgICYgMHg3ZjsKKwkJcmlnaHQgPSB2YWwgICYgMHg3ZjsKKworCQlpZiAobWl4ZXIgPT0gU09VTkRfTUlYRVJfSUdBSU4pIHsKKwkJCXJpZ2h0ID0gKHJpZ2h0ICogMTAwKSAvIG1oLT5zY2FsZTsKKwkJCWxlZnQgPSAobGVmdCAqIDEwMCkgLyBtaC0+c2NhbGU7CisJCX0gZWxzZSB7CisJCQlyaWdodCA9IDEwMCAtICgocmlnaHQgKiAxMDApIC8gbWgtPnNjYWxlKTsKKwkJCWxlZnQgPSAxMDAgLSAoKGxlZnQgKiAxMDApIC8gbWgtPnNjYWxlKTsKKwkJfQorCisJCXJldCA9IGxlZnQgfCAocmlnaHQgPDwgOCk7CisJfSBlbHNlIGlmIChtaXhlciA9PSBTT1VORF9NSVhFUl9TUEVBS0VSKSB7CisJCXJldCA9IDEwMCAtICgoKCh2YWwgJiAweDFlKT4+MSkgKiAxMDApIC8gbWgtPnNjYWxlKTsKKwl9IGVsc2UgaWYgKG1peGVyID09IFNPVU5EX01JWEVSX01JQykgeworCQlyZXQgPSAxMDAgLSAoKCh2YWwgJiAweDFmKSAqIDEwMCkgLyBtaC0+c2NhbGUpOworCS8qICB0aGUgbG93IGJpdCBpcyBvcHRpb25hbCBpbiB0aGUgdG9uZSBzbGlkZXJzIGFuZCBtYXNraW5nCisJCWl0IGxldHMgaXMgYXZvaWQgdGhlIDB4ZiAnYnlwYXNzJy4uICovCisJfSBlbHNlIGlmIChtaXhlciA9PSBTT1VORF9NSVhFUl9CQVNTKSB7CisJCXJldCA9IDEwMCAtICgoKCh2YWwgPj4gOCkgJiAweGUpICogMTAwKSAvIG1oLT5zY2FsZSk7CisJfSBlbHNlIGlmIChtaXhlciA9PSBTT1VORF9NSVhFUl9UUkVCTEUpIHsKKwkJcmV0ID0gMTAwIC0gKCgodmFsICYgMHhlKSAqIDEwMCkgLyBtaC0+c2NhbGUpOworCX0KKworCU1fcHJpbnRrKCJyZWFkIG1peGVyICVkICgweCV4KSAleCAtPiAleFxuIixtaXhlcixtaC0+b2Zmc2V0LHZhbCxyZXQpOworCisJcmV0dXJuIHJldDsKK30KKyNlbmRpZgorCisvKiB3cml0ZSB0aGUgT1NTIGVuY29kZWQgdm9sdW1lIHRvIHRoZSBnaXZlbiBPU1MgZW5jb2RlZCBtaXhlciwKKwlhZ2FpbiBjYWxsZXIncyBqb2IgdG8gbWFrZSBzdXJlIGFsbCBpcyB3ZWxsIGluIGFyZyBsYW5kLAorCWNhbGwgd2l0aCBzcGlubG9jayBoZWxkICovCisJCisvKiBsaW5lYXIgc2NhbGUgLT4gbG9nICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBsaW4ybG9nWzEwMV0gPSAKK3sKKzAsIDAgLCAxNSAsIDIzICwgMzAgLCAzNCAsIDM4ICwgNDIgLCA0NSAsIDQ3ICwKKzUwICwgNTIgLCA1MyAsIDU1ICwgNTcgLCA1OCAsIDYwICwgNjEgLCA2MiAsCis2MyAsIDY1ICwgNjYgLCA2NyAsIDY4ICwgNjkgLCA2OSAsIDcwICwgNzEgLAorNzIgLCA3MyAsIDczICwgNzQgLCA3NSAsIDc1ICwgNzYgLCA3NyAsIDc3ICwKKzc4ICwgNzggLCA3OSAsIDgwICwgODAgLCA4MSAsIDgxICwgODIgLCA4MiAsCis4MyAsIDgzICwgODQgLCA4NCAsIDg0ICwgODUgLCA4NSAsIDg2ICwgODYgLAorODcgLCA4NyAsIDg3ICwgODggLCA4OCAsIDg4ICwgODkgLCA4OSAsIDg5ICwKKzkwICwgOTAgLCA5MCAsIDkxICwgOTEgLCA5MSAsIDkyICwgOTIgLCA5MiAsCis5MyAsIDkzICwgOTMgLCA5NCAsIDk0ICwgOTQgLCA5NCAsIDk1ICwgOTUgLAorOTUgLCA5NSAsIDk2ICwgOTYgLCA5NiAsIDk2ICwgOTcgLCA5NyAsIDk3ICwKKzk3ICwgOTggLCA5OCAsIDk4ICwgOTggLCA5OSAsIDk5ICwgOTkgLCA5OSAsIDk5IAorfTsKKworc3RhdGljIHZvaWQgYWM5N193cml0ZV9taXhlcihzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsaW50IG1peGVyLCB1bnNpZ25lZCBpbnQgbGVmdCwgdW5zaWduZWQgaW50IHJpZ2h0KQoreworCXUxNiB2YWw9MDsKKwlzdHJ1Y3QgYWM5N19taXhlcl9odyAqbWggPSAmYWM5N19od1ttaXhlcl07CisKKwlNX3ByaW50aygid3JvdGUgbWl4ZXIgJWQgKDB4JXgpICVkLCVkIixtaXhlcixtaC0+b2Zmc2V0LGxlZnQscmlnaHQpOworCisJaWYoQUM5N19TVEVSRU9fTUFTSyAmICgxPDxtaXhlcikpIHsKKwkJLyogc3RlcmVvIG1peGVycywgbXV0ZSB0aGVtIGlmIHdlIGNhbiAqLworCisJCWlmIChtaXhlciA9PSBTT1VORF9NSVhFUl9JR0FJTikgeworCQkJLyogaWdhaW4ncyBzbGlkZXIgaXMgcmV2ZXJzZWQuLiAqLworCQkJcmlnaHQgPSAocmlnaHQgKiBtaC0+c2NhbGUpIC8gMTAwOworCQkJbGVmdCA9IChsZWZ0ICogbWgtPnNjYWxlKSAvIDEwMDsKKwkJCWlmICgobGVmdCA9PSAwKSAmJiAocmlnaHQgPT0gMCkpCisJCQkJdmFsIHw9IDB4ODAwMDsKKwkJfSBlbHNlIGlmIChtaXhlciA9PSBTT1VORF9NSVhFUl9QQ00gfHwgbWl4ZXIgPT0gU09VTkRfTUlYRVJfQ0QpIHsKKwkJCS8qIGxvZyBjb252ZXJzaW9uIHNlZW1zIGJhZCBmb3IgdGhlbSAqLworCQkJaWYgKChsZWZ0ID09IDApICYmIChyaWdodCA9PSAwKSkKKwkJCQl2YWwgPSAweDgwMDA7CisJCQlyaWdodCA9ICgoMTAwIC0gcmlnaHQpICogbWgtPnNjYWxlKSAvIDEwMDsKKwkJCWxlZnQgPSAoKDEwMCAtIGxlZnQpICogbWgtPnNjYWxlKSAvIDEwMDsKKwkJfSBlbHNlIHsKKwkJCS8qIGxvZyBjb252ZXJzaW9uIGZvciB0aGUgc3RlcmVvIGNvbnRyb2xzICovCisJCQlpZigobGVmdCA9PSAwKSAmJiAocmlnaHQgPT0gMCkpCisJCQkJdmFsID0gMHg4MDAwOworCQkJcmlnaHQgPSAoKDEwMCAtIGxpbjJsb2dbcmlnaHRdKSAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCQlsZWZ0ID0gKCgxMDAgLSBsaW4ybG9nW2xlZnRdKSAqIG1oLT5zY2FsZSkgLyAxMDA7CisJCX0KKworCQl2YWwgfD0gKGxlZnQgPDwgOCkgfCByaWdodDsKKworCX0gZWxzZSBpZiAobWl4ZXIgPT0gU09VTkRfTUlYRVJfU1BFQUtFUikgeworCQl2YWwgPSAoKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDApIDw8IDE7CisJfSBlbHNlIGlmIChtaXhlciA9PSBTT1VORF9NSVhFUl9NSUMpIHsKKwkJdmFsID0gbWFlc3Ryb19hYzk3X2dldChjYXJkLCBtaC0+b2Zmc2V0KSAmIH4weDgwMWY7CisJCXZhbCB8PSAoKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDApOworCS8qICB0aGUgbG93IGJpdCBpcyBvcHRpb25hbCBpbiB0aGUgdG9uZSBzbGlkZXJzIGFuZCBtYXNraW5nCisJCWl0IGxldHMgaXMgYXZvaWQgdGhlIDB4ZiAnYnlwYXNzJy4uICovCisJfSBlbHNlIGlmIChtaXhlciA9PSBTT1VORF9NSVhFUl9CQVNTKSB7CisJCXZhbCA9IG1hZXN0cm9fYWM5N19nZXQoY2FyZCAsIG1oLT5vZmZzZXQpICYgfjB4MGYwMDsKKwkJdmFsIHw9ICgoKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDApIDw8IDgpICYgMHgwZTAwOworCX0gZWxzZSBpZiAobWl4ZXIgPT0gU09VTkRfTUlYRVJfVFJFQkxFKSAgeworCQl2YWwgPSBtYWVzdHJvX2FjOTdfZ2V0KGNhcmQgLCBtaC0+b2Zmc2V0KSAmIH4weDAwMGY7CisJCXZhbCB8PSAoKCgxMDAgLSBsZWZ0KSAqIG1oLT5zY2FsZSkgLyAxMDApICYgMHgwMDBlOworCX0KKworCW1hZXN0cm9fYWM5N19zZXQoY2FyZCAsIG1oLT5vZmZzZXQsIHZhbCk7CisJCisJTV9wcmludGsoIiAtPiAleFxuIix2YWwpOworfQorCisvKiB0aGUgZm9sbG93aW5nIHRhYmxlcyBhbGxvdyB1cyB0byBnbyBmcm9tIAorCU9TUyA8LT4gYWM5NyBxdWlja2x5LiAqLworCitlbnVtIGFjOTdfcmVjc2V0dGluZ3MgeworCUFDOTdfUkVDX01JQz0wLAorCUFDOTdfUkVDX0NELAorCUFDOTdfUkVDX1ZJREVPLAorCUFDOTdfUkVDX0FVWCwKKwlBQzk3X1JFQ19MSU5FLAorCUFDOTdfUkVDX1NURVJFTywgLyogY29tYmluYXRpb24gb2YgYWxsIGVuYWJsZWQgb3V0cHV0cy4uICAqLworCUFDOTdfUkVDX01PTk8sICAgICAgICAvKi4uIG9yIHRoZSBtb25vIGVxdWl2YWxlbnQgKi8KKwlBQzk3X1JFQ19QSE9ORSAgICAgICAgCit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGFjOTdfb3NzX21hc2tbXSA9IHsKKwlbQUM5N19SRUNfTUlDXSA9IFNPVU5EX01BU0tfTUlDLCAKKwlbQUM5N19SRUNfQ0RdID0gU09VTkRfTUFTS19DRCwgCisJW0FDOTdfUkVDX1ZJREVPXSA9IFNPVU5EX01BU0tfVklERU8sIAorCVtBQzk3X1JFQ19BVVhdID0gU09VTkRfTUFTS19MSU5FMSwgCisJW0FDOTdfUkVDX0xJTkVdID0gU09VTkRfTUFTS19MSU5FLCAKKwlbQUM5N19SRUNfUEhPTkVdID0gU09VTkRfTUFTS19QSE9ORUlOCit9OworCisvKiBpbmRleGVkIGJ5IGJpdCBwb3NpdGlvbiAqLworc3RhdGljIHVuc2lnbmVkIGludCBhYzk3X29zc19ybVtdID0geworCVtTT1VORF9NSVhFUl9NSUNdID0gQUM5N19SRUNfTUlDLAorCVtTT1VORF9NSVhFUl9DRF0gPSBBQzk3X1JFQ19DRCwKKwlbU09VTkRfTUlYRVJfVklERU9dID0gQUM5N19SRUNfVklERU8sCisJW1NPVU5EX01JWEVSX0xJTkUxXSA9IEFDOTdfUkVDX0FVWCwKKwlbU09VTkRfTUlYRVJfTElORV0gPSBBQzk3X1JFQ19MSU5FLAorCVtTT1VORF9NSVhFUl9QSE9ORUlOXSA9IEFDOTdfUkVDX1BIT05FCit9OworCQorLyogcmVhZCBvciB3cml0ZSB0aGUgcmVjbWFzayAKKwl0aGUgYWM5NyBjYW4gcmVhbGx5IGhhdmUgbGVmdCBhbmQgcmlnaHQgcmVjb3JkaW5nCisJaW5wdXRzIGluZGVwZW5kZW50bHkgc2V0LCBidXQgT1NTIGRvZXNuJ3Qgc2VlbSB0byAKKwl3YW50IHVzIHRvIGV4cHJlc3MgdGhhdCB0byB0aGUgdXNlci4gCisJdGhlIGNhbGxlciBndWFyYW50ZWVzIHRoYXQgd2UgaGF2ZSBhIHN1cHBvcnRlZCBiaXQgc2V0LAorCWFuZCB0aGV5IG11c3QgYmUgaG9sZGluZyB0aGUgY2FyZCdzIHNwaW5sb2NrICovCitzdGF0aWMgaW50IAorYWM5N19yZWNtYXNrX2lvKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgaW50IHJlYWQsIGludCBtYXNrKSAKK3sKKwl1bnNpZ25lZCBpbnQgdmFsID0gYWM5N19vc3NfbWFza1sgbWFlc3Ryb19hYzk3X2dldChjYXJkLCAweDFhKSAmIDB4NyBdOworCisJaWYgKHJlYWQpIHJldHVybiB2YWw7CisKKwkvKiBvc3MgY2FuIGhhdmUgbWFueSBpbnB1dHMsIG1hZXN0cm8gY2FuJ3QuICB0cnkKKwkJdG8gcGljayB0aGUgJ25ldycgb25lICovCisKKwlpZiAobWFzayAhPSB2YWwpIG1hc2sgJj0gfnZhbDsKKworCXZhbCA9IGZmcyhtYXNrKSAtIDE7IAorCXZhbCA9IGFjOTdfb3NzX3JtW3ZhbF07CisJdmFsIHw9IHZhbCA8PCA4OyAgLyogc2V0IGJvdGggY2hhbm5lbHMgKi8KKworCU1fcHJpbnRrKCJtYWVzdHJvOiBzZXR0aW5nIGFjOTcgcmVjbWFzayB0byAweCV4XG4iLHZhbCk7CisKKwltYWVzdHJvX2FjOTdfc2V0KGNhcmQsMHgxYSx2YWwpOworCisJcmV0dXJuIDA7Cit9OworCisvKgorICoJVGhlIE1hZXN0cm8gY2FuIGJlIHdpcmVkIHRvIGEgc3RhbmRhcmQgQUM5NyBjb21wbGlhbnQgY29kZWMKKyAqCShzZWUgd3d3LmludGVsLmNvbSBmb3IgdGhlIHBkZidzIG9uIHRoaXMpLCBvciB0byBhIFBUMTAxIGNvZGVjCisgKgl3aGljaCBhcHBlYXJzIHRvIGJlIHRoZSBFUzE5MTggKGRhdGEgc2hlZXQgb24gdGhlIGVzc3RlY2guY29tLnR3IHNpdGUpCisgKgorICoJVGhlIFBUMTAxIHNldHVwIGlzIHVudGVzdGVkLgorICovCisgCitzdGF0aWMgdTE2IF9faW5pdCBtYWVzdHJvX2FjOTdfaW5pdChzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQpCit7CisJdTE2IHZlbmQxLCB2ZW5kMiwgY2FwczsKKworCWNhcmQtPm1peC5zdXBwb3J0ZWRfbWl4ZXJzID0gQUM5N19TVVBQT1JURURfTUFTSzsKKwljYXJkLT5taXguc3RlcmVvX21peGVycyA9IEFDOTdfU1RFUkVPX01BU0s7CisJY2FyZC0+bWl4LnJlY29yZF9zb3VyY2VzID0gQUM5N19SRUNPUkRfTUFTSzsKKy8qCWNhcmQtPm1peC5yZWFkX21peGVyID0gYWM5N19yZWFkX21peGVyOyovCisJY2FyZC0+bWl4LndyaXRlX21peGVyID0gYWM5N193cml0ZV9taXhlcjsKKwljYXJkLT5taXgucmVjbWFza19pbyA9IGFjOTdfcmVjbWFza19pbzsKKworCXZlbmQxID0gbWFlc3Ryb19hYzk3X2dldChjYXJkLCAweDdjKTsKKwl2ZW5kMiA9IG1hZXN0cm9fYWM5N19nZXQoY2FyZCwgMHg3ZSk7CisKKwljYXBzID0gbWFlc3Ryb19hYzk3X2dldChjYXJkLCAweDAwKTsKKworCXByaW50ayhLRVJOX0lORk8gIm1hZXN0cm86IEFDOTcgQ29kZWMgZGV0ZWN0ZWQ6IHY6IDB4JTJ4JTJ4IGNhcHM6IDB4JXggcHdyOiAweCV4XG4iLAorCQl2ZW5kMSx2ZW5kMixjYXBzLG1hZXN0cm9fYWM5N19nZXQoY2FyZCwweDI2KSAmIDB4Zik7CisKKwlpZiAoISAoY2FwcyAmIDB4NCkgKSB7CisJCS8qIG5vIGJhc3MvdHJlYmxlIG5vYnMgKi8KKwkJY2FyZC0+bWl4LnN1cHBvcnRlZF9taXhlcnMgJj0gfihTT1VORF9NQVNLX0JBU1N8U09VTkRfTUFTS19UUkVCTEUpOworCX0KKworCS8qIFhYWCBlbmRpYW5uZXNzLCBkb3JrIGhlYWQuICovCisJLyogdmVuZG9yIHNwZWNpZmMgYml0cy4uICovCisJc3dpdGNoICgobG9uZykodmVuZDEgPDwgMTYpIHwgdmVuZDIpIHsKKwljYXNlIDB4NTQ1MjAwZmY6CS8qIFRyaVRlY2ggKi8KKwkJLyogbm8gaWRlYSB3aGF0IHRoaXMgZG9lcyAqLworCQltYWVzdHJvX2FjOTdfc2V0KGNhcmQsMHgyYSwweDAwMDEpOworCQltYWVzdHJvX2FjOTdfc2V0KGNhcmQsMHgyYywweDAwMDApOworCQltYWVzdHJvX2FjOTdfc2V0KGNhcmQsMHgyYywweGZmZmYpOworCQlicmVhazsKKyNpZiAwCS8qIGkgdGhvdWdodCB0aGUgcHJvYmxlbXMgSSB3YXMgc2VlaW5nIHdlcmUgd2l0aAorCXRoZSAxOTIxLCBidXQgYXBwYXJlbnRseSB0aGV5IHdlcmUgd2l0aCB0aGUgcGNpIGJvYXJkCisJaXQgd2FzIG9uLCBzbyB0aGlzIGNvZGUgaXMgY29tbWVudGVkIG91dC4KKwkgbGV0cyBzZWUgaWYgdGhpcyBob2xkcyB0cnVlLiAqLworCWNhc2UgMHg4Mzg0NzYwOToJLyogRVNTIDE5MjEgKi8KKwkJLyogd3JpdGluZyB0byAweGUgKG1pYykgb3IgMHgxYSAocmVjbWFzaykgc2VlbXMKKwkJCXRvIGhhbmcgdGhpcyBjb2RlYyAqLworCQljYXJkLT5taXguc3VwcG9ydGVkX21peGVycyAmPSB+KFNPVU5EX01BU0tfTUlDKTsKKwkJY2FyZC0+bWl4LnJlY29yZF9zb3VyY2VzID0gMDsKKwkJY2FyZC0+bWl4LnJlY21hc2tfaW8gPSBOVUxMOworI2lmIDAJLyogZG9uJ3QgYXNrLiAgSSBoYXZlIHlldCB0byBzZWUgd2hhdCB0aGVzZSBhY3R1YWxseSBkby4gKi8KKwkJbWFlc3Ryb19hYzk3X3NldChjYXJkLDB4NzYsMHhBQkJBKTsgLyogby9+IFRha2UgYSBjaGFuY2Ugb24gbWUgby9+ICovCisJCXVkZWxheSgyMCk7CisJCW1hZXN0cm9fYWM5N19zZXQoY2FyZCwweDc4LDB4MzAwMik7CisJCXVkZWxheSgyMCk7CisJCW1hZXN0cm9fYWM5N19zZXQoY2FyZCwweDc4LDB4MzgwMik7CisJCXVkZWxheSgyMCk7CisjZW5kaWYKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OiBicmVhazsKKwl9CisKKwltYWVzdHJvX2FjOTdfc2V0KGNhcmQsIDB4MUUsIDB4MDQwNCk7CisJLyogbnVsbCBtaXNjIHN0dWZmICovCisJbWFlc3Ryb19hYzk3X3NldChjYXJkLCAweDIwLCAweDAwMDApOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiAwICAvKiB0aGVyZSBoYXMgYmVlbiAxIHBlcnNvbiBvbiB0aGUgcGxhbmV0IHdpdGggYSBwdDEwMSB0aGF0IHdlCisJa25vdyBvZi4gIElmIHRoZXkgY2FyZSwgdGhleSBjYW4gcHV0IHRoaXMgYmFjayBpbiA6KSAqLworc3RhdGljIHUxNiBtYWVzdHJvX3B0MTAxX2luaXQoc3RydWN0IGVzc19jYXJkICpjYXJkLGludCBpb2Jhc2UpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAibWFlc3RybzogUFQxMDEgQ29kZWMgZGV0ZWN0ZWQsIGluaXRpYWxpemluZyBidXQgX25vdF8gaW5zdGFsbGluZyBtaXhlciBkZXZpY2UuXG4iKTsKKwkvKiB3aG8ga25vd3MuLiAqLworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDJBLCAweDAwMDEpOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDJDLCAweDAwMDApOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDJDLCAweEZGRkYpOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDEwLCAweDlGMUYpOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDEyLCAweDA4MDgpOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDE0LCAweDlGMUYpOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDE2LCAweDlGMUYpOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDE4LCAweDA0MDQpOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDFBLCAweDAwMDApOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDFDLCAweDAwMDApOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDAyLCAweDA0MDQpOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDA0LCAweDA4MDgpOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDBDLCAweDgwMUYpOworCW1hZXN0cm9fYWM5N19zZXQoaW9iYXNlLCAweDBFLCAweDgwMUYpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKy8qIHRoaXMgaXMgdmVyeSBtYWdpYywgYW5kIHZlcnkgc2xvdy4uICovCitzdGF0aWMgdm9pZCAKK21hZXN0cm9fYWM5N19yZXNldChpbnQgaW9hZGRyLCBzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCXUxNiBzYXZlXzY4OworCXUxNiB3OworCXUzMiB2ZW5kOworCisJb3V0dyggaW53KGlvYWRkciArIDB4MzgpICYgMHhmZmZjLCBpb2FkZHIgKyAweDM4KTsKKwlvdXR3KCBpbncoaW9hZGRyICsgMHgzYSkgJiAweGZmZmMsIGlvYWRkciArIDB4M2EpOworCW91dHcoIGludyhpb2FkZHIgKyAweDNjKSAmIDB4ZmZmYywgaW9hZGRyICsgMHgzYyk7CisKKwkvKiByZXNldCB0aGUgZmlyc3QgY29kZWMgKi8KKwlvdXR3KDB4MDAwMCwgIGlvYWRkcisweDM2KTsKKwlzYXZlXzY4ID0gaW53KGlvYWRkcisweDY4KTsKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2lkZXYsIDB4NTgsICZ3KTsJLyogc29tZXRoaW5nIG1hZ2ljYWwgd2l0aCBncGlvIGFuZCBidXMgYXJiLiAqLworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmdmVuZCk7CisJaWYoIHcgJiAweDEpCisJCXNhdmVfNjggfD0gMHgxMDsKKwlvdXR3KDB4ZmZmZSwgaW9hZGRyICsgMHg2NCk7CS8qIHRpY2tseSBncGlvIDAuLiAqLworCW91dHcoMHgwMDAxLCBpb2FkZHIgKyAweDY4KTsKKwlvdXR3KDB4MDAwMCwgaW9hZGRyICsgMHg2MCk7CisJdWRlbGF5KDIwKTsKKwlvdXR3KDB4MDAwMSwgaW9hZGRyICsgMHg2MCk7CisJbWRlbGF5KDIwKTsKKworCW91dHcoc2F2ZV82OCB8IDB4MSwgaW9hZGRyICsgMHg2OCk7CS8qIG5vdyByZXN0b3JlIC4uICovCisJb3V0dyggKGludyhpb2FkZHIgKyAweDM4KSAmIDB4ZmZmYyl8MHgxLCBpb2FkZHIgKyAweDM4KTsKKwlvdXR3KCAoaW53KGlvYWRkciArIDB4M2EpICYgMHhmZmZjKXwweDEsIGlvYWRkciArIDB4M2EpOworCW91dHcoIChpbncoaW9hZGRyICsgMHgzYykgJiAweGZmZmMpfDB4MSwgaW9hZGRyICsgMHgzYyk7CisKKwkvKiBub3cgdGhlIHNlY29uZCBjb2RlYyAqLworCW91dHcoMHgwMDAwLCAgaW9hZGRyKzB4MzYpOworCW91dHcoMHhmZmY3LCBpb2FkZHIgKyAweDY0KTsKKwlzYXZlXzY4ID0gaW53KGlvYWRkcisweDY4KTsKKwlvdXR3KDB4MDAwOSwgaW9hZGRyICsgMHg2OCk7CisJb3V0dygweDAwMDEsIGlvYWRkciArIDB4NjApOworCXVkZWxheSgyMCk7CisJb3V0dygweDAwMDksIGlvYWRkciArIDB4NjApOworCW1kZWxheSg1MDApOwkvKiAuLiBvdWNoLi4gKi8KKwlvdXR3KCBpbncoaW9hZGRyICsgMHgzOCkgJiAweGZmZmMsIGlvYWRkciArIDB4MzgpOworCW91dHcoIGludyhpb2FkZHIgKyAweDNhKSAmIDB4ZmZmYywgaW9hZGRyICsgMHgzYSk7CisJb3V0dyggaW53KGlvYWRkciArIDB4M2MpICYgMHhmZmZjLCBpb2FkZHIgKyAweDNjKTsKKworI2lmIDAgLyogdGhlIGxvb3AgaGVyZSBuZWVkcyB0byBiZSBtdWNoIGJldHRlciBpZiB3ZSB3YW50IGl0Li4gKi8KKwlNX3ByaW50aygidHJ5aW5nIHNvZnR3YXJlIHJlc2V0XG4iKTsKKwkvKiB0cnkgYW5kIGRvIGEgc29mdHdhcmUgcmVzZXQgKi8KKwlvdXRiKDB4ODB8MHg3YywgaW9hZGRyICsgMHgzMCk7CisJZm9yICh3PTA7IDsgdysrKSB7CisJCWlmICgoaW53KGlvYWRkcisgMHgzMCkgJiAxKSA9PSAwKSB7CisJCQlpZihpbmIoaW9hZGRyICsgMHgzMikgIT0wKSBicmVhazsKKworCQkJb3V0YigweDgwfDB4N2QsIGlvYWRkciArIDB4MzApOworCQkJaWYgKCgoaW53KGlvYWRkcisgMHgzMCkgJiAxKSA9PSAwKSAmJiAoaW5iKGlvYWRkciArIDB4MzIpICE9MCkpIGJyZWFrOworCQkJb3V0YigweDgwfDB4N2YsIGlvYWRkciArIDB4MzApOworCQkJaWYgKCgoaW53KGlvYWRkcisgMHgzMCkgJiAxKSA9PSAwKSAmJiAoaW5iKGlvYWRkciArIDB4MzIpICE9MCkpIGJyZWFrOworCQl9CisKKwkJaWYoIHcgPiAxMDAwMCkgeworCQkJb3V0YiggaW5iKGlvYWRkciArIDB4MzcpIHwgMHgwOCwgaW9hZGRyICsgMHgzNyk7ICAvKiBkbyBhIHNvZnR3YXJlIHJlc2V0ICovCisJCQltZGVsYXkoNTAwKTsgLyogb2ggbXkuLiAqLworCQkJb3V0YiggaW5iKGlvYWRkciArIDB4MzcpICYgfjB4MDgsIGlvYWRkciArIDB4MzcpOyAgCisJCQl1ZGVsYXkoMSk7CisJCQlvdXR3KCAweDgwLCBpb2FkZHIrMHgzMCk7CisJCQlmb3IodyA9IDAgOyB3IDwgMTAwMDA7IHcrKykgeworCQkJCWlmKChpbncoaW9hZGRyICsgMHgzMCkgJiAxKSA9PTApIGJyZWFrOworCQkJfQorCQl9CisJfQorI2VuZGlmCisJaWYgKCB2ZW5kID09IE5FQ19WRVJTQV9TVUJJRDEgfHwgdmVuZCA9PSBORUNfVkVSU0FfU1VCSUQyKSB7CisJCS8qIHR1cm4gb24gZXh0ZXJuYWwgYW1wPyAqLworCQlvdXR3KDB4ZjlmZiwgaW9hZGRyICsgMHg2NCk7CisJCW91dHcoaW53KGlvYWRkcisweDY4KSB8IDB4NjAwLCBpb2FkZHIgKyAweDY4KTsKKwkJb3V0dygweDAyMDksIGlvYWRkciArIDB4NjApOworCX0KKworCS8qIFR1cm4gb24gdGhlIDk3OCBkb2NraW5nIGNoaXAuCisJICAgRmlyc3QgZnJvYiB0aGUgIm1hc3RlciBvdXRwdXQgZW5hYmxlIiBiaXQsCisJICAgdGhlbiBzZXQgbW9zdCBvZiB0aGUgcGxheWJhY2sgdm9sdW1lIGNvbnRyb2wgcmVnaXN0ZXJzIHRvIG1heC4gKi8KKwlvdXRiKGluYihpb2FkZHIrMHhjMCl8KDE8PDUpLCBpb2FkZHIrMHhjMCk7CisJb3V0YigweGZmLCBpb2FkZHIrMHhjMyk7CisJb3V0YigweGZmLCBpb2FkZHIrMHhjNCk7CisJb3V0YigweGZmLCBpb2FkZHIrMHhjNik7CisJb3V0YigweGZmLCBpb2FkZHIrMHhjOCk7CisJb3V0YigweDNmLCBpb2FkZHIrMHhjZik7CisJb3V0YigweDNmLCBpb2FkZHIrMHhkMCk7Cit9CisvKgorICoJSW5kaXJlY3QgcmVnaXN0ZXIgYWNjZXNzLiBOb3QgYWxsIHJlZ2lzdGVycyBhcmUgcmVhZGFibGUgc28gd2UKKyAqCW5lZWQgdG8ga2VlcCByZWdpc3RlciBzdGF0ZSBvdXJzZWx2ZXMKKyAqLworIAorI2RlZmluZSBXUklURUFCTEVfTUFQCTB4RUZGRkZGCisjZGVmaW5lIFJFQURBQkxFX01BUAkweDY0MDAzRgorCisvKgorICoJVGhlIE1hZXN0cm8gZW5naW5lZXJzIHdlcmUgYSBsaXR0bGUgaW5kaXJlY3Rpb24gaGFwcHkuIFRoZXNlIGluZGlyZWN0ZWQKKyAqCXJlZ2lzdGVycyB0aGVtc2VsdmVzIGluY2x1ZGUgaW5kaXJlY3QgcmVnaXN0ZXJzIGF0IGFub3RoZXIgbGF5ZXIKKyAqLworCitzdGF0aWMgdm9pZCBfX21hZXN0cm9fd3JpdGUoc3RydWN0IGVzc19jYXJkICpjYXJkLCB1MTYgcmVnLCB1MTYgZGF0YSkKK3sKKwlsb25nIGlvYWRkciA9IGNhcmQtPmlvYmFzZTsKKworCW91dHcocmVnLCBpb2FkZHIrMHgwMik7CisJb3V0dyhkYXRhLCBpb2FkZHIrMHgwMCk7CisJaWYoIHJlZyA+PSBOUl9JRFJTKSBwcmludGsoIm1hZXN0cm86IElEUiAlZCBvdXQgb2YgYm91bmRzIVxuIixyZWcpOworCWVsc2UgY2FyZC0+bWFlc3Ryb19tYXBbcmVnXT1kYXRhOworCit9CisgCitzdGF0aWMgdm9pZCBtYWVzdHJvX3dyaXRlKHN0cnVjdCBlc3Nfc3RhdGUgKnMsIHUxNiByZWcsIHUxNiBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljaGVja19zdXNwZW5kKHMtPmNhcmQpOworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKKworCV9fbWFlc3Ryb193cml0ZShzLT5jYXJkLHJlZyxkYXRhKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdTE2IF9fbWFlc3Ryb19yZWFkKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgdTE2IHJlZykKK3sKKwlsb25nIGlvYWRkciA9IGNhcmQtPmlvYmFzZTsKKworCW91dHcocmVnLCBpb2FkZHIrMHgwMik7CisJcmV0dXJuIGNhcmQtPm1hZXN0cm9fbWFwW3JlZ109aW53KGlvYWRkcisweDAwKTsKK30KKworc3RhdGljIHUxNiBtYWVzdHJvX3JlYWQoc3RydWN0IGVzc19zdGF0ZSAqcywgdTE2IHJlZykKK3sKKwlpZihSRUFEQUJMRV9NQVAgJiAoMTw8cmVnKSkKKwl7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCWNoZWNrX3N1c3BlbmQocy0+Y2FyZCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKKworCQlfX21hZXN0cm9fcmVhZChzLT5jYXJkLHJlZyk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jayxmbGFncyk7CisJfQorCXJldHVybiBzLT5jYXJkLT5tYWVzdHJvX21hcFtyZWddOworfQorCisvKgorICoJVGhlc2Ugcm91dGluZXMgaGFuZGxlIGFjY2Vzc2luZyB0aGUgc2Vjb25kIGxldmVsIGluZGlyZWN0aW9ucyB0byB0aGUKKyAqCXdhdmUgcmFtLgorICovCisKKy8qCisgKglUaGUgcmVnaXN0ZXIgbmFtZXMgYXJlIHRoZSBvbmVzIEVTUyB1c2VzIChzZWUgMTA0VDMxLlpJUCkKKyAqLworIAorI2RlZmluZSBJRFIwX0RBVEFfUE9SVAkJMHgwMAorI2RlZmluZSBJRFIxX0NSQU1fUE9JTlRFUgkweDAxCisjZGVmaW5lIElEUjJfQ1JBTV9EQVRBCQkweDAyCisjZGVmaW5lIElEUjNfV0FWRV9EQVRBCQkweDAzCisjZGVmaW5lIElEUjRfV0FWRV9QVFJfTE9XCTB4MDQKKyNkZWZpbmUgSURSNV9XQVZFX1BUUl9ISQkweDA1CisjZGVmaW5lIElEUjZfVElNRVJfQ1RSTAkJMHgwNgorI2RlZmluZSBJRFI3X1dBVkVfUk9NUkFNCTB4MDcKKworc3RhdGljIHZvaWQgYXB1X2luZGV4X3NldChzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQsIHUxNiBpbmRleCkKK3sKKwlpbnQgaTsKKwlfX21hZXN0cm9fd3JpdGUoY2FyZCwgSURSMV9DUkFNX1BPSU5URVIsIGluZGV4KTsKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJCWlmKF9fbWFlc3Ryb19yZWFkKGNhcmQsIElEUjFfQ1JBTV9QT0lOVEVSKT09aW5kZXgpCisJCQlyZXR1cm47CisJcHJpbnRrKEtFUk5fV0FSTklORyAibWFlc3RybzogQVBVIHJlZ2lzdGVyIHNlbGVjdCBmYWlsZWQuXG4iKTsKK30KKworc3RhdGljIHZvaWQgYXB1X2RhdGFfc2V0KHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgdTE2IGRhdGEpCit7CisJaW50IGk7CisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJaWYoX19tYWVzdHJvX3JlYWQoY2FyZCwgSURSMF9EQVRBX1BPUlQpPT1kYXRhKQorCQkJcmV0dXJuOworCQlfX21hZXN0cm9fd3JpdGUoY2FyZCwgSURSMF9EQVRBX1BPUlQsIGRhdGEpOworCX0KK30KKworLyoKKyAqCVRoaXMgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZm9yIEFQVSBtYW5pcHVsYXRpb24uIEl0IGhhbmRsZXMgdGhlCisgKglpbnRlcmxvY2sgdG8gYXZvaWQgdHdvIEFQVSB3cml0ZXMgaW4gcGFyYWxsZWwgZXRjLiBEb24ndCBkaWRkbGUKKyAqCWRpcmVjdGx5IHdpdGggdGhlIHN0dWZmIGFib3ZlLgorICovCisKK3N0YXRpYyB2b2lkIGFwdV9zZXRfcmVnaXN0ZXIoc3RydWN0IGVzc19zdGF0ZSAqcywgdTE2IGNoYW5uZWwsIHU4IHJlZywgdTE2IGRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwkKKwljaGVja19zdXNwZW5kKHMtPmNhcmQpOworCisJaWYoY2hhbm5lbCZFU1NfQ0hBTl9IQVJEKQorCQljaGFubmVsJj1+RVNTX0NIQU5fSEFSRDsKKwllbHNlCisJeworCQlpZihjaGFubmVsPjUpCisJCQlwcmludGsoIkJBRCBDSEFOTkVMICVkLlxuIixjaGFubmVsKTsKKwkJZWxzZQorCQkJY2hhbm5lbCA9IHMtPmFwdVtjaGFubmVsXTsKKwkJLyogc3RvcmUgYmFzZWQgb24gcmVhbCBoYXJkd2FyZSBhcHUvcmVnICovCisJCXMtPmNhcmQtPmFwdV9tYXBbY2hhbm5lbF1bcmVnXT1kYXRhOworCX0KKwlyZWd8PShjaGFubmVsPDw0KTsKKwkKKwkvKiBob29yYXkgZm9yIGRvdWJsZSBpbmRpcmVjdGlvbiEhICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssZmxhZ3MpOworCisJYXB1X2luZGV4X3NldChzLT5jYXJkLCByZWcpOworCWFwdV9kYXRhX3NldChzLT5jYXJkLCBkYXRhKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdTE2IGFwdV9nZXRfcmVnaXN0ZXIoc3RydWN0IGVzc19zdGF0ZSAqcywgdTE2IGNoYW5uZWwsIHU4IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUxNiB2OworCQorCWNoZWNrX3N1c3BlbmQocy0+Y2FyZCk7CisKKwlpZihjaGFubmVsJkVTU19DSEFOX0hBUkQpCisJCWNoYW5uZWwmPX5FU1NfQ0hBTl9IQVJEOworCWVsc2UKKwkJY2hhbm5lbCA9IHMtPmFwdVtjaGFubmVsXTsKKworCXJlZ3w9KGNoYW5uZWw8PDQpOworCQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKKworCWFwdV9pbmRleF9zZXQocy0+Y2FyZCwgcmVnKTsKKwl2PV9fbWFlc3Ryb19yZWFkKHMtPmNhcmQsIElEUjBfREFUQV9QT1JUKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssZmxhZ3MpOworCXJldHVybiB2OworfQorCisKKy8qCisgKglUaGUgd2F2ZWNhY2hlIGJ1ZmZlcnMgYmV0d2VlbiB0aGUgQVBVcyBhbmQKKyAqCXBjaSBidXMgbWFzdGVyaW5nCisgKi8KKyAKK3N0YXRpYyB2b2lkIHdhdmVfc2V0X3JlZ2lzdGVyKHN0cnVjdCBlc3Nfc3RhdGUgKnMsIHUxNiByZWcsIHUxNiB2YWx1ZSkKK3sKKwlsb25nIGlvYWRkciA9IHMtPmNhcmQtPmlvYmFzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNoZWNrX3N1c3BlbmQocy0+Y2FyZCk7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssZmxhZ3MpOworCisJb3V0dyhyZWcsIGlvYWRkcisweDEwKTsKKwlvdXR3KHZhbHVlLCBpb2FkZHIrMHgxMik7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHUxNiB3YXZlX2dldF9yZWdpc3RlcihzdHJ1Y3QgZXNzX3N0YXRlICpzLCB1MTYgcmVnKQoreworCWxvbmcgaW9hZGRyID0gcy0+Y2FyZC0+aW9iYXNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTE2IHZhbHVlOworCWNoZWNrX3N1c3BlbmQocy0+Y2FyZCk7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssZmxhZ3MpOworCW91dHcocmVnLCBpb2FkZHIrMHgxMCk7CisJdmFsdWU9aW53KGlvYWRkcisweDEyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLGZsYWdzKTsKKwkKKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIHNvdW5kX3Jlc2V0KGludCBpb2FkZHIpCit7CisJb3V0dygweDIwMDAsIDB4MTgraW9hZGRyKTsKKwl1ZGVsYXkoMSk7CisJb3V0dygweDAwMDAsIDB4MTgraW9hZGRyKTsKKwl1ZGVsYXkoMSk7Cit9CisKKy8qIHNldHMgdGhlIHBsYXkgZm9ybWF0cyBvZiB0aGVzZSBhcHVzLCBzaG91bGQgYmUgcGFzc2VkIHRoZSBhbHJlYWR5IHNoaWZ0ZWQgZm9ybWF0ICovCitzdGF0aWMgdm9pZCBzZXRfYXB1X2ZtdChzdHJ1Y3QgZXNzX3N0YXRlICpzLCBpbnQgYXB1LCBpbnQgbW9kZSkKK3sKKwlpbnQgYXB1X2ZtdCA9IDB4MTA7CisKKwlpZighKG1vZGUmRVNTX0ZNVF8xNkJJVCkpIGFwdV9mbXQrPTB4MjA7IAorCWlmKChtb2RlJkVTU19GTVRfU1RFUkVPKSkgYXB1X2ZtdCs9MHgxMDsgCisJcy0+YXB1X21vZGVbYXB1XSAgID0gYXB1X2ZtdDsKKwlzLT5hcHVfbW9kZVthcHUrMV0gPSBhcHVfZm10OworfQorCisvKiB0aGlzIG9ubHkgZml4ZXMgdGhlIG91dHB1dCBhcHUgbW9kZSB0byBiZSBsYXRlciBzZXQgYnkgc3RhcnRfZGFjIGFuZAorCWNvbXBhbnkuICBvdXRwdXQgYXB1IG1vZGVzIGFyZSBzZXQgaW4gZXNzX3JlY19zZXR1cCAqLworc3RhdGljIHZvaWQgc2V0X2ZtdChzdHJ1Y3QgZXNzX3N0YXRlICpzLCB1bnNpZ25lZCBjaGFyIG1hc2ssIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlzLT5mbXQgPSAocy0+Zm10ICYgbWFzaykgfCBkYXRhOworCXNldF9hcHVfZm10KHMsIDAsIChzLT5mbXQgPj4gRVNTX0RBQ19TSElGVCkgJiBFU1NfRk1UX01BU0spOworfQorCisvKiB0aGlzIGlzIG9mZiBieSBhIGxpdHRsZSBiaXQuLiAqLworc3RhdGljIHUzMiBjb21wdXRlX3JhdGUoc3RydWN0IGVzc19zdGF0ZSAqcywgdTMyIGZyZXEpCit7CisJdTMyIGNsb2NrID0gY2xvY2tfZnJlcVtzLT5jYXJkLT5jYXJkX3R5cGVdOyAgICAgCisKKwlmcmVxID0gKGZyZXEgKiBjbG9ja2luZykvNDgwMDA7CisJCisJaWYgKGZyZXEgPT0gNDgwMDApIAorCQlyZXR1cm4gMHgxMDAwMDsKKworCXJldHVybiAoKGZyZXEgLyBjbG9jaykgPDwxNiApKyAgCisJCSgoKGZyZXEgJSBjbG9jaykgPDwgMTYpIC8gY2xvY2spOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGFjX3JhdGUoc3RydWN0IGVzc19zdGF0ZSAqcywgdW5zaWduZWQgaW50IHJhdGUpCit7CisJdTMyIGZyZXE7CisJaW50IGZtdCA9IChzLT5mbXQgPj4gRVNTX0RBQ19TSElGVCkgJiBFU1NfRk1UX01BU0s7CisKKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA0MDAwKQorCQlyYXRlID0gNDAwMDsKKworCXMtPnJhdGVkYWMgPSByYXRlOworCisJaWYoISAoZm10ICYgRVNTX0ZNVF8xNkJJVCkgJiYgIShmbXQgJiBFU1NfRk1UX1NURVJFTykpCisJCXJhdGUgPj49IDE7CisKKy8qCU1fcHJpbnRrKCJjb21wdXRpbmcgZGFjIHJhdGUgJWQgd2l0aCBtb2RlICVkXG4iLHJhdGUscy0+Zm10KTsqLworCisJZnJlcSA9IGNvbXB1dGVfcmF0ZShzLCByYXRlKTsKKwkKKwkvKiBMb2FkIHRoZSBmcmVxdWVuY3ksIHR1cm4gb24gNmRCICovCisJYXB1X3NldF9yZWdpc3RlcihzLCAwLCAyLChhcHVfZ2V0X3JlZ2lzdGVyKHMsIDAsIDIpJjB4MDBGRil8CisJCSggKChmcmVxJjB4RkYpPDw4KXwweDEwICkpOworCWFwdV9zZXRfcmVnaXN0ZXIocywgMCwgMywgZnJlcT4+OCk7CisJYXB1X3NldF9yZWdpc3RlcihzLCAxLCAyLChhcHVfZ2V0X3JlZ2lzdGVyKHMsIDEsIDIpJjB4MDBGRil8CisJCSggKChmcmVxJjB4RkYpPDw4KXwweDEwICkpOworCWFwdV9zZXRfcmVnaXN0ZXIocywgMSwgMywgZnJlcT4+OCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hZGNfcmF0ZShzdHJ1Y3QgZXNzX3N0YXRlICpzLCB1bnNpZ25lZCByYXRlKQoreworCXUzMiBmcmVxOworCisJLyogU2FtcGxlIFJhdGUgY29udmVyc2lvbiBBUFVzIGRvbid0IGxpa2UgMHgxMDAwMCBmb3IgdGhlaXIgcmF0ZSAqLworCWlmIChyYXRlID4gNDc5OTkpCisJCXJhdGUgPSA0Nzk5OTsKKwlpZiAocmF0ZSA8IDQwMDApCisJCXJhdGUgPSA0MDAwOworCisJcy0+cmF0ZWFkYyA9IHJhdGU7CisKKwlmcmVxID0gY29tcHV0ZV9yYXRlKHMsIHJhdGUpOworCQorCS8qIExvYWQgdGhlIGZyZXF1ZW5jeSwgdHVybiBvbiA2ZEIgKi8KKwlhcHVfc2V0X3JlZ2lzdGVyKHMsIDIsIDIsKGFwdV9nZXRfcmVnaXN0ZXIocywgMiwgMikmMHgwMEZGKXwKKwkJKCAoKGZyZXEmMHhGRik8PDgpfDB4MTAgKSk7CisJYXB1X3NldF9yZWdpc3RlcihzLCAyLCAzLCBmcmVxPj44KTsKKwlhcHVfc2V0X3JlZ2lzdGVyKHMsIDMsIDIsKGFwdV9nZXRfcmVnaXN0ZXIocywgMywgMikmMHgwMEZGKXwKKwkJKCAoKGZyZXEmMHhGRik8PDgpfDB4MTAgKSk7CisJYXB1X3NldF9yZWdpc3RlcihzLCAzLCAzLCBmcmVxPj44KTsKKworCS8qIGZpeCBtaXhlciByYXRlIGF0IDQ4a2h6LiAgYW5kIGl0cyBfbXVzdF8gYmUgMHgxMDAwMC4gKi8KKwlmcmVxID0gMHgxMDAwMDsKKworCWFwdV9zZXRfcmVnaXN0ZXIocywgNCwgMiwoYXB1X2dldF9yZWdpc3RlcihzLCA0LCAyKSYweDAwRkYpfAorCQkoICgoZnJlcSYweEZGKTw8OCl8MHgxMCApKTsKKwlhcHVfc2V0X3JlZ2lzdGVyKHMsIDQsIDMsIGZyZXE+PjgpOworCWFwdV9zZXRfcmVnaXN0ZXIocywgNSwgMiwoYXB1X2dldF9yZWdpc3RlcihzLCA1LCAyKSYweDAwRkYpfAorCQkoICgoZnJlcSYweEZGKTw8OCl8MHgxMCApKTsKKwlhcHVfc2V0X3JlZ2lzdGVyKHMsIDUsIDMsIGZyZXE+PjgpOworfQorCisvKiBTdG9wIG91ciBob3N0IG9mIHJlY29yZGluZyBhcHVzICovCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9hZGMoc3RydWN0IGVzc19zdGF0ZSAqcykKK3sKKwkvKiBYWFggbGV0cyBob3BlIHdlIGRvbid0IGhhdmUgdG8gbG9jayBhcm91bmQgdGhpcyAqLworCWlmICghIChzLT5lbmFibGUgJiBBRENfUlVOTklORykpIHJldHVybjsKKworCXMtPmVuYWJsZSAmPSB+QURDX1JVTk5JTkc7CisJYXB1X3NldF9yZWdpc3RlcihzLCAyLCAwLCBhcHVfZ2V0X3JlZ2lzdGVyKHMsIDIsIDApJjB4RkYwRik7CisJYXB1X3NldF9yZWdpc3RlcihzLCAzLCAwLCBhcHVfZ2V0X3JlZ2lzdGVyKHMsIDMsIDApJjB4RkYwRik7CisJYXB1X3NldF9yZWdpc3RlcihzLCA0LCAwLCBhcHVfZ2V0X3JlZ2lzdGVyKHMsIDIsIDApJjB4RkYwRik7CisJYXB1X3NldF9yZWdpc3RlcihzLCA1LCAwLCBhcHVfZ2V0X3JlZ2lzdGVyKHMsIDMsIDApJjB4RkYwRik7Cit9CQorCisvKiBzdG9wIG91dHB1dCBhcHVzICovCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgZXNzX3N0YXRlICpzKQoreworCS8qIFhYWCBoYXZlIHRvIGxvY2sgYXJvdW5kIHRoaXM/ICovCisJaWYgKCEgKHMtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSkgcmV0dXJuOworCisJcy0+ZW5hYmxlICY9IH5EQUNfUlVOTklORzsKKwlhcHVfc2V0X3JlZ2lzdGVyKHMsIDAsIDAsIGFwdV9nZXRfcmVnaXN0ZXIocywgMCwgMCkmMHhGRjBGKTsKKwlhcHVfc2V0X3JlZ2lzdGVyKHMsIDEsIDAsIGFwdV9nZXRfcmVnaXN0ZXIocywgMSwgMCkmMHhGRjBGKTsKK30JCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2RhYyhzdHJ1Y3QgZXNzX3N0YXRlICpzKQoreworCS8qIFhYWCBsb2Nrcz8gKi8KKwlpZiAoCShzLT5kbWFfZGFjLm1hcHBlZCB8fCBzLT5kbWFfZGFjLmNvdW50ID4gMCkgJiYgCisJCXMtPmRtYV9kYWMucmVhZHkgJiYKKwkJKCEgKHMtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSkgKSB7CisKKwkJcy0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOworCisJCWFwdV9zZXRfcmVnaXN0ZXIocywgMCwgMCwgCisJCQkoYXB1X2dldF9yZWdpc3RlcihzLCAwLCAwKSYweEZGMEYpfHMtPmFwdV9tb2RlWzBdKTsKKworCQlpZigocy0+Zm10ID4+IEVTU19EQUNfU0hJRlQpICAmIEVTU19GTVRfU1RFUkVPKSAKKwkJCWFwdV9zZXRfcmVnaXN0ZXIocywgMSwgMCwgCisJCQkJKGFwdV9nZXRfcmVnaXN0ZXIocywgMSwgMCkmMHhGRjBGKXxzLT5hcHVfbW9kZVsxXSk7CisJfQorfQkKKworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBlc3Nfc3RhdGUgKnMpCit7CisJLyogWFhYIGxvY2tzPyAqLworCWlmICgocy0+ZG1hX2FkYy5tYXBwZWQgfHwgcy0+ZG1hX2FkYy5jb3VudCA8IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtIDIqcy0+ZG1hX2FkYy5mcmFnc2l6ZSkpIAorCSAgICAmJiBzLT5kbWFfYWRjLnJlYWR5ICYmICghIChzLT5lbmFibGUgJiBBRENfUlVOTklORykpICkgeworCisJCXMtPmVuYWJsZSB8PSBBRENfUlVOTklORzsKKwkJYXB1X3NldF9yZWdpc3RlcihzLCAyLCAwLCAKKwkJCShhcHVfZ2V0X3JlZ2lzdGVyKHMsIDIsIDApJjB4RkYwRil8cy0+YXB1X21vZGVbMl0pOworCQlhcHVfc2V0X3JlZ2lzdGVyKHMsIDQsIDAsIAorCQkJKGFwdV9nZXRfcmVnaXN0ZXIocywgNCwgMCkmMHhGRjBGKXxzLT5hcHVfbW9kZVs0XSk7CisKKwkJaWYoIHMtPmZtdCAmIChFU1NfRk1UX1NURVJFTyA8PCBFU1NfQURDX1NISUZUKSkgeworCQkJYXB1X3NldF9yZWdpc3RlcihzLCAzLCAwLCAKKwkJCQkoYXB1X2dldF9yZWdpc3RlcihzLCAzLCAwKSYweEZGMEYpfHMtPmFwdV9tb2RlWzNdKTsKKwkJCWFwdV9zZXRfcmVnaXN0ZXIocywgNSwgMCwgCisJCQkJKGFwdV9nZXRfcmVnaXN0ZXIocywgNSwgMCkmMHhGRjBGKXxzLT5hcHVfbW9kZVs1XSk7CisJCX0KKwkJCQorCX0KK30JCisKKworLyoKKyAqCU5hdGl2ZSBwbGF5IGJhY2sgZHJpdmVyIAorICovCisKKy8qIHRoZSBtb2RlIHBhc3NlZCBzaG91bGQgYmUgYWxyZWFkeSBzaGlmdGVkIGFuZCBtYXNrZWQgKi8KK3N0YXRpYyB2b2lkIAorZXNzX3BsYXlfc2V0dXAoc3RydWN0IGVzc19zdGF0ZSAqZXNzLCBpbnQgbW9kZSwgdTMyIHJhdGUsIHZvaWQgKmJ1ZmZlciwgaW50IHNpemUpCit7CisJdTMyIHBhOworCXUzMiB0bXB2YWw7CisJaW50IGhpZ2hfYXB1ID0gMDsKKwlpbnQgY2hhbm5lbDsKKworCU1fcHJpbnRrKCJtb2RlPSVkIHJhdGU9JWQgYnVmPSVwIGxlbj0lZC5cbiIsCisJCW1vZGUsIHJhdGUsIGJ1ZmZlciwgc2l6ZSk7CisJCQorCS8qIGFsbCBtYWVzdHJvIHNpemVzIGFyZSBpbiAxNmJpdCB3b3JkcyAqLworCXNpemUgPj49MTsKKworCWlmKG1vZGUmRVNTX0ZNVF9TVEVSRU8pIHsKKwkJaGlnaF9hcHUrKzsKKwkJLyogb25seSAxNi9zdGVyZW8gZ2V0cyBzaXplIGRpdmlkZWQgKi8KKwkJaWYobW9kZSZFU1NfRk1UXzE2QklUKQorCQkJc2l6ZT4+PTE7CisJfQorCQorCWZvcihjaGFubmVsPTA7IGNoYW5uZWwgPD0gaGlnaF9hcHU7IGNoYW5uZWwrKykKKwl7CisJCXBhID0gdmlydF90b19idXMoYnVmZmVyKTsKKworCQkvKiBzZXQgdGhlIHdhdmVjYWNoZSBjb250cm9sIHJlZyAqLworCQl0bXB2YWwgPSAocGEgLSAweDEwKSAmIDB4RkZGODsKKwkJaWYoIShtb2RlICYgRVNTX0ZNVF8xNkJJVCkpIHRtcHZhbCB8PSA0OworCQlpZihtb2RlICYgRVNTX0ZNVF9TVEVSRU8pIHRtcHZhbCB8PSAyOworCQllc3MtPmFwdV9iYXNlW2NoYW5uZWxdPXRtcHZhbDsKKwkJd2F2ZV9zZXRfcmVnaXN0ZXIoZXNzLCBlc3MtPmFwdVtjaGFubmVsXTw8MywgdG1wdmFsKTsKKwkJCisJCXBhIC09IHZpcnRfdG9fYnVzKGVzcy0+Y2FyZC0+ZG1hcGFnZXMpOworCQlwYT4+PTE7IC8qIHdvcmRzICovCisJCQorCQkvKiBiYXNlIG9mZnNldCBvZiBkbWEgY2FsY3Mgd2hlbiByZWFkaW5nIHRoZSBwb2ludGVyCisJCQlvbiB0aGUgbGVmdCBvbmUgKi8KKwkJaWYoIWNoYW5uZWwpIGVzcy0+ZG1hX2RhYy5iYXNlID0gcGEmMHhGRkZGOworCQkKKwkJcGF8PTB4MDA0MDAwMDA7CQkJLyogU3lzdGVtIFJBTSAqLworCisJCS8qIFhYWCB0aGUgMTZiaXQgaGVyZSBtaWdodCBub3QgYmUgbmVlZGVkLi4gKi8KKwkJaWYoKG1vZGUgJiBFU1NfRk1UX1NURVJFTykgJiYgKG1vZGUgJiBFU1NfRk1UXzE2QklUKSkgeworCQkJaWYoY2hhbm5lbCkgCisJCQkJcGF8PTB4MDA4MDAwMDA7CQkJLyogU3RlcmVvICovCisJCQlwYT4+PTE7CisJCX0KKwkJCQorLyogWFhYIHRoaW5rIGFib3V0IGVuZGlhbmVzcyB3aGVuIHdyaXRpbmcgdGhlc2UgcmVnaXN0ZXJzICovCisJCU1fcHJpbnRrKCJtYWVzdHJvOiBlc3NfcGxheV9zZXR1cDogQVBVWyVkXSBwYSA9IDB4JXhcbiIsIGVzcy0+YXB1W2NoYW5uZWxdLCBwYSk7CisJCS8qIHN0YXJ0IG9mIHNhbXBsZSAqLworCQlhcHVfc2V0X3JlZ2lzdGVyKGVzcywgY2hhbm5lbCwgNCwgKChwYT4+MTYpJjB4RkYpPDw4KTsKKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDUsIHBhJjB4RkZGRik7CisJCS8qIHNhbXBsZSBlbmQgKi8KKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDYsIChwYStzaXplKSYweEZGRkYpOworCQkvKiBzZXR0aW5nIGxvb3AgbGVuID09IHNhbXBsZSBsZW4gKi8KKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDcsIHNpemUpOworCQkKKwkJLyogY2xlYXIgZWZmZWN0cy9lbnYuLiAqLworCQlhcHVfc2V0X3JlZ2lzdGVyKGVzcywgY2hhbm5lbCwgOCwgMHgwMDAwKTsKKwkJLyogc2V0IGFtcCBub3cgdG8gMHhkMCAoPyksIGxvdyBieXRlIGlzICdhbXBsaXR1ZGUgZGVzdCc/ICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCA5LCAweEQwMDApOworCisJCS8qIGNsZWFyIHJvdXRpbmcgc3R1ZmYgKi8KKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDExLCAweDAwMDApOworCQkvKiBkbWEgb24sIG5vIGVudmVsb3BlcywgZmlsdGVyIHRvIGFsbCAxcykgKi8KKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDAsIDB4NDAwRik7CisJCQorCQlpZihtb2RlJkVTU19GTVRfMTZCSVQpCisJCQllc3MtPmFwdV9tb2RlW2NoYW5uZWxdPTB4MTA7CisJCWVsc2UKKwkJCWVzcy0+YXB1X21vZGVbY2hhbm5lbF09MHgzMDsKKworCQlpZihtb2RlJkVTU19GTVRfU1RFUkVPKSB7CisJCQkvKiBzZXQgcGFubmluZzogbGVmdCBvciByaWdodCAqLworCQkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDEwLCAweDhGMDAgfCAoY2hhbm5lbCA/IDAgOiAweDEwKSk7CisJCQllc3MtPmFwdV9tb2RlW2NoYW5uZWxdICs9IDB4MTA7CisJCX0gZWxzZQorCQkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDEwLCAweDhGMDgpOworCX0KKwkKKwkvKiBjbGVhciBXUCBpbnRlcnJ1cHRzICovCisJb3V0dygxLCBlc3MtPmNhcmQtPmlvYmFzZSsweDA0KTsKKwkvKiBlbmFibGUgV1AgaW50cyAqLworCW91dHcoaW53KGVzcy0+Y2FyZC0+aW9iYXNlKzB4MTgpfDQsIGVzcy0+Y2FyZC0+aW9iYXNlKzB4MTgpOworCisJLyogZ28gdGVhbSEgKi8KKwlzZXRfZGFjX3JhdGUoZXNzLHJhdGUpOworCXN0YXJ0X2RhYyhlc3MpOworfQorCisvKgorICoJTmF0aXZlIHJlY29yZCBkcml2ZXIgCisgKi8KKworLyogYWdhaW4sIHBhc3NlZCBtb2RlIGlzIGFscmFkeSBzaGlmdGVkL21hc2tlZCAqLworc3RhdGljIHZvaWQgCitlc3NfcmVjX3NldHVwKHN0cnVjdCBlc3Nfc3RhdGUgKmVzcywgaW50IG1vZGUsIHUzMiByYXRlLCB2b2lkICpidWZmZXIsIGludCBzaXplKQoreworCWludCBhcHVfc3RlcCA9IDI7CisJaW50IGNoYW5uZWw7CisKKwlNX3ByaW50aygibWFlc3RybzogZXNzX3JlY19zZXR1cDogbW9kZT0lZCByYXRlPSVkIGJ1Zj0weCVwIGxlbj0lZC5cbiIsCisJCW1vZGUsIHJhdGUsIGJ1ZmZlciwgc2l6ZSk7CisJCQorCS8qIGFsbCBtYWVzdHJvIHNpemVzIGFyZSBpbiAxNmJpdCB3b3JkcyAqLworCXNpemUgPj49MTsKKworCS8qIHdlJ3JlIGdpdmVuIHRoZSBmdWxsIHNpemUgb2YgdGhlIGJ1ZmZlciwgYnV0CisJaW4gc3RlcmVvIGVhY2ggY2hhbm5lbCB3aWxsIG9ubHkgdXNlIGl0cyBoYWxmICovCisJaWYobW9kZSZFU1NfRk1UX1NURVJFTykgeworCQlzaXplID4+PTE7IAorCQlhcHVfc3RlcCA9IDE7CisJfQorCQorCS8qIEFQVSBhc3NpZ25tZW50czogMiA9IG1vbm8vbGVmdCBTUkMKKwkgICAgICAgICAgICAgICAgICAgIDMgPSByaWdodCBTUkMKKwkgICAgICAgICAgICAgICAgICAgIDQgPSBtb25vL2xlZnQgSW5wdXQgTWl4ZXIKKwkgICAgICAgICAgICAgICAgICAgIDUgPSByaWdodCBJbnB1dCBNaXhlciAqLworCWZvcihjaGFubmVsPTI7Y2hhbm5lbDw2O2NoYW5uZWwrPWFwdV9zdGVwKQorCXsKKwkJaW50IGk7CisJCWludCBic2l6ZSwgcm91dGU7CisJCXUzMiBwYTsKKwkJdTMyIHRtcHZhbDsKKworCQkvKiBkYXRhIHNlZW1zIHRvIGZsb3cgZnJvbSB0aGUgY29kZWMsIHRocm91Z2ggYW4gYXB1IGludG8KKwkJCXRoZSAnbWl4YnVmJyBiaXQgb2YgcGFnZSwgdGhlbiB0aHJvdWdoIHRoZSBTUkMgYXB1CisJCQlhbmQgb3V0IHRvIHRoZSByZWFsICdidWZmZXInLiAgb2suICBzdXJlLiAgKi8KKwkJCisJCWlmKGNoYW5uZWwgJiAweDA0KSB7CisJCQkvKiBvaywgd2UncmUgYW4gaW5wdXQgbWl4ZXIgZ29pbmcgZnJvbSBhZGMKKwkJCQl0aHJvdWdoIHRoZSBtaXhidWYgdG8gdGhlIG90aGVyIGFwdXMgKi8KKworCQkJaWYoIShjaGFubmVsICYgMHgwMSkpIHsgCisJCQkJcGEgPSB2aXJ0X3RvX2J1cyhlc3MtPm1peGJ1Zik7CisJCQl9IGVsc2UgeworCQkJCXBhID0gdmlydF90b19idXMoZXNzLT5taXhidWYgKyAoUEFHRV9TSVpFID4+IDQpKTsKKwkJCX0KKworCQkJLyogd2Ugc291cmNlIGZyb20gYSAnbWFnaWMnIGFwdSAqLworCQkJYnNpemUgPSBQQUdFX1NJWkUgPj4gNTsJLyogaGFsZiBvZiB0aGlzIGNoYW5uZWxzIGFsbG9jLCBpbiB3b3JkcyAqLworCQkJcm91dGUgPSAweDE0ICsgKGNoYW5uZWwgLSA0KTsgLyogcGFyYWxsZWwgaW4gY3JhcCwgc2VlIG1hZXN0cm8gcmVnIDB4QyBbOC0xMV0gKi8KKwkJCWVzcy0+YXB1X21vZGVbY2hhbm5lbF0gPSAweDkwOyAgLyogSW5wdXQgTWl4ZXIgKi8KKworCQl9IGVsc2UgeyAgCisJCQkvKiB3ZSdyZSBhIHJhdGUgY29udmVydGVyIHRha2luZworCQkJCWlucHV0IGZyb20gdGhlIGlucHV0IGFwdXMgYW5kIG91dHB1dGluZyBpdCB0bworCQkJCXN5c3RlbSBtZW1vcnkgKi8KKwkJCWlmKCEoY2hhbm5lbCAmIDB4MDEpKSAgeworCQkJCXBhID0gdmlydF90b19idXMoYnVmZmVyKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogcmlnaHQgY2hhbm5lbCByZWNvcmRzIGl0cyBzcGxpdCBoYWxmLgorCQkJCSoyIGFjY29tbW9kYXRlcyBmb3IgcmFtcGFudCBzaGlmdGluZyBlYXJsaWVyICovCisJCQkJcGEgPSB2aXJ0X3RvX2J1cyhidWZmZXIgKyBzaXplKjIpOworCQkJfQorCisJCQllc3MtPmFwdV9tb2RlW2NoYW5uZWxdID0gMHhCMDsgIC8qIFNhbXBsZSBSYXRlIENvbnZlcnRlciAqLworCisJCQlic2l6ZSA9IHNpemU7IAorCQkJLyogZ2V0IGlucHV0IGZyb20gaW5wdXRpbmcgYXB1ICovCisJCQlyb3V0ZSA9IGNoYW5uZWwgKyAyOworCQl9CisKKwkJTV9wcmludGsoIm1hZXN0cm86IGVzc19yZWNfc2V0dXA6IGdldHRpbmcgcGEgMHgleCBmcm9tICVkXG4iLHBhLGNoYW5uZWwpOworCQkKKwkJLyogc2V0IHRoZSB3YXZlY2FjaGUgY29udHJvbCByZWcgKi8KKwkJdG1wdmFsID0gKHBhIC0gMHgxMCkgJiAweEZGRjg7CisJCWVzcy0+YXB1X2Jhc2VbY2hhbm5lbF09dG1wdmFsOworCQl3YXZlX3NldF9yZWdpc3Rlcihlc3MsIGVzcy0+YXB1W2NoYW5uZWxdPDwzLCB0bXB2YWwpOworCQkKKwkJcGEgLT0gdmlydF90b19idXMoZXNzLT5jYXJkLT5kbWFwYWdlcyk7CisJCXBhPj49MTsgLyogd29yZHMgKi8KKwkJCisJCS8qIGJhc2Ugb2Zmc2V0IG9mIGRtYSBjYWxjcyB3aGVuIHJlYWRpbmcgdGhlIHBvaW50ZXIKKwkJCW9uIHRoaXMgbGVmdCBvbmUgKi8KKwkJaWYoY2hhbm5lbD09MikgZXNzLT5kbWFfYWRjLmJhc2UgPSBwYSYweEZGRkY7CisKKwkJcGF8PTB4MDA0MDAwMDA7CQkJLyogYml0IDIyIC0+IFN5c3RlbSBSQU0gKi8KKworCQlNX3ByaW50aygibWFlc3RybzogZXNzX3JlY19zZXR1cDogQVBVWyVkXSBwYSA9IDB4JXggc2l6ZSA9IDB4JXggcm91dGUgPSAweCV4XG4iLCAKKwkJCWVzcy0+YXB1W2NoYW5uZWxdLCBwYSwgYnNpemUsIHJvdXRlKTsKKwkJCisJCS8qIEJlZ2luIGxvYWRpbmcgdGhlIEFQVSAqLwkJCisJCWZvcihpPTA7aTwxNTtpKyspCQkvKiBjbGVhciBhbGwgUEJScyAqLworCQkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIGksIDB4MDAwMCk7CisJCQkKKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDAsIDB4NDAwRik7CisKKwkJLyogbmVlZCB0byBlbmFibGUgc3ViZ3JvdXBzLi4gYW5kIHdlIHNob3VsZCBwcm9iYWJseQorCQkJaGF2ZSBkaWZmZXJlbnQgZ3JvdXBzIGZvciBkaWZmZXJlbnQgL2Rldi9kc3BzLi4gICovCisgCQlhcHVfc2V0X3JlZ2lzdGVyKGVzcywgY2hhbm5lbCwgMiwgMHg4KTsKKwkJCQkKKwkJLyogTG9hZCB0aGUgYnVmZmVyIGludG8gdGhlIHdhdmUgZW5naW5lICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCA0LCAoKHBhPj4xNikmMHhGRik8PDgpOworCQkvKiBYWFggcmVnIGlzIGxpdHRsZSBlbmRpYW4uLiAqLworCQlhcHVfc2V0X3JlZ2lzdGVyKGVzcywgY2hhbm5lbCwgNSwgcGEmMHhGRkZGKTsKKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDYsIChwYStic2l6ZSkmMHhGRkZGKTsKKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDcsIGJzaXplKTsKKwkJCQkKKwkJLyogY2xlYXIgZWZmZWN0cy9lbnYuLiAqLworCQlhcHVfc2V0X3JlZ2lzdGVyKGVzcywgY2hhbm5lbCwgOCwgMHgwMEYwKTsKKwkJCisJCS8qIGFtcGxpdHVkZSBub3c/ICBzdXJlLiAgd2h5IG5vdC4gICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCA5LCAweDAwMDApOworCisJCS8qIHNldCBmaWx0ZXIgdHVuZSwgcmFkaXVzLCBwb2xhciBwYW4gKi8KKwkJYXB1X3NldF9yZWdpc3Rlcihlc3MsIGNoYW5uZWwsIDEwLCAweDhGMDgpOworCisJCS8qIHJvdXRlIGlucHV0ICovCisJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBjaGFubmVsLCAxMSwgcm91dGUpOworCX0KKwkKKwkvKiBjbGVhciBXUCBpbnRlcnJ1cHRzICovCisJb3V0dygxLCBlc3MtPmNhcmQtPmlvYmFzZSsweDA0KTsKKwkvKiBlbmFibGUgV1AgaW50cyAqLworCW91dHcoaW53KGVzcy0+Y2FyZC0+aW9iYXNlKzB4MTgpfDQsIGVzcy0+Y2FyZC0+aW9iYXNlKzB4MTgpOworCisJLyogbGV0ICdlciByaXAgKi8KKwlzZXRfYWRjX3JhdGUoZXNzLHJhdGUpOworCXN0YXJ0X2FkYyhlc3MpOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIHNldF9kbWFhKHN0cnVjdCBlc3Nfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisJTV9wcmludGsoInNldF9kbWFhPz9cbiIpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZG1hYyhzdHJ1Y3QgZXNzX3N0YXRlICpzLCB1bnNpZ25lZCBpbnQgYWRkciwgdW5zaWduZWQgaW50IGNvdW50KQoreworCU1fcHJpbnRrKCJzZXRfZG1hYz8/XG4iKTsKK30KKworLyogUGxheWJhY2sgcG9pbnRlciAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRfZG1hYShzdHJ1Y3QgZXNzX3N0YXRlICpzKQoreworCWludCBvZmZzZXQ7CisKKwlvZmZzZXQgPSBhcHVfZ2V0X3JlZ2lzdGVyKHMsMCw1KTsKKworLyoJTV9wcmludGsoImRtYWE6IG9mZnNldDogJWQsIGJhc2U6ICVkXG4iLG9mZnNldCxzLT5kbWFfZGFjLmJhc2UpOyAqLworCQorCW9mZnNldC09cy0+ZG1hX2RhYy5iYXNlOworCisJcmV0dXJuIChvZmZzZXQmMHhGRkZFKTw8MTsgLyogaGFyZHdhcmUgaXMgaW4gd29yZHMgKi8KK30KKworLyogUmVjb3JkIHBvaW50ZXIgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X2RtYWMoc3RydWN0IGVzc19zdGF0ZSAqcykKK3sKKwlpbnQgb2Zmc2V0OworCisJb2Zmc2V0ID0gYXB1X2dldF9yZWdpc3RlcihzLDIsNSk7CisKKy8qCU1fcHJpbnRrKCJkbWFjOiBvZmZzZXQ6ICVkLCBiYXNlOiAlZFxuIixvZmZzZXQscy0+ZG1hX2FkYy5iYXNlKTsgKi8KKwkKKwkvKiBUaGUgb2Zmc2V0IGlzIGFuIGFkZHJlc3Mgbm90IGEgcG9zaXRpb24gcmVsYXRpdmUgdG8gYmFzZSAqLworCW9mZnNldC09cy0+ZG1hX2FkYy5iYXNlOworCQorCXJldHVybiAob2Zmc2V0JjB4RkZGRSk8PDE7IC8qIGhhcmR3YXJlIGlzIGluIHdvcmRzICovCit9CisKKy8qCisgKglNZWV0IEJvYiwgdGhlIHRpbWVyLi4uCisgKi8KKworc3RhdGljIGlycXJldHVybl90IGVzc19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK3N0YXRpYyB2b2lkIHN0b3BfYm9iKHN0cnVjdCBlc3Nfc3RhdGUgKnMpCit7CisJLyogTWFzayBJRFIgMTEsMTcgKi8KKwltYWVzdHJvX3dyaXRlKHMsICAweDExLCBtYWVzdHJvX3JlYWQocywgMHgxMSkmfjEpOworCW1hZXN0cm9fd3JpdGUocywgIDB4MTcsIG1hZXN0cm9fcmVhZChzLCAweDE3KSZ+MSk7Cit9CisKKy8qIGV2ZW50dWFsbHkgd2UgY291bGQgYmUgY2xldmVyIGFuZCBsaW1pdCBib2IgaW50cworCXRvIHRoZSBmcmVxdWVuY3kgYXQgd2hpY2ggb3VyIHNtYWxsZXN0IGR1cmF0aW9uCisJY2h1bmtzIG1heSBleHBpcmUgKi8KKyNkZWZpbmUgRVNTX1NZU0NMSwk1MDAwMDAwMAorc3RhdGljIHZvaWQgc3RhcnRfYm9iKHN0cnVjdCBlc3Nfc3RhdGUgKnMpCit7CisJaW50IHByZXNjYWxlOworCWludCBkaXZpZGU7CisJCisJLyogWFhYIG1ha2UgZnJlcSBzZWxlY3RvciBtdWNoIHNtYXJ0ZXIsIHNlZSBjYWxjX2JvYl9yYXRlICovCisJaW50IGZyZXEgPSAyMDA7IAorCQorCS8qIGNvbXB1dGUgaWRlYWwgaW50ZXJydXB0IGZyZXF1ZW5jeSBmb3IgYnVmZmVyIHNpemUgJiBwbGF5IHJhdGUgKi8KKwkvKiBmaXJzdCwgZmluZCBiZXN0IHByZXNjYWxlciB2YWx1ZSB0byBtYXRjaCBmcmVxICovCisJZm9yKHByZXNjYWxlPTU7cHJlc2NhbGU8MTI7cHJlc2NhbGUrKykKKwkJaWYoZnJlcSA+IChFU1NfU1lTQ0xLPj4ocHJlc2NhbGUrOSkpKQorCQkJYnJlYWs7CisJCQkKKwkvKiBuZXh0LCBiYWNrIG9mZiBwcmVzY2FsZXIgd2hpbHN0IGdldHRpbmcgZGl2aWRlciBpbnRvIG9wdGltdW0gcmFuZ2UgKi8KKwlkaXZpZGU9MTsKKwl3aGlsZSgocHJlc2NhbGUgPiA1KSAmJiAoZGl2aWRlPDMyKSkKKwl7CisJCXByZXNjYWxlLS07CisJCWRpdmlkZSA8PD0xOworCX0KKwlkaXZpZGU+Pj0xOworCQorCS8qIG5vdyBmaW5lLXR1bmUgdGhlIGRpdmlkZXIgZm9yIGJlc3QgbWF0Y2ggKi8KKwlmb3IoO2RpdmlkZTwzMTtkaXZpZGUrKykKKwkJaWYoZnJlcSA+PSAoKEVTU19TWVNDTEs+PihwcmVzY2FsZSs5KSkvKGRpdmlkZSsxKSkpCisJCQlicmVhazsKKwkKKwkvKiBkaXZpZGUgPSAwIGlzIGlsbGVnYWwsIGJ1dCBkb24ndCBsZXQgcHJlc2NhbGUgPSA0ISAqLworCWlmKGRpdmlkZSA9PSAwKQorCXsKKwkJZGl2aWRlKys7CisJCWlmKHByZXNjYWxlPjUpCisJCQlwcmVzY2FsZS0tOworCX0KKworCW1hZXN0cm9fd3JpdGUocywgNiwgMHg5MDAwIHwgKHByZXNjYWxlPDw1KSB8IGRpdmlkZSk7IC8qIHNldCByZWcgKi8KKwkKKwkvKiBOb3cgc2V0IElEUiAxMS8xNyAqLworCW1hZXN0cm9fd3JpdGUocywgMHgxMSwgbWFlc3Ryb19yZWFkKHMsIDB4MTEpfDEpOworCW1hZXN0cm9fd3JpdGUocywgMHgxNywgbWFlc3Ryb19yZWFkKHMsIDB4MTcpfDEpOworfQorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIHRoaXMgcXVpY2tseSBjYWxjdWxhdGVzIHRoZSBmcmVxdWVuY3kgbmVlZGVkIGZvciBib2IKKwlhbmQgc2V0cyBpdCBpZiBpdHMgZGlmZmVyZW50IHRoYW4gd2hhdCBib2IgaXMKKwljdXJyZW50bHkgcnVubmluZyBhdC4gIGl0cyBjYWxsZWQgb2Z0ZW4gc28gCisJbmVlZHMgdG8gYmUgZmFpcmx5IHF1aWNrLiAqLworI2RlZmluZSBCT0JfTUlOIDUwCisjZGVmaW5lIEJPQl9NQVggNDAwCitzdGF0aWMgdm9pZCBjYWxjX2JvYl9yYXRlKHN0cnVjdCBlc3Nfc3RhdGUgKnMpIHsKKyNpZiAwIC8qIHRoaXMgdGhpbmcgdHJpZXMgdG8gc2V0IHRoZSBmcmVxdWVuY3kgb2YgYm9iIHN1Y2ggdGhhdAorCXRoZXJlIGFyZSAyIGludGVycnVwdHMgLyBidWZmZXIgd2Fsa2VkIGJ5IHRoZSBkYWMvYWRjLiAgVGhhdAorCWlzIHByb2JhYmx5IHZlcnkgd3JvbmcgZm9yIHBlb3BsZSB3aG8gYWN0dWFsbHkgY2FyZSBhYm91dCAKKwltaWQgYnVmZmVyIHBvc2l0aW9uaW5nLiAgaXQgc2hvdWxkIGJlIGNhbGN1bGF0ZWQgYXMgYnl0ZXMvaW50ZXJydXB0CisJYW5kIHRoYXQgbmVlZHMgdG8gYmUgZGVjaWRlZCA6KSAgc28gZm9yIG5vdyBqdXN0IHVzZSB0aGUgc3RhdGljIDE1MAorCWluIHN0YXJ0X2JvYi4qLworCisJdW5zaWduZWQgaW50IGRhY19yYXRlPTIsYWRjX3JhdGU9MSxuZXdyYXRlOworCXN0YXRpYyBpbnQgaXNyYXRlPS0xOworCisJaWYgKHMtPmRtYV9kYWMuZnJhZ3NpemUgPT0gMCkgZGFjX3JhdGUgPSBCT0JfTUlOOworCWVsc2UgIHsKKwkJZGFjX3JhdGUgPQkoMiAqIHMtPnJhdGVkYWMgKiBzYW1wbGVfc2l6ZVsocy0+Zm10ID4+IEVTU19EQUNfU0hJRlQpICYgRVNTX0ZNVF9NQVNLXSkgLworCQkJCShzLT5kbWFfZGFjLmZyYWdzaXplKSA7CisJfQorCQkKKwlpZiAocy0+ZG1hX2FkYy5mcmFnc2l6ZSA9PSAwKSBhZGNfcmF0ZSA9IEJPQl9NSU47CisJZWxzZSB7CisJCWFkY19yYXRlID0JKDIgKiBzLT5yYXRlYWRjICogc2FtcGxlX3NpemVbKHMtPmZtdCA+PiBFU1NfREFDX1NISUZUKSAmIEVTU19GTVRfTUFTS10pIC8KKwkJCQkocy0+ZG1hX2FkYy5mcmFnc2l6ZSkgOworCX0KKworCWlmKGRhY19yYXRlID4gYWRjX3JhdGUpIG5ld3JhdGUgPSBhZGNfcmF0ZTsKKwllbHNlIG5ld3JhdGU9ZGFjX3JhdGU7CisKKwlpZihuZXdyYXRlID4gQk9CX01BWCkgbmV3cmF0ZSA9IEJPQl9NQVg7CisJZWxzZSB7CisJCWlmKG5ld3JhdGUgPCBCT0JfTUlOKSAKKwkJCW5ld3JhdGUgPSBCT0JfTUlOOworCX0KKworCWlmKCBpc3JhdGUgIT0gbmV3cmF0ZSkgeworCQlwcmludGsoImRhYzogJWQgIGFkYzogJWQgcmF0ZTogJWRcbiIsZGFjX3JhdGUsYWRjX3JhdGUsaXNyYXRlKTsKKwkJaXNyYXRlPW5ld3JhdGU7CisJfQorI2VuZGlmCisKK30KKworc3RhdGljIGludCAKK3Byb2dfZG1hYnVmKHN0cnVjdCBlc3Nfc3RhdGUgKnMsIHVuc2lnbmVkIHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9IHJlYyA/ICZzLT5kbWFfYWRjIDogJnMtPmRtYV9kYWM7CisJdW5zaWduZWQgcmF0ZSA9IHJlYyA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjOworCXVuc2lnbmVkIGJ5dGVwZXJzZWM7CisJdW5zaWduZWQgYnVmczsKKwl1bnNpZ25lZCBjaGFyIGZtdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlmbXQgPSBzLT5mbXQ7CisJaWYgKHJlYykgeworCQlzdG9wX2FkYyhzKTsKKwkJZm10ID4+PSBFU1NfQURDX1NISUZUOworCX0gZWxzZSB7CisJCXN0b3BfZGFjKHMpOworCQlmbXQgPj49IEVTU19EQUNfU0hJRlQ7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlmbXQgJj0gRVNTX0ZNVF9NQVNLOworCisJZGItPmh3cHRyID0gZGItPnN3cHRyID0gZGItPnRvdGFsX2J5dGVzID0gZGItPmNvdW50ID0gZGItPmVycm9yID0gZGItPmVuZGNsZWFyZWQgPSAwOworCisJLyogdGhpcyBhbGdvcml0aG0gaXMgYSBsaXR0bGUgbnV0cy4uIHdoZXJlIGRpZCAvMTAwMCBjb21lIGZyb20/ICovCisJYnl0ZXBlcnNlYyA9IHJhdGUgPDwgc2FtcGxlX3NoaWZ0W2ZtdF07CisJYnVmcyA9IFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXI7CisJaWYgKGRiLT5vc3NmcmFnc2hpZnQpIHsKKwkJaWYgKCgxMDAwIDw8IGRiLT5vc3NmcmFnc2hpZnQpIDwgYnl0ZXBlcnNlYykKKwkJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAwKTsKKwkJZWxzZQorCQkJZGItPmZyYWdzaGlmdCA9IGRiLT5vc3NmcmFnc2hpZnQ7CisJfSBlbHNlIHsKKwkJZGItPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjLzEwMC8oZGItPnN1YmRpdmlzaW9uID8gZGItPnN1YmRpdmlzaW9uIDogMSkpOworCQlpZiAoZGItPmZyYWdzaGlmdCA8IDMpCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gMzsgCisJfQorCWRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl9CisJZGItPmZyYWdzaXplID0gMSA8PCBkYi0+ZnJhZ3NoaWZ0OworCWlmIChkYi0+b3NzbWF4ZnJhZ3MgPj0gNCAmJiBkYi0+b3NzbWF4ZnJhZ3MgPCBkYi0+bnVtZnJhZykKKwkJZGItPm51bWZyYWcgPSBkYi0+b3NzbWF4ZnJhZ3M7CisJZGItPmZyYWdzYW1wbGVzID0gZGItPmZyYWdzaXplID4+IHNhbXBsZV9zaGlmdFtmbXRdOworCWRiLT5kbWFzaXplID0gZGItPm51bWZyYWcgPDwgZGItPmZyYWdzaGlmdDsKKworCU1fcHJpbnRrKCJtYWVzdHJvOiBzZXR1cCBvc3M6IG51bWZyYWc6ICVkIGZyYWdzaXplOiAlZCBkbWFzaXplOiAlZFxuIixkYi0+bnVtZnJhZyxkYi0+ZnJhZ3NpemUsZGItPmRtYXNpemUpOworCisJbWVtc2V0KGRiLT5yYXdidWYsIChmbXQgJiBFU1NfRk1UXzE2QklUKSA/IDAgOiAweDgwLCBkYi0+ZG1hc2l6ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmIChyZWMpIAorCQllc3NfcmVjX3NldHVwKHMsIGZtdCwgcy0+cmF0ZWFkYywgZGItPnJhd2J1ZiwgZGItPmRtYXNpemUpOworCWVsc2UgCisJCWVzc19wbGF5X3NldHVwKHMsIGZtdCwgcy0+cmF0ZWRhYywgZGItPnJhd2J1ZiwgZGItPmRtYXNpemUpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCWRiLT5yZWFkeSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCAKK2NsZWFyX2FkdmFuY2Uoc3RydWN0IGVzc19zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBjaGFyIGMgPSAoKHMtPmZtdCA+PiBFU1NfREFDX1NISUZUKSAmIEVTU19GTVRfMTZCSVQpID8gMCA6IDB4ODA7CisJCisJdW5zaWduZWQgY2hhciAqYnVmID0gcy0+ZG1hX2RhYy5yYXdidWY7CisJdW5zaWduZWQgYnNpemUgPSBzLT5kbWFfZGFjLmRtYXNpemU7CisJdW5zaWduZWQgYnB0ciA9IHMtPmRtYV9kYWMuc3dwdHI7CisJdW5zaWduZWQgbGVuID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKwkKKwlpZiAoYnB0ciArIGxlbiA+IGJzaXplKSB7CisJCXVuc2lnbmVkIHggPSBic2l6ZSAtIGJwdHI7CisJCW1lbXNldChidWYgKyBicHRyLCBjLCB4KTsKKwkJLyogYWNjb3VudCBmb3Igd3JhcHBpbmc/ICovCisJCWJwdHIgPSAwOworCQlsZW4gLT0geDsKKwl9CisJbWVtc2V0KGJ1ZiArIGJwdHIsIGMsIGxlbik7Cit9CisKKy8qIGNhbGwgd2l0aCBzcGlubG9jayBoZWxkISAqLworc3RhdGljIHZvaWQgCitlc3NfdXBkYXRlX3B0cihzdHJ1Y3QgZXNzX3N0YXRlICpzKQoreworCXVuc2lnbmVkIGh3cHRyOworCWludCBkaWZmOworCisJLyogdXBkYXRlIEFEQyBwb2ludGVyICovCisJaWYgKHMtPmRtYV9hZGMucmVhZHkpIHsKKwkJLyogb2ggYm95IHNob3VsZCB0aGlzIGFsbCBiZSByZS13cml0dGVuLiAgZXZlcnl0aGluZyBpbiB0aGUgY3VycmVudCBjb2RlIHBhdGhzIHRoaW5rCisJCXRoYXQgdGhlIHZhcmlvdXMgY291bnRlcnMvcG9pbnRlcnMgYXJlIGV4cHJlc3NlZCBpbiBieXRlcyB0byB0aGUgdXNlciBidXQgd2UgaGF2ZQorCQl0d28gYXB1cyBkb2luZyBzdGVyZW8gc3R1ZmYgc28gd2UgZml4IGl0IHVwIGhlcmUuLiBpdCBwcm9wYWdhdGVzIHRvIGFsbCB0aGUgdmFyaW91cworCQljb3VudGVycyBmcm9tIGhlcmUuICAqLworCQlpZiAoIHMtPmZtdCAmIChFU1NfRk1UX1NURVJFTyA8PCBFU1NfQURDX1NISUZUKSkgeworCQkJaHdwdHIgPSAoZ2V0X2RtYWMocykqMikgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisJCX0gZWxzZSB7CisJCQlod3B0ciA9IGdldF9kbWFjKHMpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQl9CisJCWRpZmYgPSAocy0+ZG1hX2FkYy5kbWFzaXplICsgaHdwdHIgLSBzLT5kbWFfYWRjLmh3cHRyKSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKwkJcy0+ZG1hX2FkYy5od3B0ciA9IGh3cHRyOworCQlzLT5kbWFfYWRjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCXMtPmRtYV9hZGMuY291bnQgKz0gZGlmZjsKKwkJaWYgKHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfYWRjLmZyYWdzaXplKSAKKwkJCXdha2VfdXAoJnMtPmRtYV9hZGMud2FpdCk7CisJCWlmICghcy0+ZG1hX2FkYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID4gKHNpZ25lZCkocy0+ZG1hX2FkYy5kbWFzaXplIC0gKCgzICogcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgPj4gMSkpKSB7CisJCQkJLyogRklMTCBNRSAKKwkJCQl3cmluZGlyKHMsIFNWX0NJRU5BQkxFLCBzLT5lbmFibGUpOyAqLworCQkJCXN0b3BfYWRjKHMpOyAKKwkJCQkvKiBicnV0ZSBmb3JjZSBldmVyeW9uZSBiYWNrIGluIHN5bmMsIHNpZ2ggKi8KKwkJCQlzLT5kbWFfYWRjLmNvdW50ID0gMDsKKwkJCQlzLT5kbWFfYWRjLnN3cHRyID0gMDsKKwkJCQlzLT5kbWFfYWRjLmh3cHRyID0gMDsKKwkJCQlzLT5kbWFfYWRjLmVycm9yKys7CisJCQl9CisJCX0KKwl9CisJLyogdXBkYXRlIERBQyBwb2ludGVyICovCisJaWYgKHMtPmRtYV9kYWMucmVhZHkpIHsKKwkJaHdwdHIgPSBnZXRfZG1hYShzKSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsgCisJCS8qIHRoZSBhcHUgb25seSByZXBvcnRzIHRoZSBsZW5ndGggaXQgaGFzIHNlZW4sIG5vdCB0aGUKKwkJCWxlbmd0aCBvZiB0aGUgbWVtb3J5IHRoYXQgaGFzIGJlZW4gdXNlZCAodGhlIFdQCisJCQlrbm93cyB0aGF0KSAqLworCQlpZiAoICgocy0+Zm10ID4+IEVTU19EQUNfU0hJRlQpICYgRVNTX0ZNVF9NQVNLKSA9PSAoRVNTX0ZNVF9TVEVSRU98RVNTX0ZNVF8xNkJJVCkpCisJCQlod3B0cjw8PTE7CisKKwkJZGlmZiA9IChzLT5kbWFfZGFjLmRtYXNpemUgKyBod3B0ciAtIHMtPmRtYV9kYWMuaHdwdHIpICUgcy0+ZG1hX2RhYy5kbWFzaXplOworLyoJCU1fcHJpbnRrKCJ1cGRhdGluZyBkYWM6IGh3cHRyOiAlZCBkaWZmOiAlZFxuIixod3B0cixkaWZmKTsqLworCQlzLT5kbWFfZGFjLmh3cHRyID0gaHdwdHI7CisJCXMtPmRtYV9kYWMudG90YWxfYnl0ZXMgKz0gZGlmZjsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKSB7CisJCQlzLT5kbWFfZGFjLmNvdW50ICs9IGRpZmY7CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUpIHsKKwkJCQl3YWtlX3VwKCZzLT5kbWFfZGFjLndhaXQpOworCQkJfQorCQl9IGVsc2UgeworCQkJcy0+ZG1hX2RhYy5jb3VudCAtPSBkaWZmOworLyoJCQlNX3ByaW50aygibWFlc3RybzogZXNzX3VwZGF0ZV9wdHI6IGRpZmY6ICVkLCBjb3VudDogJWRcbiIsIGRpZmYsIHMtPmRtYV9kYWMuY291bnQpOyAqLworCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPD0gMCkgeworCQkJCU1fcHJpbnRrKCJ1bmRlcmZsb3chIGRpZmY6ICVkIGNvdW50OiAlZCBodzogJWQgc3c6ICVkXG4iLCBkaWZmLCBzLT5kbWFfZGFjLmNvdW50LCAKKwkJCQkJaHdwdHIsIHMtPmRtYV9kYWMuc3dwdHIpOworCQkJCS8qIEZJTEwgTUUgCisJCQkJd3JpbmRpcihzLCBTVl9DSUVOQUJMRSwgcy0+ZW5hYmxlKTsgKi8KKwkJCQkvKiBYWFggaG93IG9uIGVhcnRoIGNhbiBjYWxsaW5nIHRoaXMgd2l0aCB0aGUgbG9jayBoZWxkIHdvcmsuLiAqLworCQkJCXN0b3BfZGFjKHMpOworCQkJCS8qIGJydXRlIGZvcmNlIGV2ZXJ5b25lIGJhY2sgaW4gc3luYywgc2lnaCAqLworCQkJCXMtPmRtYV9kYWMuY291bnQgPSAwOyAKKwkJCQlzLT5kbWFfZGFjLnN3cHRyID0gaHdwdHI7IAorCQkJCXMtPmRtYV9kYWMuZXJyb3IrKzsKKwkJCX0gZWxzZSBpZiAocy0+ZG1hX2RhYy5jb3VudCA8PSAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUgJiYgIXMtPmRtYV9kYWMuZW5kY2xlYXJlZCkgeworCQkJCWNsZWFyX2FkdmFuY2Uocyk7CisJCQkJcy0+ZG1hX2RhYy5lbmRjbGVhcmVkID0gMTsKKwkJCX0KKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplIDw9IChzaWduZWQpcy0+ZG1hX2RhYy5kbWFzaXplKSB7CisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYy53YWl0KTsKKy8qCQkJCXByaW50aygid2FraW5nIHVwIERBQyBjb3VudDogJWQgc3c6ICVkIGh3OiAlZFxuIixzLT5kbWFfZGFjLmNvdW50LCBzLT5kbWFfZGFjLnN3cHRyLCAKKwkJCQkJaHdwdHIpOyovCisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorZXNzX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworICAgICAgICBzdHJ1Y3QgZXNzX3N0YXRlICpzOworICAgICAgICBzdHJ1Y3QgZXNzX2NhcmQgKmMgPSAoc3RydWN0IGVzc19jYXJkICopZGV2X2lkOworCWludCBpOworCXUzMiBldmVudDsKKworCWlmICggISAoZXZlbnQgPSBpbmIoYy0+aW9iYXNlKzB4MUEpKSApCisJCXJldHVybiBJUlFfTk9ORTsKKworCW91dHcoaW53KGMtPmlvYmFzZSs0KSYxLCBjLT5pb2Jhc2UrNCk7CisKKy8qCU1fcHJpbnRrKCJtYWVzdHJvIGludDogJXhcbiIsZXZlbnQpOyovCisJaWYoZXZlbnQmKDE8PDYpKQorCXsKKwkJaW50IHg7CisJCWVudW0ge1VQX0VWVCwgRE9XTl9FVlQsIE1VVEVfRVZUfSB2b2xfZXZ0OworCQlpbnQgdm9sdW1lOworCisJCS8qIEZpZ3VyZSBvdXQgd2hpY2ggdm9sdW1lIGNvbnRyb2wgYnV0dG9uIHdhcyBwdXNoZWQsCisJCSAgIGJhc2VkIG9uIGRpZmZlcmVuY2VzIGZyb20gdGhlIGRlZmF1bHQgcmVnaXN0ZXIKKwkJICAgdmFsdWVzLiAqLworCQl4ID0gaW5iKGMtPmlvYmFzZSsweDFjKTsKKwkJaWYgKHgmMSkgdm9sX2V2dCA9IE1VVEVfRVZUOworCQllbHNlIGlmICgoKHg+PjEpJjcpID4gNCkgdm9sX2V2dCA9IFVQX0VWVDsKKwkJZWxzZSB2b2xfZXZ0ID0gRE9XTl9FVlQ7CisKKwkJLyogUmVzZXQgdGhlIHZvbHVtZSBjb250cm9sIHJlZ2lzdGVycy4gKi8KKwkJb3V0YigweDg4LCBjLT5pb2Jhc2UrMHgxYyk7CisJCW91dGIoMHg4OCwgYy0+aW9iYXNlKzB4MWQpOworCQlvdXRiKDB4ODgsIGMtPmlvYmFzZSsweDFlKTsKKwkJb3V0YigweDg4LCBjLT5pb2Jhc2UrMHgxZik7CisKKwkJLyogRGVhbCB3aXRoIHRoZSBidXR0b24gcHJlc3MgaW4gYSBoYW1tZXItaGFuZGVkCisJCSAgIG1hbm5lciBieSBhZGp1c3RpbmcgdGhlIG1hc3RlciBtaXhlciB2b2x1bWUuICovCisJCXZvbHVtZSA9IGMtPm1peC5taXhlcl9zdGF0ZVswXSAmIDB4ZmY7CisJCWlmICh2b2xfZXZ0ID09IFVQX0VWVCkgeworCQkJdm9sdW1lICs9IDU7CisJCQlpZiAodm9sdW1lID4gMTAwKQorCQkJCXZvbHVtZSA9IDEwMDsKKwkJfQorCQllbHNlIGlmICh2b2xfZXZ0ID09IERPV05fRVZUKSB7CisJCQl2b2x1bWUgLT0gNTsKKwkJCWlmICh2b2x1bWUgPCAwKQorCQkJCXZvbHVtZSA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiB2b2xfZXZ0ID09IE1VVEVfRVZUICovCisJCQlpZiAodm9sdW1lID09IDApCisJCQkJdm9sdW1lID0gYy0+ZG9ja19tdXRlX3ZvbDsKKwkJCWVsc2UgeworCQkJCWMtPmRvY2tfbXV0ZV92b2wgPSB2b2x1bWU7CisJCQkJdm9sdW1lID0gMDsKKwkJCX0KKwkJfQorCQlzZXRfbWl4ZXIgKGMsIDAsICh2b2x1bWUgPDwgOCkgfCB2b2x1bWUpOworCX0KKworCS8qIEFjayBhbGwgdGhlIGludGVycnVwdHMuICovCisJb3V0YigweEZGLCBjLT5pb2Jhc2UrMHgxQSk7CisJCQorCS8qCisJICoJVXBkYXRlIHRoZSBwb2ludGVycyBmb3IgYWxsIEFQVSdzIHdlIGFyZSBydW5uaW5nLgorCSAqLworCWZvcihpPTA7aTxOUl9EU1BTO2krKykKKwl7CisJCXM9JmMtPmNoYW5uZWxzW2ldOworCQlpZihzLT5kZXZfYXVkaW8gPT0gLTEpCisJCQlicmVhazsKKwkJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwkJZXNzX3VwZGF0ZV9wdHIocyk7CisJCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPSBLRVJOX0NSSVQgIm1hZXN0cm86IGludmFsaWQgbWFnaWMgdmFsdWUgaW4gJXNcbiI7CisKKyNkZWZpbmUgVkFMSURBVEVfTUFHSUMoRk9PLE1BRykgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJaWYgKCEoRk9PKSB8fCAoRk9PKS0+bWFnaWMgIT0gTUFHKSB7IFwKKwkJcHJpbnRrKGludmFsaWRfbWFnaWMsX19GVU5DVElPTl9fKTsgICAgICAgICAgICBcCisJCXJldHVybiAtRU5YSU87ICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworI2RlZmluZSBWQUxJREFURV9TVEFURShhKSBWQUxJREFURV9NQUdJQyhhLEVTU19TVEFURV9NQUdJQykKKyNkZWZpbmUgVkFMSURBVEVfQ0FSRChhKSBWQUxJREFURV9NQUdJQyhhLEVTU19DQVJEX01BR0lDKQorCitzdGF0aWMgdm9pZCBzZXRfbWl4ZXIoc3RydWN0IGVzc19jYXJkICpjYXJkLHVuc2lnbmVkIGludCBtaXhlciwgdW5zaWduZWQgaW50IHZhbCApIAoreworCXVuc2lnbmVkIGludCBsZWZ0LHJpZ2h0OworCS8qIGNsZWFuc2UgaW5wdXQgYSBsaXR0bGUgKi8KKwlyaWdodCA9ICgodmFsID4+IDgpICAmIDB4ZmYpIDsKKwlsZWZ0ID0gKHZhbCAgJiAweGZmKSA7CisKKwlpZihyaWdodCA+IDEwMCkgcmlnaHQgPSAxMDA7CisJaWYobGVmdCA+IDEwMCkgbGVmdCA9IDEwMDsKKworCWNhcmQtPm1peC5taXhlcl9zdGF0ZVttaXhlcl09KHJpZ2h0IDw8IDgpIHwgbGVmdDsKKwljYXJkLT5taXgud3JpdGVfbWl4ZXIoY2FyZCxtaXhlcixsZWZ0LHJpZ2h0KTsKK30KKworc3RhdGljIHZvaWQKK21peGVyX3B1c2hfc3RhdGUoc3RydWN0IGVzc19jYXJkICpjYXJkKQoreworCWludCBpOworCWZvcihpID0gMCA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMgOyBpKyspIHsKKwkJaWYoICEgc3VwcG9ydGVkX21peGVyKGNhcmQsaSkpIGNvbnRpbnVlOworCisJCXNldF9taXhlcihjYXJkLGksY2FyZC0+bWl4Lm1peGVyX3N0YXRlW2ldKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWl4ZXJfaW9jdGwoc3RydWN0IGVzc19jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgaSwgdmFsPTA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCVZBTElEQVRFX0NBUkQoY2FyZCk7CisgICAgICAgIGlmIChjbWQgPT0gU09VTkRfTUlYRVJfSU5GTykgeworCQltaXhlcl9pbmZvIGluZm87CisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJc3RybGNweShpbmZvLmlkLCBjYXJkX25hbWVzW2NhcmQtPmNhcmRfdHlwZV0sIHNpemVvZihpbmZvLmlkKSk7CisJCXN0cmxjcHkoaW5mby5uYW1lLCBjYXJkX25hbWVzW2NhcmQtPmNhcmRfdHlwZV0sIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaW5mby5tb2RpZnlfY291bnRlciA9IGNhcmQtPm1peC5tb2RjbnQ7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmluZm8sIHNpemVvZihpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChjbWQgPT0gU09VTkRfT0xEX01JWEVSX0lORk8pIHsKKwkJX29sZF9taXhlcl9pbmZvIGluZm87CisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJc3RybGNweShpbmZvLmlkLCBjYXJkX25hbWVzW2NhcmQtPmNhcmRfdHlwZV0sIHNpemVvZihpbmZvLmlkKSk7CisJCXN0cmxjcHkoaW5mby5uYW1lLCBjYXJkX25hbWVzW2NhcmQtPmNhcmRfdHlwZV0sIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdNJyB8fCBfSU9DX1NJWkUoY21kKSAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgICAgICBpZiAoX0lPQ19ESVIoY21kKSA9PSBfSU9DX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAvKiBnaXZlIHRoZW0gdGhlIGN1cnJlbnQgcmVjb3JkIHNvdXJjZSAqLworCisJCQlpZighY2FyZC0+bWl4LnJlY21hc2tfaW8pIHsKKwkJCQl2YWwgPSAwOworCQkJfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCXZhbCA9IGNhcmQtPm1peC5yZWNtYXNrX2lvKGNhcmQsMSwwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlicmVhazsKKwkJCQorICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzogLyogZ2l2ZSB0aGVtIHRoZSBzdXBwb3J0ZWQgbWl4ZXJzICovCisJCQl2YWwgPSBjYXJkLT5taXguc3VwcG9ydGVkX21peGVyczsKKwkJCWJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgKi8KKwkJCXZhbCA9IGNhcmQtPm1peC5yZWNvcmRfc291cmNlczsKKwkJCWJyZWFrOworCQkJCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOiAvKiBNaXhlciBjaGFubmVscyBzdXBwb3J0aW5nIHN0ZXJlbyAqLworCQkJdmFsID0gY2FyZC0+bWl4LnN0ZXJlb19taXhlcnM7CisJCQlicmVhazsKKwkJCQorICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCXZhbCA9IFNPVU5EX0NBUF9FWENMX0lOUFVUOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDogLyogcmVhZCBhIHNwZWNpZmljIG1peGVyICovCisJCQlpID0gX0lPQ19OUihjbWQpOworCisJCQlpZiAoICEgc3VwcG9ydGVkX21peGVyKGNhcmQsaSkpIAorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQkvKiBkbyB3ZSBldmVyIHdhbnQgdG8gdG91Y2ggdGhlIGhhcmR3YXJlPyAqLworLyogICAgICAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQkJdmFsID0gY2FyZC0+bWl4LnJlYWRfbWl4ZXIoY2FyZCxpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOyovCisKKwkJCXZhbCA9IGNhcmQtPm1peC5taXhlcl9zdGF0ZVtpXTsKKy8qCQkJTV9wcmludGsoInJldHVybmVkIDB4JXggZm9yIG1peGVyICVkXG4iLHZhbCxpKTsqLworCisJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwl9CisJCisgICAgICAgIGlmIChfSU9DX0RJUihjbWQpICE9IChfSU9DX1dSSVRFfF9JT0NfUkVBRCkpCisJCXJldHVybiAtRUlOVkFMOworCQorCWNhcmQtPm1peC5tb2RjbnQrKzsKKworCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlICovCisKKwkJaWYgKCFjYXJkLT5taXgucmVjbWFza19pbykgcmV0dXJuIC1FSU5WQUw7CisJCWlmKCF2YWwpIHJldHVybiAwOworCQlpZighICh2YWwgJj0gY2FyZC0+bWl4LnJlY29yZF9zb3VyY2VzKSkgcmV0dXJuIC1FSU5WQUw7CisKKyAgICAgICAgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJCWNhcmQtPm1peC5yZWNtYXNrX2lvKGNhcmQsMCx2YWwpOworICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCWkgPSBfSU9DX05SKGNtZCk7CisKKwkJaWYgKCAhIHN1cHBvcnRlZF9taXhlcihjYXJkLGkpKSAKKwkJCXJldHVybiAtRUlOVkFMOworCisgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCQlzZXRfbWl4ZXIoY2FyZCxpLHZhbCk7CisgICAgICAgICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJcmV0dXJuIDA7CisJfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK3N0YXRpYyBpbnQgZXNzX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXVuc2lnbmVkIGludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGVzc19jYXJkICpjYXJkID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJc3RydWN0IHBjaV9kcml2ZXIgKmRydnI7CisKKwl3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGRldikpICE9IE5VTEwpIHsKKwkJZHJ2ciA9IHBjaV9kZXZfZHJpdmVyIChwZGV2KTsKKwkJaWYgKGRydnIgPT0gJm1hZXN0cm9fcGNpX2RyaXZlcikgeworCQkJY2FyZCA9IChzdHJ1Y3QgZXNzX2NhcmQqKXBjaV9nZXRfZHJ2ZGF0YSAocGRldik7CisJCQlpZiAoIWNhcmQpCisJCQkJY29udGludWU7CisJCQlpZiAoY2FyZC0+ZGV2X21peGVyID09IG1pbm9yKQorCQkJCWJyZWFrOworCQl9CisJfQorCWlmICghY2FyZCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgZXNzX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlc3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgZXNzX2NhcmQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlWQUxJREFURV9DQVJEKGNhcmQpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzc19pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBlc3NfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgZXNzX2NhcmQgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlWQUxJREFURV9DQVJEKGNhcmQpOworCisJcmV0dXJuIG1peGVyX2lvY3RsKGNhcmQsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGVzc19taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gZXNzX2lvY3RsX21peGRldiwKKwkub3BlbgkJPSBlc3Nfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSBlc3NfcmVsZWFzZV9taXhkZXYsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IGVzc19zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQ7CisJc2lnbmVkIGxvbmcgdG1vOworCisJaWYgKHMtPmRtYV9kYWMubWFwcGVkIHx8ICFzLT5kbWFfZGFjLnJlYWR5KQorCQlyZXR1cm4gMDsKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgICAgICBmb3IgKDs7KSB7CisJCS8qIFhYWCB1aG0uLiBxdWVzdGlvbmFibGUgbG9ja2luZyovCisgICAgICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDw9IDApCisJCQlicmVhazsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgaWYgKG5vbmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisgICAgICAgICAgICAgICAgfQorCQl0bW8gPSAoY291bnQgKiBIWikgLyBzLT5yYXRlZGFjOworCQl0bW8gPj49IHNhbXBsZV9zaGlmdFsocy0+Zm10ID4+IEVTU19EQUNfU0hJRlQpICYgRVNTX0ZNVF9NQVNLXTsKKwkJLyogWFhYIHRoaXMgaXMganVzdCBicm9rZW4uICBzb21lb25lIGlzIHdha2luZyB1cyB1cCBhbG90LCBvciBzY2hlZHVsZV90aW1lb3V0IGlzIGJyb2tlbi4KKwkJCW9yIHNvbWV0aGluZy4gIHdobyBjYXJlcy4gLSB6YWNoICovCisJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyB0bW8gOiAxKSAmJiB0bW8pCisJCQlNX3ByaW50ayhLRVJOX0RFQlVHICJtYWVzdHJvOiBkbWEgdGltZWQgb3V0Pz8gJWxkXG4iLGppZmZpZXMpOworICAgICAgICB9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKyAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgIHJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFphY2ggc2V6OiAiZ29kIHRoaXMgaXMgZ3Jvc3MuLiIgKi8KK3N0YXRpYyBpbnQgCitjb21iX3N0ZXJlbyh1bnNpZ25lZCBjaGFyICpyZWFsX2J1ZmZlcix1bnNpZ25lZCBjaGFyICAqdG1wX2J1ZmZlciwgaW50IG9mZnNldCwgCisJaW50IGNvdW50LCBpbnQgYnVmc2l6ZSkKK3sgIAorCS8qIE5vIHN1Y2ggdGhpbmcgYXMgc3RlcmVvIHJlY29yZGluZywgc28gd2UKKwl1c2UgZHVhbCBpbnB1dCBtaXhlcnMuICB3aGljaCBtZWFucyB3ZSBoYXZlIHRvIAorCWNvbWJpbmUgbW9ubyB0byBzdGVyZW8gYnVmZmVyLiAgeXVjay4gCisKKwlidXQgd2UgZG9uJ3QgaGF2ZSB0byBiZSBhYmxlIHRvIHdvcmsgYSBieXRlIGF0IGEgdGltZS4uKi8KKworCXVuc2lnbmVkIGNoYXIgKnNvLCpsZWZ0LCpyaWdodDsKKwlpbnQgaTsKKworCXNvID0gdG1wX2J1ZmZlcjsKKwlsZWZ0ID0gcmVhbF9idWZmZXIgKyBvZmZzZXQ7CisJcmlnaHQgPSByZWFsX2J1ZmZlciArIGJ1ZnNpemUvMiArIG9mZnNldDsKKworLyoJTV9wcmludGsoImNvbWJfc3RlcmVvIHdyaXRpbmcgJWQgdG8gJXAgZnJvbSAlcCBhbmQgJXAsIG9mZnNldDogJWQgc2l6ZTogJWRcbiIsY291bnQvMiwgdG1wX2J1ZmZlcixsZWZ0LHJpZ2h0LG9mZnNldCxidWZzaXplKTsqLworCisJZm9yKGk9Y291bnQvNDsgaSA7IGktLSkgeworCQkoKihzbysyKSkgPSAqKHJpZ2h0KyspOworCQkoKihzbyszKSkgPSAqKHJpZ2h0KyspOworCQkoKnNvKSA9ICoobGVmdCsrKTsKKwkJKCooc28rMSkpID0gKihsZWZ0KyspOworCQlzbys9NDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogaW4gdGhpcyBsb29wLCBkbWFfYWRjLmNvdW50IHNpZ25pZmllcyB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdHMgd2FpdGluZworCXRvIGJlIGNvcGllZCB0byB0aGUgdXNlcidzIGJ1ZmZlci4gIGl0IGlzIGZpbGxlZCBieSB0aGUgaW50ZXJydXB0CisJaGFuZGxlciBhbmQgZHJhaW5lZCBieSB0aGlzIGxvb3AuICovCitzdGF0aWMgc3NpemVfdCAKK2Vzc19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgZXNzX3N0YXRlICpzID0gKHN0cnVjdCBlc3Nfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCXVuc2lnbmVkIGNoYXIgKmNvbWJidWYgPSBOVUxMOworCQorCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDEpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlpZighKGNvbWJidWYgPSBrbWFsbG9jKGNvdW50LEdGUF9LRVJORUwpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisJcmV0ID0gMDsKKworCWNhbGNfYm9iX3JhdGUocyk7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCS8qIHJlbWVtYmVyLCBhbGwgdGhlc2UgdGhpbmdzIGFyZSBleHByZXNzZWQgaW4gYnl0ZXMgdG8gYmUKKwkJCXNlbnQgdG8gdGhlIHVzZXIuLiBoZW5jZSB0aGUgZXZpbCAvIDIgZG93biBiZWxvdyAqLworCQlzd3B0ciA9IHMtPmRtYV9hZGMuc3dwdHI7CisJCWNudCA9IHMtPmRtYV9hZGMuZG1hc2l6ZS1zd3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMuY291bnQgPCBjbnQpCisJCQljbnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisKKwkJaWYgKCBjbnQgPiAwICkgY250ICY9IH4zOworCisJCWlmIChjbnQgPD0gMCkgeworCQkJc3RhcnRfYWRjKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSAKKwkJCXsKKwkJCQlyZXQgPSByZXQgPyByZXQgOiAtRUFHQUlOOworCQkJCWdvdG8gcmVjX3JldHVybl9mcmVlOworCQkJfQorCQkJaWYgKCFpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnMtPmRtYV9hZGMud2FpdCwgSFopKSB7CisJCQkJaWYoISBzLT5jYXJkLT5pbl9zdXNwZW5kKSBwcmludGsoS0VSTl9ERUJVRyAibWFlc3RybzogcmVhZDogY2hpcCBsb2NrdXA/IGRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKKwkJCQkgICAgICAgcy0+ZG1hX2FkYy5kbWFzaXplLCBzLT5kbWFfYWRjLmZyYWdzaXplLCBzLT5kbWFfYWRjLmNvdW50LCAKKwkJCQkgICAgICAgcy0+ZG1hX2FkYy5od3B0ciwgcy0+ZG1hX2FkYy5zd3B0cik7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlzZXRfZG1hYyhzLCB2aXJ0X3RvX2J1cyhzLT5kbWFfYWRjLnJhd2J1ZiksIHMtPmRtYV9hZGMubnVtZnJhZyA8PCBzLT5kbWFfYWRjLmZyYWdzaGlmdCk7CisJCQkJLyogcHJvZ3JhbSBlbmhhbmNlZCBtb2RlIHJlZ2lzdGVycyAqLworCQkJCS8qIEZJTEwgTUUgKi8KKy8qCQkJCXdyaW5kaXIocywgU1ZfQ0lETUFDQkFTRUNPVU5UMSwgKHMtPmRtYV9hZGMuZnJhZ3NhbXBsZXMtMSkgPj4gOCk7CisJCQkJd3JpbmRpcihzLCBTVl9DSURNQUNCQVNFQ09VTlQwLCBzLT5kbWFfYWRjLmZyYWdzYW1wbGVzLTEpOyAqLworCQkJCXMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLmh3cHRyID0gcy0+ZG1hX2FkYy5zd3B0ciA9IDA7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSAKKwkJCXsKKwkJCQlyZXQgPSByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisJCQkJZ290byByZWNfcmV0dXJuX2ZyZWU7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQorCQlpZihzLT5mbXQgJiAoRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVCkpIHsKKwkJCS8qIHN3cHRyLzIgc28gdGhhdCB3ZSBrbm93IHRoZSByZWFsIG9mZnNldCBpbiBlYWNoIGFwdSdzIGJ1ZmZlciAqLworCQkJY29tYl9zdGVyZW8ocy0+ZG1hX2FkYy5yYXdidWYsY29tYmJ1Zixzd3B0ci8yLGNudCxzLT5kbWFfYWRjLmRtYXNpemUpOworCQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGNvbWJidWYsIGNudCkpIHsKKwkJCQlyZXQgPSByZXQgPyByZXQgOiAtRUZBVUxUOworCQkJCWdvdG8gcmVjX3JldHVybl9mcmVlOworCQkJfQorCQl9IGVsc2UgIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQkJcmV0ID0gcmV0ID8gcmV0IDogLUVGQVVMVDsKKwkJCQlnb3RvIHJlY19yZXR1cm5fZnJlZTsKKwkJCX0KKwkJfQorCisJCXN3cHRyID0gKHN3cHRyICsgY250KSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcy0+ZG1hX2FkYy5zd3B0ciA9IHN3cHRyOworCQlzLT5kbWFfYWRjLmNvdW50IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCXN0YXJ0X2FkYyhzKTsKKwl9CisKK3JlY19yZXR1cm5fZnJlZToKKwlpZihjb21iYnVmKSBrZnJlZShjb21iYnVmKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCAKK2Vzc193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGVzc19zdGF0ZSAqcyA9IChzdHJ1Y3QgZXNzX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKwkKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAwKSkpCisJCXJldHVybiByZXQ7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSAwOworCisJY2FsY19ib2JfcmF0ZShzKTsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA8IDApIHsKKwkJCXMtPmRtYV9kYWMuY291bnQgPSAwOworCQkJcy0+ZG1hX2RhYy5zd3B0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCX0KKwkJc3dwdHIgPSBzLT5kbWFfZGFjLnN3cHRyOworCisJCWNudCA9IHMtPmRtYV9kYWMuZG1hc2l6ZS1zd3B0cjsKKworCQlpZiAocy0+ZG1hX2RhYy5jb3VudCArIGNudCA+IHMtPmRtYV9kYWMuZG1hc2l6ZSkKKwkJCWNudCA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIHMtPmRtYV9kYWMuY291bnQ7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCisJCWlmIChjbnQgPD0gMCkgeworCQkJc3RhcnRfZGFjKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYoIXJldCkgcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIHJldHVybl9mcmVlOworCQkJfQorCQkJaWYgKCFpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnMtPmRtYV9kYWMud2FpdCwgSFopKSB7CisJCQkJaWYoISBzLT5jYXJkLT5pbl9zdXNwZW5kKSBwcmludGsoS0VSTl9ERUJVRyAibWFlc3Rybzogd3JpdGU6IGNoaXAgbG9ja3VwPyBkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCisJCQkJICAgICAgIHMtPmRtYV9kYWMuZG1hc2l6ZSwgcy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcy0+ZG1hX2RhYy5jb3VudCwgCisJCQkJICAgICAgIHMtPmRtYV9kYWMuaHdwdHIsIHMtPmRtYV9kYWMuc3dwdHIpOworCQkJCXN0b3BfZGFjKHMpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJc2V0X2RtYWEocywgdmlydF90b19idXMocy0+ZG1hX2RhYy5yYXdidWYpLCBzLT5kbWFfZGFjLm51bWZyYWcgPDwgcy0+ZG1hX2RhYy5mcmFnc2hpZnQpOworCQkJCS8qIHByb2dyYW0gZW5oYW5jZWQgbW9kZSByZWdpc3RlcnMgKi8KKy8qCQkJCXdyaW5kaXIocywgU1ZfQ0lETUFBQkFTRUNPVU5UMSwgKHMtPmRtYV9kYWMuZnJhZ3NhbXBsZXMtMSkgPj4gOCk7CisJCQkJd3JpbmRpcihzLCBTVl9DSURNQUFCQVNFQ09VTlQwLCBzLT5kbWFfZGFjLmZyYWdzYW1wbGVzLTEpOyAqLworCQkJCS8qIEZJTEwgTUUgKi8KKwkJCQlzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy5od3B0ciA9IHMtPmRtYV9kYWMuc3dwdHIgPSAwOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KSByZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byByZXR1cm5fZnJlZTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X2Zyb21fdXNlcihzLT5kbWFfZGFjLnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KSByZXQgPSAtRUZBVUxUOworCQkJZ290byByZXR1cm5fZnJlZTsKKwkJfQorLyoJCXByaW50aygid3JvdGUgJWQgYnl0ZXMgYXQgc3c6ICVkIGNudDogJWQgd2hpbGUgaHc6ICVkXG4iLGNudCwgc3dwdHIsIHMtPmRtYV9kYWMuY291bnQsIHMtPmRtYV9kYWMuaHdwdHIpOyovCisKKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYy5kbWFzaXplOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmRtYV9kYWMuc3dwdHIgPSBzd3B0cjsKKwkJcy0+ZG1hX2RhYy5jb3VudCArPSBjbnQ7CisJCXMtPmRtYV9kYWMuZW5kY2xlYXJlZCA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzdGFydF9kYWMocyk7CisJfQorcmV0dXJuX2ZyZWU6CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXNzX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgZXNzX3N0YXRlICpzID0gKHN0cnVjdCBlc3Nfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlWQUxJREFURV9TVEFURShzKTsKKworLyogSW4gMC4xNCBwcm9nX2RtYWJ1ZiBhbHdheXMgcmV0dXJucyBzdWNjZXNzIGFueXdheSAuLi4gKi8KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmIHByb2dfZG1hYnVmKHMsIDApKSAKKwkJCXJldHVybiAwOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCSAgCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1ZihzLCAxKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfZGFjLndhaXQsIHdhaXQpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwllc3NfdXBkYXRlX3B0cihzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2lnbmVkKXMtPmRtYV9kYWMuZG1hc2l6ZSA+PSBzLT5kbWFfZGFjLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IGVzc19tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgZXNzX3N0YXRlICpzID0gKHN0cnVjdCBlc3Nfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYWJ1ZiAqZGI7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWYocywgMSkpICE9IDApCisJCQlnb3RvIG91dDsKKwkJZGIgPSAmcy0+ZG1hX2RhYzsKKwl9IGVsc2UgCisjaWYgMAorCS8qIGlmIHdlIGNhbiBoYXZlIHRoZSB3cC93YyBkbyB0aGUgY29tYmluaW5nCisJCXdlIGNhbiB0dXJuIHRoaXMgYmFjayBvbi4gICovCisJICAgICAgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWYocywgMCkpICE9IDApCisJCQlnb3RvIG91dDsKKwkJZGIgPSAmcy0+ZG1hX2FkYzsKKwl9IGVsc2UgIAorI2VuZGlmCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkKKwkJZ290byBvdXQ7CisJcmV0ID0gLUVBR0FJTjsKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCXZpcnRfdG9fcGh5cyhkYi0+cmF3YnVmKSA+PiBQQUdFX1NISUZULAorCQkJc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlnb3RvIG91dDsKKwlkYi0+bWFwcGVkID0gMTsKKwlyZXQgPSAwOworb3V0OgorCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGVzc19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGVzc19zdGF0ZSAqcyA9IChzdHJ1Y3QgZXNzX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKyAgICAgICAgY291bnRfaW5mbyBjaW5mbzsKKwlpbnQgdmFsLCBtYXBwZWQsIHJldDsKKwl1bnNpZ25lZCBjaGFyIGZtdG0sIGZtdGQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKy8qCXByaW50aygibWFlc3RybzogZXNzX2lvY3RsOiBjbWQgJWRcbiIsIGNtZCk7Ki8KKwkKKwlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAgbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYy5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJLyogWFhYIGZpeCAqLworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5jYXJkLT5wY2lkZXYtPmlycSk7CisJCQlzLT5kbWFfZGFjLnN3cHRyID0gcy0+ZG1hX2RhYy5od3B0ciA9IHMtPmRtYV9kYWMuY291bnQgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+Y2FyZC0+cGNpZGV2LT5pcnEpOworCQkJcy0+ZG1hX2FkYy5zd3B0ciA9IHMtPmRtYV9hZGMuaHdwdHIgPSBzLT5kbWFfYWRjLmNvdW50ID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyA9IDA7CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPj0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCQlzZXRfYWRjX3JhdGUocywgdmFsKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCXNldF9kYWNfcmF0ZShzLCB2YWwpOworCQkJfQorCQl9CisJCXJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBzLT5yYXRlYWRjIDogcy0+cmF0ZWRhYywgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlmbXRkID0gMDsKKwkJZm10bSA9IH4wOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMocyk7CisJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkJCWlmICh2YWwpCisJCQkJZm10ZCB8PSBFU1NfRk1UX1NURVJFTyA8PCBFU1NfQURDX1NISUZUOworCQkJZWxzZQorCQkJCWZtdG0gJj0gfihFU1NfRk1UX1NURVJFTyA8PCBFU1NfQURDX1NISUZUKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQlpZiAodmFsKQorCQkJCWZtdGQgfD0gRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0RBQ19TSElGVDsKKwkJCWVsc2UKKwkJCQlmbXRtICY9IH4oRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0RBQ19TSElGVCk7CisJCX0KKwkJc2V0X2ZtdChzLCBmbXRtLCBmbXRkKTsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMCkgeworCQkJZm10ZCA9IDA7CisJCQlmbXRtID0gfjA7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJZm10ZCB8PSBFU1NfRk1UX1NURVJFTyA8PCBFU1NfQURDX1NISUZUOworCQkJCWVsc2UKKwkJCQkJZm10bSAmPSB+KEVTU19GTVRfU1RFUkVPIDw8IEVTU19BRENfU0hJRlQpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMocyk7CisJCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlmbXRkIHw9IEVTU19GTVRfU1RFUkVPIDw8IEVTU19EQUNfU0hJRlQ7CisJCQkJZWxzZQorCQkJCQlmbXRtICY9IH4oRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0RBQ19TSElGVCk7CisJCQl9CisJCQlzZXRfZm10KHMsIGZtdG0sIGZtdGQpOworCQl9CisJCXJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChFU1NfRk1UX1NURVJFTyA8PCBFU1NfQURDX1NISUZUKSAKKwkJCQkJICAgOiAoRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0RBQ19TSElGVCkpKSA/IDIgOiAxLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrICovCisgICAgICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyKEFGTVRfVTh8QUZNVF9TMTZfTEUsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3RzIE9ORSBmbXQqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWZtdGQgPSAwOworCQkJZm10bSA9IH4wOworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKwkvKiBmaXhlZCBhdCAxNmJpdCBmb3Igbm93ICovCisJCQkJZm10ZCB8PSBFU1NfRk1UXzE2QklUIDw8IEVTU19BRENfU0hJRlQ7CisjaWYgMAorCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCWZtdGQgfD0gRVNTX0ZNVF8xNkJJVCA8PCBFU1NfQURDX1NISUZUOworCQkJCWVsc2UKKwkJCQkJZm10bSAmPSB+KEVTU19GTVRfMTZCSVQgPDwgRVNTX0FEQ19TSElGVCk7CisjZW5kaWYKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCWZtdGQgfD0gRVNTX0ZNVF8xNkJJVCA8PCBFU1NfREFDX1NISUZUOworCQkJCWVsc2UKKwkJCQkJZm10bSAmPSB+KEVTU19GTVRfMTZCSVQgPDwgRVNTX0RBQ19TSElGVCk7CisJCQl9CisJCQlzZXRfZm10KHMsIGZtdG0sIGZtdGQpOworCQl9CisgCQlyZXR1cm4gcHV0X3VzZXIoKHMtPmZtdCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyAKKwkJCShFU1NfRk1UXzE2QklUIDw8IEVTU19BRENfU0hJRlQpIAorCQkJOiAoRVNTX0ZNVF8xNkJJVCA8PCBFU1NfREFDX1NISUZUKSkpID8gCisJCQkJQUZNVF9TMTZfTEUgOiAKKwkJCQlBRk1UX1U4LCAKKwkJCXApOworCQkKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAmJiAocy0+ZW5hYmxlICYgQURDX1JVTk5JTkcpKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIChzLT5lbmFibGUgJiBEQUNfUlVOTklORykpIAorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gIHByb2dfZG1hYnVmKHMsIDEpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzdGFydF9hZGMocyk7CisJCQl9IGVsc2UKKwkJCQlzdG9wX2FkYyhzKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgeworCQkJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMCkpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCX0gZWxzZQorCQkJCXN0b3BfZGFjKHMpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMCkpKQorCQkJcmV0dXJuIHJldDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXNzX3VwZGF0ZV9wdHIocyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy5kbWFzaXplIC0gcy0+ZG1hX2RhYy5jb3VudDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMubnVtZnJhZzsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OyAgICAgIAorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9ICBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCQlyZXR1cm4gcmV0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllc3NfdXBkYXRlX3B0cihzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2FkYy5mcmFnc2l6ZTsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLmNvdW50OworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7ICAgICAgCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKyAgICAgICAgICAgICAgICBmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMCkpKQorCQkJcmV0dXJuIHJldDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXNzX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgdmFsID0gcy0+ZG1hX2RhYy5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSAgcHJvZ19kbWFidWYocywgMSkpKQorCQkJcmV0dXJuIHJldDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZXNzX3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY2luZm8uYnl0ZXMgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IHMtPmRtYV9hZGMuY291bnQgPj4gcy0+ZG1hX2FkYy5mcmFnc2hpZnQ7CisgICAgICAgICAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0cjsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorCQkJcy0+ZG1hX2FkYy5jb3VudCAmPSBzLT5kbWFfYWRjLmZyYWdzaXplLTE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAwKSkpCisJCQlyZXR1cm4gcmV0OworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQllc3NfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMudG90YWxfYnl0ZXM7CisgICAgICAgICAgICAgICAgY2luZm8uYmxvY2tzID0gcy0+ZG1hX2RhYy5jb3VudCA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsKKyAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSBzLT5kbWFfZGFjLmh3cHRyOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCQlzLT5kbWFfZGFjLmNvdW50ICY9IHMtPmRtYV9kYWMuZnJhZ3NpemUtMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAwKSkpCisJCQkJcmV0dXJuIHZhbDsKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfZGFjLmZyYWdzaXplLCBwKTsKKwkJfQorCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHMsIDEpKSkKKwkJCXJldHVybiB2YWw7CisJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLmZyYWdzaXplLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJTV9wcmludGsoIm1hZXN0cm86IFNFVEZSQUdNRU5UOiAlMHhcbiIsdmFsKTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSA0OworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCQlzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gNDsKKwkJCWlmIChzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA+IDE1KQorCQkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gMTU7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA8IDQpCisJCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9IDQ7CisJCX0KKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24pIHx8CisJCSAgICAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gdmFsOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gdmFsOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBzLT5yYXRlYWRjIDogcy0+cmF0ZWRhYywgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKEVTU19GTVRfU1RFUkVPIDw8IEVTU19BRENfU0hJRlQpIAorCQkJCQkgICA6IChFU1NfRk1UX1NURVJFTyA8PCBFU1NfREFDX1NISUZUKSkpID8gMiA6IDEsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKEVTU19GTVRfMTZCSVQgPDwgRVNTX0FEQ19TSElGVCkgCisJCQkJCSAgIDogKEVTU19GTVRfMTZCSVQgPDwgRVNTX0RBQ19TSElGVCkpKSA/IDE2IDogOCwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VUU1lOQ1JPOgorICAgICAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKwkJCisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdm9pZAorc2V0X2Jhc2VfcmVnaXN0ZXJzKHN0cnVjdCBlc3Nfc3RhdGUgKnMsdm9pZCAqdmFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBwYWNrZWRfcGh5cyA9IHZpcnRfdG9fYnVzKHZhZGRyKT4+MTI7CisJd2F2ZV9zZXRfcmVnaXN0ZXIocywgMHgwMUZDICwgcGFja2VkX3BoeXMpOworCXdhdmVfc2V0X3JlZ2lzdGVyKHMsIDB4MDFGRCAsIHBhY2tlZF9waHlzKTsKKwl3YXZlX3NldF9yZWdpc3RlcihzLCAweDAxRkUgLCBwYWNrZWRfcGh5cyk7CisJd2F2ZV9zZXRfcmVnaXN0ZXIocywgMHgwMUZGICwgcGFja2VkX3BoeXMpOworfQorCisvKiAKKyAqIHRoaXMgZ3V5IG1ha2VzIHN1cmUgd2UncmUgaW4gdGhlIHJpZ2h0IHBvd2VyCisgKiBzdGF0ZSBmb3Igd2hhdCB3ZSB3YW50IHRvIGJlIGRvaW5nIAorICovCitzdGF0aWMgdm9pZCBtYWVzdHJvX3Bvd2VyKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgaW50IHRvc3RhdGUpCit7CisJdTE2IGFjdGl2ZV9tYXNrID0gYWNwaV9zdGF0ZV9tYXNrW3Rvc3RhdGVdOworCXU4IHN0YXRlOworCisJaWYoIXVzZV9wbSkgcmV0dXJuOworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUoY2FyZC0+cGNpZGV2LCBjYXJkLT5wb3dlcl9yZWdzKzB4NCwgJnN0YXRlKTsKKwlzdGF0ZSY9MzsKKworCS8qIG1ha2Ugc3VyZSB3ZSdyZSBpbiB0aGUgcmlnaHQgc3RhdGUgKi8KKwlpZihzdGF0ZSAhPSB0b3N0YXRlKSB7CisJCU1fcHJpbnRrKEtFUk5fV0FSTklORyAibWFlc3RybzogZGV2ICUwMng6JTAyeC4leCBzd2l0Y2hpbmcgZnJvbSBEJWQgdG8gRCVkXG4iLAorCQkJY2FyZC0+cGNpZGV2LT5idXMtPm51bWJlciwgCisJCQlQQ0lfU0xPVChjYXJkLT5wY2lkZXYtPmRldmZuKSwKKwkJCVBDSV9GVU5DKGNhcmQtPnBjaWRldi0+ZGV2Zm4pLAorCQkJc3RhdGUsdG9zdGF0ZSk7CisJCXBjaV93cml0ZV9jb25maWdfYnl0ZShjYXJkLT5wY2lkZXYsIGNhcmQtPnBvd2VyX3JlZ3MrMHg0LCB0b3N0YXRlKTsKKwl9CisKKwkvKiBhbmQgbWFrZSBzdXJlIHRoZSB1bml0cyB3ZSBjYXJlIGFib3V0IGFyZSBvbiAKKwkJWFhYIHdlIG1pZ2h0IHdhbnQgdG8gZG8gdGhpcyBiZWZvcmUgc3RhdGUgZmxpcHBpbmc/ICovCisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNhcmQtPnBjaWRldiwgMHg1NCwgfiBhY3RpdmVfbWFzayk7CisJcGNpX3dyaXRlX2NvbmZpZ193b3JkKGNhcmQtPnBjaWRldiwgMHg1NiwgfiBhY3RpdmVfbWFzayk7Cit9CisKKy8qIHdlIGFsbG9jYXRlIGEgbGFyZ2UgcG93ZXIgb2YgdHdvIGZvciBhbGwgb3VyIG1lbW9yeS4KKwl0aGlzIGlzIGN1dCB1cCBpbnRvIChub3QgdG8gc2NhbGUgOik6CisJfHNpbGx5IGZpZm8gd29yZAl8IDUxMmJ5dGUgbWl4YnVmIHBlciBhZGMJfCBkYWMvYWRjICogY2hhbm5lbHMgfAorKi8KK3N0YXRpYyBpbnQKK2FsbG9jYXRlX2J1ZmZlcnMoc3RydWN0IGVzc19zdGF0ZSAqcykKK3sKKwl2b2lkICpyYXdidWY9TlVMTDsKKwlpbnQgb3JkZXIsaTsKKwlzdHJ1Y3QgcGFnZSAqcGFnZSwgKnBlbmQ7CisKKwkvKiBhbGxvYyBhcyBiaWcgYSBjaHVuayBhcyB3ZSBjYW4gKi8KKwlmb3IgKG9yZGVyID0gKGRzcHNfb3JkZXIgKyAoMTYtUEFHRV9TSElGVCkgKyAxKTsgb3JkZXIgPj0gKGRzcHNfb3JkZXIgKyAyICsgMSk7IG9yZGVyLS0pCisJCWlmKChyYXdidWYgPSAodm9pZCAqKV9fZ2V0X2ZyZWVfcGFnZXMoR0ZQX0tFUk5FTHxHRlBfRE1BLCBvcmRlcikpKQorCQkJYnJlYWs7CisKKwlpZiAoIXJhd2J1ZikKKwkJcmV0dXJuIDE7CisKKwlNX3ByaW50aygibWFlc3RybzogYWxsb2NhdGVkICVsZCAoJWQpIGJ5dGVzIGF0ICVwXG4iLFBBR0VfU0laRTw8b3JkZXIsb3JkZXIsIHJhd2J1Zik7CisKKwlpZiAoKHZpcnRfdG9fYnVzKHJhd2J1ZikgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpICYgfigoMTw8MjgpLTEpKSAgeworCQlwcmludGsoS0VSTl9FUlIgIm1hZXN0cm86IERNQSBidWZmZXIgYmV5b25kIDI1Nk1CISBidXNhZGRyIDB4JWx4ICBzaXplICVsZFxuIiwKKwkJCXZpcnRfdG9fYnVzKHJhd2J1ZiksIFBBR0VfU0laRSA8PCBvcmRlcik7CisJCWtmcmVlKHJhd2J1Zik7CisJCXJldHVybiAxOworCX0KKworCXMtPmNhcmQtPmRtYXBhZ2VzID0gcmF3YnVmOworCXMtPmNhcmQtPmRtYW9yZGVyID0gb3JkZXI7CisKKwlmb3IoaT0wO2k8TlJfRFNQUztpKyspIHsKKwkJc3RydWN0IGVzc19zdGF0ZSAqZXNzID0gJnMtPmNhcmQtPmNoYW5uZWxzW2ldOworCisJCWlmKGVzcy0+ZGV2X2F1ZGlvID09IC0xKQorCQkJY29udGludWU7CisKKwkJZXNzLT5kbWFfZGFjLnJlYWR5ID0gcy0+ZG1hX2RhYy5tYXBwZWQgPSAwOworCQllc3MtPmRtYV9hZGMucmVhZHkgPSBzLT5kbWFfYWRjLm1hcHBlZCA9IDA7CisJCWVzcy0+ZG1hX2FkYy5idWZvcmRlciA9IGVzcy0+ZG1hX2RhYy5idWZvcmRlciA9IG9yZGVyIC0gMSAtIGRzcHNfb3JkZXIgLSAxOworCisJCS8qIG9mZnNldCBkYWMgYW5kIGFkYyBidWZmZXJzIHN0YXJ0aW5nIGhhbGYgd2F5IHRocm91Z2ggYW5kIHRoZW4gYXQgZWFjaCBbZGFdW2FkXWMncworCQkJb3JkZXIncyBpbnRlcnZhbHMuLiAqLworCQllc3MtPmRtYV9kYWMucmF3YnVmID0gcmF3YnVmICsgKFBBR0VfU0laRTw8KG9yZGVyLTEpKSArIChpICogKCBQQUdFX1NJWkUgPDwgKGVzcy0+ZG1hX2RhYy5idWZvcmRlciArIDEgKSkpOworCQllc3MtPmRtYV9hZGMucmF3YnVmID0gZXNzLT5kbWFfZGFjLnJhd2J1ZiArICggUEFHRV9TSVpFIDw8IGVzcy0+ZG1hX2RhYy5idWZvcmRlcik7CisJCS8qIG9mZnNldCBtaXhidWYgYnkgYSBtaXhidWYgc28gdGhhdCB0aGUgbGFtZSBzdGF0dXMgZmlmbyBjYW4KKwkJCWhhcHBpbHkgc2NyaWJibGUgYXdheS4uICovIAorCQllc3MtPm1peGJ1ZiA9IHJhd2J1ZiArICg1MTIgKiAoaSsxKSk7CisKKwkJTV9wcmludGsoIm1hZXN0cm86IHNldHVwIGFwdSAlZDogZGFjOiAlcCBhZGM6ICVwIG1peDogJXBcbiIsaSxlc3MtPmRtYV9kYWMucmF3YnVmLAorCQkJZXNzLT5kbWFfYWRjLnJhd2J1ZiwgZXNzLT5taXhidWYpOworCisJfQorCisJLyogbm93IG1hcmsgdGhlIHBhZ2VzIGFzIHJlc2VydmVkOyBvdGhlcndpc2UgcmVtYXBfcGZuX3JhbmdlIGRvZXNuJ3QgZG8gd2hhdCB3ZSB3YW50ICovCisJcGVuZCA9IHZpcnRfdG9fcGFnZShyYXdidWYgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpOworCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShyYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCisJcmV0dXJuIDA7Cit9IAorc3RhdGljIHZvaWQKK2ZyZWVfYnVmZmVycyhzdHJ1Y3QgZXNzX3N0YXRlICpzKQoreworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCXMtPmRtYV9kYWMucmF3YnVmID0gcy0+ZG1hX2FkYy5yYXdidWYgPSBOVUxMOworCXMtPmRtYV9kYWMubWFwcGVkID0gcy0+ZG1hX2FkYy5tYXBwZWQgPSAwOworCXMtPmRtYV9kYWMucmVhZHkgPSBzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKworCU1fcHJpbnRrKCJtYWVzdHJvOiBmcmVlaW5nICVwXG4iLHMtPmNhcmQtPmRtYXBhZ2VzKTsKKwkvKiB1bmRvIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkICovCisKKwlwZW5kID0gdmlydF90b19wYWdlKHMtPmNhcmQtPmRtYXBhZ2VzICsgKFBBR0VfU0laRSA8PCBzLT5jYXJkLT5kbWFvcmRlcikgLSAxKTsKKwlmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2Uocy0+Y2FyZC0+ZG1hcGFnZXMpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKXMtPmNhcmQtPmRtYXBhZ2VzLHMtPmNhcmQtPmRtYW9yZGVyKTsKKwlzLT5jYXJkLT5kbWFwYWdlcyA9IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgCitlc3Nfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwl1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBlc3Nfc3RhdGUgKnMgPSBOVUxMOworCXVuc2lnbmVkIGNoYXIgZm10bSA9IH4wLCBmbXRzID0gMDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJLyoKKwkgKglTY2FuIHRoZSBjYXJkcyBhbmQgZmluZCB0aGUgY2hhbm5lbC4gV2Ugb25seQorCSAqCWRvIHRoaXMgYXQgb3BlbiB0aW1lIHNvIGl0IGlzIG9rCisJICovCisKKwl3aGlsZSAoKHBkZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcGRldikpICE9IE5VTEwpIHsKKwkJc3RydWN0IGVzc19jYXJkICpjOworCQlzdHJ1Y3QgcGNpX2RyaXZlciAqZHJ2cjsKKworCQlkcnZyID0gcGNpX2Rldl9kcml2ZXIgKHBkZXYpOworCQlpZiAoZHJ2ciA9PSAmbWFlc3Ryb19wY2lfZHJpdmVyKSB7CisJCQlpbnQgaTsKKwkJCXN0cnVjdCBlc3Nfc3RhdGUgKnNwOworCisJCQljID0gKHN0cnVjdCBlc3NfY2FyZCopcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwkJCWlmICghYykKKwkJCQljb250aW51ZTsKKwkJCWZvcihpPTA7aTxOUl9EU1BTO2krKykKKwkJCXsKKwkJCQlzcD0mYy0+Y2hhbm5lbHNbaV07CisJCQkJaWYoc3AtPmRldl9hdWRpbyA8IDApCisJCQkJCWNvbnRpbnVlOworCQkJCWlmKChzcC0+ZGV2X2F1ZGlvIF4gbWlub3IpICYgfjB4ZikKKwkJCQkJY29udGludWU7CisJCQkJcz1zcDsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIXMpCisJCXJldHVybiAtRU5PREVWOworCisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBmaWxlLT5mX21vZGUpIHsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FV09VTERCTE9DSzsKKwkJfQorCQl1cCgmcy0+b3Blbl9zZW0pOworCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5vcGVuX3dhaXQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCisJLyogdW5kZXIgc2VtYXBob3JlLi4gKi8KKwlpZiAoKHMtPmNhcmQtPmRtYXBhZ2VzPT1OVUxMKSAmJiBhbGxvY2F0ZV9idWZmZXJzKHMpKSB7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIHdlJ3JlIGNvdmVyZWQgYnkgdGhlIG9wZW5fc2VtICovCisJaWYoICEgcy0+Y2FyZC0+ZHNwc19vcGVuICkgIHsKKwkJbWFlc3Ryb19wb3dlcihzLT5jYXJkLEFDUElfRDApOworCQlzdGFydF9ib2Iocyk7CisJfQorCXMtPmNhcmQtPmRzcHNfb3BlbisrOworCU1fcHJpbnRrKCJtYWVzdHJvOiBvcGVuLCAlZCBib2JzIG5vd1xuIixzLT5jYXJkLT5kc3BzX29wZW4pOworCisJLyogb2ssIGxldHMgd3JpdGUgV0MgYmFzZSByZWdzIG5vdyB0aGF0IHdlJ3ZlIAorCQlwb3dlcmVkIHVwIHRoZSBjaGlwICovCisJTV9wcmludGsoIm1hZXN0cm86IHdyaXRpbmcgMHglbHggKGJ1cyAweCVseCkgdG8gdGhlIHdwXG4iLHZpcnRfdG9fYnVzKHMtPmNhcmQtPmRtYXBhZ2VzKSwKKwkJKCh2aXJ0X3RvX2J1cyhzLT5jYXJkLT5kbWFwYWdlcykpJjB4RkZFMDAwMDApPj4xMik7CisJc2V0X2Jhc2VfcmVnaXN0ZXJzKHMscy0+Y2FyZC0+ZG1hcGFnZXMpOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKy8qCisJCWZtdG0gJj0gfigoRVNTX0ZNVF9TVEVSRU8gfCBFU1NfRk1UXzE2QklUKSA8PCBFU1NfQURDX1NISUZUKTsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCWZtdHMgfD0gRVNTX0ZNVF8xNkJJVCA8PCBFU1NfQURDX1NISUZUOyAqLworCisJCWZtdG0gJj0gfigoRVNTX0ZNVF9TVEVSRU98RVNTX0ZNVF8xNkJJVCkgPDwgRVNTX0FEQ19TSElGVCk7CisJCWZtdHMgPSAoRVNTX0ZNVF9TVEVSRU98RVNTX0ZNVF8xNkJJVCkgPDwgRVNTX0FEQ19TSElGVDsKKworCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gMDsKKwkJc2V0X2FkY19yYXRlKHMsIDgwMDApOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJZm10bSAmPSB+KChFU1NfRk1UX1NURVJFTyB8IEVTU19GTVRfMTZCSVQpIDw8IEVTU19EQUNfU0hJRlQpOworCQlpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KQorCQkJZm10cyB8PSBFU1NfRk1UXzE2QklUIDw8IEVTU19EQUNfU0hJRlQ7CisKKwkJcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IDA7CisJCXNldF9kYWNfcmF0ZShzLCA4MDAwKTsKKwl9CisJc2V0X2ZtdChzLCBmbXRtLCBmbXRzKTsKKwlzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCAKK2Vzc19yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBlc3Nfc3RhdGUgKnMgPSAoc3RydWN0IGVzc19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RvcF9kYWMocyk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0b3BfYWRjKHMpOworCX0KKwkJCisJcy0+b3Blbl9tb2RlICY9ICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKTsKKwkvKiB3ZSdyZSBjb3ZlcmVkIGJ5IHRoZSBvcGVuX3NlbSAqLworCU1fcHJpbnRrKCJtYWVzdHJvOiAlZCBkc3BzIG5vdyBhbGl2ZVxuIixzLT5jYXJkLT5kc3BzX29wZW4tMSk7CisJaWYoIC0tcy0+Y2FyZC0+ZHNwc19vcGVuIDw9IDApIHsKKwkJcy0+Y2FyZC0+ZHNwc19vcGVuID0gMDsKKwkJc3RvcF9ib2Iocyk7CisJCWZyZWVfYnVmZmVycyhzKTsKKwkJbWFlc3Ryb19wb3dlcihzLT5jYXJkLEFDUElfRDIpOworCX0KKwl1cCgmcy0+b3Blbl9zZW0pOworCXdha2VfdXAoJnMtPm9wZW5fd2FpdCk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBlc3NfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gZXNzX3JlYWQsCisJLndyaXRlCQk9IGVzc193cml0ZSwKKwkucG9sbAkJPSBlc3NfcG9sbCwKKwkuaW9jdGwJCT0gZXNzX2lvY3RsLAorCS5tbWFwCQk9IGVzc19tbWFwLAorCS5vcGVuCQk9IGVzc19vcGVuLAorCS5yZWxlYXNlCT0gZXNzX3JlbGVhc2UsCit9OworCitzdGF0aWMgaW50CittYWVzdHJvX2NvbmZpZyhzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQpIAoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lkZXYgPSBjYXJkLT5wY2lkZXY7CisJc3RydWN0IGVzc19zdGF0ZSAqZXNzID0gJmNhcmQtPmNoYW5uZWxzWzBdOworCWludCBhcHUsaW9iYXNlICA9IGNhcmQtPmlvYmFzZTsKKwl1MTYgdzsKKwl1MzIgbjsKKworCS8qIFdlIHVzZWQgdG8gbXVjayBhcm91bmQgd2l0aCBwY2kgY29uZmlnIHNwYWNlIHRoYXQKKwkgKiB3ZSBoYWQgbm8gYnVzaW5lc3MgbWVzc2luZyB3aXRoLiAgV2UgZG9uJ3Qga25vdyBlbm91Z2gKKwkgKiBhYm91dCB0aGUgbWFjaGluZSB0byBrbm93IHdoaWNoIERNQSBtb2RlIGlzIGFwcHJvcHJpYXRlLCAKKwkgKiBldGMuICBXZSB3ZXJlIGd1ZXNzaW5nIHdyb25nIG9uIHNvbWUgbWFjaGluZXMgYW5kIG1ha2luZworCSAqIHRoZW0gdW5oYXBweS4gIFdlIG5vdyB0cnVzdCBpbiB0aGUgQklPUyB0byBkbyB0aGluZ3MgcmlnaHQsCisJICogd2hpY2ggYWxtb3N0IGNlcnRhaW5seSBtZWFucyBhIG5ldyBob3N0IG9mIHByb2JsZW1zIHdpbGwKKwkgKiBhcmlzZSB3aXRoIGJyb2tlbiBCSU9TIGltcGxlbWVudGF0aW9ucy4gIHNjcmV3ICdlbS4gCisJICogV2UncmUgYWxyZWFkeSBpbnRvbGVyYW50IG9mIG1hY2hpbmVzIHRoYXQgZG9uJ3QgYXNzaWduCisJICogSVJRcy4KKwkgKi8KKwkKKwkvKiBkbyBjb25maWcgd29yayBhdCBmdWxsIHBvd2VyICovCisJbWFlc3Ryb19wb3dlcihjYXJkLEFDUElfRDApOworCSAKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2lkZXYsIDB4NTAsICZ3KTsKKworCXcmPX4oMTw8NSk7CQkJLyogRG9uJ3Qgc3dhcCBsZWZ0L3JpZ2h0ICh1bmRvYykqLworCQorCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIDB4NTAsIHcpOworCQorCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaWRldiwgMHg1MiwgJncpOworCXcmPX4oMTw8MTUpOwkJLyogVHVybiBvZmYgaW50ZXJuYWwgY2xvY2sgbXVsdGlwbGllciAqLworCS8qIFhYWCBob3cgZG8gd2Uga25vdyB3aGljaCB0byB1c2U/ICovCisJdyY9figxPDwxNCk7CQkvKiBFeHRlcm5hbCBjbG9jayAqLworCQorCXd8PSAoMTw8Nyk7CQkvKiBIYXJkd2FyZSB2b2x1bWUgY29udHJvbCBvbiAqLworCXd8PSAoMTw8Nik7CQkvKiBEZWJvdW5jZSBvZmY6IGVhc2llciB0byBwdXNoIHRoZSBIV1YgYnV0dG9ucy4gKi8KKwl3Jj1+KDE8PDUpOwkJLyogR1BJTyA0OjUgKi8KKwl3fD0gKDE8PDQpOyAgICAgICAgICAgICAvKiBEaXNjb25uZWN0IGZyb20gdGhlIENISS4gIEVuYWJsaW5nIHRoaXMgbWFkZSBhIGRlbGwgNzUwMCB3b3JrLiAqLworCXcmPX4oMTw8Mik7CQkvKiBNSURJIGZpeCBvZmYgKHVuZG9jKSAqLworCXcmPX4oMTw8MSk7CQkvKiByZXNlcnZlZCwgYWx3YXlzIHdyaXRlIDAgKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpZGV2LCAweDUyLCB3KTsKKwkKKwkvKgorCSAqCUxlZ2FjeSBtb2RlCisJICovCisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2lkZXYsIDB4NDAsICZ3KTsKKwl3fD0oMTw8MTUpOwkvKiBsZWdhY3kgZGVjb2RlIG9mZiAqLworCXcmPX4oMTw8MTQpOwkvKiBEaXNhYmxlIFNJUlEgKi8KKwl3Jj1+KDB4MWYpOwkvKiBkaXNhYmxlIG1wdSBpcnEvaW8sIGdhbWUgcG9ydCwgZm0sIFNCICovCisJIAorCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIDB4NDAsIHcpOworCisJLyogU2V0IHVwIDk3OCBkb2NraW5nIGNvbnRyb2wgY2hpcC4gKi8KKwlwY2lfcmVhZF9jb25maWdfd29yZChwY2lkZXYsIDB4NTgsICZ3KTsKKwl3fD0xPDwyOwkvKiBFbmFibGUgOTc4LiAqLworCXd8PTE8PDM7CS8qIFR1cm4gb24gOTc4IGhhcmR3YXJlIHZvbHVtZSBjb250cm9sLiAqLworCXcmPX4oMTw8MTEpOwkvKiBUdXJuIG9uIDk3OCBtaXhlciB2b2x1bWUgY29udHJvbC4gKi8KKwlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGNpZGV2LCAweDU4LCB3KTsKKwkKKwlzb3VuZF9yZXNldChpb2Jhc2UpOworCisJLyoKKwkgKglSaW5nIEJ1cyBTZXR1cAorCSAqLworCisJLyogc2V0dXAgdXN1YWwgMHgzNCBzdHVmZi4uIDB4MzYgbWF5IGJlIGNoaXAgc3BlY2lmaWMgKi8KKyAgICAgICAgb3V0dygweEMwOTAsIGlvYmFzZSsweDM0KTsgLyogZGlyZWN0IHNvdW5kLCBzdGVyZW8gKi8KKyAgICAgICAgdWRlbGF5KDIwKTsKKyAgICAgICAgb3V0dygweDMwMDAsIGlvYmFzZSsweDM2KTsgLyogZGlyZWN0IHNvdW5kLCBzdGVyZW8gKi8KKyAgICAgICAgdWRlbGF5KDIwKTsKKworCisJLyoKKwkgKglSZXNldCB0aGUgQ09ERUMKKwkgKi8KKwkgCisJbWFlc3Ryb19hYzk3X3Jlc2V0KGlvYmFzZSxwY2lkZXYpOworCQorCS8qCisJICoJUmluZyBCdXMgU2V0dXAKKwkgKi8KKwkgCSAKKwluPWlubChpb2Jhc2UrMHgzNCk7CisJbiY9fjB4RjAwMDsKKwlufD0xMjw8MTI7CQkvKiBEaXJlY3QgU291bmQsIFN0ZXJlbyAqLworCW91dGwobiwgaW9iYXNlKzB4MzQpOworCisJbj1pbmwoaW9iYXNlKzB4MzQpOworCW4mPX4weDBGMDA7CQkvKiBNb2RlbSBvZmYgKi8KKwlvdXRsKG4sIGlvYmFzZSsweDM0KTsKKworCW49aW5sKGlvYmFzZSsweDM0KTsKKwluJj1+MHgwMEYwOworCW58PTk8PDQ7CQkvKiBEQUMsIFN0ZXJlbyAqLworCW91dGwobiwgaW9iYXNlKzB4MzQpOworCQorCW49aW5sKGlvYmFzZSsweDM0KTsKKwluJj1+MHgwMDBGOwkJLyogQVNTUCBvZmYgKi8KKwlvdXRsKG4sIGlvYmFzZSsweDM0KTsKKwkKKwluPWlubChpb2Jhc2UrMHgzNCk7CisJbnw9KDE8PDI5KTsJCS8qIEVuYWJsZSByaW5nIGJ1cyAqLworCW91dGwobiwgaW9iYXNlKzB4MzQpOworCQorCW49aW5sKGlvYmFzZSsweDM0KTsKKwlufD0oMTw8MjgpOwkJLyogRW5hYmxlIHNlcmlhbCBidXMgKi8KKwlvdXRsKG4sIGlvYmFzZSsweDM0KTsKKwkKKwluPWlubChpb2Jhc2UrMHgzNCk7CisJbiY9fjB4MDBGMDAwMDA7CQkvKiBNSUMgb2ZmICovCisJb3V0bChuLCBpb2Jhc2UrMHgzNCk7CisJCisJbj1pbmwoaW9iYXNlKzB4MzQpOworCW4mPX4weDAwMEYwMDAwOwkJLyogSTJTIG9mZiAqLworCW91dGwobiwgaW9iYXNlKzB4MzQpOworCQorCisJdz1pbncoaW9iYXNlKzB4MTgpOworCXcmPX4oMTw8Nyk7CQkvKiBDbGtSdW4gb2ZmICovCisJb3V0dyh3LCBpb2Jhc2UrMHgxOCk7CisKKwl3PWludyhpb2Jhc2UrMHgxOCk7CisJdyY9figxPDw2KTsJCS8qIEhhcmR3YXJlIHZvbHVtZSBjb250cm9sIGludGVycnVwdCBvZmYuLi4gZm9yIG5vdy4gKi8KKwlvdXR3KHcsIGlvYmFzZSsweDE4KTsKKwkKKwl3PWludyhpb2Jhc2UrMHgxOCk7CisJdyY9figxPDw0KTsJCS8qIEFTU1AgaXJxIG9mZiAqLworCW91dHcodywgaW9iYXNlKzB4MTgpOworCQorCXc9aW53KGlvYmFzZSsweDE4KTsKKwl3Jj1+KDE8PDMpOwkJLyogSVNETiBpcnEgb2ZmICovCisJb3V0dyh3LCBpb2Jhc2UrMHgxOCk7CisJCisJdz1pbncoaW9iYXNlKzB4MTgpOworCXd8PSgxPDwyKTsJCS8qIERpcmVjdCBTb3VuZCBJUlEgb24gKi8KKwlvdXR3KHcsIGlvYmFzZSsweDE4KTsKKworCXc9aW53KGlvYmFzZSsweDE4KTsKKwl3Jj1+KDE8PDEpOwkJLyogTVBVNDAxIElSUSBvZmYgKi8KKwlvdXR3KHcsIGlvYmFzZSsweDE4KTsKKworCXc9aW53KGlvYmFzZSsweDE4KTsKKwl3fD0oMTw8MCk7CQkvKiBTQiBJUlEgb24gKi8KKwlvdXR3KHcsIGlvYmFzZSsweDE4KTsKKworCS8qIFNldCBoYXJkd2FyZSB2b2x1bWUgY29udHJvbCByZWdpc3RlcnMgdG8gbWlkcG9pbnRzLgorCSAgIFdlIGNhbiB0ZWxsIHdoaWNoIGJ1dHRvbiB3YXMgcHVzaGVkIGJhc2VkIG9uIGhvdyB0aGV5IGNoYW5nZS4gKi8KKwlvdXRiKDB4ODgsIGlvYmFzZSsweDFjKTsKKwlvdXRiKDB4ODgsIGlvYmFzZSsweDFkKTsKKwlvdXRiKDB4ODgsIGlvYmFzZSsweDFlKTsKKwlvdXRiKDB4ODgsIGlvYmFzZSsweDFmKTsKKworCS8qIGl0IGFwcGVhcnMgc29tZSBtYWVzdHJvcyAoZGVsbCA3NTAwKSBvbmx5IHdvcmsgaWYgdGhlc2UgYXJlIHNldCwKKwkJcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHdlIHVzZSB0aGUgYXNzcCBvciBub3QuICovCisKKwlvdXRiKDAsIGlvYmFzZSsweEE0KTsgCisJb3V0YigzLCBpb2Jhc2UrMHhBMik7IAorCW91dGIoMCwgaW9iYXNlKzB4QTYpOworCQorCWZvcihhcHU9MDthcHU8MTY7YXB1KyspCisJeworCQkvKiBXcml0ZSAwIGludG8gdGhlIGJ1ZmZlciBhcmVhIDB4MUUwLT4xRUYgKi8KKwkJb3V0dygweDAxRTArYXB1LCAweDEwK2lvYmFzZSk7CisJCW91dHcoMHgwMDAwLCAweDEyK2lvYmFzZSk7CisJCisJCS8qCisJCSAqIFRoZSAxLjEwIHRlc3QgcHJvZ3JhbSBzZWVtIHRvIHdyaXRlIDAgaW50byB0aGUgYnVmZmVyIGFyZWEKKwkJICogMHgxRDAtMHgxREYgdG9vLgorCQkgKi8KKwkJb3V0dygweDAxRDArYXB1LCAweDEwK2lvYmFzZSk7CisJCW91dHcoMHgwMDAwLCAweDEyK2lvYmFzZSk7CisJfQorCisjaWYgMQorCXdhdmVfc2V0X3JlZ2lzdGVyKGVzcywgSURSN19XQVZFX1JPTVJBTSwgCisJCSh3YXZlX2dldF9yZWdpc3Rlcihlc3MsIElEUjdfV0FWRV9ST01SQU0pJjB4RkYwMCkpOworCXdhdmVfc2V0X3JlZ2lzdGVyKGVzcywgSURSN19XQVZFX1JPTVJBTSwKKwkJd2F2ZV9nZXRfcmVnaXN0ZXIoZXNzLCBJRFI3X1dBVkVfUk9NUkFNKXwweDEwMCk7CisJd2F2ZV9zZXRfcmVnaXN0ZXIoZXNzLCBJRFI3X1dBVkVfUk9NUkFNLAorCQl3YXZlX2dldF9yZWdpc3Rlcihlc3MsIElEUjdfV0FWRV9ST01SQU0pJn4weDIwMCk7CisJd2F2ZV9zZXRfcmVnaXN0ZXIoZXNzLCBJRFI3X1dBVkVfUk9NUkFNLAorCQl3YXZlX2dldF9yZWdpc3Rlcihlc3MsIElEUjdfV0FWRV9ST01SQU0pfH4weDQwMCk7CisjZWxzZQkJCisJbWFlc3Ryb193cml0ZShlc3MsIElEUjdfV0FWRV9ST01SQU0sIAorCQkobWFlc3Ryb19yZWFkKGVzcywgSURSN19XQVZFX1JPTVJBTSkmMHhGRjAwKSk7CisJbWFlc3Ryb193cml0ZShlc3MsIElEUjdfV0FWRV9ST01SQU0sCisJCW1hZXN0cm9fcmVhZChlc3MsIElEUjdfV0FWRV9ST01SQU0pfDB4MTAwKTsKKwltYWVzdHJvX3dyaXRlKGVzcywgSURSN19XQVZFX1JPTVJBTSwKKwkJbWFlc3Ryb19yZWFkKGVzcywgSURSN19XQVZFX1JPTVJBTSkmfjB4MjAwKTsKKwltYWVzdHJvX3dyaXRlKGVzcywgSURSN19XQVZFX1JPTVJBTSwKKwkJbWFlc3Ryb19yZWFkKGVzcywgSURSN19XQVZFX1JPTVJBTSl8MHg0MDApOworI2VuZGlmCisJCisJbWFlc3Ryb193cml0ZShlc3MsIElEUjJfQ1JBTV9EQVRBLCAweDAwMDApOworCW1hZXN0cm9fd3JpdGUoZXNzLCAweDA4LCAweEIwMDQpOworCS8qIE5vdyBiYWNrIHRvIHRoZSBEaXJlY3RTb3VuZCBzdHVmZiAqLworCW1hZXN0cm9fd3JpdGUoZXNzLCAweDA5LCAweDAwMUIpOworCW1hZXN0cm9fd3JpdGUoZXNzLCAweDBBLCAweDgwMDApOworCW1hZXN0cm9fd3JpdGUoZXNzLCAweDBCLCAweDNGMzcpOworCW1hZXN0cm9fd3JpdGUoZXNzLCAweDBDLCAweDAwOTgpOworCQorCS8qIHBhcmFsbGVsIG91dCA/PyAqLworCW1hZXN0cm9fd3JpdGUoZXNzLCAweDBDLCAKKwkJKG1hZXN0cm9fcmVhZChlc3MsIDB4MEMpJn4weEYwMDApfDB4ODAwMCk7IAorCS8qIHBhcmFsbGVsIGluLCBoYXMgc29tZXRoaW5nIHRvIGRvIHdpdGggcmVjb3JkaW5nIDopICovCisJbWFlc3Ryb193cml0ZShlc3MsIDB4MEMsIAorCQkobWFlc3Ryb19yZWFkKGVzcywgMHgwQykmfjB4MEYwMCl8MHgwNTAwKTsKKworCW1hZXN0cm9fd3JpdGUoZXNzLCAweDBELCAweDc2MzIpOworCQkJCisJLyogV2F2ZSBjYWNoZSBjb250cm9sIG9uIC0gdGVzdCBvZmYsIHNnIG9mZiwgCisJCWVuYWJsZSwgZW5hYmxlIGV4dHJhIGNoYW5zIDFNYiAqLworCisJb3V0dyhpbncoMHgxNCtpb2Jhc2UpfCgxPDw4KSwweDE0K2lvYmFzZSk7CisJb3V0dyhpbncoMHgxNCtpb2Jhc2UpJjB4RkUwMywweDE0K2lvYmFzZSk7CisJb3V0dygoaW53KDB4MTQraW9iYXNlKSYweEZGRkMpLCAweDE0K2lvYmFzZSk7CisJb3V0dyhpbncoMHgxNCtpb2Jhc2UpfCgxPDw3KSwweDE0K2lvYmFzZSk7CisKKwlvdXR3KDB4QTFBMCwgMHgxNCtpb2Jhc2UpOyAgICAgIC8qIDAzMDAgPyAqLworCisJLyogTm93IGNsZWFyIHRoZSBBUFUgY29udHJvbCByYW0gKi8JCisJZm9yKGFwdT0wO2FwdTxOUl9BUFVTO2FwdSsrKQorCXsKKwkJZm9yKHc9MDt3PE5SX0FQVV9SRUdTO3crKykKKwkJCWFwdV9zZXRfcmVnaXN0ZXIoZXNzLCBhcHV8RVNTX0NIQU5fSEFSRCwgdywgMCk7CisJCQorCX0KKworCXJldHVybiAwOworCQorfQorCisvKiB0aGlzIGd1eSB0cmllcyB0byBmaW5kIHRoZSBwY2kgcG93ZXIgbWFuYWdlbWVudAorICogcmVnaXN0ZXIgYmFuay4gIHRoaXMgc2hvdWxkIHJlYWxseSBiZSBpbiBjb3JlCisgKiBjb2RlIHNvbWV3aGVyZS4gIDEgb24gc3VjY2Vzcy4gKi8KK3N0YXRpYyBpbnQKK3BhcnNlX3Bvd2VyKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCwgc3RydWN0IHBjaV9kZXYgKnBjaWRldikKK3sKKwl1MzIgbjsKKwl1MTYgdzsKKwl1OCBuZXh0OworCWludCBtYXggPSA2NDsgIC8qIGFuIGEgOGJpdCBndXkgcG9pbnRpbmcgdG8gMzJiaXQgZ3V5cworCQkJCWNhbiBvbmx5IGV4cHJlc3Mgc28gbXVjaC4gKi8KKworCWNhcmQtPnBvd2VyX3JlZ3MgPSAwOworCisJLyogY2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSBjYXBhYmlsaXRpZXMgbGlzdCBpbgorCQl0aGUgY29uZmlnIHJlZ2lzdGVyICovCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGNpZGV2LCBQQ0lfU1RBVFVTLCAmdyk7CisJaWYoISh3ICYgUENJX1NUQVRVU19DQVBfTElTVCkpIHJldHVybiAwOworCisJLyogd2FsayB0aGUgbGlzdCwgc3RhcnRpbmcgYXQgdGhlIGhlYWQuICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LFBDSV9DQVBBQklMSVRZX0xJU1QsJm5leHQpOworCisJd2hpbGUobmV4dCAmJiBtYXgtLSkgeworCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBuZXh0ICYgfjMsICZuKTsKKwkJaWYoKG4gJiAweGZmKSA9PSBQQ0lfQ0FQX0lEX1BNKSB7CisJCQljYXJkLT5wb3dlcl9yZWdzID0gbmV4dDsKKwkJCWJyZWFrOworCQl9CisJCW5leHQgPSAoKG4+PjgpICYgMHhmZik7CisJfQorCisJcmV0dXJuIGNhcmQtPnBvd2VyX3JlZ3MgPyAxIDogMDsKK30KKworc3RhdGljIGludCBfX2luaXQKK21hZXN0cm9fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldixjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGRpZCkKK3sKKwlpbnQgY2FyZF90eXBlID0gcGRpZC0+ZHJpdmVyX2RhdGE7CisJdTMyIG47CisJaW50IGlvYmFzZTsKKwlpbnQgaSwgcmV0OworCXN0cnVjdCBlc3NfY2FyZCAqY2FyZDsKKwlzdHJ1Y3QgZXNzX3N0YXRlICplc3M7CisJc3RydWN0IHBtX2RldiAqcG1kZXY7CisJaW50IG51bSA9IDA7CisKKy8qIHdoZW4gYnVpbHQgaW50byB0aGUga2VybmVsLCB3ZSBvbmx5IHByaW50IHZlcnNpb24gaWYgZGV2aWNlIGlzIGZvdW5kICovCisjaWZuZGVmIE1PRFVMRQorCXN0YXRpYyBpbnQgcHJpbnRlZF92ZXJzaW9uOworCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCisJCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCisJLyogZG9uJ3QgcGljayB1cCB3ZWlyZCBtb2RlbSBtYWVzdHJvcyAqLworCWlmKCgocGNpZGV2LT5jbGFzcyA+PiA4KSAmIDB4ZmZmZikgIT0gUENJX0NMQVNTX01VTFRJTUVESUFfQVVESU8pCisJCXJldHVybiAtRU5PREVWOworCisKKwlpZiAoKHJldD1wY2lfZW5hYmxlX2RldmljZShwY2lkZXYpKSkKKwkJcmV0dXJuIHJldDsKKwkJCQorCWlvYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsMCk7CisJaWYgKCFpb2Jhc2UgfHwgIShwY2lfcmVzb3VyY2VfZmxhZ3MocGNpZGV2LCAwICkgJiBJT1JFU09VUkNFX0lPKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZihwY2lkZXYtPmlycSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCS8qIHN0YWtlIG91ciBjbGFpbSBvbiB0aGUgaW9zcGFjZSAqLworCWlmKCByZXF1ZXN0X3JlZ2lvbihpb2Jhc2UsIDI1NiwgY2FyZF9uYW1lc1tjYXJkX3R5cGVdKSA9PSBOVUxMICkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm86IGNhbid0IGFsbG9jYXRlIDI1NiBieXRlcyBJL08gYXQgMHglNC40eFxuIiwgaW9iYXNlKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBqdXN0IHRvIGJlIHN1cmUgKi8KKwlwY2lfc2V0X21hc3RlcihwY2lkZXYpOworCisJY2FyZCA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBlc3NfY2FyZCksIEdGUF9LRVJORUwpOworCWlmKGNhcmQgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm86IG91dCBvZiBtZW1vcnlcbiIpOworCQlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIDI1Nik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwkKKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKCpjYXJkKSk7CisJY2FyZC0+cGNpZGV2ID0gcGNpZGV2OworCisJcG1kZXYgPSBwbV9yZWdpc3RlcihQTV9QQ0lfREVWLCBQTV9QQ0lfSUQocGNpZGV2KSwKKwkJCW1hZXN0cm9fcG1fY2FsbGJhY2spOworCWlmIChwbWRldikKKwkJcG1kZXYtPmRhdGEgPSBjYXJkOworCisJY2FyZC0+aW9iYXNlID0gaW9iYXNlOworCWNhcmQtPmNhcmRfdHlwZSA9IGNhcmRfdHlwZTsKKwljYXJkLT5pcnEgPSBwY2lkZXYtPmlycTsKKwljYXJkLT5tYWdpYyA9IEVTU19DQVJEX01BR0lDOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5zdXNwZW5kX3F1ZXVlKTsKKworCWNhcmQtPmRvY2tfbXV0ZV92b2wgPSA1MDsKKwkKKwkvKiBpbml0IG91ciBncm91cHMgb2YgNiBhcHVzICovCisJZm9yKGk9MDtpPE5SX0RTUFM7aSsrKQorCXsKKwkJc3RydWN0IGVzc19zdGF0ZSAqcz0mY2FyZC0+Y2hhbm5lbHNbaV07CisKKwkJcy0+aW5kZXggPSBpOworCisJCXMtPmNhcmQgPSBjYXJkOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfYWRjLndhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjLndhaXQpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXQpOworCQlzcGluX2xvY2tfaW5pdCgmcy0+bG9jayk7CisJCWluaXRfTVVURVgoJnMtPm9wZW5fc2VtKTsKKwkJcy0+bWFnaWMgPSBFU1NfU1RBVEVfTUFHSUM7CisJCQorCQlzLT5hcHVbMF0gPSA2Kmk7CisJCXMtPmFwdVsxXSA9ICg2KmkpKzE7CisJCXMtPmFwdVsyXSA9ICg2KmkpKzI7CisJCXMtPmFwdVszXSA9ICg2KmkpKzM7CisJCXMtPmFwdVs0XSA9ICg2KmkpKzQ7CisJCXMtPmFwdVs1XSA9ICg2KmkpKzU7CisJCQorCQlpZihzLT5kbWFfYWRjLnJlYWR5IHx8IHMtPmRtYV9kYWMucmVhZHkgfHwgcy0+ZG1hX2FkYy5yYXdidWYpCisJCQlwcmludGsoIm1hZXN0cm86IEJPVENIIVxuIik7CisJCS8qIHJlZ2lzdGVyIGRldmljZXMgKi8KKwkJaWYgKChzLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmVzc19hdWRpb19mb3BzLCAtMSkpIDwgMCkKKwkJCWJyZWFrOworCX0KKwkKKwludW0gPSBpOworCQorCS8qIGNsZWFyIHRoZSByZXN0IGlmIHdlIHJhbiBvdXQgb2Ygc2xvdHMgdG8gcmVnaXN0ZXIgKi8KKwlmb3IoO2k8TlJfRFNQUztpKyspCisJeworCQlzdHJ1Y3QgZXNzX3N0YXRlICpzPSZjYXJkLT5jaGFubmVsc1tpXTsKKwkJcy0+ZGV2X2F1ZGlvID0gLTE7CisJfQorCQorCWVzcyA9ICZjYXJkLT5jaGFubmVsc1swXTsKKworCS8qCisJICoJT2sgY2FyZCByZWFkeS4gQmVnaW4gc2V0dXAgcHJvcGVyCisJICovCisKKwlwcmludGsoS0VSTl9JTkZPICJtYWVzdHJvOiBDb25maWd1cmluZyAlcyBmb3VuZCBhdCBJTyAweCUwNFggSVJRICVkXG4iLCAKKwkJY2FyZF9uYW1lc1tjYXJkX3R5cGVdLGlvYmFzZSxjYXJkLT5pcnEpOworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9TVUJTWVNURU1fVkVORE9SX0lELCAmbik7CisJcHJpbnRrKEtFUk5fSU5GTyAibWFlc3RybzogIHN1YnZlbmRvciBpZDogMHglMDh4XG4iLG4pOyAKKworCS8qIHR1cm4gb2ZmIHBvd2VyIG1hbmFnZW1lbnQgdW5sZXNzOgorCSAqCS0gdGhlIHVzZXIgZXhwbGljaXRseSBhc2tzIGZvciBpdAorCSAqIAkJb3IKKwkgKgkJLSB3ZSdyZSBub3QgYSAyZSwgbGVzc2VyIGNoaXBwcyBzZWVtIHRvIGhhdmUgcHJvYmxlbXMuCisJICoJCS0gd2UncmUgbm90IG9uIG91ciBfdmVyeV8gc21hbGwgd2hpdGVsaXN0LiAgc29tZSBpbXBsZW1lbmV0YXRpb25zCisJICoJCQlyZWFsbHkgZG9uJ3QgbGlrZSB0aGUgcG0gY29kZSwgb3RoZXJzIHJlcXVpcmUgaXQuCisJICoJCQlmZWVsIGZyZWUgdG8gZXhwYW5kIHRoaXMgYXMgcmVxdWlyZWQuCisJICovCisjZGVmaW5lIFNVQlNZU1RFTV9WRU5ET1IoeCkgKHgmMHhmZmZmKQorCWlmKAkodXNlX3BtICE9IDEpICYmIAorCQkoKGNhcmRfdHlwZSAhPSBUWVBFX01BRVNUUk8yRSkJfHwgKFNVQlNZU1RFTV9WRU5ET1IobikgIT0gMHgxMDI4KSkpCisJCQl1c2VfcG0gPSAwOworCisJaWYoIXVzZV9wbSkgCisJCXByaW50ayhLRVJOX0lORk8gIm1hZXN0cm86IG5vdCBhdHRlbXB0aW5nIHBvd2VyIG1hbmFnZW1lbnQuXG4iKTsKKwllbHNlIHsKKwkJaWYoIXBhcnNlX3Bvd2VyKGNhcmQscGNpZGV2KSkgCisJCQlwcmludGsoS0VSTl9JTkZPICJtYWVzdHJvOiBubyBQQ0kgcG93ZXIgbWFuYWdlbWVudCBpbnRlcmZhY2UgZm91bmQuXG4iKTsKKwkJZWxzZSB7CisJCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBjYXJkLT5wb3dlcl9yZWdzLCAmbik7CisJCQlwcmludGsoS0VSTl9JTkZPICJtYWVzdHJvOiBQQ0kgcG93ZXIgbWFuYWdlbWVudCBjYXBhYmlsaXR5OiAweCV4XG4iLG4+PjE2KTsKKwkJfQkKKwl9CisKKwltYWVzdHJvX2NvbmZpZyhjYXJkKTsKKworCWlmKG1hZXN0cm9fYWM5N19nZXQoY2FyZCwgMHgwMCk9PTB4MDA4MCkgeworCQlwcmludGsoS0VSTl9FUlIgIm1hZXN0cm86IG15IGdvb2RuZXNzISAgeW91IHNlZW0gdG8gaGF2ZSBhIHB0MTAxIGNvZGVjLCB3aGljaCBpcyBxdWl0ZSByYXJlLlxuIgorCQkJCSJcdHlvdSBzaG91bGQgdGVsbCBzb21lb25lIGFib3V0IHRoaXMuXG4iKTsKKwl9IGVsc2UgeworCQltYWVzdHJvX2FjOTdfaW5pdChjYXJkKTsKKwl9CisKKwlpZiAoKGNhcmQtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZlc3NfbWl4ZXJfZm9wcywgLTEpKSA8IDApIHsKKwkJcHJpbnRrKCJtYWVzdHJvOiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOworCX0gZWxzZSB7CisJCW1lbWNweShjYXJkLT5taXgubWl4ZXJfc3RhdGUsbWl4ZXJfZGVmYXVsdHMsc2l6ZW9mKGNhcmQtPm1peC5taXhlcl9zdGF0ZSkpOworCQltaXhlcl9wdXNoX3N0YXRlKGNhcmQpOworCX0KKwkKKwlpZigocmV0PXJlcXVlc3RfaXJxKGNhcmQtPmlycSwgZXNzX2ludGVycnVwdCwgU0FfU0hJUlEsIGNhcmRfbmFtZXNbY2FyZF90eXBlXSwgY2FyZCkpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJtYWVzdHJvOiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkLFxuIiwgY2FyZC0+aXJxKTsKKwkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5kZXZfbWl4ZXIpOworCQlmb3IoaT0wO2k8TlJfRFNQUztpKyspCisJCXsKKwkJCXN0cnVjdCBlc3Nfc3RhdGUgKnMgPSAmY2FyZC0+Y2hhbm5lbHNbaV07CisJCQlpZihzLT5kZXZfYXVkaW8gIT0gLTEpCisJCQkJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKwkJfQorCQlyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIDI1Nik7CQkKKwkJdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJm1hZXN0cm9fbmIpOworCQlrZnJlZShjYXJkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBUdXJuIG9uIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sIGludGVycnVwdC4KKwkgICBUaGlzIGhhcyB0byBjb21lIGFmdGVyIHdlIGdyYWIgdGhlIElSUSBhYm92ZSwKKwkgICBvciBhIGNyYXNoIHdpbGwgcmVzdWx0IG9uIGluc3RhbGxhdGlvbiBpZiBhIGJ1dHRvbiBoYXMgYmVlbiBwcmVzc2VkLAorCSAgIGJlY2F1c2UgaW4gdGhhdCBjYXNlIHdlJ2xsIGdldCBhbiBpbW1lZGlhdGUgaW50ZXJydXB0LiAqLworCW4gPSBpbncoaW9iYXNlKzB4MTgpOworCW58PSgxPDw2KTsKKwlvdXR3KG4sIGlvYmFzZSsweDE4KTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lkZXYsY2FyZCk7CisJLyogbm93IGdvIHRvIHNsZWVwICd0aWxsIHNvbWV0aGluZyBpbnRlcmVzdGluZyBoYXBwZW5zICovCisJbWFlc3Ryb19wb3dlcihjYXJkLEFDUElfRDIpOworCisJcHJpbnRrKEtFUk5fSU5GTyAibWFlc3RybzogJWQgY2hhbm5lbHMgY29uZmlndXJlZC5cbiIsIG51bSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1hZXN0cm9fcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpIHsKKwlzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKKwlpbnQgaTsKKwl1MzIgbjsKKwkKKwkvKiBYWFggbWF5YmUgc2hvdWxkIGZvcmNlIHN0b3AgYm9iLCBidXQgc2hvdWxkIGJlIGFsbCAKKwkJc3RvcHBlZCBieSBfcmVsZWFzZSBieSBub3cgKi8KKworCS8qIFR1cm4gb2ZmIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sIGludGVycnVwdC4KKwkgICBUaGlzIGhhcyB0byBjb21lIGJlZm9yZSB3ZSBsZWF2ZSB0aGUgSVJRIGJlbG93LAorCSAgIG9yIGEgY3Jhc2ggcmVzdWx0cyBpZiBhIGJ1dHRvbiBpcyBwcmVzc2VkICEgKi8KKwluID0gaW53KGNhcmQtPmlvYmFzZSsweDE4KTsKKwluJj1+KDE8PDYpOworCW91dHcobiwgY2FyZC0+aW9iYXNlKzB4MTgpOworCisJZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmRldl9taXhlcik7CisJZm9yKGk9MDtpPE5SX0RTUFM7aSsrKQorCXsKKwkJc3RydWN0IGVzc19zdGF0ZSAqZXNzID0gJmNhcmQtPmNoYW5uZWxzW2ldOworCQlpZihlc3MtPmRldl9hdWRpbyAhPSAtMSkKKwkJCXVucmVnaXN0ZXJfc291bmRfZHNwKGVzcy0+ZGV2X2F1ZGlvKTsKKwl9CisJLyogR29vZGJ5ZSwgTXIuIEJvbmQuICovCisJbWFlc3Ryb19wb3dlcihjYXJkLEFDUElfRDMpOworIAlyZWxlYXNlX3JlZ2lvbihjYXJkLT5pb2Jhc2UsIDI1Nik7CisJa2ZyZWUoY2FyZCk7CisJcGNpX3NldF9kcnZkYXRhKHBjaWRldixOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIG1hZXN0cm9fcGNpX3RibFtdID0geworCXtQQ0lfVkVORE9SX0VTUywgUENJX0RFVklDRV9JRF9FU1NfRVNTMTk2OCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVFlQRV9NQUVTVFJPMn0sCisJe1BDSV9WRU5ET1JfRVNTLCBQQ0lfREVWSUNFX0lEX0VTU19FU1MxOTc4LCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwLCBUWVBFX01BRVNUUk8yRX0sCisJe1BDSV9WRU5ET1JfRVNTX09MRCwgUENJX0RFVklDRV9JRF9FU1NfRVNTMDEwMCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgVFlQRV9NQUVTVFJPfSwKKwl7MCx9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIG1hZXN0cm9fcGNpX3RibCk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBtYWVzdHJvX3BjaV9kcml2ZXIgPSB7CisJLm5hbWUJICA9ICJtYWVzdHJvIiwKKwkuaWRfdGFibGUgPSBtYWVzdHJvX3BjaV90YmwsCisJLnByb2JlCSAgPSBtYWVzdHJvX3Byb2JlLAorCS5yZW1vdmUJICA9IG1hZXN0cm9fcmVtb3ZlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9tYWVzdHJvKHZvaWQpCit7CisJaW50IHJjOworCisJcmMgPSBwY2lfbW9kdWxlX2luaXQoJm1hZXN0cm9fcGNpX2RyaXZlcik7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKHJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmbWFlc3Ryb19uYikpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm86IHJlYm9vdCBub3RpZmllciByZWdpc3RyYXRpb24gZmFpbGVkOyBtYXkgbm90IHJlYm9vdCBwcm9wZXJseS5cbiIpOworI2lmZGVmIE1PRFVMRQorCXByaW50ayh2ZXJzaW9uKTsKKyNlbmRpZgorCWlmIChkc3BzX29yZGVyIDwgMCkgICB7CisJCWRzcHNfb3JkZXIgPSAxOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtYWVzdHJvOiBjbGlwcGluZyBkc3BzX29yZGVyIHRvICVkXG4iLGRzcHNfb3JkZXIpOworCX0KKwllbHNlIGlmIChkc3BzX29yZGVyID4gTUFYX0RTUF9PUkRFUikgIHsKKwkJZHNwc19vcmRlciA9IE1BWF9EU1BfT1JERVI7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1hZXN0cm86IGNsaXBwaW5nIGRzcHNfb3JkZXIgdG8gJWRcbiIsZHNwc19vcmRlcik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hZXN0cm9fbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqYnVmKQoreworCS8qIHRoaXMgbm90aWZpZXIgaXMgY2FsbGVkIHdoZW4gdGhlIGtlcm5lbCBpcyByZWFsbHkgc2h1dCBkb3duLiAqLworCU1fcHJpbnRrKCJtYWVzdHJvOiBzaHV0dGluZyBkb3duXG4iKTsKKwkvKiB0aGlzIHdpbGwgcmVtb3ZlIGFsbCBjYXJkIGluc3RhbmNlcyB0b28gKi8KKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJm1hZXN0cm9fcGNpX2RyaXZlcik7CisJLyogWFhYIGR1bm5vIGFib3V0IHBvd2VyIG1hbmFnZW1lbnQgKi8KKwlyZXR1cm4gTk9USUZZX09LOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCitzdGF0aWMgdm9pZCBjbGVhbnVwX21hZXN0cm8odm9pZCkgeworCU1fcHJpbnRrKCJtYWVzdHJvOiB1bmxvYWRpbmdcbiIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmbWFlc3Ryb19wY2lfZHJpdmVyKTsKKwlwbV91bnJlZ2lzdGVyX2FsbChtYWVzdHJvX3BtX2NhbGxiYWNrKTsKKwl1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmbWFlc3Ryb19uYik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitjaGVja19zdXNwZW5kKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCkKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKworCWlmKCFjYXJkLT5pbl9zdXNwZW5kKSByZXR1cm47CisKKwljYXJkLT5pbl9zdXNwZW5kKys7CisJYWRkX3dhaXRfcXVldWUoJihjYXJkLT5zdXNwZW5kX3F1ZXVlKSwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19VTklOVEVSUlVQVElCTEU7CisJc2NoZWR1bGUoKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmKGNhcmQtPnN1c3BlbmRfcXVldWUpLCAmd2FpdCk7CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7Cit9CisKK3N0YXRpYyBpbnQgCittYWVzdHJvX3N1c3BlbmQoc3RydWN0IGVzc19jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksajsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLGZsYWdzKTsgLyogb3Zlci1raWxsICovCisKKwlNX3ByaW50aygibWFlc3RybzogYXBtIGluIGRldiAlcFxuIixjYXJkKTsKKworCS8qIHdlIGhhdmUgdG8gcmVhZCBmcm9tIHRoZSBhcHUgcmVncywgbmVlZAorCQl0byBwb3dlciBpdCB1cCAqLworCW1hZXN0cm9fcG93ZXIoY2FyZCxBQ1BJX0QwKTsKKworCWZvcihpPTA7aTxOUl9EU1BTO2krKykgeworCQlzdHJ1Y3QgZXNzX3N0YXRlICpzID0gJmNhcmQtPmNoYW5uZWxzW2ldOworCisJCWlmKHMtPmRldl9hdWRpbyA9PSAtMSkKKwkJCWNvbnRpbnVlOworCisJCU1fcHJpbnRrKCJtYWVzdHJvOiBzdG9wcGluZyBhcHVzIGZvciBkZXZpY2UgJWRcbiIsaSk7CisJCXN0b3BfZGFjKHMpOworCQlzdG9wX2FkYyhzKTsKKwkJZm9yKGo9MDtqPDY7aisrKSAKKwkJCWNhcmQtPmFwdV9tYXBbcy0+YXB1W2pdXVs1XT1hcHVfZ2V0X3JlZ2lzdGVyKHMsaiw1KTsKKworCX0KKworCS8qIGdldCByaWQgb2YgaW50ZXJydXB0cz8gKi8KKwlpZiggY2FyZC0+ZHNwc19vcGVuID4gMCkKKwkJc3RvcF9ib2IoJmNhcmQtPmNoYW5uZWxzWzBdKTsKKworCWNhcmQtPmluX3N1c3BlbmQrKzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCisJLyogd2UgdHJ1c3QgaW4gdGhlIGJpb3MgdG8gcG93ZXIgZG93biB0aGUgY2hpcCBvbiBzdXNwZW5kLgorCSAqIFhYWCBJJ20gYWxzbyBub3Qgc3VyZSB0aGF0IGluX3N1c3BlbmQgd2lsbCBwcm90ZWN0CisJICogYWdhaW5zdCBhbGwgcmVnIGFjY2Vzc2VzIGZyb20gaGVyZSBvbiBvdXQuIAorCSAqLworCXJldHVybiAwOworfQorc3RhdGljIGludCAKK21hZXN0cm9fcmVzdW1lKHN0cnVjdCBlc3NfY2FyZCAqY2FyZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOyAvKiBvdmVyLWtpbGwgKi8KKworCWNhcmQtPmluX3N1c3BlbmQgPSAwOworCisJTV9wcmludGsoIm1hZXN0cm86IHJlc3VtaW5nIGNhcmQgYXQgJXBcbiIsY2FyZCk7CisKKwkvKiByZXN0b3JlIGFsbCBvdXIgY29uZmlnICovCisJbWFlc3Ryb19jb25maWcoY2FyZCk7CisJLyogbmVlZCB0byByZXN0b3JlIHRoZSBiYXNlIHBvaW50ZXJzLi4gKi8gCisJaWYoY2FyZC0+ZG1hcGFnZXMpIAorCQlzZXRfYmFzZV9yZWdpc3RlcnMoJmNhcmQtPmNoYW5uZWxzWzBdLGNhcmQtPmRtYXBhZ2VzKTsKKworCW1peGVyX3B1c2hfc3RhdGUoY2FyZCk7CisKKwkvKiBzZXQgZWFjaCBjaGFubmVscycgYXB1IGNvbnRyb2wgcmVnaXN0ZXJzIGJlZm9yZQorCSAqIHJlc3RvcmluZyBhdWRpbyAKKwkgKi8KKwlmb3IoaT0wO2k8TlJfRFNQUztpKyspIHsKKwkJc3RydWN0IGVzc19zdGF0ZSAqcyA9ICZjYXJkLT5jaGFubmVsc1tpXTsKKwkJaW50IGNoYW4scmVnOworCisJCWlmKHMtPmRldl9hdWRpbyA9PSAtMSkKKwkJCWNvbnRpbnVlOworCisJCWZvcihjaGFuID0gMCA7IGNoYW4gPCA2IDsgY2hhbisrKSB7CisJCQl3YXZlX3NldF9yZWdpc3RlcihzLHMtPmFwdVtjaGFuXTw8MyxzLT5hcHVfYmFzZVtjaGFuXSk7CisJCQlmb3IocmVnID0gMSA7IHJlZyA8IE5SX0FQVV9SRUdTIDsgcmVnKyspICAKKwkJCQlhcHVfc2V0X3JlZ2lzdGVyKHMsY2hhbixyZWcscy0+Y2FyZC0+YXB1X21hcFtzLT5hcHVbY2hhbl1dW3JlZ10pOworCQl9CisJCWZvcihjaGFuID0gMCA7IGNoYW4gPCA2IDsgY2hhbisrKSAgCisJCQlhcHVfc2V0X3JlZ2lzdGVyKHMsY2hhbiwwLHMtPmNhcmQtPmFwdV9tYXBbcy0+YXB1W2NoYW5dXVswXSAmIDB4RkYwRik7CisJfQorCisJLyogbm93IHdlIGZsaXAgb24gdGhlIG11c2ljICovCisKKwlpZiggY2FyZC0+ZHNwc19vcGVuIDw9IDApIHsKKwkJLyogdGhpcyBjYXJkJ3MgaWRsZSAqLworCQltYWVzdHJvX3Bvd2VyKGNhcmQsQUNQSV9EMik7CisJfSBlbHNlIHsKKwkJLyogb2ssIHdlJ3JlIGFjdHVhbGx5IHBsYXlpbmcgdGhpbmdzIG9uCisJCQl0aGlzIGNhcmQgKi8KKwkJbWFlc3Ryb19wb3dlcihjYXJkLEFDUElfRDApOworCQlzdGFydF9ib2IoJmNhcmQtPmNoYW5uZWxzWzBdKTsKKwkJZm9yKGk9MDtpPE5SX0RTUFM7aSsrKSB7CisJCQlzdHJ1Y3QgZXNzX3N0YXRlICpzID0gJmNhcmQtPmNoYW5uZWxzW2ldOworCisJCQkvKiB0aGVzZSB1c2UgdGhlIGFwdV9tb2RlLCBhbmQgY2FuIGhhbmRsZQorCQkJCXNwdXJpb3VzIGNhbGxzICovCisJCQlzdGFydF9kYWMocyk7CQorCQkJc3RhcnRfYWRjKHMpOwkKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCisJLyogYWxsIHJpZ2h0LCB3ZSB0aGluayB0aGluZ3MgYXJlIHJlYWR5LCAKKwkJd2FrZSB1cCBwZW9wbGUgd2hvIHdlcmUgdXNpbmcgdGhlIGRldmljZQorCQl3aGVuIHdlIHN1c3BlbmRlZCAqLworCXdha2VfdXAoJihjYXJkLT5zdXNwZW5kX3F1ZXVlKSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IAorbWFlc3Ryb19wbV9jYWxsYmFjayhzdHJ1Y3QgcG1fZGV2ICpkZXYsIHBtX3JlcXVlc3RfdCBycXN0LCB2b2lkICpkYXRhKSAKK3sKKwlzdHJ1Y3QgZXNzX2NhcmQgKmNhcmQgPSAoc3RydWN0IGVzc19jYXJkKikgZGV2LT5kYXRhOworCisJaWYgKCAhIGNhcmQgKSBnb3RvIG91dDsKKworCU1fcHJpbnRrKCJtYWVzdHJvOiBwbSBldmVudCAweCV4IHJlY2VpdmVkIGZvciBjYXJkICVwXG4iLCBycXN0LCBjYXJkKTsKKwkKKwlzd2l0Y2ggKHJxc3QpIHsKKwkJY2FzZSBQTV9TVVNQRU5EOiAKKwkJCW1hZXN0cm9fc3VzcGVuZChjYXJkKTsKKwkJYnJlYWs7CisJCWNhc2UgUE1fUkVTVU1FOiAKKwkJCW1hZXN0cm9fcmVzdW1lKGNhcmQpOworCQlicmVhazsKKwkJLyoKKwkJICogd2UnZCBhbHNvIGxpa2UgdG8gZmluZCBvdXQgYWJvdXQKKwkJICogcG93ZXIgbGV2ZWwgY2hhbmdlcyBiZWNhdXNlIHNvbWUgYmlvc2VuCisJCSAqIGRvIG1lYW4gdGhpbmdzIHRvIHRoZSBtYWVzdHJvIHdoZW4gdGhleQorCQkgKiBjaGFuZ2UgdGhlaXIgcG93ZXIgc3RhdGUuCisJCSAqLworICAgICAgICB9CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKK21vZHVsZV9pbml0KGluaXRfbWFlc3Rybyk7Cittb2R1bGVfZXhpdChjbGVhbnVwX21hZXN0cm8pOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21hZXN0cm8uaCBiL3NvdW5kL29zcy9tYWVzdHJvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzZWM3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tYWVzdHJvLmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqCVJlZ2lzdGVycyBmb3IgdGhlIEVTUyBQQ0kgY2FyZHMKKyAqLworIAorLyoKKyAqCU1lbW9yeSBhY2Nlc3MKKyAqLworIAorI2RlZmluZSBFU1NfTUVNX0RBVEEJCTB4MDAKKyNkZWZpbmUJRVNTX01FTV9JTkRFWAkJMHgwMgorCisvKgorICoJQUMtOTcgQ29kZWMgcG9ydC4gRGVsYXkgMXVTIGFmdGVyIGVhY2ggd3JpdGUuIFRoaXMgaXMgdXNlZCB0bworICoJdGFsayBBQy05NyAoc2VlIGludGVsLmNvbSkuIFdyaXRlIGRhdGEgdGhlbiByZWdpc3Rlci4KKyAqLworIAorI2RlZmluZSBFU1NfQUM5N19JTkRFWAkJMHgzMAkJLyogYnl0ZSB3aWRlICovCisjZGVmaW5lIEVTU19BQzk3X0RBVEEJCTB4MzIKKworLyogCisgKglSZWFkaW5nIGlzIGEgYml0IGRpZmZlcmVudC4gWW91IHdyaXRlIHJlZ2lzdGVyfDB4ODAgdG8gdWJkZXgKKyAqCWRlbGF5IDF1UyBwb2xsIHRoZSBsb3cgYml0IG9mIGluZGV4LCB3aGVuIGl0IGNsZWFycyByZWFkIHRoZQorICoJZGF0YSB2YWx1ZS4KKyAqLworCisvKgorICoJQ29udHJvbCBwb3J0LiBOb3QgeWV0IGZ1bGx5IHVuZGVyc3Rvb2QKKyAqCVRoZSB2YWx1ZSAweEMwOTAgZ2V0cyBsb2FkZWQgdG8gaXQgdGhlbiAweDAwMDAgYW5kIDB4MjgwMAorICoJdG8gdGhlIGRhdGEgcG9ydC4gVGhlbiBhZnRlciA0dVMgdGhlIHZhbHVlIDB4MzAwIGlzIHdyaXR0ZW4KKyAqLworIAorI2RlZmluZSBSSU5HX0JVU19DVFJMX0wJCTB4MzQKKyNkZWZpbmUgUklOR19CVVNfQ1RSTF9ICQkweDM2CisKKy8qCisgKglUaGlzIGlzIGFsc28gdXNlZCBkdXJpbmcgc2V0dXAuIFRoZSB2YWx1ZSAweDE3IGlzIHdyaXR0ZW4gdG8gaXQKKyAqLworIAorI2RlZmluZSBFU1NfU0VUVVBfMTgJCTB4MTgKKworLyoKKyAqCUFuZCB0aGlzIG9uZSBnZXRzIDB4MDAwYgorICovCisgCisjZGVmaW5lIEVTU19TRVRVUF9BMgkJMHhBMgorCisvKgorICoJQW5kIHRoaXMgMHgwMDAwCisgKi8KKyAKKyNkZWZpbmUgRVNTX1NFVFVQX0E0CQkweEE0CisjZGVmaW5lIEVTU19TRVRVUF9BNgkJMHhBNgorCisvKgorICoJU3R1ZmYgdG8gZG8gd2l0aCBIYXJwbyAtIHRoZSB3YXZlIHN0dWZmCisgKi8KKyAKKyNkZWZpbmUgRVNTX1dBVkVUQUJMRV9TSVpFCTB4MTQKKyNkZWZpbmUgCUVTU19XQVZFVEFCTEVfMk0JMHhBMTgwCisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tYWVzdHJvMy5jIGIvc291bmQvb3NzL21hZXN0cm8zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNkZWM3MAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tYWVzdHJvMy5jCkBAIC0wLDAgKzEsMjk3MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogICAgICBFU1MgTWFlc3RybzMvQWxsZWdybyBkcml2ZXIgZm9yIExpbnV4IDIuNC54CisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICAgIChjKSBDb3B5cmlnaHQgMjAwMCBaYWNoIEJyb3duIDx6YWJAemFiYm8ubmV0PgorICoKKyAqIEkgbmVlZCB0byB0aGFuayBtYW55IHBlb3BsZSBmb3IgaGVscGluZyBtYWtlIHRoaXMgZHJpdmVyIGhhcHBlbi4gIAorICogQXMgYWx3YXlzLCBFcmljIEJyb21iYXVnaCB3YXMgYSBoYWNraW5nIG1hY2hpbmUgYW5kIGtpbGxlZCBtYW55IGJ1Z3MKKyAqIHRoYXQgSSB3YXMgdG9vIGR1bWIgdG8gbm90aWNlLiAgSG93YXJkIEtpbSBhdCBFU1MgcHJvdmlkZWQgcmVmZXJlbmNlIGJvYXJkcyAKKyAqIGFuZCBhcyBtdWNoIGRvY3MgYXMgaGUgY291bGQuICBUb2RkIGFuZCBNaWNrIGF0IERlbGwgdGVzdGVkIHNuYXBzaG90cyBvbiAKKyAqIGFuIGFybXkgb2YgbGFwdG9wcy4gIG1zdyBhbmQgZGV2aWFudCBhdCBSZWQgSGF0IGFsc28gaHVtb3VyZWQgbWUgYnkgaGFuZ2luZworICogdGhlaXIgbGFwdG9wcyBldmVyeSBmZXcgaG91cnMgaW4gdGhlIG5hbWUgb2Ygc2NpZW5jZS4KKyAqIAorICogU2hvdXRzIGdvIG91dCB0byBNaWtlICJESiBYUENvbSIgQW5nLgorICoKKyAqIEhpc3RvcnkKKyAqICB2MS4yMyAtIEp1biA1IDIwMDIgLSBNaWNoYWVsIE9sc29uIDxvbHNvbkBjcy5vZHUuZWR1PgorICogICBhZGRlZCBhIG1vZHVsZSBvcHRpb24gdG8gYWxsb3cgc2VsZWN0aW9uIG9mIEdQSU8gcGluIG51bWJlciAKKyAqICAgZm9yIGV4dGVybmFsIGFtcCAKKyAqICB2MS4yMiAtIEZlYiAyOCAyMDAxIC0gWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4KKyAqICAgYWxsb2NhdGUgbWVtIGF0IGluc21vZC9zZXR1cCwgcmF0aGVyIHRoYW4gb3BlbgorICogICBsaW1pdCBwY2kgZG1hIGFkZHJlc3NlcyB0byAyOGJpdCwgdGhhbmtzIGd1eXMuCisgKiAgdjEuMjEgLSBGZWIgMDQgMjAwMSAtIFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+CisgKiAgIGZpeCB1cCByZWFsbHkgZHVtYiBub3RpZmllciAtPiBzdXNwZW5kIG9vcHMKKyAqICB2MS4yMCAtIEphbiAzMCAyMDAxIC0gWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4KKyAqICAgZ2V0IHJpZCBvZiBwbSBjYWxsYmFjayBhbmQgdXNlIHBjaV9kZXYgc3VzcGVuZC9yZXN1bWUgaW5zdGVhZAorICogICBtM19wcm9iZSBjbGVhbnVwcywgaW5jbHVkaW5nIHBtIG9vcHMgdGhpbmstbworICogIHYxLjEwIC0gSmFuIDYgMjAwMSAtIFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+CisgKiAgIHJldmVydCB0byBsYW1lIHJlbWFwX3BhZ2VfcmFuZ2UgbW1hcCgpIGp1c3QgdG8gbWFrZSBpdCB3b3JrCisgKiAgIHJlY29yZCBtbWFwIGZpeGVkLgorICogICBmaXggdXAgaW5jcmVkaWJseSBicm9rZW4gb3Blbi9yZWxlYXNlIHJlc291cmNlIG1hbmFnZW1lbnQKKyAqICAgZHVoLiAgZml4IHJlY29yZCBmb3JtYXQgc2V0dGluZy4KKyAqICAgYWRkIFNNUCBsb2NraW5nIGFuZCBjbGVhbnVwIGZvcm1hdHRpbmcgaGVyZSBhbmQgdGhlcmUKKyAqICB2MS4wMCAtIERlYyAxNiAyMDAwIC0gWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4KKyAqICAgcG9ydCB0byBzZXh5IDIuNCBpbnRlcmZhY2VzCisgKiAgIHByb3Blcmx5IGFsaWduIGluc3RhbmNlIGFsbG9jYXRpb25zIHNvIHJlY29yZGluZyB3b3JrcworICogICBjbGVhbiB1cCBmdW5jdGlvbiBuYW1lc3BhY2UgYSBsaXR0bGUgOi8KKyAqICAgdXBkYXRlIFBDSSBJRHMgYmFzZWQgb24gbWFpbCBmcm9tIEVTUworICogICBhcmJpdHJhcmlseSBidW1wIHZlcnNpb24gbnVtYmVyIHRvIHNob3cgaXRzIDIuNCBub3csIAorICogICAgICAyLjIgd2lsbCBzdGF5IDAuLCBvc3NfYXVkaW8gcG9ydCBnZXRzIDIuCisgKiAgdjAuMDMgLSBOb3YgMDUgMjAwMCAtIFphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+CisgKiAgIGRpc2FibGUgcmVjb3JkaW5nIGJ1dCBhbGxvdyBkc3AgdG8gYmUgb3BlbmVkIHJlYWQgCisgKiAgIHB1bGwgb3V0IG1vc3Qgc2lsbHkgY29tcGF0IGRlZmluZXMKKyAqICB2MC4wMiAtIE5vdiAwNCAyMDAwIC0gWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4KKyAqICAgY2hhbmdlZCBjbG9ja2luZyBzZXR1cCBmb3IgbTMsIHNsb3dkb3duIGZpeGVkLgorICogICBjb2RlYyByZXNldCBpcyBob3BlZnVsbHkgcmVsaWFibGUgbm93CisgKiAgIHJ1ZGltZW50YXJ5IGFwbS9wb3dlciBtYW5hZ2VtZW50IG1ha2VzIHN1c3BlbmQvcmVzdW1lIHdvcmsKKyAqICB2MC4wMSAtIE9jdCAzMSAyMDAwIC0gWmFjaCBCcm93biA8emFiQHphYmJvLm5ldD4KKyAqICAgZmlyc3QgcmVsZWFzZQorICogIHYwLjAwIC0gU2VwIDA5IDIwMDAgLSBaYWNoIEJyb3duIDx6YWJAemFiYm8ubmV0PgorICogICBmaXJzdCBwYXNzIGRlcml2YXRpb24gZnJvbSBtYWVzdHJvLmMKKyAqCisgKiBUT0RPCisgKiAgaW4vb3V0IGFsbG9jYXRlZCBjb250aWd1b3VzbHkgc28gZnVsbGR1cGxleCBtbWFwIHdpbGwgd29yaz8KKyAqICBubyBiZWVwIG9uIGluaXQgKG11dGUpCisgKiAgcmVzZXR1cCBtc3JjIGRhdGEgbWVtb3J5IGlmIGZyZXEgY2hhbmdlcz8KKyAqCisgKiAgLS0KKyAqCisgKiAgQWxsb3cgbWUgdG8gcmFtYmxlIGEgYml0IGFib3V0IHRoZSBtMyBhcmNoaXRlY3R1cmUuICBUaGUgY29yZSBvZiB0aGUKKyAqICBjaGlwIGlzIHRoZSAnYXNzcCcsIHRoZSBjdXN0b20gRVNTIGRzcCB0aGF0IHJ1bnMgdGhlIHNob3cuICBJdCBoYXMKKyAqICBhIHNtYWxsIGFtb3VudCBvZiBjb2RlIGFuZCBkYXRhIHJhbS4gIEVTUyBkcm9wcyBiaW5hcnkgZHNwIGNvZGUgaW1hZ2VzCisgKiAgb24gb3VyIGhlYWRzLCBidXQgd2UgZG9uJ3QgZ2V0IHRvIHNlZSBzcGVjcyBvbiB0aGUgZHNwLiAgCisgKgorICogIFRoZSBjb25zdGFudCBwaWVjZSBvZiBjb2RlIG9uIHRoZSBkc3AgaXMgdGhlICdrZXJuZWwnLiAgSXQgYWxzbyBoYXMgYSAKKyAqICBjaHVuayBvZiB0aGUgZHNwIG1lbW9yeSB0aGF0IGlzIHN0YXRpY2FsbHkgc2V0IGFzaWRlIGZvciBpdHMgY29udHJvbAorICogIGluZm8uICBUaGlzIGlzIHRoZSBLREFUQSBkZWZpbmVzIGluIG1hZXN0cm8zLmguICBQYXJ0IG9mIGl0cyBjb3JlCisgKiAgZGF0YSBpcyBhIGxpc3Qgb2YgY29kZSBhZGRyZXNzZXMgdGhhdCBwb2ludCB0byB0aGUgcGllY2VzIG9mIERTUCBjb2RlCisgKiAgdGhhdCBpdCBzaG91bGQgd2FsayB0aHJvdWdoIGluIGl0cyBsb29wLiAgVGhlc2Ugb3RoZXIgcGllY2VzIG9mIGNvZGUKKyAqICBkbyB0aGUgcmVhbCB3b3JrLiAgVGhlIGtlcm5lbCBwcmVzdW1hYmx5IGp1bXBzIGludG8gZWFjaCBvZiB0aGVtIGluIHR1cm4uCisgKiAgVGhlc2UgY29kZSBpbWFnZXMgdGVuZCB0byBoYXZlIHRoZWlyIG93biBkYXRhIGFyZWEsIGFuZCBvbmUgY2FuIGhhdmUKKyAqICBtdWx0aXBsZSBkYXRhIGFyZWFzIHJlcHJlc2VudGluZyBkaWZmZXJlbnQgc3RhdGVzIGZvciBlYWNoIG9mIHRoZSAnY2xpZW50CisgKiAgaW5zdGFuY2UnIGNvZGUgcG9ydGlvbnMuICBUaGVyZSBpcyBnZW5lcmFsbHkgYSBsaXN0IGluIHRoZSBrZXJuZWwgZGF0YQorICogIHRoYXQgcG9pbnRzIHRvIHRoZSBkYXRhIGluc3RhbmNlcyBmb3IgYSBnaXZlbiBwaWVjZSBvZiBjb2RlLgorICoKKyAqICBXZSd2ZSBvbmx5IGJlZW4gZ2l2ZW4gdGhlIGJpbmFyeSBpbWFnZSBmb3IgdGhlICdtaW5pc3JjJywgbWluaSBzYW1wbGUgCisgKiAgcmF0ZSBjb252ZXJ0ZXIuICBUaGlzIGlzIHJhdGhlciBhbm5veWluZyBiZWNhdXNlIGl0IGxpbWl0cyB0aGUgd29yaworICogIHdlIGNhbiBkbyBvbiB0aGUgZHNwLCBidXQgaXQgYWxzbyBncmVhdGx5IHNpbXBsaWZpZXMgdGhlIGpvYiBvZiBtYW5hZ2luZworICogIGRzcCBkYXRhIG1lbW9yeSBmb3IgdGhlIGNvZGUgYW5kIGRhdGEgZm9yIG91ciBwbGF5aW5nIHN0cmVhbXMgOikuICBXZQorICogIHN0YXRpY2FsbHkgYWxsb2NhdGUgdGhlIG1pbmlzcmMgY29kZSBpbnRvIGEgcmVnaW9uIHdlICdrbm93JyB0byBiZSBmcmVlCisgKiAgYmFzZWQgb24gdGhlIG1hcCBvZiB0aGUgYmluYXJ5IGtlcm5lbCBpbWFnZSB3ZSdyZSBsb2FkaW5nLiAgV2UgYWxzbyAKKyAqICBzdGF0aWNhbGx5IGFsbG9jYXRlIHRoZSBkYXRhIGFyZWFzIGZvciB0aGUgbWF4aW11bSBudW1iZXIgb2YgcGNtIHN0cmVhbXMKKyAqICB3ZSBjYW4gYmUgZGVhbGluZyB3aXRoLiAgVGhpcyBtYXggaXMgc2V0IGJ5IHRoZSBsZW5ndGggb2YgdGhlIHN0YXRpYyBsaXN0CisgKiAgaW4gdGhlIGtlcm5lbCBkYXRhIHRoYXQgcmVjb3JkcyB0aGUgbnVtYmVyIG9mIG1pbmlzcmMgZGF0YSByZWdpb25zIHdlCisgKiAgY2FuIGhhdmUuICBUaGF0cyByaWdodCwgYWxsIHNvZnR3YXJlIGRzcCBtaXhpbmcgd2l0aCBzdGF0aWMgY29kZSBsaXN0CisgKiAgbGltaXRzLiAgUm9jay4KKyAqCisgKiAgSG93IHNvdW5kIGdvZXMgaW4gYW5kIG91dCBpcyBzdGlsbCBhIHJlbGF0aXZlIG15c3RlcnkuICBJdCBhcHBlYXJzCisgKiAgdGhhdCB0aGUgZHNwIGhhcyB0aGUgYWJpbGl0eSB0byBnZXQgaW5wdXQgYW5kIG91dHB1dCB0aHJvdWdoIHZhcmlvdXMKKyAqICAnY29ubmVjdGlvbnMnLiAgVG8gZG8gSU8gZnJvbSBvciB0byBhIGNvbm5lY3Rpb24sIHlvdSBwdXQgdGhlIGFkZHJlc3MKKyAqICBvZiB0aGUgbWluaXNyYyBjbGllbnQgYXJlYSBpbiB0aGUgc3RhdGljIGtlcm5lbCBkYXRhIGxpc3RzIGZvciB0aGF0IAorICogIGlucHV0IG9yIG91dHB1dC4gIHNvIGZvciBwY20gLT4gZHNwIC0+IG1peGVyLCB3ZSBwdXQgdGhlIG1pbmlzcmMgZGF0YQorICogIGluc3RhbmNlIGluIHRoZSBETUEgbGlzdCBhbmQgYWxzbyBpbiB0aGUgbGlzdCBmb3IgdGhlIG1peGVyLiAgSSBndWVzcworICogIGl0IEp1c3QgS25vd3Mgd2hpY2ggaXMgaW4vb3V0LCBhbmQgd2UgZ2l2ZSBzb21lIGRtYSBjb250cm9sIGluZm8gdGhhdAorICogIGhlbHBzLiAgVGhlcmUgYXJlIGFsbCBzb3J0cyBvZiBjb29sIGlucHV0cy9vdXRwdXRzIHRoYXQgaXQgc2VlbXMgd2UgY2FuJ3QKKyAqICB1c2Ugd2l0aG91dCBkc3AgY29kZSBpbWFnZXMgdGhhdCBrbm93IGhvdyB0byB1c2UgdGhlbS4KKyAqCisgKiAgU28gYXQgaW5pdCB0aW1lIHdlIHByZWxvYWQgYWxsIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBzdHVmZiBhbmQgc2V0IHNvbWUKKyAqICBzeXN0ZW0gd2lkZSBwYXJhbWV0ZXJzLiAgV2hlbiB3ZSByZWFsbHkgZ2V0IGEgc291bmQgdG8gcGxheSB3ZSBidWlsZAorICogIHVwIGl0cyBtaW5pc3JjIGhlYWRlciAoc3RyZWFtIHBhcmFtZXRlcnMsIGJ1ZmZlciBhZGRyZXNzZXMsIGlucHV0L291dHB1dAorICogIHNldHRpbmdzKS4gIFRoZW4gd2UgdGhyb3cgaXRzIGhlYWRlciBvbiB0aGUgdmFyaW91cyBsaXN0cy4gIFdlIGFsc28KKyAqICB0aWNrbGUgc29tZSBLREFUQSBzZXR0aW5ncyB0aGF0IGFzayB0aGUgYXNzcCB0byByYWlzZSBjbG9jayBpbnRlcnJ1cHRzCisgKiAgYW5kIGRvIHNvbWUgYW1vdW50IG9mIHNvZnR3YXJlIG1peGluZyBiZWZvcmUgaGFuZGluZyBkYXRhIHRvIHRoZSBhYzk3LgorICoKKyAqICBTb3JyeSBmb3IgdGhlIHZhZ3VlIGRldGFpbHMuICBGZWVsIGZyZWUgdG8gYXNrIEVyaWMgb3IgbXlzZWxmIGlmIHlvdQorICogIGhhcHBlbiB0byBiZSB0cnlpbmcgdG8gdXNlIHRoaXMgZHJpdmVyIGVsc2V3aGVyZS4gIFBsZWFzZSBhY2NlcHQgbXkKKyAqICBhcG9sb2dpZXMgZm9yIHRoZSBxdWFsaXR5IG9mIHRoZSBPU1Mgc3VwcG9ydCBjb2RlLCBpdHMgcGFzc2VkIHRocm91Z2gKKyAqICB0b28gbWFueSBoYW5kcyBub3cgYW5kIGRlc3BlcmF0ZWx5IHdhbnRzIHRvIGJlIHJldGhvdWdodC4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2luY2x1ZGUgIm1hZXN0cm8zLmgiCisKKyNkZWZpbmUgTV9ERUJVRyAxCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gICAgICAiMS4yMyIKKyNkZWZpbmUgTTNfTU9EVUxFX05BTUUgICAgICAibWFlc3RybzMiCisjZGVmaW5lIFBGWCAgICAgICAgICAgICAgICAgTTNfTU9EVUxFX05BTUUgIjogIgorCisjZGVmaW5lIE0zX1NUQVRFX01BR0lDICAgICAgMHg3MzRkNzI0ZAorI2RlZmluZSBNM19DQVJEX01BR0lDICAgICAgIDB4NjQ2ZTZmNTAKKworI2RlZmluZSBFU1NfRk1UX1NURVJFTyAgICAgIDB4MDEKKyNkZWZpbmUgRVNTX0ZNVF8xNkJJVCAgICAgICAweDAyCisjZGVmaW5lIEVTU19GTVRfTUFTSyAgICAgICAgMHgwMworI2RlZmluZSBFU1NfREFDX1NISUZUICAgICAgIDAgICAKKyNkZWZpbmUgRVNTX0FEQ19TSElGVCAgICAgICA0CisKKyNkZWZpbmUgREFDX1JVTk5JTkcgICAgICAgICAxCisjZGVmaW5lIEFEQ19SVU5OSU5HICAgICAgICAgMgorCisjZGVmaW5lIFNORF9ERVZfRFNQMTYgICAgICAgNSAKKyAgIAorI2lmZGVmIE1fREVCVUcKK3N0YXRpYyBpbnQgZGVidWc7CisjZGVmaW5lIERQTU9EICAgMSAgIC8qIHBlciBtb2R1bGUgbG9hZCAqLworI2RlZmluZSBEUFNUUiAgIDIgICAvKiBwZXIgJ3N0cmVhbScgKi8KKyNkZWZpbmUgRFBTWVMgICAzICAgLyogcGVyIHN5c2NhbGwgKi8KKyNkZWZpbmUgRFBDUkFQICA0ICAgLyogc3R1ZmYgdGhlIHVzZXIgc2hvdWxkbid0IHNlZSB1bmxlc3MgdGhleSdyZSByZWFsbHkgZGVidWdnaW4gKi8KKyNkZWZpbmUgRFBJTlQgICA1ICAgLyogcGVyIGludGVycnVwdCwgTE9UUyAqLworI2RlZmluZSBEUFJJTlRLKERQLCBhcmdzLi4uKSB7aWYgKGRlYnVnID49IChEUCkpIHByaW50ayhLRVJOX0RFQlVHIFBGWCBhcmdzKTt9CisjZWxzZQorI2RlZmluZSBEUFJJTlRLKHgpCisjZW5kaWYKKworc3RydWN0IG0zX2xpc3QgeworICAgIGludCBjdXJsZW47CisgICAgdTE2IG1lbV9hZGRyOworICAgIGludCBtYXg7Cit9OworCitzdGF0aWMgaW50IGV4dGVybmFsX2FtcCA9IDE7CitzdGF0aWMgaW50IGdwaW9fcGluID0gLTE7CisKK3N0cnVjdCBtM19zdGF0ZSB7CisgICAgdW5zaWduZWQgaW50IG1hZ2ljOworICAgIHN0cnVjdCBtM19jYXJkICpjYXJkOworICAgIHVuc2lnbmVkIGNoYXIgZm10LCBlbmFibGU7CisKKyAgICBpbnQgaW5kZXg7CisKKyAgICAvKiB0aGlzIGxvY2tzIGFyb3VuZCB0aGUgb3NzIHN0YXRlIGluIHRoZSBkcml2ZXIgKi8KKwkvKiBubywgdGhpcyBsb2NrIGlzIHJlbW92ZWQgLSBvbmx5IHVzZSBjYXJkLT5sb2NrICovCisJLyogb3RoZXJ3aXNlOiBhZ2FpbnN0IHdoYXQgYXJlIHlvdSBwcm90ZWN0aW5nIG9uIFNNUCAKKwkJd2hlbiBpcnFoYW5kbGVyIHVzZXMgcy0+bG9jaworCQlhbmQgbTNfYXNzcF9yZWFkIHVzZXMgY2FyZC0+bG9jayA/CisJCSovCisgICAgc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKyAgICB3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisgICAgbW9kZV90IG9wZW5fbW9kZTsKKworICAgIGludCBkZXZfYXVkaW87CisKKyAgICBzdHJ1Y3QgYXNzcF9pbnN0YW5jZSB7CisgICAgICAgIHUxNiBjb2RlLCBkYXRhOworICAgIH0gZGFjX2luc3QsIGFkY19pbnN0OworCisgICAgLyogc2hvdWxkIGJlIGluIGRtYWJ1ZiAqLworICAgIHVuc2lnbmVkIGludCByYXRlYWRjLCByYXRlZGFjOworCisgICAgc3RydWN0IGRtYWJ1ZiB7CisgICAgICAgIHZvaWQgKnJhd2J1ZjsKKyAgICAgICAgdW5zaWduZWQgYnVmb3JkZXI7CisgICAgICAgIHVuc2lnbmVkIG51bWZyYWc7CisgICAgICAgIHVuc2lnbmVkIGZyYWdzaGlmdDsKKyAgICAgICAgdW5zaWduZWQgaHdwdHIsIHN3cHRyOworICAgICAgICB1bnNpZ25lZCB0b3RhbF9ieXRlczsKKyAgICAgICAgaW50IGNvdW50OworICAgICAgICB1bnNpZ25lZCBlcnJvcjsgLyogb3Zlci91bmRlcnJ1biAqLworICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworICAgICAgICAvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCisgICAgICAgIHVuc2lnbmVkIGZyYWdzaXplOworICAgICAgICB1bnNpZ25lZCBkbWFzaXplOworICAgICAgICB1bnNpZ25lZCBmcmFnc2FtcGxlczsKKyAgICAgICAgLyogT1NTIHN0dWZmICovCisgICAgICAgIHVuc2lnbmVkIG1hcHBlZDoxOworICAgICAgICB1bnNpZ25lZCByZWFkeToxOyAgICAKKyAgICAgICAgdW5zaWduZWQgZW5kY2xlYXJlZDoxOworICAgICAgICB1bnNpZ25lZCBvc3NmcmFnc2hpZnQ7CisgICAgICAgIGludCBvc3NtYXhmcmFnczsKKyAgICAgICAgdW5zaWduZWQgc3ViZGl2aXNpb247CisgICAgICAgIC8qIG5ldyBpbiBtMyAqLworICAgICAgICBpbnQgbWl4ZXJfaW5kZXgsIGRtYV9pbmRleCwgbXNyY19pbmRleCwgYWRjMV9pbmRleDsKKyAgICAgICAgaW50IGluX2xpc3RzOworICAgICAgICAvKiAyLjQuLiAqLworICAgICAgICBkbWFfYWRkcl90IGhhbmRsZTsKKworICAgIH0gZG1hX2RhYywgZG1hX2FkYzsKK307CisgICAgCitzdHJ1Y3QgbTNfY2FyZCB7CisgICAgdW5zaWduZWQgaW50IG1hZ2ljOworCisgICAgc3RydWN0IG0zX2NhcmQgKm5leHQ7CisKKyAgICBzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5NzsKKyAgICBzcGlubG9ja190IGFjOTdfbG9jazsKKworICAgIGludCBjYXJkX3R5cGU7CisKKyNkZWZpbmUgTlJfRFNQUyAxCisjZGVmaW5lIE1BWF9EU1BTIE5SX0RTUFMKKyAgICBzdHJ1Y3QgbTNfc3RhdGUgY2hhbm5lbHNbTUFYX0RTUFNdOworCisgICAgLyogdGhpcyBsb2NrcyBhcm91bmQgdGhlIHBoeXNpY2FsIHJlZ2lzdGVycyBvbiB0aGUgY2FyZCAqLworICAgIHNwaW5sb2NrX3QgbG9jazsKKworICAgIC8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworICAgIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXY7CisgICAgdTMyIGlvYmFzZTsKKyAgICB1MzIgaXJxOworCisgICAgaW50IGRhY3NfYWN0aXZlOworCisgICAgaW50IHRpbWVyX3VzZXJzOworCisgICAgc3RydWN0IG0zX2xpc3QgIG1zcmNfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXJfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgYWRjMV9saXN0LAorICAgICAgICAgICAgICAgICAgICBkbWFfbGlzdDsKKworICAgIC8qIGZvciBzdG9yaW5nIHJlc2V0IHN0YXRlLi4qLworICAgIHU4IHJlc2V0X3N0YXRlOworCisgICAgdTE2ICpzdXNwZW5kX21lbTsKKyAgICBpbnQgaW5fc3VzcGVuZDsKKyAgICB3YWl0X3F1ZXVlX2hlYWRfdCBzdXNwZW5kX3F1ZXVlOworfTsKKworLyoKKyAqIGFuIGFyYml0cmFyeSB2b2x1bWUgd2Ugc2V0IHRoZSBpbnRlcm5hbAorICogdm9sdW1lIHNldHRpbmdzIHRvIHNvIHRoYXQgdGhlIGFjOTcgdm9sdW1lCisgKiByYW5nZSBpcyBhIGxpdHRsZSBsZXNzIGluc2FuZS4gIDB4N2ZmZiBpcyAKKyAqIG1heC4KKyAqLworI2RlZmluZSBBUkJfVk9MVU1FICggMHg2ODAwICkKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAwLCAxLCAxLCAyIH07CisKK2VudW0geworICAgIEVTU19BTExFR1JPLAorICAgIEVTU19NQUVTVFJPMywKKyAgICAvKgorICAgICAqIGEgbWFlc3RybzMgd2l0aCAnaGFyZHdhcmUgc3RyYXBwaW5nJywgb25seQorICAgICAqIGZvdW5kIGluc2lkZSBFU1M/CisgICAgICovCisgICAgRVNTX01BRVNUUk8zSFcsCit9OworCitzdGF0aWMgY2hhciAqY2FyZF9uYW1lc1tdID0geworICAgIFtFU1NfQUxMRUdST10gPSAiQWxsZWdybyIsCisgICAgW0VTU19NQUVTVFJPM10gPSAiTWFlc3RybzMoaSkiLAorICAgIFtFU1NfTUFFU1RSTzNIV10gPSAiTWFlc3RybzMoaSlodyIKK307CisKKyNpZm5kZWYgUENJX1ZFTkRPUl9FU1MKKyNkZWZpbmUgUENJX1ZFTkRPUl9FU1MgICAgICAweDEyNUQKKyNlbmRpZgorCisjZGVmaW5lIE0zX0RFVklDRShERVYsIFRZUEUpCQkJXAorewkJCQkJCVwKKy52ZW5kb3IJICAgICA9IFBDSV9WRU5ET1JfRVNTLAkJCVwKKy5kZXZpY2UJICAgICA9IERFViwJCQkJXAorLnN1YnZlbmRvciAgID0gUENJX0FOWV9JRCwJCQlcCisuc3ViZGV2aWNlICAgPSBQQ0lfQU5ZX0lELAkJCVwKKy5jbGFzcwkgICAgID0gUENJX0NMQVNTX01VTFRJTUVESUFfQVVESU8gPDwgOCwJXAorLmNsYXNzX21hc2sgID0gMHhmZmZmIDw8IDgsCQkJXAorLmRyaXZlcl9kYXRhID0gVFlQRSwJCQkJXAorfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbTNfaWRfdGFibGVbXSA9IHsKKyAgICBNM19ERVZJQ0UoMHgxOTg4LCBFU1NfQUxMRUdSTyksCisgICAgTTNfREVWSUNFKDB4MTk5OCwgRVNTX01BRVNUUk8zKSwKKyAgICBNM19ERVZJQ0UoMHgxOTlhLCBFU1NfTUFFU1RSTzNIVyksCisgICAgezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSAocGNpLCBtM19pZF90YWJsZSk7CisKKy8qCisgKiByZXBvcnRzIHNlZW0gdG8gaW5kaWNhdGUgdGhhdCB0aGUgbTMgaXMgbGltaXRlZAorICogdG8gMjhiaXQgYnVzIGFkZHJlc3Nlcy4gIGFhYWFyZ2dnaC4uLgorICovCisjZGVmaW5lIE0zX1BDSV9ETUFfTUFTSyAweDBmZmZmZmZmCisKK3N0YXRpYyB1bnNpZ25lZCAKK2xkMih1bnNpZ25lZCBpbnQgeCkKK3sKKyAgICB1bnNpZ25lZCByID0gMDsKKyAgICAKKyAgICBpZiAoeCA+PSAweDEwMDAwKSB7CisgICAgICAgIHggPj49IDE2OworICAgICAgICByICs9IDE2OworICAgIH0KKyAgICBpZiAoeCA+PSAweDEwMCkgeworICAgICAgICB4ID4+PSA4OworICAgICAgICByICs9IDg7CisgICAgfQorICAgIGlmICh4ID49IDB4MTApIHsKKyAgICAgICAgeCA+Pj0gNDsKKyAgICAgICAgciArPSA0OworICAgIH0KKyAgICBpZiAoeCA+PSA0KSB7CisgICAgICAgIHggPj49IDI7CisgICAgICAgIHIgKz0gMjsKKyAgICB9CisgICAgaWYgKHggPj0gMikKKyAgICAgICAgcisrOworICAgIHJldHVybiByOworfQorCitzdGF0aWMgc3RydWN0IG0zX2NhcmQgKmRldnM7CisKKy8qCisgKiBJJ20gbm90IHZlcnkgZ29vZCBhdCBsYXlpbmcgb3V0IGZ1bmN0aW9ucyBpbiBhIGZpbGUgOikKKyAqLworc3RhdGljIGludCBtM19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpidWYpOworc3RhdGljIGludCBtM19zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpOworc3RhdGljIHZvaWQgY2hlY2tfc3VzcGVuZChzdHJ1Y3QgbTNfY2FyZCAqY2FyZCk7CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgbTNfcmVib290X25iID0geworCS5ub3RpZmllcl9jYWxsID0gbTNfbm90aWZpZXIsCit9OworCitzdGF0aWMgdm9pZCBtM19vdXR3KHN0cnVjdCBtM19jYXJkICpjYXJkLAorICAgICAgICB1MTYgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcmVnKQoreworICAgIGNoZWNrX3N1c3BlbmQoY2FyZCk7CisgICAgb3V0dyh2YWx1ZSwgY2FyZC0+aW9iYXNlICsgcmVnKTsKK30KKworc3RhdGljIHUxNiBtM19pbncoc3RydWN0IG0zX2NhcmQgKmNhcmQsIHVuc2lnbmVkIGxvbmcgcmVnKQoreworICAgIGNoZWNrX3N1c3BlbmQoY2FyZCk7CisgICAgcmV0dXJuIGludyhjYXJkLT5pb2Jhc2UgKyByZWcpOworfQorc3RhdGljIHZvaWQgbTNfb3V0YihzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwgCisgICAgICAgIHU4IHZhbHVlLCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKyAgICBjaGVja19zdXNwZW5kKGNhcmQpOworICAgIG91dGIodmFsdWUsIGNhcmQtPmlvYmFzZSArIHJlZyk7Cit9CitzdGF0aWMgdTggbTNfaW5iKHN0cnVjdCBtM19jYXJkICpjYXJkLCB1bnNpZ25lZCBsb25nIHJlZykKK3sKKyAgICBjaGVja19zdXNwZW5kKGNhcmQpOworICAgIHJldHVybiBpbmIoY2FyZC0+aW9iYXNlICsgcmVnKTsKK30KKworLyoKKyAqIGFjY2VzcyAxNmJpdCB3b3JkcyB0byB0aGUgY29kZSBvciBkYXRhIHJlZ2lvbnMgb2YgdGhlIGRzcCdzIG1lbW9yeS4KKyAqIGluZGV4IGFkZHJlc3NlcyAxNmJpdCB3b3Jkcy4KKyAqLworc3RhdGljIHUxNiBfX20zX2Fzc3BfcmVhZChzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwgdTE2IHJlZ2lvbiwgdTE2IGluZGV4KQoreworICAgIG0zX291dHcoY2FyZCwgcmVnaW9uICYgTUVNVFlQRV9NQVNLLCBEU1BfUE9SVF9NRU1PUllfVFlQRSk7CisgICAgbTNfb3V0dyhjYXJkLCBpbmRleCwgRFNQX1BPUlRfTUVNT1JZX0lOREVYKTsKKyAgICByZXR1cm4gbTNfaW53KGNhcmQsIERTUF9QT1JUX01FTU9SWV9EQVRBKTsKK30KK3N0YXRpYyB1MTYgbTNfYXNzcF9yZWFkKHN0cnVjdCBtM19jYXJkICpjYXJkLCB1MTYgcmVnaW9uLCB1MTYgaW5kZXgpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICB1MTYgcmV0OworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJihjYXJkLT5sb2NrKSwgZmxhZ3MpOworICAgIHJldCA9IF9fbTNfYXNzcF9yZWFkKGNhcmQsIHJlZ2lvbiwgaW5kZXgpOworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJihjYXJkLT5sb2NrKSwgZmxhZ3MpOworCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19tM19hc3NwX3dyaXRlKHN0cnVjdCBtM19jYXJkICpjYXJkLCAKKyAgICAgICAgdTE2IHJlZ2lvbiwgdTE2IGluZGV4LCB1MTYgZGF0YSkKK3sKKyAgICBtM19vdXR3KGNhcmQsIHJlZ2lvbiAmIE1FTVRZUEVfTUFTSywgRFNQX1BPUlRfTUVNT1JZX1RZUEUpOworICAgIG0zX291dHcoY2FyZCwgaW5kZXgsIERTUF9QT1JUX01FTU9SWV9JTkRFWCk7CisgICAgbTNfb3V0dyhjYXJkLCBkYXRhLCBEU1BfUE9SVF9NRU1PUllfREFUQSk7Cit9CitzdGF0aWMgdm9pZCBtM19hc3NwX3dyaXRlKHN0cnVjdCBtM19jYXJkICpjYXJkLCAKKyAgICAgICAgdTE2IHJlZ2lvbiwgdTE2IGluZGV4LCB1MTYgZGF0YSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJihjYXJkLT5sb2NrKSwgZmxhZ3MpOworICAgIF9fbTNfYXNzcF93cml0ZShjYXJkLCByZWdpb24sIGluZGV4LCBkYXRhKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCYoY2FyZC0+bG9jayksIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgbTNfYXNzcF9oYWx0KHN0cnVjdCBtM19jYXJkICpjYXJkKQoreworICAgIGNhcmQtPnJlc2V0X3N0YXRlID0gbTNfaW5iKGNhcmQsIERTUF9QT1JUX0NPTlRST0xfUkVHX0IpICYgflJFR0JfU1RPUF9DTE9DSzsKKyAgICBtZGVsYXkoMTApOworICAgIG0zX291dGIoY2FyZCwgY2FyZC0+cmVzZXRfc3RhdGUgJiB+UkVHQl9FTkFCTEVfUkVTRVQsIERTUF9QT1JUX0NPTlRST0xfUkVHX0IpOworfQorCitzdGF0aWMgdm9pZCBtM19hc3NwX2NvbnRpbnVlKHN0cnVjdCBtM19jYXJkICpjYXJkKQoreworICAgIG0zX291dGIoY2FyZCwgY2FyZC0+cmVzZXRfc3RhdGUgfCBSRUdCX0VOQUJMRV9SRVNFVCwgRFNQX1BPUlRfQ09OVFJPTF9SRUdfQik7Cit9CisKKy8qCisgKiBUaGlzIG1ha2VzIG1lIHNhZC4gdGhlIG1hZXN0cm8zIGhhcyBsaXN0cworICogaW50ZXJuYWxseSB0aGF0IG11c3QgYmUgcGFja2VkLi4gMCB0ZXJtaW5hdGVzLAorICogYXBwYXJlbnRseSwgb3IgbWF5YmUgYWxsIHVudXNlZCBlbnRyaWVzIGhhdmUKKyAqIHRvIGJlIDAsIHRoZSBsaXN0cyBoYXZlIHN0YXRpYyBsZW5ndGhzIHNldAorICogYnkgdGhlIGJpbmFyeSBjb2RlIGltYWdlcy4KKyAqLworCitzdGF0aWMgaW50IG0zX2FkZF9saXN0KHN0cnVjdCBtM19jYXJkICpjYXJkLAorICAgICAgICBzdHJ1Y3QgbTNfbGlzdCAqbGlzdCwgdTE2IHZhbCkKK3sKKyAgICBEUFJJTlRLKERQU1RSLCAiYWRkaW5nIHZhbCAweCV4IHRvIGxpc3QgMHglcCBhdCBwb3MgJWRcbiIsCisgICAgICAgICAgICB2YWwsIGxpc3QsIGxpc3QtPmN1cmxlbik7CisKKyAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIGxpc3QtPm1lbV9hZGRyICsgbGlzdC0+Y3VybGVuLAorICAgICAgICAgICAgdmFsKTsKKworICAgIHJldHVybiBsaXN0LT5jdXJsZW4rKzsKKworfQorCitzdGF0aWMgdm9pZCBtM19yZW1vdmVfbGlzdChzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwKKyAgICAgICAgc3RydWN0IG0zX2xpc3QgKmxpc3QsIGludCBpbmRleCkKK3sKKyAgICB1MTYgIHZhbDsKKyAgICBpbnQgbGFzdGluZGV4ID0gbGlzdC0+Y3VybGVuIC0gMTsKKworICAgIERQUklOVEsoRFBTVFIsICJyZW1vdmluZyBpbmQgJWQgZnJvbSBsaXN0IDB4JXBcbiIsCisgICAgICAgICAgICBpbmRleCwgbGlzdCk7CisKKyAgICBpZihpbmRleCAhPSBsYXN0aW5kZXgpIHsKKyAgICAgICAgdmFsID0gbTNfYXNzcF9yZWFkKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgICAgICBsaXN0LT5tZW1fYWRkciArIGxhc3RpbmRleCk7CisgICAgICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgICAgIGxpc3QtPm1lbV9hZGRyICsgaW5kZXgsCisgICAgICAgICAgICAgICAgdmFsKTsKKyAgICB9CisKKyAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIGxpc3QtPm1lbV9hZGRyICsgbGFzdGluZGV4LAorICAgICAgICAgICAgMCk7CisKKyAgICBsaXN0LT5jdXJsZW4tLTsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZtdChzdHJ1Y3QgbTNfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgbWFzaywgdW5zaWduZWQgY2hhciBkYXRhKQoreworICAgIGludCB0bXA7CisKKyAgICBzLT5mbXQgPSAocy0+Zm10ICYgbWFzaykgfCBkYXRhOworCisgICAgdG1wID0gKHMtPmZtdCA+PiBFU1NfREFDX1NISUZUKSAmIEVTU19GTVRfTUFTSzsKKworICAgIC8qIHdyaXRlIHRvICdtb25vJyB3b3JkICovCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgU1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMSwgCisgICAgICAgICAgICAodG1wICYgRVNTX0ZNVF9TVEVSRU8pID8gMCA6IDEpOworICAgIC8qIHdyaXRlIHRvICc4Yml0JyB3b3JkICovCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgU1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMiwgCisgICAgICAgICAgICAodG1wICYgRVNTX0ZNVF8xNkJJVCkgPyAwIDogMSk7CisKKyAgICB0bXAgPSAocy0+Zm10ID4+IEVTU19BRENfU0hJRlQpICYgRVNTX0ZNVF9NQVNLOworCisgICAgLyogd3JpdGUgdG8gJ21vbm8nIHdvcmQgKi8KKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxLCAKKyAgICAgICAgICAgICh0bXAgJiBFU1NfRk1UX1NURVJFTykgPyAwIDogMSk7CisgICAgLyogd3JpdGUgdG8gJzhiaXQnIHdvcmQgKi8KKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAyLCAKKyAgICAgICAgICAgICh0bXAgJiBFU1NfRk1UXzE2QklUKSA/IDAgOiAxKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2RhY19yYXRlKHN0cnVjdCBtM19zdGF0ZSAqcywgdW5zaWduZWQgaW50IHJhdGUpCit7CisgICAgdTMyIGZyZXE7CisKKyAgICBpZiAocmF0ZSA+IDQ4MDAwKQorICAgICAgICByYXRlID0gNDgwMDA7CisgICAgaWYgKHJhdGUgPCA4MDAwKQorICAgICAgICByYXRlID0gODAwMDsKKworICAgIHMtPnJhdGVkYWMgPSByYXRlOworCisgICAgZnJlcSA9ICgocmF0ZSA8PCAxNSkgKyAyNDAwMCApIC8gNDgwMDA7CisgICAgaWYoZnJlcSkgCisgICAgICAgIGZyZXEtLTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0ZSRVFVRU5DWSwKKyAgICAgICAgICAgIGZyZXEpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYWRjX3JhdGUoc3RydWN0IG0zX3N0YXRlICpzLCB1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKyAgICB1MzIgZnJlcTsKKworICAgIGlmIChyYXRlID4gNDgwMDApCisgICAgICAgIHJhdGUgPSA0ODAwMDsKKyAgICBpZiAocmF0ZSA8IDgwMDApCisgICAgICAgIHJhdGUgPSA4MDAwOworCisgICAgcy0+cmF0ZWFkYyA9IHJhdGU7CisKKyAgICBmcmVxID0gKChyYXRlIDw8IDE1KSArIDI0MDAwICkgLyA0ODAwMDsKKyAgICBpZihmcmVxKSAKKyAgICAgICAgZnJlcS0tOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfRlJFUVVFTkNZLAorICAgICAgICAgICAgZnJlcSk7Cit9CisKK3N0YXRpYyB2b2lkIGluY190aW1lcl91c2VycyhzdHJ1Y3QgbTNfY2FyZCAqY2FyZCkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAKKyAgICBjYXJkLT50aW1lcl91c2VycysrOworICAgIERQUklOVEsoRFBTWVMsICJpbmMgdGltZXIgdXNlcnMgbm93ICVkXG4iLAorICAgICAgICAgICAgY2FyZC0+dGltZXJfdXNlcnMpOworICAgIGlmKGNhcmQtPnRpbWVyX3VzZXJzICE9IDEpIAorICAgICAgICBnb3RvIG91dDsKKworICAgIF9fbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIEtEQVRBX1RJTUVSX0NPVU5UX1JFTE9BRCwKKyAgICAgICAgIDI0MCApIDsKKworICAgIF9fbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIEtEQVRBX1RJTUVSX0NPVU5UX0NVUlJFTlQsCisgICAgICAgICAyNDAgKSA7CisKKyAgICBtM19vdXR3KGNhcmQsICAKKyAgICAgICAgICAgIG0zX2ludyhjYXJkLCBIT1NUX0lOVF9DVFJMKSB8IENMS1JVTl9HRU5fRU5BQkxFLAorICAgICAgICAgICAgSE9TVF9JTlRfQ1RSTCk7CitvdXQ6CisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkZWNfdGltZXJfdXNlcnMoc3RydWN0IG0zX2NhcmQgKmNhcmQpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICBjYXJkLT50aW1lcl91c2Vycy0tOworICAgIERQUklOVEsoRFBTWVMsICJkZWMgdGltZXIgdXNlcnMgbm93ICVkXG4iLAorICAgICAgICAgICAgY2FyZC0+dGltZXJfdXNlcnMpOworICAgIGlmKGNhcmQtPnRpbWVyX3VzZXJzID4gMCApIAorICAgICAgICBnb3RvIG91dDsKKworICAgIF9fbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIEtEQVRBX1RJTUVSX0NPVU5UX1JFTE9BRCwKKyAgICAgICAgIDAgKSA7CisKKyAgICBfX20zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBLREFUQV9USU1FUl9DT1VOVF9DVVJSRU5ULAorICAgICAgICAgMCApIDsKKworICAgIG0zX291dHcoY2FyZCwgIG0zX2ludyhjYXJkLCBIT1NUX0lOVF9DVFJMKSAmIH5DTEtSVU5fR0VOX0VOQUJMRSwKKyAgICAgICAgICAgIEhPU1RfSU5UX0NUUkwpOworb3V0OgorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIHtzdGFydCxzdG9wfV97YWRjLGRhY30gc2hvdWxkIGJlIGNhbGxlZAorICogd2hpbGUgaG9sZGluZyB0aGUgJ3N0YXRlJyBsb2NrIGFuZCB0aGV5CisgKiB3aWxsIHRyeSB0byBncmFiIHRoZSAnY2FyZCcgbG9jay4uCisgKi8KK3N0YXRpYyB2b2lkIHN0b3BfYWRjKHN0cnVjdCBtM19zdGF0ZSAqcykKK3sKKyAgICBpZiAoISAocy0+ZW5hYmxlICYgQURDX1JVTk5JTkcpKSAKKyAgICAgICAgcmV0dXJuOworCisgICAgcy0+ZW5hYmxlICY9IH5BRENfUlVOTklORzsKKyAgICBkZWNfdGltZXJfdXNlcnMocy0+Y2FyZCk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9JTlNUQU5DRV9SRUFEWSwgMCk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIEtEQVRBX0FEQzFfUkVRVUVTVCwgMCk7Cit9ICAgIAorCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgbTNfc3RhdGUgKnMpCit7CisgICAgaWYgKCEgKHMtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSkgCisgICAgICAgIHJldHVybjsKKworICAgIERQUklOVEsoRFBTWVMsICJzdG9wX2RhYygpXG4iKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0lOU1RBTkNFX1JFQURZLCAwKTsKKworICAgIHMtPmVuYWJsZSAmPSB+REFDX1JVTk5JTkc7CisgICAgcy0+Y2FyZC0+ZGFjc19hY3RpdmUtLTsKKyAgICBkZWNfdGltZXJfdXNlcnMocy0+Y2FyZCk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIEtEQVRBX01JWEVSX1RBU0tfTlVNQkVSLCAKKyAgICAgICAgICAgIHMtPmNhcmQtPmRhY3NfYWN0aXZlICkgOworfSAgICAKKworc3RhdGljIHZvaWQgc3RhcnRfZGFjKHN0cnVjdCBtM19zdGF0ZSAqcykKK3sKKyAgICBpZiggKCFzLT5kbWFfZGFjLm1hcHBlZCAmJiBzLT5kbWFfZGFjLmNvdW50IDwgMSkgfHwKKyAgICAgICAgICAgICFzLT5kbWFfZGFjLnJlYWR5IHx8CisgICAgICAgICAgICAocy0+ZW5hYmxlICYgREFDX1JVTk5JTkcpKSAKKyAgICAgICAgcmV0dXJuOworCisgICAgRFBSSU5USyhEUFNZUywgInN0YXJ0X2RhYygpXG4iKTsKKworICAgIHMtPmVuYWJsZSB8PSBEQUNfUlVOTklORzsKKyAgICBzLT5jYXJkLT5kYWNzX2FjdGl2ZSsrOworICAgIGluY190aW1lcl91c2VycyhzLT5jYXJkKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0lOU1RBTkNFX1JFQURZLCAxKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgS0RBVEFfTUlYRVJfVEFTS19OVU1CRVIsIAorICAgICAgICAgICAgcy0+Y2FyZC0+ZGFjc19hY3RpdmUgKSA7Cit9ICAgIAorCitzdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IG0zX3N0YXRlICpzKQoreworICAgIGlmICgoISBzLT5kbWFfYWRjLm1hcHBlZCAmJgorICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuY291bnQgPj0gKHNpZ25lZCkocy0+ZG1hX2FkYy5kbWFzaXplIC0gMipzLT5kbWFfYWRjLmZyYWdzaXplKSkgCisgICAgICAgIHx8ICFzLT5kbWFfYWRjLnJlYWR5IAorICAgICAgICB8fCAocy0+ZW5hYmxlICYgQURDX1JVTk5JTkcpICkgCisgICAgICAgICAgICByZXR1cm47CisKKyAgICBEUFJJTlRLKERQU1lTLCAic3RhcnRfYWRjKClcbiIpOworCisgICAgcy0+ZW5hYmxlIHw9IEFEQ19SVU5OSU5HOworICAgIGluY190aW1lcl91c2VycyhzLT5jYXJkKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgS0RBVEFfQURDMV9SRVFVRVNULCAxKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX0lOU1RBTkNFX1JFQURZLCAxKTsKK30gICAgCisKK3N0YXRpYyBzdHJ1Y3QgcGxheV92YWxzIHsKKyAgICB1MTYgYWRkciwgdmFsOworfSBwdltdID0geworICAgIHtDREFUQV9MRUZUX1ZPTFVNRSwgQVJCX1ZPTFVNRX0sCisgICAge0NEQVRBX1JJR0hUX1ZPTFVNRSwgQVJCX1ZPTFVNRX0sCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCwgMH0gLAorICAgIC8qICsxLCArMiBhcmUgc3RlcmVvLzE2IGJpdCAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAzLCAweDAwMDB9LCAvKiBmcmFjdGlvbj8gKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgNCwgMH0sIC8qIGZpcnN0IGwgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgNSwgMH0sIC8qIGZpcnN0IHIgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgNiwgMH0sIC8qIHNlY29uZCBsICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDcsIDB9LCAvKiBzZWNvbmQgciAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyA4LCAwfSwgLyogZGVsdGEgbCAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyA5LCAwfSwgLyogZGVsdGEgciAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxMCwgMHg4MDAwfSwgLyogcm91bmQgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTEsIDB4RkYwMH0sIC8qIGhpZ2hlciBidXRlIG1hcmsgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTMsIDB9LCAvKiB0ZW1wMCAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxNCwgMH0sIC8qIGMgZnJhY3Rpb24gKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTUsIDB9LCAvKiBjb3VudGVyICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE2LCA4fSwgLyogbnVtaW4gKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTcsIDUwKjJ9LCAvKiBudW1vdXQgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTgsIE1JTklTUkNfQklRVUFEX1NUQUdFIC0gMX0sIC8qIG51bXN0YWdlICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDIwLCAwfSwgLyogZmlsdGVydGFwICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDIxLCAwfSAvKiBib29zdGVyICovCit9OworCisKKy8qIHRoZSBtb2RlIHBhc3NlZCBzaG91bGQgYmUgYWxyZWFkeSBzaGlmdGVkIGFuZCBtYXNrZWQgKi8KK3N0YXRpYyB2b2lkIG0zX3BsYXlfc2V0dXAoc3RydWN0IG0zX3N0YXRlICpzLCBpbnQgbW9kZSwgdTMyIHJhdGUsIHZvaWQgKmJ1ZmZlciwgaW50IHNpemUpCit7CisgICAgaW50IGRzcF9pbl9zaXplID0gTUlOSVNSQ19JTl9CVUZGRVJfU0laRSAtICgweDIwICogMik7CisgICAgaW50IGRzcF9vdXRfc2l6ZSA9IE1JTklTUkNfT1VUX0JVRkZFUl9TSVpFIC0gKDB4MjAgKiAyKTsKKyAgICBpbnQgZHNwX2luX2J1ZmZlciA9IHMtPmRhY19pbnN0LmRhdGEgKyAoTUlOSVNSQ19UTVBfQlVGRkVSX1NJWkUgLyAyKTsKKyAgICBpbnQgZHNwX291dF9idWZmZXIgPSBkc3BfaW5fYnVmZmVyICsgKGRzcF9pbl9zaXplIC8gMikgKyAxOworICAgIHN0cnVjdCBkbWFidWYgKmRiID0gJnMtPmRtYV9kYWM7CisgICAgaW50IGk7CisKKyAgICBEUFJJTlRLKERQU1RSLCAibW9kZT0lZCByYXRlPSVkIGJ1Zj0lcCBsZW49JWQuXG4iLAorICAgICAgICBtb2RlLCByYXRlLCBidWZmZXIsIHNpemUpOworCisjZGVmaW5lIExPKHgpICgoeCkgJiAweGZmZmYpCisjZGVmaW5lIEhJKHgpIExPKCh4KSA+PiAxNikKKworICAgIC8qIGhvc3QgZG1hIGJ1ZmZlciBwb2ludGVycyAqLworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19BRERSTCwKKyAgICAgICAgTE8odmlydF90b19idXMoYnVmZmVyKSkpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19BRERSSCwKKyAgICAgICAgSEkodmlydF90b19idXMoYnVmZmVyKSkpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19FTkRfUExVU18xTCwKKyAgICAgICAgTE8odmlydF90b19idXMoYnVmZmVyKSArIHNpemUpKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgQ0RBVEFfSE9TVF9TUkNfRU5EX1BMVVNfMUgsCisgICAgICAgIEhJKHZpcnRfdG9fYnVzKGJ1ZmZlcikgKyBzaXplKSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0NVUlJFTlRMLAorICAgICAgICBMTyh2aXJ0X3RvX2J1cyhidWZmZXIpKSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0NVUlJFTlRILAorICAgICAgICBISSh2aXJ0X3RvX2J1cyhidWZmZXIpKSk7CisjdW5kZWYgTE8KKyN1bmRlZiBISQorCisgICAgLyogZHNwIGJ1ZmZlcnMgKi8KKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgQ0RBVEFfSU5fQlVGX0JFR0lOLAorICAgICAgICBkc3BfaW5fYnVmZmVyKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgQ0RBVEFfSU5fQlVGX0VORF9QTFVTXzEsCisgICAgICAgIGRzcF9pbl9idWZmZXIgKyAoZHNwX2luX3NpemUgLyAyKSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0lOX0JVRl9IRUFELAorICAgICAgICBkc3BfaW5fYnVmZmVyKTsKKyAgICAKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0lOX0JVRl9UQUlMLAorICAgICAgICBkc3BfaW5fYnVmZmVyKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgQ0RBVEFfT1VUX0JVRl9CRUdJTiwKKyAgICAgICAgZHNwX291dF9idWZmZXIpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBDREFUQV9PVVRfQlVGX0VORF9QTFVTXzEsCisgICAgICAgIGRzcF9vdXRfYnVmZmVyICsgKGRzcF9vdXRfc2l6ZSAvIDIpKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgQ0RBVEFfT1VUX0JVRl9IRUFELAorICAgICAgICBkc3Bfb3V0X2J1ZmZlcik7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX09VVF9CVUZfVEFJTCwKKyAgICAgICAgZHNwX291dF9idWZmZXIpOworCisgICAgLyoKKyAgICAgKiBzb21lIHBlciBjbGllbnQgaW5pdGlhbGl6ZXJzCisgICAgICovCisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIFNSQzNfRElSRUNUSU9OX09GRlNFVCArIDEyLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgNDAgKyA4KTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5kYWNfaW5zdC5kYXRhICsgU1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTksCisgICAgICAgIHMtPmRhY19pbnN0LmNvZGUgKyBNSU5JU1JDX0NPRUZfTE9DKTsKKworICAgIC8qIGVuYWJsZSBvciBkaXNhYmxlIGxvdyBwYXNzIGZpbHRlcj8gKi8KKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIFNSQzNfRElSRUNUSU9OX09GRlNFVCArIDIyLAorICAgICAgICBzLT5yYXRlZGFjID4gNDUwMDAgPyAweGZmIDogMCApOworICAgIAorICAgIC8qIHRlbGwgaXQgd2hpY2ggd2F5IGRtYSBpcyBnb2luZz8gKi8KKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+ZGFjX2luc3QuZGF0YSArIENEQVRBX0RNQV9DT05UUk9MLAorICAgICAgICBETUFDT05UUk9MX0FVVE9SRVBFQVQgKyBETUFDX1BBR0UzX1NFTEVDVE9SICsgRE1BQ19CTE9DS0ZfU0VMRUNUT1IpOworCisgICAgLyoKKyAgICAgKiBzZXQgYW4gYXJtbG9hZCBvZiBzdGF0aWMgaW5pdGlhbGl6ZXJzCisgICAgICovCisgICAgZm9yKGkgPSAwIDsgaSA8IChzaXplb2YocHYpIC8gc2l6ZW9mKHB2WzBdKSkgOyBpKyspIAorICAgICAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgKyBwdltpXS5hZGRyLCBwdltpXS52YWwpOworCisgICAgLyogCisgICAgICogcHV0IHVzIGluIHRoZSBsaXN0cyBpZiB3ZSdyZSBub3QgYWxyZWFkeSB0aGVyZQorICAgICAqLworCisgICAgaWYoZGItPmluX2xpc3RzID09IDApIHsKKworICAgICAgICBkYi0+bXNyY19pbmRleCA9IG0zX2FkZF9saXN0KHMtPmNhcmQsICZzLT5jYXJkLT5tc3JjX2xpc3QsIAorICAgICAgICAgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgPj4gRFBfU0hJRlRfQ09VTlQpOworCisgICAgICAgIGRiLT5kbWFfaW5kZXggPSBtM19hZGRfbGlzdChzLT5jYXJkLCAmcy0+Y2FyZC0+ZG1hX2xpc3QsIAorICAgICAgICAgICAgICAgIHMtPmRhY19pbnN0LmRhdGEgPj4gRFBfU0hJRlRfQ09VTlQpOworCisgICAgICAgIGRiLT5taXhlcl9pbmRleCA9IG0zX2FkZF9saXN0KHMtPmNhcmQsICZzLT5jYXJkLT5taXhlcl9saXN0LCAKKyAgICAgICAgICAgICAgICBzLT5kYWNfaW5zdC5kYXRhID4+IERQX1NISUZUX0NPVU5UKTsKKworICAgICAgICBkYi0+aW5fbGlzdHMgPSAxOworICAgIH0KKworICAgIHNldF9kYWNfcmF0ZShzLHJhdGUpOworICAgIHN0YXJ0X2RhYyhzKTsKK30KKworLyoKKyAqICAgIE5hdGl2ZSByZWNvcmQgZHJpdmVyIAorICovCitzdGF0aWMgc3RydWN0IHJlY192YWxzIHsKKyAgICB1MTYgYWRkciwgdmFsOworfSBydltdID0geworICAgIHtDREFUQV9MRUZUX1ZPTFVNRSwgQVJCX1ZPTFVNRX0sCisgICAge0NEQVRBX1JJR0hUX1ZPTFVNRSwgQVJCX1ZPTFVNRX0sCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCwgMX0gLAorICAgIC8qICsxLCArMiBhcmUgc3RlcmVvLzE2IGJpdCAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAzLCAweDAwMDB9LCAvKiBmcmFjdGlvbj8gKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgNCwgMH0sIC8qIGZpcnN0IGwgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgNSwgMH0sIC8qIGZpcnN0IHIgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgNiwgMH0sIC8qIHNlY29uZCBsICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDcsIDB9LCAvKiBzZWNvbmQgciAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyA4LCAwfSwgLyogZGVsdGEgbCAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyA5LCAwfSwgLyogZGVsdGEgciAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxMCwgMHg4MDAwfSwgLyogcm91bmQgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTEsIDB4RkYwMH0sIC8qIGhpZ2hlciBidXRlIG1hcmsgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTMsIDB9LCAvKiB0ZW1wMCAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxNCwgMH0sIC8qIGMgZnJhY3Rpb24gKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTUsIDB9LCAvKiBjb3VudGVyICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDE2LCA1MH0sLyogbnVtaW4gKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTcsIDh9LCAvKiBudW1vdXQgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTgsIDB9LCAvKiBudW1zdGFnZSAqLworICAgIHtTUkMzX0RJUkVDVElPTl9PRkZTRVQgKyAxOSwgMH0sIC8qIGNvZWYgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMjAsIDB9LCAvKiBmaWx0ZXJ0YXAgKi8KKyAgICB7U1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMjEsIDB9LCAvKiBib29zdGVyICovCisgICAge1NSQzNfRElSRUNUSU9OX09GRlNFVCArIDIyLCAweGZmfSAvKiBza2lwIGxwZiAqLworfTsKKworLyogYWdhaW4sIHBhc3NlZCBtb2RlIGlzIGFscmFkeSBzaGlmdGVkL21hc2tlZCAqLworc3RhdGljIHZvaWQgbTNfcmVjX3NldHVwKHN0cnVjdCBtM19zdGF0ZSAqcywgaW50IG1vZGUsIHUzMiByYXRlLCB2b2lkICpidWZmZXIsIGludCBzaXplKQoreworICAgIGludCBkc3BfaW5fc2l6ZSA9IE1JTklTUkNfSU5fQlVGRkVSX1NJWkUgKyAoMHgxMCAqIDIpOworICAgIGludCBkc3Bfb3V0X3NpemUgPSBNSU5JU1JDX09VVF9CVUZGRVJfU0laRSAtICgweDEwICogMik7CisgICAgaW50IGRzcF9pbl9idWZmZXIgPSBzLT5hZGNfaW5zdC5kYXRhICsgKE1JTklTUkNfVE1QX0JVRkZFUl9TSVpFIC8gMik7CisgICAgaW50IGRzcF9vdXRfYnVmZmVyID0gZHNwX2luX2J1ZmZlciArIChkc3BfaW5fc2l6ZSAvIDIpICsgMTsKKyAgICBzdHJ1Y3QgZG1hYnVmICpkYiA9ICZzLT5kbWFfYWRjOworICAgIGludCBpOworCisgICAgRFBSSU5USyhEUFNUUiwgInJlY19zZXR1cCBtb2RlPSVkIHJhdGU9JWQgYnVmPSVwIGxlbj0lZC5cbiIsCisgICAgICAgIG1vZGUsIHJhdGUsIGJ1ZmZlciwgc2l6ZSk7CisKKyNkZWZpbmUgTE8oeCkgKCh4KSAmIDB4ZmZmZikKKyNkZWZpbmUgSEkoeCkgTE8oKHgpID4+IDE2KQorCisgICAgLyogaG9zdCBkbWEgYnVmZmVyIHBvaW50ZXJzICovCisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0FERFJMLAorICAgICAgICBMTyh2aXJ0X3RvX2J1cyhidWZmZXIpKSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0FERFJILAorICAgICAgICBISSh2aXJ0X3RvX2J1cyhidWZmZXIpKSk7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX0hPU1RfU1JDX0VORF9QTFVTXzFMLAorICAgICAgICBMTyh2aXJ0X3RvX2J1cyhidWZmZXIpICsgc2l6ZSkpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9IT1NUX1NSQ19FTkRfUExVU18xSCwKKyAgICAgICAgSEkodmlydF90b19idXMoYnVmZmVyKSArIHNpemUpKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfSE9TVF9TUkNfQ1VSUkVOVEwsCisgICAgICAgIExPKHZpcnRfdG9fYnVzKGJ1ZmZlcikpKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfSE9TVF9TUkNfQ1VSUkVOVEgsCisgICAgICAgIEhJKHZpcnRfdG9fYnVzKGJ1ZmZlcikpKTsKKyN1bmRlZiBMTworI3VuZGVmIEhJCisKKyAgICAvKiBkc3AgYnVmZmVycyAqLworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9JTl9CVUZfQkVHSU4sCisgICAgICAgIGRzcF9pbl9idWZmZXIpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9JTl9CVUZfRU5EX1BMVVNfMSwKKyAgICAgICAgZHNwX2luX2J1ZmZlciArIChkc3BfaW5fc2l6ZSAvIDIpKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfSU5fQlVGX0hFQUQsCisgICAgICAgIGRzcF9pbl9idWZmZXIpOworICAgIAorICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfSU5fQlVGX1RBSUwsCisgICAgICAgIGRzcF9pbl9idWZmZXIpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9PVVRfQlVGX0JFR0lOLAorICAgICAgICBkc3Bfb3V0X2J1ZmZlcik7CisKKyAgICBtM19hc3NwX3dyaXRlKHMtPmNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIENEQVRBX09VVF9CVUZfRU5EX1BMVVNfMSwKKyAgICAgICAgZHNwX291dF9idWZmZXIgKyAoZHNwX291dF9zaXplIC8gMikpOworCisgICAgbTNfYXNzcF93cml0ZShzLT5jYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyBDREFUQV9PVVRfQlVGX0hFQUQsCisgICAgICAgIGRzcF9vdXRfYnVmZmVyKTsKKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfT1VUX0JVRl9UQUlMLAorICAgICAgICBkc3Bfb3V0X2J1ZmZlcik7CisKKyAgICAvKgorICAgICAqIHNvbWUgcGVyIGNsaWVudCBpbml0aWFsaXplcnMKKyAgICAgKi8KKworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgU1JDM19ESVJFQ1RJT05fT0ZGU0VUICsgMTIsCisgICAgICAgIHMtPmFkY19pbnN0LmRhdGEgKyA0MCArIDgpOworCisgICAgLyogdGVsbCBpdCB3aGljaCB3YXkgZG1hIGlzIGdvaW5nPyAqLworICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICBzLT5hZGNfaW5zdC5kYXRhICsgQ0RBVEFfRE1BX0NPTlRST0wsCisgICAgICAgIERNQUNPTlRST0xfRElSRUNUSU9OICsgRE1BQ09OVFJPTF9BVVRPUkVQRUFUICsgCisgICAgICAgIERNQUNfUEFHRTNfU0VMRUNUT1IgKyBETUFDX0JMT0NLRl9TRUxFQ1RPUik7CisKKyAgICAvKgorICAgICAqIHNldCBhbiBhcm1sb2FkIG9mIHN0YXRpYyBpbml0aWFsaXplcnMKKyAgICAgKi8KKyAgICBmb3IoaSA9IDAgOyBpIDwgKHNpemVvZihydikgLyBzaXplb2YocnZbMF0pKSA7IGkrKykgCisgICAgICAgIG0zX2Fzc3Bfd3JpdGUocy0+Y2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgcy0+YWRjX2luc3QuZGF0YSArIHJ2W2ldLmFkZHIsIHJ2W2ldLnZhbCk7CisKKyAgICAvKiAKKyAgICAgKiBwdXQgdXMgaW4gdGhlIGxpc3RzIGlmIHdlJ3JlIG5vdCBhbHJlYWR5IHRoZXJlCisgICAgICovCisKKyAgICBpZihkYi0+aW5fbGlzdHMgPT0gMCkgeworCisgICAgICAgIGRiLT5hZGMxX2luZGV4ID0gbTNfYWRkX2xpc3Qocy0+Y2FyZCwgJnMtPmNhcmQtPmFkYzFfbGlzdCwgCisgICAgICAgICAgICAgICAgcy0+YWRjX2luc3QuZGF0YSA+PiBEUF9TSElGVF9DT1VOVCk7CisKKyAgICAgICAgZGItPmRtYV9pbmRleCA9IG0zX2FkZF9saXN0KHMtPmNhcmQsICZzLT5jYXJkLT5kbWFfbGlzdCwgCisgICAgICAgICAgICAgICAgcy0+YWRjX2luc3QuZGF0YSA+PiBEUF9TSElGVF9DT1VOVCk7CisKKyAgICAgICAgZGItPm1zcmNfaW5kZXggPSBtM19hZGRfbGlzdChzLT5jYXJkLCAmcy0+Y2FyZC0+bXNyY19saXN0LCAKKyAgICAgICAgICAgICAgICBzLT5hZGNfaW5zdC5kYXRhID4+IERQX1NISUZUX0NPVU5UKTsKKworICAgICAgICBkYi0+aW5fbGlzdHMgPSAxOworICAgIH0KKworICAgIHNldF9hZGNfcmF0ZShzLHJhdGUpOworICAgIHN0YXJ0X2FkYyhzKTsKK30KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgdm9pZCBzZXRfZG1hYShzdHJ1Y3QgbTNfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisgICAgRFBSSU5USyhEUElOVCwic2V0X2RtYWE/P1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kbWFjKHN0cnVjdCBtM19zdGF0ZSAqcywgdW5zaWduZWQgaW50IGFkZHIsIHVuc2lnbmVkIGludCBjb3VudCkKK3sKKyAgICBEUFJJTlRLKERQSU5ULCJzZXRfZG1hYz8/XG4iKTsKK30KKworc3RhdGljIHUzMiBnZXRfZG1hX3BvcyhzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwKKwkJICAgICAgIGludCBpbnN0YW5jZV9hZGRyKQoreworICAgIHUxNiBoaSA9IDAsIGxvID0gMDsKKyAgICBpbnQgcmV0cnkgPSAxMDsKKworICAgIC8qCisgICAgICogdHJ5IGFuZCBnZXQgYSB2YWxpZCBhbnN3ZXIKKyAgICAgKi8KKyAgICB3aGlsZShyZXRyeS0tKSB7CisgICAgICAgIGhpID0gIG0zX2Fzc3BfcmVhZChjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICAgICAgaW5zdGFuY2VfYWRkciArIENEQVRBX0hPU1RfU1JDX0NVUlJFTlRIKTsKKworICAgICAgICBsbyA9IG0zX2Fzc3BfcmVhZChjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICAgICAgaW5zdGFuY2VfYWRkciArIENEQVRBX0hPU1RfU1JDX0NVUlJFTlRMKTsKKworICAgICAgICBpZihoaSA9PSBtM19hc3NwX3JlYWQoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLAorICAgICAgICAgICAgICAgIGluc3RhbmNlX2FkZHIgKyBDREFUQV9IT1NUX1NSQ19DVVJSRU5USCkpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGxvIHwgKGhpPDwxNik7Cit9CisKK3N0YXRpYyB1MzIgZ2V0X2RtYWEoc3RydWN0IG0zX3N0YXRlICpzKQoreworICAgIHUzMiBvZmZzZXQ7CisKKyAgICBvZmZzZXQgPSBnZXRfZG1hX3BvcyhzLT5jYXJkLCBzLT5kYWNfaW5zdC5kYXRhKSAtIAorICAgICAgICB2aXJ0X3RvX2J1cyhzLT5kbWFfZGFjLnJhd2J1Zik7CisKKyAgICBEUFJJTlRLKERQSU5ULCJnZXRfZG1hYTogMHglMDh4XG4iLG9mZnNldCk7CisKKyAgICByZXR1cm4gb2Zmc2V0OworfQorCitzdGF0aWMgdTMyIGdldF9kbWFjKHN0cnVjdCBtM19zdGF0ZSAqcykKK3sKKyAgICB1MzIgb2Zmc2V0OworCisgICAgb2Zmc2V0ID0gZ2V0X2RtYV9wb3Mocy0+Y2FyZCwgcy0+YWRjX2luc3QuZGF0YSkgLQorICAgICAgICB2aXJ0X3RvX2J1cyhzLT5kbWFfYWRjLnJhd2J1Zik7CisKKyAgICBEUFJJTlRLKERQSU5ULCJnZXRfZG1hYzogMHglMDh4XG4iLG9mZnNldCk7CisKKyAgICByZXR1cm4gb2Zmc2V0OworCit9CisKK3N0YXRpYyBpbnQgCitwcm9nX2RtYWJ1ZihzdHJ1Y3QgbTNfc3RhdGUgKnMsIHVuc2lnbmVkIHJlYykKK3sKKyAgICBzdHJ1Y3QgZG1hYnVmICpkYiA9IHJlYyA/ICZzLT5kbWFfYWRjIDogJnMtPmRtYV9kYWM7CisgICAgdW5zaWduZWQgcmF0ZSA9IHJlYyA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjOworICAgIHVuc2lnbmVkIGJ5dGVwZXJzZWM7CisgICAgdW5zaWduZWQgYnVmczsKKyAgICB1bnNpZ25lZCBjaGFyIGZtdDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworICAgIGZtdCA9IHMtPmZtdDsKKyAgICBpZiAocmVjKSB7CisgICAgICAgIHN0b3BfYWRjKHMpOworICAgICAgICBmbXQgPj49IEVTU19BRENfU0hJRlQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RvcF9kYWMocyk7CisgICAgICAgIGZtdCA+Pj0gRVNTX0RBQ19TSElGVDsKKyAgICB9CisgICAgZm10ICY9IEVTU19GTVRfTUFTSzsKKworICAgIGRiLT5od3B0ciA9IGRiLT5zd3B0ciA9IGRiLT50b3RhbF9ieXRlcyA9IGRiLT5jb3VudCA9IGRiLT5lcnJvciA9IGRiLT5lbmRjbGVhcmVkID0gMDsKKworICAgIGJ5dGVwZXJzZWMgPSByYXRlIDw8IHNhbXBsZV9zaGlmdFtmbXRdOworICAgIGJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworICAgIGlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisgICAgICAgIGlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVwZXJzZWMpCisgICAgICAgICAgICBkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRiLT5mcmFnc2hpZnQgPSBkYi0+b3NzZnJhZ3NoaWZ0OworICAgIH0gZWxzZSB7CisgICAgICAgIGRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAvKGRiLT5zdWJkaXZpc2lvbiA/IGRiLT5zdWJkaXZpc2lvbiA6IDEpKTsKKyAgICAgICAgaWYgKGRiLT5mcmFnc2hpZnQgPCAzKQorICAgICAgICAgICAgZGItPmZyYWdzaGlmdCA9IDM7IAorICAgIH0KKyAgICBkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKyAgICB3aGlsZSAoZGItPm51bWZyYWcgPCA0ICYmIGRiLT5mcmFnc2hpZnQgPiAzKSB7CisgICAgICAgIGRiLT5mcmFnc2hpZnQtLTsKKyAgICAgICAgZGItPm51bWZyYWcgPSBidWZzID4+IGRiLT5mcmFnc2hpZnQ7CisgICAgfQorICAgIGRiLT5mcmFnc2l6ZSA9IDEgPDwgZGItPmZyYWdzaGlmdDsKKyAgICBpZiAoZGItPm9zc21heGZyYWdzID49IDQgJiYgZGItPm9zc21heGZyYWdzIDwgZGItPm51bWZyYWcpCisgICAgICAgIGRiLT5udW1mcmFnID0gZGItPm9zc21heGZyYWdzOworICAgIGRiLT5mcmFnc2FtcGxlcyA9IGRiLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZm10XTsKKyAgICBkYi0+ZG1hc2l6ZSA9IGRiLT5udW1mcmFnIDw8IGRiLT5mcmFnc2hpZnQ7CisKKyAgICBEUFJJTlRLKERQU1RSLCJwcm9nX2RtYWJ1ZjogbnVtZnJhZzogJWQgZnJhZ3NpemU6ICVkIGRtYXNpemU6ICVkXG4iLGRiLT5udW1mcmFnLGRiLT5mcmFnc2l6ZSxkYi0+ZG1hc2l6ZSk7CisKKyAgICBtZW1zZXQoZGItPnJhd2J1ZiwgKGZtdCAmIEVTU19GTVRfMTZCSVQpID8gMCA6IDB4ODAsIGRiLT5kbWFzaXplKTsKKworICAgIGlmIChyZWMpIAorICAgICAgICBtM19yZWNfc2V0dXAocywgZm10LCBzLT5yYXRlYWRjLCBkYi0+cmF3YnVmLCBkYi0+ZG1hc2l6ZSk7CisgICAgZWxzZSAKKyAgICAgICAgbTNfcGxheV9zZXR1cChzLCBmbXQsIHMtPnJhdGVkYWMsIGRiLT5yYXdidWYsIGRiLT5kbWFzaXplKTsKKworICAgIGRiLT5yZWFkeSA9IDE7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfYWR2YW5jZShzdHJ1Y3QgbTNfc3RhdGUgKnMpCit7CisgICAgdW5zaWduZWQgY2hhciBjID0gKChzLT5mbXQgPj4gRVNTX0RBQ19TSElGVCkgJiBFU1NfRk1UXzE2QklUKSA/IDAgOiAweDgwOworICAgIAorICAgIHVuc2lnbmVkIGNoYXIgKmJ1ZiA9IHMtPmRtYV9kYWMucmF3YnVmOworICAgIHVuc2lnbmVkIGJzaXplID0gcy0+ZG1hX2RhYy5kbWFzaXplOworICAgIHVuc2lnbmVkIGJwdHIgPSBzLT5kbWFfZGFjLnN3cHRyOworICAgIHVuc2lnbmVkIGxlbiA9IHMtPmRtYV9kYWMuZnJhZ3NpemU7CisgICAgCisgICAgaWYgKGJwdHIgKyBsZW4gPiBic2l6ZSkgeworICAgICAgICB1bnNpZ25lZCB4ID0gYnNpemUgLSBicHRyOworICAgICAgICBtZW1zZXQoYnVmICsgYnB0ciwgYywgeCk7CisgICAgICAgIC8qIGFjY291bnQgZm9yIHdyYXBwaW5nPyAqLworICAgICAgICBicHRyID0gMDsKKyAgICAgICAgbGVuIC09IHg7CisgICAgfQorICAgIG1lbXNldChidWYgKyBicHRyLCBjLCBsZW4pOworfQorCisvKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCEgKi8KK3N0YXRpYyB2b2lkIG0zX3VwZGF0ZV9wdHIoc3RydWN0IG0zX3N0YXRlICpzKQoreworICAgIHVuc2lnbmVkIGh3cHRyOworICAgIGludCBkaWZmOworCisgICAgLyogdXBkYXRlIEFEQyBwb2ludGVyICovCisgICAgaWYgKHMtPmRtYV9hZGMucmVhZHkpIHsKKyAgICAgICAgaHdwdHIgPSBnZXRfZG1hYyhzKSAlIHMtPmRtYV9hZGMuZG1hc2l6ZTsKKyAgICAgICAgZGlmZiA9IChzLT5kbWFfYWRjLmRtYXNpemUgKyBod3B0ciAtIHMtPmRtYV9hZGMuaHdwdHIpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworICAgICAgICBzLT5kbWFfYWRjLmh3cHRyID0gaHdwdHI7CisgICAgICAgIHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgKz0gZGlmZjsKKyAgICAgICAgcy0+ZG1hX2FkYy5jb3VudCArPSBkaWZmOworICAgICAgICBpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpIAorICAgICAgICAgICAgd2FrZV91cCgmcy0+ZG1hX2FkYy53YWl0KTsKKyAgICAgICAgaWYgKCFzLT5kbWFfYWRjLm1hcHBlZCkgeworICAgICAgICAgICAgaWYgKHMtPmRtYV9hZGMuY291bnQgPiAoc2lnbmVkKShzLT5kbWFfYWRjLmRtYXNpemUgLSAoKDMgKiBzLT5kbWFfYWRjLmZyYWdzaXplKSA+PiAxKSkpIHsKKyAgICAgICAgICAgICAgICBzdG9wX2FkYyhzKTsgCisgICAgICAgICAgICAgICAgLyogYnJ1dGUgZm9yY2UgZXZlcnlvbmUgYmFjayBpbiBzeW5jLCBzaWdoICovCisgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5zd3B0ciA9IDA7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5od3B0ciA9IDA7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5lcnJvcisrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8qIHVwZGF0ZSBEQUMgcG9pbnRlciAqLworICAgIGlmIChzLT5kbWFfZGFjLnJlYWR5KSB7CisgICAgICAgIGh3cHRyID0gZ2V0X2RtYWEocykgJSBzLT5kbWFfZGFjLmRtYXNpemU7IAorICAgICAgICBkaWZmID0gKHMtPmRtYV9kYWMuZG1hc2l6ZSArIGh3cHRyIC0gcy0+ZG1hX2RhYy5od3B0cikgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisKKyAgICAgICAgRFBSSU5USyhEUElOVCwidXBkYXRpbmcgZGFjOiBod3B0cjogJTZkIGRpZmY6ICU2ZCBjb3VudDogJTZkXG4iLAorICAgICAgICAgICAgICAgIGh3cHRyLGRpZmYscy0+ZG1hX2RhYy5jb3VudCk7CisKKyAgICAgICAgcy0+ZG1hX2RhYy5od3B0ciA9IGh3cHRyOworICAgICAgICBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisKKyAgICAgICAgaWYgKHMtPmRtYV9kYWMubWFwcGVkKSB7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHMtPmRtYV9kYWMuY291bnQgKz0gZGlmZjsKKyAgICAgICAgICAgIGlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgeworICAgICAgICAgICAgICAgIHdha2VfdXAoJnMtPmRtYV9kYWMud2FpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgIHMtPmRtYV9kYWMuY291bnQgLT0gZGlmZjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHMtPmRtYV9kYWMuY291bnQgPD0gMCkgeworICAgICAgICAgICAgICAgIERQUklOVEsoRFBDUkFQLCJ1bmRlcmZsb3chIGRpZmY6ICVkICgweCV4KSBjb3VudDogJWQgKDB4JXgpIGh3OiAlZCAoMHgleCkgc3c6ICVkICgweCV4KVxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICBkaWZmLCBkaWZmLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuY291bnQsIAorICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5jb3VudCwgCisgICAgICAgICAgICAgICAgICAgIGh3cHRyLCBod3B0ciwKKyAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5zd3B0ciwKKyAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5zd3B0cik7CisgICAgICAgICAgICAgICAgc3RvcF9kYWMocyk7CisgICAgICAgICAgICAgICAgLyogYnJ1dGUgZm9yY2UgZXZlcnlvbmUgYmFjayBpbiBzeW5jLCBzaWdoICovCisgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5jb3VudCA9IDA7IAorICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuc3dwdHIgPSBod3B0cjsgCisgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5lcnJvcisrOworICAgICAgICAgICAgfSBlbHNlIGlmIChzLT5kbWFfZGFjLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSAmJiAhcy0+ZG1hX2RhYy5lbmRjbGVhcmVkKSB7CisgICAgICAgICAgICAgICAgY2xlYXJfYWR2YW5jZShzKTsKKyAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHMtPmRtYV9kYWMuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUgPD0gKHNpZ25lZClzLT5kbWFfZGFjLmRtYXNpemUpIHsKKyAgICAgICAgICAgICAgICB3YWtlX3VwKCZzLT5kbWFfZGFjLndhaXQpOworICAgICAgICAgICAgICAgIERQUklOVEsoRFBJTlQsIndha2luZyB1cCBEQUMgY291bnQ6ICVkIHN3OiAlZCBodzogJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmNvdW50LCBzLT5kbWFfZGFjLnN3cHRyLCBod3B0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBtM19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICBzdHJ1Y3QgbTNfY2FyZCAqYyA9IChzdHJ1Y3QgbTNfY2FyZCAqKWRldl9pZDsKKyAgICBzdHJ1Y3QgbTNfc3RhdGUgKnMgPSAmYy0+Y2hhbm5lbHNbMF07CisgICAgdTggc3RhdHVzOworCisgICAgc3RhdHVzID0gaW5iKGMtPmlvYmFzZSsweDFBKTsKKworICAgIGlmKHN0YXR1cyA9PSAweGZmKQorCXJldHVybiBJUlFfTk9ORTsKKyAgIAorICAgIC8qIHByZXN1bWFibHkgYWNraW5nIHRoZSBpbnRzPyAqLworICAgIG91dHcoc3RhdHVzLCBjLT5pb2Jhc2UrMHgxQSk7IAorCisgICAgaWYoYy0+aW5fc3VzcGVuZCkKKyAgICAgICAgcmV0dXJuIElSUV9IQU5ETEVEOworCisgICAgLyoKKyAgICAgKiBhY2sgYW4gYXNzcCBpbnQgaWYgaXRzIHJ1bm5pbmcKKyAgICAgKiBhbmQgaGFzIGFuIGludCBwZW5kaW5nCisgICAgICovCisgICAgaWYoIHN0YXR1cyAmIEFTU1BfSU5UX1BFTkRJTkcpIHsKKyAgICAgICAgdTggY3RsID0gaW5iKGMtPmlvYmFzZSArIEFTU1BfQ09OVFJPTF9CKTsKKyAgICAgICAgaWYoICEoY3RsICYgU1RPUF9BU1NQX0NMT0NLKSkgeworICAgICAgICAgICAgY3RsID0gaW5iKGMtPmlvYmFzZSArIEFTU1BfSE9TVF9JTlRfU1RBVFVTICk7CisgICAgICAgICAgICBpZihjdGwgJiBEU1AySE9TVF9SRVFfVElNRVIpIHsKKyAgICAgICAgICAgICAgICBvdXRiKCBEU1AySE9TVF9SRVFfVElNRVIsIGMtPmlvYmFzZSArIEFTU1BfSE9TVF9JTlRfU1RBVFVTKTsKKyAgICAgICAgICAgICAgICAvKiB1cGRhdGUgYWRjL2RhYyBpbmZvIGlmIGl0IHdhcyBhIHRpbWVyIGludCAqLworICAgICAgICAgICAgICAgIHNwaW5fbG9jaygmYy0+bG9jayk7CisgICAgICAgICAgICAgICAgbTNfdXBkYXRlX3B0cihzKTsKKyAgICAgICAgICAgICAgICBzcGluX3VubG9jaygmYy0+bG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBYWFggaXMgdGhpcyBuZWVkZWQ/ICovCisgICAgaWYoc3RhdHVzICYgMHg0MCkgCisgICAgICAgIG91dGIoMHg0MCwgYy0+aW9iYXNlKzB4MUEpOworICAgIHJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9tYWdpY1tdID0gS0VSTl9DUklUIFBGWCAiaW52YWxpZCBtYWdpYyB2YWx1ZSBpbiAlc1xuIjsKKworI2RlZmluZSBWQUxJREFURV9NQUdJQyhGT08sTUFHKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShGT08pIHx8IChGT08pLT5tYWdpYyAhPSBNQUcpIHsgXAorICAgICAgICBwcmludGsoaW52YWxpZF9tYWdpYyxfX0ZVTkNUSU9OX18pOyAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIC1FTlhJTzsgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9KQorCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKGEpIFZBTElEQVRFX01BR0lDKGEsTTNfU1RBVEVfTUFHSUMpCisjZGVmaW5lIFZBTElEQVRFX0NBUkQoYSkgVkFMSURBVEVfTUFHSUMoYSxNM19DQVJEX01BR0lDKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IG0zX3N0YXRlICpzLCBpbnQgbm9uYmxvY2spCit7CisgICAgREVDTEFSRV9XQUlUUVVFVUUod2FpdCxjdXJyZW50KTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBjb3VudDsKKyAgICBzaWduZWQgbG9uZyB0bW87CisKKyAgICBpZiAocy0+ZG1hX2RhYy5tYXBwZWQgfHwgIXMtPmRtYV9kYWMucmVhZHkpCisgICAgICAgIHJldHVybiAwOworICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIGlmIChjb3VudCA8PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBpZiAobm9uYmxvY2spIHsKKyAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICB9CisgICAgICAgIHRtbyA9IChjb3VudCAqIEhaKSAvIHMtPnJhdGVkYWM7CisgICAgICAgIHRtbyA+Pj0gc2FtcGxlX3NoaWZ0WyhzLT5mbXQgPj4gRVNTX0RBQ19TSElGVCkgJiBFU1NfRk1UX01BU0tdOworICAgICAgICAvKiBYWFggdGhpcyBpcyBqdXN0IGJyb2tlbi4gIHNvbWVvbmUgaXMgd2FraW5nIHVzIHVwIGFsb3QsIG9yIHNjaGVkdWxlX3RpbWVvdXQgaXMgYnJva2VuLgorICAgICAgICAgICAgb3Igc29tZXRoaW5nLiAgd2hvIGNhcmVzLiAtIHphY2ggKi8KKyAgICAgICAgaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IHRtbyA6IDEpICYmIHRtbykKKyAgICAgICAgICAgIERQUklOVEsoRFBDUkFQLCJkbWEgdGltZWQgb3V0Pz8gJWxkXG4iLGppZmZpZXMpOworICAgIH0KKyAgICByZW1vdmVfd2FpdF9xdWV1ZSgmcy0+ZG1hX2RhYy53YWl0LCAmd2FpdCk7CisgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKyAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3NpemVfdCBtM19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKyAgICBzdHJ1Y3QgbTNfc3RhdGUgKnMgPSAoc3RydWN0IG0zX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworICAgIHNzaXplX3QgcmV0OworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisgICAgdW5zaWduZWQgc3dwdHI7CisgICAgaW50IGNudDsKKyAgICAKKyAgICBWQUxJREFURV9TVEFURShzKTsKKyAgICBpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisgICAgICAgIHJldHVybiAtRU5YSU87CisgICAgaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1ZihzLCAxKSkpCisgICAgICAgIHJldHVybiByZXQ7CisgICAgaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgcmV0ID0gMDsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICB3aGlsZSAoY291bnQgPiAwKSB7CisgICAgICAgIGludCB0aW1lZF9vdXQ7CisKKyAgICAgICAgc3dwdHIgPSBzLT5kbWFfYWRjLnN3cHRyOworICAgICAgICBjbnQgPSBzLT5kbWFfYWRjLmRtYXNpemUtc3dwdHI7CisgICAgICAgIGlmIChzLT5kbWFfYWRjLmNvdW50IDwgY250KQorICAgICAgICAgICAgY250ID0gcy0+ZG1hX2FkYy5jb3VudDsKKworICAgICAgICBpZiAoY250ID4gY291bnQpCisgICAgICAgICAgICBjbnQgPSBjb3VudDsKKworICAgICAgICBpZiAoY250IDw9IDApIHsKKyAgICAgICAgICAgIHN0YXJ0X2FkYyhzKTsKKyAgICAgICAgICAgIGlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gcmV0ID8gcmV0IDogLUVBR0FJTjsKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgdGltZWRfb3V0ID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzLT5kbWFfYWRjLndhaXQsIEhaKSA9PSAwOworICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworICAgICAgICAgICAgaWYodGltZWRfb3V0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKCJyZWFkOiBjaGlwIGxvY2t1cD8gZG1hc3ogJXUgZnJhZ3N6ICV1IGNvdW50ICV1IGh3cHRyICV1IHN3cHRyICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLmRtYXNpemUsIHMtPmRtYV9hZGMuZnJhZ3NpemUsIHMtPmRtYV9hZGMuY291bnQsIAorICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLmh3cHRyLCBzLT5kbWFfYWRjLnN3cHRyKTsKKyAgICAgICAgICAgICAgICBzdG9wX2FkYyhzKTsKKyAgICAgICAgICAgICAgICBzZXRfZG1hYyhzLCB2aXJ0X3RvX2J1cyhzLT5kbWFfYWRjLnJhd2J1ZiksIHMtPmRtYV9hZGMubnVtZnJhZyA8PCBzLT5kbWFfYWRjLmZyYWdzaGlmdCk7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMuaHdwdHIgPSBzLT5kbWFfYWRjLnN3cHRyID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0ID0gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcy0+ZG1hX2FkYy5yYXdidWYgKyBzd3B0ciwgY250KSkgeworICAgICAgICAgICAgcmV0ID0gcmV0ID8gcmV0IDogLUVGQVVMVDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworICAgICAgICBzd3B0ciA9IChzd3B0ciArIGNudCkgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisgICAgICAgIHMtPmRtYV9hZGMuc3dwdHIgPSBzd3B0cjsKKyAgICAgICAgcy0+ZG1hX2FkYy5jb3VudCAtPSBjbnQ7CisgICAgICAgIGNvdW50IC09IGNudDsKKyAgICAgICAgYnVmZmVyICs9IGNudDsKKyAgICAgICAgcmV0ICs9IGNudDsKKyAgICAgICAgc3RhcnRfYWRjKHMpOworICAgIH0KKworb3V0OgorICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBtM193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisgICAgc3RydWN0IG0zX3N0YXRlICpzID0gKHN0cnVjdCBtM19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKyAgICBzc2l6ZV90IHJldDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIHN3cHRyOworICAgIGludCBjbnQ7CisgICAgCisgICAgVkFMSURBVEVfU1RBVEUocyk7CisgICAgaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorICAgICAgICByZXR1cm4gLUVOWElPOworICAgIGlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMCkpKQorICAgICAgICByZXR1cm4gcmV0OworICAgIGlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKyAgICAgICAgcmV0dXJuIC1FRkFVTFQ7CisgICAgcmV0ID0gMDsKKworICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICB3aGlsZSAoY291bnQgPiAwKSB7CisgICAgICAgIGludCB0aW1lZF9vdXQ7CisKKyAgICAgICAgaWYgKHMtPmRtYV9kYWMuY291bnQgPCAwKSB7CisgICAgICAgICAgICBzLT5kbWFfZGFjLmNvdW50ID0gMDsKKyAgICAgICAgICAgIHMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyOworICAgICAgICB9CisgICAgICAgIHN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKworICAgICAgICBjbnQgPSBzLT5kbWFfZGFjLmRtYXNpemUtc3dwdHI7CisKKyAgICAgICAgaWYgKHMtPmRtYV9kYWMuY291bnQgKyBjbnQgPiBzLT5kbWFfZGFjLmRtYXNpemUpCisgICAgICAgICAgICBjbnQgPSBzLT5kbWFfZGFjLmRtYXNpemUgLSBzLT5kbWFfZGFjLmNvdW50OworCisKKyAgICAgICAgaWYgKGNudCA+IGNvdW50KQorICAgICAgICAgICAgY250ID0gY291bnQ7CisKKyAgICAgICAgaWYgKGNudCA8PSAwKSB7CisgICAgICAgICAgICBzdGFydF9kYWMocyk7CisgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKyAgICAgICAgICAgICAgICBpZighcmV0KSByZXQgPSAtRUFHQUlOOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgdGltZWRfb3V0ID0gaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZzLT5kbWFfZGFjLndhaXQsIEhaKSA9PSAwOworICAgICAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgIGlmKHRpbWVkX291dCkgeworICAgICAgICAgICAgICAgIERQUklOVEsoRFBDUkFQLCJ3cml0ZTogY2hpcCBsb2NrdXA/IGRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAldSBod3B0ciAldSBzd3B0ciAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5kbWFzaXplLCBzLT5kbWFfZGFjLmZyYWdzaXplLCBzLT5kbWFfZGFjLmNvdW50LCAKKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5od3B0ciwgcy0+ZG1hX2RhYy5zd3B0cik7CisgICAgICAgICAgICAgICAgc3RvcF9kYWMocyk7CisgICAgICAgICAgICAgICAgc2V0X2RtYWEocywgdmlydF90b19idXMocy0+ZG1hX2RhYy5yYXdidWYpLCBzLT5kbWFfZGFjLm51bWZyYWcgPDwgcy0+ZG1hX2RhYy5mcmFnc2hpZnQpOworICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuY291bnQgPSBzLT5kbWFfZGFjLmh3cHRyID0gcy0+ZG1hX2RhYy5zd3B0ciA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJldCkgcmV0ID0gLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7CisgICAgICAgICAgICBpZiAoIXJldCkgcmV0ID0gLUVGQVVMVDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworICAgICAgICBEUFJJTlRLKERQU1lTLCJ3cm90ZSAlNmQgYnl0ZXMgYXQgc3c6ICU2ZCBjbnQ6ICU2ZCB3aGlsZSBodzogJTZkXG4iLAorICAgICAgICAgICAgICAgIGNudCwgc3dwdHIsIHMtPmRtYV9kYWMuY291bnQsIHMtPmRtYV9kYWMuaHdwdHIpOworICAgICAgICAKKyAgICAgICAgc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYy5kbWFzaXplOworCisgICAgICAgIHMtPmRtYV9kYWMuc3dwdHIgPSBzd3B0cjsKKyAgICAgICAgcy0+ZG1hX2RhYy5jb3VudCArPSBjbnQ7CisgICAgICAgIHMtPmRtYV9kYWMuZW5kY2xlYXJlZCA9IDA7CisgICAgICAgIGNvdW50IC09IGNudDsKKyAgICAgICAgYnVmZmVyICs9IGNudDsKKyAgICAgICAgcmV0ICs9IGNudDsKKyAgICAgICAgc3RhcnRfZGFjKHMpOworICAgIH0KK291dDoKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBtM19wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisgICAgc3RydWN0IG0zX3N0YXRlICpzID0gKHN0cnVjdCBtM19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIHVuc2lnbmVkIGludCBtYXNrID0gMDsKKworICAgIFZBTElEQVRFX1NUQVRFKHMpOworICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKyAgICAgICAgcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfZGFjLndhaXQsIHdhaXQpOworICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorICAgICAgICBwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworICAgIG0zX3VwZGF0ZV9wdHIocyk7CisKKyAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworICAgICAgICBpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisgICAgICAgICAgICBtYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisgICAgfQorICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworICAgICAgICBpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKyAgICAgICAgICAgIGlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgCisgICAgICAgICAgICAgICAgbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICgoc2lnbmVkKXMtPmRtYV9kYWMuZG1hc2l6ZSA+PSBzLT5kbWFfZGFjLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplKQorICAgICAgICAgICAgICAgIG1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgbTNfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisgICAgc3RydWN0IG0zX3N0YXRlICpzID0gKHN0cnVjdCBtM19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKyAgICB1bnNpZ25lZCBsb25nIG1heF9zaXplLCBzaXplLCBzdGFydCwgb2Zmc2V0OworICAgIHN0cnVjdCBkbWFidWYgKmRiOworICAgIGludCByZXQgPSAtRUlOVkFMOworCisgICAgVkFMSURBVEVfU1RBVEUocyk7CisgICAgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgeworICAgICAgICBpZiAoKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgZGIgPSAmcy0+ZG1hX2RhYzsKKyAgICB9IGVsc2UgCisgICAgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisgICAgICAgIGlmICgocmV0ID0gcHJvZ19kbWFidWYocywgMSkpICE9IDApCisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICBkYiA9ICZzLT5kbWFfYWRjOworICAgIH0gZWxzZSAgCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgbWF4X3NpemUgPSBkYi0+ZG1hc2l6ZTsKKworICAgIHN0YXJ0ID0gdm1hLT52bV9zdGFydDsKKyAgICBvZmZzZXQgPSAodm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUKTsKKyAgICBzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCisgICAgaWYoc2l6ZSA+IG1heF9zaXplKQorICAgICAgICBnb3RvIG91dDsKKyAgICBpZihvZmZzZXQgPiBtYXhfc2l6ZSAtIHNpemUpCisgICAgICAgIGdvdG8gb3V0OworCisgICAgLyoKKyAgICAgKiB0aGlzIHdpbGwgYmUgLT5ub3BhZ2UoKSBvbmNlIEkgY2FuIAorICAgICAqIGFzayBKZWZmIHdoYXQgdGhlIGhlbGwgSSdtIGRvaW5nIHdyb25nLgorICAgICAqLworICAgIHJldCA9IC1FQUdBSU47CisgICAgaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQl2aXJ0X3RvX3BoeXMoZGItPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCXNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKKyAgICAgICAgZ290byBvdXQ7CisKKyAgICBkYi0+bWFwcGVkID0gMTsKKyAgICByZXQgPSAwOworCitvdXQ6CisgICAgcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHRoaXMgZnVuY3Rpb24gaXMgYSBkaXNhc3Rlci4uCisgKi8KKyNkZWZpbmUgZ2V0X3VzZXJfcmV0KHgsIHB0ciwgIHJldCkgKHsgaWYoZ2V0X3VzZXIoeCwgcHRyKSkgcmV0dXJuIHJldDsgfSkKK3N0YXRpYyBpbnQgbTNfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIHN0cnVjdCBtM19zdGF0ZSAqcyA9IChzdHJ1Y3QgbTNfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IG0zX2NhcmQgKmNhcmQ9cy0+Y2FyZDsKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKyAgICBjb3VudF9pbmZvIGNpbmZvOworICAgIGludCB2YWwsIG1hcHBlZCwgcmV0OworICAgIHVuc2lnbmVkIGNoYXIgZm10bSwgZm10ZDsKKyAgICB2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKyAgICBpbnQgX191c2VyICpwID0gYXJncDsKKworICAgIFZBTElEQVRFX1NUQVRFKHMpOworCisgICAgbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYy5tYXBwZWQpIHx8CisgICAgICAgICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCisgICAgRFBSSU5USyhEUFNZUywibTNfaW9jdGw6IGNtZCAlZFxuIiwgY21kKTsKKworICAgIHN3aXRjaCAoY21kKSB7CisgICAgY2FzZSBPU1NfR0VUVkVSU0lPTjoKKyAgICAgICAgcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisgICAgY2FzZSBTTkRDVExfRFNQX1NZTkM6CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKyAgICAgICAgICAgIHJldHVybiBkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgCisgICAgY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKyAgICAgICAgLyogWFhYIGZpeCAqLworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorICAgICAgICByZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCBwKTsKKyAgICAgICAgCisgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKyAgICAgICAgICAgIHN0b3BfZGFjKHMpOworICAgICAgICAgICAgc3luY2hyb25pemVfaXJxKHMtPmNhcmQtPnBjaWRldi0+aXJxKTsKKyAgICAgICAgICAgIHMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyID0gcy0+ZG1hX2RhYy5jb3VudCA9IHMtPmRtYV9kYWMudG90YWxfYnl0ZXMgPSAwOworICAgICAgICB9CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgICAgICBzdG9wX2FkYyhzKTsKKyAgICAgICAgICAgIHN5bmNocm9uaXplX2lycShzLT5jYXJkLT5wY2lkZXYtPmlycSk7CisgICAgICAgICAgICBzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2FkYy5od3B0ciA9IHMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorICAgICAgICBnZXRfdXNlcl9yZXQodmFsLCBwLCAtRUZBVUxUKTsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgaWYgKHZhbCA+PSAwKSB7CisgICAgICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworICAgICAgICAgICAgICAgIHN0b3BfYWRjKHMpOworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMucmVhZHkgPSAwOworICAgICAgICAgICAgICAgIHNldF9hZGNfcmF0ZShzLCB2YWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgICAgICAgICAgc3RvcF9kYWMocyk7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisgICAgICAgICAgICAgICAgc2V0X2RhY19yYXRlKHMsIHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+cmF0ZWFkYyA6IHMtPnJhdGVkYWMsIHApOworICAgICAgICAKKyAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOgorICAgICAgICBnZXRfdXNlcl9yZXQodmFsLCBwLCAtRUZBVUxUKTsKKyAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgZm10ZCA9IDA7CisgICAgICAgIGZtdG0gPSB+MDsKKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKyAgICAgICAgICAgIHN0b3BfYWRjKHMpOworICAgICAgICAgICAgcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisgICAgICAgICAgICBpZiAodmFsKQorICAgICAgICAgICAgICAgIGZtdGQgfD0gRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBmbXRtICY9IH4oRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgICAgICBzdG9wX2RhYyhzKTsKKyAgICAgICAgICAgIHMtPmRtYV9kYWMucmVhZHkgPSAwOworICAgICAgICAgICAgaWYgKHZhbCkKKyAgICAgICAgICAgICAgICBmbXRkIHw9IEVTU19GTVRfU1RFUkVPIDw8IEVTU19EQUNfU0hJRlQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZm10bSAmPSB+KEVTU19GTVRfU1RFUkVPIDw8IEVTU19EQUNfU0hJRlQpOworICAgICAgICB9CisgICAgICAgIHNldF9mbXQocywgZm10bSwgZm10ZCk7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisgICAgICAgIGdldF91c2VyX3JldCh2YWwsIHAsIC1FRkFVTFQpOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBpZiAodmFsICE9IDApIHsKKyAgICAgICAgICAgIGZtdGQgPSAwOworICAgICAgICAgICAgZm10bSA9IH4wOworICAgICAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzdG9wX2FkYyhzKTsKKyAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLnJlYWR5ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAodmFsID49IDIpCisgICAgICAgICAgICAgICAgICAgIGZtdGQgfD0gRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZtdG0gJj0gfihFU1NfRk1UX1NURVJFTyA8PCBFU1NfQURDX1NISUZUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgICAgIHN0b3BfZGFjKHMpOworICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMucmVhZHkgPSAwOworICAgICAgICAgICAgICAgIGlmICh2YWwgPj0gMikKKyAgICAgICAgICAgICAgICAgICAgZm10ZCB8PSBFU1NfRk1UX1NURVJFTyA8PCBFU1NfREFDX1NISUZUOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZm10bSAmPSB+KEVTU19GTVRfU1RFUkVPIDw8IEVTU19EQUNfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0X2ZtdChzLCBmbXRtLCBmbXRkKTsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChFU1NfRk1UX1NURVJFTyA8PCBFU1NfQURDX1NISUZUKSAKKyAgICAgICAgICAgICAgICAgICAgICAgOiAoRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0RBQ19TSElGVCkpKSA/IDIgOiAxLCBwKTsKKyAgICAgICAgCisgICAgY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrICovCisgICAgICAgIHJldHVybiBwdXRfdXNlcihBRk1UX1U4fEFGTVRfUzE2X0xFLCBwKTsKKyAgICAgICAgCisgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKyAgICAgICAgZ2V0X3VzZXJfcmV0KHZhbCwgcCwgLUVGQVVMVCk7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIGlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworICAgICAgICAgICAgZm10ZCA9IDA7CisgICAgICAgICAgICBmbXRtID0gfjA7CisgICAgICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworICAgICAgICAgICAgICAgIHN0b3BfYWRjKHMpOworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMucmVhZHkgPSAwOworICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisgICAgICAgICAgICAgICAgICAgIGZtdGQgfD0gRVNTX0ZNVF8xNkJJVCA8PCBFU1NfQURDX1NISUZUOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgZm10bSAmPSB+KEVTU19GTVRfMTZCSVQgPDwgRVNTX0FEQ19TSElGVCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKyAgICAgICAgICAgICAgICBzdG9wX2RhYyhzKTsKKyAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKyAgICAgICAgICAgICAgICBpZiAodmFsID09IEFGTVRfUzE2X0xFKQorICAgICAgICAgICAgICAgICAgICBmbXRkIHw9IEVTU19GTVRfMTZCSVQgPDwgRVNTX0RBQ19TSElGVDsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGZtdG0gJj0gfihFU1NfRk1UXzE2QklUIDw8IEVTU19EQUNfU0hJRlQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0X2ZtdChzLCBmbXRtLCBmbXRkKTsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IAorICAgICAgICAgICAgKEVTU19GTVRfMTZCSVQgPDwgRVNTX0FEQ19TSElGVCkgCisgICAgICAgICAgICA6IChFU1NfRk1UXzE2QklUIDw8IEVTU19EQUNfU0hJRlQpKSkgPyAKKyAgICAgICAgICAgICAgICBBRk1UX1MxNl9MRSA6IAorICAgICAgICAgICAgICAgIEFGTVRfVTgsIAorICAgICAgICAgICAgcCk7CisgICAgICAgIAorICAgIGNhc2UgU05EQ1RMX0RTUF9QT1NUOgorICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorICAgICAgICB2YWwgPSAwOworICAgICAgICBpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIChzLT5lbmFibGUgJiBBRENfUlVOTklORykpCisgICAgICAgICAgICB2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKyAgICAgICAgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgKHMtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSkgCisgICAgICAgICAgICB2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisgICAgICAgIHJldHVybiBwdXRfdXNlcih2YWwsIHApOworICAgICAgICAKKyAgICBjYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKyAgICAgICAgZ2V0X3VzZXJfcmV0KHZhbCwgcCwgLUVGQVVMVCk7CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgICAgICBpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworICAgICAgICAgICAgICAgIGlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gIHByb2dfZG1hYnVmKHMsIDEpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICBzdGFydF9hZGMocyk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBzdG9wX2FkYyhzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKyAgICAgICAgICAgIGlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgeworICAgICAgICAgICAgICAgIGlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYocywgMCkpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIHN0YXJ0X2RhYyhzKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIHN0b3BfZGFjKHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKyAgICAgICAgaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGlmICghKHMtPmVuYWJsZSAmIERBQ19SVU5OSU5HKSAmJiAodmFsID0gcHJvZ19kbWFidWYocywgMCkpICE9IDApCisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBtM191cGRhdGVfcHRyKHMpOworICAgICAgICBhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfZGFjLmZyYWdzaXplOworICAgICAgICBhYmluZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLmRtYXNpemUgLSBzLT5kbWFfZGFjLmNvdW50OworICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9kYWMubnVtZnJhZzsKKyAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfZGFjLmZyYWdzaGlmdDsgICAgICAKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICByZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisgICAgY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKyAgICAgICAgaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgaWYgKCEocy0+ZW5hYmxlICYgQURDX1JVTk5JTkcpICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAxKSkgIT0gMCkKKyAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIG0zX3VwZGF0ZV9wdHIocyk7CisgICAgICAgIGFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ3NpemU7CisgICAgICAgIGFiaW5mby5ieXRlcyA9IHMtPmRtYV9hZGMuY291bnQ7CisgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOworICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OyAgICAgIAorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisgICAgICAgIAorICAgIGNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKyAgICAgICAgZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworICAgICAgICByZXR1cm4gMDsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisgICAgICAgIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBtM191cGRhdGVfcHRyKHMpOworICAgICAgICB2YWwgPSBzLT5kbWFfZGFjLmNvdW50OworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiBwdXRfdXNlcih2YWwsIHApOworCisgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisgICAgICAgIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIG0zX3VwZGF0ZV9wdHIocyk7CisgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKKyAgICAgICAgY2luZm8uYmxvY2tzID0gcy0+ZG1hX2FkYy5jb3VudCA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsKKyAgICAgICAgY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0cjsKKyAgICAgICAgaWYgKHMtPmRtYV9hZGMubWFwcGVkKQorICAgICAgICAgICAgcy0+ZG1hX2FkYy5jb3VudCAmPSBzLT5kbWFfYWRjLmZyYWdzaXplLTE7CisgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworCisgICAgY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisgICAgICAgIGlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBtM191cGRhdGVfcHRyKHMpOworICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMudG90YWxfYnl0ZXM7CisgICAgICAgIGNpbmZvLmJsb2NrcyA9IHMtPmRtYV9kYWMuY291bnQgPj4gcy0+ZG1hX2RhYy5mcmFnc2hpZnQ7CisgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisgICAgICAgIGlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKyAgICAgICAgICAgIHMtPmRtYV9kYWMuY291bnQgJj0gcy0+ZG1hX2RhYy5mcmFnc2l6ZS0xOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKKworICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKyAgICAgICAgICAgIGlmICgodmFsID0gcHJvZ19kbWFidWYocywgMCkpKQorICAgICAgICAgICAgICAgIHJldHVybiB2YWw7CisgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAxKSkpCisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICByZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKyAgICBjYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisgICAgICAgIGdldF91c2VyX3JldCh2YWwsIHAsIC1FRkFVTFQpOworICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgICAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworICAgICAgICAgICAgcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisgICAgICAgICAgICBzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gKHZhbCA+PiAxNikgJiAweGZmZmY7CisgICAgICAgICAgICBpZiAocy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPCA0KQorICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gNDsKKyAgICAgICAgICAgIGlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA+IDE1KQorICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gMTU7CisgICAgICAgICAgICBpZiAocy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA8IDQpCisgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgICAgICBzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKyAgICAgICAgICAgIHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKyAgICAgICAgICAgIGlmIChzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA8IDQpCisgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSA0OworICAgICAgICAgICAgaWYgKHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID4gMTUpCisgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPSAxNTsKKyAgICAgICAgICAgIGlmIChzLT5kbWFfZGFjLm9zc21heGZyYWdzIDwgNCkKKyAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLm9zc21heGZyYWdzID0gNDsKKyAgICAgICAgfQorICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisgICAgICAgIHJldHVybiAwOworCisgICAgY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKyAgICAgICAgaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmRtYV9hZGMuc3ViZGl2aXNpb24pIHx8CisgICAgICAgICAgICAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUgJiYgcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbikpCisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBnZXRfdXNlcl9yZXQodmFsLCBwLCAtRUZBVUxUKTsKKyAgICAgICAgaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorICAgICAgICAgICAgcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKyAgICAgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorICAgICAgICAgICAgcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IHZhbDsKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisgICAgICAgIHJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBzLT5yYXRlYWRjIDogcy0+cmF0ZWRhYywgcCk7CisKKyAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorICAgICAgICByZXR1cm4gcHV0X3VzZXIoKHMtPmZtdCAmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyAoRVNTX0ZNVF9TVEVSRU8gPDwgRVNTX0FEQ19TSElGVCkgCisgICAgICAgICAgICAgICAgICAgICAgIDogKEVTU19GTVRfU1RFUkVPIDw8IEVTU19EQUNfU0hJRlQpKSkgPyAyIDogMSwgcCk7CisKKyAgICBjYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisgICAgICAgIHJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChFU1NfRk1UXzE2QklUIDw8IEVTU19BRENfU0hJRlQpIAorICAgICAgICAgICAgICAgICAgICAgICA6IChFU1NfRk1UXzE2QklUIDw8IEVTU19EQUNfU0hJRlQpKSkgPyAxNiA6IDgsIHApOworCisgICAgY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICAKKyAgICB9CisgICAgcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQKK2FsbG9jYXRlX2RtYWJ1ZihzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldiwgc3RydWN0IGRtYWJ1ZiAqZGIpCit7CisgICAgaW50IG9yZGVyOworCisgICAgRFBSSU5USyhEUFNUUiwiYWxsb2NhdGluZyBmb3IgZG1hYnVmICVwXG4iLCBkYik7CisKKyAgICAvKiAKKyAgICAgKiBhbGxvYyBhcyBiaWcgYSBjaHVuayBhcyB3ZSBjYW4sIHN0YXJ0IHdpdGggCisgICAgICogNjRrICdjYXVzZSB3ZSdyZSBpbnNhbmUuICBiYXNlZCBvbiBvcmRlciBjYXVzZQorICAgICAqIHRoZSBhbWF6aW5nbHkgY29tcGxpY2F0ZWQgcHJvZ19kbWFidWYgd2FudHMgaXQuCisgICAgICoKKyAgICAgKiBwY2lfYWxsb2Nfc29uc2lzdGVudCBndWFyYW50ZWVzIHRoYXQgaXQgd29uJ3QgY3Jvc3MgYSBuYXR1cmFsCisgICAgICogYm91bmRhcnk7IHRoZSBtMyBoYXJkd2FyZSBjYW4ndCBoYXZlIGRtYSBjcm9zcyBhIDY0ayBidXMKKyAgICAgKiBhZGRyZXNzIGJvdW5kYXJ5LgorICAgICAqLworICAgIGZvciAob3JkZXIgPSAxNi1QQUdFX1NISUZUOyBvcmRlciA+PSAxOyBvcmRlci0tKSB7CisgICAgICAgIGRiLT5yYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgb3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAmKGRiLT5oYW5kbGUpKTsKKyAgICAgICAgaWYoZGItPnJhd2J1ZikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghZGItPnJhd2J1ZikKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBEUFJJTlRLKERQU1RSLCJhbGxvY2F0ZWQgJWxkICglZCkgYnl0ZXMgYXQgJXBcbiIsCisgICAgICAgICAgICBQQUdFX1NJWkU8PG9yZGVyLCBvcmRlciwgZGItPnJhd2J1Zik7CisKKyAgICB7CisgICAgICAgIHN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworICAgICAgICBwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IG9yZGVyKSAtIDEpOworICAgICAgICBmb3IgKHBhZ2UgPSB2aXJ0X3RvX3BhZ2UoZGItPnJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorICAgICAgICAgICAgU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworICAgIH0KKworCisgICAgZGItPmJ1Zm9yZGVyID0gb3JkZXI7CisgICAgZGItPnJlYWR5ID0gMDsKKyAgICBkYi0+bWFwcGVkID0gMDsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorbnVrZV9saXN0cyhzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwgc3RydWN0IGRtYWJ1ZiAqZGIpCit7CisgICAgbTNfcmVtb3ZlX2xpc3QoY2FyZCwgJihjYXJkLT5kbWFfbGlzdCksIGRiLT5kbWFfaW5kZXgpOworICAgIG0zX3JlbW92ZV9saXN0KGNhcmQsICYoY2FyZC0+bXNyY19saXN0KSwgZGItPm1zcmNfaW5kZXgpOworICAgIGRiLT5pbl9saXN0cyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitmcmVlX2RtYWJ1ZihzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldiwgc3RydWN0IGRtYWJ1ZiAqZGIpCit7CisgICAgaWYoZGItPnJhd2J1ZiA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBEUFJJTlRLKERQU1RSLCJmcmVlaW5nICVwIGZyb20gZG1hYnVmICVwXG4iLGRiLT5yYXdidWYsIGRiKTsKKworICAgIHsKKyAgICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworICAgICAgICBwZW5kID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYgKyAoUEFHRV9TSVpFIDw8IGRiLT5idWZvcmRlcikgLSAxKTsKKyAgICAgICAgZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRiLT5yYXdidWYpOyBwYWdlIDw9IHBlbmQ7IHBhZ2UrKykKKyAgICAgICAgICAgIENsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworICAgIH0KKworCisgICAgcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyLAorICAgICAgICAgICAgZGItPnJhd2J1ZiwgZGItPmhhbmRsZSk7CisKKyAgICBkYi0+cmF3YnVmID0gTlVMTDsKKyAgICBkYi0+YnVmb3JkZXIgPSAwOworICAgIGRiLT5tYXBwZWQgPSAwOworICAgIGRiLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgbTNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKyAgICB1bnNpZ25lZCBpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworICAgIHN0cnVjdCBtM19jYXJkICpjOworICAgIHN0cnVjdCBtM19zdGF0ZSAqcyA9IE5VTEw7CisgICAgaW50IGk7CisgICAgdW5zaWduZWQgY2hhciBmbXRtID0gfjAsIGZtdHMgPSAwOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICAvKgorICAgICAqICAgIFNjYW4gdGhlIGNhcmRzIGFuZCBmaW5kIHRoZSBjaGFubmVsLiBXZSBvbmx5CisgICAgICogICAgZG8gdGhpcyBhdCBvcGVuIHRpbWUgc28gaXQgaXMgb2sKKyAgICAgKi8KKyAgICBmb3IoYyA9IGRldnMgOyBjICE9IE5VTEwgOyBjID0gYy0+bmV4dCkgeworCisgICAgICAgIGZvcihpPTA7aTxOUl9EU1BTO2krKykgeworCisgICAgICAgICAgICBpZihjLT5jaGFubmVsc1tpXS5kZXZfYXVkaW8gPCAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYoKGMtPmNoYW5uZWxzW2ldLmRldl9hdWRpbyBeIG1pbm9yKSAmIH4weGYpCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHMgPSAmYy0+Y2hhbm5lbHNbaV07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgCisgICAgaWYgKCFzKQorICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICAgICAgCisgICAgVkFMSURBVEVfU1RBVEUocyk7CisKKyAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCisgICAgLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisgICAgZG93bigmcy0+b3Blbl9zZW0pOworICAgIHdoaWxlIChzLT5vcGVuX21vZGUgJiBmaWxlLT5mX21vZGUpIHsKKyAgICAgICAgaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisgICAgICAgICAgICB1cCgmcy0+b3Blbl9zZW0pOworICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKKyAgICAgICAgfQorICAgICAgICB1cCgmcy0+b3Blbl9zZW0pOworICAgICAgICBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5vcGVuX3dhaXQpOworICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICByZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICBkb3duKCZzLT5vcGVuX3NlbSk7CisgICAgfQorICAgIAorICAgIHNwaW5fbG9ja19pcnFzYXZlKCZjLT5sb2NrLCBmbGFncyk7CisKKyAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworICAgICAgICBmbXRtICY9IH4oKEVTU19GTVRfU1RFUkVPIHwgRVNTX0ZNVF8xNkJJVCkgPDwgRVNTX0FEQ19TSElGVCk7CisgICAgICAgIGlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisgICAgICAgICAgICBmbXRzIHw9IEVTU19GTVRfMTZCSVQgPDwgRVNTX0FEQ19TSElGVDsgCisKKyAgICAgICAgcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IDA7CisgICAgICAgIHNldF9hZGNfcmF0ZShzLCA4MDAwKTsKKyAgICB9CisgICAgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisgICAgICAgIGZtdG0gJj0gfigoRVNTX0ZNVF9TVEVSRU8gfCBFU1NfRk1UXzE2QklUKSA8PCBFU1NfREFDX1NISUZUKTsKKyAgICAgICAgaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKyAgICAgICAgICAgIGZtdHMgfD0gRVNTX0ZNVF8xNkJJVCA8PCBFU1NfREFDX1NISUZUOworCisgICAgICAgIHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSAwOworICAgICAgICBzZXRfZGFjX3JhdGUocywgODAwMCk7CisgICAgfQorICAgIHNldF9mbXQocywgZm10bSwgZm10cyk7CisgICAgcy0+b3Blbl9tb2RlIHw9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCisgICAgdXAoJnMtPm9wZW5fc2VtKTsKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjLT5sb2NrLCBmbGFncyk7CisgICAgcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IG0zX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgc3RydWN0IG0zX3N0YXRlICpzID0gKHN0cnVjdCBtM19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgbTNfY2FyZCAqY2FyZD1zLT5jYXJkOworICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyAgICBWQUxJREFURV9TVEFURShzKTsKKyAgICBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisgICAgICAgIGRyYWluX2RhYyhzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisKKyAgICBkb3duKCZzLT5vcGVuX3NlbSk7CisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworICAgICAgICBzdG9wX2RhYyhzKTsKKyAgICAgICAgaWYocy0+ZG1hX2RhYy5pbl9saXN0cykgeworICAgICAgICAgICAgbTNfcmVtb3ZlX2xpc3Qocy0+Y2FyZCwgJihzLT5jYXJkLT5taXhlcl9saXN0KSwgcy0+ZG1hX2RhYy5taXhlcl9pbmRleCk7CisgICAgICAgICAgICBudWtlX2xpc3RzKHMtPmNhcmQsICYocy0+ZG1hX2RhYykpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgIHN0b3BfYWRjKHMpOworICAgICAgICBpZihzLT5kbWFfYWRjLmluX2xpc3RzKSB7CisgICAgICAgICAgICBtM19yZW1vdmVfbGlzdChzLT5jYXJkLCAmKHMtPmNhcmQtPmFkYzFfbGlzdCksIHMtPmRtYV9hZGMuYWRjMV9pbmRleCk7CisgICAgICAgICAgICBudWtlX2xpc3RzKHMtPmNhcmQsICYocy0+ZG1hX2FkYykpOworICAgICAgICB9CisgICAgfQorICAgICAgICAKKyAgICBzLT5vcGVuX21vZGUgJj0gKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCisgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgIHVwKCZzLT5vcGVuX3NlbSk7CisgICAgd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKworICAgIHJldHVybiAwOworfQorCisvKgorICogV2FpdCBmb3IgdGhlIGFjOTcgc2VyaWFsIGJ1cyB0byBiZSBmcmVlLgorICogcmV0dXJuIG5vbnplcm8gaWYgdGhlIGJ1cyBpcyBzdGlsbCBidXN5LgorICovCitzdGF0aWMgaW50IG0zX2FjOTdfd2FpdChzdHJ1Y3QgbTNfY2FyZCAqY2FyZCkKK3sKKyAgICBpbnQgaSA9IDEwMDAwOworCisgICAgd2hpbGUoIChtM19pbmIoY2FyZCwgMHgzMCkgJiAxKSAmJiBpLS0pIDsKKworICAgIHJldHVybiBpID09IDA7Cit9CisKK3N0YXRpYyB1MTYgbTNfYWM5N19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKQoreworICAgIHUxNiByZXQgPSAwOworICAgIHN0cnVjdCBtM19jYXJkICpjYXJkID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKworICAgIHNwaW5fbG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKworICAgIGlmKG0zX2FjOTdfd2FpdChjYXJkKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgUEZYICJzZXJpYWwgYnVzIGJ1c3kgcmVhZGluZyByZWcgMHgleFxuIixyZWcpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBtM19vdXRiKGNhcmQsIDB4ODAgfCAocmVnICYgMHg3ZiksIDB4MzApOworCisgICAgaWYobTNfYWM5N193YWl0KGNhcmQpKSB7CisgICAgICAgIHByaW50ayhLRVJOX0VSUiBQRlggInNlcmlhbCBidXMgYnVzeSBmaW5pc2hpbmcgcmVhZCByZWcgMHgleFxuIixyZWcpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICByZXQgPSAgbTNfaW53KGNhcmQsIDB4MzIpOworICAgIERQUklOVEsoRFBDUkFQLCJyZWFkaW5nIDB4JTA0eCBmcm9tIDB4JTAyeFxuIixyZXQsIHJlZyk7CisKK291dDoKKyAgICBzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBtM19hYzk3X3dyaXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsKQoreworICAgIHN0cnVjdCBtM19jYXJkICpjYXJkID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKworICAgIHNwaW5fbG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKworICAgIGlmKG0zX2FjOTdfd2FpdChjYXJkKSkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgUEZYICJzZXJpYWwgYnVzIGJ1c3kgd3JpdGluZyAweCV4IHRvIDB4JXhcbiIsdmFsLCByZWcpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgRFBSSU5USyhEUENSQVAsIndyaXRpbmcgMHglMDR4ICB0byAgMHglMDJ4XG4iLCB2YWwsIHJlZyk7CisKKyAgICBtM19vdXR3KGNhcmQsIHZhbCwgMHgzMik7CisgICAgbTNfb3V0YihjYXJkLCByZWcgJiAweDdmLCAweDMwKTsKK291dDoKKyAgICBzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKK30KKy8qIE9TUyAvZGV2L21peGVyIGZpbGUgb3BlcmF0aW9uIG1ldGhvZHMgKi8KK3N0YXRpYyBpbnQgbTNfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisgICAgdW5zaWduZWQgaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKyAgICBzdHJ1Y3QgbTNfY2FyZCAqY2FyZCA9IGRldnM7CisKKyAgICBmb3IgKGNhcmQgPSBkZXZzOyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0KSB7CisgICAgICAgIGlmKChjYXJkLT5hYzk3ICE9IE5VTEwpICYmIChjYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPT0gbWlub3IpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghY2FyZCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkLT5hYzk3OworCisgICAgcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IG0zX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG0zX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworICAgIHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IChzdHJ1Y3QgYWM5N19jb2RlYyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworICAgIHJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbTNfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayAgPSBub19sbHNlZWssCisJLmlvY3RsCSA9IG0zX2lvY3RsX21peGRldiwKKwkub3BlbgkgPSBtM19vcGVuX21peGRldiwKKwkucmVsZWFzZSA9IG0zX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworc3RhdGljIHZvaWQgcmVtb3RlX2NvZGVjX2NvbmZpZyhpbnQgaW8sIGludCBpc3JlbW90ZSkKK3sKKyAgICBpc3JlbW90ZSA9IGlzcmVtb3RlID8gMSA6IDA7CisKKyAgICBvdXR3KCAgKGludyhpbyArIFJJTkdfQlVTX0NUUkxfQikgJiB+U0VDT05EX0NPREVDX0lEX01BU0spIHwgaXNyZW1vdGUsCisgICAgICAgICAgICBpbyArIFJJTkdfQlVTX0NUUkxfQik7CisgICAgb3V0dyggIChpbncoaW8gKyBTRE9fT1VUX0RFU1RfQ1RSTCkgJiB+Q09NTUFORF9BRERSX09VVCkgfCBpc3JlbW90ZSwKKyAgICAgICAgICAgIGlvICsgU0RPX09VVF9ERVNUX0NUUkwpOworICAgIG91dHcoICAoaW53KGlvICsgU0RPX0lOX0RFU1RfQ1RSTCkgJiB+U1RBVFVTX0FERFJfSU4pIHwgaXNyZW1vdGUsCisgICAgICAgICAgICBpbyArIFNET19JTl9ERVNUX0NUUkwpOworfQorCisvKiAKKyAqIGhhY2ssIHJldHVybnMgbm9uIHplcm8gb24gZXJyIAorICovCitzdGF0aWMgaW50IHRyeV9yZWFkX3ZlbmRvcihzdHJ1Y3QgbTNfY2FyZCAqY2FyZCkKK3sKKyAgICB1MTYgcmV0OworCisgICAgaWYobTNfYWM5N193YWl0KGNhcmQpKSAKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICBtM19vdXRiKGNhcmQsIDB4ODAgfCAoQUM5N19WRU5ET1JfSUQxICYgMHg3ZiksIDB4MzApOworCisgICAgaWYobTNfYWM5N193YWl0KGNhcmQpKSAKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXQgPSAgbTNfaW53KGNhcmQsIDB4MzIpOworCisgICAgcmV0dXJuIChyZXQgPT0gMCkgfHwgKHJldCA9PSAweGZmZmYpOworfQorCitzdGF0aWMgdm9pZCBtM19jb2RlY19yZXNldChzdHJ1Y3QgbTNfY2FyZCAqY2FyZCwgaW50IGJ1c3l3YWl0KQoreworICAgIHUxNiBkaXI7CisgICAgaW50IGRlbGF5MSA9IDAsIGRlbGF5MiA9IDAsIGk7CisgICAgaW50IGlvID0gY2FyZC0+aW9iYXNlOworCisgICAgc3dpdGNoIChjYXJkLT5jYXJkX3R5cGUpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogdGhlIG9uYm9hcmQgY29kZWMgb24gdGhlIGFsbGVncm8gc2VlbXMgCisgICAgICAgICAqIHRvIHdhbnQgdG8gd2FpdCBhIHZlcnkgbG9uZyB0aW1lIGJlZm9yZQorICAgICAgICAgKiBjb21pbmcgYmFjayB0byBsaWZlIAorICAgICAgICAgKi8KKyAgICAgICAgY2FzZSBFU1NfQUxMRUdSTzoKKyAgICAgICAgICAgIGRlbGF5MSA9IDUwOworICAgICAgICAgICAgZGVsYXkyID0gODAwOworICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBFU1NfTUFFU1RSTzM6CisgICAgICAgIGNhc2UgRVNTX01BRVNUUk8zSFc6CisgICAgICAgICAgICBkZWxheTEgPSAyMDsKKyAgICAgICAgICAgIGRlbGF5MiA9IDUwMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgNTsgaSArKykgeworICAgICAgICBkaXIgPSBpbncoaW8gKyBHUElPX0RJUkVDVElPTik7CisgICAgICAgIGRpciB8PSAweDEwOyAvKiBhc3N1bWluZyBwY2kgYnVzIG1hc3Rlcj8gKi8KKworICAgICAgICByZW1vdGVfY29kZWNfY29uZmlnKGlvLCAwKTsKKworICAgICAgICBvdXR3KElPX1NSQU1fRU5BQkxFLCBpbyArIFJJTkdfQlVTX0NUUkxfQSk7CisgICAgICAgIHVkZWxheSgyMCk7CisKKyAgICAgICAgb3V0dyhkaXIgJiB+R1BPX1BSSU1BUllfQUM5NyAsIGlvICsgR1BJT19ESVJFQ1RJT04pOworICAgICAgICBvdXR3KH5HUE9fUFJJTUFSWV9BQzk3ICwgaW8gKyBHUElPX01BU0spOworICAgICAgICBvdXR3KDAsIGlvICsgR1BJT19EQVRBKTsKKyAgICAgICAgb3V0dyhkaXIgfCBHUE9fUFJJTUFSWV9BQzk3LCBpbyArIEdQSU9fRElSRUNUSU9OKTsKKworICAgICAgICBpZihidXN5d2FpdCkgIHsKKyAgICAgICAgICAgIG1kZWxheShkZWxheTEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworICAgICAgICAgICAgc2NoZWR1bGVfdGltZW91dCgoZGVsYXkxICogSFopIC8gMTAwMCk7CisgICAgICAgIH0KKworICAgICAgICBvdXR3KEdQT19QUklNQVJZX0FDOTcsIGlvICsgR1BJT19EQVRBKTsKKyAgICAgICAgdWRlbGF5KDUpOworICAgICAgICAvKiBvaywgYnJpbmcgYmFjayB0aGUgYWMtbGluayAqLworICAgICAgICBvdXR3KElPX1NSQU1fRU5BQkxFIHwgU0VSSUFMX0FDX0xJTktfRU5BQkxFLCBpbyArIFJJTkdfQlVTX0NUUkxfQSk7CisgICAgICAgIG91dHcofjAsIGlvICsgR1BJT19NQVNLKTsKKworICAgICAgICBpZihidXN5d2FpdCkgeworICAgICAgICAgICAgbWRlbGF5KGRlbGF5Mik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisgICAgICAgICAgICBzY2hlZHVsZV90aW1lb3V0KChkZWxheTIgKiBIWikgLyAxMDAwKTsKKyAgICAgICAgfQorICAgICAgICBpZighIHRyeV9yZWFkX3ZlbmRvcihjYXJkKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlbGF5MSArPSAxMDsKKyAgICAgICAgZGVsYXkyICs9IDEwMDsKKworICAgICAgICBEUFJJTlRLKERQTU9ELCAicmV0cnlpbmcgY29kZWMgcmVzZXQgd2l0aCBkZWxheXMgb2YgJWQgYW5kICVkIG1zXG4iLAorICAgICAgICAgICAgICAgIGRlbGF5MSwgZGVsYXkyKTsKKyAgICB9CisKKyNpZiAwCisgICAgLyogbW9yZSBndW5nLWhvIHJlc2V0IHRoYXQgZG9lc24ndAorICAgICAqIHNlZW0gdG8gd29yayBhbnl3aGVyZSA6KQorICAgICAqLworICAgIHRtcCA9IGludyhpbyArIFJJTkdfQlVTX0NUUkxfQSk7CisgICAgb3V0dyhSQUNfU0RGU19FTkFCTEV8TEFDX1NERlNfRU5BQkxFLCBpbyArIFJJTkdfQlVTX0NUUkxfQSk7CisgICAgbWRlbGF5KDIwKTsKKyAgICBvdXR3KHRtcCwgaW8gKyBSSU5HX0JVU19DVFJMX0EpOworICAgIG1kZWxheSg1MCk7CisjZW5kaWYKK30KKworc3RhdGljIGludCBfX2RldmluaXQgbTNfY29kZWNfaW5zdGFsbChzdHJ1Y3QgbTNfY2FyZCAqY2FyZCkKK3sKKyAgICBzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CisKKyAgICBpZiAoKGNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLUVOT01FTTsKKworICAgIGNvZGVjLT5wcml2YXRlX2RhdGEgPSBjYXJkOworICAgIGNvZGVjLT5jb2RlY19yZWFkID0gbTNfYWM5N19yZWFkOworICAgIGNvZGVjLT5jb2RlY193cml0ZSA9IG0zX2FjOTdfd3JpdGU7CisgICAgLyogc29tZWRheSB3ZSBzaG91bGQgc3VwcG9ydCBzZWNvbmRhcnkgY29kZWNzLi4gKi8KKyAgICBjb2RlYy0+aWQgPSAwOworCisgICAgaWYgKGFjOTdfcHJvYmVfY29kZWMoY29kZWMpID09IDApIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiY29kZWMgcHJvYmUgZmFpbGVkXG4iKTsKKyAgICAgICAgYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmICgoY29kZWMtPmRldl9taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZtM19taXhlcl9mb3BzLCAtMSkpIDwgMCkgeworICAgICAgICBwcmludGsoS0VSTl9FUlIgUEZYICJjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOworICAgICAgICBhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgY2FyZC0+YWM5NyA9IGNvZGVjOworCisgICAgcmV0dXJuIDA7Cit9CisKKworI2RlZmluZSBNSU5JU1JDX0xQRl9MRU4gMTAKK3N0YXRpYyB1MTYgbWluaXNyY19scGZbTUlOSVNSQ19MUEZfTEVOXSA9IHsKKyAgICAwWDA3NDMsIDBYMTEwNCwgMFgwQTRDLCAwWEY4OEQsIDBYMjQyQywKKyAgICAwWDEwMjMsIDBYMUFBOSwgMFgwQjYwLCAwWEVGREQsIDBYMTg2RgorfTsKK3N0YXRpYyB2b2lkIG0zX2Fzc3BfaW5pdChzdHJ1Y3QgbTNfY2FyZCAqY2FyZCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIHplcm8ga2VybmVsIGRhdGEgKi8KKyAgICBmb3IoaSA9IDAgOyBpIDwgKFJFVl9CX0RBVEFfTUVNT1JZX1VOSVRfTEVOR1RIICogTlVNX1VOSVRTX0tFUk5FTF9EQVRBKSAvIDI7IGkrKykKKyAgICAgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsIAorICAgICAgICAgICAgICAgIEtEQVRBX0JBU0VfQUREUiArIGksIDApOworCisgICAgLyogemVybyBtaXhlciBkYXRhPyAqLworICAgIGZvcihpID0gMCA7IGkgPCAoUkVWX0JfREFUQV9NRU1PUllfVU5JVF9MRU5HVEggKiBOVU1fVU5JVFNfS0VSTkVMX0RBVEEpIC8gMjsgaSsrKQorICAgICAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwgCisgICAgICAgICAgICAgICAgS0RBVEFfQkFTRV9BRERSMiArIGksIDApOworCisgICAgLyogaW5pdCBkbWEgcG9pbnRlciAqLworICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLCAKKyAgICAgICAgICAgIEtEQVRBX0NVUlJFTlRfRE1BLCAKKyAgICAgICAgICAgIEtEQVRBX0RNQV9YRkVSMCk7CisKKyAgICAvKiB3cml0ZSBrZXJuZWwgaW50byBjb2RlIG1lbW9yeS4uICovCisgICAgZm9yKGkgPSAwIDsgaSA8IHNpemVvZihhc3NwX2tlcm5lbF9pbWFnZSkgLyAyOyBpKyspIHsKKyAgICAgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0NPREUsIAorICAgICAgICAgICAgICAgIFJFVl9CX0NPREVfTUVNT1JZX0JFR0lOICsgaSwgCisgICAgICAgICAgICAgICAgYXNzcF9rZXJuZWxfaW1hZ2VbaV0pOworICAgIH0KKworICAgIC8qCisgICAgICogV2Ugb25seSBoYXZlIHRoaXMgb25lIGNsaWVudCBhbmQgd2Uga25vdyB0aGF0IDB4NDAwCisgICAgICogaXMgZnJlZSBpbiBvdXIga2VybmVsJ3MgbWVtIG1hcCwgc28gbGV0cyBqdXN0CisgICAgICogZHJvcCBpdCB0aGVyZS4gIEl0IHNlZW1zIHRoYXQgdGhlIG1pbmlzcmMgZG9lc24ndAorICAgICAqIG5lZWQgdmVjdG9ycywgc28gd2Ugd29uJ3QgYm90aGVyIHdpdGggdGhlbS4uCisgICAgICovCisgICAgZm9yKGkgPSAwIDsgaSA8IHNpemVvZihhc3NwX21pbmlzcmNfaW1hZ2UpIC8gMjsgaSsrKSB7CisgICAgICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9DT0RFLCAKKyAgICAgICAgICAgICAgICAweDQwMCArIGksIAorICAgICAgICAgICAgICAgIGFzc3BfbWluaXNyY19pbWFnZVtpXSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiB3cml0ZSB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgbG93IHBhc3MgZmlsdGVyPworICAgICAqLworICAgIGZvcihpID0gMDsgaSA8IE1JTklTUkNfTFBGX0xFTiA7IGkrKykgeworICAgICAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfQ09ERSwKKyAgICAgICAgICAgIDB4NDAwICsgTUlOSVNSQ19DT0VGX0xPQyArIGksCisgICAgICAgICAgICBtaW5pc3JjX2xwZltpXSk7CisgICAgfQorCisgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0NPREUsCisgICAgICAgIDB4NDAwICsgTUlOSVNSQ19DT0VGX0xPQyArIE1JTklTUkNfTFBGX0xFTiwKKyAgICAgICAgMHg4MDAwKTsKKworICAgIC8qCisgICAgICogdGhlIG1pbmlzcmMgaXMgdGhlIG9ubHkgdGhpbmcgb24KKyAgICAgKiBvdXIgdGFzayBsaXN0Li4KKyAgICAgKi8KKyAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwgCisgICAgICAgICAgICBLREFUQV9UQVNLMCwgCisgICAgICAgICAgICAweDQwMCk7CisKKyAgICAvKgorICAgICAqIGluaXQgdGhlIG1peGVyIG51bWJlci4uCisgICAgICovCisKKyAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwKKyAgICAgICAgICAgIEtEQVRBX01JWEVSX1RBU0tfTlVNQkVSLDApOworCisgICAgLyoKKyAgICAgKiBFWFRSRU1FIEtFUk5FTCBNQVNURVIgVk9MVU1FCisgICAgICovCisgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIEtEQVRBX0RBQ19MRUZUX1ZPTFVNRSwgQVJCX1ZPTFVNRSk7CisgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgIEtEQVRBX0RBQ19SSUdIVF9WT0xVTUUsIEFSQl9WT0xVTUUpOworCisgICAgY2FyZC0+bWl4ZXJfbGlzdC5tZW1fYWRkciA9IEtEQVRBX01JWEVSX1hGRVIwOworICAgIGNhcmQtPm1peGVyX2xpc3QubWF4ID0gTUFYX1ZJUlRVQUxfTUlYRVJfQ0hBTk5FTFM7CisgICAgY2FyZC0+YWRjMV9saXN0Lm1lbV9hZGRyID0gS0RBVEFfQURDMV9YRkVSMDsKKyAgICBjYXJkLT5hZGMxX2xpc3QubWF4ID0gTUFYX1ZJUlRVQUxfQURDMV9DSEFOTkVMUzsKKyAgICBjYXJkLT5kbWFfbGlzdC5tZW1fYWRkciA9IEtEQVRBX0RNQV9YRkVSMDsKKyAgICBjYXJkLT5kbWFfbGlzdC5tYXggPSBNQVhfVklSVFVBTF9ETUFfQ0hBTk5FTFM7CisgICAgY2FyZC0+bXNyY19saXN0Lm1lbV9hZGRyID0gS0RBVEFfSU5TVEFOQ0UwX01JTklTUkM7CisgICAgY2FyZC0+bXNyY19saXN0Lm1heCA9IE1BWF9JTlNUQU5DRV9NSU5JU1JDOworfQorCitzdGF0aWMgaW50IHNldHVwX21zcmMoc3RydWN0IG0zX2NhcmQgKmNhcmQsCisgICAgICAgIHN0cnVjdCBhc3NwX2luc3RhbmNlICppbnN0LCBpbnQgaW5kZXgpCit7CisgICAgaW50IGRhdGFfYnl0ZXMgPSAyICogKCBNSU5JU1JDX1RNUF9CVUZGRVJfU0laRSAvIDIgKyAKKyAgICAgICAgICAgIE1JTklTUkNfSU5fQlVGRkVSX1NJWkUgLyAyICsKKyAgICAgICAgICAgIDEgKyBNSU5JU1JDX09VVF9CVUZGRVJfU0laRSAvIDIgKyAxICk7CisgICAgaW50IGFkZHJlc3MsIGk7CisKKyAgICAvKgorICAgICAqIHRoZSByZXZiIG1lbW9yeSBtYXAgaGFzIDB4MTEwMCB0aHJvdWdoIDB4MWMwMAorICAgICAqIGZyZWUuICAKKyAgICAgKi8KKworICAgIC8qCisgICAgICogYWxpZ24gaW5zdGFuY2UgYWRkcmVzcyB0byAyNTYgYnl0ZXMgc28gdGhhdCBpdCdzCisgICAgICogc2hpZnRlZCBsaXN0IGFkZHJlc3MgaXMgYWxpZ25lZC4gIAorICAgICAqIGxpc3QgYWRkcmVzcyA9IChtZW0gYWRkcmVzcyA+PiAxKSA+PiA3OworICAgICAqLworICAgIGRhdGFfYnl0ZXMgPSAoZGF0YV9ieXRlcyArIDI1NSkgJiB+MjU1OworICAgIGFkZHJlc3MgPSAweDExMDAgKyAoKGRhdGFfYnl0ZXMvMikgKiBpbmRleCk7CisKKyAgICBpZigoYWRkcmVzcyArIChkYXRhX2J5dGVzLzIpKSA+PSAweDFjMDApIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAibm8gbWVtb3J5IGZvciAlZCBieXRlcyBhdCBpbmQgJWQgKGFkZHIgMHgleClcbiIsCisgICAgICAgICAgICAgICAgZGF0YV9ieXRlcywgaW5kZXgsIGFkZHJlc3MpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yKGkgPSAwOyBpIDwgZGF0YV9ieXRlcy8yIDsgaSsrKSAKKyAgICAgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0RBVEEsCisgICAgICAgICAgICAgICAgYWRkcmVzcyArIGksIDApOworCisgICAgaW5zdC0+Y29kZSA9IDB4NDAwOworICAgIGluc3QtPmRhdGEgPSBhZGRyZXNzOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbTNfYXNzcF9jbGllbnRfaW5pdChzdHJ1Y3QgbTNfc3RhdGUgKnMpCit7CisgICAgc2V0dXBfbXNyYyhzLT5jYXJkLCAmKHMtPmRhY19pbnN0KSwgcy0+aW5kZXggKiAyKTsKKyAgICBzZXR1cF9tc3JjKHMtPmNhcmQsICYocy0+YWRjX2luc3QpLCAocy0+aW5kZXggKiAyKSArIDEpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG0zX2FtcF9lbmFibGUoc3RydWN0IG0zX2NhcmQgKmNhcmQsIGludCBlbmFibGUpCit7CisgICAgLyogCisgICAgICogdGhpcyB3b3JrcyBmb3IgdGhlIHJlZmVyZW5jZSBib2FyZCwgaGF2ZSB0byBmaW5kCisgICAgICogb3V0IGFib3V0IG90aGVycworICAgICAqCisgICAgICogdGhpcyBuZWVkcyBtb3JlIG1hZ2ljIGZvciA0IHNwZWFrZXIsIGJ1dC4uCisgICAgICovCisgICAgaW50IGlvID0gY2FyZC0+aW9iYXNlOworICAgIHUxNiBncG8sIHBvbGFyaXR5X3BvcnQsIHBvbGFyaXR5OworCisgICAgaWYoIWV4dGVybmFsX2FtcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGdwaW9fcGluID49IDAgICYmIGdwaW9fcGluIDw9IDE1KSB7CisgICAgICAgIHBvbGFyaXR5X3BvcnQgPSAweDEwMDAgKyAoMHgxMDAgKiBncGlvX3Bpbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChjYXJkLT5jYXJkX3R5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgRVNTX0FMTEVHUk86CisgICAgICAgICAgICAgICAgcG9sYXJpdHlfcG9ydCA9IDB4MTgwMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcG9sYXJpdHlfcG9ydCA9IDB4MTEwMDsKKyAgICAgICAgICAgICAgICAvKiBQYW5hc29uaWMgdG91Z2hib29rIENGNzIgaGFzIHRvIGJlIGRpZmZlcmVudC4uLiAqLworICAgICAgICAgICAgICAgIGlmKGNhcmQtPnBjaWRldi0+c3Vic3lzdGVtX3ZlbmRvciA9PSAweDEwRjcgJiYgY2FyZC0+cGNpZGV2LT5zdWJzeXN0ZW1fZGV2aWNlID09IDB4ODMzRCkKKyAgICAgICAgICAgICAgICAJcG9sYXJpdHlfcG9ydCA9IDB4MUQwMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdwbyA9IChwb2xhcml0eV9wb3J0ID4+IDgpICYgMHgwRjsKKyAgICBwb2xhcml0eSA9IHBvbGFyaXR5X3BvcnQgPj4gMTI7CisgICAgaWYgKCBlbmFibGUgKQorICAgICAgICBwb2xhcml0eSA9ICFwb2xhcml0eTsKKyAgICBwb2xhcml0eSA9IHBvbGFyaXR5IDw8IGdwbzsKKyAgICBncG8gPSAxIDw8IGdwbzsKKworICAgIG91dHcofmdwbyAsIGlvICsgR1BJT19NQVNLKTsKKworICAgIG91dHcoIGludyhpbyArIEdQSU9fRElSRUNUSU9OKSB8IGdwbyAsCisgICAgICAgICAgICBpbyArIEdQSU9fRElSRUNUSU9OKTsKKworICAgIG91dHcoIChHUE9fU0VDT05EQVJZX0FDOTcgfCBHUE9fUFJJTUFSWV9BQzk3IHwgcG9sYXJpdHkpICwKKyAgICAgICAgICAgIGlvICsgR1BJT19EQVRBKTsKKworICAgIG91dHcoMHhmZmZmICwgaW8gKyBHUElPX01BU0spOworfQorCitzdGF0aWMgaW50CittYWVzdHJvX2NvbmZpZyhzdHJ1Y3QgbTNfY2FyZCAqY2FyZCkgCit7CisgICAgc3RydWN0IHBjaV9kZXYgKnBjaWRldiA9IGNhcmQtPnBjaWRldjsKKyAgICB1MzIgbjsKKyAgICB1OCAgdDsgLyogbWFrZXMgYXMgbXVjaCBzZW5zZSBhcyAnbicsIG5vPyAqLworCisgICAgcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0FMTEVHUk9fQ09ORklHLCAmbik7CisgICAgbiAmPSBSRURVQ0VEX0RFQk9VTkNFOworICAgIG4gfD0gUE1fQ1RSTF9FTkFCTEUgfCBDTEtfRElWX0JZXzQ5IHwgVVNFX1BDSV9USU1JTkc7CisgICAgcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIFBDSV9BTExFR1JPX0NPTkZJRywgbik7CisKKyAgICBvdXRiKFJFU0VUX0FTU1AsIGNhcmQtPmlvYmFzZSArIEFTU1BfQ09OVFJPTF9CKTsKKyAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfQUxMRUdST19DT05GSUcsICZuKTsKKyAgICBuICY9IH5JTlRfQ0xLX1NFTEVDVDsKKyAgICBpZihjYXJkLT5jYXJkX3R5cGUgPj0gRVNTX01BRVNUUk8zKSAgeworICAgICAgICBuICY9IH5JTlRfQ0xLX01VTFRfRU5BQkxFOyAKKyAgICAgICAgbiB8PSBJTlRfQ0xLX1NSQ19OT1RfUENJOworICAgIH0KKyAgICBuICY9ICB+KCBDTEtfTVVMVF9NT0RFX1NFTEVDVCB8IENMS19NVUxUX01PREVfU0VMRUNUXzIgKTsKKyAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX0FMTEVHUk9fQ09ORklHLCBuKTsKKworICAgIGlmKGNhcmQtPmNhcmRfdHlwZSA8PSBFU1NfQUxMRUdSTykgeworICAgICAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpZGV2LCBQQ0lfVVNFUl9DT05GSUcsICZuKTsKKyAgICAgICAgbiB8PSBJTl9DTEtfMTJNSFpfU0VMRUNUOworICAgICAgICBwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaWRldiwgUENJX1VTRVJfQ09ORklHLCBuKTsKKyAgICB9CisKKyAgICB0ID0gaW5iKGNhcmQtPmlvYmFzZSArIEFTU1BfQ09OVFJPTF9BKTsKKyAgICB0ICY9IH4oIERTUF9DTEtfMzZNSFpfU0VMRUNUICB8IEFTU1BfQ0xLXzQ5TUhaX1NFTEVDVCk7CisgICAgdCB8PSBBU1NQX0NMS180OU1IWl9TRUxFQ1Q7CisgICAgdCB8PSBBU1NQXzBfV1NfRU5BQkxFOyAKKyAgICBvdXRiKHQsIGNhcmQtPmlvYmFzZSArIEFTU1BfQ09OVFJPTF9BKTsKKworICAgIG91dGIoUlVOX0FTU1AsIGNhcmQtPmlvYmFzZSArIEFTU1BfQ09OVFJPTF9CKTsgCisKKyAgICByZXR1cm4gMDsKK30gCisKK3N0YXRpYyB2b2lkIG0zX2VuYWJsZV9pbnRzKHN0cnVjdCBtM19jYXJkICpjYXJkKQoreworICAgIHVuc2lnbmVkIGxvbmcgaW8gPSBjYXJkLT5pb2Jhc2U7CisKKyAgICBvdXR3KEFTU1BfSU5UX0VOQUJMRSwgaW8gKyBIT1NUX0lOVF9DVFJMKTsKKyAgICBvdXRiKGluYihpbyArIEFTU1BfQ09OVFJPTF9DKSB8IEFTU1BfSE9TVF9JTlRfRU5BQkxFLAorICAgICAgICAgICAgaW8gKyBBU1NQX0NPTlRST0xfQyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG0zX2F1ZGlvX2ZvcHMgPSB7CisJLm93bmVyCSA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJID0gbm9fbGxzZWVrLAorCS5yZWFkCSA9IG0zX3JlYWQsCisJLndyaXRlCSA9IG0zX3dyaXRlLAorCS5wb2xsCSA9IG0zX3BvbGwsCisJLmlvY3RsCSA9IG0zX2lvY3RsLAorCS5tbWFwCSA9IG0zX21tYXAsCisJLm9wZW4JID0gbTNfb3BlbiwKKwkucmVsZWFzZSA9IG0zX3JlbGVhc2UsCit9OworCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IGFsbG9jX2RzcF9zdXNwZW5kbWVtKHN0cnVjdCBtM19jYXJkICpjYXJkKQoreworICAgIGludCBsZW4gPSBzaXplb2YodTE2KSAqIChSRVZfQl9DT0RFX01FTU9SWV9MRU5HVEggKyBSRVZfQl9EQVRBX01FTU9SWV9MRU5HVEgpOworCisgICAgaWYoIChjYXJkLT5zdXNwZW5kX21lbSA9IHZtYWxsb2MobGVuKSkgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDE7CisKKyAgICByZXR1cm4gMDsKK30KK3N0YXRpYyB2b2lkIGZyZWVfZHNwX3N1c3BlbmRtZW0oc3RydWN0IG0zX2NhcmQgKmNhcmQpCit7CisgICBpZihjYXJkLT5zdXNwZW5kX21lbSkKKyAgICAgICB2ZnJlZShjYXJkLT5zdXNwZW5kX21lbSk7Cit9CisKKyNlbHNlCisjZGVmaW5lIGFsbG9jX2RzcF9zdXNwZW5kbWVtKGFyZ3MuLi4pIDAKKyNkZWZpbmUgZnJlZV9kc3Bfc3VzcGVuZG1lbShhcmdzLi4uKSAKKyNlbmRpZgorCisvKgorICogZ3JlYXQgZGF5ISAgdGhpcyBmdW5jdGlvbiBpcyB1Z2x5IGFzIGhlbGwuCisgKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0IG0zX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpX2lkKQoreworICAgIHUzMiBuOworICAgIGludCBpOworICAgIHN0cnVjdCBtM19jYXJkICpjYXJkID0gTlVMTDsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpbnQgY2FyZF90eXBlID0gcGNpX2lkLT5kcml2ZXJfZGF0YTsKKworICAgIERQUklOVEsoRFBNT0QsICJpbiBtYWVzdHJvX2luc3RhbGxcbiIpOworCisgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaV9kZXYpKQorICAgICAgICByZXR1cm4gLUVJTzsKKworICAgIGlmIChwY2lfc2V0X2RtYV9tYXNrKHBjaV9kZXYsIE0zX1BDSV9ETUFfTUFTSykpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fRVJSIFBGWCAiYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgbGltaXRpbmcgdG8gMjhiaXQgUENJIGJ1cyBhZGRyZXNzZXNcbiIpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisgICAgICAgIAorICAgIHBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOworCisgICAgaWYoIChjYXJkID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG0zX2NhcmQpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAib3V0IG9mIG1lbW9yeVxuIik7CisgICAgICAgIHJldHVybiAtRU5PTUVNOworICAgIH0KKyAgICBtZW1zZXQoY2FyZCwgMCwgc2l6ZW9mKHN0cnVjdCBtM19jYXJkKSk7CisgICAgY2FyZC0+cGNpZGV2ID0gcGNpX2RldjsKKyAgICBpbml0X3dhaXRxdWV1ZV9oZWFkKCZjYXJkLT5zdXNwZW5kX3F1ZXVlKTsKKworICAgIGlmICggISByZXF1ZXN0X3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksCisgICAgICAgICAgICAgICAgcGNpX3Jlc291cmNlX2xlbiAocGNpX2RldiwgMCksIE0zX01PRFVMRV9OQU1FKSkgeworCisgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJ1bmFibGUgdG8gcmVzZXJ2ZSBJL08gc3BhY2UuXG4iKTsKKyAgICAgICAgcmV0ID0gLUVCVVNZOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBjYXJkLT5pb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCk7CisKKyAgICBpZihhbGxvY19kc3Bfc3VzcGVuZG1lbShjYXJkKSkgeworICAgICAgICBwcmludGsoS0VSTl9XQVJOSU5HIFBGWCAiY291bGRuJ3QgYWxsb2MgJWQgYnl0ZXMgZm9yIHNhdmluZyBkc3Agc3RhdGUgb24gc3VzcGVuZFxuIiwKKyAgICAgICAgICAgICAgICBSRVZfQl9DT0RFX01FTU9SWV9MRU5HVEggKyBSRVZfQl9EQVRBX01FTU9SWV9MRU5HVEgpOworICAgICAgICByZXQgPSAtRU5PTUVNOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBjYXJkLT5jYXJkX3R5cGUgPSBjYXJkX3R5cGU7CisgICAgY2FyZC0+aXJxID0gcGNpX2Rldi0+aXJxOworICAgIGNhcmQtPm5leHQgPSBkZXZzOworICAgIGNhcmQtPm1hZ2ljID0gTTNfQ0FSRF9NQUdJQzsKKyAgICBzcGluX2xvY2tfaW5pdCgmY2FyZC0+bG9jayk7CisgICAgc3Bpbl9sb2NrX2luaXQoJmNhcmQtPmFjOTdfbG9jayk7CisgICAgZGV2cyA9IGNhcmQ7CisgICAgZm9yKGkgPSAwOyBpPE5SX0RTUFM7IGkrKykgeworICAgICAgICBzdHJ1Y3QgbTNfc3RhdGUgKnMgPSAmKGNhcmQtPmNoYW5uZWxzW2ldKTsKKyAgICAgICAgcy0+ZGV2X2F1ZGlvID0gLTE7CisgICAgfQorCisgICAgcHJpbnRrKEtFUk5fSU5GTyBQRlggIkNvbmZpZ3VyaW5nIEVTUyAlcyBmb3VuZCBhdCBJTyAweCUwNFggSVJRICVkXG4iLCAKKyAgICAgICAgY2FyZF9uYW1lc1tjYXJkLT5jYXJkX3R5cGVdLCBjYXJkLT5pb2Jhc2UsIGNhcmQtPmlycSk7CisKKyAgICBwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgUENJX1NVQlNZU1RFTV9WRU5ET1JfSUQsICZuKTsKKyAgICBwcmludGsoS0VSTl9JTkZPIFBGWCAiIHN1YnZlbmRvciBpZDogMHglMDh4XG4iLG4pOyAKKworICAgIG1hZXN0cm9fY29uZmlnKGNhcmQpOworICAgIG0zX2Fzc3BfaGFsdChjYXJkKTsKKworICAgIG0zX2NvZGVjX3Jlc2V0KGNhcmQsIDApOworCisgICAgaWYobTNfY29kZWNfaW5zdGFsbChjYXJkKSkgIHsKKyAgICAgICAgcmV0ID0gLUVJTzsgCisgICAgICAgIGdvdG8gb3V0OworICAgIH0KKworICAgIG0zX2Fzc3BfaW5pdChjYXJkKTsKKyAgICBtM19hbXBfZW5hYmxlKGNhcmQsIDEpOworICAgIAorICAgIGZvcihpPTA7aTxOUl9EU1BTO2krKykgeworICAgICAgICBzdHJ1Y3QgbTNfc3RhdGUgKnM9JmNhcmQtPmNoYW5uZWxzW2ldOworCisgICAgICAgIHMtPmluZGV4ID0gaTsKKworICAgICAgICBzLT5jYXJkID0gY2FyZDsKKyAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKyAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYy53YWl0KTsKKyAgICAgICAgaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKKyAgICAgICAgaW5pdF9NVVRFWCgmKHMtPm9wZW5fc2VtKSk7CisgICAgICAgIHMtPm1hZ2ljID0gTTNfU1RBVEVfTUFHSUM7CisKKyAgICAgICAgbTNfYXNzcF9jbGllbnRfaW5pdChzKTsKKyAgICAgICAgCisgICAgICAgIGlmKHMtPmRtYV9hZGMucmVhZHkgfHwgcy0+ZG1hX2RhYy5yZWFkeSB8fCBzLT5kbWFfYWRjLnJhd2J1ZikKKyAgICAgICAgICAgIHByaW50ayhLRVJOX1dBUk5JTkcgUEZYICJpbml0aW5nIGEgZHNwIGRldmljZSB0aGF0IGlzIGFscmVhZHkgaW4gdXNlP1xuIik7CisgICAgICAgIC8qIHJlZ2lzdGVyIGRldmljZXMgKi8KKyAgICAgICAgaWYgKChzLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJm0zX2F1ZGlvX2ZvcHMsIC0xKSkgPCAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBhbGxvY2F0ZV9kbWFidWYoY2FyZC0+cGNpZGV2LCAmKHMtPmRtYV9hZGMpKSB8fAorICAgICAgICAgICAgICAgIGFsbG9jYXRlX2RtYWJ1ZihjYXJkLT5wY2lkZXYsICYocy0+ZG1hX2RhYykpKSAgeyAKKyAgICAgICAgICAgIHJldCA9IC1FTk9NRU07CisgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBpZihyZXF1ZXN0X2lycShjYXJkLT5pcnEsIG0zX2ludGVycnVwdCwgU0FfU0hJUlEsIGNhcmRfbmFtZXNbY2FyZC0+Y2FyZF90eXBlXSwgY2FyZCkpIHsKKworICAgICAgICBwcmludGsoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkLFxuIiwgY2FyZC0+aXJxKTsKKworICAgICAgICByZXQgPSAtRUlPOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisKKyAgICBwY2lfc2V0X2RydmRhdGEocGNpX2RldiwgY2FyZCk7CisgICAgCisgICAgbTNfZW5hYmxlX2ludHMoY2FyZCk7CisgICAgbTNfYXNzcF9jb250aW51ZShjYXJkKTsKKworb3V0OgorICAgIGlmKHJldCkgeworICAgICAgICBpZihjYXJkLT5pb2Jhc2UpCisgICAgICAgICAgICByZWxlYXNlX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCksIHBjaV9yZXNvdXJjZV9sZW4ocGNpX2RldiwgMCkpOworICAgICAgICBmcmVlX2RzcF9zdXNwZW5kbWVtKGNhcmQpOworICAgICAgICBpZihjYXJkLT5hYzk3KSB7CisgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGNhcmQtPmFjOTctPmRldl9taXhlcik7CisgICAgICAgICAgICBrZnJlZShjYXJkLT5hYzk3KTsKKyAgICAgICAgfQorICAgICAgICBmb3IoaT0wO2k8TlJfRFNQUztpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBtM19zdGF0ZSAqcyA9ICZjYXJkLT5jaGFubmVsc1tpXTsKKyAgICAgICAgICAgIGlmKHMtPmRldl9hdWRpbyAhPSAtMSkKKyAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyX3NvdW5kX2RzcChzLT5kZXZfYXVkaW8pOworICAgICAgICB9CisgICAgICAgIGtmcmVlKGNhcmQpOworICAgIH0KKworICAgIHJldHVybiByZXQ7IAorfQorCitzdGF0aWMgdm9pZCBtM19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisgICAgc3RydWN0IG0zX2NhcmQgKmNhcmQ7CisKKyAgICB1bnJlZ2lzdGVyX3JlYm9vdF9ub3RpZmllcigmbTNfcmVib290X25iKTsKKworICAgIHdoaWxlICgoY2FyZCA9IGRldnMpKSB7CisgICAgICAgIGludCBpOworICAgICAgICBkZXZzID0gZGV2cy0+bmV4dDsKKyAgICAKKyAgICAgICAgZnJlZV9pcnEoY2FyZC0+aXJxLCBjYXJkKTsKKyAgICAgICAgdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjYXJkLT5hYzk3LT5kZXZfbWl4ZXIpOworICAgICAgICBrZnJlZShjYXJkLT5hYzk3KTsKKworICAgICAgICBmb3IoaT0wO2k8TlJfRFNQUztpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHN0cnVjdCBtM19zdGF0ZSAqcyA9ICZjYXJkLT5jaGFubmVsc1tpXTsKKyAgICAgICAgICAgIGlmKHMtPmRldl9hdWRpbyA8IDApCisgICAgICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgICAgIHVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisgICAgICAgICAgICBmcmVlX2RtYWJ1ZihjYXJkLT5wY2lkZXYsICZzLT5kbWFfYWRjKTsKKyAgICAgICAgICAgIGZyZWVfZG1hYnVmKGNhcmQtPnBjaWRldiwgJnMtPmRtYV9kYWMpOworICAgICAgICB9CisKKyAgICAgICAgcmVsZWFzZV9yZWdpb24oY2FyZC0+aW9iYXNlLCAyNTYpOworICAgICAgICBmcmVlX2RzcF9zdXNwZW5kbWVtKGNhcmQpOworICAgICAgICBrZnJlZShjYXJkKTsKKyAgICB9CisgICAgZGV2cyA9IE5VTEw7Cit9CisKKy8qCisgKiBzb21lIGJpb3NlcyBsaWtlIHRoZSBzb3VuZCBjaGlwIHRvIGJlIHBvd2VyZWQgZG93bgorICogYXQgc2h1dGRvd24uICBXZSdyZSBqdXN0IGNhbGxpbmcgX3N1c3BlbmQgdG8KKyAqIGFjaGlldmUgdGhhdC4uCisgKi8KK3N0YXRpYyBpbnQgbTNfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqYnVmKQoreworICAgIHN0cnVjdCBtM19jYXJkICpjYXJkOworCisgICAgRFBSSU5USyhEUE1PRCwgIm5vdGlmaWVyIHN1c3BlbmRpbmcgYWxsIGNhcmRzXG4iKTsKKworICAgIGZvcihjYXJkID0gZGV2czsgY2FyZCAhPSBOVUxMOyBjYXJkID0gY2FyZC0+bmV4dCkgeworICAgICAgICBpZighY2FyZC0+aW5fc3VzcGVuZCkKKyAgICAgICAgICAgIG0zX3N1c3BlbmQoY2FyZC0+cGNpZGV2LCBQTVNHX1NVU1BFTkQpOyAvKiBYWFggbGVnYWw/ICovCisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IG0zX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCBpOworICAgIHN0cnVjdCBtM19jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCisgICAgLyogbXVzdCBiZSBhIGJldHRlciB3YXkuLiAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICBEUFJJTlRLKERQTU9ELCAicG0gaW4gZGV2ICVwXG4iLGNhcmQpOworCisgICAgZm9yKGk9MDtpPE5SX0RTUFM7aSsrKSB7CisgICAgICAgIHN0cnVjdCBtM19zdGF0ZSAqcyA9ICZjYXJkLT5jaGFubmVsc1tpXTsKKworICAgICAgICBpZihzLT5kZXZfYXVkaW8gPT0gLTEpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBEUFJJTlRLKERQTU9ELCAic3RvcF9hZGMvZGFjKCkgZGV2aWNlICVkXG4iLGkpOworICAgICAgICBzdG9wX2RhYyhzKTsKKyAgICAgICAgc3RvcF9hZGMocyk7CisgICAgfQorCisgICAgbWRlbGF5KDEwKTsgLyogZ2l2ZSB0aGUgYXNzcCBhIGNoYW5jZSB0byBpZGxlLi4gKi8KKworICAgIG0zX2Fzc3BfaGFsdChjYXJkKTsKKworICAgIGlmKGNhcmQtPnN1c3BlbmRfbWVtKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisKKyAgICAgICAgRFBSSU5USyhEUE1PRCwgInNhdmluZyBjb2RlXG4iKTsKKyAgICAgICAgZm9yKGkgPSBSRVZfQl9DT0RFX01FTU9SWV9CRUdJTiA7IGkgPD0gUkVWX0JfQ09ERV9NRU1PUllfRU5EOyBpKyspCisgICAgICAgICAgICBjYXJkLT5zdXNwZW5kX21lbVtpbmRleCsrXSA9IAorICAgICAgICAgICAgICAgIG0zX2Fzc3BfcmVhZChjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0NPREUsIGkpOworICAgICAgICBEUFJJTlRLKERQTU9ELCAic2F2aW5nIGRhdGFcbiIpOworICAgICAgICBmb3IoaSA9IFJFVl9CX0RBVEFfTUVNT1JZX0JFR0lOIDsgaSA8PSBSRVZfQl9EQVRBX01FTU9SWV9FTkQ7IGkrKykKKyAgICAgICAgICAgIGNhcmQtPnN1c3BlbmRfbWVtW2luZGV4KytdID0gCisgICAgICAgICAgICAgICAgbTNfYXNzcF9yZWFkKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwgaSk7CisgICAgfQorCisgICAgRFBSSU5USyhEUE1PRCwgInBvd2VyaW5nIGRvd24gYXBjaSByZWdzXG4iKTsKKyAgICBtM19vdXR3KGNhcmQsIDB4ZmZmZiwgMHg1NCk7CisgICAgbTNfb3V0dyhjYXJkLCAweGZmZmYsIDB4NTYpOworCisgICAgY2FyZC0+aW5fc3VzcGVuZCA9IDE7CisKKyAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtM19yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICBpbnQgaW5kZXg7CisgICAgaW50IGk7CisgICAgc3RydWN0IG0zX2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEocGNpX2Rldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworICAgIGNhcmQtPmluX3N1c3BlbmQgPSAwOworCisgICAgRFBSSU5USyhEUE1PRCwgInJlc3VtaW5nXG4iKTsKKworICAgIC8qIGZpcnN0IGxldHMganVzdCBicmluZyBldmVyeXRoaW5nIGJhY2suIC4qLworCisgICAgRFBSSU5USyhEUE1PRCwgImJyaW5naW5nIHBvd2VyIGJhY2sgb24gY2FyZCAweCVwXG4iLGNhcmQpOworICAgIG0zX291dHcoY2FyZCwgMCwgMHg1NCk7CisgICAgbTNfb3V0dyhjYXJkLCAwLCAweDU2KTsKKworICAgIERQUklOVEsoRFBNT0QsICJyZXN0b3JpbmcgcGNpIGNvbmZpZ3MgYW5kIHJlc2V0aW5nIGNvZGVjXG4iKTsKKyAgICBtYWVzdHJvX2NvbmZpZyhjYXJkKTsKKyAgICBtM19hc3NwX2hhbHQoY2FyZCk7CisgICAgbTNfY29kZWNfcmVzZXQoY2FyZCwgMSk7CisKKyAgICBEUFJJTlRLKERQTU9ELCAicmVzdG9yaW5nIGRzcCBjb2RlIGNhcmRcbiIpOworICAgIGluZGV4ID0gMDsKKyAgICBmb3IoaSA9IFJFVl9CX0NPREVfTUVNT1JZX0JFR0lOIDsgaSA8PSBSRVZfQl9DT0RFX01FTU9SWV9FTkQ7IGkrKykKKyAgICAgICAgbTNfYXNzcF93cml0ZShjYXJkLCBNRU1UWVBFX0lOVEVSTkFMX0NPREUsIGksIAorICAgICAgICAgICAgY2FyZC0+c3VzcGVuZF9tZW1baW5kZXgrK10pOworICAgIGZvcihpID0gUkVWX0JfREFUQV9NRU1PUllfQkVHSU4gOyBpIDw9IFJFVl9CX0RBVEFfTUVNT1JZX0VORDsgaSsrKQorICAgICAgICBtM19hc3NwX3dyaXRlKGNhcmQsIE1FTVRZUEVfSU5URVJOQUxfREFUQSwgaSwgCisgICAgICAgICAgICBjYXJkLT5zdXNwZW5kX21lbVtpbmRleCsrXSk7CisKKyAgICAgLyogdGVsbCB0aGUgZG1hIGVuZ2luZSB0byByZXN0YXJ0IGl0c2VsZiAqLworICAgIG0zX2Fzc3Bfd3JpdGUoY2FyZCwgTUVNVFlQRV9JTlRFUk5BTF9EQVRBLCAKKyAgICAgICAgS0RBVEFfRE1BX0FDVElWRSwgMCk7CisKKyAgICBEUFJJTlRLKERQTU9ELCAicmVzdW1pbmcgZHNwXG4iKTsKKyAgICBtM19hc3NwX2NvbnRpbnVlKGNhcmQpOworCisgICAgRFBSSU5USyhEUE1PRCwgImVuYWJsaW5nIGludHNcbiIpOworICAgIG0zX2VuYWJsZV9pbnRzKGNhcmQpOworCisgICAgLyogYnJpbmcgYmFjayB0aGUgb2xkIHNjaG9vbCBmbGF2b3IgKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMgOyBpKyspIHsKKyAgICAgICAgaW50IHN0YXRlID0gY2FyZC0+YWM5Ny0+bWl4ZXJfc3RhdGVbaV07CisgICAgICAgIGlmICghc3VwcG9ydGVkX21peGVyKGNhcmQtPmFjOTcsIGkpKSAKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBjYXJkLT5hYzk3LT53cml0ZV9taXhlcihjYXJkLT5hYzk3LCBpLCAKKyAgICAgICAgICAgICAgICBzdGF0ZSAmIDB4ZmYsIChzdGF0ZSA+PiA4KSAmIDB4ZmYpOworICAgIH0KKworICAgIG0zX2FtcF9lbmFibGUoY2FyZCwgMSk7CisKKyAgICAvKiAKKyAgICAgKiBub3cgd2UgZmxpcCBvbiB0aGUgbXVzaWMgCisgICAgICovCisgICAgZm9yKGk9MDtpPE5SX0RTUFM7aSsrKSB7CisgICAgICAgIHN0cnVjdCBtM19zdGF0ZSAqcyA9ICZjYXJkLT5jaGFubmVsc1tpXTsKKyAgICAgICAgaWYocy0+ZGV2X2F1ZGlvID09IC0xKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIC8qCisgICAgICAgICAqIGRiLT5yZWFkeSBtYWtlcyBpdCBzbyB0aGVzZSBndXlzIGNhbiBiZQorICAgICAgICAgKiBjYWxsZWQgdW5jb25kaXRpb25hbGx5Li4KKyAgICAgICAgICovCisgICAgICAgIERQUklOVEsoRFBNT0QsICJ0dXJuaW5nIG9uIGRhY3MgaW5kICVkXG4iLGkpOworICAgICAgICBzdGFydF9kYWMocyk7ICAgIAorICAgICAgICBzdGFydF9hZGMocyk7ICAgIAorICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKworICAgIC8qIAorICAgICAqIGFsbCByaWdodCwgd2UgdGhpbmsgdGhpbmdzIGFyZSByZWFkeSwgCisgICAgICogd2FrZSB1cCBwZW9wbGUgd2hvIHdlcmUgdXNpbmcgdGhlIGRldmljZSAKKyAgICAgKiB3aGVuIHdlIHN1c3BlbmRlZAorICAgICAqLworICAgIHdha2VfdXAoJmNhcmQtPnN1c3BlbmRfcXVldWUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK01PRFVMRV9BVVRIT1IoIlphY2ggQnJvd24gPHphYkB6YWJiby5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkVTUyBNYWVzdHJvMy9BbGxlZ3JvIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjaWZkZWYgTV9ERUJVRworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworI2VuZGlmCittb2R1bGVfcGFyYW0oZXh0ZXJuYWxfYW1wLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGdwaW9fcGluLCBpbnQsIDApOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbTNfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkgID0gImVzc19tM19hdWRpbyIsCisJLmlkX3RhYmxlID0gbTNfaWRfdGFibGUsCisJLnByb2JlCSAgPSBtM19wcm9iZSwKKwkucmVtb3ZlCSAgPSBtM19yZW1vdmUsCisJLnN1c3BlbmQgID0gbTNfc3VzcGVuZCwKKwkucmVzdW1lCSAgPSBtM19yZXN1bWUsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBtM19pbml0X21vZHVsZSh2b2lkKQoreworICAgIHByaW50ayhLRVJOX0lORk8gUEZYICJ2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiBidWlsdCBhdCAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiXG4iKTsKKworICAgIGlmIChyZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJm0zX3JlYm9vdF9uYikpIHsKKyAgICAgICAgcHJpbnRrKEtFUk5fV0FSTklORyBQRlggInJlYm9vdCBub3RpZmllciByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7IC8qID8gKi8KKyAgICB9CisKKyAgICBpZiAocGNpX3JlZ2lzdGVyX2RyaXZlcigmbTNfcGNpX2RyaXZlcikpIHsKKyAgICAgICAgdW5yZWdpc3Rlcl9yZWJvb3Rfbm90aWZpZXIoJm0zX3JlYm9vdF9uYik7CisgICAgICAgIHJldHVybiAtRU5PREVWOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IG0zX2NsZWFudXBfbW9kdWxlKHZvaWQpCit7CisgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZtM19wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQobTNfaW5pdF9tb2R1bGUpOworbW9kdWxlX2V4aXQobTNfY2xlYW51cF9tb2R1bGUpOworCit2b2lkIGNoZWNrX3N1c3BlbmQoc3RydWN0IG0zX2NhcmQgKmNhcmQpCit7CisgICAgREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKyAgICBpZighY2FyZC0+aW5fc3VzcGVuZCkgCisgICAgICAgIHJldHVybjsKKworICAgIGNhcmQtPmluX3N1c3BlbmQrKzsKKyAgICBhZGRfd2FpdF9xdWV1ZSgmY2FyZC0+c3VzcGVuZF9xdWV1ZSwgJndhaXQpOworICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKyAgICBzY2hlZHVsZSgpOworICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZjYXJkLT5zdXNwZW5kX3F1ZXVlLCAmd2FpdCk7CisgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tYWVzdHJvMy5oIGIvc291bmQvb3NzL21hZXN0cm8zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlMjk4NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tYWVzdHJvMy5oCkBAIC0wLDAgKzEsODIxIEBACisvKgorICogICAgICBFU1MgVGVjaG5vbG9neSBhbGxlZ3JvIGF1ZGlvIGRyaXZlci4KKyAqCisgKiAgICAgIENvcHlyaWdodCAoQykgMTk5Mi0yMDAwICBEb24gS2ltIChkb24ua2ltQGVzc3RlY2guY29tKQorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICAgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgICAgIEhhY2tlZCBmb3IgdGhlIG1hZXN0cm8zIGRyaXZlciBieSB6YWIKKyAqLworCisvLyBBbGxlZ3JvIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycworI2RlZmluZSBQQ0lfTEVHQUNZX0FVRElPX0NUUkwgICAweDQwCisjZGVmaW5lIFNPVU5EX0JMQVNURVJfRU5BQkxFICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRk1fU1lOVEhFU0lTX0VOQUJMRSAgICAgMHgwMDAwMDAwMgorI2RlZmluZSBHQU1FX1BPUlRfRU5BQkxFICAgICAgICAweDAwMDAwMDA0CisjZGVmaW5lIE1QVTQwMV9JT19FTkFCTEUgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTVBVNDAxX0lSUV9FTkFCTEUgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBBTElBU18xMEJJVF9JTyAgICAgICAgICAweDAwMDAwMDIwCisjZGVmaW5lIFNCX0RNQV9NQVNLICAgICAgICAgICAgIDB4MDAwMDAwQzAKKyNkZWZpbmUgU0JfRE1BXzAgICAgICAgICAgICAgICAgMHgwMDAwMDA0MAorI2RlZmluZSBTQl9ETUFfMSAgICAgICAgICAgICAgICAweDAwMDAwMDQwCisjZGVmaW5lIFNCX0RNQV9SICAgICAgICAgICAgICAgIDB4MDAwMDAwODAKKyNkZWZpbmUgU0JfRE1BXzMgICAgICAgICAgICAgICAgMHgwMDAwMDBDMAorI2RlZmluZSBTQl9JUlFfTUFTSyAgICAgICAgICAgICAweDAwMDAwNzAwCisjZGVmaW5lIFNCX0lSUV81ICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgU0JfSVJRXzcgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBTQl9JUlFfOSAgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIFNCX0lSUV8xMCAgICAgICAgICAgICAgIDB4MDAwMDAzMDAKKyNkZWZpbmUgTUlESV9JUlFfTUFTSyAgICAgICAgICAgMHgwMDAwMzgwMAorI2RlZmluZSBTRVJJQUxfSVJRX0VOQUJMRSAgICAgICAweDAwMDA0MDAwCisjZGVmaW5lIERJU0FCTEVfTEVHQUNZICAgICAgICAgIDB4MDAwMDgwMDAKKworI2RlZmluZSBQQ0lfQUxMRUdST19DT05GSUcgICAgICAweDUwCisjZGVmaW5lIFNCX0FERFJfMjQwICAgICAgICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgTVBVX0FERFJfTUFTSyAgICAgICAgICAgMHgwMDAwMDAxOAorI2RlZmluZSBNUFVfQUREUl8zMzAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIE1QVV9BRERSXzMwMCAgICAgICAgICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgTVBVX0FERFJfMzIwICAgICAgICAgICAgMHgwMDAwMDAxMAorI2RlZmluZSBNUFVfQUREUl8zNDAgICAgICAgICAgICAweDAwMDAwMDE4CisjZGVmaW5lIFVTRV9QQ0lfVElNSU5HICAgICAgICAgIDB4MDAwMDAwNDAKKyNkZWZpbmUgUE9TVEVEX1dSSVRFX0VOQUJMRSAgICAgMHgwMDAwMDA4MAorI2RlZmluZSBETUFfUE9MSUNZX01BU0sgICAgICAgICAweDAwMDAwNzAwCisjZGVmaW5lIERNQV9ERE1BICAgICAgICAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRE1BX1RETUEgICAgICAgICAgICAgICAgMHgwMDAwMDEwMAorI2RlZmluZSBETUFfUENQQ0kgICAgICAgICAgICAgICAweDAwMDAwMjAwCisjZGVmaW5lIERNQV9XQkRNQTE2ICAgICAgICAgICAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRE1BX1dCRE1BNCAgICAgICAgICAgICAgMHgwMDAwMDUwMAorI2RlZmluZSBETUFfV0JETUEyICAgICAgICAgICAgICAweDAwMDAwNjAwCisjZGVmaW5lIERNQV9XQkRNQTEgICAgICAgICAgICAgIDB4MDAwMDA3MDAKKyNkZWZpbmUgRE1BX1NBRkVfR1VBUkQgICAgICAgICAgMHgwMDAwMDgwMAorI2RlZmluZSBISV9QRVJGX0dQX0VOQUJMRSAgICAgICAweDAwMDAxMDAwCisjZGVmaW5lIFBJQ19TTk9PUF9NT0RFXzAgICAgICAgIDB4MDAwMDIwMDAKKyNkZWZpbmUgUElDX1NOT09QX01PREVfMSAgICAgICAgMHgwMDAwNDAwMAorI2RlZmluZSBTT1VOREJMQVNURVJfSVJRX01BU0sgICAweDAwMDA4MDAwCisjZGVmaW5lIFJJTkdfSU5fRU5BQkxFICAgICAgICAgIDB4MDAwMTAwMDAKKyNkZWZpbmUgU1BESUZfVEVTVF9NT0RFICAgICAgICAgMHgwMDAyMDAwMAorI2RlZmluZSBDTEtfTVVMVF9NT0RFX1NFTEVDVF8yICAweDAwMDQwMDAwCisjZGVmaW5lIEVFUFJPTV9XUklURV9FTkFCTEUgICAgIDB4MDAwODAwMDAKKyNkZWZpbmUgQ09ERUNfRElSX0lOICAgICAgICAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBIVl9CVVRUT05fRlJPTV9HRCAgICAgICAweDAwMjAwMDAwCisjZGVmaW5lIFJFRFVDRURfREVCT1VOQ0UgICAgICAgIDB4MDA0MDAwMDAKKyNkZWZpbmUgSFZfQ1RSTF9FTkFCTEUgICAgICAgICAgMHgwMDgwMDAwMAorI2RlZmluZSBTUERJRl9FTkFCTEUgICAgICAgICAgICAweDAxMDAwMDAwCisjZGVmaW5lIENMS19ESVZfU0VMRUNUICAgICAgICAgIDB4MDYwMDAwMDAKKyNkZWZpbmUgQ0xLX0RJVl9CWV80OCAgICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBDTEtfRElWX0JZXzQ5ICAgICAgICAgICAweDAyMDAwMDAwCisjZGVmaW5lIENMS19ESVZfQllfNTAgICAgICAgICAgIDB4MDQwMDAwMDAKKyNkZWZpbmUgQ0xLX0RJVl9SRVNFUlZFRCAgICAgICAgMHgwNjAwMDAwMAorI2RlZmluZSBQTV9DVFJMX0VOQUJMRSAgICAgICAgICAweDA4MDAwMDAwCisjZGVmaW5lIENMS19NVUxUX01PREVfU0VMRUNUICAgIDB4MzAwMDAwMDAKKyNkZWZpbmUgQ0xLX01VTFRfTU9ERV9TSElGVCAgICAgMjgKKyNkZWZpbmUgQ0xLX01VTFRfTU9ERV8wICAgICAgICAgMHgwMDAwMDAwMAorI2RlZmluZSBDTEtfTVVMVF9NT0RFXzEgICAgICAgICAweDEwMDAwMDAwCisjZGVmaW5lIENMS19NVUxUX01PREVfMiAgICAgICAgIDB4MjAwMDAwMDAKKyNkZWZpbmUgQ0xLX01VTFRfTU9ERV8zICAgICAgICAgMHgzMDAwMDAwMAorI2RlZmluZSBJTlRfQ0xLX1NFTEVDVCAgICAgICAgICAweDQwMDAwMDAwCisjZGVmaW5lIElOVF9DTEtfTVVMVF9SRVNFVCAgICAgIDB4ODAwMDAwMDAKKworLy8gTTMKKyNkZWZpbmUgSU5UX0NMS19TUkNfTk9UX1BDSSAgICAgMHgwMDEwMDAwMAorI2RlZmluZSBJTlRfQ0xLX01VTFRfRU5BQkxFICAgICAweDgwMDAwMDAwCisKKyNkZWZpbmUgUENJX0FDUElfQ09OVFJPTCAgICAgICAgMHg1NAorI2RlZmluZSBQQ0lfQUNQSV9EMCAgICAgICAgICAgICAweDAwMDAwMDAwCisjZGVmaW5lIFBDSV9BQ1BJX0QxICAgICAgICAgICAgIDB4QjRGNzAwMDAKKyNkZWZpbmUgUENJX0FDUElfRDIgICAgICAgICAgICAgMHhCNEY3QjRGNworCisjZGVmaW5lIFBDSV9VU0VSX0NPTkZJRyAgICAgICAgIDB4NTgKKyNkZWZpbmUgRVhUX1BDSV9NQVNURVJfRU5BQkxFICAgMHgwMDAwMDAwMQorI2RlZmluZSBTUERJRl9PVVRfU0VMRUNUICAgICAgICAweDAwMDAwMDAyCisjZGVmaW5lIFRFU1RfUElOX0RJUl9DVFJMICAgICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgQUM5N19DT0RFQ19URVNUICAgICAgICAgMHgwMDAwMDAyMAorI2RlZmluZSBUUklfU1RBVEVfQlVGRkVSICAgICAgICAweDAwMDAwMDgwCisjZGVmaW5lIElOX0NMS18xMk1IWl9TRUxFQ1QgICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgTVVMVElfRlVOQ19ESVNBQkxFICAgICAgMHgwMDAwMDIwMAorI2RlZmluZSBFWFRfTUFTVEVSX1BBSVJfU0VMICAgICAweDAwMDAwNDAwCisjZGVmaW5lIFBDSV9NQVNURVJfU1VQUE9SVCAgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgU1RPUF9DTE9DS19FTkFCTEUgICAgICAgMHgwMDAwMTAwMAorI2RlZmluZSBFQVBEX0RSSVZFX0VOQUJMRSAgICAgICAweDAwMDAyMDAwCisjZGVmaW5lIFJFUV9UUklfU1RBVEVfRU5BQkxFICAgIDB4MDAwMDQwMDAKKyNkZWZpbmUgUkVRX0xPV19FTkFCTEUgICAgICAgICAgMHgwMDAwODAwMAorI2RlZmluZSBNSURJXzFfRU5BQkxFICAgICAgICAgICAweDAwMDEwMDAwCisjZGVmaW5lIE1JRElfMl9FTkFCTEUgICAgICAgICAgIDB4MDAwMjAwMDAKKyNkZWZpbmUgU0JfQVVESU9fU1lOQyAgICAgICAgICAgMHgwMDA0MDAwMAorI2RlZmluZSBIVl9DVFJMX1RFU1QgICAgICAgICAgICAweDAwMTAwMDAwCisjZGVmaW5lIFNPVU5EQkxBU1RFUl9URVNUICAgICAgIDB4MDA0MDAwMDAKKworI2RlZmluZSBQQ0lfVVNFUl9DT05GSUdfQyAgICAgICAweDVDCisKKyNkZWZpbmUgUENJX0RETUFfQ1RSTCAgICAgICAgICAgMHg2MAorI2RlZmluZSBERE1BX0VOQUJMRSAgICAgICAgICAgICAweDAwMDAwMDAxCisKKworLy8gQWxsZWdybyByZWdpc3RlcnMKKyNkZWZpbmUgSE9TVF9JTlRfQ1RSTCAgICAgICAgICAgMHgxOAorI2RlZmluZSBTQl9JTlRfRU5BQkxFICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTVBVNDAxX0lOVF9FTkFCTEUgICAgICAgMHgwMDAyCisjZGVmaW5lIEFTU1BfSU5UX0VOQUJMRSAgICAgICAgIDB4MDAxMAorI2RlZmluZSBSSU5HX0lOVF9FTkFCTEUgICAgICAgICAweDAwMjAKKyNkZWZpbmUgSFZfSU5UX0VOQUJMRSAgICAgICAgICAgMHgwMDQwCisjZGVmaW5lIENMS1JVTl9HRU5fRU5BQkxFICAgICAgIDB4MDEwMAorI2RlZmluZSBIVl9DVFJMX1RPX1BNRSAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgU09GVFdBUkVfUkVTRVRfRU5BQkxFICAgMHg4MDAwCisKKy8qCisgKiBzaG91bGQgYmUgdXNpbmcgdGhlIGFib3ZlIGRlZmluZXMsIHByb2JhYmx5LgorICovCisjZGVmaW5lIFJFR0JfRU5BQkxFX1JFU0VUICAgICAgICAgICAgICAgMHgwMQorI2RlZmluZSBSRUdCX1NUT1BfQ0xPQ0sgICAgICAgICAgICAgICAgIDB4MTAKKworI2RlZmluZSBIT1NUX0lOVF9TVEFUVVMgICAgICAgICAweDFBCisjZGVmaW5lIFNCX0lOVF9QRU5ESU5HICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTVBVNDAxX0lOVF9QRU5ESU5HICAgICAgMHgwMgorI2RlZmluZSBBU1NQX0lOVF9QRU5ESU5HICAgICAgICAweDEwCisjZGVmaW5lIFJJTkdfSU5UX1BFTkRJTkcgICAgICAgIDB4MjAKKyNkZWZpbmUgSFZfSU5UX1BFTkRJTkcgICAgICAgICAgMHg0MAorCisjZGVmaW5lIEhBUkRXQVJFX1ZPTF9DVFJMICAgICAgIDB4MUIKKyNkZWZpbmUgU0hBRE9XX01JWF9SRUdfVk9JQ0UgICAgMHgxQworI2RlZmluZSBIV19WT0xfQ09VTlRFUl9WT0lDRSAgICAweDFECisjZGVmaW5lIFNIQURPV19NSVhfUkVHX01BU1RFUiAgIDB4MUUKKyNkZWZpbmUgSFdfVk9MX0NPVU5URVJfTUFTVEVSICAgMHgxRgorCisjZGVmaW5lIENPREVDX0NPTU1BTkQgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgQ09ERUNfUkVBRF9CICAgICAgICAgICAgMHg4MAorCisjZGVmaW5lIENPREVDX1NUQVRVUyAgICAgICAgICAgIDB4MzAKKyNkZWZpbmUgQ09ERUNfQlVTWV9CICAgICAgICAgICAgMHgwMQorCisjZGVmaW5lIENPREVDX0RBVEEgICAgICAgICAgICAgIDB4MzIKKworI2RlZmluZSBSSU5HX0JVU19DVFJMX0EgICAgICAgICAweDM2CisjZGVmaW5lIFJBQ19QTUVfRU5BQkxFICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBSQUNfU0RGU19FTkFCTEUgICAgICAgICAweDAyMDAKKyNkZWZpbmUgTEFDX1BNRV9FTkFCTEUgICAgICAgICAgMHgwNDAwCisjZGVmaW5lIExBQ19TREZTX0VOQUJMRSAgICAgICAgIDB4MDgwMAorI2RlZmluZSBTRVJJQUxfQUNfTElOS19FTkFCTEUgICAweDEwMDAKKyNkZWZpbmUgSU9fU1JBTV9FTkFCTEUgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIElJU19JTlBVVF9FTkFCTEUgICAgICAgIDB4ODAwMAorCisjZGVmaW5lIFJJTkdfQlVTX0NUUkxfQiAgICAgICAgIDB4MzgKKyNkZWZpbmUgU0VDT05EX0NPREVDX0lEX01BU0sgICAgMHgwMDAzCisjZGVmaW5lIFNQRElGX0ZVTkNfRU5BQkxFICAgICAgIDB4MDAxMAorI2RlZmluZSBTRUNPTkRfQUNfRU5BQkxFICAgICAgICAweDAwMjAKKyNkZWZpbmUgU0JfTU9EVUxFX0lOVEZfRU5BQkxFICAgMHgwMDQwCisjZGVmaW5lIFNTUEVfRU5BQkxFICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBNM0lfRE9DS19FTkFCTEUgICAgICAgICAweDAwODAKKworI2RlZmluZSBTRE9fT1VUX0RFU1RfQ1RSTCAgICAgICAweDNBCisjZGVmaW5lIENPTU1BTkRfQUREUl9PVVQgICAgICAgIDB4MDAwMworI2RlZmluZSBQQ01fTFJfT1VUX0xPQ0FMICAgICAgICAweDAwMDAKKyNkZWZpbmUgUENNX0xSX09VVF9SRU1PVEUgICAgICAgMHgwMDA0CisjZGVmaW5lIFBDTV9MUl9PVVRfTVVURSAgICAgICAgIDB4MDAwOAorI2RlZmluZSBQQ01fTFJfT1VUX0JPVEggICAgICAgICAweDAwMEMKKyNkZWZpbmUgTElORTFfREFDX09VVF9MT0NBTCAgICAgMHgwMDAwCisjZGVmaW5lIExJTkUxX0RBQ19PVVRfUkVNT1RFICAgIDB4MDAxMAorI2RlZmluZSBMSU5FMV9EQUNfT1VUX01VVEUgICAgICAweDAwMjAKKyNkZWZpbmUgTElORTFfREFDX09VVF9CT1RIICAgICAgMHgwMDMwCisjZGVmaW5lIFBDTV9DTFNfT1VUX0xPQ0FMICAgICAgIDB4MDAwMAorI2RlZmluZSBQQ01fQ0xTX09VVF9SRU1PVEUgICAgICAweDAwNDAKKyNkZWZpbmUgUENNX0NMU19PVVRfTVVURSAgICAgICAgMHgwMDgwCisjZGVmaW5lIFBDTV9DTFNfT1VUX0JPVEggICAgICAgIDB4MDBDMAorI2RlZmluZSBQQ01fUkxGX09VVF9MT0NBTCAgICAgICAweDAwMDAKKyNkZWZpbmUgUENNX1JMRl9PVVRfUkVNT1RFICAgICAgMHgwMTAwCisjZGVmaW5lIFBDTV9STEZfT1VUX01VVEUgICAgICAgIDB4MDIwMAorI2RlZmluZSBQQ01fUkxGX09VVF9CT1RIICAgICAgICAweDAzMDAKKyNkZWZpbmUgTElORTJfREFDX09VVF9MT0NBTCAgICAgMHgwMDAwCisjZGVmaW5lIExJTkUyX0RBQ19PVVRfUkVNT1RFICAgIDB4MDQwMAorI2RlZmluZSBMSU5FMl9EQUNfT1VUX01VVEUgICAgICAweDA4MDAKKyNkZWZpbmUgTElORTJfREFDX09VVF9CT1RIICAgICAgMHgwQzAwCisjZGVmaW5lIEhBTkRTRVRfT1VUX0xPQ0FMICAgICAgIDB4MDAwMAorI2RlZmluZSBIQU5EU0VUX09VVF9SRU1PVEUgICAgICAweDEwMDAKKyNkZWZpbmUgSEFORFNFVF9PVVRfTVVURSAgICAgICAgMHgyMDAwCisjZGVmaW5lIEhBTkRTRVRfT1VUX0JPVEggICAgICAgIDB4MzAwMAorI2RlZmluZSBJT19DVFJMX09VVF9MT0NBTCAgICAgICAweDAwMDAKKyNkZWZpbmUgSU9fQ1RSTF9PVVRfUkVNT1RFICAgICAgMHg0MDAwCisjZGVmaW5lIElPX0NUUkxfT1VUX01VVEUgICAgICAgIDB4ODAwMAorI2RlZmluZSBJT19DVFJMX09VVF9CT1RIICAgICAgICAweEMwMDAKKworI2RlZmluZSBTRE9fSU5fREVTVF9DVFJMICAgICAgICAweDNDCisjZGVmaW5lIFNUQVRVU19BRERSX0lOICAgICAgICAgIDB4MDAwMworI2RlZmluZSBQQ01fTFJfSU5fTE9DQUwgICAgICAgICAweDAwMDAKKyNkZWZpbmUgUENNX0xSX0lOX1JFTU9URSAgICAgICAgMHgwMDA0CisjZGVmaW5lIFBDTV9MUl9SRVNFUlZFRCAgICAgICAgIDB4MDAwOAorI2RlZmluZSBQQ01fTFJfSU5fQk9USCAgICAgICAgICAweDAwMEMKKyNkZWZpbmUgTElORTFfQURDX0lOX0xPQ0FMICAgICAgMHgwMDAwCisjZGVmaW5lIExJTkUxX0FEQ19JTl9SRU1PVEUgICAgIDB4MDAxMAorI2RlZmluZSBMSU5FMV9BRENfSU5fTVVURSAgICAgICAweDAwMjAKKyNkZWZpbmUgTUlDX0FEQ19JTl9MT0NBTCAgICAgICAgMHgwMDAwCisjZGVmaW5lIE1JQ19BRENfSU5fUkVNT1RFICAgICAgIDB4MDA0MAorI2RlZmluZSBNSUNfQURDX0lOX01VVEUgICAgICAgICAweDAwODAKKyNkZWZpbmUgTElORTJfREFDX0lOX0xPQ0FMICAgICAgMHgwMDAwCisjZGVmaW5lIExJTkUyX0RBQ19JTl9SRU1PVEUgICAgIDB4MDQwMAorI2RlZmluZSBMSU5FMl9EQUNfSU5fTVVURSAgICAgICAweDA4MDAKKyNkZWZpbmUgSEFORFNFVF9JTl9MT0NBTCAgICAgICAgMHgwMDAwCisjZGVmaW5lIEhBTkRTRVRfSU5fUkVNT1RFICAgICAgIDB4MTAwMAorI2RlZmluZSBIQU5EU0VUX0lOX01VVEUgICAgICAgICAweDIwMDAKKyNkZWZpbmUgSU9fU1RBVFVTX0lOX0xPQ0FMICAgICAgMHgwMDAwCisjZGVmaW5lIElPX1NUQVRVU19JTl9SRU1PVEUgICAgIDB4NDAwMAorCisjZGVmaW5lIFNQRElGX0lOX0NUUkwgICAgICAgICAgIDB4M0UKKyNkZWZpbmUgU1BESUZfSU5fRU5BQkxFICAgICAgICAgMHgwMDAxCisKKyNkZWZpbmUgR1BJT19EQVRBICAgICAgICAgICAgICAgMHg2MAorI2RlZmluZSBHUElPX0RBVEFfTUFTSyAgICAgICAgICAweDBGRkYKKyNkZWZpbmUgR1BJT19IVl9TVEFUVVMgICAgICAgICAgMHgzMDAwCisjZGVmaW5lIEdQSU9fUE1FX1NUQVRVUyAgICAgICAgIDB4NDAwMAorCisjZGVmaW5lIEdQSU9fTUFTSyAgICAgICAgICAgICAgIDB4NjQKKyNkZWZpbmUgR1BJT19ESVJFQ1RJT04gICAgICAgICAgMHg2OAorI2RlZmluZSBHUE9fUFJJTUFSWV9BQzk3ICAgICAgICAweDAwMDEKKyNkZWZpbmUgR1BJX0xJTkVPVVRfU0VOU0UgICAgICAgMHgwMDA0CisjZGVmaW5lIEdQT19TRUNPTkRBUllfQUM5NyAgICAgIDB4MDAwOAorI2RlZmluZSBHUElfVk9MX0RPV04gICAgICAgICAgICAweDAwMTAKKyNkZWZpbmUgR1BJX1ZPTF9VUCAgICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lIEdQSV9JSVNfQ0xLICAgICAgICAgICAgIDB4MDA0MAorI2RlZmluZSBHUElfSUlTX0xSQ0xLICAgICAgICAgICAweDAwODAKKyNkZWZpbmUgR1BJX0lJU19EQVRBICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEdQSV9ET0NLSU5HX1NUQVRVUyAgICAgIDB4MDEwMAorI2RlZmluZSBHUElfSEVBRFBIT05FX1NFTlNFICAgICAweDAyMDAKKyNkZWZpbmUgR1BPX0VYVF9BTVBfU0hVVERPV04gICAgMHgxMDAwCisKKy8vIE0zCisjZGVmaW5lIEdQT19NM19FWFRfQU1QX1NIVVRETiAgIDB4MDAwMgorCisjZGVmaW5lIEFTU1BfSU5ERVhfUE9SVCAgICAgICAgIDB4ODAKKyNkZWZpbmUgQVNTUF9NRU1PUllfUE9SVCAgICAgICAgMHg4MgorI2RlZmluZSBBU1NQX0RBVEFfUE9SVCAgICAgICAgICAweDg0CisKKyNkZWZpbmUgTVBVNDAxX0RBVEFfUE9SVCAgICAgICAgMHg5OAorI2RlZmluZSBNUFU0MDFfU1RBVFVTX1BPUlQgICAgICAweDk5CisKKyNkZWZpbmUgQ0xLX01VTFRfREFUQV9QT1JUICAgICAgMHg5QworCisjZGVmaW5lIEFTU1BfQ09OVFJPTF9BICAgICAgICAgIDB4QTIKKyNkZWZpbmUgQVNTUF8wX1dTX0VOQUJMRSAgICAgICAgMHgwMQorI2RlZmluZSBBU1NQX0NUUkxfQV9SRVNFUlZFRDEgICAweDAyCisjZGVmaW5lIEFTU1BfQ1RSTF9BX1JFU0VSVkVEMiAgIDB4MDQKKyNkZWZpbmUgQVNTUF9DTEtfNDlNSFpfU0VMRUNUICAgMHgwOAorI2RlZmluZSBGQVNUX1BMVV9FTkFCTEUgICAgICAgICAweDEwCisjZGVmaW5lIEFTU1BfQ1RSTF9BX1JFU0VSVkVEMyAgIDB4MjAKKyNkZWZpbmUgRFNQX0NMS18zNk1IWl9TRUxFQ1QgICAgMHg0MAorCisjZGVmaW5lIEFTU1BfQ09OVFJPTF9CICAgICAgICAgIDB4QTQKKyNkZWZpbmUgUkVTRVRfQVNTUCAgICAgICAgICAgICAgMHgwMAorI2RlZmluZSBSVU5fQVNTUCAgICAgICAgICAgICAgICAweDAxCisjZGVmaW5lIEVOQUJMRV9BU1NQX0NMT0NLICAgICAgIDB4MDAKKyNkZWZpbmUgU1RPUF9BU1NQX0NMT0NLICAgICAgICAgMHgxMAorI2RlZmluZSBSRVNFVF9UT0dHTEUgICAgICAgICAgICAweDQwCisKKyNkZWZpbmUgQVNTUF9DT05UUk9MX0MgICAgICAgICAgMHhBNgorI2RlZmluZSBBU1NQX0hPU1RfSU5UX0VOQUJMRSAgICAweDAxCisjZGVmaW5lIEZNX0FERFJfUkVNQVBfRElTQUJMRSAgIDB4MDIKKyNkZWZpbmUgSE9TVF9XUklURV9QT1JUX0VOQUJMRSAgMHgwOAorCisjZGVmaW5lIEFTU1BfSE9TVF9JTlRfU1RBVFVTICAgIDB4QUMKKyNkZWZpbmUgRFNQMkhPU1RfUkVRX1BJT1JFQ09SRCAgMHgwMQorI2RlZmluZSBEU1AySE9TVF9SRVFfSTJTUkFURSAgICAweDAyCisjZGVmaW5lIERTUDJIT1NUX1JFUV9USU1FUiAgICAgIDB4MDQKKworLy8gQUM5NyByZWdpc3RlcnMKKy8vIFhYWCBmaXggdGhpcyBjcmFwIHVwCisvKiNkZWZpbmUgQUM5N19SRVNFVCAgICAgICAgICAgICAgMHgwMCovCisKKyNkZWZpbmUgQUM5N19WT0xfTVVURV9CICAgICAgICAgMHg4MDAwCisjZGVmaW5lIEFDOTdfVk9MX00gICAgICAgICAgICAgIDB4MUYKKyNkZWZpbmUgQUM5N19MRUZUX1ZPTF9TICAgICAgICAgOAorCisjZGVmaW5lIEFDOTdfTUFTVEVSX1ZPTCAgICAgICAgIDB4MDIKKyNkZWZpbmUgQUM5N19MSU5FX0xFVkVMX1ZPTCAgICAgMHgwNAorI2RlZmluZSBBQzk3X01BU1RFUl9NT05PX1ZPTCAgICAweDA2CisjZGVmaW5lIEFDOTdfUENfQkVFUF9WT0wgICAgICAgIDB4MEEKKyNkZWZpbmUgQUM5N19QQ19CRUVQX1ZPTF9NICAgICAgMHgwRgorI2RlZmluZSBBQzk3X1NST1VORF9NQVNURVJfVk9MICAweDM4CisjZGVmaW5lIEFDOTdfUENfQkVFUF9WT0xfUyAgICAgIDEKKworLyojZGVmaW5lIEFDOTdfUEhPTkVfVk9MICAgICAgICAgIDB4MEMKKyNkZWZpbmUgQUM5N19NSUNfVk9MICAgICAgICAgICAgMHgwRSovCisjZGVmaW5lIEFDOTdfTUlDXzIwREJfRU5BQkxFICAgIDB4NDAKKworLyojZGVmaW5lIEFDOTdfTElORUlOX1ZPTCAgICAgICAgIDB4MTAKKyNkZWZpbmUgQUM5N19DRF9WT0wgICAgICAgICAgICAgMHgxMgorI2RlZmluZSBBQzk3X1ZJREVPX1ZPTCAgICAgICAgICAweDE0CisjZGVmaW5lIEFDOTdfQVVYX1ZPTCAgICAgICAgICAgIDB4MTYqLworI2RlZmluZSBBQzk3X1BDTV9PVVRfVk9MICAgICAgICAweDE4CisvKiNkZWZpbmUgQUM5N19SRUNPUkRfU0VMRUNUICAgICAgMHgxQSovCisjZGVmaW5lIEFDOTdfUkVDT1JEX01JQyAgICAgICAgIDB4MDAKKyNkZWZpbmUgQUM5N19SRUNPUkRfQ0QgICAgICAgICAgMHgwMQorI2RlZmluZSBBQzk3X1JFQ09SRF9WSURFTyAgICAgICAweDAyCisjZGVmaW5lIEFDOTdfUkVDT1JEX0FVWCAgICAgICAgIDB4MDMKKyNkZWZpbmUgQUM5N19SRUNPUkRfTU9OT19NVVggICAgMHgwMgorI2RlZmluZSBBQzk3X1JFQ09SRF9ESUdJVEFMICAgICAweDAzCisjZGVmaW5lIEFDOTdfUkVDT1JEX0xJTkUgICAgICAgIDB4MDQKKyNkZWZpbmUgQUM5N19SRUNPUkRfU1RFUkVPICAgICAgMHgwNQorI2RlZmluZSBBQzk3X1JFQ09SRF9NT05PICAgICAgICAweDA2CisjZGVmaW5lIEFDOTdfUkVDT1JEX1BIT05FICAgICAgIDB4MDcKKworLyojZGVmaW5lIEFDOTdfUkVDT1JEX0dBSU4gICAgICAgIDB4MUMqLworI2RlZmluZSBBQzk3X1JFQ09SRF9WT0xfTSAgICAgICAweDBGCisKKy8qI2RlZmluZSBBQzk3X0dFTkVSQUxfUFVSUE9TRSAgICAweDIwKi8KKyNkZWZpbmUgQUM5N19QT1dFUl9ET1dOX0NUUkwgICAgMHgyNgorI2RlZmluZSBBQzk3X0FEQ19SRUFEWSAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgQUM5N19EQUNfUkVBRFkgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEFDOTdfQU5BTE9HX1JFQURZICAgICAgIDB4MDAwNAorI2RlZmluZSBBQzk3X1ZSRUZfT04gICAgICAgICAgICAweDAwMDgKKyNkZWZpbmUgQUM5N19QUjAgICAgICAgICAgICAgICAgMHgwMTAwCisjZGVmaW5lIEFDOTdfUFIxICAgICAgICAgICAgICAgIDB4MDIwMAorI2RlZmluZSBBQzk3X1BSMiAgICAgICAgICAgICAgICAweDA0MDAKKyNkZWZpbmUgQUM5N19QUjMgICAgICAgICAgICAgICAgMHgwODAwCisjZGVmaW5lIEFDOTdfUFI0ICAgICAgICAgICAgICAgIDB4MTAwMAorCisjZGVmaW5lIEFDOTdfUkVTRVJWRUQxICAgICAgICAgIDB4MjgKKworI2RlZmluZSBBQzk3X1ZFTkRPUl9URVNUICAgICAgICAweDVBCisKKyNkZWZpbmUgQUM5N19DTE9DS19ERUxBWSAgICAgICAgMHg1QworI2RlZmluZSBBQzk3X0xJTkVPVVRfTVVYX1NFTCAgICAweDAwMDEKKyNkZWZpbmUgQUM5N19NT05PX01VWF9TRUwgICAgICAgMHgwMDAyCisjZGVmaW5lIEFDOTdfQ0xPQ0tfREVMQVlfU0VMICAgIDB4MUYKKyNkZWZpbmUgQUM5N19EQUNfQ0RTX1NISUZUICAgICAgNgorI2RlZmluZSBBQzk3X0FEQ19DRFNfU0hJRlQgICAgICAxMQorCisjZGVmaW5lIEFDOTdfTVVMVElfQ0hBTk5FTF9TRUwgIDB4NzQKKworLyojZGVmaW5lIEFDOTdfVkVORE9SX0lEMSAgICAgICAgIDB4N0MKKyNkZWZpbmUgQUM5N19WRU5ET1JfSUQyICAgICAgICAgMHg3RSovCisKKy8qCisgKiBBU1NQIGNvbnRyb2wgcmVncworICovCisjZGVmaW5lIERTUF9QT1JUX1RJTUVSX0NPVU5UICAgIDB4MDYKKworI2RlZmluZSBEU1BfUE9SVF9NRU1PUllfSU5ERVggICAweDgwCisKKyNkZWZpbmUgRFNQX1BPUlRfTUVNT1JZX1RZUEUgICAgMHg4MgorI2RlZmluZSBNRU1UWVBFX0lOVEVSTkFMX0NPREUgICAweDAwMDIKKyNkZWZpbmUgTUVNVFlQRV9JTlRFUk5BTF9EQVRBICAgMHgwMDAzCisjZGVmaW5lIE1FTVRZUEVfTUFTSyAgICAgICAgICAgIDB4MDAwMworCisjZGVmaW5lIERTUF9QT1JUX01FTU9SWV9EQVRBICAgIDB4ODQKKworI2RlZmluZSBEU1BfUE9SVF9DT05UUk9MX1JFR19BICAweEEyCisjZGVmaW5lIERTUF9QT1JUX0NPTlRST0xfUkVHX0IgIDB4QTQKKyNkZWZpbmUgRFNQX1BPUlRfQ09OVFJPTF9SRUdfQyAgMHhBNgorCisjZGVmaW5lIFJFVl9BX0NPREVfTUVNT1JZX0JFR0lOICAgICAgICAgMHgwMDAwCisjZGVmaW5lIFJFVl9BX0NPREVfTUVNT1JZX0VORCAgICAgICAgICAgMHgwRkZGCisjZGVmaW5lIFJFVl9BX0NPREVfTUVNT1JZX1VOSVRfTEVOR1RIICAgMHgwMDQwCisjZGVmaW5lIFJFVl9BX0NPREVfTUVNT1JZX0xFTkdUSCAgICAgICAgKFJFVl9BX0NPREVfTUVNT1JZX0VORCAtIFJFVl9BX0NPREVfTUVNT1JZX0JFR0lOICsgMSkKKworI2RlZmluZSBSRVZfQl9DT0RFX01FTU9SWV9CRUdJTiAgICAgICAgIDB4MDAwMAorI2RlZmluZSBSRVZfQl9DT0RFX01FTU9SWV9FTkQgICAgICAgICAgIDB4MEJGRgorI2RlZmluZSBSRVZfQl9DT0RFX01FTU9SWV9VTklUX0xFTkdUSCAgIDB4MDA0MAorI2RlZmluZSBSRVZfQl9DT0RFX01FTU9SWV9MRU5HVEggICAgICAgIChSRVZfQl9DT0RFX01FTU9SWV9FTkQgLSBSRVZfQl9DT0RFX01FTU9SWV9CRUdJTiArIDEpCisKKyNkZWZpbmUgUkVWX0FfREFUQV9NRU1PUllfQkVHSU4gICAgICAgICAweDEwMDAKKyNkZWZpbmUgUkVWX0FfREFUQV9NRU1PUllfRU5EICAgICAgICAgICAweDJGRkYKKyNkZWZpbmUgUkVWX0FfREFUQV9NRU1PUllfVU5JVF9MRU5HVEggICAweDAwODAKKyNkZWZpbmUgUkVWX0FfREFUQV9NRU1PUllfTEVOR1RIICAgICAgICAoUkVWX0FfREFUQV9NRU1PUllfRU5EIC0gUkVWX0FfREFUQV9NRU1PUllfQkVHSU4gKyAxKQorCisjZGVmaW5lIFJFVl9CX0RBVEFfTUVNT1JZX0JFR0lOICAgICAgICAgMHgxMDAwCisjZGVmaW5lIFJFVl9CX0RBVEFfTUVNT1JZX0VORCAgICAgICAgICAgMHgyQkZGCisjZGVmaW5lIFJFVl9CX0RBVEFfTUVNT1JZX1VOSVRfTEVOR1RIICAgMHgwMDgwCisjZGVmaW5lIFJFVl9CX0RBVEFfTUVNT1JZX0xFTkdUSCAgICAgICAgKFJFVl9CX0RBVEFfTUVNT1JZX0VORCAtIFJFVl9CX0RBVEFfTUVNT1JZX0JFR0lOICsgMSkKKworCisjZGVmaW5lIE5VTV9VTklUU19LRVJORUxfQ09ERSAgICAgICAgICAxNgorI2RlZmluZSBOVU1fVU5JVFNfS0VSTkVMX0RBVEEgICAgICAgICAgIDIKKworI2RlZmluZSBOVU1fVU5JVFNfS0VSTkVMX0NPREVfV0lUSF9IU1AgMTYKKyNkZWZpbmUgTlVNX1VOSVRTX0tFUk5FTF9EQVRBX1dJVEhfSFNQICA1CisKKy8qCisgKiBLZXJuZWwgZGF0YSBsYXlvdXQKKyAqLworCisjZGVmaW5lIERQX1NISUZUX0NPVU5UICAgICAgICAgICAgICAgICAgNworCisjZGVmaW5lIEtEQVRBX0JBU0VfQUREUiAgICAgICAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIEtEQVRBX0JBU0VfQUREUjIgICAgICAgICAgICAgICAgMHgxMDgwCisKKyNkZWZpbmUgS0RBVEFfVEFTSzAgICAgICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDAwKQorI2RlZmluZSBLREFUQV9UQVNLMSAgICAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMDEpCisjZGVmaW5lIEtEQVRBX1RBU0syICAgICAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwMikKKyNkZWZpbmUgS0RBVEFfVEFTSzMgICAgICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDAzKQorI2RlZmluZSBLREFUQV9UQVNLNCAgICAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMDQpCisjZGVmaW5lIEtEQVRBX1RBU0s1ICAgICAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwNSkKKyNkZWZpbmUgS0RBVEFfVEFTSzYgICAgICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDA2KQorI2RlZmluZSBLREFUQV9UQVNLNyAgICAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMDcpCisjZGVmaW5lIEtEQVRBX1RBU0tfRU5ETUFSSyAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwOCkKKworI2RlZmluZSBLREFUQV9DVVJSRU5UX1RBU0sgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMDkpCisjZGVmaW5lIEtEQVRBX1RBU0tfU1dJVENIICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwQSkKKworI2RlZmluZSBLREFUQV9JTlNUQU5DRTBfUE9TM0QgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMEIpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMV9QT1MzRCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwQykKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UyX1BPUzNEICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDBEKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTNfUE9TM0QgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMEUpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFNF9QT1MzRCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAwRikKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0U1X1BPUzNEICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDEwKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTZfUE9TM0QgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMTEpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFN19QT1MzRCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxMikKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0U4X1BPUzNEICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDEzKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRV9QT1MzRF9FTkRNQVJLICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMTQpCisKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UwX1NQS1ZJUlQgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDE1KQorI2RlZmluZSBLREFUQV9JTlNUQU5DRV9TUEtWSVJUX0VORE1BUksgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMTYpCisKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UwX1NQRElGICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDE3KQorI2RlZmluZSBLREFUQV9JTlNUQU5DRV9TUERJRl9FTkRNQVJLICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMTgpCisKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UwX01PREVNICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDE5KQorI2RlZmluZSBLREFUQV9JTlNUQU5DRV9NT0RFTV9FTkRNQVJLICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMUEpCisKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UwX1NSQyAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDFCKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTFfU1JDICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMUMpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFX1NSQ19FTkRNQVJLICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxRCkKKworI2RlZmluZSBLREFUQV9JTlNUQU5DRTBfTUlOSVNSQyAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMUUpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMV9NSU5JU1JDICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAxRikKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0UyX01JTklTUkMgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDIwKQorI2RlZmluZSBLREFUQV9JTlNUQU5DRTNfTUlOSVNSQyAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMjEpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFX01JTklTUkNfRU5ETUFSSyAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyMikKKworI2RlZmluZSBLREFUQV9JTlNUQU5DRTBfQ1BZVEhSVSAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMjMpCisjZGVmaW5lIEtEQVRBX0lOU1RBTkNFMV9DUFlUSFJVICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyNCkKKyNkZWZpbmUgS0RBVEFfSU5TVEFOQ0VfQ1BZVEhSVV9FTkRNQVJLICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDI1KQorCisjZGVmaW5lIEtEQVRBX0NVUlJFTlRfRE1BICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyNikKKyNkZWZpbmUgS0RBVEFfRE1BX1NXSVRDSCAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDI3KQorI2RlZmluZSBLREFUQV9ETUFfQUNUSVZFICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMjgpCisKKyNkZWZpbmUgS0RBVEFfRE1BX1hGRVIwICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDI5KQorI2RlZmluZSBLREFUQV9ETUFfWEZFUjEgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMkEpCisjZGVmaW5lIEtEQVRBX0RNQV9YRkVSMiAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyQikKKyNkZWZpbmUgS0RBVEFfRE1BX1hGRVIzICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDJDKQorI2RlZmluZSBLREFUQV9ETUFfWEZFUjQgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMkQpCisjZGVmaW5lIEtEQVRBX0RNQV9YRkVSNSAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAyRSkKKyNkZWZpbmUgS0RBVEFfRE1BX1hGRVI2ICAgICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDJGKQorI2RlZmluZSBLREFUQV9ETUFfWEZFUjcgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMzApCisjZGVmaW5lIEtEQVRBX0RNQV9YRkVSOCAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzMSkKKyNkZWZpbmUgS0RBVEFfRE1BX1hGRVJfRU5ETUFSSyAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDMyKQorCisjZGVmaW5lIEtEQVRBX0kyU19TQU1QTEVfQ09VTlQgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzMykKKyNkZWZpbmUgS0RBVEFfSTJTX0lOVF9NRVRFUiAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDM0KQorI2RlZmluZSBLREFUQV9JMlNfQUNUSVZFICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMzUpCisKKyNkZWZpbmUgS0RBVEFfVElNRVJfQ09VTlRfUkVMT0FEICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDM2KQorI2RlZmluZSBLREFUQV9USU1FUl9DT1VOVF9DVVJSRU5UICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMzcpCisKKyNkZWZpbmUgS0RBVEFfSEFMVF9TWU5DSF9DTElFTlQgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDM4KQorI2RlZmluZSBLREFUQV9IQUxUX1NZTkNIX0RNQSAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwMzkpCisjZGVmaW5lIEtEQVRBX0hBTFRfQUNLTk9XTEVER0UgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzQSkKKworI2RlZmluZSBLREFUQV9BREMxX1hGRVIwICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwM0IpCisjZGVmaW5lIEtEQVRBX0FEQzFfWEZFUl9FTkRNQVJLICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzQykKKyNkZWZpbmUgS0RBVEFfQURDMV9MRUZUX1ZPTFVNRQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwM0QpCisjZGVmaW5lIEtEQVRBX0FEQzFfUklHSFRfVk9MVU1FICAJCShLREFUQV9CQVNFX0FERFIgKyAweDAwM0UpCisjZGVmaW5lIEtEQVRBX0FEQzFfTEVGVF9TVVJfVk9MCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDAzRikKKyNkZWZpbmUgS0RBVEFfQURDMV9SSUdIVF9TVVJfVk9MCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDQwKQorCisjZGVmaW5lIEtEQVRBX0FEQzJfWEZFUjAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0MSkKKyNkZWZpbmUgS0RBVEFfQURDMl9YRkVSX0VORE1BUksgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDQyKQorI2RlZmluZSBLREFUQV9BREMyX0xFRlRfVk9MVU1FCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0MykKKyNkZWZpbmUgS0RBVEFfQURDMl9SSUdIVF9WT0xVTUUJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDQ0KQorI2RlZmluZSBLREFUQV9BREMyX0xFRlRfU1VSX1ZPTAkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNDUpCisjZGVmaW5lIEtEQVRBX0FEQzJfUklHSFRfU1VSX1ZPTAkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0NikKKworI2RlZmluZSBLREFUQV9DRF9YRkVSMAkJCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0NykJCQkJCQorI2RlZmluZSBLREFUQV9DRF9YRkVSX0VORE1BUksJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDQ4KQorI2RlZmluZSBLREFUQV9DRF9MRUZUX1ZPTFVNRQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNDkpCisjZGVmaW5lIEtEQVRBX0NEX1JJR0hUX1ZPTFVNRQkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNEEpCisjZGVmaW5lIEtEQVRBX0NEX0xFRlRfU1VSX1ZPTAkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNEIpCisjZGVmaW5lIEtEQVRBX0NEX1JJR0hUX1NVUl9WT0wJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDRDKQorCisjZGVmaW5lIEtEQVRBX01JQ19YRkVSMAkJCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0RCkKKyNkZWZpbmUgS0RBVEFfTUlDX1hGRVJfRU5ETUFSSwkJCShLREFUQV9CQVNFX0FERFIgKyAweDAwNEUpCisjZGVmaW5lIEtEQVRBX01JQ19WT0xVTUUJCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA0RikKKyNkZWZpbmUgS0RBVEFfTUlDX1NVUl9WT0wJCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1MCkKKworI2RlZmluZSBLREFUQV9JMlNfWEZFUjAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNTEpCisjZGVmaW5lIEtEQVRBX0kyU19YRkVSX0VORE1BUksgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1MikKKworI2RlZmluZSBLREFUQV9DSElfWEZFUjAgICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNTMpCisjZGVmaW5lIEtEQVRBX0NISV9YRkVSX0VORE1BUksgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1NCkKKworI2RlZmluZSBLREFUQV9TUERJRl9YRkVSICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNTUpCisjZGVmaW5lIEtEQVRBX1NQRElGX0NVUlJFTlRfRlJBTUUgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1NikKKyNkZWZpbmUgS0RBVEFfU1BESUZfRlJBTUUwICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDU3KQorI2RlZmluZSBLREFUQV9TUERJRl9GUkFNRTEgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNTgpCisjZGVmaW5lIEtEQVRBX1NQRElGX0ZSQU1FMiAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1OSkKKworI2RlZmluZSBLREFUQV9TUERJRl9SRVFVRVNUICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNUEpCisjZGVmaW5lIEtEQVRBX1NQRElGX1RFTVAgICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1QikKKworI2RlZmluZSBLREFUQV9TUERJRklOX1hGRVIwICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNUMpCisjZGVmaW5lIEtEQVRBX1NQRElGSU5fWEZFUl9FTkRNQVJLICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1RCkKKyNkZWZpbmUgS0RBVEFfU1BESUZJTl9JTlRfTUVURVIgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDVFKQorCisjZGVmaW5lIEtEQVRBX0RTUF9SRVNFVF9DT1VOVCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA1RikKKyNkZWZpbmUgS0RBVEFfREVCVUdfT1VUUFVUICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDYwKQorCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfTElTVCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2MSkKKworI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0NCU1IxICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNjIpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfQ0JFUjEgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2MykKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9DQkNSICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDY0KQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0FSMCAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNjUpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfQVIxICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2NikKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9BUjIgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDY3KQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0FSMyAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNjgpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfQVI0ICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2OSkKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9BUjUgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDZBKQorI2RlZmluZSBLREFUQV9LRVJORUxfSVNSX0JSQ1IgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNkIpCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfUEFTUiAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2QykKKyNkZWZpbmUgS0RBVEFfS0VSTkVMX0lTUl9QQUVSICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDZEKQorCisjZGVmaW5lIEtEQVRBX0NMSUVOVF9TQ1JBVENIMCAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA2RSkKKyNkZWZpbmUgS0RBVEFfQ0xJRU5UX1NDUkFUQ0gxICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDZGKQorI2RlZmluZSBLREFUQV9LRVJORUxfU0NSQVRDSCAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNzApCisjZGVmaW5lIEtEQVRBX0tFUk5FTF9JU1JfU0NSQVRDSCAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3MSkKKworI2RlZmluZSBLREFUQV9PVUVVRV9MRUZUICAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNzIpCisjZGVmaW5lIEtEQVRBX1FVRVVFX1JJR0hUICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3MykKKworI2RlZmluZSBLREFUQV9BREMxX1JFUVVFU1QgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIgKyAweDAwNzQpCisjZGVmaW5lIEtEQVRBX0FEQzJfUkVRVUVTVCAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3NSkKKyNkZWZpbmUgS0RBVEFfQ0RfUkVRVUVTVAkJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDc2KQorI2RlZmluZSBLREFUQV9NSUNfUkVRVUVTVAkJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDc3KQorCisjZGVmaW5lIEtEQVRBX0FEQzFfTUlYRVJfUkVRVUVTVCAgICAgICAgKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3OCkKKyNkZWZpbmUgS0RBVEFfQURDMl9NSVhFUl9SRVFVRVNUICAgICAgICAoS0RBVEFfQkFTRV9BRERSICsgMHgwMDc5KQorI2RlZmluZSBLREFUQV9DRF9NSVhFUl9SRVFVRVNUCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3QSkKKyNkZWZpbmUgS0RBVEFfTUlDX01JWEVSX1JFUVVFU1QJCQkoS0RBVEFfQkFTRV9BRERSICsgMHgwMDdCKQorI2RlZmluZSBLREFUQV9NSUNfU1lOQ19DT1VOVEVSCQkJKEtEQVRBX0JBU0VfQUREUiArIDB4MDA3QykKKworLyoKKyAqIHNlY29uZCAnc2VnbWVudCcgKD8pIHJlc2VydmVkIGZvciBtaXhlcgorICogYnVmZmVycy4uCisgKi8KKworI2RlZmluZSBLREFUQV9NSVhFUl9XT1JEMCAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDAwKQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JEMSAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDAxKQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JEMiAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDAyKQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JEMyAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDAzKQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JENCAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDA0KQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JENSAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDA1KQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JENiAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDA2KQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JENyAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDA3KQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JEOCAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDA4KQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JEOSAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDA5KQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JEQSAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDBBKQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JEQiAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDBCKQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JEQyAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDBDKQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JERCAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDBEKQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JERSAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDBFKQorI2RlZmluZSBLREFUQV9NSVhFUl9XT1JERiAgICAgICAgICAgICAgIChLREFUQV9CQVNFX0FERFIyICsgMHgwMDBGKQorCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVIwICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMTApCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVIxICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMTEpCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVIyICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMTIpCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVIzICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMTMpCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVI0ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMTQpCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVI1ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMTUpCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVI2ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMTYpCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVI3ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMTcpCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVI4ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMTgpCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVI5ICAgICAgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMTkpCisjZGVmaW5lIEtEQVRBX01JWEVSX1hGRVJfRU5ETUFSSyAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMUEpCisKKyNkZWZpbmUgS0RBVEFfTUlYRVJfVEFTS19OVU1CRVIgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxQikKKyNkZWZpbmUgS0RBVEFfQ1VSUkVOVF9NSVhFUiAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxQykKKyNkZWZpbmUgS0RBVEFfTUlYRVJfQUNUSVZFICAgICAgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxRCkKKyNkZWZpbmUgS0RBVEFfTUlYRVJfQkFOS19TVEFUVVMgICAgICAgICAoS0RBVEFfQkFTRV9BRERSMiArIDB4MDAxRSkKKyNkZWZpbmUgS0RBVEFfREFDX0xFRlRfVk9MVU1FCSAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMUYpCisjZGVmaW5lIEtEQVRBX0RBQ19SSUdIVF9WT0xVTUUgICAgICAgICAgKEtEQVRBX0JBU0VfQUREUjIgKyAweDAwMjApCisKKyNkZWZpbmUgTUFYX0lOU1RBTkNFX01JTklTUkMgICAgICAgICAgICAoS0RBVEFfSU5TVEFOQ0VfTUlOSVNSQ19FTkRNQVJLIC0gS0RBVEFfSU5TVEFOQ0UwX01JTklTUkMpCisjZGVmaW5lIE1BWF9WSVJUVUFMX0RNQV9DSEFOTkVMUyAgICAgICAgKEtEQVRBX0RNQV9YRkVSX0VORE1BUksgLSBLREFUQV9ETUFfWEZFUjApCisjZGVmaW5lIE1BWF9WSVJUVUFMX01JWEVSX0NIQU5ORUxTICAgICAgKEtEQVRBX01JWEVSX1hGRVJfRU5ETUFSSyAtIEtEQVRBX01JWEVSX1hGRVIwKQorI2RlZmluZSBNQVhfVklSVFVBTF9BREMxX0NIQU5ORUxTICAgICAgIChLREFUQV9BREMxX1hGRVJfRU5ETUFSSyAtIEtEQVRBX0FEQzFfWEZFUjApCisKKy8qCisgKiBjbGllbnQgZGF0YSBhcmVhIG9mZnNldHMKKyAqLworI2RlZmluZSBDREFUQV9JTlNUQU5DRV9SRUFEWSAgICAgICAgICAgIDB4MDAKKworI2RlZmluZSBDREFUQV9IT1NUX1NSQ19BRERSTCAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgQ0RBVEFfSE9TVF9TUkNfQUREUkggICAgICAgICAgICAweDAyCisjZGVmaW5lIENEQVRBX0hPU1RfU1JDX0VORF9QTFVTXzFMICAgICAgMHgwMworI2RlZmluZSBDREFUQV9IT1NUX1NSQ19FTkRfUExVU18xSCAgICAgIDB4MDQKKyNkZWZpbmUgQ0RBVEFfSE9TVF9TUkNfQ1VSUkVOVEwgICAgICAgICAweDA1CisjZGVmaW5lIENEQVRBX0hPU1RfU1JDX0NVUlJFTlRIICAgICAgICAgMHgwNgorCisjZGVmaW5lIENEQVRBX0lOX0JVRl9DT05ORUNUICAgICAgICAgICAgMHgwNworI2RlZmluZSBDREFUQV9PVVRfQlVGX0NPTk5FQ1QgICAgICAgICAgIDB4MDgKKworI2RlZmluZSBDREFUQV9JTl9CVUZfQkVHSU4gICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgQ0RBVEFfSU5fQlVGX0VORF9QTFVTXzEgICAgICAgICAweDBBCisjZGVmaW5lIENEQVRBX0lOX0JVRl9IRUFEICAgICAgICAgICAgICAgMHgwQgorI2RlZmluZSBDREFUQV9JTl9CVUZfVEFJTCAgICAgICAgICAgICAgIDB4MEMKKyNkZWZpbmUgQ0RBVEFfT1VUX0JVRl9CRUdJTiAgICAgICAgICAgICAweDBECisjZGVmaW5lIENEQVRBX09VVF9CVUZfRU5EX1BMVVNfMSAgICAgICAgMHgwRQorI2RlZmluZSBDREFUQV9PVVRfQlVGX0hFQUQgICAgICAgICAgICAgIDB4MEYKKyNkZWZpbmUgQ0RBVEFfT1VUX0JVRl9UQUlMICAgICAgICAgICAgICAweDEwCisKKyNkZWZpbmUgQ0RBVEFfRE1BX0NPTlRST0wgICAgICAgICAgICAgICAweDExCisjZGVmaW5lIENEQVRBX1JFU0VSVkVEICAgICAgICAgICAgICAgICAgMHgxMgorCisjZGVmaW5lIENEQVRBX0ZSRVFVRU5DWSAgICAgICAgICAgICAgICAgMHgxMworI2RlZmluZSBDREFUQV9MRUZUX1ZPTFVNRSAgICAgICAgICAgICAgIDB4MTQKKyNkZWZpbmUgQ0RBVEFfUklHSFRfVk9MVU1FICAgICAgICAgICAgICAweDE1CisjZGVmaW5lIENEQVRBX0xFRlRfU1VSX1ZPTCAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBDREFUQV9SSUdIVF9TVVJfVk9MICAgICAgICAgICAgIDB4MTcKKworI2RlZmluZSBDREFUQV9IRUFERVJfTEVOICAgICAgICAgICAgICAgIDB4MTgKKworI2RlZmluZSBTUkMzX0RJUkVDVElPTl9PRkZTRVQgICAgICAgICAgIENEQVRBX0hFQURFUl9MRU4KKyNkZWZpbmUgU1JDM19NT0RFX09GRlNFVCAgICAgICAgICAgICAgICAoQ0RBVEFfSEVBREVSX0xFTiArIDEpCisjZGVmaW5lIFNSQzNfV09SRF9MRU5HVEhfT0ZGU0VUICAgICAgICAgKENEQVRBX0hFQURFUl9MRU4gKyAyKQorI2RlZmluZSBTUkMzX1BBUkFNRVRFUl9PRkZTRVQgICAgICAgICAgIChDREFUQV9IRUFERVJfTEVOICsgMykKKyNkZWZpbmUgU1JDM19DT0VGRl9BRERSX09GRlNFVCAgICAgICAgICAoQ0RBVEFfSEVBREVSX0xFTiArIDgpCisjZGVmaW5lIFNSQzNfRklMVEFQX0FERFJfT0ZGU0VUICAgICAgICAgKENEQVRBX0hFQURFUl9MRU4gKyAxMCkKKyNkZWZpbmUgU1JDM19URU1QX0lOQlVGX0FERFJfT0ZGU0VUICAgICAoQ0RBVEFfSEVBREVSX0xFTiArIDE2KQorI2RlZmluZSBTUkMzX1RFTVBfT1VUQlVGX0FERFJfT0ZGU0VUICAgIChDREFUQV9IRUFERVJfTEVOICsgMTcpCisKKyNkZWZpbmUgTUlOSVNSQ19JTl9CVUZGRVJfU0laRSAgICggMHg1MCAqIDIgKQorI2RlZmluZSBNSU5JU1JDX09VVF9CVUZGRVJfU0laRSAgKCAweDUwICogMiAqIDIpCisjZGVmaW5lIE1JTklTUkNfT1VUX0JVRkZFUl9TSVpFICAoIDB4NTAgKiAyICogMikKKyNkZWZpbmUgTUlOSVNSQ19UTVBfQlVGRkVSX1NJWkUgICggMTEyICsgKCBNSU5JU1JDX0JJUVVBRF9TVEFHRSAqIDMgKyA0ICkgKiAyICogMiApCisjZGVmaW5lIE1JTklTUkNfQklRVUFEX1NUQUdFICAgIDIKKyNkZWZpbmUgTUlOSVNSQ19DT0VGX0xPQyAgICAgICAgICAwWDE3NQorCisjZGVmaW5lIERNQUNPTlRST0xfQkxPQ0tfTUFTSyAgICAgICAgICAgMHgwMDBGCisjZGVmaW5lICBETUFDX0JMT0NLMF9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lICBETUFDX0JMT0NLMV9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDAxCisjZGVmaW5lICBETUFDX0JMT0NLMl9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lICBETUFDX0JMT0NLM19TRUxFQ1RPUiAgICAgICAgICAgMHgwMDAzCisjZGVmaW5lICBETUFDX0JMT0NLNF9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDA0CisjZGVmaW5lICBETUFDX0JMT0NLNV9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lICBETUFDX0JMT0NLNl9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDA2CisjZGVmaW5lICBETUFDX0JMT0NLN19TRUxFQ1RPUiAgICAgICAgICAgMHgwMDA3CisjZGVmaW5lICBETUFDX0JMT0NLOF9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDA4CisjZGVmaW5lICBETUFDX0JMT0NLOV9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDA5CisjZGVmaW5lICBETUFDX0JMT0NLQV9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDBBCisjZGVmaW5lICBETUFDX0JMT0NLQl9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDBCCisjZGVmaW5lICBETUFDX0JMT0NLQ19TRUxFQ1RPUiAgICAgICAgICAgMHgwMDBDCisjZGVmaW5lICBETUFDX0JMT0NLRF9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDBECisjZGVmaW5lICBETUFDX0JMT0NLRV9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDBFCisjZGVmaW5lICBETUFDX0JMT0NLRl9TRUxFQ1RPUiAgICAgICAgICAgMHgwMDBGCisjZGVmaW5lIERNQUNPTlRST0xfUEFHRV9NQVNLICAgICAgICAgICAgMHgwMEYwCisjZGVmaW5lICBETUFDX1BBR0UwX1NFTEVDVE9SICAgICAgICAgICAgMHgwMDMwCisjZGVmaW5lICBETUFDX1BBR0UxX1NFTEVDVE9SICAgICAgICAgICAgMHgwMDIwCisjZGVmaW5lICBETUFDX1BBR0UyX1NFTEVDVE9SICAgICAgICAgICAgMHgwMDEwCisjZGVmaW5lICBETUFDX1BBR0UzX1NFTEVDVE9SICAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIERNQUNPTlRST0xfQVVUT1JFUEVBVCAgICAgICAgICAgMHgxMDAwCisjZGVmaW5lIERNQUNPTlRST0xfU1RPUFBFRCAgICAgICAgICAgICAgMHgyMDAwCisjZGVmaW5lIERNQUNPTlRST0xfRElSRUNUSU9OICAgICAgICAgICAgMHgwMTAwCisKKworLyoKKyAqIERTUCBDb2RlIGltYWdlcworICovCisKK3N0YXRpYyB1MTYgYXNzcF9rZXJuZWxfaW1hZ2VbXSA9IHsKKyAgICAweDc5ODAsIDB4MDAzMCwgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDBGQiwgMHg3OTgwLCAweDAwREQsIDB4Nzk4MCwgMHgwM0I0LCAKKyAgICAweDc5ODAsIDB4MDMzMiwgMHg3OTgwLCAweDAyODcsIDB4Nzk4MCwgMHgwM0I0LCAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwM0I0LCAKKyAgICAweDc5ODAsIDB4MDMxQSwgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwMjJGLCAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwM0I0LCAKKyAgICAweDc5ODAsIDB4MDNCNCwgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwMDYzLCAweDc5ODAsIDB4MDA2QiwgMHg3OTgwLCAweDAzQjQsIDB4Nzk4MCwgMHgwM0I0LCAKKyAgICAweEJGODAsIDB4MkM3QywgMHg4ODA2LCAweDg4MDQsIDB4QkU0MCwgMHhCQzIwLCAweEFFMDksIDB4MTAwMCwgMHhBRTBBLCAweDAwMDEsIDB4NjkzOCwgMHhFQjA4LCAKKyAgICAweDAwNTMsIDB4Njk1QSwgMHhFQjA4LCAweDAwRDYsIDB4MDAwOSwgMHg4Qjg4LCAweDY5ODAsIDB4RTM4OCwgMHgwMDM2LCAweEJFMzAsIDB4QkMyMCwgMHg2OTA5LCAKKyAgICAweEI4MDEsIDB4OTAwOSwgMHhCRTQxLCAweEJFNDEsIDB4NjkyOCwgMHhFQjg4LCAweDAwNzgsIDB4QkU0MSwgMHhCRTQwLCAweDc5ODAsIDB4MDAzOCwgMHhCRTQxLCAKKyAgICAweEJFNDEsIDB4OTAzQSwgMHg2OTM4LCAweEUzMDgsIDB4MDA1NiwgMHg5MDNBLCAweEJFNDEsIDB4QkU0MCwgMHhFRjAwLCAweDkwM0EsIDB4NjkzOSwgMHhFMzA4LCAKKyAgICAweDAwNUUsIDB4OTAzQSwgMHhFRjAwLCAweDY5MEIsIDB4NjYwQywgMHhFRjhDLCAweDY5MEEsIDB4NjYwQywgMHg2MjBCLCAweDY2MDksIDB4RUYwMCwgMHg2OTEwLCAKKyAgICAweDY2MEYsIDB4RUYwNCwgMHhFMzg4LCAweDAwNzUsIDB4NjkwRSwgMHg2NjBGLCAweDYyMTAsIDB4NjYwRCwgMHhFRjAwLCAweDY5MEUsIDB4NjYwRCwgMHhFRjAwLCAKKyAgICAweEFFNzAsIDB4MDAwMSwgMHhCQzIwLCAweEFFMjcsIDB4MDAwMSwgMHg2OTM5LCAweEVCMDgsIDB4MDA1RCwgMHg2OTI2LCAweEI4MDEsIDB4OTAyNiwgMHgwMDI2LCAKKyAgICAweDhCODgsIDB4Njk4MCwgMHhFMzg4LCAweDAwQ0IsIDB4OTAyOCwgMHgwRDI4LCAweDQyMTEsIDB4RTEwMCwgMHgwMDdBLCAweDQ3MTEsIDB4RTEwMCwgMHgwMEEwLCAKKyAgICAweDdBODAsIDB4MDA2MywgMHhCODExLCAweDY2MEEsIDB4NjIwOSwgMHhFMzA0LCAweDAwN0EsIDB4MEMwQiwgMHg0MDA1LCAweDEwMEEsIDB4QkEwMSwgMHg5MDEyLCAKKyAgICAweDBDMTIsIDB4NDAwMiwgMHg3OTgwLCAweDAwQUYsIDB4N0E4MCwgMHgwMDZCLCAweEJFMDIsIDB4NjIwRSwgMHg2NjBELCAweEJBMTAsIDB4RTM0NCwgMHgwMDdBLCAKKyAgICAweDBDMTAsIDB4NDAwNSwgMHgxMDBFLCAweEJBMDEsIDB4OTAxMiwgMHgwQzEyLCAweDQwMDIsIDB4MTAwMywgMHhCQTAyLCAweDkwMTIsIDB4MEMxMiwgMHg0MDAwLCAKKyAgICAweDEwMDMsIDB4RTM4OCwgMHgwMEJBLCAweDEwMDQsIDB4Nzk4MCwgMHgwMEJDLCAweDEwMDQsIDB4QkEwMSwgMHg5MDEyLCAweDBDMTIsIDB4NDAwMSwgMHgwQzA1LCAKKyAgICAweDQwMDMsIDB4MEMwNiwgMHg0MDA0LCAweDEwMTEsIDB4QkZCMCwgMHgwMUZGLCAweDkwMTIsIDB4MEMxMiwgMHg0MDA2LCAweEJDMjAsIDB4RUYwMCwgMHhBRTI2LCAKKyAgICAweDEwMjgsIDB4Njk3MCwgMHhCRkQwLCAweDAwMDEsIDB4OTA3MCwgMHhFMzg4LCAweDAwN0EsIDB4QUUyOCwgMHgwMDAwLCAweEVGMDAsIDB4QUU3MCwgMHgwMzAwLCAKKyAgICAweDBDNzAsIDB4QjAwQywgMHhBRTVBLCAweDAwMDAsIDB4RUYwMCwgMHg3QTgwLCAweDAzOEEsIDB4Njk3RiwgMHhCODAxLCAweDkwN0YsIDB4MDA1NiwgMHg4Qjg4LCAKKyAgICAweDBDQTAsIDB4QjAwOCwgMHhBRjcxLCAweEIwMDAsIDB4NEU3MSwgMHhFMjAwLCAweDAwRjMsIDB4QUU1NiwgMHgxMDU3LCAweDAwNTYsIDB4MENBMCwgMHhCMDA4LCAKKyAgICAweDgwNTYsIDB4Nzk4MCwgMHgwM0ExLCAweDA4MTAsIDB4QkZBMCwgMHgxMDU5LCAweEUzMDQsIDB4MDNBMSwgMHg4MDU2LCAweDc5ODAsIDB4MDNBMSwgMHg3QTgwLCAKKyAgICAweDAzOEEsIDB4QkYwMSwgMHhCRTQzLCAweEJFNTksIDB4OTA3QywgMHg2OTM3LCAweEUzODgsIDB4MDEwRCwgMHhCQTAxLCAweEUzMDgsIDB4MDEwQywgMHhBRTcxLCAKKyAgICAweDAwMDQsIDB4MEM3MSwgMHg1MDAwLCAweDY5MzYsIDB4OTAzNywgMHhCRjBBLCAweDEwOUUsIDB4OEI4QSwgMHhBRjgwLCAweDgwMTQsIDB4NEM4MCwgMHhCRjBBLCAKKyAgICAweDA1NjAsIDB4RjUwMCwgMHhCRjBBLCAweDA1MjAsIDB4QjkwMCwgMHhCQjE3LCAweDkwQTAsIDB4NjkxNywgMHhFMzg4LCAweDAxNDgsIDB4MEQxNywgMHhFMTAwLCAKKyAgICAweDAxMjcsIDB4QkYwQywgMHgwNTc4LCAweEJGMEQsIDB4MDU3QywgMHg3OTgwLCAweDAxMkIsIDB4QkYwQywgMHgwNTM4LCAweEJGMEQsIDB4MDUzQywgMHg2OTAwLCAKKyAgICAweEUzMDgsIDB4MDEzNSwgMHg4QjhDLCAweEJFNTksIDB4QkIwNywgMHg5MEEwLCAweEJDMjAsIDB4Nzk4MCwgMHgwMTU3LCAweDAzMEMsIDB4OEI4QiwgMHhCOTAzLCAKKyAgICAweDg4MDksIDB4QkVDNiwgMHgwMTNFLCAweDY5QUMsIDB4OTBBQiwgMHg2OUFELCAweDkwQUIsIDB4MDgxMywgMHg2NjBBLCAweEUzNDQsIDB4MDE0NCwgMHgwMzA5LCAKKyAgICAweDgzMEMsIDB4QkMyMCwgMHg3OTgwLCAweDAxNTcsIDB4Njk1NSwgMHhFMzg4LCAweDAxNTcsIDB4N0MzOCwgMHhCRjBCLCAweDA1NzgsIDB4RjUwMCwgMHhCRjBCLCAKKyAgICAweDA1MzgsIDB4QjkwNywgMHg4ODA5LCAweEJFQzYsIDB4MDE1NiwgMHgxMEFCLCAweDkwQUEsIDB4Njk3NCwgMHhFMzg4LCAweDAxNjMsIDB4QUU3MiwgMHgwNTQwLCAKKyAgICAweEY1MDAsIDB4QUU3MiwgMHgwNTAwLCAweEFFNjEsIDB4MTAzQiwgMHg3QTgwLCAweDAyRjYsIDB4Njk3OCwgMHhFMzg4LCAweDAxODIsIDB4OEI4QywgMHhCRjBDLCAKKyAgICAweDA1NjAsIDB4RTUwMCwgMHg3QzQwLCAweDA4MTQsIDB4QkEyMCwgMHg4ODEyLCAweDczM0QsIDB4N0E4MCwgMHgwMzgwLCAweDczM0UsIDB4N0E4MCwgMHgwMzgwLCAKKyAgICAweDhCOEMsIDB4QkYwQywgMHgwNTZDLCAweEU1MDAsIDB4N0M0MCwgMHgwODE0LCAweEJBMkMsIDB4ODgxMiwgMHg3MzNGLCAweDdBODAsIDB4MDM4MCwgMHg3MzQwLCAKKyAgICAweDdBODAsIDB4MDM4MCwgMHg2OTc1LCAweEUzODgsIDB4MDE4RSwgMHhBRTcyLCAweDA1NDgsIDB4RjUwMCwgMHhBRTcyLCAweDA1MDgsIDB4QUU2MSwgMHgxMDQxLCAKKyAgICAweDdBODAsIDB4MDJGNiwgMHg2OTc5LCAweEUzODgsIDB4MDFBRCwgMHg4QjhDLCAweEJGMEMsIDB4MDU2MCwgMHhFNTAwLCAweDdDNDAsIDB4MDgxNCwgMHhCQTE4LCAKKyAgICAweDg4MTIsIDB4NzM0MywgMHg3QTgwLCAweDAzODAsIDB4NzM0NCwgMHg3QTgwLCAweDAzODAsIDB4OEI4QywgMHhCRjBDLCAweDA1NkMsIDB4RTUwMCwgMHg3QzQwLCAKKyAgICAweDA4MTQsIDB4QkEyNCwgMHg4ODEyLCAweDczNDUsIDB4N0E4MCwgMHgwMzgwLCAweDczNDYsIDB4N0E4MCwgMHgwMzgwLCAweDY5NzYsIDB4RTM4OCwgMHgwMUI5LCAKKyAgICAweEFFNzIsIDB4MDU1OCwgMHhGNTAwLCAweEFFNzIsIDB4MDUxOCwgMHhBRTYxLCAweDEwNDcsIDB4N0E4MCwgMHgwMkY2LCAweDY5N0EsIDB4RTM4OCwgMHgwMUQ4LCAKKyAgICAweDhCOEMsIDB4QkYwQywgMHgwNTYwLCAweEU1MDAsIDB4N0M0MCwgMHgwODE0LCAweEJBMDgsIDB4ODgxMiwgMHg3MzQ5LCAweDdBODAsIDB4MDM4MCwgMHg3MzRBLCAKKyAgICAweDdBODAsIDB4MDM4MCwgMHg4QjhDLCAweEJGMEMsIDB4MDU2QywgMHhFNTAwLCAweDdDNDAsIDB4MDgxNCwgMHhCQTE0LCAweDg4MTIsIDB4NzM0QiwgMHg3QTgwLCAKKyAgICAweDAzODAsIDB4NzM0QywgMHg3QTgwLCAweDAzODAsIDB4QkMyMSwgMHhBRTFDLCAweDEwOTAsIDB4OEI4QSwgMHhCRjBBLCAweDA1NjAsIDB4RTUwMCwgMHg3QzQwLCAKKyAgICAweDA4MTIsIDB4QjgwNCwgMHg4ODEzLCAweDhCOEQsIDB4QkYwRCwgMHgwNTZDLCAweEU1MDAsIDB4N0M0MCwgMHgwODE1LCAweEI4MDQsIDB4ODgxMSwgMHg3QTgwLCAKKyAgICAweDAzNEEsIDB4OEI4QSwgMHhCRjBBLCAweDA1NjAsIDB4RTUwMCwgMHg3QzQwLCAweDczMUYsIDB4QjkwMywgMHg4ODA5LCAweEJFQzYsIDB4MDFGOSwgMHg1NDhBLCAKKyAgICAweEJFMDMsIDB4OThBMCwgMHg3MzIwLCAweEI5MDMsIDB4ODgwOSwgMHhCRUM2LCAweDAyMDEsIDB4NTQ4QSwgMHhCRTAzLCAweDk4QTAsIDB4MUYyMCwgMHgyRjFGLCAKKyAgICAweDk4MjYsIDB4QkMyMCwgMHg2OTM1LCAweEUzODgsIDB4MDNBMSwgMHg2OTMzLCAweEI4MDEsIDB4OTAzMywgMHhCRkEwLCAweDAyRUUsIDB4RTMwOCwgMHgwM0ExLCAKKyAgICAweDkwMzMsIDB4QkYwMCwgMHg2OTUxLCAweEUzODgsIDB4MDIxRiwgMHg3MzM0LCAweEJFODAsIDB4NTc2MCwgMHhCRTAzLCAweDlGN0UsIDB4QkU1OSwgMHg5MDM0LCAKKyAgICAweDY5N0UsIDB4MEQ1MSwgMHg5MDEzLCAweEJDMjAsIDB4Njk1QywgMHhFMzg4LCAweDAzQTEsIDB4NzM1RSwgMHhCRTgwLCAweDU3NjAsIDB4QkUwMywgMHg5RjdFLCAKKyAgICAweEJFNTksIDB4OTA1RSwgMHg2OTdFLCAweDBENUMsIDB4OTAxMywgMHg3OTgwLCAweDAzQTEsIDB4N0E4MCwgMHgwMzhBLCAweEJGMDEsIDB4QkU0MywgMHg2OTc3LCAKKyAgICAweEUzODgsIDB4MDI0RSwgMHhBRTYxLCAweDEwNEQsIDB4MDA2MSwgMHg4Qjg4LCAweDY5ODAsIDB4RTM4OCwgMHgwMjRFLCAweDkwNzEsIDB4MEQ3MSwgMHgwMDBCLCAKKyAgICAweEFGQTAsIDB4ODAxMCwgMHhBRkEwLCAweDgwMTAsIDB4MDgxMCwgMHg2NjBBLCAweEUzMDgsIDB4MDI0OSwgMHgwMDA5LCAweDA4MTAsIDB4NjYwQywgMHhFMzg4LCAKKyAgICAweDAyNEUsIDB4ODAwQiwgMHhCQzIwLCAweDY5N0IsIDB4RTM4OCwgMHgwM0ExLCAweEJGMEEsIDB4MTA5RSwgMHg4QjhBLCAweEFGODAsIDB4ODAxNCwgMHg0QzgwLCAKKyAgICAweEUxMDAsIDB4MDI2NiwgMHg2OTdDLCAweEJGOTAsIDB4MDU2MCwgMHg5MDcyLCAweDAzNzIsIDB4Njk3QywgMHhCRjkwLCAweDA1NjQsIDB4OTA3MywgMHgwNDczLCAKKyAgICAweDc5ODAsIDB4MDI3MCwgMHg2OTdDLCAweEJGOTAsIDB4MDUyMCwgMHg5MDcyLCAweDAzNzIsIDB4Njk3QywgMHhCRjkwLCAweDA1MjQsIDB4OTA3MywgMHgwNDczLCAKKyAgICAweDY5N0MsIDB4QjgwMSwgMHg5MDdDLCAweEJGMEEsIDB4MTBGRCwgMHg4QjhBLCAweEFGODAsIDB4ODAxMCwgMHg3MzRGLCAweDU0OEEsIDB4QkUwMywgMHg5ODgwLCAKKyAgICAweEJDMjEsIDB4NzMyNiwgMHg1NDhCLCAweEJFMDMsIDB4NjE4QiwgMHg5ODhDLCAweEJFMDMsIDB4NjE4MCwgMHg5ODgwLCAweDc5ODAsIDB4MDNBMSwgMHg3QTgwLCAKKyAgICAweDAzOEEsIDB4MEQyOCwgMHg0NzExLCAweEUxMDAsIDB4MDJCRSwgMHhBRjEyLCAweDQwMDYsIDB4NjkxMiwgMHhCRkIwLCAweDBDMDAsIDB4RTM4OCwgMHgwMkI2LCAKKyAgICAweEJGQTAsIDB4MDgwMCwgMHhFMzg4LCAweDAyQjIsIDB4NjkxMiwgMHhCRkIwLCAweDBDMDAsIDB4QkZBMCwgMHgwNDAwLCAweEUzODgsIDB4MDJBMywgMHg2OTA5LCAKKyAgICAweDkwMEIsIDB4Nzk4MCwgMHgwMkE1LCAweEFGMEIsIDB4NDAwNSwgMHg2OTAxLCAweDkwMDUsIDB4NjkwMiwgMHg5MDA2LCAweDQzMTEsIDB4RTEwMCwgMHgwMkVELCAKKyAgICAweDY5MTEsIDB4QkZDMCwgMHgyMDAwLCAweDkwMTEsIDB4Nzk4MCwgMHgwMkVELCAweDY5MDksIDB4OTAwQiwgMHg3OTgwLCAweDAyQjgsIDB4QUYwQiwgMHg0MDA1LCAKKyAgICAweEFGMDUsIDB4NDAwMywgMHhBRjA2LCAweDQwMDQsIDB4Nzk4MCwgMHgwMkVELCAweEFGMTIsIDB4NDAwNiwgMHg2OTEyLCAweEJGQjAsIDB4MEMwMCwgMHhFMzg4LCAKKyAgICAweDAyRTcsIDB4QkZBMCwgMHgwODAwLCAweEUzODgsIDB4MDJFMywgMHg2OTEyLCAweEJGQjAsIDB4MEMwMCwgMHhCRkEwLCAweDA0MDAsIDB4RTM4OCwgMHgwMkQ0LCAKKyAgICAweDY5MEQsIDB4OTAxMCwgMHg3OTgwLCAweDAyRDYsIDB4QUYxMCwgMHg0MDA1LCAweDY5MDEsIDB4OTAwNSwgMHg2OTAyLCAweDkwMDYsIDB4NDMxMSwgMHhFMTAwLCAKKyAgICAweDAyRUQsIDB4NjkxMSwgMHhCRkMwLCAweDIwMDAsIDB4OTAxMSwgMHg3OTgwLCAweDAyRUQsIDB4NjkwRCwgMHg5MDEwLCAweDc5ODAsIDB4MDJFOSwgMHhBRjEwLCAKKyAgICAweDQwMDUsIDB4QUYwNSwgMHg0MDAzLCAweEFGMDYsIDB4NDAwNCwgMHhCQzIwLCAweDY5NzAsIDB4OTA3MSwgMHg3QTgwLCAweDAwNzgsIDB4Njk3MSwgMHg5MDcwLCAKKyAgICAweDc5ODAsIDB4MDNBMSwgMHhCQzIwLCAweDAzNjEsIDB4OEI4QiwgMHg2OTgwLCAweEVGODgsIDB4MDI3MiwgMHgwMzcyLCAweDc4MDQsIDB4OTA3MSwgMHgwRDcxLCAKKyAgICAweDhCOEEsIDB4MDAwQiwgMHhCOTAzLCAweDg4MDksIDB4QkVDNiwgMHgwMzA5LCAweDY5QTgsIDB4OTBBQiwgMHg2OUE4LCAweDkwQUEsIDB4MDgxMCwgMHg2NjBBLCAKKyAgICAweEUzNDQsIDB4MDMwRiwgMHgwMDA5LCAweDA4MTAsIDB4NjYwQywgMHhFMzg4LCAweDAzMTQsIDB4ODAwQiwgMHhCQzIwLCAweDY5NjEsIDB4QjgwMSwgMHg5MDYxLCAKKyAgICAweDc5ODAsIDB4MDJGNywgMHg3QTgwLCAweDAzOEEsIDB4NUQzNSwgMHgwMDAxLCAweDY5MzQsIDB4QjgwMSwgMHg5MDM0LCAweEJGMEEsIDB4MTA5RSwgMHg4QjhBLCAKKyAgICAweEFGODAsIDB4ODAxNCwgMHg0ODgwLCAweEFFNzIsIDB4MDU1MCwgMHhGNTAwLCAweEFFNzIsIDB4MDUxMCwgMHhBRTYxLCAweDEwNTEsIDB4N0E4MCwgMHgwMkY2LCAKKyAgICAweDc5ODAsIDB4MDNBMSwgMHg3QTgwLCAweDAzOEEsIDB4NUQzNSwgMHgwMDAyLCAweDY5NUUsIDB4QjgwMSwgMHg5MDVFLCAweEJGMEEsIDB4MTA5RSwgMHg4QjhBLCAKKyAgICAweEFGODAsIDB4ODAxNCwgMHg0NzgwLCAweEFFNzIsIDB4MDU1OCwgMHhGNTAwLCAweEFFNzIsIDB4MDUxOCwgMHhBRTYxLCAweDEwNUMsIDB4N0E4MCwgMHgwMkY2LCAKKyAgICAweDc5ODAsIDB4MDNBMSwgMHgwMDFDLCAweDhCODgsIDB4Njk4MCwgMHhFRjg4LCAweDkwMUQsIDB4MEQxRCwgMHgxMDBGLCAweDY2MTAsIDB4RTM4QywgMHgwMzU4LCAKKyAgICAweDY5MEUsIDB4NjYxMCwgMHg2MjBGLCAweDY2MEQsIDB4QkEwRiwgMHhFMzAxLCAweDAzN0EsIDB4MDQxMCwgMHg4QjhBLCAweEI5MDMsIDB4ODgwOSwgMHhCRUM2LCAKKyAgICAweDAzNkMsIDB4NkE4QywgMHg2MUFBLCAweDk4QUIsIDB4NkE4QywgMHg2MUFCLCAweDk4QUQsIDB4NkE4QywgMHg2MUFELCAweDk4QTksIDB4NkE4QywgMHg2MUE5LCAKKyAgICAweDk4QUEsIDB4N0MwNCwgMHg4QjhCLCAweDdDMDQsIDB4OEI4RCwgMHg3QzA0LCAweDhCODksIDB4N0MwNCwgMHgwODE0LCAweDY2MEUsIDB4RTMwOCwgMHgwMzc5LCAKKyAgICAweDA0MEQsIDB4ODQxMCwgMHhCQzIxLCAweDY5MUMsIDB4QjgwMSwgMHg5MDFDLCAweDc5ODAsIDB4MDM0QSwgMHhCOTAzLCAweDg4MDksIDB4OEI4QSwgMHhCRUM2LCAKKyAgICAweDAzODgsIDB4NTRBQywgMHhCRTAzLCAweDYxOEMsIDB4OThBQSwgMHhFRjAwLCAweEJDMjAsIDB4QkU0NiwgMHgwODA5LCAweDkwNkIsIDB4MDgwQSwgMHg5MDZDLCAKKyAgICAweDA4MEIsIDB4OTA2RCwgMHgwODFBLCAweDkwNjIsIDB4MDgxQiwgMHg5MDYzLCAweDA4MUUsIDB4OTA2NCwgMHhCRTU5LCAweDg4MUUsIDB4ODA2NSwgMHg4MTY2LCAKKyAgICAweDgyNjcsIDB4ODM2OCwgMHg4NDY5LCAweDg1NkEsIDB4RUYwMCwgMHhCQzIwLCAweDY5NkIsIDB4ODgwOSwgMHg2OTZDLCAweDg4MEEsIDB4Njk2RCwgMHg4ODBCLCAKKyAgICAweDY5NjIsIDB4ODgxQSwgMHg2OTYzLCAweDg4MUIsIDB4Njk2NCwgMHg4ODFFLCAweDAwNjUsIDB4MDE2NiwgMHgwMjY3LCAweDAzNjgsIDB4MDQ2OSwgMHgwNTZBLCAKKyAgICAweEJFM0EsIAorfTsKKworLyoKKyAqIE1pbmkgc2FtcGxlIHJhdGUgY29udmVydGVyIGNvZGUgaW1hZ2UKKyAqIHRoYXQgaXMgdG8gYmUgbG9hZGVkIGF0IDB4NDAwIG9uIHRoZSBEU1AuCisgKi8KK3N0YXRpYyB1MTYgYXNzcF9taW5pc3JjX2ltYWdlW10gPSB7CisKKyAgICAweEJGODAsIDB4MTAxRSwgMHg5MDZFLCAweDAwNkUsIDB4OEI4OCwgMHg2OTgwLCAweEVGODgsIDB4OTA2RiwgMHgwRDZGLCAweDY5MDAsIDB4RUIwOCwgMHgwNDEyLCAKKyAgICAweEJDMjAsIDB4Njk2RSwgMHhCODAxLCAweDkwNkUsIDB4Nzk4MCwgMHgwNDAzLCAweEI5MEUsIDB4ODgwNywgMHhCRTQzLCAweEJGMDEsIDB4QkU0NywgMHhCRTQxLCAKKyAgICAweDdBODAsIDB4MDAyQSwgMHhCRTQwLCAweDMwMjksIDB4RUZDQywgMHhCRTQxLCAweDdBODAsIDB4MDAyOCwgMHhCRTQwLCAweDMwMjgsIDB4RUZDQywgMHg2OTA3LCAKKyAgICAweEUzMDgsIDB4MDQyQSwgMHg2OTA5LCAweDkwMkMsIDB4Nzk4MCwgMHgwNDJDLCAweDY5MEQsIDB4OTAyQywgMHgxMDA5LCAweDg4MUEsIDB4MTAwQSwgMHhCQTAxLCAKKyAgICAweDg4MUIsIDB4MTAwRCwgMHg4ODFDLCAweDEwMEUsIDB4QkEwMSwgMHg4ODFELCAweEJGODAsIDB4MDBFRCwgMHg4ODFFLCAweDA1MEMsIDB4MDEyNCwgMHhCOTA0LCAKKyAgICAweDkwMjcsIDB4NjkxOCwgMHhFMzA4LCAweDA0QjMsIDB4OTAyRCwgMHg2OTEzLCAweEJGQTAsIDB4NzU5OCwgMHhGNzA0LCAweEFFMkQsIDB4MDBGRiwgMHg4QjhELCAKKyAgICAweDY5MTksIDB4RTMwOCwgMHgwNDYzLCAweDY5MUEsIDB4RTMwOCwgMHgwNDU2LCAweEI5MDcsIDB4ODgwOSwgMHhCRUM2LCAweDA0NTMsIDB4MTBBOSwgMHg5MEFELCAKKyAgICAweDc5ODAsIDB4MDQ3QywgMHhCOTAzLCAweDg4MDksIDB4QkVDNiwgMHgwNDYwLCAweDE4ODksIDB4NkMyMiwgMHg5MEFELCAweDEwQTksIDB4NkUyMywgMHg2QzIyLCAKKyAgICAweDkwQUQsIDB4Nzk4MCwgMHgwNDdDLCAweDEwMUEsIDB4RTMwOCwgMHgwNDZGLCAweEI5MDMsIDB4ODgwOSwgMHhCRUM2LCAweDA0NkMsIDB4MTBBOSwgMHg5MEEwLCAKKyAgICAweDkwQUQsIDB4Nzk4MCwgMHgwNDdDLCAweEI5MDEsIDB4ODgwOSwgMHhCRUM2LCAweDA0N0IsIDB4MTg4OSwgMHg2QzIyLCAweDkwQTAsIDB4OTBBRCwgMHgxMEE5LCAKKyAgICAweDZFMjMsIDB4NkMyMiwgMHg5MEEwLCAweDkwQUQsIDB4NjkyRCwgMHhFMzA4LCAweDA0OUMsIDB4MDEyNCwgMHhCNzAzLCAweEI5MDIsIDB4ODgxOCwgMHg4Qjg5LCAKKyAgICAweDAyMkMsIDB4MTA4QSwgMHg3QzA0LCAweDkwQTAsIDB4NjkyQiwgMHg4ODFGLCAweDdFODAsIDB4MDU1QiwgMHg2OTJBLCAweDg4MDksIDB4OEI4OSwgMHg5OUEwLCAKKyAgICAweDEwOEEsIDB4OTBBMCwgMHg2OTJCLCAweDg4MUYsIDB4N0U4MCwgMHgwNTVCLCAweDY5MkEsIDB4ODgwOSwgMHg4Qjg5LCAweDk5QUYsIDB4N0I5OSwgMHgwNDg0LCAKKyAgICAweDAxMjQsIDB4MDYwRiwgMHgxMDFCLCAweDIwMTMsIDB4OTAxQiwgMHhCRkEwLCAweDdGRkYsIDB4RTM0NCwgMHgwNEFDLCAweDkwMUIsIDB4OEI4OSwgMHg3QTgwLCAKKyAgICAweDA1MUEsIDB4NjkyNywgMHhCQTAxLCAweDkwMjcsIDB4N0E4MCwgMHgwNTIzLCAweDY5MjcsIDB4RTMwOCwgMHgwNDlFLCAweDc5ODAsIDB4MDUwRiwgMHgwNjI0LCAKKyAgICAweDEwMjYsIDB4MjAxMywgMHg5MDI2LCAweEJGQTAsIDB4N0ZGRiwgMHhFMzA0LCAweDA0QzAsIDB4OEI4RCwgMHg3QTgwLCAweDA1MUEsIDB4Nzk4MCwgMHgwNEI0LCAKKyAgICAweDkwMjYsIDB4MTAxMywgMHgzMDI2LCAweDkwMUIsIDB4OEI4RCwgMHg3QTgwLCAweDA1MUEsIDB4N0E4MCwgMHgwNTIzLCAweDEwMjcsIDB4QkEwMSwgMHg5MDI3LCAKKyAgICAweEUzMDgsIDB4MDRCNCwgMHgwMTI0LCAweDA2MEYsIDB4OEI4OSwgMHg2OTFBLCAweEUzMDgsIDB4MDRFQSwgMHg2OTE5LCAweEUzODgsIDB4MDRFMCwgMHhCOTAzLCAKKyAgICAweDg4MDksIDB4QkVDNiwgMHgwNERELCAweDFGQTAsIDB4MkZBRSwgMHg5OEE5LCAweDc5ODAsIDB4MDUwRiwgMHhCOTAxLCAweDg4MTgsIDB4QjkwNywgMHg4ODA5LCAKKyAgICAweEJFQzYsIDB4MDRFNywgMHgxMEVFLCAweDkwQTksIDB4Nzk4MCwgMHgwNTBGLCAweDY5MTksIDB4RTMwOCwgMHgwNEZFLCAweEI5MDMsIDB4ODgwOSwgMHhCRTQ2LCAKKyAgICAweEJFQzYsIDB4MDRGQSwgMHgxN0EwLCAweEJFMUUsIDB4MUZBRSwgMHhCRkJGLCAweEZGMDAsIDB4QkUxMywgMHhCRkRGLCAweDgwODAsIDB4OTlBOSwgMHhCRTQ3LCAKKyAgICAweDc5ODAsIDB4MDUwRiwgMHhCOTAxLCAweDg4MDksIDB4QkVDNiwgMHgwNTBFLCAweDE2QTAsIDB4MjZBMCwgMHhCRkI3LCAweEZGMDAsIDB4QkUxRSwgMHgxRUEwLCAKKyAgICAweDJFQUUsIDB4QkZCRiwgMHhGRjAwLCAweEJFMTMsIDB4QkZERiwgMHg4MDgwLCAweDk5QTksIDB4ODUwQywgMHg4NjBGLCAweDY5MDcsIDB4RTM4OCwgMHgwNTE2LCAKKyAgICAweDBEMDcsIDB4ODUxMCwgMHhCRTU5LCAweDg4MUUsIDB4QkU0QSwgMHhFRjAwLCAweDEwMUUsIDB4OTAxQywgMHgxMDFGLCAweDkwMUQsIDB4MTBBMCwgMHg5MDFFLCAKKyAgICAweDEwQTAsIDB4OTAxRiwgMHhFRjAwLCAweDEwMUUsIDB4MzAxQywgMHg5MDIwLCAweDczMUIsIDB4NTQyMCwgMHhCRTAzLCAweDk4MjUsIDB4MTAyNSwgMHgyMDFDLCAKKyAgICAweDkwMjUsIDB4NzMyNSwgMHg1NDE0LCAweEJFMDMsIDB4OEI4RSwgMHg5ODgwLCAweDY5MkYsIDB4RTM4OCwgMHgwNTM5LCAweEJFNTksIDB4QkIwNywgMHg2MTgwLCAKKyAgICAweDk4ODAsIDB4OEJBMCwgMHgxMDFGLCAweDMwMUQsIDB4OTAyMSwgMHg3MzFCLCAweDU0MjEsIDB4QkUwMywgMHg5ODJFLCAweDEwMkUsIDB4MjAxRCwgMHg5MDJFLCAKKyAgICAweDczMkUsIDB4NTQxNSwgMHhCRTAzLCAweDk4ODAsIDB4NjkyRiwgMHhFMzg4LCAweDA1NEYsIDB4QkU1OSwgMHhCQjA3LCAweDYxODAsIDB4OTg4MCwgMHg4QkEwLCAKKyAgICAweDY5MTgsIDB4RUYwOCwgMHg3MzI1LCAweDU0MTYsIDB4QkUwMywgMHg5OEEwLCAweDczMkUsIDB4NTQxNywgMHhCRTAzLCAweDk4QTAsIDB4RUYwMCwgMHg4QkEwLCAKKyAgICAweEJFQzYsIDB4MDU2QiwgMHhCRTU5LCAweEJCMDQsIDB4QUE5MCwgMHhCRTA0LCAweEJFMUUsIDB4OTlFMCwgMHg4QkUwLCAweDY5QTAsIDB4OTBEMCwgMHg2OUEwLCAKKyAgICAweDkwRDAsIDB4MDgxRiwgMHhCODA1LCAweDg4MUYsIDB4OEI5MCwgMHg2OUEwLCAweDkwRDAsIDB4NjlBMCwgMHg5MDkwLCAweDhCRDAsIDB4OEJEOCwgMHhCRTFGLCAKKyAgICAweEVGMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKKyAgICAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwLCAKK307CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tYXVpLmMgYi9zb3VuZC9vc3MvbWF1aS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1Y2YxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbWF1aS5jCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICogc291bmQvbWF1aS5jCisgKgorICogVGhlIGxvdyBsZXZlbCBkcml2ZXIgZm9yIFR1cnRsZSBCZWFjaCBNYXVpIGFuZCBUcm9wZXouCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCUNoYW5nZXM6CisgKgkJQWxhbiBDb3gJCUdlbmVyYWwgY2xlYW4gdXAsIHVzZSBrZXJuZWwgSVJRIAorICoJCQkJCXN5c3RlbQorICoJCUNocmlzdG9waCBIZWxsd2lnCUFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQKKyAqCQlCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6CisgKgkJCQkJQWRkZWQgX19pbml0IHRvIGRvd25sb2FkX2NvZGUoKQorICoKKyAqCVN0YXR1czoKKyAqCQlBbmRyZXcgSi4gS3JvbGwJCVRlc3RlZCAwNi8wMS8xOTk5IHdpdGg6CisgKgkJCQkJKiBPU1dGLk1PVCBGaWxlIFZlcnNpb246IDEuMTUKKyAqCQkJCQkqIE9TV0YuTU9UIEZpbGUgRGF0ZWQ6IDA5LzEyLzk0CisgKgkJCQkJKiBPbGRlciB2ZXJzaW9ucyB3aWxsIGNhdXNlIHByb2JsZW1zLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisKKyNkZWZpbmUgVVNFX1NFUV9NQUNST1MKKyNkZWZpbmUgVVNFX1NJTVBMRV9NQUNST1MKKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInNvdW5kX2Zpcm13YXJlLmgiCisKKyNpbmNsdWRlICJtcHU0MDEuaCIKKworc3RhdGljIGludCAgICAgIG1hdWlfYmFzZSA9IDB4MzMwOworCitzdGF0aWMgdm9sYXRpbGUgaW50IGlycV9vazsKK3N0YXRpYyBpbnQgICAgICptYXVpX29zcDsKKworI2RlZmluZSBIT1NUX0RBVEFfUE9SVAkobWF1aV9iYXNlICsgMikKKyNkZWZpbmUgSE9TVF9TVEFUX1BPUlQJKG1hdWlfYmFzZSArIDMpCisjZGVmaW5lIEhPU1RfQ1RSTF9QT1JUCShtYXVpX2Jhc2UgKyAzKQorCisjZGVmaW5lIFNUQVRfVFhfSU5UUgkweDQwCisjZGVmaW5lIFNUQVRfVFhfQVZBSUwJMHgyMAorI2RlZmluZSBTVEFUX1RYX0lFTkEJMHgxMAorI2RlZmluZSBTVEFUX1JYX0lOVFIJMHgwNAorI2RlZmluZSBTVEFUX1JYX0FWQUlMCTB4MDIKKyNkZWZpbmUgU1RBVF9SWF9JRU5BCTB4MDEKKworc3RhdGljIGludCAgICAgICgqb3JpZ19sb2FkX3BhdGNoKShpbnQgZGV2LCBpbnQgZm9ybWF0LCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwKKwkJCSAgICAgIGludCBvZmZzLCBpbnQgY291bnQsIGludCBwbWdyX2ZsYWcpID0gTlVMTDsKKworI2luY2x1ZGUgIm1hdWlfYm9vdC5oIgorCitzdGF0aWMgaW50IG1hdWlfd2FpdChpbnQgbWFzaykKK3sKKwlpbnQgaTsKKworCS8qCisJICogUGVyZm9ybSBhIHNob3J0IGluaXRpYWwgd2FpdCB3aXRob3V0IHNsZWVwaW5nCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgMTAwOyBpKyspCisJCWlmIChpbmIoSE9TVF9TVEFUX1BPUlQpICYgbWFzaykKKwkJCXJldHVybiAxOworCisJLyoKKwkgKiBXYWl0IHVwIHRvIDE1IHNlY29uZHMgd2l0aCBzbGVlcGluZworCSAqLworCisJZm9yIChpID0gMDsgaSA8IDE1MDsgaSsrKSB7CisJCWlmIChpbmIoSE9TVF9TVEFUX1BPUlQpICYgbWFzaykKKwkJCXJldHVybiAxOworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGVfdGltZW91dChIWiAvIDEwKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hdWlfcmVhZCh2b2lkKQoreworCWlmIChtYXVpX3dhaXQoU1RBVF9SWF9BVkFJTCkpCisJCXJldHVybiBpbmIoSE9TVF9EQVRBX1BPUlQpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCBtYXVpX3dyaXRlKHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlpZiAobWF1aV93YWl0KFNUQVRfVFhfQVZBSUwpKSB7CisJCW91dGIoKGRhdGEpLCBIT1NUX0RBVEFfUE9SVCk7CisJCXJldHVybiAxOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICJNYXVpOiBXcml0ZSB0aW1lb3V0XG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IG1hdWlpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KQoreworCWlycV9vayA9IDE7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IF9faW5pdCBkb3dubG9hZF9jb2RlKHZvaWQpCit7CisJaW50IGksIGxpbmVzID0gMDsKKwlpbnQgZW9sX3NlZW4gPSAwLCBkb25lID0gMDsKKwlpbnQgc2tpcCA9IDE7CisKKwlwcmludGsoS0VSTl9JTkZPICJDb2RlIGRvd25sb2FkICglZCBieXRlcyk6ICIsIG1hdWlfb3NMZW4pOworCisJZm9yIChpID0gMDsgaSA8IG1hdWlfb3NMZW47IGkrKykgeworCQlpZiAobWF1aV9vc1tpXSAhPSAnXHInKSB7CisJCQlpZiAoIXNraXAgfHwgKG1hdWlfb3NbaV0gPT0gJ1MnICYmIChpID09IDAgfHwgbWF1aV9vc1tpIC0gMV0gPT0gJ1xuJykpKSB7CisJCQkJc2tpcCA9IDA7CisKKwkJCQlpZiAobWF1aV9vc1tpXSA9PSAnXG4nKQorCQkJCQllb2xfc2VlbiA9IHNraXAgPSAxOworCQkJCWVsc2UgaWYgKG1hdWlfb3NbaV0gPT0gJ1MnKSB7CisJCQkJCWlmIChtYXVpX29zW2kgKyAxXSA9PSAnOCcpCisJCQkJCQlkb25lID0gMTsKKwkJCQkJaWYgKCFtYXVpX3dyaXRlKDB4RjEpKQorCQkJCQkJZ290byBmYWlsdXJlOworCQkJCQlpZiAoIW1hdWlfd3JpdGUoJ1MnKSkKKwkJCQkJCWdvdG8gZmFpbHVyZTsKKwkJCQl9IGVsc2UgeworCQkJCQlpZiAoIW1hdWlfd3JpdGUobWF1aV9vc1tpXSkpCisJCQkJCQlnb3RvIGZhaWx1cmU7CisJCQkJfQorCisJCQkJaWYgKGVvbF9zZWVuKSB7CisJCQkJCWludCBjID0gMDsKKwkJCQkJaW50IG47CisKKwkJCQkJZW9sX3NlZW4gPSAwOworCisJCQkJCWZvciAobiA9IDA7IG4gPCAyOyBuKyspIHsKKwkJCQkJCWlmIChtYXVpX3dhaXQoU1RBVF9SWF9BVkFJTCkpIHsKKwkJCQkJCQljID0gaW5iKEhPU1RfREFUQV9QT1JUKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoYyAhPSAweDgwKSB7CisJCQkJCQlwcmludGsoIkRvd25sb2FkIG5vdCBhY2tub3dsZWRnZWRcbiIpOworCQkJCQkJcmV0dXJuIDA7CisJCQkJCX0KKwkJCQkJZWxzZSBpZiAoIShsaW5lcysrICUgMTApKQorCQkJCQkJcHJpbnRrKCIuIik7CisKKwkJCQkJaWYgKGRvbmUpIHsKKwkJCQkJCXByaW50aygiXG4iKTsKKwkJCQkJCXByaW50ayhLRVJOX0lORk8gIkRvd25sb2FkIGNvbXBsZXRlXG4iKTsKKwkJCQkJCXJldHVybiAxOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisJfQorCitmYWlsdXJlOgorCXByaW50aygiXG4iKTsKKwlwcmludGsoS0VSTl9FUlIgIkRvd25sb2FkIGZhaWxlZCEhIVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1hdWlfaW5pdChpbnQgaXJxKQoreworCXVuc2lnbmVkIGNoYXIgYml0czsKKworCXN3aXRjaCAoaXJxKSB7CisJCWNhc2UgOToKKwkJCWJpdHMgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWJpdHMgPSAweDA4OworCQkJYnJlYWs7CisJCWNhc2UgMTI6CisJCQliaXRzID0gMHgxMDsKKwkJCWJyZWFrOworCQljYXNlIDE1OgorCQkJYml0cyA9IDB4MTg7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJNYXVpOiBJbnZhbGlkIElSUSAlZFxuIiwgaXJxKTsKKwkJCXJldHVybiAwOworCX0KKwlvdXRiKCgweDAwKSwgSE9TVF9DVFJMX1BPUlQpOwkvKiBSZXNldCAqLworCW91dGIoKGJpdHMpLCBIT1NUX0RBVEFfUE9SVCk7CS8qIFNldCB0aGUgSVJRIGJpdHMgKi8KKwlvdXRiKChiaXRzIHwgMHg4MCksIEhPU1RfREFUQV9QT1JUKTsJLyogU2V0IHRoZSBJUlEgYml0cyBhZ2Fpbj8gKi8KKwlvdXRiKCgweDgwKSwgSE9TVF9DVFJMX1BPUlQpOwkvKiBMZWF2ZSByZXNldCAqLworCW91dGIoKDB4ODApLCBIT1NUX0NUUkxfUE9SVCk7CS8qIExlYXZlIHJlc2V0ICovCisJb3V0YigoMHhEMCksIEhPU1RfQ1RSTF9QT1JUKTsJLyogQ2F1c2UgaW50ZXJydXB0ICovCisKKyNpZmRlZiBDT05GSUdfU01QCisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMDsgaSA8IDEwMDAwMDAgJiYgIWlycV9vazsgaSsrKQorCQkJOworCQlpZiAoIWlycV9vaykKKwkJCXJldHVybiAwOworCX0KKyNlbmRpZgorCW91dGIoKDB4ODApLCBIT1NUX0NUUkxfUE9SVCk7CS8qIExlYXZlIHJlc2V0ICovCisKKwlwcmludGsoS0VSTl9JTkZPICJUdXJ0bGUgQmVhY2ggTWF1aSBpbml0aWFsaXphdGlvblxuIik7CisKKwlpZiAoIWRvd25sb2FkX2NvZGUoKSkKKwkJcmV0dXJuIDA7CisKKwlvdXRiKCgweEUwKSwgSE9TVF9DVFJMX1BPUlQpOwkvKiBOb3JtYWwgb3BlcmF0aW9uICovCisKKwkvKiBTZWxlY3QgbXB1NDAxIG1vZGUgKi8KKworCW1hdWlfd3JpdGUoMHhmMCk7CisJbWF1aV93cml0ZSgxKTsKKwlpZiAobWF1aV9yZWFkKCkgIT0gMHg4MCkgeworCQltYXVpX3dyaXRlKDB4ZjApOworCQltYXVpX3dyaXRlKDEpOworCQlpZiAobWF1aV9yZWFkKCkgIT0gMHg4MCkKKwkJCXByaW50ayhLRVJOX0VSUiAiTWF1aSBkaWRuJ3QgYWNrbm93bGVkZ2Ugc2V0IEhXIG1vZGUgY29tbWFuZFxuIik7CisJfQorCXByaW50ayhLRVJOX0lORk8gIk1hdWkgaW5pdGlhbGl6ZWQgT0tcbiIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1hdWlfc2hvcnRfd2FpdChpbnQgbWFzaykgeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQlpZiAoaW5iKEhPU1RfU1RBVF9QT1JUKSAmIG1hc2spIHsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG1hdWlfbG9hZF9wYXRjaChpbnQgZGV2LCBpbnQgZm9ybWF0LCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwKKwkJaW50IG9mZnMsIGludCBjb3VudCwgaW50IHBtZ3JfZmxhZykKK3sKKworCXN0cnVjdCBzeXNleF9pbmZvIGhlYWRlcjsKKwl1bnNpZ25lZCBsb25nIGxlZnQsIHNyY19vZmZzOworCWludCBoZHJfc2l6ZSA9ICh1bnNpZ25lZCBsb25nKSAmaGVhZGVyLmRhdGFbMF0gLSAodW5zaWduZWQgbG9uZykgJmhlYWRlcjsKKwlpbnQgaTsKKworCWlmIChmb3JtYXQgPT0gU1lTRVhfUEFUQ0gpCS8qIEhhbmRsZWQgYnkgbWlkaV9zeW50aC5jICovCisJCXJldHVybiBvcmlnX2xvYWRfcGF0Y2goZGV2LCBmb3JtYXQsIGFkZHIsIG9mZnMsIGNvdW50LCBwbWdyX2ZsYWcpOworCisJaWYgKGZvcm1hdCAhPSBNQVVJX1BBVENIKQorCXsKKwkJICBwcmludGsoS0VSTl9XQVJOSU5HICJNYXVpOiBVbmtub3duIHBhdGNoIGZvcm1hdFxuIik7CisJfQorCWlmIChjb3VudCA8IGhkcl9zaXplKSB7CisvKgkJICBwcmludGsoIk1hdWkgZXJyb3I6IFBhdGNoIGhlYWRlciB0b28gc2hvcnRcbiIpOyovCisJCSAgcmV0dXJuIC1FSU5WQUw7CisJfQorCWNvdW50IC09IGhkcl9zaXplOworCisJLyoKKwkgKiBDb3B5IHRoZSBoZWFkZXIgZnJvbSB1c2VyIHNwYWNlIGJ1dCBpZ25vcmUgdGhlIGZpcnN0IGJ5dGVzIHdoaWNoIGhhdmUKKwkgKiBiZWVuIHRyYW5zZmVycmVkIGFscmVhZHkuCisJICovCisKKwlpZihjb3B5X2Zyb21fdXNlcigmKChjaGFyICopICZoZWFkZXIpW29mZnNdLCAmKGFkZHIpW29mZnNdLCBoZHJfc2l6ZSAtIG9mZnMpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmIChjb3VudCA8IGhlYWRlci5sZW4pIHsKKwkJICBwcmludGsoS0VSTl9FUlIgIk1hdWkgd2FybmluZzogSG9zdCBjb21tYW5kIHJlY29yZCB0b28gc2hvcnQgKCVkPCVkKVxuIiwgY291bnQsIChpbnQpIGhlYWRlci5sZW4pOworCQkgIGhlYWRlci5sZW4gPSBjb3VudDsKKwl9CisJbGVmdCA9IGhlYWRlci5sZW47CisJc3JjX29mZnMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGxlZnQ7IGkrKykgeworCQl1bnNpZ25lZCBjaGFyICAgZGF0YTsKKworCQlpZihnZXRfdXNlcigqKHVuc2lnbmVkIGNoYXIgKikgJmRhdGEsICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKSAmKChhZGRyKVtoZHJfc2l6ZSArIGldKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGkgPT0gMCAmJiAhKGRhdGEgJiAweDgwKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmIChtYXVpX3dyaXRlKGRhdGEpID09IC0xKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJaWYgKChpID0gbWF1aV9yZWFkKCkpICE9IDB4ODApIHsKKwkJaWYgKGkgIT0gLTEpCisJCQlwcmludGsoIk1hdWk6IEVycm9yIHN0YXR1cyAlMDJ4XG4iLCBpKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV9tYXVpKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCWludCB0aGlzX2RldjsKKwlpbnQgaTsKKwlpbnQgdG1wMSwgdG1wMiwgcmV0OworCisJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIsICJtcHU0MDEiKTsKKwlpZiAoIXBvcnRzKQorCQlyZXR1cm4gMDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlICsgMiwgNiwgIk1hdWkiKSkKKwkJZ290byBvdXQ7CisKKwltYXVpX2Jhc2UgPSBod19jb25maWctPmlvX2Jhc2U7CisJbWF1aV9vc3AgPSBod19jb25maWctPm9zcDsKKworCWlmIChyZXF1ZXN0X2lycShod19jb25maWctPmlycSwgbWF1aWludHIsIDAsICJNYXVpIiwgTlVMTCkgPCAwKQorCQlnb3RvIG91dDI7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHByb2Nlc3NvciBpZiBuZWNlc3NhcnkKKwkgKi8KKworCWlmIChtYXVpX29zTGVuID4gMCkgeworCQlpZiAoIShpbmIoSE9TVF9TVEFUX1BPUlQpICYgU1RBVF9UWF9BVkFJTCkgfHwKKwkJCSFtYXVpX3dyaXRlKDB4OUYpIHx8CS8qIFJlcG9ydCBmaXJtd2FyZSB2ZXJzaW9uICovCisJCQkhbWF1aV9zaG9ydF93YWl0KFNUQVRfUlhfQVZBSUwpIHx8CisJCQltYXVpX3JlYWQoKSA9PSAtMSB8fCBtYXVpX3JlYWQoKSA9PSAtMSkKKwkJCWlmICghbWF1aV9pbml0KGh3X2NvbmZpZy0+aXJxKSkKKwkJCQlnb3RvIG91dDM7CisJfQorCWlmICghbWF1aV93cml0ZSgweENGKSkJLyogUmVwb3J0IGhhcmR3YXJlIHZlcnNpb24gKi8geworCQlwcmludGsoS0VSTl9FUlIgIk5vIFdhdmVGcm9udCBmaXJtd2FyZSBkZXRlY3RlZCAoY2FyZCB1bmluaXRpYWxpemVkPylcbiIpOworCQlnb3RvIG91dDM7CisJfQorCWlmICgodG1wMSA9IG1hdWlfcmVhZCgpKSA9PSAtMSB8fCAodG1wMiA9IG1hdWlfcmVhZCgpKSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9FUlIgIk5vIFdhdmVGcm9udCBmaXJtd2FyZSBkZXRlY3RlZCAoY2FyZCB1bmluaXRpYWxpemVkPylcbiIpOworCQlnb3RvIG91dDM7CisJfQorCWlmICh0bXAxID09IDB4ZmYgfHwgdG1wMiA9PSAweGZmKQorCQlnb3RvIG91dDM7CisJcHJpbnRrKEtFUk5fREVCVUcgIldhdmVGcm9udCBoYXJkd2FyZSB2ZXJzaW9uICVkLiVkXG4iLCB0bXAxLCB0bXAyKTsKKworCWlmICghbWF1aV93cml0ZSgweDlGKSkJLyogUmVwb3J0IGZpcm13YXJlIHZlcnNpb24gKi8KKwkJZ290byBvdXQzOworCWlmICgodG1wMSA9IG1hdWlfcmVhZCgpKSA9PSAtMSB8fCAodG1wMiA9IG1hdWlfcmVhZCgpKSA9PSAtMSkKKwkJZ290byBvdXQzOworCisJcHJpbnRrKEtFUk5fREVCVUcgIldhdmVGcm9udCBmaXJtd2FyZSB2ZXJzaW9uICVkLiVkXG4iLCB0bXAxLCB0bXAyKTsKKworCWlmICghbWF1aV93cml0ZSgweDg1KSkJLyogUmVwb3J0IGZyZWUgRFJBTSAqLworCQlnb3RvIG91dDM7CisJdG1wMSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQl0bXAxIHw9IG1hdWlfcmVhZCgpIDw8ICg3ICogaSk7CisJfQorCXByaW50ayhLRVJOX0RFQlVHICJBdmFpbGFibGUgRFJBTSAlZGtcbiIsIHRtcDEgLyAxMDI0KTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDAwOyBpKyspCisJCWlmIChwcm9iZV9tcHU0MDEoaHdfY29uZmlnLCBwb3J0cykpCisJCQlicmVhazsKKworCXJldCA9IHByb2JlX21wdTQwMShod19jb25maWcsIHBvcnRzKTsKKwlpZiAoIXJldCkKKwkJZ290byBvdXQzOworCisJY29uZl9wcmludGYoIk1hdWkiLCBod19jb25maWcpOworCisJaHdfY29uZmlnLT5pcnEgKj0gLTE7CisJaHdfY29uZmlnLT5uYW1lID0gIk1hdWkiOworCWF0dGFjaF9tcHU0MDEoaHdfY29uZmlnLCBUSElTX01PRFVMRSk7CisKKwlpZiAoaHdfY29uZmlnLT5zbG90c1sxXSAhPSAtMSkJLyogVGhlIE1QVTQwMSBkcml2ZXIgaW5zdGFsbGVkIGl0c2VsZiAqLyB7CisJCXN0cnVjdCBzeW50aF9vcGVyYXRpb25zICpzeW50aDsKKworCQl0aGlzX2RldiA9IGh3X2NvbmZpZy0+c2xvdHNbMV07CisKKwkJLyoKKwkJICogSW50ZXJjZXB0IHBhdGNoIGxvYWRpbmcgY2FsbHMgc28gdGhhdCB0aGV5IGNhbiBiZSBoYW5kbGVkCisJCSAqIGJ5IHRoZSBNYXVpIGRyaXZlci4KKwkJICovCisKKwkJc3ludGggPSBtaWRpX2RldnNbdGhpc19kZXZdLT5jb252ZXJ0ZXI7CisJCWlmIChzeW50aCAhPSBOVUxMKSB7CisJCQlzeW50aC0+aWQgPSAiTUFVSSI7CisJCQlvcmlnX2xvYWRfcGF0Y2ggPSBzeW50aC0+bG9hZF9wYXRjaDsKKwkJCXN5bnRoLT5sb2FkX3BhdGNoID0gJm1hdWlfbG9hZF9wYXRjaDsKKwkJfSBlbHNlCisJCQlwcmludGsoS0VSTl9FUlIgIk1hdWk6IENhbid0IGluc3RhbGwgcGF0Y2ggbG9hZGVyXG4iKTsKKwl9CisJcmV0dXJuIDE7CisKK291dDM6CisJZnJlZV9pcnEoaHdfY29uZmlnLT5pcnEsIE5VTEwpOworb3V0MjoKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UgKyAyLCA2KTsKK291dDoKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX21hdWkoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWludCBpcnEgPSBod19jb25maWctPmlycTsKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UgKyAyLCA2KTsKKwl1bmxvYWRfbXB1NDAxKGh3X2NvbmZpZyk7CisKKwlpZiAoaXJxIDwgMCkKKwkJaXJxID0gLWlycTsKKwlpZiAoaXJxID4gMCkKKwkJZnJlZV9pcnEoaXJxLCBOVUxMKTsKK30KKworc3RhdGljIGludCBmd19sb2FkOworCitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmc7CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpbyA9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGlycSA9IC0xOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworCisvKgorICoJSW5zdGFsbCBhIE1hdWkgY2FyZC4gTmVlZHMgbXB1NDAxIGxvYWRlZCBhbHJlYWR5LgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfbWF1aSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlR1cnRsZSBiZWFjaCBNYXVpIGFuZCBUcm9wZXogZHJpdmVyLCBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk2XG4iKTsKKworCWNmZy5pb19iYXNlID0gaW87CisJY2ZnLmlycSA9IGlycTsKKworCWlmIChjZmcuaW9fYmFzZSA9PSAtMSB8fCBjZmcuaXJxID09IC0xKSB7CisJCXByaW50ayhLRVJOX0lORk8gIm1hdWk6IGlycSBhbmQgaW8gbXVzdCBiZSBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1hdWlfb3MgPT0gTlVMTCkgeworCQlmd19sb2FkID0gMTsKKwkJbWF1aV9vc0xlbiA9IG1vZF9maXJtd2FyZV9sb2FkKCIvZXRjL3NvdW5kL29zd2YubW90IiwgKGNoYXIgKiopICZtYXVpX29zKTsKKwl9CisJaWYgKHByb2JlX21hdWkoJmNmZykgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbWF1aSh2b2lkKQoreworCWlmIChmd19sb2FkICYmIG1hdWlfb3MpCisJCXZmcmVlKG1hdWlfb3MpOworCXVubG9hZF9tYXVpKCZjZmcpOworfQorCittb2R1bGVfaW5pdChpbml0X21hdWkpOworbW9kdWxlX2V4aXQoY2xlYW51cF9tYXVpKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX21hdWkoY2hhciAqc3RyKQoreworICAgICAgICAvKiBpbywgaXJxICovCisJaW50IGludHNbM107CisJCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKwkKKwlpbyA9IGludHNbMV07CisJaXJxID0gaW50c1syXTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJtYXVpPSIsIHNldHVwX21hdWkpOworI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbWlkaV9jdHJsLmggYi9zb3VuZC9vc3MvbWlkaV9jdHJsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1M2U1YQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9taWRpX2N0cmwuaApAQCAtMCwwICsxLDIyIEBACitzdGF0aWMgdW5zaWduZWQgY2hhciBjdHJsX2RlZl92YWx1ZXNbMTI4XSA9Cit7CisJMHg0MCwweDAwLDB4NDAsMHg0MCwgIDB4NDAsMHg0MCwweDQwLDB4N2YsCS8qICAgMCB0byAgIDcgKi8KKwkweDQwLDB4NDAsMHg0MCwweDdmLCAgMHg0MCwweDQwLDB4NDAsMHg0MCwJLyogICA4IHRvICAxNSAqLworCTB4NDAsMHg0MCwweDQwLDB4NDAsICAweDQwLDB4NDAsMHg0MCwweDQwLAkvKiAgMTYgdG8gIDIzICovCisJMHg0MCwweDQwLDB4NDAsMHg0MCwgIDB4NDAsMHg0MCwweDQwLDB4NDAsCS8qICAyNCB0byAgMzEgKi8KKworCTB4MDAsMHgwMCwweDAwLDB4MDAsICAweDAwLDB4MDAsMHgwMCwweDAwLAkvKiAgMzIgdG8gIDM5ICovCisJMHgwMCwweDAwLDB4MDAsMHgwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qICA0MCB0byAgNDcgKi8KKwkweDAwLDB4MDAsMHgwMCwweDAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogIDQ4IHRvICA1NSAqLworCTB4MDAsMHgwMCwweDAwLDB4MDAsICAweDAwLDB4MDAsMHgwMCwweDAwLAkvKiAgNTYgdG8gIDYzICovCisJCisJMHgwMCwweDAwLDB4MDAsMHgwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qICA2NCB0byAgNzEgKi8KKwkweDAwLDB4MDAsMHgwMCwweDAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogIDcyIHRvICA3OSAqLworCTB4MDAsMHgwMCwweDAwLDB4MDAsICAweDAwLDB4MDAsMHgwMCwweDAwLAkvKiAgODAgdG8gIDg3ICovCisJMHgwMCwweDAwLDB4MDAsMHgwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qICA4OCB0byAgOTUgKi8KKworCTB4MDAsMHgwMCwweDdmLDB4N2YsICAweDdmLDB4N2YsMHgwMCwweDAwLAkvKiAgOTYgdG8gMTAzICovCisJMHgwMCwweDAwLDB4MDAsMHgwMCwgIDB4MDAsMHgwMCwweDAwLDB4MDAsCS8qIDEwNCB0byAxMTEgKi8KKwkweDAwLDB4MDAsMHgwMCwweDAwLCAgMHgwMCwweDAwLDB4MDAsMHgwMCwJLyogMTEyIHRvIDExOSAqLworCTB4MDAsMHgwMCwweDAwLDB4MDAsICAweDAwLDB4MDAsMHgwMCwweDAwLAkvKiAxMjAgdG8gMTI3ICovCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21pZGlfc3ltcy5jIGIvc291bmQvb3NzL21pZGlfc3ltcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTQ2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbWlkaV9zeW1zLmMKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIEV4cG9ydGVkIHN5bWJvbHMgZm9yIG1pZGkgZHJpdmVyLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworY2hhciBtaWRpX3N5bXNfc3ltYm9sOworCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjZGVmaW5lIF9NSURJX1NZTlRIX0NfCisjaW5jbHVkZSAibWlkaV9zeW50aC5oIgorCitFWFBPUlRfU1lNQk9MKGRvX21pZGlfbXNnKTsKK0VYUE9SVF9TWU1CT0wobWlkaV9zeW50aF9vcGVuKTsKK0VYUE9SVF9TWU1CT0wobWlkaV9zeW50aF9jbG9zZSk7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfaW9jdGwpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX2tpbGxfbm90ZSk7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfc3RhcnRfbm90ZSk7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfc2V0X2luc3RyKTsKK0VYUE9SVF9TWU1CT0wobWlkaV9zeW50aF9yZXNldCk7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfaHdfY29udHJvbCk7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfYWZ0ZXJ0b3VjaCk7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfY29udHJvbGxlcik7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfcGFubmluZyk7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfc2V0dXBfdm9pY2UpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX3NlbmRfc3lzZXgpOworRVhQT1JUX1NZTUJPTChtaWRpX3N5bnRoX2JlbmRlcik7CitFWFBPUlRfU1lNQk9MKG1pZGlfc3ludGhfbG9hZF9wYXRjaCk7CitFWFBPUlRfU1lNQk9MKE1JRElidWZfYXZhaWwpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21pZGlfc3ludGguYyBiL3NvdW5kL29zcy9taWRpX3N5bnRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcyZWRjNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9taWRpX3N5bnRoLmMKQEAgLTAsMCArMSw2OTcgQEAKKy8qCisgKiBzb3VuZC9taWRpX3N5bnRoLmMKKyAqCisgKiBIaWdoIGxldmVsIG1pZGkgc2VxdWVuY2VyIG1hbmFnZXIgZm9yIGR1bWIgTUlESSBpbnRlcmZhY2VzLgorICovCisvKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKy8qCisgKiBUaG9tYXMgU2FpbGVyICAgOiBpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKiBBbmRyZXcgVmVsaWF0aCAgOiBmaXhlZCBydW5uaW5nIHN0YXR1cyBpbiBNSURJIGlucHV0IHN0YXRlIG1hY2hpbmUKKyAqLworI2RlZmluZSBVU0VfU0VRX01BQ1JPUworI2RlZmluZSBVU0VfU0lNUExFX01BQ1JPUworCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNkZWZpbmUgX01JRElfU1lOVEhfQ18KKworI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworc3RhdGljIGludCAgICAgIG1pZGkyc3ludGhbTUFYX01JRElfREVWXTsKK3N0YXRpYyBpbnQgICAgICBzeXNleF9zdGF0ZVtNQVhfTUlESV9ERVZdID0KK3swfTsKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHByZXZfb3V0X3N0YXR1c1tNQVhfTUlESV9ERVZdOworCisjZGVmaW5lIFNUT1JFKGNtZCkgXAoreyBcCisgIGludCBsZW47IFwKKyAgdW5zaWduZWQgY2hhciBvYnVmWzhdOyBcCisgIGNtZDsgXAorICBzZXFfaW5wdXRfZXZlbnQob2J1ZiwgbGVuKTsgXAorfQorCisjZGVmaW5lIF9zZXFidWYgb2J1ZgorI2RlZmluZSBfc2VxYnVmcHRyIDAKKyNkZWZpbmUgX1NFUV9BRFZCVUYoeCkgbGVuPXgKKwordm9pZAorZG9fbWlkaV9tc2coaW50IHN5bnRobm8sIHVuc2lnbmVkIGNoYXIgKm1zZywgaW50IG1sZW4pCit7CisJc3dpdGNoIChtc2dbMF0gJiAweGYwKQorCSAgeworCSAgY2FzZSAweDkwOgorCQkgIGlmIChtc2dbMl0gIT0gMCkKKwkJICAgIHsKKwkJCSAgICBTVE9SRShTRVFfU1RBUlRfTk9URShzeW50aG5vLCBtc2dbMF0gJiAweDBmLCBtc2dbMV0sIG1zZ1syXSkpOworCQkJICAgIGJyZWFrOworCQkgICAgfQorCQkgIG1zZ1syXSA9IDY0OworCisJICBjYXNlIDB4ODA6CisJCSAgU1RPUkUoU0VRX1NUT1BfTk9URShzeW50aG5vLCBtc2dbMF0gJiAweDBmLCBtc2dbMV0sIG1zZ1syXSkpOworCQkgIGJyZWFrOworCisJICBjYXNlIDB4QTA6CisJCSAgU1RPUkUoU0VRX0tFWV9QUkVTU1VSRShzeW50aG5vLCBtc2dbMF0gJiAweDBmLCBtc2dbMV0sIG1zZ1syXSkpOworCQkgIGJyZWFrOworCisJICBjYXNlIDB4QjA6CisJCSAgU1RPUkUoU0VRX0NPTlRST0woc3ludGhubywgbXNnWzBdICYgMHgwZiwKKwkJCQkgICAgbXNnWzFdLCBtc2dbMl0pKTsKKwkJICBicmVhazsKKworCSAgY2FzZSAweEMwOgorCQkgIFNUT1JFKFNFUV9TRVRfUEFUQ0goc3ludGhubywgbXNnWzBdICYgMHgwZiwgbXNnWzFdKSk7CisJCSAgYnJlYWs7CisKKwkgIGNhc2UgMHhEMDoKKwkJICBTVE9SRShTRVFfQ0hOX1BSRVNTVVJFKHN5bnRobm8sIG1zZ1swXSAmIDB4MGYsIG1zZ1sxXSkpOworCQkgIGJyZWFrOworCisJICBjYXNlIDB4RTA6CisJCSAgU1RPUkUoU0VRX0JFTkRFUihzeW50aG5vLCBtc2dbMF0gJiAweDBmLAorCQkJICAgICAgKG1zZ1sxXSAmIDB4N2YpIHwgKChtc2dbMl0gJiAweDdmKSA8PCA3KSkpOworCQkgIGJyZWFrOworCisJICBkZWZhdWx0OgorCQkgIC8qIHByaW50ayggIk1QVTogVW5rbm93biBtaWRpIGNoYW5uZWwgbWVzc2FnZSAlMDJ4XG4iLCAgbXNnWzBdKTsgKi8KKwkJICA7CisJICB9Cit9CisKK3N0YXRpYyB2b2lkCittaWRpX291dGMoaW50IG1pZGlfZGV2LCBpbnQgZGF0YSkKK3sKKwlpbnQgICAgICAgICAgICAgdGltZW91dDsKKworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCAzMjAwOyB0aW1lb3V0KyspCisJCWlmIChtaWRpX2RldnNbbWlkaV9kZXZdLT5vdXRwdXRjKG1pZGlfZGV2LCAodW5zaWduZWQgY2hhcikgKGRhdGEgJiAweGZmKSkpCisJCSAgeworCQkJICBpZiAoZGF0YSAmIDB4ODApCS8qCisJCQkJCQkgKiBTdGF0dXMgYnl0ZQorCQkJCQkJICovCisJCQkJICBwcmV2X291dF9zdGF0dXNbbWlkaV9kZXZdID0KKwkJCQkgICAgICAodW5zaWduZWQgY2hhcikgKGRhdGEgJiAweGZmKTsJLyoKKwkJCQkJCQkJCSAqIFN0b3JlIGZvciBydW5uaW5nIHN0YXR1cworCQkJCQkJCQkJICovCisJCQkgIHJldHVybjsJLyoKKwkJCQkJICogTWlzc2lvbiBjb21wbGV0ZQorCQkJCQkgKi8KKwkJICB9CisJLyoKKwkgKiBTb3JyeSEgTm8gc3BhY2Ugb24gYnVmZmVycy4KKwkgKi8KKwlwcmludGsoIk1pZGkgc2VuZCB0aW1lZCBvdXRcbiIpOworfQorCitzdGF0aWMgaW50CitwcmVmaXhfY21kKGludCBtaWRpX2RldiwgdW5zaWduZWQgY2hhciBzdGF0dXMpCit7CisJaWYgKChjaGFyICopIG1pZGlfZGV2c1ttaWRpX2Rldl0tPnByZWZpeF9jbWQgPT0gTlVMTCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gbWlkaV9kZXZzW21pZGlfZGV2XS0+cHJlZml4X2NtZChtaWRpX2Rldiwgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQKK21pZGlfc3ludGhfaW5wdXQoaW50IG9yaWdfZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJaW50ICAgICAgICAgICAgIGRldjsKKwlzdHJ1Y3QgbWlkaV9pbnB1dF9pbmZvICppbmM7CisKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBsZW5fdGFiW10gPQkvKiAjIG9mIGRhdGEgYnl0ZXMgZm9sbG93aW5nIGEgc3RhdHVzCisJCQkJCQkgKi8KKwl7CisJCTIsCQkvKiA4eCAqLworCQkyLAkJLyogOXggKi8KKwkJMiwJCS8qIEF4ICovCisJCTIsCQkvKiBCeCAqLworCQkxLAkJLyogQ3ggKi8KKwkJMSwJCS8qIER4ICovCisJCTIsCQkvKiBFeCAqLworCQkwCQkvKiBGeCAqLworCX07CisKKwlpZiAob3JpZ19kZXYgPCAwIHx8IG9yaWdfZGV2ID4gbnVtX21pZGlzIHx8IG1pZGlfZGV2c1tvcmlnX2Rldl0gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGRhdGEgPT0gMHhmZSkJLyogSWdub3JlIGFjdGl2ZSBzZW5zaW5nICovCisJCXJldHVybjsKKworCWRldiA9IG1pZGkyc3ludGhbb3JpZ19kZXZdOworCWluYyA9ICZtaWRpX2RldnNbb3JpZ19kZXZdLT5pbl9pbmZvOworCisJc3dpdGNoIChpbmMtPm1fc3RhdGUpCisJICB7CisJICBjYXNlIE1TVF9JTklUOgorCQkgIGlmIChkYXRhICYgMHg4MCkJLyogTUlESSBzdGF0dXMgYnl0ZSAqLworCQkgICAgeworCQkJICAgIGlmICgoZGF0YSAmIDB4ZjApID09IDB4ZjApCS8qIENvbW1vbiBtZXNzYWdlICovCisJCQkgICAgICB7CisJCQkJICAgICAgc3dpdGNoIChkYXRhKQorCQkJCQl7CisJCQkJCWNhc2UgMHhmMDoJLyogU3lzZXggKi8KKwkJCQkJCWluYy0+bV9zdGF0ZSA9IE1TVF9TWVNFWDsKKwkJCQkJCWJyZWFrOwkvKiBTeXNleCAqLworCisJCQkJCWNhc2UgMHhmMToJLyogTVRDIHF1YXJ0ZXIgZnJhbWUgKi8KKwkJCQkJY2FzZSAweGYzOgkvKiBTb25nIHNlbGVjdCAqLworCQkJCQkJaW5jLT5tX3N0YXRlID0gTVNUX0RBVEE7CisJCQkJCQlpbmMtPm1fcHRyID0gMTsKKwkJCQkJCWluYy0+bV9sZWZ0ID0gMTsKKwkJCQkJCWluYy0+bV9idWZbMF0gPSBkYXRhOworCQkJCQkJYnJlYWs7CisKKwkJCQkJY2FzZSAweGYyOgkvKiBTb25nIHBvc2l0aW9uIHBvaW50ZXIgKi8KKwkJCQkJCWluYy0+bV9zdGF0ZSA9IE1TVF9EQVRBOworCQkJCQkJaW5jLT5tX3B0ciA9IDE7CisJCQkJCQlpbmMtPm1fbGVmdCA9IDI7CisJCQkJCQlpbmMtPm1fYnVmWzBdID0gZGF0YTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWRlZmF1bHQ6CisJCQkJCQlpbmMtPm1fYnVmWzBdID0gZGF0YTsKKwkJCQkJCWluYy0+bV9wdHIgPSAxOworCQkJCQkJZG9fbWlkaV9tc2coZGV2LCBpbmMtPm1fYnVmLCBpbmMtPm1fcHRyKTsKKwkJCQkJCWluYy0+bV9wdHIgPSAwOworCQkJCQkJaW5jLT5tX2xlZnQgPSAwOworCQkJCQl9CisJCQkgICAgfSBlbHNlCisJCQkgICAgICB7CisJCQkJICAgICAgaW5jLT5tX3N0YXRlID0gTVNUX0RBVEE7CisJCQkJICAgICAgaW5jLT5tX3B0ciA9IDE7CisJCQkJICAgICAgaW5jLT5tX2xlZnQgPSBsZW5fdGFiWyhkYXRhID4+IDQpIC0gOF07CisJCQkJICAgICAgaW5jLT5tX2J1ZlswXSA9IGluYy0+bV9wcmV2X3N0YXR1cyA9IGRhdGE7CisJCQkgICAgICB9CisJCSAgICB9IGVsc2UgaWYgKGluYy0+bV9wcmV2X3N0YXR1cyAmIDB4ODApIHsKKwkJCSAgICAvKiBEYXRhIGJ5dGUgKHVzZSBydW5uaW5nIHN0YXR1cykgKi8KKwkJCSAgICBpbmMtPm1fcHRyID0gMjsKKwkJCSAgICBpbmMtPm1fYnVmWzFdID0gZGF0YTsKKwkJCSAgICBpbmMtPm1fYnVmWzBdID0gaW5jLT5tX3ByZXZfc3RhdHVzOworCQkJICAgIGluYy0+bV9sZWZ0ID0gbGVuX3RhYlsoaW5jLT5tX2J1ZlswXSA+PiA0KSAtIDhdIC0gMTsKKwkJCSAgICBpZiAoaW5jLT5tX2xlZnQgPiAwKQorCQkJCSAgICBpbmMtPm1fc3RhdGUgPSBNU1RfREFUQTsgLyogTm90IGRvbmUgeWV0ICovCisJCQkgICAgZWxzZSB7CisJCQkJICAgIGluYy0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJCSAgICBkb19taWRpX21zZyhkZXYsIGluYy0+bV9idWYsIGluYy0+bV9wdHIpOworCQkJCSAgICBpbmMtPm1fcHRyID0gMDsKKwkJCSAgICB9CisJCSAgICB9CisJCSAgYnJlYWs7CS8qIE1TVF9JTklUICovCisKKwkgIGNhc2UgTVNUX0RBVEE6CisJCSAgaW5jLT5tX2J1ZltpbmMtPm1fcHRyKytdID0gZGF0YTsKKwkJICBpZiAoLS1pbmMtPm1fbGVmdCA8PSAwKQorCQkgICAgeworCQkJICAgIGluYy0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJICAgIGRvX21pZGlfbXNnKGRldiwgaW5jLT5tX2J1ZiwgaW5jLT5tX3B0cik7CisJCQkgICAgaW5jLT5tX3B0ciA9IDA7CisJCSAgICB9CisJCSAgYnJlYWs7CS8qIE1TVF9EQVRBICovCisKKwkgIGNhc2UgTVNUX1NZU0VYOgorCQkgIGlmIChkYXRhID09IDB4ZjcpCS8qIFN5c2V4IGVuZCAqLworCQkgICAgeworCQkJICAgIGluYy0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJICAgIGluYy0+bV9sZWZ0ID0gMDsKKwkJCSAgICBpbmMtPm1fcHRyID0gMDsKKwkJICAgIH0KKwkJICBicmVhazsJLyogTVNUX1NZU0VYICovCisKKwkgIGRlZmF1bHQ6CisJCSAgcHJpbnRrKCJNSURJJWQ6IFVuZXhwZWN0ZWQgc3RhdGUgJWQgKCUwMngpXG4iLCBvcmlnX2RldiwgaW5jLT5tX3N0YXRlLCAoaW50KSBkYXRhKTsKKwkJICBpbmMtPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkgIH0KK30KKworc3RhdGljIHZvaWQKK2xlYXZlX3N5c2V4KGludCBkZXYpCit7CisJaW50ICAgICAgICAgICAgIG9yaWdfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKwlpbnQgICAgICAgICAgICAgdGltZW91dCA9IDA7CisKKwlpZiAoIXN5c2V4X3N0YXRlW2Rldl0pCisJCXJldHVybjsKKworCXN5c2V4X3N0YXRlW2Rldl0gPSAwOworCisJd2hpbGUgKCFtaWRpX2RldnNbb3JpZ19kZXZdLT5vdXRwdXRjKG9yaWdfZGV2LCAweGY3KSAmJgorCSAgICAgICB0aW1lb3V0IDwgMTAwMCkKKwkJdGltZW91dCsrOworCisJc3lzZXhfc3RhdGVbZGV2XSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCittaWRpX3N5bnRoX291dHB1dChpbnQgZGV2KQoreworCS8qCisJICogQ3VycmVudGx5IE5PUAorCSAqLworfQorCitpbnQgbWlkaV9zeW50aF9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCS8qCisJICogaW50IG9yaWdfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKwkgKi8KKworCXN3aXRjaCAoY21kKSB7CisKKwljYXNlIFNORENUTF9TWU5USF9JTkZPOgorCQlpZiAoX19jb3B5X3RvX3VzZXIoYXJnLCBzeW50aF9kZXZzW2Rldl0tPmluZm8sIHNpemVvZihzdHJ1Y3Qgc3ludGhfaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCQkKKwljYXNlIFNORENUTF9TWU5USF9NRU1BVkw6CisJCXJldHVybiAweDdmZmZmZmZmOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorfQorCitpbnQKK21pZGlfc3ludGhfa2lsbF9ub3RlKGludCBkZXYsIGludCBjaGFubmVsLCBpbnQgbm90ZSwgaW50IHZlbG9jaXR5KQoreworCWludCAgICAgICAgICAgICBvcmlnX2RldiA9IHN5bnRoX2RldnNbZGV2XS0+bWlkaV9kZXY7CisJaW50ICAgICAgICAgICAgIG1zZywgY2huOworCisJaWYgKG5vdGUgPCAwIHx8IG5vdGUgPiAxMjcpCisJCXJldHVybiAwOworCWlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID4gMTUpCisJCXJldHVybiAwOworCWlmICh2ZWxvY2l0eSA8IDApCisJCXZlbG9jaXR5ID0gMDsKKwlpZiAodmVsb2NpdHkgPiAxMjcpCisJCXZlbG9jaXR5ID0gMTI3OworCisJbGVhdmVfc3lzZXgoZGV2KTsKKworCW1zZyA9IHByZXZfb3V0X3N0YXR1c1tvcmlnX2Rldl0gJiAweGYwOworCWNobiA9IHByZXZfb3V0X3N0YXR1c1tvcmlnX2Rldl0gJiAweDBmOworCisJaWYgKGNobiA9PSBjaGFubmVsICYmICgobXNnID09IDB4OTAgJiYgdmVsb2NpdHkgPT0gNjQpIHx8IG1zZyA9PSAweDgwKSkKKwkgIHsJCQkvKgorCQkJCSAqIFVzZSBydW5uaW5nIHN0YXR1cworCQkJCSAqLworCQkgIGlmICghcHJlZml4X2NtZChvcmlnX2Rldiwgbm90ZSkpCisJCQkgIHJldHVybiAwOworCisJCSAgbWlkaV9vdXRjKG9yaWdfZGV2LCBub3RlKTsKKworCQkgIGlmIChtc2cgPT0gMHg5MCkJLyoKKwkJCQkJICogUnVubmluZyBzdGF0dXMgPSBOb3RlIG9uCisJCQkJCSAqLworCQkJICBtaWRpX291dGMob3JpZ19kZXYsIDApOwkvKgorCQkJCQkJCSAgICogTm90ZSBvbiB3aXRoIHZlbG9jaXR5IDAgPT0gbm90ZQorCQkJCQkJCSAgICogb2ZmCisJCQkJCQkJICovCisJCSAgZWxzZQorCQkJICBtaWRpX291dGMob3JpZ19kZXYsIHZlbG9jaXR5KTsKKwl9IGVsc2UKKwkgIHsKKwkJICBpZiAodmVsb2NpdHkgPT0gNjQpCisJCSAgICB7CisJCQkgICAgaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCAweDkwIHwgKGNoYW5uZWwgJiAweDBmKSkpCisJCQkJICAgIHJldHVybiAwOworCQkJICAgIG1pZGlfb3V0YyhvcmlnX2RldiwgMHg5MCB8IChjaGFubmVsICYgMHgwZikpOwkvKgorCQkJCQkJCQkJCSAqIE5vdGUgb24KKwkJCQkJCQkJCQkgKi8KKwkJCSAgICBtaWRpX291dGMob3JpZ19kZXYsIG5vdGUpOworCQkJICAgIG1pZGlfb3V0YyhvcmlnX2RldiwgMCk7CS8qCisJCQkJCQkJICogWmVybyBHCisJCQkJCQkJICovCisJCSAgfSBlbHNlCisJCSAgICB7CisJCQkgICAgaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCAweDgwIHwgKGNoYW5uZWwgJiAweDBmKSkpCisJCQkJICAgIHJldHVybiAwOworCQkJICAgIG1pZGlfb3V0YyhvcmlnX2RldiwgMHg4MCB8IChjaGFubmVsICYgMHgwZikpOwkvKgorCQkJCQkJCQkJCSAqIE5vdGUgb2ZmCisJCQkJCQkJCQkJICovCisJCQkgICAgbWlkaV9vdXRjKG9yaWdfZGV2LCBub3RlKTsKKwkJCSAgICBtaWRpX291dGMob3JpZ19kZXYsIHZlbG9jaXR5KTsKKwkJICAgIH0KKwkgIH0KKworCXJldHVybiAwOworfQorCitpbnQKK21pZGlfc3ludGhfc2V0X2luc3RyKGludCBkZXYsIGludCBjaGFubmVsLCBpbnQgaW5zdHJfbm8pCit7CisJaW50ICAgICAgICAgICAgIG9yaWdfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKworCWlmIChpbnN0cl9ubyA8IDAgfHwgaW5zdHJfbm8gPiAxMjcpCisJCWluc3RyX25vID0gMDsKKwlpZiAoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+IDE1KQorCQlyZXR1cm4gMDsKKworCWxlYXZlX3N5c2V4KGRldik7CisKKwlpZiAoIXByZWZpeF9jbWQob3JpZ19kZXYsIDB4YzAgfCAoY2hhbm5lbCAmIDB4MGYpKSkKKwkJcmV0dXJuIDA7CisJbWlkaV9vdXRjKG9yaWdfZGV2LCAweGMwIHwgKGNoYW5uZWwgJiAweDBmKSk7CS8qCisJCQkJCQkJICogUHJvZ3JhbSBjaGFuZ2UKKwkJCQkJCQkgKi8KKwltaWRpX291dGMob3JpZ19kZXYsIGluc3RyX25vKTsKKworCXJldHVybiAwOworfQorCitpbnQKK21pZGlfc3ludGhfc3RhcnRfbm90ZShpbnQgZGV2LCBpbnQgY2hhbm5lbCwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSkKK3sKKwlpbnQgICAgICAgICAgICAgb3JpZ19kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCWludCAgICAgICAgICAgICBtc2csIGNobjsKKworCWlmIChub3RlIDwgMCB8fCBub3RlID4gMTI3KQorCQlyZXR1cm4gMDsKKwlpZiAoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+IDE1KQorCQlyZXR1cm4gMDsKKwlpZiAodmVsb2NpdHkgPCAwKQorCQl2ZWxvY2l0eSA9IDA7CisJaWYgKHZlbG9jaXR5ID4gMTI3KQorCQl2ZWxvY2l0eSA9IDEyNzsKKworCWxlYXZlX3N5c2V4KGRldik7CisKKwltc2cgPSBwcmV2X291dF9zdGF0dXNbb3JpZ19kZXZdICYgMHhmMDsKKwljaG4gPSBwcmV2X291dF9zdGF0dXNbb3JpZ19kZXZdICYgMHgwZjsKKworCWlmIChjaG4gPT0gY2hhbm5lbCAmJiBtc2cgPT0gMHg5MCkKKwkgIHsJCQkvKgorCQkJCSAqIFVzZSBydW5uaW5nIHN0YXR1cworCQkJCSAqLworCQkgIGlmICghcHJlZml4X2NtZChvcmlnX2Rldiwgbm90ZSkpCisJCQkgIHJldHVybiAwOworCQkgIG1pZGlfb3V0YyhvcmlnX2Rldiwgbm90ZSk7CisJCSAgbWlkaV9vdXRjKG9yaWdfZGV2LCB2ZWxvY2l0eSk7CisJfSBlbHNlCisJICB7CisJCSAgaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCAweDkwIHwgKGNoYW5uZWwgJiAweDBmKSkpCisJCQkgIHJldHVybiAwOworCQkgIG1pZGlfb3V0YyhvcmlnX2RldiwgMHg5MCB8IChjaGFubmVsICYgMHgwZikpOwkJLyoKKwkJCQkJCQkJCSAqIE5vdGUgb24KKwkJCQkJCQkJCSAqLworCQkgIG1pZGlfb3V0YyhvcmlnX2Rldiwgbm90ZSk7CisJCSAgbWlkaV9vdXRjKG9yaWdfZGV2LCB2ZWxvY2l0eSk7CisJICB9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQKK21pZGlfc3ludGhfcmVzZXQoaW50IGRldikKK3sKKworCWxlYXZlX3N5c2V4KGRldik7Cit9CisKK2ludAorbWlkaV9zeW50aF9vcGVuKGludCBkZXYsIGludCBtb2RlKQoreworCWludCAgICAgICAgICAgICBvcmlnX2RldiA9IHN5bnRoX2RldnNbZGV2XS0+bWlkaV9kZXY7CisJaW50ICAgICAgICAgICAgIGVycjsKKwlzdHJ1Y3QgbWlkaV9pbnB1dF9pbmZvICppbmM7CisKKwlpZiAob3JpZ19kZXYgPCAwIHx8IG9yaWdfZGV2ID4gbnVtX21pZGlzIHx8IG1pZGlfZGV2c1tvcmlnX2Rldl0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCW1pZGkyc3ludGhbb3JpZ19kZXZdID0gZGV2OworCXN5c2V4X3N0YXRlW2Rldl0gPSAwOworCXByZXZfb3V0X3N0YXR1c1tvcmlnX2Rldl0gPSAwOworCisJaWYgKChlcnIgPSBtaWRpX2RldnNbb3JpZ19kZXZdLT5vcGVuKG9yaWdfZGV2LCBtb2RlLAorCQkJICAgICAgIG1pZGlfc3ludGhfaW5wdXQsIG1pZGlfc3ludGhfb3V0cHV0KSkgPCAwKQorCQlyZXR1cm4gZXJyOworCWluYyA9ICZtaWRpX2RldnNbb3JpZ19kZXZdLT5pbl9pbmZvOworCisJLyogc2F2ZV9mbGFncyhmbGFncyk7CisJY2xpKCk7IAorCWRvbid0IGtub3cgYWdhaW5zdCB3aGF0IGlycWhhbmRsZXIgdG8gcHJvdGVjdCovCisJaW5jLT5tX2J1c3kgPSAwOworCWluYy0+bV9zdGF0ZSA9IE1TVF9JTklUOworCWluYy0+bV9wdHIgPSAwOworCWluYy0+bV9sZWZ0ID0gMDsKKwlpbmMtPm1fcHJldl9zdGF0dXMgPSAweDAwOworCS8qIHJlc3RvcmVfZmxhZ3MoZmxhZ3MpOyAqLworCisJcmV0dXJuIDE7Cit9CisKK3ZvaWQKK21pZGlfc3ludGhfY2xvc2UoaW50IGRldikKK3sKKwlpbnQgICAgICAgICAgICAgb3JpZ19kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCisJbGVhdmVfc3lzZXgoZGV2KTsKKworCS8qCisJICogU2h1dCB1cCB0aGUgc3ludGhzIGJ5IHNlbmRpbmcganVzdCBzaW5nbGUgYWN0aXZlIHNlbnNpbmcgbWVzc2FnZS4KKwkgKi8KKwltaWRpX2RldnNbb3JpZ19kZXZdLT5vdXRwdXRjKG9yaWdfZGV2LCAweGZlKTsKKworCW1pZGlfZGV2c1tvcmlnX2Rldl0tPmNsb3NlKG9yaWdfZGV2KTsKK30KKwordm9pZAorbWlkaV9zeW50aF9od19jb250cm9sKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KQoreworfQorCitpbnQKK21pZGlfc3ludGhfbG9hZF9wYXRjaChpbnQgZGV2LCBpbnQgZm9ybWF0LCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwKKwkJICAgICAgaW50IG9mZnMsIGludCBjb3VudCwgaW50IHBtZ3JfZmxhZykKK3sKKwlpbnQgICAgICAgICAgICAgb3JpZ19kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCisJc3RydWN0IHN5c2V4X2luZm8gc3lzZXg7CisJaW50ICAgICAgICAgICAgIGk7CisJdW5zaWduZWQgbG9uZyAgIGxlZnQsIHNyY19vZmZzLCBlb3hfc2VlbiA9IDA7CisJaW50ICAgICAgICAgICAgIGZpcnN0X2J5dGUgPSAxOworCWludCAgICAgICAgICAgICBoZHJfc2l6ZSA9ICh1bnNpZ25lZCBsb25nKSAmc3lzZXguZGF0YVswXSAtICh1bnNpZ25lZCBsb25nKSAmc3lzZXg7CisKKwlsZWF2ZV9zeXNleChkZXYpOworCisJaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCAweGYwKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZm9ybWF0ICE9IFNZU0VYX1BBVENIKQorCXsKKy8qCQkgIHByaW50aygiTUlESSBFcnJvcjogSW52YWxpZCBwYXRjaCBmb3JtYXQgKGtleSkgMHgleFxuIiwgZm9ybWF0KTsqLworCQkgIHJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoY291bnQgPCBoZHJfc2l6ZSkKKwl7CisvKgkJcHJpbnRrKCJNSURJIEVycm9yOiBQYXRjaCBoZWFkZXIgdG9vIHNob3J0XG4iKTsqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJY291bnQgLT0gaGRyX3NpemU7CisKKwkvKgorCSAqIENvcHkgdGhlIGhlYWRlciBmcm9tIHVzZXIgc3BhY2UgYnV0IGlnbm9yZSB0aGUgZmlyc3QgYnl0ZXMgd2hpY2ggaGF2ZQorCSAqIGJlZW4gdHJhbnNmZXJyZWQgYWxyZWFkeS4KKwkgKi8KKworCWlmKGNvcHlfZnJvbV91c2VyKCYoKGNoYXIgKikgJnN5c2V4KVtvZmZzXSwgJihhZGRyKVtvZmZzXSwgaGRyX3NpemUgLSBvZmZzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisgCisgCWlmIChjb3VudCA8IHN5c2V4LmxlbikKKwl7CisvKgkJcHJpbnRrKEtFUk5fV0FSTklORyAiTUlESSBXYXJuaW5nOiBTeXNleCByZWNvcmQgdG9vIHNob3J0ICglZDwlZClcbiIsIGNvdW50LCAoaW50KSBzeXNleC5sZW4pOyovCisJCXN5c2V4LmxlbiA9IGNvdW50OworCX0KKyAgCWxlZnQgPSBzeXNleC5sZW47CisgIAlzcmNfb2ZmcyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVmdCAmJiAhc2lnbmFsX3BlbmRpbmcoY3VycmVudCk7IGkrKykKKwl7CisJCXVuc2lnbmVkIGNoYXIgICBkYXRhOworCisJCWdldF91c2VyKCoodW5zaWduZWQgY2hhciAqKSAmZGF0YSwgKHVuc2lnbmVkIGNoYXIgX191c2VyICopICYoKGFkZHIpW2hkcl9zaXplICsgaV0pKTsKKworCQllb3hfc2VlbiA9IChpID4gMCAmJiBkYXRhICYgMHg4MCk7CS8qIEVuZCBvZiBzeXNleCAqLworCisJCWlmIChlb3hfc2VlbiAmJiBkYXRhICE9IDB4ZjcpCisJCQlkYXRhID0gMHhmNzsKKworCQlpZiAoaSA9PSAwKQorCQl7CisJCQlpZiAoZGF0YSAhPSAweGYwKQorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pZGlfc3ludGg6IFN5c2V4IHN0YXJ0IG1pc3NpbmdcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCXdoaWxlICghbWlkaV9kZXZzW29yaWdfZGV2XS0+b3V0cHV0YyhvcmlnX2RldiwgKHVuc2lnbmVkIGNoYXIpIChkYXRhICYgMHhmZikpICYmCisJCQkhc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlzY2hlZHVsZSgpOworCisJCWlmICghZmlyc3RfYnl0ZSAmJiBkYXRhICYgMHg4MCkKKwkJCXJldHVybiAwOworCQlmaXJzdF9ieXRlID0gMDsKKwl9CisKKwlpZiAoIWVveF9zZWVuKQorCQltaWRpX291dGMob3JpZ19kZXYsIDB4ZjcpOworCXJldHVybiAwOworfQorICAKK3ZvaWQgbWlkaV9zeW50aF9wYW5uaW5nKGludCBkZXYsIGludCBjaGFubmVsLCBpbnQgcHJlc3N1cmUpCit7Cit9CisgIAordm9pZCBtaWRpX3N5bnRoX2FmdGVydG91Y2goaW50IGRldiwgaW50IGNoYW5uZWwsIGludCBwcmVzc3VyZSkKK3sKKwlpbnQgICAgICAgICAgICAgb3JpZ19kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCWludCAgICAgICAgICAgICBtc2csIGNobjsKKworCWlmIChwcmVzc3VyZSA8IDAgfHwgcHJlc3N1cmUgPiAxMjcpCisJCXJldHVybjsKKwlpZiAoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+IDE1KQorCQlyZXR1cm47CisKKwlsZWF2ZV9zeXNleChkZXYpOworCisJbXNnID0gcHJldl9vdXRfc3RhdHVzW29yaWdfZGV2XSAmIDB4ZjA7CisJY2huID0gcHJldl9vdXRfc3RhdHVzW29yaWdfZGV2XSAmIDB4MGY7CisKKwlpZiAobXNnICE9IDB4ZDAgfHwgY2huICE9IGNoYW5uZWwpCS8qCisJCQkJCQkgKiBUZXN0IGZvciBydW5uaW5nIHN0YXR1cworCQkJCQkJICovCisJICB7CisJCSAgaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCAweGQwIHwgKGNoYW5uZWwgJiAweDBmKSkpCisJCQkgIHJldHVybjsKKwkJICBtaWRpX291dGMob3JpZ19kZXYsIDB4ZDAgfCAoY2hhbm5lbCAmIDB4MGYpKTsJCS8qCisJCQkJCQkJCQkgKiBDaGFubmVsIHByZXNzdXJlCisJCQkJCQkJCQkgKi8KKwl9IGVsc2UgaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCBwcmVzc3VyZSkpCisJCXJldHVybjsKKworCW1pZGlfb3V0YyhvcmlnX2RldiwgcHJlc3N1cmUpOworfQorCit2b2lkCittaWRpX3N5bnRoX2NvbnRyb2xsZXIoaW50IGRldiwgaW50IGNoYW5uZWwsIGludCBjdHJsX251bSwgaW50IHZhbHVlKQoreworCWludCAgICAgICAgICAgICBvcmlnX2RldiA9IHN5bnRoX2RldnNbZGV2XS0+bWlkaV9kZXY7CisJaW50ICAgICAgICAgICAgIGNobiwgbXNnOworCisJaWYgKGN0cmxfbnVtIDwgMCB8fCBjdHJsX251bSA+IDEyNykKKwkJcmV0dXJuOworCWlmIChjaGFubmVsIDwgMCB8fCBjaGFubmVsID4gMTUpCisJCXJldHVybjsKKworCWxlYXZlX3N5c2V4KGRldik7CisKKwltc2cgPSBwcmV2X291dF9zdGF0dXNbb3JpZ19kZXZdICYgMHhmMDsKKwljaG4gPSBwcmV2X291dF9zdGF0dXNbb3JpZ19kZXZdICYgMHgwZjsKKworCWlmIChtc2cgIT0gMHhiMCB8fCBjaG4gIT0gY2hhbm5lbCkKKwkgIHsKKwkJICBpZiAoIXByZWZpeF9jbWQob3JpZ19kZXYsIDB4YjAgfCAoY2hhbm5lbCAmIDB4MGYpKSkKKwkJCSAgcmV0dXJuOworCQkgIG1pZGlfb3V0YyhvcmlnX2RldiwgMHhiMCB8IChjaGFubmVsICYgMHgwZikpOworCX0gZWxzZSBpZiAoIXByZWZpeF9jbWQob3JpZ19kZXYsIGN0cmxfbnVtKSkKKwkJcmV0dXJuOworCisJbWlkaV9vdXRjKG9yaWdfZGV2LCBjdHJsX251bSk7CisJbWlkaV9vdXRjKG9yaWdfZGV2LCB2YWx1ZSAmIDB4N2YpOworfQorCit2b2lkCittaWRpX3N5bnRoX2JlbmRlcihpbnQgZGV2LCBpbnQgY2hhbm5lbCwgaW50IHZhbHVlKQoreworCWludCAgICAgICAgICAgICBvcmlnX2RldiA9IHN5bnRoX2RldnNbZGV2XS0+bWlkaV9kZXY7CisJaW50ICAgICAgICAgICAgIG1zZywgcHJldl9jaG47CisKKwlpZiAoY2hhbm5lbCA8IDAgfHwgY2hhbm5lbCA+IDE1KQorCQlyZXR1cm47CisKKwlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMTYzODMpCisJCXJldHVybjsKKworCWxlYXZlX3N5c2V4KGRldik7CisKKwltc2cgPSBwcmV2X291dF9zdGF0dXNbb3JpZ19kZXZdICYgMHhmMDsKKwlwcmV2X2NobiA9IHByZXZfb3V0X3N0YXR1c1tvcmlnX2Rldl0gJiAweDBmOworCisJaWYgKG1zZyAhPSAweGQwIHx8IHByZXZfY2huICE9IGNoYW5uZWwpCQkvKgorCQkJCQkJCSAqIFRlc3QgZm9yIHJ1bm5pbmcgc3RhdHVzCisJCQkJCQkJICovCisJICB7CisJCSAgaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCAweGUwIHwgKGNoYW5uZWwgJiAweDBmKSkpCisJCQkgIHJldHVybjsKKwkJICBtaWRpX291dGMob3JpZ19kZXYsIDB4ZTAgfCAoY2hhbm5lbCAmIDB4MGYpKTsKKwl9IGVsc2UgaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCB2YWx1ZSAmIDB4N2YpKQorCQlyZXR1cm47CisKKwltaWRpX291dGMob3JpZ19kZXYsIHZhbHVlICYgMHg3Zik7CisJbWlkaV9vdXRjKG9yaWdfZGV2LCAodmFsdWUgPj4gNykgJiAweDdmKTsKK30KKwordm9pZAorbWlkaV9zeW50aF9zZXR1cF92b2ljZShpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBjaGFubmVsKQoreworfQorCitpbnQKK21pZGlfc3ludGhfc2VuZF9zeXNleChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyICpieXRlcywgaW50IGxlbikKK3sKKwlpbnQgICAgICAgICAgICAgb3JpZ19kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCWludCAgICAgICAgICAgICBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCSAgeworCQkgIHN3aXRjaCAoYnl0ZXNbaV0pCisJCSAgICB7CisJCSAgICBjYXNlIDB4ZjA6CS8qIFN0YXJ0IHN5c2V4ICovCisJCQkgICAgaWYgKCFwcmVmaXhfY21kKG9yaWdfZGV2LCAweGYwKSkKKwkJCQkgICAgcmV0dXJuIDA7CisJCQkgICAgc3lzZXhfc3RhdGVbZGV2XSA9IDE7CisJCQkgICAgYnJlYWs7CisKKwkJICAgIGNhc2UgMHhmNzoJLyogRW5kIHN5c2V4ICovCisJCQkgICAgaWYgKCFzeXNleF9zdGF0ZVtkZXZdKQkvKiBPcnBoYW4gc3lzZXggZW5kICovCisJCQkJICAgIHJldHVybiAwOworCQkJICAgIHN5c2V4X3N0YXRlW2Rldl0gPSAwOworCQkJICAgIGJyZWFrOworCisJCSAgICBkZWZhdWx0OgorCQkJICAgIGlmICghc3lzZXhfc3RhdGVbZGV2XSkKKwkJCQkgICAgcmV0dXJuIDA7CisKKwkJCSAgICBpZiAoYnl0ZXNbaV0gJiAweDgwKQkvKiBFcnJvci4gQW5vdGhlciBtZXNzYWdlIGJlZm9yZSBzeXNleCBlbmQgKi8KKwkJCSAgICAgIHsKKwkJCQkgICAgICBieXRlc1tpXSA9IDB4Zjc7CS8qIFN5c2V4IGVuZCAqLworCQkJCSAgICAgIHN5c2V4X3N0YXRlW2Rldl0gPSAwOworCQkJICAgICAgfQorCQkgICAgfQorCisJCSAgaWYgKCFtaWRpX2RldnNbb3JpZ19kZXZdLT5vdXRwdXRjKG9yaWdfZGV2LCBieXRlc1tpXSkpCisJCSAgICB7CisvKgorICogSGFyZHdhcmUgbGV2ZWwgYnVmZmVyIGlzIGZ1bGwuIEFib3J0IHRoZSBzeXNleCBtZXNzYWdlLgorICovCisKKwkJCSAgICBpbnQgICAgICAgICAgICAgdGltZW91dCA9IDA7CisKKwkJCSAgICBieXRlc1tpXSA9IDB4Zjc7CisJCQkgICAgc3lzZXhfc3RhdGVbZGV2XSA9IDA7CisKKwkJCSAgICB3aGlsZSAoIW1pZGlfZGV2c1tvcmlnX2Rldl0tPm91dHB1dGMob3JpZ19kZXYsIGJ5dGVzW2ldKSAmJgorCQkJCSAgIHRpbWVvdXQgPCAxMDAwKQorCQkJCSAgICB0aW1lb3V0Kys7CisJCSAgICB9CisJCSAgaWYgKCFzeXNleF9zdGF0ZVtkZXZdKQorCQkJICByZXR1cm4gMDsKKwkgIH0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21pZGlfc3ludGguaCBiL3NvdW5kL29zcy9taWRpX3N5bnRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjOWQwMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9taWRpX3N5bnRoLmgKQEAgLTAsMCArMSw0NyBAQAoraW50IG1pZGlfc3ludGhfaW9jdGwgKGludCBkZXYsCisJICAgIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICogYXJnKTsKK2ludCBtaWRpX3N5bnRoX2tpbGxfbm90ZSAoaW50IGRldiwgaW50IGNoYW5uZWwsIGludCBub3RlLCBpbnQgdmVsb2NpdHkpOworaW50IG1pZGlfc3ludGhfc2V0X2luc3RyIChpbnQgZGV2LCBpbnQgY2hhbm5lbCwgaW50IGluc3RyX25vKTsKK2ludCBtaWRpX3N5bnRoX3N0YXJ0X25vdGUgKGludCBkZXYsIGludCBjaGFubmVsLCBpbnQgbm90ZSwgaW50IHZvbHVtZSk7Cit2b2lkIG1pZGlfc3ludGhfcmVzZXQgKGludCBkZXYpOworaW50IG1pZGlfc3ludGhfb3BlbiAoaW50IGRldiwgaW50IG1vZGUpOwordm9pZCBtaWRpX3N5bnRoX2Nsb3NlIChpbnQgZGV2KTsKK3ZvaWQgbWlkaV9zeW50aF9od19jb250cm9sIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyICpldmVudCk7CitpbnQgbWlkaV9zeW50aF9sb2FkX3BhdGNoIChpbnQgZGV2LCBpbnQgZm9ybWF0LCBjb25zdCBjaGFyIF9fdXNlciAqIGFkZHIsCisJCSBpbnQgb2ZmcywgaW50IGNvdW50LCBpbnQgcG1ncl9mbGFnKTsKK3ZvaWQgbWlkaV9zeW50aF9wYW5uaW5nIChpbnQgZGV2LCBpbnQgY2hhbm5lbCwgaW50IHByZXNzdXJlKTsKK3ZvaWQgbWlkaV9zeW50aF9hZnRlcnRvdWNoIChpbnQgZGV2LCBpbnQgY2hhbm5lbCwgaW50IHByZXNzdXJlKTsKK3ZvaWQgbWlkaV9zeW50aF9jb250cm9sbGVyIChpbnQgZGV2LCBpbnQgY2hhbm5lbCwgaW50IGN0cmxfbnVtLCBpbnQgdmFsdWUpOwordm9pZCBtaWRpX3N5bnRoX2JlbmRlciAoaW50IGRldiwgaW50IGNobiwgaW50IHZhbHVlKTsKK3ZvaWQgbWlkaV9zeW50aF9zZXR1cF92b2ljZSAoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgY2huKTsKK2ludCBtaWRpX3N5bnRoX3NlbmRfc3lzZXgoaW50IGRldiwgdW5zaWduZWQgY2hhciAqYnl0ZXMsaW50IGxlbik7CisKKyNpZm5kZWYgX01JRElfU1lOVEhfQ18KK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfaW5mbyBzdGRfc3ludGhfaW5mbyA9Cit7TUlESV9TWU5USF9OQU1FLCAwLCBTWU5USF9UWVBFX01JREksIDAsIDAsIDEyOCwgMCwgMTI4LCBNSURJX1NZTlRIX0NBUFN9OworCitzdGF0aWMgc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgc3RkX21pZGlfc3ludGggPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaWQJCT0gIk1JREkiLAorCS5pbmZvCQk9ICZzdGRfc3ludGhfaW5mbywKKwkubWlkaV9kZXYJPSAwLAorCS5zeW50aF90eXBlCT0gU1lOVEhfVFlQRV9NSURJLAorCS5zeW50aF9zdWJ0eXBlCT0gMCwKKwkub3BlbgkJPSBtaWRpX3N5bnRoX29wZW4sCisJLmNsb3NlCQk9IG1pZGlfc3ludGhfY2xvc2UsCisJLmlvY3RsCQk9IG1pZGlfc3ludGhfaW9jdGwsCisJLmtpbGxfbm90ZQk9IG1pZGlfc3ludGhfa2lsbF9ub3RlLAorCS5zdGFydF9ub3RlCT0gbWlkaV9zeW50aF9zdGFydF9ub3RlLAorCS5zZXRfaW5zdHIJPSBtaWRpX3N5bnRoX3NldF9pbnN0ciwKKwkucmVzZXQJCT0gbWlkaV9zeW50aF9yZXNldCwKKwkuaHdfY29udHJvbAk9IG1pZGlfc3ludGhfaHdfY29udHJvbCwKKwkubG9hZF9wYXRjaAk9IG1pZGlfc3ludGhfbG9hZF9wYXRjaCwKKwkuYWZ0ZXJ0b3VjaAk9IG1pZGlfc3ludGhfYWZ0ZXJ0b3VjaCwKKwkuY29udHJvbGxlcgk9IG1pZGlfc3ludGhfY29udHJvbGxlciwKKwkucGFubmluZwkJPSBtaWRpX3N5bnRoX3Bhbm5pbmcsCisJLmJlbmRlcgkJPSBtaWRpX3N5bnRoX2JlbmRlciwKKwkuc2V0dXBfdm9pY2UJPSBtaWRpX3N5bnRoX3NldHVwX3ZvaWNlLAorCS5zZW5kX3N5c2V4CT0gbWlkaV9zeW50aF9zZW5kX3N5c2V4Cit9OworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbWlkaWJ1Zi5jIGIvc291bmQvb3NzL21pZGlidWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjY3NmZhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL21pZGlidWYuYwpAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIHNvdW5kL21pZGlidWYuYworICoKKyAqIERldmljZSBmaWxlIG1hbmFnZXIgZm9yIC9kZXYvbWlkaSMKKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisvKgorICogVGhvbWFzIFNhaWxlciAgIDogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICovCisjaW5jbHVkZSA8bGludXgvc3RkZGVmLmg+CisjaW5jbHVkZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjZGVmaW5lIE1JRElCVUZfQworCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKworLyoKKyAqIERvbid0IG1ha2UgTUFYX1FVRVVFX1NJWkUgbGFyZ2VyIHRoYW4gNDAwMAorICovCisKKyNkZWZpbmUgTUFYX1FVRVVFX1NJWkUJNDAwMAorCitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgbWlkaV9zbGVlcGVyW01BWF9NSURJX0RFVl07CitzdGF0aWMgd2FpdF9xdWV1ZV9oZWFkX3QgaW5wdXRfc2xlZXBlcltNQVhfTUlESV9ERVZdOworCitzdHJ1Y3QgbWlkaV9idWYKK3sKKwlpbnQgbGVuLCBoZWFkLCB0YWlsOworCXVuc2lnbmVkIGNoYXIgcXVldWVbTUFYX1FVRVVFX1NJWkVdOworfTsKKworc3RydWN0IG1pZGlfcGFybXMKK3sKKwlsb25nIHByZWNoX3RpbWVvdXQ7CS8qCisJCQkJICogVGltZW91dCBiZWZvcmUgdGhlIGZpcnN0IGNoCisJCQkJICovCit9OworCitzdGF0aWMgc3RydWN0IG1pZGlfYnVmICptaWRpX291dF9idWZbTUFYX01JRElfREVWXSA9IHtOVUxMfTsKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9idWYgKm1pZGlfaW5fYnVmW01BWF9NSURJX0RFVl0gPSB7TlVMTH07CitzdGF0aWMgc3RydWN0IG1pZGlfcGFybXMgcGFybXNbTUFYX01JRElfREVWXTsKKworc3RhdGljIHZvaWQgbWlkaV9wb2xsKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworCisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBwb2xsX3RpbWVyID0gVElNRVJfSU5JVElBTElaRVIobWlkaV9wb2xsLCAwLCAwKTsKKworc3RhdGljIHZvbGF0aWxlIGludCBvcGVuX2RldnM7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOworCisjZGVmaW5lIERBVEFfQVZBSUwocSkgKHEtPmxlbikKKyNkZWZpbmUgU1BBQ0VfQVZBSUwocSkgKE1BWF9RVUVVRV9TSVpFIC0gcS0+bGVuKQorCisjZGVmaW5lIFFVRVVFX0JZVEUocSwgZGF0YSkgXAorCWlmIChTUEFDRV9BVkFJTChxKSkgXAorCXsgXAorCSAgdW5zaWduZWQgbG9uZyBmbGFnczsgXAorCSAgc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsgXAorCSAgcS0+cXVldWVbcS0+dGFpbF0gPSAoZGF0YSk7IFwKKwkgIHEtPmxlbisrOyBxLT50YWlsID0gKHEtPnRhaWwrMSkgJSBNQVhfUVVFVUVfU0laRTsgXAorCSAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jaywgZmxhZ3MpOyBcCisJfQorCisjZGVmaW5lIFJFTU9WRV9CWVRFKHEsIGRhdGEpIFwKKwlpZiAoREFUQV9BVkFJTChxKSkgXAorCXsgXAorCSAgdW5zaWduZWQgbG9uZyBmbGFnczsgXAorCSAgc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsgXAorCSAgZGF0YSA9IHEtPnF1ZXVlW3EtPmhlYWRdOyBcCisJICBxLT5sZW4tLTsgcS0+aGVhZCA9IChxLT5oZWFkKzEpICUgTUFYX1FVRVVFX1NJWkU7IFwKKwkgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsgXAorCX0KKworc3RhdGljIHZvaWQgZHJhaW5fbWlkaV9xdWV1ZShpbnQgZGV2KQoreworCisJLyoKKwkgKiBHaXZlIHRoZSBNaWRpIGRyaXZlciB0aW1lIHRvIGRyYWluIGl0cyBvdXRwdXQgcXVldWVzCisJICovCisKKwlpZiAobWlkaV9kZXZzW2Rldl0tPmJ1ZmZlcl9zdGF0dXMgIT0gTlVMTCkKKwkJd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBtaWRpX2RldnNbZGV2XS0+YnVmZmVyX3N0YXR1cyhkZXYpKSAKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmbWlkaV9zbGVlcGVyW2Rldl0sCisJCQkJCQkgICAgICAgSFovMTApOworfQorCitzdGF0aWMgdm9pZCBtaWRpX2lucHV0X2ludHIoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCWlmIChtaWRpX2luX2J1ZltkZXZdID09IE5VTEwpCisJCXJldHVybjsKKworCWlmIChkYXRhID09IDB4ZmUpCS8qCisJCQkJICogQWN0aXZlIHNlbnNpbmcKKwkJCQkgKi8KKwkJcmV0dXJuOwkJLyoKKwkJCQkgKiBJZ25vcmUKKwkJCQkgKi8KKworCWlmIChTUEFDRV9BVkFJTChtaWRpX2luX2J1ZltkZXZdKSkgeworCQlRVUVVRV9CWVRFKG1pZGlfaW5fYnVmW2Rldl0sIGRhdGEpOworCQl3YWtlX3VwKCZpbnB1dF9zbGVlcGVyW2Rldl0pOworCX0KK30KKworc3RhdGljIHZvaWQgbWlkaV9vdXRwdXRfaW50cihpbnQgZGV2KQoreworCS8qCisJICogQ3VycmVudGx5IE5PUAorCSAqLworfQorCitzdGF0aWMgdm9pZCBtaWRpX3BvbGwodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJaW50ICAgICAgICAgICAgIGRldjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJaWYgKG9wZW5fZGV2cykKKwl7CisJCWZvciAoZGV2ID0gMDsgZGV2IDwgbnVtX21pZGlzOyBkZXYrKykKKwkJCWlmIChtaWRpX2RldnNbZGV2XSAhPSBOVUxMICYmIG1pZGlfb3V0X2J1ZltkZXZdICE9IE5VTEwpCisJCQl7CisJCQkJaW50IG9rID0gMTsKKworCQkJCXdoaWxlIChEQVRBX0FWQUlMKG1pZGlfb3V0X2J1ZltkZXZdKSAmJiBvaykKKwkJCQl7CisJCQkJCWludCBjID0gbWlkaV9vdXRfYnVmW2Rldl0tPnF1ZXVlW21pZGlfb3V0X2J1ZltkZXZdLT5oZWFkXTsKKworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsvKiBHaXZlIHNvbWUgdGltZSB0byBvdGhlcnMgKi8KKwkJCQkJb2sgPSBtaWRpX2RldnNbZGV2XS0+b3V0cHV0YyhkZXYsIGMpOworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQkJCQltaWRpX291dF9idWZbZGV2XS0+aGVhZCA9IChtaWRpX291dF9idWZbZGV2XS0+aGVhZCArIDEpICUgTUFYX1FVRVVFX1NJWkU7CisJCQkJCW1pZGlfb3V0X2J1ZltkZXZdLT5sZW4tLTsKKwkJCQl9CisKKwkJCQlpZiAoREFUQV9BVkFJTChtaWRpX291dF9idWZbZGV2XSkgPCAxMDApCisJCQkJCXdha2VfdXAoJm1pZGlfc2xlZXBlcltkZXZdKTsKKwkJCX0KKwkJcG9sbF90aW1lci5leHBpcmVzID0gKDEpICsgamlmZmllczsKKwkJYWRkX3RpbWVyKCZwb2xsX3RpbWVyKTsKKwkJLyoKKwkJICogQ29tZSBiYWNrIGxhdGVyCisJCSAqLworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7Cit9CisKK2ludCBNSURJYnVmX29wZW4oaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1vZGUsIGVycjsKKworCWRldiA9IGRldiA+PiA0OworCW1vZGUgPSB0cmFuc2xhdGVfbW9kZShmaWxlKTsKKworCWlmIChudW1fbWlkaXMgPiBNQVhfTUlESV9ERVYpCisJeworCQlwcmludGsoS0VSTl9FUlIgIm1pZGk6IFRvbyBtYW55IG1pZGkgaW50ZXJmYWNlc1xuIik7CisJCW51bV9taWRpcyA9IE1BWF9NSURJX0RFVjsKKwl9CisJaWYgKGRldiA8IDAgfHwgZGV2ID49IG51bV9taWRpcyB8fCBtaWRpX2RldnNbZGV2XSA9PSBOVUxMKQorCQkgIHJldHVybiAtRU5YSU87CisJLyoKKwkgKiAgICBJbnRlcnJ1cHRzIGRpc2FibGVkLiBCZSBjYXJlZnVsCisJICovCisKKwltb2R1bGVfcHV0KG1pZGlfZGV2c1tkZXZdLT5vd25lcik7CisKKwlpZiAoKGVyciA9IG1pZGlfZGV2c1tkZXZdLT5vcGVuKGRldiwgbW9kZSwKKwkJCQkgbWlkaV9pbnB1dF9pbnRyLCBtaWRpX291dHB1dF9pbnRyKSkgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcGFybXNbZGV2XS5wcmVjaF90aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJbWlkaV9pbl9idWZbZGV2XSA9IChzdHJ1Y3QgbWlkaV9idWYgKikgdm1hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfYnVmKSk7CisKKwlpZiAobWlkaV9pbl9idWZbZGV2XSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibWlkaTogQ2FuJ3QgYWxsb2NhdGUgYnVmZmVyXG4iKTsKKwkJbWlkaV9kZXZzW2Rldl0tPmNsb3NlKGRldik7CisJCXJldHVybiAtRUlPOworCX0KKwltaWRpX2luX2J1ZltkZXZdLT5sZW4gPSBtaWRpX2luX2J1ZltkZXZdLT5oZWFkID0gbWlkaV9pbl9idWZbZGV2XS0+dGFpbCA9IDA7CisKKwltaWRpX291dF9idWZbZGV2XSA9IChzdHJ1Y3QgbWlkaV9idWYgKikgdm1hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfYnVmKSk7CisKKwlpZiAobWlkaV9vdXRfYnVmW2Rldl0gPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1pZGk6IENhbid0IGFsbG9jYXRlIGJ1ZmZlclxuIik7CisJCW1pZGlfZGV2c1tkZXZdLT5jbG9zZShkZXYpOworCQl2ZnJlZShtaWRpX2luX2J1ZltkZXZdKTsKKwkJbWlkaV9pbl9idWZbZGV2XSA9IE5VTEw7CisJCXJldHVybiAtRUlPOworCX0KKwltaWRpX291dF9idWZbZGV2XS0+bGVuID0gbWlkaV9vdXRfYnVmW2Rldl0tPmhlYWQgPSBtaWRpX291dF9idWZbZGV2XS0+dGFpbCA9IDA7CisJb3Blbl9kZXZzKys7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZtaWRpX3NsZWVwZXJbZGV2XSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmaW5wdXRfc2xlZXBlcltkZXZdKTsKKworCWlmIChvcGVuX2RldnMgPCAyKQkvKiBUaGlzIHdhcyBmaXJzdCBvcGVuICovCisJeworCQlwb2xsX3RpbWVyLmV4cGlyZXMgPSAxICsgamlmZmllczsKKwkJYWRkX3RpbWVyKCZwb2xsX3RpbWVyKTsJLyogU3RhcnQgcG9sbGluZyAqLworCX0KKwlyZXR1cm4gZXJyOworfQorCit2b2lkIE1JRElidWZfcmVsZWFzZShpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbW9kZTsKKworCWRldiA9IGRldiA+PiA0OworCW1vZGUgPSB0cmFuc2xhdGVfbW9kZShmaWxlKTsKKworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBudW1fbWlkaXMgfHwgbWlkaV9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBXYWl0IHVudGlsIHRoZSBxdWV1ZSBpcyBlbXB0eQorCSAqLworCisJaWYgKG1vZGUgIT0gT1BFTl9SRUFEKQorCXsKKwkJbWlkaV9kZXZzW2Rldl0tPm91dHB1dGMoZGV2LCAweGZlKTsJLyoKKwkJCQkJCQkgICAqIEFjdGl2ZSBzZW5zaW5nIHRvIHNodXQgdGhlCisJCQkJCQkJICAgKiBkZXZpY2VzCisJCQkJCQkJICovCisKKwkJd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBEQVRBX0FWQUlMKG1pZGlfb3V0X2J1ZltkZXZdKSkKKwkJCSAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmbWlkaV9zbGVlcGVyW2Rldl0pOworCQkvKgorCQkgKglTeW5jCisJCSAqLworCisJCWRyYWluX21pZGlfcXVldWUoZGV2KTsJLyoKKwkJCQkJICogRW5zdXJlIHRoZSBvdXRwdXQgcXVldWVzIGFyZSBlbXB0eQorCQkJCQkgKi8KKwl9CisKKwltaWRpX2RldnNbZGV2XS0+Y2xvc2UoZGV2KTsKKworCW9wZW5fZGV2cy0tOworCWlmIChvcGVuX2RldnMgPT0gMCkKKwkJZGVsX3RpbWVyX3N5bmMoJnBvbGxfdGltZXIpOworCXZmcmVlKG1pZGlfaW5fYnVmW2Rldl0pOworCXZmcmVlKG1pZGlfb3V0X2J1ZltkZXZdKTsKKwltaWRpX2luX2J1ZltkZXZdID0gTlVMTDsKKwltaWRpX291dF9idWZbZGV2XSA9IE5VTEw7CisKKwltb2R1bGVfcHV0KG1pZGlfZGV2c1tkZXZdLT5vd25lcik7Cit9CisKK2ludCBNSURJYnVmX3dyaXRlKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgY291bnQpCit7CisJaW50IGMsIG4sIGk7CisJdW5zaWduZWQgY2hhciB0bXBfZGF0YTsKKworCWRldiA9IGRldiA+PiA0OworCisJaWYgKCFjb3VudCkKKwkJcmV0dXJuIDA7CisKKwljID0gMDsKKworCXdoaWxlIChjIDwgY291bnQpCisJeworCQluID0gU1BBQ0VfQVZBSUwobWlkaV9vdXRfYnVmW2Rldl0pOworCisJCWlmIChuID09IDApIHsJLyoKKwkJCQkgKiBObyBzcGFjZSBqdXN0IG5vdy4KKwkJCQkgKi8KKworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJYyA9IC1FQUdBSU47CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJm1pZGlfc2xlZXBlcltkZXZdKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgCisJCQl7CisJCQkJYyA9IC1FSU5UUjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCW4gPSBTUEFDRV9BVkFJTChtaWRpX291dF9idWZbZGV2XSk7CisJCX0KKwkJaWYgKG4gPiAoY291bnQgLSBjKSkKKwkJCW4gPSBjb3VudCAtIGM7CisKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJeworCQkJLyogQlJPS0UgQlJPS0UgQlJPS0UgLSBDQU5UIERPIFRISVMgV0lUSCBDTEkgISEgKi8KKwkJCS8qIHllcywgdGhpbmsgdGhlIHNhbWUsIHNvIEkgcmVtb3ZlZCB0aGUgY2xpKCkgYnJhY2tldHMgCisJCQkJUVVFVUVfQllURSBpcyBwcm90ZWN0ZWQgYWdhaW5zdCBpbnRlcnJ1cHRzICovCisJCQlpZiAoY29weV9mcm9tX3VzZXIoKGNoYXIgKikgJnRtcF9kYXRhLCAmKGJ1ZilbY10sIDEpKSB7CisJCQkJYyA9IC1FRkFVTFQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlRVUVVRV9CWVRFKG1pZGlfb3V0X2J1ZltkZXZdLCB0bXBfZGF0YSk7CisJCQljKys7CisJCX0KKwl9CitvdXQ6CisJcmV0dXJuIGM7Cit9CisKKworaW50IE1JRElidWZfcmVhZChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBuLCBjID0gMDsKKwl1bnNpZ25lZCBjaGFyIHRtcF9kYXRhOworCisJZGV2ID0gZGV2ID4+IDQ7CisKKwlpZiAoIURBVEFfQVZBSUwobWlkaV9pbl9idWZbZGV2XSkpIHsJLyoKKwkJCQkJCSAqIE5vIGRhdGEgeWV0LCB3YWl0CisJCQkJCQkgKi8KKyAJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworIAkJCWMgPSAtRUFHQUlOOworCQkJZ290byBvdXQ7CisgCQl9CisJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmaW5wdXRfc2xlZXBlcltkZXZdLAorCQkJCQkgICAgICAgcGFybXNbZGV2XS5wcmVjaF90aW1lb3V0KTsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQljID0gLUVJTlRSOwkvKiBUaGUgdXNlciBpcyBnZXR0aW5nIHJlc3RsZXNzICovCisJfQorCWlmIChjID09IDAgJiYgREFUQV9BVkFJTChtaWRpX2luX2J1ZltkZXZdKSkJLyoKKwkJCQkJCQkgKiBHb3Qgc29tZSBieXRlcworCQkJCQkJCSAqLworCXsKKwkJbiA9IERBVEFfQVZBSUwobWlkaV9pbl9idWZbZGV2XSk7CisJCWlmIChuID4gY291bnQpCisJCQluID0gY291bnQ7CisJCWMgPSAwOworCisJCXdoaWxlIChjIDwgbikKKwkJeworCQkJY2hhciAqZml4aXQ7CisJCQlSRU1PVkVfQllURShtaWRpX2luX2J1ZltkZXZdLCB0bXBfZGF0YSk7CisJCQlmaXhpdCA9IChjaGFyICopICZ0bXBfZGF0YTsKKwkJCS8qIEJST0tFIEJST0tFIEJST0tFICovCisJCQkvKiB5ZXMgcmVtb3ZlZCB0aGUgY2xpKCkgYnJhY2tldHMgYWdhaW4KKwkJCSBzaG91bGQgcS0+bGVuLHRhaWwmaGVhZCBiZSBhdG9taWNfdD8gKi8KKwkJCWlmIChjb3B5X3RvX3VzZXIoJihidWYpW2NdLCBmaXhpdCwgMSkpIHsKKwkJCQljID0gLUVGQVVMVDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCWMrKzsKKwkJfQorCX0KK291dDoKKwlyZXR1cm4gYzsKK30KKworaW50IE1JRElidWZfaW9jdGwoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsCisJCSAgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgdmFsOworCisJZGV2ID0gZGV2ID4+IDQ7CisJCisJaWYgKCgoY21kID4+IDgpICYgMHhmZikgPT0gJ0MnKSAKKwl7CisJCWlmIChtaWRpX2RldnNbZGV2XS0+Y29wcm9jKQkvKiBDb3Byb2Nlc3NvciBpb2N0bCAqLworCQkJcmV0dXJuIG1pZGlfZGV2c1tkZXZdLT5jb3Byb2MtPmlvY3RsKG1pZGlfZGV2c1tkZXZdLT5jb3Byb2MtPmRldmMsIGNtZCwgYXJnLCAwKTsKKy8qCQlwcmludGsoIi9kZXYvbWlkaSVkOiBObyBjb3Byb2Nlc3NvciBmb3IgdGhpcyBkZXZpY2VcbiIsIGRldik7Ki8KKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJZWxzZQorCXsKKwkJc3dpdGNoIChjbWQpIAorCQl7CisJCQljYXNlIFNORENUTF9NSURJX1BSRVRJTUU6CisJCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAodmFsIDwgMCkKKwkJCQkJdmFsID0gMDsKKwkJCQl2YWwgPSAoSFogKiB2YWwpIC8gMTA7CisJCQkJcGFybXNbZGV2XS5wcmVjaF90aW1lb3V0ID0gdmFsOworCQkJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKTsKKwkJCQorCQkJZGVmYXVsdDoKKwkJCQlpZiAoIW1pZGlfZGV2c1tkZXZdLT5pb2N0bCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJcmV0dXJuIG1pZGlfZGV2c1tkZXZdLT5pb2N0bChkZXYsIGNtZCwgYXJnKTsKKwkJfQorCX0KK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCit1bnNpZ25lZCBpbnQgTUlESWJ1Zl9wb2xsKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlkZXYgPSBkZXYgPj4gNDsKKworCS8qIGlucHV0ICovCisJcG9sbF93YWl0KGZpbGUsICZpbnB1dF9zbGVlcGVyW2Rldl0sIHdhaXQpOworCWlmIChEQVRBX0FWQUlMKG1pZGlfaW5fYnVmW2Rldl0pKQorCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisKKwkvKiBvdXRwdXQgKi8KKwlwb2xsX3dhaXQoZmlsZSwgJm1pZGlfc2xlZXBlcltkZXZdLCB3YWl0KTsKKwlpZiAoIVNQQUNFX0FWQUlMKG1pZGlfb3V0X2J1ZltkZXZdKSkKKwkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkKKwlyZXR1cm4gbWFzazsKK30KKworCit2b2lkIE1JRElidWZfaW5pdCh2b2lkKQoreworCS8qIGRyYWcgaW4gbWlkaV9zeW1zLm8gKi8KKwl7CisJCWV4dGVybiBjaGFyIG1pZGlfc3ltc19zeW1ib2w7CisJCW1pZGlfc3ltc19zeW1ib2wgPSAwOworCX0KK30KKworaW50IE1JRElidWZfYXZhaWwoaW50IGRldikKK3sKKwlpZiAobWlkaV9pbl9idWZbZGV2XSkKKwkJcmV0dXJuIERBVEFfQVZBSUwgKG1pZGlfaW5fYnVmW2Rldl0pOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21wdTQwMS5jIGIvc291bmQvb3NzL21wdTQwMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NmY1M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvbXB1NDAxLmMKQEAgLTAsMCArMSwxODI2IEBACisvKgorICogc291bmQvbXB1NDAxLmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgUm9sYW5kIE1QVS00MDEgY29tcGF0aWJsZSBNaWRpIGNhcmRzLgorICovCisvKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICoKKyAqIFRob21hcyBTYWlsZXIJaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICogQWxhbiBDb3gJCW1vZHVsYXJpc2F0aW9uLCB1c2Ugbm9ybWFsIHJlcXVlc3RfaXJxLCB1c2UgZGV2X2lkCisgKiBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6CXJlbW92ZWQgc29tZSBfX2luaXQgdG8gYWxsb3cgdXNpbmcgbWFueSBkcml2ZXJzCisgKiBDaHJpcyBSYW5raW4JCVVwZGF0ZSB0aGUgbW9kdWxlLXVzYWdlIGNvdW50ZXIgZm9yIHRoZSBjb3Byb2Nlc3NvcgorICogWndhbmUgTXdhaWthbWJvCUNoYW5nZWQgYXR0YWNoL3VubG9hZCByZXNvdXJjZSBmcmVlaW5nCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2RlZmluZSBVU0VfU0VRX01BQ1JPUworI2RlZmluZSBVU0VfU0lNUExFX01BQ1JPUworCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJjb3Byb2MuaCIKKyNpbmNsdWRlICJtcHU0MDEuaCIKKworc3RhdGljIGludCAgICAgIHRpbWVyX21vZGUgPSBUTVJfSU5URVJOQUwsIHRpbWVyX2NhcHMgPSBUTVJfSU5URVJOQUw7CisKK3N0cnVjdCBtcHVfY29uZmlnCit7CisJaW50ICAgICAgICAgICAgIGJhc2U7CS8qCisJCQkJICogSS9PIGJhc2UKKwkJCQkgKi8KKwlpbnQgICAgICAgICAgICAgaXJxOworCWludCAgICAgICAgICAgICBvcGVuZWQ7CS8qCisJCQkJICogT3BlbiBtb2RlCisJCQkJICovCisJaW50ICAgICAgICAgICAgIGRldm5vOworCWludCAgICAgICAgICAgICBzeW50aG5vOworCWludCAgICAgICAgICAgICB1YXJ0X21vZGU7CisJaW50ICAgICAgICAgICAgIGluaXRpYWxpemVkOworCWludCAgICAgICAgICAgICBtb2RlOworI2RlZmluZSBNT0RFX01JREkJMQorI2RlZmluZSBNT0RFX1NZTlRICTIKKwl1bnNpZ25lZCBjaGFyICAgdmVyc2lvbiwgcmV2aXNpb247CisJdW5zaWduZWQgaW50ICAgIGNhcGFiaWxpdGllczsKKyNkZWZpbmUgTVBVX0NBUF9JTlRMRwkweDEwMDAwMDAwCisjZGVmaW5lIE1QVV9DQVBfU1lOQwkweDAwMDAwMDEwCisjZGVmaW5lIE1QVV9DQVBfRlNLCTB4MDAwMDAwMjAKKyNkZWZpbmUgTVBVX0NBUF9DTFMJMHgwMDAwMDA0MAorI2RlZmluZSBNUFVfQ0FQX1NNUFRFIAkweDAwMDAwMDgwCisjZGVmaW5lIE1QVV9DQVBfMlBPUlQJMHgwMDAwMDAwMQorCWludCAgICAgICAgICAgICB0aW1lcl9mbGFnOworCisjZGVmaW5lIE1CVUZfTUFYCTEwCisjZGVmaW5lIEJVRlRFU1QoZGMpIGlmIChkYy0+bV9wdHIgPj0gTUJVRl9NQVggfHwgZGMtPm1fcHRyIDwgMCkgXAorCXtwcmludGsoICJNUFU6IEludmFsaWQgYnVmZmVyIHBvaW50ZXIgJWQvJWQsIHM9JWRcbiIsICBkYy0+bV9wdHIsICBkYy0+bV9sZWZ0LCAgZGMtPm1fc3RhdGUpO2RjLT5tX3B0ci0tO30KKwkgIGludCAgICAgICAgICAgICBtX2J1c3k7CisJICB1bnNpZ25lZCBjaGFyICAgbV9idWZbTUJVRl9NQVhdOworCSAgaW50ICAgICAgICAgICAgIG1fcHRyOworCSAgaW50ICAgICAgICAgICAgIG1fc3RhdGU7CisJICBpbnQgICAgICAgICAgICAgbV9sZWZ0OworCSAgdW5zaWduZWQgY2hhciAgIGxhc3Rfc3RhdHVzOworCSAgdm9pZCAgICAgICAgICAgICgqaW5wdXRpbnRyKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKTsKKwkgIGludCAgICAgICAgICAgICBzaGFyZWRfaXJxOworCSAgaW50ICAgICAgICAgICAgKm9zcDsKKwkgIHNwaW5sb2NrX3QJbG9jazsKKyAgfTsKKworI2RlZmluZQlEQVRBUE9SVChiYXNlKSAgIChiYXNlKQorI2RlZmluZQlDT01EUE9SVChiYXNlKSAgIChiYXNlKzEpCisjZGVmaW5lCVNUQVRQT1JUKGJhc2UpICAgKGJhc2UrMSkKKworCitzdGF0aWMgdm9pZCBtcHU0MDFfY2xvc2UoaW50IGRldik7CisKK3N0YXRpYyBpbmxpbmUgaW50IG1wdTQwMV9zdGF0dXMoc3RydWN0IG1wdV9jb25maWcgKmRldmMpCit7CisJcmV0dXJuIGluYihTVEFUUE9SVChkZXZjLT5iYXNlKSk7Cit9CisKKyNkZWZpbmUgaW5wdXRfYXZhaWwoZGV2YykJCSghKG1wdTQwMV9zdGF0dXMoZGV2YykmSU5QVVRfQVZBSUwpKQorI2RlZmluZSBvdXRwdXRfcmVhZHkoZGV2YykJCSghKG1wdTQwMV9zdGF0dXMoZGV2YykmT1VUUFVUX1JFQURZKSkKKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2NvbW1hbmQoc3RydWN0IG1wdV9jb25maWcgKmRldmMsIHVuc2lnbmVkIGNoYXIgY21kKQoreworCW91dGIoY21kLCBDT01EUE9SVChkZXZjLT5iYXNlKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJlYWRfZGF0YShzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YykKK3sKKwlyZXR1cm4gaW5iKERBVEFQT1JUKGRldmMtPmJhc2UpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHdyaXRlX2RhdGEoc3RydWN0IG1wdV9jb25maWcgKmRldmMsIHVuc2lnbmVkIGNoYXIgYnl0ZSkKK3sKKwlvdXRiKGJ5dGUsIERBVEFQT1JUKGRldmMtPmJhc2UpKTsKK30KKworI2RlZmluZQlPVVRQVVRfUkVBRFkJMHg0MAorI2RlZmluZQlJTlBVVF9BVkFJTAkweDgwCisjZGVmaW5lCU1QVV9BQ0sJCTB4RkUKKyNkZWZpbmUJTVBVX1JFU0VUCTB4RkYKKyNkZWZpbmUJVUFSVF9NT0RFX09OCTB4M0YKKworc3RhdGljIHN0cnVjdCBtcHVfY29uZmlnIGRldl9jb25mW01BWF9NSURJX0RFVl07CisKK3N0YXRpYyBpbnQgbl9tcHVfZGV2czsKKworc3RhdGljIGludCByZXNldF9tcHU0MDEoc3RydWN0IG1wdV9jb25maWcgKmRldmMpOworc3RhdGljIHZvaWQgc2V0X3VhcnRfbW9kZShpbnQgZGV2LCBzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YywgaW50IGFyZyk7CisKK3N0YXRpYyBpbnQgbXB1X3RpbWVyX2luaXQoaW50IG1pZGlfZGV2KTsKK3N0YXRpYyB2b2lkIG1wdV90aW1lcl9pbnRlcnJ1cHQodm9pZCk7CitzdGF0aWMgdm9pZCB0aW1lcl9leHRfZXZlbnQoc3RydWN0IG1wdV9jb25maWcgKmRldmMsIGludCBldmVudCwgaW50IHBhcm0pOworCitzdGF0aWMgc3RydWN0IHN5bnRoX2luZm8gbXB1X3N5bnRoX2luZm9fcHJvdG8gPSB7CisJIk1QVS00MDEgTUlESSBpbnRlcmZhY2UiLCAKKwkwLCAKKwlTWU5USF9UWVBFX01JREksIAorCU1JRElfVFlQRV9NUFU0MDEsIAorCTAsIDEyOCwgCisJMCwgMTI4LCAKKwlTWU5USF9DQVBfSU5QVVQKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfaW5mbyBtcHVfc3ludGhfaW5mb1tNQVhfTUlESV9ERVZdOworCisvKgorICogU3RhdGVzIGZvciB0aGUgaW5wdXQgc2Nhbm5lcgorICovCisKKyNkZWZpbmUgU1RfSU5JVAkJCTAJLyogUmVhZHkgZm9yIHRpbWluZyBieXRlIG9yIG1zZyAqLworI2RlZmluZSBTVF9USU1FRAkJMQkvKiBMZWFkaW5nIHRpbWluZyBieXRlIHJjdmQgKi8KKyNkZWZpbmUgU1RfREFUQUJZVEUJCTIJLyogV2FpdGluZyBmb3IgKG5yX2xlZnQpIGRhdGEgYnl0ZXMgKi8KKworI2RlZmluZSBTVF9TWVNNU0cJCTEwMAkvKiBTeXN0ZW0gbWVzc2FnZSAoc3lzeCBldGMpLiAqLworI2RlZmluZSBTVF9TWVNFWAkJMTAxCS8qIFN5c3RlbSBleGNsdXNpdmUgbXNnICovCisjZGVmaW5lIFNUX01UQwkJCTEwMgkvKiBNaWRpIFRpbWUgQ29kZSAoTVRDKSBxZnJhbWUgbXNnICovCisjZGVmaW5lIFNUX1NPTkdTRUwJCTEwMwkvKiBTb25nIHNlbGVjdCAqLworI2RlZmluZSBTVF9TT05HUE9TCQkxMDQJLyogU29uZyBwb3NpdGlvbiBwb2ludGVyICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGxlbl90YWJbXSA9CS8qICMgb2YgZGF0YSBieXRlcyBmb2xsb3dpbmcgYSBzdGF0dXMKKwkJCQkJICovCit7CisJMiwJCQkvKiA4eCAqLworCTIsCQkJLyogOXggKi8KKwkyLAkJCS8qIEF4ICovCisJMiwJCQkvKiBCeCAqLworCTEsCQkJLyogQ3ggKi8KKwkxLAkJCS8qIER4ICovCisJMiwJCQkvKiBFeCAqLworCTAJCQkvKiBGeCAqLworfTsKKworI2RlZmluZSBTVE9SRShjbWQpIFwKK3sgXAorCWludCBsZW47IFwKKwl1bnNpZ25lZCBjaGFyIG9idWZbOF07IFwKKwljbWQ7IFwKKwlzZXFfaW5wdXRfZXZlbnQob2J1ZiwgbGVuKTsgXAorfQorCisjZGVmaW5lIF9zZXFidWYgb2J1ZgorI2RlZmluZSBfc2VxYnVmcHRyIDAKKyNkZWZpbmUgX1NFUV9BRFZCVUYoeCkgbGVuPXgKKworc3RhdGljIGludCBtcHVfaW5wdXRfc2Nhbm5lcihzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YywgdW5zaWduZWQgY2hhciBtaWRpYykKK3sKKworCXN3aXRjaCAoZGV2Yy0+bV9zdGF0ZSkKKwl7CisJCWNhc2UgU1RfSU5JVDoKKwkJCXN3aXRjaCAobWlkaWMpCisJCQl7CisJCQkJY2FzZSAweGY4OgorCQkJCS8qIFRpbWVyIG92ZXJmbG93ICovCisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweGZjOgorCQkJCQlwcmludGsoIjxhbGwgZW5kPiIpOworCQkJIAkJYnJlYWs7CisKKwkJCQljYXNlIDB4ZmQ6CisJCQkJCWlmIChkZXZjLT50aW1lcl9mbGFnKQorCQkJCQkJbXB1X3RpbWVyX2ludGVycnVwdCgpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMHhmZToKKwkJCQkJcmV0dXJuIE1QVV9BQ0s7CisKKwkJCQljYXNlIDB4ZjA6CisJCQkJY2FzZSAweGYxOgorCQkJCWNhc2UgMHhmMjoKKwkJCQljYXNlIDB4ZjM6CisJCQkJY2FzZSAweGY0OgorCQkJCWNhc2UgMHhmNToKKwkJCQljYXNlIDB4ZjY6CisJCQkJY2FzZSAweGY3OgorCQkJCQlwcmludGsoIjxUcmsgZGF0YSBycSAjJWQ+IiwgbWlkaWMgJiAweDBmKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDB4Zjk6CisJCQkJCXByaW50aygiPGNvbmR1Y3RvciBycT4iKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDB4ZmY6CisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9TWVNNU0c7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJaWYgKG1pZGljIDw9IDB4ZWYpCisJCQkJCXsKKwkJCQkJCS8qIHByaW50ayggIm1wdSB0aW1lOiAlZCAiLCAgbWlkaWMpOyAqLworCQkJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX1RJTUVEOworCQkJCQl9CisJCQkJCWVsc2UKKwkJCQkJCXByaW50aygiPE1QVTogVW5rbm93biBldmVudCAlMDJ4PiAiLCBtaWRpYyk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNUX1RJTUVEOgorCQkJeworCQkJCWludCBtc2cgPSAoKGludCkgKG1pZGljICYgMHhmMCkgPj4gNCk7CisKKwkJCQlkZXZjLT5tX3N0YXRlID0gU1RfREFUQUJZVEU7CisKKwkJCQlpZiAobXNnIDwgOCkJLyogRGF0YSBieXRlICovCisJCQkJeworCQkJCQkvKiBwcmludGsoICJtaWRpIG1zZyAocnVubmluZyBzdGF0dXMpICIpOyAqLworCQkJCQltc2cgPSAoKGludCkgKGRldmMtPmxhc3Rfc3RhdHVzICYgMHhmMCkgPj4gNCk7CisJCQkJCW1zZyAtPSA4OworCQkJCQlkZXZjLT5tX2xlZnQgPSBsZW5fdGFiW21zZ10gLSAxOworCisJCQkJCWRldmMtPm1fcHRyID0gMjsKKwkJCQkJZGV2Yy0+bV9idWZbMF0gPSBkZXZjLT5sYXN0X3N0YXR1czsKKwkJCQkJZGV2Yy0+bV9idWZbMV0gPSBtaWRpYzsKKworCQkJCQlpZiAoZGV2Yy0+bV9sZWZ0IDw9IDApCisJCQkJCXsKKwkJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCQkJCQkJZG9fbWlkaV9tc2coZGV2Yy0+c3ludGhubywgZGV2Yy0+bV9idWYsIGRldmMtPm1fcHRyKTsKKwkJCQkJCWRldmMtPm1fcHRyID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlIGlmIChtc2cgPT0gMHhmKQkvKiBNUFUgTUFSSyAqLworCQkJCXsKKwkJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX0lOSVQ7CisKKwkJCQkJc3dpdGNoIChtaWRpYykKKwkJCQkJeworCQkJCQkJY2FzZSAweGY4OgorCQkJCQkJCS8qIHByaW50ayggIk5PUCAiKTsgKi8KKwkJCQkJCQlicmVhazsKKworCQkJCQkJY2FzZSAweGY5OgorCQkJCQkJCS8qIHByaW50ayggIm1lYXMgZW5kICIpOyAqLworCQkJCQkJCWJyZWFrOworCisJCQkJCQljYXNlIDB4ZmM6CisJCQkJCQkJLyogcHJpbnRrKCAiZGF0YSBlbmQgIik7ICovCisJCQkJCQkJYnJlYWs7CisKKwkJCQkJCWRlZmF1bHQ6CisJCQkJCQkJcHJpbnRrKCJVbmtub3duIE1QVSBtYXJrICUwMnhcbiIsIG1pZGljKTsKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlkZXZjLT5sYXN0X3N0YXR1cyA9IG1pZGljOworCQkJCQkvKiBwcmludGsoICJtaWRpIG1zZyAiKTsgKi8KKwkJCQkJbXNnIC09IDg7CisJCQkJCWRldmMtPm1fbGVmdCA9IGxlbl90YWJbbXNnXTsKKworCQkJCQlkZXZjLT5tX3B0ciA9IDE7CisJCQkJCWRldmMtPm1fYnVmWzBdID0gbWlkaWM7CisKKwkJCQkJaWYgKGRldmMtPm1fbGVmdCA8PSAwKQorCQkJCQl7CisJCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwkJCQkJCWRvX21pZGlfbXNnKGRldmMtPnN5bnRobm8sIGRldmMtPm1fYnVmLCBkZXZjLT5tX3B0cik7CisJCQkJCQlkZXZjLT5tX3B0ciA9IDA7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNUX1NZU01TRzoKKwkJCXN3aXRjaCAobWlkaWMpCisJCQl7CisJCQkJY2FzZSAweGYwOgorCQkJCQlwcmludGsoIjxTWVg+Iik7CisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9TWVNFWDsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDB4ZjE6CisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9NVEM7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweGYyOgorCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfU09OR1BPUzsKKwkJCQkJZGV2Yy0+bV9wdHIgPSAwOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMHhmMzoKKwkJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX1NPTkdTRUw7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweGY2OgorCQkJCQkvKiBwcmludGsoICJ0dW5lX3JlcXVlc3RcbiIpOyAqLworCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKworCQkJCQkvKgorCQkJCQkgKiAgICBSZWFsIHRpbWUgbWVzc2FnZXMKKwkJCQkJICovCisJCQkJY2FzZSAweGY4OgorCQkJCQkvKiBtaWRpIGNsb2NrICovCisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCQkJCQl0aW1lcl9leHRfZXZlbnQoZGV2YywgVE1SX0NMT0NLLCAwKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDB4ZkE6CisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCQkJCQl0aW1lcl9leHRfZXZlbnQoZGV2YywgVE1SX1NUQVJULCAwKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDB4RkI6CisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCQkJCQl0aW1lcl9leHRfZXZlbnQoZGV2YywgVE1SX0NPTlRJTlVFLCAwKTsKKwkJCQkJYnJlYWs7CisKKwkJCQljYXNlIDB4RkM6CisJCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCQkJCQl0aW1lcl9leHRfZXZlbnQoZGV2YywgVE1SX1NUT1AsIDApOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgMHhGRToKKwkJCQkJLyogYWN0aXZlIHNlbnNpbmcgKi8KKwkJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX0lOSVQ7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSAweGZmOgorCQkJCQkvKiBwcmludGsoICJtaWRpIGhhcmQgcmVzZXQiKTsgKi8KKwkJCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX0lOSVQ7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJcHJpbnRrKCJ1bmtub3duIE1JREkgc3lzbXNnICUweFxuIiwgbWlkaWMpOworCQkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU1RfTVRDOgorCQkJZGV2Yy0+bV9zdGF0ZSA9IFNUX0lOSVQ7CisJCQlwcmludGsoIk1UQyBmcmFtZSAleDAyXG4iLCBtaWRpYyk7CisJCQlicmVhazsKKworCQljYXNlIFNUX1NZU0VYOgorCQkJaWYgKG1pZGljID09IDB4ZjcpCisJCQl7CisJCQkJcHJpbnRrKCI8RU9YPiIpOworCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCQkJfQorCQkJZWxzZQorCQkJCXByaW50aygiJTAyeCAiLCBtaWRpYyk7CisJCQlicmVhazsKKworCQljYXNlIFNUX1NPTkdQT1M6CisJCQlCVUZURVNUKGRldmMpOworCQkJZGV2Yy0+bV9idWZbZGV2Yy0+bV9wdHIrK10gPSBtaWRpYzsKKwkJCWlmIChkZXZjLT5tX3B0ciA9PSAyKQorCQkJeworCQkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCQkJCWRldmMtPm1fcHRyID0gMDsKKwkJCQl0aW1lcl9leHRfZXZlbnQoZGV2YywgVE1SX1NQUCwKKwkJCQkJKChkZXZjLT5tX2J1ZlsxXSAmIDB4N2YpIDw8IDcpIHwKKwkJCQkJKGRldmMtPm1fYnVmWzBdICYgMHg3ZikpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTVF9EQVRBQllURToKKwkJCUJVRlRFU1QoZGV2Yyk7CisJCQlkZXZjLT5tX2J1ZltkZXZjLT5tX3B0cisrXSA9IG1pZGljOworCQkJaWYgKCgtLWRldmMtPm1fbGVmdCkgPD0gMCkKKwkJCXsKKwkJCQlkZXZjLT5tX3N0YXRlID0gU1RfSU5JVDsKKwkJCQlkb19taWRpX21zZyhkZXZjLT5zeW50aG5vLCBkZXZjLT5tX2J1ZiwgZGV2Yy0+bV9wdHIpOworCQkJCWRldmMtPm1fcHRyID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsoIkJhZCBzdGF0ZSAlZCAiLCBkZXZjLT5tX3N0YXRlKTsKKwkJCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgbXB1NDAxX2lucHV0X2xvb3Aoc3RydWN0IG1wdV9jb25maWcgKmRldmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgYnVzeTsKKwlpbnQgbjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlidXN5ID0gZGV2Yy0+bV9idXN5OworCWRldmMtPm1fYnVzeSA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwlpZiAoYnVzeSkJCS8qIEFscmVhZHkgaW5zaWRlIHRoZSBzY2FubmVyICovCisJCXJldHVybjsKKworCW4gPSA1MDsKKworCXdoaWxlIChpbnB1dF9hdmFpbChkZXZjKSAmJiBuLS0gPiAwKQorCXsKKwkJdW5zaWduZWQgY2hhciBjID0gcmVhZF9kYXRhKGRldmMpOworCisJCWlmIChkZXZjLT5tb2RlID09IE1PREVfU1lOVEgpCisJCXsKKwkJCW1wdV9pbnB1dF9zY2FubmVyKGRldmMsIGMpOworCQl9CisJCWVsc2UgaWYgKGRldmMtPm9wZW5lZCAmIE9QRU5fUkVBRCAmJiBkZXZjLT5pbnB1dGludHIgIT0gTlVMTCkKKwkJCWRldmMtPmlucHV0aW50cihkZXZjLT5kZXZubywgYyk7CisJfQorCWRldmMtPm1fYnVzeSA9IDA7Cit9CisKK2ludCBpbnRjaGtfbXB1NDAxKHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YzsKKwlpbnQgZGV2ID0gKGludCkgZGV2X2lkOworCisJZGV2YyA9ICZkZXZfY29uZltkZXZdOworCXJldHVybiBpbnB1dF9hdmFpbChkZXZjKTsKK30KKworaXJxcmV0dXJuX3QgbXB1aW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpkdW1teSkKK3sKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YzsKKwlpbnQgZGV2ID0gKGludCkgZGV2X2lkOworCWludCBoYW5kbGVkID0gMDsKKworCWRldmMgPSAmZGV2X2NvbmZbZGV2XTsKKworCWlmIChpbnB1dF9hdmFpbChkZXZjKSkKKwl7CisJCWhhbmRsZWQgPSAxOworCQlpZiAoZGV2Yy0+YmFzZSAhPSAwICYmIChkZXZjLT5vcGVuZWQgJiBPUEVOX1JFQUQgfHwgZGV2Yy0+bW9kZSA9PSBNT0RFX1NZTlRIKSkKKwkJCW1wdTQwMV9pbnB1dF9sb29wKGRldmMpOworCQllbHNlCisJCXsKKwkJCS8qIER1bW15IHJlYWQgKGp1c3QgdG8gYWNrbm93bGVkZ2UgdGhlIGludGVycnVwdCkgKi8KKwkJCXJlYWRfZGF0YShkZXZjKTsKKwkJfQorCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKK30KKworc3RhdGljIGludCBtcHU0MDFfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSwKKwkgICAgdm9pZCAgICAgICAgICAgICgqaW5wdXQpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpLAorCSAgICB2b2lkICAgICAgICAgICAgKCpvdXRwdXQpIChpbnQgZGV2KQorKQoreworCWludCBlcnI7CisJc3RydWN0IG1wdV9jb25maWcgKmRldmM7CisJc3RydWN0IGNvcHJvY19vcGVyYXRpb25zICpjb3Byb2Nlc3NvcjsKKworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBudW1fbWlkaXMgfHwgbWlkaV9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRldmMgPSAmZGV2X2NvbmZbZGV2XTsKKworCWlmIChkZXZjLT5vcGVuZWQpCisJCSAgcmV0dXJuIC1FQlVTWTsKKwkvKgorCSAqICBWZXJpZnkgdGhhdCB0aGUgZGV2aWNlIGlzIHJlYWxseSBydW5uaW5nLgorCSAqICBTb21lIGRldmljZXMgKHN1Y2ggYXMgRW5zb25pcSBTb3VuZFNjYXBlIGRvbid0CisJICogIHdvcmsgYmVmb3JlIHRoZSBvbiBib2FyZCBwcm9jZXNzb3IgKE9CUCkgaXMgaW5pdGlhbGl6ZWQKKwkgKiAgYnkgZG93bmxvYWRpbmcgaXRzIG1pY3JvY29kZS4KKwkgKi8KKworCWlmICghZGV2Yy0+aW5pdGlhbGl6ZWQpCisJeworCQlpZiAobXB1NDAxX3N0YXR1cyhkZXZjKSA9PSAweGZmKQkvKiBCdXMgZmxvYXQgKi8KKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJtcHU0MDE6IERldmljZSBub3QgaW5pdGlhbGl6ZWQgcHJvcGVybHlcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcmVzZXRfbXB1NDAxKGRldmMpOworCX0KKworCWlmICggKGNvcHJvY2Vzc29yID0gbWlkaV9kZXZzW2Rldl0tPmNvcHJvYykgIT0gTlVMTCApCisJeworCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KGNvcHJvY2Vzc29yLT5vd25lcikpIHsKKwkJCW1wdTQwMV9jbG9zZShkZXYpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKworCQlpZiAoKGVyciA9IGNvcHJvY2Vzc29yLT5vcGVuKGNvcHJvY2Vzc29yLT5kZXZjLCBDT1BSX01JREkpKSA8IDApCisJCXsKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1QVS00MDE6IENhbid0IGFjY2VzcyBjb3Byb2Nlc3NvciBkZXZpY2VcbiIpOworCQkJbXB1NDAxX2Nsb3NlKGRldik7CisJCQlyZXR1cm4gZXJyOworCQl9CisJfQorCQorCXNldF91YXJ0X21vZGUoZGV2LCBkZXZjLCAxKTsKKwlkZXZjLT5tb2RlID0gTU9ERV9NSURJOworCWRldmMtPnN5bnRobm8gPSAwOworCisJbXB1NDAxX2lucHV0X2xvb3AoZGV2Yyk7CisKKwlkZXZjLT5pbnB1dGludHIgPSBpbnB1dDsKKwlkZXZjLT5vcGVuZWQgPSBtb2RlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1wdTQwMV9jbG9zZShpbnQgZGV2KQoreworCXN0cnVjdCBtcHVfY29uZmlnICpkZXZjOworCXN0cnVjdCBjb3Byb2Nfb3BlcmF0aW9ucyAqY29wcm9jZXNzb3I7CisKKwlkZXZjID0gJmRldl9jb25mW2Rldl07CisJaWYgKGRldmMtPnVhcnRfbW9kZSkKKwkJcmVzZXRfbXB1NDAxKGRldmMpOwkvKgorCQkJCQkgKiBUaGlzIGRpc2FibGVzIHRoZSBVQVJUIG1vZGUKKwkJCQkJICovCisJZGV2Yy0+bW9kZSA9IDA7CisJZGV2Yy0+aW5wdXRpbnRyID0gTlVMTDsKKworCWNvcHJvY2Vzc29yID0gbWlkaV9kZXZzW2Rldl0tPmNvcHJvYzsKKwlpZiAoY29wcm9jZXNzb3IpIHsKKwkJY29wcm9jZXNzb3ItPmNsb3NlKGNvcHJvY2Vzc29yLT5kZXZjLCBDT1BSX01JREkpOworCQltb2R1bGVfcHV0KGNvcHJvY2Vzc29yLT5vd25lcik7CisJfQorCWRldmMtPm9wZW5lZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgbXB1NDAxX291dChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKK3sKKwlpbnQgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3RydWN0IG1wdV9jb25maWcgKmRldmM7CisKKwlkZXZjID0gJmRldl9jb25mW2Rldl07CisKKwkvKgorCSAqIFNvbWV0aW1lcyBpdCB0YWtlcyBhYm91dCAzMDAwMCBsb29wcyBiZWZvcmUgdGhlIG91dHB1dCBiZWNvbWVzIHJlYWR5CisJICogKEFmdGVyIHJlc2V0KS4gTm9ybWFsbHkgaXQgdGFrZXMganVzdCBhYm91dCAxMCBsb29wcy4KKwkgKi8KKworCWZvciAodGltZW91dCA9IDMwMDAwOyB0aW1lb3V0ID4gMCAmJiAhb3V0cHV0X3JlYWR5KGRldmMpOyB0aW1lb3V0LS0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWlmICghb3V0cHV0X3JlYWR5KGRldmMpKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBTZW5kIGRhdGEgdGltZW91dFxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJd3JpdGVfZGF0YShkZXZjLCBtaWRpX2J5dGUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IG1wdTQwMV9jb21tYW5kKGludCBkZXYsIG1wdV9jb21tYW5kX3JlYyAqIGNtZCkKK3sKKwlpbnQgaSwgdGltZW91dCwgb2s7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCXN0cnVjdCBtcHVfY29uZmlnICpkZXZjOworCisJZGV2YyA9ICZkZXZfY29uZltkZXZdOworCisJaWYgKGRldmMtPnVhcnRfbW9kZSkJLyoKKwkJCQkgKiBOb3QgcG9zc2libGUgaW4gVUFSVCBtb2RlCisJCQkJICovCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtcHU0MDE6IGNvbW1hbmRzIG5vdCBwb3NzaWJsZSBpbiB0aGUgVUFSVCBtb2RlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qCisJICogVGVzdCBmb3IgaW5wdXQgc2luY2UgcGVuZGluZyBpbnB1dCBzZWVtcyB0byBibG9jayB0aGUgb3V0cHV0LgorCSAqLworCWlmIChpbnB1dF9hdmFpbChkZXZjKSkKKwkJbXB1NDAxX2lucHV0X2xvb3AoZGV2Yyk7CisKKwkvKgorCSAqIFNvbWV0aW1lcyBpdCB0YWtlcyBhYm91dCA1MDAwMCBsb29wcyBiZWZvcmUgdGhlIG91dHB1dCBiZWNvbWVzIHJlYWR5CisJICogKEFmdGVyIHJlc2V0KS4gTm9ybWFsbHkgaXQgdGFrZXMganVzdCBhYm91dCAxMCBsb29wcy4KKwkgKi8KKworCXRpbWVvdXQgPSA1MDAwMDsKK3JldHJ5OgorCWlmICh0aW1lb3V0LS0gPD0gMCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1wdTQwMTogQ29tbWFuZCAoMHgleCkgdGltZW91dFxuIiwgKGludCkgY21kLT5jbWQpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCisJaWYgKCFvdXRwdXRfcmVhZHkoZGV2YykpCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJZ290byByZXRyeTsKKwl9CisJd3JpdGVfY29tbWFuZChkZXZjLCBjbWQtPmNtZCk7CisKKwlvayA9IDA7CisJZm9yICh0aW1lb3V0ID0gNTAwMDA7IHRpbWVvdXQgPiAwICYmICFvazsgdGltZW91dC0tKQorCXsKKwkJaWYgKGlucHV0X2F2YWlsKGRldmMpKQorCQl7CisJCQlpZiAoZGV2Yy0+b3BlbmVkICYmIGRldmMtPm1vZGUgPT0gTU9ERV9TWU5USCkKKwkJCXsKKwkJCQlpZiAobXB1X2lucHV0X3NjYW5uZXIoZGV2YywgcmVhZF9kYXRhKGRldmMpKSA9PSBNUFVfQUNLKQorCQkJCQlvayA9IDE7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJLyogRGV2aWNlIGlzIG5vdCBjdXJyZW50bHkgb3Blbi4gVXNlIHNpbXBsZXIgbWV0aG9kICovCisJCQkJaWYgKHJlYWRfZGF0YShkZXZjKSA9PSBNUFVfQUNLKQorCQkJCQlvayA9IDE7CisJCQl9CisJCX0KKwl9CisJaWYgKCFvaykKKwl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGNtZC0+bnJfYXJncykKKwl7CisJCWZvciAoaSA9IDA7IGkgPCBjbWQtPm5yX2FyZ3M7IGkrKykKKwkJeworCQkJZm9yICh0aW1lb3V0ID0gMzAwMDsgdGltZW91dCA+IDAgJiYgIW91dHB1dF9yZWFkeShkZXZjKTsgdGltZW91dC0tKTsKKworCQkJaWYgKCFtcHU0MDFfb3V0KGRldiwgY21kLT5kYXRhW2ldKSkKKwkJCXsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtcHU0MDE6IENvbW1hbmQgKDB4JXgpLCBwYXJtIHNlbmQgZmFpbGVkLlxuIiwgKGludCkgY21kLT5jbWQpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQl9CisJfQorCXJldCA9IDA7CisJY21kLT5kYXRhWzBdID0gMDsKKworCWlmIChjbWQtPm5yX3JldHVybnMpCisJeworCQlmb3IgKGkgPSAwOyBpIDwgY21kLT5ucl9yZXR1cm5zOyBpKyspCisJCXsKKwkJCW9rID0gMDsKKwkJCWZvciAodGltZW91dCA9IDUwMDA7IHRpbWVvdXQgPiAwICYmICFvazsgdGltZW91dC0tKQorCQkJCWlmIChpbnB1dF9hdmFpbChkZXZjKSkKKwkJCQl7CisJCQkJCWNtZC0+ZGF0YVtpXSA9IHJlYWRfZGF0YShkZXZjKTsKKwkJCQkJb2sgPSAxOworCQkJCX0KKwkJCWlmICghb2spCisJCQl7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBtcHVfY21kKGludCBkZXYsIGludCBjbWQsIGludCBkYXRhKQoreworCWludCByZXQ7CisKKwlzdGF0aWMgbXB1X2NvbW1hbmRfcmVjIHJlYzsKKworCXJlYy5jbWQgPSBjbWQgJiAweGZmOworCXJlYy5ucl9hcmdzID0gKChjbWQgJiAweGYwKSA9PSAweEUwKTsKKwlyZWMubnJfcmV0dXJucyA9ICgoY21kICYgMHhmMCkgPT0gMHhBMCk7CisJcmVjLmRhdGFbMF0gPSBkYXRhICYgMHhmZjsKKworCWlmICgocmV0ID0gbXB1NDAxX2NvbW1hbmQoZGV2LCAmcmVjKSkgPCAwKQorCQlyZXR1cm4gcmV0OworCXJldHVybiAodW5zaWduZWQgY2hhcikgcmVjLmRhdGFbMF07Cit9CisKK3N0YXRpYyBpbnQgbXB1NDAxX3ByZWZpeF9jbWQoaW50IGRldiwgdW5zaWduZWQgY2hhciBzdGF0dXMpCit7CisJc3RydWN0IG1wdV9jb25maWcgKmRldmMgPSAmZGV2X2NvbmZbZGV2XTsKKworCWlmIChkZXZjLT51YXJ0X21vZGUpCisJCXJldHVybiAxOworCisJaWYgKHN0YXR1cyA8IDB4ZjApCisJeworCQlpZiAobXB1X2NtZChkZXYsIDB4RDAsIDApIDwgMCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gMTsKKwl9CisJc3dpdGNoIChzdGF0dXMpCisJeworCQljYXNlIDB4RjA6CisJCQlpZiAobXB1X2NtZChkZXYsIDB4REYsIDApIDwgMCkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiAxOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXB1NDAxX3N0YXJ0X3JlYWQoaW50IGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcHU0MDFfZW5kX3JlYWQoaW50IGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtcHU0MDFfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBtcHVfY29uZmlnICpkZXZjOworCW1wdV9jb21tYW5kX3JlYyByZWM7CisJaW50IHZhbCwgcmV0OworCisJZGV2YyA9ICZkZXZfY29uZltkZXZdOworCXN3aXRjaCAoY21kKSAKKwl7CisJCWNhc2UgU05EQ1RMX01JRElfTVBVTU9ERToKKwkJCWlmICghKGRldmMtPmNhcGFiaWxpdGllcyAmIE1QVV9DQVBfSU5UTEcpKSB7IC8qIE5vIGludGVsbGlnZW50IG1vZGUgKi8KKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtcHU0MDE6IEludGVsbGlnZW50IG1vZGUgbm90IHN1cHBvcnRlZCBieSB0aGUgSFdcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKGdldF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc2V0X3VhcnRfbW9kZShkZXYsIGRldmMsICF2YWwpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfTUlESV9NUFVDTUQ6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJnJlYywgYXJnLCBzaXplb2YocmVjKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoKHJldCA9IG1wdTQwMV9jb21tYW5kKGRldiwgJnJlYykpIDwgMCkKKwkJCQlyZXR1cm4gcmV0OworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZyZWMsIHNpemVvZihyZWMpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG1wdTQwMV9raWNrKGludCBkZXYpCit7Cit9CisKK3N0YXRpYyBpbnQgbXB1NDAxX2J1ZmZlcl9zdGF0dXMoaW50IGRldikKK3sKKwlyZXR1cm4gMDsJCS8qCisJCQkJICogTm8gZGF0YSBpbiBidWZmZXJzCisJCQkJICovCit9CisKK3N0YXRpYyBpbnQgbXB1X3N5bnRoX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IG1pZGlfZGV2OworCXN0cnVjdCBtcHVfY29uZmlnICpkZXZjOworCisJbWlkaV9kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCisJaWYgKG1pZGlfZGV2IDwgMCB8fCBtaWRpX2RldiA+IG51bV9taWRpcyB8fCBtaWRpX2RldnNbbWlkaV9kZXZdID09IE5VTEwpCisJCXJldHVybiAtRU5YSU87CisKKwlkZXZjID0gJmRldl9jb25mW21pZGlfZGV2XTsKKworCXN3aXRjaCAoY21kKQorCXsKKworCQljYXNlIFNORENUTF9TWU5USF9JTkZPOgorCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZtcHVfc3ludGhfaW5mb1ttaWRpX2Rldl0sCisJCQkJCXNpemVvZihzdHJ1Y3Qgc3ludGhfaW5mbykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfU1lOVEhfTUVNQVZMOgorCQkJcmV0dXJuIDB4N2ZmZmZmZmY7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBtcHVfc3ludGhfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlpbnQgbWlkaV9kZXYsIGVycjsKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YzsKKwlzdHJ1Y3QgY29wcm9jX29wZXJhdGlvbnMgKmNvcHJvY2Vzc29yOworCisJbWlkaV9kZXYgPSBzeW50aF9kZXZzW2Rldl0tPm1pZGlfZGV2OworCisJaWYgKG1pZGlfZGV2IDwgMCB8fCBtaWRpX2RldiA+IG51bV9taWRpcyB8fCBtaWRpX2RldnNbbWlkaV9kZXZdID09IE5VTEwpCisJCXJldHVybiAtRU5YSU87CisKKwlkZXZjID0gJmRldl9jb25mW21pZGlfZGV2XTsKKworCS8qCisJICogIFZlcmlmeSB0aGF0IHRoZSBkZXZpY2UgaXMgcmVhbGx5IHJ1bm5pbmcuCisJICogIFNvbWUgZGV2aWNlcyAoc3VjaCBhcyBFbnNvbmlxIFNvdW5kU2NhcGUgZG9uJ3QKKwkgKiAgd29yayBiZWZvcmUgdGhlIG9uIGJvYXJkIHByb2Nlc3NvciAoT0JQKSBpcyBpbml0aWFsaXplZAorCSAqICBieSBkb3dubG9hZGluZyBpdHMgbWljcm9jb2RlLgorCSAqLworCisJaWYgKCFkZXZjLT5pbml0aWFsaXplZCkKKwl7CisJCWlmIChtcHU0MDFfc3RhdHVzKGRldmMpID09IDB4ZmYpCS8qIEJ1cyBmbG9hdCAqLworCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIm1wdTQwMTogRGV2aWNlIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCQlyZXNldF9tcHU0MDEoZGV2Yyk7CisJfQorCWlmIChkZXZjLT5vcGVuZWQpCisJCXJldHVybiAtRUJVU1k7CisJZGV2Yy0+bW9kZSA9IE1PREVfU1lOVEg7CisJZGV2Yy0+c3ludGhubyA9IGRldjsKKworCWRldmMtPmlucHV0aW50ciA9IE5VTEw7CisKKwljb3Byb2Nlc3NvciA9IG1pZGlfZGV2c1ttaWRpX2Rldl0tPmNvcHJvYzsKKwlpZiAoY29wcm9jZXNzb3IpIHsKKwkJaWYgKCF0cnlfbW9kdWxlX2dldChjb3Byb2Nlc3Nvci0+b3duZXIpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJaWYgKChlcnIgPSBjb3Byb2Nlc3Nvci0+b3Blbihjb3Byb2Nlc3Nvci0+ZGV2YywgQ09QUl9NSURJKSkgPCAwKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJtcHU0MDE6IENhbid0IGFjY2VzcyBjb3Byb2Nlc3NvciBkZXZpY2VcbiIpOworCQkJcmV0dXJuIGVycjsKKwkJfQorCX0KKwlkZXZjLT5vcGVuZWQgPSBtb2RlOworCXJlc2V0X21wdTQwMShkZXZjKTsKKworCWlmIChtb2RlICYgT1BFTl9SRUFEKQorCXsKKwkJbXB1X2NtZChtaWRpX2RldiwgMHg4QiwgMCk7CS8qIEVuYWJsZSBkYXRhIGluIHN0b3AgbW9kZSAqLworCQltcHVfY21kKG1pZGlfZGV2LCAweDM0LCAwKTsJLyogUmV0dXJuIHRpbWluZyBieXRlcyBpbiBzdG9wIG1vZGUgKi8KKwkJbXB1X2NtZChtaWRpX2RldiwgMHg4NywgMCk7CS8qIEVuYWJsZSBwaXRjaCAmIGNvbnRyb2xsZXIgKi8KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG1wdV9zeW50aF9jbG9zZShpbnQgZGV2KQoreyAKKwlpbnQgbWlkaV9kZXY7CisJc3RydWN0IG1wdV9jb25maWcgKmRldmM7CisJc3RydWN0IGNvcHJvY19vcGVyYXRpb25zICpjb3Byb2Nlc3NvcjsKKworCW1pZGlfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKworCWRldmMgPSAmZGV2X2NvbmZbbWlkaV9kZXZdOworCW1wdV9jbWQobWlkaV9kZXYsIDB4MTUsIDApOwkvKiBTdG9wIHJlY29yZGluZywgcGxheWJhY2sgYW5kIE1JREkgKi8KKwltcHVfY21kKG1pZGlfZGV2LCAweDhhLCAwKTsJLyogRGlzYWJsZSBkYXRhIGluIHN0b3BwZWQgbW9kZSAqLworCisJZGV2Yy0+aW5wdXRpbnRyID0gTlVMTDsKKworCWNvcHJvY2Vzc29yID0gbWlkaV9kZXZzW21pZGlfZGV2XS0+Y29wcm9jOworCWlmIChjb3Byb2Nlc3NvcikgeworCQljb3Byb2Nlc3Nvci0+Y2xvc2UoY29wcm9jZXNzb3ItPmRldmMsIENPUFJfTUlESSk7CisJCW1vZHVsZV9wdXQoY29wcm9jZXNzb3ItPm93bmVyKTsKKwl9CisJZGV2Yy0+b3BlbmVkID0gMDsKKwlkZXZjLT5tb2RlID0gMDsKK30KKworI2RlZmluZSBNSURJX1NZTlRIX05BTUUJIk1QVS00MDEgVUFSVCBNaWRpIgorI2RlZmluZSBNSURJX1NZTlRIX0NBUFMJU1lOVEhfQ0FQX0lOUFVUCisjaW5jbHVkZSAibWlkaV9zeW50aC5oIgorCitzdGF0aWMgc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgbXB1NDAxX3N5bnRoX3Byb3RvID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmlkCQk9ICJNUFU0MDEiLAorCS5pbmZvCQk9IE5VTEwsCisJLm1pZGlfZGV2CT0gMCwKKwkuc3ludGhfdHlwZQk9IFNZTlRIX1RZUEVfTUlESSwKKwkuc3ludGhfc3VidHlwZQk9IDAsCisJLm9wZW4JCT0gbXB1X3N5bnRoX29wZW4sCisJLmNsb3NlCQk9IG1wdV9zeW50aF9jbG9zZSwKKwkuaW9jdGwJCT0gbXB1X3N5bnRoX2lvY3RsLAorCS5raWxsX25vdGUJPSBtaWRpX3N5bnRoX2tpbGxfbm90ZSwKKwkuc3RhcnRfbm90ZQk9IG1pZGlfc3ludGhfc3RhcnRfbm90ZSwKKwkuc2V0X2luc3RyCT0gbWlkaV9zeW50aF9zZXRfaW5zdHIsCisJLnJlc2V0CQk9IG1pZGlfc3ludGhfcmVzZXQsCisJLmh3X2NvbnRyb2wJPSBtaWRpX3N5bnRoX2h3X2NvbnRyb2wsCisJLmxvYWRfcGF0Y2gJPSBtaWRpX3N5bnRoX2xvYWRfcGF0Y2gsCisJLmFmdGVydG91Y2gJPSBtaWRpX3N5bnRoX2FmdGVydG91Y2gsCisJLmNvbnRyb2xsZXIJPSBtaWRpX3N5bnRoX2NvbnRyb2xsZXIsCisJLnBhbm5pbmcJPSBtaWRpX3N5bnRoX3Bhbm5pbmcsCisJLmJlbmRlcgkJPSBtaWRpX3N5bnRoX2JlbmRlciwKKwkuc2V0dXBfdm9pY2UJPSBtaWRpX3N5bnRoX3NldHVwX3ZvaWNlLAorCS5zZW5kX3N5c2V4CT0gbWlkaV9zeW50aF9zZW5kX3N5c2V4Cit9OworCitzdGF0aWMgc3RydWN0IHN5bnRoX29wZXJhdGlvbnMgKm1wdTQwMV9zeW50aF9vcGVyYXRpb25zW01BWF9NSURJX0RFVl07CisKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIG1wdTQwMV9taWRpX3Byb3RvID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmluZm8JCT0geyJNUFUtNDAxIE1pZGkiLCAwLCBNSURJX0NBUF9NUFU0MDEsIFNORENBUkRfTVBVNDAxfSwKKwkuaW5faW5mbwk9IHswfSwKKwkub3BlbgkJPSBtcHU0MDFfb3BlbiwKKwkuY2xvc2UJCT0gbXB1NDAxX2Nsb3NlLAorCS5pb2N0bAkJPSBtcHU0MDFfaW9jdGwsCisJLm91dHB1dGMJPSBtcHU0MDFfb3V0LAorCS5zdGFydF9yZWFkCT0gbXB1NDAxX3N0YXJ0X3JlYWQsCisJLmVuZF9yZWFkCT0gbXB1NDAxX2VuZF9yZWFkLAorCS5raWNrCQk9IG1wdTQwMV9raWNrLAorCS5idWZmZXJfc3RhdHVzCT0gbXB1NDAxX2J1ZmZlcl9zdGF0dXMsCisJLnByZWZpeF9jbWQJPSBtcHU0MDFfcHJlZml4X2NtZAorfTsKKworc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgbXB1NDAxX21pZGlfb3BlcmF0aW9uc1tNQVhfTUlESV9ERVZdOworCitzdGF0aWMgdm9pZCBtcHU0MDFfY2hrX3ZlcnNpb24oaW50IG4sIHN0cnVjdCBtcHVfY29uZmlnICpkZXZjKQoreworCWludCB0bXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldmMtPnZlcnNpb24gPSBkZXZjLT5yZXZpc2lvbiA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJaWYgKCh0bXAgPSBtcHVfY21kKG4sIDB4QUMsIDApKSA8IDApCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHRtcCAmIDB4ZjApID4gMHgyMCkJLyogV2h5IGl0J3MgbGFyZ2VyIHRoYW4gMi54ID8/PyAqLworCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCXJldHVybjsKKwl9CisJZGV2Yy0+dmVyc2lvbiA9IHRtcDsKKworCWlmICgodG1wID0gbXB1X2NtZChuLCAweEFELCAwKSkgPCAwKQorCXsKKwkJZGV2Yy0+dmVyc2lvbiA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWRldmMtPnJldmlzaW9uID0gdG1wOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitpbnQgYXR0YWNoX21wdTQwMShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJY2hhciByZXZpc2lvbl9jaGFyOworCisJaW50IG0sIHJldDsKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YzsKKworCWh3X2NvbmZpZy0+c2xvdHNbMV0gPSAtMTsKKwltID0gc291bmRfYWxsb2NfbWlkaWRldigpOworCWlmIChtID09IC0xKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTVBVLTQwMTogVG9vIG1hbnkgbWlkaSBkZXZpY2VzIGRldGVjdGVkXG4iKTsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlkZXZjID0gJmRldl9jb25mW21dOworCWRldmMtPmJhc2UgPSBod19jb25maWctPmlvX2Jhc2U7CisJZGV2Yy0+b3NwID0gaHdfY29uZmlnLT5vc3A7CisJZGV2Yy0+aXJxID0gaHdfY29uZmlnLT5pcnE7CisJZGV2Yy0+b3BlbmVkID0gMDsKKwlkZXZjLT51YXJ0X21vZGUgPSAwOworCWRldmMtPmluaXRpYWxpemVkID0gMDsKKwlkZXZjLT52ZXJzaW9uID0gMDsKKwlkZXZjLT5yZXZpc2lvbiA9IDA7CisJZGV2Yy0+Y2FwYWJpbGl0aWVzID0gMDsKKwlkZXZjLT50aW1lcl9mbGFnID0gMDsKKwlkZXZjLT5tX2J1c3kgPSAwOworCWRldmMtPm1fc3RhdGUgPSBTVF9JTklUOworCWRldmMtPnNoYXJlZF9pcnEgPSBod19jb25maWctPmFsd2F5c19kZXRlY3Q7CisJZGV2Yy0+aXJxID0gaHdfY29uZmlnLT5pcnE7CisJc3Bpbl9sb2NrX2luaXQoJmRldmMtPmxvY2spOworCisJaWYgKGRldmMtPmlycSA8IDApCisJeworCQlkZXZjLT5pcnEgKj0gLTE7CisJCWRldmMtPnNoYXJlZF9pcnEgPSAxOworCX0KKworCWlmICghaHdfY29uZmlnLT5hbHdheXNfZGV0ZWN0KQorCXsKKwkJLyogVmVyaWZ5IHRoZSBoYXJkd2FyZSBhZ2FpbiAqLworCQlpZiAoIXJlc2V0X21wdTQwMShkZXZjKSkKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBEZXZpY2UgZGlkbid0IHJlc3BvbmRcbiIpOworCQkJcmV0ID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0X21pZGlkZXY7CisJCX0KKwkJaWYgKCFkZXZjLT5zaGFyZWRfaXJxKQorCQl7CisJCQlpZiAocmVxdWVzdF9pcnEoZGV2Yy0+aXJxLCBtcHVpbnRyLCAwLCAibXB1NDAxIiwgKHZvaWQgKiltKSA8IDApCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBGYWlsZWQgdG8gYWxsb2NhdGUgSVJRJWRcbiIsIGRldmMtPmlycSk7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlnb3RvIG91dF9taWRpZGV2OworCQkJfQorCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJbXB1NDAxX2Noa192ZXJzaW9uKG0sIGRldmMpOworCQlpZiAoZGV2Yy0+dmVyc2lvbiA9PSAwKQorCQkJbXB1NDAxX2Noa192ZXJzaW9uKG0sIGRldmMpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJfQorCisJaWYgKGRldmMtPnZlcnNpb24gIT0gMCkKKwkJaWYgKG1wdV9jbWQobSwgMHhDNSwgMCkgPj0gMCkJLyogU2V0IHRpbWViYXNlIE9LICovCisJCQlpZiAobXB1X2NtZChtLCAweEUwLCAxMjApID49IDApCQkvKiBTZXQgdGVtcG8gT0sgKi8KKwkJCQlkZXZjLT5jYXBhYmlsaXRpZXMgfD0gTVBVX0NBUF9JTlRMRzsJLyogU3VwcG9ydHMgaW50ZWxsaWdlbnQgbW9kZSAqLworCisKKwltcHU0MDFfc3ludGhfb3BlcmF0aW9uc1ttXSA9IChzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyAqKWttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7CisKKwlpZiAobXB1NDAxX3N5bnRoX29wZXJhdGlvbnNbbV0gPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAibXB1NDAxOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlyZXQgPSAtRU5PTUVNOworCQlnb3RvIG91dF9pcnE7CisJfQorCWlmICghKGRldmMtPmNhcGFiaWxpdGllcyAmIE1QVV9DQVBfSU5UTEcpKQkvKiBObyBpbnRlbGxpZ2VudCBtb2RlICovCisJeworCQltZW1jcHkoKGNoYXIgKikgbXB1NDAxX3N5bnRoX29wZXJhdGlvbnNbbV0sCisJCQkoY2hhciAqKSAmc3RkX21pZGlfc3ludGgsCisJCQkgc2l6ZW9mKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zKSk7CisJfQorCWVsc2UKKwl7CisJCW1lbWNweSgoY2hhciAqKSBtcHU0MDFfc3ludGhfb3BlcmF0aW9uc1ttXSwKKwkJCShjaGFyICopICZtcHU0MDFfc3ludGhfcHJvdG8sCisJCQkgc2l6ZW9mKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zKSk7CisJfQorCWlmIChvd25lcikKKwkJbXB1NDAxX3N5bnRoX29wZXJhdGlvbnNbbV0tPm93bmVyID0gb3duZXI7CisKKwltZW1jcHkoKGNoYXIgKikgJm1wdTQwMV9taWRpX29wZXJhdGlvbnNbbV0sCisJICAgICAgIChjaGFyICopICZtcHU0MDFfbWlkaV9wcm90bywKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpKTsKKworCW1wdTQwMV9taWRpX29wZXJhdGlvbnNbbV0uY29udmVydGVyID0gbXB1NDAxX3N5bnRoX29wZXJhdGlvbnNbbV07CisKKwltZW1jcHkoKGNoYXIgKikgJm1wdV9zeW50aF9pbmZvW21dLAorCSAgICAgICAoY2hhciAqKSAmbXB1X3N5bnRoX2luZm9fcHJvdG8sCisJICAgICAgIHNpemVvZihzdHJ1Y3Qgc3ludGhfaW5mbykpOworCisJbl9tcHVfZGV2cysrOworCisJaWYgKGRldmMtPnZlcnNpb24gPT0gMHgyMCAmJiBkZXZjLT5yZXZpc2lvbiA+PSAweDA3KQkvKiBNdXNpY1F1ZXN0IGludGVyZmFjZSAqLworCXsKKwkJaW50IHBvcnRzID0gKGRldmMtPnJldmlzaW9uICYgMHgwOCkgPyAzMiA6IDE2OworCisJCWRldmMtPmNhcGFiaWxpdGllcyB8PSBNUFVfQ0FQX1NZTkMgfCBNUFVfQ0FQX1NNUFRFIHwKKwkJCQlNUFVfQ0FQX0NMUyB8IE1QVV9DQVBfMlBPUlQ7CisKKwkJcmV2aXNpb25fY2hhciA9IChkZXZjLT5yZXZpc2lvbiA9PSAweDdmKSA/ICdNJyA6ICcgJzsKKwkJc3ByaW50ZihtcHVfc3ludGhfaW5mb1ttXS5uYW1lLCAiTVFYLSVkJWMgTUlESSBJbnRlcmZhY2UgIyVkIiwKKwkJCQlwb3J0cywKKwkJCQlyZXZpc2lvbl9jaGFyLAorCQkJCW5fbXB1X2RldnMpOworCX0KKwllbHNlCisJeworCQlyZXZpc2lvbl9jaGFyID0gZGV2Yy0+cmV2aXNpb24gPyBkZXZjLT5yZXZpc2lvbiArICdAJyA6ICcgJzsKKwkJaWYgKChpbnQpIGRldmMtPnJldmlzaW9uID4gKCdaJyAtICdAJykpCisJCQlyZXZpc2lvbl9jaGFyID0gJysnOworCisJCWRldmMtPmNhcGFiaWxpdGllcyB8PSBNUFVfQ0FQX1NZTkMgfCBNUFVfQ0FQX0ZTSzsKKworCQlpZiAoaHdfY29uZmlnLT5uYW1lKQorCQkJc3ByaW50ZihtcHVfc3ludGhfaW5mb1ttXS5uYW1lLCAiJXMgKE1QVTQwMSkiLCBod19jb25maWctPm5hbWUpOworCQllbHNlCisJCQlzcHJpbnRmKG1wdV9zeW50aF9pbmZvW21dLm5hbWUsCisJCQkJIk1QVS00MDEgJWQuJWQlYyBNaWRpIGludGVyZmFjZSAjJWQiLAorCQkJCShpbnQpIChkZXZjLT52ZXJzaW9uICYgMHhmMCkgPj4gNCwKKwkJCQlkZXZjLT52ZXJzaW9uICYgMHgwZiwKKwkJCQlyZXZpc2lvbl9jaGFyLAorCQkJCW5fbXB1X2RldnMpOworCX0KKworCXN0cmNweShtcHU0MDFfbWlkaV9vcGVyYXRpb25zW21dLmluZm8ubmFtZSwKKwkgICAgICAgbXB1X3N5bnRoX2luZm9bbV0ubmFtZSk7CisKKwljb25mX3ByaW50ZihtcHVfc3ludGhfaW5mb1ttXS5uYW1lLCBod19jb25maWcpOworCisJbXB1NDAxX3N5bnRoX29wZXJhdGlvbnNbbV0tPm1pZGlfZGV2ID0gZGV2Yy0+ZGV2bm8gPSBtOworCW1wdTQwMV9zeW50aF9vcGVyYXRpb25zW2RldmMtPmRldm5vXS0+aW5mbyA9ICZtcHVfc3ludGhfaW5mb1tkZXZjLT5kZXZub107CisKKwlpZiAoZGV2Yy0+Y2FwYWJpbGl0aWVzICYgTVBVX0NBUF9JTlRMRykJCS8qIEludGVsbGlnZW50IG1vZGUgKi8KKwkJaHdfY29uZmlnLT5zbG90c1syXSA9IG1wdV90aW1lcl9pbml0KG0pOworCisJbWlkaV9kZXZzW21dID0gJm1wdTQwMV9taWRpX29wZXJhdGlvbnNbZGV2Yy0+ZGV2bm9dOworCQorCWlmIChvd25lcikKKwkJbWlkaV9kZXZzW21dLT5vd25lciA9IG93bmVyOworCisJaHdfY29uZmlnLT5zbG90c1sxXSA9IG07CisJc2VxdWVuY2VyX2luaXQoKTsKKwkKKwlyZXR1cm4gMDsKKworb3V0X2lycToKKwlmcmVlX2lycShkZXZjLT5pcnEsICh2b2lkICopbSk7CitvdXRfbWlkaWRldjoKKwlzb3VuZF91bmxvYWRfbWlkaWRldihtKTsKK291dF9lcnI6CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHJlc2V0X21wdTQwMShzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBvaywgdGltZW91dCwgbjsKKwlpbnQgdGltZW91dF9saW1pdDsKKworCS8qCisJICogU2VuZCB0aGUgUkVTRVQgY29tbWFuZC4gVHJ5IGFnYWluIGlmIG5vIHN1Y2Nlc3MgYXQgdGhlIGZpcnN0IHRpbWUuCisJICogKElmIHRoZSBkZXZpY2UgaXMgaW4gdGhlIFVBUlQgbW9kZSwgaXQgd2lsbCBub3QgYWNrIHRoZSByZXNldCBjbWQpLgorCSAqLworCisJb2sgPSAwOworCisJdGltZW91dF9saW1pdCA9IGRldmMtPmluaXRpYWxpemVkID8gMzAwMDAgOiAxMDAwMDA7CisJZGV2Yy0+aW5pdGlhbGl6ZWQgPSAxOworCisJZm9yIChuID0gMDsgbiA8IDIgJiYgIW9rOyBuKyspCisJeworCQlmb3IgKHRpbWVvdXQgPSB0aW1lb3V0X2xpbWl0OyB0aW1lb3V0ID4gMCAmJiAhb2s7IHRpbWVvdXQtLSkKKwkJCSAgb2sgPSBvdXRwdXRfcmVhZHkoZGV2Yyk7CisKKwkJd3JpdGVfY29tbWFuZChkZXZjLCBNUFVfUkVTRVQpOwkvKgorCQkJCQkJCSAgICogU2VuZCBNUFUtNDAxIFJFU0VUIENvbW1hbmQKKwkJCQkJCQkgKi8KKworCQkvKgorCQkgKiBXYWl0IGF0IGxlYXN0IDI1IG1zZWMuIFRoaXMgbWV0aG9kIGlzIG5vdCBhY2N1cmF0ZSBzbyBsZXQncyBtYWtlIHRoZQorCQkgKiBsb29wIGJpdCBsb25nZXIuIENhbm5vdCBzbGVlcCBzaW5jZSB0aGlzIGlzIGNhbGxlZCBkdXJpbmcgYm9vdC4KKwkJICovCisKKwkJZm9yICh0aW1lb3V0ID0gdGltZW91dF9saW1pdCAqIDI7IHRpbWVvdXQgPiAwICYmICFvazsgdGltZW91dC0tKQorCQl7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCQlpZiAoaW5wdXRfYXZhaWwoZGV2YykpCisJCQkJaWYgKHJlYWRfZGF0YShkZXZjKSA9PSBNUFVfQUNLKQorCQkJCQlvayA9IDE7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJfQorCisJfQorCisJZGV2Yy0+bV9zdGF0ZSA9IFNUX0lOSVQ7CisJZGV2Yy0+bV9wdHIgPSAwOworCWRldmMtPm1fbGVmdCA9IDA7CisJZGV2Yy0+bGFzdF9zdGF0dXMgPSAwOworCWRldmMtPnVhcnRfbW9kZSA9IDA7CisKKwlyZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIHNldF91YXJ0X21vZGUoaW50IGRldiwgc3RydWN0IG1wdV9jb25maWcgKmRldmMsIGludCBhcmcpCit7CisJaWYgKCFhcmcgJiYgKGRldmMtPmNhcGFiaWxpdGllcyAmIE1QVV9DQVBfSU5UTEcpKQorCQlyZXR1cm47CisJaWYgKChkZXZjLT51YXJ0X21vZGUgPT0gMCkgPT0gKGFyZyA9PSAwKSkKKwkJcmV0dXJuOwkJLyogQWxyZWFkeSBzZXQgKi8KKwlyZXNldF9tcHU0MDEoZGV2Yyk7CS8qIFRoaXMgZXhpdHMgdGhlIHVhcnQgbW9kZSAqLworCisJaWYgKGFyZykKKwl7CisJCWlmIChtcHVfY21kKGRldiwgVUFSVF9NT0RFX09OLCAwKSA8IDApCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAibXB1NDAxOiBDYW4ndCBlbnRlciBVQVJUIG1vZGVcbiIpOworCQkJZGV2Yy0+dWFydF9tb2RlID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlkZXZjLT51YXJ0X21vZGUgPSBhcmc7CisKK30KKworaW50IHByb2JlX21wdTQwMShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCByZXNvdXJjZSAqcG9ydHMpCit7CisJaW50IG9rID0gMDsKKwlzdHJ1Y3QgbXB1X2NvbmZpZyB0bXBfZGV2YzsKKworCXRtcF9kZXZjLmJhc2UgPSBod19jb25maWctPmlvX2Jhc2U7CisJdG1wX2RldmMuaXJxID0gaHdfY29uZmlnLT5pcnE7CisJdG1wX2RldmMuaW5pdGlhbGl6ZWQgPSAwOworCXRtcF9kZXZjLm9wZW5lZCA9IDA7CisJdG1wX2RldmMub3NwID0gaHdfY29uZmlnLT5vc3A7CisKKwlpZiAoaHdfY29uZmlnLT5hbHdheXNfZGV0ZWN0KQorCQlyZXR1cm4gMTsKKworCWlmIChpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgMSkgPT0gMHhmZikKKwl7CisJCUREQihwcmludGsoIk1QVTQwMTogUG9ydCAleCBsb29rcyBkZWFkLlxuIiwgaHdfY29uZmlnLT5pb19iYXNlKSk7CisJCXJldHVybiAwOwkvKiBKdXN0IGJ1cyBmbG9hdD8gKi8KKwl9CisJb2sgPSByZXNldF9tcHU0MDEoJnRtcF9kZXZjKTsKKworCWlmICghb2spCisJeworCQlEREIocHJpbnRrKCJNUFU0MDE6IFJlc2V0IGZhaWxlZCBvbiBwb3J0ICV4XG4iLCBod19jb25maWctPmlvX2Jhc2UpKTsKKwl9CisJcmV0dXJuIG9rOworfQorCit2b2lkIHVubG9hZF9tcHU0MDEoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXZvaWQgKnA7CisJaW50IG49aHdfY29uZmlnLT5zbG90c1sxXTsKKwkJCisJaWYgKG4gIT0gLTEpIHsKKwkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyKTsKKwkJaWYgKGh3X2NvbmZpZy0+YWx3YXlzX2RldGVjdCA9PSAwICYmIGh3X2NvbmZpZy0+aXJxID4gMCkKKwkJCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCAodm9pZCAqKW4pOworCQlwPW1wdTQwMV9zeW50aF9vcGVyYXRpb25zW25dOworCQlzb3VuZF91bmxvYWRfbWlkaWRldihuKTsKKwkJc291bmRfdW5sb2FkX3RpbWVyZGV2KGh3X2NvbmZpZy0+c2xvdHNbMl0pOworCQlpZihwKQorCQkJa2ZyZWUocCk7CisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgVGltZXIgc3R1ZmYKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgdm9sYXRpbGUgaW50IHRpbWVyX2luaXRpYWxpemVkID0gMCwgdGltZXJfb3BlbiA9IDAsIHRtcl9ydW5uaW5nID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgY3Vycl90ZW1wbywgY3Vycl90aW1lYmFzZSwgaHdfdGltZWJhc2U7CitzdGF0aWMgaW50ICAgICAgbWF4X3RpbWViYXNlID0gODsJLyogOCoyND0xOTIgcHBxbiAqLworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbmV4dF9ldmVudF90aW1lOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgY3Vycl90aWNrcywgY3Vycl9jbG9ja3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X2V2ZW50X3RpbWU7CitzdGF0aWMgaW50ICAgICAgbWV0cm9ub21lX21vZGU7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNsb2NrczJ0aWNrcyh1bnNpZ25lZCBsb25nIGNsb2NrcykKK3sKKwkvKgorCSAqIFRoZSBNUFUtNDAxIHN1cHBvcnRzIGp1c3QgYSBsaW1pdGVkIHNldCBvZiBwb3NzaWJsZSB0aW1lYmFzZSB2YWx1ZXMuCisJICogU2luY2UgdGhlIGFwcGxpY2F0aW9ucyByZXF1aXJlIG1vcmUgY2hvaWNlcywgdGhlIGRyaXZlciBoYXMgdG8KKwkgKiBwcm9ncmFtIHRoZSBIVyB0byBkbyBpdHMgYmVzdCBhbmQgdG8gY29udmVydCBiZXR3ZWVuIHRoZSBIVyBhbmQKKwkgKiBhY3R1YWwgdGltZWJhc2VzLgorCSAqLworCXJldHVybiAoKGNsb2NrcyAqIGN1cnJfdGltZWJhc2UpICsgKGh3X3RpbWViYXNlIC8gMikpIC8gaHdfdGltZWJhc2U7Cit9CisKK3N0YXRpYyB2b2lkIHNldF90aW1lYmFzZShpbnQgbWlkaV9kZXYsIGludCB2YWwpCit7CisJaW50IGh3X3ZhbDsKKworCWlmICh2YWwgPCA0OCkKKwkJdmFsID0gNDg7CisJaWYgKHZhbCA+IDEwMDApCisJCXZhbCA9IDEwMDA7CisKKwlod192YWwgPSB2YWw7CisJaHdfdmFsID0gKGh3X3ZhbCArIDEyKSAvIDI0OworCWlmIChod192YWwgPiBtYXhfdGltZWJhc2UpCisJCWh3X3ZhbCA9IG1heF90aW1lYmFzZTsKKworCWlmIChtcHVfY21kKG1pZGlfZGV2LCAweEMwIHwgKGh3X3ZhbCAmIDB4MGYpLCAwKSA8IDApCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJtcHU0MDE6IENhbid0IHNldCBIVyB0aW1lYmFzZSB0byAlZFxuIiwgaHdfdmFsICogMjQpOworCQlyZXR1cm47CisJfQorCWh3X3RpbWViYXNlID0gaHdfdmFsICogMjQ7CisJY3Vycl90aW1lYmFzZSA9IHZhbDsKKworfQorCitzdGF0aWMgdm9pZCB0bXJfcmVzZXQoc3RydWN0IG1wdV9jb25maWcgKmRldmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwluZXh0X2V2ZW50X3RpbWUgPSAodW5zaWduZWQgbG9uZykgLTE7CisJcHJldl9ldmVudF90aW1lID0gMDsKKwljdXJyX3RpY2tzID0gY3Vycl9jbG9ja3MgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzZXRfdGltZXJfbW9kZShpbnQgbWlkaV9kZXYpCit7CisJaWYgKHRpbWVyX21vZGUgJiBUTVJfTU9ERV9DTFMpCisJCW1wdV9jbWQobWlkaV9kZXYsIDB4M2MsIDApOwkvKiBVc2UgQ0xTIHN5bmMgKi8KKwllbHNlIGlmICh0aW1lcl9tb2RlICYgVE1SX01PREVfU01QVEUpCisJCW1wdV9jbWQobWlkaV9kZXYsIDB4M2QsIDApOwkvKiBVc2UgU01QVEUgc3luYyAqLworCisJaWYgKHRpbWVyX21vZGUgJiBUTVJfSU5URVJOQUwpCisJeworCQkgIG1wdV9jbWQobWlkaV9kZXYsIDB4ODAsIDApOwkvKiBVc2UgTUlESSBzeW5jICovCisJfQorCWVsc2UKKwl7CisJCWlmICh0aW1lcl9tb2RlICYgKFRNUl9NT0RFX01JREkgfCBUTVJfTU9ERV9DTFMpKQorCQl7CisJCQltcHVfY21kKG1pZGlfZGV2LCAweDgyLCAwKTsJCS8qIFVzZSBNSURJIHN5bmMgKi8KKwkJCW1wdV9jbWQobWlkaV9kZXYsIDB4OTEsIDApOwkJLyogRW5hYmxlIGV4dCBNSURJIGN0cmwgKi8KKwkJfQorCQllbHNlIGlmICh0aW1lcl9tb2RlICYgVE1SX01PREVfRlNLKQorCQkJbXB1X2NtZChtaWRpX2RldiwgMHg4MSwgMCk7CS8qIFVzZSBGU0sgc3luYyAqLworCX0KK30KKworc3RhdGljIHZvaWQgc3RvcF9tZXRyb25vbWUoaW50IG1pZGlfZGV2KQoreworCW1wdV9jbWQobWlkaV9kZXYsIDB4ODQsIDApOwkvKiBEaXNhYmxlIG1ldHJvbm9tZSAqLworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9tZXRyb25vbWUoaW50IG1pZGlfZGV2KQoreworCWludCBudW1lcmF0b3IsIGRlbm9taW5hdG9yOworCWludCBjbGtzX3Blcl9jbGljaywgbnVtXzMybmRzX3Blcl9iZWF0OworCWludCBiZWF0c19wZXJfbWVhc3VyZTsKKworCW51bWVyYXRvciA9ICgodW5zaWduZWQpIG1ldHJvbm9tZV9tb2RlID4+IDI0KSAmIDB4ZmY7CisJZGVub21pbmF0b3IgPSAoKHVuc2lnbmVkKSBtZXRyb25vbWVfbW9kZSA+PiAxNikgJiAweGZmOworCWNsa3NfcGVyX2NsaWNrID0gKCh1bnNpZ25lZCkgbWV0cm9ub21lX21vZGUgPj4gOCkgJiAweGZmOworCW51bV8zMm5kc19wZXJfYmVhdCA9ICh1bnNpZ25lZCkgbWV0cm9ub21lX21vZGUgJiAweGZmOworCWJlYXRzX3Blcl9tZWFzdXJlID0gKG51bWVyYXRvciAqIDQpID4+IGRlbm9taW5hdG9yOworCisJaWYgKCFtZXRyb25vbWVfbW9kZSkKKwkJbXB1X2NtZChtaWRpX2RldiwgMHg4NCwgMCk7CS8qIERpc2FibGUgbWV0cm9ub21lICovCisJZWxzZQorCXsKKwkJbXB1X2NtZChtaWRpX2RldiwgMHhFNCwgY2xrc19wZXJfY2xpY2spOworCQltcHVfY21kKG1pZGlfZGV2LCAweEU2LCBiZWF0c19wZXJfbWVhc3VyZSk7CisJCW1wdV9jbWQobWlkaV9kZXYsIDB4ODMsIDApOwkvKiBFbmFibGUgbWV0cm9ub21lIHdpdGhvdXQgYWNjZW50cyAqLworCX0KK30KKworc3RhdGljIGludCBtcHVfc3RhcnRfdGltZXIoaW50IG1pZGlfZGV2KQoreworCXN0cnVjdCBtcHVfY29uZmlnICpkZXZjPSAmZGV2X2NvbmZbbWlkaV9kZXZdOworCisJdG1yX3Jlc2V0KGRldmMpOworCXNldF90aW1lcl9tb2RlKG1pZGlfZGV2KTsKKworCWlmICh0bXJfcnVubmluZykKKwkJcmV0dXJuIFRJTUVSX05PVF9BUk1FRDsJCS8qIEFscmVhZHkgcnVubmluZyAqLworCisJaWYgKHRpbWVyX21vZGUgJiBUTVJfSU5URVJOQUwpCisJeworCQltcHVfY21kKG1pZGlfZGV2LCAweDAyLCAwKTsJLyogU2VuZCBNSURJIHN0YXJ0ICovCisJCXRtcl9ydW5uaW5nID0gMTsKKwkJcmV0dXJuIFRJTUVSX05PVF9BUk1FRDsKKwl9CisJZWxzZQorCXsKKwkJbXB1X2NtZChtaWRpX2RldiwgMHgzNSwgMCk7CS8qIEVuYWJsZSBtb2RlIG1lc3NhZ2VzIHRvIFBDICovCisJCW1wdV9jbWQobWlkaV9kZXYsIDB4MzgsIDApOwkvKiBFbmFibGUgc3lzIGNvbW1vbiBtZXNzYWdlcyB0byBQQyAqLworCQltcHVfY21kKG1pZGlfZGV2LCAweDM5LCAwKTsJLyogRW5hYmxlIHJlYWwgdGltZSBtZXNzYWdlcyB0byBQQyAqLworCQltcHVfY21kKG1pZGlfZGV2LCAweDk3LCAwKTsJLyogRW5hYmxlIHN5c3RlbSBleGNsdXNpdmUgbWVzc2FnZXMgdG8gUEMgKi8KKwl9CisJcmV0dXJuIFRJTUVSX0FSTUVEOworfQorCitzdGF0aWMgaW50IG1wdV90aW1lcl9vcGVuKGludCBkZXYsIGludCBtb2RlKQoreworCWludCBtaWRpX2RldiA9IHNvdW5kX3RpbWVyX2RldnNbZGV2XS0+ZGV2bGluazsKKwlzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2Yz0gJmRldl9jb25mW21pZGlfZGV2XTsKKworCWlmICh0aW1lcl9vcGVuKQorCQlyZXR1cm4gLUVCVVNZOworCisJdG1yX3Jlc2V0KGRldmMpOworCWN1cnJfdGVtcG8gPSA1MDsKKwltcHVfY21kKG1pZGlfZGV2LCAweEUwLCA1MCk7CisJY3Vycl90aW1lYmFzZSA9IGh3X3RpbWViYXNlID0gMTIwOworCXNldF90aW1lYmFzZShtaWRpX2RldiwgMTIwKTsKKwl0aW1lcl9vcGVuID0gMTsKKwltZXRyb25vbWVfbW9kZSA9IDA7CisJc2V0X3RpbWVyX21vZGUobWlkaV9kZXYpOworCisJbXB1X2NtZChtaWRpX2RldiwgMHhlNywgMHgwNCk7CS8qIFNlbmQgYWxsIGNsb2NrcyB0byBob3N0ICovCisJbXB1X2NtZChtaWRpX2RldiwgMHg5NSwgMCk7CS8qIEVuYWJsZSBjbG9jayB0byBob3N0ICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbXB1X3RpbWVyX2Nsb3NlKGludCBkZXYpCit7CisJaW50IG1pZGlfZGV2ID0gc291bmRfdGltZXJfZGV2c1tkZXZdLT5kZXZsaW5rOworCisJdGltZXJfb3BlbiA9IHRtcl9ydW5uaW5nID0gMDsKKwltcHVfY21kKG1pZGlfZGV2LCAweDE1LCAwKTsJLyogU3RvcCBhbGwgKi8KKwltcHVfY21kKG1pZGlfZGV2LCAweDk0LCAwKTsJLyogRGlzYWJsZSBjbG9jayB0byBob3N0ICovCisJbXB1X2NtZChtaWRpX2RldiwgMHg4YywgMCk7CS8qIERpc2FibGUgbWVhc3VyZSBlbmQgbWVzc2FnZXMgdG8gaG9zdCAqLworCXN0b3BfbWV0cm9ub21lKG1pZGlfZGV2KTsKK30KKworc3RhdGljIGludCBtcHVfdGltZXJfZXZlbnQoaW50IGRldiwgdW5zaWduZWQgY2hhciAqZXZlbnQpCit7CisJdW5zaWduZWQgY2hhciBjb21tYW5kID0gZXZlbnRbMV07CisJdW5zaWduZWQgbG9uZyBwYXJtID0gKih1bnNpZ25lZCBpbnQgKikgJmV2ZW50WzRdOworCWludCBtaWRpX2RldiA9IHNvdW5kX3RpbWVyX2RldnNbZGV2XS0+ZGV2bGluazsKKworCXN3aXRjaCAoY29tbWFuZCkKKwl7CisJCWNhc2UgVE1SX1dBSVRfUkVMOgorCQkJcGFybSArPSBwcmV2X2V2ZW50X3RpbWU7CisJCWNhc2UgVE1SX1dBSVRfQUJTOgorCQkJaWYgKHBhcm0gPiAwKQorCQkJeworCQkJCWxvbmcgdGltZTsKKworCQkJCWlmIChwYXJtIDw9IGN1cnJfdGlja3MpCS8qIEl0J3MgdGhlIHRpbWUgKi8KKwkJCQkJcmV0dXJuIFRJTUVSX05PVF9BUk1FRDsKKwkJCQl0aW1lID0gcGFybTsKKwkJCQluZXh0X2V2ZW50X3RpbWUgPSBwcmV2X2V2ZW50X3RpbWUgPSB0aW1lOworCisJCQkJcmV0dXJuIFRJTUVSX0FSTUVEOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfU1RBUlQ6CisJCQlpZiAodG1yX3J1bm5pbmcpCisJCQkJYnJlYWs7CisJCQlyZXR1cm4gbXB1X3N0YXJ0X3RpbWVyKG1pZGlfZGV2KTsKKworCQljYXNlIFRNUl9TVE9QOgorCQkJbXB1X2NtZChtaWRpX2RldiwgMHgwMSwgMCk7CS8qIFNlbmQgTUlESSBzdG9wICovCisJCQlzdG9wX21ldHJvbm9tZShtaWRpX2Rldik7CisJCQl0bXJfcnVubmluZyA9IDA7CisJCQlicmVhazsKKworCQljYXNlIFRNUl9DT05USU5VRToKKwkJCWlmICh0bXJfcnVubmluZykKKwkJCQlicmVhazsKKwkJCW1wdV9jbWQobWlkaV9kZXYsIDB4MDMsIDApOwkvKiBTZW5kIE1JREkgY29udGludWUgKi8KKwkJCXNldHVwX21ldHJvbm9tZShtaWRpX2Rldik7CisJCQl0bXJfcnVubmluZyA9IDE7CisJCQlicmVhazsKKworCQljYXNlIFRNUl9URU1QTzoKKwkJCWlmIChwYXJtKQorCQkJeworCQkJCWlmIChwYXJtIDwgOCkKKwkJCQkJcGFybSA9IDg7CisJCQkgCWlmIChwYXJtID4gMjUwKQorCQkJCQlwYXJtID0gMjUwOworCQkJCWlmIChtcHVfY21kKG1pZGlfZGV2LCAweEUwLCBwYXJtKSA8IDApCisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIm1wdTQwMTogQ2FuJ3Qgc2V0IHRlbXBvIHRvICVkXG4iLCAoaW50KSBwYXJtKTsKKwkJCQljdXJyX3RlbXBvID0gcGFybTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVE1SX0VDSE86CisJCQlzZXFfY29weV90b19pbnB1dChldmVudCwgOCk7CisJCQlicmVhazsKKworCQljYXNlIFRNUl9USU1FU0lHOgorCQkJaWYgKG1ldHJvbm9tZV9tb2RlKQkvKiBNZXRyb25vbWUgZW5hYmxlZCAqLworCQkJeworCQkJCW1ldHJvbm9tZV9tb2RlID0gcGFybTsKKwkJCQlzZXR1cF9tZXRyb25vbWUobWlkaV9kZXYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDo7CisJfQorCXJldHVybiBUSU1FUl9OT1RfQVJNRUQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIG1wdV90aW1lcl9nZXRfdGltZShpbnQgZGV2KQoreworCWlmICghdGltZXJfb3BlbikKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gY3Vycl90aWNrczsKK30KKworc3RhdGljIGludCBtcHVfdGltZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNvbW1hbmQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IG1pZGlfZGV2ID0gc291bmRfdGltZXJfZGV2c1tkZXZdLT5kZXZsaW5rOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCXN3aXRjaCAoY29tbWFuZCkKKwl7CisJCWNhc2UgU05EQ1RMX1RNUl9TT1VSQ0U6CisJCQl7CisJCQkJaW50IHBhcm07CisKKwkJCQlpZiAoZ2V0X3VzZXIocGFybSwgcCkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXBhcm0gJj0gdGltZXJfY2FwczsKKworCQkJCWlmIChwYXJtICE9IDApCisJCQkJeworCQkJCQl0aW1lcl9tb2RlID0gcGFybTsKKwkKKwkJCQkJaWYgKHRpbWVyX21vZGUgJiBUTVJfTU9ERV9DTFMpCisJCQkJCQltcHVfY21kKG1pZGlfZGV2LCAweDNjLCAwKTsJCS8qIFVzZSBDTFMgc3luYyAqLworCQkJCQllbHNlIGlmICh0aW1lcl9tb2RlICYgVE1SX01PREVfU01QVEUpCisJCQkJCQltcHVfY21kKG1pZGlfZGV2LCAweDNkLCAwKTsJCS8qIFVzZSBTTVBURSBzeW5jICovCisJCQkJfQorCQkJCWlmIChwdXRfdXNlcih0aW1lcl9tb2RlLCBwKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmV0dXJuIHRpbWVyX21vZGU7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9UTVJfU1RBUlQ6CisJCQltcHVfc3RhcnRfdGltZXIobWlkaV9kZXYpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfVE1SX1NUT1A6CisJCQl0bXJfcnVubmluZyA9IDA7CisJCQltcHVfY21kKG1pZGlfZGV2LCAweDAxLCAwKTsJLyogU2VuZCBNSURJIHN0b3AgKi8KKwkJCXN0b3BfbWV0cm9ub21lKG1pZGlfZGV2KTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1RNUl9DT05USU5VRToKKwkJCWlmICh0bXJfcnVubmluZykKKwkJCQlyZXR1cm4gMDsKKwkJCXRtcl9ydW5uaW5nID0gMTsKKwkJCW1wdV9jbWQobWlkaV9kZXYsIDB4MDMsIDApOwkvKiBTZW5kIE1JREkgY29udGludWUgKi8KKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1RNUl9USU1FQkFTRToKKwkJCXsKKwkJCQlpbnQgdmFsOworCQkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlpZiAodmFsKQorCQkJCQlzZXRfdGltZWJhc2UobWlkaV9kZXYsIHZhbCk7CisJCQkJaWYgKHB1dF91c2VyKGN1cnJfdGltZWJhc2UsIHApKQorCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQlyZXR1cm4gY3Vycl90aW1lYmFzZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU05EQ1RMX1RNUl9URU1QTzoKKwkJCXsKKwkJCQlpbnQgdmFsOworCQkJCWludCByZXQ7CisKKwkJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCQlpZiAodmFsKQorCQkJCXsKKwkJCQkJaWYgKHZhbCA8IDgpCisJCQkJCQl2YWwgPSA4OworCQkJCQlpZiAodmFsID4gMjUwKQorCQkJCQkJdmFsID0gMjUwOworCQkJCQlpZiAoKHJldCA9IG1wdV9jbWQobWlkaV9kZXYsIDB4RTAsIHZhbCkpIDwgMCkKKwkJCQkJeworCQkJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAibXB1NDAxOiBDYW4ndCBzZXQgdGVtcG8gdG8gJWRcbiIsIChpbnQpIHZhbCk7CisJCQkJCQlyZXR1cm4gcmV0OworCQkJCQl9CisJCQkJCWN1cnJfdGVtcG8gPSB2YWw7CisJCQkJfQorCQkJCWlmIChwdXRfdXNlcihjdXJyX3RlbXBvLCBwKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJcmV0dXJuIGN1cnJfdGVtcG87CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9TRVFfQ1RSTFJBVEU6CisJCQl7CisJCQkJaW50IHZhbDsKKwkJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJCQlpZiAodmFsICE9IDApCQkvKiBDYW4ndCBjaGFuZ2UgKi8KKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJdmFsID0gKChjdXJyX3RlbXBvICogY3Vycl90aW1lYmFzZSkgKyAzMCkvNjA7CisJCQkJaWYgKHB1dF91c2VyKHZhbCwgcCkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXJldHVybiB2YWw7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9TRVFfR0VUVElNRToKKwkJCWlmIChwdXRfdXNlcihjdXJyX3RpY2tzLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiBjdXJyX3RpY2tzOworCisJCWNhc2UgU05EQ1RMX1RNUl9NRVRST05PTUU6CisJCQlpZiAoZ2V0X3VzZXIobWV0cm9ub21lX21vZGUsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc2V0dXBfbWV0cm9ub21lKG1pZGlfZGV2KTsKKwkJCXJldHVybiAwOworCisJCWRlZmF1bHQ6OworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgbXB1X3RpbWVyX2FybShpbnQgZGV2LCBsb25nIHRpbWUpCit7CisJaWYgKHRpbWUgPCAwKQorCQl0aW1lID0gY3Vycl90aWNrcyArIDE7CisJZWxzZSBpZiAodGltZSA8PSBjdXJyX3RpY2tzKQkvKiBJdCdzIHRoZSB0aW1lICovCisJCXJldHVybjsKKwluZXh0X2V2ZW50X3RpbWUgPSBwcmV2X2V2ZW50X3RpbWUgPSB0aW1lOworCXJldHVybjsKK30KKworc3RhdGljIHN0cnVjdCBzb3VuZF90aW1lcl9vcGVyYXRpb25zIG1wdV90aW1lciA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pbmZvCQk9IHsiTVBVLTQwMSBUaW1lciIsIDB9LAorCS5wcmlvcml0eQk9IDEwLAkvKiBQcmlvcml0eSAqLworCS5kZXZsaW5rCT0gMCwJLyogTG9jYWwgZGV2aWNlIGxpbmsgKi8KKwkub3BlbgkJPSBtcHVfdGltZXJfb3BlbiwKKwkuY2xvc2UJCT0gbXB1X3RpbWVyX2Nsb3NlLAorCS5ldmVudAkJPSBtcHVfdGltZXJfZXZlbnQsCisJLmdldF90aW1lCT0gbXB1X3RpbWVyX2dldF90aW1lLAorCS5pb2N0bAkJPSBtcHVfdGltZXJfaW9jdGwsCisJLmFybV90aW1lcgk9IG1wdV90aW1lcl9hcm0KK307CisKK3N0YXRpYyB2b2lkIG1wdV90aW1lcl9pbnRlcnJ1cHQodm9pZCkKK3sKKwlpZiAoIXRpbWVyX29wZW4pCisJCXJldHVybjsKKworCWlmICghdG1yX3J1bm5pbmcpCisJCXJldHVybjsKKworCWN1cnJfY2xvY2tzKys7CisJY3Vycl90aWNrcyA9IGNsb2NrczJ0aWNrcyhjdXJyX2Nsb2Nrcyk7CisKKwlpZiAoY3Vycl90aWNrcyA+PSBuZXh0X2V2ZW50X3RpbWUpCisJeworCQluZXh0X2V2ZW50X3RpbWUgPSAodW5zaWduZWQgbG9uZykgLTE7CisJCXNlcXVlbmNlcl90aW1lcigwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2V4dF9ldmVudChzdHJ1Y3QgbXB1X2NvbmZpZyAqZGV2YywgaW50IGV2ZW50LCBpbnQgcGFybSkKK3sKKwlpbnQgbWlkaV9kZXYgPSBkZXZjLT5kZXZubzsKKworCWlmICghZGV2Yy0+dGltZXJfZmxhZykKKwkJcmV0dXJuOworCisJc3dpdGNoIChldmVudCkKKwl7CisJCWNhc2UgVE1SX0NMT0NLOgorCQkJcHJpbnRrKCI8TUlESSBjbGs+Iik7CisJCQlicmVhazsKKworCQljYXNlIFRNUl9TVEFSVDoKKwkJCXByaW50aygiRXh0IE1JREkgc3RhcnRcbiIpOworCQkJaWYgKCF0bXJfcnVubmluZykKKwkJCXsKKwkJCQlpZiAodGltZXJfbW9kZSAmIFRNUl9FWFRFUk5BTCkKKwkJCQl7CisJCQkJCXRtcl9ydW5uaW5nID0gMTsKKwkJCQkJc2V0dXBfbWV0cm9ub21lKG1pZGlfZGV2KTsKKwkJCQkJbmV4dF9ldmVudF90aW1lID0gMDsKKwkJCQkJU1RPUkUoU0VRX1NUQVJUX1RJTUVSKCkpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVE1SX1NUT1A6CisJCQlwcmludGsoIkV4dCBNSURJIHN0b3BcbiIpOworCQkJaWYgKHRpbWVyX21vZGUgJiBUTVJfRVhURVJOQUwpCisJCQl7CisJCQkJdG1yX3J1bm5pbmcgPSAwOworCQkJCXN0b3BfbWV0cm9ub21lKG1pZGlfZGV2KTsKKwkJCQlTVE9SRShTRVFfU1RPUF9USU1FUigpKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgVE1SX0NPTlRJTlVFOgorCQkJcHJpbnRrKCJFeHQgTUlESSBjb250aW51ZVxuIik7CisJCQlpZiAodGltZXJfbW9kZSAmIFRNUl9FWFRFUk5BTCkKKwkJCXsKKwkJCQl0bXJfcnVubmluZyA9IDE7CisJCQkJc2V0dXBfbWV0cm9ub21lKG1pZGlfZGV2KTsKKwkJCQlTVE9SRShTRVFfQ09OVElOVUVfVElNRVIoKSk7CisJCSAgCX0KKwkJICAJYnJlYWs7CisKKwkJY2FzZSBUTVJfU1BQOgorCQkJcHJpbnRrKCJTb25ncG9zOiAlZFxuIiwgcGFybSk7CisJCQlpZiAodGltZXJfbW9kZSAmIFRNUl9FWFRFUk5BTCkKKwkJCXsKKwkJCQlTVE9SRShTRVFfU09OR1BPUyhwYXJtKSk7CisJCQl9CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbXB1X3RpbWVyX2luaXQoaW50IG1pZGlfZGV2KQoreworCXN0cnVjdCBtcHVfY29uZmlnICpkZXZjOworCWludCBuOworCisJZGV2YyA9ICZkZXZfY29uZlttaWRpX2Rldl07CisKKwlpZiAodGltZXJfaW5pdGlhbGl6ZWQpCisJCXJldHVybiAtMTsJLyogVGhlcmUgaXMgYWxyZWFkeSBhIHNpbWlsYXIgdGltZXIgKi8KKworCXRpbWVyX2luaXRpYWxpemVkID0gMTsKKworCW1wdV90aW1lci5kZXZsaW5rID0gbWlkaV9kZXY7CisJZGV2X2NvbmZbbWlkaV9kZXZdLnRpbWVyX2ZsYWcgPSAxOworCisJbiA9IHNvdW5kX2FsbG9jX3RpbWVyZGV2KCk7CisJaWYgKG4gPT0gLTEpCisJCW4gPSAwOworCXNvdW5kX3RpbWVyX2RldnNbbl0gPSAmbXB1X3RpbWVyOworCisJaWYgKGRldmMtPnZlcnNpb24gPCAweDIwKQkvKiBPcmlnaW5hbCBNUFUtNDAxICovCisJCXRpbWVyX2NhcHMgPSBUTVJfSU5URVJOQUwgfCBUTVJfRVhURVJOQUwgfCBUTVJfTU9ERV9GU0sgfCBUTVJfTU9ERV9NSURJOworCWVsc2UKKwl7CisJCS8qCisJCSAqIFRoZSB2ZXJzaW9uIG51bWJlciAyLjAgaXMgdXNlZCAoYXQgbGVhc3QpIGJ5IHRoZQorCQkgKiBNdXNpY1F1ZXN0IGNhcmRzIGFuZCB0aGUgUm9sYW5kIFN1cGVyLU1QVS4KKwkJICoKKwkJICogTXVzaWNRdWVzdCBoYXMgZ2l2ZW4gYSBzcGVjaWFsIG1lYW5pbmcgdG8gdGhlIGJpdHMgb2YgdGhlCisJCSAqIHJldmlzaW9uIG51bWJlci4gVGhlIFN1cGVyLU1QVSByZXR1cm5zIDAuCisJCSAqLworCisJCWlmIChkZXZjLT5yZXZpc2lvbikKKwkJCXRpbWVyX2NhcHMgfD0gVE1SX0VYVEVSTkFMIHwgVE1SX01PREVfTUlESTsKKworCQlpZiAoZGV2Yy0+cmV2aXNpb24gJiAweDAyKQorCQkJdGltZXJfY2FwcyB8PSBUTVJfTU9ERV9DTFM7CisKKworCQlpZiAoZGV2Yy0+cmV2aXNpb24gJiAweDQwKQorCQkJbWF4X3RpbWViYXNlID0gMTA7CS8qIEhhcyB0aGUgMjE2IGFuZCAyNDAgcHBxbiBtb2RlcyAqLworCX0KKworCXRpbWVyX21vZGUgPSAoVE1SX0lOVEVSTkFMIHwgVE1SX01PREVfTUlESSkgJiB0aW1lcl9jYXBzOworCXJldHVybiBuOworCit9CisKK0VYUE9SVF9TWU1CT0wocHJvYmVfbXB1NDAxKTsKK0VYUE9SVF9TWU1CT0woYXR0YWNoX21wdTQwMSk7CitFWFBPUlRfU1lNQk9MKHVubG9hZF9tcHU0MDEpOworRVhQT1JUX1NZTUJPTChpbnRjaGtfbXB1NDAxKTsKK0VYUE9SVF9TWU1CT0wobXB1aW50cik7CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKKworc3RhdGljIGludCBpbyA9IC0xOworc3RhdGljIGludCBpcnEgPSAtMTsKKworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9tcHU0MDEodm9pZCkKK3sKKwlpbnQgcmV0OworCS8qIENhbiBiZSBsb2FkZWQgZWl0aGVyIGZvciBtb2R1bGUgdXNlIG9yIHRvIHByb3ZpZGUgZnVuY3Rpb25zCisJICAgdG8gb3RoZXJzICovCisJaWYgKGlvICE9IC0xICYmIGlycSAhPSAtMSkgeworCQlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCSAgICAgICAgY2ZnLmlycSA9IGlycTsKKwkJY2ZnLmlvX2Jhc2UgPSBpbzsKKwkJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihpbywgMiwgIm1wdTQwMSIpOworCQlpZiAoIXBvcnRzKQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJaWYgKHByb2JlX21wdTQwMSgmY2ZnLCBwb3J0cykgPT0gMCkgeworCQkJcmVsZWFzZV9yZWdpb24oaW8sIDIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwkJaWYgKChyZXQgPSBhdHRhY2hfbXB1NDAxKCZjZmcsIFRISVNfTU9EVUxFKSkpCisJCQlyZXR1cm4gcmV0OworCX0KKwkKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbXB1NDAxKHZvaWQpCit7CisJaWYgKGlvICE9IC0xICYmIGlycSAhPSAtMSkgeworCQkvKiBDaGVjayBmb3IgdXNlIGJ5LCBmb3IgZXhhbXBsZSwgc3NjYXBlIGRyaXZlciAqLworCQl1bmxvYWRfbXB1NDAxKCZjZmcpOworCX0KK30KKworbW9kdWxlX2luaXQoaW5pdF9tcHU0MDEpOworbW9kdWxlX2V4aXQoY2xlYW51cF9tcHU0MDEpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfbXB1NDAxKGNoYXIgKnN0cikKK3sKKyAgICAgICAgLyogaW8sIGlycSAqLworCWludCBpbnRzWzNdOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisJaW8gPSBpbnRzWzFdOworCWlycSA9IGludHNbMl07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgibXB1NDAxPSIsIHNldHVwX21wdTQwMSk7CisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9tcHU0MDEuaCBiL3NvdW5kL29zcy9tcHU0MDEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGM1YmRlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL21wdTQwMS5oCkBAIC0wLDAgKzEsMTQgQEAKKworLyoJRnJvbSB1YXJ0NDAxLmMgKi8KK2ludCBwcm9iZV91YXJ0NDAxIChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKK3ZvaWQgdW5sb2FkX3VhcnQ0MDEgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZyk7CisKK2lycXJldHVybl90IHVhcnQ0MDFpbnRyIChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICogZHVtbXkpOworCisvKglGcm9tIG1wdTQwMS5jICovCitpbnQgcHJvYmVfbXB1NDAxKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IHJlc291cmNlICpwb3J0cyk7CitpbnQgYXR0YWNoX21wdTQwMShzdHJ1Y3QgYWRkcmVzc19pbmZvICogaHdfY29uZmlnLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7Cit2b2lkIHVubG9hZF9tcHU0MDEoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfaW5mbyk7CisKK2ludCBpbnRjaGtfbXB1NDAxKHZvaWQgKmRldl9pZCk7CitpcnFyZXR1cm5fdCBtcHVpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKiBkdW1teSk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbXNuZC5jIGIvc291bmQvb3NzL21zbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjFmZjFiCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL21zbmQuYwpAQCAtMCwwICsxLDQxOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1zbmQuYyAtIERyaXZlciBCYXNlCisgKgorICogVHVydGxlIEJlYWNoIE11bHRpU291bmQgU291bmQgQ2FyZCBEcml2ZXIgZm9yIExpbnV4CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IEFuZHJldyBWZWxpYXRoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICogJElkOiBtc25kLmMsdiAxLjE3IDE5OTkvMDMvMjEgMTY6NTA6MDkgYW5kcmV3dHYgRXhwICQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgIm1zbmQuaCIKKworI2RlZmluZSBMT0dOQU1FCQkJIm1zbmQiCisKKyNkZWZpbmUgTVNORF9NQVhfREVWUwkJNAorCitzdGF0aWMgbXVsdGlzb3VuZF9kZXZfdAkJKmRldnNbTVNORF9NQVhfREVWU107CitzdGF0aWMgaW50CQkJbnVtX2RldnM7CisKK2ludCBfX2luaXQgbXNuZF9yZWdpc3RlcihtdWx0aXNvdW5kX2Rldl90ICpkZXYpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgTVNORF9NQVhfREVWUzsgKytpKQorCQlpZiAoZGV2c1tpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBNU05EX01BWF9ERVZTKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWRldnNbaV0gPSBkZXY7CisJKytudW1fZGV2czsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtc25kX3VucmVnaXN0ZXIobXVsdGlzb3VuZF9kZXZfdCAqZGV2KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE1TTkRfTUFYX0RFVlM7ICsraSkKKwkJaWYgKGRldnNbaV0gPT0gZGV2KQorCQkJYnJlYWs7CisKKwlpZiAoaSA9PSBNU05EX01BWF9ERVZTKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgTE9HTkFNRSAiOiBVbnJlZ2lzdGVyaW5nIHVua25vd24gZGV2aWNlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCWRldnNbaV0gPSBOVUxMOworCS0tbnVtX2RldnM7Cit9CisKK3ZvaWQgbXNuZF9pbml0X3F1ZXVlKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IHN0YXJ0LCBpbnQgc2l6ZSkKK3sKKwl3cml0ZXcoUENUT0RTUF9CQVNFRChzdGFydCksIGJhc2UgKyBKUVNfd1N0YXJ0KTsKKwl3cml0ZXcoUENUT0RTUF9PRkZTRVQoc2l6ZSkgLSAxLCBiYXNlICsgSlFTX3dTaXplKTsKKwl3cml0ZXcoMCwgYmFzZSArIEpRU193SGVhZCk7CisJd3JpdGV3KDAsIGJhc2UgKyBKUVNfd1RhaWwpOworfQorCit2b2lkIG1zbmRfZmlmb19pbml0KG1zbmRfZmlmbyAqZikKK3sKKwlmLT5kYXRhID0gTlVMTDsKK30KKwordm9pZCBtc25kX2ZpZm9fZnJlZShtc25kX2ZpZm8gKmYpCit7CisJaWYgKGYtPmRhdGEpIHsKKwkJdmZyZWUoZi0+ZGF0YSk7CisJCWYtPmRhdGEgPSBOVUxMOworCX0KK30KKworaW50IG1zbmRfZmlmb19hbGxvYyhtc25kX2ZpZm8gKmYsIHNpemVfdCBuKQoreworCW1zbmRfZmlmb19mcmVlKGYpOworCWYtPmRhdGEgPSAoY2hhciAqKXZtYWxsb2Mobik7CisJZi0+biA9IG47CisJZi0+dGFpbCA9IDA7CisJZi0+aGVhZCA9IDA7CisJZi0+bGVuID0gMDsKKworCWlmICghZi0+ZGF0YSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR1cm4gMDsKK30KKwordm9pZCBtc25kX2ZpZm9fbWFrZV9lbXB0eShtc25kX2ZpZm8gKmYpCit7CisJZi0+bGVuID0gZi0+dGFpbCA9IGYtPmhlYWQgPSAwOworfQorCitpbnQgbXNuZF9maWZvX3dyaXRlX2lvKG1zbmRfZmlmbyAqZiwgY2hhciBfX2lvbWVtICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IGNvdW50ID0gMDsKKworCXdoaWxlICgoY291bnQgPCBsZW4pICYmIChmLT5sZW4gIT0gZi0+bikpIHsKKworCQlpbnQgbndyaXR0ZW47CisKKwkJaWYgKGYtPmhlYWQgPD0gZi0+dGFpbCkgeworCQkJbndyaXR0ZW4gPSBsZW4gLSBjb3VudDsKKwkJCWlmIChud3JpdHRlbiA+IGYtPm4gLSBmLT50YWlsKQorCQkJCW53cml0dGVuID0gZi0+biAtIGYtPnRhaWw7CisJCX0KKwkJZWxzZSB7CisJCQlud3JpdHRlbiA9IGYtPmhlYWQgLSBmLT50YWlsOworCQkJaWYgKG53cml0dGVuID4gbGVuIC0gY291bnQpCisJCQkJbndyaXR0ZW4gPSBsZW4gLSBjb3VudDsKKwkJfQorCisJCW1lbWNweV9mcm9taW8oZi0+ZGF0YSArIGYtPnRhaWwsIGJ1ZiwgbndyaXR0ZW4pOworCisJCWNvdW50ICs9IG53cml0dGVuOworCQlidWYgKz0gbndyaXR0ZW47CisJCWYtPmxlbiArPSBud3JpdHRlbjsKKwkJZi0+dGFpbCArPSBud3JpdHRlbjsKKwkJZi0+dGFpbCAlPSBmLT5uOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworaW50IG1zbmRfZmlmb193cml0ZShtc25kX2ZpZm8gKmYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgY291bnQgPSAwOworCisJd2hpbGUgKChjb3VudCA8IGxlbikgJiYgKGYtPmxlbiAhPSBmLT5uKSkgeworCisJCWludCBud3JpdHRlbjsKKworCQlpZiAoZi0+aGVhZCA8PSBmLT50YWlsKSB7CisJCQlud3JpdHRlbiA9IGxlbiAtIGNvdW50OworCQkJaWYgKG53cml0dGVuID4gZi0+biAtIGYtPnRhaWwpCisJCQkJbndyaXR0ZW4gPSBmLT5uIC0gZi0+dGFpbDsKKwkJfQorCQllbHNlIHsKKwkJCW53cml0dGVuID0gZi0+aGVhZCAtIGYtPnRhaWw7CisJCQlpZiAobndyaXR0ZW4gPiBsZW4gLSBjb3VudCkKKwkJCQlud3JpdHRlbiA9IGxlbiAtIGNvdW50OworCQl9CisKKwkJbWVtY3B5KGYtPmRhdGEgKyBmLT50YWlsLCBidWYsIG53cml0dGVuKTsKKworCQljb3VudCArPSBud3JpdHRlbjsKKwkJYnVmICs9IG53cml0dGVuOworCQlmLT5sZW4gKz0gbndyaXR0ZW47CisJCWYtPnRhaWwgKz0gbndyaXR0ZW47CisJCWYtPnRhaWwgJT0gZi0+bjsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBtc25kX2ZpZm9fcmVhZF9pbyhtc25kX2ZpZm8gKmYsIGNoYXIgX19pb21lbSAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCBjb3VudCA9IDA7CisKKwl3aGlsZSAoKGNvdW50IDwgbGVuKSAmJiAoZi0+bGVuID4gMCkpIHsKKworCQlpbnQgbnJlYWQ7CisKKwkJaWYgKGYtPnRhaWwgPD0gZi0+aGVhZCkgeworCQkJbnJlYWQgPSBsZW4gLSBjb3VudDsKKwkJCWlmIChucmVhZCA+IGYtPm4gLSBmLT5oZWFkKQorCQkJCW5yZWFkID0gZi0+biAtIGYtPmhlYWQ7CisJCX0KKwkJZWxzZSB7CisJCQlucmVhZCA9IGYtPnRhaWwgLSBmLT5oZWFkOworCQkJaWYgKG5yZWFkID4gbGVuIC0gY291bnQpCisJCQkJbnJlYWQgPSBsZW4gLSBjb3VudDsKKwkJfQorCisJCW1lbWNweV90b2lvKGJ1ZiwgZi0+ZGF0YSArIGYtPmhlYWQsIG5yZWFkKTsKKworCQljb3VudCArPSBucmVhZDsKKwkJYnVmICs9IG5yZWFkOworCQlmLT5sZW4gLT0gbnJlYWQ7CisJCWYtPmhlYWQgKz0gbnJlYWQ7CisJCWYtPmhlYWQgJT0gZi0+bjsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK2ludCBtc25kX2ZpZm9fcmVhZChtc25kX2ZpZm8gKmYsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlpbnQgY291bnQgPSAwOworCisJd2hpbGUgKChjb3VudCA8IGxlbikgJiYgKGYtPmxlbiA+IDApKSB7CisKKwkJaW50IG5yZWFkOworCisJCWlmIChmLT50YWlsIDw9IGYtPmhlYWQpIHsKKwkJCW5yZWFkID0gbGVuIC0gY291bnQ7CisJCQlpZiAobnJlYWQgPiBmLT5uIC0gZi0+aGVhZCkKKwkJCQlucmVhZCA9IGYtPm4gLSBmLT5oZWFkOworCQl9CisJCWVsc2UgeworCQkJbnJlYWQgPSBmLT50YWlsIC0gZi0+aGVhZDsKKwkJCWlmIChucmVhZCA+IGxlbiAtIGNvdW50KQorCQkJCW5yZWFkID0gbGVuIC0gY291bnQ7CisJCX0KKworCQltZW1jcHkoYnVmLCBmLT5kYXRhICsgZi0+aGVhZCwgbnJlYWQpOworCisJCWNvdW50ICs9IG5yZWFkOworCQlidWYgKz0gbnJlYWQ7CisJCWYtPmxlbiAtPSBucmVhZDsKKwkJZi0+aGVhZCArPSBucmVhZDsKKwkJZi0+aGVhZCAlPSBmLT5uOworCX0KKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBtc25kX3dhaXRfVFhERShtdWx0aXNvdW5kX2Rldl90ICpkZXYpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGlvID0gZGV2LT5pbzsKKwlyZWdpc3RlciBpbnQgdGltZW91dCA9IDEwMDA7CisgICAgCisJd2hpbGUodGltZW91dC0tID4gMCkKKwkJaWYgKG1zbmRfaW5iKGlvICsgSFBfSVNSKSAmIEhQSVNSX1RYREUpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IG1zbmRfd2FpdF9IQzAobXVsdGlzb3VuZF9kZXZfdCAqZGV2KQoreworCXJlZ2lzdGVyIHVuc2lnbmVkIGludCBpbyA9IGRldi0+aW87CisJcmVnaXN0ZXIgaW50IHRpbWVvdXQgPSAxMDAwOworCisJd2hpbGUodGltZW91dC0tID4gMCkKKwkJaWYgKCEobXNuZF9pbmIoaW8gKyBIUF9DVlIpICYgSFBDVlJfSEMpKQorCQkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLUVJTzsKK30KKworaW50IG1zbmRfc2VuZF9kc3BfY21kKG11bHRpc291bmRfZGV2X3QgKmRldiwgQllURSBjbWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmxvY2ssIGZsYWdzKTsKKwlpZiAobXNuZF93YWl0X0hDMChkZXYpID09IDApIHsKKwkJbXNuZF9vdXRiKGNtZCwgZGV2LT5pbyArIEhQX0NWUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IFNlbmQgRFNQIGNvbW1hbmQgdGltZW91dFxuIik7CisKKwlyZXR1cm4gLUVJTzsKK30KKworaW50IG1zbmRfc2VuZF93b3JkKG11bHRpc291bmRfZGV2X3QgKmRldiwgdW5zaWduZWQgY2hhciBoaWdoLAorCQkgICB1bnNpZ25lZCBjaGFyIG1pZCwgdW5zaWduZWQgY2hhciBsb3cpCit7CisJcmVnaXN0ZXIgdW5zaWduZWQgaW50IGlvID0gZGV2LT5pbzsKKworCWlmIChtc25kX3dhaXRfVFhERShkZXYpID09IDApIHsKKwkJbXNuZF9vdXRiKGhpZ2gsIGlvICsgSFBfVFhIKTsKKwkJbXNuZF9vdXRiKG1pZCwgaW8gKyBIUF9UWE0pOworCQltc25kX291dGIobG93LCBpbyArIEhQX1RYTCk7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHIExPR05BTUUgIjogU2VuZCBob3N0IHdvcmQgdGltZW91dFxuIik7CisKKwlyZXR1cm4gLUVJTzsKK30KKworaW50IG1zbmRfdXBsb2FkX2hvc3QobXVsdGlzb3VuZF9kZXZfdCAqZGV2LCBjaGFyICpiaW4sIGludCBsZW4pCit7CisJaW50IGk7CisKKwlpZiAobGVuICUgMyAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgTE9HTkFNRSAiOiBVcGxvYWQgaG9zdCBkYXRhIG5vdCBtdWx0aXBsZSBvZiAzIVxuIik7CQkKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSArPSAzKQorCQlpZiAobXNuZF9zZW5kX3dvcmQoZGV2LCBiaW5baV0sIGJpbltpICsgMV0sIGJpbltpICsgMl0pICE9IDApCisJCQlyZXR1cm4gLUVJTzsKKworCW1zbmRfaW5iKGRldi0+aW8gKyBIUF9SWEwpOworCW1zbmRfaW5iKGRldi0+aW8gKyBIUF9DVlIpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBtc25kX2VuYWJsZV9pcnEobXVsdGlzb3VuZF9kZXZfdCAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGV2LT5pcnFfcmVmKyspCisJCXJldHVybiAwOworCisJcHJpbnRrKEtFUk5fREVCVUcgTE9HTkFNRSAiOiBFbmFibGluZyBJUlFcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+bG9jaywgZmxhZ3MpOworCWlmIChtc25kX3dhaXRfVFhERShkZXYpID09IDApIHsKKwkJbXNuZF9vdXRiKG1zbmRfaW5iKGRldi0+aW8gKyBIUF9JQ1IpIHwgSFBJQ1JfVFJFUSwgZGV2LT5pbyArIEhQX0lDUik7CisJCWlmIChkZXYtPnR5cGUgPT0gbXNuZENsYXNzaWMpCisJCQltc25kX291dGIoZGV2LT5pcnFpZCwgZGV2LT5pbyArIEhQX0lSUU0pOworCQltc25kX291dGIobXNuZF9pbmIoZGV2LT5pbyArIEhQX0lDUikgJiB+SFBJQ1JfVFJFUSwgZGV2LT5pbyArIEhQX0lDUik7CisJCW1zbmRfb3V0Yihtc25kX2luYihkZXYtPmlvICsgSFBfSUNSKSB8IEhQSUNSX1JSRVEsIGRldi0+aW8gKyBIUF9JQ1IpOworCQllbmFibGVfaXJxKGRldi0+aXJxKTsKKwkJbXNuZF9pbml0X3F1ZXVlKGRldi0+RFNQUSwgZGV2LT5kc3BxX2RhdGFfYnVmZiwgZGV2LT5kc3BxX2J1ZmZfc2l6ZSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IEVuYWJsZSBJUlEgZmFpbGVkXG4iKTsKKworCXJldHVybiAtRUlPOworfQorCitpbnQgbXNuZF9kaXNhYmxlX2lycShtdWx0aXNvdW5kX2Rldl90ICpkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICgtLWRldi0+aXJxX3JlZiA+IDApCisJCXJldHVybiAwOworCisJaWYgKGRldi0+aXJxX3JlZiA8IDApCisJCXByaW50ayhLRVJOX0RFQlVHIExPR05BTUUgIjogSVJRIHJlZiBjb3VudCBpcyAlZFxuIiwgZGV2LT5pcnFfcmVmKTsKKworCXByaW50ayhLRVJOX0RFQlVHIExPR05BTUUgIjogRGlzYWJsaW5nIElSUVxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5sb2NrLCBmbGFncyk7CisJaWYgKG1zbmRfd2FpdF9UWERFKGRldikgPT0gMCkgeworCQltc25kX291dGIobXNuZF9pbmIoZGV2LT5pbyArIEhQX0lDUikgJiB+SFBJQ1JfUlJFUSwgZGV2LT5pbyArIEhQX0lDUik7CisJCWlmIChkZXYtPnR5cGUgPT0gbXNuZENsYXNzaWMpCisJCQltc25kX291dGIoSFBJUlFfTk9ORSwgZGV2LT5pbyArIEhQX0lSUU0pOworCQlkaXNhYmxlX2lycShkZXYtPmlycSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5sb2NrLCBmbGFncyk7CisKKwlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IERpc2FibGUgSVJRIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gLUVJTzsKK30KKworI2lmbmRlZiBMSU5VWDIwCitFWFBPUlRfU1lNQk9MKG1zbmRfcmVnaXN0ZXIpOworRVhQT1JUX1NZTUJPTChtc25kX3VucmVnaXN0ZXIpOworCitFWFBPUlRfU1lNQk9MKG1zbmRfaW5pdF9xdWV1ZSk7CisKK0VYUE9SVF9TWU1CT0wobXNuZF9maWZvX2luaXQpOworRVhQT1JUX1NZTUJPTChtc25kX2ZpZm9fZnJlZSk7CitFWFBPUlRfU1lNQk9MKG1zbmRfZmlmb19hbGxvYyk7CitFWFBPUlRfU1lNQk9MKG1zbmRfZmlmb19tYWtlX2VtcHR5KTsKK0VYUE9SVF9TWU1CT0wobXNuZF9maWZvX3dyaXRlX2lvKTsKK0VYUE9SVF9TWU1CT0wobXNuZF9maWZvX3JlYWRfaW8pOworRVhQT1JUX1NZTUJPTChtc25kX2ZpZm9fd3JpdGUpOworRVhQT1JUX1NZTUJPTChtc25kX2ZpZm9fcmVhZCk7CisKK0VYUE9SVF9TWU1CT0wobXNuZF9zZW5kX2RzcF9jbWQpOworRVhQT1JUX1NZTUJPTChtc25kX3NlbmRfd29yZCk7CitFWFBPUlRfU1lNQk9MKG1zbmRfdXBsb2FkX2hvc3QpOworCitFWFBPUlRfU1lNQk9MKG1zbmRfZW5hYmxlX2lycSk7CitFWFBPUlRfU1lNQk9MKG1zbmRfZGlzYWJsZV9pcnEpOworI2VuZGlmCisKKyNpZmRlZiBNT0RVTEUKK01PRFVMRV9BVVRIT1IJCQkJKCJBbmRyZXcgVmVsaWF0aCA8YW5kcmV3dHZAdXNhLm5ldD4iKTsKK01PRFVMRV9ERVNDUklQVElPTgkJCSgiVHVydGxlIEJlYWNoIE11bHRpU291bmQgRHJpdmVyIEJhc2UiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitpbnQgaW5pdF9tb2R1bGUodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbXNuZC5oIGIvc291bmQvb3NzL21zbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWNmNzg2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL21zbmQuaApAQCAtMCwwICsxLDI4MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1zbmQuaAorICoKKyAqIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kIFNvdW5kIENhcmQgRHJpdmVyIGZvciBMaW51eAorICoKKyAqIFNvbWUgcGFydHMgb2YgdGhpcyBoZWFkZXIgZmlsZSB3ZXJlIGRlcml2ZWQgZnJvbSB0aGUgVHVydGxlIEJlYWNoCisgKiBNdWx0aVNvdW5kIERyaXZlciBEZXZlbG9wbWVudCBLaXQuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IEFuZHJldyBWZWxpYXRoCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgVHVydGxlIEJlYWNoIFN5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAkSWQ6IG1zbmQuaCx2IDEuMzYgMTk5OS8wMy8yMSAxNzowNTo0MiBhbmRyZXd0diBFeHAgJAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19NU05EX0gKKyNkZWZpbmUgX19NU05EX0gKKworI2RlZmluZSBWRVJTSU9OCQkJIjAuOC4zLjEiCisKKyNkZWZpbmUgREVGU0FNUExFUkFURQkJRFNQX0RFRkFVTFRfU1BFRUQKKyNkZWZpbmUgREVGU0FNUExFU0laRQkJQUZNVF9VOAorI2RlZmluZSBERUZDSEFOTkVMUwkJMQorCisjZGVmaW5lIERFRkZJRk9TSVpFCQkxMjgKKworI2RlZmluZSBTTkRDQVJEX01TTkQJCTM4CisKKyNkZWZpbmUgU1JBTV9CQU5LX1NJWkUJCTB4ODAwMAorI2RlZmluZSBTUkFNX0NOVExfU1RBUlQJCTB4N0YwMAorCisjZGVmaW5lIERTUF9CQVNFX0FERFIJCTB4NDAwMAorI2RlZmluZSBEU1BfQkFOS19CQVNFCQkweDQwMDAKKworI2RlZmluZQlIUF9JQ1IJCQkweDAwCisjZGVmaW5lCUhQX0NWUgkJCTB4MDEKKyNkZWZpbmUJSFBfSVNSCQkJMHgwMgorI2RlZmluZQlIUF9JVlIJCQkweDAzCisjZGVmaW5lIEhQX05VCQkJMHgwNAorI2RlZmluZSBIUF9JTkZPCQkJMHgwNAorI2RlZmluZQlIUF9UWEgJCQkweDA1CisjZGVmaW5lCUhQX1JYSAkJCTB4MDUKKyNkZWZpbmUJSFBfVFhNCQkJMHgwNgorI2RlZmluZQlIUF9SWE0JCQkweDA2CisjZGVmaW5lCUhQX1RYTAkJCTB4MDcKKyNkZWZpbmUJSFBfUlhMCQkJMHgwNworCisjZGVmaW5lIEhQX0lDUl9ERUYJCTB4MDAKKyNkZWZpbmUgSFBfQ1ZSX0RFRgkJMHgxMgorI2RlZmluZSBIUF9JU1JfREVGCQkweDA2CisjZGVmaW5lIEhQX0lWUl9ERUYJCTB4MGYKKyNkZWZpbmUgSFBfTlVfREVGCQkweDAwCisKKyNkZWZpbmUJSFBfSVJRTQkJCTB4MDkKKworI2RlZmluZQlIUFJfQkxSQwkJMHgwOAorI2RlZmluZQlIUFJfU1BSMQkJMHgwOQorI2RlZmluZQlIUFJfU1BSMgkJMHgwQQorI2RlZmluZQlIUFJfVENMMAkJMHgwQgorI2RlZmluZQlIUFJfVENMMQkJMHgwQworI2RlZmluZQlIUFJfVENMMgkJMHgwRAorI2RlZmluZQlIUFJfVENMMwkJMHgwRQorI2RlZmluZQlIUFJfVENMNAkJMHgwRgorCisjZGVmaW5lCUhQSUNSX0lOSVQJCTB4ODAKKyNkZWZpbmUgSFBJQ1JfSE0xCQkweDQwCisjZGVmaW5lIEhQSUNSX0hNMAkJMHgyMAorI2RlZmluZSBIUElDUl9IRjEJCTB4MTAKKyNkZWZpbmUgSFBJQ1JfSEYwCQkweDA4CisjZGVmaW5lCUhQSUNSX1RSRVEJCTB4MDIKKyNkZWZpbmUJSFBJQ1JfUlJFUQkJMHgwMQorCisjZGVmaW5lIEhQQ1ZSX0hDCQkweDgwCisKKyNkZWZpbmUJSFBJU1JfSFJFUQkJMHg4MAorI2RlZmluZSBIUElTUl9ETUEJCTB4NDAKKyNkZWZpbmUgSFBJU1JfSEYzCQkweDEwCisjZGVmaW5lIEhQSVNSX0hGMgkJMHgwOAorI2RlZmluZQlIUElTUl9UUkRZCQkweDA0CisjZGVmaW5lCUhQSVNSX1RYREUJCTB4MDIKKyNkZWZpbmUJSFBJU1JfUlhERgkJMHgwMQorCisjZGVmaW5lCUhQSU9fMjkwCQkwCisjZGVmaW5lCUhQSU9fMjYwCQkxCisjZGVmaW5lCUhQSU9fMjUwCQkyCisjZGVmaW5lCUhQSU9fMjQwCQkzCisjZGVmaW5lCUhQSU9fMjMwCQk0CisjZGVmaW5lCUhQSU9fMjIwCQk1CisjZGVmaW5lCUhQSU9fMjEwCQk2CisjZGVmaW5lCUhQSU9fM0UwCQk3CisKKyNkZWZpbmUJSFBNRU1fTk9ORQkJMAorI2RlZmluZQlIUE1FTV9CMDAwCQkxCisjZGVmaW5lCUhQTUVNX0M4MDAJCTIKKyNkZWZpbmUJSFBNRU1fRDAwMAkJMworI2RlZmluZQlIUE1FTV9ENDAwCQk0CisjZGVmaW5lCUhQTUVNX0Q4MDAJCTUKKyNkZWZpbmUJSFBNRU1fRTAwMAkJNgorI2RlZmluZQlIUE1FTV9FODAwCQk3CisKKyNkZWZpbmUJSFBJUlFfTk9ORQkJMAorI2RlZmluZSBIUElSUV81CQkJMQorI2RlZmluZSBIUElSUV83CQkJMgorI2RlZmluZSBIUElSUV85CQkJMworI2RlZmluZSBIUElSUV8xMAkJNAorI2RlZmluZSBIUElSUV8xMQkJNQorI2RlZmluZSBIUElSUV8xMgkJNgorI2RlZmluZSBIUElSUV8xNQkJNworCisjZGVmaW5lCUhJTVRfUExBWV9ET05FCQkweDAwCisjZGVmaW5lCUhJTVRfUkVDT1JEX0RPTkUJMHgwMQorI2RlZmluZQlISU1UX01JRElfRU9TCQkweDAyCisjZGVmaW5lCUhJTVRfTUlESV9PVVQJCTB4MDMKKworI2RlZmluZQlISU1UX01JRElfSU5fVUNIQVIJMHgwRQorI2RlZmluZQlISU1UX0RTUAkJMHgwRgorCisjZGVmaW5lCUhERVhfQkFTRQkgICAgICAgCTB4OTIKKyNkZWZpbmUJSERFWF9QTEFZX1NUQVJUCQkoMCArIEhERVhfQkFTRSkKKyNkZWZpbmUJSERFWF9QTEFZX1NUT1AJCSgxICsgSERFWF9CQVNFKQorI2RlZmluZQlIREVYX1BMQVlfUEFVU0UJCSgyICsgSERFWF9CQVNFKQorI2RlZmluZQlIREVYX1BMQVlfUkVTVU1FCSgzICsgSERFWF9CQVNFKQorI2RlZmluZQlIREVYX1JFQ09SRF9TVEFSVAkoNCArIEhERVhfQkFTRSkKKyNkZWZpbmUJSERFWF9SRUNPUkRfU1RPUAkoNSArIEhERVhfQkFTRSkKKyNkZWZpbmUJSERFWF9NSURJX0lOX1NUQVJUIAkoNiArIEhERVhfQkFTRSkKKyNkZWZpbmUJSERFWF9NSURJX0lOX1NUT1AJKDcgKyBIREVYX0JBU0UpCisjZGVmaW5lCUhERVhfTUlESV9PVVRfU1RBUlQJKDggKyBIREVYX0JBU0UpCisjZGVmaW5lCUhERVhfTUlESV9PVVRfU1RPUAkoOSArIEhERVhfQkFTRSkKKyNkZWZpbmUJSERFWF9BVVhfUkVRCQkoMTAgKyBIREVYX0JBU0UpCisKKyNkZWZpbmUgSElXT1JEKGwpCQkoKFdPUkQpKCgoKERXT1JEKShsKSkgPj4gMTYpICYgMHhGRkZGKSkKKyNkZWZpbmUgTE9XT1JEKGwpCQkoKFdPUkQpKERXT1JEKShsKSkKKyNkZWZpbmUgSElCWVRFKHcpCQkoKEJZVEUpKCgoV09SRCkodykgPj4gOCkgJiAweEZGKSkKKyNkZWZpbmUgTE9CWVRFKHcpCQkoKEJZVEUpKHcpKQorI2RlZmluZSBNQUtFTE9ORyhsb3csaGkpCSgobG9uZykoKChXT1JEKShsb3cpKXwoKChEV09SRCkoKFdPUkQpKGhpKSkpPDwxNikpKQorI2RlZmluZSBNQUtFV09SRChsb3csaGkpCSgoV09SRCkoKChCWVRFKShsb3cpKXwoKChXT1JEKSgoQllURSkoaGkpKSk8PDgpKSkKKworI2RlZmluZSBQQ1RPRFNQX09GRlNFVCh3KQkoVVNIT1JUKSgodykvMikKKyNkZWZpbmUgUENUT0RTUF9CQVNFRCh3KQkoVVNIT1JUKSgoKHcpLzIpICsgRFNQX0JBU0VfQUREUikKKyNkZWZpbmUgRFNQVE9QQ19CQVNFRCh3KQkoKCh3KSAtIERTUF9CQVNFX0FERFIpICogMikKKworI2lmZGVmIFNMT1dJTworI2RlZmluZSBtc25kX291dGIJCQlvdXRiX3AKKyNkZWZpbmUgbXNuZF9pbmIJCQlpbmJfcAorI2Vsc2UKKyNkZWZpbmUgbXNuZF9vdXRiCQkJb3V0YgorI2RlZmluZSBtc25kX2luYgkJCWluYgorI2VuZGlmCisKKy8qIEpvYlF1ZXVlU3RydWN0ICovCisjZGVmaW5lIEpRU193U3RhcnQJCTB4MDAKKyNkZWZpbmUgSlFTX3dTaXplCQkweDAyCisjZGVmaW5lIEpRU193SGVhZAkJMHgwNAorI2RlZmluZSBKUVNfd1RhaWwJCTB4MDYKKyNkZWZpbmUgSlFTX19zaXplCQkweDA4CisKKy8qIERBUXVldWVEYXRhU3RydWN0ICovCisjZGVmaW5lIERBUURTX3dTdGFydAkJMHgwMAorI2RlZmluZSBEQVFEU193U2l6ZQkJMHgwMgorI2RlZmluZSBEQVFEU193Rm9ybWF0CQkweDA0CisjZGVmaW5lIERBUURTX3dTYW1wbGVTaXplCTB4MDYKKyNkZWZpbmUgREFRRFNfd0NoYW5uZWxzCQkweDA4CisjZGVmaW5lIERBUURTX3dTYW1wbGVSYXRlCTB4MEEKKyNkZWZpbmUgREFRRFNfd0ludE1zZwkJMHgwQworI2RlZmluZSBEQVFEU193RmxhZ3MJCTB4MEUKKyNkZWZpbmUgREFRRFNfX3NpemUJCTB4MTAKKwordHlwZWRlZiB1OAkJCUJZVEU7Cit0eXBlZGVmIHUxNgkJCVVTSE9SVDsKK3R5cGVkZWYgdTE2CQkJV09SRDsKK3R5cGVkZWYgdTMyCQkJRFdPUkQ7Cit0eXBlZGVmIHZvaWQgX19pb21lbSAqCQlMUERBUUQ7CisKKy8qIEdlbmVyaWMgRklGTyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXNpemVfdCBuLCBsZW47CisJY2hhciAqZGF0YTsKKwlpbnQgaGVhZCwgdGFpbDsKK30gbXNuZF9maWZvOworCit0eXBlZGVmIHN0cnVjdCBtdWx0aXNvdW5kX2RldiB7CisJLyogTGludXggZGV2aWNlIGluZm8gKi8KKwljaGFyICpuYW1lOworCWludCBkc3BfbWlub3IsIG1peGVyX21pbm9yOworCWludCBleHRfbWlkaV9kZXYsIGhkcl9taWRpX2RldjsKKworCS8qIEhhcmR3YXJlIHJlc291cmNlcyAqLworCWludCBpbywgbnVtaW87CisJaW50IG1lbWlkLCBpcnFpZDsKKwlpbnQgaXJxLCBpcnFfcmVmOworCXVuc2lnbmVkIGNoYXIgaW5mbzsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisKKwkvKiBNb3Rvcm9sYSA1NmsgRFNQIFNNQSAqLworCXZvaWQgX19pb21lbSAqU01BOworCXZvaWQgX19pb21lbSAqREFQUSwgKkRBUlEsICpNT0RRLCAqTUlEUSwgKkRTUFE7CisJdm9pZCBfX2lvbWVtICpwd0RTUFFEYXRhLCAqcHdNSURRRGF0YSwgKnB3TU9EUURhdGE7CisJaW50IGRzcHFfZGF0YV9idWZmLCBkc3BxX2J1ZmZfc2l6ZTsKKworCS8qIFN0YXRlIHZhcmlhYmxlcyAqLworCWVudW0geyBtc25kQ2xhc3NpYywgbXNuZFBpbm5hY2xlIH0gdHlwZTsKKwltb2RlX3QgbW9kZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworI2RlZmluZSBGX1JFU0VUVElORwkJCTAKKyNkZWZpbmUgRl9IQVZFRElHSVRBTAkJCTEKKyNkZWZpbmUgRl9BVURJT19XUklURV9JTlVTRQkJMgorI2RlZmluZSBGX1dSSVRJTkcJCQkzCisjZGVmaW5lIEZfV1JJVEVCTE9DSwkJCTQKKyNkZWZpbmUgRl9XUklURUZMVVNICQkJNQorI2RlZmluZSBGX0FVRElPX1JFQURfSU5VU0UJCTYKKyNkZWZpbmUgRl9SRUFESU5HCQkJNworI2RlZmluZSBGX1JFQURCTE9DSwkJCTgKKyNkZWZpbmUgRl9FWFRfTUlESV9JTlVTRQkJOQorI2RlZmluZSBGX0hEUl9NSURJX0lOVVNFCQkxMAorI2RlZmluZSBGX0RJU0FCTEVfV1JJVEVfTkRFTEFZCQkxMQorCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlYmxvY2s7CisJd2FpdF9xdWV1ZV9oZWFkX3QgcmVhZGJsb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHdyaXRlZmx1c2g7CisJc3BpbmxvY2tfdCBsb2NrOworCWludCBucmVzZXRzOworCXVuc2lnbmVkIGxvbmcgcmVjc3JjOworCWludCBsZWZ0X2xldmVsc1sxNl07CisJaW50IHJpZ2h0X2xldmVsc1sxNl07CisJaW50IG1peGVyX21vZF9jb3VudDsKKwlpbnQgY2FsaWJyYXRlX3NpZ25hbDsKKwlpbnQgcGxheV9zYW1wbGVfc2l6ZSwgcGxheV9zYW1wbGVfcmF0ZSwgcGxheV9jaGFubmVsczsKKwlpbnQgcGxheV9uZGVsYXk7CisJaW50IHJlY19zYW1wbGVfc2l6ZSwgcmVjX3NhbXBsZV9yYXRlLCByZWNfY2hhbm5lbHM7CisJaW50IHJlY19uZGVsYXk7CisJQllURSBiQ3VycmVudE1pZGlQYXRjaDsKKworCS8qIERpZ2l0YWwgYXVkaW8gRklGT3MgKi8KKwltc25kX2ZpZm8gREFQRiwgREFSRjsKKwlpbnQgZmlmb3NpemU7CisJaW50IGxhc3RfcGxheWJhbmssIGxhc3RfcmVjYmFuazsKKworCS8qIE1JREkgaW4gY2FsbGJhY2sgKi8KKwl2b2lkICgqbWlkaV9pbl9pbnRlcnJ1cHQpKHN0cnVjdCBtdWx0aXNvdW5kX2RldiAqKTsKK30gbXVsdGlzb3VuZF9kZXZfdDsKKworI2lmbmRlZiBtZGVsYXkKKyMgIGRlZmluZSBtZGVsYXkoYSkJCXVkZWxheSgoYSkgKiAxMDAwKQorI2VuZGlmCisKK2ludAkJCQltc25kX3JlZ2lzdGVyKG11bHRpc291bmRfZGV2X3QgKmRldik7Cit2b2lkCQkJCW1zbmRfdW5yZWdpc3RlcihtdWx0aXNvdW5kX2Rldl90ICpkZXYpOworCit2b2lkCQkJCW1zbmRfaW5pdF9xdWV1ZSh2b2lkIF9faW9tZW0gKiwgaW50IHN0YXJ0LCBpbnQgc2l6ZSk7CisKK3ZvaWQJCQkJbXNuZF9maWZvX2luaXQobXNuZF9maWZvICpmKTsKK3ZvaWQJCQkJbXNuZF9maWZvX2ZyZWUobXNuZF9maWZvICpmKTsKK2ludAkJCQltc25kX2ZpZm9fYWxsb2MobXNuZF9maWZvICpmLCBzaXplX3Qgbik7Cit2b2lkCQkJCW1zbmRfZmlmb19tYWtlX2VtcHR5KG1zbmRfZmlmbyAqZik7CitpbnQJCQkJbXNuZF9maWZvX3dyaXRlX2lvKG1zbmRfZmlmbyAqZiwgY2hhciBfX2lvbWVtICpidWYsIHNpemVfdCBsZW4pOworaW50CQkJCW1zbmRfZmlmb19yZWFkX2lvKG1zbmRfZmlmbyAqZiwgY2hhciBfX2lvbWVtICpidWYsIHNpemVfdCBsZW4pOworaW50CQkJCW1zbmRfZmlmb193cml0ZShtc25kX2ZpZm8gKmYsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbik7CitpbnQJCQkJbXNuZF9maWZvX3JlYWQobXNuZF9maWZvICpmLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOworCitpbnQJCQkJbXNuZF9zZW5kX2RzcF9jbWQobXVsdGlzb3VuZF9kZXZfdCAqZGV2LCBCWVRFIGNtZCk7CitpbnQJCQkJbXNuZF9zZW5kX3dvcmQobXVsdGlzb3VuZF9kZXZfdCAqZGV2LCB1bnNpZ25lZCBjaGFyIGhpZ2gsCisJCQkJCSAgICAgICB1bnNpZ25lZCBjaGFyIG1pZCwgdW5zaWduZWQgY2hhciBsb3cpOworaW50CQkJCW1zbmRfdXBsb2FkX2hvc3QobXVsdGlzb3VuZF9kZXZfdCAqZGV2LCBjaGFyICpiaW4sIGludCBsZW4pOworaW50CQkJCW1zbmRfZW5hYmxlX2lycShtdWx0aXNvdW5kX2Rldl90ICpkZXYpOworaW50CQkJCW1zbmRfZGlzYWJsZV9pcnEobXVsdGlzb3VuZF9kZXZfdCAqZGV2KTsKKworI2VuZGlmIC8qIF9fTVNORF9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbXNuZF9jbGFzc2ljLmMgYi9zb3VuZC9vc3MvbXNuZF9jbGFzc2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IyM2EwOQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tc25kX2NsYXNzaWMuYwpAQCAtMCwwICsxLDMgQEAKKy8qIFRoZSB3b3JrIGlzIGluIG1zbmRfcGlubmFjbGUuYywganVzdCBkZWZpbmUgTVNORF9DTEFTU0lDIGJlZm9yZSBpdC4gKi8KKyNkZWZpbmUgTVNORF9DTEFTU0lDCisjaW5jbHVkZSAibXNuZF9waW5uYWNsZS5jIgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21zbmRfY2xhc3NpYy5oIGIvc291bmQvb3NzL21zbmRfY2xhc3NpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzYzNjNDZmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL21zbmRfY2xhc3NpYy5oCkBAIC0wLDAgKzEsMTg4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogbXNuZF9jbGFzc2ljLmgKKyAqCisgKiBUdXJ0bGUgQmVhY2ggTXVsdGlTb3VuZCBTb3VuZCBDYXJkIERyaXZlciBmb3IgTGludXgKKyAqCisgKiBTb21lIHBhcnRzIG9mIHRoaXMgaGVhZGVyIGZpbGUgd2VyZSBkZXJpdmVkIGZyb20gdGhlIFR1cnRsZSBCZWFjaAorICogTXVsdGlTb3VuZCBEcml2ZXIgRGV2ZWxvcG1lbnQgS2l0LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBBbmRyZXcgVmVsaWF0aAorICogQ29weXJpZ2h0IChDKSAxOTkzIFR1cnRsZSBCZWFjaCBTeXN0ZW1zLCBJbmMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKiAKKyAqICRJZDogbXNuZF9jbGFzc2ljLmgsdiAxLjEwIDE5OTkvMDMvMjEgMTc6MzY6MDkgYW5kcmV3dHYgRXhwICQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9fTVNORF9DTEFTU0lDX0gKKyNkZWZpbmUgX19NU05EX0NMQVNTSUNfSAorCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNkZWZpbmUgRFNQX05VTUlPCQkJCTB4MTAKKworI2RlZmluZQlIUF9NRU1NCQkJCQkweDA4CisKKyNkZWZpbmUJSFBfQklUTQkJCQkJMHgwRQorI2RlZmluZQlIUF9XQUlUCQkJCQkweDBECisjZGVmaW5lCUhQX0RTUFIJCQkJCTB4MEEKKyNkZWZpbmUJSFBfUFJPUgkJCQkJMHgwQgorI2RlZmluZQlIUF9CTEtTCQkJCQkweDBDCisKKyNkZWZpbmUJSFBQUk9SRVNFVF9PRkYJCQkJMAorI2RlZmluZSBIUFBST1JFU0VUX09OCQkJCTEKKworI2RlZmluZSBIUERTUFJFU0VUX09GRgkJCQkwCisjZGVmaW5lIEhQRFNQUkVTRVRfT04JCQkJMQorCisjZGVmaW5lIEhQQkxLU0VMXzAJCQkJMAorI2RlZmluZSBIUEJMS1NFTF8xCQkJCTEKKworI2RlZmluZSBIUFdBSVRTVEFURV8wCQkJCTAKKyNkZWZpbmUgSFBXQUlUU1RBVEVfMQkJCQkxCisKKyNkZWZpbmUgSFBCSVRNT0RFXzE2CQkJCTAKKyNkZWZpbmUgSFBCSVRNT0RFXzgJCQkJMQorCisjZGVmaW5lCUhJRFNQX0lOVF9QTEFZX1VOREVSCQkJMHgwMAorI2RlZmluZQlISURTUF9JTlRfUkVDT1JEX09WRVIJCQkweDAxCisjZGVmaW5lCUhJRFNQX0lOUFVUX0NMSVBQSU5HCQkJMHgwMgorI2RlZmluZQlISURTUF9NSURJX0lOX09WRVIJCQkweDEwCisjZGVmaW5lCUhJRFNQX01JRElfT1ZFUlJVTl9FUlIgIDB4MTMKKworI2RlZmluZQlIREVYQVJfQ0xFQVJfUEVBS1MJCQkxCisjZGVmaW5lCUhERVhBUl9JTl9TRVRfUE9UUwkJCTIKKyNkZWZpbmUJSERFWEFSX0FVWF9TRVRfUE9UUwkJCTMKKyNkZWZpbmUJSERFWEFSX0NBTF9BX1RPX0QJCQk0CisjZGVmaW5lCUhERVhBUl9SRF9FWFRfRFNQX0JJVFMJCQk1CisKKyNkZWZpbmUgVElNRV9QUk9fUkVTRVRfRE9ORQkJCTB4MDI4QQorI2RlZmluZSBUSU1FX1BST19TWVNFWAkJCQkweDAwNDAKKyNkZWZpbmUgVElNRV9QUk9fUkVTRVQJCQkJMHgwMDMyCisKKyNkZWZpbmUgQUdORAkJCQkJMHgwMQorI2RlZmluZSBTSUdOQUwJCQkJCTB4MDIKKworI2RlZmluZSBFWFRfRFNQX0JJVF9EQ0FMCQkJMHgwMDAxCisjZGVmaW5lIEVYVF9EU1BfQklUX01JRElfQ09OCQkJMHgwMDAyCisKKyNkZWZpbmUgQlVGRlNJWkUJCQkJMHg4MDAwCisjZGVmaW5lIEhPU1RRX1NJWkUJCQkJMHg0MAorCisjZGVmaW5lIFNSQU1fQ05UTF9TVEFSVAkJCQkweDdGMDAKKyNkZWZpbmUgU01BX1NUUlVDVF9TVEFSVAkJCTB4N0Y0MAorCisjZGVmaW5lIERBUF9CVUZGX1NJWkUJCQkJMHgyNDAwCisjZGVmaW5lIERBUl9CVUZGX1NJWkUJCQkJMHgyMDAwCisKKyNkZWZpbmUgREFQUV9TVFJVQ1RfU0laRQkJCTB4MTAKKyNkZWZpbmUgREFSUV9TVFJVQ1RfU0laRQkJCTB4MTAKKyNkZWZpbmUgREFQUV9CVUZGX1NJWkUJCQkJKDMgKiAweDEwKQorI2RlZmluZSBEQVJRX0JVRkZfU0laRQkJCQkoMyAqIDB4MTApCisjZGVmaW5lIE1PRFFfQlVGRl9TSVpFCQkJCTB4NDAwCisjZGVmaW5lIE1JRFFfQlVGRl9TSVpFCQkJCTB4MjAwCisjZGVmaW5lIERTUFFfQlVGRl9TSVpFCQkJCTB4NDAKKworI2RlZmluZSBEQVBRX0RBVEFfQlVGRgkJCQkweDZDMDAKKyNkZWZpbmUgREFSUV9EQVRBX0JVRkYJCQkJMHg2QzMwCisjZGVmaW5lIE1PRFFfREFUQV9CVUZGCQkJCTB4NkM2MAorI2RlZmluZSBNSURRX0RBVEFfQlVGRgkJCQkweDcwNjAKKyNkZWZpbmUgRFNQUV9EQVRBX0JVRkYJCQkJMHg3MjYwCisKKyNkZWZpbmUgREFQUV9PRkZTRVQJCQkJU1JBTV9DTlRMX1NUQVJUCisjZGVmaW5lIERBUlFfT0ZGU0VUCQkJCShTUkFNX0NOVExfU1RBUlQgKyAweDA4KQorI2RlZmluZSBNT0RRX09GRlNFVAkJCQkoU1JBTV9DTlRMX1NUQVJUICsgMHgxMCkKKyNkZWZpbmUgTUlEUV9PRkZTRVQJCQkJKFNSQU1fQ05UTF9TVEFSVCArIDB4MTgpCisjZGVmaW5lIERTUFFfT0ZGU0VUCQkJCShTUkFNX0NOVExfU1RBUlQgKyAweDIwKQorCisjZGVmaW5lIE1PUF9TWU5USAkJCQkweDEwCisjZGVmaW5lIE1PUF9FWFRPVVQJCQkJMHgzMgorI2RlZmluZSBNT1BfRVhUVEhSVQkJCQkweDAyCisjZGVmaW5lIE1PUF9PVVRNQVNLCQkJCTB4MDEKKworI2RlZmluZSBNSVBfRVhUSU4JCQkJMHgwMQorI2RlZmluZSBNSVBfU1lOVEgJCQkJMHgwMAorI2RlZmluZSBNSVBfSU5NQVNLCQkJCTB4MzIKKworLyogQ2xhc3NpYyBTTUEgQ29tbW9uIERhdGEgKi8KKyNkZWZpbmUgU01BX3dDdXJyUGxheUJ5dGVzCQkJMHgwMDAwCisjZGVmaW5lIFNNQV93Q3VyclJlY29yZEJ5dGVzCQkJMHgwMDAyCisjZGVmaW5lIFNNQV93Q3VyclBsYXlWb2xMZWZ0CQkJMHgwMDA0CisjZGVmaW5lIFNNQV93Q3VyclBsYXlWb2xSaWdodAkJCTB4MDAwNgorI2RlZmluZSBTTUFfd0N1cnJJblZvbExlZnQJCQkweDAwMDgKKyNkZWZpbmUgU01BX3dDdXJySW5Wb2xSaWdodAkJCTB4MDAwYQorI2RlZmluZSBTTUFfd1VzZXJfMwkJCQkweDAwMGMKKyNkZWZpbmUgU01BX3dVc2VyXzQJCQkJMHgwMDBlCisjZGVmaW5lIFNNQV9kd1VzZXJfNQkJCQkweDAwMTAKKyNkZWZpbmUgU01BX2R3VXNlcl82CQkJCTB4MDAxNAorI2RlZmluZSBTTUFfd1VzZXJfNwkJCQkweDAwMTgKKyNkZWZpbmUgU01BX3dSZXNlcnZlZF9BCQkJCTB4MDAxYQorI2RlZmluZSBTTUFfd1Jlc2VydmVkX0IJCQkJMHgwMDFjCisjZGVmaW5lIFNNQV93UmVzZXJ2ZWRfQwkJCQkweDAwMWUKKyNkZWZpbmUgU01BX3dSZXNlcnZlZF9ECQkJCTB4MDAyMAorI2RlZmluZSBTTUFfd1Jlc2VydmVkX0UJCQkJMHgwMDIyCisjZGVmaW5lIFNNQV93UmVzZXJ2ZWRfRgkJCQkweDAwMjQKKyNkZWZpbmUgU01BX3dSZXNlcnZlZF9HCQkJCTB4MDAyNgorI2RlZmluZSBTTUFfd1Jlc2VydmVkX0gJCQkJMHgwMDI4CisjZGVmaW5lIFNNQV93Q3VyckRTUFN0YXR1c0ZsYWdzCQkJMHgwMDJhCisjZGVmaW5lIFNNQV93Q3Vyckhvc3RTdGF0dXNGbGFncwkJMHgwMDJjCisjZGVmaW5lIFNNQV93Q3VycklucHV0VGFnQml0cwkJCTB4MDAyZQorI2RlZmluZSBTTUFfd0N1cnJMZWZ0UGVhawkJCTB4MDAzMAorI2RlZmluZSBTTUFfd0N1cnJSaWdodFBlYWsJCQkweDAwMzIKKyNkZWZpbmUgU01BX3dFeHREU1BiaXRzCQkJCTB4MDAzNAorI2RlZmluZSBTTUFfYkV4dEhvc3RiaXRzCQkJMHgwMDM2CisjZGVmaW5lIFNNQV9iQm9hcmRMZXZlbAkJCQkweDAwMzcKKyNkZWZpbmUgU01BX2JJblBvdFBvc1JpZ2h0CQkJMHgwMDM4CisjZGVmaW5lIFNNQV9iSW5Qb3RQb3NMZWZ0CQkJMHgwMDM5CisjZGVmaW5lIFNNQV9iQXV4UG90UG9zUmlnaHQJCQkweDAwM2EKKyNkZWZpbmUgU01BX2JBdXhQb3RQb3NMZWZ0CQkJMHgwMDNiCisjZGVmaW5lIFNNQV93Q3Vyck1hc3RWb2xMZWZ0CQkJMHgwMDNjCisjZGVmaW5lIFNNQV93Q3Vyck1hc3RWb2xSaWdodAkJCTB4MDAzZQorI2RlZmluZSBTTUFfYlVzZXJfMTIJCQkJMHgwMDQwCisjZGVmaW5lIFNNQV9iVXNlcl8xMwkJCQkweDAwNDEKKyNkZWZpbmUgU01BX3dVc2VyXzE0CQkJCTB4MDA0MgorI2RlZmluZSBTTUFfd1VzZXJfMTUJCQkJMHgwMDQ0CisjZGVmaW5lIFNNQV93Q2FsRnJlcUF0b0QJCQkweDAwNDYKKyNkZWZpbmUgU01BX3dVc2VyXzE2CQkJCTB4MDA0OAorI2RlZmluZSBTTUFfd1VzZXJfMTcJCQkJMHgwMDRhCisjZGVmaW5lIFNNQV9fc2l6ZQkJCQkweDAwNGMKKworI2lmZGVmIEhBVkVfRFNQQ09ERUgKKyMgIGluY2x1ZGUgIm1zbmRwZXJtLmMiCisjICBpbmNsdWRlICJtc25kaW5pdC5jIgorIyAgZGVmaW5lIFBFUk1DT0RFCQltc25kcGVybQorIyAgZGVmaW5lIElOSVRDT0RFCQltc25kaW5pdAorIyAgZGVmaW5lIFBFUk1DT0RFU0laRQkJc2l6ZW9mKG1zbmRwZXJtKQorIyAgZGVmaW5lIElOSVRDT0RFU0laRQkJc2l6ZW9mKG1zbmRpbml0KQorI2Vsc2UKKyMgIGlmbmRlZiBDT05GSUdfTVNORENMQVNfSU5JVF9GSUxFCisjICAgIGRlZmluZSBDT05GSUdfTVNORENMQVNfSU5JVF9GSUxFCQkJCVwKKwkJCQkiL2V0Yy9zb3VuZC9tc25kaW5pdC5iaW4iCisjICBlbmRpZgorIyAgaWZuZGVmIENPTkZJR19NU05EQ0xBU19QRVJNX0ZJTEUKKyMgICAgZGVmaW5lIENPTkZJR19NU05EQ0xBU19QRVJNX0ZJTEUJCQkJXAorCQkJCSIvZXRjL3NvdW5kL21zbmRwZXJtLmJpbiIKKyMgIGVuZGlmCisjICBkZWZpbmUgUEVSTUNPREVGSUxFCQlDT05GSUdfTVNORENMQVNfUEVSTV9GSUxFCisjICBkZWZpbmUgSU5JVENPREVGSUxFCQlDT05GSUdfTVNORENMQVNfSU5JVF9GSUxFCisjICBkZWZpbmUgUEVSTUNPREUJCWRzcGluaQorIyAgZGVmaW5lIElOSVRDT0RFCQlwZXJtaW5pCisjICBkZWZpbmUgUEVSTUNPREVTSVpFCQlzaXplb2ZfZHNwaW5pCisjICBkZWZpbmUgSU5JVENPREVTSVpFCQlzaXplb2ZfcGVybWluaQorI2VuZGlmCisjZGVmaW5lIExPTkdOQU1FCQkiTXVsdGlTb3VuZCAoQ2xhc3NpYy9Nb250ZXJleS9UYWhpdGkpIgorCisjZW5kaWYgLyogX19NU05EX0NMQVNTSUNfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL21zbmRfcGlubmFjbGUuYyBiL3NvdW5kL29zcy9tc25kX3Bpbm5hY2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhMDNmOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9tc25kX3Bpbm5hY2xlLmMKQEAgLTAsMCArMSwxOTIyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogVHVydGxlIEJlYWNoIE11bHRpU291bmQgU291bmQgQ2FyZCBEcml2ZXIgZm9yIExpbnV4CisgKiBMaW51eCAyLjAvMi4yIFZlcnNpb24KKyAqCisgKiBtc25kX3Bpbm5hY2xlLmMgLyBtc25kX2NsYXNzaWMuYworICoKKyAqIC0tIElmIE1TTkRfQ0xBU1NJQyBpcyBkZWZpbmVkOgorICoKKyAqICAgICAtPiBkcml2ZXIgZm9yIFR1cnRsZSBCZWFjaCBDbGFzc2ljL01vbnRlcmV5L1RhaGl0aQorICoKKyAqIC0tIEVsc2UKKyAqCisgKiAgICAgLT4gZHJpdmVyIGZvciBUdXJ0bGUgQmVhY2ggUGlubmFjbGUvRmlqaQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBBbmRyZXcgVmVsaWF0aAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqICRJZDogbXNuZF9waW5uYWNsZS5jLHYgMS44IDIwMDAvMTIvMzAgMDA6MzM6MjEgc3ljYW1vcmUgRXhwICQKKyAqCisgKiAxMi0zLTIwMDAgIE1vZGlmaWVkIElPIHBvcnQgdmFsaWRhdGlvbiAgU3RldmUgU3ljYW1vcmUKKyAqCisgKgorICogJCQkOiBtc25kX3Bpbm5hY2xlLmMsdiAxLjc1IDE5OTkvMDMvMjEgMTY6NTA6MDkgYW5kcmV3dHYgJCQkICQKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGFzbS9pcnEuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJzb3VuZF9maXJtd2FyZS5oIgorI2lmZGVmIE1TTkRfQ0xBU1NJQworIyBpZm5kZWYgX19hbHBoYV9fCisjICBkZWZpbmUgU0xPV0lPCisjIGVuZGlmCisjZW5kaWYKKyNpbmNsdWRlICJtc25kLmgiCisjaWZkZWYgTVNORF9DTEFTU0lDCisjICBpZmRlZiBDT05GSUdfTVNORENMQVNfSEFWRV9CT09UCisjICAgIGRlZmluZSBIQVZFX0RTUENPREVICisjICBlbmRpZgorIyAgaW5jbHVkZSAibXNuZF9jbGFzc2ljLmgiCisjICBkZWZpbmUgTE9HTkFNRQkJCSJtc25kX2NsYXNzaWMiCisjZWxzZQorIyAgaWZkZWYgQ09ORklHX01TTkRQSU5fSEFWRV9CT09UCisjICAgIGRlZmluZSBIQVZFX0RTUENPREVICisjICBlbmRpZgorIyAgaW5jbHVkZSAibXNuZF9waW5uYWNsZS5oIgorIyAgZGVmaW5lIExPR05BTUUJCQkibXNuZF9waW5uYWNsZSIKKyNlbmRpZgorCisjaWZuZGVmIENPTkZJR19NU05EX1dSSVRFX05ERUxBWQorIyAgZGVmaW5lIENPTkZJR19NU05EX1dSSVRFX05ERUxBWQkxCisjZW5kaWYKKworI2RlZmluZSBnZXRfcGxheV9kZWxheV9qaWZmaWVzKHNpemUpCSgoc2l6ZSkgKiBIWiAqCQkJXAorCQkJCQkgZGV2LnBsYXlfc2FtcGxlX3NpemUgLyA4IC8JXAorCQkJCQkgZGV2LnBsYXlfc2FtcGxlX3JhdGUgLwkJXAorCQkJCQkgZGV2LnBsYXlfY2hhbm5lbHMpCisKKyNkZWZpbmUgZ2V0X3JlY19kZWxheV9qaWZmaWVzKHNpemUpCSgoc2l6ZSkgKiBIWiAqCQkJXAorCQkJCQkgZGV2LnJlY19zYW1wbGVfc2l6ZSAvIDggLwlcCisJCQkJCSBkZXYucmVjX3NhbXBsZV9yYXRlIC8JCVwKKwkJCQkJIGRldi5yZWNfY2hhbm5lbHMpCisKK3N0YXRpYyBtdWx0aXNvdW5kX2Rldl90CQkJZGV2OworCisjaWZuZGVmIEhBVkVfRFNQQ09ERUgKK3N0YXRpYyBjaGFyCQkJCSpkc3BpbmksICpwZXJtaW5pOworc3RhdGljIGludAkJCQlzaXplb2ZfZHNwaW5pLCBzaXplb2ZfcGVybWluaTsKKyNlbmRpZgorCitzdGF0aWMgaW50CQkJCWRzcF9mdWxsX3Jlc2V0KHZvaWQpOworc3RhdGljIHZvaWQJCQkJZHNwX3dyaXRlX2ZsdXNoKHZvaWQpOworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgY2hrX3NlbmRfZHNwX2NtZChtdWx0aXNvdW5kX2Rldl90ICpkZXYsIHJlZ2lzdGVyIEJZVEUgY21kKQoreworCWlmIChtc25kX3NlbmRfZHNwX2NtZChkZXYsIGNtZCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJZHNwX2Z1bGxfcmVzZXQoKTsKKwlyZXR1cm4gbXNuZF9zZW5kX2RzcF9jbWQoZGV2LCBjbWQpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9wbGF5X3F1ZXVlKHZvaWQpCit7CisJaW50IG47CisJTFBEQVFEIGxwREFROworCisJZGV2Lmxhc3RfcGxheWJhbmsgPSAtMTsKKwl3cml0ZXcoUENUT0RTUF9PRkZTRVQoMCAqIERBUURTX19zaXplKSwgZGV2LkRBUFEgKyBKUVNfd0hlYWQpOworCXdyaXRldyhQQ1RPRFNQX09GRlNFVCgwICogREFRRFNfX3NpemUpLCBkZXYuREFQUSArIEpRU193VGFpbCk7CisKKwlmb3IgKG4gPSAwLCBscERBUSA9IGRldi5iYXNlICsgREFQUV9EQVRBX0JVRkY7IG4gPCAzOyArK24sIGxwREFRICs9IERBUURTX19zaXplKSB7CisJCXdyaXRldyhQQ1RPRFNQX0JBU0VEKChEV09SRCkoREFQX0JVRkZfU0laRSAqIG4pKSwgbHBEQVEgKyBEQVFEU193U3RhcnQpOworCQl3cml0ZXcoMCwgbHBEQVEgKyBEQVFEU193U2l6ZSk7CisJCXdyaXRldygxLCBscERBUSArIERBUURTX3dGb3JtYXQpOworCQl3cml0ZXcoZGV2LnBsYXlfc2FtcGxlX3NpemUsIGxwREFRICsgREFRRFNfd1NhbXBsZVNpemUpOworCQl3cml0ZXcoZGV2LnBsYXlfY2hhbm5lbHMsIGxwREFRICsgREFRRFNfd0NoYW5uZWxzKTsKKwkJd3JpdGV3KGRldi5wbGF5X3NhbXBsZV9yYXRlLCBscERBUSArIERBUURTX3dTYW1wbGVSYXRlKTsKKwkJd3JpdGV3KEhJTVRfUExBWV9ET05FICogMHgxMDAgKyBuLCBscERBUSArIERBUURTX3dJbnRNc2cpOworCQl3cml0ZXcobiwgbHBEQVEgKyBEQVFEU193RmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVzZXRfcmVjb3JkX3F1ZXVlKHZvaWQpCit7CisJaW50IG47CisJTFBEQVFEIGxwREFROworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlkZXYubGFzdF9yZWNiYW5rID0gMjsKKwl3cml0ZXcoUENUT0RTUF9PRkZTRVQoMCAqIERBUURTX19zaXplKSwgZGV2LkRBUlEgKyBKUVNfd0hlYWQpOworCXdyaXRldyhQQ1RPRFNQX09GRlNFVChkZXYubGFzdF9yZWNiYW5rICogREFRRFNfX3NpemUpLCBkZXYuREFSUSArIEpRU193VGFpbCk7CisKKwkvKiBDcml0aWNhbCBzZWN0aW9uOiBiYW5rIDEgYWNjZXNzICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi5sb2NrLCBmbGFncyk7CisJbXNuZF9vdXRiKEhQQkxLU0VMXzEsIGRldi5pbyArIEhQX0JMS1MpOworCW1lbXNldF9pbyhkZXYuYmFzZSwgMCwgREFSX0JVRkZfU0laRSAqIDMpOworCW1zbmRfb3V0YihIUEJMS1NFTF8wLCBkZXYuaW8gKyBIUF9CTEtTKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYubG9jaywgZmxhZ3MpOworCisJZm9yIChuID0gMCwgbHBEQVEgPSBkZXYuYmFzZSArIERBUlFfREFUQV9CVUZGOyBuIDwgMzsgKytuLCBscERBUSArPSBEQVFEU19fc2l6ZSkgeworCQl3cml0ZXcoUENUT0RTUF9CQVNFRCgoRFdPUkQpKERBUl9CVUZGX1NJWkUgKiBuKSkgKyAweDQwMDAsIGxwREFRICsgREFRRFNfd1N0YXJ0KTsKKwkJd3JpdGV3KERBUl9CVUZGX1NJWkUsIGxwREFRICsgREFRRFNfd1NpemUpOworCQl3cml0ZXcoMSwgbHBEQVEgKyBEQVFEU193Rm9ybWF0KTsKKwkJd3JpdGV3KGRldi5yZWNfc2FtcGxlX3NpemUsIGxwREFRICsgREFRRFNfd1NhbXBsZVNpemUpOworCQl3cml0ZXcoZGV2LnJlY19jaGFubmVscywgbHBEQVEgKyBEQVFEU193Q2hhbm5lbHMpOworCQl3cml0ZXcoZGV2LnJlY19zYW1wbGVfcmF0ZSwgbHBEQVEgKyBEQVFEU193U2FtcGxlUmF0ZSk7CisJCXdyaXRldyhISU1UX1JFQ09SRF9ET05FICogMHgxMDAgKyBuLCBscERBUSArIERBUURTX3dJbnRNc2cpOworCQl3cml0ZXcobiwgbHBEQVEgKyBEQVFEU193RmxhZ3MpOworCX0KK30KKworc3RhdGljIHZvaWQgcmVzZXRfcXVldWVzKHZvaWQpCit7CisJaWYgKGRldi5tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJbXNuZF9maWZvX21ha2VfZW1wdHkoJmRldi5EQVBGKTsKKwkJcmVzZXRfcGxheV9xdWV1ZSgpOworCX0KKwlpZiAoZGV2Lm1vZGUgJiBGTU9ERV9SRUFEKSB7CisJCW1zbmRfZmlmb19tYWtlX2VtcHR5KCZkZXYuREFSRik7CisJCXJlc2V0X3JlY29yZF9xdWV1ZSgpOworCX0KK30KKworc3RhdGljIGludCBkc3Bfc2V0X2Zvcm1hdChzdHJ1Y3QgZmlsZSAqZmlsZSwgaW50IHZhbCkKK3sKKwlpbnQgZGF0YSwgaTsKKwlMUERBUUQgbHBEQVEsIGxwREFSUTsKKworCWxwREFRID0gZGV2LmJhc2UgKyBEQVBRX0RBVEFfQlVGRjsKKwlscERBUlEgPSBkZXYuYmFzZSArIERBUlFfREFUQV9CVUZGOworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIEFGTVRfVTg6CisJY2FzZSBBRk1UX1MxNl9MRToKKwkJZGF0YSA9IHZhbDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGF0YSA9IERFRlNBTVBMRVNJWkU7CisJCWJyZWFrOworCX0KKworCWZvciAoaSA9IDA7IGkgPCAzOyArK2ksIGxwREFRICs9IERBUURTX19zaXplLCBscERBUlEgKz0gREFRRFNfX3NpemUpIHsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJd3JpdGV3KGRhdGEsIGxwREFRICsgREFRRFNfd1NhbXBsZVNpemUpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXdyaXRldyhkYXRhLCBscERBUlEgKyBEQVFEU193U2FtcGxlU2l6ZSk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJZGV2LnBsYXlfc2FtcGxlX3NpemUgPSBkYXRhOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlkZXYucmVjX3NhbXBsZV9zaXplID0gZGF0YTsKKworCXJldHVybiBkYXRhOworfQorCitzdGF0aWMgaW50IGRzcF9nZXRfZnJhZ19zaXplKHZvaWQpCit7CisJaW50IHNpemU7CisJc2l6ZSA9IGRldi5maWZvc2l6ZSAvIDQ7CisJaWYgKHNpemUgPiAzMiAqIDEwMjQpCisJCXNpemUgPSAzMiAqIDEwMjQ7CisJcmV0dXJuIHNpemU7Cit9CisKK3N0YXRpYyBpbnQgZHNwX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpbnQgdmFsLCBpLCBkYXRhLCB0bXA7CisJTFBEQVFEIGxwREFRLCBscERBUlE7CisgICAgICAgIGF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBfX3VzZXIgKnAgPSAoaW50IF9fdXNlciAqKWFyZzsKKworCWxwREFRID0gZGV2LmJhc2UgKyBEQVBRX0RBVEFfQlVGRjsKKwlscERBUlEgPSBkZXYuYmFzZSArIERBUlFfREFUQV9CVUZGOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKKwljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LmxvY2ssIGZsYWdzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gZHNwX2dldF9mcmFnX3NpemUoKTsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBkZXYuREFQRi5uIC0gZGV2LkRBUEYubGVuOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gZGV2LkRBUEYubiAvIGFiaW5mby5mcmFnc2l6ZTsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzIC8gYWJpbmZvLmZyYWdzaXplOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LmxvY2ssIGZsYWdzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gZHNwX2dldF9mcmFnX3NpemUoKTsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSBkZXYuREFSRi5uIC0gZGV2LkRBUkYubGVuOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gZGV2LkRBUkYubiAvIGFiaW5mby5mcmFnc2l6ZTsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzIC8gYWJpbmZvLmZyYWdzaXplOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYubG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkIF9fdXNlciAqKWFyZywgJmFiaW5mbywgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCWRldi5ucmVzZXRzID0gMDsKKwkJcmVzZXRfcXVldWVzKCk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWRzcF93cml0ZV9mbHVzaCgpOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQl0bXAgPSBkc3BfZ2V0X2ZyYWdfc2l6ZSgpOworCQlpZiAocHV0X3VzZXIodG1wLCBwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgorCQl2YWwgPSBBRk1UX1MxNl9MRSB8IEFGTVRfVTg7CisJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlkYXRhID0gdmFsID09IEFGTVRfUVVFUlkKKwkJCQk/IGRldi5wbGF5X3NhbXBsZV9zaXplCisJCQkJOiBkc3Bfc2V0X2Zvcm1hdChmaWxlLCB2YWwpOworCQllbHNlCisJCQlkYXRhID0gdmFsID09IEFGTVRfUVVFUlkKKwkJCQk/IGRldi5yZWNfc2FtcGxlX3NpemUKKwkJCQk6IGRzcF9zZXRfZm9ybWF0KGZpbGUsIHZhbCk7CisKKwkJaWYgKHB1dF91c2VyKGRhdGEsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlpZiAoIXRlc3RfYml0KEZfRElTQUJMRV9XUklURV9OREVMQVksICZkZXYuZmxhZ3MpICYmCisJCSAgICBmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCWRldi5wbGF5X25kZWxheSA9IDE7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJZGV2LnJlY19uZGVsYXkgPSAxOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQl2YWwgPSBEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfQkFUQ0g7CisJCWlmIChwdXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCWlmICh2YWwgPCA4MDAwKQorCQkJdmFsID0gODAwMDsKKworCQlpZiAodmFsID4gNDgwMDApCisJCQl2YWwgPSA0ODAwMDsKKworCQlkYXRhID0gdmFsOworCisJCWZvciAoaSA9IDA7IGkgPCAzOyArK2ksIGxwREFRICs9IERBUURTX19zaXplLCBscERBUlEgKz0gREFRRFNfX3NpemUpIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCQl3cml0ZXcoZGF0YSwgbHBEQVEgKyBEQVFEU193U2FtcGxlUmF0ZSk7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQl3cml0ZXcoZGF0YSwgbHBEQVJRICsgREFRRFNfd1NhbXBsZVJhdGUpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCWRldi5wbGF5X3NhbXBsZV9yYXRlID0gZGF0YTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlkZXYucmVjX3NhbXBsZV9yYXRlID0gZGF0YTsKKworCQlpZiAocHV0X3VzZXIoZGF0YSwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlpZiAoY21kID09IFNORENUTF9EU1BfQ0hBTk5FTFMpIHsKKwkJCXN3aXRjaCAodmFsKSB7CisJCQljYXNlIDE6CisJCQljYXNlIDI6CisJCQkJZGF0YSA9IHZhbDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJdmFsID0gZGF0YSA9IDI7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHZhbCkgeworCQkJY2FzZSAwOgorCQkJCWRhdGEgPSAxOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQl2YWwgPSAxOworCQkJY2FzZSAxOgorCQkJCWRhdGEgPSAyOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IDM7ICsraSwgbHBEQVEgKz0gREFRRFNfX3NpemUsIGxwREFSUSArPSBEQVFEU19fc2l6ZSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCXdyaXRldyhkYXRhLCBscERBUSArIERBUURTX3dDaGFubmVscyk7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQl3cml0ZXcoZGF0YSwgbHBEQVJRICsgREFRRFNfd0NoYW5uZWxzKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlkZXYucGxheV9jaGFubmVscyA9IGRhdGE7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJZGV2LnJlY19jaGFubmVscyA9IGRhdGE7CisKKwkJaWYgKHB1dF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgbWl4ZXJfZ2V0KGludCBkKQoreworCWlmIChkID4gMzEpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChkKSB7CisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJY2FzZSBTT1VORF9NSVhFUl9QQ006CisJY2FzZSBTT1VORF9NSVhFUl9MSU5FOgorCWNhc2UgU09VTkRfTUlYRVJfSU1JWDoKKwljYXNlIFNPVU5EX01JWEVSX0xJTkUxOgorI2lmbmRlZiBNU05EX0NMQVNTSUMKKwljYXNlIFNPVU5EX01JWEVSX01JQzoKKwljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorI2VuZGlmCisJCXJldHVybiAoZGV2LmxlZnRfbGV2ZWxzW2RdID4+IDgpICogMTAwIC8gMHhmZiB8IAorCQkJKCgoZGV2LnJpZ2h0X2xldmVsc1tkXSA+PiA4KSAqIDEwMCAvIDB4ZmYpIDw8IDgpOworCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KK30KKworI2RlZmluZSB1cGRhdGVfdm9sbShhLGIpCQkJCQkJXAorCXdyaXRldygoZGV2LmxlZnRfbGV2ZWxzW2FdID4+IDEpICoJCQkJXAorCSAgICAgICByZWFkdyhkZXYuU01BICsgU01BX3dDdXJyTWFzdFZvbExlZnQpIC8gMHhmZmZmLAlcCisJICAgICAgIGRldi5TTUEgKyBTTUFfIyNiIyNMZWZ0KTsJCQkJXAorCXdyaXRldygoZGV2LnJpZ2h0X2xldmVsc1thXSA+PiAxKSAgKgkJCVwKKwkgICAgICAgcmVhZHcoZGV2LlNNQSArIFNNQV93Q3Vyck1hc3RWb2xSaWdodCkgLyAweGZmZmYsCVwKKwkgICAgICAgZGV2LlNNQSArIFNNQV8jI2IjI1JpZ2h0KTsKKworI2RlZmluZSB1cGRhdGVfcG90bShkLHMsYXIpCQkJCQkJXAorCXdyaXRlYigoZGV2LmxlZnRfbGV2ZWxzW2RdID4+IDgpICoJCQkJXAorCSAgICAgICByZWFkdyhkZXYuU01BICsgU01BX3dDdXJyTWFzdFZvbExlZnQpIC8gMHhmZmZmLAlcCisJICAgICAgIGRldi5TTUEgKyBTTUFfIyNzIyNMZWZ0KTsJCQkJXAorCXdyaXRlYigoZGV2LnJpZ2h0X2xldmVsc1tkXSA+PiA4KSAqCQkJCVwKKwkgICAgICAgcmVhZHcoZGV2LlNNQSArIFNNQV93Q3Vyck1hc3RWb2xSaWdodCkgLyAweGZmZmYsCVwKKwkgICAgICAgZGV2LlNNQSArIFNNQV8jI3MjI1JpZ2h0KTsJCQkJXAorCWlmIChtc25kX3NlbmRfd29yZCgmZGV2LCAwLCAwLCBhcikgPT0gMCkJCQlcCisJCWNoa19zZW5kX2RzcF9jbWQoJmRldiwgSERFWF9BVVhfUkVRKTsKKworI2RlZmluZSB1cGRhdGVfcG90KGQscyxhcikJCQkJXAorCXdyaXRlYihkZXYubGVmdF9sZXZlbHNbZF0gPj4gOCwJCVwKKwkgICAgICAgZGV2LlNNQSArIFNNQV8jI3MjI0xlZnQpOwkJXAorCXdyaXRlYihkZXYucmlnaHRfbGV2ZWxzW2RdID4+IDgsCQlcCisJICAgICAgIGRldi5TTUEgKyBTTUFfIyNzIyNSaWdodCk7CQlcCisJaWYgKG1zbmRfc2VuZF93b3JkKCZkZXYsIDAsIDAsIGFyKSA9PSAwKQlcCisJCWNoa19zZW5kX2RzcF9jbWQoJmRldiwgSERFWF9BVVhfUkVRKTsKKworc3RhdGljIGludCBtaXhlcl9zZXQoaW50IGQsIGludCB2YWx1ZSkKK3sKKwlpbnQgbGVmdCA9IHZhbHVlICYgMHgwMDAwMDBmZjsKKwlpbnQgcmlnaHQgPSAodmFsdWUgJiAweDAwMDBmZjAwKSA+PiA4OworCWludCBiTGVmdCwgYlJpZ2h0OworCWludCB3TGVmdCwgd1JpZ2h0OworCWludCB1cGRhdGVtYXN0ZXIgPSAwOworCisJaWYgKGQgPiAzMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliTGVmdCA9IGxlZnQgKiAweGZmIC8gMTAwOworCXdMZWZ0ID0gbGVmdCAqIDB4ZmZmZiAvIDEwMDsKKworCWJSaWdodCA9IHJpZ2h0ICogMHhmZiAvIDEwMDsKKwl3UmlnaHQgPSByaWdodCAqIDB4ZmZmZiAvIDEwMDsKKworCWRldi5sZWZ0X2xldmVsc1tkXSA9IHdMZWZ0OworCWRldi5yaWdodF9sZXZlbHNbZF0gPSB3UmlnaHQ7CisKKwlzd2l0Y2ggKGQpIHsKKwkJLyogbWFzdGVyIHZvbHVtZSB1bnNjYWxlZCBjb250cm9scyAqLworCWNhc2UgU09VTkRfTUlYRVJfTElORToJCQkvKiBsaW5lIHBvdCBjb250cm9sICovCisJCS8qIHNjYWxlZCBieSBJTUlYIGluIGRpZ2l0YWwgbWl4ICovCisJCXdyaXRlYihiTGVmdCwgZGV2LlNNQSArIFNNQV9iSW5Qb3RQb3NMZWZ0KTsKKwkJd3JpdGViKGJSaWdodCwgZGV2LlNNQSArIFNNQV9iSW5Qb3RQb3NSaWdodCk7CisJCWlmIChtc25kX3NlbmRfd29yZCgmZGV2LCAwLCAwLCBIREVYQVJfSU5fU0VUX1BPVFMpID09IDApCisJCQljaGtfc2VuZF9kc3BfY21kKCZkZXYsIEhERVhfQVVYX1JFUSk7CisJCWJyZWFrOworI2lmbmRlZiBNU05EX0NMQVNTSUMKKwljYXNlIFNPVU5EX01JWEVSX01JQzoJCQkvKiBtaWMgcG90IGNvbnRyb2wgKi8KKwkJLyogc2NhbGVkIGJ5IElNSVggaW4gZGlnaXRhbCBtaXggKi8KKwkJd3JpdGViKGJMZWZ0LCBkZXYuU01BICsgU01BX2JNaWNQb3RQb3NMZWZ0KTsKKwkJd3JpdGViKGJSaWdodCwgZGV2LlNNQSArIFNNQV9iTWljUG90UG9zUmlnaHQpOworCQlpZiAobXNuZF9zZW5kX3dvcmQoJmRldiwgMCwgMCwgSERFWEFSX01JQ19TRVRfUE9UUykgPT0gMCkKKwkJCWNoa19zZW5kX2RzcF9jbWQoJmRldiwgSERFWF9BVVhfUkVRKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToJCS8qIG1hc3RlciB2b2x1bWUgKi8KKwkJd3JpdGV3KHdMZWZ0LCBkZXYuU01BICsgU01BX3dDdXJyTWFzdFZvbExlZnQpOworCQl3cml0ZXcod1JpZ2h0LCBkZXYuU01BICsgU01BX3dDdXJyTWFzdFZvbFJpZ2h0KTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIFNPVU5EX01JWEVSX0xJTkUxOgkJCS8qIGF1eCBwb3QgY29udHJvbCAqLworCQkvKiBzY2FsZWQgYnkgbWFzdGVyIHZvbHVtZSAqLworCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQkvKiBkaWdpdGFsIGNvbnRyb2xzICovCisJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoJCQkvKiBzeW50aCB2b2wgKGRzcCBtaXgpICovCisJY2FzZSBTT1VORF9NSVhFUl9QQ006CQkJLyogcGNtIHZvbCAoZHNwIG1peCkgKi8KKwljYXNlIFNPVU5EX01JWEVSX0lNSVg6CQkJLyogaW5wdXQgbW9uaXRvciAoZHNwIG1peCkgKi8KKwkJLyogc2NhbGVkIGJ5IG1hc3RlciB2b2x1bWUgKi8KKwkJdXBkYXRlbWFzdGVyID0gMTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodXBkYXRlbWFzdGVyKSB7CisJCS8qIHVwZGF0ZSBtYXN0ZXIgdm9sdW1lIHNjYWxlZCBjb250cm9scyAqLworCQl1cGRhdGVfdm9sbShTT1VORF9NSVhFUl9QQ00sIHdDdXJyUGxheVZvbCk7CisJCXVwZGF0ZV92b2xtKFNPVU5EX01JWEVSX0lNSVgsIHdDdXJySW5Wb2wpOworI2lmbmRlZiBNU05EX0NMQVNTSUMKKwkJdXBkYXRlX3ZvbG0oU09VTkRfTUlYRVJfU1lOVEgsIHdDdXJyTUhkclZvbCk7CisjZW5kaWYKKwkJdXBkYXRlX3BvdG0oU09VTkRfTUlYRVJfTElORTEsIGJBdXhQb3RQb3MsIEhERVhBUl9BVVhfU0VUX1BPVFMpOworCX0KKworCXJldHVybiBtaXhlcl9nZXQoZCk7Cit9CisKK3N0YXRpYyB2b2lkIG1peGVyX3NldHVwKHZvaWQpCit7CisJdXBkYXRlX3BvdChTT1VORF9NSVhFUl9MSU5FLCBiSW5Qb3RQb3MsIEhERVhBUl9JTl9TRVRfUE9UUyk7CisJdXBkYXRlX3BvdG0oU09VTkRfTUlYRVJfTElORTEsIGJBdXhQb3RQb3MsIEhERVhBUl9BVVhfU0VUX1BPVFMpOworCXVwZGF0ZV92b2xtKFNPVU5EX01JWEVSX1BDTSwgd0N1cnJQbGF5Vm9sKTsKKwl1cGRhdGVfdm9sbShTT1VORF9NSVhFUl9JTUlYLCB3Q3VyckluVm9sKTsKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJdXBkYXRlX3BvdChTT1VORF9NSVhFUl9NSUMsIGJNaWNQb3RQb3MsIEhERVhBUl9NSUNfU0VUX1BPVFMpOworCXVwZGF0ZV92b2xtKFNPVU5EX01JWEVSX1NZTlRILCB3Q3Vyck1IZHJWb2wpOworI2VuZGlmCit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHNldF9yZWNzcmModW5zaWduZWQgbG9uZyByZWNzcmMpCit7CisJaWYgKGRldi5yZWNzcmMgPT0gcmVjc3JjKQorCQlyZXR1cm4gZGV2LnJlY3NyYzsKKyNpZmRlZiBIQVZFX05PUkVDU1JDCisJZWxzZSBpZiAocmVjc3JjID09IDApCisJCWRldi5yZWNzcmMgPSAwOworI2VuZGlmCisJZWxzZQorCQlkZXYucmVjc3JjIF49IHJlY3NyYzsKKworI2lmbmRlZiBNU05EX0NMQVNTSUMKKwlpZiAoZGV2LnJlY3NyYyAmIFNPVU5EX01BU0tfSU1JWCkgeworCQlpZiAobXNuZF9zZW5kX3dvcmQoJmRldiwgMCwgMCwgSERFWEFSX1NFVF9BTkFfSU4pID09IDApCisJCQljaGtfc2VuZF9kc3BfY21kKCZkZXYsIEhERVhfQVVYX1JFUSk7CisJfQorCWVsc2UgaWYgKGRldi5yZWNzcmMgJiBTT1VORF9NQVNLX1NZTlRIKSB7CisJCWlmIChtc25kX3NlbmRfd29yZCgmZGV2LCAwLCAwLCBIREVYQVJfU0VUX1NZTlRIX0lOKSA9PSAwKQorCQkJY2hrX3NlbmRfZHNwX2NtZCgmZGV2LCBIREVYX0FVWF9SRVEpOworCX0KKwllbHNlIGlmICgoZGV2LnJlY3NyYyAmIFNPVU5EX01BU0tfRElHSVRBTDEpICYmIHRlc3RfYml0KEZfSEFWRURJR0lUQUwsICZkZXYuZmxhZ3MpKSB7CisJCWlmIChtc25kX3NlbmRfd29yZCgmZGV2LCAwLCAwLCBIREVYQVJfU0VUX0RBVF9JTikgPT0gMCkKKyAgICAgIAkJCWNoa19zZW5kX2RzcF9jbWQoJmRldiwgSERFWF9BVVhfUkVRKTsKKwl9CisJZWxzZSB7CisjaWZkZWYgSEFWRV9OT1JFQ1NSQworCQkvKiBTZWxlY3Qgbm8gaW5wdXQgKD8pICovCisJCWRldi5yZWNzcmMgPSAwOworI2Vsc2UKKwkJZGV2LnJlY3NyYyA9IFNPVU5EX01BU0tfSU1JWDsKKwkJaWYgKG1zbmRfc2VuZF93b3JkKCZkZXYsIDAsIDAsIEhERVhBUl9TRVRfQU5BX0lOKSA9PSAwKQorCQkJY2hrX3NlbmRfZHNwX2NtZCgmZGV2LCBIREVYX0FVWF9SRVEpOworI2VuZGlmCisJfQorI2VuZGlmIC8qIE1TTkRfQ0xBU1NJQyAqLworCisJcmV0dXJuIGRldi5yZWNzcmM7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZvcmNlX3JlY3NyYyh1bnNpZ25lZCBsb25nIHJlY3NyYykKK3sKKwlkZXYucmVjc3JjID0gMDsKKwlyZXR1cm4gc2V0X3JlY3NyYyhyZWNzcmMpOworfQorCisjZGVmaW5lIHNldF9taXhlcl9pbmZvKCkJCQkJCQkJXAorCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CQkJCQlcCisJCXN0cmxjcHkoaW5mby5pZCwgIk1TTkRNSVhFUiIsIHNpemVvZihpbmZvLmlkKSk7CQkJXAorCQlzdHJsY3B5KGluZm8ubmFtZSwgIk11bHRpU291bmQgTWl4ZXIiLCBzaXplb2YoaW5mby5uYW1lKSk7CisKK3N0YXRpYyBpbnQgbWl4ZXJfaW9jdGwodW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCW1peGVyX2luZm8gaW5mbzsKKwkJc2V0X21peGVyX2luZm8oKTsKKwkJaW5mby5tb2RpZnlfY291bnRlciA9IGRldi5taXhlcl9tb2RfY291bnQ7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKGNtZCA9PSBTT1VORF9PTERfTUlYRVJfSU5GTykgeworCQlfb2xkX21peGVyX2luZm8gaW5mbzsKKwkJc2V0X21peGVyX2luZm8oKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0gZWxzZSBpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUxKSB7CisJCWRldi5ucmVzZXRzID0gMDsKKwkJZHNwX2Z1bGxfcmVzZXQoKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIGlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpID09ICdNJykgeworCQlpbnQgdmFsID0gMDsKKworCQlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkgeworCQkJc3dpdGNoIChjbWQgJiAweGZmKSB7CisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXZhbCA9IHNldF9yZWNzcmModmFsKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXZhbCA9IG1peGVyX3NldChjbWQgJiAweGZmLCB2YWwpOworCQkJCWJyZWFrOworCQkJfQorCQkJKytkZXYubWl4ZXJfbW9kX2NvdW50OworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKilhcmcpOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChjbWQgJiAweGZmKSB7CisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQl2YWwgPSBkZXYucmVjc3JjOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCQljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6CisJCQkJdmFsID0gICBTT1VORF9NQVNLX1BDTSB8CisJCQkJCVNPVU5EX01BU0tfTElORSB8CisJCQkJCVNPVU5EX01BU0tfSU1JWCB8CisJCQkJCVNPVU5EX01BU0tfTElORTEgfAorI2lmbmRlZiBNU05EX0NMQVNTSUMKKwkJCQkJU09VTkRfTUFTS19NSUMgfAorCQkJCQlTT1VORF9NQVNLX1NZTlRIIHwKKyNlbmRpZgorCQkJCQlTT1VORF9NQVNLX1ZPTFVNRTsKKwkJCQlicmVhazsKKwkJCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgorI2lmZGVmIE1TTkRfQ0xBU1NJQworCQkJCXZhbCA9ICAgMDsKKyNlbHNlCisJCQkJdmFsID0gICBTT1VORF9NQVNLX0lNSVggfAorCQkJCQlTT1VORF9NQVNLX1NZTlRIOworCQkJCWlmICh0ZXN0X2JpdChGX0hBVkVESUdJVEFMLCAmZGV2LmZsYWdzKSkKKwkJCQkJdmFsIHw9IFNPVU5EX01BU0tfRElHSVRBTDE7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJCXZhbCA9ICAgU09VTkRfQ0FQX0VYQ0xfSU5QVVQ7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKCh2YWwgPSBtaXhlcl9nZXQoY21kICYgMHhmZikpIDwgMCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZyk7IAorCX0KKworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGRldl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKworCWlmIChjbWQgPT0gT1NTX0dFVFZFUlNJT04pIHsKKwkJaW50IHNvdW5kX3ZlcnNpb24gPSBTT1VORF9WRVJTSU9OOworCQlyZXR1cm4gcHV0X3VzZXIoc291bmRfdmVyc2lvbiwgKGludCBfX3VzZXIgKilhcmcpOworCX0KKworCWlmIChtaW5vciA9PSBkZXYuZHNwX21pbm9yKQorCQlyZXR1cm4gZHNwX2lvY3RsKGZpbGUsIGNtZCwgYXJnKTsKKwllbHNlIGlmIChtaW5vciA9PSBkZXYubWl4ZXJfbWlub3IpCisJCXJldHVybiBtaXhlcl9pb2N0bChjbWQsIGFyZyk7CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQgZHNwX3dyaXRlX2ZsdXNoKHZvaWQpCit7CisJaWYgKCEoZGV2Lm1vZGUgJiBGTU9ERV9XUklURSkgfHwgIXRlc3RfYml0KEZfV1JJVElORywgJmRldi5mbGFncykpCisJCXJldHVybjsKKwlzZXRfYml0KEZfV1JJVEVGTFVTSCwgJmRldi5mbGFncyk7CisJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KAorCQkmZGV2LndyaXRlZmx1c2gsCisJCWdldF9wbGF5X2RlbGF5X2ppZmZpZXMoZGV2LkRBUEYubGVuKSk7CisJY2xlYXJfYml0KEZfV1JJVEVGTFVTSCwgJmRldi5mbGFncyk7CisJaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGVfdGltZW91dChnZXRfcGxheV9kZWxheV9qaWZmaWVzKERBUF9CVUZGX1NJWkUpKTsKKwl9CisJY2xlYXJfYml0KEZfV1JJVElORywgJmRldi5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIGRzcF9oYWx0KHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmICgoZmlsZSA/IGZpbGUtPmZfbW9kZSA6IGRldi5tb2RlKSAmIEZNT0RFX1JFQUQpIHsKKwkJY2xlYXJfYml0KEZfUkVBRElORywgJmRldi5mbGFncyk7CisJCWNoa19zZW5kX2RzcF9jbWQoJmRldiwgSERFWF9SRUNPUkRfU1RPUCk7CisJCW1zbmRfZGlzYWJsZV9pcnEoJmRldik7CisJCWlmIChmaWxlKSB7CisJCQlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IFN0b3BwaW5nIHJlYWQgZm9yICVwXG4iLCBmaWxlKTsKKwkJCWRldi5tb2RlICY9IH5GTU9ERV9SRUFEOworCQl9CisJCWNsZWFyX2JpdChGX0FVRElPX1JFQURfSU5VU0UsICZkZXYuZmxhZ3MpOworCX0KKwlpZiAoKGZpbGUgPyBmaWxlLT5mX21vZGUgOiBkZXYubW9kZSkgJiBGTU9ERV9XUklURSkgeworCQlpZiAodGVzdF9iaXQoRl9XUklUSU5HLCAmZGV2LmZsYWdzKSkgeworCQkJZHNwX3dyaXRlX2ZsdXNoKCk7CisJCQljaGtfc2VuZF9kc3BfY21kKCZkZXYsIEhERVhfUExBWV9TVE9QKTsKKwkJfQorCQltc25kX2Rpc2FibGVfaXJxKCZkZXYpOworCQlpZiAoZmlsZSkgeworCQkJcHJpbnRrKEtFUk5fREVCVUcgTE9HTkFNRSAiOiBTdG9wcGluZyB3cml0ZSBmb3IgJXBcbiIsIGZpbGUpOworCQkJZGV2Lm1vZGUgJj0gfkZNT0RFX1dSSVRFOworCQl9CisJCWNsZWFyX2JpdChGX0FVRElPX1dSSVRFX0lOVVNFLCAmZGV2LmZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHNwX3JlbGVhc2Uoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZHNwX2hhbHQoZmlsZSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNwX29wZW4oc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaWYgKChmaWxlID8gZmlsZS0+Zl9tb2RlIDogZGV2Lm1vZGUpICYgRk1PREVfV1JJVEUpIHsKKwkJc2V0X2JpdChGX0FVRElPX1dSSVRFX0lOVVNFLCAmZGV2LmZsYWdzKTsKKwkJY2xlYXJfYml0KEZfV1JJVElORywgJmRldi5mbGFncyk7CisJCW1zbmRfZmlmb19tYWtlX2VtcHR5KCZkZXYuREFQRik7CisJCXJlc2V0X3BsYXlfcXVldWUoKTsKKwkJaWYgKGZpbGUpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHIExPR05BTUUgIjogU3RhcnRpbmcgd3JpdGUgZm9yICVwXG4iLCBmaWxlKTsKKwkJCWRldi5tb2RlIHw9IEZNT0RFX1dSSVRFOworCQl9CisJCW1zbmRfZW5hYmxlX2lycSgmZGV2KTsKKwl9CisJaWYgKChmaWxlID8gZmlsZS0+Zl9tb2RlIDogZGV2Lm1vZGUpICYgRk1PREVfUkVBRCkgeworCQlzZXRfYml0KEZfQVVESU9fUkVBRF9JTlVTRSwgJmRldi5mbGFncyk7CisJCWNsZWFyX2JpdChGX1JFQURJTkcsICZkZXYuZmxhZ3MpOworCQltc25kX2ZpZm9fbWFrZV9lbXB0eSgmZGV2LkRBUkYpOworCQlyZXNldF9yZWNvcmRfcXVldWUoKTsKKwkJaWYgKGZpbGUpIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHIExPR05BTUUgIjogU3RhcnRpbmcgcmVhZCBmb3IgJXBcbiIsIGZpbGUpOworCQkJZGV2Lm1vZGUgfD0gRk1PREVfUkVBRDsKKwkJfQorCQltc25kX2VuYWJsZV9pcnEoJmRldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF9wbGF5X2F1ZGlvX3BhcmFtZXRlcnModm9pZCkKK3sKKwlkZXYucGxheV9zYW1wbGVfc2l6ZSA9IERFRlNBTVBMRVNJWkU7CisJZGV2LnBsYXlfc2FtcGxlX3JhdGUgPSBERUZTQU1QTEVSQVRFOworCWRldi5wbGF5X2NoYW5uZWxzID0gREVGQ0hBTk5FTFM7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X3JlY19hdWRpb19wYXJhbWV0ZXJzKHZvaWQpCit7CisJZGV2LnJlY19zYW1wbGVfc2l6ZSA9IERFRlNBTVBMRVNJWkU7CisJZGV2LnJlY19zYW1wbGVfcmF0ZSA9IERFRlNBTVBMRVJBVEU7CisJZGV2LnJlY19jaGFubmVscyA9IERFRkNIQU5ORUxTOworfQorCitzdGF0aWMgdm9pZCBzZXRfZGVmYXVsdF9hdWRpb19wYXJhbWV0ZXJzKHZvaWQpCit7CisJc2V0X2RlZmF1bHRfcGxheV9hdWRpb19wYXJhbWV0ZXJzKCk7CisJc2V0X2RlZmF1bHRfcmVjX2F1ZGlvX3BhcmFtZXRlcnMoKTsKK30KKworc3RhdGljIGludCBkZXZfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWludCBlcnIgPSAwOworCisJaWYgKG1pbm9yID09IGRldi5kc3BfbWlub3IpIHsKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJgorCQkgICAgIHRlc3RfYml0KEZfQVVESU9fV1JJVEVfSU5VU0UsICZkZXYuZmxhZ3MpKSB8fAorCQkgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYKKwkJICAgICB0ZXN0X2JpdChGX0FVRElPX1JFQURfSU5VU0UsICZkZXYuZmxhZ3MpKSkKKwkJCXJldHVybiAtRUJVU1k7CisKKwkJaWYgKChlcnIgPSBkc3Bfb3BlbihmaWxlKSkgPj0gMCkgeworCQkJZGV2Lm5yZXNldHMgPSAwOworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc2V0X2RlZmF1bHRfcGxheV9hdWRpb19wYXJhbWV0ZXJzKCk7CisJCQkJaWYgKCF0ZXN0X2JpdChGX0RJU0FCTEVfV1JJVEVfTkRFTEFZLCAmZGV2LmZsYWdzKSkKKwkJCQkJZGV2LnBsYXlfbmRlbGF5ID0gKGZpbGUtPmZfZmxhZ3MgJiBPX05ERUxBWSkgPyAxIDogMDsKKwkJCQllbHNlCisJCQkJCWRldi5wbGF5X25kZWxheSA9IDA7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXNldF9kZWZhdWx0X3JlY19hdWRpb19wYXJhbWV0ZXJzKCk7CisJCQkJZGV2LnJlY19uZGVsYXkgPSAoZmlsZS0+Zl9mbGFncyAmIE9fTkRFTEFZKSA/IDEgOiAwOworCQkJfQorCQl9CisJfQorCWVsc2UgaWYgKG1pbm9yID09IGRldi5taXhlcl9taW5vcikgeworCQkvKiBub3RoaW5nICovCisJfSBlbHNlCisJCWVyciA9IC1FSU5WQUw7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGRldl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50IGVyciA9IDA7CisKKwlsb2NrX2tlcm5lbCgpOworCWlmIChtaW5vciA9PSBkZXYuZHNwX21pbm9yKQorCQllcnIgPSBkc3BfcmVsZWFzZShmaWxlKTsKKwllbHNlIGlmIChtaW5vciA9PSBkZXYubWl4ZXJfbWlub3IpIHsKKwkJLyogbm90aGluZyAqLworCX0gZWxzZQorCQllcnIgPSAtRUlOVkFMOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgcGFja19EQVJRX3RvX0RBUkYocmVnaXN0ZXIgaW50IGJhbmspCit7CisJcmVnaXN0ZXIgaW50IHNpemUsIHRpbWVvdXQgPSAzOworCXJlZ2lzdGVyIFdPUkQgd1RtcDsKKwlMUERBUUQgREFRRDsKKworCS8qIEluY3JlbWVudCB0aGUgdGFpbCBhbmQgY2hlY2sgZm9yIHF1ZXVlIHdyYXAgKi8KKwl3VG1wID0gcmVhZHcoZGV2LkRBUlEgKyBKUVNfd1RhaWwpICsgUENUT0RTUF9PRkZTRVQoREFRRFNfX3NpemUpOworCWlmICh3VG1wID4gcmVhZHcoZGV2LkRBUlEgKyBKUVNfd1NpemUpKQorCQl3VG1wID0gMDsKKwl3aGlsZSAod1RtcCA9PSByZWFkdyhkZXYuREFSUSArIEpRU193SGVhZCkgJiYgdGltZW91dC0tKQorCQl1ZGVsYXkoMSk7CisJd3JpdGV3KHdUbXAsIGRldi5EQVJRICsgSlFTX3dUYWlsKTsKKworCS8qIEdldCBvdXIgZGlnaXRhbCBhdWRpbyBxdWV1ZSBzdHJ1Y3QgKi8KKwlEQVFEID0gYmFuayAqIERBUURTX19zaXplICsgZGV2LmJhc2UgKyBEQVJRX0RBVEFfQlVGRjsKKworCS8qIEdldCBsZW5ndGggb2YgZGF0YSAqLworCXNpemUgPSByZWFkdyhEQVFEICsgREFRRFNfd1NpemUpOworCisJLyogUmVhZCBkYXRhIGZyb20gdGhlIGhlYWQgKHVucHJvdGVjdGVkIGJhbmsgMSBhY2Nlc3Mgb2theQorICAgICAgICAgICBzaW5jZSB0aGlzIGlzIG9ubHkgY2FsbGVkIGluc2lkZSBhbiBpbnRlcnJ1cHQpICovCisJbXNuZF9vdXRiKEhQQkxLU0VMXzEsIGRldi5pbyArIEhQX0JMS1MpOworCW1zbmRfZmlmb193cml0ZV9pbygKKwkJJmRldi5EQVJGLAorCQlkZXYuYmFzZSArIGJhbmsgKiBEQVJfQlVGRl9TSVpFLAorCQlzaXplKTsKKwltc25kX291dGIoSFBCTEtTRUxfMCwgZGV2LmlvICsgSFBfQkxLUyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IHBhY2tfREFQRl90b19EQVBRKHJlZ2lzdGVyIGludCBzdGFydCkKK3sKKwlyZWdpc3RlciBXT1JEIERBUFFfdGFpbDsKKwlyZWdpc3RlciBpbnQgcHJvdGVjdCA9IHN0YXJ0LCBuYmFua3MgPSAwOworCUxQREFRRCBEQVFEOworCisJREFQUV90YWlsID0gcmVhZHcoZGV2LkRBUFEgKyBKUVNfd1RhaWwpOworCXdoaWxlIChEQVBRX3RhaWwgIT0gcmVhZHcoZGV2LkRBUFEgKyBKUVNfd0hlYWQpIHx8IHN0YXJ0KSB7CisJCXJlZ2lzdGVyIGludCBiYW5rX251bSA9IERBUFFfdGFpbCAvIFBDVE9EU1BfT0ZGU0VUKERBUURTX19zaXplKTsKKwkJcmVnaXN0ZXIgaW50IG47CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJLyogV3JpdGUgdGhlIGRhdGEgdG8gdGhlIG5ldyB0YWlsICovCisJCWlmIChwcm90ZWN0KSB7CisJCQkvKiBDcml0aWNhbCBzZWN0aW9uOiBwcm90ZWN0IGZpZm8gaW4gbm9uLWludGVycnVwdCAqLworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi5sb2NrLCBmbGFncyk7CisJCQluID0gbXNuZF9maWZvX3JlYWRfaW8oCisJCQkJJmRldi5EQVBGLAorCQkJCWRldi5iYXNlICsgYmFua19udW0gKiBEQVBfQlVGRl9TSVpFLAorCQkJCURBUF9CVUZGX1NJWkUpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LmxvY2ssIGZsYWdzKTsKKwkJfSBlbHNlIHsKKwkJCW4gPSBtc25kX2ZpZm9fcmVhZF9pbygKKwkJCQkmZGV2LkRBUEYsCisJCQkJZGV2LmJhc2UgKyBiYW5rX251bSAqIERBUF9CVUZGX1NJWkUsCisJCQkJREFQX0JVRkZfU0laRSk7CisJCX0KKwkJaWYgKCFuKQorCQkJYnJlYWs7CisKKwkJaWYgKHN0YXJ0KQorCQkJc3RhcnQgPSAwOworCisJCS8qIEdldCBvdXIgZGlnaXRhbCBhdWRpbyBxdWV1ZSBzdHJ1Y3QgKi8KKwkJREFRRCA9IGJhbmtfbnVtICogREFRRFNfX3NpemUgKyBkZXYuYmFzZSArIERBUFFfREFUQV9CVUZGOworCisJCS8qIFdyaXRlIHNpemUgb2YgdGhpcyBiYW5rICovCisJCXdyaXRldyhuLCBEQVFEICsgREFRRFNfd1NpemUpOworCQkrK25iYW5rczsKKworCQkvKiBUaGVuIGFkdmFuY2UgdGhlIHRhaWwgKi8KKwkJREFQUV90YWlsID0gKCsrYmFua19udW0gJSAzKSAqIFBDVE9EU1BfT0ZGU0VUKERBUURTX19zaXplKTsKKwkJd3JpdGV3KERBUFFfdGFpbCwgZGV2LkRBUFEgKyBKUVNfd1RhaWwpOworCQkvKiBUZWxsIHRoZSBEU1AgdG8gcGxheSB0aGUgYmFuayAqLworCQltc25kX3NlbmRfZHNwX2NtZCgmZGV2LCBIREVYX1BMQVlfU1RBUlQpOworCX0KKwlyZXR1cm4gbmJhbmtzOworfQorCitzdGF0aWMgaW50IGRzcF9yZWFkKGNoYXIgX191c2VyICpidWYsIHNpemVfdCBsZW4pCit7CisJaW50IGNvdW50ID0gbGVuOworCWNoYXIgKnBhZ2UgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShQQUdFX1NJWkUpOworCisJaWYgKCFwYWdlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJaW50IG4sIGs7CisJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkJayA9IFBBR0VfU0laRTsKKwkJaWYgKGsgPiBjb3VudCkKKwkJCWsgPSBjb3VudDsKKworCQkvKiBDcml0aWNhbCBzZWN0aW9uOiBwcm90ZWN0IGZpZm8gaW4gbm9uLWludGVycnVwdCAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LmxvY2ssIGZsYWdzKTsKKwkJbiA9IG1zbmRfZmlmb19yZWFkKCZkZXYuREFSRiwgcGFnZSwgayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmLCBwYWdlLCBuKSkgeworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJYnVmICs9IG47CisJCWNvdW50IC09IG47CisKKwkJaWYgKG4gPT0gayAmJiBjb3VudCkKKwkJCWNvbnRpbnVlOworCisJCWlmICghdGVzdF9iaXQoRl9SRUFESU5HLCAmZGV2LmZsYWdzKSAmJiBkZXYubW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWRldi5sYXN0X3JlY2JhbmsgPSAtMTsKKwkJCWlmIChjaGtfc2VuZF9kc3BfY21kKCZkZXYsIEhERVhfUkVDT1JEX1NUQVJUKSA9PSAwKQorCQkJCXNldF9iaXQoRl9SRUFESU5HLCAmZGV2LmZsYWdzKTsKKwkJfQorCisJCWlmIChkZXYucmVjX25kZWxheSkgeworCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCQkJcmV0dXJuIGNvdW50ID09IGxlbiA/IC1FQUdBSU4gOiBsZW4gLSBjb3VudDsKKwkJfQorCisJCWlmIChjb3VudCA+IDApIHsKKwkJCXNldF9iaXQoRl9SRUFEQkxPQ0ssICZkZXYuZmxhZ3MpOworCQkJaWYgKCFpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoCisJCQkJJmRldi5yZWFkYmxvY2ssCisJCQkJZ2V0X3JlY19kZWxheV9qaWZmaWVzKERBUl9CVUZGX1NJWkUpKSkKKwkJCQljbGVhcl9iaXQoRl9SRUFESU5HLCAmZGV2LmZsYWdzKTsKKwkJCWNsZWFyX2JpdChGX1JFQURCTE9DSywgJmRldi5mbGFncyk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CisJCQkJcmV0dXJuIC1FSU5UUjsKKwkJCX0KKwkJfQorCX0KKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CisJcmV0dXJuIGxlbiAtIGNvdW50OworfQorCitzdGF0aWMgaW50IGRzcF93cml0ZShjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCBjb3VudCA9IGxlbjsKKwljaGFyICpwYWdlID0gKGNoYXIgKilfX2dldF9mcmVlX3BhZ2UoR0ZQX0tFUk5FTCk7CisKKwlpZiAoIXBhZ2UpCisJCXJldHVybiAtRU5PTUVNOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlpbnQgbiwgazsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlrID0gUEFHRV9TSVpFOworCQlpZiAoayA+IGNvdW50KQorCQkJayA9IGNvdW50OworCisJCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlLCBidWYsIGspKSB7CisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCS8qIENyaXRpY2FsIHNlY3Rpb246IHByb3RlY3QgZmlmbyBpbiBub24taW50ZXJydXB0ICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYubG9jaywgZmxhZ3MpOworCQluID0gbXNuZF9maWZvX3dyaXRlKCZkZXYuREFQRiwgcGFnZSwgayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi5sb2NrLCBmbGFncyk7CisJCWJ1ZiArPSBuOworCQljb3VudCAtPSBuOworCisJCWlmIChjb3VudCAmJiBuID09IGspCisJCQljb250aW51ZTsKKworCQlpZiAoIXRlc3RfYml0KEZfV1JJVElORywgJmRldi5mbGFncykgJiYgKGRldi5tb2RlICYgRk1PREVfV1JJVEUpKSB7CisJCQlkZXYubGFzdF9wbGF5YmFuayA9IC0xOworCQkJaWYgKHBhY2tfREFQRl90b19EQVBRKDEpID4gMCkKKwkJCQlzZXRfYml0KEZfV1JJVElORywgJmRldi5mbGFncyk7CisJCX0KKworCQlpZiAoZGV2LnBsYXlfbmRlbGF5KSB7CisJCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CisJCQlyZXR1cm4gY291bnQgPT0gbGVuID8gLUVBR0FJTiA6IGxlbiAtIGNvdW50OworCQl9CisKKwkJaWYgKGNvdW50ID4gMCkgeworCQkJc2V0X2JpdChGX1dSSVRFQkxPQ0ssICZkZXYuZmxhZ3MpOworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KAorCQkJCSZkZXYud3JpdGVibG9jaywKKwkJCQlnZXRfcGxheV9kZWxheV9qaWZmaWVzKERBUF9CVUZGX1NJWkUpKTsKKwkJCWNsZWFyX2JpdChGX1dSSVRFQkxPQ0ssICZkZXYuZmxhZ3MpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXBhZ2UpOworCQkJCXJldHVybiAtRUlOVFI7CisJCQl9CisJCX0KKwl9CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpcGFnZSk7CisJcmV0dXJuIGxlbiAtIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBkZXZfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKm9mZikKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCWlmIChtaW5vciA9PSBkZXYuZHNwX21pbm9yKQorCQlyZXR1cm4gZHNwX3JlYWQoYnVmLCBjb3VudCk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QgZGV2X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmKQoreworCWludCBtaW5vciA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaWYgKG1pbm9yID09IGRldi5kc3BfbWlub3IpCisJCXJldHVybiBkc3Bfd3JpdGUoYnVmLCBjb3VudCk7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBldmFsX2RzcF9tc2cocmVnaXN0ZXIgV09SRCB3TWVzc2FnZSkKK3sKKwlzd2l0Y2ggKEhJQllURSh3TWVzc2FnZSkpIHsKKwljYXNlIEhJTVRfUExBWV9ET05FOgorCQlpZiAoZGV2Lmxhc3RfcGxheWJhbmsgPT0gTE9CWVRFKHdNZXNzYWdlKSB8fCAhdGVzdF9iaXQoRl9XUklUSU5HLCAmZGV2LmZsYWdzKSkKKwkJCWJyZWFrOworCQlkZXYubGFzdF9wbGF5YmFuayA9IExPQllURSh3TWVzc2FnZSk7CisKKwkJaWYgKHBhY2tfREFQRl90b19EQVBRKDApIDw9IDApIHsKKwkJCWlmICghdGVzdF9iaXQoRl9XUklURUJMT0NLLCAmZGV2LmZsYWdzKSkgeworCQkJCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoRl9XUklURUZMVVNILCAmZGV2LmZsYWdzKSkKKwkJCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYud3JpdGVmbHVzaCk7CisJCQl9CisJCQljbGVhcl9iaXQoRl9XUklUSU5HLCAmZGV2LmZsYWdzKTsKKwkJfQorCisJCWlmICh0ZXN0X2JpdChGX1dSSVRFQkxPQ0ssICZkZXYuZmxhZ3MpKQorCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkZXYud3JpdGVibG9jayk7CisJCWJyZWFrOworCisJY2FzZSBISU1UX1JFQ09SRF9ET05FOgorCQlpZiAoZGV2Lmxhc3RfcmVjYmFuayA9PSBMT0JZVEUod01lc3NhZ2UpKQorCQkJYnJlYWs7CisJCWRldi5sYXN0X3JlY2JhbmsgPSBMT0JZVEUod01lc3NhZ2UpOworCisJCXBhY2tfREFSUV90b19EQVJGKGRldi5sYXN0X3JlY2JhbmspOworCisJCWlmICh0ZXN0X2JpdChGX1JFQURCTE9DSywgJmRldi5mbGFncykpCisJCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmRldi5yZWFkYmxvY2spOworCQlicmVhazsKKworCWNhc2UgSElNVF9EU1A6CisJCXN3aXRjaCAoTE9CWVRFKHdNZXNzYWdlKSkgeworI2lmbmRlZiBNU05EX0NMQVNTSUMKKwkJY2FzZSBISURTUF9QTEFZX1VOREVSOgorI2VuZGlmCisJCWNhc2UgSElEU1BfSU5UX1BMQVlfVU5ERVI6CisvKgkJCXByaW50ayhLRVJOX0RFQlVHIExPR05BTUUgIjogUGxheSB1bmRlcmZsb3dcbiIpOyAqLworCQkJY2xlYXJfYml0KEZfV1JJVElORywgJmRldi5mbGFncyk7CisJCQlicmVhazsKKworCQljYXNlIEhJRFNQX0lOVF9SRUNPUkRfT1ZFUjoKKy8qCQkJcHJpbnRrKEtFUk5fREVCVUcgTE9HTkFNRSAiOiBSZWNvcmQgb3ZlcmZsb3dcbiIpOyAqLworCQkJY2xlYXJfYml0KEZfUkVBRElORywgJmRldi5mbGFncyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorLyoJCQlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IERTUCBtZXNzYWdlICVkIDB4JTAyeFxuIiwKKwkJCUxPQllURSh3TWVzc2FnZSksIExPQllURSh3TWVzc2FnZSkpOyAqLworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisKKyAgICAgICAgY2FzZSBISU1UX01JRElfSU5fVUNIQVI6CisJCWlmIChkZXYubWlkaV9pbl9pbnRlcnJ1cHQpCisJCQkoKmRldi5taWRpX2luX2ludGVycnVwdCkoJmRldik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKy8qCQlwcmludGsoS0VSTl9ERUJVRyBMT0dOQU1FICI6IEhJTVQgbWVzc2FnZSAlZCAweCUwMnhcbiIsIEhJQllURSh3TWVzc2FnZSksIEhJQllURSh3TWVzc2FnZSkpOyAqLworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogU2VuZCBhY2sgdG8gRFNQICovCisJbXNuZF9pbmIoZGV2LmlvICsgSFBfUlhMKTsKKworCS8qIEV2YWx1YXRlIHF1ZXVlZCBEU1AgbWVzc2FnZXMgKi8KKwl3aGlsZSAocmVhZHcoZGV2LkRTUFEgKyBKUVNfd1RhaWwpICE9IHJlYWR3KGRldi5EU1BRICsgSlFTX3dIZWFkKSkgeworCQlyZWdpc3RlciBXT1JEIHdUbXA7CisKKwkJZXZhbF9kc3BfbXNnKHJlYWR3KGRldi5wd0RTUFFEYXRhICsgMipyZWFkdyhkZXYuRFNQUSArIEpRU193SGVhZCkpKTsKKworCQlpZiAoKHdUbXAgPSByZWFkdyhkZXYuRFNQUSArIEpRU193SGVhZCkgKyAxKSA+IHJlYWR3KGRldi5EU1BRICsgSlFTX3dTaXplKSkKKwkJCXdyaXRldygwLCBkZXYuRFNQUSArIEpRU193SGVhZCk7CisJCWVsc2UKKwkJCXdyaXRldyh3VG1wLCBkZXYuRFNQUSArIEpRU193SGVhZCk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZGV2X2ZpbGVvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5yZWFkCQk9IGRldl9yZWFkLAorCS53cml0ZQkJPSBkZXZfd3JpdGUsCisJLmlvY3RsCQk9IGRldl9pb2N0bCwKKwkub3BlbgkJPSBkZXZfb3BlbiwKKwkucmVsZWFzZQk9IGRldl9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCByZXNldF9kc3Aodm9pZCkKK3sKKwlpbnQgdGltZW91dCA9IDEwMDsKKworCW1zbmRfb3V0YihIUERTUFJFU0VUX09OLCBkZXYuaW8gKyBIUF9EU1BSKTsKKwltZGVsYXkoMSk7CisjaWZuZGVmIE1TTkRfQ0xBU1NJQworCWRldi5pbmZvID0gbXNuZF9pbmIoZGV2LmlvICsgSFBfSU5GTyk7CisjZW5kaWYKKwltc25kX291dGIoSFBEU1BSRVNFVF9PRkYsIGRldi5pbyArIEhQX0RTUFIpOworCW1kZWxheSgxKTsKKwl3aGlsZSAodGltZW91dC0tID4gMCkgeworCQlpZiAobXNuZF9pbmIoZGV2LmlvICsgSFBfQ1ZSKSA9PSBIUF9DVlJfREVGKQorCQkJcmV0dXJuIDA7CisJCW1kZWxheSgxKTsKKwl9CisJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogQ2Fubm90IHJlc2V0IERTUFxuIik7CisKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfbXVsdGlzb3VuZCh2b2lkKQoreworI2lmbmRlZiBNU05EX0NMQVNTSUMKKwljaGFyICp4diwgKnJldiA9IE5VTEw7CisJY2hhciAqcGluID0gIlBpbm5hY2xlIiwgKmZpamkgPSAiRmlqaSI7CisJY2hhciAqcGluZmlqaSA9ICJQaW5uYWNsZS9GaWppIjsKKyNlbmRpZgorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXYuaW8sIGRldi5udW1pbywgInByb2JpbmciKSkgeworCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRSAiOiBJL08gcG9ydCBjb25mbGljdFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmIChyZXNldF9kc3AoKSA8IDApIHsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LmlvLCBkZXYubnVtaW8pOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKyNpZmRlZiBNU05EX0NMQVNTSUMKKwlkZXYubmFtZSA9ICJDbGFzc2ljL1RhaGl0aS9Nb250ZXJleSI7CisJcHJpbnRrKEtFUk5fSU5GTyBMT0dOQU1FICI6ICVzLCAiCisjZWxzZQorCXN3aXRjaCAoZGV2LmluZm8gPj4gNCkgeworCWNhc2UgMHhmOiB4diA9ICI8PSAxLjE1IjsgYnJlYWs7CisJY2FzZSAweDE6IHh2ID0gIjEuMTgvMS4yIjsgYnJlYWs7CisJY2FzZSAweDI6IHh2ID0gIjEuMyI7IGJyZWFrOworCWNhc2UgMHgzOiB4diA9ICIxLjQiOyBicmVhazsKKwlkZWZhdWx0OiB4diA9ICJ1bmtub3duIjsgYnJlYWs7CisJfQorCisJc3dpdGNoIChkZXYuaW5mbyAmIDB4NykgeworCWNhc2UgMHgwOiByZXYgPSAiSSI7IGRldi5uYW1lID0gcGluOyBicmVhazsKKwljYXNlIDB4MTogcmV2ID0gIkYiOyBkZXYubmFtZSA9IHBpbjsgYnJlYWs7CisJY2FzZSAweDI6IHJldiA9ICJHIjsgZGV2Lm5hbWUgPSBwaW47IGJyZWFrOworCWNhc2UgMHgzOiByZXYgPSAiSCI7IGRldi5uYW1lID0gcGluOyBicmVhazsKKwljYXNlIDB4NDogcmV2ID0gIkUiOyBkZXYubmFtZSA9IGZpamk7IGJyZWFrOworCWNhc2UgMHg1OiByZXYgPSAiQyI7IGRldi5uYW1lID0gZmlqaTsgYnJlYWs7CisJY2FzZSAweDY6IHJldiA9ICJEIjsgZGV2Lm5hbWUgPSBmaWppOyBicmVhazsKKwljYXNlIDB4NzoKKwkJcmV2ID0gIkEtQiAoRmlqaSkgb3IgQS1FIChQaW5uYWNsZSkiOworCQlkZXYubmFtZSA9IHBpbmZpamk7CisJCWJyZWFrOworCX0KKwlwcmludGsoS0VSTl9JTkZPIExPR05BTUUgIjogJXMgcmV2aXNpb24gJXMsIFhpbGlueCB2ZXJzaW9uICVzLCAiCisjZW5kaWYgLyogTVNORF9DTEFTU0lDICovCisJICAgICAgICJJL08gMHgleC0weCV4LCBJUlEgJWQsIG1lbW9yeSBtYXBwZWQgdG8gJXAtJXBcbiIsCisJICAgICAgIGRldi5uYW1lLAorI2lmbmRlZiBNU05EX0NMQVNTSUMKKwkgICAgICAgcmV2LCB4diwKKyNlbmRpZgorCSAgICAgICBkZXYuaW8sIGRldi5pbyArIGRldi5udW1pbyAtIDEsCisJICAgICAgIGRldi5pcnEsCisJICAgICAgIGRldi5iYXNlLCBkZXYuYmFzZSArIDB4N2ZmZik7CisKKwlyZWxlYXNlX3JlZ2lvbihkZXYuaW8sIGRldi5udW1pbyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zbWEodm9pZCkKK3sKKwlzdGF0aWMgaW50IGluaXR0ZWQ7CisJV09SRCBtYXN0Vm9sTGVmdCwgbWFzdFZvbFJpZ2h0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBNU05EX0NMQVNTSUMKKwltc25kX291dGIoZGV2Lm1lbWlkLCBkZXYuaW8gKyBIUF9NRU1NKTsKKyNlbmRpZgorCW1zbmRfb3V0YihIUEJMS1NFTF8wLCBkZXYuaW8gKyBIUF9CTEtTKTsKKwlpZiAoaW5pdHRlZCkgeworCQltYXN0Vm9sTGVmdCA9IHJlYWR3KGRldi5TTUEgKyBTTUFfd0N1cnJNYXN0Vm9sTGVmdCk7CisJCW1hc3RWb2xSaWdodCA9IHJlYWR3KGRldi5TTUEgKyBTTUFfd0N1cnJNYXN0Vm9sUmlnaHQpOworCX0gZWxzZQorCQltYXN0Vm9sTGVmdCA9IG1hc3RWb2xSaWdodCA9IDA7CisJbWVtc2V0X2lvKGRldi5iYXNlLCAwLCAweDgwMDApOworCisJLyogQ3JpdGljYWwgc2VjdGlvbjogYmFuayAxIGFjY2VzcyAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYubG9jaywgZmxhZ3MpOworCW1zbmRfb3V0YihIUEJMS1NFTF8xLCBkZXYuaW8gKyBIUF9CTEtTKTsKKwltZW1zZXRfaW8oZGV2LmJhc2UsIDAsIDB4ODAwMCk7CisJbXNuZF9vdXRiKEhQQkxLU0VMXzAsIGRldi5pbyArIEhQX0JMS1MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi5sb2NrLCBmbGFncyk7CisKKwlkZXYucHdEU1BRRGF0YSA9IChkZXYuYmFzZSArIERTUFFfREFUQV9CVUZGKTsKKwlkZXYucHdNT0RRRGF0YSA9IChkZXYuYmFzZSArIE1PRFFfREFUQV9CVUZGKTsKKwlkZXYucHdNSURRRGF0YSA9IChkZXYuYmFzZSArIE1JRFFfREFUQV9CVUZGKTsKKworCS8qIE1vdG9yb2xhIDU2ayBzaGFyZWQgbWVtb3J5IGJhc2UgKi8KKwlkZXYuU01BID0gZGV2LmJhc2UgKyBTTUFfU1RSVUNUX1NUQVJUOworCisJLyogRGlnaXRhbCBhdWRpbyBwbGF5IHF1ZXVlICovCisJZGV2LkRBUFEgPSBkZXYuYmFzZSArIERBUFFfT0ZGU0VUOworCW1zbmRfaW5pdF9xdWV1ZShkZXYuREFQUSwgREFQUV9EQVRBX0JVRkYsIERBUFFfQlVGRl9TSVpFKTsKKworCS8qIERpZ2l0YWwgYXVkaW8gcmVjb3JkIHF1ZXVlICovCisJZGV2LkRBUlEgPSBkZXYuYmFzZSArIERBUlFfT0ZGU0VUOworCW1zbmRfaW5pdF9xdWV1ZShkZXYuREFSUSwgREFSUV9EQVRBX0JVRkYsIERBUlFfQlVGRl9TSVpFKTsKKworCS8qIE1JREkgb3V0IHF1ZXVlICovCisJZGV2Lk1PRFEgPSBkZXYuYmFzZSArIE1PRFFfT0ZGU0VUOworCW1zbmRfaW5pdF9xdWV1ZShkZXYuTU9EUSwgTU9EUV9EQVRBX0JVRkYsIE1PRFFfQlVGRl9TSVpFKTsKKworCS8qIE1JREkgaW4gcXVldWUgKi8KKwlkZXYuTUlEUSA9IGRldi5iYXNlICsgTUlEUV9PRkZTRVQ7CisJbXNuZF9pbml0X3F1ZXVlKGRldi5NSURRLCBNSURRX0RBVEFfQlVGRiwgTUlEUV9CVUZGX1NJWkUpOworCisJLyogRFNQIC0+IGhvc3QgbWVzc2FnZSBxdWV1ZSAqLworCWRldi5EU1BRID0gZGV2LmJhc2UgKyBEU1BRX09GRlNFVDsKKwltc25kX2luaXRfcXVldWUoZGV2LkRTUFEsIERTUFFfREFUQV9CVUZGLCBEU1BRX0JVRkZfU0laRSk7CisKKwkvKiBTZXR1cCBzb21lIERTUCB2YWx1ZXMgKi8KKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJd3JpdGV3KDEsIGRldi5TTUEgKyBTTUFfd0N1cnJQbGF5Rm9ybWF0KTsKKwl3cml0ZXcoZGV2LnBsYXlfc2FtcGxlX3NpemUsIGRldi5TTUEgKyBTTUFfd0N1cnJQbGF5U2FtcGxlU2l6ZSk7CisJd3JpdGV3KGRldi5wbGF5X2NoYW5uZWxzLCBkZXYuU01BICsgU01BX3dDdXJyUGxheUNoYW5uZWxzKTsKKwl3cml0ZXcoZGV2LnBsYXlfc2FtcGxlX3JhdGUsIGRldi5TTUEgKyBTTUFfd0N1cnJQbGF5U2FtcGxlUmF0ZSk7CisjZW5kaWYKKwl3cml0ZXcoZGV2LnBsYXlfc2FtcGxlX3JhdGUsIGRldi5TTUEgKyBTTUFfd0NhbEZyZXFBdG9EKTsKKwl3cml0ZXcobWFzdFZvbExlZnQsIGRldi5TTUEgKyBTTUFfd0N1cnJNYXN0Vm9sTGVmdCk7CisJd3JpdGV3KG1hc3RWb2xSaWdodCwgZGV2LlNNQSArIFNNQV93Q3Vyck1hc3RWb2xSaWdodCk7CisjaWZuZGVmIE1TTkRfQ0xBU1NJQworCXdyaXRlbCgweDAwMDEwMDAwLCBkZXYuU01BICsgU01BX2R3Q3VyclBsYXlQaXRjaCk7CisJd3JpdGVsKDB4MDAwMDAwMDEsIGRldi5TTUEgKyBTTUFfZHdDdXJyUGxheVJhdGUpOworI2VuZGlmCisJd3JpdGV3KDB4MzAzLCBkZXYuU01BICsgU01BX3dDdXJySW5wdXRUYWdCaXRzKTsKKworCWluaXR0ZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGNhbGlicmF0ZV9hZGMoV09SRCBzcmF0ZSkKK3sKKwl3cml0ZXcoc3JhdGUsIGRldi5TTUEgKyBTTUFfd0NhbEZyZXFBdG9EKTsKKwlpZiAoZGV2LmNhbGlicmF0ZV9zaWduYWwgPT0gMCkKKwkJd3JpdGV3KHJlYWR3KGRldi5TTUEgKyBTTUFfd0N1cnJIb3N0U3RhdHVzRmxhZ3MpCisJCSAgICAgICB8IDB4MDAwMSwgZGV2LlNNQSArIFNNQV93Q3Vyckhvc3RTdGF0dXNGbGFncyk7CisJZWxzZQorCQl3cml0ZXcocmVhZHcoZGV2LlNNQSArIFNNQV93Q3Vyckhvc3RTdGF0dXNGbGFncykKKwkJICAgICAgICYgfjB4MDAwMSwgZGV2LlNNQSArIFNNQV93Q3Vyckhvc3RTdGF0dXNGbGFncyk7CisJaWYgKG1zbmRfc2VuZF93b3JkKCZkZXYsIDAsIDAsIEhERVhBUl9DQUxfQV9UT19EKSA9PSAwICYmCisJICAgIGNoa19zZW5kX2RzcF9jbWQoJmRldiwgSERFWF9BVVhfUkVRKSA9PSAwKSB7CisJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19JTlRFUlJVUFRJQkxFOworCQlzY2hlZHVsZV90aW1lb3V0KEhaIC8gMyk7CisJCXJldHVybiAwOworCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HIExPR05BTUUgIjogQURDIGNhbGlicmF0aW9uIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gLUVJTzsKK30KKworc3RhdGljIGludCB1cGxvYWRfZHNwX2NvZGUodm9pZCkKK3sKKwltc25kX291dGIoSFBCTEtTRUxfMCwgZGV2LmlvICsgSFBfQkxLUyk7CisjaWZuZGVmIEhBVkVfRFNQQ09ERUgKKwlJTklUQ09ERVNJWkUgPSBtb2RfZmlybXdhcmVfbG9hZChJTklUQ09ERUZJTEUsICZJTklUQ09ERSk7CisJaWYgKCFJTklUQ09ERSkgeworCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRSAiOiBFcnJvciBsb2FkaW5nICIgSU5JVENPREVGSUxFKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlQRVJNQ09ERVNJWkUgPSBtb2RfZmlybXdhcmVfbG9hZChQRVJNQ09ERUZJTEUsICZQRVJNQ09ERSk7CisJaWYgKCFQRVJNQ09ERSkgeworCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRSAiOiBFcnJvciBsb2FkaW5nICIgUEVSTUNPREVGSUxFKTsKKwkJdmZyZWUoSU5JVENPREUpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKyNlbmRpZgorCW1lbWNweV90b2lvKGRldi5iYXNlLCBQRVJNQ09ERSwgUEVSTUNPREVTSVpFKTsKKwlpZiAobXNuZF91cGxvYWRfaG9zdCgmZGV2LCBJTklUQ09ERSwgSU5JVENPREVTSVpFKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBMT0dOQU1FICI6IEVycm9yIHVwbG9hZGluZyB0byBEU1BcbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisjaWZkZWYgSEFWRV9EU1BDT0RFSAorCXByaW50ayhLRVJOX0lORk8gTE9HTkFNRSAiOiBEU1AgZmlybXdhcmUgdXBsb2FkZWQgKHJlc2lkZW50KVxuIik7CisjZWxzZQorCXByaW50ayhLRVJOX0lORk8gTE9HTkFNRSAiOiBEU1AgZmlybXdhcmUgdXBsb2FkZWRcbiIpOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9EU1BDT0RFSAorCXZmcmVlKElOSVRDT0RFKTsKKwl2ZnJlZShQRVJNQ09ERSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisjaWZkZWYgTVNORF9DTEFTU0lDCitzdGF0aWMgdm9pZCByZXNldF9wcm90ZXVzKHZvaWQpCit7CisJbXNuZF9vdXRiKEhQUFJPUkVTRVRfT04sIGRldi5pbyArIEhQX1BST1IpOworCW1kZWxheShUSU1FX1BST19SRVNFVCk7CisJbXNuZF9vdXRiKEhQUFJPUkVTRVRfT0ZGLCBkZXYuaW8gKyBIUF9QUk9SKTsKKwltZGVsYXkoVElNRV9QUk9fUkVTRVRfRE9ORSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBpbml0aWFsaXplKHZvaWQpCit7CisJaW50IGVyciwgdGltZW91dDsKKworI2lmZGVmIE1TTkRfQ0xBU1NJQworCW1zbmRfb3V0YihIUFdBSVRTVEFURV8wLCBkZXYuaW8gKyBIUF9XQUlUKTsKKwltc25kX291dGIoSFBCSVRNT0RFXzE2LCBkZXYuaW8gKyBIUF9CSVRNKTsKKworCXJlc2V0X3Byb3RldXMoKTsKKyNlbmRpZgorCWlmICgoZXJyID0gaW5pdF9zbWEoKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgTE9HTkFNRSAiOiBDYW5ub3QgaW5pdGlhbGl6ZSBTTUFcbiIpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZXJyID0gcmVzZXRfZHNwKCkpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCWlmICgoZXJyID0gdXBsb2FkX2RzcF9jb2RlKCkpIDwgMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HIExPR05BTUUgIjogQ2Fubm90IHVwbG9hZCBEU1AgY29kZVxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJdGltZW91dCA9IDIwMDsKKwl3aGlsZSAocmVhZHcoZGV2LmJhc2UpKSB7CisJCW1kZWxheSgxKTsKKwkJaWYgKCF0aW1lb3V0LS0pIHsKKwkJCXByaW50ayhLRVJOX0RFQlVHIExPR05BTUUgIjogRFNQIHJlc2V0IHRpbWVvdXRcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwl9CisKKwltaXhlcl9zZXR1cCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNwX2Z1bGxfcmVzZXQodm9pZCkKK3sKKwlpbnQgcnY7CisKKwlpZiAodGVzdF9iaXQoRl9SRVNFVFRJTkcsICZkZXYuZmxhZ3MpIHx8ICsrZGV2Lm5yZXNldHMgPiAxMCkKKwkJcmV0dXJuIDA7CisKKwlzZXRfYml0KEZfUkVTRVRUSU5HLCAmZGV2LmZsYWdzKTsKKwlwcmludGsoS0VSTl9JTkZPIExPR05BTUUgIjogRFNQIHJlc2V0XG4iKTsKKwlkc3BfaGFsdChOVUxMKTsJCQkvKiBVbmNvbmRpdGlvbmFsbHkgaGFsdCAqLworCWlmICgocnYgPSBpbml0aWFsaXplKCkpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HIExPR05BTUUgIjogRFNQIHJlc2V0IGZhaWxlZFxuIik7CisJZm9yY2VfcmVjc3JjKGRldi5yZWNzcmMpOworCWRzcF9vcGVuKE5VTEwpOworCWNsZWFyX2JpdChGX1JFU0VUVElORywgJmRldi5mbGFncyk7CisKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGF0dGFjaF9tdWx0aXNvdW5kKHZvaWQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcmVxdWVzdF9pcnEoZGV2LmlycSwgaW50ciwgMCwgZGV2Lm5hbWUsICZkZXYpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogQ291bGRuJ3QgZ3JhYiBJUlEgJWRcbiIsIGRldi5pcnEpOworCQlyZXR1cm4gZXJyOworCX0KKwlyZXF1ZXN0X3JlZ2lvbihkZXYuaW8sIGRldi5udW1pbywgZGV2Lm5hbWUpOworCisgICAgICAgIGlmICgoZXJyID0gZHNwX2Z1bGxfcmVzZXQoKSkgPCAwKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldi5pbywgZGV2Lm51bWlvKTsKKwkJZnJlZV9pcnEoZGV2LmlycSwgJmRldik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBtc25kX3JlZ2lzdGVyKCZkZXYpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogVW5hYmxlIHRvIHJlZ2lzdGVyIE11bHRpU291bmRcbiIpOworCQlyZWxlYXNlX3JlZ2lvbihkZXYuaW8sIGRldi5udW1pbyk7CisJCWZyZWVfaXJxKGRldi5pcnEsICZkZXYpOworCQlyZXR1cm4gZXJyOworCX0KKworCWlmICgoZGV2LmRzcF9taW5vciA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmZGV2X2ZpbGVvcHMsIC0xKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IFVuYWJsZSB0byByZWdpc3RlciBEU1Agb3BlcmF0aW9uc1xuIik7CisJCW1zbmRfdW5yZWdpc3RlcigmZGV2KTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2LmlvLCBkZXYubnVtaW8pOworCQlmcmVlX2lycShkZXYuaXJxLCAmZGV2KTsKKwkJcmV0dXJuIGRldi5kc3BfbWlub3I7CisJfQorCisJaWYgKChkZXYubWl4ZXJfbWlub3IgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmZGV2X2ZpbGVvcHMsIC0xKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IFVuYWJsZSB0byByZWdpc3RlciBtaXhlciBvcGVyYXRpb25zXG4iKTsKKwkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihkZXYubWl4ZXJfbWlub3IpOworCQltc25kX3VucmVnaXN0ZXIoJmRldik7CisJCXJlbGVhc2VfcmVnaW9uKGRldi5pbywgZGV2Lm51bWlvKTsKKwkJZnJlZV9pcnEoZGV2LmlycSwgJmRldik7CisJCXJldHVybiBkZXYubWl4ZXJfbWlub3I7CisJfQorCisJZGV2LmV4dF9taWRpX2RldiA9IGRldi5oZHJfbWlkaV9kZXYgPSAtMTsKKworCWRpc2FibGVfaXJxKGRldi5pcnEpOworCWNhbGlicmF0ZV9hZGMoZGV2LnBsYXlfc2FtcGxlX3JhdGUpOworI2lmbmRlZiBNU05EX0NMQVNTSUMKKwlmb3JjZV9yZWNzcmMoU09VTkRfTUFTS19JTUlYKTsKKyNlbmRpZgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfbXVsdGlzb3VuZCh2b2lkKQoreworCXJlbGVhc2VfcmVnaW9uKGRldi5pbywgZGV2Lm51bWlvKTsKKwlmcmVlX2lycShkZXYuaXJxLCAmZGV2KTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGRldi5taXhlcl9taW5vcik7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2LmRzcF9taW5vcik7CisJbXNuZF91bnJlZ2lzdGVyKCZkZXYpOworfQorCisjaWZuZGVmIE1TTkRfQ0xBU1NJQworCisvKiBQaW5uYWNsZS9GaWppIExvZ2ljYWwgRGV2aWNlIENvbmZpZ3VyYXRpb24gKi8KKworc3RhdGljIGludCBfX2luaXQgbXNuZF93cml0ZV9jZmcoaW50IGNmZywgaW50IHJlZywgaW50IHZhbHVlKQoreworCW1zbmRfb3V0YihyZWcsIGNmZyk7CisJbXNuZF9vdXRiKHZhbHVlLCBjZmcgKyAxKTsKKwlpZiAodmFsdWUgIT0gbXNuZF9pbmIoY2ZnICsgMSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogbXNuZF93cml0ZV9jZmc6IEkvTyBlcnJvclxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgbXNuZF93cml0ZV9jZmdfaW8wKGludCBjZmcsIGludCBudW0sIFdPUkQgaW8pCit7CisJaWYgKG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19MT0dERVZJQ0UsIG51bSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfSU8wX0JBU0VISSwgSElCWVRFKGlvKSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfSU8wX0JBU0VMTywgTE9CWVRFKGlvKSkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtc25kX3dyaXRlX2NmZ19pbzEoaW50IGNmZywgaW50IG51bSwgV09SRCBpbykKK3sKKwlpZiAobXNuZF93cml0ZV9jZmcoY2ZnLCBJUkVHX0xPR0RFVklDRSwgbnVtKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19JTzFfQkFTRUhJLCBISUJZVEUoaW8pKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19JTzFfQkFTRUxPLCBMT0JZVEUoaW8pKSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbmRfd3JpdGVfY2ZnX2lycShpbnQgY2ZnLCBpbnQgbnVtLCBXT1JEIGlycSkKK3sKKwlpZiAobXNuZF93cml0ZV9jZmcoY2ZnLCBJUkVHX0xPR0RFVklDRSwgbnVtKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19JUlFfTlVNQkVSLCBMT0JZVEUoaXJxKSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfSVJRX1RZUEUsIElSUVRZUEVfRURHRSkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtc25kX3dyaXRlX2NmZ19tZW0oaW50IGNmZywgaW50IG51bSwgaW50IG1lbSkKK3sKKwlXT1JEIHdtZW07CisKKwltZW0gPj49IDg7CisJbWVtICY9IDB4ZmZmOworCXdtZW0gPSAoV09SRCltZW07CisJaWYgKG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19MT0dERVZJQ0UsIG51bSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfTUVNQkFTRUhJLCBISUJZVEUod21lbSkpKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF93cml0ZV9jZmcoY2ZnLCBJUkVHX01FTUJBU0VMTywgTE9CWVRFKHdtZW0pKSkKKwkJcmV0dXJuIC1FSU87CisJaWYgKHdtZW0gJiYgbXNuZF93cml0ZV9jZmcoY2ZnLCBJUkVHX01FTUNPTlRST0wsIChNRU1UWVBFX0hJQUREUiB8IE1FTVRZUEVfMTZCSVQpKSkKKwkJcmV0dXJuIC1FSU87CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IG1zbmRfYWN0aXZhdGVfbG9naWNhbChpbnQgY2ZnLCBpbnQgbnVtKQoreworCWlmIChtc25kX3dyaXRlX2NmZyhjZmcsIElSRUdfTE9HREVWSUNFLCBudW0pKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAobXNuZF93cml0ZV9jZmcoY2ZnLCBJUkVHX0FDVElWQVRFLCBMRF9BQ1RJVkFURSkpCisJCXJldHVybiAtRUlPOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCBtc25kX3dyaXRlX2NmZ19sb2dpY2FsKGludCBjZmcsIGludCBudW0sIFdPUkQgaW8wLCBXT1JEIGlvMSwgV09SRCBpcnEsIGludCBtZW0pCit7CisJaWYgKG1zbmRfd3JpdGVfY2ZnKGNmZywgSVJFR19MT0dERVZJQ0UsIG51bSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZ19pbzAoY2ZnLCBudW0sIGlvMCkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZ19pbzEoY2ZnLCBudW0sIGlvMSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZ19pcnEoY2ZnLCBudW0sIGlycSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX3dyaXRlX2NmZ19tZW0oY2ZnLCBudW0sIG1lbSkpCisJCXJldHVybiAtRUlPOworCWlmIChtc25kX2FjdGl2YXRlX2xvZ2ljYWwoY2ZnLCBudW0pKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgbXNuZF9waW5uYWNsZV9jZmdfZGV2aWNlIHsKKwlXT1JEIGlvMCwgaW8xLCBpcnE7CisJaW50IG1lbTsKK30gbXNuZF9waW5uYWNsZV9jZmdfdFs0XTsKKworc3RhdGljIGludCBfX2luaXQgbXNuZF9waW5uYWNsZV9jZmdfZGV2aWNlcyhpbnQgY2ZnLCBpbnQgcmVzZXQsIG1zbmRfcGlubmFjbGVfY2ZnX3QgZGV2aWNlKQoreworCWludCBpOworCisJLyogUmVzZXQgZGV2aWNlcyBpZiB0b2xkIHRvICovCisJaWYgKHJlc2V0KSB7CisJCXByaW50ayhLRVJOX0lORk8gTE9HTkFNRSAiOiBSZXNldHRpbmcgYWxsIGRldmljZXNcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKQorCQkJaWYgKG1zbmRfd3JpdGVfY2ZnX2xvZ2ljYWwoY2ZnLCBpLCAwLCAwLCAwLCAwKSkKKwkJCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBDb25maWd1cmUgc3BlY2lmaWVkIGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgKytpKSB7CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgMDoJCS8qIERTUCAqLworCQkJaWYgKCEoZGV2aWNlW2ldLmlvMCAmJiBkZXZpY2VbaV0uaXJxICYmIGRldmljZVtpXS5tZW0pKQorCQkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCWNhc2UgMToJCS8qIE1QVSAqLworCQkJaWYgKCEoZGV2aWNlW2ldLmlvMCAmJiBkZXZpY2VbaV0uaXJxKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ayhLRVJOX0lORk8gTE9HTkFNRQorCQkJICAgICAgICI6IENvbmZpZ3VyaW5nIE1QVSB0byBJL08gMHgleCBJUlEgJWRcbiIsCisJCQkgICAgICAgZGV2aWNlW2ldLmlvMCwgZGV2aWNlW2ldLmlycSk7CisJCQlicmVhazsKKwkJY2FzZSAyOgkJLyogSURFICovCisJCQlpZiAoIShkZXZpY2VbaV0uaW8wICYmIGRldmljZVtpXS5pbzEgJiYgZGV2aWNlW2ldLmlycSkpCisJCQkJY29udGludWU7CisJCQlwcmludGsoS0VSTl9JTkZPIExPR05BTUUKKwkJCSAgICAgICAiOiBDb25maWd1cmluZyBJREUgdG8gSS9PIDB4JXgsIDB4JXggSVJRICVkXG4iLAorCQkJICAgICAgIGRldmljZVtpXS5pbzAsIGRldmljZVtpXS5pbzEsIGRldmljZVtpXS5pcnEpOworCQkJYnJlYWs7CisJCWNhc2UgMzoJCS8qIEpveXN0aWNrICovCisJCQlpZiAoIShkZXZpY2VbaV0uaW8wKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ayhLRVJOX0lORk8gTE9HTkFNRQorCQkJICAgICAgICI6IENvbmZpZ3VyaW5nIGpveXN0aWNrIHRvIEkvTyAweCV4XG4iLAorCQkJICAgICAgIGRldmljZVtpXS5pbzApOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBDb25maWd1cmUgdGhlIGRldmljZSAqLworCQlpZiAobXNuZF93cml0ZV9jZmdfbG9naWNhbChjZmcsIGksIGRldmljZVtpXS5pbzAsIGRldmljZVtpXS5pbzEsIGRldmljZVtpXS5pcnEsIGRldmljZVtpXS5tZW0pKQorCQkJcmV0dXJuIC1FSU87CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmZGVmIE1PRFVMRQorTU9EVUxFX0FVVEhPUgkJCQkoIkFuZHJldyBWZWxpYXRoIDxhbmRyZXd0dkB1c2EubmV0PiIpOworTU9EVUxFX0RFU0NSSVBUSU9OCQkJKCJUdXJ0bGUgQmVhY2ggIiBMT05HTkFNRSAiIExpbnV4IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGlvIF9faW5pdGRhdGEgPQkJLTE7CitzdGF0aWMgaW50IGlycSBfX2luaXRkYXRhID0JCS0xOworc3RhdGljIGludCBtZW0gX19pbml0ZGF0YSA9CQktMTsKK3N0YXRpYyBpbnQgd3JpdGVfbmRlbGF5IF9faW5pdGRhdGEgPQktMTsKKworI2lmbmRlZiBNU05EX0NMQVNTSUMKKy8qIFBpbm5hY2xlL0Zpamkgbm9uLVBuUCBDb25maWcgUG9ydCAqLworc3RhdGljIGludCBjZmcgX19pbml0ZGF0YSA9CQktMTsKKworLyogRXh0cmEgUGVyaXBoZXJhbCBDb25maWd1cmF0aW9uICovCitzdGF0aWMgaW50IHJlc2V0IF9faW5pdGRhdGEgPSAwOworc3RhdGljIGludCBtcHVfaW8gX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IG1wdV9pcnEgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGlkZV9pbzAgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGlkZV9pbzEgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGlkZV9pcnEgX19pbml0ZGF0YSA9IDA7CitzdGF0aWMgaW50IGpveXN0aWNrX2lvIF9faW5pdGRhdGEgPSAwOworCisvKiBJZiB3ZSBoYXZlIHRoZSBkaWdpdGFsIGRhdWdoZXJib2FyZC4uLiAqLworc3RhdGljIGludCBkaWdpdGFsIF9faW5pdGRhdGEgPSAwOworI2VuZGlmCisKK3N0YXRpYyBpbnQgZmlmb3NpemUgX19pbml0ZGF0YSA9CURFRkZJRk9TSVpFOworc3RhdGljIGludCBjYWxpYnJhdGVfc2lnbmFsIF9faW5pdGRhdGEgPSAwOworCisjZWxzZSAvKiBub3QgYSBtb2R1bGUgKi8KKworc3RhdGljIGludCB3cml0ZV9uZGVsYXkgX19pbml0ZGF0YSA9CS0xOworCisjaWZkZWYgTVNORF9DTEFTU0lDCitzdGF0aWMgaW50IGlvIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRDTEFTX0lPOworc3RhdGljIGludCBpcnEgX19pbml0ZGF0YSA9CQlDT05GSUdfTVNORENMQVNfSVJROworc3RhdGljIGludCBtZW0gX19pbml0ZGF0YSA9CQlDT05GSUdfTVNORENMQVNfTUVNOworI2Vsc2UgLyogUGlubmFjbGUvRmlqaSAqLworCitzdGF0aWMgaW50IGlvIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRQSU5fSU87CitzdGF0aWMgaW50IGlycSBfX2luaXRkYXRhID0JCUNPTkZJR19NU05EUElOX0lSUTsKK3N0YXRpYyBpbnQgbWVtIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRQSU5fTUVNOworCisvKiBQaW5uYWNsZS9GaWppIG5vbi1QblAgQ29uZmlnIFBvcnQgKi8KKyNpZmRlZiBDT05GSUdfTVNORFBJTl9OT05QTlAKKyMgIGlmbmRlZiBDT05GSUdfTVNORFBJTl9DRkcKKyMgICAgZGVmaW5lIENPTkZJR19NU05EUElOX0NGRwkJMHgyNTAKKyMgIGVuZGlmCisjZWxzZQorIyAgaWZkZWYgQ09ORklHX01TTkRQSU5fQ0ZHCisjICAgIHVuZGVmIENPTkZJR19NU05EUElOX0NGRworIyAgZW5kaWYKKyMgIGRlZmluZSBDT05GSUdfTVNORFBJTl9DRkcJCS0xCisjZW5kaWYKK3N0YXRpYyBpbnQgY2ZnIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRQSU5fQ0ZHOworLyogSWYgbm90IGEgbW9kdWxlLCB3ZSBkb24ndCBuZWVkIHRvIGJvdGhlciB3aXRoIHJlc2V0PTEgKi8KK3N0YXRpYyBpbnQgcmVzZXQ7CisKKy8qIEV4dHJhIFBlcmlwaGVyYWwgQ29uZmlndXJhdGlvbiAoRGVmYXVsdDogRGlzYWJsZSkgKi8KKyNpZm5kZWYgQ09ORklHX01TTkRQSU5fTVBVX0lPCisjICBkZWZpbmUgQ09ORklHX01TTkRQSU5fTVBVX0lPCQkwCisjZW5kaWYKK3N0YXRpYyBpbnQgbXB1X2lvIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRQSU5fTVBVX0lPOworCisjaWZuZGVmIENPTkZJR19NU05EUElOX01QVV9JUlEKKyMgIGRlZmluZSBDT05GSUdfTVNORFBJTl9NUFVfSVJRCTAKKyNlbmRpZgorc3RhdGljIGludCBtcHVfaXJxIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRQSU5fTVBVX0lSUTsKKworI2lmbmRlZiBDT05GSUdfTVNORFBJTl9JREVfSU8wCisjICBkZWZpbmUgQ09ORklHX01TTkRQSU5fSURFX0lPMAkwCisjZW5kaWYKK3N0YXRpYyBpbnQgaWRlX2lvMCBfX2luaXRkYXRhID0JCUNPTkZJR19NU05EUElOX0lERV9JTzA7CisKKyNpZm5kZWYgQ09ORklHX01TTkRQSU5fSURFX0lPMQorIyAgZGVmaW5lIENPTkZJR19NU05EUElOX0lERV9JTzEJMAorI2VuZGlmCitzdGF0aWMgaW50IGlkZV9pbzEgX19pbml0ZGF0YSA9CQlDT05GSUdfTVNORFBJTl9JREVfSU8xOworCisjaWZuZGVmIENPTkZJR19NU05EUElOX0lERV9JUlEKKyMgIGRlZmluZSBDT05GSUdfTVNORFBJTl9JREVfSVJRCTAKKyNlbmRpZgorc3RhdGljIGludCBpZGVfaXJxIF9faW5pdGRhdGEgPQkJQ09ORklHX01TTkRQSU5fSURFX0lSUTsKKworI2lmbmRlZiBDT05GSUdfTVNORFBJTl9KT1lTVElDS19JTworIyAgZGVmaW5lIENPTkZJR19NU05EUElOX0pPWVNUSUNLX0lPCTAKKyNlbmRpZgorc3RhdGljIGludCBqb3lzdGlja19pbyBfX2luaXRkYXRhID0JQ09ORklHX01TTkRQSU5fSk9ZU1RJQ0tfSU87CisKKy8qIEhhdmUgU1BESUYgKERpZ2l0YWwpIERhdWdodGVyYm9hcmQgKi8KKyNpZm5kZWYgQ09ORklHX01TTkRQSU5fRElHSVRBTAorIyAgZGVmaW5lIENPTkZJR19NU05EUElOX0RJR0lUQUwJMAorI2VuZGlmCitzdGF0aWMgaW50IGRpZ2l0YWwgX19pbml0ZGF0YSA9CQlDT05GSUdfTVNORFBJTl9ESUdJVEFMOworCisjZW5kaWYgLyogTVNORF9DTEFTU0lDICovCisKKyNpZm5kZWYgQ09ORklHX01TTkRfRklGT1NJWkUKKyMgIGRlZmluZSBDT05GSUdfTVNORF9GSUZPU0laRQkJREVGRklGT1NJWkUKKyNlbmRpZgorc3RhdGljIGludCBmaWZvc2l6ZSBfX2luaXRkYXRhID0JQ09ORklHX01TTkRfRklGT1NJWkU7CisKKyNpZm5kZWYgQ09ORklHX01TTkRfQ0FMU0lHTkFMCisjICBkZWZpbmUgQ09ORklHX01TTkRfQ0FMU0lHTkFMCQkwCisjZW5kaWYKK3N0YXRpYyBpbnQKK2NhbGlicmF0ZV9zaWduYWwgX19pbml0ZGF0YSA9CQlDT05GSUdfTVNORF9DQUxTSUdOQUw7CisjZW5kaWYgLyogTU9EVUxFICovCisKK21vZHVsZV9wYXJhbQkJCQkoaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbQkJCQkobWVtLCBpbnQsIDApOworbW9kdWxlX3BhcmFtCQkJCSh3cml0ZV9uZGVsYXksIGludCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKGZpZm9zaXplLCBpbnQsIDApOworbW9kdWxlX3BhcmFtCQkJCShjYWxpYnJhdGVfc2lnbmFsLCBpbnQsIDApOworI2lmbmRlZiBNU05EX0NMQVNTSUMKK21vZHVsZV9wYXJhbQkJCQkoZGlnaXRhbCwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKGNmZywgaW50LCAwKTsKK21vZHVsZV9wYXJhbQkJCQkocmVzZXQsIGludCwgMCk7Cittb2R1bGVfcGFyYW0JCQkJKG1wdV9pbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbQkJCQkobXB1X2lycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbQkJCQkoaWRlX2lvMCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbQkJCQkoaWRlX2lvMSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbQkJCQkoaWRlX2lycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbQkJCQkoam95c3RpY2tfaW8sIGludCwgMCk7CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgbXNuZF9pbml0KHZvaWQpCit7CisJaW50IGVycjsKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJc3RhdGljIG1zbmRfcGlubmFjbGVfY2ZnX3QgcGlubmFjbGVfZGV2czsKKyNlbmRpZiAvKiBNU05EX0NMQVNTSUMgKi8KKworCXByaW50ayhLRVJOX0lORk8gTE9HTkFNRSAiOiBUdXJ0bGUgQmVhY2ggIiBMT05HTkFNRSAiIExpbnV4IERyaXZlciBWZXJzaW9uICIKKwkgICAgICAgVkVSU0lPTiAiLCBDb3B5cmlnaHQgKEMpIDE5OTggQW5kcmV3IFZlbGlhdGhcbiIpOworCisJaWYgKGlvID09IC0xIHx8IGlycSA9PSAtMSB8fCBtZW0gPT0gLTEpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgTE9HTkFNRSAiOiBpbywgaXJxIGFuZCBtZW0gbXVzdCBiZSBzZXRcbiIpOworCisjaWZkZWYgTVNORF9DTEFTU0lDCisJaWYgKGlvID09IC0xIHx8CisJICAgICEoaW8gPT0gMHgyOTAgfHwKKwkgICAgICBpbyA9PSAweDI2MCB8fAorCSAgICAgIGlvID09IDB4MjUwIHx8CisJICAgICAgaW8gPT0gMHgyNDAgfHwKKwkgICAgICBpbyA9PSAweDIzMCB8fAorCSAgICAgIGlvID09IDB4MjIwIHx8CisJICAgICAgaW8gPT0gMHgyMTAgfHwKKwkgICAgICBpbyA9PSAweDNlMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogXCJpb1wiIC0gRFNQIEkvTyBiYXNlIG11c3QgYmUgc2V0IHRvIDB4MjEwLCAweDIyMCwgMHgyMzAsIDB4MjQwLCAweDI1MCwgMHgyNjAsIDB4MjkwLCBvciAweDNFMFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKyNlbHNlCisJaWYgKGlvID09IC0xIHx8CisJCWlvIDwgMHgxMDAgfHwKKwkJaW8gPiAweDNlMCB8fAorCQkoaW8gJSAweDEwKSAhPSAwKSB7CisJCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRSAiOiBcImlvXCIgLSBEU1AgSS9PIGJhc2UgbXVzdCB3aXRoaW4gdGhlIHJhbmdlIDB4MTAwIHRvIDB4M0UwIGFuZCBtdXN0IGJlIGV2ZW5seSBkaXZpc2libGUgYnkgMHgxMFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjZW5kaWYgLyogTVNORF9DTEFTU0lDICovCisKKwlpZiAoaXJxID09IC0xIHx8CisJICAgICEoaXJxID09IDUgfHwKKwkgICAgICBpcnEgPT0gNyB8fAorCSAgICAgIGlycSA9PSA5IHx8CisJICAgICAgaXJxID09IDEwIHx8CisJICAgICAgaXJxID09IDExIHx8CisJICAgICAgaXJxID09IDEyKSkgeworCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRSAiOiBcImlycVwiIC0gbXVzdCBiZSBzZXQgdG8gNSwgNywgOSwgMTAsIDExIG9yIDEyXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1lbSA9PSAtMSB8fAorCSAgICAhKG1lbSA9PSAweGIwMDAwIHx8CisJICAgICAgbWVtID09IDB4YzgwMDAgfHwKKwkgICAgICBtZW0gPT0gMHhkMDAwMCB8fAorCSAgICAgIG1lbSA9PSAweGQ4MDAwIHx8CisJICAgICAgbWVtID09IDB4ZTAwMDAgfHwKKwkgICAgICBtZW0gPT0gMHhlODAwMCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogXCJtZW1cIiAtIG11c3QgYmUgc2V0IHRvICIKKwkJICAgICAgICIweGIwMDAwLCAweGM4MDAwLCAweGQwMDAwLCAweGQ4MDAwLCAweGUwMDAwIG9yIDB4ZTgwMDBcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKyNpZmRlZiBNU05EX0NMQVNTSUMKKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgNTogZGV2LmlycWlkID0gSFBJUlFfNTsgYnJlYWs7CisJY2FzZSA3OiBkZXYuaXJxaWQgPSBIUElSUV83OyBicmVhazsKKwljYXNlIDk6IGRldi5pcnFpZCA9IEhQSVJRXzk7IGJyZWFrOworCWNhc2UgMTA6IGRldi5pcnFpZCA9IEhQSVJRXzEwOyBicmVhazsKKwljYXNlIDExOiBkZXYuaXJxaWQgPSBIUElSUV8xMTsgYnJlYWs7CisJY2FzZSAxMjogZGV2LmlycWlkID0gSFBJUlFfMTI7IGJyZWFrOworCX0KKworCXN3aXRjaCAobWVtKSB7CisJY2FzZSAweGIwMDAwOiBkZXYubWVtaWQgPSBIUE1FTV9CMDAwOyBicmVhazsKKwljYXNlIDB4YzgwMDA6IGRldi5tZW1pZCA9IEhQTUVNX0M4MDA7IGJyZWFrOworCWNhc2UgMHhkMDAwMDogZGV2Lm1lbWlkID0gSFBNRU1fRDAwMDsgYnJlYWs7CisJY2FzZSAweGQ4MDAwOiBkZXYubWVtaWQgPSBIUE1FTV9EODAwOyBicmVhazsKKwljYXNlIDB4ZTAwMDA6IGRldi5tZW1pZCA9IEhQTUVNX0UwMDA7IGJyZWFrOworCWNhc2UgMHhlODAwMDogZGV2Lm1lbWlkID0gSFBNRU1fRTgwMDsgYnJlYWs7CisJfQorI2Vsc2UKKwlpZiAoY2ZnID09IC0xKSB7CisJCXByaW50ayhLRVJOX0lORk8gTE9HTkFNRSAiOiBBc3N1bWluZyBQblAgbW9kZVxuIik7CisJfSBlbHNlIGlmIChjZmcgIT0gMHgyNTAgJiYgY2ZnICE9IDB4MjYwICYmIGNmZyAhPSAweDI3MCkgeworCQlwcmludGsoS0VSTl9JTkZPIExPR05BTUUgIjogQ29uZmlnIHBvcnQgbXVzdCBiZSAweDI1MCwgMHgyNjAgb3IgMHgyNzAgKG9yIHVuc3BlY2lmaWVkIGZvciBQblAgbW9kZSlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgeworCQlwcmludGsoS0VSTl9JTkZPIExPR05BTUUgIjogTm9uLVBuUCBtb2RlOiBjb25maWd1cmluZyBhdCBwb3J0IDB4JXhcbiIsIGNmZyk7CisKKwkJLyogRFNQICovCisJCXBpbm5hY2xlX2RldnNbMF0uaW8wID0gaW87CisJCXBpbm5hY2xlX2RldnNbMF0uaXJxID0gaXJxOworCQlwaW5uYWNsZV9kZXZzWzBdLm1lbSA9IG1lbTsKKworCQkvKiBUaGUgZm9sbG93aW5nIGFyZSBQaW5uYWNsZSBzcGVjaWZpYyAqLworCisJCS8qIE1QVSAqLworCQlwaW5uYWNsZV9kZXZzWzFdLmlvMCA9IG1wdV9pbzsKKwkJcGlubmFjbGVfZGV2c1sxXS5pcnEgPSBtcHVfaXJxOworCisJCS8qIElERSAqLworCQlwaW5uYWNsZV9kZXZzWzJdLmlvMCA9IGlkZV9pbzA7CisJCXBpbm5hY2xlX2RldnNbMl0uaW8xID0gaWRlX2lvMTsKKwkJcGlubmFjbGVfZGV2c1syXS5pcnEgPSBpZGVfaXJxOworCisJCS8qIEpveXN0aWNrICovCisJCXBpbm5hY2xlX2RldnNbM10uaW8wID0gam95c3RpY2tfaW87CisKKwkJaWYgKCFyZXF1ZXN0X3JlZ2lvbihjZmcsIDIsICJQaW5uYWNsZS9GaWppIENvbmZpZyIpKSB7CisJCQlwcmludGsoS0VSTl9FUlIgTE9HTkFNRSAiOiBDb25maWcgcG9ydCAweCV4IGNvbmZsaWN0XG4iLCBjZmcpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKworCQlpZiAobXNuZF9waW5uYWNsZV9jZmdfZGV2aWNlcyhjZmcsIHJlc2V0LCBwaW5uYWNsZV9kZXZzKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogRGV2aWNlIGNvbmZpZ3VyYXRpb24gZXJyb3JcbiIpOworCQkJcmVsZWFzZV9yZWdpb24oY2ZnLCAyKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXJlbGVhc2VfcmVnaW9uKGNmZywgMik7CisJfQorI2VuZGlmIC8qIE1TTkRfQ0xBU1NJQyAqLworCisJaWYgKGZpZm9zaXplIDwgMTYpCisJCWZpZm9zaXplID0gMTY7CisKKwlpZiAoZmlmb3NpemUgPiAxMDI0KQorCQlmaWZvc2l6ZSA9IDEwMjQ7CisKKwlzZXRfZGVmYXVsdF9hdWRpb19wYXJhbWV0ZXJzKCk7CisjaWZkZWYgTVNORF9DTEFTU0lDCisJZGV2LnR5cGUgPSBtc25kQ2xhc3NpYzsKKyNlbHNlCisJZGV2LnR5cGUgPSBtc25kUGlubmFjbGU7CisjZW5kaWYKKwlkZXYuaW8gPSBpbzsKKwlkZXYubnVtaW8gPSBEU1BfTlVNSU87CisJZGV2LmlycSA9IGlycTsKKwlkZXYuYmFzZSA9IGlvcmVtYXAobWVtLCAweDgwMDApOworCWRldi5maWZvc2l6ZSA9IGZpZm9zaXplICogMTAyNDsKKwlkZXYuY2FsaWJyYXRlX3NpZ25hbCA9IGNhbGlicmF0ZV9zaWduYWwgPyAxIDogMDsKKwlkZXYucmVjc3JjID0gMDsKKwlkZXYuZHNwcV9kYXRhX2J1ZmYgPSBEU1BRX0RBVEFfQlVGRjsKKwlkZXYuZHNwcV9idWZmX3NpemUgPSBEU1BRX0JVRkZfU0laRTsKKwlpZiAod3JpdGVfbmRlbGF5ID09IC0xKQorCQl3cml0ZV9uZGVsYXkgPSBDT05GSUdfTVNORF9XUklURV9OREVMQVk7CisJaWYgKHdyaXRlX25kZWxheSkKKwkJY2xlYXJfYml0KEZfRElTQUJMRV9XUklURV9OREVMQVksICZkZXYuZmxhZ3MpOworCWVsc2UKKwkJc2V0X2JpdChGX0RJU0FCTEVfV1JJVEVfTkRFTEFZLCAmZGV2LmZsYWdzKTsKKyNpZm5kZWYgTVNORF9DTEFTU0lDCisJaWYgKGRpZ2l0YWwpCisJCXNldF9iaXQoRl9IQVZFRElHSVRBTCwgJmRldi5mbGFncyk7CisjZW5kaWYKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkZXYud3JpdGVibG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LnJlYWRibG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2LndyaXRlZmx1c2gpOworCW1zbmRfZmlmb19pbml0KCZkZXYuREFQRik7CisJbXNuZF9maWZvX2luaXQoJmRldi5EQVJGKTsKKwlzcGluX2xvY2tfaW5pdCgmZGV2LmxvY2spOworCXByaW50ayhLRVJOX0lORk8gTE9HTkFNRSAiOiAldSBieXRlIGF1ZGlvIEZJRk9zICh4MilcbiIsIGRldi5maWZvc2l6ZSk7CisJaWYgKChlcnIgPSBtc25kX2ZpZm9fYWxsb2MoJmRldi5EQVBGLCBkZXYuZmlmb3NpemUpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogQ291bGRuJ3QgYWxsb2NhdGUgd3JpdGUgRklGT1xuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBtc25kX2ZpZm9fYWxsb2MoJmRldi5EQVJGLCBkZXYuZmlmb3NpemUpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogQ291bGRuJ3QgYWxsb2NhdGUgcmVhZCBGSUZPXG4iKTsKKwkJbXNuZF9maWZvX2ZyZWUoJmRldi5EQVBGKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlpZiAoKGVyciA9IHByb2JlX211bHRpc291bmQoKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBMT0dOQU1FICI6IFByb2JlIGZhaWxlZFxuIik7CisJCW1zbmRfZmlmb19mcmVlKCZkZXYuREFQRik7CisJCW1zbmRfZmlmb19mcmVlKCZkZXYuREFSRik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKChlcnIgPSBhdHRhY2hfbXVsdGlzb3VuZCgpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSIExPR05BTUUgIjogQXR0YWNoIGZhaWxlZFxuIik7CisJCW1zbmRfZmlmb19mcmVlKCZkZXYuREFQRik7CisJCW1zbmRfZmlmb19mcmVlKCZkZXYuREFSRik7CisJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBtc2RuX2NsZWFudXAodm9pZCkKK3sKKwl1bmxvYWRfbXVsdGlzb3VuZCgpOworCW1zbmRfZmlmb19mcmVlKCZkZXYuREFQRik7CisJbXNuZF9maWZvX2ZyZWUoJmRldi5EQVJGKTsKK30KKworbW9kdWxlX2luaXQobXNuZF9pbml0KTsKK21vZHVsZV9leGl0KG1zZG5fY2xlYW51cCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvbXNuZF9waW5uYWNsZS5oIGIvc291bmQvb3NzL21zbmRfcGlubmFjbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODVhZWY0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL21zbmRfcGlubmFjbGUuaApAQCAtMCwwICsxLDI0OSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIG1zbmRfcGlubmFjbGUuaAorICoKKyAqIFR1cnRsZSBCZWFjaCBNdWx0aVNvdW5kIFNvdW5kIENhcmQgRHJpdmVyIGZvciBMaW51eAorICoKKyAqIFNvbWUgcGFydHMgb2YgdGhpcyBoZWFkZXIgZmlsZSB3ZXJlIGRlcml2ZWQgZnJvbSB0aGUgVHVydGxlIEJlYWNoCisgKiBNdWx0aVNvdW5kIERyaXZlciBEZXZlbG9wbWVudCBLaXQuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk4IEFuZHJldyBWZWxpYXRoCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMgVHVydGxlIEJlYWNoIFN5c3RlbXMsIEluYy4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAkSWQ6IG1zbmRfcGlubmFjbGUuaCx2IDEuMTEgMTk5OS8wMy8yMSAxNzozNjowOSBhbmRyZXd0diBFeHAgJAorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpZm5kZWYgX19NU05EX1BJTk5BQ0xFX0gKKyNkZWZpbmUgX19NU05EX1BJTk5BQ0xFX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjZGVmaW5lIERTUF9OVU1JTwkJCQkweDA4CisKKyNkZWZpbmUgSVJFR19MT0dERVZJQ0UJCQkJMHgwNworI2RlZmluZSBJUkVHX0FDVElWQVRFCQkJCTB4MzAKKyNkZWZpbmUgTERfQUNUSVZBVEUJCQkJMHgwMQorI2RlZmluZSBMRF9ESVNBQ1RJVkFURQkJCQkweDAwCisjZGVmaW5lIElSRUdfRUVDT05UUk9MCQkJCTB4M0YKKyNkZWZpbmUgSVJFR19NRU1CQVNFSEkJCQkJMHg0MAorI2RlZmluZSBJUkVHX01FTUJBU0VMTwkJCQkweDQxCisjZGVmaW5lIElSRUdfTUVNQ09OVFJPTAkJCQkweDQyCisjZGVmaW5lIElSRUdfTUVNUkFOR0VISQkJCQkweDQzCisjZGVmaW5lIElSRUdfTUVNUkFOR0VMTwkJCQkweDQ0CisjZGVmaW5lIE1FTVRZUEVfOEJJVAkJCQkweDAwCisjZGVmaW5lIE1FTVRZUEVfMTZCSVQJCQkJMHgwMgorI2RlZmluZSBNRU1UWVBFX1JBTkdFCQkJCTB4MDAKKyNkZWZpbmUgTUVNVFlQRV9ISUFERFIJCQkJMHgwMQorI2RlZmluZSBJUkVHX0lPMF9CQVNFSEkJCQkJMHg2MAorI2RlZmluZSBJUkVHX0lPMF9CQVNFTE8JCQkJMHg2MQorI2RlZmluZSBJUkVHX0lPMV9CQVNFSEkJCQkJMHg2MgorI2RlZmluZSBJUkVHX0lPMV9CQVNFTE8JCQkJMHg2MworI2RlZmluZSBJUkVHX0lSUV9OVU1CRVIJCQkJMHg3MAorI2RlZmluZSBJUkVHX0lSUV9UWVBFCQkJCTB4NzEKKyNkZWZpbmUgSVJRVFlQRV9ISUdICQkJCTB4MDIKKyNkZWZpbmUgSVJRVFlQRV9MT1cJCQkJMHgwMAorI2RlZmluZSBJUlFUWVBFX0xFVkVMCQkJCTB4MDEKKyNkZWZpbmUgSVJRVFlQRV9FREdFCQkJCTB4MDAKKworI2RlZmluZQlIUF9EU1BSCQkJCQkweDA0CisjZGVmaW5lCUhQX0JMS1MJCQkJCTB4MDQKKworI2RlZmluZSBIUERTUFJFU0VUX09GRgkJCQkyCisjZGVmaW5lIEhQRFNQUkVTRVRfT04JCQkJMAorCisjZGVmaW5lIEhQQkxLU0VMXzAJCQkJMgorI2RlZmluZSBIUEJMS1NFTF8xCQkJCTMKKworI2RlZmluZQlISU1UX0RBVF9PRkYJCQkJMHgwMworCisjZGVmaW5lCUhJRFNQX1BMQVlfVU5ERVIJCQkweDAwCisjZGVmaW5lCUhJRFNQX0lOVF9QTEFZX1VOREVSCQkJMHgwMQorI2RlZmluZQlISURTUF9TU0lfVFhfVU5ERVIgIAkJCTB4MDIKKyNkZWZpbmUgSElEU1BfUkVDUV9PVkVSRkxPVwkJCTB4MDgKKyNkZWZpbmUgSElEU1BfSU5UX1JFQ09SRF9PVkVSCQkJMHgwOQorI2RlZmluZSBISURTUF9TU0lfUlhfT1ZFUkZMT1cJCQkweDBhCisKKyNkZWZpbmUJSElEU1BfTUlESV9JTl9PVkVSCQkJMHgxMAorCisjZGVmaW5lCUhJRFNQX01JRElfRlJBTUVfRVJSCQkJMHgxMQorI2RlZmluZQlISURTUF9NSURJX1BBUklUWV9FUlIJCQkweDEyCisjZGVmaW5lCUhJRFNQX01JRElfT1ZFUlJVTl9FUlIJCQkweDEzCisKKyNkZWZpbmUgSElEU1BfSU5QVVRfQ0xJUFBJTkcJCQkweDIwCisjZGVmaW5lCUhJRFNQX01JWF9DTElQUElORwkJCTB4MzAKKyNkZWZpbmUgSElEU1BfREFUX0lOX09GRgkJCTB4MjEKKworI2RlZmluZQlIREVYQVJfU0VUX0FOQV9JTgkJCTAKKyNkZWZpbmUJSERFWEFSX0NMRUFSX1BFQUtTCQkJMQorI2RlZmluZQlIREVYQVJfSU5fU0VUX1BPVFMJCQkyCisjZGVmaW5lCUhERVhBUl9BVVhfU0VUX1BPVFMJCQkzCisjZGVmaW5lCUhERVhBUl9DQUxfQV9UT19ECQkJNAorI2RlZmluZQlIREVYQVJfUkRfRVhUX0RTUF9CSVRTCQkJNQorCisjZGVmaW5lCUhERVhBUl9TRVRfU1lOVEhfSU4JCQk0CisjZGVmaW5lCUhERVhBUl9SRUFEX0RBVF9JTgkJCTUKKyNkZWZpbmUJSERFWEFSX01JQ19TRVRfUE9UUwkJCTYKKyNkZWZpbmUJSERFWEFSX1NFVF9EQVRfSU4JCQk3CisKKyNkZWZpbmUgSERFWEFSX1NFVF9TWU5USF80OAkJCTgKKyNkZWZpbmUgSERFWEFSX1NFVF9TWU5USF80NAkJCTkKKworI2RlZmluZSBUSU1FX1BST19SRVNFVF9ET05FCQkJMHgwMjhBCisjZGVmaW5lIFRJTUVfUFJPX1NZU0VYCQkJCTB4MDAxRQorI2RlZmluZSBUSU1FX1BST19SRVNFVAkJCQkweDAwMzIKKworI2RlZmluZSBBR05ECQkJCQkweDAxCisjZGVmaW5lIFNJR05BTAkJCQkJMHgwMgorCisjZGVmaW5lIEVYVF9EU1BfQklUX0RDQUwJCQkweDAwMDEKKyNkZWZpbmUgRVhUX0RTUF9CSVRfTUlESV9DT04JCQkweDAwMDIKKworI2RlZmluZSBCVUZGU0laRQkJCQkweDgwMDAKKyNkZWZpbmUgSE9TVFFfU0laRQkJCQkweDQwCisKKyNkZWZpbmUgU1JBTV9DTlRMX1NUQVJUCQkJCTB4N0YwMAorI2RlZmluZSBTTUFfU1RSVUNUX1NUQVJUCQkJMHg3RjQwCisKKyNkZWZpbmUgREFQX0JVRkZfU0laRQkJCQkweDI0MDAKKyNkZWZpbmUgREFSX0JVRkZfU0laRQkJCQkweDIwMDAKKworI2RlZmluZSBEQVBRX1NUUlVDVF9TSVpFCQkJMHgxMAorI2RlZmluZSBEQVJRX1NUUlVDVF9TSVpFCQkJMHgxMAorI2RlZmluZSBEQVBRX0JVRkZfU0laRQkJCQkoMyAqIDB4MTApCisjZGVmaW5lIERBUlFfQlVGRl9TSVpFCQkJCSgzICogMHgxMCkKKyNkZWZpbmUgTU9EUV9CVUZGX1NJWkUJCQkJMHg0MDAKKyNkZWZpbmUgTUlEUV9CVUZGX1NJWkUJCQkJMHg4MDAKKyNkZWZpbmUgRFNQUV9CVUZGX1NJWkUJCQkJMHg1QTAKKworI2RlZmluZSBEQVBRX0RBVEFfQlVGRgkJCQkweDZDMDAKKyNkZWZpbmUgREFSUV9EQVRBX0JVRkYJCQkJMHg2QzMwCisjZGVmaW5lIE1PRFFfREFUQV9CVUZGCQkJCTB4NkM2MAorI2RlZmluZSBNSURRX0RBVEFfQlVGRgkJCQkweDcwNjAKKyNkZWZpbmUgRFNQUV9EQVRBX0JVRkYJCQkJMHg3ODYwCisKKyNkZWZpbmUgREFQUV9PRkZTRVQJCQkJU1JBTV9DTlRMX1NUQVJUCisjZGVmaW5lIERBUlFfT0ZGU0VUCQkJCShTUkFNX0NOVExfU1RBUlQgKyAweDA4KQorI2RlZmluZSBNT0RRX09GRlNFVAkJCQkoU1JBTV9DTlRMX1NUQVJUICsgMHgxMCkKKyNkZWZpbmUgTUlEUV9PRkZTRVQJCQkJKFNSQU1fQ05UTF9TVEFSVCArIDB4MTgpCisjZGVmaW5lIERTUFFfT0ZGU0VUCQkJCShTUkFNX0NOVExfU1RBUlQgKyAweDIwKQorCisjZGVmaW5lIE1PUF9XQVZFSERSCQkJCTAKKyNkZWZpbmUgTU9QX0VYVE9VVAkJCQkxCisjZGVmaW5lIE1PUF9IV0lOSVQJCQkJMHhmZQorI2RlZmluZSBNT1BfTk9ORQkJCQkweGZmCisjZGVmaW5lIE1PUF9NQVgJCQkJCTEKKworI2RlZmluZSBNSVBfRVhUSU4JCQkJMAorI2RlZmluZSBNSVBfV0FWRUhEUgkJCQkxCisjZGVmaW5lIE1JUF9IV0lOSVQJCQkJMHhmZQorI2RlZmluZSBNSVBfTUFYCQkJCQkxCisKKy8qIFBpbm5hY2xlL0ZpamkgU01BIENvbW1vbiBEYXRhICovCisjZGVmaW5lIFNNQV93Q3VyclBsYXlCeXRlcwkJCTB4MDAwMAorI2RlZmluZSBTTUFfd0N1cnJSZWNvcmRCeXRlcwkJCTB4MDAwMgorI2RlZmluZSBTTUFfd0N1cnJQbGF5Vm9sTGVmdAkJCTB4MDAwNAorI2RlZmluZSBTTUFfd0N1cnJQbGF5Vm9sUmlnaHQJCQkweDAwMDYKKyNkZWZpbmUgU01BX3dDdXJySW5Wb2xMZWZ0CQkJMHgwMDA4CisjZGVmaW5lIFNNQV93Q3VyckluVm9sUmlnaHQJCQkweDAwMGEKKyNkZWZpbmUgU01BX3dDdXJyTUhkclZvbExlZnQJCQkweDAwMGMKKyNkZWZpbmUgU01BX3dDdXJyTUhkclZvbFJpZ2h0CQkJMHgwMDBlCisjZGVmaW5lIFNNQV9kd0N1cnJQbGF5UGl0Y2gJCQkweDAwMTAKKyNkZWZpbmUgU01BX2R3Q3VyclBsYXlSYXRlCQkJMHgwMDE0CisjZGVmaW5lIFNNQV93Q3Vyck1JRElJT1BhdGNoCQkJMHgwMDE4CisjZGVmaW5lIFNNQV93Q3VyclBsYXlGb3JtYXQJCQkweDAwMWEKKyNkZWZpbmUgU01BX3dDdXJyUGxheVNhbXBsZVNpemUJCQkweDAwMWMKKyNkZWZpbmUgU01BX3dDdXJyUGxheUNoYW5uZWxzCQkJMHgwMDFlCisjZGVmaW5lIFNNQV93Q3VyclBsYXlTYW1wbGVSYXRlCQkJMHgwMDIwCisjZGVmaW5lIFNNQV93Q3VyclJlY29yZEZvcm1hdAkJCTB4MDAyMgorI2RlZmluZSBTTUFfd0N1cnJSZWNvcmRTYW1wbGVTaXplCQkweDAwMjQKKyNkZWZpbmUgU01BX3dDdXJyUmVjb3JkQ2hhbm5lbHMJCQkweDAwMjYKKyNkZWZpbmUgU01BX3dDdXJyUmVjb3JkU2FtcGxlUmF0ZQkJMHgwMDI4CisjZGVmaW5lIFNNQV93Q3VyckRTUFN0YXR1c0ZsYWdzCQkJMHgwMDJhCisjZGVmaW5lIFNNQV93Q3Vyckhvc3RTdGF0dXNGbGFncwkJMHgwMDJjCisjZGVmaW5lIFNNQV93Q3VycklucHV0VGFnQml0cwkJCTB4MDAyZQorI2RlZmluZSBTTUFfd0N1cnJMZWZ0UGVhawkJCTB4MDAzMAorI2RlZmluZSBTTUFfd0N1cnJSaWdodFBlYWsJCQkweDAwMzIKKyNkZWZpbmUgU01BX2JNaWNQb3RQb3NMZWZ0CQkJMHgwMDM0CisjZGVmaW5lIFNNQV9iTWljUG90UG9zUmlnaHQJCQkweDAwMzUKKyNkZWZpbmUgU01BX2JNaWNQb3RNYXhMZWZ0CQkJMHgwMDM2CisjZGVmaW5lIFNNQV9iTWljUG90TWF4UmlnaHQJCQkweDAwMzcKKyNkZWZpbmUgU01BX2JJblBvdFBvc0xlZnQJCQkweDAwMzgKKyNkZWZpbmUgU01BX2JJblBvdFBvc1JpZ2h0CQkJMHgwMDM5CisjZGVmaW5lIFNNQV9iQXV4UG90UG9zTGVmdAkJCTB4MDAzYQorI2RlZmluZSBTTUFfYkF1eFBvdFBvc1JpZ2h0CQkJMHgwMDNiCisjZGVmaW5lIFNNQV9iSW5Qb3RNYXhMZWZ0CQkJMHgwMDNjCisjZGVmaW5lIFNNQV9iSW5Qb3RNYXhSaWdodAkJCTB4MDAzZAorI2RlZmluZSBTTUFfYkF1eFBvdE1heExlZnQJCQkweDAwM2UKKyNkZWZpbmUgU01BX2JBdXhQb3RNYXhSaWdodAkJCTB4MDAzZgorI2RlZmluZSBTTUFfYkluUG90TWF4TWV0aG9kCQkJMHgwMDQwCisjZGVmaW5lIFNNQV9iQXV4UG90TWF4TWV0aG9kCQkJMHgwMDQxCisjZGVmaW5lIFNNQV93Q3Vyck1hc3RWb2xMZWZ0CQkJMHgwMDQyCisjZGVmaW5lIFNNQV93Q3Vyck1hc3RWb2xSaWdodAkJCTB4MDA0NAorI2RlZmluZSBTTUFfd0NhbEZyZXFBdG9ECQkJMHgwMDQ2CisjZGVmaW5lIFNNQV93Q3VyckF1eFZvbExlZnQJCQkweDAwNDgKKyNkZWZpbmUgU01BX3dDdXJyQXV4Vm9sUmlnaHQJCQkweDAwNGEKKyNkZWZpbmUgU01BX3dDdXJyUGxheTFWb2xMZWZ0CQkJMHgwMDRjCisjZGVmaW5lIFNNQV93Q3VyclBsYXkxVm9sUmlnaHQJCQkweDAwNGUKKyNkZWZpbmUgU01BX3dDdXJyUGxheTJWb2xMZWZ0CQkJMHgwMDUwCisjZGVmaW5lIFNNQV93Q3VyclBsYXkyVm9sUmlnaHQJCQkweDAwNTIKKyNkZWZpbmUgU01BX3dDdXJyUGxheTNWb2xMZWZ0CQkJMHgwMDU0CisjZGVmaW5lIFNNQV93Q3VyclBsYXkzVm9sUmlnaHQJCQkweDAwNTYKKyNkZWZpbmUgU01BX3dDdXJyUGxheTRWb2xMZWZ0CQkJMHgwMDU4CisjZGVmaW5lIFNNQV93Q3VyclBsYXk0Vm9sUmlnaHQJCQkweDAwNWEKKyNkZWZpbmUgU01BX3dDdXJyUGxheTFQZWFrTGVmdAkJCTB4MDA1YworI2RlZmluZSBTTUFfd0N1cnJQbGF5MVBlYWtSaWdodAkJCTB4MDA1ZQorI2RlZmluZSBTTUFfd0N1cnJQbGF5MlBlYWtMZWZ0CQkJMHgwMDYwCisjZGVmaW5lIFNNQV93Q3VyclBsYXkyUGVha1JpZ2h0CQkJMHgwMDYyCisjZGVmaW5lIFNNQV93Q3VyclBsYXkzUGVha0xlZnQJCQkweDAwNjQKKyNkZWZpbmUgU01BX3dDdXJyUGxheTNQZWFrUmlnaHQJCQkweDAwNjYKKyNkZWZpbmUgU01BX3dDdXJyUGxheTRQZWFrTGVmdAkJCTB4MDA2OAorI2RlZmluZSBTTUFfd0N1cnJQbGF5NFBlYWtSaWdodAkJCTB4MDA2YQorI2RlZmluZSBTTUFfd0N1cnJQbGF5UGVha0xlZnQJCQkweDAwNmMKKyNkZWZpbmUgU01BX3dDdXJyUGxheVBlYWtSaWdodAkJCTB4MDA2ZQorI2RlZmluZSBTTUFfd0N1cnJEQVRTUgkJCQkweDAwNzAKKyNkZWZpbmUgU01BX3dDdXJyREFUUlhDSE5MCQkJMHgwMDcyCisjZGVmaW5lIFNNQV93Q3VyckRBVFRYQ0hOTAkJCTB4MDA3NAorI2RlZmluZSBTTUFfd0N1cnJEQVRSWFJhdGUJCQkweDAwNzYKKyNkZWZpbmUgU01BX2R3RFNQUGxheUNvdW50CQkJMHgwMDc4CisjZGVmaW5lIFNNQV9fc2l6ZQkJCQkweDAwN2MKKworI2lmZGVmIEhBVkVfRFNQQ09ERUgKKyMgIGluY2x1ZGUgInBuZHNwZXJtLmMiCisjICBpbmNsdWRlICJwbmRzcGluaS5jIgorIyAgZGVmaW5lIFBFUk1DT0RFCQlwbmRzcGVybQorIyAgZGVmaW5lIElOSVRDT0RFCQlwbmRzcGluaQorIyAgZGVmaW5lIFBFUk1DT0RFU0laRQkJc2l6ZW9mKHBuZHNwZXJtKQorIyAgZGVmaW5lIElOSVRDT0RFU0laRQkJc2l6ZW9mKHBuZHNwaW5pKQorI2Vsc2UKKyMgIGlmbmRlZiBDT05GSUdfTVNORFBJTl9JTklUX0ZJTEUKKyMgICAgZGVmaW5lIENPTkZJR19NU05EUElOX0lOSVRfRklMRQkJCQlcCisJCQkJIi9ldGMvc291bmQvcG5kc3BpbmkuYmluIgorIyAgZW5kaWYKKyMgIGlmbmRlZiBDT05GSUdfTVNORFBJTl9QRVJNX0ZJTEUKKyMgICAgZGVmaW5lIENPTkZJR19NU05EUElOX1BFUk1fRklMRQkJCQlcCisJCQkJIi9ldGMvc291bmQvcG5kc3Blcm0uYmluIgorIyAgZW5kaWYKKyMgIGRlZmluZSBQRVJNQ09ERUZJTEUJCUNPTkZJR19NU05EUElOX1BFUk1fRklMRQorIyAgZGVmaW5lIElOSVRDT0RFRklMRQkJQ09ORklHX01TTkRQSU5fSU5JVF9GSUxFCisjICBkZWZpbmUgUEVSTUNPREUJCWRzcGluaQorIyAgZGVmaW5lIElOSVRDT0RFCQlwZXJtaW5pCisjICBkZWZpbmUgUEVSTUNPREVTSVpFCQlzaXplb2ZfZHNwaW5pCisjICBkZWZpbmUgSU5JVENPREVTSVpFCQlzaXplb2ZfcGVybWluaQorI2VuZGlmCisjZGVmaW5lIExPTkdOQU1FCQkiTXVsdGlTb3VuZCAoUGlubmFjbGUvRmlqaSkiCisKKyNlbmRpZiAvKiBfX01TTkRfUElOTkFDTEVfSCAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL25lY192cmM1NDc3LmMgYi9zb3VuZC9vc3MvbmVjX3ZyYzU0NzcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDgxZTVlCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL25lY192cmM1NDc3LmMKQEAgLTAsMCArMSwyMDU5IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIENvcHlyaWdodCAyMDAxIE1vbnRhVmlzdGEgU29mdHdhcmUgSW5jLgorICogQXV0aG9yOiBKdW4gU3VuLCBqc3VuQG12aXN0YS5jb20gb3IganN1bkBqdW5zdW4ubmV0CisgKgorICogZHJpdmVycy9zb3VuZC9uZWNfdnJjNTQ3Ny5jCisgKiAgICAgQUM5NyBzb3VuZCBkaXJ2ZXIgZm9yIE5FQyBWcmM1NDc3IGNoaXAgKGFuIGludGVncmF0ZWQsIAorICogICAgIG11bHRpLWZ1bmN0aW9uIGNvbnRyb2xsZXIgY2hpcCBmb3IgTUlQUyBDUFVzKQorICoKKyAqIFZSQSBzdXBwb3J0IENvcHlyaWdodCAyMDAxIEJyYWRsZXkgRC4gTGFSb25kZSA8YnJhZEBsdGMuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSAgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgIHRoZSB0ZXJtcyBvZiAgdGhlIEdOVSBHZW5lcmFsICBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247ICBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSAgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBpdGU4MTcyLmMsIHdoaWNoIGlzIHdyaXR0ZW4gYnkgU3RldmUgTG9uZ2VyYmVhbS4KKyAqCisgKiBGZWF0dXJlczoKKyAqICAgQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGNhcGFiaWxpdGllczoKKyAqCS4gbW9ubyBvdXRwdXQgdG8gUENNIEwvUiAobGluZSBvdXQpLgorICoJLiBzdGVyZW8gb3V0cHV0IHRvIFBDTSBML1IgKGxpbmUgb3V0KS4KKyAqCS4gbW9ubyBpbnB1dCBmcm9tIFBDTSBMIChsaW5lIGluKS4KKyAqCS4gc3RlcmVvIG91dHB1dCBmcm9tIFBDTSAobGluZSBpbikuCisgKgkuIHNhbXBsaW5nIHJhdGUgYXQgNDhrIG9yIHZhcmlhYmxlIHNhbXBsaW5nIHJhdGUgCisgKgkuIHN1cHBvcnQgL2Rldi9kc3AsIC9kZXYvbWl4ZXIgZGV2aWNlcywgc3RhbmRhcmQgT1NTIGRldmljZXMuCisgKgkuIG9ubHkgc3VwcG9ydCAxNi1iaXQgUENNIGZvcm1hdCAoaGFyZHdhcmUgbGltaXQsIG5vIHNvZnR3YXJlCisgKgkgIHRyYW5zbGF0aW9uKSAKKyAqCS4gc3VwcG9ydCBkdXBsZXgsIGJ1dCBubyB0cmlnZ2VyIG9yIHJlYWx0aW1lLgorICoJCisgKiAgIFNwZWNpZmljYWxseSB0aGUgZm9sbG93aW5nIGFyZSBub3Qgc3VwcG9ydGVkOgorICoJLiBhcHAtc2V0IGZyYWcgc2l6ZS4KKyAqCS4gbW1hcCdlZCBidWZmZXIgYWNjZXNzCisgKi8KKworLyogCisgKiBPcmlnaW5hbCBjb21tZW50cyBmcm9tIGl0ZTgxNzIuYyBmaWxlLgorICovCisKKy8qCisgKgorICogTm90ZXM6CisgKgorICogIDEuIE11Y2ggb2YgdGhlIE9TUyBidWZmZXIgYWxsb2NhdGlvbiwgaW9jdGwncywgYW5kIG1tYXAnaW5nIGFyZQorICogICAgIHRha2VuLCBzbGlnaHRseSBtb2RpZmllZCBvciBub3QgYXQgYWxsLCBmcm9tIHRoZSBFUzEzNzEgZHJpdmVyLAorICogICAgIHNvIHJlZmVyIHRvIHRoZSBjcmVkaXRzIGluIGVzMTM3MS5jIGZvciB0aG9zZS4gVGhlIHJlc3Qgb2YgdGhlCisgKiAgICAgY29kZSAocHJvYmUsIG9wZW4sIHJlYWQsIHdyaXRlLCB0aGUgSVNSLCBldGMuKSBpcyBuZXcuCisgKiAgMi4gVGhlIGZvbGxvd2luZyBzdXBwb3J0IGlzIHVudGVzdGVkOgorICogICAgICAqIE1lbW9yeSBtYXBwaW5nIHRoZSBhdWRpbyBidWZmZXJzLCBhbmQgdGhlIGlvY3RsIGNvbnRyb2xzIHRoYXQgZ28KKyAqICAgICAgICB3aXRoIGl0LgorICogICAgICAqIFMvUERJRiBvdXRwdXQuCisgKiAgMy4gVGhlIGZvbGxvd2luZyBpcyBub3Qgc3VwcG9ydGVkOgorICogICAgICAqIEkyUyBpbnB1dC4KKyAqICAgICAgKiBsZWdhY3kgYXVkaW8gbW9kZS4KKyAqICA0LiBTdXBwb3J0IGZvciB2b2x1bWUgYnV0dG9uIGludGVycnVwdHMgaXMgaW1wbGVtZW50ZWQgYnV0IGRvZXNuJ3QKKyAqICAgICB3b3JrIHlldC4KKyAqCisgKiAgUmV2aXNpb24gaGlzdG9yeQorICogICAgMDIuMDguMjAwMSAgMC4xICAgSW5pdGlhbCByZWxlYXNlCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tZGVidWcgbWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAjdW5kZWYgVlJDNTQ3N19BQzk3X0RFQlVHICovCisjZGVmaW5lIFZSQzU0NzdfQUM5N19ERUJVRworCisjdW5kZWYgVlJDNTQ3N19BQzk3X1ZFUkJPU0VfREVCVUcKKy8qICNkZWZpbmUgVlJDNTQ3N19BQzk3X1ZFUkJPU0VfREVCVUcgKi8KKworI2lmIGRlZmluZWQoVlJDNTQ3N19BQzk3X1ZFUkJPU0VfREVCVUcpCisjZGVmaW5lIFZSQzU0NzdfQUM5N19ERUJVRworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFZSQzU0NzdfQUM5N19ERUJVRykKKyNkZWZpbmUgQVNTRVJUKHgpICBpZiAoISh4KSkgeyBcCisJcGFuaWMoImFzc2VydGlvbiBmYWlsZWQgYXQgJXM6JWQ6ICVzXG4iLCBfX0ZJTEVfXywgX19MSU5FX18sICN4KTsgfQorI2Vsc2UKKyNkZWZpbmUJQVNTRVJUKHgpCisjZW5kaWYgLyogVlJDNTQ3N19BQzk3X0RFQlVHICovCisKKyNpZiBkZWZpbmVkKFZSQzU0NzdfQUM5N19WRVJCT1NFX0RFQlVHKQorc3RhdGljIHUxNiBpblRpY2tldDsgCQkvKiBjaGVjayBzeW5jIGJldHdlZW4gaW50ciAmIHdyaXRlICovCitzdGF0aWMgdTE2IG91dFRpY2tldDsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI3VuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKKworI2RlZmluZSAgICAgICAgIFZSQzU0NzdfSU5UX0NMUiAgICAgICAgIDB4MAorI2RlZmluZSAgICAgICAgIFZSQzU0NzdfSU5UX1NUQVRVUwkweDAKKyNkZWZpbmUgICAgICAgICBWUkM1NDc3X0NPREVDX1dSICAgICAgICAweDQKKyNkZWZpbmUgICAgICAgICBWUkM1NDc3X0NPREVDX1JEICAgICAgICAweDgKKyNkZWZpbmUgICAgICAgICBWUkM1NDc3X0NUUkwgICAgICAgICAgICAweDE4CisjZGVmaW5lICAgICAgICAgVlJDNTQ3N19BQ0xJTktfQ1RSTCAgICAgMHgxYworI2RlZmluZSAgICAgICAgIFZSQzU0NzdfSU5UX01BU0sgICAgICAgIDB4MjQKKworI2RlZmluZQkJVlJDNTQ3N19EQUMxX0NUUkwJMHgzMAorI2RlZmluZQkJVlJDNTQ3N19EQUMxTAkJMHgzNAorI2RlZmluZQkJVlJDNTQ3N19EQUMxX0JBRERSCTB4MzgKKyNkZWZpbmUJCVZSQzU0NzdfREFDMl9DVFJMCTB4M2MKKyNkZWZpbmUJCVZSQzU0NzdfREFDMkwJCTB4NDAKKyNkZWZpbmUJCVZSQzU0NzdfREFDMl9CQUREUgkweDQ0CisjZGVmaW5lCQlWUkM1NDc3X0RBQzNfQ1RSTAkweDQ4CisjZGVmaW5lCQlWUkM1NDc3X0RBQzNMCQkweDRjCisjZGVmaW5lCQlWUkM1NDc3X0RBQzNfQkFERFIJMHg1MAorCisjZGVmaW5lCQlWUkM1NDc3X0FEQzFfQ1RSTAkweDU0CisjZGVmaW5lCQlWUkM1NDc3X0FEQzFMCQkweDU4CisjZGVmaW5lCQlWUkM1NDc3X0FEQzFfQkFERFIJMHg1YworI2RlZmluZQkJVlJDNTQ3N19BREMyX0NUUkwJMHg2MAorI2RlZmluZQkJVlJDNTQ3N19BREMyTAkJMHg2NAorI2RlZmluZQkJVlJDNTQ3N19BREMyX0JBRERSCTB4NjgKKyNkZWZpbmUJCVZSQzU0NzdfQURDM19DVFJMCTB4NmMKKyNkZWZpbmUJCVZSQzU0NzdfQURDM0wJCTB4NzAKKyNkZWZpbmUJCVZSQzU0NzdfQURDM19CQUREUgkweDc0CisKKyNkZWZpbmUJCVZSQzU0NzdfQ09ERUNfV1JfUldDCSgxIDw8IDIzKQorCisjZGVmaW5lCQlWUkM1NDc3X0NPREVDX1JEX1JSRFlBCSgxIDw8IDMxKQorI2RlZmluZQkJVlJDNTQ3N19DT0RFQ19SRF9SUkRZRAkoMSA8PCAzMCkKKworI2RlZmluZQkJVlJDNTQ3N19BQ0xJTktfQ1RSTF9SU1RfT04JKDEgPDwgMTUpCisjZGVmaW5lCQlWUkM1NDc3X0FDTElOS19DVFJMX1JTVF9USU1FCTB4N2YKKyNkZWZpbmUJCVZSQzU0NzdfQUNMSU5LX0NUUkxfU1lOQ19PTgkoMSA8PCAzMCkKKyNkZWZpbmUJCVZSQzU0NzdfQUNMSU5LX0NUUkxfQ0tfU1RPUF9PTgkoMSA8PCAzMSkKKworI2RlZmluZQkJVlJDNTQ3N19DVFJMX0RBQzJFTkIJCSgxIDw8IDE1KSAKKyNkZWZpbmUJCVZSQzU0NzdfQ1RSTF9BREMyRU5CCQkoMSA8PCAxNCkgCisjZGVmaW5lCQlWUkM1NDc3X0NUUkxfREFDMUVOQgkJKDEgPDwgMTMpIAorI2RlZmluZQkJVlJDNTQ3N19DVFJMX0FEQzFFTkIJCSgxIDw8IDEyKSAKKworI2RlZmluZQkJVlJDNTQ3N19JTlRfTUFTS19OTUFTSwkJKDEgPDwgMzEpIAorI2RlZmluZQkJVlJDNTQ3N19JTlRfTUFTS19EQUMxRU5ECSgxIDw8IDUpIAorI2RlZmluZQkJVlJDNTQ3N19JTlRfTUFTS19EQUMyRU5ECSgxIDw8IDQpIAorI2RlZmluZQkJVlJDNTQ3N19JTlRfTUFTS19EQUMzRU5ECSgxIDw8IDMpIAorI2RlZmluZQkJVlJDNTQ3N19JTlRfTUFTS19BREMxRU5ECSgxIDw8IDIpIAorI2RlZmluZQkJVlJDNTQ3N19JTlRfTUFTS19BREMyRU5ECSgxIDw8IDEpIAorI2RlZmluZQkJVlJDNTQ3N19JTlRfTUFTS19BREMzRU5ECSgxIDw8IDApIAorCisjZGVmaW5lCQlWUkM1NDc3X0RNQV9BQ1RJVkFUSU9OCQkoMSA8PCAzMSkKKyNkZWZpbmUJCVZSQzU0NzdfRE1BX1dJUAkJCSgxIDw8IDMwKQorCisKKyNkZWZpbmUgVlJDNTQ3N19BQzk3X01PRFVMRV9OQU1FICJORUNfVnJjNTQ3N19hdWRpbyIKKyNkZWZpbmUgUEZYIFZSQzU0NzdfQUM5N19NT0RVTEVfTkFNRSAiOiAiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlIHsKKwkvKiBsaXN0IG9mIHZyYzU0NzdfYWM5NyBkZXZpY2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBkZXZzOworCisJLyogdGhlIGNvcnJlc3BvbmRpbmcgcGNpX2RldiBzdHJ1Y3R1cmUgKi8KKwlzdHJ1Y3QgcGNpX2RldiAqZGV2OworCisJLyogc291bmRjb3JlIHN0dWZmICovCisJaW50IGRldl9hdWRpbzsKKworCS8qIGhhcmR3YXJlIHJlc291cmNlcyAqLworCXVuc2lnbmVkIGxvbmcgaW87CisJdW5zaWduZWQgaW50IGlycTsKKworI2lmZGVmIFZSQzU0NzdfQUM5N19ERUJVRworCS8qIGRlYnVnIC9wcm9jIGVudHJ5ICovCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwczsKKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjOTdfcHM7CisjZW5kaWYgLyogVlJDNTQ3N19BQzk3X0RFQlVHICovCisKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CisKKwl1bnNpZ25lZCBkYWNDaGFubmVscywgYWRjQ2hhbm5lbHM7CisJdW5zaWduZWQgc2hvcnQgZGFjUmF0ZSwgYWRjUmF0ZTsKKwl1bnNpZ25lZCBzaG9ydCBleHRlbmRlZF9zdGF0dXM7CisKKwlzcGlubG9ja190IGxvY2s7CisJc3RydWN0IHNlbWFwaG9yZSBvcGVuX3NlbTsKKwltb2RlX3Qgb3Blbl9tb2RlOworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCXN0cnVjdCBkbWFidWYgeworCQl2b2lkICpsYnVmLCAqcmJ1ZjsKKwkJZG1hX2FkZHJfdCBsYnVmRG1hLCByYnVmRG1hOworCQl1bnNpZ25lZCBidWZPcmRlcjsKKwkJdW5zaWduZWQgbnVtRnJhZzsKKwkJdW5zaWduZWQgZnJhZ1NoaWZ0OworCQl1bnNpZ25lZCBmcmFnU2l6ZTsJLyogcmVkdW5kYW50ICovCisJCXVuc2lnbmVkIGZyYWdUb3RhbFNpemU7CS8qID0gbnVtRnJhZyAqIGZyYWdTaXplKHJlYWwpICAqLworCQl1bnNpZ25lZCBuZXh0SW47CisJCXVuc2lnbmVkIG5leHRPdXQ7CisJCWludCBjb3VudDsKKwkJdW5zaWduZWQgZXJyb3I7IC8qIG92ZXIvdW5kZXJydW4gKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwkJLyogT1NTIHN0dWZmICovCisJCXVuc2lnbmVkIHN0b3BwZWQ6MTsKKwkJdW5zaWduZWQgcmVhZHk6MTsKKwl9IGRtYV9kYWMsIGRtYV9hZGM7CisKKwkjZGVmaW5lCVdPUktfQlVGX1NJWkUJMjA0OAorCXN0cnVjdCB7CisJCXUxNiBsY2hhbm5lbDsKKwkJdTE2IHJjaGFubmVsOworCX0gd29ya0J1ZltXT1JLX0JVRl9TSVpFLzRdOworfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBMSVNUX0hFQUQoZGV2cyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxkMih1bnNpZ25lZCBpbnQgeCkKK3sKKyAgICB1bnNpZ25lZCByID0gMDsKKwkKKyAgICBpZiAoeCA+PSAweDEwMDAwKSB7CisJeCA+Pj0gMTY7CisJciArPSAxNjsKKyAgICB9CisgICAgaWYgKHggPj0gMHgxMDApIHsKKwl4ID4+PSA4OworCXIgKz0gODsKKyAgICB9CisgICAgaWYgKHggPj0gMHgxMCkgeworCXggPj49IDQ7CisJciArPSA0OworICAgIH0KKyAgICBpZiAoeCA+PSA0KSB7CisJeCA+Pj0gMjsKKwlyICs9IDI7CisgICAgfQorICAgIGlmICh4ID49IDIpCisJcisrOworICAgIHJldHVybiByOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHUxNiByZGNvZGVjKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggYWRkcikKK3sKKwlzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzID0gCisJCShzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiByZXN1bHQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJLyogd2FpdCB1bnRpbCB3ZSBjYW4gYWNjZXNzIGNvZGVjIHJlZ2lzdGVycyAqLworCXdoaWxlIChpbmwocy0+aW8gKyBWUkM1NDc3X0NPREVDX1dSKSAmIDB4ODAwMDAwMDApOworCisJLyogd3JpdGUgdGhlIGFkZHJlc3MgYW5kICJyZWFkIiBjb21tYW5kIHRvIGNvZGVjICovCisJYWRkciA9IGFkZHIgJiAweDdmOworCW91dGwoKGFkZHIgPDwgMTYpIHwgVlJDNTQ3N19DT0RFQ19XUl9SV0MsIHMtPmlvICsgVlJDNTQ3N19DT0RFQ19XUik7CisKKwkvKiBnZXQgdGhlIHJldHVybiByZXN1bHQgKi8KKwl1ZGVsYXkoMTAwKTsgLyogd29ya2Fyb3VuZCBoYXJkd2FyZSBidWcgKi8KKwl3aGlsZSAoIChyZXN1bHQgPSBpbmwocy0+aW8gKyBWUkM1NDc3X0NPREVDX1JEKSkgJiAKKyAgICAgICAgICAgICAgICAoVlJDNTQ3N19DT0RFQ19SRF9SUkRZQSB8IFZSQzU0NzdfQ09ERUNfUkRfUlJEWUQpICkgeworCQkvKiB3ZSBnZXQgZWl0aGVyIGFkZHIgb3IgZGF0YSwgb3IgYm90aCAqLworCQlpZiAocmVzdWx0ICYgVlJDNTQ3N19DT0RFQ19SRF9SUkRZQSkgeworCQkJQVNTRVJUKGFkZHIgPT0gKChyZXN1bHQgPj4gMTYpICYgMHg3ZikgKTsKKwkJfQorCQlpZiAocmVzdWx0ICYgVlJDNTQ3N19DT0RFQ19SRF9SUkRZRCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmVzdWx0ICYgMHhmZmZmOworfQorCisKK3N0YXRpYyB2b2lkIHdyY29kZWMoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCBhZGRyLCB1MTYgZGF0YSkKK3sKKwlzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzID0gCisJCShzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCS8qIHdhaXQgdW50aWwgd2UgY2FuIGFjY2VzcyBjb2RlYyByZWdpc3RlcnMgKi8KKwl3aGlsZSAoaW5sKHMtPmlvICsgVlJDNTQ3N19DT0RFQ19XUikgJiAweDgwMDAwMDAwKTsKKworCS8qIHdyaXRlIHRoZSBhZGRyZXNzIGFuZCB2YWx1ZSB0byBjb2RlYyAqLworCW91dGwoKGFkZHIgPDwgMTYpIHwgZGF0YSwgcy0+aW8gKyBWUkM1NDc3X0NPREVDX1dSKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCB3YWl0Y29kZWMoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMgPSAKKwkJKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCisJLyogd2FpdCB1bnRpbCB3ZSBjYW4gYWNjZXNzIGNvZGVjIHJlZ2lzdGVycyAqLworCXdoaWxlIChpbmwocy0+aW8gKyBWUkM1NDc3X0NPREVDX1dSKSAmIDB4ODAwMDAwMDApOworfQorCitzdGF0aWMgaW50IGFjOTdfY29kZWNfbm90X3ByZXNlbnQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMgPSAKKwkJKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgY291bnQgID0gMHhmZmZmOyAKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkvKiB3YWl0IHVudGlsIHdlIGNhbiBhY2Nlc3MgY29kZWMgcmVnaXN0ZXJzICovCisJZG8geworCSAgICAgICBpZiAoIShpbmwocy0+aW8gKyBWUkM1NDc3X0NPREVDX1dSKSAmIDB4ODAwMDAwMDApKQorCQkgICAgICAgYnJlYWs7CisJfSB3aGlsZSAoLS1jb3VudCk7CisKKwlpZiAoY291bnQgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB3cml0ZSAwIHRvIHJlc2V0ICovCisJb3V0bCgoQUM5N19SRVNFVCA8PCAxNikgfCAwLCBzLT5pbyArIFZSQzU0NzdfQ09ERUNfV1IpOworCisJLyogdGVzdCB3aGV0aGVyIHdlIGdldCBhIHJlc3BvbnNlIGZyb20gYWM5NyBjaGlwICovCisJY291bnQgID0gMHhmZmZmOyAKKwlkbyB7IAorCSAgICAgICBpZiAoIShpbmwocy0+aW8gKyBWUkM1NDc3X0NPREVDX1dSKSAmIDB4ODAwMDAwMDApKQorCQkgICAgICAgYnJlYWs7CisJfSB3aGlsZSAoLS1jb3VudCk7CisKKwlpZiAoY291bnQgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHZvaWQgdnJjNTQ3N19hYzk3X2RlbGF5KGludCBtc2VjKQoreworCXVuc2lnbmVkIGxvbmcgdG1vOworCXNpZ25lZCBsb25nIHRtbzI7CisKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXJldHVybjsKKyAgICAKKwl0bW8gPSBqaWZmaWVzICsgKG1zZWMqSFopLzEwMDA7CisJZm9yICg7OykgeworCQl0bW8yID0gdG1vIC0gamlmZmllczsKKwkJaWYgKHRtbzIgPD0gMCkKKwkJCWJyZWFrOworCQlzY2hlZHVsZV90aW1lb3V0KHRtbzIpOworCX0KK30KKworCitzdGF0aWMgdm9pZCBzZXRfYWRjX3JhdGUoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwl3cmNvZGVjKHMtPmNvZGVjLCBBQzk3X1BDTV9MUl9BRENfUkFURSwgcmF0ZSk7CisJcy0+YWRjUmF0ZSA9IHJhdGU7Cit9CisKKworc3RhdGljIHZvaWQgc2V0X2RhY19yYXRlKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJaWYocy0+ZXh0ZW5kZWRfc3RhdHVzICYgQUM5N19FWFRTVEFUX1ZSQSkgeworCXdyY29kZWMocy0+Y29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFLCByYXRlKTsKKwkJcy0+ZGFjUmF0ZSA9IHJkY29kZWMocy0+Y29kZWMsIEFDOTdfUENNX0ZST05UX0RBQ19SQVRFKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYWM5N19jb2RlY19ub3RfcHJlc2VudChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMpCit7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcyA9CisJCShzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICopY29kZWMtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHNob3J0IGNvdW50ICA9IDB4ZmZmZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwkvKiB3YWl0IHVudGlsIHdlIGNhbiBhY2Nlc3MgY29kZWMgcmVnaXN0ZXJzICovCisJZG8geworCSAgICAgICBpZiAoIShpbmwocy0+aW8gKyBWUkM1NDc3X0NPREVDX1dSKSAmIDB4ODAwMDAwMDApKQorCQkgICAgICAgYnJlYWs7CisJfSB3aGlsZSAoLS1jb3VudCk7CisKKwlpZiAoY291bnQgPT0gMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiB3cml0ZSAwIHRvIHJlc2V0ICovCisJb3V0bCgoQUM5N19SRVNFVCA8PCAxNikgfCAwLCBzLT5pbyArIFZSQzU0NzdfQ09ERUNfV1IpOworCisJLyogdGVzdCB3aGV0aGVyIHdlIGdldCBhIHJlc3BvbnNlIGZyb20gYWM5NyBjaGlwICovCisJY291bnQgID0gMHhmZmZmOworCWRvIHsKKwkgICAgICAgaWYgKCEoaW5sKHMtPmlvICsgVlJDNTQ3N19DT0RFQ19XUikgJiAweDgwMDAwMDAwKSkKKwkJICAgICAgIGJyZWFrOworCX0gd2hpbGUgKC0tY291bnQpOworCisJaWYgKGNvdW50ID09IDApIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLTE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiBpbmxpbmUgdm9pZAorc3RvcF9kYWMoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1hYnVmKiBkYiA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHRlbXA7CisgICAgCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChkYi0+c3RvcHBlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwkvKiBkZWFjdGl2YXRlIHRoZSBkbWEgKi8KKwlvdXRsKDAsIHMtPmlvICsgVlJDNTQ3N19EQUMxX0NUUkwpOworCW91dGwoMCwgcy0+aW8gKyBWUkM1NDc3X0RBQzJfQ1RSTCk7CisKKwkvKiB3YWl0IGZvciBEQU0gY29tcGxldGVseSBzdG9wICovCisJd2hpbGUgKGlubChzLT5pbyArIFZSQzU0NzdfREFDMV9DVFJMKSAmIFZSQzU0NzdfRE1BX1dJUCk7CisJd2hpbGUgKGlubChzLT5pbyArIFZSQzU0NzdfREFDMl9DVFJMKSAmIFZSQzU0NzdfRE1BX1dJUCk7CisKKwkvKiBkaXNhYmxlIGRhYyBzbG90cyBpbiBhY2xpbmsgKi8KKwl0ZW1wID0gaW5sKHMtPmlvICsgVlJDNTQ3N19DVFJMKTsKKwl0ZW1wICY9IH4gKFZSQzU0NzdfQ1RSTF9EQUMxRU5CIHwgVlJDNTQ3N19DVFJMX0RBQzJFTkIpOworCW91dGwgKHRlbXAsIHMtPmlvICsgVlJDNTQ3N19DVFJMKTsKKworCS8qIGRpc2FibGUgaW50ZXJydXB0cyAqLworCXRlbXAgPSBpbmwocy0+aW8gKyBWUkM1NDc3X0lOVF9NQVNLKTsKKwl0ZW1wICY9IH4gKFZSQzU0NzdfSU5UX01BU0tfREFDMUVORCB8IFZSQzU0NzdfSU5UX01BU0tfREFDMkVORCk7IAorCW91dGwgKHRlbXAsIHMtPmlvICsgVlJDNTQ3N19JTlRfTUFTSyk7CisKKwkvKiBjbGVhciBwZW5kaW5nIG9uZXMgKi8KKwlvdXRsKFZSQzU0NzdfSU5UX01BU0tfREFDMUVORCB8IFZSQzU0NzdfSU5UX01BU0tfREFDMkVORCwgCisJICAgICBzLT5pbyArICBWUkM1NDc3X0lOVF9DTFIpOworICAgIAorCWRiLT5zdG9wcGVkID0gMTsKKyAgICAKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1hYnVmKiBkYiA9ICZzLT5kbWFfZGFjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGRtYUxlbmd0aDsKKwl1MzIgdGVtcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWRiLT5zdG9wcGVkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHdlIHNob3VsZCBoYXZlIHNvbWUgZGF0YSB0byBkbyB0aGUgRE1BIHRyYXNuZmVyICovCisJQVNTRVJUKGRiLT5jb3VudCA+PSBkYi0+ZnJhZ1NpemUpOworCisJLyogY2xlYXIgcGVuZGluZyBmYWxlcyBpbnRlcnJ1cHRzICovCisJb3V0bChWUkM1NDc3X0lOVF9NQVNLX0RBQzFFTkQgfCBWUkM1NDc3X0lOVF9NQVNLX0RBQzJFTkQsIAorCSAgICAgcy0+aW8gKyAgVlJDNTQ3N19JTlRfQ0xSKTsKKworCS8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisJdGVtcCA9IGlubChzLT5pbyArIFZSQzU0NzdfSU5UX01BU0spOworCXRlbXAgfD0gVlJDNTQ3N19JTlRfTUFTS19EQUMxRU5EIHwgVlJDNTQ3N19JTlRfTUFTS19EQUMyRU5EOworCW91dGwodGVtcCwgcy0+aW8gKyAgVlJDNTQ3N19JTlRfTUFTSyk7CisKKwkvKiBzZXR1cCBkbWEgYmFzZSBhZGRyICovCisJb3V0bChkYi0+bGJ1ZkRtYSArIGRiLT5uZXh0T3V0LCBzLT5pbyArIFZSQzU0NzdfREFDMV9CQUREUik7CisJaWYgKHMtPmRhY0NoYW5uZWxzID09IDEpIHsKKwkJb3V0bChkYi0+bGJ1ZkRtYSArIGRiLT5uZXh0T3V0LCBzLT5pbyArIFZSQzU0NzdfREFDMl9CQUREUik7CisJfSBlbHNlIHsKKwkJb3V0bChkYi0+cmJ1ZkRtYSArIGRiLT5uZXh0T3V0LCBzLT5pbyArIFZSQzU0NzdfREFDMl9CQUREUik7CisJfQorCisJLyogc2V0IGRtYSBsZW5ndGgsIGluIHRoZSB1bml0IG9mIDB4MTAgYnl0ZXMgKi8KKwlkbWFMZW5ndGggPSBkYi0+ZnJhZ1NpemUgPj4gNDsKKwlvdXRsKGRtYUxlbmd0aCwgcy0+aW8gKyBWUkM1NDc3X0RBQzFMKTsKKwlvdXRsKGRtYUxlbmd0aCwgcy0+aW8gKyBWUkM1NDc3X0RBQzJMKTsKKworCS8qIGFjdGl2YXRlIGRtYSAqLworCW91dGwoVlJDNTQ3N19ETUFfQUNUSVZBVElPTiwgcy0+aW8gKyBWUkM1NDc3X0RBQzFfQ1RSTCk7CisJb3V0bChWUkM1NDc3X0RNQV9BQ1RJVkFUSU9OLCBzLT5pbyArIFZSQzU0NzdfREFDMl9DVFJMKTsKKworCS8qIGVuYWJsZSBkYWMgc2xvdHMgLSB3ZSBzaG91bGQgaGVhciB0aGUgbXVzaWMgbm93ISAqLworCXRlbXAgPSBpbmwocy0+aW8gKyBWUkM1NDc3X0NUUkwpOworCXRlbXAgfD0gKFZSQzU0NzdfQ1RSTF9EQUMxRU5CIHwgVlJDNTQ3N19DVFJMX0RBQzJFTkIpOworCW91dGwgKHRlbXAsIHMtPmlvICsgVlJDNTQ3N19DVFJMKTsKKworCS8qIGl0IGlzIHRpbWUgdG8gc2V0dXAgbmV4dCBkbWEgdHJhbnNmZXIgKi8KKwlBU1NFUlQoaW5sKHMtPmlvICsgVlJDNTQ3N19EQUMxX0NUUkwpICYgVlJDNTQ3N19ETUFfV0lQKTsKKwlBU1NFUlQoaW5sKHMtPmlvICsgVlJDNTQ3N19EQUMyX0NUUkwpICYgVlJDNTQ3N19ETUFfV0lQKTsKKworCXRlbXAgPSBkYi0+bmV4dE91dCArIGRiLT5mcmFnU2l6ZTsKKwlpZiAodGVtcCA+PSBkYi0+ZnJhZ1RvdGFsU2l6ZSkgeworCQlBU1NFUlQodGVtcCA9PSBkYi0+ZnJhZ1RvdGFsU2l6ZSk7CisJCXRlbXAgPSAwOworCX0KKworCW91dGwoZGItPmxidWZEbWEgKyB0ZW1wLCBzLT5pbyArIFZSQzU0NzdfREFDMV9CQUREUik7CisJaWYgKHMtPmRhY0NoYW5uZWxzID09IDEpIHsKKwkJb3V0bChkYi0+bGJ1ZkRtYSArIHRlbXAsIHMtPmlvICsgVlJDNTQ3N19EQUMyX0JBRERSKTsKKwl9IGVsc2UgeworCQlvdXRsKGRiLT5yYnVmRG1hICsgdGVtcCwgcy0+aW8gKyBWUkM1NDc3X0RBQzJfQkFERFIpOworCX0KKworCWRiLT5zdG9wcGVkID0gMDsKKworI2lmIGRlZmluZWQoVlJDNTQ3N19BQzk3X1ZFUkJPU0VfREVCVUcpCisJb3V0VGlja2V0ID0gKih1MTYqKShkYi0+bGJ1ZitkYi0+bmV4dE91dCk7CisJaWYgKGRiLT5jb3VudCA+IGRiLT5mcmFnU2l6ZSkgeworCQlBU1NFUlQoKHUxNikob3V0VGlja2V0KzEpID09ICoodTE2KikoZGItPmxidWYrdGVtcCkpOworCX0KKyNlbmRpZgorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQkKKworZXh0ZXJuIGlubGluZSB2b2lkIHN0b3BfYWRjKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiogZGIgPSAmcy0+ZG1hX2FkYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB0ZW1wOworICAgIAorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoZGItPnN0b3BwZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCisJLyogZGVhY3RpdmF0ZSB0aGUgZG1hICovCisJb3V0bCgwLCBzLT5pbyArIFZSQzU0NzdfQURDMV9DVFJMKTsKKwlvdXRsKDAsIHMtPmlvICsgVlJDNTQ3N19BREMyX0NUUkwpOworCisJLyogZGlzYWJsZSBhZGMgc2xvdHMgaW4gYWNsaW5rICovCisJdGVtcCA9IGlubChzLT5pbyArIFZSQzU0NzdfQ1RSTCk7CisJdGVtcCAmPSB+IChWUkM1NDc3X0NUUkxfQURDMUVOQiB8IFZSQzU0NzdfQ1RSTF9BREMyRU5CKTsKKwlvdXRsICh0ZW1wLCBzLT5pbyArIFZSQzU0NzdfQ1RSTCk7CisKKwkvKiBkaXNhYmxlIGludGVycnVwdHMgKi8KKyAgICAgICAgdGVtcCA9IGlubChzLT5pbyArIFZSQzU0NzdfSU5UX01BU0spOworICAgICAgICB0ZW1wICY9IH4gKFZSQzU0NzdfSU5UX01BU0tfQURDMUVORCB8IFZSQzU0NzdfSU5UX01BU0tfQURDMkVORCk7IAorICAgICAgICBvdXRsICh0ZW1wLCBzLT5pbyArIFZSQzU0NzdfSU5UX01BU0spOworCisJLyogY2xlYXIgcGVuZGluZyBvbmVzICovCisJb3V0bChWUkM1NDc3X0lOVF9NQVNLX0FEQzFFTkQgfCBWUkM1NDc3X0lOVF9NQVNLX0FEQzJFTkQsIAorCSAgICAgcy0+aW8gKyAgVlJDNTQ3N19JTlRfQ0xSKTsKKyAgICAKKwlkYi0+c3RvcHBlZCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcykKK3sKKwlzdHJ1Y3QgZG1hYnVmKiBkYiA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGRtYUxlbmd0aDsKKwl1MzIgdGVtcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlpZiAoIWRiLT5zdG9wcGVkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCS8qIHdlIHNob3VsZCBhdCBsZWFzdCBoYXZlIHNvbWUgZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyICovCisJQVNTRVJUKGRiLT5jb3VudCA8IGRiLT5mcmFnVG90YWxTaXplIC0gZGItPmZyYWdTaXplICogMik7CisKKwkvKiBjbGVhciBwZW5kaW5nIG9uZXMgKi8KKwlvdXRsKFZSQzU0NzdfSU5UX01BU0tfQURDMUVORCB8IFZSQzU0NzdfSU5UX01BU0tfQURDMkVORCwgCisJICAgICBzLT5pbyArICBWUkM1NDc3X0lOVF9DTFIpOworCisgICAgICAgIC8qIGVuYWJsZSBpbnRlcnJ1cHRzICovCisgICAgICAgIHRlbXAgPSBpbmwocy0+aW8gKyBWUkM1NDc3X0lOVF9NQVNLKTsKKyAgICAgICAgdGVtcCB8PSBWUkM1NDc3X0lOVF9NQVNLX0FEQzFFTkQgfCBWUkM1NDc3X0lOVF9NQVNLX0FEQzJFTkQ7CisgICAgICAgIG91dGwodGVtcCwgcy0+aW8gKyAgVlJDNTQ3N19JTlRfTUFTSyk7CisKKwkvKiBzZXR1cCBkbWEgYmFzZSBhZGRyICovCisJb3V0bChkYi0+bGJ1ZkRtYSArIGRiLT5uZXh0SW4sIHMtPmlvICsgVlJDNTQ3N19BREMxX0JBRERSKTsKKwlvdXRsKGRiLT5yYnVmRG1hICsgZGItPm5leHRJbiwgcy0+aW8gKyBWUkM1NDc3X0FEQzJfQkFERFIpOworCisJLyogc2V0dXAgZG1hIGxlbmd0aCAqLworCWRtYUxlbmd0aCA9IGRiLT5mcmFnU2l6ZSA+PiA0OworCW91dGwoZG1hTGVuZ3RoLCBzLT5pbyArIFZSQzU0NzdfQURDMUwpOworCW91dGwoZG1hTGVuZ3RoLCBzLT5pbyArIFZSQzU0NzdfQURDMkwpOworCisJLyogYWN0aXZhdGUgZG1hICovCisJb3V0bChWUkM1NDc3X0RNQV9BQ1RJVkFUSU9OLCBzLT5pbyArIFZSQzU0NzdfQURDMV9DVFJMKTsKKwlvdXRsKFZSQzU0NzdfRE1BX0FDVElWQVRJT04sIHMtPmlvICsgVlJDNTQ3N19BREMyX0NUUkwpOworCisJLyogZW5hYmxlIGFkYyBzbG90cyAqLworCXRlbXAgPSBpbmwocy0+aW8gKyBWUkM1NDc3X0NUUkwpOworCXRlbXAgfD0gKFZSQzU0NzdfQ1RSTF9BREMxRU5CIHwgVlJDNTQ3N19DVFJMX0FEQzJFTkIpOworCW91dGwgKHRlbXAsIHMtPmlvICsgVlJDNTQ3N19DVFJMKTsKKworCS8qIGl0IGlzIHRpbWUgdG8gc2V0dXAgbmV4dCBkbWEgdHJhbnNmZXIgKi8KKwl0ZW1wID0gZGItPm5leHRJbiArIGRiLT5mcmFnU2l6ZTsKKwlpZiAodGVtcCA+PSBkYi0+ZnJhZ1RvdGFsU2l6ZSkgeworCQlBU1NFUlQodGVtcCA9PSBkYi0+ZnJhZ1RvdGFsU2l6ZSk7CisJCXRlbXAgPSAwOworCX0KKwlvdXRsKGRiLT5sYnVmRG1hICsgdGVtcCwgcy0+aW8gKyBWUkM1NDc3X0FEQzFfQkFERFIpOworCW91dGwoZGItPnJidWZEbWEgKyB0ZW1wLCBzLT5pbyArIFZSQzU0NzdfQURDMl9CQUREUik7CisKKwlkYi0+c3RvcHBlZCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNi1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCitleHRlcm4gaW5saW5lIHZvaWQgZGVhbGxvY19kbWFidWYoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcywKKwkJCQkgIHN0cnVjdCBkbWFidWYgKmRiKQoreworCWlmIChkYi0+bGJ1ZikgeworCQlBU1NFUlQoZGItPnJidWYpOworCQlwY2lfZnJlZV9jb25zaXN0ZW50KHMtPmRldiwgUEFHRV9TSVpFIDw8IGRiLT5idWZPcmRlciwKKwkJCQkgICAgZGItPmxidWYsIGRiLT5sYnVmRG1hKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBkYi0+YnVmT3JkZXIsCisJCQkJICAgIGRiLT5yYnVmLCBkYi0+cmJ1ZkRtYSk7CisJCWRiLT5sYnVmID0gZGItPnJidWYgPSBOVUxMOworCX0KKwlkYi0+bmV4dEluID0gZGItPm5leHRPdXQgPSAwOworCWRiLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcywgCisJCSAgICAgICBzdHJ1Y3QgZG1hYnVmICpkYiwKKwkJICAgICAgIHVuc2lnbmVkIHJhdGUpCit7CisJaW50IG9yZGVyOworCXVuc2lnbmVkIGJ1ZnNpemU7CisKKwlpZiAoIWRiLT5sYnVmKSB7CisJCUFTU0VSVCghZGItPnJidWYpOworCisJCWRiLT5yZWFkeSA9IDA7CisJCWZvciAob3JkZXIgPSBETUFCVUZfREVGQVVMVE9SREVSOyAKKwkJICAgICBvcmRlciA+PSBETUFCVUZfTUlOT1JERVI7IAorCQkgICAgIG9yZGVyLS0pIHsKKwkJCWRiLT5sYnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocy0+ZGV2LAorCQkJCQkJCVBBR0VfU0laRSA8PCBvcmRlciwKKwkJCQkJCQkmZGItPmxidWZEbWEpOworCQkJZGItPnJidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudChzLT5kZXYsCisJCQkJCQkJUEFHRV9TSVpFIDw8IG9yZGVyLAorCQkJCQkJCSZkYi0+cmJ1ZkRtYSk7CisJCQlpZiAoZGItPmxidWYgJiYgZGItPnJidWYpIGJyZWFrOworCQkJaWYgKGRiLT5sYnVmKSB7CisJCQkgICAgQVNTRVJUKCFkYi0+cmJ1Zik7CisJCQkgICAgcGNpX2ZyZWVfY29uc2lzdGVudChzLT5kZXYsIAorCQkJCQkJUEFHRV9TSVpFIDw8IG9yZGVyLAorCQkJCQkJZGItPmxidWYsCisJCQkJCQlkYi0+bGJ1ZkRtYSk7CisJCQl9CisJCX0KKwkJaWYgKCFkYi0+bGJ1ZikgeworCQkJQVNTRVJUKCFkYi0+cmJ1Zik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWRiLT5idWZPcmRlciA9IG9yZGVyOworCX0KKworCWRiLT5jb3VudCA9IDA7CisJZGItPm5leHRJbiA9IGRiLT5uZXh0T3V0ID0gMDsKKyAgICAKKwlidWZzaXplID0gUEFHRV9TSVpFIDw8IGRiLT5idWZPcmRlcjsKKwlkYi0+ZnJhZ1NoaWZ0ID0gbGQyKHJhdGUgKiAyIC8gMTAwKTsKKwlpZiAoZGItPmZyYWdTaGlmdCA8IDQpIGRiLT5mcmFnU2hpZnQgPSA0OworCisJZGItPm51bUZyYWcgPSBidWZzaXplID4+IGRiLT5mcmFnU2hpZnQ7CisJd2hpbGUgKGRiLT5udW1GcmFnIDwgNCAmJiBkYi0+ZnJhZ1NoaWZ0ID4gNCkgeworCQlkYi0+ZnJhZ1NoaWZ0LS07CisJCWRiLT5udW1GcmFnID0gYnVmc2l6ZSA+PiBkYi0+ZnJhZ1NoaWZ0OworCX0KKwlkYi0+ZnJhZ1NpemUgPSAxIDw8IGRiLT5mcmFnU2hpZnQ7CisJZGItPmZyYWdUb3RhbFNpemUgPSBkYi0+bnVtRnJhZyA8PCBkYi0+ZnJhZ1NoaWZ0OworCW1lbXNldChkYi0+bGJ1ZiwgMCwgZGItPmZyYWdUb3RhbFNpemUpOworCW1lbXNldChkYi0+cmJ1ZiwgMCwgZGItPmZyYWdUb3RhbFNpemUpOworICAgIAorCWRiLT5yZWFkeSA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfYWRjKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMpCit7CisgICAgc3RvcF9hZGMocyk7CisgICAgcmV0dXJuIHByb2dfZG1hYnVmKHMsICZzLT5kbWFfYWRjLCBzLT5hZGNSYXRlKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfZGFjKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMpCit7CisgICAgc3RvcF9kYWMocyk7CisgICAgcmV0dXJuIHByb2dfZG1hYnVmKHMsICZzLT5kbWFfZGFjLCBzLT5kYWNSYXRlKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGhvbGQgc3BpbmxvY2sgZm9yIHRoZSBmb2xsb3dpbmchICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB2cmM1NDc3X2FjOTdfYWRjX2ludGVycnVwdChzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzKQoreworCXN0cnVjdCBkbWFidWYqIGFkYyA9ICZzLT5kbWFfYWRjOworCXVuc2lnbmVkIHRlbXA7CisKKwkvKiB3ZSBuZWVkIHR3byBmcmFncyBhdmFpYWJsZSBiZWNhdXNlIG9uZSBpcyBhbHJlYWR5IGJlaW5nIHVzZWQKKwkgKiBhbmQgdGhlIG90aGVyIHdpbGwgYmUgdXNlZCB3aGVuIG5leHQgaW50ZXJydXB0IGhhcHBlbnMuCisJICovCisJaWYgKGFkYy0+Y291bnQgPj0gYWRjLT5mcmFnVG90YWxTaXplIC0gYWRjLT5mcmFnU2l6ZSkgeworCQlzdG9wX2FkYyhzKTsKKwkJYWRjLT5lcnJvcisrOworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiYWRjIG92ZXJydW5cbiIpOworCQlyZXR1cm47CisJfQorCisJLyogc2V0IHRoZSBiYXNlIGFkZHIgZm9yIG5leHQgRE1BIHRyYW5zZmVyICovCisJdGVtcCA9IGFkYy0+bmV4dEluICsgMiphZGMtPmZyYWdTaXplOworCWlmICh0ZW1wID49IGFkYy0+ZnJhZ1RvdGFsU2l6ZSkgeworCQlBU1NFUlQoICh0ZW1wID09IGFkYy0+ZnJhZ1RvdGFsU2l6ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRlbXAgPT0gYWRjLT5mcmFnVG90YWxTaXplICsgYWRjLT5mcmFnU2l6ZSkgKTsKKwkJdGVtcCAtPSBhZGMtPmZyYWdUb3RhbFNpemU7CisJfQorCW91dGwoYWRjLT5sYnVmRG1hICsgdGVtcCwgcy0+aW8gKyBWUkM1NDc3X0FEQzFfQkFERFIpOworCW91dGwoYWRjLT5yYnVmRG1hICsgdGVtcCwgcy0+aW8gKyBWUkM1NDc3X0FEQzJfQkFERFIpOworCisJLyogYWRqdXN0IG5leHRJbiAqLworCWFkYy0+bmV4dEluICs9IGFkYy0+ZnJhZ1NpemU7CisJaWYgKGFkYy0+bmV4dEluID49IGFkYy0+ZnJhZ1RvdGFsU2l6ZSkgeworCQlBU1NFUlQoYWRjLT5uZXh0SW4gPT0gYWRjLT5mcmFnVG90YWxTaXplKTsKKwkJYWRjLT5uZXh0SW4gPSAwOworCX0KKworCS8qIGFkanVzdCBjb3VudCAqLworCWFkYy0+Y291bnQgKz0gYWRjLT5mcmFnU2l6ZTsKKworCS8qIHdha2UgdXAgYW55Ym9keSBsaXN0ZW5pbmcgKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmYWRjLT53YWl0KSkgeworCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJmFkYy0+d2FpdCk7CisJfQkKK30KKworc3RhdGljIGlubGluZSB2b2lkIHZyYzU0NzdfYWM5N19kYWNfaW50ZXJydXB0KHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMpCit7CisJc3RydWN0IGRtYWJ1ZiogZGFjID0gJnMtPmRtYV9kYWM7CisJdW5zaWduZWQgdGVtcDsKKworCS8qIG5leHQgRE1BIHRyYW5zZmVyIHNob3VsZCBhbHJlYWR5IHN0YXJ0ZWQgKi8KKwkvLyBBU1NFUlQoaW5sKHMtPmlvICsgVlJDNTQ3N19EQUMxX0NUUkwpICYgVlJDNTQ3N19ETUFfV0lQKTsKKwkvLyBBU1NFUlQoaW5sKHMtPmlvICsgVlJDNTQ3N19EQUMyX0NUUkwpICYgVlJDNTQ3N19ETUFfV0lQKTsKKworCS8qIGxldCB1cyBzZXQgZm9yIG5leHQgbmV4dCBETUEgdHJhbnNmZXIgKi8KKwl0ZW1wID0gZGFjLT5uZXh0T3V0ICsgZGFjLT5mcmFnU2l6ZSoyOworCWlmICh0ZW1wID49IGRhYy0+ZnJhZ1RvdGFsU2l6ZSkgeworCQlBU1NFUlQoICh0ZW1wID09IGRhYy0+ZnJhZ1RvdGFsU2l6ZSkgfHwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZW1wID09IGRhYy0+ZnJhZ1RvdGFsU2l6ZSArIGRhYy0+ZnJhZ1NpemUpICk7CisJCXRlbXAgLT0gZGFjLT5mcmFnVG90YWxTaXplOworCX0KKwlvdXRsKGRhYy0+bGJ1ZkRtYSArIHRlbXAsIHMtPmlvICsgVlJDNTQ3N19EQUMxX0JBRERSKTsKKwlpZiAocy0+ZGFjQ2hhbm5lbHMgPT0gMSkgeworCQlvdXRsKGRhYy0+bGJ1ZkRtYSArIHRlbXAsIHMtPmlvICsgVlJDNTQ3N19EQUMyX0JBRERSKTsKKwl9IGVsc2UgeworCQlvdXRsKGRhYy0+cmJ1ZkRtYSArIHRlbXAsIHMtPmlvICsgVlJDNTQ3N19EQUMyX0JBRERSKTsKKwl9CisKKyNpZiBkZWZpbmVkKFZSQzU0NzdfQUM5N19WRVJCT1NFX0RFQlVHKQorCWlmICgqKHUxNiopKGRhYy0+bGJ1ZiArICBkYWMtPm5leHRPdXQpICE9IG91dFRpY2tldCkgeworCQlwcmludGsoImFzc2VydCBmYWlsOiAtICVkIHZzICVkXG4iLCAKKwkJICAgICAgICAqKHUxNiopKGRhYy0+bGJ1ZiArICBkYWMtPm5leHRPdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0VGlja2V0KTsKKyAgICAgICAgICAgICAgICBBU1NFUlQoMSA9PSAwKTsKKwl9CisjZW5kaWYKKworCS8qIGFkanVzdCBuZXh0T3V0IHBvaW50ZXIgKi8KKwlkYWMtPm5leHRPdXQgKz0gZGFjLT5mcmFnU2l6ZTsKKwlpZiAoZGFjLT5uZXh0T3V0ID49IGRhYy0+ZnJhZ1RvdGFsU2l6ZSkgeworCQlBU1NFUlQoZGFjLT5uZXh0T3V0ID09IGRhYy0+ZnJhZ1RvdGFsU2l6ZSk7CisJCWRhYy0+bmV4dE91dCA9IDA7CisJfQorCisJLyogYWRqdXN0IGNvdW50ICovCisJZGFjLT5jb3VudCAtPSBkYWMtPmZyYWdTaXplOworCWlmIChkYWMtPmNvdW50IDw9MCApIHsKKwkJLyogYnVmZmVyIHVuZGVyIHJ1biAqLworCQlkYWMtPmNvdW50ID0gMDsKKwkJZGFjLT5uZXh0SW4gPSBkYWMtPm5leHRPdXQ7CisJCXN0b3BfZGFjKHMpOworCX0KKworI2lmIGRlZmluZWQoVlJDNTQ3N19BQzk3X1ZFUkJPU0VfREVCVUcpCisJaWYgKGRhYy0+Y291bnQpIHsKKwkJb3V0VGlja2V0ICsrOworCQlBU1NFUlQoKih1MTYqKShkYWMtPmxidWYgKyAgZGFjLT5uZXh0T3V0KSA9PSBvdXRUaWNrZXQpOworCX0KKyNlbmRpZgorCQorCS8qIHdlIGNhbm5vdCBoYXZlIGJvdGggdW5kZXIgcnVuIGFuZCBzb21lb25lIGlzIHdhaXRpbmcgb24gdXMgKi8KKwlBU1NFUlQoISAod2FpdHF1ZXVlX2FjdGl2ZSgmZGFjLT53YWl0KSAmJiAoZGFjLT5jb3VudCA8PSAwKSkgKTsKKworCS8qIHdha2UgdXAgYW55Ym9keSBsaXN0ZW5pbmcgKi8KKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmZGFjLT53YWl0KSkKKwkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZkYWMtPndhaXQpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgdnJjNTQ3N19hYzk3X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMgPSAoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqKWRldl9pZDsKKwl1MzIgaXJxU3RhdHVzOworCXUzMiBhZGNJbnRlcnJ1cHRzLCBkYWNJbnRlcnJ1cHRzOworCisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKworCS8qIGdldCBpcnFTdGF0dXMgYW5kIGNsZWFyIHRoZSBkZXRlY3RlZCBvbmVzICovCisJaXJxU3RhdHVzID0gaW5sKHMtPmlvICsgVlJDNTQ3N19JTlRfU1RBVFVTKTsKKwlvdXRsKGlycVN0YXR1cywgcy0+aW8gKyBWUkM1NDc3X0lOVF9DTFIpOworCisJLyogbGV0IHVzIHNlZSB3aGF0IHdlIGdldCAqLworCWRhY0ludGVycnVwdHMgPSBWUkM1NDc3X0lOVF9NQVNLX0RBQzFFTkQgfCBWUkM1NDc3X0lOVF9NQVNLX0RBQzJFTkQ7CisJYWRjSW50ZXJydXB0cyA9IFZSQzU0NzdfSU5UX01BU0tfQURDMUVORCB8IFZSQzU0NzdfSU5UX01BU0tfQURDMkVORDsKKwlpZiAoaXJxU3RhdHVzICYgZGFjSW50ZXJydXB0cykgeworCQkvKiB3ZSBzaG91bGQgZ2V0IGJvdGggaW50ZXJydXB0cywgYnV0IGp1c3QgaW4gY2FzZSAuLi4gICovCisJCWlmIChpcnFTdGF0dXMgJiBWUkM1NDc3X0lOVF9NQVNLX0RBQzFFTkQpIHsKKwkJCXZyYzU0NzdfYWM5N19kYWNfaW50ZXJydXB0KHMpOworCQl9CisJCWlmICggKGlycVN0YXR1cyAmIGRhY0ludGVycnVwdHMpICE9IGRhY0ludGVycnVwdHMgKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2cmM1NDc3X2FjOTcgOiBkYWMgaW50ZXJydXB0cyBub3QgaW4gc3luYyEhIVxuIik7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXN0YXJ0X2RhYyhzKTsKKwkJfQorCX0gZWxzZSBpZiAoaXJxU3RhdHVzICYgYWRjSW50ZXJydXB0cykgeworCQkvKiB3ZSBzaG91bGQgZ2V0IGJvdGggaW50ZXJydXB0cywgYnV0IGp1c3QgaW4gY2FzZSAuLi4gICovCisJCWlmKGlycVN0YXR1cyAmIFZSQzU0NzdfSU5UX01BU0tfQURDMUVORCkgeworCQkJdnJjNTQ3N19hYzk3X2FkY19pbnRlcnJ1cHQocyk7CisJCX0gCisJCWlmICggKGlycVN0YXR1cyAmIGFkY0ludGVycnVwdHMpICE9IGFkY0ludGVycnVwdHMgKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2cmM1NDc3X2FjOTcgOiBhZGMgaW50ZXJydXB0cyBub3QgaW4gc3luYyEhIVxuIik7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN0YXJ0X2FkYyhzKTsKKwkJfQorCX0KKworCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IHZyYzU0NzdfYWM5N19vcGVuX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlLCBkZXZzKTsKKwkJaWYgKHMtPmNvZGVjLT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgdnJjNTQ3N19hYzk3X3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgbWl4ZGV2X2lvY3RsKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdW5zaWduZWQgaW50IGNtZCwKKwkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCB2cmM1NDc3X2FjOTdfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisgICAgc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcyA9IAorCSAgICAoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKyAgICBzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSBzLT5jb2RlYzsKKworICAgIHJldHVybiBtaXhkZXZfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZyYzU0NzdfYWM5N19taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gdnJjNTQ3N19hYzk3X2lvY3RsX21peGRldiwKKwkub3BlbgkJPSB2cmM1NDc3X2FjOTdfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSB2cmM1NDc3X2FjOTdfcmVsZWFzZV9taXhkZXYsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcywgaW50IG5vbmJsb2NrKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50LCB0bW87CisJCisJaWYgKCFzLT5kbWFfZGFjLnJlYWR5KQorCQlyZXR1cm4gMDsKKworCWZvciAoOzspIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCQlpZiAobm9uYmxvY2spCisJCQlyZXR1cm4gLUVCVVNZOworCQl0bW8gPSAxMDAwICogY291bnQgLyBzLT5kYWNSYXRlIC8gMjsKKwkJdnJjNTQ3N19hYzk3X2RlbGF5KHRtbyk7CisJfQorCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwlyZXR1cm4gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbmxpbmUgaW50Citjb3B5X3R3b19jaGFubmVsX2FkY190b191c2VyKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMsIAorCQkgICAgICAgICAgICAgY2hhciAqYnVmZmVyLCAKKwkJCSAgICAgaW50IGNvcHlDb3VudCkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9ICZzLT5kbWFfYWRjOworCWludCBidWZTdGFydCA9IGRiLT5uZXh0T3V0OworCWZvciAoOyBjb3B5Q291bnQgPiAwOyApIHsKKwkJaW50IGk7CisJCWludCBjb3VudCA9IGNvcHlDb3VudDsKKwkJaWYgKGNvdW50ID4gV09SS19CVUZfU0laRS8yKSBjb3VudCA9IFdPUktfQlVGX1NJWkUvMjsKKwkJZm9yIChpPTA7IGk8IGNvdW50LzI7IGkrKykgeworCQkJcy0+d29ya0J1ZltpXS5sY2hhbm5lbCA9IAorCQkJCSoodTE2KikoZGItPmxidWYgKyBidWZTdGFydCArIGkqMik7CisJCQlzLT53b3JrQnVmW2ldLnJjaGFubmVsID0gCisJCQkJKih1MTYqKShkYi0+cmJ1ZiArIGJ1ZlN0YXJ0ICsgaSoyKTsKKwkJfQorCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcy0+d29ya0J1ZiwgY291bnQqMikpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWNvcHlDb3VudCAtPSBjb3VudDsKKwkJYnVmU3RhcnQgKz0gY291bnQ7CisJCUFTU0VSVChidWZTdGFydCA8PSBkYi0+ZnJhZ1RvdGFsU2l6ZSk7CisJCWJ1ZmZlciArPSBjb3VudCAqMjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybiB0aGUgdG90YWwgYnl0ZXMgdGhhdCBpcyBjb3BpZWQgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citjb3B5X2FkY190b191c2VyKHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMsCisJCSBjaGFyICogYnVmZmVyLAorCQkgc2l6ZV90IGNvdW50LAorCQkgaW50IGF2YWlsKQoreworCXN0cnVjdCBkbWFidWYgKmRiID0gJnMtPmRtYV9hZGM7CisJaW50IGNvcHlDb3VudD0wOworCWludCBjb3B5RnJhZ0NvdW50PTA7CisJaW50IHRvdGFsQ29weUNvdW50ID0gMDsKKwlpbnQgdG90YWxDb3B5RnJhZ0NvdW50ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogYWRqdXN0IGNvdW50IHRvIHNpZ25lbCBjaGFubmVsIGJ5dGUgY291bnQgKi8KKwljb3VudCA+Pj0gcy0+YWRjQ2hhbm5lbHMgLSAxOworCisJLyogd2UgbWF5IGhhdmUgdG8gImNvcHkiIHR3aWNlIGFzIHJpbmcgYnVmZmVyIHdyYXBzIGFyb3VuZCAqLworCWZvciAoOyAoYXZhaWwgPiAwKSAmJiAoY291bnQgPiAwKTsgKSB7CisJCS8qIGRldGVybWluZSBtYXggcG9zc2libGUgY29weSBjb3VudCBmb3Igc2luZ2xlIGNoYW5uZWwgKi8KKwkJY29weUNvdW50ID0gY291bnQ7CisJCWlmIChjb3B5Q291bnQgPiBhdmFpbCkgeworCQkJY29weUNvdW50ID0gYXZhaWw7CisJCX0KKwkJaWYgKGNvcHlDb3VudCArIGRiLT5uZXh0T3V0ID4gZGItPmZyYWdUb3RhbFNpemUpIHsKKwkJCWNvcHlDb3VudCA9IGRiLT5mcmFnVG90YWxTaXplIC0gZGItPm5leHRPdXQ7CisJCQlBU1NFUlQoKGNvcHlDb3VudCAlIGRiLT5mcmFnU2l6ZSkgPT0gMCk7CisJCX0KKworCQljb3B5RnJhZ0NvdW50ID0gKGNvcHlDb3VudC0xKSA+PiBkYi0+ZnJhZ1NoaWZ0OworCQljb3B5RnJhZ0NvdW50ID0gKGNvcHlGcmFnQ291bnQrMSkgPDwgZGItPmZyYWdTaGlmdDsKKwkJQVNTRVJUKGNvcHlGcmFnQ291bnQgPj0gY29weUNvdW50KTsKKworCQkvKiB3ZSBjb3B5IGRpZmZlcmVudGx5IGJhc2VkIG9uIGFkYyBjaGFubmVscyAqLworCQlpZiAocy0+YWRjQ2hhbm5lbHMgPT0gMSkgeworCQkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIAorCQkJCQkgZGItPmxidWYgKyBkYi0+bmV4dE91dCwgCisJCQkJCSBjb3B5Q291bnQpKSAKKwkJCQlyZXR1cm4gLTE7CisJCX0gZWxzZSB7CisJCQkvKiAqc2lnaCogd2UgaGF2ZSB0byBtaXggdHdvIHN0cmVhbXMgaW50byBvbmUgICovCisJCQlpZiAoY29weV90d29fY2hhbm5lbF9hZGNfdG9fdXNlcihzLCBidWZmZXIsIGNvcHlDb3VudCkpCisJCQkJcmV0dXJuIC0xOworCQl9CQorCisJCWNvdW50IC09IGNvcHlDb3VudDsKKwkJdG90YWxDb3B5Q291bnQgKz0gY29weUNvdW50OworCQlhdmFpbCAtPSBjb3B5RnJhZ0NvdW50OworCQl0b3RhbENvcHlGcmFnQ291bnQgKz0gY29weUZyYWdDb3VudDsKKworCQlidWZmZXIgKz0gY29weUNvdW50IDw8IChzLT5hZGNDaGFubmVscy0xKTsKKworCQlkYi0+bmV4dE91dCArPSBjb3B5RnJhZ0NvdW50OworCQlpZiAoZGItPm5leHRPdXQgPj0gZGItPmZyYWdUb3RhbFNpemUpIHsKKwkJCUFTU0VSVChkYi0+bmV4dE91dCA9PSBkYi0+ZnJhZ1RvdGFsU2l6ZSk7CisJCQlkYi0+bmV4dE91dCA9IDA7CisJCX0KKworCQlBU1NFUlQoKGNvcHlGcmFnQ291bnQgJSBkYi0+ZnJhZ1NpemUpID09IDApOworCQlBU1NFUlQoIChjb3VudCA9PSAwKSB8fCAoY29weUNvdW50ID09IGNvcHlGcmFnQ291bnQpKTsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworICAgICAgICBkYi0+Y291bnQgLT0gdG90YWxDb3B5RnJhZ0NvdW50OworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdG90YWxDb3B5Q291bnQgPDwgKHMtPmFkY0NoYW5uZWxzLTEpOworfQorCitzdGF0aWMgc3NpemVfdCAKK3ZyYzU0NzdfYWM5N19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCAKKwkJICBjaGFyICpidWZmZXIsCisJCSAgc2l6ZV90IGNvdW50LCAKKwkJICBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcyA9IAorCQkoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9ICZzLT5kbWFfYWRjOworCXNzaXplX3QgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3B5Q291bnQ7CisJc2l6ZV90IGF2YWlsOworCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlBU1NFUlQoZGItPnJlYWR5KTsKKworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJLy8gd2FpdCBmb3Igc2FtcGxlcyBpbiBjYXB0dXJlIGJ1ZmZlcgorCQlkbyB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGRiLT5zdG9wcGVkKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCWF2YWlsID0gZGItPmNvdW50OworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJaWYgKGF2YWlsIDw9IDApIHsKKwkJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQkJaWYgKCFyZXQpCisJCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZkYi0+d2FpdCk7CisJCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJCWlmICghcmV0KQorCQkJCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCX0KKwkJfSB3aGlsZSAoYXZhaWwgPD0gMCk7CisKKwkJQVNTRVJUKCAoYXZhaWwgJSBkYi0+ZnJhZ1NpemUpID09IDApOworCQljb3B5Q291bnQgPSBjb3B5X2FkY190b191c2VyKHMsIGJ1ZmZlciwgY291bnQsIGF2YWlsKTsKKwkJaWYgKGNvcHlDb3VudCA8PTAgKSB7CisJCQlpZiAoIXJldCkgcmV0ID0gLUVGQVVMVDsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQljb3VudCAtPSBjb3B5Q291bnQ7CisJCWJ1ZmZlciArPSBjb3B5Q291bnQ7CisJCXJldCArPSBjb3B5Q291bnQ7CisJfSAvLyB3aGlsZSAoY291bnQgPiAwKQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2NvcHlfdHdvX2NoYW5uZWxfZGFjX2Zyb21fdXNlcihzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzLCAKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWZmZXIsIAorCQkJICAgICAgIGludCBjb3B5Q291bnQpCit7CisJc3RydWN0IGRtYWJ1ZiAqZGIgPSAmcy0+ZG1hX2RhYzsKKwlpbnQgYnVmU3RhcnQgPSBkYi0+bmV4dEluOworCisJQVNTRVJUKGRiLT5yZWFkeSk7CisKKyAgICAgICAgZm9yICg7IGNvcHlDb3VudCA+IDA7ICkgeworICAgICAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgICAgIGludCBjb3VudCA9IGNvcHlDb3VudDsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgPiBXT1JLX0JVRl9TSVpFLzIpIGNvdW50ID0gV09SS19CVUZfU0laRS8yOworICAgICAgICAgICAgICAgIGlmIChjb3B5X2Zyb21fdXNlcihzLT53b3JrQnVmLCBidWZmZXIsIGNvdW50KjIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaT0wOyBpPCBjb3VudC8yOyBpKyspIHsKKwkJCSoodTE2KikoZGItPmxidWYgKyBidWZTdGFydCArIGkqMikgPSAKKwkJCQlzLT53b3JrQnVmW2ldLmxjaGFubmVsOworCQkJKih1MTYqKShkYi0+cmJ1ZiArIGJ1ZlN0YXJ0ICsgaSoyKSA9IAorCQkJCXMtPndvcmtCdWZbaV0ucmNoYW5uZWw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29weUNvdW50IC09IGNvdW50OworCQlidWZTdGFydCArPSBjb3VudDsKKwkJQVNTRVJUKGJ1ZlN0YXJ0IDw9IGRiLT5mcmFnVG90YWxTaXplKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgKz0gY291bnQgKjI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisKK30KKworLyogcmV0dXJuIHRoZSB0b3RhbCBieXRlcyB0aGF0IGlzIGNvcGllZCAqLworc3RhdGljIGlubGluZSBpbnQKK2NvcHlfZGFjX2Zyb21fdXNlcihzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzLCAKKwkJICAgY29uc3QgY2hhciAqYnVmZmVyLCAKKwkJICAgc2l6ZV90IGNvdW50LCAKKwkJICAgaW50IGF2YWlsKQorewkKKyAgICAgICAgc3RydWN0IGRtYWJ1ZiAqZGIgPSAmcy0+ZG1hX2RhYzsKKyAgICAgICAgaW50IGNvcHlDb3VudD0wOworICAgICAgICBpbnQgY29weUZyYWdDb3VudD0wOworICAgICAgICBpbnQgdG90YWxDb3B5Q291bnQgPSAwOworICAgICAgICBpbnQgdG90YWxDb3B5RnJhZ0NvdW50ID0gMDsKKyAgICAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKyNpZiBkZWZpbmVkKFZSQzU0NzdfQUM5N19WRVJCT1NFX0RFQlVHKQorCWludCBpOworI2VuZGlmCisKKyAgICAgICAgLyogYWRqdXN0IGNvdW50IHRvIHNpZ25lbCBjaGFubmVsIGJ5dGUgY291bnQgKi8KKyAgICAgICAgY291bnQgPj49IHMtPmRhY0NoYW5uZWxzIC0gMTsKKworICAgICAgICAvKiB3ZSBtYXkgaGF2ZSB0byAiY29weSIgdHdpY2UgYXMgcmluZyBidWZmZXIgd3JhcHMgYXJvdW5kICovCisgICAgICAgIGZvciAoOyAoYXZhaWwgPiAwKSAmJiAoY291bnQgPiAwKTsgKSB7CisgICAgICAgICAgICAgICAgLyogZGV0ZXJtaW5lIG1heCBwb3NzaWJsZSBjb3B5IGNvdW50IGZvciBzaW5nbGUgY2hhbm5lbCAqLworICAgICAgICAgICAgICAgIGNvcHlDb3VudCA9IGNvdW50OworICAgICAgICAgICAgICAgIGlmIChjb3B5Q291bnQgPiBhdmFpbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29weUNvdW50ID0gYXZhaWw7CisJCX0KKyAgICAgICAgICAgICAgICBpZiAoY29weUNvdW50ICsgZGItPm5leHRJbiA+IGRiLT5mcmFnVG90YWxTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5Q291bnQgPSBkYi0+ZnJhZ1RvdGFsU2l6ZSAtIGRiLT5uZXh0SW47CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlQoY29weUNvdW50ID4gMCk7CisgICAgICAgICAgICAgICAgfQorCisJCWNvcHlGcmFnQ291bnQgPSBjb3B5Q291bnQ7CisJCUFTU0VSVChjb3B5RnJhZ0NvdW50ID49IGNvcHlDb3VudCk7CisKKwkJLyogd2UgY29weSBkaWZmZXJlbnRseSBiYXNlZCBvbiB0aGUgbnVtYmVyIGNoYW5uZWxzICovCisJCWlmIChzLT5kYWNDaGFubmVscyA9PSAxKSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZGItPmxidWYgKyBkYi0+bmV4dEluLAorCQkJCQkgICBidWZmZXIsCisJCQkJCSAgIGNvcHlDb3VudCkpIAorCQkJCXJldHVybiAtMTsKKwkJCS8qIGZpbGwgZ2FwcyB3aXRoIDAgKi8KKwkJCW1lbXNldChkYi0+bGJ1ZiArIGRiLT5uZXh0SW4gKyBjb3B5Q291bnQsCisJCQkgICAgICAgMCwKKwkJCSAgICAgICBjb3B5RnJhZ0NvdW50IC0gY29weUNvdW50KTsKKwkJfSBlbHNlIHsKKwkJCS8qIHdlIGhhdmUgZGVtdXggdGhlIHN0cmVhbSBpbnRvIHR3byBzZXBhcmF0ZSBvbmVzICovCisJCQlpZiAoY29weV90d29fY2hhbm5lbF9kYWNfZnJvbV91c2VyKHMsIGJ1ZmZlciwgY29weUNvdW50KSkKKwkJCQlyZXR1cm4gLTE7CisJCQkvKiBmaWxsIGdhcHMgd2l0aCAwICovCisJCQltZW1zZXQoZGItPmxidWYgKyBkYi0+bmV4dEluICsgY29weUNvdW50LAorCQkJICAgICAgIDAsCisJCQkgICAgICAgY29weUZyYWdDb3VudCAtIGNvcHlDb3VudCk7CisJCQltZW1zZXQoZGItPnJidWYgKyBkYi0+bmV4dEluICsgY29weUNvdW50LAorCQkJICAgICAgIDAsCisJCQkgICAgICAgY29weUZyYWdDb3VudCAtIGNvcHlDb3VudCk7CisJCX0KKworI2lmIGRlZmluZWQoVlJDNTQ3N19BQzk3X1ZFUkJPU0VfREVCVUcpCisJCWZvciAoaT0wOyBpPCBjb3B5RnJhZ0NvdW50OyBpKz0gZGItPmZyYWdTaXplKSB7CisJCQkqKHUxNiopKGRiLT5sYnVmICsgZGItPm5leHRJbiArIGkpID0gaW5UaWNrZXQgKys7CisJCX0KKyNlbmRpZgorCisJCWNvdW50IC09IGNvcHlDb3VudDsKKwkJdG90YWxDb3B5Q291bnQgKz0gY29weUNvdW50OworCQlhdmFpbCAtPSBjb3B5RnJhZ0NvdW50OworCQl0b3RhbENvcHlGcmFnQ291bnQgKz0gY29weUZyYWdDb3VudDsKKworCQlidWZmZXIgKz0gY29weUNvdW50IDw8IChzLT5kYWNDaGFubmVscyAtIDEpOworCisJCWRiLT5uZXh0SW4gKz0gY29weUZyYWdDb3VudDsKKwkJaWYgKGRiLT5uZXh0SW4gPj0gZGItPmZyYWdUb3RhbFNpemUpIHsKKwkJCUFTU0VSVChkYi0+bmV4dEluID09IGRiLT5mcmFnVG90YWxTaXplKTsKKwkJCWRiLT5uZXh0SW4gPSAwOworCQl9CisKKwkJQVNTRVJUKCAoY291bnQgPT0gMCkgfHwgKGNvcHlDb3VudCA9PSBjb3B5RnJhZ0NvdW50KSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgZGItPmNvdW50ICs9IHRvdGFsQ29weUZyYWdDb3VudDsKKwlpZiAoZGItPnN0b3BwZWQpIHsKKwkJc3RhcnRfZGFjKHMpOworCX0KKworCS8qIG5leHRJbiBzaG91bGQgbm90IGJlIGVxdWFsIHRvIG5leHRPdXQgdW5sZXNzIHdlIGFyZSBmdWxsICovCisJQVNTRVJUKCAoIChkYi0+Y291bnQgPT0gZGItPmZyYWdUb3RhbFNpemUpICYmIAorICAgICAgICAgICAgICAgICAgICAgICAoZGItPm5leHRJbiA9PSBkYi0+bmV4dE91dCkgKSB8fAorICAgICAgICAgICAgICAgICAgICAgKCAoZGItPmNvdW50IDwgZGItPmZyYWdUb3RhbFNpemUpICYmCisgICAgICAgICAgICAgICAgICAgICAgIChkYi0+bmV4dEluICE9IGRiLT5uZXh0T3V0KSApICk7CisKKyAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisgICAgICAgIHJldHVybiB0b3RhbENvcHlDb3VudCA8PCAocy0+ZGFjQ2hhbm5lbHMtMSk7CisKK30KKworc3RhdGljIHNzaXplX3QgdnJjNTQ3N19hYzk3X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsCisJCQkJICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzID0gCisJCShzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRiID0gJnMtPmRtYV9kYWM7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY29weUNvdW50LCBhdmFpbDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKyAgICAKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCS8vIHdhaXQgZm9yIHNwYWNlIGluIHBsYXliYWNrIGJ1ZmZlcgorCQlkbyB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJYXZhaWwgPSBkYi0+ZnJhZ1RvdGFsU2l6ZSAtIGRiLT5jb3VudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChhdmFpbCA8PSAwKSB7CisJCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJCWlmICghcmV0KQorCQkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmZGItPndhaXQpOworCQkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCQlpZiAoIXJldCkKKwkJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKGF2YWlsIDw9IDApOworCQorCQljb3B5Q291bnQgPSBjb3B5X2RhY19mcm9tX3VzZXIocywgYnVmZmVyLCBjb3VudCwgYXZhaWwpOworCQlpZiAoY29weUNvdW50IDwgMCkgeworCQkJaWYgKCFyZXQpIHJldCA9IC1FRkFVTFQ7CisJCQlyZXR1cm4gcmV0OworCQl9CisKKwkJY291bnQgLT0gY29weUNvdW50OworCQlidWZmZXIgKz0gY29weUNvdW50OworCQlyZXQgKz0gY29weUNvdW50OworCX0gLy8gd2hpbGUgKGNvdW50ID4gMCkKKwkKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludCB2cmM1NDc3X2FjOTdfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqcyA9IChzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMud2FpdCwgd2FpdCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXBvbGxfd2FpdChmaWxlLCAmcy0+ZG1hX2FkYy53YWl0LCB3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnU2l6ZSkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICgoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ1RvdGFsU2l6ZSA+PQorCQkgICAgcy0+ZG1hX2RhYy5jb3VudCArIChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnU2l6ZSkKKwkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbWFzazsKK30KKworI2lmZGVmIFZSQzU0NzdfQUM5N19ERUJVRworc3RhdGljIHN0cnVjdCBpb2N0bF9zdHJfdCB7CisgICAgdW5zaWduZWQgaW50IGNtZDsKKyAgICBjb25zdCBjaGFyKiBzdHI7Cit9IGlvY3RsX3N0cltdID0geworICAgIHtTTkRDVExfRFNQX1JFU0VULCAiU05EQ1RMX0RTUF9SRVNFVCJ9LAorICAgIHtTTkRDVExfRFNQX1NZTkMsICJTTkRDVExfRFNQX1NZTkMifSwKKyAgICB7U05EQ1RMX0RTUF9TUEVFRCwgIlNORENUTF9EU1BfU1BFRUQifSwKKyAgICB7U05EQ1RMX0RTUF9TVEVSRU8sICJTTkRDVExfRFNQX1NURVJFTyJ9LAorICAgIHtTTkRDVExfRFNQX0dFVEJMS1NJWkUsICJTTkRDVExfRFNQX0dFVEJMS1NJWkUifSwKKyAgICB7U05EQ1RMX0RTUF9TRVRGTVQsICJTTkRDVExfRFNQX1NFVEZNVCJ9LAorICAgIHtTTkRDVExfRFNQX1NBTVBMRVNJWkUsICJTTkRDVExfRFNQX1NBTVBMRVNJWkUifSwKKyAgICB7U05EQ1RMX0RTUF9DSEFOTkVMUywgIlNORENUTF9EU1BfQ0hBTk5FTFMifSwKKyAgICB7U09VTkRfUENNX1dSSVRFX0NIQU5ORUxTLCAiU09VTkRfUENNX1dSSVRFX0NIQU5ORUxTIn0sCisgICAge1NPVU5EX1BDTV9XUklURV9GSUxURVIsICJTT1VORF9QQ01fV1JJVEVfRklMVEVSIn0sCisgICAge1NORENUTF9EU1BfUE9TVCwgIlNORENUTF9EU1BfUE9TVCJ9LAorICAgIHtTTkRDVExfRFNQX1NVQkRJVklERSwgIlNORENUTF9EU1BfU1VCRElWSURFIn0sCisgICAge1NORENUTF9EU1BfU0VURlJBR01FTlQsICJTTkRDVExfRFNQX1NFVEZSQUdNRU5UIn0sCisgICAge1NORENUTF9EU1BfR0VURk1UUywgIlNORENUTF9EU1BfR0VURk1UUyJ9LAorICAgIHtTTkRDVExfRFNQX0dFVE9TUEFDRSwgIlNORENUTF9EU1BfR0VUT1NQQUNFIn0sCisgICAge1NORENUTF9EU1BfR0VUSVNQQUNFLCAiU05EQ1RMX0RTUF9HRVRJU1BBQ0UifSwKKyAgICB7U05EQ1RMX0RTUF9OT05CTE9DSywgIlNORENUTF9EU1BfTk9OQkxPQ0sifSwKKyAgICB7U05EQ1RMX0RTUF9HRVRDQVBTLCAiU05EQ1RMX0RTUF9HRVRDQVBTIn0sCisgICAge1NORENUTF9EU1BfR0VUVFJJR0dFUiwgIlNORENUTF9EU1BfR0VUVFJJR0dFUiJ9LAorICAgIHtTTkRDVExfRFNQX1NFVFRSSUdHRVIsICJTTkRDVExfRFNQX1NFVFRSSUdHRVIifSwKKyAgICB7U05EQ1RMX0RTUF9HRVRJUFRSLCAiU05EQ1RMX0RTUF9HRVRJUFRSIn0sCisgICAge1NORENUTF9EU1BfR0VUT1BUUiwgIlNORENUTF9EU1BfR0VUT1BUUiJ9LAorICAgIHtTTkRDVExfRFNQX01BUElOQlVGLCAiU05EQ1RMX0RTUF9NQVBJTkJVRiJ9LAorICAgIHtTTkRDVExfRFNQX01BUE9VVEJVRiwgIlNORENUTF9EU1BfTUFQT1VUQlVGIn0sCisgICAge1NORENUTF9EU1BfU0VUU1lOQ1JPLCAiU05EQ1RMX0RTUF9TRVRTWU5DUk8ifSwKKyAgICB7U05EQ1RMX0RTUF9TRVREVVBMRVgsICJTTkRDVExfRFNQX1NFVERVUExFWCJ9LAorICAgIHtTTkRDVExfRFNQX0dFVE9ERUxBWSwgIlNORENUTF9EU1BfR0VUT0RFTEFZIn0sCisgICAge1NORENUTF9EU1BfR0VUQ0hBTk5FTE1BU0ssICJTTkRDVExfRFNQX0dFVENIQU5ORUxNQVNLIn0sCisgICAge1NORENUTF9EU1BfQklORF9DSEFOTkVMLCAiU05EQ1RMX0RTUF9CSU5EX0NIQU5ORUwifSwKKyAgICB7T1NTX0dFVFZFUlNJT04sICJPU1NfR0VUVkVSU0lPTiJ9LAorICAgIHtTT1VORF9QQ01fUkVBRF9SQVRFLCAiU09VTkRfUENNX1JFQURfUkFURSJ9LAorICAgIHtTT1VORF9QQ01fUkVBRF9DSEFOTkVMUywgIlNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTIn0sCisgICAge1NPVU5EX1BDTV9SRUFEX0JJVFMsICJTT1VORF9QQ01fUkVBRF9CSVRTIn0sCisgICAge1NPVU5EX1BDTV9SRUFEX0ZJTFRFUiwgIlNPVU5EX1BDTV9SRUFEX0ZJTFRFUiJ9Cit9OworI2VuZGlmICAgIAorCitzdGF0aWMgaW50IHZyYzU0NzdfYWM5N19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnMgPSAoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKwlpbnQgY291bnQ7CisJaW50IHZhbCwgcmV0OworCisjaWZkZWYgVlJDNTQ3N19BQzk3X0RFQlVHCisJZm9yIChjb3VudD0wOyBjb3VudDxzaXplb2YoaW9jdGxfc3RyKS9zaXplb2YoaW9jdGxfc3RyWzBdKTsgY291bnQrKykgeworCQlpZiAoaW9jdGxfc3RyW2NvdW50XS5jbWQgPT0gY21kKQorCQkJYnJlYWs7CisJfQorCWlmIChjb3VudCA8IHNpemVvZihpb2N0bF9zdHIpL3NpemVvZihpb2N0bF9zdHJbMF0pKQorCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiaW9jdGwgJXNcbiIsIGlvY3RsX3N0cltjb3VudF0uc3RyKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJpb2N0bCB1bmtub3duLCAweCV4XG4iLCBjbWQpOworI2VuZGlmCisgICAgCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIGRyYWluX2RhYyhzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJCXJldHVybiAwOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVgsIChpbnQgKilhcmcpOworCQkKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMocyk7CisJCQlzeW5jaHJvbml6ZV9pcnEocy0+aXJxKTsKKwkJCXMtPmRtYV9kYWMuY291bnQgPSAwOworCQkJcy0+ZG1hX2RhYy5uZXh0SW4gPSBzLT5kbWFfZGFjLm5leHRPdXQgPSAwOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQkJcy0+ZG1hX2FkYy5jb3VudCA9IDA7CisJCQlzLT5kbWFfYWRjLm5leHRJbiA9IHMtPmRtYV9hZGMubmV4dE91dCA9IDA7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgPj0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzKTsKKwkJCQlzZXRfYWRjX3JhdGUocywgdmFsKTsKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzZXRfZGFjX3JhdGUocywgdmFsKTsKKwkJCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/CisJCQkJcy0+YWRjUmF0ZSA6IHMtPmRhY1JhdGUsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJaWYgKHZhbCkKKwkJCQlzLT5hZGNDaGFubmVscyA9IDI7CisJCQllbHNlCisJCQkJcy0+YWRjQ2hhbm5lbHMgPSAxOworCQkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQkJCXJldHVybiByZXQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCWlmICh2YWwpCisJCQkJcy0+ZGFjQ2hhbm5lbHMgPSAyOworCQkJZWxzZQorCQkJCXMtPmRhY0NoYW5uZWxzID0gMTsKKwkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQlyZXR1cm4gcmV0OworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDApIHsKKwkJCWlmICggKHZhbCAhPSAxKSAmJiAodmFsICE9IDIpKSB2YWwgPSAyOworCisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRhY0NoYW5uZWxzID0gdmFsOworCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRhY0NoYW5uZWxzID0gdmFsOworCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopYXJnKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrICovCisJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSwgKGludCAqKWFyZyk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKHZhbCAhPSBBRk1UX1MxNl9MRSkgcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXZhbCA9IEFGTVRfUzE2X0xFOworCQl9CisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKilhcmcpOworCQkKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJLyogTk8gdHJpZ2dlciAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfZGFjLmZyYWdTaXplIDw8IChzLT5kYWNDaGFubmVscy0xKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWFiaW5mby5ieXRlcyA9IChzLT5kbWFfZGFjLmZyYWdUb3RhbFNpemUgLSBjb3VudCkgPDwgCisJCQkocy0+ZGFjQ2hhbm5lbHMtMSk7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYy5udW1GcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ1NoaWZ0ID4+IAorCQkJKHMtPmRhY0NoYW5uZWxzLTEpOyAgICAgIAorCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWFiaW5mby5mcmFnc2l6ZSA9IHMtPmRtYV9hZGMuZnJhZ1NpemUgPDwgKHMtPmFkY0NoYW5uZWxzLTEpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ID0gMDsKKwkJYWJpbmZvLmJ5dGVzID0gY291bnQgPDwgKHMtPmFkY0NoYW5uZWxzLTEpOworCQlhYmluZm8uZnJhZ3N0b3RhbCA9IHMtPmRtYV9hZGMubnVtRnJhZzsKKwkJYWJpbmZvLmZyYWdtZW50cyA9IChhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2FkYy5mcmFnU2hpZnQpID4+CisJCQkocy0+YWRjQ2hhbm5lbHMtMSk7ICAgICAgCisJCXJldHVybiBjb3B5X3RvX3VzZXIoKHZvaWQgKilhcmcsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCQkKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBwdXRfdXNlcihjb3VudCwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJLyogd2UgY2Fubm90IGdldCBETUEgcHRyICovCisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfZGFjLmZyYWdTaXplIDw8IChzLT5kYWNDaGFubmVscy0xKSwgKGludCAqKWFyZyk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLmZyYWdTaXplIDw8IChzLT5hZGNDaGFubmVscy0xKSwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCS8qIHdlIGlnbm9yZSBmcmFnbWVudCBzaXplIHJlcXVlc3QgKi8KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgorCQkvKiB3aGF0IGlzIHRoaXMgZm9yPyBbanN1bl0gKi8KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCXJldHVybiBwdXRfdXNlcigoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPworCQkJCXMtPmFkY1JhdGUgOiBzLT5kYWNSYXRlLCAoaW50ICopYXJnKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmFkY0NoYW5uZWxzLCAoaW50ICopYXJnKTsKKwkJZWxzZQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRhY0NoYW5uZWxzID8gMiA6IDEsIChpbnQgKilhcmcpOworCSAgICAKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCXJldHVybiBwdXRfdXNlcigxNiwgKGludCAqKWFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIG1peGRldl9pb2N0bChzLT5jb2RlYywgY21kLCBhcmcpOworfQorCisKK3N0YXRpYyBpbnQgdnJjNTQ3N19hYzk3X29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqczsKKwlpbnQgcmV0PTA7CisKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsgICAgCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUsIGRldnMpOworCQlpZiAoISgocy0+ZGV2X2F1ZGlvIF4gbWlub3IpICYgfjB4ZikpCisJCQlicmVhazsKKwl9CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKworCS8qIHdhaXQgZm9yIGRldmljZSB0byBiZWNvbWUgZnJlZSAqLworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl3aGlsZSAocy0+b3Blbl9tb2RlICYgZmlsZS0+Zl9tb2RlKSB7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmcy0+b3Blbl9zZW0pOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlhZGRfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQlkb3duKCZzLT5vcGVuX3NlbSk7CisJfQorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCS8qIHNldCBkZWZhdWx0IHNldHRpbmdzICovCisJCXNldF9hZGNfcmF0ZShzLCA0ODAwMCk7CisJCXMtPmFkY0NoYW5uZWxzID0gMjsKKworCQlyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocyk7CisJCWlmIChyZXQpIGdvdG8gYmFpbG91dDsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCS8qIHNldCBkZWZhdWx0IHNldHRpbmdzICovCisJCXNldF9kYWNfcmF0ZShzLCA0ODAwMCk7CisJCXMtPmRhY0NoYW5uZWxzID0gMjsKKworCQlyZXQgPSBwcm9nX2RtYWJ1Zl9kYWMocyk7CisJCWlmIChyZXQpIGdvdG8gYmFpbG91dDsKKwl9CisKKwlzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisKKyBiYWlsb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworCXVwKCZzLT5vcGVuX3NlbSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB2cmM1NDc3X2FjOTdfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzID0gCisJCShzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJbG9ja19rZXJuZWwoKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCWRyYWluX2RhYyhzLCBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJZG93bigmcy0+b3Blbl9zZW0pOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzdG9wX2RhYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9kYWMpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlzdG9wX2FkYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9hZGMpOworCX0KKwlzLT5vcGVuX21vZGUgJj0gKH5maWxlLT5mX21vZGUpICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2cmM1NDc3X2FjOTdfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gdnJjNTQ3N19hYzk3X3JlYWQsCisJLndyaXRlCQk9IHZyYzU0NzdfYWM5N193cml0ZSwKKwkucG9sbAkJPSB2cmM1NDc3X2FjOTdfcG9sbCwKKwkuaW9jdGwJCT0gdnJjNTQ3N19hYzk3X2lvY3RsLAorCS8vIC5tbWFwCT0gdnJjNTQ3N19hYzk3X21tYXAsCisJLm9wZW4JCT0gdnJjNTQ3N19hYzk3X29wZW4sCisJLnJlbGVhc2UJPSB2cmM1NDc3X2FjOTdfcmVsZWFzZSwKK307CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLCB3ZSdsbCBjcmVhdGUgYSBwcm9jIGRldmljZSB0aGF0IGR1bXBzIHRoZQorICogQ09ERUMgY2hpcHN0YXRlCisgKi8KKworI2lmZGVmIFZSQzU0NzdfQUM5N19ERUJVRworCitzdHJ1Y3QgeworICAgICAgIGNvbnN0IGNoYXIgKnJlZ25hbWU7CisgICAgICAgdW5zaWduZWQgcmVnYWRkcjsKK30gdnJjNTQ3N19hYzk3X3JlZ3NbXSA9IHsKKwl7IlZSQzU0NzdfSU5UX1NUQVRVUyIsIFZSQzU0NzdfSU5UX1NUQVRVU30sCisJeyJWUkM1NDc3X0NPREVDX1dSIiwgVlJDNTQ3N19DT0RFQ19XUn0sCisJeyJWUkM1NDc3X0NPREVDX1JEIiwgVlJDNTQ3N19DT0RFQ19SRH0sCisJeyJWUkM1NDc3X0NUUkwiLCBWUkM1NDc3X0NUUkx9LAorCXsiVlJDNTQ3N19BQ0xJTktfQ1RSTCIsIFZSQzU0NzdfQUNMSU5LX0NUUkx9LAorCXsiVlJDNTQ3N19JTlRfTUFTSyIsIFZSQzU0NzdfSU5UX01BU0t9LAorCXsiVlJDNTQ3N19EQUMxX0NUUkwiLCBWUkM1NDc3X0RBQzFfQ1RSTH0sCisJeyJWUkM1NDc3X0RBQzFMIiwgVlJDNTQ3N19EQUMxTH0sCisJeyJWUkM1NDc3X0RBQzFfQkFERFIiLCBWUkM1NDc3X0RBQzFfQkFERFJ9LAorCXsiVlJDNTQ3N19EQUMyX0NUUkwiLCBWUkM1NDc3X0RBQzJfQ1RSTH0sCisJeyJWUkM1NDc3X0RBQzJMIiwgVlJDNTQ3N19EQUMyTH0sCisJeyJWUkM1NDc3X0RBQzJfQkFERFIiLCBWUkM1NDc3X0RBQzJfQkFERFJ9LAorCXsiVlJDNTQ3N19EQUMzX0NUUkwiLCBWUkM1NDc3X0RBQzNfQ1RSTH0sCisJeyJWUkM1NDc3X0RBQzNMIiwgVlJDNTQ3N19EQUMzTH0sCisJeyJWUkM1NDc3X0RBQzNfQkFERFIiLCBWUkM1NDc3X0RBQzNfQkFERFJ9LAorCXsiVlJDNTQ3N19BREMxX0NUUkwiLCBWUkM1NDc3X0FEQzFfQ1RSTH0sCisJeyJWUkM1NDc3X0FEQzFMIiwgVlJDNTQ3N19BREMxTH0sCisJeyJWUkM1NDc3X0FEQzFfQkFERFIiLCBWUkM1NDc3X0FEQzFfQkFERFJ9LAorCXsiVlJDNTQ3N19BREMyX0NUUkwiLCBWUkM1NDc3X0FEQzJfQ1RSTH0sCisJeyJWUkM1NDc3X0FEQzJMIiwgVlJDNTQ3N19BREMyTH0sCisJeyJWUkM1NDc3X0FEQzJfQkFERFIiLCBWUkM1NDc3X0FEQzJfQkFERFJ9LAorCXsiVlJDNTQ3N19BREMzX0NUUkwiLCBWUkM1NDc3X0FEQzNfQ1RSTH0sCisJeyJWUkM1NDc3X0FEQzNMIiwgVlJDNTQ3N19BREMzTH0sCisJeyJWUkM1NDc3X0FEQzNfQkFERFIiLCBWUkM1NDc3X0FEQzNfQkFERFJ9LAorCXtOVUxMLCAweDB9Cit9OworCitzdGF0aWMgaW50IHByb2NfdnJjNTQ3N19hYzk3X2R1bXAgKGNoYXIgKmJ1ZiwgY2hhciAqKnN0YXJ0LCBvZmZfdCBmcG9zLAorCQkJCSAgIGludCBsZW5ndGgsIGludCAqZW9mLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCB2cmM1NDc3X2FjOTdfc3RhdGUgKnM7CisJaW50IGNudCwgbGVuID0gMDsKKworCWlmIChsaXN0X2VtcHR5KCZkZXZzKSkKKwkJcmV0dXJuIDA7CisJcyA9IGxpc3RfZW50cnkoZGV2cy5uZXh0LCBzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlLCBkZXZzKTsKKworCS8qIHByaW50IG91dCBoZWFkZXIgKi8KKwlsZW4gKz0gc3ByaW50ZihidWYgKyBsZW4sICJcblx0XHRWcmM1NDc3IEF1ZGlvIERlYnVnXG5cbiIpOworCisJLy8gcHJpbnQgb3V0IGRpZ2l0YWwgY29udHJvbGxlciBzdGF0ZQorCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJORUMgVnJjNTQ3NyBBdWRpbyBDb250cm9sbGVyIHJlZ2lzdGVyc1xuIik7CisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJZm9yIChjbnQ9MDsgdnJjNTQ3N19hYzk3X3JlZ3NbY250XS5yZWduYW1lICE9IE5VTEw7IGNudCsrKSB7CisJCWxlbis9IHNwcmludGYgKGJ1ZiArIGxlbiwgIiUtMjBzID0gJTA4eFxuIiwKKwkJCSAgICAgICB2cmM1NDc3X2FjOTdfcmVnc1tjbnRdLnJlZ25hbWUsCisJCQkgICAgICAgaW5sKHMtPmlvICsgdnJjNTQ3N19hYzk3X3JlZ3NbY250XS5yZWdhZGRyKSk7CisJfQorICAgCisJLyogcHJpbnQgb3V0IGRyaXZlciBzdGF0ZSAqLworCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJORUMgVnJjNTQ3NyBBdWRpbyBkcml2ZXIgc3RhdGVzXG4iKTsKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZGFjQ2hhbm5lbHMgID0gJWRcbiIsIHMtPmRhY0NoYW5uZWxzKTsKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiYWRjQ2hhbm5lbHMgID0gJWRcbiIsIHMtPmFkY0NoYW5uZWxzKTsKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZGFjUmF0ZSAgPSAlZFxuIiwgcy0+ZGFjUmF0ZSk7CisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImFkY1JhdGUgID0gJWRcbiIsIHMtPmFkY1JhdGUpOworCisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9kYWMgaXMgJXMgcmVhZHlcbiIsICAKKwkgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5yZWFkeT8gIiIgOiAibm90Iik7CisgICAgICAgIGlmIChzLT5kbWFfZGFjLnJlYWR5KSB7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfZGFjIGlzICVzIHN0b3BwZWQuXG4iLCAgCisJICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5zdG9wcGVkPyAiIiA6ICJub3QiKTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9kYWMuZnJhZ1NpemUgPSAleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuZnJhZ1NpemUpOworCQlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZG1hX2RhYy5mcmFnU2hpZnQgPSAleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuZnJhZ1NoaWZ0KTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9kYWMubnVtRnJhZyA9ICV4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5udW1GcmFnKTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9kYWMuZnJhZ1RvdGFsU2l6ZSA9ICV4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5mcmFnVG90YWxTaXplKTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9kYWMubmV4dEluID0gJXhcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLm5leHRJbik7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfZGFjLm5leHRPdXQgPSAleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMubmV4dE91dCk7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfZGFjLmNvdW50ID0gJXhcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmNvdW50KTsKKwl9CisKKwlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZG1hX2FkYyBpcyAlcyByZWFkeVxuIiwgIAorCSAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLnJlYWR5PyAiIiA6ICJub3QiKTsKKyAgICAgICAgaWYgKHMtPmRtYV9hZGMucmVhZHkpIHsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9hZGMgaXMgJXMgc3RvcHBlZC5cbiIsICAKKwkgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLnN0b3BwZWQ/ICIiIDogIm5vdCIpOworCQlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZG1hX2FkYy5mcmFnU2l6ZSA9ICV4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5mcmFnU2l6ZSk7CisJCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICJkbWFfYWRjLmZyYWdTaGlmdCA9ICV4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5mcmFnU2hpZnQpOworCQlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZG1hX2FkYy5udW1GcmFnID0gJXhcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLm51bUZyYWcpOworCQlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZG1hX2FkYy5mcmFnVG90YWxTaXplID0gJXhcbiIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLmZyYWdUb3RhbFNpemUpOworCQlsZW4gKz0gc3ByaW50ZiAoYnVmICsgbGVuLCAiZG1hX2FkYy5uZXh0SW4gPSAleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMubmV4dEluKTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9hZGMubmV4dE91dCA9ICV4XG4iLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5uZXh0T3V0KTsKKwkJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgImRtYV9hZGMuY291bnQgPSAleFxuIiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuY291bnQpOworCX0KKwkgCisJLyogcHJpbnQgb3V0IENPREVDIHN0YXRlICovCisJbGVuICs9IHNwcmludGYgKGJ1ZiArIGxlbiwgIlxuQUM5NyBDT0RFQyByZWdpc3RlcnNcbiIpOworCWxlbiArPSBzcHJpbnRmIChidWYgKyBsZW4sICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlmb3IgKGNudD0wOyBjbnQgPD0gMHg3ZTsgY250ID0gY250ICsyKQorCQlsZW4rPSBzcHJpbnRmIChidWYgKyBsZW4sICJyZWcgJTAyeCA9ICUwNHhcbiIsCisJCQkgICAgICAgY250LCByZGNvZGVjKHMtPmNvZGVjLCBjbnQpKTsKKworCWlmIChmcG9zID49bGVuKXsKKwkJKnN0YXJ0ID0gYnVmOworCQkqZW9mID0xOworCQlyZXR1cm4gMDsKKwl9CisJKnN0YXJ0ID0gYnVmICsgZnBvczsKKwlpZiAoKGxlbiAtPSBmcG9zKSA+IGxlbmd0aCkKKwkJcmV0dXJuIGxlbmd0aDsKKwkqZW9mID0xOworCXJldHVybiBsZW47CisKK30KKyNlbmRpZiAvKiBWUkM1NDc3X0FDOTdfREVCVUcgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIG1heGltdW0gbnVtYmVyIG9mIGRldmljZXM7IG9ubHkgdXNlZCBmb3IgY29tbWFuZCBsaW5lIHBhcmFtcyAqLworI2RlZmluZSBOUl9ERVZJQ0UgNQorCitzdGF0aWMgdW5zaWduZWQgaW50IGRldmluZGV4OworCitNT0RVTEVfQVVUSE9SKCJNb250YSBWaXN0YSBTb2Z0d2FyZSwganN1bkBtdmlzdGEuY29tIG9yIGpzdW5AanVuc3VuLm5ldCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJORUMgVnJjNTQ3NyBhdWRpbyAoQUM5NykgRHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZyYzU0NzdfYWM5N19wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LAorCQkJCQljb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCit7CisJc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSAqczsKKyNpZmRlZiBWUkM1NDc3X0FDOTdfREVCVUcKKwljaGFyIHByb2Nfc3RyWzgwXTsKKyNlbmRpZgorCisJaWYgKHBjaWRldi0+aXJxID09IDApIAorCQlyZXR1cm4gLTE7CisKKwlpZiAoIShzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHZyYzU0NzdfYWM5N19zdGF0ZSksIEdGUF9LRVJORUwpKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJhbGxvYyBvZiBkZXZpY2Ugc3RydWN0IGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KHMsIDAsIHNpemVvZihzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlKSk7CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfYWRjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKKwlpbml0X01VVEVYKCZzLT5vcGVuX3NlbSk7CisJc3Bpbl9sb2NrX2luaXQoJnMtPmxvY2spOworCisJcy0+ZGV2ID0gcGNpZGV2OworCXMtPmlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CisJcy0+aXJxID0gcGNpZGV2LT5pcnE7CisJCisJcy0+Y29kZWMgPSBhYzk3X2FsbG9jX2NvZGVjKCk7CisKKwlzLT5jb2RlYy0+cHJpdmF0ZV9kYXRhID0gczsKKwlzLT5jb2RlYy0+aWQgPSAwOworCXMtPmNvZGVjLT5jb2RlY19yZWFkID0gcmRjb2RlYzsKKwlzLT5jb2RlYy0+Y29kZWNfd3JpdGUgPSB3cmNvZGVjOworCXMtPmNvZGVjLT5jb2RlY193YWl0ID0gd2FpdGNvZGVjOworCisJLyogc2V0dGluZyBzb21lIG90aGVyIGRlZmF1bHQgdmFsdWVzIHN1Y2ggYXMKKwkgKiBhZGNDaGFubmVscywgYWRjUmF0ZSBpcyBkb25lIGluIG9wZW4oKSBzbyB0aGF0CisgICAgICAgICAqIG5vIHBlcnNpc3RlbnQgc3RhdGUgYWNyb3NzIGZpbGUgb3BlbnMuCisJICovCisKKwkvKiB0ZXN0IGlmIGdldCByZXNwb25zZSBmcm9tIGFjOTcsIGlmIG5vdCByZXR1cm4gKi8KKyAgICAgICAgaWYgKGFjOTdfY29kZWNfbm90X3ByZXNlbnQocy0+Y29kZWMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIm5vIGFjOTcgY29kZWNcbiIpOworCQlnb3RvIGVycl9yZWdpb247CisKKyAgICAgICAgfQorCisJLyogdGVzdCBpZiBnZXQgcmVzcG9uc2UgZnJvbSBhYzk3LCBpZiBub3QgcmV0dXJuICovCisgICAgICAgIGlmIChhYzk3X2NvZGVjX25vdF9wcmVzZW50KCYocy0+Y29kZWMpKSkgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJubyBhYzk3IGNvZGVjXG4iKTsKKwkJZ290byBlcnJfcmVnaW9uOworCisgICAgICAgIH0KKworCWlmICghcmVxdWVzdF9yZWdpb24ocy0+aW8sIHBjaV9yZXNvdXJjZV9sZW4ocGNpZGV2LDApLAorCQkJICAgIFZSQzU0NzdfQUM5N19NT0RVTEVfTkFNRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiaW8gcG9ydHMgJSNseC0+JSNseCBpbiB1c2VcbiIsCisJCSAgICAgICBzLT5pbywgcy0+aW8gKyBwY2lfcmVzb3VyY2VfbGVuKHBjaWRldiwwKS0xKTsKKwkJZ290byBlcnJfcmVnaW9uOworCX0KKwlpZiAocmVxdWVzdF9pcnEocy0+aXJxLCB2cmM1NDc3X2FjOTdfaW50ZXJydXB0LCBTQV9JTlRFUlJVUFQsCisJCQlWUkM1NDc3X0FDOTdfTU9EVUxFX05BTUUsIHMpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggImlycSAldSBpbiB1c2VcbiIsIHMtPmlycSk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAiSU8gYXQgJSNseCwgSVJRICVkXG4iLCBzLT5pbywgcy0+aXJxKTsKKworCS8qIHJlZ2lzdGVyIGRldmljZXMgKi8KKwlpZiAoKHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmdnJjNTQ3N19hYzk3X2F1ZGlvX2ZvcHMsIC0xKSkgPCAwKQorCQlnb3RvIGVycl9kZXYxOworCWlmICgocy0+Y29kZWMtPmRldl9taXhlciA9CisJICAgICByZWdpc3Rlcl9zb3VuZF9taXhlcigmdnJjNTQ3N19hYzk3X21peGVyX2ZvcHMsIC0xKSkgPCAwKQorCQlnb3RvIGVycl9kZXYyOworCisjaWZkZWYgVlJDNTQ3N19BQzk3X0RFQlVHCisJLyogaW5pdGlhbGl6ZSB0aGUgZGVidWcgcHJvYyBkZXZpY2UgKi8KKwlzLT5wcyA9IGNyZWF0ZV9wcm9jX3JlYWRfZW50cnkoVlJDNTQ3N19BQzk3X01PRFVMRV9OQU1FLCAwLCBOVUxMLAorCQkJCSAgICAgICBwcm9jX3ZyYzU0NzdfYWM5N19kdW1wLCBOVUxMKTsKKyNlbmRpZiAvKiBWUkM1NDc3X0FDOTdfREVCVUcgKi8KKwkKKwkvKiBlbmFibGUgcGNpIGlvIGFuZCBidXMgbWFzdGVyaW5nICovCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpCisJCWdvdG8gZXJyX2RldjM7CisJcGNpX3NldF9tYXN0ZXIocGNpZGV2KTsKKworCS8qIGNvbGQgcmVzZXQgdGhlIEFDOTcgKi8KKwlvdXRsKFZSQzU0NzdfQUNMSU5LX0NUUkxfUlNUX09OIHwgVlJDNTQ3N19BQ0xJTktfQ1RSTF9SU1RfVElNRSwKKwkgICAgIHMtPmlvICsgVlJDNTQ3N19BQ0xJTktfQ1RSTCk7CisJd2hpbGUgKGlubChzLT5pbyArIFZSQzU0NzdfQUNMSU5LX0NUUkwpICYgVlJDNTQ3N19BQ0xJTktfQ1RSTF9SU1RfT04pOworCisJLyogY29kZWMgaW5pdCAqLworCWlmICghYWM5N19wcm9iZV9jb2RlYyhzLT5jb2RlYykpCisJCWdvdG8gZXJyX2RldjM7CisKKyNpZmRlZiBWUkM1NDc3X0FDOTdfREVCVUcKKwlzcHJpbnRmKHByb2Nfc3RyLCAiZHJpdmVyLyVzLyVkL2FjOTciLCAKKwkJVlJDNTQ3N19BQzk3X01PRFVMRV9OQU1FLCBzLT5jb2RlYy0+aWQpOworCXMtPmFjOTdfcHMgPSBjcmVhdGVfcHJvY19yZWFkX2VudHJ5IChwcm9jX3N0ciwgMCwgTlVMTCwKKwkJCQkJICAgICBhYzk3X3JlYWRfcHJvYywgcy0+Y29kZWMpOworCS8qIFRPRE8gOiB3aHkgdGhpcyBwcm9jIGZpbGUgZG9lcyBub3Qgc2hvdyB1cD8gKi8KKyNlbmRpZgorCisJLyogVHJ5IHRvIGVuYWJsZSB2YXJpYWJsZSByYXRlIGF1ZGlvIG1vZGUuICovCisJd3Jjb2RlYyhzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMsCisJCXJkY29kZWMocy0+Y29kZWMsIEFDOTdfRVhURU5ERURfU1RBVFVTKSB8IEFDOTdfRVhUU1RBVF9WUkEpOworCS8qIERpZCB3ZSBlbmFibGUgaXQ/ICovCisJaWYocmRjb2RlYyhzLT5jb2RlYywgQUM5N19FWFRFTkRFRF9TVEFUVVMpICYgQUM5N19FWFRTVEFUX1ZSQSkKKwkJcy0+ZXh0ZW5kZWRfc3RhdHVzIHw9IEFDOTdfRVhUU1RBVF9WUkE7CisJZWxzZSB7CisJCXMtPmRhY1JhdGUgPSA0ODAwMDsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIlZSQSBtb2RlIG5vdCBlbmFibGVkOyByYXRlIGZpeGVkIGF0ICVkLiIsCisJCQlzLT5kYWNSYXRlKTsKKwl9CisKKyAgICAgICAgLyogbGV0IHVzIGdldCB0aGUgZGVmYXVsdCB2b2x1bW5lIGxvdWRlciAqLworICAgICAgICB3cmNvZGVjKHMtPmNvZGVjLCAweDIsIDB4MTAxMCk7CS8qIG1hc3RlciB2b2x1bWUsIG1pZGRsZSAqLworICAgICAgICB3cmNvZGVjKHMtPmNvZGVjLCAweGMsIDB4MTApOwkJLyogcGhvbmUgdm9sdW1lLCBtaWRkbGUgKi8KKyAgICAgICAgLy8gd3Jjb2RlYyhzLT5jb2RlYywgMHhlLCAweDEwKTsJCS8qIG1pc2Mgdm9sdW1lLCBtaWRkbGUgKi8KKwl3cmNvZGVjKHMtPmNvZGVjLCAweDEwLCAweDgwMDApOwkvKiBsaW5lLWluIDIgbGluZS1vdXQgZGlzYWJsZSAqLworICAgICAgICB3cmNvZGVjKHMtPmNvZGVjLCAweDE4LCAweDA3MDcpOwkvKiBQQ00gb3V0IChsaW5lIG91dCkgbWlkZGxlICovCisKKworCS8qIGJ5IGRlZmF1bHQgd2Ugc2VsZWN0IGxpbmUgaW4gdGhlIGlucHV0ICovCisJd3Jjb2RlYyhzLT5jb2RlYywgMHgxYSwgMHgwNDA0KTsKKwl3cmNvZGVjKHMtPmNvZGVjLCAweDFjLCAweDBmMGYpOworCXdyY29kZWMocy0+Y29kZWMsIDB4MWUsIDB4MDcpOworCisJLyogZW5hYmxlIHRoZSBtYXN0ZXIgaW50ZXJydXB0IGJ1dCBkaXNhYmxlIGFsbCBvdGhlcnMgKi8KKwlvdXRsKFZSQzU0NzdfSU5UX01BU0tfTk1BU0ssIHMtPmlvICsgVlJDNTQ3N19JTlRfTUFTSyk7CisKKwkvKiBzdG9yZSBpdCBpbiB0aGUgZHJpdmVyIGZpZWxkICovCisJcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgcyk7CisJcGNpZGV2LT5kbWFfbWFzayA9IDB4ZmZmZmZmZmY7CisJLyogcHV0IGl0IGludG8gZHJpdmVyIGxpc3QgKi8KKwlsaXN0X2FkZF90YWlsKCZzLT5kZXZzLCAmZGV2cyk7CisJLyogaW5jcmVtZW50IGRldmluZGV4ICovCisJaWYgKGRldmluZGV4IDwgTlJfREVWSUNFLTEpCisJCWRldmluZGV4Kys7CisJcmV0dXJuIDA7CisKKyBlcnJfZGV2MzoKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLT5kZXZfbWl4ZXIpOworIGVycl9kZXYyOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisgZXJyX2RldjE6CisJcHJpbnRrKEtFUk5fRVJSIFBGWCAiY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworIGVycl9pcnE6CisJcmVsZWFzZV9yZWdpb24ocy0+aW8sIHBjaV9yZXNvdXJjZV9sZW4ocGNpZGV2LDApKTsKKyBlcnJfcmVnaW9uOgorIAlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOworCWtmcmVlKHMpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHZyYzU0NzdfYWM5N19yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3QgdnJjNTQ3N19hYzk3X3N0YXRlICpzID0gcGNpX2dldF9kcnZkYXRhKGRldik7CisKKwlpZiAoIXMpCisJCXJldHVybjsKKwlsaXN0X2RlbCgmcy0+ZGV2cyk7CisKKyNpZmRlZiBWUkM1NDc3X0FDOTdfREVCVUcKKwlpZiAocy0+cHMpCisJCXJlbW92ZV9wcm9jX2VudHJ5KFZSQzU0NzdfQUM5N19NT0RVTEVfTkFNRSwgTlVMTCk7CisjZW5kaWYgLyogVlJDNTQ3N19BQzk3X0RFQlVHICovCisKKwlzeW5jaHJvbml6ZV9pcnEoKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworCXJlbGVhc2VfcmVnaW9uKHMtPmlvLCBwY2lfcmVzb3VyY2VfbGVuKGRldiwwKSk7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmNvZGVjLT5kZXZfbWl4ZXIpOworCWFjOTdfcmVsZWFzZV9jb2RlYyhzLT5jb2RlYyk7CisJa2ZyZWUocyk7CisJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Cit9CisKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGlkX3RhYmxlW10gPSB7CisgICAgeyBQQ0lfVkVORE9SX0lEX05FQywgUENJX0RFVklDRV9JRF9ORUNfVlJDNTQ3N19BQzk3LCAKKyAgICAgIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAgfSwKKyAgICB7IDAsIH0KK307CisKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBpZF90YWJsZSk7CisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2cmM1NDc3X2FjOTdfZHJpdmVyID0geworCS5uYW1lCQk9IFZSQzU0NzdfQUM5N19NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSBpZF90YWJsZSwKKwkucHJvYmUJCT0gdnJjNTQ3N19hYzk3X3Byb2JlLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodnJjNTQ3N19hYzk3X3JlbW92ZSkKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdnJjNTQ3N19hYzk3KHZvaWQpCit7CisJcHJpbnRrKCJWcmM1NDc3IEFDOTcgZHJpdmVyOiB2ZXJzaW9uIHYwLjIgdGltZSAiIF9fVElNRV9fICIgIiBfX0RBVEVfXyAiIGJ5IEp1biBTdW5cbiIpOworCXJldHVybiBwY2lfbW9kdWxlX2luaXQoJnZyYzU0NzdfYWM5N19kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF92cmM1NDc3X2FjOTcodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIFBGWCAidW5sb2FkaW5nXG4iKTsKKwlwY2lfdW5yZWdpc3Rlcl9kcml2ZXIoJnZyYzU0NzdfYWM5N19kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X3ZyYzU0NzdfYWM5Nyk7Cittb2R1bGVfZXhpdChjbGVhbnVwX3ZyYzU0NzdfYWM5Nyk7CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ubTI1Ni5oIGIvc291bmQvb3NzL25tMjU2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFlN2Q5OQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9ubTI1Ni5oCkBAIC0wLDAgKzEsMjk1IEBACisjaWZuZGVmIF9OTTI1Nl9IXworI2RlZmluZSBfTk0yNTZfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlICJhYzk3LmgiCisKKy8qIFRoZSByZXZpc2lvbnMgdGhhdCB3ZSBjdXJyZW50bHkgaGFuZGxlLiAgKi8KK2VudW0gbm0yNTZyZXYgeworICAgIFJFVl9OTTI1NkFWLCBSRVZfTk0yNTZaWAorfTsKKworLyogUGVyLWNhcmQgc3RydWN0dXJlLiAqLworc3RydWN0IG5tMjU2X2luZm8gCit7CisgICAgLyogTWFnaWMgbnVtYmVyIHVzZWQgdG8gdmVyaWZ5IHRoYXQgdGhpcyBzdHJ1Y3QgaXMgdmFsaWQuICovCisjZGVmaW5lIE5NX01BR0lDX1NJRyAweDU1YWEwMGZmCisgICAgaW50IG1hZ3NpZzsKKworICAgIC8qIFJldmlzaW9uIG51bWJlciAqLworICAgIGVudW0gbm0yNTZyZXYgcmV2OworCisgICAgc3RydWN0IGFjOTdfaHdpbnQgbWRldjsKKworICAgIC8qIE91ciBhdWRpbyBkZXZpY2UgbnVtYmVycy4gKi8KKyAgICBpbnQgZGV2WzJdOworCisgICAgLyogVGhlICMgb2YgdGltZXMgZWFjaCBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkLiAoU2hvdWxkIG9ubHkgYmUgCisgICAgICAgMCBvciAxKS4gKi8KKyAgICBpbnQgb3BlbmNudFsyXTsKKworICAgIC8qIFdlIHVzZSB0d28gZGV2aWNlcywgYmVjYXVzZSB3ZSBjYW4gZG8gc2ltdWx0YW5lb3VzIHBsYXkgYW5kIHJlY29yZC4KKyAgICAgICBUaGlzIGtlZXBzIHRyYWNrIG9mIHdoaWNoIGRldmljZSBpcyBiZWluZyB1c2VkIGZvciB3aGF0IHB1cnBvc2U7CisgICAgICAgdGhlc2UgYXJlIHRoZSBhY3R1YWwgZGV2aWNlIG51bWJlcnMuICovCisgICAgaW50IGRldl9mb3JfcGxheTsKKyAgICBpbnQgZGV2X2Zvcl9yZWNvcmQ7CisKKwlzcGlubG9ja190IGxvY2s7CisJCisgICAgLyogVGhlIG1peGVyIGRldmljZS4gKi8KKyAgICBpbnQgbWl4ZXJfb3NzX2RldjsKKworICAgIC8qIAorICAgICAqIENhbiBvbmx5IGJlIG9wZW5lZCBvbmNlIGZvciBlYWNoIG9wZXJhdGlvbi4gIFRoZXNlIGFyZW4ndCBzZXQKKyAgICAgKiB1bnRpbCBhbiBhY3R1YWwgSS9PIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQ7IHRoaXMgYWxsb3dzIG9uZQorICAgICAqIGRldmljZSB0byBiZSBvcGVuIGZvciByZWFkL3dyaXRlIHdpdGhvdXQgaW5oaWJpdGluZyBJL08gdG8KKyAgICAgKiB0aGUgb3RoZXIgZGV2aWNlLgorICAgICAqLworICAgIGludCBpc19vcGVuX3BsYXk7CisgICAgaW50IGlzX29wZW5fcmVjb3JkOworCisgICAgLyogTm9uLXplcm8gaWYgd2UncmUgY3VycmVudGx5IHBsYXlpbmcgYSBzYW1wbGUuICovCisgICAgaW50IHBsYXlpbmc7CisgICAgLyogRGl0dG8gZm9yIHJlY29yZGluZyBhIHNhbXBsZS4gKi8KKyAgICBpbnQgcmVjb3JkaW5nOworCisgICAgLyogVGhlIHR3byBtZW1vcnkgcG9ydHMuICAqLworICAgIHN0cnVjdCBubTI1Nl9wb3J0cyB7CisJLyogUGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcG9ydC4gKi8KKwl1MzIgcGh5c2FkZHI7CisJLyogT3VyIG1hcHBlZC1pbiBwb2ludGVyLiAqLworCWNoYXIgX19pb21lbSAqcHRyOworCS8qIFBUUidzIG9mZnNldCB3aXRoaW4gdGhlIHBoeXNpY2FsIHBvcnQuICAqLworCXUzMiBzdGFydF9vZmZzZXQ7CisJLyogQW5kIHRoZSBvZmZzZXQgb2YgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAgKi8KKwl1MzIgZW5kX29mZnNldDsKKyAgICB9IHBvcnRbMl07CisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBvZmZzZXRzIHdpdGhpbiBtZW1vcnkgcG9ydCAxLiAqLworICAgIHUzMiBjb2VmZkJ1ZjsKKyAgICB1MzIgYWxsQ29lZmZCdWY7CisKKyAgICAvKiBSZWNvcmQgYW5kIHBsYXliYWNrIGJ1ZmZlcnMuICovCisgICAgdTMyIGFidWYxLCBhYnVmMjsKKworICAgIC8qIE9mZnNldCBvZiB0aGUgQUM5NyBtaXhlciBpbiBtZW1vcnkgcG9ydCAyLiAqLworICAgIHUzMiBtaXhlcjsKKworICAgIC8qIE9mZnNldCBvZiB0aGUgbWl4ZXIgc3RhdHVzIHJlZ2lzdGVyIGluIG1lbW9yeSBwb3J0IDIuICAqLworICAgIHUzMiBtaXhlcl9zdGF0dXNfb2Zmc2V0OworCisgICAgLyogTm9uLXplcm8gaWYgd2UgaGF2ZSB3cml0dGVuIGluaXRpYWwgdmFsdWVzIHRvIHRoZSBtaXhlci4gKi8KKyAgICB1OCBtaXhlcl92YWx1ZXNfaW5pdDsKKworICAgIC8qIAorICAgICAqIFN0YXR1cyBtYXNrIGJpdDsgKCptaXhlcl9zdGF0dXNfbG9jICYgbWl4ZXJfc3RhdHVzX21hc2spID09IDAgbWVhbnMKKyAgICAgKiBpdCdzIHJlYWR5LiAgCisgICAgICovCisgICAgdTE2IG1peGVyX3N0YXR1c19tYXNrOworCisgICAgLyogVGhlIHNpemVzIG9mIHRoZSBwbGF5YmFjayBhbmQgcmVjb3JkIHJpbmcgYnVmZmVycy4gKi8KKyAgICB1MzIgcGxheWJhY2tCdWZmZXJTaXplOworICAgIHUzMiByZWNvcmRCdWZmZXJTaXplOworCisgICAgLyogQXJlIHRoZSBjb2VmZmljaWVudCB2YWx1ZXMgaW4gdGhlIG1lbW9yeSBjYWNoZSBjdXJyZW50PyAqLworICAgIHU4IGNvZWZmc0N1cnJlbnQ7CisKKyAgICAvKiBGb3Igd3JpdGVzLCB0aGUgYW1vdW50IHdlIGxhc3Qgd3JvdGUuICovCisgICAgdTMyIHJlcXVlc3RlZF9hbXQ7CisgICAgLyogVGhlIHN0YXJ0IG9mIHRoZSBibG9jayBjdXJyZW50bHkgcGxheWluZy4gKi8KKyAgICB1MzIgY3VyUGxheVBvczsKKworICAgIC8qIFRoZSBhbW91bnQgb2YgZGF0YSB3ZSB3ZXJlIHJlcXVlc3RlZCB0byByZWNvcmQuICovCisgICAgdTMyIHJlcXVlc3RlZFJlY0FtdDsKKyAgICAvKiBUaGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50bHktcmVjb3JkaW5nIGJsb2NrLiAqLworICAgIHUzMiBjdXJSZWNQb3M7CisgICAgLyogVGhlIGRlc3RpbmF0aW9uIGJ1ZmZlci4gKi8KKyAgICBjaGFyICpyZWNCdWY7CisKKyAgICAvKiBPdXIgSVJRIG51bWJlci4gKi8KKyAgICBpbnQgaXJxOworCisgICAgLyogQSBmbGFnIGluZGljYXRpbmcgaG93IG1hbnkgdGltZXMgd2UndmUgZ3JhYmJlZCB0aGUgSVJRLiAqLworICAgIGludCBoYXNfaXJxOworCisgICAgLyogVGhlIGNhcmQgaW50ZXJydXB0IHNlcnZpY2Ugcm91dGluZS4gKi8KKyAgICBpcnFyZXR1cm5fdCAoKmludHJvdXRpbmUpIChpbnQsIHZvaWQgKiwgc3RydWN0IHB0X3JlZ3MgKik7CisKKyAgICAvKiBDdXJyZW50IGF1ZGlvIGNvbmZpZywgY2FjaGVkLiAqLworICAgIHN0cnVjdCBzaW5mbyB7CisJdTMyIHNhbXBsZXJhdGU7CisJdTggYml0czsKKwl1OCBzdGVyZW87CisgICAgfSBzaW5mb1syXTsgLyogZ29lcyB3aXRoIGVhY2ggZGV2aWNlICovCisKKyAgICAvKiBUaGUgY2FyZHMgYXJlIHN0b3JlZCBpbiBhIGNoYWluOyAgdGhpcyBpcyB0aGUgbmV4dCBjYXJkLiAqLworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpuZXh0X2NhcmQ7Cit9OworCisvKiBEZWJ1ZyBmbGFnLS1iaWdnZXIgbnVtYmVycyBtZWFuIG1vcmUgb3V0cHV0LiAqLworZXh0ZXJuIGludCBubTI1Nl9kZWJ1ZzsKKworLyogVGhlIEJJT1Mgc2lnbmF0dXJlLiAqLworI2RlZmluZSBOTV9TSUdOQVRVUkUgMHg0ZTRkMDAwMAorLyogU2lnbmF0dXJlIG1hc2suICovCisjZGVmaW5lIE5NX1NJR19NQVNLIDB4ZmZmZjAwMDAKKworLyogU2l6ZSBvZiB0aGUgc2Vjb25kIG1lbW9yeSBhcmVhLiAqLworI2RlZmluZSBOTV9QT1JUMl9TSVpFIDQwOTYKKworLyogVGhlIGJhc2Ugb2Zmc2V0IG9mIHRoZSBtaXhlciBpbiB0aGUgc2Vjb25kIG1lbW9yeSBhcmVhLiAqLworI2RlZmluZSBOTV9NSVhFUl9PRkZTRVQgMHg2MDAKKworLyogVGhlIG1heGltdW0gc2l6ZSBvZiBhIGNvZWZmaWNpZW50IGVudHJ5LiAqLworI2RlZmluZSBOTV9NQVhfQ09FRkZJQ0lFTlQgMHg1MDAwCisKKy8qIFRoZSBpbnRlcnJ1cHQgcmVnaXN0ZXIuICovCisjZGVmaW5lIE5NX0lOVF9SRUcgMHhhMDQKKy8qIEFuZCBpdHMgYml0cy4gKi8KKyNkZWZpbmUgTk1fUExBWUJBQ0tfSU5UIDB4NDAKKyNkZWZpbmUgTk1fUkVDT1JEX0lOVCAweDEwMAorI2RlZmluZSBOTV9NSVNDX0lOVF8xIDB4NDAwMAorI2RlZmluZSBOTV9NSVNDX0lOVF8yIDB4MQorI2RlZmluZSBOTV9BQ0tfSU5UKENBUkQsIFgpIG5tMjU2X3dyaXRlUG9ydDE2KChDQVJEKSwgMiwgTk1fSU5UX1JFRywgKFgpIDw8IDEpCisKKy8qIFRoZSBBVidzICJtaXhlciByZWFkeSIgc3RhdHVzIGJpdCBhbmQgbG9jYXRpb24uICovCisjZGVmaW5lIE5NX01JWEVSX1NUQVRVU19PRkZTRVQgMHhhMDQKKyNkZWZpbmUgTk1fTUlYRVJfUkVBRFlfTUFTSyAweDA4MDAKKyNkZWZpbmUgTk1fTUlYRVJfUFJFU0VOQ0UgMHhhMDYKKyNkZWZpbmUgTk1fUFJFU0VOQ0VfTUFTSyAweDAwNTAKKyNkZWZpbmUgTk1fUFJFU0VOQ0VfVkFMVUUgMHgwMDQwCisKKy8qCisgKiBGb3IgdGhlIFpYLiAgSXQgdXNlcyB0aGUgc2FtZSBpbnRlcnJ1cHQgcmVnaXN0ZXIsIGJ1dCBpdCBob2xkcyAzMgorICogYml0cyBpbnN0ZWFkIG9mIDE2LgorICovCisjZGVmaW5lIE5NMl9QTEFZQkFDS19JTlQgMHgxMDAwMAorI2RlZmluZSBOTTJfUkVDT1JEX0lOVCAweDgwMDAwCisjZGVmaW5lIE5NMl9NSVNDX0lOVF8xIDB4OAorI2RlZmluZSBOTTJfTUlTQ19JTlRfMiAweDIKKyNkZWZpbmUgTk0yX0FDS19JTlQoQ0FSRCwgWCkgbm0yNTZfd3JpdGVQb3J0MzIoKENBUkQpLCAyLCBOTV9JTlRfUkVHLCAoWCkpCisKKy8qIFRoZSBaWCdzICJtaXhlciByZWFkeSIgc3RhdHVzIGJpdCBhbmQgbG9jYXRpb24uICovCisjZGVmaW5lIE5NMl9NSVhFUl9TVEFUVVNfT0ZGU0VUIDB4YTA2CisjZGVmaW5lIE5NMl9NSVhFUl9SRUFEWV9NQVNLIDB4MDgwMAorCisvKiBUaGUgcGxheWJhY2sgcmVnaXN0ZXJzIHN0YXJ0IGZyb20gaGVyZS4gKi8KKyNkZWZpbmUgTk1fUExBWUJBQ0tfUkVHX09GRlNFVCAweDAKKy8qIFRoZSByZWNvcmQgcmVnaXN0ZXJzIHN0YXJ0IGZyb20gaGVyZS4gKi8KKyNkZWZpbmUgTk1fUkVDT1JEX1JFR19PRkZTRVQgMHgyMDAKKworLyogVGhlIHJhdGUgcmVnaXN0ZXIgaXMgbG9jYXRlZCAyIGJ5dGVzIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSByZWdpc3RlciBhcmVhLiAqLworI2RlZmluZSBOTV9SQVRFX1JFR19PRkZTRVQgMgorCisvKiBNb25vL3N0ZXJlbyBmbGFnLCBudW1iZXIgb2YgYml0cyBvbiBwbGF5YmFjaywgYW5kIHJhdGUgbWFzay4gKi8KKyNkZWZpbmUgTk1fUkFURV9TVEVSRU8gMQorI2RlZmluZSBOTV9SQVRFX0JJVFNfMTYgMgorI2RlZmluZSBOTV9SQVRFX01BU0sgMHhmMAorCisvKiBQbGF5YmFjayBlbmFibGUgcmVnaXN0ZXIuICovCisjZGVmaW5lIE5NX1BMQVlCQUNLX0VOQUJMRV9SRUcgKE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyAweDEpCisjZGVmaW5lIE5NX1BMQVlCQUNLX0VOQUJMRV9GTEFHIDEKKyNkZWZpbmUgTk1fUExBWUJBQ0tfT05FU0hPVCAyCisjZGVmaW5lIE5NX1BMQVlCQUNLX0ZSRUVSVU4gNAorCisvKiBNdXRlcyB0aGUgYXVkaW8gb3V0cHV0LiAqLworI2RlZmluZSBOTV9BVURJT19NVVRFX1JFRyAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4MTgpCisjZGVmaW5lIE5NX0FVRElPX01VVEVfTEVGVCAweDgwMDAKKyNkZWZpbmUgTk1fQVVESU9fTVVURV9SSUdIVCAweDAwODAKKworLyogUmVjb3JkaW5nIGVuYWJsZSByZWdpc3Rlci4gKi8KKyNkZWZpbmUgTk1fUkVDT1JEX0VOQUJMRV9SRUcgKE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgMCkKKyNkZWZpbmUgTk1fUkVDT1JEX0VOQUJMRV9GTEFHIDEKKyNkZWZpbmUgTk1fUkVDT1JEX0ZSRUVSVU4gMgorCisjZGVmaW5lIE5NX1JCVUZGRVJfU1RBUlQgKE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgMHg0KQorI2RlZmluZSBOTV9SQlVGRkVSX0VORCAgIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDB4MTApCisjZGVmaW5lIE5NX1JCVUZGRVJfV01BUksgKE5NX1JFQ09SRF9SRUdfT0ZGU0VUICsgMHhjKQorI2RlZmluZSBOTV9SQlVGRkVSX0NVUlJQIChOTV9SRUNPUkRfUkVHX09GRlNFVCArIDB4OCkKKworI2RlZmluZSBOTV9QQlVGRkVSX1NUQVJUIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHg0KQorI2RlZmluZSBOTV9QQlVGRkVSX0VORCAgIChOTV9QTEFZQkFDS19SRUdfT0ZGU0VUICsgMHgxNCkKKyNkZWZpbmUgTk1fUEJVRkZFUl9XTUFSSyAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4YykKKyNkZWZpbmUgTk1fUEJVRkZFUl9DVVJSUCAoTk1fUExBWUJBQ0tfUkVHX09GRlNFVCArIDB4OCkKKworLyogQSBmZXcgdHJpdmlhbCByb3V0aW5lcyB0byBtYWtlIGl0IGVhc2llciB0byB3b3JrIHdpdGggdGhlIHJlZ2lzdGVycworICAgb24gdGhlIGNoaXAuICovCisKKy8qIFRoaXMgaXMgYSBjb21tb24gY29kZSBwb3J0aW9uIHVzZWQgdG8gZml4IHVwIHRoZSBwb3J0IG9mZnNldHMuICovCisjZGVmaW5lIE5NX0ZJWF9QT1JUIFwKKyAgaWYgKHBvcnQgPCAxIHx8IHBvcnQgPiAyIHx8IGNhcmQgPT0gTlVMTCkgXAorICAgICAgcmV0dXJuIC0xOyBcCitcCisgICAgaWYgKG9mZnNldCA8IGNhcmQtPnBvcnRbcG9ydCAtIDFdLnN0YXJ0X29mZnNldCBcCisJfHwgb2Zmc2V0ID49IGNhcmQtPnBvcnRbcG9ydCAtIDFdLmVuZF9vZmZzZXQpIHsgXAorCXByaW50ayAoS0VSTl9FUlIgIkJhZCBhY2Nlc3M6IHBvcnQgJWQsIG9mZnNldCAweCV4XG4iLCBwb3J0LCBvZmZzZXQpOyBcCisJcmV0dXJuIC0xOyBcCisgICAgfSBcCisgICAgb2Zmc2V0IC09IGNhcmQtPnBvcnRbcG9ydCAtIDFdLnN0YXJ0X29mZnNldDsKKworI2RlZmluZSBERUZ3cml0ZVBvcnRYKFgsIGZ1bmMpIFwKK3N0YXRpYyBpbmxpbmUgaW50IG5tMjU2X3dyaXRlUG9ydCMjWCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsXAorCQkJCSAgICAgIGludCBwb3J0LCBpbnQgb2Zmc2V0LCBpbnQgdmFsdWUpXAore1wKKyAgICB1IyNYIF9faW9tZW0gKmFkZHI7XAorXAorICAgIGlmIChubTI1Nl9kZWJ1ZyA+IDEpXAorICAgICAgICBwcmludGsgKEtFUk5fREVCVUcgIldyaXRpbmcgMHgleCB0byAlZDoweCV4XG4iLCB2YWx1ZSwgcG9ydCwgb2Zmc2V0KTtcCitcCisgICAgTk1fRklYX1BPUlQ7XAorXAorICAgIGFkZHIgPSAodSMjWCBfX2lvbWVtICopKGNhcmQtPnBvcnRbcG9ydCAtIDFdLnB0ciArIG9mZnNldCk7XAorICAgIGZ1bmMgKHZhbHVlLCBhZGRyKTtcCisgICAgcmV0dXJuIDA7XAorfQorCitERUZ3cml0ZVBvcnRYICg4LCB3cml0ZWIpCitERUZ3cml0ZVBvcnRYICgxNiwgd3JpdGV3KQorREVGd3JpdGVQb3J0WCAoMzIsIHdyaXRlbCkKKworI2RlZmluZSBERUZyZWFkUG9ydFgoWCwgZnVuYykgXAorc3RhdGljIGlubGluZSB1IyNYIG5tMjU2X3JlYWRQb3J0IyNYIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCxcCisJCQkJCWludCBwb3J0LCBpbnQgb2Zmc2V0KVwKK3tcCisgICAgdSMjWCBfX2lvbWVtICphZGRyO1wKK1wKKyAgICBOTV9GSVhfUE9SVFwKK1wKKyAgICBhZGRyID0gKHUjI1ggX19pb21lbSAqKShjYXJkLT5wb3J0W3BvcnQgLSAxXS5wdHIgKyBvZmZzZXQpO1wKKyAgICByZXR1cm4gZnVuYyhhZGRyKTtcCit9CisKK0RFRnJlYWRQb3J0WCAoOCwgcmVhZGIpCitERUZyZWFkUG9ydFggKDE2LCByZWFkdykKK0RFRnJlYWRQb3J0WCAoMzIsIHJlYWRsKQorCitzdGF0aWMgaW5saW5lIGludAorbm0yNTZfd3JpdGVCdWZmZXI4IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgdTggKnNyYywgaW50IHBvcnQsIGludCBvZmZzZXQsCisJCSAgICAgIGludCBhbXQpCit7CisgICAgTk1fRklYX1BPUlQ7CisgICAgbWVtY3B5X3RvaW8gKGNhcmQtPnBvcnRbcG9ydCAtIDFdLnB0ciArIG9mZnNldCwgc3JjLCBhbXQpOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludAorbm0yNTZfcmVhZEJ1ZmZlcjggKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCB1OCAqZHN0LCBpbnQgcG9ydCwgaW50IG9mZnNldCwKKwkJICAgICBpbnQgYW10KQoreworICAgIE5NX0ZJWF9QT1JUOworICAgIG1lbWNweV9mcm9taW8gKGRzdCwgY2FyZC0+cG9ydFtwb3J0IC0gMV0ucHRyICsgb2Zmc2V0LCBhbXQpOworICAgIHJldHVybiAwOworfQorCisvKiBSZXR1cm5zIGEgbm9uLXplcm8gdmFsdWUgaWYgd2Ugc2hvdWxkIHVzZSB0aGUgY29lZmZpY2llbnQgY2FjaGUuICovCitleHRlcm4gaW50IG5tMjU2X2NhY2hlZENvZWZmaWNpZW50cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpOworCisjZW5kaWYKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiBjLWJhc2ljLW9mZnNldDogNAorICogRW5kOgorICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYyBiL3NvdW5kL29zcy9ubTI1Nl9hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTY2ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvbm0yNTZfYXVkaW8uYwpAQCAtMCwwICsxLDE3MDcgQEAKKy8qIAorICogQXVkaW8gZHJpdmVyIGZvciB0aGUgTmVvTWFnaWMgMjU2QVYgYW5kIDI1NlpYIGNoaXBzZXRzIGluIG5hdGl2ZQorICogbW9kZSwgd2l0aCBBQzk3IG1peGVyIHN1cHBvcnQuCisgKgorICogT3ZlcmFsbCBkZXNpZ24gYW5kIHBhcnRzIG9mIHRoaXMgY29kZSBzdG9sZW4gZnJvbSB2aWRjXyouYyBhbmQKKyAqIHNrZWxldG9uLmMuCisgKgorICogWWVhaCwgdGhlcmUgYXJlIGEgbG90IG9mIG1hZ2ljIGNvbnN0YW50cyBpbiBoZXJlLiAgWW91IHRlbGwgTUUgd2hhdAorICogdGhleSBhcmUuICBJIGp1c3QgZ2V0IHRoaXMgc3R1ZmYgcHN5Y2hpY2FsbHksIHJlbWVtYmVyPyAKKyAqCisgKiBUaGlzIGRyaXZlciB3YXMgd3JpdHRlbiBieSBzb21lb25lIHdobyB3aXNoZXMgdG8gcmVtYWluIGFub255bW91cy4gCisgKiBJdCBpcyBpbiB0aGUgcHVibGljIGRvbWFpbiwgc28gc2hhcmUgYW5kIGVuam95LiAgVHJ5IHRvIG1ha2UgYSBwcm9maXQKKyAqIG9mZiBvZiBpdDsgZ28gb24sIEkgZGFyZSB5b3UuICAKKyAqCisgKiBDaGFuZ2VzOgorICogMTEtMTAtMjAwMAlCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxia3pAbGludXgtaWRlLm9yZz4KKyAqCQlBZGRlZCBzb21lIF9faW5pdAorICogMTktMDQtMjAwMQlNYXJjdXMgTWVpc3NuZXIgPG1tQGNhbGRlcmEuZGU+CisgKgkJUG9ydGVkIHRvIDIuNCBQQ0kgQVBJLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAibm0yNTYuaCIKKyNpbmNsdWRlICJubTI1Nl9jb2VmZi5oIgorCitpbnQgbm0yNTZfZGVidWc7CitzdGF0aWMgaW50IGZvcmNlX2xvYWQ7CisKKy8qIAorICogVGhlIHNpemUgb2YgdGhlIHBsYXliYWNrIHJlc2VydmUuICBXaGVuIHRoZSBwbGF5YmFjayBidWZmZXIgaGFzIGxlc3MKKyAqIHRoYW4gTk0yNTZfUExBWV9XTUFSS19TSVpFIGJ5dGVzIHRvIG91dHB1dCwgd2UgcmVxdWVzdCBhIG5ldworICogYnVmZmVyLgorICovCisjZGVmaW5lIE5NMjU2X1BMQVlfV01BUktfU0laRSA1MTIKKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgbm0yNTZfYXVkaW9fZHJpdmVyOworCitzdGF0aWMgaW50IG5tMjU2X2dyYWJJbnRlcnJ1cHQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKTsKK3N0YXRpYyBpbnQgbm0yNTZfcmVsZWFzZUludGVycnVwdCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpOworc3RhdGljIGlycXJldHVybl90IG5tMjU2X2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpOworc3RhdGljIGlycXJldHVybl90IG5tMjU2X2ludGVycnVwdF96eCAoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpOworc3RhdGljIGludCBoYW5kbGVfcG1fZXZlbnQgKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpOworCisvKiBUaGVzZSBiZWxvbmcgaW4gbGludXgvcGNpLmguICovCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZBVl9BVURJTyAweDgwMDUKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlpYX0FVRElPIDB4ODAwNgorI2RlZmluZSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WExfUExVU19BVURJTyAweDgwMTYKKworLyogTGlzdCBvZiBjYXJkcy4gICovCitzdGF0aWMgc3RydWN0IG5tMjU2X2luZm8gKm5tY2FyZF9saXN0OworCisvKiBSZWxlYXNlIHRoZSBtYXBwZWQtaW4gbWVtb3J5IGZvciBDQVJELiAgKi8KK3N0YXRpYyB2b2lkCitubTI1Nl9yZWxlYXNlX3BvcnRzIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKK3sKKyAgICBpbnQgeDsKKworICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKKwlpZiAoY2FyZC0+cG9ydFt4XS5wdHIgIT0gTlVMTCkgeworCSAgICBpb3VubWFwIChjYXJkLT5wb3J0W3hdLnB0cik7CisJICAgIGNhcmQtPnBvcnRbeF0ucHRyID0gTlVMTDsKKwl9CisgICAgfQorfQorCisvKiAKKyAqIE1hcCBpbiB0aGUgbWVtb3J5IHBvcnRzIGZvciBDQVJELCBpZiB0aGV5IGFyZW4ndCBhbHJlYWR5IG1hcHBlZCBpbgorICogYW5kIGhhdmUgYmVlbiBjb25maWd1cmVkLiAgSWYgc3VjY2Vzc2Z1bCwgYSB6ZXJvIHZhbHVlIGlzIHJldHVybmVkOworICogb3RoZXJ3aXNlIGFueSBwcmV2aW91c2x5IG1hcHBlZC1pbiBhcmVhcyBhcmUgcmVsZWFzZWQgYW5kIGEgbm9uLXplcm8KKyAqIHZhbHVlIGlzIHJldHVybmVkLgorICoKKyAqIFRoaXMgaXMgaW52b2tlZCB0d2ljZSwgb25jZSBmb3IgZWFjaCBwb3J0LiAgSWRlYWxseSBpdCB3b3VsZCBvbmx5IGJlCisgKiBjYWxsZWQgb25jZSwgYnV0IHdlIG5vdyBuZWVkIHRvIG1hcCBpbiB0aGUgc2Vjb25kIHBvcnQgaW4gb3JkZXIgdG8KKyAqIGNoZWNrIGhvdyBtdWNoIG1lbW9yeSB0aGUgY2FyZCBoYXMgb24gdGhlIDI1NlpYLgorICovCitzdGF0aWMgaW50CitubTI1Nl9yZW1hcF9wb3J0cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgaW50IHg7CisKKyAgICBmb3IgKHggPSAwOyB4IDwgMjsgeCsrKSB7CisJaWYgKGNhcmQtPnBvcnRbeF0ucHRyID09IE5VTEwgJiYgY2FyZC0+cG9ydFt4XS5lbmRfb2Zmc2V0ID4gMCkgeworCSAgICB1MzIgcGh5c2FkZHIgCisJCT0gY2FyZC0+cG9ydFt4XS5waHlzYWRkciArIGNhcmQtPnBvcnRbeF0uc3RhcnRfb2Zmc2V0OworCSAgICB1MzIgc2l6ZSAKKwkJPSBjYXJkLT5wb3J0W3hdLmVuZF9vZmZzZXQgLSBjYXJkLT5wb3J0W3hdLnN0YXJ0X29mZnNldDsKKworCSAgICBjYXJkLT5wb3J0W3hdLnB0ciA9IGlvcmVtYXBfbm9jYWNoZSAocGh5c2FkZHIsIHNpemUpOworCQkJCQkJICAKKwkgICAgaWYgKGNhcmQtPnBvcnRbeF0ucHRyID09IE5VTEwpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFVuYWJsZSB0byByZW1hcCBwb3J0ICVkXG4iLCB4ICsgMSk7CisJCW5tMjU2X3JlbGVhc2VfcG9ydHMgKGNhcmQpOworCQlyZXR1cm4gLTE7CisJICAgIH0KKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKiBMb2NhdGUgdGhlIGNhcmQgaW4gb3VyIGxpc3QuICovCitzdGF0aWMgc3RydWN0IG5tMjU2X2luZm8gKgorbm0yNTZfZmluZF9jYXJkIChpbnQgZGV2KQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkOworCisgICAgZm9yIChjYXJkID0gbm1jYXJkX2xpc3Q7IGNhcmQgIT0gTlVMTDsgY2FyZCA9IGNhcmQtPm5leHRfY2FyZCkKKwlpZiAoY2FyZC0+ZGV2WzBdID09IGRldiB8fCBjYXJkLT5kZXZbMV0gPT0gZGV2KQorCSAgICByZXR1cm4gY2FyZDsKKworICAgIHJldHVybiBOVUxMOworfQorCisvKgorICogRGl0dG8sIGJ1dCBmaW5kIHRoZSBjYXJkIHN0cnVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBtaXhlciBkZXZpY2UgREVWIAorICogaW5zdGVhZC4gCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm0yNTZfaW5mbyAqCitubTI1Nl9maW5kX2NhcmRfZm9yX21peGVyIChpbnQgZGV2KQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkOworCisgICAgZm9yIChjYXJkID0gbm1jYXJkX2xpc3Q7IGNhcmQgIT0gTlVMTDsgY2FyZCA9IGNhcmQtPm5leHRfY2FyZCkKKwlpZiAoY2FyZC0+bWl4ZXJfb3NzX2RldiA9PSBkZXYpCisJICAgIHJldHVybiBjYXJkOworCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdXNlY2FjaGU7CitzdGF0aWMgaW50IGJ1ZmZlcnRvcDsKKworLyogQ2hlY2sgdG8gc2VlIGlmIHdlJ3JlIHVzaW5nIHRoZSBiYW5rIG9mIGNhY2hlZCBjb2VmZmljaWVudHMuICovCitpbnQKK25tMjU2X2NhY2hlZENvZWZmaWNpZW50cyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgcmV0dXJuIHVzZWNhY2hlOworfQorCisvKiBUaGUgYWN0dWFsIHJhdGVzIHN1cHBvcnRlZCBieSB0aGUgY2FyZC4gKi8KK3N0YXRpYyBpbnQgc2FtcGxlcmF0ZXNbOV0gPSB7CisgICAgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAsIDk5OTk5OTk5Cit9OworCisvKgorICogU2V0IHRoZSBjYXJkIHNhbXBsZXJhdGUsIHdvcmQgc2l6ZSBhbmQgc3RlcmVvIG1vZGUgdG8gY29ycmVzcG9uZCB0bworICogdGhlIHNldHRpbmdzIGluIHRoZSBDQVJEIHN0cnVjdCBmb3IgdGhlIHNwZWNpZmllZCBkZXZpY2UgaW4gREVWLgorICogV2Uga2VlcCB0d28gc2VwYXJhdGUgc2V0cyBvZiBpbmZvcm1hdGlvbiwgb25lIGZvciBlYWNoIGRldmljZTsgdGhlCisgKiBoYXJkd2FyZSBpcyBub3QgYWN0dWFsbHkgY29uZmlndXJlZCB1bnRpbCBhIHJlYWQgb3Igd3JpdGUgaXMKKyAqIGF0dGVtcHRlZC4KKyAqLworCitzdGF0aWMgaW50CitubTI1Nl9zZXRJbmZvIChpbnQgZGV2LCBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKK3sKKyAgICBpbnQgeDsKKyAgICBpbnQgdzsKKyAgICBpbnQgdGFyZ2V0cmF0ZTsKKworICAgIGlmIChjYXJkLT5kZXZbMF0gPT0gZGV2KQorCXcgPSAwOworICAgIGVsc2UgaWYgKGNhcmQtPmRldlsxXSA9PSBkZXYpCisJdyA9IDE7CisgICAgZWxzZQorCXJldHVybiAtRU5PREVWOworCisgICAgdGFyZ2V0cmF0ZSA9IGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGU7CisKKyAgICBpZiAoKGNhcmQtPnNpbmZvW3ddLmJpdHMgIT0gOCAmJiBjYXJkLT5zaW5mb1t3XS5iaXRzICE9IDE2KQorCXx8IHRhcmdldHJhdGUgPCBzYW1wbGVyYXRlc1swXQorCXx8IHRhcmdldHJhdGUgPiBzYW1wbGVyYXRlc1s3XSkKKwlyZXR1cm4gLUVJTlZBTDsKKworICAgIGZvciAoeCA9IDA7IHggPCA4OyB4KyspCisJaWYgKHRhcmdldHJhdGUgPCAoKHNhbXBsZXJhdGVzW3hdICsgc2FtcGxlcmF0ZXNbeCArIDFdKSAvIDIpKQorCSAgICBicmVhazsKKworICAgIGlmICh4IDwgOCkgeworCXU4IHJhdGViaXRzID0gKCh4IDw8IDQpICYgTk1fUkFURV9NQVNLKTsKKwlpZiAoY2FyZC0+c2luZm9bd10uYml0cyA9PSAxNikKKwkgICAgcmF0ZWJpdHMgfD0gTk1fUkFURV9CSVRTXzE2OworCWlmIChjYXJkLT5zaW5mb1t3XS5zdGVyZW8pCisJICAgIHJhdGViaXRzIHw9IE5NX1JBVEVfU1RFUkVPOworCisJY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZSA9IHNhbXBsZXJhdGVzW3hdOworCisKKwlpZiAoY2FyZC0+ZGV2X2Zvcl9wbGF5ID09IGRldiAmJiBjYXJkLT5wbGF5aW5nKSB7CisJICAgIGlmIChubTI1Nl9kZWJ1ZykKKwkJcHJpbnRrIChLRVJOX0RFQlVHICJTZXR0aW5nIHBsYXkgcmF0ZWJpdHMgdG8gMHgleFxuIiwKKwkJCXJhdGViaXRzKTsKKwkgICAgbm0yNTZfbG9hZENvZWZmaWNpZW50IChjYXJkLCAwLCB4KTsKKwkgICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwKKwkJCSAgICAgIE5NX1BMQVlCQUNLX1JFR19PRkZTRVQgKyBOTV9SQVRFX1JFR19PRkZTRVQsCisJCQkgICAgICByYXRlYml0cyk7CisJfQorCisJaWYgKGNhcmQtPmRldl9mb3JfcmVjb3JkID09IGRldiAmJiBjYXJkLT5yZWNvcmRpbmcpIHsKKwkgICAgaWYgKG5tMjU2X2RlYnVnKQorCQlwcmludGsgKEtFUk5fREVCVUcgIlNldHRpbmcgcmVjb3JkIHJhdGViaXRzIHRvIDB4JXhcbiIsCisJCQlyYXRlYml0cyk7CisJICAgIG5tMjU2X2xvYWRDb2VmZmljaWVudCAoY2FyZCwgMSwgeCk7CisJICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsCisJCQkgICAgICBOTV9SRUNPUkRfUkVHX09GRlNFVCArIE5NX1JBVEVfUkVHX09GRlNFVCwKKwkJCSAgICAgIHJhdGViaXRzKTsKKwl9CisJcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogU3RhcnQgdGhlIHBsYXkgcHJvY2VzcyBnb2luZy4gKi8KK3N0YXRpYyB2b2lkCitzdGFydFBsYXkgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIGlmICghIGNhcmQtPnBsYXlpbmcpIHsKKwljYXJkLT5wbGF5aW5nID0gMTsKKwlpZiAobm0yNTZfZ3JhYkludGVycnVwdCAoY2FyZCkgPT0gMCkgeworCSAgICBubTI1Nl9zZXRJbmZvIChjYXJkLT5kZXZfZm9yX3BsYXksIGNhcmQpOworCisJICAgIC8qIEVuYWJsZSBwbGF5YmFjayBlbmdpbmUgYW5kIGludGVycnVwdHMuICovCisJICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1BMQVlCQUNLX0VOQUJMRV9SRUcsCisJCQkgICAgICBOTV9QTEFZQkFDS19FTkFCTEVfRkxBRyB8IE5NX1BMQVlCQUNLX0ZSRUVSVU4pOworCisJICAgIC8qIEVuYWJsZSBib3RoIGNoYW5uZWxzLiAqLworCSAgICBubTI1Nl93cml0ZVBvcnQxNiAoY2FyZCwgMiwgTk1fQVVESU9fTVVURV9SRUcsIDB4MCk7CisJfQorICAgIH0KK30KKworLyogCisgKiBSZXF1ZXN0IG9uZSBjaHVuayBvZiBBTVQgYnl0ZXMgZnJvbSB0aGUgcmVjb3JkaW5nIGRldmljZS4gIFdoZW4gdGhlCisgKiBvcGVyYXRpb24gaXMgY29tcGxldGUsIHRoZSBkYXRhIHdpbGwgYmUgY29waWVkIGludG8gQlVGRkVSIGFuZCB0aGUKKyAqIGZ1bmN0aW9uIERNQWJ1Zl9pbnB1dGludHIgd2lsbCBiZSBpbnZva2VkLgorICovCisKK3N0YXRpYyB2b2lkCitubTI1Nl9zdGFydFJlY29yZGluZyAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGNoYXIgKmJ1ZmZlciwgdTMyIGFtdCkKK3sKKyAgICB1MzIgZW5kcG9zOworICAgIGludCBlbmFibGVFbmdpbmUgPSAwOworICAgIHUzMiByaW5nc2l6ZSA9IGNhcmQtPnJlY29yZEJ1ZmZlclNpemU7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGlmIChhbXQgPiAocmluZ3NpemUgLyAyKSkgeworCS8qCisJICogT2YgY291cnNlIHRoaXMgd29uJ3QgYWN0dWFsbHkgd29yayByaWdodCwgYmVjYXVzZSB0aGUKKwkgKiBjYWxsZXIgaXMgZ29pbmcgdG8gYXNzdW1lIHdlIHdpbGwgZ2l2ZSB3aGF0IHdlIGdvdCBhc2tlZAorCSAqIGZvci4KKwkgKi8KKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogUmVhZCByZXF1ZXN0IHRvbyBsYXJnZTogJWRcbiIsIGFtdCk7CisJYW10ID0gcmluZ3NpemUgLyAyOworICAgIH0KKworICAgIGlmIChhbXQgPCA4KSB7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFJlYWQgcmVxdWVzdCB0b28gc21hbGw7ICVkXG4iLCBhbXQpOworCXJldHVybjsKKyAgICB9CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jayxmbGFncyk7CisgICAgLyoKKyAgICAgKiBJZiB3ZSdyZSBub3QgY3VycmVudGx5IHJlY29yZGluZywgc2V0IHVwIHRoZSBzdGFydCBhbmQgZW5kIHJlZ2lzdGVycworICAgICAqIGZvciB0aGUgcmVjb3JkaW5nIGVuZ2luZS4KKyAgICAgKi8KKyAgICBpZiAoISBjYXJkLT5yZWNvcmRpbmcpIHsKKwljYXJkLT5yZWNvcmRpbmcgPSAxOworCWlmIChubTI1Nl9ncmFiSW50ZXJydXB0IChjYXJkKSA9PSAwKSB7CisJICAgIGNhcmQtPmN1clJlY1BvcyA9IDA7CisJICAgIG5tMjU2X3NldEluZm8gKGNhcmQtPmRldl9mb3JfcmVjb3JkLCBjYXJkKTsKKwkgICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfU1RBUlQsIGNhcmQtPmFidWYyKTsKKwkgICAgbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1JCVUZGRVJfRU5ELAorCQkJCSBjYXJkLT5hYnVmMiArIHJpbmdzaXplKTsKKworCSAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9DVVJSUCwKKwkJCQkgY2FyZC0+YWJ1ZjIgKyBjYXJkLT5jdXJSZWNQb3MpOworCSAgICBlbmFibGVFbmdpbmUgPSAxOworCX0KKwllbHNlIHsKKwkgICAgLyogTm90IHN1cmUgd2hhdCBlbHNlIHRvIGRvIGhlcmUuICAqLworCSAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLGZsYWdzKTsKKwkgICAgcmV0dXJuOworCX0KKyAgICB9CisKKyAgICAvKiAKKyAgICAgKiBJZiB3ZSBoYXBwZW4gdG8gZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIgYSBiaXQgKGR1ZSB0byBhCisgICAgICogZGVsYXllZCBpbnRlcnJ1cHQpIGl0J3MgT0suICBTbyBtaWdodCBhcyB3ZWxsIHNldCB0aGUgd2F0ZXJtYXJrCisgICAgICogcmlnaHQgYXQgdGhlIGVuZCBvZiB0aGUgZGF0YSB3ZSB3YW50LgorICAgICAqLworICAgIGVuZHBvcyA9IGNhcmQtPmFidWYyICsgKChjYXJkLT5jdXJSZWNQb3MgKyBhbXQpICUgcmluZ3NpemUpOworCisgICAgY2FyZC0+cmVjQnVmID0gYnVmZmVyOworICAgIGNhcmQtPnJlcXVlc3RlZFJlY0FtdCA9IGFtdDsKKyAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9XTUFSSywgZW5kcG9zKTsKKyAgICAvKiBFbmFibGUgcmVjb3JkaW5nIGVuZ2luZSBhbmQgaW50ZXJydXB0cy4gKi8KKyAgICBpZiAoZW5hYmxlRW5naW5lKQorCW5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1JFQ09SRF9FTkFCTEVfUkVHLAorCQkJICAgIE5NX1JFQ09SRF9FTkFCTEVfRkxBRyB8IE5NX1JFQ09SRF9GUkVFUlVOKTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworfQorCisvKiBTdG9wIHRoZSBwbGF5IGVuZ2luZS4gKi8KK3N0YXRpYyB2b2lkCitzdG9wUGxheSAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgLyogU2h1dCBvZmYgc291bmQgZnJvbSBib3RoIGNoYW5uZWxzLiAqLworICAgIG5tMjU2X3dyaXRlUG9ydDE2IChjYXJkLCAyLCBOTV9BVURJT19NVVRFX1JFRywKKwkJICAgICAgIE5NX0FVRElPX01VVEVfTEVGVCB8IE5NX0FVRElPX01VVEVfUklHSFQpOworICAgIC8qIERpc2FibGUgcGxheSBlbmdpbmUuICovCisgICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgTk1fUExBWUJBQ0tfRU5BQkxFX1JFRywgMCk7CisgICAgaWYgKGNhcmQtPnBsYXlpbmcpIHsKKwlubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChjYXJkKTsKKworCS8qIFJlc2V0IHRoZSByZWxldmFudCBzdGF0ZSBiaXRzLiAqLworCWNhcmQtPnBsYXlpbmcgPSAwOworCWNhcmQtPmN1clBsYXlQb3MgPSAwOworICAgIH0KK30KKworLyogU3RvcCByZWNvcmRpbmcuICovCitzdGF0aWMgdm9pZAorc3RvcFJlY29yZCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgLyogRGlzYWJsZSByZWNvcmRpbmcgZW5naW5lLiAqLworICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIE5NX1JFQ09SRF9FTkFCTEVfUkVHLCAwKTsKKworICAgIGlmIChjYXJkLT5yZWNvcmRpbmcpIHsKKwlubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChjYXJkKTsKKworCWNhcmQtPnJlY29yZGluZyA9IDA7CisJY2FyZC0+Y3VyUmVjUG9zID0gMDsKKyAgICB9Cit9CisKKy8qCisgKiBSaW5nIGJ1ZmZlcnMsIG1hbi4gIFRoYXQncyB3aGVyZSB0aGUgaGlwLWhvcCwgd2lsZC1uLXdvb2x5IGFjdGlvbidzIGF0LgorICogMTk3Mj8gIChXZWxsLCBJIHN1cHBvc2UgaXQgd2FzIGNoZWVwLW4tZWFzeSB0byBpbXBsZW1lbnQuKQorICoKKyAqIFdyaXRlIEFNVCBieXRlcyBvZiBCVUZGRVIgdG8gdGhlIHBsYXliYWNrIHJpbmcgYnVmZmVyLCBhbmQgc3RhcnQgdGhlCisgKiBwbGF5YmFjayBlbmdpbmUgcnVubmluZy4gIEl0IHdpbGwgb25seSBhY2NlcHQgdXAgdG8gMS8yIG9mIHRoZSB0b3RhbAorICogc2l6ZSBvZiB0aGUgcmluZyBidWZmZXIuICBObyBjaGVjayBpcyBtYWRlIHRoYXQgd2UncmUgYWJvdXQgdG8gb3ZlcndyaXRlCisgKiB0aGUgY3VycmVudGx5LXBsYXlpbmcgc2FtcGxlLgorICovCisKK3N0YXRpYyB2b2lkCitubTI1Nl93cml0ZV9ibG9jayAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQsIGNoYXIgKmJ1ZmZlciwgdTMyIGFtdCkKK3sKKyAgICB1MzIgcmluZ3NpemUgPSBjYXJkLT5wbGF5YmFja0J1ZmZlclNpemU7CisgICAgdTMyIGVuZHN0b3A7CisgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKKworICAgIGlmIChhbXQgPiAocmluZ3NpemUgLyAyKSkgeworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBXcml0ZSByZXF1ZXN0IHRvbyBsYXJnZTogJWRcbiIsIGFtdCk7CisJYW10ID0gKHJpbmdzaXplIC8gMik7CisgICAgfQorCisgICAgaWYgKGFtdCA8IE5NMjU2X1BMQVlfV01BUktfU0laRSkgeworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBXcml0ZSByZXF1ZXN0IHRvbyBzbWFsbDogJWRcbiIsIGFtdCk7CisJcmV0dXJuOworICAgIH0KKworICAgIGNhcmQtPmN1clBsYXlQb3MgJT0gcmluZ3NpemU7CisKKyAgICBjYXJkLT5yZXF1ZXN0ZWRfYW10ID0gYW10OworCisgICAgc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworCisgICAgaWYgKChjYXJkLT5jdXJQbGF5UG9zICsgYW10KSA+PSByaW5nc2l6ZSkgeworCXUzMiByZW0gPSByaW5nc2l6ZSAtIGNhcmQtPmN1clBsYXlQb3M7CisKKwlubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGJ1ZmZlciwgMSwKKwkJCSAgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcywKKwkJCSAgICAgIHJlbSk7CisJaWYgKGFtdCA+IHJlbSkKKwkgICAgbm0yNTZfd3JpdGVCdWZmZXI4IChjYXJkLCBidWZmZXIgKyByZW0sIDEsIGNhcmQtPmFidWYxLAorCQkJCSAgYW10IC0gcmVtKTsKKyAgICB9IAorICAgIGVsc2UKKwlubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGJ1ZmZlciwgMSwKKwkJCSAgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcywKKwkJCSAgICAgIGFtdCk7CisKKyAgICAvKgorICAgICAqIFNldHVwIHRoZSBzdGFydC1uLXN0b3Atbi1saW1pdCByZWdpc3RlcnMsIGFuZCBzdGFydCB0aGF0IGVuZ2luZQorICAgICAqIGdvaW4nLiAKKyAgICAgKgorICAgICAqIE5vcm1hbGx5IHdlIGp1c3QgbGV0IGl0IHdyYXAgYXJvdW5kIHRvIGF2b2lkIHRoZSBjbGljay1jbGljaworICAgICAqIGFjdGlvbiBzY2VuZS4KKyAgICAgKi8KKyAgICBpZiAoISBjYXJkLT5wbGF5aW5nKSB7CisJLyogVGhlIFBCVUZGRVJfRU5EIHJlZ2lzdGVyIGluIHRoaXMgY2FzZSBwb2ludHMgdG8gb25lIHNhbXBsZQorCSAgIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCisJaW50IHcgPSAoY2FyZC0+ZGV2X2Zvcl9wbGF5ID09IGNhcmQtPmRldlswXSA/IDAgOiAxKTsKKwlpbnQgc2FtcHNpemUgPSAoY2FyZC0+c2luZm9bd10uYml0cyA9PSAxNiA/IDIgOiAxKTsKKworCWlmIChjYXJkLT5zaW5mb1t3XS5zdGVyZW8pCisJICAgIHNhbXBzaXplICo9IDI7CisKKwkvKiBOZWVkIHRvIHNldCB0aGUgbm90LW5vcm1hbGx5LWNoYW5naW5nLXJlZ2lzdGVycyB1cC4gKi8KKwlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9TVEFSVCwKKwkJCSAgICAgY2FyZC0+YWJ1ZjEgKyBjYXJkLT5jdXJQbGF5UG9zKTsKKwlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9FTkQsCisJCQkgICAgIGNhcmQtPmFidWYxICsgcmluZ3NpemUgLSBzYW1wc2l6ZSk7CisJbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfQ1VSUlAsCisJCQkgICAgIGNhcmQtPmFidWYxICsgY2FyZC0+Y3VyUGxheVBvcyk7CisgICAgfQorICAgIGVuZHN0b3AgPSAoY2FyZC0+Y3VyUGxheVBvcyArIGFtdCAtIE5NMjU2X1BMQVlfV01BUktfU0laRSkgJSByaW5nc2l6ZTsKKyAgICBubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgTk1fUEJVRkZFUl9XTUFSSywgY2FyZC0+YWJ1ZjEgKyBlbmRzdG9wKTsKKworICAgIGlmICghIGNhcmQtPnBsYXlpbmcpCisJc3RhcnRQbGF5IChjYXJkKTsKKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworfQorCisvKiAgV2UganVzdCBnb3QgYSBjYXJkIHBsYXliYWNrIGludGVycnVwdDsgcHJvY2VzcyBpdC4gICovCitzdGF0aWMgdm9pZAorbm0yNTZfZ2V0X25ld19ibG9jayAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgLyogQ2hlY2sgdG8gc2VlIGhvdyBtdWNoIGdvdCBwbGF5ZWQgc28gZmFyLiAqLworICAgIHUzMiBhbXQgPSBubTI1Nl9yZWFkUG9ydDMyIChjYXJkLCAyLCBOTV9QQlVGRkVSX0NVUlJQKSAtIGNhcmQtPmFidWYxOworCisgICAgaWYgKGFtdCA+PSBjYXJkLT5wbGF5YmFja0J1ZmZlclNpemUpIHsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogU291bmQgcGxheWJhY2sgcG9pbnRlciBpbnZhbGlkIVxuIik7CisJYW10ID0gMDsKKyAgICB9CisKKyAgICBpZiAoYW10IDwgY2FyZC0+Y3VyUGxheVBvcykKKwlhbXQgPSAoY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplIC0gY2FyZC0+Y3VyUGxheVBvcykgKyBhbXQ7CisgICAgZWxzZQorCWFtdCAtPSBjYXJkLT5jdXJQbGF5UG9zOworCisgICAgaWYgKGNhcmQtPnJlcXVlc3RlZF9hbXQgPiAoYW10ICsgTk0yNTZfUExBWV9XTUFSS19TSVpFKSkgeworCXUzMiBlbmRzdG9wID0KKwkgICAgY2FyZC0+Y3VyUGxheVBvcyArIGNhcmQtPnJlcXVlc3RlZF9hbXQgLSBOTTI1Nl9QTEFZX1dNQVJLX1NJWkU7CisJbm0yNTZfd3JpdGVQb3J0MzIgKGNhcmQsIDIsIE5NX1BCVUZGRVJfV01BUkssIGNhcmQtPmFidWYxICsgZW5kc3RvcCk7CisgICAgfSAKKyAgICBlbHNlIHsKKwljYXJkLT5jdXJQbGF5UG9zICs9IGNhcmQtPnJlcXVlc3RlZF9hbXQ7CisJLyogR2V0IGEgbmV3IGJsb2NrIHRvIHdyaXRlLiAgVGhpcyB3aWxsIGV2ZW50dWFsbHkgaW52b2tlCisJICAgbm0yNTZfd3JpdGVfYmxvY2sgKCkgb3Igc3RvcFBsYXkgKCkuICAqLworCURNQWJ1Zl9vdXRwdXRpbnRyIChjYXJkLT5kZXZfZm9yX3BsYXksIDEpOworICAgIH0KK30KKworLyogCisgKiBSZWFkIHRoZSBsYXN0LXJlY29yZGVkIGJsb2NrIGZyb20gdGhlIHJpbmcgYnVmZmVyLCBjb3B5IGl0IGludG8gdGhlCisgKiBzYXZlZCBidWZmZXIgcG9pbnRlciwgYW5kIGludm9rZSBETUF1Zl9pbnB1dGludHIoKSB3aXRoIHRoZSByZWNvcmRpbmcKKyAqIGRldmljZS4gCisgKi8KKworc3RhdGljIHZvaWQKK25tMjU2X3JlYWRfYmxvY2sgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIC8qIEdyYWIgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIHJlY29yZGluZyBwb2ludGVyLiAqLworICAgIHUzMiBjdXJycHRyID0gbm0yNTZfcmVhZFBvcnQzMiAoY2FyZCwgMiwgTk1fUkJVRkZFUl9DVVJSUCkgLSBjYXJkLT5hYnVmMjsKKyAgICB1MzIgYW10VG9SZWFkID0gY2FyZC0+cmVxdWVzdGVkUmVjQW10OworICAgIHUzMiByaW5nc2l6ZSA9IGNhcmQtPnJlY29yZEJ1ZmZlclNpemU7CisKKyAgICBpZiAoY3VycnB0ciA+PSBjYXJkLT5yZWNvcmRCdWZmZXJTaXplKSB7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFNvdW5kIGJ1ZmZlciByZWNvcmQgcG9pbnRlciBpbnZhbGlkIVxuIik7CisgICAgICAgIGN1cnJwdHIgPSAwOworICAgIH0KKworICAgIC8qCisgICAgICogVGhpcyB0ZXN0IGlzIHByb2JhYmx5IHJlZHVuZGFudDsgd2Ugc2hvdWxkbid0IGJlIGhlcmUgdW5sZXNzCisgICAgICogaXQncyB0cnVlLgorICAgICAqLworICAgIGlmIChjYXJkLT5yZWNvcmRpbmcpIHsKKwkvKiBJZiB3ZSB3cmFwcGVkIGFyb3VuZCwgY29weSBldmVyeXRoaW5nIGZyb20gdGhlIHN0YXJ0IG9mIG91cgorCSAgIHJlY29yZGluZyBidWZmZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLiAqLworCWlmIChjdXJycHRyIDwgY2FyZC0+Y3VyUmVjUG9zKSB7CisJICAgIHUzMiBhbXQgPSBtaW4gKHJpbmdzaXplIC0gY2FyZC0+Y3VyUmVjUG9zLCBhbXRUb1JlYWQpOworCisJICAgIG5tMjU2X3JlYWRCdWZmZXI4IChjYXJkLCBjYXJkLT5yZWNCdWYsIDEsCisJCQkJIGNhcmQtPmFidWYyICsgY2FyZC0+Y3VyUmVjUG9zLAorCQkJCSBhbXQpOworCSAgICBhbXRUb1JlYWQgLT0gYW10OworCSAgICBjYXJkLT5jdXJSZWNQb3MgKz0gYW10OworCSAgICBjYXJkLT5yZWNCdWYgKz0gYW10OworCSAgICBpZiAoY2FyZC0+Y3VyUmVjUG9zID09IHJpbmdzaXplKQorCQljYXJkLT5jdXJSZWNQb3MgPSAwOworCX0KKworCWlmICgoY2FyZC0+Y3VyUmVjUG9zIDwgY3VycnB0cikgJiYgKGFtdFRvUmVhZCA+IDApKSB7CisJICAgIHUzMiBhbXQgPSBtaW4gKGN1cnJwdHIgLSBjYXJkLT5jdXJSZWNQb3MsIGFtdFRvUmVhZCk7CisJICAgIG5tMjU2X3JlYWRCdWZmZXI4IChjYXJkLCBjYXJkLT5yZWNCdWYsIDEsCisJCQkJIGNhcmQtPmFidWYyICsgY2FyZC0+Y3VyUmVjUG9zLCBhbXQpOworCSAgICBjYXJkLT5jdXJSZWNQb3MgPSAoKGNhcmQtPmN1clJlY1BvcyArIGFtdCkgJSByaW5nc2l6ZSk7CisJfQorCWNhcmQtPnJlY0J1ZiA9IE5VTEw7CisJY2FyZC0+cmVxdWVzdGVkUmVjQW10ID0gMDsKKwlETUFidWZfaW5wdXRpbnRyIChjYXJkLT5kZXZfZm9yX3JlY29yZCk7CisgICAgfQorfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgaGFyZHdhcmUuIAorICovCitzdGF0aWMgdm9pZAorbm0yNTZfaW5pdEh3IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKK3sKKyAgICAvKiBSZXNldCBldmVyeXRoaW5nLiAqLworICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4MCwgMHgxMSk7CisgICAgbm0yNTZfd3JpdGVQb3J0MTYgKGNhcmQsIDIsIDB4MjE0LCAwKTsKKworICAgIHN0b3BSZWNvcmQgKGNhcmQpOworICAgIHN0b3BQbGF5IChjYXJkKTsKK30KKworLyogCisgKiBIYW5kbGUgYSBwb3RlbnRpYWwgaW50ZXJydXB0IGZvciB0aGUgZGV2aWNlIHJlZmVycmVkIHRvIGJ5IERFVl9JRC4gCisgKgorICogSSBkb24ndCBsaWtlIHRoZSBjdXQtbi1wYXN0ZSBqb2IgaGVyZSBlaXRoZXIgYmV0d2VlbiB0aGUgdHdvIHJvdXRpbmVzLAorICogYnV0IHRoZXJlIGFyZSBzdWZmaWNpZW50IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBpbnRlcnJ1cHQgaGFuZGxlcnMKKyAqIHRoYXQgcGFyYW1ldGVyaXppbmcgaXQgaXNuJ3QgYWxsIHRoYXQgZ3JlYXQgZWl0aGVyLiAgKENvdWxkIHVzZSBhIG1hY3JvLAorICogSSBzdXBwb3NlLi4ueXVja3kgYmxlYWguKQorICovCisKK3N0YXRpYyBpcnFyZXR1cm5fdAorbm0yNTZfaW50ZXJydXB0IChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpkdW1teSkKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqKWRldl9pZDsKKyAgICB1MTYgc3RhdHVzOworICAgIHN0YXRpYyBpbnQgYmFkaW50cmNvdW50OworICAgIGludCBoYW5kbGVkID0gMDsKKworICAgIGlmICgoY2FyZCA9PSBOVUxMKSB8fCAoY2FyZC0+bWFnc2lnICE9IE5NX01BR0lDX1NJRykpIHsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIGNhcmQgcG9pbnRlclxuIik7CisJcmV0dXJuIElSUV9OT05FOworICAgIH0KKworICAgIHN0YXR1cyA9IG5tMjU2X3JlYWRQb3J0MTYgKGNhcmQsIDIsIE5NX0lOVF9SRUcpOworCisgICAgLyogTm90IG91cnMuICovCisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisJaWYgKGJhZGludHJjb3VudCsrID4gMTAwMCkgeworCSAgICAvKgorCSAgICAgKiBJJ20gbm90IHN1cmUgaWYgdGhlIGJlc3QgdGhpbmcgaXMgdG8gc3RvcCB0aGUgY2FyZCBmcm9tCisJICAgICAqIHBsYXlpbmcgb3IganVzdCByZWxlYXNlIHRoZSBpbnRlcnJ1cHQgKGFmdGVyIGFsbCwgd2UncmUgaW4KKwkgICAgICogYSBiYWQgc2l0dWF0aW9uLCBzbyBkb2luZyBmYW5jeSBzdHVmZiBtYXkgbm90IGJlIHN1Y2ggYSBnb29kCisJICAgICAqIGlkZWEpLgorCSAgICAgKgorCSAgICAgKiBJIHdvcnJ5IGFib3V0IHRoZSBjYXJkIGVuZ2luZSBjb250aW51aW5nIHRvIHBsYXkgbm9pc2UKKwkgICAgICogb3ZlciBhbmQgb3ZlciwgaG93ZXZlci0tdGhhdCBjb3VsZCBiZWNvbWUgYSB2ZXJ5CisJICAgICAqIG9ibm94aW91cyBwcm9ibGVtLiAgQW5kIHdlIGtub3cgdGhhdCB3aGVuIHRoaXMgdXN1YWxseQorCSAgICAgKiBoYXBwZW5zIHRoaW5ncyBhcmUgZmFpcmx5IHNhZmUsIGl0IGp1c3QgbWVhbnMgdGhlIHVzZXIncworCSAgICAgKiBpbnNlcnRlZCBhIFBDTUNJQSBjYXJkIGFuZCBzb21lb25lJ3Mgc3BhbW1pbmcgdXMgd2l0aCBJUlEgOXMuCisJICAgICAqLworCisJICAgIGhhbmRsZWQgPSAxOworCSAgICBpZiAoY2FyZC0+cGxheWluZykKKwkJc3RvcFBsYXkgKGNhcmQpOworCSAgICBpZiAoY2FyZC0+cmVjb3JkaW5nKQorCQlzdG9wUmVjb3JkIChjYXJkKTsKKwkgICAgYmFkaW50cmNvdW50ID0gMDsKKwl9CisJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7CisgICAgfQorCisgICAgYmFkaW50cmNvdW50ID0gMDsKKworICAgIC8qIFJhdGhlciBib3Jpbmc7IGNoZWNrIGZvciBpbmRpdmlkdWFsIGludGVycnVwdHMgYW5kIHByb2Nlc3MgdGhlbS4gKi8KKworICAgIGlmIChzdGF0dXMgJiBOTV9QTEFZQkFDS19JTlQpIHsKKwloYW5kbGVkID0gMTsKKwlzdGF0dXMgJj0gfk5NX1BMQVlCQUNLX0lOVDsKKwlOTV9BQ0tfSU5UIChjYXJkLCBOTV9QTEFZQkFDS19JTlQpOworCisJaWYgKGNhcmQtPnBsYXlpbmcpCisJICAgIG5tMjU2X2dldF9uZXdfYmxvY2sgKGNhcmQpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgJiBOTV9SRUNPUkRfSU5UKSB7CisJaGFuZGxlZCA9IDE7CisJc3RhdHVzICY9IH5OTV9SRUNPUkRfSU5UOworCU5NX0FDS19JTlQgKGNhcmQsIE5NX1JFQ09SRF9JTlQpOworCisJaWYgKGNhcmQtPnJlY29yZGluZykKKwkgICAgbm0yNTZfcmVhZF9ibG9jayAoY2FyZCk7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAmIE5NX01JU0NfSU5UXzEpIHsKKwl1OCBjYnl0ZTsKKworCWhhbmRsZWQgPSAxOworCXN0YXR1cyAmPSB+Tk1fTUlTQ19JTlRfMTsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKKwlOTV9BQ0tfSU5UIChjYXJkLCBOTV9NSVNDX0lOVF8xKTsKKwlubTI1Nl93cml0ZVBvcnQxNiAoY2FyZCwgMiwgTk1fSU5UX1JFRywgMHg4MDAwKTsKKwljYnl0ZSA9IG5tMjU2X3JlYWRQb3J0OCAoY2FyZCwgMiwgMHg0MDApOworCW5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NDAwLCBjYnl0ZSB8IDIpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgJiBOTV9NSVNDX0lOVF8yKSB7CisJdTggY2J5dGU7CisKKwloYW5kbGVkID0gMTsKKwlzdGF0dXMgJj0gfk5NX01JU0NfSU5UXzI7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEdvdCBtaXNjIGludGVycnVwdCAjMlxuIik7CisJTk1fQUNLX0lOVCAoY2FyZCwgTk1fTUlTQ19JTlRfMik7CisJY2J5dGUgPSBubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4NDAwKTsKKwlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDQwMCwgY2J5dGUgJiB+Mik7CisgICAgfQorCisgICAgLyogVW5rbm93biBpbnRlcnJ1cHQuICovCisgICAgaWYgKHN0YXR1cykgeworCWhhbmRsZWQgPSAxOworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBGaXJlIGluIHRoZSBob2xlISBVbmtub3duIHN0YXR1cyAweCV4XG4iLAorCQlzdGF0dXMpOworCS8qIFByYXkuICovCisJTk1fQUNLX0lOVCAoY2FyZCwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cit9CisKKy8qCisgKiBIYW5kbGUgYSBwb3RlbnRpYWwgaW50ZXJydXB0IGZvciB0aGUgZGV2aWNlIHJlZmVycmVkIHRvIGJ5IERFVl9JRC4KKyAqIFRoaXMgaGFuZGxlciBpcyBmb3IgdGhlIDI1NlpYLCBhbmQgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBub24tWlgKKyAqIHJvdXRpbmUuCisgKi8KKworc3RhdGljIGlycXJldHVybl90CitubTI1Nl9pbnRlcnJ1cHRfenggKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2X2lkOworICAgIHUzMiBzdGF0dXM7CisgICAgc3RhdGljIGludCBiYWRpbnRyY291bnQ7CisgICAgaW50IGhhbmRsZWQgPSAwOworCisgICAgaWYgKChjYXJkID09IE5VTEwpIHx8IChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSkgeworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBCYWQgY2FyZCBwb2ludGVyXG4iKTsKKwlyZXR1cm4gSVJRX05PTkU7CisgICAgfQorCisgICAgc3RhdHVzID0gbm0yNTZfcmVhZFBvcnQzMiAoY2FyZCwgMiwgTk1fSU5UX1JFRyk7CisKKyAgICAvKiBOb3Qgb3Vycy4gKi8KKyAgICBpZiAoc3RhdHVzID09IDApIHsKKwlpZiAoYmFkaW50cmNvdW50KysgPiAxMDAwKSB7CisJICAgIHByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBSZWxlYXNpbmcgaW50ZXJydXB0LCBvdmVyIDEwMDAgaW52YWxpZCBpbnRlcnJ1cHRzXG4iKTsKKwkgICAgLyoKKwkgICAgICogSSdtIG5vdCBzdXJlIGlmIHRoZSBiZXN0IHRoaW5nIGlzIHRvIHN0b3AgdGhlIGNhcmQgZnJvbQorCSAgICAgKiBwbGF5aW5nIG9yIGp1c3QgcmVsZWFzZSB0aGUgaW50ZXJydXB0IChhZnRlciBhbGwsIHdlJ3JlIGluCisJICAgICAqIGEgYmFkIHNpdHVhdGlvbiwgc28gZG9pbmcgZmFuY3kgc3R1ZmYgbWF5IG5vdCBiZSBzdWNoIGEgZ29vZAorCSAgICAgKiBpZGVhKS4KKwkgICAgICoKKwkgICAgICogSSB3b3JyeSBhYm91dCB0aGUgY2FyZCBlbmdpbmUgY29udGludWluZyB0byBwbGF5IG5vaXNlCisJICAgICAqIG92ZXIgYW5kIG92ZXIsIGhvd2V2ZXItLXRoYXQgY291bGQgYmVjb21lIGEgdmVyeQorCSAgICAgKiBvYm5veGlvdXMgcHJvYmxlbS4gIEFuZCB3ZSBrbm93IHRoYXQgd2hlbiB0aGlzIHVzdWFsbHkKKwkgICAgICogaGFwcGVucyB0aGluZ3MgYXJlIGZhaXJseSBzYWZlLCBpdCBqdXN0IG1lYW5zIHRoZSB1c2VyJ3MKKwkgICAgICogaW5zZXJ0ZWQgYSBQQ01DSUEgY2FyZCBhbmQgc29tZW9uZSdzIHNwYW1taW5nIHVzIHdpdGggCisJICAgICAqIElSUSA5cy4KKwkgICAgICovCisKKwkgICAgaGFuZGxlZCA9IDE7CisJICAgIGlmIChjYXJkLT5wbGF5aW5nKQorCQlzdG9wUGxheSAoY2FyZCk7CisJICAgIGlmIChjYXJkLT5yZWNvcmRpbmcpCisJCXN0b3BSZWNvcmQgKGNhcmQpOworCSAgICBiYWRpbnRyY291bnQgPSAwOworCX0KKwlyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKKyAgICB9CisKKyAgICBiYWRpbnRyY291bnQgPSAwOworCisgICAgLyogUmF0aGVyIGJvcmluZzsgY2hlY2sgZm9yIGluZGl2aWR1YWwgaW50ZXJydXB0cyBhbmQgcHJvY2VzcyB0aGVtLiAqLworCisgICAgaWYgKHN0YXR1cyAmIE5NMl9QTEFZQkFDS19JTlQpIHsKKwloYW5kbGVkID0gMTsKKwlzdGF0dXMgJj0gfk5NMl9QTEFZQkFDS19JTlQ7CisJTk0yX0FDS19JTlQgKGNhcmQsIE5NMl9QTEFZQkFDS19JTlQpOworCisJaWYgKGNhcmQtPnBsYXlpbmcpCisJICAgIG5tMjU2X2dldF9uZXdfYmxvY2sgKGNhcmQpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgJiBOTTJfUkVDT1JEX0lOVCkgeworCWhhbmRsZWQgPSAxOworCXN0YXR1cyAmPSB+Tk0yX1JFQ09SRF9JTlQ7CisJTk0yX0FDS19JTlQgKGNhcmQsIE5NMl9SRUNPUkRfSU5UKTsKKworCWlmIChjYXJkLT5yZWNvcmRpbmcpCisJICAgIG5tMjU2X3JlYWRfYmxvY2sgKGNhcmQpOworICAgIH0KKworICAgIGlmIChzdGF0dXMgJiBOTTJfTUlTQ19JTlRfMSkgeworCXU4IGNieXRlOworCisJaGFuZGxlZCA9IDE7CisJc3RhdHVzICY9IH5OTTJfTUlTQ19JTlRfMTsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogR290IG1pc2MgaW50ZXJydXB0ICMxXG4iKTsKKwlOTTJfQUNLX0lOVCAoY2FyZCwgTk0yX01JU0NfSU5UXzEpOworCWNieXRlID0gbm0yNTZfcmVhZFBvcnQ4IChjYXJkLCAyLCAweDQwMCk7CisJbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg0MDAsIGNieXRlIHwgMik7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyAmIE5NMl9NSVNDX0lOVF8yKSB7CisJdTggY2J5dGU7CisKKwloYW5kbGVkID0gMTsKKwlzdGF0dXMgJj0gfk5NMl9NSVNDX0lOVF8yOworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBHb3QgbWlzYyBpbnRlcnJ1cHQgIzJcbiIpOworCU5NMl9BQ0tfSU5UIChjYXJkLCBOTTJfTUlTQ19JTlRfMik7CisJY2J5dGUgPSBubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIDB4NDAwKTsKKwlubTI1Nl93cml0ZVBvcnQ4IChjYXJkLCAyLCAweDQwMCwgY2J5dGUgJiB+Mik7CisgICAgfQorCisgICAgLyogVW5rbm93biBpbnRlcnJ1cHQuICovCisgICAgaWYgKHN0YXR1cykgeworCWhhbmRsZWQgPSAxOworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBGaXJlIGluIHRoZSBob2xlISBVbmtub3duIHN0YXR1cyAweCV4XG4iLAorCQlzdGF0dXMpOworCS8qIFByYXkuICovCisJTk0yX0FDS19JTlQgKGNhcmQsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOworfQorCisvKiAKKyAqIFJlcXVlc3Qgb3VyIGludGVycnVwdC4KKyAqLworc3RhdGljIGludAorbm0yNTZfZ3JhYkludGVycnVwdCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgaWYgKGNhcmQtPmhhc19pcnErKyA9PSAwKSB7CisJaWYgKHJlcXVlc3RfaXJxIChjYXJkLT5pcnEsIGNhcmQtPmludHJvdXRpbmUsIFNBX1NISVJRLAorCQkJICJOTTI1Nl9hdWRpbyIsIGNhcmQpIDwgMCkgeworCSAgICBwcmludGsgKEtFUk5fRVJSICJOTTI1NjogY2FuJ3Qgb2J0YWluIElSUSAlZFxuIiwgY2FyZC0+aXJxKTsKKwkgICAgcmV0dXJuIC0xOworCX0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qIAorICogUmVsZWFzZSBvdXIgaW50ZXJydXB0LiAKKyAqLworc3RhdGljIGludAorbm0yNTZfcmVsZWFzZUludGVycnVwdCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgaWYgKGNhcmQtPmhhc19pcnEgPD0gMCkgeworCXByaW50ayAoS0VSTl9FUlIgIm5tMjU2OiB0b28gbWFueSBjYWxscyB0byByZWxlYXNlSW50ZXJydXB0XG4iKTsKKwlyZXR1cm4gLTE7CisgICAgfQorICAgIGNhcmQtPmhhc19pcnEtLTsKKyAgICBpZiAoY2FyZC0+aGFzX2lycSA9PSAwKSB7CisJZnJlZV9pcnEgKGNhcmQtPmlycSwgY2FyZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKgorICogV2FpdHMgZm9yIHRoZSBtaXhlciB0byBiZWNvbWUgcmVhZHkgdG8gYmUgd3JpdHRlbjsgcmV0dXJucyBhIHplcm8gdmFsdWUKKyAqIGlmIGl0IHRpbWVkIG91dC4KKyAqLworCitzdGF0aWMgaW50CitubTI1Nl9pc1JlYWR5IChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2LT5kcml2ZXJfcHJpdmF0ZTsKKyAgICBpbnQgdDIgPSAxMDsKKyAgICB1MzIgdGVzdGFkZHI7CisgICAgdTE2IHRlc3RiOworICAgIGludCBkb25lID0gMDsKKworICAgIGlmIChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSB7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBtYWdpYyBzaWduYXR1cmUgaW4gaXNSZWFkeSFcbiIpOworCXJldHVybiAwOworICAgIH0KKworICAgIHRlc3RhZGRyID0gY2FyZC0+bWl4ZXJfc3RhdHVzX29mZnNldDsKKyAgICB0ZXN0YiA9IGNhcmQtPm1peGVyX3N0YXR1c19tYXNrOworCisgICAgLyogCisgICAgICogTG9vcCBhcm91bmQgd2FpdGluZyBmb3IgdGhlIG1peGVyIHRvIGJlY29tZSByZWFkeS4gCisgICAgICovCisgICAgd2hpbGUgKCEgZG9uZSAmJiB0Mi0tID4gMCkgeworCWlmICgobm0yNTZfcmVhZFBvcnQxNiAoY2FyZCwgMiwgdGVzdGFkZHIpICYgdGVzdGIpID09IDApCisJICAgIGRvbmUgPSAxOworCWVsc2UKKwkgICAgdWRlbGF5ICgxMDApOworICAgIH0KKyAgICByZXR1cm4gZG9uZTsKK30KKworLyoKKyAqIFJldHVybiB0aGUgY29udGVudHMgb2YgdGhlIEFDOTcgbWl4ZXIgcmVnaXN0ZXIgUkVHLiAgUmV0dXJucyBhIHBvc2l0aXZlCisgKiB2YWx1ZSBpZiBzdWNjZXNzZnVsLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgKi8KK3N0YXRpYyBpbnQKK25tMjU2X3JlYWRBQzk3UmVnIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcpCit7CisgICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXYtPmRyaXZlcl9wcml2YXRlOworCisgICAgaWYgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpIHsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIG1hZ2ljIHNpZ25hdHVyZSBpbiByZWFkQUM5N1JlZyFcbiIpOworCXJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGlmIChyZWcgPCAxMjgpIHsKKwlpbnQgcmVzOworCisJbm0yNTZfaXNSZWFkeSAoZGV2KTsKKwlyZXMgPSBubTI1Nl9yZWFkUG9ydDE2IChjYXJkLCAyLCBjYXJkLT5taXhlciArIHJlZyk7CisJLyogTWFnaWMgZGVsYXkuICBCbGVhaCB5dWNreS4gICovCisgICAgICAgIHVkZWxheSAoMTAwMCk7CisJcmV0dXJuIHJlczsKKyAgICB9CisgICAgZWxzZQorCXJldHVybiAtRUlOVkFMOworfQorCisvKiAKKyAqIFdyaXRlcyBWQUxVRSB0byBBQzk3IG1peGVyIHJlZ2lzdGVyIFJFRy4gIFJldHVybnMgMCBpZiBzdWNjZXNzZnVsLCBvcgorICogYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiAKKyAqLworc3RhdGljIGludAorbm0yNTZfd3JpdGVBQzk3UmVnIChzdHJ1Y3QgYWM5N19od2ludCAqZGV2LCB1OCByZWcsIHUxNiB2YWx1ZSkKK3sKKyAgICB1bnNpZ25lZCBsb25nIGZsYWdzOworICAgIGludCB0cmllcyA9IDI7CisgICAgaW50IGRvbmUgPSAwOworICAgIHUzMiBiYXNlOworCisgICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSAoc3RydWN0IG5tMjU2X2luZm8gKilkZXYtPmRyaXZlcl9wcml2YXRlOworCisgICAgaWYgKGNhcmQtPm1hZ3NpZyAhPSBOTV9NQUdJQ19TSUcpIHsKKwlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogQmFkIG1hZ2ljIHNpZ25hdHVyZSBpbiB3cml0ZUFDOTdSZWchXG4iKTsKKwlyZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBiYXNlID0gY2FyZC0+bWl4ZXI7CisKKyAgICBzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jayxmbGFncyk7CisKKyAgICBubTI1Nl9pc1JlYWR5IChkZXYpOworCisgICAgLyogV2FpdCBmb3IgdGhlIHdyaXRlIHRvIHRha2UsIHRvby4gKi8KKyAgICB3aGlsZSAoKHRyaWVzLS0gPiAwKSAmJiAhZG9uZSkgeworCW5tMjU2X3dyaXRlUG9ydDE2IChjYXJkLCAyLCBiYXNlICsgcmVnLCB2YWx1ZSk7CisJaWYgKG5tMjU2X2lzUmVhZHkgKGRldikpIHsKKwkgICAgZG9uZSA9IDE7CisJICAgIGJyZWFrOworCX0KKworICAgIH0KKworICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssZmxhZ3MpOworICAgIHVkZWxheSAoMTAwMCk7CisKKyAgICByZXR1cm4gISBkb25lOworfQorCisvKiAKKyAqIEluaXRpYWwgcmVnaXN0ZXIgdmFsdWVzIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIEFDOTcgbWl4ZXIuCisgKiBXaGlsZSBtb3N0IG9mIHRoZXNlIGFyZSBpZGVudGljYWwgdG8gdGhlIHJlc2V0IHZhbHVlcywgd2UgZG8gdGhpcworICogc28gdGhhdCB3ZSBoYXZlIG1vc3Qgb2YgdGhlIHJlZ2lzdGVyIGNvbnRlbnRzIGNhY2hlZC0tdGhpcyBhdm9pZHMKKyAqIHJlYWRpbmcgZnJvbSB0aGUgbWl4ZXIgZGlyZWN0bHkgKHdoaWNoIHNlZW1zIHRvIGJlIHByb2JsZW1hdGljLAorICogcHJvYmFibHkgZHVlIHRvIGlnbm9yYW5jZSkuCisgKi8KK3N0cnVjdCBpbml0aWFsVmFsdWVzIAoreworICAgIHVuc2lnbmVkIHNob3J0IHBvcnQ7CisgICAgdW5zaWduZWQgc2hvcnQgdmFsdWU7Cit9OworCitzdGF0aWMgc3RydWN0IGluaXRpYWxWYWx1ZXMgbm0yNTZfYWM5N19pbml0aWFsX3ZhbHVlc1tdID0gCit7CisgICAgeyBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCAweDgwMDAgfSwKKyAgICB7IEFDOTdfSEVBRFBIT05FX1ZPTCwgICAgIDB4ODAwMCB9LAorICAgIHsgQUM5N19NQVNURVJfVk9MX01PTk8sICAgMHgwMDAwIH0sCisgICAgeyBBQzk3X1BDQkVFUF9WT0wsICAgICAgICAweDAwMDAgfSwKKyAgICB7IEFDOTdfUEhPTkVfVk9MLCAgICAgICAgIDB4MDAwOCB9LAorICAgIHsgQUM5N19NSUNfVk9MLCAgICAgICAgICAgMHg4MDAwIH0sCisgICAgeyBBQzk3X0xJTkVJTl9WT0wsICAgICAgICAweDg4MDggfSwKKyAgICB7IEFDOTdfQ0RfVk9MLCAgICAgICAgICAgIDB4ODgwOCB9LAorICAgIHsgQUM5N19WSURFT19WT0wsICAgICAgICAgMHg4ODA4IH0sCisgICAgeyBBQzk3X0FVWF9WT0wsICAgICAgICAgICAweDg4MDggfSwKKyAgICB7IEFDOTdfUENNT1VUX1ZPTCwgICAgICAgIDB4MDgwOCB9LAorICAgIHsgQUM5N19SRUNPUkRfU0VMRUNULCAgICAgMHgwMDAwIH0sCisgICAgeyBBQzk3X1JFQ09SRF9HQUlOLCAgICAgICAweDBCMEIgfSwKKyAgICB7IEFDOTdfR0VORVJBTF9QVVJQT1NFLCAgIDB4MDAwMCB9LAorICAgIHsgMHhmZmZmLCAweGZmZmYgfQorfTsKKworLyogSW5pdGlhbGl6ZSB0aGUgQUM5NyBpbnRvIGEga25vd24gc3RhdGUuICAqLworc3RhdGljIGludAorbm0yNTZfcmVzZXRBQzk3IChzdHJ1Y3QgYWM5N19od2ludCAqZGV2KQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gKHN0cnVjdCBubTI1Nl9pbmZvICopZGV2LT5kcml2ZXJfcHJpdmF0ZTsKKyAgICBpbnQgeDsKKworICAgIGlmIChjYXJkLT5tYWdzaWcgIT0gTk1fTUFHSUNfU0lHKSB7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IEJhZCBtYWdpYyBzaWduYXR1cmUgaW4gcmVzZXRBQzk3IVxuIik7CisJcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgLyogUmVzZXQgdGhlIG1peGVyLiAgJ1RpcyBtYWdpYyEgICovCisgICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg2YzAsIDEpOworLy8gIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NmNjLCAweDg3KTsJLyogVGhpcyBjcmFzaGVzIERlbGwgbGF0aXR1ZGVzICovCisgICAgbm0yNTZfd3JpdGVQb3J0OCAoY2FyZCwgMiwgMHg2Y2MsIDB4ODApOworICAgIG5tMjU2X3dyaXRlUG9ydDggKGNhcmQsIDIsIDB4NmNjLCAweDApOworCisgICAgaWYgKCEgY2FyZC0+bWl4ZXJfdmFsdWVzX2luaXQpIHsKKwlmb3IgKHggPSAwOyBubTI1Nl9hYzk3X2luaXRpYWxfdmFsdWVzW3hdLnBvcnQgIT0gMHhmZmZmOyB4KyspIHsKKwkgICAgYWM5N19wdXRfcmVnaXN0ZXIgKGRldiwKKwkJCSAgICAgICBubTI1Nl9hYzk3X2luaXRpYWxfdmFsdWVzW3hdLnBvcnQsCisJCQkgICAgICAgbm0yNTZfYWM5N19pbml0aWFsX3ZhbHVlc1t4XS52YWx1ZSk7CisJICAgIGNhcmQtPm1peGVyX3ZhbHVlc19pbml0ID0gMTsKKwl9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBXZSBkb24ndCBkbyBhbnl0aGluZyBwYXJ0aWN1bGFybHkgc3BlY2lhbCBoZXJlOyBpdCBqdXN0IHBhc3NlcyB0aGUKKyAqIG1peGVyIGlvY3RsIHRvIHRoZSBBQzk3IGRyaXZlci4KKyAqLworc3RhdGljIGludAorbm0yNTZfZGVmYXVsdF9taXhlcl9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZF9mb3JfbWl4ZXIgKGRldik7CisgICAgaWYgKGNhcmQgIT0gTlVMTCkKKwlyZXR1cm4gYWM5N19taXhlcl9pb2N0bCAoJihjYXJkLT5tZGV2KSwgY21kLCBhcmcpOworICAgIGVsc2UKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zIG5tMjU2X21peGVyX29wZXJhdGlvbnMgPSB7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmlkCT0gIk5lb01hZ2ljIiwKKwkubmFtZQk9ICJOTTI1NkFDOTdNaXhlciIsCisJLmlvY3RsCT0gbm0yNTZfZGVmYXVsdF9taXhlcl9pb2N0bAorfTsKKworLyoKKyAqIERlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBPU1MgbWl4ZXIuICBUaGVzZSBhcmUgc2V0IGxhc3QsIGFmdGVyIHRoZQorICogbWl4ZXIgaXMgaW5pdGlhbGl6ZWQuCisgKgorICogSSAibG92ZSIgQyBzb21ldGltZXMuICBHb3QgYnJhY2VzPworICovCitzdGF0aWMgc3RydWN0IGFjOTdfbWl4ZXJfdmFsdWVfbGlzdCBtaXhlcl9kZWZhdWx0c1tdID0geworICAgIHsgU09VTkRfTUlYRVJfVk9MVU1FLCAgeyB7IDg1LCA4NSB9IH0gfSwKKyAgICB7IFNPVU5EX01JWEVSX1NQRUFLRVIsIHsgeyAxMDAgfSB9IH0sCisgICAgeyBTT1VORF9NSVhFUl9QQ00sICAgICB7IHsgNjUsIDY1IH0gfSB9LAorICAgIHsgU09VTkRfTUlYRVJfQ0QsICAgICAgeyB7IDY1LCA2NSB9IH0gfSwKKyAgICB7IC0xLCAgICAgICAgICAgICAgICAgIHsgIHsgMCwgIDAgfSB9IH0KK307CisKKworLyogSW5zdGFsbHMgdGhlIEFDOTcgbWl4ZXIgaW50byBDQVJELiAgKi8KK3N0YXRpYyBpbnQgX19pbml0CitubTI1Nl9pbnN0YWxsX21peGVyIChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCkKK3sKKyAgICBpbnQgbWl4ZXI7CisKKyAgICBjYXJkLT5tZGV2LnJlc2V0X2RldmljZSA9IG5tMjU2X3Jlc2V0QUM5NzsKKyAgICBjYXJkLT5tZGV2LnJlYWRfcmVnID0gbm0yNTZfcmVhZEFDOTdSZWc7CisgICAgY2FyZC0+bWRldi53cml0ZV9yZWcgPSBubTI1Nl93cml0ZUFDOTdSZWc7CisgICAgY2FyZC0+bWRldi5kcml2ZXJfcHJpdmF0ZSA9ICh2b2lkICopY2FyZDsKKworICAgIGlmIChhYzk3X2luaXQgKCYoY2FyZC0+bWRldikpKQorCXJldHVybiAtMTsKKworICAgIG1peGVyID0gc291bmRfYWxsb2NfbWl4ZXJkZXYoKTsKKyAgICBpZiAobnVtX21peGVycyA+PSBNQVhfTUlYRVJfREVWKSB7CisJcHJpbnRrICgiTk0yNTYgbWl4ZXI6IFVuYWJsZSB0byBhbGxvYyBtaXhlcmRldlxuIik7CisJcmV0dXJuIC0xOworICAgIH0KKworICAgIG1peGVyX2RldnNbbWl4ZXJdID0gJm5tMjU2X21peGVyX29wZXJhdGlvbnM7CisgICAgY2FyZC0+bWl4ZXJfb3NzX2RldiA9IG1peGVyOworCisgICAgLyogU29tZSByZWFzb25hYmxlIGRlZmF1bHQgdmFsdWVzLiAgKi8KKyAgICBhYzk3X3NldF92YWx1ZXMgKCYoY2FyZC0+bWRldiksIG1peGVyX2RlZmF1bHRzKTsKKworICAgIHByaW50ayhLRVJOX0lORk8gIkluaXRpYWxpemVkIEFDOTcgbWl4ZXJcbiIpOworICAgIHJldHVybiAwOworfQorCisvKiBQZXJmb3JtIGEgZnVsbCByZXNldCBvbiB0aGUgaGFyZHdhcmU7IHRoaXMgaXMgaW52b2tlZCB3aGVuIGFuIEFQTQorICAgcmVzdW1lIGV2ZW50IG9jY3Vycy4gICovCitzdGF0aWMgdm9pZAorbm0yNTZfZnVsbF9yZXNldCAoc3RydWN0IG5tMjU2X2luZm8gKmNhcmQpCit7CisgICAgbm0yNTZfaW5pdEh3IChjYXJkKTsKKyAgICBhYzk3X3Jlc2V0ICgmKGNhcmQtPm1kZXYpKTsKK30KKworLyogCisgKiBTZWUgaWYgdGhlIHNpZ25hdHVyZSBsZWZ0IGJ5IHRoZSBOTTI1NiBCSU9TIGlzIGludGFjdDsgaWYgc28sIHdlIHVzZQorICogdGhlIGFzc29jaWF0ZWQgYWRkcmVzcyBhcyB0aGUgZW5kIG9mIG91ciBhdWRpbyBidWZmZXIgaW4gdGhlIHZpZGVvCisgKiBSQU0uCisgKi8KKworc3RhdGljIHZvaWQgX19pbml0CitubTI1Nl9wZWVrX2Zvcl9zaWcgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIHUzMiBwb3J0MW9mZnNldCAKKwk9IGNhcmQtPnBvcnRbMF0ucGh5c2FkZHIgKyBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQgLSAweDA0MDA7CisgICAgLyogVGhlIHNpZ25hdHVyZSBpcyBsb2NhdGVkIDFLIGJlbG93IHRoZSBlbmQgb2YgdmlkZW8gUkFNLiAgKi8KKyAgICBjaGFyIF9faW9tZW0gKnRlbXAgPSBpb3JlbWFwX25vY2FjaGUgKHBvcnQxb2Zmc2V0LCAxNik7CisgICAgLyogRGVmYXVsdCBidWZmZXIgZW5kIGlzIDUxMjAgYnl0ZXMgYmVsb3cgdGhlIHRvcCBvZiBSQU0uICAqLworICAgIHUzMiBkZWZhdWx0X3ZhbHVlID0gY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0IC0gMHgxNDAwOworICAgIHUzMiBzaWc7CisKKyAgICAvKiBJbnN0YWxsIHRoZSBkZWZhdWx0IHZhbHVlIGZpcnN0LCBzbyB3ZSBkb24ndCBoYXZlIHRvIHJlcGVhdGVkbHkKKyAgICAgICBkbyBpdCBpZiB0aGVyZSBpcyBhIHByb2JsZW0uICAqLworICAgIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IGRlZmF1bHRfdmFsdWU7CisKKyAgICBpZiAodGVtcCA9PSBOVUxMKSB7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IFVuYWJsZSB0byBzY2FuIGZvciBjYXJkIHNpZ25hdHVyZSBpbiB2aWRlbyBSQU1cbiIpOworCXJldHVybjsKKyAgICB9CisgICAgc2lnID0gcmVhZGwgKHRlbXApOworICAgIGlmICgoc2lnICYgTk1fU0lHX01BU0spID09IE5NX1NJR05BVFVSRSkgeworCXUzMiBwb2ludGVyID0gcmVhZGwgKHRlbXAgKyA0KTsKKworCS8qCisJICogSWYgaXQncyBvYnZpb3VzbHkgaW52YWxpZCwgZG9uJ3QgdXNlIGl0ICh0aGUgcG9ydCBhbHJlYWR5IGhhcyBhCisJICogc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSBzZXQpLgorCSAqLworCWlmIChwb2ludGVyICE9IDB4ZmZmZmZmZmYpCisJICAgIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IHBvaW50ZXI7CisKKwlwcmludGsgKEtFUk5fSU5GTyAiTk0yNTY6IEZvdW5kIGNhcmQgc2lnbmF0dXJlIGluIHZpZGVvIFJBTTogMHgleFxuIiwKKwkJcG9pbnRlcik7CisgICAgfQorCisgICAgaW91bm1hcCAodGVtcCk7Cit9CisKKy8qIAorICogSW5zdGFsbCBhIGRyaXZlciBmb3IgdGhlIFBDSSBkZXZpY2UgcmVmZXJlbmNlZCBieSBQQ0lERVYuCisgKiBWRVJTVFIgaXMgYSBodW1hbi1yZWFkYWJsZSB2ZXJzaW9uIHN0cmluZy4KKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbm0yNTZfaW5zdGFsbChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2LCBlbnVtIG5tMjU2cmV2IHJldiwgY2hhciAqdmVyc3RyKQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkOworICAgIHN0cnVjdCBwbV9kZXYgKnBtZGV2OworICAgIGludCB4OworCisgICAgaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpCisJICAgIHJldHVybiAwOworCisgICAgY2FyZCA9IGttYWxsb2MgKHNpemVvZiAoc3RydWN0IG5tMjU2X2luZm8pLCBHRlBfS0VSTkVMKTsKKyAgICBpZiAoY2FyZCA9PSBOVUxMKSB7CisJcHJpbnRrIChLRVJOX0VSUiAiTk0yNTY6IG91dCBvZiBtZW1vcnkhXG4iKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBjYXJkLT5tYWdzaWcgPSBOTV9NQUdJQ19TSUc7CisgICAgY2FyZC0+cGxheWluZyAgPSAwOworICAgIGNhcmQtPnJlY29yZGluZyA9IDA7CisgICAgY2FyZC0+cmV2ID0gcmV2OworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKKworICAgIC8qIEluaXQgdGhlIG1lbW9yeSBwb3J0IGluZm8uICAqLworICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKKwljYXJkLT5wb3J0W3hdLnBoeXNhZGRyID0gcGNpX3Jlc291cmNlX3N0YXJ0IChwY2lkZXYsIHgpOworCWNhcmQtPnBvcnRbeF0ucHRyID0gTlVMTDsKKwljYXJkLT5wb3J0W3hdLnN0YXJ0X29mZnNldCA9IDA7CisJY2FyZC0+cG9ydFt4XS5lbmRfb2Zmc2V0ID0gMDsKKyAgICB9CisKKyAgICAvKiBQb3J0IDIgaXMgZWFzeS4gICovCisgICAgY2FyZC0+cG9ydFsxXS5zdGFydF9vZmZzZXQgPSAwOworICAgIGNhcmQtPnBvcnRbMV0uZW5kX29mZnNldCA9IE5NX1BPUlQyX1NJWkU7CisKKyAgICAvKiBZdWNrLiAgQnV0IHdlIGhhdmUgdG8gbWFwIGluIHBvcnQgMiBzbyB3ZSBjYW4gY2hlY2sgaG93IG11Y2ggUkFNIHRoZQorICAgICAgIGNhcmQgaGFzLiAgKi8KKyAgICBpZiAobm0yNTZfcmVtYXBfcG9ydHMgKGNhcmQpKSB7CisJa2ZyZWUgKGNhcmQpOworCXJldHVybiAwOworICAgIH0KKworICAgIC8qIAorICAgICAqIFRoZSBOTTI1NiBoYXMgdHdvIG1lbW9yeSBwb3J0cy4gIFRoZSBmaXJzdCBwb3J0IGlzIG5vdGhpbmcKKyAgICAgKiBtb3JlIHRoYW4gYSBjaHVuayBvZiB2aWRlbyBSQU0sIHdoaWNoIGlzIHVzZWQgYXMgdGhlIEkvTyByaW5nCisgICAgICogYnVmZmVyLiAgVGhlIHNlY29uZCBwb3J0IGhhcyB0aGUgYWN0dWFsIGp1aWN5IHN0dWZmIChsaWtlIHRoZQorICAgICAqIG1peGVyIGFuZCB0aGUgcGxheWJhY2sgZW5naW5lIGNvbnRyb2wgcmVnaXN0ZXJzKS4KKyAgICAgKi8KKworICAgIGlmIChjYXJkLT5yZXYgPT0gUkVWX05NMjU2QVYpIHsKKwkvKiBPaywgdHJ5IHRvIHNlZSBpZiB0aGlzIGlzIGEgbm9uLUFDOTcgdmVyc2lvbiBvZiB0aGUgaGFyZHdhcmUuICovCisJaW50IHB2YWwgPSBubTI1Nl9yZWFkUG9ydDE2IChjYXJkLCAyLCBOTV9NSVhFUl9QUkVTRU5DRSk7CisJaWYgKChwdmFsICYgTk1fUFJFU0VOQ0VfTUFTSykgIT0gTk1fUFJFU0VOQ0VfVkFMVUUpIHsKKwkgICAgaWYgKCEgZm9yY2VfbG9hZCkgeworCQlwcmludGsgKEtFUk5fRVJSICJOTTI1NjogVGhpcyBkb2Vzbid0IGxvb2sgdG8gbWUgbGlrZSB0aGUgQUM5Ny1jb21wYXRpYmxlIHZlcnNpb24uXG4iKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgIFlvdSBjYW4gZm9yY2UgdGhlIGRyaXZlciB0byBsb2FkIGJ5IHBhc3NpbmcgaW4gdGhlIG1vZHVsZVxuIik7CisJCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBwYXJhbWV0ZXI6XG4iKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgICAgICAgICBmb3JjZV9sb2FkID0gMVxuIik7CisJCXByaW50ayAoS0VSTl9FUlIgIlxuIik7CisJCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBNb3JlIGxpa2VseSwgeW91IHNob3VsZCBiZSB1c2luZyB0aGUgYXBwcm9wcmlhdGUgU0ItMTYgb3JcbiIpOworCQlwcmludGsgKEtFUk5fRVJSICIgICAgICAgQ1M0MjMyIGRyaXZlciBpbnN0ZWFkLiAgKElmIHlvdXIgQklPUyBoYXMgc2V0dGluZ3MgZm9yXG4iKTsKKwkJcHJpbnRrIChLRVJOX0VSUiAiICAgICAgIElSUSBhbmQvb3IgRE1BIGZvciB0aGUgc291bmQgY2FyZCwgdGhpcyBpcyAqbm90KiB0aGUgY29ycmVjdFxuIik7CisJCXByaW50ayAoS0VSTl9FUlIgIiAgICAgICBkcml2ZXIgdG8gdXNlLilcbiIpOworCQlubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKKwkJa2ZyZWUgKGNhcmQpOworCQlyZXR1cm4gMDsKKwkgICAgfQorCSAgICBlbHNlIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gIk5NMjU2OiBGb3JjaW5nIGRyaXZlciBsb2FkIGFzIHBlciB1c2VyIHJlcXVlc3QuXG4iKTsKKwkgICAgfQorCX0KKwllbHNlIHsKKwkgLyogICBwcmludGsgKEtFUk5fSU5GTyAiTk0yNTY6IENvbmdyYXR1bGF0aW9ucy4gWW91J3JlIG5vdCBydW5uaW5nIEV1bmljZS5cbiIpKi87CisJfQorCWNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IDI1NjAgKiAxMDI0OworCWNhcmQtPmludHJvdXRpbmUgPSBubTI1Nl9pbnRlcnJ1cHQ7CisJY2FyZC0+bWl4ZXJfc3RhdHVzX29mZnNldCA9IE5NX01JWEVSX1NUQVRVU19PRkZTRVQ7CisJY2FyZC0+bWl4ZXJfc3RhdHVzX21hc2sgPSBOTV9NSVhFUl9SRUFEWV9NQVNLOworICAgIH0gCisgICAgZWxzZSB7CisJLyogTm90IHN1cmUgaWYgdGhlcmUgaXMgYW55IHJlbGV2YW50IGRldGVjdCBmb3IgdGhlIFpYIG9yIG5vdC4gICovCisJaWYgKG5tMjU2X3JlYWRQb3J0OCAoY2FyZCwgMiwgMHhhMGIpICE9IDApCisJICAgIGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IDYxNDQgKiAxMDI0OworCWVsc2UKKwkgICAgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0ID0gNDA5NiAqIDEwMjQ7CisKKwljYXJkLT5pbnRyb3V0aW5lID0gbm0yNTZfaW50ZXJydXB0X3p4OworCWNhcmQtPm1peGVyX3N0YXR1c19vZmZzZXQgPSBOTTJfTUlYRVJfU1RBVFVTX09GRlNFVDsKKwljYXJkLT5taXhlcl9zdGF0dXNfbWFzayA9IE5NMl9NSVhFUl9SRUFEWV9NQVNLOworICAgIH0KKworICAgIGlmIChidWZmZXJ0b3AgPj0gOTgzMDQgJiYgYnVmZmVydG9wIDwgY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0KQorCWNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCA9IGJ1ZmZlcnRvcDsKKyAgICBlbHNlCisJbm0yNTZfcGVla19mb3Jfc2lnIChjYXJkKTsKKworICAgIGNhcmQtPnBvcnRbMF0uc3RhcnRfb2Zmc2V0ID0gY2FyZC0+cG9ydFswXS5lbmRfb2Zmc2V0IC0gOTgzMDQ7CisKKyAgICBwcmludGsgKEtFUk5fSU5GTyAiTk0yNTY6IE1hcHBpbmcgcG9ydCAxIGZyb20gMHgleCAtIDB4JXhcbiIsCisJICAgIGNhcmQtPnBvcnRbMF0uc3RhcnRfb2Zmc2V0LCBjYXJkLT5wb3J0WzBdLmVuZF9vZmZzZXQpOworCisgICAgaWYgKG5tMjU2X3JlbWFwX3BvcnRzIChjYXJkKSkgeworCWtmcmVlIChjYXJkKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKiBTZWUgaWYgd2UgY2FuIGdldCB0aGUgaW50ZXJydXB0LiAqLworCisgICAgY2FyZC0+aXJxID0gcGNpZGV2LT5pcnE7CisgICAgY2FyZC0+aGFzX2lycSA9IDA7CisKKyAgICBpZiAobm0yNTZfZ3JhYkludGVycnVwdCAoY2FyZCkgIT0gMCkgeworCW5tMjU2X3JlbGVhc2VfcG9ydHMgKGNhcmQpOworCWtmcmVlIChjYXJkKTsKKwlyZXR1cm4gMDsKKyAgICB9CisKKyAgICBubTI1Nl9yZWxlYXNlSW50ZXJydXB0IChjYXJkKTsKKworICAgIC8qCisgICAgICoJSW5pdCB0aGUgYm9hcmQuCisgICAgICovCisKKyAgICBjYXJkLT5wbGF5YmFja0J1ZmZlclNpemUgPSAxNjM4NDsKKyAgICBjYXJkLT5yZWNvcmRCdWZmZXJTaXplID0gMTYzODQ7CisKKyAgICBjYXJkLT5jb2VmZkJ1ZiA9IGNhcmQtPnBvcnRbMF0uZW5kX29mZnNldCAtIE5NX01BWF9DT0VGRklDSUVOVDsKKyAgICBjYXJkLT5hYnVmMiA9IGNhcmQtPmNvZWZmQnVmIC0gY2FyZC0+cmVjb3JkQnVmZmVyU2l6ZTsKKyAgICBjYXJkLT5hYnVmMSA9IGNhcmQtPmFidWYyIC0gY2FyZC0+cGxheWJhY2tCdWZmZXJTaXplOworICAgIGNhcmQtPmFsbENvZWZmQnVmID0gY2FyZC0+YWJ1ZjIgLSAoTk1fVE9UQUxfQ09FRkZfQ09VTlQgKiA0KTsKKworICAgIC8qIEZpeGVkIHNldHRpbmcuICovCisgICAgY2FyZC0+bWl4ZXIgPSBOTV9NSVhFUl9PRkZTRVQ7CisgICAgY2FyZC0+bWl4ZXJfdmFsdWVzX2luaXQgPSAwOworCisgICAgY2FyZC0+aXNfb3Blbl9wbGF5ID0gMDsKKyAgICBjYXJkLT5pc19vcGVuX3JlY29yZCA9IDA7CisKKyAgICBjYXJkLT5jb2VmZnNDdXJyZW50ID0gMDsKKworICAgIGNhcmQtPm9wZW5jbnRbMF0gPSAwOyBjYXJkLT5vcGVuY250WzFdID0gMDsKKworICAgIC8qIFJlYXNvbmFibGUgZGVmYXVsdCBzZXR0aW5ncywgYnV0IGxhcmdlbHkgdW5uZWNlc3NhcnkuICovCisgICAgZm9yICh4ID0gMDsgeCA8IDI7IHgrKykgeworCWNhcmQtPnNpbmZvW3hdLmJpdHMgPSA4OworCWNhcmQtPnNpbmZvW3hdLnN0ZXJlbyA9IDA7CisJY2FyZC0+c2luZm9beF0uc2FtcGxlcmF0ZSA9IDgwMDA7CisgICAgfQorCisgICAgbm0yNTZfaW5pdEh3IChjYXJkKTsKKworICAgIGZvciAoeCA9IDA7IHggPCAyOyB4KyspIHsKKwlpZiAoKGNhcmQtPmRldlt4XSA9CisJICAgICBzb3VuZF9pbnN0YWxsX2F1ZGlvZHJ2KEFVRElPX0RSSVZFUl9WRVJTSU9OLAorCQkJCSAgICAiTk0yNTYiLCAmbm0yNTZfYXVkaW9fZHJpdmVyLAorCQkJCSAgICBzaXplb2Yoc3RydWN0IGF1ZGlvX2RyaXZlciksCisJCQkJICAgIERNQV9OT0RNQSwgQUZNVF9VOCB8IEFGTVRfUzE2X0xFLAorCQkJCSAgICBOVUxMLCAtMSwgLTEpKSA+PSAwKSB7CisJICAgIC8qIDFLIG1pbmltdW0gYnVmZmVyIHNpemUuICovCisJICAgIGF1ZGlvX2RldnNbY2FyZC0+ZGV2W3hdXS0+bWluX2ZyYWdtZW50ID0gMTA7CisJICAgIC8qIE1heGltdW0gb2YgOEsgYnVmZmVyIHNpemUuICovCisJICAgIGF1ZGlvX2RldnNbY2FyZC0+ZGV2W3hdXS0+bWF4X2ZyYWdtZW50ID0gMTM7CisJfQorCWVsc2UgeworCSAgICBwcmludGsoS0VSTl9FUlIgIk5NMjU2OiBUb28gbWFueSBQQ00gZGV2aWNlcyBhdmFpbGFibGVcbiIpOworCSAgICBubTI1Nl9yZWxlYXNlX3BvcnRzIChjYXJkKTsKKwkgICAga2ZyZWUgKGNhcmQpOworCSAgICByZXR1cm4gMDsKKwl9CisgICAgfQorCisgICAgcGNpX3NldF9kcnZkYXRhKHBjaWRldixjYXJkKTsKKworICAgIC8qIEluc2VydCB0aGUgY2FyZCBpbiB0aGUgbGlzdC4gICovCisgICAgY2FyZC0+bmV4dF9jYXJkID0gbm1jYXJkX2xpc3Q7CisgICAgbm1jYXJkX2xpc3QgPSBjYXJkOworCisgICAgcHJpbnRrKEtFUk5fSU5GTyAiSW5pdGlhbGl6ZWQgTmVvTWFnaWMgJXMgYXVkaW8gaW4gUENJIG5hdGl2ZSBtb2RlXG4iLAorCSAgIHZlcnN0cik7CisKKyAgICAvKiAKKyAgICAgKiBBbmQgb3VyIG1peGVyLiAgKFdlIHNob3VsZCBhbGxvdyBzdXBwb3J0IGZvciBvdGhlciBtaXhlcnMsIG1heWJlLikKKyAgICAgKi8KKworICAgIG5tMjU2X2luc3RhbGxfbWl4ZXIgKGNhcmQpOworCisgICAgcG1kZXYgPSBwbV9yZWdpc3RlcihQTV9QQ0lfREVWLCBQTV9QQ0lfSUQocGNpZGV2KSwgaGFuZGxlX3BtX2V2ZW50KTsKKyAgICBpZiAocG1kZXYpCisgICAgICAgIHBtZGV2LT5kYXRhID0gY2FyZDsKKworICAgIHJldHVybiAxOworfQorCisKKy8qCisgKiBQTSBldmVudCBoYW5kbGVyLCBzbyB0aGUgY2FyZCBpcyBwcm9wZXJseSByZWluaXRpYWxpemVkIGFmdGVyIGEgcG93ZXIKKyAqIGV2ZW50LgorICovCitzdGF0aWMgaW50CitoYW5kbGVfcG1fZXZlbnQgKHN0cnVjdCBwbV9kZXYgKmRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpCit7CisgICAgc3RydWN0IG5tMjU2X2luZm8gKmNyZCA9IChzdHJ1Y3Qgbm0yNTZfaW5mbyopIGRldi0+ZGF0YTsKKyAgICBpZiAoY3JkKSB7CisgICAgICAgIHN3aXRjaCAocnFzdCkgeworCWNhc2UgUE1fU1VTUEVORDoKKwkgICAgYnJlYWs7CisJY2FzZSBQTV9SRVNVTUU6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IHBsYXlpbmcgPSBjcmQtPnBsYXlpbmc7CisgICAgICAgICAgICAgICAgbm0yNTZfZnVsbF9yZXNldCAoY3JkKTsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEEgbGl0dGxlIHVnbHksIGJ1dCB0aGF0J3Mgb2s7IHByZXRlbmQgdGhlCisgICAgICAgICAgICAgICAgICogYmxvY2sgd2Ugd2VyZSBwbGF5aW5nIGlzIGRvbmUuIAorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwbGF5aW5nKQorICAgICAgICAgICAgICAgICAgICBETUFidWZfb3V0cHV0aW50ciAoY3JkLT5kZXZfZm9yX3BsYXksIDEpOworICAgICAgICAgICAgfQorCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAorbm0yNTZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldixjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqcGNpaWQpCit7CisgICAgaWYgKHBjaWRldi0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZBVl9BVURJTykKKwlyZXR1cm4gbm0yNTZfaW5zdGFsbChwY2lkZXYsIFJFVl9OTTI1NkFWLCAiMjU2QVYiKTsKKyAgICBpZiAocGNpZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlpYX0FVRElPKQorCXJldHVybiBubTI1Nl9pbnN0YWxsKHBjaWRldiwgUkVWX05NMjU2WlgsICIyNTZaWCIpOworICAgIGlmIChwY2lkZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2WExfUExVU19BVURJTykKKwlyZXR1cm4gbm0yNTZfaW5zdGFsbChwY2lkZXYsIFJFVl9OTTI1NlpYLCAiMjU2WEwrIik7CisgICAgcmV0dXJuIC0xOyAvKiBzaG91bGQgbm90IGNvbWUgaGVyZSAuLi4gKi8KK30KKworc3RhdGljIHZvaWQgX19kZXZpbml0CitubTI1Nl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldikgeworICAgIHN0cnVjdCBubTI1Nl9pbmZvICp4Y2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCpuZXh0X2NhcmQgPSBOVUxMOworCisgICAgZm9yIChjYXJkID0gbm1jYXJkX2xpc3Q7IGNhcmQgIT0gTlVMTDsgY2FyZCA9IG5leHRfY2FyZCkgeworCW5leHRfY2FyZCA9IGNhcmQtPm5leHRfY2FyZDsKKwlpZiAoY2FyZCA9PSB4Y2FyZCkgeworCSAgICBzdG9wUGxheSAoY2FyZCk7CisJICAgIHN0b3BSZWNvcmQgKGNhcmQpOworCSAgICBpZiAoY2FyZC0+aGFzX2lycSkKKwkJZnJlZV9pcnEgKGNhcmQtPmlycSwgY2FyZCk7CisJICAgIG5tMjU2X3JlbGVhc2VfcG9ydHMgKGNhcmQpOworCSAgICBzb3VuZF91bmxvYWRfbWl4ZXJkZXYgKGNhcmQtPm1peGVyX29zc19kZXYpOworCSAgICBzb3VuZF91bmxvYWRfYXVkaW9kZXYgKGNhcmQtPmRldlswXSk7CisJICAgIHNvdW5kX3VubG9hZF9hdWRpb2RldiAoY2FyZC0+ZGV2WzFdKTsKKwkgICAga2ZyZWUgKGNhcmQpOworCSAgICBicmVhazsKKwl9CisgICAgfQorICAgIGlmIChubWNhcmRfbGlzdCA9PSBjYXJkKQorICAgIAlubWNhcmRfbGlzdCA9IG5leHRfY2FyZDsKK30KKworLyoKKyAqIE9wZW4gdGhlIGRldmljZQorICoKKyAqIERFViAgLSBkZXZpY2UKKyAqIE1PREUgLSBtb2RlIHRvIG9wZW4gZGV2aWNlIChsb2dpY2FsIE9SIG9mIE9QRU5fUkVBRCBhbmQgT1BFTl9XUklURSkKKyAqCisgKiBDYWxsZWQgd2hlbiBvcGVuaW5nIHRoZSBETUFidWYgICAgICAgICAgICAgICAoZG1hYnVmLmM6MjU5KQorICovCitzdGF0aWMgaW50CitubTI1Nl9hdWRpb19vcGVuKGludCBkZXYsIGludCBtb2RlKQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOworICAgIGludCB3OworCQorICAgIGlmIChjYXJkID09IE5VTEwpCisJcmV0dXJuIC1FTk9ERVY7CisKKyAgICBpZiAoY2FyZC0+ZGV2WzBdID09IGRldikKKwl3ID0gMDsKKyAgICBlbHNlIGlmIChjYXJkLT5kZXZbMV0gPT0gZGV2KQorCXcgPSAxOworICAgIGVsc2UKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGlmIChjYXJkLT5vcGVuY250W3ddID4gMCkKKwlyZXR1cm4gLUVCVVNZOworCisgICAgLyogTm8gYml0cyBzZXQ/IEh1aD8gKi8KKyAgICBpZiAoISAoKG1vZGUgJiBPUEVOX1JFQUQpIHx8IChtb2RlICYgT1BFTl9XUklURSkpKQorCXJldHVybiAtRUlPOworCisgICAgLyoKKyAgICAgKiBJZiBpdCdzIG9wZW4gZm9yIGJvdGggcmVhZCBhbmQgd3JpdGUsIGFuZCB0aGUgY2FyZCdzIGN1cnJlbnRseQorICAgICAqIGJlaW5nIHJlYWQgb3Igd3JpdHRlbiB0bywgdGhlbiBkbyB0aGUgb3Bwb3NpdGUgb2Ygd2hhdCBoYXMKKyAgICAgKiBhbHJlYWR5IGJlZW4gZG9uZS4gIE90aGVyd2lzZSwgZG9uJ3Qgc3BlY2lmeSBhbnkgbW9kZSB1bnRpbCB0aGUKKyAgICAgKiB1c2VyIGFjdHVhbGx5IHRyaWVzIHRvIGRvIEkvTy4gIChTb21lIHByb2dyYW1zIG9wZW4gdGhlIGRldmljZQorICAgICAqIGZvciBib3RoIHJlYWQgYW5kIHdyaXRlLCBidXQgb25seSBhY3R1YWxseSBkbyByZWFkaW5nIG9yIHdyaXRpbmcuKQorICAgICAqLworCisgICAgaWYgKChtb2RlICYgT1BFTl9XUklURSkgJiYgKG1vZGUgJiBPUEVOX1JFQUQpKSB7CisJaWYgKGNhcmQtPmlzX29wZW5fcGxheSkKKwkgICAgbW9kZSA9IE9QRU5fV1JJVEU7CisJZWxzZSBpZiAoY2FyZC0+aXNfb3Blbl9yZWNvcmQpCisJICAgIG1vZGUgPSBPUEVOX1JFQUQ7CisJZWxzZSBtb2RlID0gMDsKKyAgICB9CisJCisgICAgaWYgKG1vZGUgJiBPUEVOX1dSSVRFKSB7CisJaWYgKGNhcmQtPmlzX29wZW5fcGxheSA9PSAwKSB7CisJICAgIGNhcmQtPmRldl9mb3JfcGxheSA9IGRldjsKKwkgICAgY2FyZC0+aXNfb3Blbl9wbGF5ID0gMTsKKwl9CisJZWxzZQorCSAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKworICAgIGlmIChtb2RlICYgT1BFTl9SRUFEKSB7CisJaWYgKGNhcmQtPmlzX29wZW5fcmVjb3JkID09IDApIHsKKwkgICAgY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPSBkZXY7CisJICAgIGNhcmQtPmlzX29wZW5fcmVjb3JkID0gMTsKKwl9CisJZWxzZQorCSAgICByZXR1cm4gLUVCVVNZOworICAgIH0KKworICAgIGNhcmQtPm9wZW5jbnRbd10rKzsKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIENsb3NlIHRoZSBkZXZpY2UKKyAqCisgKiBERVYgIC0gZGV2aWNlCisgKgorICogQ2FsbGVkIHdoZW4gY2xvc2luZyB0aGUgRE1BYnVmICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjQ3NykKKyAqICAgICAgYWZ0ZXIgaGFsdF94ZmVyCisgKi8KK3N0YXRpYyB2b2lkCitubTI1Nl9hdWRpb19jbG9zZShpbnQgZGV2KQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOworCQorICAgIGlmIChjYXJkICE9IE5VTEwpIHsKKwlpbnQgdzsKKworCWlmIChjYXJkLT5kZXZbMF0gPT0gZGV2KQorCSAgICB3ID0gMDsKKwllbHNlIGlmIChjYXJkLT5kZXZbMV0gPT0gZGV2KQorCSAgICB3ID0gMTsKKwllbHNlCisJICAgIHJldHVybjsKKworCWNhcmQtPm9wZW5jbnRbd10tLTsKKwlpZiAoY2FyZC0+b3BlbmNudFt3XSA8PSAwKSB7CisJICAgIGNhcmQtPm9wZW5jbnRbd10gPSAwOworCisJICAgIGlmIChjYXJkLT5kZXZfZm9yX3BsYXkgPT0gZGV2KSB7CisJCXN0b3BQbGF5IChjYXJkKTsKKwkJY2FyZC0+aXNfb3Blbl9wbGF5ID0gMDsKKwkJY2FyZC0+ZGV2X2Zvcl9wbGF5ID0gLTE7CisJICAgIH0KKworCSAgICBpZiAoY2FyZC0+ZGV2X2Zvcl9yZWNvcmQgPT0gZGV2KSB7CisJCXN0b3BSZWNvcmQgKGNhcmQpOworCQljYXJkLT5pc19vcGVuX3JlY29yZCA9IDA7CisJCWNhcmQtPmRldl9mb3JfcmVjb3JkID0gLTE7CisJICAgIH0KKwl9CisgICAgfQorfQorCisvKiBTdGFuZGFyZCBpb2N0bCBoYW5kbGVyLiAqLworc3RhdGljIGludAorbm0yNTZfYXVkaW9faW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKyAgICBpbnQgcmV0OworICAgIHUzMiBvbGRpbmZvOworICAgIGludCB3OworCisgICAgc3RydWN0IG5tMjU2X2luZm8gKmNhcmQgPSBubTI1Nl9maW5kX2NhcmQgKGRldik7CisKKyAgICBpZiAoY2FyZCA9PSBOVUxMKQorCXJldHVybiAtRU5PREVWOworCisgICAgaWYgKGRldiA9PSBjYXJkLT5kZXZbMF0pCisJdyA9IDA7CisgICAgZWxzZQorCXcgPSAxOworCisgICAgLyogCisgICAgICogVGhlIGNvZGUgaGVyZSBpcyBtZXNzeS4gIFRoZXJlIGFyZSBwcm9iYWJseSBiZXR0ZXIgd2F5cyB0byBkbworICAgICAqIGl0LiAgKEl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBoYW5kbGUgaXQgdGhlIHNhbWUgd2F5IHRoZSBBQzk3IG1peGVyIAorICAgICAqIGlzIGRvbmUuKQorICAgICAqLworICAgIHN3aXRjaCAoY21kKQorCXsKKwljYXNlIFNPVU5EX1BDTV9XUklURV9SQVRFOgorCSAgICBpZiAoZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCSAgICBpZiAocmV0ICE9IDApIHsKKwkJb2xkaW5mbyA9IGNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGU7CisJCWNhcmQtPnNpbmZvW3ddLnNhbXBsZXJhdGUgPSByZXQ7CisJCXJldCA9IG5tMjU2X3NldEluZm8oZGV2LCBjYXJkKTsKKwkJaWYgKHJldCAhPSAwKQorCQkgICAgY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZSA9IG9sZGluZm87CisJICAgIH0KKwkgICAgaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjYXJkLT5zaW5mb1t3XS5zYW1wbGVyYXRlOworCSAgICBicmVhazsKKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkgICAgcmV0ID0gY2FyZC0+c2luZm9bd10uc2FtcGxlcmF0ZTsKKwkgICAgYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCSAgICBpZiAoZ2V0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKSBhcmcpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCSAgICBjYXJkLT5zaW5mb1t3XS5zdGVyZW8gPSByZXQgPyAxIDogMDsKKwkgICAgcmV0ID0gbm0yNTZfc2V0SW5mbyAoZGV2LCBjYXJkKTsKKwkgICAgaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjYXJkLT5zaW5mb1t3XS5zdGVyZW87CisKKwkgICAgYnJlYWs7CisKKwljYXNlIFNPVU5EX1BDTV9XUklURV9DSEFOTkVMUzoKKwkgICAgaWYgKGdldF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkgICAgaWYgKHJldCA8IDEgfHwgcmV0ID4gMykKKwkJcmV0ID0gY2FyZC0+c2luZm9bd10uc3RlcmVvICsgMTsKKwkgICAgZWxzZSB7CisJCWNhcmQtPnNpbmZvW3ddLnN0ZXJlbyA9IHJldCAtIDE7CisJCXJldCA9IG5tMjU2X3NldEluZm8gKGRldiwgY2FyZCk7CisJCWlmIChyZXQgPT0gMCkKKwkJICAgIHJldCA9IGNhcmQtPnNpbmZvW3ddLnN0ZXJlbyArIDE7CisJICAgIH0KKwkgICAgYnJlYWs7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCSAgICByZXQgPSBjYXJkLT5zaW5mb1t3XS5zdGVyZW8gKyAxOworCSAgICBicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CisJICAgIGlmIChnZXRfdXNlcihyZXQsIChpbnQgX191c2VyICopIGFyZykpCisJCXJldHVybiAtRUZBVUxUOworCisJICAgIGlmIChyZXQgIT0gMCkgeworCQlvbGRpbmZvID0gY2FyZC0+c2luZm9bd10uYml0czsKKwkJY2FyZC0+c2luZm9bd10uYml0cyA9IHJldDsKKwkJcmV0ID0gbm0yNTZfc2V0SW5mbyAoZGV2LCBjYXJkKTsKKwkJaWYgKHJldCAhPSAwKQorCQkgICAgY2FyZC0+c2luZm9bd10uYml0cyA9IG9sZGluZm87CisJICAgIH0KKwkgICAgaWYgKHJldCA9PSAwKQorCQlyZXQgPSBjYXJkLT5zaW5mb1t3XS5iaXRzOworCSAgICBicmVhazsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkgICAgcmV0ID0gY2FyZC0+c2luZm9bd10uYml0czsKKwkgICAgYnJlYWs7CisKKwlkZWZhdWx0OgorCSAgICByZXR1cm4gLUVJTlZBTDsKKwl9CisgICAgcmV0dXJuIHB1dF91c2VyKHJldCwgKGludCBfX3VzZXIgKikgYXJnKTsKK30KKworLyoKKyAqIEdpdmVuIHRoZSBzb3VuZCBkZXZpY2UgREVWIGFuZCBhbiBhc3NvY2lhdGVkIHBoeXNpY2FsIGJ1ZmZlciBQSFlTQlVGLCAKKyAqIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGFjdHVhbCBidWZmZXIgaW4ga2VybmVsIHNwYWNlLiAKKyAqCisgKiBUaGlzIHJvdXRpbmUgc2hvdWxkIGV4aXN0IGFzIHBhcnQgb2YgdGhlIHNvdW5kY29yZSByb3V0aW5lcy4KKyAqLworCitzdGF0aWMgY2hhciAqCitubTI1Nl9nZXRETUFidWZmZXIgKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c2J1ZikKK3sKKyAgICBzdHJ1Y3QgYXVkaW9fb3BlcmF0aW9ucyAqYWRldiA9IGF1ZGlvX2RldnNbZGV2XTsKKyAgICBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCA9IGFkZXYtPmRtYXBfb3V0OworICAgIGNoYXIgKmRtYV9zdGFydCA9CisJKGNoYXIgKikocGh5c2J1ZiAtICh1bnNpZ25lZCBsb25nKWRtYXAtPnJhd19idWZfcGh5cyAKKwkJICsgKHVuc2lnbmVkIGxvbmcpZG1hcC0+cmF3X2J1Zik7CisKKyAgICByZXR1cm4gZG1hX3N0YXJ0OworfQorCisKKy8qCisgKiBPdXRwdXQgYSBibG9jayB0byBzb3VuZCBkZXZpY2UKKyAqCisgKiBkZXYgICAgICAgICAgLSBkZXZpY2UgbnVtYmVyCisgKiBidWYgICAgICAgICAgLSBwaHlzaWNhbCBhZGRyZXNzIG9mIGJ1ZmZlcgorICogdG90YWxfY291bnQgIC0gdG90YWwgYnl0ZSBjb3VudCBpbiBidWZmZXIKKyAqIGludHJmbGFnICAgICAtIHNldCBpZiB0aGlzIGhhcyBiZWVuIGNhbGxlZCBmcm9tIGFuIGludGVycnVwdCAKKyAqCQkJCSAgKHZpYSBETUFidWZfb3V0cHV0aW50cikKKyAqIHJlc3RhcnRfZG1hICAtIHNldCBpZiBlbmdpbmUgbmVlZHMgdG8gYmUgcmUtaW5pdGlhbGlzZWQKKyAqCisgKiBDYWxsZWQgd2hlbjoKKyAqICAxLiBTdGFydGluZyBvdXRwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRtYWJ1Zi5jOjEzMjcpCisgKiAgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkbWFidWYuYzoxNTA0KQorICogIDMuIEEgbmV3IGJ1ZmZlciBuZWVkcyB0byBiZSBzZW50IHRvIHRoZSBkZXZpY2UgICAgICAoZG1hYnVmLmM6MTU3OSkKKyAqLworc3RhdGljIHZvaWQKK25tMjU2X2F1ZGlvX291dHB1dF9ibG9jayhpbnQgZGV2LCB1bnNpZ25lZCBsb25nIHBoeXNidWYsCisJCQkJICAgICAgIGludCB0b3RhbF9jb3VudCwgaW50IGludHJmbGFnKQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOworCisgICAgaWYgKGNhcmQgIT0gTlVMTCkgeworCWNoYXIgKmRtYV9idWYgPSBubTI1Nl9nZXRETUFidWZmZXIgKGRldiwgcGh5c2J1Zik7CisJY2FyZC0+aXNfb3Blbl9wbGF5ID0gMTsKKwljYXJkLT5kZXZfZm9yX3BsYXkgPSBkZXY7CisJbm0yNTZfd3JpdGVfYmxvY2sgKGNhcmQsIGRtYV9idWYsIHRvdGFsX2NvdW50KTsKKyAgICB9Cit9CisKKy8qIERpdHRvLCBidXQgZG8gcmVjb3JkaW5nIGluc3RlYWQuICAqLworc3RhdGljIHZvaWQKK25tMjU2X2F1ZGlvX3N0YXJ0X2lucHV0KGludCBkZXYsIHVuc2lnbmVkIGxvbmcgcGh5c2J1ZiwgaW50IGNvdW50LAorCQkJaW50IGludHJmbGFnKQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOworCisgICAgaWYgKGNhcmQgIT0gTlVMTCkgeworCWNoYXIgKmRtYV9idWYgPSBubTI1Nl9nZXRETUFidWZmZXIgKGRldiwgcGh5c2J1Zik7CisJY2FyZC0+aXNfb3Blbl9yZWNvcmQgPSAxOworCWNhcmQtPmRldl9mb3JfcmVjb3JkID0gZGV2OworCW5tMjU2X3N0YXJ0UmVjb3JkaW5nIChjYXJkLCBkbWFfYnVmLCBjb3VudCk7CisgICAgfQorfQorCisvKiAKKyAqIFByZXBhcmUgZm9yIGlucHV0dGluZyBzYW1wbGVzIHRvIERFVi4gCisgKiBFYWNoIHJlcXVlc3RlZCBidWZmZXIgd2lsbCBiZSBCU0laRSBieWVzIGxvbmcsIHdpdGggYSB0b3RhbCBvZgorICogQkNPVU5UIGJ1ZmZlcnMuIAorICovCisKK3N0YXRpYyBpbnQKK25tMjU2X2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKKworICAgIGlmIChjYXJkID09IE5VTEwpIAorCXJldHVybiAtRU5PREVWOworCisgICAgaWYgKGNhcmQtPmlzX29wZW5fcmVjb3JkICYmIGNhcmQtPmRldl9mb3JfcmVjb3JkICE9IGRldikKKwlyZXR1cm4gLUVCVVNZOworCisgICAgYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5mbGFncyB8PSBETUFfTk9ETUE7CisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcmVwYXJlIGZvciBvdXRwdXR0aW5nIHNhbXBsZXMgdG8gYGRldicKKyAqCisgKiBFYWNoIGJ1ZmZlciB0aGF0IHdpbGwgYmUgcGFzc2VkIHdpbGwgYmUgYGJzaXplJyBieXRlcyBsb25nLAorICogd2l0aCBhIHRvdGFsIG9mIGBiY291bnQnIGJ1ZmZlcnMuCisgKgorICogQ2FsbGVkIHdoZW46CisgKiAgMS4gQSB0cmlnZ2VyIGVuYWJsZXMgYXVkaW8gb3V0cHV0ICAgICAgICAgICAgICAgICAgIChkbWFidWYuYzo5NzgpCisgKiAgMi4gV2UgZ2V0IGEgd3JpdGUgYnVmZmVyIHdpdGhvdXQgZG1hX21vZGUgc2V0dXAgICAgIChkbWFidWYuYzoxMTUyKQorICogIDMuIFdlIHJlc3RhcnQgYSB0cmFuc2ZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG1hYnVmLmM6MTMyNCkKKyAqLworCitzdGF0aWMgaW50CitubTI1Nl9hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworICAgIHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkID0gbm0yNTZfZmluZF9jYXJkIChkZXYpOworCisgICAgaWYgKGNhcmQgPT0gTlVMTCkKKwlyZXR1cm4gLUVOT0RFVjsKKworICAgIGlmIChjYXJkLT5pc19vcGVuX3BsYXkgJiYgY2FyZC0+ZGV2X2Zvcl9wbGF5ICE9IGRldikKKwlyZXR1cm4gLUVCVVNZOworCisgICAgYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZmxhZ3MgfD0gRE1BX05PRE1BOworICAgIHJldHVybiAwOworfQorCisvKiBTdG9wIHRoZSBjdXJyZW50IG9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIERFVi4gICovCitzdGF0aWMgdm9pZAorbm0yNTZfYXVkaW9fcmVzZXQoaW50IGRldikKK3sKKyAgICBzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCA9IG5tMjU2X2ZpbmRfY2FyZCAoZGV2KTsKKworICAgIGlmIChjYXJkICE9IE5VTEwpIHsKKwlpZiAoY2FyZC0+ZGV2X2Zvcl9wbGF5ID09IGRldikKKwkgICAgc3RvcFBsYXkgKGNhcmQpOworCWlmIChjYXJkLT5kZXZfZm9yX3JlY29yZCA9PSBkZXYpCisJICAgIHN0b3BSZWNvcmQgKGNhcmQpOworICAgIH0KK30KKworc3RhdGljIGludAorbm0yNTZfYXVkaW9fbG9jYWxfcWxlbihpbnQgZGV2KQoreworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBubTI1Nl9hdWRpb19kcml2ZXIgPQoreworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCQk9IG5tMjU2X2F1ZGlvX29wZW4sCisJLmNsb3NlCQkJPSBubTI1Nl9hdWRpb19jbG9zZSwKKwkub3V0cHV0X2Jsb2NrCQk9IG5tMjU2X2F1ZGlvX291dHB1dF9ibG9jaywKKwkuc3RhcnRfaW5wdXQJCT0gbm0yNTZfYXVkaW9fc3RhcnRfaW5wdXQsCisJLmlvY3RsCQkJPSBubTI1Nl9hdWRpb19pb2N0bCwKKwkucHJlcGFyZV9mb3JfaW5wdXQJPSBubTI1Nl9hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dCwKKwkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gbm0yNTZfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0LAorCS5oYWx0X2lvCQk9IG5tMjU2X2F1ZGlvX3Jlc2V0LAorCS5sb2NhbF9xbGVuCQk9IG5tMjU2X2F1ZGlvX2xvY2FsX3FsZW4sCit9OworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgbm0yNTZfcGNpX3RibFtdID0geworCXtQQ0lfVkVORE9SX0lEX05FT01BR0lDLCBQQ0lfREVWSUNFX0lEX05FT01BR0lDX05NMjU2QVZfQVVESU8sCisJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMH0sCisJe1BDSV9WRU5ET1JfSURfTkVPTUFHSUMsIFBDSV9ERVZJQ0VfSURfTkVPTUFHSUNfTk0yNTZaWF9BVURJTywKKwlQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCAwLCAwfSwKKwl7UENJX1ZFTkRPUl9JRF9ORU9NQUdJQywgUENJX0RFVklDRV9JRF9ORU9NQUdJQ19OTTI1NlhMX1BMVVNfQVVESU8sCisJUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMH0sCisJezAsfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNpLCBubTI1Nl9wY2lfdGJsKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgbm0yNTZfcGNpX2RyaXZlciA9IHsKKwkubmFtZQkJPSAibm0yNTZfYXVkaW8iLAorCS5pZF90YWJsZQk9IG5tMjU2X3BjaV90YmwsCisJLnByb2JlCQk9IG5tMjU2X3Byb2JlLAorCS5yZW1vdmUJCT0gbm0yNTZfcmVtb3ZlLAorfTsKKworbW9kdWxlX3BhcmFtKHVzZWNhY2hlLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbShidWZmZXJ0b3AsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obm0yNTZfZGVidWcsIGJvb2wsIDA2NDQpOworbW9kdWxlX3BhcmFtKGZvcmNlX2xvYWQsIGJvb2wsIDApOworCitzdGF0aWMgaW50IF9faW5pdCBkb19pbml0X25tMjU2KHZvaWQpCit7CisgICAgcHJpbnRrIChLRVJOX0lORk8gIk5lb01hZ2ljIDI1NkFWLzI1NlpYIGF1ZGlvIGRyaXZlciwgdmVyc2lvbiAxLjFwXG4iKTsKKyAgICByZXR1cm4gcGNpX21vZHVsZV9pbml0KCZubTI1Nl9wY2lfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfbm0yNTYgKHZvaWQpCit7CisgICAgcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZubTI1Nl9wY2lfZHJpdmVyKTsKKyAgICBwbV91bnJlZ2lzdGVyX2FsbCAoJmhhbmRsZV9wbV9ldmVudCk7Cit9CisKK21vZHVsZV9pbml0KGRvX2luaXRfbm0yNTYpOworbW9kdWxlX2V4aXQoY2xlYW51cF9ubTI1Nik7CisKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL25tMjU2X2NvZWZmLmggYi9zb3VuZC9vc3Mvbm0yNTZfY29lZmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2VlY2MyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL25tMjU2X2NvZWZmLmgKQEAgLTAsMCArMSw0Njk3IEBACisjaWZuZGVmIE5NMjU2X0NPRUZGX0gKKyNkZWZpbmUgTk0yNTZfQ09FRkZfSAorCisjZGVmaW5lIE5NX1RPVEFMX0NPRUZGX0NPVU5UIDB4MzE1OAorCitzdGF0aWMgY2hhciBjb2VmZmljaWVudHNbTk1fVE9UQUxfQ09FRkZfQ09VTlQgKiA0XSA9IHsgCisJMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QiwgMHhGRiwgMHhBNSwgMHgwMSwgMHhFRiwgMHhGQywgMHgyMSwKKwkweDA1LCAweDg3LCAweEY3LCAweDYyLCAweDExLCAweEU5LCAweDQ1LCAweDVFLCAweEY5LCAweEI1LCAweDAxLAorCTB4REUsIDB4RkYsIDB4QTQsIDB4RkYsIDB4NjAsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRCwgMHhGQywgMHhENiwgMHgwNiwKKwkweDRDLCAweEYzLCAweEVELCAweDIwLCAweDNELCAweDNELCAweDRBLCAweEYzLCAweDRFLCAweDA1LCAweEIxLAorCTB4RkQsIDB4RTEsIDB4MDAsIDB4QzMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHhBQSwgMHgwMSwgMHg3MSwgMHhGQywgMHgwNywgMHgwNywgMHg3RSwKKwkweEYxLCAweDQ0LCAweDMwLCAweDQ0LCAweDMwLCAweDdFLCAweEYxLCAweDA3LCAweDA3LCAweDcxLCAweEZDLAorCTB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDUsCisJMHgwMCwgMHhDMywgMHhGRiwgMHhFMSwgMHgwMCwgMHhCMSwgMHhGRCwgMHg0RSwgMHgwNSwgMHg0QSwgMHhGMywKKwkweDNELCAweDNELCAweEVELCAweDIwLCAweDRDLCAweEYzLCAweEQ2LCAweDA2LCAweDNELCAweEZDLCAweEU2LAorCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0EsIDB4RkYsCisJMHg2MCwgMHgwMCwgMHhBNCwgMHhGRiwgMHhERSwgMHhGRiwgMHhCNSwgMHgwMSwgMHg1RSwgMHhGOSwgMHhFOSwKKwkweDQ1LCAweDYyLCAweDExLCAweDg3LCAweEY3LCAweDIxLCAweDA1LCAweEVGLCAweEZDLCAweEE1LCAweDAxLAorCTB4NEIsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsCisJMHhGRiwgMHgxMSwgMHgwMSwgMHgzNCwgMHhGRSwgMHg4RiwgMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywKKwkweEY3LCAweDQ4LCAweEFFLCAweDAzLCAweEM3LCAweEZDLCAweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLAorCTB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsCisJMHhDQSwgMHgwMSwgMHg5NSwgMHhGQywgMHhFQSwgMHgwNSwgMHhCQiwgMHhGNSwgMHgyNSwgMHgxNywgMHgzQywKKwkweDQzLCAweDhELCAweEY2LCAweDQzLCAweDAzLCAweEY1LCAweEZFLCAweDI2LCAweDAwLCAweDIwLCAweDAwLAorCTB4RTIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEQsIDB4RkYsIDB4QzUsCisJMHgwMSwgMHg0QywgMHhGQywgMHgyNiwgMHgwNywgMHhBMywgMHhGMSwgMHhBQiwgMHgyQywgMHhCQiwgMHgzMywKKwkweDhGLCAweEYxLCAweENBLCAweDA2LCAweEE2LCAweEZDLCAweDg1LCAweDAxLCAweDZGLCAweEZGLCAweDI0LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RDUsIDB4RkYsIDB4QkMsIDB4MDAsCisJMHhGMCwgMHhGRCwgMHhFQywgMHgwNCwgMHhEOSwgMHhGMywgMHhCMSwgMHgzRSwgMHhDRCwgMHgxRSwgMHhDMSwKKwkweEYzLCAweEFGLCAweDA2LCAweDQ5LCAweEZDLCAweEU0LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTYsIDB4RkYsIDB4QkIsIDB4MDAsIDB4RTksIDB4RkUsIDB4MzgsCisJMHgwMSwgMHg0QiwgMHhGRiwgMHgyOCwgMHhGRSwgMHgzQSwgMHg0OCwgMHgwNCwgMHgwQSwgMHgyRSwgMHhGQSwKKwkweERGLCAweDAzLCAweDhBLCAweEZELCAweDYwLCAweDAxLCAweDY1LCAweEZGLCAweDI3LCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTAsIDB4RkYsIDB4OTgsIDB4MDEsIDB4MEQsIDB4RkQsCisJMHhFMCwgMHgwNCwgMHgxNCwgMHhGOCwgMHhDMywgMHgwRiwgMHg4OSwgMHg0NiwgMHg0QywgMHhGQSwgMHgzOCwKKwkweDAxLCAweDI1LCAweDAwLCAweDdELCAweEZGLCAweDczLCAweDAwLCAweEMyLCAweEZGLCAweDBGLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MEYsCisJMHgwNywgMHg4NCwgMHhGMiwgMHgyOSwgMHgyNSwgMHgxQSwgMHgzQSwgMHg2NywgMHhGMiwgMHhGNiwgMHgwNSwKKwkweDQxLCAweEZELCAweDI0LCAweDAxLCAweEExLCAweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MTUsIDB4MDAsIDB4OTcsIDB4RkYsIDB4MzcsIDB4MDEsIDB4MjIsIDB4RkQsIDB4MjMsIDB4MDYsCisJMHgyRiwgMHhGMiwgMHgxMSwgMHgzOSwgMHg3QiwgMHgyNiwgMHg1MCwgMHhGMiwgMHgxQiwgMHgwNywgMHgzMiwKKwkweEZDLCAweEUxLCAweDAxLCAweDNDLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLAorCTB4QzgsIDB4RkYsIDB4NjQsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RUUsIDB4RkYsIDB4OTgsIDB4MDEsIDB4OTMsCisJMHhGOSwgMHgxMCwgMHg0NiwgMHgwMywgMHgxMSwgMHhBNywgMHhGNywgMHgxMiwgMHgwNSwgMHhGNiwgMHhGQywKKwkweEEyLCAweDAxLCAweDRDLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LAorCTB4MDAsIDB4NkEsIDB4RkYsIDB4NTMsIDB4MDEsIDB4QTYsIDB4RkQsIDB4QTYsIDB4MDMsIDB4QTEsIDB4RkEsCisJMHhERSwgMHgwOCwgMHg3NiwgMHg0OCwgMHgwQywgMHhGRiwgMHhERSwgMHhGRSwgMHg3MywgMHgwMSwgMHhDOSwKKwkweEZFLCAweENBLCAweDAwLCAweEEwLCAweEZGLCAweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAorCTB4MzYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTIsIDB4RkMsIDB4OTMsIDB4MDYsIDB4MTAsIDB4RjQsIDB4NzgsCisJMHgxRCwgMHg5MCwgMHgzRiwgMHgzRSwgMHhGNCwgMHhBQSwgMHgwNCwgMHgxOSwgMHhGRSwgMHhBNCwgMHgwMCwKKwkweEUyLCAweEZGLCAweEZBLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY4LAorCTB4RkYsIDB4OTMsIDB4MDEsIDB4OTIsIDB4RkMsIDB4RTIsIDB4MDYsIDB4ODMsIDB4RjEsIDB4OEMsIDB4MzIsCisJMHhFRCwgMHgyRCwgMHg5MCwgMHhGMSwgMHgxRSwgMHgwNywgMHg1NywgMHhGQywgMHhCRCwgMHgwMSwgMHg1MSwKKwkweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU4LCAweEZGLCAweDEyLCAweDAwLAorCTB4NDIsIDB4MDAsIDB4QzQsIDB4RkUsIDB4OTQsIDB4MDMsIDB4MDIsIDB4RjYsIDB4ODksIDB4NDIsIDB4NzYsCisJMHgxOCwgMHg1QywgMHhGNSwgMHgxMiwgMHgwNiwgMHg4NCwgMHhGQywgMHhEMSwgMHgwMSwgMHgzQiwgMHhGRiwKKwkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDhBLCAweEZGLCAweDAzLCAweDAxLCAweDUzLAorCTB4RkUsIDB4NTMsIDB4MDIsIDB4MzksIDB4RkQsIDB4QTksIDB4MDIsIDB4RjIsIDB4NDgsIDB4QjksIDB4MDQsCisJMHg1NCwgMHhGQywgMHhDQSwgMHgwMiwgMHgxNiwgMHhGRSwgMHgyMCwgMHgwMSwgMHg3RiwgMHhGRiwgMHgyMCwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDQwLCAweEZGLCAweEMzLCAweDAxLAorCTB4QTcsIDB4RkMsIDB4QzAsIDB4MDUsIDB4MUUsIDB4RjYsIDB4RDgsIDB4MTUsIDB4RTcsIDB4NDMsIDB4MjAsCisJMHhGNywgMHhFRiwgMHgwMiwgMHgyNywgMHhGRiwgMHgwQSwgMHgwMCwgMHgyRSwgMHgwMCwgMHhERCwgMHhGRiwKKwkweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ4LCAweEZGLCAweENELCAweDAxLCAweDQzLAorCTB4RkMsIDB4MkEsIDB4MDcsIDB4QkMsIDB4RjEsIDB4NjQsIDB4MkIsIDB4RTMsIDB4MzQsIDB4QTMsIDB4RjEsCisJMHhBRSwgMHgwNiwgMHhCRCwgMHhGQywgMHg3NywgMHgwMSwgMHg3NywgMHhGRiwgMHgyMSwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweENBLCAweEZGLCAweEQ0LCAweDAwLCAweEM4LCAweEZELAorCTB4MkEsIDB4MDUsIDB4N0QsIDB4RjMsIDB4Q0EsIDB4M0QsIDB4MjIsIDB4MjAsIDB4NzYsIDB4RjMsIDB4QzgsCisJMHgwNiwgMHg0MSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDE0LCAweDAwLCAweEFDLCAweEZGLCAweEFDLCAweDAwLCAweDA4LCAweEZGLCAweEZELCAweDAwLCAweEI1LAorCTB4RkYsIDB4NEIsIDB4RkQsIDB4RjQsIDB4NDcsIDB4MzAsIDB4MEIsIDB4QkMsIDB4RjksIDB4MTcsIDB4MDQsCisJMHg2RSwgMHhGRCwgMHg2RCwgMHgwMSwgMHg2MCwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDJDLCAweDAwLCAweDU0LCAweEZGLCAweDhELCAweDAxLCAweDI2LCAweEZELCAweEFELCAweDA0LAorCTB4ODIsIDB4RjgsIDB4ODcsIDB4MEUsIDB4RjksIDB4NDYsIDB4MEMsIDB4RkIsIDB4RDQsIDB4MDAsIDB4NUQsCisJMHgwMCwgMHg1RSwgMHhGRiwgMHg4MiwgMHgwMCwgMHhCRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU1LCAweDAxLCAweDMzLCAweEZDLCAweDAxLCAweDA3LCAweEJFLAorCTB4RjIsIDB4RDYsIDB4MjMsIDB4MUYsIDB4M0IsIDB4QTUsIDB4RjIsIDB4QzUsIDB4MDUsIDB4NjIsIDB4RkQsCisJMHgxMCwgMHgwMSwgMHhBQiwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOSwKKwkweDAwLCAweDhFLCAweEZGLCAweDQ5LCAweDAxLCAweDA0LCAweEZELCAweDRELCAweDA2LCAweDAwLCAweEYyLAorCTB4RkUsIDB4MzcsIDB4Q0IsIDB4MjcsIDB4MjEsIDB4RjIsIDB4MjMsIDB4MDcsIDB4MzQsIDB4RkMsIDB4REQsCisJMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhDRSwgMHhGRiwKKwkweDU2LCAweDAwLCAweEI5LCAweEZGLCAweEI4LCAweEZGLCAweEY3LCAweDAxLCAweEUyLCAweEY4LCAweDhELAorCTB4NDUsIDB4NDYsIDB4MTIsIDB4M0MsIDB4RjcsIDB4NDMsIDB4MDUsIDB4REYsIDB4RkMsIDB4QUMsIDB4MDEsCisJMHg0OCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MCwKKwkweEZGLCAweDQ2LCAweDAxLCAweEMzLCAweEZELCAweDZELCAweDAzLCAweDE0LCAweEZCLCAweEJFLCAweDA3LAorCTB4QTYsIDB4NDgsIDB4RjgsIDB4RkYsIDB4NzAsIDB4RkUsIDB4QUUsIDB4MDEsIDB4QUEsIDB4RkUsIDB4RDksCisJMHgwMCwgMHg5QSwgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKKwkweERFLCAweDAxLCAweDVELCAweEZDLCAweDc0LCAweDA2LCAweDYzLCAweEY0LCAweDIzLCAweDFDLCAweDY2LAorCTB4NDAsIDB4QUEsIDB4RjQsIDB4NjUsIDB4MDQsIDB4NDQsIDB4RkUsIDB4OEIsIDB4MDAsIDB4RUUsIDB4RkYsCisJMHhGNSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2MSwgMHhGRiwgMHg5RiwKKwkweDAxLCAweDgwLCAweEZDLCAweEY3LCAweDA2LCAweDdELCAweEYxLCAweDVBLCAweDMxLCAweDJDLCAweDJGLAorCTB4ODMsIDB4RjEsIDB4MTMsIDB4MDcsIDB4NjQsIDB4RkMsIDB4QjMsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkMsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHg1RCwgMHgwMCwKKwkweDk1LCAweEZFLCAweEUyLCAweDAzLCAweDdGLCAweEY1LCAweENDLCAweDQxLCAweEM3LCAweDE5LCAweEZGLAorCTB4RjQsIDB4MzcsIDB4MDYsIDB4NzUsIDB4RkMsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MCwgMHhGRiwgMHhGNCwgMHgwMCwgMHg3MiwgMHhGRSwgMHgxOCwKKwkweDAyLCAweEFBLCAweEZELCAweEFCLCAweDAxLCAweERGLCAweDQ4LCAweENBLCAweDA1LCAweEUxLCAweEZCLAorCTB4MDUsIDB4MDMsIDB4RjcsIDB4RkQsIDB4MkUsIDB4MDEsIDB4NzksIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MywgMHhGRiwgMHhCQiwgMHgwMSwgMHhCQSwgMHhGQywKKwkweDk1LCAweDA1LCAweDgzLCAweEY2LCAweDhDLCAweDE0LCAweDg3LCAweDQ0LCAweEJCLCAweEY3LCAweDk4LAorCTB4MDIsIDB4NUEsIDB4RkYsIDB4RUUsIDB4RkYsIDB4M0MsIDB4MDAsIDB4RDgsIDB4RkYsIDB4MEEsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhEMywgMHgwMSwgMHgzQywgMHhGQywgMHgyQSwKKwkweDA3LCAweERDLCAweEYxLCAweDFBLCAweDJBLCAweDA2LCAweDM2LCAweEJFLCAweEYxLCAweDhFLCAweDA2LAorCTB4RDUsIDB4RkMsIDB4NjcsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsCisJMHgwMCwgMHgwNywgMHgwMCwgMHhCRSwgMHhGRiwgMHhFQSwgMHgwMCwgMHhBMiwgMHhGRCwgMHg2NSwgMHgwNSwKKwkweDI4LCAweEYzLCAweERCLCAweDNDLCAweDc4LCAweDIxLCAweDMwLCAweEYzLCAweERGLCAweDA2LCAweDNBLAorCTB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsCisJMHhCMiwgMHhGRiwgMHg5RCwgMHgwMCwgMHgyNywgMHhGRiwgMHhDMywgMHgwMCwgMHgxRiwgMHgwMCwgMHg3NiwKKwkweEZDLCAweEEzLCAweDQ3LCAweDYwLCAweDBDLCAweDRBLCAweEY5LCAweDRFLCAweDA0LCAweDUzLCAweEZELAorCTB4NzksIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsCisJMHgwMCwgMHg1OCwgMHhGRiwgMHg4MiwgMHgwMSwgMHgzRiwgMHhGRCwgMHg3OCwgMHgwNCwgMHhGMiwgMHhGOCwKKwkweDUwLCAweDBELCAweDVFLCAweDQ3LCAweEQ1LCAweEZCLCAweDZGLCAweDAwLCAweDk2LCAweDAwLCAweDQwLAorCTB4RkYsIDB4OTEsIDB4MDAsIDB4QjcsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNiwgMHhGQywgMHhFRiwgMHgwNiwgMHhGQywgMHhGMiwgMHg4MSwKKwkweDIyLCAweDFDLCAweDNDLCAweEVDLCAweEYyLCAweDkwLCAweDA1LCAweDg1LCAweEZELCAweEZCLCAweDAwLAorCTB4QjYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4ODUsCisJMHhGRiwgMHg1QiwgMHgwMSwgMHhFOSwgMHhGQywgMHg3MywgMHgwNiwgMHhEOCwgMHhGMSwgMHhFNSwgMHgzNiwKKwkweDE5LCAweDI5LCAweEY4LCAweEYxLCAweDI5LCAweDA3LCAweDM3LCAweEZDLCAweEQ4LCAweDAxLCAweDQyLAorCTB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NDcsIDB4MDAsCisJMHhENywgMHhGRiwgMHg4MiwgMHhGRiwgMHg1MywgMHgwMiwgMHgzOSwgMHhGOCwgMHhGRCwgMHg0NCwgMHg4RCwKKwkweDEzLCAweEQzLCAweEY2LCAweDcyLCAweDA1LCAweENBLCAweEZDLCAweEI1LCAweDAxLCAweDQ1LCAweEZGLAorCTB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzUsIDB4RkYsIDB4MzksCisJMHgwMSwgMHhFMCwgMHhGRCwgMHgzMywgMHgwMywgMHg4NywgMHhGQiwgMHhBMiwgMHgwNiwgMHhDQiwgMHg0OCwKKwkweEVBLCAweDAwLCAweDAxLCAweEZFLCAweEU5LCAweDAxLCAweDhBLCAweEZFLCAweEU4LCAweDAwLCAweDk1LAorCTB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REEsIDB4MDEsCisJMHg2QSwgMHhGQywgMHg1MywgMHgwNiwgMHhCQSwgMHhGNCwgMHhDRSwgMHgxQSwgMHgzMiwgMHg0MSwgMHgxRiwKKwkweEY1LCAweDFELCAweDA0LCAweDcxLCAweEZFLCAweDcxLCAweDAwLCAweEZCLCAweEZGLCAweEYwLCAweEZGLAorCTB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4NUIsIDB4RkYsIDB4QUIsIDB4MDEsIDB4NkYsCisJMHhGQywgMHgwOCwgMHgwNywgMHg3RSwgMHhGMSwgMHgyMSwgMHgzMCwgMHg2NywgMHgzMCwgMHg3RCwgMHhGMSwKKwkweDA1LCAweDA3LCAweDczLCAweEZDLCAweEE4LCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweEZELAorCTB4RkYsIDB4MDUsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NzcsIDB4MDAsIDB4NjcsIDB4RkUsCisJMHgyRCwgMHgwNCwgMHgwNCwgMHhGNSwgMHgwNywgMHg0MSwgMHgxQiwgMHgxQiwgMHhBNiwgMHhGNCwgMHg1QSwKKwkweDA2LCAweDY3LCAweEZDLCAweERCLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLAorCTB4MUEsIDB4MDAsIDB4OTYsIDB4RkYsIDB4RTUsIDB4MDAsIDB4OTEsIDB4RkUsIDB4REMsIDB4MDEsIDB4MUEsCisJMHhGRSwgMHhCMywgMHgwMCwgMHhDMywgMHg0OCwgMHhFMSwgMHgwNiwgMHg2RSwgMHhGQiwgMHg0MCwgMHgwMywKKwkweERBLCAweEZELCAweDNDLCAweDAxLCAweDc0LCAweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjMsIDB4MDEsIDB4Q0YsIDB4RkMsIDB4NjcsIDB4MDUsCisJMHhFQSwgMHhGNiwgMHg0NCwgMHgxMywgMHgxRSwgMHg0NSwgMHg1RSwgMHhGOCwgMHgzRiwgMHgwMiwgMHg4RSwKKwkweEZGLCAweEQwLCAweEZGLCAweDRBLCAweDAwLCAweEQyLCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLAorCTB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4RDksIDB4MDEsIDB4MzYsIDB4RkMsIDB4MjgsIDB4MDcsIDB4MDEsCisJMHhGMiwgMHhDRSwgMHgyOCwgMHgyMywgMHgzNywgMHhFMCwgMHhGMSwgMHg2QiwgMHgwNiwgMHhFRiwgMHhGQywKKwkweDU3LCAweDAxLCAweDg3LCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBCLAorCTB4MDAsIDB4QjQsIDB4RkYsIDB4MDAsIDB4MDEsIDB4N0UsIDB4RkQsIDB4OUMsIDB4MDUsIDB4REMsIDB4RjIsCisJMHhFNCwgMHgzQiwgMHhDRCwgMHgyMiwgMHhFRSwgMHhGMiwgMHhGMywgMHgwNiwgMHgzNSwgMHhGQywgMHhFNiwKKwkweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDExLCAweDAwLCAweEI4LCAweEZGLAorCTB4OEUsIDB4MDAsIDB4NDYsIDB4RkYsIDB4OEEsIDB4MDAsIDB4ODYsIDB4MDAsIDB4QTcsIDB4RkIsIDB4NDgsCisJMHg0NywgMHg5NSwgMHgwRCwgMHhEOSwgMHhGOCwgMHg4NCwgMHgwNCwgMHgzOSwgMHhGRCwgMHg4NSwgMHgwMSwKKwkweDU3LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVELAorCTB4RkYsIDB4NzYsIDB4MDEsIDB4NTksIDB4RkQsIDB4NDIsIDB4MDQsIDB4NjMsIDB4RjksIDB4MUMsIDB4MEMsCisJMHhCNiwgMHg0NywgMHhBNCwgMHhGQywgMHgwNywgMHgwMCwgMHhEMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhBMCwKKwkweDAwLCAweEIxLCAweEZGLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLAorCTB4RTYsIDB4MDEsIDB4M0IsIDB4RkMsIDB4REEsIDB4MDYsIDB4M0YsIDB4RjMsIDB4MkMsIDB4MjEsIDB4MTEsCisJMHgzRCwgMHgzQSwgMHhGMywgMHg1OCwgMHgwNSwgMHhBQSwgMHhGRCwgMHhFNSwgMHgwMCwgMHhDMSwgMHhGRiwKKwkweDA2LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFGLCAweDAwLCAweDdELCAweEZGLCAweDZCLAorCTB4MDEsIDB4Q0YsIDB4RkMsIDB4OTYsIDB4MDYsIDB4QjcsIDB4RjEsIDB4QzYsIDB4MzUsIDB4NjQsIDB4MkEsCisJMHhENCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRCwgMHhGQywgMHhEMiwgMHgwMSwgMHg0NSwgMHhGRiwgMHgzMiwKKwkweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweEQ5LCAweEZGLCAweDM5LCAweDAwLCAweEY0LCAweEZGLAorCTB4NEUsIDB4RkYsIDB4QUMsIDB4MDIsIDB4OTgsIDB4RjcsIDB4NjUsIDB4NDQsIDB4RDYsIDB4MTQsIDB4NkMsCisJMHhGNiwgMHg5RiwgMHgwNSwgMHhCNiwgMHhGQywgMHhCRCwgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwKKwkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdBLCAweEZGLCAweDJCLCAweDAxLCAweEZFLAorCTB4RkQsIDB4RjgsIDB4MDIsIDB4RkIsIDB4RkIsIDB4OEQsIDB4MDUsIDB4RTUsIDB4NDgsIDB4RTMsIDB4MDEsCisJMHg5MSwgMHhGRCwgMHgyNSwgMHgwMiwgMHg2QiwgMHhGRSwgMHhGNywgMHgwMCwgMHg4RiwgMHhGRiwgMHgxQywKKwkweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ1LCAweDAxLCAweDc4LCAweEZDLAorCTB4MkYsIDB4MDYsIDB4MTMsIDB4RjUsIDB4N0MsIDB4MTksIDB4RjcsIDB4NDEsIDB4OUIsIDB4RjUsIDB4RDEsCisJMHgwMywgMHg5RiwgMHhGRSwgMHg1NywgMHgwMCwgMHgwOCwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwgMHgwMCwKKwkweEZELCAweEZGLCAweDJELCAweDAwLCAweDU1LCAweEZGLCAweEI1LCAweDAxLCAweDYxLCAweEZDLCAweDE2LAorCTB4MDcsIDB4ODUsIDB4RjEsIDB4RTYsIDB4MkUsIDB4OUUsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjMsIDB4MDYsCisJMHg4NCwgMHhGQywgMHg5RCwgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwKKwkweDAwLCAweEY2LCAweEZGLCAweEVCLCAweEZGLCAweDkxLCAweDAwLCAweDNCLCAweEZFLCAweDc1LCAweDA0LAorCTB4OTIsIDB4RjQsIDB4MzYsIDB4NDAsIDB4NkUsIDB4MUMsIDB4NTAsIDB4RjQsIDB4N0IsIDB4MDYsIDB4NUIsCisJMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOCwgMHgwMCwKKwkweDlDLCAweEZGLCAweEQ2LCAweDAwLCAweEIxLCAweEZFLCAweEExLCAweDAxLCAweDg5LCAweEZFLCAweEMzLAorCTB4RkYsIDB4OUMsIDB4NDgsIDB4RkQsIDB4MDcsIDB4RkEsIDB4RkEsIDB4N0EsIDB4MDMsIDB4QkMsIDB4RkQsCisJMHg0OSwgMHgwMSwgMHg2RSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwKKwkweDAwLCAweDQ5LCAweEZGLCAweEFBLCAweDAxLCAweEU0LCAweEZDLCAweDM4LCAweDA1LCAweDU0LCAweEY3LAorCTB4RkUsIDB4MTEsIDB4QUEsIDB4NDUsIDB4MDksIDB4RjksIDB4RTIsIDB4MDEsIDB4QzQsIDB4RkYsIDB4QjMsCisJMHhGRiwgMHg1OSwgMHgwMCwgMHhDRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweDNFLCAweEZGLCAweERFLCAweDAxLCAweDMzLCAweEZDLCAweDIyLCAweDA3LCAweDJCLCAweEYyLCAweDgwLAorCTB4MjcsIDB4M0IsIDB4MzgsIDB4MEEsIDB4RjIsIDB4NDQsIDB4MDYsIDB4MEIsIDB4RkQsIDB4NDUsIDB4MDEsCisJMHg5MCwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhBOSwKKwkweEZGLCAweDE1LCAweDAxLCAweDVCLCAweEZELCAweEQwLCAweDA1LCAweDk3LCAweEYyLCAweEU2LCAweDNBLAorCTB4MjEsIDB4MjQsIDB4QjEsIDB4RjIsIDB4MDQsIDB4MDcsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzksCisJMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCRSwgMHhGRiwgMHg3RiwgMHgwMCwKKwkweDY1LCAweEZGLCAweDUxLCAweDAwLCAweEVCLCAweDAwLCAweEUxLCAweEZBLCAweEUxLCAweDQ2LCAweENELAorCTB4MEUsIDB4NkEsIDB4RjgsIDB4QjgsIDB4MDQsIDB4MjAsIDB4RkQsIDB4OTAsIDB4MDEsIDB4NTMsIDB4RkYsCisJMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MiwgMHhGRiwgMHg2QSwKKwkweDAxLCAweDc0LCAweEZELCAweDBBLCAweDA0LCAweEQ1LCAweEY5LCAweEVELCAweDBBLCAweDAzLCAweDQ4LAorCTB4N0MsIDB4RkQsIDB4OUUsIDB4RkYsIDB4MEEsIDB4MDEsIDB4MDEsIDB4RkYsIDB4QUYsIDB4MDAsIDB4QUIsCisJMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwKKwkweDQyLCAweEZDLCAweEMzLCAweDA2LCAweDg3LCAweEYzLCAweEQ3LCAweDFGLCAweEZFLCAweDNELCAweDkxLAorCTB4RjMsIDB4MUQsIDB4MDUsIDB4RDEsIDB4RkQsIDB4Q0UsIDB4MDAsIDB4Q0MsIDB4RkYsIDB4MDIsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwgMHgwMCwgMHg3NSwgMHhGRiwgMHg3QSwgMHgwMSwgMHhCOCwKKwkweEZDLCAweEI0LCAweDA2LCAweDlFLCAweEYxLCAweEEyLCAweDM0LCAweEFELCAweDJCLCAweEI2LCAweEYxLAorCTB4MjksIDB4MDcsIDB4NDUsIDB4RkMsIDB4Q0IsIDB4MDEsIDB4NDksIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwOSwgMHgwMCwgMHhERSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgxMSwgMHgwMCwgMHgxQiwgMHhGRiwKKwkweDAyLCAweDAzLCAweEZFLCAweEY2LCAweEMzLCAweDQzLCAweDIyLCAweDE2LCAweDA3LCAweEY2LCAweENBLAorCTB4MDUsIDB4QTMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg4MCwgMHhGRiwgMHgxQywgMHgwMSwgMHgxQywgMHhGRSwgMHhCRCwKKwkweDAyLCAweDZFLCAweEZDLCAweDdELCAweDA0LCAweEYzLCAweDQ4LCAweEUyLCAweDAyLCAweDFGLCAweEZELAorCTB4NjAsIDB4MDIsIDB4NEMsIDB4RkUsIDB4MDYsIDB4MDEsIDB4ODksIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwgMHhDRiwgMHgwMSwgMHg4OCwgMHhGQywgMHgwOSwgMHgwNiwKKwkweDcxLCAweEY1LCAweDJCLCAweDE4LCAweEIyLCAweDQyLCAweDIwLCAweEY2LCAweDgzLCAweDAzLCAweENGLAorCTB4RkUsIDB4M0MsIDB4MDAsIDB4MTUsIDB4MDAsIDB4RTYsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhCRiwgMHgwMSwgMHg1NCwgMHhGQywgMHgyMCwgMHgwNywgMHg5NCwKKwkweEYxLCAweEE2LCAweDJELCAweEQwLCAweDMyLCAweDg1LCAweEYxLCAweERELCAweDA2LCAweDk2LCAweEZDLAorCTB4OTAsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkIsCisJMHhGRiwgMHhERiwgMHhGRiwgMHhBOSwgMHgwMCwgMHgxMCwgMHhGRSwgMHhCOSwgMHgwNCwgMHgyNywgMHhGNCwKKwkweDVFLCAweDNGLCAweEMzLCAweDFELCAweEZFLCAweEYzLCAweDk5LCAweDA2LCAweDUwLCAweEZDLCAweEUyLAorCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTIsIDB4RkYsCisJMHhDNywgMHgwMCwgMHhEMCwgMHhGRSwgMHg2NSwgMHgwMSwgMHhGNiwgMHhGRSwgMHhEOSwgMHhGRSwgMHg2QSwKKwkweDQ4LCAweDFGLCAweDA5LCAweDg3LCAweEZBLCAweEIzLCAweDAzLCAweEEwLCAweEZELCAweDU2LCAweDAxLAorCTB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEQsCisJMHhGRiwgMHhBMCwgMHgwMSwgMHhGQiwgMHhGQywgMHgwNywgMHgwNSwgMHhCRiwgMHhGNywgMHhCQiwgMHgxMCwKKwkweDJCLCAweDQ2LCAweEJCLCAweEY5LCAweDgzLCAweDAxLCAweEZBLCAweEZGLCAweDk1LCAweEZGLCAweDY4LAorCTB4MDAsIDB4QzcsIDB4RkYsIDB4MEUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsCisJMHhFMSwgMHgwMSwgMHgzMSwgMHhGQywgMHgxOSwgMHgwNywgMHg1QiwgMHhGMiwgMHgzMCwgMHgyNiwgMHg0QiwKKwkweDM5LCAweDNCLCAweEYyLCAweDFBLCAweDA2LCAweDI5LCAweEZELCAweDMzLCAweDAxLCAweDk5LCAweEZGLAorCTB4MTUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4OUYsIDB4RkYsIDB4MjgsCisJMHgwMSwgMHgzQSwgMHhGRCwgMHgwMCwgMHgwNiwgMHg1QSwgMHhGMiwgMHhERiwgMHgzOSwgMHg3MywgMHgyNSwKKwkweDc5LCAweEYyLCAweDEyLCAweDA3LCAweDMxLCAweEZDLCAweEUzLCAweDAxLCAweDNCLCAweEZGLCAweDM1LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzQsIDB4RkYsIDB4NzAsIDB4MDAsIDB4ODQsIDB4RkYsCisJMHgxOSwgMHgwMCwgMHg0RCwgMHgwMSwgMHgyMiwgMHhGQSwgMHg3MCwgMHg0NiwgMHgwQSwgMHgxMCwgMHhGQywKKwkweEY3LCAweEVCLCAweDA0LCAweDA4LCAweEZELCAweDlBLCAweDAxLCAweDRGLCAweEZGLCAweDJFLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4NUUsIDB4MDEsIDB4OTAsCisJMHhGRCwgMHhEMiwgMHgwMywgMHg0NywgMHhGQSwgMHhDMywgMHgwOSwgMHg0OCwgMHg0OCwgMHg1QSwgMHhGRSwKKwkweDMzLCAweEZGLCAweDQ1LCAweDAxLCAweEUyLCAweEZFLCAweEJFLCAweDAwLCAweEE1LCAweEZGLCAweDE2LAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEIsIDB4RkMsCisJMHhBOSwgMHgwNiwgMHhEMiwgMHhGMywgMHg4MSwgMHgxRSwgMHhFNCwgMHgzRSwgMHhFRiwgMHhGMywgMHhERSwKKwkweDA0LCAweEY5LCAweEZELCAweEI3LCAweDAwLCAweEQ4LCAweEZGLCAweEZELCAweEZGLCAweDAzLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4NkQsIDB4RkYsIDB4ODgsIDB4MDEsIDB4QTIsIDB4RkMsIDB4RDAsCisJMHgwNiwgMHg4QywgMHhGMSwgMHg3OCwgMHgzMywgMHhGMiwgMHgyQywgMHg5RSwgMHhGMSwgMHgyNCwgMHgwNywKKwkweDRFLCAweEZDLCAweEMzLCAweDAxLCAweDRFLCAweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweDA4LAorCTB4MDAsIDB4RTQsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MkQsIDB4MDAsIDB4RUEsIDB4RkUsIDB4NTYsIDB4MDMsCisJMHg2RCwgMHhGNiwgMHgxNywgMHg0MywgMHg3MCwgMHgxNywgMHhBNiwgMHhGNSwgMHhGMywgMHgwNSwgMHg5MSwKKwkweEZDLCAweENDLCAweDAxLCAweDNELCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLAorCTB4ODYsIDB4RkYsIDB4MEUsIDB4MDEsIDB4M0IsIDB4RkUsIDB4ODIsIDB4MDIsIDB4RTAsIDB4RkMsIDB4NzMsCisJMHgwMywgMHhGNiwgMHg0OCwgMHhFOSwgMHgwMywgMHhBRCwgMHhGQywgMHg5QywgMHgwMiwgMHgyRCwgMHhGRSwKKwkweDE0LCAweDAxLCAweDgzLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLAorCTB4MDAsIDB4M0UsIDB4RkYsIDB4QzksIDB4MDEsIDB4OTksIDB4RkMsIDB4RTEsIDB4MDUsIDB4RDEsIDB4RjUsCisJMHhEQywgMHgxNiwgMHg2NSwgMHg0MywgMHhBRCwgMHhGNiwgMHgzMSwgMHgwMywgMHgwMCwgMHhGRiwgMHgyMCwKKwkweDAwLCAweDIzLCAweDAwLCAweEUxLCAweEZGLCAweDA4LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLAorCTB4NEMsIDB4RkYsIDB4QzcsIDB4MDEsIDB4NEEsIDB4RkMsIDB4MjcsIDB4MDcsIDB4QTgsIDB4RjEsIDB4NjIsCisJMHgyQywgMHhGRCwgMHgzMywgMHg5MywgMHhGMSwgMHhDNCwgMHgwNiwgMHhBQiwgMHhGQywgMHg4MiwgMHgwMSwKKwkweDcxLCAweEZGLCAweDIzLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweEZGLCAweEZGLCAweEQzLAorCTB4RkYsIDB4QzEsIDB4MDAsIDB4RTcsIDB4RkQsIDB4RkEsIDB4MDQsIDB4QzQsIDB4RjMsIDB4N0UsIDB4M0UsCisJMHgxOSwgMHgxRiwgMHhCMCwgMHhGMywgMHhCNSwgMHgwNiwgMHg0NywgMHhGQywgMHhFNCwgMHgwMSwgMHgzNiwKKwkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE1LCAweDAwLCAweEE4LCAweEZGLCAweEI4LCAweDAwLAorCTB4RjAsIDB4RkUsIDB4MkIsIDB4MDEsIDB4NjMsIDB4RkYsIDB4RjYsIDB4RkQsIDB4MkMsIDB4NDgsIDB4NDcsCisJMHgwQSwgMHgxNCwgMHhGQSwgMHhFQiwgMHgwMywgMHg4NCwgMHhGRCwgMHg2MywgMHgwMSwgMHg2NCwgMHhGRiwKKwkweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUxLCAweEZGLCAweDk2LAorCTB4MDEsIDB4MTMsIDB4RkQsIDB4RDUsIDB4MDQsIDB4MkMsIDB4RjgsIDB4N0QsIDB4MEYsIDB4QTMsIDB4NDYsCisJMHg3NiwgMHhGQSwgMHgyMiwgMHgwMSwgMHgzMiwgMHgwMCwgMHg3NiwgMHhGRiwgMHg3NiwgMHgwMCwgMHhDMSwKKwkweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDNBLCAweEZGLCAweEU0LCAweDAxLAorCTB4MzIsIDB4RkMsIDB4MEMsIDB4MDcsIDB4OTEsIDB4RjIsIDB4REQsIDB4MjQsIDB4NTQsIDB4M0EsIDB4NzQsCisJMHhGMiwgMHhFQiwgMHgwNSwgMHg0OSwgMHhGRCwgMHgyMCwgMHgwMSwgMHhBMywgMHhGRiwgMHgxMSwgMHgwMCwKKwkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE2LCAweDAwLCAweDk1LCAweEZGLCAweDNCLCAweDAxLCAweDFCLAorCTB4RkQsIDB4MkQsIDB4MDYsIDB4MjQsIDB4RjIsIDB4RDMsIDB4MzgsIDB4QzYsIDB4MjYsIDB4NDUsIDB4RjIsCisJMHgxRCwgMHgwNywgMHgzMiwgMHhGQywgMHhFMCwgMHgwMSwgMHgzRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDBELCAweDAwLCAweEM5LCAweEZGLCAweDYxLCAweDAwLCAweEEyLCAweEZGLCAweEUyLCAweEZGLAorCTB4QUUsIDB4MDEsIDB4NkIsIDB4RjksIDB4RjIsIDB4NDUsIDB4NEEsIDB4MTEsIDB4OEYsIDB4RjcsIDB4MUQsCisJMHgwNSwgMHhGMSwgMHhGQywgMHhBNCwgMHgwMSwgMHg0QiwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZDLCAweEZGLCAweDUxLCAweDAxLCAweEFDLCAweEZELCAweDlBLAorCTB4MDMsIDB4QkEsIDB4RkEsIDB4OUUsIDB4MDgsIDB4ODEsIDB4NDgsIDB4NDAsIDB4RkYsIDB4QzYsIDB4RkUsCisJMHg4MCwgMHgwMSwgMHhDMiwgMHhGRSwgMHhDRSwgMHgwMCwgMHg5RiwgMHhGRiwgMHgxNywgMHgwMCwgMHhGRSwKKwkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEUxLCAweDAxLCAweDU1LCAweEZDLCAweDhDLCAweDA2LAorCTB4MjIsIDB4RjQsIDB4MkMsIDB4MUQsIDB4QzAsIDB4M0YsIDB4NTUsIDB4RjQsIDB4OUIsIDB4MDQsIDB4MjMsCisJMHhGRSwgMHg5RiwgMHgwMCwgMHhFNCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDk2LCAweDAxLCAweDhFLCAweEZDLCAweEU3LCAweDA2LCAweDgxLAorCTB4RjEsIDB4NDgsIDB4MzIsIDB4MzQsIDB4MkUsIDB4OEQsIDB4RjEsIDB4MUMsIDB4MDcsIDB4NUEsIDB4RkMsCisJMHhCQiwgMHgwMSwgMHg1MywgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFOSwKKwkweEZGLCAweDBGLCAweDAwLCAweDQ4LCAweDAwLCAweEI5LCAweEZFLCAweEE2LCAweDAzLCAweEU0LCAweEY1LAorCTB4NjAsIDB4NDIsIDB4QzEsIDB4MTgsIDB4NDcsIDB4RjUsIDB4MUEsIDB4MDYsIDB4ODEsIDB4RkMsIDB4RDIsCisJMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4QiwgMHhGRiwKKwkweEZGLCAweDAwLCAweDVBLCAweEZFLCAweDQ2LCAweDAyLCAweDUyLCAweEZELCAweDcwLCAweDAyLCAweEVELAorCTB4NDgsIDB4RjUsIDB4MDQsIDB4M0IsIDB4RkMsIDB4RDcsIDB4MDIsIDB4MEYsIDB4RkUsIDB4MjMsIDB4MDEsCisJMHg3RSwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwKKwkweEZGLCAweEMxLCAweDAxLCAweEFCLCAweEZDLCAweEI3LCAweDA1LCAweDM0LCAweEY2LCAweDhFLCAweDE1LAorCTB4MEIsIDB4NDQsIDB4NDIsIDB4RjcsIDB4REMsIDB4MDIsIDB4MzIsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MzEsCisJMHgwMCwgMHhEQywgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NywgMHhGRiwKKwkweENFLCAweDAxLCAweDQxLCAweEZDLCAweDJBLCAweDA3LCAweEMyLCAweEYxLCAweDFCLCAweDJCLCAweDI1LAorCTB4MzUsIDB4QTgsIDB4RjEsIDB4QTcsIDB4MDYsIDB4QzIsIDB4RkMsIDB4NzQsIDB4MDEsIDB4NzgsIDB4RkYsCisJMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhDNywgMHhGRiwgMHhEOSwKKwkweDAwLCAweEJGLCAweEZELCAweDM4LCAweDA1LCAweDY5LCAweEYzLCAweDk2LCAweDNELCAweDZGLCAweDIwLAorCTB4NjYsIDB4RjMsIDB4Q0UsIDB4MDYsIDB4M0YsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBRSwgMHhGRiwgMHhBOSwgMHgwMCwgMHgwRiwgMHhGRiwKKwkweEYwLCAweDAwLCAweENELCAweEZGLCAweDFCLCAweEZELCAweEU0LCAweDQ3LCAweDczLCAweDBCLCAweEEyLAorCTB4RjksIDB4MjMsIDB4MDQsIDB4NjgsIDB4RkQsIDB4NzAsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NSwgMHhGRiwgMHg4QiwgMHgwMSwgMHgyQiwKKwkweEZELCAweEExLCAweDA0LCAweDlCLCAweEY4LCAweDQyLCAweDBFLCAweDBGLCAweDQ3LCAweDM4LCAweEZCLAorCTB4QkUsIDB4MDAsIDB4NkEsIDB4MDAsIDB4NTgsIDB4RkYsIDB4ODUsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MTAsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNCwgMHhGQywKKwkweEZELCAweDA2LCAweENCLCAweEYyLCAweDhBLCAweDIzLCAweDU4LCAweDNCLCAweEI0LCAweEYyLCAweEJBLAorCTB4MDUsIDB4NkEsIDB4RkQsIDB4MEIsIDB4MDEsIDB4QUUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgxOSwgMHgwMCwgMHg4QywgMHhGRiwgMHg0RCwgMHgwMSwgMHhGRSwgMHhGQywgMHg1NiwKKwkweDA2LCAweEY3LCAweEYxLCAweEJGLCAweDM3LCAweDE1LCAweDI4LCAweDE4LCAweEYyLCAweDI1LCAweDA3LAorCTB4MzQsIDB4RkMsIDB4REMsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsCisJMHgwMCwgMHhDRiwgMHhGRiwgMHg1MiwgMHgwMCwgMHhDMCwgMHhGRiwgMHhBQywgMHhGRiwgMHgwQywgMHgwMiwKKwkweEJDLCAweEY4LCAweDZELCAweDQ1LCAweDhFLCAweDEyLCAweDI0LCAweEY3LCAweDRELCAweDA1LCAweERCLAorCTB4RkMsIDB4QUUsIDB4MDEsIDB4NDgsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgyNCwgMHgwMCwgMHg3MSwgMHhGRiwgMHg0MywgMHgwMSwgMHhDOSwgMHhGRCwgMHg2MCwgMHgwMywgMHgyRSwKKwkweEZCLCAweDdFLCAweDA3LCAweEFGLCAweDQ4LCAweDJELCAweDAwLCAweDU4LCAweEZFLCAweEJCLCAweDAxLAorCTB4QTMsIDB4RkUsIDB4REQsIDB4MDAsIDB4OTksIDB4RkYsIDB4MTksIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzNywgMHhGRiwgMHhERCwgMHgwMSwgMHg2MCwgMHhGQywgMHg2RCwgMHgwNiwgMHg3NiwgMHhGNCwKKwkweEQ4LCAweDFCLCAweDk1LCAweDQwLCAweEMzLCAweEY0LCAweDU2LCAweDA0LCAweDRFLCAweEZFLCAweDg1LAorCTB4MDAsIDB4RjEsIDB4RkYsIDB4RjQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsCisJMHg2MCwgMHhGRiwgMHhBMiwgMHgwMSwgMHg3QywgMHhGQywgMHhGQiwgMHgwNiwgMHg3QywgMHhGMSwgMHgxNSwKKwkweDMxLCAweDczLCAweDJGLCAweDgxLCAweEYxLCAweDEwLCAweDA3LCAweDY3LCAweEZDLCAweEIxLCAweDAxLAorCTB4NTgsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUUsIDB4RkYsIDB4MDIsCisJMHgwMCwgMHg2MywgMHgwMCwgMHg4QSwgMHhGRSwgMHhGMywgMHgwMywgMHg2MywgMHhGNSwgMHhBMSwgMHg0MSwKKwkweDEyLCAweDFBLCAweEVCLCAweEY0LCAweDNGLCAweDA2LCAweDcyLCAweEZDLCAweEQ3LCAweDAxLCAweDM5LAorCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4RjEsIDB4MDAsCisJMHg3OSwgMHhGRSwgMHgwQSwgMHgwMiwgMHhDMywgMHhGRCwgMHg3MywgMHgwMSwgMHhEQiwgMHg0OCwgMHgwNywKKwkweDA2LCAweEM3LCAweEZCLCAweDEyLCAweDAzLCAweEYxLCAweEZELCAweDMxLCAweDAxLCAweDc4LCAweEZGLAorCTB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDMsIDB4RkYsIDB4QkEsCisJMHgwMSwgMHhCRiwgMHhGQywgMHg4QiwgMHgwNSwgMHg5OSwgMHhGNiwgMHg0MywgMHgxNCwgMHhBOSwgMHg0NCwKKwkweERFLCAweEY3LCAweDg1LCAweDAyLCAweDY1LCAweEZGLCAweEU3LCAweEZGLCAweDNGLCAweDAwLCAweEQ2LAorCTB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsIDB4RDUsIDB4MDEsCisJMHgzQSwgMHhGQywgMHgyQSwgMHgwNywgMHhFMywgMHhGMSwgMHhEMSwgMHgyOSwgMHg0NiwgMHgzNiwgMHhDNSwKKwkweEYxLCAweDg3LCAweDA2LCAweERBLCAweEZDLCAweDY0LCAweDAxLCAweDgwLCAweEZGLCAweDFFLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkMsIDB4RkYsIDB4RUYsIDB4MDAsIDB4OUEsCisJMHhGRCwgMHg3MiwgMHgwNSwgMHgxNiwgMHhGMywgMHhBNSwgMHgzQywgMHhDNCwgMHgyMSwgMHgyMSwgMHhGMywKKwkweEU0LCAweDA2LCAweDM5LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELAorCTB4RkYsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkUsIDB4RkYsIDB4QjYsIDB4MDAsCisJMHgzNiwgMHgwMCwgMHg0NywgMHhGQywgMHg5MCwgMHg0NywgMHhBNCwgMHgwQywgMHgzMSwgMHhGOSwgMHg1QSwKKwkweDA0LCAweDRFLCAweEZELCAweDdDLCAweDAxLCAweDVCLCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4ODAsIDB4MDEsIDB4NDUsIDB4RkQsIDB4NkMsCisJMHgwNCwgMHgwQiwgMHhGOSwgMHgwQiwgMHgwRCwgMHg3MywgMHg0NywgMHgwMiwgMHhGQywgMHg1OCwgMHgwMCwKKwkweEEzLCAweDAwLCAweDM5LCAweEZGLCAweDk0LCAweDAwLCAweEI1LCAweEZGLCAweDEyLCAweDAwLCAweEZELAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkMsIDB4RUIsIDB4MDYsCisJMHgwQiwgMHhGMywgMHgzNSwgMHgyMiwgMHg1MiwgMHgzQywgMHhGRCwgMHhGMiwgMHg4NCwgMHgwNSwgMHg4RCwKKwkweEZELCAweEY2LCAweDAwLCAweEI4LCAweEZGLCAweDA5LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLAorCTB4MUQsIDB4MDAsIDB4ODMsIDB4RkYsIDB4NUUsIDB4MDEsIDB4RTMsIDB4RkMsIDB4N0IsIDB4MDYsIDB4RDAsCisJMHhGMSwgMHhBNSwgMHgzNiwgMHg2MiwgMHgyOSwgMHhFRiwgMHhGMSwgMHgyOSwgMHgwNywgMHgzOSwgMHhGQywKKwkweEQ3LCAweDAxLCAweDQyLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQ1LAorCTB4RkYsIDB4NDQsIDB4MDAsIDB4REQsIDB4RkYsIDB4NzcsIDB4RkYsIDB4NjcsIDB4MDIsIDB4MTQsIDB4RjgsCisJMHhEQywgMHg0NCwgMHhENSwgMHgxMywgMHhCQywgMHhGNiwgMHg3QywgMHgwNSwgMHhDNSwgMHhGQywgMHhCNywKKwkweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLAorCTB4NzYsIDB4RkYsIDB4MzUsIDB4MDEsIDB4RTcsIDB4RkQsIDB4MjYsIDB4MDMsIDB4QTEsIDB4RkIsIDB4NjQsCisJMHgwNiwgMHhEMiwgMHg0OCwgMHgyMSwgMHgwMSwgMHhFOCwgMHhGRCwgMHhGNywgMHgwMSwgMHg4MywgMHhGRSwKKwkweEVDLCAweDAwLCAweDkzLCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LAorCTB4RkYsIDB4RDksIDB4MDEsIDB4NkQsIDB4RkMsIDB4NEIsIDB4MDYsIDB4Q0QsIDB4RjQsIDB4ODMsIDB4MUEsCisJMHg1RiwgMHg0MSwgMHgzQSwgMHhGNSwgMHgwQywgMHgwNCwgMHg3QiwgMHhGRSwgMHg2QywgMHgwMCwgMHhGRSwKKwkweEZGLCAweEVGLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJCLCAweDAwLCAweDVBLCAweEZGLAorCTB4QUQsIDB4MDEsIDB4NkMsIDB4RkMsIDB4MEMsIDB4MDcsIDB4N0YsIDB4RjEsIDB4REMsIDB4MkYsIDB4QUQsCisJMHgzMCwgMHg3RCwgMHhGMSwgMHgwMSwgMHgwNywgMHg3NiwgMHhGQywgMHhBNiwgMHgwMSwgMHg1RSwgMHhGRiwKKwkweDJBLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEYzLCAweEZGLCAweEY1LCAweEZGLCAweDdELAorCTB4MDAsIDB4NUQsIDB4RkUsIDB4M0UsIDB4MDQsIDB4RUEsIDB4RjQsIDB4RDksIDB4NDAsIDB4NjYsIDB4MUIsCisJMHg5MywgMHhGNCwgMHg2MiwgMHgwNiwgMHg2NCwgMHhGQywgMHhEQywgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLCAweDk3LCAweEZGLCAweEUyLCAweDAwLCAweDk4LCAweEZFLAorCTB4Q0YsIDB4MDEsIDB4MzMsIDB4RkUsIDB4N0QsIDB4MDAsIDB4QkIsIDB4NDgsIDB4MUYsIDB4MDcsIDB4NTQsCisJMHhGQiwgMHg0QywgMHgwMywgMHhEMywgMHhGRCwgMHgzRiwgMHgwMSwgMHg3MywgMHhGRiwgMHgyMywgMHgwMCwKKwkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ2LCAweEZGLCAweEIxLCAweDAxLCAweEQzLAorCTB4RkMsIDB4NUQsIDB4MDUsIDB4MDEsIDB4RjcsIDB4RkIsIDB4MTIsIDB4M0YsIDB4NDUsIDB4ODMsIDB4RjgsCisJMHgyQSwgMHgwMiwgMHg5QSwgMHhGRiwgMHhDQSwgMHhGRiwgMHg0RSwgMHgwMCwgMHhEMSwgMHhGRiwgMHgwQywKKwkweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDQwLCAweEZGLCAweERBLCAweDAxLCAweDM1LCAweEZDLAorCTB4MjcsIDB4MDcsIDB4MDksIDB4RjIsIDB4ODUsIDB4MjgsIDB4NjMsIDB4MzcsIDB4RTksIDB4RjEsIDB4NjMsCisJMHgwNiwgMHhGNSwgMHhGQywgMHg1MywgMHgwMSwgMHg4OSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEIxLCAweEZGLCAweDA0LCAweDAxLCAweDc2LCAweEZELCAweEE4LAorCTB4MDUsIDB4Q0MsIDB4RjIsIDB4QUIsIDB4M0IsIDB4MTgsIDB4MjMsIDB4RTAsIDB4RjIsIDB4RjcsIDB4MDYsCisJMHgzNSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMSwKKwkweDAwLCAweEI5LCAweEZGLCAweDhBLCAweDAwLCAweDRELCAweEZGLCAweDdELCAweDAwLCAweDlDLCAweDAwLAorCTB4N0IsIDB4RkIsIDB4MzEsIDB4NDcsIDB4RDksIDB4MEQsIDB4QzAsIDB4RjgsIDB4OEYsIDB4MDQsIDB4MzQsCisJMHhGRCwgMHg4NywgMHgwMSwgMHg1NiwgMHhGRiwgMHgyQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDI5LCAweDAwLCAweDVFLCAweEZGLCAweDc0LCAweDAxLCAweDVGLCAweEZELCAweDM1LCAweDA0LCAweDdDLAorCTB4RjksIDB4RDgsIDB4MEIsIDB4QzksIDB4NDcsIDB4RDQsIDB4RkMsIDB4RjAsIDB4RkYsIDB4REQsIDB4MDAsCisJMHgxOSwgMHhGRiwgMHhBNCwgMHgwMCwgMHhBRiwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNELCAweEZDLCAweEQ1LCAweDA2LCAweDRGLCAweEYzLAorCTB4RTAsIDB4MjAsIDB4NDUsIDB4M0QsIDB4NEQsIDB4RjMsIDB4NEIsIDB4MDUsIDB4QjMsIDB4RkQsIDB4RTAsCisJMHgwMCwgMHhDMywgMHhGRiwgMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwKKwkweDdCLCAweEZGLCAweDZFLCAweDAxLCAweENBLCAweEZDLCAweDlELCAweDA2LCAweEIxLCAweEYxLCAweDg2LAorCTB4MzUsIDB4QUUsIDB4MkEsIDB4Q0QsIDB4RjEsIDB4MkIsIDB4MDcsIDB4M0YsIDB4RkMsIDB4RDEsIDB4MDEsCisJMHg0NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhEQSwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZBLCAweEZGLCAweDQzLCAweEZGLCAweEJGLCAweDAyLCAweDc1LCAweEY3LCAweDQyLCAweDQ0LAorCTB4MjAsIDB4MTUsIDB4NTUsIDB4RjYsIDB4QTksIDB4MDUsIDB4QjIsIDB4RkMsIDB4QkYsIDB4MDEsIDB4NDEsCisJMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QywgMHhGRiwKKwkweDI3LCAweDAxLCAweDA1LCAweEZFLCAweEVCLCAweDAyLCAweDE0LCAweEZDLCAweDUwLCAweDA1LCAweEVBLAorCTB4NDgsIDB4MUIsIDB4MDIsIDB4NzgsIDB4RkQsIDB4MzIsIDB4MDIsIDB4NjQsIDB4RkUsIDB4RkEsIDB4MDAsCisJMHg4RCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENCwKKwkweDAxLCAweDdDLCAweEZDLCAweDI3LCAweDA2LCAweDI4LCAweEY1LCAweDMxLCAweDE5LCAweDIxLCAweDQyLAorCTB4QjgsIDB4RjUsIDB4QzAsIDB4MDMsIDB4QUEsIDB4RkUsIDB4NTEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RUEsCisJMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1NCwgMHhGRiwgMHhCNywgMHgwMSwKKwkweDVFLCAweEZDLCAweDE5LCAweDA3LCAweDg4LCAweEYxLCAweDlGLCAweDJFLCAweEUzLCAweDMxLCAweDdFLAorCTB4RjEsIDB4RUUsIDB4MDYsIDB4ODgsIDB4RkMsIDB4OUEsIDB4MDEsIDB4NjQsIDB4RkYsIDB4MjgsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNywgMHhGRiwgMHhFOCwgMHhGRiwgMHg5NiwgMHgwMCwgMHgzMSwKKwkweEZFLCAweDg0LCAweDA0LCAweDc5LCAweEY0LCAweDA3LCAweDQwLCAweEJBLCAweDFDLCAweDNFLCAweEY0LAorCTB4ODIsIDB4MDYsIDB4NTgsIDB4RkMsIDB4RTAsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgxOCwgMHgwMCwgMHg5RCwgMHhGRiwgMHhEMywgMHgwMCwgMHhCOCwgMHhGRSwgMHg5MywgMHgwMSwKKwkweEExLCAweEZFLCAweDhFLCAweEZGLCAweDkyLCAweDQ4LCAweDNELCAweDA4LCAweEUxLCAweEZBLCAweDg2LAorCTB4MDMsIDB4QjYsIDB4RkQsIDB4NEMsIDB4MDEsIDB4NkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhBOCwgMHgwMSwgMHhFOSwgMHhGQywgMHgyRCwKKwkweDA1LCAweDZCLCAweEY3LCAweEI2LCAweDExLCAweEM4LCAweDQ1LCAweDMwLCAweEY5LCAweENELCAweDAxLAorCTB4RDAsIDB4RkYsIDB4QUMsIDB4RkYsIDB4NUMsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhERiwgMHgwMSwgMHgzMywgMHhGQywgMHgyMCwgMHgwNywKKwkweDM1LCAweEYyLCAweDM2LCAweDI3LCAweDc4LCAweDM4LCAweDE0LCAweEYyLCAweDNCLCAweDA2LCAweDExLAorCTB4RkQsIDB4NDEsIDB4MDEsIDB4OTIsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgxMCwgMHgwMCwgMHhBNywgMHhGRiwgMHgxOSwgMHgwMSwgMHg1MywgMHhGRCwgMHhEQiwgMHgwNSwgMHg4OCwKKwkweEYyLCAweEFELCAweDNBLCAweDZELCAweDI0LCAweEE0LCAweEYyLCAweDA4LCAweDA3LCAweDMyLCAweEZDLAorCTB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkYsCisJMHhGRiwgMHg3QiwgMHgwMCwgMHg2QywgMHhGRiwgMHg0NCwgMHgwMCwgMHgwMSwgMHgwMSwgMHhCNiwgMHhGQSwKKwkweEM4LCAweDQ2LCAweDEzLCAweDBGLCAweDUxLCAweEY4LCAweEM0LCAweDA0LCAweDFCLCAweEZELCAweDkyLAorCTB4MDEsIDB4NTIsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsCisJMHg2MywgMHhGRiwgMHg2NywgMHgwMSwgMHg3QSwgMHhGRCwgMHhGRSwgMHgwMywgMHhFRSwgMHhGOSwgMHhBQSwKKwkweDBBLCAweDE2LCAweDQ4LCAweEFDLCAweEZELCAweDg2LCAweEZGLCAweDE3LCAweDAxLCAweEZBLCAweEZFLAorCTB4QjMsIDB4MDAsIDB4QUEsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsCisJMHhGRiwgMHhFNSwgMHgwMSwgMHg0NCwgMHhGQywgMHhCRCwgMHgwNiwgMHg5NywgMHhGMywgMHg4QSwgMHgxRiwKKwkweDMxLCAweDNFLCAweEE1LCAweEYzLCAweDBGLCAweDA1LCAweERBLCAweEZELCAweEM5LCAweDAwLCAweENGLAorCTB4RkYsIDB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjIsIDB4MDAsIDB4NzMsIDB4RkYsCisJMHg3RCwgMHgwMSwgMHhCMywgMHhGQywgMHhCQiwgMHgwNiwgMHg5QSwgMHhGMSwgMHg2MCwgMHgzNCwgMHhGNSwKKwkweDJCLCAweEIwLCAweEYxLCAweDI4LCAweDA3LCAweDQ3LCAweEZDLCAweENBLCAweDAxLCAweDRBLCAweEZGLAorCTB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REYsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MTcsCisJMHgwMCwgMHgxMCwgMHhGRiwgMHgxNSwgMHgwMywgMHhERCwgMHhGNiwgMHg5RSwgMHg0MywgMHg2QywgMHgxNiwKKwkweEYxLCAweEY1LCAweEQzLCAweDA1LCAweDlGLCAweEZDLCAweEM2LCAweDAxLCAweDNGLCAweEZGLCAweDMzLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4MTksIDB4MDEsCisJMHgyMywgMHhGRSwgMHhCMCwgMHgwMiwgMHg4NywgMHhGQywgMHg0MSwgMHgwNCwgMHhGNCwgMHg0OCwgMHgxQywKKwkweDAzLCAweDA2LCAweEZELCAweDZFLCAweDAyLCAweDQ1LCAweEZFLCAweDA5LCAweDAxLCAweDg4LCAweEZGLAorCTB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4OEMsCisJMHhGQywgMHgwMCwgMHgwNiwgMHg4NiwgMHhGNSwgMHhFMCwgMHgxNywgMHhEQiwgMHg0MiwgMHgzRiwgMHhGNiwKKwkweDcxLCAweDAzLCAweEQ5LCAweEZFLCAweDM2LCAweDAwLCAweDE4LCAweDAwLCAweEU1LCAweEZGLCAweDA3LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEYsIDB4RkYsIDB4QzEsIDB4MDEsIDB4NTIsIDB4RkMsCisJMHgyMiwgMHgwNywgMHg5OCwgMHhGMSwgMHg1RSwgMHgyRCwgMHgxMywgMHgzMywgMHg4NywgMHhGMSwgMHhEOCwKKwkweDA2LCAweDlCLCAweEZDLCAweDhELCAweDAxLCAweDZCLCAweEZGLCAweDI1LCAweDAwLCAweEZELCAweEZGLAorCTB4MDMsIDB4MDAsIDB4RkMsIDB4RkYsIDB4REMsIDB4RkYsIDB4QUYsIDB4MDAsIDB4MDcsIDB4RkUsIDB4QzgsCisJMHgwNCwgMHgxMCwgMHhGNCwgMHgyRCwgMHgzRiwgMHgwRiwgMHgxRSwgMHhFRCwgMHhGMywgMHhBMCwgMHgwNiwKKwkweDRFLCAweEZDLCAweEUzLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE2LAorCTB4MDAsIDB4QTMsIDB4RkYsIDB4QzMsIDB4MDAsIDB4RDcsIDB4RkUsIDB4NTgsIDB4MDEsIDB4MEYsIDB4RkYsCisJMHhBNiwgMHhGRSwgMHg1RCwgMHg0OCwgMHg2MSwgMHgwOSwgMHg2RSwgMHhGQSwgMHhDMCwgMHgwMywgMHg5OSwKKwkweEZELCAweDU5LCAweDAxLCAweDY4LCAweEZGLCAweDI2LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAorCTB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUUsIDB4MDEsIDB4MDAsIDB4RkQsIDB4RkMsIDB4MDQsIDB4RDcsCisJMHhGNywgMHg3NSwgMHgxMCwgMHg0OCwgMHg0NiwgMHhFNCwgMHhGOSwgMHg2RSwgMHgwMSwgMHgwNiwgMHgwMCwKKwkweDhFLCAweEZGLCAweDZCLCAweDAwLCAweEM2LCAweEZGLCAweDBFLCAweDAwLCAweEZELCAweEZGLCAweDM1LAorCTB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTYsIDB4MDcsIDB4NjcsIDB4RjIsCisJMHhFNSwgMHgyNSwgMHg4NywgMHgzOSwgMHg0NywgMHhGMiwgMHgxMCwgMHgwNiwgMHgzMCwgMHhGRCwgMHgyRiwKKwkweDAxLCAweDlDLCAweEZGLCAweDE0LCAweDAwLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweDEzLCAweDAwLAorCTB4OUQsIDB4RkYsIDB4MkQsIDB4MDEsIDB4MzMsIDB4RkQsIDB4MEIsIDB4MDYsIDB4NEQsIDB4RjIsIDB4QTUsCisJMHgzOSwgMHhCRiwgMHgyNSwgMHg2RCwgMHhGMiwgMHgxNSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMiwgMHgwMSwKKwkweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLCAweEM1LCAweEZGLCAweDZELAorCTB4MDAsIDB4OEIsIDB4RkYsIDB4MEQsIDB4MDAsIDB4NjMsIDB4MDEsIDB4RjksIDB4RjksIDB4NTUsIDB4NDYsCisJMHg1MSwgMHgxMCwgMHhFMywgMHhGNywgMHhGNywgMHgwNCwgMHgwMywgMHhGRCwgMHg5RCwgMHgwMSwgMHg0RSwKKwkweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY4LCAweEZGLAorCTB4NUIsIDB4MDEsIDB4OTYsIDB4RkQsIDB4QzYsIDB4MDMsIDB4NjEsIDB4RkEsIDB4ODEsIDB4MDksIDB4NTcsCisJMHg0OCwgMHg4RCwgMHhGRSwgMHgxQiwgMHhGRiwgMHg1MiwgMHgwMSwgMHhEQiwgMHhGRSwgMHhDMiwgMHgwMCwKKwkweEE0LCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLAorCTB4MDEsIDB4NEQsIDB4RkMsIDB4QTMsIDB4MDYsIDB4RTQsIDB4RjMsIDB4MzYsIDB4MUUsIDB4MTYsIDB4M0YsCisJMHgwNSwgMHhGNCwgMHhDRiwgMHgwNCwgMHgwMiwgMHhGRSwgMHhCMiwgMHgwMCwgMHhEQiwgMHhGRiwgMHhGQywKKwkweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI1LCAweDAwLCAweDZDLCAweEZGLCAweDhCLCAweDAxLAorCTB4OUQsIDB4RkMsIDB4RDUsIDB4MDYsIDB4ODksIDB4RjEsIDB4MzUsIDB4MzMsIDB4M0EsIDB4MkQsIDB4OUEsCisJMHhGMSwgMHgyMywgMHgwNywgMHg1MSwgMHhGQywgMHhDMiwgMHgwMSwgMHg0RiwgMHhGRiwgMHgyRiwgMHgwMCwKKwkweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU1LCAweEZGLCAweDFBLCAweDAwLCAweDMzLCAweDAwLCAweERGLAorCTB4RkUsIDB4NjgsIDB4MDMsIDB4NEUsIDB4RjYsIDB4RUUsIDB4NDIsIDB4QkIsIDB4MTcsIDB4OTAsIDB4RjUsCisJMHhGQywgMHgwNSwgMHg4RSwgMHhGQywgMHhDRCwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDFFLCAweDAwLCAweDg3LCAweEZGLCAweDBCLCAweDAxLCAweDQyLCAweEZFLCAweDc0LCAweDAyLAorCTB4RjksIDB4RkMsIDB4MzksIDB4MDMsIDB4RjUsIDB4NDgsIDB4MjQsIDB4MDQsIDB4OTQsIDB4RkMsIDB4QTksCisJMHgwMiwgMHgyNywgMHhGRSwgMHgxOCwgMHgwMSwgMHg4MiwgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNFLCAweEZGLCAweEM3LCAweDAxLCAweDlELCAweEZDLCAweEQ4LAorCTB4MDUsIDB4RTcsIDB4RjUsIDB4OTEsIDB4MTYsIDB4ODksIDB4NDMsIDB4Q0QsIDB4RjYsIDB4MUUsIDB4MDMsCisJMHgwQiwgMHhGRiwgMHgxQSwgMHgwMCwgMHgyNiwgMHgwMCwgMHhFMCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDMwLCAweDAwLCAweDRCLCAweEZGLCAweEM5LCAweDAxLCAweDQ4LCAweEZDLCAweDI4LCAweDA3LAorCTB4QUQsIDB4RjEsIDB4MTksIDB4MkMsIDB4M0YsIDB4MzQsIDB4OTcsIDB4RjEsIDB4QkUsIDB4MDYsIDB4QjAsCisJMHhGQywgMHg3RiwgMHgwMSwgMHg3MiwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwKKwkweDAwLCAweDAwLCAweEQwLCAweEZGLCAweEM3LCAweDAwLCAweERFLCAweEZELCAweDA4LCAweDA1LCAweEIwLAorCTB4RjMsIDB4NEEsIDB4M0UsIDB4NjQsIDB4MUYsIDB4QTAsIDB4RjMsIDB4QkIsIDB4MDYsIDB4NDUsIDB4RkMsCisJMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOSwKKwkweEZGLCAweEI0LCAweDAwLCAweEY3LCAweEZFLCAweDFELCAweDAxLCAweDdBLCAweEZGLCAweEM1LCAweEZELAorCTB4MUQsIDB4NDgsIDB4ODksIDB4MEEsIDB4RkIsIDB4RjksIDB4RjgsIDB4MDMsIDB4N0QsIDB4RkQsIDB4NjYsCisJMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwKKwkweDUyLCAweEZGLCAweDkzLCAweDAxLCAweDE4LCAweEZELCAweEM5LCAweDA0LCAweDQ1LCAweEY4LCAweDM2LAorCTB4MEYsIDB4QkIsIDB4NDYsIDB4QTEsIDB4RkEsIDB4MEMsIDB4MDEsIDB4M0UsIDB4MDAsIDB4NzAsIDB4RkYsCisJMHg3QSwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwKKwkweEZGLCAweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDA5LCAweDA3LCAweDlELCAweEYyLCAweDkyLCAweDI0LAorCTB4OEYsIDB4M0EsIDB4ODIsIDB4RjIsIDB4RTEsIDB4MDUsIDB4NTAsIDB4RkQsIDB4MUIsIDB4MDEsIDB4QTYsCisJMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNywgMHgwMCwgMHg5MywgMHhGRiwKKwkweDNGLCAweDAxLCAweDE1LCAweEZELCAweDM2LCAweDA2LCAweDE5LCAweEYyLCAweDk3LCAweDM4LCAweDExLAorCTB4MjcsIDB4M0IsIDB4RjIsIDB4MUYsIDB4MDcsIDB4MzIsIDB4RkMsIDB4REYsIDB4MDEsIDB4M0QsIDB4RkYsCisJMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDQiwgMHhGRiwgMHg1RSwgMHgwMCwgMHhBOSwKKwkweEZGLCAweEQ2LCAweEZGLCAweEMzLCAweDAxLCAweDQzLCAweEY5LCAweEQ3LCAweDQ1LCAweDkyLCAweDExLAorCTB4NzcsIDB4RjcsIDB4MjgsIDB4MDUsIDB4RUMsIDB4RkMsIDB4QTcsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MkYsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2RCwgMHhGRiwgMHg0RSwgMHgwMSwKKwkweEIzLCAweEZELCAweDhELCAweDAzLCAweEQ0LCAweEZBLCAweDVELCAweDA4LCAweDhELCAweDQ4LCAweDc0LAorCTB4RkYsIDB4QUUsIDB4RkUsIDB4OEQsIDB4MDEsIDB4QkIsIDB4RkUsIDB4RDEsIDB4MDAsIDB4OUUsIDB4RkYsCisJMHgxOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMCwgMHgwMSwgMHg1NywKKwkweEZDLCAweDg1LCAweDA2LCAweDM0LCAweEY0LCAweEUwLCAweDFDLCAweEYwLCAweDNGLCAweDZELCAweEY0LAorCTB4OEMsIDB4MDQsIDB4MkMsIDB4RkUsIDB4OTksIDB4MDAsIDB4RTcsIDB4RkYsIDB4RjgsIDB4RkYsIDB4MDQsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgyNywgMHgwMCwgMHg2NSwgMHhGRiwgMHg5OCwgMHgwMSwgMHg4QSwgMHhGQywKKwkweEVDLCAweDA2LCAweDdGLCAweEYxLCAweDA0LCAweDMyLCAweDdCLCAweDJFLCAweDhBLCAweEYxLCAweDFBLAorCTB4MDcsIDB4NUQsIDB4RkMsIDB4QjgsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwNiwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwQywgMHgwMCwgMHg0RSwgMHgwMCwgMHhBRiwgMHhGRSwgMHhCOCwKKwkweDAzLCAweEM3LCAweEY1LCAweDM4LCAweDQyLCAweDBDLCAweDE5LCAweDMyLCAweEY1LCAweDIzLCAweDA2LAorCTB4N0QsIDB4RkMsIDB4RDMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsCisJMHgwMCwgMHg4RCwgMHhGRiwgMHhGQywgMHgwMCwgMHg2MSwgMHhGRSwgMHgzOSwgMHgwMiwgMHg2QiwgMHhGRCwKKwkweDM3LCAweDAyLCAweEVCLCAweDQ4LCAweDMxLCAweDA1LCAweDIxLCAweEZDLCAweEU0LCAweDAyLCAweDA4LAorCTB4RkUsIDB4MjYsIDB4MDEsIDB4N0MsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgzMiwgMHgwMCwgMHg0MSwgMHhGRiwgMHhDMCwgMHgwMSwgMHhBRiwgMHhGQywgMHhBRCwgMHgwNSwgMHg0QSwKKwkweEY2LCAweDQ0LCAweDE1LCAweDJGLCAweDQ0LCAweDY0LCAweEY3LCAweEM5LCAweDAyLCAweDNELCAweEZGLAorCTB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4REIsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsCisJMHgwMCwgMHg0NywgMHhGRiwgMHhEMCwgMHgwMSwgMHg0MCwgMHhGQywgMHgyQSwgMHgwNywgMHhDQSwgMHhGMSwKKwkweEQxLCAweDJBLCAweDY1LCAweDM1LCAweEFFLCAweEYxLCAweEEwLCAweDA2LCAweEM3LCAweEZDLCAweDcwLAorCTB4MDEsIDB4N0EsIDB4RkYsIDB4MjAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsCisJMHhDNSwgMHhGRiwgMHhERSwgMHgwMCwgMHhCNywgMHhGRCwgMHg0NSwgMHgwNSwgMHg1NiwgMHhGMywgMHg2MSwKKwkweDNELCAweEJBLCAweDIwLCAweDU2LCAweEYzLCAweEQzLCAweDA2LCAweDNFLCAweEZDLCAweEU2LCAweDAxLAorCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QUYsIDB4RkYsIDB4QTUsCisJMHgwMCwgMHgxNiwgMHhGRiwgMHhFMywgMHgwMCwgMHhFNCwgMHhGRiwgMHhFQiwgMHhGQywgMHhEMiwgMHg0NywKKwkweEI2LCAweDBCLCAweDg5LCAweEY5LCAweDJGLCAweDA0LCAweDYyLCAweEZELCAweDcyLCAweDAxLCAweDVFLAorCTB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkYsCisJMHg4OCwgMHgwMSwgMHgzMSwgMHhGRCwgMHg5NSwgMHgwNCwgMHhCNCwgMHhGOCwgMHhGQywgMHgwRCwgMHgyNiwKKwkweDQ3LCAweDY0LCAweEZCLCAweEE3LCAweDAwLCAweDc3LCAweDAwLCAweDUxLCAweEZGLCAweDg5LCAweDAwLAorCTB4QkEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTYsCisJMHgwMSwgMHgzNCwgMHhGQywgMHhGOSwgMHgwNiwgMHhEOSwgMHhGMiwgMHgzRiwgMHgyMywgMHg5MCwgMHgzQiwKKwkweEM0LCAweEYyLCAweEFFLCAweDA1LCAweDcyLCAweEZELCAweDA3LCAweDAxLCAweEIwLCAweEZGLCAweDBDLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OEEsIDB4RkYsIDB4NTEsIDB4MDEsCisJMHhGOCwgMHhGQywgMHg1RSwgMHgwNiwgMHhFRCwgMHhGMSwgMHg4MiwgMHgzNywgMHg2MCwgMHgyOCwgMHgwRSwKKwkweEYyLCAweDI2LCAweDA3LCAweDM1LCAweEZDLCAweERCLCAweDAxLCAweDQwLCAweEZGLCAweDM0LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NEYsIDB4MDAsIDB4QzcsIDB4RkYsIDB4QTAsCisJMHhGRiwgMHgyMCwgMHgwMiwgMHg5NiwgMHhGOCwgMHg0RSwgMHg0NSwgMHhENywgMHgxMiwgMHgwRCwgMHhGNywKKwkweDU4LCAweDA1LCAweEQ2LCAweEZDLCAweEIwLCAweDAxLCAweDQ3LCAweEZGLCAweDMwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzIsIDB4RkYsIDB4NDAsIDB4MDEsIDB4RDAsIDB4RkQsCisJMHg1MywgMHgwMywgMHg0NywgMHhGQiwgMHgzRiwgMHgwNywgMHhCOCwgMHg0OCwgMHg2MiwgMHgwMCwgMHgzRiwKKwkweEZFLCAweEM4LCAweDAxLCAweDlDLCAweEZFLCAweEUwLCAweDAwLCAweDk4LCAweEZGLCAweDE5LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REMsIDB4MDEsIDB4NjMsIDB4RkMsIDB4NjYsCisJMHgwNiwgMHg4OSwgMHhGNCwgMHg4QywgMHgxQiwgMHhDMywgMHg0MCwgMHhERCwgMHhGNCwgMHg0NiwgMHgwNCwKKwkweDU4LCAweEZFLCAweDgwLCAweDAwLCAweEY0LCAweEZGLCAweEYzLCAweEZGLCAweDA1LCAweDAwLCAweEZELAorCTB4RkYsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4QTUsIDB4MDEsIDB4NzgsIDB4RkMsIDB4RkYsIDB4MDYsCisJMHg3RCwgMHhGMSwgMHhDRiwgMHgzMCwgMHhCOCwgMHgyRiwgMHg4MCwgMHhGMSwgMHgwRCwgMHgwNywgMHg2QSwKKwkweEZDLCAweEFFLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLAorCTB4RUYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4NjksIDB4MDAsIDB4ODAsIDB4RkUsIDB4MDQsIDB4MDQsIDB4NDgsCisJMHhGNSwgMHg3NCwgMHg0MSwgMHg1RCwgMHgxQSwgMHhENywgMHhGNCwgMHg0NywgMHgwNiwgMHg2RiwgMHhGQywKKwkweEQ4LCAweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDkzLAorCTB4RkYsIDB4RUQsIDB4MDAsIDB4ODAsIDB4RkUsIDB4RkQsIDB4MDEsIDB4REMsIDB4RkQsIDB4M0MsIDB4MDEsCisJMHhENSwgMHg0OCwgMHg0NSwgMHgwNiwgMHhBRSwgMHhGQiwgMHgxRiwgMHgwMywgMHhFQSwgMHhGRCwgMHgzNCwKKwkweDAxLCAweDc3LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLAorCTB4NDQsIDB4RkYsIDB4QjgsIDB4MDEsIDB4QzMsIDB4RkMsIDB4ODEsIDB4MDUsIDB4QjAsIDB4RjYsIDB4RkEsCisJMHgxMywgMHhDQywgMHg0NCwgMHgwMiwgMHhGOCwgMHg3MSwgMHgwMiwgMHg3MSwgMHhGRiwgMHhFMSwgMHhGRiwKKwkweDQyLCAweDAwLCAweEQ1LCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQzLAorCTB4RkYsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkMsIDB4MkEsIDB4MDcsIDB4RUIsIDB4RjEsIDB4ODcsIDB4MjksCisJMHg4NSwgMHgzNiwgMHhDQywgMHhGMSwgMHg3RiwgMHgwNiwgMHhFMCwgMHhGQywgMHg2MCwgMHgwMSwgMHg4MiwKKwkweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA5LCAweDAwLCAweEJBLCAweEZGLAorCTB4RjQsIDB4MDAsIDB4OTEsIDB4RkQsIDB4N0UsIDB4MDUsIDB4MDUsIDB4RjMsIDB4NkUsIDB4M0MsIDB4MTAsCisJMHgyMiwgMHgxMiwgMHhGMywgMHhFOSwgMHgwNiwgMHgzOCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwKKwkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLCAweDAwLCAweEI1LCAweEZGLCAweDk2LCAweDAwLCAweDM1LAorCTB4RkYsIDB4QTksIDB4MDAsIDB4NEQsIDB4MDAsIDB4MTksIDB4RkMsIDB4N0MsIDB4NDcsIDB4RTgsIDB4MEMsCisJMHgxOCwgMHhGOSwgMHg2NiwgMHgwNCwgMHg0OCwgMHhGRCwgMHg3RSwgMHgwMSwgMHg1QSwgMHhGRiwgMHgyQiwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVBLCAweEZGLCAweDdELCAweDAxLAorCTB4NEIsIDB4RkQsIDB4NjAsIDB4MDQsIDB4MjQsIDB4RjksIDB4QzYsIDB4MEMsIDB4ODYsIDB4NDcsIDB4MzAsCisJMHhGQywgMHg0MSwgMHgwMCwgMHhCMCwgMHgwMCwgMHgzMiwgMHhGRiwgMHg5OCwgMHgwMCwgMHhCNCwgMHhGRiwKKwkweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM4LAorCTB4RkMsIDB4RTYsIDB4MDYsIDB4MTksIDB4RjMsIDB4RUEsIDB4MjEsIDB4OEEsIDB4M0MsIDB4MEUsIDB4RjMsCisJMHg3OCwgMHgwNSwgMHg5NiwgMHhGRCwgMHhGMSwgMHgwMCwgMHhCQiwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMSwKKwkweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDgxLCAweEZGLCAweDYyLCAweDAxLCAweERELCAweEZDLAorCTB4ODMsIDB4MDYsIDB4QzksIDB4RjEsIDB4NjYsIDB4MzYsIDB4QUMsIDB4MjksIDB4RTcsIDB4RjEsIDB4MkEsCisJMHgwNywgMHgzQSwgMHhGQywgMHhENSwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDBCLCAweDAwLCAweEQ2LCAweEZGLCAweDQxLCAweDAwLCAweEU0LCAweEZGLCAweDZCLCAweEZGLCAweDdCLAorCTB4MDIsIDB4RjAsIDB4RjcsIDB4QkEsIDB4NDQsIDB4MUUsIDB4MTQsIDB4QTUsIDB4RjYsIDB4ODYsIDB4MDUsCisJMHhDMSwgMHhGQywgMHhCOSwgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDIyLCAweDAwLCAweDc3LCAweEZGLCAweDMyLCAweDAxLCAweEVELCAweEZELCAweDE5LCAweDAzLAorCTB4QkIsIDB4RkIsIDB4MjYsIDB4MDYsIDB4RDcsIDB4NDgsIDB4NTgsIDB4MDEsIDB4Q0YsIDB4RkQsIDB4MDQsCisJMHgwMiwgMHg3RCwgMHhGRSwgMHhFRiwgMHgwMCwgMHg5MiwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ4LCAweDAxLCAweDcwLCAweEZDLCAweDQzLCAweDA2LCAweEUxLAorCTB4RjQsIDB4MzgsIDB4MUEsIDB4OEMsIDB4NDEsIDB4NTUsIDB4RjUsIDB4RkMsIDB4MDMsIDB4ODUsIDB4RkUsCisJMHg2NiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQiwKKwkweDAwLCAweDU5LCAweEZGLCAweEIwLCAweDAxLCAweDY5LCAweEZDLCAweDBGLCAweDA3LCAweDgwLCAweEYxLAorCTB4OTYsIDB4MkYsIDB4RjIsIDB4MzAsIDB4N0MsIDB4RjEsIDB4RkQsIDB4MDYsIDB4N0EsIDB4RkMsIDB4QTMsCisJMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGNCwgMHhGRiwKKwkweEYyLCAweEZGLCAweDgzLCAweDAwLCAweDUzLCAweEZFLCAweDRFLCAweDA0LCAweEQwLCAweEY0LCAweEFCLAorCTB4NDAsIDB4QjIsIDB4MUIsIDB4N0YsIDB4RjQsIDB4NjksIDB4MDYsIDB4NjIsIDB4RkMsIDB4REQsIDB4MDEsCisJMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5OCwgMHhGRiwgMHhERSwKKwkweDAwLCAweDlGLCAweEZFLCAweEMyLCAweDAxLCAweDRCLCAweEZFLCAweDQ4LCAweDAwLCAweEIzLCAweDQ4LAorCTB4NUUsIDB4MDcsIDB4M0IsIDB4RkIsIDB4NTksIDB4MDMsIDB4Q0QsIDB4RkQsIDB4NDIsIDB4MDEsIDB4NzEsCisJMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0NywgMHhGRiwKKwkweEFGLCAweDAxLCAweEQ4LCAweEZDLCAweDUyLCAweDA1LCAweDE5LCAweEY3LCAweEIyLCAweDEyLCAweDVDLAorCTB4NDUsIDB4QTksIDB4RjgsIDB4MTYsIDB4MDIsIDB4QTYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NTEsIDB4MDAsCisJMHhEMCwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHg0MCwgMHhGRiwgMHhEQiwKKwkweDAxLCAweDM1LCAweEZDLCAweDI1LCAweDA3LCAweDEzLCAweEYyLCAweDNBLCAweDI4LCAweEEwLCAweDM3LAorCTB4RjIsIDB4RjEsIDB4NUEsIDB4MDYsIDB4RkIsIDB4RkMsIDB4NEYsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MUEsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhBRiwgMHhGRiwgMHgwOSwgMHgwMSwKKwkweDZFLCAweEZELCAweEI0LCAweDA1LCAweEJDLCAweEYyLCAweDczLCAweDNCLCAweDY0LCAweDIzLCAweEQyLAorCTB4RjIsIDB4RkIsIDB4MDYsIDB4MzQsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCQiwgMHhGRiwgMHg4NywgMHgwMCwgMHg1NCwgMHhGRiwgMHg3MCwKKwkweDAwLCAweEIzLCAweDAwLCAweDRFLCAweEZCLCAweDFBLCAweDQ3LCAweDFGLCAweDBFLCAweEE4LCAweEY4LAorCTB4OUIsIDB4MDQsIDB4MkUsIDB4RkQsIDB4OEEsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHg3MSwgMHgwMSwgMHg2NSwgMHhGRCwKKwkweDI5LCAweDA0LCAweDk2LCAweEY5LCAweDk1LCAweDBCLCAweERDLCAweDQ3LCAweDAzLCAweEZELCAweEQ5LAorCTB4RkYsIDB4RUEsIDB4MDAsIDB4MTIsIDB4RkYsIDB4QTcsIDB4MDAsIDB4QUUsIDB4RkYsIDB4MTQsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRSwgMHhGQywgMHhEMCwKKwkweDA2LCAweDVFLCAweEYzLCAweDk0LCAweDIwLCAweDdCLCAweDNELCAweDYwLCAweEYzLCAweDNFLCAweDA1LAorCTB4QkIsIDB4RkQsIDB4REIsIDB4MDAsIDB4QzYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgyMCwgMHgwMCwgMHg3OSwgMHhGRiwgMHg3MiwgMHgwMSwgMHhDNCwgMHhGQywgMHhBNCwgMHgwNiwKKwkweEFCLCAweEYxLCAweDQ2LCAweDM1LCAweEY3LCAweDJBLCAweEM2LCAweEYxLCAweDJBLCAweDA3LCAweDQwLAorCTB4RkMsIDB4Q0YsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsCisJMHhEQiwgMHhGRiwgMHgzMywgMHgwMCwgMHgwMSwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEMywgMHgwMiwgMHg1MywKKwkweEY3LCAweDFGLCAweDQ0LCAweDY5LCAweDE1LCAweDNGLCAweEY2LCAweEIyLCAweDA1LCAweEFELCAweEZDLAorCTB4QzEsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsCisJMHgwMCwgMHg3RCwgMHhGRiwgMHgyNCwgMHgwMSwgMHgwQywgMHhGRSwgMHhERSwgMHgwMiwgMHgyRSwgMHhGQywKKwkweDEzLCAweDA1LCAweEVDLCAweDQ4LCAweDU0LCAweDAyLCAweDVFLCAweEZELCAweDNGLCAweDAyLCAweDVELAorCTB4RkUsIDB4RkUsIDB4MDAsIDB4OEMsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCisJMHgzQiwgMHhGRiwgMHhEMywgMHgwMSwgMHg3RiwgMHhGQywgMHgxRiwgMHgwNiwgMHgzQywgMHhGNSwgMHhFNiwKKwkweDE4LCAweDRELCAweDQyLCAweEQ1LCAweEY1LCAweEFGLCAweDAzLCAweEI0LCAweEZFLCAweDRCLCAweDAwLAorCTB4MEUsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsCisJMHhGRiwgMHhCQSwgMHgwMSwgMHg1QiwgMHhGQywgMHgxQiwgMHgwNywgMHg4QiwgMHhGMSwgMHg1OCwgMHgyRSwKKwkweDI2LCAweDMyLCAweDgwLCAweEYxLCAweEVBLCAweDA2LCAweDhDLCAweEZDLCAweDk3LCAweDAxLCAweDY2LAorCTB4RkYsIDB4MjcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RTYsIDB4RkYsCisJMHg5QywgMHgwMCwgMHgyNywgMHhGRSwgMHg5NCwgMHgwNCwgMHg2MSwgMHhGNCwgMHhENywgMHgzRiwgMHgwNiwKKwkweDFELCAweDJCLCAweEY0LCAweDg5LCAweDA2LCAweDU2LCAweEZDLCAweEUwLCAweDAxLCAweDM3LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4OUUsIDB4RkYsIDB4Q0YsIDB4MDAsIDB4QkYsCisJMHhGRSwgMHg4NiwgMHgwMSwgMHhCQSwgMHhGRSwgMHg1QSwgMHhGRiwgMHg4NiwgMHg0OCwgMHg3RCwgMHgwOCwKKwkweEM3LCAweEZBLCAweDkzLCAweDAzLCAweEIwLCAweEZELCAweDRGLCAweDAxLCAweDZDLCAweEZGLCAweDI1LAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QTYsIDB4MDEsCisJMHhFRSwgMHhGQywgMHgyMywgMHgwNSwgMHg4MywgMHhGNywgMHg2RSwgMHgxMSwgMHhFNSwgMHg0NSwgMHg1NywKKwkweEY5LCAweEI4LCAweDAxLCAweERDLCAweEZGLCAweEE1LCAweEZGLCAweDVGLCAweDAwLCAweENBLCAweEZGLAorCTB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0QsIDB4RkYsIDB4REYsIDB4MDEsIDB4MzIsCisJMHhGQywgMHgxRSwgMHgwNywgMHg0MCwgMHhGMiwgMHhFQiwgMHgyNiwgMHhCNSwgMHgzOCwgMHgxRiwgMHhGMiwKKwkweDMyLCAweDA2LCAweDE4LCAweEZELCAweDNELCAweDAxLCAweDk0LCAweEZGLCAweDE2LCAweDAwLCAweEZGLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsIDB4QTQsIDB4RkYsIDB4MUQsIDB4MDEsIDB4NEMsIDB4RkQsCisJMHhFNiwgMHgwNSwgMHg3QiwgMHhGMiwgMHg3MSwgMHgzQSwgMHhCOCwgMHgyNCwgMHg5NywgMHhGMiwgMHgwQiwKKwkweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAorCTB4MEYsIDB4MDAsIDB4QzAsIDB4RkYsIDB4NzgsIDB4MDAsIDB4NzMsIDB4RkYsIDB4MzgsIDB4MDAsIDB4MTcsCisJMHgwMSwgMHg4QiwgMHhGQSwgMHhBRiwgMHg0NiwgMHg1OSwgMHgwRiwgMHgzOSwgMHhGOCwgMHhDRiwgMHgwNCwKKwkweDE1LCAweEZELCAweDk1LCAweDAxLCAweDUxLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLAorCTB4MDAsIDB4MjgsIDB4MDAsIDB4NjQsIDB4RkYsIDB4NjUsIDB4MDEsIDB4ODEsIDB4RkQsIDB4RjIsIDB4MDMsCisJMHgwOCwgMHhGQSwgMHg2OCwgMHgwQSwgMHgyNSwgMHg0OCwgMHhERSwgMHhGRCwgMHg2RSwgMHhGRiwgMHgyNCwKKwkweDAxLCAweEYzLCAweEZFLCAweEI2LCAweDAwLCAweEE4LCAweEZGLCAweDE1LCAweDAwLCAweEZELCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTUsIDB4MDEsIDB4NDYsIDB4RkMsIDB4QjgsIDB4MDYsIDB4QTgsCisJMHhGMywgMHgzRiwgMHgxRiwgMHg2NCwgMHgzRSwgMHhCQSwgMHhGMywgMHgwMSwgMHgwNSwgMHhFMiwgMHhGRCwKKwkweEM0LCAweDAwLCAweEQyLCAweEZGLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIzLAorCTB4MDAsIDB4NzEsIDB4RkYsIDB4ODEsIDB4MDEsIDB4QUUsIDB4RkMsIDB4QzEsIDB4MDYsIDB4OTUsIDB4RjEsCisJMHgxRSwgMHgzNCwgMHgzRSwgMHgyQywgMHhBQiwgMHhGMSwgMHgyNywgMHgwNywgMHg0OSwgMHhGQywgMHhDOCwKKwkweDAxLCAweDRCLCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA4LCAweDAwLCAweEUxLCAweEZGLAorCTB4MjUsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDUsIDB4RkYsIDB4MjgsIDB4MDMsIDB4QkQsIDB4RjYsIDB4NzcsCisJMHg0MywgMHhCNiwgMHgxNiwgMHhEQywgMHhGNSwgMHhERCwgMHgwNSwgMHg5QiwgMHhGQywgMHhDOCwgMHgwMSwKKwkweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDFGLCAweDAwLCAweDgzLAorCTB4RkYsIDB4MTYsIDB4MDEsIDB4MkEsIDB4RkUsIDB4QTMsIDB4MDIsIDB4QTEsIDB4RkMsIDB4MDYsIDB4MDQsCisJMHhGNSwgMHg0OCwgMHg1NiwgMHgwMywgMHhFRCwgMHhGQywgMHg3QiwgMHgwMiwgMHgzRSwgMHhGRSwgMHgwQywKKwkweDAxLCAweDg2LCAweEZGLCAweDFFLCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLAorCTB4Q0MsIDB4MDEsIDB4OEYsIDB4RkMsIDB4RjgsIDB4MDUsIDB4OUIsIDB4RjUsIDB4OTYsIDB4MTcsIDB4MDIsCisJMHg0MywgMHg1RSwgMHhGNiwgMHg1RiwgMHgwMywgMHhFNCwgMHhGRSwgMHgzMCwgMHgwMCwgMHgxQiwgMHgwMCwKKwkweEU0LCAweEZGLCAweDA4LCAweDAwLCAweEZELCAweEZGLCAweDJGLCAweDAwLCAweDRFLCAweEZGLCAweEMzLAorCTB4MDEsIDB4NEYsIDB4RkMsIDB4MjQsIDB4MDcsIDB4OUMsIDB4RjEsIDB4MTcsIDB4MkQsIDB4NTcsIDB4MzMsCisJMHg4QSwgMHhGMSwgMHhEMywgMHgwNiwgMHg5RiwgMHhGQywgMHg4QSwgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNSwKKwkweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweEQ5LCAweEZGLCAweEI0LCAweDAwLAorCTB4RkQsIDB4RkQsIDB4RDcsIDB4MDQsIDB4RkEsIDB4RjMsIDB4RkMsIDB4M0UsIDB4NUIsIDB4MUUsIDB4REIsCisJMHhGMywgMHhBNiwgMHgwNiwgMHg0QywgMHhGQywgMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE0LCAweEZGLCAweEMwLCAweDAwLCAweERFLCAweEZFLCAweDRCLAorCTB4MDEsIDB4MjcsIDB4RkYsIDB4NzMsIDB4RkUsIDB4NEYsIDB4NDgsIDB4QTIsIDB4MDksIDB4NTQsIDB4RkEsCisJMHhDQywgMHgwMywgMHg5MywgMHhGRCwgMHg1QywgMHgwMSwgMHg2NywgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlDLCAweDAxLCAweDA1LCAweEZELAorCTB4RjEsIDB4MDQsIDB4RjAsIDB4RjcsIDB4MkQsIDB4MTAsIDB4NjEsIDB4NDYsIDB4MEQsIDB4RkEsIDB4NTgsCisJMHgwMSwgMHgxMywgMHgwMCwgMHg4NywgMHhGRiwgMHg2RSwgMHgwMCwgMHhDNCwgMHhGRiwgMHgwRSwgMHgwMCwKKwkweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDE0LAorCTB4MDcsIDB4NzMsIDB4RjIsIDB4OTksIDB4MjUsIDB4QzIsIDB4MzksIDB4NTQsIDB4RjIsIDB4MDUsIDB4MDYsCisJMHgzNywgMHhGRCwgMHgyQiwgMHgwMSwgMHg5RSwgMHhGRiwgMHgxMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweEZGLCAweDE0LCAweDAwLCAweDlCLCAweEZGLCAweDMxLCAweDAxLCAweDJDLCAweEZELCAweDE1LCAweDA2LAorCTB4NDEsIDB4RjIsIDB4NkEsIDB4MzksIDB4MEEsIDB4MjYsIDB4NjEsIDB4RjIsIDB4MTcsIDB4MDcsIDB4MzEsCisJMHhGQywgMHhFMiwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRSwgMHgwMCwKKwkweEM2LCAweEZGLCAweDY5LCAweDAwLCAweDkxLCAweEZGLCAweDAwLCAweDAwLCAweDc4LCAweDAxLCAweEQwLAorCTB4RjksIDB4MzksIDB4NDYsIDB4OTgsIDB4MTAsIDB4Q0IsIDB4RjcsIDB4MDIsIDB4MDUsIDB4RkUsIDB4RkMsCisJMHg5RiwgMHgwMSwgMHg0RCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwKKwkweDAwLCAweDY5LCAweEZGLCAweDU4LCAweDAxLCAweDlELCAweEZELCAweEI5LCAweDAzLCAweDdCLCAweEZBLAorCTB4NDAsIDB4MDksIDB4NjMsIDB4NDgsIDB4QkYsIDB4RkUsIDB4MDMsIDB4RkYsIDB4NUYsIDB4MDEsIDB4RDQsCisJMHhGRSwgMHhDNSwgMHgwMCwgMHhBMiwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM2LCAweEZGLCAweEUyLCAweDAxLCAweDRGLCAweEZDLCAweDlDLCAweDA2LCAweEY1LCAweEYzLCAweEVBLAorCTB4MUQsIDB4NDcsIDB4M0YsIDB4MUIsIDB4RjQsIDB4QzEsIDB4MDQsIDB4MEIsIDB4RkUsIDB4QUMsIDB4MDAsCisJMHhERSwgMHhGRiwgMHhGQiwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QSwKKwkweEZGLCAweDhFLCAweDAxLCAweDk5LCAweEZDLCAweERCLCAweDA2LCAweDg2LCAweEYxLCAweEYyLCAweDMyLAorCTB4ODIsIDB4MkQsIDB4OTYsIDB4RjEsIDB4MjEsIDB4MDcsIDB4NTMsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NTAsCisJMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNywgMHgwMCwgMHhFNiwgMHhGRiwgMHgxNywgMHgwMCwKKwkweDM5LCAweDAwLCAweEQ0LCAweEZFLCAweDdBLCAweDAzLCAweDJGLCAweEY2LCAweEM3LCAweDQyLCAweDA2LAorCTB4MTgsIDB4N0IsIDB4RjUsIDB4MDUsIDB4MDYsIDB4OEEsIDB4RkMsIDB4Q0YsIDB4MDEsIDB4M0MsIDB4RkYsCisJMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4OCwgMHhGRiwgMHgwNywgMHgwMSwgMHg0OSwKKwkweEZFLCAweDY3LCAweDAyLCAweDEzLCAweEZELCAweEZGLCAweDAyLCAweEY0LCAweDQ4LCAweDVGLCAweDA0LAorCTB4N0EsIDB4RkMsIDB4QjYsIDB4MDIsIDB4MjAsIDB4RkUsIDB4MUIsIDB4MDEsIDB4ODEsIDB4RkYsIDB4MUYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRiwgMHhGRiwgMHhDNiwgMHgwMSwKKwkweEExLCAweEZDLCAweENGLCAweDA1LCAweEZDLCAweEY1LCAweDQ3LCAweDE2LCAweEIwLCAweDQzLCAweEVFLAorCTB4RjYsIDB4MEMsIDB4MDMsIDB4MTYsIDB4RkYsIDB4MTQsIDB4MDAsIDB4MjksIDB4MDAsIDB4REYsIDB4RkYsCisJMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhDQSwgMHgwMSwgMHg0NiwKKwkweEZDLCAweDI5LCAweDA3LCAweEIzLCAweEYxLCAweEQxLCAweDJCLCAweDgxLCAweDM0LCAweDlDLCAweEYxLAorCTB4QjgsIDB4MDYsIDB4QjUsIDB4RkMsIDB4N0MsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhDRSwgMHhGRiwgMHhDQywgMHgwMCwgMHhENSwgMHhGRCwKKwkweDE2LCAweDA1LCAweDlCLCAweEYzLCAweDE4LCAweDNFLCAweEIxLCAweDFGLCAweDhGLCAweEYzLCAweEMwLAorCTB4MDYsIDB4NDMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgxNSwgMHgwMCwgMHhBQSwgMHhGRiwgMHhCMSwgMHgwMCwgMHhGRSwgMHhGRSwgMHgxMCwgMHgwMSwgMHg5MiwKKwkweEZGLCAweDk0LCAweEZELCAweDBELCAweDQ4LCAweENCLCAweDBBLCAweEUyLCAweEY5LCAweDA0LCAweDA0LAorCTB4NzcsIDB4RkQsIDB4NjksIDB4MDEsIDB4NjIsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgyRCwgMHgwMCwgMHg1MiwgMHhGRiwgMHg5MSwgMHgwMSwgMHgxRSwgMHhGRCwgMHhCRSwgMHgwNCwKKwkweDVFLCAweEY4LCAweEYwLCAweDBFLCAweEQzLCAweDQ2LCAweENCLCAweEZBLCAweEY2LCAweDAwLCAweDRCLAorCTB4MDAsIDB4NjksIDB4RkYsIDB4N0QsIDB4MDAsIDB4QkUsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMiwgMHhGQywgMHgwNiwgMHgwNywgMHhBQSwKKwkweEYyLCAweDQ2LCAweDI0LCAweEM4LCAweDNBLCAweDkwLCAweEYyLCAweEQ2LCAweDA1LCAweDU3LCAweEZELAorCTB4MTcsIDB4MDEsIDB4QTgsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTgsCisJMHgwMCwgMHg5MSwgMHhGRiwgMHg0MywgMHgwMSwgMHgwRSwgMHhGRCwgMHg0MCwgMHgwNiwgMHgwRiwgMHhGMiwKKwkweDVCLCAweDM4LCAweDVDLCAweDI3LCAweDMwLCAweEYyLCAweDIxLCAweDA3LCAweDMzLCAweEZDLCAweERFLAorCTB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0MsIDB4RkYsCisJMHg1QSwgMHgwMCwgMHhBRiwgMHhGRiwgMHhDQSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgxQywgMHhGOSwgMHhCOCwKKwkweDQ1LCAweERBLCAweDExLCAweDYwLCAweEY3LCAweDMzLCAweDA1LCAweEU3LCAweEZDLCAweEE5LCAweDAxLAorCTB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkUsCisJMHhGRiwgMHg0QiwgMHgwMSwgMHhCOSwgMHhGRCwgMHg4MCwgMHgwMywgMHhFRSwgMHhGQSwgMHgxRCwgMHgwOCwKKwkweDk4LCAweDQ4LCAweEE4LCAweEZGLCAweDk1LCAweEZFLCAweDlBLCAweDAxLCAweEI0LCAweEZFLCAweEQ0LAorCTB4MDAsIDB4OUMsIDB4RkYsIDB4MTgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCisJMHhERiwgMHgwMSwgMHg1QSwgMHhGQywgMHg3RSwgMHgwNiwgMHg0NywgMHhGNCwgMHg5NCwgMHgxQywgMHgxRiwKKwkweDQwLCAweDg1LCAweEY0LCAweDdELCAweDA0LCAweDM2LCAweEZFLCAweDkzLCAweDAwLCAweEVBLCAweEZGLAorCTB4RjcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsIDB4OUIsCisJMHgwMSwgMHg4NiwgMHhGQywgMHhGMSwgMHgwNiwgMHg3RSwgMHhGMSwgMHhDMCwgMHgzMSwgMHhDMiwgMHgyRSwKKwkweDg3LCAweEYxLCAweDE3LCAweDA3LCAweDVGLCAweEZDLCAweEI2LCAweDAxLCAweDU1LCAweEZGLCAweDJELAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RUIsIDB4RkYsIDB4MDksIDB4MDAsIDB4NTQsIDB4MDAsCisJMHhBNCwgMHhGRSwgMHhDOSwgMHgwMywgMHhBQSwgMHhGNSwgMHgwQywgMHg0MiwgMHg1NiwgMHgxOSwgMHgxRSwKKwkweEY1LCAweDJCLCAweDA2LCAweDdBLCAweEZDLCAweEQ0LCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEUsIDB4RkYsIDB4RjksIDB4MDAsIDB4NjgsIDB4RkUsIDB4MkMsCisJMHgwMiwgMHg4NCwgMHhGRCwgMHhGRiwgMHgwMSwgMHhFNiwgMHg0OCwgMHg2RSwgMHgwNSwgMHgwNywgMHhGQywKKwkweEYxLCAweDAyLCAweDAxLCAweEZFLCAweDI5LCAweDAxLCAweDdCLCAweEZGLCAweDIxLCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkUsIDB4MDEsIDB4QjQsIDB4RkMsCisJMHhBNCwgMHgwNSwgMHg2MSwgMHhGNiwgMHhGQiwgMHgxNCwgMHg1MywgMHg0NCwgMHg4NiwgMHhGNywgMHhCNiwKKwkweDAyLCAweDQ5LCAweEZGLCAweEY3LCAweEZGLCAweDM3LCAweDAwLCAweEQ5LCAweEZGLCAweDBBLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDYsIDB4RkYsIDB4RDEsIDB4MDEsIDB4M0UsIDB4RkMsIDB4MkIsCisJMHgwNywgMHhEMCwgMHhGMSwgMHg4OSwgMHgyQSwgMHhBNiwgMHgzNSwgMHhCNCwgMHhGMSwgMHg5OSwgMHgwNiwKKwkweENELCAweEZDLCAweDZELCAweDAxLCAweDdDLCAweEZGLCAweDFGLCAweDAwLCAweEZFLCAweEZGLCAweDAxLAorCTB4MDAsIDB4MDYsIDB4MDAsIDB4QzIsIDB4RkYsIDB4RTMsIDB4MDAsIDB4QUUsIDB4RkQsIDB4NTIsIDB4MDUsCisJMHg0NCwgMHhGMywgMHgyQSwgMHgzRCwgMHgwNiwgMHgyMSwgMHg0NywgMHhGMywgMHhEOCwgMHgwNiwgMHgzQywKKwkweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEzLCAweDAwLAorCTB4QjAsIDB4RkYsIDB4QTIsIDB4MDAsIDB4MUQsIDB4RkYsIDB4RDYsIDB4MDAsIDB4RkMsIDB4RkYsIDB4QkMsCisJMHhGQywgMHhDMCwgMHg0NywgMHhGQSwgMHgwQiwgMHg3MCwgMHhGOSwgMHgzQywgMHgwNCwgMHg1QywgMHhGRCwKKwkweDc1LCAweDAxLCAweDVELCAweEZGLCAweDJBLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDJCLAorCTB4MDAsIDB4NTcsIDB4RkYsIDB4ODYsIDB4MDEsIDB4MzYsIDB4RkQsIDB4ODksIDB4MDQsIDB4Q0QsIDB4RjgsCisJMHhCNywgMHgwRCwgMHgzRCwgMHg0NywgMHg5MSwgMHhGQiwgMHg5MSwgMHgwMCwgMHg4MywgMHgwMCwgMHg0QSwKKwkweEZGLCAweDhDLCAweDAwLCAweEI5LCAweEZGLCAweDExLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAorCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsIDB4RkMsIDB4RjUsIDB4MDYsIDB4RTcsIDB4RjIsIDB4RjIsCisJMHgyMiwgMHhDNywgMHgzQiwgMHhENCwgMHhGMiwgMHhBMiwgMHgwNSwgMHg3QSwgMHhGRCwgMHgwMiwgMHgwMSwKKwkweEIyLCAweEZGLCAweDBCLCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDg4LAorCTB4RkYsIDB4NTUsIDB4MDEsIDB4RjIsIDB4RkMsIDB4NjcsIDB4MDYsIDB4RTQsIDB4RjEsIDB4NDQsIDB4MzcsCisJMHhBQSwgMHgyOCwgMHgwNSwgMHhGMiwgMHgyNywgMHgwNywgMHgzNiwgMHhGQywgMHhEQSwgMHgwMSwgMHg0MSwKKwkweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDBCLCAweDAwLCAweEQyLCAweEZGLCAweDRDLCAweDAwLAorCTB4Q0QsIDB4RkYsIDB4OTQsIDB4RkYsIDB4MzQsIDB4MDIsIDB4NzAsIDB4RjgsIDB4MkUsIDB4NDUsIDB4MjAsCisJMHgxMywgMHhGNiwgMHhGNiwgMHg2MiwgMHgwNSwgMHhEMSwgMHhGQywgMHhCMiwgMHgwMSwgMHg0NiwgMHhGRiwKKwkweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLCAweDczLCAweEZGLCAweDNELAorCTB4MDEsIDB4RDYsIDB4RkQsIDB4NDYsIDB4MDMsIDB4NjEsIDB4RkIsIDB4MDAsIDB4MDcsIDB4QkYsIDB4NDgsCisJMHg5OCwgMHgwMCwgMHgyNiwgMHhGRSwgMHhENSwgMHgwMSwgMHg5NSwgMHhGRSwgMHhFMywgMHgwMCwgMHg5NiwKKwkweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERCLCAweDAxLAorCTB4NjYsIDB4RkMsIDB4NUUsIDB4MDYsIDB4OUMsIDB4RjQsIDB4NDAsIDB4MUIsIDB4RUYsIDB4NDAsIDB4RjcsCisJMHhGNCwgMHgzNSwgMHgwNCwgMHg2MiwgMHhGRSwgMHg3QSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGMiwgMHhGRiwKKwkweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVELCAweEZGLCAweEE3LCAweDAxLCAweDc1LAorCTB4RkMsIDB4MDMsIDB4MDcsIDB4N0QsIDB4RjEsIDB4OEEsIDB4MzAsIDB4RkYsIDB4MkYsIDB4N0UsIDB4RjEsCisJMHgwQSwgMHgwNywgMHg2RSwgMHhGQywgMHhBQywgMHgwMSwgMHg1QSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDA1LCAweDAwLCAweEYwLCAweEZGLCAweEZDLCAweEZGLCAweDZFLCAweDAwLCAweDc2LCAweEZFLAorCTB4MTUsIDB4MDQsIDB4MkMsIDB4RjUsIDB4NDksIDB4NDEsIDB4QTksIDB4MUEsIDB4QzMsIDB4RjQsIDB4NEYsCisJMHgwNiwgMHg2QywgMHhGQywgMHhEOSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDFBLCAweDAwLCAweDk0LCAweEZGLCAweEVBLCAweDAwLCAweDg3LCAweEZFLCAweEYwLCAweDAxLCAweEY1LAorCTB4RkQsIDB4MDUsIDB4MDEsIDB4Q0UsIDB4NDgsIDB4ODMsIDB4MDYsIDB4OTQsIDB4RkIsIDB4MkMsIDB4MDMsCisJMHhFNCwgMHhGRCwgMHgzNywgMHgwMSwgMHg3NiwgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDMxLCAweDAwLCAweDQ1LCAweEZGLCAweEI2LCAweDAxLCAweEM4LCAweEZDLCAweDc3LCAweDA1LAorCTB4QzcsIDB4RjYsIDB4QjEsIDB4MTMsIDB4RUQsIDB4NDQsIDB4MjYsIDB4RjgsIDB4NUQsIDB4MDIsIDB4N0QsCisJMHhGRiwgMHhEQSwgMHhGRiwgMHg0NiwgMHgwMCwgMHhENCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDMzLCAweDAwLCAweDQyLCAweEZGLCAweEQ3LCAweDAxLCAweDM4LCAweEZDLCAweDI5LCAweDA3LCAweEYzLAorCTB4RjEsIDB4M0UsIDB4MjksIDB4QzYsIDB4MzYsIDB4RDQsIDB4RjEsIDB4NzcsIDB4MDYsIDB4RTYsIDB4RkMsCisJMHg1QywgMHgwMSwgMHg4NCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwQSwKKwkweDAwLCAweEI3LCAweEZGLCAweEY5LCAweDAwLCAweDg5LCAweEZELCAweDhBLCAweDA1LCAweEY0LCAweEYyLAorCTB4MzcsIDB4M0MsIDB4NUIsIDB4MjIsIDB4MDMsIDB4RjMsIDB4RUQsIDB4MDYsIDB4MzcsIDB4RkMsIDB4RTYsCisJMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCNiwgMHhGRiwKKwkweDkzLCAweDAwLCAweDNDLCAweEZGLCAweDlELCAweDAwLCAweDYzLCAweDAwLCAweEVCLCAweEZCLCAweDY5LAorCTB4NDcsIDB4MkQsIDB4MEQsIDB4RkYsIDB4RjgsIDB4NzIsIDB4MDQsIDB4NDIsIDB4RkQsIDB4ODEsIDB4MDEsCisJMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QiwKKwkweEZGLCAweDdBLCAweDAxLCAweDUwLCAweEZELCAweDU0LCAweDA0LCAweDNELCAweEY5LCAweDgyLCAweDBDLAorCTB4OUEsIDB4NDcsIDB4NUUsIDB4RkMsIDB4MkEsIDB4MDAsIDB4QkQsIDB4MDAsIDB4MkIsIDB4RkYsIDB4OUIsCisJMHgwMCwgMHhCMywgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKKwkweEU2LCAweDAxLCAweDNBLCAweEZDLCAweEUyLCAweDA2LCAweDI4LCAweEYzLCAweDlFLCAweDIxLCAweEMwLAorCTB4M0MsIDB4MUYsIDB4RjMsIDB4NkMsIDB4MDUsIDB4OUUsIDB4RkQsIDB4RUQsIDB4MDAsIDB4QkQsIDB4RkYsCisJMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4MCwgMHhGRiwgMHg2NiwKKwkweDAxLCAweEQ4LCAweEZDLCAweDhCLCAweDA2LCAweEMxLCAweEYxLCAweDI3LCAweDM2LCAweEY2LCAweDI5LAorCTB4REYsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0IsIDB4RkMsIDB4RDQsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwgMHhENywgMHhGRiwgMHgzRSwgMHgwMCwgMHhFQSwgMHhGRiwKKwkweDYwLCAweEZGLCAweDhGLCAweDAyLCAweENELCAweEY3LCAweDk5LCAweDQ0LCAweDY4LCAweDE0LCAweDhFLAorCTB4RjYsIDB4OTAsIDB4MDUsIDB4QkMsIDB4RkMsIDB4QkEsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzIsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3OSwgMHhGRiwgMHgyRiwgMHgwMSwgMHhGNCwKKwkweEZELCAweDBDLCAweDAzLCAweEQ0LCAweEZCLCAweEU5LCAweDA1LCAweERFLCAweDQ4LCAweDhGLCAweDAxLAorCTB4QjYsIDB4RkQsIDB4MTEsIDB4MDIsIDB4NzYsIDB4RkUsIDB4RjIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4MUIsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhENywgMHgwMSwgMHg3MywgMHhGQywKKwkweDNCLCAweDA2LCAweEY1LCAweEY0LCAweEVELCAweDE5LCAweEI3LCAweDQxLCAweDcxLCAweEY1LCAweEVCLAorCTB4MDMsIDB4OTAsIDB4RkUsIDB4NjAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RUQsIDB4RkYsIDB4MDYsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywgMHhGRiwgMHhCMiwgMHgwMSwgMHg2NSwgMHhGQywgMHgxMiwKKwkweDA3LCAweDgyLCAweEYxLCAweDUwLCAweDJGLCAweDM4LCAweDMxLCAweDdDLCAweEYxLCAweEY5LCAweDA2LAorCTB4N0UsIDB4RkMsIDB4QTEsIDB4MDEsIDB4NjEsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDQsCisJMHgwMCwgMHhGNSwgMHhGRiwgMHhFRiwgMHhGRiwgMHg4OCwgMHgwMCwgMHg0OSwgMHhGRSwgMHg1RCwgMHgwNCwKKwkweEI3LCAweEY0LCAweDdELCAweDQwLCAweEZELCAweDFCLCAweDZDLCAweEY0LCAweDcwLCAweDA2LCAweDVGLAorCTB4RkMsIDB4REUsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTksIDB4MDAsCisJMHg5QSwgMHhGRiwgMHhEQiwgMHgwMCwgMHhBNiwgMHhGRSwgMHhCNCwgMHgwMSwgMHg2NCwgMHhGRSwgMHgxMiwKKwkweDAwLCAweEFBLCAweDQ4LCAweDlFLCAweDA3LCAweDIxLCAweEZCLCAweDY2LCAweDAzLCAweEM2LCAweEZELAorCTB4NDUsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzAsCisJMHgwMCwgMHg0OCwgMHhGRiwgMHhBRCwgMHgwMSwgMHhERCwgMHhGQywgMHg0OCwgMHgwNSwgMHgzMCwgMHhGNywKKwkweDZCLCAweDEyLCAweDdELCAweDQ1LCAweENGLCAweEY4LCAweDAxLCAweDAyLCAweEIyLCAweEZGLCAweEJELAorCTB4RkYsIDB4NTQsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHgzRiwgMHhGRiwgMHhEQywgMHgwMSwgMHgzNCwgMHhGQywgMHgyNCwgMHgwNywgMHgxQywgMHhGMiwgMHhGMCwKKwkweDI3LCAweERGLCAweDM3LCAweEZCLCAweEYxLCAweDUxLCAweDA2LCAweDAxLCAweEZELCAweDRCLCAweDAxLAorCTB4OEQsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QUMsCisJMHhGRiwgMHgwRSwgMHgwMSwgMHg2NiwgMHhGRCwgMHhCRiwgMHgwNSwgMHhBRCwgMHhGMiwgMHgzQiwgMHgzQiwKKwkweEIwLCAweDIzLCAweEM0LCAweEYyLCAweEZGLCAweDA2LCAweDMzLCAweEZDLCAweEU1LCAweDAxLCAweDM4LAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4QkMsIDB4RkYsIDB4ODQsIDB4MDAsCisJMHg1QiwgMHhGRiwgMHg2NCwgMHgwMCwgMHhDOSwgMHgwMCwgMHgyMiwgMHhGQiwgMHgwMiwgMHg0NywgMHg2NCwKKwkweDBFLCAweDhGLCAweEY4LCAweEE3LCAweDA0LCAweDI5LCAweEZELCAweDhDLCAweDAxLCAweDU0LCAweEZGLAorCTB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjksIDB4MDAsIDB4NjAsIDB4RkYsIDB4NkUsCisJMHgwMSwgMHg2QiwgMHhGRCwgMHgxRCwgMHgwNCwgMHhBRiwgMHhGOSwgMHg1MSwgMHgwQiwgMHhFQywgMHg0NywKKwkweDMzLCAweEZELCAweEMxLCAweEZGLCAweEY3LCAweDAwLCAweDBDLCAweEZGLCAweEFBLCAweDAwLCAweEFELAorCTB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsCisJMHg0MCwgMHhGQywgMHhDQiwgMHgwNiwgMHg2RSwgMHhGMywgMHg0OSwgMHgyMCwgMHhCMCwgMHgzRCwgMHg3MywKKwkweEYzLCAweDMxLCAweDA1LCAweEM0LCAweEZELCAweEQ2LCAweDAwLCAweEM4LCAweEZGLCAweDAzLCAweDAwLAorCTB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjEsIDB4MDAsIDB4NzcsIDB4RkYsIDB4NzUsIDB4MDEsIDB4QkYsCisJMHhGQywgMHhBQiwgMHgwNiwgMHhBNiwgMHhGMSwgMHgwNSwgMHgzNSwgMHg0MCwgMHgyQiwgMHhCRiwgMHhGMSwKKwkweDJBLCAweDA3LCAweDQyLCAweEZDLCAweENFLCAweDAxLCAweDQ4LCAweEZGLCAweDMxLCAweDAwLCAweEZELAorCTB4RkYsIDB4MDksIDB4MDAsIDB4REMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MkMsIDB4RkYsCisJMHhFNiwgMHgwMiwgMHgzMSwgMHhGNywgMHhGQSwgMHg0MywgMHhCMywgMHgxNSwgMHgyOSwgMHhGNiwgMHhCQywKKwkweDA1LCAweEE5LCAweEZDLCAweEMyLCAweDAxLCAweDQwLCAweEZGLCAweDMzLCAweDAwLCAweEZGLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0UsIDB4RkYsIDB4MjEsIDB4MDEsIDB4MTIsIDB4RkUsIDB4RDEsCisJMHgwMiwgMHg0NywgMHhGQywgMHhENywgMHgwNCwgMHhGMCwgMHg0OCwgMHg4RCwgMHgwMiwgMHg0NSwgMHhGRCwKKwkweDRELCAweDAyLCAweDU2LCAweEZFLCAweDAxLCAweDAxLCAweDhCLCAweEZGLCAweDFELCAweDAwLCAweEZFLAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDEsIDB4MDEsIDB4ODMsIDB4RkMsIDB4MTYsIDB4MDYsCisJMHg1MSwgMHhGNSwgMHg5QiwgMHgxOCwgMHg3NSwgMHg0MiwgMHhGMywgMHhGNSwgMHg5RCwgMHgwMywgMHhCRiwKKwkweEZFLCAweDQ1LCAweDAwLCAweDExLCAweDAwLCAweEU4LCAweEZGLCAweDA3LCAweDAwLCAweEZELCAweEZGLAorCTB4MkUsIDB4MDAsIDB4NTIsIDB4RkYsIDB4QkMsIDB4MDEsIDB4NTgsIDB4RkMsIDB4MUQsIDB4MDcsIDB4OEUsCisJMHhGMSwgMHgxMSwgMHgyRSwgMHg2QiwgMHgzMiwgMHg4MSwgMHhGMSwgMHhFNSwgMHgwNiwgMHg5MCwgMHhGQywKKwkweDk0LCAweDAxLCAweDY3LCAweEZGLCAweDI2LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY5LAorCTB4RkYsIDB4RTMsIDB4RkYsIDB4QTEsIDB4MDAsIDB4MUUsIDB4RkUsIDB4QTMsIDB4MDQsIDB4NDksIDB4RjQsCisJMHhBOCwgMHgzRiwgMHg1MiwgMHgxRCwgMHgxOSwgMHhGNCwgMHg5MCwgMHgwNiwgMHg1MywgMHhGQywgMHhFMSwKKwkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE3LCAweDAwLCAweEEwLCAweEZGLAorCTB4Q0MsIDB4MDAsIDB4QzYsIDB4RkUsIDB4NzksIDB4MDEsIDB4RDIsIDB4RkUsIDB4MjYsIDB4RkYsIDB4N0MsCisJMHg0OCwgMHhCRSwgMHgwOCwgMHhBRSwgMHhGQSwgMHhBMCwgMHgwMywgMHhBOSwgMHhGRCwgMHg1MiwgMHgwMSwKKwkweDZCLCAweEZGLCAweDI1LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRDLAorCTB4RkYsIDB4QTMsIDB4MDEsIDB4RjMsIDB4RkMsIDB4MTgsIDB4MDUsIDB4OUIsIDB4RjcsIDB4MjcsIDB4MTEsCisJMHgwMiwgMHg0NiwgMHg3RiwgMHhGOSwgMHhBMywgMHgwMSwgMHhFOCwgMHhGRiwgMHg5RiwgMHhGRiwgMHg2MywKKwkweDAwLCAweEM5LCAweEZGLCAweDBELCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLAorCTB4RTAsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUMsIDB4MDcsIDB4NEIsIDB4RjIsIDB4QTAsIDB4MjYsIDB4RjIsCisJMHgzOCwgMHgyQSwgMHhGMiwgMHgyOCwgMHgwNiwgMHgxRiwgMHhGRCwgMHgzOSwgMHgwMSwgMHg5NiwgMHhGRiwKKwkweDE2LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweEEyLCAweEZGLCAweDIyLAorCTB4MDEsIDB4NDUsIDB4RkQsIDB4RjEsIDB4MDUsIDB4NkQsIDB4RjIsIDB4MzgsIDB4M0EsIDB4MDMsIDB4MjUsCisJMHg4QiwgMHhGMiwgMHgwRSwgMHgwNywgMHgzMiwgMHhGQywgMHhFNCwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLCAweEMyLCAweEZGLCAweDc1LCAweDAwLCAweDdBLCAweEZGLAorCTB4MkIsIDB4MDAsIDB4MkQsIDB4MDEsIDB4NjEsIDB4RkEsIDB4OTcsIDB4NDYsIDB4QTAsIDB4MEYsIDB4MjAsCisJMHhGOCwgMHhEQSwgMHgwNCwgMHgxMCwgMHhGRCwgMHg5NywgMHgwMSwgMHg1MCwgMHhGRiwgMHgyRSwgMHgwMCwKKwkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LCAweDAwLCAweDY1LCAweEZGLCAweDYyLCAweDAxLCAweDg3LAorCTB4RkQsIDB4RTUsIDB4MDMsIDB4MjEsIDB4RkEsIDB4MjUsIDB4MEEsIDB4MzMsIDB4NDgsIDB4MEYsIDB4RkUsCisJMHg1NywgMHhGRiwgMHgzMSwgMHgwMSwgMHhFQywgMHhGRSwgMHhCOSwgMHgwMCwgMHhBNywgMHhGRiwgMHgxNSwKKwkweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LCAweDAxLCAweDQ4LCAweEZDLAorCTB4QjIsIDB4MDYsIDB4QjksIDB4RjMsIDB4RjMsIDB4MUUsIDB4OTgsIDB4M0UsIDB4Q0YsIDB4RjMsIDB4RjMsCisJMHgwNCwgMHhFQiwgMHhGRCwgMHhCRiwgMHgwMCwgMHhENCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMywgMHgwMCwKKwkweEZFLCAweEZGLCAweDIzLCAweDAwLCAweDcwLCAweEZGLCAweDg0LCAweDAxLCAweEE5LCAweEZDLCAweEM3LAorCTB4MDYsIDB4OTEsIDB4RjEsIDB4REMsIDB4MzMsIDB4ODcsIDB4MkMsIDB4QTUsIDB4RjEsIDB4MjYsIDB4MDcsCisJMHg0QiwgMHhGQywgMHhDNiwgMHgwMSwgMHg0QywgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOCwKKwkweDAwLCAweEUyLCAweEZGLCAweDIxLCAweDAwLCAweDIzLCAweDAwLCAweEZBLCAweEZFLCAweDNBLCAweDAzLAorCTB4OUQsIDB4RjYsIDB4NTAsIDB4NDMsIDB4MDAsIDB4MTcsIDB4QzYsIDB4RjUsIDB4RTYsIDB4MDUsIDB4OTcsCisJMHhGQywgMHhDOSwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDEzLCAweDAxLCAweDMxLCAweEZFLCAweDk1LCAweDAyLCAweEJBLAorCTB4RkMsIDB4Q0IsIDB4MDMsIDB4RjcsIDB4NDgsIDB4OTEsIDB4MDMsIDB4RDMsIDB4RkMsIDB4ODgsIDB4MDIsCisJMHgzOCwgMHhGRSwgMHgxMCwgMHgwMSwgMHg4NSwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwKKwkweDAwLCAweDNELCAweEZGLCAweENCLCAweDAxLCAweDkzLCAweEZDLCAweEVGLCAweDA1LCAweEIwLCAweEY1LAorCTB4NEIsIDB4MTcsIDB4MkEsIDB4NDMsIDB4N0QsIDB4RjYsIDB4NEQsIDB4MDMsIDB4RUYsIDB4RkUsIDB4MkEsCisJMHgwMCwgMHgxRSwgMHgwMCwgMHhFMywgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwKKwkweDRELCAweEZGLCAweEM0LCAweDAxLCAweDRELCAweEZDLCAweDI1LCAweDA3LCAweEExLCAweEYxLCAweENFLAorCTB4MkMsIDB4OTksIDB4MzMsIDB4OEUsIDB4RjEsIDB4Q0QsIDB4MDYsIDB4QTQsIDB4RkMsIDB4ODcsIDB4MDEsCisJMHg2RSwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRSwgMHhGRiwgMHhENywKKwkweEZGLCAweEJBLCAweDAwLCAweEY0LCAweEZELCAweEU1LCAweDA0LCAweEU0LCAweEYzLCAweENBLCAweDNFLAorCTB4QTcsIDB4MUUsIDB4Q0EsIDB4RjMsIDB4QUMsIDB4MDYsIDB4NEEsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBNiwgMHhGRiwgMHhCRCwgMHgwMCwKKwkweEU1LCAweEZFLCAweDNFLCAweDAxLCAweDNGLCAweEZGLCAweDQxLCAweEZFLCAweDQxLCAweDQ4LCAweEU0LAorCTB4MDksIDB4M0IsIDB4RkEsIDB4RDksIDB4MDMsIDB4OEQsIDB4RkQsIDB4NUYsIDB4MDEsIDB4NjYsIDB4RkYsCisJMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RiwgMHhGRiwgMHg5OSwKKwkweDAxLCAweDBCLCAweEZELCAweEU2LCAweDA0LCAweDA4LCAweEY4LCAweEU3LCAweDBGLCAweDdDLCAweDQ2LAorCTB4MzcsIDB4RkEsIDB4NDIsIDB4MDEsIDB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4QzMsCisJMHhGRiwgMHgwRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhFMywgMHgwMSwKKwkweDMxLCAweEZDLCAweDExLCAweDA3LCAweDdGLCAweEYyLCAweDRFLCAweDI1LCAweEZELCAweDM5LCAweDYwLAorCTB4RjIsIDB4RkIsIDB4MDUsIDB4M0UsIDB4RkQsIDB4MjYsIDB4MDEsIDB4QTAsIDB4RkYsIDB4MTIsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNSwgMHgwMCwgMHg5OCwgMHhGRiwgMHgzNSwgMHgwMSwgMHgyNSwKKwkweEZELCAweDFFLCAweDA2LCAweDM1LCAweEYyLCAweDJFLCAweDM5LCAweDU1LCAweDI2LCAweDU2LCAweEYyLAorCTB4MUEsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTEsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwRSwgMHgwMCwgMHhDNywgMHhGRiwgMHg2NiwgMHgwMCwgMHg5OCwgMHhGRiwgMHhGNCwgMHhGRiwKKwkweDhFLCAweDAxLCAweEE3LCAweEY5LCAweDFELCAweDQ2LCAweERGLCAweDEwLCAweEIzLCAweEY3LCAweDBELAorCTB4MDUsIDB4RjgsIDB4RkMsIDB4QTEsIDB4MDEsIDB4NEMsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2QSwgMHhGRiwgMHg1NSwgMHgwMSwgMHhBMywgMHhGRCwgMHhBRCwKKwkweDAzLCAweDk0LCAweEZBLCAweEZGLCAweDA4LCAweDcwLCAweDQ4LCAweEYzLCAweEZFLCAweEVBLCAweEZFLAorCTB4NkMsIDB4MDEsIDB4Q0QsIDB4RkUsIDB4QzksIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFMiwgMHgwMSwgMHg1MSwgMHhGQywgMHg5NiwgMHgwNiwKKwkweDA3LCAweEY0LCAweDlFLCAweDFELCAweDc3LCAweDNGLCAweDMyLCAweEY0LCAweEIyLCAweDA0LCAweDE1LAorCTB4RkUsIDB4QTcsIDB4MDAsIDB4RTAsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgyNiwgMHgwMCwgMHg2OSwgMHhGRiwgMHg5MSwgMHgwMSwgMHg5NCwgMHhGQywgMHhFMCwgMHgwNiwgMHg4NCwKKwkweEYxLCAweEFGLCAweDMyLCAweENBLCAweDJELCAweDkyLCAweEYxLCAweDFGLCAweDA3LCAweDU2LCAweEZDLAorCTB4QkUsIDB4MDEsIDB4NTEsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RTcsCisJMHhGRiwgMHgxNCwgMHgwMCwgMHgzRiwgMHgwMCwgMHhDOSwgMHhGRSwgMHg4QywgMHgwMywgMHgxMSwgMHhGNiwKKwkweDlFLCAweDQyLCAweDUwLCAweDE4LCAweDY2LCAweEY1LCAweDBELCAweDA2LCAweDg2LCAweEZDLCAweEQwLAorCTB4MDEsIDB4M0IsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEEsIDB4RkYsCisJMHgwNCwgMHgwMSwgMHg1MCwgMHhGRSwgMHg1QSwgMHgwMiwgMHgyQywgMHhGRCwgMHhDNiwgMHgwMiwgMHhGMiwKKwkweDQ4LCAweDlCLCAweDA0LCAweDYxLCAweEZDLCAweEMzLCAweDAyLCAweDE5LCAweEZFLCAweDFFLCAweDAxLAorCTB4N0YsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsCisJMHhGRiwgMHhDNCwgMHgwMSwgMHhBNSwgMHhGQywgMHhDNSwgMHgwNSwgMHgxMywgMHhGNiwgMHhGRCwgMHgxNSwKKwkweEQ0LCAweDQzLCAweDBGLCAweEY3LCAweEY5LCAweDAyLCAweDIxLCAweEZGLCAweDBELCAweDAwLCAweDJDLAorCTB4MDAsIDB4REUsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDksIDB4RkYsCisJMHhDQywgMHgwMSwgMHg0NCwgMHhGQywgMHgyOSwgMHgwNywgMHhCOSwgMHhGMSwgMHg4OSwgMHgyQiwgMHhDMywKKwkweDM0LCAweEEwLCAweEYxLCAweEIxLCAweDA2LCAweEJBLCAweEZDLCAweDc5LCAweDAxLCAweDc2LCAweEZGLAorCTB4MjEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MDIsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4RDEsCisJMHgwMCwgMHhDQywgMHhGRCwgMHgyNCwgMHgwNSwgMHg4NywgMHhGMywgMHhFNCwgMHgzRCwgMHhGRCwgMHgxRiwKKwkweDdGLCAweEYzLCAweEM2LCAweDA2LCAweDQxLCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QUUsIDB4MDAsIDB4MDUsIDB4RkYsCisJMHgwMywgMHgwMSwgMHhBQSwgMHhGRiwgMHg2MywgMHhGRCwgMHhGRCwgMHg0NywgMHgwRSwgMHgwQiwgMHhDOCwKKwkweEY5LCAweDExLCAweDA0LCAweDcxLCAweEZELCAweDZDLCAweDAxLCAweDYxLCAweEZGLCAweDI4LCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTMsIDB4RkYsIDB4OEYsIDB4MDEsIDB4MjMsCisJMHhGRCwgMHhCMiwgMHgwNCwgMHg3NiwgMHhGOCwgMHhBQSwgMHgwRSwgMHhFRCwgMHg0NiwgMHhGNywgMHhGQSwKKwkweERGLCAweDAwLCAweDU3LCAweDAwLCAweDYyLCAweEZGLCAweDgwLCAweDAwLCAweEJELCAweEZGLCAweDEwLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsCisJMHgwMywgMHgwNywgMHhCNywgMHhGMiwgMHhGQywgMHgyMywgMHgwMywgMHgzQiwgMHg5RSwgMHhGMiwgMHhDQiwKKwkweDA1LCAweDVGLCAweEZELCAweDEyLCAweDAxLCAweEFBLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OEYsIDB4RkYsIDB4NDcsIDB4MDEsIDB4MDgsIDB4RkQsIDB4NDksCisJMHgwNiwgMHgwNSwgMHhGMiwgMHgxRCwgMHgzOCwgMHhBNiwgMHgyNywgMHgyNiwgMHhGMiwgMHgyMywgMHgwNywKKwkweDMzLCAweEZDLCAweERELCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDBDLAorCTB4MDAsIDB4Q0QsIDB4RkYsIDB4NTcsIDB4MDAsIDB4QjYsIDB4RkYsIDB4QkUsIDB4RkYsIDB4RUQsIDB4MDEsCisJMHhGNSwgMHhGOCwgMHg5QiwgMHg0NSwgMHgyMiwgMHgxMiwgMHg0OCwgMHhGNywgMHgzRCwgMHgwNSwgMHhFMiwKKwkweEZDLCAweEFCLCAweDAxLCAweDQ5LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorCTB4MjQsIDB4MDAsIDB4NkYsIDB4RkYsIDB4NDgsIDB4MDEsIDB4QzAsIDB4RkQsIDB4NzMsIDB4MDMsIDB4MDcsCisJMHhGQiwgMHhERCwgMHgwNywgMHhBMSwgMHg0OCwgMHhERCwgMHhGRiwgMHg3RCwgMHhGRSwgMHhBNywgMHgwMSwKKwkweEFELCAweEZFLCAweEQ4LCAweDAwLCAweDlCLCAweEZGLCAweDE4LCAweDAwLCAweEZFLCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsIDB4NUMsIDB4RkMsIDB4NzgsIDB4MDYsIDB4NUEsIDB4RjQsCisJMHg0OSwgMHgxQywgMHg0RSwgMHg0MCwgMHg5RSwgMHhGNCwgMHg2RCwgMHgwNCwgMHgzRiwgMHhGRSwgMHg4RSwKKwkweDAwLCAweEVELCAweEZGLCAweEY2LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLAorCTB4NjIsIDB4RkYsIDB4OUUsIDB4MDEsIDB4ODIsIDB4RkMsIDB4RjUsIDB4MDYsIDB4N0QsIDB4RjEsIDB4N0IsCisJMHgzMSwgMHgwOSwgMHgyRiwgMHg4NCwgMHhGMSwgMHgxNSwgMHgwNywgMHg2MiwgMHhGQywgMHhCNCwgMHgwMSwKKwkweDU2LCAweEZGLCAweDJDLCAweDAwLCAweEZELCAweEZGLCAweDA2LCAweDAwLCAweEVDLCAweEZGLCAweDA2LAorCTB4MDAsIDB4NUEsIDB4MDAsIDB4OUEsIDB4RkUsIDB4REEsIDB4MDMsIDB4OEQsIDB4RjUsIDB4RTEsIDB4NDEsCisJMHhBMSwgMHgxOSwgMHgwOSwgMHhGNSwgMHgzMywgMHgwNiwgMHg3NywgMHhGQywgMHhENiwgMHgwMSwgMHgzQSwKKwkweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFCLCAweDAwLCAweDhGLCAweEZGLCAweEY1LCAweDAwLAorCTB4NkYsIDB4RkUsIDB4MUUsIDB4MDIsIDB4OUQsIDB4RkQsIDB4QzcsIDB4MDEsIDB4RTEsIDB4NDgsIDB4QUIsCisJMHgwNSwgMHhFRSwgMHhGQiwgMHhGRSwgMHgwMiwgMHhGQiwgMHhGRCwgMHgyQywgMHgwMSwgMHg3QSwgMHhGRiwKKwkweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQyLCAweEZGLCAweEJDLAorCTB4MDEsIDB4QjgsIDB4RkMsIDB4OUEsIDB4MDUsIDB4NzcsIDB4RjYsIDB4QjEsIDB4MTQsIDB4NzcsIDB4NDQsCisJMHhBOSwgMHhGNywgMHhBMiwgMHgwMiwgMHg1NCwgMHhGRiwgMHhGMSwgMHhGRiwgMHgzQSwgMHgwMCwgMHhEOCwKKwkweEZGLCAweDBBLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ1LCAweEZGLCAweEQzLCAweDAxLAorCTB4M0MsIDB4RkMsIDB4MkEsIDB4MDcsIDB4RDgsIDB4RjEsIDB4M0YsIDB4MkEsIDB4RTYsIDB4MzUsIDB4QkIsCisJMHhGMSwgMHg5MiwgMHgwNiwgMHhEMiwgMHhGQywgMHg2OSwgMHgwMSwgMHg3RSwgMHhGRiwgMHgxRiwgMHgwMCwKKwkweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweEMwLCAweEZGLCAweEU4LCAweDAwLCAweEE2LAorCTB4RkQsIDB4NUYsIDB4MDUsIDB4MzEsIDB4RjMsIDB4RjYsIDB4M0MsIDB4NTIsIDB4MjEsIDB4MzcsIDB4RjMsCisJMHhERCwgMHgwNiwgMHgzQiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDEzLCAweDAwLCAweEIxLCAweEZGLCAweDlGLCAweDAwLCAweDI0LCAweEZGLCAweEM5LCAweDAwLAorCTB4MTMsIDB4MDAsIDB4OEQsIDB4RkMsIDB4QUUsIDB4NDcsIDB4M0UsIDB4MEMsIDB4NTYsIDB4RjksIDB4NDgsCisJMHgwNCwgMHg1NiwgMHhGRCwgMHg3OCwgMHgwMSwgMHg1QywgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU4LCAweEZGLCAweDgzLCAweDAxLCAweDNDLCAweEZELCAweDdFLAorCTB4MDQsIDB4RTYsIDB4RjgsIDB4NzIsIDB4MEQsIDB4NTIsIDB4NDcsIDB4QkUsIDB4RkIsIDB4N0EsIDB4MDAsCisJMHg5MCwgMHgwMCwgMHg0MywgMHhGRiwgMHg4RiwgMHgwMCwgMHhCNywgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM2LCAweEZDLCAweEYxLCAweDA2LAorCTB4RjUsIDB4RjIsIDB4QTcsIDB4MjIsIDB4RkYsIDB4M0IsIDB4RTQsIDB4RjIsIDB4OTYsIDB4MDUsIDB4ODEsCisJMHhGRCwgMHhGRCwgMHgwMCwgMHhCNSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDFDLCAweDAwLCAweDg2LCAweEZGLCAweDU5LCAweDAxLCAweEVDLCAweEZDLCAweDZGLCAweDA2LCAweERDLAorCTB4RjEsIDB4MDQsIDB4MzcsIDB4RjMsIDB4MjgsIDB4RkMsIDB4RjEsIDB4MjgsIDB4MDcsIDB4MzcsIDB4RkMsCisJMHhEOCwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQiwgMHgwMCwgMHhEMywKKwkweEZGLCAweDQ5LCAweDAwLCAweEQ0LCAweEZGLCAweDg4LCAweEZGLCAweDQ5LCAweDAyLCAweDRCLCAweEY4LAorCTB4MEQsIDB4NDUsIDB4NjgsIDB4MTMsIDB4REYsIDB4RjYsIDB4NkMsIDB4MDUsIDB4Q0MsIDB4RkMsIDB4QjQsCisJMHgwMSwgMHg0NSwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMywgMHgwMCwKKwkweDc0LCAweEZGLCAweDNBLCAweDAxLCAweERELCAweEZELCAweDM5LCAweDAzLCAweDdCLCAweEZCLCAweEMxLAorCTB4MDYsIDB4QzcsIDB4NDgsIDB4Q0YsIDB4MDAsIDB4MEQsIDB4RkUsIDB4RTMsIDB4MDEsIDB4OEUsIDB4RkUsCisJMHhFNywgMHgwMCwgMHg5NSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwKKwkweEZGLCAweERBLCAweDAxLCAweDY5LCAweEZDLCAweDU3LCAweDA2LCAweEFGLCAweEY0LCAweEY1LCAweDFBLAorCTB4MUQsIDB4NDEsIDB4MTEsIDB4RjUsIDB4MjUsIDB4MDQsIDB4NkMsIDB4RkUsIDB4NzQsIDB4MDAsIDB4RjksCisJMHhGRiwgMHhGMSwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwKKwkweEFBLCAweDAxLCAweDcxLCAweEZDLCAweDA3LCAweDA3LCAweDdFLCAweEYxLCAweDQ0LCAweDMwLCAweDQ0LAorCTB4MzAsIDB4N0UsIDB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsCisJMHgyQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGMSwgMHhGRiwgMHhGOSwgMHhGRiwgMHg3NCwKKwkweDAwLCAweDZDLCAweEZFLCAweDI1LCAweDA0LCAweDExLCAweEY1LCAweDFELCAweDQxLCAweEY1LCAweDFBLAorCTB4QUYsIDB4RjQsIDB4NTcsIDB4MDYsIDB4NjksIDB4RkMsIDB4REEsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgxQSwgMHgwMCwgMHg5NSwgMHhGRiwgMHhFNywgMHgwMCwgMHg4RSwgMHhGRSwKKwkweEUzLCAweDAxLCAweDBELCAweEZFLCAweENGLCAweDAwLCAweEM3LCAweDQ4LCAweEMxLCAweDA2LCAweDdCLAorCTB4RkIsIDB4MzksIDB4MDMsIDB4REQsIDB4RkQsIDB4M0EsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjMsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NSwgMHhGRiwgMHhCNCwgMHgwMSwgMHhDQywKKwkweEZDLCAweDZDLCAweDA1LCAweERGLCAweEY2LCAweDY4LCAweDEzLCAweDBELCAweDQ1LCAweDRCLCAweEY4LAorCTB4NDksIDB4MDIsIDB4ODgsIDB4RkYsIDB4RDQsIDB4RkYsIDB4NDksIDB4MDAsIDB4RDMsIDB4RkYsIDB4MEIsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgzNywgMHhGQywKKwkweDI4LCAweDA3LCAweEZDLCAweEYxLCAweEYzLCAweDI4LCAweDA0LCAweDM3LCAweERDLCAweEYxLCAweDZGLAorCTB4MDYsIDB4RUMsIDB4RkMsIDB4NTksIDB4MDEsIDB4ODYsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwgMHhCNSwgMHhGRiwgMHhGRCwgMHgwMCwgMHg4MSwgMHhGRCwgMHg5NiwKKwkweDA1LCAweEU0LCAweEYyLCAweEZGLCAweDNCLCAweEE3LCAweDIyLCAweEY1LCAweEYyLCAweEYxLCAweDA2LAorCTB4MzYsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTEsCisJMHgwMCwgMHhCNywgMHhGRiwgMHg4RiwgMHgwMCwgMHg0MywgMHhGRiwgMHg5MCwgMHgwMCwgMHg3QSwgMHgwMCwKKwkweEJFLCAweEZCLCAweDUyLCAweDQ3LCAweDcyLCAweDBELCAweEU2LCAweEY4LCAweDdFLCAweDA0LCAweDNDLAorCTB4RkQsIDB4ODMsIDB4MDEsIDB4NTgsIDB4RkYsIDB4MkIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHg3OCwgMHgwMSwgMHg1NiwgMHhGRCwgMHg0OCwgMHgwNCwgMHg1NiwKKwkweEY5LCAweDNFLCAweDBDLCAweEFFLCAweDQ3LCAweDhELCAweEZDLCAweDEzLCAweDAwLCAweEM5LCAweDAwLAorCTB4MjQsIDB4RkYsIDB4OUYsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MTMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQiwgMHhGQywgMHhERCwgMHgwNiwgMHgzNywgMHhGMywKKwkweDUyLCAweDIxLCAweEY2LCAweDNDLCAweDMxLCAweEYzLCAweDVGLCAweDA1LCAweEE2LCAweEZELCAweEU4LAorCTB4MDAsIDB4QzAsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUYsIDB4MDAsCisJMHg3RSwgMHhGRiwgMHg2OSwgMHgwMSwgMHhEMiwgMHhGQywgMHg5MiwgMHgwNiwgMHhCQiwgMHhGMSwgMHhFNiwKKwkweDM1LCAweDNGLCAweDJBLCAweEQ4LCAweEYxLCAweDJBLCAweDA3LCAweDNDLCAweEZDLCAweEQzLCAweDAxLAorCTB4NDUsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEEsIDB4MDAsIDB4RDgsIDB4RkYsIDB4M0EsCisJMHgwMCwgMHhGMSwgMHhGRiwgMHg1NCwgMHhGRiwgMHhBMiwgMHgwMiwgMHhBOSwgMHhGNywgMHg3NywgMHg0NCwKKwkweEIxLCAweDE0LCAweDc3LCAweEY2LCAweDlBLCAweDA1LCAweEI4LCAweEZDLCAweEJDLCAweDAxLCAweDQyLAorCTB4RkYsIDB4MzIsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjEsIDB4MDAsIDB4N0EsIDB4RkYsCisJMHgyQywgMHgwMSwgMHhGQiwgMHhGRCwgMHhGRSwgMHgwMiwgMHhFRSwgMHhGQiwgMHhBQiwgMHgwNSwgMHhFMSwKKwkweDQ4LCAweEM3LCAweDAxLCAweDlELCAweEZELCAweDFFLCAweDAyLCAweDZGLCAweEZFLCAweEY1LCAweDAwLAorCTB4OEYsIDB4RkYsIDB4MUIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0EsIDB4RkYsIDB4RDYsCisJMHgwMSwgMHg3NywgMHhGQywgMHgzMywgMHgwNiwgMHgwOSwgMHhGNSwgMHhBMSwgMHgxOSwgMHhFMSwgMHg0MSwKKwkweDhELCAweEY1LCAweERBLCAweDAzLCAweDlBLCAweEZFLCAweDVBLCAweDAwLCAweDA2LCAweDAwLCAweEVDLAorCTB4RkYsIDB4MDYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkYsIDB4QjQsIDB4MDEsCisJMHg2MiwgMHhGQywgMHgxNSwgMHgwNywgMHg4NCwgMHhGMSwgMHgwOSwgMHgyRiwgMHg3QiwgMHgzMSwgMHg3RCwKKwkweEYxLCAweEY1LCAweDA2LCAweDgyLCAweEZDLCAweDlFLCAweDAxLCAweDYyLCAweEZGLCAweDI4LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RjYsIDB4RkYsIDB4RUQsIDB4RkYsIDB4OEUsIDB4MDAsIDB4M0YsCisJMHhGRSwgMHg2RCwgMHgwNCwgMHg5RSwgMHhGNCwgMHg0RSwgMHg0MCwgMHg0OSwgMHgxQywgMHg1QSwgMHhGNCwKKwkweDc4LCAweDA2LCAweDVDLCAweEZDLCAweERGLCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLAorCTB4RkYsIDB4MTgsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RDgsIDB4MDAsIDB4QUQsIDB4RkUsIDB4QTcsIDB4MDEsCisJMHg3RCwgMHhGRSwgMHhERCwgMHhGRiwgMHhBMSwgMHg0OCwgMHhERCwgMHgwNywgMHgwNywgMHhGQiwgMHg3MywKKwkweDAzLCAweEMwLCAweEZELCAweDQ4LCAweDAxLCAweDZGLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NDksIDB4RkYsIDB4QUIsIDB4MDEsIDB4RTIsIDB4RkMsIDB4M0QsCisJMHgwNSwgMHg0OCwgMHhGNywgMHgyMiwgMHgxMiwgMHg5QiwgMHg0NSwgMHhGNSwgMHhGOCwgMHhFRCwgMHgwMSwKKwkweEJFLCAweEZGLCAweEI2LCAweEZGLCAweDU3LCAweDAwLCAweENELCAweEZGLCAweDBDLCAweDAwLCAweEZELAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4M0UsIDB4RkYsIDB4REQsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjMsIDB4MDcsCisJMHgyNiwgMHhGMiwgMHhBNiwgMHgyNywgMHgxRCwgMHgzOCwgMHgwNSwgMHhGMiwgMHg0OSwgMHgwNiwgMHgwOCwKKwkweEZELCAweDQ3LCAweDAxLCAweDhGLCAweEZGLCAweDE4LCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorCTB4MEUsIDB4MDAsIDB4QUEsIDB4RkYsIDB4MTIsIDB4MDEsIDB4NUYsIDB4RkQsIDB4Q0IsIDB4MDUsIDB4OUUsCisJMHhGMiwgMHgwMywgMHgzQiwgMHhGQywgMHgyMywgMHhCNywgMHhGMiwgMHgwMywgMHgwNywgMHgzMywgMHhGQywKKwkweEU1LCAweDAxLCAweDM5LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEwLCAweDAwLCAweEJELAorCTB4RkYsIDB4ODAsIDB4MDAsIDB4NjIsIDB4RkYsIDB4NTcsIDB4MDAsIDB4REYsIDB4MDAsIDB4RjcsIDB4RkEsCisJMHhFRCwgMHg0NiwgMHhBQSwgMHgwRSwgMHg3NiwgMHhGOCwgMHhCMiwgMHgwNCwgMHgyMywgMHhGRCwgMHg4RiwKKwkweDAxLCAweDUzLCAweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI4LCAweDAwLAorCTB4NjEsIDB4RkYsIDB4NkMsIDB4MDEsIDB4NzEsIDB4RkQsIDB4MTEsIDB4MDQsIDB4QzgsIDB4RjksIDB4MEUsCisJMHgwQiwgMHhGRCwgMHg0NywgMHg2MywgMHhGRCwgMHhBQSwgMHhGRiwgMHgwMywgMHgwMSwgMHgwNSwgMHhGRiwKKwkweEFFLCAweDAwLCAweEFDLCAweEZGLCAweDE0LCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LAorCTB4RkYsIDB4RTUsIDB4MDEsIDB4NDEsIDB4RkMsIDB4QzYsIDB4MDYsIDB4N0YsIDB4RjMsIDB4RkQsIDB4MUYsCisJMHhFNCwgMHgzRCwgMHg4NywgMHhGMywgMHgyNCwgMHgwNSwgMHhDQywgMHhGRCwgMHhEMSwgMHgwMCwgMHhDQiwKKwkweEZGLCAweDAyLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIxLCAweDAwLCAweDc2LCAweEZGLAorCTB4NzksIDB4MDEsIDB4QkEsIDB4RkMsIDB4QjEsIDB4MDYsIDB4QTAsIDB4RjEsIDB4QzMsIDB4MzQsIDB4ODksCisJMHgyQiwgMHhCOSwgMHhGMSwgMHgyOSwgMHgwNywgMHg0NCwgMHhGQywgMHhDQywgMHgwMSwgMHg0OSwgMHhGRiwKKwkweDMxLCAweDAwLCAweEZELCAweEZGLCAweDA5LCAweDAwLCAweERFLCAweEZGLCAweDJDLCAweDAwLCAweDBELAorCTB4MDAsIDB4MjEsIDB4RkYsIDB4RjksIDB4MDIsIDB4MEYsIDB4RjcsIDB4RDQsIDB4NDMsIDB4RkQsIDB4MTUsCisJMHgxMywgMHhGNiwgMHhDNSwgMHgwNSwgMHhBNSwgMHhGQywgMHhDNCwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywKKwkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdGLCAweEZGLCAweDFFLCAweDAxLAorCTB4MTksIDB4RkUsIDB4QzMsIDB4MDIsIDB4NjEsIDB4RkMsIDB4OUIsIDB4MDQsIDB4RjIsIDB4NDgsIDB4QzYsCisJMHgwMiwgMHgyQywgMHhGRCwgMHg1QSwgMHgwMiwgMHg1MCwgMHhGRSwgMHgwNCwgMHgwMSwgMHg4QSwgMHhGRiwKKwkweDFELCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNCLCAweEZGLCAweEQwLCAweDAxLCAweDg2LAorCTB4RkMsIDB4MEQsIDB4MDYsIDB4NjYsIDB4RjUsIDB4NTAsIDB4MTgsIDB4OUUsIDB4NDIsIDB4MTEsIDB4RjYsCisJMHg4QywgMHgwMywgMHhDOSwgMHhGRSwgMHgzRiwgMHgwMCwgMHgxNCwgMHgwMCwgMHhFNywgMHhGRiwgMHgwNywKKwkweDAwLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUxLCAweEZGLCAweEJFLCAweDAxLCAweDU2LCAweEZDLAorCTB4MUYsIDB4MDcsIDB4OTIsIDB4RjEsIDB4Q0EsIDB4MkQsIDB4QUYsIDB4MzIsIDB4ODQsIDB4RjEsIDB4RTAsCisJMHgwNiwgMHg5NCwgMHhGQywgMHg5MSwgMHgwMSwgMHg2OSwgMHhGRiwgMHgyNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDAzLCAweDAwLCAweEZBLCAweEZGLCAweEUwLCAweEZGLCAweEE3LCAweDAwLCAweDE1LCAweEZFLCAweEIyLAorCTB4MDQsIDB4MzIsIDB4RjQsIDB4NzcsIDB4M0YsIDB4OUUsIDB4MUQsIDB4MDcsIDB4RjQsIDB4OTYsIDB4MDYsCisJMHg1MSwgMHhGQywgMHhFMiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNywKKwkweDAwLCAweEExLCAweEZGLCAweEM5LCAweDAwLCAweENELCAweEZFLCAweDZDLCAweDAxLCAweEVBLCAweEZFLAorCTB4RjMsIDB4RkUsIDB4NzAsIDB4NDgsIDB4RkYsIDB4MDgsIDB4OTQsIDB4RkEsIDB4QUQsIDB4MDMsIDB4QTMsCisJMHhGRCwgMHg1NSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDJGLCAweDAwLCAweDRDLCAweEZGLCAweEExLCAweDAxLCAweEY4LCAweEZDLCAweDBELCAweDA1LCAweEIzLAorCTB4RjcsIDB4REYsIDB4MTAsIDB4MUQsIDB4NDYsIDB4QTcsIDB4RjksIDB4OEUsIDB4MDEsIDB4RjQsIDB4RkYsCisJMHg5OCwgMHhGRiwgMHg2NiwgMHgwMCwgMHhDNywgMHhGRiwgMHgwRSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwKKwkweDAwLCAweDNDLCAweEZGLCAweEUxLCAweDAxLCAweDMxLCAweEZDLCAweDFBLCAweDA3LCAweDU2LCAweEYyLAorCTB4NTUsIDB4MjYsIDB4MkUsIDB4MzksIDB4MzUsIDB4RjIsIDB4MUUsIDB4MDYsIDB4MjUsIDB4RkQsIDB4MzUsCisJMHgwMSwgMHg5OCwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMiwgMHgwMCwKKwkweEEwLCAweEZGLCAweDI2LCAweDAxLCAweDNFLCAweEZELCAweEZCLCAweDA1LCAweDYwLCAweEYyLCAweEZELAorCTB4MzksIDB4NEUsIDB4MjUsIDB4N0YsIDB4RjIsIDB4MTEsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsCisJMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMywgMHhGRiwgMHg3MSwKKwkweDAwLCAweDgxLCAweEZGLCAweDFGLCAweDAwLCAweDQyLCAweDAxLCAweDM3LCAweEZBLCAweDdDLCAweDQ2LAorCTB4RTcsIDB4MEYsIDB4MDgsIDB4RjgsIDB4RTYsIDB4MDQsIDB4MEIsIDB4RkQsIDB4OTksIDB4MDEsIDB4NEYsCisJMHhGRiwgMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNywgMHgwMCwgMHg2NiwgMHhGRiwKKwkweDVGLCAweDAxLCAweDhELCAweEZELCAweEQ5LCAweDAzLCAweDNCLCAweEZBLCAweEU0LCAweDA5LCAweDQxLAorCTB4NDgsIDB4NDEsIDB4RkUsIDB4M0YsIDB4RkYsIDB4M0UsIDB4MDEsIDB4RTUsIDB4RkUsIDB4QkQsIDB4MDAsCisJMHhBNiwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwKKwkweDAxLCAweDRBLCAweEZDLCAweEFDLCAweDA2LCAweENBLCAweEYzLCAweEE3LCAweDFFLCAweENBLCAweDNFLAorCTB4RTQsIDB4RjMsIDB4RTUsIDB4MDQsIDB4RjQsIDB4RkQsIDB4QkEsIDB4MDAsIDB4RDcsIDB4RkYsIDB4RkUsCisJMHhGRiwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg4NywgMHgwMSwKKwkweEE0LCAweEZDLCAweENELCAweDA2LCAweDhFLCAweEYxLCAweDk5LCAweDMzLCAweENFLCAweDJDLCAweEExLAorCTB4RjEsIDB4MjUsIDB4MDcsIDB4NEQsIDB4RkMsIDB4QzQsIDB4MDEsIDB4NEQsIDB4RkYsIDB4MkYsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwOCwgMHgwMCwgMHhFMywgMHhGRiwgMHgxRSwgMHgwMCwgMHgyQSwgMHgwMCwgMHhFRiwKKwkweEZFLCAweDRELCAweDAzLCAweDdELCAweEY2LCAweDJBLCAweDQzLCAweDRCLCAweDE3LCAweEIwLCAweEY1LAorCTB4RUYsIDB4MDUsIDB4OTMsIDB4RkMsIDB4Q0IsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgxRSwgMHgwMCwgMHg4NSwgMHhGRiwgMHgxMCwgMHgwMSwgMHgzOCwgMHhGRSwgMHg4OCwgMHgwMiwKKwkweEQzLCAweEZDLCAweDkxLCAweDAzLCAweEY3LCAweDQ4LCAweENCLCAweDAzLCAweEJBLCAweEZDLCAweDk1LAorCTB4MDIsIDB4MzEsIDB4RkUsIDB4MTMsIDB4MDEsIDB4ODQsIDB4RkYsIDB4MUUsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhDOSwgMHgwMSwgMHg5NywgMHhGQywgMHhFNiwKKwkweDA1LCAweEM2LCAweEY1LCAweDAwLCAweDE3LCAweDUwLCAweDQzLCAweDlELCAweEY2LCAweDNBLCAweDAzLAorCTB4RkEsIDB4RkUsIDB4MjMsIDB4MDAsIDB4MjEsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzMCwgMHgwMCwgMHg0QywgMHhGRiwgMHhDNiwgMHgwMSwgMHg0QiwgMHhGQywgMHgyNiwgMHgwNywKKwkweEE1LCAweEYxLCAweDg3LCAweDJDLCAweERDLCAweDMzLCAweDkxLCAweEYxLCAweEM3LCAweDA2LCAweEE5LAorCTB4RkMsIDB4ODQsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHhENCwgMHhGRiwgMHhCRiwgMHgwMCwgMHhFQiwgMHhGRCwgMHhGMywgMHgwNCwgMHhDRiwKKwkweEYzLCAweDk4LCAweDNFLCAweEYzLCAweDFFLCAweEI5LCAweEYzLCAweEIyLCAweDA2LCAweDQ4LCAweEZDLAorCTB4RTQsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTUsIDB4MDAsIDB4QTcsCisJMHhGRiwgMHhCOSwgMHgwMCwgMHhFQywgMHhGRSwgMHgzMSwgMHgwMSwgMHg1NywgMHhGRiwgMHgwRiwgMHhGRSwKKwkweDMzLCAweDQ4LCAweDI1LCAweDBBLCAweDIxLCAweEZBLCAweEU1LCAweDAzLCAweDg3LCAweEZELCAweDYyLAorCTB4MDEsIDB4NjUsIDB4RkYsIDB4MjcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsCisJMHg1MCwgMHhGRiwgMHg5NywgMHgwMSwgMHgxMCwgMHhGRCwgMHhEQSwgMHgwNCwgMHgyMCwgMHhGOCwgMHhBMCwKKwkweDBGLCAweDk3LCAweDQ2LCAweDYxLCAweEZBLCAweDJELCAweDAxLCAweDJCLCAweDAwLCAweDdBLCAweEZGLAorCTB4NzUsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4M0EsCisJMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwRSwgMHgwNywgMHg4QiwgMHhGMiwgMHgwMywgMHgyNSwKKwkweDM4LCAweDNBLCAweDZELCAweEYyLCAweEYxLCAweDA1LCAweDQ1LCAweEZELCAweDIyLCAweDAxLCAweEEyLAorCTB4RkYsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTYsIDB4RkYsCisJMHgzOSwgMHgwMSwgMHgxRiwgMHhGRCwgMHgyOCwgMHgwNiwgMHgyQSwgMHhGMiwgMHhGMiwgMHgzOCwgMHhBMCwKKwkweDI2LCAweDRCLCAweEYyLCAweDFDLCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNDLCAweEZGLAorCTB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4QzksIDB4RkYsIDB4NjMsIDB4MDAsIDB4OUYsCisJMHhGRiwgMHhFOCwgMHhGRiwgMHhBMywgMHgwMSwgMHg3RiwgMHhGOSwgMHgwMiwgMHg0NiwgMHgyNywgMHgxMSwKKwkweDlCLCAweEY3LCAweDE4LCAweDA1LCAweEYzLCAweEZDLCAweEEzLCAweDAxLCAweDRDLCAweEZGLCAweDJGLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkIsIDB4RkYsIDB4NTIsIDB4MDEsCisJMHhBOSwgMHhGRCwgMHhBMCwgMHgwMywgMHhBRSwgMHhGQSwgMHhCRSwgMHgwOCwgMHg3QywgMHg0OCwgMHgyNiwKKwkweEZGLCAweEQyLCAweEZFLCAweDc5LCAweDAxLCAweEM2LCAweEZFLCAweENDLCAweDAwLCAweEEwLCAweEZGLAorCTB4MTcsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTEsIDB4MDEsIDB4NTMsCisJMHhGQywgMHg5MCwgMHgwNiwgMHgxOSwgMHhGNCwgMHg1MiwgMHgxRCwgMHhBOCwgMHgzRiwgMHg0OSwgMHhGNCwKKwkweEEzLCAweDA0LCAweDFFLCAweEZFLCAweEExLCAweDAwLCAweEUzLCAweEZGLCAweEY5LCAweEZGLCAweDA0LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjcsIDB4RkYsIDB4OTQsIDB4MDEsIDB4OTAsIDB4RkMsCisJMHhFNSwgMHgwNiwgMHg4MSwgMHhGMSwgMHg2QiwgMHgzMiwgMHgxMSwgMHgyRSwgMHg4RSwgMHhGMSwgMHgxRCwKKwkweDA3LCAweDU4LCAweEZDLCAweEJDLCAweDAxLCAweDUyLCAweEZGLCAweDJFLCAweDAwLCAweEZELCAweEZGLAorCTB4MDcsIDB4MDAsIDB4RTgsIDB4RkYsIDB4MTEsIDB4MDAsIDB4NDUsIDB4MDAsIDB4QkYsIDB4RkUsIDB4OUQsCisJMHgwMywgMHhGMywgMHhGNSwgMHg3NSwgMHg0MiwgMHg5QiwgMHgxOCwgMHg1MSwgMHhGNSwgMHgxNiwgMHgwNiwKKwkweDgzLCAweEZDLCAweEQxLCAweDAxLCAweDNCLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELAorCTB4MDAsIDB4OEIsIDB4RkYsIDB4MDEsIDB4MDEsIDB4NTYsIDB4RkUsIDB4NEQsIDB4MDIsIDB4NDUsIDB4RkQsCisJMHg4RCwgMHgwMiwgMHhGMCwgMHg0OCwgMHhENywgMHgwNCwgMHg0NywgMHhGQywgMHhEMSwgMHgwMiwgMHgxMiwKKwkweEZFLCAweDIxLCAweDAxLCAweDdFLCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLAorCTB4MzMsIDB4MDAsIDB4NDAsIDB4RkYsIDB4QzIsIDB4MDEsIDB4QTksIDB4RkMsIDB4QkMsIDB4MDUsIDB4MjksCisJMHhGNiwgMHhCMywgMHgxNSwgMHhGQSwgMHg0MywgMHgzMSwgMHhGNywgMHhFNiwgMHgwMiwgMHgyQywgMHhGRiwKKwkweDA3LCAweDAwLCAweDJGLCAweDAwLCAweERDLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMxLAorCTB4MDAsIDB4NDgsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4NDIsIDB4RkMsIDB4MkEsIDB4MDcsIDB4QkYsIDB4RjEsCisJMHg0MCwgMHgyQiwgMHgwNSwgMHgzNSwgMHhBNiwgMHhGMSwgMHhBQiwgMHgwNiwgMHhCRiwgMHhGQywgMHg3NSwKKwkweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAzLCAweDAwLAorCTB4QzgsIDB4RkYsIDB4RDYsIDB4MDAsIDB4QzQsIDB4RkQsIDB4MzEsIDB4MDUsIDB4NzMsIDB4RjMsIDB4QjAsCisJMHgzRCwgMHg0OSwgMHgyMCwgMHg2RSwgMHhGMywgMHhDQiwgMHgwNiwgMHg0MCwgMHhGQywgMHhFNiwgMHgwMSwKKwkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDE0LCAweDAwLCAweEFELCAweEZGLCAweEFBLAorCTB4MDAsIDB4MEMsIDB4RkYsIDB4RjcsIDB4MDAsIDB4QzEsIDB4RkYsIDB4MzMsIDB4RkQsIDB4RUMsIDB4NDcsCisJMHg1MSwgMHgwQiwgMHhBRiwgMHhGOSwgMHgxRCwgMHgwNCwgMHg2QiwgMHhGRCwgMHg2RSwgMHgwMSwgMHg2MCwKKwkweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJDLCAweDAwLCAweDU0LCAweEZGLAorCTB4OEMsIDB4MDEsIDB4MjksIDB4RkQsIDB4QTcsIDB4MDQsIDB4OEYsIDB4RjgsIDB4NjQsIDB4MEUsIDB4MDIsCisJMHg0NywgMHgyMiwgMHhGQiwgMHhDOSwgMHgwMCwgMHg2NCwgMHgwMCwgMHg1QiwgMHhGRiwgMHg4NCwgMHgwMCwKKwkweEJDLCAweEZGLCAweDEwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU1LAorCTB4MDEsIDB4MzMsIDB4RkMsIDB4RkYsIDB4MDYsIDB4QzQsIDB4RjIsIDB4QjAsIDB4MjMsIDB4M0IsIDB4M0IsCisJMHhBRCwgMHhGMiwgMHhCRiwgMHgwNSwgMHg2NiwgMHhGRCwgMHgwRSwgMHgwMSwgMHhBQywgMHhGRiwgMHgwRSwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE5LCAweDAwLCAweDhELCAweEZGLCAweDRCLCAweDAxLAorCTB4MDEsIDB4RkQsIDB4NTEsIDB4MDYsIDB4RkIsIDB4RjEsIDB4REYsIDB4MzcsIDB4RjAsIDB4MjcsIDB4MUMsCisJMHhGMiwgMHgyNCwgMHgwNywgMHgzNCwgMHhGQywgMHhEQywgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweEZELCAweEZGLCAweDBDLCAweDAwLCAweENFLCAweEZGLCAweDU0LCAweDAwLCAweEJELCAweEZGLCAweEIyLAorCTB4RkYsIDB4MDEsIDB4MDIsIDB4Q0YsIDB4RjgsIDB4N0QsIDB4NDUsIDB4NkIsIDB4MTIsIDB4MzAsIDB4RjcsCisJMHg0OCwgMHgwNSwgMHhERCwgMHhGQywgMHhBRCwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDcwLCAweEZGLCAweDQ1LCAweDAxLCAweEM2LCAweEZELAorCTB4NjYsIDB4MDMsIDB4MjEsIDB4RkIsIDB4OUUsIDB4MDcsIDB4QUEsIDB4NDgsIDB4MTIsIDB4MDAsIDB4NjQsCisJMHhGRSwgMHhCNCwgMHgwMSwgMHhBNiwgMHhGRSwgMHhEQiwgMHgwMCwgMHg5QSwgMHhGRiwgMHgxOSwgMHgwMCwKKwkweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweERFLCAweDAxLCAweDVGLCAweEZDLCAweDcwLAorCTB4MDYsIDB4NkMsIDB4RjQsIDB4RkQsIDB4MUIsIDB4N0QsIDB4NDAsIDB4QjcsIDB4RjQsIDB4NUQsIDB4MDQsCisJMHg0OSwgMHhGRSwgMHg4OCwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGNSwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDI5LCAweDAwLCAweDYxLCAweEZGLCAweEExLCAweDAxLCAweDdFLCAweEZDLCAweEY5LCAweDA2LAorCTB4N0MsIDB4RjEsIDB4MzgsIDB4MzEsIDB4NTAsIDB4MkYsIDB4ODIsIDB4RjEsIDB4MTIsIDB4MDcsIDB4NjUsCisJMHhGQywgMHhCMiwgMHgwMSwgMHg1NywgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwKKwkweEVELCAweEZGLCAweDA0LCAweDAwLCAweDYwLCAweDAwLCAweDkwLCAweEZFLCAweEVCLCAweDAzLCAweDcxLAorCTB4RjUsIDB4QjcsIDB4NDEsIDB4RUQsIDB4MTksIDB4RjUsIDB4RjQsIDB4M0IsIDB4MDYsIDB4NzMsIDB4RkMsCisJMHhENywgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQiwgMHgwMCwgMHg5MSwKKwkweEZGLCAweEYyLCAweDAwLCAweDc2LCAweEZFLCAweDExLCAweDAyLCAweEI2LCAweEZELCAweDhGLCAweDAxLAorCTB4REUsIDB4NDgsIDB4RTksIDB4MDUsIDB4RDQsIDB4RkIsIDB4MEMsIDB4MDMsIDB4RjQsIDB4RkQsIDB4MkYsCisJMHgwMSwgMHg3OSwgMHhGRiwgMHgyMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwKKwkweDQzLCAweEZGLCAweEJBLCAweDAxLCAweEJDLCAweEZDLCAweDkwLCAweDA1LCAweDhFLCAweEY2LCAweDY4LAorCTB4MTQsIDB4OTksIDB4NDQsIDB4Q0QsIDB4RjcsIDB4OEYsIDB4MDIsIDB4NjAsIDB4RkYsIDB4RUEsIDB4RkYsCisJMHgzRSwgMHgwMCwgMHhENywgMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwKKwkweEZGLCAweEQ0LCAweDAxLCAweDNCLCAweEZDLCAweDJBLCAweDA3LCAweERGLCAweEYxLCAweEY2LCAweDI5LAorCTB4MjcsIDB4MzYsIDB4QzEsIDB4RjEsIDB4OEIsIDB4MDYsIDB4RDgsIDB4RkMsIDB4NjYsIDB4MDEsIDB4ODAsCisJMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHhCRCwgMHhGRiwKKwkweEVELCAweDAwLCAweDlFLCAweEZELCAweDZDLCAweDA1LCAweDFGLCAweEYzLCAweEMwLCAweDNDLCAweDlFLAorCTB4MjEsIDB4MjgsIDB4RjMsIDB4RTIsIDB4MDYsIDB4M0EsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhCMywgMHhGRiwgMHg5QiwgMHgwMCwgMHgyQiwKKwkweEZGLCAweEJELCAweDAwLCAweDJBLCAweDAwLCAweDVFLCAweEZDLCAweDlBLCAweDQ3LCAweDgyLCAweDBDLAorCTB4M0QsIDB4RjksIDB4NTQsIDB4MDQsIDB4NTAsIDB4RkQsIDB4N0EsIDB4MDEsIDB4NUIsIDB4RkYsIDB4MkEsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHg4MSwgMHgwMSwKKwkweDQyLCAweEZELCAweDcyLCAweDA0LCAweEZGLCAweEY4LCAweDJELCAweDBELCAweDY5LCAweDQ3LCAweEVCLAorCTB4RkIsIDB4NjMsIDB4MDAsIDB4OUQsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OTMsIDB4MDAsIDB4QjYsIDB4RkYsCisJMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNywKKwkweEZDLCAweEVELCAweDA2LCAweDAzLCAweEYzLCAweDVCLCAweDIyLCAweDM3LCAweDNDLCAweEY0LCAweEYyLAorCTB4OEEsIDB4MDUsIDB4ODksIDB4RkQsIDB4RjksIDB4MDAsIDB4QjcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsCisJMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4NCwgMHhGRiwgMHg1QywgMHgwMSwgMHhFNiwgMHhGQywKKwkweDc3LCAweDA2LCAweEQ0LCAweEYxLCAweEM2LCAweDM2LCAweDNFLCAweDI5LCAweEYzLCAweEYxLCAweDI5LAorCTB4MDcsIDB4MzgsIDB4RkMsIDB4RDcsIDB4MDEsIDB4NDIsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwQiwgMHgwMCwgMHhENCwgMHhGRiwgMHg0NiwgMHgwMCwgMHhEQSwgMHhGRiwgMHg3RCwgMHhGRiwgMHg1RCwKKwkweDAyLCAweDI2LCAweEY4LCAweEVELCAweDQ0LCAweEIxLCAweDEzLCAweEM3LCAweEY2LCAweDc3LCAweDA1LAorCTB4QzgsIDB4RkMsIDB4QjYsIDB4MDEsIDB4NDUsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgyMiwgMHgwMCwgMHg3NiwgMHhGRiwgMHgzNywgMHgwMSwgMHhFNCwgMHhGRCwgMHgyQywgMHgwMywKKwkweDk0LCAweEZCLCAweDgzLCAweDA2LCAweENFLCAweDQ4LCAweDA1LCAweDAxLCAweEY1LCAweEZELCAweEYwLAorCTB4MDEsIDB4ODcsIDB4RkUsIDB4RUEsIDB4MDAsIDB4OTQsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgzNSwgMHgwMCwgMHgzOCwgMHhGRiwgMHhEOSwgMHgwMSwgMHg2QywgMHhGQywgMHg0RiwgMHgwNiwgMHhDMywKKwkweEY0LCAweEE5LCAweDFBLCAweDQ5LCAweDQxLCAweDJDLCAweEY1LCAweDE1LCAweDA0LCAweDc2LCAweEZFLAorCTB4NkUsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjAsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkIsCisJMHgwMCwgMHg1QSwgMHhGRiwgMHhBQywgMHgwMSwgMHg2RSwgMHhGQywgMHgwQSwgMHgwNywgMHg3RSwgMHhGMSwKKwkweEZGLCAweDJGLCAweDhBLCAweDMwLCAweDdELCAweEYxLCAweDAzLCAweDA3LCAweDc1LCAweEZDLCAweEE3LAorCTB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RjIsIDB4RkYsCisJMHhGNywgMHhGRiwgMHg3QSwgMHgwMCwgMHg2MiwgMHhGRSwgMHgzNSwgMHgwNCwgMHhGNywgMHhGNCwgMHhFRiwKKwkweDQwLCAweDQwLCAweDFCLCAweDlDLCAweEY0LCAweDVFLCAweDA2LCAweDY2LCAweEZDLCAweERCLCAweDAxLAorCTB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTYsIDB4RkYsIDB4RTMsCisJMHgwMCwgMHg5NSwgMHhGRSwgMHhENSwgMHgwMSwgMHgyNiwgMHhGRSwgMHg5OCwgMHgwMCwgMHhCRiwgMHg0OCwKKwkweDAwLCAweDA3LCAweDYxLCAweEZCLCAweDQ2LCAweDAzLCAweEQ2LCAweEZELCAweDNELCAweDAxLCAweDczLAorCTB4RkYsIDB4MjMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsCisJMHhCMiwgMHgwMSwgMHhEMSwgMHhGQywgMHg2MiwgMHgwNSwgMHhGNiwgMHhGNiwgMHgyMCwgMHgxMywgMHgyRSwKKwkweDQ1LCAweDcwLCAweEY4LCAweDM0LCAweDAyLCAweDk0LCAweEZGLCAweENELCAweEZGLCAweDRDLCAweDAwLAorCTB4RDIsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDEsIDB4RkYsIDB4REEsCisJMHgwMSwgMHgzNiwgMHhGQywgMHgyNywgMHgwNywgMHgwNSwgMHhGMiwgMHhBQSwgMHgyOCwgMHg0NCwgMHgzNywKKwkweEU0LCAweEYxLCAweDY3LCAweDA2LCAweEYyLCAweEZDLCAweDU1LCAweDAxLCAweDg4LCAweEZGLCAweDFCLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QjIsIDB4RkYsIDB4MDIsIDB4MDEsCisJMHg3QSwgMHhGRCwgMHhBMiwgMHgwNSwgMHhENCwgMHhGMiwgMHhDNywgMHgzQiwgMHhGMiwgMHgyMiwgMHhFNywKKwkweEYyLCAweEY1LCAweDA2LCAweDM1LCAweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MTEsIDB4MDAsIDB4QjksIDB4RkYsIDB4OEMsIDB4MDAsIDB4NEEsIDB4RkYsIDB4ODMsCisJMHgwMCwgMHg5MSwgMHgwMCwgMHg5MSwgMHhGQiwgMHgzRCwgMHg0NywgMHhCNywgMHgwRCwgMHhDRCwgMHhGOCwKKwkweDg5LCAweDA0LCAweDM2LCAweEZELCAweDg2LCAweDAxLCAweDU3LCAweEZGLCAweDJCLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4NzUsIDB4MDEsIDB4NUMsIDB4RkQsCisJMHgzQywgMHgwNCwgMHg3MCwgMHhGOSwgMHhGQSwgMHgwQiwgMHhDMCwgMHg0NywgMHhCQywgMHhGQywgMHhGQywKKwkweEZGLCAweEQ2LCAweDAwLCAweDFELCAweEZGLCAweEEyLCAweDAwLCAweEIwLCAweEZGLCAweDEzLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0MsIDB4RkMsIDB4RDgsCisJMHgwNiwgMHg0NywgMHhGMywgMHgwNiwgMHgyMSwgMHgyQSwgMHgzRCwgMHg0NCwgMHhGMywgMHg1MiwgMHgwNSwKKwkweEFFLCAweEZELCAweEUzLCAweDAwLCAweEMyLCAweEZGLCAweDA2LCAweDAwLCAweDAxLCAweDAwLCAweEZFLAorCTB4RkYsIDB4MUYsIDB4MDAsIDB4N0MsIDB4RkYsIDB4NkQsIDB4MDEsIDB4Q0QsIDB4RkMsIDB4OTksIDB4MDYsCisJMHhCNCwgMHhGMSwgMHhBNiwgMHgzNSwgMHg4OSwgMHgyQSwgMHhEMCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRSwKKwkweEZDLCAweEQxLCAweDAxLCAweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLAorCTB4RDksIDB4RkYsIDB4MzcsIDB4MDAsIDB4RjcsIDB4RkYsIDB4NDksIDB4RkYsIDB4QjYsIDB4MDIsIDB4ODYsCisJMHhGNywgMHg1MywgMHg0NCwgMHhGQiwgMHgxNCwgMHg2MSwgMHhGNiwgMHhBNCwgMHgwNSwgMHhCNCwgMHhGQywKKwkweEJFLCAweDAxLCAweDQyLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIxLAorCTB4MDAsIDB4N0IsIDB4RkYsIDB4MjksIDB4MDEsIDB4MDEsIDB4RkUsIDB4RjEsIDB4MDIsIDB4MDcsIDB4RkMsCisJMHg2RSwgMHgwNSwgMHhFNiwgMHg0OCwgMHhGRiwgMHgwMSwgMHg4NCwgMHhGRCwgMHgyQywgMHgwMiwgMHg2OCwKKwkweEZFLCAweEY5LCAweDAwLCAweDhFLCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLAorCTB4M0EsIDB4RkYsIDB4RDQsIDB4MDEsIDB4N0EsIDB4RkMsIDB4MkIsIDB4MDYsIDB4MUUsIDB4RjUsIDB4NTYsCisJMHgxOSwgMHgwQywgMHg0MiwgMHhBQSwgMHhGNSwgMHhDOSwgMHgwMywgMHhBNCwgMHhGRSwgMHg1NCwgMHgwMCwKKwkweDA5LCAweDAwLCAweEVCLCAweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDU1LAorCTB4RkYsIDB4QjYsIDB4MDEsIDB4NUYsIDB4RkMsIDB4MTcsIDB4MDcsIDB4ODcsIDB4RjEsIDB4QzIsIDB4MkUsCisJMHhDMCwgMHgzMSwgMHg3RSwgMHhGMSwgMHhGMSwgMHgwNiwgMHg4NiwgMHhGQywgMHg5QiwgMHgwMSwgMHg2MywKKwkweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY3LCAweEZGLCAweEVBLCAweEZGLAorCTB4OTMsIDB4MDAsIDB4MzYsIDB4RkUsIDB4N0QsIDB4MDQsIDB4ODUsIDB4RjQsIDB4MUYsIDB4NDAsIDB4OTQsCisJMHgxQywgMHg0NywgMHhGNCwgMHg3RSwgMHgwNiwgMHg1QSwgMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwKKwkweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE4LCAweDAwLCAweDlDLCAweEZGLCAweEQ0LCAweDAwLCAweEI0LAorCTB4RkUsIDB4OUEsIDB4MDEsIDB4OTUsIDB4RkUsIDB4QTgsIDB4RkYsIDB4OTgsIDB4NDgsIDB4MUQsIDB4MDgsCisJMHhFRSwgMHhGQSwgMHg4MCwgMHgwMywgMHhCOSwgMHhGRCwgMHg0QiwgMHgwMSwgMHg2RSwgMHhGRiwgMHgyNSwKKwkweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLCAweEE5LCAweDAxLAorCTB4RTcsIDB4RkMsIDB4MzMsIDB4MDUsIDB4NjAsIDB4RjcsIDB4REEsIDB4MTEsIDB4QjgsIDB4NDUsIDB4MUMsCisJMHhGOSwgMHhEOCwgMHgwMSwgMHhDQSwgMHhGRiwgMHhBRiwgMHhGRiwgMHg1QSwgMHgwMCwgMHhDQywgMHhGRiwKKwkweDBELCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweERFLCAweDAxLCAweDMzLAorCTB4RkMsIDB4MjEsIDB4MDcsIDB4MzAsIDB4RjIsIDB4NUMsIDB4MjcsIDB4NUIsIDB4MzgsIDB4MEYsIDB4RjIsCisJMHg0MCwgMHgwNiwgMHgwRSwgMHhGRCwgMHg0MywgMHgwMSwgMHg5MSwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEE4LCAweEZGLCAweDE3LCAweDAxLCAweDU3LCAweEZELAorCTB4RDYsIDB4MDUsIDB4OTAsIDB4RjIsIDB4QzgsIDB4M0EsIDB4NDYsIDB4MjQsIDB4QUEsIDB4RjIsIDB4MDYsCisJMHgwNywgMHgzMiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDEwLCAweDAwLCAweEJFLCAweEZGLCAweDdELCAweDAwLCAweDY5LCAweEZGLCAweDRCLCAweDAwLCAweEY2LAorCTB4MDAsIDB4Q0IsIDB4RkEsIDB4RDMsIDB4NDYsIDB4RjAsIDB4MEUsIDB4NUUsIDB4RjgsIDB4QkUsIDB4MDQsCisJMHgxRSwgMHhGRCwgMHg5MSwgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDI4LCAweDAwLCAweDYyLCAweEZGLCAweDY5LCAweDAxLCAweDc3LCAweEZELCAweDA0LCAweDA0LAorCTB4RTIsIDB4RjksIDB4Q0IsIDB4MEEsIDB4MEQsIDB4NDgsIDB4OTQsIDB4RkQsIDB4OTIsIDB4RkYsIDB4MTAsCisJMHgwMSwgMHhGRSwgMHhGRSwgMHhCMSwgMHgwMCwgMHhBQSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQzLCAweEZDLCAweEMwLCAweDA2LCAweDhGLAorCTB4RjMsIDB4QjEsIDB4MUYsIDB4MTgsIDB4M0UsIDB4OUIsIDB4RjMsIDB4MTYsIDB4MDUsIDB4RDUsIDB4RkQsCisJMHhDQywgMHgwMCwgMHhDRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwKKwkweDAwLCAweDc0LCAweEZGLCAweDdDLCAweDAxLCAweEI1LCAweEZDLCAweEI4LCAweDA2LCAweDlDLCAweEYxLAorCTB4ODEsIDB4MzQsIDB4RDEsIDB4MkIsIDB4QjMsIDB4RjEsIDB4MjksIDB4MDcsIDB4NDYsIDB4RkMsIDB4Q0EsCisJMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERiwgMHhGRiwKKwkweDI5LCAweDAwLCAweDE0LCAweDAwLCAweDE2LCAweEZGLCAweDBDLCAweDAzLCAweEVFLCAweEY2LCAweEIwLAorCTB4NDMsIDB4NDcsIDB4MTYsIDB4RkMsIDB4RjUsIDB4Q0YsIDB4MDUsIDB4QTEsIDB4RkMsIDB4QzYsIDB4MDEsCisJMHgzRiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MSwKKwkweEZGLCAweDFCLCAweDAxLCAweDIwLCAweEZFLCAweEI2LCAweDAyLCAweDdBLCAweEZDLCAweDVGLCAweDA0LAorCTB4RjQsIDB4NDgsIDB4RkYsIDB4MDIsIDB4MTMsIDB4RkQsIDB4NjcsIDB4MDIsIDB4NDksIDB4RkUsIDB4MDcsCisJMHgwMSwgMHg4OCwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzQywgMHhGRiwKKwkweENGLCAweDAxLCAweDhBLCAweEZDLCAweDA1LCAweDA2LCAweDdCLCAweEY1LCAweDA2LCAweDE4LCAweEM3LAorCTB4NDIsIDB4MkYsIDB4RjYsIDB4N0EsIDB4MDMsIDB4RDQsIDB4RkUsIDB4MzksIDB4MDAsIDB4MTcsIDB4MDAsCisJMHhFNiwgMHhGRiwgMHgwNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhDMCwKKwkweDAxLCAweDUzLCAweEZDLCAweDIxLCAweDA3LCAweDk2LCAweEYxLCAweDgyLCAweDJELCAweEYyLCAweDMyLAorCTB4ODYsIDB4RjEsIDB4REIsIDB4MDYsIDB4OTksIDB4RkMsIDB4OEUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjUsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGQiwgMHhGRiwgMHhERSwgMHhGRiwgMHhBQywgMHgwMCwKKwkweDBCLCAweEZFLCAweEMxLCAweDA0LCAweDFCLCAweEY0LCAweDQ3LCAweDNGLCAweEVBLCAweDFELCAweEY1LAorCTB4RjMsIDB4OUMsIDB4MDYsIDB4NEYsIDB4RkMsIDB4RTIsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhBMiwgMHhGRiwgMHhDNSwgMHgwMCwgMHhENCwgMHhGRSwgMHg1RiwKKwkweDAxLCAweDAzLCAweEZGLCAweEJGLCAweEZFLCAweDYzLCAweDQ4LCAweDQwLCAweDA5LCAweDdCLCAweEZBLAorCTB4QjksIDB4MDMsIDB4OUQsIDB4RkQsIDB4NTgsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RCwgMHhGRiwgMHg5RiwgMHgwMSwgMHhGRSwgMHhGQywKKwkweDAyLCAweDA1LCAweENCLCAweEY3LCAweDk4LCAweDEwLCAweDM5LCAweDQ2LCAweEQwLCAweEY5LCAweDc4LAorCTB4MDEsIDB4MDAsIDB4MDAsIDB4OTEsIDB4RkYsIDB4NjksIDB4MDAsIDB4QzYsIDB4RkYsIDB4MEUsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNywKKwkweDA3LCAweDYxLCAweEYyLCAweDBBLCAweDI2LCAweDZBLCAweDM5LCAweDQxLCAweEYyLCAweDE1LCAweDA2LAorCTB4MkMsIDB4RkQsIDB4MzEsIDB4MDEsIDB4OUIsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHgxMywgMHgwMCwgMHg5RSwgMHhGRiwgMHgyQiwgMHgwMSwgMHgzNywgMHhGRCwgMHgwNSwgMHgwNiwKKwkweDU0LCAweEYyLCAweEMyLCAweDM5LCAweDk5LCAweDI1LCAweDczLCAweEYyLCAweDE0LCAweDA3LCAweDMxLAorCTB4RkMsIDB4RTMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEUsIDB4MDAsCisJMHhDNCwgMHhGRiwgMHg2RSwgMHgwMCwgMHg4NywgMHhGRiwgMHgxMywgMHgwMCwgMHg1OCwgMHgwMSwgMHgwRCwKKwkweEZBLCAweDYxLCAweDQ2LCAweDJELCAweDEwLCAweEYwLCAweEY3LCAweEYxLCAweDA0LCAweDA1LCAweEZELAorCTB4OUMsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsCisJMHgwMCwgMHg2NywgMHhGRiwgMHg1QywgMHgwMSwgMHg5MywgMHhGRCwgMHhDQywgMHgwMywgMHg1NCwgMHhGQSwKKwkweEEyLCAweDA5LCAweDRGLCAweDQ4LCAweDczLCAweEZFLCAweDI3LCAweEZGLCAweDRCLCAweDAxLCAweERFLAorCTB4RkUsIDB4QzAsIDB4MDAsIDB4QTQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0QywgMHhGQywgMHhBNiwgMHgwNiwgMHhEQiwgMHhGMywgMHg1QiwKKwkweDFFLCAweEZDLCAweDNFLCAweEZBLCAweEYzLCAweEQ3LCAweDA0LCAweEZELCAweEZELCAweEI0LCAweDAwLAorCTB4RDksIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkQsCisJMHhGRiwgMHg4QSwgMHgwMSwgMHg5RiwgMHhGQywgMHhEMywgMHgwNiwgMHg4QSwgMHhGMSwgMHg1NywgMHgzMywKKwkweDE3LCAweDJELCAweDlDLCAweEYxLCAweDI0LCAweDA3LCAweDRGLCAweEZDLCAweEMzLCAweDAxLCAweDRFLAorCTB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTQsIDB4RkYsIDB4MUIsIDB4MDAsCisJMHgzMCwgMHgwMCwgMHhFNCwgMHhGRSwgMHg1RiwgMHgwMywgMHg1RSwgMHhGNiwgMHgwMiwgMHg0MywgMHg5NiwKKwkweDE3LCAweDlCLCAweEY1LCAweEY4LCAweDA1LCAweDhGLCAweEZDLCAweENDLCAweDAxLCAweDNELCAweEZGLAorCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsIDB4ODYsIDB4RkYsIDB4MEMsIDB4MDEsIDB4M0UsCisJMHhGRSwgMHg3QiwgMHgwMiwgMHhFRCwgMHhGQywgMHg1NiwgMHgwMywgMHhGNSwgMHg0OCwgMHgwNiwgMHgwNCwKKwkweEExLCAweEZDLCAweEEzLCAweDAyLCAweDJBLCAweEZFLCAweDE2LCAweDAxLCAweDgzLCAweEZGLCAweDFGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0UsIDB4RkYsIDB4QzgsIDB4MDEsCisJMHg5QiwgMHhGQywgMHhERCwgMHgwNSwgMHhEQywgMHhGNSwgMHhCNiwgMHgxNiwgMHg3NywgMHg0MywgMHhCRCwKKwkweEY2LCAweDI4LCAweDAzLCAweDA1LCAweEZGLCAweDFELCAweDAwLCAweDI1LCAweDAwLCAweEUxLCAweEZGLAorCTB4MDgsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEIsIDB4RkYsIDB4QzgsIDB4MDEsIDB4NDksCisJMHhGQywgMHgyNywgMHgwNywgMHhBQiwgMHhGMSwgMHgzRSwgMHgyQywgMHgxRSwgMHgzNCwgMHg5NSwgMHhGMSwKKwkweEMxLCAweDA2LCAweEFFLCAweEZDLCAweDgxLCAweDAxLCAweDcxLCAweEZGLCAweDIzLCAweDAwLCAweEZFLAorCTB4RkYsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4RkYsIDB4QzQsIDB4MDAsIDB4RTIsIDB4RkQsCisJMHgwMSwgMHgwNSwgMHhCQSwgMHhGMywgMHg2NCwgMHgzRSwgMHgzRiwgMHgxRiwgMHhBOCwgMHhGMywgMHhCOCwKKwkweDA2LCAweDQ2LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLAorCTB4MTUsIDB4MDAsIDB4QTgsIDB4RkYsIDB4QjYsIDB4MDAsIDB4RjMsIDB4RkUsIDB4MjQsIDB4MDEsIDB4NkUsCisJMHhGRiwgMHhERSwgMHhGRCwgMHgyNSwgMHg0OCwgMHg2OCwgMHgwQSwgMHgwOCwgMHhGQSwgMHhGMiwgMHgwMywKKwkweDgxLCAweEZELCAweDY1LCAweDAxLCAweDY0LCAweEZGLCAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MkQsIDB4MDAsIDB4NTEsIDB4RkYsIDB4OTUsIDB4MDEsIDB4MTUsIDB4RkQsIDB4Q0YsIDB4MDQsCisJMHgzOSwgMHhGOCwgMHg1OSwgMHgwRiwgMHhBRiwgMHg0NiwgMHg4QiwgMHhGQSwgMHgxNywgMHgwMSwgMHgzOCwKKwkweDAwLCAweDczLCAweEZGLCAweDc4LCAweDAwLCAweEMwLCAweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTQsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MEIsIDB4MDcsIDB4OTcsCisJMHhGMiwgMHhCOCwgMHgyNCwgMHg3MSwgMHgzQSwgMHg3QiwgMHhGMiwgMHhFNiwgMHgwNSwgMHg0QywgMHhGRCwKKwkweDFELCAweDAxLCAweEE0LCAweEZGLCAweDExLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE2LAorCTB4MDAsIDB4OTQsIDB4RkYsIDB4M0QsIDB4MDEsIDB4MTgsIDB4RkQsIDB4MzIsIDB4MDYsIDB4MUYsIDB4RjIsCisJMHhCNSwgMHgzOCwgMHhFQiwgMHgyNiwgMHg0MCwgMHhGMiwgMHgxRSwgMHgwNywgMHgzMiwgMHhGQywgMHhERiwKKwkweDAxLCAweDNELCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBELCAweDAwLCAweENBLCAweEZGLAorCTB4NUYsIDB4MDAsIDB4QTUsIDB4RkYsIDB4REMsIDB4RkYsIDB4QjgsIDB4MDEsIDB4NTcsIDB4RjksIDB4RTUsCisJMHg0NSwgMHg2RSwgMHgxMSwgMHg4MywgMHhGNywgMHgyMywgMHgwNSwgMHhFRSwgMHhGQywgMHhBNiwgMHgwMSwKKwkweDRCLCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI1LCAweDAwLCAweDZDLAorCTB4RkYsIDB4NEYsIDB4MDEsIDB4QjAsIDB4RkQsIDB4OTMsIDB4MDMsIDB4QzcsIDB4RkEsIDB4N0QsIDB4MDgsCisJMHg4NiwgMHg0OCwgMHg1QSwgMHhGRiwgMHhCQSwgMHhGRSwgMHg4NiwgMHgwMSwgMHhCRiwgMHhGRSwgMHhDRiwKKwkweDAwLCAweDlFLCAweEZGLCAweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLAorCTB4RTAsIDB4MDEsIDB4NTYsIDB4RkMsIDB4ODksIDB4MDYsIDB4MkIsIDB4RjQsIDB4MDYsIDB4MUQsIDB4RDcsCisJMHgzRiwgMHg2MSwgMHhGNCwgMHg5NCwgMHgwNCwgMHgyNywgMHhGRSwgMHg5QywgMHgwMCwgMHhFNiwgMHhGRiwKKwkweEY4LCAweEZGLCAweDA0LCAweDAwLCAweEZELCAweEZGLCAweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDk3LAorCTB4MDEsIDB4OEMsIDB4RkMsIDB4RUEsIDB4MDYsIDB4ODAsIDB4RjEsIDB4MjYsIDB4MzIsIDB4NTgsIDB4MkUsCisJMHg4QiwgMHhGMSwgMHgxQiwgMHgwNywgMHg1QiwgMHhGQywgMHhCQSwgMHgwMSwgMHg1MywgMHhGRiwgMHgyRCwKKwkweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU5LCAweEZGLCAweDBFLCAweDAwLCAweDRCLCAweDAwLAorCTB4QjQsIDB4RkUsIDB4QUYsIDB4MDMsIDB4RDUsIDB4RjUsIDB4NEQsIDB4NDIsIDB4RTYsIDB4MTgsIDB4M0MsCisJMHhGNSwgMHgxRiwgMHgwNiwgMHg3RiwgMHhGQywgMHhEMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwKKwkweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDhDLCAweEZGLCAweEZFLCAweDAwLCAweDVELCAweEZFLCAweDNGLAorCTB4MDIsIDB4NUUsIDB4RkQsIDB4NTQsIDB4MDIsIDB4RUMsIDB4NDgsIDB4MTMsIDB4MDUsIDB4MkUsIDB4RkMsCisJMHhERSwgMHgwMiwgMHgwQywgMHhGRSwgMHgyNCwgMHgwMSwgMHg3RCwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQxLCAweEZGLCAweEMxLCAweDAxLCAweEFELCAweEZDLAorCTB4QjIsIDB4MDUsIDB4M0YsIDB4RjYsIDB4NjksIDB4MTUsIDB4MUYsIDB4NDQsIDB4NTMsIDB4RjcsIDB4RDMsCisJMHgwMiwgMHgzOCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgzMywgMHgwMCwgMHhEQiwgMHhGRiwgMHgwOSwgMHgwMCwKKwkweEZELCAweEZGLCAweDMxLCAweDAwLCAweDQ3LCAweEZGLCAweENGLCAweDAxLCAweDQwLCAweEZDLCAweDJBLAorCTB4MDcsIDB4QzYsIDB4RjEsIDB4RjcsIDB4MkEsIDB4NDYsIDB4MzUsIDB4QUIsIDB4RjEsIDB4QTQsIDB4MDYsCisJMHhDNCwgMHhGQywgMHg3MiwgMHgwMSwgMHg3OSwgMHhGRiwgMHgyMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwKKwkweDAwLCAweDA0LCAweDAwLCAweEM2LCAweEZGLCAweERCLCAweDAwLCAweEJCLCAweEZELCAweDNFLCAweDA1LAorCTB4NjAsIDB4RjMsIDB4N0IsIDB4M0QsIDB4OTQsIDB4MjAsIDB4NUUsIDB4RjMsIDB4RDAsIDB4MDYsIDB4M0UsCisJMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwKKwkweEFFLCAweEZGLCAweEE3LCAweDAwLCAweDEyLCAweEZGLCAweEVBLCAweDAwLCAweEQ5LCAweEZGLCAweDAzLAorCTB4RkQsIDB4REMsIDB4NDcsIDB4OTUsIDB4MEIsIDB4OTYsIDB4RjksIDB4MjksIDB4MDQsIDB4NjUsIDB4RkQsCisJMHg3MSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyQywKKwkweDAwLCAweDU1LCAweEZGLCAweDhBLCAweDAxLCAweDJFLCAweEZELCAweDlCLCAweDA0LCAweEE4LCAweEY4LAorCTB4MUYsIDB4MEUsIDB4MUEsIDB4NDcsIDB4NEUsIDB4RkIsIDB4QjMsIDB4MDAsIDB4NzAsIDB4MDAsIDB4NTQsCisJMHhGRiwgMHg4NywgMHgwMCwgMHhCQiwgMHhGRiwgMHgxMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM4LCAweEZGLCAweEU2LCAweDAxLCAweDM0LCAweEZDLCAweEZCLCAweDA2LCAweEQyLCAweEYyLCAweDY0LAorCTB4MjMsIDB4NzMsIDB4M0IsIDB4QkMsIDB4RjIsIDB4QjQsIDB4MDUsIDB4NkUsIDB4RkQsIDB4MDksIDB4MDEsCisJMHhBRiwgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxQSwgMHgwMCwgMHg4QiwKKwkweEZGLCAweDRGLCAweDAxLCAweEZCLCAweEZDLCAweDVBLCAweDA2LCAweEYyLCAweEYxLCAweEEwLCAweDM3LAorCTB4M0EsIDB4MjgsIDB4MTMsIDB4RjIsIDB4MjUsIDB4MDcsIDB4MzUsIDB4RkMsIDB4REIsIDB4MDEsIDB4NDAsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQywgMHgwMCwgMHhEMCwgMHhGRiwgMHg1MSwgMHgwMCwKKwkweEMzLCAweEZGLCAweEE2LCAweEZGLCAweDE2LCAweDAyLCAweEE5LCAweEY4LCAweDVDLCAweDQ1LCAweEIyLAorCTB4MTIsIDB4MTksIDB4RjcsIDB4NTIsIDB4MDUsIDB4RDgsIDB4RkMsIDB4QUYsIDB4MDEsIDB4NDcsIDB4RkYsCisJMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MSwgMHhGRiwgMHg0MiwKKwkweDAxLCAweENELCAweEZELCAweDU5LCAweDAzLCAweDNCLCAweEZCLCAweDVFLCAweDA3LCAweEIzLCAweDQ4LAorCTB4NDgsIDB4MDAsIDB4NEIsIDB4RkUsIDB4QzIsIDB4MDEsIDB4OUYsIDB4RkUsIDB4REUsIDB4MDAsIDB4OTgsCisJMHhGRiwgMHgxOSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhERCwgMHgwMSwKKwkweDYyLCAweEZDLCAweDY5LCAweDA2LCAweDdGLCAweEY0LCAweEIyLCAweDFCLCAweEFCLCAweDQwLCAweEQwLAorCTB4RjQsIDB4NEUsIDB4MDQsIDB4NTMsIDB4RkUsIDB4ODMsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RjQsIDB4RkYsCisJMHgwNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHhBMywgMHgwMSwgMHg3QSwKKwkweEZDLCAweEZELCAweDA2LCAweDdDLCAweEYxLCAweEYyLCAweDMwLCAweDk2LCAweDJGLCAweDgwLCAweEYxLAorCTB4MEYsIDB4MDcsIDB4NjksIDB4RkMsIDB4QjAsIDB4MDEsIDB4NTksIDB4RkYsIDB4MkIsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwNiwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHg2NiwgMHgwMCwgMHg4NSwgMHhGRSwKKwkweEZDLCAweDAzLCAweDU1LCAweEY1LCAweDhDLCAweDQxLCAweDM4LCAweDFBLCAweEUxLCAweEY0LCAweDQzLAorCTB4MDYsIDB4NzAsIDB4RkMsIDB4RDgsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgxQiwgMHgwMCwgMHg5MiwgMHhGRiwgMHhFRiwgMHgwMCwgMHg3RCwgMHhGRSwgMHgwNCwgMHgwMiwgMHhDRiwKKwkweEZELCAweDU4LCAweDAxLCAweEQ3LCAweDQ4LCAweDI2LCAweDA2LCAweEJCLCAweEZCLCAweDE5LCAweDAzLAorCTB4RUQsIDB4RkQsIDB4MzIsIDB4MDEsIDB4NzcsIDB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhCOSwgMHgwMSwgMHhDMSwgMHhGQywgMHg4NiwgMHgwNSwKKwkweEE1LCAweEY2LCAweDFFLCAweDE0LCAweEJBLCAweDQ0LCAweEYwLCAweEY3LCAweDdCLCAweDAyLCAweDZCLAorCTB4RkYsIDB4RTQsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RDYsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzMywgMHgwMCwgMHg0MywgMHhGRiwgMHhENSwgMHgwMSwgMHgzQSwgMHhGQywgMHgyQSwgMHgwNywgMHhFNywKKwkweEYxLCAweEFDLCAweDI5LCAweDY2LCAweDM2LCAweEM5LCAweEYxLCAweDgzLCAweDA2LCAweERELCAweEZDLAorCTB4NjIsIDB4MDEsIDB4ODEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDgsCisJMHgwMCwgMHhCQiwgMHhGRiwgMHhGMSwgMHgwMCwgMHg5NiwgMHhGRCwgMHg3OCwgMHgwNSwgMHgwRSwgMHhGMywKKwkweDhBLCAweDNDLCAweEVBLCAweDIxLCAweDE5LCAweEYzLCAweEU2LCAweDA2LCAweDM4LCAweEZDLCAweEU2LAorCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjQsIDB4RkYsCisJMHg5OCwgMHgwMCwgMHgzMiwgMHhGRiwgMHhCMCwgMHgwMCwgMHg0MSwgMHgwMCwgMHgzMCwgMHhGQywgMHg4NiwKKwkweDQ3LCAweEM2LCAweDBDLCAweDI0LCAweEY5LCAweDYwLCAweDA0LCAweDRCLCAweEZELCAweDdELCAweDAxLAorCTB4NUEsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NUEsCisJMHhGRiwgMHg3RSwgMHgwMSwgMHg0OCwgMHhGRCwgMHg2NiwgMHgwNCwgMHgxOCwgMHhGOSwgMHhFOCwgMHgwQywKKwkweDdDLCAweDQ3LCAweDE5LCAweEZDLCAweDRELCAweDAwLCAweEE5LCAweDAwLCAweDM1LCAweEZGLCAweDk2LAorCTB4MDAsIDB4QjUsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsCisJMHhFNiwgMHgwMSwgMHgzOCwgMHhGQywgMHhFOSwgMHgwNiwgMHgxMiwgMHhGMywgMHgxMCwgMHgyMiwgMHg2RSwKKwkweDNDLCAweDA1LCAweEYzLCAweDdFLCAweDA1LCAweDkxLCAweEZELCAweEY0LCAweDAwLCAweEJBLCAweEZGLAorCTB4MDksIDB4MDAsIDB4MDEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUQsIDB4MDAsIDB4ODIsIDB4RkYsIDB4NjAsCisJMHgwMSwgMHhFMCwgMHhGQywgMHg3RiwgMHgwNiwgMHhDQywgMHhGMSwgMHg4NSwgMHgzNiwgMHg4NywgMHgyOSwKKwkweEVCLCAweEYxLCAweDJBLCAweDA3LCAweDM5LCAweEZDLCAweEQ2LCAweDAxLCAweDQzLCAweEZGLCAweDMzLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MEIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NDIsIDB4MDAsIDB4RTEsIDB4RkYsCisJMHg3MSwgMHhGRiwgMHg3MSwgMHgwMiwgMHgwMiwgMHhGOCwgMHhDQywgMHg0NCwgMHhGQSwgMHgxMywgMHhCMCwKKwkweEY2LCAweDgxLCAweDA1LCAweEMzLCAweEZDLCAweEI4LCAweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjIsIDB4MDAsIDB4NzcsIDB4RkYsIDB4MzQsIDB4MDEsIDB4RUEsCisJMHhGRCwgMHgxRiwgMHgwMywgMHhBRSwgMHhGQiwgMHg0NSwgMHgwNiwgMHhENSwgMHg0OCwgMHgzQywgMHgwMSwKKwkweERDLCAweEZELCAweEZELCAweDAxLCAweDgwLCAweEZFLCAweEVELCAweDAwLCAweDkzLCAweEZGLCAweDFCLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDgsIDB4MDEsIDB4NkYsIDB4RkMsCisJMHg0NywgMHgwNiwgMHhENywgMHhGNCwgMHg1RCwgMHgxQSwgMHg3NCwgMHg0MSwgMHg0OCwgMHhGNSwgMHgwNCwKKwkweDA0LCAweDgwLCAweEZFLCAweDY5LCAweDAwLCAweEZGLCAweEZGLCAweEVGLCAweEZGLCAweDA1LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MkIsIDB4MDAsIDB4NTksIDB4RkYsIDB4QUUsIDB4MDEsIDB4NkEsIDB4RkMsIDB4MEQsCisJMHgwNywgMHg4MCwgMHhGMSwgMHhCOCwgMHgyRiwgMHhDRiwgMHgzMCwgMHg3RCwgMHhGMSwgMHhGRiwgMHgwNiwKKwkweDc4LCAweEZDLCAweEE1LCAweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweEZELCAweEZGLCAweDA1LAorCTB4MDAsIDB4RjMsIDB4RkYsIDB4RjQsIDB4RkYsIDB4ODAsIDB4MDAsIDB4NTgsIDB4RkUsIDB4NDYsIDB4MDQsCisJMHhERCwgMHhGNCwgMHhDMywgMHg0MCwgMHg4QywgMHgxQiwgMHg4OSwgMHhGNCwgMHg2NiwgMHgwNiwgMHg2MywKKwkweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE5LCAweDAwLAorCTB4OTgsIDB4RkYsIDB4RTAsIDB4MDAsIDB4OUMsIDB4RkUsIDB4QzgsIDB4MDEsIDB4M0YsIDB4RkUsIDB4NjIsCisJMHgwMCwgMHhCOCwgMHg0OCwgMHgzRiwgMHgwNywgMHg0NywgMHhGQiwgMHg1MywgMHgwMywgMHhEMCwgMHhGRCwKKwkweDQwLCAweDAxLCAweDcyLCAweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMwLAorCTB4MDAsIDB4NDcsIDB4RkYsIDB4QjAsIDB4MDEsIDB4RDYsIDB4RkMsIDB4NTgsIDB4MDUsIDB4MEQsIDB4RjcsCisJMHhENywgMHgxMiwgMHg0RSwgMHg0NSwgMHg5NiwgMHhGOCwgMHgyMCwgMHgwMiwgMHhBMCwgMHhGRiwgMHhDNywKKwkweEZGLCAweDRGLCAweDAwLCAweEQwLCAweEZGLCAweDBDLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAorCTB4NDAsIDB4RkYsIDB4REIsIDB4MDEsIDB4MzUsIDB4RkMsIDB4MjYsIDB4MDcsIDB4MEUsIDB4RjIsIDB4NjAsCisJMHgyOCwgMHg4MiwgMHgzNywgMHhFRCwgMHhGMSwgMHg1RSwgMHgwNiwgMHhGOCwgMHhGQywgMHg1MSwgMHgwMSwKKwkweDhBLCAweEZGLCAweDFBLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEIwLAorCTB4RkYsIDB4MDcsIDB4MDEsIDB4NzIsIDB4RkQsIDB4QUUsIDB4MDUsIDB4QzQsIDB4RjIsIDB4OTAsIDB4M0IsCisJMHgzRiwgMHgyMywgMHhEOSwgMHhGMiwgMHhGOSwgMHgwNiwgMHgzNCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwKKwkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDExLCAweDAwLCAweEJBLCAweEZGLCAweDg5LCAweDAwLAorCTB4NTEsIDB4RkYsIDB4NzcsIDB4MDAsIDB4QTcsIDB4MDAsIDB4NjQsIDB4RkIsIDB4MjYsIDB4NDcsIDB4RkMsCisJMHgwRCwgMHhCNCwgMHhGOCwgMHg5NSwgMHgwNCwgMHgzMSwgMHhGRCwgMHg4OCwgMHgwMSwgMHg1NiwgMHhGRiwKKwkweDJDLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDVFLCAweEZGLCAweDcyLAorCTB4MDEsIDB4NjIsIDB4RkQsIDB4MkYsIDB4MDQsIDB4ODksIDB4RjksIDB4QjYsIDB4MEIsIDB4RDIsIDB4NDcsCisJMHhFQiwgMHhGQywgMHhFNCwgMHhGRiwgMHhFMywgMHgwMCwgMHgxNiwgMHhGRiwgMHhBNSwgMHgwMCwgMHhBRiwKKwkweEZGLCAweDEzLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLAorCTB4M0UsIDB4RkMsIDB4RDMsIDB4MDYsIDB4NTYsIDB4RjMsIDB4QkEsIDB4MjAsIDB4NjEsIDB4M0QsIDB4NTYsCisJMHhGMywgMHg0NSwgMHgwNSwgMHhCNywgMHhGRCwgMHhERSwgMHgwMCwgMHhDNSwgMHhGRiwgMHgwNSwgMHgwMCwKKwkweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLCAweDdBLCAweEZGLCAweDcwLCAweDAxLCAweEM3LAorCTB4RkMsIDB4QTAsIDB4MDYsIDB4QUUsIDB4RjEsIDB4NjUsIDB4MzUsIDB4RDEsIDB4MkEsIDB4Q0EsIDB4RjEsCisJMHgyQSwgMHgwNywgMHg0MCwgMHhGQywgMHhEMCwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDA5LCAweDAwLCAweERCLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDNELCAweEZGLAorCTB4QzksIDB4MDIsIDB4NjQsIDB4RjcsIDB4MkYsIDB4NDQsIDB4NDQsIDB4MTUsIDB4NEEsIDB4RjYsIDB4QUQsCisJMHgwNSwgMHhBRiwgMHhGQywgMHhDMCwgMHgwMSwgMHg0MSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdDLCAweEZGLCAweDI2LCAweDAxLCAweDA4LCAweEZFLCAweEU0LAorCTB4MDIsIDB4MjEsIDB4RkMsIDB4MzEsIDB4MDUsIDB4RUIsIDB4NDgsIDB4MzcsIDB4MDIsIDB4NkIsIDB4RkQsCisJMHgzOSwgMHgwMiwgMHg2MSwgMHhGRSwgMHhGQywgMHgwMCwgMHg4RCwgMHhGRiwgMHgxQywgMHgwMCwgMHhGRSwKKwkweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQzLCAweDAxLCAweDdELCAweEZDLCAweDIzLCAweDA2LAorCTB4MzIsIDB4RjUsIDB4MEMsIDB4MTksIDB4MzgsIDB4NDIsIDB4QzcsIDB4RjUsIDB4QjgsIDB4MDMsIDB4QUYsCisJMHhGRSwgMHg0RSwgMHgwMCwgMHgwQywgMHgwMCwgMHhFQSwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDJELCAweDAwLCAweDU0LCAweEZGLCAweEI4LCAweDAxLCAweDVELCAweEZDLCAweDFBLCAweDA3LCAweDhBLAorCTB4RjEsIDB4N0IsIDB4MkUsIDB4MDQsIDB4MzIsIDB4N0YsIDB4RjEsIDB4RUMsIDB4MDYsIDB4OEEsIDB4RkMsCisJMHg5OCwgMHgwMSwgMHg2NSwgMHhGRiwgMHgyNywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGOCwKKwkweEZGLCAweEU3LCAweEZGLCAweDk5LCAweDAwLCAweDJDLCAweEZFLCAweDhDLCAweDA0LCAweDZELCAweEY0LAorCTB4RjAsIDB4M0YsIDB4RTAsIDB4MUMsIDB4MzQsIDB4RjQsIDB4ODUsIDB4MDYsIDB4NTcsIDB4RkMsIDB4RTAsCisJMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5RSwgMHhGRiwKKwkweEQxLCAweDAwLCAweEJCLCAweEZFLCAweDhELCAweDAxLCAweEFFLCAweEZFLCAweDc0LCAweEZGLCAweDhELAorCTB4NDgsIDB4NUQsIDB4MDgsIDB4RDQsIDB4RkEsIDB4OEQsIDB4MDMsIDB4QjMsIDB4RkQsIDB4NEUsIDB4MDEsCisJMHg2RCwgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QSwKKwkweEZGLCAweEE3LCAweDAxLCAweEVDLCAweEZDLCAweDI4LCAweDA1LCAweDc3LCAweEY3LCAweDkyLCAweDExLAorCTB4RDcsIDB4NDUsIDB4NDMsIDB4RjksIDB4QzMsIDB4MDEsIDB4RDYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NUUsCisJMHgwMCwgMHhDQiwgMHhGRiwgMHgwRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwKKwkweERGLCAweDAxLCAweDMyLCAweEZDLCAweDFGLCAweDA3LCAweDNCLCAweEYyLCAweDExLCAweDI3LCAweDk3LAorCTB4MzgsIDB4MTksIDB4RjIsIDB4MzYsIDB4MDYsIDB4MTUsIDB4RkQsIDB4M0YsIDB4MDEsIDB4OTMsIDB4RkYsCisJMHgxNywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxQiwKKwkweDAxLCAweDUwLCAweEZELCAweEUxLCAweDA1LCAweDgyLCAweEYyLCAweDhGLCAweDNBLCAweDkyLCAweDI0LAorCTB4OUQsIDB4RjIsIDB4MDksIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMCwgMHhGRiwgMHg3QSwgMHgwMCwgMHg3MCwgMHhGRiwKKwkweDNFLCAweDAwLCAweDBDLCAweDAxLCAweEExLCAweEZBLCAweEJCLCAweDQ2LCAweDM2LCAweDBGLCAweDQ1LAorCTB4RjgsIDB4QzksIDB4MDQsIDB4MTgsIDB4RkQsIDB4OTMsIDB4MDEsIDB4NTIsIDB4RkYsIDB4MkQsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg2NiwgMHgwMSwgMHg3RCwKKwkweEZELCAweEY4LCAweDAzLCAweEZCLCAweEY5LCAweDg5LCAweDBBLCAweDFELCAweDQ4LCAweEM1LCAweEZELAorCTB4N0EsIDB4RkYsIDB4MUQsIDB4MDEsIDB4RjcsIDB4RkUsIDB4QjQsIDB4MDAsIDB4QTksIDB4RkYsIDB4MTUsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNSwgMHgwMSwgMHg0NSwgMHhGQywKKwkweEJCLCAweDA2LCAweEEwLCAweEYzLCAweDY0LCAweDFGLCAweDRBLCAweDNFLCAweEIwLCAweEYzLCAweDA4LAorCTB4MDUsIDB4REUsIDB4RkQsIDB4QzcsIDB4MDAsIDB4RDAsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgyMywgMHgwMCwgMHg3MiwgMHhGRiwgMHg3RiwgMHgwMSwgMHhCMCwgMHhGQywgMHhCRSwKKwkweDA2LCAweDk3LCAweEYxLCAweDNGLCAweDM0LCAweDE5LCAweDJDLCAweEFELCAweEYxLCAweDI4LCAweDA3LAorCTB4NDgsIDB4RkMsIDB4QzksIDB4MDEsIDB4NEIsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDgsCisJMHgwMCwgMHhFMCwgMHhGRiwgMHgyNiwgMHgwMCwgMHgxQSwgMHgwMCwgMHgwQiwgMHhGRiwgMHgxRSwgMHgwMywKKwkweENELCAweEY2LCAweDg5LCAweDQzLCAweDkxLCAweDE2LCAweEU3LCAweEY1LCAweEQ4LCAweDA1LCAweDlELAorCTB4RkMsIDB4QzcsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgxRiwgMHgwMCwgMHg4MiwgMHhGRiwgMHgxOCwgMHgwMSwgMHgyNywgMHhGRSwgMHhBOSwgMHgwMiwgMHg5NCwKKwkweEZDLCAweDI0LCAweDA0LCAweEY1LCAweDQ4LCAweDM5LCAweDAzLCAweEY5LCAweEZDLCAweDc0LCAweDAyLAorCTB4NDIsIDB4RkUsIDB4MEIsIDB4MDEsIDB4ODcsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsCisJMHgwMCwgMHgzQywgMHhGRiwgMHhDRCwgMHgwMSwgMHg4RSwgMHhGQywgMHhGQywgMHgwNSwgMHg5MCwgMHhGNSwKKwkweEJCLCAweDE3LCAweEVFLCAweDQyLCAweDRFLCAweEY2LCAweDY4LCAweDAzLCAweERGLCAweEZFLCAweDMzLAorCTB4MDAsIDB4MUEsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsCisJMHg0RiwgMHhGRiwgMHhDMiwgMHgwMSwgMHg1MSwgMHhGQywgMHgyMywgMHgwNywgMHg5QSwgMHhGMSwgMHgzQSwKKwkweDJELCAweDM1LCAweDMzLCAweDg5LCAweEYxLCAweEQ1LCAweDA2LCAweDlELCAweEZDLCAweDhCLCAweDAxLAorCTB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkMsIDB4RkYsIDB4REIsCisJMHhGRiwgMHhCMiwgMHgwMCwgMHgwMiwgMHhGRSwgMHhDRiwgMHgwNCwgMHgwNSwgMHhGNCwgMHgxNiwgMHgzRiwKKwkweDM2LCAweDFFLCAweEU0LCAweEYzLCAweEEzLCAweDA2LCAweDRELCAweEZDLCAweEUzLCAweDAxLCAweDM2LAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzIsIDB4MDAsCisJMHhEQiwgMHhGRSwgMHg1MiwgMHgwMSwgMHgxQiwgMHhGRiwgMHg4RCwgMHhGRSwgMHg1NywgMHg0OCwgMHg4MSwKKwkweDA5LCAweDYxLCAweEZBLCAweEM2LCAweDAzLCAweDk2LCAweEZELCAweDVCLCAweDAxLCAweDY4LCAweEZGLAorCTB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NEUsIDB4RkYsIDB4OUQsCisJMHgwMSwgMHgwMywgMHhGRCwgMHhGNywgMHgwNCwgMHhFMywgMHhGNywgMHg1MSwgMHgxMCwgMHg1NSwgMHg0NiwKKwkweEY5LCAweEY5LCAweDYzLCAweDAxLCAweDBELCAweDAwLCAweDhCLCAweEZGLCAweDZELCAweDAwLCAweEM1LAorCTB4RkYsIDB4MEUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTIsIDB4MDEsCisJMHgzMSwgMHhGQywgMHgxNSwgMHgwNywgMHg2RCwgMHhGMiwgMHhCRiwgMHgyNSwgMHhBNSwgMHgzOSwgMHg0RCwKKwkweEYyLCAweDBCLCAweDA2LCAweDMzLCAweEZELCAweDJELCAweDAxLCAweDlELCAweEZGLCAweDEzLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MkYsIDB4MDEsIDB4MzAsCisJMHhGRCwgMHgxMCwgMHgwNiwgMHg0NywgMHhGMiwgMHg4NywgMHgzOSwgMHhFNSwgMHgyNSwgMHg2NywgMHhGMiwKKwkweDE2LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLCAweDNCLCAweEZGLCAweDM1LCAweDAwLCAweEZELAorCTB4RkYsIDB4MEUsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NkIsIDB4MDAsIDB4OEUsIDB4RkYsIDB4MDYsIDB4MDAsCisJMHg2RSwgMHgwMSwgMHhFNCwgMHhGOSwgMHg0OCwgMHg0NiwgMHg3NSwgMHgxMCwgMHhENywgMHhGNywgMHhGQywKKwkweDA0LCAweDAwLCAweEZELCAweDlFLCAweDAxLCAweDRFLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4NjgsIDB4RkYsIDB4NTksIDB4MDEsIDB4OTksIDB4RkQsIDB4QzAsCisJMHgwMywgMHg2RSwgMHhGQSwgMHg2MSwgMHgwOSwgMHg1RCwgMHg0OCwgMHhBNiwgMHhGRSwgMHgwRiwgMHhGRiwKKwkweDU4LCAweDAxLCAweEQ3LCAweEZFLCAweEMzLCAweDAwLCAweEEzLCAweEZGLCAweDE2LCAweDAwLCAweEZFLAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsIDB4NEUsIDB4RkMsIDB4QTAsIDB4MDYsCisJMHhFRCwgMHhGMywgMHgwRiwgMHgxRSwgMHgyRCwgMHgzRiwgMHgxMCwgMHhGNCwgMHhDOCwgMHgwNCwgMHgwNywKKwkweEZFLCAweEFGLCAweDAwLCAweERDLCAweEZGLCAweEZDLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLAorCTB4MjUsIDB4MDAsIDB4NkIsIDB4RkYsIDB4OEQsIDB4MDEsIDB4OUIsIDB4RkMsIDB4RDgsIDB4MDYsIDB4ODcsCisJMHhGMSwgMHgxMywgMHgzMywgMHg1RSwgMHgyRCwgMHg5OCwgMHhGMSwgMHgyMiwgMHgwNywgMHg1MiwgMHhGQywKKwkweEMxLCAweDAxLCAweDRGLCAweEZGLCAweDJGLCAweDAwLCAweEZELCAweEZGLCAweDA3LCAweDAwLCAweEU1LAorCTB4RkYsIDB4MTgsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksIDB4RkUsIDB4NzEsIDB4MDMsIDB4M0YsIDB4RjYsCisJMHhEQiwgMHg0MiwgMHhFMCwgMHgxNywgMHg4NiwgMHhGNSwgMHgwMCwgMHgwNiwgMHg4QywgMHhGQywgMHhDRSwKKwkweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDFELCAweDAwLCAweDg4LCAweEZGLAorCTB4MDksIDB4MDEsIDB4NDUsIDB4RkUsIDB4NkUsIDB4MDIsIDB4MDYsIDB4RkQsIDB4MUMsIDB4MDMsIDB4RjQsCisJMHg0OCwgMHg0MSwgMHgwNCwgMHg4NywgMHhGQywgMHhCMCwgMHgwMiwgMHgyMywgMHhGRSwgMHgxOSwgMHgwMSwKKwkweDgxLCAweEZGLCAweDFGLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMzLCAweDAwLCAweDNGLAorCTB4RkYsIDB4QzYsIDB4MDEsIDB4OUYsIDB4RkMsIDB4RDMsIDB4MDUsIDB4RjEsIDB4RjUsIDB4NkMsIDB4MTYsCisJMHg5RSwgMHg0MywgMHhERCwgMHhGNiwgMHgxNSwgMHgwMywgMHgxMCwgMHhGRiwgMHgxNywgMHgwMCwgMHgyOCwKKwkweDAwLCAweERGLCAweEZGLCAweDA5LCAweDAwLCAweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRBLCAweEZGLAorCTB4Q0EsIDB4MDEsIDB4NDcsIDB4RkMsIDB4MjgsIDB4MDcsIDB4QjAsIDB4RjEsIDB4RjUsIDB4MkIsIDB4NjAsCisJMHgzNCwgMHg5QSwgMHhGMSwgMHhCQiwgMHgwNiwgMHhCMywgMHhGQywgMHg3RCwgMHgwMSwgMHg3MywgMHhGRiwKKwkweDIyLCAweDAwLCAweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAxLCAweDAwLCAweENGLCAweEZGLCAweEM5LAorCTB4MDAsIDB4REEsIDB4RkQsIDB4MEYsIDB4MDUsIDB4QTUsIDB4RjMsIDB4MzEsIDB4M0UsIDB4OEEsIDB4MUYsCisJMHg5NywgMHhGMywgMHhCRCwgMHgwNiwgMHg0NCwgMHhGQywgMHhFNSwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwKKwkweDAwLCAweEZELCAweEZGLCAweDE1LCAweDAwLCAweEFBLCAweEZGLCAweEIzLCAweDAwLCAweEZBLCAweEZFLAorCTB4MTcsIDB4MDEsIDB4ODYsIDB4RkYsIDB4QUMsIDB4RkQsIDB4MTYsIDB4NDgsIDB4QUEsIDB4MEEsIDB4RUUsCisJMHhGOSwgMHhGRSwgMHgwMywgMHg3QSwgMHhGRCwgMHg2NywgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwKKwkweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUyLCAweEZGLCAweDkyLCAweDAxLCAweDFCLAorCTB4RkQsIDB4QzQsIDB4MDQsIDB4NTEsIDB4RjgsIDB4MTMsIDB4MEYsIDB4QzgsIDB4NDYsIDB4QjYsIDB4RkEsCisJMHgwMSwgMHgwMSwgMHg0NCwgMHgwMCwgMHg2QywgMHhGRiwgMHg3QiwgMHgwMCwgMHhCRiwgMHhGRiwgMHgxMCwKKwkweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM5LCAweEZGLCAweEU1LCAweDAxLCAweDMyLCAweEZDLAorCTB4MDgsIDB4MDcsIDB4QTQsIDB4RjIsIDB4NkQsIDB4MjQsIDB4QUQsIDB4M0EsIDB4ODgsIDB4RjIsIDB4REIsCisJMHgwNSwgMHg1MywgMHhGRCwgMHgxOSwgMHgwMSwgMHhBNywgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDE3LCAweDAwLCAweDkyLCAweEZGLCAweDQxLCAweDAxLCAweDExLCAweEZELCAweDNCLAorCTB4MDYsIDB4MTQsIDB4RjIsIDB4NzgsIDB4MzgsIDB4MzYsIDB4MjcsIDB4MzUsIDB4RjIsIDB4MjAsIDB4MDcsCisJMHgzMywgMHhGQywgMHhERiwgMHgwMSwgMHgzRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwRCwKKwkweDAwLCAweENCLCAweEZGLCAweDVDLCAweDAwLCAweEFDLCAweEZGLCAweEQwLCAweEZGLCAweENELCAweDAxLAorCTB4MzAsIDB4RjksIDB4QzgsIDB4NDUsIDB4QjYsIDB4MTEsIDB4NkIsIDB4RjcsIDB4MkQsIDB4MDUsIDB4RTksCisJMHhGQywgMHhBOCwgMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDI1LCAweDAwLCAweDZELCAweEZGLCAweDRDLCAweDAxLCAweEI2LCAweEZELCAweDg2LCAweDAzLCAweEUxLAorCTB4RkEsIDB4M0QsIDB4MDgsIDB4OTIsIDB4NDgsIDB4OEUsIDB4RkYsIDB4QTEsIDB4RkUsIDB4OTMsIDB4MDEsCisJMHhCOCwgMHhGRSwgMHhEMywgMHgwMCwgMHg5RCwgMHhGRiwgMHgxOCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM3LCAweEZGLCAweEUwLCAweDAxLCAweDU4LCAweEZDLCAweDgyLCAweDA2LCAweDNFLCAweEY0LAorCTB4QkEsIDB4MUMsIDB4MDcsIDB4NDAsIDB4NzksIDB4RjQsIDB4ODQsIDB4MDQsIDB4MzEsIDB4RkUsIDB4OTYsCisJMHgwMCwgMHhFOCwgMHhGRiwgMHhGNywgMHhGRiwgMHgwNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyOCwgMHgwMCwKKwkweDY0LCAweEZGLCAweDlBLCAweDAxLCAweDg4LCAweEZDLCAweEVFLCAweDA2LCAweDdFLCAweEYxLCAweEUzLAorCTB4MzEsIDB4OUYsIDB4MkUsIDB4ODgsIDB4RjEsIDB4MTksIDB4MDcsIDB4NUUsIDB4RkMsIDB4QjcsIDB4MDEsCisJMHg1NCwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwQiwKKwkweDAwLCAweDUxLCAweDAwLCAweEFBLCAweEZFLCAweEMwLCAweDAzLCAweEI4LCAweEY1LCAweDIxLCAweDQyLAorCTB4MzEsIDB4MTksIDB4MjgsIDB4RjUsIDB4MjcsIDB4MDYsIDB4N0MsIDB4RkMsIDB4RDQsIDB4MDEsIDB4M0EsCisJMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4RCwgMHhGRiwgMHhGQSwgMHgwMCwKKwkweDY0LCAweEZFLCAweDMyLCAweDAyLCAweDc4LCAweEZELCAweDFCLCAweDAyLCAweEVBLCAweDQ4LCAweDUwLAorCTB4MDUsIDB4MTQsIDB4RkMsIDB4RUIsIDB4MDIsIDB4MDUsIDB4RkUsIDB4MjcsIDB4MDEsIDB4N0MsIDB4RkYsCisJMHgyMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0MSwgMHhGRiwgMHhCRiwKKwkweDAxLCAweEIyLCAweEZDLCAweEE5LCAweDA1LCAweDU1LCAweEY2LCAweDIwLCAweDE1LCAweDQyLCAweDQ0LAorCTB4NzUsIDB4RjcsIDB4QkYsIDB4MDIsIDB4NDMsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MzYsIDB4MDAsIDB4REEsCisJMHhGRiwgMHgwQSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMiwgMHgwMCwgMHg0NiwgMHhGRiwgMHhEMSwgMHgwMSwKKwkweDNGLCAweEZDLCAweDJCLCAweDA3LCAweENELCAweEYxLCAweEFFLCAweDJBLCAweDg2LCAweDM1LCAweEIxLAorCTB4RjEsIDB4OUQsIDB4MDYsIDB4Q0EsIDB4RkMsIDB4NkUsIDB4MDEsIDB4N0IsIDB4RkYsIDB4MjAsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDMywgMHhGRiwgMHhFMCwgMHgwMCwgMHhCMywKKwkweEZELCAweDRCLCAweDA1LCAweDRELCAweEYzLCAweDQ1LCAweDNELCAweEUwLCAweDIwLCAweDRGLCAweEYzLAorCTB4RDUsIDB4MDYsIDB4M0QsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgxMywgMHgwMCwgMHhBRiwgMHhGRiwgMHhBNCwgMHgwMCwgMHgxOSwgMHhGRiwgMHhERCwgMHgwMCwKKwkweEYwLCAweEZGLCAweEQ0LCAweEZDLCAweEM5LCAweDQ3LCAweEQ4LCAweDBCLCAweDdDLCAweEY5LCAweDM1LAorCTB4MDQsIDB4NUYsIDB4RkQsIDB4NzQsIDB4MDEsIDB4NUUsIDB4RkYsIDB4MjksIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgyQywgMHgwMCwgMHg1NiwgMHhGRiwgMHg4NywgMHgwMSwgMHgzNCwgMHhGRCwgMHg4RiwKKwkweDA0LCAweEMwLCAweEY4LCAweEQ5LCAweDBELCAweDMxLCAweDQ3LCAweDdCLCAweEZCLCAweDlDLCAweDAwLAorCTB4N0QsIDB4MDAsIDB4NEQsIDB4RkYsIDB4OEEsIDB4MDAsIDB4QjksIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzOCwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNSwgMHhGQywgMHhGNywgMHgwNiwKKwkweEUwLCAweEYyLCAweDE4LCAweDIzLCAweEFCLCAweDNCLCAweENDLCAweEYyLCAweEE4LCAweDA1LCAweDc2LAorCTB4RkQsIDB4MDQsIDB4MDEsIDB4QjEsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgxQSwgMHgwMCwgMHg4OSwgMHhGRiwgMHg1MywgMHgwMSwgMHhGNSwgMHhGQywgMHg2MywgMHgwNiwgMHhFOSwKKwkweEYxLCAweDYzLCAweDM3LCAweDg1LCAweDI4LCAweDA5LCAweEYyLCAweDI3LCAweDA3LCAweDM1LCAweEZDLAorCTB4REEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4RDEsCisJMHhGRiwgMHg0RSwgMHgwMCwgMHhDQSwgMHhGRiwgMHg5QSwgMHhGRiwgMHgyQSwgMHgwMiwgMHg4MywgMHhGOCwKKwkweDNGLCAweDQ1LCAweEZCLCAweDEyLCAweDAxLCAweEY3LCAweDVELCAweDA1LCAweEQzLCAweEZDLCAweEIxLAorCTB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsCisJMHg3MywgMHhGRiwgMHgzRiwgMHgwMSwgMHhEMywgMHhGRCwgMHg0QywgMHgwMywgMHg1NCwgMHhGQiwgMHgxRiwKKwkweDA3LCAweEJCLCAweDQ4LCAweDdELCAweDAwLCAweDMzLCAweEZFLCAweENGLCAweDAxLCAweDk4LCAweEZFLAorCTB4RTIsIDB4MDAsIDB4OTcsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsCisJMHhGRiwgMHhEQywgMHgwMSwgMHg2NCwgMHhGQywgMHg2MiwgMHgwNiwgMHg5MywgMHhGNCwgMHg2NiwgMHgxQiwKKwkweEQ5LCAweDQwLCAweEVBLCAweEY0LCAweDNFLCAweDA0LCAweDVELCAweEZFLCAweDdELCAweDAwLCAweEY1LAorCTB4RkYsIDB4RjMsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4NUUsIDB4RkYsCisJMHhBNiwgMHgwMSwgMHg3NiwgMHhGQywgMHgwMSwgMHgwNywgMHg3RCwgMHhGMSwgMHhBRCwgMHgzMCwgMHhEQywKKwkweDJGLCAweDdGLCAweEYxLCAweDBDLCAweDA3LCAweDZDLCAweEZDLCAweEFELCAweDAxLCAweDVBLCAweEZGLAorCTB4MkIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDUsIDB4MDAsIDB4RUYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4NkMsCisJMHgwMCwgMHg3QiwgMHhGRSwgMHgwQywgMHgwNCwgMHgzQSwgMHhGNSwgMHg1RiwgMHg0MSwgMHg4MywgMHgxQSwKKwkweENELCAweEY0LCAweDRCLCAweDA2LCAweDZELCAweEZDLCAweEQ5LCAweDAxLCAweDM5LCAweEZGLCAweDM1LAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OTMsIDB4RkYsIDB4RUMsIDB4MDAsIDB4ODMsIDB4RkUsCisJMHhGNywgMHgwMSwgMHhFOCwgMHhGRCwgMHgyMSwgMHgwMSwgMHhEMiwgMHg0OCwgMHg2NCwgMHgwNiwgMHhBMSwKKwkweEZCLCAweDI2LCAweDAzLCAweEU3LCAweEZELCAweDM1LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4QzUsCisJMHhGQywgMHg3QywgMHgwNSwgMHhCQywgMHhGNiwgMHhENSwgMHgxMywgMHhEQywgMHg0NCwgMHgxNCwgMHhGOCwKKwkweDY3LCAweDAyLCAweDc3LCAweEZGLCAweERELCAweEZGLCAweDQ0LCAweDAwLCAweEQ1LCAweEZGLCAweDBCLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDIsIDB4RkYsIDB4RDcsIDB4MDEsIDB4MzksIDB4RkMsCisJMHgyOSwgMHgwNywgMHhFRiwgMHhGMSwgMHg2MiwgMHgyOSwgMHhBNSwgMHgzNiwgMHhEMCwgMHhGMSwgMHg3QiwKKwkweDA2LCAweEUzLCAweEZDLCAweDVFLCAweDAxLCAweDgzLCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLAorCTB4MDEsIDB4MDAsIDB4MDksIDB4MDAsIDB4QjgsIDB4RkYsIDB4RjYsIDB4MDAsIDB4OEQsIDB4RkQsIDB4ODQsCisJMHgwNSwgMHhGRCwgMHhGMiwgMHg1MiwgMHgzQywgMHgzNSwgMHgyMiwgMHgwQiwgMHhGMywgMHhFQiwgMHgwNiwKKwkweDM3LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDEyLAorCTB4MDAsIDB4QjUsIDB4RkYsIDB4OTQsIDB4MDAsIDB4MzksIDB4RkYsIDB4QTMsIDB4MDAsIDB4NTgsIDB4MDAsCisJMHgwMiwgMHhGQywgMHg3MywgMHg0NywgMHgwQiwgMHgwRCwgMHgwQiwgMHhGOSwgMHg2QywgMHgwNCwgMHg0NSwKKwkweEZELCAweDgwLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MkEsIDB4MDAsIDB4NUIsIDB4RkYsIDB4N0MsIDB4MDEsIDB4NEUsIDB4RkQsIDB4NUEsIDB4MDQsIDB4MzEsCisJMHhGOSwgMHhBNCwgMHgwQywgMHg5MCwgMHg0NywgMHg0NywgMHhGQywgMHgzNiwgMHgwMCwgMHhCNiwgMHgwMCwKKwkweDJFLCAweEZGLCAweDk5LCAweDAwLCAweEIzLCAweEZGLCAweDEyLCAweDAwLCAweEZELCAweEZGLCAweDM2LAorCTB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzksIDB4RkMsIDB4RTQsIDB4MDYsIDB4MjEsIDB4RjMsCisJMHhDNCwgMHgyMSwgMHhBNSwgMHgzQywgMHgxNiwgMHhGMywgMHg3MiwgMHgwNSwgMHg5QSwgMHhGRCwgMHhFRiwKKwkweDAwLCAweEJDLCAweEZGLCAweDA4LCAweDAwLCAweDAxLCAweDAwLCAweEZFLCAweEZGLCAweDFFLCAweDAwLAorCTB4ODAsIDB4RkYsIDB4NjQsIDB4MDEsIDB4REEsIDB4RkMsIDB4ODcsIDB4MDYsIDB4QzUsIDB4RjEsIDB4NDYsCisJMHgzNiwgMHhEMSwgMHgyOSwgMHhFMywgMHhGMSwgMHgyQSwgMHgwNywgMHgzQSwgMHhGQywgMHhENSwgMHgwMSwKKwkweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDBBLCAweDAwLCAweEQ2LCAweEZGLCAweDNGLAorCTB4MDAsIDB4RTcsIDB4RkYsIDB4NjUsIDB4RkYsIDB4ODUsIDB4MDIsIDB4REUsIDB4RjcsIDB4QTksIDB4NDQsCisJMHg0MywgMHgxNCwgMHg5OSwgMHhGNiwgMHg4QiwgMHgwNSwgMHhCRiwgMHhGQywgMHhCQSwgMHgwMSwgMHg0MywKKwkweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc4LCAweEZGLAorCTB4MzEsIDB4MDEsIDB4RjEsIDB4RkQsIDB4MTIsIDB4MDMsIDB4QzcsIDB4RkIsIDB4MDcsIDB4MDYsIDB4REIsCisJMHg0OCwgMHg3MywgMHgwMSwgMHhDMywgMHhGRCwgMHgwQSwgMHgwMiwgMHg3OSwgMHhGRSwgMHhGMSwgMHgwMCwKKwkweDkxLCAweEZGLCAweDFCLCAweDAwLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ3LAorCTB4MDEsIDB4NzIsIDB4RkMsIDB4M0YsIDB4MDYsIDB4RUIsIDB4RjQsIDB4MTIsIDB4MUEsIDB4QTEsIDB4NDEsCisJMHg2MywgMHhGNSwgMHhGMywgMHgwMywgMHg4QSwgMHhGRSwgMHg2MywgMHgwMCwgMHgwMiwgMHgwMCwgMHhFRSwKKwkweEZGLCAweDA2LCAweDAwLCAweEZELCAweEZGLCAweDJDLCAweDAwLCAweDU4LCAweEZGLCAweEIxLCAweDAxLAorCTB4NjcsIDB4RkMsIDB4MTAsIDB4MDcsIDB4ODEsIDB4RjEsIDB4NzMsIDB4MkYsIDB4MTUsIDB4MzEsIDB4N0MsCisJMHhGMSwgMHhGQiwgMHgwNiwgMHg3QywgMHhGQywgMHhBMiwgMHgwMSwgMHg2MCwgMHhGRiwgMHgyOSwgMHgwMCwKKwkweEZELCAweEZGLCAweDA0LCAweDAwLCAweEY0LCAweEZGLCAweEYxLCAweEZGLCAweDg1LCAweDAwLCAweDRFLAorCTB4RkUsIDB4NTYsIDB4MDQsIDB4QzMsIDB4RjQsIDB4OTUsIDB4NDAsIDB4RDgsIDB4MUIsIDB4NzYsIDB4RjQsCisJMHg2RCwgMHgwNiwgMHg2MCwgMHhGQywgMHhERCwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDE5LCAweDAwLCAweDk5LCAweEZGLCAweERELCAweDAwLCAweEEzLCAweEZFLCAweEJCLCAweDAxLAorCTB4NTgsIDB4RkUsIDB4MkQsIDB4MDAsIDB4QUYsIDB4NDgsIDB4N0UsIDB4MDcsIDB4MkUsIDB4RkIsIDB4NjAsCisJMHgwMywgMHhDOSwgMHhGRCwgMHg0MywgMHgwMSwgMHg3MSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ4LCAweEZGLCAweEFFLCAweDAxLCAweERCLCAweEZDLCAweDRELAorCTB4MDUsIDB4MjQsIDB4RjcsIDB4OEUsIDB4MTIsIDB4NkQsIDB4NDUsIDB4QkMsIDB4RjgsIDB4MEMsIDB4MDIsCisJMHhBQywgMHhGRiwgMHhDMCwgMHhGRiwgMHg1MiwgMHgwMCwgMHhDRiwgMHhGRiwgMHgwQywgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM0LCAweDAwLCAweDNGLCAweEZGLCAweERDLCAweDAxLCAweDM0LCAweEZDLCAweDI1LCAweDA3LAorCTB4MTgsIDB4RjIsIDB4MTUsIDB4MjgsIDB4QkYsIDB4MzcsIDB4RjcsIDB4RjEsIDB4NTYsIDB4MDYsIDB4RkUsCisJMHhGQywgMHg0RCwgMHgwMSwgMHg4QywgMHhGRiwgMHgxOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDBELCAweDAwLCAweEFFLCAweEZGLCAweDBCLCAweDAxLCAweDZBLCAweEZELCAweEJBLCAweDA1LCAweEI0LAorCTB4RjIsIDB4NTgsIDB4M0IsIDB4OEEsIDB4MjMsIDB4Q0IsIDB4RjIsIDB4RkQsIDB4MDYsIDB4MzQsIDB4RkMsCisJMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCQiwKKwkweEZGLCAweDg1LCAweDAwLCAweDU4LCAweEZGLCAweDZBLCAweDAwLCAweEJFLCAweDAwLCAweDM4LCAweEZCLAorCTB4MEYsIDB4NDcsIDB4NDIsIDB4MEUsIDB4OUIsIDB4RjgsIDB4QTEsIDB4MDQsIDB4MkIsIDB4RkQsIDB4OEIsCisJMHgwMSwgMHg1NSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwKKwkweDVGLCAweEZGLCAweDcwLCAweDAxLCAweDY4LCAweEZELCAweDIzLCAweDA0LCAweEEyLCAweEY5LCAweDczLAorCTB4MEIsIDB4RTQsIDB4NDcsIDB4MUIsIDB4RkQsIDB4Q0QsIDB4RkYsIDB4RjAsIDB4MDAsIDB4MEYsIDB4RkYsCisJMHhBOSwgMHgwMCwgMHhBRSwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwKKwkweEZGLCAweEU2LCAweDAxLCAweDNGLCAweEZDLCAweENFLCAweDA2LCAweDY2LCAweEYzLCAweDZGLCAweDIwLAorCTB4OTYsIDB4M0QsIDB4NjksIDB4RjMsIDB4MzgsIDB4MDUsIDB4QkYsIDB4RkQsIDB4RDksIDB4MDAsIDB4QzcsCisJMHhGRiwgMHgwNCwgMHgwMCwgMHgwMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMCwgMHgwMCwgMHg3OCwgMHhGRiwKKwkweDc0LCAweDAxLCAweEMyLCAweEZDLCAweEE3LCAweDA2LCAweEE4LCAweEYxLCAweDI1LCAweDM1LCAweDFCLAorCTB4MkIsIDB4QzIsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDEsIDB4RkMsIDB4Q0UsIDB4MDEsIDB4NDcsIDB4RkYsCisJMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwOSwgMHgwMCwgMHhEQywgMHhGRiwgMHgzMSwgMHgwMCwgMHgwNCwKKwkweDAwLCAweDMyLCAweEZGLCAweERDLCAweDAyLCAweDQyLCAweEY3LCAweDBCLCAweDQ0LCAweDhFLCAweDE1LAorCTB4MzQsIDB4RjYsIDB4QjcsIDB4MDUsIDB4QUIsIDB4RkMsIDB4QzEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RSwgMHhGRiwgMHgyMywgMHgwMSwKKwkweDBGLCAweEZFLCAweEQ3LCAweDAyLCAweDNCLCAweEZDLCAweEY1LCAweDA0LCAweEVELCAweDQ4LCAweDcwLAorCTB4MDIsIDB4NTIsIDB4RkQsIDB4NDYsIDB4MDIsIDB4NUEsIDB4RkUsIDB4RkYsIDB4MDAsIDB4OEIsIDB4RkYsCisJMHgxQywgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMiwgMHgwMSwgMHg4MSwKKwkweEZDLCAweDFBLCAweDA2LCAweDQ3LCAweEY1LCAweEMxLCAweDE4LCAweDYwLCAweDQyLCAweEU0LCAweEY1LAorCTB4QTYsIDB4MDMsIDB4QjksIDB4RkUsIDB4NDgsIDB4MDAsIDB4MEYsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDcsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MywgMHhGRiwgMHhCQiwgMHgwMSwgMHg1QSwgMHhGQywKKwkweDFDLCAweDA3LCAweDhELCAweEYxLCAweDM0LCAweDJFLCAweDQ4LCAweDMyLCAweDgxLCAweEYxLCAweEU3LAorCTB4MDYsIDB4OEUsIDB4RkMsIDB4OTYsIDB4MDEsIDB4NjYsIDB4RkYsIDB4MjcsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgwNCwgMHgwMCwgMHhGOSwgMHhGRiwgMHhFNCwgMHhGRiwgMHg5RiwgMHgwMCwgMHgyMywgMHhGRSwgMHg5QiwKKwkweDA0LCAweDU1LCAweEY0LCAweEMwLCAweDNGLCAweDJDLCAweDFELCAweDIyLCAweEY0LCAweDhDLCAweDA2LAorCTB4NTUsIDB4RkMsIDB4RTEsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTcsCisJMHgwMCwgMHg5RiwgMHhGRiwgMHhDRSwgMHgwMCwgMHhDMiwgMHhGRSwgMHg4MCwgMHgwMSwgMHhDNiwgMHhGRSwKKwkweDQwLCAweEZGLCAweDgxLCAweDQ4LCAweDlFLCAweDA4LCAweEJBLCAweEZBLCAweDlBLCAweDAzLCAweEFDLAorCTB4RkQsIDB4NTEsIDB4MDEsIDB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgyRiwgMHgwMCwgMHg0QiwgMHhGRiwgMHhBNCwgMHgwMSwgMHhGMSwgMHhGQywgMHgxRCwgMHgwNSwgMHg4RiwKKwkweEY3LCAweDRBLCAweDExLCAweEYyLCAweDQ1LCAweDZCLCAweEY5LCAweEFFLCAweDAxLCAweEUyLCAweEZGLAorCTB4QTIsIDB4RkYsIDB4NjEsIDB4MDAsIDB4QzksIDB4RkYsIDB4MEQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsCisJMHgwMCwgMHgzRCwgMHhGRiwgMHhFMCwgMHgwMSwgMHgzMiwgMHhGQywgMHgxRCwgMHgwNywgMHg0NSwgMHhGMiwKKwkweEM2LCAweDI2LCAweEQzLCAweDM4LCAweDI0LCAweEYyLCAweDJELCAweDA2LCAweDFCLCAweEZELCAweDNCLAorCTB4MDEsIDB4OTUsIDB4RkYsIDB4MTYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCisJMHhBMywgMHhGRiwgMHgyMCwgMHgwMSwgMHg0OSwgMHhGRCwgMHhFQiwgMHgwNSwgMHg3NCwgMHhGMiwgMHg1NCwKKwkweDNBLCAweERELCAweDI0LCAweDkxLCAweEYyLCAweDBDLCAweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLAorCTB4M0EsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4QzEsIDB4RkYsIDB4NzYsCisJMHgwMCwgMHg3NiwgMHhGRiwgMHgzMiwgMHgwMCwgMHgyMiwgMHgwMSwgMHg3NiwgMHhGQSwgMHhBMywgMHg0NiwKKwkweDdELCAweDBGLCAweDJDLCAweEY4LCAweEQ1LCAweDA0LCAweDEzLCAweEZELCAweDk2LCAweDAxLCAweDUxLAorCTB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjQsIDB4RkYsCisJMHg2MywgMHgwMSwgMHg4NCwgMHhGRCwgMHhFQiwgMHgwMywgMHgxNCwgMHhGQSwgMHg0NywgMHgwQSwgMHgyQywKKwkweDQ4LCAweEY2LCAweEZELCAweDYzLCAweEZGLCAweDJCLCAweDAxLCAweEYwLCAweEZFLCAweEI4LCAweDAwLAorCTB4QTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTQsCisJMHgwMSwgMHg0NywgMHhGQywgMHhCNSwgMHgwNiwgMHhCMCwgMHhGMywgMHgxOSwgMHgxRiwgMHg3RSwgMHgzRSwKKwkweEM0LCAweEYzLCAweEZBLCAweDA0LCAweEU3LCAweEZELCAweEMxLCAweDAwLCAweEQzLCAweEZGLCAweEZGLAorCTB4RkYsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjMsIDB4MDAsIDB4NzEsIDB4RkYsIDB4ODIsIDB4MDEsCisJMHhBQiwgMHhGQywgMHhDNCwgMHgwNiwgMHg5MywgMHhGMSwgMHhGRCwgMHgzMywgMHg2MiwgMHgyQywgMHhBOCwKKwkweEYxLCAweDI3LCAweDA3LCAweDRBLCAweEZDLCAweEM3LCAweDAxLCAweDRDLCAweEZGLCAweDMwLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsCisJMHhGRiwgMHgzMSwgMHgwMywgMHhBRCwgMHhGNiwgMHg2NSwgMHg0MywgMHhEQywgMHgxNiwgMHhEMSwgMHhGNSwKKwkweEUxLCAweDA1LCAweDk5LCAweEZDLCAweEM5LCAweDAxLCAweDNFLCAweEZGLCAweDMzLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODMsIDB4RkYsIDB4MTQsIDB4MDEsIDB4MkQsIDB4RkUsCisJMHg5QywgMHgwMiwgMHhBRCwgMHhGQywgMHhFOSwgMHgwMywgMHhGNiwgMHg0OCwgMHg3MywgMHgwMywgMHhFMCwKKwkweEZDLCAweDgyLCAweDAyLCAweDNCLCAweEZFLCAweDBFLCAweDAxLCAweDg2LCAweEZGLCAweDFFLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0QsIDB4RkYsIDB4Q0MsIDB4MDEsIDB4OTEsIDB4RkMsIDB4RjMsCisJMHgwNSwgMHhBNiwgMHhGNSwgMHg3MCwgMHgxNywgMHgxNywgMHg0MywgMHg2RCwgMHhGNiwgMHg1NiwgMHgwMywKKwkweEVBLCAweEZFLCAweDJELCAweDAwLCAweDFELCAweDAwLCAweEU0LCAweEZGLCAweDA4LCAweDAwLCAweEZELAorCTB4RkYsIDB4MkYsIDB4MDAsIDB4NEUsIDB4RkYsIDB4QzMsIDB4MDEsIDB4NEUsIDB4RkMsIDB4MjQsIDB4MDcsCisJMHg5RSwgMHhGMSwgMHhGMiwgMHgyQywgMHg3OCwgMHgzMywgMHg4QywgMHhGMSwgMHhEMCwgMHgwNiwgMHhBMiwKKwkweEZDLCAweDg4LCAweDAxLCAweDZELCAweEZGLCAweDI0LCAweDAwLCAweEZELCAweEZGLCAweDAzLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4RDgsIDB4RkYsIDB4QjcsIDB4MDAsIDB4RjksIDB4RkQsIDB4REUsIDB4MDQsIDB4RUYsCisJMHhGMywgMHhFNCwgMHgzRSwgMHg4MSwgMHgxRSwgMHhEMiwgMHhGMywgMHhBOSwgMHgwNiwgMHg0QiwgMHhGQywKKwkweEUzLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDE2LCAweDAwLCAweEE1LAorCTB4RkYsIDB4QkUsIDB4MDAsIDB4RTIsIDB4RkUsIDB4NDUsIDB4MDEsIDB4MzMsIDB4RkYsIDB4NUEsIDB4RkUsCisJMHg0OCwgMHg0OCwgMHhDMywgMHgwOSwgMHg0NywgMHhGQSwgMHhEMiwgMHgwMywgMHg5MCwgMHhGRCwgMHg1RSwKKwkweDAxLCAweDY2LCAweEZGLCAweDI3LCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLAorCTB4NEYsIDB4RkYsIDB4OUEsIDB4MDEsIDB4MDgsIDB4RkQsIDB4RUIsIDB4MDQsIDB4RkMsIDB4RjcsIDB4MEEsCisJMHgxMCwgMHg3MCwgMHg0NiwgMHgyMiwgMHhGQSwgMHg0RCwgMHgwMSwgMHgxOSwgMHgwMCwgMHg4NCwgMHhGRiwKKwkweDcwLCAweDAwLCAweEM0LCAweEZGLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNCLAorCTB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsIDB4MTIsIDB4MDcsIDB4NzksIDB4RjIsIDB4NzMsIDB4MjUsCisJMHhERiwgMHgzOSwgMHg1QSwgMHhGMiwgMHgwMCwgMHgwNiwgMHgzQSwgMHhGRCwgMHgyOCwgMHgwMSwgMHg5RiwKKwkweEZGLCAweDEzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDE1LCAweDAwLCAweDk5LCAweEZGLAorCTB4MzMsIDB4MDEsIDB4MjksIDB4RkQsIDB4MUEsIDB4MDYsIDB4M0IsIDB4RjIsIDB4NEIsIDB4MzksIDB4MzAsCisJMHgyNiwgMHg1QiwgMHhGMiwgMHgxOSwgMHgwNywgMHgzMSwgMHhGQywgMHhFMSwgMHgwMSwgMHgzQywgMHhGRiwKKwkweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBFLCAweDAwLCAweEM3LCAweEZGLCAweDY4LCAweDAwLCAweDk1LAorCTB4RkYsIDB4RkEsIDB4RkYsIDB4ODMsIDB4MDEsIDB4QkIsIDB4RjksIDB4MkIsIDB4NDYsIDB4QkIsIDB4MTAsCisJMHhCRiwgMHhGNywgMHgwNywgMHgwNSwgMHhGQiwgMHhGQywgMHhBMCwgMHgwMSwgMHg0RCwgMHhGRiwgMHgyRiwKKwkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY5LCAweEZGLCAweDU2LCAweDAxLAorCTB4QTAsIDB4RkQsIDB4QjMsIDB4MDMsIDB4ODcsIDB4RkEsIDB4MUYsIDB4MDksIDB4NkEsIDB4NDgsIDB4RDksCisJMHhGRSwgMHhGNiwgMHhGRSwgMHg2NSwgMHgwMSwgMHhEMCwgMHhGRSwgMHhDNywgMHgwMCwgMHhBMiwgMHhGRiwKKwkweDE3LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUyLCAweDAxLCAweDUwLAorCTB4RkMsIDB4OTksIDB4MDYsIDB4RkUsIDB4RjMsIDB4QzMsIDB4MUQsIDB4NUUsIDB4M0YsIDB4MjcsIDB4RjQsCisJMHhCOSwgMHgwNCwgMHgxMCwgMHhGRSwgMHhBOSwgMHgwMCwgMHhERiwgMHhGRiwgMHhGQiwgMHhGRiwgMHgwMywKKwkweDAwLCAweEZELCAweEZGLCAweDI2LCAweDAwLCAweDY5LCAweEZGLCAweDkwLCAweDAxLCAweDk2LCAweEZDLAorCTB4REQsIDB4MDYsIDB4ODUsIDB4RjEsIDB4RDAsIDB4MzIsIDB4QTYsIDB4MkQsIDB4OTQsIDB4RjEsIDB4MjAsCisJMHgwNywgMHg1NCwgMHhGQywgMHhCRiwgMHgwMSwgMHg1MCwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDA3LCAweDAwLCAweEU2LCAweEZGLCAweDE1LCAweDAwLCAweDNDLCAweDAwLCAweENGLCAweEZFLCAweDgzLAorCTB4MDMsIDB4MjAsIDB4RjYsIDB4QjIsIDB4NDIsIDB4MkIsIDB4MTgsIDB4NzEsIDB4RjUsIDB4MDksIDB4MDYsCisJMHg4OCwgMHhGQywgMHhDRiwgMHgwMSwgMHgzQywgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRCwKKwkweDAwLCAweDg5LCAweEZGLCAweDA2LCAweDAxLCAweDRDLCAweEZFLCAweDYwLCAweDAyLCAweDFGLCAweEZELAorCTB4RTIsIDB4MDIsIDB4RjMsIDB4NDgsIDB4N0QsIDB4MDQsIDB4NkUsIDB4RkMsIDB4QkQsIDB4MDIsIDB4MUMsCisJMHhGRSwgMHgxQywgMHgwMSwgMHg4MCwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDMzLCAweDAwLCAweDNGLCAweEZGLCAweEM1LCAweDAxLCAweEEzLCAweEZDLCAweENBLCAweDA1LCAweDA3LAorCTB4RjYsIDB4MjIsIDB4MTYsIDB4QzMsIDB4NDMsIDB4RkUsIDB4RjYsIDB4MDIsIDB4MDMsIDB4MUIsIDB4RkYsCisJMHgxMSwgMHgwMCwgMHgyQiwgMHgwMCwgMHhERSwgMHhGRiwgMHgwOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMSwKKwkweDAwLCAweDQ5LCAweEZGLCAweENCLCAweDAxLCAweDQ1LCAweEZDLCAweDI5LCAweDA3LCAweEI2LCAweEYxLAorCTB4QUQsIDB4MkIsIDB4QTIsIDB4MzQsIDB4OUUsIDB4RjEsIDB4QjQsIDB4MDYsIDB4QjgsIDB4RkMsIDB4N0EsCisJMHgwMSwgMHg3NSwgMHhGRiwgMHgyMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweENDLCAweEZGLCAweENFLCAweDAwLCAweEQxLCAweEZELCAweDFELCAweDA1LCAweDkxLCAweEYzLCAweEZFLAorCTB4M0QsIDB4RDcsIDB4MUYsIDB4ODcsIDB4RjMsIDB4QzMsIDB4MDYsIDB4NDIsIDB4RkMsIDB4RTUsIDB4MDEsCisJMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhBQiwgMHhGRiwgMHhBRiwKKwkweDAwLCAweDAxLCAweEZGLCAweDBBLCAweDAxLCAweDlFLCAweEZGLCAweDdDLCAweEZELCAweDAzLCAweDQ4LAorCTB4RUQsIDB4MEEsIDB4RDUsIDB4RjksIDB4MEEsIDB4MDQsIDB4NzQsIDB4RkQsIDB4NkEsIDB4MDEsIDB4NjIsCisJMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywgMHhGRiwKKwkweDkwLCAweDAxLCAweDIwLCAweEZELCAweEI4LCAweDA0LCAweDZBLCAweEY4LCAweENELCAweDBFLCAweEUxLAorCTB4NDYsIDB4RTEsIDB4RkEsIDB4RUIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4NjUsIDB4RkYsIDB4N0YsIDB4MDAsCisJMHhCRSwgMHhGRiwgMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwKKwkweDAxLCAweDMzLCAweEZDLCAweDA0LCAweDA3LCAweEIxLCAweEYyLCAweDIxLCAweDI0LCAweEU2LCAweDNBLAorCTB4OTcsIDB4RjIsIDB4RDAsIDB4MDUsIDB4NUIsIDB4RkQsIDB4MTUsIDB4MDEsIDB4QTksIDB4RkYsIDB4MEYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOCwgMHgwMCwgMHg5MCwgMHhGRiwgMHg0NSwgMHgwMSwKKwkweDBCLCAweEZELCAweDQ0LCAweDA2LCAweDBBLCAweEYyLCAweDNCLCAweDM4LCAweDgwLCAweDI3LCAweDJCLAorCTB4RjIsIDB4MjIsIDB4MDcsIDB4MzMsIDB4RkMsIDB4REUsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwRCwgMHgwMCwgMHhDRCwgMHhGRiwgMHg1OSwgMHgwMCwgMHhCMywgMHhGRiwgMHhDNCwKKwkweEZGLCAweEUyLCAweDAxLCAweDA5LCAweEY5LCAweEFBLCAweDQ1LCAweEZFLCAweDExLCAweDU0LCAweEY3LAorCTB4MzgsIDB4MDUsIDB4RTQsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NDksIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHhCQywgMHhGRCwKKwkweDdBLCAweDAzLCAweEZBLCAweEZBLCAweEZELCAweDA3LCAweDlDLCAweDQ4LCAweEMzLCAweEZGLCAweDg5LAorCTB4RkUsIDB4QTEsIDB4MDEsIDB4QjEsIDB4RkUsIDB4RDYsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MTgsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhERiwgMHgwMSwgMHg1QiwgMHhGQywgMHg3QiwKKwkweDA2LCAweDUwLCAweEY0LCAweDZFLCAweDFDLCAweDM2LCAweDQwLCAweDkyLCAweEY0LCAweDc1LCAweDA0LAorCTB4M0IsIDB4RkUsIDB4OTEsIDB4MDAsIDB4RUIsIDB4RkYsIDB4RjYsIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg5RCwgMHgwMSwgMHg4NCwgMHhGQywgMHhGMywgMHgwNiwKKwkweDdELCAweEYxLCAweDlFLCAweDMxLCAweEU2LCAweDJFLCAweDg1LCAweEYxLCAweDE2LCAweDA3LCAweDYxLAorCTB4RkMsIDB4QjUsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDYsIDB4MDAsCisJMHhFQywgMHhGRiwgMHgwOCwgMHgwMCwgMHg1NywgMHgwMCwgMHg5RiwgMHhGRSwgMHhEMSwgMHgwMywgMHg5QiwKKwkweEY1LCAweEY3LCAweDQxLCAweDdDLCAweDE5LCAweDEzLCAweEY1LCAweDJGLCAweDA2LCAweDc4LCAweEZDLAorCTB4RDUsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MUMsIDB4MDAsIDB4OEYsCisJMHhGRiwgMHhGNywgMHgwMCwgMHg2QiwgMHhGRSwgMHgyNSwgMHgwMiwgMHg5MSwgMHhGRCwgMHhFMywgMHgwMSwKKwkweEU1LCAweDQ4LCAweDhELCAweDA1LCAweEZCLCAweEZCLCAweEY4LCAweDAyLCAweEZFLCAweEZELCAweDJCLAorCTB4MDEsIDB4N0EsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsCisJMHg0MiwgMHhGRiwgMHhCRCwgMHgwMSwgMHhCNiwgMHhGQywgMHg5RiwgMHgwNSwgMHg2QywgMHhGNiwgMHhENiwKKwkweDE0LCAweDY1LCAweDQ0LCAweDk4LCAweEY3LCAweEFDLCAweDAyLCAweDRFLCAweEZGLCAweEY0LCAweEZGLAorCTB4MzksIDB4MDAsIDB4RDksIDB4RkYsIDB4MEEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDUsCisJMHhGRiwgMHhEMiwgMHgwMSwgMHgzRCwgMHhGQywgMHgyQiwgMHgwNywgMHhENCwgMHhGMSwgMHg2NCwgMHgyQSwKKwkweEM2LCAweDM1LCAweEI3LCAweEYxLCAweDk2LCAweDA2LCAweENGLCAweEZDLCAweDZCLCAweDAxLCAweDdELAorCTB4RkYsIDB4MUYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzEsIDB4RkYsCisJMHhFNSwgMHgwMCwgMHhBQSwgMHhGRCwgMHg1OCwgMHgwNSwgMHgzQSwgMHhGMywgMHgxMSwgMHgzRCwgMHgyQywKKwkweDIxLCAweDNGLCAweEYzLCAweERBLCAweDA2LCAweDNCLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4QTAsIDB4MDAsIDB4MjAsCisJMHhGRiwgMHhEMCwgMHgwMCwgMHgwNywgMHgwMCwgMHhBNCwgMHhGQywgMHhCNiwgMHg0NywgMHgxQywgMHgwQywKKwkweDYzLCAweEY5LCAweDQyLCAweDA0LCAweDU5LCAweEZELCAweDc2LCAweDAxLCAweDVELCAweEZGLCAweDJBLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTcsIDB4RkYsIDB4ODUsIDB4MDEsCisJMHgzOSwgMHhGRCwgMHg4NCwgMHgwNCwgMHhEOSwgMHhGOCwgMHg5NSwgMHgwRCwgMHg0OCwgMHg0NywgMHhBNywKKwkweEZCLCAweDg2LCAweDAwLCAweDhBLCAweDAwLCAweDQ2LCAweEZGLCAweDhFLCAweDAwLCAweEI4LCAweEZGLAorCTB4MTEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsCisJMHhGQywgMHhGMywgMHgwNiwgMHhFRSwgMHhGMiwgMHhDRCwgMHgyMiwgMHhFNCwgMHgzQiwgMHhEQywgMHhGMiwKKwkweDlDLCAweDA1LCAweDdFLCAweEZELCAweDAwLCAweDAxLCAweEI0LCAweEZGLCAweDBCLCAweDAwLCAweDAxLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4ODcsIDB4RkYsIDB4NTcsIDB4MDEsIDB4RUYsIDB4RkMsCisJMHg2QiwgMHgwNiwgMHhFMCwgMHhGMSwgMHgyMywgMHgzNywgMHhDRSwgMHgyOCwgMHgwMSwgMHhGMiwgMHgyOCwKKwkweDA3LCAweDM2LCAweEZDLCAweEQ5LCAweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLAorCTB4MEIsIDB4MDAsIDB4RDIsIDB4RkYsIDB4NEEsIDB4MDAsIDB4RDAsIDB4RkYsIDB4OEUsIDB4RkYsIDB4M0YsCisJMHgwMiwgMHg1RSwgMHhGOCwgMHgxRSwgMHg0NSwgMHg0NCwgMHgxMywgMHhFQSwgMHhGNiwgMHg2NywgMHgwNSwKKwkweENGLCAweEZDLCAweEIzLCAweDAxLCAweDQ2LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAorCTB4MDAsIDB4MjMsIDB4MDAsIDB4NzQsIDB4RkYsIDB4M0MsIDB4MDEsIDB4REEsIDB4RkQsIDB4NDAsIDB4MDMsCisJMHg2RSwgMHhGQiwgMHhFMSwgMHgwNiwgMHhDMywgMHg0OCwgMHhCMywgMHgwMCwgMHgxQSwgMHhGRSwgMHhEQywKKwkweDAxLCAweDkxLCAweEZFLCAweEU1LCAweDAwLCAweDk2LCAweEZGLCAweDFBLCAweDAwLCAweEZFLCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4REIsIDB4MDEsIDB4NjcsIDB4RkMsIDB4NUEsIDB4MDYsIDB4QTYsCisJMHhGNCwgMHgxQiwgMHgxQiwgMHgwNywgMHg0MSwgMHgwNCwgMHhGNSwgMHgyRCwgMHgwNCwgMHg2NywgMHhGRSwKKwkweDc3LCAweDAwLCAweEY4LCAweEZGLCAweEYyLCAweEZGLCAweDA1LCAweDAwLCAweEZELCAweEZGLCAweDJBLAorCTB4MDAsIDB4NUMsIDB4RkYsIDB4QTgsIDB4MDEsIDB4NzMsIDB4RkMsIDB4MDUsIDB4MDcsIDB4N0QsIDB4RjEsCisJMHg2NywgMHgzMCwgMHgyMSwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwOCwgMHgwNywgMHg2RiwgMHhGQywgMHhBQiwKKwkweDAxLCAweDVCLCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweDA1LCAweDAwLCAweEYwLCAweEZGLAorCTB4RkIsIDB4RkYsIDB4NzEsIDB4MDAsIDB4NzEsIDB4RkUsIDB4MUQsIDB4MDQsIDB4MUYsIDB4RjUsIDB4MzIsCisJMHg0MSwgMHhDRSwgMHgxQSwgMHhCQSwgMHhGNCwgMHg1MywgMHgwNiwgMHg2QSwgMHhGQywgMHhEQSwgMHgwMSwKKwkweDM4LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweDFBLCAweDAwLCAweDk1LCAweEZGLCAweEU4LAorCTB4MDAsIDB4OEEsIDB4RkUsIDB4RTksIDB4MDEsIDB4MDEsIDB4RkUsIDB4RUEsIDB4MDAsIDB4Q0IsIDB4NDgsCisJMHhBMiwgMHgwNiwgMHg4NywgMHhGQiwgMHgzMywgMHgwMywgMHhFMCwgMHhGRCwgMHgzOSwgMHgwMSwgMHg3NSwKKwkweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ1LCAweEZGLAorCTB4QjUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4NzIsIDB4MDUsIDB4RDMsIDB4RjYsIDB4OEQsIDB4MTMsIDB4RkQsCisJMHg0NCwgMHgzOSwgMHhGOCwgMHg1MywgMHgwMiwgMHg4MiwgMHhGRiwgMHhENywgMHhGRiwgMHg0NywgMHgwMCwKKwkweEQzLCAweEZGLCAweDBCLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQyLCAweEZGLCAweEQ4LAorCTB4MDEsIDB4MzcsIDB4RkMsIDB4MjksIDB4MDcsIDB4RjgsIDB4RjEsIDB4MTksIDB4MjksIDB4RTUsIDB4MzYsCisJMHhEOCwgMHhGMSwgMHg3MywgMHgwNiwgMHhFOSwgMHhGQywgMHg1QiwgMHgwMSwgMHg4NSwgMHhGRiwgMHgxQywKKwkweDAwLCAweEZFLCAweEZGLCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweEI2LCAweEZGLCAweEZCLCAweDAwLAorCTB4ODUsIDB4RkQsIDB4OTAsIDB4MDUsIDB4RUMsIDB4RjIsIDB4MUMsIDB4M0MsIDB4ODEsIDB4MjIsIDB4RkMsCisJMHhGMiwgMHhFRiwgMHgwNiwgMHgzNiwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwKKwkweEZELCAweEZGLCAweDEyLCAweDAwLCAweEI3LCAweEZGLCAweDkxLCAweDAwLCAweDQwLCAweEZGLCAweDk2LAorCTB4MDAsIDB4NkYsIDB4MDAsIDB4RDUsIDB4RkIsIDB4NUUsIDB4NDcsIDB4NTAsIDB4MEQsIDB4RjIsIDB4RjgsCisJMHg3OCwgMHgwNCwgMHgzRiwgMHhGRCwgMHg4MiwgMHgwMSwgMHg1OCwgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVDLCAweEZGLCAweDc5LCAweDAxLCAweDUzLCAweEZELAorCTB4NEUsIDB4MDQsIDB4NEEsIDB4RjksIDB4NjAsIDB4MEMsIDB4QTMsIDB4NDcsIDB4NzYsIDB4RkMsIDB4MUYsCisJMHgwMCwgMHhDMywgMHgwMCwgMHgyNywgMHhGRiwgMHg5RCwgMHgwMCwgMHhCMiwgMHhGRiwgMHgxMywgMHgwMCwKKwkweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDNBLCAweEZDLCAweERGLAorCTB4MDYsIDB4MzAsIDB4RjMsIDB4NzgsIDB4MjEsIDB4REIsIDB4M0MsIDB4MjgsIDB4RjMsIDB4NjUsIDB4MDUsCisJMHhBMiwgMHhGRCwgMHhFQSwgMHgwMCwgMHhCRSwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDFFLCAweDAwLCAweDdGLCAweEZGLCAweDY3LCAweDAxLCAweEQ1LCAweEZDLCAweDhFLCAweDA2LAorCTB4QkUsIDB4RjEsIDB4MDYsIDB4MzYsIDB4MUEsIDB4MkEsIDB4REMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0MsCisJMHhGQywgMHhEMywgMHgwMSwgMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwQSwgMHgwMCwKKwkweEQ4LCAweEZGLCAweDNDLCAweDAwLCAweEVFLCAweEZGLCAweDVBLCAweEZGLCAweDk4LCAweDAyLCAweEJCLAorCTB4RjcsIDB4ODcsIDB4NDQsIDB4OEMsIDB4MTQsIDB4ODMsIDB4RjYsIDB4OTUsIDB4MDUsIDB4QkEsIDB4RkMsCisJMHhCQiwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwKKwkweDAwLCAweDc5LCAweEZGLCAweDJFLCAweDAxLCAweEY3LCAweEZELCAweDA1LCAweDAzLCAweEUxLCAweEZCLAorCTB4Q0EsIDB4MDUsIDB4REYsIDB4NDgsIDB4QUIsIDB4MDEsIDB4QUEsIDB4RkQsIDB4MTgsIDB4MDIsIDB4NzIsCisJMHhGRSwgMHhGNCwgMHgwMCwgMHg5MCwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKKwkweDM5LCAweEZGLCAweEQ2LCAweDAxLCAweDc1LCAweEZDLCAweDM3LCAweDA2LCAweEZGLCAweEY0LCAweEM3LAorCTB4MTksIDB4Q0MsIDB4NDEsIDB4N0YsIDB4RjUsIDB4RTIsIDB4MDMsIDB4OTUsIDB4RkUsIDB4NUQsIDB4MDAsCisJMHgwNSwgMHgwMCwgMHhFRCwgMHhGRiwgMHgwNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywKKwkweEZGLCAweEIzLCAweDAxLCAweDY0LCAweEZDLCAweDEzLCAweDA3LCAweDgzLCAweEYxLCAweDJDLCAweDJGLAorCTB4NUEsIDB4MzEsIDB4N0QsIDB4RjEsIDB4RjcsIDB4MDYsIDB4ODAsIDB4RkMsIDB4OUYsIDB4MDEsIDB4NjEsCisJMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwNCwgMHgwMCwgMHhGNSwgMHhGRiwgMHhFRSwgMHhGRiwKKwkweDhCLCAweDAwLCAweDQ0LCAweEZFLCAweDY1LCAweDA0LCAweEFBLCAweEY0LCAweDY2LCAweDQwLCAweDIzLAorCTB4MUMsIDB4NjMsIDB4RjQsIDB4NzQsIDB4MDYsIDB4NUQsIDB4RkMsIDB4REUsIDB4MDEsIDB4MzcsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5QSwgMHhGRiwgMHhEOSwgMHgwMCwgMHhBQSwKKwkweEZFLCAweEFFLCAweDAxLCAweDcwLCAweEZFLCAweEY4LCAweEZGLCAweEE2LCAweDQ4LCAweEJFLCAweDA3LAorCTB4MTQsIDB4RkIsIDB4NkQsIDB4MDMsIDB4QzMsIDB4RkQsIDB4NDYsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjQsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0OCwgMHhGRiwgMHhBQywgMHgwMSwKKwkweERGLCAweEZDLCAweDQzLCAweDA1LCAweDNDLCAweEY3LCAweDQ2LCAweDEyLCAweDhELCAweDQ1LCAweEUyLAorCTB4RjgsIDB4RjcsIDB4MDEsIDB4QjgsIDB4RkYsIDB4QjksIDB4RkYsIDB4NTYsIDB4MDAsIDB4Q0UsIDB4RkYsCisJMHgwQywgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhERCwgMHgwMSwgMHgzNCwKKwkweEZDLCAweDIzLCAweDA3LCAweDIxLCAweEYyLCAweENCLCAweDI3LCAweEZFLCAweDM3LCAweDAwLCAweEYyLAorCTB4NEQsIDB4MDYsIDB4MDQsIDB4RkQsIDB4NDksIDB4MDEsIDB4OEUsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhBQiwgMHhGRiwgMHgxMCwgMHgwMSwgMHg2MiwgMHhGRCwKKwkweEM1LCAweDA1LCAweEE1LCAweEYyLCAweDFGLCAweDNCLCAweEQ2LCAweDIzLCAweEJFLCAweEYyLCAweDAxLAorCTB4MDcsIDB4MzMsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgxMCwgMHgwMCwgMHhCRCwgMHhGRiwgMHg4MiwgMHgwMCwgMHg1RSwgMHhGRiwgMHg1RCwgMHgwMCwgMHhENCwKKwkweDAwLCAweDBDLCAweEZCLCAweEY5LCAweDQ2LCAweDg3LCAweDBFLCAweDgyLCAweEY4LCAweEFELCAweDA0LAorCTB4MjYsIDB4RkQsIDB4OEQsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgyOSwgMHgwMCwgMHg2MCwgMHhGRiwgMHg2RCwgMHgwMSwgMHg2RSwgMHhGRCwgMHgxNywgMHgwNCwKKwkweEJDLCAweEY5LCAweDMwLCAweDBCLCAweEY0LCAweDQ3LCAweDRCLCAweEZELCAweEI1LCAweEZGLCAweEZELAorCTB4MDAsIDB4MDgsIDB4RkYsIDB4QUMsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHg0MSwgMHhGQywgMHhDOCwgMHgwNiwgMHg3NiwKKwkweEYzLCAweDIyLCAweDIwLCAweENBLCAweDNELCAweDdELCAweEYzLCAweDJBLCAweDA1LCAweEM4LCAweEZELAorCTB4RDQsIDB4MDAsIDB4Q0EsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjEsCisJMHgwMCwgMHg3NywgMHhGRiwgMHg3NywgMHgwMSwgMHhCRCwgMHhGQywgMHhBRSwgMHgwNiwgMHhBMywgMHhGMSwKKwkweEUzLCAweDM0LCAweDY0LCAweDJCLCAweEJDLCAweEYxLCAweDJBLCAweDA3LCAweDQzLCAweEZDLCAweENELAorCTB4MDEsIDB4NDgsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDksIDB4MDAsIDB4REQsIDB4RkYsCisJMHgyRSwgMHgwMCwgMHgwQSwgMHgwMCwgMHgyNywgMHhGRiwgMHhFRiwgMHgwMiwgMHgyMCwgMHhGNywgMHhFNywKKwkweDQzLCAweEQ4LCAweDE1LCAweDFFLCAweEY2LCAweEMwLCAweDA1LCAweEE3LCAweEZDLCAweEMzLCAweDAxLAorCTB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4N0YsCisJMHhGRiwgMHgyMCwgMHgwMSwgMHgxNiwgMHhGRSwgMHhDQSwgMHgwMiwgMHg1NCwgMHhGQywgMHhCOSwgMHgwNCwKKwkweEYyLCAweDQ4LCAweEE5LCAweDAyLCAweDM5LCAweEZELCAweDUzLCAweDAyLCAweDUzLCAweEZFLCAweDAzLAorCTB4MDEsIDB4OEEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsCisJMHhEMSwgMHgwMSwgMHg4NCwgMHhGQywgMHgxMiwgMHgwNiwgMHg1QywgMHhGNSwgMHg3NiwgMHgxOCwgMHg4OSwKKwkweDQyLCAweDAyLCAweEY2LCAweDk0LCAweDAzLCAweEM0LCAweEZFLCAweDQyLCAweDAwLCAweDEyLCAweDAwLAorCTB4RTgsIDB4RkYsIDB4MDcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkUsIDB4MDAsIDB4NTEsIDB4RkYsIDB4QkQsCisJMHgwMSwgMHg1NywgMHhGQywgMHgxRSwgMHgwNywgMHg5MCwgMHhGMSwgMHhFRCwgMHgyRCwgMHg4QywgMHgzMiwKKwkweDgzLCAweEYxLCAweEUyLCAweDA2LCAweDkyLCAweEZDLCAweDkzLCAweDAxLCAweDY4LCAweEZGLCAweDI2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RTIsIDB4RkYsIDB4QTQsIDB4MDAsCisJMHgxOSwgMHhGRSwgMHhBQSwgMHgwNCwgMHgzRSwgMHhGNCwgMHg5MCwgMHgzRiwgMHg3OCwgMHgxRCwgMHgxMCwKKwkweEY0LCAweDkzLCAweDA2LCAweDUyLCAweEZDLCAweEUxLCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MTcsIDB4MDAsIDB4QTAsIDB4RkYsIDB4Q0EsIDB4MDAsIDB4QzksIDB4RkUsIDB4NzMsCisJMHgwMSwgMHhERSwgMHhGRSwgMHgwQywgMHhGRiwgMHg3NiwgMHg0OCwgMHhERSwgMHgwOCwgMHhBMSwgMHhGQSwKKwkweEE2LCAweDAzLCAweEE2LCAweEZELCAweDUzLCAweDAxLCAweDZBLCAweEZGLCAweDI2LCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTIsIDB4MDEsIDB4RjYsIDB4RkMsCisJMHgxMiwgMHgwNSwgMHhBNywgMHhGNywgMHgwMywgMHgxMSwgMHgxMCwgMHg0NiwgMHg5MywgMHhGOSwgMHg5OCwKKwkweDAxLCAweEVFLCAweEZGLCAweDlCLCAweEZGLCAweDY0LCAweDAwLCAweEM4LCAweEZGLCAweDBFLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0MsIDB4RkYsIDB4RTEsIDB4MDEsIDB4MzIsIDB4RkMsIDB4MUIsCisJMHgwNywgMHg1MCwgMHhGMiwgMHg3QiwgMHgyNiwgMHgxMSwgMHgzOSwgMHgyRiwgMHhGMiwgMHgyMywgMHgwNiwKKwkweDIyLCAweEZELCAweDM3LCAweDAxLCAweDk3LCAweEZGLCAweDE1LCAweDAwLCAweEZGLCAweEZGLCAweDAwLAorCTB4MDAsIDB4MTIsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MjQsIDB4MDEsIDB4NDEsIDB4RkQsIDB4RjYsIDB4MDUsCisJMHg2NywgMHhGMiwgMHgxQSwgMHgzQSwgMHgyOSwgMHgyNSwgMHg4NCwgMHhGMiwgMHgwRiwgMHgwNywgMHgzMSwKKwkweEZDLCAweEUzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZELCAweEZGLCAweDBGLCAweDAwLAorCTB4QzIsIDB4RkYsIDB4NzMsIDB4MDAsIDB4N0QsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MzgsIDB4MDEsIDB4NEMsCisJMHhGQSwgMHg4OSwgMHg0NiwgMHhDMywgMHgwRiwgMHgxNCwgMHhGOCwgMHhFMCwgMHgwNCwgMHgwRCwgMHhGRCwKKwkweDk4LCAweDAxLCAweDUwLCAweEZGLCAweDJFLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDI3LAorCTB4MDAsIDB4NjUsIDB4RkYsIDB4NjAsIDB4MDEsIDB4OEEsIDB4RkQsIDB4REYsIDB4MDMsIDB4MkUsIDB4RkEsCisJMHgwNCwgMHgwQSwgMHgzQSwgMHg0OCwgMHgyOCwgMHhGRSwgMHg0QiwgMHhGRiwgMHgzOCwgMHgwMSwgMHhFOSwKKwkweEZFLCAweEJCLCAweDAwLCAweEE2LCAweEZGLCAweDE2LCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLAorCTB4MzYsIDB4RkYsIDB4RTQsIDB4MDEsIDB4NDksIDB4RkMsIDB4QUYsIDB4MDYsIDB4QzEsIDB4RjMsIDB4Q0QsCisJMHgxRSwgMHhCMSwgMHgzRSwgMHhEOSwgMHhGMywgMHhFQywgMHgwNCwgMHhGMCwgMHhGRCwgMHhCQywgMHgwMCwKKwkweEQ1LCAweEZGLCAweEZFLCAweEZGLCAweDAzLCAweDAwLCAweEZELCAweEZGLCAweDI0LCAweDAwLCAweDZGLAorCTB4RkYsIDB4ODUsIDB4MDEsIDB4QTYsIDB4RkMsIDB4Q0EsIDB4MDYsIDB4OEYsIDB4RjEsIDB4QkIsIDB4MzMsCisJMHhBQiwgMHgyQywgMHhBMywgMHhGMSwgMHgyNiwgMHgwNywgMHg0QywgMHhGQywgMHhDNSwgMHgwMSwgMHg0RCwKKwkweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLCAweDA4LCAweDAwLCAweEUyLCAweEZGLCAweDIwLCAweDAwLAorCTB4MjYsIDB4MDAsIDB4RjUsIDB4RkUsIDB4NDMsIDB4MDMsIDB4OEQsIDB4RjYsIDB4M0MsIDB4NDMsIDB4MjUsCisJMHgxNywgMHhCQiwgMHhGNSwgMHhFQSwgMHgwNSwgMHg5NSwgMHhGQywgMHhDQSwgMHgwMSwgMHgzRCwgMHhGRiwKKwkweDM0LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLAorCTB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsCisJMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwKKwkweEZGLCAweDFFLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLAorCTB4M0QsIDB4RkMsIDB4RDYsIDB4MDYsIDB4NEMsIDB4RjMsIDB4RUQsIDB4MjAsIDB4M0QsIDB4M0QsIDB4NEEsCisJMHhGMywgMHg0RSwgMHgwNSwgMHhCMSwgMHhGRCwgMHhFMSwgMHgwMCwgMHhDMywgMHhGRiwgMHgwNSwgMHgwMCwKKwkweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDA1LCAweDAwLCAweEMzLCAweEZGLCAweEUxLCAweDAwLCAweEIxLAorCTB4RkQsIDB4NEUsIDB4MDUsIDB4NEEsIDB4RjMsIDB4M0QsIDB4M0QsIDB4RUQsIDB4MjAsIDB4NEMsIDB4RjMsCisJMHhENiwgMHgwNiwgMHgzRCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LCAweEZGLCAweDExLCAweDAxLCAweDM0LCAweEZFLAorCTB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsIDB4RjcsIDB4NDgsIDB4QUUsIDB4MDMsIDB4QzcsCisJMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwgMHgwMSwgMHg4NCwgMHhGRiwgMHgxRSwgMHgwMCwKKwkweEZELCAweEZGLCAweDMwLCAweDAwLCAweDRELCAweEZGLCAweEM1LCAweDAxLCAweDRDLCAweEZDLCAweDI2LAorCTB4MDcsIDB4QTMsIDB4RjEsIDB4QUIsIDB4MkMsIDB4QkIsIDB4MzMsIDB4OEYsIDB4RjEsIDB4Q0EsIDB4MDYsCisJMHhBNiwgMHhGQywgMHg4NSwgMHgwMSwgMHg2RiwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNiwKKwkweDAwLCAweEE2LCAweEZGLCAweEJCLCAweDAwLCAweEU5LCAweEZFLCAweDM4LCAweDAxLCAweDRCLCAweEZGLAorCTB4MjgsIDB4RkUsIDB4M0EsIDB4NDgsIDB4MDQsIDB4MEEsIDB4MkUsIDB4RkEsIDB4REYsIDB4MDMsIDB4OEEsCisJMHhGRCwgMHg2MCwgMHgwMSwgMHg2NSwgMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDBGLCAweDA3LCAweDg0LAorCTB4RjIsIDB4MjksIDB4MjUsIDB4MUEsIDB4M0EsIDB4NjcsIDB4RjIsIDB4RjYsIDB4MDUsIDB4NDEsIDB4RkQsCisJMHgyNCwgMHgwMSwgMHhBMSwgMHhGRiwgMHgxMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwgMHgwMCwgMHhDOCwKKwkweEZGLCAweDY0LCAweDAwLCAweDlCLCAweEZGLCAweEVFLCAweEZGLCAweDk4LCAweDAxLCAweDkzLCAweEY5LAorCTB4MTAsIDB4NDYsIDB4MDMsIDB4MTEsIDB4QTcsIDB4RjcsIDB4MTIsIDB4MDUsIDB4RjYsIDB4RkMsIDB4QTIsCisJMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwKKwkweDM2LCAweEZGLCAweEUxLCAweDAxLCAweDUyLCAweEZDLCAweDkzLCAweDA2LCAweDEwLCAweEY0LCAweDc4LAorCTB4MUQsIDB4OTAsIDB4M0YsIDB4M0UsIDB4RjQsIDB4QUEsIDB4MDQsIDB4MTksIDB4RkUsIDB4QTQsIDB4MDAsCisJMHhFMiwgMHhGRiwgMHhGQSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwNywgMHgwMCwgMHhFOCwgMHhGRiwgMHgxMiwKKwkweDAwLCAweDQyLCAweDAwLCAweEM0LCAweEZFLCAweDk0LCAweDAzLCAweDAyLCAweEY2LCAweDg5LCAweDQyLAorCTB4NzYsIDB4MTgsIDB4NUMsIDB4RjUsIDB4MTIsIDB4MDYsIDB4ODQsIDB4RkMsIDB4RDEsIDB4MDEsIDB4M0IsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwgMHhGRiwKKwkweEMzLCAweDAxLCAweEE3LCAweEZDLCAweEMwLCAweDA1LCAweDFFLCAweEY2LCAweEQ4LCAweDE1LCAweEU3LAorCTB4NDMsIDB4MjAsIDB4RjcsIDB4RUYsIDB4MDIsIDB4MjcsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MkUsIDB4MDAsCisJMHhERCwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMywgMHgwMCwgMHhDQSwgMHhGRiwgMHhENCwKKwkweDAwLCAweEM4LCAweEZELCAweDJBLCAweDA1LCAweDdELCAweEYzLCAweENBLCAweDNELCAweDIyLCAweDIwLAorCTB4NzYsIDB4RjMsIDB4QzgsIDB4MDYsIDB4NDEsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NCwgMHhGRiwgMHg4RCwgMHgwMSwKKwkweDI2LCAweEZELCAweEFELCAweDA0LCAweDgyLCAweEY4LCAweDg3LCAweDBFLCAweEY5LCAweDQ2LCAweDBDLAorCTB4RkIsIDB4RDQsIDB4MDAsIDB4NUQsIDB4MDAsIDB4NUUsIDB4RkYsIDB4ODIsIDB4MDAsIDB4QkQsIDB4RkYsCisJMHgxMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxOSwgMHgwMCwgMHg4RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHgwNCwKKwkweEZELCAweDRELCAweDA2LCAweDAwLCAweEYyLCAweEZFLCAweDM3LCAweENCLCAweDI3LCAweDIxLCAweEYyLAorCTB4MjMsIDB4MDcsIDB4MzQsIDB4RkMsIDB4REQsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg3MCwgMHhGRiwgMHg0NiwgMHgwMSwgMHhDMywgMHhGRCwKKwkweDZELCAweDAzLCAweDE0LCAweEZCLCAweEJFLCAweDA3LCAweEE2LCAweDQ4LCAweEY4LCAweEZGLCAweDcwLAorCTB4RkUsIDB4QUUsIDB4MDEsIDB4QUEsIDB4RkUsIDB4RDksIDB4MDAsIDB4OUEsIDB4RkYsIDB4MTksIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2MSwgMHhGRiwgMHg5RiwgMHgwMSwgMHg4MCwgMHhGQywgMHhGNywKKwkweDA2LCAweDdELCAweEYxLCAweDVBLCAweDMxLCAweDJDLCAweDJGLCAweDgzLCAweEYxLCAweDEzLCAweDA3LAorCTB4NjQsIDB4RkMsIDB4QjMsIDB4MDEsIDB4NTcsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUIsCisJMHgwMCwgMHg5MCwgMHhGRiwgMHhGNCwgMHgwMCwgMHg3MiwgMHhGRSwgMHgxOCwgMHgwMiwgMHhBQSwgMHhGRCwKKwkweEFCLCAweDAxLCAweERGLCAweDQ4LCAweENBLCAweDA1LCAweEUxLCAweEZCLCAweDA1LCAweDAzLCAweEY3LAorCTB4RkQsIDB4MkUsIDB4MDEsIDB4NzksIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzMiwgMHgwMCwgMHg0NCwgMHhGRiwgMHhEMywgMHgwMSwgMHgzQywgMHhGQywgMHgyQSwgMHgwNywgMHhEQywKKwkweEYxLCAweDFBLCAweDJBLCAweDA2LCAweDM2LCAweEJFLCAweEYxLCAweDhFLCAweDA2LCAweEQ1LCAweEZDLAorCTB4NjcsIDB4MDEsIDB4N0YsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTMsIDB4MDAsIDB4QjIsCisJMHhGRiwgMHg5RCwgMHgwMCwgMHgyNywgMHhGRiwgMHhDMywgMHgwMCwgMHgxRiwgMHgwMCwgMHg3NiwgMHhGQywKKwkweEEzLCAweDQ3LCAweDYwLCAweDBDLCAweDRBLCAweEY5LCAweDRFLCAweDA0LCAweDUzLCAweEZELCAweDc5LAorCTB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzNywgMHhGRiwgMHhFNiwgMHgwMSwgMHgzNiwgMHhGQywgMHhFRiwgMHgwNiwgMHhGQywgMHhGMiwgMHg4MSwKKwkweDIyLCAweDFDLCAweDNDLCAweEVDLCAweEYyLCAweDkwLCAweDA1LCAweDg1LCAweEZELCAweEZCLCAweDAwLAorCTB4QjYsIDB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NDcsCisJMHgwMCwgMHhENywgMHhGRiwgMHg4MiwgMHhGRiwgMHg1MywgMHgwMiwgMHgzOSwgMHhGOCwgMHhGRCwgMHg0NCwKKwkweDhELCAweDEzLCAweEQzLCAweEY2LCAweDcyLCAweDA1LCAweENBLCAweEZDLCAweEI1LCAweDAxLCAweDQ1LAorCTB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzgsIDB4RkYsCisJMHhEQSwgMHgwMSwgMHg2QSwgMHhGQywgMHg1MywgMHgwNiwgMHhCQSwgMHhGNCwgMHhDRSwgMHgxQSwgMHgzMiwKKwkweDQxLCAweDFGLCAweEY1LCAweDFELCAweDA0LCAweDcxLCAweEZFLCAweDcxLCAweDAwLCAweEZCLCAweEZGLAorCTB4RjAsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RjgsIDB4RkYsIDB4NzcsCisJMHgwMCwgMHg2NywgMHhGRSwgMHgyRCwgMHgwNCwgMHgwNCwgMHhGNSwgMHgwNywgMHg0MSwgMHgxQiwgMHgxQiwKKwkweEE2LCAweEY0LCAweDVBLCAweDA2LCAweDY3LCAweEZDLCAweERCLCAweDAxLCAweDM4LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjMsIDB4MDEsCisJMHhDRiwgMHhGQywgMHg2NywgMHgwNSwgMHhFQSwgMHhGNiwgMHg0NCwgMHgxMywgMHgxRSwgMHg0NSwgMHg1RSwKKwkweEY4LCAweDNGLCAweDAyLCAweDhFLCAweEZGLCAweEQwLCAweEZGLCAweDRBLCAweDAwLCAweEQyLCAweEZGLAorCTB4MEIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4QjQsIDB4RkYsIDB4MDAsIDB4MDEsIDB4N0UsCisJMHhGRCwgMHg5QywgMHgwNSwgMHhEQywgMHhGMiwgMHhFNCwgMHgzQiwgMHhDRCwgMHgyMiwgMHhFRSwgMHhGMiwKKwkweEYzLCAweDA2LCAweDM1LCAweEZDLCAweEU2LCAweDAxLCAweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZELAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4NzYsIDB4MDEsIDB4NTksIDB4RkQsCisJMHg0MiwgMHgwNCwgMHg2MywgMHhGOSwgMHgxQywgMHgwQywgMHhCNiwgMHg0NywgMHhBNCwgMHhGQywgMHgwNywKKwkweDAwLCAweEQwLCAweDAwLCAweDIwLCAweEZGLCAweEEwLCAweDAwLCAweEIxLCAweEZGLCAweDEzLCAweDAwLAorCTB4RkUsIDB4RkYsIDB4MUYsIDB4MDAsIDB4N0QsIDB4RkYsIDB4NkIsIDB4MDEsIDB4Q0YsIDB4RkMsIDB4OTYsCisJMHgwNiwgMHhCNywgMHhGMSwgMHhDNiwgMHgzNSwgMHg2NCwgMHgyQSwgMHhENCwgMHhGMSwgMHgyQiwgMHgwNywKKwkweDNELCAweEZDLCAweEQyLCAweDAxLCAweDQ1LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDAwLAorCTB4MDAsIDB4MjEsIDB4MDAsIDB4N0EsIDB4RkYsIDB4MkIsIDB4MDEsIDB4RkUsIDB4RkQsIDB4RjgsIDB4MDIsCisJMHhGQiwgMHhGQiwgMHg4RCwgMHgwNSwgMHhFNSwgMHg0OCwgMHhFMywgMHgwMSwgMHg5MSwgMHhGRCwgMHgyNSwKKwkweDAyLCAweDZCLCAweEZFLCAweEY3LCAweDAwLCAweDhGLCAweEZGLCAweDFDLCAweDAwLCAweEZELCAweEZGLAorCTB4MkQsIDB4MDAsIDB4NTUsIDB4RkYsIDB4QjUsIDB4MDEsIDB4NjEsIDB4RkMsIDB4MTYsIDB4MDcsIDB4ODUsCisJMHhGMSwgMHhFNiwgMHgyRSwgMHg5RSwgMHgzMSwgMHg3RCwgMHhGMSwgMHhGMywgMHgwNiwgMHg4NCwgMHhGQywKKwkweDlELCAweDAxLCAweDYzLCAweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweDE4LCAweDAwLCAweDlDLAorCTB4RkYsIDB4RDYsIDB4MDAsIDB4QjEsIDB4RkUsIDB4QTEsIDB4MDEsIDB4ODksIDB4RkUsIDB4QzMsIDB4RkYsCisJMHg5QywgMHg0OCwgMHhGRCwgMHgwNywgMHhGQSwgMHhGQSwgMHg3QSwgMHgwMywgMHhCQywgMHhGRCwgMHg0OSwKKwkweDAxLCAweDZFLCAweEZGLCAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLAorCTB4M0UsIDB4RkYsIDB4REUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjIsIDB4MDcsIDB4MkIsIDB4RjIsIDB4ODAsCisJMHgyNywgMHgzQiwgMHgzOCwgMHgwQSwgMHhGMiwgMHg0NCwgMHgwNiwgMHgwQiwgMHhGRCwgMHg0NSwgMHgwMSwKKwkweDkwLCAweEZGLCAweDE4LCAweDAwLCAweEZGLCAweEZGLCAweDEwLCAweDAwLCAweEJFLCAweEZGLCAweDdGLAorCTB4MDAsIDB4NjUsIDB4RkYsIDB4NTEsIDB4MDAsIDB4RUIsIDB4MDAsIDB4RTEsIDB4RkEsIDB4RTEsIDB4NDYsCisJMHhDRCwgMHgwRSwgMHg2QSwgMHhGOCwgMHhCOCwgMHgwNCwgMHgyMCwgMHhGRCwgMHg5MCwgMHgwMSwgMHg1MywKKwkweEZGLCAweDJELCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLAorCTB4RTUsIDB4MDEsIDB4NDIsIDB4RkMsIDB4QzMsIDB4MDYsIDB4ODcsIDB4RjMsIDB4RDcsIDB4MUYsIDB4RkUsCisJMHgzRCwgMHg5MSwgMHhGMywgMHgxRCwgMHgwNSwgMHhEMSwgMHhGRCwgMHhDRSwgMHgwMCwgMHhDQywgMHhGRiwKKwkweDAyLCAweDAwLCAweDAyLCAweDAwLCAweDA5LCAweDAwLCAweERFLCAweEZGLCAweDJCLCAweDAwLCAweDExLAorCTB4MDAsIDB4MUIsIDB4RkYsIDB4MDIsIDB4MDMsIDB4RkUsIDB4RjYsIDB4QzMsIDB4NDMsIDB4MjIsIDB4MTYsCisJMHgwNywgMHhGNiwgMHhDQSwgMHgwNSwgMHhBMywgMHhGQywgMHhDNSwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywKKwkweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLCAweENGLCAweDAxLAorCTB4ODgsIDB4RkMsIDB4MDksIDB4MDYsIDB4NzEsIDB4RjUsIDB4MkIsIDB4MTgsIDB4QjIsIDB4NDIsIDB4MjAsCisJMHhGNiwgMHg4MywgMHgwMywgMHhDRiwgMHhGRSwgMHgzQywgMHgwMCwgMHgxNSwgMHgwMCwgMHhFNiwgMHhGRiwKKwkweDA3LCAweDAwLCAweDAzLCAweDAwLCAweEZCLCAweEZGLCAweERGLCAweEZGLCAweEE5LCAweDAwLCAweDEwLAorCTB4RkUsIDB4QjksIDB4MDQsIDB4MjcsIDB4RjQsIDB4NUUsIDB4M0YsIDB4QzMsIDB4MUQsIDB4RkUsIDB4RjMsCisJMHg5OSwgMHgwNiwgMHg1MCwgMHhGQywgMHhFMiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwKKwkweEZGLCAweEZGLCAweEZGLCAweDJGLCAweDAwLCAweDRELCAweEZGLCAweEEwLCAweDAxLCAweEZCLCAweEZDLAorCTB4MDcsIDB4MDUsIDB4QkYsIDB4RjcsIDB4QkIsIDB4MTAsIDB4MkIsIDB4NDYsIDB4QkIsIDB4RjksIDB4ODMsCisJMHgwMSwgMHhGQSwgMHhGRiwgMHg5NSwgMHhGRiwgMHg2OCwgMHgwMCwgMHhDNywgMHhGRiwgMHgwRSwgMHgwMCwKKwkweDAwLCAweDAwLCAweDEzLCAweDAwLCAweDlGLCAweEZGLCAweDI4LCAweDAxLCAweDNBLCAweEZELCAweDAwLAorCTB4MDYsIDB4NUEsIDB4RjIsIDB4REYsIDB4MzksIDB4NzMsIDB4MjUsIDB4NzksIDB4RjIsIDB4MTIsIDB4MDcsCisJMHgzMSwgMHhGQywgMHhFMywgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDI3LCAweDAwLCAweDY2LCAweEZGLCAweDVFLCAweDAxLCAweDkwLCAweEZELCAweEQyLCAweDAzLAorCTB4NDcsIDB4RkEsIDB4QzMsIDB4MDksIDB4NDgsIDB4NDgsIDB4NUEsIDB4RkUsIDB4MzMsIDB4RkYsIDB4NDUsCisJMHgwMSwgMHhFMiwgMHhGRSwgMHhCRSwgMHgwMCwgMHhBNSwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDI0LCAweDAwLCAweDZELCAweEZGLCAweDg4LCAweDAxLCAweEEyLCAweEZDLCAweEQwLCAweDA2LCAweDhDLAorCTB4RjEsIDB4NzgsIDB4MzMsIDB4RjIsIDB4MkMsIDB4OUUsIDB4RjEsIDB4MjQsIDB4MDcsIDB4NEUsIDB4RkMsCisJMHhDMywgMHgwMSwgMHg0RSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4NiwKKwkweEZGLCAweDBFLCAweDAxLCAweDNCLCAweEZFLCAweDgyLCAweDAyLCAweEUwLCAweEZDLCAweDczLCAweDAzLAorCTB4RjYsIDB4NDgsIDB4RTksIDB4MDMsIDB4QUQsIDB4RkMsIDB4OUMsIDB4MDIsIDB4MkQsIDB4RkUsIDB4MTQsCisJMHgwMSwgMHg4MywgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwKKwkweDRDLCAweEZGLCAweEM3LCAweDAxLCAweDRBLCAweEZDLCAweDI3LCAweDA3LCAweEE4LCAweEYxLCAweDYyLAorCTB4MkMsIDB4RkQsIDB4MzMsIDB4OTMsIDB4RjEsIDB4QzQsIDB4MDYsIDB4QUIsIDB4RkMsIDB4ODIsIDB4MDEsCisJMHg3MSwgMHhGRiwgMHgyMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOCwgMHhGRiwgMHhCOCwKKwkweDAwLCAweEYwLCAweEZFLCAweDJCLCAweDAxLCAweDYzLCAweEZGLCAweEY2LCAweEZELCAweDJDLCAweDQ4LAorCTB4NDcsIDB4MEEsIDB4MTQsIDB4RkEsIDB4RUIsIDB4MDMsIDB4ODQsIDB4RkQsIDB4NjMsIDB4MDEsIDB4NjQsCisJMHhGRiwgMHgyNywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzQSwgMHhGRiwKKwkweEU0LCAweDAxLCAweDMyLCAweEZDLCAweDBDLCAweDA3LCAweDkxLCAweEYyLCAweERELCAweDI0LCAweDU0LAorCTB4M0EsIDB4NzQsIDB4RjIsIDB4RUIsIDB4MDUsIDB4NDksIDB4RkQsIDB4MjAsIDB4MDEsIDB4QTMsIDB4RkYsCisJMHgxMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwgMHhDOSwgMHhGRiwgMHg2MSwgMHgwMCwgMHhBMiwKKwkweEZGLCAweEUyLCAweEZGLCAweEFFLCAweDAxLCAweDZCLCAweEY5LCAweEYyLCAweDQ1LCAweDRBLCAweDExLAorCTB4OEYsIDB4RjcsIDB4MUQsIDB4MDUsIDB4RjEsIDB4RkMsIDB4QTQsIDB4MDEsIDB4NEIsIDB4RkYsIDB4MkYsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMSwgMHgwMSwKKwkweDU1LCAweEZDLCAweDhDLCAweDA2LCAweDIyLCAweEY0LCAweDJDLCAweDFELCAweEMwLCAweDNGLCAweDU1LAorCTB4RjQsIDB4OUIsIDB4MDQsIDB4MjMsIDB4RkUsIDB4OUYsIDB4MDAsIDB4RTQsIDB4RkYsIDB4RjksIDB4RkYsCisJMHgwNCwgMHgwMCwgMHgwNywgMHgwMCwgMHhFOSwgMHhGRiwgMHgwRiwgMHgwMCwgMHg0OCwgMHgwMCwgMHhCOSwKKwkweEZFLCAweEE2LCAweDAzLCAweEU0LCAweEY1LCAweDYwLCAweDQyLCAweEMxLCAweDE4LCAweDQ3LCAweEY1LAorCTB4MUEsIDB4MDYsIDB4ODEsIDB4RkMsIDB4RDIsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MCwgMHhGRiwgMHhDMSwgMHgwMSwgMHhBQiwgMHhGQywKKwkweEI3LCAweDA1LCAweDM0LCAweEY2LCAweDhFLCAweDE1LCAweDBCLCAweDQ0LCAweDQyLCAweEY3LCAweERDLAorCTB4MDIsIDB4MzIsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MzEsIDB4MDAsIDB4REMsIDB4RkYsIDB4MDksIDB4MDAsCisJMHgwMiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhDNywgMHhGRiwgMHhEOSwgMHgwMCwgMHhCRiwgMHhGRCwgMHgzOCwKKwkweDA1LCAweDY5LCAweEYzLCAweDk2LCAweDNELCAweDZGLCAweDIwLCAweDY2LCAweEYzLCAweENFLCAweDA2LAorCTB4M0YsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHgyQywgMHgwMCwgMHg1NSwgMHhGRiwgMHg4QiwgMHgwMSwgMHgyQiwgMHhGRCwgMHhBMSwgMHgwNCwKKwkweDlCLCAweEY4LCAweDQyLCAweDBFLCAweDBGLCAweDQ3LCAweDM4LCAweEZCLCAweEJFLCAweDAwLCAweDZBLAorCTB4MDAsIDB4NTgsIDB4RkYsIDB4ODUsIDB4MDAsIDB4QkIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHgxOSwgMHgwMCwgMHg4QywgMHhGRiwgMHg0RCwgMHgwMSwgMHhGRSwgMHhGQywgMHg1NiwgMHgwNiwgMHhGNywKKwkweEYxLCAweEJGLCAweDM3LCAweDE1LCAweDI4LCAweDE4LCAweEYyLCAweDI1LCAweDA3LCAweDM0LCAweEZDLAorCTB4REMsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjQsCisJMHgwMCwgMHg3MSwgMHhGRiwgMHg0MywgMHgwMSwgMHhDOSwgMHhGRCwgMHg2MCwgMHgwMywgMHgyRSwgMHhGQiwKKwkweDdFLCAweDA3LCAweEFGLCAweDQ4LCAweDJELCAweDAwLCAweDU4LCAweEZFLCAweEJCLCAweDAxLCAweEEzLAorCTB4RkUsIDB4REQsIDB4MDAsIDB4OTksIDB4RkYsIDB4MTksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsCisJMHg2MCwgMHhGRiwgMHhBMiwgMHgwMSwgMHg3QywgMHhGQywgMHhGQiwgMHgwNiwgMHg3QywgMHhGMSwgMHgxNSwKKwkweDMxLCAweDczLCAweDJGLCAweDgxLCAweEYxLCAweDEwLCAweDA3LCAweDY3LCAweEZDLCAweEIxLCAweDAxLAorCTB4NTgsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4RjEsCisJMHgwMCwgMHg3OSwgMHhGRSwgMHgwQSwgMHgwMiwgMHhDMywgMHhGRCwgMHg3MywgMHgwMSwgMHhEQiwgMHg0OCwKKwkweDA3LCAweDA2LCAweEM3LCAweEZCLCAweDEyLCAweDAzLCAweEYxLCAweEZELCAweDMxLCAweDAxLCAweDc4LAorCTB4RkYsIDB4MjIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDQsIDB4RkYsCisJMHhENSwgMHgwMSwgMHgzQSwgMHhGQywgMHgyQSwgMHgwNywgMHhFMywgMHhGMSwgMHhEMSwgMHgyOSwgMHg0NiwKKwkweDM2LCAweEM1LCAweEYxLCAweDg3LCAweDA2LCAweERBLCAweEZDLCAweDY0LCAweDAxLCAweDgwLCAweEZGLAorCTB4MUUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkUsCisJMHhGRiwgMHhCNiwgMHgwMCwgMHgzNiwgMHgwMCwgMHg0NywgMHhGQywgMHg5MCwgMHg0NywgMHhBNCwgMHgwQywKKwkweDMxLCAweEY5LCAweDVBLCAweDA0LCAweDRFLCAweEZELCAweDdDLCAweDAxLCAweDVCLCAweEZGLCAweDJBLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsCisJMHgzNywgMHhGQywgMHhFQiwgMHgwNiwgMHgwQiwgMHhGMywgMHgzNSwgMHgyMiwgMHg1MiwgMHgzQywgMHhGRCwKKwkweEYyLCAweDg0LCAweDA1LCAweDhELCAweEZELCAweEY2LCAweDAwLCAweEI4LCAweEZGLCAweDA5LCAweDAwLAorCTB4MDEsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NDQsIDB4MDAsIDB4REQsIDB4RkYsIDB4NzcsCisJMHhGRiwgMHg2NywgMHgwMiwgMHgxNCwgMHhGOCwgMHhEQywgMHg0NCwgMHhENSwgMHgxMywgMHhCQywgMHhGNiwKKwkweDdDLCAweDA1LCAweEM1LCAweEZDLCAweEI3LCAweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLCAweEZGLAorCTB4RkYsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsIDB4MzksIDB4RkYsIDB4RDksIDB4MDEsIDB4NkQsIDB4RkMsCisJMHg0QiwgMHgwNiwgMHhDRCwgMHhGNCwgMHg4MywgMHgxQSwgMHg1RiwgMHg0MSwgMHgzQSwgMHhGNSwgMHgwQywKKwkweDA0LCAweDdCLCAweEZFLCAweDZDLCAweDAwLCAweEZFLCAweEZGLCAweEVGLCAweEZGLCAweDA1LCAweDAwLAorCTB4MDUsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RjUsIDB4RkYsIDB4N0QsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0UsCisJMHgwNCwgMHhFQSwgMHhGNCwgMHhEOSwgMHg0MCwgMHg2NiwgMHgxQiwgMHg5MywgMHhGNCwgMHg2MiwgMHgwNiwKKwkweDY0LCAweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLAorCTB4RkYsIDB4MzEsIDB4MDAsIDB4NDYsIDB4RkYsIDB4QjEsIDB4MDEsIDB4RDMsIDB4RkMsIDB4NUQsIDB4MDUsCisJMHgwMSwgMHhGNywgMHhGQiwgMHgxMiwgMHgzRiwgMHg0NSwgMHg4MywgMHhGOCwgMHgyQSwgMHgwMiwgMHg5QSwKKwkweEZGLCAweENBLCAweEZGLCAweDRFLCAweDAwLCAweEQxLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLAorCTB4MEMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MDQsIDB4MDEsIDB4NzYsIDB4RkQsIDB4QTgsIDB4MDUsIDB4Q0MsCisJMHhGMiwgMHhBQiwgMHgzQiwgMHgxOCwgMHgyMywgMHhFMCwgMHhGMiwgMHhGNywgMHgwNiwgMHgzNSwgMHhGQywKKwkweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI5LAorCTB4MDAsIDB4NUUsIDB4RkYsIDB4NzQsIDB4MDEsIDB4NUYsIDB4RkQsIDB4MzUsIDB4MDQsIDB4N0MsIDB4RjksCisJMHhEOCwgMHgwQiwgMHhDOSwgMHg0NywgMHhENCwgMHhGQywgMHhGMCwgMHhGRiwgMHhERCwgMHgwMCwgMHgxOSwKKwkweEZGLCAweEE0LCAweDAwLCAweEFGLCAweEZGLCAweDEzLCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLAorCTB4N0IsIDB4RkYsIDB4NkUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4OUQsIDB4MDYsIDB4QjEsIDB4RjEsIDB4ODYsCisJMHgzNSwgMHhBRSwgMHgyQSwgMHhDRCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRiwgMHhGQywgMHhEMSwgMHgwMSwKKwkweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIxLCAweDAwLCAweDdDLAorCTB4RkYsIDB4MjcsIDB4MDEsIDB4MDUsIDB4RkUsIDB4RUIsIDB4MDIsIDB4MTQsIDB4RkMsIDB4NTAsIDB4MDUsCisJMHhFQSwgMHg0OCwgMHgxQiwgMHgwMiwgMHg3OCwgMHhGRCwgMHgzMiwgMHgwMiwgMHg2NCwgMHhGRSwgMHhGQSwKKwkweDAwLCAweDhELCAweEZGLCAweDFDLCAweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDU0LCAweEZGLAorCTB4QjcsIDB4MDEsIDB4NUUsIDB4RkMsIDB4MTksIDB4MDcsIDB4ODgsIDB4RjEsIDB4OUYsIDB4MkUsIDB4RTMsCisJMHgzMSwgMHg3RSwgMHhGMSwgMHhFRSwgMHgwNiwgMHg4OCwgMHhGQywgMHg5QSwgMHgwMSwgMHg2NCwgMHhGRiwKKwkweDI4LCAweDAwLCAweEZELCAweEZGLCAweDE4LCAweDAwLCAweDlELCAweEZGLCAweEQzLCAweDAwLCAweEI4LAorCTB4RkUsIDB4OTMsIDB4MDEsIDB4QTEsIDB4RkUsIDB4OEUsIDB4RkYsIDB4OTIsIDB4NDgsIDB4M0QsIDB4MDgsCisJMHhFMSwgMHhGQSwgMHg4NiwgMHgwMywgMHhCNiwgMHhGRCwgMHg0QywgMHgwMSwgMHg2RCwgMHhGRiwgMHgyNSwKKwkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM0LCAweDAwLCAweDNFLCAweEZGLCAweERGLCAweDAxLAorCTB4MzMsIDB4RkMsIDB4MjAsIDB4MDcsIDB4MzUsIDB4RjIsIDB4MzYsIDB4MjcsIDB4NzgsIDB4MzgsIDB4MTQsCisJMHhGMiwgMHgzQiwgMHgwNiwgMHgxMSwgMHhGRCwgMHg0MSwgMHgwMSwgMHg5MiwgMHhGRiwgMHgxNywgMHgwMCwKKwkweEZGLCAweEZGLCAweDEwLCAweDAwLCAweEJGLCAweEZGLCAweDdCLCAweDAwLCAweDZDLCAweEZGLCAweDQ0LAorCTB4MDAsIDB4MDEsIDB4MDEsIDB4QjYsIDB4RkEsIDB4QzgsIDB4NDYsIDB4MTMsIDB4MEYsIDB4NTEsIDB4RjgsCisJMHhDNCwgMHgwNCwgMHgxQiwgMHhGRCwgMHg5MiwgMHgwMSwgMHg1MiwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQ0LCAweEZDLAorCTB4QkQsIDB4MDYsIDB4OTcsIDB4RjMsIDB4OEEsIDB4MUYsIDB4MzEsIDB4M0UsIDB4QTUsIDB4RjMsIDB4MEYsCisJMHgwNSwgMHhEQSwgMHhGRCwgMHhDOSwgMHgwMCwgMHhDRiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwMiwgMHgwMCwKKwkweDA5LCAweDAwLCAweERGLCAweEZGLCAweDI4LCAweDAwLCAweDE3LCAweDAwLCAweDEwLCAweEZGLCAweDE1LAorCTB4MDMsIDB4REQsIDB4RjYsIDB4OUUsIDB4NDMsIDB4NkMsIDB4MTYsIDB4RjEsIDB4RjUsIDB4RDMsIDB4MDUsCisJMHg5RiwgMHhGQywgMHhDNiwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwKKwkweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLCAweENFLCAweDAxLCAweDhDLCAweEZDLCAweDAwLCAweDA2LAorCTB4ODYsIDB4RjUsIDB4RTAsIDB4MTcsIDB4REIsIDB4NDIsIDB4M0YsIDB4RjYsIDB4NzEsIDB4MDMsIDB4RDksCisJMHhGRSwgMHgzNiwgMHgwMCwgMHgxOCwgMHgwMCwgMHhFNSwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMywgMHgwMCwKKwkweEZDLCAweEZGLCAweERDLCAweEZGLCAweEFGLCAweDAwLCAweDA3LCAweEZFLCAweEM4LCAweDA0LCAweDEwLAorCTB4RjQsIDB4MkQsIDB4M0YsIDB4MEYsIDB4MUUsIDB4RUQsIDB4RjMsIDB4QTAsIDB4MDYsIDB4NEUsIDB4RkMsCisJMHhFMywgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRSwKKwkweDAwLCAweDRFLCAweEZGLCAweDlFLCAweDAxLCAweDAwLCAweEZELCAweEZDLCAweDA0LCAweEQ3LCAweEY3LAorCTB4NzUsIDB4MTAsIDB4NDgsIDB4NDYsIDB4RTQsIDB4RjksIDB4NkUsIDB4MDEsIDB4MDYsIDB4MDAsIDB4OEUsCisJMHhGRiwgMHg2QiwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxMywgMHgwMCwKKwkweDlELCAweEZGLCAweDJELCAweDAxLCAweDMzLCAweEZELCAweDBCLCAweDA2LCAweDRELCAweEYyLCAweEE1LAorCTB4MzksIDB4QkYsIDB4MjUsIDB4NkQsIDB4RjIsIDB4MTUsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsCisJMHgzQiwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OCwKKwkweEZGLCAweDVCLCAweDAxLCAweDk2LCAweEZELCAweEM2LCAweDAzLCAweDYxLCAweEZBLCAweDgxLCAweDA5LAorCTB4NTcsIDB4NDgsIDB4OEQsIDB4RkUsIDB4MUIsIDB4RkYsIDB4NTIsIDB4MDEsIDB4REIsIDB4RkUsIDB4QzIsCisJMHgwMCwgMHhBNCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QywgMHhGRiwKKwkweDhCLCAweDAxLCAweDlELCAweEZDLCAweEQ1LCAweDA2LCAweDg5LCAweEYxLCAweDM1LCAweDMzLCAweDNBLAorCTB4MkQsIDB4OUEsIDB4RjEsIDB4MjMsIDB4MDcsIDB4NTEsIDB4RkMsIDB4QzIsIDB4MDEsIDB4NEYsIDB4RkYsCisJMHgyRiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxRSwgMHgwMCwgMHg4NywgMHhGRiwgMHgwQiwgMHgwMSwgMHg0MiwKKwkweEZFLCAweDc0LCAweDAyLCAweEY5LCAweEZDLCAweDM5LCAweDAzLCAweEY1LCAweDQ4LCAweDI0LCAweDA0LAorCTB4OTQsIDB4RkMsIDB4QTksIDB4MDIsIDB4MjcsIDB4RkUsIDB4MTgsIDB4MDEsIDB4ODIsIDB4RkYsIDB4MUYsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QiwgMHhGRiwgMHhDOSwgMHgwMSwKKwkweDQ4LCAweEZDLCAweDI4LCAweDA3LCAweEFELCAweEYxLCAweDE5LCAweDJDLCAweDNGLCAweDM0LCAweDk3LAorCTB4RjEsIDB4QkUsIDB4MDYsIDB4QjAsIDB4RkMsIDB4N0YsIDB4MDEsIDB4NzIsIDB4RkYsIDB4MjMsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhBOSwgMHhGRiwgMHhCNCwgMHgwMCwgMHhGNywgMHhGRSwgMHgxRCwKKwkweDAxLCAweDdBLCAweEZGLCAweEM1LCAweEZELCAweDFELCAweDQ4LCAweDg5LCAweDBBLCAweEZCLCAweEY5LAorCTB4RjgsIDB4MDMsIDB4N0QsIDB4RkQsIDB4NjYsIDB4MDEsIDB4NjMsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzOSwgMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywKKwkweDA5LCAweDA3LCAweDlELCAweEYyLCAweDkyLCAweDI0LCAweDhGLCAweDNBLCAweDgyLCAweEYyLCAweEUxLAorCTB4MDUsIDB4NTAsIDB4RkQsIDB4MUIsIDB4MDEsIDB4QTYsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwRCwgMHgwMCwgMHhDQiwgMHhGRiwgMHg1RSwgMHgwMCwgMHhBOSwgMHhGRiwgMHhENiwgMHhGRiwgMHhDMywKKwkweDAxLCAweDQzLCAweEY5LCAweEQ3LCAweDQ1LCAweDkyLCAweDExLCAweDc3LCAweEY3LCAweDI4LCAweDA1LAorCTB4RUMsIDB4RkMsIDB4QTcsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwgMHhFMCwgMHgwMSwgMHg1NywgMHhGQywgMHg4NSwgMHgwNiwKKwkweDM0LCAweEY0LCAweEUwLCAweDFDLCAweEYwLCAweDNGLCAweDZELCAweEY0LCAweDhDLCAweDA0LCAweDJDLAorCTB4RkUsIDB4OTksIDB4MDAsIDB4RTcsIDB4RkYsIDB4RjgsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsCisJMHhFQSwgMHhGRiwgMHgwQywgMHgwMCwgMHg0RSwgMHgwMCwgMHhBRiwgMHhGRSwgMHhCOCwgMHgwMywgMHhDNywKKwkweEY1LCAweDM4LCAweDQyLCAweDBDLCAweDE5LCAweDMyLCAweEY1LCAweDIzLCAweDA2LCAweDdELCAweEZDLAorCTB4RDMsIDB4MDEsIDB4M0EsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsCisJMHgwMCwgMHg0MSwgMHhGRiwgMHhDMCwgMHgwMSwgMHhBRiwgMHhGQywgMHhBRCwgMHgwNSwgMHg0QSwgMHhGNiwKKwkweDQ0LCAweDE1LCAweDJGLCAweDQ0LCAweDY0LCAweEY3LCAweEM5LCAweDAyLCAweDNELCAweEZGLCAweEZFLAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4REIsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDUsIDB4MDAsCisJMHhDNSwgMHhGRiwgMHhERSwgMHgwMCwgMHhCNywgMHhGRCwgMHg0NSwgMHgwNSwgMHg1NiwgMHhGMywgMHg2MSwKKwkweDNELCAweEJBLCAweDIwLCAweDU2LCAweEYzLCAweEQzLCAweDA2LCAweDNFLCAweEZDLCAweEU2LCAweDAxLAorCTB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTYsCisJMHhGRiwgMHg4OCwgMHgwMSwgMHgzMSwgMHhGRCwgMHg5NSwgMHgwNCwgMHhCNCwgMHhGOCwgMHhGQywgMHgwRCwKKwkweDI2LCAweDQ3LCAweDY0LCAweEZCLCAweEE3LCAweDAwLCAweDc3LCAweDAwLCAweDUxLCAweEZGLCAweDg5LAorCTB4MDAsIDB4QkEsIDB4RkYsIDB4MTEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MUEsIDB4MDAsIDB4OEEsIDB4RkYsCisJMHg1MSwgMHgwMSwgMHhGOCwgMHhGQywgMHg1RSwgMHgwNiwgMHhFRCwgMHhGMSwgMHg4MiwgMHgzNywgMHg2MCwKKwkweDI4LCAweDBFLCAweEYyLCAweDI2LCAweDA3LCAweDM1LCAweEZDLCAweERCLCAweDAxLCAweDQwLCAweEZGLAorCTB4MzQsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzIsIDB4RkYsIDB4NDAsCisJMHgwMSwgMHhEMCwgMHhGRCwgMHg1MywgMHgwMywgMHg0NywgMHhGQiwgMHgzRiwgMHgwNywgMHhCOCwgMHg0OCwKKwkweDYyLCAweDAwLCAweDNGLCAweEZFLCAweEM4LCAweDAxLCAweDlDLCAweEZFLCAweEUwLCAweDAwLCAweDk4LAorCTB4RkYsIDB4MTksIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjksIDB4MDAsIDB4NUYsIDB4RkYsIDB4QTUsIDB4MDEsCisJMHg3OCwgMHhGQywgMHhGRiwgMHgwNiwgMHg3RCwgMHhGMSwgMHhDRiwgMHgzMCwgMHhCOCwgMHgyRiwgMHg4MCwKKwkweEYxLCAweDBELCAweDA3LCAweDZBLCAweEZDLCAweEFFLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MUIsIDB4MDAsIDB4OTMsIDB4RkYsIDB4RUQsIDB4MDAsIDB4ODAsIDB4RkUsIDB4RkQsCisJMHgwMSwgMHhEQywgMHhGRCwgMHgzQywgMHgwMSwgMHhENSwgMHg0OCwgMHg0NSwgMHgwNiwgMHhBRSwgMHhGQiwKKwkweDFGLCAweDAzLCAweEVBLCAweEZELCAweDM0LCAweDAxLCAweDc3LCAweEZGLCAweDIyLCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDMsIDB4RkYsIDB4RDYsIDB4MDEsIDB4MzksIDB4RkMsCisJMHgyQSwgMHgwNywgMHhFQiwgMHhGMSwgMHg4NywgMHgyOSwgMHg4NSwgMHgzNiwgMHhDQywgMHhGMSwgMHg3RiwKKwkweDA2LCAweEUwLCAweEZDLCAweDYwLCAweDAxLCAweDgyLCAweEZGLCAweDFELCAweDAwLCAweEZFLCAweEZGLAorCTB4MTIsIDB4MDAsIDB4QjUsIDB4RkYsIDB4OTYsIDB4MDAsIDB4MzUsIDB4RkYsIDB4QTksIDB4MDAsIDB4NEQsCisJMHgwMCwgMHgxOSwgMHhGQywgMHg3QywgMHg0NywgMHhFOCwgMHgwQywgMHgxOCwgMHhGOSwgMHg2NiwgMHgwNCwKKwkweDQ4LCAweEZELCAweDdFLCAweDAxLCAweDVBLCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweEZELAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDYsCisJMHgxOSwgMHhGMywgMHhFQSwgMHgyMSwgMHg4QSwgMHgzQywgMHgwRSwgMHhGMywgMHg3OCwgMHgwNSwgMHg5NiwKKwkweEZELCAweEYxLCAweDAwLCAweEJCLCAweEZGLCAweDA4LCAweDAwLCAweDAxLCAweDAwLCAweDBCLCAweDAwLAorCTB4RDYsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RTQsIDB4RkYsIDB4NkIsIDB4RkYsIDB4N0IsIDB4MDIsIDB4RjAsCisJMHhGNywgMHhCQSwgMHg0NCwgMHgxRSwgMHgxNCwgMHhBNSwgMHhGNiwgMHg4NiwgMHgwNSwgMHhDMSwgMHhGQywKKwkweEI5LCAweDAxLCAweDQ0LCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LAorCTB4MDAsIDB4MzksIDB4RkYsIDB4RDgsIDB4MDEsIDB4NzAsIDB4RkMsIDB4NDMsIDB4MDYsIDB4RTEsIDB4RjQsCisJMHgzOCwgMHgxQSwgMHg4QywgMHg0MSwgMHg1NSwgMHhGNSwgMHhGQywgMHgwMywgMHg4NSwgMHhGRSwgMHg2NiwKKwkweDAwLCAweDAxLCAweDAwLCAweEVFLCAweEZGLCAweDA2LCAweDAwLCAweDA1LCAweDAwLCAweEY0LCAweEZGLAorCTB4RjIsIDB4RkYsIDB4ODMsIDB4MDAsIDB4NTMsIDB4RkUsIDB4NEUsIDB4MDQsIDB4RDAsIDB4RjQsIDB4QUIsCisJMHg0MCwgMHhCMiwgMHgxQiwgMHg3RiwgMHhGNCwgMHg2OSwgMHgwNiwgMHg2MiwgMHhGQywgMHhERCwgMHgwMSwKKwkweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ3LAorCTB4RkYsIDB4QUYsIDB4MDEsIDB4RDgsIDB4RkMsIDB4NTIsIDB4MDUsIDB4MTksIDB4RjcsIDB4QjIsIDB4MTIsCisJMHg1QywgMHg0NSwgMHhBOSwgMHhGOCwgMHgxNiwgMHgwMiwgMHhBNiwgMHhGRiwgMHhDMywgMHhGRiwgMHg1MSwKKwkweDAwLCAweEQwLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDBELCAweDAwLCAweEFGLCAweEZGLAorCTB4MDksIDB4MDEsIDB4NkUsIDB4RkQsIDB4QjQsIDB4MDUsIDB4QkMsIDB4RjIsIDB4NzMsIDB4M0IsIDB4NjQsCisJMHgyMywgMHhEMiwgMHhGMiwgMHhGQiwgMHgwNiwgMHgzNCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzOCwgMHhGRiwKKwkweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDVGLCAweEZGLCAweDcxLAorCTB4MDEsIDB4NjUsIDB4RkQsIDB4MjksIDB4MDQsIDB4OTYsIDB4RjksIDB4OTUsIDB4MEIsIDB4REMsIDB4NDcsCisJMHgwMywgMHhGRCwgMHhEOSwgMHhGRiwgMHhFQSwgMHgwMCwgMHgxMiwgMHhGRiwgMHhBNywgMHgwMCwgMHhBRSwKKwkweEZGLCAweDE0LCAweDAwLCAweEZFLCAweEZGLCAweDIwLCAweDAwLCAweDc5LCAweEZGLCAweDcyLCAweDAxLAorCTB4QzQsIDB4RkMsIDB4QTQsIDB4MDYsIDB4QUIsIDB4RjEsIDB4NDYsIDB4MzUsIDB4RjcsIDB4MkEsIDB4QzYsCisJMHhGMSwgMHgyQSwgMHgwNywgMHg0MCwgMHhGQywgMHhDRiwgMHgwMSwgMHg0NywgMHhGRiwgMHgzMSwgMHgwMCwKKwkweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIwLCAweDAwLCAweDdELCAweEZGLCAweDI0LCAweDAxLCAweDBDLAorCTB4RkUsIDB4REUsIDB4MDIsIDB4MkUsIDB4RkMsIDB4MTMsIDB4MDUsIDB4RUMsIDB4NDgsIDB4NTQsIDB4MDIsCisJMHg1RSwgMHhGRCwgMHgzRiwgMHgwMiwgMHg1RCwgMHhGRSwgMHhGRSwgMHgwMCwgMHg4QywgMHhGRiwgMHgxQywKKwkweDAwLCAweEZELCAweEZGLCAweDJELCAweDAwLCAweDUzLCAweEZGLCAweEJBLCAweDAxLCAweDVCLCAweEZDLAorCTB4MUIsIDB4MDcsIDB4OEIsIDB4RjEsIDB4NTgsIDB4MkUsIDB4MjYsIDB4MzIsIDB4ODAsIDB4RjEsIDB4RUEsCisJMHgwNiwgMHg4QywgMHhGQywgMHg5NywgMHgwMSwgMHg2NiwgMHhGRiwgMHgyNywgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDE3LCAweDAwLCAweDlFLCAweEZGLCAweENGLCAweDAwLCAweEJGLCAweEZFLCAweDg2LCAweDAxLCAweEJBLAorCTB4RkUsIDB4NUEsIDB4RkYsIDB4ODYsIDB4NDgsIDB4N0QsIDB4MDgsIDB4QzcsIDB4RkEsIDB4OTMsIDB4MDMsCisJMHhCMCwgMHhGRCwgMHg0RiwgMHgwMSwgMHg2QywgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM1LCAweDAwLCAweDNELCAweEZGLCAweERGLCAweDAxLCAweDMyLCAweEZDLCAweDFFLCAweDA3LAorCTB4NDAsIDB4RjIsIDB4RUIsIDB4MjYsIDB4QjUsIDB4MzgsIDB4MUYsIDB4RjIsIDB4MzIsIDB4MDYsIDB4MTgsCisJMHhGRCwgMHgzRCwgMHgwMSwgMHg5NCwgMHhGRiwgMHgxNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwRiwgMHgwMCwKKwkweEMwLCAweEZGLCAweDc4LCAweDAwLCAweDczLCAweEZGLCAweDM4LCAweDAwLCAweDE3LCAweDAxLCAweDhCLAorCTB4RkEsIDB4QUYsIDB4NDYsIDB4NTksIDB4MEYsIDB4MzksIDB4RjgsIDB4Q0YsIDB4MDQsIDB4MTUsIDB4RkQsCisJMHg5NSwgMHgwMSwgMHg1MSwgMHhGRiwgMHgyRCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM2LCAweEZGLCAweEU1LCAweDAxLCAweDQ2LCAweEZDLCAweEI4LCAweDA2LCAweEE4LCAweEYzLAorCTB4M0YsIDB4MUYsIDB4NjQsIDB4M0UsIDB4QkEsIDB4RjMsIDB4MDEsIDB4MDUsIDB4RTIsIDB4RkQsIDB4QzQsCisJMHgwMCwgMHhEMiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhFMSwgMHhGRiwKKwkweDI1LCAweDAwLCAweDFELCAweDAwLCAweDA1LCAweEZGLCAweDI4LCAweDAzLCAweEJELCAweEY2LCAweDc3LAorCTB4NDMsIDB4QjYsIDB4MTYsIDB4REMsIDB4RjUsIDB4REQsIDB4MDUsIDB4OUIsIDB4RkMsIDB4QzgsIDB4MDEsCisJMHgzRSwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwKKwkweEZGLCAweENDLCAweDAxLCAweDhGLCAweEZDLCAweEY4LCAweDA1LCAweDlCLCAweEY1LCAweDk2LCAweDE3LAorCTB4MDIsIDB4NDMsIDB4NUUsIDB4RjYsIDB4NUYsIDB4MDMsIDB4RTQsIDB4RkUsIDB4MzAsIDB4MDAsIDB4MUIsCisJMHgwMCwgMHhFNCwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwMywgMHgwMCwgMHhGRCwgMHhGRiwgMHhEOSwgMHhGRiwKKwkweEI0LCAweDAwLCAweEZELCAweEZELCAweEQ3LCAweDA0LCAweEZBLCAweEYzLCAweEZDLCAweDNFLCAweDVCLAorCTB4MUUsIDB4REIsIDB4RjMsIDB4QTYsIDB4MDYsIDB4NEMsIDB4RkMsIDB4RTMsIDB4MDEsIDB4MzYsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RSwgMHhGRiwgMHg5QywKKwkweDAxLCAweDA1LCAweEZELCAweEYxLCAweDA0LCAweEYwLCAweEY3LCAweDJELCAweDEwLCAweDYxLCAweDQ2LAorCTB4MEQsIDB4RkEsIDB4NTgsIDB4MDEsIDB4MTMsIDB4MDAsIDB4ODcsIDB4RkYsIDB4NkUsIDB4MDAsIDB4QzQsCisJMHhGRiwgMHgwRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxNCwgMHgwMCwgMHg5QiwgMHhGRiwgMHgzMSwgMHgwMSwKKwkweDJDLCAweEZELCAweDE1LCAweDA2LCAweDQxLCAweEYyLCAweDZBLCAweDM5LCAweDBBLCAweDI2LCAweDYxLAorCTB4RjIsIDB4MTcsIDB4MDcsIDB4MzEsIDB4RkMsIDB4RTIsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyNiwgMHgwMCwgMHg2OSwgMHhGRiwgMHg1OCwgMHgwMSwgMHg5RCwKKwkweEZELCAweEI5LCAweDAzLCAweDdCLCAweEZBLCAweDQwLCAweDA5LCAweDYzLCAweDQ4LCAweEJGLCAweEZFLAorCTB4MDMsIDB4RkYsIDB4NUYsIDB4MDEsIDB4RDQsIDB4RkUsIDB4QzUsIDB4MDAsIDB4QTIsIDB4RkYsIDB4MTYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgyNSwgMHgwMCwgMHg2QSwgMHhGRiwgMHg4RSwgMHgwMSwgMHg5OSwgMHhGQywKKwkweERCLCAweDA2LCAweDg2LCAweEYxLCAweEYyLCAweDMyLCAweDgyLCAweDJELCAweDk2LCAweEYxLCAweDIxLAorCTB4MDcsIDB4NTMsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NTAsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgxRCwgMHgwMCwgMHg4OCwgMHhGRiwgMHgwNywgMHgwMSwgMHg0OSwgMHhGRSwgMHg2NywgMHgwMiwgMHgxMywKKwkweEZELCAweEZGLCAweDAyLCAweEY0LCAweDQ4LCAweDVGLCAweDA0LCAweDdBLCAweEZDLCAweEI2LCAweDAyLAorCTB4MjAsIDB4RkUsIDB4MUIsIDB4MDEsIDB4ODEsIDB4RkYsIDB4MUYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwgMHhDQSwgMHgwMSwgMHg0NiwgMHhGQywgMHgyOSwgMHgwNywKKwkweEIzLCAweEYxLCAweEQxLCAweDJCLCAweDgxLCAweDM0LCAweDlDLCAweEYxLCAweEI4LCAweDA2LCAweEI1LAorCTB4RkMsIDB4N0MsIDB4MDEsIDB4NzQsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTUsIDB4MDAsCisJMHhBQSwgMHhGRiwgMHhCMSwgMHgwMCwgMHhGRSwgMHhGRSwgMHgxMCwgMHgwMSwgMHg5MiwgMHhGRiwgMHg5NCwKKwkweEZELCAweDBELCAweDQ4LCAweENCLCAweDBBLCAweEUyLCAweEY5LCAweDA0LCAweDA0LCAweDc3LCAweEZELAorCTB4NjksIDB4MDEsIDB4NjIsIDB4RkYsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzOSwgMHhGRiwgMHhFNSwgMHgwMSwgMHgzMiwgMHhGQywgMHgwNiwgMHgwNywgMHhBQSwgMHhGMiwKKwkweDQ2LCAweDI0LCAweEM4LCAweDNBLCAweDkwLCAweEYyLCAweEQ2LCAweDA1LCAweDU3LCAweEZELCAweDE3LAorCTB4MDEsIDB4QTgsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEQsIDB4MDAsIDB4Q0MsIDB4RkYsCisJMHg1QSwgMHgwMCwgMHhBRiwgMHhGRiwgMHhDQSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgxQywgMHhGOSwgMHhCOCwKKwkweDQ1LCAweERBLCAweDExLCAweDYwLCAweEY3LCAweDMzLCAweDA1LCAweEU3LCAweEZDLCAweEE5LCAweDAxLAorCTB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsCisJMHhGRiwgMHhERiwgMHgwMSwgMHg1QSwgMHhGQywgMHg3RSwgMHgwNiwgMHg0NywgMHhGNCwgMHg5NCwgMHgxQywKKwkweDFGLCAweDQwLCAweDg1LCAweEY0LCAweDdELCAweDA0LCAweDM2LCAweEZFLCAweDkzLCAweDAwLCAweEVBLAorCTB4RkYsIDB4RjcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUIsIDB4RkYsIDB4MDksIDB4MDAsCisJMHg1NCwgMHgwMCwgMHhBNCwgMHhGRSwgMHhDOSwgMHgwMywgMHhBQSwgMHhGNSwgMHgwQywgMHg0MiwgMHg1NiwKKwkweDE5LCAweDFFLCAweEY1LCAweDJCLCAweDA2LCAweDdBLCAweEZDLCAweEQ0LCAweDAxLCAweDNBLCAweEZGLAorCTB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkUsCisJMHgwMSwgMHhCNCwgMHhGQywgMHhBNCwgMHgwNSwgMHg2MSwgMHhGNiwgMHhGQiwgMHgxNCwgMHg1MywgMHg0NCwKKwkweDg2LCAweEY3LCAweEI2LCAweDAyLCAweDQ5LCAweEZGLCAweEY3LCAweEZGLCAweDM3LCAweDAwLCAweEQ5LAorCTB4RkYsIDB4MEEsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4QzIsIDB4RkYsIDB4RTMsIDB4MDAsCisJMHhBRSwgMHhGRCwgMHg1MiwgMHgwNSwgMHg0NCwgMHhGMywgMHgyQSwgMHgzRCwgMHgwNiwgMHgyMSwgMHg0NywKKwkweEYzLCAweEQ4LCAweDA2LCAweDNDLCAweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTcsIDB4RkYsIDB4ODYsIDB4MDEsIDB4MzYsCisJMHhGRCwgMHg4OSwgMHgwNCwgMHhDRCwgMHhGOCwgMHhCNywgMHgwRCwgMHgzRCwgMHg0NywgMHg5MSwgMHhGQiwKKwkweDkxLCAweDAwLCAweDgzLCAweDAwLCAweDRBLCAweEZGLCAweDhDLCAweDAwLCAweEI5LCAweEZGLCAweDExLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4MUIsIDB4MDAsIDB4ODgsIDB4RkYsIDB4NTUsIDB4MDEsIDB4RjIsIDB4RkMsCisJMHg2NywgMHgwNiwgMHhFNCwgMHhGMSwgMHg0NCwgMHgzNywgMHhBQSwgMHgyOCwgMHgwNSwgMHhGMiwgMHgyNywKKwkweDA3LCAweDM2LCAweEZDLCAweERBLCAweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzMsIDB4RkYsIDB4M0QsIDB4MDEsIDB4RDYsIDB4RkQsIDB4NDYsCisJMHgwMywgMHg2MSwgMHhGQiwgMHgwMCwgMHgwNywgMHhCRiwgMHg0OCwgMHg5OCwgMHgwMCwgMHgyNiwgMHhGRSwKKwkweEQ1LCAweDAxLCAweDk1LCAweEZFLCAweEUzLCAweDAwLCAweDk2LCAweEZGLCAweDFBLCAweDAwLCAweEZELAorCTB4RkYsIDB4MkEsIDB4MDAsIDB4NUQsIDB4RkYsIDB4QTcsIDB4MDEsIDB4NzUsIDB4RkMsIDB4MDMsIDB4MDcsCisJMHg3RCwgMHhGMSwgMHg4QSwgMHgzMCwgMHhGRiwgMHgyRiwgMHg3RSwgMHhGMSwgMHgwQSwgMHgwNywgMHg2RSwKKwkweEZDLCAweEFDLCAweDAxLCAweDVBLCAweEZGLCAweDJCLCAweDAwLCAweEZELCAweEZGLCAweDFBLCAweDAwLAorCTB4OTQsIDB4RkYsIDB4RUEsIDB4MDAsIDB4ODcsIDB4RkUsIDB4RjAsIDB4MDEsIDB4RjUsIDB4RkQsIDB4MDUsCisJMHgwMSwgMHhDRSwgMHg0OCwgMHg4MywgMHgwNiwgMHg5NCwgMHhGQiwgMHgyQywgMHgwMywgMHhFNCwgMHhGRCwKKwkweDM3LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMzLAorCTB4MDAsIDB4NDIsIDB4RkYsIDB4RDcsIDB4MDEsIDB4MzgsIDB4RkMsIDB4MjksIDB4MDcsIDB4RjMsIDB4RjEsCisJMHgzRSwgMHgyOSwgMHhDNiwgMHgzNiwgMHhENCwgMHhGMSwgMHg3NywgMHgwNiwgMHhFNiwgMHhGQywgMHg1QywKKwkweDAxLCAweDg0LCAweEZGLCAweDFDLCAweDAwLCAweEZFLCAweEZGLCAweDEyLCAweDAwLCAweEI2LCAweEZGLAorCTB4OTMsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OUQsIDB4MDAsIDB4NjMsIDB4MDAsIDB4RUIsIDB4RkIsIDB4NjksCisJMHg0NywgMHgyRCwgMHgwRCwgMHhGRiwgMHhGOCwgMHg3MiwgMHgwNCwgMHg0MiwgMHhGRCwgMHg4MSwgMHgwMSwKKwkweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM3LAorCTB4RkYsIDB4RTYsIDB4MDEsIDB4M0EsIDB4RkMsIDB4RTIsIDB4MDYsIDB4MjgsIDB4RjMsIDB4OUUsIDB4MjEsCisJMHhDMCwgMHgzQywgMHgxRiwgMHhGMywgMHg2QywgMHgwNSwgMHg5RSwgMHhGRCwgMHhFRCwgMHgwMCwgMHhCRCwKKwkweEZGLCAweDA3LCAweDAwLCAweDAxLCAweDAwLCAweDBBLCAweDAwLCAweEQ3LCAweEZGLCAweDNFLCAweDAwLAorCTB4RUEsIDB4RkYsIDB4NjAsIDB4RkYsIDB4OEYsIDB4MDIsIDB4Q0QsIDB4RjcsIDB4OTksIDB4NDQsIDB4NjgsCisJMHgxNCwgMHg4RSwgMHhGNiwgMHg5MCwgMHgwNSwgMHhCQywgMHhGQywgMHhCQSwgMHgwMSwgMHg0MywgMHhGRiwKKwkweDMyLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDM5LCAweEZGLCAweEQ3LAorCTB4MDEsIDB4NzMsIDB4RkMsIDB4M0IsIDB4MDYsIDB4RjUsIDB4RjQsIDB4RUQsIDB4MTksIDB4QjcsIDB4NDEsCisJMHg3MSwgMHhGNSwgMHhFQiwgMHgwMywgMHg5MCwgMHhGRSwgMHg2MCwgMHgwMCwgMHgwNCwgMHgwMCwgMHhFRCwKKwkweEZGLCAweDA2LCAweDAwLCAweDA0LCAweDAwLCAweEY1LCAweEZGLCAweEVGLCAweEZGLCAweDg4LCAweDAwLAorCTB4NDksIDB4RkUsIDB4NUQsIDB4MDQsIDB4QjcsIDB4RjQsIDB4N0QsIDB4NDAsIDB4RkQsIDB4MUIsIDB4NkMsCisJMHhGNCwgMHg3MCwgMHgwNiwgMHg1RiwgMHhGQywgMHhERSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwKKwkweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMwLCAweDAwLCAweDQ4LCAweEZGLCAweEFELCAweDAxLCAweERELAorCTB4RkMsIDB4NDgsIDB4MDUsIDB4MzAsIDB4RjcsIDB4NkIsIDB4MTIsIDB4N0QsIDB4NDUsIDB4Q0YsIDB4RjgsCisJMHgwMSwgMHgwMiwgMHhCMiwgMHhGRiwgMHhCRCwgMHhGRiwgMHg1NCwgMHgwMCwgMHhDRSwgMHhGRiwgMHgwQywKKwkweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEFDLCAweEZGLCAweDBFLCAweDAxLCAweDY2LCAweEZELAorCTB4QkYsIDB4MDUsIDB4QUQsIDB4RjIsIDB4M0IsIDB4M0IsIDB4QjAsIDB4MjMsIDB4QzQsIDB4RjIsIDB4RkYsCisJMHgwNiwgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOCwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDAwLCAweDAwLCAweDI5LCAweDAwLCAweDYwLCAweEZGLCAweDZFLCAweDAxLCAweDZCLCAweEZELCAweDFELAorCTB4MDQsIDB4QUYsIDB4RjksIDB4NTEsIDB4MEIsIDB4RUMsIDB4NDcsIDB4MzMsIDB4RkQsIDB4QzEsIDB4RkYsCisJMHhGNywgMHgwMCwgMHgwQywgMHhGRiwgMHhBQSwgMHgwMCwgMHhBRCwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDIxLCAweDAwLCAweDc3LCAweEZGLCAweDc1LCAweDAxLCAweEJGLCAweEZDLCAweEFCLCAweDA2LAorCTB4QTYsIDB4RjEsIDB4MDUsIDB4MzUsIDB4NDAsIDB4MkIsIDB4QkYsIDB4RjEsIDB4MkEsIDB4MDcsIDB4NDIsCisJMHhGQywgMHhDRSwgMHgwMSwgMHg0OCwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDIwLCAweDAwLCAweDdFLCAweEZGLCAweDIxLCAweDAxLCAweDEyLCAweEZFLCAweEQxLCAweDAyLCAweDQ3LAorCTB4RkMsIDB4RDcsIDB4MDQsIDB4RjAsIDB4NDgsIDB4OEQsIDB4MDIsIDB4NDUsIDB4RkQsIDB4NEQsIDB4MDIsCisJMHg1NiwgMHhGRSwgMHgwMSwgMHgwMSwgMHg4QiwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwKKwkweDAwLCAweDUyLCAweEZGLCAweEJDLCAweDAxLCAweDU4LCAweEZDLCAweDFELCAweDA3LCAweDhFLCAweEYxLAorCTB4MTEsIDB4MkUsIDB4NkIsIDB4MzIsIDB4ODEsIDB4RjEsIDB4RTUsIDB4MDYsIDB4OTAsIDB4RkMsIDB4OTQsCisJMHgwMSwgMHg2NywgMHhGRiwgMHgyNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMCwgMHhGRiwKKwkweENDLCAweDAwLCAweEM2LCAweEZFLCAweDc5LCAweDAxLCAweEQyLCAweEZFLCAweDI2LCAweEZGLCAweDdDLAorCTB4NDgsIDB4QkUsIDB4MDgsIDB4QUUsIDB4RkEsIDB4QTAsIDB4MDMsIDB4QTksIDB4RkQsIDB4NTIsIDB4MDEsCisJMHg2QiwgMHhGRiwgMHgyNSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywKKwkweEZGLCAweEUwLCAweDAxLCAweDMyLCAweEZDLCAweDFDLCAweDA3LCAweDRCLCAweEYyLCAweEEwLCAweDI2LAorCTB4RjIsIDB4MzgsIDB4MkEsIDB4RjIsIDB4MjgsIDB4MDYsIDB4MUYsIDB4RkQsIDB4MzksIDB4MDEsIDB4OTYsCisJMHhGRiwgMHgxNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwRiwgMHgwMCwgMHhDMiwgMHhGRiwgMHg3NSwgMHgwMCwKKwkweDdBLCAweEZGLCAweDJCLCAweDAwLCAweDJELCAweDAxLCAweDYxLCAweEZBLCAweDk3LCAweDQ2LCAweEEwLAorCTB4MEYsIDB4MjAsIDB4RjgsIDB4REEsIDB4MDQsIDB4MTAsIDB4RkQsIDB4OTcsIDB4MDEsIDB4NTAsIDB4RkYsCisJMHgyRSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwKKwkweDAxLCAweDQ4LCAweEZDLCAweEIyLCAweDA2LCAweEI5LCAweEYzLCAweEYzLCAweDFFLCAweDk4LCAweDNFLAorCTB4Q0YsIDB4RjMsIDB4RjMsIDB4MDQsIDB4RUIsIDB4RkQsIDB4QkYsIDB4MDAsIDB4RDQsIDB4RkYsIDB4RkYsCisJMHhGRiwgMHgwMywgMHgwMCwgMHgwOCwgMHgwMCwgMHhFMiwgMHhGRiwgMHgyMSwgMHgwMCwgMHgyMywgMHgwMCwKKwkweEZBLCAweEZFLCAweDNBLCAweDAzLCAweDlELCAweEY2LCAweDUwLCAweDQzLCAweDAwLCAweDE3LCAweEM2LAorCTB4RjUsIDB4RTYsIDB4MDUsIDB4OTcsIDB4RkMsIDB4QzksIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzQsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRCwgMHhGRiwgMHhDQiwgMHgwMSwgMHg5MywKKwkweEZDLCAweEVGLCAweDA1LCAweEIwLCAweEY1LCAweDRCLCAweDE3LCAweDJBLCAweDQzLCAweDdELCAweEY2LAorCTB4NEQsIDB4MDMsIDB4RUYsIDB4RkUsIDB4MkEsIDB4MDAsIDB4MUUsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MDgsCisJMHgwMCwgMHgwMywgMHgwMCwgMHhGRSwgMHhGRiwgMHhENywgMHhGRiwgMHhCQSwgMHgwMCwgMHhGNCwgMHhGRCwKKwkweEU1LCAweDA0LCAweEU0LCAweEYzLCAweENBLCAweDNFLCAweEE3LCAweDFFLCAweENBLCAweEYzLCAweEFDLAorCTB4MDYsIDB4NEEsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHhGRiwgMHhGRiwgMHgyRSwgMHgwMCwgMHg0RiwgMHhGRiwgMHg5OSwgMHgwMSwgMHgwQiwgMHhGRCwgMHhFNiwKKwkweDA0LCAweDA4LCAweEY4LCAweEU3LCAweDBGLCAweDdDLCAweDQ2LCAweDM3LCAweEZBLCAweDQyLCAweDAxLAorCTB4MUYsIDB4MDAsIDB4ODEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4QzMsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgxNSwgMHgwMCwgMHg5OCwgMHhGRiwgMHgzNSwgMHgwMSwgMHgyNSwgMHhGRCwgMHgxRSwgMHgwNiwKKwkweDM1LCAweEYyLCAweDJFLCAweDM5LCAweDU1LCAweDI2LCAweDU2LCAweEYyLCAweDFBLCAweDA3LCAweDMxLAorCTB4RkMsIDB4RTEsIDB4MDEsIDB4M0MsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgyNiwgMHgwMCwgMHg2QSwgMHhGRiwgMHg1NSwgMHgwMSwgMHhBMywgMHhGRCwgMHhBRCwgMHgwMywgMHg5NCwKKwkweEZBLCAweEZGLCAweDA4LCAweDcwLCAweDQ4LCAweEYzLCAweEZFLCAweEVBLCAweEZFLCAweDZDLCAweDAxLAorCTB4Q0QsIDB4RkUsIDB4QzksIDB4MDAsIDB4QTEsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsCisJMHgwMCwgMHg2OSwgMHhGRiwgMHg5MSwgMHgwMSwgMHg5NCwgMHhGQywgMHhFMCwgMHgwNiwgMHg4NCwgMHhGMSwKKwkweEFGLCAweDMyLCAweENBLCAweDJELCAweDkyLCAweEYxLCAweDFGLCAweDA3LCAweDU2LCAweEZDLCAweEJFLAorCTB4MDEsIDB4NTEsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEEsIDB4RkYsCisJMHgwNCwgMHgwMSwgMHg1MCwgMHhGRSwgMHg1QSwgMHgwMiwgMHgyQywgMHhGRCwgMHhDNiwgMHgwMiwgMHhGMiwKKwkweDQ4LCAweDlCLCAweDA0LCAweDYxLCAweEZDLCAweEMzLCAweDAyLCAweDE5LCAweEZFLCAweDFFLCAweDAxLAorCTB4N0YsIDB4RkYsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDksCisJMHhGRiwgMHhDQywgMHgwMSwgMHg0NCwgMHhGQywgMHgyOSwgMHgwNywgMHhCOSwgMHhGMSwgMHg4OSwgMHgyQiwKKwkweEMzLCAweDM0LCAweEEwLCAweEYxLCAweEIxLCAweDA2LCAweEJBLCAweEZDLCAweDc5LCAweDAxLCAweDc2LAorCTB4RkYsIDB4MjEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MTQsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QUUsIDB4MDAsCisJMHgwNSwgMHhGRiwgMHgwMywgMHgwMSwgMHhBQSwgMHhGRiwgMHg2MywgMHhGRCwgMHhGRCwgMHg0NywgMHgwRSwKKwkweDBCLCAweEM4LCAweEY5LCAweDExLCAweDA0LCAweDcxLCAweEZELCAweDZDLCAweDAxLCAweDYxLCAweEZGLAorCTB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsCisJMHgwMSwgMHgzMywgMHhGQywgMHgwMywgMHgwNywgMHhCNywgMHhGMiwgMHhGQywgMHgyMywgMHgwMywgMHgzQiwKKwkweDlFLCAweEYyLCAweENCLCAweDA1LCAweDVGLCAweEZELCAweDEyLCAweDAxLCAweEFBLCAweEZGLCAweDBFLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MEMsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4NTcsIDB4MDAsIDB4QjYsIDB4RkYsCisJMHhCRSwgMHhGRiwgMHhFRCwgMHgwMSwgMHhGNSwgMHhGOCwgMHg5QiwgMHg0NSwgMHgyMiwgMHgxMiwgMHg0OCwKKwkweEY3LCAweDNELCAweDA1LCAweEUyLCAweEZDLCAweEFCLCAweDAxLCAweDQ5LCAweEZGLCAweDMwLCAweDAwLAorCTB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsIDB4NUMsCisJMHhGQywgMHg3OCwgMHgwNiwgMHg1QSwgMHhGNCwgMHg0OSwgMHgxQywgMHg0RSwgMHg0MCwgMHg5RSwgMHhGNCwKKwkweDZELCAweDA0LCAweDNGLCAweEZFLCAweDhFLCAweDAwLCAweEVELCAweEZGLCAweEY2LCAweEZGLCAweDA0LAorCTB4MDAsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4NUEsIDB4MDAsIDB4OUEsIDB4RkUsCisJMHhEQSwgMHgwMywgMHg4RCwgMHhGNSwgMHhFMSwgMHg0MSwgMHhBMSwgMHgxOSwgMHgwOSwgMHhGNSwgMHgzMywKKwkweDA2LCAweDc3LCAweEZDLCAweEQ2LCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLAorCTB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkMsIDB4MDEsIDB4QjgsIDB4RkMsIDB4OUEsCisJMHgwNSwgMHg3NywgMHhGNiwgMHhCMSwgMHgxNCwgMHg3NywgMHg0NCwgMHhBOSwgMHhGNywgMHhBMiwgMHgwMiwKKwkweDU0LCAweEZGLCAweEYxLCAweEZGLCAweDNBLCAweDAwLCAweEQ4LCAweEZGLCAweDBBLCAweDAwLCAweDAxLAorCTB4MDAsIDB4MDcsIDB4MDAsIDB4QzAsIDB4RkYsIDB4RTgsIDB4MDAsIDB4QTYsIDB4RkQsIDB4NUYsIDB4MDUsCisJMHgzMSwgMHhGMywgMHhGNiwgMHgzQywgMHg1MiwgMHgyMSwgMHgzNywgMHhGMywgMHhERCwgMHgwNiwgMHgzQiwKKwkweEZDLCAweEU2LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLAorCTB4MkIsIDB4MDAsIDB4NTgsIDB4RkYsIDB4ODMsIDB4MDEsIDB4M0MsIDB4RkQsIDB4N0UsIDB4MDQsIDB4RTYsCisJMHhGOCwgMHg3MiwgMHgwRCwgMHg1MiwgMHg0NywgMHhCRSwgMHhGQiwgMHg3QSwgMHgwMCwgMHg5MCwgMHgwMCwKKwkweDQzLCAweEZGLCAweDhGLCAweDAwLCAweEI3LCAweEZGLCAweDExLCAweDAwLCAweEZFLCAweEZGLCAweDFDLAorCTB4MDAsIDB4ODYsIDB4RkYsIDB4NTksIDB4MDEsIDB4RUMsIDB4RkMsIDB4NkYsIDB4MDYsIDB4REMsIDB4RjEsCisJMHgwNCwgMHgzNywgMHhGMywgMHgyOCwgMHhGQywgMHhGMSwgMHgyOCwgMHgwNywgMHgzNywgMHhGQywgMHhEOCwKKwkweDAxLCAweDQxLCAweEZGLCAweDMzLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIzLCAweDAwLAorCTB4NzQsIDB4RkYsIDB4M0EsIDB4MDEsIDB4REQsIDB4RkQsIDB4MzksIDB4MDMsIDB4N0IsIDB4RkIsIDB4QzEsCisJMHgwNiwgMHhDNywgMHg0OCwgMHhDRiwgMHgwMCwgMHgwRCwgMHhGRSwgMHhFMywgMHgwMSwgMHg4RSwgMHhGRSwKKwkweEU3LCAweDAwLCAweDk1LCAweEZGLCAweDFBLCAweDAwLCAweEZELCAweEZGLCAweDJBLCAweDAwLCAweDVDLAorCTB4RkYsIDB4QUEsIDB4MDEsIDB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsIDB4N0UsIDB4RjEsIDB4NDQsIDB4MzAsCisJMHg0NCwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwNywgMHgwNywgMHg3MSwgMHhGQywgMHhBQSwgMHgwMSwgMHg1QywKKwkweEZGLCAweDJBLCAweDAwLCAweEZELCAweEZGLCAweDFBLCAweDAwLCAweDk1LCAweEZGLCAweEU3LCAweDAwLAorCTB4OEUsIDB4RkUsIDB4RTMsIDB4MDEsIDB4MEQsIDB4RkUsIDB4Q0YsIDB4MDAsIDB4QzcsIDB4NDgsIDB4QzEsCisJMHgwNiwgMHg3QiwgMHhGQiwgMHgzOSwgMHgwMywgMHhERCwgMHhGRCwgMHgzQSwgMHgwMSwgMHg3NCwgMHhGRiwKKwkweDIzLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweEQ4LAorCTB4MDEsIDB4MzcsIDB4RkMsIDB4MjgsIDB4MDcsIDB4RkMsIDB4RjEsIDB4RjMsIDB4MjgsIDB4MDQsIDB4MzcsCisJMHhEQywgMHhGMSwgMHg2RiwgMHgwNiwgMHhFQywgMHhGQywgMHg1OSwgMHgwMSwgMHg4NiwgMHhGRiwgMHgxQywKKwkweDAwLCAweEZFLCAweEZGLCAweDExLCAweDAwLCAweEI3LCAweEZGLCAweDhGLCAweDAwLCAweDQzLCAweEZGLAorCTB4OTAsIDB4MDAsIDB4N0EsIDB4MDAsIDB4QkUsIDB4RkIsIDB4NTIsIDB4NDcsIDB4NzIsIDB4MEQsIDB4RTYsCisJMHhGOCwgMHg3RSwgMHgwNCwgMHgzQywgMHhGRCwgMHg4MywgMHgwMSwgMHg1OCwgMHhGRiwgMHgyQiwgMHgwMCwKKwkweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNCLAorCTB4RkMsIDB4REQsIDB4MDYsIDB4MzcsIDB4RjMsIDB4NTIsIDB4MjEsIDB4RjYsIDB4M0MsIDB4MzEsIDB4RjMsCisJMHg1RiwgMHgwNSwgMHhBNiwgMHhGRCwgMHhFOCwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwNywgMHgwMCwgMHgwMSwKKwkweDAwLCAweDBBLCAweDAwLCAweEQ4LCAweEZGLCAweDNBLCAweDAwLCAweEYxLCAweEZGLCAweDU0LCAweEZGLAorCTB4QTIsIDB4MDIsIDB4QTksIDB4RjcsIDB4NzcsIDB4NDQsIDB4QjEsIDB4MTQsIDB4NzcsIDB4RjYsIDB4OUEsCisJMHgwNSwgMHhCOCwgMHhGQywgMHhCQywgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweEZFLCAweEZGLCAweDM1LCAweDAwLCAweDNBLCAweEZGLCAweEQ2LCAweDAxLCAweDc3LCAweEZDLCAweDMzLAorCTB4MDYsIDB4MDksIDB4RjUsIDB4QTEsIDB4MTksIDB4RTEsIDB4NDEsIDB4OEQsIDB4RjUsIDB4REEsIDB4MDMsCisJMHg5QSwgMHhGRSwgMHg1QSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwgMHgwMCwgMHgwNCwKKwkweDAwLCAweEY2LCAweEZGLCAweEVELCAweEZGLCAweDhFLCAweDAwLCAweDNGLCAweEZFLCAweDZELCAweDA0LAorCTB4OUUsIDB4RjQsIDB4NEUsIDB4NDAsIDB4NDksIDB4MUMsIDB4NUEsIDB4RjQsIDB4NzgsIDB4MDYsIDB4NUMsCisJMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwKKwkweDMwLCAweDAwLCAweDQ5LCAweEZGLCAweEFCLCAweDAxLCAweEUyLCAweEZDLCAweDNELCAweDA1LCAweDQ4LAorCTB4RjcsIDB4MjIsIDB4MTIsIDB4OUIsIDB4NDUsIDB4RjUsIDB4RjgsIDB4RUQsIDB4MDEsIDB4QkUsIDB4RkYsCisJMHhCNiwgMHhGRiwgMHg1NywgMHgwMCwgMHhDRCwgMHhGRiwgMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRSwKKwkweDAwLCAweEFBLCAweEZGLCAweDEyLCAweDAxLCAweDVGLCAweEZELCAweENCLCAweDA1LCAweDlFLCAweEYyLAorCTB4MDMsIDB4M0IsIDB4RkMsIDB4MjMsIDB4QjcsIDB4RjIsIDB4MDMsIDB4MDcsIDB4MzMsIDB4RkMsIDB4RTUsCisJMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwKKwkweDYxLCAweEZGLCAweDZDLCAweDAxLCAweDcxLCAweEZELCAweDExLCAweDA0LCAweEM4LCAweEY5LCAweDBFLAorCTB4MEIsIDB4RkQsIDB4NDcsIDB4NjMsIDB4RkQsIDB4QUEsIDB4RkYsIDB4MDMsIDB4MDEsIDB4MDUsIDB4RkYsCisJMHhBRSwgMHgwMCwgMHhBQywgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMSwgMHgwMCwgMHg3NiwKKwkweEZGLCAweDc5LCAweDAxLCAweEJBLCAweEZDLCAweEIxLCAweDA2LCAweEEwLCAweEYxLCAweEMzLCAweDM0LAorCTB4ODksIDB4MkIsIDB4QjksIDB4RjEsIDB4MjksIDB4MDcsIDB4NDQsIDB4RkMsIDB4Q0MsIDB4MDEsIDB4NDksCisJMHhGRiwgMHgzMSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RiwgMHhGRiwKKwkweDFFLCAweDAxLCAweDE5LCAweEZFLCAweEMzLCAweDAyLCAweDYxLCAweEZDLCAweDlCLCAweDA0LCAweEYyLAorCTB4NDgsIDB4QzYsIDB4MDIsIDB4MkMsIDB4RkQsIDB4NUEsIDB4MDIsIDB4NTAsIDB4RkUsIDB4MDQsIDB4MDEsCisJMHg4QSwgMHhGRiwgMHgxRCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MSwgMHhGRiwgMHhCRSwKKwkweDAxLCAweDU2LCAweEZDLCAweDFGLCAweDA3LCAweDkyLCAweEYxLCAweENBLCAweDJELCAweEFGLCAweDMyLAorCTB4ODQsIDB4RjEsIDB4RTAsIDB4MDYsIDB4OTQsIDB4RkMsIDB4OTEsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgxNywgMHgwMCwgMHhBMSwgMHhGRiwgMHhDOSwgMHgwMCwgMHhDRCwgMHhGRSwKKwkweDZDLCAweDAxLCAweEVBLCAweEZFLCAweEYzLCAweEZFLCAweDcwLCAweDQ4LCAweEZGLCAweDA4LCAweDk0LAorCTB4RkEsIDB4QUQsIDB4MDMsIDB4QTMsIDB4RkQsIDB4NTUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjYsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQywgMHhGRiwgMHhFMSwgMHgwMSwgMHgzMSwKKwkweEZDLCAweDFBLCAweDA3LCAweDU2LCAweEYyLCAweDU1LCAweDI2LCAweDJFLCAweDM5LCAweDM1LCAweEYyLAorCTB4MUUsIDB4MDYsIDB4MjUsIDB4RkQsIDB4MzUsIDB4MDEsIDB4OTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwRiwgMHgwMCwgMHhDMywgMHhGRiwgMHg3MSwgMHgwMCwgMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwKKwkweDQyLCAweDAxLCAweDM3LCAweEZBLCAweDdDLCAweDQ2LCAweEU3LCAweDBGLCAweDA4LCAweEY4LCAweEU2LAorCTB4MDQsIDB4MEIsIDB4RkQsIDB4OTksIDB4MDEsIDB4NEYsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNCwgMHgwMSwgMHg0QSwgMHhGQywgMHhBQywKKwkweDA2LCAweENBLCAweEYzLCAweEE3LCAweDFFLCAweENBLCAweDNFLCAweEU0LCAweEYzLCAweEU1LCAweDA0LAorCTB4RjQsIDB4RkQsIDB4QkEsIDB4MDAsIDB4RDcsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDgsCisJMHgwMCwgMHhFMywgMHhGRiwgMHgxRSwgMHgwMCwgMHgyQSwgMHgwMCwgMHhFRiwgMHhGRSwgMHg0RCwgMHgwMywKKwkweDdELCAweEY2LCAweDJBLCAweDQzLCAweDRCLCAweDE3LCAweEIwLCAweEY1LCAweEVGLCAweDA1LCAweDkzLAorCTB4RkMsIDB4Q0IsIDB4MDEsIDB4M0QsIDB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkUsIDB4RkYsCisJMHgzNCwgMHgwMCwgMHgzRSwgMHhGRiwgMHhDOSwgMHgwMSwgMHg5NywgMHhGQywgMHhFNiwgMHgwNSwgMHhDNiwKKwkweEY1LCAweDAwLCAweDE3LCAweDUwLCAweDQzLCAweDlELCAweEY2LCAweDNBLCAweDAzLCAweEZBLCAweEZFLAorCTB4MjMsIDB4MDAsIDB4MjEsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHhENCwgMHhGRiwgMHhCRiwgMHgwMCwgMHhFQiwgMHhGRCwgMHhGMywgMHgwNCwgMHhDRiwgMHhGMywKKwkweDk4LCAweDNFLCAweEYzLCAweDFFLCAweEI5LCAweEYzLCAweEIyLCAweDA2LCAweDQ4LCAweEZDLCAweEU0LAorCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkUsIDB4MDAsCisJMHg1MCwgMHhGRiwgMHg5NywgMHgwMSwgMHgxMCwgMHhGRCwgMHhEQSwgMHgwNCwgMHgyMCwgMHhGOCwgMHhBMCwKKwkweDBGLCAweDk3LCAweDQ2LCAweDYxLCAweEZBLCAweDJELCAweDAxLCAweDJCLCAweDAwLCAweDdBLCAweEZGLAorCTB4NzUsIDB4MDAsIDB4QzIsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTYsCisJMHhGRiwgMHgzOSwgMHgwMSwgMHgxRiwgMHhGRCwgMHgyOCwgMHgwNiwgMHgyQSwgMHhGMiwgMHhGMiwgMHgzOCwKKwkweEEwLCAweDI2LCAweDRCLCAweEYyLCAweDFDLCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNDLAorCTB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkIsIDB4RkYsCisJMHg1MiwgMHgwMSwgMHhBOSwgMHhGRCwgMHhBMCwgMHgwMywgMHhBRSwgMHhGQSwgMHhCRSwgMHgwOCwgMHg3QywKKwkweDQ4LCAweDI2LCAweEZGLCAweEQyLCAweEZFLCAweDc5LCAweDAxLCAweEM2LCAweEZFLCAweENDLCAweDAwLAorCTB4QTAsIDB4RkYsIDB4MTcsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjcsIDB4RkYsIDB4OTQsCisJMHgwMSwgMHg5MCwgMHhGQywgMHhFNSwgMHgwNiwgMHg4MSwgMHhGMSwgMHg2QiwgMHgzMiwgMHgxMSwgMHgyRSwKKwkweDhFLCAweEYxLCAweDFELCAweDA3LCAweDU4LCAweEZDLCAweEJDLCAweDAxLCAweDUyLCAweEZGLCAweDJFLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MUQsIDB4MDAsIDB4OEIsIDB4RkYsIDB4MDEsIDB4MDEsIDB4NTYsIDB4RkUsCisJMHg0RCwgMHgwMiwgMHg0NSwgMHhGRCwgMHg4RCwgMHgwMiwgMHhGMCwgMHg0OCwgMHhENywgMHgwNCwgMHg0NywKKwkweEZDLCAweEQxLCAweDAyLCAweDEyLCAweEZFLCAweDIxLCAweDAxLCAweDdFLCAweEZGLCAweDIwLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDgsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4NDIsCisJMHhGQywgMHgyQSwgMHgwNywgMHhCRiwgMHhGMSwgMHg0MCwgMHgyQiwgMHgwNSwgMHgzNSwgMHhBNiwgMHhGMSwKKwkweEFCLCAweDA2LCAweEJGLCAweEZDLCAweDc1LCAweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLAorCTB4RkYsIDB4MTQsIDB4MDAsIDB4QUQsIDB4RkYsIDB4QUEsIDB4MDAsIDB4MEMsIDB4RkYsIDB4RjcsIDB4MDAsCisJMHhDMSwgMHhGRiwgMHgzMywgMHhGRCwgMHhFQywgMHg0NywgMHg1MSwgMHgwQiwgMHhBRiwgMHhGOSwgMHgxRCwKKwkweDA0LCAweDZCLCAweEZELCAweDZFLCAweDAxLCAweDYwLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4RkYsCisJMHgwNiwgMHhDNCwgMHhGMiwgMHhCMCwgMHgyMywgMHgzQiwgMHgzQiwgMHhBRCwgMHhGMiwgMHhCRiwgMHgwNSwKKwkweDY2LCAweEZELCAweDBFLCAweDAxLCAweEFDLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDBDLAorCTB4MDAsIDB4Q0UsIDB4RkYsIDB4NTQsIDB4MDAsIDB4QkQsIDB4RkYsIDB4QjIsIDB4RkYsIDB4MDEsIDB4MDIsCisJMHhDRiwgMHhGOCwgMHg3RCwgMHg0NSwgMHg2QiwgMHgxMiwgMHgzMCwgMHhGNywgMHg0OCwgMHgwNSwgMHhERCwKKwkweEZDLCAweEFELCAweDAxLCAweDQ4LCAweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLAorCTB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REUsIDB4MDEsIDB4NUYsIDB4RkMsIDB4NzAsIDB4MDYsIDB4NkMsCisJMHhGNCwgMHhGRCwgMHgxQiwgMHg3RCwgMHg0MCwgMHhCNywgMHhGNCwgMHg1RCwgMHgwNCwgMHg0OSwgMHhGRSwKKwkweDg4LCAweDAwLCAweEVGLCAweEZGLCAweEY1LCAweEZGLCAweDA0LCAweDAwLCAweDA2LCAweDAwLCAweEVELAorCTB4RkYsIDB4MDQsIDB4MDAsIDB4NjAsIDB4MDAsIDB4OTAsIDB4RkUsIDB4RUIsIDB4MDMsIDB4NzEsIDB4RjUsCisJMHhCNywgMHg0MSwgMHhFRCwgMHgxOSwgMHhGNSwgMHhGNCwgMHgzQiwgMHgwNiwgMHg3MywgMHhGQywgMHhENywKKwkweDAxLCAweDM5LCAweEZGLCAweDM1LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMyLCAweDAwLAorCTB4NDMsIDB4RkYsIDB4QkEsIDB4MDEsIDB4QkMsIDB4RkMsIDB4OTAsIDB4MDUsIDB4OEUsIDB4RjYsIDB4NjgsCisJMHgxNCwgMHg5OSwgMHg0NCwgMHhDRCwgMHhGNywgMHg4RiwgMHgwMiwgMHg2MCwgMHhGRiwgMHhFQSwgMHhGRiwKKwkweDNFLCAweDAwLCAweEQ3LCAweEZGLCAweDBBLCAweDAwLCAweDAxLCAweDAwLCAweDA3LCAweDAwLCAweEJELAorCTB4RkYsIDB4RUQsIDB4MDAsIDB4OUUsIDB4RkQsIDB4NkMsIDB4MDUsIDB4MUYsIDB4RjMsIDB4QzAsIDB4M0MsCisJMHg5RSwgMHgyMSwgMHgyOCwgMHhGMywgMHhFMiwgMHgwNiwgMHgzQSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywKKwkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDU5LCAweEZGLAorCTB4ODEsIDB4MDEsIDB4NDIsIDB4RkQsIDB4NzIsIDB4MDQsIDB4RkYsIDB4RjgsIDB4MkQsIDB4MEQsIDB4NjksCisJMHg0NywgMHhFQiwgMHhGQiwgMHg2MywgMHgwMCwgMHg5RCwgMHgwMCwgMHgzQywgMHhGRiwgMHg5MywgMHgwMCwKKwkweEI2LCAweEZGLCAweDEyLCAweDAwLCAweEZFLCAweEZGLCAweDFDLCAweDAwLCAweDg0LCAweEZGLCAweDVDLAorCTB4MDEsIDB4RTYsIDB4RkMsIDB4NzcsIDB4MDYsIDB4RDQsIDB4RjEsIDB4QzYsIDB4MzYsIDB4M0UsIDB4MjksCisJMHhGMywgMHhGMSwgMHgyOSwgMHgwNywgMHgzOCwgMHhGQywgMHhENywgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMywKKwkweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc2LCAweEZGLCAweDM3LCAweDAxLAorCTB4RTQsIDB4RkQsIDB4MkMsIDB4MDMsIDB4OTQsIDB4RkIsIDB4ODMsIDB4MDYsIDB4Q0UsIDB4NDgsIDB4MDUsCisJMHgwMSwgMHhGNSwgMHhGRCwgMHhGMCwgMHgwMSwgMHg4NywgMHhGRSwgMHhFQSwgMHgwMCwgMHg5NCwgMHhGRiwKKwkweDFBLCAweDAwLCAweEZELCAweEZGLCAweDJCLCAweDAwLCAweDVBLCAweEZGLCAweEFDLCAweDAxLCAweDZFLAorCTB4RkMsIDB4MEEsIDB4MDcsIDB4N0UsIDB4RjEsIDB4RkYsIDB4MkYsIDB4OEEsIDB4MzAsIDB4N0QsIDB4RjEsCisJMHgwMywgMHgwNywgMHg3NSwgMHhGQywgMHhBNywgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDFBLCAweDAwLCAweDk2LCAweEZGLCAweEUzLCAweDAwLCAweDk1LCAweEZFLCAweEQ1LCAweDAxLAorCTB4MjYsIDB4RkUsIDB4OTgsIDB4MDAsIDB4QkYsIDB4NDgsIDB4MDAsIDB4MDcsIDB4NjEsIDB4RkIsIDB4NDYsCisJMHgwMywgMHhENiwgMHhGRCwgMHgzRCwgMHgwMSwgMHg3MywgMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZELCAweEZGLCAweDMzLCAweDAwLCAweDQxLCAweEZGLCAweERBLCAweDAxLCAweDM2LCAweEZDLCAweDI3LAorCTB4MDcsIDB4MDUsIDB4RjIsIDB4QUEsIDB4MjgsIDB4NDQsIDB4MzcsIDB4RTQsIDB4RjEsIDB4NjcsIDB4MDYsCisJMHhGMiwgMHhGQywgMHg1NSwgMHgwMSwgMHg4OCwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxMSwKKwkweDAwLCAweEI5LCAweEZGLCAweDhDLCAweDAwLCAweDRBLCAweEZGLCAweDgzLCAweDAwLCAweDkxLCAweDAwLAorCTB4OTEsIDB4RkIsIDB4M0QsIDB4NDcsIDB4QjcsIDB4MEQsIDB4Q0QsIDB4RjgsIDB4ODksIDB4MDQsIDB4MzYsCisJMHhGRCwgMHg4NiwgMHgwMSwgMHg1NywgMHhGRiwgMHgyQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU2LCAweDAxLCAweDNDLCAweEZDLCAweEQ4LCAweDA2LCAweDQ3LAorCTB4RjMsIDB4MDYsIDB4MjEsIDB4MkEsIDB4M0QsIDB4NDQsIDB4RjMsIDB4NTIsIDB4MDUsIDB4QUUsIDB4RkQsCisJMHhFMywgMHgwMCwgMHhDMiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhEOSwKKwkweEZGLCAweDM3LCAweDAwLCAweEY3LCAweEZGLCAweDQ5LCAweEZGLCAweEI2LCAweDAyLCAweDg2LCAweEY3LAorCTB4NTMsIDB4NDQsIDB4RkIsIDB4MTQsIDB4NjEsIDB4RjYsIDB4QTQsIDB4MDUsIDB4QjQsIDB4RkMsIDB4QkUsCisJMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwKKwkweDNBLCAweEZGLCAweEQ0LCAweDAxLCAweDdBLCAweEZDLCAweDJCLCAweDA2LCAweDFFLCAweEY1LCAweDU2LAorCTB4MTksIDB4MEMsIDB4NDIsIDB4QUEsIDB4RjUsIDB4QzksIDB4MDMsIDB4QTQsIDB4RkUsIDB4NTQsIDB4MDAsCisJMHgwOSwgMHgwMCwgMHhFQiwgMHhGRiwgMHgwNiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGNywgMHhGRiwgMHhFQSwKKwkweEZGLCAweDkzLCAweDAwLCAweDM2LCAweEZFLCAweDdELCAweDA0LCAweDg1LCAweEY0LCAweDFGLCAweDQwLAorCTB4OTQsIDB4MUMsIDB4NDcsIDB4RjQsIDB4N0UsIDB4MDYsIDB4NUEsIDB4RkMsIDB4REYsIDB4MDEsIDB4MzcsCisJMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0QSwgMHhGRiwKKwkweEE5LCAweDAxLCAweEU3LCAweEZDLCAweDMzLCAweDA1LCAweDYwLCAweEY3LCAweERBLCAweDExLCAweEI4LAorCTB4NDUsIDB4MUMsIDB4RjksIDB4RDgsIDB4MDEsIDB4Q0EsIDB4RkYsIDB4QUYsIDB4RkYsIDB4NUEsIDB4MDAsCisJMHhDQywgMHhGRiwgMHgwRCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRiwgMHgwMCwgMHhBOCwgMHhGRiwgMHgxNywKKwkweDAxLCAweDU3LCAweEZELCAweEQ2LCAweDA1LCAweDkwLCAweEYyLCAweEM4LCAweDNBLCAweDQ2LCAweDI0LAorCTB4QUEsIDB4RjIsIDB4MDYsIDB4MDcsIDB4MzIsIDB4RkMsIDB4RTUsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyOCwgMHgwMCwgMHg2MiwgMHhGRiwgMHg2OSwgMHgwMSwKKwkweDc3LCAweEZELCAweDA0LCAweDA0LCAweEUyLCAweEY5LCAweENCLCAweDBBLCAweDBELCAweDQ4LCAweDk0LAorCTB4RkQsIDB4OTIsIDB4RkYsIDB4MTAsIDB4MDEsIDB4RkUsIDB4RkUsIDB4QjEsIDB4MDAsIDB4QUEsIDB4RkYsCisJMHgxNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgyMiwgMHgwMCwgMHg3NCwgMHhGRiwgMHg3QywgMHgwMSwgMHhCNSwKKwkweEZDLCAweEI4LCAweDA2LCAweDlDLCAweEYxLCAweDgxLCAweDM0LCAweEQxLCAweDJCLCAweEIzLCAweEYxLAorCTB4MjksIDB4MDcsIDB4NDYsIDB4RkMsIDB4Q0EsIDB4MDEsIDB4NEEsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHgxQiwgMHgwMSwgMHgyMCwgMHhGRSwKKwkweEI2LCAweDAyLCAweDdBLCAweEZDLCAweDVGLCAweDA0LCAweEY0LCAweDQ4LCAweEZGLCAweDAyLCAweDEzLAorCTB4RkQsIDB4NjcsIDB4MDIsIDB4NDksIDB4RkUsIDB4MDcsIDB4MDEsIDB4ODgsIDB4RkYsIDB4MUQsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgyRSwgMHgwMCwgMHg1MCwgMHhGRiwgMHhDMCwgMHgwMSwgMHg1MywgMHhGQywgMHgyMSwKKwkweDA3LCAweDk2LCAweEYxLCAweDgyLCAweDJELCAweEYyLCAweDMyLCAweDg2LCAweEYxLCAweERCLCAweDA2LAorCTB4OTksIDB4RkMsIDB4OEUsIDB4MDEsIDB4NkEsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTYsCisJMHgwMCwgMHhBMiwgMHhGRiwgMHhDNSwgMHgwMCwgMHhENCwgMHhGRSwgMHg1RiwgMHgwMSwgMHgwMywgMHhGRiwKKwkweEJGLCAweEZFLCAweDYzLCAweDQ4LCAweDQwLCAweDA5LCAweDdCLCAweEZBLCAweEI5LCAweDAzLCAweDlELAorCTB4RkQsIDB4NTgsIDB4MDEsIDB4NjksIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNywgMHgwNywgMHg2MSwKKwkweEYyLCAweDBBLCAweDI2LCAweDZBLCAweDM5LCAweDQxLCAweEYyLCAweDE1LCAweDA2LCAweDJDLCAweEZELAorCTB4MzEsIDB4MDEsIDB4OUIsIDB4RkYsIDB4MTQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QzQsCisJMHhGRiwgMHg2RSwgMHgwMCwgMHg4NywgMHhGRiwgMHgxMywgMHgwMCwgMHg1OCwgMHgwMSwgMHgwRCwgMHhGQSwKKwkweDYxLCAweDQ2LCAweDJELCAweDEwLCAweEYwLCAweEY3LCAweEYxLCAweDA0LCAweDA1LCAweEZELCAweDlDLAorCTB4MDEsIDB4NEUsIDB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzNiwgMHhGRiwgMHhFMywgMHgwMSwgMHg0QywgMHhGQywgMHhBNiwgMHgwNiwgMHhEQiwgMHhGMywgMHg1QiwKKwkweDFFLCAweEZDLCAweDNFLCAweEZBLCAweEYzLCAweEQ3LCAweDA0LCAweEZELCAweEZELCAweEI0LCAweDAwLAorCTB4RDksIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RTQsIDB4RkYsIDB4MUIsCisJMHgwMCwgMHgzMCwgMHgwMCwgMHhFNCwgMHhGRSwgMHg1RiwgMHgwMywgMHg1RSwgMHhGNiwgMHgwMiwgMHg0MywKKwkweDk2LCAweDE3LCAweDlCLCAweEY1LCAweEY4LCAweDA1LCAweDhGLCAweEZDLCAweENDLCAweDAxLCAweDNELAorCTB4RkYsIDB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0UsIDB4RkYsCisJMHhDOCwgMHgwMSwgMHg5QiwgMHhGQywgMHhERCwgMHgwNSwgMHhEQywgMHhGNSwgMHhCNiwgMHgxNiwgMHg3NywKKwkweDQzLCAweEJELCAweEY2LCAweDI4LCAweDAzLCAweDA1LCAweEZGLCAweDFELCAweDAwLCAweDI1LCAweDAwLAorCTB4RTEsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RDIsIDB4RkYsIDB4QzQsCisJMHgwMCwgMHhFMiwgMHhGRCwgMHgwMSwgMHgwNSwgMHhCQSwgMHhGMywgMHg2NCwgMHgzRSwgMHgzRiwgMHgxRiwKKwkweEE4LCAweEYzLCAweEI4LCAweDA2LCAweDQ2LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkQsIDB4MDAsIDB4NTEsIDB4RkYsIDB4OTUsIDB4MDEsCisJMHgxNSwgMHhGRCwgMHhDRiwgMHgwNCwgMHgzOSwgMHhGOCwgMHg1OSwgMHgwRiwgMHhBRiwgMHg0NiwgMHg4QiwKKwkweEZBLCAweDE3LCAweDAxLCAweDM4LCAweDAwLCAweDczLCAweEZGLCAweDc4LCAweDAwLCAweEMwLCAweEZGLAorCTB4MEYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTQsIDB4RkYsIDB4M0QsIDB4MDEsIDB4MTgsCisJMHhGRCwgMHgzMiwgMHgwNiwgMHgxRiwgMHhGMiwgMHhCNSwgMHgzOCwgMHhFQiwgMHgyNiwgMHg0MCwgMHhGMiwKKwkweDFFLCAweDA3LCAweDMyLCAweEZDLCAweERGLCAweDAxLCAweDNELCAweEZGLCAweDM1LCAweDAwLCAweEZELAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4NkMsIDB4RkYsIDB4NEYsIDB4MDEsIDB4QjAsIDB4RkQsCisJMHg5MywgMHgwMywgMHhDNywgMHhGQSwgMHg3RCwgMHgwOCwgMHg4NiwgMHg0OCwgMHg1QSwgMHhGRiwgMHhCQSwKKwkweEZFLCAweDg2LCAweDAxLCAweEJGLCAweEZFLCAweENGLCAweDAwLCAweDlFLCAweEZGLCAweDE3LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MjcsIDB4MDAsIDB4NjYsIDB4RkYsIDB4OTcsIDB4MDEsIDB4OEMsIDB4RkMsIDB4RUEsCisJMHgwNiwgMHg4MCwgMHhGMSwgMHgyNiwgMHgzMiwgMHg1OCwgMHgyRSwgMHg4QiwgMHhGMSwgMHgxQiwgMHgwNywKKwkweDVCLCAweEZDLCAweEJBLCAweDAxLCAweDUzLCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweDFDLAorCTB4MDAsIDB4OEMsIDB4RkYsIDB4RkUsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0YsIDB4MDIsIDB4NUUsIDB4RkQsCisJMHg1NCwgMHgwMiwgMHhFQywgMHg0OCwgMHgxMywgMHgwNSwgMHgyRSwgMHhGQywgMHhERSwgMHgwMiwgMHgwQywKKwkweEZFLCAweDI0LCAweDAxLCAweDdELCAweEZGLCAweDIwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLAorCTB4MzEsIDB4MDAsIDB4NDcsIDB4RkYsIDB4Q0YsIDB4MDEsIDB4NDAsIDB4RkMsIDB4MkEsIDB4MDcsIDB4QzYsCisJMHhGMSwgMHhGNywgMHgyQSwgMHg0NiwgMHgzNSwgMHhBQiwgMHhGMSwgMHhBNCwgMHgwNiwgMHhDNCwgMHhGQywKKwkweDcyLCAweDAxLCAweDc5LCAweEZGLCAweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDE0LCAweDAwLCAweEFFLAorCTB4RkYsIDB4QTcsIDB4MDAsIDB4MTIsIDB4RkYsIDB4RUEsIDB4MDAsIDB4RDksIDB4RkYsIDB4MDMsIDB4RkQsCisJMHhEQywgMHg0NywgMHg5NSwgMHgwQiwgMHg5NiwgMHhGOSwgMHgyOSwgMHgwNCwgMHg2NSwgMHhGRCwgMHg3MSwKKwkweDAxLCAweDVGLCAweEZGLCAweDI5LCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLAorCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzQsIDB4RkMsIDB4RkIsIDB4MDYsIDB4RDIsIDB4RjIsIDB4NjQsCisJMHgyMywgMHg3MywgMHgzQiwgMHhCQywgMHhGMiwgMHhCNCwgMHgwNSwgMHg2RSwgMHhGRCwgMHgwOSwgMHgwMSwKKwkweEFGLCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEQwLCAweEZGLCAweDUxLAorCTB4MDAsIDB4QzMsIDB4RkYsIDB4QTYsIDB4RkYsIDB4MTYsIDB4MDIsIDB4QTksIDB4RjgsIDB4NUMsIDB4NDUsCisJMHhCMiwgMHgxMiwgMHgxOSwgMHhGNywgMHg1MiwgMHgwNSwgMHhEOCwgMHhGQywgMHhBRiwgMHgwMSwgMHg0NywKKwkweEZGLCAweDMwLCAweDAwLCAweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLAorCTB4REQsIDB4MDEsIDB4NjIsIDB4RkMsIDB4NjksIDB4MDYsIDB4N0YsIDB4RjQsIDB4QjIsIDB4MUIsIDB4QUIsCisJMHg0MCwgMHhEMCwgMHhGNCwgMHg0RSwgMHgwNCwgMHg1MywgMHhGRSwgMHg4MywgMHgwMCwgMHhGMiwgMHhGRiwKKwkweEY0LCAweEZGLCAweDA1LCAweDAwLCAweDA2LCAweDAwLCAweEVFLCAweEZGLCAweDAxLCAweDAwLCAweDY2LAorCTB4MDAsIDB4ODUsIDB4RkUsIDB4RkMsIDB4MDMsIDB4NTUsIDB4RjUsIDB4OEMsIDB4NDEsIDB4MzgsIDB4MUEsCisJMHhFMSwgMHhGNCwgMHg0MywgMHgwNiwgMHg3MCwgMHhGQywgMHhEOCwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwKKwkweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEI5LCAweDAxLAorCTB4QzEsIDB4RkMsIDB4ODYsIDB4MDUsIDB4QTUsIDB4RjYsIDB4MUUsIDB4MTQsIDB4QkEsIDB4NDQsIDB4RjAsCisJMHhGNywgMHg3QiwgMHgwMiwgMHg2QiwgMHhGRiwgMHhFNCwgMHhGRiwgMHg0MSwgMHgwMCwgMHhENiwgMHhGRiwKKwkweDBCLCAweDAwLCAweDAxLCAweDAwLCAweDA4LCAweDAwLCAweEJCLCAweEZGLCAweEYxLCAweDAwLCAweDk2LAorCTB4RkQsIDB4NzgsIDB4MDUsIDB4MEUsIDB4RjMsIDB4OEEsIDB4M0MsIDB4RUEsIDB4MjEsIDB4MTksIDB4RjMsCisJMHhFNiwgMHgwNiwgMHgzOCwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDAwLCAweDAwLCAweDJCLCAweDAwLCAweDVBLCAweEZGLCAweDdFLCAweDAxLCAweDQ4LCAweEZELAorCTB4NjYsIDB4MDQsIDB4MTgsIDB4RjksIDB4RTgsIDB4MEMsIDB4N0MsIDB4NDcsIDB4MTksIDB4RkMsIDB4NEQsCisJMHgwMCwgMHhBOSwgMHgwMCwgMHgzNSwgMHhGRiwgMHg5NiwgMHgwMCwgMHhCNSwgMHhGRiwgMHgxMiwgMHgwMCwKKwkweEZFLCAweEZGLCAweDFELCAweDAwLCAweDgyLCAweEZGLCAweDYwLCAweDAxLCAweEUwLCAweEZDLCAweDdGLAorCTB4MDYsIDB4Q0MsIDB4RjEsIDB4ODUsIDB4MzYsIDB4ODcsIDB4MjksIDB4RUIsIDB4RjEsIDB4MkEsIDB4MDcsCisJMHgzOSwgMHhGQywgMHhENiwgMHgwMSwgMHg0MywgMHhGRiwgMHgzMywgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwKKwkweDAwLCAweDIyLCAweDAwLCAweDc3LCAweEZGLCAweDM0LCAweDAxLCAweEVBLCAweEZELCAweDFGLCAweDAzLAorCTB4QUUsIDB4RkIsIDB4NDUsIDB4MDYsIDB4RDUsIDB4NDgsIDB4M0MsIDB4MDEsIDB4REMsIDB4RkQsIDB4RkQsCisJMHgwMSwgMHg4MCwgMHhGRSwgMHhFRCwgMHgwMCwgMHg5MywgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDJCLCAweDAwLCAweDU5LCAweEZGLCAweEFFLCAweDAxLCAweDZBLCAweEZDLCAweDBELCAweDA3LCAweDgwLAorCTB4RjEsIDB4QjgsIDB4MkYsIDB4Q0YsIDB4MzAsIDB4N0QsIDB4RjEsIDB4RkYsIDB4MDYsIDB4NzgsIDB4RkMsCisJMHhBNSwgMHgwMSwgMHg1RiwgMHhGRiwgMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5OCwKKwkweEZGLCAweEUwLCAweDAwLCAweDlDLCAweEZFLCAweEM4LCAweDAxLCAweDNGLCAweEZFLCAweDYyLCAweDAwLAorCTB4QjgsIDB4NDgsIDB4M0YsIDB4MDcsIDB4NDcsIDB4RkIsIDB4NTMsIDB4MDMsIDB4RDAsIDB4RkQsIDB4NDAsCisJMHgwMSwgMHg3MiwgMHhGRiwgMHgyMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweDQwLCAweEZGLCAweERCLCAweDAxLCAweDM1LCAweEZDLCAweDI2LCAweDA3LCAweDBFLCAweEYyLCAweDYwLAorCTB4MjgsIDB4ODIsIDB4MzcsIDB4RUQsIDB4RjEsIDB4NUUsIDB4MDYsIDB4RjgsIDB4RkMsIDB4NTEsIDB4MDEsCisJMHg4QSwgMHhGRiwgMHgxQSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgxMSwgMHgwMCwgMHhCQSwgMHhGRiwgMHg4OSwKKwkweDAwLCAweDUxLCAweEZGLCAweDc3LCAweDAwLCAweEE3LCAweDAwLCAweDY0LCAweEZCLCAweDI2LCAweDQ3LAorCTB4RkMsIDB4MEQsIDB4QjQsIDB4RjgsIDB4OTUsIDB4MDQsIDB4MzEsIDB4RkQsIDB4ODgsIDB4MDEsIDB4NTYsCisJMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwKKwkweEU2LCAweDAxLCAweDNFLCAweEZDLCAweEQzLCAweDA2LCAweDU2LCAweEYzLCAweEJBLCAweDIwLCAweDYxLAorCTB4M0QsIDB4NTYsIDB4RjMsIDB4NDUsIDB4MDUsIDB4QjcsIDB4RkQsIDB4REUsIDB4MDAsIDB4QzUsIDB4RkYsCisJMHgwNSwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhEQiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRSwKKwkweEZGLCAweDNELCAweEZGLCAweEM5LCAweDAyLCAweDY0LCAweEY3LCAweDJGLCAweDQ0LCAweDQ0LCAweDE1LAorCTB4NEEsIDB4RjYsIDB4QUQsIDB4MDUsIDB4QUYsIDB4RkMsIDB4QzAsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzIsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhEMywgMHgwMSwKKwkweDdELCAweEZDLCAweDIzLCAweDA2LCAweDMyLCAweEY1LCAweDBDLCAweDE5LCAweDM4LCAweDQyLCAweEM3LAorCTB4RjUsIDB4QjgsIDB4MDMsIDB4QUYsIDB4RkUsIDB4NEUsIDB4MDAsIDB4MEMsIDB4MDAsIDB4RUEsIDB4RkYsCisJMHgwNiwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhFNywgMHhGRiwgMHg5OSwgMHgwMCwgMHgyQywKKwkweEZFLCAweDhDLCAweDA0LCAweDZELCAweEY0LCAweEYwLCAweDNGLCAweEUwLCAweDFDLCAweDM0LCAweEY0LAorCTB4ODUsIDB4MDYsIDB4NTcsIDB4RkMsIDB4RTAsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHhGRiwgMHhGRiwgMHgyRiwgMHgwMCwgMHg0QSwgMHhGRiwgMHhBNywgMHgwMSwgMHhFQywgMHhGQywKKwkweDI4LCAweDA1LCAweDc3LCAweEY3LCAweDkyLCAweDExLCAweEQ3LCAweDQ1LCAweDQzLCAweEY5LCAweEMzLAorCTB4MDEsIDB4RDYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NUUsIDB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHhBNiwgMHhGRiwgMHgxQiwgMHgwMSwgMHg1MCwgMHhGRCwgMHhFMSwKKwkweDA1LCAweDgyLCAweEYyLCAweDhGLCAweDNBLCAweDkyLCAweDI0LCAweDlELCAweEYyLCAweDA5LCAweDA3LAorCTB4MzIsIDB4RkMsIDB4RTQsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHgyOCwgMHgwMCwgMHg2MywgMHhGRiwgMHg2NiwgMHgwMSwgMHg3RCwgMHhGRCwgMHhGOCwgMHgwMywKKwkweEZCLCAweEY5LCAweDg5LCAweDBBLCAweDFELCAweDQ4LCAweEM1LCAweEZELCAweDdBLCAweEZGLCAweDFELAorCTB4MDEsIDB4RjcsIDB4RkUsIDB4QjQsIDB4MDAsIDB4QTksIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgyMywgMHgwMCwgMHg3MiwgMHhGRiwgMHg3RiwgMHgwMSwgMHhCMCwgMHhGQywgMHhCRSwgMHgwNiwgMHg5NywKKwkweEYxLCAweDNGLCAweDM0LCAweDE5LCAweDJDLCAweEFELCAweEYxLCAweDI4LCAweDA3LCAweDQ4LCAweEZDLAorCTB4QzksIDB4MDEsIDB4NEIsIDB4RkYsIDB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsCisJMHgwMCwgMHg4MiwgMHhGRiwgMHgxOCwgMHgwMSwgMHgyNywgMHhGRSwgMHhBOSwgMHgwMiwgMHg5NCwgMHhGQywKKwkweDI0LCAweDA0LCAweEY1LCAweDQ4LCAweDM5LCAweDAzLCAweEY5LCAweEZDLCAweDc0LCAweDAyLCAweDQyLAorCTB4RkUsIDB4MEIsIDB4MDEsIDB4ODcsIDB4RkYsIDB4MUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsCisJMHg0RiwgMHhGRiwgMHhDMiwgMHgwMSwgMHg1MSwgMHhGQywgMHgyMywgMHgwNywgMHg5QSwgMHhGMSwgMHgzQSwKKwkweDJELCAweDM1LCAweDMzLCAweDg5LCAweEYxLCAweEQ1LCAweDA2LCAweDlELCAweEZDLCAweDhCLCAweDAxLAorCTB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzIsCisJMHgwMCwgMHhEQiwgMHhGRSwgMHg1MiwgMHgwMSwgMHgxQiwgMHhGRiwgMHg4RCwgMHhGRSwgMHg1NywgMHg0OCwKKwkweDgxLCAweDA5LCAweDYxLCAweEZBLCAweEM2LCAweDAzLCAweDk2LCAweEZELCAweDVCLCAweDAxLCAweDY4LAorCTB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsCisJMHhFMiwgMHgwMSwgMHgzMSwgMHhGQywgMHgxNSwgMHgwNywgMHg2RCwgMHhGMiwgMHhCRiwgMHgyNSwgMHhBNSwKKwkweDM5LCAweDRELCAweEYyLCAweDBCLCAweDA2LCAweDMzLCAweEZELCAweDJELCAweDAxLCAweDlELCAweEZGLAorCTB4MTMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MEUsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NkIsIDB4MDAsIDB4OEUsCisJMHhGRiwgMHgwNiwgMHgwMCwgMHg2RSwgMHgwMSwgMHhFNCwgMHhGOSwgMHg0OCwgMHg0NiwgMHg3NSwgMHgxMCwKKwkweEQ3LCAweEY3LCAweEZDLCAweDA0LCAweDAwLCAweEZELCAweDlFLCAweDAxLCAweDRFLCAweEZGLCAweDJFLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTMsIDB4MDEsCisJMHg0RSwgMHhGQywgMHhBMCwgMHgwNiwgMHhFRCwgMHhGMywgMHgwRiwgMHgxRSwgMHgyRCwgMHgzRiwgMHgxMCwKKwkweEY0LCAweEM4LCAweDA0LCAweDA3LCAweEZFLCAweEFGLCAweDAwLCAweERDLCAweEZGLCAweEZDLCAweEZGLAorCTB4MDMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MTgsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksCisJMHhGRSwgMHg3MSwgMHgwMywgMHgzRiwgMHhGNiwgMHhEQiwgMHg0MiwgMHhFMCwgMHgxNywgMHg4NiwgMHhGNSwKKwkweDAwLCAweDA2LCAweDhDLCAweEZDLCAweENFLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4M0YsIDB4RkYsIDB4QzYsIDB4MDEsIDB4OUYsIDB4RkMsCisJMHhEMywgMHgwNSwgMHhGMSwgMHhGNSwgMHg2QywgMHgxNiwgMHg5RSwgMHg0MywgMHhERCwgMHhGNiwgMHgxNSwKKwkweDAzLCAweDEwLCAweEZGLCAweDE3LCAweDAwLCAweDI4LCAweDAwLCAweERGLCAweEZGLCAweDA5LCAweDAwLAorCTB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Q0YsIDB4RkYsIDB4QzksIDB4MDAsIDB4REEsIDB4RkQsIDB4MEYsCisJMHgwNSwgMHhBNSwgMHhGMywgMHgzMSwgMHgzRSwgMHg4QSwgMHgxRiwgMHg5NywgMHhGMywgMHhCRCwgMHgwNiwKKwkweDQ0LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLAorCTB4RkYsIDB4MkQsIDB4MDAsIDB4NTIsIDB4RkYsIDB4OTIsIDB4MDEsIDB4MUIsIDB4RkQsIDB4QzQsIDB4MDQsCisJMHg1MSwgMHhGOCwgMHgxMywgMHgwRiwgMHhDOCwgMHg0NiwgMHhCNiwgMHhGQSwgMHgwMSwgMHgwMSwgMHg0NCwKKwkweDAwLCAweDZDLCAweEZGLCAweDdCLCAweDAwLCAweEJGLCAweEZGLCAweDEwLCAweDAwLCAweEZGLCAweEZGLAorCTB4MTcsIDB4MDAsIDB4OTIsIDB4RkYsIDB4NDEsIDB4MDEsIDB4MTEsIDB4RkQsIDB4M0IsIDB4MDYsIDB4MTQsCisJMHhGMiwgMHg3OCwgMHgzOCwgMHgzNiwgMHgyNywgMHgzNSwgMHhGMiwgMHgyMCwgMHgwNywgMHgzMywgMHhGQywKKwkweERGLCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI1LAorCTB4MDAsIDB4NkQsIDB4RkYsIDB4NEMsIDB4MDEsIDB4QjYsIDB4RkQsIDB4ODYsIDB4MDMsIDB4RTEsIDB4RkEsCisJMHgzRCwgMHgwOCwgMHg5MiwgMHg0OCwgMHg4RSwgMHhGRiwgMHhBMSwgMHhGRSwgMHg5MywgMHgwMSwgMHhCOCwKKwkweEZFLCAweEQzLCAweDAwLCAweDlELCAweEZGLCAweDE4LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLAorCTB4NjQsIDB4RkYsIDB4OUEsIDB4MDEsIDB4ODgsIDB4RkMsIDB4RUUsIDB4MDYsIDB4N0UsIDB4RjEsIDB4RTMsCisJMHgzMSwgMHg5RiwgMHgyRSwgMHg4OCwgMHhGMSwgMHgxOSwgMHgwNywgMHg1RSwgMHhGQywgMHhCNywgMHgwMSwKKwkweDU0LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweDFDLCAweDAwLCAweDhELCAweEZGLCAweEZBLAorCTB4MDAsIDB4NjQsIDB4RkUsIDB4MzIsIDB4MDIsIDB4NzgsIDB4RkQsIDB4MUIsIDB4MDIsIDB4RUEsIDB4NDgsCisJMHg1MCwgMHgwNSwgMHgxNCwgMHhGQywgMHhFQiwgMHgwMiwgMHgwNSwgMHhGRSwgMHgyNywgMHgwMSwgMHg3QywKKwkweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ2LCAweEZGLAorCTB4RDEsIDB4MDEsIDB4M0YsIDB4RkMsIDB4MkIsIDB4MDcsIDB4Q0QsIDB4RjEsIDB4QUUsIDB4MkEsIDB4ODYsCisJMHgzNSwgMHhCMSwgMHhGMSwgMHg5RCwgMHgwNiwgMHhDQSwgMHhGQywgMHg2RSwgMHgwMSwgMHg3QiwgMHhGRiwKKwkweDIwLCAweDAwLCAweEZFLCAweEZGLCAweDEzLCAweDAwLCAweEFGLCAweEZGLCAweEE0LCAweDAwLCAweDE5LAorCTB4RkYsIDB4REQsIDB4MDAsIDB4RjAsIDB4RkYsIDB4RDQsIDB4RkMsIDB4QzksIDB4NDcsIDB4RDgsIDB4MEIsCisJMHg3QywgMHhGOSwgMHgzNSwgMHgwNCwgMHg1RiwgMHhGRCwgMHg3NCwgMHgwMSwgMHg1RSwgMHhGRiwgMHgyOSwKKwkweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweEU2LCAweDAxLAorCTB4MzUsIDB4RkMsIDB4RjcsIDB4MDYsIDB4RTAsIDB4RjIsIDB4MTgsIDB4MjMsIDB4QUIsIDB4M0IsIDB4Q0MsCisJMHhGMiwgMHhBOCwgMHgwNSwgMHg3NiwgMHhGRCwgMHgwNCwgMHgwMSwgMHhCMSwgMHhGRiwgMHgwQywgMHgwMCwKKwkweDAwLCAweDAwLCAweDBDLCAweDAwLCAweEQxLCAweEZGLCAweDRFLCAweDAwLCAweENBLCAweEZGLCAweDlBLAorCTB4RkYsIDB4MkEsIDB4MDIsIDB4ODMsIDB4RjgsIDB4M0YsIDB4NDUsIDB4RkIsIDB4MTIsIDB4MDEsIDB4RjcsCisJMHg1RCwgMHgwNSwgMHhEMywgMHhGQywgMHhCMSwgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwKKwkweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LCAweEZGLCAweERDLCAweDAxLCAweDY0LCAweEZDLAorCTB4NjIsIDB4MDYsIDB4OTMsIDB4RjQsIDB4NjYsIDB4MUIsIDB4RDksIDB4NDAsIDB4RUEsIDB4RjQsIDB4M0UsCisJMHgwNCwgMHg1RCwgMHhGRSwgMHg3RCwgMHgwMCwgMHhGNSwgMHhGRiwgMHhGMywgMHhGRiwgMHgwNSwgMHgwMCwKKwkweDA1LCAweDAwLCAweEVGLCAweEZGLCAweEZFLCAweEZGLCAweDZDLCAweDAwLCAweDdCLCAweEZFLCAweDBDLAorCTB4MDQsIDB4M0EsIDB4RjUsIDB4NUYsIDB4NDEsIDB4ODMsIDB4MUEsIDB4Q0QsIDB4RjQsIDB4NEIsIDB4MDYsCisJMHg2RCwgMHhGQywgMHhEOSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwKKwkweEZGLCAweDMxLCAweDAwLCAweDQ0LCAweEZGLCAweEI3LCAweDAxLCAweEM1LCAweEZDLCAweDdDLCAweDA1LAorCTB4QkMsIDB4RjYsIDB4RDUsIDB4MTMsIDB4REMsIDB4NDQsIDB4MTQsIDB4RjgsIDB4NjcsIDB4MDIsIDB4NzcsCisJMHhGRiwgMHhERCwgMHhGRiwgMHg0NCwgMHgwMCwgMHhENSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwKKwkweDA5LCAweDAwLCAweEI4LCAweEZGLCAweEY2LCAweDAwLCAweDhELCAweEZELCAweDg0LCAweDA1LCAweEZELAorCTB4RjIsIDB4NTIsIDB4M0MsIDB4MzUsIDB4MjIsIDB4MEIsIDB4RjMsIDB4RUIsIDB4MDYsIDB4MzcsIDB4RkMsCisJMHhFNiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyQSwKKwkweDAwLCAweDVCLCAweEZGLCAweDdDLCAweDAxLCAweDRFLCAweEZELCAweDVBLCAweDA0LCAweDMxLCAweEY5LAorCTB4QTQsIDB4MEMsIDB4OTAsIDB4NDcsIDB4NDcsIDB4RkMsIDB4MzYsIDB4MDAsIDB4QjYsIDB4MDAsIDB4MkUsCisJMHhGRiwgMHg5OSwgMHgwMCwgMHhCMywgMHhGRiwgMHgxMiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwKKwkweDgwLCAweEZGLCAweDY0LCAweDAxLCAweERBLCAweEZDLCAweDg3LCAweDA2LCAweEM1LCAweEYxLCAweDQ2LAorCTB4MzYsIDB4RDEsIDB4MjksIDB4RTMsIDB4RjEsIDB4MkEsIDB4MDcsIDB4M0EsIDB4RkMsIDB4RDUsIDB4MDEsCisJMHg0NCwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHg3OCwKKwkweEZGLCAweDMxLCAweDAxLCAweEYxLCAweEZELCAweDEyLCAweDAzLCAweEM3LCAweEZCLCAweDA3LCAweDA2LAorCTB4REIsIDB4NDgsIDB4NzMsIDB4MDEsIDB4QzMsIDB4RkQsIDB4MEEsIDB4MDIsIDB4NzksIDB4RkUsIDB4RjEsCisJMHgwMCwgMHg5MSwgMHhGRiwgMHgxQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1OCwgMHhGRiwKKwkweEIxLCAweDAxLCAweDY3LCAweEZDLCAweDEwLCAweDA3LCAweDgxLCAweEYxLCAweDczLCAweDJGLCAweDE1LAorCTB4MzEsIDB4N0MsIDB4RjEsIDB4RkIsIDB4MDYsIDB4N0MsIDB4RkMsIDB4QTIsIDB4MDEsIDB4NjAsIDB4RkYsCisJMHgyOSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOSwgMHgwMCwgMHg5OSwgMHhGRiwgMHhERCwgMHgwMCwgMHhBMywKKwkweEZFLCAweEJCLCAweDAxLCAweDU4LCAweEZFLCAweDJELCAweDAwLCAweEFGLCAweDQ4LCAweDdFLCAweDA3LAorCTB4MkUsIDB4RkIsIDB4NjAsIDB4MDMsIDB4QzksIDB4RkQsIDB4NDMsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjQsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhEQywgMHgwMSwKKwkweDM0LCAweEZDLCAweDI1LCAweDA3LCAweDE4LCAweEYyLCAweDE1LCAweDI4LCAweEJGLCAweDM3LCAweEY3LAorCTB4RjEsIDB4NTYsIDB4MDYsIDB4RkUsIDB4RkMsIDB4NEQsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTksIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgxMCwgMHgwMCwgMHhCQiwgMHhGRiwgMHg4NSwgMHgwMCwgMHg1OCwgMHhGRiwgMHg2QSwKKwkweDAwLCAweEJFLCAweDAwLCAweDM4LCAweEZCLCAweDBGLCAweDQ3LCAweDQyLCAweDBFLCAweDlCLCAweEY4LAorCTB4QTEsIDB4MDQsIDB4MkIsIDB4RkQsIDB4OEIsIDB4MDEsIDB4NTUsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRiwgMHhGQywKKwkweENFLCAweDA2LCAweDY2LCAweEYzLCAweDZGLCAweDIwLCAweDk2LCAweDNELCAweDY5LCAweEYzLCAweDM4LAorCTB4MDUsIDB4QkYsIDB4RkQsIDB4RDksIDB4MDAsIDB4QzcsIDB4RkYsIDB4MDQsIDB4MDAsIDB4MDIsIDB4MDAsCisJMHgwOSwgMHgwMCwgMHhEQywgMHhGRiwgMHgzMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHgzMiwgMHhGRiwgMHhEQywKKwkweDAyLCAweDQyLCAweEY3LCAweDBCLCAweDQ0LCAweDhFLCAweDE1LCAweDM0LCAweEY2LCAweEI3LCAweDA1LAorCTB4QUIsIDB4RkMsIDB4QzEsIDB4MDEsIDB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsCisJMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwgMHhGRiwgMHhEMiwgMHgwMSwgMHg4MSwgMHhGQywgMHgxQSwgMHgwNiwKKwkweDQ3LCAweEY1LCAweEMxLCAweDE4LCAweDYwLCAweDQyLCAweEU0LCAweEY1LCAweEE2LCAweDAzLCAweEI5LAorCTB4RkUsIDB4NDgsIDB4MDAsIDB4MEYsIDB4MDAsIDB4RTksIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDQsIDB4MDAsCisJMHhGOSwgMHhGRiwgMHhFNCwgMHhGRiwgMHg5RiwgMHgwMCwgMHgyMywgMHhGRSwgMHg5QiwgMHgwNCwgMHg1NSwKKwkweEY0LCAweEMwLCAweDNGLCAweDJDLCAweDFELCAweDIyLCAweEY0LCAweDhDLCAweDA2LCAweDU1LCAweEZDLAorCTB4RTEsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkYsCisJMHgwMCwgMHg0QiwgMHhGRiwgMHhBNCwgMHgwMSwgMHhGMSwgMHhGQywgMHgxRCwgMHgwNSwgMHg4RiwgMHhGNywKKwkweDRBLCAweDExLCAweEYyLCAweDQ1LCAweDZCLCAweEY5LCAweEFFLCAweDAxLCAweEUyLCAweEZGLCAweEEyLAorCTB4RkYsIDB4NjEsIDB4MDAsIDB4QzksIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTEsIDB4MDAsCisJMHhBMywgMHhGRiwgMHgyMCwgMHgwMSwgMHg0OSwgMHhGRCwgMHhFQiwgMHgwNSwgMHg3NCwgMHhGMiwgMHg1NCwKKwkweDNBLCAweERELCAweDI0LCAweDkxLCAweEYyLCAweDBDLCAweDA3LCAweDMyLCAweEZDLCAweEU0LCAweDAxLAorCTB4M0EsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjQsCisJMHhGRiwgMHg2MywgMHgwMSwgMHg4NCwgMHhGRCwgMHhFQiwgMHgwMywgMHgxNCwgMHhGQSwgMHg0NywgMHgwQSwKKwkweDJDLCAweDQ4LCAweEY2LCAweEZELCAweDYzLCAweEZGLCAweDJCLCAweDAxLCAweEYwLCAweEZFLCAweEI4LAorCTB4MDAsIDB4QTgsIDB4RkYsIDB4MTUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MjMsIDB4MDAsIDB4NzEsIDB4RkYsCisJMHg4MiwgMHgwMSwgMHhBQiwgMHhGQywgMHhDNCwgMHgwNiwgMHg5MywgMHhGMSwgMHhGRCwgMHgzMywgMHg2MiwKKwkweDJDLCAweEE4LCAweEYxLCAweDI3LCAweDA3LCAweDRBLCAweEZDLCAweEM3LCAweDAxLCAweDRDLCAweEZGLAorCTB4MzAsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODMsIDB4RkYsIDB4MTQsCisJMHgwMSwgMHgyRCwgMHhGRSwgMHg5QywgMHgwMiwgMHhBRCwgMHhGQywgMHhFOSwgMHgwMywgMHhGNiwgMHg0OCwKKwkweDczLCAweDAzLCAweEUwLCAweEZDLCAweDgyLCAweDAyLCAweDNCLCAweEZFLCAweDBFLCAweDAxLCAweDg2LAorCTB4RkYsIDB4MUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEUsIDB4RkYsIDB4QzMsIDB4MDEsCisJMHg0RSwgMHhGQywgMHgyNCwgMHgwNywgMHg5RSwgMHhGMSwgMHhGMiwgMHgyQywgMHg3OCwgMHgzMywgMHg4QywKKwkweEYxLCAweEQwLCAweDA2LCAweEEyLCAweEZDLCAweDg4LCAweDAxLCAweDZELCAweEZGLCAweDI0LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MTYsIDB4MDAsIDB4QTUsIDB4RkYsIDB4QkUsIDB4MDAsIDB4RTIsIDB4RkUsIDB4NDUsCisJMHgwMSwgMHgzMywgMHhGRiwgMHg1QSwgMHhGRSwgMHg0OCwgMHg0OCwgMHhDMywgMHgwOSwgMHg0NywgMHhGQSwKKwkweEQyLCAweDAzLCAweDkwLCAweEZELCAweDVFLCAweDAxLCAweDY2LCAweEZGLCAweDI3LCAweDAwLCAweDAwLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MzUsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RTMsIDB4MDEsIDB4MzEsIDB4RkMsCisJMHgxMiwgMHgwNywgMHg3OSwgMHhGMiwgMHg3MywgMHgyNSwgMHhERiwgMHgzOSwgMHg1QSwgMHhGMiwgMHgwMCwKKwkweDA2LCAweDNBLCAweEZELCAweDI4LCAweDAxLCAweDlGLCAweEZGLCAweDEzLCAweDAwLCAweDAwLCAweDAwLAorCTB4MEUsIDB4MDAsIDB4QzcsIDB4RkYsIDB4NjgsIDB4MDAsIDB4OTUsIDB4RkYsIDB4RkEsIDB4RkYsIDB4ODMsCisJMHgwMSwgMHhCQiwgMHhGOSwgMHgyQiwgMHg0NiwgMHhCQiwgMHgxMCwgMHhCRiwgMHhGNywgMHgwNywgMHgwNSwKKwkweEZCLCAweEZDLCAweEEwLCAweDAxLCAweDRELCAweEZGLCAweDJGLCAweDAwLCAweEZGLCAweEZGLCAweEZFLAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTIsIDB4MDEsIDB4NTAsIDB4RkMsIDB4OTksIDB4MDYsCisJMHhGRSwgMHhGMywgMHhDMywgMHgxRCwgMHg1RSwgMHgzRiwgMHgyNywgMHhGNCwgMHhCOSwgMHgwNCwgMHgxMCwKKwkweEZFLCAweEE5LCAweDAwLCAweERGLCAweEZGLCAweEZCLCAweEZGLCAweDAzLCAweDAwLCAweDA3LCAweDAwLAorCTB4RTYsIDB4RkYsIDB4MTUsIDB4MDAsIDB4M0MsIDB4MDAsIDB4Q0YsIDB4RkUsIDB4ODMsIDB4MDMsIDB4MjAsCisJMHhGNiwgMHhCMiwgMHg0MiwgMHgyQiwgMHgxOCwgMHg3MSwgMHhGNSwgMHgwOSwgMHgwNiwgMHg4OCwgMHhGQywKKwkweENGLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLCAweEZGLCAweEZGLCAweDMzLAorCTB4MDAsIDB4M0YsIDB4RkYsIDB4QzUsIDB4MDEsIDB4QTMsIDB4RkMsIDB4Q0EsIDB4MDUsIDB4MDcsIDB4RjYsCisJMHgyMiwgMHgxNiwgMHhDMywgMHg0MywgMHhGRSwgMHhGNiwgMHgwMiwgMHgwMywgMHgxQiwgMHhGRiwgMHgxMSwKKwkweDAwLCAweDJCLCAweDAwLCAweERFLCAweEZGLCAweDA5LCAweDAwLCAweDAyLCAweDAwLCAweDAyLCAweDAwLAorCTB4Q0MsIDB4RkYsIDB4Q0UsIDB4MDAsIDB4RDEsIDB4RkQsIDB4MUQsIDB4MDUsIDB4OTEsIDB4RjMsIDB4RkUsCisJMHgzRCwgMHhENywgMHgxRiwgMHg4NywgMHhGMywgMHhDMywgMHgwNiwgMHg0MiwgMHhGQywgMHhFNSwgMHgwMSwKKwkweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLCAweEZGLCAweDJELCAweDAwLCAweDUzLAorCTB4RkYsIDB4OTAsIDB4MDEsIDB4MjAsIDB4RkQsIDB4QjgsIDB4MDQsIDB4NkEsIDB4RjgsIDB4Q0QsIDB4MEUsCisJMHhFMSwgMHg0NiwgMHhFMSwgMHhGQSwgMHhFQiwgMHgwMCwgMHg1MSwgMHgwMCwgMHg2NSwgMHhGRiwgMHg3RiwKKwkweDAwLCAweEJFLCAweEZGLCAweDEwLCAweDAwLCAweEZGLCAweEZGLCAweDE4LCAweDAwLCAweDkwLCAweEZGLAorCTB4NDUsIDB4MDEsIDB4MEIsIDB4RkQsIDB4NDQsIDB4MDYsIDB4MEEsIDB4RjIsIDB4M0IsIDB4MzgsIDB4ODAsCisJMHgyNywgMHgyQiwgMHhGMiwgMHgyMiwgMHgwNywgMHgzMywgMHhGQywgMHhERSwgMHgwMSwgMHgzRSwgMHhGRiwKKwkweDM0LCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweDI0LCAweDAwLCAweDZFLCAweEZGLCAweDQ5LAorCTB4MDEsIDB4QkMsIDB4RkQsIDB4N0EsIDB4MDMsIDB4RkEsIDB4RkEsIDB4RkQsIDB4MDcsIDB4OUMsIDB4NDgsCisJMHhDMywgMHhGRiwgMHg4OSwgMHhGRSwgMHhBMSwgMHgwMSwgMHhCMSwgMHhGRSwgMHhENiwgMHgwMCwgMHg5QywKKwkweEZGLCAweDE4LCAweDAwLCAweEZELCAweEZGLCAweDI4LCAweDAwLCAweDYzLCAweEZGLCAweDlELCAweDAxLAorCTB4ODQsIDB4RkMsIDB4RjMsIDB4MDYsIDB4N0QsIDB4RjEsIDB4OUUsIDB4MzEsIDB4RTYsIDB4MkUsIDB4ODUsCisJMHhGMSwgMHgxNiwgMHgwNywgMHg2MSwgMHhGQywgMHhCNSwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyRCwgMHgwMCwKKwkweEZELCAweEZGLCAweDFDLCAweDAwLCAweDhGLCAweEZGLCAweEY3LCAweDAwLCAweDZCLCAweEZFLCAweDI1LAorCTB4MDIsIDB4OTEsIDB4RkQsIDB4RTMsIDB4MDEsIDB4RTUsIDB4NDgsIDB4OEQsIDB4MDUsIDB4RkIsIDB4RkIsCisJMHhGOCwgMHgwMiwgMHhGRSwgMHhGRCwgMHgyQiwgMHgwMSwgMHg3QSwgMHhGRiwgMHgyMSwgMHgwMCwgMHgwMCwKKwkweDAwLCAweEZELCAweEZGLCAweDMyLCAweDAwLCAweDQ1LCAweEZGLCAweEQyLCAweDAxLCAweDNELCAweEZDLAorCTB4MkIsIDB4MDcsIDB4RDQsIDB4RjEsIDB4NjQsIDB4MkEsIDB4QzYsIDB4MzUsIDB4QjcsIDB4RjEsIDB4OTYsCisJMHgwNiwgMHhDRiwgMHhGQywgMHg2QiwgMHgwMSwgMHg3RCwgMHhGRiwgMHgxRiwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweDEzLCAweDAwLCAweEIxLCAweEZGLCAweEEwLCAweDAwLCAweDIwLCAweEZGLCAweEQwLCAweDAwLCAweDA3LAorCTB4MDAsIDB4QTQsIDB4RkMsIDB4QjYsIDB4NDcsIDB4MUMsIDB4MEMsIDB4NjMsIDB4RjksIDB4NDIsIDB4MDQsCisJMHg1OSwgMHhGRCwgMHg3NiwgMHgwMSwgMHg1RCwgMHhGRiwgMHgyQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM1LCAweEZDLCAweEYzLCAweDA2LAorCTB4RUUsIDB4RjIsIDB4Q0QsIDB4MjIsIDB4RTQsIDB4M0IsIDB4REMsIDB4RjIsIDB4OUMsIDB4MDUsIDB4N0UsCisJMHhGRCwgMHgwMCwgMHgwMSwgMHhCNCwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQiwgMHgwMCwKKwkweEQyLCAweEZGLCAweDRBLCAweDAwLCAweEQwLCAweEZGLCAweDhFLCAweEZGLCAweDNGLCAweDAyLCAweDVFLAorCTB4RjgsIDB4MUUsIDB4NDUsIDB4NDQsIDB4MTMsIDB4RUEsIDB4RjYsIDB4NjcsIDB4MDUsIDB4Q0YsIDB4RkMsCisJMHhCMywgMHgwMSwgMHg0NiwgMHhGRiwgMHgzMSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwgMHgzNiwKKwkweDAwLCAweDM4LCAweEZGLCAweERCLCAweDAxLCAweDY3LCAweEZDLCAweDVBLCAweDA2LCAweEE2LCAweEY0LAorCTB4MUIsIDB4MUIsIDB4MDcsIDB4NDEsIDB4MDQsIDB4RjUsIDB4MkQsIDB4MDQsIDB4NjcsIDB4RkUsIDB4NzcsCisJMHgwMCwgMHhGOCwgMHhGRiwgMHhGMiwgMHhGRiwgMHgwNSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhGMCwgMHhGRiwKKwkweEZCLCAweEZGLCAweDcxLCAweDAwLCAweDcxLCAweEZFLCAweDFELCAweDA0LCAweDFGLCAweEY1LCAweDMyLAorCTB4NDEsIDB4Q0UsIDB4MUEsIDB4QkEsIDB4RjQsIDB4NTMsIDB4MDYsIDB4NkEsIDB4RkMsIDB4REEsIDB4MDEsCisJMHgzOCwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwgMHg0NSwKKwkweEZGLCAweEI1LCAweDAxLCAweENBLCAweEZDLCAweDcyLCAweDA1LCAweEQzLCAweEY2LCAweDhELCAweDEzLAorCTB4RkQsIDB4NDQsIDB4MzksIDB4RjgsIDB4NTMsIDB4MDIsIDB4ODIsIDB4RkYsIDB4RDcsIDB4RkYsIDB4NDcsCisJMHgwMCwgMHhEMywgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwQSwgMHgwMCwgMHhCNiwgMHhGRiwKKwkweEZCLCAweDAwLCAweDg1LCAweEZELCAweDkwLCAweDA1LCAweEVDLCAweEYyLCAweDFDLCAweDNDLCAweDgxLAorCTB4MjIsIDB4RkMsIDB4RjIsIDB4RUYsIDB4MDYsIDB4MzYsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHg3OSwKKwkweDAxLCAweDUzLCAweEZELCAweDRFLCAweDA0LCAweDRBLCAweEY5LCAweDYwLCAweDBDLCAweEEzLCAweDQ3LAorCTB4NzYsIDB4RkMsIDB4MUYsIDB4MDAsIDB4QzMsIDB4MDAsIDB4MjcsIDB4RkYsIDB4OUQsIDB4MDAsIDB4QjIsCisJMHhGRiwgMHgxMywgMHgwMCwgMHhGRSwgMHhGRiwgMHgxRSwgMHgwMCwgMHg3RiwgMHhGRiwgMHg2NywgMHgwMSwKKwkweEQ1LCAweEZDLCAweDhFLCAweDA2LCAweEJFLCAweEYxLCAweDA2LCAweDM2LCAweDFBLCAweDJBLCAweERDLAorCTB4RjEsIDB4MkEsIDB4MDcsIDB4M0MsIDB4RkMsIDB4RDMsIDB4MDEsIDB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3OSwgMHhGRiwgMHgyRSwgMHgwMSwgMHhGNywKKwkweEZELCAweDA1LCAweDAzLCAweEUxLCAweEZCLCAweENBLCAweDA1LCAweERGLCAweDQ4LCAweEFCLCAweDAxLAorCTB4QUEsIDB4RkQsIDB4MTgsIDB4MDIsIDB4NzIsIDB4RkUsIDB4RjQsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MUIsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHgyQywgMHgwMCwgMHg1NywgMHhGRiwgMHhCMywgMHgwMSwgMHg2NCwgMHhGQywKKwkweDEzLCAweDA3LCAweDgzLCAweEYxLCAweDJDLCAweDJGLCAweDVBLCAweDMxLCAweDdELCAweEYxLCAweEY3LAorCTB4MDYsIDB4ODAsIDB4RkMsIDB4OUYsIDB4MDEsIDB4NjEsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsCisJMHgxOSwgMHgwMCwgMHg5QSwgMHhGRiwgMHhEOSwgMHgwMCwgMHhBQSwgMHhGRSwgMHhBRSwgMHgwMSwgMHg3MCwKKwkweEZFLCAweEY4LCAweEZGLCAweEE2LCAweDQ4LCAweEJFLCAweDA3LCAweDE0LCAweEZCLCAweDZELCAweDAzLAorCTB4QzMsIDB4RkQsIDB4NDYsIDB4MDEsIDB4NzAsIDB4RkYsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHgzNCwgMHgwMCwgMHgzRiwgMHhGRiwgMHhERCwgMHgwMSwgMHgzNCwgMHhGQywgMHgyMywgMHgwNywKKwkweDIxLCAweEYyLCAweENCLCAweDI3LCAweEZFLCAweDM3LCAweDAwLCAweEYyLCAweDRELCAweDA2LCAweDA0LAorCTB4RkQsIDB4NDksIDB4MDEsIDB4OEUsIDB4RkYsIDB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MTAsIDB4MDAsCisJMHhCRCwgMHhGRiwgMHg4MiwgMHgwMCwgMHg1RSwgMHhGRiwgMHg1RCwgMHgwMCwgMHhENCwgMHgwMCwgMHgwQywKKwkweEZCLCAweEY5LCAweDQ2LCAweDg3LCAweDBFLCAweDgyLCAweEY4LCAweEFELCAweDA0LCAweDI2LCAweEZELAorCTB4OEQsIDB4MDEsIDB4NTQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHg0MSwgMHhGQywgMHhDOCwgMHgwNiwgMHg3NiwgMHhGMywKKwkweDIyLCAweDIwLCAweENBLCAweDNELCAweDdELCAweEYzLCAweDJBLCAweDA1LCAweEM4LCAweEZELCAweEQ0LAorCTB4MDAsIDB4Q0EsIDB4RkYsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDksIDB4MDAsIDB4REQsIDB4RkYsCisJMHgyRSwgMHgwMCwgMHgwQSwgMHgwMCwgMHgyNywgMHhGRiwgMHhFRiwgMHgwMiwgMHgyMCwgMHhGNywgMHhFNywKKwkweDQzLCAweEQ4LCAweDE1LCAweDFFLCAweEY2LCAweEMwLCAweDA1LCAweEE3LCAweEZDLCAweEMzLCAweDAxLAorCTB4NDAsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsCisJMHhGRiwgMHhEMSwgMHgwMSwgMHg4NCwgMHhGQywgMHgxMiwgMHgwNiwgMHg1QywgMHhGNSwgMHg3NiwgMHgxOCwKKwkweDg5LCAweDQyLCAweDAyLCAweEY2LCAweDk0LCAweDAzLCAweEM0LCAweEZFLCAweDQyLCAweDAwLCAweDEyLAorCTB4MDAsIDB4RTgsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDMsIDB4MDAsIDB4RkEsIDB4RkYsIDB4RTIsIDB4RkYsCisJMHhBNCwgMHgwMCwgMHgxOSwgMHhGRSwgMHhBQSwgMHgwNCwgMHgzRSwgMHhGNCwgMHg5MCwgMHgzRiwgMHg3OCwKKwkweDFELCAweDEwLCAweEY0LCAweDkzLCAweDA2LCAweDUyLCAweEZDLCAweEUxLCAweDAxLCAweDM2LCAweEZGLAorCTB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTIsCisJMHgwMSwgMHhGNiwgMHhGQywgMHgxMiwgMHgwNSwgMHhBNywgMHhGNywgMHgwMywgMHgxMSwgMHgxMCwgMHg0NiwKKwkweDkzLCAweEY5LCAweDk4LCAweDAxLCAweEVFLCAweEZGLCAweDlCLCAweEZGLCAweDY0LCAweDAwLCAweEM4LAorCTB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4QTEsIDB4RkYsIDB4MjQsIDB4MDEsCisJMHg0MSwgMHhGRCwgMHhGNiwgMHgwNSwgMHg2NywgMHhGMiwgMHgxQSwgMHgzQSwgMHgyOSwgMHgyNSwgMHg4NCwKKwkweEYyLCAweDBGLCAweDA3LCAweDMxLCAweEZDLCAweEUzLCAweDAxLCAweDNBLCAweEZGLCAweDM1LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjUsIDB4RkYsIDB4NjAsIDB4MDEsIDB4OEEsCisJMHhGRCwgMHhERiwgMHgwMywgMHgyRSwgMHhGQSwgMHgwNCwgMHgwQSwgMHgzQSwgMHg0OCwgMHgyOCwgMHhGRSwKKwkweDRCLCAweEZGLCAweDM4LCAweDAxLCAweEU5LCAweEZFLCAweEJCLCAweDAwLCAweEE2LCAweEZGLCAweDE2LAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MjQsIDB4MDAsIDB4NkYsIDB4RkYsIDB4ODUsIDB4MDEsIDB4QTYsIDB4RkMsCisJMHhDQSwgMHgwNiwgMHg4RiwgMHhGMSwgMHhCQiwgMHgzMywgMHhBQiwgMHgyQywgMHhBMywgMHhGMSwgMHgyNiwKKwkweDA3LCAweDRDLCAweEZDLCAweEM1LCAweDAxLCAweDRELCAweEZGLCAweDMwLCAweDAwLCAweEZELCAweEZGLAorCTB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsCisJMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywKKwkweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweEZELAorCTB4RkYsIDB4MkEsIDB4MDAsIDB4NUMsIDB4RkYsIDB4QUEsIDB4MDEsIDB4NzEsIDB4RkMsIDB4MDcsIDB4MDcsCisJMHg3RSwgMHhGMSwgMHg0NCwgMHgzMCwgMHg0NCwgMHgzMCwgMHg3RSwgMHhGMSwgMHgwNywgMHgwNywgMHg3MSwKKwkweEZDLCAweEFBLCAweDAxLCAweDVDLCAweEZGLCAweDJBLCAweDAwLCAweEZELCAweEZGLCAweDAwLCAweDAwLAorCTB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsCisJMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwKKwkweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDAyLCAweDAwLCAweDA1LAorCTB4MDAsIDB4QzMsIDB4RkYsIDB4RTEsIDB4MDAsIDB4QjEsIDB4RkQsIDB4NEUsIDB4MDUsIDB4NEEsIDB4RjMsCisJMHgzRCwgMHgzRCwgMHhFRCwgMHgyMCwgMHg0QywgMHhGMywgMHhENiwgMHgwNiwgMHgzRCwgMHhGQywgMHhFNiwKKwkweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLAorCTB4MzYsIDB4RkYsIDB4RTYsIDB4MDEsIDB4M0QsIDB4RkMsIDB4RDYsIDB4MDYsIDB4NEMsIDB4RjMsIDB4RUQsCisJMHgyMCwgMHgzRCwgMHgzRCwgMHg0QSwgMHhGMywgMHg0RSwgMHgwNSwgMHhCMSwgMHhGRCwgMHhFMSwgMHgwMCwKKwkweEMzLCAweEZGLCAweDA1LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDFFLCAweDAwLCAweDg0LAorCTB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsIDB4MDIsIDB4QzcsIDB4RkMsIDB4QUUsIDB4MDMsCisJMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywgMHg4RiwgMHgwMiwgMHgzNCwgMHhGRSwgMHgxMSwKKwkweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDE2LCAweDAwLCAweEE2LCAweEZGLCAweEJCLCAweDAwLAorCTB4RTksIDB4RkUsIDB4MzgsIDB4MDEsIDB4NEIsIDB4RkYsIDB4MjgsIDB4RkUsIDB4M0EsIDB4NDgsIDB4MDQsCisJMHgwQSwgMHgyRSwgMHhGQSwgMHhERiwgMHgwMywgMHg4QSwgMHhGRCwgMHg2MCwgMHgwMSwgMHg2NSwgMHhGRiwKKwkweDI3LCAweDAwLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEM4LCAweEZGLCAweDY0LCAweDAwLCAweDlCLAorCTB4RkYsIDB4RUUsIDB4RkYsIDB4OTgsIDB4MDEsIDB4OTMsIDB4RjksIDB4MTAsIDB4NDYsIDB4MDMsIDB4MTEsCisJMHhBNywgMHhGNywgMHgxMiwgMHgwNSwgMHhGNiwgMHhGQywgMHhBMiwgMHgwMSwgMHg0QywgMHhGRiwgMHgyRiwKKwkweDAwLCAweEZGLCAweEZGLCAweDA3LCAweDAwLCAweEU4LCAweEZGLCAweDEyLCAweDAwLCAweDQyLCAweDAwLAorCTB4QzQsIDB4RkUsIDB4OTQsIDB4MDMsIDB4MDIsIDB4RjYsIDB4ODksIDB4NDIsIDB4NzYsIDB4MTgsIDB4NUMsCisJMHhGNSwgMHgxMiwgMHgwNiwgMHg4NCwgMHhGQywgMHhEMSwgMHgwMSwgMHgzQiwgMHhGRiwgMHgzNCwgMHgwMCwKKwkweEZFLCAweEZGLCAweDAyLCAweDAwLCAweDAzLCAweDAwLCAweENBLCAweEZGLCAweEQ0LCAweDAwLCAweEM4LAorCTB4RkQsIDB4MkEsIDB4MDUsIDB4N0QsIDB4RjMsIDB4Q0EsIDB4M0QsIDB4MjIsIDB4MjAsIDB4NzYsIDB4RjMsCisJMHhDOCwgMHgwNiwgMHg0MSwgMHhGQywgMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweEZGLCAweEZGLCAweDE5LCAweDAwLCAweDhFLCAweEZGLCAweDQ5LCAweDAxLCAweDA0LCAweEZELAorCTB4NEQsIDB4MDYsIDB4MDAsIDB4RjIsIDB4RkUsIDB4MzcsIDB4Q0IsIDB4MjcsIDB4MjEsIDB4RjIsIDB4MjMsCisJMHgwNywgMHgzNCwgMHhGQywgMHhERCwgMHgwMSwgMHgzRiwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweEZELCAweEZGLCAweDI5LCAweDAwLCAweDYxLCAweEZGLCAweDlGLCAweDAxLCAweDgwLCAweEZDLCAweEY3LAorCTB4MDYsIDB4N0QsIDB4RjEsIDB4NUEsIDB4MzEsIDB4MkMsIDB4MkYsIDB4ODMsIDB4RjEsIDB4MTMsIDB4MDcsCisJMHg2NCwgMHhGQywgMHhCMywgMHgwMSwgMHg1NywgMHhGRiwgMHgyQywgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwKKwkweEZGLCAweDMyLCAweDAwLCAweDQ0LCAweEZGLCAweEQzLCAweDAxLCAweDNDLCAweEZDLCAweDJBLCAweDA3LAorCTB4REMsIDB4RjEsIDB4MUEsIDB4MkEsIDB4MDYsIDB4MzYsIDB4QkUsIDB4RjEsIDB4OEUsIDB4MDYsIDB4RDUsCisJMHhGQywgMHg2NywgMHgwMSwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM3LCAweEZGLCAweEU2LCAweDAxLCAweDM2LCAweEZDLCAweEVGLCAweDA2LCAweEZDLAorCTB4RjIsIDB4ODEsIDB4MjIsIDB4MUMsIDB4M0MsIDB4RUMsIDB4RjIsIDB4OTAsIDB4MDUsIDB4ODUsIDB4RkQsCisJMHhGQiwgMHgwMCwgMHhCNiwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwKKwkweDAwLCAweDM4LCAweEZGLCAweERBLCAweDAxLCAweDZBLCAweEZDLCAweDUzLCAweDA2LCAweEJBLCAweEY0LAorCTB4Q0UsIDB4MUEsIDB4MzIsIDB4NDEsIDB4MUYsIDB4RjUsIDB4MUQsIDB4MDQsIDB4NzEsIDB4RkUsIDB4NzEsCisJMHgwMCwgMHhGQiwgMHhGRiwgMHhGMCwgMHhGRiwgMHgwNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMSwgMHgwMCwKKwkweDQ2LCAweEZGLCAweEIzLCAweDAxLCAweENGLCAweEZDLCAweDY3LCAweDA1LCAweEVBLCAweEY2LCAweDQ0LAorCTB4MTMsIDB4MUUsIDB4NDUsIDB4NUUsIDB4RjgsIDB4M0YsIDB4MDIsIDB4OEUsIDB4RkYsIDB4RDAsIDB4RkYsCisJMHg0QSwgMHgwMCwgMHhEMiwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyQSwgMHgwMCwgMHg1RCwKKwkweEZGLCAweDc2LCAweDAxLCAweDU5LCAweEZELCAweDQyLCAweDA0LCAweDYzLCAweEY5LCAweDFDLCAweDBDLAorCTB4QjYsIDB4NDcsIDB4QTQsIDB4RkMsIDB4MDcsIDB4MDAsIDB4RDAsIDB4MDAsIDB4MjAsIDB4RkYsIDB4QTAsCisJMHgwMCwgMHhCMSwgMHhGRiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMSwgMHgwMCwgMHg3QSwgMHhGRiwKKwkweDJCLCAweDAxLCAweEZFLCAweEZELCAweEY4LCAweDAyLCAweEZCLCAweEZCLCAweDhELCAweDA1LCAweEU1LAorCTB4NDgsIDB4RTMsIDB4MDEsIDB4OTEsIDB4RkQsIDB4MjUsIDB4MDIsIDB4NkIsIDB4RkUsIDB4RjcsIDB4MDAsCisJMHg4RiwgMHhGRiwgMHgxQywgMHgwMCwgMHgxOCwgMHgwMCwgMHg5QywgMHhGRiwgMHhENiwgMHgwMCwgMHhCMSwKKwkweEZFLCAweEExLCAweDAxLCAweDg5LCAweEZFLCAweEMzLCAweEZGLCAweDlDLCAweDQ4LCAweEZELCAweDA3LAorCTB4RkEsIDB4RkEsIDB4N0EsIDB4MDMsIDB4QkMsIDB4RkQsIDB4NDksIDB4MDEsIDB4NkUsIDB4RkYsIDB4MjQsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHhCRSwgMHhGRiwgMHg3RiwgMHgwMCwgMHg2NSwgMHhGRiwKKwkweDUxLCAweDAwLCAweEVCLCAweDAwLCAweEUxLCAweEZBLCAweEUxLCAweDQ2LCAweENELCAweDBFLCAweDZBLAorCTB4RjgsIDB4QjgsIDB4MDQsIDB4MjAsIDB4RkQsIDB4OTAsIDB4MDEsIDB4NTMsIDB4RkYsIDB4MkQsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgwOSwgMHgwMCwgMHhERSwgMHhGRiwgMHgyQiwgMHgwMCwgMHgxMSwgMHgwMCwgMHgxQiwKKwkweEZGLCAweDAyLCAweDAzLCAweEZFLCAweEY2LCAweEMzLCAweDQzLCAweDIyLCAweDE2LCAweDA3LCAweEY2LAorCTB4Q0EsIDB4MDUsIDB4QTMsIDB4RkMsIDB4QzUsIDB4MDEsIDB4M0YsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgwMywgMHgwMCwgMHhGQiwgMHhGRiwgMHhERiwgMHhGRiwgMHhBOSwgMHgwMCwgMHgxMCwgMHhGRSwKKwkweEI5LCAweDA0LCAweDI3LCAweEY0LCAweDVFLCAweDNGLCAweEMzLCAweDFELCAweEZFLCAweEYzLCAweDk5LAorCTB4MDYsIDB4NTAsIDB4RkMsIDB4RTIsIDB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHgxMywgMHgwMCwgMHg5RiwgMHhGRiwgMHgyOCwgMHgwMSwgMHgzQSwgMHhGRCwgMHgwMCwKKwkweDA2LCAweDVBLCAweEYyLCAweERGLCAweDM5LCAweDczLCAweDI1LCAweDc5LCAweEYyLCAweDEyLCAweDA3LAorCTB4MzEsIDB4RkMsIDB4RTMsIDB4MDEsIDB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsCisJMHhGRiwgMHgyNCwgMHgwMCwgMHg2RCwgMHhGRiwgMHg4OCwgMHgwMSwgMHhBMiwgMHhGQywgMHhEMCwgMHgwNiwKKwkweDhDLCAweEYxLCAweDc4LCAweDMzLCAweEYyLCAweDJDLCAweDlFLCAweEYxLCAweDI0LCAweDA3LCAweDRFLAorCTB4RkMsIDB4QzMsIDB4MDEsIDB4NEUsIDB4RkYsIDB4MkYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsCisJMHgzMCwgMHgwMCwgMHg0QywgMHhGRiwgMHhDNywgMHgwMSwgMHg0QSwgMHhGQywgMHgyNywgMHgwNywgMHhBOCwKKwkweEYxLCAweDYyLCAweDJDLCAweEZELCAweDMzLCAweDkzLCAweEYxLCAweEM0LCAweDA2LCAweEFCLCAweEZDLAorCTB4ODIsIDB4MDEsIDB4NzEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzQSwgMHhGRiwgMHhFNCwgMHgwMSwgMHgzMiwgMHhGQywgMHgwQywgMHgwNywgMHg5MSwgMHhGMiwKKwkweERELCAweDI0LCAweDU0LCAweDNBLCAweDc0LCAweEYyLCAweEVCLCAweDA1LCAweDQ5LCAweEZELCAweDIwLAorCTB4MDEsIDB4QTMsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsCisJMHgzNywgMHhGRiwgMHhFMSwgMHgwMSwgMHg1NSwgMHhGQywgMHg4QywgMHgwNiwgMHgyMiwgMHhGNCwgMHgyQywKKwkweDFELCAweEMwLCAweDNGLCAweDU1LCAweEY0LCAweDlCLCAweDA0LCAweDIzLCAweEZFLCAweDlGLCAweDAwLAorCTB4RTQsIDB4RkYsIDB4RjksIDB4RkYsIDB4MDQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzMsIDB4MDAsIDB4NDAsCisJMHhGRiwgMHhDMSwgMHgwMSwgMHhBQiwgMHhGQywgMHhCNywgMHgwNSwgMHgzNCwgMHhGNiwgMHg4RSwgMHgxNSwKKwkweDBCLCAweDQ0LCAweDQyLCAweEY3LCAweERDLCAweDAyLCAweDMyLCAweEZGLCAweDA0LCAweDAwLCAweDMxLAorCTB4MDAsIDB4REMsIDB4RkYsIDB4MDksIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTUsIDB4RkYsCisJMHg4QiwgMHgwMSwgMHgyQiwgMHhGRCwgMHhBMSwgMHgwNCwgMHg5QiwgMHhGOCwgMHg0MiwgMHgwRSwgMHgwRiwKKwkweDQ3LCAweDM4LCAweEZCLCAweEJFLCAweDAwLCAweDZBLCAweDAwLCAweDU4LCAweEZGLCAweDg1LCAweDAwLAorCTB4QkIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4NzEsIDB4RkYsIDB4NDMsCisJMHgwMSwgMHhDOSwgMHhGRCwgMHg2MCwgMHgwMywgMHgyRSwgMHhGQiwgMHg3RSwgMHgwNywgMHhBRiwgMHg0OCwKKwkweDJELCAweDAwLCAweDU4LCAweEZFLCAweEJCLCAweDAxLCAweEEzLCAweEZFLCAweERELCAweDAwLCAweDk5LAorCTB4RkYsIDB4MTksIDB4MDAsIDB4MUIsIDB4MDAsIDB4OTEsIDB4RkYsIDB4RjEsIDB4MDAsIDB4NzksIDB4RkUsCisJMHgwQSwgMHgwMiwgMHhDMywgMHhGRCwgMHg3MywgMHgwMSwgMHhEQiwgMHg0OCwgMHgwNywgMHgwNiwgMHhDNywKKwkweEZCLCAweDEyLCAweDAzLCAweEYxLCAweEZELCAweDMxLCAweDAxLCAweDc4LCAweEZGLCAweDIyLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4QjMsIDB4RkYsIDB4OTksIDB4MDAsIDB4MkUsIDB4RkYsIDB4QjYsCisJMHgwMCwgMHgzNiwgMHgwMCwgMHg0NywgMHhGQywgMHg5MCwgMHg0NywgMHhBNCwgMHgwQywgMHgzMSwgMHhGOSwKKwkweDVBLCAweDA0LCAweDRFLCAweEZELCAweDdDLCAweDAxLCAweDVCLCAweEZGLCAweDJBLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MEIsIDB4MDAsIDB4RDUsIDB4RkYsIDB4NDQsIDB4MDAsIDB4REQsIDB4RkYsIDB4NzcsIDB4RkYsCisJMHg2NywgMHgwMiwgMHgxNCwgMHhGOCwgMHhEQywgMHg0NCwgMHhENSwgMHgxMywgMHhCQywgMHhGNiwgMHg3QywKKwkweDA1LCAweEM1LCAweEZDLCAweEI3LCAweDAxLCAweDQ0LCAweEZGLCAweDMxLCAweDAwLCAweEZGLCAweEZGLAorCTB4MDUsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RjUsIDB4RkYsIDB4N0QsIDB4MDAsIDB4NUQsIDB4RkUsIDB4M0UsCisJMHgwNCwgMHhFQSwgMHhGNCwgMHhEOSwgMHg0MCwgMHg2NiwgMHgxQiwgMHg5MywgMHhGNCwgMHg2MiwgMHgwNiwKKwkweDY0LCAweEZDLCAweERDLCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDAwLAorCTB4MDAsIDB4MEMsIDB4MDAsIDB4QjEsIDB4RkYsIDB4MDQsIDB4MDEsIDB4NzYsIDB4RkQsIDB4QTgsIDB4MDUsCisJMHhDQywgMHhGMiwgMHhBQiwgMHgzQiwgMHgxOCwgMHgyMywgMHhFMCwgMHhGMiwgMHhGNywgMHgwNiwgMHgzNSwKKwkweEZDLCAweEU2LCAweDAxLCAweDM4LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLAorCTB4MjAsIDB4MDAsIDB4N0IsIDB4RkYsIDB4NkUsIDB4MDEsIDB4Q0EsIDB4RkMsIDB4OUQsIDB4MDYsIDB4QjEsCisJMHhGMSwgMHg4NiwgMHgzNSwgMHhBRSwgMHgyQSwgMHhDRCwgMHhGMSwgMHgyQiwgMHgwNywgMHgzRiwgMHhGQywKKwkweEQxLCAweDAxLCAweDQ2LCAweEZGLCAweDMyLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJELAorCTB4MDAsIDB4NTQsIDB4RkYsIDB4QjcsIDB4MDEsIDB4NUUsIDB4RkMsIDB4MTksIDB4MDcsIDB4ODgsIDB4RjEsCisJMHg5RiwgMHgyRSwgMHhFMywgMHgzMSwgMHg3RSwgMHhGMSwgMHhFRSwgMHgwNiwgMHg4OCwgMHhGQywgMHg5QSwKKwkweDAxLCAweDY0LCAweEZGLCAweDI4LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM0LCAweDAwLAorCTB4M0UsIDB4RkYsIDB4REYsIDB4MDEsIDB4MzMsIDB4RkMsIDB4MjAsIDB4MDcsIDB4MzUsIDB4RjIsIDB4MzYsCisJMHgyNywgMHg3OCwgMHgzOCwgMHgxNCwgMHhGMiwgMHgzQiwgMHgwNiwgMHgxMSwgMHhGRCwgMHg0MSwgMHgwMSwKKwkweDkyLCAweEZGLCAweDE3LCAweDAwLCAweEZGLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLCAweDM2LAorCTB4RkYsIDB4RTUsIDB4MDEsIDB4NDQsIDB4RkMsIDB4QkQsIDB4MDYsIDB4OTcsIDB4RjMsIDB4OEEsIDB4MUYsCisJMHgzMSwgMHgzRSwgMHhBNSwgMHhGMywgMHgwRiwgMHgwNSwgMHhEQSwgMHhGRCwgMHhDOSwgMHgwMCwgMHhDRiwKKwkweEZGLCAweDAxLCAweDAwLCAweDAyLCAweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNDLCAweEZGLAorCTB4Q0UsIDB4MDEsIDB4OEMsIDB4RkMsIDB4MDAsIDB4MDYsIDB4ODYsIDB4RjUsIDB4RTAsIDB4MTcsIDB4REIsCisJMHg0MiwgMHgzRiwgMHhGNiwgMHg3MSwgMHgwMywgMHhEOSwgMHhGRSwgMHgzNiwgMHgwMCwgMHgxOCwgMHgwMCwKKwkweEU1LCAweEZGLCAweDA3LCAweDAwLCAweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRFLCAweEZGLCAweDlFLAorCTB4MDEsIDB4MDAsIDB4RkQsIDB4RkMsIDB4MDQsIDB4RDcsIDB4RjcsIDB4NzUsIDB4MTAsIDB4NDgsIDB4NDYsCisJMHhFNCwgMHhGOSwgMHg2RSwgMHgwMSwgMHgwNiwgMHgwMCwgMHg4RSwgMHhGRiwgMHg2QiwgMHgwMCwgMHhDNiwKKwkweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweDI2LCAweDAwLCAweDY4LCAweEZGLCAweDVCLCAweDAxLAorCTB4OTYsIDB4RkQsIDB4QzYsIDB4MDMsIDB4NjEsIDB4RkEsIDB4ODEsIDB4MDksIDB4NTcsIDB4NDgsIDB4OEQsCisJMHhGRSwgMHgxQiwgMHhGRiwgMHg1MiwgMHgwMSwgMHhEQiwgMHhGRSwgMHhDMiwgMHgwMCwgMHhBNCwgMHhGRiwKKwkweDE2LCAweDAwLCAweDFFLCAweDAwLCAweDg3LCAweEZGLCAweDBCLCAweDAxLCAweDQyLCAweEZFLCAweDc0LAorCTB4MDIsIDB4RjksIDB4RkMsIDB4MzksIDB4MDMsIDB4RjUsIDB4NDgsIDB4MjQsIDB4MDQsIDB4OTQsIDB4RkMsCisJMHhBOSwgMHgwMiwgMHgyNywgMHhGRSwgMHgxOCwgMHgwMSwgMHg4MiwgMHhGRiwgMHgxRiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDE1LCAweDAwLCAweEE5LCAweEZGLCAweEI0LCAweDAwLCAweEY3LCAweEZFLCAweDFELCAweDAxLAorCTB4N0EsIDB4RkYsIDB4QzUsIDB4RkQsIDB4MUQsIDB4NDgsIDB4ODksIDB4MEEsIDB4RkIsIDB4RjksIDB4RjgsCisJMHgwMywgMHg3RCwgMHhGRCwgMHg2NiwgMHgwMSwgMHg2MywgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDBELCAweDAwLCAweENCLCAweEZGLCAweDVFLCAweDAwLCAweEE5LCAweEZGLCAweEQ2LCAweEZGLCAweEMzLAorCTB4MDEsIDB4NDMsIDB4RjksIDB4RDcsIDB4NDUsIDB4OTIsIDB4MTEsIDB4NzcsIDB4RjcsIDB4MjgsIDB4MDUsCisJMHhFQywgMHhGQywgMHhBNywgMHgwMSwgMHg0QSwgMHhGRiwgMHgyRiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNiwKKwkweDAwLCAweEVBLCAweEZGLCAweDBDLCAweDAwLCAweDRFLCAweDAwLCAweEFGLCAweEZFLCAweEI4LCAweDAzLAorCTB4QzcsIDB4RjUsIDB4MzgsIDB4NDIsIDB4MEMsIDB4MTksIDB4MzIsIDB4RjUsIDB4MjMsIDB4MDYsIDB4N0QsCisJMHhGQywgMHhEMywgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMiwgMHgwMCwKKwkweDA1LCAweDAwLCAweEM1LCAweEZGLCAweERFLCAweDAwLCAweEI3LCAweEZELCAweDQ1LCAweDA1LCAweDU2LAorCTB4RjMsIDB4NjEsIDB4M0QsIDB4QkEsIDB4MjAsIDB4NTYsIDB4RjMsIDB4RDMsIDB4MDYsIDB4M0UsIDB4RkMsCisJMHhFNiwgMHgwMSwgMHgzNiwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgxQSwKKwkweDAwLCAweDhBLCAweEZGLCAweDUxLCAweDAxLCAweEY4LCAweEZDLCAweDVFLCAweDA2LCAweEVELCAweEYxLAorCTB4ODIsIDB4MzcsIDB4NjAsIDB4MjgsIDB4MEUsIDB4RjIsIDB4MjYsIDB4MDcsIDB4MzUsIDB4RkMsIDB4REIsCisJMHgwMSwgMHg0MCwgMHhGRiwgMHgzNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyOSwgMHgwMCwKKwkweDVGLCAweEZGLCAweEE1LCAweDAxLCAweDc4LCAweEZDLCAweEZGLCAweDA2LCAweDdELCAweEYxLCAweENGLAorCTB4MzAsIDB4QjgsIDB4MkYsIDB4ODAsIDB4RjEsIDB4MEQsIDB4MDcsIDB4NkEsIDB4RkMsIDB4QUUsIDB4MDEsCisJMHg1OSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MywKKwkweEZGLCAweEQ2LCAweDAxLCAweDM5LCAweEZDLCAweDJBLCAweDA3LCAweEVCLCAweEYxLCAweDg3LCAweDI5LAorCTB4ODUsIDB4MzYsIDB4Q0MsIDB4RjEsIDB4N0YsIDB4MDYsIDB4RTAsIDB4RkMsIDB4NjAsIDB4MDEsIDB4ODIsCisJMHhGRiwgMHgxRCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNywgMHhGRiwKKwkweEU2LCAweDAxLCAweDM4LCAweEZDLCAweEU2LCAweDA2LCAweDE5LCAweEYzLCAweEVBLCAweDIxLCAweDhBLAorCTB4M0MsIDB4MEUsIDB4RjMsIDB4NzgsIDB4MDUsIDB4OTYsIDB4RkQsIDB4RjEsIDB4MDAsIDB4QkIsIDB4RkYsCisJMHgwOCwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzOSwgMHhGRiwgMHhEOCwKKwkweDAxLCAweDcwLCAweEZDLCAweDQzLCAweDA2LCAweEUxLCAweEY0LCAweDM4LCAweDFBLCAweDhDLCAweDQxLAorCTB4NTUsIDB4RjUsIDB4RkMsIDB4MDMsIDB4ODUsIDB4RkUsIDB4NjYsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RUUsCisJMHhGRiwgMHgwNiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMCwgMHgwMCwgMHg0NywgMHhGRiwgMHhBRiwgMHgwMSwKKwkweEQ4LCAweEZDLCAweDUyLCAweDA1LCAweDE5LCAweEY3LCAweEIyLCAweDEyLCAweDVDLCAweDQ1LCAweEE5LAorCTB4RjgsIDB4MTYsIDB4MDIsIDB4QTYsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NTEsIDB4MDAsIDB4RDAsIDB4RkYsCisJMHgwQywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOSwgMHgwMCwgMHg1RiwgMHhGRiwgMHg3MSwgMHgwMSwgMHg2NSwKKwkweEZELCAweDI5LCAweDA0LCAweDk2LCAweEY5LCAweDk1LCAweDBCLCAweERDLCAweDQ3LCAweDAzLCAweEZELAorCTB4RDksIDB4RkYsIDB4RUEsIDB4MDAsIDB4MTIsIDB4RkYsIDB4QTcsIDB4MDAsIDB4QUUsIDB4RkYsIDB4MTQsCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg3RCwgMHhGRiwgMHgyNCwgMHgwMSwgMHgwQywgMHhGRSwKKwkweERFLCAweDAyLCAweDJFLCAweEZDLCAweDEzLCAweDA1LCAweEVDLCAweDQ4LCAweDU0LCAweDAyLCAweDVFLAorCTB4RkQsIDB4M0YsIDB4MDIsIDB4NUQsIDB4RkUsIDB4RkUsIDB4MDAsIDB4OEMsIDB4RkYsIDB4MUMsIDB4MDAsCisJMHgxNywgMHgwMCwgMHg5RSwgMHhGRiwgMHhDRiwgMHgwMCwgMHhCRiwgMHhGRSwgMHg4NiwgMHgwMSwgMHhCQSwKKwkweEZFLCAweDVBLCAweEZGLCAweDg2LCAweDQ4LCAweDdELCAweDA4LCAweEM3LCAweEZBLCAweDkzLCAweDAzLAorCTB4QjAsIDB4RkQsIDB4NEYsIDB4MDEsIDB4NkMsIDB4RkYsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsCisJMHgwMCwgMHhDMCwgMHhGRiwgMHg3OCwgMHgwMCwgMHg3MywgMHhGRiwgMHgzOCwgMHgwMCwgMHgxNywgMHgwMSwKKwkweDhCLCAweEZBLCAweEFGLCAweDQ2LCAweDU5LCAweDBGLCAweDM5LCAweEY4LCAweENGLCAweDA0LCAweDE1LAorCTB4RkQsIDB4OTUsIDB4MDEsIDB4NTEsIDB4RkYsIDB4MkQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDAsCisJMHhFMSwgMHhGRiwgMHgyNSwgMHgwMCwgMHgxRCwgMHgwMCwgMHgwNSwgMHhGRiwgMHgyOCwgMHgwMywgMHhCRCwKKwkweEY2LCAweDc3LCAweDQzLCAweEI2LCAweDE2LCAweERDLCAweEY1LCAweERELCAweDA1LCAweDlCLCAweEZDLAorCTB4QzgsIDB4MDEsIDB4M0UsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHhEOSwgMHhGRiwgMHhCNCwgMHgwMCwgMHhGRCwgMHhGRCwgMHhENywgMHgwNCwgMHhGQSwgMHhGMywKKwkweEZDLCAweDNFLCAweDVCLCAweDFFLCAweERCLCAweEYzLCAweEE2LCAweDA2LCAweDRDLCAweEZDLCAweEUzLAorCTB4MDEsIDB4MzYsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTQsIDB4MDAsCisJMHg5QiwgMHhGRiwgMHgzMSwgMHgwMSwgMHgyQywgMHhGRCwgMHgxNSwgMHgwNiwgMHg0MSwgMHhGMiwgMHg2QSwKKwkweDM5LCAweDBBLCAweDI2LCAweDYxLCAweEYyLCAweDE3LCAweDA3LCAweDMxLCAweEZDLCAweEUyLCAweDAxLAorCTB4M0IsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MjUsIDB4MDAsIDB4NkEsCisJMHhGRiwgMHg4RSwgMHgwMSwgMHg5OSwgMHhGQywgMHhEQiwgMHgwNiwgMHg4NiwgMHhGMSwgMHhGMiwgMHgzMiwKKwkweDgyLCAweDJELCAweDk2LCAweEYxLCAweDIxLCAweDA3LCAweDUzLCAweEZDLCAweEMwLCAweDAxLCAweDUwLAorCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzAsIDB4MDAsIDB4NEEsIDB4RkYsCisJMHhDQSwgMHgwMSwgMHg0NiwgMHhGQywgMHgyOSwgMHgwNywgMHhCMywgMHhGMSwgMHhEMSwgMHgyQiwgMHg4MSwKKwkweDM0LCAweDlDLCAweEYxLCAweEI4LCAweDA2LCAweEI1LCAweEZDLCAweDdDLCAweDAxLCAweDc0LCAweEZGLAorCTB4MjIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzksIDB4RkYsIDB4RTUsCisJMHgwMSwgMHgzMiwgMHhGQywgMHgwNiwgMHgwNywgMHhBQSwgMHhGMiwgMHg0NiwgMHgyNCwgMHhDOCwgMHgzQSwKKwkweDkwLCAweEYyLCAweEQ2LCAweDA1LCAweDU3LCAweEZELCAweDE3LCAweDAxLCAweEE4LCAweEZGLCAweDBGLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REYsIDB4MDEsCisJMHg1QSwgMHhGQywgMHg3RSwgMHgwNiwgMHg0NywgMHhGNCwgMHg5NCwgMHgxQywgMHgxRiwgMHg0MCwgMHg4NSwKKwkweEY0LCAweDdELCAweDA0LCAweDM2LCAweEZFLCAweDkzLCAweDAwLCAweEVBLCAweEZGLCAweEY3LCAweEZGLAorCTB4MDQsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MzIsIDB4MDAsIDB4NDIsIDB4RkYsIDB4QkUsIDB4MDEsIDB4QjQsCisJMHhGQywgMHhBNCwgMHgwNSwgMHg2MSwgMHhGNiwgMHhGQiwgMHgxNCwgMHg1MywgMHg0NCwgMHg4NiwgMHhGNywKKwkweEI2LCAweDAyLCAweDQ5LCAweEZGLCAweEY3LCAweEZGLCAweDM3LCAweDAwLCAweEQ5LCAweEZGLCAweDBBLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MkIsIDB4MDAsIDB4NTcsIDB4RkYsIDB4ODYsIDB4MDEsIDB4MzYsIDB4RkQsCisJMHg4OSwgMHgwNCwgMHhDRCwgMHhGOCwgMHhCNywgMHgwRCwgMHgzRCwgMHg0NywgMHg5MSwgMHhGQiwgMHg5MSwKKwkweDAwLCAweDgzLCAweDAwLCAweDRBLCAweEZGLCAweDhDLCAweDAwLCAweEI5LCAweEZGLCAweDExLCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NzMsIDB4RkYsIDB4M0QsIDB4MDEsIDB4RDYsIDB4RkQsIDB4NDYsCisJMHgwMywgMHg2MSwgMHhGQiwgMHgwMCwgMHgwNywgMHhCRiwgMHg0OCwgMHg5OCwgMHgwMCwgMHgyNiwgMHhGRSwKKwkweEQ1LCAweDAxLCAweDk1LCAweEZFLCAweEUzLCAweDAwLCAweDk2LCAweEZGLCAweDFBLCAweDAwLCAweDFBLAorCTB4MDAsIDB4OTQsIDB4RkYsIDB4RUEsIDB4MDAsIDB4ODcsIDB4RkUsIDB4RjAsIDB4MDEsIDB4RjUsIDB4RkQsCisJMHgwNSwgMHgwMSwgMHhDRSwgMHg0OCwgMHg4MywgMHgwNiwgMHg5NCwgMHhGQiwgMHgyQywgMHgwMywgMHhFNCwKKwkweEZELCAweDM3LCAweDAxLCAweDc2LCAweEZGLCAweDIyLCAweDAwLCAweDAwLCAweDAwLCAweDEyLCAweDAwLAorCTB4QjYsIDB4RkYsIDB4OTMsIDB4MDAsIDB4M0MsIDB4RkYsIDB4OUQsIDB4MDAsIDB4NjMsIDB4MDAsIDB4RUIsCisJMHhGQiwgMHg2OSwgMHg0NywgMHgyRCwgMHgwRCwgMHhGRiwgMHhGOCwgMHg3MiwgMHgwNCwgMHg0MiwgMHhGRCwKKwkweDgxLCAweDAxLCAweDU5LCAweEZGLCAweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweEQ3LAorCTB4RkYsIDB4M0UsIDB4MDAsIDB4RUEsIDB4RkYsIDB4NjAsIDB4RkYsIDB4OEYsIDB4MDIsIDB4Q0QsIDB4RjcsCisJMHg5OSwgMHg0NCwgMHg2OCwgMHgxNCwgMHg4RSwgMHhGNiwgMHg5MCwgMHgwNSwgMHhCQywgMHhGQywgMHhCQSwKKwkweDAxLCAweDQzLCAweEZGLCAweDMyLCAweDAwLCAweEZGLCAweEZGLCAweDA0LCAweDAwLCAweEY1LCAweEZGLAorCTB4RUYsIDB4RkYsIDB4ODgsIDB4MDAsIDB4NDksIDB4RkUsIDB4NUQsIDB4MDQsIDB4QjcsIDB4RjQsIDB4N0QsCisJMHg0MCwgMHhGRCwgMHgxQiwgMHg2QywgMHhGNCwgMHg3MCwgMHgwNiwgMHg1RiwgMHhGQywgMHhERSwgMHgwMSwKKwkweDM3LCAweEZGLCAweDM2LCAweDAwLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDBFLCAweDAwLCAweEFDLAorCTB4RkYsIDB4MEUsIDB4MDEsIDB4NjYsIDB4RkQsIDB4QkYsIDB4MDUsIDB4QUQsIDB4RjIsIDB4M0IsIDB4M0IsCisJMHhCMCwgMHgyMywgMHhDNCwgMHhGMiwgMHhGRiwgMHgwNiwgMHgzMywgMHhGQywgMHhFNSwgMHgwMSwgMHgzOCwKKwkweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZFLCAweEZGLCAweDIxLCAweDAwLCAweDc3LCAweEZGLAorCTB4NzUsIDB4MDEsIDB4QkYsIDB4RkMsIDB4QUIsIDB4MDYsIDB4QTYsIDB4RjEsIDB4MDUsIDB4MzUsIDB4NDAsCisJMHgyQiwgMHhCRiwgMHhGMSwgMHgyQSwgMHgwNywgMHg0MiwgMHhGQywgMHhDRSwgMHgwMSwgMHg0OCwgMHhGRiwKKwkweDMxLCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUyLCAweEZGLCAweEJDLAorCTB4MDEsIDB4NTgsIDB4RkMsIDB4MUQsIDB4MDcsIDB4OEUsIDB4RjEsIDB4MTEsIDB4MkUsIDB4NkIsIDB4MzIsCisJMHg4MSwgMHhGMSwgMHhFNSwgMHgwNiwgMHg5MCwgMHhGQywgMHg5NCwgMHgwMSwgMHg2NywgMHhGRiwgMHgyNiwKKwkweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDM1LCAweDAwLCAweDNDLCAweEZGLCAweEUwLCAweDAxLAorCTB4MzIsIDB4RkMsIDB4MUMsIDB4MDcsIDB4NEIsIDB4RjIsIDB4QTAsIDB4MjYsIDB4RjIsIDB4MzgsIDB4MkEsCisJMHhGMiwgMHgyOCwgMHgwNiwgMHgxRiwgMHhGRCwgMHgzOSwgMHgwMSwgMHg5NiwgMHhGRiwgMHgxNiwgMHgwMCwKKwkweEZGLCAweEZGLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEU0LCAweDAxLCAweDQ4LAorCTB4RkMsIDB4QjIsIDB4MDYsIDB4QjksIDB4RjMsIDB4RjMsIDB4MUUsIDB4OTgsIDB4M0UsIDB4Q0YsIDB4RjMsCisJMHhGMywgMHgwNCwgMHhFQiwgMHhGRCwgMHhCRiwgMHgwMCwgMHhENCwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMywKKwkweDAwLCAweEZFLCAweEZGLCAweDM0LCAweDAwLCAweDNELCAweEZGLCAweENCLCAweDAxLCAweDkzLCAweEZDLAorCTB4RUYsIDB4MDUsIDB4QjAsIDB4RjUsIDB4NEIsIDB4MTcsIDB4MkEsIDB4NDMsIDB4N0QsIDB4RjYsIDB4NEQsCisJMHgwMywgMHhFRiwgMHhGRSwgMHgyQSwgMHgwMCwgMHgxRSwgMHgwMCwgMHhFMywgMHhGRiwgMHgwOCwgMHgwMCwKKwkweEZGLCAweEZGLCAweDJFLCAweDAwLCAweDRGLCAweEZGLCAweDk5LCAweDAxLCAweDBCLCAweEZELCAweEU2LAorCTB4MDQsIDB4MDgsIDB4RjgsIDB4RTcsIDB4MEYsIDB4N0MsIDB4NDYsIDB4MzcsIDB4RkEsIDB4NDIsIDB4MDEsCisJMHgxRiwgMHgwMCwgMHg4MSwgMHhGRiwgMHg3MSwgMHgwMCwgMHhDMywgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDI2LCAweDAwLCAweDZBLCAweEZGLCAweDU1LCAweDAxLCAweEEzLCAweEZELCAweEFELCAweDAzLAorCTB4OTQsIDB4RkEsIDB4RkYsIDB4MDgsIDB4NzAsIDB4NDgsIDB4RjMsIDB4RkUsIDB4RUEsIDB4RkUsIDB4NkMsCisJMHgwMSwgMHhDRCwgMHhGRSwgMHhDOSwgMHgwMCwgMHhBMSwgMHhGRiwgMHgxNywgMHgwMCwgMHgxRCwgMHgwMCwKKwkweDhBLCAweEZGLCAweDA0LCAweDAxLCAweDUwLCAweEZFLCAweDVBLCAweDAyLCAweDJDLCAweEZELCAweEM2LAorCTB4MDIsIDB4RjIsIDB4NDgsIDB4OUIsIDB4MDQsIDB4NjEsIDB4RkMsIDB4QzMsIDB4MDIsIDB4MTksIDB4RkUsCisJMHgxRSwgMHgwMSwgMHg3RiwgMHhGRiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHhBQywKKwkweEZGLCAweEFFLCAweDAwLCAweDA1LCAweEZGLCAweDAzLCAweDAxLCAweEFBLCAweEZGLCAweDYzLCAweEZELAorCTB4RkQsIDB4NDcsIDB4MEUsIDB4MEIsIDB4QzgsIDB4RjksIDB4MTEsIDB4MDQsIDB4NzEsIDB4RkQsIDB4NkMsCisJMHgwMSwgMHg2MSwgMHhGRiwgMHgyOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhDRCwgMHhGRiwKKwkweDU3LCAweDAwLCAweEI2LCAweEZGLCAweEJFLCAweEZGLCAweEVELCAweDAxLCAweEY1LCAweEY4LCAweDlCLAorCTB4NDUsIDB4MjIsIDB4MTIsIDB4NDgsIDB4RjcsIDB4M0QsIDB4MDUsIDB4RTIsIDB4RkMsIDB4QUIsIDB4MDEsCisJMHg0OSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFQywgMHhGRiwgMHgwNiwKKwkweDAwLCAweDVBLCAweDAwLCAweDlBLCAweEZFLCAweERBLCAweDAzLCAweDhELCAweEY1LCAweEUxLCAweDQxLAorCTB4QTEsIDB4MTksIDB4MDksIDB4RjUsIDB4MzMsIDB4MDYsIDB4NzcsIDB4RkMsIDB4RDYsIDB4MDEsIDB4M0EsCisJMHhGRiwgMHgzNSwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwNywgMHgwMCwgMHhDMCwgMHhGRiwKKwkweEU4LCAweDAwLCAweEE2LCAweEZELCAweDVGLCAweDA1LCAweDMxLCAweEYzLCAweEY2LCAweDNDLCAweDUyLAorCTB4MjEsIDB4MzcsIDB4RjMsIDB4REQsIDB4MDYsIDB4M0IsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzYsIDB4RkYsCisJMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgxQywgMHgwMCwgMHg4NiwgMHhGRiwgMHg1OSwKKwkweDAxLCAweEVDLCAweEZDLCAweDZGLCAweDA2LCAweERDLCAweEYxLCAweDA0LCAweDM3LCAweEYzLCAweDI4LAorCTB4RkMsIDB4RjEsIDB4MjgsIDB4MDcsIDB4MzcsIDB4RkMsIDB4RDgsIDB4MDEsIDB4NDEsIDB4RkYsIDB4MzMsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyQSwgMHgwMCwgMHg1QywgMHhGRiwgMHhBQSwgMHgwMSwKKwkweDcxLCAweEZDLCAweDA3LCAweDA3LCAweDdFLCAweEYxLCAweDQ0LCAweDMwLCAweDQ0LCAweDMwLCAweDdFLAorCTB4RjEsIDB4MDcsIDB4MDcsIDB4NzEsIDB4RkMsIDB4QUEsIDB4MDEsIDB4NUMsIDB4RkYsIDB4MkEsIDB4MDAsCisJMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzMywgMHgwMCwgMHg0MSwgMHhGRiwgMHhEOCwgMHgwMSwgMHgzNywKKwkweEZDLCAweDI4LCAweDA3LCAweEZDLCAweEYxLCAweEYzLCAweDI4LCAweDA0LCAweDM3LCAweERDLCAweEYxLAorCTB4NkYsIDB4MDYsIDB4RUMsIDB4RkMsIDB4NTksIDB4MDEsIDB4ODYsIDB4RkYsIDB4MUMsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHhGRCwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzQiwgMHhGQywKKwkweERELCAweDA2LCAweDM3LCAweEYzLCAweDUyLCAweDIxLCAweEY2LCAweDNDLCAweDMxLCAweEYzLCAweDVGLAorCTB4MDUsIDB4QTYsIDB4RkQsIDB4RTgsIDB4MDAsIDB4QzAsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDEsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQSwgMHhGRiwgMHhENiwgMHgwMSwgMHg3NywgMHhGQywgMHgzMywKKwkweDA2LCAweDA5LCAweEY1LCAweEExLCAweDE5LCAweEUxLCAweDQxLCAweDhELCAweEY1LCAweERBLCAweDAzLAorCTB4OUEsIDB4RkUsIDB4NUEsIDB4MDAsIDB4MDYsIDB4MDAsIDB4RUMsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkYsCisJMHhGRiwgMHgzMCwgMHgwMCwgMHg0OSwgMHhGRiwgMHhBQiwgMHgwMSwgMHhFMiwgMHhGQywgMHgzRCwgMHgwNSwKKwkweDQ4LCAweEY3LCAweDIyLCAweDEyLCAweDlCLCAweDQ1LCAweEY1LCAweEY4LCAweEVELCAweDAxLCAweEJFLAorCTB4RkYsIDB4QjYsIDB4RkYsIDB4NTcsIDB4MDAsIDB4Q0QsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgyOCwgMHgwMCwgMHg2MSwgMHhGRiwgMHg2QywgMHgwMSwgMHg3MSwgMHhGRCwgMHgxMSwgMHgwNCwgMHhDOCwKKwkweEY5LCAweDBFLCAweDBCLCAweEZELCAweDQ3LCAweDYzLCAweEZELCAweEFBLCAweEZGLCAweDAzLCAweDAxLAorCTB4MDUsIDB4RkYsIDB4QUUsIDB4MDAsIDB4QUMsIDB4RkYsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsCisJMHgwMCwgMHg3RiwgMHhGRiwgMHgxRSwgMHgwMSwgMHgxOSwgMHhGRSwgMHhDMywgMHgwMiwgMHg2MSwgMHhGQywKKwkweDlCLCAweDA0LCAweEYyLCAweDQ4LCAweEM2LCAweDAyLCAweDJDLCAweEZELCAweDVBLCAweDAyLCAweDUwLAorCTB4RkUsIDB4MDQsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MUQsIDB4MDAsIDB4MTcsIDB4MDAsIDB4QTEsIDB4RkYsCisJMHhDOSwgMHgwMCwgMHhDRCwgMHhGRSwgMHg2QywgMHgwMSwgMHhFQSwgMHhGRSwgMHhGMywgMHhGRSwgMHg3MCwKKwkweDQ4LCAweEZGLCAweDA4LCAweDk0LCAweEZBLCAweEFELCAweDAzLCAweEEzLCAweEZELCAweDU1LCAweDAxLAorCTB4NkEsIDB4RkYsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEYsIDB4MDAsIDB4QzMsIDB4RkYsIDB4NzEsCisJMHgwMCwgMHg4MSwgMHhGRiwgMHgxRiwgMHgwMCwgMHg0MiwgMHgwMSwgMHgzNywgMHhGQSwgMHg3QywgMHg0NiwKKwkweEU3LCAweDBGLCAweDA4LCAweEY4LCAweEU2LCAweDA0LCAweDBCLCAweEZELCAweDk5LCAweDAxLCAweDRGLAorCTB4RkYsIDB4MkUsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDgsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MUUsIDB4MDAsCisJMHgyQSwgMHgwMCwgMHhFRiwgMHhGRSwgMHg0RCwgMHgwMywgMHg3RCwgMHhGNiwgMHgyQSwgMHg0MywgMHg0QiwKKwkweDE3LCAweEIwLCAweEY1LCAweEVGLCAweDA1LCAweDkzLCAweEZDLCAweENCLCAweDAxLCAweDNELCAweEZGLAorCTB4MzQsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDMsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RDQsIDB4RkYsIDB4QkYsCisJMHgwMCwgMHhFQiwgMHhGRCwgMHhGMywgMHgwNCwgMHhDRiwgMHhGMywgMHg5OCwgMHgzRSwgMHhGMywgMHgxRSwKKwkweEI5LCAweEYzLCAweEIyLCAweDA2LCAweDQ4LCAweEZDLCAweEU0LCAweDAxLCAweDM2LCAweEZGLCAweDM2LAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MTYsIDB4MDAsIDB4OTYsIDB4RkYsIDB4MzksIDB4MDEsCisJMHgxRiwgMHhGRCwgMHgyOCwgMHgwNiwgMHgyQSwgMHhGMiwgMHhGMiwgMHgzOCwgMHhBMCwgMHgyNiwgMHg0QiwKKwkweEYyLCAweDFDLCAweDA3LCAweDMyLCAweEZDLCAweEUwLCAweDAxLCAweDNDLCAweEZGLCAweDM1LCAweDAwLAorCTB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MjYsIDB4MDAsIDB4NjcsIDB4RkYsIDB4OTQsIDB4MDEsIDB4OTAsCisJMHhGQywgMHhFNSwgMHgwNiwgMHg4MSwgMHhGMSwgMHg2QiwgMHgzMiwgMHgxMSwgMHgyRSwgMHg4RSwgMHhGMSwKKwkweDFELCAweDA3LCAweDU4LCAweEZDLCAweEJDLCAweDAxLCAweDUyLCAweEZGLCAweDJFLCAweDAwLCAweEZELAorCTB4RkYsIDB4RkQsIDB4RkYsIDB4MzEsIDB4MDAsIDB4NDgsIDB4RkYsIDB4Q0UsIDB4MDEsIDB4NDIsIDB4RkMsCisJMHgyQSwgMHgwNywgMHhCRiwgMHhGMSwgMHg0MCwgMHgyQiwgMHgwNSwgMHgzNSwgMHhBNiwgMHhGMSwgMHhBQiwKKwkweDA2LCAweEJGLCAweEZDLCAweDc1LCAweDAxLCAweDc3LCAweEZGLCAweDIxLCAweDAwLCAweEZFLCAweEZGLAorCTB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzgsIDB4RkYsIDB4RTUsIDB4MDEsIDB4MzMsIDB4RkMsIDB4RkYsCisJMHgwNiwgMHhDNCwgMHhGMiwgMHhCMCwgMHgyMywgMHgzQiwgMHgzQiwgMHhBRCwgMHhGMiwgMHhCRiwgMHgwNSwKKwkweDY2LCAweEZELCAweDBFLCAweDAxLCAweEFDLCAweEZGLCAweDBFLCAweDAwLCAweDAwLCAweDAwLCAweEZFLAorCTB4RkYsIDB4MzYsIDB4MDAsIDB4MzcsIDB4RkYsIDB4REUsIDB4MDEsIDB4NUYsIDB4RkMsIDB4NzAsIDB4MDYsCisJMHg2QywgMHhGNCwgMHhGRCwgMHgxQiwgMHg3RCwgMHg0MCwgMHhCNywgMHhGNCwgMHg1RCwgMHgwNCwgMHg0OSwKKwkweEZFLCAweDg4LCAweDAwLCAweEVGLCAweEZGLCAweEY1LCAweEZGLCAweDA0LCAweDAwLCAweEZGLCAweEZGLAorCTB4MzIsIDB4MDAsIDB4NDMsIDB4RkYsIDB4QkEsIDB4MDEsIDB4QkMsIDB4RkMsIDB4OTAsIDB4MDUsIDB4OEUsCisJMHhGNiwgMHg2OCwgMHgxNCwgMHg5OSwgMHg0NCwgMHhDRCwgMHhGNywgMHg4RiwgMHgwMiwgMHg2MCwgMHhGRiwKKwkweEVBLCAweEZGLCAweDNFLCAweDAwLCAweEQ3LCAweEZGLCAweDBBLCAweDAwLCAweDAwLCAweDAwLCAweDJCLAorCTB4MDAsIDB4NTksIDB4RkYsIDB4ODEsIDB4MDEsIDB4NDIsIDB4RkQsIDB4NzIsIDB4MDQsIDB4RkYsIDB4RjgsCisJMHgyRCwgMHgwRCwgMHg2OSwgMHg0NywgMHhFQiwgMHhGQiwgMHg2MywgMHgwMCwgMHg5RCwgMHgwMCwgMHgzQywKKwkweEZGLCAweDkzLCAweDAwLCAweEI2LCAweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLAorCTB4NzYsIDB4RkYsIDB4MzcsIDB4MDEsIDB4RTQsIDB4RkQsIDB4MkMsIDB4MDMsIDB4OTQsIDB4RkIsIDB4ODMsCisJMHgwNiwgMHhDRSwgMHg0OCwgMHgwNSwgMHgwMSwgMHhGNSwgMHhGRCwgMHhGMCwgMHgwMSwgMHg4NywgMHhGRSwKKwkweEVBLCAweDAwLCAweDk0LCAweEZGLCAweDFBLCAweDAwLCAweDFBLCAweDAwLCAweDk2LCAweEZGLCAweEUzLAorCTB4MDAsIDB4OTUsIDB4RkUsIDB4RDUsIDB4MDEsIDB4MjYsIDB4RkUsIDB4OTgsIDB4MDAsIDB4QkYsIDB4NDgsCisJMHgwMCwgMHgwNywgMHg2MSwgMHhGQiwgMHg0NiwgMHgwMywgMHhENiwgMHhGRCwgMHgzRCwgMHgwMSwgMHg3MywKKwkweEZGLCAweDIzLCAweDAwLCAweDAwLCAweDAwLCAweDExLCAweDAwLCAweEI5LCAweEZGLCAweDhDLCAweDAwLAorCTB4NEEsIDB4RkYsIDB4ODMsIDB4MDAsIDB4OTEsIDB4MDAsIDB4OTEsIDB4RkIsIDB4M0QsIDB4NDcsIDB4QjcsCisJMHgwRCwgMHhDRCwgMHhGOCwgMHg4OSwgMHgwNCwgMHgzNiwgMHhGRCwgMHg4NiwgMHgwMSwgMHg1NywgMHhGRiwKKwkweDJCLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLCAweEQ5LCAweEZGLCAweDM3LCAweDAwLCAweEY3LAorCTB4RkYsIDB4NDksIDB4RkYsIDB4QjYsIDB4MDIsIDB4ODYsIDB4RjcsIDB4NTMsIDB4NDQsIDB4RkIsIDB4MTQsCisJMHg2MSwgMHhGNiwgMHhBNCwgMHgwNSwgMHhCNCwgMHhGQywgMHhCRSwgMHgwMSwgMHg0MiwgMHhGRiwgMHgzMiwKKwkweDAwLCAweEZGLCAweEZGLCAweDA0LCAweDAwLCAweEY3LCAweEZGLCAweEVBLCAweEZGLCAweDkzLCAweDAwLAorCTB4MzYsIDB4RkUsIDB4N0QsIDB4MDQsIDB4ODUsIDB4RjQsIDB4MUYsIDB4NDAsIDB4OTQsIDB4MUMsIDB4NDcsCisJMHhGNCwgMHg3RSwgMHgwNiwgMHg1QSwgMHhGQywgMHhERiwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwKKwkweEZFLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweEE4LCAweEZGLCAweDE3LCAweDAxLCAweDU3LAorCTB4RkQsIDB4RDYsIDB4MDUsIDB4OTAsIDB4RjIsIDB4QzgsIDB4M0EsIDB4NDYsIDB4MjQsIDB4QUEsIDB4RjIsCisJMHgwNiwgMHgwNywgMHgzMiwgMHhGQywgMHhFNSwgMHgwMSwgMHgzOSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwKKwkweEZGLCAweEZFLCAweEZGLCAweDIyLCAweDAwLCAweDc0LCAweEZGLCAweDdDLCAweDAxLCAweEI1LCAweEZDLAorCTB4QjgsIDB4MDYsIDB4OUMsIDB4RjEsIDB4ODEsIDB4MzQsIDB4RDEsIDB4MkIsIDB4QjMsIDB4RjEsIDB4MjksCisJMHgwNywgMHg0NiwgMHhGQywgMHhDQSwgMHgwMSwgMHg0QSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweEZELCAweEZGLCAweDJFLCAweDAwLCAweDUwLCAweEZGLCAweEMwLCAweDAxLCAweDUzLCAweEZDLCAweDIxLAorCTB4MDcsIDB4OTYsIDB4RjEsIDB4ODIsIDB4MkQsIDB4RjIsIDB4MzIsIDB4ODYsIDB4RjEsIDB4REIsIDB4MDYsCisJMHg5OSwgMHhGQywgMHg4RSwgMHgwMSwgMHg2QSwgMHhGRiwgMHgyNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwKKwkweEZGLCAweDM1LCAweDAwLCAweDNCLCAweEZGLCAweEUyLCAweDAxLCAweDMxLCAweEZDLCAweDE3LCAweDA3LAorCTB4NjEsIDB4RjIsIDB4MEEsIDB4MjYsIDB4NkEsIDB4MzksIDB4NDEsIDB4RjIsIDB4MTUsIDB4MDYsIDB4MkMsCisJMHhGRCwgMHgzMSwgMHgwMSwgMHg5QiwgMHhGRiwgMHgxNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGRSwgMHhGRiwKKwkweDM2LCAweDAwLCAweDM2LCAweEZGLCAweEUzLCAweDAxLCAweDRDLCAweEZDLCAweEE2LCAweDA2LCAweERCLAorCTB4RjMsIDB4NUIsIDB4MUUsIDB4RkMsIDB4M0UsIDB4RkEsIDB4RjMsIDB4RDcsIDB4MDQsIDB4RkQsIDB4RkQsCisJMHhCNCwgMHgwMCwgMHhEOSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywKKwkweDAwLCAweDNFLCAweEZGLCAweEM4LCAweDAxLCAweDlCLCAweEZDLCAweERELCAweDA1LCAweERDLCAweEY1LAorCTB4QjYsIDB4MTYsIDB4NzcsIDB4NDMsIDB4QkQsIDB4RjYsIDB4MjgsIDB4MDMsIDB4MDUsIDB4RkYsIDB4MUQsCisJMHgwMCwgMHgyNSwgMHgwMCwgMHhFMSwgMHhGRiwgMHgwOCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwKKwkweDUxLCAweEZGLCAweDk1LCAweDAxLCAweDE1LCAweEZELCAweENGLCAweDA0LCAweDM5LCAweEY4LCAweDU5LAorCTB4MEYsIDB4QUYsIDB4NDYsIDB4OEIsIDB4RkEsIDB4MTcsIDB4MDEsIDB4MzgsIDB4MDAsIDB4NzMsIDB4RkYsCisJMHg3OCwgMHgwMCwgMHhDMCwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNSwgMHgwMCwgMHg2QywKKwkweEZGLCAweDRGLCAweDAxLCAweEIwLCAweEZELCAweDkzLCAweDAzLCAweEM3LCAweEZBLCAweDdELCAweDA4LAorCTB4ODYsIDB4NDgsIDB4NUEsIDB4RkYsIDB4QkEsIDB4RkUsIDB4ODYsIDB4MDEsIDB4QkYsIDB4RkUsIDB4Q0YsCisJMHgwMCwgMHg5RSwgMHhGRiwgMHgxNywgMHgwMCwgMHgxQywgMHgwMCwgMHg4QywgMHhGRiwgMHhGRSwgMHgwMCwKKwkweDVELCAweEZFLCAweDNGLCAweDAyLCAweDVFLCAweEZELCAweDU0LCAweDAyLCAweEVDLCAweDQ4LCAweDEzLAorCTB4MDUsIDB4MkUsIDB4RkMsIDB4REUsIDB4MDIsIDB4MEMsIDB4RkUsIDB4MjQsIDB4MDEsIDB4N0QsIDB4RkYsCisJMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxNCwgMHgwMCwgMHhBRSwgMHhGRiwgMHhBNywgMHgwMCwgMHgxMiwKKwkweEZGLCAweEVBLCAweDAwLCAweEQ5LCAweEZGLCAweDAzLCAweEZELCAweERDLCAweDQ3LCAweDk1LCAweDBCLAorCTB4OTYsIDB4RjksIDB4MjksIDB4MDQsIDB4NjUsIDB4RkQsIDB4NzEsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksCisJMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHhEMCwgMHhGRiwgMHg1MSwgMHgwMCwgMHhDMywgMHhGRiwKKwkweEE2LCAweEZGLCAweDE2LCAweDAyLCAweEE5LCAweEY4LCAweDVDLCAweDQ1LCAweEIyLCAweDEyLCAweDE5LAorCTB4RjcsIDB4NTIsIDB4MDUsIDB4RDgsIDB4RkMsIDB4QUYsIDB4MDEsIDB4NDcsIDB4RkYsIDB4MzAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhFRSwgMHhGRiwgMHgwMSwgMHgwMCwgMHg2NiwgMHgwMCwgMHg4NSwKKwkweEZFLCAweEZDLCAweDAzLCAweDU1LCAweEY1LCAweDhDLCAweDQxLCAweDM4LCAweDFBLCAweEUxLCAweEY0LAorCTB4NDMsIDB4MDYsIDB4NzAsIDB4RkMsIDB4RDgsIDB4MDEsIDB4MzksIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHgwMSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQiwgMHhGRiwgMHhGMSwgMHgwMCwgMHg5NiwgMHhGRCwKKwkweDc4LCAweDA1LCAweDBFLCAweEYzLCAweDhBLCAweDNDLCAweEVBLCAweDIxLCAweDE5LCAweEYzLCAweEU2LAorCTB4MDYsIDB4MzgsIDB4RkMsIDB4RTYsIDB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsCisJMHhGRSwgMHhGRiwgMHgxRCwgMHgwMCwgMHg4MiwgMHhGRiwgMHg2MCwgMHgwMSwgMHhFMCwgMHhGQywgMHg3RiwKKwkweDA2LCAweENDLCAweEYxLCAweDg1LCAweDM2LCAweDg3LCAweDI5LCAweEVCLCAweEYxLCAweDJBLCAweDA3LAorCTB4MzksIDB4RkMsIDB4RDYsIDB4MDEsIDB4NDMsIDB4RkYsIDB4MzMsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsCisJMHhGRiwgMHgyQiwgMHgwMCwgMHg1OSwgMHhGRiwgMHhBRSwgMHgwMSwgMHg2QSwgMHhGQywgMHgwRCwgMHgwNywKKwkweDgwLCAweEYxLCAweEI4LCAweDJGLCAweENGLCAweDMwLCAweDdELCAweEYxLCAweEZGLCAweDA2LCAweDc4LAorCTB4RkMsIDB4QTUsIDB4MDEsIDB4NUYsIDB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsCisJMHgzNCwgMHgwMCwgMHg0MCwgMHhGRiwgMHhEQiwgMHgwMSwgMHgzNSwgMHhGQywgMHgyNiwgMHgwNywgMHgwRSwKKwkweEYyLCAweDYwLCAweDI4LCAweDgyLCAweDM3LCAweEVELCAweEYxLCAweDVFLCAweDA2LCAweEY4LCAweEZDLAorCTB4NTEsIDB4MDEsIDB4OEEsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsCisJMHgwMCwgMHgzNiwgMHhGRiwgMHhFNiwgMHgwMSwgMHgzRSwgMHhGQywgMHhEMywgMHgwNiwgMHg1NiwgMHhGMywKKwkweEJBLCAweDIwLCAweDYxLCAweDNELCAweDU2LCAweEYzLCAweDQ1LCAweDA1LCAweEI3LCAweEZELCAweERFLAorCTB4MDAsIDB4QzUsIDB4RkYsIDB4MDUsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzUsIDB4MDAsCisJMHgzQSwgMHhGRiwgMHhEMywgMHgwMSwgMHg3RCwgMHhGQywgMHgyMywgMHgwNiwgMHgzMiwgMHhGNSwgMHgwQywKKwkweDE5LCAweDM4LCAweDQyLCAweEM3LCAweEY1LCAweEI4LCAweDAzLCAweEFGLCAweEZFLCAweDRFLCAweDAwLAorCTB4MEMsIDB4MDAsIDB4RUEsIDB4RkYsIDB4MDYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEEsCisJMHhGRiwgMHhBNywgMHgwMSwgMHhFQywgMHhGQywgMHgyOCwgMHgwNSwgMHg3NywgMHhGNywgMHg5MiwgMHgxMSwKKwkweEQ3LCAweDQ1LCAweDQzLCAweEY5LCAweEMzLCAweDAxLCAweEQ2LCAweEZGLCAweEE5LCAweEZGLCAweDVFLAorCTB4MDAsIDB4Q0IsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4NjMsIDB4RkYsCisJMHg2NiwgMHgwMSwgMHg3RCwgMHhGRCwgMHhGOCwgMHgwMywgMHhGQiwgMHhGOSwgMHg4OSwgMHgwQSwgMHgxRCwKKwkweDQ4LCAweEM1LCAweEZELCAweDdBLCAweEZGLCAweDFELCAweDAxLCAweEY3LCAweEZFLCAweEI0LCAweDAwLAorCTB4QTksIDB4RkYsIDB4MTUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MUYsIDB4MDAsIDB4ODIsIDB4RkYsIDB4MTgsCisJMHgwMSwgMHgyNywgMHhGRSwgMHhBOSwgMHgwMiwgMHg5NCwgMHhGQywgMHgyNCwgMHgwNCwgMHhGNSwgMHg0OCwKKwkweDM5LCAweDAzLCAweEY5LCAweEZDLCAweDc0LCAweDAyLCAweDQyLCAweEZFLCAweDBCLCAweDAxLCAweDg3LAorCTB4RkYsIDB4MUUsIDB4MDAsIDB4MTYsIDB4MDAsIDB4QTQsIDB4RkYsIDB4QzIsIDB4MDAsIDB4REIsIDB4RkUsCisJMHg1MiwgMHgwMSwgMHgxQiwgMHhGRiwgMHg4RCwgMHhGRSwgMHg1NywgMHg0OCwgMHg4MSwgMHgwOSwgMHg2MSwKKwkweEZBLCAweEM2LCAweDAzLCAweDk2LCAweEZELCAweDVCLCAweDAxLCAweDY4LCAweEZGLCAweDI2LCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4QzYsIDB4RkYsIDB4NkIsIDB4MDAsIDB4OEUsIDB4RkYsIDB4MDYsCisJMHgwMCwgMHg2RSwgMHgwMSwgMHhFNCwgMHhGOSwgMHg0OCwgMHg0NiwgMHg3NSwgMHgxMCwgMHhENywgMHhGNywKKwkweEZDLCAweDA0LCAweDAwLCAweEZELCAweDlFLCAweDAxLCAweDRFLCAweEZGLCAweDJFLCAweDAwLCAweEZGLAorCTB4RkYsIDB4MDcsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MTgsIDB4MDAsIDB4MzYsIDB4MDAsIDB4RDksIDB4RkUsCisJMHg3MSwgMHgwMywgMHgzRiwgMHhGNiwgMHhEQiwgMHg0MiwgMHhFMCwgMHgxNywgMHg4NiwgMHhGNSwgMHgwMCwKKwkweDA2LCAweDhDLCAweEZDLCAweENFLCAweDAxLCAweDNDLCAweEZGLCAweDM0LCAweDAwLCAweEZFLCAweEZGLAorCTB4MDIsIDB4MDAsIDB4MDEsIDB4MDAsIDB4Q0YsIDB4RkYsIDB4QzksIDB4MDAsIDB4REEsIDB4RkQsIDB4MEYsCisJMHgwNSwgMHhBNSwgMHhGMywgMHgzMSwgMHgzRSwgMHg4QSwgMHgxRiwgMHg5NywgMHhGMywgMHhCRCwgMHgwNiwKKwkweDQ0LCAweEZDLCAweEU1LCAweDAxLCAweDM2LCAweEZGLCAweDM2LCAweDAwLCAweEZELCAweEZGLCAweEZGLAorCTB4RkYsIDB4MTcsIDB4MDAsIDB4OTIsIDB4RkYsIDB4NDEsIDB4MDEsIDB4MTEsIDB4RkQsIDB4M0IsIDB4MDYsCisJMHgxNCwgMHhGMiwgMHg3OCwgMHgzOCwgMHgzNiwgMHgyNywgMHgzNSwgMHhGMiwgMHgyMCwgMHgwNywgMHgzMywKKwkweEZDLCAweERGLCAweDAxLCAweDNFLCAweEZGLCAweDM0LCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLAorCTB4MjgsIDB4MDAsIDB4NjQsIDB4RkYsIDB4OUEsIDB4MDEsIDB4ODgsIDB4RkMsIDB4RUUsIDB4MDYsIDB4N0UsCisJMHhGMSwgMHhFMywgMHgzMSwgMHg5RiwgMHgyRSwgMHg4OCwgMHhGMSwgMHgxOSwgMHgwNywgMHg1RSwgMHhGQywKKwkweEI3LCAweDAxLCAweDU0LCAweEZGLCAweDJELCAweDAwLCAweEZELCAweEZGLCAweEZELCAweEZGLCAweDMyLAorCTB4MDAsIDB4NDYsIDB4RkYsIDB4RDEsIDB4MDEsIDB4M0YsIDB4RkMsIDB4MkIsIDB4MDcsIDB4Q0QsIDB4RjEsCisJMHhBRSwgMHgyQSwgMHg4NiwgMHgzNSwgMHhCMSwgMHhGMSwgMHg5RCwgMHgwNiwgMHhDQSwgMHhGQywgMHg2RSwKKwkweDAxLCAweDdCLCAweEZGLCAweDIwLCAweDAwLCAweEZFLCAweEZGLCAweEZELCAweEZGLCAweDM2LCAweDAwLAorCTB4MzgsIDB4RkYsIDB4RTYsIDB4MDEsIDB4MzUsIDB4RkMsIDB4RjcsIDB4MDYsIDB4RTAsIDB4RjIsIDB4MTgsCisJMHgyMywgMHhBQiwgMHgzQiwgMHhDQywgMHhGMiwgMHhBOCwgMHgwNSwgMHg3NiwgMHhGRCwgMHgwNCwgMHgwMSwKKwkweEIxLCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweDM2LCAweDAwLCAweDM4LAorCTB4RkYsIDB4REMsIDB4MDEsIDB4NjQsIDB4RkMsIDB4NjIsIDB4MDYsIDB4OTMsIDB4RjQsIDB4NjYsIDB4MUIsCisJMHhEOSwgMHg0MCwgMHhFQSwgMHhGNCwgMHgzRSwgMHgwNCwgMHg1RCwgMHhGRSwgMHg3RCwgMHgwMCwgMHhGNSwKKwkweEZGLCAweEYzLCAweEZGLCAweDA1LCAweDAwLCAweEZGLCAweEZGLCAweDMxLCAweDAwLCAweDQ0LCAweEZGLAorCTB4QjcsIDB4MDEsIDB4QzUsIDB4RkMsIDB4N0MsIDB4MDUsIDB4QkMsIDB4RjYsIDB4RDUsIDB4MTMsIDB4REMsCisJMHg0NCwgMHgxNCwgMHhGOCwgMHg2NywgMHgwMiwgMHg3NywgMHhGRiwgMHhERCwgMHhGRiwgMHg0NCwgMHgwMCwKKwkweEQ1LCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLCAweDJBLCAweDAwLCAweDVCLCAweEZGLCAweDdDLAorCTB4MDEsIDB4NEUsIDB4RkQsIDB4NUEsIDB4MDQsIDB4MzEsIDB4RjksIDB4QTQsIDB4MEMsIDB4OTAsIDB4NDcsCisJMHg0NywgMHhGQywgMHgzNiwgMHgwMCwgMHhCNiwgMHgwMCwgMHgyRSwgMHhGRiwgMHg5OSwgMHgwMCwgMHhCMywKKwkweEZGLCAweDEyLCAweDAwLCAweDAwLCAweDAwLCAweDIyLCAweDAwLCAweDc4LCAweEZGLCAweDMxLCAweDAxLAorCTB4RjEsIDB4RkQsIDB4MTIsIDB4MDMsIDB4QzcsIDB4RkIsIDB4MDcsIDB4MDYsIDB4REIsIDB4NDgsIDB4NzMsCisJMHgwMSwgMHhDMywgMHhGRCwgMHgwQSwgMHgwMiwgMHg3OSwgMHhGRSwgMHhGMSwgMHgwMCwgMHg5MSwgMHhGRiwKKwkweDFCLCAweDAwLCAweDE5LCAweDAwLCAweDk5LCAweEZGLCAweERELCAweDAwLCAweEEzLCAweEZFLCAweEJCLAorCTB4MDEsIDB4NTgsIDB4RkUsIDB4MkQsIDB4MDAsIDB4QUYsIDB4NDgsIDB4N0UsIDB4MDcsIDB4MkUsIDB4RkIsCisJMHg2MCwgMHgwMywgMHhDOSwgMHhGRCwgMHg0MywgMHgwMSwgMHg3MSwgMHhGRiwgMHgyNCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDEwLCAweDAwLCAweEJCLCAweEZGLCAweDg1LCAweDAwLCAweDU4LCAweEZGLCAweDZBLCAweDAwLAorCTB4QkUsIDB4MDAsIDB4MzgsIDB4RkIsIDB4MEYsIDB4NDcsIDB4NDIsIDB4MEUsIDB4OUIsIDB4RjgsIDB4QTEsCisJMHgwNCwgMHgyQiwgMHhGRCwgMHg4QiwgMHgwMSwgMHg1NSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDA5LCAweDAwLCAweERDLCAweEZGLCAweDMxLCAweDAwLCAweDA0LCAweDAwLCAweDMyLCAweEZGLCAweERDLAorCTB4MDIsIDB4NDIsIDB4RjcsIDB4MEIsIDB4NDQsIDB4OEUsIDB4MTUsIDB4MzQsIDB4RjYsIDB4QjcsIDB4MDUsCisJMHhBQiwgMHhGQywgMHhDMSwgMHgwMSwgMHg0MCwgMHhGRiwgMHgzMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwNCwKKwkweDAwLCAweEY5LCAweEZGLCAweEU0LCAweEZGLCAweDlGLCAweDAwLCAweDIzLCAweEZFLCAweDlCLCAweDA0LAorCTB4NTUsIDB4RjQsIDB4QzAsIDB4M0YsIDB4MkMsIDB4MUQsIDB4MjIsIDB4RjQsIDB4OEMsIDB4MDYsIDB4NTUsCisJMHhGQywgMHhFMSwgMHgwMSwgMHgzNywgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwKKwkweDExLCAweDAwLCAweEEzLCAweEZGLCAweDIwLCAweDAxLCAweDQ5LCAweEZELCAweEVCLCAweDA1LCAweDc0LAorCTB4RjIsIDB4NTQsIDB4M0EsIDB4REQsIDB4MjQsIDB4OTEsIDB4RjIsIDB4MEMsIDB4MDcsIDB4MzIsIDB4RkMsCisJMHhFNCwgMHgwMSwgMHgzQSwgMHhGRiwgMHgzNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRSwgMHhGRiwgMHgyMywKKwkweDAwLCAweDcxLCAweEZGLCAweDgyLCAweDAxLCAweEFCLCAweEZDLCAweEM0LCAweDA2LCAweDkzLCAweEYxLAorCTB4RkQsIDB4MzMsIDB4NjIsIDB4MkMsIDB4QTgsIDB4RjEsIDB4MjcsIDB4MDcsIDB4NEEsIDB4RkMsIDB4QzcsCisJMHgwMSwgMHg0QywgMHhGRiwgMHgzMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgyRiwgMHgwMCwKKwkweDRFLCAweEZGLCAweEMzLCAweDAxLCAweDRFLCAweEZDLCAweDI0LCAweDA3LCAweDlFLCAweEYxLCAweEYyLAorCTB4MkMsIDB4NzgsIDB4MzMsIDB4OEMsIDB4RjEsIDB4RDAsIDB4MDYsIDB4QTIsIDB4RkMsIDB4ODgsIDB4MDEsCisJMHg2RCwgMHhGRiwgMHgyNCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGRCwgMHhGRiwgMHgzNSwgMHgwMCwgMHgzQiwKKwkweEZGLCAweEUzLCAweDAxLCAweDMxLCAweEZDLCAweDEyLCAweDA3LCAweDc5LCAweEYyLCAweDczLCAweDI1LAorCTB4REYsIDB4MzksIDB4NUEsIDB4RjIsIDB4MDAsIDB4MDYsIDB4M0EsIDB4RkQsIDB4MjgsIDB4MDEsIDB4OUYsCisJMHhGRiwgMHgxMywgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHgzNiwgMHgwMCwgMHgzNiwgMHhGRiwKKwkweEUyLCAweDAxLCAweDUwLCAweEZDLCAweDk5LCAweDA2LCAweEZFLCAweEYzLCAweEMzLCAweDFELCAweDVFLAorCTB4M0YsIDB4MjcsIDB4RjQsIDB4QjksIDB4MDQsIDB4MTAsIDB4RkUsIDB4QTksIDB4MDAsIDB4REYsIDB4RkYsCisJMHhGQiwgMHhGRiwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgzMywgMHgwMCwgMHgzRiwgMHhGRiwgMHhDNSwKKwkweDAxLCAweEEzLCAweEZDLCAweENBLCAweDA1LCAweDA3LCAweEY2LCAweDIyLCAweDE2LCAweEMzLCAweDQzLAorCTB4RkUsIDB4RjYsIDB4MDIsIDB4MDMsIDB4MUIsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MkIsIDB4MDAsIDB4REUsCisJMHhGRiwgMHgwOSwgMHgwMCwgMHhGRiwgMHhGRiwgMHgyRCwgMHgwMCwgMHg1MywgMHhGRiwgMHg5MCwgMHgwMSwKKwkweDIwLCAweEZELCAweEI4LCAweDA0LCAweDZBLCAweEY4LCAweENELCAweDBFLCAweEUxLCAweDQ2LCAweEUxLAorCTB4RkEsIDB4RUIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4NjUsIDB4RkYsIDB4N0YsIDB4MDAsIDB4QkUsIDB4RkYsCisJMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyNCwgMHgwMCwgMHg2RSwgMHhGRiwgMHg0OSwgMHgwMSwgMHhCQywKKwkweEZELCAweDdBLCAweDAzLCAweEZBLCAweEZBLCAweEZELCAweDA3LCAweDlDLCAweDQ4LCAweEMzLCAweEZGLAorCTB4ODksIDB4RkUsIDB4QTEsIDB4MDEsIDB4QjEsIDB4RkUsIDB4RDYsIDB4MDAsIDB4OUMsIDB4RkYsIDB4MTgsCisJMHgwMCwgMHgxQywgMHgwMCwgMHg4RiwgMHhGRiwgMHhGNywgMHgwMCwgMHg2QiwgMHhGRSwgMHgyNSwgMHgwMiwKKwkweDkxLCAweEZELCAweEUzLCAweDAxLCAweEU1LCAweDQ4LCAweDhELCAweDA1LCAweEZCLCAweEZCLCAweEY4LAorCTB4MDIsIDB4RkUsIDB4RkQsIDB4MkIsIDB4MDEsIDB4N0EsIDB4RkYsIDB4MjEsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgxMywgMHgwMCwgMHhCMSwgMHhGRiwgMHhBMCwgMHgwMCwgMHgyMCwgMHhGRiwgMHhEMCwgMHgwMCwgMHgwNywKKwkweDAwLCAweEE0LCAweEZDLCAweEI2LCAweDQ3LCAweDFDLCAweDBDLCAweDYzLCAweEY5LCAweDQyLCAweDA0LAorCTB4NTksIDB4RkQsIDB4NzYsIDB4MDEsIDB4NUQsIDB4RkYsIDB4MkEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEIsCisJMHgwMCwgMHhEMiwgMHhGRiwgMHg0QSwgMHgwMCwgMHhEMCwgMHhGRiwgMHg4RSwgMHhGRiwgMHgzRiwgMHgwMiwKKwkweDVFLCAweEY4LCAweDFFLCAweDQ1LCAweDQ0LCAweDEzLCAweEVBLCAweEY2LCAweDY3LCAweDA1LCAweENGLAorCTB4RkMsIDB4QjMsIDB4MDEsIDB4NDYsIDB4RkYsIDB4MzEsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDUsIDB4MDAsCisJMHhGMCwgMHhGRiwgMHhGQiwgMHhGRiwgMHg3MSwgMHgwMCwgMHg3MSwgMHhGRSwgMHgxRCwgMHgwNCwgMHgxRiwKKwkweEY1LCAweDMyLCAweDQxLCAweENFLCAweDFBLCAweEJBLCAweEY0LCAweDUzLCAweDA2LCAweDZBLCAweEZDLAorCTB4REEsIDB4MDEsIDB4MzgsIDB4RkYsIDB4MzUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MEEsCisJMHgwMCwgMHhCNiwgMHhGRiwgMHhGQiwgMHgwMCwgMHg4NSwgMHhGRCwgMHg5MCwgMHgwNSwgMHhFQywgMHhGMiwKKwkweDFDLCAweDNDLCAweDgxLCAweDIyLCAweEZDLCAweEYyLCAweEVGLCAweDA2LCAweDM2LCAweEZDLCAweEU2LAorCTB4MDEsIDB4MzcsIDB4RkYsIDB4MzYsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MUUsIDB4MDAsCisJMHg3RiwgMHhGRiwgMHg2NywgMHgwMSwgMHhENSwgMHhGQywgMHg4RSwgMHgwNiwgMHhCRSwgMHhGMSwgMHgwNiwKKwkweDM2LCAweDFBLCAweDJBLCAweERDLCAweEYxLCAweDJBLCAweDA3LCAweDNDLCAweEZDLCAweEQzLCAweDAxLAorCTB4NDQsIDB4RkYsIDB4MzIsIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MkMsIDB4MDAsIDB4NTcsCisJMHhGRiwgMHhCMywgMHgwMSwgMHg2NCwgMHhGQywgMHgxMywgMHgwNywgMHg4MywgMHhGMSwgMHgyQywgMHgyRiwKKwkweDVBLCAweDMxLCAweDdELCAweEYxLCAweEY3LCAweDA2LCAweDgwLCAweEZDLCAweDlGLCAweDAxLCAweDYxLAorCTB4RkYsIDB4MjksIDB4MDAsIDB4RkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0YsIDB4RkYsCisJMHhERCwgMHgwMSwgMHgzNCwgMHhGQywgMHgyMywgMHgwNywgMHgyMSwgMHhGMiwgMHhDQiwgMHgyNywgMHhGRSwKKwkweDM3LCAweDAwLCAweEYyLCAweDRELCAweDA2LCAweDA0LCAweEZELCAweDQ5LCAweDAxLCAweDhFLCAweEZGLAorCTB4MTksIDB4MDAsIDB4RkYsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MzYsIDB4MDAsIDB4MzYsIDB4RkYsIDB4RTYsCisJMHgwMSwgMHg0MSwgMHhGQywgMHhDOCwgMHgwNiwgMHg3NiwgMHhGMywgMHgyMiwgMHgyMCwgMHhDQSwgMHgzRCwKKwkweDdELCAweEYzLCAweDJBLCAweDA1LCAweEM4LCAweEZELCAweEQ0LCAweDAwLCAweENBLCAweEZGLCAweDAzLAorCTB4MDAsIDB4MDIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MzQsIDB4MDAsIDB4M0IsIDB4RkYsIDB4RDEsIDB4MDEsCisJMHg4NCwgMHhGQywgMHgxMiwgMHgwNiwgMHg1QywgMHhGNSwgMHg3NiwgMHgxOCwgMHg4OSwgMHg0MiwgMHgwMiwKKwkweEY2LCAweDk0LCAweDAzLCAweEM0LCAweEZFLCAweDQyLCAweDAwLCAweDEyLCAweDAwLCAweEU4LCAweEZGLAorCTB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MkYsIDB4MDAsIDB4NEMsIDB4RkYsIDB4QTIsIDB4MDEsIDB4RjYsCisJMHhGQywgMHgxMiwgMHgwNSwgMHhBNywgMHhGNywgMHgwMywgMHgxMSwgMHgxMCwgMHg0NiwgMHg5MywgMHhGOSwKKwkweDk4LCAweDAxLCAweEVFLCAweEZGLCAweDlCLCAweEZGLCAweDY0LCAweDAwLCAweEM4LCAweEZGLCAweDBFLAorCTB4MDAsIDB4MDAsIDB4MDAsIDB4MjcsIDB4MDAsIDB4NjUsIDB4RkYsIDB4NjAsIDB4MDEsIDB4OEEsIDB4RkQsCisJMHhERiwgMHgwMywgMHgyRSwgMHhGQSwgMHgwNCwgMHgwQSwgMHgzQSwgMHg0OCwgMHgyOCwgMHhGRSwgMHg0QiwKKwkweEZGLCAweDM4LCAweDAxLCAweEU5LCAweEZFLCAweEJCLCAweDAwLCAweEE2LCAweEZGLCAweDE2LCAweDAwLAorCTB4MDAsIDB4MDAsIDB4MUUsIDB4MDAsIDB4ODQsIDB4RkYsIDB4MTEsIDB4MDEsIDB4MzQsIDB4RkUsIDB4OEYsCisJMHgwMiwgMHhDNywgMHhGQywgMHhBRSwgMHgwMywgMHhGNywgMHg0OCwgMHhBRSwgMHgwMywgMHhDNywgMHhGQywKKwkweDhGLCAweDAyLCAweDM0LCAweEZFLCAweDExLCAweDAxLCAweDg0LCAweEZGLCAweDFFLCAweDAwLCAweDAwLAorCTB4MDAsIDB4RjQsIDB4RkYsIDB4MUEsIDB4MDAsIDB4RkYsIDB4MDAsIDB4MDcsIDB4MDMsIDB4MTYsIDB4MDYsCisJMHg3QywgMHgwOSwgMHgyQSwgMHgwQywgMHgyRSwgMHgwRCwgMHgyQSwgMHgwQywgMHg3QywgMHgwOSwgMHgxNiwKKwkweDA2LCAweDA3LCAweDAzLCAweEZGLCAweDAwLCAweDFBLCAweDAwLCAweEY0LCAweEZGLCAweEYyLCAweEZGLAorCTB4QTAsIDB4RkYsIDB4NzEsIDB4RkYsIDB4NzEsIDB4MDAsIDB4ODYsIDB4MDMsIDB4NzMsIDB4MDgsIDB4ODgsCisJMHgwRCwgMHg3OCwgMHgxMCwgMHhDOSwgMHgwRiwgMHhENSwgMHgwQiwgMHg4QiwgMHgwNiwgMHgyOCwgMHgwMiwKKwkweERGLCAweEZGLCAweDZGLCAweEZGLCAweEMzLCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLCAweERDLAorCTB4RkYsIDB4ODAsIDB4RkYsIDB4OUEsIDB4RkYsIDB4NDYsIDB4MDEsIDB4MUUsIDB4MDUsIDB4NUEsIDB4MEEsCisJMHhFRCwgMHgwRSwgMHhBQSwgMHgxMCwgMHhBRiwgMHgwRSwgMHhGRCwgMHgwOSwgMHhDQiwgMHgwNCwgMHgxOCwKKwkweDAxLCAweDhFLCAweEZGLCAweDg1LCAweEZGLCAweEUxLCAweEZGLCAweEZDLCAweEZGLCAweEJELCAweEZGLAorCTB4NkQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4NjUsIDB4MDIsIDB4RTUsIDB4MDYsIDB4MkIsIDB4MEMsIDB4RjMsCisJMHgwRiwgMHg2MCwgMHgxMCwgMHgzQiwgMHgwRCwgMHgxNiwgMHgwOCwgMHgzRiwgMHgwMywgMHg1MCwgMHgwMCwKKwkweDZFLCAweEZGLCAweEE3LCAweEZGLCAweEY1LCAweEZGLCAweEVGLCAweEZGLCAweDlBLCAweEZGLCAweDc1LAorCTB4RkYsIDB4OTEsIDB4MDAsIDB4QzksIDB4MDMsIDB4QzgsIDB4MDgsIDB4Q0MsIDB4MEQsIDB4ODksIDB4MTAsCisJMHg5RiwgMHgwRiwgMHg4NSwgMHgwQiwgMHgzQiwgMHgwNiwgMHhGNCwgMHgwMSwgMHhDRCwgMHhGRiwgMHg3MiwKKwkweEZGLCAweEM5LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ3LCAweEZGLCAweDdCLCAweEZGLAorCTB4QTUsIDB4RkYsIDB4NzMsIDB4MDEsIDB4NkEsIDB4MDUsIDB4QUQsIDB4MEEsIDB4MjEsIDB4MEYsIDB4QTYsCisJMHgxMCwgMHg3NCwgMHgwRSwgMHhBOSwgMHgwOSwgMHg4MywgMHgwNCwgMHhGMCwgMHgwMCwgMHg4NSwgMHhGRiwKKwkweDhCLCAweEZGLCAweEU1LCAweEZGLCAweEZBLCAweEZGLCAweEI3LCAweEZGLCAweDZDLCAweEZGLCAweDBDLAorCTB4MDAsIDB4OUQsIDB4MDIsIDB4MzcsIDB4MDcsIDB4NzgsIDB4MEMsIDB4MTUsIDB4MTAsIDB4NDcsIDB4MTAsCisJMHhGMywgMHgwQywgMHhDMiwgMHgwNywgMHgwMSwgMHgwMywgMHgzNSwgMHgwMCwgMHg2RCwgMHhGRiwgMHhBRCwKKwkweEZGLCAweEY3LCAweEZGLCAweEVCLCAweEZGLCAweDk0LCAweEZGLCAweDdBLCAweEZGLCAweEIzLCAweDAwLAorCTB4MEQsIDB4MDQsIDB4MUMsIDB4MDksIDB4MEQsIDB4MEUsIDB4OTcsIDB4MTAsIDB4NzMsIDB4MEYsIDB4MzUsCisJMHgwQiwgMHhFQiwgMHgwNSwgMHhDMSwgMHgwMSwgMHhCRCwgMHhGRiwgMHg3NSwgMHhGRiwgMHhDRSwgMHhGRiwKKwkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQyLCAweEZGLCAweDc3LCAweEZGLCAweEIzLCAweEZGLCAweEExLAorCTB4MDEsIDB4QjcsIDB4MDUsIDB4RkYsIDB4MEEsIDB4NTMsIDB4MEYsIDB4OUUsIDB4MTAsIDB4MzcsIDB4MEUsCisJMHg1NSwgMHgwOSwgMHgzQiwgMHgwNCwgMHhDQiwgMHgwMCwgMHg3RSwgMHhGRiwgMHg5MCwgMHhGRiwgMHhFOSwKKwkweEZGLCAweEY4LCAweEZGLCAweEIxLCAweEZGLCAweDZDLCAweEZGLCAweDI0LCAweDAwLCAweEQ4LCAweDAyLAorCTB4OEEsIDB4MDcsIDB4QzIsIDB4MEMsIDB4MzQsIDB4MTAsIDB4MkEsIDB4MTAsIDB4QUEsIDB4MEMsIDB4NkYsCisJMHgwNywgMHhDNCwgMHgwMiwgMHgxQywgMHgwMCwgMHg2QywgMHhGRiwgMHhCMywgMHhGRiwgMHhGOSwgMHhGRiwKKwkweEU4LCAweEZGLCAweDhFLCAweEZGLCAweDgwLCAweEZGLCAweEQ3LCAweDAwLCAweDUzLCAweDA0LCAweDcxLAorCTB4MDksIDB4NEMsIDB4MEUsIDB4QTEsIDB4MTAsIDB4NDMsIDB4MEYsIDB4RTMsIDB4MEEsIDB4OUQsIDB4MDUsCisJMHg5MSwgMHgwMSwgMHhBRSwgMHhGRiwgMHg3OSwgMHhGRiwgMHhENCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweENELCAweEZGLCAweDc0LCAweEZGLCAweEMyLCAweEZGLCAweEQyLCAweDAxLCAweDA2LCAweDA2LAorCTB4NTAsIDB4MEIsIDB4ODIsIDB4MEYsIDB4OTMsIDB4MTAsIDB4RjgsIDB4MEQsIDB4MDAsIDB4MDksIDB4RjYsCisJMHgwMywgMHhBNywgMHgwMCwgMHg3OCwgMHhGRiwgMHg5NiwgMHhGRiwgMHhFQywgMHhGRiwgMHhGNiwgMHhGRiwKKwkweEFCLCAweEZGLCAweDZELCAweEZGLCAweDNFLCAweDAwLCAweDE1LCAweDAzLCAweERFLCAweDA3LCAweDBCLAorCTB4MEQsIDB4NTAsIDB4MTAsIDB4MEEsIDB4MTAsIDB4NUUsIDB4MEMsIDB4MUMsIDB4MDcsIDB4OEEsIDB4MDIsCisJMHgwNCwgMHgwMCwgMHg2QywgMHhGRiwgMHhCOSwgMHhGRiwgMHhGQiwgMHhGRiwgMHhFNCwgMHhGRiwgMHg4OSwKKwkweEZGLCAweDg4LCAweEZGLCAweEZELCAweDAwLCAweDlCLCAweDA0LCAweEM1LCAweDA5LCAweDg4LCAweDBFLAorCTB4QTgsIDB4MTAsIDB4MTAsIDB4MEYsIDB4OTEsIDB4MEEsIDB4NTAsIDB4MDUsIDB4NjQsIDB4MDEsIDB4QTEsCisJMHhGRiwgMHg3RCwgMHhGRiwgMHhEOSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNywgMHhGRiwKKwkweDcxLCAweEZGLCAweEQzLCAweEZGLCAweDA1LCAweDAyLCAweDU1LCAweDA2LCAweEEwLCAweDBCLCAweEFELAorCTB4MEYsIDB4ODQsIDB4MTAsIDB4QjYsIDB4MEQsIDB4QUMsIDB4MDgsIDB4QjMsIDB4MDMsIDB4ODYsIDB4MDAsCisJMHg3NCwgMHhGRiwgMHg5QywgMHhGRiwgMHhGMCwgMHhGRiwgMHhGNCwgMHhGRiwgMHhBNSwgMHhGRiwgMHg2RiwKKwkweEZGLCAweDVBLCAweDAwLCAweDU0LCAweDAzLCAweDMyLCAweDA4LCAweDUyLCAweDBELCAweDY4LCAweDEwLAorCTB4RTYsIDB4MEYsIDB4MTEsIDB4MEMsIDB4Q0EsIDB4MDYsIDB4NTIsIDB4MDIsIDB4RUYsIDB4RkYsIDB4NkUsCisJMHhGRiwgMHhCRiwgMHhGRiwgMHhGQywgMHhGRiwgMHhERiwgMHhGRiwgMHg4NCwgMHhGRiwgMHg5MSwgMHhGRiwKKwkweDI1LCAweDAxLCAweEU0LCAweDA0LCAweDE5LCAweDBBLCAweEMyLCAweDBFLCAweEFBLCAweDEwLCAweERBLAorCTB4MEUsIDB4M0UsIDB4MEEsIDB4MDUsIDB4MDUsIDB4MzgsIDB4MDEsIDB4OTYsIDB4RkYsIDB4ODEsIDB4RkYsCisJMHhERCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhDMSwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFNiwKKwkweEZGLCAweDNBLCAweDAyLCAweEE2LCAweDA2LCAweEVGLCAweDBCLCAweEQ2LCAweDBGLCAweDcxLCAweDEwLAorCTB4NzEsIDB4MEQsIDB4NTcsIDB4MDgsIDB4NzEsIDB4MDMsIDB4NjcsIDB4MDAsIDB4NzAsIDB4RkYsIDB4QTIsCisJMHhGRiwgMHhGMywgMHhGRiwgMHhGMSwgMHhGRiwgMHg5RiwgMHhGRiwgMHg3MiwgMHhGRiwgMHg3OCwgMHgwMCwKKwkweDk1LCAweDAzLCAweDg2LCAweDA4LCAweDk4LCAweDBELCAweDdDLCAweDEwLCAweEMwLCAweDBGLCAweEMzLAorCTB4MEIsIDB4NzksIDB4MDYsIDB4MUMsIDB4MDIsIDB4REIsIDB4RkYsIDB4NzAsIDB4RkYsIDB4QzUsIDB4RkYsCisJMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGRiwgMHg3RiwgMHhGRiwgMHg5QywgMHhGRiwgMHg1MCwKKwkweDAxLCAweDJGLCAweDA1LCAweDZDLCAweDBBLCAweEY5LCAweDBFLCAweEE5LCAweDEwLCAweEEyLCAweDBFLAorCTB4RUEsIDB4MDksIDB4QkIsIDB4MDQsIDB4MEYsIDB4MDEsIDB4OEMsIDB4RkYsIDB4ODcsIDB4RkYsIDB4RTIsCisJMHhGRiwgMHhGQywgMHhGRiwgMHhCQywgMHhGRiwgMHg2RCwgMHhGRiwgMHhGQSwgMHhGRiwgMHg3MSwgMHgwMiwKKwkweEY3LCAweDA2LCAweDNDLCAweDBDLCAweEZCLCAweDBGLCAweDVCLCAweDEwLCAweDJCLCAweDBELCAweDAzLAorCTB4MDgsIDB4MzEsIDB4MDMsIDB4NEEsIDB4MDAsIDB4NkUsIDB4RkYsIDB4QTgsIDB4RkYsIDB4RjUsIDB4RkYsCisJMHhFRSwgMHhGRiwgMHg5OSwgMHhGRiwgMHg3NiwgMHhGRiwgMHg5OCwgMHgwMCwgMHhEOCwgMHgwMywgMHhEQiwKKwkweDA4LCAweERCLCAweDBELCAweDhELCAweDEwLCAweDk2LCAweDBGLCAweDczLCAweDBCLCAweDI5LCAweDA2LAorCTB4RTgsIDB4MDEsIDB4QzksIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHhENiwgMHhGRiwgMHg3QSwgMHhGRiwgMHhBOCwgMHhGRiwgMHg3RCwgMHgwMSwgMHg3QiwgMHgwNSwKKwkweEJGLCAweDBBLCAweDJELCAweDBGLCAweEE1LCAweDEwLCAweDY3LCAweDBFLCAweDk2LCAweDA5LCAweDczLAorCTB4MDQsIDB4RTcsIDB4MDAsIDB4ODQsIDB4RkYsIDB4OEMsIDB4RkYsIDB4RTYsIDB4RkYsIDB4RkEsIDB4RkYsCisJMHhCNiwgMHhGRiwgMHg2QywgMHhGRiwgMHgxMSwgMHgwMCwgMHhBQSwgMHgwMiwgMHg0QSwgMHgwNywgMHg4OCwKKwkweDBDLCAweDFDLCAweDEwLCAweDQxLCAweDEwLCAweEUzLCAweDBDLCAweEFGLCAweDA3LCAweEYzLCAweDAyLAorCTB4MkYsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QUUsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RUEsIDB4RkYsIDB4OTMsCisJMHhGRiwgMHg3QiwgMHhGRiwgMHhCQiwgMHgwMCwgMHgxQywgMHgwNCwgMHgyRiwgMHgwOSwgMHgxQiwgMHgwRSwKKwkweDlBLCAweDEwLCAweDY4LCAweDBGLCAweDIzLCAweDBCLCAweERBLCAweDA1LCAweEI3LCAweDAxLCAweEI5LAorCTB4RkYsIDB4NzYsIDB4RkYsIDB4RDAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDEsIDB4RkYsCisJMHg3NiwgMHhGRiwgMHhCNiwgMHhGRiwgMHhBQywgMHgwMSwgMHhDOCwgMHgwNSwgMHgxMSwgMHgwQiwgMHg1RSwKKwkweDBGLCAweDlDLCAweDEwLCAweDI5LCAweDBFLCAweDQyLCAweDA5LCAweDJDLCAweDA0LCAweEMyLCAweDAwLAorCTB4N0QsIDB4RkYsIDB4OTIsIDB4RkYsIDB4RUEsIDB4RkYsIDB4RjgsIDB4RkYsIDB4QjAsIDB4RkYsIDB4NkMsCisJMHhGRiwgMHgyOSwgMHgwMCwgMHhFNiwgMHgwMiwgMHg5RCwgMHgwNywgMHhEMywgMHgwQywgMHgzQiwgMHgxMCwKKwkweDIzLCAweDEwLCAweDk5LCAweDBDLCAweDVDLCAweDA3LCAweEI3LCAweDAyLCAweDE2LCAweDAwLCAweDZDLAorCTB4RkYsIDB4QjQsIDB4RkYsIDB4RjksIDB4RkYsIDB4RTcsIDB4RkYsIDB4OEQsIDB4RkYsIDB4ODIsIDB4RkYsCisJMHhERiwgMHgwMCwgMHg2MywgMHgwNCwgMHg4NCwgMHgwOSwgMHg1OSwgMHgwRSwgMHhBMywgMHgxMCwgMHgzOCwKKwkweDBGLCAweEQxLCAweDBBLCAweDhDLCAweDA1LCAweDg3LCAweDAxLCAweEFCLCAweEZGLCAweDc5LCAweEZGLAorCTB4RDUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4Q0IsIDB4RkYsIDB4NzMsIDB4RkYsIDB4QzYsCisJMHhGRiwgMHhERCwgMHgwMSwgMHgxNywgMHgwNiwgMHg2MiwgMHgwQiwgMHg4QywgMHgwRiwgMHg5MCwgMHgxMCwKKwkweEU5LCAweDBELCAweEVELCAweDA4LCAweEU3LCAweDAzLCAweEEwLCAweDAwLCAweDc3LCAweEZGLCAweDk3LAorCTB4RkYsIDB4RUQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4QTksIDB4RkYsIDB4NkQsIDB4RkYsIDB4NDQsIDB4MDAsCisJMHgyMywgMHgwMywgMHhGMSwgMHgwNywgMHgxQiwgMHgwRCwgMHg1NSwgMHgxMCwgMHgwMiwgMHgxMCwgMHg0RCwKKwkweDBDLCAweDBBLCAweDA3LCAweDdFLCAweDAyLCAweEZGLCAweEZGLCAweDZELCAweEZGLCAweEJBLCAweEZGLAorCTB4RkIsIDB4RkYsIDB4RTMsIDB4RkYsIDB4ODgsIDB4RkYsIDB4OEEsIDB4RkYsIDB4MDYsIDB4MDEsIDB4QUIsCisJMHgwNCwgMHhEOCwgMHgwOSwgMHg5NSwgMHgwRSwgMHhBOSwgMHgxMCwgMHgwNSwgMHgwRiwgMHg3RiwgMHgwQSwKKwkweDQwLCAweDA1LCAweDVBLCAweDAxLCAweDlGLCAweEZGLCAweDdFLCAweEZGLCAweERBLCAweEZGLCAweDAwLAorCTB4MDAsIDB4RkUsIDB4RkYsIDB4QzYsIDB4RkYsIDB4NzAsIDB4RkYsIDB4RDcsIDB4RkYsIDB4MTAsIDB4MDIsCisJMHg2NywgMHgwNiwgMHhCMSwgMHgwQiwgMHhCNywgMHgwRiwgMHg4MCwgMHgxMCwgMHhBNywgMHgwRCwgMHg5OSwKKwkweDA4LCAweEE0LCAweDAzLCAweDdGLCAweDAwLCAweDczLCAweEZGLCAweDlELCAweEZGLCAweEYwLCAweEZGLAorCTB4RjMsIDB4RkYsIDB4QTMsIDB4RkYsIDB4NzAsIDB4RkYsIDB4NjAsIDB4MDAsIDB4NjIsIDB4MDMsIDB4NDUsCisJMHgwOCwgMHg2MiwgMHgwRCwgMHg2QywgMHgxMCwgMHhERSwgMHgwRiwgMHgwMCwgMHgwQywgMHhCOCwgMHgwNiwKKwkweDQ2LCAweDAyLCAweEVBLCAweEZGLCAweDZFLCAweEZGLCAweEMwLCAweEZGLCAweEZELCAweEZGLCAweDAwLAorCTB4MDAsIDB4REUsIDB4RkYsIDB4ODMsIDB4RkYsIDB4OTQsIDB4RkYsIDB4MkYsIDB4MDEsIDB4RjQsIDB4MDQsCisJMHgyQiwgMHgwQSwgMHhDRSwgMHgwRSwgMHhBQSwgMHgxMCwgMHhDRSwgMHgwRSwgMHgyQiwgMHgwQSwgMHhGNCwKKwkweDA0LCAweDJGLCAweDAxLCAweDk0LCAweEZGLCAweDgzLCAweEZGLCAweERFLCAweEZGLCAweEZELCAweEZGLAorCTB4QzAsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RUEsIDB4RkYsIDB4NDYsIDB4MDIsIDB4QjgsIDB4MDYsIDB4MDAsCisJMHgwQywgMHhERSwgMHgwRiwgMHg2QywgMHgxMCwgMHg2MiwgMHgwRCwgMHg0NSwgMHgwOCwgMHg2MiwgMHgwMywKKwkweDYwLCAweDAwLCAweDcwLCAweEZGLCAweEEzLCAweEZGLCAweEYzLCAweEZGLCAweEYwLCAweEZGLCAweDlELAorCTB4RkYsIDB4NzMsIDB4RkYsIDB4N0YsIDB4MDAsIDB4QTQsIDB4MDMsIDB4OTksIDB4MDgsIDB4QTcsIDB4MEQsCisJMHg4MCwgMHgxMCwgMHhCNywgMHgwRiwgMHhCMSwgMHgwQiwgMHg2NywgMHgwNiwgMHgxMCwgMHgwMiwgMHhENywKKwkweEZGLCAweDcwLCAweEZGLCAweEM2LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweERBLCAweEZGLAorCTB4N0UsIDB4RkYsIDB4OUYsIDB4RkYsIDB4NUEsIDB4MDEsIDB4NDAsIDB4MDUsIDB4N0YsIDB4MEEsIDB4MDUsCisJMHgwRiwgMHhBOSwgMHgxMCwgMHg5NSwgMHgwRSwgMHhEOCwgMHgwOSwgMHhBQiwgMHgwNCwgMHgwNiwgMHgwMSwKKwkweDhBLCAweEZGLCAweDg4LCAweEZGLCAweEUzLCAweEZGLCAweEZCLCAweEZGLCAweEJBLCAweEZGLCAweDZELAorCTB4RkYsIDB4RkYsIDB4RkYsIDB4N0UsIDB4MDIsIDB4MEEsIDB4MDcsIDB4NEQsIDB4MEMsIDB4MDIsIDB4MTAsCisJMHg1NSwgMHgxMCwgMHgxQiwgMHgwRCwgMHhGMSwgMHgwNywgMHgyMywgMHgwMywgMHg0NCwgMHgwMCwgMHg2RCwKKwkweEZGLCAweEE5LCAweEZGLCAweEY2LCAweEZGLCAweEVELCAweEZGLCAweDk3LCAweEZGLCAweDc3LCAweEZGLAorCTB4QTAsIDB4MDAsIDB4RTcsIDB4MDMsIDB4RUQsIDB4MDgsIDB4RTksIDB4MEQsIDB4OTAsIDB4MTAsIDB4OEMsCisJMHgwRiwgMHg2MiwgMHgwQiwgMHgxNywgMHgwNiwgMHhERCwgMHgwMSwgMHhDNiwgMHhGRiwgMHg3MywgMHhGRiwKKwkweENCLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEQ1LCAweEZGLCAweDc5LCAweEZGLCAweEFCLAorCTB4RkYsIDB4ODcsIDB4MDEsIDB4OEMsIDB4MDUsIDB4RDEsIDB4MEEsIDB4MzgsIDB4MEYsIDB4QTMsIDB4MTAsCisJMHg1OSwgMHgwRSwgMHg4NCwgMHgwOSwgMHg2MywgMHgwNCwgMHhERiwgMHgwMCwgMHg4MiwgMHhGRiwgMHg4RCwKKwkweEZGLCAweEU3LCAweEZGLCAweEY5LCAweEZGLCAweEI0LCAweEZGLCAweDZDLCAweEZGLCAweDE2LCAweDAwLAorCTB4QjcsIDB4MDIsIDB4NUMsIDB4MDcsIDB4OTksIDB4MEMsIDB4MjMsIDB4MTAsIDB4M0IsIDB4MTAsIDB4RDMsCisJMHgwQywgMHg5RCwgMHgwNywgMHhFNiwgMHgwMiwgMHgyOSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCMCwgMHhGRiwKKwkweEY4LCAweEZGLCAweEVBLCAweEZGLCAweDkyLCAweEZGLCAweDdELCAweEZGLCAweEMyLCAweDAwLCAweDJDLAorCTB4MDQsIDB4NDIsIDB4MDksIDB4MjksIDB4MEUsIDB4OUMsIDB4MTAsIDB4NUUsIDB4MEYsIDB4MTEsIDB4MEIsCisJMHhDOCwgMHgwNSwgMHhBQywgMHgwMSwgMHhCNiwgMHhGRiwgMHg3NiwgMHhGRiwgMHhEMSwgMHhGRiwgMHhGRiwKKwkweEZGLCAweEZGLCAweEZGLCAweEQwLCAweEZGLCAweDc2LCAweEZGLCAweEI5LCAweEZGLCAweEI3LCAweDAxLAorCTB4REEsIDB4MDUsIDB4MjMsIDB4MEIsIDB4NjgsIDB4MEYsIDB4OUEsIDB4MTAsIDB4MUIsIDB4MEUsIDB4MkYsCisJMHgwOSwgMHgxQywgMHgwNCwgMHhCQiwgMHgwMCwgMHg3QiwgMHhGRiwgMHg5MywgMHhGRiwgMHhFQSwgMHhGRiwKKwkweEY3LCAweEZGLCAweEFFLCAweEZGLCAweDZDLCAweEZGLCAweDJGLCAweDAwLCAweEYzLCAweDAyLCAweEFGLAorCTB4MDcsIDB4RTMsIDB4MEMsIDB4NDEsIDB4MTAsIDB4MUMsIDB4MTAsIDB4ODgsIDB4MEMsIDB4NEEsIDB4MDcsCisJMHhBQSwgMHgwMiwgMHgxMSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCNiwgMHhGRiwgMHhGQSwgMHhGRiwgMHhFNiwKKwkweEZGLCAweDhDLCAweEZGLCAweDg0LCAweEZGLCAweEU3LCAweDAwLCAweDczLCAweDA0LCAweDk2LCAweDA5LAorCTB4NjcsIDB4MEUsIDB4QTUsIDB4MTAsIDB4MkQsIDB4MEYsIDB4QkYsIDB4MEEsIDB4N0IsIDB4MDUsIDB4N0QsCisJMHgwMSwgMHhBOCwgMHhGRiwgMHg3QSwgMHhGRiwgMHhENiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweENBLCAweEZGLCAweDcyLCAweEZGLCAweEM5LCAweEZGLCAweEU4LCAweDAxLCAweDI5LCAweDA2LCAweDczLAorCTB4MEIsIDB4OTYsIDB4MEYsIDB4OEQsIDB4MTAsIDB4REIsIDB4MEQsIDB4REIsIDB4MDgsIDB4RDgsIDB4MDMsCisJMHg5OCwgMHgwMCwgMHg3NiwgMHhGRiwgMHg5OSwgMHhGRiwgMHhFRSwgMHhGRiwgMHhGNSwgMHhGRiwgMHhBOCwKKwkweEZGLCAweDZFLCAweEZGLCAweDRBLCAweDAwLCAweDMxLCAweDAzLCAweDAzLCAweDA4LCAweDJCLCAweDBELAorCTB4NUIsIDB4MTAsIDB4RkIsIDB4MEYsIDB4M0MsIDB4MEMsIDB4RjcsIDB4MDYsIDB4NzEsIDB4MDIsIDB4RkEsCisJMHhGRiwgMHg2RCwgMHhGRiwgMHhCQywgMHhGRiwgMHhGQywgMHhGRiwgMHhFMiwgMHhGRiwgMHg4NywgMHhGRiwKKwkweDhDLCAweEZGLCAweDBGLCAweDAxLCAweEJCLCAweDA0LCAweEVBLCAweDA5LCAweEEyLCAweDBFLCAweEE5LAorCTB4MTAsIDB4RjksIDB4MEUsIDB4NkMsIDB4MEEsIDB4MkYsIDB4MDUsIDB4NTAsIDB4MDEsIDB4OUMsIDB4RkYsCisJMHg3RiwgMHhGRiwgMHhEQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNSwgMHhGRiwgMHg3MCwKKwkweEZGLCAweERCLCAweEZGLCAweDFDLCAweDAyLCAweDc5LCAweDA2LCAweEMzLCAweDBCLCAweEMwLCAweDBGLAorCTB4N0MsIDB4MTAsIDB4OTgsIDB4MEQsIDB4ODYsIDB4MDgsIDB4OTUsIDB4MDMsIDB4NzgsIDB4MDAsIDB4NzIsCisJMHhGRiwgMHg5RiwgMHhGRiwgMHhGMSwgMHhGRiwgMHhGMywgMHhGRiwgMHhBMiwgMHhGRiwgMHg3MCwgMHhGRiwKKwkweDY3LCAweDAwLCAweDcxLCAweDAzLCAweDU3LCAweDA4LCAweDcxLCAweDBELCAweDcxLCAweDEwLCAweEQ2LAorCTB4MEYsIDB4RUYsIDB4MEIsIDB4QTYsIDB4MDYsIDB4M0EsIDB4MDIsIDB4RTYsIDB4RkYsIDB4NkUsIDB4RkYsCisJMHhDMSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhERCwgMHhGRiwgMHg4MSwgMHhGRiwgMHg5NiwKKwkweEZGLCAweDM4LCAweDAxLCAweDA1LCAweDA1LCAweDNFLCAweDBBLCAweERBLCAweDBFLCAweEFBLCAweDEwLAorCTB4QzIsIDB4MEUsIDB4MTksIDB4MEEsIDB4RTQsIDB4MDQsIDB4MjUsIDB4MDEsIDB4OTEsIDB4RkYsIDB4ODQsCisJMHhGRiwgMHhERiwgMHhGRiwgMHhGQywgMHhGRiwgMHhCRiwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFRiwgMHhGRiwKKwkweDUyLCAweDAyLCAweENBLCAweDA2LCAweDExLCAweDBDLCAweEU2LCAweDBGLCAweDY4LCAweDEwLCAweDUyLAorCTB4MEQsIDB4MzIsIDB4MDgsIDB4NTQsIDB4MDMsIDB4NUEsIDB4MDAsIDB4NkYsIDB4RkYsIDB4QTUsIDB4RkYsCisJMHhGNCwgMHhGRiwgMHhGMCwgMHhGRiwgMHg5QywgMHhGRiwgMHg3NCwgMHhGRiwgMHg4NiwgMHgwMCwgMHhCMywKKwkweDAzLCAweEFDLCAweDA4LCAweEI2LCAweDBELCAweDg0LCAweDEwLCAweEFELCAweDBGLCAweEEwLCAweDBCLAorCTB4NTUsIDB4MDYsIDB4MDUsIDB4MDIsIDB4RDMsIDB4RkYsIDB4NzEsIDB4RkYsIDB4QzcsIDB4RkYsIDB4RkUsCisJMHhGRiwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGRiwgMHg3RCwgMHhGRiwgMHhBMSwgMHhGRiwgMHg2NCwgMHgwMSwKKwkweDUwLCAweDA1LCAweDkxLCAweDBBLCAweDEwLCAweDBGLCAweEE4LCAweDEwLCAweDg4LCAweDBFLCAweEM1LAorCTB4MDksIDB4OUIsIDB4MDQsIDB4RkQsIDB4MDAsIDB4ODgsIDB4RkYsIDB4ODksIDB4RkYsIDB4RTQsIDB4RkYsCisJMHhGQiwgMHhGRiwgMHhCOSwgMHhGRiwgMHg2QywgMHhGRiwgMHgwNCwgMHgwMCwgMHg4QSwgMHgwMiwgMHgxQywKKwkweDA3LCAweDVFLCAweDBDLCAweDBBLCAweDEwLCAweDUwLCAweDEwLCAweDBCLCAweDBELCAweERFLCAweDA3LAorCTB4MTUsIDB4MDMsIDB4M0UsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUIsIDB4RkYsIDB4RjYsIDB4RkYsIDB4RUMsCisJMHhGRiwgMHg5NiwgMHhGRiwgMHg3OCwgMHhGRiwgMHhBNywgMHgwMCwgMHhGNiwgMHgwMywgMHgwMCwgMHgwOSwKKwkweEY4LCAweDBELCAweDkzLCAweDEwLCAweDgyLCAweDBGLCAweDUwLCAweDBCLCAweDA2LCAweDA2LCAweEQyLAorCTB4MDEsIDB4QzIsIDB4RkYsIDB4NzQsIDB4RkYsIDB4Q0QsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHhENCwgMHhGRiwgMHg3OSwgMHhGRiwgMHhBRSwgMHhGRiwgMHg5MSwgMHgwMSwgMHg5RCwgMHgwNSwgMHhFMywKKwkweDBBLCAweDQzLCAweDBGLCAweEExLCAweDEwLCAweDRDLCAweDBFLCAweDcxLCAweDA5LCAweDUzLCAweDA0LAorCTB4RDcsIDB4MDAsIDB4ODAsIDB4RkYsIDB4OEUsIDB4RkYsIDB4RTgsIDB4RkYsIDB4RjksIDB4RkYsIDB4QjMsCisJMHhGRiwgMHg2QywgMHhGRiwgMHgxQywgMHgwMCwgMHhDNCwgMHgwMiwgMHg2RiwgMHgwNywgMHhBQSwgMHgwQywKKwkweDJBLCAweDEwLCAweDM0LCAweDEwLCAweEMyLCAweDBDLCAweDhBLCAweDA3LCAweEQ4LCAweDAyLCAweDI0LAorCTB4MDAsIDB4NkMsIDB4RkYsIDB4QjEsIDB4RkYsIDB4RjgsIDB4RkYsIDB4RTksIDB4RkYsIDB4OTAsIDB4RkYsCisJMHg3RSwgMHhGRiwgMHhDQiwgMHgwMCwgMHgzQiwgMHgwNCwgMHg1NSwgMHgwOSwgMHgzNywgMHgwRSwgMHg5RSwKKwkweDEwLCAweDUzLCAweDBGLCAweEZGLCAweDBBLCAweEI3LCAweDA1LCAweEExLCAweDAxLCAweEIzLCAweEZGLAorCTB4NzcsIDB4RkYsIDB4RDIsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0UsIDB4RkYsIDB4NzUsCisJMHhGRiwgMHhCRCwgMHhGRiwgMHhDMSwgMHgwMSwgMHhFQiwgMHgwNSwgMHgzNSwgMHgwQiwgMHg3MywgMHgwRiwKKwkweDk3LCAweDEwLCAweDBELCAweDBFLCAweDFDLCAweDA5LCAweDBELCAweDA0LCAweEIzLCAweDAwLCAweDdBLAorCTB4RkYsIDB4OTQsIDB4RkYsIDB4RUIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4QUQsIDB4RkYsIDB4NkQsIDB4RkYsCisJMHgzNSwgMHgwMCwgMHgwMSwgMHgwMywgMHhDMiwgMHgwNywgMHhGMywgMHgwQywgMHg0NywgMHgxMCwgMHgxNSwKKwkweDEwLCAweDc4LCAweDBDLCAweDM3LCAweDA3LCAweDlELCAweDAyLCAweDBDLCAweDAwLCAweDZDLCAweEZGLAorCTB4QjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RTUsIDB4RkYsIDB4OEIsIDB4RkYsIDB4ODUsIDB4RkYsIDB4RjAsCisJMHgwMCwgMHg4MywgMHgwNCwgMHhBOSwgMHgwOSwgMHg3NCwgMHgwRSwgMHhBNiwgMHgxMCwgMHgyMSwgMHgwRiwKKwkweEFELCAweDBBLCAweDZBLCAweDA1LCAweDczLCAweDAxLCAweEE1LCAweEZGLCAweDdCLCAweEZGLCAweEQ3LAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzksIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0QsIDB4RkYsCisJMHhGNCwgMHgwMSwgMHgzQiwgMHgwNiwgMHg4NSwgMHgwQiwgMHg5RiwgMHgwRiwgMHg4OSwgMHgxMCwgMHhDQywKKwkweDBELCAweEM4LCAweDA4LCAweEM5LCAweDAzLCAweDkxLCAweDAwLCAweDc1LCAweEZGLCAweDlBLCAweEZGLAorCTB4RUYsIDB4RkYsIDB4RjUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4NkUsIDB4RkYsIDB4NTAsIDB4MDAsIDB4M0YsCisJMHgwMywgMHgxNiwgMHgwOCwgMHgzQiwgMHgwRCwgMHg2MCwgMHgxMCwgMHhGMywgMHgwRiwgMHgyQiwgMHgwQywKKwkweEU1LCAweDA2LCAweDY1LCAweDAyLCAweEY2LCAweEZGLCAweDZELCAweEZGLCAweEJELCAweEZGLCAweEZDLAorCTB4RkYsIDB4RTEsIDB4RkYsIDB4ODUsIDB4RkYsIDB4OEUsIDB4RkYsIDB4MTgsIDB4MDEsIDB4Q0IsIDB4MDQsCisJMHhGRCwgMHgwOSwgMHhBRiwgMHgwRSwgMHhBQSwgMHgxMCwgMHhFRCwgMHgwRSwgMHg1QSwgMHgwQSwgMHgxRSwKKwkweDA1LCAweDQ2LCAweDAxLCAweDlBLCAweEZGLCAweDgwLCAweEZGLCAweERDLCAweEZGLCAweDAwLCAweDAwLAorCTB4RkQsIDB4RkYsIDB4QzMsIDB4RkYsIDB4NkYsIDB4RkYsIDB4REYsIDB4RkYsIDB4MjgsIDB4MDIsIDB4OEIsCisJMHgwNiwgMHhENSwgMHgwQiwgMHhDOSwgMHgwRiwgMHg3OCwgMHgxMCwgMHg4OCwgMHgwRCwgMHg3MywgMHgwOCwKKwkweDg2LCAweDAzLCAweDcxLCAweDAwLCAweDcxLCAweEZGLCAweEEwLCAweEZGLCAweEYyLCAweEZGLCAweEYyLAorCTB4RkYsIDB4QTEsIDB4RkYsIDB4NzEsIDB4RkYsIDB4NkUsIDB4MDAsIDB4N0YsIDB4MDMsIDB4NkEsIDB4MDgsCisJMHg4MSwgMHgwRCwgMHg3NiwgMHgxMCwgMHhDRCwgMHgwRiwgMHhERCwgMHgwQiwgMHg5NCwgMHgwNiwgMHgyRSwKKwkweDAyLCAweEUxLCAweEZGLCAweDZGLCAweEZGLCAweEMzLCAweEZGLCAweEZELCAweEZGLCAweDAwLCAweDAwLAorCTB4REMsIDB4RkYsIDB4ODAsIDB4RkYsIDB4OTgsIDB4RkYsIDB4NDIsIDB4MDEsIDB4MTYsIDB4MDUsIDB4NTAsCisJMHgwQSwgMHhFNywgMHgwRSwgMHhBQSwgMHgxMCwgMHhCNSwgMHgwRSwgMHgwNiwgMHgwQSwgMHhEMywgMHgwNCwKKwkweDFDLCAweDAxLCAweDhGLCAweEZGLCAweDg1LCAweEZGLCAweEUwLCAweEZGLCAweEZDLCAweEZGLCAweEJFLAorCTB4RkYsIDB4NkQsIDB4RkYsIDB4RjMsIDB4RkYsIDB4NUUsIDB4MDIsIDB4REMsIDB4MDYsIDB4MjMsIDB4MEMsCisJMHhFRiwgMHgwRiwgMHg2MywgMHgxMCwgMHg0MywgMHgwRCwgMHgxRiwgMHgwOCwgMHg0NiwgMHgwMywgMHg1MywKKwkweDAwLCAweDZFLCAweEZGLCAweEE2LCAweEZGLCAweEY0LCAweEZGLCAweEVGLCAweEZGLCAweDlCLCAweEZGLAorCTB4NzUsIDB4RkYsIDB4OEQsIDB4MDAsIDB4QzEsIDB4MDMsIDB4QkUsIDB4MDgsIDB4QzQsIDB4MEQsIDB4ODgsCisJMHgxMCwgMHhBNCwgMHgwRiwgMHg4RSwgMHgwQiwgMHg0MywgMHgwNiwgMHhGOSwgMHgwMSwgMHhDRiwgMHhGRiwKKwkweDcxLCAweEZGLCAweEM4LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ4LCAweEZGLCAweDdDLAorCTB4RkYsIDB4QTQsIDB4RkYsIDB4NkUsIDB4MDEsIDB4NjEsIDB4MDUsIDB4QTMsIDB4MEEsIDB4MUMsIDB4MEYsCisJMHhBNywgMHgxMCwgMHg3QiwgMHgwRSwgMHhCMiwgMHgwOSwgMHg4QiwgMHgwNCwgMHhGNCwgMHgwMCwgMHg4NiwKKwkweEZGLCAweDhBLCAweEZGLCAweEU0LCAweEZGLCAweEZBLCAweEZGLCAweEI4LCAweEZGLCAweDZDLCAweEZGLAorCTB4MDksIDB4MDAsIDB4OTcsIDB4MDIsIDB4MkUsIDB4MDcsIDB4NkYsIDB4MEMsIDB4MTEsIDB4MTAsIDB4NEEsCisJMHgxMCwgMHhGQiwgMHgwQywgMHhDQiwgMHgwNywgMHgwNywgMHgwMywgMHgzOCwgMHgwMCwgMHg2RCwgMHhGRiwKKwkweEFDLCAweEZGLCAweEY3LCAweEZGLCAweEVDLCAweEZGLCAweDk1LCAweEZGLCAweDc5LCAweEZGLCAweEFGLAorCTB4MDAsIDB4MDUsIDB4MDQsIDB4MTMsIDB4MDksIDB4MDYsIDB4MEUsIDB4OTYsIDB4MTAsIDB4NzgsIDB4MEYsCisJMHgzRSwgMHgwQiwgMHhGNCwgMHgwNSwgMHhDNywgMHgwMSwgMHhCRiwgMHhGRiwgMHg3NCwgMHhGRiwgMHhDRSwKKwkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQyLCAweEZGLCAweDc4LCAweEZGLCAweEIxLCAweEZGLAorCTB4OUMsIDB4MDEsIDB4QUUsIDB4MDUsIDB4RjYsIDB4MEEsIDB4NEUsIDB4MEYsIDB4OUYsIDB4MTAsIDB4M0UsCisJMHgwRSwgMHg1RSwgMHgwOSwgMHg0MywgMHgwNCwgMHhDRiwgMHgwMCwgMHg3RiwgMHhGRiwgMHg5MCwgMHhGRiwKKwkweEU4LCAweEZGLCAweEY5LCAweEZGLCAweEIyLCAweEZGLCAweDZDLCAweEZGLCAweDIxLCAweDAwLCAweEQyLAorCTB4MDIsIDB4ODEsIDB4MDcsIDB4QkEsIDB4MEMsIDB4MzEsIDB4MTAsIDB4MkUsIDB4MTAsIDB4QjIsIDB4MEMsCisJMHg3OCwgMHgwNywgMHhDQiwgMHgwMiwgMHgxRSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCMiwgMHhGRiwgMHhGOSwKKwkweEZGLCAweEU4LCAweEZGLCAweDhGLCAweEZGLCAweDgwLCAweEZGLCAweEQzLCAweDAwLCAweDRCLCAweDA0LAorCTB4NjcsIDB4MDksIDB4NDUsIDB4MEUsIDB4QTAsIDB4MTAsIDB4NDgsIDB4MEYsIDB4RUMsIDB4MEEsIDB4QTYsCisJMHgwNSwgMHg5NywgMHgwMSwgMHhCMCwgMHhGRiwgMHg3OCwgMHhGRiwgMHhEMywgMHhGRiwgMHgwMCwgMHgwMCwKKwkweEZGLCAweEZGLCAweENELCAweEZGLCAweDc0LCAweEZGLCAweEMwLCAweEZGLCAweENDLCAweDAxLCAweEZELAorCTB4MDUsIDB4NDcsIDB4MEIsIDB4N0QsIDB4MEYsIDB4OTQsIDB4MTAsIDB4RkYsIDB4MEQsIDB4MEEsIDB4MDksCisJMHhGRSwgMHgwMywgMHhBQiwgMHgwMCwgMHg3OSwgMHhGRiwgMHg5NSwgMHhGRiwgMHhFQywgMHhGRiwgMHhGNywKKwkweEZGLCAweEFDLCAweEZGLCAweDZELCAweEZGLCAweDNCLCAweDAwLCAweDBFLCAweDAzLCAweEQ1LCAweDA3LAorCTB4MDMsIDB4MEQsIDB4NEQsIDB4MTAsIDB4MEUsIDB4MTAsIDB4NjcsIDB4MEMsIDB4MjUsIDB4MDcsIDB4OTEsCisJMHgwMiwgMHgwNywgMHgwMCwgMHg2QywgMHhGRiwgMHhCOCwgMHhGRiwgMHhGQiwgMHhGRiwgMHhFNCwgMHhGRiwKKwkweDg5LCAweEZGLCAweDg3LCAweEZGLCAweEY5LCAweDAwLCAweDkzLCAweDA0LCAweEJDLCAweDA5LCAweDgyLAorCTB4MEUsIDB4QTcsIDB4MTAsIDB4MTYsIDB4MEYsIDB4OUEsIDB4MEEsIDB4NTksIDB4MDUsIDB4NjksIDB4MDEsCisJMHhBMywgMHhGRiwgMHg3QywgMHhGRiwgMHhEOCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDOCwKKwkweEZGLCAweDcxLCAweEZGLCAweEQxLCAweEZGLCAweEZGLCAweDAxLCAweDRDLCAweDA2LCAweDk3LCAweDBCLAorCTB4QTksIDB4MEYsIDB4ODYsIDB4MTAsIDB4QkQsIDB4MEQsIDB4QjUsIDB4MDgsIDB4QkEsIDB4MDMsIDB4OEEsCisJMHgwMCwgMHg3NCwgMHhGRiwgMHg5QiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGNCwgMHhGRiwgMHhBNSwgMHhGRiwKKwkweDZGLCAweEZGLCAweDU3LCAweDAwLCAweDRELCAweDAzLCAweDI5LCAweDA4LCAweDRCLCAweDBELCAweDY1LAorCTB4MTAsIDB4RUIsIDB4MEYsIDB4MUEsIDB4MEMsIDB4RDMsIDB4MDYsIDB4NTgsIDB4MDIsIDB4RjEsIDB4RkYsCisJMHg2RCwgMHhGRiwgMHhCRSwgMHhGRiwgMHhGQywgMHhGRiwgMHhFMCwgMHhGRiwgMHg4NCwgMHhGRiwgMHg5MCwKKwkweEZGLCAweDIxLCAweDAxLCAweERDLCAweDA0LCAweDEwLCAweDBBLCAweEJCLCAweDBFLCAweEFBLCAweDEwLAorCTB4RTEsIDB4MEUsIDB4NDcsIDB4MEEsIDB4MEQsIDB4MDUsIDB4M0QsIDB4MDEsIDB4OTcsIDB4RkYsIDB4ODEsCisJMHhGRiwgMHhERCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhDMiwgMHhGRiwgMHg2RiwgMHhGRiwKKwkweEU0LCAweEZGLCAweDM0LCAweDAyLCAweDlELCAweDA2LCAweEU2LCAweDBCLCAweEQxLCAweDBGLCAweDczLAorCTB4MTAsIDB4NzksIDB4MEQsIDB4NjEsIDB4MDgsIDB4NzgsIDB4MDMsIDB4NkEsIDB4MDAsIDB4NzAsIDB4RkYsCisJMHhBMSwgMHhGRiwgMHhGMiwgMHhGRiwgMHhGMSwgMHhGRiwgMHg5RiwgMHhGRiwgMHg3MiwgMHhGRiwgMHg3NCwKKwkweDAwLCAweDhFLCAweDAzLCAweDdELCAweDA4LCAweDkwLCAweDBELCAweDdBLCAweDEwLCAweEM0LCAweDBGLAorCTB4Q0MsIDB4MEIsIDB4ODIsIDB4MDYsIDB4MjIsIDB4MDIsIDB4REQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4QzQsCisJMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEQiwgMHhGRiwgMHg3RiwgMHhGRiwgMHg5QiwgMHhGRiwKKwkweDRCLCAweDAxLCAweDI2LCAweDA1LCAweDYzLCAweDBBLCAweEYzLCAweDBFLCAweEFBLCAweDEwLCAweEE4LAorCTB4MEUsIDB4RjQsIDB4MDksIDB4QzMsIDB4MDQsIDB4MTMsIDB4MDEsIDB4OEQsIDB4RkYsIDB4ODYsIDB4RkYsCisJMHhFMSwgMHhGRiwgMHhGQywgMHhGRiwgMHhCQywgMHhGRiwgMHg2RCwgMHhGRiwgMHhGOCwgMHhGRiwgMHg2QiwKKwkweDAyLCAweEVFLCAweDA2LCAweDM0LCAweDBDLCAweEY3LCAweDBGLCAweDVELCAweDEwLCAweDMzLCAweDBELAorCTB4MEQsIDB4MDgsIDB4MzgsIDB4MDMsIDB4NEQsIDB4MDAsIDB4NkUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4RjUsCisJMHhGRiwgMHhFRSwgMHhGRiwgMHg5OSwgMHhGRiwgMHg3NiwgMHhGRiwgMHg5NCwgMHgwMCwgMHhEMCwgMHgwMywKKwkweEQxLCAweDA4LCAweEQzLCAweDBELCAweDhCLCAweDEwLCAweDlBLCAweDBGLCAweDdDLCAweDBCLCAweDMyLAorCTB4MDYsIDB4RUUsIDB4MDEsIDB4Q0IsIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4RkUsIDB4RkYsCisJMHgwMCwgMHgwMCwgMHhENiwgMHhGRiwgMHg3QiwgMHhGRiwgMHhBNywgMHhGRiwgMHg3OCwgMHgwMSwgMHg3MiwKKwkweDA1LCAweEI2LCAweDBBLCAweDI3LCAweDBGLCAweEE1LCAweDEwLCAweDZFLCAweDBFLCAweEEwLCAweDA5LAorCTB4N0IsIDB4MDQsIDB4RUMsIDB4MDAsIDB4ODUsIDB4RkYsIDB4OEIsIDB4RkYsIDB4RTUsIDB4RkYsIDB4RkEsCisJMHhGRiwgMHhCNiwgMHhGRiwgMHg2QywgMHhGRiwgMHgwRSwgMHgwMCwgMHhBNCwgMHgwMiwgMHg0MSwgMHgwNywKKwkweDgwLCAweDBDLCAweDE5LCAweDEwLCAweDQ0LCAweDEwLCAweEVCLCAweDBDLCAweEI5LCAweDA3LCAweEZBLAorCTB4MDIsIDB4MzIsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUUsIDB4RkYsIDB4RjcsIDB4RkYsIDB4RUIsIDB4RkYsCisJMHg5MywgMHhGRiwgMHg3QiwgMHhGRiwgMHhCNywgMHgwMCwgMHgxNSwgMHgwNCwgMHgyNiwgMHgwOSwgMHgxNCwKKwkweDBFLCAweDk4LCAweDEwLCAweDZELCAweDBGLCAweDJDLCAweDBCLCAweEUzLCAweDA1LCAweEJDLCAweDAxLAorCTB4QkIsIDB4RkYsIDB4NzUsIDB4RkYsIDB4Q0YsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RDEsCisJMHhGRiwgMHg3NywgMHhGRiwgMHhCNSwgMHhGRiwgMHhBNiwgMHgwMSwgMHhDMCwgMHgwNSwgMHgwOCwgMHgwQiwKKwkweDU4LCAweDBGLCAweDlELCAweDEwLCAweDMwLCAweDBFLCAweDRCLCAweDA5LCAweDM0LCAweDA0LCAweEM2LAorCTB4MDAsIDB4N0QsIDB4RkYsIDB4OTEsIDB4RkYsIDB4RTksIDB4RkYsIDB4RjgsIDB4RkYsIDB4QjAsIDB4RkYsCisJMHg2QywgMHhGRiwgMHgyNywgMHgwMCwgMHhERiwgMHgwMiwgMHg5NCwgMHgwNywgMHhDQSwgMHgwQywgMHgzNywKKwkweDEwLCAweDI3LCAweDEwLCAweEExLCAweDBDLCAweDY1LCAweDA3LCAweEJFLCAweDAyLCAweDE5LCAweDAwLAorCTB4NkMsIDB4RkYsIDB4QjQsIDB4RkYsIDB4RjksIDB4RkYsIDB4RTcsIDB4RkYsIDB4OEUsIDB4RkYsIDB4ODEsCisJMHhGRiwgMHhEQiwgMHgwMCwgMHg1QiwgMHgwNCwgMHg3QSwgMHgwOSwgMHg1MywgMHgwRSwgMHhBMiwgMHgxMCwKKwkweDNELCAweDBGLCAweERBLCAweDBBLCAweDk1LCAweDA1LCAweDhDLCAweDAxLCAweEFELCAweEZGLCAweDc5LAorCTB4RkYsIDB4RDQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4Q0MsIDB4RkYsIDB4NzMsIDB4RkYsCisJMHhDNCwgMHhGRiwgMHhENywgMHgwMSwgMHgwRSwgMHgwNiwgMHg1OSwgMHgwQiwgMHg4NywgMHgwRiwgMHg5MSwKKwkweDEwLCAweEYwLCAweDBELCAweEY3LCAweDA4LCAweEVGLCAweDAzLCAweEEzLCAweDAwLCAweDc4LCAweEZGLAorCTB4OTcsIDB4RkYsIDB4RUQsIDB4RkYsIDB4RjYsIDB4RkYsIDB4QUEsIDB4RkYsIDB4NkQsIDB4RkYsIDB4NDEsCisJMHgwMCwgMHgxQywgMHgwMywgMHhFNywgMHgwNywgMHgxMywgMHgwRCwgMHg1MiwgMHgxMCwgMHgwNiwgMHgxMCwKKwkweDU2LCAweDBDLCAweDEzLCAweDA3LCAweDg0LCAweDAyLCAweDAyLCAweDAwLCAweDZELCAweEZGLCAweEJBLAorCTB4RkYsIDB4RkIsIDB4RkYsIDB4RTMsIDB4RkYsIDB4ODgsIDB4RkYsIDB4ODksIDB4RkYsIDB4MDEsIDB4MDEsCisJMHhBMywgMHgwNCwgMHhDRSwgMHgwOSwgMHg4RiwgMHgwRSwgMHhBOCwgMHgxMCwgMHgwQSwgMHgwRiwgMHg4OCwKKwkweDBBLCAweDQ4LCAweDA1LCAweDVGLCAweDAxLCAweEEwLCAweEZGLCAweDdELCAweEZGLCAweEQ5LCAweEZGLAorCTB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4QzcsIDB4RkYsIDB4NzAsIDB4RkYsIDB4RDUsIDB4RkYsIDB4MEIsCisJMHgwMiwgMHg1RSwgMHgwNiwgMHhBOSwgMHgwQiwgMHhCMiwgMHgwRiwgMHg4MiwgMHgxMCwgMHhBRSwgMHgwRCwKKwkweEEyLCAweDA4LCAweEFCLCAweDAzLCAweDgyLCAweDAwLCAweDczLCAweEZGLCAweDlELCAweEZGLCAweEYwLAorCTB4RkYsIDB4RjMsIDB4RkYsIDB4QTQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4NUQsIDB4MDAsIDB4NUIsIDB4MDMsCisJMHgzQiwgMHgwOCwgMHg1QSwgMHgwRCwgMHg2QSwgMHgxMCwgMHhFMiwgMHgwRiwgMHgwOSwgMHgwQywgMHhDMSwKKwkweDA2LCAweDRDLCAweDAyLCAweEVDLCAweEZGLCAweDZFLCAweEZGLCAweEMwLCAweEZGLCAweEZDLCAweEZGLAorCTB4REYsIDB4RkYsIDB4ODMsIDB4RkYsIDB4OTMsIDB4RkYsIDB4MkEsIDB4MDEsIDB4RUMsIDB4MDQsIDB4MjIsCisJMHgwQSwgMHhDOCwgMHgwRSwgMHhBQiwgMHgxMCwgMHhENCwgMHgwRSwgMHgzNSwgMHgwQSwgMHhGRCwgMHgwNCwKKwkweDMzLCAweDAxLCAweDk1LCAweEZGLCAweDgyLCAweEZGLCAweERFLCAweEZGLCAweDAwLCAweDAwLCAweEZELAorCTB4RkYsIDB4QzEsIDB4RkYsIDB4NkUsIDB4RkYsIDB4RTgsIDB4RkYsIDB4NDAsIDB4MDIsIDB4QUYsIDB4MDYsCisJMHhGNywgMHgwQiwgMHhEQSwgMHgwRiwgMHg2RiwgMHgxMCwgMHg2QSwgMHgwRCwgMHg0RSwgMHgwOCwgMHg2QSwKKwkweDAzLCAweDY0LCAweDAwLCAweDcwLCAweEZGLCAweEEzLCAweEZGLCAweEYzLCAweEZGLCAweEYxLCAweEZGLAorCTB4OUUsIDB4RkYsIDB4NzIsIDB4RkYsIDB4N0IsIDB4MDAsIDB4OUMsIDB4MDMsIDB4OTAsIDB4MDgsIDB4OUYsCisJMHgwRCwgMHg3RSwgMHgxMCwgMHhCQiwgMHgwRiwgMHhCQSwgMHgwQiwgMHg3MCwgMHgwNiwgMHgxNiwgMHgwMiwKKwkweEQ5LCAweEZGLCAweDcwLCAweEZGLCAweEM1LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweERBLAorCTB4RkYsIDB4N0UsIDB4RkYsIDB4OUQsIDB4RkYsIDB4NTUsIDB4MDEsIDB4MzcsIDB4MDUsIDB4NzUsIDB4MEEsCisJMHhGRiwgMHgwRSwgMHhBOSwgMHgxMCwgMHg5QywgMHgwRSwgMHhFMSwgMHgwOSwgMHhCMywgMHgwNCwgMHgwQSwKKwkweDAxLCAweDhCLCAweEZGLCAweDg3LCAweEZGLCAweEUyLCAweEZGLCAweEZCLCAweEZGLCAweEJCLCAweEZGLAorCTB4NkQsIDB4RkYsIDB4RkQsIDB4RkYsIDB4NzcsIDB4MDIsIDB4MDEsIDB4MDcsIDB4NDUsIDB4MEMsIDB4RkYsCisJMHgwRiwgMHg1OCwgMHgxMCwgMHgyMywgMHgwRCwgMHhGQSwgMHgwNywgMHgyQSwgMHgwMywgMHg0NywgMHgwMCwKKwkweDZFLCAweEZGLCAweEE5LCAweEZGLCAweEY1LCAweEZGLCAweEVELCAweEZGLCAweDk4LCAweEZGLCAweDc3LAorCTB4RkYsIDB4OUMsIDB4MDAsIDB4REYsIDB4MDMsIDB4RTQsIDB4MDgsIDB4RTIsIDB4MEQsIDB4OEUsIDB4MTAsCisJMHg5MSwgMHgwRiwgMHg2QiwgMHgwQiwgMHgyMCwgMHgwNiwgMHhFMywgMHgwMSwgMHhDOCwgMHhGRiwgMHg3MywKKwkweEZGLCAweENCLCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEQ1LCAweEZGLCAweDdBLCAweEZGLAorCTB4QUEsIDB4RkYsIDB4ODIsIDB4MDEsIDB4ODMsIDB4MDUsIDB4QzgsIDB4MEEsIDB4MzIsIDB4MEYsIDB4QTQsCisJMHgxMCwgMHg2MCwgMHgwRSwgMHg4RCwgMHgwOSwgMHg2QiwgMHgwNCwgMHhFMywgMHgwMCwgMHg4MywgMHhGRiwKKwkweDhELCAweEZGLCAweEU2LCAweEZGLCAweEZBLCAweEZGLCAweEI1LCAweEZGLCAweDZDLCAweEZGLCAweDE0LAorCTB4MDAsIDB4QjEsIDB4MDIsIDB4NTMsIDB4MDcsIDB4OTEsIDB4MEMsIDB4MjAsIDB4MTAsIDB4M0UsIDB4MTAsCisJMHhEQiwgMHgwQywgMHhBNiwgMHgwNywgMHhFQywgMHgwMiwgMHgyQywgMHgwMCwgMHg2QywgMHhGRiwgMHhBRiwKKwkweEZGLCAweEY4LCAweEZGLCAweEVBLCAweEZGLCAweDkyLCAweEZGLCAweDdDLCAweEZGLCAweEJFLCAweDAwLAorCTB4MjQsIDB4MDQsIDB4MzgsIDB4MDksIDB4MjIsIDB4MEUsIDB4OUIsIDB4MTAsIDB4NjMsIDB4MEYsIDB4MUEsCisJMHgwQiwgMHhEMSwgMHgwNSwgMHhCMSwgMHgwMSwgMHhCOCwgMHhGRiwgMHg3NiwgMHhGRiwgMHhEMCwgMHhGRiwKKwkweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEQwLCAweEZGLCAweDc2LCAweEZGLCAweEI4LCAweEZGLCAweEIxLAorCTB4MDEsIDB4RDEsIDB4MDUsIDB4MUEsIDB4MEIsIDB4NjMsIDB4MEYsIDB4OUIsIDB4MTAsIDB4MjIsIDB4MEUsCisJMHgzOCwgMHgwOSwgMHgyNCwgMHgwNCwgMHhCRSwgMHgwMCwgMHg3QywgMHhGRiwgMHg5MiwgMHhGRiwgMHhFQSwKKwkweEZGLCAweEY4LCAweEZGLCAweEFGLCAweEZGLCAweDZDLCAweEZGLCAweDJDLCAweDAwLCAweEVDLCAweDAyLAorCTB4QTYsIDB4MDcsIDB4REIsIDB4MEMsIDB4M0UsIDB4MTAsIDB4MjAsIDB4MTAsIDB4OTEsIDB4MEMsIDB4NTMsCisJMHgwNywgMHhCMSwgMHgwMiwgMHgxNCwgMHgwMCwgMHg2QywgMHhGRiwgMHhCNSwgMHhGRiwgMHhGQSwgMHhGRiwKKwkweEU2LCAweEZGLCAweDhELCAweEZGLCAweDgzLCAweEZGLCAweEUzLCAweDAwLCAweDZCLCAweDA0LCAweDhELAorCTB4MDksIDB4NjAsIDB4MEUsIDB4QTQsIDB4MTAsIDB4MzIsIDB4MEYsIDB4QzgsIDB4MEEsIDB4ODMsIDB4MDUsCisJMHg4MiwgMHgwMSwgMHhBQSwgMHhGRiwgMHg3QSwgMHhGRiwgMHhENSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwKKwkweEZGLCAweENCLCAweEZGLCAweDczLCAweEZGLCAweEM4LCAweEZGLCAweEUzLCAweDAxLCAweDIwLCAweDA2LAorCTB4NkIsIDB4MEIsIDB4OTEsIDB4MEYsIDB4OEUsIDB4MTAsIDB4RTIsIDB4MEQsIDB4RTQsIDB4MDgsIDB4REYsCisJMHgwMywgMHg5QywgMHgwMCwgMHg3NywgMHhGRiwgMHg5OCwgMHhGRiwgMHhFRCwgMHhGRiwgMHhGNSwgMHhGRiwKKwkweEE5LCAweEZGLCAweDZFLCAweEZGLCAweDQ3LCAweDAwLCAweDJBLCAweDAzLCAweEZBLCAweDA3LCAweDIzLAorCTB4MEQsIDB4NTgsIDB4MTAsIDB4RkYsIDB4MEYsIDB4NDUsIDB4MEMsIDB4MDEsIDB4MDcsIDB4NzcsIDB4MDIsCisJMHhGRCwgMHhGRiwgMHg2RCwgMHhGRiwgMHhCQiwgMHhGRiwgMHhGQiwgMHhGRiwgMHhFMiwgMHhGRiwgMHg4NywKKwkweEZGLCAweDhCLCAweEZGLCAweDBBLCAweDAxLCAweEIzLCAweDA0LCAweEUxLCAweDA5LCAweDlDLCAweDBFLAorCTB4QTksIDB4MTAsIDB4RkYsIDB4MEUsIDB4NzUsIDB4MEEsIDB4MzcsIDB4MDUsIDB4NTUsIDB4MDEsIDB4OUQsCisJMHhGRiwgMHg3RSwgMHhGRiwgMHhEQSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwgMHhDNSwgMHhGRiwKKwkweDcwLCAweEZGLCAweEQ5LCAweEZGLCAweDE2LCAweDAyLCAweDcwLCAweDA2LCAweEJBLCAweDBCLCAweEJCLAorCTB4MEYsIDB4N0UsIDB4MTAsIDB4OUYsIDB4MEQsIDB4OTAsIDB4MDgsIDB4OUMsIDB4MDMsIDB4N0IsIDB4MDAsCisJMHg3MiwgMHhGRiwgMHg5RSwgMHhGRiwgMHhGMSwgMHhGRiwgMHhGMywgMHhGRiwgMHhBMywgMHhGRiwgMHg3MCwKKwkweEZGLCAweDY0LCAweDAwLCAweDZBLCAweDAzLCAweDRFLCAweDA4LCAweDZBLCAweDBELCAweDZGLCAweDEwLAorCTB4REEsIDB4MEYsIDB4RjcsIDB4MEIsIDB4QUYsIDB4MDYsIDB4NDAsIDB4MDIsIDB4RTgsIDB4RkYsIDB4NkUsCisJMHhGRiwgMHhDMSwgMHhGRiwgMHhGRCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhERSwgMHhGRiwgMHg4MiwgMHhGRiwKKwkweDk1LCAweEZGLCAweDMzLCAweDAxLCAweEZELCAweDA0LCAweDM1LCAweDBBLCAweEQ0LCAweDBFLCAweEFCLAorCTB4MTAsIDB4QzgsIDB4MEUsIDB4MjIsIDB4MEEsIDB4RUMsIDB4MDQsIDB4MkEsIDB4MDEsIDB4OTMsIDB4RkYsCisJMHg4MywgMHhGRiwgMHhERiwgMHhGRiwgMHhGQywgMHhGRiwgMHhDMCwgMHhGRiwgMHg2RSwgMHhGRiwgMHhFQywKKwkweEZGLCAweDRDLCAweDAyLCAweEMxLCAweDA2LCAweDA5LCAweDBDLCAweEUyLCAweDBGLCAweDZBLCAweDEwLAorCTB4NUEsIDB4MEQsIDB4M0IsIDB4MDgsIDB4NUIsIDB4MDMsIDB4NUQsIDB4MDAsIDB4NkYsIDB4RkYsIDB4QTQsCisJMHhGRiwgMHhGMywgMHhGRiwgMHhGMCwgMHhGRiwgMHg5RCwgMHhGRiwgMHg3MywgMHhGRiwgMHg4MiwgMHgwMCwKKwkweEFCLCAweDAzLCAweEEyLCAweDA4LCAweEFFLCAweDBELCAweDgyLCAweDEwLCAweEIyLCAweDBGLCAweEE5LAorCTB4MEIsIDB4NUUsIDB4MDYsIDB4MEIsIDB4MDIsIDB4RDUsIDB4RkYsIDB4NzAsIDB4RkYsIDB4QzcsIDB4RkYsCisJMHhGRSwgMHhGRiwgMHgwMCwgMHgwMCwgMHhEOSwgMHhGRiwgMHg3RCwgMHhGRiwgMHhBMCwgMHhGRiwgMHg1RiwKKwkweDAxLCAweDQ4LCAweDA1LCAweDg4LCAweDBBLCAweDBBLCAweDBGLCAweEE4LCAweDEwLCAweDhGLCAweDBFLAorCTB4Q0UsIDB4MDksIDB4QTMsIDB4MDQsIDB4MDEsIDB4MDEsIDB4ODksIDB4RkYsIDB4ODgsIDB4RkYsIDB4RTMsCisJMHhGRiwgMHhGQiwgMHhGRiwgMHhCQSwgMHhGRiwgMHg2RCwgMHhGRiwgMHgwMiwgMHgwMCwgMHg4NCwgMHgwMiwKKwkweDEzLCAweDA3LCAweDU2LCAweDBDLCAweDA2LCAweDEwLCAweDUyLCAweDEwLCAweDEzLCAweDBELCAweEU3LAorCTB4MDcsIDB4MUMsIDB4MDMsIDB4NDEsIDB4MDAsIDB4NkQsIDB4RkYsIDB4QUEsIDB4RkYsIDB4RjYsIDB4RkYsCisJMHhFRCwgMHhGRiwgMHg5NywgMHhGRiwgMHg3OCwgMHhGRiwgMHhBMywgMHgwMCwgMHhFRiwgMHgwMywgMHhGNywKKwkweDA4LCAweEYwLCAweDBELCAweDkxLCAweDEwLCAweDg3LCAweDBGLCAweDU5LCAweDBCLCAweDBFLCAweDA2LAorCTB4RDcsIDB4MDEsIDB4QzQsIDB4RkYsIDB4NzMsIDB4RkYsIDB4Q0MsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsCisJMHgwMCwgMHhENCwgMHhGRiwgMHg3OSwgMHhGRiwgMHhBRCwgMHhGRiwgMHg4QywgMHgwMSwgMHg5NSwgMHgwNSwKKwkweERBLCAweDBBLCAweDNELCAweDBGLCAweEEyLCAweDEwLCAweDUzLCAweDBFLCAweDdBLCAweDA5LCAweDVCLAorCTB4MDQsIDB4REIsIDB4MDAsIDB4ODEsIDB4RkYsIDB4OEUsIDB4RkYsIDB4RTcsIDB4RkYsIDB4RjksIDB4RkYsCisJMHhCNCwgMHhGRiwgMHg2QywgMHhGRiwgMHgxOSwgMHgwMCwgMHhCRSwgMHgwMiwgMHg2NSwgMHgwNywgMHhBMSwKKwkweDBDLCAweDI3LCAweDEwLCAweDM3LCAweDEwLCAweENBLCAweDBDLCAweDk0LCAweDA3LCAweERGLCAweDAyLAorCTB4MjcsIDB4MDAsIDB4NkMsIDB4RkYsIDB4QjAsIDB4RkYsIDB4RjgsIDB4RkYsIDB4RTksIDB4RkYsIDB4OTEsCisJMHhGRiwgMHg3RCwgMHhGRiwgMHhDNiwgMHgwMCwgMHgzNCwgMHgwNCwgMHg0QiwgMHgwOSwgMHgzMCwgMHgwRSwKKwkweDlELCAweDEwLCAweDU4LCAweDBGLCAweDA4LCAweDBCLCAweEMwLCAweDA1LCAweEE2LCAweDAxLCAweEI1LAorCTB4RkYsIDB4NzcsIDB4RkYsIDB4RDEsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4Q0YsIDB4RkYsCisJMHg3NSwgMHhGRiwgMHhCQiwgMHhGRiwgMHhCQywgMHgwMSwgMHhFMywgMHgwNSwgMHgyQywgMHgwQiwgMHg2RCwKKwkweDBGLCAweDk4LCAweDEwLCAweDE0LCAweDBFLCAweDI2LCAweDA5LCAweDE1LCAweDA0LCAweEI3LCAweDAwLAorCTB4N0IsIDB4RkYsIDB4OTMsIDB4RkYsIDB4RUIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4QUUsIDB4RkYsIDB4NkQsCisJMHhGRiwgMHgzMiwgMHgwMCwgMHhGQSwgMHgwMiwgMHhCOSwgMHgwNywgMHhFQiwgMHgwQywgMHg0NCwgMHgxMCwKKwkweDE5LCAweDEwLCAweDgwLCAweDBDLCAweDQxLCAweDA3LCAweEE0LCAweDAyLCAweDBFLCAweDAwLCAweDZDLAorCTB4RkYsIDB4QjYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4RTUsIDB4RkYsIDB4OEIsIDB4RkYsIDB4ODUsIDB4RkYsCisJMHhFQywgMHgwMCwgMHg3QiwgMHgwNCwgMHhBMCwgMHgwOSwgMHg2RSwgMHgwRSwgMHhBNSwgMHgxMCwgMHgyNywKKwkweDBGLCAweEI2LCAweDBBLCAweDcyLCAweDA1LCAweDc4LCAweDAxLCAweEE3LCAweEZGLCAweDdCLCAweEZGLAorCTB4RDYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkUsIDB4RkYsIDB4Q0EsIDB4RkYsIDB4NzIsIDB4RkYsIDB4Q0IsCisJMHhGRiwgMHhFRSwgMHgwMSwgMHgzMiwgMHgwNiwgMHg3QywgMHgwQiwgMHg5QSwgMHgwRiwgMHg4QiwgMHgxMCwKKwkweEQzLCAweDBELCAweEQxLCAweDA4LCAweEQwLCAweDAzLCAweDk0LCAweDAwLCAweDc2LCAweEZGLCAweDk5LAorCTB4RkYsIDB4RUUsIDB4RkYsIDB4RjUsIDB4RkYsIDB4QTcsIDB4RkYsIDB4NkUsIDB4RkYsIDB4NEQsIDB4MDAsCisJMHgzOCwgMHgwMywgMHgwRCwgMHgwOCwgMHgzMywgMHgwRCwgMHg1RCwgMHgxMCwgMHhGNywgMHgwRiwgMHgzNCwKKwkweDBDLCAweEVFLCAweDA2LCAweDZCLCAweDAyLCAweEY4LCAweEZGLCAweDZELCAweEZGLCAweEJDLCAweEZGLAorCTB4RkMsIDB4RkYsIDB4RTEsIDB4RkYsIDB4ODYsIDB4RkYsIDB4OEQsIDB4RkYsIDB4MTMsIDB4MDEsIDB4QzMsCisJMHgwNCwgMHhGNCwgMHgwOSwgMHhBOCwgMHgwRSwgMHhBQSwgMHgxMCwgMHhGMywgMHgwRSwgMHg2MywgMHgwQSwKKwkweDI2LCAweDA1LCAweDRCLCAweDAxLCAweDlCLCAweEZGLCAweDdGLCAweEZGLCAweERCLCAweEZGLCAweDAwLAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4QzQsIDB4RkYsIDB4NkYsIDB4RkYsIDB4REQsIDB4RkYsIDB4MjIsIDB4MDIsCisJMHg4MiwgMHgwNiwgMHhDQywgMHgwQiwgMHhDNCwgMHgwRiwgMHg3QSwgMHgxMCwgMHg5MCwgMHgwRCwgMHg3RCwKKwkweDA4LCAweDhFLCAweDAzLCAweDc0LCAweDAwLCAweDcyLCAweEZGLCAweDlGLCAweEZGLCAweEYxLCAweEZGLAorCTB4RjIsIDB4RkYsIDB4QTEsIDB4RkYsIDB4NzAsIDB4RkYsIDB4NkEsIDB4MDAsIDB4NzgsIDB4MDMsIDB4NjEsCisJMHgwOCwgMHg3OSwgMHgwRCwgMHg3MywgMHgxMCwgMHhEMSwgMHgwRiwgMHhFNiwgMHgwQiwgMHg5RCwgMHgwNiwKKwkweDM0LCAweDAyLCAweEU0LCAweEZGLCAweDZGLCAweEZGLCAweEMyLCAweEZGLCAweEZELCAweEZGLCAweDAwLAorCTB4MDAsIDB4REQsIDB4RkYsIDB4ODEsIDB4RkYsIDB4OTcsIDB4RkYsIDB4M0QsIDB4MDEsIDB4MEQsIDB4MDUsCisJMHg0NywgMHgwQSwgMHhFMSwgMHgwRSwgMHhBQSwgMHgxMCwgMHhCQiwgMHgwRSwgMHgxMCwgMHgwQSwgMHhEQywKKwkweDA0LCAweDIxLCAweDAxLCAweDkwLCAweEZGLCAweDg0LCAweEZGLCAweEUwLCAweEZGLCAweEZDLCAweEZGLAorCTB4QkUsIDB4RkYsIDB4NkQsIDB4RkYsIDB4RjEsIDB4RkYsIDB4NTgsIDB4MDIsIDB4RDMsIDB4MDYsIDB4MUEsCisJMHgwQywgMHhFQiwgMHgwRiwgMHg2NSwgMHgxMCwgMHg0QiwgMHgwRCwgMHgyOSwgMHgwOCwgMHg0RCwgMHgwMywKKwkweDU3LCAweDAwLCAweDZGLCAweEZGLCAweEE1LCAweEZGLCAweEY0LCAweEZGLCAweEVGLCAweEZGLCAweDlCLAorCTB4RkYsIDB4NzQsIDB4RkYsIDB4OEEsIDB4MDAsIDB4QkEsIDB4MDMsIDB4QjUsIDB4MDgsIDB4QkQsIDB4MEQsCisJMHg4NiwgMHgxMCwgMHhBOSwgMHgwRiwgMHg5NywgMHgwQiwgMHg0QywgMHgwNiwgMHhGRiwgMHgwMSwgMHhEMSwKKwkweEZGLCAweDcxLCAweEZGLCAweEM4LCAweEZGLCAweEZFLCAweEZGLCAweDAwLCAweDAwLCAweEQ4LCAweEZGLAorCTB4N0MsIDB4RkYsIDB4QTMsIDB4RkYsIDB4NjksIDB4MDEsIDB4NTksIDB4MDUsIDB4OUEsIDB4MEEsIDB4MTYsCisJMHgwRiwgMHhBNywgMHgxMCwgMHg4MiwgMHgwRSwgMHhCQywgMHgwOSwgMHg5MywgMHgwNCwgMHhGOSwgMHgwMCwKKwkweDg3LCAweEZGLCAweDg5LCAweEZGLCAweEU0LCAweEZGLCAweEZCLCAweEZGLCAweEI4LCAweEZGLCAweDZDLAorCTB4RkYsIDB4MDcsIDB4MDAsIDB4OTEsIDB4MDIsIDB4MjUsIDB4MDcsIDB4NjcsIDB4MEMsIDB4MEUsIDB4MTAsCisJMHg0RCwgMHgxMCwgMHgwMywgMHgwRCwgMHhENSwgMHgwNywgMHgwRSwgMHgwMywgMHgzQiwgMHgwMCwgMHg2RCwKKwkweEZGLCAweEFDLCAweEZGLCAweEY3LCAweEZGLCAweEVDLCAweEZGLCAweDk1LCAweEZGLCAweDc5LCAweEZGLAorCTB4QUIsIDB4MDAsIDB4RkUsIDB4MDMsIDB4MEEsIDB4MDksIDB4RkYsIDB4MEQsIDB4OTQsIDB4MTAsIDB4N0QsCisJMHgwRiwgMHg0NywgMHgwQiwgMHhGRCwgMHgwNSwgMHhDQywgMHgwMSwgMHhDMCwgMHhGRiwgMHg3NCwgMHhGRiwKKwkweENELCAweEZGLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEQzLCAweEZGLCAweDc4LCAweEZGLCAweEIwLAorCTB4RkYsIDB4OTcsIDB4MDEsIDB4QTYsIDB4MDUsIDB4RUMsIDB4MEEsIDB4NDgsIDB4MEYsIDB4QTAsIDB4MTAsCisJMHg0NSwgMHgwRSwgMHg2NywgMHgwOSwgMHg0QiwgMHgwNCwgMHhEMywgMHgwMCwgMHg4MCwgMHhGRiwgMHg4RiwKKwkweEZGLCAweEU4LCAweEZGLCAweEY5LCAweEZGLCAweEIyLCAweEZGLCAweDZDLCAweEZGLCAweDFFLCAweDAwLAorCTB4Q0IsIDB4MDIsIDB4NzgsIDB4MDcsIDB4QjIsIDB4MEMsIDB4MkUsIDB4MTAsIDB4MzEsIDB4MTAsIDB4QkEsCisJMHgwQywgMHg4MSwgMHgwNywgMHhEMiwgMHgwMiwgMHgyMSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCMiwgMHhGRiwKKwkweEY5LCAweEZGLCAweEU4LCAweEZGLCAweDkwLCAweEZGLCAweDdGLCAweEZGLCAweENGLCAweDAwLCAweDQzLAorCTB4MDQsIDB4NUUsIDB4MDksIDB4M0UsIDB4MEUsIDB4OUYsIDB4MTAsIDB4NEUsIDB4MEYsIDB4RjYsIDB4MEEsCisJMHhBRSwgMHgwNSwgMHg5QywgMHgwMSwgMHhCMSwgMHhGRiwgMHg3OCwgMHhGRiwgMHhEMiwgMHhGRiwgMHhGRiwKKwkweEZGLCAweEZGLCAweEZGLCAweENFLCAweEZGLCAweDc0LCAweEZGLCAweEJGLCAweEZGLCAweEM3LCAweDAxLAorCTB4RjQsIDB4MDUsIDB4M0UsIDB4MEIsIDB4NzgsIDB4MEYsIDB4OTYsIDB4MTAsIDB4MDYsIDB4MEUsIDB4MTMsCisJMHgwOSwgMHgwNSwgMHgwNCwgMHhBRiwgMHgwMCwgMHg3OSwgMHhGRiwgMHg5NSwgMHhGRiwgMHhFQywgMHhGRiwKKwkweEY3LCAweEZGLCAweEFDLCAweEZGLCAweDZELCAweEZGLCAweDM4LCAweDAwLCAweDA3LCAweDAzLCAweENCLAorCTB4MDcsIDB4RkIsIDB4MEMsIDB4NEEsIDB4MTAsIDB4MTEsIDB4MTAsIDB4NkYsIDB4MEMsIDB4MkUsIDB4MDcsCisJMHg5NywgMHgwMiwgMHgwOSwgMHgwMCwgMHg2QywgMHhGRiwgMHhCOCwgMHhGRiwgMHhGQSwgMHhGRiwgMHhFNCwKKwkweEZGLCAweDhBLCAweEZGLCAweDg2LCAweEZGLCAweEY0LCAweDAwLCAweDhCLCAweDA0LCAweEIyLCAweDA5LAorCTB4N0IsIDB4MEUsIDB4QTcsIDB4MTAsIDB4MUMsIDB4MEYsIDB4QTMsIDB4MEEsIDB4NjEsIDB4MDUsIDB4NkUsCisJMHgwMSwgMHhBNCwgMHhGRiwgMHg3QywgMHhGRiwgMHhEOCwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweEM4LCAweEZGLCAweDcxLCAweEZGLCAweENGLCAweEZGLCAweEY5LCAweDAxLCAweDQzLCAweDA2LCAweDhFLAorCTB4MEIsIDB4QTQsIDB4MEYsIDB4ODgsIDB4MTAsIDB4QzQsIDB4MEQsIDB4QkUsIDB4MDgsIDB4QzEsIDB4MDMsCisJMHg4RCwgMHgwMCwgMHg3NSwgMHhGRiwgMHg5QiwgMHhGRiwgMHhFRiwgMHhGRiwgMHhGNCwgMHhGRiwgMHhBNiwKKwkweEZGLCAweDZFLCAweEZGLCAweDUzLCAweDAwLCAweDQ2LCAweDAzLCAweDFGLCAweDA4LCAweDQzLCAweDBELAorCTB4NjMsIDB4MTAsIDB4RUYsIDB4MEYsIDB4MjMsIDB4MEMsIDB4REMsIDB4MDYsIDB4NUUsIDB4MDIsIDB4RjMsCisJMHhGRiwgMHg2RCwgMHhGRiwgMHhCRSwgMHhGRiwgMHhGQywgMHhGRiwgMHhFMCwgMHhGRiwgMHg4NSwgMHhGRiwKKwkweDhGLCAweEZGLCAweDFDLCAweDAxLCAweEQzLCAweDA0LCAweDA2LCAweDBBLCAweEI1LCAweDBFLCAweEFBLAorCTB4MTAsIDB4RTcsIDB4MEUsIDB4NTAsIDB4MEEsIDB4MTYsIDB4MDUsIDB4NDIsIDB4MDEsIDB4OTgsIDB4RkYsCisJMHg4MCwgMHhGRiwgMHhEQywgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhDMywgMHhGRiwgMHg2RiwKKwkweEZGLCAweEUxLCAweEZGLCAweDJFLCAweDAyLCAweDk0LCAweDA2LCAweERELCAweDBCLCAweENELCAweDBGLAorCTB4NzYsIDB4MTAsIDB4ODEsIDB4MEQsIDB4NkEsIDB4MDgsIDB4N0YsIDB4MDMsIDB4NkUsIDB4MDAsIDB4NzEsCisJMHhGRiwgMHhBMSwgMHhGRiwgMHhGMiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgxNSwgMHgwMCwgMHhEMSwgMHhGRiwKKwkweDhCLCAweEZFLCAweEJDLCAweEZELCAweEUxLCAweDAwLCAweDg0LCAweDA5LCAweEIwLCAweDEzLCAweDQ3LAorCTB4MTgsIDB4QjAsIDB4MTMsIDB4ODQsIDB4MDksIDB4RTEsIDB4MDAsIDB4QkMsIDB4RkQsIDB4OEIsIDB4RkUsCisJMHhEMSwgMHhGRiwgMHgxNSwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxMywgMHgwMCwgMHhEQSwgMHgwMCwgMHgzMCwKKwkweDAwLCAweDVELCAweEZDLCAweEIzLCAweEZDLCAweDM1LCAweDBBLCAweEMyLCAweDFDLCAweDI0LCAweDIwLAorCTB4NDgsIDB4MTAsIDB4NUQsIDB4RkYsIDB4NzQsIDB4RkIsIDB4M0EsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NDIsCisJMHgwMCwgMHhGOCwgMHhGRiwgMHhGQSwgMHhGRiwgMHgyQywgMHgwMCwgMHhGMywgMHgwMCwgMHhBRCwgMHhGRiwKKwkweEM1LCAweEZCLCAweDExLCAweEZFLCAweEFGLCAweDBELCAweEVGLCAweDFFLCAweDY4LCAweDFFLCAweEJDLAorCTB4MEMsIDB4QTcsIDB4RkQsIDB4RUEsIDB4RkIsIDB4RDMsIDB4RkYsIDB4RUUsIDB4MDAsIDB4MjQsIDB4MDAsCisJMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0QywgMHgwMCwgMHhGQiwgMHgwMCwgMHgwQywgMHhGRiwgMHg1RiwKKwkweEZCLCAweEU4LCAweEZGLCAweDNELCAweDExLCAweDdFLCAweDIwLCAweDEzLCAweDFDLCAweDRDLCAweDA5LAorCTB4NkEsIDB4RkMsIDB4OEMsIDB4RkMsIDB4NEUsIDB4MDAsIDB4RDEsIDB4MDAsIDB4MEUsIDB4MDAsIDB4RkQsCisJMHhGRiwgMHhGNywgMHhGRiwgMHg3MiwgMHgwMCwgMHhFQywgMHgwMCwgMHg1NSwgMHhGRSwgMHgzRCwgMHhGQiwKKwkweDM3LCAweDAyLCAweEJFLCAweDE0LCAweDVELCAweDIxLCAweDQwLCAweDE5LCAweDE4LCAweDA2LCAweEEyLAorCTB4RkIsIDB4NDcsIDB4RkQsIDB4QTcsIDB4MDAsIDB4QUIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwMCwgMHhGQywgMHhGRiwgMHg5QiwgMHgwMCwgMHhDMCwgMHgwMCwgMHg5MiwgMHhGRCwgMHg3MywKKwkweEZCLCAweEYyLCAweDA0LCAweDBFLCAweDE4LCAweDgxLCAweDIxLCAweDBDLCAweDE2LCAweDM3LCAweDAzLAorCTB4NDcsIDB4RkIsIDB4MEIsIDB4RkUsIDB4REYsIDB4MDAsIDB4ODIsIDB4MDAsIDB4RjksIDB4RkYsIDB4RkUsCisJMHhGRiwgMHgwOCwgMHgwMCwgMHhDMywgMHgwMCwgMHg3NCwgMHgwMCwgMHhEMiwgMHhGQywgMHgxMCwgMHhGQywKKwkweDA4LCAweDA4LCAweDBBLCAweDFCLCAweEU5LCAweDIwLCAweDlBLCAweDEyLCAweEJFLCAweDAwLCAweDQ5LAorCTB4RkIsIDB4QzgsIDB4RkUsIDB4RjksIDB4MDAsIDB4NUEsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkMsIDB4RkYsCisJMHgxQiwgMHgwMCwgMHhFNCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgyNCwgMHhGQywgMHgxRSwgMHhGRCwgMHg2NSwKKwkweDBCLCAweDk0LCAweDFELCAweDlELCAweDFGLCAweDBELCAweDBGLCAweEI4LCAweEZFLCAweDk2LCAweEZCLAorCTB4NzIsIDB4RkYsIDB4RjksIDB4MDAsIDB4MzcsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksIDB4RkYsIDB4MzYsCisJMHgwMCwgMHhGOCwgMHgwMCwgMHg3OCwgMHhGRiwgMHg5QiwgMHhGQiwgMHhBNiwgMHhGRSwgMHhFOSwgMHgwRSwKKwkweDhELCAweDFGLCAweEFBLCAweDFELCAweDg3LCAweDBCLCAweDJCLCAweEZELCAweDFFLCAweEZDLCAweDAyLAorCTB4MDAsIDB4RTUsIDB4MDAsIDB4MUMsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NTgsIDB4MDAsCisJMHhGOSwgMHgwMCwgMHhDRiwgMHhGRSwgMHg0QSwgMHhGQiwgMHhBNywgMHgwMCwgMHg3NywgMHgxMiwgMHhFMCwKKwkweDIwLCAweDI2LCAweDFCLCAweDI4LCAweDA4LCAweDE4LCAweEZDLCAweENCLCAweEZDLCAweDcxLCAweDAwLAorCTB4QzUsIDB4MDAsIDB4MDgsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4ODAsIDB4MDAsIDB4RTEsCisJMHgwMCwgMHgxMywgMHhGRSwgMHg0NSwgMHhGQiwgMHgxRCwgMHgwMywgMHhFQiwgMHgxNSwgMHg3RiwgMHgyMSwKKwkweDJELCAweDE4LCAweDBFLCAweDA1LCAweDc3LCAweEZCLCAweDhCLCAweEZELCAweEJFLCAweDAwLCAweDlELAorCTB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4QTksIDB4MDAsCisJMHhBQSwgMHgwMCwgMHg0RiwgMHhGRCwgMHg5RCwgMHhGQiwgMHhGQSwgMHgwNSwgMHgyMiwgMHgxOSwgMHg2MiwKKwkweDIxLCAweEUwLCAweDE0LCAweDUwLCAweDAyLCAweDNFLCAweEZCLCAweDRFLCAweEZFLCAweEVCLCAweDAwLAorCTB4NzMsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4RDAsIDB4MDAsIDB4NTIsCisJMHgwMCwgMHg5MywgMHhGQywgMHg2MCwgMHhGQywgMHgyQywgMHgwOSwgMHhGQSwgMHgxQiwgMHg4QSwgMHgyMCwKKwkweDYwLCAweDExLCAweEZELCAweEZGLCAweDVDLCAweEZCLCAweDA2LCAweEZGLCAweEZCLCAweDAwLCAweDRELAorCTB4MDAsIDB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjMsIDB4MDAsIDB4RUQsIDB4MDAsIDB4RDksIDB4RkYsCisJMHhFRiwgMHhGQiwgMHg5OCwgMHhGRCwgMHg5OSwgMHgwQywgMHg1NCwgMHgxRSwgMHgwMiwgMHgxRiwgMHhEMiwKKwkweDBELCAweDIwLCAweEZFLCAweEMwLCAweEZCLCAweEE3LCAweEZGLCAweEY0LCAweDAwLCAweDJELCAweDAwLAorCTB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4NDEsIDB4MDAsIDB4RkIsIDB4MDAsIDB4NDEsIDB4RkYsIDB4NzgsCisJMHhGQiwgMHg0QSwgMHhGRiwgMHgyNSwgMHgxMCwgMHgxNiwgMHgyMCwgMHhEQSwgMHgxQywgMHg1NiwgMHgwQSwKKwkweEJFLCAweEZDLCAweDU2LCAweEZDLCAweDJDLCAweDAwLCAweERCLCAweDAwLCAweDE0LCAweDAwLCAweEZELAorCTB4RkYsIDB4RjcsIDB4RkYsIDB4NjYsIDB4MDAsIDB4RjQsIDB4MDAsIDB4OEYsIDB4RkUsIDB4M0YsIDB4RkIsCisJMHg3NSwgMHgwMSwgMHhBRSwgMHgxMywgMHgyQywgMHgyMSwgMHgyQSwgMHgxQSwgMHgwRCwgMHgwNywgMHhENCwKKwkweEZCLCAweDBDLCAweEZELCAweDhGLCAweDAwLCAweEI3LCAweDAwLCAweDAzLCAweDAwLCAweEZGLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4RkEsIDB4RkYsIDB4OEUsIDB4MDAsIDB4RDEsIDB4MDAsIDB4Q0YsIDB4RkQsIDB4NTgsCisJMHhGQiwgMHgxMCwgMHgwNCwgMHgxMCwgMHgxNywgMHg4QSwgMHgyMSwgMHgxMCwgMHgxNywgMHgxMCwgMHgwNCwKKwkweDU4LCAweEZCLCAweENGLCAweEZELCAweEQxLCAweDAwLCAweDhFLCAweDAwLCAweEZBLCAweEZGLCAweEZGLAorCTB4RkYsIDB4MDMsIDB4MDAsIDB4QjcsIDB4MDAsIDB4OEYsIDB4MDAsIDB4MEMsIDB4RkQsIDB4RDQsIDB4RkIsCisJMHgwRCwgMHgwNywgMHgyQSwgMHgxQSwgMHgyQywgMHgyMSwgMHhBRSwgMHgxMywgMHg3NSwgMHgwMSwgMHgzRiwKKwkweEZCLCAweDhGLCAweEZFLCAweEY0LCAweDAwLCAweDY2LCAweDAwLCAweEY3LCAweEZGLCAweEZELCAweEZGLAorCTB4MTQsIDB4MDAsIDB4REIsIDB4MDAsIDB4MkMsIDB4MDAsIDB4NTYsIDB4RkMsIDB4QkUsIDB4RkMsIDB4NTYsCisJMHgwQSwgMHhEQSwgMHgxQywgMHgxNiwgMHgyMCwgMHgyNSwgMHgxMCwgMHg0QSwgMHhGRiwgMHg3OCwgMHhGQiwKKwkweDQxLCAweEZGLCAweEZCLCAweDAwLCAweDQxLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDJELAorCTB4MDAsIDB4RjQsIDB4MDAsIDB4QTcsIDB4RkYsIDB4QzAsIDB4RkIsIDB4MjAsIDB4RkUsIDB4RDIsIDB4MEQsCisJMHgwMiwgMHgxRiwgMHg1NCwgMHgxRSwgMHg5OSwgMHgwQywgMHg5OCwgMHhGRCwgMHhFRiwgMHhGQiwgMHhEOSwKKwkweEZGLCAweEVELCAweDAwLCAweDIzLCAweDAwLCAweEZBLCAweEZGLCAweEY3LCAweEZGLCAweDRELCAweDAwLAorCTB4RkIsIDB4MDAsIDB4MDYsIDB4RkYsIDB4NUMsIDB4RkIsIDB4RkQsIDB4RkYsIDB4NjAsIDB4MTEsIDB4OEEsCisJMHgyMCwgMHhGQSwgMHgxQiwgMHgyQywgMHgwOSwgMHg2MCwgMHhGQywgMHg5MywgMHhGQywgMHg1MiwgMHgwMCwKKwkweEQwLCAweDAwLCAweDBELCAweDAwLCAweEZFLCAweEZGLCAweEY3LCAweEZGLCAweDczLCAweDAwLCAweEVCLAorCTB4MDAsIDB4NEUsIDB4RkUsIDB4M0UsIDB4RkIsIDB4NTAsIDB4MDIsIDB4RTAsIDB4MTQsIDB4NjIsIDB4MjEsCisJMHgyMiwgMHgxOSwgMHhGQSwgMHgwNSwgMHg5RCwgMHhGQiwgMHg0RiwgMHhGRCwgMHhBQSwgMHgwMCwgMHhBOSwKKwkweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweDlELCAweDAwLAorCTB4QkUsIDB4MDAsIDB4OEIsIDB4RkQsIDB4NzcsIDB4RkIsIDB4MEUsIDB4MDUsIDB4MkQsIDB4MTgsIDB4N0YsCisJMHgyMSwgMHhFQiwgMHgxNSwgMHgxRCwgMHgwMywgMHg0NSwgMHhGQiwgMHgxMywgMHhGRSwgMHhFMSwgMHgwMCwKKwkweDgwLCAweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDA4LCAweDAwLCAweEM1LCAweDAwLCAweDcxLAorCTB4MDAsIDB4Q0IsIDB4RkMsIDB4MTgsIDB4RkMsIDB4MjgsIDB4MDgsIDB4MjYsIDB4MUIsIDB4RTAsIDB4MjAsCisJMHg3NywgMHgxMiwgMHhBNywgMHgwMCwgMHg0QSwgMHhGQiwgMHhDRiwgMHhGRSwgMHhGOSwgMHgwMCwgMHg1OCwKKwkweDAwLCAweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDFDLCAweDAwLCAweEU1LCAweDAwLCAweDAyLCAweDAwLAorCTB4MUUsIDB4RkMsIDB4MkIsIDB4RkQsIDB4ODcsIDB4MEIsIDB4QUEsIDB4MUQsIDB4OEQsIDB4MUYsIDB4RTksCisJMHgwRSwgMHhBNiwgMHhGRSwgMHg5QiwgMHhGQiwgMHg3OCwgMHhGRiwgMHhGOCwgMHgwMCwgMHgzNiwgMHgwMCwKKwkweEY5LCAweEZGLCAweEY4LCAweEZGLCAweDM3LCAweDAwLCAweEY5LCAweDAwLCAweDcyLCAweEZGLCAweDk2LAorCTB4RkIsIDB4QjgsIDB4RkUsIDB4MEQsIDB4MEYsIDB4OUQsIDB4MUYsIDB4OTQsIDB4MUQsIDB4NjUsIDB4MEIsCisJMHgxRSwgMHhGRCwgMHgyNCwgMHhGQywgMHgwNiwgMHgwMCwgMHhFNCwgMHgwMCwgMHgxQiwgMHgwMCwgMHhGQywKKwkweEZGLCAweEY3LCAweEZGLCAweDVBLCAweDAwLCAweEY5LCAweDAwLCAweEM4LCAweEZFLCAweDQ5LCAweEZCLAorCTB4QkUsIDB4MDAsIDB4OUEsIDB4MTIsIDB4RTksIDB4MjAsIDB4MEEsIDB4MUIsIDB4MDgsIDB4MDgsIDB4MTAsCisJMHhGQywgMHhEMiwgMHhGQywgMHg3NCwgMHgwMCwgMHhDMywgMHgwMCwgMHgwOCwgMHgwMCwgMHhGRSwgMHhGRiwKKwkweEY5LCAweEZGLCAweDgyLCAweDAwLCAweERGLCAweDAwLCAweDBCLCAweEZFLCAweDQ3LCAweEZCLCAweDM3LAorCTB4MDMsIDB4MEMsIDB4MTYsIDB4ODEsIDB4MjEsIDB4MEUsIDB4MTgsIDB4RjIsIDB4MDQsIDB4NzMsIDB4RkIsCisJMHg5MiwgMHhGRCwgMHhDMCwgMHgwMCwgMHg5QiwgMHgwMCwgMHhGQywgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDAwLCAweDAwLCAweEFCLCAweDAwLCAweEE3LCAweDAwLCAweDQ3LCAweEZELCAweEEyLCAweEZCLAorCTB4MTgsIDB4MDYsIDB4NDAsIDB4MTksIDB4NUQsIDB4MjEsIDB4QkUsIDB4MTQsIDB4MzcsIDB4MDIsIDB4M0QsCisJMHhGQiwgMHg1NSwgMHhGRSwgMHhFQywgMHgwMCwgMHg3MiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwKKwkweDBFLCAweDAwLCAweEQxLCAweDAwLCAweDRFLCAweDAwLCAweDhDLCAweEZDLCAweDZBLCAweEZDLCAweDRDLAorCTB4MDksIDB4MTMsIDB4MUMsIDB4N0UsIDB4MjAsIDB4M0QsIDB4MTEsIDB4RTgsIDB4RkYsIDB4NUYsIDB4RkIsCisJMHgwQywgMHhGRiwgMHhGQiwgMHgwMCwgMHg0QywgMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyNCwKKwkweDAwLCAweEVFLCAweDAwLCAweEQzLCAweEZGLCAweEVBLCAweEZCLCAweEE3LCAweEZELCAweEJDLCAweDBDLAorCTB4NjgsIDB4MUUsIDB4RUYsIDB4MUUsIDB4QUYsIDB4MEQsIDB4MTEsIDB4RkUsIDB4QzUsIDB4RkIsIDB4QUQsCisJMHhGRiwgMHhGMywgMHgwMCwgMHgyQywgMHgwMCwgMHhGQSwgMHhGRiwgMHhGOCwgMHhGRiwgMHg0MiwgMHgwMCwKKwkweEZCLCAweDAwLCAweDNBLCAweEZGLCAweDc0LCAweEZCLCAweDVELCAweEZGLCAweDQ4LCAweDEwLCAweDI0LAorCTB4MjAsIDB4QzIsIDB4MUMsIDB4MzUsIDB4MEEsIDB4QjMsIDB4RkMsIDB4NUQsIDB4RkMsIDB4MzAsIDB4MDAsCisJMHhEQSwgMHgwMCwgMHgxMywgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg2NywgMHgwMCwgMHhGMywKKwkweDAwLCAweDg4LCAweEZFLCAweDNFLCAweEZCLCAweDhDLCAweDAxLCAweEQwLCAweDEzLCAweDMzLCAweDIxLAorCTB4MEQsIDB4MUEsIDB4RUUsIDB4MDYsIDB4Q0QsIDB4RkIsIDB4MTMsIDB4RkQsIDB4OTIsIDB4MDAsIDB4QjYsCisJMHgwMCwgMHgwMywgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQSwgMHhGRiwgMHg5MCwgMHgwMCwKKwkweENGLCAweDAwLCAweEM3LCAweEZELCAweDVCLCAweEZCLCAweDJCLCAweDA0LCAweDMxLCAweDE3LCAweDhBLAorCTB4MjEsIDB4RjAsIDB4MTYsIDB4RjQsIDB4MDMsIDB4NTYsIDB4RkIsIDB4RDYsIDB4RkQsIDB4RDMsIDB4MDAsCisJMHg4RCwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNCwgMHgwMCwgMHhCOSwgMHgwMCwgMHg4QywKKwkweDAwLCAweDA1LCAweEZELCAweERCLCAweEZCLCAweDJDLCAweDA3LCAweDQ3LCAweDFBLCAweDI1LCAweDIxLAorCTB4OEIsIDB4MTMsIDB4NUQsIDB4MDEsIDB4NDAsIDB4RkIsIDB4OTcsIDB4RkUsIDB4RjUsIDB4MDAsIDB4NjQsCisJMHgwMCwgMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxNSwgMHgwMCwgMHhEQywgMHgwMCwgMHgyNywgMHgwMCwKKwkweDUwLCAweEZDLCAweENBLCAweEZDLCAweDc4LCAweDBBLCAweEYyLCAweDFDLCAweDA3LCAweDIwLCAweDAyLAorCTB4MTAsIDB4MzcsIDB4RkYsIDB4N0IsIDB4RkIsIDB4NDcsIDB4RkYsIDB4RkIsIDB4MDAsIDB4NDAsIDB4MDAsCisJMHhGOCwgMHhGRiwgMHhGOSwgMHhGRiwgMHgyRSwgMHgwMCwgMHhGNSwgMHgwMCwgMHhBMiwgMHhGRiwgMHhCQiwKKwkweEZCLCAweDMxLCAweEZFLCAweEY1LCAweDBELCAweDE0LCAweDFGLCAweDNGLCAweDFFLCAweDc3LCAweDBDLAorCTB4OEEsIDB4RkQsIDB4RjUsIDB4RkIsIDB4REUsIDB4RkYsIDB4RUMsIDB4MDAsIDB4MjIsIDB4MDAsIDB4RkIsCisJMHhGRiwgMHhGNywgMHhGRiwgMHg0RSwgMHgwMCwgMHhGQiwgMHgwMCwgMHhGRiwgMHhGRSwgMHg1OSwgMHhGQiwKKwkweDExLCAweDAwLCAweDgzLCAweDExLCAweDk2LCAweDIwLCAweEUwLCAweDFCLCAweDBCLCAweDA5LCAweDU2LAorCTB4RkMsIDB4OTksIDB4RkMsIDB4NTYsIDB4MDAsIDB4Q0UsIDB4MDAsIDB4MEQsIDB4MDAsIDB4RkUsIDB4RkYsCisJMHhGOCwgMHhGRiwgMHg3NSwgMHgwMCwgMHhFQSwgMHgwMCwgMHg0NywgMHhGRSwgMHgzRSwgMHhGQiwgMHg2OSwKKwkweDAyLCAweDAyLCAweDE1LCAweDY2LCAweDIxLCAweDA0LCAweDE5LCAweERDLCAweDA1LCAweDk4LCAweEZCLAorCTB4NTYsIDB4RkQsIDB4QUQsIDB4MDAsIDB4QTgsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHg5RSwgMHgwMCwgMHhCQywgMHgwMCwgMHg4MywgMHhGRCwgMHg3QiwgMHhGQiwKKwkweDJCLCAweDA1LCAweDRDLCAweDE4LCAweDdDLCAweDIxLCAweENBLCAweDE1LCAweDAzLCAweDAzLCAweDQ0LAorCTB4RkIsIDB4MUEsIDB4RkUsIDB4RTIsIDB4MDAsIDB4N0UsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsCisJMHgwOSwgMHgwMCwgMHhDNiwgMHgwMCwgMHg2RCwgMHgwMCwgMHhDMywgMHhGQywgMHgyMCwgMHhGQywgMHg0OSwKKwkweDA4LCAweDQxLCAweDFCLCAweEQ2LCAweDIwLCAweDU0LCAweDEyLCAweDkyLCAweDAwLCAweDRDLCAweEZCLAorCTB4RDYsIDB4RkUsIDB4RkEsIDB4MDAsIDB4NTcsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MUQsCisJMHgwMCwgMHhFNiwgMHgwMCwgMHhGRCwgMHhGRiwgMHgxOCwgMHhGQywgMHgzOCwgMHhGRCwgMHhBOSwgMHgwQiwKKwkweEMwLCAweDFELCAweDdDLCAweDFGLCAweEM2LCAweDBFLCAweDk1LCAweEZFLCAweDlGLCAweEZCLCAweDdFLAorCTB4RkYsIDB4RjgsIDB4MDAsIDB4MzUsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4MzgsIDB4MDAsCisJMHhGOSwgMHgwMCwgMHg2QywgMHhGRiwgMHg5MiwgMHhGQiwgMHhDOSwgMHhGRSwgMHgyRiwgMHgwRiwgMHhBRCwKKwkweDFGLCAweDdELCAweDFELCAweDQyLCAweDBCLCAweDEyLCAweEZELCAweDJBLCAweEZDLCAweDBCLCAweDAwLAorCTB4RTMsIDB4MDAsIDB4MUEsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NUIsIDB4MDAsIDB4RjgsCisJMHgwMCwgMHhDMSwgMHhGRSwgMHg0NywgMHhGQiwgMHhENCwgMHgwMCwgMHhCQywgMHgxMiwgMHhGMywgMHgyMCwKKwkweEVGLCAweDFBLCAweEU5LCAweDA3LCAweDA4LCAweEZDLCAweEQ5LCAweEZDLCAweDc4LCAweDAwLCAweEMyLAorCTB4MDAsIDB4MDcsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RjksIDB4RkYsIDB4ODMsIDB4MDAsIDB4REQsIDB4MDAsCisJMHgwNCwgMHhGRSwgMHg0OSwgMHhGQiwgMHg1MiwgMHgwMywgMHgyRCwgMHgxNiwgMHg4MywgMHgyMSwgMHhFRiwKKwkweDE3LCAweEQ1LCAweDA0LCAweDZGLCAweEZCLCAweDlBLCAweEZELCAweEMzLCAweDAwLCAweDlBLCAweDAwLAorCTB4RkMsIDB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4QUQsIDB4MDAsIDB4QTQsCisJMHgwMCwgMHg0MCwgMHhGRCwgMHhBOCwgMHhGQiwgMHgzNiwgMHgwNiwgMHg1RSwgMHgxOSwgMHg1OCwgMHgyMSwKKwkweDlDLCAweDE0LCAweDFFLCAweDAyLCAweDNELCAweEZCLCAweDVELCAweEZFLCAweEVELCAweDAwLCAweDcwLAorCTB4MDAsIDB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4RDIsIDB4MDAsIDB4NEEsIDB4MDAsCisJMHg4NSwgMHhGQywgMHg3NCwgMHhGQywgMHg2RCwgMHgwOSwgMHgyRCwgMHgxQywgMHg3MiwgMHgyMCwgMHgxQSwKKwkweDExLCAweEQ0LCAweEZGLCAweDYxLCAweEZCLCAweDEzLCAweEZGLCAweEZDLCAweDAwLCAweDRBLCAweDAwLAorCTB4RjcsIDB4RkYsIDB4RkEsIDB4RkYsIDB4MjUsIDB4MDAsIDB4RUYsIDB4MDAsIDB4Q0UsIDB4RkYsIDB4RTQsCisJMHhGQiwgMHhCNSwgMHhGRCwgMHhERSwgMHgwQywgMHg3QywgMHgxRSwgMHhERCwgMHgxRSwgMHg4QywgMHgwRCwKKwkweDAxLCAweEZFLCAweENBLCAweEZCLCAweEIzLCAweEZGLCAweEYzLCAweDAwLCAweDJCLCAweDAwLCAweEZBLAorCTB4RkYsIDB4RjgsIDB4RkYsIDB4NDQsIDB4MDAsIDB4RkIsIDB4MDAsIDB4MzQsIDB4RkYsIDB4NzEsIDB4RkIsCisJMHg3MSwgMHhGRiwgMHg2QiwgMHgxMCwgMHgzMiwgMHgyMCwgMHhBOSwgMHgxQywgMHgxMywgMHgwQSwgMHhBOCwKKwkweEZDLCAweDYzLCAweEZDLCAweDM1LCAweDAwLCAweEQ5LCAweDAwLCAweDEyLCAweDAwLCAweEZELCAweEZGLAorCTB4RjcsIDB4RkYsIDB4NjksIDB4MDAsIDB4RjIsIDB4MDAsIDB4ODEsIDB4RkUsIDB4M0UsIDB4RkIsIDB4QTQsCisJMHgwMSwgMHhGMiwgMHgxMywgMHgzQSwgMHgyMSwgMHhGMCwgMHgxOSwgMHhDRiwgMHgwNiwgMHhDNywgMHhGQiwKKwkweDFCLCAweEZELCAweDk2LCAweDAwLCAweEI0LCAweDAwLCAweDAyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLAorCTB4MDAsIDB4RkIsIDB4RkYsIDB4OTIsIDB4MDAsIDB4Q0QsIDB4MDAsIDB4QzAsIDB4RkQsIDB4NUUsIDB4RkIsCisJMHg0NywgMHgwNCwgMHg1MSwgMHgxNywgMHg4QSwgMHgyMSwgMHhEMCwgMHgxNiwgMHhEOSwgMHgwMywgMHg1MywKKwkweEZCLCAweERFLCAweEZELCAweEQ1LCAweDAwLCAweDhCLCAweDAwLCAweEZBLCAweEZGLCAweEZGLCAweEZGLAorCTB4MDQsIDB4MDAsIDB4QkEsIDB4MDAsIDB4ODksIDB4MDAsIDB4RkQsIDB4RkMsIDB4RTIsIDB4RkIsIDB4NEIsCisJMHgwNywgMHg2MywgMHgxQSwgMHgxRCwgMHgyMSwgMHg2OSwgMHgxMywgMHg0NiwgMHgwMSwgMHg0MSwgMHhGQiwKKwkweDlFLCAweEZFLCAweEY1LCAweDAwLCAweDYzLCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE2LAorCTB4MDAsIDB4REQsIDB4MDAsIDB4MjMsIDB4MDAsIDB4NDksIDB4RkMsIDB4RDUsIDB4RkMsIDB4OTksIDB4MEEsCisJMHgwOSwgMHgxRCwgMHhGOSwgMHgxRiwgMHhERiwgMHgwRiwgMHgyNCwgMHhGRiwgMHg3RiwgMHhGQiwgMHg0RCwKKwkweEZGLCAweEZCLCAweDAwLCAweDNGLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDJGLCAweDAwLAorCTB4RjUsIDB4MDAsIDB4OUMsIDB4RkYsIDB4QjYsIDB4RkIsIDB4NDEsIDB4RkUsIDB4MTcsIDB4MEUsIDB4MjYsCisJMHgxRiwgMHgyQiwgMHgxRSwgMHg1NCwgMHgwQywgMHg3QywgMHhGRCwgMHhGQSwgMHhGQiwgMHhFMywgMHhGRiwKKwkweEVCLCAweDAwLCAweDIxLCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDUwLCAweDAwLCAweEZCLAorCTB4MDAsIDB4RjgsIDB4RkUsIDB4NTcsIDB4RkIsIDB4MjYsIDB4MDAsIDB4QTYsIDB4MTEsIDB4QTEsIDB4MjAsCisJMHhDNiwgMHgxQiwgMHhFQSwgMHgwOCwgMHg0RCwgMHhGQywgMHhBMCwgMHhGQywgMHg1QSwgMHgwMCwgMHhDRCwKKwkweDAwLCAweDBDLCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDc3LCAweDAwLCAweEU5LCAweDAwLAorCTB4M0YsIDB4RkUsIDB4M0YsIDB4RkIsIDB4ODIsIDB4MDIsIDB4MjMsIDB4MTUsIDB4NkIsIDB4MjEsIDB4RTUsCisJMHgxOCwgMHhCRSwgMHgwNSwgMHg5MywgMHhGQiwgMHg1RSwgMHhGRCwgMHhBRiwgMHgwMCwgMHhBNiwgMHgwMCwKKwkweEZGLCAweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZELCAweEZGLCAweEEwLCAweDAwLCAweEI5LAorCTB4MDAsIDB4N0MsIDB4RkQsIDB4ODAsIDB4RkIsIDB4NDgsIDB4MDUsIDB4NkIsIDB4MTgsIDB4NzksIDB4MjEsCisJMHhBOSwgMHgxNSwgMHhFOSwgMHgwMiwgMHg0MywgMHhGQiwgMHgyMSwgMHhGRSwgMHhFMywgMHgwMCwgMHg3RCwKKwkweDAwLCAweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDA5LCAweDAwLCAweEM3LCAweDAwLCAweDY5LCAweDAwLAorCTB4QkMsIDB4RkMsIDB4MjksIDB4RkMsIDB4NjksIDB4MDgsIDB4NUMsIDB4MUIsIDB4Q0MsIDB4MjAsIDB4MzIsCisJMHgxMiwgMHg3QywgMHgwMCwgMHg0RSwgMHhGQiwgMHhERCwgMHhGRSwgMHhGQSwgMHgwMCwgMHg1NiwgMHgwMCwKKwkweEY3LCAweEZGLCAweEZCLCAweEZGLCAweDFELCAweDAwLCAweEU3LCAweDAwLCAweEY4LCAweEZGLCAweDEyLAorCTB4RkMsIDB4NDUsIDB4RkQsIDB4Q0IsIDB4MEIsIDB4RDYsIDB4MUQsIDB4NkMsIDB4MUYsIDB4QTMsIDB4MEUsCisJMHg4NCwgMHhGRSwgMHhBNCwgMHhGQiwgMHg4NCwgMHhGRiwgMHhGNywgMHgwMCwgMHgzNCwgMHgwMCwgMHhGOSwKKwkweEZGLCAweEY4LCAweEZGLCAweDNBLCAweDAwLCAweEZBLCAweDAwLCAweDY2LCAweEZGLCAweDhFLCAweEZCLAorCTB4REIsIDB4RkUsIDB4NTMsIDB4MEYsIDB4QkQsIDB4MUYsIDB4NjYsIDB4MUQsIDB4MjEsIDB4MEIsIDB4MDUsCisJMHhGRCwgMHgzMCwgMHhGQywgMHgxMCwgMHgwMCwgMHhFMiwgMHgwMCwgMHgxOSwgMHgwMCwgMHhGQywgMHhGRiwKKwkweEY3LCAweEZGLCAweDVELCAweDAwLCAweEY4LCAweDAwLCAweEJBLCAweEZFLCAweDQ2LCAweEZCLCAweEVBLAorCTB4MDAsIDB4REYsIDB4MTIsIDB4RkMsIDB4MjAsIDB4RDMsIDB4MUEsIDB4QzksIDB4MDcsIDB4MDAsIDB4RkMsCisJMHhFMCwgMHhGQywgMHg3QiwgMHgwMCwgMHhDMCwgMHgwMCwgMHgwNywgMHgwMCwgMHhGRiwgMHhGRiwgMHhGOSwKKwkweEZGLCAweDg1LCAweDAwLCAweERDLCAweDAwLCAweEZDLCAweEZELCAweDRBLCAweEZCLCAweDZDLCAweDAzLAorCTB4NEUsIDB4MTYsIDB4ODUsIDB4MjEsIDB4Q0YsIDB4MTcsIDB4QjgsIDB4MDQsIDB4NkMsIDB4RkIsIDB4QTIsCisJMHhGRCwgMHhDNSwgMHgwMCwgMHg5OCwgMHgwMCwgMHhGQywgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwKKwkweDAxLCAweDAwLCAweEFFLCAweDAwLCAweEExLCAweDAwLCAweDM4LCAweEZELCAweEFFLCAweEZCLCAweDU0LAorCTB4MDYsIDB4N0MsIDB4MTksIDB4NTMsIDB4MjEsIDB4N0IsIDB4MTQsIDB4MDUsIDB4MDIsIDB4M0QsIDB4RkIsCisJMHg2NCwgMHhGRSwgMHhFRSwgMHgwMCwgMHg2RiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgwRiwKKwkweDAwLCAweEQ0LCAweDAwLCAweDQ2LCAweDAwLCAweDdFLCAweEZDLCAweDdFLCAweEZDLCAweDhFLCAweDA5LAorCTB4NDYsIDB4MUMsIDB4NjYsIDB4MjAsIDB4RjcsIDB4MTAsIDB4QzAsIDB4RkYsIDB4NjQsIDB4RkIsIDB4MUEsCisJMHhGRiwgMHhGQywgMHgwMCwgMHg0OSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyNiwgMHgwMCwKKwkweEYwLCAweDAwLCAweEM5LCAweEZGLCAweERGLCAweEZCLCAweEM0LCAweEZELCAweDAxLCAweDBELCAweDkwLAorCTB4MUUsIDB4Q0EsIDB4MUUsIDB4NjksIDB4MEQsIDB4RjEsIDB4RkQsIDB4Q0YsIDB4RkIsIDB4QjgsIDB4RkYsCisJMHhGMiwgMHgwMCwgMHgyOSwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0NSwgMHgwMCwgMHhGQywKKwkweDAwLCAweDJELCAweEZGLCAweDZELCAweEZCLCAweDg0LCAweEZGLCAweDhFLCAweDEwLCAweDNGLCAweDIwLAorCTB4OTEsIDB4MUMsIDB4RjIsIDB4MDksIDB4OUQsIDB4RkMsIDB4NkEsIDB4RkMsIDB4MzksIDB4MDAsIDB4RDcsCisJMHgwMCwgMHgxMiwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg2QSwgMHgwMCwgMHhGMSwgMHgwMCwKKwkweDdBLCAweEZFLCAweDNELCAweEZCLCAweEJDLCAweDAxLCAweDE0LCAweDE0LCAweDQxLCAweDIxLCAweEQ0LAorCTB4MTksIDB4QjAsIDB4MDYsIDB4QzAsIDB4RkIsIDB4MjIsIDB4RkQsIDB4OTksIDB4MDAsIDB4QjMsIDB4MDAsCisJMHgwMiwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGRiwgMHg5MywgMHgwMCwgMHhDQiwKKwkweDAwLCAweEI4LCAweEZELCAweDYxLCAweEZCLCAweDYzLCAweDA0LCAweDcxLCAweDE3LCAweDg5LCAweDIxLAorCTB4QjAsIDB4MTYsIDB4QkQsIDB4MDMsIDB4NTEsIDB4RkIsIDB4RTYsIDB4RkQsIDB4RDcsIDB4MDAsIDB4OEEsCisJMHgwMCwgMHhGQSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNSwgMHgwMCwgMHhCQywgMHgwMCwgMHg4NiwgMHgwMCwKKwkweEY2LCAweEZDLCAweEU5LCAweEZCLCAweDZBLCAweDA3LCAweDgwLCAweDFBLCAweDE1LCAweDIxLCAweDQ3LAorCTB4MTMsIDB4MkYsIDB4MDEsIDB4NDIsIDB4RkIsIDB4QTUsIDB4RkUsIDB4RjYsIDB4MDAsIDB4NjEsIDB4MDAsCisJMHhGNywgMHhGRiwgMHhGQywgMHhGRiwgMHgxNiwgMHgwMCwgMHhERiwgMHgwMCwgMHgxRSwgMHgwMCwgMHg0MywKKwkweEZDLCAweEUxLCAweEZDLCAweEJCLCAweDBBLCAweDIxLCAweDFELCAweEVBLCAweDFGLCAweEJDLCAweDBGLAorCTB4MTIsIDB4RkYsIDB4ODIsIDB4RkIsIDB4NTQsIDB4RkYsIDB4RkEsIDB4MDAsIDB4M0QsIDB4MDAsIDB4RjgsCisJMHhGRiwgMHhGOSwgMHhGRiwgMHgzMCwgMHgwMCwgMHhGNiwgMHgwMCwgMHg5NiwgMHhGRiwgMHhCMSwgMHhGQiwKKwkweDUxLCAweEZFLCAweDNBLCAweDBFLCAweDM4LCAweDFGLCAweDE2LCAweDFFLCAweDMyLCAweDBDLCAweDZFLAorCTB4RkQsIDB4MDAsIDB4RkMsIDB4RTgsIDB4RkYsIDB4RUEsIDB4MDAsIDB4MjAsIDB4MDAsIDB4RkIsIDB4RkYsCisJMHhGNywgMHhGRiwgMHg1MSwgMHgwMCwgMHhGQiwgMHgwMCwgMHhGMSwgMHhGRSwgMHg1NCwgMHhGQiwgMHgzQiwKKwkweDAwLCAweEM5LCAweDExLCAweEFELCAweDIwLCAweEFDLCAweDFCLCAweENBLCAweDA4LCAweDQ0LCAweEZDLAorCTB4QTcsIDB4RkMsIDB4NUUsIDB4MDAsIDB4Q0MsIDB4MDAsIDB4MEIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsCisJMHhGRiwgMHg3OCwgMHgwMCwgMHhFNywgMHgwMCwgMHgzOCwgMHhGRSwgMHg0MCwgMHhGQiwgMHg5QiwgMHgwMiwKKwkweDQ1LCAweDE1LCAweDZGLCAweDIxLCAweEM3LCAweDE4LCAweEExLCAweDA1LCAweDhFLCAweEZCLCAweDY1LAorCTB4RkQsIDB4QjIsIDB4MDAsIDB4QTUsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRSwgMHhGRiwgMHhBMiwgMHgwMCwgMHhCNywgMHgwMCwgMHg3NCwgMHhGRCwgMHg4NCwgMHhGQiwgMHg2NiwKKwkweDA1LCAweDhBLCAweDE4LCAweDc2LCAweDIxLCAweDg3LCAweDE1LCAweENGLCAweDAyLCAweDQxLCAweEZCLAorCTB4MjksIDB4RkUsIDB4RTUsIDB4MDAsIDB4N0IsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEEsCisJMHgwMCwgMHhDOSwgMHgwMCwgMHg2NiwgMHgwMCwgMHhCNSwgMHhGQywgMHgzMiwgMHhGQywgMHg4OSwgMHgwOCwKKwkweDc3LCAweDFCLCAweEMyLCAweDIwLCAweDBGLCAweDEyLCAweDY2LCAweDAwLCAweDUwLCAweEZCLCAweEU0LAorCTB4RkUsIDB4RkEsIDB4MDAsIDB4NTQsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MUUsIDB4MDAsCisJMHhFOCwgMHgwMCwgMHhGMywgMHhGRiwgMHgwQywgMHhGQywgMHg1MywgMHhGRCwgMHhFRCwgMHgwQiwgMHhFQiwKKwkweDFELCAweDVBLCAweDFGLCAweDgwLCAweDBFLCAweDczLCAweEZFLCAweEE4LCAweEZCLCAweDhBLCAweEZGLAorCTB4RjcsIDB4MDAsIDB4MzIsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4M0IsIDB4MDAsIDB4RkEsCisJMHgwMCwgMHg2MCwgMHhGRiwgMHg4QSwgMHhGQiwgMHhFRCwgMHhGRSwgMHg3NiwgMHgwRiwgMHhDQywgMHgxRiwKKwkweDRGLCAweDFELCAweEZGLCAweDBBLCAweEY5LCAweEZDLCAweDM2LCAweEZDLCAweDE1LCAweDAwLCAweEUxLAorCTB4MDAsIDB4MTgsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NUUsIDB4MDAsIDB4RjcsIDB4MDAsCisJMHhCMywgMHhGRSwgMHg0NCwgMHhGQiwgMHgwMSwgMHgwMSwgMHgwMiwgMHgxMywgMHgwNCwgMHgyMSwgMHhCOCwKKwkweDFBLCAweEE5LCAweDA3LCAweEY4LCAweEZCLCAweEU3LCAweEZDLCAweDdGLCAweDAwLCAweEJGLCAweDAwLAorCTB4MDYsIDB4MDAsIDB4RkYsIDB4RkYsIDB4RjksIDB4RkYsIDB4ODYsIDB4MDAsIDB4REEsIDB4MDAsIDB4RjUsCisJMHhGRCwgMHg0QywgMHhGQiwgMHg4NywgMHgwMywgMHg2RSwgMHgxNiwgMHg4NiwgMHgyMSwgMHhCMCwgMHgxNywKKwkweDlDLCAweDA0LCAweDY4LCAweEZCLCAweEE5LCAweEZELCAweEM3LCAweDAwLCAweDk2LCAweDAwLCAweEZCLAorCTB4RkYsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDEsIDB4MDAsIDB4QjAsIDB4MDAsIDB4OUYsIDB4MDAsCisJMHgzMSwgMHhGRCwgMHhCNCwgMHhGQiwgMHg3MywgMHgwNiwgMHg5OSwgMHgxOSwgMHg0RCwgMHgyMSwgMHg1OSwKKwkweDE0LCAweEVELCAweDAxLCAweDNELCAweEZCLCAweDZCLCAweEZFLCAweEVGLCAweDAwLCAweDZELCAweDAwLAorCTB4RjcsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4RDUsIDB4MDAsIDB4NDIsIDB4MDAsIDB4NzcsCisJMHhGQywgMHg4OCwgMHhGQywgMHhBRiwgMHgwOSwgMHg1RiwgMHgxQywgMHg1OSwgMHgyMCwgMHhENCwgMHgxMCwKKwkweEFDLCAweEZGLCAweDY3LCAweEZCLCAweDIwLCAweEZGLCAweEZDLCAweDAwLCAweDQ4LCAweDAwLCAweEY3LAorCTB4RkYsIDB4RkEsIDB4RkYsIDB4MjcsIDB4MDAsIDB4RjAsIDB4MDAsIDB4QzMsIDB4RkYsIDB4RDksIDB4RkIsCisJMHhEMywgMHhGRCwgMHgyNCwgMHgwRCwgMHhBMywgMHgxRSwgMHhCNywgMHgxRSwgMHg0NiwgMHgwRCwgMHhFMiwKKwkweEZELCAweEQ0LCAweEZCLCAweEJFLCAweEZGLCAweEYxLCAweDAwLCAweDI4LCAweDAwLCAweEZBLCAweEZGLAorCTB4RjcsIDB4RkYsIDB4NDYsIDB4MDAsIDB4RkMsIDB4MDAsIDB4MjcsIDB4RkYsIDB4NkEsIDB4RkIsIDB4OTgsCisJMHhGRiwgMHhCMSwgMHgxMCwgMHg0QywgMHgyMCwgMHg3OCwgMHgxQywgMHhEMSwgMHgwOSwgMHg5MywgMHhGQywKKwkweDcxLCAweEZDLCAweDNELCAweDAwLCAweEQ2LCAweDAwLCAweDExLCAweDAwLCAweEZELCAweEZGLCAweEY3LAorCTB4RkYsIDB4NkMsIDB4MDAsIDB4RjAsIDB4MDAsIDB4NzIsIDB4RkUsIDB4M0QsIDB4RkIsIDB4RDQsIDB4MDEsCisJMHgzNiwgMHgxNCwgMHg0NywgMHgyMSwgMHhCNiwgMHgxOSwgMHg5MSwgMHgwNiwgMHhCQSwgMHhGQiwgMHgyOSwKKwkweEZELCAweDlDLCAweDAwLCAweEIxLCAweDAwLCAweDAyLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLAorCTB4RkIsIDB4RkYsIDB4OTUsIDB4MDAsIDB4QzksIDB4MDAsIDB4QjEsIDB4RkQsIDB4NjUsIDB4RkIsIDB4ODAsCisJMHgwNCwgMHg5MCwgMHgxNywgMHg4OCwgMHgyMSwgMHg4RiwgMHgxNiwgMHhBMiwgMHgwMywgMHg0RSwgMHhGQiwKKwkweEVELCAweEZELCAweEQ5LCAweDAwLCAweDg4LCAweDAwLCAweEY5LCAweEZGLCAweEZGLCAweEZGLCAweDA1LAorCTB4MDAsIDB4QkQsIDB4MDAsIDB4ODIsIDB4MDAsIDB4RUYsIDB4RkMsIDB4RjAsIDB4RkIsIDB4OEEsIDB4MDcsCisJMHg5QywgMHgxQSwgMHgwRCwgMHgyMSwgMHgyNCwgMHgxMywgMHgxOCwgMHgwMSwgMHg0MywgMHhGQiwgMHhBQywKKwkweEZFLCAweEY3LCAweDAwLCAweDYwLCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE3LCAweDAwLAorCTB4RTAsIDB4MDAsIDB4MUEsIDB4MDAsIDB4M0QsIDB4RkMsIDB4RUQsIDB4RkMsIDB4REQsIDB4MEEsIDB4MzgsCisJMHgxRCwgMHhEQiwgMHgxRiwgMHg5OSwgMHgwRiwgMHhGRiwgMHhGRSwgMHg4NiwgMHhGQiwgMHg1QSwgMHhGRiwKKwkweEZBLCAweDAwLCAweDNDLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDMxLCAweDAwLCAweEY2LAorCTB4MDAsIDB4OTAsIDB4RkYsIDB4QUQsIDB4RkIsIDB4NjIsIDB4RkUsIDB4NUQsIDB4MEUsIDB4NDksIDB4MUYsCisJMHgwMSwgMHgxRSwgMHgxMCwgMHgwQywgMHg2MCwgMHhGRCwgMHgwNiwgMHhGQywgMHhFRSwgMHhGRiwgMHhFOSwKKwkweDAwLCAweDFGLCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDUzLCAweDAwLCAweEZCLCAweDAwLAorCTB4RUIsIDB4RkUsIDB4NTIsIDB4RkIsIDB4NTEsIDB4MDAsIDB4RUMsIDB4MTEsIDB4QjcsIDB4MjAsIDB4OTEsCisJMHgxQiwgMHhBOSwgMHgwOCwgMHgzQiwgMHhGQywgMHhBRSwgMHhGQywgMHg2MiwgMHgwMCwgMHhDQSwgMHgwMCwKKwkweDBCLCAweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDdBLCAweDAwLCAweEU2LCAweDAwLCAweDMwLAorCTB4RkUsIDB4NDAsIDB4RkIsIDB4QjUsIDB4MDIsIDB4NjYsIDB4MTUsIDB4NzMsIDB4MjEsIDB4QTksIDB4MTgsCisJMHg4MywgMHgwNSwgMHg4OSwgMHhGQiwgMHg2RCwgMHhGRCwgMHhCNCwgMHgwMCwgMHhBMywgMHgwMCwgMHhGRSwKKwkweEZGLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZFLCAweEZGLCAweEEzLCAweDAwLCAweEI0LCAweDAwLAorCTB4NkQsIDB4RkQsIDB4ODksIDB4RkIsIDB4ODMsIDB4MDUsIDB4QTksIDB4MTgsIDB4NzMsIDB4MjEsIDB4NjYsCisJMHgxNSwgMHhCNSwgMHgwMiwgMHg0MCwgMHhGQiwgMHgzMCwgMHhGRSwgMHhFNiwgMHgwMCwgMHg3QSwgMHgwMCwKKwkweEY4LCAweEZGLCAweEZFLCAweEZGLCAweDBCLCAweDAwLCAweENBLCAweDAwLCAweDYyLCAweDAwLCAweEFFLAorCTB4RkMsIDB4M0IsIDB4RkMsIDB4QTksIDB4MDgsIDB4OTEsIDB4MUIsIDB4QjcsIDB4MjAsIDB4RUMsIDB4MTEsCisJMHg1MSwgMHgwMCwgMHg1MiwgMHhGQiwgMHhFQiwgMHhGRSwgMHhGQiwgMHgwMCwgMHg1MywgMHgwMCwgMHhGNywKKwkweEZGLCAweEZCLCAweEZGLCAweDFGLCAweDAwLCAweEU5LCAweDAwLCAweEVFLCAweEZGLCAweDA2LCAweEZDLAorCTB4NjAsIDB4RkQsIDB4MTAsIDB4MEMsIDB4MDEsIDB4MUUsIDB4NDksIDB4MUYsIDB4NUQsIDB4MEUsIDB4NjIsCisJMHhGRSwgMHhBRCwgMHhGQiwgMHg5MCwgMHhGRiwgMHhGNiwgMHgwMCwgMHgzMSwgMHgwMCwgMHhGOSwgMHhGRiwKKwkweEY4LCAweEZGLCAweDNDLCAweDAwLCAweEZBLCAweDAwLCAweDVBLCAweEZGLCAweDg2LCAweEZCLCAweEZGLAorCTB4RkUsIDB4OTksIDB4MEYsIDB4REIsIDB4MUYsIDB4MzgsIDB4MUQsIDB4REQsIDB4MEEsIDB4RUQsIDB4RkMsCisJMHgzRCwgMHhGQywgMHgxQSwgMHgwMCwgMHhFMCwgMHgwMCwgMHgxNywgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywKKwkweEZGLCAweDYwLCAweDAwLCAweEY3LCAweDAwLCAweEFDLCAweEZFLCAweDQzLCAweEZCLCAweDE4LCAweDAxLAorCTB4MjQsIDB4MTMsIDB4MEQsIDB4MjEsIDB4OUMsIDB4MUEsIDB4OEEsIDB4MDcsIDB4RjAsIDB4RkIsIDB4RUYsCisJMHhGQywgMHg4MiwgMHgwMCwgMHhCRCwgMHgwMCwgMHgwNSwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGOSwgMHhGRiwKKwkweDg4LCAweDAwLCAweEQ5LCAweDAwLCAweEVELCAweEZELCAweDRFLCAweEZCLCAweEEyLCAweDAzLCAweDhGLAorCTB4MTYsIDB4ODgsIDB4MjEsIDB4OTAsIDB4MTcsIDB4ODAsIDB4MDQsIDB4NjUsIDB4RkIsIDB4QjEsIDB4RkQsCisJMHhDOSwgMHgwMCwgMHg5NSwgMHgwMCwgMHhGQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMiwKKwkweDAwLCAweEIxLCAweDAwLCAweDlDLCAweDAwLCAweDI5LCAweEZELCAweEJBLCAweEZCLCAweDkxLCAweDA2LAorCTB4QjYsIDB4MTksIDB4NDcsIDB4MjEsIDB4MzYsIDB4MTQsIDB4RDQsIDB4MDEsIDB4M0QsIDB4RkIsIDB4NzIsCisJMHhGRSwgMHhGMCwgMHgwMCwgMHg2QywgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgxMSwgMHgwMCwKKwkweEQ2LCAweDAwLCAweDNELCAweDAwLCAweDcxLCAweEZDLCAweDkzLCAweEZDLCAweEQxLCAweDA5LCAweDc4LAorCTB4MUMsIDB4NEMsIDB4MjAsIDB4QjEsIDB4MTAsIDB4OTgsIDB4RkYsIDB4NkEsIDB4RkIsIDB4MjcsIDB4RkYsCisJMHhGQywgMHgwMCwgMHg0NiwgMHgwMCwgMHhGNywgMHhGRiwgMHhGQSwgMHhGRiwgMHgyOCwgMHgwMCwgMHhGMSwKKwkweDAwLCAweEJFLCAweEZGLCAweEQ0LCAweEZCLCAweEUyLCAweEZELCAweDQ2LCAweDBELCAweEI3LCAweDFFLAorCTB4QTMsIDB4MUUsIDB4MjQsIDB4MEQsIDB4RDMsIDB4RkQsIDB4RDksIDB4RkIsIDB4QzMsIDB4RkYsIDB4RjAsCisJMHgwMCwgMHgyNywgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0OCwgMHgwMCwgMHhGQywgMHgwMCwKKwkweDIwLCAweEZGLCAweDY3LCAweEZCLCAweEFDLCAweEZGLCAweEQ0LCAweDEwLCAweDU5LCAweDIwLCAweDVGLAorCTB4MUMsIDB4QUYsIDB4MDksIDB4ODgsIDB4RkMsIDB4NzcsIDB4RkMsIDB4NDIsIDB4MDAsIDB4RDUsIDB4MDAsCisJMHgxMCwgMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg2RCwgMHgwMCwgMHhFRiwgMHgwMCwgMHg2QiwKKwkweEZFLCAweDNELCAweEZCLCAweEVELCAweDAxLCAweDU5LCAweDE0LCAweDRELCAweDIxLCAweDk5LCAweDE5LAorCTB4NzMsIDB4MDYsIDB4QjQsIDB4RkIsIDB4MzEsIDB4RkQsIDB4OUYsIDB4MDAsIDB4QjAsIDB4MDAsIDB4MDEsCisJMHgwMCwgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGRiwgMHg5NiwgMHgwMCwgMHhDNywgMHgwMCwKKwkweEE5LCAweEZELCAweDY4LCAweEZCLCAweDlDLCAweDA0LCAweEIwLCAweDE3LCAweDg2LCAweDIxLCAweDZFLAorCTB4MTYsIDB4ODcsIDB4MDMsIDB4NEMsIDB4RkIsIDB4RjUsIDB4RkQsIDB4REEsIDB4MDAsIDB4ODYsIDB4MDAsCisJMHhGOSwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwNiwgMHgwMCwgMHhCRiwgMHgwMCwgMHg3RiwgMHgwMCwgMHhFNywKKwkweEZDLCAweEY4LCAweEZCLCAweEE5LCAweDA3LCAweEI4LCAweDFBLCAweDA0LCAweDIxLCAweDAyLCAweDEzLAorCTB4MDEsIDB4MDEsIDB4NDQsIDB4RkIsIDB4QjMsIDB4RkUsIDB4RjcsIDB4MDAsIDB4NUUsIDB4MDAsIDB4RjcsCisJMHhGRiwgMHhGQywgMHhGRiwgMHgxOCwgMHgwMCwgMHhFMSwgMHgwMCwgMHgxNSwgMHgwMCwgMHgzNiwgMHhGQywKKwkweEY5LCAweEZDLCAweEZGLCAweDBBLCAweDRGLCAweDFELCAweENDLCAweDFGLCAweDc2LCAweDBGLCAweEVELAorCTB4RkUsIDB4OEEsIDB4RkIsIDB4NjAsIDB4RkYsIDB4RkEsIDB4MDAsIDB4M0IsIDB4MDAsIDB4RjgsIDB4RkYsCisJMHhGOSwgMHhGRiwgMHgzMiwgMHgwMCwgMHhGNywgMHgwMCwgMHg4QSwgMHhGRiwgMHhBOCwgMHhGQiwgMHg3MywKKwkweEZFLCAweDgwLCAweDBFLCAweDVBLCAweDFGLCAweEVCLCAweDFELCAweEVELCAweDBCLCAweDUzLCAweEZELAorCTB4MEMsIDB4RkMsIDB4RjMsIDB4RkYsIDB4RTgsIDB4MDAsIDB4MUUsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsCisJMHhGRiwgMHg1NCwgMHgwMCwgMHhGQSwgMHgwMCwgMHhFNCwgMHhGRSwgMHg1MCwgMHhGQiwgMHg2NiwgMHgwMCwKKwkweDBGLCAweDEyLCAweEMyLCAweDIwLCAweDc3LCAweDFCLCAweDg5LCAweDA4LCAweDMyLCAweEZDLCAweEI1LAorCTB4RkMsIDB4NjYsIDB4MDAsIDB4QzksIDB4MDAsIDB4MEEsIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsCisJMHg3QiwgMHgwMCwgMHhFNSwgMHgwMCwgMHgyOSwgMHhGRSwgMHg0MSwgMHhGQiwgMHhDRiwgMHgwMiwgMHg4NywKKwkweDE1LCAweDc2LCAweDIxLCAweDhBLCAweDE4LCAweDY2LCAweDA1LCAweDg0LCAweEZCLCAweDc0LCAweEZELAorCTB4QjcsIDB4MDAsIDB4QTIsIDB4MDAsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkUsCisJMHhGRiwgMHhBNSwgMHgwMCwgMHhCMiwgMHgwMCwgMHg2NSwgMHhGRCwgMHg4RSwgMHhGQiwgMHhBMSwgMHgwNSwKKwkweEM3LCAweDE4LCAweDZGLCAweDIxLCAweDQ1LCAweDE1LCAweDlCLCAweDAyLCAweDQwLCAweEZCLCAweDM4LAorCTB4RkUsIDB4RTcsIDB4MDAsIDB4NzgsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEIsIDB4MDAsCisJMHhDQywgMHgwMCwgMHg1RSwgMHgwMCwgMHhBNywgMHhGQywgMHg0NCwgMHhGQywgMHhDQSwgMHgwOCwgMHhBQywKKwkweDFCLCAweEFELCAweDIwLCAweEM5LCAweDExLCAweDNCLCAweDAwLCAweDU0LCAweEZCLCAweEYxLCAweEZFLAorCTB4RkIsIDB4MDAsIDB4NTEsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MjAsIDB4MDAsIDB4RUEsCisJMHgwMCwgMHhFOCwgMHhGRiwgMHgwMCwgMHhGQywgMHg2RSwgMHhGRCwgMHgzMiwgMHgwQywgMHgxNiwgMHgxRSwKKwkweDM4LCAweDFGLCAweDNBLCAweDBFLCAweDUxLCAweEZFLCAweEIxLCAweEZCLCAweDk2LCAweEZGLCAweEY2LAorCTB4MDAsIDB4MzAsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4M0QsIDB4MDAsIDB4RkEsIDB4MDAsCisJMHg1NCwgMHhGRiwgMHg4MiwgMHhGQiwgMHgxMiwgMHhGRiwgMHhCQywgMHgwRiwgMHhFQSwgMHgxRiwgMHgyMSwKKwkweDFELCAweEJCLCAweDBBLCAweEUxLCAweEZDLCAweDQzLCAweEZDLCAweDFFLCAweDAwLCAweERGLCAweDAwLAorCTB4MTYsIDB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NjEsIDB4MDAsIDB4RjYsIDB4MDAsIDB4QTUsCisJMHhGRSwgMHg0MiwgMHhGQiwgMHgyRiwgMHgwMSwgMHg0NywgMHgxMywgMHgxNSwgMHgyMSwgMHg4MCwgMHgxQSwKKwkweDZBLCAweDA3LCAweEU5LCAweEZCLCAweEY2LCAweEZDLCAweDg2LCAweDAwLCAweEJDLCAweDAwLCAweDA1LAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4OEEsIDB4MDAsIDB4RDcsIDB4MDAsIDB4RTYsIDB4RkQsCisJMHg1MSwgMHhGQiwgMHhCRCwgMHgwMywgMHhCMCwgMHgxNiwgMHg4OSwgMHgyMSwgMHg3MSwgMHgxNywgMHg2MywKKwkweDA0LCAweDYxLCAweEZCLCAweEI4LCAweEZELCAweENCLCAweDAwLCAweDkzLCAweDAwLCAweEZCLCAweEZGLAorCTB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4MDIsIDB4MDAsIDB4QjMsIDB4MDAsIDB4OTksIDB4MDAsIDB4MjIsCisJMHhGRCwgMHhDMCwgMHhGQiwgMHhCMCwgMHgwNiwgMHhENCwgMHgxOSwgMHg0MSwgMHgyMSwgMHgxNCwgMHgxNCwKKwkweEJDLCAweDAxLCAweDNELCAweEZCLCAweDdBLCAweEZFLCAweEYxLCAweDAwLCAweDZBLCAweDAwLCAweEY3LAorCTB4RkYsIDB4RkQsIDB4RkYsIDB4MTIsIDB4MDAsIDB4RDcsIDB4MDAsIDB4MzksIDB4MDAsIDB4NkEsIDB4RkMsCisJMHg5RCwgMHhGQywgMHhGMiwgMHgwOSwgMHg5MSwgMHgxQywgMHgzRiwgMHgyMCwgMHg4RSwgMHgxMCwgMHg4NCwKKwkweEZGLCAweDZELCAweEZCLCAweDJELCAweEZGLCAweEZDLCAweDAwLCAweDQ1LCAweDAwLCAweEY3LCAweEZGLAorCTB4RkEsIDB4RkYsIDB4MjksIDB4MDAsIDB4RjIsIDB4MDAsIDB4QjgsIDB4RkYsIDB4Q0YsIDB4RkIsIDB4RjEsCisJMHhGRCwgMHg2OSwgMHgwRCwgMHhDQSwgMHgxRSwgMHg5MCwgMHgxRSwgMHgwMSwgMHgwRCwgMHhDNCwgMHhGRCwKKwkweERGLCAweEZCLCAweEM5LCAweEZGLCAweEYwLCAweDAwLCAweDI2LCAweDAwLCAweEZBLCAweEZGLCAweEY3LAorCTB4RkYsIDB4NDksIDB4MDAsIDB4RkMsIDB4MDAsIDB4MUEsIDB4RkYsIDB4NjQsIDB4RkIsIDB4QzAsIDB4RkYsCisJMHhGNywgMHgxMCwgMHg2NiwgMHgyMCwgMHg0NiwgMHgxQywgMHg4RSwgMHgwOSwgMHg3RSwgMHhGQywgMHg3RSwKKwkweEZDLCAweDQ2LCAweDAwLCAweEQ0LCAweDAwLCAweDBGLCAweDAwLCAweEZELCAweEZGLCAweEY3LCAweEZGLAorCTB4NkYsIDB4MDAsIDB4RUUsIDB4MDAsIDB4NjQsIDB4RkUsIDB4M0QsIDB4RkIsIDB4MDUsIDB4MDIsIDB4N0IsCisJMHgxNCwgMHg1MywgMHgyMSwgMHg3QywgMHgxOSwgMHg1NCwgMHgwNiwgMHhBRSwgMHhGQiwgMHgzOCwgMHhGRCwKKwkweEExLCAweDAwLCAweEFFLCAweDAwLCAweDAxLCAweDAwLCAweEZGLCAweEZGLCAweDAwLCAweDAwLCAweEZDLAorCTB4RkYsIDB4OTgsIDB4MDAsIDB4QzUsIDB4MDAsIDB4QTIsIDB4RkQsIDB4NkMsIDB4RkIsIDB4QjgsIDB4MDQsCisJMHhDRiwgMHgxNywgMHg4NSwgMHgyMSwgMHg0RSwgMHgxNiwgMHg2QywgMHgwMywgMHg0QSwgMHhGQiwgMHhGQywKKwkweEZELCAweERDLCAweDAwLCAweDg1LCAweDAwLCAweEY5LCAweEZGLCAweEZGLCAweEZGLCAweDA3LCAweDAwLAorCTB4QzAsIDB4MDAsIDB4N0IsIDB4MDAsIDB4RTAsIDB4RkMsIDB4MDAsIDB4RkMsIDB4QzksIDB4MDcsIDB4RDMsCisJMHgxQSwgMHhGQywgMHgyMCwgMHhERiwgMHgxMiwgMHhFQSwgMHgwMCwgMHg0NiwgMHhGQiwgMHhCQSwgMHhGRSwKKwkweEY4LCAweDAwLCAweDVELCAweDAwLCAweEY3LCAweEZGLCAweEZDLCAweEZGLCAweDE5LCAweDAwLCAweEUyLAorCTB4MDAsIDB4MTAsIDB4MDAsIDB4MzAsIDB4RkMsIDB4MDUsIDB4RkQsIDB4MjEsIDB4MEIsIDB4NjYsIDB4MUQsCisJMHhCRCwgMHgxRiwgMHg1MywgMHgwRiwgMHhEQiwgMHhGRSwgMHg4RSwgMHhGQiwgMHg2NiwgMHhGRiwgMHhGQSwKKwkweDAwLCAweDNBLCAweDAwLCAweEY4LCAweEZGLCAweEY5LCAweEZGLCAweDM0LCAweDAwLCAweEY3LCAweDAwLAorCTB4ODQsIDB4RkYsIDB4QTQsIDB4RkIsIDB4ODQsIDB4RkUsIDB4QTMsIDB4MEUsIDB4NkMsIDB4MUYsIDB4RDYsCisJMHgxRCwgMHhDQiwgMHgwQiwgMHg0NSwgMHhGRCwgMHgxMiwgMHhGQywgMHhGOCwgMHhGRiwgMHhFNywgMHgwMCwKKwkweDFELCAweDAwLCAweEZCLCAweEZGLCAweEY3LCAweEZGLCAweDU2LCAweDAwLCAweEZBLCAweDAwLCAweERELAorCTB4RkUsIDB4NEUsIDB4RkIsIDB4N0MsIDB4MDAsIDB4MzIsIDB4MTIsIDB4Q0MsIDB4MjAsIDB4NUMsIDB4MUIsCisJMHg2OSwgMHgwOCwgMHgyOSwgMHhGQywgMHhCQywgMHhGQywgMHg2OSwgMHgwMCwgMHhDNywgMHgwMCwgMHgwOSwKKwkweDAwLCAweEZFLCAweEZGLCAweEY4LCAweEZGLCAweDdELCAweDAwLCAweEUzLCAweDAwLCAweDIxLCAweEZFLAorCTB4NDMsIDB4RkIsIDB4RTksIDB4MDIsIDB4QTksIDB4MTUsIDB4NzksIDB4MjEsIDB4NkIsIDB4MTgsIDB4NDgsCisJMHgwNSwgMHg4MCwgMHhGQiwgMHg3QywgMHhGRCwgMHhCOSwgMHgwMCwgMHhBMCwgMHgwMCwgMHhGRCwgMHhGRiwKKwkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEZGLCAweEZGLCAweEE2LCAweDAwLCAweEFGLCAweDAwLCAweDVFLAorCTB4RkQsIDB4OTMsIDB4RkIsIDB4QkUsIDB4MDUsIDB4RTUsIDB4MTgsIDB4NkIsIDB4MjEsIDB4MjMsIDB4MTUsCisJMHg4MiwgMHgwMiwgMHgzRiwgMHhGQiwgMHgzRiwgMHhGRSwgMHhFOSwgMHgwMCwgMHg3NywgMHgwMCwgMHhGOCwKKwkweEZGLCAweEZFLCAweEZGLCAweDBDLCAweDAwLCAweENELCAweDAwLCAweDVBLCAweDAwLCAweEEwLCAweEZDLAorCTB4NEQsIDB4RkMsIDB4RUEsIDB4MDgsIDB4QzYsIDB4MUIsIDB4QTEsIDB4MjAsIDB4QTYsIDB4MTEsIDB4MjYsCisJMHgwMCwgMHg1NywgMHhGQiwgMHhGOCwgMHhGRSwgMHhGQiwgMHgwMCwgMHg1MCwgMHgwMCwgMHhGNywgMHhGRiwKKwkweEZCLCAweEZGLCAweDIxLCAweDAwLCAweEVCLCAweDAwLCAweEUzLCAweEZGLCAweEZBLCAweEZCLCAweDdDLAorCTB4RkQsIDB4NTQsIDB4MEMsIDB4MkIsIDB4MUUsIDB4MjYsIDB4MUYsIDB4MTcsIDB4MEUsIDB4NDEsIDB4RkUsCisJMHhCNiwgMHhGQiwgMHg5QywgMHhGRiwgMHhGNSwgMHgwMCwgMHgyRiwgMHgwMCwgMHhGOSwgMHhGRiwgMHhGOCwKKwkweEZGLCAweDNGLCAweDAwLCAweEZCLCAweDAwLCAweDRELCAweEZGLCAweDdGLCAweEZCLCAweDI0LCAweEZGLAorCTB4REYsIDB4MEYsIDB4RjksIDB4MUYsIDB4MDksIDB4MUQsIDB4OTksIDB4MEEsIDB4RDUsIDB4RkMsIDB4NDksCisJMHhGQywgMHgyMywgMHgwMCwgMHhERCwgMHgwMCwgMHgxNiwgMHgwMCwgMHhGQywgMHhGRiwgMHhGNywgMHhGRiwKKwkweDYzLCAweDAwLCAweEY1LCAweDAwLCAweDlFLCAweEZFLCAweDQxLCAweEZCLCAweDQ2LCAweDAxLCAweDY5LAorCTB4MTMsIDB4MUQsIDB4MjEsIDB4NjMsIDB4MUEsIDB4NEIsIDB4MDcsIDB4RTIsIDB4RkIsIDB4RkQsIDB4RkMsCisJMHg4OSwgMHgwMCwgMHhCQSwgMHgwMCwgMHgwNCwgMHgwMCwgMHhGRiwgMHhGRiwgMHhGQSwgMHhGRiwgMHg4QiwKKwkweDAwLCAweEQ1LCAweDAwLCAweERFLCAweEZELCAweDUzLCAweEZCLCAweEQ5LCAweDAzLCAweEQwLCAweDE2LAorCTB4OEEsIDB4MjEsIDB4NTEsIDB4MTcsIDB4NDcsIDB4MDQsIDB4NUUsIDB4RkIsIDB4QzAsIDB4RkQsIDB4Q0QsCisJMHgwMCwgMHg5MiwgMHgwMCwgMHhGQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGRiwgMHhGRiwgMHgwMiwgMHgwMCwKKwkweEI0LCAweDAwLCAweDk2LCAweDAwLCAweDFCLCAweEZELCAweEM3LCAweEZCLCAweENGLCAweDA2LCAweEYwLAorCTB4MTksIDB4M0EsIDB4MjEsIDB4RjIsIDB4MTMsIDB4QTQsIDB4MDEsIDB4M0UsIDB4RkIsIDB4ODEsIDB4RkUsCisJMHhGMiwgMHgwMCwgMHg2OSwgMHgwMCwgMHhGNywgMHhGRiwgMHhGRCwgMHhGRiwgMHgxMiwgMHgwMCwgMHhEOSwKKwkweDAwLCAweDM1LCAweDAwLCAweDYzLCAweEZDLCAweEE4LCAweEZDLCAweDEzLCAweDBBLCAweEE5LCAweDFDLAorCTB4MzIsIDB4MjAsIDB4NkIsIDB4MTAsIDB4NzEsIDB4RkYsIDB4NzEsIDB4RkIsIDB4MzQsIDB4RkYsIDB4RkIsCisJMHgwMCwgMHg0NCwgMHgwMCwgMHhGOCwgMHhGRiwgMHhGQSwgMHhGRiwgMHgyQiwgMHgwMCwgMHhGMywgMHgwMCwKKwkweEIzLCAweEZGLCAweENBLCAweEZCLCAweDAxLCAweEZFLCAweDhDLCAweDBELCAweERELCAweDFFLCAweDdDLAorCTB4MUUsIDB4REUsIDB4MEMsIDB4QjUsIDB4RkQsIDB4RTQsIDB4RkIsIDB4Q0UsIDB4RkYsIDB4RUYsIDB4MDAsCisJMHgyNSwgMHgwMCwgMHhGQSwgMHhGRiwgMHhGNywgMHhGRiwgMHg0QSwgMHgwMCwgMHhGQywgMHgwMCwgMHgxMywKKwkweEZGLCAweDYxLCAweEZCLCAweEQ0LCAweEZGLCAweDFBLCAweDExLCAweDcyLCAweDIwLCAweDJELCAweDFDLAorCTB4NkQsIDB4MDksIDB4NzQsIDB4RkMsIDB4ODUsIDB4RkMsIDB4NEEsIDB4MDAsIDB4RDIsIDB4MDAsIDB4MEYsCisJMHgwMCwgMHhGRCwgMHhGRiwgMHhGNywgMHhGRiwgMHg3MCwgMHgwMCwgMHhFRCwgMHgwMCwgMHg1RCwgMHhGRSwKKwkweDNELCAweEZCLCAweDFFLCAweDAyLCAweDlDLCAweDE0LCAweDU4LCAweDIxLCAweDVFLCAweDE5LCAweDM2LAorCTB4MDYsIDB4QTgsIDB4RkIsIDB4NDAsIDB4RkQsIDB4QTQsIDB4MDAsIDB4QUQsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhGQywgMHhGRiwgMHg5QSwgMHgwMCwgMHhDMywgMHgwMCwgMHg5QSwKKwkweEZELCAweDZGLCAweEZCLCAweEQ1LCAweDA0LCAweEVGLCAweDE3LCAweDgzLCAweDIxLCAweDJELCAweDE2LAorCTB4NTIsIDB4MDMsIDB4NDksIDB4RkIsIDB4MDQsIDB4RkUsIDB4REQsIDB4MDAsIDB4ODMsIDB4MDAsIDB4RjksCisJMHhGRiwgMHhGRiwgMHhGRiwgMHgwNywgMHgwMCwgMHhDMiwgMHgwMCwgMHg3OCwgMHgwMCwgMHhEOSwgMHhGQywKKwkweDA4LCAweEZDLCAweEU5LCAweDA3LCAweEVGLCAweDFBLCAweEYzLCAweDIwLCAweEJDLCAweDEyLCAweEQ0LAorCTB4MDAsIDB4NDcsIDB4RkIsIDB4QzEsIDB4RkUsIDB4RjgsIDB4MDAsIDB4NUIsIDB4MDAsIDB4RjcsIDB4RkYsCisJMHhGQywgMHhGRiwgMHgxQSwgMHgwMCwgMHhFMywgMHgwMCwgMHgwQiwgMHgwMCwgMHgyQSwgMHhGQywgMHgxMiwKKwkweEZELCAweDQyLCAweDBCLCAweDdELCAweDFELCAweEFELCAweDFGLCAweDJGLCAweDBGLCAweEM5LCAweEZFLAorCTB4OTIsIDB4RkIsIDB4NkMsIDB4RkYsIDB4RjksIDB4MDAsIDB4MzgsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RjksCisJMHhGRiwgMHgzNSwgMHgwMCwgMHhGOCwgMHgwMCwgMHg3RSwgMHhGRiwgMHg5RiwgMHhGQiwgMHg5NSwgMHhGRSwKKwkweEM2LCAweDBFLCAweDdDLCAweDFGLCAweEMwLCAweDFELCAweEE5LCAweDBCLCAweDM4LCAweEZELCAweDE4LAorCTB4RkMsIDB4RkQsIDB4RkYsIDB4RTYsIDB4MDAsIDB4MUQsIDB4MDAsIDB4RkIsIDB4RkYsIDB4RjcsIDB4RkYsCisJMHg1NywgMHgwMCwgMHhGQSwgMHgwMCwgMHhENiwgMHhGRSwgMHg0QywgMHhGQiwgMHg5MiwgMHgwMCwgMHg1NCwKKwkweDEyLCAweEQ2LCAweDIwLCAweDQxLCAweDFCLCAweDQ5LCAweDA4LCAweDIwLCAweEZDLCAweEMzLCAweEZDLAorCTB4NkQsIDB4MDAsIDB4QzYsIDB4MDAsIDB4MDksIDB4MDAsIDB4RkUsIDB4RkYsIDB4RjgsIDB4RkYsIDB4N0UsCisJMHgwMCwgMHhFMiwgMHgwMCwgMHgxQSwgMHhGRSwgMHg0NCwgMHhGQiwgMHgwMywgMHgwMywgMHhDQSwgMHgxNSwKKwkweDdDLCAweDIxLCAweDRDLCAweDE4LCAweDJCLCAweDA1LCAweDdCLCAweEZCLCAweDgzLCAweEZELCAweEJDLAorCTB4MDAsIDB4OUUsIDB4MDAsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsCisJMHhBOCwgMHgwMCwgMHhBRCwgMHgwMCwgMHg1NiwgMHhGRCwgMHg5OCwgMHhGQiwgMHhEQywgMHgwNSwgMHgwNCwKKwkweDE5LCAweDY2LCAweDIxLCAweDAyLCAweDE1LCAweDY5LCAweDAyLCAweDNFLCAweEZCLCAweDQ3LCAweEZFLAorCTB4RUEsIDB4MDAsIDB4NzUsIDB4MDAsIDB4RjgsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MEQsIDB4MDAsIDB4Q0UsCisJMHgwMCwgMHg1NiwgMHgwMCwgMHg5OSwgMHhGQywgMHg1NiwgMHhGQywgMHgwQiwgMHgwOSwgMHhFMCwgMHgxQiwKKwkweDk2LCAweDIwLCAweDgzLCAweDExLCAweDExLCAweDAwLCAweDU5LCAweEZCLCAweEZGLCAweEZFLCAweEZCLAorCTB4MDAsIDB4NEUsIDB4MDAsIDB4RjcsIDB4RkYsIDB4RkIsIDB4RkYsIDB4MjIsIDB4MDAsIDB4RUMsIDB4MDAsCisJMHhERSwgMHhGRiwgMHhGNSwgMHhGQiwgMHg4QSwgMHhGRCwgMHg3NywgMHgwQywgMHgzRiwgMHgxRSwgMHgxNCwKKwkweDFGLCAweEY1LCAweDBELCAweDMxLCAweEZFLCAweEJCLCAweEZCLCAweEEyLCAweEZGLCAweEY1LCAweDAwLAorCTB4MkUsIDB4MDAsIDB4RjksIDB4RkYsIDB4RjgsIDB4RkYsIDB4NDAsIDB4MDAsIDB4RkIsIDB4MDAsIDB4NDcsCisJMHhGRiwgMHg3QiwgMHhGQiwgMHgzNywgMHhGRiwgMHgwMiwgMHgxMCwgMHgwNywgMHgyMCwgMHhGMiwgMHgxQywKKwkweDc4LCAweDBBLCAweENBLCAweEZDLCAweDUwLCAweEZDLCAweDI3LCAweDAwLCAweERDLCAweDAwLCAweDE1LAorCTB4MDAsIDB4RkMsIDB4RkYsIDB4RjcsIDB4RkYsIDB4NjQsIDB4MDAsIDB4RjUsIDB4MDAsIDB4OTcsIDB4RkUsCisJMHg0MCwgMHhGQiwgMHg1RCwgMHgwMSwgMHg4QiwgMHgxMywgMHgyNSwgMHgyMSwgMHg0NywgMHgxQSwgMHgyQywKKwkweDA3LCAweERCLCAweEZCLCAweDA1LCAweEZELCAweDhDLCAweDAwLCAweEI5LCAweDAwLCAweDA0LCAweDAwLAorCTB4RkYsIDB4RkYsIDB4RkEsIDB4RkYsIDB4OEQsIDB4MDAsIDB4RDMsIDB4MDAsIDB4RDYsIDB4RkQsIDB4NTYsCisJMHhGQiwgMHhGNCwgMHgwMywgMHhGMCwgMHgxNiwgMHg4QSwgMHgyMSwgMHgzMSwgMHgxNywgMHgyQiwgMHgwNCwKKwkweDVCLCAweEZCLCAweEM3LCAweEZELCAweENGLCAweDAwLCAweDkwLCAweDAwLCAweEZBLCAweEZGLCAweDAwLAorCTB4MDAsIDB4RkYsIDB4RkYsIDB4MDMsIDB4MDAsIDB4QjYsIDB4MDAsIDB4OTIsIDB4MDAsIDB4MTMsIDB4RkQsCisJMHhDRCwgMHhGQiwgMHhFRSwgMHgwNiwgMHgwRCwgMHgxQSwgMHgzMywgMHgyMSwgMHhEMCwgMHgxMywgMHg4QywKKwkweDAxLCAweDNFLCAweEZCLCAweDg4LCAweEZFLCAweEYzLCAweDAwLCAweDY3LCAweDAwLCAweEY3LCAweEZGLAorCTB4MDYsIDB4MDAsIDB4MUQsIDB4MDAsIDB4MDMsIDB4RkYsIDB4RkUsIDB4MDAsIDB4QTEsIDB4MDIsIDB4QTYsCisJMHhGOCwgMHg1NiwgMHgwMiwgMHhBNSwgMHgyOCwgMHhBNSwgMHgyOCwgMHg1NiwgMHgwMiwgMHhBNiwgMHhGOCwKKwkweEExLCAweDAyLCAweEZFLCAweDAwLCAweDAzLCAweEZGLCAweDFELCAweDAwLCAweDA2LCAweDAwLCAweDAwLAorCTB4MDAsIDB4MjEsIDB4MDAsIDB4QTYsIDB4RkYsIDB4M0YsIDB4RkYsIDB4MEIsIDB4MDMsIDB4NDIsIDB4RkUsCisJMHgzRSwgMHhGOCwgMHg3RiwgMHgxNSwgMHhBQywgMHgzMCwgMHg3RiwgMHgxNSwgMHgzRSwgMHhGOCwgMHg0MiwKKwkweEZFLCAweDBCLCAweDAzLCAweDNGLCAweEZGLCAweEE2LCAweEZGLCAweDIxLCAweDAwLCAweDAwLCAweDAwLAorCTB4RkEsIDB4RkYsIDB4Q0UsIDB4RkYsIDB4MTQsIDB4MDEsIDB4MDAsIDB4RkQsIDB4MzUsIDB4MDYsIDB4RDUsCisJMHhGNCwgMHhEQSwgMHgxNSwgMHg5MiwgMHg0MCwgMHhBRSwgMHhGRSwgMHhGMywgMHhGQywgMHg2OCwgMHgwMywKKwkweDg2LCAweEZELCAweDUxLCAweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAxLCAweDAwLCAweEVDLAorCTB4RkYsIDB4RjksIDB4RkYsIDB4QzYsIDB4MDAsIDB4NTUsIDB4RkQsIDB4MzUsIDB4MDYsIDB4OTAsIDB4RjMsCisJMHhFNSwgMHgxQywgMHg2QiwgMHgzRCwgMHg3MSwgMHhGQSwgMHgzNCwgMHhGRiwgMHg0NiwgMHgwMiwgMHhGRiwKKwkweEZELCAweDJELCAweDAxLCAweDkwLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERCLCAweEZGLAorCTB4MkQsIDB4MDAsIDB4NjAsIDB4MDAsIDB4RTEsIDB4RkQsIDB4Q0UsIDB4MDUsIDB4RUQsIDB4RjIsIDB4RjMsCisJMHgyMywgMHgyMCwgMHgzOSwgMHgyMiwgMHhGNywgMHg0NCwgMHgwMSwgMHgxRiwgMHgwMSwgMHg4OSwgMHhGRSwKKwkweEZCLCAweDAwLCAweDlDLCAweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM5LCAweEZGLCAweDY4LAorCTB4MDAsIDB4RTUsIDB4RkYsIDB4QTAsIDB4RkUsIDB4RkIsIDB4MDQsIDB4MEMsIDB4RjMsIDB4QzUsIDB4MkEsCisJMHhEOCwgMHgzMywgMHhDOSwgMHhGNCwgMHgwQiwgMHgwMywgMHgwNSwgMHgwMCwgMHgxQSwgMHhGRiwgMHhDMSwKKwkweDAwLCAweEFELCAweEZGLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweEI1LCAweEZGLCAweEE1LCAweDAwLAorCTB4NUMsIDB4RkYsIDB4OEMsIDB4RkYsIDB4QkYsIDB4MDMsIDB4MDYsIDB4RjQsIDB4MjIsIDB4MzEsIDB4QzgsCisJMHgyRCwgMHg2MywgMHhGMywgMHg3NiwgMHgwNCwgMHgwOCwgMHhGRiwgMHhBNywgMHhGRiwgMHg4NCwgMHgwMCwKKwkweEMwLCAweEZGLCAweDA3LCAweDAwLCAweDBDLCAweDAwLCAweEE0LCAweEZGLCAweEUxLCAweDAwLCAweENCLAorCTB4RkUsIDB4OUIsIDB4MDAsIDB4MjEsIDB4MDIsIDB4RUUsIDB4RjUsIDB4Q0QsIDB4MzYsIDB4MjQsIDB4MjcsCisJMHhFMSwgMHhGMiwgMHg3QSwgMHgwNSwgMHgzMywgMHhGRSwgMHgyQSwgMHgwMCwgMHg0NywgMHgwMCwgMHhEMywKKwkweEZGLCAweDA0LCAweDAwLCAweDBGLCAweDAwLCAweDk1LCAweEZGLCAweDE3LCAweDAxLCAweDNELCAweEZFLAorCTB4QkQsIDB4MDEsIDB4MzAsIDB4MDAsIDB4Q0MsIDB4RjgsIDB4OTIsIDB4M0IsIDB4MkEsIDB4MjAsIDB4MkUsCisJMHhGMywgMHgxMiwgMHgwNiwgMHg4RiwgMHhGRCwgMHg5QSwgMHgwMCwgMHgxMCwgMHgwMCwgMHhFNSwgMHhGRiwKKwkweDAyLCAweDAwLCAweDEwLCAweDAwLCAweDhDLCAweEZGLCAweDQyLCAweDAxLCAweEJCLCAweEZELCAweEU0LAorCTB4MDIsIDB4MDEsIDB4RkUsIDB4OUMsIDB4RkMsIDB4NDUsIDB4M0YsIDB4MTYsIDB4MTksIDB4MkQsIDB4RjQsCisJMHg0MSwgMHgwNiwgMHgyMSwgMHhGRCwgMHhGMywgMHgwMCwgMHhFMCwgMHhGRiwgMHhGNCwgMHhGRiwgMHgwMSwKKwkweDAwLCAweDEwLCAweDAwLCAweDhCLCAweEZGLCAweDVELCAweDAxLCAweDRGLCAweEZELCAweEZCLCAweDAzLAorCTB4QjIsIDB4RkIsIDB4NTMsIDB4MDEsIDB4QzIsIDB4NDEsIDB4MjQsIDB4MTIsIDB4QkEsIDB4RjUsIDB4MEYsCisJMHgwNiwgMHhFOSwgMHhGQywgMHgzMywgMHgwMSwgMHhCQiwgMHhGRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDBELCAweDAwLCAweDkzLCAweEZGLCAweDYzLCAweDAxLCAweDA0LCAweEZELCAweEVGLCAweDA0LCAweDYyLAorCTB4RjksIDB4RDcsIDB4MDYsIDB4RjIsIDB4NDIsIDB4OEQsIDB4MEIsIDB4QjAsIDB4RjcsIDB4ODcsIDB4MDUsCisJMHhFNiwgMHhGQywgMHg1OCwgMHgwMSwgMHhBMCwgMHhGRiwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDAwLCAweDA3LCAweDAwLCAweEE1LCAweEZGLCAweDUyLCAweDAxLCAweEUyLCAweEZDLCAweEFELCAweDA1LAorCTB4MzUsIDB4RjcsIDB4MDgsIDB4MEQsIDB4Q0IsIDB4NDIsIDB4ODEsIDB4MDUsIDB4RTgsIDB4RjksIDB4QkIsCisJMHgwNCwgMHgxMiwgMHhGRCwgMHg2NCwgMHgwMSwgMHg5MCwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweEZFLCAweEZGLCAweEMyLCAweEZGLCAweDI3LCAweDAxLCAweEYxLCAweEZDLCAweDIyLCAweDA2LCAweDU0LAorCTB4RjUsIDB4QjgsIDB4MTMsIDB4NEEsIDB4NDEsIDB4MjksIDB4MDAsIDB4M0MsIDB4RkMsIDB4QkQsIDB4MDMsCisJMHg2NiwgMHhGRCwgMHg1OCwgMHgwMSwgMHg4QSwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGMSwKKwkweEZGLCAweEVCLCAweEZGLCAweEUxLCAweDAwLCAweDM1LCAweEZELCAweDQwLCAweDA2LCAweEU0LCAweEYzLAorCTB4QjcsIDB4MUEsIDB4ODUsIDB4M0UsIDB4QTYsIDB4RkIsIDB4ODYsIDB4RkUsIDB4QTAsIDB4MDIsIDB4RDcsCisJMHhGRCwgMHgzOSwgMHgwMSwgMHg4RSwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhFMSwgMHhGRiwKKwkweDFDLCAweDAwLCAweDgyLCAweDAwLCAweEIwLCAweEZELCAweEY5LCAweDA1LCAweDBDLCAweEYzLCAweENCLAorCTB4MjEsIDB4OEYsIDB4M0EsIDB4MEQsIDB4RjgsIDB4QTksIDB4MDAsIDB4NzksIDB4MDEsIDB4NUQsIDB4RkUsCisJMHgwQiwgMHgwMSwgMHg5OCwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDRSwgMHhGRiwgMHg1NSwKKwkweDAwLCAweDBELCAweDAwLCAweDYwLCAweEZFLCAweDQ4LCAweDA1LCAweEVDLCAweEYyLCAweEI2LCAweDI4LAorCTB4OTEsIDB4MzUsIDB4NjgsIDB4RjUsIDB4ODgsIDB4MDIsIDB4NUEsIDB4MDAsIDB4RUQsIDB4RkUsIDB4RDQsCisJMHgwMCwgMHhBOCwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQiwgMHhGRiwgMHg5MiwgMHgwMCwKKwkweDg3LCAweEZGLCAweDNGLCAweEZGLCAweDJCLCAweDA0LCAweEExLCAweEYzLCAweDNELCAweDJGLCAweEI4LAorCTB4MkYsIDB4QjgsIDB4RjMsIDB4MTEsIDB4MDQsIDB4NTIsIDB4RkYsIDB4N0MsIDB4RkYsIDB4OTcsIDB4MDAsCisJMHhCQSwgMHhGRiwgMHgwOCwgMHgwMCwgMHgwQiwgMHgwMCwgMHhBOSwgMHhGRiwgMHhDRiwgMHgwMCwgMHhGOCwKKwkweEZFLCAweDQ0LCAweDAwLCAweEFBLCAweDAyLCAweDNFLCAweEY1LCAweDI0LCAweDM1LCAweDNCLCAweDI5LAorCTB4RjIsIDB4RjIsIDB4MzUsIDB4MDUsIDB4NzAsIDB4RkUsIDB4MDMsIDB4MDAsIDB4NUEsIDB4MDAsIDB4Q0QsCisJMHhGRiwgMHgwNSwgMHgwMCwgMHgwRSwgMHgwMCwgMHg5OSwgMHhGRiwgMHgwNywgMHgwMSwgMHg2OCwgMHhGRSwKKwkweDYzLCAweDAxLCAweEQwLCAweDAwLCAweEQwLCAweEY3LCAweDM1LCAweDNBLCAweDU1LCAweDIyLCAweDAyLAorCTB4RjMsIDB4RUYsIDB4MDUsIDB4QkMsIDB4RkQsIDB4N0EsIDB4MDAsIDB4MjAsIDB4MDAsIDB4REYsIDB4RkYsCisJMHgwMywgMHgwMCwgMHgxMCwgMHgwMCwgMHg4RSwgMHhGRiwgMHgzNiwgMHgwMSwgMHhFMSwgMHhGRCwgMHg4QSwKKwkweDAyLCAweEIyLCAweEZFLCAweDU2LCAweEZCLCAweDQwLCAweDNFLCAweDQyLCAweDFCLCAweENFLCAweEYzLAorCTB4M0UsIDB4MDYsIDB4M0QsIDB4RkQsIDB4REIsIDB4MDAsIDB4RUUsIDB4RkYsIDB4RjAsIDB4RkYsIDB4MDEsCisJMHgwMCwgMHgxMSwgMHgwMCwgMHg4QSwgMHhGRiwgMHg1NywgMHgwMSwgMHg2RCwgMHhGRCwgMHhBOCwgMHgwMywKKwkweDY5LCAweEZDLCAweEM4LCAweEZGLCAweDIwLCAweDQxLCAweDQwLCAweDE0LCAweDMzLCAweEY1LCAweDI4LAorCTB4MDYsIDB4RjUsIDB4RkMsIDB4MjIsIDB4MDEsIDB4QzUsIDB4RkYsIDB4RkQsIDB4RkYsIDB4MDAsIDB4MDAsCisJMHgwRiwgMHgwMCwgMHg4RiwgMHhGRiwgMHg2NCwgMHgwMSwgMHgxNywgMHhGRCwgMHhBOSwgMHgwNCwgMHgxNiwKKwkweEZBLCAweDEwLCAweDA1LCAweEI4LCAweDQyLCAweDg3LCAweDBELCAweDBELCAweEY3LCAweEI5LCAweDA1LAorCTB4RTIsIDB4RkMsIDB4NTAsIDB4MDEsIDB4QTcsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHgwQSwgMHgwMCwgMHg5RSwgMHhGRiwgMHg1QSwgMHgwMSwgMHhFOCwgMHhGQywgMHg3QSwgMHgwNSwKKwkweERBLCAweEY3LCAweDEwLCAweDBCLCAweEZCLCAweDQyLCAweDRCLCAweDA3LCAweDM1LCAweEY5LCAweDAwLAorCTB4MDUsIDB4MDAsIDB4RkQsIDB4NjMsIDB4MDEsIDB4OTQsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMSwgMHgwMCwgMHhCOCwgMHhGRiwgMHgzNywgMHgwMSwgMHhFNywgMHhGQywgMHgwNywgMHgwNiwgMHhERSwKKwkweEY1LCAweDlGLCAweDExLCAweEU0LCAweDQxLCAweEI4LCAweDAxLCAweDg0LCAweEZCLCAweDBGLCAweDA0LAorCTB4NDgsIDB4RkQsIDB4NUUsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjUsCisJMHhGRiwgMHhERCwgMHhGRiwgMHhGOSwgMHgwMCwgMHgxQiwgMHhGRCwgMHg0MSwgMHgwNiwgMHg0NywgMHhGNCwKKwkweDhCLCAweDE4LCAweDgxLCAweDNGLCAweEYxLCAweEZDLCAweEQ1LCAweEZELCAweEZBLCAweDAyLCAweEIyLAorCTB4RkQsIDB4NDUsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTYsIDB4RkYsCisJMHgwQywgMHgwMCwgMHhBMiwgMHgwMCwgMHg4NSwgMHhGRCwgMHgxQSwgMHgwNiwgMHgzQywgMHhGMywgMHg5RiwKKwkweDFGLCAweEU2LCAweDNCLCAweDBFLCAweEY5LCAweDA3LCAweDAwLCAweEQ0LCAweDAxLCAweDMzLCAweEZFLAorCTB4MUIsIDB4MDEsIDB4OTQsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDQsIDB4RkYsIDB4NDMsCisJMHgwMCwgMHgzMywgMHgwMCwgMHgyNSwgMHhGRSwgMHg4OSwgMHgwNSwgMHhFMCwgMHhGMiwgMHg5QywgMHgyNiwKKwkweDMzLCAweDM3LCAweDFFLCAweEY2LCAweEZELCAweDAxLCAweEIwLCAweDAwLCAweEMwLCAweEZFLCAweEU2LAorCTB4MDAsIDB4QTIsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzEsIDB4RkYsIDB4N0YsIDB4MDAsCisJMHhCMiwgMHhGRiwgMHhGNiwgMHhGRSwgMHg4RSwgMHgwNCwgMHg1MSwgMHhGMywgMHg0OSwgMHgyRCwgMHg5OCwKKwkweDMxLCAweDIzLCAweEY0LCAweEEyLCAweDAzLCAweEEwLCAweEZGLCAweDUxLCAweEZGLCAweEFBLCAweDAwLAorCTB4QjQsIDB4RkYsIDB4MDksIDB4MDAsIDB4MEEsIDB4MDAsIDB4QUUsIDB4RkYsIDB4QkQsIDB4MDAsIDB4MjUsCisJMHhGRiwgMHhGMSwgMHhGRiwgMHgyQiwgMHgwMywgMHhBNSwgMHhGNCwgMHg2OCwgMHgzMywgMHg0OCwgMHgyQiwKKwkweDE3LCAweEYzLCAweEU3LCAweDA0LCAweEIxLCAweEZFLCAweERCLCAweEZGLCAweDZDLCAweDAwLCAweEM3LAorCTB4RkYsIDB4MDYsIDB4MDAsIDB4MEQsIDB4MDAsIDB4OUUsIDB4RkYsIDB4RjcsIDB4MDAsIDB4OTQsIDB4RkUsCisJMHgwOSwgMHgwMSwgMHg2QSwgMHgwMSwgMHhFQiwgMHhGNiwgMHhDMSwgMHgzOCwgMHg3RCwgMHgyNCwgMHhFOCwKKwkweEYyLCAweEMxLCAweDA1LCAweEVFLCAweEZELCAweDU3LCAweDAwLCAweDMxLCAweDAwLCAweERBLCAweEZGLAorCTB4MDMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4OTEsIDB4RkYsIDB4MjksIDB4MDEsIDB4MDksIDB4RkUsIDB4MkYsCisJMHgwMiwgMHg1RiwgMHhGRiwgMHgyNywgMHhGQSwgMHgyMCwgMHgzRCwgMHg3MCwgMHgxRCwgMHg3RCwgMHhGMywKKwkweDMxLCAweDA2LCAweDVFLCAweEZELCAweEJGLCAweDAwLCAweEZELCAweEZGLCAweEVCLCAweEZGLCAweDAyLAorCTB4MDAsIDB4MTEsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NEUsIDB4MDEsIDB4OEUsIDB4RkQsIDB4NTIsIDB4MDMsCisJMHgyMCwgMHhGRCwgMHg1MiwgMHhGRSwgMHg2MCwgMHg0MCwgMHg2MywgMHgxNiwgMHhCNywgMHhGNCwgMHgzOSwKKwkweDA2LCAweDA1LCAweEZELCAweDBGLCAweDAxLCAweEQxLCAweEZGLCAweEY5LCAweEZGLCAweDAwLCAweDAwLAorCTB4MTAsIDB4MDAsIDB4OEQsIDB4RkYsIDB4NjIsIDB4MDEsIDB4MkUsIDB4RkQsIDB4NUUsIDB4MDQsIDB4Q0MsCisJMHhGQSwgMHg1QiwgMHgwMywgMHg1RSwgMHg0MiwgMHg4RSwgMHgwRiwgMHg3MSwgMHhGNiwgMHhFNCwgMHgwNSwKKwkweEUyLCAweEZDLCAweDQ1LCAweDAxLCAweEFGLCAweEZGLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDAsIDB4MEIsIDB4MDAsIDB4OTksIDB4RkYsIDB4NjAsIDB4MDEsIDB4RjIsIDB4RkMsIDB4NDAsIDB4MDUsCisJMHg4NSwgMHhGOCwgMHgyNiwgMHgwOSwgMHgwQywgMHg0MywgMHgyNiwgMHgwOSwgMHg4NSwgMHhGOCwgMHg0MCwKKwkweDA1LCAweEYyLCAweEZDLCAweDYwLCAweDAxLCAweDk5LCAweEZGLCAweDBCLCAweDAwLCAweDAwLCAweDAwLAorCTB4MDQsIDB4MDAsIDB4QUYsIDB4RkYsIDB4NDUsIDB4MDEsIDB4RTIsIDB4RkMsIDB4RTQsIDB4MDUsIDB4NzEsCisJMHhGNiwgMHg4RSwgMHgwRiwgMHg1RSwgMHg0MiwgMHg1QiwgMHgwMywgMHhDQywgMHhGQSwgMHg1RSwgMHgwNCwKKwkweDJFLCAweEZELCAweDYyLCAweDAxLCAweDhELCAweEZGLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweEY5LAorCTB4RkYsIDB4RDEsIDB4RkYsIDB4MEYsIDB4MDEsIDB4MDUsIDB4RkQsIDB4MzksIDB4MDYsIDB4QjcsIDB4RjQsCisJMHg2MywgMHgxNiwgMHg2MCwgMHg0MCwgMHg1MiwgMHhGRSwgMHgyMCwgMHhGRCwgMHg1MiwgMHgwMywgMHg4RSwKKwkweEZELCAweDRFLCAweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEVCLCAweEZGLAorCTB4RkQsIDB4RkYsIDB4QkYsIDB4MDAsIDB4NUUsIDB4RkQsIDB4MzEsIDB4MDYsIDB4N0QsIDB4RjMsIDB4NzAsCisJMHgxRCwgMHgyMCwgMHgzRCwgMHgyNywgMHhGQSwgMHg1RiwgMHhGRiwgMHgyRiwgMHgwMiwgMHgwOSwgMHhGRSwKKwkweDI5LCAweDAxLCAweDkxLCAweEZGLCAweDEwLCAweDAwLCAweDAzLCAweDAwLCAweERBLCAweEZGLCAweDMxLAorCTB4MDAsIDB4NTcsIDB4MDAsIDB4RUUsIDB4RkQsIDB4QzEsIDB4MDUsIDB4RTgsIDB4RjIsIDB4N0QsIDB4MjQsCisJMHhDMSwgMHgzOCwgMHhFQiwgMHhGNiwgMHg2QSwgMHgwMSwgMHgwOSwgMHgwMSwgMHg5NCwgMHhGRSwgMHhGNywKKwkweDAwLCAweDlFLCAweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM3LCAweEZGLCAweDZDLCAweDAwLAorCTB4REIsIDB4RkYsIDB4QjEsIDB4RkUsIDB4RTcsIDB4MDQsIDB4MTcsIDB4RjMsIDB4NDgsIDB4MkIsIDB4NjgsCisJMHgzMywgMHhBNSwgMHhGNCwgMHgyQiwgMHgwMywgMHhGMSwgMHhGRiwgMHgyNSwgMHhGRiwgMHhCRCwgMHgwMCwKKwkweEFFLCAweEZGLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweEI0LCAweEZGLCAweEFBLCAweDAwLCAweDUxLAorCTB4RkYsIDB4QTAsIDB4RkYsIDB4QTIsIDB4MDMsIDB4MjMsIDB4RjQsIDB4OTgsIDB4MzEsIDB4NDksIDB4MkQsCisJMHg1MSwgMHhGMywgMHg4RSwgMHgwNCwgMHhGNiwgMHhGRSwgMHhCMiwgMHhGRiwgMHg3RiwgMHgwMCwgMHhDMSwKKwkweEZGLCAweDA3LCAweDAwLCAweDBDLCAweDAwLCAweEEyLCAweEZGLCAweEU2LCAweDAwLCAweEMwLCAweEZFLAorCTB4QjAsIDB4MDAsIDB4RkQsIDB4MDEsIDB4MUUsIDB4RjYsIDB4MzMsIDB4MzcsIDB4OUMsIDB4MjYsIDB4RTAsCisJMHhGMiwgMHg4OSwgMHgwNSwgMHgyNSwgMHhGRSwgMHgzMywgMHgwMCwgMHg0MywgMHgwMCwgMHhENCwgMHhGRiwKKwkweDA0LCAweDAwLCAweDBGLCAweDAwLCAweDk0LCAweEZGLCAweDFCLCAweDAxLCAweDMzLCAweEZFLCAweEQ0LAorCTB4MDEsIDB4MDcsIDB4MDAsIDB4MEUsIDB4RjksIDB4RTYsIDB4M0IsIDB4OUYsIDB4MUYsIDB4M0MsIDB4RjMsCisJMHgxQSwgMHgwNiwgMHg4NSwgMHhGRCwgMHhBMiwgMHgwMCwgMHgwQywgMHgwMCwgMHhFNiwgMHhGRiwgMHgwMiwKKwkweDAwLCAweDExLCAweDAwLCAweDhDLCAweEZGLCAweDQ1LCAweDAxLCAweEIyLCAweEZELCAweEZBLCAweDAyLAorCTB4RDUsIDB4RkQsIDB4RjEsIDB4RkMsIDB4ODEsIDB4M0YsIDB4OEIsIDB4MTgsIDB4NDcsIDB4RjQsIDB4NDEsCisJMHgwNiwgMHgxQiwgMHhGRCwgMHhGOSwgMHgwMCwgMHhERCwgMHhGRiwgMHhGNSwgMHhGRiwgMHgwMSwgMHgwMCwKKwkweDEwLCAweDAwLCAweDhCLCAweEZGLCAweDVFLCAweDAxLCAweDQ4LCAweEZELCAweDBGLCAweDA0LCAweDg0LAorCTB4RkIsIDB4QjgsIDB4MDEsIDB4RTQsIDB4NDEsIDB4OUYsIDB4MTEsIDB4REUsIDB4RjUsIDB4MDcsIDB4MDYsCisJMHhFNywgMHhGQywgMHgzNywgMHgwMSwgMHhCOCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwKKwkweDAwLCAweDk0LCAweEZGLCAweDYzLCAweDAxLCAweDAwLCAweEZELCAweDAwLCAweDA1LCAweDM1LCAweEY5LAorCTB4NEIsIDB4MDcsIDB4RkIsIDB4NDIsIDB4MTAsIDB4MEIsIDB4REEsIDB4RjcsIDB4N0EsIDB4MDUsIDB4RTgsCisJMHhGQywgMHg1QSwgMHgwMSwgMHg5RSwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkweDA3LCAweDAwLCAweEE3LCAweEZGLCAweDUwLCAweDAxLCAweEUyLCAweEZDLCAweEI5LCAweDA1LCAweDBELAorCTB4RjcsIDB4ODcsIDB4MEQsIDB4QjgsIDB4NDIsIDB4MTAsIDB4MDUsIDB4MTYsIDB4RkEsIDB4QTksIDB4MDQsCisJMHgxNywgMHhGRCwgMHg2NCwgMHgwMSwgMHg4RiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGRCwKKwkweEZGLCAweEM1LCAweEZGLCAweDIyLCAweDAxLCAweEY1LCAweEZDLCAweDI4LCAweDA2LCAweDMzLCAweEY1LAorCTB4NDAsIDB4MTQsIDB4MjAsIDB4NDEsIDB4QzgsIDB4RkYsIDB4NjksIDB4RkMsIDB4QTgsIDB4MDMsIDB4NkQsCisJMHhGRCwgMHg1NywgMHgwMSwgMHg4QSwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhGMCwgMHhGRiwKKwkweEVFLCAweEZGLCAweERCLCAweDAwLCAweDNELCAweEZELCAweDNFLCAweDA2LCAweENFLCAweEYzLCAweDQyLAorCTB4MUIsIDB4NDAsIDB4M0UsIDB4NTYsIDB4RkIsIDB4QjIsIDB4RkUsIDB4OEEsIDB4MDIsIDB4RTEsIDB4RkQsCisJMHgzNiwgMHgwMSwgMHg4RSwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhERiwgMHhGRiwgMHgyMCwKKwkweDAwLCAweDdBLCAweDAwLCAweEJDLCAweEZELCAweEVGLCAweDA1LCAweDAyLCAweEYzLCAweDU1LCAweDIyLAorCTB4MzUsIDB4M0EsIDB4RDAsIDB4RjcsIDB4RDAsIDB4MDAsIDB4NjMsIDB4MDEsIDB4NjgsIDB4RkUsIDB4MDcsCisJMHgwMSwgMHg5OSwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDRCwgMHhGRiwgMHg1QSwgMHgwMCwKKwkweDAzLCAweDAwLCAweDcwLCAweEZFLCAweDM1LCAweDA1LCAweEYyLCAweEYyLCAweDNCLCAweDI5LCAweDI0LAorCTB4MzUsIDB4M0UsIDB4RjUsIDB4QUEsIDB4MDIsIDB4NDQsIDB4MDAsIDB4RjgsIDB4RkUsIDB4Q0YsIDB4MDAsCisJMHhBOSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCQSwgMHhGRiwgMHg5NywgMHgwMCwgMHg3QywKKwkweEZGLCAweDUyLCAweEZGLCAweDExLCAweDA0LCAweEI4LCAweEYzLCAweEI4LCAweDJGLCAweDNELCAweDJGLAorCTB4QTEsIDB4RjMsIDB4MkIsIDB4MDQsIDB4M0YsIDB4RkYsIDB4ODcsIDB4RkYsIDB4OTIsIDB4MDAsIDB4QkIsCisJMHhGRiwgMHgwOCwgMHgwMCwgMHgwQiwgMHgwMCwgMHhBOCwgMHhGRiwgMHhENCwgMHgwMCwgMHhFRCwgMHhGRSwKKwkweDVBLCAweDAwLCAweDg4LCAweDAyLCAweDY4LCAweEY1LCAweDkxLCAweDM1LCAweEI2LCAweDI4LCAweEVDLAorCTB4RjIsIDB4NDgsIDB4MDUsIDB4NjAsIDB4RkUsIDB4MEQsIDB4MDAsIDB4NTUsIDB4MDAsIDB4Q0UsIDB4RkYsCisJMHgwNSwgMHgwMCwgMHgwRSwgMHgwMCwgMHg5OCwgMHhGRiwgMHgwQiwgMHgwMSwgMHg1RCwgMHhGRSwgMHg3OSwKKwkweDAxLCAweEE5LCAweDAwLCAweDBELCAweEY4LCAweDhGLCAweDNBLCAweENCLCAweDIxLCAweDBDLCAweEYzLAorCTB4RjksIDB4MDUsIDB4QjAsIDB4RkQsIDB4ODIsIDB4MDAsIDB4MUMsIDB4MDAsIDB4RTEsIDB4RkYsIDB4MDMsCisJMHgwMCwgMHgxMCwgMHgwMCwgMHg4RSwgMHhGRiwgMHgzOSwgMHgwMSwgMHhENywgMHhGRCwgMHhBMCwgMHgwMiwKKwkweDg2LCAweEZFLCAweEE2LCAweEZCLCAweDg1LCAweDNFLCAweEI3LCAweDFBLCAweEU0LCAweEYzLCAweDQwLAorCTB4MDYsIDB4MzUsIDB4RkQsIDB4RTEsIDB4MDAsIDB4RUIsIDB4RkYsIDB4RjEsIDB4RkYsIDB4MDEsIDB4MDAsCisJMHgxMSwgMHgwMCwgMHg4QSwgMHhGRiwgMHg1OCwgMHgwMSwgMHg2NiwgMHhGRCwgMHhCRCwgMHgwMywgMHgzQywKKwkweEZDLCAweDI5LCAweDAwLCAweDRBLCAweDQxLCAweEI4LCAweDEzLCAweDU0LCAweEY1LCAweDIyLCAweDA2LAorCTB4RjEsIDB4RkMsIDB4MjcsIDB4MDEsIDB4QzIsIDB4RkYsIDB4RkUsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsCisJMHgwMCwgMHg5MCwgMHhGRiwgMHg2NCwgMHgwMSwgMHgxMiwgMHhGRCwgMHhCQiwgMHgwNCwgMHhFOCwgMHhGOSwKKwkweDgxLCAweDA1LCAweENCLCAweDQyLCAweDA4LCAweDBELCAweDM1LCAweEY3LCAweEFELCAweDA1LCAweEUyLAorCTB4RkMsIDB4NTIsIDB4MDEsIDB4QTUsIDB4RkYsIDB4MDcsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwOSwgMHgwMCwgMHhBMCwgMHhGRiwgMHg1OCwgMHgwMSwgMHhFNiwgMHhGQywgMHg4NywgMHgwNSwgMHhCMCwKKwkweEY3LCAweDhELCAweDBCLCAweEYyLCAweDQyLCAweEQ3LCAweDA2LCAweDYyLCAweEY5LCAweEVGLCAweDA0LAorCTB4MDQsIDB4RkQsIDB4NjMsIDB4MDEsIDB4OTMsIDB4RkYsIDB4MEQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHgwMCwgMHhCQiwgMHhGRiwgMHgzMywgMHgwMSwgMHhFOSwgMHhGQywgMHgwRiwgMHgwNiwgMHhCQSwgMHhGNSwKKwkweDI0LCAweDEyLCAweEMyLCAweDQxLCAweDUzLCAweDAxLCAweEIyLCAweEZCLCAweEZCLCAweDAzLCAweDRGLAorCTB4RkQsIDB4NUQsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjQsIDB4RkYsCisJMHhFMCwgMHhGRiwgMHhGMywgMHgwMCwgMHgyMSwgMHhGRCwgMHg0MSwgMHgwNiwgMHgyRCwgMHhGNCwgMHgxNiwKKwkweDE5LCAweDQ1LCAweDNGLCAweDlDLCAweEZDLCAweDAxLCAweEZFLCAweEU0LCAweDAyLCAweEJCLCAweEZELAorCTB4NDIsIDB4MDEsIDB4OEMsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTUsIDB4RkYsIDB4MTAsCisJMHgwMCwgMHg5QSwgMHgwMCwgMHg4RiwgMHhGRCwgMHgxMiwgMHgwNiwgMHgyRSwgMHhGMywgMHgyQSwgMHgyMCwKKwkweDkyLCAweDNCLCAweENDLCAweEY4LCAweDMwLCAweDAwLCAweEJELCAweDAxLCAweDNELCAweEZFLCAweDE3LAorCTB4MDEsIDB4OTUsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDMsIDB4RkYsIDB4NDcsIDB4MDAsCisJMHgyQSwgMHgwMCwgMHgzMywgMHhGRSwgMHg3QSwgMHgwNSwgMHhFMSwgMHhGMiwgMHgyNCwgMHgyNywgMHhDRCwKKwkweDM2LCAweEVFLCAweEY1LCAweDIxLCAweDAyLCAweDlCLCAweDAwLCAweENCLCAweEZFLCAweEUxLCAweDAwLAorCTB4QTQsIDB4RkYsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QzAsIDB4RkYsIDB4ODQsIDB4MDAsIDB4QTcsCisJMHhGRiwgMHgwOCwgMHhGRiwgMHg3NiwgMHgwNCwgMHg2MywgMHhGMywgMHhDOCwgMHgyRCwgMHgyMiwgMHgzMSwKKwkweDA2LCAweEY0LCAweEJGLCAweDAzLCAweDhDLCAweEZGLCAweDVDLCAweEZGLCAweEE1LCAweDAwLCAweEI1LAorCTB4RkYsIDB4MDksIDB4MDAsIDB4MEEsIDB4MDAsIDB4QUQsIDB4RkYsIDB4QzEsIDB4MDAsIDB4MUEsIDB4RkYsCisJMHgwNSwgMHgwMCwgMHgwQiwgMHgwMywgMHhDOSwgMHhGNCwgMHhEOCwgMHgzMywgMHhDNSwgMHgyQSwgMHgwQywKKwkweEYzLCAweEZCLCAweDA0LCAweEEwLCAweEZFLCAweEU1LCAweEZGLCAweDY4LCAweDAwLCAweEM5LCAweEZGLAorCTB4MDYsIDB4MDAsIDB4MEQsIDB4MDAsIDB4OUMsIDB4RkYsIDB4RkIsIDB4MDAsIDB4ODksIDB4RkUsIDB4MUYsCisJMHgwMSwgMHg0NCwgMHgwMSwgMHgyMiwgMHhGNywgMHgyMCwgMHgzOSwgMHhGMywgMHgyMywgMHhFRCwgMHhGMiwKKwkweENFLCAweDA1LCAweEUxLCAweEZELCAweDYwLCAweDAwLCAweDJELCAweDAwLCAweERCLCAweEZGLCAweDAzLAorCTB4MDAsIDB4MTAsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MkQsIDB4MDEsIDB4RkYsIDB4RkQsIDB4NDYsIDB4MDIsCisJMHgzNCwgMHhGRiwgMHg3MSwgMHhGQSwgMHg2QiwgMHgzRCwgMHhFNSwgMHgxQywgMHg5MCwgMHhGMywgMHgzNSwKKwkweDA2LCAweDU1LCAweEZELCAweEM2LCAweDAwLCAweEY5LCAweEZGLCAweEVDLCAweEZGLCAweDAxLCAweDAwLAorCTB4MTEsIDB4MDAsIDB4OEIsIDB4RkYsIDB4NTEsIDB4MDEsIDB4ODYsIDB4RkQsIDB4NjgsIDB4MDMsIDB4RjMsCisJMHhGQywgMHhBRSwgMHhGRSwgMHg5MiwgMHg0MCwgMHhEQSwgMHgxNSwgMHhENSwgMHhGNCwgMHgzNSwgMHgwNiwKKwkweDAwLCAweEZELCAweDE0LCAweDAxLCAweENFLCAweEZGLCAweEZBLCAweEZGLCAweDAwLCAweDAwLCAweDBGLAorCTB4MDAsIDB4OEQsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MjgsIDB4RkQsIDB4NzEsIDB4MDQsIDB4OUUsIDB4RkEsCisJMHhDNywgMHgwMywgMHg3OSwgMHg0MiwgMHgwQiwgMHgwRiwgMHg5NywgMHhGNiwgMHhEQSwgMHgwNSwgMHhFMiwKKwkweEZDLCAweDQ4LCAweDAxLCAweEFELCAweEZGLCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorCTB4MEIsIDB4MDAsIDB4OUEsIDB4RkYsIDB4NUYsIDB4MDEsIDB4RUYsIDB4RkMsIDB4NEYsIDB4MDUsIDB4NUEsCisJMHhGOCwgMHg5RiwgMHgwOSwgMHgwQSwgMHg0MywgMHhBRSwgMHgwOCwgMHhCMSwgMHhGOCwgMHgzMCwgMHgwNSwKKwkweEY1LCAweEZDLCAweDYxLCAweDAxLCAweDk3LCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAzLAorCTB4MDAsIDB4QjEsIDB4RkYsIDB4NDEsIDB4MDEsIDB4RTMsIDB4RkMsIDB4RUQsIDB4MDUsIDB4NEMsIDB4RjYsCisJMHgxMSwgMHgxMCwgMHg0MiwgMHg0MiwgMHhGMSwgMHgwMiwgMHhGQSwgMHhGQSwgMHg0QiwgMHgwNCwgMHgzNCwKKwkweEZELCAweDYxLCAweDAxLCAweDhDLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY4LCAweEZGLAorCTB4RDQsIDB4RkYsIDB4MEEsIDB4MDEsIDB4MEEsIDB4RkQsIDB4M0MsIDB4MDYsIDB4OUEsIDB4RjQsIDB4RUQsCisJMHgxNiwgMHgyQSwgMHg0MCwgMHhGOCwgMHhGRCwgMHg0RCwgMHhGRCwgMHgzQywgMHgwMywgMHg5NywgMHhGRCwKKwkweDRDLCAweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEVBLCAweEZGLCAweDAwLAorCTB4MDAsIDB4QjgsIDB4MDAsIDB4NjcsIDB4RkQsIDB4MkMsIDB4MDYsIDB4NkIsIDB4RjMsIDB4RkMsIDB4MUQsCisJMHhEMywgMHgzQywgMHhERiwgMHhGOSwgMHg4OSwgMHhGRiwgMHgxOCwgMHgwMiwgMHgxMywgMHhGRSwgMHgyNiwKKwkweDAxLCAweDkyLCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ5LCAweEZGLCAweDM2LCAweDAwLAorCTB4NEUsIDB4MDAsIDB4RkIsIDB4RkQsIDB4QjQsIDB4MDUsIDB4RTQsIDB4RjIsIDB4MDQsIDB4MjUsIDB4NUYsCisJMHgzOCwgMHhCNiwgMHhGNiwgMHg5MCwgMHgwMSwgMHhGMywgMHgwMCwgMHg5RiwgMHhGRSwgMHhGMywgMHgwMCwKKwkweDlGLCAweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM2LCAweEZGLCAweDcxLCAweDAwLCAweEQxLAorCTB4RkYsIDB4QzIsIDB4RkUsIDB4RDEsIDB4MDQsIDB4MjMsIDB4RjMsIDB4QzksIDB4MkIsIDB4RjUsIDB4MzIsCisJMHg4MywgMHhGNCwgMHg0OSwgMHgwMywgMHhEQywgMHhGRiwgMHgzMCwgMHhGRiwgMHhCOCwgMHgwMCwgMHhCMCwKKwkweEZGLCAweDBBLCAweDAwLCAweDA5LCAweDAwLCAweEIzLCAweEZGLCAweEFFLCAweDAwLCAweDQ2LCAweEZGLAorCTB4QjQsIDB4RkYsIDB4ODUsIDB4MDMsIDB4NDIsIDB4RjQsIDB4MEUsIDB4MzIsIDB4Q0EsIDB4MkMsIDB4NDEsCisJMHhGMywgMHhBNSwgMHgwNCwgMHhFNCwgMHhGRSwgMHhCQywgMHhGRiwgMHg3QSwgMHgwMCwgMHhDMywgMHhGRiwKKwkweDA3LCAweDAwLCAweDBELCAweDAwLCAweEExLCAweEZGLCAweEVBLCAweDAwLCAweEI1LCAweEZFLCAweEM2LAorCTB4MDAsIDB4RDksIDB4MDEsIDB4NEYsIDB4RjYsIDB4OTksIDB4MzcsIDB4MTYsIDB4MjYsIDB4RTAsIDB4RjIsCisJMHg5OCwgMHgwNSwgMHgxNiwgMHhGRSwgMHgzQywgMHgwMCwgMHgzRiwgMHgwMCwgMHhENiwgMHhGRiwgMHgwNCwKKwkweDAwLCAweDBGLCAweDAwLCAweDkzLCAweEZGLCAweDFGLCAweDAxLCAweDI4LCAweEZFLCAweEVCLCAweDAxLAorCTB4REQsIDB4RkYsIDB4NTIsIDB4RjksIDB4MzYsIDB4M0MsIDB4MTMsIDB4MUYsIDB4NEIsIDB4RjMsIDB4MjAsCisJMHgwNiwgMHg3QiwgMHhGRCwgMHhBOSwgMHgwMCwgMHgwOCwgMHgwMCwgMHhFNywgMHhGRiwgMHgwMiwgMHgwMCwKKwkweDExLCAweDAwLCAweDhDLCAweEZGLCAweDQ3LCAweDAxLCAweEE5LCAweEZELCAweDEwLCAweDAzLCAweEE4LAorCTB4RkQsIDB4NDcsIDB4RkQsIDB4QkIsIDB4M0YsIDB4MDEsIDB4MTgsIDB4NjIsIDB4RjQsIDB4NDAsIDB4MDYsCisJMHgxNSwgMHhGRCwgMHhGRiwgMHgwMCwgMHhEQSwgMHhGRiwgMHhGNiwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwKKwkweDAwLCAweDhCLCAweEZGLCAweDVGLCAweDAxLCAweDQxLCAweEZELCAweDIzLCAweDA0LCAweDU2LCAweEZCLAorCTB4MUYsIDB4MDIsIDB4MDYsIDB4NDIsIDB4MTksIDB4MTEsIDB4MDIsIDB4RjYsIDB4RkYsIDB4MDUsIDB4RTUsCisJMHhGQywgMHgzQiwgMHgwMSwgMHhCNiwgMHhGRiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwRCwgMHgwMCwKKwkweDk1LCAweEZGLCAweDYyLCAweDAxLCAweEZDLCAweEZDLCAweDEwLCAweDA1LCAweDA5LCAweEY5LCAweEMxLAorCTB4MDcsIDB4MDMsIDB4NDMsIDB4OTQsIDB4MEEsIDB4MDUsIDB4RjgsIDB4NkMsIDB4MDUsIDB4RUEsIDB4RkMsCisJMHg1QywgMHgwMSwgMHg5RCwgMHhGRiwgMHgwQSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwKKwkweDAwLCAweEE5LCAweEZGLCAweDRELCAweDAxLCAweEUxLCAweEZDLCAweEM0LCAweDA1LCAweEU2LCAweEY2LAorCTB4MDgsIDB4MEUsIDB4QTUsIDB4NDIsIDB4QTEsIDB4MDQsIDB4NDMsIDB4RkEsIDB4OTcsIDB4MDQsIDB4MUQsCisJMHhGRCwgMHg2NCwgMHgwMSwgMHg4RiwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQywgMHhGRiwKKwkweEM4LCAweEZGLCAweDFFLCAweDAxLCAweEY4LCAweEZDLCAweDJELCAweDA2LCAweDEzLCAweEY1LCAweEM4LAorCTB4MTQsIDB4RjIsIDB4NDAsIDB4NjksIDB4RkYsIDB4OTcsIDB4RkMsIDB4OTIsIDB4MDMsIDB4NzUsIDB4RkQsCisJMHg1NSwgMHgwMSwgMHg4QSwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRiwgMHhGRiwgMHhGMiwKKwkweEZGLCAweEQ0LCAweDAwLCAweDQ1LCAweEZELCAweDNCLCAweDA2LCAweEI4LCAweEYzLCAweENFLCAweDFCLAorCTB4RkIsIDB4M0QsIDB4MDgsIDB4RkIsIDB4REUsIDB4RkUsIDB4NzMsIDB4MDIsIDB4RUIsIDB4RkQsIDB4MzMsCisJMHgwMSwgMHg4RiwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhERSwgMHhGRiwgMHgyNSwgMHgwMCwKKwkweDcxLCAweDAwLCAweEM4LCAweEZELCAweEU1LCAweDA1LCAweEZBLCAweEYyLCAweERGLCAweDIyLCAweERCLAorCTB4MzksIDB4OTQsIDB4RjcsIDB4RjcsIDB4MDAsIDB4NEMsIDB4MDEsIDB4NzMsIDB4RkUsIDB4MDMsIDB4MDEsCisJMHg5QSwgMHhGRiwgMHgwRSwgMHgwMCwgMHgwNSwgMHgwMCwgMHhDQywgMHhGRiwgMHg1RSwgMHgwMCwgMHhGOSwKKwkweEZGLCAweDgwLCAweEZFLCAweDIzLCAweDA1LCAweEY5LCAweEYyLCAweEMwLCAweDI5LCAweEI4LCAweDM0LAorCTB4MTYsIDB4RjUsIDB4Q0IsIDB4MDIsIDB4MkYsIDB4MDAsIDB4MDMsIDB4RkYsIDB4Q0EsIDB4MDAsIDB4QUEsCisJMHhGRiwgMHgwQiwgMHgwMCwgMHgwOCwgMHgwMCwgMHhCOCwgMHhGRiwgMHg5QiwgMHgwMCwgMHg3MiwgMHhGRiwKKwkweDY1LCAweEZGLCAweEY2LCAweDAzLCAweEQxLCAweEYzLCAweDMxLCAweDMwLCAweEMxLCAweDJFLCAweDhCLAorCTB4RjMsIDB4NDUsIDB4MDQsIDB4MkQsIDB4RkYsIDB4OTIsIDB4RkYsIDB4OEQsIDB4MDAsIDB4QkQsIDB4RkYsCisJMHgwOCwgMHgwMCwgMHgwQywgMHgwMCwgMHhBNiwgMHhGRiwgMHhEOCwgMHgwMCwgMHhFMiwgMHhGRSwgMHg2RiwKKwkweDAwLCAweDY2LCAweDAyLCAweDkzLCAweEY1LCAweEZCLCAweDM1LCAweDMxLCAweDI4LCAweEU3LCAweEYyLAorCTB4NTksIDB4MDUsIDB4NTEsIDB4RkUsIDB4MTcsIDB4MDAsIDB4NTAsIDB4MDAsIDB4RDAsIDB4RkYsIDB4MDUsCisJMHgwMCwgMHgwRSwgMHgwMCwgMHg5NywgMHhGRiwgMHgwRiwgMHgwMSwgMHg1MywgMHhGRSwgMHg5MCwgMHgwMSwKKwkweDgxLCAweDAwLCAweDRCLCAweEY4LCAweEU2LCAweDNBLCAweDNGLCAweDIxLCAweDE2LCAweEYzLCAweDAyLAorCTB4MDYsIDB4QTUsIDB4RkQsIDB4OEEsIDB4MDAsIDB4MTgsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MDIsIDB4MDAsCisJMHgxMCwgMHgwMCwgMHg4RCwgMHhGRiwgMHgzQywgMHgwMSwgMHhDRSwgMHhGRCwgMHhCNywgMHgwMiwgMHg1QSwKKwkweEZFLCAweEY3LCAweEZCLCAweEM2LCAweDNFLCAweDJDLCAweDFBLCAweEZDLCAweEYzLCAweDQxLCAweDA2LAorCTB4MkUsIDB4RkQsIDB4RTcsIDB4MDAsIDB4RTcsIDB4RkYsIDB4RjIsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsCisJMHgwMCwgMHg4QiwgMHhGRiwgMHg1QSwgMHgwMSwgMHg1RSwgMHhGRCwgMHhEMiwgMHgwMywgMHgwRSwgMHhGQywKKwkweDhCLCAweDAwLCAweDc1LCAweDQxLCAweDMyLCAweDEzLCAweDc1LCAweEY1LCAweDFDLCAweDA2LCAweEVFLAorCTB4RkMsIDB4MkIsIDB4MDEsIDB4QzAsIDB4RkYsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsCisJMHg5MSwgMHhGRiwgMHg2NCwgMHgwMSwgMHgwRCwgMHhGRCwgMHhDRCwgMHgwNCwgMHhCQiwgMHhGOSwgMHhGMiwKKwkweDA1LCAweEQ5LCAweDQyLCAweDg4LCAweDBDLCAweDVFLCAweEY3LCAweEExLCAweDA1LCAweEUzLCAweEZDLAorCTB4NTQsIDB4MDEsIDB4QTMsIDB4RkYsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksCisJMHgwMCwgMHhBMiwgMHhGRiwgMHg1NiwgMHgwMSwgMHhFNSwgMHhGQywgMHg5NCwgMHgwNSwgMHg4NywgMHhGNywKKwkweDBBLCAweDBDLCAweEU2LCAweDQyLCAweDY0LCAweDA2LCAweDhFLCAweEY5LCAweERFLCAweDA0LCAweDA5LAorCTB4RkQsIDB4NjQsIDB4MDEsIDB4OTIsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisJMHhCRCwgMHhGRiwgMHgyRiwgMHgwMSwgMHhFQywgMHhGQywgMHgxNiwgMHgwNiwgMHg5OCwgMHhGNSwgMHhBQiwKKwkweDEyLCAweDlDLCAweDQxLCAweEVFLCAweDAwLCAweEUwLCAweEZCLCAweEU2LCAweDAzLCAweDU3LCAweEZELAorCTB4NUIsIDB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjMsIDB4RkYsIDB4RTQsCisJMHhGRiwgMHhFRCwgMHgwMCwgMHgyNywgMHhGRCwgMHg0MSwgMHgwNiwgMHgxNCwgMHhGNCwgMHhBMSwgMHgxOSwKKwkweDA2LCAweDNGLCAweDQ5LCAweEZDLCAweDJFLCAweEZFLCAweENELCAweDAyLCAweEM0LCAweEZELCAweDNGLAorCTB4MDEsIDB4OEQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MTQsIDB4MDAsCisJMHg5MiwgMHgwMCwgMHg5QSwgMHhGRCwgMHgwQSwgMHgwNiwgMHgyMiwgMHhGMywgMHhCNCwgMHgyMCwgMHgzQywKKwkweDNCLCAweDhCLCAweEY4LCAweDU4LCAweDAwLCAweEE3LCAweDAxLCAweDQ4LCAweEZFLCAweDEzLCAweDAxLAorCTB4OTYsIDB4RkYsIDB4MEYsIDB4MDAsIDB4MDQsIDB4MDAsIDB4RDEsIDB4RkYsIDB4NEMsIDB4MDAsIDB4MjAsCisJMHgwMCwgMHg0MiwgMHhGRSwgMHg2QSwgMHgwNSwgMHhFMywgMHhGMiwgMHhBQiwgMHgyNywgMHg2NiwgMHgzNiwKKwkweEMwLCAweEY1LCAweDQ0LCAweDAyLCAweDg1LCAweDAwLCAweEQ3LCAweEZFLCAweERELCAweDAwLCAweEE1LAorCTB4RkYsIDB4MEMsIDB4MDAsIDB4MDcsIDB4MDAsIDB4QkUsIDB4RkYsIDB4ODksIDB4MDAsIDB4OUQsIDB4RkYsCisJMHgxQSwgMHhGRiwgMHg1RSwgMHgwNCwgMHg3NiwgMHhGMywgMHg0NSwgMHgyRSwgMHhBQSwgMHgzMCwgMHhFQiwKKwkweEYzLCAweERCLCAweDAzLCAweDc5LCAweEZGLCAweDY3LCAweEZGLCAweEEwLCAweDAwLCAweEI3LCAweEZGLAorCTB4MDksIDB4MDAsIDB4MEIsIDB4MDAsIDB4QUMsIDB4RkYsIDB4QzYsIDB4MDAsIDB4MEUsIDB4RkYsIDB4MUEsCisJMHgwMCwgMHhFQiwgMHgwMiwgMHhFRiwgMHhGNCwgMHg0OSwgMHgzNCwgMHg0MywgMHgyQSwgMHgwMiwgMHhGMywKKwkweDBGLCAweDA1LCAweDkwLCAweEZFLCAweEVGLCAweEZGLCAweDYzLCAweDAwLCAweENBLCAweEZGLCAweDA2LAorCTB4MDAsIDB4MEUsIDB4MDAsIDB4OUIsIDB4RkYsIDB4RkYsIDB4MDAsIDB4N0UsIDB4RkUsIDB4MzYsIDB4MDEsCisJMHgxRSwgMHgwMSwgMHg1QiwgMHhGNywgMHg3RSwgMHgzOSwgMHg2OSwgMHgyMywgMHhGMywgMHhGMiwgMHhEOSwKKwkweDA1LCAweEQ0LCAweEZELCAweDY5LCAweDAwLCAweDI5LCAweDAwLCAweERELCAweEZGLCAweDAzLCAweDAwLAorCTB4MTAsIDB4MDAsIDB4OTAsIDB4RkYsIDB4MzAsIDB4MDEsIDB4RjUsIDB4RkQsIDB4NUMsIDB4MDIsIDB4MDksCisJMHhGRiwgMHhCQywgMHhGQSwgMHhCNSwgMHgzRCwgMHg1QSwgMHgxQywgMHhBMywgMHhGMywgMHgzOCwgMHgwNiwKKwkweDRELCAweEZELCAweENELCAweDAwLCAweEY1LCAweEZGLCAweEVELCAweEZGLCAweDAxLCAweDAwLCAweDExLAorCTB4MDAsIDB4OEIsIDB4RkYsIDB4NTMsIDB4MDEsIDB4N0UsIDB4RkQsIDB4N0QsIDB4MDMsIDB4QzUsIDB4RkMsCisJMHgwQiwgMHhGRiwgMHhDMywgMHg0MCwgMHg1MSwgMHgxNSwgMHhGNCwgMHhGNCwgMHgzMSwgMHgwNiwgMHhGQywKKwkweEZDLCAweDE5LCAweDAxLCAweENCLCAweEZGLCAweEZCLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLAorCTB4OEUsIDB4RkYsIDB4NjMsIDB4MDEsIDB4MjIsIDB4RkQsIDB4ODQsIDB4MDQsIDB4NzEsIDB4RkEsIDB4MzQsCisJMHgwNCwgMHg5MCwgMHg0MiwgMHg4OSwgMHgwRSwgMHhCRSwgMHhGNiwgMHhDRiwgMHgwNSwgMHhFMSwgMHhGQywKKwkweDRBLCAweDAxLCAweEFCLCAweEZGLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBCLAorCTB4MDAsIDB4OUIsIDB4RkYsIDB4NUQsIDB4MDEsIDB4RUMsIDB4RkMsIDB4NUQsIDB4MDUsIDB4MkYsIDB4RjgsCisJMHgxOSwgMHgwQSwgMHgwNywgMHg0MywgMHgzNywgMHgwOCwgMHhERCwgMHhGOCwgMHgyMSwgMHgwNSwgMHhGOCwKKwkweEZDLCAweDYyLCAweDAxLCAweDk2LCAweEZGLCAweDBDLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLAorCTB4QjQsIDB4RkYsIDB4M0UsIDB4MDEsIDB4RTQsIDB4RkMsIDB4RjYsIDB4MDUsIDB4MjYsIDB4RjYsIDB4OTUsCisJMHgxMCwgMHgyNiwgMHg0MiwgMHg4NywgMHgwMiwgMHgyOCwgMHhGQiwgMHgzNywgMHgwNCwgMHgzQiwgMHhGRCwKKwkweDYwLCAweDAxLCAweDhDLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY3LCAweEZGLCAweEQ3LAorCTB4RkYsIDB4MDQsIDB4MDEsIDB4MEYsIDB4RkQsIDB4M0UsIDB4MDYsIDB4N0QsIDB4RjQsIDB4NzYsIDB4MTcsCisJMHhGNCwgMHgzRiwgMHg5RiwgMHhGRCwgMHg3QiwgMHhGRCwgMHgyNiwgMHgwMywgMHhBMCwgMHhGRCwgMHg0QSwKKwkweDAxLCAweDhCLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEU5LCAweEZGLCAweDA0LCAweDAwLAorCTB4QjEsIDB4MDAsIDB4NzEsIDB4RkQsIDB4MjYsIDB4MDYsIDB4NUEsIDB4RjMsIDB4ODgsIDB4MUUsIDB4ODcsCisJMHgzQywgMHg5OCwgMHhGOSwgMHhCMywgMHhGRiwgMHgwMiwgMHgwMiwgMHgxRSwgMHhGRSwgMHgyMiwgMHgwMSwKKwkweDkzLCAweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ3LCAweEZGLCAweDNBLCAweDAwLCAweDQ1LAorCTB4MDAsIDB4MDksIDB4RkUsIDB4QTcsIDB4MDUsIDB4RTEsIDB4RjIsIDB4OEQsIDB4MjUsIDB4RkQsIDB4MzcsCisJMHg4MiwgMHhGNiwgMHhCNSwgMHgwMSwgMHhEQywgMHgwMCwgMHhBQSwgMHhGRSwgMHhFRSwgMHgwMCwgMHhBMCwKKwkweEZGLCAweDBELCAweDAwLCAweDA2LCAweDAwLCAweEM0LCAweEZGLCAweDc2LCAweDAwLCAweEM3LCAweEZGLAorCTB4RDMsIDB4RkUsIDB4QkMsIDB4MDQsIDB4MzEsIDB4RjMsIDB4NEEsIDB4MkMsIDB4ODMsIDB4MzIsIDB4NjEsCisJMHhGNCwgMHg2OCwgMHgwMywgMHhDOCwgMHhGRiwgMHgzQiwgMHhGRiwgMHhCMywgMHgwMCwgMHhCMSwgMHhGRiwKKwkweDBBLCAweDAwLCAweDBBLCAweDAwLCAweEIxLCAweEZGLCAweEIzLCAweDAwLCAweDNCLCAweEZGLCAweEM4LAorCTB4RkYsIDB4NjgsIDB4MDMsIDB4NjEsIDB4RjQsIDB4ODMsIDB4MzIsIDB4NEEsIDB4MkMsIDB4MzEsIDB4RjMsCisJMHhCQywgMHgwNCwgMHhEMywgMHhGRSwgMHhDNywgMHhGRiwgMHg3NiwgMHgwMCwgMHhDNCwgMHhGRiwgMHgwNiwKKwkweDAwLCAweDBELCAweDAwLCAweEEwLCAweEZGLCAweEVFLCAweDAwLCAweEFBLCAweEZFLCAweERDLCAweDAwLAorCTB4QjUsIDB4MDEsIDB4ODIsIDB4RjYsIDB4RkQsIDB4MzcsIDB4OEQsIDB4MjUsIDB4RTEsIDB4RjIsIDB4QTcsCisJMHgwNSwgMHgwOSwgMHhGRSwgMHg0NSwgMHgwMCwgMHgzQSwgMHgwMCwgMHhENywgMHhGRiwgMHgwNCwgMHgwMCwKKwkweDBGLCAweDAwLCAweDkzLCAweEZGLCAweDIyLCAweDAxLCAweDFFLCAweEZFLCAweDAyLCAweDAyLCAweEIzLAorCTB4RkYsIDB4OTgsIDB4RjksIDB4ODcsIDB4M0MsIDB4ODgsIDB4MUUsIDB4NUEsIDB4RjMsIDB4MjYsIDB4MDYsCisJMHg3MSwgMHhGRCwgMHhCMSwgMHgwMCwgMHgwNCwgMHgwMCwgMHhFOSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgxMSwKKwkweDAwLCAweDhCLCAweEZGLCAweDRBLCAweDAxLCAweEEwLCAweEZELCAweDI2LCAweDAzLCAweDdCLCAweEZELAorCTB4OUYsIDB4RkQsIDB4RjQsIDB4M0YsIDB4NzYsIDB4MTcsIDB4N0QsIDB4RjQsIDB4M0UsIDB4MDYsIDB4MEYsCisJMHhGRCwgMHgwNCwgMHgwMSwgMHhENywgMHhGRiwgMHhGNywgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwKKwkweDhDLCAweEZGLCAweDYwLCAweDAxLCAweDNCLCAweEZELCAweDM3LCAweDA0LCAweDI4LCAweEZCLCAweDg3LAorCTB4MDIsIDB4MjYsIDB4NDIsIDB4OTUsIDB4MTAsIDB4MjYsIDB4RjYsIDB4RjYsIDB4MDUsIDB4RTQsIDB4RkMsCisJMHgzRSwgMHgwMSwgMHhCNCwgMHhGRiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHg5NiwKKwkweEZGLCAweDYyLCAweDAxLCAweEY4LCAweEZDLCAweDIxLCAweDA1LCAweERELCAweEY4LCAweDM3LCAweDA4LAorCTB4MDcsIDB4NDMsIDB4MTksIDB4MEEsIDB4MkYsIDB4RjgsIDB4NUQsIDB4MDUsIDB4RUMsIDB4RkMsIDB4NUQsCisJMHgwMSwgMHg5QiwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwKKwkweEFCLCAweEZGLCAweDRBLCAweDAxLCAweEUxLCAweEZDLCAweENGLCAweDA1LCAweEJFLCAweEY2LCAweDg5LAorCTB4MEUsIDB4OTAsIDB4NDIsIDB4MzQsIDB4MDQsIDB4NzEsIDB4RkEsIDB4ODQsIDB4MDQsIDB4MjIsIDB4RkQsCisJMHg2MywgMHgwMSwgMHg4RSwgMHhGRiwgMHgwRiwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGQiwgMHhGRiwgMHhDQiwKKwkweEZGLCAweDE5LCAweDAxLCAweEZDLCAweEZDLCAweDMxLCAweDA2LCAweEY0LCAweEY0LCAweDUxLCAweDE1LAorCTB4QzMsIDB4NDAsIDB4MEIsIDB4RkYsIDB4QzUsIDB4RkMsIDB4N0QsIDB4MDMsIDB4N0UsIDB4RkQsIDB4NTMsCisJMHgwMSwgMHg4QiwgMHhGRiwgMHgxMSwgMHgwMCwgMHgwMSwgMHgwMCwgMHhFRCwgMHhGRiwgMHhGNSwgMHhGRiwKKwkweENELCAweDAwLCAweDRELCAweEZELCAweDM4LCAweDA2LCAweEEzLCAweEYzLCAweDVBLCAweDFDLCAweEI1LAorCTB4M0QsIDB4QkMsIDB4RkEsIDB4MDksIDB4RkYsIDB4NUMsIDB4MDIsIDB4RjUsIDB4RkQsIDB4MzAsIDB4MDEsCisJMHg5MCwgMHhGRiwgMHgxMCwgMHgwMCwgMHgwMywgMHgwMCwgMHhERCwgMHhGRiwgMHgyOSwgMHgwMCwgMHg2OSwKKwkweDAwLCAweEQ0LCAweEZELCAweEQ5LCAweDA1LCAweEYzLCAweEYyLCAweDY5LCAweDIzLCAweDdFLCAweDM5LAorCTB4NUIsIDB4RjcsIDB4MUUsIDB4MDEsIDB4MzYsIDB4MDEsIDB4N0UsIDB4RkUsIDB4RkYsIDB4MDAsIDB4OUIsCisJMHhGRiwgMHgwRSwgMHgwMCwgMHgwNiwgMHgwMCwgMHhDQSwgMHhGRiwgMHg2MywgMHgwMCwgMHhFRiwgMHhGRiwKKwkweDkwLCAweEZFLCAweDBGLCAweDA1LCAweDAyLCAweEYzLCAweDQzLCAweDJBLCAweDQ5LCAweDM0LCAweEVGLAorCTB4RjQsIDB4RUIsIDB4MDIsIDB4MUEsIDB4MDAsIDB4MEUsIDB4RkYsIDB4QzYsIDB4MDAsIDB4QUMsIDB4RkYsCisJMHgwQiwgMHgwMCwgMHgwOSwgMHgwMCwgMHhCNywgMHhGRiwgMHhBMCwgMHgwMCwgMHg2NywgMHhGRiwgMHg3OSwKKwkweEZGLCAweERCLCAweDAzLCAweEVCLCAweEYzLCAweEFBLCAweDMwLCAweDQ1LCAweDJFLCAweDc2LCAweEYzLAorCTB4NUUsIDB4MDQsIDB4MUEsIDB4RkYsIDB4OUQsIDB4RkYsIDB4ODksIDB4MDAsIDB4QkUsIDB4RkYsIDB4MDcsCisJMHgwMCwgMHgwQywgMHgwMCwgMHhBNSwgMHhGRiwgMHhERCwgMHgwMCwgMHhENywgMHhGRSwgMHg4NSwgMHgwMCwKKwkweDQ0LCAweDAyLCAweEMwLCAweEY1LCAweDY2LCAweDM2LCAweEFCLCAweDI3LCAweEUzLCAweEYyLCAweDZBLAorCTB4MDUsIDB4NDIsIDB4RkUsIDB4MjAsIDB4MDAsIDB4NEMsIDB4MDAsIDB4RDEsIDB4RkYsIDB4MDQsIDB4MDAsCisJMHgwRiwgMHgwMCwgMHg5NiwgMHhGRiwgMHgxMywgMHgwMSwgMHg0OCwgMHhGRSwgMHhBNywgMHgwMSwgMHg1OCwKKwkweDAwLCAweDhCLCAweEY4LCAweDNDLCAweDNCLCAweEI0LCAweDIwLCAweDIyLCAweEYzLCAweDBBLCAweDA2LAorCTB4OUEsIDB4RkQsIDB4OTIsIDB4MDAsIDB4MTQsIDB4MDAsIDB4RTMsIDB4RkYsIDB4MDIsIDB4MDAsIDB4MTAsCisJMHgwMCwgMHg4RCwgMHhGRiwgMHgzRiwgMHgwMSwgMHhDNCwgMHhGRCwgMHhDRCwgMHgwMiwgMHgyRSwgMHhGRSwKKwkweDQ5LCAweEZDLCAweDA2LCAweDNGLCAweEExLCAweDE5LCAweDE0LCAweEY0LCAweDQxLCAweDA2LCAweDI3LAorCTB4RkQsIDB4RUQsIDB4MDAsIDB4RTQsIDB4RkYsIDB4RjMsIDB4RkYsIDB4MDEsIDB4MDAsIDB4MTAsIDB4MDAsCisJMHg4QiwgMHhGRiwgMHg1QiwgMHgwMSwgMHg1NywgMHhGRCwgMHhFNiwgMHgwMywgMHhFMCwgMHhGQiwgMHhFRSwKKwkweDAwLCAweDlDLCAweDQxLCAweEFCLCAweDEyLCAweDk4LCAweEY1LCAweDE2LCAweDA2LCAweEVDLCAweEZDLAorCTB4MkYsIDB4MDEsIDB4QkQsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MEUsIDB4MDAsIDB4OTIsCisJMHhGRiwgMHg2NCwgMHgwMSwgMHgwOSwgMHhGRCwgMHhERSwgMHgwNCwgMHg4RSwgMHhGOSwgMHg2NCwgMHgwNiwKKwkweEU2LCAweDQyLCAweDBBLCAweDBDLCAweDg3LCAweEY3LCAweDk0LCAweDA1LCAweEU1LCAweEZDLCAweDU2LAorCTB4MDEsIDB4QTIsIDB4RkYsIDB4MDksIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsCisJMHhBMywgMHhGRiwgMHg1NCwgMHgwMSwgMHhFMywgMHhGQywgMHhBMSwgMHgwNSwgMHg1RSwgMHhGNywgMHg4OCwKKwkweDBDLCAweEQ5LCAweDQyLCAweEYyLCAweDA1LCAweEJCLCAweEY5LCAweENELCAweDA0LCAweDBELCAweEZELAorCTB4NjQsIDB4MDEsIDB4OTEsIDB4RkYsIDB4MEUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4RkYsIDB4RkYsIDB4QzAsCisJMHhGRiwgMHgyQiwgMHgwMSwgMHhFRSwgMHhGQywgMHgxQywgMHgwNiwgMHg3NSwgMHhGNSwgMHgzMiwgMHgxMywKKwkweDc1LCAweDQxLCAweDhCLCAweDAwLCAweDBFLCAweEZDLCAweEQyLCAweDAzLCAweDVFLCAweEZELCAweDVBLAorCTB4MDEsIDB4OEIsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4RjIsIDB4RkYsIDB4RTcsIDB4RkYsCisJMHhFNywgMHgwMCwgMHgyRSwgMHhGRCwgMHg0MSwgMHgwNiwgMHhGQywgMHhGMywgMHgyQywgMHgxQSwgMHhDNiwKKwkweDNFLCAweEY3LCAweEZCLCAweDVBLCAweEZFLCAweEI3LCAweDAyLCAweENFLCAweEZELCAweDNDLCAweDAxLAorCTB4OEQsIDB4RkYsIDB4MTAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4RTIsIDB4RkYsIDB4MTgsIDB4MDAsIDB4OEEsCisJMHgwMCwgMHhBNSwgMHhGRCwgMHgwMiwgMHgwNiwgMHgxNiwgMHhGMywgMHgzRiwgMHgyMSwgMHhFNiwgMHgzQSwKKwkweDRCLCAweEY4LCAweDgxLCAweDAwLCAweDkwLCAweDAxLCAweDUzLCAweEZFLCAweDBGLCAweDAxLCAweDk3LAorCTB4RkYsIDB4MEUsIDB4MDAsIDB4MDUsIDB4MDAsIDB4RDAsIDB4RkYsIDB4NTAsIDB4MDAsIDB4MTcsIDB4MDAsCisJMHg1MSwgMHhGRSwgMHg1OSwgMHgwNSwgMHhFNywgMHhGMiwgMHgzMSwgMHgyOCwgMHhGQiwgMHgzNSwgMHg5MywKKwkweEY1LCAweDY2LCAweDAyLCAweDZGLCAweDAwLCAweEUyLCAweEZFLCAweEQ4LCAweDAwLCAweEE2LCAweEZGLAorCTB4MEMsIDB4MDAsIDB4MDgsIDB4MDAsIDB4QkQsIDB4RkYsIDB4OEQsIDB4MDAsIDB4OTIsIDB4RkYsIDB4MkQsCisJMHhGRiwgMHg0NSwgMHgwNCwgMHg4QiwgMHhGMywgMHhDMSwgMHgyRSwgMHgzMSwgMHgzMCwgMHhEMSwgMHhGMywKKwkweEY2LCAweDAzLCAweDY1LCAweEZGLCAweDcyLCAweEZGLCAweDlCLCAweDAwLCAweEI4LCAweEZGLCAweDA4LAorCTB4MDAsIDB4MEIsIDB4MDAsIDB4QUEsIDB4RkYsIDB4Q0EsIDB4MDAsIDB4MDMsIDB4RkYsIDB4MkYsIDB4MDAsCisJMHhDQiwgMHgwMiwgMHgxNiwgMHhGNSwgMHhCOCwgMHgzNCwgMHhDMCwgMHgyOSwgMHhGOSwgMHhGMiwgMHgyMywKKwkweDA1LCAweDgwLCAweEZFLCAweEY5LCAweEZGLCAweDVFLCAweDAwLCAweENDLCAweEZGLCAweDA1LCAweDAwLAorCTB4MEUsIDB4MDAsIDB4OUEsIDB4RkYsIDB4MDMsIDB4MDEsIDB4NzMsIDB4RkUsIDB4NEMsIDB4MDEsIDB4RjcsCisJMHgwMCwgMHg5NCwgMHhGNywgMHhEQiwgMHgzOSwgMHhERiwgMHgyMiwgMHhGQSwgMHhGMiwgMHhFNSwgMHgwNSwKKwkweEM4LCAweEZELCAweDcxLCAweDAwLCAweDI1LCAweDAwLCAweERFLCAweEZGLCAweDAzLCAweDAwLCAweDEwLAorCTB4MDAsIDB4OEYsIDB4RkYsIDB4MzMsIDB4MDEsIDB4RUIsIDB4RkQsIDB4NzMsIDB4MDIsIDB4REUsIDB4RkUsCisJMHgwOCwgMHhGQiwgMHhGQiwgMHgzRCwgMHhDRSwgMHgxQiwgMHhCOCwgMHhGMywgMHgzQiwgMHgwNiwgMHg0NSwKKwkweEZELCAweEQ0LCAweDAwLCAweEYyLCAweEZGLCAweEVGLCAweEZGLCAweDAxLCAweDAwLCAweDExLCAweDAwLAorCTB4OEEsIDB4RkYsIDB4NTUsIDB4MDEsIDB4NzUsIDB4RkQsIDB4OTIsIDB4MDMsIDB4OTcsIDB4RkMsIDB4NjksCisJMHhGRiwgMHhGMiwgMHg0MCwgMHhDOCwgMHgxNCwgMHgxMywgMHhGNSwgMHgyRCwgMHgwNiwgMHhGOCwgMHhGQywKKwkweDFFLCAweDAxLCAweEM4LCAweEZGLCAweEZDLCAweEZGLCAweDAwLCAweDAwLCAweDBGLCAweDAwLCAweDhGLAorCTB4RkYsIDB4NjQsIDB4MDEsIDB4MUQsIDB4RkQsIDB4OTcsIDB4MDQsIDB4NDMsIDB4RkEsIDB4QTEsIDB4MDQsCisJMHhBNSwgMHg0MiwgMHgwOCwgMHgwRSwgMHhFNiwgMHhGNiwgMHhDNCwgMHgwNSwgMHhFMSwgMHhGQywgMHg0RCwKKwkweDAxLCAweEE5LCAweEZGLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBBLCAweDAwLAorCTB4OUQsIDB4RkYsIDB4NUMsIDB4MDEsIDB4RUEsIDB4RkMsIDB4NkMsIDB4MDUsIDB4MDUsIDB4RjgsIDB4OTQsCisJMHgwQSwgMHgwMywgMHg0MywgMHhDMSwgMHgwNywgMHgwOSwgMHhGOSwgMHgxMCwgMHgwNSwgMHhGQywgMHhGQywKKwkweDYyLCAweDAxLCAweDk1LCAweEZGLCAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweEI2LAorCTB4RkYsIDB4M0IsIDB4MDEsIDB4RTUsIDB4RkMsIDB4RkYsIDB4MDUsIDB4MDIsIDB4RjYsIDB4MTksIDB4MTEsCisJMHgwNiwgMHg0MiwgMHgxRiwgMHgwMiwgMHg1NiwgMHhGQiwgMHgyMywgMHgwNCwgMHg0MSwgMHhGRCwgMHg1RiwKKwkweDAxLCAweDhCLCAweEZGLCAweDEwLCAweDAwLCAweDAxLCAweDAwLCAweEY2LCAweEZGLCAweERBLCAweEZGLAorCTB4RkYsIDB4MDAsIDB4MTUsIDB4RkQsIDB4NDAsIDB4MDYsIDB4NjIsIDB4RjQsIDB4MDEsIDB4MTgsIDB4QkIsCisJMHgzRiwgMHg0NywgMHhGRCwgMHhBOCwgMHhGRCwgMHgxMCwgMHgwMywgMHhBOSwgMHhGRCwgMHg0NywgMHgwMSwKKwkweDhDLCAweEZGLCAweDExLCAweDAwLCAweDAyLCAweDAwLCAweEU3LCAweEZGLCAweDA4LCAweDAwLCAweEE5LAorCTB4MDAsIDB4N0IsIDB4RkQsIDB4MjAsIDB4MDYsIDB4NEIsIDB4RjMsIDB4MTMsIDB4MUYsIDB4MzYsIDB4M0MsCisJMHg1MiwgMHhGOSwgMHhERCwgMHhGRiwgMHhFQiwgMHgwMSwgMHgyOCwgMHhGRSwgMHgxRiwgMHgwMSwgMHg5MywKKwkweEZGLCAweDBGLCAweDAwLCAweDA0LCAweDAwLCAweEQ2LCAweEZGLCAweDNGLCAweDAwLCAweDNDLCAweDAwLAorCTB4MTYsIDB4RkUsIDB4OTgsIDB4MDUsIDB4RTAsIDB4RjIsIDB4MTYsIDB4MjYsIDB4OTksIDB4MzcsIDB4NEYsCisJMHhGNiwgMHhEOSwgMHgwMSwgMHhDNiwgMHgwMCwgMHhCNSwgMHhGRSwgMHhFQSwgMHgwMCwgMHhBMSwgMHhGRiwKKwkweDBELCAweDAwLCAweDA3LCAweDAwLCAweEMzLCAweEZGLCAweDdBLCAweDAwLCAweEJDLCAweEZGLCAweEU0LAorCTB4RkUsIDB4QTUsIDB4MDQsIDB4NDEsIDB4RjMsIDB4Q0EsIDB4MkMsIDB4MEUsIDB4MzIsIDB4NDIsIDB4RjQsCisJMHg4NSwgMHgwMywgMHhCNCwgMHhGRiwgMHg0NiwgMHhGRiwgMHhBRSwgMHgwMCwgMHhCMywgMHhGRiwgMHgwOSwKKwkweDAwLCAweDBBLCAweDAwLCAweEIwLCAweEZGLCAweEI4LCAweDAwLCAweDMwLCAweEZGLCAweERDLCAweEZGLAorCTB4NDksIDB4MDMsIDB4ODMsIDB4RjQsIDB4RjUsIDB4MzIsIDB4QzksIDB4MkIsIDB4MjMsIDB4RjMsIDB4RDEsCisJMHgwNCwgMHhDMiwgMHhGRSwgMHhEMSwgMHhGRiwgMHg3MSwgMHgwMCwgMHhDNiwgMHhGRiwgMHgwNiwgMHgwMCwKKwkweDBELCAweDAwLCAweDlGLCAweEZGLCAweEYzLCAweDAwLCAweDlGLCAweEZFLCAweEYzLCAweDAwLCAweDkwLAorCTB4MDEsIDB4QjYsIDB4RjYsIDB4NUYsIDB4MzgsIDB4MDQsIDB4MjUsIDB4RTQsIDB4RjIsIDB4QjQsIDB4MDUsCisJMHhGQiwgMHhGRCwgMHg0RSwgMHgwMCwgMHgzNiwgMHgwMCwgMHhEOSwgMHhGRiwgMHgwNCwgMHgwMCwgMHgwRiwKKwkweDAwLCAweDkyLCAweEZGLCAweDI2LCAweDAxLCAweDEzLCAweEZFLCAweDE4LCAweDAyLCAweDg5LCAweEZGLAorCTB4REYsIDB4RjksIDB4RDMsIDB4M0MsIDB4RkMsIDB4MUQsIDB4NkIsIDB4RjMsIDB4MkMsIDB4MDYsIDB4NjcsCisJMHhGRCwgMHhCOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhFQSwgMHhGRiwgMHgwMiwgMHgwMCwgMHgxMSwgMHgwMCwKKwkweDhCLCAweEZGLCAweDRDLCAweDAxLCAweDk3LCAweEZELCAweDNDLCAweDAzLCAweDRELCAweEZELCAweEY4LAorCTB4RkQsIDB4MkEsIDB4NDAsIDB4RUQsIDB4MTYsIDB4OUEsIDB4RjQsIDB4M0MsIDB4MDYsIDB4MEEsIDB4RkQsCisJMHgwQSwgMHgwMSwgMHhENCwgMHhGRiwgMHhGOCwgMHhGRiwgMHgwMSwgMHgwMCwgMHgxMCwgMHgwMCwgMHg4QywKKwkweEZGLCAweDYxLCAweDAxLCAweDM0LCAweEZELCAweDRCLCAweDA0LCAweEZBLCAweEZBLCAweEYxLCAweDAyLAorCTB4NDIsIDB4NDIsIDB4MTEsIDB4MTAsIDB4NEMsIDB4RjYsIDB4RUQsIDB4MDUsIDB4RTMsIDB4RkMsIDB4NDEsCisJMHgwMSwgMHhCMSwgMHhGRiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwQywgMHgwMCwgMHg5NywgMHhGRiwKKwkweDYxLCAweDAxLCAweEY1LCAweEZDLCAweDMwLCAweDA1LCAweEIxLCAweEY4LCAweEFFLCAweDA4LCAweDBBLAorCTB4NDMsIDB4OUYsIDB4MDksIDB4NUEsIDB4RjgsIDB4NEYsIDB4MDUsIDB4RUYsIDB4RkMsIDB4NUYsIDB4MDEsCisJMHg5QSwgMHhGRiwgMHgwQiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNSwgMHgwMCwgMHhBRCwKKwkweEZGLCAweDQ4LCAweDAxLCAweEUyLCAweEZDLCAweERBLCAweDA1LCAweDk3LCAweEY2LCAweDBCLCAweDBGLAorCTB4NzksIDB4NDIsIDB4QzcsIDB4MDMsIDB4OUUsIDB4RkEsIDB4NzEsIDB4MDQsIDB4MjgsIDB4RkQsIDB4NjMsCisJMHgwMSwgMHg4RCwgMHhGRiwgMHgwRiwgMHgwMCAKK307CisKK3N0YXRpYyB1MTYKK0NvZWZmaWNpZW50U2l6ZXNbXSA9IHsKKyAgICAvKiBQbGF5YmFjayAqLworICAgIDB4MDBDMCwgMHg1MDAwLCAweDAwNjAsIDB4MjgwMCwgMHgwMDQwLCAweDAwNjAsIDB4MTQwMCwgMHgwMDAwLAorICAgIC8qIFJlY29yZCAqLworICAgIDB4MDAyMCwgMHgxMjYwLCAweDAwMjAsIDB4MTI2MCwgMHgwMDAwLCAweDAwNDAsIDB4MTI2MCwgMHgwMDAwLAorfTsKKworI2lmbmRlZiBKVVNUX0RBVEEKKworc3RhdGljIHUxNgorbm0yNTZfZ2V0U3RhcnRPZmZzZXQgKHU4IHdoaWNoKQoreworICAgIHUxNiBvZmZzZXQgPSAwOworCisgICAgd2hpbGUgKHdoaWNoLS0gPiAwKQorCW9mZnNldCArPSBDb2VmZmljaWVudFNpemVzW3doaWNoXTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3N0YXRpYyB2b2lkCitubTI1Nl9sb2FkT25lQ29lZmZpY2llbnQgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkLCBpbnQgZGV2bnVtLCB1MzIgcG9ydCwgCisJCQkgIHUxNiB3aGljaCkKK3sKKyAgICB1MzIgY29lZmZCdWYgPSAod2hpY2ggPCA4KSA/IGNhcmQtPmNvZWZmQnVmIDogY2FyZC0+YWxsQ29lZmZCdWY7CisgICAgdTE2IG9mZnNldCA9IG5tMjU2X2dldFN0YXJ0T2Zmc2V0ICh3aGljaCk7CisgICAgdTE2IHNpemUgPSBDb2VmZmljaWVudFNpemVzW3doaWNoXTsKKworICAgIGNhcmQtPmNvZWZmc0N1cnJlbnQgPSAwOworCisgICAgaWYgKG5tMjU2X2RlYnVnKQorCXByaW50ayAoS0VSTl9JTkZPICJOTTI1NjogTG9hZGluZyBjb2VmZmljaWVudCBidWZmZXIgMHgleC0weCV4IHdpdGggY29lZmZpY2llbnQgJWQsIHNpemUgJWQsIHBvcnQgMHgleFxuIiwKKwkJY29lZmZCdWYsIGNvZWZmQnVmICsgc2l6ZSAtIDEsIHdoaWNoLCBzaXplLCBwb3J0KTsKKyAgICBubTI1Nl93cml0ZUJ1ZmZlcjggKGNhcmQsIGNvZWZmaWNpZW50cyArIG9mZnNldCwgMSwgY29lZmZCdWYsIHNpemUpOworICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBwb3J0ICsgMCwgY29lZmZCdWYpOworICAgIC8qID8/PyAgUmVjb3JkIHNlZW1zIHRvIGJlaGF2ZSBkaWZmZXJlbnRseSB0aGFuIHBsYXliYWNrLiAgKi8KKyAgICBpZiAoZGV2bnVtID09IDApCisJc2l6ZS0tOworICAgIG5tMjU2X3dyaXRlUG9ydDMyIChjYXJkLCAyLCBwb3J0ICsgNCwgY29lZmZCdWYgKyBzaXplKTsKK30KKworc3RhdGljIHZvaWQKK25tMjU2X2xvYWRBbGxDb2VmZmljaWVudHMgKHN0cnVjdCBubTI1Nl9pbmZvICpjYXJkKQoreworICAgIG5tMjU2X3dyaXRlQnVmZmVyOCAoY2FyZCwgY29lZmZpY2llbnRzLCAxLCBjYXJkLT5hbGxDb2VmZkJ1ZiwKKwkJCSAgTk1fVE9UQUxfQ09FRkZfQ09VTlQgKiA0KTsKKyAgICBjYXJkLT5jb2VmZnNDdXJyZW50ID0gMTsKK30KKwordm9pZAorbm0yNTZfbG9hZENvZWZmaWNpZW50IChzdHJ1Y3Qgbm0yNTZfaW5mbyAqY2FyZCwgaW50IHdoaWNoLCBpbnQgbnVtYmVyKQoreworICAgIHN0YXRpYyB1MTYgYWRkcnNbM10gPSB7IDB4MWMsIDB4MjFjLCAweDQwOCB9OworICAgIC8qIFRoZSBlbmFibGUgcmVnaXN0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgZW5naW5lLiAgKi8KKyAgICB1MzIgcG9mZnNldCA9ICh3aGljaCA9PSAxID8gMHgyMDAgOiAxKTsKKworICAgIGlmIChubTI1Nl9yZWFkUG9ydDggKGNhcmQsIDIsIHBvZmZzZXQpICYgMSkgeworCXByaW50ayAoS0VSTl9FUlIgIk5NMjU2OiBFbmdpbmUgd2FzIGVuYWJsZWQgd2hpbGUgbG9hZGluZyBjb2VmZmljaWVudHMhXG4iKTsKKwlyZXR1cm47CisgICAgfQorCisgICAgLyogVGhlIHJlY29yZGluZyBlbmdpbmUgdXNlcyBjb2VmZmljaWVudCB2YWx1ZXMgOC0xNS4gICovCisgICAgaWYgKHdoaWNoID09IDEpCisJbnVtYmVyICs9IDg7CisKKyAgICBpZiAoISBubTI1Nl9jYWNoZWRDb2VmZmljaWVudHMgKGNhcmQpKQorCW5tMjU2X2xvYWRPbmVDb2VmZmljaWVudCAoY2FyZCwgd2hpY2gsIGFkZHJzW3doaWNoXSwgbnVtYmVyKTsKKyAgICBlbHNlIHsKKwl1MzIgYmFzZSA9IGNhcmQtPmFsbENvZWZmQnVmOworCXUzMiBvZmZzZXQgPSBubTI1Nl9nZXRTdGFydE9mZnNldCAobnVtYmVyKTsKKwl1MzIgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgQ29lZmZpY2llbnRTaXplc1tudW1iZXJdOworCisJaWYgKG5tMjU2X2RlYnVnKQorCSAgICBwcmludGsgKEtFUk5fREVCVUcgImxvYWRpbmcgY29lZmZpY2llbnQgJWQgYXQgcG9ydCAweCV4LCBvZmZzZXQgJWQgKDB4JXgtMHgleClcbiIsCisJCSAgICBudW1iZXIsIGFkZHJzW3doaWNoXSwgb2Zmc2V0LCBiYXNlICsgb2Zmc2V0LAorCQkgICAgYmFzZSArIGVuZE9mZnNldCAtIDEpOworCisJaWYgKCEgY2FyZC0+Y29lZmZzQ3VycmVudCkKKwkgICAgbm0yNTZfbG9hZEFsbENvZWZmaWNpZW50cyAoY2FyZCk7CisKKwlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgYWRkcnNbd2hpY2hdLCBiYXNlICsgb2Zmc2V0KTsKKwlubTI1Nl93cml0ZVBvcnQzMiAoY2FyZCwgMiwgYWRkcnNbd2hpY2hdICsgNCwgYmFzZSArIGVuZE9mZnNldCAtIDEpOworICAgIH0KK30KKworI2VuZGlmIC8qIEpVU1RfREFUQSAqLworCisjZW5kaWYKKwwKKy8qCisgKiBMb2NhbCB2YXJpYWJsZXM6CisgKiAgYy1iYXNpYy1vZmZzZXQ6IDQKKyAqIEVuZDoKKyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL29wbDMuYyBiL3NvdW5kL29zcy9vcGwzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxNzM0YgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9vcGwzLmMKQEAgLTAsMCArMSwxMjU3IEBACisvKgorICogc291bmQvb3BsMy5jCisgKgorICogQSBsb3cgbGV2ZWwgZHJpdmVyIGZvciBZYW1haGEgWU0zODEyIGFuZCBPUEwtMyAtY2hpcHMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICoKKyAqIENoYW5nZXMKKyAqCVRob21hcyBTYWlsZXIgICAJaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICoJQWxhbiBDb3gJCW1vZHVsYXJpc2F0aW9uLCBmaXhlZCBzb3VuZF9tZW0gYWxsb2NzLgorICoJQ2hyaXN0b3BoIEhlbGx3aWcJQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdAorICoJQXJuYWxkbyBDLiBkZSBNZWxvCWdldCByaWQgb2YgY2hlY2tfcmVnaW9uLCB1c2UgcmVxdWVzdF9yZWdpb24gZm9yCisgKgkJCQlPUEw0LCByZWxlYXNlIGl0IG9uIGV4aXQsIHNvbWUgY2xlYW51cHMuCisgKgorICogU3RhdHVzCisgKglCZWxpZXZlZCB0byB3b3JrLiBCYWRseSBuZWVkcyByZXdyaXRpbmcgYSBiaXQgdG8gc3VwcG9ydCBtdWx0aXBsZQorICoJT1BMMyBkZXZpY2VzLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworLyoKKyAqIE1ham9yIGltcHJvdmVtZW50cyB0byB0aGUgRk0gaGFuZGxpbmcgMzBBVUc5MiBieSBSb2IgSG9vZnQsCisgKiBob29mdEBjaGVtLnJ1dS5ubAorICovCisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgIm9wbDMuaCIKKyNpbmNsdWRlICJvcGwzX2h3LmgiCisKKyNkZWZpbmUgTUFYX1ZPSUNFCTE4CisjZGVmaW5lIE9GRlNfNE9QCTExCisKK3N0cnVjdCB2b2ljZV9pbmZvCit7CisJdW5zaWduZWQgY2hhciAgIGtleW9uX2J5dGU7CisJbG9uZyAgICAgICAgICAgIGJlbmRlcjsKKwlsb25nICAgICAgICAgICAgYmVuZGVyX3JhbmdlOworCXVuc2lnbmVkIGxvbmcgICBvcmlnX2ZyZXE7CisJdW5zaWduZWQgbG9uZyAgIGN1cnJlbnRfZnJlcTsKKwlpbnQgICAgICAgICAgICAgdm9sdW1lOworCWludCAgICAgICAgICAgICBtb2RlOworCWludCAgICAgICAgICAgICBwYW5uaW5nOwkvKiAweGZmZmYgbWVhbnMgbm90IHNldCAqLworfTsKKwordHlwZWRlZiBzdHJ1Y3Qgb3BsX2RldmluZm8KK3sKKwlpbnQgICAgICAgICAgICAgYmFzZTsKKwlpbnQgICAgICAgICAgICAgbGVmdF9pbywgcmlnaHRfaW87CisJaW50ICAgICAgICAgICAgIG5yX3ZvaWNlOworCWludCAgICAgICAgICAgICBsdl9tYXBbTUFYX1ZPSUNFXTsKKworCXN0cnVjdCB2b2ljZV9pbmZvIHZvY1tNQVhfVk9JQ0VdOworCXN0cnVjdCB2b2ljZV9hbGxvY19pbmZvICp2X2FsbG9jOworCXN0cnVjdCBjaGFubmVsX2luZm8gKmNobl9pbmZvOworCisJc3RydWN0IHNiaV9pbnN0cnVtZW50IGlfbWFwW1NCRk1fTUFYSU5TVFJdOworCXN0cnVjdCBzYmlfaW5zdHJ1bWVudCAqYWN0X2lbTUFYX1ZPSUNFXTsKKworCXN0cnVjdCBzeW50aF9pbmZvIGZtX2luZm87CisKKwlpbnQgICAgICAgICAgICAgYnVzeTsKKwlpbnQgICAgICAgICAgICAgbW9kZWw7CisJdW5zaWduZWQgY2hhciAgIGNtYXNrOworCisJaW50ICAgICAgICAgICAgIGlzX29wbDQ7CisJaW50ICAgICAgICAgICAgKm9zcDsKK30gb3BsX2RldmluZm87CisKK3N0YXRpYyBzdHJ1Y3Qgb3BsX2RldmluZm8gKmRldmMgPSBOVUxMOworCitzdGF0aWMgaW50ICAgICAgZGV0ZWN0ZWRfbW9kZWw7CisKK3N0YXRpYyBpbnQgICAgICBzdG9yZV9pbnN0cihpbnQgaW5zdHJfbm8sIHN0cnVjdCBzYmlfaW5zdHJ1bWVudCAqaW5zdHIpOworc3RhdGljIHZvaWQgICAgIGZyZXFfdG9fZm51bShpbnQgZnJlcSwgaW50ICpibG9jaywgaW50ICpmbnVtKTsKK3N0YXRpYyB2b2lkICAgICBvcGwzX2NvbW1hbmQoaW50IGlvX2FkZHIsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgdmFsKTsKK3N0YXRpYyBpbnQgICAgICBvcGwzX2tpbGxfbm90ZShpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBub3RlLCBpbnQgdmVsb2NpdHkpOworCitzdGF0aWMgdm9pZCBlbnRlcl80b3BfbW9kZSh2b2lkKQoreworCWludCBpOworCXN0YXRpYyBpbnQgdjRvcFtNQVhfVk9JQ0VdID0geworCQkwLCAxLCAyLCA5LCAxMCwgMTEsIDYsIDcsIDgsIDE1LCAxNiwgMTcKKwl9OworCisJZGV2Yy0+Y21hc2sgPSAweDNmOwkvKiBDb25uZWN0IGFsbCBwb3NzaWJsZSA0IE9QIHZvaWNlIG9wZXJhdG9ycyAqLworCW9wbDNfY29tbWFuZChkZXZjLT5yaWdodF9pbywgQ09OTkVDVElPTl9TRUxFQ1RfUkVHSVNURVIsIDB4M2YpOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykKKwkJcHZfbWFwW2ldLnZvaWNlX21vZGUgPSA0OworCWZvciAoaSA9IDM7IGkgPCA2OyBpKyspCisJCXB2X21hcFtpXS52b2ljZV9tb2RlID0gMDsKKworCWZvciAoaSA9IDk7IGkgPCAxMjsgaSsrKQorCQlwdl9tYXBbaV0udm9pY2VfbW9kZSA9IDQ7CisJZm9yIChpID0gMTI7IGkgPCAxNTsgaSsrKQorCQlwdl9tYXBbaV0udm9pY2VfbW9kZSA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykKKwkJZGV2Yy0+bHZfbWFwW2ldID0gdjRvcFtpXTsKKwlkZXZjLT52X2FsbG9jLT5tYXhfdm9pY2UgPSBkZXZjLT5ucl92b2ljZSA9IDEyOworfQorCitzdGF0aWMgaW50IG9wbDNfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCit7CisJc3RydWN0IHNiaV9pbnN0cnVtZW50IGluczsKKwkKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIFNORENUTF9GTV9MT0FEX0lOU1RSOgorCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2FybmluZzogT2Jzb2xldGUgaW9jdGwoU05EQ1RMX0ZNX0xPQURfSU5TVFIpIHVzZWQuIEZpeCB0aGUgcHJvZ3JhbS5cbiIpOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZpbnMsIGFyZywgc2l6ZW9mKGlucykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKGlucy5jaGFubmVsIDwgMCB8fCBpbnMuY2hhbm5lbCA+PSBTQkZNX01BWElOU1RSKSB7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiRk0gRXJyb3I6IEludmFsaWQgaW5zdHJ1bWVudCBudW1iZXIgJWRcbiIsIGlucy5jaGFubmVsKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXJldHVybiBzdG9yZV9pbnN0cihpbnMuY2hhbm5lbCwgJmlucyk7CisKKwkJY2FzZSBTTkRDVExfU1lOVEhfSU5GTzoKKwkJCWRldmMtPmZtX2luZm8ubnJfdm9pY2VzID0gKGRldmMtPm5yX3ZvaWNlID09IDEyKSA/IDYgOiBkZXZjLT5ucl92b2ljZTsKKwkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZGV2Yy0+Zm1faW5mbywgc2l6ZW9mKGRldmMtPmZtX2luZm8pKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1NZTlRIX01FTUFWTDoKKwkJCXJldHVybiAweDdmZmZmZmZmOworCisJCWNhc2UgU05EQ1RMX0ZNXzRPUF9FTkFCTEU6CisJCQlpZiAoZGV2Yy0+bW9kZWwgPT0gMikKKwkJCQllbnRlcl80b3BfbW9kZSgpOworCQkJcmV0dXJuIDA7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworaW50IG9wbDNfZGV0ZWN0KGludCBpb2FkZHIsIGludCAqb3NwKQoreworCS8qCisJICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIDEgaWYgdGhlIEZNIGNoaXAgaXMgcHJlc2VudCBhdCB0aGUgZ2l2ZW4gSS9PIHBvcnQKKwkgKiBUaGUgZGV0ZWN0aW9uIGFsZ29yaXRobSBwbGF5cyB3aXRoIHRoZSB0aW1lciBidWlsdCBpbiB0aGUgRk0gY2hpcCBhbmQKKwkgKiBsb29rcyBmb3IgYSBjaGFuZ2UgaW4gdGhlIHN0YXR1cyByZWdpc3Rlci4KKwkgKgorCSAqIE5vdGUhIFRoZSB0aW1lcnMgb2YgdGhlIEZNIGNoaXAgYXJlIG5vdCBjb25uZWN0ZWQgdG8gQWRMaWIgKGFuZCBjb21wYXRpYmxlKQorCSAqIGJvYXJkcy4KKwkgKgorCSAqIE5vdGUyISBUaGUgY2hpcCBpcyBpbml0aWFsaXplZCBpZiBkZXRlY3RlZC4KKwkgKi8KKworCXVuc2lnbmVkIGNoYXIgc3RhdDEsIHNpZ25hdHVyZTsKKwlpbnQgaTsKKworCWlmIChkZXZjICE9IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9FUlIgIm9wbDM6IE9ubHkgb25lIE9QTDMgc3VwcG9ydGVkLlxuIik7CisJCXJldHVybiAwOworCX0KKworCWRldmMgPSAoc3RydWN0IG9wbF9kZXZpbmZvICopa21hbGxvYyhzaXplb2YoKmRldmMpLCBHRlBfS0VSTkVMKTsKKworCWlmIChkZXZjID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9FUlIgIm9wbDM6IENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3IgdGhlIGRldmljZSBjb250cm9sICIKKwkJCSJzdHJ1Y3R1cmUgXG4gIik7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChkZXZjLCAwLCBzaXplb2YoKmRldmMpKTsKKwlzdHJjcHkoZGV2Yy0+Zm1faW5mby5uYW1lLCAiT1BMMiIpOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpb2FkZHIsIDQsIGRldmMtPmZtX2luZm8ubmFtZSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAib3BsMzogSS9PIHBvcnQgMHgleCBhbHJlYWR5IGluIHVzZVxuIiwgaW9hZGRyKTsKKwkJZ290byBjbGVhbnVwX2RldmM7CisJfQorCisJZGV2Yy0+b3NwID0gb3NwOworCWRldmMtPmJhc2UgPSBpb2FkZHI7CisKKwkvKiBSZXNldCB0aW1lcnMgMSBhbmQgMiAqLworCW9wbDNfY29tbWFuZChpb2FkZHIsIFRJTUVSX0NPTlRST0xfUkVHSVNURVIsIFRJTUVSMV9NQVNLIHwgVElNRVIyX01BU0spOworCisJLyogUmVzZXQgdGhlIElSUSBvZiB0aGUgRk0gY2hpcCAqLworCW9wbDNfY29tbWFuZChpb2FkZHIsIFRJTUVSX0NPTlRST0xfUkVHSVNURVIsIElSUV9SRVNFVCk7CisKKwlzaWduYXR1cmUgPSBzdGF0MSA9IGluYihpb2FkZHIpOwkvKiBTdGF0dXMgcmVnaXN0ZXIgKi8KKworCWlmIChzaWduYXR1cmUgIT0gMHgwMCAmJiBzaWduYXR1cmUgIT0gMHgwNiAmJiBzaWduYXR1cmUgIT0gMHgwMiAmJgorCQlzaWduYXR1cmUgIT0gMHgwZikKKwl7CisJCU1EQihwcmludGsoS0VSTl9JTkZPICJPUEwzIG5vdCBkZXRlY3RlZCAleFxuIiwgc2lnbmF0dXJlKSk7CisJCWdvdG8gY2xlYW51cF9yZWdpb247CisJfQorCisJaWYgKHNpZ25hdHVyZSA9PSAweDA2KQkJLyogT1BMMiAqLworCXsKKwkJZGV0ZWN0ZWRfbW9kZWwgPSAyOworCX0KKwllbHNlIGlmIChzaWduYXR1cmUgPT0gMHgwMCB8fCBzaWduYXR1cmUgPT0gMHgwZikJLyogT1BMMyBvciBPUEw0ICovCisJeworCQl1bnNpZ25lZCBjaGFyIHRtcDsKKworCQlkZXRlY3RlZF9tb2RlbCA9IDM7CisKKwkJLyoKKwkJICogRGV0ZWN0IGF2YWlsYWJpbGl0eSBvZiBPUEw0IChfZXhwZXJpbWVudGFsXykuIFdvcmtzIHByb2JhYmx5CisJCSAqIG9ubHkgYWZ0ZXIgYSBjb2xkIGJvb3QuIEluIGFkZGl0aW9uIHRoZSBPUEw0IHBvcnQKKwkJICogb2YgdGhlIGNoaXAgbWF5IG5vdCBiZSBjb25uZWN0ZWQgdG8gdGhlIFBDIGJ1cyBhdCBhbGwuCisJCSAqLworCisJCW9wbDNfY29tbWFuZChpb2FkZHIgKyAyLCBPUEwzX01PREVfUkVHSVNURVIsIDB4MDApOworCQlvcGwzX2NvbW1hbmQoaW9hZGRyICsgMiwgT1BMM19NT0RFX1JFR0lTVEVSLCBPUEwzX0VOQUJMRSB8IE9QTDRfRU5BQkxFKTsKKworCQlpZiAoKHRtcCA9IGluYihpb2FkZHIpKSA9PSAweDAyKQkvKiBIYXZlIGEgT1BMNCAqLworCQl7CisJCQlkZXRlY3RlZF9tb2RlbCA9IDQ7CisJCX0KKworCQlpZiAocmVxdWVzdF9yZWdpb24oaW9hZGRyIC0gOCwgMiwgIk9QTDQiKSkJLyogT1BMNCBwb3J0IHdhcyBmcmVlICovCisJCXsKKwkJCWludCB0bXA7CisKKwkJCW91dGIoKDB4MDIpLCBpb2FkZHIgLSA4KTsJLyogU2VsZWN0IE9QTDQgSUQgcmVnaXN0ZXIgKi8KKwkJCXVkZWxheSgxMCk7CisJCQl0bXAgPSBpbmIoaW9hZGRyIC0gNyk7CQkvKiBSZWFkIGl0ICovCisJCQl1ZGVsYXkoMTApOworCisJCQlpZiAodG1wID09IDB4MjApCS8qIE9QTDQgc2hvdWxkIHJldHVybiAweDIwIGhlcmUgKi8KKwkJCXsKKwkJCQlkZXRlY3RlZF9tb2RlbCA9IDQ7CisJCQkJb3V0YigoMHhGOCksIGlvYWRkciAtIDgpOwkvKiBTZWxlY3QgT1BMNCBGTSBtaXhlciBjb250cm9sICovCisJCQkJdWRlbGF5KDEwKTsKKwkJCQlvdXRiKCgweDFCKSwgaW9hZGRyIC0gNyk7CS8qIFdyaXRlIHZhbHVlICovCisJCQkJdWRlbGF5KDEwKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsgLyogcmVsZWFzZSBPUEw0IHBvcnQgKi8KKwkJCQlyZWxlYXNlX3JlZ2lvbihpb2FkZHIgLSA4LCAyKTsKKwkJCQlkZXRlY3RlZF9tb2RlbCA9IDM7CisJCQl9CisJCX0KKwkJb3BsM19jb21tYW5kKGlvYWRkciArIDIsIE9QTDNfTU9ERV9SRUdJU1RFUiwgMCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCA5OyBpKyspCisJCW9wbDNfY29tbWFuZChpb2FkZHIsIEtFWU9OX0JMT0NLICsgaSwgMCk7CS8qCisJCQkJCQkJCSAqIE5vdGUgb2ZmCisJCQkJCQkJCSAqLworCisJb3BsM19jb21tYW5kKGlvYWRkciwgVEVTVF9SRUdJU1RFUiwgRU5BQkxFX1dBVkVfU0VMRUNUKTsKKwlvcGwzX2NvbW1hbmQoaW9hZGRyLCBQRVJDT1NTSU9OX1JFR0lTVEVSLCAweDAwKTsJLyoKKwkJCQkJCQkJICogTWVsb2RpYyBtb2RlLgorCQkJCQkJCQkgKi8KKwlyZXR1cm4gMTsKK2NsZWFudXBfcmVnaW9uOgorCXJlbGVhc2VfcmVnaW9uKGlvYWRkciwgNCk7CitjbGVhbnVwX2RldmM6CisJa2ZyZWUoZGV2Yyk7CisJZGV2YyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BsM19raWxsX25vdGUgIChpbnQgZGV2bm8sIGludCB2b2ljZSwgaW50IG5vdGUsIGludCB2ZWxvY2l0eSkKK3sKKwkgc3RydWN0IHBoeXNpY2FsX3ZvaWNlX2luZm8gKm1hcDsKKworCSBpZiAodm9pY2UgPCAwIHx8IHZvaWNlID49IGRldmMtPm5yX3ZvaWNlKQorCQkgcmV0dXJuIDA7CisKKwkgZGV2Yy0+dl9hbGxvYy0+bWFwW3ZvaWNlXSA9IDA7CisKKwkgbWFwID0gJnB2X21hcFtkZXZjLT5sdl9tYXBbdm9pY2VdXTsKKwkgREVCKHByaW50aygiS2lsbCBub3RlICVkXG4iLCB2b2ljZSkpOworCisJIGlmIChtYXAtPnZvaWNlX21vZGUgPT0gMCkKKwkJIHJldHVybiAwOworCisJIG9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS0VZT05fQkxPQ0sgKyBtYXAtPnZvaWNlX251bSwgZGV2Yy0+dm9jW3ZvaWNlXS5rZXlvbl9ieXRlICYgfjB4MjApOworCSBkZXZjLT52b2Nbdm9pY2VdLmtleW9uX2J5dGUgPSAwOworCSBkZXZjLT52b2Nbdm9pY2VdLmJlbmRlciA9IDA7CisJIGRldmMtPnZvY1t2b2ljZV0udm9sdW1lID0gNjQ7CisJIGRldmMtPnZvY1t2b2ljZV0ucGFubmluZyA9IDB4ZmZmZjsJLyogTm90IHNldCAqLworCSBkZXZjLT52b2Nbdm9pY2VdLmJlbmRlcl9yYW5nZSA9IDIwMDsKKwkgZGV2Yy0+dm9jW3ZvaWNlXS5vcmlnX2ZyZXEgPSAwOworCSBkZXZjLT52b2Nbdm9pY2VdLmN1cnJlbnRfZnJlcSA9IDA7CisJIGRldmMtPnZvY1t2b2ljZV0ubW9kZSA9IDA7CisJIHJldHVybiAwOworfQorCisjZGVmaW5lIEhJSEFUCQkJMAorI2RlZmluZSBDWU1CQUwJCQkxCisjZGVmaW5lIFRPTVRPTQkJCTIKKyNkZWZpbmUgU05BUkUJCQkzCisjZGVmaW5lIEJEUlVNCQkJNAorI2RlZmluZSBVTkRFRklORUQJCVRPTVRPTQorI2RlZmluZSBERUZBVUxUCQkJVE9NVE9NCisKK3N0YXRpYyBpbnQgc3RvcmVfaW5zdHIoaW50IGluc3RyX25vLCBzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgKmluc3RyKQoreworCWlmIChpbnN0ci0+a2V5ICE9IEZNX1BBVENIICYmIChpbnN0ci0+a2V5ICE9IE9QTDNfUEFUQ0ggfHwgZGV2Yy0+bW9kZWwgIT0gMikpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZNIHdhcm5pbmc6IEludmFsaWQgcGF0Y2ggZm9ybWF0IGZpZWxkIChrZXkpIDB4JXhcbiIsIGluc3RyLT5rZXkpOworCW1lbWNweSgoY2hhciAqKSAmKGRldmMtPmlfbWFwW2luc3RyX25vXSksIChjaGFyICopIGluc3RyLCBzaXplb2YoKmluc3RyKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BsM19zZXRfaW5zdHIgIChpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBpbnN0cl9ubykKK3sKKwlpZiAodm9pY2UgPCAwIHx8IHZvaWNlID49IGRldmMtPm5yX3ZvaWNlKQorCQlyZXR1cm4gMDsKKwlpZiAoaW5zdHJfbm8gPCAwIHx8IGluc3RyX25vID49IFNCRk1fTUFYSU5TVFIpCisJCWluc3RyX25vID0gMDsJLyogQWNvdXN0aWMgcGlhbm8gKHVzdWFsbHkpICovCisKKwlkZXZjLT5hY3RfaVt2b2ljZV0gPSAmZGV2Yy0+aV9tYXBbaW5zdHJfbm9dOworCXJldHVybiAwOworfQorCisvKgorICogVGhlIG5leHQgdGFibGUgbG9va3MgbWFnaWNhbCwgYnV0IGl0IGNlcnRhaW5seSBpcyBub3QuIEl0cyB2YWx1ZXMgaGF2ZQorICogYmVlbiBjYWxjdWxhdGVkIGFzIHRhYmxlW2ldPTgqbG9nKGkvNjQpL2xvZygyKSB3aXRoIGFuIG9idmlvdXMgZXhjZXB0aW9uCisgKiBmb3IgaT0wLiBUaGlzIGxvZy10YWJsZSBjb252ZXJ0cyBhIGxpbmVhciB2b2x1bWUtc2NhbGluZyAoMC4uMTI3KSB0byBhCisgKiBsb2dhcml0aG1pYyBzY2FsaW5nIGFzIHByZXNlbnQgaW4gdGhlIEZNLXN5bnRoZXNpemVyIGNoaXBzLiBzbyA6ICAgIFZvbHVtZQorICogNjQgPSAgMCBkYiA9IHJlbGF0aXZlIHZvbHVtZSAgMCBhbmQ6ICAgIFZvbHVtZSAzMiA9IC02IGRiID0gcmVsYXRpdmUKKyAqIHZvbHVtZSAtOCBpdCB3YXMgaW1wbGVtZW50ZWQgYXMgYSB0YWJsZSBiZWNhdXNlIGl0IGlzIG9ubHkgMTI4IGJ5dGVzIGFuZAorICogaXQgc2F2ZXMgYSBsb3Qgb2YgbG9nKCkgY2FsY3VsYXRpb25zLiAoUkgpCisgKi8KKworc3RhdGljIGNoYXIgZm1fdm9sdW1lX3RhYmxlWzEyOF0gPQoreworCS02NCwgLTQ4LCAtNDAsIC0zNSwgLTMyLCAtMjksIC0yNywgLTI2LAorCS0yNCwgLTIzLCAtMjEsIC0yMCwgLTE5LCAtMTgsIC0xOCwgLTE3LAorCS0xNiwgLTE1LCAtMTUsIC0xNCwgLTEzLCAtMTMsIC0xMiwgLTEyLAorCS0xMSwgLTExLCAtMTAsIC0xMCwgLTEwLCAtOSwgLTksIC04LAorCS04LCAtOCwgLTcsIC03LCAtNywgLTYsIC02LCAtNiwKKwktNSwgLTUsIC01LCAtNSwgLTQsIC00LCAtNCwgLTQsCisJLTMsIC0zLCAtMywgLTMsIC0yLCAtMiwgLTIsIC0yLAorCS0yLCAtMSwgLTEsIC0xLCAtMSwgMCwgMCwgMCwKKwkwLCAwLCAwLCAxLCAxLCAxLCAxLCAxLAorCTEsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCisJMywgMywgMywgMywgMywgMywgMywgNCwKKwk0LCA0LCA0LCA0LCA0LCA0LCA0LCA1LAorCTUsIDUsIDUsIDUsIDUsIDUsIDUsIDUsCisJNiwgNiwgNiwgNiwgNiwgNiwgNiwgNiwKKwk2LCA3LCA3LCA3LCA3LCA3LCA3LCA3LAorCTcsIDcsIDcsIDgsIDgsIDgsIDgsIDgKK307CisKK3N0YXRpYyB2b2lkIGNhbGNfdm9sKHVuc2lnbmVkIGNoYXIgKnJlZ2J5dGUsIGludCB2b2x1bWUsIGludCBtYWluX3ZvbCkKK3sKKwlpbnQgbGV2ZWwgPSAofipyZWdieXRlICYgMHgzZik7CisKKwlpZiAobWFpbl92b2wgPiAxMjcpCisJCW1haW5fdm9sID0gMTI3OworCXZvbHVtZSA9ICh2b2x1bWUgKiBtYWluX3ZvbCkgLyAxMjc7CisKKwlpZiAobGV2ZWwpCisJCWxldmVsICs9IGZtX3ZvbHVtZV90YWJsZVt2b2x1bWVdOworCisJaWYgKGxldmVsID4gMHgzZikKKwkJbGV2ZWwgPSAweDNmOworCWlmIChsZXZlbCA8IDApCisJCWxldmVsID0gMDsKKworCSpyZWdieXRlID0gKCpyZWdieXRlICYgMHhjMCkgfCAofmxldmVsICYgMHgzZik7Cit9CisKK3N0YXRpYyB2b2lkIHNldF92b2ljZV92b2x1bWUoaW50IHZvaWNlLCBpbnQgdm9sdW1lLCBpbnQgbWFpbl92b2wpCit7CisJdW5zaWduZWQgY2hhciB2b2wxLCB2b2wyLCB2b2wzLCB2b2w0OworCXN0cnVjdCBzYmlfaW5zdHJ1bWVudCAqaW5zdHI7CisJc3RydWN0IHBoeXNpY2FsX3ZvaWNlX2luZm8gKm1hcDsKKworCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gZGV2Yy0+bnJfdm9pY2UpCisJCXJldHVybjsKKworCW1hcCA9ICZwdl9tYXBbZGV2Yy0+bHZfbWFwW3ZvaWNlXV07CisJaW5zdHIgPSBkZXZjLT5hY3RfaVt2b2ljZV07CisKKwlpZiAoIWluc3RyKQorCQlpbnN0ciA9ICZkZXZjLT5pX21hcFswXTsKKworCWlmIChpbnN0ci0+Y2hhbm5lbCA8IDApCisJCXJldHVybjsKKworCWlmIChkZXZjLT52b2Nbdm9pY2VdLm1vZGUgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKGRldmMtPnZvY1t2b2ljZV0ubW9kZSA9PSAyKQorCXsKKwkJdm9sMSA9IGluc3RyLT5vcGVyYXRvcnNbMl07CisJCXZvbDIgPSBpbnN0ci0+b3BlcmF0b3JzWzNdOworCQlpZiAoKGluc3RyLT5vcGVyYXRvcnNbMTBdICYgMHgwMSkpCisJCXsKKwkJCWNhbGNfdm9sKCZ2b2wxLCB2b2x1bWUsIG1haW5fdm9sKTsKKwkJCWNhbGNfdm9sKCZ2b2wyLCB2b2x1bWUsIG1haW5fdm9sKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWNhbGNfdm9sKCZ2b2wyLCB2b2x1bWUsIG1haW5fdm9sKTsKKwkJfQorCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEtTTF9MRVZFTCArIG1hcC0+b3BbMF0sIHZvbDEpOworCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEtTTF9MRVZFTCArIG1hcC0+b3BbMV0sIHZvbDIpOworCX0KKwllbHNlCisJewkvKgorCQkgKiA0IE9QIHZvaWNlCisJCSAqLworCQlpbnQgY29ubmVjdGlvbjsKKworCQl2b2wxID0gaW5zdHItPm9wZXJhdG9yc1syXTsKKwkJdm9sMiA9IGluc3RyLT5vcGVyYXRvcnNbM107CisJCXZvbDMgPSBpbnN0ci0+b3BlcmF0b3JzW09GRlNfNE9QICsgMl07CisJCXZvbDQgPSBpbnN0ci0+b3BlcmF0b3JzW09GRlNfNE9QICsgM107CisKKwkJLyoKKwkJICogVGhlIGNvbm5lY3Rpb24gbWV0aG9kIGZvciA0IE9QIGRldmMtPnZvYyBpcyBkZWZpbmVkIGJ5IHRoZSByaWdodG1vc3QKKwkJICogYml0cyBhdCB0aGUgb2Zmc2V0cyAxMCBhbmQgMTArT0ZGU180T1AKKwkJICovCisKKwkJY29ubmVjdGlvbiA9ICgoaW5zdHItPm9wZXJhdG9yc1sxMF0gJiAweDAxKSA8PCAxKSB8IChpbnN0ci0+b3BlcmF0b3JzWzEwICsgT0ZGU180T1BdICYgMHgwMSk7CisKKwkJc3dpdGNoIChjb25uZWN0aW9uKQorCQl7CisJCQljYXNlIDA6CisJCQkJY2FsY192b2woJnZvbDQsIHZvbHVtZSwgbWFpbl92b2wpOworCQkJCWJyZWFrOworCisJCQljYXNlIDE6CisJCQkJY2FsY192b2woJnZvbDIsIHZvbHVtZSwgbWFpbl92b2wpOworCQkJCWNhbGNfdm9sKCZ2b2w0LCB2b2x1bWUsIG1haW5fdm9sKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAyOgorCQkJCWNhbGNfdm9sKCZ2b2wxLCB2b2x1bWUsIG1haW5fdm9sKTsKKwkJCQljYWxjX3ZvbCgmdm9sNCwgdm9sdW1lLCBtYWluX3ZvbCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMzoKKwkJCQljYWxjX3ZvbCgmdm9sMSwgdm9sdW1lLCBtYWluX3ZvbCk7CisJCQkJY2FsY192b2woJnZvbDMsIHZvbHVtZSwgbWFpbl92b2wpOworCQkJCWNhbGNfdm9sKCZ2b2w0LCB2b2x1bWUsIG1haW5fdm9sKTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQk7CisJCX0KKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLU0xfTEVWRUwgKyBtYXAtPm9wWzBdLCB2b2wxKTsKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLU0xfTEVWRUwgKyBtYXAtPm9wWzFdLCB2b2wyKTsKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLU0xfTEVWRUwgKyBtYXAtPm9wWzJdLCB2b2wzKTsKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLU0xfTEVWRUwgKyBtYXAtPm9wWzNdLCB2b2w0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgb3BsM19zdGFydF9ub3RlIChpbnQgZGV2LCBpbnQgdm9pY2UsIGludCBub3RlLCBpbnQgdm9sdW1lKQoreworCXVuc2lnbmVkIGNoYXIgZGF0YSwgZnBjOworCWludCBibG9jaywgZm51bSwgZnJlcSwgdm9pY2VfbW9kZSwgcGFuOworCXN0cnVjdCBzYmlfaW5zdHJ1bWVudCAqaW5zdHI7CisJc3RydWN0IHBoeXNpY2FsX3ZvaWNlX2luZm8gKm1hcDsKKworCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gZGV2Yy0+bnJfdm9pY2UpCisJCXJldHVybiAwOworCisJbWFwID0gJnB2X21hcFtkZXZjLT5sdl9tYXBbdm9pY2VdXTsKKwlwYW4gPSBkZXZjLT52b2Nbdm9pY2VdLnBhbm5pbmc7CisKKwlpZiAobWFwLT52b2ljZV9tb2RlID09IDApCisJCXJldHVybiAwOworCisJaWYgKG5vdGUgPT0gMjU1KQkvKgorCQkJCSAqIEp1c3QgY2hhbmdlIHRoZSB2b2x1bWUKKwkJCQkgKi8KKwl7CisJCXNldF92b2ljZV92b2x1bWUodm9pY2UsIHZvbHVtZSwgZGV2Yy0+dm9jW3ZvaWNlXS52b2x1bWUpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKgorCSAqIEtpbGwgcHJldmlvdXMgbm90ZSBiZWZvcmUgcGxheWluZworCSAqLworCQorCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS1NMX0xFVkVMICsgbWFwLT5vcFsxXSwgMHhmZik7CS8qCisJCQkJCQkJCQkgKiBDYXJyaWVyCisJCQkJCQkJCQkgKiB2b2x1bWUgdG8KKwkJCQkJCQkJCSAqIG1pbgorCQkJCQkJCQkJICovCisJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLU0xfTEVWRUwgKyBtYXAtPm9wWzBdLCAweGZmKTsJLyoKKwkJCQkJCQkJCSAqIE1vZHVsYXRvcgorCQkJCQkJCQkJICogdm9sdW1lIHRvCisJCQkJCQkJCQkgKi8KKworCWlmIChtYXAtPnZvaWNlX21vZGUgPT0gNCkKKwl7CisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS1NMX0xFVkVMICsgbWFwLT5vcFsyXSwgMHhmZik7CisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS1NMX0xFVkVMICsgbWFwLT5vcFszXSwgMHhmZik7CisJfQorCisJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLRVlPTl9CTE9DSyArIG1hcC0+dm9pY2VfbnVtLCAweDAwKTsJLyoKKwkJCQkJCQkJCSAqIE5vdGUKKwkJCQkJCQkJCSAqIG9mZgorCQkJCQkJCQkJICovCisKKwlpbnN0ciA9IGRldmMtPmFjdF9pW3ZvaWNlXTsKKwkKKwlpZiAoIWluc3RyKQorCQlpbnN0ciA9ICZkZXZjLT5pX21hcFswXTsKKworCWlmIChpbnN0ci0+Y2hhbm5lbCA8IDApCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJvcGwzOiBJbml0aWFsaXppbmcgdm9pY2UgJWQgd2l0aCB1bmRlZmluZWQgaW5zdHJ1bWVudFxuIiwgdm9pY2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobWFwLT52b2ljZV9tb2RlID09IDIgJiYgaW5zdHItPmtleSA9PSBPUEwzX1BBVENIKQorCQlyZXR1cm4gMDsJLyoKKwkJCQkgKiBDYW5ub3QgcGxheQorCQkJCSAqLworCisJdm9pY2VfbW9kZSA9IG1hcC0+dm9pY2VfbW9kZTsKKworCWlmICh2b2ljZV9tb2RlID09IDQpCisJeworCQlpbnQgdm9pY2Vfc2hpZnQ7CisKKwkJdm9pY2Vfc2hpZnQgPSAobWFwLT5pb2FkZHIgPT0gZGV2Yy0+bGVmdF9pbykgPyAwIDogMzsKKwkJdm9pY2Vfc2hpZnQgKz0gbWFwLT52b2ljZV9udW07CisKKwkJaWYgKGluc3RyLT5rZXkgIT0gT1BMM19QQVRDSCkJLyoKKwkJCQkJCSAqIEp1c3QgMiBPUCBwYXRjaAorCQkJCQkJICovCisJCXsKKwkJCXZvaWNlX21vZGUgPSAyOworCQkJZGV2Yy0+Y21hc2sgJj0gfigxIDw8IHZvaWNlX3NoaWZ0KTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWRldmMtPmNtYXNrIHw9ICgxIDw8IHZvaWNlX3NoaWZ0KTsKKwkJfQorCisJCW9wbDNfY29tbWFuZChkZXZjLT5yaWdodF9pbywgQ09OTkVDVElPTl9TRUxFQ1RfUkVHSVNURVIsIGRldmMtPmNtYXNrKTsKKwl9CisKKwkvKgorCSAqIFNldCBTb3VuZCBDaGFyYWN0ZXJpc3RpY3MKKwkgKi8KKwkKKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEFNX1ZJQiArIG1hcC0+b3BbMF0sIGluc3RyLT5vcGVyYXRvcnNbMF0pOworCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgQU1fVklCICsgbWFwLT5vcFsxXSwgaW5zdHItPm9wZXJhdG9yc1sxXSk7CisKKwkvKgorCSAqIFNldCBBdHRhY2svRGVjYXkKKwkgKi8KKwkKKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEFUVEFDS19ERUNBWSArIG1hcC0+b3BbMF0sIGluc3RyLT5vcGVyYXRvcnNbNF0pOworCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgQVRUQUNLX0RFQ0FZICsgbWFwLT5vcFsxXSwgaW5zdHItPm9wZXJhdG9yc1s1XSk7CisKKwkvKgorCSAqIFNldCBTdXN0YWluL1JlbGVhc2UKKwkgKi8KKwkKKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIFNVU1RBSU5fUkVMRUFTRSArIG1hcC0+b3BbMF0sIGluc3RyLT5vcGVyYXRvcnNbNl0pOworCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgU1VTVEFJTl9SRUxFQVNFICsgbWFwLT5vcFsxXSwgaW5zdHItPm9wZXJhdG9yc1s3XSk7CisKKwkvKgorCSAqIFNldCBXYXZlIFNlbGVjdAorCSAqLworCisJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBXQVZFX1NFTEVDVCArIG1hcC0+b3BbMF0sIGluc3RyLT5vcGVyYXRvcnNbOF0pOworCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgV0FWRV9TRUxFQ1QgKyBtYXAtPm9wWzFdLCBpbnN0ci0+b3BlcmF0b3JzWzldKTsKKworCS8qCisJICogU2V0IEZlZWRiYWNrL0Nvbm5lY3Rpb24KKwkgKi8KKwkKKwlmcGMgPSBpbnN0ci0+b3BlcmF0b3JzWzEwXTsKKworCWlmIChwYW4gIT0gMHhmZmZmKQorCXsKKwkJZnBjICY9IH5TVEVSRU9fQklUUzsKKwkJaWYgKHBhbiA8IC02NCkKKwkJCWZwYyB8PSBWT0lDRV9UT19MRUZUOworCQllbHNlCisJCQlpZiAocGFuID4gNjQpCisJCQkJZnBjIHw9IFZPSUNFX1RPX1JJR0hUOworCQkJZWxzZQorCQkJCWZwYyB8PSAoVk9JQ0VfVE9fTEVGVCB8IFZPSUNFX1RPX1JJR0hUKTsKKwl9CisKKwlpZiAoIShmcGMgJiAweDMwKSkKKwkJZnBjIHw9IDB4MzA7CS8qCisJCQkJICogRW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIGNobiBpcyBlbmFibGVkCisJCQkJICovCisJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBGRUVEQkFDS19DT05ORUNUSU9OICsgbWFwLT52b2ljZV9udW0sIGZwYyk7CisKKwkvKgorCSAqIElmIHRoZSB2b2ljZSBpcyBhIDQgT1Agb25lLCBpbml0aWFsaXplIHRoZSBvcGVyYXRvcnMgMyBhbmQgNCBhbHNvCisJICovCisKKwlpZiAodm9pY2VfbW9kZSA9PSA0KQorCXsKKwkJLyoKKwkJICogU2V0IFNvdW5kIENoYXJhY3RlcmlzdGljcworCQkgKi8KKwkKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBBTV9WSUIgKyBtYXAtPm9wWzJdLCBpbnN0ci0+b3BlcmF0b3JzW09GRlNfNE9QICsgMF0pOworCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEFNX1ZJQiArIG1hcC0+b3BbM10sIGluc3RyLT5vcGVyYXRvcnNbT0ZGU180T1AgKyAxXSk7CisKKwkJLyoKKwkJICogU2V0IEF0dGFjay9EZWNheQorCQkgKi8KKwkJCisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgQVRUQUNLX0RFQ0FZICsgbWFwLT5vcFsyXSwgaW5zdHItPm9wZXJhdG9yc1tPRkZTXzRPUCArIDRdKTsKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBBVFRBQ0tfREVDQVkgKyBtYXAtPm9wWzNdLCBpbnN0ci0+b3BlcmF0b3JzW09GRlNfNE9QICsgNV0pOworCisJCS8qCisJCSAqIFNldCBTdXN0YWluL1JlbGVhc2UKKwkJICovCisJCQorCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIFNVU1RBSU5fUkVMRUFTRSArIG1hcC0+b3BbMl0sIGluc3RyLT5vcGVyYXRvcnNbT0ZGU180T1AgKyA2XSk7CisJCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgU1VTVEFJTl9SRUxFQVNFICsgbWFwLT5vcFszXSwgaW5zdHItPm9wZXJhdG9yc1tPRkZTXzRPUCArIDddKTsKKworCQkvKgorCQkgKiBTZXQgV2F2ZSBTZWxlY3QKKwkJICovCisJCQorCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIFdBVkVfU0VMRUNUICsgbWFwLT5vcFsyXSwgaW5zdHItPm9wZXJhdG9yc1tPRkZTXzRPUCArIDhdKTsKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBXQVZFX1NFTEVDVCArIG1hcC0+b3BbM10sIGluc3RyLT5vcGVyYXRvcnNbT0ZGU180T1AgKyA5XSk7CisKKwkJLyoKKwkJICogU2V0IEZlZWRiYWNrL0Nvbm5lY3Rpb24KKwkJICovCisJCQorCQlmcGMgPSBpbnN0ci0+b3BlcmF0b3JzW09GRlNfNE9QICsgMTBdOworCQlpZiAoIShmcGMgJiAweDMwKSkKKwkJCSBmcGMgfD0gMHgzMDsJLyoKKwkJCQkJICogRW5zdXJlIHRoYXQgYXQgbGVhc3Qgb25lIGNobiBpcyBlbmFibGVkCisJCQkJCSAqLworCQlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEZFRURCQUNLX0NPTk5FQ1RJT04gKyBtYXAtPnZvaWNlX251bSArIDMsIGZwYyk7CisJfQorCisJZGV2Yy0+dm9jW3ZvaWNlXS5tb2RlID0gdm9pY2VfbW9kZTsKKwlzZXRfdm9pY2Vfdm9sdW1lKHZvaWNlLCB2b2x1bWUsIGRldmMtPnZvY1t2b2ljZV0udm9sdW1lKTsKKworCWZyZXEgPSBkZXZjLT52b2Nbdm9pY2VdLm9yaWdfZnJlcSA9IG5vdGVfdG9fZnJlcShub3RlKSAvIDEwMDA7CisKKwkvKgorCSAqIFNpbmNlIHRoZSBwaXRjaCBiZW5kZXIgbWF5IGhhdmUgYmVlbiBzZXQgYmVmb3JlIHBsYXlpbmcgdGhlIG5vdGUsIHdlCisJICogaGF2ZSB0byBjYWxjdWxhdGUgdGhlIGJlbmRpbmcgbm93LgorCSAqLworCisJZnJlcSA9IGNvbXB1dGVfZmluZXR1bmUoZGV2Yy0+dm9jW3ZvaWNlXS5vcmlnX2ZyZXEsIGRldmMtPnZvY1t2b2ljZV0uYmVuZGVyLCBkZXZjLT52b2Nbdm9pY2VdLmJlbmRlcl9yYW5nZSwgMCk7CisJZGV2Yy0+dm9jW3ZvaWNlXS5jdXJyZW50X2ZyZXEgPSBmcmVxOworCisJZnJlcV90b19mbnVtKGZyZXEsICZibG9jaywgJmZudW0pOworCisJLyoKKwkgKiBQbGF5IG5vdGUKKwkgKi8KKworCWRhdGEgPSBmbnVtICYgMHhmZjsJLyoKKwkJCQkgKiBMZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIGZudW1iZXIKKwkJCQkgKi8KKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEZOVU1fTE9XICsgbWFwLT52b2ljZV9udW0sIGRhdGEpOworCisJZGF0YSA9IDB4MjAgfCAoKGJsb2NrICYgMHg3KSA8PCAyKSB8ICgoZm51bSA+PiA4KSAmIDB4Myk7CisJCSBkZXZjLT52b2Nbdm9pY2VdLmtleW9uX2J5dGUgPSBkYXRhOworCW9wbDNfY29tbWFuZChtYXAtPmlvYWRkciwgS0VZT05fQkxPQ0sgKyBtYXAtPnZvaWNlX251bSwgZGF0YSk7CisJaWYgKHZvaWNlX21vZGUgPT0gNCkKKwkJb3BsM19jb21tYW5kKG1hcC0+aW9hZGRyLCBLRVlPTl9CTE9DSyArIG1hcC0+dm9pY2VfbnVtICsgMywgZGF0YSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlcV90b19mbnVtICAgIChpbnQgZnJlcSwgaW50ICpibG9jaywgaW50ICpmbnVtKQoreworCWludCBmLCBvY3RhdmU7CisKKwkvKgorCSAqIENvbnZlcnRzIHRoZSBub3RlIGZyZXF1ZW5jeSB0byBibG9jayBhbmQgZm51bSB2YWx1ZXMgZm9yIHRoZSBGTSBjaGlwCisJICovCisJLyoKKwkgKiBGaXJzdCB0cnkgdG8gY29tcHV0ZSB0aGUgYmxvY2sgLXZhbHVlIChvY3RhdmUpIHdoZXJlIHRoZSBub3RlIGJlbG9uZ3MKKwkgKi8KKworCWYgPSBmcmVxOworCisJb2N0YXZlID0gNTsKKworCWlmIChmID09IDApCisJCW9jdGF2ZSA9IDA7CisJZWxzZSBpZiAoZiA8IDI2MSkKKwl7CisJCXdoaWxlIChmIDwgMjYxKQorCQl7CisJCQlvY3RhdmUtLTsKKwkJCWYgPDw9IDE7CisJCX0KKwl9CisJZWxzZSBpZiAoZiA+IDQ5MykKKwl7CisJCXdoaWxlIChmID4gNDkzKQorCQl7CisJCQkgb2N0YXZlKys7CisJCQkgZiA+Pj0gMTsKKwkJfQorCX0KKworCWlmIChvY3RhdmUgPiA3KQorCQlvY3RhdmUgPSA3OworCisJKmZudW0gPSBmcmVxICogKDEgPDwgKDIwIC0gb2N0YXZlKSkgLyA0OTcxNjsKKwkqYmxvY2sgPSBvY3RhdmU7Cit9CisKK3N0YXRpYyB2b2lkIG9wbDNfY29tbWFuZCAgICAoaW50IGlvX2FkZHIsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCSBpbnQgaTsKKworCS8qCisJICogVGhlIG9yaWdpbmFsIDItT1Agc3ludGggcmVxdWlyZXMgYSBxdWl0ZSBsb25nIGRlbGF5IGFmdGVyIHdyaXRpbmcgdG8gYQorCSAqIHJlZ2lzdGVyLiBUaGUgT1BMLTMgc3Vydml2ZXMgd2l0aCBqdXN0IHR3byBJTkJzCisJICovCisKKwlvdXRiKCgodW5zaWduZWQgY2hhcikgKGFkZHIgJiAweGZmKSksIGlvX2FkZHIpOworCisJaWYgKGRldmMtPm1vZGVsICE9IDIpCisJCXVkZWxheSgxMCk7CisJZWxzZQorCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJaW5iKGlvX2FkZHIpOworCisJb3V0YigoKHVuc2lnbmVkIGNoYXIpICh2YWwgJiAweGZmKSksIGlvX2FkZHIgKyAxKTsKKworCWlmIChkZXZjLT5tb2RlbCAhPSAyKQorCQl1ZGVsYXkoMzApOworCWVsc2UKKwkJZm9yIChpID0gMDsgaSA8IDI7IGkrKykKKwkJCWluYihpb19hZGRyKTsKK30KKworc3RhdGljIHZvaWQgb3BsM19yZXNldChpbnQgZGV2bm8pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTg7IGkrKykKKwkJZGV2Yy0+bHZfbWFwW2ldID0gaTsKKworCWZvciAoaSA9IDA7IGkgPCBkZXZjLT5ucl92b2ljZTsgaSsrKQorCXsKKwkJb3BsM19jb21tYW5kKHB2X21hcFtkZXZjLT5sdl9tYXBbaV1dLmlvYWRkciwKKwkJCUtTTF9MRVZFTCArIHB2X21hcFtkZXZjLT5sdl9tYXBbaV1dLm9wWzBdLCAweGZmKTsKKworCQlvcGwzX2NvbW1hbmQocHZfbWFwW2RldmMtPmx2X21hcFtpXV0uaW9hZGRyLAorCQkJS1NMX0xFVkVMICsgcHZfbWFwW2RldmMtPmx2X21hcFtpXV0ub3BbMV0sIDB4ZmYpOworCisJCWlmIChwdl9tYXBbZGV2Yy0+bHZfbWFwW2ldXS52b2ljZV9tb2RlID09IDQpCisJCXsKKwkJCW9wbDNfY29tbWFuZChwdl9tYXBbZGV2Yy0+bHZfbWFwW2ldXS5pb2FkZHIsCisJCQkJS1NMX0xFVkVMICsgcHZfbWFwW2RldmMtPmx2X21hcFtpXV0ub3BbMl0sIDB4ZmYpOworCisJCQlvcGwzX2NvbW1hbmQocHZfbWFwW2RldmMtPmx2X21hcFtpXV0uaW9hZGRyLAorCQkJCUtTTF9MRVZFTCArIHB2X21hcFtkZXZjLT5sdl9tYXBbaV1dLm9wWzNdLCAweGZmKTsKKwkJfQorCisJCW9wbDNfa2lsbF9ub3RlKGRldm5vLCBpLCAwLCA2NCk7CisJfQorCisJaWYgKGRldmMtPm1vZGVsID09IDIpCisJeworCQlkZXZjLT52X2FsbG9jLT5tYXhfdm9pY2UgPSBkZXZjLT5ucl92b2ljZSA9IDE4OworCisJCWZvciAoaSA9IDA7IGkgPCAxODsgaSsrKQorCQkJcHZfbWFwW2ldLnZvaWNlX21vZGUgPSAyOworCisJfQorfQorCitzdGF0aWMgaW50IG9wbDNfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlpbnQgaTsKKworCWlmIChkZXZjLT5idXN5KQorCQlyZXR1cm4gLUVCVVNZOworCWRldmMtPmJ1c3kgPSAxOworCisJZGV2Yy0+dl9hbGxvYy0+bWF4X3ZvaWNlID0gZGV2Yy0+bnJfdm9pY2UgPSAoZGV2Yy0+bW9kZWwgPT0gMikgPyAxOCA6IDk7CisJZGV2Yy0+dl9hbGxvYy0+dGltZXN0YW1wID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCAxODsgaSsrKQorCXsKKwkJZGV2Yy0+dl9hbGxvYy0+bWFwW2ldID0gMDsKKwkJZGV2Yy0+dl9hbGxvYy0+YWxsb2NfdGltZXNbaV0gPSAwOworCX0KKworCWRldmMtPmNtYXNrID0gMHgwMDsJLyoKKwkJCQkgKiBKdXN0IDIgT1AgbW9kZQorCQkJCSAqLworCWlmIChkZXZjLT5tb2RlbCA9PSAyKQorCQlvcGwzX2NvbW1hbmQoZGV2Yy0+cmlnaHRfaW8sIENPTk5FQ1RJT05fU0VMRUNUX1JFR0lTVEVSLCBkZXZjLT5jbWFzayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIG9wbDNfY2xvc2UoaW50IGRldikKK3sKKwlkZXZjLT5idXN5ID0gMDsKKwlkZXZjLT52X2FsbG9jLT5tYXhfdm9pY2UgPSBkZXZjLT5ucl92b2ljZSA9IChkZXZjLT5tb2RlbCA9PSAyKSA/IDE4IDogOTsKKworCWRldmMtPmZtX2luZm8ubnJfZHJ1bXMgPSAwOworCWRldmMtPmZtX2luZm8ucGVyY19tb2RlID0gMDsKKworCW9wbDNfcmVzZXQoZGV2KTsKK30KKworc3RhdGljIHZvaWQgb3BsM19od19jb250cm9sKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KQoreworfQorCitzdGF0aWMgaW50IG9wbDNfbG9hZF9wYXRjaChpbnQgZGV2LCBpbnQgZm9ybWF0LCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwKKwkJaW50IG9mZnMsIGludCBjb3VudCwgaW50IHBtZ3JfZmxhZykKK3sKKwlzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgaW5zOworCisJaWYgKGNvdW50IDxzaXplb2YoaW5zKSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZNIEVycm9yOiBQYXRjaCByZWNvcmQgdG9vIHNob3J0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBXaGF0IHRoZSBmdWNrIGlzIGdvaW5nIG9uIGhlcmU/ICBXZSBsZWF2ZSBqdW5rIGluIHRoZSBiZWdpbm5pbmcKKwkgKiBvZiBpbnMgYW5kIHRoZW4gY2hlY2sgdGhlIGZpZWxkIHByZXR0eSBjbG9zZSB0byB0aGF0IGJlZ2lubmluZz8KKwkgKi8KKwlpZihjb3B5X2Zyb21fdXNlcigmKChjaGFyICopICZpbnMpW29mZnNdLCBhZGRyICsgb2Zmcywgc2l6ZW9mKGlucykgLSBvZmZzKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoaW5zLmNoYW5uZWwgPCAwIHx8IGlucy5jaGFubmVsID49IFNCRk1fTUFYSU5TVFIpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJGTSBFcnJvcjogSW52YWxpZCBpbnN0cnVtZW50IG51bWJlciAlZFxuIiwgaW5zLmNoYW5uZWwpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaW5zLmtleSA9IGZvcm1hdDsKKworCXJldHVybiBzdG9yZV9pbnN0cihpbnMuY2hhbm5lbCwgJmlucyk7Cit9CisKK3N0YXRpYyB2b2lkIG9wbDNfcGFubmluZyhpbnQgZGV2LCBpbnQgdm9pY2UsIGludCB2YWx1ZSkKK3sKKwlkZXZjLT52b2Nbdm9pY2VdLnBhbm5pbmcgPSB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQgb3BsM192b2x1bWVfbWV0aG9kKGludCBkZXYsIGludCBtb2RlKQoreworfQorCisjZGVmaW5lIFNFVF9WSUJSQVRPKGNlbGwpIHsgXAorCXRtcCA9IGluc3RyLT5vcGVyYXRvcnNbKGNlbGwtMSkrKCgoY2VsbC0xKS8yKSpPRkZTXzRPUCldOyBcCisJaWYgKHByZXNzdXJlID4gMTEwKSBcCisJCXRtcCB8PSAweDQwOwkJLyogVmlicmF0byBvbiAqLyBcCisJb3BsM19jb21tYW5kIChtYXAtPmlvYWRkciwgQU1fVklCICsgbWFwLT5vcFtjZWxsLTFdLCB0bXApO30KKworc3RhdGljIHZvaWQgb3BsM19hZnRlcnRvdWNoKGludCBkZXYsIGludCB2b2ljZSwgaW50IHByZXNzdXJlKQoreworCWludCB0bXA7CisJc3RydWN0IHNiaV9pbnN0cnVtZW50ICppbnN0cjsKKwlzdHJ1Y3QgcGh5c2ljYWxfdm9pY2VfaW5mbyAqbWFwOworCisJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBkZXZjLT5ucl92b2ljZSkKKwkJcmV0dXJuOworCisJbWFwID0gJnB2X21hcFtkZXZjLT5sdl9tYXBbdm9pY2VdXTsKKworCURFQihwcmludGsoIkFmdGVydG91Y2ggJWRcbiIsIHZvaWNlKSk7CisKKwlpZiAobWFwLT52b2ljZV9tb2RlID09IDApCisJCXJldHVybjsKKworCS8qCisJICogQWRqdXN0IHRoZSBhbW91bnQgb2YgdmlicmF0byBkZXBlbmRpbmcgdGhlIHByZXNzdXJlCisJICovCisKKwlpbnN0ciA9IGRldmMtPmFjdF9pW3ZvaWNlXTsKKworCWlmICghaW5zdHIpCisJCWluc3RyID0gJmRldmMtPmlfbWFwWzBdOworCisJaWYgKGRldmMtPnZvY1t2b2ljZV0ubW9kZSA9PSA0KQorCXsKKwkJaW50IGNvbm5lY3Rpb24gPSAoKGluc3RyLT5vcGVyYXRvcnNbMTBdICYgMHgwMSkgPDwgMSkgfCAoaW5zdHItPm9wZXJhdG9yc1sxMCArIE9GRlNfNE9QXSAmIDB4MDEpOworCisJCXN3aXRjaCAoY29ubmVjdGlvbikKKwkJeworCQkJY2FzZSAwOgorCQkJCVNFVF9WSUJSQVRPKDQpOworCQkJCWJyZWFrOworCisJCQljYXNlIDE6CisJCQkJU0VUX1ZJQlJBVE8oMik7CisJCQkJU0VUX1ZJQlJBVE8oNCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgMjoKKwkJCQlTRVRfVklCUkFUTygxKTsKKwkJCQlTRVRfVklCUkFUTyg0KTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAzOgorCQkJCVNFVF9WSUJSQVRPKDEpOworCQkJCVNFVF9WSUJSQVRPKDMpOworCQkJCVNFVF9WSUJSQVRPKDQpOworCQkJCWJyZWFrOworCisJCX0KKwkJLyoKKwkJICogTm90IGltcGxlbWVudGVkIHlldAorCQkgKi8KKwl9CisJZWxzZQorCXsKKwkJU0VUX1ZJQlJBVE8oMSk7CisKKwkJaWYgKChpbnN0ci0+b3BlcmF0b3JzWzEwXSAmIDB4MDEpKQkvKgorCQkJCQkJCSAqIEFkZGl0aXZlIHN5bnRoZXNpcworCQkJCQkJCSAqLworCQkJU0VUX1ZJQlJBVE8oMik7CisJfQorfQorCisjdW5kZWYgU0VUX1ZJQlJBVE8KKworc3RhdGljIHZvaWQgYmVuZF9waXRjaChpbnQgZGV2LCBpbnQgdm9pY2UsIGludCB2YWx1ZSkKK3sKKwl1bnNpZ25lZCBjaGFyIGRhdGE7CisJaW50IGJsb2NrLCBmbnVtLCBmcmVxOworCXN0cnVjdCBwaHlzaWNhbF92b2ljZV9pbmZvICptYXA7CisKKwltYXAgPSAmcHZfbWFwW2RldmMtPmx2X21hcFt2b2ljZV1dOworCisJaWYgKG1hcC0+dm9pY2VfbW9kZSA9PSAwKQorCQlyZXR1cm47CisKKwlkZXZjLT52b2Nbdm9pY2VdLmJlbmRlciA9IHZhbHVlOworCWlmICghdmFsdWUpCisJCXJldHVybjsKKwlpZiAoIShkZXZjLT52b2Nbdm9pY2VdLmtleW9uX2J5dGUgJiAweDIwKSkKKwkJcmV0dXJuOwkvKgorCQkJICogTm90IGtleWVkIG9uCisJCQkgKi8KKworCWZyZXEgPSBjb21wdXRlX2ZpbmV0dW5lKGRldmMtPnZvY1t2b2ljZV0ub3JpZ19mcmVxLCBkZXZjLT52b2Nbdm9pY2VdLmJlbmRlciwgZGV2Yy0+dm9jW3ZvaWNlXS5iZW5kZXJfcmFuZ2UsIDApOworCWRldmMtPnZvY1t2b2ljZV0uY3VycmVudF9mcmVxID0gZnJlcTsKKworCWZyZXFfdG9fZm51bShmcmVxLCAmYmxvY2ssICZmbnVtKTsKKworCWRhdGEgPSBmbnVtICYgMHhmZjsJLyoKKwkJCQkgKiBMZWFzdCBzaWduaWZpY2FudCBiaXRzIG9mIGZudW1iZXIKKwkJCQkgKi8KKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEZOVU1fTE9XICsgbWFwLT52b2ljZV9udW0sIGRhdGEpOworCisJZGF0YSA9IDB4MjAgfCAoKGJsb2NrICYgMHg3KSA8PCAyKSB8ICgoZm51bSA+PiA4KSAmIDB4Myk7CisJZGV2Yy0+dm9jW3ZvaWNlXS5rZXlvbl9ieXRlID0gZGF0YTsKKwlvcGwzX2NvbW1hbmQobWFwLT5pb2FkZHIsIEtFWU9OX0JMT0NLICsgbWFwLT52b2ljZV9udW0sIGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBvcGwzX2NvbnRyb2xsZXIgKGludCBkZXYsIGludCB2b2ljZSwgaW50IGN0cmxfbnVtLCBpbnQgdmFsdWUpCit7CisJaWYgKHZvaWNlIDwgMCB8fCB2b2ljZSA+PSBkZXZjLT5ucl92b2ljZSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChjdHJsX251bSkKKwl7CisJCWNhc2UgQ1RSTF9QSVRDSF9CRU5ERVI6CisJCQliZW5kX3BpdGNoKGRldiwgdm9pY2UsIHZhbHVlKTsKKwkJCWJyZWFrOworCisJCWNhc2UgQ1RSTF9QSVRDSF9CRU5ERVJfUkFOR0U6CisJCQlkZXZjLT52b2Nbdm9pY2VdLmJlbmRlcl9yYW5nZSA9IHZhbHVlOworCQkJYnJlYWs7CisKKwkJY2FzZSBDVExfTUFJTl9WT0xVTUU6CisJCQlkZXZjLT52b2Nbdm9pY2VdLnZvbHVtZSA9IHZhbHVlIC8gMTI4OworCQkJYnJlYWs7CisKKwkJY2FzZSBDVExfUEFOOgorCQkJZGV2Yy0+dm9jW3ZvaWNlXS5wYW5uaW5nID0gKHZhbHVlICogMikgLSAxMjg7CisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9wbDNfYmVuZGVyKGludCBkZXYsIGludCB2b2ljZSwgaW50IHZhbHVlKQoreworCWlmICh2b2ljZSA8IDAgfHwgdm9pY2UgPj0gZGV2Yy0+bnJfdm9pY2UpCisJCXJldHVybjsKKworCWJlbmRfcGl0Y2goZGV2LCB2b2ljZSwgdmFsdWUgLSA4MTkyKTsKK30KKworc3RhdGljIGludCBvcGwzX2FsbG9jX3ZvaWNlKGludCBkZXYsIGludCBjaG4sIGludCBub3RlLCBzdHJ1Y3Qgdm9pY2VfYWxsb2NfaW5mbyAqYWxsb2MpCit7CisJaW50IGksIHAsIGJlc3QsIGZpcnN0LCBhdmFpbCwgYmVzdF90aW1lID0gMHg3ZmZmZmZmZjsKKwlzdHJ1Y3Qgc2JpX2luc3RydW1lbnQgKmluc3RyOworCWludCBpczRvcDsKKwlpbnQgaW5zdHJfbm87CisKKwlpZiAoY2huIDwgMCB8fCBjaG4gPiAxNSkKKwkJaW5zdHJfbm8gPSAwOworCWVsc2UKKwkJaW5zdHJfbm8gPSBkZXZjLT5jaG5faW5mb1tjaG5dLnBnbV9udW07CisKKwlpbnN0ciA9ICZkZXZjLT5pX21hcFtpbnN0cl9ub107CisJaWYgKGluc3RyLT5jaGFubmVsIDwgMCB8fAkvKiBJbnN0cnVtZW50IG5vdCBsb2FkZWQgKi8KKwkJZGV2Yy0+bnJfdm9pY2UgIT0gMTIpCS8qIE5vdCBpbiA0IE9QIG1vZGUgKi8KKwkJaXM0b3AgPSAwOworCWVsc2UgaWYgKGRldmMtPm5yX3ZvaWNlID09IDEyKQkvKiA0IE9QIG1vZGUgKi8KKwkJaXM0b3AgPSAoaW5zdHItPmtleSA9PSBPUEwzX1BBVENIKTsKKwllbHNlCisJCWlzNG9wID0gMDsKKworCWlmIChpczRvcCkKKwl7CisJCWZpcnN0ID0gcCA9IDA7CisJCWF2YWlsID0gNjsKKwl9CisJZWxzZQorCXsKKwkJaWYgKGRldmMtPm5yX3ZvaWNlID09IDEyKQkvKiA0IE9QIG1vZGUuIFVzZSB0aGUgJzIgT1Agb25seScgb3BlcmF0b3JzIGZpcnN0ICovCisJCQlmaXJzdCA9IHAgPSA2OworCQllbHNlCisJCQlmaXJzdCA9IHAgPSAwOworCQlhdmFpbCA9IGRldmMtPm5yX3ZvaWNlOworCX0KKworCS8qCisJICogICAgTm93IHRyeSB0byBmaW5kIGEgZnJlZSB2b2ljZQorCSAqLworCWJlc3QgPSBmaXJzdDsKKworCWZvciAoaSA9IDA7IGkgPCBhdmFpbDsgaSsrKQorCXsKKwkJaWYgKGFsbG9jLT5tYXBbcF0gPT0gMCkKKwkJeworCQkJcmV0dXJuIHA7CisJCX0KKwkJaWYgKGFsbG9jLT5hbGxvY190aW1lc1twXSA8IGJlc3RfdGltZSkJCS8qIEZpbmQgb2xkZXN0IHBsYXlpbmcgbm90ZSAqLworCQl7CisJCQliZXN0X3RpbWUgPSBhbGxvYy0+YWxsb2NfdGltZXNbcF07CisJCQliZXN0ID0gcDsKKwkJfQorCQlwID0gKHAgKyAxKSAlIGF2YWlsOworCX0KKworCS8qCisJICogICAgSW5zZXJ0IHNvbWUga2luZCBvZiBwcmlvcml0eSBtZWNoYW5pc20gaGVyZS4KKwkgKi8KKworCWlmIChiZXN0IDwgMCkKKwkJYmVzdCA9IDA7CisJaWYgKGJlc3QgPiBkZXZjLT5ucl92b2ljZSkKKwkJYmVzdCAtPSBkZXZjLT5ucl92b2ljZTsKKworCXJldHVybiBiZXN0OwkvKiBBbGwgZGV2Yy0+dm9jIGluIHVzZS4gU2VsZWN0IHRoZSBmaXJzdCBvbmUuICovCit9CisKK3N0YXRpYyB2b2lkIG9wbDNfc2V0dXBfdm9pY2UoaW50IGRldiwgaW50IHZvaWNlLCBpbnQgY2huKQoreworCXN0cnVjdCBjaGFubmVsX2luZm8gKmluZm8gPQorCSZzeW50aF9kZXZzW2Rldl0tPmNobl9pbmZvW2Nobl07CisKKwlvcGwzX3NldF9pbnN0cihkZXYsIHZvaWNlLCBpbmZvLT5wZ21fbnVtKTsKKworCWRldmMtPnZvY1t2b2ljZV0uYmVuZGVyID0gMDsKKwlkZXZjLT52b2Nbdm9pY2VdLmJlbmRlcl9yYW5nZSA9IGluZm8tPmJlbmRlcl9yYW5nZTsKKwlkZXZjLT52b2Nbdm9pY2VdLnZvbHVtZSA9IGluZm8tPmNvbnRyb2xsZXJzW0NUTF9NQUlOX1ZPTFVNRV07CisJZGV2Yy0+dm9jW3ZvaWNlXS5wYW5uaW5nID0gKGluZm8tPmNvbnRyb2xsZXJzW0NUTF9QQU5dICogMikgLSAxMjg7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyBvcGwzX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaWQJCT0gIk9QTCIsCisJLmluZm8JCT0gTlVMTCwKKwkubWlkaV9kZXYJPSAwLAorCS5zeW50aF90eXBlCT0gU1lOVEhfVFlQRV9GTSwKKwkuc3ludGhfc3VidHlwZQk9IEZNX1RZUEVfQURMSUIsCisJLm9wZW4JCT0gb3BsM19vcGVuLAorCS5jbG9zZQkJPSBvcGwzX2Nsb3NlLAorCS5pb2N0bAkJPSBvcGwzX2lvY3RsLAorCS5raWxsX25vdGUJPSBvcGwzX2tpbGxfbm90ZSwKKwkuc3RhcnRfbm90ZQk9IG9wbDNfc3RhcnRfbm90ZSwKKwkuc2V0X2luc3RyCT0gb3BsM19zZXRfaW5zdHIsCisJLnJlc2V0CQk9IG9wbDNfcmVzZXQsCisJLmh3X2NvbnRyb2wJPSBvcGwzX2h3X2NvbnRyb2wsCisJLmxvYWRfcGF0Y2gJPSBvcGwzX2xvYWRfcGF0Y2gsCisJLmFmdGVydG91Y2gJPSBvcGwzX2FmdGVydG91Y2gsCisJLmNvbnRyb2xsZXIJPSBvcGwzX2NvbnRyb2xsZXIsCisJLnBhbm5pbmcJPSBvcGwzX3Bhbm5pbmcsCisJLnZvbHVtZV9tZXRob2QJPSBvcGwzX3ZvbHVtZV9tZXRob2QsCisJLmJlbmRlcgkJPSBvcGwzX2JlbmRlciwKKwkuYWxsb2Nfdm9pY2UJPSBvcGwzX2FsbG9jX3ZvaWNlLAorCS5zZXR1cF92b2ljZQk9IG9wbDNfc2V0dXBfdm9pY2UKK307CisKK2ludCBvcGwzX2luaXQoaW50IGlvYWRkciwgaW50ICpvc3AsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCWludCBpOworCWludCBtZTsKKworCWlmIChkZXZjID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9FUlIgIm9wbDM6IERldmljZSBjb250cm9sIHN0cnVjdHVyZSBub3QgaW5pdGlhbGl6ZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmICgobWUgPSBzb3VuZF9hbGxvY19zeW50aGRldigpKSA9PSAtMSkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIm9wbDM6IFRvbyBtYW55IHN5bnRoZXNpemVyc1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlkZXZjLT5ucl92b2ljZSA9IDk7CisKKwlkZXZjLT5mbV9pbmZvLmRldmljZSA9IDA7CisJZGV2Yy0+Zm1faW5mby5zeW50aF90eXBlID0gU1lOVEhfVFlQRV9GTTsKKwlkZXZjLT5mbV9pbmZvLnN5bnRoX3N1YnR5cGUgPSBGTV9UWVBFX0FETElCOworCWRldmMtPmZtX2luZm8ucGVyY19tb2RlID0gMDsKKwlkZXZjLT5mbV9pbmZvLm5yX3ZvaWNlcyA9IDk7CisJZGV2Yy0+Zm1faW5mby5ucl9kcnVtcyA9IDA7CisJZGV2Yy0+Zm1faW5mby5pbnN0cl9iYW5rX3NpemUgPSBTQkZNX01BWElOU1RSOworCWRldmMtPmZtX2luZm8uY2FwYWJpbGl0aWVzID0gMDsKKwlkZXZjLT5sZWZ0X2lvID0gaW9hZGRyOworCWRldmMtPnJpZ2h0X2lvID0gaW9hZGRyICsgMjsKKworCWlmIChkZXRlY3RlZF9tb2RlbCA8PSAyKQorCQlkZXZjLT5tb2RlbCA9IDE7CisJZWxzZQorCXsKKwkJZGV2Yy0+bW9kZWwgPSAyOworCQlpZiAoZGV0ZWN0ZWRfbW9kZWwgPT0gNCkKKwkJCWRldmMtPmlzX29wbDQgPSAxOworCX0KKworCW9wbDNfb3BlcmF0aW9ucy5pbmZvID0gJmRldmMtPmZtX2luZm87CisKKwlzeW50aF9kZXZzW21lXSA9ICZvcGwzX29wZXJhdGlvbnM7CisKKwlpZiAob3duZXIpCisJCXN5bnRoX2RldnNbbWVdLT5vd25lciA9IG93bmVyOworCQorCXNlcXVlbmNlcl9pbml0KCk7CisJZGV2Yy0+dl9hbGxvYyA9ICZvcGwzX29wZXJhdGlvbnMuYWxsb2M7CisJZGV2Yy0+Y2huX2luZm8gPSAmb3BsM19vcGVyYXRpb25zLmNobl9pbmZvWzBdOworCisJaWYgKGRldmMtPm1vZGVsID09IDIpCisJeworCQlpZiAoZGV2Yy0+aXNfb3BsNCkgCisJCQlzdHJjcHkoZGV2Yy0+Zm1faW5mby5uYW1lLCAiWWFtYWhhIE9QTDQvT1BMMyBGTSIpOworCQllbHNlIAorCQkJc3RyY3B5KGRldmMtPmZtX2luZm8ubmFtZSwgIllhbWFoYSBPUEwzIik7CisKKwkJZGV2Yy0+dl9hbGxvYy0+bWF4X3ZvaWNlID0gZGV2Yy0+bnJfdm9pY2UgPSAxODsKKwkJZGV2Yy0+Zm1faW5mby5ucl9kcnVtcyA9IDA7CisJCWRldmMtPmZtX2luZm8uc3ludGhfc3VidHlwZSA9IEZNX1RZUEVfT1BMMzsKKwkJZGV2Yy0+Zm1faW5mby5jYXBhYmlsaXRpZXMgfD0gU1lOVEhfQ0FQX09QTDM7CisKKwkJZm9yIChpID0gMDsgaSA8IDE4OyBpKyspCisJCXsKKwkJCWlmIChwdl9tYXBbaV0uaW9hZGRyID09IFVTRV9MRUZUKQorCQkJCXB2X21hcFtpXS5pb2FkZHIgPSBkZXZjLT5sZWZ0X2lvOworCQkJZWxzZQorCQkJCXB2X21hcFtpXS5pb2FkZHIgPSBkZXZjLT5yaWdodF9pbzsKKwkJfQorCQlvcGwzX2NvbW1hbmQoZGV2Yy0+cmlnaHRfaW8sIE9QTDNfTU9ERV9SRUdJU1RFUiwgT1BMM19FTkFCTEUpOworCQlvcGwzX2NvbW1hbmQoZGV2Yy0+cmlnaHRfaW8sIENPTk5FQ1RJT05fU0VMRUNUX1JFR0lTVEVSLCAweDAwKTsKKwl9CisJZWxzZQorCXsKKwkJc3RyY3B5KGRldmMtPmZtX2luZm8ubmFtZSwgIllhbWFoYSBPUEwyIik7CisJCWRldmMtPnZfYWxsb2MtPm1heF92b2ljZSA9IGRldmMtPm5yX3ZvaWNlID0gOTsKKwkJZGV2Yy0+Zm1faW5mby5ucl9kcnVtcyA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IDE4OyBpKyspCisJCQlwdl9tYXBbaV0uaW9hZGRyID0gZGV2Yy0+bGVmdF9pbzsKKwl9OworCWNvbmZfcHJpbnRmMihkZXZjLT5mbV9pbmZvLm5hbWUsIGlvYWRkciwgMCwgLTEsIC0xKTsKKworCWZvciAoaSA9IDA7IGkgPCBTQkZNX01BWElOU1RSOyBpKyspCisJCWRldmMtPmlfbWFwW2ldLmNoYW5uZWwgPSAtMTsKKworCXJldHVybiBtZTsKK30KKworRVhQT1JUX1NZTUJPTChvcGwzX2luaXQpOworRVhQT1JUX1NZTUJPTChvcGwzX2RldGVjdCk7CisKK3N0YXRpYyBpbnQgbWU7CisKK3N0YXRpYyBpbnQgaW8gPSAtMTsKKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X29wbDMgKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiWU0zODEyIGFuZCBPUEwtMyBkcml2ZXIgQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuLCBSb2IgSG9vZnQgMTk5My0xOTk2XG4iKTsKKworCWlmIChpbyAhPSAtMSkJLyogVXNlciBsb2FkaW5nIHB1cmUgT1BMMyBtb2R1bGUgKi8KKwl7CisJCWlmICghb3BsM19kZXRlY3QoaW8sIE5VTEwpKQorCQl7CisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCW1lID0gb3BsM19pbml0KGlvLCBOVUxMLCBUSElTX01PRFVMRSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX29wbDModm9pZCkKK3sKKwlpZiAoZGV2YyAmJiBpbyAhPSAtMSkKKwl7CisJCWlmIChkZXZjLT5iYXNlKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihkZXZjLT5iYXNlLDQpOworCQkJaWYgKGRldmMtPmlzX29wbDQpCisJCQkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSAtIDgsIDIpOworCQl9CisJCWtmcmVlKGRldmMpOworCQlkZXZjID0gTlVMTDsKKwkJc291bmRfdW5sb2FkX3N5bnRoZGV2KG1lKTsKKwl9Cit9CisKK21vZHVsZV9pbml0KGluaXRfb3BsMyk7Cittb2R1bGVfZXhpdChjbGVhbnVwX29wbDMpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfb3BsMyhjaGFyICpzdHIpCit7CisgICAgICAgIC8qIGlvICAqLworCWludCBpbnRzWzJdOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisJaW8gPSBpbnRzWzFdOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm9wbDM9Iiwgc2V0dXBfb3BsMyk7CisjZW5kaWYKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcGwzLmggYi9zb3VuZC9vc3Mvb3BsMy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzlhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvb3BsMy5oCkBAIC0wLDAgKzEsNSBAQAorCitpbnQgb3BsM19kZXRlY3QgKGludCBpb2FkZHIsIGludCAqb3NwKTsKK2ludCBvcGwzX2luaXQoaW50IGlvYWRkciwgaW50ICpvc3AsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKKwordm9pZCBlbmFibGVfb3BsM19tb2RlKGludCBsZWZ0LCBpbnQgcmlnaHQsIGludCBib3RoKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9vcGwzX2h3LmggYi9zb3VuZC9vc3Mvb3BsM19ody5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMTFjODkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvb3BsM19ody5oCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICoJb3BsM19ody5oCS0gRGVmaW5pdGlvbnMgb2YgdGhlIE9QTC0zIHJlZ2lzdGVycworICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKgorICoJVGhlIE9QTC0zIG1vZGUgaXMgc3dpdGNoZWQgb24gYnkgd3JpdGluZyAweDAxLCB0byB0aGUgb2Zmc2V0IDUKKyAqCW9mIHRoZSByaWdodCBzaWRlLgorICoKKyAqCUFub3RoZXIgc3BlY2lhbCByZWdpc3RlciBhdCB0aGUgcmlnaHQgc2lkZSBpcyBhdCBvZmZzZXQgNC4gSXQgY29udGFpbnMKKyAqCWEgYml0IG1hc2sgZGVmaW5pbmcgd2hpY2ggdm9pY2VzIGFyZSB1c2VkIGFzIDQgT1Agdm9pY2VzLgorICoKKyAqCVRoZSBwZXJjdXNzaXZlIG1vZGUgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIGxlZnQgc2lkZSBvbmx5LgorICoKKyAqCVdpdGggdGhlIGFib3ZlIGV4Y2VwdGlvbnMgdGhlIGJvdGggc2lkZXMgY2FuIGJlIG9wZXJhdGVkIGluZGVwZW5kZW50bHkuCisgKgkKKyAqCUEgNCBPUCB2b2ljZSBjYW4gYmUgY3JlYXRlZCBieSBzZXR0aW5nIHRoZSBjb3JyZXNwb25kaW5nCisgKgliaXQgYXQgb2Zmc2V0IDQgb2YgdGhlIHJpZ2h0IHNpZGUuCisgKgorICoJRm9yIGV4YW1wbGUgc2V0dGluZyB0aGUgcmlnaHRtb3N0IGJpdCAoMHgwMSkgY2hhbmdlcyB0aGUKKyAqCWZpcnN0IHZvaWNlIG9uIHRoZSByaWdodCBzaWRlIHRvIHRoZSA0IE9QIG1vZGUuIFRoZSBmb3VydGgKKyAqCXZvaWNlIGlzIG1hZGUgaW5hY2Nlc3NpYmxlLgorICoKKyAqCUlmIGEgdm9pY2UgaXMgc2V0IHRvIHRoZSAyIE9QIG1vZGUsIGl0IHdvcmtzIGxpa2UgMiBPUCBtb2RlcworICoJb2YgdGhlIG9yaWdpbmFsIFlNMzgxMiAoQWRMaWIpLiBJbiBhZGRpdGlvbiB0aGUgdm9pY2UgY2FuIAorICoJYmUgY29ubmVjdGVkIHRoZSBsZWZ0LCByaWdodCBvciBib3RoIHN0ZXJlbyBjaGFubmVscy4gSXQgY2FuCisgKglldmVuIGJlIGxlZnQgdW5jb25uZWN0ZWQuIFRoaXMgd29ya3Mgd2l0aCA0IE9QIHZvaWNlcyBhbHNvLgorICoKKyAqCVRoZSBzdGVyZW8gY29ubmVjdGlvbiBiaXRzIGFyZSBsb2NhdGVkIGluIHRoZSBGRUVEQkFDS19DT05ORUNUSU9OCisgKglyZWdpc3RlciBvZiB0aGUgdm9pY2UgKDB4QzAtMHhDOCkuIEluIDQgT1Agdm9pY2VzIHRoZXNlIGJpdHMgYXJlCisgKglpbiB0aGUgc2Vjb25kIGhhbGYgb2YgdGhlIHZvaWNlLgorICovCisKKy8qCisgKglSZWdpc3RlciBudW1iZXJzIGZvciB0aGUgZ2xvYmFsIHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgVEVTVF9SRUdJU1RFUgkJCQkweDAxCisjZGVmaW5lICAgRU5BQkxFX1dBVkVfU0VMRUNUCQkweDIwCisKKyNkZWZpbmUgVElNRVIxX1JFR0lTVEVSCQkJCTB4MDIKKyNkZWZpbmUgVElNRVIyX1JFR0lTVEVSCQkJCTB4MDMKKyNkZWZpbmUgVElNRVJfQ09OVFJPTF9SRUdJU1RFUgkJCTB4MDQJLyogTGVmdCBzaWRlICovCisjZGVmaW5lICAgSVJRX1JFU0VUCQkJMHg4MAorI2RlZmluZSAgIFRJTUVSMV9NQVNLCQkJMHg0MAorI2RlZmluZSAgIFRJTUVSMl9NQVNLCQkJMHgyMAorI2RlZmluZSAgIFRJTUVSMV9TVEFSVAkJCTB4MDEKKyNkZWZpbmUgICBUSU1FUjJfU1RBUlQJCQkweDAyCisKKyNkZWZpbmUgQ09OTkVDVElPTl9TRUxFQ1RfUkVHSVNURVIJCTB4MDQJLyogUmlnaHQgc2lkZSAqLworI2RlZmluZSAgIFJJR0hUXzRPUF8wCQkJMHgwMQorI2RlZmluZSAgIFJJR0hUXzRPUF8xCQkJMHgwMgorI2RlZmluZSAgIFJJR0hUXzRPUF8yCQkJMHgwNAorI2RlZmluZSAgIExFRlRfNE9QXzAJCQkweDA4CisjZGVmaW5lICAgTEVGVF80T1BfMQkJCTB4MTAKKyNkZWZpbmUgICBMRUZUXzRPUF8yCQkJMHgyMAorCisjZGVmaW5lIE9QTDNfTU9ERV9SRUdJU1RFUgkJCTB4MDUJLyogUmlnaHQgc2lkZSAqLworI2RlZmluZSAgIE9QTDNfRU5BQkxFCQkJMHgwMQorI2RlZmluZSAgIE9QTDRfRU5BQkxFCQkJMHgwMgorCisjZGVmaW5lIEtCRF9TUExJVF9SRUdJU1RFUgkJCTB4MDgJLyogTGVmdCBzaWRlICovCisjZGVmaW5lICAgQ09NUE9TSVRFX1NJTkVfV0FWRV9NT0RFCTB4ODAJCS8qIERvbid0IHVzZSB3aXRoIE9QTC0zPyAqLworI2RlZmluZSAgIEtFWUJPQVJEX1NQTElUCQkweDQwCisKKyNkZWZpbmUgUEVSQ09TU0lPTl9SRUdJU1RFUgkJCTB4YmQJLyogTGVmdCBzaWRlIG9ubHkgKi8KKyNkZWZpbmUgICBUUkVNT0xPX0RFUFRICQkJMHg4MAorI2RlZmluZSAgIFZJQlJBVE9fREVQVEgJCQkweDQwCisjZGVmaW5lCSAgUEVSQ09TU0lPTl9FTkFCTEUJCTB4MjAKKyNkZWZpbmUgICBCQVNTRFJVTV9PTgkJCTB4MTAKKyNkZWZpbmUgICBTTkFSRURSVU1fT04JCQkweDA4CisjZGVmaW5lICAgVE9NVE9NX09OCQkJMHgwNAorI2RlZmluZSAgIENZTUJBTF9PTgkJCTB4MDIKKyNkZWZpbmUgICBISUhBVF9PTgkJCTB4MDEKKworLyoKKyAqCU9mZnNldHMgdG8gdGhlIHJlZ2lzdGVyIGJhbmtzIGZvciBvcGVyYXRvcnMuIFRvIGdldCB0aGUKKyAqCXJlZ2lzdGVyIG51bWJlciBqdXN0IGFkZCB0aGUgb3BlcmF0b3Igb2Zmc2V0IHRvIHRoZSBiYW5rIG9mZnNldAorICoKKyAqCUFNL1ZJQi9FRy9LU1IvTXVsdGlwbGUgKDB4MjAgdG8gMHgzNSkKKyAqLworI2RlZmluZSBBTV9WSUIJCQkJCTB4MjAKKyNkZWZpbmUgICBUUkVNT0xPX09OCQkJMHg4MAorI2RlZmluZSAgIFZJQlJBVE9fT04JCQkweDQwCisjZGVmaW5lICAgU1VTVEFJTl9PTgkJCTB4MjAKKyNkZWZpbmUgICBLU1IJCQkJMHgxMCAJLyogS2V5IHNjYWxpbmcgcmF0ZSAqLworI2RlZmluZSAgIE1VTFRJUExFX01BU0sJCTB4MGYJLyogRnJlcXVlbmN5IG11bHRpcGxpZXIgKi8KKworIC8qCisgICoJS1NML1RvdGFsIGxldmVsICgweDQwIHRvIDB4NTUpCisgICovCisjZGVmaW5lIEtTTF9MRVZFTAkJCQkweDQwCisjZGVmaW5lICAgS1NMX01BU0sJCQkweGMwCS8qIEVudmVsb3BlIHNjYWxpbmcgYml0cyAqLworI2RlZmluZSAgIFRPVEFMX0xFVkVMX01BU0sJCTB4M2YJLyogU3RyZW5ndGggKHZvbHVtZSkgb2YgT1AgKi8KKworLyoKKyAqCUF0dGFjayAvIERlY2F5IHJhdGUgKDB4NjAgdG8gMHg3NSkKKyAqLworI2RlZmluZSBBVFRBQ0tfREVDQVkJCQkJMHg2MAorI2RlZmluZSAgIEFUVEFDS19NQVNLCQkJMHhmMAorI2RlZmluZSAgIERFQ0FZX01BU0sJCQkweDBmCisKKy8qCisgKiBTdXN0YWluIGxldmVsIC8gUmVsZWFzZSByYXRlICgweDgwIHRvIDB4OTUpCisgKi8KKyNkZWZpbmUgU1VTVEFJTl9SRUxFQVNFCQkJCTB4ODAKKyNkZWZpbmUgICBTVVNUQUlOX01BU0sJCQkweGYwCisjZGVmaW5lICAgUkVMRUFTRV9NQVNLCQkJMHgwZgorCisvKgorICogV2F2ZSBzZWxlY3QgKDB4RTAgdG8gMHhGNSkKKyAqLworI2RlZmluZSBXQVZFX1NFTEVDVAkJCTB4ZTAKKworLyoKKyAqCU9mZnNldHMgdG8gdGhlIHJlZ2lzdGVyIGJhbmtzIGZvciB2b2ljZXMuIEp1c3QgYWRkIHRvIHRoZQorICoJdm9pY2UgbnVtYmVyIHRvIGdldCB0aGUgcmVnaXN0ZXIgbnVtYmVyLgorICoKKyAqCUYtTnVtYmVyIGxvdyBiaXRzICgweEEwIHRvIDB4QTgpLgorICovCisjZGVmaW5lIEZOVU1fTE9XCQkJCTB4YTAKKworLyoKKyAqCUYtbnVtYmVyIGhpZ2ggYml0cyAvIEtleSBvbiAvIEJsb2NrIChvY3RhdmUpICgweEIwIHRvIDB4QjgpCisgKi8KKyNkZWZpbmUgS0VZT05fQkxPQ0sJCQkJCTB4YjAKKyNkZWZpbmUJICBLRVlPTl9CSVQJCQkJMHgyMAorI2RlZmluZQkgIEJMT0NLTlVNX01BU0sJCQkJMHgxYworI2RlZmluZSAgIEZOVU1fSElHSF9NQVNLCQkJMHgwMworCisvKgorICoJRmVlZGJhY2sgLyBDb25uZWN0aW9uICgweGMwIHRvIDB4YzgpCisgKgorICoJVGhlc2UgcmVnaXN0ZXJzIGhhdmUgdHdvIG5ldyBiaXRzIHdoZW4gdGhlIE9QTC0zIG1vZGUKKyAqCWlzIHNlbGVjdGVkLiBUaGVzZSBiaXRzIGNvbnRyb2xzIGNvbm5lY3RpbmcgdGhlIHZvaWNlCisgKgl0byB0aGUgc3RlcmVvIGNoYW5uZWxzLiBGb3IgNCBPUCB2b2ljZXMgdGhpcyBiaXQgaXMKKyAqCWRlZmluZWQgaW4gdGhlIHNlY29uZCBoYWxmIG9mIHRoZSB2b2ljZSAoYWRkIDMgdG8gdGhlCisgKglyZWdpc3RlciBvZmZzZXQpLgorICoKKyAqCUZvciA0IE9QIHZvaWNlcyB0aGUgY29ubmVjdGlvbiBiaXQgaXMgdXNlZCBpbiB0aGUKKyAqCWJvdGggaGFsdmVzIChnaXZlcyA0IHdheXMgdG8gY29ubmVjdCB0aGUgb3BlcmF0b3JzKS4KKyAqLworI2RlZmluZSBGRUVEQkFDS19DT05ORUNUSU9OCQkJCTB4YzAKKyNkZWZpbmUgICBGRUVEQkFDS19NQVNLCQkJCTB4MGUJLyogVmFsaWQganVzdCBmb3IgMXN0IE9QIG9mIGEgdm9pY2UgKi8KKyNkZWZpbmUgICBDT05ORUNUSU9OX0JJVAkJCTB4MDEKKy8qCisgKglJbiB0aGUgNCBPUCBtb2RlIHRoZXJlIGlzIGZvdXIgcG9zc2libGUgY29uZmlndXJhdGlvbnMgaG93IHRoZQorICoJb3BlcmF0b3JzIGNhbiBiZSBjb25uZWN0ZWQgdG9nZXRoZXIgKGluIDIgT1AgbW9kZXMgdGhlcmUgaXMganVzdAorICoJQU0gb3IgRk0pLiBUaGUgNCBPUCBjb25uZWN0aW9uIG1vZGUgaXMgZGVmaW5lZCBieSB0aGUgcmlnaHRtb3N0CisgKgliaXQgb2YgdGhlIEZFRURCQUNLX0NPTk5FQ1RJT04gKDB4QzAtMHhDOCkgb24gdGhlIGJvdGggaGFsdmVzLgorICoKKyAqCUZpcnN0IGhhbGYJU2Vjb25kIGhhbGYJTW9kZQorICoKKyAqCQkJCQkgKy0tLSsKKyAqCQkJCQkgdiAgIHwKKyAqCTAJCTAJCT4rLTEtKy0tMi0tMy0tNC0tPgorICoKKyAqCisgKgkJCQkJCisgKgkJCQkJICstLS0rCisgKgkJCQkJIHwgICB8CisgKgkwCQkxCQk+Ky0xLSstLTItKworICoJCQkJCQkgIHwtPgorICoJCQkJCT4tLTMtLS0tNC0rCisgKgkJCQkJCisgKgkJCQkJICstLS0rCisgKgkJCQkJIHwgICB8CisgKgkxCQkwCQk+Ky0xLSstLS0tLSsKKyAqCQkJCQkJICAgfC0+CisgKgkJCQkJPi0tMi0tMy0tNC0rCisgKgorICoJCQkJCSArLS0tKworICoJCQkJCSB8ICAgfAorICoJMQkJMQkJPistMS0rLS0rCisgKgkJCQkJCXwKKyAqCQkJCQk+LS0yLS0zLSstPgorICoJCQkJCQl8CisgKgkJCQkJPi0tNC0tLS0rCisgKi8KKyNkZWZpbmUgICBTVEVSRU9fQklUUwkJCQkweDMwCS8qIE9QTC0zIG9ubHkgKi8KKyNkZWZpbmUgICAgIFZPSUNFX1RPX0xFRlQJCTB4MTAKKyNkZWZpbmUgICAgIFZPSUNFX1RPX1JJR0hUCQkweDIwCisKKy8qCisgKiAJRGVmaW5pdGlvbiB0YWJsZSBmb3IgdGhlIHBoeXNpY2FsIHZvaWNlcworICovCisKK3N0cnVjdCBwaHlzaWNhbF92b2ljZV9pbmZvIHsKKwkJdW5zaWduZWQgY2hhciB2b2ljZV9udW07CisJCXVuc2lnbmVkIGNoYXIgdm9pY2VfbW9kZTsgLyogMD11bmF2YWlsYWJsZSwgMj0yIE9QLCA0PTQgT1AgKi8KKwkJdW5zaWduZWQgc2hvcnQgaW9hZGRyOyAvKiBJL08gcG9ydCAobGVmdCBvciByaWdodCBzaWRlKSAqLworCQl1bnNpZ25lZCBjaGFyIG9wWzRdOyAvKiBPcGVyYXRvciBvZmZzZXRzICovCisJfTsKKworLyoKKyAqCVRoZXJlIGlzIDE4IHBvc3NpYmxlIDIgT1Agdm9pY2VzCisgKgkoOSBpbiB0aGUgbGVmdCBhbmQgOSBpbiB0aGUgcmlnaHQpLgorICoJVGhlIGZpcnN0IE9QIGlzIHRoZSBtb2R1bGF0b3IgYW5kIDJuZCBpcyB0aGUgY2Fycmllci4KKyAqCisgKglUaGUgZmlyc3QgdGhyZWUgdm9pY2VzIGluIHRoZSBib3RoIHNpZGVzIG1heSBiZSBjb25uZWN0ZWQKKyAqCXdpdGggYW5vdGhlciB2b2ljZSB0byBhIDQgT1Agdm9pY2UuIEZvciBleGFtcGxlIHZvaWNlIDAKKyAqCWNhbiBiZSBjb25uZWN0ZWQgd2l0aCB2b2ljZSAzLiBUaGUgb3BlcmF0b3JzIG9mIHZvaWNlIDMgYXJlCisgKgl1c2VkIGFzIG9wZXJhdG9ycyAzIGFuZCA0IG9mIHRoZSBuZXcgNCBPUCB2b2ljZS4KKyAqCUluIHRoaXMgY2FzZSB0aGUgMiBPUCB2b2ljZSBudW1iZXIgMCBpcyB0aGUgJ2ZpcnN0IGhhbGYnIGFuZAorICoJdm9pY2UgMyBpcyB0aGUgc2Vjb25kLgorICovCisKKyNkZWZpbmUgVVNFX0xFRlQJMAorI2RlZmluZSBVU0VfUklHSFQJMQorCitzdGF0aWMgc3RydWN0IHBoeXNpY2FsX3ZvaWNlX2luZm8gcHZfbWFwWzE4XSA9Cit7CisvKiAgICAgICBObyBNb2RlIFNpZGUJCU9QMQlPUDIJT1AzICAgT1A0CSovCisvKgktLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JKi8KKwl7IDAsICAyLCBVU0VfTEVGVCwJezB4MDAsCTB4MDMsCTB4MDgsIDB4MGJ9fSwKKwl7IDEsICAyLCBVU0VfTEVGVCwJezB4MDEsCTB4MDQsCTB4MDksIDB4MGN9fSwKKwl7IDIsICAyLCBVU0VfTEVGVCwJezB4MDIsCTB4MDUsCTB4MGEsIDB4MGR9fSwKKworCXsgMywgIDIsIFVTRV9MRUZULAl7MHgwOCwJMHgwYiwJMHgwMCwgMHgwMH19LAorCXsgNCwgIDIsIFVTRV9MRUZULAl7MHgwOSwJMHgwYywJMHgwMCwgMHgwMH19LAorCXsgNSwgIDIsIFVTRV9MRUZULAl7MHgwYSwJMHgwZCwJMHgwMCwgMHgwMH19LAorCisJeyA2LCAgMiwgVVNFX0xFRlQsCXsweDEwLAkweDEzLAkweDAwLCAweDAwfX0sIC8qIFVzZWQgYnkgcGVyY3Vzc2l2ZSB2b2ljZXMgKi8KKwl7IDcsICAyLCBVU0VfTEVGVCwJezB4MTEsCTB4MTQsCTB4MDAsIDB4MDB9fSwgLyogaWYgdGhlIHBlcmN1c3NpdmUgbW9kZSAqLworCXsgOCwgIDIsIFVTRV9MRUZULAl7MHgxMiwJMHgxNSwJMHgwMCwgMHgwMH19LCAvKiBpcyBzZWxlY3RlZCAqLworCisJeyAwLCAgMiwgVVNFX1JJR0hULAl7MHgwMCwJMHgwMywJMHgwOCwgMHgwYn19LAorCXsgMSwgIDIsIFVTRV9SSUdIVCwJezB4MDEsCTB4MDQsCTB4MDksIDB4MGN9fSwKKwl7IDIsICAyLCBVU0VfUklHSFQsCXsweDAyLAkweDA1LAkweDBhLCAweDBkfX0sCisKKwl7IDMsICAyLCBVU0VfUklHSFQsCXsweDA4LAkweDBiLAkweDAwLCAweDAwfX0sCisJeyA0LCAgMiwgVVNFX1JJR0hULAl7MHgwOSwJMHgwYywJMHgwMCwgMHgwMH19LAorCXsgNSwgIDIsIFVTRV9SSUdIVCwJezB4MGEsCTB4MGQsCTB4MDAsIDB4MDB9fSwKKworCXsgNiwgIDIsIFVTRV9SSUdIVCwJezB4MTAsCTB4MTMsCTB4MDAsIDB4MDB9fSwKKwl7IDcsICAyLCBVU0VfUklHSFQsCXsweDExLAkweDE0LAkweDAwLCAweDAwfX0sCisJeyA4LCAgMiwgVVNFX1JJR0hULAl7MHgxMiwJMHgxNSwJMHgwMCwgMHgwMH19Cit9OworLyoKKyAqCURNQSBidWZmZXIgY2FsbHMKKyAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL29wbDNzYS5jIGIvc291bmQvb3NzL29wbDNzYS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNDkwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvb3BsM3NhLmMKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBzb3VuZC9vcGwzc2EuYworICoKKyAqIExvdyBsZXZlbCBkcml2ZXIgZm9yIFlhbWFoYSBZTUY3MDFCIGFrYSBPUEwzLVNBIGNoaXAKKyAqIAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBDaGFuZ2VzOgorICoJQWxhbiBDb3gJCU1vZHVsYXJpc2F0aW9uCisgKglDaHJpc3RvcGggSGVsbHdpZwlBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKglBcm5hbGRvIEMuIGRlIE1lbG8JZ290IHJpZCBvZiBhdHRhY2hfdWFydDQwMQorICoKKyAqIEZJWE1FOgorICogCUNoZWNrIGZvciBpbnN0YWxsIG9mIG1wdSBldGMgaXMgd3JvbmcsIHNob3VsZCBjaGVjayByZXN1bHQgb2YgdGhlIG1zcyBzdHVmZgorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI3VuZGVmICBTQl9PSworCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJhZDE4NDguaCIKKyNpbmNsdWRlICJtcHU0MDEuaCIKKworI2lmZGVmIFNCX09LCisjaW5jbHVkZSAic2IuaCIKK3N0YXRpYyBpbnQgc2JfaW5pdGlhbGl6ZWQ7CisjZW5kaWYKKworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgb3BsM3NhX3JlYWQoaW50IGFkZHIpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHRtcDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwlvdXRiKCgweDFkKSwgMHhmODYpOwkvKiBwYXNzd29yZCAqLworCW91dGIoKCh1bnNpZ25lZCBjaGFyKSBhZGRyKSwgMHhmODYpOwkvKiBhZGRyZXNzICovCisJdG1wID0gaW5iKDB4Zjg3KTsJLyogZGF0YSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCisJcmV0dXJuIHRtcDsKK30KKworc3RhdGljIHZvaWQgb3BsM3NhX3dyaXRlKGludCBhZGRyLCBpbnQgZGF0YSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCW91dGIoKDB4MWQpLCAweGY4Nik7CS8qIHBhc3N3b3JkICovCisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIGFkZHIpLCAweGY4Nik7CS8qIGFkZHJlc3MgKi8KKwlvdXRiKCgodW5zaWduZWQgY2hhcikgZGF0YSksIDB4Zjg3KTsJLyogZGF0YSAqLworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBvcGwzc2FfZGV0ZWN0KHZvaWQpCit7CisJaW50IHRtcDsKKworCWlmICgoKHRtcCA9IG9wbDNzYV9yZWFkKDB4MDEpKSAmIDB4YzQpICE9IDB4MDQpCisJeworCQlEREIocHJpbnRrKCJPUEwzLVNBIGRldGVjdCBlcnJvciAxICgleClcbiIsIG9wbDNzYV9yZWFkKDB4MDEpKSk7CisJCS8qIHJldHVybiAwOyAqLworCX0KKworCS8qCisJICogQ2hlY2sgdGhhdCB0aGUgcGFzc3dvcmQgZmVhdHVyZSBoYXMgYW55IGVmZmVjdAorCSAqLworCQorCWlmIChpbmIoMHhmODcpID09IHRtcCkKKwl7CisJCUREQihwcmludGsoIk9QTDMtU0EgZGV0ZWN0IGZhaWxlZCAyICgleC8leClcbiIsIHRtcCwgaW5iKDB4Zjg3KSkpOworCQlyZXR1cm4gMDsKKwl9CisJdG1wID0gKG9wbDNzYV9yZWFkKDB4MDQpICYgMHhlMCkgPj4gNTsKKworCWlmICh0bXAgIT0gMCAmJiB0bXAgIT0gMSkKKwl7CisJCUREQihwcmludGsoIk9QTDMtU0EgZGV0ZWN0IGZhaWxlZCAzICglZClcbiIsIHRtcCkpOworCQlyZXR1cm4gMDsKKwl9CisJRERCKHByaW50aygiT1BMMy1TQSBtb2RlICV4IGRldGVjdGVkXG4iLCB0bXApKTsKKworCW9wbDNzYV93cml0ZSgweDAxLCAweDAwKTsJLyogRGlzYWJsZSBNU1MgKi8KKwlvcGwzc2Ffd3JpdGUoMHgwMiwgMHgwMCk7CS8qIERpc2FibGUgU0IgKi8KKwlvcGwzc2Ffd3JpdGUoMHgwMywgMHgwMCk7CS8qIERpc2FibGUgTVBVICovCisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqICAgIFByb2JlIGFuZCBhdHRhY2ggcm91dGluZXMgZm9yIHRoZSBXaW5kb3dzIFNvdW5kIFN5c3RlbSBtb2RlIG9mCisgKiAgICAgT1BMMy1TQQorICovCisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX29wbDNzYV93c3Moc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzKQoreworCXVuc2lnbmVkIGNoYXIgdG1wID0gMHgyNDsJLyogV1NTIGVuYWJsZSAqLworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgSU8gcG9ydCByZXR1cm5zIHZhbGlkIHNpZ25hdHVyZS4gVGhlIG9yaWdpbmFsIE1TIFNvdW5kCisJICogc3lzdGVtIHJldHVybnMgMHgwNCB3aGlsZSBzb21lIGNhcmRzIChPUEwzLVNBIGZvciBleGFtcGxlKQorCSAqIHJldHVybiAweDAwLgorCSAqLworCisJaWYgKCFvcGwzc2FfZGV0ZWN0KCkpCisJeworCQlwcmludGsoS0VSTl9FUlIgIk9TUzogT1BMMy1TQSBjaGlwIG5vdCBmb3VuZFxuIik7CisJCXJldHVybiAwOworCX0KKwkKKwlzd2l0Y2ggKGh3X2NvbmZpZy0+aW9fYmFzZSkKKwl7CisJCWNhc2UgMHg1MzA6CisJCQl0bXAgfD0gMHgwMDsKKwkJCWJyZWFrOworCQljYXNlIDB4ZTgwOgorCQkJdG1wIHw9IDB4MDg7CisJCQlicmVhazsKKwkJY2FzZSAweGY0MDoKKwkJCXRtcCB8PSAweDEwOworCQkJYnJlYWs7CisJCWNhc2UgMHg2MDQ6CisJCQl0bXAgfD0gMHgxODsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJPU1M6IFVuc3VwcG9ydGVkIE9QTDMtU0EvV1NTIGJhc2UgJXhcbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSk7CisJCSAgcmV0dXJuIDA7CisJfQorCisJb3BsM3NhX3dyaXRlKDB4MDEsIHRtcCk7CS8qIFdTUyBzZXR1cCByZWdpc3RlciAqLworCisJcmV0dXJuIHByb2JlX21zX3NvdW5kKGh3X2NvbmZpZywgcG9ydHMpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX29wbDNzYV93c3Moc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzKQoreworCWludCBubSA9IG51bV9taXhlcnM7CisKKwkvKiBGSVhNRSAqLworCWF0dGFjaF9tc19zb3VuZChod19jb25maWcsIHBvcnRzLCBUSElTX01PRFVMRSk7CisJaWYgKG51bV9taXhlcnMgPiBubSkJLyogQSBtaXhlciB3YXMgaW5zdGFsbGVkICovCisJeworCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMSwgU09VTkRfTUlYRVJfQ0QpOworCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMiwgU09VTkRfTUlYRVJfU1lOVEgpOworCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMywgU09VTkRfTUlYRVJfTElORSk7CisJfQorfQorCisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX29wbDNzYV9tcHUoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVuc2lnbmVkIGNoYXIgY29uZjsKKwlzdGF0aWMgc2lnbmVkIGNoYXIgaXJxX2JpdHNbXSA9IHsKKwkJLTEsIC0xLCAtMSwgLTEsIC0xLCAxLCAtMSwgMiwgLTEsIDMsIDQKKwl9OworCisJaWYgKGh3X2NvbmZpZy0+aXJxID4gMTApCisJeworCQlwcmludGsoS0VSTl9FUlIgIk9QTDMtU0E6IEJhZCBNUFUgSVJRICVkXG4iLCBod19jb25maWctPmlycSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoaXJxX2JpdHNbaHdfY29uZmlnLT5pcnFdID09IC0xKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJPUEwzLVNBOiBCYWQgTVBVIElSUSAlZFxuIiwgaHdfY29uZmlnLT5pcnEpOworCQlyZXR1cm4gMDsKKwl9CisJc3dpdGNoIChod19jb25maWctPmlvX2Jhc2UpCisJeworCQljYXNlIDB4MzMwOgorCQkJY29uZiA9IDB4MDA7CisJCQlicmVhazsKKwkJY2FzZSAweDMzMjoKKwkJCWNvbmYgPSAweDIwOworCQkJYnJlYWs7CisJCWNhc2UgMHgzMzQ6CisJCQljb25mID0gMHg0MDsKKwkJCWJyZWFrOworCQljYXNlIDB4MzAwOgorCQkJY29uZiA9IDB4NjA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOwkvKiBJbnZhbGlkIHBvcnQgKi8KKwl9CisKKwljb25mIHw9IDB4ODM7CQkvKiBNUFUgJiBPUEwzIChzeW50aCkgJiBnYW1lIHBvcnQgZW5hYmxlICovCisJY29uZiB8PSBpcnFfYml0c1tod19jb25maWctPmlycV0gPDwgMjsKKworCW9wbDNzYV93cml0ZSgweDAzLCBjb25mKTsKKworCWh3X2NvbmZpZy0+bmFtZSA9ICJPUEwzLVNBIChNUFU0MDEpIjsKKworCXJldHVybiBwcm9iZV91YXJ0NDAxKGh3X2NvbmZpZywgVEhJU19NT0RVTEUpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX29wbDNzYV93c3Moc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWludCBkbWEyID0gaHdfY29uZmlnLT5kbWEyOworCisJaWYgKGRtYTIgPT0gLTEpCisJCWRtYTIgPSBod19jb25maWctPmRtYTsKKworCXJlbGVhc2VfcmVnaW9uKDB4Zjg2LCAyKTsKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDQpOworCisJYWQxODQ4X3VubG9hZChod19jb25maWctPmlvX2Jhc2UgKyA0LAorCQkgICAgICBod19jb25maWctPmlycSwKKwkJICAgICAgaHdfY29uZmlnLT5kbWEsCisJCSAgICAgIGRtYTIsCisJCSAgICAgIDApOworCXNvdW5kX3VubG9hZF9hdWRpb2Rldihod19jb25maWctPnNsb3RzWzBdKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCB1bmxvYWRfb3BsM3NhX21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5sb2FkX3VhcnQ0MDEoaHdfY29uZmlnKTsKK30KKworI2lmZGVmIFNCX09LCitzdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF9vcGwzc2Ffc2Ioc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXNiX2RzcF91bmxvYWQoaHdfY29uZmlnKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGZvdW5kX21wdTsKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21wdTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGlvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMgk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIG1wdV9pbwk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIG1wdV9pcnEJPSAtMTsKKworbW9kdWxlX3BhcmFtKGlvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hMiwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtcHVfaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXB1X2lycSwgaW50LCAwKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9vcGwzc2Eodm9pZCkKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCWlmIChpbyA9PSAtMSB8fCBpcnEgPT0gLTEgfHwgZG1hID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAib3BsM3NhOiBkbWEsIGlycSBhbmQgaW8gbXVzdCBiZSBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2ZnLmlvX2Jhc2UgPSBpbzsKKwljZmcuaXJxID0gaXJxOworCWNmZy5kbWEgPSBkbWE7CisJY2ZnLmRtYTIgPSBkbWEyOworCQorCWNmZ19tcHUuaW9fYmFzZSA9IG1wdV9pbzsKKwljZmdfbXB1LmlycSA9IG1wdV9pcnE7CisKKwlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGlvICsgNCwgNCwgImFkMTg0OCIpOworCWlmICghcG9ydHMpCisJCXJldHVybiAtRUJVU1k7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKDB4Zjg2LCAyLCAiT1BMMy1TQSIpKS8qIENvbnRyb2wgcG9ydCBpcyBidXN5ICovIHsKKwkJcmVsZWFzZV9yZWdpb24oaW8gKyA0LCA0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihpbywgNCwgIldTUyBjb25maWciKSkgeworCQlyZWxlYXNlX3JlZ2lvbigweDg2LCAyKTsKKwkJcmVsZWFzZV9yZWdpb24oaW8gKyA0LCA0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHByb2JlX29wbDNzYV93c3MoJmNmZywgcG9ydHMpID09IDApIHsKKwkJcmVsZWFzZV9yZWdpb24oMHhmODYsIDIpOworCQlyZWxlYXNlX3JlZ2lvbihpbywgNCk7CisJCXJlbGVhc2VfcmVnaW9uKGlvICsgNCwgNCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWZvdW5kX21wdT1wcm9iZV9vcGwzc2FfbXB1KCZjZmdfbXB1KTsKKworCWF0dGFjaF9vcGwzc2Ffd3NzKCZjZmcsIHBvcnRzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfb3BsM3NhKHZvaWQpCit7CisJaWYoZm91bmRfbXB1KQorCQl1bmxvYWRfb3BsM3NhX21wdSgmY2ZnX21wdSk7CisJdW5sb2FkX29wbDNzYV93c3MoJmNmZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfb3BsM3NhKTsKK21vZHVsZV9leGl0KGNsZWFudXBfb3BsM3NhKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX29wbDNzYShjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSwgZG1hLCBkbWEyLCBtcHVfaW8sIG1wdV9pcnEgKi8KKwlpbnQgaW50c1s3XTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvCT0gaW50c1sxXTsKKwlpcnEJPSBpbnRzWzJdOworCWRtYQk9IGludHNbM107CisJZG1hMgk9IGludHNbNF07CisJbXB1X2lvCT0gaW50c1s1XTsKKwltcHVfaXJxCT0gaW50c1s2XTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJvcGwzc2E9Iiwgc2V0dXBfb3BsM3NhKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL29wbDNzYTIuYyBiL3NvdW5kL29zcy9vcGwzc2EyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0OTk2ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvb3BsM3NhMi5jCkBAIC0wLDAgKzEsMTEyOSBAQAorLyoKKyAqIHNvdW5kL29wbDNzYTIuYworICoKKyAqIEEgbG93IGxldmVsIGRyaXZlciBmb3IgWWFtYWhhIE9QTDMtU0EyIGFuZCBTQTMgY2FyZHMuCisgKiBOT1RFOiBBbGwgdHJhY2VzIG9mIHRoZSBuYW1lIE9QTDMtU0F4IGhhdmUgbm93IChEZWNlbWJlciAyMDAwKSBiZWVuCisgKiAgICAgICByZW1vdmVkIGZyb20gdGhlIGRyaXZlciBjb2RlLCBhcyBhbiBlbWFpbCBleGNoYW5nZSB3aXRoIFlhbWFoYQorICogICAgICAgcHJvdmlkZWQgdGhlIGluZm9ybWF0aW9uIHRoYXQgdGhlIFlNRi03MTkgaXMgaW5kZWVkIGp1c3QgYQorICogICAgICAgcmUtYmFkZ2VkIDcxNS4KKyAqCisgKiBDb3B5cmlnaHQgMTk5OC0yMDAxIFNjb3R0IE11cnJheSA8c2NvdHRAc3BpdGVmdWwub3JnPgorICoKKyAqIE9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIENTNDIzMiBkcml2ZXIgKGluIGNzNDIzMi5jKSBieSBIYW5udSBTYXZvbGFpbmVuCisgKiBhbmQgb3RoZXJzLiAgTm93IGluY29ycG9yYXRlcyBjb2RlL2lkZWFzIGZyb20gcHNzLmMsIGFsc28gYnkgSGFubnUKKyAqIFNhdm9sYWluZW4uICBCb3RoIG9mIHRob3NlIGZpbGVzIGFyZSBkaXN0cmlidXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqIGxpY2Vuc2U6CisgKgorICogIkNvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiAgT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqICBmb3IgbW9yZSBpbmZvLiIKKyAqCisgKiBBcyBzdWNoLCBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGFib3ZlIGxpY2Vuc2UsIHRoaXMgZmlsZSwgb3BsM3NhMi5jLCBpcworICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4KKyAqIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIENoYW5nZSBIaXN0b3J5CisgKiAtLS0tLS0tLS0tLS0tLQorICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgT3JpZ2luYWwgZHJpdmVyIChKdW4gMTQsIDE5OTgpCisgKiBQYXVsIEouWS4gTGFoYWllICAgICAgICBDaGFuZ2VkIHByb2JpbmcgLyBhdHRhY2ggY29kZSBvcmRlcgorICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQWRkZWQgbWl4ZXIgc3VwcG9ydCAoRGVjIDAzLCAxOTk4KQorICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQ2hhbmdlZCBkZXRlY3Rpb24gY29kZSB0byBiZSBtb3JlIGZvcmdpdmluZywKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIGZvcmNlIG9wdGlvbiBhcyBsYXN0IHJlc29ydCwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkIGlvY3RsIHJldHVybiB2YWx1ZXMuIChEZWMgMzAsIDE5OTgpCisgKiBTY290dCBNdXJyYXkgICAgICAgICAgICBTaW1wbGVyIGRldGVjdGlvbiBjb2RlIHNob3VsZCB3b3JrIGFsbCB0aGUgdGltZSBub3cKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICh3aXRoIHRoYW5rcyB0byBCZW4gSHV0Y2hpbmdzIGZvciB0aGUgaGV1cmlzdGljKSwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWQgbm93IHVubmVjZXNzYXJ5IGZvcmNlIG9wdGlvbi4gKEphbiA1LCAxOTk5KQorICogQ2hyaXN0b3BoIEhlbGx3aWcJICAgQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdCAoTWFyIDQsIDIwMDApCisgKiBTY290dCBNdXJyYXkgICAgICAgICAgICBSZXdvcmtlZCBTQTIgdmVyc3VzIFNBMyBtaXhlciBjb2RlLCB1cGRhdGVkIGNoaXBzZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gZGV0ZWN0aW9uIGNvZGUgKGFnYWluISkuIChEZWMgNSwgMjAwMCkKKyAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEFkanVzdGVkIG1hc3RlciB2b2x1bWUgbWl4ZXIgc2NhbGluZy4gKERlYyA2LCAyMDAwKQorICogU2NvdHQgTXVycmF5ICAgICAgICAgICAgQmFzZWQgb24gYSBwYXRjaCBieSBKb2VsIFlsaWx1b21hIChha2EgQmlzcXdpdCksCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGVkIHdpZGUgbWl4ZXIgYW5kIGFkanVzdGVkIG1pYywgYmFzcywgdHJlYmxlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nLiAoRGVjIDYsIDIwMDApCisgKiBTY290dCBNdXJyYXkgICAgICAgICAgICBCYXNlZCBvbiBhIHBhdGNoIGJ5IFBldGVyIEVuZ2xtYWllciwgaW50ZWdyYXRlZAorICogICAgICAgICAgICAgICAgICAgICAgICAgeW1vZGUgYW5kIGxvb3BiYWNrIG9wdGlvbnMuIChEZWMgNiwgMjAwMCkKKyAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEluc3BpcmVkIGJ5IGEgcGF0Y2ggYnkgUGV0ZXIgRW5nbG1haWVyLCBhbmQgYmFzZWQgb24KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHdoYXQgQUxTQSBkb2VzLCBhZGRlZCBpbml0aWFsaXphdGlvbiBjb2RlIGZvciB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgRE1BIGFuZCBJUlEgc2V0dGluZ3MuIChEZWMgNiwgMjAwMCkKKyAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEFkZGVkIHNvbWUgbW9yZSBjaGVja3MgdG8gdGhlIGNhcmQgZGV0ZWN0aW9uIGNvZGUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiB3aGF0IEFMU0EgZG9lcy4gKERlYyAxMiwgMjAwMCkKKyAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIEluc3BpcmVkIGJ5IHNpbWlsYXIgcGF0Y2hlcyBmcm9tIEpvaG4gRnJlbWxpbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEppbSBSYWRmb3JkLCBNaWtlIFJvbGlnLCBhbmQgSW5nbWFyIFN0ZWVuLCBhZGRlZCAyLjQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIElTQSBQblAgQVBJIHN1cHBvcnQsIG1haW5seSBiYXNlZCBvbiBiaXRzIGZyb20KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHNiX2NhcmQuYyBhbmQgYXdlX3dhdmUuYy4gKERlYyAxMiwgMjAwMCkKKyAqIFNjb3R0IE11cnJheSAgICAgICAgICAgIFNvbWUgc21hbGwgY2xlYW51cHMgdG8gdGhlIGluaXQgY29kZSBvdXRwdXQuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAoSmFuIDcsIDIwMDEpCisgKiBad2FuZSBNd2Fpa2FtYm8JICAgQWRkZWQgUE0gc3VwcG9ydC4gKERlYyA0IDIwMDEpCisgKgorICogQWRhbSBCZWxheSAgICAgICAgICAgICAgQ29udmVydGVkIGRyaXZlciB0byBuZXcgUG5QIExheWVyIChPY3QgMTIsIDIwMDIpCisgKiBad2FuZSBNd2Fpa2FtYm8JICAgQ29kZSwgZGF0YSBzdHJ1Y3R1cmUgY2xlYW51cHMuIChGZWIgMTUgMjAwMikKKyAqIFp3YW5lIE13YWlrYW1ibwkgICBGcmVlIHJlc291cmNlcyBkdXJpbmcgYXV4aWxpYXJ5IGRldmljZSBwcm9iZQorICogCQkJICAgZmFpbHVyZXMgKEFwciAyOSAyMDAyKQorICogICAKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvcG5wLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvcG0uaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgImFkMTg0OC5oIgorI2luY2x1ZGUgIm1wdTQwMS5oIgorCisjZGVmaW5lIE9QTDNTQTJfTU9EVUxFX05BTUUJIm9wbDNzYTIiCisjZGVmaW5lIFBGWAkJCU9QTDNTQTJfTU9EVUxFX05BTUUgIjogIgorCisvKiBVc2VmdWwgY29udHJvbCBwb3J0IGluZGV4ZXM6ICovCisjZGVmaW5lIE9QTDNTQTJfUE0JICAgICAweDAxCisjZGVmaW5lIE9QTDNTQTJfU1lTX0NUUkwgICAgIDB4MDIKKyNkZWZpbmUgT1BMM1NBMl9JUlFfQ09ORklHICAgMHgwMworI2RlZmluZSBPUEwzU0EyX0RNQV9DT05GSUcgICAweDA2CisjZGVmaW5lIE9QTDNTQTJfTUFTVEVSX0xFRlQgIDB4MDcKKyNkZWZpbmUgT1BMM1NBMl9NQVNURVJfUklHSFQgMHgwOAorI2RlZmluZSBPUEwzU0EyX01JQyAgICAgICAgICAweDA5CisjZGVmaW5lIE9QTDNTQTJfTUlTQyAgICAgICAgIDB4MEEKKworI2RlZmluZSBPUEwzU0EzX1dJREUgICAgICAgICAweDE0CisjZGVmaW5lIE9QTDNTQTNfQkFTUyAgICAgICAgIDB4MTUKKyNkZWZpbmUgT1BMM1NBM19UUkVCTEUgICAgICAgMHgxNgorCisvKiBVc2VmdWwgY29uc3RhbnRzOiAqLworI2RlZmluZSBERUZBVUxUX1ZPTFVNRSA1MAorI2RlZmluZSBERUZBVUxUX01JQyAgICA1MAorI2RlZmluZSBERUZBVUxUX1RJTUJSRSAwCisKKy8qIFBvd2VyIHNhdmluZyBtb2RlcyAqLworI2RlZmluZSBPUEwzU0EyX1BNX01PREUwCTB4MDAKKyNkZWZpbmUgT1BMM1NBMl9QTV9NT0RFMQkweDA0CS8qIFBTViAqLworI2RlZmluZSBPUEwzU0EyX1BNX01PREUyCTB4MDUJLyogUFNWIHwgUERYICovCisjZGVmaW5lIE9QTDNTQTJfUE1fTU9ERTMJMHgyNwkvKiBBRE9XTiB8IFBTViB8IFBETiB8IFBEWCAqLworCisKKy8qIEZvciBjaGVja2luZyBhZ2FpbnN0IHdoYXQgdGhlIGNhcmQgcmV0dXJuczogKi8KKyNkZWZpbmUgVkVSU0lPTl9VTktOT1dOIDAKKyNkZWZpbmUgVkVSU0lPTl9ZTUY3MTEgIDEKKyNkZWZpbmUgVkVSU0lPTl9ZTUY3MTUgIDIKKyNkZWZpbmUgVkVSU0lPTl9ZTUY3MTVCIDMKKyNkZWZpbmUgVkVSU0lPTl9ZTUY3MTVFIDQKKy8qIGFsc28gYXNzdW1pbmcgdGhhdCBhbnl0aGluZyA+IDQgYnV0IDw9IDcgaXMgYSA3MTVFICovCisKKy8qIENoaXBzZXQgdHlwZSBjb25zdGFudHMgZm9yIHVzZSBiZWxvdyAqLworI2RlZmluZSBDSElQU0VUX1VOS05PV04gLTEKKyNkZWZpbmUgQ0hJUFNFVF9PUEwzU0EyIDAKKyNkZWZpbmUgQ0hJUFNFVF9PUEwzU0EzIDEKK3N0YXRpYyBjb25zdCBjaGFyICpDSElQU0VUX1RBQkxFW10gPSB7Ik9QTDMtU0EyIiwgIk9QTDMtU0EzIn07CisKKyNpZmRlZiBDT05GSUdfUE5QCisjZGVmaW5lIE9QTDNTQTJfQ0FSRFNfTUFYIDQKKyNlbHNlCisjZGVmaW5lIE9QTDNTQTJfQ0FSRFNfTUFYIDEKKyNlbmRpZgorCisvKiBUaGlzIHNob3VsZCBiZSBwcmV0dHkgb2J2aW91cyAqLworc3RhdGljIGludCBvcGwzc2EyX2NhcmRzX251bTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCS8qIGRldmljZSByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBzaG9ydCBjZmdfcG9ydDsKKwlzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKKwlzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZ19tc3M7CisJc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXB1OworI2lmZGVmIENPTkZJR19QTlAKKwkvKiBQblAgU3R1ZmYgKi8KKwlzdHJ1Y3QgcG5wX2RldiogcGRldjsKKwlpbnQgYWN0aXZhdGVkOwkJCS8qIFdoZXRoZXIgc2FpZCBkZXZpY2VzIGhhdmUgYmVlbiBhY3RpdmF0ZWQgKi8KKyNlbmRpZgorI2lmZGVmIENPTkZJR19QTQorCXVuc2lnbmVkIGludAlpbl9zdXNwZW5kOworCXN0cnVjdCBwbV9kZXYJKnBtZGV2OworI2VuZGlmCisJdW5zaWduZWQgaW50CWNhcmQ7CisJaW50CQljaGlwc2V0OwkvKiBXaGF0J3MgbXkgdmVyc2lvbihzKT8gKi8KKwljaGFyCQkqY2hpcHNldF9uYW1lOworCisJLyogbWl4ZXIgZGF0YSAqLworCWludAkJbWl4ZXI7CisJdW5zaWduZWQgaW50CXZvbHVtZV9sOworCXVuc2lnbmVkIGludAl2b2x1bWVfcjsKKwl1bnNpZ25lZCBpbnQJbWljOworCXVuc2lnbmVkIGludAliYXNzX2w7CisJdW5zaWduZWQgaW50CWJhc3NfcjsKKwl1bnNpZ25lZCBpbnQJdHJlYmxlX2w7CisJdW5zaWduZWQgaW50CXRyZWJsZV9yOworCXVuc2lnbmVkIGludAl3aWRlX2w7CisJdW5zaWduZWQgaW50CXdpZGVfcjsKK30gb3BsM3NhMl9zdGF0ZV90Oworc3RhdGljIG9wbDNzYTJfc3RhdGVfdCBvcGwzc2EyX3N0YXRlW09QTDNTQTJfQ0FSRFNfTUFYXTsKKworCQorCisvKiBPdXIgcGFyYW1ldGVycyAqLworc3RhdGljIGludCBfX2luaXRkYXRhIGlvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXNzX2lvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXB1X2lvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMgk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIHltb2RlCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbG9vcGJhY2sJPSAtMTsKKworI2lmZGVmIENPTkZJR19QTlAKKy8qIFBuUCBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXNhcG5wID0gMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtdWx0aXBsZSA9IDE7CisKKy8qIFdoZXRoZXIgc2FpZCBkZXZpY2VzIGhhdmUgYmVlbiBhY3RpdmF0ZWQgKi8KK3N0YXRpYyBpbnQgb3BsM3NhMl9hY3RpdmF0ZWRbT1BMM1NBMl9DQVJEU19NQVhdOworI2Vsc2UKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpc2FwbnA7IC8qID0gMCAqLworc3RhdGljIGludCBfX2luaXRkYXRhIG11bHRpcGxlOyAvKiA9IDAgKi8KKyNlbmRpZgorCitNT0RVTEVfREVTQ1JJUFRJT04oIk1vZHVsZSBmb3IgT1BMMy1TQTIgYW5kIFNBMyBzb3VuZCBjYXJkcyAodXNlcyBBRDE4NDggTVNTIGRyaXZlcikuIik7CitNT0RVTEVfQVVUSE9SKCJTY290dCBNdXJyYXkgPHNjb3R0QHNwaXRlZnVsLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKGlvLCAiU2V0IEkvTyBiYXNlIG9mIE9QTDMtU0EyIG9yIFNBMyBjYXJkICh1c3VhbGx5IDB4MzcwLiAgQWRkcmVzcyBtdXN0IGJlIGV2ZW4gYW5kIG11c3QgYmUgZnJvbSAweDEwMCB0byAweEZGRSkiKTsKKworbW9kdWxlX3BhcmFtKG1zc19pbywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXNzX2lvLCAiU2V0IE1TUyAoYXVkaW8pIEkvTyBiYXNlICgweDUzMCwgMHhFODAsIG9yIG90aGVyLiBBZGRyZXNzIG11c3QgZW5kIGluIDAgb3IgNCBhbmQgbXVzdCBiZSBmcm9tIDB4NTMwIHRvIDB4RjQ4KSIpOworCittb2R1bGVfcGFyYW0obXB1X2lvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtcHVfaW8sICJTZXQgTUlESSBJL08gYmFzZSAoMHgzMzAgb3Igb3RoZXIuIEFkZHJlc3MgbXVzdCBiZSBldmVuIGFuZCBtdXN0IGJlIGZyb20gMHgzMDAgdG8gMHgzMzQpIik7CisKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1zc19pcnEsICJTZXQgTVNTIChhdWRpbykgSVJRICg1LCA3LCA5LCAxMCwgMTEsIDEyKSIpOworCittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEsICJTZXQgTVNTIChhdWRpbykgZmlyc3QgRE1BIGNoYW5uZWwgKDAsIDEsIDMpIik7CisKK21vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkbWEyLCAiU2V0IE1TUyAoYXVkaW8pIHNlY29uZCBETUEgY2hhbm5lbCAoMCwgMSwgMykiKTsKKworbW9kdWxlX3BhcmFtKHltb2RlLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyh5bW9kZSwgIlNldCBZYW1haGEgM0QgZW5oYW5jZW1lbnQgbW9kZSAoMCA9IERlc2t0b3AvTm9ybWFsLCAxID0gTm90ZWJvb2sgUEMgKDEpLCAyID0gTm90ZWJvb2sgUEMgKDIpLCAzID0gSGktRmkpIik7CisKK21vZHVsZV9wYXJhbShsb29wYmFjaywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobG9vcGJhY2ssICJTZXQgQS9EIGlucHV0IHNvdXJjZS4gVXNlZnVsIGZvciBlY2hvIGNhbmNlbGxhdGlvbiAoMCA9IE1pYyBSY2ggKGRlZmF1bHQpLCAxID0gTW9ubyBvdXRwdXQgbG9vcGJhY2spIik7CisKKyNpZmRlZiBDT05GSUdfUE5QCittb2R1bGVfcGFyYW0oaXNhcG5wLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXNhcG5wLCAiV2hlbiBzZXQgdG8gMCwgSVNBIFBuUCBzdXBwb3J0IHdpbGwgYmUgZGlzYWJsZWQiKTsKKworbW9kdWxlX3BhcmFtKG11bHRpcGxlLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXVsdGlwbGUsICJXaGVuIHNldCB0byAwLCB3aWxsIG5vdCBzZWFyY2ggZm9yIG11bHRpcGxlIGNhcmRzIik7CisjZW5kaWYKKworCisvKgorICogU3RhbmRhcmQgcmVhZCBhbmQgd3JpdGUgZnVuY3Rpb25zCisqLworCitzdGF0aWMgaW5saW5lIHZvaWQgb3BsM3NhMl93cml0ZSh1bnNpZ25lZCBzaG9ydCBwb3J0LAorCQkJCSB1bnNpZ25lZCBjaGFyICBpbmRleCwKKwkJCQkgdW5zaWduZWQgY2hhciAgZGF0YSkKK3sKKwlvdXRiX3AoaW5kZXgsIHBvcnQpOworCW91dGIoZGF0YSwgcG9ydCArIDEpOworfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBvcGwzc2EyX3JlYWQodW5zaWduZWQgc2hvcnQgcG9ydCwKKwkJCQl1bnNpZ25lZCBjaGFyICBpbmRleCwKKwkJCQl1bnNpZ25lZCBjaGFyKiBkYXRhKQoreworCW91dGJfcChpbmRleCwgcG9ydCk7CisJKmRhdGEgPSBpbmIocG9ydCArIDEpOworfQorCisKKy8qCisgKiBBbGwgb2YgdGhlIG1peGVyIGZ1bmN0aW9ucy4uLgorICovCisKK3N0YXRpYyB2b2lkIG9wbDNzYTJfc2V0X3ZvbHVtZShvcGwzc2EyX3N0YXRlX3QqIGRldmMsIGludCBsZWZ0LCBpbnQgcmlnaHQpCit7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgc2NhbGVbMTAxXSA9IHsKKwkJMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZiwgMHgwZSwgMHgwZSwgMHgwZSwKKwkJMHgwZSwgMHgwZSwgMHgwZSwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwZCwgMHgwYywKKwkJMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYywgMHgwYiwgMHgwYiwgMHgwYiwgMHgwYiwKKwkJMHgwYiwgMHgwYiwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwYSwgMHgwOSwgMHgwOSwKKwkJMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwKKwkJMHgwOCwgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNywgMHgwNiwgMHgwNiwgMHgwNiwKKwkJMHgwNiwgMHgwNiwgMHgwNiwgMHgwNiwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwgMHgwNSwKKwkJMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwNCwgMHgwMywgMHgwMywgMHgwMywgMHgwMywKKwkJMHgwMywgMHgwMywgMHgwMywgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMiwgMHgwMSwKKwkJMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJMHgwMAorCX07CisJdW5zaWduZWQgY2hhciB2b2w7CisKKwl2b2wgPSBzY2FsZVtsZWZ0XTsKKworCS8qIElmIGxldmVsIGlzIHplcm8sIHR1cm4gb24gbXV0ZSAqLworCWlmKCFsZWZ0KQorCQl2b2wgfD0gMHg4MDsKKworCW9wbDNzYTJfd3JpdGUoZGV2Yy0+Y2ZnX3BvcnQsIE9QTDNTQTJfTUFTVEVSX0xFRlQsIHZvbCk7CisKKwl2b2wgPSBzY2FsZVtyaWdodF07CisKKwkvKiBJZiBsZXZlbCBpcyB6ZXJvLCB0dXJuIG9uIG11dGUgKi8KKwlpZighcmlnaHQpCisJCXZvbCB8PSAweDgwOworCisJb3BsM3NhMl93cml0ZShkZXZjLT5jZmdfcG9ydCwgT1BMM1NBMl9NQVNURVJfUklHSFQsIHZvbCk7Cit9CisKKworc3RhdGljIHZvaWQgb3BsM3NhMl9zZXRfbWljKG9wbDNzYTJfc3RhdGVfdCogZGV2YywgaW50IGxldmVsKQoreworCXVuc2lnbmVkIGNoYXIgdm9sID0gMHgxRjsKKworCWlmKChsZXZlbCA+PSAwKSAmJiAobGV2ZWwgPD0gMTAwKSkKKwkJdm9sID0gMHgxRiAtICh1bnNpZ25lZCBjaGFyKSAoMzIgKiBsZXZlbCAvIDEwMSk7CisKKwkvKiBJZiBsZXZlbCBpcyB6ZXJvLCB0dXJuIG9uIG11dGUgKi8KKwlpZighbGV2ZWwpCisJCXZvbCB8PSAweDgwOworCisJb3BsM3NhMl93cml0ZShkZXZjLT5jZmdfcG9ydCwgT1BMM1NBMl9NSUMsIHZvbCk7Cit9CisKKworc3RhdGljIHZvaWQgb3BsM3NhM19zZXRfYmFzcyhvcGwzc2EyX3N0YXRlX3QqIGRldmMsIGludCBsZWZ0LCBpbnQgcmlnaHQpCit7CisJdW5zaWduZWQgY2hhciBiYXNzOworCisJYmFzcyA9IGxlZnQgPyAoKHVuc2lnbmVkIGNoYXIpICg4ICogbGVmdCAvIDEwMSkpIDogMDsgCisJYmFzcyB8PSAocmlnaHQgPyAoKHVuc2lnbmVkIGNoYXIpICg4ICogcmlnaHQgLyAxMDEpKSA6IDApIDw8IDQ7CisKKwlvcGwzc2EyX3dyaXRlKGRldmMtPmNmZ19wb3J0LCBPUEwzU0EzX0JBU1MsIGJhc3MpOworfQorCisKK3N0YXRpYyB2b2lkIG9wbDNzYTNfc2V0X3RyZWJsZShvcGwzc2EyX3N0YXRlX3QqIGRldmMsIGludCBsZWZ0LCBpbnQgcmlnaHQpCit7CQorCXVuc2lnbmVkIGNoYXIgdHJlYmxlOworCisJdHJlYmxlID0gbGVmdCA/ICgodW5zaWduZWQgY2hhcikgKDggKiBsZWZ0IC8gMTAxKSkgOiAwOyAKKwl0cmVibGUgfD0gKHJpZ2h0ID8gKCh1bnNpZ25lZCBjaGFyKSAoOCAqIHJpZ2h0IC8gMTAxKSkgOiAwKSA8PCA0OworCisJb3BsM3NhMl93cml0ZShkZXZjLT5jZmdfcG9ydCwgT1BMM1NBM19UUkVCTEUsIHRyZWJsZSk7Cit9CisKKworCisKK3N0YXRpYyB2b2lkIG9wbDNzYTJfbWl4ZXJfcmVzZXQob3BsM3NhMl9zdGF0ZV90KiBkZXZjKQoreworCWlmIChkZXZjKSB7CisJCW9wbDNzYTJfc2V0X3ZvbHVtZShkZXZjLCBERUZBVUxUX1ZPTFVNRSwgREVGQVVMVF9WT0xVTUUpOworCQlkZXZjLT52b2x1bWVfbCA9IGRldmMtPnZvbHVtZV9yID0gREVGQVVMVF9WT0xVTUU7CisKKwkJb3BsM3NhMl9zZXRfbWljKGRldmMsIERFRkFVTFRfTUlDKTsKKwkJZGV2Yy0+bWljID0gREVGQVVMVF9NSUM7CisKKwkJaWYgKGRldmMtPmNoaXBzZXQgPT0gQ0hJUFNFVF9PUEwzU0EzKSB7CisJCQlvcGwzc2EzX3NldF9iYXNzKGRldmMsIERFRkFVTFRfVElNQlJFLCBERUZBVUxUX1RJTUJSRSk7CisJCQlkZXZjLT5iYXNzX2wgPSBkZXZjLT5iYXNzX3IgPSBERUZBVUxUX1RJTUJSRTsKKwkJCW9wbDNzYTNfc2V0X3RyZWJsZShkZXZjLCBERUZBVUxUX1RJTUJSRSwgREVGQVVMVF9USU1CUkUpOworCQkJZGV2Yy0+dHJlYmxlX2wgPSBkZXZjLT50cmVibGVfciA9IERFRkFVTFRfVElNQlJFOworCQl9CisJfQorfQorCisvKiBDdXJyZW50bHkgb25seSB1c2VkIGZvciBwb3dlciBtYW5hZ2VtZW50ICovCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgdm9pZCBvcGwzc2EyX21peGVyX3Jlc3RvcmUob3BsM3NhMl9zdGF0ZV90KiBkZXZjKQoreworCWlmIChkZXZjKSB7CisJCW9wbDNzYTJfc2V0X3ZvbHVtZShkZXZjLCBkZXZjLT52b2x1bWVfbCwgZGV2Yy0+dm9sdW1lX3IpOworCQlvcGwzc2EyX3NldF9taWMoZGV2YywgZGV2Yy0+bWljKTsKKworCQlpZiAoZGV2Yy0+Y2hpcHNldCA9PSBDSElQU0VUX09QTDNTQTMpIHsKKwkJCW9wbDNzYTNfc2V0X2Jhc3MoZGV2YywgZGV2Yy0+YmFzc19sLCBkZXZjLT5iYXNzX3IpOworCQkJb3BsM3NhM19zZXRfdHJlYmxlKGRldmMsIGRldmMtPnRyZWJsZV9sLCBkZXZjLT50cmVibGVfcik7CisJCX0KKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGlubGluZSB2b2lkIGFyZ190b192b2xfbW9ubyh1bnNpZ25lZCBpbnQgdm9sLCBpbnQqIHZhbHVlKQoreworCWludCBsZWZ0OworCQorCWxlZnQgPSB2b2wgJiAweDAwZmY7CisJaWYgKGxlZnQgPiAxMDApCisJCWxlZnQgPSAxMDA7CisJKnZhbHVlID0gbGVmdDsKK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgYXJnX3RvX3ZvbF9zdGVyZW8odW5zaWduZWQgaW50IHZvbCwgaW50KiBhbGVmdCwgaW50KiBhcmlnaHQpCit7CisJYXJnX3RvX3ZvbF9tb25vKHZvbCwgYWxlZnQpOworCWFyZ190b192b2xfbW9ubyh2b2wgPj4gOCwgYXJpZ2h0KTsKK30KKworCitzdGF0aWMgaW5saW5lIGludCByZXRfdm9sX21vbm8oaW50IHZvbCkKK3sKKwlyZXR1cm4gKCh2b2wgPDwgOCkgfCB2b2wpOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHJldF92b2xfc3RlcmVvKGludCBsZWZ0LCBpbnQgcmlnaHQpCit7CisJcmV0dXJuICgocmlnaHQgPDwgOCkgfCBsZWZ0KTsKK30KKworCitzdGF0aWMgaW50IG9wbDNzYTJfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgcmV0dmFsLCB2YWx1ZSwgY21kZiA9IGNtZCAmIDB4ZmY7CisJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOworCisJb3BsM3NhMl9zdGF0ZV90KiBkZXZjID0gJm9wbDNzYTJfc3RhdGVbZGV2XTsKKwkKKwlzd2l0Y2ggKGNtZGYpIHsKKwkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogCisJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzogCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCQorCWlmICgoKGNtZCA+PiA4KSAmIDB4ZmYpICE9ICdNJykKKwkJcmV0dXJuIC1FSU5WQUw7CisJCQorCXJldHZhbCA9IDA7CisJaWYgKF9TSU9DX0RJUiAoY21kKSAmIF9TSU9DX1dSSVRFKSB7CisJCXN3aXRjaCAoY21kZikgeworCQkJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCQkJcmV0dmFsID0gZ2V0X3VzZXIodmFsdWUsICh1bnNpZ25lZCBfX3VzZXIgKikgYXJnKTsKKwkJCQlpZiAocmV0dmFsKQorCQkJCQlicmVhazsKKwkJCQlhcmdfdG9fdm9sX3N0ZXJlbyh2YWx1ZSwgJmRldmMtPnZvbHVtZV9sLCAmZGV2Yy0+dm9sdW1lX3IpOworCQkJCW9wbDNzYTJfc2V0X3ZvbHVtZShkZXZjLCBkZXZjLT52b2x1bWVfbCwgZGV2Yy0+dm9sdW1lX3IpOworCQkJCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+dm9sdW1lX2wsIGRldmMtPnZvbHVtZV9yKTsKKwkJCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgcCk7CisJCQkJYnJlYWs7CisJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX01JQzoKKwkJCQlyZXR2YWwgPSBnZXRfdXNlcih2YWx1ZSwgKHVuc2lnbmVkIF9fdXNlciAqKSBhcmcpOworCQkJCWlmIChyZXR2YWwpCisJCQkJCWJyZWFrOworCQkJCWFyZ190b192b2xfbW9ubyh2YWx1ZSwgJmRldmMtPm1pYyk7CisJCQkJb3BsM3NhMl9zZXRfbWljKGRldmMsIGRldmMtPm1pYyk7CisJCQkJdmFsdWUgPSByZXRfdm9sX21vbm8oZGV2Yy0+bWljKTsKKwkJCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgcCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJfQorCX0KKwllbHNlIHsKKwkJLyoKKwkJICogUmV0dXJuIHBhcmFtZXRlcnMKKwkJICovCisJCXN3aXRjaCAoY21kZikgeworCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJCXJldHZhbCA9IHB1dF91c2VyKFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19NSUMsIHApOworCQkJCWJyZWFrOworCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJCXJldHZhbCA9IHB1dF91c2VyKFNPVU5EX01BU0tfVk9MVU1FLCBwKTsKKwkJCQlicmVhazsKKwkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJCQkvKiBObyByZWNvcmRpbmcgZGV2aWNlcyAqLworCQkJCXJldHZhbCA9IHB1dF91c2VyKDAsIHApOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQkJcmV0dmFsID0gcHV0X3VzZXIoU09VTkRfQ0FQX0VYQ0xfSU5QVVQsIHApOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQkvKiBObyByZWNvcmRpbmcgc291cmNlICovCisJCQkJcmV0dmFsID0gcHV0X3VzZXIoMCwgcCk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+dm9sdW1lX2wsIGRldmMtPnZvbHVtZV9yKTsKKwkJCQlyZXR2YWwgPSBwdXRfdXNlcih2YWx1ZSwgcCk7CisJCQkJYnJlYWs7CisJCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQkJdmFsdWUgPSByZXRfdm9sX21vbm8oZGV2Yy0+bWljKTsKKwkJCQlwdXRfdXNlcih2YWx1ZSwgcCk7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dmFsID0gLUVJTlZBTDsKKwkJfQorCX0KKwlyZXR1cm4gcmV0dmFsOworfQorLyogb3BsM3NhMl9taXhlcl9pb2N0bCBlbmQgKi8KKworCitzdGF0aWMgaW50IG9wbDNzYTNfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCit7CisJaW50IHZhbHVlLCByZXR2YWwsIGNtZGYgPSBjbWQgJiAweGZmOworCisJb3BsM3NhMl9zdGF0ZV90KiBkZXZjID0gJm9wbDNzYTJfc3RhdGVbZGV2XTsKKworCXN3aXRjaCAoY21kZikgeworCWNhc2UgU09VTkRfTUlYRVJfQkFTUzoKKwkJdmFsdWUgPSByZXRfdm9sX3N0ZXJlbyhkZXZjLT5iYXNzX2wsIGRldmMtPmJhc3Nfcik7CisJCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCAoaW50IF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKwkJCisJY2FzZSBTT1VORF9NSVhFUl9UUkVCTEU6CisJCXZhbHVlID0gcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+dHJlYmxlX2wsIGRldmMtPnRyZWJsZV9yKTsKKwkJcmV0dmFsID0gcHV0X3VzZXIodmFsdWUsIChpbnQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9ESUdJVEFMMToKKwkJdmFsdWUgPSByZXRfdm9sX3N0ZXJlbyhkZXZjLT53aWRlX2wsIGRldmMtPndpZGVfcik7CisJCXJldHZhbCA9IHB1dF91c2VyKHZhbHVlLCAoaW50IF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXJldHZhbCA9IC1FSU5WQUw7CisJfQorCXJldHVybiByZXR2YWw7Cit9CisvKiBvcGwzc2EzX21peGVyX2lvY3RsIGVuZCAqLworCisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBvcGwzc2EyX21peGVyX29wZXJhdGlvbnMgPQoreworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5pZAk9ICJPUEwzLVNBMiIsCisJLm5hbWUJPSAiWWFtYWhhIE9QTDMtU0EyIiwKKwkuaW9jdGwJPSBvcGwzc2EyX21peGVyX2lvY3RsCit9OworCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgb3BsM3NhM19taXhlcl9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWQJPSAiT1BMMy1TQTMiLAorCS5uYW1lCT0gIllhbWFoYSBPUEwzLVNBMyIsCisJLmlvY3RsCT0gb3BsM3NhM19taXhlcl9pb2N0bAorfTsKKworLyogRW5kIG9mIG1peGVyLXJlbGF0ZWQgc3R1ZmYgKi8KKworCisvKgorICogQ29tcG9uZW50IHByb2JlLCBhdHRhY2gsIHVubG9hZCBmdW5jdGlvbnMKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF9vcGwzc2EyX21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5sb2FkX21wdTQwMShod19jb25maWcpOworfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBhdHRhY2hfb3BsM3NhMl9tc3Moc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzKQoreworCWludCBpbml0aWFsX21peGVyczsKKworCWluaXRpYWxfbWl4ZXJzID0gbnVtX21peGVyczsKKwlhdHRhY2hfbXNfc291bmQoaHdfY29uZmlnLCBwb3J0cywgVEhJU19NT0RVTEUpOwkvKiBTbG90IDAgKi8KKwlpZiAoaHdfY29uZmlnLT5zbG90c1swXSAhPSAtMSkgeworCQkvKiBEaWQgdGhlIE1TUyBkcml2ZXIgaW5zdGFsbD8gKi8KKwkJaWYobnVtX21peGVycyA9PSAoaW5pdGlhbF9taXhlcnMgKyAxKSkgeworCQkJLyogVGhlIE1TUyBtaXhlciBpcyBpbnN0YWxsZWQsIHJlcm91dGUgbWl4ZXJzIGFwcHJvcGlhdGVseSAqLworCQkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTEsIFNPVU5EX01JWEVSX0NEKTsKKwkJCUFEMTg0OF9SRVJPVVRFKFNPVU5EX01JWEVSX0xJTkUyLCBTT1VORF9NSVhFUl9TWU5USCk7CisJCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMywgU09VTkRfTUlYRVJfTElORSk7CisJCX0KKwkJZWxzZSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJNU1MgbWl4ZXIgbm90IGluc3RhbGxlZD9cbiIpOworCQl9CisJfQorfQorCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQgdW5sb2FkX29wbDNzYTJfbXNzKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZykKK3sKKwl1bmxvYWRfbXNfc291bmQoaHdfY29uZmlnKTsKK30KKworCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV9vcGwzc2EyKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgaW50IGNhcmQpCit7CisJdW5zaWduZWQgY2hhciBtaXNjOworCXVuc2lnbmVkIGNoYXIgdG1wOworCXVuc2lnbmVkIGNoYXIgdmVyc2lvbjsKKworCS8qCisJICogVHJ5IGFuZCBhbGxvY2F0ZSBvdXIgSS9PIHBvcnQgcmFuZ2UuCisJICovCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIsIE9QTDNTQTJfTU9EVUxFX05BTUUpKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvbnRyb2wgSS9PIHBvcnQgJSN4IG5vdCBmcmVlXG4iLAorCQkgICAgICAgaHdfY29uZmlnLT5pb19iYXNlKTsKKwkJZ290byBvdXRfbm9kZXY7CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB3cml0aW5nIHRvIHRoZSByZWFkLW9ubHkgdmVyc2lvbiBiaXRzIG9mIHRoZSBtaXNjZWxsYW5lb3VzCisJICogcmVnaXN0ZXIgc3VjY2VlZHMgb3Igbm90IChpdCBzaG91bGQgbm90KS4KKwkgKi8KKwlvcGwzc2EyX3JlYWQoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JU0MsICZtaXNjKTsKKwlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSVNDLCBtaXNjIF4gMHgwNyk7CisJb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSVNDLCAmdG1wKTsKKwlpZih0bXAgIT0gbWlzYykgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJDb250cm9sIEkvTyBwb3J0ICUjeCBpcyBub3QgYSBZTUY3eHggY2hpcHNldCFcbiIsCisJCSAgICAgICBod19jb25maWctPmlvX2Jhc2UpOworCQlnb3RvIG91dF9yZWdpb247CisJfQorCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgTUlDIHJlZ2lzdGVyIGlzIGFjY2Vzc2libGUuCisJICovCisJb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSUMsICZ0bXApOworCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JQywgMHg4YSk7CisJb3BsM3NhMl9yZWFkKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9NSUMsICZ0bXApOworCWlmKCh0bXAgJiAweDlmKSAhPSAweDhhKSB7CisJCXByaW50ayhLRVJOX0VSUgorCQkgICAgICAgUEZYICJDb250cm9sIEkvTyBwb3J0ICUjeCBpcyBub3QgYSBZTUY3eHggY2hpcHNldCFcbiIsCisJCSAgICAgICBod19jb25maWctPmlvX2Jhc2UpOworCQlnb3RvIG91dF9yZWdpb247CisJfQorCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX01JQywgdG1wKTsKKworCS8qCisJICogRGV0ZXJtaW5lIGNoaXBzZXQgdHlwZSAoU0EyIG9yIFNBMykKKwkgKgorCSAqIFRoaXMgaXMgZG9uZSBieSBsb29raW5nIGF0IHRoZSBjaGlwc2V0IHZlcnNpb24gaW4gdGhlIGxvd2VyIDMgYml0cworCSAqIG9mIHRoZSBtaXNjZWxsYW5lb3VzIHJlZ2lzdGVyLgorCSAqLworCXZlcnNpb24gPSBtaXNjICYgMHgwNzsKKwlwcmludGsoS0VSTl9ERUJVRyBQRlggIkNoaXBzZXQgdmVyc2lvbiA9ICUjeFxuIiwgdmVyc2lvbik7CisJc3dpdGNoICh2ZXJzaW9uKSB7CisJCWNhc2UgMDoKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9IENISVBTRVRfVU5LTk9XTjsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgIFBGWCAiVW5rbm93biBZYW1haGEgYXVkaW8gY29udHJvbGxlciB2ZXJzaW9uXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVkVSU0lPTl9ZTUY3MTE6CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPSBDSElQU0VUX09QTDNTQTI7CisJCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiRm91bmQgT1BMMy1TQTIgKFlNRjcxMSlcbiIpOworCQkJYnJlYWs7CisKKwkJY2FzZSBWRVJTSU9OX1lNRjcxNToKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9IENISVBTRVRfT1BMM1NBMzsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICBQRlggIkZvdW5kIE9QTDMtU0EzIChZTUY3MTUgb3IgWU1GNzE5KVxuIik7CisJCQlicmVhazsKKworCQljYXNlIFZFUlNJT05fWU1GNzE1QjoKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCA9IENISVBTRVRfT1BMM1NBMzsKKwkJCXByaW50ayhLRVJOX0lORk8KKwkJCSAgICAgICBQRlggIkZvdW5kIE9QTDMtU0EzIChZTUY3MTVCIG9yIFlNRjcxOUIpXG4iKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVkVSU0lPTl9ZTUY3MTVFOgorCQlkZWZhdWx0OgorCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jaGlwc2V0ID0gQ0hJUFNFVF9PUEwzU0EzOworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgIFBGWCAiRm91bmQgT1BMMy1TQTMgKFlNRjcxNUUgb3IgWU1GNzE5RSlcbiIpOworCQkJYnJlYWs7CisJfQorCisJaWYgKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldCAhPSBDSElQU0VUX1VOS05PV04pIHsKKwkJLyogR2VuZXJhdGUgYSBwcmV0dHkgbmFtZSAqLworCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXRfbmFtZSA9IChjaGFyICopQ0hJUFNFVF9UQUJMRVtvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXRdOworCQlyZXR1cm4gMDsKKwl9CisKK291dF9yZWdpb246CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyKTsKK291dF9ub2RldjoKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX29wbDNzYTIoc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnLCBpbnQgY2FyZCkKK3sKKwkvKiBJbml0aWFsaXplIElSUSBjb25maWd1cmF0aW9uIHRvIElSUS1COiAtLCBJUlEtQTogV1NTK01QVStPUEwzICovCisJb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfSVJRX0NPTkZJRywgMHgwZCk7CisKKwkvKiBJbml0aWFsaXplIERNQSBjb25maWd1cmF0aW9uICovCisJaWYoaHdfY29uZmlnLT5kbWEyID09IGh3X2NvbmZpZy0+ZG1hKSB7CisJCS8qIFdhbnQgRE1BIGNvbmZpZ3VyYXRpb24gRE1BLUI6IC0sIERNQS1BOiBXU1MtUCtXU1MtUiAqLworCQlvcGwzc2EyX3dyaXRlKGh3X2NvbmZpZy0+aW9fYmFzZSwgT1BMM1NBMl9ETUFfQ09ORklHLCAweDAzKTsKKwl9CisJZWxzZSB7CisJCS8qIFdhbnQgRE1BIGNvbmZpZ3VyYXRpb24gRE1BLUI6IFdTUy1SLCBETUEtQTogV1NTLVAgKi8KKwkJb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfRE1BX0NPTkZJRywgMHgyMSk7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBhdHRhY2hfb3BsM3NhMl9taXhlcihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIGludCBjYXJkKQoreworCXN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKiBtaXhlcl9vcGVyYXRpb25zOworCW9wbDNzYTJfc3RhdGVfdCogZGV2YyA9ICZvcGwzc2EyX3N0YXRlW2NhcmRdOworCisJLyogSW5zdGFsbCBtYXN0ZXIgbWl4ZXIgKi8KKwlpZiAoZGV2Yy0+Y2hpcHNldCA9PSBDSElQU0VUX09QTDNTQTMpIHsKKwkJbWl4ZXJfb3BlcmF0aW9ucyA9ICZvcGwzc2EzX21peGVyX29wZXJhdGlvbnM7CisJfQorCWVsc2UgeworCQltaXhlcl9vcGVyYXRpb25zID0gJm9wbDNzYTJfbWl4ZXJfb3BlcmF0aW9uczsKKwl9CisKKwlkZXZjLT5jZmdfcG9ydCA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKwlkZXZjLT5taXhlciA9IHNvdW5kX2luc3RhbGxfbWl4ZXIoTUlYRVJfRFJJVkVSX1ZFUlNJT04sCisJCQkJCSAgbWl4ZXJfb3BlcmF0aW9ucy0+bmFtZSwKKwkJCQkJICBtaXhlcl9vcGVyYXRpb25zLAorCQkJCQkgIHNpemVvZihzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyksCisJCQkJCSAgZGV2Yyk7CisJaWYoZGV2Yy0+bWl4ZXIgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBQRlggIkNvdWxkIG5vdCBpbnN0YWxsICVzIG1hc3RlciBtaXhlclxuIiwKKwkJCSBtaXhlcl9vcGVyYXRpb25zLT5uYW1lKTsKKwl9CisJZWxzZSB7CisJCQlvcGwzc2EyX21peGVyX3Jlc2V0KGRldmMpOworCisJfQorfQorCisKK3N0YXRpYyB2b2lkIG9wbDNzYTJfY2xlYXJfc2xvdHMoc3RydWN0IGFkZHJlc3NfaW5mbyogaHdfY29uZmlnKQoreworCWludCBpOworCisJZm9yKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCWh3X2NvbmZpZy0+c2xvdHNbaV0gPSAtMTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgX19pbml0IG9wbDNzYTJfc2V0X3ltb2RlKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgaW50IHltb2RlKQoreworCS8qCisJICogU2V0IHRoZSBZYW1haGEgM0QgZW5oYW5jZW1lbnQgbW9kZSAoYWthIFltZXJzaW9uKSBpZiBhc2tlZCB0byBhbmQKKwkgKiBpdCdzIHN1cHBvcnRlZC4KKwkgKgorCSAqIDA6IERlc2t0b3AgKGFrYSBub3JtYWwpICAgNS0xMiBjbSBzcGVha2VycworCSAqIDE6IE5vdGVib29rIFBDIG1vZGUgMSAgICAgMyBjbSBzcGVha2VycworCSAqIDI6IE5vdGVib29rIFBDIG1vZGUgMiAgICAgMS41IGNtIHNwZWFrZXJzCisJICogMzogSGktZmkgICAgICAgICAgICAgICAgICAxNi0zOCBjbSBzcGVha2VycworCSAqLworCWlmKHltb2RlID49IDAgJiYgeW1vZGUgPD0gMykgeworCQl1bnNpZ25lZCBjaGFyIHN5c19jdHJsOworCisJCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfU1lTX0NUUkwsICZzeXNfY3RybCk7CisJCXN5c19jdHJsID0gKHN5c19jdHJsICYgMHhjZikgfCAoKHltb2RlICYgMykgPDwgNCk7CisJCW9wbDNzYTJfd3JpdGUoaHdfY29uZmlnLT5pb19iYXNlLCBPUEwzU0EyX1NZU19DVFJMLCBzeXNfY3RybCk7CisJfQorCWVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJub3Qgc2V0dGluZyB5bW9kZSwgaXQgbXVzdCBiZSBvbmUgb2YgMCwxLDIsM1xuIik7CisJfQorfQorCisKK3N0YXRpYyB2b2lkIF9faW5pdCBvcGwzc2EyX3NldF9sb29wYmFjayhzdHJ1Y3QgYWRkcmVzc19pbmZvKiBod19jb25maWcsIGludCBsb29wYmFjaykKK3sKKwlpZihsb29wYmFjayA+PSAwICYmIGxvb3BiYWNrIDw9IDEpIHsKKwkJdW5zaWduZWQgY2hhciBtaXNjOworCisJCW9wbDNzYTJfcmVhZChod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgJm1pc2MpOworCQltaXNjID0gKG1pc2MgJiAweGVmKSB8ICgobG9vcGJhY2sgJiAxKSA8PCA0KTsKKwkJb3BsM3NhMl93cml0ZShod19jb25maWctPmlvX2Jhc2UsIE9QTDNTQTJfTUlTQywgbWlzYyk7CisJfQorCWVsc2UgeworCQlwcmludGsoS0VSTl9FUlIgUEZYICJub3Qgc2V0dGluZyBsb29wYmFjaywgaXQgbXVzdCBiZSBlaXRoZXIgMCBvciAxXG4iKTsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9vcGwzc2EyKHN0cnVjdCBhZGRyZXNzX2luZm8qIGh3X2NvbmZpZywgaW50IGNhcmQpCit7CisgICAgICAgIC8qIFJlbGVhc2UgY29udHJvbCBwb3J0cyAqLworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMik7CisKKwkvKiBVbmxvYWQgbWl4ZXIgKi8KKwlpZihvcGwzc2EyX3N0YXRlW2NhcmRdLm1peGVyID49IDApCisJCXNvdW5kX3VubG9hZF9taXhlcmRldihvcGwzc2EyX3N0YXRlW2NhcmRdLm1peGVyKTsKKworfQorCisjaWZkZWYgQ09ORklHX1BOUAorc3RhdGljIHN0cnVjdCBwbnBfZGV2aWNlX2lkIHBucF9vcGwzc2EyX2xpc3RbXSA9IHsKKwl7LmlkID0gIllNSDAwMjEiLCAuZHJpdmVyX2RhdGEgPSAwfSwKKwl7LmlkID0gIiJ9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBucCwgcG5wX29wbDNzYTJfbGlzdCk7CisKK3N0YXRpYyBpbnQgb3BsM3NhMl9wbnBfcHJvYmUoc3RydWN0IHBucF9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBucF9kZXZpY2VfaWQgKmRldl9pZCkKK3sKKwlpbnQgY2FyZCA9IG9wbDNzYTJfY2FyZHNfbnVtOworCisJLyogd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byByZXR1cm4gYW4gZXJyb3IgYXMgdGhlIHVzZXIgbWF5IGhhdmUgc3BlY2lmaWVkCisJICogbm8gbXVsdGlwbGUgY2FyZCBzZWFyY2gKKwkgKi8KKworCWlmIChvcGwzc2EyX2NhcmRzX251bSA9PSBPUEwzU0EyX0NBUkRTX01BWCkKKwkJcmV0dXJuIDA7CisJb3BsM3NhMl9hY3RpdmF0ZWRbY2FyZF0gPSAxOworCisJLyogT3VyIG93biBjb25maWc6ICovCisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuaW9fYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldiwgNCk7CisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuaXJxICAgICA9IHBucF9pcnEoZGV2LCAwKTsKKwlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5kbWEgICAgID0gcG5wX2RtYShkZXYsIDApOworCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmRtYTIgICAgPSBwbnBfZG1hKGRldiwgMSk7CisKKwkvKiBUaGUgTVNTIGNvbmZpZzogKi8KKwlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaW9fYmFzZSAgICAgID0gcG5wX3BvcnRfc3RhcnQoZGV2LCAxKTsKKwlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaXJxICAgICAgICAgID0gcG5wX2lycShkZXYsIDApOworCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5kbWEgICAgICAgICAgPSBwbnBfZG1hKGRldiwgMCk7CisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmRtYTIgICAgICAgICA9IHBucF9kbWEoZGV2LCAxKTsKKwlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuY2FyZF9zdWJ0eXBlID0gMTsgLyogTm8gSVJRIG9yIERNQSBzZXR1cCAqLworCisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmlvX2Jhc2UgICAgICAgPSBwbnBfcG9ydF9zdGFydChkZXYsIDMpOworCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pcnEgICAgICAgICAgID0gcG5wX2lycShkZXYsIDApOworCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5kbWEgICAgICAgICAgID0gLTE7CisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmRtYTIgICAgICAgICAgPSAtMTsKKwlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuYWx3YXlzX2RldGVjdCA9IDE7IC8qIEl0J3MgdGhlcmUsIHNvIHVzZSBzaGFyZWQgSVJRcyAqLworCisJLyogQ2FsbCBtZSBwYXJhbm9pZDogKi8KKwlvcGwzc2EyX2NsZWFyX3Nsb3RzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZyk7CisJb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzKTsKKwlvcGwzc2EyX2NsZWFyX3Nsb3RzKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUpOworCisJb3BsM3NhMl9zdGF0ZVtjYXJkXS5wZGV2ID0gZGV2OworCW9wbDNzYTJfY2FyZHNfbnVtKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBwbnBfZHJpdmVyIG9wbDNzYTJfZHJpdmVyID0geworCS5uYW1lCQk9ICJvcGwzc2EyIiwKKwkuaWRfdGFibGUJPSBwbnBfb3BsM3NhMl9saXN0LAorCS5wcm9iZQkJPSBvcGwzc2EyX3BucF9wcm9iZSwKK307CisKKyNlbmRpZiAvKiBDT05GSUdfUE5QICovCisKKy8qIEVuZCBvZiBjb21wb25lbnQgZnVuY3Rpb25zICovCisKKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sob3BsM3NhMl9sb2NrKTsKKworLyogUG93ZXIgTWFuYWdlbWVudCBzdXBwb3J0IGZ1bmN0aW9ucyAqLworc3RhdGljIGludCBvcGwzc2EyX3N1c3BlbmQoc3RydWN0IHBtX2RldiAqcGRldiwgdW5zaWduZWQgaW50IHBtX21vZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlvcGwzc2EyX3N0YXRlX3QgKnA7CisKKwlpZiAoIXBkZXYpCisJCXJldHVybiAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJm9wbDNzYTJfbG9jayxmbGFncyk7CisKKwlwID0gKG9wbDNzYTJfc3RhdGVfdCAqKSBwZGV2LT5kYXRhOworCXN3aXRjaCAocG1fbW9kZSkgeworCWNhc2UgMToKKwkJcG1fbW9kZSA9IE9QTDNTQTJfUE1fTU9ERTE7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcG1fbW9kZSA9IE9QTDNTQTJfUE1fTU9ERTI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJcG1fbW9kZSA9IE9QTDNTQTJfUE1fTU9ERTM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIHdlIGRvbid0IGtub3cgaG93dG8gaGFuZGxlIHRoaXMuLi4gKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmb3BsM3NhMl9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJcC0+aW5fc3VzcGVuZCA9IDE7CisKKwkvKiBpdHMgc3VwcG9zZWQgdG8gYXV0b211dGUgYmVmb3JlIHN1c3BlbmRpbmcsIHNvIHdlIHdvbid0IGJvdGhlciAqLworCW9wbDNzYTJfd3JpdGUocC0+Y2ZnX3BvcnQsIE9QTDNTQTJfUE0sIHBtX21vZGUpOworCS8qIHdhaXQgYSB3aGlsZSBmb3IgdGhlIGNsb2NrIG9zY2lsbGF0b3IgdG8gc3RhYmlsaXNlICovCisJbWRlbGF5KDEwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm9wbDNzYTJfbG9jayxmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgb3BsM3NhMl9yZXN1bWUoc3RydWN0IHBtX2RldiAqcGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCW9wbDNzYTJfc3RhdGVfdCAqcDsKKworIAlpZiAoIXBkZXYpCisgCQlyZXR1cm4gLUVJTlZBTDsKKworCXAgPSAob3BsM3NhMl9zdGF0ZV90ICopIHBkZXYtPmRhdGE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJm9wbDNzYTJfbG9jayxmbGFncyk7CisKKyAJLyogSSBkb24ndCB0aGluayB0aGlzIGlzIG5lY2Vzc2FyeSAqLworCW9wbDNzYTJfd3JpdGUocC0+Y2ZnX3BvcnQsIE9QTDNTQTJfUE0sIE9QTDNTQTJfUE1fTU9ERTApOworCW9wbDNzYTJfbWl4ZXJfcmVzdG9yZShwKTsKKyAJcC0+aW5fc3VzcGVuZCA9IDA7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZvcGwzc2EyX2xvY2ssZmxhZ3MpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IG9wbDNzYTJfcG1fY2FsbGJhY2soc3RydWN0IHBtX2RldiAqcGRldiwgcG1fcmVxdWVzdF90IHJxc3QsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBtb2RlID0gKHVuc2lnbmVkICBsb25nKWRhdGE7CisKKwlzd2l0Y2ggKHJxc3QpIHsKKwkJY2FzZSBQTV9TVVNQRU5EOgorCQkJcmV0dXJuIG9wbDNzYTJfc3VzcGVuZChwZGV2LCBtb2RlKTsKKworCQljYXNlIFBNX1JFU1VNRToKKwkJCXJldHVybiBvcGwzc2EyX3Jlc3VtZShwZGV2KTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKy8qCisgKiBJbnN0YWxsIE9QTDMtU0EyIGJhc2VkIGNhcmQocykuCisgKgorICogTmVlZCB0byBoYXZlIGFkMTg0OCBhbmQgbXB1NDAxIGxvYWRlZCByZWFkeS4KKyAqLworc3RhdGljIGludCBfX2luaXQgaW5pdF9vcGwzc2EyKHZvaWQpCit7CisJaW50IGNhcmQsIG1heDsKKworCS8qIFNhbml0aXplIGlzYXBucCBhbmQgbXVsdGlwbGUgc2V0dGluZ3MgKi8KKwlpc2FwbnAgPSBpc2FwbnAgIT0gMCA/IDEgOiAwOworCW11bHRpcGxlID0gbXVsdGlwbGUgIT0gMCA/IDEgOiAwOworCisJbWF4ID0gKG11bHRpcGxlICYmIGlzYXBucCkgPyBPUEwzU0EyX0NBUkRTX01BWCA6IDE7CisKKyNpZmRlZiBDT05GSUdfUE5QCisJaWYgKGlzYXBucCl7CisJCXBucF9yZWdpc3Rlcl9kcml2ZXIoJm9wbDNzYTJfZHJpdmVyKTsKKwkJaWYoIW9wbDNzYTJfY2FyZHNfbnVtKXsKKwkJCXByaW50ayhLRVJOX0lORk8gUEZYICJObyBQblAgY2FyZHMgZm91bmRcbiIpOworCQkJaXNhcG5wID0gMDsKKwkJfQorCQltYXggPSBvcGwzc2EyX2NhcmRzX251bTsKKwl9CisjZW5kaWYKKworCWZvciAoY2FyZCA9IDA7IGNhcmQgPCBtYXg7IGNhcmQrKykgeworCQkvKiBJZiBhIHVzZXIgd2FudHMgYW4gSS9PIHRoZW4gYXNzdW1lIHRoZXkgbWVhbnQgaXQgKi8KKwkJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwkJaW50IGJhc2U7CisJCQorCQlpZiAoIWlzYXBucCkgeworCQkJaWYgKGlvID09IC0xIHx8IGlycSA9PSAtMSB8fCBkbWEgPT0gLTEgfHwKKwkJCSAgICBkbWEyID09IC0xIHx8IG1zc19pbyA9PSAtMSkgeworCQkJCXByaW50ayhLRVJOX0VSUgorCQkJCSAgICAgICBQRlggImlvLCBtc3NfaW8sIGlycSwgZG1hLCBhbmQgZG1hMiBtdXN0IGJlIHNldFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlvcGwzc2EyX2NhcmRzX251bSsrOworCisJCQkvKgorCQkJICogT3VyIG93biBjb25maWc6CisJCQkgKiAoTk9URTogSVJRIGFuZCBETUEgYXJlbid0IHVzZWQsIHNvIHRoZXkncmUgc2V0IHRvCisJCQkgKiAgZ2l2ZSBwcmV0dHkgb3V0cHV0IGZyb20gY29uZl9wcmludGYuIDopCisJCQkgKi8KKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlvX2Jhc2UgPSBpbzsKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlycSAgICAgPSBpcnE7CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZy5kbWEgICAgID0gZG1hOworCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcuZG1hMiAgICA9IGRtYTI7CisJCisJCQkvKiBUaGUgTVNTIGNvbmZpZzogKi8KKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5pb19iYXNlICAgICAgPSBtc3NfaW87CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MuaXJxICAgICAgICAgID0gaXJxOworCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmRtYSAgICAgICAgICA9IGRtYTsKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5kbWEyICAgICAgICAgPSBkbWEyOworCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzLmNhcmRfc3VidHlwZSA9IDE7IC8qIE5vIElSUSBvciBETUEgc2V0dXAgKi8KKworCQkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LmlvX2Jhc2UgICAgICAgPSBtcHVfaW87CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuaXJxICAgICAgICAgICA9IGlycTsKKwkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5kbWEgICAgICAgICAgID0gLTE7CisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUuYWx3YXlzX2RldGVjdCA9IDE7IC8qIFVzZSBzaGFyZWQgSVJRcyAqLworCisJCQkvKiBDYWxsIG1lIHBhcmFub2lkOiAqLworCQkJb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcpOworCQkJb3BsM3NhMl9jbGVhcl9zbG90cygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzKTsKKwkJCW9wbDNzYTJfY2xlYXJfc2xvdHMoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdSk7CisJCX0KKworCQkvKiBGSVhNRTogbGVhayAqLworCQlpZiAocHJvYmVfb3BsM3NhMigmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGNhcmQpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJYmFzZSA9IG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcy5pb19iYXNlOworCisJCWlmICghcmVxdWVzdF9yZWdpb24oYmFzZSwgNCwgIldTUyBjb25maWciKSkKKwkJCWdvdG8gZmFpbGVkOworCisJCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oYmFzZSArIDQsIDQsICJhZDE4NDgiKTsKKwkJaWYgKCFwb3J0cykKKwkJCWdvdG8gZmFpbGVkMjsKKworCQlpZiAoIXByb2JlX21zX3NvdW5kKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tc3MsIHBvcnRzKSkgeworCQkJLyoKKwkJCSAqIElmIG9uZSBvciBtb3JlIGNhcmRzIGFyZSBhbHJlYWR5IHJlZ2lzdGVyZWQsIGRvbid0CisJCQkgKiByZXR1cm4gYW4gZXJyb3IgYnV0IHByaW50IGEgd2FybmluZy4gIE5vdGUsIHRoaXMKKwkJCSAqIHNob3VsZCBuZXZlciByZWFsbHkgaGFwcGVuIHVubGVzcyB0aGUgaGFyZHdhcmUgb3IKKwkJCSAqIElTQSBQblAgc2NyZXdlZCB1cC4KKwkJCSAqLworCQkJcmVsZWFzZV9yZWdpb24oYmFzZSArIDQsIDQpOworCQlmYWlsZWQyOgorCQkJcmVsZWFzZV9yZWdpb24oYmFzZSwgNCk7CisJCWZhaWxlZDoKKwkJCXJlbGVhc2VfcmVnaW9uKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLmlvX2Jhc2UsIDIpOworCisJCQlpZiAob3BsM3NhMl9jYXJkc19udW0pIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HCisJCQkJICAgICAgIFBGWCAiVGhlcmUgd2FzIGEgcHJvYmxlbSBwcm9iaW5nIG9uZSAiCisJCQkJICAgICAgICIgb2YgdGhlIElTQSBQTlAgY2FyZHMsIGNvbnRpbnVpbmdcbiIpOworCQkJCW9wbDNzYTJfY2FyZHNfbnVtLS07CisJCQkJY29udGludWU7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gLUVOT0RFVjsKKwkJfQorCisJCWF0dGFjaF9vcGwzc2EyKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZywgY2FyZCk7CisJCWNvbmZfcHJpbnRmKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2hpcHNldF9uYW1lLCAmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcpOworCQlhdHRhY2hfb3BsM3NhMl9taXhlcigmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIGNhcmQpOworCQlhdHRhY2hfb3BsM3NhMl9tc3MoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21zcywgcG9ydHMpOworCisJCS8qIGV3d3cgPSkgKi8KKwkJb3BsM3NhMl9zdGF0ZVtjYXJkXS5jYXJkID0gY2FyZDsKKyNpZmRlZiBDT05GSUdfUE0KKwkJLyogcmVnaXN0ZXIgb3VyIHBvd2VyIG1hbmFnZW1lbnQgY2FwYWJpbGl0aWVzICovCisJCW9wbDNzYTJfc3RhdGVbY2FyZF0ucG1kZXYgPSBwbV9yZWdpc3RlcihQTV9JU0FfREVWLCBjYXJkLCBvcGwzc2EyX3BtX2NhbGxiYWNrKTsKKwkJaWYgKG9wbDNzYTJfc3RhdGVbY2FyZF0ucG1kZXYpCisJCQlvcGwzc2EyX3N0YXRlW2NhcmRdLnBtZGV2LT5kYXRhID0gJm9wbDNzYTJfc3RhdGVbY2FyZF07CisjZW5kaWYgLyogQ09ORklHX1BNICovCisKKwkJLyoKKwkJICogU2V0IHRoZSBZYW1haGEgM0QgZW5oYW5jZW1lbnQgbW9kZSAoYWthIFltZXJzaW9uKSBpZiBhc2tlZCB0byBhbmQKKwkJICogaXQncyBzdXBwb3J0ZWQuCisJCSAqLworCQlpZiAoeW1vZGUgIT0gLTEpIHsKKwkJCWlmIChvcGwzc2EyX3N0YXRlW2NhcmRdLmNoaXBzZXQgPT0gQ0hJUFNFVF9PUEwzU0EyKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJICAgICAgIFBGWCAieW1vZGUgbm90IHN1cHBvcnRlZCBvbiBPUEwzLVNBMlxuIik7CisJCQl9CisJCQllbHNlIHsKKwkJCQlvcGwzc2EyX3NldF95bW9kZSgmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmcsIHltb2RlKTsKKwkJCX0KKwkJfQorCisKKwkJLyogU2V0IEEvRCBpbnB1dCB0byBNb25vIGxvb3BiYWNrIGlmIGFza2VkIHRvLiAqLworCQlpZiAobG9vcGJhY2sgIT0gLTEpIHsKKwkJCW9wbDNzYTJfc2V0X2xvb3BiYWNrKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZywgbG9vcGJhY2spOworCQl9CisJCQorCQkvKiBBdHRhY2ggTVBVIGlmIHdlJ3ZlIGJlZW4gYXNrZWQgdG8gZG8gc28sIGZhaWx1cmUgaXNuJ3QgZmF0YWwgKi8KKwkJaWYgKG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlICE9IC0xKSB7CisJCQlpbnQgYmFzZSA9IG9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5pb19iYXNlOworCQkJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwkJCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oYmFzZSwgMiwgIm1wdTQwMSIpOworCQkJaWYgKCFwb3J0cykKKwkJCQlnb3RvIG91dDsKKwkJCWlmICghcHJvYmVfbXB1NDAxKCZvcGwzc2EyX3N0YXRlW2NhcmRdLmNmZ19tcHUsIHBvcnRzKSkgeworCQkJCXJlbGVhc2VfcmVnaW9uKGJhc2UsIDIpOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJaWYgKGF0dGFjaF9tcHU0MDEoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdSwgVEhJU19NT0RVTEUpKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSIFBGWCAiZmFpbGVkIHRvIGF0dGFjaCBNUFU0MDFcbiIpOworCQkJCW9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdS5zbG90c1sxXSA9IC0xOworCQkJfQorCQl9CisJfQorCitvdXQ6CisJaWYgKGlzYXBucCkgeworCQlwcmludGsoS0VSTl9OT1RJQ0UgUEZYICIlZCBQblAgY2FyZChzKSBmb3VuZC5cbiIsIG9wbDNzYTJfY2FyZHNfbnVtKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVW5pbnN0YWxsIE9QTDMtU0EyIGJhc2VkIGNhcmQocykuCisgKi8KK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX29wbDNzYTIodm9pZCkKK3sKKwlpbnQgY2FyZDsKKworCWZvcihjYXJkID0gMDsgY2FyZCA8IG9wbDNzYTJfY2FyZHNfbnVtOyBjYXJkKyspIHsKKyNpZmRlZiBDT05GSUdfUE0KKwkJaWYgKG9wbDNzYTJfc3RhdGVbY2FyZF0ucG1kZXYpCisJCQlwbV91bnJlZ2lzdGVyKG9wbDNzYTJfc3RhdGVbY2FyZF0ucG1kZXYpOworI2VuZGlmCisJICAgICAgICBpZiAob3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXB1LnNsb3RzWzFdICE9IC0xKSB7CisJCQl1bmxvYWRfb3BsM3NhMl9tcHUoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnX21wdSk7CisgCQl9CisJCXVubG9hZF9vcGwzc2EyX21zcygmb3BsM3NhMl9zdGF0ZVtjYXJkXS5jZmdfbXNzKTsKKwkJdW5sb2FkX29wbDNzYTIoJm9wbDNzYTJfc3RhdGVbY2FyZF0uY2ZnLCBjYXJkKTsKKyNpZmRlZiBDT05GSUdfUE5QCisJCXBucF91bnJlZ2lzdGVyX2RyaXZlcigmb3BsM3NhMl9kcml2ZXIpOworI2VuZGlmCisJfQorfQorCittb2R1bGVfaW5pdChpbml0X29wbDNzYTIpOworbW9kdWxlX2V4aXQoY2xlYW51cF9vcGwzc2EyKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX29wbDNzYTIoY2hhciAqc3RyKQoreworCS8qIGlvLCBpcnEsIGRtYSwgZG1hMiwuLi4gKi8KKyNpZmRlZiBDT05GSUdfUE5QCisJaW50IGludHNbMTFdOworI2Vsc2UKKwlpbnQgaW50c1s5XTsKKyNlbmRpZgorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisJaW8gICAgICAgPSBpbnRzWzFdOworCWlycSAgICAgID0gaW50c1syXTsKKwlkbWEgICAgICA9IGludHNbM107CisJZG1hMiAgICAgPSBpbnRzWzRdOworCW1zc19pbyAgID0gaW50c1s1XTsKKwltcHVfaW8gICA9IGludHNbNl07CisJeW1vZGUgICAgPSBpbnRzWzddOworCWxvb3BiYWNrID0gaW50c1s4XTsKKyNpZmRlZiBDT05GSUdfUE5QCisJaXNhcG5wICAgPSBpbnRzWzldOworCW11bHRpcGxlID0gaW50c1sxMF07CisjZW5kaWYKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgib3BsM3NhMj0iLCBzZXR1cF9vcGwzc2EyKTsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL29zLmggYi9zb3VuZC9vc3Mvb3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmI5NjI5Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL29zLmgKQEAgLTAsMCArMSw1MSBAQAorI2RlZmluZSBBTExPV19TRUxFQ1QKKyN1bmRlZiBOT19JTkxJTkVfQVNNCisjZGVmaW5lIFNIT1JUX0JBTk5FUlMKKyNkZWZpbmUgTUFOVUFMX1BOUAorI3VuZGVmICBET19USU1JTkdTCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZmRlZiBfX0tFUk5FTF9fCisjaW5jbHVkZSA8bGludXgvdXRzbmFtZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9wYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGFzbS9wYWdlLmg+CisjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgorI2lmZGVmIF9fYWxwaGFfXworI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorCisjZGVmaW5lIEZBTFNFCTAKKyNkZWZpbmUgVFJVRQkxCisKK2V4dGVybiBpbnQgc291bmRfYWxsb2NfZG1hKGludCBjaG4sIGNoYXIgKmRldmljZUlEKTsKK2V4dGVybiBpbnQgc291bmRfb3Blbl9kbWEoaW50IGNobiwgY2hhciAqZGV2aWNlSUQpOworZXh0ZXJuIHZvaWQgc291bmRfZnJlZV9kbWEoaW50IGNobik7CitleHRlcm4gdm9pZCBzb3VuZF9jbG9zZV9kbWEoaW50IGNobik7CisKK2V4dGVybiB2b2lkIHJlcHJvZ3JhbV90aW1lcih2b2lkKTsKKworI2RlZmluZSBVU0VfQVVUT0lOSVRfRE1BCisKK2V4dGVybiB2b2lkICpzb3VuZF9tZW1fYmxvY2tzWzEwMjRdOworZXh0ZXJuIGludCBzb3VuZF9uYmxvY2tzOworCisjdW5kZWYgUFNFVURPX0RNQV9BVVRPSU5JVAorI2RlZmluZSBBTExPV19CVUZGRVJfTUFQUElORworCitleHRlcm4gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBvc3Nfc291bmRfZm9wczsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9wYXMyLmggYi9zb3VuZC9vc3MvcGFzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTJjNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvcGFzMi5oCkBAIC0wLDAgKzEsMTcgQEAKKworLyoJRnJvbSBwYXNfY2FyZC5jCSovCitpbnQgcGFzX3NldF9pbnRyKGludCBtYXNrKTsKK2ludCBwYXNfcmVtb3ZlX2ludHIoaW50IG1hc2spOwordW5zaWduZWQgY2hhciBwYXNfcmVhZChpbnQgaW9hZGRyKTsKK3ZvaWQgcGFzX3dyaXRlKHVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGlvYWRkcik7CisKKy8qCUZyb20gcGFzX2F1ZGlvLmMgKi8KK3ZvaWQgcGFzX3BjbV9pbnRlcnJ1cHQodW5zaWduZWQgY2hhciBzdGF0dXMsIGludCBjYXVzZSk7Cit2b2lkIHBhc19wY21faW5pdChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOworCisvKglGcm9tIHBhc19taXhlci5jICovCitpbnQgcGFzX2luaXRfbWl4ZXIodm9pZCk7CisKKy8qCUZyb20gcGFzX21pZGkuYyAqLwordm9pZCBwYXNfbWlkaV9pbml0KHZvaWQpOwordm9pZCBwYXNfbWlkaV9pbnRlcnJ1cHQodm9pZCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvcGFzMl9jYXJkLmMgYi9zb3VuZC9vc3MvcGFzMl9jYXJkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2OTZkYwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9wYXMyX2NhcmQuYwpAQCAtMCwwICsxLDQ1OCBAQAorLyoKKyAqIHNvdW5kL3BhczJfY2FyZC5jCisgKgorICogRGV0ZWN0aW9uIHJvdXRpbmUgZm9yIHRoZSBQcm8gQXVkaW8gU3BlY3RydW0gY2FyZHMuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAicGFzMi5oIgorI2luY2x1ZGUgInNiLmgiCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRtYV9iaXRzW10gPSB7CisJNCwgMSwgMiwgMywgMCwgNSwgNiwgNworfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaXJxX2JpdHNbXSA9IHsKKwkwLCAwLCAxLCAyLCAzLCA0LCA1LCA2LCAwLCAxLCA3LCA4LCA5LCAwLCAxMCwgMTEKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNiX2lycV9iaXRzW10gPSB7CisJMHgwMCwgMHgwMCwgMHgwOCwgMHgxMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgyMCwgCisJMHgwMCwgMHgwOCwgMHgyOCwgMHgzMCwgMHgzOCwgMCwgMAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc2JfZG1hX2JpdHNbXSA9IHsKKwkweDAwLCAweDQwLCAweDgwLCAweEMwLCAwLCAwLCAwLCAwCit9OworCisvKgorICogVGhlIEFkZHJlc3MgVHJhbnNsYXRpb24gY29kZSBpcyB1c2VkIHRvIGNvbnZlcnQgSS9PIHJlZ2lzdGVyIGFkZHJlc3NlcyB0bworICogYmUgcmVsYXRpdmUgdG8gdGhlIGdpdmVuIGJhc2UgLXJlZ2lzdGVyCisgKi8KKworaW50ICAgICAgCXBhc190cmFuc2xhdGVfY29kZSA9IDA7CitzdGF0aWMgaW50ICAgICAgcGFzX2ludHJfbWFzazsKK3N0YXRpYyBpbnQgICAgICBwYXNfaXJxOworc3RhdGljIGludCAgICAgIHBhc19zYl9iYXNlOworREVGSU5FX1NQSU5MT0NLKHBhc19sb2NrKTsKKyNpZm5kZWYgQ09ORklHX1BBU19KT1lTVElDSworc3RhdGljIGludAlqb3lzdGljazsKKyNlbHNlCitzdGF0aWMgaW50IAlqb3lzdGljayA9IDE7CisjZW5kaWYKKyNpZmRlZiBTWU1QSE9OWV9QQVMKK3N0YXRpYyBpbnQgCXN5bXBob255ID0gMTsKKyNlbHNlCitzdGF0aWMgaW50IAlzeW1waG9ueTsKKyNlbmRpZgorI2lmZGVmIEJST0tFTl9CVVNfQ0xPQ0sKK3N0YXRpYyBpbnQJYnJva2VuX2J1c19jbG9jayA9IDE7CisjZWxzZQorc3RhdGljIGludAlicm9rZW5fYnVzX2Nsb2NrOworI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzI7CisKK2NoYXIgICAgICAgICAgICBwYXNfbW9kZWwgPSAwOworc3RhdGljIGNoYXIgICAgKnBhc19tb2RlbF9uYW1lc1tdID0geworCSIiLCAKKwkiUHJvIEF1ZGlvU3BlY3RydW0rIiwgCisJIkNEUEMiLCAKKwkiUHJvIEF1ZGlvU3BlY3RydW0gMTYiLCAKKwkiUHJvIEF1ZGlvU3BlY3RydW0gMTZEIgorfTsKKworLyoKKyAqIHBhc19yZWFkKCkgYW5kIHBhc193cml0ZSgpIGFyZSBlcXVpdmFsZW50cyBvZiBpbmIgYW5kIG91dGIgCisgKiBUaGVzZSByb3V0aW5lcyBwZXJmb3JtIHRoZSBJL08gYWRkcmVzcyB0cmFuc2xhdGlvbiByZXF1aXJlZAorICogdG8gc3VwcG9ydCBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IGJhc2UgYWRkcmVzcworICovCisKK2V4dGVybiB2b2lkICAgICBtaXhfd3JpdGUodW5zaWduZWQgY2hhciBkYXRhLCBpbnQgaW9hZGRyKTsKKwordW5zaWduZWQgY2hhciBwYXNfcmVhZChpbnQgaW9hZGRyKQoreworCXJldHVybiBpbmIoaW9hZGRyICsgcGFzX3RyYW5zbGF0ZV9jb2RlKTsKK30KKwordm9pZCBwYXNfd3JpdGUodW5zaWduZWQgY2hhciBkYXRhLCBpbnQgaW9hZGRyKQoreworCW91dGIoKGRhdGEpLCBpb2FkZHIgKyBwYXNfdHJhbnNsYXRlX2NvZGUpOworfQorCisvKioqKioqKioqKioqKioqKioqKiBCZWdpbiBvZiB0aGUgSW50ZXJydXB0IEhhbmRsZXIgKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpcnFyZXR1cm5fdCBwYXNpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KQoreworCWludCAgICAgICAgICAgICBzdGF0dXM7CisKKwlzdGF0dXMgPSBwYXNfcmVhZCgweDBCODkpOworCXBhc193cml0ZShzdGF0dXMsIDB4MEI4OSk7CS8qIENsZWFyIGludGVycnVwdCAqLworCisJaWYgKHN0YXR1cyAmIDB4MDgpCisJeworCQkgIHBhc19wY21faW50ZXJydXB0KHN0YXR1cywgMSk7CisJCSAgc3RhdHVzICY9IH4weDA4OworCX0KKwlpZiAoc3RhdHVzICYgMHgxMCkKKwl7CisJCSAgcGFzX21pZGlfaW50ZXJydXB0KCk7CisJCSAgc3RhdHVzICY9IH4weDEwOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCBwYXNfc2V0X2ludHIoaW50IG1hc2spCit7CisJaWYgKCFtYXNrKQorCQlyZXR1cm4gMDsKKworCXBhc19pbnRyX21hc2sgfD0gbWFzazsKKworCXBhc193cml0ZShwYXNfaW50cl9tYXNrLCAweDBCOEIpOworCXJldHVybiAwOworfQorCitpbnQgcGFzX3JlbW92ZV9pbnRyKGludCBtYXNrKQoreworCWlmICghbWFzaykKKwkJcmV0dXJuIDA7CisKKwlwYXNfaW50cl9tYXNrICY9IH5tYXNrOworCXBhc193cml0ZShwYXNfaW50cl9tYXNrLCAweDBCOEIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqIEVuZCBvZiB0aGUgSW50ZXJydXB0IGhhbmRsZXIgKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKiogQmVnaW4gb2YgdGhlIEluaXRpYWxpemF0aW9uIENvZGUgKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaW50IF9faW5pdCBjb25maWdfcGFzX2h3KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwljaGFyICAgICAgICAgICAgb2sgPSAxOworCXVuc2lnbmVkICAgICAgICBpbnRfcHRyczsJLyogc2NzaS9zb3VuZCBpbnRlcnJ1cHQgcG9pbnRlcnMgKi8KKworCXBhc19pcnEgPSBod19jb25maWctPmlycTsKKworCXBhc193cml0ZSgweDAwLCAweDBCOEIpOworCXBhc193cml0ZSgweDM2LCAweDEzOEIpOworCXBhc193cml0ZSgweDM2LCAweDEzODgpOworCXBhc193cml0ZSgwLCAweDEzODgpOworCXBhc193cml0ZSgweDc0LCAweDEzOEIpOworCXBhc193cml0ZSgweDc0LCAweDEzODkpOworCXBhc193cml0ZSgwLCAweDEzODkpOworCisJcGFzX3dyaXRlKDB4ODAgfCAweDQwIHwgMHgyMCB8IDEsIDB4MEI4QSk7CisJcGFzX3dyaXRlKDB4ODAgfCAweDIwIHwgMHgxMCB8IDB4MDggfCAweDAxLCAweEY4QSk7CisJcGFzX3dyaXRlKDB4MDEgfCAweDAyIHwgMHgwNCB8IDB4MTAJLyoKKwkJCQkJCSAqIHwKKwkJCQkJCSAqIDB4ODAKKwkJCQkJCSAqLyAsIDB4Qjg4KTsKKworCXBhc193cml0ZSgweDgwCisJCSAgfCBqb3lzdGljaz8weDQwOjAKKwkJICAsMHhGMzg4KTsKKworCWlmIChwYXNfaXJxIDwgMCB8fCBwYXNfaXJxID4gMTUpCisJeworCQlwcmludGsoS0VSTl9FUlIgIlBBUzE2OiBJbnZhbGlkIElSUSAlZCIsIHBhc19pcnEpOworCQlod19jb25maWctPmlycT0tMTsKKwkJb2sgPSAwOworCX0KKwllbHNlCisJeworCQlpbnRfcHRycyA9IHBhc19yZWFkKDB4RjM4QSk7CisJCWludF9wdHJzID0gKGludF9wdHJzICYgMHhmMCkgfCBpcnFfYml0c1twYXNfaXJxXTsKKwkJcGFzX3dyaXRlKGludF9wdHJzLCAweEYzOEEpOworCQlpZiAoIWlycV9iaXRzW3Bhc19pcnFdKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIlBBUzE2OiBJbnZhbGlkIElSUSAlZCIsIHBhc19pcnEpOworCQkJaHdfY29uZmlnLT5pcnE9LTE7CisJCQlvayA9IDA7CisJCX0KKwkJZWxzZQorCQl7CisJCQlpZiAocmVxdWVzdF9pcnEocGFzX2lycSwgcGFzaW50ciwgMCwgIlBBUzE2Iixod19jb25maWcpIDwgMCkgeworCQkJCXByaW50ayhLRVJOX0VSUiAiUEFTMTY6IENhbm5vdCBhbGxvY2F0ZSBJUlEgJWRcbiIscGFzX2lycSk7CisJCQkJaHdfY29uZmlnLT5pcnE9LTE7CisJCQkJb2sgPSAwOworCQkJfQorCQl9CisJfQorCisJaWYgKGh3X2NvbmZpZy0+ZG1hIDwgMCB8fCBod19jb25maWctPmRtYSA+IDcpCisJeworCQlwcmludGsoS0VSTl9FUlIgIlBBUzE2OiBJbnZhbGlkIERNQSBzZWxlY3Rpb24gJWQiLCBod19jb25maWctPmRtYSk7CisJCWh3X2NvbmZpZy0+ZG1hPS0xOworCQlvayA9IDA7CisJfQorCWVsc2UKKwl7CisJCXBhc193cml0ZShkbWFfYml0c1tod19jb25maWctPmRtYV0sIDB4RjM4OSk7CisJCWlmICghZG1hX2JpdHNbaHdfY29uZmlnLT5kbWFdKQorCQl7CisJCQlwcmludGsoS0VSTl9FUlIgIlBBUzE2OiBJbnZhbGlkIERNQSBzZWxlY3Rpb24gJWQiLCBod19jb25maWctPmRtYSk7CisJCQlod19jb25maWctPmRtYT0tMTsKKwkJCW9rID0gMDsKKwkJfQorCQllbHNlCisJCXsKKwkJCWlmIChzb3VuZF9hbGxvY19kbWEoaHdfY29uZmlnLT5kbWEsICJQQVMxNiIpKQorCQkJeworCQkJCXByaW50ayhLRVJOX0VSUiAicGFzMl9jYXJkLmM6IENhbid0IGFsbG9jYXRlIERNQSBjaGFubmVsXG4iKTsKKwkJCQlod19jb25maWctPmRtYT0tMTsKKwkJCQlvayA9IDA7CisJCQl9CisJCX0KKwl9CisKKwkvKgorCSAqIFRoaXMgZml4ZXMgdGhlIHRpbWluZyBwcm9ibGVtcyBvZiB0aGUgUEFTIGR1ZSB0byB0aGUgU3ltcGhvbnkgY2hpcHNldAorCSAqIGFzIHBlciBNZWRpYSBWaXNpb24uICBPbmx5IGRlZmluZSB0aGlzIGlmIHlvdXIgUEFTIGRvZXNuJ3Qgd29yayBjb3JyZWN0bHkuCisJICovCisKKwlpZihzeW1waG9ueSkKKwl7CisJCW91dGIoKDB4MDUpLCAweGE4KTsKKwkJb3V0YigoMHg2MCksIDB4YTkpOworCX0KKworCWlmKGJyb2tlbl9idXNfY2xvY2spCisJCXBhc193cml0ZSgweDAxIHwgMHgxMCB8IDB4MjAgfCAweDA0LCAweDgzODgpOworCWVsc2UKKwkJLyoKKwkJICogcGFzX3dyaXRlKDB4MDEsIDB4ODM4OCk7CisJCSAqLworCQlwYXNfd3JpdGUoMHgwMSB8IDB4MTAgfCAweDIwLCAweDgzODgpOworCisJcGFzX3dyaXRlKDB4MTgsIDB4ODM4QSk7CS8qID8/PyAqLworCXBhc193cml0ZSgweDIwIHwgMHgwMSwgMHgwQjhBKTsJCS8qIE11dGUgb2ZmLCBmaWx0ZXIgPSAxNy44OTcga0h6ICovCisJcGFzX3dyaXRlKDgsIDB4QkY4QSk7CisKKwltaXhfd3JpdGUoMHg4MCB8IDUsIDB4MDc4Qik7CisJbWl4X3dyaXRlKDUsIDB4MDc4Qik7CisKKwl7CisJCXN0cnVjdCBhZGRyZXNzX2luZm8gKnNiX2NvbmZpZzsKKworCQlzYl9jb25maWcgPSAmY2ZnMjsKKwkJaWYgKHNiX2NvbmZpZy0+aW9fYmFzZSkKKwkJeworCQkJdW5zaWduZWQgY2hhciAgIGlycV9kbWE7CisKKwkJCS8qCisJCQkgKiBUdXJuIG9uIFNvdW5kIEJsYXN0ZXIgY29tcGF0aWJpbGl0eQorCQkJICogYml0IDEgPSBTQiBlbXVsYXRpb24KKwkJCSAqIGJpdCAwID0gTVBVNDAxIGVtdWxhdGlvbiAoQ0RQQyBvbmx5IDotKCApCisJCQkgKi8KKwkJCQorCQkJcGFzX3dyaXRlKDB4MDIsIDB4Rjc4OCk7CisKKwkJCS8qCisJCQkgKiAiRW11bGF0aW9uIGFkZHJlc3MiCisJCQkgKi8KKwkJCQorCQkJcGFzX3dyaXRlKChzYl9jb25maWctPmlvX2Jhc2UgPj4gNCkgJiAweDBmLCAweEY3ODkpOworCQkJcGFzX3NiX2Jhc2UgPSBzYl9jb25maWctPmlvX2Jhc2U7CisKKwkJCWlmICghc2JfZG1hX2JpdHNbc2JfY29uZmlnLT5kbWFdKQorCQkJCXByaW50ayhLRVJOX0VSUiAiUEFTMTYgV2FybmluZzogSW52YWxpZCBTQiBETUEgJWRcblxuIiwgc2JfY29uZmlnLT5kbWEpOworCisJCQlpZiAoIXNiX2lycV9iaXRzW3NiX2NvbmZpZy0+aXJxXSkKKwkJCQlwcmludGsoS0VSTl9FUlIgIlBBUzE2IFdhcm5pbmc6IEludmFsaWQgU0IgSVJRICVkXG5cbiIsIHNiX2NvbmZpZy0+aXJxKTsKKworCQkJaXJxX2RtYSA9IHNiX2RtYV9iaXRzW3NiX2NvbmZpZy0+ZG1hXSB8CisJCQkJc2JfaXJxX2JpdHNbc2JfY29uZmlnLT5pcnFdOworCisJCQlwYXNfd3JpdGUoaXJxX2RtYSwgMHhGQjhBKTsKKwkJfQorCQllbHNlCisJCQlwYXNfd3JpdGUoMHgwMCwgMHhGNzg4KTsKKwl9CisKKwlpZiAoIW9rKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQVMxNjogRHJpdmVyIG5vdCBlbmFibGVkXG4iKTsKKworCXJldHVybiBvazsKK30KKworc3RhdGljIGludCBfX2luaXQgZGV0ZWN0X3Bhc19odyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5zaWduZWQgY2hhciAgIGJvYXJkX2lkLCBmb287CisKKwkvKgorCSAqIFdBUk5JTkc6IFNldHRpbmcgYW4gb3B0aW9uIGxpa2UgVzoxIG9yIHNvIHRoYXQgZGlzYWJsZXMgd2FybSBib290IHJlc2V0CisJICogb2YgdGhlIGNhcmQgd2lsbCBzY3JldyB1cCB0aGlzIGRldGVjdCBjb2RlIHNvbWV0aGluZyBmaWVyY2UuIEFkZGluZyBjb2RlCisJICogdG8gaGFuZGxlIHRoaXMgbWVhbnMgcG9zc2libHkgaW50ZXJmZXJpbmcgd2l0aCBvdGhlciBjYXJkcyBvbiB0aGUgYnVzIGlmCisJICogeW91IGhhdmUgc29tZXRoaW5nIG9uIGJhc2UgcG9ydCAweDM4OC4gU08gYmUgZm9yZXdhcm5lZC4KKwkgKi8KKworCW91dGIoKDB4QkMpLCAweDlBMDEpOwkvKiBBY3RpdmF0ZSBmaXJzdCBib2FyZCAqLworCW91dGIoKGh3X2NvbmZpZy0+aW9fYmFzZSA+PiAyKSwgMHg5QTAxKTsJLyogU2V0IGJhc2UgYWRkcmVzcyAqLworCXBhc190cmFuc2xhdGVfY29kZSA9IGh3X2NvbmZpZy0+aW9fYmFzZSAtIDB4Mzg4OworCXBhc193cml0ZSgxLCAweEJGODgpOwkvKiBTZWxlY3Qgb25lIHdhaXQgc3RhdGVzICovCisKKwlib2FyZF9pZCA9IHBhc19yZWFkKDB4MEI4Qik7CisKKwlpZiAoYm9hcmRfaWQgPT0gMHhmZikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIFdlIHByb2JhYmx5IGhhdmUgYSBQQVMtc2VyaWVzIGJvYXJkLCBub3cgY2hlY2sgZm9yIGEgUEFTMTYtc2VyaWVzIGJvYXJkCisJICogYnkgdHJ5aW5nIHRvIGNoYW5nZSB0aGUgYm9hcmQgcmV2aXNpb24gYml0cy4gUEFTMTYtc2VyaWVzIGhhcmR3YXJlIHdvbid0CisJICogbGV0IHlvdSBkbyB0aGlzIC0gdGhlIGJpdHMgYXJlIHJlYWQtb25seS4KKwkgKi8KKworCWZvbyA9IGJvYXJkX2lkIF4gMHhlMDsKKworCXBhc193cml0ZShmb28sIDB4MEI4Qik7CisJZm9vID0gcGFzX3JlYWQoMHgwQjhCKTsKKwlwYXNfd3JpdGUoYm9hcmRfaWQsIDB4MEI4Qik7CisKKwlpZiAoYm9hcmRfaWQgIT0gZm9vKQorCQlyZXR1cm4gMDsKKworCXBhc19tb2RlbCA9IHBhc19yZWFkKDB4RkY4OCk7CisKKwlyZXR1cm4gcGFzX21vZGVsOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX3Bhc19jYXJkKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlwYXNfaXJxID0gaHdfY29uZmlnLT5pcnE7CisKKwlpZiAoZGV0ZWN0X3Bhc19odyhod19jb25maWcpKQorCXsKKworCQlpZiAoKHBhc19tb2RlbCA9IHBhc19yZWFkKDB4RkY4OCkpKQorCQl7CisJCQljaGFyICAgICAgICAgICAgdGVtcFsxMDBdOworCisJCQlzcHJpbnRmKHRlbXAsCisJCQkgICAgIiVzIHJldiAlZCIsIHBhc19tb2RlbF9uYW1lc1soaW50KSBwYXNfbW9kZWxdLAorCQkJCSAgICBwYXNfcmVhZCgweDI3ODkpKTsKKwkJCWNvbmZfcHJpbnRmKHRlbXAsIGh3X2NvbmZpZyk7CisJCX0KKwkJaWYgKGNvbmZpZ19wYXNfaHcoaHdfY29uZmlnKSkKKwkJeworCQkJcGFzX3BjbV9pbml0KGh3X2NvbmZpZyk7CisJCQlwYXNfbWlkaV9pbml0KCk7CisJCQlwYXNfaW5pdF9taXhlcigpOworCQl9CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBfX2luaXQgcHJvYmVfcGFzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlyZXR1cm4gZGV0ZWN0X3Bhc19odyhod19jb25maWcpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX3BhcyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJZXh0ZXJuIGludCBwYXNfYXVkaW9kZXY7CisJZXh0ZXJuIGludCBwYXMyX21pZGlkZXY7CisKKwlpZiAoaHdfY29uZmlnLT5kbWE+MCkKKwkJc291bmRfZnJlZV9kbWEoaHdfY29uZmlnLT5kbWEpOworCWlmIChod19jb25maWctPmlycT4wKQorCQlmcmVlX2lycShod19jb25maWctPmlycSwgaHdfY29uZmlnKTsKKworCWlmKHBhc19hdWRpb2RldiE9LTEpCisJCXNvdW5kX3VubG9hZF9taXhlcmRldihhdWRpb19kZXZzW3Bhc19hdWRpb2Rldl0tPm1peGVyX2Rldik7CisJaWYocGFzMl9taWRpZGV2IT0tMSkKKwkgICAgICAgIHNvdW5kX3VubG9hZF9taWRpZGV2KHBhczJfbWlkaWRldik7CisJaWYocGFzX2F1ZGlvZGV2IT0tMSkKKwkJc291bmRfdW5sb2FkX2F1ZGlvZGV2KHBhc19hdWRpb2Rldik7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpbwk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGlycQk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGRtYQk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIGRtYTE2CT0gLTE7CS8qIFNldCB0aGlzIGZvciBtb2R1bGVzIHRoYXQgbmVlZCBpdCAqLworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgc2JfaW8JPSAwOworc3RhdGljIGludCBfX2luaXRkYXRhIHNiX2lycQk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIHNiX2RtYQk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIHNiX2RtYTE2CT0gLTE7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZG1hLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYTE2LCBpbnQsIDApOworCittb2R1bGVfcGFyYW0oc2JfaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc2JfaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNiX2RtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzYl9kbWExNiwgaW50LCAwKTsKKworbW9kdWxlX3BhcmFtKGpveXN0aWNrLCBib29sLCAwKTsKK21vZHVsZV9wYXJhbShzeW1waG9ueSwgYm9vbCwgMCk7Cittb2R1bGVfcGFyYW0oYnJva2VuX2J1c19jbG9jaywgYm9vbCwgMCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9wYXMyKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAiUHJvIEF1ZGlvIFNwZWN0cnVtIGRyaXZlciBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk2XG4iKTsKKworCWNmZy5pb19iYXNlID0gaW87CisJY2ZnLmlycSA9IGlycTsKKwljZmcuZG1hID0gZG1hOworCWNmZy5kbWEyID0gZG1hMTY7CisKKwljZmcyLmlvX2Jhc2UgPSBzYl9pbzsKKwljZmcyLmlycSA9IHNiX2lycTsKKwljZmcyLmRtYSA9IHNiX2RtYTsKKwljZmcyLmRtYTIgPSBzYl9kbWExNjsKKworCWlmIChjZmcuaW9fYmFzZSA9PSAtMSB8fCBjZmcuZG1hID09IC0xIHx8IGNmZy5pcnEgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiSS9PLCBJUlEsIERNQSBhbmQgdHlwZSBhcmUgbWFuZGF0b3J5XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFwcm9iZV9wYXMoJmNmZykpCisJCXJldHVybiAtRU5PREVWOworCWF0dGFjaF9wYXNfY2FyZCgmY2ZnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9wYXMyKHZvaWQpCit7CisJdW5sb2FkX3BhcygmY2ZnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9wYXMyKTsKK21vZHVsZV9leGl0KGNsZWFudXBfcGFzMik7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF9wYXMyKGNoYXIgKnN0cikKK3sKKwkvKiBpbywgaXJxLCBkbWEsIGRtYTIsIHNiX2lvLCBzYl9pcnEsIHNiX2RtYSwgc2JfZG1hMiAqLworCWludCBpbnRzWzldOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpbwk9IGludHNbMV07CisJaXJxCT0gaW50c1syXTsKKwlkbWEJPSBpbnRzWzNdOworCWRtYTE2CT0gaW50c1s0XTsKKworCXNiX2lvCT0gaW50c1s1XTsKKwlzYl9pcnEJPSBpbnRzWzZdOworCXNiX2RtYQk9IGludHNbN107CisJc2JfZG1hMTYgPSBpbnRzWzhdOworCisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoInBhczI9Iiwgc2V0dXBfcGFzMik7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9wYXMyX21pZGkuYyBiL3NvdW5kL29zcy9wYXMyX21pZGkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWQ2YTU4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3BhczJfbWlkaS5jCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogc291bmQvcGFzMl9taWRpLmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgdGhlIFBBUyBNaWRpIEludGVyZmFjZS4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqIEJhcnRsb21pZWogWm9sbmllcmtpZXdpY3oJOiBBZGRlZCBfX2luaXQgdG8gcGFzX2luaXRfbWl4ZXIoKQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2luY2x1ZGUgInBhczIuaCIKKworZXh0ZXJuIHNwaW5sb2NrX3QgcGFzX2xvY2s7CisKK3N0YXRpYyBpbnQgICAgICBtaWRpX2J1c3ksIGlucHV0X29wZW5lZDsKK3N0YXRpYyBpbnQgICAgICBteV9kZXY7CisKK2ludCBwYXMyX21pZGlkZXY9LTE7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRtcF9xdWV1ZVsyNTZdOworc3RhdGljIHZvbGF0aWxlIGludCBxbGVuOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgcWhlYWQsIHF0YWlsOworCitzdGF0aWMgdm9pZCAgICAgKCptaWRpX2lucHV0X2ludHIpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpOworCitzdGF0aWMgaW50IHBhc19taWRpX29wZW4oaW50IGRldiwgaW50IG1vZGUsCisJICAgICAgdm9pZCAgICAgICAgICAgICgqaW5wdXQpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpLAorCSAgICAgIHZvaWQgICAgICAgICAgICAoKm91dHB1dCkgKGludCBkZXYpCispCit7CisJaW50ICAgICAgICAgICAgIGVycjsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJdW5zaWduZWQgY2hhciAgIGN0cmw7CisKKworCWlmIChtaWRpX2J1c3kpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKgorCSAqIFJlc2V0IGlucHV0IGFuZCBvdXRwdXQgRklGTyBwb2ludGVycworCSAqLworCXBhc193cml0ZSgweDIwIHwgMHg0MCwKKwkJICAweDE3OGIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBhc19sb2NrLCBmbGFncyk7CisKKwlpZiAoKGVyciA9IHBhc19zZXRfaW50cigweDEwKSkgPCAwKQorCXsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcGFzX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJLyoKKwkgKiBFbmFibGUgaW5wdXQgYXZhaWxhYmxlIGFuZCBvdXRwdXQgRklGTyBlbXB0eSBpbnRlcnJ1cHRzCisJICovCisKKwljdHJsID0gMDsKKwlpbnB1dF9vcGVuZWQgPSAwOworCW1pZGlfaW5wdXRfaW50ciA9IGlucHV0OworCisJaWYgKG1vZGUgPT0gT1BFTl9SRUFEIHx8IG1vZGUgPT0gT1BFTl9SRUFEV1JJVEUpCisJeworCQljdHJsIHw9IDB4MDQ7CS8qIEVuYWJsZSBpbnB1dCAqLworCQlpbnB1dF9vcGVuZWQgPSAxOworCX0KKwlpZiAobW9kZSA9PSBPUEVOX1dSSVRFIHx8IG1vZGUgPT0gT1BFTl9SRUFEV1JJVEUpCisJeworCQljdHJsIHw9IDB4MDggfCAweDEwOwkvKiBFbmFibGUgb3V0cHV0ICovCisJfQorCXBhc193cml0ZShjdHJsLCAweDE3OGIpOworCisJLyoKKwkgKiBBY2tub3dsZWRnZSBhbnkgcGVuZGluZyBpbnRlcnJ1cHRzCisJICovCisKKwlwYXNfd3JpdGUoMHhmZiwgMHgxQjg4KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhc19sb2NrLCBmbGFncyk7CisKKwltaWRpX2J1c3kgPSAxOworCXFsZW4gPSBxaGVhZCA9IHF0YWlsID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGFzX21pZGlfY2xvc2UoaW50IGRldikKK3sKKworCS8qCisJICogUmVzZXQgRklGTyBwb2ludGVycywgZGlzYWJsZSBpbnRycworCSAqLworCXBhc193cml0ZSgweDIwIHwgMHg0MCwgMHgxNzhiKTsKKworCXBhc19yZW1vdmVfaW50cigweDEwKTsKKwltaWRpX2J1c3kgPSAwOworfQorCitzdGF0aWMgaW50IGR1bXBfdG9fbWlkaSh1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKK3sKKwlpbnQgZmlmb19zcGFjZSwgeDsKKworCWZpZm9fc3BhY2UgPSAoKHggPSBwYXNfcmVhZCgweDFCODkpKSA+PiA0KSAmIDB4MGY7CisKKwkvKgorCSAqIFRoZSBNSURJIEZJRk8gc3BhY2UgcmVnaXN0ZXIgYW5kIGl0J3MgZG9jdW1lbnRhdGlvbiBpcyBub251bmRlcnN0YW5kYWJsZS4KKwkgKiBUaGVyZSBzZWVtIHRvIGJlIG5vIHdheSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYnVmZmVyIGZ1bGwgYW5kIGJ1ZmZlcgorCSAqIGVtcHR5IHNpdHVhdGlvbnMuIEZvciB0aGlzIHJlYXNvbiB3ZSBkb24ndCBuZXZlciB3cml0ZSB0aGUgYnVmZmVyCisJICogY29tcGxldGVseSBmdWxsLiBJbiB0aGlzIHdheSB3ZSBjYW4gYXNzdW1lIHRoYXQgMCAob3IgaXMgaXQgMTUpCisJICogbWVhbnMgdGhhdCB0aGUgYnVmZmVyIGlzIGVtcHR5LgorCSAqLworCisJaWYgKGZpZm9fc3BhY2UgPCAyICYmIGZpZm9fc3BhY2UgIT0gMCkJLyogRnVsbCAoYWxtb3N0KSAqLworCQlyZXR1cm4gMDsJLyogQXNrIHVwcGVyIGxheWVycyB0byByZXRyeSBhZnRlciBzb21lIHRpbWUgKi8KKworCXBhc193cml0ZShtaWRpX2J5dGUsIDB4MTc4QSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwYXNfbWlkaV9vdXQoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCit7CisKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBEcmFpbiB0aGUgbG9jYWwgcXVldWUgZmlyc3QKKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYXNfbG9jaywgZmxhZ3MpOworCisJd2hpbGUgKHFsZW4gJiYgZHVtcF90b19taWRpKHRtcF9xdWV1ZVtxaGVhZF0pKQorCXsKKwkJcWxlbi0tOworCQlxaGVhZCsrOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhc19sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqCU91dHB1dCB0aGUgYnl0ZSBpZiB0aGUgbG9jYWwgcXVldWUgaXMgZW1wdHkuCisJICovCisKKwlpZiAoIXFsZW4pCisJCWlmIChkdW1wX3RvX21pZGkobWlkaV9ieXRlKSkKKwkJCXJldHVybiAxOworCisJLyoKKwkgKglQdXQgdG8gdGhlIGxvY2FsIHF1ZXVlCisJICovCisKKwlpZiAocWxlbiA+PSAyNTYpCisJCXJldHVybiAwOwkvKiBMb2NhbCBxdWV1ZSBmdWxsICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGFzX2xvY2ssIGZsYWdzKTsKKworCXRtcF9xdWV1ZVtxdGFpbF0gPSBtaWRpX2J5dGU7CisJcWxlbisrOworCXF0YWlsKys7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcGFzX21pZGlfc3RhcnRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBhc19taWRpX2VuZF9yZWFkKGludCBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhc19taWRpX2tpY2soaW50IGRldikKK3sKK30KKworc3RhdGljIGludCBwYXNfYnVmZmVyX3N0YXR1cyhpbnQgZGV2KQoreworCXJldHVybiBxbGVuOworfQorCisjZGVmaW5lIE1JRElfU1lOVEhfTkFNRQkiUHJvIEF1ZGlvIFNwZWN0cnVtIE1pZGkiCisjZGVmaW5lIE1JRElfU1lOVEhfQ0FQUwlTWU5USF9DQVBfSU5QVVQKKyNpbmNsdWRlICJtaWRpX3N5bnRoLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIHBhc19taWRpX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7IlBybyBBdWRpbyBTcGVjdHJ1bSIsIDAsIDAsIFNORENBUkRfUEFTfSwKKwkuY29udmVydGVyCT0gJnN0ZF9taWRpX3N5bnRoLAorCS5pbl9pbmZvCT0gezB9LAorCS5vcGVuCQk9IHBhc19taWRpX29wZW4sCisJLmNsb3NlCQk9IHBhc19taWRpX2Nsb3NlLAorCS5vdXRwdXRjCT0gcGFzX21pZGlfb3V0LAorCS5zdGFydF9yZWFkCT0gcGFzX21pZGlfc3RhcnRfcmVhZCwKKwkuZW5kX3JlYWQJPSBwYXNfbWlkaV9lbmRfcmVhZCwKKwkua2ljawkJPSBwYXNfbWlkaV9raWNrLAorCS5idWZmZXJfc3RhdHVzCT0gcGFzX2J1ZmZlcl9zdGF0dXMsCit9OworCit2b2lkIF9faW5pdCBwYXNfbWlkaV9pbml0KHZvaWQpCit7CisJaW50IGRldiA9IHNvdW5kX2FsbG9jX21pZGlkZXYoKTsKKworCWlmIChkZXYgPT0gLTEpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwYXNfbWlkaV9pbml0OiBUb28gbWFueSBtaWRpIGRldmljZXMgZGV0ZWN0ZWRcbiIpOworCQlyZXR1cm47CisJfQorCXN0ZF9taWRpX3N5bnRoLm1pZGlfZGV2ID0gbXlfZGV2ID0gZGV2OworCW1pZGlfZGV2c1tkZXZdID0gJnBhc19taWRpX29wZXJhdGlvbnM7CisJcGFzMl9taWRpZGV2ID0gZGV2OworCXNlcXVlbmNlcl9pbml0KCk7Cit9CisKK3ZvaWQgcGFzX21pZGlfaW50ZXJydXB0KHZvaWQpCit7CisJdW5zaWduZWQgY2hhciAgIHN0YXQ7CisJaW50ICAgICAgICAgICAgIGksIGluY291bnQ7CisKKwlzdGF0ID0gcGFzX3JlYWQoMHgxQjg4KTsKKworCWlmIChzdGF0ICYgMHgwNCkJLyogSW5wdXQgZGF0YSBhdmFpbGFibGUgKi8KKwl7CisJCWluY291bnQgPSBwYXNfcmVhZCgweDFCODkpICYgMHgwZjsJLyogSW5wdXQgRklGTyBzaXplICovCisJCWlmICghaW5jb3VudCkKKwkJCWluY291bnQgPSAxNjsKKworCQlmb3IgKGkgPSAwOyBpIDwgaW5jb3VudDsgaSsrKQorCQkJaWYgKGlucHV0X29wZW5lZCkKKwkJCXsKKwkJCQltaWRpX2lucHV0X2ludHIobXlfZGV2LCBwYXNfcmVhZCgweDE3OEEpKTsKKwkJCX0gZWxzZQorCQkJCXBhc19yZWFkKDB4MTc4QSk7CS8qIEZsdXNoICovCisJfQorCWlmIChzdGF0ICYgKDB4MDggfCAweDEwKSkKKwl7CisJCXNwaW5fbG9jaygmcGFzX2xvY2spOy8qIGNhbGxlZCBpbiBpcnEgY29udGV4dCAqLworCisJCXdoaWxlIChxbGVuICYmIGR1bXBfdG9fbWlkaSh0bXBfcXVldWVbcWhlYWRdKSkKKwkJeworCQkJcWxlbi0tOworCQkJcWhlYWQrKzsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZwYXNfbG9jayk7CisJfQorCWlmIChzdGF0ICYgMHg0MCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIk1JREkgb3V0cHV0IG92ZXJydW4gJXgsJXhcbiIsIHBhc19yZWFkKDB4MUI4OSksIHN0YXQpOworCX0KKwlwYXNfd3JpdGUoc3RhdCwgMHgxQjg4KTsJLyogQWNrbm93bGVkZ2UgaW50ZXJydXB0cyAqLworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3BhczJfbWl4ZXIuYyBiL3NvdW5kL29zcy9wYXMyX21peGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFhZGU1MwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9wYXMyX21peGVyLmMKQEAgLTAsMCArMSwzMzYgQEAKKworLyoKKyAqIHNvdW5kL3BhczJfbWl4ZXIuYworICoKKyAqIE1peGVyIHJvdXRpbmVzIGZvciB0aGUgUHJvIEF1ZGlvIFNwZWN0cnVtIGNhcmRzLgorICovCisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqLworLyoKKyAqIFRob21hcyBTYWlsZXIgICA6IGlvY3RsIGNvZGUgcmV3b3JrZWQgKHZtYWxsb2MvdmZyZWUgcmVtb3ZlZCkKKyAqIEJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogOiBhZGRlZCBfX2luaXQgdG8gcGFzX2luaXRfbWl4ZXIoKQorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAicGFzMi5oIgorCisjaWZuZGVmIERFQgorI2RlZmluZSBERUIod2hhdCkJCS8qICh3aGF0KSAqLworI2VuZGlmCisKK2V4dGVybiBpbnQgICAgICBwYXNfdHJhbnNsYXRlX2NvZGU7CitleHRlcm4gY2hhciAgICAgcGFzX21vZGVsOworZXh0ZXJuIGludCAgICAgKnBhc19vc3A7CitleHRlcm4gaW50ICAgICAgcGFzX2F1ZGlvZGV2OworCitzdGF0aWMgaW50ICAgICAgcmVjX2RldmljZXMgPSAoU09VTkRfTUFTS19NSUMpOwkJLyogRGVmYXVsdCByZWNvcmRpbmcgc291cmNlICovCitzdGF0aWMgaW50ICAgICAgbW9kZV9jb250cm9sOworCisjZGVmaW5lIFBPU1NJQkxFX1JFQ09SRElOR19ERVZJQ0VTCShTT1VORF9NQVNLX1NZTlRIIHwgU09VTkRfTUFTS19TUEVBS0VSIHwgU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19NSUMgfCBcCisJCQkJCSBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19BTFRQQ00pCisKKyNkZWZpbmUgU1VQUE9SVEVEX01JWEVSX0RFVklDRVMJCShTT1VORF9NQVNLX1NZTlRIIHwgU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX1NQRUFLRVIgfCBTT1VORF9NQVNLX0xJTkUgfCBTT1VORF9NQVNLX01JQyB8IFwKKwkJCQkJIFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX0FMVFBDTSB8IFNPVU5EX01BU0tfSU1JWCB8IFwKKwkJCQkJIFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19CQVNTIHwgU09VTkRfTUFTS19UUkVCTEUgfCBTT1VORF9NQVNLX1JFQ0xFVikKKworc3RhdGljIGludCAgICAgKmxldmVsczsKKworc3RhdGljIGludCAgICAgIGRlZmF1bHRfbGV2ZWxzWzMyXSA9Cit7CisJMHgzMjMyLAkJCS8qIE1hc3RlciBWb2x1bWUgKi8KKwkweDMyMzIsCQkJLyogQmFzcyAqLworCTB4MzIzMiwJCQkvKiBUcmVibGUgKi8KKwkweDUwNTAsCQkJLyogRk0gKi8KKwkweDRiNGIsCQkJLyogUENNICovCisJMHgzMjMyLAkJCS8qIFBDIFNwZWFrZXIgKi8KKwkweDRiNGIsCQkJLyogRXh0IExpbmUgKi8KKwkweDRiNGIsCQkJLyogTWljICovCisJMHg0YjRiLAkJCS8qIENEICovCisJMHg2NDY0LAkJCS8qIFJlY29yZGluZyBtb25pdG9yICovCisJMHg0YjRiLAkJCS8qIFNCIFBDTSAqLworCTB4NjQ2NAkJCS8qIFJlY29yZGluZyBsZXZlbCAqLworfTsKKwordm9pZAorbWl4X3dyaXRlKHVuc2lnbmVkIGNoYXIgZGF0YSwgaW50IGlvYWRkcikKK3sKKwkvKgorCSAqIFRoZSBSZXZpc2lvbiBEIGNhcmRzIGhhdmUgYSBwcm9ibGVtIHdpdGggdGhlaXIgTVZBNTA4IGludGVyZmFjZS4gVGhlCisJICoga2x1ZGdlLW8tcmFtYSBmaXggaXMgdG8gbWFrZSBhIDE2LWJpdCBxdWFudGl0eSB3aXRoIGlkZW50aWNhbCBMU0IgYW5kCisJICogTVNCcyBvdXQgb2YgdGhlIG91dHB1dCBieXRlIGFuZCB0byBkbyBhIDE2LWJpdCBvdXQgdG8gdGhlIG1peGVyIHBvcnQgLQorCSAqIDEuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIGl0IGlzbid0IHRpbWluZyBwcm9ibGVtIGJ1dCBjaGlwIGFjY2VzcworCSAqIHNlcXVlbmNlIHByb2JsZW0uCisJICovCisKKwlpZiAocGFzX21vZGVsID09IDQpCisJICB7CisJCSAgb3V0dyhkYXRhIHwgKGRhdGEgPDwgOCksIChpb2FkZHIgKyBwYXNfdHJhbnNsYXRlX2NvZGUpIC0gMSk7CisJCSAgb3V0YigoMHg4MCksIDApOworCX0gZWxzZQorCQlwYXNfd3JpdGUoZGF0YSwgaW9hZGRyKTsKK30KKworc3RhdGljIGludAorbWl4ZXJfb3V0cHV0KGludCByaWdodF92b2wsIGludCBsZWZ0X3ZvbCwgaW50IGRpdiwgaW50IGJpdHMsCisJICAgICBpbnQgbWl4ZXIpCQkvKiBJbnB1dCBvciBvdXRwdXQgbWl4ZXIgKi8KK3sKKwlpbnQgICAgICAgICAgICAgbGVmdCA9IGxlZnRfdm9sICogZGl2IC8gMTAwOworCWludCAgICAgICAgICAgICByaWdodCA9IHJpZ2h0X3ZvbCAqIGRpdiAvIDEwMDsKKworCisJaWYgKGJpdHMgJiAweDEwKQorCSAgeworCQkgIGxlZnQgfD0gbWl4ZXI7CisJCSAgcmlnaHQgfD0gbWl4ZXI7CisJICB9CisJaWYgKGJpdHMgPT0gMHgwMyB8fCBiaXRzID09IDB4MDQpCisJICB7CisJCSAgbWl4X3dyaXRlKDB4ODAgfCBiaXRzLCAweDA3OEIpOworCQkgIG1peF93cml0ZShsZWZ0LCAweDA3OEIpOworCQkgIHJpZ2h0X3ZvbCA9IGxlZnRfdm9sOworCX0gZWxzZQorCSAgeworCQkgIG1peF93cml0ZSgweDgwIHwgMHgyMCB8IGJpdHMsIDB4MDc4Qik7CisJCSAgbWl4X3dyaXRlKGxlZnQsIDB4MDc4Qik7CisJCSAgbWl4X3dyaXRlKDB4ODAgfCAweDQwIHwgYml0cywgMHgwNzhCKTsKKwkJICBtaXhfd3JpdGUocmlnaHQsIDB4MDc4Qik7CisJICB9CisKKwlyZXR1cm4gKGxlZnRfdm9sIHwgKHJpZ2h0X3ZvbCA8PCA4KSk7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRfbW9kZShpbnQgbmV3X21vZGUpCit7CisJbWl4X3dyaXRlKDB4ODAgfCAweDA1LCAweDA3OEIpOworCW1peF93cml0ZShuZXdfbW9kZSwgMHgwNzhCKTsKKworCW1vZGVfY29udHJvbCA9IG5ld19tb2RlOworfQorCitzdGF0aWMgaW50CitwYXNfbWl4ZXJfc2V0KGludCB3aGljaERldiwgdW5zaWduZWQgaW50IGxldmVsKQoreworCWludCAgICAgICAgICAgICBsZWZ0LCByaWdodCwgZGV2bWFzaywgY2hhbmdlZCwgaSwgbWl4ZXIgPSAwOworCisJREVCKHByaW50aygic3RhdGljIGludCBwYXNfbWl4ZXJfc2V0KGludCB3aGljaERldiA9ICVkLCB1bnNpZ25lZCBpbnQgbGV2ZWwgPSAlWClcbiIsIHdoaWNoRGV2LCBsZXZlbCkpOworCisJbGVmdCA9IGxldmVsICYgMHg3ZjsKKwlyaWdodCA9IChsZXZlbCAmIDB4N2YwMCkgPj4gODsKKworCWlmICh3aGljaERldiA8IFNPVU5EX01JWEVSX05SREVWSUNFUykgeworCQlpZiAoKDEgPDwgd2hpY2hEZXYpICYgcmVjX2RldmljZXMpCisJCQltaXhlciA9IDB4MjA7CisJCWVsc2UKKwkJCW1peGVyID0gMHgwMDsKKwl9CisKKwlzd2l0Y2ggKHdoaWNoRGV2KQorCSAgeworCSAgY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CS8qIE1hc3RlciB2b2x1bWUgKDAtNjMpICovCisJCSAgbGV2ZWxzW3doaWNoRGV2XSA9IG1peGVyX291dHB1dChyaWdodCwgbGVmdCwgNjMsIDB4MDEsIDApOworCQkgIGJyZWFrOworCisJCSAgLyoKKwkJICAgKiBOb3RlISBCYXNzIGFuZCBUcmVibGUgYXJlIG1vbm8gZGV2aWNlcy4gV2lsbCB1c2UganVzdCB0aGUgbGVmdAorCQkgICAqIGNoYW5uZWwuCisJCSAgICovCisJICBjYXNlIFNPVU5EX01JWEVSX0JBU1M6CS8qIEJhc3MgKDAtMTIpICovCisJCSAgbGV2ZWxzW3doaWNoRGV2XSA9IG1peGVyX291dHB1dChyaWdodCwgbGVmdCwgMTIsIDB4MDMsIDApOworCQkgIGJyZWFrOworCSAgY2FzZSBTT1VORF9NSVhFUl9UUkVCTEU6CS8qIFRyZWJsZSAoMC0xMikgKi8KKwkJICBsZXZlbHNbd2hpY2hEZXZdID0gbWl4ZXJfb3V0cHV0KHJpZ2h0LCBsZWZ0LCAxMiwgMHgwNCwgMCk7CisJCSAgYnJlYWs7CisKKwkgIGNhc2UgU09VTkRfTUlYRVJfU1lOVEg6CS8qIEludGVybmFsIHN5bnRoZXNpemVyICgwLTMxKSAqLworCQkgIGxldmVsc1t3aGljaERldl0gPSBtaXhlcl9vdXRwdXQocmlnaHQsIGxlZnQsIDMxLCAweDEwIHwgMHgwMCwgbWl4ZXIpOworCQkgIGJyZWFrOworCSAgY2FzZSBTT1VORF9NSVhFUl9QQ006CS8qIFBBUyBQQ00gKDAtMzEpICovCisJCSAgbGV2ZWxzW3doaWNoRGV2XSA9IG1peGVyX291dHB1dChyaWdodCwgbGVmdCwgMzEsIDB4MTAgfCAweDA1LCBtaXhlcik7CisJCSAgYnJlYWs7CisJICBjYXNlIFNPVU5EX01JWEVSX0FMVFBDTToJLyogU0IgUENNICgwLTMxKSAqLworCQkgIGxldmVsc1t3aGljaERldl0gPSBtaXhlcl9vdXRwdXQocmlnaHQsIGxlZnQsIDMxLCAweDEwIHwgMHgwNywgbWl4ZXIpOworCQkgIGJyZWFrOworCSAgY2FzZSBTT1VORF9NSVhFUl9TUEVBS0VSOgkvKiBQQyBzcGVha2VyICgwLTMxKSAqLworCQkgIGxldmVsc1t3aGljaERldl0gPSBtaXhlcl9vdXRwdXQocmlnaHQsIGxlZnQsIDMxLCAweDEwIHwgMHgwNiwgbWl4ZXIpOworCQkgIGJyZWFrOworCSAgY2FzZSBTT1VORF9NSVhFUl9MSU5FOgkvKiBFeHRlcm5hbCBsaW5lICgwLTMxKSAqLworCQkgIGxldmVsc1t3aGljaERldl0gPSBtaXhlcl9vdXRwdXQocmlnaHQsIGxlZnQsIDMxLCAweDEwIHwgMHgwMiwgbWl4ZXIpOworCQkgIGJyZWFrOworCSAgY2FzZSBTT1VORF9NSVhFUl9DRDoJLyogQ0QgKDAtMzEpICovCisJCSAgbGV2ZWxzW3doaWNoRGV2XSA9IG1peGVyX291dHB1dChyaWdodCwgbGVmdCwgMzEsIDB4MTAgfCAweDAzLCBtaXhlcik7CisJCSAgYnJlYWs7CisJICBjYXNlIFNPVU5EX01JWEVSX01JQzoJLyogRXh0ZXJuYWwgbWljcm9waG9uZSAoMC0zMSkgKi8KKwkJICBsZXZlbHNbd2hpY2hEZXZdID0gbWl4ZXJfb3V0cHV0KHJpZ2h0LCBsZWZ0LCAzMSwgMHgxMCB8IDB4MDQsIG1peGVyKTsKKwkJICBicmVhazsKKwkgIGNhc2UgU09VTkRfTUlYRVJfSU1JWDoJLyogUmVjb3JkaW5nIG1vbml0b3IgKDAtMzEpIChPdXRwdXQgbWl4ZXIgb25seSkgKi8KKwkJICBsZXZlbHNbd2hpY2hEZXZdID0gbWl4ZXJfb3V0cHV0KHJpZ2h0LCBsZWZ0LCAzMSwgMHgxMCB8IDB4MDEsCisJCQkJCQkgIDB4MDApOworCQkgIGJyZWFrOworCSAgY2FzZSBTT1VORF9NSVhFUl9SRUNMRVY6CS8qIFJlY29yZGluZyBsZXZlbCAoMC0xNSkgKi8KKwkJICBsZXZlbHNbd2hpY2hEZXZdID0gbWl4ZXJfb3V0cHV0KHJpZ2h0LCBsZWZ0LCAxNSwgMHgwMiwgMCk7CisJCSAgYnJlYWs7CisKKworCSAgY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCSAgZGV2bWFzayA9IGxldmVsICYgUE9TU0lCTEVfUkVDT1JESU5HX0RFVklDRVM7CisKKwkJICBjaGFuZ2VkID0gZGV2bWFzayBeIHJlY19kZXZpY2VzOworCQkgIHJlY19kZXZpY2VzID0gZGV2bWFzazsKKworCQkgIGZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCSAgaWYgKGNoYW5nZWQgJiAoMSA8PCBpKSkKKwkJCSAgICB7CisJCQkJICAgIHBhc19taXhlcl9zZXQoaSwgbGV2ZWxzW2ldKTsKKwkJCSAgICB9CisJCSAgcmV0dXJuIHJlY19kZXZpY2VzOworCQkgIGJyZWFrOworCisJICBkZWZhdWx0OgorCQkgIHJldHVybiAtRUlOVkFMOworCSAgfQorCisJcmV0dXJuIChsZXZlbHNbd2hpY2hEZXZdKTsKK30KKworLyoqKioqLworCitzdGF0aWMgdm9pZAorcGFzX21peGVyX3Jlc2V0KHZvaWQpCit7CisJaW50ICAgICAgICAgICAgIGZvbzsKKworCURFQihwcmludGsoInBhczJfbWl4ZXIuYzogdm9pZCBwYXNfbWl4ZXJfcmVzZXQodm9pZClcbiIpKTsKKworCWZvciAoZm9vID0gMDsgZm9vIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBmb28rKykKKwkJcGFzX21peGVyX3NldChmb28sIGxldmVsc1tmb29dKTsKKworCXNldF9tb2RlKDB4MDQgfCAweDAxKTsKK30KKworc3RhdGljIGludCBwYXNfbWl4ZXJfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKmFyZykKK3sKKwlpbnQgbGV2ZWwsdiA7CisJaW50IF9fdXNlciAqcCA9IChpbnQgX191c2VyICopYXJnOworCisJREVCKHByaW50aygicGFzMl9taXhlci5jOiBpbnQgcGFzX21peGVyX2lvY3RsKHVuc2lnbmVkIGludCBjbWQgPSAlWCwgdW5zaWduZWQgaW50IGFyZyA9ICVYKVxuIiwgY21kLCBhcmcpKTsKKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUxKSB7IC8qIFNldCBsb3VkbmVzcyBiaXQgKi8KKwkJaWYgKGdldF91c2VyKGxldmVsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAobGV2ZWwgPT0gLTEpICAvKiBSZXR1cm4gY3VycmVudCBzZXR0aW5ncyAqLworCQkJbGV2ZWwgPSAobW9kZV9jb250cm9sICYgMHgwNCk7CisJCWVsc2UgeworCQkJbW9kZV9jb250cm9sICY9IH4weDA0OworCQkJaWYgKGxldmVsKQorCQkJCW1vZGVfY29udHJvbCB8PSAweDA0OworCQkJc2V0X21vZGUobW9kZV9jb250cm9sKTsKKwkJfQorCQlsZXZlbCA9ICEhbGV2ZWw7CisJCXJldHVybiBwdXRfdXNlcihsZXZlbCwgcCk7CisJfQorCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfUFJJVkFURTIpIHsgLyogU2V0IGVuaGFuY2UgYml0ICovCisJCWlmIChnZXRfdXNlcihsZXZlbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGxldmVsID09IC0xKSB7IC8qIFJldHVybiBjdXJyZW50IHNldHRpbmdzICovCisJCQlpZiAoIShtb2RlX2NvbnRyb2wgJiAweDAzKSkKKwkJCQlsZXZlbCA9IDA7CisJCQllbHNlCisJCQkJbGV2ZWwgPSAoKG1vZGVfY29udHJvbCAmIDB4MDMpICsgMSkgKiAyMDsKKwkJfSBlbHNlIHsKKwkJCWludCBpID0gMDsKKwkJCQorCQkJbGV2ZWwgJj0gMHg3ZjsKKwkJCWlmIChsZXZlbCkKKwkJCQlpID0gKGxldmVsIC8gMjApIC0gMTsKKwkJCW1vZGVfY29udHJvbCAmPSB+MHgwMzsKKwkJCW1vZGVfY29udHJvbCB8PSBpICYgMHgwMzsKKwkJCXNldF9tb2RlKG1vZGVfY29udHJvbCk7CisJCQlpZiAoaSkKKwkJCQlpID0gKGkgKyAxKSAqIDIwOworCQkJbGV2ZWwgPSBpOworCQl9CisJCXJldHVybiBwdXRfdXNlcihsZXZlbCwgcCk7CisJfQorCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfUFJJVkFURTMpIHsgLyogU2V0IG11dGUgYml0ICovCisJCWlmIChnZXRfdXNlcihsZXZlbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGxldmVsID09IC0xKQkvKiBSZXR1cm4gY3VycmVudCBzZXR0aW5ncyAqLworCQkJbGV2ZWwgPSAhKHBhc19yZWFkKDB4MEI4QSkgJiAweDIwKTsKKwkJZWxzZSB7CisJCQlpZiAobGV2ZWwpCisJCQkJcGFzX3dyaXRlKHBhc19yZWFkKDB4MEI4QSkgJiAofjB4MjApLCAweDBCOEEpOworCQkJZWxzZQorCQkJCXBhc193cml0ZShwYXNfcmVhZCgweDBCOEEpIHwgMHgyMCwgMHgwQjhBKTsKKworCQkJbGV2ZWwgPSAhKHBhc19yZWFkKDB4MEI4QSkgJiAweDIwKTsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIobGV2ZWwsIHApOworCX0KKwlpZiAoKChjbWQgPj4gOCkgJiAweGZmKSA9PSAnTScpIHsKKwkJaWYgKGdldF91c2VyKHYsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChfU0lPQ19ESVIoY21kKSAmIF9TSU9DX1dSSVRFKSB7CisJCQl2ID0gcGFzX21peGVyX3NldChjbWQgJiAweGZmLCB2KTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAoY21kICYgMHhmZikgeworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQkJdiA9IHJlY19kZXZpY2VzOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJCXYgPSBTVVBQT1JURURfTUlYRVJfREVWSUNFUyAmIH4oU09VTkRfTUFTS19CQVNTIHwgU09VTkRfTUFTS19UUkVCTEUpOworCQkJCWJyZWFrOworCQkJCQorCQkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJCXYgPSBTVVBQT1JURURfTUlYRVJfREVWSUNFUzsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJCQl2ID0gUE9TU0lCTEVfUkVDT1JESU5HX0RFVklDRVMgJiBTVVBQT1JURURfTUlYRVJfREVWSUNFUzsKKwkJCQlicmVhazsKKwkJCQkKKwkJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCQl2ID0gMDsJLyogTm8gc3BlY2lhbCBjYXBhYmlsaXRpZXMgKi8KKwkJCQlicmVhazsKKwkJCQkKKwkJCWRlZmF1bHQ6CisJCQkJdiA9IGxldmVsc1tjbWQgJiAweGZmXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodiwgcCk7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgcGFzX21peGVyX29wZXJhdGlvbnMgPQoreworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5pZAk9ICJQQVMxNiIsCisJLm5hbWUJPSAiUHJvIEF1ZGlvIFNwZWN0cnVtIDE2IiwKKwkuaW9jdGwJPSBwYXNfbWl4ZXJfaW9jdGwKK307CisKK2ludCBfX2luaXQKK3Bhc19pbml0X21peGVyKHZvaWQpCit7CisJaW50ICAgICAgICAgICAgIGQ7CisKKwlsZXZlbHMgPSBsb2FkX21peGVyX3ZvbHVtZXMoIlBBUzE2XzEiLCBkZWZhdWx0X2xldmVscywgMSk7CisKKwlwYXNfbWl4ZXJfcmVzZXQoKTsKKworCWlmICgoZCA9IHNvdW5kX2FsbG9jX21peGVyZGV2KCkpICE9IC0xKQorCSAgeworCQkgIGF1ZGlvX2RldnNbcGFzX2F1ZGlvZGV2XS0+bWl4ZXJfZGV2ID0gZDsKKwkJICBtaXhlcl9kZXZzW2RdID0gJnBhc19taXhlcl9vcGVyYXRpb25zOworCSAgfQorCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3BhczJfcGNtLmMgYi9zb3VuZC9vc3MvcGFzMl9wY20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY2YWFmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3BhczJfcGNtLmMKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBwYXMyX3BjbS5jIEF1ZGlvIHJvdXRpbmVzIGZvciBQQVMxNgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKgorICogVGhvbWFzIFNhaWxlciAgIDogaW9jdGwgY29kZSByZXdvcmtlZCAodm1hbGxvYy92ZnJlZSByZW1vdmVkKQorICogQWxhbiBDb3gJICAgOiBTd2F0dGVkIGEgZG91YmxlIGFsbG9jYXRpb24gb2YgZGV2aWNlIGJ1Zy4gTWFkZSBhIGZldworICoJCSAgICAgbW9yZSB0aGluZ3MgbW9kdWxlIG9wdGlvbnMuCisgKiBCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDogQWRkZWQgX19pbml0IHRvIHBhc19wY21faW5pdCgpCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAicGFzMi5oIgorCisjaWZuZGVmIERFQgorI2RlZmluZSBERUIoV0hBVCkKKyNlbmRpZgorCisjZGVmaW5lIFBBU19QQ01fSU5UUkJJVFMgKDB4MDgpCisvKgorICogU2FtcGxlIGJ1ZmZlciB0aW1lciBpbnRlcnJ1cHQgZW5hYmxlCisgKi8KKworI2RlZmluZSBQQ01fTk9OCTAKKyNkZWZpbmUgUENNX0RBQwkxCisjZGVmaW5lIFBDTV9BREMJMgorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwY21fc3BlZWQ7IAkvKiBzYW1wbGluZyByYXRlICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBwY21fY2hhbm5lbHMgPSAxOwkvKiBjaGFubmVscyAoMSBvciAyKSAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgcGNtX2JpdHMgPSA4OwkvKiBiaXRzL3NhbXBsZSAoOCBvciAxNikgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHBjbV9maWx0ZXI7CS8qIGZpbHRlciBGTEFHICovCitzdGF0aWMgdW5zaWduZWQgY2hhciBwY21fbW9kZSA9IFBDTV9OT047CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwY21fY291bnQ7CitzdGF0aWMgdW5zaWduZWQgc2hvcnQgcGNtX2JpdHNvayA9IDg7CS8qIG1hc2sgb2YgT0sgYml0cyAqLworc3RhdGljIGludCAgICAgIHBjbV9idXN5OworaW50ICAgICAgICAgICAgIHBhc19hdWRpb2RldiA9IC0xOworc3RhdGljIGludCAgICAgIG9wZW5fbW9kZTsKKworZXh0ZXJuIHNwaW5sb2NrX3QgcGFzX2xvY2s7CisKK3N0YXRpYyBpbnQgcGNtX3NldF9zcGVlZChpbnQgYXJnKQoreworCWludCBmb28sIHRtcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGFyZyA9PSAwKQorCQlyZXR1cm4gcGNtX3NwZWVkOworCisJaWYgKGFyZyA+IDQ0MTAwKQorCQlhcmcgPSA0NDEwMDsKKwlpZiAoYXJnIDwgNTAwMCkKKwkJYXJnID0gNTAwMDsKKworCWlmIChwY21fY2hhbm5lbHMgJiAyKQorCXsKKwkJZm9vID0gKChDTE9DS19USUNLX1JBVEUgLyAyKSArIChhcmcgLyAyKSkgLyBhcmc7CisJCWFyZyA9ICgoQ0xPQ0tfVElDS19SQVRFIC8gMikgKyAoZm9vIC8gMikpIC8gZm9vOworCX0KKwllbHNlCisJeworCQlmb28gPSAoQ0xPQ0tfVElDS19SQVRFICsgKGFyZyAvIDIpKSAvIGFyZzsKKwkJYXJnID0gKENMT0NLX1RJQ0tfUkFURSArIChmb28gLyAyKSkgLyBmb287CisJfQorCisJcGNtX3NwZWVkID0gYXJnOworCisJdG1wID0gcGFzX3JlYWQoMHgwQjhBKTsKKworCS8qCisJICogU2V0IGFudGktYWxpYXNpbmcgZmlsdGVycyBhY2NvcmRpbmcgdG8gc2FtcGxlIHJhdGUuIFlvdSByZWFsbHkgKk5FRUQqCisJICogdG8gZW5hYmxlIHRoaXMgZmVhdHVyZSBmb3IgYWxsIG5vcm1hbCByZWNvcmRpbmcgdW5sZXNzIHlvdSB3YW50IHRvCisJICogZXhwZXJpbWVudCB3aXRoIGFsaWFzaW5nIGVmZmVjdHMuCisJICogVGhlc2UgZmlsdGVycyBhcHBseSB0byB0aGUgc2VsZWN0ZWQgInJlY29yZGluZyIgc291cmNlLgorCSAqIEkgKHBmdykgZG9uJ3Qga25vdyB0aGUgZW5jb2Rpbmcgb2YgdGhlc2UgNSBiaXRzLiBUaGUgdmFsdWVzIHNob3duCisJICogY29tZSBmcm9tIHRoZSBTREsgZm91bmQgb24gZnRwLnV3cC5lZHU6L3B1Yi9tc2Rvcy9wcm9hdWRpby8uCisJICoKKwkgKiBJIGNsZWFyZWQgYml0IDUgb2YgdGhlc2UgdmFsdWVzLCBzaW5jZSB0aGF0IGJpdCBjb250cm9scyB0aGUgbWFzdGVyCisJICogbXV0ZSBmbGFnLiAoT2xhdiBX9mxmZWxzY2huZWlkZXIpCisJICoKKwkgKi8KKyNpZiAhZGVmaW5lZCBOT19BVVRPX0ZJTFRFUl9TRVQKKwl0bXAgJj0gMHhlMDsKKwlpZiAocGNtX3NwZWVkID49IDIgKiAxNzg5NykKKwkJdG1wIHw9IDB4MDE7CisJZWxzZSBpZiAocGNtX3NwZWVkID49IDIgKiAxNTkwOSkKKwkJdG1wIHw9IDB4MDI7CisJZWxzZSBpZiAocGNtX3NwZWVkID49IDIgKiAxMTkzMSkKKwkJdG1wIHw9IDB4MDk7CisJZWxzZSBpZiAocGNtX3NwZWVkID49IDIgKiA4OTQ4KQorCQl0bXAgfD0gMHgxMTsKKwllbHNlIGlmIChwY21fc3BlZWQgPj0gMiAqIDU5NjUpCisJCXRtcCB8PSAweDE5OworCWVsc2UgaWYgKHBjbV9zcGVlZCA+PSAyICogMjk4MikKKwkJdG1wIHw9IDB4MDQ7CisJcGNtX2ZpbHRlciA9IHRtcDsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBhc19sb2NrLCBmbGFncyk7CisKKwlwYXNfd3JpdGUodG1wICYgfigweDQwIHwgMHg4MCksIDB4MEI4QSk7CisJcGFzX3dyaXRlKDB4MDAgfCAweDMwIHwgMHgwNCwgMHgxMzhCKTsKKwlwYXNfd3JpdGUoZm9vICYgMHhmZiwgMHgxMzg4KTsKKwlwYXNfd3JpdGUoKGZvbyA+PiA4KSAmIDB4ZmYsIDB4MTM4OCk7CisJcGFzX3dyaXRlKHRtcCwgMHgwQjhBKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcGNtX3NwZWVkOworfQorCitzdGF0aWMgaW50IHBjbV9zZXRfY2hhbm5lbHMoaW50IGFyZykKK3sKKworCWlmICgoYXJnICE9IDEpICYmIChhcmcgIT0gMikpCisJCXJldHVybiBwY21fY2hhbm5lbHM7CisKKwlpZiAoYXJnICE9IHBjbV9jaGFubmVscykKKwl7CisJCXBhc193cml0ZShwYXNfcmVhZCgweEY4QSkgXiAweDIwLCAweEY4QSk7CisKKwkJcGNtX2NoYW5uZWxzID0gYXJnOworCQlwY21fc2V0X3NwZWVkKHBjbV9zcGVlZCk7CS8qIFRoZSBzcGVlZCBtdXN0IGJlIHJlaW5pdGlhbGl6ZWQgKi8KKwl9CisJcmV0dXJuIHBjbV9jaGFubmVsczsKK30KKworc3RhdGljIGludCBwY21fc2V0X2JpdHMoaW50IGFyZykKK3sKKwlpZiAoYXJnID09IDApCisJCXJldHVybiBwY21fYml0czsKKworCWlmICgoYXJnICYgcGNtX2JpdHNvaykgIT0gYXJnKQorCQlyZXR1cm4gcGNtX2JpdHM7CisKKwlpZiAoYXJnICE9IHBjbV9iaXRzKQorCXsKKwkJcGFzX3dyaXRlKHBhc19yZWFkKDB4ODM4OSkgXiAweDA0LCAweDgzODkpOworCisJCXBjbV9iaXRzID0gYXJnOworCX0KKwlyZXR1cm4gcGNtX2JpdHM7Cit9CisKK3N0YXRpYyBpbnQgcGFzX2F1ZGlvX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHZhbCwgcmV0OworCWludCBfX3VzZXIgKnAgPSBhcmc7CisKKwlERUIocHJpbnRrKCJwYXMyX3BjbS5jOiBzdGF0aWMgaW50IHBhc19hdWRpb19pb2N0bCh1bnNpZ25lZCBpbnQgY21kID0gJVgsIHVuc2lnbmVkIGludCBhcmcgPSAlWClcbiIsIGNtZCwgYXJnKSk7CisKKwlzd2l0Y2ggKGNtZCkgCisJeworCWNhc2UgU09VTkRfUENNX1dSSVRFX1JBVEU6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKSAKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXQgPSBwY21fc2V0X3NwZWVkKHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXQgPSBwY21fc3BlZWQ7CisJCWJyZWFrOworCQkKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0ID0gcGNtX3NldF9jaGFubmVscyh2YWwgKyAxKSAtIDE7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFM6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKSAKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXQgPSBwY21fc2V0X2NoYW5uZWxzKHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJcmV0ID0gcGNtX2NoYW5uZWxzOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldCA9IHBjbV9zZXRfYml0cyh2YWwpOworCQlicmVhazsKKwkJCisJY2FzZSBTT1VORF9QQ01fUkVBRF9CSVRTOgorCQlyZXQgPSBwY21fYml0czsKKwkJYnJlYWs7CisgIAorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gcHV0X3VzZXIocmV0LCBwKTsKK30KKworc3RhdGljIHZvaWQgcGFzX2F1ZGlvX3Jlc2V0KGludCBkZXYpCit7CisJREVCKHByaW50aygicGFzMl9wY20uYzogc3RhdGljIHZvaWQgcGFzX2F1ZGlvX3Jlc2V0KHZvaWQpXG4iKSk7CisKKwlwYXNfd3JpdGUocGFzX3JlYWQoMHhGOEEpICYgfjB4NDAsIDB4RjhBKTsJLyogRGlzYWJsZSBQQ00gKi8KK30KKworc3RhdGljIGludCBwYXNfYXVkaW9fb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlpbnQgICAgICAgICAgICAgZXJyOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCURFQihwcmludGsoInBhczJfcGNtLmM6IHN0YXRpYyBpbnQgcGFzX2F1ZGlvX29wZW4oaW50IG1vZGUgPSAlWClcbiIsIG1vZGUpKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYXNfbG9jaywgZmxhZ3MpOworCWlmIChwY21fYnVzeSkKKwl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhc19sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXBjbV9idXN5ID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXNfbG9jaywgZmxhZ3MpOworCisJaWYgKChlcnIgPSBwYXNfc2V0X2ludHIoUEFTX1BDTV9JTlRSQklUUykpIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCisJcGNtX2NvdW50ID0gMDsKKwlvcGVuX21vZGUgPSBtb2RlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBhc19hdWRpb19jbG9zZShpbnQgZGV2KQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCURFQihwcmludGsoInBhczJfcGNtLmM6IHN0YXRpYyB2b2lkIHBhc19hdWRpb19jbG9zZSh2b2lkKVxuIikpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBhc19sb2NrLCBmbGFncyk7CisKKwlwYXNfYXVkaW9fcmVzZXQoZGV2KTsKKwlwYXNfcmVtb3ZlX2ludHIoUEFTX1BDTV9JTlRSQklUUyk7CisJcGNtX21vZGUgPSBQQ01fTk9OOworCisJcGNtX2J1c3kgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhc19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHBhc19hdWRpb19vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwKKwkJICAgICAgIGludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3MsIGNudDsKKworCURFQihwcmludGsoInBhczJfcGNtLmM6IHN0YXRpYyB2b2lkIHBhc19hdWRpb19vdXRwdXRfYmxvY2soY2hhciAqYnVmID0gJVAsIGludCBjb3VudCA9ICVYKVxuIiwgYnVmLCBjb3VudCkpOworCisJY250ID0gY291bnQ7CisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA+IDMpCisJCWNudCA+Pj0gMTsKKworCWlmIChhdWRpb19kZXZzW2Rldl0tPmZsYWdzICYgRE1BX0FVVE9NT0RFICYmCisJICAgIGludHJmbGFnICYmCisJICAgIGNudCA9PSBwY21fY291bnQpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYXNfbG9jaywgZmxhZ3MpOworCisJcGFzX3dyaXRlKHBhc19yZWFkKDB4RjhBKSAmIH4weDQwLAorCQkgIDB4RjhBKTsKKworCS8qIERNQWJ1Zl9zdGFydF9kbWEgKGRldiwgYnVmLCBjb3VudCwgRE1BX01PREVfV1JJVEUpOyAqLworCisJaWYgKGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA+IDMpCisJCWNvdW50ID4+PSAxOworCisJaWYgKGNvdW50ICE9IHBjbV9jb3VudCkKKwl7CisJCXBhc193cml0ZShwYXNfcmVhZCgweDBCOEEpICYgfjB4ODAsIDB4MEI4QSk7CisJCXBhc193cml0ZSgweDQwIHwgMHgzMCB8IDB4MDQsIDB4MTM4Qik7CisJCXBhc193cml0ZShjb3VudCAmIDB4ZmYsIDB4MTM4OSk7CisJCXBhc193cml0ZSgoY291bnQgPj4gOCkgJiAweGZmLCAweDEzODkpOworCQlwYXNfd3JpdGUocGFzX3JlYWQoMHgwQjhBKSB8IDB4ODAsIDB4MEI4QSk7CisKKwkJcGNtX2NvdW50ID0gY291bnQ7CisJfQorCXBhc193cml0ZShwYXNfcmVhZCgweDBCOEEpIHwgMHg4MCB8IDB4NDAsIDB4MEI4QSk7CisjaWZkZWYgTk9fVFJJR0dFUgorCXBhc193cml0ZShwYXNfcmVhZCgweEY4QSkgfCAweDQwIHwgMHgxMCwgMHhGOEEpOworI2VuZGlmCisKKwlwY21fbW9kZSA9IFBDTV9EQUM7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXNfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBwYXNfYXVkaW9fc3RhcnRfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwKKwkJICAgICAgaW50IGludHJmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlpbnQgICAgICAgICAgICAgY250OworCisJREVCKHByaW50aygicGFzMl9wY20uYzogc3RhdGljIHZvaWQgcGFzX2F1ZGlvX3N0YXJ0X2lucHV0KGNoYXIgKmJ1ZiA9ICVQLCBpbnQgY291bnQgPSAlWClcbiIsIGJ1ZiwgY291bnQpKTsKKworCWNudCA9IGNvdW50OworCWlmIChhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPiAzKQorCQljbnQgPj49IDE7CisKKwlpZiAoYXVkaW9fZGV2c1twYXNfYXVkaW9kZXZdLT5mbGFncyAmIERNQV9BVVRPTU9ERSAmJgorCSAgICBpbnRyZmxhZyAmJgorCSAgICBjbnQgPT0gcGNtX2NvdW50KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcGFzX2xvY2ssIGZsYWdzKTsKKworCS8qIERNQWJ1Zl9zdGFydF9kbWEgKGRldiwgYnVmLCBjb3VudCwgRE1BX01PREVfUkVBRCk7ICovCisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID4gMykKKwkJY291bnQgPj49IDE7CisKKwlpZiAoY291bnQgIT0gcGNtX2NvdW50KQorCXsKKwkJcGFzX3dyaXRlKHBhc19yZWFkKDB4MEI4QSkgJiB+MHg4MCwgMHgwQjhBKTsKKwkJcGFzX3dyaXRlKDB4NDAgfCAweDMwIHwgMHgwNCwgMHgxMzhCKTsKKwkJcGFzX3dyaXRlKGNvdW50ICYgMHhmZiwgMHgxMzg5KTsKKwkJcGFzX3dyaXRlKChjb3VudCA+PiA4KSAmIDB4ZmYsIDB4MTM4OSk7CisJCXBhc193cml0ZShwYXNfcmVhZCgweDBCOEEpIHwgMHg4MCwgMHgwQjhBKTsKKworCQlwY21fY291bnQgPSBjb3VudDsKKwl9CisJcGFzX3dyaXRlKHBhc19yZWFkKDB4MEI4QSkgfCAweDgwIHwgMHg0MCwgMHgwQjhBKTsKKyNpZmRlZiBOT19UUklHR0VSCisJcGFzX3dyaXRlKChwYXNfcmVhZCgweEY4QSkgfCAweDQwKSAmIH4weDEwLCAweEY4QSk7CisjZW5kaWYKKworCXBjbV9tb2RlID0gUENNX0FEQzsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBhc19sb2NrLCBmbGFncyk7Cit9CisKKyNpZm5kZWYgTk9fVFJJR0dFUgorc3RhdGljIHZvaWQgcGFzX2F1ZGlvX3RyaWdnZXIoaW50IGRldiwgaW50IHN0YXRlKQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZwYXNfbG9jaywgZmxhZ3MpOworCXN0YXRlICY9IG9wZW5fbW9kZTsKKworCWlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfT1VUUFVUKQorCQlwYXNfd3JpdGUocGFzX3JlYWQoMHhGOEEpIHwgMHg0MCB8IDB4MTAsIDB4RjhBKTsKKwllbHNlIGlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfSU5QVVQpCisJCXBhc193cml0ZSgocGFzX3JlYWQoMHhGOEEpIHwgMHg0MCkgJiB+MHgxMCwgMHhGOEEpOworCWVsc2UKKwkJcGFzX3dyaXRlKHBhc19yZWFkKDB4RjhBKSAmIH4weDQwLCAweEY4QSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwYXNfbG9jaywgZmxhZ3MpOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgcGFzX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwlwYXNfYXVkaW9fcmVzZXQoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXNfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwlwYXNfYXVkaW9fcmVzZXQoZGV2KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgcGFzX2F1ZGlvX2RyaXZlciA9Cit7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gcGFzX2F1ZGlvX29wZW4sCisJLmNsb3NlCQkJPSBwYXNfYXVkaW9fY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBwYXNfYXVkaW9fb3V0cHV0X2Jsb2NrLAorCS5zdGFydF9pbnB1dAkJPSBwYXNfYXVkaW9fc3RhcnRfaW5wdXQsCisJLmlvY3RsCQkJPSBwYXNfYXVkaW9faW9jdGwsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gcGFzX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBwYXNfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0LAorCS5oYWx0X2lvCQk9IHBhc19hdWRpb19yZXNldCwKKwkudHJpZ2dlcgkJPSBwYXNfYXVkaW9fdHJpZ2dlcgorfTsKKwordm9pZCBfX2luaXQgcGFzX3BjbV9pbml0KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlERUIocHJpbnRrKCJwYXMyX3BjbS5jOiBsb25nIHBhc19wY21faW5pdCgpXG4iKSk7CisKKwlwY21fYml0c29rID0gODsKKwlpZiAocGFzX3JlYWQoMHhFRjhCKSAmIDB4MDgpCisJCXBjbV9iaXRzb2sgfD0gMTY7CisKKwlwY21fc2V0X3NwZWVkKERTUF9ERUZBVUxUX1NQRUVEKTsKKworCWlmICgocGFzX2F1ZGlvZGV2ID0gc291bmRfaW5zdGFsbF9hdWRpb2RydihBVURJT19EUklWRVJfVkVSU0lPTiwKKwkJCQkJIlBybyBBdWRpbyBTcGVjdHJ1bSIsCisJCQkJCSZwYXNfYXVkaW9fZHJpdmVyLAorCQkJCQlzaXplb2Yoc3RydWN0IGF1ZGlvX2RyaXZlciksCisJCQkJCURNQV9BVVRPTU9ERSwKKwkJCQkJQUZNVF9VOCB8IEFGTVRfUzE2X0xFLAorCQkJCQlOVUxMLAorCQkJCQlod19jb25maWctPmRtYSwKKwkJCQkJaHdfY29uZmlnLT5kbWEpKSA8IDApCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlBBUzE2OiBUb28gbWFueSBQQ00gZGV2aWNlcyBhdmFpbGFibGVcbiIpOworfQorCit2b2lkIHBhc19wY21faW50ZXJydXB0KHVuc2lnbmVkIGNoYXIgc3RhdHVzLCBpbnQgY2F1c2UpCit7CisJaWYgKGNhdXNlID09IDEpCisJeworCQkvKgorCQkgKiBIYWx0IHRoZSBQQ00gZmlyc3QuIE90aGVyd2lzZSB3ZSBkb24ndCBoYXZlIHRpbWUgdG8gc3RhcnQgYSBuZXcKKwkJICogYmxvY2sgYmVmb3JlIHRoZSBQQ00gY2hpcCBwcm9jZWVkcyB0byB0aGUgbmV4dCBzYW1wbGUKKwkJICovCisKKwkJaWYgKCEoYXVkaW9fZGV2c1twYXNfYXVkaW9kZXZdLT5mbGFncyAmIERNQV9BVVRPTU9ERSkpCisJCQlwYXNfd3JpdGUocGFzX3JlYWQoMHhGOEEpICYgfjB4NDAsIDB4RjhBKTsKKworCQlzd2l0Y2ggKHBjbV9tb2RlKQorCQl7CisJCQljYXNlIFBDTV9EQUM6CisJCQkJRE1BYnVmX291dHB1dGludHIocGFzX2F1ZGlvZGV2LCAxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBQQ01fQURDOgorCQkJCURNQWJ1Zl9pbnB1dGludHIocGFzX2F1ZGlvZGV2KTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJQQVM6IFVuZXhwZWN0ZWQgUENNIGludGVycnVwdFxuIik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvcHNzLmMgYi9zb3VuZC9vc3MvcHNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkMzg3NgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9wc3MuYwpAQCAtMCwwICsxLDEyODMgQEAKKy8qCisgKiBzb3VuZC9wc3MuYworICoKKyAqIFRoZSBsb3cgbGV2ZWwgZHJpdmVyIGZvciB0aGUgUGVyc29uYWwgU291bmQgU3lzdGVtIChFQ0hPIEVTQzYxNCkuCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBUaG9tYXMgU2FpbGVyCWlvY3RsIGNvZGUgcmV3b3JrZWQgKHZtYWxsb2MvdmZyZWUgcmVtb3ZlZCkKKyAqIEFsYW4gQ294CQltb2R1bGFyaXNhdGlvbiwgY2xlYW4gdXAuCisgKgorICogOTgtMDItMjE6IFZsYWRpbWlyIE1pY2hsIDx2bGFkaW1pci5taWNobEB1cG9sLmN6PgorICogICAgICAgICAgQWRkZWQgbWl4ZXIgZGV2aWNlIGZvciBCZWV0aG92ZW4gQURTUC0xNiAobWFzdGVyIHZvbHVtZSwKKyAqCSAgICBiYXNzLCB0cmVibGUsIHN5bnRoKSwgb25seSBmb3Igc3BlYWtlcnMuCisgKiAgICAgICAgICBGaXhlZCBidWcgaW4gcHNzX3dyaXRlIChleGNoYW5nZSBwYXJhbWV0ZXJzKQorICogICAgICAgICAgRml4ZWQgY29uZmlnIHBvcnQgb2YgU0IKKyAqICAgICAgICAgIFJlcXVlc3RlZCB0d28gcmVnaW9ucyBmb3IgUFNTIChQU1MgbWl4ZXIsIFBTUyBjb25maWcpCisgKiAgICAgICAgICBNb2RpZmllZCBwc3NfZG93bmxvYWRfYm9vdAorICogICAgICAgICAgVG8gcHJvYmVfcHNzX21zcyBhZGRlZCB0ZXN0IGZvciBpbml0aWFsaXplIEFEMTg0OAorICogOTgtMDUtMjg6IFZsYWRpbWlyIE1pY2hsIDx2bGFkaW1pci5taWNobEB1cG9sLmN6PgorICogICAgICAgICAgRml4ZWQgY29tcHV0YXRpb24gb2YgbWl4ZXIgdm9sdW1lcworICogMDQtMDUtMTk5OTogQW50aG9ueSBCYXJiYWNoYW4gPGJhcmJjb2RlQHhtZW4uY2lzLmZvcmRoYW0uZWR1PgorICogICAgICAgICAgQWRkZWQgY29kZSB0aGF0IGFsbG93cyB0aGUgdXNlciB0byBlbmFibGUgaGlzIGNkcm9tIGFuZC9vciAKKyAqICAgICAgICAgIGpveXN0aWNrIHRocm91Z2ggdGhlIG1vZHVsZSBwYXJhbWV0ZXJzIHBzc19jZHJvbV9wb3J0IGFuZCAKKyAqICAgICAgICAgIHBzc19lbmFibGVfam95c3RpY2suICBwc3NfY2Ryb21fcG9ydCB0YWtlcyBhIHBvcnQgYWRkcmVzcyBhcyBpdHMKKyAqICAgICAgICAgIGFyZ3VtZW50LiAgcHNzX2VuYWJsZV9qb3lzdGljayB0YWtlcyBlaXRoZXIgYSAwIG9yIGEgbm9uLTAgYXMgaXRzCisgKiAgICAgICAgICBhcmd1bWVudC4KKyAqIDA0LTA2LTE5OTk6IEFudGhvbnkgQmFyYmFjaGFuIDxiYXJiY29kZUB4bWVuLmNpcy5mb3JkaGFtLmVkdT4KKyAqICAgICAgICAgIFNlcGFyYXRlZCBzb21lIGNvZGUgaW50byBuZXcgZnVuY3Rpb25zIGZvciBlYXNpZXIgcmV1c2UuICAKKyAqICAgICAgICAgIENsZWFuZWQgdXAgYW5kIHN0cmVhbWxpbmVkIG5ldyBjb2RlLiAgQWRkZWQgY29kZSB0byBhbGxvdyBhIHVzZXIgCisgKiAgICAgICAgICB0byBvbmx5IHVzZSB0aGlzIGRyaXZlciBmb3IgZW5hYmxpbmcgbm9uLXNvdW5kIGNvbXBvbmVudHMgCisgKiAgICAgICAgICB0aHJvdWdoIHRoZSBuZXcgbW9kdWxlIHBhcmFtZXRlciBwc3Nfbm9fc291bmQgKGZsYWcpLiAgQWRkZWQgCisgKiAgICAgICAgICBjb2RlIHRoYXQgd291bGQgYWxsb3cgYSB1c2VyIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBkcml2ZXIgc2hvdWxkIAorICogICAgICAgICAgcmVzZXQgdGhlIGNvbmZpZ3VyZWQgaGFyZHdhcmUgc2V0dGluZ3MgZm9yIHRoZSBQU1MgYm9hcmQgdGhyb3VnaCAKKyAqICAgICAgICAgIHRoZSBtb2R1bGUgcGFyYW1ldGVyIHBzc19rZWVwX3NldHRpbmdzIChmbGFnKS4gICBUaGlzIGZsYWcgd2lsbCAKKyAqICAgICAgICAgIGFsbG93IGEgdXNlciB0byBmcmVlIHVwIHJlc291cmNlcyBpbiB1c2UgYnkgdGhpcyBjYXJkIGlmIG5lZWRiZSwgCisgKiAgICAgICAgICBmdXJ0aGVybW9yZSBpdCBhbGxvd3MgaGltIHRvIHVzZSB0aGlzIGRyaXZlciB0byBqdXN0IGVuYWJsZSB0aGUgCisgKiAgICAgICAgICBlbXVsYXRpb25zIGFuZCB0aGVuIGJlIHVubG9hZGVkIGFzIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuICBCb3RoIAorICogICAgICAgICAgbmV3IHNldHRpbmdzIGFyZSBvbmx5IGF2YWlsYWJsZSB0byB0aGlzIGRyaXZlciBpZiBjb21waWxlZCBhcyBhIAorICogICAgICAgICAgbW9kdWxlLiAgVGhlIGRlZmF1bHQgc2V0dGluZ3Mgb2YgYWxsIG5ldyBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gCisgKiAgICAgICAgICBsb2FkIHRoZSBkcml2ZXIgYXMgaXQgZGlkIGluIHByZXZpb3VzIHZlcnNpb25zLgorICogMDQtMDctMTk5OTogQW50aG9ueSBCYXJiYWNoYW4gPGJhcmJjb2RlQHhtZW4uY2lzLmZvcmRoYW0uZWR1PgorICogICAgICAgICAgQWRkZWQgbW9kdWxlIHBhcmFtZXRlciBwc3NfZmlybXdhcmUgdG8gYWxsb3cgdGhlIHVzZXIgdG8gdGVsbCAKKyAqICAgICAgICAgIHRoZSBkcml2ZXIgd2hlcmUgdGhlIGZpcmV3YXJlIGZpbGUgaXMgbG9jYXRlZC4gIFRoZSBkZWZhdWx0IAorICogICAgICAgICAgc2V0dGluZyBpcyB0aGUgcHJldmlvdXMgaGFyZGNvZGVkIHNldHRpbmcgIi9ldGMvc291bmQvcHNzX3N5bnRoIi4KKyAqIDAwLTAzLTAzOiBDaHJpc3RvcGggSGVsbHdpZyA8Y2hoZWxsd2lnQGluZnJhZGVhZC5vcmc+CisgKgkgICAgQWRhcHRlZCB0byBtb2R1bGVfaW5pdC9tb2R1bGVfZXhpdAorICogMTEtMTAtMjAwMDogQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Ymt6QGxpbnV4LWlkZS5vcmc+CisgKgkgICAgQWRkZWQgX19pbml0IHRvIHByb2JlX3BzcygpLCBhdHRhY2hfcHNzKCkgYW5kIHByb2JlX3Bzc19tcHUoKQorICogMDItSmFuLTIwMDE6IENocmlzIFJhbmtpbgorICogICAgICAgICAgU3BlY2lmeSB0aGF0IHRoaXMgbW9kdWxlIG93bnMgdGhlIGNvcHJvY2Vzc29yCisgKi8KKworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJzb3VuZF9maXJtd2FyZS5oIgorCisjaW5jbHVkZSAiYWQxODQ4LmgiCisjaW5jbHVkZSAibXB1NDAxLmgiCisKKy8qCisgKiBQU1MgcmVnaXN0ZXJzLgorICovCisjZGVmaW5lIFJFRyh4KQkoZGV2Yy0+YmFzZSt4KQorI2RlZmluZQlQU1NfREFUQQkwCisjZGVmaW5lCVBTU19TVEFUVVMJMgorI2RlZmluZSBQU1NfQ09OVFJPTAkyCisjZGVmaW5lCVBTU19JRAkJNAorI2RlZmluZQlQU1NfSVJRQUNLCTQKKyNkZWZpbmUJUFNTX1BJTwkJMHgxYQorCisvKgorICogQ29uZmlnIHJlZ2lzdGVycworICovCisjZGVmaW5lIENPTkZfUFNTCTB4MTAKKyNkZWZpbmUgQ09ORl9XU1MJMHgxMgorI2RlZmluZSBDT05GX1NCCQkweDE0CisjZGVmaW5lIENPTkZfQ0RST00JMHgxNgorI2RlZmluZSBDT05GX01JREkJMHgxOAorCisvKgorICogU3RhdHVzIGJpdHMuCisgKi8KKyNkZWZpbmUgUFNTX0ZMQUczICAgICAweDA4MDAKKyNkZWZpbmUgUFNTX0ZMQUcyICAgICAweDA0MDAKKyNkZWZpbmUgUFNTX0ZMQUcxICAgICAweDEwMDAKKyNkZWZpbmUgUFNTX0ZMQUcwICAgICAweDA4MDAKKyNkZWZpbmUgUFNTX1dSSVRFX0VNUFRZICAweDgwMDAKKyNkZWZpbmUgUFNTX1JFQURfRlVMTCAgICAweDQwMDAKKworLyoKKyAqIFdTUyByZWdpc3RlcnMKKyAqLworI2RlZmluZSBXU1NfSU5ERVggNAorI2RlZmluZSBXU1NfREFUQSA1CisKKy8qCisgKiBXU1Mgc3RhdHVzIGJpdHMKKyAqLworI2RlZmluZSBXU1NfSU5JVElBTElaSU5HIDB4ODAKKyNkZWZpbmUgV1NTX0FVVE9DQUxJQlJBVElPTiAweDIwCisKKyNkZWZpbmUgTk9fV1NTX01JWEVSCS0xCisKKyNpbmNsdWRlICJjb3Byb2MuaCIKKworI2luY2x1ZGUgInBzc19ib290LmgiCisKKy8qIElmIGNvbXBpbGVkIGludG8ga2VybmVsLCBpdCBlbmFibGUgb3IgZGlzYWJsZSBwc3MgbWl4ZXIgKi8KKyNpZmRlZiBDT05GSUdfUFNTX01JWEVSCitzdGF0aWMgaW50IHBzc19taXhlciA9IDE7CisjZWxzZQorc3RhdGljIGludCBwc3NfbWl4ZXI7CisjZW5kaWYKKworCit0eXBlZGVmIHN0cnVjdCBwc3NfbWl4ZXJkYXRhIHsKKwl1bnNpZ25lZCBpbnQgdm9sdW1lX2w7CisJdW5zaWduZWQgaW50IHZvbHVtZV9yOworCXVuc2lnbmVkIGludCBiYXNzOworCXVuc2lnbmVkIGludCB0cmVibGU7CisJdW5zaWduZWQgaW50IHN5bnRoOworfSBwc3NfbWl4ZXJkYXRhOworCit0eXBlZGVmIHN0cnVjdCBwc3NfY29uZmRhdGEgeworCWludCAgICAgICAgICAgICBiYXNlOworCWludCAgICAgICAgICAgICBpcnE7CisJaW50ICAgICAgICAgICAgIGRtYTsKKwlpbnQgICAgICAgICAgICAqb3NwOworCXBzc19taXhlcmRhdGEgICBtaXhlcjsKKwlpbnQgICAgICAgICAgICAgYWRfbWl4ZXJfZGV2OworfSBwc3NfY29uZmRhdGE7CisgIAorc3RhdGljIHBzc19jb25mZGF0YSBwc3NfZGF0YTsKK3N0YXRpYyBwc3NfY29uZmRhdGEgKmRldmMgPSAmcHNzX2RhdGE7CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOworCitzdGF0aWMgaW50ICAgICAgcHNzX2luaXRpYWxpemVkOworc3RhdGljIGludCAgICAgIG5vbnN0YW5kYXJkX21pY3JvY29kZTsKK3N0YXRpYyBpbnQJcHNzX2Nkcm9tX3BvcnQgPSAtMTsJLyogUGFyYW1ldGVyIGZvciB0aGUgUFNTIGNkcm9tIHBvcnQgKi8KK3N0YXRpYyBpbnQJcHNzX2VuYWJsZV9qb3lzdGljazsgICAgLyogUGFyYW1ldGVyIGZvciBlbmFibGluZyB0aGUgam95c3RpY2sgKi8KK3N0YXRpYyBjb3Byb2Nfb3BlcmF0aW9ucyBwc3NfY29wcm9jX29wZXJhdGlvbnM7CisKK3N0YXRpYyB2b2lkIHBzc193cml0ZShwc3NfY29uZmRhdGEgKmRldmMsIGludCBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgaSwgbGltaXQ7CisKKwlsaW1pdCA9IGppZmZpZXMgKyBIWi8xMDsJLyogVGhlIHRpbWVvdXQgaXMgMC4xIHNlY29uZHMgKi8KKwkvKgorCSAqIE5vdGUhIHRoZSBpPDUwMDAwMDAgaXMgYW4gZW1lcmdlbmN5IGV4aXQuIFRoZSBkc3BfY29tbWFuZCgpIGlzIHNvbWV0aW1lcworCSAqIGNhbGxlZCB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSB0aW1lciBpcworCSAqIGRpc2FibGVkIGFsc28uIEhvd2V2ZXIgdGhlIHRpbWVvdXQgc2l0dWF0aW9uIGlzIGEgYWJub3JtYWwgY29uZGl0aW9uLgorCSAqIE5vcm1hbGx5IHRoZSBEU1Agc2hvdWxkIGJlIHJlYWR5IHRvIGFjY2VwdCBjb21tYW5kcyBhZnRlciBqdXN0IGNvdXBsZSBvZgorCSAqIGxvb3BzLgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IDUwMDAwMDAgJiYgdGltZV9iZWZvcmUoamlmZmllcywgbGltaXQpOyBpKyspCisgCXsKKyAJCWlmIChpbncoUkVHKFBTU19TVEFUVVMpKSAmIFBTU19XUklURV9FTVBUWSkKKyAJCXsKKyAJCQlvdXR3KGRhdGEsIFJFRyhQU1NfREFUQSkpOworIAkJCXJldHVybjsKKyAJCX0KKyAJfQorIAlwcmludGsoS0VSTl9XQVJOSU5HICJQU1M6IERTUCBDb21tYW5kICglMDR4KSBUaW1lb3V0LlxuIiwgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX3BzcyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5zaWduZWQgc2hvcnQgaWQ7CisJaW50IGlycSwgZG1hOworCisJZGV2Yy0+YmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKwlpcnEgPSBkZXZjLT5pcnEgPSBod19jb25maWctPmlycTsKKwlkbWEgPSBkZXZjLT5kbWEgPSBod19jb25maWctPmRtYTsKKwlkZXZjLT5vc3AgPSBod19jb25maWctPm9zcDsKKworCWlmIChkZXZjLT5iYXNlICE9IDB4MjIwICYmIGRldmMtPmJhc2UgIT0gMHgyNDApCisJCWlmIChkZXZjLT5iYXNlICE9IDB4MjMwICYmIGRldmMtPmJhc2UgIT0gMHgyNTApCQkvKiBTb21lIGNhcmRzIHVzZSB0aGVzZSAqLworCQkJcmV0dXJuIDA7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldmMtPmJhc2UsIDB4MTAsICJQU1MgbWl4ZXIsIFNCIGVtdWxhdGlvbiIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBJL08gcG9ydCBjb25mbGljdFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZCA9IGludyhSRUcoUFNTX0lEKSk7CisJaWYgKChpZCA+PiA4KSAhPSAnRScpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyBQU1Mgc2lnbmF0dXJlIGRldGVjdGVkIGF0IDB4JXggKDB4JXgpXG4iLCAgZGV2Yy0+YmFzZSwgIGlkKTsgCisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDB4MTApOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihkZXZjLT5iYXNlICsgMHgxMCwgMHg5LCAiUFNTIGNvbmZpZyIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBJL08gcG9ydCBjb25mbGljdFxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDB4MTApOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2lycShwc3NfY29uZmRhdGEgKiBkZXZjLCBpbnQgZGV2LCBpbnQgaXJxKQoreworCXN0YXRpYyB1bnNpZ25lZCBzaG9ydCBpcnFfYml0c1sxNl0gPQorCXsKKwkJMHgwMDAwLCAweDAwMDAsIDB4MDAwMCwgMHgwMDA4LAorCQkweDAwMDAsIDB4MDAxMCwgMHgwMDAwLCAweDAwMTgsCisJCTB4MDAwMCwgMHgwMDIwLCAweDAwMjgsIDB4MDAzMCwKKwkJMHgwMDM4LCAweDAwMDAsIDB4MDAwMCwgMHgwMDAwCisJfTsKKworCXVuc2lnbmVkIHNob3J0ICB0bXAsIGJpdHM7CisKKwlpZiAoaXJxIDwgMCB8fCBpcnEgPiAxNSkKKwkJcmV0dXJuIDA7CisKKwl0bXAgPSBpbncoUkVHKGRldikpICYgfjB4Mzg7CS8qIExvYWQgY29uZnJlZywgbWFzayBJUlEgYml0cyBvdXQgKi8KKworCWlmICgoYml0cyA9IGlycV9iaXRzW2lycV0pID09IDAgJiYgaXJxICE9IDApCisJeworCQlwcmludGsoS0VSTl9FUlIgIlBTUzogSW52YWxpZCBJUlEgJWRcbiIsIGlycSk7CisJCXJldHVybiAwOworCX0KKwlvdXR3KHRtcCB8IGJpdHMsIFJFRyhkZXYpKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZXRfaW9fYmFzZShwc3NfY29uZmRhdGEgKiBkZXZjLCBpbnQgZGV2LCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBzaG9ydCAgdG1wID0gaW53KFJFRyhkZXYpKSAmIDB4MDAzZjsKKwl1bnNpZ25lZCBzaG9ydCAgYml0cyA9IChiYXNlICYgMHgwZmZjKSA8PCA0OworCisJb3V0dyhiaXRzIHwgdG1wLCBSRUcoZGV2KSk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzZXRfZG1hKHBzc19jb25mZGF0YSAqIGRldmMsIGludCBkZXYsIGludCBkbWEpCit7CisJc3RhdGljIHVuc2lnbmVkIHNob3J0IGRtYV9iaXRzWzhdID0KKwl7CisJCTB4MDAwMSwgMHgwMDAyLCAweDAwMDAsIDB4MDAwMywKKwkJMHgwMDAwLCAweDAwMDUsIDB4MDAwNiwgMHgwMDA3CisJfTsKKworCXVuc2lnbmVkIHNob3J0ICB0bXAsIGJpdHM7CisKKwlpZiAoZG1hIDwgMCB8fCBkbWEgPiA3KQorCQlyZXR1cm4gMDsKKworCXRtcCA9IGludyhSRUcoZGV2KSkgJiB+MHgwNzsJLyogTG9hZCBjb25mcmVnLCBtYXNrIERNQSBiaXRzIG91dCAqLworCisJaWYgKChiaXRzID0gZG1hX2JpdHNbZG1hXSkgPT0gMCAmJiBkbWEgIT0gNCkKKwl7CisJCSAgcHJpbnRrKEtFUk5fRVJSICJQU1M6IEludmFsaWQgRE1BICVkXG4iLCBkbWEpOworCQkgIHJldHVybiAwOworCX0KKwlvdXR3KHRtcCB8IGJpdHMsIFJFRyhkZXYpKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBwc3NfcmVzZXRfZHNwKHBzc19jb25mZGF0YSAqIGRldmMpCit7CisJdW5zaWduZWQgbG9uZyAgIGksIGxpbWl0ID0gamlmZmllcyArIEhaLzEwOworCisJb3V0dygweDIwMDAsIFJFRyhQU1NfQ09OVFJPTCkpOworCWZvciAoaSA9IDA7IGkgPCAzMjc2OCAmJiAobGltaXQtamlmZmllcyA+PSAwKTsgaSsrKQorCQlpbncoUkVHKFBTU19DT05UUk9MKSk7CisJb3V0dygweDAwMDAsIFJFRyhQU1NfQ09OVFJPTCkpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHBzc19wdXRfZHNwd29yZChwc3NfY29uZmRhdGEgKiBkZXZjLCB1bnNpZ25lZCBzaG9ydCB3b3JkKQoreworCWludCBpLCB2YWw7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI3NjgwOyBpKyspCisJeworCQl2YWwgPSBpbncoUkVHKFBTU19TVEFUVVMpKTsKKwkJaWYgKHZhbCAmIFBTU19XUklURV9FTVBUWSkKKwkJeworCQkJb3V0dyh3b3JkLCBSRUcoUFNTX0RBVEEpKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzc19nZXRfZHNwd29yZChwc3NfY29uZmRhdGEgKiBkZXZjLCB1bnNpZ25lZCBzaG9ydCAqd29yZCkKK3sKKwlpbnQgaSwgdmFsOworCisJZm9yIChpID0gMDsgaSA8IDMyNzY4MDsgaSsrKQorCXsKKwkJdmFsID0gaW53KFJFRyhQU1NfU1RBVFVTKSk7CisJCWlmICh2YWwgJiBQU1NfUkVBRF9GVUxMKQorCQl7CisJCQkqd29yZCA9IGludyhSRUcoUFNTX0RBVEEpKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzc19kb3dubG9hZF9ib290KHBzc19jb25mZGF0YSAqIGRldmMsIHVuc2lnbmVkIGNoYXIgKmJsb2NrLCBpbnQgc2l6ZSwgaW50IGZsYWdzKQoreworCWludCBpLCB2YWwsIGNvdW50OworCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisKKwlpZiAoZmxhZ3MgJiBDUEZfRklSU1QpCisJeworLypfX19fXyBXYXJuIERTUCBzb2Z0d2FyZSB0aGF0IGEgYm9vdCBpcyBjb21pbmcgKi8KKwkJb3V0dygweDAwZmUsIFJFRyhQU1NfREFUQSkpOworCisJCWxpbWl0ID0gamlmZmllcyArIEhaLzEwOworCQlmb3IgKGkgPSAwOyBpIDwgMzI3NjggJiYgdGltZV9iZWZvcmUoamlmZmllcywgbGltaXQpOyBpKyspCisJCQlpZiAoaW53KFJFRyhQU1NfREFUQSkpID09IDB4NTUwMCkKKwkJCQlicmVhazsKKworCQlvdXR3KCpibG9jaysrLCBSRUcoUFNTX0RBVEEpKTsKKwkJcHNzX3Jlc2V0X2RzcChkZXZjKTsKKwl9CisJY291bnQgPSAxOworCXdoaWxlICgoZmxhZ3MmQ1BGX0xBU1QpIHx8IGNvdW50PHNpemUgKQorCXsKKwkJaW50IGo7CisKKwkJZm9yIChqID0gMDsgaiA8IDMyNzY3MDsgaisrKQorCQl7CisvKl9fX19fIFdhaXQgZm9yIEJHIHRvIGFwcGVhciAqLworCQkJaWYgKGludyhSRUcoUFNTX1NUQVRVUykpICYgUFNTX0ZMQUczKQorCQkJCWJyZWFrOworCQl9CisKKwkJaWYgKGogPT0gMzI3NjcwKQorCQl7CisJCQkvKiBJdCdzIG9rIHdlIHRpbWVkIG91dCB3aGVuIHRoZSBmaWxlIHdhcyBlbXB0eSAqLworCQkJaWYgKGNvdW50ID49IHNpemUgJiYgZmxhZ3MgJiBDUEZfTEFTVCkKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCXsKKwkJCQlwcmludGsoIlxuIik7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IERvd25sb2FkIHRpbWVvdXQgcHJvYmxlbXMsIGJ5dGUgJWQ9JWRcbiIsIGNvdW50LCBzaXplKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorLypfX19fXyBTZW5kIHRoZSBuZXh0IGJ5dGUgKi8KKwkJaWYgKGNvdW50ID49IHNpemUpIAorCQl7CisJCQkvKiBJZiBub3QgZGF0YSBpbiBibG9jayBzZW5kIDB4ZmZmZiAqLworCQkJb3V0dyAoMHhmZmZmLCBSRUcgKFBTU19EQVRBKSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQkvKl9fX19fIFNlbmQgdGhlIG5leHQgYnl0ZSAqLworCQkJb3V0dyAoKmJsb2NrKyssIFJFRyAoUFNTX0RBVEEpKTsKKwkJfTsKKwkJY291bnQrKzsKKwl9CisKKwlpZiAoZmxhZ3MgJiBDUEZfTEFTVCkKKwl7CisvKl9fX19fIFdoeSAqLworCQlvdXR3KDAsIFJFRyhQU1NfREFUQSkpOworCisJCWxpbWl0ID0gamlmZmllcyArIEhaLzEwOworCQlmb3IgKGkgPSAwOyBpIDwgMzI3NjggJiYgKGxpbWl0IC0gamlmZmllcyA+PSAwKTsgaSsrKQorCQkJdmFsID0gaW53KFJFRyhQU1NfU1RBVFVTKSk7CisKKwkJbGltaXQgPSBqaWZmaWVzICsgSFovMTA7CisJCWZvciAoaSA9IDA7IGkgPCAzMjc2OCAmJiAobGltaXQtamlmZmllcyA+PSAwKTsgaSsrKQorCQl7CisJCQl2YWwgPSBpbncoUkVHKFBTU19TVEFUVVMpKTsKKwkJCWlmICh2YWwgJiAweDQwMDApCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBub3cgcmVhZCB0aGUgdmVyc2lvbiAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzIwMDA7IGkrKykKKwkJeworCQkJdmFsID0gaW53KFJFRyhQU1NfU1RBVFVTKSk7CisJCQlpZiAodmFsICYgUFNTX1JFQURfRlVMTCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoaSA9PSAzMjAwMCkKKwkJCXJldHVybiAwOworCisJCXZhbCA9IGludyhSRUcoUFNTX0RBVEEpKTsKKwkJLyogcHJpbnRrKCAiPFBTUzogbWljcm9jb2RlIHZlcnNpb24gJWQuJWQgbG9hZGVkPiIsICB2YWwvMTYsICB2YWwgJSAxNik7ICovCisJfQorCXJldHVybiAxOworfQorCisvKiBNaXhlciAqLworc3RhdGljIHZvaWQgc2V0X21hc3Rlcl92b2x1bWUocHNzX2NvbmZkYXRhICpkZXZjLCBpbnQgbGVmdCwgaW50IHJpZ2h0KQoreworCXN0YXRpYyB1bnNpZ25lZCBjaGFyIGxvZ19zY2FsZVsxMDFdID0gIHsKKwkJMHhkYiwgMHhlMCwgMHhlMywgMHhlNSwgMHhlNywgMHhlOSwgMHhlYSwgMHhlYiwgMHhlYywgMHhlZCwgMHhlZCwgMHhlZSwKKwkJMHhlZiwgMHhlZiwgMHhmMCwgMHhmMCwgMHhmMSwgMHhmMSwgMHhmMiwgMHhmMiwgMHhmMiwgMHhmMywgMHhmMywgMHhmMywKKwkJMHhmNCwgMHhmNCwgMHhmNCwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNSwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNiwgMHhmNywKKwkJMHhmNywgMHhmNywgMHhmNywgMHhmNywgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOCwgMHhmOSwgMHhmOSwgMHhmOSwKKwkJMHhmOSwgMHhmOSwgMHhmOSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYSwgMHhmYiwgMHhmYiwKKwkJMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYiwgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmYywKKwkJMHhmYywgMHhmYywgMHhmYywgMHhmYywgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwgMHhmZCwKKwkJMHhmZCwgMHhmZCwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwgMHhmZSwKKwkJMHhmZSwgMHhmZSwgMHhmZiwgMHhmZiwgMHhmZgorCX07CisJcHNzX3dyaXRlKGRldmMsIDB4MDAxMCk7CisJcHNzX3dyaXRlKGRldmMsIGxvZ19zY2FsZVtsZWZ0XSB8IDB4MDAwMCk7CisJcHNzX3dyaXRlKGRldmMsIDB4MDAxMCk7CisJcHNzX3dyaXRlKGRldmMsIGxvZ19zY2FsZVtyaWdodF0gfCAweDAxMDApOworfQorCitzdGF0aWMgdm9pZCBzZXRfc3ludGhfdm9sdW1lKHBzc19jb25mZGF0YSAqZGV2YywgaW50IHZvbHVtZSkKK3sKKwlpbnQgdm9sID0gKCgweDgwMDAqdm9sdW1lKS8xMDBMKTsKKwlwc3Nfd3JpdGUoZGV2YywgMHgwMDgwKTsKKwlwc3Nfd3JpdGUoZGV2Yywgdm9sKTsKKwlwc3Nfd3JpdGUoZGV2YywgMHgwMDgxKTsKKwlwc3Nfd3JpdGUoZGV2Yywgdm9sKTsKK30KKworc3RhdGljIHZvaWQgc2V0X2Jhc3MocHNzX2NvbmZkYXRhICpkZXZjLCBpbnQgbGV2ZWwpCit7CisJaW50IHZvbCA9IChpbnQpKCgoMHhmZCAtIDB4ZjApICogbGV2ZWwpLzEwMEwpICsgMHhmMDsKKwlwc3Nfd3JpdGUoZGV2YywgMHgwMDEwKTsKKwlwc3Nfd3JpdGUoZGV2Yywgdm9sIHwgMHgwMjAwKTsKK307CisKK3N0YXRpYyB2b2lkIHNldF90cmVibGUocHNzX2NvbmZkYXRhICpkZXZjLCBpbnQgbGV2ZWwpCit7CQorCWludCB2b2wgPSAoKCgweGZkIC0gMHhmMCkgKiBsZXZlbCkvMTAwTCkgKyAweGYwOworCXBzc193cml0ZShkZXZjLCAweDAwMTApOworCXBzc193cml0ZShkZXZjLCB2b2wgfCAweDAzMDApOworfTsKKworc3RhdGljIHZvaWQgcHNzX21peGVyX3Jlc2V0KHBzc19jb25mZGF0YSAqZGV2YykKK3sKKwlzZXRfbWFzdGVyX3ZvbHVtZShkZXZjLCAzMywgMzMpOworCXNldF9iYXNzKGRldmMsIDUwKTsKKwlzZXRfdHJlYmxlKGRldmMsIDUwKTsKKwlzZXRfc3ludGhfdm9sdW1lKGRldmMsIDMwKTsKKwlwc3Nfd3JpdGUgKGRldmMsIDB4MDAxMCk7CisJcHNzX3dyaXRlIChkZXZjLCAweDA4MDAgfCAweGNlKTsJLyogU3RlcmVvICovCisJCisJaWYocHNzX21peGVyKQorCXsKKwkJZGV2Yy0+bWl4ZXIudm9sdW1lX2wgPSBkZXZjLT5taXhlci52b2x1bWVfciA9IDMzOworCQlkZXZjLT5taXhlci5iYXNzID0gNTA7CisJCWRldmMtPm1peGVyLnRyZWJsZSA9IDUwOworCQlkZXZjLT5taXhlci5zeW50aCA9IDMwOworCX0KK30KKworc3RhdGljIGludCBzZXRfdm9sdW1lX21vbm8odW5zaWduZWQgX191c2VyICpwLCBpbnQgKmFsZWZ0KQoreworCWludCBsZWZ0OworCXVuc2lnbmVkIHZvbHVtZTsKKwlpZiAoZ2V0X3VzZXIodm9sdW1lLCBwKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJCisJbGVmdCA9IHZvbHVtZSAmIDB4ZmY7CisJaWYgKGxlZnQgPiAxMDApCisJCWxlZnQgPSAxMDA7CisJKmFsZWZ0ID0gbGVmdDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfdm9sdW1lX3N0ZXJlbyh1bnNpZ25lZCBfX3VzZXIgKnAsIGludCAqYWxlZnQsIGludCAqYXJpZ2h0KQoreworCWludCBsZWZ0LCByaWdodDsKKwl1bnNpZ25lZCB2b2x1bWU7CisJaWYgKGdldF91c2VyKHZvbHVtZSwgcCkpCisJCXJldHVybiAtRUZBVUxUOworCisJbGVmdCA9IHZvbHVtZSAmIDB4ZmY7CisJaWYgKGxlZnQgPiAxMDApCisJCWxlZnQgPSAxMDA7CisJcmlnaHQgPSAodm9sdW1lID4+IDgpICYgMHhmZjsKKwlpZiAocmlnaHQgPiAxMDApCisJCXJpZ2h0ID0gMTAwOworCSphbGVmdCA9IGxlZnQ7CisJKmFyaWdodCA9IHJpZ2h0OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJldF92b2xfbW9ubyhpbnQgbGVmdCkKK3sKKwlyZXR1cm4gKChsZWZ0IDw8IDgpIHwgbGVmdCk7Cit9CisKK3N0YXRpYyBpbnQgcmV0X3ZvbF9zdGVyZW8oaW50IGxlZnQsIGludCByaWdodCkKK3sKKwlyZXR1cm4gKChyaWdodCA8PCA4KSB8IGxlZnQpOworfQorCitzdGF0aWMgaW50IGNhbGxfYWRfbWl4ZXIocHNzX2NvbmZkYXRhICpkZXZjLHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaWYgKGRldmMtPmFkX21peGVyX2RldiAhPSBOT19XU1NfTUlYRVIpIAorCQlyZXR1cm4gbWl4ZXJfZGV2c1tkZXZjLT5hZF9taXhlcl9kZXZdLT5pb2N0bChkZXZjLT5hZF9taXhlcl9kZXYsIGNtZCwgYXJnKTsKKwllbHNlIAorCQlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBwc3NfbWl4ZXJfaW9jdGwgKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJcHNzX2NvbmZkYXRhICpkZXZjID0gbWl4ZXJfZGV2c1tkZXZdLT5kZXZjOworCWludCBjbWRmID0gY21kICYgMHhmZjsKKwkKKwlpZiAoKGNtZGYgIT0gU09VTkRfTUlYRVJfVk9MVU1FKSAmJiAoY21kZiAhPSBTT1VORF9NSVhFUl9CQVNTKSAmJgorCQkoY21kZiAhPSBTT1VORF9NSVhFUl9UUkVCTEUpICYmIChjbWRmICE9IFNPVU5EX01JWEVSX1NZTlRIKSAmJgorCQkoY21kZiAhPSBTT1VORF9NSVhFUl9ERVZNQVNLKSAmJiAoY21kZiAhPSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTKSAmJgorCQkoY21kZiAhPSBTT1VORF9NSVhFUl9SRUNNQVNLKSAmJiAoY21kZiAhPSBTT1VORF9NSVhFUl9DQVBTKSAmJgorCQkoY21kZiAhPSBTT1VORF9NSVhFUl9SRUNTUkMpKSAKKwl7CisJCXJldHVybiBjYWxsX2FkX21peGVyKGRldmMsIGNtZCwgYXJnKTsKKwl9CisJCisJaWYgKCgoY21kID4+IDgpICYgMHhmZikgIT0gJ00nKQkKKwkJcmV0dXJuIC1FSU5WQUw7CisJCQorCWlmIChfU0lPQ19ESVIgKGNtZCkgJiBfU0lPQ19XUklURSkKKwl7CisJCXN3aXRjaCAoY21kZikJCisJCXsKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCWlmIChkZXZjLT5hZF9taXhlcl9kZXYgIT0gTk9fV1NTX01JWEVSKQorCQkJCQlyZXR1cm4gY2FsbF9hZF9taXhlcihkZXZjLCBjbWQsIGFyZyk7CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJaW50IHY7CisJCQkJCWlmIChnZXRfdXNlcih2LCAoaW50IF9fdXNlciAqKWFyZykpCisJCQkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCQkJaWYgKHYgIT0gMCkKKwkJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwkJCQlpZiAoc2V0X3ZvbHVtZV9zdGVyZW8oYXJnLAorCQkJCQkmZGV2Yy0+bWl4ZXIudm9sdW1lX2wsCisJCQkJCSZkZXZjLT5taXhlci52b2x1bWVfcikpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXNldF9tYXN0ZXJfdm9sdW1lKGRldmMsIGRldmMtPm1peGVyLnZvbHVtZV9sLAorCQkJCQlkZXZjLT5taXhlci52b2x1bWVfcik7CisJCQkJcmV0dXJuIHJldF92b2xfc3RlcmVvKGRldmMtPm1peGVyLnZvbHVtZV9sLAorCQkJCQlkZXZjLT5taXhlci52b2x1bWVfcik7CisJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX0JBU1M6CisJCQkJaWYgKHNldF92b2x1bWVfbW9ubyhhcmcsICZkZXZjLT5taXhlci5iYXNzKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJc2V0X2Jhc3MoZGV2YywgZGV2Yy0+bWl4ZXIuYmFzcyk7CisJCQkJcmV0dXJuIHJldF92b2xfbW9ubyhkZXZjLT5taXhlci5iYXNzKTsKKwkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfVFJFQkxFOgorCQkJCWlmIChzZXRfdm9sdW1lX21vbm8oYXJnLCAmZGV2Yy0+bWl4ZXIudHJlYmxlKSkKKwkJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQkJc2V0X3RyZWJsZShkZXZjLCBkZXZjLT5taXhlci50cmVibGUpOworCQkJCXJldHVybiByZXRfdm9sX21vbm8oZGV2Yy0+bWl4ZXIudHJlYmxlKTsKKwkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1lOVEg6CisJCQkJaWYgKHNldF92b2x1bWVfbW9ubyhhcmcsICZkZXZjLT5taXhlci5zeW50aCkpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXNldF9zeW50aF92b2x1bWUoZGV2YywgZGV2Yy0+bWl4ZXIuc3ludGgpOworCQkJCXJldHVybiByZXRfdm9sX21vbm8oZGV2Yy0+bWl4ZXIuc3ludGgpOworCQkgIAorCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKwllbHNlCQkJCisJeworCQlpbnQgdmFsLCBhbmRfbWFzayA9IDAsIG9yX21hc2sgPSAwOworCQkvKgorCQkgKiBSZXR1cm4gcGFyYW1ldGVycworCQkgKi8KKwkJc3dpdGNoIChjbWRmKQorCQl7CisJCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCQkJaWYgKGNhbGxfYWRfbWl4ZXIoZGV2YywgY21kLCBhcmcpID09IC1FSU5WQUwpCisJCQkJCWJyZWFrOworCQkJCWFuZF9tYXNrID0gfjA7CisJCQkJb3JfbWFzayA9IFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19CQVNTIHwgU09VTkRfTUFTS19UUkVCTEUgfCBTT1VORF9NQVNLX1NZTlRIOworCQkJCWJyZWFrOworCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJCWlmIChjYWxsX2FkX21peGVyKGRldmMsIGNtZCwgYXJnKSA9PSAtRUlOVkFMKQorCQkJCQlicmVhazsKKwkJCQlhbmRfbWFzayA9IH4wOworCQkJCW9yX21hc2sgPSBTT1VORF9NQVNLX1ZPTFVNRTsKKwkJCQlicmVhazsKKwkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJCQlpZiAoZGV2Yy0+YWRfbWl4ZXJfZGV2ICE9IE5PX1dTU19NSVhFUikKKwkJCQkJcmV0dXJuIGNhbGxfYWRfbWl4ZXIoZGV2YywgY21kLCBhcmcpOworCQkJCWJyZWFrOworCisJCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQkJaWYgKGRldmMtPmFkX21peGVyX2RldiAhPSBOT19XU1NfTUlYRVIpCisJCQkJCXJldHVybiBjYWxsX2FkX21peGVyKGRldmMsIGNtZCwgYXJnKTsKKwkJCQlvcl9tYXNrID0gU09VTkRfQ0FQX0VYQ0xfSU5QVVQ7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJCWlmIChkZXZjLT5hZF9taXhlcl9kZXYgIT0gTk9fV1NTX01JWEVSKQorCQkJCQlyZXR1cm4gY2FsbF9hZF9taXhlcihkZXZjLCBjbWQsIGFyZyk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJCW9yX21hc2sgPSAgcmV0X3ZvbF9zdGVyZW8oZGV2Yy0+bWl4ZXIudm9sdW1lX2wsIGRldmMtPm1peGVyLnZvbHVtZV9yKTsKKwkJCQlicmVhazsKKwkJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX0JBU1M6CisJCQkJb3JfbWFzayA9ICByZXRfdm9sX21vbm8oZGV2Yy0+bWl4ZXIuYmFzcyk7CisJCQkJYnJlYWs7CisJCQkgIAorCQkJY2FzZSBTT1VORF9NSVhFUl9UUkVCTEU6CisJCQkJb3JfbWFzayA9IHJldF92b2xfbW9ubyhkZXZjLT5taXhlci50cmVibGUpOworCQkJCWJyZWFrOworCQkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1lOVEg6CisJCQkJb3JfbWFzayA9IHJldF92b2xfbW9ubyhkZXZjLT5taXhlci5zeW50aCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQl2YWwgJj0gYW5kX21hc2s7CisJCXZhbCB8PSBvcl9tYXNrOworCQlpZiAocHV0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIHZhbDsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBwc3NfbWl4ZXJfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCT0gVEhJU19NT0RVTEUsCisJLmlkCT0gIlNPVU5EUE9SVCIsCisJLm5hbWUJPSAiUFNTLUFEMTg0OCIsCisJLmlvY3RsCT0gcHNzX21peGVyX2lvY3RsCit9OworCitzdGF0aWMgdm9pZCBkaXNhYmxlX2FsbF9lbXVsYXRpb25zKHZvaWQpCit7CisJb3V0dygweDAwMDAsIFJFRyhDT05GX1BTUykpOwkvKiAweDA0MDAgZW5hYmxlcyBqb3lzdGljayAqLworCW91dHcoMHgwMDAwLCBSRUcoQ09ORl9XU1MpKTsKKwlvdXR3KDB4MDAwMCwgUkVHKENPTkZfU0IpKTsKKwlvdXR3KDB4MDAwMCwgUkVHKENPTkZfTUlESSkpOworCW91dHcoMHgwMDAwLCBSRUcoQ09ORl9DRFJPTSkpOworfQorCitzdGF0aWMgdm9pZCBjb25maWd1cmVfbm9uc291bmRfY29tcG9uZW50cyh2b2lkKQoreworCS8qIENvbmZpZ3VyZSBKb3lzdGljayBwb3J0ICovCisKKwlpZihwc3NfZW5hYmxlX2pveXN0aWNrKQorCXsKKwkJb3V0dygweDA0MDAsIFJFRyhDT05GX1BTUykpOwkvKiAweDA0MDAgZW5hYmxlcyBqb3lzdGljayAqLworCQlwcmludGsoS0VSTl9JTkZPICJQU1M6IGpveXN0aWNrIGVuYWJsZWQuXG4iKTsKKwl9CisJZWxzZQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUFNTOiBqb3lzdGljayBwb3J0IG5vdCBlbmFibGVkLlxuIik7CisJfQorCisJLyogQ29uZmlndXJlIENEUk9NIHBvcnQgKi8KKworCWlmKHBzc19jZHJvbV9wb3J0ID09IC0xKQkvKiBJZiBjZHJvbSBwb3J0IGVuYWJsYXRpb24gd2Fzbid0IHJlcXVlc3RlZCAqLworCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUFNTOiBDRFJPTSBwb3J0IG5vdCBlbmFibGVkLlxuIik7CisJfQorCWVsc2UgaWYoY2hlY2tfcmVnaW9uKHBzc19jZHJvbV9wb3J0LCAyKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBDRFJPTSBJL08gcG9ydCBjb25mbGljdC5cbiIpOworCX0KKwllbHNlIGlmKCFzZXRfaW9fYmFzZShkZXZjLCBDT05GX0NEUk9NLCBwc3NfY2Ryb21fcG9ydCkpCisJeworCQlwcmludGsoS0VSTl9FUlIgIlBTUzogQ0RST00gSS9PIHBvcnQgY291bGQgbm90IGJlIHNldC5cbiIpOworCX0KKwllbHNlCQkJCQkvKiBDRFJPTSBwb3J0IHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkICovCisJeworCQlwcmludGsoS0VSTl9JTkZPICJQU1M6IENEUk9NIEkvTyBwb3J0IHNldCB0byAweCV4LlxuIiwgcHNzX2Nkcm9tX3BvcnQpOworCX0KK30KKworc3RhdGljIGludCBfX2luaXQgYXR0YWNoX3BzcyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5zaWduZWQgc2hvcnQgIGlkOworCWNoYXIgdG1wWzEwMF07CisKKwlkZXZjLT5iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCWRldmMtPmlycSA9IGh3X2NvbmZpZy0+aXJxOworCWRldmMtPmRtYSA9IGh3X2NvbmZpZy0+ZG1hOworCWRldmMtPm9zcCA9IGh3X2NvbmZpZy0+b3NwOworCWRldmMtPmFkX21peGVyX2RldiA9IE5PX1dTU19NSVhFUjsKKworCWlmICghcHJvYmVfcHNzKGh3X2NvbmZpZykpCisJCXJldHVybiAwOworCisJaWQgPSBpbncoUkVHKFBTU19JRCkpICYgMHgwMGZmOworCisJLyoKKwkgKiBEaXNhYmxlIGFsbCBlbXVsYXRpb25zLiBXaWxsIGJlIGVuYWJsZWQgbGF0ZXIgKGlmIHJlcXVpcmVkKS4KKwkgKi8KKwkgCisJZGlzYWJsZV9hbGxfZW11bGF0aW9ucygpOworCisjaWYgWU9VX1JFQUxMWV9XQU5UX1RPX0FMTE9DQVRFX1RIRVNFX1JFU09VUkNFUworCWlmIChzb3VuZF9hbGxvY19kbWEoaHdfY29uZmlnLT5kbWEsICJQU1MiKSkKKwl7CisJCXByaW50aygicHNzLmM6IENhbid0IGFsbG9jYXRlIERNQSBjaGFubmVsLlxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMHgxMCk7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSsweDEwLCAweDkpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzZXRfaXJxKGRldmMsIENPTkZfUFNTLCBkZXZjLT5pcnEpKQorCXsKKwkJcHJpbnRrKCJQU1M6IElSUSBhbGxvY2F0aW9uIGVycm9yLlxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMHgxMCk7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSsweDEwLCAweDkpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFzZXRfZG1hKGRldmMsIENPTkZfUFNTLCBkZXZjLT5kbWEpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IERNQSBhbGxvY2F0aW9uIGVycm9yXG4iKTsKKwkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAweDEwKTsKKwkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlKzB4MTAsIDB4OSk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCisJY29uZmlndXJlX25vbnNvdW5kX2NvbXBvbmVudHMoKTsKKwlwc3NfaW5pdGlhbGl6ZWQgPSAxOworCXNwcmludGYodG1wLCAiRUNITy1QU1MgIFJldi4gJWQiLCBpZCk7CisJY29uZl9wcmludGYodG1wLCBod19jb25maWcpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV9wc3NfbXB1KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCWludCB0aW1lb3V0OworCisJaWYgKCFwc3NfaW5pdGlhbGl6ZWQpCisJCXJldHVybiAwOworCisJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIsICJtcHU0MDEiKTsKKworCWlmICghcG9ydHMpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IE1QVSBJL08gcG9ydCBjb25mbGljdFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXNldF9pb19iYXNlKGRldmMsIENPTkZfTUlESSwgaHdfY29uZmlnLT5pb19iYXNlKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlBTUzogTUlESSBiYXNlIGNvdWxkIG5vdCBiZSBzZXQuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoIXNldF9pcnEoZGV2YywgQ09ORl9NSURJLCBod19jb25maWctPmlycSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IE1JREkgSVJRIGFsbG9jYXRpb24gZXJyb3IuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoIXBzc19zeW50aExlbikgeworCQlwcmludGsoS0VSTl9FUlIgIlBTUzogQ2FuJ3QgZW5hYmxlIE1QVS4gTUlESSBzeW50aCBtaWNyb2NvZGUgbm90IGF2YWlsYWJsZS5cbiIpOworCQlnb3RvIGZhaWw7CisJfQorCWlmICghcHNzX2Rvd25sb2FkX2Jvb3QoZGV2YywgcHNzX3N5bnRoLCBwc3Nfc3ludGhMZW4sIENQRl9GSVJTVCB8IENQRl9MQVNUKSkgeworCQlwcmludGsoS0VSTl9FUlIgIlBTUzogVW5hYmxlIHRvIGxvYWQgTUlESSBzeW50aCBtaWNyb2NvZGUgdG8gRFNQLlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIEZpbmFsbHkgd2FpdCB1bnRpbCB0aGUgRFNQIGFsZ29yaXRobSBoYXMgaW5pdGlhbGl6ZWQgaXRzZWxmIGFuZAorCSAqIGRlYWN0aXZhdGVzIHJlY2VpdmUgaW50ZXJydXB0LgorCSAqLworCisJZm9yICh0aW1lb3V0ID0gOTAwMDAwOyB0aW1lb3V0ID4gMDsgdGltZW91dC0tKQorCXsKKwkJaWYgKChpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgMSkgJiAweDgwKSA9PSAwKQkvKiBJbnB1dCBkYXRhIGF2YWlsICovCisJCQlpbmIoaHdfY29uZmlnLT5pb19iYXNlKTsJLyogRGlzY2FyZCBpdCAqLworCQllbHNlCisJCQlicmVhazsJLyogTm8gbW9yZSBpbnB1dCAqLworCX0KKworCWlmICghcHJvYmVfbXB1NDAxKGh3X2NvbmZpZywgcG9ydHMpKQorCQlnb3RvIGZhaWw7CisKKwlhdHRhY2hfbXB1NDAxKGh3X2NvbmZpZywgVEhJU19NT0RVTEUpOwkvKiBTbG90IDEgKi8KKwlpZiAoaHdfY29uZmlnLT5zbG90c1sxXSAhPSAtMSkJLyogVGhlIE1QVSBkcml2ZXIgaW5zdGFsbGVkIGl0c2VsZiAqLworCQltaWRpX2RldnNbaHdfY29uZmlnLT5zbG90c1sxXV0tPmNvcHJvYyA9ICZwc3NfY29wcm9jX29wZXJhdGlvbnM7CisJcmV0dXJuIDE7CitmYWlsOgorCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcHNzX2NvcHJvY19vcGVuKHZvaWQgKmRldl9pbmZvLCBpbnQgc3ViX2RldmljZSkKK3sKKwlzd2l0Y2ggKHN1Yl9kZXZpY2UpCisJeworCQljYXNlIENPUFJfTUlESToKKwkJCWlmIChwc3Nfc3ludGhMZW4gPT0gMCkKKwkJCXsKKwkJCQlwcmludGsoS0VSTl9FUlIgIlBTUzogTUlESSBzeW50aCBtaWNyb2NvZGUgbm90IGF2YWlsYWJsZS5cbiIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKG5vbnN0YW5kYXJkX21pY3JvY29kZSkKKwkJCQlpZiAoIXBzc19kb3dubG9hZF9ib290KGRldmMsIHBzc19zeW50aCwgcHNzX3N5bnRoTGVuLCBDUEZfRklSU1QgfCBDUEZfTEFTVCkpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IFVuYWJsZSB0byBsb2FkIE1JREkgc3ludGggbWljcm9jb2RlIHRvIERTUC5cbiIpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJbm9uc3RhbmRhcmRfbWljcm9jb2RlID0gMDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBzc19jb3Byb2NfY2xvc2Uodm9pZCAqZGV2X2luZm8sIGludCBzdWJfZGV2aWNlKQoreworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgcHNzX2NvcHJvY19yZXNldCh2b2lkICpkZXZfaW5mbykKK3sKKwlpZiAocHNzX3N5bnRoTGVuKQorCQlpZiAoIXBzc19kb3dubG9hZF9ib290KGRldmMsIHBzc19zeW50aCwgcHNzX3N5bnRoTGVuLCBDUEZfRklSU1QgfCBDUEZfTEFTVCkpCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBVbmFibGUgdG8gbG9hZCBNSURJIHN5bnRoIG1pY3JvY29kZSB0byBEU1AuXG4iKTsKKwkJfQorCW5vbnN0YW5kYXJkX21pY3JvY29kZSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZG93bmxvYWRfYm9vdF9ibG9jayh2b2lkICpkZXZfaW5mbywgY29wcl9idWZmZXIgKiBidWYpCit7CisJaWYgKGJ1Zi0+bGVuIDw9IDAgfHwgYnVmLT5sZW4gPiBzaXplb2YoYnVmLT5kYXRhKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoIXBzc19kb3dubG9hZF9ib290KGRldmMsIGJ1Zi0+ZGF0YSwgYnVmLT5sZW4sIGJ1Zi0+ZmxhZ3MpKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IFVuYWJsZSB0byBsb2FkIG1pY3JvY29kZSBibG9jayB0byBEU1AuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCW5vbnN0YW5kYXJkX21pY3JvY29kZSA9IDE7CS8qIFRoZSBNSURJIG1pY3JvY29kZSBoYXMgYmVlbiBvdmVyd3JpdHRlbiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBzc19jb3Byb2NfaW9jdGwodm9pZCAqZGV2X2luZm8sIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcsIGludCBsb2NhbCkKK3sKKwljb3ByX2J1ZmZlciAqYnVmOworCWNvcHJfbXNnICptYnVmOworCWNvcHJfZGVidWdfYnVmIGRidWY7CisJdW5zaWduZWQgc2hvcnQgdG1wOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc2hvcnQgKmRhdGE7CisJaW50IGksIGVycjsKKwkvKiBwcmludGsoICJQU1MgY29wcm9jIGlvY3RsICV4ICV4ICVkXG4iLCAgY21kLCAgYXJnLCAgbG9jYWwpOyAqLworCQorCXN3aXRjaCAoY21kKSAKKwl7CisJCWNhc2UgU05EQ1RMX0NPUFJfUkVTRVQ6CisJCQlwc3NfY29wcm9jX3Jlc2V0KGRldl9pbmZvKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX0NPUFJfTE9BRDoKKwkJCWJ1ZiA9IChjb3ByX2J1ZmZlciAqKSB2bWFsbG9jKHNpemVvZihjb3ByX2J1ZmZlcikpOworCQkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5PU1BDOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgYXJnLCBzaXplb2YoY29wcl9idWZmZXIpKSkgeworCQkJCXZmcmVlKGJ1Zik7CisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQl9CisJCQllcnIgPSBkb3dubG9hZF9ib290X2Jsb2NrKGRldl9pbmZvLCBidWYpOworCQkJdmZyZWUoYnVmKTsKKwkJCXJldHVybiBlcnI7CisJCQorCQljYXNlIFNORENUTF9DT1BSX1NFTkRNU0c6CisJCQltYnVmID0gKGNvcHJfbXNnICopdm1hbGxvYyhzaXplb2YoY29wcl9tc2cpKTsKKwkJCWlmIChtYnVmID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlpZiAoY29weV9mcm9tX3VzZXIobWJ1ZiwgYXJnLCBzaXplb2YoY29wcl9tc2cpKSkgeworCQkJCXZmcmVlKG1idWYpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJZGF0YSA9ICh1bnNpZ25lZCBzaG9ydCAqKShtYnVmLT5kYXRhKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgbWJ1Zi0+bGVuOyBpKyspIHsKKwkJCQlpZiAoIXBzc19wdXRfZHNwd29yZChkZXZjLCAqZGF0YSsrKSkgeworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQkJbWJ1Zi0+bGVuID0gaTsJLyogZmVlZCBiYWNrIG51bWJlciBvZiBXT1JEcyBzZW50ICovCisJCQkJCWVyciA9IGNvcHlfdG9fdXNlcihhcmcsIG1idWYsIHNpemVvZihjb3ByX21zZykpOworCQkJCQl2ZnJlZShtYnVmKTsKKwkJCQkJcmV0dXJuIGVyciA/IC1FRkFVTFQgOiAtRUlPOworCQkJCX0KKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJdmZyZWUobWJ1Zik7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9DT1BSX1JDVk1TRzoKKwkJCWVyciA9IDA7CisJCQltYnVmID0gKGNvcHJfbXNnICopdm1hbGxvYyhzaXplb2YoY29wcl9tc2cpKTsKKwkJCWlmIChtYnVmID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlkYXRhID0gKHVuc2lnbmVkIHNob3J0ICopbWJ1Zi0+ZGF0YTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKG1idWYtPmRhdGEpL3NpemVvZih1bnNpZ25lZCBzaG9ydCk7IGkrKykgeworCQkJCW1idWYtPmxlbiA9IGk7CS8qIGZlZWQgYmFjayBudW1iZXIgb2YgV09SRHMgcmVhZCAqLworCQkJCWlmICghcHNzX2dldF9kc3B3b3JkKGRldmMsIGRhdGErKykpIHsKKwkJCQkJaWYgKGkgPT0gMCkKKwkJCQkJCWVyciA9IC1FSU87CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsIG1idWYsIHNpemVvZihjb3ByX21zZykpKQorCQkJCWVyciA9IC1FRkFVTFQ7CisJCQl2ZnJlZShtYnVmKTsKKwkJCXJldHVybiBlcnI7CisJCQorCQljYXNlIFNORENUTF9DT1BSX1JEQVRBOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYnVmLCBhcmcsIHNpemVvZihkYnVmKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQkJaWYgKCFwc3NfcHV0X2RzcHdvcmQoZGV2YywgMHgwMGQwKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKCFwc3NfcHV0X2RzcHdvcmQoZGV2YywgKHVuc2lnbmVkIHNob3J0KShkYnVmLnBhcm0xICYgMHhmZmZmKSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWlmICghcHNzX2dldF9kc3B3b3JkKGRldmMsICZ0bXApKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlkYnVmLnBhcm0xID0gdG1wOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJmRidWYsIHNpemVvZihkYnVmKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKwkJCisJCWNhc2UgU05EQ1RMX0NPUFJfV0RBVEE6CisJCQlpZiAoY29weV9mcm9tX3VzZXIoJmRidWYsIGFyZywgc2l6ZW9mKGRidWYpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJCQlpZiAoIXBzc19wdXRfZHNwd29yZChkZXZjLCAweDAwZDEpKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlpZiAoIXBzc19wdXRfZHNwd29yZChkZXZjLCAodW5zaWduZWQgc2hvcnQpIChkYnVmLnBhcm0xICYgMHhmZmZmKSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXRtcCA9ICh1bnNpZ25lZCBpbnQpZGJ1Zi5wYXJtMiAmIDB4ZmZmZjsKKwkJCWlmICghcHNzX3B1dF9kc3B3b3JkKGRldmMsIHRtcCkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIFNORENUTF9DT1BSX1dDT0RFOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZkYnVmLCBhcmcsIHNpemVvZihkYnVmKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCQkJaWYgKCFwc3NfcHV0X2RzcHdvcmQoZGV2YywgMHgwMGQzKSkgeworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJaWYgKCFwc3NfcHV0X2RzcHdvcmQoZGV2YywgKHVuc2lnbmVkIHNob3J0KShkYnVmLnBhcm0xICYgMHhmZmZmKSkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXRtcCA9ICh1bnNpZ25lZCBpbnQpZGJ1Zi5wYXJtMiAmIDB4MDBmZjsKKwkJCWlmICghcHNzX3B1dF9kc3B3b3JkKGRldmMsIHRtcCkpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCXRtcCA9ICgodW5zaWduZWQgaW50KWRidWYucGFybTIgPj4gOCkgJiAweGZmZmY7CisJCQlpZiAoIXBzc19wdXRfZHNwd29yZChkZXZjLCB0bXApKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCXJldHVybiAwOworCQkKKwkJY2FzZSBTTkRDVExfQ09QUl9SQ09ERToKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZGJ1ZiwgYXJnLCBzaXplb2YoZGJ1ZikpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssIGZsYWdzKTsKKwkJCWlmICghcHNzX3B1dF9kc3B3b3JkKGRldmMsIDB4MDBkMikpIHsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWlmICghcHNzX3B1dF9kc3B3b3JkKGRldmMsICh1bnNpZ25lZCBzaG9ydCkoZGJ1Zi5wYXJtMSAmIDB4ZmZmZikpKSB7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQkJcmV0dXJuIC1FSU87CisJCQl9CisJCQlpZiAoIXBzc19nZXRfZHNwd29yZChkZXZjLCAmdG1wKSkgeyAvKiBSZWFkIE1TQiAqLworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJCXJldHVybiAtRUlPOworCQkJfQorCQkJZGJ1Zi5wYXJtMSA9IHRtcCA8PCA4OworCQkJaWYgKCFwc3NfZ2V0X2RzcHdvcmQoZGV2YywgJnRtcCkpIHsgLyogUmVhZCBMU0IgKi8KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJCWRidWYucGFybTEgfD0gdG1wICYgMHgwMGZmOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQlpZiAoY29weV90b191c2VyKGFyZywgJmRidWYsIHNpemVvZihkYnVmKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlyZXR1cm4gMDsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgY29wcm9jX29wZXJhdGlvbnMgcHNzX2NvcHJvY19vcGVyYXRpb25zID0KK3sKKwkiQURTUC0yMTE1IiwKKwlUSElTX01PRFVMRSwKKwlwc3NfY29wcm9jX29wZW4sCisJcHNzX2NvcHJvY19jbG9zZSwKKwlwc3NfY29wcm9jX2lvY3RsLAorCXBzc19jb3Byb2NfcmVzZXQsCisJJnBzc19kYXRhCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV9wc3NfbXNzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwl2b2xhdGlsZSBpbnQgdGltZW91dDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnBvcnRzOworCWludCAgICAgICAgbXlfbWl4ID0gLTk5OTsJLyogZ2NjIHNodXQgdXAgKi8KKworCWlmICghcHNzX2luaXRpYWxpemVkKQorCQlyZXR1cm4gMDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0LCAiV1NTIGNvbmZpZyIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBXU1MgSS9PIHBvcnQgY29uZmxpY3RzLlxuIik7CisJCXJldHVybiAwOworCX0KKwlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSArIDQsIDQsICJhZDE4NDgiKTsKKwlpZiAoIXBvcnRzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiUFNTOiBXU1MgSS9PIHBvcnQgY29uZmxpY3RzLlxuIik7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXNldF9pb19iYXNlKGRldmMsIENPTkZfV1NTLCBod19jb25maWctPmlvX2Jhc2UpKSB7CisJCXByaW50aygiUFNTOiBXU1MgYmFzZSBub3Qgc2V0dGFibGUuXG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoIXNldF9pcnEoZGV2YywgQ09ORl9XU1MsIGh3X2NvbmZpZy0+aXJxKSkgeworCQlwcmludGsoIlBTUzogV1NTIElSUSBhbGxvY2F0aW9uIGVycm9yLlxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKCFzZXRfZG1hKGRldmMsIENPTkZfV1NTLCBod19jb25maWctPmRtYSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJQU1M6IFdTUyBETUEgYWxsb2NhdGlvbiBlcnJvclxuIik7CisJCWdvdG8gZmFpbDsKKwl9CisJLyoKKwkgKiBGb3Igc29tZSByZWFzb24gdGhlIGNhcmQgcmV0dXJucyAweGZmIGluIHRoZSBXU1Mgc3RhdHVzIHJlZ2lzdGVyCisJICogaW1tZWRpYXRlbHkgYWZ0ZXIgYm9vdC4gUHJvYmFibHkgTUlESStTQiBlbXVsYXRpb24gYWxnb3JpdGhtCisJICogZG93bmxvYWRlZCB0byB0aGUgQURTUDIxMTUgc3BlbmRzIHNvbWUgdGltZSBpbml0aWFsaXppbmcgdGhlIGNhcmQuCisJICogTGV0J3MgdHJ5IHRvIHdhaXQgdW50aWwgaXQgZmluaXNoZXMgdGhpcyB0YXNrLgorCSAqLworCWZvciAodGltZW91dCA9IDA7IHRpbWVvdXQgPCAxMDAwMDAgJiYgKGluYihod19jb25maWctPmlvX2Jhc2UgKyBXU1NfSU5ERVgpICYKKwkgIFdTU19JTklUSUFMSVpJTkcpOyB0aW1lb3V0KyspCisJCTsKKworCW91dGIoKDB4MGIpLCBod19jb25maWctPmlvX2Jhc2UgKyBXU1NfSU5ERVgpOwkvKiBSZXF1aXJlZCBieSBzb21lIGNhcmRzICovCisKKwlmb3IgKHRpbWVvdXQgPSAwOyAoaW5iKGh3X2NvbmZpZy0+aW9fYmFzZSArIFdTU19EQVRBKSAmIFdTU19BVVRPQ0FMSUJSQVRJT04pICYmCisJICAodGltZW91dCA8IDEwMDAwMCk7IHRpbWVvdXQrKykKKwkJOworCisJaWYgKCFwcm9iZV9tc19zb3VuZChod19jb25maWcsIHBvcnRzKSkKKwkJZ290byBmYWlsOworCisJZGV2Yy0+YWRfbWl4ZXJfZGV2ID0gTk9fV1NTX01JWEVSOworCWlmIChwc3NfbWl4ZXIpIAorCXsKKwkJaWYgKChteV9taXggPSBzb3VuZF9pbnN0YWxsX21peGVyIChNSVhFUl9EUklWRVJfVkVSU0lPTiwKKwkJCSJQU1MtU1BFQUtFUlMgYW5kIEFEMTg0OCAodGhyb3VnaCBNU1MgYXVkaW8gY29kZWMpIiwKKwkJCSZwc3NfbWl4ZXJfb3BlcmF0aW9ucywKKwkJCXNpemVvZiAoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLAorCQkJZGV2YykpIDwgMCkgCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiQ291bGQgbm90IGluc3RhbGwgUFNTIG1peGVyXG4iKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKwlwc3NfbWl4ZXJfcmVzZXQoZGV2Yyk7CisJYXR0YWNoX21zX3NvdW5kKGh3X2NvbmZpZywgcG9ydHMsIFRISVNfTU9EVUxFKTsJLyogU2xvdCAwICovCisKKwlpZiAoaHdfY29uZmlnLT5zbG90c1swXSAhPSAtMSkKKwl7CisJCS8qIFRoZSBNU1MgZHJpdmVyIGluc3RhbGxlZCBpdHNlbGYgKi8KKwkJYXVkaW9fZGV2c1tod19jb25maWctPnNsb3RzWzBdXS0+Y29wcm9jID0gJnBzc19jb3Byb2Nfb3BlcmF0aW9uczsKKwkJaWYgKHBzc19taXhlciAmJiAobnVtX21peGVycyA9PSAobXlfbWl4ICsgMikpKQorCQl7CisJCQkvKiBUaGUgTVNTIG1peGVyIGluc3RhbGxlZCAqLworCQkJZGV2Yy0+YWRfbWl4ZXJfZGV2ID0gYXVkaW9fZGV2c1tod19jb25maWctPnNsb3RzWzBdXS0+bWl4ZXJfZGV2OworCQl9CisJfQorCXJldHVybiAxOworZmFpbDoKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UgKyA0LCA0KTsKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF9wc3Moc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMHgxMCk7CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlKzB4MTAsIDB4OSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2V4aXQgdW5sb2FkX3Bzc19tcHUoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXVubG9hZF9tcHU0MDEoaHdfY29uZmlnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCB1bmxvYWRfcHNzX21zcyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5sb2FkX21zX3NvdW5kKGh3X2NvbmZpZyk7Cit9CisKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnMjsKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZ19tcHU7CisKK3N0YXRpYyBpbnQgcHNzX2lvIF9faW5pdGRhdGEJPSAtMTsKK3N0YXRpYyBpbnQgbXNzX2lvIF9faW5pdGRhdGEJPSAtMTsKK3N0YXRpYyBpbnQgbXNzX2lycSBfX2luaXRkYXRhCT0gLTE7CitzdGF0aWMgaW50IG1zc19kbWEgX19pbml0ZGF0YQk9IC0xOworc3RhdGljIGludCBtcHVfaW8gX19pbml0ZGF0YQk9IC0xOworc3RhdGljIGludCBtcHVfaXJxIF9faW5pdGRhdGEJPSAtMTsKK3N0YXRpYyBpbnQgcHNzX25vX3NvdW5kID0gMDsJLyogSnVzdCBjb25maWd1cmUgbm9uLXNvdW5kIGNvbXBvbmVudHMgKi8KK3N0YXRpYyBpbnQgcHNzX2tlZXBfc2V0dGluZ3MgID0gMTsJLyogS2VlcCBoYXJkd2FyZSBzZXR0aW5ncyBhdCBtb2R1bGUgZXhpdCAqLworc3RhdGljIGNoYXIgKnBzc19maXJtd2FyZSA9ICIvZXRjL3NvdW5kL3Bzc19zeW50aCI7CisKK21vZHVsZV9wYXJhbShwc3NfaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBzc19pbywgIlNldCBpL28gYmFzZSBvZiBQU1MgY2FyZCAocHJvYmFibHkgMHgyMjAgb3IgMHgyNDApIik7Cittb2R1bGVfcGFyYW0obXNzX2lvLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtc3NfaW8sICJTZXQgV1NTIChhdWRpbykgaS9vIGJhc2UgKDB4NTMwLCAweDYwNCwgMHhFODAsIDB4RjQwLCBvciBvdGhlci4gQWRkcmVzcyBtdXN0IGVuZCBpbiAwIG9yIDQgYW5kIG11c3QgYmUgZnJvbSAweDEwMCB0byAweEZGNCkiKTsKK21vZHVsZV9wYXJhbShtc3NfaXJxLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtc3NfaXJxLCAiU2V0IFdTUyAoYXVkaW8pIElSUSAoMywgNSwgNywgOSwgMTAsIDExLCAxMikiKTsKK21vZHVsZV9wYXJhbShtc3NfZG1hLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhtc3NfZG1hLCAiU2V0IFdTUyAoYXVkaW8pIERNQSAoMCwgMSwgMykiKTsKK21vZHVsZV9wYXJhbShtcHVfaW8sIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1wdV9pbywgIlNldCBNSURJIGkvbyBiYXNlICgweDMzMCBvciBvdGhlci4gQWRkcmVzcyBtdXN0IGJlIG9uIDQgbG9jYXRpb24gYm91bmRhcmllcyBhbmQgbXVzdCBiZSBmcm9tIDB4MTAwIHRvIDB4RkZDKSIpOworbW9kdWxlX3BhcmFtKG1wdV9pcnEsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKG1wdV9pcnEsICJTZXQgTUlESSBJUlEgKDMsIDUsIDcsIDksIDEwLCAxMSwgMTIpIik7Cittb2R1bGVfcGFyYW0ocHNzX2Nkcm9tX3BvcnQsIGludCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBzc19jZHJvbV9wb3J0LCAiU2V0IHRoZSBQU1MgQ0RST00gcG9ydCBpL28gYmFzZSAoMHgzNDAgb3Igb3RoZXIpIik7Cittb2R1bGVfcGFyYW0ocHNzX2VuYWJsZV9qb3lzdGljaywgYm9vbCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBzc19lbmFibGVfam95c3RpY2ssICJFbmFibGVzIHRoZSBQU1Mgam95c3RpY2sgcG9ydCAoMSB0byBlbmFibGUsIDAgdG8gZGlzYWJsZSkiKTsKK21vZHVsZV9wYXJhbShwc3Nfbm9fc291bmQsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhwc3Nfbm9fc291bmQsICJDb25maWd1cmUgc291bmQgY29tcG9lbnRzICgwIC0gbm8sIDEgLSB5ZXMpIik7Cittb2R1bGVfcGFyYW0ocHNzX2tlZXBfc2V0dGluZ3MsIGJvb2wsIDApOworTU9EVUxFX1BBUk1fREVTQyhwc3Nfa2VlcF9zZXR0aW5ncywgIktlZXAgaGFyZHdhcmUgc2V0dGluZyBhdCBkcml2ZXIgdW5sb2FkaW5nICgwIC0gbm8sIDEgLSB5ZXMpIik7Cittb2R1bGVfcGFyYW0ocHNzX2Zpcm13YXJlLCBjaGFycCwgMCk7CitNT0RVTEVfUEFSTV9ERVNDKHBzc19maXJtd2FyZSwgIkxvY2F0aW9uIG9mIHRoZSBmaXJtd2FyZSBmaWxlIChkZWZhdWx0IC0gL2V0Yy9zb3VuZC9wc3Nfc3ludGgpIik7Cittb2R1bGVfcGFyYW0ocHNzX21peGVyLCBib29sLCAwKTsKK01PRFVMRV9QQVJNX0RFU0MocHNzX21peGVyLCAiRW5hYmxlICgxKSBvciBkaXNhYmxlICgwKSBQU1MgbWl4ZXIgKGNvbnRyb2xsaW5nIG9mIG91dHB1dCB2b2x1bWUsIGJhc3MsIHRyZWJsZSwgc3ludGggdm9sdW1lKS4gVGhlIG1peGVyIGlzIG5vdCBhdmFpbGFibGUgb24gYWxsIFBTUyBjYXJkcy4iKTsKK01PRFVMRV9BVVRIT1IoIkhhbm51IFNhdm9sYWluZW4sIFZsYWRpbWlyIE1pY2hsIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIk1vZHVsZSBmb3IgUFNTIHNvdW5kIGNhcmRzIChiYXNlZCBvbiBBRDE4NDgsIEFEU1AtMjExNSBhbmQgRVNDNjE0KS4gVGhpcyBtb2R1bGUgaW5jbHVkZXMgY29udHJvbCBvZiBvdXRwdXQgYW1wbGlmaWVyIGFuZCBzeW50aCB2b2x1bWUgb2YgdGhlIEJlZXRob3ZlbiBBRFNQLTE2IGNhcmQgKHRoaXMgbWF5IHdvcmsgd2l0aCBvdGhlciBQU1MgY2FyZHMpLiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK3N0YXRpYyBpbnQgZndfbG9hZCA9IDA7CitzdGF0aWMgaW50IHBzc21wdSA9IDAsIHBzc21zcyA9IDA7CisKKy8qCisgKiAgICBMb2FkIGEgUFNTIHNvdW5kIGNhcmQgbW9kdWxlCisgKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF9wc3Modm9pZCkKK3sKKworCWlmKHBzc19ub19zb3VuZCkJCS8qIElmIGNvbmZpZ3VyaW5nIG9ubHkgbm9uc291bmQgY29tcG9uZW50cyAqLworCXsKKwkJY2ZnLmlvX2Jhc2UgPSBwc3NfaW87CisJCWlmKCFwcm9iZV9wc3MoJmNmZykpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiRUNITy1QU1MgIFJldi4gJWRcbiIsIGludyhSRUcoUFNTX0lEKSkgJiAweDAwZmYpOworCQlwcmludGsoS0VSTl9JTkZPICJQU1M6IGxvYWRpbmcgaW4gbm8gc291bmQgbW9kZS5cbiIpOworCQlkaXNhYmxlX2FsbF9lbXVsYXRpb25zKCk7CisJCWNvbmZpZ3VyZV9ub25zb3VuZF9jb21wb25lbnRzKCk7CisJCXJlbGVhc2VfcmVnaW9uKHBzc19pbywgMHgxMCk7CisJCXJlbGVhc2VfcmVnaW9uKHBzc19pbyArIDB4MTAsIDB4OSk7CisJCXJldHVybiAwOworCX0KKworCWNmZy5pb19iYXNlID0gcHNzX2lvOworCisJY2ZnMi5pb19iYXNlID0gbXNzX2lvOworCWNmZzIuaXJxID0gbXNzX2lycTsKKwljZmcyLmRtYSA9IG1zc19kbWE7CisKKwljZmdfbXB1LmlvX2Jhc2UgPSBtcHVfaW87CisJY2ZnX21wdS5pcnEgPSBtcHVfaXJxOworCisJaWYgKGNmZy5pb19iYXNlID09IC0xIHx8IGNmZzIuaW9fYmFzZSA9PSAtMSB8fCBjZmcyLmlycSA9PSAtMSB8fCBjZmcuZG1hID09IC0xKSB7CisJCXByaW50ayhLRVJOX0lORk8gInBzczogbXNzX2lvLCBtc3NfZG1hLCBtc3NfaXJxIGFuZCBwc3NfaW8gbXVzdCBiZSBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKCFwc3Nfc3ludGgpIHsKKwkJZndfbG9hZCA9IDE7CisJCXBzc19zeW50aExlbiA9IG1vZF9maXJtd2FyZV9sb2FkKHBzc19maXJtd2FyZSwgKHZvaWQgKikgJnBzc19zeW50aCk7CisJfQorCWlmICghYXR0YWNoX3BzcygmY2ZnKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJLyoKKwkgKiAgICBBdHRhY2ggc3R1ZmYKKwkgKi8KKwlpZiAocHJvYmVfcHNzX21wdSgmY2ZnX21wdSkpCisJCXBzc21wdSA9IDE7CisKKwlpZiAocHJvYmVfcHNzX21zcygmY2ZnMikpCisJCXBzc21zcyA9IDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfcHNzKHZvaWQpCit7CisJaWYoIXBzc19ub19zb3VuZCkKKwl7CisJCWlmKGZ3X2xvYWQgJiYgcHNzX3N5bnRoKQorCQkJdmZyZWUocHNzX3N5bnRoKTsKKwkJaWYocHNzbXNzKQorCQkJdW5sb2FkX3Bzc19tc3MoJmNmZzIpOworCQlpZihwc3NtcHUpCisJCQl1bmxvYWRfcHNzX21wdSgmY2ZnX21wdSk7CisJCXVubG9hZF9wc3MoJmNmZyk7CisJfQorCisJaWYoIXBzc19rZWVwX3NldHRpbmdzKQkvKiBLZWVwIGhhcmR3YXJlIHNldHRpbmdzIGlmIGFza2VkICovCisJeworCQlkaXNhYmxlX2FsbF9lbXVsYXRpb25zKCk7CisJCXByaW50ayhLRVJOX0lORk8gIlJlc2V0dGluZyBQU1Mgc291bmQgY2FyZCBjb25maWd1cmF0aW9ucy5cbiIpOworCX0KK30KKworbW9kdWxlX2luaXQoaW5pdF9wc3MpOworbW9kdWxlX2V4aXQoY2xlYW51cF9wc3MpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfcHNzKGNoYXIgKnN0cikKK3sKKwkvKiBpbywgbXNzX2lvLCBtc3NfaXJxLCBtc3NfZG1hLCBtcHVfaW8sIG1wdV9pcnEgKi8KKwlpbnQgaW50c1s3XTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCisJcHNzX2lvCT0gaW50c1sxXTsKKwltc3NfaW8JPSBpbnRzWzJdOworCW1zc19pcnEJPSBpbnRzWzNdOworCW1zc19kbWEJPSBpbnRzWzRdOworCW1wdV9pbwk9IGludHNbNV07CisJbXB1X2lycQk9IGludHNbNl07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgicHNzPSIsIHNldHVwX3Bzcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9ybWU5Nnh4LmMgYi9zb3VuZC9vc3Mvcm1lOTZ4eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Nzc0YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvcm1lOTZ4eC5jCkBAIC0wLDAgKzEsMTg2MSBAQAorLyogKEMpIDIwMDAgR3VlbnRlciBHZWlnZXIgPGdlaWdlckBkZWJpYW4ub3JnPgorICAgd2l0aCBjb3B5L3Bhc3RlcyBmcm9tIHRoZSBkcml2ZXIgb2YgV2luZnJpZWQgUml0c2NoIDxyaXRzY2hAaWVtLmt1Zy5hYy5hdD4KKyAgIGJhc2VkIG9uIGVzMTM3MC5jCisKKworCisgICAqICAxMCBKYW4gMjAwMTogMC4xIGluaXRpYWwgdmVyc2lvbgorICAgKiAgMTkgSmFuIDIwMDE6IDAuMiBmaXhlZCBidWcgaW4gc2VsZWN0KCkKKyAgICogIDI3IEFwciAyMDAxOiAwLjMgbW9yZSB0aGFuIG9uZSBjYXJkIHVzYWJsZQorICAgKiAgMTEgTWF5IDIwMDE6IDAuNCBmaXhlZCBmb3IgU01QLCBpbmNsdWRlZCBpbnRvIGtlcm5lbCBzb3VyY2UgdHJlZQorICAgKiAgMTcgTWF5IDIwMDE6IDAuNSBkcmFpbmluZyBjb2RlIGRpZG4ndCB3b3JrIG9uIG5ldyBjYXJkcworICAgKiAgMTggTWF5IDIwMDE6IDAuNiByZW1vdmUgc3luY2hyb25pemVfaXJxKCkgY2FsbCAKKyAgICogIDE3IEp1bCAyMDAxOiAwLjcgdXBkYXRlZCB4cm1lY3RybCB0byBtYWtlIGl0IHdvcmsgZm9yIG5ld2VyIGNhcmRzCisgICAqICAgMiBmZWIgMjAwMjogMC44IGZpeGVkIHBjaSBkZXZpY2UgaGFuZGxpbmcsIHNlZSBiZWxvdyBmb3IgcGF0Y2hlcyBmcm9tIEhlaWtvIChUaGFua3MhKQorICAgICAgICAgICAgICAgICAgICAgICBNYXJjdXMgTWVpc3NuZXIgPE1hcmN1cy5NZWlzc25lckBjYWxkZXJhLmRlPgorCisJCSAgICAgICBNb2RpZmljYXRpb25zIC0gSGVpa28gUHVybmhhZ2VuIDxwdXJuaGFnZUB0bnQudW5pLWhhbm5vdmVyLmRlPgorCQkgICAgICAgSFAyMDAyMDEwOCBmaXhlZCBoYW5kbGluZyBvZiAibGFyZ2UiIHJlYWQoKQorCQkgICAgICAgSFAyMDAyMDExNiB0b3dhcmRzIFJFViAxLjUgc3VwcG9ydCwgYmFzZWQgb24gQUxTQSdzIGNhcmQtcm1lOTY1Mi5jCisJCSAgICAgICBIUDIwMDIwMTE4IG1hZGUgbWl4ZXIgaW9jdGwgYW5kIGhhbmRsaW5nIG9mIGRldmljZXM+MSBtb3JlIHNhZmUKKwkJICAgICAgIEhQMjAwMjAyMDEgZml4ZWQgaGFuZGxpbmcgb2YgImxhcmdlIiByZWFkKCkgcHJvcGVybHkKKwkJICAgICAgIGFkZGVkIFJFViAxLjUgUy9QLURJRiByZWNlaXZlciBzdXBwb3J0CisJCSAgICAgICBTTkRDVExfRFNQX1NQRUVEIG5vdyByZXR1cm5zIHRoZSBhY3R1YWwgc3BlZWQKKyAgICogIDEwIEF1ZyAyMDAyOiBhZGRlZCBzeW5jaHJvbml6ZV9pcnEoKSBhZ2FpbgorCitUT0RPOgorICAgLSB0ZXN0IG1vcmUgdGhhbiBvbmUgY2FyZCAtLS0gZG9uZQorICAgLSBjaGVjayBmb3IgcGNpIElPUkVHSU9OIChzZWUgZXMxMzcwKSBpbiBybWU5Nnh4X3Byb2JlID8/CisgICAtIGVycm9yIGRldGVjdGlvbgorICAgLSBtbWFwIGludGVyZmFjZQorICAgLSBtaXhlciBtbWFwIGludGVyZmFjZQorICAgLSBtaXhlciBpb2N0bAorICAgLSBnZXQgcmlkIG9mIG5vaXNlIHVwb24gZmlyc3Qgb3BlbiAod2h5ID8/KQorICAgLSBhbGxvdyBtdWx0aXBsZSBvcGVuIChhdCBsZWFzdCBmb3IgcmVhZCkKKyAgIC0gYWxsb3cgbXVsdGlwbGUgb3BlbiBmb3Igbm9uIG92ZXJsYXBwaW5nIHJlZ2lvbnMKKyAgIC0gcmVjaGVjayB0aGUgbXVsdGlwbGUgZGV2aWNlcyBwYXJ0IChvZmZzZXRzIG9mIGRpZmZlcmVudCBkZXZpY2VzLCBldGMpCisgICAtIGRvIGRlY2VudCBkcmFpbmluZyBpbiBfcmVsZWFzZSAtLS0gZG9uZQorICAgLSBTTVAgc3VwcG9ydAorICAgLSB3aGF0IGFib3V0IHVzaW5nIGZyYWdzdG90YWw+MiBmb3Igc21hbGwgZnJhZ3NpemU/IChIUDIwMDIwMTE4KQorICAgLSBhZGQgc3VwcG9ydCBmb3IgQUZNVF9TMzJfTEUKKyovCisKKyNpZm5kZWYgUk1FVkVSU0lPTgorI2RlZmluZSBSTUVWRVJTSU9OICIwLjgiCisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKworI2luY2x1ZGUgPGFzbS9kbWEuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorCisjaW5jbHVkZSAicm1lOTZ4eC5oIgorCisjZGVmaW5lIE5SX0RFVklDRSAyCisKK3N0YXRpYyBpbnQgZGV2aWNlcyA9IDE7Cittb2R1bGVfcGFyYW0oZGV2aWNlcywgaW50LCAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZGV2aWNlcywgIm51bWJlciBvZiBkc3AgZGV2aWNlcyBhbGxvY2F0ZWQgYnkgdGhlIGRyaXZlciIpOworCisKK01PRFVMRV9BVVRIT1IoIkd1ZW50ZXIgR2VpZ2VyLCBnZWlnZXJAZGViaWFuLm9yZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJSTUU5NjUyLzM2IFwiSGFtbWVyZmFsbFwiIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKyNpZmRlZiBERUJVRworI2RlZmluZSBEQkcoeCkgcHJpbnRrKCJSTUVfREVCVUc6Iik7eAorI2RlZmluZSBDT01NKHgpIHByaW50aygiUk1FX0NPTU06ICIgeCAiXG4iKTsKKyNlbHNlCisjZGVmaW5lIERCRyh4KSB3aGlsZSAoMCkge30KKyNkZWZpbmUgQ09NTSh4KQorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgICAgICAgICAgICAgICAgICAgICBQcmVwb3JjZXNzb3IgTWFjcm9zIGFuZCBEZWZpbml0aW9ucworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBSTUU5Nnh4X01BR0lDIDB4NjQ3MworCisvKiBSZWdpc3RlcnMtU3BhY2UgaW4gb2Zmc2V0cyBmcm9tIGJhc2UgYWRkcmVzcyB3aXRoIDE2TUJ5dGUgc2l6ZSAqLworCisjZGVmaW5lIFJNRTk2eHhfSU9fRVhURU5UICAgICAxNmwqMTAyNGwqMTAyNGwKKyNkZWZpbmUgUk1FOTZ4eF9DSEFOTkVMU19QRVJfQ0FSRCAyNgorCisvKiAgICAgICAgICAgICAgICAgIFdyaXRlIC0gUmVnaXN0ZXIgKi8KKworLyogMCw0LDgsMTIsMTYsMjAsMjQsMjggLi4uIGhhcmR3YXJlIGluaXQgKGVyYXNpbmcgZmlmby1wb2ludGVyIGludGVybikgKi8KKyNkZWZpbmUgUk1FOTZ4eF9udW1fb2ZfaW5pdF9yZWdzICAgOAorCisjZGVmaW5lIFJNRTk2eHhfaW5pdF9idWZmZXIgICAgICAgKDAvNCkKKyNkZWZpbmUgUk1FOTZ4eF9wbGF5X2J1ZmZlciAgICAgICAoMzIvNCkgIC8qIHBvaW50ZXIgdG8gMjZ4NjRrQml0IFJBTSBmcm9tIG1haW5ib2FyZCAqLworI2RlZmluZSBSTUU5Nnh4X3JlY19idWZmZXIgICAgICAgICgzNi80KSAgLyogcG9pbnRlciB0byAyNng2NGtCaXQgUkFNIGZyb20gbWFpbmJvYXJkICovCisjZGVmaW5lIFJNRTk2eHhfY29udHJvbF9yZWdpc3RlciAgKDY0LzQpICAvKiBleGFjdCBtZWFuaW5nIHNlZSBiZWxvdyAqLworI2RlZmluZSBSTUU5Nnh4X2lycV9jbGVhciAgICAgICAgICg5Ni80KSAgLyogaXJxIGFja25vd2xlZGdlICovCisjZGVmaW5lIFJNRTk2eHhfdGltZV9jb2RlICAgICAgICAgKDEwMC80KSAvKiBpZiB1c2VkIHdpdGggYWxlc2lzIGFkYXQgKi8KKyNkZWZpbmUgUk1FOTZ4eF90aHJ1X2Jhc2UgICAgICAgICAoMTI4LzQpIC8qIDEzMi4uLjIyOCBUaHJ1IGZvciAyNiBjaGFubmVscyAqLworI2RlZmluZSBSTUU5Nnh4X3RocnVfY2hhbm5lbHMgICAgIFJNRTk2eHhfQ0hBTk5FTFNfUEVSX0NBUkQKKworLyogICAgICAgICAgICAgICAgICAgICBSZWFkIFJlZ2lzdGVyICovCisKKyNkZWZpbmUgUk1FOTZ4eF9zdGF0dXNfcmVnaXN0ZXIgICAgMCAgICAgLyogbWVhbmluZyBzZWUgYmVsb3cgKi8KKworCisKKy8qIFN0YXR1cyBSZWdpc3RlcjogKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2RlZmluZSBSTUU5Nnh4X0lSUSAgICAgICAgICAweDAwMDAwMDEgLyogSVJRIGlzIEhpZ2ggaWYgbm90IHJlc2V0IGJ5IFJNRXh4X2lycV9jbGVhciAqLworI2RlZmluZSBSTUU5Nnh4X2xvY2tfMiAgICAgICAweDAwMDAwMDIgLyogQURBVCAzLVBMTDogMT1sb2NrZWQsIDA9dW5sb2NrZWQgKi8KKyNkZWZpbmUgUk1FOTZ4eF9sb2NrXzEgICAgICAgMHgwMDAwMDA0IC8qIEFEQVQgMi1QTEw6IDE9bG9ja2VkLCAwPXVubG9ja2VkICovCisjZGVmaW5lIFJNRTk2eHhfbG9ja18wICAgICAgIDB4MDAwMDAwOCAvKiBBREFUIDEtUExMOiAxPWxvY2tlZCwgMD11bmxvY2tlZCAqLworCisjZGVmaW5lIFJNRTk2eHhfZnM0OCAgICAgICAgIDB4MDAwMDAxMCAvKiBzYW1wbGUgcmF0ZSAwIC4uLjQ0LjEvODguMiwgIDEgLi4uIDQ4Lzk2IEtoeiAqLworI2RlZmluZSBSTUU5Nnh4X3dzZWxfcmQgICAgICAweDAwMDAwMjAgLyogaWYgV29yZC1DbG9jayBpcyB1c2VkIGFuZCB2YWxpZCB0aGVuIDEgKi8KKyNkZWZpbmUgUk1FOTZ4eF9idWZfcG9zMSAgICAgMHgwMDAwMDQwIC8qIEJpdCA2Li4xNSA6IFBvc2l0aW9uIG9mIGJ1ZmZlci1wb2ludGVyIGluIDY0Qnl0ZXMtYmxvY2tzICovCisjZGVmaW5lIFJNRTk2eHhfYnVmX3BvczIgICAgIDB4MDAwMDA4MCAvKiByZXNvbHV0aW9uICsvLSAxIDY0Qnl0ZS9ibG9jayAoc2luY2UgNjRCeXRlcyBidXJzdHMpICovCisgCisjZGVmaW5lIFJNRTk2eHhfYnVmX3BvczMgICAgIDB4MDAwMDEwMCAvKiAxMCBiaXRzID0gMTAyNCB2YWx1ZXMgKi8KKyNkZWZpbmUgUk1FOTZ4eF9idWZfcG9zNCAgICAgMHgwMDAwMjAwIC8qIGlmIHdlIG1hc2sgb2ZmIHRoZSBmaXJzdCA2IGJpdHMsIHdlIGNhbiB0YWtlIHRoZSBzdGF0dXMgKi8KKyNkZWZpbmUgUk1FOTZ4eF9idWZfcG9zNSAgICAgMHgwMDAwNDAwIC8qIHJlZ2lzdGVyIGFzIHNhbXBsZSBjb3VudGVyIGluIHRoZSBoYXJkd2FyZSBidWZmZXIgKi8KKyNkZWZpbmUgUk1FOTZ4eF9idWZfcG9zNiAgICAgMHgwMDAwODAwIAorCisjZGVmaW5lIFJNRTk2eHhfYnVmX3BvczcgICAgIDB4MDAwMTAwMCAKKyNkZWZpbmUgUk1FOTZ4eF9idWZfcG9zOCAgICAgMHgwMDAyMDAwIAorI2RlZmluZSBSTUU5Nnh4X2J1Zl9wb3M5ICAgICAweDAwMDQwMDAKKyNkZWZpbmUgUk1FOTZ4eF9idWZfcG9zMTAgICAgMHgwMDA4MDAwIAorCisjZGVmaW5lIFJNRTk2eHhfc3luY18yICAgICAgIDB4MDAxMDAwMCAvKiBpZiBBREFULUlOMyBzeW5jZWQgdG8gc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJNRTk2eHhfc3luY18xICAgICAgIDB4MDAyMDAwMCAvKiBpZiBBREFULUlOMiBzeW5jZWQgdG8gc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJNRTk2eHhfc3luY18wICAgICAgIDB4MDA0MDAwMCAvKiBpZiBBREFULUlOMSBzeW5jZWQgdG8gc3lzdGVtIGNsb2NrICovCisjZGVmaW5lIFJNRTk2eHhfRFNfcmQgICAgICAgIDB4MDA4MDAwMCAvKiAxPURvdWJsZSBTcGVlZCwgMD1Ob3JtYWwgU3BlZWQgKi8KKworI2RlZmluZSBSTUU5Nnh4X3RjX2J1c3kgICAgICAweDAxMDAwMDAgLyogMT10aW1lLWNvZGUgY29weSBpbiBwcm9ncmVzcyAoOTYwbXMpICovCisjZGVmaW5lIFJNRTk2eHhfdGNfb3V0ICAgICAgIDB4MDIwMDAwMCAvKiB0aW1lLWNvZGUgb3V0IGJpdCAqLworI2RlZmluZSBSTUU5Nnh4X0ZfMCAgICAgICAgICAweDA0MDAwMDAgLyogIDAwMD02NGtIeiwgMTAwPTg4LjJrSHosIDAxMT05NmtIeiAgKi8KKyNkZWZpbmUgUk1FOTZ4eF9GXzEgICAgICAgICAgMHgwODAwMDAwIC8qICAxMTE9MzJrSHosIDExMD00NC4xa0h6LCAxMDE9NDhrSHosICovCisKKyNkZWZpbmUgUk1FOTZ4eF9GXzIgICAgICAgICAgMHgxMDAwMDAwIC8qICAwMDE9UmV2IDEuNSsgZXh0ZXJuYWwgQ3J5c3RhbCBDaGlwICovCisjZGVmaW5lIFJNRTk2eHhfRVJGICAgICAgICAgIDB4MjAwMDAwMCAvKiBFcnJvci1GbGFnIG9mIFNEUElGIFJlY2VpdmVyICgxPU5vIExvY2spKi8KKyNkZWZpbmUgUk1FOTZ4eF9idWZmZXJfaWQgICAgMHg0MDAwMDAwIC8qIHRvZ2dsZXMgYnkgZWFjaCBpbnRlcnJ1cHQgb24gcmVjL3BsYXkgKi8KKyNkZWZpbmUgUk1FOTZ4eF90Y192YWxpZCAgICAgMHg4MDAwMDAwIC8qIDEgPSBhIHNpZ25hbCBpcyBkZXRlY3RlZCBvbiB0aW1lLWNvZGUgaW5wdXQgKi8KKyNkZWZpbmUgUk1FOTZ4eF9TUERJRl9SRUFEICAweDEwMDAwMDAwIC8qIGJ5dGUgYXZhaWxhYmxlIGZyb20gUmV2IDEuNSsgU1BESUYgaW50ZXJmYWNlICovCisKKy8qIFN0YXR1cyBSZWdpc3RlciBGaWVsZHMgKi8KKworI2RlZmluZSBSTUU5Nnh4X2xvY2sgICAgICAgICAgICAoUk1FOTZ4eF9sb2NrXzB8Uk1FOTZ4eF9sb2NrXzF8Uk1FOTZ4eF9sb2NrXzIpCisjZGVmaW5lIFJNRTk2eHhfc3luYyAgICAgICAgICAgIChSTUU5Nnh4X3N5bmNfMHxSTUU5Nnh4X3N5bmNfMXxSTUU5Nnh4X3N5bmNfMikKKyNkZWZpbmUgUk1FOTZ4eF9GICAgICAgICAgICAgICAgKFJNRTk2eHhfRl8wfFJNRTk2eHhfRl8xfFJNRTk2eHhfRl8yKQorI2RlZmluZSBybWU5Nnh4X2RlY29kZV9zcGRpZl9yYXRlKHgpICgoeCk+PjIyKQorCisvKiBCaXQgNi4uMTUgOiBoL3cgYnVmZmVyIHBvaW50ZXIgKi8KKyNkZWZpbmUgUk1FOTZ4eF9idWZfcG9zICAgICAgICAgIDB4MDAwRkZDMCAKKy8qIEJpdHMgMzEsMzAsMjkgYXJlIGJpdHMgNSw0LDMgb2YgaC93IHBvaW50ZXIgcG9zaXRpb24gb24gbGF0ZXIKKyAgIFJldiBHIEVFUFJPTVMgYW5kIFJldiAxLjUgY2FyZHMgb3IgbGF0ZXIuCisqLyAKKyNkZWZpbmUgUk1FOTZ4eF9SRVYxNV9idWZfcG9zKHgpICgoKCh4KSYweEUwMDAwMDAwKT4+MjYpfCgoeCkmUk1FOTZ4eF9idWZfcG9zKSkKKworCisvKiBDb250cm9sLVJlZ2lzdGVyOiAqLwkJCSAgICAKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjZGVmaW5lIFJNRTk2eHhfc3RhcnRfYml0CTB4MDAwMSAvKiBzdGFydCByZWNvcmQvcGxheSAqLworI2RlZmluZSBSTUU5Nnh4X2xhdGVuY3kwCTB4MDAwMiAvKiBCdWZmZXIgc2l6ZSAvIGxhdGVuY3kgKi8KKyNkZWZpbmUgUk1FOTZ4eF9sYXRlbmN5MQkweDAwMDQgLyogICBidWZmZXJzaXplID0gNTEyQnl0ZXMgKiAyXm4gKi8KKyNkZWZpbmUgUk1FOTZ4eF9sYXRlbmN5MgkweDAwMDggLyogICAwPTY0c2FtcGxlcyAuLi4gNz04MTkyc2FtcGxlcyAqLworCisjZGVmaW5lIFJNRTk2eHhfTWFzdGVyCQkweDAwMTAgLyogQ2xvY2sgTW9kZSAxPU1hc3RlciwgMD1TbGF2ZS9BdXRvICovCisjZGVmaW5lIFJNRTk2eHhfSUUJCTB4MDAyMCAvKiBJbnRlcnVwdCBFbmFibGUgKi8KKyNkZWZpbmUgUk1FOTZ4eF9mcmVxCQkweDAwNDAgLyogc2FtcGxlcmF0ZSAwPTQ0LjEvODguMiwgMT00OC85NiBrSHoqLworI2RlZmluZSBSTUU5Nnh4X2ZyZXExCQkweDAwODAgLyogc2FtcGxlcmF0ZSAwPTMyIGtIeiwgMT1vdGhlciByYXRlcyA/Pz8gKGZyb20gQUxTQSwgYnV0IG1heSBiZSB3cm9uZykgKi8KKyNkZWZpbmUgUk1FOTZ4eF9EUyAgICAgICAgICAgICAgMHgwMTAwIC8qIGRvdWJsZSBzcGVlZCAwPTQ0LjEvNDgsIDE9ODguMi85NiBLaHogKi8KKyNkZWZpbmUgUk1FOTZ4eF9QUk8JCTB4MDIwMCAvKiBTUERJRi1PVVQgMD1jb25zdW1lciwgMT1wcm9mZXNzaW9uYWwgKi8KKyNkZWZpbmUgUk1FOTZ4eF9FTVAJCTB4MDQwMCAvKiBTUERJRi1PVVQgZW1waGFzaXMgMD1vZmYsIDE9b24gKi8KKyNkZWZpbmUgUk1FOTZ4eF9Eb2xieQkJMHgwODAwIC8qIFNQRElGLU9VVCBub24tYXVkaW8gYml0IDE9c2V0LCAwPXVuc2V0ICovCisKKyNkZWZpbmUgUk1FOTZ4eF9vcHRfb3V0CSAgICAgICAgMHgxMDAwIC8qIHVzZSAxc3Qgb3B0aWNhbCBPVVQgYXMgU1BESUY6IDE9eWVzLCAwPW5vICovCisjZGVmaW5lIFJNRTk2eHhfd3NlbCAgICAgICAgICAgIDB4MjAwMCAvKiB1c2UgV29yZGNsb2NrIGFzIHN5bmMgKG92ZXJ3cml0ZXMgbWFzdGVyKSAqLworI2RlZmluZSBSTUU5Nnh4X2lucF8wICAgICAgICAgICAweDQwMDAgLyogU1BESUYtSU4gMDA9b3B0aWNhbCAoQURBVDEpLCAqLworI2RlZmluZSBSTUU5Nnh4X2lucF8xICAgICAgICAgICAweDgwMDAgLyogMDE9Y29heGlhbCAoQ2luY2gpLCAxMD1pbnRlcm5hbCBDRFJPTSAqLworCisjZGVmaW5lIFJNRTk2eHhfU3luY1JlZjAgICAgICAgMHgxMDAwMCAvKiBwcmVmZXJyZWQgc3luYy1zb3VyY2UgaW4gYXV0b3N5bmMgKi8KKyNkZWZpbmUgUk1FOTZ4eF9TeW5jUmVmMSAgICAgICAweDIwMDAwIC8qIDAwPUFEQVQxLCAwMT1BREFUMiwgMTA9QURBVDMsIDExPVNQRElGICovCisKKyNkZWZpbmUgUk1FOTZ4eF9TUERJRl9SRVNFVCAgICAoMTw8MTgpIC8qIFJldiAxLjUrOiBoL3cgU1BESUYgcmVjZWl2ZXIgKi8KKyNkZWZpbmUgUk1FOTZ4eF9TUERJRl9TRUxFQ1QgICAoMTw8MTkpCisjZGVmaW5lIFJNRTk2eHhfU1BESUZfQ0xPQ0sgICAgKDE8PDIwKQorI2RlZmluZSBSTUU5Nnh4X1NQRElGX1dSSVRFICAgICgxPDwyMSkKKyNkZWZpbmUgUk1FOTZ4eF9BREFUMV9JTlRFUk5BTCAoMTw8MjIpIC8qIFJldiAxLjUrOiBpZiBzZXQsIGludGVybmFsIENEIGNvbm5lY3RvciBjYXJyaWVzIEFEQVQgKi8KKworCisjZGVmaW5lIFJNRTk2eHhfY3RybF9pbml0ICAgICAgICAgICAgKFJNRTk2eHhfbGF0ZW5jeTAgfFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSTUU5Nnh4X01hc3RlciB8XAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJNRTk2eHhfaW5wXzEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKworCisvKiBDb250cm9sIHJlZ2lzdGVyIGZpZWxkcyBhbmQgc2hvcnRjdXRzICovCisKKyNkZWZpbmUgUk1FOTZ4eF9sYXRlbmN5IChSTUU5Nnh4X2xhdGVuY3kwfFJNRTk2eHhfbGF0ZW5jeTF8Uk1FOTZ4eF9sYXRlbmN5MikKKyNkZWZpbmUgUk1FOTZ4eF9pbnAgICAgICAgICAoUk1FOTZ4eF9pbnBfMHxSTUU5Nnh4X2lucF8xKQorI2RlZmluZSBSTUU5Nnh4X1N5bmNSZWYgICAgKFJNRTk2eHhfU3luY1JlZjB8Uk1FOTZ4eF9TeW5jUmVmMSkKKyNkZWZpbmUgUk1FOTZ4eF9taXhlcl9hbGxvd2VkIChSTUU5Nnh4X01hc3RlcnxSTUU5Nnh4X1BST3xSTUU5Nnh4X0VNUHxSTUU5Nnh4X0RvbGJ5fFJNRTk2eHhfb3B0X291dHxSTUU5Nnh4X3dzZWx8Uk1FOTZ4eF9pbnB8Uk1FOTZ4eF9TeW5jUmVmfFJNRTk2eHhfQURBVDFfSU5URVJOQUwpCisKKy8qIGxhdGVuY3kgPSA1MTJCeXRlcyAqIDJebiwgd2hlcmUgbiBpcyBtYWRlIGZyb20gQml0MyAuLi4gQml0MSAgKD8/PyBIUDIwMDIwMjAxKSAqLworCisjZGVmaW5lIFJNRTk2eHhfU0VUX0xBVEVOQ1koeCkgICAoKCh4KSYweDcpPDwxKQorI2RlZmluZSBSTUU5Nnh4X0dFVF9MQVRFTkNZKHgpICAgKCgoeCk+PjEpJjB4NykKKyNkZWZpbmUgUk1FOTZ4eF9TRVRfaW5wKHgpICgoKHgpJjB4Myk8PDE0KQorI2RlZmluZSBSTUU5Nnh4X0dFVF9pbnAoeCkgICAoKCh4KT4+MTQpJjB4MykKKyNkZWZpbmUgUk1FOTZ4eF9TRVRfU3luY1JlZih4KSAoKCh4KSYweDMpPDwxNykKKyNkZWZpbmUgUk1FOTZ4eF9HRVRfU3luY1JlZih4KSAgICgoKHgpPj4xNykmMHgzKQorCisKKy8qIGJ1ZmZlciBzaXplcyAqLworI2RlZmluZSBSTUU5Nnh4X0JZVEVTX1BFUl9TQU1QTEUgIDQgLyogc2l6ZW9mKHUzMikgKi8KKyNkZWZpbmUgUk1FXzE2SyAxNioxMDI0CisKKyNkZWZpbmUgUk1FOTZ4eF9ETUFfTUFYX1NBTVBMRVMgIChSTUVfMTZLKQorI2RlZmluZSBSTUU5Nnh4X0RNQV9NQVhfU0laRSAgICAgKFJNRV8xNksgKiBSTUU5Nnh4X0JZVEVTX1BFUl9TQU1QTEUpCisjZGVmaW5lIFJNRTk2eHhfRE1BX01BWF9TSVpFX0FMTCAoUk1FOTZ4eF9ETUFfTUFYX1NJWkUgKiBSTUU5Nnh4X0NIQU5ORUxTX1BFUl9DQVJEKQorCisjZGVmaW5lIFJNRTk2eHhfTlVNX09GX0ZSQUdNRU5UUyAgICAgMgorI2RlZmluZSBSTUU5Nnh4X0ZSQUdNRU5UX01BWF9TSVpFICAgIChSTUU5Nnh4X0RNQV9NQVhfU0laRS8yKQorI2RlZmluZSBSTUU5Nnh4X0ZSQUdNRU5UX01BWF9TQU1QTEVTIChSTUU5Nnh4X0RNQV9NQVhfU0FNUExFUy8yKQorI2RlZmluZSBSTUU5Nnh4X01BWF9MQVRFTkNZICAgICAgIDcgICAvKiAxNmsgc2FtcGxlcyAqLworCisKKyNkZWZpbmUgUk1FOTZ4eF9NQVhfREVWUyA0IC8qIHdlIHByb3ZpZGUgc29tZSBPU1Mgc3RlcmVvZGV2cyAqLworI2RlZmluZSBSTUU5Nnh4X01BU0tfREVWUyAweDMgLyogUk1FOTZ4eF9NQVhfREVWUy0xICovCisKKyNkZWZpbmUgUk1FX01FU1MgInJtZTk2eHg6IgorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisgICAgICAgICAgICAgICAgICBUeXBlcywgc3RydWN0IGFuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9tYWdpY1tdID0gS0VSTl9DUklUIFJNRV9NRVNTIiBpbnZhbGlkIG1hZ2ljIHZhbHVlXG4iOworCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICghKHMpIHx8IChzKS0+bWFnaWMgIT0gUk1FOTZ4eF9NQUdJQykgeyBcCisJCXByaW50ayhpbnZhbGlkX21hZ2ljKTsgICAgICAgICAgICBcCisJCXJldHVybiAtRU5YSU87ICAgICAgICAgICAgICAgICAgICBcCisJfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcm1lOTZ4eF9hdWRpb19mb3BzOworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcm1lOTZ4eF9taXhlcl9mb3BzOworc3RhdGljIGludCBudW1jYXJkczsKKwordHlwZWRlZiBpbnQzMl90IHJhd19zYW1wbGVfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX3JtZTk2eHhfaW5mbyB7CisKKwkvKiBoYXJkd2FyZSBzZXR0aW5ncyAqLworCWludCBtYWdpYzsKKwlzdHJ1Y3QgcGNpX2RldiAqIHBjaWRldjsgLyogcGNpX2RldiBzdHJ1Y3R1cmUgKi8KKwl1bnNpZ25lZCBsb25nIF9faW9tZW0gKmlvYmFzZTsJCisJdW5zaWduZWQgaW50IGlycTsKKworCS8qIGxpc3Qgb2Ygcm1lOTZ4eCBkZXZpY2VzICovCisJc3RydWN0IGxpc3RfaGVhZCBkZXZzOworCisJc3BpbmxvY2tfdCBsb2NrOworCisJdTMyICpyZWNidWY7ICAgICAgICAgICAgIC8qIG1lbW9yeSBmb3IgcmVjIGJ1ZmZlciAqLworCXUzMiAqcGxheWJ1ZjsgICAgICAgICAgICAvKiBtZW1vcnkgZm9yIHBsYXkgYnVmZmVyICovCisKKwl1MzIgY29udHJvbF9yZWdpc3RlcjsKKworCXUzMiB0aHJ1X2JpdHM7IC8qIHRocnUgMT1vbiwgMD1vZmYgY2hhbm5lbCAxPUJpdDEuLi4gY2hhbm5lbCAyNj0gQml0MjYgKi8KKworCWludCBod19yZXY7ICAgICAgICAgICAgIC8qIGgvdyByZXYgKiAxMCAoaS5lLiAxLjUgaGFzIGh3X3JldiA9IDE1KSAqLworCWNoYXIgKmNhcmRfbmFtZTsJLyogaGFtbWVyZmFsbCBvciBoYW1tZXJmYWxsIGxpZ2h0IG5hbWVzICovCisKKwlpbnQgb3Blbl9jb3VudDsgICAgICAgICAvKiB1bnVzZWQgPz8/ICAgSFAyMDAyMDIwMSAqLworCisJaW50IHJhdGU7CisJaW50IGxhdGVuY3k7CisJdW5zaWduZWQgaW50IGZyYWdzaXplOworCWludCBzdGFydGVkOworCisJaW50IGh3cHRyOyAvKiBjYW4gYmUgbmVnYXRpdiBiZWNhdXNlIG9mIHBjaSBidXJzdCBvZmZzZXQgICovCisJdW5zaWduZWQgaW50IGh3YnVmaWQ7ICAvKiBzZXQgYnkgaW50ZXJydXB0LCBidWZmZXIgd2hpY2ggaXMgd3JpdHRlbi9yZWFkIG5vdyAqLworCQorCXN0cnVjdCBkbWFidWYgeworCisJCXVuc2lnbmVkIGludCBmb3JtYXQ7CisJCWludCBmb3JtYXRzaGlmdDsKKwkJaW50IGluY2hhbm5lbHM7ICAgICAgIC8qIG51bWJlciBvZiBjaGFubmVscyBmb3IgZGV2aWNlICovCisJCWludCBvdXRjaGFubmVsczsgICAgICAgLyogbnVtYmVyIG9mIGNoYW5uZWxzIGZvciBkZXZpY2UgKi8KKwkJaW50IG1vbm87IC8qIGlmIHRydWUsIHdlIHBsYXkgbW9ubyBvbiAyIGNoYW5uZWxzICovCisJCWludCBpbm9mZnNldDsgLyogd2hpY2ggY2hhbm5lbCBpcyBjb25zaWRlcmVkIHRoZSBmaXJzdCBvbmUgKi8KKyAgICAgICAgIAlpbnQgb3V0b2Zmc2V0OworCQkKKwkJLyogc3RhdGUgKi8KKwkJaW50IG9wZW5lZDsgICAgICAgICAgICAgICAvKiBvcGVuKCkgbWFkZSAqLworCQlpbnQgc3RhcnRlZDsgICAgICAgICAgICAgIC8qIGZpcnN0IHdyaXRlL3JlYWQgKi8KKwkJaW50IG1tYXBwZWQ7ICAgICAgICAgICAgICAvKiBtbWFwICovCisJCWludCBvcGVuX21vZGU7CisKKwkJc3RydWN0IF9ybWU5Nnh4X2luZm8gKnM7ICAKKworCQkvKiBwb2ludGVyIHRvIHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gYnVmZmVyICovCisJCXVuc2lnbmVkIHJlYWRwdHI7ICAgICAgICAgIAorCQl1bnNpZ25lZCB3cml0ZXB0cjsgICAgICAgICAgCisKKwkJdW5zaWduZWQgZXJyb3I7IC8qIG92ZXIvdW5kZXJydW5zIGNsZWFyZWQgb24gc3luYyBhZ2FpbiAqLworCisJCS8qIHdhaXRpbmcgYW5kIGxvY2tpbmcgKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwkJc3RydWN0IHNlbWFwaG9yZSAgb3Blbl9zZW07CisJCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdDsKKworCX0gZG1hW1JNRTk2eHhfTUFYX0RFVlNdOyAKKworCWludCBkc3BudW1bUk1FOTZ4eF9NQVhfREVWU107ICAvKiByZWdpc3RlciB3aXRoIHNvdW5kIHN1YnN5c3RlbSAqLyAKKwlpbnQgbWl4ZXI7ICAvKiByZWdpc3RlciB3aXRoIHNvdW5kIHN1YnN5c3RlbSAqLyAKK30gcm1lOTZ4eF9pbmZvOworCisKKy8qIGZpZGRsaW5nIHdpdGggdGhlIGNhcmQgKGZpcnN0IGxldmVsIGhhcmR3YXJlIGNvbnRyb2wpICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBybWU5Nnh4X3NldF9jdHJsKHJtZTk2eHhfaW5mbyogcyxpbnQgbWFzaykKK3sKKworCXMtPmNvbnRyb2xfcmVnaXN0ZXJ8PW1hc2s7CisJd3JpdGVsKHMtPmNvbnRyb2xfcmVnaXN0ZXIscy0+aW9iYXNlICsgUk1FOTZ4eF9jb250cm9sX3JlZ2lzdGVyKTsKKworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcm1lOTZ4eF91bnNldF9jdHJsKHJtZTk2eHhfaW5mbyogcyxpbnQgbWFzaykKK3sKKworCXMtPmNvbnRyb2xfcmVnaXN0ZXImPSh+bWFzayk7CisJd3JpdGVsKHMtPmNvbnRyb2xfcmVnaXN0ZXIscy0+aW9iYXNlICsgUk1FOTZ4eF9jb250cm9sX3JlZ2lzdGVyKTsKKworfQorCitzdGF0aWMgaW5saW5lIGludCBybWU5Nnh4X2dldF9zYW1wbGVfcmF0ZV9zdGF0dXMocm1lOTZ4eF9pbmZvKiBzKQoreworCWludCB2YWw7CisJdTMyIHN0YXR1czsKKwlzdGF0dXMgPSByZWFkbChzLT5pb2Jhc2UgKyBSTUU5Nnh4X3N0YXR1c19yZWdpc3Rlcik7CisJdmFsID0gKHN0YXR1cyAmIFJNRTk2eHhfZnM0OCkgPyA0ODAwMCA6IDQ0MTAwOworCWlmIChzdGF0dXMgJiBSTUU5Nnh4X0RTX3JkKQorCQl2YWwgKj0gMjsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW5saW5lIGludCBybWU5Nnh4X2dldF9zYW1wbGVfcmF0ZV9jdHJsKHJtZTk2eHhfaW5mbyogcykKK3sKKwlpbnQgdmFsOworCXZhbCA9IChzLT5jb250cm9sX3JlZ2lzdGVyICYgUk1FOTZ4eF9mcmVxKSA/IDQ4MDAwIDogNDQxMDA7CisJaWYgKHMtPmNvbnRyb2xfcmVnaXN0ZXIgJiBSTUU5Nnh4X0RTKQorCQl2YWwgKj0gMjsKKwlyZXR1cm4gdmFsOworfQorCisKKy8qIGNvZGUgZnJvbSBBTFNBIGNhcmQtcm1lOTY1Mi5jIGZvciByZXYgMS41IFNQRElGIHJlY2VpdmVyICAgSFAgMjAwMjAyMDEgKi8KKworc3RhdGljIHZvaWQgcm1lOTZ4eF9zcGRpZl9zZXRfYml0IChybWU5Nnh4X2luZm8qIHMsIGludCBtYXNrLCBpbnQgb25vZmYpCit7CisJaWYgKG9ub2ZmKSAKKwkJcy0+Y29udHJvbF9yZWdpc3RlciB8PSBtYXNrOworCWVsc2UgCisJCXMtPmNvbnRyb2xfcmVnaXN0ZXIgJj0gfm1hc2s7CisJCQorCXdyaXRlbChzLT5jb250cm9sX3JlZ2lzdGVyLHMtPmlvYmFzZSArIFJNRTk2eHhfY29udHJvbF9yZWdpc3Rlcik7Cit9CisKK3N0YXRpYyB2b2lkIHJtZTk2eHhfc3BkaWZfd3JpdGVfYnl0ZSAocm1lOTZ4eF9pbmZvKiBzLCBjb25zdCBpbnQgdmFsKQoreworCWxvbmcgbWFzazsKKwlsb25nIGk7CisKKwlmb3IgKGkgPSAwLCBtYXNrID0gMHg4MDsgaSA8IDg7IGkrKywgbWFzayA+Pj0gMSkgeworCQlpZiAodmFsICYgbWFzaykKKwkJCXJtZTk2eHhfc3BkaWZfc2V0X2JpdCAocywgUk1FOTZ4eF9TUERJRl9XUklURSwgMSk7CisJCWVsc2UgCisJCQlybWU5Nnh4X3NwZGlmX3NldF9iaXQgKHMsIFJNRTk2eHhfU1BESUZfV1JJVEUsIDApOworCisJCXJtZTk2eHhfc3BkaWZfc2V0X2JpdCAocywgUk1FOTZ4eF9TUERJRl9DTE9DSywgMSk7CisJCXJtZTk2eHhfc3BkaWZfc2V0X2JpdCAocywgUk1FOTZ4eF9TUERJRl9DTE9DSywgMCk7CisJfQorfQorCitzdGF0aWMgaW50IHJtZTk2eHhfc3BkaWZfcmVhZF9ieXRlIChybWU5Nnh4X2luZm8qIHMpCit7CisJbG9uZyBtYXNrOworCWxvbmcgdmFsOworCWxvbmcgaTsKKworCXZhbCA9IDA7CisKKwlmb3IgKGkgPSAwLCBtYXNrID0gMHg4MDsgIGkgPCA4OyBpKyssIG1hc2sgPj49IDEpIHsKKwkJcm1lOTZ4eF9zcGRpZl9zZXRfYml0IChzLCBSTUU5Nnh4X1NQRElGX0NMT0NLLCAxKTsKKwkJaWYgKHJlYWRsKHMtPmlvYmFzZSArIFJNRTk2eHhfc3RhdHVzX3JlZ2lzdGVyKSAmIFJNRTk2eHhfU1BESUZfUkVBRCkKKwkJCXZhbCB8PSBtYXNrOworCQlybWU5Nnh4X3NwZGlmX3NldF9iaXQgKHMsIFJNRTk2eHhfU1BESUZfQ0xPQ0ssIDApOworCX0KKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHJtZTk2eHhfd3JpdGVfc3BkaWZfY29kZWMgKHJtZTk2eHhfaW5mbyogcywgY29uc3QgaW50IGFkZHJlc3MsIGNvbnN0IGludCBkYXRhKQoreworCXJtZTk2eHhfc3BkaWZfc2V0X2JpdCAocywgUk1FOTZ4eF9TUERJRl9TRUxFQ1QsIDEpOworCXJtZTk2eHhfc3BkaWZfd3JpdGVfYnl0ZSAocywgMHgyMCk7CisJcm1lOTZ4eF9zcGRpZl93cml0ZV9ieXRlIChzLCBhZGRyZXNzKTsKKwlybWU5Nnh4X3NwZGlmX3dyaXRlX2J5dGUgKHMsIGRhdGEpOworCXJtZTk2eHhfc3BkaWZfc2V0X2JpdCAocywgUk1FOTZ4eF9TUERJRl9TRUxFQ1QsIDApOworfQorCisKK3N0YXRpYyBpbnQgcm1lOTZ4eF9zcGRpZl9yZWFkX2NvZGVjIChybWU5Nnh4X2luZm8qIHMsIGNvbnN0IGludCBhZGRyZXNzKQoreworCWludCByZXQ7CisKKwlybWU5Nnh4X3NwZGlmX3NldF9iaXQgKHMsIFJNRTk2eHhfU1BESUZfU0VMRUNULCAxKTsKKwlybWU5Nnh4X3NwZGlmX3dyaXRlX2J5dGUgKHMsIDB4MjApOworCXJtZTk2eHhfc3BkaWZfd3JpdGVfYnl0ZSAocywgYWRkcmVzcyk7CisJcm1lOTZ4eF9zcGRpZl9zZXRfYml0IChzLCBSTUU5Nnh4X1NQRElGX1NFTEVDVCwgMCk7CisJcm1lOTZ4eF9zcGRpZl9zZXRfYml0IChzLCBSTUU5Nnh4X1NQRElGX1NFTEVDVCwgMSk7CisKKwlybWU5Nnh4X3NwZGlmX3dyaXRlX2J5dGUgKHMsIDB4MjEpOworCXJldCA9IHJtZTk2eHhfc3BkaWZfcmVhZF9ieXRlIChzKTsKKwlybWU5Nnh4X3NwZGlmX3NldF9iaXQgKHMsIFJNRTk2eHhfU1BESUZfU0VMRUNULCAwKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJtZTk2eHhfaW5pdGlhbGl6ZV9zcGRpZl9yZWNlaXZlciAocm1lOTZ4eF9pbmZvKiBzKQoreworCS8qIFhYWCB3aGF0IHVuc2V0cyB0aGlzID8gKi8KKwkvKiBubyBpZGVhID8/PyAgIEhQIDIwMDIwMjAxICovCisKKwlzLT5jb250cm9sX3JlZ2lzdGVyIHw9IFJNRTk2eHhfU1BESUZfUkVTRVQ7CisKKwlybWU5Nnh4X3dyaXRlX3NwZGlmX2NvZGVjIChzLCA0LCAweDQwKTsKKwlybWU5Nnh4X3dyaXRlX3NwZGlmX2NvZGVjIChzLCAxNywgMHgxMyk7CisJcm1lOTZ4eF93cml0ZV9zcGRpZl9jb2RlYyAocywgNiwgMHgwMik7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJtZTk2eHhfc3BkaWZfc2FtcGxlX3JhdGUgKHJtZTk2eHhfaW5mbyAqcywgaW50ICpzcGRpZnJhdGUpCit7CisJdW5zaWduZWQgaW50IHJhdGVfYml0czsKKworCSpzcGRpZnJhdGUgPSAweDE7CisJaWYgKHJlYWRsKHMtPmlvYmFzZSArIFJNRTk2eHhfc3RhdHVzX3JlZ2lzdGVyKSAmIFJNRTk2eHhfRVJGKSB7CisJCXJldHVybiAtMTsJLyogZXJyb3IgY29uZGl0aW9uICovCisJfQorCQorCWlmIChzLT5od19yZXYgPT0gMTUpIHsKKworCQlpbnQgeCwgeSwgcmV0OworCQkKKwkJeCA9IHJtZTk2eHhfc3BkaWZfcmVhZF9jb2RlYyAocywgMzApOworCisJCWlmICh4ICE9IDApIAorCQkJeSA9IDQ4MDAwICogNjQgLyB4OworCQllbHNlCisJCQl5ID0gMDsKKworCQlpZiAgICAgICh5ID4gMzA0MDAgJiYgeSA8IDMzNjAwKSAge3JldCA9IDMyMDAwOyAqc3BkaWZyYXRlID0gMHg3O30KKwkJZWxzZSBpZiAoeSA+IDQxOTAwICYmIHkgPCA0NjAwMCkgIHtyZXQgPSA0NDEwMDsgKnNwZGlmcmF0ZSA9IDB4Njt9CisJCWVsc2UgaWYgKHkgPiA0NjAwMCAmJiB5IDwgNTA0MDApICB7cmV0ID0gNDgwMDA7ICpzcGRpZnJhdGUgPSAweDU7fQorCQllbHNlIGlmICh5ID4gNjA4MDAgJiYgeSA8IDY3MjAwKSAge3JldCA9IDY0MDAwOyAqc3BkaWZyYXRlID0gMHgwO30KKwkJZWxzZSBpZiAoeSA+IDgzNzAwICYmIHkgPCA5MjAwMCkgIHtyZXQgPSA4ODIwMDsgKnNwZGlmcmF0ZSA9IDB4NDt9CisJCWVsc2UgaWYgKHkgPiA5MjAwMCAmJiB5IDwgMTAwMDAwKSB7cmV0ID0gOTYwMDA7ICpzcGRpZnJhdGUgPSAweDM7fQorCQllbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3JldCA9IDA7ICpzcGRpZnJhdGUgPSAweDE7fQorCQlyZXR1cm4gcmV0OworCX0KKworCXJhdGVfYml0cyA9IHJlYWRsKHMtPmlvYmFzZSArIFJNRTk2eHhfc3RhdHVzX3JlZ2lzdGVyKSAmIFJNRTk2eHhfRjsKKworCXN3aXRjaCAoKnNwZGlmcmF0ZSA9IHJtZTk2eHhfZGVjb2RlX3NwZGlmX3JhdGUocmF0ZV9iaXRzKSkgeworCWNhc2UgMHg3OgorCQlyZXR1cm4gMzIwMDA7CisJCWJyZWFrOworCisJY2FzZSAweDY6CisJCXJldHVybiA0NDEwMDsKKwkJYnJlYWs7CisKKwljYXNlIDB4NToKKwkJcmV0dXJuIDQ4MDAwOworCQlicmVhazsKKworCWNhc2UgMHg0OgorCQlyZXR1cm4gODgyMDA7CisJCWJyZWFrOworCisJY2FzZSAweDM6CisJCXJldHVybiA5NjAwMDsKKwkJYnJlYWs7CisKKwljYXNlIDB4MDoKKwkJcmV0dXJuIDY0MDAwOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIHdhcyBhbiBBTFNBIHdhcm5pbmcgLi4uCisJCSAgc25kX3ByaW50aygiJXM6IHVua25vd24gUy9QRElGIGlucHV0IHJhdGUgKGJpdHMgPSAweCV4KVxuIiwKKwkJICBzLT5jYXJkX25hbWUsIHJhdGVfYml0cyk7CisJCSovCisJCXJldHVybiAwOworCQlicmVhazsKKwl9Cit9CisKKy8qIGVuZCBvZiBjb2RlIGZyb20gQUxTQSBjYXJkLXJtZTk2NTIuYyAqLworCisKKworLyogdGhlIGh3YnVmIGluIHRoZSBzdGF0dXMgcmVnaXN0ZXIgc2VlbXMgdG8gaGF2ZSBzb21lIGppdHRlciwgdG8gZ2V0IHJpZCBvZgorICAgaXQsIHdlIGZpcnN0IG9ubHkgbGV0IHRoZSBudW1iZXJzIGdyb3csIHRvIGJlIG9uIHRoZSBzZWN1cmUgc2lkZSB3ZSAKKyAgIHN1YnRyYWN0IGEgY2VydGFpbiBhbW91bnQgUk1FOTZ4eF9CVVJTVEJZVEVTIGZyb20gdGhlIHJlc3VsdGluZyBudW1iZXIgKi8KKworLyogdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGhhcmR3YXJlIHBvaW50ZXIgaW4gYnl0ZXMgKi8KKyNkZWZpbmUgUk1FOTZ4eF9CVVJTVEJZVEVTIC02NCAgLyogYnl0ZXMgYnkgd2hpY2ggaHdwdHIgY291bGQgYmUgb2ZmICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHJtZTk2eHhfZ2V0aHdwdHIocm1lOTZ4eF9pbmZvKiBzLGludCBleGFjdCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlmIChleGFjdCkgeworCQl1bnNpZ25lZCBpbnQgaHdwOworLyogdGhlIGh3cHRyIHNlZW1zIHRvIGJlIHJhdGhlciB1bnJlbGlhYmxlIDooLCBzbyB3ZSBkb24ndCB1c2UgaXQgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssZmxhZ3MpOworCQkKKwkJaHdwICA9IHJlYWRsKHMtPmlvYmFzZSArIFJNRTk2eHhfc3RhdHVzX3JlZ2lzdGVyKSAmIDB4ZmZjMDsKKwkJcy0+aHdwdHIgPSAoaHdwIDwgcy0+aHdwdHIpID8gcy0+aHdwdHIgOiBod3A7CisvLwkJcy0+aHdwdHIgPSBod3A7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jayxmbGFncyk7CisJCXJldHVybiAocy0+aHdwdHIrUk1FOTZ4eF9CVVJTVEJZVEVTKSAmICgocy0+ZnJhZ3NpemU8PDEpLTEpOworCX0KKwlyZXR1cm4gKHMtPmh3YnVmaWQgPyBzLT5mcmFnc2l6ZSA6IDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcm1lOTZ4eF9zZXRsYXRlbmN5KHJtZTk2eHhfaW5mbyogcyxpbnQgbCkKK3sKKwlzLT5sYXRlbmN5ID0gbDsKKwlzLT5mcmFnc2l6ZSA9IDE8PCg4K2wpOworCXJtZTk2eHhfdW5zZXRfY3RybChzLFJNRTk2eHhfbGF0ZW5jeSk7CisJcm1lOTZ4eF9zZXRfY3RybChzLFJNRTk2eHhfU0VUX0xBVEVOQ1kobCkpOwkKK30KKworCitzdGF0aWMgdm9pZCBybWU5Nnh4X2NsZWFyYnVmcyhzdHJ1Y3QgZG1hYnVmKiBkbWEpCit7CisJaW50IGksajsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogY2xlYXIgZG1hYnVmcyAqLworCWZvcihpPTA7aTxkZXZpY2VzO2krKykgeworCQlmb3IgKGo9MDtqPGRtYS0+b3V0Y2hhbm5lbHMgKyBkbWEtPm1vbm87aisrKQorCQkJbWVtc2V0KCZkbWEtPnMtPnBsYXlidWZbKGRtYS0+b3V0b2Zmc2V0ICsgaikqUk1FOTZ4eF9ETUFfTUFYX1NBTVBMRVNdLCAKKwkJCSAgICAgICAwLCBSTUU5Nnh4X0RNQV9NQVhfU0laRSk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZkbWEtPnMtPmxvY2ssZmxhZ3MpOworCWRtYS0+d3JpdGVwdHIgPSAwOworCWRtYS0+cmVhZHB0ciA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZG1hLT5zLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCBybWU5Nnh4X3N0YXJ0Y2FyZChybWU5Nnh4X2luZm8gKnMsaW50IHN0b3ApCit7CisJaW50IGk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUNPTU0gICAgICAgKCJzdGFydGNhcmQiKTsKKwlpZihzLT5jb250cm9sX3JlZ2lzdGVyICYgUk1FOTZ4eF9JRSl7CisJCS8qIGRpc2FibGUgaW50ZXJydXB0IGZpcnN0ICovCisJCQorCQlybWU5Nnh4X3Vuc2V0X2N0cmwoIHMsUk1FOTZ4eF9zdGFydF9iaXQgKTsKKwkJdWRlbGF5KDEwKTsKKwkJcm1lOTZ4eF91bnNldF9jdHJsKCBzLFJNRTk2eHhfSUUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jayxmbGFncyk7IC8qIHRpbWluZyBpcyBjcml0aWNhbCAqLworCQlzLT5zdGFydGVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jayxmbGFncyk7CisJCWlmIChzdG9wKSB7CisJCSAgICAgQ09NTSgiU291bmQgY2FyZCBzdG9wcGVkIik7CisJCSAgICAgcmV0dXJuIDE7CisJCX0KKwl9CisJQ09NTSAgICAgICAoImludGVycnVwdCBkaXNhYmxlZCIpOworCS8qIGZpcnN0IGluaXRpYWxpemUgYWxsIHBvaW50ZXJzIG9uIGNhcmQgKi8KKwlmb3IoaT0wO2k8Uk1FOTZ4eF9udW1fb2ZfaW5pdF9yZWdzO2krKyl7CisJCXdyaXRlbCgwLHMtPmlvYmFzZSArIGkpOworCQl1ZGVsYXkoMTApOyAvKiA/PyAqLworCX0KKwlDT01NICAgICAgICgicmVncyBjbGVhbmVkIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jayxmbGFncyk7IC8qIHRpbWluZyBpcyBjcml0aWNhbCAqLworCXVkZWxheSgxMCk7CisJcy0+c3RhcnRlZCA9IDE7CisJcy0+aHdwdHIgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssZmxhZ3MpOworCisJcm1lOTZ4eF9zZXRfY3RybCggcywgUk1FOTZ4eF9JRSB8IFJNRTk2eHhfc3RhcnRfYml0KTsKKworCisJQ09NTSgiU291bmQgY2FyZCBzdGFydGVkIik7CisgIAorCXJldHVybiAxOworfQorCisKK3N0YXRpYyBpbmxpbmUgaW50IHJtZTk2eHhfZ2V0b3NwYWNlKHN0cnVjdCBkbWFidWYgKiBkbWEsIHVuc2lnbmVkIGludCBod3ApCit7CisJaW50IGNudDsKKwlpbnQgIHN3cHRyOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZG1hLT5zLT5sb2NrLGZsYWdzKTsgCisJc3dwdHIgPSBkbWEtPndyaXRlcHRyOworCWNudCA9IChod3AgLSBzd3B0cik7CisJCisJaWYgKGNudCA8IDApIHsKKwkgICAgIGNudCA9ICgoZG1hLT5zLT5mcmFnc2l6ZTw8MSkgLSBzd3B0cik7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRtYS0+cy0+bG9jayxmbGFncyk7CisJcmV0dXJuIGNudDsKK30KKworc3RhdGljIGlubGluZSBpbnQgcm1lOTZ4eF9nZXRpc3BhY2Uoc3RydWN0IGRtYWJ1ZiAqIGRtYSwgdW5zaWduZWQgaW50IGh3cCkKK3sKKwlpbnQgY250OworCWludCAgc3dwdHI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkbWEtPnMtPmxvY2ssZmxhZ3MpOyAKKwlzd3B0ciA9IGRtYS0+cmVhZHB0cjsKKwljbnQgPSAoaHdwIC0gc3dwdHIpOworCSAKKwlpZiAoY250IDwgMCkgeworCQljbnQgPSAoKGRtYS0+cy0+ZnJhZ3NpemU8PDEpIC0gc3dwdHIpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkbWEtPnMtPmxvY2ssZmxhZ3MpOworCXJldHVybiBjbnQ7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgcm1lOTZ4eF9jb3B5ZnJvbXVzZXIoc3RydWN0IGRtYWJ1ZiogZG1hLGNvbnN0IGNoYXIgX191c2VyICogYnVmZmVyLGludCBjb3VudCxpbnQgaG9wKQoreworCWludCBzd3B0ciA9IGRtYS0+d3JpdGVwdHI7CisJc3dpdGNoIChkbWEtPmZvcm1hdCkgeworCWNhc2UgQUZNVF9TMzJfQkxPQ0tFRDoKKwl7CisJICAgICBjaGFyIF9fdXNlciAqIGJ1ZiA9IChjaGFyIF9fdXNlciAqKWJ1ZmZlcjsKKwkgICAgIGludCBjbnQgPSBjb3VudC9kbWEtPm91dGNoYW5uZWxzOworCSAgICAgaW50IGk7CisJICAgICBmb3IgKGk9MDtpIDwgZG1hLT5vdXRjaGFubmVscztpKyspIHsKKwkJICBjaGFyKiBod2J1ZiA9KGNoYXIqKSAmZG1hLT5zLT5wbGF5YnVmWyhkbWEtPm91dG9mZnNldCArIGkpKlJNRTk2eHhfRE1BX01BWF9TQU1QTEVTXTsKKwkJICBod2J1Zis9c3dwdHI7CisKKwkJICBpZiAoY29weV9mcm9tX3VzZXIoaHdidWYsYnVmLCBjbnQpKQorCQkgICAgICAgcmV0dXJuIC0xOworCQkgIGJ1Zis9aG9wOworCSAgICAgfQorCSAgICAgc3dwdHIrPWNudDsKKwkgICAgIGJyZWFrOworCX0KKwljYXNlIEFGTVRfUzE2X0xFOgorCXsKKwkgICAgIGludCBpLGo7CisJICAgICBpbnQgY250ID0gY291bnQvZG1hLT5vdXRjaGFubmVsczsKKwkgICAgIGZvciAoaT0wO2kgPCBkbWEtPm91dGNoYW5uZWxzICsgZG1hLT5tb25vO2krKykgeworCQkgICAgIHNob3J0IF9fdXNlciAqIHNidWYgPSAoc2hvcnQgX191c2VyICopYnVmZmVyICsgaSooIWRtYS0+bW9ubyk7CisJCSAgICAgc2hvcnQqIGh3YnVmID0oc2hvcnQqKSAmZG1hLT5zLT5wbGF5YnVmWyhkbWEtPm91dG9mZnNldCArIGkpKlJNRTk2eHhfRE1BX01BWF9TQU1QTEVTXTsJICAgICAKKwkJICAgICBod2J1Zis9KHN3cHRyPj4xKTsKKwkJICAgICBmb3IgKGo9MDtqPChjbnQ+PjEpO2orKykgeworCQkJICAgICBod2J1ZisrOyAvKiBza2lwIHRoZSBsb3cgMTYgYml0cyAqLworCQkJICAgICBfX2dldF91c2VyKCpod2J1ZisrLHNidWYrKyk7CisJCQkgICAgIHNidWYrPShkbWEtPm91dGNoYW5uZWxzLTEpOworCQkgICAgIH0KKwkgICAgIH0KKwkgICAgIHN3cHRyICs9IChjbnQ8PDEpOworCSAgICAgYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJICAgICBwcmludGsoUk1FX01FU1MiIHVuc3VwcG9ydGVkIGZvcm1hdFxuIik7CisJICAgICByZXR1cm4gLTE7CisJfSAvKiBzd2l0Y2ggKi8KKworCXN3cHRyJj0oKGRtYS0+cy0+ZnJhZ3NpemU8PDEpIC0xKTsKKwlkbWEtPndyaXRlcHRyID0gc3dwdHI7CisKKwlyZXR1cm4gMDsKK30KKworLyogVGhlIGNvdW50IGFyZ3VtZW50IGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJtZTk2eHhfY29weXRvdXNlcihzdHJ1Y3QgZG1hYnVmKiBkbWEsY29uc3QgY2hhciBfX3VzZXIqIGJ1ZmZlcixpbnQgY291bnQsaW50IGhvcCkKK3sKKwlpbnQgc3dwdHIgPSBkbWEtPnJlYWRwdHI7CisJc3dpdGNoIChkbWEtPmZvcm1hdCkgeworCWNhc2UgQUZNVF9TMzJfQkxPQ0tFRDoKKwl7CisJICAgICBjaGFyIF9fdXNlciAqIGJ1ZiA9IChjaGFyIF9fdXNlciAqKWJ1ZmZlcjsKKwkgICAgIGludCBjbnQgPSBjb3VudC9kbWEtPmluY2hhbm5lbHM7CisJICAgICBpbnQgaTsKKworCSAgICAgZm9yIChpPTA7aSA8IGRtYS0+aW5jaGFubmVscztpKyspIHsKKwkJICBjaGFyKiBod2J1ZiA9KGNoYXIqKSAmZG1hLT5zLT5yZWNidWZbKGRtYS0+aW5vZmZzZXQgKyBpKSpSTUU5Nnh4X0RNQV9NQVhfU0FNUExFU107CisJCSAgaHdidWYrPXN3cHRyOworCisJCSAgaWYgKGNvcHlfdG9fdXNlcihidWYsaHdidWYsY250KSkKKwkJICAgICAgIHJldHVybiAtMTsKKwkJICBidWYrPWhvcDsKKwkgICAgIH0KKwkgICAgIHN3cHRyKz1jbnQ7CisJICAgICBicmVhazsKKwl9CisJY2FzZSBBRk1UX1MxNl9MRToKKwl7CisJICAgICBpbnQgaSxqOworCSAgICAgaW50IGNudCA9IGNvdW50L2RtYS0+aW5jaGFubmVsczsKKwkgICAgIGZvciAoaT0wO2kgPCBkbWEtPmluY2hhbm5lbHM7aSsrKSB7CisJCSAgc2hvcnQgX191c2VyICogc2J1ZiA9IChzaG9ydCBfX3VzZXIgKilidWZmZXIgKyBpOworCQkgIHNob3J0KiBod2J1ZiA9KHNob3J0KikgJmRtYS0+cy0+cmVjYnVmWyhkbWEtPmlub2Zmc2V0ICsgaSkqUk1FOTZ4eF9ETUFfTUFYX1NBTVBMRVNdOwkgICAgIAorCQkgIGh3YnVmKz0oc3dwdHI+PjEpOworCQkgIGZvciAoaj0wO2o8KGNudD4+MSk7aisrKSB7CisJCSAgICAgICBod2J1ZisrOworCQkgICAgICAgX19wdXRfdXNlcigqaHdidWYrKyxzYnVmKyspOworCQkgICAgICAgc2J1Zis9KGRtYS0+aW5jaGFubmVscy0xKTsKKwkJICB9CisJICAgICB9CisJICAgICBzd3B0ciArPSAoY250PDwxKTsKKwkgICAgIGJyZWFrOworCX0KKwlkZWZhdWx0OgorCSAgICAgcHJpbnRrKFJNRV9NRVNTIiB1bnN1cHBvcnRlZCBmb3JtYXRcbiIpOworCSAgICAgcmV0dXJuIC0xOworCX0gLyogc3dpdGNoICovCisJCisJc3dwdHImPSgoZG1hLT5zLT5mcmFnc2l6ZTw8MSkgLTEpOwkKKwlkbWEtPnJlYWRwdHIgPSBzd3B0cjsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaXJxcmV0dXJuX3Qgcm1lOTZ4eF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwlybWU5Nnh4X2luZm8gKnMgPSAocm1lOTZ4eF9pbmZvICopZGV2X2lkOworCXN0cnVjdCBkbWFidWYgKmRiOworCXUzMiBzdGF0dXM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXN0YXR1cyA9IHJlYWRsKHMtPmlvYmFzZSArIFJNRTk2eHhfc3RhdHVzX3JlZ2lzdGVyKTsKKwlpZiAoIShzdGF0dXMgJiBSTUU5Nnh4X0lSUSkpIHsKKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLGZsYWdzKTsKKwl3cml0ZWwoMCxzLT5pb2Jhc2UgKyBSTUU5Nnh4X2lycV9jbGVhcik7CisKKwlzLT5od2J1ZmlkID0gKHN0YXR1cyAmIFJNRTk2eHhfYnVmZmVyX2lkKT4+MjY7CQorCWlmICgoc3RhdHVzICYgMHhmZmMwKSA8PSAyNTYpIHMtPmh3cHRyID0gMDsgCisJZm9yKGk9MDtpPGRldmljZXM7aSsrKQorCXsKKwkJZGIgPSAmKHMtPmRtYVtpXSk7CisJCWlmKGRiLT5zdGFydGVkID4gMCkKKwkJCXdha2VfdXAoJihkYi0+d2FpdCkpOwkJCisJfSAgCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jayxmbGFncyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorIFBDSSBkZXRlY3Rpb24gYW5kIG1vZHVsZSBpbml0aWFsaXphdGlvbiBzdHVmZiAKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworc3RhdGljIHZvaWQqIGJ1c21hc3Rlcl9tYWxsb2MoaW50IHNpemUpIHsKKyAgICAgaW50IHBnOyAvKiAyIHMgZXhwb25lbnQgb2YgbWVtb3J5IHNpemUgKi8KKyAgICAgICAgY2hhciAqYnVmOworCisgICAgICAgIERCRyhwcmludGsoImtlcm5lbCBtYWxsb2MgcGFnZXMgLi5cbiIpKTsKKyAgICAgICAgCisgICAgICAgIGZvciAocGcgPSAwOyBQQUdFX1NJWkUgKiAoMSA8PCBwZykgPCBzaXplOyBwZysrKTsKKworICAgICAgICBidWYgPSAoY2hhciAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBHRlBfRE1BLCBwZyk7CisKKyAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgIHN0cnVjdCBwYWdlKiBwYWdlLCAqbGFzdF9wYWdlOworCisgICAgICAgICAgICAgICAgcGFnZSA9IHZpcnRfdG9fcGFnZShidWYpOworICAgICAgICAgICAgICAgIGxhc3RfcGFnZSA9IHZpcnRfdG9fcGFnZShidWYgKyAoMSA8PCBwZykpOworICAgICAgICAgICAgICAgIERCRyhwcmludGsoInNldHRpbmcgcmVzZXJ2ZWQgYml0XG4iKSk7CisgICAgICAgICAgICAgICAgd2hpbGUgKHBhZ2UgPCBsYXN0X3BhZ2UpIHsKKwkJCVNldFBhZ2VSZXNlcnZlZChwYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UrKzsKKyAgICAgICAgICAgICAgICB9CisJCXJldHVybiBidWY7CisgICAgICAgIH0KKwlEQkcocHJpbnRrKCJhbGxvY2F0ZWQgJWxkIiwobG9uZylidWYpKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgYnVzbWFzdGVyX2ZyZWUodm9pZCogcHRyLGludCBzaXplKSB7CisgICAgICAgIGludCBwZzsKKwlzdHJ1Y3QgcGFnZSogcGFnZSwgKmxhc3RfcGFnZTsKKworICAgICAgICBpZiAocHRyID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAocGcgPSAwOyBQQUdFX1NJWkUgKiAoMSA8PCBwZykgPCBzaXplOyBwZysrKTsKKworICAgICAgICBwYWdlID0gdmlydF90b19wYWdlKHB0cik7CisgICAgICAgIGxhc3RfcGFnZSA9IHBhZ2UgKyAoMSA8PCBwZyk7CisgICAgICAgIHdoaWxlIChwYWdlIDwgbGFzdF9wYWdlKSB7CisJCUNsZWFyUGFnZVJlc2VydmVkKHBhZ2UpOworCQlwYWdlKys7CisJfQorCURCRyhwcmludGsoImZyZWVpbmcgcGFnZXNcbiIpKTsKKyAgICAgICAgZnJlZV9wYWdlcygodW5zaWduZWQgbG9uZykgcHRyLCBwZyk7CisJREJHKHByaW50aygiZG9uZVxuIikpOworfQorCisvKiBpbml0aWFsaXplIHRob3NlIHBhcnRzIG9mIHRoZSBpbmZvIHN0cnVjdHVyZSB3aGljaCBhcmUgbm90IHBjaSBkZXRlY3RhYmxlIHJlc291cmNlcyAqLworCitzdGF0aWMgaW50IHJtZTk2eHhfZG1hYnVmX2luaXQocm1lOTZ4eF9pbmZvICogcyxzdHJ1Y3QgZG1hYnVmKiBkbWEsaW50IGlvZmZzZXQsaW50IG9vZmZzZXQpIHsKKworCWluaXRfTVVURVgoJmRtYS0+b3Blbl9zZW0pOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYS0+b3Blbl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZkbWEtPndhaXQpOworCWRtYS0+cyA9IHM7IAorCWRtYS0+ZXJyb3IgPSAwOworCisJZG1hLT5mb3JtYXQgPSBBRk1UX1MzMl9CTE9DS0VEOworCWRtYS0+Zm9ybWF0c2hpZnQgPSAwOworCWRtYS0+aW5jaGFubmVscyA9IGRtYS0+b3V0Y2hhbm5lbHMgPSAxOworCWRtYS0+aW5vZmZzZXQgPSBpb2Zmc2V0OworCWRtYS0+b3V0b2Zmc2V0ID0gb29mZnNldDsKKworCWRtYS0+b3BlbmVkPTA7CisJZG1hLT5zdGFydGVkPTA7CisJZG1hLT5tbWFwcGVkPTA7CisJZG1hLT5vcGVuX21vZGU9MDsKKwlkbWEtPm1vbm89MDsKKworCXJtZTk2eHhfY2xlYXJidWZzKGRtYSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBybWU5Nnh4X2luaXQocm1lOTZ4eF9pbmZvKiBzKQoreworCWludCBpOworCWludCBzdGF0dXM7CisJdW5zaWduZWQgc2hvcnQgcmV2OworCisJREJHKHByaW50aygiJXNcbiIsIF9fRlVOQ1RJT05fXykpOworCW51bWNhcmRzKys7CisKKwlzLT5tYWdpYyA9IFJNRTk2eHhfTUFHSUM7IAorCisJc3Bpbl9sb2NrX2luaXQoJnMtPmxvY2spOworCisJQ09NTSAgICAgICAgICAgICgic2V0dXAgYnVzbWFzdGVyIG1lbW9yeSIpCisJcy0+cmVjYnVmID0gYnVzbWFzdGVyX21hbGxvYyhSTUU5Nnh4X0RNQV9NQVhfU0laRV9BTEwpOworCXMtPnBsYXlidWYgPSBidXNtYXN0ZXJfbWFsbG9jKFJNRTk2eHhfRE1BX01BWF9TSVpFX0FMTCk7CisKKwlpZiAoIXMtPnJlY2J1ZiB8fCAhcy0+cGxheWJ1ZikgeworCQlwcmludGsoS0VSTl9FUlIgUk1FX01FU1MiIFVuYWJsZSB0byBhbGxvY2F0ZSBidXNtYXN0ZXIgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJQ09NTSAgICAgICAgICAgICgic2V0dGluZyByZWMgYW5kIHBsYXlidWZmZXJzIikKKworCXdyaXRlbCgodTMyKSB2aXJ0X3RvX2J1cyhzLT5yZWNidWYpLHMtPmlvYmFzZSArIFJNRTk2eHhfcmVjX2J1ZmZlcik7CisgIAl3cml0ZWwoKHUzMikgdmlydF90b19idXMocy0+cGxheWJ1Zikscy0+aW9iYXNlICsgUk1FOTZ4eF9wbGF5X2J1ZmZlcik7CisKKwlDT01NICAgICAgICAgICAgICgiaW5pdGlhbGl6aW5nIGNvbnRyb2wgcmVnaXN0ZXIiKQorCXJtZTk2eHhfdW5zZXRfY3RybChzLDB4ZmZmZmZmZmYpOworCXJtZTk2eHhfc2V0X2N0cmwocyxSTUU5Nnh4X2N0cmxfaW5pdCk7CisKKworCUNPTU0gICAgICAgICAgICAgICgic2V0dXAgZGV2aWNlcyIpCQorCWZvciAoaT0wO2kgPCBkZXZpY2VzO2krKykgeworCQlzdHJ1Y3QgZG1hYnVmICogZG1hID0gJnMtPmRtYVtpXTsKKwkJcm1lOTZ4eF9kbWFidWZfaW5pdChzLGRtYSwyKmksMippKTsKKwl9CisKKwkvKiBjb2RlIGZyb20gQUxTQSBjYXJkLXJtZTk2NTIuYyAgIEhQIDIwMDIwMjAxICovCisgICAgICAgIC8qIERldGVybWluZSB0aGUgaC93IHJldiBsZXZlbCBvZiB0aGUgY2FyZC4gVGhpcyBzZWVtcyBsaWtlCisJICAgYSBwYXJ0aWN1bGFybHkga2x1ZGd5IHdheSB0byBlbmNvZGUgaXQsIGJ1dCBpdHMgd2hhdCBSTUUKKwkgICBjaG9zZSB0byBkbywgc28gd2UgZm9sbG93IHRoZW0gLi4uCisJKi8KKworCXN0YXR1cyA9IHJlYWRsKHMtPmlvYmFzZSArIFJNRTk2eHhfc3RhdHVzX3JlZ2lzdGVyKTsKKwlpZiAocm1lOTZ4eF9kZWNvZGVfc3BkaWZfcmF0ZShzdGF0dXMmUk1FOTZ4eF9GKSA9PSAxKSB7CisJCXMtPmh3X3JldiA9IDE1OworCX0gZWxzZSB7CisJCXMtPmh3X3JldiA9IDExOworCX0KKworCS8qIERpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgc3RhbmRhcmQgSGFtbWVyZmFsbCwgYW5kIHRoZQorCSAgICJMaWdodCIsIHdoaWNoIGRvZXMgbm90IGhhdmUgdGhlIGV4cGFuc2lvbiBib2FyZC4gVGhpcworCSAgIG1ldGhvZCBjb21lcyBmcm9tIGluZm9ybWF0aW9uIHJlY2VpdmVkIGZyb20gTWF0aGhpYXMKKwkgICBDbGF1c2VuIGF0IFJNRS4gRGlzcGxheSB0aGUgRUVQUk9NIGFuZCBoL3cgcmV2SUQgd2hlcmUKKwkgICByZWxldmFudC4gIAorCSovCisKKwlwY2lfcmVhZF9jb25maWdfd29yZChzLT5wY2lkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldik7CisJc3dpdGNoIChyZXYgJiAweGZmKSB7CisJY2FzZSA4OiAvKiBvcmlnaW5hbCBlcHJvbSAqLworCQlpZiAocy0+aHdfcmV2ID09IDE1KSB7CisJCQlzLT5jYXJkX25hbWUgPSAiUk1FIERpZ2k5NjM2IChSZXYgMS41KSI7CisJCX0gZWxzZSB7CisJCQlzLT5jYXJkX25hbWUgPSAiUk1FIERpZ2k5NjM2IjsKKwkJfQorCQlicmVhazsKKwljYXNlIDk6IC8qIFczNl9HIEVQUk9NICovCisJCXMtPmNhcmRfbmFtZSA9ICJSTUUgRGlnaTk2MzYgKFJldiBHKSI7CisJCWJyZWFrOworCWNhc2UgNDogLyogVzUyX0cgRVBST00gKi8KKwkJcy0+Y2FyZF9uYW1lID0gIlJNRSBEaWdpOTY1MiAoUmV2IEcpIjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwljYXNlIDM6IC8qIG9yaWdpbmFsIGVwcm9tICovCisJCWlmIChzLT5od19yZXYgPT0gMTUpIHsKKwkJCXMtPmNhcmRfbmFtZSA9ICJSTUUgRGlnaTk2NTIgKFJldiAxLjUpIjsKKwkJfSBlbHNlIHsKKwkJCXMtPmNhcmRfbmFtZSA9ICJSTUUgRGlnaTk2NTIiOworCQl9CisJCWJyZWFrOworCX0KKworCXByaW50ayhLRVJOX0lORk8gUk1FX01FU1MiIGRldGVjdGVkICVzIChod19yZXYgJWQpXG4iLHMtPmNhcmRfbmFtZSxzLT5od19yZXYpOyAKKworCWlmIChzLT5od19yZXYgPT0gMTUpCisJCXJtZTk2eHhfaW5pdGlhbGl6ZV9zcGRpZl9yZWNlaXZlciAocyk7CisKKwlzLT5zdGFydGVkID0gMDsKKwlybWU5Nnh4X3NldGxhdGVuY3kocyw3KTsKKworCXByaW50ayhLRVJOX0lORk8gUk1FX01FU1MiIGNhcmQgJWQgaW5pdGlhbGl6ZWRcbiIsbnVtY2FyZHMpOyAKKwlyZXR1cm4gMDsKK30KKworCisvKiBvcGVuIHVzZXMgdGhpcyB0byBmaWd1cmUgb3V0IHdoaWNoIGRldmljZSB3YXMgb3BlbmVkIC4uIHRoaXMgc2VlbXMgdG8gYmUgCisgICB1bm5lY2Vzc2FyeSBjb21wbGV4ICovCisKK3N0YXRpYyBMSVNUX0hFQUQoZGV2cyk7CisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHJtZTk2eHhfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQoreworCWludCBpOworCXJtZTk2eHhfaW5mbyAqczsKKworCURCRyhwcmludGsoIiVzXG4iLCBfX0ZVTkNUSU9OX18pKTsKKwkKKwlpZiAocGNpZGV2LT5pcnEgPT0gMCkgCisJCXJldHVybiAtMTsKKwlpZiAoIXBjaV9kbWFfc3VwcG9ydGVkKHBjaWRldiwgMHhmZmZmZmZmZikpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBSTUVfTUVTUyIgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHN1cHBvcnQgMzJiaXQgUENJIGJ1c21hc3RlciBETUFcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCWlmICghKHMgPSBrbWFsbG9jKHNpemVvZihybWU5Nnh4X2luZm8pLCBHRlBfS0VSTkVMKSkpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyBSTUVfTUVTUyIgb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybiAtMTsKKwl9CisJbWVtc2V0KHMsIDAsIHNpemVvZihybWU5Nnh4X2luZm8pKTsKKworCXMtPnBjaWRldiA9IHBjaWRldjsKKwlzLT5pb2Jhc2UgPSBpb3JlbWFwKHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApLFJNRTk2eHhfSU9fRVhURU5UKTsKKwlzLT5pcnEgPSBwY2lkZXYtPmlycTsKKworICAgICAgICBEQkcocHJpbnRrKCJyZW1hcHBlZCBpb2Jhc2U6ICVseCBpcnEgJWRcbiIsKGxvbmcpcy0+aW9iYXNlLHMtPmlycSkpOworCisJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpCisJCWdvdG8gZXJyX2lycTsKKwlpZiAocmVxdWVzdF9pcnEocy0+aXJxLCBybWU5Nnh4X2ludGVycnVwdCwgU0FfU0hJUlEsICJybWU5Nnh4IiwgcykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSIFJNRV9NRVNTIiBpcnEgJXUgaW4gdXNlXG4iLCBzLT5pcnEpOworCQlnb3RvIGVycl9pcnE7CisJfQorCQorCS8qIGluaXRpYWxpemUgdGhlIGNhcmQgKi8KKworCWkgPSAwOworCWlmIChybWU5Nnh4X2luaXQocykgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiBSTUVfTUVTUyIgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKwkJZ290byBlcnJfZGV2aWNlczsKKwl9CisJZm9yIChpPTA7aTxkZXZpY2VzO2krKykgeworCQlpZiAoKHMtPmRzcG51bVtpXSA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmcm1lOTZ4eF9hdWRpb19mb3BzLCAtMSkpIDwgMCkKKwkJCWdvdG8gZXJyX2RldmljZXM7CisJfQorCisJaWYgKChzLT5taXhlciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZybWU5Nnh4X21peGVyX2ZvcHMsIC0xKSkgPCAwKQorCQlnb3RvIGVycl9kZXZpY2VzOworCisJcGNpX3NldF9kcnZkYXRhKHBjaWRldiwgcyk7CisJcGNpZGV2LT5kbWFfbWFzayA9IDB4ZmZmZmZmZmY7IC8qID8/Pz8/ICovCisJLyogcHV0IGl0IGludG8gZHJpdmVyIGxpc3QgKi8KKwlsaXN0X2FkZF90YWlsKCZzLT5kZXZzLCAmZGV2cyk7CisKKwlEQkcocHJpbnRrKCJpbml0aWFsaXphdGlvbiBzdWNjZXNzZnVsXG4iKSk7CisJcmV0dXJuIDA7CisKKwkvKiBlcnJvciBoYW5kbGVyICovCisgZXJyX2RldmljZXM6CisJd2hpbGUgKGktLSkgCisJCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRzcG51bVtpXSk7CisJZnJlZV9pcnEocy0+aXJxLHMpOworIGVycl9pcnE6CisJa2ZyZWUocyk7CisJcmV0dXJuIC0xOworfQorCisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBybWU5Nnh4X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCWludCBpOworCXJtZTk2eHhfaW5mbyAqcyA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKCFzKSB7CisJCXByaW50ayhLRVJOX0VSUiJkZXZpY2Ugc3RydWN0dXJlIG5vdCB2YWxpZFxuIik7CisJCXJldHVybiA7CisJfQorCisJaWYgKHMtPnN0YXJ0ZWQpIHJtZTk2eHhfc3RhcnRjYXJkKHMsMCk7CisKKwlpID0gZGV2aWNlczsKKwl3aGlsZSAoaSkgeworCQlpLS07CisJCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRzcG51bVtpXSk7CisJfQorCQorCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIocy0+bWl4ZXIpOworCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCWZyZWVfaXJxKHMtPmlycSxzKTsKKwlidXNtYXN0ZXJfZnJlZShzLT5yZWNidWYsUk1FOTZ4eF9ETUFfTUFYX1NJWkVfQUxMKTsKKwlidXNtYXN0ZXJfZnJlZShzLT5wbGF5YnVmLFJNRTk2eHhfRE1BX01BWF9TSVpFX0FMTCk7CisJa2ZyZWUocyk7CisJcGNpX3NldF9kcnZkYXRhKGRldiwgTlVMTCk7Cit9CisKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1JNRSAKKyNkZWZpbmUgUENJX1ZFTkRPUl9JRF9STUUgMHgxMGVlCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9STUU5NjUyCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUk1FOTY1MiAweDNmYzQKKyNlbmRpZgorI2lmbmRlZiBQQ0lfQU5ZX0lECisjZGVmaW5lIFBDSV9BTllfSUQgMAorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBpZF90YWJsZVtdID0geworCXsKKwkJLnZlbmRvcgkgICA9IFBDSV9WRU5ET1JfSURfUk1FLAorCQkuZGV2aWNlCSAgID0gUENJX0RFVklDRV9JRF9STUU5NjUyLAorCQkuc3VidmVuZG9yID0gUENJX0FOWV9JRCwKKwkJLnN1YmRldmljZSA9IFBDSV9BTllfSUQsCisJfSwKKwl7IDAsIH0sCit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgaWRfdGFibGUpOworCitzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgcm1lOTZ4eF9kcml2ZXIgPSB7CisJLm5hbWUJICA9ICAicm1lOTZ4eCIsCisJLmlkX3RhYmxlID0gaWRfdGFibGUsCisJLnByb2JlCSAgPSBybWU5Nnh4X3Byb2JlLAorCS5yZW1vdmUJICA9IF9fZGV2ZXhpdF9wKHJtZTk2eHhfcmVtb3ZlKSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfcm1lOTZ4eCh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gUk1FX01FU1MiIHZlcnNpb24gIlJNRVZFUlNJT04iIHRpbWUgIiBfX1RJTUVfXyAiICIgX19EQVRFX18gIlxuIik7CisJZGV2aWNlcyA9ICgoZGV2aWNlcy0xKSAmIFJNRTk2eHhfTUFTS19ERVZTKSArIDE7CisJcHJpbnRrKEtFUk5fSU5GTyBSTUVfTUVTUyIgcmVzZXJ2aW5nICVkIGRzcCBkZXZpY2UocylcbiIsZGV2aWNlcyk7CisgICAgICAgIG51bWNhcmRzID0gMDsKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZybWU5Nnh4X2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3JtZTk2eHgodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIFJNRV9NRVNTIiB1bmxvYWRpbmdcbiIpOworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmcm1lOTZ4eF9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdChpbml0X3JtZTk2eHgpOworbW9kdWxlX2V4aXQoY2xlYW51cF9ybWU5Nnh4KTsKKworCisKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorICAgSW1wbGVtZW50YXRpb24gb2YgZmlsZSBvcGVyYXRpb25zIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBSTUU5Nnh4X0ZNVCAoQUZNVF9TMTZfTEV8QUZNVF9VOHxBRk1UX1MzMl9CTE9DS0VEKQorLyogQUZUTV9VOCBpcyBub3QgKHlldD8pIHN1cHBvcnRlZCAuLi4gIEhQMjAwMjAyMDEgKi8KKworc3RhdGljIGludCBybWU5Nnh4X2lvY3RsKHN0cnVjdCBpbm9kZSAqaW4sIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgZG1hYnVmICogZG1hID0gKHN0cnVjdCBkbWFidWYgKilmaWxlLT5wcml2YXRlX2RhdGE7IAorCXJtZTk2eHhfaW5mbyAqcyA9IGRtYS0+czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICBhdWRpb19idWZfaW5mbyBhYmluZm87CisgICAgICAgIGNvdW50X2luZm8gY2luZm87CisJaW50IGNvdW50OworCWludCB2YWwgPSAwOworCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOworCWludCBfX3VzZXIgKnAgPSBhcmdwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisKKwlEQkcocHJpbnRrKCJpb2N0bCAldWRcbiIsY21kKSk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldHVybiBwdXRfdXNlcihTT1VORF9WRVJTSU9OLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorI2lmIDAKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIGRyYWluX2RhYzIocywgMC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sqLyk7CisjZW5kaWYKKwkJcmV0dXJuIDA7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiBwdXRfdXNlcihEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAsIHApOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorLy8JCXJtZTk2eHhfY2xlYXJidWZzKGRtYSk7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsID49IDApIHsKKy8qIGdlbmVyYWxseSBpdCdzIG5vdCBhIHByb2JsZW0gaWYgd2UgY2hhbmdlIHRoZSBzcGVlZCAKKwkJCWlmIChkbWEtPm9wZW5fbW9kZSAmICh+ZmlsZS0+Zl9tb2RlKSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKyovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCisJCQlzd2l0Y2ggKHZhbCkgeworCQkJY2FzZSA0NDEwMDoKKwkJCWNhc2UgODgyMDA6CisJCQkJcm1lOTZ4eF91bnNldF9jdHJsKHMsUk1FOTZ4eF9mcmVxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDgwMDA6IAorCQkJY2FzZSA5NjAwMDogCisJCQkJcm1lOTZ4eF9zZXRfY3RybChzLFJNRTk2eHhfZnJlcSk7CisJCQkJYnJlYWs7CisJCQkvKiBqdXN0IHJlcG9ydCBjdXJyZW50IHJhdGUgYXMgZGVmYXVsdAorCQkJICAgZS5nLiB1c2UgMCB0byAic2VsZWN0IiBjdXJyZW50IGRpZ2l0YWwgaW5wdXQgcmF0ZQorCQkJZGVmYXVsdDoKKwkJCQlybWU5Nnh4X3Vuc2V0X2N0cmwocyxSTUU5Nnh4X2ZyZXEpOworCQkJCXZhbCA9IDQ0MTAwOworCQkJKi8KKwkJCX0KKwkJCWlmICh2YWwgPiA1MDAwMCkKKwkJCQlybWU5Nnh4X3NldF9jdHJsKHMsUk1FOTZ4eF9EUyk7CisJCQllbHNlCisJCQkJcm1lOTZ4eF91bnNldF9jdHJsKHMsUk1FOTZ4eF9EUyk7CisJCQkvKiBzZXQgdmFsIHRvIGFjdHVhbCB2YWx1ZSAgSFAgMjAwMjAyMDEgKi8KKwkJCS8qIE5PVEU6IGlmIG5vdCAiU3luYyBNYXN0ZXIiLCByZXBvcnRlZCByYXRlIG1pZ2h0IGJlIG5vdCB5ZXQgInVwZGF0ZWQiIC4uLiBidXQgSSBkb24ndCB3YW50IHRvIGluc2VydCBhIGxvbmcgdWRlbGF5KCkgaGVyZSAqLworCQkJaWYgKChzLT5jb250cm9sX3JlZ2lzdGVyICYgUk1FOTZ4eF9NYXN0ZXIpICYmICEocy0+Y29udHJvbF9yZWdpc3RlciAmIFJNRTk2eHhfd3NlbCkpCisJCQkJdmFsID0gcm1lOTZ4eF9nZXRfc2FtcGxlX3JhdGVfY3RybChzKTsKKwkJCWVsc2UKKwkJCQl2YWwgPSBybWU5Nnh4X2dldF9zYW1wbGVfcmF0ZV9zdGF0dXMocyk7CisJCQlzLT5yYXRlID0gdmFsOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQl9CisJCURCRyhwcmludGsoInNwZWVkIHNldCB0byAlZFxuIix2YWwpKTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQorICAgICAgICBjYXNlIFNORENUTF9EU1BfU1RFUkVPOiAvKiB0aGlzIHBsYXlzIGEgbW9ubyBmaWxlIG9uIHR3byBjaGFubmVscyAqLworICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCQlpZiAoIXZhbCkgeworCQkJREJHKHByaW50aygic2V0dGluZyB0byBtb25vXG4iKSk7IAorCQkJZG1hLT5tb25vPTE7IAorCQkJZG1hLT5pbmNoYW5uZWxzID0gMTsKKwkJCWRtYS0+b3V0Y2hhbm5lbHMgPSAxOworCQl9CisJCWVsc2UgeworCQkJREJHKHByaW50aygic2V0dGluZyB0byBzdGVyZW9cbiIpKTsgCisJCQlkbWEtPm1vbm8gPSAwOworCQkJZG1hLT5pbmNoYW5uZWxzID0gMjsKKwkJCWRtYS0+b3V0Y2hhbm5lbHMgPSAyOworCQl9CisJCXJldHVybiAwOworICAgICAgICBjYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisJCS8qIHJlbWVtYmVyIHRvIGNoZWNrIGZvciByZXNvbmFibGUgb2Zmc2V0L2NoYW5uZWwgcGFpcnMgaGVyZSAqLworICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7IAkJCQorCQkJaWYgKHZhbCA+IDAgJiYgKGRtYS0+b3V0b2Zmc2V0ICsgdmFsKSA8PSBSTUU5Nnh4X0NIQU5ORUxTX1BFUl9DQVJEKSAKKwkJCQlkbWEtPm91dGNoYW5uZWxzID0gdmFsOworCQkJZWxzZQorCQkJCWRtYS0+b3V0Y2hhbm5lbHMgPSB2YWwgPSAyOworCQkJREJHKHByaW50aygic2V0dGluZyB0byBvdXRjaGFubmVscyAlZFxuIix2YWwpKTsgCisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCWlmICh2YWwgPiAwICYmIChkbWEtPmlub2Zmc2V0ICsgdmFsKSA8PSBSTUU5Nnh4X0NIQU5ORUxTX1BFUl9DQVJEKSAKKwkJCQlkbWEtPmluY2hhbm5lbHMgPSB2YWw7CisJCQllbHNlCisJCQkJZG1hLT5pbmNoYW5uZWxzID0gdmFsID0gMjsKKwkJCURCRyhwcmludGsoInNldHRpbmcgdG8gaW5jaGFubmVscyAlZFxuIix2YWwpKTsgCisJCX0KKworCQlkbWEtPm1vbm89MDsKKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6IC8qIFJldHVybnMgYSBtYXNrICovCisgICAgICAgICAgICAgICAgcmV0dXJuIHB1dF91c2VyKFJNRTk2eHhfRk1ULCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDogLyogU2VsZWN0cyBPTkUgZm10Ki8KKwkJREJHKHByaW50aygic2V0dGluZyB0byBmb3JtYXQgJXhcbiIsdmFsKSk7IAorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWlmICh2YWwgJiBSTUU5Nnh4X0ZNVCkKKwkJCQlkbWEtPmZvcm1hdCA9IHZhbDsKKwkJCXN3aXRjaCAoZG1hLT5mb3JtYXQpIHsKKwkJCWNhc2UgQUZNVF9TMTZfTEU6CisJCQkJZG1hLT5mb3JtYXRzaGlmdD0xOworCQkJCWJyZWFrOworCQkJY2FzZSBBRk1UX1MzMl9CTE9DS0VEOgorCQkJCWRtYS0+Zm9ybWF0c2hpZnQ9MDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoZG1hLT5mb3JtYXQsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoKKwkJdmFsID0gMDsKKyNpZiAwCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmN0cmwgJiBDVFJMX0FEQ19FTikgCisJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmN0cmwgJiBDVFJMX0RBQzJfRU4pIAorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKyNpZiAwCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzdGFydF9hZGMocyk7CisJCQl9IGVsc2UKKwkJCQlzdG9wX2FkYyhzKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCkgeworCQkJCWlmICghcy0+ZG1hX2RhYzIucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYzIocykpKQorCQkJCQlyZXR1cm4gcmV0OworCQkJCXN0YXJ0X2RhYzIocyk7CisJCQl9IGVsc2UKKwkJCQlzdG9wX2RhYzIocyk7CisJCX0KKyNlbmRpZgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXZhbCA9IHJtZTk2eHhfZ2V0aHdwdHIoZG1hLT5zLDApOworCisKKwkJY291bnQgPSBybWU5Nnh4X2dldG9zcGFjZShkbWEsdmFsKTsKKwkJaWYgKCFzLT5zdGFydGVkKSBjb3VudCA9IHMtPmZyYWdzaXplKjI7CisJCWFiaW5mby5mcmFnc2l6ZSA9KHMtPmZyYWdzaXplKmRtYS0+b3V0Y2hhbm5lbHMpPj5kbWEtPmZvcm1hdHNoaWZ0OworICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcyA9IChjb3VudCpkbWEtPm91dGNoYW5uZWxzKT4+ZG1hLT5mb3JtYXRzaGlmdDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IDI7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IChjb3VudCA+IHMtPmZyYWdzaXplKTsgCisKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJdmFsID0gcm1lOTZ4eF9nZXRod3B0cihkbWEtPnMsMCk7CisKKwkJY291bnQgPSBybWU5Nnh4X2dldGlzcGFjZShkbWEsdmFsKTsKKworCQlhYmluZm8uZnJhZ3NpemUgPSAocy0+ZnJhZ3NpemUqZG1hLT5pbmNoYW5uZWxzKT4+ZG1hLT5mb3JtYXRzaGlmdDsKKyAgICAgICAgICAgICAgICBhYmluZm8uYnl0ZXMgPSAoY291bnQqZG1hLT5pbmNoYW5uZWxzKT4+ZG1hLT5mb3JtYXRzaGlmdDsKKyAgICAgICAgICAgICAgICBhYmluZm8uZnJhZ3N0b3RhbCA9IDI7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGNvdW50ID4gcy0+ZnJhZ3NpemU7IAorCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorICAgICAgICAgICAgICAgIGZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOiAvKiBXaGF0IHNob3VsZCB0aGlzIGV4YWN0bHkgZG8gPyAsCisJCQkJICAgICAgQVRNIGl0IGlzIGp1c3QgYWJpbmZvLmJ5dGVzICovCisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXZhbCA9IHJtZTk2eHhfZ2V0aHdwdHIoZG1hLT5zLDApOworCQljb3VudCA9IHZhbCAtIGRtYS0+cmVhZHB0cjsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ICs9IHMtPmZyYWdzaXplPDwxOworCisJCXJldHVybiBwdXRfdXNlcihjb3VudCwgcCk7CisKKworLyogY2hlY2sgb3V0IGhvdyB0byB1c2UgbW1hcGVkIG1vZGUgKGNhbiBvbmx5IGJlIGJsb2NrZWQgISEhKSAqLworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdmFsID0gcm1lOTZ4eF9nZXRod3B0cihkbWEtPnMsMCk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLGZsYWdzKTsKKyAgICAgICAgICAgICAgICBjaW5mby5ieXRlcyA9IHMtPmZyYWdzaXplPDwxOworCQljb3VudCA9IHZhbCAtIGRtYS0+cmVhZHB0cjsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ICs9IHMtPmZyYWdzaXplPDwxOworCisgICAgICAgICAgICAgICAgY2luZm8uYmxvY2tzID0gKGNvdW50ID4gcy0+ZnJhZ3NpemUpOyAKKyAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSB2YWw7CisJCWlmIChkbWEtPm1tYXBwZWQpCisJCQlkbWEtPnJlYWRwdHIgJj0gcy0+ZnJhZ3NpemU8PDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssZmxhZ3MpOworCisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQl2YWwgPSBybWU5Nnh4X2dldGh3cHRyKGRtYS0+cywwKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssZmxhZ3MpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZnJhZ3NpemU8PDE7CisJCWNvdW50ID0gdmFsIC0gZG1hLT53cml0ZXB0cjsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWNvdW50ICs9IHMtPmZyYWdzaXplPDwxOworCisgICAgICAgICAgICAgICAgY2luZm8uYmxvY2tzID0gKGNvdW50ID4gcy0+ZnJhZ3NpemUpOyAKKyAgICAgICAgICAgICAgICBjaW5mby5wdHIgPSB2YWw7CisJCWlmIChkbWEtPm1tYXBwZWQpCisJCQlkbWEtPndyaXRlcHRyICY9IHMtPmZyYWdzaXplPDwxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLGZsYWdzKTsKKyAgICAgICAgICAgICAgICBpZiAoY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmV0dXJuIDA7CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCSAgICAgcmV0dXJuIHB1dF91c2VyKHMtPmZyYWdzaXplLCBwKTsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJdmFsJj0weGZmZmY7CisJCXZhbCAtPSA3OworCQlpZiAodmFsIDwgMCkgdmFsID0gMDsKKwkJaWYgKHZhbCA+IDcpIHZhbCA9IDc7CisJCXJtZTk2eHhfc2V0bGF0ZW5jeShzLHZhbCk7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisjaWYgMAorCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQgJiYgcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbikgfHwKKwkJICAgIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5kbWFfZGFjMi5zdWJkaXZpc2lvbikpCisJCQlyZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICBpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gdmFsOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlzLT5kbWFfZGFjMi5zdWJkaXZpc2lvbiA9IHZhbDsKKyNlbmRpZgkJCisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJLyogSFAyMDAyMDIwMSAqLworCQlzLT5yYXRlID0gcm1lOTZ4eF9nZXRfc2FtcGxlX3JhdGVfc3RhdHVzKHMpOworCQlyZXR1cm4gcHV0X3VzZXIocy0+cmF0ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9DSEFOTkVMUzoKKwkJcmV0dXJuIHB1dF91c2VyKGRtYS0+b3V0Y2hhbm5lbHMsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJc3dpdGNoIChkbWEtPmZvcm1hdCkgeworCQkJY2FzZSBBRk1UX1MzMl9CTE9DS0VEOgorCQkJCXZhbCA9IDMyOworCQkJCWJyZWFrOworCQkJY2FzZSBBRk1UX1MxNl9MRToKKwkJCQl2YWwgPSAxNjsKKwkJCQlicmVhazsKKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkKKwl9CisKKworCXJldHVybiAtRU5PREVWOworfQorCisKKworc3RhdGljIGludCBybWU5Nnh4X29wZW4oc3RydWN0IGlub2RlICppbiwgc3RydWN0IGZpbGUgKmYpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGluKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCWludCBkZXZudW07CisJcm1lOTZ4eF9pbmZvICpzOworCXN0cnVjdCBkbWFidWYqIGRtYTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsgCisKKwlEQkcocHJpbnRrKCJkZXZpY2UgbnVtICVkIG9wZW5cbiIsZGV2bnVtKSk7CisKKwlub25zZWVrYWJsZV9vcGVuKGluLCBmKTsKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgcm1lOTZ4eF9pbmZvLCBkZXZzKTsKKwkJZm9yIChkZXZudW09MDsgZGV2bnVtPGRldmljZXM7IGRldm51bSsrKQorCQkJaWYgKCEoKHMtPmRzcG51bVtkZXZudW1dIF4gbWlub3IpICYgfjB4ZikpIAorCQkJCWJyZWFrOworCQlpZiAoZGV2bnVtPGRldmljZXMpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCisJZG1hID0gJnMtPmRtYVtkZXZudW1dOworCWYtPnByaXZhdGVfZGF0YSA9IGRtYTsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZkbWEtPm9wZW5fc2VtKTsKKwl3aGlsZSAoZG1hLT5vcGVuX21vZGUgJiBmLT5mX21vZGUpIHsKKwkJaWYgKGYtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQl1cCgmZG1hLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZkbWEtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZkbWEtPm9wZW5fc2VtKTsKKwkJc2NoZWR1bGUoKTsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYS0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJmRtYS0+b3Blbl9zZW0pOworCX0KKworCUNPTU0gICAgICAgICAgICAgICAgKCJoYXJkd2FyZSBvcGVuIikKKworCWlmICghZG1hLT5vcGVuZWQpIHJtZTk2eHhfZG1hYnVmX2luaXQoZG1hLT5zLGRtYSxkbWEtPmlub2Zmc2V0LGRtYS0+b3V0b2Zmc2V0KTsKKworCWRtYS0+b3Blbl9tb2RlIHw9IChmLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSk7CisJZG1hLT5vcGVuZWQgPSAxOworCXVwKCZkbWEtPm9wZW5fc2VtKTsKKworCURCRyhwcmludGsoImRldmljZSBudW0gJWQgb3BlbiBmaW5pc2hlZFxuIixkZXZudW0pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBybWU5Nnh4X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbiwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqIGRtYSA9IChzdHJ1Y3QgZG1hYnVmKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCS8qIGludCBod3A7ICAuLi4gd2FzIHVudXNlZCAgIEhQMjAwMjAyMDEgKi8KKwlEQkcocHJpbnRrKCIlc1xuIiwgX19GVU5DVElPTl9fKSk7CisKKwlDT01NICAgICAgICAgICgiZHJhaW5pbmciKQorCWlmIChkbWEtPm9wZW5fbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisjaWYgMCAvKiBXaHkgZG9lc24ndCB0aGlzIHdvcmsgd2l0aCBzb21lIGNhcmRzID8/ICovCisJICAgICBod3AgPSBybWU5Nnh4X2dldGh3cHRyKGRtYS0+cywwKTsKKwkgICAgIHdoaWxlIChybWU5Nnh4X2dldG9zcGFjZShkbWEsaHdwKSkgeworCQkgIGludGVycnVwdGlibGVfc2xlZXBfb24oJihkbWEtPndhaXQpKTsKKwkJICBod3AgPSBybWU5Nnh4X2dldGh3cHRyKGRtYS0+cywwKTsKKwkgICAgIH0KKyNlbmRpZgorCSAgICAgcm1lOTZ4eF9jbGVhcmJ1ZnMoZG1hKTsKKwl9CisKKwlkbWEtPm9wZW5fbW9kZSAmPSAofmZpbGUtPmZfbW9kZSkgJiAoRk1PREVfUkVBRHxGTU9ERV9XUklURSk7CisKKwlpZiAoIShkbWEtPm9wZW5fbW9kZSAmIChGTU9ERV9SRUFEfEZNT0RFX1dSSVRFKSkpIHsKKwkgICAgIGRtYS0+b3BlbmVkID0gMDsKKwkgICAgIGlmIChkbWEtPnMtPnN0YXJ0ZWQpIHJtZTk2eHhfc3RhcnRjYXJkKGRtYS0+cywxKTsKKwl9CisKKwl3YWtlX3VwKCZkbWEtPm9wZW5fd2FpdCk7CisJdXAoJmRtYS0+b3Blbl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHNzaXplX3Qgcm1lOTZ4eF93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hID0gKHN0cnVjdCBkbWFidWYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQgPSAwOworCWludCBjbnQ7IC8qIG51bWJlciBvZiBieXRlcyBmcm9tICJidWZmZXIiIHRoYXQgd2lsbC9jYW4gYmUgdXNlZCAqLworCWludCBob3AgPSBjb3VudC9kbWEtPm91dGNoYW5uZWxzOworCWludCBod3A7CisJaW50IGV4YWN0ID0gKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsgCisKKworCWlmKGRtYSA9PSBOVUxMIHx8IChkbWEtPnMpID09IE5VTEwpIAorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKGRtYS0+bW1hcHBlZCB8fCAhZG1hLT5vcGVuZWQpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCEgKGRtYS0+b3Blbl9tb2RlICAmIEZNT0RFX1dSSVRFKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOworCisJaWYgKCFkbWEtPnMtPnN0YXJ0ZWQpIHJtZTk2eHhfc3RhcnRjYXJkKGRtYS0+cyxleGFjdCk7CisJaHdwID0gcm1lOTZ4eF9nZXRod3B0cihkbWEtPnMsMCk7CisKKwlpZighKGRtYS0+c3RhcnRlZCkpewkJIAorCQlDT01NICAgICAgICAgICgiZmlyc3Qgd3JpdGUiKQorCQkJCisJCWRtYS0+cmVhZHB0ciA9IGh3cDsKKwkJZG1hLT53cml0ZXB0ciA9IGh3cDsKKwkJZG1hLT5zdGFydGVkID0gMTsKKwl9CisKKyAgCXdoaWxlIChjb3VudCA+IDApIHsKKwkJY250ID0gcm1lOTZ4eF9nZXRvc3BhY2UoZG1hLGh3cCk7CQkKKwkJY250Pj49ZG1hLT5mb3JtYXRzaGlmdDsKKwkJY250Kj1kbWEtPm91dGNoYW5uZWxzOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKworCQlpZiAoY250ICE9IDApIHsKKwkJICAgICAgICBpZiAocm1lOTZ4eF9jb3B5ZnJvbXVzZXIoZG1hLGJ1ZmZlcixjbnQsaG9wKSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVGQVVMVDsKKwkJCWNvdW50IC09IGNudDsKKwkJCWJ1ZmZlciArPSBjbnQ7CisJCQlyZXQgKz0gY250OworCQkJaWYgKGNvdW50ID09IDApIHJldHVybiByZXQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47CisJCQorCQlpZiAoKGh3cCAtIGRtYS0+d3JpdGVwdHIpIDw9IDApIHsKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJihkbWEtPndhaXQpKTsKKwkJCQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRVJFU1RBUlRTWVM7CisJCX0JCQkKKworCQlod3AgPSBybWU5Nnh4X2dldGh3cHRyKGRtYS0+cyxleGFjdCk7CisKKwl9OyAvKiBjb3VudCA+IDAgKi8KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHJtZTk2eHhfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7IAorCXN0cnVjdCBkbWFidWYgKmRtYSA9IChzdHJ1Y3QgZG1hYnVmICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmV0ID0gMDsKKwlpbnQgY250OyAvKiBudW1iZXIgb2YgYnl0ZXMgZnJvbSAiYnVmZmVyIiB0aGF0IHdpbGwvY2FuIGJlIHVzZWQgKi8KKwlpbnQgaG9wID0gY291bnQvZG1hLT5pbmNoYW5uZWxzOworCWludCBod3A7CisJaW50IGV4YWN0ID0gKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsgCisKKworCWlmKGRtYSA9PSBOVUxMIHx8IChkbWEtPnMpID09IE5VTEwpIAorCQlyZXR1cm4gLUVOWElPOworCisJaWYgKGRtYS0+bW1hcHBlZCB8fCAhZG1hLT5vcGVuZWQpCisJCXJldHVybiAtRU5YSU87CisKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghIChkbWEtPm9wZW5fbW9kZSAgJiBGTU9ERV9SRUFEKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOWElPOworCisJaWYgKCFkbWEtPnMtPnN0YXJ0ZWQpIHJtZTk2eHhfc3RhcnRjYXJkKGRtYS0+cyxleGFjdCk7CisJaHdwID0gcm1lOTZ4eF9nZXRod3B0cihkbWEtPnMsMCk7CisKKwlpZighKGRtYS0+c3RhcnRlZCkpewkJIAorCQlDT01NICAgICAgICAgICgiZmlyc3QgcmVhZCIpCisJCSAgICAgCisJCWRtYS0+d3JpdGVwdHIgPSBod3A7CisJCWRtYS0+cmVhZHB0ciA9IGh3cDsKKwkJZG1hLT5zdGFydGVkID0gMTsKKwl9CisKKyAgCXdoaWxlIChjb3VudCA+IDApIHsKKwkJY250ID0gcm1lOTZ4eF9nZXRpc3BhY2UoZG1hLGh3cCk7CQkKKwkJY250Pj49ZG1hLT5mb3JtYXRzaGlmdDsKKwkJY250Kj1kbWEtPmluY2hhbm5lbHM7CisKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisKKwkJaWYgKGNudCAhPSAwKSB7CisJCSAgICAgICAgCisJCQlpZiAocm1lOTZ4eF9jb3B5dG91c2VyKGRtYSxidWZmZXIsY250LGhvcCkpCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisJCQkKKwkJCWNvdW50IC09IGNudDsKKwkJCWJ1ZmZlciArPSBjbnQ7CisJCQlyZXQgKz0gY250OworCQkJaWYgKGNvdW50ID09IDApIHJldHVybiByZXQ7CisJCX0KKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47CisJCQorCQlpZiAoKGh3cCAtIGRtYS0+cmVhZHB0cikgPD0gMCkgeworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmKGRtYS0+d2FpdCkpOworCQkJCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKKwkJfQkJCQorCQlod3AgPSBybWU5Nnh4X2dldGh3cHRyKGRtYS0+cyxleGFjdCk7CisKKwl9OyAvKiBjb3VudCA+IDAgKi8KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgcm05Nnh4X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKSB7CisJc3RydWN0IGRtYWJ1ZiAqZG1hID0gKHN0cnVjdCBkbWFidWYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJcm1lOTZ4eF9pbmZvKiBzID0gZG1hLT5zOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisKKwlpZiAodm1hLT52bV9wZ29mZiAhPSAwKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiBSTUU5Nnh4X0RNQV9NQVhfU0laRSkgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkgeworCQlpZiAoIXMtPnN0YXJ0ZWQpIHJtZTk2eHhfc3RhcnRjYXJkKHMsMSk7CisKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZpcnRfdG9fcGh5cyhzLT5wbGF5YnVmICsgZG1hLT5vdXRvZmZzZXQqUk1FOTZ4eF9ETUFfTUFYX1NJWkUpID4+IFBBR0VfU0hJRlQsIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkgeworCQkJdW5sb2NrX2tlcm5lbCgpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9IAorCWVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCWlmICghcy0+c3RhcnRlZCkgcm1lOTZ4eF9zdGFydGNhcmQocywxKTsKKwkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsIHZpcnRfdG9fcGh5cyhzLT5wbGF5YnVmICsgZG1hLT5pbm9mZnNldCpSTUU5Nnh4X0RNQV9NQVhfU0laRSkgPj4gUEFHRV9TSElGVCwgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCQl1bmxvY2tfa2VybmVsKCk7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0gZWxzZSAgeworCQl1bmxvY2tfa2VybmVsKCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCisvKiB0aGlzIGlzIHRoZSBtYXBwaW5nICovCisJdm1hLT52bV9mbGFncyAmPSB+Vk1fSU87CisJZG1hLT5tbWFwcGVkID0gMTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcm1lOTZ4eF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hID0gKHN0cnVjdCBkbWFidWYgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJcm1lOTZ4eF9pbmZvKiBzID0gZG1hLT5zOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKwl1bnNpZ25lZCBpbnQgaHdwLGNudDsKKworICAgICAgICBEQkcocHJpbnRrKCJybWU5Nnh4IHBvbGxfd2FpdCAuLi5cbiIpKTsKKwlWQUxJREFURV9TVEFURShzKTsKKworCWlmICghcy0+c3RhcnRlZCkgeworCQkgIG1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJfQorCXBvbGxfd2FpdChmaWxlLCAmZG1hLT53YWl0LCB3YWl0KTsKKworCWh3cCA9IHJtZTk2eHhfZ2V0aHdwdHIoZG1hLT5zLDApOworCisgICAgICAgIERCRyhwcmludGsoInJtZTk2eHggcG9sbDogLi5jbnQgJWQgPiAlZFxuIixjbnQscy0+ZnJhZ3NpemUpKTsJCisKKwljbnQgPSBybWU5Nnh4X2dldGlzcGFjZShkbWEsaHdwKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSAKKwkgICAgIGlmIChjbnQgPiAwKQorCQkgIG1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCisKKwljbnQgPSBybWU5Nnh4X2dldG9zcGFjZShkbWEsaHdwKTsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgCisJICAgICBpZiAoY250ID4gMCkKKwkJICBtYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCisKKy8vICAgICAgICBwcmludGsoInJtZTk2eHggcG9sbF93YWl0IC4uLiVkID4gJWRcbiIscm1lOTZ4eF9nZXRvc3BhY2UoZG1hLGh3cCkscm1lOTZ4eF9nZXRpc3BhY2UoZG1hLGh3cCkpOworCisJcmV0dXJuIG1hc2s7Cit9CisKKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcm1lOTZ4eF9hdWRpb19mb3BzID0geworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisjZW5kaWYKKwkucmVhZAkgPSBybWU5Nnh4X3JlYWQsCisJLndyaXRlCSA9IHJtZTk2eHhfd3JpdGUsCisJLnBvbGwJID0gcm1lOTZ4eF9wb2xsLAorCS5pb2N0bAkgPSBybWU5Nnh4X2lvY3RsLCAgCisJLm1tYXAJID0gcm05Nnh4X21tYXAsCisJLm9wZW4JID0gcm1lOTZ4eF9vcGVuLCAgCisJLnJlbGVhc2UgPSBybWU5Nnh4X3JlbGVhc2UgCit9OworCitzdGF0aWMgaW50IHJtZTk2eHhfbWl4ZXJfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJcm1lOTZ4eF9pbmZvICpzOworCisJQ09NTSAgKCJtaXhlciBvcGVuIik7CisKKwlub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKwlmb3IgKGxpc3QgPSBkZXZzLm5leHQ7IDsgbGlzdCA9IGxpc3QtPm5leHQpIHsKKwkJaWYgKGxpc3QgPT0gJmRldnMpCisJCQlyZXR1cm4gLUVOT0RFVjsKKwkJcyA9IGxpc3RfZW50cnkobGlzdCwgcm1lOTZ4eF9pbmZvLCBkZXZzKTsKKwkJaWYgKHMtPm1peGVyPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisKKwlDT01NICAgICAgICAgICAgICAgICAgICAgICAoIm1peGVyIG9wZW5lZCIpCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcm1lOTZ4eF9taXhlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcm1lOTZ4eF9pbmZvICpzID0gKHJtZTk2eHhfaW5mbyAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1MzIgc3RhdHVzOworCWludCBzcGRpZnJhdGU7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlzdGF0dXMgPSByZWFkbChzLT5pb2Jhc2UgKyBSTUU5Nnh4X3N0YXR1c19yZWdpc3Rlcik7CisJLyogaGFjayB0byBjb252ZXJ0IHJldiAxLjUgU1BESUYgcmF0ZSB0byAiY3J5c3RhbHJhdGUiIGZvcm1hdCAgIEhQIDIwMDIwMjAxICovCisJcm1lOTZ4eF9zcGRpZl9zYW1wbGVfcmF0ZShzLCZzcGRpZnJhdGUpOworCXN0YXR1cyA9IChzdGF0dXMgJiB+Uk1FOTZ4eF9GKSB8ICgoc3BkaWZyYXRlPDwyMikgJiBSTUU5Nnh4X0YpOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9QUklWQVRFMSkgeworCQlybWVfbWl4ZXIgbWl4ZXI7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbWl4ZXIsYXJncCxzaXplb2YobWl4ZXIpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQkKKwkJbWl4ZXIuZGV2bnIgJj0gUk1FOTZ4eF9NQVNLX0RFVlM7CisJCWlmIChtaXhlci5kZXZuciA+PSBkZXZpY2VzKQorCQkJbWl4ZXIuZGV2bnIgPSBkZXZpY2VzLTE7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiAhcy0+ZG1hW21peGVyLmRldm5yXS5vcGVuZWQpIHsKKwkJCS8qIG1vZGlmeSBvbmx5IGlmIGRldmljZSBub3Qgb3BlbiAqLworCQkJaWYgKG1peGVyLm9fb2Zmc2V0IDwgMCkKKwkJCQltaXhlci5vX29mZnNldCA9IDA7CisJCQlpZiAobWl4ZXIub19vZmZzZXQgPj0gUk1FOTZ4eF9DSEFOTkVMU19QRVJfQ0FSRCkKKwkJCQltaXhlci5vX29mZnNldCA9IFJNRTk2eHhfQ0hBTk5FTFNfUEVSX0NBUkQtMTsKKwkJCWlmIChtaXhlci5pX29mZnNldCA8IDApCisJCQkJbWl4ZXIuaV9vZmZzZXQgPSAwOworCQkJaWYgKG1peGVyLmlfb2Zmc2V0ID49IFJNRTk2eHhfQ0hBTk5FTFNfUEVSX0NBUkQpCisJCQkJbWl4ZXIuaV9vZmZzZXQgPSBSTUU5Nnh4X0NIQU5ORUxTX1BFUl9DQVJELTE7CisJCQlzLT5kbWFbbWl4ZXIuZGV2bnJdLm91dG9mZnNldCA9IG1peGVyLm9fb2Zmc2V0OworCQkJcy0+ZG1hW21peGVyLmRldm5yXS5pbm9mZnNldCA9IG1peGVyLmlfb2Zmc2V0OworCQl9CisKKwkJbWl4ZXIub19vZmZzZXQgPSBzLT5kbWFbbWl4ZXIuZGV2bnJdLm91dG9mZnNldDsKKwkJbWl4ZXIuaV9vZmZzZXQgPSBzLT5kbWFbbWl4ZXIuZGV2bnJdLmlub2Zmc2V0OworCisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJm1peGVyLCBzaXplb2YobWl4ZXIpKSA/IC1FRkFVTFQgOiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUyKSB7CisJCXJldHVybiBwdXRfdXNlcihzdGF0dXMsIHApOworCX0KKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUzKSB7CisJCXUzMiBjb250cm9sOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmNvbnRyb2wsYXJncCxzaXplb2YoY29udHJvbCkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJcy0+Y29udHJvbF9yZWdpc3RlciAmPSB+Uk1FOTZ4eF9taXhlcl9hbGxvd2VkOworCQkJcy0+Y29udHJvbF9yZWdpc3RlciB8PSBjb250cm9sICYgUk1FOTZ4eF9taXhlcl9hbGxvd2VkOworCQkJd3JpdGVsKGNvbnRyb2wscy0+aW9iYXNlICsgUk1FOTZ4eF9jb250cm9sX3JlZ2lzdGVyKTsKKwkJfQorCisJICAgICByZXR1cm4gcHV0X3VzZXIocy0+Y29udHJvbF9yZWdpc3RlciwgcCk7CisJfQorCXJldHVybiAtMTsKK30KKworCisKK3N0YXRpYyBpbnQgcm1lOTZ4eF9taXhlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgcm1lOTZ4eF9taXhlcl9mb3BzID0geworI2lmIExJTlVYX1ZFUlNJT05fQ09ERSA+PSBLRVJORUxfVkVSU0lPTigyLDQsMCkKKwkub3duZXIJID0gVEhJU19NT0RVTEUsCisjZW5kaWYKKwkuaW9jdGwJID0gcm1lOTZ4eF9taXhlcl9pb2N0bCwKKwkub3BlbgkgPSBybWU5Nnh4X21peGVyX29wZW4sCisJLnJlbGVhc2UgPSBybWU5Nnh4X21peGVyX3JlbGVhc2UsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3JtZTk2eHguaCBiL3NvdW5kL29zcy9ybWU5Nnh4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzYzE4OAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9ybWU5Nnh4LmgKQEAgLTAsMCArMSw3OCBAQAorLyogKEMpIDIwMDAgR3VlbnRlciBHZWlnZXIgPGdlaWdlckBkZWJpYW4ub3JnPgorICAgd2l0aCBjb3B5L3Bhc3RlcyBmcm9tIHRoZSBkcml2ZXIgb2YgV2luZnJpZWQgUml0c2NoIDxyaXRzY2hAaWVtLmt1Zy5hYy5hdD4KKworTW9kaWZpY2F0aW9ucyAtIEhlaWtvIFB1cm5oYWdlbiA8cHVybmhhZ2VAdG50LnVuaS1oYW5ub3Zlci5kZT4KKyAgIEhQMjAwMjAxMTYgdG93YXJkcyBSRVYgMS41IHN1cHBvcnQsIGJhc2VkIG9uIEFMU0EncyBjYXJkLXJtZTk2NTIuYworICAgSFAyMDAyMDIwMSBjb21wbGV0ZWQ/CisKK0EgdGV4dC9ncmFwaGljIGNvbnRyb2wgcGFuZWwgKHJtZWN0cmwveHJtZWN0cmwpIGlzIGF2YWlsYWJsZSBmcm9tCisgICBodHRwOi8vZ2lnZS54ZHYub3JnL3BhZ2VzL3NvZnQvcGFnZXMvcm1lCisqLworCisKKyNpZm5kZWYgQUZNVF9TMzJfQkxPQ0tFRAorI2RlZmluZSBBRk1UX1MzMl9CTE9DS0VEIDB4MDAwMDQwMAorI2VuZGlmCisKKy8qIEFGTVRfUzE2X0JMT0NLRUQgbm90IHlldCBzdXBwb3J0ZWQgKi8KKyNpZm5kZWYgQUZNVF9TMTZfQkxPQ0tFRCAKKyNkZWZpbmUgQUZNVF9TMTZfQkxPQ0tFRCAweDAwMDA4MDAKKyNlbmRpZgorCisKK3R5cGVkZWYgc3RydWN0IHJtZV9zdGF0dXMgeworCXVuc2lnbmVkIGludCBpcnE6MTsKKwl1bnNpZ25lZCBpbnQgbG9ja21hc2s6MzsgICAgIC8qIEFEQVQgaW5wdXQgUExMcyBsb2NrZWQgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMTAwPUFEQVQxLCAwMTA9QURBVDIsIDAwMT1BREFUMyAqLworCXVuc2lnbmVkIGludCBzcjQ4OjE7ICAgICAgICAgLyogc2FtcGxlIHJhdGU6IDA9NDQuMS84OC4yIDE9NDgvOTYga0h6ICovCisJdW5zaWduZWQgaW50IHdjbG9jazoxOyAgICAgICAvKiAxPXdvcmRjbG9jayB1c2VkICovCisJdW5zaWduZWQgaW50IGJ1ZnBvaW50OjEwOworCXVuc2lnbmVkIGludCBzeW5jbWFzazozOyAgICAgLyogQURBVCBpbnB1dCBpbiBzeW5jIHdpdGggc3lzdGVtIGNsb2NrICovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxMDA9QURBVDEsIDAxMD1BREFUMiwgMDAxPUFEQVQzICovCisJdW5zaWduZWQgaW50IGRvdWJsZXNwZWVkOjE7ICAvKiBzYW1wbGUgcmF0ZTogMD00NC4xLzQ4IDE9ODguMi85NiBrSHogKi8KKwl1bnNpZ25lZCBpbnQgdGNfYnVzeToxOworCXVuc2lnbmVkIGludCB0Y19vdXQ6MTsKKwl1bnNpZ25lZCBpbnQgY3J5c3RhbHJhdGU6MzsgIC8qIHNwZGlmIGlucHV0IHNhbXBsZSByYXRlOiAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAwMDA9NjRrSHosIDEwMD04OC4ya0h6LCAwMTE9OTZrSHogKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgMTExPTMya0h6LCAxMTA9NDQuMWtIeiwgMTAxPTQ4a0h6ICovCisJdW5zaWduZWQgaW50IHNwZGlmX2Vycm9yOjE7ICAvKiAxPW5vIHNwZGlmIGxvY2sgKi8KKwl1bnNpZ25lZCBpbnQgYnVmaWQ6MTsKKwl1bnNpZ25lZCBpbnQgdGNfdmFsaWQ6MTsgICAgIC8qIDE9dGltZWNvZGUgaW5wdXQgZGV0ZWN0ZWQgKi8KKwl1bnNpZ25lZCBpbnQgc3BkaWZfcmVhZDoxOworfSBybWVfc3RhdHVzX3Q7CisKKworLyogb25seSBmaWVsZHMgbWFya2VkIFc6IGNhbiBiZSBtb2RpZmllZCBieSB3cml0aW5nIHRvIFNPVU5EX01JWEVSX1BSSVZBVEUzICovCit0eXBlZGVmIHN0cnVjdCBybWVfY29udHJvbCB7CisJdW5zaWduZWQgaW50IHN0YXJ0OjE7CisJdW5zaWduZWQgaW50IGxhdGVuY3k6MzsgICAgICAvKiBidWZmZXIgc2l6ZSAvIGxhdGVuY3kgW3NhbXBsZXNdOiAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAwPTY0IC4uLiA3PTgxOTIgKi8KKwl1bnNpZ25lZCBpbnQgbWFzdGVyOjE7ICAgICAgIC8qIFc6IGNsb2NrIG1vZGU6IDE9bWFzdGVyIDA9c2xhdmUvYXV0byAqLworCXVuc2lnbmVkIGludCBpZToxOworCXVuc2lnbmVkIGludCBzcjQ4OjE7ICAgICAgICAgLyogc2FtcGxlcmF0ZSAwPTQ0LjEvODguMiwgMT00OC85NiBrSHogKi8KKwl1bnNpZ25lZCBpbnQgc3BhcmU6MTsKKwl1bnNpZ25lZCBpbnQgZG91Ymxlc3BlZWQ6MTsgIC8qIGRvdWJsZSBzcGVlZCAwPTQ0LjEvNDgsIDE9ODguMi85NiBLaHogKi8KKwl1bnNpZ25lZCBpbnQgcHJvOjE7ICAgICAgICAgIC8qIFc6IFNQRElGLU9VVCAwPWNvbnN1bWVyLCAxPXByb2Zlc3Npb25hbCAqLworCXVuc2lnbmVkIGludCBlbXBoYXNpczoxOyAgICAgLyogVzogU1BESUYtT1VUIGVtcGhhc2lzIDA9b2ZmLCAxPW9uICovCisJdW5zaWduZWQgaW50IGRvbGJ5OjE7ICAgICAgICAvKiBXOiBTUERJRi1PVVQgbm9uLWF1ZGlvIGJpdCAxPXNldCwgMD11bnNldCAqLworCXVuc2lnbmVkIGludCBvcHRfb3V0OjE7ICAgICAgLyogVzogdXNlIDFzdCBvcHRpY2FsIE9VVCBhcyBTUERJRjogMT15ZXMsIDA9bm8gKi8KKwl1bnNpZ25lZCBpbnQgd29yZGNsb2NrOjE7ICAgIC8qIFc6IHVzZSBXb3JkY2xvY2sgYXMgc3luYyAob3ZlcndyaXRlcyBtYXN0ZXIpICovCisgICAgICAgIHVuc2lnbmVkIGludCBzcGRpZl9pbjoyOyAgICAgLyogVzogU1BESUYtSU46ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICAgMDA9b3B0aWNhbCAoQURBVDEpLCAwMT1jb2F4aWFsIChDaW5jaCksIDEwPWludGVybmFsIENEUk9NICovCisJdW5zaWduZWQgaW50IHN5bmNfcmVmOjI7ICAgICAvKiBXOiBwcmVmZXJyZWQgc3luYy1zb3VyY2UgaW4gYXV0b3N5bmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgICAwMD1BREFUMSwgMDE9QURBVDIsIDEwPUFEQVQzLCAxMT1TUERJRiAqLworCXVuc2lnbmVkIGludCBzcGRpZl9yZXNldDoxOworCXVuc2lnbmVkIGludCBzcGRpZl9zZWxlY3Q6MTsKKwl1bnNpZ25lZCBpbnQgc3BkaWZfY2xvY2s6MTsKKwl1bnNpZ25lZCBpbnQgc3BkaWZfd3JpdGU6MTsKKwl1bnNpZ25lZCBpbnQgYWRhdDFfY2Q6MTsgICAgIC8qIFc6IFJldiAxLjUrOiBpZiBzZXQsIGludGVybmFsIENEIGNvbm5lY3RvciBjYXJyaWVzIEFEQVQgKi8KK30gcm1lX2N0cmxfdDsKKworCit0eXBlZGVmIHN0cnVjdCBfcm1lX21peGVyIHsKKwlpbnQgaV9vZmZzZXQ7CisJaW50IG9fb2Zmc2V0OworCWludCBkZXZucjsKKwlpbnQgc3BhcmVbOF07Cit9IHJtZV9taXhlcjsKKwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NiLmggYi9zb3VuZC9vc3Mvc2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2U4ODkxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NiLmgKQEAgLTAsMCArMSwxODUgQEAKKyNkZWZpbmUgRFNQX1JFU0VUCShkZXZjLT5iYXNlICsgMHg2KQorI2RlZmluZSBEU1BfUkVBRAkoZGV2Yy0+YmFzZSArIDB4QSkKKyNkZWZpbmUgRFNQX1dSSVRFCShkZXZjLT5iYXNlICsgMHhDKQorI2RlZmluZSBEU1BfQ09NTUFORAkoZGV2Yy0+YmFzZSArIDB4QykKKyNkZWZpbmUgRFNQX1NUQVRVUwkoZGV2Yy0+YmFzZSArIDB4QykKKyNkZWZpbmUgRFNQX0RBVEFfQVZBSUwJKGRldmMtPmJhc2UgKyAweEUpCisjZGVmaW5lIERTUF9EQVRBX0FWTDE2CShkZXZjLT5iYXNlICsgMHhGKQorI2RlZmluZSBNSVhFUl9BRERSCShkZXZjLT5iYXNlICsgMHg0KQorI2RlZmluZSBNSVhFUl9EQVRBCShkZXZjLT5iYXNlICsgMHg1KQorI2RlZmluZSBPUEwzX0xFRlQJKGRldmMtPmJhc2UgKyAweDApCisjZGVmaW5lIE9QTDNfUklHSFQJKGRldmMtPmJhc2UgKyAweDIpCisjZGVmaW5lIE9QTDNfQk9USAkoZGV2Yy0+YmFzZSArIDB4OCkKKy8qIERTUCBDb21tYW5kcyAqLworCisjZGVmaW5lIERTUF9DTURfU1BLT04JCTB4RDEKKyNkZWZpbmUgRFNQX0NNRF9TUEtPRkYJCTB4RDMKKyNkZWZpbmUgRFNQX0NNRF9ETUFPTgkJMHhEMAorI2RlZmluZSBEU1BfQ01EX0RNQU9GRgkJMHhENAorCisjZGVmaW5lIElNT0RFX05PTkUJCTAKKyNkZWZpbmUgSU1PREVfT1VUUFVUCQlQQ01fRU5BQkxFX09VVFBVVAorI2RlZmluZSBJTU9ERV9JTlBVVAkJUENNX0VOQUJMRV9JTlBVVAorI2RlZmluZSBJTU9ERV9JTklUCQkzCisjZGVmaW5lIElNT0RFX01JREkJCTQKKworI2RlZmluZSBOT1JNQUxfTUlESQkwCisjZGVmaW5lIFVBUlRfTUlESQkxCisKKworLyoKKyAqIERldmljZSBtb2RlbHMKKyAqLworI2RlZmluZSBNRExfTk9ORQkwCisjZGVmaW5lIE1ETF9TQjEJCTEJLyogU0IxLjAgb3IgMS41ICovCisjZGVmaW5lIE1ETF9TQjIJCTIJLyogU0IyLjAgKi8KKyNkZWZpbmUgTURMX1NCMjAxCTMJLyogU0IyLjAxICovCisjZGVmaW5lIE1ETF9TQlBSTwk0CS8qIFNCIFBybyAqLworI2RlZmluZSBNRExfU0IxNgk1CS8qIFNCMTYvMzIvQVdFICovCisjZGVmaW5lIE1ETF9TQlBOUCAJNgkvKiBTQjE2LzMyL0FXRSBQblAgKi8KKyNkZWZpbmUgTURMX0pBWloJMTAJLyogTWVkaWEgVmlzaW9uIEphenoxNiAqLworI2RlZmluZSBNRExfU01XCQkxMQkvKiBMb2dpdGVjaCBTb3VuZE1hbiBXYXZlIChKYXp6MTYpICovCisjZGVmaW5lIE1ETF9FU1MJCTEyCS8qIEVTUyBFUzY4OCBhbmQgRVMxNjg4ICovCisjZGVmaW5lIE1ETF9BWlRFQ0gJMTMJLyogQXp0ZWNoIFNvdW5kIEdhbGF4eSBmYW1pbHkgKi8KKyNkZWZpbmUgTURMX0VTMTg2OE1JREkJMTQJLyogTUlESSBwb3J0IG9mIEVTUzE4NjggKi8KKyNkZWZpbmUgTURMX0FFRFNQCTE1CS8qIEF1ZGlvIEV4Y2VsIERTUCAxNiAqLworI2RlZmluZSBNRExfRVNTUENJCTE2CS8qIEVTUyBQQ0kgY2FyZCAqLworI2RlZmluZSBNRExfWU1QQ0kJMTcJLyogWWFtYWhhIFBDSSBzYiBpbiBlbXVsYXRpb24gKi8KKworI2RlZmluZSBTVUJNRExfQUxTMDA3CTQyCS8qIEFMUy0wMDcgZGlmZmVycyBmcm9tIFNCMTYgb25seSBpbiBtaXhlciAqLworCQkJCS8qIHJlZ2lzdGVyIGFzc2lnbm1lbnQgKi8KKyNkZWZpbmUgU1VCTURMX0FMUzEwMAk0MwkvKiBBTFMtMTAwIGFsbG93cyBzYW1wbGluZyByYXRlcyBvZiB1cCAqLworCQkJCS8qIHRvIDQ4a0h6ICovCisJCQkJCisvKgorICogQ29uZmlnIGZsYWdzCisgKi8KKyNkZWZpbmUgU0JfTk9fTUlESQkweDAwMDAwMDAxCisjZGVmaW5lIFNCX05PX01JWEVSCTB4MDAwMDAwMDIKKyNkZWZpbmUgU0JfTk9fQVVESU8JMHgwMDAwMDAwNAorI2RlZmluZSBTQl9OT19SRUNPUkRJTkcJMHgwMDAwMDAwOCAvKiBObyBhdWRpbyByZWNvcmRpbmcgKi8KKyNkZWZpbmUgU0JfTUlESV9PTkxZCShTQl9OT19BVURJT3xTQl9OT19NSVhFUikKKyNkZWZpbmUgU0JfUENJX0lSUQkweDAwMDAwMDEwIC8qIFBDSSBzaGFyZWQgSVJRICovCisKK3N0cnVjdCBtaXhlcl9kZWYgeworCXVuc2lnbmVkIGludCByZWdubzogODsKKwl1bnNpZ25lZCBpbnQgYml0b2Zmczo0OworCXVuc2lnbmVkIGludCBuYml0czo0OworfTsKKwordHlwZWRlZiBzdHJ1Y3QgbWl4ZXJfZGVmIG1peGVyX3RhYlszMl1bMl07Cit0eXBlZGVmIHN0cnVjdCBtaXhlcl9kZWYgbWl4ZXJfZW50OworCitzdHJ1Y3Qgc2JfbW9kdWxlX29wdGlvbnMKK3sKKwlpbnQgIGVzc3R5cGU7CS8qIEVTUyBjaGlwIHR5cGUgKi8KKwlpbnQgIGFjZXI7CS8qIERvIGFjZXIgbm90ZWJvb2sgaW5pdD8gKi8KKwlpbnQgIHNtX2dhbWVzOwkvKiBMb2dpdGVjaCBzb3VuZG1hbiBnYW1lcz8gKi8KK307CisKK3R5cGVkZWYgc3RydWN0IHNiX2RldmMgeworCSAgIGludCBkZXY7CisKKwkvKiBIYXJkd2FyZSBwYXJhbWV0ZXJzICovCisJICAgaW50ICpvc3A7CisJICAgaW50IG1pbm9yLCBtYWpvcjsKKwkgICBpbnQgdHlwZTsKKwkgICBpbnQgbW9kZWwsIHN1Ym1vZGVsOworCSAgIGludCBjYXBzOworIwlkZWZpbmUgU0JDQVBfU1RFUkVPCTB4MDAwMDAwMDEKKyMJZGVmaW5lIFNCQ0FQXzE2QklUUwkweDAwMDAwMDAyCisKKwkvKiBIYXJkd2FyZSByZXNvdXJjZXMgKi8KKwkgICBpbnQgYmFzZTsKKwkgICBpbnQgaXJxOworCSAgIGludCBkbWE4LCBkbWExNjsKKwkgICAKKwkgICBpbnQgcGNpYmFzZTsJCS8qIEZvciBFU1MgTWFlc3RybyBldGMgKi8KKworCS8qIFN0YXRlIHZhcmlhYmxlcyAqLworIAkgICBpbnQgb3BlbmVkOworCS8qIG5ldyBhdWRpbyBmaWVsZHMgZm9yIGZ1bGwgZHVwbGV4IHN1cHBvcnQgKi8KKwkgICBpbnQgZnVsbGR1cGxleDsKKwkgICBpbnQgZHVwbGV4OworCSAgIGludCBzcGVlZCwgYml0cywgY2hhbm5lbHM7CisJICAgdm9sYXRpbGUgaW50IGlycV9vazsKKwkgICB2b2xhdGlsZSBpbnQgaW50cl9hY3RpdmUsIGlycV9tb2RlOworCS8qIGR1cGxpY2F0ZSBhdWRpbyBmaWVsZHMgZm9yIGZ1bGwgZHVwbGV4IHN1cHBvcnQgKi8KKwkgICB2b2xhdGlsZSBpbnQgaW50cl9hY3RpdmVfMTYsIGlycV9tb2RlXzE2OworCisJLyogTWl4ZXIgZmllbGRzICovCisJICAgaW50ICpsZXZlbHM7CisJICAgbWl4ZXJfdGFiICppb21hcDsKKwkgICBzaXplX3QgaW9tYXBfc3o7IC8qIG51bWJlciBvciByZWNvcmRzIGluIHRoZSBpb21hcCB0YWJsZSAqLworCSAgIGludCBtaXhlcl9jYXBzLCByZWNtYXNrLCBvdXRtYXNrLCBzdXBwb3J0ZWRfZGV2aWNlczsKKwkgICBpbnQgc3VwcG9ydGVkX3JlY19kZXZpY2VzLCBzdXBwb3J0ZWRfb3V0X2RldmljZXM7CisJICAgaW50IG15X21peGVyZGV2OworCSAgIGludCBzYm1peG51bTsKKworCS8qIEF1ZGlvIGZpZWxkcyAqLworCSAgIHVuc2lnbmVkIGxvbmcgdHJnX2J1ZjsKKwkgICBpbnQgICAgICB0cmlnZ2VyX2JpdHM7CisJICAgaW50ICAgICAgdHJnX2J5dGVzOworCSAgIGludCAgICAgIHRyZ19pbnRyZmxhZzsKKwkgICBpbnQgICAgICB0cmdfcmVzdGFydDsKKwkvKiBkdXBsaWNhdGUgYXVkaW8gZmllbGRzIGZvciBmdWxsIGR1cGxleCBzdXBwb3J0ICovCisJICAgdW5zaWduZWQgbG9uZyB0cmdfYnVmXzE2OworCSAgIGludCAgICAgIHRyaWdnZXJfYml0c18xNjsKKwkgICBpbnQgICAgICB0cmdfYnl0ZXNfMTY7CisJICAgaW50ICAgICAgdHJnX2ludHJmbGFnXzE2OworCSAgIGludCAgICAgIHRyZ19yZXN0YXJ0XzE2OworCisJICAgdW5zaWduZWQgY2hhciB0Y29uc3Q7CisJCisJLyogTUlESSBmaWVsZHMgKi8KKwkgICBpbnQgbXlfbWlkaWRldjsKKwkgICBpbnQgaW5wdXRfb3BlbmVkOworCSAgIGludCBtaWRpX2Jyb2tlbjsKKwkgICB2b2lkICgqbWlkaV9pbnB1dF9pbnRyKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKTsKKwkgICB2b2lkICptaWRpX2lycV9jb29raWU7CQkvKiBJUlEgY29va2llIGZvciB0aGUgbWlkaSAqLworCisJICAgc3BpbmxvY2tfdCBsb2NrOworCisJICAgc3RydWN0IHNiX21vZHVsZV9vcHRpb25zIHNibW87CS8qIE1vZHVsZSBvcHRpb25zICovCisKKwl9IHNiX2RldmM7CisJCisvKgorICoJUENJIGNhcmQgdHlwZXMKKyAqLworCisjZGVmaW5lCVNCX1BDSV9FU1NNQUVTVFJPCTEJLyogRVNTIE1hZXN0cm8gTGVnYWN5ICovCisjZGVmaW5lCVNCX1BDSV9ZQU1BSEEJCTIJLyogWWFtYWhhIExlZ2FjeSAqLworCisvKiAKKyAqCUZ1bmN0aW9ucworICovCisgCitpbnQgc2JfZHNwX2NvbW1hbmQgKHNiX2RldmMgKmRldmMsIHVuc2lnbmVkIGNoYXIgdmFsKTsKK2ludCBzYl9kc3BfZ2V0X2J5dGUoc2JfZGV2YyAqIGRldmMpOworaW50IHNiX2RzcF9yZXNldCAoc2JfZGV2YyAqZGV2Yyk7Cit2b2lkIHNiX3NldG1peGVyIChzYl9kZXZjICpkZXZjLCB1bnNpZ25lZCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IHZhbHVlKTsKK3Vuc2lnbmVkIGludCBzYl9nZXRtaXhlciAoc2JfZGV2YyAqZGV2YywgdW5zaWduZWQgaW50IHBvcnQpOworaW50IHNiX2RzcF9kZXRlY3QgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgaW50IHBjaSwgaW50IHBjaWlvLCBzdHJ1Y3Qgc2JfbW9kdWxlX29wdGlvbnMgKnNibW8pOworaW50IHNiX2RzcF9pbml0IChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCBtb2R1bGUgKm93bmVyKTsKK3ZvaWQgc2JfZHNwX3VubG9hZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIGludCBzYm1wdSk7CitpbnQgc2JfbWl4ZXJfaW5pdChzYl9kZXZjICpkZXZjLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7Cit2b2lkIHNiX21peGVyX3VubG9hZChzYl9kZXZjICpkZXZjKTsKK3ZvaWQgc2JfbWl4ZXJfc2V0X3N0ZXJlbyAoc2JfZGV2YyAqZGV2YywgaW50IG1vZGUpOwordm9pZCBzbXdfbWl4ZXJfaW5pdChzYl9kZXZjICpkZXZjKTsKK3ZvaWQgc2JfZHNwX21pZGlfaW5pdCAoc2JfZGV2YyAqZGV2Yywgc3RydWN0IG1vZHVsZSAqb3duZXIpOwordm9pZCBzYl9hdWRpb19pbml0IChzYl9kZXZjICpkZXZjLCBjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICpvd25lcik7Cit2b2lkIHNiX21pZGlfaW50ZXJydXB0IChzYl9kZXZjICpkZXZjKTsKK3ZvaWQgc2JfY2hnbWl4ZXIgKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHZhbCk7CitpbnQgc2JfY29tbW9uX21peGVyX3NldChzYl9kZXZjICogZGV2YywgaW50IGRldiwgaW50IGxlZnQsIGludCByaWdodCk7CisKK2ludCBzYl9hdWRpb19vcGVuKGludCBkZXYsIGludCBtb2RlKTsKK3ZvaWQgc2JfYXVkaW9fY2xvc2UoaW50IGRldik7CisKKy8qCUZyb20gc2JfY29tbW9uLmMgKi8KK3ZvaWQgc2JfZHNwX2Rpc2FibGVfbWlkaShpbnQgcG9ydCk7CitpbnQgcHJvYmVfc2JtcHUgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IG1vZHVsZSAqb3duZXIpOwordm9pZCB1bmxvYWRfc2JtcHUgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZyk7CisKK3ZvaWQgdW5sb2FkX3NiMTYoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfaW5mbyk7Cit2b2lkIHVubG9hZF9zYjE2bWlkaShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19pbmZvKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9hdWRpby5jIGIvc291bmQvb3NzL3NiX2F1ZGlvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVlNTRmNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zYl9hdWRpby5jCkBAIC0wLDAgKzEsMTA5OCBAQAorLyoKKyAqIHNvdW5kL3NiX2F1ZGlvLmMKKyAqCisgKiBBdWRpbyByb3V0aW5lcyBmb3IgU291bmQgQmxhc3RlciBjb21wYXRpYmxlIGNhcmRzLgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBDaGFuZ2VzCisgKglBbGFuIENveAk6CUZvcm1hdHRpbmcgYW5kIGNsZWFuIHVwcworICoKKyAqIFN0YXR1cworICoJTW9zdGx5IHdvcmtpbmcuIFdlaXJkIHVhcnQgYnVnIGNhdXNpbmcgaXJxIHN0b3JtcworICoKKyAqIERhbmllbCBKLiBSb2RyaWtzc29uOiBDaGFuZ2VzIHRvIG1ha2Ugc2IxNiB3b3JrIGZ1bGwgZHVwbGV4LgorICogICAgICAgICAgICAgICAgICAgICAgIE1heWJlIG90aGVyIDE2IGJpdCBjYXJkcyBpbiB0aGlzIGNvZGUgY291bGQgYmVoYXZlCisgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNhbWUuCisgKiBDaHJpcyBSYW5raW46ICAgICAgICAgVXNlIHNwaW5sb2NrcyBpbnN0ZWFkIG9mIENMSS9TVEkKKyAqLworCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAic2JfbWl4ZXIuaCIKKyNpbmNsdWRlICJzYi5oIgorCisjaW5jbHVkZSAic2JfZXNzLmgiCisKK2ludCBzYl9hdWRpb19vcGVuKGludCBkZXYsIGludCBtb2RlKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZXZjID09IE5VTEwpCisJeworCQkgIHByaW50ayhLRVJOX0VSUiAiU291bmQgQmxhc3RlcjogaW5jb21wbGV0ZSBpbml0aWFsaXphdGlvbi5cbiIpOworCQkgIHJldHVybiAtRU5YSU87CisJfQorCWlmIChkZXZjLT5jYXBzICYgU0JfTk9fUkVDT1JESU5HICYmIG1vZGUgJiBPUEVOX1JFQUQpCisJeworCQlpZiAobW9kZSA9PSBPUEVOX1JFQUQpCisJCQlyZXR1cm4gLUVQRVJNOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWlmIChkZXZjLT5vcGVuZWQpCisJeworCQkgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwkJICByZXR1cm4gLUVCVVNZOworCX0KKwlpZiAoZGV2Yy0+ZG1hMTYgIT0gLTEgJiYgZGV2Yy0+ZG1hMTYgIT0gZGV2Yy0+ZG1hOCAmJiAhZGV2Yy0+ZHVwbGV4KQorCXsKKwkJaWYgKHNvdW5kX29wZW5fZG1hKGRldmMtPmRtYTE2LCAiU291bmQgQmxhc3RlciAxNiBiaXQiKSkKKwkJeworCQkgIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJfQorCWRldmMtPm9wZW5lZCA9IG1vZGU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJZGV2Yy0+aXJxX21vZGUgPSBJTU9ERV9OT05FOworCWRldmMtPmlycV9tb2RlXzE2ID0gSU1PREVfTk9ORTsKKwlkZXZjLT5mdWxsZHVwbGV4ID0gZGV2Yy0+ZHVwbGV4ICYmCisJCSgobW9kZSAmIE9QRU5fUkVBRCkgJiYgKG1vZGUgJiBPUEVOX1dSSVRFKSk7CisJc2JfZHNwX3Jlc2V0KGRldmMpOworCisJLyogQXQgZmlyc3QgZ2xhbmNlIHRoaXMgY2hlY2sgaXNuJ3QgZW5vdWdoLCBzb21lIEVTUyBjaGlwcyBtaWdodCBub3QgCisJICogaGF2ZSBhIFJFQ0xFVi4gSG93ZXZlciBpZiB0aGV5IGRvbid0IGNvbW1vbl9taXhlcl9zZXQgd2lsbCByZWZ1c2UgCisJICogY2F1c2UgZGV2Yy0+aW9tYXAgaGFzIG5vIHJlZ2lzdGVyIG1hcHBpbmcgZm9yIFJFQ0xFVgorCSAqLworCWlmIChkZXZjLT5tb2RlbCA9PSBNRExfRVNTKSBlc3NfbWl4ZXJfcmVsb2FkIChkZXZjLCBTT1VORF9NSVhFUl9SRUNMRVYpOworCisJLyogVGhlIEFMUzAwNyBzZWVtcyB0byByZXF1aXJlIHRoYXQgdGhlIERTUCBiZSByZW1vdmVkIGZyb20gdGhlIG91dHB1dCAqLworCS8qIGluIG9yZGVyIGZvciByZWNvcmRpbmcgdG8gYmUgYWN0aXZhdGVkIHByb3Blcmx5LiAgVGhpcyBpcyBkb25lIGJ5ICAgKi8KKwkvKiBzZXR0aW5nIHRoZSBhcHByb3ByaWF0ZSBiaXRzIG9mIHRoZSBvdXRwdXQgY29udHJvbCByZWdpc3RlciA0Y2ggdG8gICovCisJLyogemVyby4gIFRoaXMgY29kZSBhc3N1bWVzIHRoYXQgdGhlIG91dHB1dCBjb250cm9sIHJlZ2lzdGVycyBhcmUgbm90ICAqLworCS8qIHVzZWQgYW55d2hlcmUgZWxzZSBhbmQgdGhlcmVmb3JlIHRoZSBEU1AgYml0cyBhcmUgKmFsd2F5cyogT04gZm9yICAgKi8KKwkvKiBvdXRwdXQgYW5kIE9GRiBmb3Igc2FtcGxpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKKwlpZiAoZGV2Yy0+c3VibW9kZWwgPT0gU1VCTURMX0FMUzAwNykgCisJeworCQlpZiAobW9kZSAmIE9QRU5fUkVBRCkgCisJCQlzYl9zZXRtaXhlcihkZXZjLEFMUzAwN19PVVRQVVRfQ1RSTDIsCisJCQkJc2JfZ2V0bWl4ZXIoZGV2YyxBTFMwMDdfT1VUUFVUX0NUUkwyKSAmIDB4ZjkpOworCQllbHNlCisJCQlzYl9zZXRtaXhlcihkZXZjLEFMUzAwN19PVVRQVVRfQ1RSTDIsCisJCQkJc2JfZ2V0bWl4ZXIoZGV2YyxBTFMwMDdfT1VUUFVUX0NUUkwyKSB8IDB4MDYpOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBzYl9hdWRpb19jbG9zZShpbnQgZGV2KQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwkvKiBmaXggdGhpbmdzIGlmIG1tYXAgdHVybmVkIG9mZiBmdWxsZHVwbGV4ICovCisJaWYoZGV2Yy0+ZHVwbGV4CisJICAgJiYgIWRldmMtPmZ1bGxkdXBsZXgKKwkgICAmJiAoZGV2Yy0+b3BlbmVkICYgT1BFTl9SRUFEKSAmJiAoZGV2Yy0+b3BlbmVkICYgT1BFTl9XUklURSkpCisJeworCQlzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcF90ZW1wOworCQlkbWFwX3RlbXAgPSBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0OworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0ID0gYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luOworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4gPSBkbWFwX3RlbXA7CisJfQorCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA9IGRldmMtPmRtYTg7CisJYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEgPSAoIGRldmMtPmR1cGxleCApID8KKwkJZGV2Yy0+ZG1hMTYgOiBkZXZjLT5kbWE4OworCisJaWYgKGRldmMtPmRtYTE2ICE9IC0xICYmIGRldmMtPmRtYTE2ICE9IGRldmMtPmRtYTggJiYgIWRldmMtPmR1cGxleCkKKwkJc291bmRfY2xvc2VfZG1hKGRldmMtPmRtYTE2KTsKKworCS8qIEZvciBBTFMwMDcsIHR1cm4gRFNQIG91dHB1dCBiYWNrIG9uIGlmIGNsb3NpbmcgdGhlIGRldmljZSBmb3IgcmVhZCAqLworCQorCWlmICgoZGV2Yy0+c3VibW9kZWwgPT0gU1VCTURMX0FMUzAwNykgJiYgKGRldmMtPm9wZW5lZCAmIE9QRU5fUkVBRCkpIAorCXsKKwkJc2Jfc2V0bWl4ZXIoZGV2YyxBTFMwMDdfT1VUUFVUX0NUUkwyLAorCQkJc2JfZ2V0bWl4ZXIoZGV2YyxBTFMwMDdfT1VUUFVUX0NUUkwyKSB8IDB4MDYpOworCX0KKwlkZXZjLT5vcGVuZWQgPSAwOworfQorCitzdGF0aWMgdm9pZCBzYl9zZXRfb3V0cHV0X3Bhcm1zKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgbnJfYnl0ZXMsCisJCSAgICBpbnQgaW50cmZsYWcpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmICghZGV2Yy0+ZnVsbGR1cGxleCB8fCBkZXZjLT5iaXRzID09IEFGTVRfUzE2X0xFKQorCXsKKwkJZGV2Yy0+dHJnX2J1ZiA9IGJ1ZjsKKwkJZGV2Yy0+dHJnX2J5dGVzID0gbnJfYnl0ZXM7CisJCWRldmMtPnRyZ19pbnRyZmxhZyA9IGludHJmbGFnOworCQlkZXZjLT5pcnFfbW9kZSA9IElNT0RFX09VVFBVVDsKKwl9CisJZWxzZQorCXsKKwkJZGV2Yy0+dHJnX2J1Zl8xNiA9IGJ1ZjsKKwkJZGV2Yy0+dHJnX2J5dGVzXzE2ID0gbnJfYnl0ZXM7CisJCWRldmMtPnRyZ19pbnRyZmxhZ18xNiA9IGludHJmbGFnOworCQlkZXZjLT5pcnFfbW9kZV8xNiA9IElNT0RFX09VVFBVVDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNiX3NldF9pbnB1dF9wYXJtcyhpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IGNvdW50LCBpbnQgaW50cmZsYWcpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmICghZGV2Yy0+ZnVsbGR1cGxleCB8fCBkZXZjLT5iaXRzICE9IEFGTVRfUzE2X0xFKQorCXsKKwkJZGV2Yy0+dHJnX2J1ZiA9IGJ1ZjsKKwkJZGV2Yy0+dHJnX2J5dGVzID0gY291bnQ7CisJCWRldmMtPnRyZ19pbnRyZmxhZyA9IGludHJmbGFnOworCQlkZXZjLT5pcnFfbW9kZSA9IElNT0RFX0lOUFVUOworCX0KKwllbHNlCisJeworCQlkZXZjLT50cmdfYnVmXzE2ID0gYnVmOworCQlkZXZjLT50cmdfYnl0ZXNfMTYgPSBjb3VudDsKKwkJZGV2Yy0+dHJnX2ludHJmbGFnXzE2ID0gaW50cmZsYWc7CisJCWRldmMtPmlycV9tb2RlXzE2ID0gSU1PREVfSU5QVVQ7CisJfQorfQorCisvKgorICogU0IxLnggY29tcGF0aWJsZSByb3V0aW5lcyAKKyAqLworCitzdGF0aWMgdm9pZCBzYjFfYXVkaW9fb3V0cHV0X2Jsb2NrKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgbnJfYnl0ZXMsIGludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCA9IG5yX2J5dGVzOworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwkvKiBETUFidWZfc3RhcnRfZG1hIChkZXYsIGJ1ZiwgY291bnQsIERNQV9NT0RFX1dSSVRFKTsgKi8KKworCWlmIChhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPiAzKQorCQljb3VudCA+Pj0gMTsKKwljb3VudC0tOworCisJZGV2Yy0+aXJxX21vZGUgPSBJTU9ERV9PVVRQVVQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWlmIChzYl9kc3BfY29tbWFuZChkZXZjLCAweDE0KSkJCS8qIDggYml0IERBQyB1c2luZyBETUEgKi8KKwl7CisJCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoY291bnQgJiAweGZmKSk7CisJCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoKGNvdW50ID4+IDgpICYgMHhmZikpOworCX0KKwllbHNlCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNvdW5kIEJsYXN0ZXI6ICB1bmFibGUgdG8gc3RhcnQgREFDLlxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWRldmMtPmludHJfYWN0aXZlID0gMTsKK30KKworc3RhdGljIHZvaWQgc2IxX2F1ZGlvX3N0YXJ0X2lucHV0KGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgbnJfYnl0ZXMsIGludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCA9IG5yX2J5dGVzOworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwkvKgorCSAqIFN0YXJ0IGEgRE1BIGlucHV0IHRvIHRoZSBidWZmZXIgcG9pbnRlZCBieSBkbWFxdGFpbAorCSAqLworCisJLyogRE1BYnVmX3N0YXJ0X2RtYSAoZGV2LCBidWYsIGNvdW50LCBETUFfTU9ERV9SRUFEKTsgKi8KKworCWlmIChhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPiAzKQorCQljb3VudCA+Pj0gMTsKKwljb3VudC0tOworCisJZGV2Yy0+aXJxX21vZGUgPSBJTU9ERV9JTlBVVDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJaWYgKHNiX2RzcF9jb21tYW5kKGRldmMsIDB4MjQpKQkJLyogOCBiaXQgQURDIHVzaW5nIERNQSAqLworCXsKKwkJc2JfZHNwX2NvbW1hbmQoZGV2YywgKHVuc2lnbmVkIGNoYXIpIChjb3VudCAmIDB4ZmYpKTsKKwkJc2JfZHNwX2NvbW1hbmQoZGV2YywgKHVuc2lnbmVkIGNoYXIpICgoY291bnQgPj4gOCkgJiAweGZmKSk7CisJfQorCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZCBCbGFzdGVyOiAgdW5hYmxlIHRvIHN0YXJ0IEFEQy5cbiIpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCWRldmMtPmludHJfYWN0aXZlID0gMTsKK30KKworc3RhdGljIHZvaWQgc2IxX2F1ZGlvX3RyaWdnZXIoaW50IGRldiwgaW50IGJpdHMpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWJpdHMgJj0gZGV2Yy0+aXJxX21vZGU7CisKKwlpZiAoIWJpdHMpCisJCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4ZDApOwkvKiBIYWx0IERNQSAqLworCWVsc2UKKwl7CisJCXN3aXRjaCAoZGV2Yy0+aXJxX21vZGUpCisJCXsKKwkJCWNhc2UgSU1PREVfSU5QVVQ6CisJCQkJc2IxX2F1ZGlvX3N0YXJ0X2lucHV0KGRldiwgZGV2Yy0+dHJnX2J1ZiwgZGV2Yy0+dHJnX2J5dGVzLAorCQkJCQkJZGV2Yy0+dHJnX2ludHJmbGFnKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJTU9ERV9PVVRQVVQ6CisJCQkJc2IxX2F1ZGlvX291dHB1dF9ibG9jayhkZXYsIGRldmMtPnRyZ19idWYsIGRldmMtPnRyZ19ieXRlcywKKwkJCQkJCWRldmMtPnRyZ19pbnRyZmxhZyk7CisJCQkJYnJlYWs7CisJCX0KKwl9CisJZGV2Yy0+dHJpZ2dlcl9iaXRzID0gYml0czsKK30KKworc3RhdGljIGludCBzYjFfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJaWYgKHNiX2RzcF9jb21tYW5kKGRldmMsIDB4NDApKQorCQlzYl9kc3BfY29tbWFuZChkZXZjLCBkZXZjLT50Y29uc3QpOworCXNiX2RzcF9jb21tYW5kKGRldmMsIERTUF9DTURfU1BLT0ZGKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisKKwlkZXZjLT50cmlnZ2VyX2JpdHMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNiMV9hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJaWYgKHNiX2RzcF9jb21tYW5kKGRldmMsIDB4NDApKQorCQlzYl9kc3BfY29tbWFuZChkZXZjLCBkZXZjLT50Y29uc3QpOworCXNiX2RzcF9jb21tYW5kKGRldmMsIERTUF9DTURfU1BLT04pOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlkZXZjLT50cmlnZ2VyX2JpdHMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNiMV9hdWRpb19zZXRfc3BlZWQoaW50IGRldiwgaW50IHNwZWVkKQoreworCWludCBtYXhfc3BlZWQgPSAyMzAwMDsKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCWludCB0bXA7CisKKwlpZiAoZGV2Yy0+b3BlbmVkICYgT1BFTl9SRUFEKQorCQltYXhfc3BlZWQgPSAxMzAwMDsKKworCWlmIChzcGVlZCA+IDApCisJeworCQlpZiAoc3BlZWQgPCA0MDAwKQorCQkJc3BlZWQgPSA0MDAwOworCisJCWlmIChzcGVlZCA+IG1heF9zcGVlZCkKKwkJCXNwZWVkID0gbWF4X3NwZWVkOworCisJCWRldmMtPnRjb25zdCA9ICgyNTYgLSAoKDEwMDAwMDAgKyBzcGVlZCAvIDIpIC8gc3BlZWQpKSAmIDB4ZmY7CisJCXRtcCA9IDI1NiAtIGRldmMtPnRjb25zdDsKKwkJc3BlZWQgPSAoMTAwMDAwMCArIHRtcCAvIDIpIC8gdG1wOworCisJCWRldmMtPnNwZWVkID0gc3BlZWQ7CisJfQorCXJldHVybiBkZXZjLT5zcGVlZDsKK30KKworc3RhdGljIHNob3J0IHNiMV9hdWRpb19zZXRfY2hhbm5lbHMoaW50IGRldiwgc2hvcnQgY2hhbm5lbHMpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlyZXR1cm4gZGV2Yy0+Y2hhbm5lbHMgPSAxOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNiMV9hdWRpb19zZXRfYml0cyhpbnQgZGV2LCB1bnNpZ25lZCBpbnQgYml0cykKK3sKKwlzYl9kZXZjICAgICAgICAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlyZXR1cm4gZGV2Yy0+Yml0cyA9IDg7Cit9CisKK3N0YXRpYyB2b2lkIHNiMV9hdWRpb19oYWx0X3hmZXIoaW50IGRldikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCXNiX2RzcF9yZXNldChkZXZjKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qCisgKiBTQiAyLjAgYW5kIFNCIDIuMDEgY29tcGF0aWJsZSByb3V0aW5lcworICovCisKK3N0YXRpYyB2b2lkIHNiMjBfYXVkaW9fb3V0cHV0X2Jsb2NrKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgbnJfYnl0ZXMsCisJCQlpbnQgaW50cmZsYWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQgPSBucl9ieXRlczsKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGNoYXIgY21kOworCisJLyogRE1BYnVmX3N0YXJ0X2RtYSAoZGV2LCBidWYsIGNvdW50LCBETUFfTU9ERV9XUklURSk7ICovCisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID4gMykKKwkJY291bnQgPj49IDE7CisJY291bnQtLTsKKworCWRldmMtPmlycV9tb2RlID0gSU1PREVfT1VUUFVUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc2JfZHNwX2NvbW1hbmQoZGV2YywgMHg0OCkpCQkvKiBEU1AgQmxvY2sgc2l6ZSAqLworCXsKKwkJc2JfZHNwX2NvbW1hbmQoZGV2YywgKHVuc2lnbmVkIGNoYXIpIChjb3VudCAmIDB4ZmYpKTsKKwkJc2JfZHNwX2NvbW1hbmQoZGV2YywgKHVuc2lnbmVkIGNoYXIpICgoY291bnQgPj4gOCkgJiAweGZmKSk7CisKKwkJaWYgKGRldmMtPnNwZWVkICogZGV2Yy0+Y2hhbm5lbHMgPD0gMjMwMDApCisJCQljbWQgPSAweDFjOwkvKiA4IGJpdCBQQ00gb3V0cHV0ICovCisJCWVsc2UKKwkJCWNtZCA9IDB4OTA7CS8qIDggYml0IGhpZ2ggc3BlZWQgUENNIG91dHB1dCAoU0IyLjAxL1BybykgKi8KKworCQlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIGNtZCkpCisJCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kIEJsYXN0ZXI6ICB1bmFibGUgdG8gc3RhcnQgREFDLlxuIik7CisJfQorCWVsc2UKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZCBCbGFzdGVyOiB1bmFibGUgdG8gc3RhcnQgREFDLlxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWRldmMtPmludHJfYWN0aXZlID0gMTsKK30KKworc3RhdGljIHZvaWQgc2IyMF9hdWRpb19zdGFydF9pbnB1dChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IG5yX2J5dGVzLCBpbnQgaW50cmZsYWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQgPSBucl9ieXRlczsKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGNoYXIgY21kOworCisJLyoKKwkgKiBTdGFydCBhIERNQSBpbnB1dCB0byB0aGUgYnVmZmVyIHBvaW50ZWQgYnkgZG1hcXRhaWwKKwkgKi8KKworCS8qIERNQWJ1Zl9zdGFydF9kbWEgKGRldiwgYnVmLCBjb3VudCwgRE1BX01PREVfUkVBRCk7ICovCisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID4gMykKKwkJY291bnQgPj49IDE7CisJY291bnQtLTsKKworCWRldmMtPmlycV9tb2RlID0gSU1PREVfSU5QVVQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWlmIChzYl9kc3BfY29tbWFuZChkZXZjLCAweDQ4KSkJCS8qIERTUCBCbG9jayBzaXplICovCisJeworCQlzYl9kc3BfY29tbWFuZChkZXZjLCAodW5zaWduZWQgY2hhcikgKGNvdW50ICYgMHhmZikpOworCQlzYl9kc3BfY29tbWFuZChkZXZjLCAodW5zaWduZWQgY2hhcikgKChjb3VudCA+PiA4KSAmIDB4ZmYpKTsKKworCQlpZiAoZGV2Yy0+c3BlZWQgKiBkZXZjLT5jaGFubmVscyA8PSAoZGV2Yy0+bWFqb3IgPT0gMyA/IDIzMDAwIDogMTMwMDApKQorCQkJY21kID0gMHgyYzsJLyogOCBiaXQgUENNIGlucHV0ICovCisJCWVsc2UKKwkJCWNtZCA9IDB4OTg7CS8qIDggYml0IGhpZ2ggc3BlZWQgUENNIGlucHV0IChTQjIuMDEvUHJvKSAqLworCisJCWlmICghc2JfZHNwX2NvbW1hbmQoZGV2YywgY21kKSkKKwkJCXByaW50ayhLRVJOX0VSUiAiU291bmQgQmxhc3RlcjogIHVuYWJsZSB0byBzdGFydCBBREMuXG4iKTsKKwl9CisJZWxzZQorCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kIEJsYXN0ZXI6ICB1bmFibGUgdG8gc3RhcnQgQURDLlxuIik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWRldmMtPmludHJfYWN0aXZlID0gMTsKK30KKworc3RhdGljIHZvaWQgc2IyMF9hdWRpb190cmlnZ2VyKGludCBkZXYsIGludCBiaXRzKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJYml0cyAmPSBkZXZjLT5pcnFfbW9kZTsKKworCWlmICghYml0cykKKwkJc2JfZHNwX2NvbW1hbmQoZGV2YywgMHhkMCk7CS8qIEhhbHQgRE1BICovCisJZWxzZQorCXsKKwkJc3dpdGNoIChkZXZjLT5pcnFfbW9kZSkKKwkJeworCQkJY2FzZSBJTU9ERV9JTlBVVDoKKwkJCQlzYjIwX2F1ZGlvX3N0YXJ0X2lucHV0KGRldiwgZGV2Yy0+dHJnX2J1ZiwgZGV2Yy0+dHJnX2J5dGVzLAorCQkJCQkJZGV2Yy0+dHJnX2ludHJmbGFnKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJTU9ERV9PVVRQVVQ6CisJCQkJc2IyMF9hdWRpb19vdXRwdXRfYmxvY2soZGV2LCBkZXZjLT50cmdfYnVmLCBkZXZjLT50cmdfYnl0ZXMsCisJCQkJCQlkZXZjLT50cmdfaW50cmZsYWcpOworCQkJICAgIGJyZWFrOworCQl9CisJfQorCWRldmMtPnRyaWdnZXJfYml0cyA9IGJpdHM7Cit9CisKKy8qCisgKiBTQjIuMDEgc3BlY2lmaWMgc3BlZWQgc2V0dXAKKyAqLworCitzdGF0aWMgaW50IHNiMjAxX2F1ZGlvX3NldF9zcGVlZChpbnQgZGV2LCBpbnQgc3BlZWQpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwlpbnQgdG1wOworCWludCBzID0gc3BlZWQgKiBkZXZjLT5jaGFubmVsczsKKworCWlmIChzcGVlZCA+IDApCisJeworCQlpZiAoc3BlZWQgPCA0MDAwKQorCQkJc3BlZWQgPSA0MDAwOworCQlpZiAoc3BlZWQgPiA0NDEwMCkKKwkJCXNwZWVkID0gNDQxMDA7CisJCWlmIChkZXZjLT5vcGVuZWQgJiBPUEVOX1JFQUQgJiYgc3BlZWQgPiAxNTAwMCkKKwkJCXNwZWVkID0gMTUwMDA7CisJCWRldmMtPnRjb25zdCA9ICgyNTYgLSAoKDEwMDAwMDAgKyBzIC8gMikgLyBzKSkgJiAweGZmOworCQl0bXAgPSAyNTYgLSBkZXZjLT50Y29uc3Q7CisJCXNwZWVkID0gKCgxMDAwMDAwICsgdG1wIC8gMikgLyB0bXApIC8gZGV2Yy0+Y2hhbm5lbHM7CisKKwkJZGV2Yy0+c3BlZWQgPSBzcGVlZDsKKwl9CisJcmV0dXJuIGRldmMtPnNwZWVkOworfQorCisvKgorICogU0IgUHJvIHNwZWNpZmljIHJvdXRpbmVzCisgKi8KKworc3RhdGljIGludCBzYnByb19hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CQkJCS8qIEZvciBTQiBQcm8gYW5kIEphenoxNiAqLworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGJpdHMgPSAwOworCisJaWYgKGRldmMtPmRtYTE2ID49IDAgJiYgZGV2Yy0+ZG1hMTYgIT0gZGV2Yy0+ZG1hOCkKKwkJYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID0gYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEgPQorCQkJZGV2Yy0+Yml0cyA9PSAxNiA/IGRldmMtPmRtYTE2IDogZGV2Yy0+ZG1hODsKKworCWlmIChkZXZjLT5tb2RlbCA9PSBNRExfSkFaWiB8fCBkZXZjLT5tb2RlbCA9PSBNRExfU01XKQorCQlpZiAoZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSkKKwkJCWJpdHMgPSAweDA0OwkvKiAxNiBiaXQgbW9kZSAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc2JfZHNwX2NvbW1hbmQoZGV2YywgMHg0MCkpCisJCXNiX2RzcF9jb21tYW5kKGRldmMsIGRldmMtPnRjb25zdCk7CisJc2JfZHNwX2NvbW1hbmQoZGV2YywgRFNQX0NNRF9TUEtPRkYpOworCWlmIChkZXZjLT5jaGFubmVscyA9PSAxKQorCQlzYl9kc3BfY29tbWFuZChkZXZjLCAweGEwIHwgYml0cyk7CS8qIE1vbm8gaW5wdXQgKi8KKwllbHNlCisJCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4YTggfCBiaXRzKTsJLyogU3RlcmVvIGlucHV0ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJZGV2Yy0+dHJpZ2dlcl9iaXRzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYnByb19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQorewkJCQkvKiBGb3IgU0IgUHJvIGFuZCBKYXp6MTYgKi8KKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB0bXA7CisJdW5zaWduZWQgY2hhciBiaXRzID0gMDsKKworCWlmIChkZXZjLT5kbWExNiA+PSAwICYmIGRldmMtPmRtYTE2ICE9IGRldmMtPmRtYTgpCisJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hID0gZGV2Yy0+Yml0cyA9PSAxNiA/IGRldmMtPmRtYTE2IDogZGV2Yy0+ZG1hODsKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX1NCUFJPKQorCQlzYl9taXhlcl9zZXRfc3RlcmVvKGRldmMsIGRldmMtPmNoYW5uZWxzID09IDIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoc2JfZHNwX2NvbW1hbmQoZGV2YywgMHg0MCkpCisJCXNiX2RzcF9jb21tYW5kKGRldmMsIGRldmMtPnRjb25zdCk7CisJc2JfZHNwX2NvbW1hbmQoZGV2YywgRFNQX0NNRF9TUEtPTik7CisKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX0pBWlogfHwgZGV2Yy0+bW9kZWwgPT0gTURMX1NNVykKKwl7CisJCWlmIChkZXZjLT5iaXRzID09IEFGTVRfUzE2X0xFKQorCQkJYml0cyA9IDB4MDQ7CS8qIDE2IGJpdCBtb2RlICovCisKKwkJaWYgKGRldmMtPmNoYW5uZWxzID09IDEpCisJCQlzYl9kc3BfY29tbWFuZChkZXZjLCAweGEwIHwgYml0cyk7CS8qIE1vbm8gb3V0cHV0ICovCisJCWVsc2UKKwkJCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4YTggfCBiaXRzKTsJLyogU3RlcmVvIG91dHB1dCAqLworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJfQorCWVsc2UKKwl7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwkJdG1wID0gc2JfZ2V0bWl4ZXIoZGV2YywgMHgwZSk7CisJCWlmIChkZXZjLT5jaGFubmVscyA9PSAxKQorCQkJdG1wICY9IH4weDAyOworCQllbHNlCisJCQl0bXAgfD0gMHgwMjsKKwkJc2Jfc2V0bWl4ZXIoZGV2YywgMHgwZSwgdG1wKTsKKwl9CisJZGV2Yy0+dHJpZ2dlcl9iaXRzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYnByb19hdWRpb19zZXRfc3BlZWQoaW50IGRldiwgaW50IHNwZWVkKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoc3BlZWQgPiAwKQorCXsKKwkJaWYgKHNwZWVkIDwgNDAwMCkKKwkJCXNwZWVkID0gNDAwMDsKKwkJaWYgKHNwZWVkID4gNDQxMDApCisJCQlzcGVlZCA9IDQ0MTAwOworCQlpZiAoZGV2Yy0+Y2hhbm5lbHMgPiAxICYmIHNwZWVkID4gMjIwNTApCisJCQlzcGVlZCA9IDIyMDUwOworCQlzYjIwMV9hdWRpb19zZXRfc3BlZWQoZGV2LCBzcGVlZCk7CisJfQorCXJldHVybiBkZXZjLT5zcGVlZDsKK30KKworc3RhdGljIHNob3J0IHNicHJvX2F1ZGlvX3NldF9jaGFubmVscyhpbnQgZGV2LCBzaG9ydCBjaGFubmVscykKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGNoYW5uZWxzID09IDEgfHwgY2hhbm5lbHMgPT0gMikKKwl7CisJCWlmIChjaGFubmVscyAhPSBkZXZjLT5jaGFubmVscykKKwkJeworCQkJZGV2Yy0+Y2hhbm5lbHMgPSBjaGFubmVsczsKKwkJCWlmIChkZXZjLT5tb2RlbCA9PSBNRExfU0JQUk8gJiYgZGV2Yy0+Y2hhbm5lbHMgPT0gMikKKwkJCQlzYnByb19hdWRpb19zZXRfc3BlZWQoZGV2LCBkZXZjLT5zcGVlZCk7CisJCX0KKwl9CisJcmV0dXJuIGRldmMtPmNoYW5uZWxzOworfQorCitzdGF0aWMgaW50IGphenoxNl9hdWRpb19zZXRfc3BlZWQoaW50IGRldiwgaW50IHNwZWVkKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoc3BlZWQgPiAwKQorCXsKKwkJaW50IHRtcDsKKwkJaW50IHMgPSBzcGVlZCAqIGRldmMtPmNoYW5uZWxzOworCisJCWlmIChzcGVlZCA8IDUwMDApCisJCQlzcGVlZCA9IDUwMDA7CisJCWlmIChzcGVlZCA+IDQ0MTAwKQorCQkJc3BlZWQgPSA0NDEwMDsKKworCQlkZXZjLT50Y29uc3QgPSAoMjU2IC0gKCgxMDAwMDAwICsgcyAvIDIpIC8gcykpICYgMHhmZjsKKworCQl0bXAgPSAyNTYgLSBkZXZjLT50Y29uc3Q7CisJCXNwZWVkID0gKCgxMDAwMDAwICsgdG1wIC8gMikgLyB0bXApIC8gZGV2Yy0+Y2hhbm5lbHM7CisKKwkJZGV2Yy0+c3BlZWQgPSBzcGVlZDsKKwl9CisJcmV0dXJuIGRldmMtPnNwZWVkOworfQorCisvKgorICogU0IxNiBzcGVjaWZpYyByb3V0aW5lcworICovCisKK3N0YXRpYyBpbnQgc2IxNl9hdWRpb19zZXRfc3BlZWQoaW50IGRldiwgaW50IHNwZWVkKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJaW50CW1heF9zcGVlZCA9IGRldmMtPnN1Ym1vZGVsID09IFNVQk1ETF9BTFMxMDAgPyA0ODAwMCA6IDQ0MTAwOworCisJaWYgKHNwZWVkID4gMCkKKwl7CisJCWlmIChzcGVlZCA8IDUwMDApCisJCQlzcGVlZCA9IDUwMDA7CisKKwkJaWYgKHNwZWVkID4gbWF4X3NwZWVkKQorCQkJc3BlZWQgPSBtYXhfc3BlZWQ7CisKKwkJZGV2Yy0+c3BlZWQgPSBzcGVlZDsKKwl9CisJcmV0dXJuIGRldmMtPnNwZWVkOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNiMTZfYXVkaW9fc2V0X2JpdHMoaW50IGRldiwgdW5zaWduZWQgaW50IGJpdHMpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmIChiaXRzICE9IDApCisJeworCQlpZiAoYml0cyA9PSBBRk1UX1U4IHx8IGJpdHMgPT0gQUZNVF9TMTZfTEUpCisJCQlkZXZjLT5iaXRzID0gYml0czsKKwkJZWxzZQorCQkJZGV2Yy0+Yml0cyA9IEFGTVRfVTg7CisJfQorCisJcmV0dXJuIGRldmMtPmJpdHM7Cit9CisKK3N0YXRpYyBpbnQgc2IxNl9hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmICghZGV2Yy0+ZnVsbGR1cGxleCkKKwl7CisJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA9CisJCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSA9CisJCQkJZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSA/CisJCQkJCWRldmMtPmRtYTE2IDogZGV2Yy0+ZG1hODsKKwl9CisJZWxzZSBpZiAoZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSkKKwl7CisJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA9IGRldmMtPmRtYTg7CisJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hID0gZGV2Yy0+ZG1hMTY7CisJfQorCWVsc2UKKwl7CisJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA9IGRldmMtPmRtYTE2OworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSA9IGRldmMtPmRtYTg7CisJfQorCisJZGV2Yy0+dHJpZ2dlcl9iaXRzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYjE2X2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmICghZGV2Yy0+ZnVsbGR1cGxleCkKKwl7CisJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA9CisJCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSA9CisJCQkJZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSA/CisJCQkJCWRldmMtPmRtYTE2IDogZGV2Yy0+ZG1hODsKKwl9CisJZWxzZSBpZiAoZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSkKKwl7CisJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA9IGRldmMtPmRtYTg7CisJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9pbi0+ZG1hID0gZGV2Yy0+ZG1hMTY7CisJfQorCWVsc2UKKwl7CisJCWF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSA9IGRldmMtPmRtYTE2OworCQlhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW4tPmRtYSA9IGRldmMtPmRtYTg7CisJfQorCisJZGV2Yy0+dHJpZ2dlcl9iaXRzID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2IxNl9hdWRpb19vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwKKwkJCWludCBpbnRyZmxhZykKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3MsIGNudDsKKwlzYl9kZXZjICAgICAgICAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nICAgYml0czsKKworCWlmICghZGV2Yy0+ZnVsbGR1cGxleCB8fCBkZXZjLT5iaXRzID09IEFGTVRfUzE2X0xFKQorCXsKKwkJZGV2Yy0+aXJxX21vZGUgPSBJTU9ERV9PVVRQVVQ7CisJCWRldmMtPmludHJfYWN0aXZlID0gMTsKKwl9CisJZWxzZQorCXsKKwkJZGV2Yy0+aXJxX21vZGVfMTYgPSBJTU9ERV9PVVRQVVQ7CisJCWRldmMtPmludHJfYWN0aXZlXzE2ID0gMTsKKwl9CisKKwkvKiBzYXZlIHZhbHVlICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwliaXRzID0gZGV2Yy0+Yml0czsKKwlpZiAoZGV2Yy0+ZnVsbGR1cGxleCkKKwkJZGV2Yy0+Yml0cyA9IChkZXZjLT5iaXRzID09IEFGTVRfUzE2X0xFKSA/CisJCQlBRk1UX1U4IDogQUZNVF9TMTZfTEU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJY250ID0gY291bnQ7CisJaWYgKGRldmMtPmJpdHMgPT0gQUZNVF9TMTZfTEUpCisJCWNudCA+Pj0gMTsKKwljbnQtLTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisKKwkvKiBETUFidWZfc3RhcnRfZG1hIChkZXYsIGJ1ZiwgY291bnQsIERNQV9NT0RFX1dSSVRFKTsgKi8KKworCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4NDEpOworCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoKGRldmMtPnNwZWVkID4+IDgpICYgMHhmZikpOworCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoZGV2Yy0+c3BlZWQgJiAweGZmKSk7CisKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAoZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSA/IDB4YjYgOiAweGM2KSk7CisJc2JfZHNwX2NvbW1hbmQoZGV2YywgKChkZXZjLT5jaGFubmVscyA9PSAyID8gMHgyMCA6IDApICsKKwkJCSAgICAgIChkZXZjLT5iaXRzID09IEFGTVRfUzE2X0xFID8gMHgxMCA6IDApKSk7CisJc2JfZHNwX2NvbW1hbmQoZGV2YywgKHVuc2lnbmVkIGNoYXIpIChjbnQgJiAweGZmKSk7CisJc2JfZHNwX2NvbW1hbmQoZGV2YywgKHVuc2lnbmVkIGNoYXIpIChjbnQgPj4gOCkpOworCisJLyogcmVzdG9yZSByZWFsIHZhbHVlIGFmdGVyIGFsbCBwcm9ncmFtbWluZyAqLworCWRldmMtPmJpdHMgPSBiaXRzOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKK30KKworCisvKgorICoJVGhpcyBmYWlscyBvbiB0aGUgQ3lyaXggTWVkaWFHWC4gSWYgeW91IGRvbid0IGhhdmUgdGhlIERNQSBlbmFibGVkCisgKgliZWZvcmUgdGhlIGZpcnN0IHNhbXBsZSBhcnJpdmVzIGl0IGxvY2tzIHVwLiBIb3dldmVyIGV2ZW4gaWYgeW91CisgKglkbyBlbmFibGUgdGhlIERNQSBpbiB0aW1lIHlvdSBqdXN0IGdldCBETUEgdGltZW91dHMgYW5kIG1pc3NpbmcKKyAqCWludGVycnVwdHMgYW5kIHN0dWZmLCBzbyBmb3Igbm93IEkndmUgbm90IGJvdGhlcmVkIGZpeGluZyB0aGlzIGVpdGhlci4KKyAqLworIAorc3RhdGljIHZvaWQgc2IxNl9hdWRpb19zdGFydF9pbnB1dChpbnQgZGV2LCB1bnNpZ25lZCBsb25nIGJ1ZiwgaW50IGNvdW50LCBpbnQgaW50cmZsYWcpCit7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzLCBjbnQ7CisJc2JfZGV2YyAgICAgICAgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoIWRldmMtPmZ1bGxkdXBsZXggfHwgZGV2Yy0+Yml0cyAhPSBBRk1UX1MxNl9MRSkKKwl7CisJCWRldmMtPmlycV9tb2RlID0gSU1PREVfSU5QVVQ7CisJCWRldmMtPmludHJfYWN0aXZlID0gMTsKKwl9CisJZWxzZQorCXsKKwkJZGV2Yy0+aXJxX21vZGVfMTYgPSBJTU9ERV9JTlBVVDsKKwkJZGV2Yy0+aW50cl9hY3RpdmVfMTYgPSAxOworCX0KKworCWNudCA9IGNvdW50OworCWlmIChkZXZjLT5iaXRzID09IEFGTVRfUzE2X0xFKQorCQljbnQgPj49IDE7CisJY250LS07CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJLyogRE1BYnVmX3N0YXJ0X2RtYSAoZGV2LCBidWYsIGNvdW50LCBETUFfTU9ERV9SRUFEKTsgKi8KKworCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4NDIpOworCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoKGRldmMtPnNwZWVkID4+IDgpICYgMHhmZikpOworCXNiX2RzcF9jb21tYW5kKGRldmMsICh1bnNpZ25lZCBjaGFyKSAoZGV2Yy0+c3BlZWQgJiAweGZmKSk7CisKKwlzYl9kc3BfY29tbWFuZChkZXZjLCAoZGV2Yy0+Yml0cyA9PSBBRk1UX1MxNl9MRSA/IDB4YmUgOiAweGNlKSk7CisJc2JfZHNwX2NvbW1hbmQoZGV2YywgKChkZXZjLT5jaGFubmVscyA9PSAyID8gMHgyMCA6IDApICsKKwkJCSAgICAgIChkZXZjLT5iaXRzID09IEFGTVRfUzE2X0xFID8gMHgxMCA6IDApKSk7CisJc2JfZHNwX2NvbW1hbmQoZGV2YywgKHVuc2lnbmVkIGNoYXIpIChjbnQgJiAweGZmKSk7CisJc2JfZHNwX2NvbW1hbmQoZGV2YywgKHVuc2lnbmVkIGNoYXIpIChjbnQgPj4gOCkpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzYjE2X2F1ZGlvX3RyaWdnZXIoaW50IGRldiwgaW50IGJpdHMpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWludCBiaXRzXzE2ID0gYml0cyAmIGRldmMtPmlycV9tb2RlXzE2OworCWJpdHMgJj0gZGV2Yy0+aXJxX21vZGU7CisKKwlpZiAoIWJpdHMgJiYgIWJpdHNfMTYpCisJCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4ZDApOwkvKiBIYWx0IERNQSAqLworCWVsc2UKKwl7CisJCWlmIChiaXRzKQorCQl7CisJCQlzd2l0Y2ggKGRldmMtPmlycV9tb2RlKQorCQkJeworCQkJCWNhc2UgSU1PREVfSU5QVVQ6CisJCQkJCXNiMTZfYXVkaW9fc3RhcnRfaW5wdXQoZGV2LAorCQkJCQkJCWRldmMtPnRyZ19idWYsCisJCQkJCQkJZGV2Yy0+dHJnX2J5dGVzLAorCQkJCQkJCWRldmMtPnRyZ19pbnRyZmxhZyk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBJTU9ERV9PVVRQVVQ6CisJCQkJCXNiMTZfYXVkaW9fb3V0cHV0X2Jsb2NrKGRldiwKKwkJCQkJCQlkZXZjLT50cmdfYnVmLAorCQkJCQkJCWRldmMtPnRyZ19ieXRlcywKKwkJCQkJCQlkZXZjLT50cmdfaW50cmZsYWcpOworCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoYml0c18xNikKKwkJeworCQkJc3dpdGNoIChkZXZjLT5pcnFfbW9kZV8xNikKKwkJCXsKKwkJCQljYXNlIElNT0RFX0lOUFVUOgorCQkJCQlzYjE2X2F1ZGlvX3N0YXJ0X2lucHV0KGRldiwKKwkJCQkJCQlkZXZjLT50cmdfYnVmXzE2LAorCQkJCQkJCWRldmMtPnRyZ19ieXRlc18xNiwKKwkJCQkJCQlkZXZjLT50cmdfaW50cmZsYWdfMTYpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgSU1PREVfT1VUUFVUOgorCQkJCQlzYjE2X2F1ZGlvX291dHB1dF9ibG9jayhkZXYsCisJCQkJCQkJZGV2Yy0+dHJnX2J1Zl8xNiwKKwkJCQkJCQlkZXZjLT50cmdfYnl0ZXNfMTYsCisJCQkJCQkJZGV2Yy0+dHJnX2ludHJmbGFnXzE2KTsKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlkZXZjLT50cmlnZ2VyX2JpdHMgPSBiaXRzIHwgYml0c18xNjsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGJ1ZjhbMjA0OF07CitzdGF0aWMgc2lnbmVkIHNob3J0ICpsYnVmMTYgPSAoc2lnbmVkIHNob3J0ICopbGJ1Zjg7CisjZGVmaW5lIExCVUZDT1BZU0laRSAxMDI0CitzdGF0aWMgdm9pZAorc2IxNl9jb3B5X2Zyb21fdXNlcihpbnQgZGV2LAorCQljaGFyICpsb2NhbGJ1ZiwgaW50IGxvY2Fsb2ZmcywKKwkJY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsIGludCB1c2Vyb2ZmcywKKwkJaW50IG1heF9pbiwgaW50IG1heF9vdXQsCisJCWludCAqdXNlZCwgaW50ICpyZXR1cm5lZCwKKwkJaW50IGxlbikKK3sKKwlzYl9kZXZjICAgICAgICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCWludCAgICAgICAgICAgaSwgYywgcCwgbG9jYWxsZW47CisJdW5zaWduZWQgY2hhciAqYnVmODsKKwlzaWduZWQgc2hvcnQgICpidWYxNjsKKworCS8qIGlmIG5vdCBkdXBsZXggbm8gY29udmVyc2lvbiAqLworCWlmICghZGV2Yy0+ZnVsbGR1cGxleCkKKwl7CisJCWlmIChjb3B5X2Zyb21fdXNlcihsb2NhbGJ1ZiArIGxvY2Fsb2ZmcywKKwkJCQkgICB1c2VyYnVmICsgdXNlcm9mZnMsIGxlbikpCisJCQlyZXR1cm47CisJCSp1c2VkID0gbGVuOworCQkqcmV0dXJuZWQgPSBsZW47CisJfQorCWVsc2UgaWYgKGRldmMtPmJpdHMgPT0gQUZNVF9TMTZfTEUpCisJeworCQkvKiAxNiAtPiA4ICovCisJCS8qIG1heF9pbiA+PiAxLCBtYXggbnVtYmVyIG9mIHNhbXBsZXMgaW4gKCAxNiBiaXRzICkgKi8KKwkJLyogbWF4X291dCwgbWF4IG51bWJlciBvZiBzYW1wbGVzIG91dCAoIDggYml0cyApICovCisJCS8qIGxlbiwgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCB3aWxsIGJlIHRha2VuICggMTYgYml0cyApKi8KKwkJLyogYywgY291bnQgb2Ygc2FtcGxlcyByZW1haW5pbmcgaW4gYnVmZmVyICggMTYgYml0cyApKi8KKwkJLyogcCwgY291bnQgb2Ygc2FtcGxlcyBhbHJlYWR5IHByb2Nlc3NlZCAoIDE2IGJpdHMgKSovCisJCWxlbiA9ICggKG1heF9pbiA+PiAxKSA+IG1heF9vdXQpID8gbWF4X291dCA6IChtYXhfaW4gPj4gMSk7CisJCWMgPSBsZW47CisJCXAgPSAwOworCQlidWY4ID0gKHVuc2lnbmVkIGNoYXIgKikobG9jYWxidWYgKyBsb2NhbG9mZnMpOworCQl3aGlsZSAoYykKKwkJeworCQkJbG9jYWxsZW4gPSAoYyA+PSBMQlVGQ09QWVNJWkUgPyBMQlVGQ09QWVNJWkUgOiBjKTsKKwkJCS8qIDw8IDEgaW4gb3JkZXIgdG8gZ2V0IDE2IGJpdCBzYW1wbGVzICovCisJCQlpZiAoY29weV9mcm9tX3VzZXIobGJ1ZjE2LAorCQkJCQkgICB1c2VyYnVmICsgdXNlcm9mZnMgKyAocCA8PCAxKSwKKwkJCQkJICAgbG9jYWxsZW4gPDwgMSkpCisJCQkJcmV0dXJuOworCQkJZm9yIChpID0gMDsgaSA8IGxvY2FsbGVuOyBpKyspCisJCQl7CisJCQkJYnVmOFtwK2ldID0gfigobGJ1ZjE2W2ldID4+IDgpICYgMHhmZikgXiAweDgwOworCQkJfQorCQkJYyAtPSBsb2NhbGxlbjsgcCArPSBsb2NhbGxlbjsKKwkJfQorCQkvKiB1c2VkID0gKCBzYW1wbGVzICogMTYgYml0cyBzaXplICkgKi8KKwkJKnVzZWQgPSAgbWF4X2luICA+ICggbWF4X291dCA8PCAxKSA/IChtYXhfb3V0IDw8IDEpIDogbWF4X2luOworCQkvKiByZXR1cm5lZCA9ICggc2FtcGxlcyAqIDggYml0cyBzaXplICkgKi8KKwkJKnJldHVybmVkID0gbGVuOworCX0KKwllbHNlCisJeworCQkvKiA4IC0+IDE2ICovCisJCS8qIG1heF9pbiwgbWF4IG51bWJlciBvZiBzYW1wbGVzIGluICggOCBiaXRzICkgKi8KKwkJLyogbWF4X291dCA+PiAxLCBtYXggbnVtYmVyIG9mIHNhbXBsZXMgb3V0ICggMTYgYml0cyApICovCisJCS8qIGxlbiwgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCB3aWxsIGJlIHRha2VuICggOCBiaXRzICkqLworCQkvKiBjLCBjb3VudCBvZiBzYW1wbGVzIHJlbWFpbmluZyBpbiBidWZmZXIgKCA4IGJpdHMgKSovCisJCS8qIHAsIGNvdW50IG9mIHNhbXBsZXMgYWxyZWFkeSBwcm9jZXNzZWQgKCA4IGJpdHMgKSovCisJCWxlbiA9IG1heF9pbiA+IChtYXhfb3V0ID4+IDEpID8gKG1heF9vdXQgPj4gMSkgOiBtYXhfaW47CisJCWMgPSBsZW47CisJCXAgPSAwOworCQlidWYxNiA9IChzaWduZWQgc2hvcnQgKikobG9jYWxidWYgKyBsb2NhbG9mZnMpOworCQl3aGlsZSAoYykKKwkJeworCQkJbG9jYWxsZW4gPSAoYyA+PSBMQlVGQ09QWVNJWkUgPyBMQlVGQ09QWVNJWkUgOiBjKTsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihsYnVmOCwKKwkJCQkJICAgdXNlcmJ1Zit1c2Vyb2ZmcyArIHAsCisJCQkJCSAgIGxvY2FsbGVuKSkKKwkJCQlyZXR1cm47CisJCQlmb3IgKGkgPSAwOyBpIDwgbG9jYWxsZW47IGkrKykKKwkJCXsKKwkJCQlidWYxNltwK2ldID0gKH5sYnVmOFtpXSBeIDB4ODApIDw8IDg7CisJCQl9CisJICAgICAgCQljIC09IGxvY2FsbGVuOyBwICs9IGxvY2FsbGVuOworCQl9CisJCS8qIHVzZWQgPSAoIHNhbXBsZXMgKiA4IGJpdHMgc2l6ZSApICovCisJCSp1c2VkID0gbGVuOworCQkvKiByZXR1cm5lZCA9ICggc2FtcGxlcyAqIDE2IGJpdHMgc2l6ZSApICovCisJCSpyZXR1cm5lZCA9IGxlbiA8PCAxOworCX0KK30KKworc3RhdGljIHZvaWQKK3NiMTZfYXVkaW9fbW1hcChpbnQgZGV2KQoreworCXNiX2RldmMgICAgICAgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJZGV2Yy0+ZnVsbGR1cGxleCA9IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIHNiMV9hdWRpb19kcml2ZXIgPQkvKiBTQjEueCAqLworeworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCQk9IHNiX2F1ZGlvX29wZW4sCisJLmNsb3NlCQkJPSBzYl9hdWRpb19jbG9zZSwKKwkub3V0cHV0X2Jsb2NrCQk9IHNiX3NldF9vdXRwdXRfcGFybXMsCisJLnN0YXJ0X2lucHV0CQk9IHNiX3NldF9pbnB1dF9wYXJtcywKKwkucHJlcGFyZV9mb3JfaW5wdXQJPSBzYjFfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQsCisJLnByZXBhcmVfZm9yX291dHB1dAk9IHNiMV9hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQsCisJLmhhbHRfaW8JCT0gc2IxX2F1ZGlvX2hhbHRfeGZlciwKKwkudHJpZ2dlcgkJPSBzYjFfYXVkaW9fdHJpZ2dlciwKKwkuc2V0X3NwZWVkCQk9IHNiMV9hdWRpb19zZXRfc3BlZWQsCisJLnNldF9iaXRzCQk9IHNiMV9hdWRpb19zZXRfYml0cywKKwkuc2V0X2NoYW5uZWxzCQk9IHNiMV9hdWRpb19zZXRfY2hhbm5lbHMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIHNiMjBfYXVkaW9fZHJpdmVyID0JLyogU0IyLjAgKi8KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBzYl9hdWRpb19vcGVuLAorCS5jbG9zZQkJCT0gc2JfYXVkaW9fY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBzYl9zZXRfb3V0cHV0X3Bhcm1zLAorCS5zdGFydF9pbnB1dAkJPSBzYl9zZXRfaW5wdXRfcGFybXMsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gc2IxX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBzYjFfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0LAorCS5oYWx0X2lvCQk9IHNiMV9hdWRpb19oYWx0X3hmZXIsCisJLnRyaWdnZXIJCT0gc2IyMF9hdWRpb190cmlnZ2VyLAorCS5zZXRfc3BlZWQJCT0gc2IxX2F1ZGlvX3NldF9zcGVlZCwKKwkuc2V0X2JpdHMJCT0gc2IxX2F1ZGlvX3NldF9iaXRzLAorCS5zZXRfY2hhbm5lbHMJCT0gc2IxX2F1ZGlvX3NldF9jaGFubmVscworfTsKKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgc2IyMDFfYXVkaW9fZHJpdmVyID0JCS8qIFNCMi4wMSAqLworeworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCQk9IHNiX2F1ZGlvX29wZW4sCisJLmNsb3NlCQkJPSBzYl9hdWRpb19jbG9zZSwKKwkub3V0cHV0X2Jsb2NrCQk9IHNiX3NldF9vdXRwdXRfcGFybXMsCisJLnN0YXJ0X2lucHV0CQk9IHNiX3NldF9pbnB1dF9wYXJtcywKKwkucHJlcGFyZV9mb3JfaW5wdXQJPSBzYjFfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQsCisJLnByZXBhcmVfZm9yX291dHB1dAk9IHNiMV9hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQsCisJLmhhbHRfaW8JCT0gc2IxX2F1ZGlvX2hhbHRfeGZlciwKKwkudHJpZ2dlcgkJPSBzYjIwX2F1ZGlvX3RyaWdnZXIsCisJLnNldF9zcGVlZAkJPSBzYjIwMV9hdWRpb19zZXRfc3BlZWQsCisJLnNldF9iaXRzCQk9IHNiMV9hdWRpb19zZXRfYml0cywKKwkuc2V0X2NoYW5uZWxzCQk9IHNiMV9hdWRpb19zZXRfY2hhbm5lbHMKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIHNicHJvX2F1ZGlvX2RyaXZlciA9CQkvKiBTQiBQcm8gKi8KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBzYl9hdWRpb19vcGVuLAorCS5jbG9zZQkJCT0gc2JfYXVkaW9fY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBzYl9zZXRfb3V0cHV0X3Bhcm1zLAorCS5zdGFydF9pbnB1dAkJPSBzYl9zZXRfaW5wdXRfcGFybXMsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gc2Jwcm9fYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQsCisJLnByZXBhcmVfZm9yX291dHB1dAk9IHNicHJvX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dCwKKwkuaGFsdF9pbwkJPSBzYjFfYXVkaW9faGFsdF94ZmVyLAorCS50cmlnZ2VyCQk9IHNiMjBfYXVkaW9fdHJpZ2dlciwKKwkuc2V0X3NwZWVkCQk9IHNicHJvX2F1ZGlvX3NldF9zcGVlZCwKKwkuc2V0X2JpdHMJCT0gc2IxX2F1ZGlvX3NldF9iaXRzLAorCS5zZXRfY2hhbm5lbHMJCT0gc2Jwcm9fYXVkaW9fc2V0X2NoYW5uZWxzCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBqYXp6MTZfYXVkaW9fZHJpdmVyID0JLyogSmF6ejE2IGFuZCBTTSBXYXZlICovCit7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gc2JfYXVkaW9fb3BlbiwKKwkuY2xvc2UJCQk9IHNiX2F1ZGlvX2Nsb3NlLAorCS5vdXRwdXRfYmxvY2sJCT0gc2Jfc2V0X291dHB1dF9wYXJtcywKKwkuc3RhcnRfaW5wdXQJCT0gc2Jfc2V0X2lucHV0X3Bhcm1zLAorCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IHNicHJvX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSBzYnByb19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQsCisJLmhhbHRfaW8JCT0gc2IxX2F1ZGlvX2hhbHRfeGZlciwKKwkudHJpZ2dlcgkJPSBzYjIwX2F1ZGlvX3RyaWdnZXIsCisJLnNldF9zcGVlZAkJPSBqYXp6MTZfYXVkaW9fc2V0X3NwZWVkLAorCS5zZXRfYml0cwkJPSBzYjE2X2F1ZGlvX3NldF9iaXRzLAorCS5zZXRfY2hhbm5lbHMJCT0gc2Jwcm9fYXVkaW9fc2V0X2NoYW5uZWxzCit9OworCitzdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBzYjE2X2F1ZGlvX2RyaXZlciA9CS8qIFNCMTYgKi8KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSBzYl9hdWRpb19vcGVuLAorCS5jbG9zZQkJCT0gc2JfYXVkaW9fY2xvc2UsCisJLm91dHB1dF9ibG9jawkJPSBzYl9zZXRfb3V0cHV0X3Bhcm1zLAorCS5zdGFydF9pbnB1dAkJPSBzYl9zZXRfaW5wdXRfcGFybXMsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gc2IxNl9hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dCwKKwkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gc2IxNl9hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQsCisJLmhhbHRfaW8JCT0gc2IxX2F1ZGlvX2hhbHRfeGZlciwKKwkuY29weV91c2VyCQk9IHNiMTZfY29weV9mcm9tX3VzZXIsCisJLnRyaWdnZXIJCT0gc2IxNl9hdWRpb190cmlnZ2VyLAorCS5zZXRfc3BlZWQJCT0gc2IxNl9hdWRpb19zZXRfc3BlZWQsCisJLnNldF9iaXRzCQk9IHNiMTZfYXVkaW9fc2V0X2JpdHMsCisJLnNldF9jaGFubmVscwkJPSBzYnByb19hdWRpb19zZXRfY2hhbm5lbHMsCisJLm1tYXAJCQk9IHNiMTZfYXVkaW9fbW1hcAorfTsKKwordm9pZCBzYl9hdWRpb19pbml0KHNiX2RldmMgKiBkZXZjLCBjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlpbnQgYXVkaW9fZmxhZ3MgPSAwOworCWludCBmb3JtYXRfbWFzayA9IEFGTVRfVTg7CisKKwlzdHJ1Y3QgYXVkaW9fZHJpdmVyICpkcml2ZXIgPSAmc2IxX2F1ZGlvX2RyaXZlcjsKKworCXN3aXRjaCAoZGV2Yy0+bW9kZWwpCisJeworCQljYXNlIE1ETF9TQjE6CS8qIFNCMS4wIG9yIFNCIDEuNSAqLworCQkJRERCKHByaW50aygiV2lsbCB1c2Ugc3RhbmRhcmQgU0IxLnggZHJpdmVyXG4iKSk7CisJCQlhdWRpb19mbGFncyA9IERNQV9IQVJEU1RPUDsKKwkJCWJyZWFrOworCisJCWNhc2UgTURMX1NCMjoKKwkJCUREQihwcmludGsoIldpbGwgdXNlIFNCMi4wIGRyaXZlclxuIikpOworCQkJYXVkaW9fZmxhZ3MgPSBETUFfQVVUT01PREU7CisJCQlkcml2ZXIgPSAmc2IyMF9hdWRpb19kcml2ZXI7CisJCQlicmVhazsKKworCQljYXNlIE1ETF9TQjIwMToKKwkJCUREQihwcmludGsoIldpbGwgdXNlIFNCMi4wMSAoaGlnaCBzcGVlZCkgZHJpdmVyXG4iKSk7CisJCQlhdWRpb19mbGFncyA9IERNQV9BVVRPTU9ERTsKKwkJCWRyaXZlciA9ICZzYjIwMV9hdWRpb19kcml2ZXI7CisJCQlicmVhazsKKworCQljYXNlIE1ETF9KQVpaOgorCQljYXNlIE1ETF9TTVc6CisJCQlEREIocHJpbnRrKCJXaWxsIHVzZSBKYXp6MTYgZHJpdmVyXG4iKSk7CisJCQlhdWRpb19mbGFncyA9IERNQV9BVVRPTU9ERTsKKwkJCWZvcm1hdF9tYXNrIHw9IEFGTVRfUzE2X0xFOworCQkJZHJpdmVyID0gJmphenoxNl9hdWRpb19kcml2ZXI7CisJCQlicmVhazsKKworCQljYXNlIE1ETF9FU1M6CisJCQlEREIocHJpbnRrKCJXaWxsIHVzZSBFU1MgRVM2ODgvMTY4OCBkcml2ZXJcbiIpKTsKKwkJCWRyaXZlciA9IGVzc19hdWRpb19pbml0IChkZXZjLCAmYXVkaW9fZmxhZ3MsICZmb3JtYXRfbWFzayk7CisJCQlicmVhazsKKworCQljYXNlIE1ETF9TQjE2OgorCQkJRERCKHByaW50aygiV2lsbCB1c2UgU0IxNiBkcml2ZXJcbiIpKTsKKwkJCWF1ZGlvX2ZsYWdzID0gRE1BX0FVVE9NT0RFOworCQkJZm9ybWF0X21hc2sgfD0gQUZNVF9TMTZfTEU7CisJCQlpZiAoZGV2Yy0+ZG1hOCAhPSBkZXZjLT5kbWExNiAmJiBkZXZjLT5kbWExNiAhPSAtMSkKKwkJCXsKKwkJCQlhdWRpb19mbGFncyB8PSBETUFfRFVQTEVYOworCQkJCWRldmMtPmR1cGxleCA9IDE7CisJCQl9CisJCQlkcml2ZXIgPSAmc2IxNl9hdWRpb19kcml2ZXI7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJRERCKHByaW50aygiV2lsbCB1c2UgU0IgUHJvIGRyaXZlclxuIikpOworCQkJYXVkaW9fZmxhZ3MgPSBETUFfQVVUT01PREU7CisJCQlkcml2ZXIgPSAmc2Jwcm9fYXVkaW9fZHJpdmVyOworCX0KKworCWlmIChvd25lcikKKwkJCWRyaXZlci0+b3duZXIgPSBvd25lcjsKKwkKKwlpZiAoKGRldmMtPmRldiA9IHNvdW5kX2luc3RhbGxfYXVkaW9kcnYoQVVESU9fRFJJVkVSX1ZFUlNJT04sCisJCQkJbmFtZSxkcml2ZXIsIHNpemVvZihzdHJ1Y3QgYXVkaW9fZHJpdmVyKSwKKwkJCQlhdWRpb19mbGFncywgZm9ybWF0X21hc2ssIGRldmMsCisJCQkJZGV2Yy0+ZG1hOCwKKwkJCQlkZXZjLT5kdXBsZXggPyBkZXZjLT5kbWExNiA6IGRldmMtPmRtYTgpKSA8IDApCisJeworCQkgIHByaW50ayhLRVJOX0VSUiAiU291bmQgQmxhc3RlcjogIHVuYWJsZSB0byBpbnN0YWxsIGF1ZGlvLlxuIik7CisJCSAgcmV0dXJuOworCX0KKwlhdWRpb19kZXZzW2RldmMtPmRldl0tPm1peGVyX2RldiA9IGRldmMtPm15X21peGVyZGV2OworCWF1ZGlvX2RldnNbZGV2Yy0+ZGV2XS0+bWluX2ZyYWdtZW50ID0gNTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9jYXJkLmMgYi9zb3VuZC9vc3Mvc2JfY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MGI4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2JfY2FyZC5jCkBAIC0wLDAgKzEsMzQ3IEBACisvKgorICogc291bmQvb3NzL3NiX2NhcmQuYworICoKKyAqIERldGVjdGlvbiByb3V0aW5lIGZvciB0aGUgSVNBIFNvdW5kIEJsYXN0ZXIgYW5kIGNvbXBhdGFibGUgc291bmQKKyAqIGNhcmRzLgorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHNvZnR3YXJlIGZvciBtb3JlIGluZm8uCisgKgorICogVGhpcyBpcyBhIGNvbXBsZXRlIHJld3JpdGUgb2YgdGhlIGRldGVjdGlvbiByb3V0aW5lcy4gVGhpcyB3YXMKKyAqIHByb21wdGVkIGJ5IHRoZSBQblAgQVBJIGNoYW5nZSBkdXJpbmcgdjIuNSBhbmQgdGhlIHVnbHkgc3RhdGUgdGhlCisgKiBjb2RlIHdhcyBpbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IFBhdWwgTGF1ZmVyIDIwMDIuIEJhc2VkIG9uIGNvZGUgb3JpZ2luYWxseSBieQorICogSGFubnUgU2F2b2xhaW5lbiB3aGljaCB3YXMgbW9kaWZpZWQgYnkgbWFueSBvdGhlcnMgb3ZlciB0aGUKKyAqIHllYXJzLiBBdXRob3JzIHNwZWNpZmljYWxseSBtZW50aW9uZWQgaW4gdGhlIHByZXZpb3VzIHZlcnNpb24gd2VyZToKKyAqIERhbmllbCBTdG9uZSwgQWxlc3NhbmRybyBadW1tbywgSmVmZiBHYXJ6aWssIEFybmFsZG8gQ2FydmFsaG8gZGUKKyAqIE1lbG8sIERhbmllbCBDaHVyY2gsIGFuZCBteXNlbGYuCisgKgorICogMDItMDUtMjAwMyBPcmlnaW5hbCBSZWxlYXNlLCBQYXVsIExhdWZlciA8cGF1bEBsYXVmZXJuZXQuY29tPgorICogMDItMDctMjAwMyBCdWcgbWFkZSBpdCBpbnRvIGZpcnN0IHJlbGVhc2UuIFRha2UgdHdvLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJzYl9taXhlci5oIgorI2luY2x1ZGUgInNiLmgiCisjaWZkZWYgQ09ORklHX1BOUAorI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorI2VuZGlmIC8qIENPTkZJR19QTlAgKi8KKyNpbmNsdWRlICJzYl9jYXJkLmgiCisKK01PRFVMRV9ERVNDUklQVElPTigiT1NTIFNvdW5kYmxhc3RlciBJU0EgUG5QIGFuZCBsZWdhY3kgc291bmQgZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK2V4dGVybiB2b2lkICpzbXdfZnJlZTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIG1wdV9pbwk9IDA7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8JPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWExNgk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIHR5cGUJPSAwOyAvKiBDYW4gc2V0IHRoaXMgdG8gYSBzcGVjaWZpYyBjYXJkIHR5cGUgKi8KK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBlc3N0eXBlICAgPSAwOyAvKiBFU1MgY2hpcCB0eXBlICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgYWNlciAJPSAwOyAvKiBEbyBhY2VyIG5vdGVib29rIGluaXQ/ICovCitzdGF0aWMgaW50IF9faW5pdGRhdGEgc21fZ2FtZXMgCT0gMDsgLyogTG9naXRlY2ggc291bmRtYW4gZ2FtZXM/ICovCisKK3N0YXRpYyBzdHJ1Y3Qgc2JfY2FyZF9jb25maWcgKmxlZ2FjeSA9IE5VTEw7CisKKyNpZmRlZiBDT05GSUdfUE5QCitzdGF0aWMgaW50IF9faW5pdGRhdGEgcG5wICAgICAgID0gMTsKKy8qCitzdGF0aWMgaW50IF9faW5pdGRhdGEgdWFydDQwMQk9IDA7CisqLworI2Vsc2UKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBwbnAgICAgICAgPSAwOworI2VuZGlmCisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwMDApOworTU9EVUxFX1BBUk1fREVTQyhpbywgICAgICAgIlNvdW5kYmxhc3RlciBpL28gYmFzZSBhZGRyZXNzICgweDIyMCwweDI0MCwweDI2MCwweDI4MCkiKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoaXJxLAkgICAiSVJRICg1LDcsOSwxMCkiKTsKK21vZHVsZV9wYXJhbShkbWEsIGludCwgMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZG1hLAkgICAiOC1iaXQgRE1BIGNoYW5uZWwgKDAsMSwzKSIpOworbW9kdWxlX3BhcmFtKGRtYTE2LCBpbnQsIDAwMCk7CitNT0RVTEVfUEFSTV9ERVNDKGRtYTE2LAkgICAiMTYtYml0IERNQSBjaGFubmVsICg1LDYsNykiKTsKK21vZHVsZV9wYXJhbShtcHVfaW8sIGludCwgMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MobXB1X2lvLCAgICJNUFUgYmFzZSBhZGRyZXNzIik7Cittb2R1bGVfcGFyYW0odHlwZSwgaW50LCAwMDApOworTU9EVUxFX1BBUk1fREVTQyh0eXBlLAkgICAiWW91IGNhbiBzZXQgdGhpcyB0byBzcGVjaWZpYyBjYXJkIHR5cGUgKGRvZXNuJ3QgIiBcCisJCSAid29yayB3aXRoIHBucCkiKTsKK21vZHVsZV9wYXJhbShzbV9nYW1lcywgaW50LCAwMDApOworTU9EVUxFX1BBUk1fREVTQyhzbV9nYW1lcywgIkVuYWJsZSBzdXBwb3J0IGZvciBMb2dpdGVjaCBzb3VuZG1hbiBnYW1lcyAiIFwKKwkJICIoZG9lc24ndCB3b3JrIHdpdGggcG5wKSIpOworbW9kdWxlX3BhcmFtKGVzc3R5cGUsIGludCwgMDAwKTsKK01PRFVMRV9QQVJNX0RFU0MoZXNzdHlwZSwgICJFU1MgY2hpcCB0eXBlIChkb2Vzbid0IHdvcmsgd2l0aCBwbnApIik7Cittb2R1bGVfcGFyYW0oYWNlciwgaW50LCAwMDApOworTU9EVUxFX1BBUk1fREVTQyhhY2VyLAkgICAiU2V0IHRoaXMgdG8gZGV0ZWN0IGNhcmRzIGluIHNvbWUgQUNFUiBub3RlYm9va3MgIlwKKwkJICIoZG9lc24ndCB3b3JrIHdpdGggcG5wKSIpOworCisjaWZkZWYgQ09ORklHX1BOUAorbW9kdWxlX3BhcmFtKHBucCwgaW50LCAwMDApOworTU9EVUxFX1BBUk1fREVTQyhwbnAsICAgICAiV2VudCBzZXQgdG8gMCB3aWxsIGRpc2FibGUgZGV0ZWN0aW9uIHVzaW5nIFBuUC4gIlwKKwkJICAiRGVmYXVsdCBpcyAxLlxuIik7CisvKiBOb3QgZG9uZSB5ZXQuLi4uICovCisvKgorbW9kdWxlX3BhcmFtKHVhcnQ0MDEsIGludCwgMDAwKTsKK01PRFVMRV9QQVJNX0RFU0ModWFydDQwMSwgICJXaGVuIHNldCB0byAxLCB3aWxsIGF0dGVtcHQgdG8gZGV0ZWN0IGFuZCBlbmFibGUiXAorCQkgInRoZSBtcHUgb24gc29tZSBjbG9uZXMiKTsKKyovCisjZW5kaWYgLyogQ09ORklHX1BOUCAqLworCisvKiBPU1Mgc3Vic3lzdGVtIGNhcmQgcmVnaXN0cmF0aW9uIHNoYXJlZCBieSBQblAgYW5kIGxlZ2FjeSByb3V0aW5lcyAqLworc3RhdGljIGludCBzYl9yZWdpc3Rlcl9vc3Moc3RydWN0IHNiX2NhcmRfY29uZmlnICpzY2MsIHN0cnVjdCBzYl9tb2R1bGVfb3B0aW9ucyAqc2JtbykKK3sKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHNjYy0+Y29uZi5pb19iYXNlLCAxNiwgInNvdW5kYmxhc3RlciIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2I6IHBvcnRzIGJ1c3kuXG4iKTsKKwkJa2ZyZWUoc2NjKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlpZiAoIXNiX2RzcF9kZXRlY3QoJnNjYy0+Y29uZiwgMCwgMCwgc2JtbykpIHsKKwkJcmVsZWFzZV9yZWdpb24oc2NjLT5jb25mLmlvX2Jhc2UsIDE2KTsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYjogRmFpbGVkIERTUCBEZXRlY3QuXG4iKTsKKwkJa2ZyZWUoc2NjKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmKCFzYl9kc3BfaW5pdCgmc2NjLT5jb25mLCBUSElTX01PRFVMRSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYjogRmFpbGVkIERTUCBpbml0LlxuIik7CisJCWtmcmVlKHNjYyk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlpZihzY2MtPm1wdWNuZi5pb19iYXNlID4gMCkgeworCQlzY2MtPm1wdSA9IDE7CisJCXByaW50ayhLRVJOX0lORk8gInNiOiBUdXJuaW5nIG9uIE1QVVxuIik7CisJCWlmKCFwcm9iZV9zYm1wdSgmc2NjLT5tcHVjbmYsIFRISVNfTU9EVUxFKSkKKwkJCXNjYy0+bXB1ID0gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgc2JfdW5sb2FkKHN0cnVjdCBzYl9jYXJkX2NvbmZpZyAqc2NjKQoreworCXNiX2RzcF91bmxvYWQoJnNjYy0+Y29uZiwgMCk7CisJaWYoc2NjLT5tcHUpCisJCXVubG9hZF9zYm1wdSgmc2NjLT5tcHVjbmYpOworCWtmcmVlKHNjYyk7Cit9CisKKy8qIFJlZ2lzdGVyIGxlZ2FjeSBjYXJkIHdpdGggT1NTIHN1YnN5c3RlbSAqLworc3RhdGljIGludCBzYl9pbml0X2xlZ2FjeSh2b2lkKQoreworCXN0cnVjdCBzYl9tb2R1bGVfb3B0aW9ucyBzYm1vID0gezB9OworCisJaWYoKGxlZ2FjeSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzYl9jYXJkX2NvbmZpZyksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2I6IEVycm9yOiBDb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChsZWdhY3ksIDAsIHNpemVvZihzdHJ1Y3Qgc2JfY2FyZF9jb25maWcpKTsKKworCWxlZ2FjeS0+Y29uZi5pb19iYXNlICAgICAgPSBpbzsKKwlsZWdhY3ktPmNvbmYuaXJxICAgICAgICAgID0gaXJxOworCWxlZ2FjeS0+Y29uZi5kbWEgICAgICAgICAgPSBkbWE7CisJbGVnYWN5LT5jb25mLmRtYTIgICAgICAgICA9IGRtYTE2OworCWxlZ2FjeS0+Y29uZi5jYXJkX3N1YnR5cGUgPSB0eXBlOworCisJbGVnYWN5LT5tcHVjbmYuaW9fYmFzZSA9IG1wdV9pbzsKKwlsZWdhY3ktPm1wdWNuZi5pcnEgICAgID0gLTE7CisJbGVnYWN5LT5tcHVjbmYuZG1hICAgICA9IC0xOworCWxlZ2FjeS0+bXB1Y25mLmRtYTIgICAgPSAtMTsKKworCXNibW8uZXNzdHlwZSAgPSBlc3N0eXBlOworCXNibW8uc21fZ2FtZXMgPSBzbV9nYW1lczsKKwlzYm1vLmFjZXIgICAgID0gYWNlcjsKKworCXJldHVybiBzYl9yZWdpc3Rlcl9vc3MobGVnYWN5LCAmc2Jtbyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUE5QCisKKy8qIFBvcHVsYXRlIHRoZSBPU1Mgc3Vic3lzdGVtIHN0cnVjdHVyZXMgd2l0aCBpbmZvcm1hdGlvbiBmcm9tIFBuUCAqLworc3RhdGljIHZvaWQgc2JfZGV2MmNmZyhzdHJ1Y3QgcG5wX2RldiAqZGV2LCBzdHJ1Y3Qgc2JfY2FyZF9jb25maWcgKnNjYykKK3sKKwlzY2MtPmNvbmYuaW9fYmFzZSAgID0gLTE7CisJc2NjLT5jb25mLmlycSAgICAgICA9IC0xOworCXNjYy0+Y29uZi5kbWEgICAgICAgPSAtMTsKKwlzY2MtPmNvbmYuZG1hMiAgICAgID0gLTE7CisJc2NjLT5tcHVjbmYuaW9fYmFzZSA9IC0xOworCXNjYy0+bXB1Y25mLmlycSAgICAgPSAtMTsKKwlzY2MtPm1wdWNuZi5kbWEgICAgID0gLTE7CisJc2NjLT5tcHVjbmYuZG1hMiAgICA9IC0xOworCisJLyogQWxsIGNsb25lcyBsYXlvdXQgdGhlaXIgUG5QIHRhYmxlcyBkaWZmZXJlbnRseSBhbmQgc29tZSB1c2UKKwkgICBkaWZmZXJlbnQgbG9naWNhbCBkZXZpY2VzIGZvciB0aGUgTVBVICovCisJaWYoIXN0cm5jbXAoIkNUTCIsc2NjLT5jYXJkX2lkLDMpKSB7CisJCXNjYy0+Y29uZi5pb19iYXNlICAgPSBwbnBfcG9ydF9zdGFydChkZXYsMCk7CisJCXNjYy0+Y29uZi5pcnEgICAgICAgPSBwbnBfaXJxKGRldiwwKTsKKwkJc2NjLT5jb25mLmRtYSAgICAgICA9IHBucF9kbWEoZGV2LDApOworCQlzY2MtPmNvbmYuZG1hMiAgICAgID0gcG5wX2RtYShkZXYsMSk7CisJCXNjYy0+bXB1Y25mLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChkZXYsMSk7CisJCXJldHVybjsKKwl9CisJaWYoIXN0cm5jbXAoInRCQSIsc2NjLT5jYXJkX2lkLDMpKSB7CisJCXNjYy0+Y29uZi5pb19iYXNlICAgPSBwbnBfcG9ydF9zdGFydChkZXYsMCk7CisJCXNjYy0+Y29uZi5pcnEgICAgICAgPSBwbnBfaXJxKGRldiwwKTsKKwkJc2NjLT5jb25mLmRtYSAgICAgICA9IHBucF9kbWEoZGV2LDApOworCQlzY2MtPmNvbmYuZG1hMiAgICAgID0gcG5wX2RtYShkZXYsMSk7CisJCXJldHVybjsKKwl9CisJaWYoIXN0cm5jbXAoIkVTUyIsc2NjLT5jYXJkX2lkLDMpKSB7CisJCXNjYy0+Y29uZi5pb19iYXNlICAgPSBwbnBfcG9ydF9zdGFydChkZXYsMCk7CisJCXNjYy0+Y29uZi5pcnEgICAgICAgPSBwbnBfaXJxKGRldiwwKTsKKwkJc2NjLT5jb25mLmRtYSAgICAgICA9IHBucF9kbWEoZGV2LDApOworCQlzY2MtPmNvbmYuZG1hMiAgICAgID0gcG5wX2RtYShkZXYsMSk7CisJICAgICAgIAlzY2MtPm1wdWNuZi5pb19iYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2LDIpOworCQlyZXR1cm47CisJfQorCWlmKCFzdHJuY21wKCJDTUkiLHNjYy0+Y2FyZF9pZCwzKSkgeworCQlzY2MtPmNvbmYuaW9fYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldiwwKTsKKwkJc2NjLT5jb25mLmlycSAgICAgPSBwbnBfaXJxKGRldiwwKTsKKwkJc2NjLT5jb25mLmRtYSAgICAgPSBwbnBfZG1hKGRldiwwKTsKKwkJc2NjLT5jb25mLmRtYTIgICAgPSBwbnBfZG1hKGRldiwxKTsKKwkJcmV0dXJuOworCX0KKwlpZighc3RybmNtcCgiUldCIixzY2MtPmNhcmRfaWQsMykpIHsKKwkJc2NjLT5jb25mLmlvX2Jhc2UgPSBwbnBfcG9ydF9zdGFydChkZXYsMCk7CisJCXNjYy0+Y29uZi5pcnEgICAgID0gcG5wX2lycShkZXYsMCk7CisJCXNjYy0+Y29uZi5kbWEgICAgID0gcG5wX2RtYShkZXYsMCk7CisJCXJldHVybjsKKwl9CisJaWYoIXN0cm5jbXAoIkFMUyIsc2NjLT5jYXJkX2lkLDMpKSB7CisJCWlmKCFzdHJuY21wKCJBTFMwMDA3IixzY2MtPmNhcmRfaWQsNykpIHsKKwkJCXNjYy0+Y29uZi5pb19iYXNlID0gcG5wX3BvcnRfc3RhcnQoZGV2LDApOworCQkJc2NjLT5jb25mLmlycSAgICAgPSBwbnBfaXJxKGRldiwwKTsKKwkJCXNjYy0+Y29uZi5kbWEgICAgID0gcG5wX2RtYShkZXYsMCk7CisJCX0gZWxzZSB7CisJCQlzY2MtPmNvbmYuaW9fYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldiwwKTsKKwkJCXNjYy0+Y29uZi5pcnEgICAgID0gcG5wX2lycShkZXYsMCk7CisJCQlzY2MtPmNvbmYuZG1hICAgICA9IHBucF9kbWEoZGV2LDEpOworCQkJc2NjLT5jb25mLmRtYTIgICAgPSBwbnBfZG1hKGRldiwwKTsKKwkJfQorCQlyZXR1cm47CisJfQorCWlmKCFzdHJuY21wKCJSVEwiLHNjYy0+Y2FyZF9pZCwzKSkgeworCQlzY2MtPmNvbmYuaW9fYmFzZSA9IHBucF9wb3J0X3N0YXJ0KGRldiwwKTsKKwkJc2NjLT5jb25mLmlycSAgICAgPSBwbnBfaXJxKGRldiwwKTsKKwkJc2NjLT5jb25mLmRtYSAgICAgPSBwbnBfZG1hKGRldiwxKTsKKwkJc2NjLT5jb25mLmRtYTIgICAgPSBwbnBfZG1hKGRldiwwKTsKKwl9Cit9CisKKy8qIFByb2JlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB0aGUgUG5QIEFQSSAqLworc3RhdGljIGludCBzYl9wbnBfcHJvYmUoc3RydWN0IHBucF9jYXJkX2xpbmsgKmNhcmQsIGNvbnN0IHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQgKmNhcmRfaWQpCit7CisJc3RydWN0IHNiX2NhcmRfY29uZmlnICpzY2M7CisJc3RydWN0IHNiX21vZHVsZV9vcHRpb25zIHNibW8gPSB7MH07IC8qIERlZmF1bHQgdG8gMCBmb3IgUG5QICovCisJc3RydWN0IHBucF9kZXYgKmRldiA9IHBucF9yZXF1ZXN0X2NhcmRfZGV2aWNlKGNhcmQsIGNhcmRfaWQtPmRldnNbMF0uaWQsIE5VTEwpOworCQorCWlmKCFkZXYpeworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCWlmKChzY2MgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc2JfY2FyZF9jb25maWcpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInNiOiBFcnJvcjogQ291bGQgbm90IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwltZW1zZXQoc2NjLCAwLCBzaXplb2Yoc3RydWN0IHNiX2NhcmRfY29uZmlnKSk7CisKKwlwcmludGsoS0VSTl9JTkZPICJzYjogUG5QOiBGb3VuZCBDYXJkIE5hbWVkID0gXCIlc1wiLCBDYXJkIFBuUCBpZCA9ICIgXAorCSAgICAgICAiJXMsIERldmljZSBQblAgaWQgPSAlc1xuIiwgY2FyZC0+Y2FyZC0+bmFtZSwgY2FyZF9pZC0+aWQsCisJICAgICAgIGRldi0+aWQtPmlkKTsKKworCXNjYy0+Y2FyZF9pZCA9IGNhcmRfaWQtPmlkOworCXNjYy0+ZGV2X2lkID0gZGV2LT5pZC0+aWQ7CisJc2JfZGV2MmNmZyhkZXYsIHNjYyk7CisKKwlwcmludGsoS0VSTl9JTkZPICJzYjogUG5QOiAgICAgIERldGVjdGVkIGF0OiBpbz0weCV4LCBpcnE9JWQsICIgXAorCSAgICAgICAiZG1hPSVkLCBkbWExNj0lZFxuIiwgc2NjLT5jb25mLmlvX2Jhc2UsIHNjYy0+Y29uZi5pcnEsCisJICAgICAgIHNjYy0+Y29uZi5kbWEsIHNjYy0+Y29uZi5kbWEyKTsKKworCXBucF9zZXRfY2FyZF9kcnZkYXRhKGNhcmQsIHNjYyk7CisKKwlyZXR1cm4gc2JfcmVnaXN0ZXJfb3NzKHNjYywgJnNibW8pOworfQorCitzdGF0aWMgdm9pZCBzYl9wbnBfcmVtb3ZlKHN0cnVjdCBwbnBfY2FyZF9saW5rICpjYXJkKQoreworCXN0cnVjdCBzYl9jYXJkX2NvbmZpZyAqc2NjID0gcG5wX2dldF9jYXJkX2RydmRhdGEoY2FyZCk7CisKKwlpZighc2NjKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9JTkZPICJzYjogUG5QOiBSZW1vdmluZyAlc1xuIiwgc2NjLT5jYXJkX2lkKTsKKworCXNiX3VubG9hZChzY2MpOworfQorCitzdGF0aWMgc3RydWN0IHBucF9jYXJkX2RyaXZlciBzYl9wbnBfZHJpdmVyID0geworCS5uYW1lICAgICAgICAgID0gIk9TUyBTbmRCbHN0ciIsIC8qIDE2IGNoYXJhY3RlciBsaW1pdCAqLworCS5pZF90YWJsZSAgICAgID0gc2JfcG5wX2NhcmRfdGFibGUsCisJLnByb2JlICAgICAgICAgPSBzYl9wbnBfcHJvYmUsCisJLnJlbW92ZSAgICAgICAgPSBzYl9wbnBfcmVtb3ZlLAorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUocG5wX2NhcmQsIHNiX3BucF9jYXJkX3RhYmxlKTsKKyNlbmRpZiAvKiBDT05GSUdfUE5QICovCisKK3N0YXRpYyBpbnQgX19pbml0IHNiX2luaXQodm9pZCkKK3sKKwlpbnQgbHJlcyA9IDA7CisJaW50IHByZXMgPSAwOworCisJcHJpbnRrKEtFUk5fSU5GTyAic2I6IEluaXQ6IFN0YXJ0aW5nIFByb2JlLi4uXG4iKTsKKworCWlmKGlvICE9IC0xICYmIGlycSAhPSAtMSAmJiBkbWEgIT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAic2I6IFByb2JpbmcgbGVnYWN5IGNhcmQgd2l0aCBpbz0leCwgIlwKKwkJICAgICAgICJpcnE9JWQsIGRtYT0lZCwgZG1hMTY9JWRcbiIsaW8sIGlycSwgZG1hLCBkbWExNik7CisJCWxyZXMgPSBzYl9pbml0X2xlZ2FjeSgpOworCX0gZWxzZSBpZigoaW8gIT0gLTEgfHwgaXJxICE9IC0xIHx8IGRtYSAhPSAtMSkgfHwKKwkJICAoIXBucCAmJiAoaW8gPT0gLTEgJiYgaXJxID09IC0xICYmIGRtYSA9PSAtMSkpKQorCQlwcmludGsoS0VSTl9FUlIgInNiOiBFcnJvcjogQXQgbGVhc3QgaW8sIGlycSwgYW5kIGRtYSAiXAorCQkgICAgICAgIm11c3QgYmUgc2V0IGZvciBsZWdhY3kgY2FyZHMuXG4iKTsKKworI2lmZGVmIENPTkZJR19QTlAKKwlpZihwbnApIHsKKwkJcHJlcyA9IHBucF9yZWdpc3Rlcl9jYXJkX2RyaXZlcigmc2JfcG5wX2RyaXZlcik7CisJfQorI2VuZGlmCisJcHJpbnRrKEtFUk5fSU5GTyAic2I6IEluaXQ6IERvbmVcbiIpOworCisJLyogSWYgZWl0aGVyIFBuUCBvciBMZWdhY3kgcmVnaXN0ZXJlZCBhIGNhcmQgdGhlbiByZXR1cm4KKwkgKiBzdWNjZXNzICovCisJaWYgKHByZXMgPD0gMCAmJiBscmVzIDw9IDApIHsKKyNpZmRlZiBDT05GSUdfUE5QCisJCXBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKCZzYl9wbnBfZHJpdmVyKTsKKyNlbmRpZgorCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBzYl9leGl0KHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAic2I6IFVubG9hZGluZy4uLlxuIik7CisKKwkvKiBVbmxvYWQgbGVnYWN5IGNhcmQgKi8KKwlpZiAobGVnYWN5KSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJzYjogVW5sb2FkaW5nIGxlZ2FjeSBjYXJkXG4iKTsKKwkJc2JfdW5sb2FkKGxlZ2FjeSk7CisJfQorCisjaWZkZWYgQ09ORklHX1BOUAorCXBucF91bnJlZ2lzdGVyX2NhcmRfZHJpdmVyKCZzYl9wbnBfZHJpdmVyKTsKKyNlbmRpZgorCisJaWYgKHNtd19mcmVlKSB7CisJCXZmcmVlKHNtd19mcmVlKTsKKwkJc213X2ZyZWUgPSBOVUxMOworCX0KK30KKworbW9kdWxlX2luaXQoc2JfaW5pdCk7Cittb2R1bGVfZXhpdChzYl9leGl0KTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9jYXJkLmggYi9zb3VuZC9vc3Mvc2JfY2FyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MzVjZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2JfY2FyZC5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogc291bmQvb3NzL3NiX2NhcmQuaAorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMKKyAqIHNvZnR3YXJlIGZvciBtb3JlIGluZm8uCisgKgorICogMDItMDUtMjAwMiBPcmlnaW5hbCBSZWxlYXNlLCBQYXVsIExhdWZlciA8cGF1bEBsYXVmZXJuZXQuY29tPgorICovCisKK3N0cnVjdCBzYl9jYXJkX2NvbmZpZyB7CisJc3RydWN0IGFkZHJlc3NfaW5mbyBjb25mOworCXN0cnVjdCBhZGRyZXNzX2luZm8gbXB1Y25mOworCWNvbnN0ICBjaGFyICAgICAgICAgKmNhcmRfaWQ7CisJY29uc3QgIGNoYXIgICAgICAgICAqZGV2X2lkOworCWludCAgICAgICAgICAgICAgICAgbXB1OworfTsKKworI2lmZGVmIENPTkZJR19QTlAKKworLyoKKyAqIFNvdW5kQmxhc3RlciBQblAgdGFibGVzIGFuZCBzdHJ1Y3R1cmVzLgorICovCisKKy8qIENhcmQgUG5QIElEIFRhYmxlICovCitzdGF0aWMgc3RydWN0IHBucF9jYXJkX2RldmljZV9pZCBzYl9wbnBfY2FyZF90YWJsZVtdID0geworCS8qIFNvdW5kIEJsYXN0ZXIgMTYgKi8KKwl7LmlkID0gIkNUTDAwMjQiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciAxNiAqLworCXsuaWQgPSAiQ1RMMDAyNSIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDMxIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIDE2ICovCisJey5pZCA9ICJDVEwwMDI2IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgMTYgKi8KKwl7LmlkID0gIkNUTDAwMjciLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciAxNiAqLworCXsuaWQgPSAiQ1RMMDAyOCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDMxIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIDE2ICovCisJey5pZCA9ICJDVEwwMDI5IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgMTYgKi8KKwl7LmlkID0gIkNUTDAwMmEiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciAxNiAqLworCXsuaWQgPSAiQ1RMMDAyYiIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDMxIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIDE2ICovCisJey5pZCA9ICJDVEwwMDJjIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMzEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgMTYgKi8KKwl7LmlkID0gIkNUTDAwZWQiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0MSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciAxNiAqLworCXsuaWQgPSAiQ1RMMDA4NiIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDQxIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIFZpYnJhMTZTICovCisJey5pZCA9ICJDVEwwMDUxIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwMDEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgVmlicmExNkMgKi8KKwl7LmlkID0gIkNUTDAwNzAiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAwMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBWaWJyYTE2Q0wgKi8KKwl7LmlkID0gIkNUTDAwODAiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0MSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBWaWJyYTE2Q0wgKi8KKwl7LmlkID0gIkNUTDAwRjAiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0MyJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgMzIgKi8KKwl7LmlkID0gIkNUTDAwMzkiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgMzIgKi8KKwl7LmlkID0gIkNUTDAwNDIiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgMzIgKi8KKwl7LmlkID0gIkNUTDAwNDMiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgMzIgKi8KKwl7LmlkID0gIkNUTDAwNDQiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgMzIgKi8KKwl7LmlkID0gIkNUTDAwNDUiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgMzIgKi8KKwl7LmlkID0gIkNUTDAwNDYiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgMzIgKi8KKwl7LmlkID0gIkNUTDAwNDciLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgMzIgKi8KKwl7LmlkID0gIkNUTDAwNDgiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgMzIgKi8KKwl7LmlkID0gIkNUTDAwNTQiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDAzMSJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgMzIgKi8KKwl7LmlkID0gIkNUTDAwOUMiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0MSJ9LCB9IH0sCisJLyogQ3JlYXRlaXZlIFNCMzIgUG5QICovCisJey5pZCA9ICJDVEwwMDlGIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwNDEifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDY0ICovCisJey5pZCA9ICJDVEwwMDlEIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkNUTDAwNDIifSwgfSB9LAorCS8qIFNvdW5kIEJsYXN0ZXIgQVdFIDY0IEdvbGQgKi8KKwl7LmlkID0gIkNUTDAwOUUiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQ1RMMDA0NCJ9LCB9IH0sCisJLyogU291bmQgQmxhc3RlciBBV0UgNjQgR29sZCAqLworCXsuaWQgPSAiQ1RMMDBCMiIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDQ0In0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIEFXRSA2NCAqLworCXsuaWQgPSAiQ1RMMDBDMSIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDQyIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIEFXRSA2NCAqLworCXsuaWQgPSAiQ1RMMDBDMyIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDQ1In0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIEFXRSA2NCAqLworCXsuaWQgPSAiQ1RMMDBDNSIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDQ1In0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIEFXRSA2NCAqLworCXsuaWQgPSAiQ1RMMDBDNyIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDQ1In0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIEFXRSA2NCAqLworCXsuaWQgPSAiQ1RMMDBFNCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDQ1In0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIEFXRSA2NCAqLworCXsuaWQgPSAiQ1RMMDBFOSIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJDVEwwMDQ1In0sIH0gfSwKKwkvKiBFU1MgMTg2OCAqLworCXsuaWQgPSAiRVNTMDk2OCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJFU1MwOTY4In0sIH0gfSwKKwkvKiBFU1MgMTg2OCAqLworCXsuaWQgPSAiRVNTMTg2OCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJFU1MxODY4In0sIH0gfSwKKwkvKiBFU1MgMTg2OCAqLworCXsuaWQgPSAiRVNTMTg2OCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJFU1M4NjExIn0sIH0gfSwKKwkvKiBFU1MgMTg2OSBQblAgQXVkaW9Ecml2ZSAqLworCXsuaWQgPSAiRVNTMDAwMyIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJFU1MxODY5In0sIH0gfSwKKwkvKiBFU1MgMTg2OSAqLworCXsuaWQgPSAiRVNTMTg2OSIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJFU1MxODY5In0sIH0gfSwKKwkvKiBFU1MgMTg3OCAqLworCXsuaWQgPSAiRVNTMTg3OCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJFU1MxODc4In0sIH0gfSwKKwkvKiBFU1MgMTg3OSAqLworCXsuaWQgPSAiRVNTMTg3OSIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJFU1MxODc5In0sIH0gfSwKKwkvKiBDTUkgODMzMCBTb3VuZFBSTyAqLworCXsuaWQgPSAiQ01JMDAwMSIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJAWEAwMDAxIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBIQDAwMDEifSwKKwkJCQkJCSAgICAgey5pZD0iQEBAMDAwMSJ9LCB9IH0sCisJLyogRGlhbW9uZCBEVDAxOTdIICovCisJey5pZCA9ICJSV1IxNjg4IiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkBAQDAwMDEifSwKKwkJCQkJCSAgICAgey5pZD0iQFhAMDAwMSJ9LAorCQkJCQkJICAgICB7LmlkPSJASEAwMDAxIn0sIH0gfSwKKwkvKiBBTFMwMDcgKi8KKwl7LmlkID0gIkFMUzAwMDciLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQEBAMDAwMSJ9LAorCQkJCQkJICAgICB7LmlkPSJAWEAwMDAxIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBIQDAwMDEifSwgfSB9LAorCS8qIEFMUzEwMCAqLworCXsuaWQgPSAiQUxTMDAwMSIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJAQEAwMDAxIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBYQDAwMDEifSwKKwkJCQkJCSAgICAgey5pZD0iQEhAMDAwMSJ9LCB9IH0sCisJLyogQUxTMTEwICovCisJey5pZCA9ICJBTFMwMTEwIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkBAQDEwMDEifSwKKwkJCQkJCSAgICAgey5pZD0iQFhAMTAwMSJ9LAorCQkJCQkJICAgICB7LmlkPSJASEAwMDAxIn0sIH0gfSwKKwkvKiBBTFMxMjAgKi8KKwl7LmlkID0gIkFMUzAxMjAiLCAuZHJpdmVyX2RhdGEgPSAwLCAuZGV2cyA9IHsgey5pZD0iQEBAMjAwMSJ9LAorCQkJCQkJICAgICB7LmlkPSJAWEAyMDAxIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBIQDAwMDEifSwgfSB9LAorCS8qIEFMUzIwMCAqLworCXsuaWQgPSAiQUxTMDIwMCIsIC5kcml2ZXJfZGF0YSA9IDAsIC5kZXZzID0geyB7LmlkPSJAQEAwMDIwIn0sCisJCQkJCQkgICAgIHsuaWQ9IkBYQDAwMzAifSwKKwkJCQkJCSAgICAgey5pZD0iQEhAMDAwMSJ9LCB9IH0sCisJLyogQUxTMjAwICovCisJey5pZCA9ICJSVEwzMDAwIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IkBAQDIwMDEifSwKKwkJCQkJCSAgICAgey5pZD0iQFhAMjAwMSJ9LAorCQkJCQkJICAgICB7LmlkPSJASEAwMDAxIn0sIH0gfSwKKwkvKiBTb3VuZCBCbGFzdGVyIDE2IChWaXJ0dWFsIFBDIDIwMDQpICovCisJey5pZCA9ICJ0QkEwM2IwIiwgLmRyaXZlcl9kYXRhID0gMCwgLmRldnMgPSB7IHsuaWQ9IlBOUGIwMDMifSwgfSB9LAorCS8qIC1lbmQtICovCisJey5pZCA9ICIiLCB9Cit9OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9jb21tb24uYyBiL3NvdW5kL29zcy9zYl9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTM1OWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NiX2NvbW1vbi5jCkBAIC0wLDAgKzEsMTI5MSBAQAorLyoKKyAqIHNvdW5kL3NiX2NvbW1vbi5jCisgKgorICogQ29tbW9uIHJvdXRpbmVzIGZvciBTb3VuZCBCbGFzdGVyIGNvbXBhdGlibGUgY2FyZHMuCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBEYW5pZWwgSi4gUm9kcmlrc3NvbjogTW9kaWZpZWQgc2JpbnRyIHRvIGhhbmRsZSA4IGFuZCAxNiBiaXQgaW50ZXJydXB0cworICogICAgICAgICAgICAgICAgICAgICAgIGZvciBmdWxsIGR1cGxleCBzdXBwb3J0ICggb25seSBzYjE2IGJ5IG5vdyApCisgKiBSb2xmIEZva2tlbnM6CSBBZGRlZCAoQkVUQT8pIHN1cHBvcnQgZm9yIEVTMTg4NyBjaGlwcy4KKyAqIChmb2trZW5zckB2ZXJ0aXMubmwpCSBXaGljaCBtZWFuczogWW91IGNhbiBhZGp1c3QgdGhlIHJlY29yZGluZyBsZXZlbHMuCisgKgorICogMjAwMC8wMS8xOCAtIHNlcGFyYXRlZCBzYl9jYXJkIGFuZCBzYl9jb21tb24gLQorICogSmVmZiBHYXJ6aWsgPGpnYXJ6aWtAcG9ib3guY29tPgorICoKKyAqIDIwMDAvMDkvMTggLSBnb3QgcmlkIG9mIGF0dGFjaF91YXJ0NDAxCisgKiBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KKyAqCisgKiAyMDAxLzAxLzI2IC0gcmVwbGFjZWQgQ0xJL1NUSSB3aXRoIHNwaW5sb2NrcworICogQ2hyaXMgUmFua2luIDxyYW5raW5jQHppcHdvcmxkLmNvbS5hdT4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInNvdW5kX2Zpcm13YXJlLmgiCisKKyNpbmNsdWRlICJtcHU0MDEuaCIKKworI2luY2x1ZGUgInNiX21peGVyLmgiCisjaW5jbHVkZSAic2IuaCIKKyNpbmNsdWRlICJzYl9lc3MuaCIKKworLyoKKyAqIGdsb2JhbCBtb2R1bGUgZmxhZworICovCisKK2ludCBzYl9iZV9xdWlldDsKKworc3RhdGljIHNiX2RldmMgKmRldGVjdGVkX2RldmM7CS8qIEZvciBjb21tdW5pY2F0aW9uIGZyb20gcHJvYmUgdG8gaW5pdCAqLworc3RhdGljIHNiX2RldmMgKmxhc3RfZGV2YzsJLyogRm9yIE1QVTQwMSBpbml0aWFsaXphdGlvbiAqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBqYXp6X2lycV9iaXRzW10gPSB7CisJMCwgMCwgMiwgMywgMCwgMSwgMCwgNCwgMCwgMiwgNSwgMCwgMCwgMCwgMCwgNgorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgamF6el9kbWFfYml0c1tdID0geworCTAsIDEsIDAsIDIsIDAsIDMsIDAsIDQKK307CisKK3ZvaWQgKnNtd19mcmVlOworCisvKgorICogSmF6ejE2IGNoaXBzZXQgc3BlY2lmaWMgY29udHJvbCB2YXJpYWJsZXMKKyAqLworCitzdGF0aWMgaW50IGphenoxNl9iYXNlOwkJCS8qIE5vdCBkZXRlY3RlZCAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgamF6ejE2X2JpdHM7CS8qIEkvTyByZWxvY2F0aW9uIGJpdHMgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soamF6ejE2X2xvY2spOworCisvKgorICogTG9naXRlY2ggU291bmRtYW4gV2F2ZSBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBjb2RlCisgKi8KKworI2lmZGVmIFNNV19NSURJMDAwMV9JTkNMVURFRAorI2luY2x1ZGUgInNtdy1taWRpMDAwMS5oIgorI2Vsc2UKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpzbXdfdWNvZGU7CitzdGF0aWMgaW50ICAgICAgc213X3Vjb2RlTGVuOworCisjZW5kaWYKKworc3RhdGljIHNiX2RldmMgKmxhc3Rfc2I7CQkvKiBMYXN0IHNiIGxvYWRlZCAqLworCitpbnQgc2JfZHNwX2NvbW1hbmQoc2JfZGV2YyAqIGRldmMsIHVuc2lnbmVkIGNoYXIgdmFsKQoreworCWludCBpOworCXVuc2lnbmVkIGxvbmcgbGltaXQ7CisKKwlsaW1pdCA9IGppZmZpZXMgKyBIWiAvIDEwOwkvKiBUaW1lb3V0ICovCisJCisJLyoKKwkgKiBOb3RlISB0aGUgaTw1MDAwMDAgaXMgYW4gZW1lcmdlbmN5IGV4aXQuIFRoZSBzYl9kc3BfY29tbWFuZCgpIGlzIHNvbWV0aW1lcworCSAqIGNhbGxlZCB3aGlsZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZC4gVGhpcyBtZWFucyB0aGF0IHRoZSB0aW1lciBpcworCSAqIGRpc2FibGVkIGFsc28uIEhvd2V2ZXIgdGhlIHRpbWVvdXQgc2l0dWF0aW9uIGlzIGEgYWJub3JtYWwgY29uZGl0aW9uLgorCSAqIE5vcm1hbGx5IHRoZSBEU1Agc2hvdWxkIGJlIHJlYWR5IHRvIGFjY2VwdCBjb21tYW5kcyBhZnRlciBqdXN0IGNvdXBsZSBvZgorCSAqIGxvb3BzLgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IDUwMDAwMCAmJiAobGltaXQtamlmZmllcyk+MDsgaSsrKQorCXsKKwkJaWYgKChpbmIoRFNQX1NUQVRVUykgJiAweDgwKSA9PSAwKQorCQl7CisJCQlvdXRiKCh2YWwpLCBEU1BfQ09NTUFORCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCX0KKwlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZCBCbGFzdGVyOiAgRFNQIGNvbW1hbmQoJXgpIHRpbWVvdXQuXG4iLCB2YWwpOworCXJldHVybiAwOworfQorCitpbnQgc2JfZHNwX2dldF9ieXRlKHNiX2RldmMgKiBkZXZjKQoreworCWludCBpOworCisJZm9yIChpID0gMTAwMDsgaTsgaS0tKQorCXsKKwkJaWYgKGluYihEU1BfREFUQV9BVkFJTCkgJiAweDgwKQorCQkJcmV0dXJuIGluYihEU1BfUkVBRCk7CisJfQorCXJldHVybiAweGZmZmY7Cit9CisKK3N0YXRpYyB2b2lkIHNiX2ludHIgKHNiX2RldmMgKmRldmMpCit7CisJaW50IHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyICAgc3JjID0gMHhmZjsKKworCWlmIChkZXZjLT5tb2RlbCA9PSBNRExfU0IxNikKKwl7CisJCXNyYyA9IHNiX2dldG1peGVyKGRldmMsIElSUV9TVEFUKTsJLyogSW50ZXJydXB0IHNvdXJjZSByZWdpc3RlciAqLworCisJCWlmIChzcmMgJiA0KQkJCQkJCS8qIE1QVTQwMSBpbnRlcnJ1cHQgKi8KKwkJCWlmKGRldmMtPm1pZGlfaXJxX2Nvb2tpZSkKKwkJCQl1YXJ0NDAxaW50cihkZXZjLT5pcnEsIGRldmMtPm1pZGlfaXJxX2Nvb2tpZSwgTlVMTCk7CisKKwkJaWYgKCEoc3JjICYgMykpCisJCQlyZXR1cm47CS8qIE5vdCBhIERTUCBpbnRlcnJ1cHQgKi8KKwl9CisJaWYgKGRldmMtPmludHJfYWN0aXZlICYmICghZGV2Yy0+ZnVsbGR1cGxleCB8fCAoc3JjICYgMHgwMSkpKQorCXsKKwkJc3dpdGNoIChkZXZjLT5pcnFfbW9kZSkKKwkJeworCQkJY2FzZSBJTU9ERV9PVVRQVVQ6CisJCQkJRE1BYnVmX291dHB1dGludHIoZGV2Yy0+ZGV2LCAxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJTU9ERV9JTlBVVDoKKwkJCQlETUFidWZfaW5wdXRpbnRyKGRldmMtPmRldik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSU1PREVfSU5JVDoKKwkJCQlicmVhazsKKworCQkJY2FzZSBJTU9ERV9NSURJOgorCQkJCXNiX21pZGlfaW50ZXJydXB0KGRldmMpOworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCS8qIHByaW50ayhLRVJOX1dBUk4gIlNvdW5kIEJsYXN0ZXI6IFVuZXhwZWN0ZWQgaW50ZXJydXB0XG4iKTsgKi8KKwkJCQk7CisJCX0KKwl9CisJZWxzZSBpZiAoZGV2Yy0+aW50cl9hY3RpdmVfMTYgJiYgKHNyYyAmIDB4MDIpKQorCXsKKwkJc3dpdGNoIChkZXZjLT5pcnFfbW9kZV8xNikKKwkJeworCQkJY2FzZSBJTU9ERV9PVVRQVVQ6CisJCQkJRE1BYnVmX291dHB1dGludHIoZGV2Yy0+ZGV2LCAxKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBJTU9ERV9JTlBVVDoKKwkJCQlETUFidWZfaW5wdXRpbnRyKGRldmMtPmRldik7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgSU1PREVfSU5JVDoKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQkvKiBwcmludGsoS0VSTl9XQVJOICJTb3VuZCBCbGFzdGVyOiBVbmV4cGVjdGVkIGludGVycnVwdFxuIik7ICovCisJCQkJOworCQl9CisJfQorCS8qCisJICogQWNrbm93bGVkZ2UgaW50ZXJydXB0cyAKKwkgKi8KKworCWlmIChzcmMgJiAweDAxKQorCQlzdGF0dXMgPSBpbmIoRFNQX0RBVEFfQVZBSUwpOworCisJaWYgKGRldmMtPm1vZGVsID09IE1ETF9TQjE2ICYmIHNyYyAmIDB4MDIpCisJCXN0YXR1cyA9IGluYihEU1BfREFUQV9BVkwxNik7Cit9CisKK3N0YXRpYyB2b2lkIHBjaV9pbnRyKHNiX2RldmMgKmRldmMpCit7CisJaW50IHNyYyA9IGluYihkZXZjLT5wY2liYXNlKzB4MUEpOworCXNyYyY9MzsKKwlpZihzcmMpCisJCXNiX2ludHIoZGV2Yyk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzYmludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpCit7CisJc2JfZGV2YyAqZGV2YyA9IGRldl9pZDsKKworCWRldmMtPmlycV9vayA9IDE7CisKKwlzd2l0Y2ggKGRldmMtPm1vZGVsKSB7CisJY2FzZSBNRExfRVNTUENJOgorCQlwY2lfaW50ciAoZGV2Yyk7CisJCWJyZWFrOworCQkKKwljYXNlIE1ETF9FU1M6CisJCWVzc19pbnRyIChkZXZjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc2JfaW50ciAoZGV2Yyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK2ludCBzYl9kc3BfcmVzZXQoc2JfZGV2YyAqIGRldmMpCit7CisJaW50IGxvb3BjOworCisJREVCKHByaW50aygiRW50ZXJlZCBzYl9kc3BfcmVzZXQoKVxuIikpOworCisJaWYgKGRldmMtPm1vZGVsID09IE1ETF9FU1MpIHJldHVybiBlc3NfZHNwX3Jlc2V0IChkZXZjKTsKKworCS8qIFRoaXMgaXMgb25seSBmb3Igbm9uLUVTUyBjaGlwcyAqLworCisJb3V0YigxLCBEU1BfUkVTRVQpOworCisJdWRlbGF5KDEwKTsKKwlvdXRiKDAsIERTUF9SRVNFVCk7CisJdWRlbGF5KDMwKTsKKworCWZvciAobG9vcGMgPSAwOyBsb29wYyA8IDEwMDAgJiYgIShpbmIoRFNQX0RBVEFfQVZBSUwpICYgMHg4MCk7IGxvb3BjKyspOworCisJaWYgKGluYihEU1BfUkVBRCkgIT0gMHhBQSkKKwl7CisJCUREQihwcmludGsoInNiOiBObyByZXNwb25zZSB0byBSRVNFVFxuIikpOworCQlyZXR1cm4gMDsJLyogU29ycnkgKi8KKwl9CisKKwlERUIocHJpbnRrKCJzYl9kc3BfcmVzZXQoKSBPS1xuIikpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRzcF9nZXRfdmVycyhzYl9kZXZjICogZGV2YykKK3sKKwlpbnQgaTsKKworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCUREQihwcmludGsoIkVudGVyZWQgZHNwX2dldF92ZXJzKClcbiIpKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWRldmMtPm1ham9yID0gZGV2Yy0+bWlub3IgPSAwOworCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4ZTEpOwkvKiBHZXQgdmVyc2lvbiAqLworCisJZm9yIChpID0gMTAwMDAwOyBpOyBpLS0pCisJeworCQlpZiAoaW5iKERTUF9EQVRBX0FWQUlMKSAmIDB4ODApCisJCXsKKwkJCWlmIChkZXZjLT5tYWpvciA9PSAwKQorCQkJCWRldmMtPm1ham9yID0gaW5iKERTUF9SRUFEKTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlkZXZjLT5taW5vciA9IGluYihEU1BfUkVBRCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCUREQihwcmludGsoIkRTUCB2ZXJzaW9uICVkLiUwMmRcbiIsIGRldmMtPm1ham9yLCBkZXZjLT5taW5vcikpOworfQorCitzdGF0aWMgaW50IHNiMTZfc2V0X2RtYV9odyhzYl9kZXZjICogZGV2YykKK3sKKwlpbnQgYml0czsKKworCWlmIChkZXZjLT5kbWE4ICE9IDAgJiYgZGV2Yy0+ZG1hOCAhPSAxICYmIGRldmMtPmRtYTggIT0gMykKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiU0IxNjogSW52YWxpZCA4IGJpdCBETUEgKCVkKVxuIiwgZGV2Yy0+ZG1hOCk7CisJCXJldHVybiAwOworCX0KKwliaXRzID0gKDEgPDwgZGV2Yy0+ZG1hOCk7CisKKwlpZiAoZGV2Yy0+ZG1hMTYgPj0gNSAmJiBkZXZjLT5kbWExNiA8PSA3KQorCQliaXRzIHw9ICgxIDw8IGRldmMtPmRtYTE2KTsKKworCXNiX3NldG1peGVyKGRldmMsIERNQV9OUiwgYml0cyk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHNiMTZfc2V0X21wdV9wb3J0KHNiX2RldmMgKiBkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgaW5pdGlhbGl6ZXMgbmV3IE1JREkgcG9ydCBzZXR1cCByZWdpc3RlciBvZiBTQiBWaWJyYSAoQ1QyNTAyKS4KKwkgKi8KKwl1bnNpZ25lZCBjaGFyICAgYml0cyA9IHNiX2dldG1peGVyKGRldmMsIDB4ODQpICYgfjB4MDY7CisKKwlzd2l0Y2ggKGh3X2NvbmZpZy0+aW9fYmFzZSkKKwl7CisJCWNhc2UgMHgzMDA6CisJCQlzYl9zZXRtaXhlcihkZXZjLCAweDg0LCBiaXRzIHwgMHgwNCk7CisJCQlicmVhazsKKworCQljYXNlIDB4MzMwOgorCQkJc2Jfc2V0bWl4ZXIoZGV2YywgMHg4NCwgYml0cyB8IDB4MDApOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXNiX3NldG1peGVyKGRldmMsIDB4ODQsIGJpdHMgfCAweDAyKTsJCS8qIERpc2FibGUgTVBVICovCisJCQlwcmludGsoS0VSTl9FUlIgIlNCMTY6IEludmFsaWQgTUlESSBJL08gcG9ydCAleFxuIiwgaHdfY29uZmlnLT5pb19iYXNlKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2IxNl9zZXRfaXJxX2h3KHNiX2RldmMgKiBkZXZjLCBpbnQgbGV2ZWwpCit7CisJaW50IGl2YWw7CisKKwlzd2l0Y2ggKGxldmVsKQorCXsKKwkJY2FzZSA1OgorCQkJaXZhbCA9IDI7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJaXZhbCA9IDQ7CisJCQlicmVhazsKKwkJY2FzZSA5OgorCQkJaXZhbCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAxMDoKKwkJCWl2YWwgPSA4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIlNCMTY6IEludmFsaWQgSVJRJWRcbiIsIGxldmVsKTsKKwkJCXJldHVybiAwOworCX0KKwlzYl9zZXRtaXhlcihkZXZjLCBJUlFfTlIsIGl2YWwpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCByZWxvY2F0ZV9KYXp6MTYoc2JfZGV2YyAqIGRldmMsIHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwl1bnNpZ25lZCBjaGFyIGJpdHMgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoamF6ejE2X2Jhc2UgIT0gMCAmJiBqYXp6MTZfYmFzZSAhPSBod19jb25maWctPmlvX2Jhc2UpCisJCXJldHVybjsKKworCXN3aXRjaCAoaHdfY29uZmlnLT5pb19iYXNlKQorCXsKKwkJY2FzZSAweDIyMDoKKwkJCWJpdHMgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgMHgyNDA6CisJCQliaXRzID0gMjsKKwkJCWJyZWFrOworCQljYXNlIDB4MjYwOgorCQkJYml0cyA9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybjsKKwl9CisJYml0cyA9IGphenoxNl9iaXRzID0gYml0cyA8PCA1OworCWphenoxNl9iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCisJLyoKKwkgKglNYWdpYyB3YWtlIHVwIHNlcXVlbmNlIGJ5IHdyaXRpbmcgdG8gMHgyMDEgKGFrYSBKb3lzdGljayBwb3J0KQorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZqYXp6MTZfbG9jaywgZmxhZ3MpOworCW91dGIoKDB4QUYpLCAweDIwMSk7CisJb3V0YigoMHg1MCksIDB4MjAxKTsKKwlvdXRiKChiaXRzKSwgMHgyMDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmphenoxNl9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9KYXp6MTYoc2JfZGV2YyAqIGRldmMsIHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwljaGFyIG5hbWVbMTAwXTsKKwkvKgorCSAqIEZpcnN0IHRyeSB0byBjaGVjayB0aGF0IHRoZSBjYXJkIGhhcyBKYXp6MTYgY2hpcC4gSXQgaWRlbnRpZmllcyBpdHNlbGYKKwkgKiBieSByZXR1cm5pbmcgMHgxMiBhcyByZXNwb25zZSB0byBEU1AgY29tbWFuZCAweGZhLgorCSAqLworCisJaWYgKCFzYl9kc3BfY29tbWFuZChkZXZjLCAweGZhKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2JfZHNwX2dldF9ieXRlKGRldmMpICE9IDB4MTIpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBPSyBzbyBmYXIuIE5vdyBjb25maWd1cmUgdGhlIElSUSBhbmQgRE1BIGNoYW5uZWwgdXNlZCBieSB0aGUgY2FyZC4KKwkgKi8KKwlpZiAoaHdfY29uZmlnLT5pcnEgPCAxIHx8IGh3X2NvbmZpZy0+aXJxID4gMTUgfHwgamF6el9pcnFfYml0c1tod19jb25maWctPmlycV0gPT0gMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiSmF6ejE2OiBJbnZhbGlkIGludGVycnVwdCAoSVJRJWQpXG4iLCBod19jb25maWctPmlycSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoaHdfY29uZmlnLT5kbWEgPCAwIHx8IGh3X2NvbmZpZy0+ZG1hID4gMyB8fCBqYXp6X2RtYV9iaXRzW2h3X2NvbmZpZy0+ZG1hXSA9PSAwKQorCXsKKwkJICBwcmludGsoS0VSTl9FUlIgIkphenoxNjogSW52YWxpZCA4IGJpdCBETUEgKERNQSVkKVxuIiwgaHdfY29uZmlnLT5kbWEpOworCQkgIHJldHVybiAwOworCX0KKwlpZiAoaHdfY29uZmlnLT5kbWEyIDwgMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiSmF6ejE2OiBObyAxNiBiaXQgRE1BIGNoYW5uZWwgZGVmaW5lZFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoaHdfY29uZmlnLT5kbWEyIDwgNSB8fCBod19jb25maWctPmRtYTIgPiA3IHx8IGphenpfZG1hX2JpdHNbaHdfY29uZmlnLT5kbWEyXSA9PSAwKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJKYXp6MTY6IEludmFsaWQgMTYgYml0IERNQSAoRE1BJWQpXG4iLCBod19jb25maWctPmRtYTIpOworCQlyZXR1cm4gMDsKKwl9CisJZGV2Yy0+ZG1hMTYgPSBod19jb25maWctPmRtYTI7CisKKwlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIDB4ZmIpKQorCQlyZXR1cm4gMDsKKworCWlmICghc2JfZHNwX2NvbW1hbmQoZGV2YywgamF6el9kbWFfYml0c1tod19jb25maWctPmRtYV0gfAorCQkJKGphenpfZG1hX2JpdHNbaHdfY29uZmlnLT5kbWEyXSA8PCA0KSkpCisJCXJldHVybiAwOworCisJaWYgKCFzYl9kc3BfY29tbWFuZChkZXZjLCBqYXp6X2lycV9iaXRzW2h3X2NvbmZpZy0+aXJxXSkpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBOb3cgd2UgaGF2ZSBjb25maWd1cmVkIGEgc3RhbmRhcmQgSmF6ejE2IGRldmljZS4gCisJICovCisJZGV2Yy0+bW9kZWwgPSBNRExfSkFaWjsKKwlzdHJjcHkobmFtZSwgIkphenoxNiIpOworCisJaHdfY29uZmlnLT5uYW1lID0gIkphenoxNiI7CisJZGV2Yy0+Y2FwcyB8PSBTQl9OT19NSURJOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCByZWxvY2F0ZV9lc3MxNjg4KHNiX2RldmMgKiBkZXZjKQoreworCXVuc2lnbmVkIGNoYXIgYml0czsKKworCXN3aXRjaCAoZGV2Yy0+YmFzZSkKKwl7CisJCWNhc2UgMHgyMjA6CisJCQliaXRzID0gMHgwNDsKKwkJCWJyZWFrOworCQljYXNlIDB4MjMwOgorCQkJYml0cyA9IDB4MDU7CisJCQlicmVhazsKKwkJY2FzZSAweDI0MDoKKwkJCWJpdHMgPSAweDA2OworCQkJYnJlYWs7CisJCWNhc2UgMHgyNTA6CisJCQliaXRzID0gMHgwNzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuOwkvKiBXcm9uZyBwb3J0ICovCisJfQorCisJRERCKHByaW50aygiRG9pbmcgRVNTMTY4OCBhZGRyZXNzIHNlbGVjdGlvblxuIikpOworCQorCS8qCisJICogRVMxNjg4IHN1cHBvcnRzIHR3byBhbHRlcm5hdGl2ZSB3YXlzIGZvciBzb2Z0d2FyZSBhZGRyZXNzIGNvbmZpZy4KKwkgKiBGaXJzdCB0cnkgdGhlIHNvIGNhbGxlZCBSZWFkLVNlcXVlbmNlLUtleSBtZXRob2QuCisJICovCisKKwkvKiBSZXNldCB0aGUgc2VxdWVuY2UgbG9naWMgKi8KKwlpbmIoMHgyMjkpOworCWluYigweDIyOSk7CisJaW5iKDB4MjI5KTsKKworCS8qIFBlcmZvcm0gdGhlIHJlYWQgc2VxdWVuY2UgKi8KKwlpbmIoMHgyMmIpOworCWluYigweDIyOSk7CisJaW5iKDB4MjJiKTsKKwlpbmIoMHgyMjkpOworCWluYigweDIyOSk7CisJaW5iKDB4MjJiKTsKKwlpbmIoMHgyMjkpOworCisJLyogU2VsZWN0IHRoZSBiYXNlIGFkZHJlc3MgYnkgcmVhZGluZyBmcm9tIGl0LiBUaGVuIHByb2JlIHVzaW5nIHRoZSBwb3J0LiAqLworCWluYihkZXZjLT5iYXNlKTsKKwlpZiAoc2JfZHNwX3Jlc2V0KGRldmMpKQkvKiBCaW5nbyAqLworCQlyZXR1cm47CisKKyNpZiAwCQkJCS8qIFRoaXMgY2F1c2VzIHN5c3RlbSBsb2NrdXBzIChOb2tpYSAzODYvMjUgYXQgbGVhc3QpICovCisJLyoKKwkgKiBUaGUgbGFzdCByZXNvcnQgaXMgdGhlIHN5c3RlbSBjb250cm9sIHJlZ2lzdGVyIG1ldGhvZC4KKwkgKi8KKworCW91dGIoKDB4MDApLCAweGZiKTsJLyogMHhGQiBpcyB0aGUgdW5sb2NrIHJlZ2lzdGVyICovCisJb3V0YigoMHgwMCksIDB4ZTApOwkvKiBTZWxlY3QgaW5kZXggMCAqLworCW91dGIoKGJpdHMpLCAweGUxKTsJLyogV3JpdGUgdGhlIGNvbmZpZyBiaXRzICovCisJb3V0YigoMHgwMCksIDB4ZjkpOwkvKiAweEZCIGlzIHRoZSBsb2NrIHJlZ2lzdGVyICovCisjZW5kaWYKK30KKworaW50IHNiX2RzcF9kZXRlY3Qoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBpbnQgcGNpLCBpbnQgcGNpaW8sIHN0cnVjdCBzYl9tb2R1bGVfb3B0aW9ucyAqc2JtbykKK3sKKwlzYl9kZXZjIHNiX2luZm87CisJc2JfZGV2YyAqZGV2YyA9ICZzYl9pbmZvOworCisJbWVtc2V0KChjaGFyICopICZzYl9pbmZvLCAwLCBzaXplb2Yoc2JfaW5mbykpOwkvKiBaZXJvIGV2ZXJ5dGhpbmcgKi8KKworCS8qIENvcHkgbW9kdWxlIG9wdGlvbnMgaW4gcGxhY2UgKi8KKwlpZihzYm1vKSBtZW1jcHkoJmRldmMtPnNibW8sIHNibW8sIHNpemVvZihzdHJ1Y3Qgc2JfbW9kdWxlX29wdGlvbnMpKTsKKworCXNiX2luZm8ubXlfbWlkaWRldiA9IC0xOworCXNiX2luZm8ubXlfbWl4ZXJkZXYgPSAtMTsKKwlzYl9pbmZvLmRldiA9IC0xOworCisJLyoKKwkgKiBJbml0aWFsaXplIHZhcmlhYmxlcyAKKwkgKi8KKwkKKwlEREIocHJpbnRrKCJzYl9kc3BfZGV0ZWN0KCV4KSBlbnRlcmVkXG4iLCBod19jb25maWctPmlvX2Jhc2UpKTsKKworCXNwaW5fbG9ja19pbml0KCZkZXZjLT5sb2NrKTsKKwlkZXZjLT50eXBlID0gaHdfY29uZmlnLT5jYXJkX3N1YnR5cGU7CisKKwlkZXZjLT5iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCWRldmMtPmlycSA9IGh3X2NvbmZpZy0+aXJxOworCWRldmMtPmRtYTggPSBod19jb25maWctPmRtYTsKKworCWRldmMtPmRtYTE2ID0gLTE7CisJZGV2Yy0+cGNpYmFzZSA9IHBjaWlvOworCQorCWlmKHBjaSA9PSBTQl9QQ0lfRVNTTUFFU1RSTykKKwl7CisJCWRldmMtPm1vZGVsID0gTURMX0VTU1BDSTsKKwkJZGV2Yy0+Y2FwcyB8PSBTQl9QQ0lfSVJROworCQlod19jb25maWctPmRyaXZlcl91c2VfMSB8PSBTQl9QQ0lfSVJROworCQlod19jb25maWctPmNhcmRfc3VidHlwZQk9IE1ETF9FU1NQQ0k7CisJfQorCQorCWlmKHBjaSA9PSBTQl9QQ0lfWUFNQUhBKQorCXsKKwkJZGV2Yy0+bW9kZWwgPSBNRExfWU1QQ0k7CisJCWRldmMtPmNhcHMgfD0gU0JfUENJX0lSUTsKKwkJaHdfY29uZmlnLT5kcml2ZXJfdXNlXzEgfD0gU0JfUENJX0lSUTsKKwkJaHdfY29uZmlnLT5jYXJkX3N1YnR5cGUJPSBNRExfWU1QQ0k7CisJCQorCQlwcmludGsoIllhbWFoYSBQQ0kgbW9kZS5cbiIpOworCX0KKwkKKwlpZiAoZGV2Yy0+c2Jtby5hY2VyKQorCXsKKwkJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MDkpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MDkpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MDkpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MGIpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MDkpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MGIpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MDkpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MDkpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MGIpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MDkpOworCQlpbmIoZGV2Yy0+YmFzZSArIDB4MDApOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJfQorCS8qCisJICogRGV0ZWN0IHRoZSBkZXZpY2UKKwkgKi8KKworCWlmIChzYl9kc3BfcmVzZXQoZGV2YykpCisJCWRzcF9nZXRfdmVycyhkZXZjKTsKKwllbHNlCisJCWRldmMtPm1ham9yID0gMDsKKworCWlmIChkZXZjLT50eXBlID09IDAgfHwgZGV2Yy0+dHlwZSA9PSBNRExfSkFaWiB8fCBkZXZjLT50eXBlID09IE1ETF9TTVcpCisJCWlmIChkZXZjLT5tYWpvciA9PSAwIHx8IChkZXZjLT5tYWpvciA9PSAzICYmIGRldmMtPm1pbm9yID09IDEpKQorCQkJcmVsb2NhdGVfSmF6ejE2KGRldmMsIGh3X2NvbmZpZyk7CisKKwlpZiAoZGV2Yy0+bWFqb3IgPT0gMCAmJiAoZGV2Yy0+dHlwZSA9PSBNRExfRVNTIHx8IGRldmMtPnR5cGUgPT0gMCkpCisJCXJlbG9jYXRlX2VzczE2ODgoZGV2Yyk7CisKKwlpZiAoIXNiX2RzcF9yZXNldChkZXZjKSkKKwl7CisJCUREQihwcmludGsoIlNCIHJlc2V0IGZhaWxlZFxuIikpOworI2lmZGVmIE1PRFVMRQorCQlwcmludGsoS0VSTl9JTkZPICJzYjogZHNwIHJlc2V0IGZhaWxlZC5cbiIpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKwlpZiAoZGV2Yy0+bWFqb3IgPT0gMCkKKwkJZHNwX2dldF92ZXJzKGRldmMpOworCisJaWYgKGRldmMtPm1ham9yID09IDMgJiYgZGV2Yy0+bWlub3IgPT0gMSkKKwl7CisJCWlmIChkZXZjLT50eXBlID09IE1ETF9BWlRFQ0gpCQkvKiBTRyBXYXNoaW5ndG9uPyAqLworCQl7CisJCQlpZiAoc2JfZHNwX2NvbW1hbmQoZGV2YywgMHgwOSkpCisJCQkJaWYgKHNiX2RzcF9jb21tYW5kKGRldmMsIDB4MDApKQkvKiBFbnRlciBXU1MgbW9kZSAqLworCQkJCXsKKwkJCQkJaW50IGk7CisKKwkJCQkJLyogSGF2ZSBzb21lIGRlbGF5ICovCisJCQkJCWZvciAoaSA9IDA7IGkgPCAxMDAwMDsgaSsrKQorCQkJCQkJaW5iKERTUF9EQVRBX0FWQUlMKTsKKwkJCQkJZGV2Yy0+Y2FwcyA9IFNCX05PX0FVRElPIHwgU0JfTk9fTUlESTsJLyogTWl4ZXIgb25seSAqLworCQkJCQlkZXZjLT5tb2RlbCA9IE1ETF9BWlRFQ0g7CisJCQkJfQorCQl9CisJfQorCQorCWlmKGRldmMtPnR5cGUgPT0gTURMX0VTU1BDSSkKKwkJZGV2Yy0+bW9kZWwgPSBNRExfRVNTUENJOworCQkKKwlpZihkZXZjLT50eXBlID09IE1ETF9ZTVBDSSkKKwl7CisJCXByaW50aygiWU1QQ0kgc2VsZWN0ZWRcbiIpOworCQlkZXZjLT5tb2RlbCA9IE1ETF9ZTVBDSTsKKwl9CisJCQorCS8qCisJICogU2F2ZSBkZXZpY2UgaW5mb3JtYXRpb24gZm9yIHNiX2RzcF9pbml0KCkKKwkgKi8KKworCisJZGV0ZWN0ZWRfZGV2YyA9IChzYl9kZXZjICopa21hbGxvYyhzaXplb2Yoc2JfZGV2YyksIEdGUF9LRVJORUwpOworCWlmIChkZXRlY3RlZF9kZXZjID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9FUlIgInNiOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGRldmljZSBpbmZvcm1hdGlvblxuIik7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkoZGV0ZWN0ZWRfZGV2YywgZGV2Yywgc2l6ZW9mKHNiX2RldmMpKTsKKwlNREIocHJpbnRrKEtFUk5fSU5GTyAiU0IgJWQuJTAyZCBkZXRlY3RlZCBPSyAoJXgpXG4iLCBkZXZjLT5tYWpvciwgZGV2Yy0+bWlub3IsIGh3X2NvbmZpZy0+aW9fYmFzZSkpOworCXJldHVybiAxOworfQorCitpbnQgc2JfZHNwX2luaXQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnLCBzdHJ1Y3QgbW9kdWxlICpvd25lcikKK3sKKwlzYl9kZXZjICpkZXZjOworCWNoYXIgbmFtZVsxMDBdOworCWV4dGVybiBpbnQgc2JfYmVfcXVpZXQ7CisJaW50CW1peGVyMjIsIG1peGVyMzA7CisJCisvKgorICogQ2hlY2sgaWYgd2UgaGFkIGRldGVjdGVkIGEgU0IgZGV2aWNlIGVhcmxpZXIKKyAqLworCUREQihwcmludGsoInNiX2RzcF9pbml0KCV4KSBlbnRlcmVkXG4iLCBod19jb25maWctPmlvX2Jhc2UpKTsKKwluYW1lWzBdID0gMDsKKworCWlmIChkZXRlY3RlZF9kZXZjID09IE5VTEwpCisJeworCQlNREIocHJpbnRrKCJObyBkZXRlY3RlZCBkZXZpY2VcbiIpKTsKKwkJcmV0dXJuIDA7CisJfQorCWRldmMgPSBkZXRlY3RlZF9kZXZjOworCWRldGVjdGVkX2RldmMgPSBOVUxMOworCisJaWYgKGRldmMtPmJhc2UgIT0gaHdfY29uZmlnLT5pb19iYXNlKQorCXsKKwkJRERCKHByaW50aygiSS9PIHBvcnQgbWlzbWF0Y2hcbiIpKTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSwgMTYpOworCQlyZXR1cm4gMDsKKwl9CisJLyoKKwkgKiBOb3cgY29udGludWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIGRldmljZQorCSAqLworCisJZGV2Yy0+Y2FwcyA9IGh3X2NvbmZpZy0+ZHJpdmVyX3VzZV8xOworCisJaWYgKCEoKGRldmMtPmNhcHMgJiBTQl9OT19BVURJTykgJiYgKGRldmMtPmNhcHMgJiBTQl9OT19NSURJKSkgJiYgaHdfY29uZmlnLT5pcnEgPiAwKQorCXsJCQkvKiBJUlEgc2V0dXAgKi8KKwkJCisJCS8qCisJCSAqCUVTUyBQQ0kgY2FyZHMgZG8gc2hhcmVkIFBDSSBJUlEgc3R1ZmYuIFNpbmNlIHRoZXkKKwkJICoJd2lsbCBnZXQgc2hhcmVkIFBDSSBpcnEgbGluZXMgd2UgbXVzdCBjb3BlLgorCQkgKi8KKwkJIAorCQlpbnQgaT0oZGV2Yy0+Y2FwcyZTQl9QQ0lfSVJRKT9TQV9TSElSUTowOworCQkKKwkJaWYgKHJlcXVlc3RfaXJxKGh3X2NvbmZpZy0+aXJxLCBzYmludHIsIGksICJzb3VuZGJsYXN0ZXIiLCBkZXZjKSA8IDApCisJCXsKKwkJCXByaW50ayhLRVJOX0VSUiAiU0I6IENhbid0IGFsbG9jYXRlIElSUSVkXG4iLCBod19jb25maWctPmlycSk7CisJCQlyZWxlYXNlX3JlZ2lvbihkZXZjLT5iYXNlLCAxNik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkZXZjLT5pcnFfb2sgPSAwOworCisJCWlmIChkZXZjLT5tYWpvciA9PSA0KQorCQkJaWYgKCFzYjE2X3NldF9pcnFfaHcoZGV2YywgZGV2Yy0+aXJxKSkJLyogVW5zdXBwb3J0ZWQgSVJRICovCisJCQl7CisJCQkJZnJlZV9pcnEoZGV2Yy0+aXJxLCBkZXZjKTsKKwkJCQlyZWxlYXNlX3JlZ2lvbihkZXZjLT5iYXNlLCAxNik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCWlmICgoZGV2Yy0+dHlwZSA9PSAwIHx8IGRldmMtPnR5cGUgPT0gTURMX0VTUykgJiYKKwkJCWRldmMtPm1ham9yID09IDMgJiYgZGV2Yy0+bWlub3IgPT0gMSkKKwkJewkJLyogSGFuZGxlIHZhcmlvdXMgY2hpcHNldHMgd2hpY2ggY2xhaW0gdGhleSBhcmUgU0IgUHJvIGNvbXBhdGlibGUgKi8KKwkJCWlmICgoZGV2Yy0+dHlwZSAhPSAwICYmIGRldmMtPnR5cGUgIT0gTURMX0VTUykgfHwKKwkJCQkhZXNzX2luaXQoZGV2YywgaHdfY29uZmlnKSkKKwkJCXsKKwkJCQlpZiAoKGRldmMtPnR5cGUgIT0gMCAmJiBkZXZjLT50eXBlICE9IE1ETF9KQVpaICYmCisJCQkJCSBkZXZjLT50eXBlICE9IE1ETF9TTVcpIHx8ICFpbml0X0phenoxNihkZXZjLCBod19jb25maWcpKQorCQkJCXsKKwkJCQkJRERCKHByaW50aygiVGhpcyBpcyBhIGdlbnVpbmUgU0IgUHJvXG4iKSk7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChkZXZjLT5tYWpvciA9PSA0ICYmIGRldmMtPm1pbm9yIDw9IDExICkJLyogV29uJ3Qgd29yayAqLworCQkJZGV2Yy0+aXJxX29rID0gMTsKKwkJZWxzZQorCQl7CisJCQlpbnQgbjsKKworCQkJZm9yIChuID0gMDsgbiA8IDMgJiYgZGV2Yy0+aXJxX29rID09IDA7IG4rKykKKwkJCXsKKwkJCQlpZiAoc2JfZHNwX2NvbW1hbmQoZGV2YywgMHhmMikpCS8qIENhdXNlIGludGVycnVwdCBpbW1lZGlhdGVseSAqLworCQkJCXsKKwkJCQkJaW50IGk7CisKKwkJCQkJZm9yIChpID0gMDsgIWRldmMtPmlycV9vayAmJiBpIDwgMTAwMDA7IGkrKyk7CisJCQkJfQorCQkJfQorCQkJaWYgKCFkZXZjLT5pcnFfb2spCisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAic2I6IEludGVycnVwdCB0ZXN0IG9uIElSUSVkIGZhaWxlZCAtIFByb2JhYmxlIElSUSBjb25mbGljdFxuIiwgZGV2Yy0+aXJxKTsKKwkJCWVsc2UKKwkJCXsKKwkJCQlEREIocHJpbnRrKCJJUlEgdGVzdCBPSyAoSVJRJWQpXG4iLCBkZXZjLT5pcnEpKTsKKwkJCX0KKwkJfQorCX0JCQkvKiBJUlEgc2V0dXAgKi8KKworCWxhc3Rfc2IgPSBkZXZjOworCQorCXN3aXRjaCAoZGV2Yy0+bWFqb3IpCisJeworCQljYXNlIDE6CQkvKiBTQiAxLjAgb3IgMS41ICovCisJCQlkZXZjLT5tb2RlbCA9IGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlID0gTURMX1NCMTsKKwkJCWJyZWFrOworCisJCWNhc2UgMjoJCS8qIFNCIDIueCAqLworCQkJaWYgKGRldmMtPm1pbm9yID09IDApCisJCQkJZGV2Yy0+bW9kZWwgPSBod19jb25maWctPmNhcmRfc3VidHlwZSA9IE1ETF9TQjI7CisJCQllbHNlCisJCQkJZGV2Yy0+bW9kZWwgPSBod19jb25maWctPmNhcmRfc3VidHlwZSA9IE1ETF9TQjIwMTsKKwkJCWJyZWFrOworCisJCWNhc2UgMzoJCS8qIFNCIFBybyBhbmQgbW9zdCBjbG9uZXMgKi8KKwkJCXN3aXRjaCAoZGV2Yy0+bW9kZWwpIHsKKwkJCWNhc2UgMDoKKwkJCQlkZXZjLT5tb2RlbCA9IGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlID0gTURMX1NCUFJPOworCQkJCWlmIChod19jb25maWctPm5hbWUgPT0gTlVMTCkKKwkJCQkJaHdfY29uZmlnLT5uYW1lID0gIlNvdW5kIEJsYXN0ZXIgUHJvICg4IEJJVCBPTkxZKSI7CisJCQkJYnJlYWs7CisJCQljYXNlIE1ETF9FU1M6CisJCQkJZXNzX2RzcF9pbml0KGRldmMsIGh3X2NvbmZpZyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIDQ6CisJCQlkZXZjLT5tb2RlbCA9IGh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlID0gTURMX1NCMTY7CisJCQkvKiAKKwkJCSAqIEFMUzAwNyBhbmQgQUxTMTAwIHJldHVybiBEU1AgdmVyc2lvbiA0LjIgYW5kIGhhdmUgMiBwb3N0LXJlc2V0ICE9MAorCQkJICogcmVnaXN0ZXJzIGF0IDB4M2MgYW5kIDB4NGMgKG91dHB1dCBjdHJsIHJlZ2lzdGVycyBvbiBBTFMwMDcpIHdoZXJlYXMKKwkJCSAqIGEgInN0YW5kYXJkIiBTQjE2IGRvZXNuJ3QgaGF2ZSBhIHJlZ2lzdGVyIGF0IDB4NGMuICBBTFMxMDAgYWN0aXZlbHkKKwkJCSAqIHVwZGF0ZXMgcmVnaXN0ZXIgMHgyMiB3aGVuZXZlciAweDMwIGNoYW5nZXMsIGFzIHBlciB0aGUgU0IxNiBzcGVjLgorCQkJICogU2luY2UgQUxTMDA3IGRvZXNuJ3QsIHRoaXMgY2FuIGJlIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSB0aGUgMiBjYXJkcy4KKwkJCSAqLworCQkJaWYgKChkZXZjLT5taW5vciA9PSAyKSAmJiBzYl9nZXRtaXhlcihkZXZjLDB4M2MpICYmIHNiX2dldG1peGVyKGRldmMsMHg0YykpIAorCQkJeworCQkJCW1peGVyMzAgPSBzYl9nZXRtaXhlcihkZXZjLDB4MzApOworCQkJCXNiX3NldG1peGVyKGRldmMsMHgyMiwobWl4ZXIyMj1zYl9nZXRtaXhlcihkZXZjLDB4MjIpKSAmIDB4MGYpOworCQkJCXNiX3NldG1peGVyKGRldmMsMHgzMCwweGZmKTsKKwkJCQkvKiBBTFMxMDAgd2lsbCBmb3JjZSAweDMwIHRvIDB4ZjggbGlrZSBTQjE2OyBBTFMwMDcgd2lsbCBhbGxvdyAweGZmLiAqLworCQkJCS8qIFJlZ2lzdGVyIDB4MjIgJiAweGYwIG9uIEFMUzEwMCA9PSAweGYwOyBvbiBBTFMwMDcgaXQgPT0gMHgxMC4gICAgICovCisJCQkJaWYgKChzYl9nZXRtaXhlcihkZXZjLDB4MzApICE9IDB4ZmYpIHx8ICgoc2JfZ2V0bWl4ZXIoZGV2YywweDIyKSAmIDB4ZjApICE9IDB4MTApKSAKKwkJCQl7CisJCQkJCWRldmMtPnN1Ym1vZGVsID0gU1VCTURMX0FMUzEwMDsKKwkJCQkJaWYgKGh3X2NvbmZpZy0+bmFtZSA9PSBOVUxMKQorCQkJCQkJaHdfY29uZmlnLT5uYW1lID0gIlNvdW5kIEJsYXN0ZXIgMTYgKEFMUy0xMDApIjsKKyAgICAgICAgCQkJfQorICAgICAgICAJCQllbHNlCisgICAgICAgIAkJCXsKKyAgICAgICAgCQkJCXNiX3NldG1peGVyKGRldmMsMHgzYywweDFmKTsgICAgLyogRW5hYmxlIGFsbCBpbnB1dHMgKi8KKwkJCQkJc2Jfc2V0bWl4ZXIoZGV2YywweDRjLDB4MWYpOworCQkJCQlzYl9zZXRtaXhlcihkZXZjLDB4MjIsbWl4ZXIyMik7IC8qIFJlc3RvcmUgMHgyMiB0byBvcmlnaW5hbCB2YWx1ZSAqLworCQkJCQlkZXZjLT5zdWJtb2RlbCA9IFNVQk1ETF9BTFMwMDc7CisJCQkJCWlmIChod19jb25maWctPm5hbWUgPT0gTlVMTCkKKwkJCQkJCWh3X2NvbmZpZy0+bmFtZSA9ICJTb3VuZCBCbGFzdGVyIDE2IChBTFMtMDA3KSI7CisJCQkJfQorCQkJCXNiX3NldG1peGVyKGRldmMsMHgzMCxtaXhlcjMwKTsKKwkJCX0KKwkJCWVsc2UgaWYgKGh3X2NvbmZpZy0+bmFtZSA9PSBOVUxMKQorCQkJCWh3X2NvbmZpZy0+bmFtZSA9ICJTb3VuZCBCbGFzdGVyIDE2IjsKKworCQkJaWYgKGh3X2NvbmZpZy0+ZG1hMiA9PSAtMSkKKwkJCQlkZXZjLT5kbWExNiA9IGRldmMtPmRtYTg7CisJCQllbHNlIGlmIChod19jb25maWctPmRtYTIgPCA1IHx8IGh3X2NvbmZpZy0+ZG1hMiA+IDcpCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fV0FSTklORyAgIlNCMTY6IEJhZCBvciBtaXNzaW5nIDE2IGJpdCBETUEgY2hhbm5lbFxuIik7CisJCQkJZGV2Yy0+ZG1hMTYgPSBkZXZjLT5kbWE4OworCQkJfQorCQkJZWxzZQorCQkJCWRldmMtPmRtYTE2ID0gaHdfY29uZmlnLT5kbWEyOworCisJCQlpZighc2IxNl9zZXRfZG1hX2h3KGRldmMpKSB7CisJCQkJZnJlZV9pcnEoZGV2Yy0+aXJxLCBkZXZjKTsKKwkJCSAgICAgICAgcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisKKwkJCWRldmMtPmNhcHMgfD0gU0JfTk9fTUlESTsKKwl9CisKKwlpZiAoIShkZXZjLT5jYXBzICYgU0JfTk9fTUlYRVIpKQorCQlpZiAoZGV2Yy0+bWFqb3IgPT0gMyB8fCBkZXZjLT5tYWpvciA9PSA0KQorCQkJc2JfbWl4ZXJfaW5pdChkZXZjLCBvd25lcik7CisKKwlpZiAoIShkZXZjLT5jYXBzICYgU0JfTk9fTUlESSkpCisJCXNiX2RzcF9taWRpX2luaXQoZGV2Yywgb3duZXIpOworCisJaWYgKGh3X2NvbmZpZy0+bmFtZSA9PSBOVUxMKQorCQlod19jb25maWctPm5hbWUgPSAiU291bmQgQmxhc3RlciAoOCBCSVQvTU9OTyBPTkxZKSI7CisKKwlzcHJpbnRmKG5hbWUsICIlcyAoJWQuJTAyZCkiLCBod19jb25maWctPm5hbWUsIGRldmMtPm1ham9yLCBkZXZjLT5taW5vcik7CisJY29uZl9wcmludGYobmFtZSwgaHdfY29uZmlnKTsKKworCS8qCisJICogQXNzdW1pbmcgdGhhdCBhIHNvdW5kIGNhcmQgaXMgU291bmQgQmxhc3RlciAoY29tcGF0aWJsZSkgaXMgdGhlIG1vc3QgY29tbW9uCisJICogY29uZmlndXJhdGlvbiBlcnJvciBhbmQgdGhlIG1vdGhlciBvZiBhbGwgcHJvYmxlbXMuIFVzdWFsbHkgc291bmQgY2FyZHMKKwkgKiBlbXVsYXRlIFNCIFBybyBidXQgaW4gYWRkaXRpb24gdGhleSBoYXZlIGEgMTYgYml0IG5hdGl2ZSBtb2RlIHdoaWNoIHNob3VsZCBiZQorCSAqIHVzZWQgaW4gVW5peC4gU2VlIFJlYWRtZS5jYXJkcyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBjb25maWd1cmluZyBPU1MvRnJlZQorCSAqIHByb3Blcmx5LgorCSAqLworCWlmIChkZXZjLT5tb2RlbCA8PSBNRExfU0JQUk8pCisJeworCQlpZiAoZGV2Yy0+bWFqb3IgPT0gMyAmJiBkZXZjLT5taW5vciAhPSAxKQkvKiAiVHJ1ZSIgU0IgUHJvIHNob3VsZCBoYXZlIHYzLjEgKHJhcmUgb25lcyBtYXkgaGF2ZSAzLjIpLiAqLworCQl7CisJCQlwcmludGsoS0VSTl9JTkZPICJUaGlzIHNvdW5kIGNhcmQgbWF5IG5vdCBiZSBmdWxseSBTb3VuZCBCbGFzdGVyIFBybyBjb21wYXRpYmxlLlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJJbiBtYW55IGNhc2VzIHRoZXJlIGlzIGFub3RoZXIgd2F5IHRvIGNvbmZpZ3VyZSBPU1Mgc28gdGhhdFxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJpdCB3b3JrcyBwcm9wZXJseSB3aXRoIE9TUyAoZm9yIGV4YW1wbGUgaW4gMTYgYml0IG1vZGUpLlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJQbGVhc2UgaWdub3JlIHRoaXMgbWVzc2FnZSBpZiB5b3UgX3JlYWxseV8gaGF2ZSBhIFNCIFByby5cbiIpOworCQl9CisJCWVsc2UgaWYgKCFzYl9iZV9xdWlldCAmJiBkZXZjLT5tb2RlbCA9PSBNRExfU0JQUk8pCisJCXsKKwkJCXByaW50ayhLRVJOX0lORk8gIlNCIERTUCB2ZXJzaW9uIGlzIGp1c3QgJWQuJTAyZCB3aGljaCBtZWFucyB0aGF0IHlvdXIgY2FyZCBpc1xuIiwgZGV2Yy0+bWFqb3IsIGRldmMtPm1pbm9yKTsKKwkJCXByaW50ayhLRVJOX0lORk8gInNldmVyYWwgeWVhcnMgb2xkICg4IGJpdCBvbmx5IGRldmljZSkgb3IgYWx0ZXJuYXRpdmVseSB0aGUgc291bmQgZHJpdmVyXG4iKTsKKwkJCXByaW50ayhLRVJOX0lORk8gImlzIGluY29ycmVjdGx5IGNvbmZpZ3VyZWQuXG4iKTsKKwkJfQorCX0KKwlod19jb25maWctPmNhcmRfc3VidHlwZSA9IGRldmMtPm1vZGVsOworCWh3X2NvbmZpZy0+c2xvdHNbMF09ZGV2Yy0+ZGV2OworCWxhc3RfZGV2YyA9IGRldmM7CS8qIEZvciBTQiBNUFUgZGV0ZWN0aW9uICovCisKKwlpZiAoIShkZXZjLT5jYXBzICYgU0JfTk9fQVVESU8pICYmIGRldmMtPmRtYTggPj0gMCkKKwl7CisJCWlmIChzb3VuZF9hbGxvY19kbWEoZGV2Yy0+ZG1hOCwgIlNvdW5kQmxhc3RlcjgiKSkKKwkJeworCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQgQmxhc3RlcjogQ2FuJ3QgYWxsb2NhdGUgOCBiaXQgRE1BIGNoYW5uZWwgJWRcbiIsIGRldmMtPmRtYTgpOworCQl9CisJCWlmIChkZXZjLT5kbWExNiA+PSAwICYmIGRldmMtPmRtYTE2ICE9IGRldmMtPmRtYTgpCisJCXsKKwkJCWlmIChzb3VuZF9hbGxvY19kbWEoZGV2Yy0+ZG1hMTYsICJTb3VuZEJsYXN0ZXIxNiIpKQorCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNvdW5kIEJsYXN0ZXI6ICBjYW4ndCBhbGxvY2F0ZSAxNiBiaXQgRE1BIGNoYW5uZWwgJWQuXG4iLCBkZXZjLT5kbWExNik7CisJCX0KKwkJc2JfYXVkaW9faW5pdChkZXZjLCBuYW1lLCBvd25lcik7CisJCWh3X2NvbmZpZy0+c2xvdHNbMF09ZGV2Yy0+ZGV2OworCX0KKwllbHNlCisJeworCQlNREIocHJpbnRrKCJTb3VuZCBCbGFzdGVyOiAgbm8gYXVkaW8gZGV2aWNlcyBmb3VuZC5cbiIpKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIGlmIChzYm1wdSkgYmVsb3cgd2UgYWxsb3cgbXB1NDAxIHRvIG1hbmFnZSB0aGUgbWlkaSBkZXZzCisgICBvdGhlcndpc2Ugd2UgaGF2ZSB0byB1bmxvYWQgdGhlbS4gKEFuZHJ6ZWogS3J6eXN6dG9mb3dpY3opICovCisgICAKK3ZvaWQgc2JfZHNwX3VubG9hZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIGludCBzYm1wdSkKK3sKKwlzYl9kZXZjICpkZXZjOworCisJZGV2YyA9IGF1ZGlvX2RldnNbaHdfY29uZmlnLT5zbG90c1swXV0tPmRldmM7CisKKwlpZiAoZGV2YyAmJiBkZXZjLT5iYXNlID09IGh3X2NvbmZpZy0+aW9fYmFzZSkKKwl7CisJCWlmICgoZGV2Yy0+bW9kZWwgJiBNRExfRVNTKSAmJiBkZXZjLT5wY2liYXNlKQorCQkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+cGNpYmFzZSwgOCk7CisKKwkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSwgMTYpOworCisJCWlmICghKGRldmMtPmNhcHMgJiBTQl9OT19BVURJTykpCisJCXsKKwkJCXNvdW5kX2ZyZWVfZG1hKGRldmMtPmRtYTgpOworCQkJaWYgKGRldmMtPmRtYTE2ID49IDApCisJCQkJc291bmRfZnJlZV9kbWEoZGV2Yy0+ZG1hMTYpOworCQl9CisJCWlmICghKGRldmMtPmNhcHMgJiBTQl9OT19BVURJTyAmJiBkZXZjLT5jYXBzICYgU0JfTk9fTUlESSkpCisJCXsKKwkJCWlmIChkZXZjLT5pcnEgPiAwKQorCQkJCWZyZWVfaXJxKGRldmMtPmlycSwgZGV2Yyk7CisKKwkJCXNiX21peGVyX3VubG9hZChkZXZjKTsKKwkJCS8qIFdlIGRvbid0IGhhdmUgdG8gZG8gdGhpcyBiaXQgYW55IG1vcmUgdGhlIFVBUlQ0MDEgaXMgaXRzIG93bgorCQkJCW1hc3RlciAgLS0gS3J6eXN6dG9mIEhhbGFzYSAqLworCQkJLyogQnV0IHdlIGhhdmUgdG8gZG8gaXQsIGlmIFVBUlQ0MDEgaXMgbm90IGRldGVjdGVkICovCisJCQlpZiAoIXNibXB1KQorCQkJCXNvdW5kX3VubG9hZF9taWRpZGV2KGRldmMtPm15X21pZGlkZXYpOworCQkJc291bmRfdW5sb2FkX2F1ZGlvZGV2KGRldmMtPmRldik7CisJCX0KKwkJa2ZyZWUoZGV2Yyk7CisJfQorCWVsc2UKKwkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNik7CisJaWYoZGV0ZWN0ZWRfZGV2YykKKwkJa2ZyZWUoZGV0ZWN0ZWRfZGV2Yyk7Cit9CisKKy8qCisgKglNaXhlciBhY2Nlc3Mgcm91dGluZXMKKyAqCisgKglFUzE4ODcgbW9kaWZpY2F0aW9uczogc29tZSBtaXhlciByZWdpc3RlcnMgcmVzaWRlIGluIHRoZQorICoJcmFuZ2UgYWJvdmUgMHhhMC4gVGhlc2UgbXVzdCBiZSBhY2Nlc3NlZCBpbiBhbm90aGVyIHdheS4KKyAqLworCit2b2lkIHNiX3NldG1peGVyKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX0VTUykgeworCQllc3Nfc2V0bWl4ZXIgKGRldmMsIHBvcnQsIHZhbHVlKTsKKwkJcmV0dXJuOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisKKwlvdXRiKCgodW5zaWduZWQgY2hhcikgKHBvcnQgJiAweGZmKSksIE1JWEVSX0FERFIpOworCXVkZWxheSgyMCk7CisJb3V0YigoKHVuc2lnbmVkIGNoYXIpICh2YWx1ZSAmIDB4ZmYpKSwgTUlYRVJfREFUQSk7CisJdWRlbGF5KDIwKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKK30KKwordW5zaWduZWQgaW50IHNiX2dldG1peGVyKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBpbnQgcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX0VTUykgcmV0dXJuIGVzc19nZXRtaXhlciAoZGV2YywgcG9ydCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIChwb3J0ICYgMHhmZikpLCBNSVhFUl9BRERSKTsKKwl1ZGVsYXkoMjApOworCXZhbCA9IGluYihNSVhFUl9EQVRBKTsKKwl1ZGVsYXkoMjApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHZhbDsKK30KKwordm9pZCBzYl9jaGdtaXhlcgorCShzYl9kZXZjICogZGV2YywgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IHZhbHVlOworCisJdmFsdWUgPSBzYl9nZXRtaXhlcihkZXZjLCByZWcpOworCXZhbHVlID0gKHZhbHVlICYgfm1hc2spIHwgKHZhbCAmIG1hc2spOworCXNiX3NldG1peGVyKGRldmMsIHJlZywgdmFsdWUpOworfQorCisvKgorICoJTVBVNDAxIE1JREkgaW5pdGlhbGl6YXRpb24uCisgKi8KKworc3RhdGljIHZvaWQgc213X3B1dG1lbShzYl9kZXZjICogZGV2YywgaW50IGJhc2UsIGludCBhZGRyLCB1bnNpZ25lZCBjaGFyIHZhbCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmphenoxNl9sb2NrLCBmbGFncyk7ICAvKiBOT1QgdGhlIFNCIGNhcmQ/ICovCisKKwlvdXRiKChhZGRyICYgMHhmZiksIGJhc2UgKyAxKTsJLyogTG93IGFkZHJlc3MgYml0cyAqLworCW91dGIoKGFkZHIgPj4gOCksIGJhc2UgKyAyKTsJLyogSGlnaCBhZGRyZXNzIGJpdHMgKi8KKwlvdXRiKCh2YWwpLCBiYXNlKTsJLyogRGF0YSAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmamF6ejE2X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc213X2dldG1lbShzYl9kZXZjICogZGV2YywgaW50IGJhc2UsIGludCBhZGRyKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmamF6ejE2X2xvY2ssIGZsYWdzKTsgIC8qIE5PVCB0aGUgU0IgY2FyZD8gKi8KKworCW91dGIoKGFkZHIgJiAweGZmKSwgYmFzZSArIDEpOwkvKiBMb3cgYWRkcmVzcyBiaXRzICovCisJb3V0YigoYWRkciA+PiA4KSwgYmFzZSArIDIpOwkvKiBIaWdoIGFkZHJlc3MgYml0cyAqLworCXZhbCA9IGluYihiYXNlKTsJLyogRGF0YSAqLworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmamF6ejE2X2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IHNtd19taWRpX2luaXQoc2JfZGV2YyAqIGRldmMsIHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgbXB1X2Jhc2UgPSBod19jb25maWctPmlvX2Jhc2U7CisJaW50IG1wX2Jhc2UgPSBtcHVfYmFzZSArIDQ7CQkvKiBNaWNyb2NvbnRyb2xsZXIgYmFzZSAqLworCWludCBpOworCXVuc2lnbmVkIGNoYXIgY29udHJvbDsKKworCisJLyoKKwkgKiAgUmVzZXQgdGhlIG1pY3JvY29udHJvbGxlciBzbyB0aGF0IHRoZSBSQU0gY2FuIGJlIGFjY2Vzc2VkCisJICovCisKKwljb250cm9sID0gaW5iKG1wdV9iYXNlICsgNyk7CisJb3V0YigoY29udHJvbCB8IDMpLCBtcHVfYmFzZSArIDcpOwkvKiBTZXQgbGFzdCB0d28gYml0cyB0byAxICg/KSAqLworCW91dGIoKChjb250cm9sICYgMHhmZSkgfCAyKSwgbXB1X2Jhc2UgKyA3KTsJLyogeHh4eHh4eDAgcmVzZXRzIHRoZSBtYyAqLworCisJbWRlbGF5KDMpOwkvKiBXYWl0IGF0IGxlYXN0IDFtcyAqLworCisJb3V0YigoY29udHJvbCAmIDB4ZmMpLCBtcHVfYmFzZSArIDcpOwkvKiB4eHh4eHgwMCBlbmFibGVzIFJBTSAqLworCisJLyoKKwkgKiAgRGV0ZWN0IG1pY3JvY29udHJvbGxlciBieSBwcm9iaW5nIHRoZSA4ayBSQU0gYXJlYQorCSAqLworCXNtd19wdXRtZW0oZGV2YywgbXBfYmFzZSwgMCwgMHgwMCk7CisJc213X3B1dG1lbShkZXZjLCBtcF9iYXNlLCAxLCAweGZmKTsKKwl1ZGVsYXkoMTApOworCisJaWYgKHNtd19nZXRtZW0oZGV2YywgbXBfYmFzZSwgMCkgIT0gMHgwMCB8fCBzbXdfZ2V0bWVtKGRldmMsIG1wX2Jhc2UsIDEpICE9IDB4ZmYpCisJeworCQlEREIocHJpbnRrKCJTTSBXYXZlOiBObyBtaWNyb2NvbnRyb2xsZXIgUkFNIGRldGVjdGVkICglMDJ4LCAlMDJ4KVxuIiwgc213X2dldG1lbShkZXZjLCBtcF9iYXNlLCAwKSwgc213X2dldG1lbShkZXZjLCBtcF9iYXNlLCAxKSkpOworCQlyZXR1cm4gMDsJLyogTm8gUkFNICovCisJfQorCS8qCisJICogIFRoZXJlIGlzIFJBTSBzbyBhc3N1bWUgaXQncyByZWFsbHkgYSBTTSBXYXZlCisJICovCisKKwlkZXZjLT5tb2RlbCA9IE1ETF9TTVc7CisJc213X21peGVyX2luaXQoZGV2Yyk7CisKKyNpZmRlZiBNT0RVTEUKKwlpZiAoIXNtd191Y29kZSkKKwl7CisJCXNtd191Y29kZUxlbiA9IG1vZF9maXJtd2FyZV9sb2FkKCIvZXRjL3NvdW5kL21pZGkwMDAxLmJpbiIsICh2b2lkICopICZzbXdfdWNvZGUpOworCQlzbXdfZnJlZSA9IHNtd191Y29kZTsKKwl9CisjZW5kaWYKKwlpZiAoc213X3Vjb2RlTGVuID4gMCkKKwl7CisJCWlmIChzbXdfdWNvZGVMZW4gIT0gODE5MikKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJTTSBXYXZlOiBJbnZhbGlkIG1pY3JvY29kZSAoTUlESTAwMDEuQklOKSBsZW5ndGhcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyoKKwkJICogIERvd25sb2FkIG1pY3JvY29kZQorCQkgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgODE5MjsgaSsrKQorCQkJc213X3B1dG1lbShkZXZjLCBtcF9iYXNlLCBpLCBzbXdfdWNvZGVbaV0pOworCisJCS8qCisJCSAqICBWZXJpZnkgbWljcm9jb2RlCisJCSAqLworCisJCWZvciAoaSA9IDA7IGkgPCA4MTkyOyBpKyspCisJCQlpZiAoc213X2dldG1lbShkZXZjLCBtcF9iYXNlLCBpKSAhPSBzbXdfdWNvZGVbaV0pCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJTTSBXYXZlOiBNaWNyb2NvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZFxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJfQorCWNvbnRyb2wgPSAwOworI2lmZGVmIFNNV19TQ1NJX0lSUQorCS8qCisJICogU2V0IHRoZSBTQ1NJIGludGVycnVwdCAoSVJRMi85LCBJUlEzIG9yIElSUTEwKS4gVGhlIFNDU0kgaW50ZXJydXB0CisJICogaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKwkgKgorCSAqIEZJWE1FIC0gbWFrZSB0aGlzIGEgbW9kdWxlIG9wdGlvbgorCSAqCisJICogQlRXIHRoZSBaaWxvZyA1MzgwIFNDU0kgY29udHJvbGxlciBpcyBsb2NhdGVkIGF0IE1QVSBiYXNlICsgMHgxMC4KKwkgKi8KKwl7CisJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIHNjc2lfaXJxX2JpdHNbXSA9IHsKKwkJCTAsIDAsIDMsIDEsIDAsIDAsIDAsIDAsIDAsIDMsIDIsIDAsIDAsIDAsIDAsIDAKKwkJfTsKKwkJY29udHJvbCB8PSBzY3NpX2lycV9iaXRzW1NNV19TQ1NJX0lSUV0gPDwgNjsKKwl9CisjZW5kaWYKKworI2lmZGVmIFNNV19PUEw0X0VOQUJMRQorCS8qCisJICogIE1ha2UgdGhlIE9QTDQgY2hpcCB2aXNpYmxlIG9uIHRoZSBQQyBidXMgYXQgMHgzODAuCisJICoKKwkgKiAgVGhlcmUgaXMgbm8gbmVlZCB0byBlbmFibGUgdGhpcyBmZWF0dXJlIHNpbmNlIHRoaXMgZHJpdmVyCisJICogIGRvZXNuJ3Qgc3VwcG9ydCBPUEw0IHlldC4gQWxzbyB0aGVyZSBpcyBubyBSQU0gaW4gU00gV2F2ZSBzbworCSAqICBlbmFibGluZyBPUEw0IGlzIHByZXR0eSB1c2VsZXNzLgorCSAqLworCWNvbnRyb2wgfD0gMHgxMDsJLyogVXNlcyBJUlExMiBpZiBiaXQgMHgyMCA9PSAwICovCisJLyogY29udHJvbCB8PSAweDIwOyAgICAgIFVuY29tbWVudCB0aGlzIGlmIHlvdSB3YW50IHRvIHVzZSBJUlE3ICovCisjZW5kaWYKKwlvdXRiKChjb250cm9sIHwgMHgwMyksIG1wdV9iYXNlICsgNyk7CS8qIHh4eHh4eDExIHJlc3RhcnRzICovCisJaHdfY29uZmlnLT5uYW1lID0gIlNvdW5kTWFuIFdhdmUiOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGluaXRfSmF6ejE2X21pZGkoc2JfZGV2YyAqIGRldmMsIHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgbXB1X2Jhc2UgPSBod19jb25maWctPmlvX2Jhc2U7CisJaW50IHNiX2Jhc2UgPSBkZXZjLT5iYXNlOworCWludCBpcnEgPSBod19jb25maWctPmlycTsKKworCXVuc2lnbmVkIGNoYXIgYml0cyA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChpcnEgPCAwKQorCQlpcnEgKj0gLTE7CisKKwlpZiAoaXJxIDwgMSB8fCBpcnEgPiAxNSB8fAorCSAgICBqYXp6X2lycV9iaXRzW2lycV0gPT0gMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiSmF6ejE2OiBJbnZhbGlkIE1JREkgaW50ZXJydXB0IChJUlElZClcbiIsIGlycSk7CisJCXJldHVybiAwOworCX0KKwlzd2l0Y2ggKHNiX2Jhc2UpCisJeworCQljYXNlIDB4MjIwOgorCQkJYml0cyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweDI0MDoKKwkJCWJpdHMgPSAyOworCQkJYnJlYWs7CisJCWNhc2UgMHgyNjA6CisJCQliaXRzID0gMzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIDA7CisJfQorCWJpdHMgPSBqYXp6MTZfYml0cyA9IGJpdHMgPDwgNTsKKwlzd2l0Y2ggKG1wdV9iYXNlKQorCXsKKwkJY2FzZSAweDMxMDoKKwkJCWJpdHMgfD0gMTsKKwkJCWJyZWFrOworCQljYXNlIDB4MzIwOgorCQkJYml0cyB8PSAyOworCQkJYnJlYWs7CisJCWNhc2UgMHgzMzA6CisJCQliaXRzIHw9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0VSUiAiSmF6ejE2OiBJbnZhbGlkIE1JREkgSS9PIHBvcnQgJXhcbiIsIG1wdV9iYXNlKTsKKwkJCXJldHVybiAwOworCX0KKwkvKgorCSAqCU1hZ2ljIHdha2UgdXAgc2VxdWVuY2UgYnkgd3JpdGluZyB0byAweDIwMSAoYWthIEpveXN0aWNrIHBvcnQpCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJmphenoxNl9sb2NrLCBmbGFncyk7CisJb3V0YigweEFGLCAweDIwMSk7CisJb3V0YigweDUwLCAweDIwMSk7CisJb3V0YihiaXRzLCAweDIwMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmamF6ejE2X2xvY2ssIGZsYWdzKTsKKworCWh3X2NvbmZpZy0+bmFtZSA9ICJKYXp6MTYiOworCXNtd19taWRpX2luaXQoZGV2YywgaHdfY29uZmlnKTsKKworCWlmICghc2JfZHNwX2NvbW1hbmQoZGV2YywgMHhmYikpCisJCXJldHVybiAwOworCisJaWYgKCFzYl9kc3BfY29tbWFuZChkZXZjLCBqYXp6X2RtYV9iaXRzW2RldmMtPmRtYThdIHwKKwkJCSAgICAoamF6el9kbWFfYml0c1tkZXZjLT5kbWExNl0gPDwgNCkpKQorCQlyZXR1cm4gMDsKKworCWlmICghc2JfZHNwX2NvbW1hbmQoZGV2YywgamF6el9pcnFfYml0c1tkZXZjLT5pcnFdIHwKKwkJCSAgICAoamF6el9pcnFfYml0c1tpcnFdIDw8IDQpKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IHByb2JlX3NibXB1KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZywgc3RydWN0IG1vZHVsZSAqb3duZXIpCit7CisJc2JfZGV2YyAqZGV2YyA9IGxhc3RfZGV2YzsKKwlpbnQgcmV0OworCisJaWYgKGxhc3RfZGV2YyA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWxhc3RfZGV2YyA9IE5VTEw7CisKKwlpZiAoaHdfY29uZmlnLT5pb19iYXNlIDw9IDApCisJeworCQkvKiBUaGUgcmVhbCB2aWJyYTE2IGlzIGZpbmUgYWJvdXQgdGhpcywgYnV0IHdlIGhhdmUgdG8gZ28KKwkJICAgd2lwZSB1cCBhZnRlciBDeXJpeCBhZ2FpbiAqLworCQkgICAJICAgCisJCWlmKGRldmMtPm1vZGVsID09IE1ETF9TQjE2ICYmIGRldmMtPm1pbm9yID49IDEyKQorCQl7CisJCQl1bnNpZ25lZCBjaGFyICAgYml0cyA9IHNiX2dldG1peGVyKGRldmMsIDB4ODQpICYgfjB4MDY7CisJCQlzYl9zZXRtaXhlcihkZXZjLCAweDg0LCBiaXRzIHwgMHgwMik7CQkvKiBEaXNhYmxlIE1QVSAqLworCQl9CisJCXJldHVybiAwOworCX0KKworI2lmIGRlZmluZWQoQ09ORklHX1NPVU5EX01QVTQwMSkKKwlpZiAoZGV2Yy0+bW9kZWwgPT0gTURMX0VTUykKKwl7CisJCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7CisJCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyLCAibXB1NDAxIik7CisJCWlmICghcG9ydHMpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAic2JtcHU6IEkvTyBwb3J0IGNvbmZsaWN0ICgleClcbiIsIGh3X2NvbmZpZy0+aW9fYmFzZSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIWVzc19taWRpX2luaXQoZGV2YywgaHdfY29uZmlnKSkgeworCQkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAyKTsKKwkJCXJldHVybiAwOworCQl9CisJCWh3X2NvbmZpZy0+bmFtZSA9ICJFU1MxeHh4IE1QVSI7CisJCWRldmMtPm1pZGlfaXJxX2Nvb2tpZSA9IE5VTEw7CisJCWlmICghcHJvYmVfbXB1NDAxKGh3X2NvbmZpZywgcG9ydHMpKSB7CisJCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYXR0YWNoX21wdTQwMShod19jb25maWcsIG93bmVyKTsKKwkJaWYgKGxhc3Rfc2ItPmlycSA9PSAtaHdfY29uZmlnLT5pcnEpCisJCQlsYXN0X3NiLT5taWRpX2lycV9jb29raWU9KHZvaWQgKilod19jb25maWctPnNsb3RzWzFdOworCQlyZXR1cm4gMTsKKwl9CisjZW5kaWYKKworCXN3aXRjaCAoZGV2Yy0+bW9kZWwpCisJeworCQljYXNlIE1ETF9TQjE2OgorCQkJaWYgKGh3X2NvbmZpZy0+aW9fYmFzZSAhPSAweDMwMCAmJiBod19jb25maWctPmlvX2Jhc2UgIT0gMHgzMzApCisJCQl7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJTQjE2OiBJbnZhbGlkIE1JREkgcG9ydCAleFxuIiwgaHdfY29uZmlnLT5pb19iYXNlKTsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWh3X2NvbmZpZy0+bmFtZSA9ICJTb3VuZCBCbGFzdGVyIDE2IjsKKwkJCWlmIChod19jb25maWctPmlycSA8IDMgfHwgaHdfY29uZmlnLT5pcnEgPT0gZGV2Yy0+aXJxKQorCQkJCWh3X2NvbmZpZy0+aXJxID0gLWRldmMtPmlycTsKKwkJCWlmIChkZXZjLT5taW5vciA+IDEyKQkJLyogV2hhdCBpcyBWaWJyYSdzIHZlcnNpb24/Pz8gKi8KKwkJCQlzYjE2X3NldF9tcHVfcG9ydChkZXZjLCBod19jb25maWcpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRExfSkFaWjoKKwkJCWlmIChod19jb25maWctPmlycSA8IDMgfHwgaHdfY29uZmlnLT5pcnEgPT0gZGV2Yy0+aXJxKQorCQkJCWh3X2NvbmZpZy0+aXJxID0gLWRldmMtPmlycTsKKwkJCWlmICghaW5pdF9KYXp6MTZfbWlkaShkZXZjLCBod19jb25maWcpKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBNRExfWU1QQ0k6CisJCQlod19jb25maWctPm5hbWUgPSAiWWFtYWhhIFBDSSBMZWdhY3kiOworCQkJcHJpbnRrKCJZYW1haGEgUENJIGxlZ2FjeSBVQVJUNDAxIGNoZWNrLlxuIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KKwkKKwlyZXQgPSBwcm9iZV91YXJ0NDAxKGh3X2NvbmZpZywgb3duZXIpOworCWlmIChyZXQpCisJCWxhc3Rfc2ItPm1pZGlfaXJxX2Nvb2tpZT1taWRpX2RldnNbaHdfY29uZmlnLT5zbG90c1s0XV0tPmRldmM7CisJcmV0dXJuIHJldDsKK30KKwordm9pZCB1bmxvYWRfc2JtcHUoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworI2lmIGRlZmluZWQoQ09ORklHX1NPVU5EX01QVTQwMSkKKwlpZiAoIXN0cmNtcCAoaHdfY29uZmlnLT5uYW1lLCAiRVNTMXh4eCBNUFUiKSkgeworCQl1bmxvYWRfbXB1NDAxKGh3X2NvbmZpZyk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKwl1bmxvYWRfdWFydDQwMShod19jb25maWcpOworfQorCitFWFBPUlRfU1lNQk9MKHNiX2RzcF9pbml0KTsKK0VYUE9SVF9TWU1CT0woc2JfZHNwX2RldGVjdCk7CitFWFBPUlRfU1lNQk9MKHNiX2RzcF91bmxvYWQpOworRVhQT1JUX1NZTUJPTChzYl9iZV9xdWlldCk7CitFWFBPUlRfU1lNQk9MKHByb2JlX3NibXB1KTsKK0VYUE9SVF9TWU1CT0wodW5sb2FkX3NibXB1KTsKK0VYUE9SVF9TWU1CT0woc213X2ZyZWUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NiX2Vzcy5jIGIvc291bmQvb3NzL3NiX2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZTA1ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2JfZXNzLmMKQEAgLTAsMCArMSwxODMyIEBACisjdW5kZWYgRktTX0xPR0dJTkcKKyN1bmRlZiBGS1NfVEVTVAorCisvKgorICogdGFicyBzaG91bGQgYmUgNCBzcGFjZXMsIGluIHZpKG0pOiBzZXQgdGFic3RvcD00CisgKgorICogVE9ETzogCWNvbnNpc3RlbmN5IHNwZWVkIGNhbGN1bGF0aW9ucyEhCisgKgkJCWNsZWFudXAhCisgKiA/Pz8/OglEaWQgSSBicmVhayBNSURJIHN1cHBvcnQ/CisgKgorICogSGlzdG9yeToKKyAqCisgKiBSb2xmIEZva2tlbnMJIChEZWMgMjAgMTk5OCk6CUVTMTg4eCByZWNvcmRpbmcgbGV2ZWwgc3VwcG9ydCBvbiBhIHBlcgorICogZm9ra2Vuc3JAdmVydGlzLm5sCQkJaW5wdXQgYmFzaXMuCisgKgkJCQkgKERlYyAyNCAxOTk4KToJUmVjb2duaXRpb24gb2YgRVMxNzg4LCBFUzE4ODcsIEVTMTg4OCwKKyAqCQkJCQkJCQlFUzE4NjgsIEVTMTg2OSBhbmQgRVMxODc4LiBDb3VsZCBiZSB1c2VkIGZvcgorICoJCQkJCQkJCXNwZWNpZmljIGhhbmRsaW5nIGluIHRoZSBmdXR1cmUuIEFsbCBleGNlcHQKKyAqCQkJCQkJCQlFUzE4ODcgYW5kIEVTMTg4OCBhbmQgRVM2ODggYXJlIGhhbmRsZWQgbGlrZQorICoJCQkJCQkJCUVTMTY4OC4KKyAqCQkJCSAoRGVjIDI3IDE5OTgpOglSRUNMRVYgZm9yIGFsbCAoPykgRVMxNjg4KyBjaGlwcy4gRVMxODh4IG5vdworICoJCQkJCQkJCWhhdmUgdGhlICJEZWMgMjAiIHN1cHBvcnQgKyBSRUNMRVYKKyAqCQkJCSAoSmFuICAyIDE5OTkpOglQcmVwYXJhdGlvbiBmb3IgRnVsbCBEdXBsZXguIFRoaXMgbWVhbnMKKyAqCQkJCQkJCQlBdWRpbyAyIGlzIG5vdyB1c2VkIGZvciBwbGF5YmFjayB3aGVuIGRtYTE2CisgKgkJCQkJCQkJaXMgc3BlY2lmaWVkLiBUaGUgbmV4dCBzdGVwIHdvdWxkIGJlIHRvIHVzZQorICoJCQkJCQkJCUF1ZGlvIDEgYW5kIEF1ZGlvIDIgYXQgdGhlIHNhbWUgdGltZS4KKyAqCQkJCSAoSmFuICA5IDE5OTkpOglQdXQgYWxsIEVTUyBzdHVmZiBpbnRvIHNiX2Vzcy5bY2hdLCB0aGlzCisgKgkJCQkJCQkJaW5jbHVkZXMgYm90aCB0aGUgRVNTIHN0dWZmIHRoYXQgaGFzIGJlZW4gaW4KKyAqCQkJCQkJCQlzYl8qW2NoXSBiZWZvcmUgSSB0b3VjaGVkIGl0IGFuZCB0aGUgRVNTIHN1cHBvcnQKKyAqCQkJCQkJCQlJIGFkZGVkIGxhdGVyCisgKgkJCQkgKEphbiAyMyAxOTk5KToJRnVsbCBEdXBsZXggc2VlbXMgdG8gd29yay4gSSB3cm90ZSBhIHNtYWxsCisgKgkJCQkJCQkJdGVzdCBwcm9nZ3kgd2hpY2ggd29ya3MgT0suIEhhdmVuJ3QgZm91bmQKKyAqCQkJCQkJCQlhbnkgYXBwbGljYXRpb25zIHRvIHRlc3QgaXQgdGhvdWdoLiBTbyB3aHkgZGlkCisgKgkJCQkJCQkJSSBib3RoZXIgdG8gY3JlYXRlIGl0IGFueXdheT8/IDopIEp1c3QgZm9yCisgKgkJCQkJCQkJZnVuLgorICoJCQkJIChNYXkgIDIgMTk5OSk6CUkgdHJpZWQgdG8gYmUgdG9vIHNtYXJ0IGJ5ICJpbnRyb2R1Y2luZyIKKyAqCQkJCQkJCQllc3NfY2FsY19iZXN0X3NwZWVkICgpLiBUaGUgaWRlYSB3YXMgdGhhdCB0d28KKyAqCQkJCQkJCQlkaXZpZGVycyBjb3VsZCBiZSB1c2VkIHRvIHNldHVwIGEgc2FtcGxlcmF0ZSwKKyAqCQkJCQkJCQllc3NfY2FsY19iZXN0X3NwZWVkICgpIHdvdWxkIGNob29zZSB0aGUgYmVzdC4KKyAqCQkJCQkJCQlUaGlzIHdvcmtzIGZvciBwbGF5YmFjaywgYnV0IHJlc3VsdHMgaW4KKyAqCQkJCQkJCQlyZWNvcmRpbmcgcHJvYmxlbXMgZm9yIGhpZ2ggc2FtcGxlcmF0ZXMuIEkKKyAqCQkJCQkJCQlmaXhlZCB0aGlzIGJ5IHJlbW92aW5nIGVzc19jYWxjX2Jlc3Rfc3BlZWQgKCkKKyAqCQkJCQkJCQlhbmQganVzdCBkb2luZyB3aGF0IHRoZSBkb2N1bWVudGF0aW9uIHNheXMuIAorICogQW5keSBTbG9hbmUgICAoSnVuICA0IDE5OTkpOiBTdG9sZSBzb21lIGNvZGUgZnJvbSBBTFNBIHRvIGZpeCB0aGUgcGxheWJhY2sKKyAqIGFuZHlAZ3VpbGRzb2Z0d2FyZS5jb20JCXNwZWVkIG9uIEVTMTg2OSwgRVMxODc5LCBFUzE4ODcsIGFuZCBFUzE4ODguCisgKiAJCQkJCQkJCTE4NzkncyB3ZXJlIHByZXZpb3VzbHkgaWdub3JlZCBieSB0aGlzIGRyaXZlcjsKKyAqIAkJCQkJCQkJYWRkZWQgKHVudGVzdGVkKSBzdXBwb3J0IGZvciB0aG9zZS4KKyAqIEN2ZXRhbiBJdmFub3YgKE9jdCAyNyAxOTk5KTogRml4ZWQgZXNzX2RzcF9pbml0IHRvIGNhbGwgZXNzX3NldF9kbWFfaHcgZm9yCisgKiB6ZXpvQGluZXQuYmcJCQkJCV9BTExfIEVTUyBtb2RlbHMsIG5vdCBvbmx5IEVTMTg4NworICoKKyAqIFRoaXMgZmlsZXMgY29udGFpbnMgRVNTIGNoaXAgc3BlY2lmaWNzLiBJdCdzIGJhc2VkIG9uIHRoZSBleGlzdGluZyBFU1MKKyAqIGhhbmRsaW5nIGFzIGl0IHJlc2lkZWQgaW4gc2JfY29tbW9uLmMsIHNiX21peGVyLmMgYW5kIHNiX2F1ZGlvLmMuIFRoaXMKKyAqIGZpbGUgYWRkcyBmZWF0dXJlcyBsaWtlOgorICogLSBDaGlwIElkZW50aWZpY2F0aW9uIChhcyBzaG93biBpbiAvcHJvYy9zb3VuZCkKKyAqIC0gUkVDTEVWIHN1cHBvcnQgZm9yIEVTMTY4OCBhbmQgbGF0ZXIKKyAqIC0gNiBiaXRzIHBsYXliYWNrIGxldmVsIHN1cHBvcnQgY2hpcHMgbGF0ZXIgdGhhbiBFUzE2ODgKKyAqIC0gUmVjb3JkaW5nIGxldmVsIHN1cHBvcnQgb24gYSBwZXItZGV2aWNlIGJhc2lzIGZvciBFUzE4ODcKKyAqIC0gRnVsbC1EdXBsZXggZm9yIEVTMTg4NworICoKKyAqIEZ1bGwgZHVwbGV4IGlzIGVuYWJsZWQgYnkgc3BlY2lmeWluZyBkbWExNi4gV2hpbGUgdGhlIG5vcm1hbCBkbWEgbXVzdAorICogYmUgb25lIG9mIDAsIDEgb3IgMywgZG1hMTYgY2FuIGJlIG9uZSBvZiAwLCAxLCAzIG9yIDUuIERNQSA1IGlzIGEgMTYgYml0CisgKiBETUEgY2hhbm5lbCwgd2hpbGUgdGhlIG90aGVycyBhcmUgOCBiaXQuLgorICoKKyAqIEVTUyBkZXRlY3Rpb24gaXNuJ3QgZnVsbCBwcm9vZiAoeWV0KS4gSWYgaXQgZmFpbHMgYW4gYWRkaXRpb25hbCBtb2R1bGUKKyAqIHBhcmFtZXRlciBlc3N0eXBlIGNhbiBiZSBzcGVjaWZpZWQgdG8gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAtMSwgMCwgNjg4LCAxNjg4LCAxODY4LCAxODY5LCAxNzg4LCAxODg3LCAxODg4CisgKiAtMSBtZWFuczogbWltaWMgMi4wIGJlaGF2aW91ciwgCisgKiAgMCBtZWFuczogYXV0byBkZXRlY3QuCisgKiAgIG90aGVyczogZXhwbGljaXRseSBzcGVjaWZ5IGNoaXAKKyAqIC0xIGlzIGRlZmF1bHQsIGNhdXNlIGF1dG8gZGV0ZWN0IHN0aWxsIGRvZXNuJ3Qgd29yay4KKyAqLworCisvKgorICogQWJvdXQgdGhlIGRvY3VtZW50YXRpb24KKyAqCisgKiBJIGRvbid0IGtub3cgaWYgdGhlIGNoaXBzIGFsbCBhcmUgT0ssIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBidWdneS4gJ2NhdXNlCisgKiBJIGRvbid0IGhhdmUgYWxsIHRoZSBjaXBzIG15c2VsZiwgdGhlcmUncyBhIGxvdCBJIGNhbm5vdCB2ZXJpZnkuIEknbGwgdHJ5IHRvCisgKiBrZWVwIHRyYWNrIG9mIG15IGxhdGVzdCBpbnNpZ2h0cyBhYm91dCBoaXMgaGVyZS4gSWYgeW91IGhhdmUgYWRkaXRpb25hbCBpbmZvLAorICogcGxlYXNlIGVubGlnaHRlbiBtZSAoZm9ra2Vuc3JAdmVydGlzLm5sKSEKKyAqCisgKiBJIGhhZCB0aGUgaW1wcmVzc2lvbiB0aGF0IEVTMTY4OCBhbHNvIGhhcyA2IGJpdCBtYXN0ZXIgdm9sdW1lIGNvbnRyb2wuIFRoZQorICogZG9jdW1lbnRhdGlvbiBhYm91dCBFUzE4ODggKHJldiBDLCBvY3RvYmVyICc5NSkgY2xhaW1zIHRoYXQgRVMxODg4IGhhcworICogdGhlIGZvbGxvd2luZyBmZWF0dXJlcyBFUzE2ODggZG9lc24ndCBoYXZlOgorICogLSA2IGJpdCBtYXN0ZXIgdm9sdW1lCisgKiAtIEZ1bGwgRHVwbGV4CisgKiBTbyBFUzE2ODggYXBwYXJlbnRseSBkb2Vzbid0IGhhdmUgNiBiaXQgbWFzdGVyIHZvbHVtZSBjb250cm9sLCBidXQgdGhlCisgKiBFUzE2ODggZG9lcyBoYXZlIFJFQ0xFViBjb250cm9sLiBNYWtlcyBtZSB3b25kZXI6IGRvZXMgRVM2ODggaGF2ZSBpdCB0b28/CisgKiBXaXRob3V0IFJFQ0xFViBFUzY4OCB3b24ndCBiZSBtdWNoIGZ1biBJIGd1ZXNzLgorICoKKyAqIEZyb20gdGhlIEVTMTg4OCAocmV2IEMsIG9jdG9iZXIgJzk1KSBkb2N1bWVudGF0aW9uIEkgZ290IHRoZSBpbXByZXNzaW9uCisgKiB0aGF0IHJlZ2lzdGVycyAweDY4IHRvIDB4NmUgZG9uJ3QgZXhpc3Qgd2hpY2ggbWVhbnM6IG5vIHJlY29yZGluZyB2b2x1bWUKKyAqIGNvbnRyb2xzLiBUbyBteSBzdXJwcmlzZSB0aGUgRVM4ODggZG9jdW1lbnRhdGlvbiAoMS8xNC85NikgY2xhaW1zIHRoYXQKKyAqIEVTODg4IGRvZXMgaGF2ZSB0aGVzZSByZWNvcmQgbWl4ZXIgcmVnaXN0ZXJzLCBidXQgdGhhdCBFUzE4ODggZG9lc24ndCBoYXZlCisgKiAweDY5IGFuZCAweDZiLiBTbyB0aGUgcmVzdCBzaG91bGQgYmUgdGhlcmUuCisgKgorICogSSdtIHRyeWluZyB0byBnZXQgRVMxODg3IEZ1bGwgRHVwbGV4LiBBdWRpbyAyIGlzIHBsYXliYWNrIG9ubHksIHdoaWxlIEF1ZGlvIDIKKyAqIGlzIGJvdGggcmVjb3JkIGFuZCBwbGF5YmFjay4gSSB0aGluayBJIHNob3VsZCB1c2UgQXVkaW8gMiBmb3IgYWxsIHBsYXliYWNrLgorICoKKyAqIFRoZSBkb2N1bWVudGF0aW9uIGlzIGFuIGFkdmVudHVyZTogaXQncyBjbG9zZSBidXQgbm90IGZ1bGx5IGFjY3VyYXRlLiBJCisgKiBmb3VuZCBvdXQgdGhhdCBhZnRlciBhIHJlc2V0IHNvbWUgcmVnaXN0ZXJzIGFyZSAqTk9UKiByZXNldCwgdGhvdWdoIHRoZQorICogZG9jcyBzYXkgdGhlIHdvdWxkIGJlLiBJbnRlcnJlc3Rpbmcgb25lcyBhcmUgMHg3ZiwgMHg3ZCBhbmQgMHg3YS4gVGhleSBhcmUKKyAqIHJlbGF0ZWQgdG8gdGhlIEF1ZGlvIDIgY2hhbm5lbC4gSSBhbHNvIHdhcyBzdXByaXNlZCBhYm91dCB0aGUgY29uc2VxdWVuc2VzCisgKiBvZiB3cml0aW5nIDB4MDAgdG8gMHg3ZiAod2hpY2ggc2hvdWxkIGJlIGRvbmUgYnkgcmVzZXQpOiBUaGUgRVMxODg3IG1vdmVzCisgKiBpbnRvIEVTMTg4OCBtb2RlLiBUaGlzIG1lYW5zIHRoYXQgaXQgY2xhaW1zIElSUSAxMSwgd2hpY2ggaGFwcGVucyB0byBiZSBteQorICogSVNETiBhZGFwdGVyLiBOZWVkbGVzcyB0byBzYXkgaXQgbm8gbG9uZ2VyIHdvcmtlZC4gSSBub3cgdW5kZXJzdGFuZCB3aHkKKyAqIGFmdGVyIHJlYm9vdGluZyAweDdmIGFscmVhZHkgd2FzIDB4MDUsIHRoZSB2YWx1ZSBvZiBteSBjaG9pY2U6IHRoZSBCSU9TCisgKiBkaWQgaXQuCisgKgorICogT2gsIGFuZCB0aGlzIGlzIGFub3RoZXIgdHJhcDogaW4gRVMxODg3IGRvY3MgbWl4ZXIgcmVnaXN0ZXIgMHg3MCBpcyBkZWNyaWJlZAorICogYXMgaWYgaXQncyBleGFjdGx5IHRoZSBzYW1lIGFzIHJlZ2lzdGVyIDB4YTEuIFRoaXMgaXMgKk5PVCogdHJ1ZS4gVGhlCisgKiBkZXNjcmlwdGlvbiBvZiAweDcwIGluIEVTMTg2OSBkb2NzIGlzIGFjY3VyYXRlIGhvd2V2ZXIuCisgKiBXZWxsLCB0aGUgYXNzdW1wdGlvbiBhYm91dCBFUzE4Njkgd2FzIHdyb25nOiByZWdpc3RlciAweDcwIGlzIHZlcnkgbXVjaAorICogbGlrZSByZWdpc3RlciAweGExLCBleGNlcHQgdGhhdCBiaXQgNyBpcyBhbGx3YXlzIDEsIHdoYXRldmVyIHlvdSB3YW50CisgKiBpdCB0byBiZS4KKyAqCisgKiBXaGVuIHVzaW5nIGF1ZGlvIDIgbWl4ZXIgcmVnaXN0ZXIgMHg3MiBzZWVtcyB0ZSBiZSBtZWFuaW5nbGVzcy4gT25seSAweGEyCisgKiBoYXMgZWZmZWN0LgorICoKKyAqIFNvZnR3YXJlIHJlc2V0IG5vdCBiZWluZyBhYmxlIHRvIHJlc2V0IGFsbCByZWdpc3RlcnMgaXMgZ3JlYXQhIEVzcGVjaWFsbHkKKyAqIHRoZSBmYWN0IHRoYXQgcmVnaXN0ZXIgMHg3OCBpc24ndCByZXNldCBpcyBncmVhdCB3aGVuIHlvdSB3YW5uYSBjaGFuZ2UgYmFjaworICogdG8gc2luZ2xlIGRtYSBvcGVyYXRpb24gKHNpbXBsZXgpOiBhdWRpbyAyIGlzIHN0aWxsIG9wZXJhdGlvbiwgYW5kIHVzZXMgdGhlCisgKiBzYW1lIGRtYSBhcyBhdWRpbyAxOiB5b3VyIGVzcyBjaGFuZ2VzIGludG8gYSBmdW5ueSBlY2hvIG1hY2hpbmUuCisgKgorICogUmVjZWl2ZWQgdGhlIG5ldyB0aGF0IEVTMTY4OCBpcyBkZXRlY3RlZCBhcyBhIEVTMTc4OC4gRGlkIHNvbWUgdGhpbmtpbmc6CisgKiB0aGUgRVMxODg3IGRldGVjdGlvbiBzY2hlbWUgc3VnZ2VzdHMgaW4gc3RlcCAyIHRvIHRyeSBpZiBiaXQgMyBvZiByZWdpc3RlcgorICogMHg2NCBjYW4gYmUgY2hhbmdlZC4gVGhpcyBpcyBpbmFjY3VyYXRlLCBmaXJzdCBJIGludmVydGVkIHRoZSAqIGNoZWNrOiAiSWYKKyAqIGNhbiBiZSBtb2RpZmllZCwgaXQncyBhIDE2ODgiLCB3aGljaCBsZWFkIHRvIGEgY29ycmVjdCBkZXRlY3Rpb24KKyAqIG9mIG15IEVTMTg4Ny4gSXQgcmVzdWx0ZWQgaG93ZXZlciBpbiBiYWQgZGV0ZWN0aW9uIG9mIDE2ODggKHJlcG9ydGVkIGJ5IG1haWwpCisgKiBhbmQgMTg2OCAoaWYgbm8gUG5QIGRldGVjdGlvbiBmaXJzdCk6IHRoZXkgcmVzdWx0IGluIGEgMTc4OCBiZWluZyBkZXRlY3RlZC4KKyAqIEkgZG9uJ3QgaGF2ZSBkb2NzIG9uIDE2ODgsIGJ1dCBJIGRvIGhhdmUgZG9jcyBvbiAxODY4OiBUaGUgZG9jdW1lbnRhdGlvbiBpcworICogcHJvYmFibHkgaW5hY2N1cmF0ZSBpbiB0aGUgZmFjdCB0aGF0IEkgc2hvdWxkIGNoZWNrIGJpdCAyLCBub3QgYml0IDMuIFRoaXMKKyAqIGlzIHdoYXQgSSBkbyBub3cuCisgKi8KKworLyoKKyAqIEFib3V0IHJlY29nbml0aW9uIG9mIEVTUyBjaGlwcworICoKKyAqIFRoZSBkaXN0aW5jdGlvbiBvZiBFUzY4OCwgRVMxNjg4LCBFUzE3ODgsIEVTMTg4NyBhbmQgRVMxODg4IGlzIGRlc2NyaWJlZCBpbgorICogYSAocHJlbGltaW5hcnkgPz8pIGRhdGFzaGVldCBvbiBFUzE4ODcuIEl0J3MgYWltIGlzIHRvIGlkZW50aWZ5IEVTMTg4NywgYnV0CisgKiBkdXJpbmcgZGV0ZWN0aW9uIHRoZSB0ZXh0IGNsYWltcyB0aGF0ICJ0aGlzIGNoaXAgbWF5IGJlIC4uLiIgd2hlbiBhIHN0ZXAKKyAqIGZhaWxzLiBUaGlzIHNjaGVtZSBpcyB1c2VkIHRvIGRpc3RpbmN0IGJldHdlZW4gdGhlIGFib3ZlIGNoaXBzLgorICogSXQgYXBwZWFycyBob3dldmVyIHRoYXQgc29tZSBQblAgY2hpcHMgbGlrZSBFUzE4NjggYXJlIHJlY29nbml6ZWQgYXMgRVMxNzg4CisgKiBieSB0aGUgRVMxODg3IGRldGVjdGlvbiBzY2hlbWUuIFRoZXNlIFBuUCBjaGlwcyBjYW4gYmUgZGV0ZWN0ZWQgaW4gYW5vdGhlcgorICogd2F5IGhvd2V2ZXI6IEVTMTg2OCwgRVMxODY5IGFuZCBFUzE4NzggY2FuIGJlIHJlY29nbml6ZWQgKGZ1bGwgcHJvb2YgSSB0aGluaykKKyAqIGJ5IHJlcGVhdGVkbHkgcmVhZGluZyBtaXhlciByZWdpc3RlciAweDQwLiBUaGlzIGlzIGRvbmUgYnkgZXNzX2lkZW50aWZ5IGluCisgKiBzYl9jb21tb24uYy4KKyAqIFRoaXMgcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nIGRldGVjdGlvbiBzdGVwczoKKyAqIC0gZGlzdGluY3QgYmV0d2VlbiBFUzY4OCBhbmQgRVMxNjg4KyAoYXMgYWx3YXlzIGRvbmUgaW4gdGhpcyBkcml2ZXIpCisgKiAgIGlmIEVTNjg4IHdlJ3JlIHJlYWR5CisgKiAtIHRyeSB0byBkZXRlY3QgRVMxODY4LCBFUzE4Njkgb3IgRVMxODc4CisgKiAgIGlmIHN1Y2Nlc3NmdWwgd2UncmUgcmVhZHkKKyAqIC0gdHJ5IHRvIGRldGVjdCBFUzE4ODgsIEVTMTg4NyBvciBFUzE3ODgKKyAqICAgaWYgc3VjY2Vzc2Z1bCB3ZSdyZSByZWFkeQorICogLSBEdW5uby4gTXVzdCBiZSAxNjg4LiBXaWxsIGRvIGluIGdlbmVyYWwKKyAqCisgKiBBYm91dCBSRUNMRVYgc3VwcG9ydDoKKyAqCisgKiBUaGUgZXhpc3RpbmcgRVMxNjg4IHN1cHBvcnQgZGlkbid0IHRha2UgY2FyZSBvZiB0aGUgRVMxNjg4KyByZWNvcmRpbmcKKyAqIGxldmVscyB2ZXJ5IHdlbGwuIFdoZW5ldmVyIGEgZGV2aWNlIHdhcyBzZWxlY3RlZCAocmVjbWFzaykgZm9yIHJlY29yZGluZworICogaXQncyByZWNvcmRpbmcgbGV2ZWwgd2FzIGxvdWQsIGFuZCBpdCBjb3VsZG4ndCBiZSBjaGFuZ2VkLiBUaGUgZmFjdCB0aGF0CisgKiBpbnRlcm5hbCByZWdpc3RlciAweGI0IGNvdWxkIHRha2UgY2FyZSBvZiBSRUNMRVYsIGRpZG4ndCB3b3JrIG1lYW5pbmcgdW50aWwKKyAqIGl0J3MgdmFsdWUgd2FzIHJlc3RvcmVkIGV2ZXJ5IHRpbWUgdGhlIGNoaXAgd2FzIHJlc2V0OyB0aGlzIHJlc2V0IHRoZQorICogdmFsdWUgb2YgMHhiNCB0b28uIEkgZ3Vlc3MgdGhhdCdzIHdoYXQgNGZyb250IGFsc28gaGFkIChoYXZlPykgdHJvdWJsZSB3aXRoLgorICoKKyAqIEFib3V0IEVTMTg4NyBzdXBwb3J0OgorICoKKyAqIFRoZSBFUzE4ODcgaGFzIHNlcGFyYXRlIHJlZ2lzdGVycyB0byBjb250cm9sIHRoZSByZWNvcmRpbmcgbGV2ZWxzLCBmb3IgYWxsCisgKiBpbnB1dHMuIFRoZSBFUzE4ODcgc3BlY2lmaWMgc29mdHdhcmUgbWFrZXMgdGhlc2UgbGV2ZWxzIHRoZSBzYW1lIGFzIHRoZWlyCisgKiBjb3JyZXNwb25kaW5nIHBsYXliYWNrIGxldmVscywgdW5sZXNzIHJlY21hc2sgc2F5cyB0aGV5IGFyZW4ndCByZWNvcmRlZC4gSW4KKyAqIHRoZSBsYXR0ZXIgY2FzZSB0aGUgcmVjb3JkaW5nIHZvbHVtZXMgYXJlIDAuCisgKiBOb3cgcmVjb3JkaW5nIGxldmVscyBvZiBpbnB1dHMgY2FuIGJlIGNvbnRyb2xsZWQsIGJ5IGNoYW5naW5nIHRoZSBwbGF5YmFjaworICogbGV2ZWxzLiBGdXRoZXJtb3JlIHNldmVyYWwgZGV2aWNlcyBjYW4gYmUgcmVjb3JkZWQgdG9nZXRoZXIgKHdoaWNoIGlzIG5vdAorICogcG9zc2libGUgd2l0aCB0aGUgRVMxNjg4LgorICogQmVzaWRlcyB0aGUgc2VwYXJhdGUgcmVjb3JkaW5nIGxldmVsIGNvbnRyb2wgZm9yIGVhY2ggaW5wdXQsIHRoZSBjb21tb24KKyAqIHJlY29yZGlnIGxldmVsIGNhbiBhbHNvIGJlIGNvbnRyb2xsZWQgYnkgUkVDTEVWIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAqCisgKiBOb3Qgb25seSBFUzE4ODcgaGF2ZSB0aGlzIHJlY29yZGluZyBtaXhlci4gSSBrbm93IHRoZSBmb2xsb3dpbmcgZnJvbSB0aGUKKyAqIGRvY3VtZW50YXRpb246CisgKiBFUzY4OAlubworICogRVMxNjg4CW5vCisgKiBFUzE4NjgJbm8KKyAqIEVTMTg2OQl5ZXMKKyAqIEVTMTg3OAlubworICogRVMxODc5CXllcworICogRVMxODg4CW5vL3llcwlDb250cmFkaWN0aW5nIGRvY3VtZW50YXRpb247IG1vc3QgcmVjZW50OiB5ZXMKKyAqIEVTMTk0Ngl5ZXMJCVRoaXMgaXMgYSBQQ0kgY2hpcDsgbm90IGhhbmRsZWQgYnkgdGhpcyBkcml2ZXIKKyAqLworCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAic2JfbWl4ZXIuaCIKKyNpbmNsdWRlICJzYi5oIgorCisjaW5jbHVkZSAic2JfZXNzLmgiCisKKyNkZWZpbmUgRVNTVFlQRV9MSUtFMjAJLTEJCS8qIE1pbWljIDIuMCBiZWhhdmlvdXIJCQkJCSovCisjZGVmaW5lIEVTU1RZUEVfREVURUNUCTAJCS8qIE1pbWljIDIuMCBiZWhhdmlvdXIJCQkJCSovCisKKyNkZWZpbmUgU1VCTURMX0VTMTc4OAkweDEwCS8qIFN1YnR5cGUgRVMxNzg4IGZvciBzcGVjaWZpYyBoYW5kbGluZyAqLworI2RlZmluZSBTVUJNRExfRVMxODY4CTB4MTEJLyogU3VidHlwZSBFUzE4NjggZm9yIHNwZWNpZmljIGhhbmRsaW5nICovCisjZGVmaW5lIFNVQk1ETF9FUzE4NjkJMHgxMgkvKiBTdWJ0eXBlIEVTMTg2OSBmb3Igc3BlY2lmaWMgaGFuZGxpbmcgKi8KKyNkZWZpbmUgU1VCTURMX0VTMTg3OAkweDEzCS8qIFN1YnR5cGUgRVMxODc4IGZvciBzcGVjaWZpYyBoYW5kbGluZyAqLworI2RlZmluZSBTVUJNRExfRVMxODc5CTB4MTYgICAgLyogRVMxODc5IHdhcyBpbml0aWFsbHkgZm9yZ290dGVuICovCisjZGVmaW5lIFNVQk1ETF9FUzE4ODcJMHgxNAkvKiBTdWJ0eXBlIEVTMTg4NyBmb3Igc3BlY2lmaWMgaGFuZGxpbmcgKi8KKyNkZWZpbmUgU1VCTURMX0VTMTg4OAkweDE1CS8qIFN1YnR5cGUgRVMxODg4IGZvciBzcGVjaWZpYyBoYW5kbGluZyAqLworCisjZGVmaW5lIFNCX0NBUF9FUzE4WFhfUkFURSAweDEwMAorCisjZGVmaW5lIEVTMTY4OF9DTE9DSzEgNzk1NDQ0IC8qIDEyOCAtIGRpdiAqLworI2RlZmluZSBFUzE2ODhfQ0xPQ0syIDM5NzcyMiAvKiAyNTYgLSBkaXYgKi8KKyNkZWZpbmUgRVMxOFhYX0NMT0NLMSA3OTM4MDAgLyogMTI4IC0gZGl2ICovCisjZGVmaW5lIEVTMThYWF9DTE9DSzIgNzY4MDAwIC8qIDI1NiAtIGRpdiAqLworCisjaWZkZWYgRktTX0xPR0dJTkcKK3N0YXRpYyB2b2lkIGVzc19zaG93X21peGVycmVncyAoc2JfZGV2YyAqZGV2Yyk7CisjZW5kaWYKK3N0YXRpYyBpbnQgZXNzX3JlYWQgKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBjaGFyIHJlZyk7CitzdGF0aWMgaW50IGVzc193cml0ZSAoc2JfZGV2YyAqIGRldmMsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIGRhdGEpOworc3RhdGljIHZvaWQgZXNzX2NoZ21peGVyCisJKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBpbnQgcmVnLCB1bnNpZ25lZCBpbnQgbWFzaywgdW5zaWduZWQgaW50IHZhbCk7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJCQkJCQkJCQkJCQkJCQkqCisgKgkJCQkJCQkJCUVTUyBhdWRpbwkJCQkJCQkJKgorICoJCQkJCQkJCQkJCQkJCQkJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0cnVjdCBlc3NfY29tbWFuZCB7c2hvcnQgY21kOyBzaG9ydCBkYXRhO307CisKKy8qCisgKiBDb21tYW5kcyBmb3IgaW5pdGlhbGl6aW5nIEF1ZGlvIDEgZm9yIGlucHV0IChyZWNvcmQpCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZXNzX2NvbW1hbmQgZXNzX2kwOG1bXSA9CQkvKiBpbnB1dCA4IGJpdCBtb25vICovCisJeyB7MHhiNywgMHg1MX0sIHsweGI3LCAweGQwfSwgey0xLCAwfSB9Oworc3RhdGljIHN0cnVjdCBlc3NfY29tbWFuZCBlc3NfaTE2bVtdID0JCS8qIGlucHV0IDE2IGJpdCBtb25vICovCisJeyB7MHhiNywgMHg3MX0sIHsweGI3LCAweGY0fSwgey0xLCAwfSB9Oworc3RhdGljIHN0cnVjdCBlc3NfY29tbWFuZCBlc3NfaTA4c1tdID0JCS8qIGlucHV0IDggYml0IHN0ZXJlbyAqLworCXsgezB4YjcsIDB4NTF9LCB7MHhiNywgMHg5OH0sIHstMSwgMH0gfTsKK3N0YXRpYyBzdHJ1Y3QgZXNzX2NvbW1hbmQgZXNzX2kxNnNbXSA9CQkvKiBpbnB1dCAxNiBiaXQgc3RlcmVvICovCisJeyB7MHhiNywgMHg3MX0sIHsweGI3LCAweGJjfSwgey0xLCAwfSB9OworCitzdGF0aWMgc3RydWN0IGVzc19jb21tYW5kICplc3NfaW5wX2NtZHNbXSA9CisJeyBlc3NfaTA4bSwgZXNzX2kxNm0sIGVzc19pMDhzLCBlc3NfaTE2cyB9OworCisKKy8qCisgKiBDb21tYW5kcyBmb3IgaW5pdGlhbGl6aW5nIEF1ZGlvIDEgZm9yIG91dHB1dCAocGxheWJhY2spCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZXNzX2NvbW1hbmQgZXNzX28wOG1bXSA9CQkvKiBvdXRwdXQgOCBiaXQgbW9ubyAqLworCXsgezB4YjYsIDB4ODB9LCB7MHhiNywgMHg1MX0sIHsweGI3LCAweGQwfSwgey0xLCAwfSB9Oworc3RhdGljIHN0cnVjdCBlc3NfY29tbWFuZCBlc3NfbzE2bVtdID0JCS8qIG91dHB1dCAxNiBiaXQgbW9ubyAqLworCXsgezB4YjYsIDB4MDB9LCB7MHhiNywgMHg3MX0sIHsweGI3LCAweGY0fSwgey0xLCAwfSB9Oworc3RhdGljIHN0cnVjdCBlc3NfY29tbWFuZCBlc3NfbzA4c1tdID0JCS8qIG91dHB1dCA4IGJpdCBzdGVyZW8gKi8KKwl7IHsweGI2LCAweDgwfSwgezB4YjcsIDB4NTF9LCB7MHhiNywgMHg5OH0sIHstMSwgMH0gfTsKK3N0YXRpYyBzdHJ1Y3QgZXNzX2NvbW1hbmQgZXNzX28xNnNbXSA9CQkvKiBvdXRwdXQgMTYgYml0IHN0ZXJlbyAqLworCXsgezB4YjYsIDB4MDB9LCB7MHhiNywgMHg3MX0sIHsweGI3LCAweGJjfSwgey0xLCAwfSB9OworCitzdGF0aWMgc3RydWN0IGVzc19jb21tYW5kICplc3Nfb3V0X2NtZHNbXSA9CisJeyBlc3NfbzA4bSwgZXNzX28xNm0sIGVzc19vMDhzLCBlc3NfbzE2cyB9OworCitzdGF0aWMgdm9pZCBlc3NfZXhlY19jb21tYW5kcworCShzYl9kZXZjICpkZXZjLCBzdHJ1Y3QgZXNzX2NvbW1hbmQgKmNtZHRhYltdKQoreworCXN0cnVjdCBlc3NfY29tbWFuZCAqY21kOworCisJY21kID0gY21kdGFiIFsgKChkZXZjLT5jaGFubmVscyAhPSAxKSA8PCAxKSArIChkZXZjLT5iaXRzICE9IEFGTVRfVTgpIF07CisKKwl3aGlsZSAoY21kLT5jbWQgIT0gLTEpIHsKKwkJZXNzX3dyaXRlIChkZXZjLCBjbWQtPmNtZCwgY21kLT5kYXRhKTsKKwkJY21kKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBlc3NfY2hhbmdlCisJKHNiX2RldmMgKmRldmMsIHVuc2lnbmVkIGludCByZWcsIHVuc2lnbmVkIGludCBtYXNrLCB1bnNpZ25lZCBpbnQgdmFsKQoreworCWludCB2YWx1ZTsKKworCXZhbHVlID0gZXNzX3JlYWQgKGRldmMsIHJlZyk7CisJdmFsdWUgPSAodmFsdWUgJiB+bWFzaykgfCAodmFsICYgbWFzayk7CisJZXNzX3dyaXRlIChkZXZjLCByZWcsIHZhbHVlKTsKK30KKworc3RhdGljIHZvaWQgZXNzX3NldF9vdXRwdXRfcGFybXMKKwkoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBucl9ieXRlcywgaW50IGludHJmbGFnKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoZGV2Yy0+ZHVwbGV4KSB7CisJCWRldmMtPnRyZ19idWZfMTYgPSBidWY7CisJCWRldmMtPnRyZ19ieXRlc18xNiA9IG5yX2J5dGVzOworCQlkZXZjLT50cmdfaW50cmZsYWdfMTYgPSBpbnRyZmxhZzsKKwkJZGV2Yy0+aXJxX21vZGVfMTYgPSBJTU9ERV9PVVRQVVQ7CisJfSBlbHNlIHsKKwkJZGV2Yy0+dHJnX2J1ZiA9IGJ1ZjsKKwkJZGV2Yy0+dHJnX2J5dGVzID0gbnJfYnl0ZXM7CisJCWRldmMtPnRyZ19pbnRyZmxhZyA9IGludHJmbGFnOworCQlkZXZjLT5pcnFfbW9kZSA9IElNT0RFX09VVFBVVDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVzc19zZXRfaW5wdXRfcGFybXMKKwkoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBjb3VudCwgaW50IGludHJmbGFnKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlkZXZjLT50cmdfYnVmID0gYnVmOworCWRldmMtPnRyZ19ieXRlcyA9IGNvdW50OworCWRldmMtPnRyZ19pbnRyZmxhZyA9IGludHJmbGFnOworCWRldmMtPmlycV9tb2RlID0gSU1PREVfSU5QVVQ7Cit9CisKK3N0YXRpYyBpbnQgZXNzX2NhbGNfZGl2IChpbnQgY2xvY2ssIGludCByZXZlcnQsIGludCAqc3BlZWRwLCBpbnQgKmRpZmZwKQoreworCWludCBkaXZpZGVyOworCWludCBzcGVlZCwgZGlmZjsKKwlpbnQgcmV0dmFsOworCisJc3BlZWQgICA9ICpzcGVlZHA7CisJZGl2aWRlciA9IChjbG9jayArIHNwZWVkIC8gMikgLyBzcGVlZDsKKwlyZXR2YWwgID0gcmV2ZXJ0IC0gZGl2aWRlcjsKKwlpZiAocmV0dmFsID4gcmV2ZXJ0IC0gMSkgeworCQlyZXR2YWwgID0gcmV2ZXJ0IC0gMTsKKwkJZGl2aWRlciA9IHJldmVydCAtIHJldHZhbDsKKwl9CisJLyogVGhpcyBsaW5lIGlzIHN1Z2dlc3RlZC4gTXVzdCBiZSB3cm9uZyBJIHRoaW5rCisJKnNwZWVkcCA9IChjbG9jayArIGRpdmlkZXIgLyAyKSAvIGRpdmlkZXI7CisJU28gSSBjaG9zZSB0aGUgbmV4dCBvbmUgKi8KKworCSpzcGVlZHAJPSBjbG9jayAvIGRpdmlkZXI7CisJZGlmZgk9IHNwZWVkIC0gKnNwZWVkcDsKKwlpZiAoZGlmZiA8IDApIGRpZmYgPS1kaWZmOworCSpkaWZmcCAgPSBkaWZmOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBlc3NfY2FsY19iZXN0X3NwZWVkCisJKGludCBjbG9jazEsIGludCByZXYxLCBpbnQgY2xvY2syLCBpbnQgcmV2MiwgaW50ICpkaXZwLCBpbnQgKnNwZWVkcCkKK3sKKwlpbnQgc3BlZWQxID0gKnNwZWVkcCwgc3BlZWQyID0gKnNwZWVkcDsKKwlpbnQgZGl2MSwgZGl2MjsKKwlpbnQgZGlmZjEsIGRpZmYyOworCWludCByZXR2YWw7CisKKwlkaXYxID0gZXNzX2NhbGNfZGl2IChjbG9jazEsIHJldjEsICZzcGVlZDEsICZkaWZmMSk7CisJZGl2MiA9IGVzc19jYWxjX2RpdiAoY2xvY2syLCByZXYyLCAmc3BlZWQyLCAmZGlmZjIpOworCisJaWYgKGRpZmYxIDwgZGlmZjIpIHsKKwkJKmRpdnAgICA9IGRpdjE7CisJCSpzcGVlZHAgPSBzcGVlZDE7CisJCXJldHZhbCAgPSAxOworCX0gZWxzZSB7CisJLyoJKmRpdnAgICA9IGRpdjI7ICovCisJCSpkaXZwICAgPSAweDgwIHwgZGl2MjsKKwkJKnNwZWVkcCA9IHNwZWVkMjsKKwkJcmV0dmFsICA9IDI7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKKyAqIERlcGVuZGluZyBvbiB0aGUgYXVkaW9jaGFubmVsIEVTUyBkZXZpY2VzIGNhbgorICogaGF2ZSBkaWZmZXJlbnQgY2xvY2sgc2V0dGluZ3MuIFRoZXNlIGFyZSBtYWRlIGNvbnNpc3RlbnQgZm9yIGR1cGxleAorICogaG93ZXZlci4KKyAqIGNhbGxlcnMgb2YgZXNzX3NwZWVkIG9ubHkgZG8gYW4gYXVkaW9udW0gc3VnZ2VzdGlvbiwgd2hpY2ggbWVhbnMKKyAqIGlucHV0IHN1Z2dlc3RzIDEsIG91dHB1dCBzdWdnZXN0cyAyLiBUaGlzIHN1Z2dlc3Rpb24gaXMgb25seSB0cnVlCisgKiBob3dldmVyIHdoZW4gZG9pbmcgZHVwbGV4LgorICovCitzdGF0aWMgdm9pZCBlc3NfY29tbW9uX3NwZWVkIChzYl9kZXZjICpkZXZjLCBpbnQgKnNwZWVkcCwgaW50ICpkaXZwKQoreworCWludCBkaWZmID0gMCwgZGl2OworCisJaWYgKGRldmMtPmR1cGxleCkgeworCQkvKgorCQkgKiBUaGUgMHg4MCBpcyBpbXBvcnRhbnQgZm9yIHRoZSBmaXJzdCBhdWRpbyBjaGFubmVsCisJCSAqLworCQlpZiAoZGV2Yy0+c3VibW9kZWwgPT0gU1VCTURMX0VTMTg4OCkgeworCQkJZGl2ID0gMHg4MCB8IGVzc19jYWxjX2RpdiAoNzk1NTAwLCAyNTYsIHNwZWVkcCwgJmRpZmYpOworCQl9IGVsc2UgeworCQkJZGl2ID0gMHg4MCB8IGVzc19jYWxjX2RpdiAoNzk1NTAwLCAxMjgsIHNwZWVkcCwgJmRpZmYpOworCQl9CisJfSBlbHNlIGlmKGRldmMtPmNhcHMgJiBTQl9DQVBfRVMxOFhYX1JBVEUpIHsKKwkJaWYgKGRldmMtPnN1Ym1vZGVsID09IFNVQk1ETF9FUzE4ODgpIHsKKwkJCWVzc19jYWxjX2Jlc3Rfc3BlZWQoMzk3NzAwLCAxMjgsIDc5NTUwMCwgMjU2LCAKKwkJCQkJCSZkaXYsIHNwZWVkcCk7CisJCX0gZWxzZSB7CisJCQllc3NfY2FsY19iZXN0X3NwZWVkKEVTMThYWF9DTE9DSzEsIDEyOCwgRVMxOFhYX0NMT0NLMiwgMjU2LCAKKwkJCQkJCSZkaXYsIHNwZWVkcCk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKnNwZWVkcCA+IDIyMDAwKSB7CisJCQlkaXYgPSAweDgwIHwgZXNzX2NhbGNfZGl2IChFUzE2ODhfQ0xPQ0sxLCAyNTYsIHNwZWVkcCwgJmRpZmYpOworCQl9IGVsc2UgeworCQkJZGl2ID0gMHgwMCB8IGVzc19jYWxjX2RpdiAoRVMxNjg4X0NMT0NLMiwgMTI4LCBzcGVlZHAsICZkaWZmKTsKKwkJfQorCX0KKwkqZGl2cCA9IGRpdjsKK30KKworc3RhdGljIHZvaWQgZXNzX3NwZWVkIChzYl9kZXZjICpkZXZjLCBpbnQgYXVkaW9udW0pCit7CisJaW50IHNwZWVkOworCWludCBkaXYsIGRpdjI7CisKKwllc3NfY29tbW9uX3NwZWVkIChkZXZjLCAmKGRldmMtPnNwZWVkKSwgJmRpdik7CisKKyNpZmRlZiBGS1NfUkVHX0xPR0dJTkcKK3ByaW50ayAoS0VSTl9JTkZPICJGS1M6IGVzc19zcGVlZCAoJWQpIGIgc3BlZWQgPSAlZCwgZGl2PSV4XG4iLCBhdWRpb251bSwgZGV2Yy0+c3BlZWQsIGRpdik7CisjZW5kaWYKKworCS8qIFNldCBmaWx0ZXIgcm9sbC1vZmYgdG8gOTAlIG9mIHNwZWVkLzIgKi8KKwlzcGVlZCA9IChkZXZjLT5zcGVlZCAqIDkpIC8gMjA7CisKKwlkaXYyID0gMjU2IC0gNzE2MDAwMCAvIChzcGVlZCAqIDgyKTsKKworCWlmICghZGV2Yy0+ZHVwbGV4KSBhdWRpb251bSA9IDE7CisKKwlpZiAoYXVkaW9udW0gPT0gMSkgeworCQkvKiBDaGFuZ2UgYmVoYXZpb3VyIG9mIHJlZ2lzdGVyIEExICoKKwkJc2JfY2hnX21peGVyKGRldmMsIDB4NzEsIDB4MjAsIDB4MjApCisJCSogRm9yIEVTMTg2OSBvbmx5Pz8/ICovCisJCWVzc193cml0ZSAoZGV2YywgMHhhMSwgZGl2KTsKKwkJZXNzX3dyaXRlIChkZXZjLCAweGEyLCBkaXYyKTsKKwl9IGVsc2UgeworCQllc3Nfc2V0bWl4ZXIgKGRldmMsIDB4NzAsIGRpdik7CisJCS8qCisJCSAqIEZLUzogZmFzY2luYXRpbmc6IDB4NzIgZG9lc24ndCBzZWVtIHRvIHdvcmsuCisJCSAqLworCQllc3Nfd3JpdGUgKGRldmMsIDB4YTIsIGRpdjIpOworCQllc3Nfc2V0bWl4ZXIgKGRldmMsIDB4NzIsIGRpdjIpOworCX0KK30KKworc3RhdGljIGludCBlc3NfYXVkaW9fcHJlcGFyZV9mb3JfaW5wdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwllc3Nfc3BlZWQoZGV2YywgMSk7CisKKwlzYl9kc3BfY29tbWFuZChkZXZjLCBEU1BfQ01EX1NQS09GRik7CisKKwllc3Nfd3JpdGUgKGRldmMsIDB4YjgsIDB4MGUpOwkvKiBBdXRvIGluaXQgRE1BIG1vZGUgKi8KKwllc3NfY2hhbmdlIChkZXZjLCAweGE4LCAweDAzLCAzIC0gZGV2Yy0+Y2hhbm5lbHMpOwkvKiBNb25vL3N0ZXJlbyAqLworCWVzc193cml0ZSAoZGV2YywgMHhiOSwgMik7CS8qIERlbWFuZCBtb2RlICg0IGJ5dGVzL0RNQSByZXF1ZXN0KSAqLworCisJZXNzX2V4ZWNfY29tbWFuZHMgKGRldmMsIGVzc19pbnBfY21kcyk7CisKKwllc3NfY2hhbmdlIChkZXZjLCAweGIxLCAweGYwLCAweDUwKTsKKwllc3NfY2hhbmdlIChkZXZjLCAweGIyLCAweGYwLCAweDUwKTsKKworCWRldmMtPnRyaWdnZXJfYml0cyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXNzX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dF9hdWRpbzEgKGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJc2JfZHNwX3Jlc2V0KGRldmMpOworCWVzc19zcGVlZChkZXZjLCAxKTsKKwllc3Nfd3JpdGUgKGRldmMsIDB4YjgsIDQpOwkvKiBBdXRvIGluaXQgRE1BIG1vZGUgKi8KKwllc3NfY2hhbmdlIChkZXZjLCAweGE4LCAweDAzLCAzIC0gZGV2Yy0+Y2hhbm5lbHMpOwkvKiBNb25vL3N0ZXJlbyAqLworCWVzc193cml0ZSAoZGV2YywgMHhiOSwgMik7CS8qIERlbWFuZCBtb2RlICg0IGJ5dGVzL3JlcXVlc3QpICovCisKKwllc3NfZXhlY19jb21tYW5kcyAoZGV2YywgZXNzX291dF9jbWRzKTsKKworCWVzc19jaGFuZ2UgKGRldmMsIDB4YjEsIDB4ZjAsIDB4NTApOwkvKiBFbmFibGUgRE1BICovCisJZXNzX2NoYW5nZSAoZGV2YywgMHhiMiwgMHhmMCwgMHg1MCk7CS8qIEVuYWJsZSBJUlEgKi8KKworCXNiX2RzcF9jb21tYW5kKGRldmMsIERTUF9DTURfU1BLT04pOwkvKiBUaGVyZSBiZSBzb3VuZCEgKi8KKworCWRldmMtPnRyaWdnZXJfYml0cyA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZXNzX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dF9hdWRpbzIgKGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGNoYXIgYml0czsKKworLyogRktTOiBxcXEKKwlzYl9kc3BfcmVzZXQoZGV2Yyk7CisqLworCisJLyoKKwkgKiBBdXRvLUluaXRpYWxpemU6CisJICogRE1BIG1vZGUgKyBkZW1hbmQgbW9kZSAoOCBieXRlcy9yZXF1ZXN0LCB5ZXMgSSB3YW50IGl0IGFsbCEpCisJICogQnV0IGxlYXZlIDE2LWJpdCBETUEgYml0IHVudG91Y2hlZCEKKwkgKi8KKwllc3NfY2hnbWl4ZXIgKGRldmMsIDB4NzgsIDB4ZDAsIDB4ZDApOworCisJZXNzX3NwZWVkKGRldmMsIDIpOworCisJLyogYml0cyA0OjMgb24gRVMxODg3IHJlcHJlc2VudCByZWNvcmRpbmcgc291cmNlLiBLZWVwIHRoZW0hICovCisJYml0cyA9IGVzc19nZXRtaXhlciAoZGV2YywgMHg3YSkgJiAweDE4OworCisJLyogU2V0IHN0ZXJlby9tb25vICovCisJaWYgKGRldmMtPmNoYW5uZWxzICE9IDEpIGJpdHMgfD0gMHgwMjsKKworCS8qIEluaXQgREFDczsgVU5TSUdORUQgbW9kZSBmb3IgOCBiaXQ7IFNJR05FRCBtb2RlIGZvciAxNiBiaXQgKi8KKwlpZiAoZGV2Yy0+Yml0cyAhPSBBRk1UX1U4KSBiaXRzIHw9IDB4MDU7CS8qIDE2IGJpdCAqLworCisJLyogRW5hYmxlIERNQSwgSVJRIHdpbGwgYmUgc2hhcmVkIChob3BlZnVsbHkpKi8KKwliaXRzIHw9IDB4NjA7CisKKwllc3Nfc2V0bWl4ZXIgKGRldmMsIDB4N2EsIGJpdHMpOworCisJZXNzX21peGVyX3JlbG9hZCAoZGV2YywgU09VTkRfTUlYRVJfUENNKTsJLyogVGhlcmUgYmUgc291bmQhICovCisKKwlkZXZjLT50cmlnZ2VyX2JpdHMgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVzc19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQoaW50IGRldiwgaW50IGJzaXplLCBpbnQgYmNvdW50KQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKyNpZmRlZiBGS1NfUkVHX0xPR0dJTkcKK3ByaW50ayhLRVJOX0lORk8gImVzc19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQ6IGRtYV9vdXQ9JWQsZG1hX2luPSVkXG4iCissIGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQtPmRtYSwgYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEpOworI2VuZGlmCisKKwlpZiAoZGV2Yy0+ZHVwbGV4KSB7CisJCXJldHVybiBlc3NfYXVkaW9fcHJlcGFyZV9mb3Jfb3V0cHV0X2F1ZGlvMiAoZGV2LCBic2l6ZSwgYmNvdW50KTsKKwl9IGVsc2UgeworCQlyZXR1cm4gZXNzX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dF9hdWRpbzEgKGRldiwgYnNpemUsIGJjb3VudCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBlc3NfYXVkaW9faGFsdF94ZmVyKGludCBkZXYpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlzYl9kc3BfcmVzZXQoZGV2Yyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBBdWRpbyAyIG1heSBzdGlsbCBiZSBvcGVyYXRpb25hbCEgQ3JlYXRlcyBhd2Z1bCBzb3VuZHMhCisJICovCisJaWYgKGRldmMtPmR1cGxleCkgZXNzX2NoZ21peGVyKGRldmMsIDB4NzgsIDB4MDMsIDB4MDApOworfQorCitzdGF0aWMgdm9pZCBlc3NfYXVkaW9fc3RhcnRfaW5wdXQKKwkoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBucl9ieXRlcywgaW50IGludHJmbGFnKQoreworCWludCBjb3VudCA9IG5yX2J5dGVzOworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJc2hvcnQgYyA9IC1ucl9ieXRlczsKKworCS8qCisJICogU3RhcnQgYSBETUEgaW5wdXQgdG8gdGhlIGJ1ZmZlciBwb2ludGVkIGJ5IGRtYXF0YWlsCisJICovCisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX2luLT5kbWEgPiAzKSBjb3VudCA+Pj0gMTsKKwljb3VudC0tOworCisJZGV2Yy0+aXJxX21vZGUgPSBJTU9ERV9JTlBVVDsKKworCWVzc193cml0ZSAoZGV2YywgMHhhNCwgKHVuc2lnbmVkIGNoYXIpICgodW5zaWduZWQgc2hvcnQpIGMgJiAweGZmKSk7CisJZXNzX3dyaXRlIChkZXZjLCAweGE1LCAodW5zaWduZWQgY2hhcikgKCgodW5zaWduZWQgc2hvcnQpIGMgPj4gOCkgJiAweGZmKSk7CisKKwllc3NfY2hhbmdlIChkZXZjLCAweGI4LCAweDBmLCAweDBmKTsJLyogR28gKi8KKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGVzc19hdWRpb19vdXRwdXRfYmxvY2tfYXVkaW8xCisJKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgbnJfYnl0ZXMsIGludCBpbnRyZmxhZykKK3sKKwlpbnQgY291bnQgPSBucl9ieXRlczsKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXNob3J0IGMgPSAtbnJfYnl0ZXM7CisKKwlpZiAoYXVkaW9fZGV2c1tkZXZdLT5kbWFwX291dC0+ZG1hID4gMykKKwkJY291bnQgPj49IDE7CisJY291bnQtLTsKKworCWRldmMtPmlycV9tb2RlID0gSU1PREVfT1VUUFVUOworCisJZXNzX3dyaXRlIChkZXZjLCAweGE0LCAodW5zaWduZWQgY2hhcikgKCh1bnNpZ25lZCBzaG9ydCkgYyAmIDB4ZmYpKTsKKwllc3Nfd3JpdGUgKGRldmMsIDB4YTUsICh1bnNpZ25lZCBjaGFyKSAoKCh1bnNpZ25lZCBzaG9ydCkgYyA+PiA4KSAmIDB4ZmYpKTsKKworCWVzc19jaGFuZ2UgKGRldmMsIDB4YjgsIDB4MDUsIDB4MDUpOwkvKiBHbyAqLworCWRldmMtPmludHJfYWN0aXZlID0gMTsKK30KKworc3RhdGljIHZvaWQgZXNzX2F1ZGlvX291dHB1dF9ibG9ja19hdWRpbzIKKwkoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBucl9ieXRlcywgaW50IGludHJmbGFnKQoreworCWludCBjb3VudCA9IG5yX2J5dGVzOworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJc2hvcnQgYyA9IC1ucl9ieXRlczsKKworCWlmIChhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0LT5kbWEgPiAzKSBjb3VudCA+Pj0gMTsKKwljb3VudC0tOworCisJZXNzX3NldG1peGVyIChkZXZjLCAweDc0LCAodW5zaWduZWQgY2hhcikgKCh1bnNpZ25lZCBzaG9ydCkgYyAmIDB4ZmYpKTsKKwllc3Nfc2V0bWl4ZXIgKGRldmMsIDB4NzYsICh1bnNpZ25lZCBjaGFyKSAoKCh1bnNpZ25lZCBzaG9ydCkgYyA+PiA4KSAmIDB4ZmYpKTsKKwllc3NfY2hnbWl4ZXIgKGRldmMsIDB4NzgsIDB4MDMsIDB4MDMpOyAgIC8qIEdvICovCisKKwlkZXZjLT5pcnFfbW9kZV8xNiA9IElNT0RFX09VVFBVVDsKKwkJZGV2Yy0+aW50cl9hY3RpdmVfMTYgPSAxOworfQorCitzdGF0aWMgdm9pZCBlc3NfYXVkaW9fb3V0cHV0X2Jsb2NrCisJKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgbnJfYnl0ZXMsIGludCBpbnRyZmxhZykKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGRldmMtPmR1cGxleCkgeworCQllc3NfYXVkaW9fb3V0cHV0X2Jsb2NrX2F1ZGlvMiAoZGV2LCBidWYsIG5yX2J5dGVzLCBpbnRyZmxhZyk7CisJfSBlbHNlIHsKKwkJZXNzX2F1ZGlvX291dHB1dF9ibG9ja19hdWRpbzEgKGRldiwgYnVmLCBucl9ieXRlcywgaW50cmZsYWcpOworCX0KK30KKworLyoKKyAqIEZLUzogdGhlIGlmLXN0YXRlbWVudHMgZm9yIGJvdGggYml0cyBhbmQgYml0c18xNiBhcmUgcXVpdGUgYWxpa2UuCisgKiBDb21iaW5lIHRoaXMuLi4KKyAqLworc3RhdGljIHZvaWQgZXNzX2F1ZGlvX3RyaWdnZXIoaW50IGRldiwgaW50IGJpdHMpCit7CisJc2JfZGV2YyAqZGV2YyA9IGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKworCWludCBiaXRzXzE2ID0gYml0cyAmIGRldmMtPmlycV9tb2RlXzE2OworCWJpdHMgJj0gZGV2Yy0+aXJxX21vZGU7CisKKwlpZiAoIWJpdHMgJiYgIWJpdHNfMTYpIHsKKwkJLyogRktTIG9oIG9oLi4uLiB3cm9uZz8/IGZvciBkbWEgMTY/ICovCisJCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4ZDApOwkvKiBIYWx0IERNQSAqLworCX0KKworCWlmIChiaXRzKSB7CisJCXN3aXRjaCAoZGV2Yy0+aXJxX21vZGUpCisJCXsKKwkJCWNhc2UgSU1PREVfSU5QVVQ6CisJCQkJZXNzX2F1ZGlvX3N0YXJ0X2lucHV0KGRldiwgZGV2Yy0+dHJnX2J1ZiwgZGV2Yy0+dHJnX2J5dGVzLAorCQkJCQlkZXZjLT50cmdfaW50cmZsYWcpOworCQkJCWJyZWFrOworCisJCQljYXNlIElNT0RFX09VVFBVVDoKKwkJCQllc3NfYXVkaW9fb3V0cHV0X2Jsb2NrKGRldiwgZGV2Yy0+dHJnX2J1ZiwgZGV2Yy0+dHJnX2J5dGVzLAorCQkJCQlkZXZjLT50cmdfaW50cmZsYWcpOworCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGJpdHNfMTYpIHsKKwkJc3dpdGNoIChkZXZjLT5pcnFfbW9kZV8xNikgeworCQljYXNlIElNT0RFX0lOUFVUOgorCQkJZXNzX2F1ZGlvX3N0YXJ0X2lucHV0KGRldiwgZGV2Yy0+dHJnX2J1Zl8xNiwgZGV2Yy0+dHJnX2J5dGVzXzE2LAorCQkJCQlkZXZjLT50cmdfaW50cmZsYWdfMTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBJTU9ERV9PVVRQVVQ6CisJCQllc3NfYXVkaW9fb3V0cHV0X2Jsb2NrKGRldiwgZGV2Yy0+dHJnX2J1Zl8xNiwgZGV2Yy0+dHJnX2J5dGVzXzE2LAorCQkJCQlkZXZjLT50cmdfaW50cmZsYWdfMTYpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkZXZjLT50cmlnZ2VyX2JpdHMgPSBiaXRzIHwgYml0c18xNjsKK30KKworc3RhdGljIGludCBlc3NfYXVkaW9fc2V0X3NwZWVkKGludCBkZXYsIGludCBzcGVlZCkKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCWludCBtaW5zcGVlZCwgbWF4c3BlZWQsIGR1bW15ZGl2OworCisJaWYgKHNwZWVkID4gMCkgeworCQltaW5zcGVlZCA9IChkZXZjLT5kdXBsZXggPyA2MjE1ICA6IDUwMDAgKTsKKwkJbWF4c3BlZWQgPSAoZGV2Yy0+ZHVwbGV4ID8gNDQxMDAgOiA0ODAwMCk7CisJCWlmIChzcGVlZCA8IG1pbnNwZWVkKSBzcGVlZCA9IG1pbnNwZWVkOworCQlpZiAoc3BlZWQgPiBtYXhzcGVlZCkgc3BlZWQgPSBtYXhzcGVlZDsKKworCQllc3NfY29tbW9uX3NwZWVkIChkZXZjLCAmc3BlZWQsICZkdW1teWRpdik7CisKKwkJZGV2Yy0+c3BlZWQgPSBzcGVlZDsKKwl9CisJcmV0dXJuIGRldmMtPnNwZWVkOworfQorCisvKgorICogRktTOiBUaGlzIGlzIGEgb25lLW9uLW9uZSBjb3B5IG9mIHNiMV9hdWRpb19zZXRfYml0cworICovCitzdGF0aWMgdW5zaWduZWQgaW50IGVzc19hdWRpb19zZXRfYml0cyhpbnQgZGV2LCB1bnNpZ25lZCBpbnQgYml0cykKK3sKKwlzYl9kZXZjICpkZXZjID0gYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGJpdHMgIT0gMCkgeworCQlpZiAoYml0cyA9PSBBRk1UX1U4IHx8IGJpdHMgPT0gQUZNVF9TMTZfTEUpIHsKKwkJCWRldmMtPmJpdHMgPSBiaXRzOworCQl9IGVsc2UgeworCQkJZGV2Yy0+Yml0cyA9IEFGTVRfVTg7CisJCX0KKwl9CisKKwlyZXR1cm4gZGV2Yy0+Yml0czsKK30KKworLyoKKyAqIEZLUzogVGhpcyBpcyBhIG9uZS1vbi1vbmUgY29weSBvZiBzYnByb19hdWRpb19zZXRfY2hhbm5lbHMKKyAqICgqKSBNb2RpZmllZCBpdCEhCisgKi8KK3N0YXRpYyBzaG9ydCBlc3NfYXVkaW9fc2V0X2NoYW5uZWxzKGludCBkZXYsIHNob3J0IGNoYW5uZWxzKQoreworCXNiX2RldmMgKmRldmMgPSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoY2hhbm5lbHMgPT0gMSB8fCBjaGFubmVscyA9PSAyKSBkZXZjLT5jaGFubmVscyA9IGNoYW5uZWxzOworCisJcmV0dXJuIGRldmMtPmNoYW5uZWxzOworfQorCitzdGF0aWMgc3RydWN0IGF1ZGlvX2RyaXZlciBlc3NfYXVkaW9fZHJpdmVyID0gICAvKiBFU1MgRVM2ODgvMTY4OCAqLworeworCS5vd25lcgkJCT0gVEhJU19NT0RVTEUsCisJLm9wZW4JCQk9IHNiX2F1ZGlvX29wZW4sCisJLmNsb3NlCQkJPSBzYl9hdWRpb19jbG9zZSwKKwkub3V0cHV0X2Jsb2NrCQk9IGVzc19zZXRfb3V0cHV0X3Bhcm1zLAorCS5zdGFydF9pbnB1dAkJPSBlc3Nfc2V0X2lucHV0X3Bhcm1zLAorCS5wcmVwYXJlX2Zvcl9pbnB1dAk9IGVzc19hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dCwKKwkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gZXNzX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dCwKKwkuaGFsdF9pbwkJPSBlc3NfYXVkaW9faGFsdF94ZmVyLAorCS50cmlnZ2VyCQk9IGVzc19hdWRpb190cmlnZ2VyLAorCS5zZXRfc3BlZWQJCT0gZXNzX2F1ZGlvX3NldF9zcGVlZCwKKwkuc2V0X2JpdHMJCT0gZXNzX2F1ZGlvX3NldF9iaXRzLAorCS5zZXRfY2hhbm5lbHMJCT0gZXNzX2F1ZGlvX3NldF9jaGFubmVscworfTsKKworLyoKKyAqIGVzc19hdWRpb19pbml0IG11c3QgYmUgY2FsbGVkIGZyb20gc2JfYXVkaW9faW5pdAorICovCitzdHJ1Y3QgYXVkaW9fZHJpdmVyICplc3NfYXVkaW9faW5pdAorCQkoc2JfZGV2YyAqZGV2YywgaW50ICphdWRpb19mbGFncywgaW50ICpmb3JtYXRfbWFzaykKK3sKKwkqYXVkaW9fZmxhZ3MgPSBETUFfQVVUT01PREU7CisJKmZvcm1hdF9tYXNrIHw9IEFGTVRfUzE2X0xFOworCisJaWYgKGRldmMtPmR1cGxleCkgeworCQlpbnQgdG1wX2RtYTsKKwkJLyoKKwkJICogc2JfYXVkaW9faW5pdCB0aGlua3MgZG1hOCBpcyBmb3IgcGxheWJhY2sgYW5kCisJCSAqIGRtYTE2IGlzIGZvciByZWNvcmQuIE5vdCBub3chIFNvIHN3YXAgdGhlbS4KKwkJICovCisJCXRtcF9kbWEJCT0gZGV2Yy0+ZG1hMTY7CisJCWRldmMtPmRtYTE2CT0gZGV2Yy0+ZG1hODsKKwkJZGV2Yy0+ZG1hOAk9IHRtcF9kbWE7CisKKwkJKmF1ZGlvX2ZsYWdzIHw9IERNQV9EVVBMRVg7CisJfQorCisJcmV0dXJuICZlc3NfYXVkaW9fZHJpdmVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkJCQkJCQkJCQkJKgorICoJCQkJCQkJCUVTUyBjb21tb24JCQkJCQkJCQkqCisgKgkJCQkJCQkJCQkJCQkJCQkJCQkqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGVzc19oYW5kbGVfY2hhbm5lbAorCShjaGFyICpjaGFubmVsLCBpbnQgZGV2LCBpbnQgaW50cl9hY3RpdmUsIHVuc2lnbmVkIGNoYXIgZmxhZywgaW50IGlycV9tb2RlKQoreworCWlmICghaW50cl9hY3RpdmUgfHwgIWZsYWcpIHJldHVybjsKKyNpZmRlZiBGS1NfUkVHX0xPR0dJTkcKK3ByaW50ayhLRVJOX0lORk8gIkZLUzogZXNzX2hhbmRsZV9jaGFubmVsICVzIGlycV9tb2RlPSVkXG4iLCBjaGFubmVsLCBpcnFfbW9kZSk7CisjZW5kaWYKKwlzd2l0Y2ggKGlycV9tb2RlKSB7CisJCWNhc2UgSU1PREVfT1VUUFVUOgorCQkJRE1BYnVmX291dHB1dGludHIgKGRldiwgMSk7CisJCQlicmVhazsKKworCQljYXNlIElNT0RFX0lOUFVUOgorCQkJRE1BYnVmX2lucHV0aW50ciAoZGV2KTsKKwkJCWJyZWFrOworCisJCWNhc2UgSU1PREVfSU5JVDoKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6OworCQkJLyogcHJpbnRrKEtFUk5fV0FSTiAiRVNTOiBVbmV4cGVjdGVkIGludGVycnVwdFxuIik7ICovCisJfQorfQorCisvKgorICogRktTOiBUT0RPISEhIEZpbmlzaCB0aGlzIQorICoKKyAqIEkgdGhpbmsgbWlkaSBzdHVmZiB1c2VzIHVhcnQ0MDEsIHdpdGhvdXQgaW50ZXJydXB0cy4KKyAqIFNvIElNT0RFX01JREkgaXNuJ3QgYSB2YWx1ZSBmb3IgZGV2Yy0+aXJxX21vZGUuCisgKi8KK3ZvaWQgZXNzX2ludHIgKHNiX2RldmMgKmRldmMpCit7CisJaW50CQkJCXN0YXR1czsKKwl1bnNpZ25lZCBjaGFyCXNyYzsKKworCWlmIChkZXZjLT5zdWJtb2RlbCA9PSBTVUJNRExfRVMxODg3KSB7CisJCXNyYyA9IGVzc19nZXRtaXhlciAoZGV2YywgMHg3ZikgPj4gNDsKKwl9IGVsc2UgeworCQlzcmMgPSAweGZmOworCX0KKworI2lmZGVmIEZLU19SRUdfTE9HR0lORworcHJpbnRrKEtFUk5fSU5GTyAiRktTOiBzYmludHIgc3JjPSV4XG4iLChpbnQpc3JjKTsKKyNlbmRpZgorCWVzc19oYW5kbGVfY2hhbm5lbAorCQkoICJBdWRpbyAxIgorCQksIGRldmMtPmRldiwgZGV2Yy0+aW50cl9hY3RpdmUgICAsIHNyYyAmIDB4MDEsIGRldmMtPmlycV9tb2RlICAgKTsKKwllc3NfaGFuZGxlX2NoYW5uZWwKKwkJKCAiQXVkaW8gMiIKKwkJLCBkZXZjLT5kZXYsIGRldmMtPmludHJfYWN0aXZlXzE2LCBzcmMgJiAweDAyLCBkZXZjLT5pcnFfbW9kZV8xNik7CisJLyoKKwkgKiBBY2tub3dsZWRnZSBpbnRlcnJ1cHRzCisJICovCisJaWYgKGRldmMtPnN1Ym1vZGVsID09IFNVQk1ETF9FUzE4ODcgJiYgKHNyYyAmIDB4MDIpKSB7CisJCWVzc19jaGdtaXhlciAoZGV2YywgMHg3YSwgMHg4MCwgMHgwMCk7CisJfQorCisJaWYgKHNyYyAmIDB4MDEpIHsKKwkJc3RhdHVzID0gaW5iKERTUF9EQVRBX0FWQUlMKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGVzc19leHRlbmRlZCAoc2JfZGV2YyAqIGRldmMpCit7CisJLyogRW5hYmxlIGV4dGVuZGVkIG1vZGUgKi8KKworCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4YzYpOworfQorCitzdGF0aWMgaW50IGVzc193cml0ZSAoc2JfZGV2YyAqIGRldmMsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisjaWZkZWYgRktTX1JFR19MT0dHSU5HCitwcmludGsoS0VSTl9JTkZPICJGS1M6IHdyaXRlIHJlZyAleDogJXhcbiIsIHJlZywgZGF0YSk7CisjZW5kaWYKKwkvKiBXcml0ZSBhIGJ5dGUgdG8gYW4gZXh0ZW5kZWQgbW9kZSByZWdpc3RlciBvZiBFUzE2ODggKi8KKworCWlmICghc2JfZHNwX2NvbW1hbmQoZGV2YywgcmVnKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gc2JfZHNwX2NvbW1hbmQoZGV2YywgZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQgZXNzX3JlYWQgKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwkvKiBSZWFkIGEgYnl0ZSBmcm9tIGFuIGV4dGVuZGVkIG1vZGUgcmVnaXN0ZXIgb2YgRVMxNjg4ICovCisKKwkvKiBSZWFkIHJlZ2lzdGVyIGNvbW1hbmQgKi8KKwlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIDB4YzApKSByZXR1cm4gLTE7CisKKwlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIHJlZyApKSByZXR1cm4gLTE7CisKKwlyZXR1cm4gc2JfZHNwX2dldF9ieXRlKGRldmMpOworfQorCitpbnQgZXNzX2RzcF9yZXNldChzYl9kZXZjICogZGV2YykKK3sKKwlpbnQgbG9vcGM7CisKKyNpZmRlZiBGS1NfUkVHX0xPR0dJTkcKK3ByaW50ayhLRVJOX0lORk8gIkZLUzogZXNzX2RzcF9yZXNldCAxXG4iKTsKK2Vzc19zaG93X21peGVycmVncyAoZGV2Yyk7CisjZW5kaWYKKworCURFQihwcmludGsoIkVudGVyZWQgZXNzX2RzcF9yZXNldCgpXG4iKSk7CisKKwlvdXRiKDMsIERTUF9SRVNFVCk7IC8qIFJlc2V0IEZJRk8gdG9vICovCisKKwl1ZGVsYXkoMTApOworCW91dGIoMCwgRFNQX1JFU0VUKTsKKwl1ZGVsYXkoMzApOworCisJZm9yIChsb29wYyA9IDA7IGxvb3BjIDwgMTAwMCAmJiAhKGluYihEU1BfREFUQV9BVkFJTCkgJiAweDgwKTsgbG9vcGMrKyk7CisKKwlpZiAoaW5iKERTUF9SRUFEKSAhPSAweEFBKSB7CisJCUREQihwcmludGsoInNiOiBObyByZXNwb25zZSB0byBSRVNFVFxuIikpOworCQlyZXR1cm4gMDsgICAvKiBTb3JyeSAqLworCX0KKwllc3NfZXh0ZW5kZWQgKGRldmMpOworCisJREVCKHByaW50aygic2JfZHNwX3Jlc2V0KCkgT0tcbiIpKTsKKworI2lmZGVmIEZLU19MT0dHSU5HCitwcmludGsoS0VSTl9JTkZPICJGS1M6IGRzcF9yZXNldCAyXG4iKTsKK2Vzc19zaG93X21peGVycmVncyAoZGV2Yyk7CisjZW5kaWYKKworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGVzc19pcnFfYml0cyAoaW50IGlycSkKK3sKKwlzd2l0Y2ggKGlycSkgeworCWNhc2UgMjoKKwljYXNlIDk6CisJCXJldHVybiAwOworCisJY2FzZSA1OgorCQlyZXR1cm4gMTsKKworCWNhc2UgNzoKKwkJcmV0dXJuIDI7CisKKwljYXNlIDEwOgorCQlyZXR1cm4gMzsKKworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiRVNTMTY4ODogSW52YWxpZCBJUlEgJWRcbiIsIGlycSk7CisJCXJldHVybiAtMTsKKwl9Cit9CisKKy8qCisgKglTZXQgSVJRIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgZm9yIGFsbCBFU1MgbW9kZWxzCisgKi8KK3N0YXRpYyBpbnQgZXNzX2NvbW1vbl9zZXRfaXJxX2h3IChzYl9kZXZjICogZGV2YykKK3sKKwlpbnQgaXJxX2JpdHM7CisKKwlpZiAoKGlycV9iaXRzID0gZXNzX2lycV9iaXRzIChkZXZjLT5pcnEpKSA9PSAtMSkgcmV0dXJuIDA7CisKKwlpZiAoIWVzc193cml0ZSAoZGV2YywgMHhiMSwgMHg1MCB8IChpcnFfYml0cyA8PCAyKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFUzE2ODg6IEZhaWxlZCB0byB3cml0ZSB0byBJUlEgY29uZmlnIHJlZ2lzdGVyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQorCisvKgorICogSSB3YW5uYSB1c2UgbW9kZXJuIEVTMTg4NyBtaXhlciBpcnEgaGFuZGxpbmcuIEZ1bm55IGlzIHRoZQorICogZmFjdCB0aGF0IG15IEJJT1Mgd2FudHMgdGhlIHNhbWUuIEJ1dCBzdXBwb3NlIHNvbWVvbmUncyBCSU9TCisgKiBkb2Vzbid0IGRvIHRoaXMhCisgKiBUaGlzIGlzIGluZGVwZW5kZW50IG9mIGR1cGxleC4gSWYgdGhlcmUncyBhIDE4ODcgdGhpcyB3aWxsCisgKiBwcmV2ZW50IGl0IGZyb20gZ29pbmcgaW50byAxODg4IG1vZGUuCisgKi8KK3N0YXRpYyB2b2lkIGVzc19lczE4ODdfc2V0X2lycV9odyAoc2JfZGV2YyAqIGRldmMpCit7CisJaW50IGlycV9iaXRzOworCisJaWYgKChpcnFfYml0cyA9IGVzc19pcnFfYml0cyAoZGV2Yy0+aXJxKSkgPT0gLTEpIHJldHVybjsKKworCWVzc19jaGdtaXhlciAoZGV2YywgMHg3ZiwgMHgwZiwgMHgwMSB8ICgoaXJxX2JpdHMgKyAxKSA8PCAxKSk7Cit9CisKK3N0YXRpYyBpbnQgZXNzX3NldF9pcnFfaHcgKHNiX2RldmMgKiBkZXZjKQoreworCWlmIChkZXZjLT5zdWJtb2RlbCA9PSBTVUJNRExfRVMxODg3KSBlc3NfZXMxODg3X3NldF9pcnFfaHcgKGRldmMpOworCisJcmV0dXJuIGVzc19jb21tb25fc2V0X2lycV9odyAoZGV2Yyk7Cit9CisKKyNpZmRlZiBGS1NfVEVTVAorCisvKgorICogRktTX3Rlc3Q6CisgKglmb3IgRVMxODg3OiAwMCwgMTgsIG5vbiB3ciBiaXRzOiAwMDAxIDEwMDAKKyAqCWZvciBFUzE4Njg6IDAwLCBiOCwgbm9uIHdyIGJpdHM6IDEwMTEgMTAwMAorICoJZm9yIEVTMTg4ODogMDAsIGY4LCBub24gd3IgYml0czogMTExMSAxMDAwCisgKglmb3IgRVMxNjg4OiAwMCwgZjgsIG5vbiB3ciBiaXRzOiAxMTExIDEwMDAKKyAqCSsgICBFUzk2OAorICovCisKK3N0YXRpYyB2b2lkIEZLU190ZXN0IChzYl9kZXZjICogZGV2YykKK3sKKwlpbnQgdmFsMSwgdmFsMjsKKwl2YWwxID0gZXNzX2dldG1peGVyIChkZXZjLCAweDY0KTsKKwllc3Nfc2V0bWl4ZXIgKGRldmMsIDB4NjQsIH52YWwxKTsKKwl2YWwyID0gZXNzX2dldG1peGVyIChkZXZjLCAweDY0KSBeIH52YWwxOworCWVzc19zZXRtaXhlciAoZGV2YywgMHg2NCwgdmFsMSk7CisJdmFsMSBePSBlc3NfZ2V0bWl4ZXIgKGRldmMsIDB4NjQpOworcHJpbnRrIChLRVJOX0lORk8gIkZLUzogRktTX3Rlc3QgJTAyeCwgJTAyeFxuIiwgKHZhbDEgJiAweDBmZiksICh2YWwyICYgMHgwZmYpKTsKK307CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGludCBlc3NfaWRlbnRpZnkgKHNiX2RldmMgKiBkZXZjKQoreworCXVuc2lnbmVkIGludCB2YWw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJb3V0YigoKHVuc2lnbmVkIGNoYXIpICgweDQwICYgMHhmZikpLCBNSVhFUl9BRERSKTsKKworCXVkZWxheSgyMCk7CisJdmFsICA9IGluYihNSVhFUl9EQVRBKSA8PCA4OworCXVkZWxheSgyMCk7CisJdmFsIHw9IGluYihNSVhFUl9EQVRBKTsKKwl1ZGVsYXkoMjApOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBFU1MgdGVjaG5vbG9neSBkZXNjcmliZXMgYSBkZXRlY3Rpb24gc2NoZW1lIGluIHRoZWlyIGRvY3MuIEl0IGludm9sdmVzCisgKiBmaWRkbGluZyB3aXRoIHRoZSBiaXRzIGluIGNlcnRhaW4gbWl4ZXIgcmVnaXN0ZXJzLiBlc3NfcHJvYmUgaXMgc3VwcG9zZWQKKyAqIHRvIGhlbHAuCisgKgorICogRktTOiB0cmFjaW5nIHNob3dzIGVzc19wcm9iZSB3cml0ZXMgd3JvbmcgdmFsdWUgdG8gMHg2NC4gQml0IDMgcmVhZHMgMSwgYnV0CisgKiBzaG91bGQgYmUgd3JpdHRlbiAwIG9ubHkuIENoZWNrIHRoaXMuCisgKi8KK3N0YXRpYyBpbnQgZXNzX3Byb2JlIChzYl9kZXZjICogZGV2YywgaW50IHJlZywgaW50IHhvcnZhbCkKK3sKKwlpbnQgIHZhbDEsIHZhbDIsIHZhbDM7CisKKwl2YWwxID0gZXNzX2dldG1peGVyIChkZXZjLCByZWcpOworCXZhbDIgPSB2YWwxIF4geG9ydmFsOworCWVzc19zZXRtaXhlciAoZGV2YywgcmVnLCB2YWwyKTsKKwl2YWwzID0gZXNzX2dldG1peGVyIChkZXZjLCByZWcpOworCWVzc19zZXRtaXhlciAoZGV2YywgcmVnLCB2YWwxKTsKKworCXJldHVybiAodmFsMiA9PSB2YWwzKTsKK30KKworaW50IGVzc19pbml0KHNiX2RldmMgKiBkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5zaWduZWQgY2hhciBjZmc7CisJaW50IGVzc19tYWpvciA9IDAsIGVzc19taW5vciA9IDA7CisJaW50IGk7CisJc3RhdGljIGNoYXIgbmFtZVsxMDBdLCBtb2RlbG5hbWVbMTBdOworCisJLyoKKwkgKiBUcnkgdG8gZGV0ZWN0IEVTUyBjaGlwcy4KKwkgKi8KKworCXNiX2RzcF9jb21tYW5kKGRldmMsIDB4ZTcpOyAvKiBSZXR1cm4gaWRlbnRpZmljYXRpb24gKi8KKworCWZvciAoaSA9IDEwMDA7IGk7IGktLSkgeworCQlpZiAoaW5iKERTUF9EQVRBX0FWQUlMKSAmIDB4ODApIHsKKwkJCWlmIChlc3NfbWFqb3IgPT0gMCkgeworCQkJCWVzc19tYWpvciA9IGluYihEU1BfUkVBRCk7CisJCQl9IGVsc2UgeworCQkJCWVzc19taW5vciA9IGluYihEU1BfUkVBRCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZXNzX21ham9yID09IDApIHJldHVybiAwOworCisJaWYgKGVzc19tYWpvciA9PSAweDQ4ICYmIChlc3NfbWlub3IgJiAweGYwKSA9PSAweDgwKSB7CisJCXNwcmludGYobmFtZSwgIkVTUyBFUzQ4OCBBdWRpb0RyaXZlIChyZXYgJWQpIiwKKwkJCWVzc19taW5vciAmIDB4MGYpOworCQlod19jb25maWctPm5hbWUgPSBuYW1lOworCQlkZXZjLT5tb2RlbCA9IE1ETF9TQlBSTzsKKwkJcmV0dXJuIDE7CisJfQorCisJLyoKKwkgKiBUaGlzIHRoZSBkZXRlY3Rpb24gaGV1cmlzdGljIG9mIEVTUyB0ZWNobm9sb2d5LCB0aG91Z2ggc29tZXdoYXQKKwkgKiBjaGFuZ2VkIHRvIGFjdHVhbGx5IG1ha2UgaXQgd29yay4KKwkgKiBUaGlzIHJlc3VsdHMgaW4gdGhlIGZvbGxvd2luZyBkZXRlY3Rpb24gc3RlcHM6CisJICogLSBkaXN0aW5jdCBiZXR3ZWVuIEVTNjg4IGFuZCBFUzE2ODgrIChhcyBhbHdheXMgZG9uZSBpbiB0aGlzIGRyaXZlcikKKwkgKiAgIGlmIEVTNjg4IHdlJ3JlIHJlYWR5CisJICogLSB0cnkgdG8gZGV0ZWN0IEVTMTg2OCwgRVMxODY5IG9yIEVTMTg3OCAoZXNzX2lkZW50aWZ5KQorCSAqICAgaWYgc3VjY2Vzc2Z1bCB3ZSdyZSByZWFkeQorCSAqIC0gdHJ5IHRvIGRldGVjdCBFUzE4ODgsIEVTMTg4NyBvciBFUzE3ODggKGFpbTogZGV0ZWN0IEVTMTg4NykKKwkgKiAgIGlmIHN1Y2Nlc3NmdWwgd2UncmUgcmVhZHkKKwkgKiAtIER1bm5vLiBNdXN0IGJlIDE2ODguIFdpbGwgZG8gaW4gZ2VuZXJhbAorCSAqCisJICogVGhpcyBpcyB0aGUgbW9zdCBCRVRBIHBhcnQgb2YgdGhlIHNvZnR3YXJlOiBXaWxsIHRoZSBkZXRlY3Rpb24KKwkgKiBhbHdheXMgd29yaz8KKwkgKi8KKwlkZXZjLT5tb2RlbCA9IE1ETF9FU1M7CisJZGV2Yy0+c3VibW9kZWwgPSBlc3NfbWlub3IgJiAweDBmOworCisJaWYgKGVzc19tYWpvciA9PSAweDY4ICYmIChlc3NfbWlub3IgJiAweGYwKSA9PSAweDgwKSB7CisJCWNoYXIgKmNoaXAgPSBOVUxMOworCQlpbnQgc3VibW9kZWwgPSAtMTsKKworCQlzd2l0Y2ggKGRldmMtPnNibW8uZXNzdHlwZSkgeworCQljYXNlIEVTU1RZUEVfREVURUNUOgorCQljYXNlIEVTU1RZUEVfTElLRTIwOgorCQkJYnJlYWs7CisJCWNhc2UgNjg4OgorCQkJc3VibW9kZWwgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMTY4ODoKKwkJCXN1Ym1vZGVsID0gMHgwODsKKwkJCWJyZWFrOworCQljYXNlIDE4Njg6CisJCQlzdWJtb2RlbCA9IFNVQk1ETF9FUzE4Njg7CisJCQlicmVhazsKKwkJY2FzZSAxODY5OgorCQkJc3VibW9kZWwgPSBTVUJNRExfRVMxODY5OworCQkJYnJlYWs7CisJCWNhc2UgMTc4ODoKKwkJCXN1Ym1vZGVsID0gU1VCTURMX0VTMTc4ODsKKwkJCWJyZWFrOworCQljYXNlIDE4Nzg6CisJCQlzdWJtb2RlbCA9IFNVQk1ETF9FUzE4Nzg7CisJCQlicmVhazsKKwkJY2FzZSAxODc5OgorCQkJc3VibW9kZWwgPSBTVUJNRExfRVMxODc5OworCQkJYnJlYWs7CisJCWNhc2UgMTg4NzoKKwkJCXN1Ym1vZGVsID0gU1VCTURMX0VTMTg4NzsKKwkJCWJyZWFrOworCQljYXNlIDE4ODg6CisJCQlzdWJtb2RlbCA9IFNVQk1ETF9FUzE4ODg7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayAoS0VSTl9FUlIgIkludmFsaWQgZXNzdHlwZT0lZCBzcGVjaWZpZWRcbiIsIGRldmMtPnNibW8uZXNzdHlwZSk7CisJCQlyZXR1cm4gMDsKKwkJfTsKKwkJaWYgKHN1Ym1vZGVsICE9IC0xKSB7CisJCQlkZXZjLT5zdWJtb2RlbCA9IHN1Ym1vZGVsOworCQkJc3ByaW50ZiAobW9kZWxuYW1lLCAiRVMlZCIsIGRldmMtPnNibW8uZXNzdHlwZSk7CisJCQljaGlwID0gbW9kZWxuYW1lOworCQl9OworCQlpZiAoY2hpcCA9PSBOVUxMICYmIChlc3NfbWlub3IgJiAweDBmKSA8IDgpIHsKKwkJCWNoaXAgPSAiRVM2ODgiOworCQl9OworI2lmZGVmIEZLU19URVNUCitGS1NfdGVzdCAoZGV2Yyk7CisjZW5kaWYKKwkJLyoKKwkJICogSWYgTm90aGluZyBkZXRlY3RlZCB5ZXQsIGFuZCB3ZSB3YW50IDIuMCBiZWhhdmlvdXIuLi4KKwkJICogVGhlbiBsZXQncyBhc3N1bWUgaXQncyBFUzE2ODguCisJCSAqLworCQlpZiAoY2hpcCA9PSBOVUxMICYmIGRldmMtPnNibW8uZXNzdHlwZSA9PSBFU1NUWVBFX0xJS0UyMCkgeworCQkJY2hpcCA9ICJFUzE2ODgiOworCQl9OworCisJCWlmIChjaGlwID09IE5VTEwpIHsKKwkJCWludCB0eXBlOworCisJCQl0eXBlID0gZXNzX2lkZW50aWZ5IChkZXZjKTsKKworCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIDB4MTg2ODoKKwkJCQljaGlwID0gIkVTMTg2OCI7CisJCQkJZGV2Yy0+c3VibW9kZWwgPSBTVUJNRExfRVMxODY4OworCQkJCWJyZWFrOworCQkJY2FzZSAweDE4Njk6CisJCQkJY2hpcCA9ICJFUzE4NjkiOworCQkJCWRldmMtPnN1Ym1vZGVsID0gU1VCTURMX0VTMTg2OTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMHgxODc4OgorCQkJCWNoaXAgPSAiRVMxODc4IjsKKwkJCQlkZXZjLT5zdWJtb2RlbCA9IFNVQk1ETF9FUzE4Nzg7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MTg3OToKKwkJCQljaGlwID0gIkVTMTg3OSI7CisJCQkJZGV2Yy0+c3VibW9kZWwgPSBTVUJNRExfRVMxODc5OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoKHR5cGUgJiAweDAwZmYpICE9ICgodHlwZSA+PiA4KSAmIDB4MDBmZikpIHsKKwkJCQkJcHJpbnRrICgiZXNzX2luaXQ6IFVucmVjb2duaXplZCAlMDR4XG4iLCB0eXBlKTsKKwkJCQl9CisJCQl9OworCQl9OworI2lmIDAKKwkJLyoKKwkJICogdGhpcyBvbmUgZmFpbGVkOgorCQkgKiB0aGUgcHJvYmluZyBvZiBiaXQgNCBpcyBhbm90aGVyIHRob3VnaHQ6IGZyb20gRVMxNzg4IGFuZCB1cCwgYWxsCisJCSAqIGNoaXBzIHNlZW0gdG8gaGF2ZSBoYXJkd2FyZSB2b2x1bWUgY29udHJvbC4gQml0IDQgaXMgcmVhZG9ubHkgdG8KKwkJICogY2hlY2sgaWYgYSBoYXJkd2FyZSB2b2x1bWUgaW50ZXJydXB0IGhhcyBmaXJlZC4KKwkJICogQ2F1c2UgRVM2ODgvRVMxNjg4IGRvbid0IGhhdmUgdGhpcyBmZWF0dXJlLCBiaXQgNCBtaWdodCBiZSB3cml0ZWFibGUKKwkJICogZm9yIHRoZXNlIGNoaXBzLgorCQkgKi8KKwkJaWYgKGNoaXAgPT0gTlVMTCAmJiAhZXNzX3Byb2JlKGRldmMsIDB4NjQsICgxIDw8IDQpKSkgeworI2VuZGlmCisJCS8qCisJCSAqIHRoZSBwcm9iaW5nIG9mIGJpdCAyIGlzIG15IGlkZWEuIFRoZSBFUzE4ODcgZG9jcyB3YW50IG1lIHRvIHByb2JlCisJCSAqIGJpdCAzLiBUaGlzIHJlc3VsdHMgaW4gRVMxNjg4IGJlaW5nIGRldGVjdGVkIGFzIEVTMTc4OC4KKwkJICogQml0IDIgaXMgZm9yICJFbmFibGUgSFdWIElSUUUiLCBidXQgYXMgRVMoMSk2ODggY2hpcHMgZG9uJ3QgaGF2ZQorCQkgKiBIYXJkV2FyZSBWb2x1bWUsIEkgdGhpbmsgdGhleSBkb24ndCBoYXZlIHRoaXMgSVJRRS4KKwkJICovCisJCWlmIChjaGlwID09IE5VTEwgJiYgZXNzX3Byb2JlKGRldmMsIDB4NjQsICgxIDw8IDIpKSkgeworCQkJaWYgKGVzc19wcm9iZSAoZGV2YywgMHg3MCwgMHg3ZikpIHsKKwkJCQlpZiAoZXNzX3Byb2JlIChkZXZjLCAweDY0LCAoMSA8PCA1KSkpIHsKKwkJCQkJY2hpcCA9ICJFUzE4ODciOworCQkJCQlkZXZjLT5zdWJtb2RlbCA9IFNVQk1ETF9FUzE4ODc7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2hpcCA9ICJFUzE4ODgiOworCQkJCQlkZXZjLT5zdWJtb2RlbCA9IFNVQk1ETF9FUzE4ODg7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQljaGlwID0gIkVTMTc4OCI7CisJCQkJZGV2Yy0+c3VibW9kZWwgPSBTVUJNRExfRVMxNzg4OworCQkJfQorCQl9OworCQlpZiAoY2hpcCA9PSBOVUxMKSB7CisJCQljaGlwID0gIkVTMTY4OCI7CisJCX07CisKKwkgICAgcHJpbnRrICggS0VSTl9JTkZPICJFU1MgY2hpcCAlcyAlcyVzXG4iCisgICAgICAgICAgICAgICAsIGNoaXAKKyAgICAgICAgICAgICAgICwgKCBkZXZjLT5zYm1vLmVzc3R5cGUgPT0gRVNTVFlQRV9ERVRFQ1QgfHwgZGV2Yy0+c2Jtby5lc3N0eXBlID09IEVTU1RZUEVfTElLRTIwCisgICAgICAgICAgICAgICAgID8gImRldGVjdGVkIgorICAgICAgICAgICAgICAgICA6ICJzcGVjaWZpZWQiCisgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICwgKCBkZXZjLT5zYm1vLmVzc3R5cGUgPT0gRVNTVFlQRV9MSUtFMjAKKyAgICAgICAgICAgICAgICAgPyAiIChrZXJuZWwgMi4wIGNvbXBhdGlibGUpIgorICAgICAgICAgICAgICAgICA6ICIiCisgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICk7CisKKwkJc3ByaW50ZihuYW1lLCJFU1MgJXMgQXVkaW9Ecml2ZSAocmV2ICVkKSIsIGNoaXAsIGVzc19taW5vciAmIDB4MGYpOworCX0gZWxzZSB7CisJCXN0cmNweShuYW1lLCAiSmF6ejE2Iik7CisJfQorCisJLyogQUFTOiBpbmZvIHN0b2xlbiBmcm9tIEFMU0E6IHRoZXNlIGJvYXJkcyBoYXZlIGRpZmZlcmVudCBjbG9ja3MgKi8KKwlzd2l0Y2goZGV2Yy0+c3VibW9kZWwpIHsKKy8qIEFQUEFSRU5UTFkgTk9UIDE4NjkgQU5EIDE4ODcKKwkJY2FzZSBTVUJNRExfRVMxODY5OgorCQljYXNlIFNVQk1ETF9FUzE4ODc6CisqLwkJCisJCWNhc2UgU1VCTURMX0VTMTg4ODoKKwkJCWRldmMtPmNhcHMgfD0gU0JfQ0FQX0VTMThYWF9SQVRFOworCQkJYnJlYWs7CisJfQorCisJaHdfY29uZmlnLT5uYW1lID0gbmFtZTsKKwkvKiBGS1M6IHNiX2RzcF9yZXNldCB0byBlbmFibGUgZXh0ZW5kZWQgbW9kZT8/Pz8gKi8KKwlzYl9kc3BfcmVzZXQoZGV2Yyk7IC8qIFR1cm4gb24gZXh0ZW5kZWQgbW9kZSAqLworCisJLyoKKwkgKiAgRW5hYmxlIGpveXN0aWNrIGFuZCBPUEwzCisJICovCisJY2ZnID0gZXNzX2dldG1peGVyIChkZXZjLCAweDQwKTsKKwllc3Nfc2V0bWl4ZXIgKGRldmMsIDB4NDAsIGNmZyB8IDB4MDMpOworCWlmIChkZXZjLT5zdWJtb2RlbCA+PSA4KSB7CQkvKiBFUzE2ODggKi8KKwkJZGV2Yy0+Y2FwcyB8PSBTQl9OT19NSURJOyAgIC8qIEVTMTY4OCB1c2VzIE1QVTQwMSBNSURJIG1vZGUgKi8KKwl9CisJc2JfZHNwX3Jlc2V0IChkZXZjKTsKKworCS8qCisJICogVGhpcyBpcyBpbXBvcnRhbnQhIElmIGl0J3Mgbm90IGRvbmUsIHRoZSBJUlEgcHJvYmUgaW4gc2JfZHNwX2luaXQKKwkgKiBtYXkgZmFpbC4KKwkgKi8KKwlyZXR1cm4gZXNzX3NldF9pcnFfaHcgKGRldmMpOworfQorCitzdGF0aWMgaW50IGVzc19zZXRfZG1hX2h3KHNiX2RldmMgKiBkZXZjKQoreworCXVuc2lnbmVkIGNoYXIgY2ZnLCBkbWFfYml0cyA9IDAsIGRtYTE2X2JpdHM7CisJaW50IGRtYTsKKworI2lmZGVmIEZLU19MT0dHSU5HCitwcmludGsoS0VSTl9JTkZPICJlc3Nfc2V0X2RtYV9odzogZG1hOD0lZCxkbWExNj0lZCxkdXA9JWRcbiIKKywgZGV2Yy0+ZG1hOCwgZGV2Yy0+ZG1hMTYsIGRldmMtPmR1cGxleCk7CisjZW5kaWYKKworCS8qCisJICogRktTOiBJdCBzZWVtcyBhcyBpZiB0aGlzIGR1cGxleCBmbGFnIGlzbid0IHNldCB5ZXQuIENoZWNrIGl0LgorCSAqLworCWRtYSA9IGRldmMtPmRtYTg7CisKKwlpZiAoZG1hID4gMyB8fCBkbWEgPCAwIHx8IGRtYSA9PSAyKSB7CisJCWRtYV9iaXRzID0gMDsKKwkJcHJpbnRrKEtFUk5fRVJSICJFU1MxNjg4OiBJbnZhbGlkIERNQTggJWRcbiIsIGRtYSk7CisJCXJldHVybiAwOworCX0gZWxzZSB7CisJCS8qIEV4dGVuZGVkIG1vZGUgRE1BIGVuYWJsZSAqLworCQljZmcgPSAweDUwOworCisJCWlmIChkbWEgPT0gMykgeworCQkJZG1hX2JpdHMgPSAzOworCQl9IGVsc2UgeworCQkJZG1hX2JpdHMgPSBkbWEgKyAxOworCQl9CisJfQorCisJaWYgKCFlc3Nfd3JpdGUgKGRldmMsIDB4YjIsIGNmZyB8IChkbWFfYml0cyA8PCAyKSkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJFU1MxNjg4OiBGYWlsZWQgdG8gd3JpdGUgdG8gRE1BIGNvbmZpZyByZWdpc3RlclxuIik7CisJCXJldHVybiAwOworCX0KKworCWlmIChkZXZjLT5kdXBsZXgpIHsKKwkJZG1hID0gZGV2Yy0+ZG1hMTY7CisJCWRtYTE2X2JpdHMgPSAwOworCisJCWlmIChkbWEgPj0gMCkgeworCQkJc3dpdGNoIChkbWEpIHsKKwkJCWNhc2UgMDoKKwkJCQlkbWFfYml0cyA9IDB4MDQ7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJZG1hX2JpdHMgPSAweDA1OworCQkJCWJyZWFrOworCQkJY2FzZSAzOgorCQkJCWRtYV9iaXRzID0gMHgwNjsKKwkJCQlicmVhazsKKwkJCWNhc2UgNToKKwkJCQlkbWFfYml0cyAgID0gMHgwNzsKKwkJCQlkbWExNl9iaXRzID0gMHgyMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJcHJpbnRrKEtFUk5fRVJSICJFU1MxODg3OiBJbnZhbGlkIERNQTE2ICVkXG4iLCBkbWEpOworCQkJCXJldHVybiAwOworCQkJfTsKKwkJCWVzc19jaGdtaXhlciAoZGV2YywgMHg3OCwgMHgyMCwgZG1hMTZfYml0cyk7CisJCQllc3NfY2hnbWl4ZXIgKGRldmMsIDB4N2QsIDB4MDcsIGRtYV9iaXRzKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIFRoaXMgb25lIGlzIGNhbGxlZCBmcm9tIHNiX2RzcF9pbml0LgorICoKKyAqIFJldHVybiB2YWx1ZXM6CisgKiAgMDogRmFpbGVkCisgKiAgMTogU3VjY2VlZGVkIG9yIGRvZXNuJ3QgYXBwbHkgKG5vdCBTVUJNRExfRVMxODg3KQorICovCitpbnQgZXNzX2RzcF9pbml0IChzYl9kZXZjICpkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJLyoKKwkgKiBDYWxsZXIgYWxzbyBjaGVja3MgdGhpcywgYnV0IGFueXdheQorCSAqLworCWlmIChkZXZjLT5tb2RlbCAhPSBNRExfRVNTKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJlc3NfZHNwX2luaXQgZm9yIG5vbiBFU1MgY2hpcFxuIik7CisJCXJldHVybiAxOworCX0KKwkvKgorCSAqIFRoaXMgZm9yIEVTMTg4NyB0byBydW4gRnVsbCBEdXBsZXguIEFjdHVhbGx5IEVTMTg4OAorCSAqIGlzIGFsbG93ZWQgdG8gZG8gc28gdG9vLiBJIGhhdmUgbm8gaWRlYSB5ZXQgaWYgdGhpcworCSAqIHdpbGwgd29yayBmb3IgRVMxODg4IGhvd2V2ZXIuCisJICoKKwkgKiBGb3IgU0IxNiBoYXZpbmcgYm90aCBkbWE4IGFuZCBkbWExNiBtZWFucyBlbmFibGUKKwkgKiBGdWxsIER1cGxleC4gTGV0J3MgdHJ5IHRoaXMgZm9yIEVTMTg4NyB0b28KKwkgKgorCSAqLworCWlmIChkZXZjLT5zdWJtb2RlbCA9PSBTVUJNRExfRVMxODg3KSB7CisJCWlmIChod19jb25maWctPmRtYTIgIT0gLTEpIHsKKwkJCWRldmMtPmRtYTE2ID0gaHdfY29uZmlnLT5kbWEyOworCQl9CisJCS8qCisJCSAqIGRldmMtPmR1cGxleCBpbml0aWFsaXphdGlvbiBpcyBwdXQgaGVyZSwgY2F1c2UKKwkJICogZXNzX3NldF9kbWFfaHcgbmVlZHMgaXQuCisJCSAqLworCQlpZiAoZGV2Yy0+ZG1hOCAhPSBkZXZjLT5kbWExNiAmJiBkZXZjLT5kbWExNiAhPSAtMSkgeworCQkJZGV2Yy0+ZHVwbGV4ID0gMTsKKwkJfQorCX0KKwlpZiAoIWVzc19zZXRfZG1hX2h3IChkZXZjKSkgeworCQlmcmVlX2lycShkZXZjLT5pcnEsIGRldmMpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCQkJCQkJCQkJCQkJCQkJCQkqCisgKgkJCQkJCQkJCUVTUyBtaXhlcgkJCQkJCQkJKgorICoJCQkJCQkJCQkJCQkJCQkJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgRVM2ODhfUkVDT1JESU5HX0RFVklDRVMJXAorCQkJKCBTT1VORF9NQVNLX0xJTkUJfCBTT1VORF9NQVNLX01JQwl8IFNPVU5EX01BU0tfQ0QJCSkKKyNkZWZpbmUgRVM2ODhfTUlYRVJfREVWSUNFUwkJXAorCQkJKCBTT1VORF9NQVNLX1NZTlRICXwgU09VTkRfTUFTS19QQ00JfCBTT1VORF9NQVNLX0xJTkUJXAorCQkJfCBTT1VORF9NQVNLX01JQwl8IFNPVU5EX01BU0tfQ0QJCXwgU09VTkRfTUFTS19WT0xVTUUJXAorCQkJfCBTT1VORF9NQVNLX0xJTkUyCXwgU09VTkRfTUFTS19TUEVBS0VSCQkJCQkpCisKKyNkZWZpbmUgRVMxNjg4X1JFQ09SRElOR19ERVZJQ0VTCVwKKwkJCSggRVM2ODhfUkVDT1JESU5HX0RFVklDRVMJCQkJCSkKKyNkZWZpbmUgRVMxNjg4X01JWEVSX0RFVklDRVMJCVwKKwkJCSggRVM2ODhfTUlYRVJfREVWSUNFUyB8IFNPVU5EX01BU0tfUkVDTEVWCSkKKworI2RlZmluZSBFUzE4ODdfUkVDT1JESU5HX0RFVklDRVMJXAorCQkJKCBFUzE2ODhfUkVDT1JESU5HX0RFVklDRVMgfCBTT1VORF9NQVNLX0xJTkUyIHwgU09VTkRfTUFTS19TWU5USCkKKyNkZWZpbmUgRVMxODg3X01JWEVSX0RFVklDRVMJCVwKKwkJCSggRVMxNjg4X01JWEVSX0RFVklDRVMJCQkJCQkJCQkJCSkKKworLyoKKyAqIE1peGVyIHJlZ2lzdGVycyBvZiBFUzE4ODcKKyAqCisgKiBUaGVzZSByZWdpc3RlcnMgc3BlY2lmaWNhbGx5IHRha2UgY2FyZSBvZiByZWNvcmRpbmcgbGV2ZWxzLiBUbyBtYWtlIHRoZQorICogbWFwcGluZyBmcm9tIHBsYXliYWNrIGRldmljZXMgdG8gcmVjb3JkaW5nIGRldmljZXMgZXZlcnkgcmVjb3JkaW5nCisgKiBkZXZpY2VzID0gcGxheWJhY2sgZGV2aWNlICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYKKyAqLworI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDQkFTRQkoU09VTkRfTUlYRVJfTElORTMgKyAxKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDRElGRgkoRVNfUkVDX01JWEVSX1JFQ0JBU0UgLSBTT1VORF9NSVhFUl9TWU5USCkKKworI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDU1lOVEgJKFNPVU5EX01JWEVSX1NZTlRICSArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDUENNCQkoU09VTkRfTUlYRVJfUENNCSArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDU1BFQUtFUgkoU09VTkRfTUlYRVJfU1BFQUtFUiArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDTElORQkoU09VTkRfTUlYRVJfTElORQkgKyBFU19SRUNfTUlYRVJfUkVDRElGRikKKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ01JQwkJKFNPVU5EX01JWEVSX01JQwkgKyBFU19SRUNfTUlYRVJfUkVDRElGRikKKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ0NECQkoU09VTkRfTUlYRVJfQ0QJCSArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDSU1JWAkoU09VTkRfTUlYRVJfSU1JWAkgKyBFU19SRUNfTUlYRVJfUkVDRElGRikKKyNkZWZpbmUgRVNfUkVDX01JWEVSX1JFQ0FMVFBDTQkoU09VTkRfTUlYRVJfQUxUUENNCSArIEVTX1JFQ19NSVhFUl9SRUNESUZGKQorI2RlZmluZSBFU19SRUNfTUlYRVJfUkVDUkVDTEVWCShTT1VORF9NSVhFUl9SRUNMRVYJICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYpCisjZGVmaW5lIEVTX1JFQ19NSVhFUl9SRUNJR0FJTgkoU09VTkRfTUlYRVJfSUdBSU4JICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYpCisjZGVmaW5lIEVTX1JFQ19NSVhFUl9SRUNPR0FJTgkoU09VTkRfTUlYRVJfT0dBSU4JICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYpCisjZGVmaW5lIEVTX1JFQ19NSVhFUl9SRUNMSU5FMQkoU09VTkRfTUlYRVJfTElORTEJICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYpCisjZGVmaW5lIEVTX1JFQ19NSVhFUl9SRUNMSU5FMgkoU09VTkRfTUlYRVJfTElORTIJICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYpCisjZGVmaW5lIEVTX1JFQ19NSVhFUl9SRUNMSU5FMwkoU09VTkRfTUlYRVJfTElORTMJICsgRVNfUkVDX01JWEVSX1JFQ0RJRkYpCisKK3N0YXRpYyBtaXhlcl90YWIgZXM2ODhfbWl4ID0geworTUlYX0VOVChTT1VORF9NSVhFUl9WT0xVTUUsCQkJMHgzMiwgNywgNCwgMHgzMiwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1RSRUJMRSwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1lOVEgsCQkJMHgzNiwgNywgNCwgMHgzNiwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJCQkweDE0LCA3LCA0LCAweDE0LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1BFQUtFUiwJCTB4M2MsIDIsIDMsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FLAkJCTB4M2UsIDcsIDQsIDB4M2UsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9NSUMsCQkJMHgxYSwgNywgNCwgMHgxYSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJCQkweDM4LCA3LCA0LCAweDM4LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQUxUUENNLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9PR0FJTiwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUyLAkJCTB4M2EsIDcsIDQsIDB4M2EsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMywJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKQorfTsKKworLyoKKyAqIFRoZSBFUzE2ODggc3BlY2lmaWNzLi4uIGhvcGVmdWxseSBjb3JyZWN0Li4uCisgKiAtIDYgYml0IG1hc3RlciB2b2x1bWUKKyAqICAgSSB3YXMgd3JvbmcsIEVTMTg4OCBkb2NzIHNheSBFUzE2ODggZGlkbid0IGhhdmUgaXQuCisgKiAtIFJFQ0xFViBjb250cm9sCisgKiBUaGVzZSBtYXkgYXBwbHkgdG8gRVM2ODggdG9vLiBJIGhhdmUgbm8gaWRlYS4KKyAqLworc3RhdGljIG1peGVyX3RhYiBlczE2ODhfbWl4ID0geworTUlYX0VOVChTT1VORF9NSVhFUl9WT0xVTUUsCQkJMHgzMiwgNywgNCwgMHgzMiwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1RSRUJMRSwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1lOVEgsCQkJMHgzNiwgNywgNCwgMHgzNiwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJCQkweDE0LCA3LCA0LCAweDE0LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1BFQUtFUiwJCTB4M2MsIDIsIDMsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FLAkJCTB4M2UsIDcsIDQsIDB4M2UsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9NSUMsCQkJMHgxYSwgNywgNCwgMHgxYSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJCQkweDM4LCA3LCA0LCAweDM4LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQUxUUENNLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCQkJMHhiNCwgNywgNCwgMHhiNCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9PR0FJTiwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTEsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUyLAkJCTB4M2EsIDcsIDQsIDB4M2EsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMywJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKQorfTsKKworc3RhdGljIG1peGVyX3RhYiBlczE2ODhsYXRlcl9taXggPSB7CitNSVhfRU5UKFNPVU5EX01JWEVSX1ZPTFVNRSwJCQkweDYwLCA1LCA2LCAweDYyLCA1LCA2KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQkFTUywJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9TWU5USCwJCQkweDM2LCA3LCA0LCAweDM2LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfUENNLAkJCTB4MTQsIDcsIDQsIDB4MTQsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkJMHgzYywgMiwgMywgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCQkJMHgzZSwgNywgNCwgMHgzZSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX01JQywJCQkweDFhLCA3LCA0LCAweDFhLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQ0QsCQkJCTB4MzgsIDcsIDQsIDB4MzgsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9JTUlYLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9BTFRQQ00sCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1JFQ0xFViwJCQkweGI0LCA3LCA0LCAweGI0LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX09HQUlOLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMSwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTIsCQkJMHgzYSwgNywgNCwgMHgzYSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUzLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApCit9OworCisvKgorICogVGhpcyBvbmUgaXMgZm9yIGFsbCBFU1MgY2hpcHMgd2l0aCBhIHJlY29yZCBtaXhlci4KKyAqIEl0J3Mgbm90IHVzZWQgKHlldCkgaG93ZXZlcgorICovCitzdGF0aWMgbWl4ZXJfdGFiIGVzX3JlY19taXggPSB7CitNSVhfRU5UKFNPVU5EX01JWEVSX1ZPTFVNRSwJCQkweDYwLCA1LCA2LCAweDYyLCA1LCA2KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQkFTUywJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9TWU5USCwJCQkweDM2LCA3LCA0LCAweDM2LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfUENNLAkJCTB4MTQsIDcsIDQsIDB4MTQsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkJMHgzYywgMiwgMywgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUsCQkJMHgzZSwgNywgNCwgMHgzZSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX01JQywJCQkweDFhLCA3LCA0LCAweDFhLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQ0QsCQkJCTB4MzgsIDcsIDQsIDB4MzgsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9JTUlYLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9BTFRQQ00sCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1JFQ0xFViwJCQkweGI0LCA3LCA0LCAweGI0LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX09HQUlOLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMSwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTIsCQkJMHgzYSwgNywgNCwgMHgzYSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUzLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDU1lOVEgsCQkweDZiLCA3LCA0LCAweDZiLCAzLCA0KSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ1BDTSwJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDU1BFQUtFUiwJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNMSU5FLAkJMHg2ZSwgNywgNCwgMHg2ZSwgMywgNCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNNSUMsCQkweDY4LCA3LCA0LCAweDY4LCAzLCA0KSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0NELAkJCTB4NmEsIDcsIDQsIDB4NmEsIDMsIDQpLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDSU1JWCwJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDQUxUUENNLAkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNSRUNMRVYsCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0lHQUlOLAkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNPR0FJTiwJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDTElORTEsCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0xJTkUyLAkJMHg2YywgNywgNCwgMHg2YywgMywgNCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNMSU5FMywJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApCit9OworCisvKgorICogVGhpcyBvbmUgaXMgZm9yIEVTMTg4Ny4gSXQncyBsaXR0bGUgZGlmZmVyZW50IGZyb20gZXNfcmVjX21peDogaXQKKyAqIGhhcyAweDdjIGZvciBQQ00gcGxheWJhY2sgbGV2ZWwuIFRoaXMgaXMgYmVjYXVzZSBFUzE4ODcgdXNlcworICogQXVkaW8gMiBmb3IgcGxheWJhY2suCisgKi8KK3N0YXRpYyBtaXhlcl90YWIgZXMxODg3X21peCA9IHsKK01JWF9FTlQoU09VTkRfTUlYRVJfVk9MVU1FLAkJCTB4NjAsIDUsIDYsIDB4NjIsIDUsIDYpLAorTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9UUkVCTEUsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NZTlRILAkJCTB4MzYsIDcsIDQsIDB4MzYsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCQkJMHg3YywgNywgNCwgMHg3YywgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NQRUFLRVIsCQkweDNjLCAyLCAzLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORSwJCQkweDNlLCA3LCA0LCAweDNlLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkJCTB4MWEsIDcsIDQsIDB4MWEsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9DRCwJCQkJMHgzOCwgNywgNCwgMHgzOCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lNSVgsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfUkVDTEVWLAkJCTB4YjQsIDcsIDQsIDB4YjQsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9JR0FJTiwJCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0xJTkUxLAkJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FMiwJCQkweDNhLCA3LCA0LCAweDNhLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORTMsCQkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNTWU5USCwJCTB4NmIsIDcsIDQsIDB4NmIsIDMsIDQpLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDUENNLAkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNTUEVBS0VSLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0xJTkUsCQkweDZlLCA3LCA0LCAweDZlLCAzLCA0KSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ01JQywJCTB4NjgsIDcsIDQsIDB4NjgsIDMsIDQpLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDQ0QsCQkJMHg2YSwgNywgNCwgMHg2YSwgMywgNCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNJTUlYLAkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNBTFRQQ00sCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ1JFQ0xFViwJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDSUdBSU4sCQkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ09HQUlOLAkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKEVTX1JFQ19NSVhFUl9SRUNMSU5FMSwJCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChFU19SRUNfTUlYRVJfUkVDTElORTIsCQkweDZjLCA3LCA0LCAweDZjLCAzLCA0KSwKK01JWF9FTlQoRVNfUkVDX01JWEVSX1JFQ0xJTkUzLAkJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCkKK307CisKK3N0YXRpYyBpbnQgZXNzX2hhc19yZWNfbWl4ZXIgKGludCBzdWJtb2RlbCkKK3sKKwlzd2l0Y2ggKHN1Ym1vZGVsKSB7CisJY2FzZSBTVUJNRExfRVMxODg3OgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9OworfTsKKworI2lmZGVmIEZLU19MT0dHSU5HCitzdGF0aWMgaW50IGVzc19taXhlcl9tb25fcmVnc1tdCisJPSB7IDB4NzAsIDB4NzEsIDB4NzIsIDB4NzQsIDB4NzYsIDB4NzgsIDB4N2EsIDB4N2MsIDB4N2QsIDB4N2YKKwkgICwgMHhhMSwgMHhhMiwgMHhhNCwgMHhhNSwgMHhhOCwgMHhhOQorCSAgLCAweGIxLCAweGIyLCAweGI0LCAweGI1LCAweGI2LCAweGI3LCAweGI5CisJICAsIDB4MDB9OworCitzdGF0aWMgdm9pZCBlc3Nfc2hvd19taXhlcnJlZ3MgKHNiX2RldmMgKmRldmMpCit7CisJaW50ICptcCA9IGVzc19taXhlcl9tb25fcmVnczsKKworcmV0dXJuOworCisJd2hpbGUgKCptcCAhPSAwKSB7CisJCXByaW50ayAoS0VSTl9JTkZPICJyZXMgKCV4KT0leFxuIiwgKm1wLCAoaW50KShlc3NfZ2V0bWl4ZXIgKGRldmMsICptcCkpKTsKKwkJbXArKzsKKwl9Cit9CisjZW5kaWYKKwordm9pZCBlc3Nfc2V0bWl4ZXIgKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IHZhbHVlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKyNpZmRlZiBGS1NfTE9HR0lORworcHJpbnRrKEtFUk5fSU5GTyAiRktTOiB3cml0ZSBtaXhlciAleDogJXhcbiIsIHBvcnQsIHZhbHVlKTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKwlpZiAocG9ydCA+PSAweGEwKSB7CisJCWVzc193cml0ZSAoZGV2YywgcG9ydCwgdmFsdWUpOworCX0gZWxzZSB7CisJCW91dGIoKCh1bnNpZ25lZCBjaGFyKSAocG9ydCAmIDB4ZmYpKSwgTUlYRVJfQUREUik7CisKKwkJdWRlbGF5KDIwKTsKKwkJb3V0YigoKHVuc2lnbmVkIGNoYXIpICh2YWx1ZSAmIDB4ZmYpKSwgTUlYRVJfREFUQSk7CisJCXVkZWxheSgyMCk7CisJfTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Cit9CisKK3Vuc2lnbmVkIGludCBlc3NfZ2V0bWl4ZXIgKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBpbnQgcG9ydCkKK3sKKwl1bnNpZ25lZCBpbnQgdmFsOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJaWYgKHBvcnQgPj0gMHhhMCkgeworCQl2YWwgPSBlc3NfcmVhZCAoZGV2YywgcG9ydCk7CisJfSBlbHNlIHsKKwkJb3V0YigoKHVuc2lnbmVkIGNoYXIpIChwb3J0ICYgMHhmZikpLCBNSVhFUl9BRERSKTsKKworCQl1ZGVsYXkoMjApOworCQl2YWwgPSBpbmIoTUlYRVJfREFUQSk7CisJCXVkZWxheSgyMCk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkIGVzc19jaGdtaXhlcgorCShzYl9kZXZjICogZGV2YywgdW5zaWduZWQgaW50IHJlZywgdW5zaWduZWQgaW50IG1hc2ssIHVuc2lnbmVkIGludCB2YWwpCit7CisJaW50IHZhbHVlOworCisJdmFsdWUgPSBlc3NfZ2V0bWl4ZXIgKGRldmMsIHJlZyk7CisJdmFsdWUgPSAodmFsdWUgJiB+bWFzaykgfCAodmFsICYgbWFzayk7CisJZXNzX3NldG1peGVyIChkZXZjLCByZWcsIHZhbHVlKTsKK30KKworLyoKKyAqIGVzc19taXhlcl9pbml0IG11c3QgYmUgY2FsbGVkIGZyb20gc2JfbWl4ZXJfaW5pdAorICovCit2b2lkIGVzc19taXhlcl9pbml0IChzYl9kZXZjICogZGV2YykKK3sKKwlkZXZjLT5taXhlcl9jYXBzID0gU09VTkRfQ0FQX0VYQ0xfSU5QVVQ7CisKKwkvKgorCSogVGFrZSBjYXJlIG9mIEVTMTg4NyBzcGVjaWZpY3MuLi4KKwkqLworCXN3aXRjaCAoZGV2Yy0+c3VibW9kZWwpIHsKKwljYXNlIFNVQk1ETF9FUzE4ODc6CisJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzCQk9IEVTMTg4N19NSVhFUl9ERVZJQ0VTOworCQlkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMJPSBFUzE4ODdfUkVDT1JESU5HX0RFVklDRVM7CisjaWZkZWYgRktTX0xPR0dJTkcKK3ByaW50ayAoS0VSTl9JTkZPICJGS1M6IGVzc19taXhlcl9pbml0IGR1cCA9ICVkXG4iLCBkZXZjLT5kdXBsZXgpOworI2VuZGlmCisJCWlmIChkZXZjLT5kdXBsZXgpIHsKKwkJCWRldmMtPmlvbWFwCQkJCT0gJmVzMTg4N19taXg7CisJCQlkZXZjLT5pb21hcF9zeiAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBUlJBWV9TSVpFKGVzMTg4N19taXgpOworCQl9IGVsc2UgeworCQkJZGV2Yy0+aW9tYXAJCQkJPSAmZXNfcmVjX21peDsKKwkJCWRldmMtPmlvbWFwX3N6ICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFSUkFZX1NJWkUoZXNfcmVjX21peCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKGRldmMtPnN1Ym1vZGVsIDwgOCkgeworCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMJCT0gRVM2ODhfTUlYRVJfREVWSUNFUzsKKwkJCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcwk9IEVTNjg4X1JFQ09SRElOR19ERVZJQ0VTOworCQkJZGV2Yy0+aW9tYXAJCQkJCT0gJmVzNjg4X21peDsKKwkJCWRldmMtPmlvbWFwX3N6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQVJSQVlfU0laRShlczY4OF9taXgpOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGVzMTY4OCBoYXMgNCBiaXRzIG1hc3RlciB2b2wuCisJCQkgKiBsYXRlciBjaGlwcyBoYXZlIDYgYml0cyAoPykKKwkJCSAqLworCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMJCT0gRVMxNjg4X01JWEVSX0RFVklDRVM7CisJCQlkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMJPSBFUzE2ODhfUkVDT1JESU5HX0RFVklDRVM7CisJCQlpZiAoZGV2Yy0+c3VibW9kZWwgPCAweDEwKSB7CisJCQkJZGV2Yy0+aW9tYXAJCQkJPSAmZXMxNjg4X21peDsKKwkJCQlkZXZjLT5pb21hcF9zeiAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBUlJBWV9TSVpFKGVzNjg4X21peCk7CisJCQl9IGVsc2UgeworCQkJCWRldmMtPmlvbWFwCQkJCT0gJmVzMTY4OGxhdGVyX21peDsKKwkJCQlkZXZjLT5pb21hcF9zeiAgICAgICAgICAgICAgICAgICAgICAgICAgPSBBUlJBWV9TSVpFKGVzMTY4OGxhdGVyX21peCk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBDaGFuZ2luZyBwbGF5YmFjayBsZXZlbHMgYXQgYW4gRVNTIGNoaXAgd2l0aCByZWNvcmQgbWl4ZXIgbWVhbnMgaGF2aW5nIHRvCisgKiB0YWtlIGNhcmUgb2YgcmVjb3JkaW5nIGxldmVscyBvZiByZWNvcmRlZCBpbnB1dHMgKGRldmMtPnJlY21hc2spIHRvbyEKKyAqLworaW50IGVzc19taXhlcl9zZXQoc2JfZGV2YyAqZGV2YywgaW50IGRldiwgaW50IGxlZnQsIGludCByaWdodCkKK3sKKwlpZiAoZXNzX2hhc19yZWNfbWl4ZXIgKGRldmMtPnN1Ym1vZGVsKSAmJiAoZGV2Yy0+cmVjbWFzayAmICgxIDw8IGRldikpKSB7CisJCXNiX2NvbW1vbl9taXhlcl9zZXQgKGRldmMsIGRldiArIEVTX1JFQ19NSVhFUl9SRUNESUZGLCBsZWZ0LCByaWdodCk7CisJfQorCXJldHVybiBzYl9jb21tb25fbWl4ZXJfc2V0IChkZXZjLCBkZXYsIGxlZnQsIHJpZ2h0KTsKK30KKworLyoKKyAqIEFmdGVyIGEgc2JfZHNwX3Jlc2V0IGV4dGVuZGVkIHJlZ2lzdGVyIDB4YjQgKFJFQ0xFVikgaXMgcmVzZXQgdG9vLiBBZnRlcgorICogc2JfZHNwX3Jlc2V0IFJFQ0xFViBoYXMgdG8gYmUgcmVzdG9yZWQuIFRoaXMgaXMgd2hlcmUgZXNzX21peGVyX3JlbG9hZAorICogaGVscHMuCisgKi8KK3ZvaWQgZXNzX21peGVyX3JlbG9hZCAoc2JfZGV2YyAqZGV2YywgaW50IGRldikKK3sKKwlpbnQgbGVmdCwgcmlnaHQsIHZhbHVlOworCisJdmFsdWUgPSBkZXZjLT5sZXZlbHNbZGV2XTsKKwlsZWZ0ICA9IHZhbHVlICYgMHgwMDAwMDBmZjsKKwlyaWdodCA9ICh2YWx1ZSAmIDB4MDAwMGZmMDApID4+IDg7CisKKwlzYl9jb21tb25fbWl4ZXJfc2V0KGRldmMsIGRldiwgbGVmdCwgcmlnaHQpOworfQorCitzdGF0aWMgaW50IGVzX3JlY19zZXRfcmVjbWFzayhzYl9kZXZjICogZGV2YywgaW50IG1hc2spCit7CisJaW50IGksIGlfbWFzaywgY3VyX21hc2ssIGRpZmZfbWFzazsKKwlpbnQgdmFsdWUsIGxlZnQsIHJpZ2h0OworCisjaWZkZWYgRktTX0xPR0dJTkcKK3ByaW50ayAoS0VSTl9JTkZPICJGS1M6IGVzX3JlY19zZXRfcmVjbWFzayBtYXNrID0gJXhcbiIsIG1hc2spOworI2VuZGlmCisJLyoKKwkgKiBDaGFuZ2luZyB0aGUgcmVjbWFzayBvbiBhbiBFU1MgY2hpcCB3aXRoIHJlY29yZGluZyBtaXhlciBtZWFuczoKKwkgKiAoMSkgRmluZCB0aGUgZGlmZmVyZW5jZXMKKwkgKiAoMikgRm9yICJ0dXJuZWQtb24iICBpbnB1dHM6IG1ha2UgdGhlIHJlY29yZGluZyBsZXZlbCB0aGUgcGxheWJhY2sgbGV2ZWwKKwkgKiAoMykgRm9yICJ0dXJuZWQtb2ZmIiBpbnB1dHM6IG1ha2UgdGhlIHJlY29yZGluZyBsZXZlbCB6ZXJvCisJICovCisJY3VyX21hc2sgID0gZGV2Yy0+cmVjbWFzazsKKwlkaWZmX21hc2sgPSAoY3VyX21hc2sgXiBtYXNrKTsKKworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCWlfbWFzayA9ICgxIDw8IGkpOworCQlpZiAoZGlmZl9tYXNrICYgaV9tYXNrKSB7CS8qIERpZmZlcmVuY2U/ICgxKSAgKi8KKwkJCWlmIChtYXNrICYgaV9tYXNrKSB7CS8qIFR1cm4gaXQgb24gICgyKSAgKi8KKwkJCQl2YWx1ZSA9IGRldmMtPmxldmVsc1tpXTsKKwkJCQlsZWZ0ICA9IHZhbHVlICYgMHgwMDAwMDBmZjsKKwkJCQlyaWdodCA9ICh2YWx1ZSAmIDB4MDAwMGZmMDApID4+IDg7CisJCQl9IGVsc2UgewkJCQkvKiBUdXJuIGl0IG9mZiAoMykgICovCisJCQkJbGVmdCAgPSAwOworCQkJCWxlZnQgID0gMDsKKwkJCQlyaWdodCA9IDA7CisJCQl9CisJCQlzYl9jb21tb25fbWl4ZXJfc2V0KGRldmMsIGkgKyBFU19SRUNfTUlYRVJfUkVDRElGRiwgbGVmdCwgcmlnaHQpOworCQl9CisJfQorCXJldHVybiBtYXNrOworfQorCitpbnQgZXNzX3NldF9yZWNtYXNrKHNiX2RldmMgKiBkZXZjLCBpbnQgKm1hc2spCit7CisJLyogVGhpcyBhcHBsaWVzIHRvIEVTUyBjaGlwcyB3aXRoIHJlY29yZCBtaXhlcnMgb25seSEgKi8KKworCWlmIChlc3NfaGFzX3JlY19taXhlciAoZGV2Yy0+c3VibW9kZWwpKSB7CisJCSptYXNrCT0gZXNfcmVjX3NldF9yZWNtYXNrIChkZXZjLCAqbWFzayk7CisJCXJldHVybiAxOwkJCQkJCQkJCS8qIEFwcGxpZWQJCSovCisJfSBlbHNlIHsKKwkJcmV0dXJuIDA7CQkJCQkJCQkJLyogTm90IGFwcGxpZWQJKi8KKwl9Cit9CisKKy8qCisgKiBlc3NfbWl4ZXJfcmVzZXQgbXVzdCBiZSBjYWxsZWQgZnJvbSBzYl9taXhlcl9yZXNldAorICovCitpbnQgZXNzX21peGVyX3Jlc2V0IChzYl9kZXZjICogZGV2YykKK3sKKwkvKgorCSAqIFNlcGFyYXRlIGFjdGlvbnMgZm9yIEVTUyBjaGlwcyB3aXRoIGEgcmVjb3JkIG1peGVyOgorCSAqLworCWlmIChlc3NfaGFzX3JlY19taXhlciAoZGV2Yy0+c3VibW9kZWwpKSB7CisJCXN3aXRjaCAoZGV2Yy0+c3VibW9kZWwpIHsKKwkJY2FzZSBTVUJNRExfRVMxODg3OgorCQkJLyoKKwkJCSAqIFNlcGFyYXRlIGFjdGlvbnMgZm9yIEVTMTg4NzoKKwkJCSAqIENoYW5nZSByZWdpc3RlcnMgN2EgYW5kIDFjIHRvIG1ha2UgdGhlIHJlY29yZCBtaXhlciB0aGUKKwkJCSAqIGFjdHVhbCByZWNvcmRpbmcgc291cmNlLgorCQkJICovCisJCQllc3NfY2hnbWl4ZXIoZGV2YywgMHg3YSwgMHgxOCwgMHgwOCk7CisJCQllc3NfY2hnbWl4ZXIoZGV2YywgMHgxYywgMHgwNywgMHgwNyk7CisJCQlicmVhazsKKwkJfTsKKwkJLyoKKwkJICogQ2FsbCBzZXRfcmVjbWFzayBmb3IgcHJvcGVyIGluaXRpYWxpemF0aW9uCisJCSAqLworCQlkZXZjLT5yZWNtYXNrID0gZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOworCQllc19yZWNfc2V0X3JlY21hc2soZGV2YywgMCk7CisJCWRldmMtPnJlY21hc2sgPSAwOworCisJCXJldHVybiAxOwkvKiBXZSB0b29rIGNhcmUgb2YgcmVjbWFzay4JCQkJKi8KKwl9IGVsc2UgeworCQlyZXR1cm4gMDsJLyogV2UgZGlkbid0IHRha2UgY2FyZTsgY2FsbGVyIGRvIGl0CSovCisJfQorfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQkJCQkJCQkJCQkJCQkJCQkJKgorICoJCQkJCQkJCUVTUyBtaWRpCQkJCQkJCQkJKgorICoJCQkJCQkJCQkJCQkJCQkJCQkJKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBGS1M6IElSUSBtYXkgYmUgc2hhcmVkLiBIbS4gQW5kIGlmIHNvPyBUaGVuIFdoYXQ/CisgKi8KK2ludCBlc3NfbWlkaV9pbml0KHNiX2RldmMgKiBkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5zaWduZWQgY2hhciAgIGNmZywgdG1wOworCisJY2ZnID0gZXNzX2dldG1peGVyIChkZXZjLCAweDQwKSAmIDB4MDM7CisKKwlpZiAoZGV2Yy0+c3VibW9kZWwgPCA4KSB7CisJCWVzc19zZXRtaXhlciAoZGV2YywgMHg0MCwgY2ZnIHwgMHgwMyk7CS8qIEVuYWJsZSBPUEwzICYgam95c3RpY2sgKi8KKwkJcmV0dXJuIDA7ICAJCQkJCSAvKiBFUzY4OCBkb2Vzbid0IHN1cHBvcnQgTVBVNDAxIG1vZGUgKi8KKwl9CisJdG1wID0gKGh3X2NvbmZpZy0+aW9fYmFzZSAmIDB4MGYwKSA+PiA0OworCisJaWYgKHRtcCA+IDMpIHsKKwkJZXNzX3NldG1peGVyIChkZXZjLCAweDQwLCBjZmcpOworCQlyZXR1cm4gMDsKKwl9CisJY2ZnIHw9IHRtcCA8PCAzOworCisJdG1wID0gMTsJCS8qIE1QVSBlbmFibGVkIHdpdGhvdXQgaW50ZXJydXB0cyAqLworCisJLyogTWF5IGJlIHNoYXJlZDogaWYgc28gdGhlIHZhbHVlIGlzIC12ZSAqLworCisJc3dpdGNoIChhYnMoaHdfY29uZmlnLT5pcnEpKSB7CisJCWNhc2UgOToKKwkJCXRtcCA9IDB4NDsKKwkJCWJyZWFrOworCQljYXNlIDU6CisJCQl0bXAgPSAweDU7CisJCQlicmVhazsKKwkJY2FzZSA3OgorCQkJdG1wID0gMHg2OworCQkJYnJlYWs7CisJCWNhc2UgMTA6CisJCQl0bXAgPSAweDc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KKworCWNmZyB8PSB0bXAgPDwgNTsKKwllc3Nfc2V0bWl4ZXIgKGRldmMsIDB4NDAsIGNmZyB8IDB4MDMpOworCisJcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9lc3MuaCBiL3NvdW5kL29zcy9zYl9lc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGFhMDcyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NiX2Vzcy5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDcmVhdGVkOiA5LUphbi0xOTk5IFJvbGYgRm9ra2VucworICovCisKK2V4dGVybiB2b2lkIGVzc19pbnRyCisJCShzYl9kZXZjICpkZXZjKTsKK2V4dGVybiBpbnQgZXNzX2RzcF9pbml0CisJCShzYl9kZXZjICpkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOworCitleHRlcm4gc3RydWN0IGF1ZGlvX2RyaXZlciAqZXNzX2F1ZGlvX2luaXQKKwkJKHNiX2RldmMgKmRldmMsIGludCAqYXVkaW9fZmxhZ3MsIGludCAqZm9ybWF0X21hc2spOworZXh0ZXJuIGludCBlc3NfbWlkaV9pbml0CisJCShzYl9kZXZjICpkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOworZXh0ZXJuIHZvaWQgZXNzX21peGVyX2luaXQKKwkJKHNiX2RldmMgKmRldmMpOworCitleHRlcm4gaW50IGVzc19pbml0CisJCShzYl9kZXZjICpkZXZjLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOworZXh0ZXJuIGludCBlc3NfZHNwX3Jlc2V0CisJCShzYl9kZXZjICpkZXZjKTsKKworZXh0ZXJuIHZvaWQgZXNzX3NldG1peGVyCisJCShzYl9kZXZjICpkZXZjLCB1bnNpZ25lZCBpbnQgcG9ydCwgdW5zaWduZWQgaW50IHZhbHVlKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgZXNzX2dldG1peGVyCisJCShzYl9kZXZjICpkZXZjLCB1bnNpZ25lZCBpbnQgcG9ydCk7CitleHRlcm4gaW50IGVzc19taXhlcl9zZXQKKwkJKHNiX2RldmMgKmRldmMsIGludCBkZXYsIGludCBsZWZ0LCBpbnQgcmlnaHQpOworZXh0ZXJuIGludCBlc3NfbWl4ZXJfcmVzZXQKKwkJKHNiX2RldmMgKmRldmMpOworZXh0ZXJuIHZvaWQgZXNzX21peGVyX3JlbG9hZAorCQkoc2JfZGV2YyAqIGRldmMsIGludCBkZXYpOworZXh0ZXJuIGludCBlc3Nfc2V0X3JlY21hc2sKKwkJKHNiX2RldmMgKmRldmMsIGludCAqbWFzayk7CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9taWRpLmMgYi9zb3VuZC9vc3Mvc2JfbWlkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkM2JkMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2JfbWlkaS5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogc291bmQvc2JfZHNwLmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgdGhlIFNvdW5kIEJsYXN0ZXIgRFMgY2hpcHMuCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJzYi5oIgorI3VuZGVmIFNCX1RFU1RfSVJRCisKKy8qCisgKiBUaGUgRFNQIGNoYW5uZWwgY2FuIGJlIHVzZWQgZWl0aGVyIGZvciBpbnB1dCBvciBvdXRwdXQuIFZhcmlhYmxlCisgKiAnc2JfaXJxX21vZGUnIHdpbGwgYmUgc2V0IHdoZW4gdGhlIHByb2dyYW0gY2FsbHMgcmVhZCBvciB3cml0ZSBmaXJzdCB0aW1lCisgKiBhZnRlciBvcGVuLiBDdXJyZW50IHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IG1vZGUgY2hhbmdlcyB3aXRob3V0IGNsb3NpbmcKKyAqIGFuZCByZW9wZW5pbmcgdGhlIGRldmljZS4gU3VwcG9ydCBmb3IgdGhpcyBmZWF0dXJlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiBhCisgKiBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIGRyaXZlci4KKyAqLworCisKK3N0YXRpYyBpbnQgc2JfbWlkaV9vcGVuKGludCBkZXYsIGludCBtb2RlLAorCSAgICAgdm9pZCAgICAgICAgICAgICgqaW5wdXQpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpLAorCSAgICAgdm9pZCAgICAgICAgICAgICgqb3V0cHV0KSAoaW50IGRldikKKykKK3sKKwlzYl9kZXZjICpkZXZjID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmIChkZXZjID09IE5VTEwpCisJCXJldHVybiAtRU5YSU87CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCWlmIChkZXZjLT5vcGVuZWQpCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWRldmMtPm9wZW5lZCA9IDE7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCisJZGV2Yy0+aXJxX21vZGUgPSBJTU9ERV9NSURJOworCWRldmMtPm1pZGlfYnJva2VuID0gMDsKKworCXNiX2RzcF9yZXNldChkZXZjKTsKKworCWlmICghc2JfZHNwX2NvbW1hbmQoZGV2YywgMHgzNSkpCS8qIFN0YXJ0IE1JREkgVUFSVCBtb2RlICovCisJeworCQkgIGRldmMtPm9wZW5lZCA9IDA7CisJCSAgcmV0dXJuIC1FSU87CisJfQorCWRldmMtPmludHJfYWN0aXZlID0gMTsKKworCWlmIChtb2RlICYgT1BFTl9SRUFEKQorCXsKKwkJZGV2Yy0+aW5wdXRfb3BlbmVkID0gMTsKKwkJZGV2Yy0+bWlkaV9pbnB1dF9pbnRyID0gaW5wdXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzYl9taWRpX2Nsb3NlKGludCBkZXYpCit7CisJc2JfZGV2YyAqZGV2YyA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoZGV2YyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jaywgZmxhZ3MpOworCXNiX2RzcF9yZXNldChkZXZjKTsKKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDA7CisJZGV2Yy0+aW5wdXRfb3BlbmVkID0gMDsKKwlkZXZjLT5vcGVuZWQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludCBzYl9taWRpX291dChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKK3sKKwlzYl9kZXZjICpkZXZjID0gbWlkaV9kZXZzW2Rldl0tPmRldmM7CisKKwlpZiAoZGV2YyA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCWlmIChkZXZjLT5taWRpX2Jyb2tlbikKKwkJcmV0dXJuIDE7CisKKwlpZiAoIXNiX2RzcF9jb21tYW5kKGRldmMsIG1pZGlfYnl0ZSkpCisJeworCQlkZXZjLT5taWRpX2Jyb2tlbiA9IDE7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzYl9taWRpX3N0YXJ0X3JlYWQoaW50IGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzYl9taWRpX2VuZF9yZWFkKGludCBkZXYpCit7CisJc2JfZGV2YyAqZGV2YyA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCisJaWYgKGRldmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXNiX2RzcF9yZXNldChkZXZjKTsKKwlkZXZjLT5pbnRyX2FjdGl2ZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2JfbWlkaV9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworfQorCit2b2lkIHNiX21pZGlfaW50ZXJydXB0KHNiX2RldmMgKiBkZXZjKQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwl1bnNpZ25lZCBjaGFyICAgZGF0YTsKKworCWlmIChkZXZjID09IE5VTEwpCisJCXJldHVybjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLCBmbGFncyk7CisKKwlkYXRhID0gaW5iKERTUF9SRUFEKTsKKwlpZiAoZGV2Yy0+aW5wdXRfb3BlbmVkKQorCQlkZXZjLT5taWRpX2lucHV0X2ludHIoZGV2Yy0+bXlfbWlkaWRldiwgZGF0YSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLCBmbGFncyk7Cit9CisKKyNkZWZpbmUgTUlESV9TWU5USF9OQU1FCSJTb3VuZCBCbGFzdGVyIE1pZGkiCisjZGVmaW5lIE1JRElfU1lOVEhfQ0FQUwkwCisjaW5jbHVkZSAibWlkaV9zeW50aC5oIgorCitzdGF0aWMgc3RydWN0IG1pZGlfb3BlcmF0aW9ucyBzYl9taWRpX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7IlNvdW5kIEJsYXN0ZXIiLCAwLCAwLCBTTkRDQVJEX1NCfSwKKwkuY29udmVydGVyCT0gJnN0ZF9taWRpX3N5bnRoLAorCS5pbl9pbmZvCT0gezB9LAorCS5vcGVuCQk9IHNiX21pZGlfb3BlbiwKKwkuY2xvc2UJCT0gc2JfbWlkaV9jbG9zZSwKKwkuaW9jdGwJCT0gc2JfbWlkaV9pb2N0bCwKKwkub3V0cHV0Ywk9IHNiX21pZGlfb3V0LAorCS5zdGFydF9yZWFkCT0gc2JfbWlkaV9zdGFydF9yZWFkLAorCS5lbmRfcmVhZAk9IHNiX21pZGlfZW5kX3JlYWQsCit9OworCit2b2lkIHNiX2RzcF9taWRpX2luaXQoc2JfZGV2YyAqIGRldmMsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCWludCBkZXY7CisKKwlpZiAoZGV2Yy0+bW9kZWwgPCAyKQkvKiBObyBNSURJIHN1cHBvcnQgZm9yIFNCIDEueCAqLworCQlyZXR1cm47CisKKwlkZXYgPSBzb3VuZF9hbGxvY19taWRpZGV2KCk7CisKKwlpZiAoZGV2ID09IC0xKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYl9taWRpOiB0b28gbWFueSBNSURJIGRldmljZXMgZGV0ZWN0ZWRcbiIpOworCQlyZXR1cm47CisJfQorCXN0ZF9taWRpX3N5bnRoLm1pZGlfZGV2ID0gZGV2Yy0+bXlfbWlkaWRldiA9IGRldjsKKwltaWRpX2RldnNbZGV2XSA9IChzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zICopa21hbGxvYyhzaXplb2Yoc3RydWN0IG1pZGlfb3BlcmF0aW9ucyksIEdGUF9LRVJORUwpOworCWlmIChtaWRpX2RldnNbZGV2XSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmQgQmxhc3RlcjogIGZhaWxlZCB0byBhbGxvY2F0ZSBNSURJIG1lbW9yeS5cbiIpOworCQlzb3VuZF91bmxvYWRfbWlkaWRldihkZXYpOworCQkgIHJldHVybjsKKwl9CisJbWVtY3B5KChjaGFyICopIG1pZGlfZGV2c1tkZXZdLCAoY2hhciAqKSAmc2JfbWlkaV9vcGVyYXRpb25zLAorCSAgICAgICBzaXplb2Yoc3RydWN0IG1pZGlfb3BlcmF0aW9ucykpOworCisJaWYgKG93bmVyKQorCQkJbWlkaV9kZXZzW2Rldl0tPm93bmVyID0gb3duZXI7CisJCisJbWlkaV9kZXZzW2Rldl0tPmRldmMgPSBkZXZjOworCisKKwltaWRpX2RldnNbZGV2XS0+Y29udmVydGVyID0gKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHN5bnRoX29wZXJhdGlvbnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAobWlkaV9kZXZzW2Rldl0tPmNvbnZlcnRlciA9PSBOVUxMKQorCXsKKwkJICBwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZCBCbGFzdGVyOiAgZmFpbGVkIHRvIGFsbG9jYXRlIE1JREkgbWVtb3J5LlxuIik7CisJCSAga2ZyZWUobWlkaV9kZXZzW2Rldl0pOworCQkgIHNvdW5kX3VubG9hZF9taWRpZGV2KGRldik7CisJCSAgcmV0dXJuOworCX0KKwltZW1jcHkoKGNoYXIgKikgbWlkaV9kZXZzW2Rldl0tPmNvbnZlcnRlciwgKGNoYXIgKikgJnN0ZF9taWRpX3N5bnRoLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHN5bnRoX29wZXJhdGlvbnMpKTsKKworCW1pZGlfZGV2c1tkZXZdLT5jb252ZXJ0ZXItPmlkID0gIlNCTUlESSI7CisJc2VxdWVuY2VyX2luaXQoKTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9taXhlci5jIGIvc291bmQvb3NzL3NiX21peGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2ODk4YwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zYl9taXhlci5jCkBAIC0wLDAgKzEsNzY4IEBACisvKgorICogc291bmQvc2JfbWl4ZXIuYworICoKKyAqIFRoZSBsb3cgbGV2ZWwgbWl4ZXIgZHJpdmVyIGZvciB0aGUgU291bmQgQmxhc3RlciBjb21wYXRpYmxlIGNhcmRzLgorICovCisvKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICoKKyAqIFRob21hcyBTYWlsZXIJCQkJOiBpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKiBSb2xmIEZva2tlbnMgKERlYyAyMCAxOTk4KQk6IE1vdmVkIEVTUyBzdHVmZiBpbnRvIHNiX2Vzcy5bY2hdCisgKiBTdGFuaXNsYXYgVm9yb255aSA8c3Rhc0Blc2Mua2hhcmtvdi5jb20+CTogU3VwcG9ydCBmb3IgQVdFIDNEU0UgZGV2aWNlIChKdW4gNyAxOTk5KQorICovCisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworI2RlZmluZSBfX1NCX01JWEVSX0NfXworCisjaW5jbHVkZSAic2IuaCIKKyNpbmNsdWRlICJzYl9taXhlci5oIgorCisjaW5jbHVkZSAic2JfZXNzLmgiCisKKyNkZWZpbmUgU0JQUk9fUkVDT1JESU5HX0RFVklDRVMJKFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRCkKKworLyogU2FtZSBhcyBTQiBQcm8sIHVubGVzcyBJIGZpbmQgb3RoZXJ3aXNlICovCisjZGVmaW5lIFNHTlhQUk9fUkVDT1JESU5HX0RFVklDRVMgU0JQUk9fUkVDT1JESU5HX0RFVklDRVMKKworI2RlZmluZSBTQlBST19NSVhFUl9ERVZJQ0VTCQkoU09VTkRfTUFTS19TWU5USCB8IFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19NSUMgfCBcCisJCQkJCSBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19WT0xVTUUpCisKKy8qIFNHIE5YIFBybyBoYXMgdHJlYmxlIGFuZCBiYXNzIHNldHRpbmdzIG9uIHRoZSBtaXhlci4gVGhlICdzcGVha2VyJworICogY2hhbm5lbCBpcyB0aGUgQ09WT1gvRGlzbmV5U291bmRTb3VyY2UgZW11bGF0aW9uIHZvbHVtZSBjb250cm9sCisgKiBvbiB0aGUgbWl4ZXIuIEl0IGRvZXMgTk9UIGNvbnRyb2wgc3BlYWtlciB2b2x1bWUuIFNob3VsZCBoYXZlIG93bgorICogbWFzayBldmVudHVhbGx5PworICovCisjZGVmaW5lIFNHTlhQUk9fTUlYRVJfREVWSUNFUwkoU0JQUk9fTUlYRVJfREVWSUNFU3xTT1VORF9NQVNLX0JBU1N8IFwKKwkJCQkgU09VTkRfTUFTS19UUkVCTEV8U09VTkRfTUFTS19TUEVBS0VSICkKKworI2RlZmluZSBTQjE2X1JFQ09SRElOR19ERVZJQ0VTCQkoU09VTkRfTUFTS19TWU5USCB8IFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgXAorCQkJCQkgU09VTkRfTUFTS19DRCkKKworI2RlZmluZSBTQjE2X09VVEZJTFRFUl9ERVZJQ0VTCQkoU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19NSUMgfCBcCisJCQkJCSBTT1VORF9NQVNLX0NEKQorCisjZGVmaW5lIFNCMTZfTUlYRVJfREVWSUNFUwkJKFNPVU5EX01BU0tfU1lOVEggfCBTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfU1BFQUtFUiB8IFNPVU5EX01BU0tfTElORSB8IFNPVU5EX01BU0tfTUlDIHwgXAorCQkJCQkgU09VTkRfTUFTS19DRCB8IFwKKwkJCQkJIFNPVU5EX01BU0tfSUdBSU4gfCBTT1VORF9NQVNLX09HQUlOIHwgXAorCQkJCQkgU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX0JBU1MgfCBTT1VORF9NQVNLX1RSRUJMRSB8IFwKKwkJCQkJU09VTkRfTUFTS19JTUlYKQorCisvKiBUaGVzZSBhcmUgdGhlIG9ubHkgZGV2aWNlcyB0aGF0IGFyZSB3b3JraW5nIGF0IHRoZSBtb21lbnQuICBPdGhlcnMgY291bGQKKyAqIGJlIGFkZGVkIG9uY2UgdGhleSBhcmUgaWRlbnRpZmllZCBhbmQgYSBtZXRob2QgaXMgZm91bmQgdG8gY29udHJvbCB0aGVtLgorICovCisjZGVmaW5lIEFMUzAwN19NSVhFUl9ERVZJQ0VTCShTT1VORF9NQVNLX1NZTlRIIHwgU09VTkRfTUFTS19MSU5FIHwgXAorCQkJCSBTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTUlDIHwgXAorCQkJCSBTT1VORF9NQVNLX0NEIHwgXAorCQkJCSBTT1VORF9NQVNLX1ZPTFVNRSkKKworc3RhdGljIG1peGVyX3RhYiBzYnByb19taXggPSB7CitNSVhfRU5UKFNPVU5EX01JWEVSX1ZPTFVNRSwJMHgyMiwgNywgNCwgMHgyMiwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9UUkVCTEUsCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9TWU5USCwJMHgyNiwgNywgNCwgMHgyNiwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJMHgwNCwgNywgNCwgMHgwNCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NQRUFLRVIsCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FLAkweDJlLCA3LCA0LCAweDJlLCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkweDBhLCAyLCAzLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQ0QsCQkweDI4LCA3LCA0LCAweDI4LCAzLCA0KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1JFQ0xFViwJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCkKK307CisKK3N0YXRpYyBtaXhlcl90YWIgc2IxNl9taXggPSB7CitNSVhfRU5UKFNPVU5EX01JWEVSX1ZPTFVNRSwJMHgzMCwgNywgNSwgMHgzMSwgNywgNSksCitNSVhfRU5UKFNPVU5EX01JWEVSX0JBU1MsCTB4NDYsIDcsIDQsIDB4NDcsIDcsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9UUkVCTEUsCTB4NDQsIDcsIDQsIDB4NDUsIDcsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9TWU5USCwJMHgzNCwgNywgNSwgMHgzNSwgNywgNSksCitNSVhfRU5UKFNPVU5EX01JWEVSX1BDTSwJMHgzMiwgNywgNSwgMHgzMywgNywgNSksCitNSVhfRU5UKFNPVU5EX01JWEVSX1NQRUFLRVIsCTB4M2IsIDcsIDIsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9MSU5FLAkweDM4LCA3LCA1LCAweDM5LCA3LCA1KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTUlDLAkweDNhLCA3LCA1LCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfQ0QsCQkweDM2LCA3LCA1LCAweDM3LCA3LCA1KSwKK01JWF9FTlQoU09VTkRfTUlYRVJfSU1JWCwJMHgzYywgMCwgMSwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0FMVFBDTSwJMHgwMCwgMCwgMCwgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX1JFQ0xFViwJMHgzZiwgNywgMiwgMHg0MCwgNywgMiksIC8qIE9ic29sZXRlLiBVc2UgSUdBSU4gKi8KK01JWF9FTlQoU09VTkRfTUlYRVJfSUdBSU4sCTB4M2YsIDcsIDIsIDB4NDAsIDcsIDIpLAorTUlYX0VOVChTT1VORF9NSVhFUl9PR0FJTiwJMHg0MSwgNywgMiwgMHg0MiwgNywgMikKK307CisKK3N0YXRpYyBtaXhlcl90YWIgYWxzMDA3X21peCA9IAoreworTUlYX0VOVChTT1VORF9NSVhFUl9WT0xVTUUsCTB4NjIsIDcsIDQsIDB4NjIsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9CQVNTLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfVFJFQkxFLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfU1lOVEgsCTB4NjYsIDcsIDQsIDB4NjYsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9QQ00sCTB4NjQsIDcsIDQsIDB4NjQsIDMsIDQpLAorTUlYX0VOVChTT1VORF9NSVhFUl9TUEVBS0VSLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfTElORSwJMHg2ZSwgNywgNCwgMHg2ZSwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX01JQywJMHg2YSwgMiwgMywgMHgwMCwgMCwgMCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0NELAkJMHg2OCwgNywgNCwgMHg2OCwgMywgNCksCitNSVhfRU5UKFNPVU5EX01JWEVSX0lNSVgsCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9BTFRQQ00sCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLAorTUlYX0VOVChTT1VORF9NSVhFUl9SRUNMRVYsCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApLCAvKiBPYnNvbGV0ZS4gVXNlIElHQUlOICovCitNSVhfRU5UKFNPVU5EX01JWEVSX0lHQUlOLAkweDAwLCAwLCAwLCAweDAwLCAwLCAwKSwKK01JWF9FTlQoU09VTkRfTUlYRVJfT0dBSU4sCTB4MDAsIDAsIDAsIDB4MDAsIDAsIDApCit9OworCisKKy8qIFNNX0dBTUVTICAgICAgICAgIE1hc3RlciB2b2x1bWUgaXMgbG93ZXIgYW5kIFBDTSAmIEZNIHZvbHVtZXMKKwkJCSAgICAgaGlnaGVyIHRoYW4gd2l0aCBTQiBQcm8uIFRoaXMgaW1wcm92ZXMgdGhlCisJCQkgICAgIHNvdW5kIHF1YWxpdHkgKi8KKworc3RhdGljIGludCBzbWdfZGVmYXVsdF9sZXZlbHNbMzJdID0KK3sKKyAgMHgyMDIwLAkJCS8qIE1hc3RlciBWb2x1bWUgKi8KKyAgMHg0YjRiLAkJCS8qIEJhc3MgKi8KKyAgMHg0YjRiLAkJCS8qIFRyZWJsZSAqLworICAweDY0NjQsCQkJLyogRk0gKi8KKyAgMHg2NDY0LAkJCS8qIFBDTSAqLworICAweDRiNGIsCQkJLyogUEMgU3BlYWtlciAqLworICAweDRiNGIsCQkJLyogRXh0IExpbmUgKi8KKyAgMHgwMDAwLAkJCS8qIE1pYyAqLworICAweDRiNGIsCQkJLyogQ0QgKi8KKyAgMHg0YjRiLAkJCS8qIFJlY29yZGluZyBtb25pdG9yICovCisgIDB4NGI0YiwJCQkvKiBTQiBQQ00gKi8KKyAgMHg0YjRiLAkJCS8qIFJlY29yZGluZyBsZXZlbCAqLworICAweDRiNGIsCQkJLyogSW5wdXQgZ2FpbiAqLworICAweDRiNGIsCQkJLyogT3V0cHV0IGdhaW4gKi8KKyAgMHg0MDQwLAkJCS8qIExpbmUxICovCisgIDB4NDA0MCwJCQkvKiBMaW5lMiAqLworICAweDE1MTUJCQkvKiBMaW5lMyAqLworfTsKKworc3RhdGljIGludCBzYl9kZWZhdWx0X2xldmVsc1szMl0gPQoreworICAweDVhNWEsCQkJLyogTWFzdGVyIFZvbHVtZSAqLworICAweDRiNGIsCQkJLyogQmFzcyAqLworICAweDRiNGIsCQkJLyogVHJlYmxlICovCisgIDB4NGI0YiwJCQkvKiBGTSAqLworICAweDRiNGIsCQkJLyogUENNICovCisgIDB4NGI0YiwJCQkvKiBQQyBTcGVha2VyICovCisgIDB4NGI0YiwJCQkvKiBFeHQgTGluZSAqLworICAweDEwMTAsCQkJLyogTWljICovCisgIDB4NGI0YiwJCQkvKiBDRCAqLworICAweDAwMDAsCQkJLyogUmVjb3JkaW5nIG1vbml0b3IgKi8KKyAgMHg0YjRiLAkJCS8qIFNCIFBDTSAqLworICAweDRiNGIsCQkJLyogUmVjb3JkaW5nIGxldmVsICovCisgIDB4NGI0YiwJCQkvKiBJbnB1dCBnYWluICovCisgIDB4NGI0YiwJCQkvKiBPdXRwdXQgZ2FpbiAqLworICAweDQwNDAsCQkJLyogTGluZTEgKi8KKyAgMHg0MDQwLAkJCS8qIExpbmUyICovCisgIDB4MTUxNQkJCS8qIExpbmUzICovCit9OworCitzdGF0aWMgdW5zaWduZWQgY2hhciBzYjE2X3JlY21hc2tzX0xbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9Cit7CisJMHgwMCwJLyogU09VTkRfTUlYRVJfVk9MVU1FCSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfQkFTUwkqLworCTB4MDAsCS8qIFNPVU5EX01JWEVSX1RSRUJMRQkqLworCTB4NDAsCS8qIFNPVU5EX01JWEVSX1NZTlRICSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfUENNCSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfU1BFQUtFUgkqLworCTB4MTAsCS8qIFNPVU5EX01JWEVSX0xJTkUJKi8KKwkweDAxLAkvKiBTT1VORF9NSVhFUl9NSUMJKi8KKwkweDA0LAkvKiBTT1VORF9NSVhFUl9DRAkqLworCTB4MDAsCS8qIFNPVU5EX01JWEVSX0lNSVgJKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9BTFRQQ00JKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9SRUNMRVYJKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9JR0FJTgkqLworCTB4MDAJLyogU09VTkRfTUlYRVJfT0dBSU4JKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHNiMTZfcmVjbWFza3NfUltTT1VORF9NSVhFUl9OUkRFVklDRVNdID0KK3sKKwkweDAwLAkvKiBTT1VORF9NSVhFUl9WT0xVTUUJKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9CQVNTCSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfVFJFQkxFCSovCisJMHgyMCwJLyogU09VTkRfTUlYRVJfU1lOVEgJKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9QQ00JKi8KKwkweDAwLAkvKiBTT1VORF9NSVhFUl9TUEVBS0VSCSovCisJMHgwOCwJLyogU09VTkRfTUlYRVJfTElORQkqLworCTB4MDEsCS8qIFNPVU5EX01JWEVSX01JQwkqLworCTB4MDIsCS8qIFNPVU5EX01JWEVSX0NECSovCisJMHgwMCwJLyogU09VTkRfTUlYRVJfSU1JWAkqLworCTB4MDAsCS8qIFNPVU5EX01JWEVSX0FMVFBDTQkqLworCTB4MDAsCS8qIFNPVU5EX01JWEVSX1JFQ0xFVgkqLworCTB4MDAsCS8qIFNPVU5EX01JWEVSX0lHQUlOCSovCisJMHgwMAkvKiBTT1VORF9NSVhFUl9PR0FJTgkqLworfTsKKworc3RhdGljIGNoYXIgICAgIHNtd19taXhfcmVnc1tdID0JLyogTGVmdCBtaXhlciByZWdpc3RlcnMgKi8KK3sKKyAgMHgwYiwJCQkJLyogU09VTkRfTUlYRVJfVk9MVU1FICovCisgIDB4MGQsCQkJCS8qIFNPVU5EX01JWEVSX0JBU1MgKi8KKyAgMHgwZCwJCQkJLyogU09VTkRfTUlYRVJfVFJFQkxFICovCisgIDB4MDUsCQkJCS8qIFNPVU5EX01JWEVSX1NZTlRIICovCisgIDB4MDksCQkJCS8qIFNPVU5EX01JWEVSX1BDTSAqLworICAweDAwLAkJCQkvKiBTT1VORF9NSVhFUl9TUEVBS0VSICovCisgIDB4MDMsCQkJCS8qIFNPVU5EX01JWEVSX0xJTkUgKi8KKyAgMHgwMSwJCQkJLyogU09VTkRfTUlYRVJfTUlDICovCisgIDB4MDcsCQkJCS8qIFNPVU5EX01JWEVSX0NEICovCisgIDB4MDAsCQkJCS8qIFNPVU5EX01JWEVSX0lNSVggKi8KKyAgMHgwMCwJCQkJLyogU09VTkRfTUlYRVJfQUxUUENNICovCisgIDB4MDAsCQkJCS8qIFNPVU5EX01JWEVSX1JFQ0xFViAqLworICAweDAwLAkJCQkvKiBTT1VORF9NSVhFUl9JR0FJTiAqLworICAweDAwLAkJCQkvKiBTT1VORF9NSVhFUl9PR0FJTiAqLworICAweDAwLAkJCQkvKiBTT1VORF9NSVhFUl9MSU5FMSAqLworICAweDAwLAkJCQkvKiBTT1VORF9NSVhFUl9MSU5FMiAqLworICAweDAwCQkJCS8qIFNPVU5EX01JWEVSX0xJTkUzICovCit9OworCitzdGF0aWMgaW50ICAgICAgc2JtaXhudW0gPSAxOworCitzdGF0aWMgdm9pZCAgICAgc2JfbWl4ZXJfcmVzZXQoc2JfZGV2YyAqIGRldmMpOworCit2b2lkIHNiX21peGVyX3NldF9zdGVyZW8oc2JfZGV2YyAqIGRldmMsIGludCBtb2RlKQoreworCXNiX2NoZ21peGVyKGRldmMsIE9VVF9GSUxURVIsIFNURVJFT19EQUMsIChtb2RlID8gU1RFUkVPX0RBQyA6IE1PTk9fREFDKSk7Cit9CisKK3N0YXRpYyBpbnQgZGV0ZWN0X21peGVyKHNiX2RldmMgKiBkZXZjKQoreworCS8qIEp1c3QgdHJ1c3QgdGhlIG1peGVyIGlzIHRoZXJlICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV9iaXRzKHNiX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBjaGFyICpyZWd2YWwsIGludCBkZXYsIGludCBjaG4sIGludCBuZXd2YWwpCit7CisJdW5zaWduZWQgY2hhciBtYXNrOworCWludCBzaGlmdDsKKworCW1hc2sgPSAoMSA8PCAoKmRldmMtPmlvbWFwKVtkZXZdW2Nobl0ubmJpdHMpIC0gMTsKKwluZXd2YWwgPSAoaW50KSAoKG5ld3ZhbCAqIG1hc2spICsgNTApIC8gMTAwOwkvKiBTY2FsZSAqLworCisJc2hpZnQgPSAoKmRldmMtPmlvbWFwKVtkZXZdW2Nobl0uYml0b2ZmcyAtICgqZGV2Yy0+aW9tYXApW2Rldl1bTEVGVF9DSE5dLm5iaXRzICsgMTsKKworCSpyZWd2YWwgJj0gfihtYXNrIDw8IHNoaWZ0KTsJLyogTWFzayBvdXQgcHJldmlvdXMgdmFsdWUgKi8KKwkqcmVndmFsIHw9IChuZXd2YWwgJiBtYXNrKSA8PCBzaGlmdDsJLyogU2V0IHRoZSBuZXcgdmFsdWUgKi8KK30KKworc3RhdGljIGludCBzYl9taXhlcl9nZXQoc2JfZGV2YyAqIGRldmMsIGludCBkZXYpCit7CisJaWYgKCEoKDEgPDwgZGV2KSAmIGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIGRldmMtPmxldmVsc1tkZXZdOworfQorCit2b2lkIHNtd19taXhlcl9pbml0KHNiX2RldmMgKiBkZXZjKQoreworCWludCBpOworCisJc2Jfc2V0bWl4ZXIoZGV2YywgMHgwMCwgMHgxOCk7CS8qIE11dGUgdW51c2VkIChUZWxlcGhvbmUpIGxpbmUgKi8KKwlzYl9zZXRtaXhlcihkZXZjLCAweDEwLCAweDM4KTsJLyogQ29uZmlnIHJlZ2lzdGVyIDIgKi8KKworCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKHNtd19taXhfcmVncyk7IGkrKykKKwkJaWYgKHNtd19taXhfcmVnc1tpXSAhPSAwKQorCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgfD0gKDEgPDwgaSk7CisKKwlkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMgPSBkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyAmCisJCX4oU09VTkRfTUFTS19CQVNTIHwgU09VTkRfTUFTS19UUkVCTEUgfCBTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfVk9MVU1FKTsKKwlzYl9taXhlcl9yZXNldChkZXZjKTsKK30KKworaW50IHNiX2NvbW1vbl9taXhlcl9zZXQoc2JfZGV2YyAqIGRldmMsIGludCBkZXYsIGludCBsZWZ0LCBpbnQgcmlnaHQpCit7CisJaW50IHJlZ29mZnM7CisJdW5zaWduZWQgY2hhciB2YWw7CisKKwlyZWdvZmZzID0gKCpkZXZjLT5pb21hcClbZGV2XVtMRUZUX0NITl0ucmVnbm87CisKKwlpZiAocmVnb2ZmcyA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgoZGV2IDwgMCkgfHwgKGRldiA+PSBkZXZjLT5pb21hcF9zeikpCisJICAgIHJldHVybiAtRUlOVkFMOworCisJdmFsID0gc2JfZ2V0bWl4ZXIoZGV2YywgcmVnb2Zmcyk7CisJY2hhbmdlX2JpdHMoZGV2YywgJnZhbCwgZGV2LCBMRUZUX0NITiwgbGVmdCk7CisKKwlpZiAoKCpkZXZjLT5pb21hcClbZGV2XVtSSUdIVF9DSE5dLnJlZ25vICE9IHJlZ29mZnMpCS8qCisJCQkJCQkJCSAqIENoYW5nZSByZWdpc3RlcgorCQkJCQkJCQkgKi8KKwl7CisJCXNiX3NldG1peGVyKGRldmMsIHJlZ29mZnMsIHZhbCk7CS8qCisJCQkJCQkJICogU2F2ZSB0aGUgb2xkIG9uZQorCQkJCQkJCSAqLworCQlyZWdvZmZzID0gKCpkZXZjLT5pb21hcClbZGV2XVtSSUdIVF9DSE5dLnJlZ25vOworCisJCWlmIChyZWdvZmZzID09IDApCisJCQlyZXR1cm4gbGVmdCB8IChsZWZ0IDw8IDgpOwkvKgorCQkJCQkJCSAqIEp1c3QgbGVmdCBjaGFubmVsIHByZXNlbnQKKwkJCQkJCQkgKi8KKworCQl2YWwgPSBzYl9nZXRtaXhlcihkZXZjLCByZWdvZmZzKTsJLyoKKwkJCQkJCQkgKiBSZWFkIHRoZSBuZXcgb25lCisJCQkJCQkJICovCisJfQorCWNoYW5nZV9iaXRzKGRldmMsICZ2YWwsIGRldiwgUklHSFRfQ0hOLCByaWdodCk7CisKKwlzYl9zZXRtaXhlcihkZXZjLCByZWdvZmZzLCB2YWwpOworCisJcmV0dXJuIGxlZnQgfCAocmlnaHQgPDwgOCk7Cit9CisKK3N0YXRpYyBpbnQgc213X21peGVyX3NldChzYl9kZXZjICogZGV2YywgaW50IGRldiwgaW50IGxlZnQsIGludCByaWdodCkKK3sKKwlpbnQgcmVnLCB2YWw7CisKKwlzd2l0Y2ggKGRldikKKwl7CisJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJc2Jfc2V0bWl4ZXIoZGV2YywgMHgwYiwgOTYgLSAoOTYgKiBsZWZ0IC8gMTAwKSk7CS8qIDk2PW11dGUsIDA9bWF4ICovCisJCQlzYl9zZXRtaXhlcihkZXZjLCAweDBjLCA5NiAtICg5NiAqIHJpZ2h0IC8gMTAwKSk7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01JWEVSX0JBU1M6CisJCWNhc2UgU09VTkRfTUlYRVJfVFJFQkxFOgorCQkJZGV2Yy0+bGV2ZWxzW2Rldl0gPSBsZWZ0IHwgKHJpZ2h0IDw8IDgpOworCQkJLyogU2V0IGxlZnQgYmFzcyBhbmQgdHJlYmxlIHZhbHVlcyAqLworCQkJdmFsID0gKChkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfVFJFQkxFXSAmIDB4ZmYpICogMTYgLyAodW5zaWduZWQpIDEwMCkgPDwgNDsKKwkJCXZhbCB8PSAoKGRldmMtPmxldmVsc1tTT1VORF9NSVhFUl9CQVNTXSAmIDB4ZmYpICogMTYgLyAodW5zaWduZWQpIDEwMCkgJiAweDBmOworCQkJc2Jfc2V0bWl4ZXIoZGV2YywgMHgwZCwgdmFsKTsKKworCQkJLyogU2V0IHJpZ2h0IGJhc3MgYW5kIHRyZWJsZSB2YWx1ZXMgKi8KKwkJCXZhbCA9ICgoKGRldmMtPmxldmVsc1tTT1VORF9NSVhFUl9UUkVCTEVdID4+IDgpICYgMHhmZikgKiAxNiAvICh1bnNpZ25lZCkgMTAwKSA8PCA0OworCQkJdmFsIHw9ICgoKGRldmMtPmxldmVsc1tTT1VORF9NSVhFUl9CQVNTXSA+PiA4KSAmIDB4ZmYpICogMTYgLyAodW5zaWduZWQpIDEwMCkgJiAweDBmOworCQkJc2Jfc2V0bWl4ZXIoZGV2YywgMHgwZSwgdmFsKTsKKwkJCisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJLyogYm91bmRzIGNoZWNrICovCisJCQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gQVJSQVlfU0laRShzbXdfbWl4X3JlZ3MpKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmVnID0gc213X21peF9yZWdzW2Rldl07CisJCQlpZiAocmVnID09IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlzYl9zZXRtaXhlcihkZXZjLCByZWcsICgyNCAtICgyNCAqIGxlZnQgLyAxMDApKSB8IDB4MjApOwkvKiAyND1tdXRlLCAwPW1heCAqLworCQkJc2Jfc2V0bWl4ZXIoZGV2YywgcmVnICsgMSwgKDI0IC0gKDI0ICogcmlnaHQgLyAxMDApKSB8IDB4NDApOworCX0KKworCWRldmMtPmxldmVsc1tkZXZdID0gbGVmdCB8IChyaWdodCA8PCA4KTsKKwlyZXR1cm4gbGVmdCB8IChyaWdodCA8PCA4KTsKK30KKworc3RhdGljIGludCBzYl9taXhlcl9zZXQoc2JfZGV2YyAqIGRldmMsIGludCBkZXYsIGludCB2YWx1ZSkKK3sKKwlpbnQgbGVmdCA9IHZhbHVlICYgMHgwMDAwMDBmZjsKKwlpbnQgcmlnaHQgPSAodmFsdWUgJiAweDAwMDBmZjAwKSA+PiA4OworCWludCByZXR2YWw7CisKKwlpZiAobGVmdCA+IDEwMCkKKwkJbGVmdCA9IDEwMDsKKwlpZiAocmlnaHQgPiAxMDApCisJCXJpZ2h0ID0gMTAwOworCisJaWYgKChkZXYgPCAwKSB8fCAoZGV2ID4gMzEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghKGRldmMtPnN1cHBvcnRlZF9kZXZpY2VzICYgKDEgPDwgZGV2KSkpCS8qCisJCQkJCQkJICogTm90IHN1cHBvcnRlZAorCQkJCQkJCSAqLworCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERpZmZlcmVudGlhdGUgZGVwZW5kaW5nIG9uIHRoZSBjaGlwc2V0cyAqLworCXN3aXRjaCAoZGV2Yy0+bW9kZWwpIHsKKwljYXNlIE1ETF9TTVc6CisJCXJldHZhbCA9IHNtd19taXhlcl9zZXQoZGV2YywgZGV2LCBsZWZ0LCByaWdodCk7CisJCWJyZWFrOworCWNhc2UgTURMX0VTUzoKKwkJcmV0dmFsID0gZXNzX21peGVyX3NldChkZXZjLCBkZXYsIGxlZnQsIHJpZ2h0KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dmFsID0gc2JfY29tbW9uX21peGVyX3NldChkZXZjLCBkZXYsIGxlZnQsIHJpZ2h0KTsKKwl9CisJaWYgKHJldHZhbCA+PSAwKSBkZXZjLT5sZXZlbHNbZGV2XSA9IHJldHZhbDsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBzZXRfcmVjc3JjIGRvZXNuJ3QgYXBwbHkgdG8gRVMxODh4CisgKi8KK3N0YXRpYyB2b2lkIHNldF9yZWNzcmMoc2JfZGV2YyAqIGRldmMsIGludCBzcmMpCit7CisJc2Jfc2V0bWl4ZXIoZGV2YywgUkVDT1JEX1NSQywgKHNiX2dldG1peGVyKGRldmMsIFJFQ09SRF9TUkMpICYgfjcpIHwgKHNyYyAmIDB4NykpOworfQorCitzdGF0aWMgaW50IHNldF9yZWNtYXNrKHNiX2RldmMgKiBkZXZjLCBpbnQgbWFzaykKK3sKKwlpbnQgZGV2bWFzaywgaTsKKwl1bnNpZ25lZCBjaGFyICByZWdpbWFnZUwsIHJlZ2ltYWdlUjsKKworCWRldm1hc2sgPSBtYXNrICYgZGV2Yy0+c3VwcG9ydGVkX3JlY19kZXZpY2VzOworCisJc3dpdGNoIChkZXZjLT5tb2RlbCkKKwl7CisJCWNhc2UgTURMX1NCUFJPOgorCQljYXNlIE1ETF9FU1M6CisJCWNhc2UgTURMX0pBWlo6CisJCWNhc2UgTURMX1NNVzoKKwkJCWlmIChkZXZjLT5tb2RlbCA9PSBNRExfRVNTICYmIGVzc19zZXRfcmVjbWFzayAoZGV2YywgJmRldm1hc2spKSB7CisJCQkJYnJlYWs7CisJCQl9OworCQkJaWYgKGRldm1hc2sgIT0gU09VTkRfTUFTS19NSUMgJiYKKwkJCQlkZXZtYXNrICE9IFNPVU5EX01BU0tfTElORSAmJgorCQkJCWRldm1hc2sgIT0gU09VTkRfTUFTS19DRCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIE1vcmUgdGhhbiBvbmUgZGV2aWNlIHNlbGVjdGVkLiBEcm9wIHRoZQorCQkJCSAqIHByZXZpb3VzIHNlbGVjdGlvbgorCQkJCSAqLworCQkJCWRldm1hc2sgJj0gfmRldmMtPnJlY21hc2s7CisJCQl9CisJCQlpZiAoZGV2bWFzayAhPSBTT1VORF9NQVNLX01JQyAmJgorCQkJCWRldm1hc2sgIT0gU09VTkRfTUFTS19MSU5FICYmCisJCQkJZGV2bWFzayAhPSBTT1VORF9NQVNLX0NEKQorCQkJeworCQkJCS8qCisJCQkJICogTW9yZSB0aGFuIG9uZSBkZXZpY2Ugc2VsZWN0ZWQuIERlZmF1bHQgdG8KKwkJCQkgKiBtaWMKKwkJCQkgKi8KKwkJCQlkZXZtYXNrID0gU09VTkRfTUFTS19NSUM7CisJCQl9CisJCQlpZiAoZGV2bWFzayBeIGRldmMtPnJlY21hc2spCS8qCisJCQkJCQkJICoJSW5wdXQgc291cmNlIGNoYW5nZWQKKwkJCQkJCQkgKi8KKwkJCXsKKwkJCQlzd2l0Y2ggKGRldm1hc2spCisJCQkJeworCQkJCQljYXNlIFNPVU5EX01BU0tfTUlDOgorCQkJCQkJc2V0X3JlY3NyYyhkZXZjLCBTUkNfX01JQyk7CisJCQkJCQlicmVhazsKKworCQkJCQljYXNlIFNPVU5EX01BU0tfTElORToKKwkJCQkJCXNldF9yZWNzcmMoZGV2YywgU1JDX19MSU5FKTsKKwkJCQkJCWJyZWFrOworCisJCQkJCWNhc2UgU09VTkRfTUFTS19DRDoKKwkJCQkJCXNldF9yZWNzcmMoZGV2YywgU1JDX19DRCk7CisJCQkJCQlicmVhazsKKworCQkJCQlkZWZhdWx0OgorCQkJCQkJc2V0X3JlY3NyYyhkZXZjLCBTUkNfX01JQyk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBNRExfU0IxNjoKKwkJCWlmICghZGV2bWFzaykKKwkJCQlkZXZtYXNrID0gU09VTkRfTUFTS19NSUM7CisKKwkJCWlmIChkZXZjLT5zdWJtb2RlbCA9PSBTVUJNRExfQUxTMDA3KSAKKwkJCXsKKwkJCQlzd2l0Y2ggKGRldm1hc2spIAorCQkJCXsKKwkJCQkJY2FzZSBTT1VORF9NQVNLX0xJTkU6CisJCQkJCQlzYl9zZXRtaXhlcihkZXZjLCBBTFMwMDdfUkVDT1JEX1NSQywgQUxTMDA3X0xJTkUpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU09VTkRfTUFTS19DRDoKKwkJCQkJCXNiX3NldG1peGVyKGRldmMsIEFMUzAwN19SRUNPUkRfU1JDLCBBTFMwMDdfQ0QpOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgU09VTkRfTUFTS19TWU5USDoKKwkJCQkJCXNiX3NldG1peGVyKGRldmMsIEFMUzAwN19SRUNPUkRfU1JDLCBBTFMwMDdfU1lOVEgpOworCQkJCQkJYnJlYWs7CisJCQkJCWRlZmF1bHQ6ICAgICAgICAgICAvKiBBbHNvIHRha2VzIGNhcmUgb2YgU09VTkRfTUFTS19NSUMgY2FzZSAqLworCQkJCQkJc2Jfc2V0bWl4ZXIoZGV2YywgQUxTMDA3X1JFQ09SRF9TUkMsIEFMUzAwN19NSUMpOworCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJlZ2ltYWdlTCA9IHJlZ2ltYWdlUiA9IDA7CisJCQkJZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQkJCXsKKwkJCQkJaWYgKCgxIDw8IGkpICYgZGV2bWFzaykKKwkJCQkJeworCQkJCQkJcmVnaW1hZ2VMIHw9IHNiMTZfcmVjbWFza3NfTFtpXTsKKwkJCQkJCXJlZ2ltYWdlUiB8PSBzYjE2X3JlY21hc2tzX1JbaV07CisJCQkJCX0KKwkJCQkJc2Jfc2V0bWl4ZXIgKGRldmMsIFNCMTZfSU1BU0tfTCwgcmVnaW1hZ2VMKTsKKwkJCQkJc2Jfc2V0bWl4ZXIgKGRldmMsIFNCMTZfSU1BU0tfUiwgcmVnaW1hZ2VSKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwl9CisJZGV2Yy0+cmVjbWFzayA9IGRldm1hc2s7CisJcmV0dXJuIGRldmMtPnJlY21hc2s7Cit9CisKK3N0YXRpYyBpbnQgc2V0X291dG1hc2soc2JfZGV2YyAqIGRldmMsIGludCBtYXNrKQoreworCWludCBkZXZtYXNrLCBpOworCXVuc2lnbmVkIGNoYXIgIHJlZ2ltYWdlOworCisJZGV2bWFzayA9IG1hc2sgJiBkZXZjLT5zdXBwb3J0ZWRfb3V0X2RldmljZXM7CisKKwlzd2l0Y2ggKGRldmMtPm1vZGVsKQorCXsKKwkJY2FzZSBNRExfU0IxNjoKKwkJCWlmIChkZXZjLT5zdWJtb2RlbCA9PSBTVUJNRExfQUxTMDA3KSAKKwkJCQlicmVhazsKKwkJCWVsc2UKKwkJCXsKKwkJCQlyZWdpbWFnZSA9IDA7CisJCQkJZm9yIChpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQkJCXsKKwkJCQkJaWYgKCgxIDw8IGkpICYgZGV2bWFzaykKKwkJCQkJeworCQkJCQkJcmVnaW1hZ2UgfD0gKHNiMTZfcmVjbWFza3NfTFtpXSB8IHNiMTZfcmVjbWFza3NfUltpXSk7CisJCQkJCX0KKwkJCQkJc2Jfc2V0bWl4ZXIgKGRldmMsIFNCMTZfT01BU0ssIHJlZ2ltYWdlKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCX0KKworCWRldmMtPm91dG1hc2sgPSBkZXZtYXNrOworCXJldHVybiBkZXZjLT5vdXRtYXNrOworfQorCitzdGF0aWMgaW50IHNiX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJc2JfZGV2YyAqZGV2YyA9IG1peGVyX2RldnNbZGV2XS0+ZGV2YzsKKwlpbnQgdmFsLCByZXQ7CisJaW50IF9fdXNlciAqcCA9IGFyZzsKKworCS8qCisJICogVXNlIGlvY3RsKGZkLCBTT1VORF9NSVhFUl9BR0MsICZtb2RlKSB0byB0dXJuIEFHQyBvZmYgKDApIG9yIG9uICgxKS4KKwkgKiBVc2UgaW9jdGwoZmQsIFNPVU5EX01JWEVSXzNEU0UsICZtb2RlKSB0byB0dXJuIDNEU0Ugb2ZmICgwKSBvciBvbiAoMSkKKwkgKgkJCQkJICAgICAgb3IgbW9kZT09MiBwdXQgM0RTRSBzdGF0ZSB0byBtb2RlLgorCSAqLworCWlmIChkZXZjLT5tb2RlbCA9PSBNRExfU0IxNikgeworCQlpZiAoY21kID09IFNPVU5EX01JWEVSX0FHQykgCisJCXsKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc2Jfc2V0bWl4ZXIoZGV2YywgMHg0MywgKH52YWwpICYgMHgwMSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoY21kID09IFNPVU5EX01JWEVSXzNEU0UpIAorCQl7CisJCQkvKiBJIHB1dCBoZXJlIDE1LCBidXQgSSBkb24ndCBrbm93IHRoZSBleGFjdCB2ZXJzaW9uLgorCQkJICAgQXQgbGVhc3QgbXkgNC4xMyBoYXZuJ3QgM0RTRSwgNC4xNiBoYXMgaXQuICovCisJCQlpZiAoZGV2Yy0+bWlub3IgPCAxNSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHZhbCA9PSAwIHx8IHZhbCA9PSAxKQorCQkJCXNiX2NoZ21peGVyKGRldmMsIEFXRV8zRFNFLCAweDAxLCB2YWwpOworCQkJZWxzZSBpZiAodmFsID09IDIpCisJCQl7CisJCQkJcmV0ID0gc2JfZ2V0bWl4ZXIoZGV2YywgQVdFXzNEU0UpJjB4MDE7CisJCQkJcmV0dXJuIHB1dF91c2VyKHJldCwgcCk7CisJCQl9CisJCQllbHNlCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKwlpZiAoKChjbWQgPj4gOCkgJiAweGZmKSA9PSAnTScpIAorCXsKKwkJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpIAorCQl7CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXN3aXRjaCAoY21kICYgMHhmZikgCisJCQl7CisJCQkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQkJCXJldCA9IHNldF9yZWNtYXNrKGRldmMsIHZhbCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBTT1VORF9NSVhFUl9PVVRTUkM6CisJCQkJCXJldCA9IHNldF9vdXRtYXNrKGRldmMsIHZhbCk7CisJCQkJCWJyZWFrOworCisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0ID0gc2JfbWl4ZXJfc2V0KGRldmMsIGNtZCAmIDB4ZmYsIHZhbCk7CisJCQl9CisJCX0KKwkJZWxzZSBzd2l0Y2ggKGNtZCAmIDB4ZmYpIAorCQl7CisJCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCQlyZXQgPSBkZXZjLT5yZWNtYXNrOworCQkJCWJyZWFrOworCQkJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX09VVFNSQzoKKwkJCQlyZXQgPSBkZXZjLT5vdXRtYXNrOworCQkJCWJyZWFrOworCQkJCSAgCisJCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCQkJcmV0ID0gZGV2Yy0+c3VwcG9ydGVkX2RldmljZXM7CisJCQkJYnJlYWs7CisJCQkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoKKwkJCQlyZXQgPSBkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlczsKKwkJCQkvKiBUaGUgRVNTIHNlZW1zIHRvIGhhdmUgc3RlcmVvIG1pYyBjb250cm9scyAqLworCQkJCWlmIChkZXZjLT5tb2RlbCA9PSBNRExfRVNTKQorCQkJCQlyZXQgJj0gfihTT1VORF9NQVNLX1NQRUFLRVJ8U09VTkRfTUFTS19JTUlYKTsKKwkJCQllbHNlIGlmIChkZXZjLT5tb2RlbCAhPSBNRExfSkFaWiAmJiBkZXZjLT5tb2RlbCAhPSBNRExfU01XKQorCQkJCQlyZXQgJj0gfihTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfU1BFQUtFUiB8IFNPVU5EX01BU0tfSU1JWCk7CisJCQkJYnJlYWs7CisJCQkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJCQlyZXQgPSBkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXM7CisJCQkJYnJlYWs7CisJCQkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfT1VUTUFTSzoKKwkJCQlyZXQgPSBkZXZjLT5zdXBwb3J0ZWRfb3V0X2RldmljZXM7CisJCQkJYnJlYWs7CisJCQkJICAKKwkJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCQlyZXQgPSBkZXZjLT5taXhlcl9jYXBzOworCQkJCWJyZWFrOworCQkJCSAgICAKKwkJCWRlZmF1bHQ6CisJCQkJcmV0ID0gc2JfbWl4ZXJfZ2V0KGRldmMsIGNtZCAmIDB4ZmYpOworCQkJCWJyZWFrOworCQl9CisJCXJldHVybiBwdXRfdXNlcihyZXQsIHApOyAKKwl9IGVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucyBzYl9taXhlcl9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWQJPSAiU0IiLAorCS5uYW1lCT0gIlNvdW5kIEJsYXN0ZXIiLAorCS5pb2N0bAk9IHNiX21peGVyX2lvY3RsCit9OworCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgYWxzMDA3X21peGVyX29wZXJhdGlvbnMgPQoreworCS5vd25lcgk9IFRISVNfTU9EVUxFLAorCS5pZAk9ICJBTFMwMDciLAorCS5uYW1lCT0gIkF2YW5jZSBBTFMtMDA3IiwKKwkuaW9jdGwJPSBzYl9taXhlcl9pb2N0bAorfTsKKworc3RhdGljIHZvaWQgc2JfbWl4ZXJfcmVzZXQoc2JfZGV2YyAqIGRldmMpCit7CisJY2hhciBuYW1lWzMyXTsKKwlpbnQgaTsKKworCXNwcmludGYobmFtZSwgIlNCXyVkIiwgZGV2Yy0+c2JtaXhudW0pOworCisJaWYgKGRldmMtPnNibW8uc21fZ2FtZXMpCisJCWRldmMtPmxldmVscyA9IGxvYWRfbWl4ZXJfdm9sdW1lcyhuYW1lLCBzbWdfZGVmYXVsdF9sZXZlbHMsIDEpOworCWVsc2UKKwkJZGV2Yy0+bGV2ZWxzID0gbG9hZF9taXhlcl92b2x1bWVzKG5hbWUsIHNiX2RlZmF1bHRfbGV2ZWxzLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJc2JfbWl4ZXJfc2V0KGRldmMsIGksIGRldmMtPmxldmVsc1tpXSk7CisKKwlpZiAoZGV2Yy0+bW9kZWwgIT0gTURMX0VTUyB8fCAhZXNzX21peGVyX3Jlc2V0IChkZXZjKSkgeworCQlzZXRfcmVjbWFzayhkZXZjLCBTT1VORF9NQVNLX01JQyk7CisJfTsKK30KKworaW50IHNiX21peGVyX2luaXQoc2JfZGV2YyAqIGRldmMsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCWludCBtaXhlcl90eXBlID0gMDsKKwlpbnQgbTsKKworCWRldmMtPnNibWl4bnVtID0gc2JtaXhudW0rKzsKKwlkZXZjLT5sZXZlbHMgPSBOVUxMOworCisJc2Jfc2V0bWl4ZXIoZGV2YywgMHgwMCwgMCk7CS8qIFJlc2V0IG1peGVyICovCisKKwlpZiAoIShtaXhlcl90eXBlID0gZGV0ZWN0X21peGVyKGRldmMpKSkKKwkJcmV0dXJuIDA7CS8qIE5vIG1peGVyLiBXaHk/ICovCisKKwlzd2l0Y2ggKGRldmMtPm1vZGVsKQorCXsKKwkJY2FzZSBNRExfRVNTUENJOgorCQljYXNlIE1ETF9ZTVBDSToKKwkJY2FzZSBNRExfU0JQUk86CisJCWNhc2UgTURMX0FaVEVDSDoKKwkJY2FzZSBNRExfSkFaWjoKKwkJCWRldmMtPm1peGVyX2NhcHMgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJCWRldmMtPnN1cHBvcnRlZF9kZXZpY2VzID0gU0JQUk9fTUlYRVJfREVWSUNFUzsKKwkJCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyA9IFNCUFJPX1JFQ09SRElOR19ERVZJQ0VTOworCQkJZGV2Yy0+aW9tYXAgPSAmc2Jwcm9fbWl4OworCQkJZGV2Yy0+aW9tYXBfc3ogPSBBUlJBWV9TSVpFKHNicHJvX21peCk7CisJCQlicmVhazsKKworCQljYXNlIE1ETF9FU1M6CisJCQllc3NfbWl4ZXJfaW5pdCAoZGV2Yyk7CisJCQlicmVhazsKKworCQljYXNlIE1ETF9TTVc6CisJCQlkZXZjLT5taXhlcl9jYXBzID0gU09VTkRfQ0FQX0VYQ0xfSU5QVVQ7CisJCQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IDA7CisJCQlkZXZjLT5zdXBwb3J0ZWRfcmVjX2RldmljZXMgPSAwOworCQkJZGV2Yy0+aW9tYXAgPSAmc2Jwcm9fbWl4OworCQkJZGV2Yy0+aW9tYXBfc3ogPSBBUlJBWV9TSVpFKHNicHJvX21peCk7CisJCQlzbXdfbWl4ZXJfaW5pdChkZXZjKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTURMX1NCMTY6CisJCQlkZXZjLT5taXhlcl9jYXBzID0gMDsKKwkJCWRldmMtPnN1cHBvcnRlZF9yZWNfZGV2aWNlcyA9IFNCMTZfUkVDT1JESU5HX0RFVklDRVM7CisJCQlkZXZjLT5zdXBwb3J0ZWRfb3V0X2RldmljZXMgPSBTQjE2X09VVEZJTFRFUl9ERVZJQ0VTOworCQkJaWYgKGRldmMtPnN1Ym1vZGVsICE9IFNVQk1ETF9BTFMwMDcpCisJCQl7CisJCQkJZGV2Yy0+c3VwcG9ydGVkX2RldmljZXMgPSBTQjE2X01JWEVSX0RFVklDRVM7CisJCQkJZGV2Yy0+aW9tYXAgPSAmc2IxNl9taXg7CisJCQkJZGV2Yy0+aW9tYXBfc3ogPSBBUlJBWV9TSVpFKHNiMTZfbWl4KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlkZXZjLT5zdXBwb3J0ZWRfZGV2aWNlcyA9IEFMUzAwN19NSVhFUl9ERVZJQ0VTOworCQkJCWRldmMtPmlvbWFwID0gJmFsczAwN19taXg7CisJCQkJZGV2Yy0+aW9tYXBfc3ogPSBBUlJBWV9TSVpFKGFsczAwN19taXgpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInNiX21peGVyOiBVbnN1cHBvcnRlZCBtaXhlciB0eXBlICVkXG4iLCBkZXZjLT5tb2RlbCk7CisJCQlyZXR1cm4gMDsKKwl9CisKKwltID0gc291bmRfYWxsb2NfbWl4ZXJkZXYoKTsKKwlpZiAobSA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwltaXhlcl9kZXZzW21dID0gKHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zICopa21hbGxvYyhzaXplb2Yoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAobWl4ZXJfZGV2c1ttXSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJzYl9taXhlcjogQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJc291bmRfdW5sb2FkX21peGVyZGV2KG0pOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoZGV2Yy0+c3VibW9kZWwgIT0gU1VCTURMX0FMUzAwNykKKwkJbWVtY3B5ICgoY2hhciAqKSBtaXhlcl9kZXZzW21dLCAoY2hhciAqKSAmc2JfbWl4ZXJfb3BlcmF0aW9ucywgc2l6ZW9mIChzdHJ1Y3QgbWl4ZXJfb3BlcmF0aW9ucykpOworCWVsc2UKKwkJbWVtY3B5ICgoY2hhciAqKSBtaXhlcl9kZXZzW21dLCAoY2hhciAqKSAmYWxzMDA3X21peGVyX29wZXJhdGlvbnMsIHNpemVvZiAoc3RydWN0IG1peGVyX29wZXJhdGlvbnMpKTsKKworCW1peGVyX2RldnNbbV0tPmRldmMgPSBkZXZjOworCisJaWYgKG93bmVyKQorCQkJIG1peGVyX2RldnNbbV0tPm93bmVyID0gb3duZXI7CisJCisJZGV2Yy0+bXlfbWl4ZXJkZXYgPSBtOworCXNiX21peGVyX3Jlc2V0KGRldmMpOworCXJldHVybiAxOworfQorCit2b2lkIHNiX21peGVyX3VubG9hZChzYl9kZXZjICpkZXZjKQoreworCWlmIChkZXZjLT5teV9taXhlcmRldiA9PSAtMSkKKwkJcmV0dXJuOworCisJa2ZyZWUobWl4ZXJfZGV2c1tkZXZjLT5teV9taXhlcmRldl0pOworCXNvdW5kX3VubG9hZF9taXhlcmRldihkZXZjLT5teV9taXhlcmRldik7CisJc2JtaXhudW0tLTsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zYl9taXhlci5oIGIvc291bmQvb3NzL3NiX21peGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI3NDQyNgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zYl9taXhlci5oCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogc291bmQvc2JfbWl4ZXIuaAorICogCisgKiBEZWZpbml0aW9ucyBmb3IgdGhlIFNCIFBybyBhbmQgU0IxNiBtaXhlcnMKKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisKKy8qCisgKiBNb2RpZmllZDoKKyAqCUh1bnl1ZSBZYXUJSmFuIDYgMTk5NAorICoJQWRkZWQgZGVmaW5lcyBmb3IgdGhlIFNvdW5kIEdhbGF4eSBOWCBQcm8gbWl4ZXIuCisgKgorICoJUm9sZiBGb2trZW5zCURlYyAyMCAxOTk4CisgKglBZGRlZCBkZWZpbmVzIGZvciBzb21lIEVTMTg4eCBjaGlwcy4KKyAqCisgKglSb2xmIEZva2tlbnMJRGVjIDI3IDE5OTgKKyAqCU1vdmVkIHN0YXRpYyBzdHVmZiB0byBzYl9taXhlci5jCisgKgorICovCisvKgorICogTWl4ZXIgcmVnaXN0ZXJzCisgKiAKKyAqIE5PVEUhCVJFQ09SRF9TUkMgPT0gSU5fRklMVEVSCisgKi8KKworLyogCisgKiBNaXhlciByZWdpc3RlcnMgb2YgU0IgUHJvCisgKi8KKyNkZWZpbmUgVk9DX1ZPTAkJMHgwNAorI2RlZmluZSBNSUNfVk9MCQkweDBBCisjZGVmaW5lIE1JQ19NSVgJCTB4MEEKKyNkZWZpbmUgUkVDT1JEX1NSQwkweDBDCisjZGVmaW5lIElOX0ZJTFRFUgkweDBDCisjZGVmaW5lIE9VVF9GSUxURVIJMHgwRQorI2RlZmluZSBNQVNURVJfVk9MCTB4MjIKKyNkZWZpbmUgRk1fVk9MCQkweDI2CisjZGVmaW5lIENEX1ZPTAkJMHgyOAorI2RlZmluZSBMSU5FX1ZPTAkweDJFCisjZGVmaW5lIElSUV9OUgkJMHg4MAorI2RlZmluZSBETUFfTlIJCTB4ODEKKyNkZWZpbmUgSVJRX1NUQVQJMHg4MgorI2RlZmluZSBPUFNXCQkweDNjCisKKy8qCisgKiBBZGRpdGlvbmFsIHJlZ2lzdGVycyBvbiB0aGUgU0cgTlggUHJvIAorICovCisjZGVmaW5lIENPVk9YX1ZPTAkweDQyCisjZGVmaW5lIFRSRUJMRV9MVkwJMHg0NAorI2RlZmluZSBCQVNTX0xWTAkweDQ2CisKKyNkZWZpbmUgRlJFUV9ISSAgICAgICAgICgxIDw8IDMpLyogVXNlIEhpZ2gtZnJlcXVlbmN5IEFORkkgZmlsdGVycyAqLworI2RlZmluZSBGUkVRX0xPVyAgICAgICAgMAkvKiBVc2UgTG93LWZyZXF1ZW5jeSBBTkZJIGZpbHRlcnMgKi8KKyNkZWZpbmUgRklMVF9PTiAgICAgICAgIDAJLyogWWVzLCAwIHRvIHR1cm4gaXQgb24sIDEgZm9yIG9mZiAqLworI2RlZmluZSBGSUxUX09GRiAgICAgICAgKDEgPDwgNSkKKworI2RlZmluZSBNT05PX0RBQwkweDAwCisjZGVmaW5lIFNURVJFT19EQUMJMHgwMgorCisvKgorICogTWl4ZXIgcmVnaXN0ZXJzIG9mIFNCMTYKKyAqLworI2RlZmluZSBTQjE2X09NQVNLCTB4M2MKKyNkZWZpbmUgU0IxNl9JTUFTS19MCTB4M2QKKyNkZWZpbmUgU0IxNl9JTUFTS19SCTB4M2UKKworI2RlZmluZSBMRUZUX0NITgkwCisjZGVmaW5lIFJJR0hUX0NITgkxCisKKy8qCisgKiAzRFNFIHJlZ2lzdGVyIG9mIEFXRTMyLzY0CisgKi8KKyNkZWZpbmUgQVdFXzNEU0UJMHg5MAorCisvKgorICogTWl4ZXIgcmVnaXN0ZXJzIG9mIEFMUzAwNworICovCisjZGVmaW5lIEFMUzAwN19SRUNPUkRfU1JDCTB4NmMKKyNkZWZpbmUgQUxTMDA3X09VVFBVVF9DVFJMMQkweDNjCisjZGVmaW5lIEFMUzAwN19PVVRQVVRfQ1RSTDIJMHg0YworCisjZGVmaW5lIE1JWF9FTlQobmFtZSwgcmVnX2wsIGJpdF9sLCBsZW5fbCwgcmVnX3IsIGJpdF9yLCBsZW5fcikJXAorCXt7cmVnX2wsIGJpdF9sLCBsZW5fbH0sIHtyZWdfciwgYml0X3IsIGxlbl9yfX0KKworLyoKKyAqCVJlY29yZGluZyBzb3VyY2VzIChTQiBQcm8pCisgKi8KKworI2RlZmluZSBTUkNfX01JQyAgICAgICAgIDEJLyogU2VsZWN0IE1pY3JvcGhvbmUgcmVjb3JkaW5nIHNvdXJjZSAqLworI2RlZmluZSBTUkNfX0NEICAgICAgICAgIDMJLyogU2VsZWN0IENEIHJlY29yZGluZyBzb3VyY2UgKi8KKyNkZWZpbmUgU1JDX19MSU5FICAgICAgICA3CS8qIFVzZSBMaW5lLWluIGZvciByZWNvcmRpbmcgc291cmNlICovCisKKy8qCisgKglSZWNvcmRpbmcgc291cmNlcyBmb3IgQUxTLTAwNworICovCisKKyNkZWZpbmUgQUxTMDA3X01JQwk0CisjZGVmaW5lIEFMUzAwN19MSU5FCTYKKyNkZWZpbmUgQUxTMDA3X0NECTIKKyNkZWZpbmUgQUxTMDA3X1NZTlRICTcKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zZXF1ZW5jZXIuYyBiL3NvdW5kL29zcy9zZXF1ZW5jZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg2MTQyCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NlcXVlbmNlci5jCkBAIC0wLDAgKzEsMTY4NCBAQAorLyoKKyAqIHNvdW5kL3NlcXVlbmNlci5jCisgKgorICogVGhlIHNlcXVlbmNlciBwZXJzb25hbGl0eSBtYW5hZ2VyLgorICovCisvKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKy8qCisgKiBUaG9tYXMgU2FpbGVyICAgOiBpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKiBBbGFuIENveAkgICA6IHJlZm9ybWF0dGVkIGFuZCBmaXhlZCBhIHBhaXIgb2YgbnVsbCBwb2ludGVyIGJ1Z3MKKyAqLworI2luY2x1ZGUgPGxpbnV4L2ttb2QuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2RlZmluZSBTRVFVRU5DRVJfQworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAibWlkaV9jdHJsLmgiCisKK3N0YXRpYyBpbnQgICAgICBzZXF1ZW5jZXJfb2s7CitzdGF0aWMgc3RydWN0IHNvdW5kX3RpbWVyX29wZXJhdGlvbnMgKnRtcjsKK3N0YXRpYyBpbnQgICAgICB0bXJfbm8gPSAtMTsJLyogQ3VycmVudGx5IHNlbGVjdGVkIHRpbWVyICovCitzdGF0aWMgaW50ICAgICAgcGVuZGluZ190aW1lciA9IC0xOwkvKiBGb3IgdGltZXIgY2hhbmdlIG9wZXJhdGlvbiAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgc2VxX3RpbWU7CisKK3N0YXRpYyBpbnQgICAgICBvYnNvbGV0ZV9hcGlfdXNlZDsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKKy8qCisgKiBMb2NhbCBjb3VudHMgZm9yIG51bWJlciBvZiBzeW50aCBhbmQgTUlESSBkZXZpY2VzLiBUaGVzZSBhcmUgaW5pdGlhbGl6ZWQKKyAqIGJ5IHRoZSBzZXF1ZW5jZXJfb3Blbi4KKyAqLworc3RhdGljIGludCAgICAgIG1heF9taWRpZGV2Oworc3RhdGljIGludCAgICAgIG1heF9zeW50aGRldjsKKworLyoKKyAqIFRoZSBzZXFfbW9kZSBnaXZlcyB0aGUgb3BlcmF0aW5nIG1vZGUgb2YgdGhlIHNlcXVlbmNlcjoKKyAqICAgICAgMSA9IGxldmVsMSAodGhlIGRlZmF1bHQpCisgKiAgICAgIDIgPSBsZXZlbDIgKGV4dGVuZGVkIGNhcGFiaWxpdGllcykKKyAqLworCisjZGVmaW5lIFNFUV8xCTEKKyNkZWZpbmUgU0VRXzIJMgorc3RhdGljIGludCAgICAgIHNlcV9tb2RlID0gU0VRXzE7CisKK3N0YXRpYyBERUNMQVJFX1dBSVRfUVVFVUVfSEVBRChzZXFfc2xlZXBlcik7CitzdGF0aWMgREVDTEFSRV9XQUlUX1FVRVVFX0hFQUQobWlkaV9zbGVlcGVyKTsKKworc3RhdGljIGludCAgICAgIG1pZGlfb3BlbmVkW01BWF9NSURJX0RFVl07CisKK3N0YXRpYyBpbnQgICAgICBtaWRpX3dyaXR0ZW5bTUFYX01JRElfREVWXTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9pbnB1dF90aW1lOworc3RhdGljIGludCAgICAgIHByZXZfZXZlbnRfdGltZTsKKworI2luY2x1ZGUgInR1bmluZy5oIgorCisjZGVmaW5lIEVWX1NaCTgKKyNkZWZpbmUgSUVWX1NaCTgKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgKnF1ZXVlOworc3RhdGljIHVuc2lnbmVkIGNoYXIgKmlxdWV1ZTsKKworc3RhdGljIHZvbGF0aWxlIGludCBxaGVhZCwgcXRhaWwsIHFsZW47CitzdGF0aWMgdm9sYXRpbGUgaW50IGlxaGVhZCwgaXF0YWlsLCBpcWxlbjsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgc2VxX3BsYXlpbmc7CitzdGF0aWMgdm9sYXRpbGUgaW50IHNlcXVlbmNlcl9idXN5Oworc3RhdGljIGludCAgICAgIG91dHB1dF90aHJlc2hvbGQ7CitzdGF0aWMgbG9uZyAgICAgcHJlX2V2ZW50X3RpbWVvdXQ7CitzdGF0aWMgdW5zaWduZWQgc3ludGhfb3Blbl9tYXNrOworCitzdGF0aWMgaW50ICAgICAgc2VxX3F1ZXVlKHVuc2lnbmVkIGNoYXIgKm5vdGUsIGNoYXIgbm9uYmxvY2spOworc3RhdGljIHZvaWQgICAgIHNlcV9zdGFydHBsYXkodm9pZCk7CitzdGF0aWMgaW50ICAgICAgc2VxX3N5bmModm9pZCk7CitzdGF0aWMgdm9pZCAgICAgc2VxX3Jlc2V0KHZvaWQpOworCisjaWYgTUFYX1NZTlRIX0RFViA+IDE1CisjZXJyb3IgVG9vIG1hbnkgc3ludGhlc2l6ZXIgZGV2aWNlcyBlbmFibGVkLgorI2VuZGlmCisKK2ludCBzZXF1ZW5jZXJfcmVhZChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBjID0gY291bnQsIHAgPSAwOworCWludCBldl9sZW47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldiA9IGRldiA+PiA0OworCisJZXZfbGVuID0gc2VxX21vZGUgPT0gU0VRXzEgPyA0IDogODsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKworCWlmICghaXFsZW4pCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKyAJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworICAJCQlyZXR1cm4gLUVBR0FJTjsKKyAgCQl9CisKKyAJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmbWlkaV9zbGVlcGVyLAorCQkJCQkgICAgICAgcHJlX2V2ZW50X3RpbWVvdXQpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisJCWlmICghaXFsZW4pCisJCXsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJd2hpbGUgKGlxbGVuICYmIGMgPj0gZXZfbGVuKQorCXsKKwkJY2hhciAqZml4aXQgPSAoY2hhciAqKSAmaXF1ZXVlW2lxaGVhZCAqIElFVl9TWl07CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKCYoYnVmKVtwXSwgZml4aXQsIGV2X2xlbikpCisJCQlyZXR1cm4gY291bnQgLSBjOworCQlwICs9IGV2X2xlbjsKKwkJYyAtPSBldl9sZW47CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCQlpcWhlYWQgPSAoaXFoZWFkICsgMSkgJSBTRVFfTUFYX1FVRVVFOworCQlpcWxlbi0tOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwlyZXR1cm4gY291bnQgLSBjOworfQorCitzdGF0aWMgdm9pZCBzZXF1ZW5jZXJfbWlkaV9vdXRwdXQoaW50IGRldikKK3sKKwkvKgorCSAqIEN1cnJlbnRseSBOT1AKKwkgKi8KK30KKwordm9pZCBzZXFfY29weV90b19pbnB1dCh1bnNpZ25lZCBjaGFyICpldmVudF9yZWMsIGludCBsZW4pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qCisJICogVmVyaWZ5IHRoYXQgdGhlIGxlbiBpcyB2YWxpZCBmb3IgdGhlIGN1cnJlbnQgbW9kZS4KKwkgKi8KKworCWlmIChsZW4gIT0gNCAmJiBsZW4gIT0gOCkKKwkJcmV0dXJuOworCWlmICgoc2VxX21vZGUgPT0gU0VRXzEpICE9IChsZW4gPT0gNCkpCisJCXJldHVybjsKKworCWlmIChpcWxlbiA+PSAoU0VRX01BWF9RVUVVRSAtIDEpKQorCQlyZXR1cm47CQkvKiBPdmVyZmxvdyAqLworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCW1lbWNweSgmaXF1ZXVlW2lxdGFpbCAqIElFVl9TWl0sIGV2ZW50X3JlYywgbGVuKTsKKwlpcWxlbisrOworCWlxdGFpbCA9IChpcXRhaWwgKyAxKSAlIFNFUV9NQVhfUVVFVUU7CisJd2FrZV91cCgmbWlkaV9zbGVlcGVyKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgc2VxdWVuY2VyX21pZGlfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGludCB0c3RhbXA7CisJdW5zaWduZWQgY2hhciBldmVudF9yZWNbNF07CisKKwlpZiAoZGF0YSA9PSAweGZlKQkvKiBJZ25vcmUgYWN0aXZlIHNlbnNpbmcgKi8KKwkJcmV0dXJuOworCisJdHN0YW1wID0gamlmZmllcyAtIHNlcV90aW1lOworCisJaWYgKHRzdGFtcCAhPSBwcmV2X2lucHV0X3RpbWUpCisJeworCQl0c3RhbXAgPSAodHN0YW1wIDw8IDgpIHwgU0VRX1dBSVQ7CisJCXNlcV9jb3B5X3RvX2lucHV0KCh1bnNpZ25lZCBjaGFyICopICZ0c3RhbXAsIDQpOworCQlwcmV2X2lucHV0X3RpbWUgPSB0c3RhbXA7CisJfQorCWV2ZW50X3JlY1swXSA9IFNFUV9NSURJUFVUQzsKKwlldmVudF9yZWNbMV0gPSBkYXRhOworCWV2ZW50X3JlY1syXSA9IGRldjsKKwlldmVudF9yZWNbM10gPSAwOworCisJc2VxX2NvcHlfdG9faW5wdXQoZXZlbnRfcmVjLCA0KTsKK30KKwordm9pZCBzZXFfaW5wdXRfZXZlbnQodW5zaWduZWQgY2hhciAqZXZlbnRfcmVjLCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGxvbmcgdGhpc190aW1lOworCisJaWYgKHNlcV9tb2RlID09IFNFUV8yKQorCQl0aGlzX3RpbWUgPSB0bXItPmdldF90aW1lKHRtcl9ubyk7CisJZWxzZQorCQl0aGlzX3RpbWUgPSBqaWZmaWVzIC0gc2VxX3RpbWU7CisKKwlpZiAodGhpc190aW1lICE9IHByZXZfaW5wdXRfdGltZSkKKwl7CisJCXVuc2lnbmVkIGNoYXIgICB0bXBfZXZlbnRbOF07CisKKwkJdG1wX2V2ZW50WzBdID0gRVZfVElNSU5HOworCQl0bXBfZXZlbnRbMV0gPSBUTVJfV0FJVF9BQlM7CisJCXRtcF9ldmVudFsyXSA9IDA7CisJCXRtcF9ldmVudFszXSA9IDA7CisJCSoodW5zaWduZWQgaW50ICopICZ0bXBfZXZlbnRbNF0gPSB0aGlzX3RpbWU7CisKKwkJc2VxX2NvcHlfdG9faW5wdXQodG1wX2V2ZW50LCA4KTsKKwkJcHJldl9pbnB1dF90aW1lID0gdGhpc190aW1lOworCX0KKwlzZXFfY29weV90b19pbnB1dChldmVudF9yZWMsIGxlbik7Cit9CisKK2ludCBzZXF1ZW5jZXJfd3JpdGUoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCkKK3sKKwl1bnNpZ25lZCBjaGFyIGV2ZW50X3JlY1tFVl9TWl0sIGV2X2NvZGU7CisJaW50IHAgPSAwLCBjLCBldl9zaXplOworCWludCBlcnI7CisJaW50IG1vZGUgPSB0cmFuc2xhdGVfbW9kZShmaWxlKTsKKworCWRldiA9IGRldiA+PiA0OworCisJREVCKHByaW50aygic2VxdWVuY2VyX3dyaXRlKGRldj0lZCwgY291bnQ9JWQpXG4iLCBkZXYsIGNvdW50KSk7CisKKwlpZiAobW9kZSA9PSBPUEVOX1JFQUQpCisJCXJldHVybiAtRUlPOworCisJYyA9IGNvdW50OworCisJd2hpbGUgKGMgPj0gNCkKKwl7CisJCWlmIChjb3B5X2Zyb21fdXNlcigoY2hhciAqKSBldmVudF9yZWMsICYoYnVmKVtwXSwgNCkpCisJCQlnb3RvIG91dDsKKwkJZXZfY29kZSA9IGV2ZW50X3JlY1swXTsKKworCQlpZiAoZXZfY29kZSA9PSBTRVFfRlVMTFNJWkUpCisJCXsKKwkJCWludCBlcnIsIGZtdDsKKworCQkJZGV2ID0gKih1bnNpZ25lZCBzaG9ydCAqKSAmZXZlbnRfcmVjWzJdOworCQkJaWYgKGRldiA8IDAgfHwgZGV2ID49IG1heF9zeW50aGRldiB8fCBzeW50aF9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOWElPOworCisJCQlpZiAoIShzeW50aF9vcGVuX21hc2sgJiAoMSA8PCBkZXYpKSkKKwkJCQlyZXR1cm4gLUVOWElPOworCisJCQlmbXQgPSAoKihzaG9ydCAqKSAmZXZlbnRfcmVjWzBdKSAmIDB4ZmZmZjsKKwkJCWVyciA9IHN5bnRoX2RldnNbZGV2XS0+bG9hZF9wYXRjaChkZXYsIGZtdCwgYnVmLCBwICsgNCwgYywgMCk7CisJCQlpZiAoZXJyIDwgMCkKKwkJCQlyZXR1cm4gZXJyOworCisJCQlyZXR1cm4gZXJyOworCQl9CisJCWlmIChldl9jb2RlID49IDEyOCkKKwkJeworCQkJaWYgKHNlcV9tb2RlID09IFNFUV8yICYmIGV2X2NvZGUgPT0gU0VRX0VYVEVOREVEKQorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlcXVlbmNlcjogSW52YWxpZCBsZXZlbCAyIGV2ZW50ICV4XG4iLCBldl9jb2RlKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWV2X3NpemUgPSA4OworCisJCQlpZiAoYyA8IGV2X3NpemUpCisJCQl7CisJCQkJaWYgKCFzZXFfcGxheWluZykKKwkJCQkJc2VxX3N0YXJ0cGxheSgpOworCQkJCXJldHVybiBjb3VudCAtIGM7CisJCQl9CisJCQlpZiAoY29weV9mcm9tX3VzZXIoKGNoYXIgKikmZXZlbnRfcmVjWzRdLAorCQkJCQkgICAmKGJ1ZilbcCArIDRdLCA0KSkKKwkJCQlnb3RvIG91dDsKKworCQl9CisJCWVsc2UKKwkJeworCQkJaWYgKHNlcV9tb2RlID09IFNFUV8yKQorCQkJeworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlcXVlbmNlcjogNCBieXRlIGV2ZW50IGluIGxldmVsIDIgbW9kZVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlldl9zaXplID0gNDsKKworCQkJaWYgKGV2ZW50X3JlY1swXSAhPSBTRVFfTUlESVBVVEMpCisJCQkJb2Jzb2xldGVfYXBpX3VzZWQgPSAxOworCQl9CisKKwkJaWYgKGV2ZW50X3JlY1swXSA9PSBTRVFfTUlESVBVVEMpCisJCXsKKwkJCWlmICghbWlkaV9vcGVuZWRbZXZlbnRfcmVjWzJdXSkKKwkJCXsKKwkJCQlpbnQgbW9kZTsKKwkJCQlpbnQgZGV2ID0gZXZlbnRfcmVjWzJdOworCisJCQkJaWYgKGRldiA+PSBtYXhfbWlkaWRldiB8fCBtaWRpX2RldnNbZGV2XT09TlVMTCkKKwkJCQl7CisJCQkJCS8qcHJpbnRrKCJTZXF1ZW5jZXIgRXJyb3I6IE5vbmV4aXN0ZW50IE1JREkgZGV2aWNlICVkXG4iLCBkZXYpOyovCisJCQkJCXJldHVybiAtRU5YSU87CisJCQkJfQorCQkJCW1vZGUgPSB0cmFuc2xhdGVfbW9kZShmaWxlKTsKKworCQkJCWlmICgoZXJyID0gbWlkaV9kZXZzW2Rldl0tPm9wZW4oZGV2LCBtb2RlLAorCQkJCQkJCQlzZXF1ZW5jZXJfbWlkaV9pbnB1dCwgc2VxdWVuY2VyX21pZGlfb3V0cHV0KSkgPCAwKQorCQkJCXsKKwkJCQkJc2VxX3Jlc2V0KCk7CisJCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIlNlcXVlbmNlciBFcnJvcjogVW5hYmxlIHRvIG9wZW4gTWlkaSAjJWRcbiIsIGRldik7CisJCQkJCXJldHVybiBlcnI7CisJCQkJfQorCQkJCW1pZGlfb3BlbmVkW2Rldl0gPSAxOworCQkJfQorCQl9CisJCWlmICghc2VxX3F1ZXVlKGV2ZW50X3JlYywgKGZpbGUtPmZfZmxhZ3MgJiAoT19OT05CTE9DSykgPyAxIDogMCkpKQorCQl7CisJCQlpbnQgcHJvY2Vzc2VkID0gY291bnQgLSBjOworCisJCQlpZiAoIXNlcV9wbGF5aW5nKQorCQkJCXNlcV9zdGFydHBsYXkoKTsKKworCQkJaWYgKCFwcm9jZXNzZWQgJiYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSkKKwkJCQlyZXR1cm4gLUVBR0FJTjsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gcHJvY2Vzc2VkOworCQl9CisJCXAgKz0gZXZfc2l6ZTsKKwkJYyAtPSBldl9zaXplOworCX0KKworCWlmICghc2VxX3BsYXlpbmcpCisJCXNlcV9zdGFydHBsYXkoKTsKK291dDoKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgc2VxX3F1ZXVlKHVuc2lnbmVkIGNoYXIgKm5vdGUsIGNoYXIgbm9uYmxvY2spCit7CisKKwkvKgorCSAqIFRlc3QgaWYgdGhlcmUgaXMgc3BhY2UgaW4gdGhlIHF1ZXVlCisJICovCisKKwlpZiAocWxlbiA+PSBTRVFfTUFYX1FVRVVFKQorCQlpZiAoIXNlcV9wbGF5aW5nKQorCQkJc2VxX3N0YXJ0cGxheSgpOwkvKgorCQkJCQkJICogR2l2ZSBjaGFuY2UgdG8gZHJhaW4gdGhlIHF1ZXVlCisJCQkJCQkgKi8KKworCWlmICghbm9uYmxvY2sgJiYgcWxlbiA+PSBTRVFfTUFYX1FVRVVFICYmICF3YWl0cXVldWVfYWN0aXZlKCZzZXFfc2xlZXBlcikpIHsKKwkJLyoKKwkJICogU2xlZXAgdW50aWwgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIG9uIHRoZSBxdWV1ZQorCQkgKi8KKwkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmc2VxX3NsZWVwZXIpOworCX0KKwlpZiAocWxlbiA+PSBTRVFfTUFYX1FVRVVFKQorCXsKKwkJcmV0dXJuIDA7CS8qCisJCQkJICogVG8gYmUgc3VyZQorCQkJCSAqLworCX0KKwltZW1jcHkoJnF1ZXVlW3F0YWlsICogRVZfU1pdLCBub3RlLCBFVl9TWik7CisKKwlxdGFpbCA9IChxdGFpbCArIDEpICUgU0VRX01BWF9RVUVVRTsKKwlxbGVuKys7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBleHRlbmRlZF9ldmVudCh1bnNpZ25lZCBjaGFyICpxKQoreworCWludCBkZXYgPSBxWzJdOworCisJaWYgKGRldiA8IDAgfHwgZGV2ID49IG1heF9zeW50aGRldikKKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmICghKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IGRldikpKQorCQlyZXR1cm4gLUVOWElPOworCisJc3dpdGNoIChxWzFdKQorCXsKKwkJY2FzZSBTRVFfTk9URU9GRjoKKwkJCXN5bnRoX2RldnNbZGV2XS0+a2lsbF9ub3RlKGRldiwgcVszXSwgcVs0XSwgcVs1XSk7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9OT1RFT046CisJCQlpZiAocVs0XSA+IDEyNyAmJiBxWzRdICE9IDI1NSkKKwkJCQlyZXR1cm4gMDsKKworCQkJaWYgKHFbNV0gPT0gMCkKKwkJCXsKKwkJCQlzeW50aF9kZXZzW2Rldl0tPmtpbGxfbm90ZShkZXYsIHFbM10sIHFbNF0sIHFbNV0pOworCQkJCWJyZWFrOworCQkJfQorCQkJc3ludGhfZGV2c1tkZXZdLT5zdGFydF9ub3RlKGRldiwgcVszXSwgcVs0XSwgcVs1XSk7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9QR01DSEFOR0U6CisJCQlzeW50aF9kZXZzW2Rldl0tPnNldF9pbnN0cihkZXYsIHFbM10sIHFbNF0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfQUZURVJUT1VDSDoKKwkJCXN5bnRoX2RldnNbZGV2XS0+YWZ0ZXJ0b3VjaChkZXYsIHFbM10sIHFbNF0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfQkFMQU5DRToKKwkJCXN5bnRoX2RldnNbZGV2XS0+cGFubmluZyhkZXYsIHFbM10sIChjaGFyKSBxWzRdKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0NPTlRST0xMRVI6CisJCQlzeW50aF9kZXZzW2Rldl0tPmNvbnRyb2xsZXIoZGV2LCBxWzNdLCBxWzRdLCAoc2hvcnQpIChxWzVdIHwgKHFbNl0gPDwgOCkpKTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX1ZPTE1PREU6CisJCQlpZiAoc3ludGhfZGV2c1tkZXZdLT52b2x1bWVfbWV0aG9kICE9IE5VTEwpCisJCQkJc3ludGhfZGV2c1tkZXZdLT52b2x1bWVfbWV0aG9kKGRldiwgcVszXSk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbmRfdm9pY2UoaW50IGRldiwgaW50IGNobiwgaW50IG5vdGUpCit7CisJdW5zaWduZWQgc2hvcnQga2V5OworCWludCBpOworCisJa2V5ID0gKGNobiA8PCA4KSB8IChub3RlICsgMSk7CisJZm9yIChpID0gMDsgaSA8IHN5bnRoX2RldnNbZGV2XS0+YWxsb2MubWF4X3ZvaWNlOyBpKyspCisJCWlmIChzeW50aF9kZXZzW2Rldl0tPmFsbG9jLm1hcFtpXSA9PSBrZXkpCisJCQlyZXR1cm4gaTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYWxsb2Nfdm9pY2UoaW50IGRldiwgaW50IGNobiwgaW50IG5vdGUpCit7CisJdW5zaWduZWQgc2hvcnQgIGtleTsKKwlpbnQgdm9pY2U7CisKKwlrZXkgPSAoY2huIDw8IDgpIHwgKG5vdGUgKyAxKTsKKworCXZvaWNlID0gc3ludGhfZGV2c1tkZXZdLT5hbGxvY192b2ljZShkZXYsIGNobiwgbm90ZSwKKwkJCQkJICAgICAmc3ludGhfZGV2c1tkZXZdLT5hbGxvYyk7CisJc3ludGhfZGV2c1tkZXZdLT5hbGxvYy5tYXBbdm9pY2VdID0ga2V5OworCXN5bnRoX2RldnNbZGV2XS0+YWxsb2MuYWxsb2NfdGltZXNbdm9pY2VdID0KKwkJCXN5bnRoX2RldnNbZGV2XS0+YWxsb2MudGltZXN0YW1wKys7CisJcmV0dXJuIHZvaWNlOworfQorCitzdGF0aWMgdm9pZCBzZXFfY2huX3ZvaWNlX2V2ZW50KHVuc2lnbmVkIGNoYXIgKmV2ZW50X3JlYykKK3sKKyNkZWZpbmUgZGV2IGV2ZW50X3JlY1sxXQorI2RlZmluZSBjbWQgZXZlbnRfcmVjWzJdCisjZGVmaW5lIGNobiBldmVudF9yZWNbM10KKyNkZWZpbmUgbm90ZSBldmVudF9yZWNbNF0KKyNkZWZpbmUgcGFybSBldmVudF9yZWNbNV0KKworCWludCB2b2ljZSA9IC0xOworCisJaWYgKChpbnQpIGRldiA+IG1heF9zeW50aGRldiB8fCBzeW50aF9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJcmV0dXJuOworCWlmICghKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IGRldikpKQorCQlyZXR1cm47CisJaWYgKCFzeW50aF9kZXZzW2Rldl0pCisJCXJldHVybjsKKworCWlmIChzZXFfbW9kZSA9PSBTRVFfMikKKwl7CisJCWlmIChzeW50aF9kZXZzW2Rldl0tPmFsbG9jX3ZvaWNlKQorCQkJdm9pY2UgPSBmaW5kX3ZvaWNlKGRldiwgY2huLCBub3RlKTsKKworCQlpZiAoY21kID09IE1JRElfTk9URU9OICYmIHBhcm0gPT0gMCkKKwkJeworCQkJY21kID0gTUlESV9OT1RFT0ZGOworCQkJcGFybSA9IDY0OworCQl9CisJfQorCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIE1JRElfTk9URU9OOgorCQkJaWYgKG5vdGUgPiAxMjcgJiYgbm90ZSAhPSAyNTUpCS8qIE5vdCBhIHNlcTIgZmVhdHVyZSAqLworCQkJCXJldHVybjsKKworCQkJaWYgKHZvaWNlID09IC0xICYmIHNlcV9tb2RlID09IFNFUV8yICYmIHN5bnRoX2RldnNbZGV2XS0+YWxsb2Nfdm9pY2UpCisJCQl7CisJCQkJLyogSW50ZXJuYWwgc3ludGhlc2l6ZXIgKEZNLCBHVVMsIGV0YykgKi8KKwkJCQl2b2ljZSA9IGFsbG9jX3ZvaWNlKGRldiwgY2huLCBub3RlKTsKKwkJCX0KKwkJCWlmICh2b2ljZSA9PSAtMSkKKwkJCQl2b2ljZSA9IGNobjsKKworCQkJaWYgKHNlcV9tb2RlID09IFNFUV8yICYmIChpbnQpIGRldiA8IG51bV9zeW50aHMpCisJCQl7CisJCQkJLyoKKwkJCQkgKiBUaGUgTUlESSBjaGFubmVsIDEwIGlzIGEgcGVyY3Vzc2l2ZSBjaGFubmVsLiBVc2UgdGhlIG5vdGUKKwkJCQkgKiBudW1iZXIgdG8gc2VsZWN0IHRoZSBwcm9wZXIgcGF0Y2ggKDEyOCB0byAyNTUpIHRvIHBsYXkuCisJCQkJICovCisKKwkJCQlpZiAoY2huID09IDkpCisJCQkJeworCQkJCQlzeW50aF9kZXZzW2Rldl0tPnNldF9pbnN0cihkZXYsIHZvaWNlLCAxMjggKyBub3RlKTsKKwkJCQkJc3ludGhfZGV2c1tkZXZdLT5jaG5faW5mb1tjaG5dLnBnbV9udW0gPSAxMjggKyBub3RlOworCQkJCX0KKwkJCQlzeW50aF9kZXZzW2Rldl0tPnNldHVwX3ZvaWNlKGRldiwgdm9pY2UsIGNobik7CisJCQl9CisJCQlzeW50aF9kZXZzW2Rldl0tPnN0YXJ0X25vdGUoZGV2LCB2b2ljZSwgbm90ZSwgcGFybSk7CisJCQlicmVhazsKKworCQljYXNlIE1JRElfTk9URU9GRjoKKwkJCWlmICh2b2ljZSA9PSAtMSkKKwkJCQl2b2ljZSA9IGNobjsKKwkJCXN5bnRoX2RldnNbZGV2XS0+a2lsbF9ub3RlKGRldiwgdm9pY2UsIG5vdGUsIHBhcm0pOworCQkJYnJlYWs7CisKKwkJY2FzZSBNSURJX0tFWV9QUkVTU1VSRToKKwkJCWlmICh2b2ljZSA9PSAtMSkKKwkJCQl2b2ljZSA9IGNobjsKKwkJCXN5bnRoX2RldnNbZGV2XS0+YWZ0ZXJ0b3VjaChkZXYsIHZvaWNlLCBwYXJtKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6OworCX0KKyN1bmRlZiBkZXYKKyN1bmRlZiBjbWQKKyN1bmRlZiBjaG4KKyN1bmRlZiBub3RlCisjdW5kZWYgcGFybQorfQorCisKK3N0YXRpYyB2b2lkIHNlcV9jaG5fY29tbW9uX2V2ZW50KHVuc2lnbmVkIGNoYXIgKmV2ZW50X3JlYykKK3sKKwl1bnNpZ25lZCBjaGFyIGRldiA9IGV2ZW50X3JlY1sxXTsKKwl1bnNpZ25lZCBjaGFyIGNtZCA9IGV2ZW50X3JlY1syXTsKKwl1bnNpZ25lZCBjaGFyIGNobiA9IGV2ZW50X3JlY1szXTsKKwl1bnNpZ25lZCBjaGFyIHAxID0gZXZlbnRfcmVjWzRdOworCisJLyogdW5zaWduZWQgY2hhciBwMiA9IGV2ZW50X3JlY1s1XTsgKi8KKwl1bnNpZ25lZCBzaG9ydCB3MTQgPSAqKHNob3J0ICopICZldmVudF9yZWNbNl07CisKKwlpZiAoKGludCkgZGV2ID4gbWF4X3N5bnRoZGV2IHx8IHN5bnRoX2RldnNbZGV2XSA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKCEoc3ludGhfb3Blbl9tYXNrICYgKDEgPDwgZGV2KSkpCisJCXJldHVybjsKKwlpZiAoIXN5bnRoX2RldnNbZGV2XSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIE1JRElfUEdNX0NIQU5HRToKKwkJCWlmIChzZXFfbW9kZSA9PSBTRVFfMikKKwkJCXsKKwkJCQlzeW50aF9kZXZzW2Rldl0tPmNobl9pbmZvW2Nobl0ucGdtX251bSA9IHAxOworCQkJCWlmICgoaW50KSBkZXYgPj0gbnVtX3N5bnRocykKKwkJCQkJc3ludGhfZGV2c1tkZXZdLT5zZXRfaW5zdHIoZGV2LCBjaG4sIHAxKTsKKwkJCX0KKwkJCWVsc2UKKwkJCQlzeW50aF9kZXZzW2Rldl0tPnNldF9pbnN0cihkZXYsIGNobiwgcDEpOworCisJCQlicmVhazsKKworCQljYXNlIE1JRElfQ1RMX0NIQU5HRToKKwkJCWlmIChzZXFfbW9kZSA9PSBTRVFfMikKKwkJCXsKKwkJCQlpZiAoY2huID4gMTUgfHwgcDEgPiAxMjcpCisJCQkJCWJyZWFrOworCisJCQkJc3ludGhfZGV2c1tkZXZdLT5jaG5faW5mb1tjaG5dLmNvbnRyb2xsZXJzW3AxXSA9IHcxNCAmIDB4N2Y7CisKKwkJCQlpZiAocDEgPCAzMikJLyogU2V0dGluZyBNU0Igc2hvdWxkIGNsZWFyIExTQiB0byAwICovCisJCQkJCXN5bnRoX2RldnNbZGV2XS0+Y2huX2luZm9bY2huXS5jb250cm9sbGVyc1twMSArIDMyXSA9IDA7CisKKwkJCQlpZiAoKGludCkgZGV2IDwgbnVtX3N5bnRocykKKwkJCQl7CisJCQkJCWludCB2YWwgPSB3MTQgJiAweDdmOworCQkJCQlpbnQgaSwga2V5OworCisJCQkJCWlmIChwMSA8IDY0KQkvKiBDb21iaW5lIE1TQiBhbmQgTFNCICovCisJCQkJCXsKKwkJCQkJCXZhbCA9ICgoc3ludGhfZGV2c1tkZXZdLT4KKwkJCQkJCQljaG5faW5mb1tjaG5dLmNvbnRyb2xsZXJzW3AxICYgfjMyXSAmIDB4N2YpIDw8IDcpCisJCQkJCQkJfCAoc3ludGhfZGV2c1tkZXZdLT4KKwkJCQkJCQljaG5faW5mb1tjaG5dLmNvbnRyb2xsZXJzW3AxIHwgMzJdICYgMHg3Zik7CisJCQkJCQlwMSAmPSB+MzI7CisJCQkJCX0KKwkJCQkJLyogSGFuZGxlIGFsbCBwbGF5aW5nIG5vdGVzIG9uIHRoaXMgY2hhbm5lbCAqLworCisJCQkJCWtleSA9ICgoaW50KSBjaG4gPDwgOCk7CisKKwkJCQkJZm9yIChpID0gMDsgaSA8IHN5bnRoX2RldnNbZGV2XS0+YWxsb2MubWF4X3ZvaWNlOyBpKyspCisJCQkJCQlpZiAoKHN5bnRoX2RldnNbZGV2XS0+YWxsb2MubWFwW2ldICYgMHhmZjAwKSA9PSBrZXkpCisJCQkJCQkJc3ludGhfZGV2c1tkZXZdLT5jb250cm9sbGVyKGRldiwgaSwgcDEsIHZhbCk7CisJCQkJfQorCQkJCWVsc2UKKwkJCQkJc3ludGhfZGV2c1tkZXZdLT5jb250cm9sbGVyKGRldiwgY2huLCBwMSwgdzE0KTsKKwkJCX0KKwkJCWVsc2UJLyogTW9kZSAxICovCisJCQkJc3ludGhfZGV2c1tkZXZdLT5jb250cm9sbGVyKGRldiwgY2huLCBwMSwgdzE0KTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUlESV9QSVRDSF9CRU5EOgorCQkJaWYgKHNlcV9tb2RlID09IFNFUV8yKQorCQkJeworCQkJCXN5bnRoX2RldnNbZGV2XS0+Y2huX2luZm9bY2huXS5iZW5kZXJfdmFsdWUgPSB3MTQ7CisKKwkJCQlpZiAoKGludCkgZGV2IDwgbnVtX3N5bnRocykKKwkJCQl7CisJCQkJCS8qIEhhbmRsZSBhbGwgcGxheWluZyBub3RlcyBvbiB0aGlzIGNoYW5uZWwgKi8KKwkJCQkJaW50IGksIGtleTsKKworCQkJCQlrZXkgPSAoY2huIDw8IDgpOworCisJCQkJCWZvciAoaSA9IDA7IGkgPCBzeW50aF9kZXZzW2Rldl0tPmFsbG9jLm1heF92b2ljZTsgaSsrKQorCQkJCQkJaWYgKChzeW50aF9kZXZzW2Rldl0tPmFsbG9jLm1hcFtpXSAmIDB4ZmYwMCkgPT0ga2V5KQorCQkJCQkJCXN5bnRoX2RldnNbZGV2XS0+YmVuZGVyKGRldiwgaSwgdzE0KTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCQlzeW50aF9kZXZzW2Rldl0tPmJlbmRlcihkZXYsIGNobiwgdzE0KTsKKwkJCX0KKwkJCWVsc2UJLyogTU9ERSAxICovCisJCQkJc3ludGhfZGV2c1tkZXZdLT5iZW5kZXIoZGV2LCBjaG4sIHcxNCk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgc2VxX3RpbWluZ19ldmVudCh1bnNpZ25lZCBjaGFyICpldmVudF9yZWMpCit7CisJdW5zaWduZWQgY2hhciBjbWQgPSBldmVudF9yZWNbMV07CisJdW5zaWduZWQgaW50IHBhcm0gPSAqKGludCAqKSAmZXZlbnRfcmVjWzRdOworCisJaWYgKHNlcV9tb2RlID09IFNFUV8yKQorCXsKKwkJaW50IHJldDsKKworCQlpZiAoKHJldCA9IHRtci0+ZXZlbnQodG1yX25vLCBldmVudF9yZWMpKSA9PSBUSU1FUl9BUk1FRCkKKwkJCWlmICgoU0VRX01BWF9RVUVVRSAtIHFsZW4pID49IG91dHB1dF90aHJlc2hvbGQpCisJCQkJd2FrZV91cCgmc2VxX3NsZWVwZXIpOworCQlyZXR1cm4gcmV0OworCX0KKwlzd2l0Y2ggKGNtZCkKKwl7CisJCWNhc2UgVE1SX1dBSVRfUkVMOgorCQkJcGFybSArPSBwcmV2X2V2ZW50X3RpbWU7CisKKwkJCS8qCisJCQkgKiBOT1RFISAgTm8gYnJlYWsgaGVyZS4gRXhlY3V0aW9uIG9mIFRNUl9XQUlUX1JFTCBjb250aW51ZXMgaW4gdGhlCisJCQkgKiBuZXh0IGNhc2UgKFRNUl9XQUlUX0FCUykKKwkJCSAqLworCisJCWNhc2UgVE1SX1dBSVRfQUJTOgorCQkJaWYgKHBhcm0gPiAwKQorCQkJeworCQkJCWxvbmcgdGltZTsKKworCQkJCXRpbWUgPSBwYXJtOworCQkJCXByZXZfZXZlbnRfdGltZSA9IHRpbWU7CisKKwkJCQlzZXFfcGxheWluZyA9IDE7CisJCQkJcmVxdWVzdF9zb3VuZF90aW1lcih0aW1lKTsKKworCQkJCWlmICgoU0VRX01BWF9RVUVVRSAtIHFsZW4pID49IG91dHB1dF90aHJlc2hvbGQpCisJCQkJCXdha2VfdXAoJnNlcV9zbGVlcGVyKTsKKwkJCQlyZXR1cm4gVElNRVJfQVJNRUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRNUl9TVEFSVDoKKwkJCXNlcV90aW1lID0gamlmZmllczsKKwkJCXByZXZfaW5wdXRfdGltZSA9IDA7CisJCQlwcmV2X2V2ZW50X3RpbWUgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfU1RPUDoKKwkJCWJyZWFrOworCisJCWNhc2UgVE1SX0NPTlRJTlVFOgorCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfVEVNUE86CisJCQlicmVhazsKKworCQljYXNlIFRNUl9FQ0hPOgorCQkJaWYgKHNlcV9tb2RlID09IFNFUV8yKQorCQkJCXNlcV9jb3B5X3RvX2lucHV0KGV2ZW50X3JlYywgOCk7CisJCQllbHNlCisJCQl7CisJCQkJcGFybSA9IChwYXJtIDw8IDggfCBTRVFfRUNITyk7CisJCQkJc2VxX2NvcHlfdG9faW5wdXQoKHVuc2lnbmVkIGNoYXIgKikgJnBhcm0sIDQpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDo7CisJfQorCisJcmV0dXJuIFRJTUVSX05PVF9BUk1FRDsKK30KKworc3RhdGljIHZvaWQgc2VxX2xvY2FsX2V2ZW50KHVuc2lnbmVkIGNoYXIgKmV2ZW50X3JlYykKK3sKKwl1bnNpZ25lZCBjaGFyICAgY21kID0gZXZlbnRfcmVjWzFdOworCXVuc2lnbmVkIGludCAgICBwYXJtID0gKigodW5zaWduZWQgaW50ICopICZldmVudF9yZWNbNF0pOworCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIExPQ0xfU1RBUlRBVURJTzoKKwkJCURNQWJ1Zl9zdGFydF9kZXZpY2VzKHBhcm0pOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDo7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXFfc3lzZXhfbWVzc2FnZSh1bnNpZ25lZCBjaGFyICpldmVudF9yZWMpCit7CisJaW50IGRldiA9IGV2ZW50X3JlY1sxXTsKKwlpbnQgaSwgbCA9IDA7CisJdW5zaWduZWQgY2hhciAgKmJ1ZiA9ICZldmVudF9yZWNbMl07CisKKwlpZiAoKGludCkgZGV2ID4gbWF4X3N5bnRoZGV2KQorCQlyZXR1cm47CisJaWYgKCEoc3ludGhfb3Blbl9tYXNrICYgKDEgPDwgZGV2KSkpCisJCXJldHVybjsKKwlpZiAoIXN5bnRoX2RldnNbZGV2XSkKKwkJcmV0dXJuOworCisJbCA9IDA7CisJZm9yIChpID0gMDsgaSA8IDYgJiYgYnVmW2ldICE9IDB4ZmY7IGkrKykKKwkJbCA9IGkgKyAxOworCisJaWYgKCFzeW50aF9kZXZzW2Rldl0tPnNlbmRfc3lzZXgpCisJCXJldHVybjsKKwlpZiAobCA+IDApCisJCXN5bnRoX2RldnNbZGV2XS0+c2VuZF9zeXNleChkZXYsIGJ1ZiwgbCk7Cit9CisKK3N0YXRpYyBpbnQgcGxheV9ldmVudCh1bnNpZ25lZCBjaGFyICpxKQoreworCS8qCisJICogTk9URSEgVGhpcyByb3V0aW5lIHJldHVybnMKKwkgKiAgIDAgPSBub3JtYWwgZXZlbnQgcGxheWVkLgorCSAqICAgMSA9IFRpbWVyIGFybWVkLiBTdXNwZW5kIHBsYXliYWNrIHVudGlsIHRpbWVyIGNhbGxiYWNrLgorCSAqICAgMiA9IE1JREkgb3V0cHV0IGJ1ZmZlciBmdWxsLiBSZXN0b3JlIHF1ZXVlIGFuZCBzdXNwZW5kIHVudGlsIHRpbWVyCisJICovCisJdW5zaWduZWQgaW50ICpkZWxheTsKKworCXN3aXRjaCAocVswXSkKKwl7CisJCWNhc2UgU0VRX05PVEVPRkY6CisJCQlpZiAoc3ludGhfb3Blbl9tYXNrICYgKDEgPDwgMCkpCisJCQkJaWYgKHN5bnRoX2RldnNbMF0pCisJCQkJCXN5bnRoX2RldnNbMF0tPmtpbGxfbm90ZSgwLCBxWzFdLCAyNTUsIHFbM10pOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfTk9URU9OOgorCQkJaWYgKHFbNF0gPCAxMjggfHwgcVs0XSA9PSAyNTUpCisJCQkJaWYgKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IDApKQorCQkJCQlpZiAoc3ludGhfZGV2c1swXSkKKwkJCQkJCXN5bnRoX2RldnNbMF0tPnN0YXJ0X25vdGUoMCwgcVsxXSwgcVsyXSwgcVszXSk7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9XQUlUOgorCQkJZGVsYXkgPSAodW5zaWduZWQgaW50ICopIHE7CS8qCisJCQkJCQkJICogQnl0ZXMgMSB0byAzIGFyZSBjb250YWluaW5nIHRoZSAqCisJCQkJCQkJICogZGVsYXkgaW4gJ3RpY2tzJworCQkJCQkJCSAqLworCQkJKmRlbGF5ID0gKCpkZWxheSA+PiA4KSAmIDB4ZmZmZmZmOworCisJCQlpZiAoKmRlbGF5ID4gMCkKKwkJCXsKKwkJCQlsb25nIHRpbWU7CisKKwkJCQlzZXFfcGxheWluZyA9IDE7CisJCQkJdGltZSA9ICpkZWxheTsKKwkJCQlwcmV2X2V2ZW50X3RpbWUgPSB0aW1lOworCisJCQkJcmVxdWVzdF9zb3VuZF90aW1lcih0aW1lKTsKKworCQkJCWlmICgoU0VRX01BWF9RVUVVRSAtIHFsZW4pID49IG91dHB1dF90aHJlc2hvbGQpCisJCQkJCXdha2VfdXAoJnNlcV9zbGVlcGVyKTsKKwkJCQkvKgorCQkJCSAqIFRoZSB0aW1lciBpcyBub3cgYWN0aXZlIGFuZCB3aWxsIHJlaW52b2tlIHRoaXMgZnVuY3Rpb24KKwkJCQkgKiBhZnRlciB0aGUgdGltZXIgZXhwaXJlcy4gUmV0dXJuIHRvIHRoZSBjYWxsZXIgbm93LgorCQkJCSAqLworCQkJCXJldHVybiAxOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfUEdNQ0hBTkdFOgorCQkJaWYgKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IDApKQorCQkJCWlmIChzeW50aF9kZXZzWzBdKQorCQkJCQlzeW50aF9kZXZzWzBdLT5zZXRfaW5zdHIoMCwgcVsxXSwgcVsyXSk7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9TWU5DVElNRVI6IAkvKgorCQkJCQkgKiBSZXNldCB0aW1lcgorCQkJCQkgKi8KKwkJCXNlcV90aW1lID0gamlmZmllczsKKwkJCXByZXZfaW5wdXRfdGltZSA9IDA7CisJCQlwcmV2X2V2ZW50X3RpbWUgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfTUlESVBVVEM6CS8qCisJCQkJCSAqIFB1dCBhIG1pZGkgY2hhcmFjdGVyCisJCQkJCSAqLworCQkJaWYgKG1pZGlfb3BlbmVkW3FbMl1dKQorCQkJeworCQkJCWludCBkZXY7CisKKwkJCQlkZXYgPSBxWzJdOworCisJCQkJaWYgKGRldiA8IDAgfHwgZGV2ID49IG51bV9taWRpcyB8fCBtaWRpX2RldnNbZGV2XSA9PSBOVUxMKQorCQkJCQlicmVhazsKKworCQkJCWlmICghbWlkaV9kZXZzW2Rldl0tPm91dHB1dGMoZGV2LCBxWzFdKSkKKwkJCQl7CisJCQkJCS8qCisJCQkJCSAqIE91dHB1dCBGSUZPIGlzIGZ1bGwuIFdhaXQgb25lIHRpbWVyIGN5Y2xlIGFuZCB0cnkgYWdhaW4uCisJCQkJCSAqLworCisJCQkJCXNlcV9wbGF5aW5nID0gMTsKKwkJCQkJcmVxdWVzdF9zb3VuZF90aW1lcigtMSk7CisJCQkJCXJldHVybiAyOworCQkJCX0KKwkJCQllbHNlCisJCQkJCW1pZGlfd3JpdHRlbltkZXZdID0gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0VDSE86CisJCQlzZXFfY29weV90b19pbnB1dChxLCA0KTsJLyoKKwkJCQkJCQkgKiBFY2hvIGJhY2sgdG8gdGhlIHByb2Nlc3MKKwkJCQkJCQkgKi8KKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX1BSSVZBVEU6CisJCQlpZiAoKGludCkgcVsxXSA8IG1heF9zeW50aGRldikKKwkJCQlzeW50aF9kZXZzW3FbMV1dLT5od19jb250cm9sKHFbMV0sIHEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfRVhURU5ERUQ6CisJCQlleHRlbmRlZF9ldmVudChxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVZfQ0hOX1ZPSUNFOgorCQkJc2VxX2Nobl92b2ljZV9ldmVudChxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgRVZfQ0hOX0NPTU1PTjoKKwkJCXNlcV9jaG5fY29tbW9uX2V2ZW50KHEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFVl9USU1JTkc6CisJCQlpZiAoc2VxX3RpbWluZ19ldmVudChxKSA9PSBUSU1FUl9BUk1FRCkKKwkJCXsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgRVZfU0VRX0xPQ0FMOgorCQkJc2VxX2xvY2FsX2V2ZW50KHEpOworCQkJYnJlYWs7CisKKwkJY2FzZSBFVl9TWVNFWDoKKwkJCXNlcV9zeXNleF9tZXNzYWdlKHEpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDo7CisJfQorCXJldHVybiAwOworfQorCisvKiBjYWxsZWQgYWxzbyBhcyB0aW1lciBpbiBpcnEgY29udGV4dCAqLworc3RhdGljIHZvaWQgc2VxX3N0YXJ0cGxheSh2b2lkKQoreworCWludCB0aGlzX29uZSwgYWN0aW9uOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl3aGlsZSAocWxlbiA+IDApCisJeworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwkJcWhlYWQgPSAoKHRoaXNfb25lID0gcWhlYWQpICsgMSkgJSBTRVFfTUFYX1FVRVVFOworCQlxbGVuLS07CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCisJCXNlcV9wbGF5aW5nID0gMTsKKworCQlpZiAoKGFjdGlvbiA9IHBsYXlfZXZlbnQoJnF1ZXVlW3RoaXNfb25lICogRVZfU1pdKSkpCisJCXsJCS8qIFN1c3BlbmQgcGxheWJhY2suIE5leHQgdGltZXIgcm91dGluZSBpbnZva2VzIHRoaXMgcm91dGluZSBhZ2FpbiAqLworCQkJaWYgKGFjdGlvbiA9PSAyKQorCQkJeworCQkJCXFsZW4rKzsKKwkJCQlxaGVhZCA9IHRoaXNfb25lOworCQkJfQorCQkJcmV0dXJuOworCQl9CisJfQorCisJc2VxX3BsYXlpbmcgPSAwOworCisJaWYgKChTRVFfTUFYX1FVRVVFIC0gcWxlbikgPj0gb3V0cHV0X3RocmVzaG9sZCkKKwkJd2FrZV91cCgmc2VxX3NsZWVwZXIpOworfQorCitzdGF0aWMgdm9pZCByZXNldF9jb250cm9sbGVycyhpbnQgZGV2LCB1bnNpZ25lZCBjaGFyICpjb250cm9sbGVyLCBpbnQgdXBkYXRlX2RldikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpKyspCisJCWNvbnRyb2xsZXJbaV0gPSBjdHJsX2RlZl92YWx1ZXNbaV07Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX21vZGUyKHZvaWQpCit7CisJaW50IGRldjsKKworCW1heF9zeW50aGRldiA9IG51bV9zeW50aHM7CisKKwlmb3IgKGRldiA9IDA7IGRldiA8IG51bV9taWRpczsgZGV2KyspCisJeworCQlpZiAobWlkaV9kZXZzW2Rldl0gJiYgbWlkaV9kZXZzW2Rldl0tPmNvbnZlcnRlciAhPSBOVUxMKQorCQl7CisJCQlzeW50aF9kZXZzW21heF9zeW50aGRldisrXSA9IG1pZGlfZGV2c1tkZXZdLT5jb252ZXJ0ZXI7CisJCX0KKwl9CisKKwlmb3IgKGRldiA9IDA7IGRldiA8IG1heF9zeW50aGRldjsgZGV2KyspCisJeworCQlpbnQgY2huOworCisJCXN5bnRoX2RldnNbZGV2XS0+c3lzZXhfcHRyID0gMDsKKwkJc3ludGhfZGV2c1tkZXZdLT5lbXVsYXRpb24gPSAwOworCisJCWZvciAoY2huID0gMDsgY2huIDwgMTY7IGNobisrKQorCQl7CisJCQlzeW50aF9kZXZzW2Rldl0tPmNobl9pbmZvW2Nobl0ucGdtX251bSA9IDA7CisJCQlyZXNldF9jb250cm9sbGVycyhkZXYsCisJCQkJc3ludGhfZGV2c1tkZXZdLT5jaG5faW5mb1tjaG5dLmNvbnRyb2xsZXJzLDApOworCQkJc3ludGhfZGV2c1tkZXZdLT5jaG5faW5mb1tjaG5dLmJlbmRlcl92YWx1ZSA9ICgxIDw8IDcpOwkvKiBOZXV0cmFsICovCisJCQlzeW50aF9kZXZzW2Rldl0tPmNobl9pbmZvW2Nobl0uYmVuZGVyX3JhbmdlID0gMjAwOworCQl9CisJfQorCW1heF9taWRpZGV2ID0gMDsKKwlzZXFfbW9kZSA9IFNFUV8yOworfQorCitpbnQgc2VxdWVuY2VyX29wZW4oaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IHJldHZhbCwgbW9kZSwgaTsKKwlpbnQgbGV2ZWwsIHRtcDsKKworCWlmICghc2VxdWVuY2VyX29rKQorCQlzZXF1ZW5jZXJfaW5pdCgpOworCisJbGV2ZWwgPSAoKGRldiAmIDB4MGYpID09IFNORF9ERVZfU0VRMikgPyAyIDogMTsKKworCWRldiA9IGRldiA+PiA0OworCW1vZGUgPSB0cmFuc2xhdGVfbW9kZShmaWxlKTsKKworCURFQihwcmludGsoInNlcXVlbmNlcl9vcGVuKGRldj0lZClcbiIsIGRldikpOworCisJaWYgKCFzZXF1ZW5jZXJfb2spCisJeworLyoJCXByaW50aygiU291bmQgY2FyZDogc2VxdWVuY2VyIG5vdCBpbml0aWFsaXplZFxuIik7Ki8KKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisJaWYgKGRldikJCS8qIFBhdGNoIG1hbmFnZXIgZGV2aWNlIChvYnNvbGV0ZSkgKi8KKwkJcmV0dXJuIC1FTlhJTzsKKworCWlmKHN5bnRoX2RldnNbZGV2XSA9PSBOVUxMKQorCQlyZXF1ZXN0X21vZHVsZSgic3ludGgwIik7CisKKwlpZiAobW9kZSA9PSBPUEVOX1JFQUQpCisJeworCQlpZiAoIW51bV9taWRpcykKKwkJeworCQkJLypwcmludGsoIlNlcXVlbmNlcjogTm8gTUlESSBkZXZpY2VzLiBJbnB1dCBub3QgcG9zc2libGVcbiIpOyovCisJCQlzZXF1ZW5jZXJfYnVzeSA9IDA7CisJCQlyZXR1cm4gLUVOWElPOworCQl9CisJfQorCWlmIChzZXF1ZW5jZXJfYnVzeSkKKwl7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXNlcXVlbmNlcl9idXN5ID0gMTsKKwlvYnNvbGV0ZV9hcGlfdXNlZCA9IDA7CisKKwltYXhfbWlkaWRldiA9IG51bV9taWRpczsKKwltYXhfc3ludGhkZXYgPSBudW1fc3ludGhzOworCXByZV9ldmVudF90aW1lb3V0ID0gTUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJc2VxX21vZGUgPSBTRVFfMTsKKworCWlmIChwZW5kaW5nX3RpbWVyICE9IC0xKQorCXsKKwkJdG1yX25vID0gcGVuZGluZ190aW1lcjsKKwkJcGVuZGluZ190aW1lciA9IC0xOworCX0KKwlpZiAodG1yX25vID09IC0xKQkvKiBOb3Qgc2VsZWN0ZWQgeWV0ICovCisJeworCQlpbnQgaSwgYmVzdDsKKworCQliZXN0ID0gLTE7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fc291bmRfdGltZXJzOyBpKyspCisJCQlpZiAoc291bmRfdGltZXJfZGV2c1tpXSAmJiBzb3VuZF90aW1lcl9kZXZzW2ldLT5wcmlvcml0eSA+IGJlc3QpCisJCQl7CisJCQkJdG1yX25vID0gaTsKKwkJCQliZXN0ID0gc291bmRfdGltZXJfZGV2c1tpXS0+cHJpb3JpdHk7CisJCQl9CisJCWlmICh0bXJfbm8gPT0gLTEpCS8qIFNob3VsZCBub3QgYmUgKi8KKwkJCXRtcl9ubyA9IDA7CisJfQorCXRtciA9IHNvdW5kX3RpbWVyX2RldnNbdG1yX25vXTsKKworCWlmIChsZXZlbCA9PSAyKQorCXsKKwkJaWYgKHRtciA9PSBOVUxMKQorCQl7CisJCQkvKnByaW50aygic2VxdWVuY2VyOiBObyB0aW1lciBmb3IgbGV2ZWwgMlxuIik7Ki8KKwkJCXNlcXVlbmNlcl9idXN5ID0gMDsKKwkJCXJldHVybiAtRU5YSU87CisJCX0KKwkJc2V0dXBfbW9kZTIoKTsKKwl9CisJaWYgKCFtYXhfc3ludGhkZXYgJiYgIW1heF9taWRpZGV2KQorCXsKKwkJc2VxdWVuY2VyX2J1c3k9MDsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlzeW50aF9vcGVuX21hc2sgPSAwOworCisJZm9yIChpID0gMDsgaSA8IG1heF9taWRpZGV2OyBpKyspCisJeworCQltaWRpX29wZW5lZFtpXSA9IDA7CisJCW1pZGlfd3JpdHRlbltpXSA9IDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1heF9zeW50aGRldjsgaSsrKQorCXsKKwkJaWYgKHN5bnRoX2RldnNbaV09PU5VTEwpCisJCQljb250aW51ZTsKKworCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KHN5bnRoX2RldnNbaV0tPm93bmVyKSkKKwkJCWNvbnRpbnVlOworCisJCWlmICgodG1wID0gc3ludGhfZGV2c1tpXS0+b3BlbihpLCBtb2RlKSkgPCAwKQorCQl7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJTZXF1ZW5jZXI6IFdhcm5pbmchIENhbm5vdCBvcGVuIHN5bnRoIGRldmljZSAjJWQgKCVkKVxuIiwgaSwgdG1wKTsKKwkJCWlmIChzeW50aF9kZXZzW2ldLT5taWRpX2RldikKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICIoTWFwcyB0byBNSURJIGRldiAjJWQpXG4iLCBzeW50aF9kZXZzW2ldLT5taWRpX2Rldik7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzeW50aF9vcGVuX21hc2sgfD0gKDEgPDwgaSk7CisJCQlpZiAoc3ludGhfZGV2c1tpXS0+bWlkaV9kZXYpCisJCQkJbWlkaV9vcGVuZWRbc3ludGhfZGV2c1tpXS0+bWlkaV9kZXZdID0gMTsKKwkJfQorCX0KKworCXNlcV90aW1lID0gamlmZmllczsKKworCXByZXZfaW5wdXRfdGltZSA9IDA7CisJcHJldl9ldmVudF90aW1lID0gMDsKKworCWlmIChzZXFfbW9kZSA9PSBTRVFfMSAmJiAobW9kZSA9PSBPUEVOX1JFQUQgfHwgbW9kZSA9PSBPUEVOX1JFQURXUklURSkpCisJeworCQkvKgorCQkgKiBJbml0aWFsaXplIG1pZGkgaW5wdXQgZGV2aWNlcworCQkgKi8KKworCQlmb3IgKGkgPSAwOyBpIDwgbWF4X21pZGlkZXY7IGkrKykKKwkJCWlmICghbWlkaV9vcGVuZWRbaV0gJiYgbWlkaV9kZXZzW2ldKQorCQkJeworCQkJCWlmICghdHJ5X21vZHVsZV9nZXQobWlkaV9kZXZzW2ldLT5vd25lcikpCisJCQkJCWNvbnRpbnVlOworCQorCQkJCWlmICgocmV0dmFsID0gbWlkaV9kZXZzW2ldLT5vcGVuKGksIG1vZGUsCisJCQkJCXNlcXVlbmNlcl9taWRpX2lucHV0LCBzZXF1ZW5jZXJfbWlkaV9vdXRwdXQpKSA+PSAwKQorCQkJCXsKKwkJCQkJbWlkaV9vcGVuZWRbaV0gPSAxOworCQkJCX0KKwkJCX0KKwl9CisKKwlpZiAoc2VxX21vZGUgPT0gU0VRXzIpIHsKKwkJaWYgKHRyeV9tb2R1bGVfZ2V0KHRtci0+b3duZXIpKQorCQkJdG1yLT5vcGVuKHRtcl9ubywgc2VxX21vZGUpOworCX0KKworIAlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzZXFfc2xlZXBlcik7CisgCWluaXRfd2FpdHF1ZXVlX2hlYWQoJm1pZGlfc2xlZXBlcik7CisJb3V0cHV0X3RocmVzaG9sZCA9IFNFUV9NQVhfUVVFVUUgLyAyOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNlcV9kcmFpbl9taWRpX3F1ZXVlcyh2b2lkKQoreworCWludCBpLCBuOworCisJLyoKKwkgKiBHaXZlIHRoZSBNaWRpIGRyaXZlcnMgdGltZSB0byBkcmFpbiB0aGVpciBvdXRwdXQgcXVldWVzCisJICovCisKKwluID0gMTsKKworCXdoaWxlICghc2lnbmFsX3BlbmRpbmcoY3VycmVudCkgJiYgbikKKwl7CisJCW4gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBtYXhfbWlkaWRldjsgaSsrKQorCQkJaWYgKG1pZGlfb3BlbmVkW2ldICYmIG1pZGlfd3JpdHRlbltpXSkKKwkJCQlpZiAobWlkaV9kZXZzW2ldLT5idWZmZXJfc3RhdHVzICE9IE5VTEwpCisJCQkJCWlmIChtaWRpX2RldnNbaV0tPmJ1ZmZlcl9zdGF0dXMoaSkpCisJCQkJCQluKys7CisKKwkJLyoKKwkJICogTGV0J3MgaGF2ZSBhIGRlbGF5CisJCSAqLworCisgCQlpZiAobikKKyAJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJnNlcV9zbGVlcGVyLAorCQkJCQkJICAgICAgIEhaLzEwKTsKKwl9Cit9CisKK3ZvaWQgc2VxdWVuY2VyX3JlbGVhc2UoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGk7CisJaW50IG1vZGUgPSB0cmFuc2xhdGVfbW9kZShmaWxlKTsKKworCWRldiA9IGRldiA+PiA0OworCisJREVCKHByaW50aygic2VxdWVuY2VyX3JlbGVhc2UoZGV2PSVkKVxuIiwgZGV2KSk7CisKKwkvKgorCSAqIFdhaXQgdW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5IChpZiB3ZSBkb24ndCBoYXZlIG5vbmJsb2NrKQorCSAqLworCisJaWYgKG1vZGUgIT0gT1BFTl9SRUFEICYmICEoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spKQorCXsKKwkJd2hpbGUgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSAmJiBxbGVuID4gMCkKKwkJeworICAJCQlzZXFfc3luYygpOworIAkJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmc2VxX3NsZWVwZXIsCisJCQkJCQkgICAgICAgMypIWik7CisgCQkJLyogRXh0cmEgZGVsYXkgKi8KKwkJfQorCX0KKworCWlmIChtb2RlICE9IE9QRU5fUkVBRCkKKwkJc2VxX2RyYWluX21pZGlfcXVldWVzKCk7CS8qCisJCQkJCQkgKiBFbnN1cmUgdGhlIG91dHB1dCBxdWV1ZXMgYXJlIGVtcHR5CisJCQkJCQkgKi8KKwlzZXFfcmVzZXQoKTsKKwlpZiAobW9kZSAhPSBPUEVOX1JFQUQpCisJCXNlcV9kcmFpbl9taWRpX3F1ZXVlcygpOwkvKgorCQkJCQkJICogRmx1c2ggdGhlIGFsbCBub3RlcyBvZmYgbWVzc2FnZXMKKwkJCQkJCSAqLworCisJZm9yIChpID0gMDsgaSA8IG1heF9zeW50aGRldjsgaSsrKQorCXsKKwkJaWYgKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IGkpKQkvKgorCQkJCQkJICogQWN0dWFsbHkgb3BlbmVkCisJCQkJCQkgKi8KKwkJCWlmIChzeW50aF9kZXZzW2ldKQorCQkJeworCQkJCXN5bnRoX2RldnNbaV0tPmNsb3NlKGkpOworCisJCQkJbW9kdWxlX3B1dChzeW50aF9kZXZzW2ldLT5vd25lcik7CisKKwkJCQlpZiAoc3ludGhfZGV2c1tpXS0+bWlkaV9kZXYpCisJCQkJCW1pZGlfb3BlbmVkW3N5bnRoX2RldnNbaV0tPm1pZGlfZGV2XSA9IDA7CisJCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IG1heF9taWRpZGV2OyBpKyspCisJeworCQlpZiAobWlkaV9vcGVuZWRbaV0pIHsKKwkJCW1pZGlfZGV2c1tpXS0+Y2xvc2UoaSk7CisJCQltb2R1bGVfcHV0KG1pZGlfZGV2c1tpXS0+b3duZXIpOworCQl9CisJfQorCisJaWYgKHNlcV9tb2RlID09IFNFUV8yKSB7CisJCXRtci0+Y2xvc2UodG1yX25vKTsKKwkJbW9kdWxlX3B1dCh0bXItPm93bmVyKTsKKwl9CisKKwlpZiAob2Jzb2xldGVfYXBpX3VzZWQpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIi9kZXYvbXVzaWM6IE9ic29sZXRlICg0IGJ5dGUpIEFQSSB3YXMgdXNlZCBieSAlc1xuIiwgY3VycmVudC0+Y29tbSk7CisJc2VxdWVuY2VyX2J1c3kgPSAwOworfQorCitzdGF0aWMgaW50IHNlcV9zeW5jKHZvaWQpCit7CisJaWYgKHFsZW4gJiYgIXNlcV9wbGF5aW5nICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJc2VxX3N0YXJ0cGxheSgpOworCisgCWlmIChxbGVuID4gMCkKKyAJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmc2VxX3NsZWVwZXIsIEhaKTsKKwlyZXR1cm4gcWxlbjsKK30KKworc3RhdGljIHZvaWQgbWlkaV9vdXRjKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwkvKgorCSAqIE5PVEUhIENhbGxzIHNsZWVwKCkuIERvbid0IGNhbGwgdGhpcyBmcm9tIGludGVycnVwdC4KKwkgKi8KKworCWludCBuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBzZW5kcyBvbmUgYnl0ZSB0byB0aGUgTWlkaSBjaGFubmVsLgorCSAqIElmIHRoZSBvdXRwdXQgRklGTyBpcyBmdWxsLCBpdCB3YWl0cyB1bnRpbCB0aGVyZQorCSAqIGlzIHNwYWNlIGluIHRoZSBxdWV1ZQorCSAqLworCisJbiA9IDMgKiBIWjsJCS8qIFRpbWVvdXQgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKyAJd2hpbGUgKG4gJiYgIW1pZGlfZGV2c1tkZXZdLT5vdXRwdXRjKGRldiwgZGF0YSkpIHsKKyAJCWludGVycnVwdGlibGVfc2xlZXBfb25fdGltZW91dCgmc2VxX3NsZWVwZXIsIEhaLzI1KTsKKyAgCQluLS07CisgIAl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcV9yZXNldCh2b2lkKQoreworCS8qCisJICogTk9URSEgQ2FsbHMgc2xlZXAoKS4gRG9uJ3QgY2FsbCB0aGlzIGZyb20gaW50ZXJydXB0LgorCSAqLworCisJaW50IGk7CisJaW50IGNobjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc291bmRfc3RvcF90aW1lcigpOworCisJc2VxX3RpbWUgPSBqaWZmaWVzOworCXByZXZfaW5wdXRfdGltZSA9IDA7CisJcHJldl9ldmVudF90aW1lID0gMDsKKworCXFsZW4gPSBxaGVhZCA9IHF0YWlsID0gMDsKKwlpcWxlbiA9IGlxaGVhZCA9IGlxdGFpbCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4X3N5bnRoZGV2OyBpKyspCisJCWlmIChzeW50aF9vcGVuX21hc2sgJiAoMSA8PCBpKSkKKwkJCWlmIChzeW50aF9kZXZzW2ldKQorCQkJCXN5bnRoX2RldnNbaV0tPnJlc2V0KGkpOworCisJaWYgKHNlcV9tb2RlID09IFNFUV8yKQorCXsKKwkJZm9yIChjaG4gPSAwOyBjaG4gPCAxNjsgY2huKyspCisJCQlmb3IgKGkgPSAwOyBpIDwgbWF4X3N5bnRoZGV2OyBpKyspCisJCQkJaWYgKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IGkpKQorCQkJCQlpZiAoc3ludGhfZGV2c1tpXSkKKwkJCQkJeworCQkJCQkJc3ludGhfZGV2c1tpXS0+Y29udHJvbGxlcihpLCBjaG4sIDEyMywgMCk7CS8qIEFsbCBub3RlcyBvZmYgKi8KKwkJCQkJCXN5bnRoX2RldnNbaV0tPmNvbnRyb2xsZXIoaSwgY2huLCAxMjEsIDApOwkvKiBSZXNldCBhbGwgY3RsICovCisJCQkJCQlzeW50aF9kZXZzW2ldLT5iZW5kZXIoaSwgY2huLCAxIDw8IDEzKTsJLyogQmVuZGVyIG9mZiAqLworCQkJCQl9CisJfQorCWVsc2UJLyogc2VxX21vZGUgPT0gU0VRXzEgKi8KKwl7CisJCWZvciAoaSA9IDA7IGkgPCBtYXhfbWlkaWRldjsgaSsrKQorCQkJaWYgKG1pZGlfd3JpdHRlbltpXSkJLyoKKwkJCQkJCSAqIE1pZGkgdXNlZC4gU29tZSBub3RlcyBtYXkgc3RpbGwgYmUgcGxheWluZworCQkJCQkJICovCisJCQl7CisJCQkJLyoKKwkJCQkgKiAgICAgIFNlbmRpbmcganVzdCBhIEFDVElWRSBTRU5TSU5HIG1lc3NhZ2Ugc2hvdWxkIGJlIGVub3VnaCB0byBzdG9wIGFsbAorCQkJCSAqICAgICAgcGxheWluZyBub3Rlcy4gU2luY2UgdGhlcmUgYXJlIGRldmljZXMgbm90IHJlY29nbml6aW5nIHRoZQorCQkJCSAqICAgICAgYWN0aXZlIHNlbnNpbmcsIHdlIGhhdmUgdG8gc2VuZCBzb21lIGFsbCBub3RlcyBvZmYgbWVzc2FnZXMgYWxzby4KKwkJCQkgKi8KKwkJCQltaWRpX291dGMoaSwgMHhmZSk7CisKKwkJCQlmb3IgKGNobiA9IDA7IGNobiA8IDE2OyBjaG4rKykKKwkJCQl7CisJCQkJCW1pZGlfb3V0YyhpLCAodW5zaWduZWQgY2hhcikgKDB4YjAgKyAoY2huICYgMHgwZikpKTsJCS8qIGNvbnRyb2wgY2hhbmdlICovCisJCQkJCW1pZGlfb3V0YyhpLCAweDdiKTsJLyogQWxsIG5vdGVzIG9mZiAqLworCQkJCQltaWRpX291dGMoaSwgMCk7CS8qIER1bW15IHBhcmFtZXRlciAqLworCQkJCX0KKworCQkJCW1pZGlfZGV2c1tpXS0+Y2xvc2UoaSk7CisKKwkJCQltaWRpX3dyaXR0ZW5baV0gPSAwOworCQkJCW1pZGlfb3BlbmVkW2ldID0gMDsKKwkJCX0KKwl9CisKKwlzZXFfcGxheWluZyA9IDA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisKKwlpZiAod2FpdHF1ZXVlX2FjdGl2ZSgmc2VxX3NsZWVwZXIpKSB7CisJCS8qICAgICAgcHJpbnRrKCAiU2VxdWVuY2VyIFdhcm5pbmc6IFVuZXhwZWN0ZWQgc2xlZXBpbmcgcHJvY2VzcyAtIFdha2luZyB1cFxuIik7ICovCisJCXdha2VfdXAoJnNlcV9zbGVlcGVyKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNlcV9wYW5pYyh2b2lkKQoreworCS8qCisJICogVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgYXBwbGljYXRpb24gaW4gY2FzZSB0aGUgdXNlcgorCSAqIHdhbnRzIHRvIHJlc2V0IHRoZSBzeXN0ZW0gdG8gdGhlIGRlZmF1bHQgc3RhdGUuCisJICovCisKKwlzZXFfcmVzZXQoKTsKKworCS8qCisJICogU2luY2Ugc29tZSBvZiB0aGUgZGV2aWNlcyBkb24ndCByZWNvZ25pemUgdGhlIGFjdGl2ZSBzZW5zaW5nIGFuZAorCSAqIGFsbCBub3RlcyBvZmYgbWVzc2FnZXMsIHdlIGhhdmUgdG8gc2h1dCBhbGwgbm90ZXMgbWFudWFsbHkuCisJICoKKwkgKiAgICAgIFRPIEJFIElNUExFTUVOVEVEIExBVEVSCisJICovCisKKwkvKgorCSAqIEFsc28gcmV0dXJuIHRoZSBjb250cm9sbGVycyB0byB0aGVpciBkZWZhdWx0IHN0YXRlcworCSAqLworfQorCitpbnQgc2VxdWVuY2VyX2lvY3RsKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWludCBtaWRpX2Rldiwgb3JpZ19kZXYsIHZhbCwgZXJyOworCWludCBtb2RlID0gdHJhbnNsYXRlX21vZGUoZmlsZSk7CisJc3RydWN0IHN5bnRoX2luZm8gaW5mOworCXN0cnVjdCBzZXFfZXZlbnRfcmVjIGV2ZW50X3JlYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBfX3VzZXIgKnAgPSBhcmc7CisKKwlvcmlnX2RldiA9IGRldiA9IGRldiA+PiA0OworCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIFNORENUTF9UTVJfVElNRUJBU0U6CisJCWNhc2UgU05EQ1RMX1RNUl9URU1QTzoKKwkJY2FzZSBTTkRDVExfVE1SX1NUQVJUOgorCQljYXNlIFNORENUTF9UTVJfU1RPUDoKKwkJY2FzZSBTTkRDVExfVE1SX0NPTlRJTlVFOgorCQljYXNlIFNORENUTF9UTVJfTUVUUk9OT01FOgorCQljYXNlIFNORENUTF9UTVJfU09VUkNFOgorCQkJaWYgKHNlcV9tb2RlICE9IFNFUV8yKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJcmV0dXJuIHRtci0+aW9jdGwodG1yX25vLCBjbWQsIGFyZyk7CisKKwkJY2FzZSBTTkRDVExfVE1SX1NFTEVDVDoKKwkJCWlmIChzZXFfbW9kZSAhPSBTRVFfMikKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChnZXRfdXNlcihwZW5kaW5nX3RpbWVyLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChwZW5kaW5nX3RpbWVyIDwgMCB8fCBwZW5kaW5nX3RpbWVyID49IG51bV9zb3VuZF90aW1lcnMgfHwgc291bmRfdGltZXJfZGV2c1twZW5kaW5nX3RpbWVyXSA9PSBOVUxMKQorCQkJeworCQkJCXBlbmRpbmdfdGltZXIgPSAtMTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCXZhbCA9IHBlbmRpbmdfdGltZXI7CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9TRVFfUEFOSUM6CisJCQlzZXFfcGFuaWMoKTsKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWNhc2UgU05EQ1RMX1NFUV9TWU5DOgorCQkJaWYgKG1vZGUgPT0gT1BFTl9SRUFEKQorCQkJCXJldHVybiAwOworCQkJd2hpbGUgKHFsZW4gPiAwICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlzZXFfc3luYygpOworCQkJcmV0dXJuIHFsZW4gPyAtRUlOVFIgOiAwOworCisJCWNhc2UgU05EQ1RMX1NFUV9SRVNFVDoKKwkJCXNlcV9yZXNldCgpOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfU0VRX1RFU1RNSURJOgorCQkJaWYgKF9fZ2V0X3VzZXIobWlkaV9kZXYsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKG1pZGlfZGV2IDwgMCB8fCBtaWRpX2RldiA+PSBtYXhfbWlkaWRldiB8fCAhbWlkaV9kZXZzW21pZGlfZGV2XSkKKwkJCQlyZXR1cm4gLUVOWElPOworCisJCQlpZiAoIW1pZGlfb3BlbmVkW21pZGlfZGV2XSAmJgorCQkJCShlcnIgPSBtaWRpX2RldnNbbWlkaV9kZXZdLT5vcGVuKG1pZGlfZGV2LCBtb2RlLCBzZXF1ZW5jZXJfbWlkaV9pbnB1dCwKKwkJCQkJCSAgICAgc2VxdWVuY2VyX21pZGlfb3V0cHV0KSkgPCAwKQorCQkJCXJldHVybiBlcnI7CisJCQltaWRpX29wZW5lZFttaWRpX2Rldl0gPSAxOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfU0VRX0dFVElOQ09VTlQ6CisJCQlpZiAobW9kZSA9PSBPUEVOX1dSSVRFKQorCQkJCXJldHVybiAwOworCQkJdmFsID0gaXFsZW47CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9TRVFfR0VUT1VUQ09VTlQ6CisJCQlpZiAobW9kZSA9PSBPUEVOX1JFQUQpCisJCQkJcmV0dXJuIDA7CisJCQl2YWwgPSBTRVFfTUFYX1FVRVVFIC0gcWxlbjsKKwkJCWJyZWFrOworCisJCWNhc2UgU05EQ1RMX1NFUV9HRVRUSU1FOgorCQkJaWYgKHNlcV9tb2RlID09IFNFUV8yKQorCQkJCXJldHVybiB0bXItPmlvY3RsKHRtcl9ubywgY21kLCBhcmcpOworCQkJdmFsID0gamlmZmllcyAtIHNlcV90aW1lOworCQkJYnJlYWs7CisKKwkJY2FzZSBTTkRDVExfU0VRX0NUUkxSQVRFOgorCQkJLyoKKwkJCSAqIElmICphcmcgPT0gMCwganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgcmF0ZQorCQkJICovCisJCQlpZiAoc2VxX21vZGUgPT0gU0VRXzIpCisJCQkJcmV0dXJuIHRtci0+aW9jdGwodG1yX25vLCBjbWQsIGFyZyk7CisKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHZhbCAhPSAwKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJdmFsID0gSFo7CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9TRVFfUkVTRVRTQU1QTEVTOgorCQljYXNlIFNORENUTF9TWU5USF9SRU1PVkVTQU1QTEU6CisJCWNhc2UgU05EQ1RMX1NZTlRIX0NPTlRST0w6CisJCQlpZiAoZ2V0X3VzZXIoZGV2LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChkZXYgPCAwIHx8IGRldiA+PSBudW1fc3ludGhzIHx8IHN5bnRoX2RldnNbZGV2XSA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5YSU87CisJCQlpZiAoIShzeW50aF9vcGVuX21hc2sgJiAoMSA8PCBkZXYpKSAmJiAhb3JpZ19kZXYpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCXJldHVybiBzeW50aF9kZXZzW2Rldl0tPmlvY3RsKGRldiwgY21kLCBhcmcpOworCisJCWNhc2UgU05EQ1RMX1NFUV9OUlNZTlRIUzoKKwkJCXZhbCA9IG1heF9zeW50aGRldjsKKwkJCWJyZWFrOworCisJCWNhc2UgU05EQ1RMX1NFUV9OUk1JRElTOgorCQkJdmFsID0gbWF4X21pZGlkZXY7CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9TWU5USF9NRU1BVkw6CisJCQlpZiAoZ2V0X3VzZXIoZGV2LCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChkZXYgPCAwIHx8IGRldiA+PSBudW1fc3ludGhzIHx8IHN5bnRoX2RldnNbZGV2XSA9PSBOVUxMKQorCQkJCXJldHVybiAtRU5YSU87CisJCQlpZiAoIShzeW50aF9vcGVuX21hc2sgJiAoMSA8PCBkZXYpKSAmJiAhb3JpZ19kZXYpCisJCQkJcmV0dXJuIC1FQlVTWTsKKwkJCXZhbCA9IHN5bnRoX2RldnNbZGV2XS0+aW9jdGwoZGV2LCBjbWQsIGFyZyk7CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9GTV80T1BfRU5BQkxFOgorCQkJaWYgKGdldF91c2VyKGRldiwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX3N5bnRocyB8fCBzeW50aF9kZXZzW2Rldl0gPT0gTlVMTCkKKwkJCQlyZXR1cm4gLUVOWElPOworCQkJaWYgKCEoc3ludGhfb3Blbl9tYXNrICYgKDEgPDwgZGV2KSkpCisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCXN5bnRoX2RldnNbZGV2XS0+aW9jdGwoZGV2LCBjbWQsIGFyZyk7CisJCQlyZXR1cm4gMDsKKworCQljYXNlIFNORENUTF9TWU5USF9JTkZPOgorCQkJaWYgKGdldF91c2VyKGRldiwgJigoc3RydWN0IHN5bnRoX2luZm8gX191c2VyICopYXJnKS0+ZGV2aWNlKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChkZXYgPCAwIHx8IGRldiA+PSBtYXhfc3ludGhkZXYpCisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCWlmICghKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IGRldikpICYmICFvcmlnX2RldikKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJcmV0dXJuIHN5bnRoX2RldnNbZGV2XS0+aW9jdGwoZGV2LCBjbWQsIGFyZyk7CisKKwkJLyogTGlrZSBTWU5USF9JTkZPIGJ1dCByZXR1cm5zIElEIGluIHRoZSBuYW1lIGZpZWxkICovCisJCWNhc2UgU05EQ1RMX1NZTlRIX0lEOgorCQkJaWYgKGdldF91c2VyKGRldiwgJigoc3RydWN0IHN5bnRoX2luZm8gX191c2VyICopYXJnKS0+ZGV2aWNlKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChkZXYgPCAwIHx8IGRldiA+PSBtYXhfc3ludGhkZXYpCisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCWlmICghKHN5bnRoX29wZW5fbWFzayAmICgxIDw8IGRldikpICYmICFvcmlnX2RldikKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJbWVtY3B5KCZpbmYsIHN5bnRoX2RldnNbZGV2XS0+aW5mbywgc2l6ZW9mKGluZikpOworCQkJc3RybGNweShpbmYubmFtZSwgc3ludGhfZGV2c1tkZXZdLT5pZCwgc2l6ZW9mKGluZi5uYW1lKSk7CisJCQlpbmYuZGV2aWNlID0gZGV2OworCQkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmcsICZpbmYsIHNpemVvZihpbmYpKT8tRUZBVUxUOjA7CisKKwkJY2FzZSBTTkRDVExfU0VRX09VVE9GQkFORDoKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmZXZlbnRfcmVjLCBhcmcsIHNpemVvZihldmVudF9yZWMpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwkJCXBsYXlfZXZlbnQoZXZlbnRfcmVjLmFycik7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX01JRElfSU5GTzoKKwkJCWlmIChnZXRfdXNlcihkZXYsICYoKHN0cnVjdCBtaWRpX2luZm8gX191c2VyICopYXJnKS0+ZGV2aWNlKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChkZXYgPCAwIHx8IGRldiA+PSBtYXhfbWlkaWRldiB8fCAhbWlkaV9kZXZzW2Rldl0pCisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCW1pZGlfZGV2c1tkZXZdLT5pbmZvLmRldmljZSA9IGRldjsKKwkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJnLCAmbWlkaV9kZXZzW2Rldl0tPmluZm8sIHNpemVvZihzdHJ1Y3QgbWlkaV9pbmZvKSk/LUVGQVVMVDowOworCisJCWNhc2UgU05EQ1RMX1NFUV9USFJFU0hPTEQ6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh2YWwgPCAxKQorCQkJCXZhbCA9IDE7CisJCQlpZiAodmFsID49IFNFUV9NQVhfUVVFVUUpCisJCQkJdmFsID0gU0VRX01BWF9RVUVVRSAtIDE7CisJCQlvdXRwdXRfdGhyZXNob2xkID0gdmFsOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfTUlESV9QUkVUSU1FOgorCQkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlpZiAodmFsIDwgMCkKKwkJCQl2YWwgPSAwOworCQkJdmFsID0gKEhaICogdmFsKSAvIDEwOworCQkJcHJlX2V2ZW50X3RpbWVvdXQgPSB2YWw7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaWYgKG1vZGUgPT0gT1BFTl9SRUFEKQorCQkJCXJldHVybiAtRUlPOworCQkJaWYgKCFzeW50aF9kZXZzWzBdKQorCQkJCXJldHVybiAtRU5YSU87CisJCQlpZiAoIShzeW50aF9vcGVuX21hc2sgJiAoMSA8PCAwKSkpCisJCQkJcmV0dXJuIC1FTlhJTzsKKwkJCWlmICghc3ludGhfZGV2c1swXS0+aW9jdGwpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gc3ludGhfZGV2c1swXS0+aW9jdGwoMCwgY21kLCBhcmcpOworCX0KKwlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSdyZSB1c2luZyB0aGUgZ2xvYmFsIGlycSBsb2NrIGhlcmUgKi8KK3Vuc2lnbmVkIGludCBzZXF1ZW5jZXJfcG9sbChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqIHdhaXQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlkZXYgPSBkZXYgPj4gNDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwkvKiBpbnB1dCAqLworCXBvbGxfd2FpdChmaWxlLCAmbWlkaV9zbGVlcGVyLCB3YWl0KTsKKwlpZiAoaXFsZW4pCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKworCS8qIG91dHB1dCAqLworCXBvbGxfd2FpdChmaWxlLCAmc2VxX3NsZWVwZXIsIHdhaXQpOworCWlmICgoU0VRX01BWF9RVUVVRSAtIHFsZW4pID49IG91dHB1dF90aHJlc2hvbGQpCisJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKKwordm9pZCBzZXF1ZW5jZXJfdGltZXIodW5zaWduZWQgbG9uZyBkdW1teSkKK3sKKwlzZXFfc3RhcnRwbGF5KCk7Cit9CisKK2ludCBub3RlX3RvX2ZyZXEoaW50IG5vdGVfbnVtKQoreworCisJLyoKKwkgKiBUaGlzIHJvdXRpbmUgY29udmVydHMgYSBtaWRpIG5vdGUgdG8gYSBmcmVxdWVuY3kgKG11bHRpcGxpZWQgYnkgMTAwMCkKKwkgKi8KKworCWludCBub3RlLCBvY3RhdmUsIG5vdGVfZnJlcTsKKwlzdGF0aWMgaW50IG5vdGVzW10gPQorCXsKKwkJMjYxNjMyLCAyNzcxODksIDI5MzY3MSwgMzExMTMyLCAzMjk2MzIsIDM0OTIzMiwKKwkJMzY5OTk4LCAzOTE5OTgsIDQxNTMwNiwgNDQwMDAwLCA0NjYxNjIsIDQ5Mzg4MAorCX07CisKKyNkZWZpbmUgQkFTRV9PQ1RBVkUJNQorCisJb2N0YXZlID0gbm90ZV9udW0gLyAxMjsKKwlub3RlID0gbm90ZV9udW0gJSAxMjsKKworCW5vdGVfZnJlcSA9IG5vdGVzW25vdGVdOworCisJaWYgKG9jdGF2ZSA8IEJBU0VfT0NUQVZFKQorCQlub3RlX2ZyZXEgPj49IChCQVNFX09DVEFWRSAtIG9jdGF2ZSk7CisJZWxzZSBpZiAob2N0YXZlID4gQkFTRV9PQ1RBVkUpCisJCW5vdGVfZnJlcSA8PD0gKG9jdGF2ZSAtIEJBU0VfT0NUQVZFKTsKKworCS8qCisJICogbm90ZV9mcmVxID4+PSAxOworCSAqLworCisJcmV0dXJuIG5vdGVfZnJlcTsKK30KKwordW5zaWduZWQgbG9uZyBjb21wdXRlX2ZpbmV0dW5lKHVuc2lnbmVkIGxvbmcgYmFzZV9mcmVxLCBpbnQgYmVuZCwgaW50IHJhbmdlLAorCQkgaW50IHZpYnJhdG9fY2VudHMpCit7CisJdW5zaWduZWQgbG9uZyBhbW91bnQ7CisJaW50IG5lZ2F0aXZlLCBzZW1pdG9uZXMsIGNlbnRzLCBtdWx0aXBsaWVyID0gMTsKKworCWlmICghYmVuZCkKKwkJcmV0dXJuIGJhc2VfZnJlcTsKKwlpZiAoIXJhbmdlKQorCQlyZXR1cm4gYmFzZV9mcmVxOworCisJaWYgKCFiYXNlX2ZyZXEpCisJCXJldHVybiBiYXNlX2ZyZXE7CisKKwlpZiAocmFuZ2UgPj0gODE5MikKKwkJcmFuZ2UgPSA4MTkyOworCisJYmVuZCA9IGJlbmQgKiByYW5nZSAvIDgxOTI7CS8qIENvbnZlcnQgdG8gY2VudHMgKi8KKwliZW5kICs9IHZpYnJhdG9fY2VudHM7CisKKwlpZiAoIWJlbmQpCisJCXJldHVybiBiYXNlX2ZyZXE7CisKKwluZWdhdGl2ZSA9IGJlbmQgPCAwID8gMSA6IDA7CisKKwlpZiAoYmVuZCA8IDApCisJCWJlbmQgKj0gLTE7CisJaWYgKGJlbmQgPiByYW5nZSkKKwkJYmVuZCA9IHJhbmdlOworCisJLyoKKwkgICBpZiAoYmVuZCA+IDIzOTkpCisJICAgYmVuZCA9IDIzOTk7CisJICovCisJd2hpbGUgKGJlbmQgPiAyMzk5KQorCXsKKwkJbXVsdGlwbGllciAqPSA0OworCQliZW5kIC09IDI0MDA7CisJfQorCisJc2VtaXRvbmVzID0gYmVuZCAvIDEwMDsKKwlpZiAoc2VtaXRvbmVzID4gOTkpCisJCXNlbWl0b25lcyA9IDk5OworCWNlbnRzID0gYmVuZCAlIDEwMDsKKworCWFtb3VudCA9IChpbnQpIChzZW1pdG9uZV90dW5pbmdbc2VtaXRvbmVzXSAqIG11bHRpcGxpZXIgKiBjZW50X3R1bmluZ1tjZW50c10pIC8gMTAwMDA7CisKKwlpZiAobmVnYXRpdmUpCisJCXJldHVybiAoYmFzZV9mcmVxICogMTAwMDApIC8gYW1vdW50OwkvKiBCZW5kIGRvd24gKi8KKwllbHNlCisJCXJldHVybiAoYmFzZV9mcmVxICogYW1vdW50KSAvIDEwMDAwOwkvKiBCZW5kIHVwICovCit9CisKKwordm9pZCBzZXF1ZW5jZXJfaW5pdCh2b2lkKQoreworCS8qIGRyYWcgaW4gc2VxdWVuY2VyX3N5bXMubyAqLworCXsKKwkJZXh0ZXJuIGNoYXIgc2VxdWVuY2VyX3N5bXNfc3ltYm9sOworCQlzZXF1ZW5jZXJfc3ltc19zeW1ib2wgPSAwOworCX0KKworCWlmIChzZXF1ZW5jZXJfb2spCisJCXJldHVybjsKKwlNSURJYnVmX2luaXQoKTsKKwlxdWV1ZSA9ICh1bnNpZ25lZCBjaGFyICopdm1hbGxvYyhTRVFfTUFYX1FVRVVFICogRVZfU1opOworCWlmIChxdWV1ZSA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJzZXF1ZW5jZXI6IENhbid0IGFsbG9jYXRlIG1lbW9yeSBmb3Igc2VxdWVuY2VyIG91dHB1dCBxdWV1ZVxuIik7CisJCXJldHVybjsKKwl9CisJaXF1ZXVlID0gKHVuc2lnbmVkIGNoYXIgKil2bWFsbG9jKFNFUV9NQVhfUVVFVUUgKiBJRVZfU1opOworCWlmIChpcXVldWUgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAic2VxdWVuY2VyOiBDYW4ndCBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNlcXVlbmNlciBpbnB1dCBxdWV1ZVxuIik7CisJCXZmcmVlKHF1ZXVlKTsKKwkJcmV0dXJuOworCX0KKwlzZXF1ZW5jZXJfb2sgPSAxOworfQorCit2b2lkIHNlcXVlbmNlcl91bmxvYWQodm9pZCkKK3sKKwlpZihxdWV1ZSkKKwl7CisJCXZmcmVlKHF1ZXVlKTsKKwkJcXVldWU9TlVMTDsKKwl9CisJaWYoaXF1ZXVlKQorCXsKKwkJdmZyZWUoaXF1ZXVlKTsKKwkJaXF1ZXVlPU5VTEw7CisJfQorfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NlcXVlbmNlcl9zeW1zLmMgYi9zb3VuZC9vc3Mvc2VxdWVuY2VyX3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWVkZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NlcXVlbmNlcl9zeW1zLmMKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIEV4cG9ydGVkIHN5bWJvbHMgZm9yIHNlcXVlbmNlciBkcml2ZXIuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCitjaGFyIHNlcXVlbmNlcl9zeW1zX3N5bWJvbDsKKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInNvdW5kX2NhbGxzLmgiCisKK0VYUE9SVF9TWU1CT0wobm90ZV90b19mcmVxKTsKK0VYUE9SVF9TWU1CT0woY29tcHV0ZV9maW5ldHVuZSk7CitFWFBPUlRfU1lNQk9MKHNlcV9jb3B5X3RvX2lucHV0KTsKK0VYUE9SVF9TWU1CT0woc2VxX2lucHV0X2V2ZW50KTsKK0VYUE9SVF9TWU1CT0woc2VxdWVuY2VyX2luaXQpOworRVhQT1JUX1NZTUJPTChzZXF1ZW5jZXJfdGltZXIpOworCitFWFBPUlRfU1lNQk9MKHNvdW5kX3RpbWVyX2luaXQpOworRVhQT1JUX1NZTUJPTChzb3VuZF90aW1lcl9pbnRlcnJ1cHQpOworRVhQT1JUX1NZTUJPTChzb3VuZF90aW1lcl9zeW5jaW50ZXJ2YWwpOworRVhQT1JUX1NZTUJPTChyZXByb2dyYW1fdGltZXIpOworCisvKiBUdW5pbmcgKi8KKworI2RlZmluZSBfU0VRVUVOQ0VSX0NfCisjaW5jbHVkZSAidHVuaW5nLmgiCisKK0VYUE9SVF9TWU1CT0woY2VudF90dW5pbmcpOworRVhQT1JUX1NZTUJPTChzZW1pdG9uZV90dW5pbmcpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NnYWxheHkuYyBiL3NvdW5kL29zcy9zZ2FsYXh5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzMmQ0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2dhbGF4eS5jCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogc291bmQvc2dhbGF4eS5jCisgKgorICogTG93IGxldmVsIGRyaXZlciBmb3IgQXp0ZWNoIFNvdW5kIEdhbGF4eSBjYXJkcy4KKyAqIENvcHlyaWdodCAxOTk4IEFydHVyIFNrYXdpbmEgPHNrYXdpbmFAZ2VvY2l0aWVzLmNvbT4KKyAqCisgKiBTdXBwb3J0ZWQgY2FyZHM6CisgKiAgICBBenRlY2ggU291bmQgR2FsYXh5IFdhdmVyaWRlciBQcm8gMzIgLSAzRAorICogICAgQXp0ZWNoIFNvdW5kIEdhbGF4eSBXYXNoaW5ndG9uIDE2CisgKgorICogQmFzZWQgb24gY3M0MjMyLmMgYnkgSGFubnUgU2F2b2xhaW5lbiBhbmQgQWxhbiBDb3guCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqIENoYW5nZXM6CisgKiAxMS0xMC0yMDAwCUJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogPGJrekBsaW51eC1pZGUub3JnPgorICoJCUFkZGVkIF9faW5pdCB0byBzYl9yc3QoKSBhbmQgc2JfY21kKCkKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAiYWQxODQ4LmgiCisKK3N0YXRpYyB2b2lkIHNsZWVwKCB1bnNpZ25lZCBob3dsb25nICkKK3sKKwljdXJyZW50LT5zdGF0ZSAgID0gVEFTS19JTlRFUlJVUFRJQkxFOworCXNjaGVkdWxlX3RpbWVvdXQoaG93bG9uZyk7Cit9CisKKyNkZWZpbmUgRFBPUlQgMHg4MAorCisvKiBTb3VuZCBCbGFzdGVyIHJlZ3MgKi8KKworI2RlZmluZSBTQkRTUF9SRVNFVCAgICAgIDB4NgorI2RlZmluZSBTQkRTUF9SRUFEICAgICAgIDB4QQorI2RlZmluZSBTQkRTUF9DT01NQU5EICAgIDB4QworI2RlZmluZSBTQkRTUF9TVEFUVVMgICAgIFNCRFNQX0NPTU1BTkQKKyNkZWZpbmUgU0JEU1BfREFUQV9BVkFJTCAweEUKKworc3RhdGljIGludCBfX2luaXQgc2JfcnN0KGludCBiYXNlKQoreworCWludCAgIGk7CisgICAKKwlvdXRiKCAxLCBiYXNlK1NCRFNQX1JFU0VUICk7ICAgICAvKiByZXNldCB0aGUgRFNQICovCisJb3V0YiggMCwgYmFzZStTQkRTUF9SRVNFVCApOworICAgIAorCWZvciAoIGk9MDsgaTw1MDA7IGkrKyApICAgICAgICAgIC8qIGRlbGF5ICovCisJCWluYihEUE9SVCk7CisgICAgICAKKwlmb3IgKCBpPTA7IGk8MTAwMDAwOyBpKysgKQorCXsKKwkJaWYgKCBpbmIoIGJhc2UrU0JEU1BfREFUQV9BVkFJTCApJjB4ODAgKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCBpbmIoIGJhc2UrU0JEU1BfUkVBRCApIT0weEFBICkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgc2JfY21kKCBpbnQgYmFzZSwgdW5zaWduZWQgY2hhciB2YWwgKQoreworCWludCAgaTsKKworCWZvciAoIGk9MTAwMDAwOyBpOyBpLS0gKQorCXsKKwkJaWYgKCAoaW5iKCBiYXNlK1NCRFNQX1NUQVRVUyApJjB4ODApPT0wICkKKwkJeworICAgICAgICAJCW91dGIoIHZhbCwgYmFzZStTQkRTUF9DT01NQU5EICk7CisgICAgICAgIAkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGk7ICAgICAgLyogaT4wID09IHN1Y2Nlc3MgKi8KK30KKworCisjZGVmaW5lIGFpX3NnYmFzZSAgICBkcml2ZXJfdXNlXzEKKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfc2dhbGF4eSggc3RydWN0IGFkZHJlc3NfaW5mbyAqYWkgKQoreworCXN0cnVjdCByZXNvdXJjZSAqcG9ydHM7CisJaW50IG47CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGFpLT5pb19iYXNlLCA0LCAiV1NTIGNvbmZpZyIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2dhbGF4eTogV1NTIElPIHBvcnQgMHglMDN4IG5vdCBhdmFpbGFibGVcbiIsIGFpLT5pb19iYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcG9ydHMgPSByZXF1ZXN0X3JlZ2lvbihhaS0+aW9fYmFzZSArIDQsIDQsICJhZDE4NDgiKTsKKwlpZiAoIXBvcnRzKSB7CisJCXByaW50ayhLRVJOX0VSUiAic2dhbGF4eTogV1NTIElPIHBvcnQgMHglMDN4IG5vdCBhdmFpbGFibGVcbiIsIGFpLT5pb19iYXNlKTsKKwkJcmVsZWFzZV9yZWdpb24oYWktPmlvX2Jhc2UsIDQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKCBhaS0+YWlfc2diYXNlLCAweDEwLCAiU291bmRHYWxheHkgU0IiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInNnYWxheHk6IFNCIElPIHBvcnQgMHglMDN4IG5vdCBhdmFpbGFibGVcbiIsIGFpLT5haV9zZ2Jhc2UpOworCQlyZWxlYXNlX3JlZ2lvbihhaS0+aW9fYmFzZSArIDQsIDQpOworCQlyZWxlYXNlX3JlZ2lvbihhaS0+aW9fYmFzZSwgNCk7CisJCXJldHVybiAwOworCX0KKyAgICAgICAgCisJaWYgKGFkMTg0OF9kZXRlY3QocG9ydHMsIE5VTEwsIGFpLT5vc3ApKQorCQlnb3RvIG91dDsgIC8qIFRoZSBjYXJkIGlzIGFscmVhZHkgYWN0aXZlLCBjaGVjayBpcnEgZXRjLi4uICovCisgICAgICAgIAorCS8qIHN3aXRjaCB0byBNU1MvV1NTIG1vZGUgKi8KKyAgIAorCXNiX3JzdCggYWktPmFpX3NnYmFzZSApOworICAgCisJc2JfY21kKCBhaS0+YWlfc2diYXNlLCA5ICk7CisJc2JfY21kKCBhaS0+YWlfc2diYXNlLCAwICk7CisKKwlzbGVlcCggSFovMTAgKTsKKworb3V0OgorICAgICAgCWlmICghcHJvYmVfbXNfc291bmQoYWksIHBvcnRzKSkgeworCQlyZWxlYXNlX3JlZ2lvbihhaS0+aW9fYmFzZSArIDQsIDQpOworCQlyZWxlYXNlX3JlZ2lvbihhaS0+aW9fYmFzZSwgNCk7CisJCXJlbGVhc2VfcmVnaW9uKGFpLT5haV9zZ2Jhc2UsIDB4MTApOworCQlyZXR1cm4gMDsKKwl9CisKKwlhdHRhY2hfbXNfc291bmQoYWksIHBvcnRzLCBUSElTX01PRFVMRSk7CisJbj1haS0+c2xvdHNbMF07CisJCisJaWYgKG4hPS0xICYmIGF1ZGlvX2RldnNbbl0tPm1peGVyX2RldiAhPSAtMSApIHsKKwkJQUQxODQ4X1JFUk9VVEUoIFNPVU5EX01JWEVSX0xJTkUxLCBTT1VORF9NSVhFUl9MSU5FICk7ICAgLyogTGluZS1pbiAqLworCQlBRDE4NDhfUkVST1VURSggU09VTkRfTUlYRVJfTElORTIsIFNPVU5EX01JWEVSX1NZTlRIICk7ICAvKiBGTStXYXZldGFibGUqLworCQlBRDE4NDhfUkVST1VURSggU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX0NEICk7ICAgICAvKiBDRCAqLworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF9zZ2FsYXh5KCBzdHJ1Y3QgYWRkcmVzc19pbmZvICphaSApCit7CisJdW5sb2FkX21zX3NvdW5kKCBhaSApOworCXJlbGVhc2VfcmVnaW9uKCBhaS0+YWlfc2diYXNlLCAweDEwICk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGlvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hMgk9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIHNnYmFzZQk9IC0xOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNnYmFzZSwgaW50LCAwKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF9zZ2FsYXh5KHZvaWQpCit7CisJY2ZnLmlvX2Jhc2UgICA9IGlvOworCWNmZy5pcnEgICAgICAgPSBpcnE7CisJY2ZnLmRtYSAgICAgICA9IGRtYTsKKwljZmcuZG1hMiAgICAgID0gZG1hMjsKKwljZmcuYWlfc2diYXNlID0gc2diYXNlOworCisJaWYgKGNmZy5pb19iYXNlID09IC0xIHx8IGNmZy5pcnEgPT0gLTEgfHwgY2ZnLmRtYSA9PSAtMSB8fCBjZmcuYWlfc2diYXNlID09IC0xICkgeworCQlwcmludGsoS0VSTl9FUlIgInNnYWxheHk6IGlvLCBpcnEsIGRtYSBhbmQgc2diYXNlIG11c3QgYmUgc2V0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICggcHJvYmVfc2dhbGF4eSgmY2ZnKSA9PSAwICkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfc2dhbGF4eSh2b2lkKQoreworCXVubG9hZF9zZ2FsYXh5KCZjZmcpOworfQorCittb2R1bGVfaW5pdChpbml0X3NnYWxheHkpOworbW9kdWxlX2V4aXQoY2xlYW51cF9zZ2FsYXh5KTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3NnYWxheHkoY2hhciAqc3RyKQoreworCS8qIGlvLCBpcnEsIGRtYSwgZG1hMiwgc2diYXNlICovCisJaW50IGludHNbNl07CisJCisJc3RyID0gZ2V0X29wdGlvbnMoc3RyLCBBUlJBWV9TSVpFKGludHMpLCBpbnRzKTsKKwlpbwk9IGludHNbMV07CisJaXJxCT0gaW50c1syXTsKKwlkbWEJPSBpbnRzWzNdOworCWRtYTIJPSBpbnRzWzRdOworCXNnYmFzZQk9IGludHNbNV07CisKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgic2dhbGF4eT0iLCBzZXR1cF9zZ2FsYXh5KTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NoX2RhY19hdWRpby5jIGIvc291bmQvb3NzL3NoX2RhY19hdWRpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWNkZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc2hfZGFjX2F1ZGlvLmMKQEAgLTAsMCArMSwzMjUgQEAKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vaXJxLmg+CisjaW5jbHVkZSA8YXNtL2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisKKyNpbmNsdWRlIDxhc20vY3B1L2RhYy5oPgorCisjaWZkZWYgTUFDSF9IUDYwMAorI2luY2x1ZGUgPGFzbS9ocDZ4eC9ocDZ4eC5oPgorI2luY2x1ZGUgPGFzbS9oZDY0NDYxL2hkNjQ0NjEuaD4KKyNlbmRpZgorCisjZGVmaW5lIE1PRE5BTUUgInNoX2RhY19hdWRpbyIKKworI2RlZmluZSBUTVVfVE9DUl9JTklUCTB4MDAKKworI2RlZmluZSBUTVUxX1RDUl9JTklUCTB4MDAyMAkvKiBDbG9jay80LCByaXNpbmcgZWRnZTsgaW50ZXJydXB0IG9uICovCisjZGVmaW5lIFRNVTFfVFNUUl9JTklUICAweDAyCS8qIEJpdCB0byB0dXJuIG9uIFRNVTEgKi8KKworI2RlZmluZSBUTVVfVFNUUgkweGZmZmZmZTkyCisjZGVmaW5lIFRNVTFfVENPUgkweGZmZmZmZWEwCisjZGVmaW5lIFRNVTFfVENOVAkweGZmZmZmZWE0CisjZGVmaW5lIFRNVTFfVENSCTB4ZmZmZmZlYTgKKworI2RlZmluZSBCVUZGRVJfU0laRSA0ODAwMAorCitzdGF0aWMgaW50IHJhdGU7CitzdGF0aWMgaW50IGVtcHR5Oworc3RhdGljIGNoYXIgKmRhdGFfYnVmZmVyLCAqYnVmZmVyX2JlZ2luLCAqYnVmZmVyX2VuZDsKK3N0YXRpYyBpbnQgaW5fdXNlLCBkZXZpY2VfbWFqb3I7CisKK3N0YXRpYyB2b2lkIGRhY19hdWRpb19zdGFydF90aW1lcih2b2lkKQoreworCXU4IHRzdHI7CisKKwl0c3RyID0gY3RybF9pbmIoVE1VX1RTVFIpOworCXRzdHIgfD0gVE1VMV9UU1RSX0lOSVQ7CisJY3RybF9vdXRiKHRzdHIsIFRNVV9UU1RSKTsKK30KKworc3RhdGljIHZvaWQgZGFjX2F1ZGlvX3N0b3BfdGltZXIodm9pZCkKK3sKKwl1OCB0c3RyOworCisJdHN0ciA9IGN0cmxfaW5iKFRNVV9UU1RSKTsKKwl0c3RyICY9IH5UTVUxX1RTVFJfSU5JVDsKKwljdHJsX291dGIodHN0ciwgVE1VX1RTVFIpOworfQorCitzdGF0aWMgdm9pZCBkYWNfYXVkaW9fcmVzZXQodm9pZCkKK3sKKwlkYWNfYXVkaW9fc3RvcF90aW1lcigpOworCWJ1ZmZlcl9iZWdpbiA9IGJ1ZmZlcl9lbmQgPSBkYXRhX2J1ZmZlcjsKKwllbXB0eSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGRhY19hdWRpb19zeW5jKHZvaWQpCit7CisJd2hpbGUgKCFlbXB0eSkKKwkJc2NoZWR1bGUoKTsKK30KKworc3RhdGljIHZvaWQgZGFjX2F1ZGlvX3N0YXJ0KHZvaWQpCit7CisjaWZkZWYgTUFDSF9IUDYwMAorCXUxNiB2OworCXYgPSBpbncoSEQ2NDQ2MV9HUEFEUik7CisJdiAmPSB+SEQ2NDQ2MV9HUEFEUl9TUEVBS0VSOworCW91dHcodiwgSEQ2NDQ2MV9HUEFEUik7CisjZW5kaWYKKwlzaF9kYWNfZW5hYmxlKENPTkZJR19TT1VORF9TSF9EQUNfQVVESU9fQ0hBTk5FTCk7CisJY3RybF9vdXR3KFRNVTFfVENSX0lOSVQsIFRNVTFfVENSKTsKK30KK3N0YXRpYyB2b2lkIGRhY19hdWRpb19zdG9wKHZvaWQpCit7CisjaWZkZWYgTUFDSF9IUDYwMAorCXUxNiB2OworI2VuZGlmCisJZGFjX2F1ZGlvX3N0b3BfdGltZXIoKTsKKyNpZmRlZiBNQUNIX0hQNjAwCisJdiA9IGludyhIRDY0NDYxX0dQQURSKTsKKwl2IHw9IEhENjQ0NjFfR1BBRFJfU1BFQUtFUjsKKwlvdXR3KHYsIEhENjQ0NjFfR1BBRFIpOworI2VuZGlmCisJc2hfZGFjX2Rpc2FibGUoQ09ORklHX1NPVU5EX1NIX0RBQ19BVURJT19DSEFOTkVMKTsKK30KKworc3RhdGljIHZvaWQgZGFjX2F1ZGlvX3NldF9yYXRlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBpbnRlcnZhbDsKKworCWludGVydmFsID0gKGN1cnJlbnRfY3B1X2RhdGEubW9kdWxlX2Nsb2NrIC8gNCkgLyByYXRlOworCWN0cmxfb3V0bChpbnRlcnZhbCwgVE1VMV9UQ09SKTsKKwljdHJsX291dGwoaW50ZXJ2YWwsIFRNVTFfVENOVCk7Cit9CisKK3N0YXRpYyBpbnQgZGFjX2F1ZGlvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWRhY19hdWRpb19zeW5jKCk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlkYWNfYXVkaW9fcmVzZXQoKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzoKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfVTgsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfVTgsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfUkFURToKKwkJdmFsID0gKihpbnQgKilhcmc7CisJCWlmICh2YWwgPiAwKSB7CisJCQlyYXRlID0gdmFsOworCQkJZGFjX2F1ZGlvX3NldF9yYXRlKCk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHJhdGUsIChpbnQgKilhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJcmV0dXJuIHB1dF91c2VyKDAsIChpbnQgKilhcmcpOworCisJY2FzZSBTT1VORF9QQ01fV1JJVEVfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcigxLCAoaW50ICopYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTTkRDVExfRFNQX1BST0ZJTEU6CisJCXJldHVybiAtRUlOVkFMOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCXJldHVybiBwdXRfdXNlcihCVUZGRVJfU0laRSwgKGludCAqKWFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJzaF9kYWNfYXVkaW86IHVuaW1wbGVtZW50ZWQgaW9jdGw9MHgleFxuIiwKKwkJICAgICAgIGNtZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHNzaXplX3QgZGFjX2F1ZGlvX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwKKwkJCSAgICAgICBsb2ZmX3QgKiBwcG9zKQoreworCWludCBmcmVlOworCWludCBuYnl0ZXM7CisKKwlpZiAoY291bnQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghY291bnQpIHsKKwkJZGFjX2F1ZGlvX3N5bmMoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZnJlZSA9IGJ1ZmZlcl9iZWdpbiAtIGJ1ZmZlcl9lbmQ7CisKKwlpZiAoZnJlZSA8IDApCisJCWZyZWUgKz0gQlVGRkVSX1NJWkU7CisJaWYgKChmcmVlID09IDApICYmIChlbXB0eSkpCisJCWZyZWUgPSBCVUZGRVJfU0laRTsKKwlpZiAoY291bnQgPiBmcmVlKQorCQljb3VudCA9IGZyZWU7CisJaWYgKGJ1ZmZlcl9iZWdpbiA+IGJ1ZmZlcl9lbmQpIHsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCh2b2lkICopYnVmZmVyX2VuZCwgYnVmLCBjb3VudCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlidWZmZXJfZW5kICs9IGNvdW50OworCX0gZWxzZSB7CisJCW5ieXRlcyA9IGRhdGFfYnVmZmVyICsgQlVGRkVSX1NJWkUgLSBidWZmZXJfZW5kOworCQlpZiAobmJ5dGVzID4gY291bnQpIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKWJ1ZmZlcl9lbmQsIGJ1ZiwgY291bnQpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJYnVmZmVyX2VuZCArPSBjb3VudDsKKwkJfSBlbHNlIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKWJ1ZmZlcl9lbmQsIGJ1ZiwgbmJ5dGVzKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcgorCQkJICAgICgodm9pZCAqKWRhdGFfYnVmZmVyLCBidWYgKyBuYnl0ZXMsIGNvdW50IC0gbmJ5dGVzKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWJ1ZmZlcl9lbmQgPSBkYXRhX2J1ZmZlciArIGNvdW50IC0gbmJ5dGVzOworCQl9CisJfQorCisJaWYgKGVtcHR5KSB7CisJCWVtcHR5ID0gMDsKKwkJZGFjX2F1ZGlvX3N0YXJ0X3RpbWVyKCk7CisJfQorCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgc3NpemVfdCBkYWNfYXVkaW9fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciAqYnVmLCBzaXplX3QgY291bnQsCisJCQkgICAgICBsb2ZmX3QgKiBwcG9zKQoreworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IGRhY19hdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoaW5fdXNlKQorCQlyZXR1cm4gLUVCVVNZOworCisJaW5fdXNlID0gMTsKKworCWRhY19hdWRpb19zdGFydCgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGFjX2F1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJZGFjX2F1ZGlvX3N5bmMoKTsKKwlkYWNfYXVkaW9fc3RvcCgpOworCWluX3VzZSA9IDA7CisKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkYWNfYXVkaW9fZm9wcyA9IHsKKyAgICAgIC5yZWFkID0JCWRhY19hdWRpb19yZWFkLAorICAgICAgLndyaXRlID0JZGFjX2F1ZGlvX3dyaXRlLAorICAgICAgLmlvY3RsID0JZGFjX2F1ZGlvX2lvY3RsLAorICAgICAgLm9wZW4gPQkJZGFjX2F1ZGlvX29wZW4sCisgICAgICAucmVsZWFzZSA9CWRhY19hdWRpb19yZWxlYXNlLAorfTsKKworc3RhdGljIGlycXJldHVybl90IHRpbWVyMV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVyX3N0YXR1czsKKworCXRpbWVyX3N0YXR1cyA9IGN0cmxfaW53KFRNVTFfVENSKTsKKwl0aW1lcl9zdGF0dXMgJj0gfjB4MTAwOworCWN0cmxfb3V0dyh0aW1lcl9zdGF0dXMsIFRNVTFfVENSKTsKKworCWlmICghZW1wdHkpIHsKKwkJc2hfZGFjX291dHB1dCgqYnVmZmVyX2JlZ2luLCBDT05GSUdfU09VTkRfU0hfREFDX0FVRElPX0NIQU5ORUwpOworCQlidWZmZXJfYmVnaW4rKzsKKworCQlpZiAoYnVmZmVyX2JlZ2luID09IGRhdGFfYnVmZmVyICsgQlVGRkVSX1NJWkUpCisJCQlidWZmZXJfYmVnaW4gPSBkYXRhX2J1ZmZlcjsKKwkJaWYgKGJ1ZmZlcl9iZWdpbiA9PSBidWZmZXJfZW5kKSB7CisJCQllbXB0eSA9IDE7CisJCQlkYWNfYXVkaW9fc3RvcF90aW1lcigpOworCQl9CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludCBfX2luaXQgZGFjX2F1ZGlvX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKChkZXZpY2VfbWFqb3IgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJmRhY19hdWRpb19mb3BzLCAtMSkpIDwgMCkgeworCQlwcmludGsoS0VSTl9FUlIgIkNhbm5vdCByZWdpc3RlciBkc3AgZGV2aWNlIik7CisJCXJldHVybiBkZXZpY2VfbWFqb3I7CisJfQorCisJaW5fdXNlID0gMDsKKworCWRhdGFfYnVmZmVyID0gKGNoYXIgKilrbWFsbG9jKEJVRkZFUl9TSVpFLCBHRlBfS0VSTkVMKTsKKwlpZiAoZGF0YV9idWZmZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkYWNfYXVkaW9fcmVzZXQoKTsKKwlyYXRlID0gODAwMDsKKwlkYWNfYXVkaW9fc2V0X3JhdGUoKTsKKworCXJldHZhbCA9CisJICAgIHJlcXVlc3RfaXJxKFRJTUVSMV9JUlEsIHRpbWVyMV9pbnRlcnJ1cHQsIFNBX0lOVEVSUlVQVCwgTU9ETkFNRSwgMCk7CisJaWYgKHJldHZhbCA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzaF9kYWNfYXVkaW86IElSUSAlZCByZXF1ZXN0IGZhaWxlZFxuIiwKKwkJICAgICAgIFRJTUVSMV9JUlEpOworCQlyZXR1cm4gcmV0dmFsOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZGFjX2F1ZGlvX2V4aXQodm9pZCkKK3sKKwlmcmVlX2lycShUSU1FUjFfSVJRLCAwKTsKKworCXVucmVnaXN0ZXJfc291bmRfZHNwKGRldmljZV9tYWpvcik7CisJa2ZyZWUoKHZvaWQgKilkYXRhX2J1ZmZlcik7Cit9CisKK21vZHVsZV9pbml0KGRhY19hdWRpb19pbml0KTsKK21vZHVsZV9leGl0KGRhY19hdWRpb19leGl0KTsKKworTU9EVUxFX0FVVEhPUigiQW5kcml5IFNrdWx5c2gsIGFza3VseXNoQGltYWdlLmtpZXYudWEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiU0ggREFDIHNvdW5kIGRyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NrZWxldG9uLmMgYi9zb3VuZC9vc3Mvc2tlbGV0b24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmVhNzgzCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NrZWxldG9uLmMKQEAgLTAsMCArMSwyMTkgQEAKKy8qCisgKglQQ0kgc291bmQgc2tlbGV0b24gZXhhbXBsZQorICoKKyAqCShjKSAxOTk4IFJlZCBIYXQgU29mdHdhcmUKKyAqCisgKglUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIAorICoJdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IAorICoJcmVmZXJlbmNlLgorICoKKyAqCVRoaXMgZXhhbXBsZSBpcyBkZXNpZ25lZCB0byBiZSBidWlsdCBpbiB0aGUgbGludXgvZHJpdmVycy9zb3VuZAorICoJZGlyZWN0b3J5IGFzIHBhcnQgb2YgYSBrZXJuZWwgYnVpbGQuIFRoZSBleGFtcGxlIGlzIG1vZHVsYXIgb25seQorICoJZHJvcCBtZSBhIG5vdGUgb25jZSB5b3UgaGF2ZSBhIHdvcmtpbmcgbW9kdWxhciBkcml2ZXIgYW5kIHdhbnQKKyAqCXRvIGludGVncmF0ZSBpdCB3aXRoIHRoZSBtYWluIGNvZGUuCisgKgkJLS0gQWxhbiA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqCVRoaXMgaXMgYSBmaXJzdCBkcmFmdC4gUGxlYXNlIHJlcG9ydCBhbnkgZXJyb3JzLCBjb3JyZWN0aW9ucyBvcgorICoJaW1wcm92ZW1lbnRzIHRvIG1lLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKworI2luY2x1ZGUgPGFzbS9pby5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKy8qCisgKglEZWZpbmUgb3VyIFBDSSB2ZW5kb3IgSUQgaGVyZQorICovCisgCisjaWZuZGVmIFBDSV9WRU5ET1JfTVlJREVOVAorI2RlZmluZSBQQ0lfVkVORE9SX01ZSURFTlQJCQkweDEyNUQKKworLyoKKyAqCVBDSSBpZGVudGl0eSBmb3IgdGhlIGNhcmQuCisgKi8KKyAKKyNkZWZpbmUgUENJX0RFVklDRV9JRF9NWUlERU5UX01ZQ0FSRDEJCTB4MTk2OQorI2VuZGlmCisKKyNkZWZpbmUgQ0FSRF9OQU1FCSJFeGFtcGxlV2F2ZSAzRCBQcm8gVWx0cmEgVGhpbmd5V290c2l0IgorCisjZGVmaW5lIE1BWF9DQVJEUwk4CisKKy8qCisgKglFYWNoIGFkZHJlc3NfaW5mbyBvYmplY3QgaG9sZHMgdGhlIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvZgorICoJb3VyIGNhcmQgcmVzb3VyY2VzLiBJbiB0aGlzIGNhc2UgdGhlIE1TUyBlbXVsYXRpb24gb2Ygb3VyCisgKglmaWN0aWNpb3VzIGNhcmQuIEl0cyB1c2VkIHRvIG1hbmFnZSBhbmQgYXR0YWNoIHRoaW5ncy4KKyAqLworIAorc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8JbXNzX2RhdGFbTUFYX0NBUkRTXTsKK3N0YXRpYyBpbnQgCQkJY2FyZHM7CisKKy8qCisgKglJbnN0YWxsIHRoZSBhY3R1YWwgY2FyZC4gVGhpcyBpcyBhbiBleGFtcGxlCisgKi8KKworc3RhdGljIGludCBteWNhcmRfaW5zdGFsbChzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCWludCBpb2Jhc2U7CisJaW50IG1zc2Jhc2U7CisJaW50IG1wdWJhc2U7CisJdTggeDsKKwl1MTYgdzsKKwl1MzIgdjsKKwlpbnQgaTsKKwlpbnQgZG1hOworCisJLyoKKwkgKglPdXIgaW1hZ2luYXJ5IGNvZGUgaGFzIGl0cyBJL08gb24gUENJIGFkZHJlc3MgMCwgYQorCSAqCU1TUyBvbiBQQ0kgYWRkcmVzcyAxIGFuZCBhbiBNUFUgb24gYWRkcmVzcyAyCisJICoKKwkgKglGb3IgdGhlIGV4YW1wbGUgd2Ugd2lsbCBvbmx5IGluaXRpYWxpc2UgdGhlIE1TUworCSAqLworCSAJCisJaW9iYXNlID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgMCk7CisJbXNzYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDEpOworCW1wdWJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAyKTsKKwkKKwkvKgorCSAqCVJlc2V0IHRoZSBib2FyZAorCSAqLworCSAKKwkvKgorCSAqCVdhaXQgZm9yIGNvbXBsZXRpb24uIHVkZWxheSgpIHdhaXRzIGluIG1pY3Jvc2Vjb25kcworCSAqLworCSAKKwl1ZGVsYXkoMTAwKTsKKwkKKwkvKgorCSAqCU9rIGNhcmQgcmVhZHkuIEJlZ2luIHNldHVwIHByb3Blci4gWW91IG1pZ2h0IGZvciBleGFtcGxlCisJICoJbG9hZCB0aGUgZmlybXdhcmUgaGVyZQorCSAqLworCQorCWRtYSA9IGNhcmRfc3BlY2lmaWNfbWFnaWMoaW9hZGRyKTsKKwkKKwkvKgorCSAqCVR1cm4gb24gbGVnYWN5IG1vZGUgKGV4YW1wbGUpLCBUaGVyZSBhcmUgYWxzbyBieXRlIGFuZAorCSAqCWR3b3JkICgzMmJpdCkgUENJIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb24gY2FsbHMKKwkgKi8KKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBjaWRldiwgMHg0MCwgJncpOworCXcmPX4oMTw8MTUpOwkJCS8qIGxlZ2FjeSBkZWNvZGUgb24gKi8KKwl3fD0oMTw8MTQpOwkJCS8qIFJlc2VydmVkIHdyaXRlIGFzIDEgaW4gdGhpcyBjYXNlICovCisJd3w9KDE8PDMpfCgxPDwxKXwoMTw8MCk7CS8qIFNCIG9uICwgRk0gb24sIE1QVSBvbiAqLworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIDB4NDAsIHcpOworCQorCS8qCisJICoJTGV0IHRoZSB1c2VyIGtub3cgd2UgZm91bmQgaGlzIHRveS4KKwkgKi8KKwkgCisJcHJpbnRrKEtFUk5fSU5GTyAiUHJvZ3JhbW1lZCAiQ0FSRF9OQU1FIiBhdCAweCVYIHRvIGxlZ2FjeSBtb2RlLlxuIiwKKwkJaW9iYXNlKTsKKwkJCisJLyoKKwkgKglOb3cgc2V0IGl0IHVwIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgY2FyZAorCSAqLworCSAKKwltc3NfZGF0YVtjYXJkc10uaW9fYmFzZSA9IG1zc2Jhc2U7CisJbXNzX2RhdGFbY2FyZHNdLmlycSA9IHBjaWRldi0+aXJxOworCW1zc19kYXRhW2NhcmRzXS5kbWEgPSBkbWE7CisJCisJLyoKKwkgKglDaGVjayB0aGVyZSBpcyBhbiBNU1MgcHJlc2VudAorCSAqLworCisJaWYoYWQxODQ4X2RldGVjdChtc3NiYXNlLCBOVUxMLCBtc3NfZGF0YVtjYXJkc10ub3NwKT09MCkKKwkJcmV0dXJuIDA7CisJCQorCS8qCisJICoJSW5pdGlhbGl6ZSBpdAorCSAqLworCSAKKwltc3NfZGF0YVtjYXJkc10uc2xvdHNbM10gPSBhZDE4NDhfaW5pdCgiTXlDYXJkIE1TUyAxNmJpdCIsIAorCQkJbXNzYmFzZSwKKwkJCW1zc19kYXRhW2NhcmRzXS5pcnEsCisJCQltc3NfZGF0YVtjYXJkc10uZG1hLAorCQkJbXNzX2RhdGFbY2FyZHNdLmRtYSwKKwkJCTAsCisJCQkwLAorCQkJVEhJU19NT0RVTEUpOworCisJY2FyZHMrKzsJCisJcmV0dXJuIDE7Cit9CisKKworLyoKKyAqIAlUaGlzIGxvb3Agd2Fsa3MgdGhlIFBDSSBjb25maWd1cmF0aW9uIGRhdGFiYXNlIGFuZCBmaW5kcyB3aGVyZQorICoJdGhlIHNvdW5kIGNhcmRzIGFyZS4KKyAqLworIAoraW50IGluaXRfbXljYXJkKHZvaWQpCit7CisJc3RydWN0IHBjaV9kZXYgKnBjaWRldj1OVUxMOworCWludCBjb3VudD0wOworCQkKKwl3aGlsZSgocGNpZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfTVlJREVOVCwgUENJX0RFVklDRV9JRF9NWUlERU5UX01ZQ0FSRDEsIHBjaWRldikpIT1OVUxMKQorCXsKKwkJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBjaWRldikpCisJCQljb250aW51ZTsKKwkJY291bnQrPW15Y2FyZF9pbnN0YWxsKHBjaWRldik7CisJCWlmKGNvdW50KQorCQkJcmV0dXJuIDA7CisJCWlmKGNvdW50PT1NQVhfQ0FSRFMpCisJCQlicmVhazsKKwl9CisJCisJaWYoY291bnQ9PTApCisJCXJldHVybiAtRU5PREVWOworCXJldHVybiAwOworfQorCisvKgorICoJVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdXNlciBvciBrZXJuZWwgbG9hZHMgdGhlIAorICoJbW9kdWxlIGludG8gbWVtb3J5LgorICovCisKKworaW50IGluaXRfbW9kdWxlKHZvaWQpCit7CisJaWYoaW5pdF9teWNhcmQoKTwwKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJObyAiQ0FSRF9OQU1FIiBjYXJkcyBmb3VuZC5cbiIpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqCVRoaXMgaXMgY2FsbGVkIHdoZW4gaXQgaXMgcmVtb3ZlZC4gSXQgd2lsbCBvbmx5IGJlIHJlbW92ZWQgCisgKgl3aGVuIGl0cyB1c2UgY291bnQgaXMgMC4KKyAqLworIAordm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQoreworCWZvcihpPTA7aTwgY2FyZHM7IGkrKykKKwl7CisJCS8qCisJCSAqCUZyZWUgYXR0YWNoZWQgcmVzb3VyY2VzCisJCSAqLworCQkgCisJCWFkMTg0OF91bmxvYWQobXNzX2RhdGFbaV0uaW9fYmFzZSwKKwkJCSAgICAgIG1zc19kYXRhW2ldLmlycSwKKwkJCSAgICAgIG1zc19kYXRhW2ldLmRtYSwKKwkJCSAgICAgIG1zc19kYXRhW2ldLmRtYSwKKwkJCSAgICAgIDApOworCQkvKgorCQkgKglBbmQgZGlzY29ubmVjdCB0aGUgZGV2aWNlIGZyb20gdGhlIGtlcm5lbAorCQkgKi8KKwkJc291bmRfdW5sb2FkX2F1ZGlvZGV2aWNlKG1zc19kYXRhW2ldLnNsb3RzWzNdKTsKKwl9Cit9CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zb25pY3ZpYmVzLmMgYi9zb3VuZC9vc3Mvc29uaWN2aWJlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxZDY5NjEKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc29uaWN2aWJlcy5jCkBAIC0wLDAgKzEsMjc5MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogICAgICBzb25pY3ZpYmVzLmMgIC0tICBTMyBTb25pYyBWaWJlcyBhdWRpbyBkcml2ZXIuCisgKgorICogICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwMSwgMjAwMyAgVGhvbWFzIFNhaWxlciAodC5zYWlsZXJAYWx1bW5pLmV0aHouY2gpCisgKgorICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqIFNwZWNpYWwgdGhhbmtzIHRvIERhdmlkIEMuIE5pZW1pCisgKgorICoKKyAqIE1vZHVsZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyczoKKyAqICAgbm9uZSBzbyBmYXIKKyAqCisgKgorICogIFN1cHBvcnRlZCBkZXZpY2VzOgorICogIC9kZXYvZHNwICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21peGVyICBzdGFuZGFyZCAvZGV2L21peGVyIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyAqICAvZGV2L21pZGkgICBzaW1wbGUgTUlESSBVQVJUIGludGVyZmFjZSwgbm8gaW9jdGwKKyAqCisgKiAgVGhlIGNhcmQgaGFzIGJvdGggYW4gRk0gYW5kIGEgV2F2ZXRhYmxlIHN5bnRoLCBidXQgSSBoYXZlIHRvIGZpZ3VyZQorICogIG91dCBmaXJzdCBob3cgdG8gZHJpdmUgdGhlbS4uLgorICoKKyAqICBSZXZpc2lvbiBoaXN0b3J5CisgKiAgICAwNi4wNS4xOTk4ICAgMC4xICAgSW5pdGlhbCByZWxlYXNlCisgKiAgICAxMC4wNS4xOTk4ICAgMC4yICAgRml4ZWQgbWFueSBidWdzLCBlc3AuIEFEQyByYXRlIGNhbGN1bGF0aW9uCisgKiAgICAgICAgICAgICAgICAgICAgICAgRmlyc3Qgc3RhYiBhdCBhIHNpbXBsZSBtaWRpIGludGVyZmFjZSAobm8gYmVsbHMmd2hpc3RsZXMpCisgKiAgICAxMy4wNS4xOTk4ICAgMC4zICAgRml4IHN0dXBpZCBjdXQmcGFzdGUgZXJyb3I6IHNldF9hZGNfcmF0ZSB3YXMgY2FsbGVkIGluc3RlYWQgb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICBzZXRfZGFjX3JhdGUgaW4gdGhlIEZNT0RFX1dSSVRFIGNhc2UgaW4gc3Zfb3BlbgorICogICAgICAgICAgICAgICAgICAgICAgIEZpeCBod3B0ciBvdXQgb2YgYm91bmRzIChub3cgbXBnMTIzIHdvcmtzKQorICogICAgMTQuMDUuMTk5OCAgIDAuNCAgIERvbid0IGFsbG93IGV4Y2Vzc2l2ZSBpbnRlcnJ1cHQgcmF0ZXMKKyAqICAgIDA4LjA2LjE5OTggICAwLjUgICBGaXJzdCByZWxlYXNlIHVzaW5nIEFsYW4gQ294JyBzb3VuZGNvcmUgaW5zdGVhZCBvZiBtaXNjZGV2aWNlCisgKiAgICAwMy4wOC4xOTk4ICAgMC42ICAgRG8gbm90IGluY2x1ZGUgbW9kdmVyc2lvbnMuaAorICogICAgICAgICAgICAgICAgICAgICAgIE5vdyBtaXhlciBiZWhhdmlvdXIgY2FuIGJhc2ljYWxseSBiZSBzZWxlY3RlZCBiZXR3ZWVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgIk9TUyBkb2N1bWVudGVkIiBhbmQgIk9TUyBhY3R1YWwiIGJlaGF2aW91cgorICogICAgMzEuMDguMTk5OCAgIDAuNyAgIEZpeCByZWFscGxheWVyIHByb2JsZW1zIC0gZGFjLmNvdW50IGlzc3VlcworICogICAgMTAuMTIuMTk5OCAgIDAuOCAgIEZpeCBkcmFpbl9kYWMgdHJ5aW5nIHRvIHdhaXQgb24gbm90IHlldCBpbml0aWFsaXplZCBETUEKKyAqICAgIDE2LjEyLjE5OTggICAwLjkgICBGaXggYSBmZXcgZl9maWxlICYgRk1PREVfIGJ1Z3MKKyAqICAgIDA2LjAxLjE5OTkgICAwLjEwICByZW1vdmUgdGhlIHNpbGx5IFNBX0lOVEVSUlVQVCBmbGFnLgorICogICAgICAgICAgICAgICAgICAgICAgIGhvcGVmdWxseSBraWxsZWQgdGhlIGVnY3Mgc2VjdGlvbiB0eXBlIGNvbmZsaWN0CisgKiAgICAxMi4wMy4xOTk5ICAgMC4xMSAgY2luZm8uYmxvY2tzIHNob3VsZCBiZSByZXNldCBhZnRlciBHRVR4UFRSIGlvY3RsLgorICogICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEpvaGFuIE1hZXMgPGpvbWFAdGVsaW5kdXMuYmU+CisgKiAgICAyMi4wMy4xOTk5ICAgMC4xMiAgcmV0dXJuIEVBR0FJTiBpbnN0ZWFkIG9mIEVCVVNZIHdoZW4gT19OT05CTE9DSworICogICAgICAgICAgICAgICAgICAgICAgIHJlYWQvd3JpdGUgY2Fubm90IGJlIGV4ZWN1dGVkCisgKiAgICAwNS4wNC4xOTk5ICAgMC4xMyAgYWRkZWQgY29kZSB0byBzdl9yZWFkIGFuZCBzdl93cml0ZSB3aGljaCBzaG91bGQgZGV0ZWN0CisgKiAgICAgICAgICAgICAgICAgICAgICAgbG9ja3VwcyBvZiB0aGUgc291bmQgY2hpcCBhbmQgcmV2aXZlIGl0LiBUaGlzIGlzIGJhc2ljYWxseQorICogICAgICAgICAgICAgICAgICAgICAgIGFuIHVnbHkgaGFjaywgYnV0IGF0IGxlYXN0IGFwcGxpY2F0aW9ucyB1c2luZyB0aGlzIGRyaXZlcgorICogICAgICAgICAgICAgICAgICAgICAgIHdvbid0IGhhbmcgZm9yZXZlci4gSSBkb24ndCBrbm93IHdoeSB0aGVzZSBsb2NrdXBzIGhhcHBlbiwKKyAqICAgICAgICAgICAgICAgICAgICAgICBpdCBtaWdodCB3ZWxsIGJlIHRoZSBtb3RoZXJib2FyZCBjaGlwc2V0IChhbiBlYXJseSA0ODYgUENJCisgKiAgICAgICAgICAgICAgICAgICAgICAgYm9hcmQgd2l0aCBBTEkgY2hpcHNldCksIHNpbmNlIGV2ZXJ5IGJ1c21hc3RlcmluZyAxMDBNQgorICogICAgICAgICAgICAgICAgICAgICAgIGV0aGVybmV0IGNhcmQgSSd2ZSB0cmllZCAoUmVhbHRlayA4MTM5IGFuZCBNYWNyb25peCB0dWxpcCBjbG9uZSkKKyAqICAgICAgICAgICAgICAgICAgICAgICBleGhpYml0IHNpbWlsYXIgYmVoYXZpb3VyICh0aGV5IHdvcmsgZm9yIGEgY291cGxlIG9mIHBhY2tldHMKKyAqICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBsb2NrIHVwIGFuZCBjYW4gYmUgcmV2aXZlZCBieSBpZmNvbmZpZyBkb3duL3VwKS4KKyAqICAgIDA3LjA0LjE5OTkgICAwLjE0ICBpbXBsZW1lbnRlZCB0aGUgZm9sbG93aW5nIGlvY3RsJ3M6IFNPVU5EX1BDTV9SRUFEX1JBVEUsIAorICogICAgICAgICAgICAgICAgICAgICAgIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTLCBTT1VORF9QQ01fUkVBRF9CSVRTOyAKKyAqICAgICAgICAgICAgICAgICAgICAgICBBbHBoYSBmaXhlcyByZXBvcnRlZCBieSBQZXRlciBKb25lcyA8cGpvbmVzQHJlZGhhdC5jb20+CisgKiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogZG1haW8gaGFjayBtaWdodCBzdGlsbCBiZSB3cm9uZyBvbiBhcmNocyBvdGhlciB0aGFuIGkzODYKKyAqICAgIDE1LjA2LjE5OTkgICAwLjE1ICBGaXggYmFkIGFsbG9jYXRpb24gYnVnLgorICogICAgICAgICAgICAgICAgICAgICAgIFRoYW5rcyB0byBEZXRpIEZsaWVnbCA8ZmxpZWdsQGluLnR1bS5kZT4KKyAqICAgIDI4LjA2LjE5OTkgICAwLjE2ICBBZGQgcGNpX3NldF9tYXN0ZXIKKyAqICAgIDAzLjA4LjE5OTkgICAwLjE3ICBhZGFwdCB0byBMaW51cycgbmV3IF9fc2V0dXAvX19pbml0Y2FsbAorICogICAgICAgICAgICAgICAgICAgICAgIGFkZGVkIGtlcm5lbCBjb21tYW5kIGxpbmUgb3B0aW9ucyAic29uaWN2aWJlcz1yZXZlcmIiIGFuZCAic29uaWN2aWJlc2RtYWlvPWRtYWlvYWRkciIKKyAqICAgIDEyLjA4LjE5OTkgICAwLjE4ICBtb2R1bGVfaW5pdC9fX3NldHVwIGZpeGVzCisgKiAgICAyNC4wOC4xOTk5ICAgMC4xOSAgZ2V0IHJpZCBvZiB0aGUgZG1haW8ga2x1ZGdlLCByZXBsYWNlIHdpdGggYWxsb2NhdGVfcmVzb3VyY2UKKyAqICAgIDMxLjA4LjE5OTkgICAwLjIwICBhZGQgc3Bpbl9sb2NrX2luaXQKKyAqICAgICAgICAgICAgICAgICAgICAgICB1c2UgbmV3IHJlc291cmNlIGFsbG9jYXRpb24gdG8gYWxsb2NhdGUgRERNQSBJTyBzcGFjZQorICogICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIGN1cnJlbnQtPnN0YXRlID0geCB3aXRoIHNldF9jdXJyZW50X3N0YXRlKHgpCisgKiAgICAwMy4wOS4xOTk5ICAgMC4yMSAgY2hhbmdlIHJlYWQgc2VtYW50aWNzIGZvciBNSURJIHRvIG1hdGNoCisgKiAgICAgICAgICAgICAgICAgICAgICAgT1NTIG1vcmUgY2xvc2VseTsgcmVtb3ZlIHBvc3NpYmxlIHdha2V1cCByYWNlCisgKiAgICAyOC4xMC4xOTk5ICAgMC4yMiAgTW9yZSB3YWl0cXVldWUgcmFjZXMgZml4ZWQKKyAqICAgIDAxLjEyLjE5OTkgICAwLjIzICBOZXcgYXJndW1lbnQgdG8gYWxsb2NhdGVfcmVzb3VyY2UKKyAqICAgIDA3LjEyLjE5OTkgICAwLjI0ICBNb3JlIGFsbG9jYXRlX3Jlc291cmNlIHNlbWFudGljcyBjaGFuZ2UKKyAqICAgIDA4LjAxLjIwMDAgICAwLjI1ICBQcmV2ZW50IHNvbWUgaW9jdGwncyBmcm9tIHJldHVybmluZyBiYWQgY291bnQgdmFsdWVzIG9uIHVuZGVycnVuL292ZXJydW47CisgKiAgICAgICAgICAgICAgICAgICAgICAgVGltIEphbmlrJ3MgQlNFIChCZWRldmlsbGVkIFNvdW5kIEVuZ2luZSkgZm91bmQgdGhpcworICogICAgICAgICAgICAgICAgICAgICAgIHVzZSBNYXJ0aW4gTWFyZXMnIHBjaV9hc3NpZ25fcmVzb3VyY2UKKyAqICAgIDA3LjAyLjIwMDAgICAwLjI2ICBVc2UgcGNpX2FsbG9jX2NvbnNpc3RlbnQgYW5kIHBjaV9yZWdpc3Rlcl9kcml2ZXIKKyAqICAgIDIxLjExLjIwMDAgICAwLjI3ICBJbml0aWFsaXplIGRtYSBidWZmZXJzIGluIHBvbGwsIG90aGVyd2lzZSBwb2xsIG1heSByZXR1cm4gYSBib2d1cyBtYXNrCisgKiAgICAxMi4xMi4yMDAwICAgMC4yOCAgTW9yZSBkbWEgYnVmZmVyIGluaXRpYWxpemF0aW9ucywgcGF0Y2ggZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgIFRqZWVyZCBNdWxkZXIgPHRqZWVyZC5tdWxkZXJAZnVqaXRzdS1zaWVtZW5zLmNvbT4KKyAqICAgIDMxLjAxLjIwMDEgICAwLjI5ICBSZWdpc3Rlci9VbnJlZ2lzdGVyIGdhbWVwb3J0CisgKiAgICAgICAgICAgICAgICAgICAgICAgRml4IFNFVFRSSUdHRVIgbm9uIE9TUyBBUEkgY29uZm9ybWl0eQorICogICAgMTguMDUuMjAwMSAgIDAuMzAgIFBDSSBwcm9iaW5nIGFuZCBlcnJvciB2YWx1ZXMgY2xlYW5lZCB1cCBieSBNYXJjdXMKKyAqICAgICAgICAgICAgICAgICAgICAgICBNZWlzc25lciA8bW1AY2FsZGVyYS5kZT4KKyAqICAgIDAzLjAxLjIwMDMgICAwLjMxICBvcGVuX21vZGUgZml4ZXMgZnJvbSBHZW9yZyBBY2hlciA8YWNoZXJAaW4udHVtLmRlPgorICoKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2dhbWVwb3J0Lmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCisjaW5jbHVkZSAiZG0uaCIKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI3VuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX1MzCisjZGVmaW5lIFBDSV9WRU5ET1JfSURfUzMgICAgICAgICAgICAgMHg1MzMzCisjZW5kaWYKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9TM19TT05JQ1ZJQkVTCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfUzNfU09OSUNWSUJFUyAgMHhjYTAwCisjZW5kaWYKKworI2RlZmluZSBTVl9NQUdJQyAgKChQQ0lfVkVORE9SX0lEX1MzPDwxNil8UENJX0RFVklDRV9JRF9TM19TT05JQ1ZJQkVTKQorCisjZGVmaW5lIFNWX0VYVEVOVF9TQiAgICAgIDB4MTAKKyNkZWZpbmUgU1ZfRVhURU5UX0VOSCAgICAgMHgxMAorI2RlZmluZSBTVl9FWFRFTlRfU1lOVEggICAweDQKKyNkZWZpbmUgU1ZfRVhURU5UX01JREkgICAgMHg0CisjZGVmaW5lIFNWX0VYVEVOVF9HQU1FICAgIDB4OAorI2RlZmluZSBTVl9FWFRFTlRfRE1BICAgICAweDEwCisKKy8qCisgKiB3ZSBhcmUgbm90IGEgYnJpZGdlIGFuZCB0aHVzIHVzZSBhIHJlc291cmNlIGZvciBERE1BIHRoYXQgaXMgdXNlZCBmb3IgYnJpZGdlcyBidXQKKyAqIGxlZnQgZW1wdHkgZm9yIG5vcm1hbCBkZXZpY2VzCisgKi8KKyNkZWZpbmUgUkVTT1VSQ0VfU0IgICAgICAgMAorI2RlZmluZSBSRVNPVVJDRV9FTkggICAgICAxCisjZGVmaW5lIFJFU09VUkNFX1NZTlRIICAgIDIKKyNkZWZpbmUgUkVTT1VSQ0VfTUlESSAgICAgMworI2RlZmluZSBSRVNPVVJDRV9HQU1FICAgICA0CisjZGVmaW5lIFJFU09VUkNFX0RETUEgICAgIDcKKworI2RlZmluZSBTVl9NSURJX0RBVEEgICAgICAwCisjZGVmaW5lIFNWX01JRElfQ09NTUFORCAgIDEKKyNkZWZpbmUgU1ZfTUlESV9TVEFUVVMgICAgMQorCisjZGVmaW5lIFNWX0RNQV9BRERSMCAgICAgIDAKKyNkZWZpbmUgU1ZfRE1BX0FERFIxICAgICAgMQorI2RlZmluZSBTVl9ETUFfQUREUjIgICAgICAyCisjZGVmaW5lIFNWX0RNQV9BRERSMyAgICAgIDMKKyNkZWZpbmUgU1ZfRE1BX0NPVU5UMCAgICAgNAorI2RlZmluZSBTVl9ETUFfQ09VTlQxICAgICA1CisjZGVmaW5lIFNWX0RNQV9DT1VOVDIgICAgIDYKKyNkZWZpbmUgU1ZfRE1BX01PREUgICAgICAgMHhiCisjZGVmaW5lIFNWX0RNQV9SRVNFVCAgICAgIDB4ZAorI2RlZmluZSBTVl9ETUFfTUFTSyAgICAgICAweGYKKworLyoKKyAqIERPTlQgcmVzZXQgdGhlIERNQSBjb250cm9sbGVycyB1bmxlc3MgeW91IHVuZGVyc3RhbmQKKyAqIHRoZSByZXNldCBzZW1hbnRpY3MuIEFzc3VtaW5nIHJlc2V0IHNlbWFudGljcyBhcyBpbgorICogdGhlIDgyMzcgZG9lcyBub3Qgd29yay4KKyAqLworCisjZGVmaW5lIERNQV9NT0RFX0FVVE9JTklUIDB4MTAKKyNkZWZpbmUgRE1BX01PREVfUkVBRCAgICAgMHg0NCAgICAvKiBJL08gdG8gbWVtb3J5LCBubyBhdXRvaW5pdCwgaW5jcmVtZW50LCBzaW5nbGUgbW9kZSAqLworI2RlZmluZSBETUFfTU9ERV9XUklURSAgICAweDQ4ICAgIC8qIG1lbW9yeSB0byBJL08sIG5vIGF1dG9pbml0LCBpbmNyZW1lbnQsIHNpbmdsZSBtb2RlICovCisKKyNkZWZpbmUgU1ZfQ09ERUNfQ09OVFJPTCAgMAorI2RlZmluZSBTVl9DT0RFQ19JTlRNQVNLICAxCisjZGVmaW5lIFNWX0NPREVDX1NUQVRVUyAgIDIKKyNkZWZpbmUgU1ZfQ09ERUNfSUFERFIgICAgNAorI2RlZmluZSBTVl9DT0RFQ19JREFUQSAgICA1CisKKyNkZWZpbmUgU1ZfQ0NUUkxfUkVTRVQgICAgICAweDgwCisjZGVmaW5lIFNWX0NDVFJMX0lOVEFEUklWRSAgMHgyMAorI2RlZmluZSBTVl9DQ1RSTF9XQVZFVEFCTEUgIDB4MDgKKyNkZWZpbmUgU1ZfQ0NUUkxfUkVWRVJCICAgICAweDA0CisjZGVmaW5lIFNWX0NDVFJMX0VOSEFOQ0VEICAgMHgwMQorCisjZGVmaW5lIFNWX0NJTlRNQVNLX0RNQUEgICAgMHgwMQorI2RlZmluZSBTVl9DSU5UTUFTS19ETUFDICAgIDB4MDQKKyNkZWZpbmUgU1ZfQ0lOVE1BU0tfU1BFQ0lBTCAweDA4CisjZGVmaW5lIFNWX0NJTlRNQVNLX1VQRE9XTiAgMHg0MAorI2RlZmluZSBTVl9DSU5UTUFTS19NSURJICAgIDB4ODAKKworI2RlZmluZSBTVl9DU1RBVF9ETUFBICAgICAgIDB4MDEKKyNkZWZpbmUgU1ZfQ1NUQVRfRE1BQwkgICAgMHgwNAorI2RlZmluZSBTVl9DU1RBVF9TUEVDSUFMICAgIDB4MDgKKyNkZWZpbmUgU1ZfQ1NUQVRfVVBET1dOCSAgICAweDQwCisjZGVmaW5lIFNWX0NTVEFUX01JREkJICAgIDB4ODAKKworI2RlZmluZSBTVl9DSUFERFJfVFJEICAgICAgIDB4ODAKKyNkZWZpbmUgU1ZfQ0lBRERSX01DRSAgICAgICAweDQwCisKKy8qIGNvZGVjIGluZGlyZWN0IHJlZ2lzdGVycyAqLworI2RlZmluZSBTVl9DSU1JWF9BRENJTkwgICAgIDB4MDAKKyNkZWZpbmUgU1ZfQ0lNSVhfQURDSU5SICAgICAweDAxCisjZGVmaW5lIFNWX0NJTUlYX0FVWDFJTkwgICAgMHgwMgorI2RlZmluZSBTVl9DSU1JWF9BVVgxSU5SICAgIDB4MDMKKyNkZWZpbmUgU1ZfQ0lNSVhfQ0RJTkwgICAgICAweDA0CisjZGVmaW5lIFNWX0NJTUlYX0NESU5SICAgICAgMHgwNQorI2RlZmluZSBTVl9DSU1JWF9MSU5FSU5MICAgIDB4MDYKKyNkZWZpbmUgU1ZfQ0lNSVhfTElORUlOUiAgICAweDA3CisjZGVmaW5lIFNWX0NJTUlYX01JQ0lOICAgICAgMHgwOAorI2RlZmluZSBTVl9DSU1JWF9TWU5USElOTCAgIDB4MEEKKyNkZWZpbmUgU1ZfQ0lNSVhfU1lOVEhJTlIgICAweDBCCisjZGVmaW5lIFNWX0NJTUlYX0FVWDJJTkwgICAgMHgwQworI2RlZmluZSBTVl9DSU1JWF9BVVgySU5SICAgIDB4MEQKKyNkZWZpbmUgU1ZfQ0lNSVhfQU5BTE9HSU5MICAweDBFCisjZGVmaW5lIFNWX0NJTUlYX0FOQUxPR0lOUiAgMHgwRgorI2RlZmluZSBTVl9DSU1JWF9QQ01JTkwgICAgIDB4MTAKKyNkZWZpbmUgU1ZfQ0lNSVhfUENNSU5SICAgICAweDExCisKKyNkZWZpbmUgU1ZfQ0lHQU1FQ09OVFJPTCAgICAweDA5CisjZGVmaW5lIFNWX0NJREFUQUZNVCAgICAgICAgMHgxMgorI2RlZmluZSBTVl9DSUVOQUJMRSAgICAgICAgIDB4MTMKKyNkZWZpbmUgU1ZfQ0lVUERPV04gICAgICAgICAweDE0CisjZGVmaW5lIFNWX0NJUkVWSVNJT04gICAgICAgMHgxNQorI2RlZmluZSBTVl9DSUFEQ09VVFBVVCAgICAgIDB4MTYKKyNkZWZpbmUgU1ZfQ0lETUFBQkFTRUNPVU5UMSAweDE4CisjZGVmaW5lIFNWX0NJRE1BQUJBU0VDT1VOVDAgMHgxOQorI2RlZmluZSBTVl9DSURNQUNCQVNFQ09VTlQxIDB4MWMKKyNkZWZpbmUgU1ZfQ0lETUFDQkFTRUNPVU5UMCAweDFkCisjZGVmaW5lIFNWX0NJUENNU1IwICAgICAgICAgMHgxZQorI2RlZmluZSBTVl9DSVBDTVNSMSAgICAgICAgIDB4MWYKKyNkZWZpbmUgU1ZfQ0lTWU5USFNSMCAgICAgICAweDIwCisjZGVmaW5lIFNWX0NJU1lOVEhTUjEgICAgICAgMHgyMQorI2RlZmluZSBTVl9DSUFEQ0NMS1NPVVJDRSAgIDB4MjIKKyNkZWZpbmUgU1ZfQ0lBRENBTFRTUiAgICAgICAweDIzCisjZGVmaW5lIFNWX0NJQURDUExMTSAgICAgICAgMHgyNAorI2RlZmluZSBTVl9DSUFEQ1BMTE4gICAgICAgIDB4MjUKKyNkZWZpbmUgU1ZfQ0lTWU5USFBMTE0gICAgICAweDI2CisjZGVmaW5lIFNWX0NJU1lOVEhQTExOICAgICAgMHgyNworI2RlZmluZSBTVl9DSVVBUlRDT05UUk9MICAgIDB4MmEKKyNkZWZpbmUgU1ZfQ0lEUklWRUNPTlRST0wgICAweDJiCisjZGVmaW5lIFNWX0NJU1JTU1BBQ0UgICAgICAgMHgyYworI2RlZmluZSBTVl9DSVNSU0NFTlRFUiAgICAgIDB4MmQKKyNkZWZpbmUgU1ZfQ0lXQVZFVEFCTEVTUkMgICAweDJlCisjZGVmaW5lIFNWX0NJQU5BTE9HUFdSRE9XTiAgMHgzMAorI2RlZmluZSBTVl9DSURJR0lUQUxQV1JET1dOIDB4MzEKKworCisjZGVmaW5lIFNWX0NJTUlYX0FEQ1NSQ19DRCAgICAgMHgyMAorI2RlZmluZSBTVl9DSU1JWF9BRENTUkNfREFDICAgIDB4NDAKKyNkZWZpbmUgU1ZfQ0lNSVhfQURDU1JDX0FVWDIgICAweDYwCisjZGVmaW5lIFNWX0NJTUlYX0FEQ1NSQ19MSU5FICAgMHg4MAorI2RlZmluZSBTVl9DSU1JWF9BRENTUkNfQVVYMSAgIDB4YTAKKyNkZWZpbmUgU1ZfQ0lNSVhfQURDU1JDX01JQyAgICAweGMwCisjZGVmaW5lIFNWX0NJTUlYX0FEQ1NSQ19NSVhPVVQgMHhlMAorI2RlZmluZSBTVl9DSU1JWF9BRENTUkNfTUFTSyAgIDB4ZTAKKworI2RlZmluZSBTVl9DRk1UX1NURVJFTyAgICAgMHgwMQorI2RlZmluZSBTVl9DRk1UXzE2QklUICAgICAgMHgwMgorI2RlZmluZSBTVl9DRk1UX01BU0sgICAgICAgMHgwMworI2RlZmluZSBTVl9DRk1UX0FTSElGVCAgICAgMCAgIAorI2RlZmluZSBTVl9DRk1UX0NTSElGVCAgICAgNAorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NpemVbXSA9IHsgMSwgMiwgMiwgNCB9Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZV9zaGlmdFtdID0geyAwLCAxLCAxLCAyIH07CisKKyNkZWZpbmUgU1ZfQ0VOQUJMRV9QUEUgICAgIDB4NAorI2RlZmluZSBTVl9DRU5BQkxFX1JFICAgICAgMHgyCisjZGVmaW5lIFNWX0NFTkFCTEVfUEUgICAgICAweDEKKworCisvKiBNSURJIGJ1ZmZlciBzaXplcyAqLworCisjZGVmaW5lIE1JRElJTkJVRiAgMjU2CisjZGVmaW5lIE1JRElPVVRCVUYgMjU2CisKKyNkZWZpbmUgRk1PREVfTUlESV9TSElGVCAyCisjZGVmaW5lIEZNT0RFX01JRElfUkVBRCAgKEZNT0RFX1JFQUQgPDwgRk1PREVfTUlESV9TSElGVCkKKyNkZWZpbmUgRk1PREVfTUlESV9XUklURSAoRk1PREVfV1JJVEUgPDwgRk1PREVfTUlESV9TSElGVCkKKworI2RlZmluZSBGTU9ERV9ETUZNIDB4MTAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBzdl9zdGF0ZSB7CisJLyogbWFnaWMgKi8KKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisKKwkvKiBsaXN0IG9mIHNvbmljdmliZXMgZGV2aWNlcyAqLworCXN0cnVjdCBsaXN0X2hlYWQgZGV2czsKKworCS8qIHRoZSBjb3JyZXNwb25kaW5nIHBjaV9kZXYgc3RydWN0dXJlICovCisJc3RydWN0IHBjaV9kZXYgKmRldjsKKworCS8qIHNvdW5kY29yZSBzdHVmZiAqLworCWludCBkZXZfYXVkaW87CisJaW50IGRldl9taXhlcjsKKwlpbnQgZGV2X21pZGk7CisJaW50IGRldl9kbWZtOworCisJLyogaGFyZHdhcmUgcmVzb3VyY2VzICovCisJdW5zaWduZWQgbG9uZyBpb3NiLCBpb2VuaCwgaW9zeW50aCwgaW9taWRpOyAgLyogbG9uZyBmb3IgU1BBUkMgKi8KKwl1bnNpZ25lZCBpbnQgaW9kbWFhLCBpb2RtYWMsIGlycTsKKworICAgICAgICAvKiBtaXhlciBzdHVmZiAqLworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RjbnQ7CisjaWZuZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQl1bnNpZ25lZCBzaG9ydCB2b2xbMTNdOworI2VuZGlmIC8qIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUyAqLworICAgICAgICB9IG1peDsKKworCS8qIHdhdmUgc3R1ZmYgKi8KKwl1bnNpZ25lZCBpbnQgcmF0ZWFkYywgcmF0ZWRhYzsKKwl1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlOworCisJc3BpbmxvY2tfdCBsb2NrOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW07CisJbW9kZV90IG9wZW5fbW9kZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwlzdHJ1Y3QgZG1hYnVmIHsKKwkJdm9pZCAqcmF3YnVmOworCQlkbWFfYWRkcl90IGRtYWFkZHI7CisJCXVuc2lnbmVkIGJ1Zm9yZGVyOworCQl1bnNpZ25lZCBudW1mcmFnOworCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CisJCXVuc2lnbmVkIGh3cHRyLCBzd3B0cjsKKwkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CisJCWludCBjb3VudDsKKwkJdW5zaWduZWQgZXJyb3I7IC8qIG92ZXIvdW5kZXJydW4gKi8KKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKwkJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCQl1bnNpZ25lZCBmcmFnc2l6ZTsKKwkJdW5zaWduZWQgZG1hc2l6ZTsKKwkJdW5zaWduZWQgZnJhZ3NhbXBsZXM7CisJCS8qIE9TUyBzdHVmZiAqLworCQl1bnNpZ25lZCBtYXBwZWQ6MTsKKwkJdW5zaWduZWQgcmVhZHk6MTsKKwkJdW5zaWduZWQgZW5kY2xlYXJlZDoxOworCQl1bnNpZ25lZCBlbmFibGVkOjE7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKwl9IGRtYV9kYWMsIGRtYV9hZGM7CisKKwkvKiBtaWRpIHN0dWZmICovCisJc3RydWN0IHsKKwkJdW5zaWduZWQgaXJkLCBpd3IsIGljbnQ7CisJCXVuc2lnbmVkIG9yZCwgb3dyLCBvY250OworCQl3YWl0X3F1ZXVlX2hlYWRfdCBpd2FpdDsKKwkJd2FpdF9xdWV1ZV9oZWFkX3Qgb3dhaXQ7CisJCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCQl1bnNpZ25lZCBjaGFyIGlidWZbTUlESUlOQlVGXTsKKwkJdW5zaWduZWQgY2hhciBvYnVmW01JRElPVVRCVUZdOworCX0gbWlkaTsKKworCXN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQ7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIExJU1RfSEVBRChkZXZzKTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHdhdmV0YWJsZV9tZW07CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxkMih1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCByID0gMDsKKwkKKwlpZiAoeCA+PSAweDEwMDAwKSB7CisJCXggPj49IDE2OworCQlyICs9IDE2OworCX0KKwlpZiAoeCA+PSAweDEwMCkgeworCQl4ID4+PSA4OworCQlyICs9IDg7CisJfQorCWlmICh4ID49IDB4MTApIHsKKwkJeCA+Pj0gNDsKKwkJciArPSA0OworCX0KKwlpZiAoeCA+PSA0KSB7CisJCXggPj49IDI7CisJCXIgKz0gMjsKKwl9CisJaWYgKHggPj0gMikKKwkJcisrOworCXJldHVybiByOworfQorCisvKgorICogaHdlaWdodE46IHJldHVybnMgdGhlIGhhbW1pbmcgd2VpZ2h0IChpLmUuIHRoZSBudW1iZXIKKyAqIG9mIGJpdHMgc2V0KSBvZiBhIE4tYml0IHdvcmQKKyAqLworCisjaWZkZWYgaHdlaWdodDMyCisjdW5kZWYgaHdlaWdodDMyCisjZW5kaWYKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgaHdlaWdodDMyKHVuc2lnbmVkIGludCB3KQoreworICAgICAgICB1bnNpZ25lZCBpbnQgcmVzID0gKHcgJiAweDU1NTU1NTU1KSArICgodyA+PiAxKSAmIDB4NTU1NTU1NTUpOworICAgICAgICByZXMgPSAocmVzICYgMHgzMzMzMzMzMykgKyAoKHJlcyA+PiAyKSAmIDB4MzMzMzMzMzMpOworICAgICAgICByZXMgPSAocmVzICYgMHgwRjBGMEYwRikgKyAoKHJlcyA+PiA0KSAmIDB4MEYwRjBGMEYpOworICAgICAgICByZXMgPSAocmVzICYgMHgwMEZGMDBGRikgKyAoKHJlcyA+PiA4KSAmIDB4MDBGRjAwRkYpOworICAgICAgICByZXR1cm4gKHJlcyAmIDB4MDAwMEZGRkYpICsgKChyZXMgPj4gMTYpICYgMHgwMDAwRkZGRik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogV2h5IHVzZSBieXRlIElPPyBOb2JvZHkga25vd3MsIGJ1dCBTMyBkb2VzIGl0IGFsc28gaW4gdGhlaXIgV2luZG93cyBkcml2ZXIuCisgKi8KKworI3VuZGVmIERNQUJZVEVJTworCitzdGF0aWMgdm9pZCBzZXRfZG1hYShzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisjaWZkZWYgRE1BQllURUlPCisJdW5zaWduZWQgaW8gPSBzLT5pb2RtYWEsIHU7CisKKwljb3VudC0tOworCWZvciAodSA9IDQ7IHUgPiAwOyB1LS0sIGFkZHIgPj49IDgsIGlvKyspCisJCW91dGIoYWRkciAmIDB4ZmYsIGlvKTsKKwlmb3IgKHUgPSAzOyB1ID4gMDsgdS0tLCBjb3VudCA+Pj0gOCwgaW8rKykKKwkJb3V0Yihjb3VudCAmIDB4ZmYsIGlvKTsKKyNlbHNlIC8qIERNQUJZVEVJTyAqLworCWNvdW50LS07CisJb3V0bChhZGRyLCBzLT5pb2RtYWEgKyBTVl9ETUFfQUREUjApOworCW91dGwoY291bnQsIHMtPmlvZG1hYSArIFNWX0RNQV9DT1VOVDApOworI2VuZGlmIC8qIERNQUJZVEVJTyAqLworCW91dGIoMHgxOCwgcy0+aW9kbWFhICsgU1ZfRE1BX01PREUpOworfQorCitzdGF0aWMgdm9pZCBzZXRfZG1hYyhzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBhZGRyLCB1bnNpZ25lZCBpbnQgY291bnQpCit7CisjaWZkZWYgRE1BQllURUlPCisJdW5zaWduZWQgaW8gPSBzLT5pb2RtYWMsIHU7CisKKwljb3VudCA+Pj0gMTsKKwljb3VudC0tOworCWZvciAodSA9IDQ7IHUgPiAwOyB1LS0sIGFkZHIgPj49IDgsIGlvKyspCisJCW91dGIoYWRkciAmIDB4ZmYsIGlvKTsKKwlmb3IgKHUgPSAzOyB1ID4gMDsgdS0tLCBjb3VudCA+Pj0gOCwgaW8rKykKKwkJb3V0Yihjb3VudCAmIDB4ZmYsIGlvKTsKKyNlbHNlIC8qIERNQUJZVEVJTyAqLworCWNvdW50ID4+PSAxOworCWNvdW50LS07CisJb3V0bChhZGRyLCBzLT5pb2RtYWMgKyBTVl9ETUFfQUREUjApOworCW91dGwoY291bnQsIHMtPmlvZG1hYyArIFNWX0RNQV9DT1VOVDApOworI2VuZGlmIC8qIERNQUJZVEVJTyAqLworCW91dGIoMHgxNCwgcy0+aW9kbWFjICsgU1ZfRE1BX01PREUpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldF9kbWFhKHN0cnVjdCBzdl9zdGF0ZSAqcykKK3sKKyNpZmRlZiBETUFCWVRFSU8KKwl1bnNpZ25lZCBpbyA9IHMtPmlvZG1hYSs2LCB2ID0gMCwgdTsKKworCWZvciAodSA9IDM7IHUgPiAwOyB1LS0sIGlvLS0pIHsKKwkJdiA8PD0gODsKKwkJdiB8PSBpbmIoaW8pOworCX0KKwlyZXR1cm4gdiArIDE7CisjZWxzZSAvKiBETUFCWVRFSU8gKi8KKwlyZXR1cm4gKGlubChzLT5pb2RtYWEgKyBTVl9ETUFfQ09VTlQwKSAmIDB4ZmZmZmZmKSArIDE7CisjZW5kaWYgLyogRE1BQllURUlPICovCit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X2RtYWMoc3RydWN0IHN2X3N0YXRlICpzKQoreworI2lmZGVmIERNQUJZVEVJTworCXVuc2lnbmVkIGlvID0gcy0+aW9kbWFjKzYsIHYgPSAwLCB1OworCisJZm9yICh1ID0gMzsgdSA+IDA7IHUtLSwgaW8tLSkgeworCQl2IDw8PSA4OworCQl2IHw9IGluYihpbyk7CisJfQorCXJldHVybiAodiArIDEpIDw8IDE7CisjZWxzZSAvKiBETUFCWVRFSU8gKi8KKwlyZXR1cm4gKChpbmwocy0+aW9kbWFjICsgU1ZfRE1BX0NPVU5UMCkgJiAweGZmZmZmZikgKyAxKSA8PCAxOworI2VuZGlmIC8qIERNQUJZVEVJTyAqLworfQorCitzdGF0aWMgdm9pZCB3cmluZGlyKHN0cnVjdCBzdl9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciBpZHgsIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlvdXRiKGlkeCAmIDB4M2YsIHMtPmlvZW5oICsgU1ZfQ09ERUNfSUFERFIpOworCXVkZWxheSgxMCk7CisJb3V0YihkYXRhLCBzLT5pb2VuaCArIFNWX0NPREVDX0lEQVRBKTsKKwl1ZGVsYXkoMTApOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciByZGluZGlyKHN0cnVjdCBzdl9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciBpZHgpCit7CisJdW5zaWduZWQgY2hhciB2OworCisJb3V0YihpZHggJiAweDNmLCBzLT5pb2VuaCArIFNWX0NPREVDX0lBRERSKTsKKwl1ZGVsYXkoMTApOworCXYgPSBpbmIocy0+aW9lbmggKyBTVl9DT0RFQ19JREFUQSk7CisJdWRlbGF5KDEwKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQgc2V0X2ZtdChzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgbWFzaywgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCW91dGIoU1ZfQ0lEQVRBRk1UIHwgU1ZfQ0lBRERSX01DRSwgcy0+aW9lbmggKyBTVl9DT0RFQ19JQUREUik7CisJaWYgKG1hc2spIHsKKwkJcy0+Zm10ID0gaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfSURBVEEpOworCQl1ZGVsYXkoMTApOworCX0KKwlzLT5mbXQgPSAocy0+Zm10ICYgbWFzaykgfCBkYXRhOworCW91dGIocy0+Zm10LCBzLT5pb2VuaCArIFNWX0NPREVDX0lEQVRBKTsKKwl1ZGVsYXkoMTApOworCW91dGIoMCwgcy0+aW9lbmggKyBTVl9DT0RFQ19JQUREUik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXVkZWxheSgxMCk7Cit9CisKK3N0YXRpYyB2b2lkIGZyb2JpbmRpcihzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgaWR4LCB1bnNpZ25lZCBjaGFyIG1hc2ssIHVuc2lnbmVkIGNoYXIgZGF0YSkKK3sKKwlvdXRiKGlkeCAmIDB4M2YsIHMtPmlvZW5oICsgU1ZfQ09ERUNfSUFERFIpOworCXVkZWxheSgxMCk7CisJb3V0YigoaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfSURBVEEpICYgbWFzaykgXiBkYXRhLCBzLT5pb2VuaCArIFNWX0NPREVDX0lEQVRBKTsKKwl1ZGVsYXkoMTApOworfQorCisjZGVmaW5lIFJFRkZSRVFVRU5DWSAgMjQ1NzYwMDAKKyNkZWZpbmUgQURDTVVMVCA1MTIKKyNkZWZpbmUgRlVMTFJBVEUgNDgwMDAKKworc3RhdGljIHVuc2lnbmVkIHNldHBsbChzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGNoYXIgcmVnLCB1bnNpZ25lZCByYXRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciByLCBtPTAsIG49MDsKKwl1bnNpZ25lZCB4bSwgeG4sIHhyLCB4ZCwgbWV0cmljID0gfjBVOworCS8qIHRoZSB3YXJuaW5ncyBhYm91dCBtIGFuZCBuIHVzZWQgdW5pbml0aWFsaXplZCBhcmUgYm9ndXMgYW5kIG1heSBzYWZlbHkgYmUgaWdub3JlZCAqLworCisJaWYgKHJhdGUgPCA2MjUwMDAvQURDTVVMVCkKKwkJcmF0ZSA9IDYyNTAwMC9BRENNVUxUOworCWlmIChyYXRlID4gMTUwMDAwMDAwL0FEQ01VTFQpCisJCXJhdGUgPSAxNTAwMDAwMDAvQURDTVVMVDsKKwkvKiBzbGlnaHQgdmlvbGF0aW9uIG9mIHNwZWNzLCBuZWVkZWQgZm9yIGNvbnRpbnVvdXMgc2FtcGxpbmcgcmF0ZXMgKi8KKwlmb3IgKHIgPSAwOyByYXRlIDwgNzUwMDAwMDAvQURDTVVMVDsgciArPSAweDIwLCByYXRlIDw8PSAxKTsKKwlmb3IgKHhuID0gMzsgeG4gPCAzNTsgeG4rKykKKwkJZm9yICh4bSA9IDM7IHhtIDwgMTMwOyB4bSsrKSB7CisJCQl4ciA9IFJFRkZSRVFVRU5DWS9BRENNVUxUICogeG0gLyB4bjsKKwkJCXhkID0gYWJzKChzaWduZWQpKHhyIC0gcmF0ZSkpOworCQkJaWYgKHhkIDwgbWV0cmljKSB7CisJCQkJbWV0cmljID0geGQ7CisJCQkJbSA9IHhtIC0gMjsKKwkJCQluID0geG4gLSAyOworCQkJfQorCQl9CisJcmVnICY9IDB4M2Y7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlvdXRiKHJlZywgcy0+aW9lbmggKyBTVl9DT0RFQ19JQUREUik7CisJdWRlbGF5KDEwKTsKKwlvdXRiKG0sIHMtPmlvZW5oICsgU1ZfQ09ERUNfSURBVEEpOworCXVkZWxheSgxMCk7CisJb3V0YihyZWcrMSwgcy0+aW9lbmggKyBTVl9DT0RFQ19JQUREUik7CisJdWRlbGF5KDEwKTsKKwlvdXRiKHIgfCBuLCBzLT5pb2VuaCArIFNWX0NPREVDX0lEQVRBKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJdWRlbGF5KDEwKTsKKwlyZXR1cm4gKFJFRkZSRVFVRU5DWS9BRENNVUxUICogKG0gKyAyKSAvIChuICsgMikpID4+ICgociA+PiA1KSAmIDcpOworfQorCisjaWYgMAorCitzdGF0aWMgdW5zaWduZWQgZ2V0cGxsKHN0cnVjdCBzdl9zdGF0ZSAqcywgdW5zaWduZWQgY2hhciByZWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIG0sIG47CisKKwlyZWcgJj0gMHgzZjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCW91dGIocmVnLCBzLT5pb2VuaCArIFNWX0NPREVDX0lBRERSKTsKKwl1ZGVsYXkoMTApOworCW0gPSBpbmIocy0+aW9lbmggKyBTVl9DT0RFQ19JREFUQSk7CisJdWRlbGF5KDEwKTsKKwlvdXRiKHJlZysxLCBzLT5pb2VuaCArIFNWX0NPREVDX0lBRERSKTsKKwl1ZGVsYXkoMTApOworCW4gPSBpbmIocy0+aW9lbmggKyBTVl9DT0RFQ19JREFUQSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXVkZWxheSgxMCk7CisJcmV0dXJuIChSRUZGUkVRVUVOQ1kvQURDTVVMVCAqIChtICsgMikgLyAoKG4gJiAweDFmKSArIDIpKSA+PiAoKG4gPj4gNSkgJiA3KTsKK30KKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNldF9kYWNfcmF0ZShzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIHJhdGUpCit7CisJdW5zaWduZWQgZGl2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAocmF0ZSA+IDQ4MDAwKQorCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA0MDAwKQorCQlyYXRlID0gNDAwMDsKKwlkaXYgPSAocmF0ZSAqIDY1NTM2ICsgRlVMTFJBVEUvMikgLyBGVUxMUkFURTsKKwlpZiAoZGl2ID4gNjU1MzUpCisJCWRpdiA9IDY1NTM1OworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJd3JpbmRpcihzLCBTVl9DSVBDTVNSMSwgZGl2ID4+IDgpOworCXdyaW5kaXIocywgU1ZfQ0lQQ01TUjAsIGRpdik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPnJhdGVkYWMgPSAoZGl2ICogRlVMTFJBVEUgKyAzMjc2OCkgLyA2NTUzNjsKK30KKworc3RhdGljIHZvaWQgc2V0X2FkY19yYXRlKHN0cnVjdCBzdl9zdGF0ZSAqcywgdW5zaWduZWQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIHJhdGUxLCByYXRlMiwgZGl2OworCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgNDAwMCkKKwkJcmF0ZSA9IDQwMDA7CisJcmF0ZTEgPSBzZXRwbGwocywgU1ZfQ0lBRENQTExNLCByYXRlKTsKKwlkaXYgPSAoNDgwMDAgKyByYXRlLzIpIC8gcmF0ZTsKKwlpZiAoZGl2ID4gOCkKKwkJZGl2ID0gODsKKwlyYXRlMiA9ICg0ODAwMCArIGRpdi8yKSAvIGRpdjsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXdyaW5kaXIocywgU1ZfQ0lBRENBTFRTUiwgKGRpdi0xKSA8PCA0KTsKKwlpZiAoYWJzKChzaWduZWQpKHJhdGUtcmF0ZTIpKSA8PSBhYnMoKHNpZ25lZCkocmF0ZS1yYXRlMSkpKSB7CisJCXdyaW5kaXIocywgU1ZfQ0lBRENDTEtTT1VSQ0UsIDB4MTApOworCQlzLT5yYXRlYWRjID0gcmF0ZTI7CisJfSBlbHNlIHsKKwkJd3JpbmRpcihzLCBTVl9DSUFEQ0NMS1NPVVJDRSwgMHgwMCk7CisJCXMtPnJhdGVhZGMgPSByYXRlMTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHN0b3BfYWRjKHN0cnVjdCBzdl9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5lbmFibGUgJj0gflNWX0NFTkFCTEVfUkU7CisJd3JpbmRpcihzLCBTVl9DSUVOQUJMRSwgcy0+ZW5hYmxlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgaW5saW5lIHZvaWQgc3RvcF9kYWMoc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmVuYWJsZSAmPSB+KFNWX0NFTkFCTEVfUFBFIHwgU1ZfQ0VOQUJMRV9QRSk7CisJd3JpbmRpcihzLCBTVl9DSUVOQUJMRSwgcy0+ZW5hYmxlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICgocy0+ZG1hX2RhYy5tYXBwZWQgfHwgcy0+ZG1hX2RhYy5jb3VudCA+IDApICYmIHMtPmRtYV9kYWMucmVhZHkpIHsKKwkJcy0+ZW5hYmxlID0gKHMtPmVuYWJsZSAmIH5TVl9DRU5BQkxFX1BQRSkgfCBTVl9DRU5BQkxFX1BFOworCQl3cmluZGlyKHMsIFNWX0NJRU5BQkxFLCBzLT5lbmFibGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCitzdGF0aWMgdm9pZCBzdGFydF9hZGMoc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICgocy0+ZG1hX2FkYy5tYXBwZWQgfHwgcy0+ZG1hX2FkYy5jb3VudCA8IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtIDIqcy0+ZG1hX2FkYy5mcmFnc2l6ZSkpIAorCSAgICAmJiBzLT5kbWFfYWRjLnJlYWR5KSB7CisJCXMtPmVuYWJsZSB8PSBTVl9DRU5BQkxFX1JFOworCQl3cmluZGlyKHMsIFNWX0NJRU5BQkxFLCBzLT5lbmFibGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7Cit9CQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNy1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCitzdGF0aWMgdm9pZCBkZWFsbG9jX2RtYWJ1ZihzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHN0cnVjdCBkbWFidWYgKmRiKQoreworCXN0cnVjdCBwYWdlICpwYWdlLCAqcGVuZDsKKworCWlmIChkYi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChzLT5kZXYsIFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIsIGRiLT5yYXdidWYsIGRiLT5kbWFhZGRyKTsKKwl9CisJZGItPnJhd2J1ZiA9IE5VTEw7CisJZGItPm1hcHBlZCA9IGRiLT5yZWFkeSA9IDA7Cit9CisKKworLyogRE1BQSBpcyB1c2VkIGZvciBwbGF5YmFjaywgRE1BQyBpcyB1c2VkIGZvciByZWNvcmRpbmcgKi8KKworc3RhdGljIGludCBwcm9nX2RtYWJ1ZihzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIHJlYykKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkYiA9IHJlYyA/ICZzLT5kbWFfYWRjIDogJnMtPmRtYV9kYWM7CisJdW5zaWduZWQgcmF0ZSA9IHJlYyA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjOworCWludCBvcmRlcjsKKwl1bnNpZ25lZCBieXRlcGVyc2VjOworCXVuc2lnbmVkIGJ1ZnM7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCXVuc2lnbmVkIGNoYXIgZm10OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWZtdCA9IHMtPmZtdDsKKwlpZiAocmVjKSB7CisJCXMtPmVuYWJsZSAmPSB+U1ZfQ0VOQUJMRV9SRTsKKwkJZm10ID4+PSBTVl9DRk1UX0NTSElGVDsKKwl9IGVsc2UgeworCQlzLT5lbmFibGUgJj0gflNWX0NFTkFCTEVfUEU7CisJCWZtdCA+Pj0gU1ZfQ0ZNVF9BU0hJRlQ7CisJfQorCXdyaW5kaXIocywgU1ZfQ0lFTkFCTEUsIHMtPmVuYWJsZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCWZtdCAmPSBTVl9DRk1UX01BU0s7CisJZGItPmh3cHRyID0gZGItPnN3cHRyID0gZGItPnRvdGFsX2J5dGVzID0gZGItPmNvdW50ID0gZGItPmVycm9yID0gZGItPmVuZGNsZWFyZWQgPSAwOworCWlmICghZGItPnJhd2J1ZikgeworCQlkYi0+cmVhZHkgPSBkYi0+bWFwcGVkID0gMDsKKwkJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkKKwkJCWlmICgoZGItPnJhd2J1ZiA9IHBjaV9hbGxvY19jb25zaXN0ZW50KHMtPmRldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAmZGItPmRtYWFkZHIpKSkKKwkJCQlicmVhazsKKwkJaWYgKCFkYi0+cmF3YnVmKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCWRiLT5idWZvcmRlciA9IG9yZGVyOworCQlpZiAoKHZpcnRfdG9fYnVzKGRiLT5yYXdidWYpIF4gKHZpcnRfdG9fYnVzKGRiLT5yYXdidWYpICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSkpICYgfjB4ZmZmZikKKwkJCXByaW50ayhLRVJOX0RFQlVHICJzdjogRE1BIGJ1ZmZlciBjcm9zc2VzIDY0ayBib3VuZGFyeTogYnVzYWRkciAweCVseCAgc2l6ZSAlbGRcbiIsIAorCQkJICAgICAgIHZpcnRfdG9fYnVzKGRiLT5yYXdidWYpLCBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKTsKKwkJaWYgKCh2aXJ0X3RvX2J1cyhkYi0+cmF3YnVmKSArIChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSAtIDEpICYgfjB4ZmZmZmZmKQorCQkJcHJpbnRrKEtFUk5fREVCVUcgInN2OiBETUEgYnVmZmVyIGJleW9uZCAxNk1COiBidXNhZGRyIDB4JWx4ICBzaXplICVsZFxuIiwgCisJCQkgICAgICAgdmlydF90b19idXMoZGItPnJhd2J1ZiksIFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpOworCQkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmICsgKFBBR0VfU0laRSA8PCBkYi0+YnVmb3JkZXIpIC0gMSk7CisJCWZvciAocGFnZSA9IHZpcnRfdG9fcGFnZShkYi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisJfQorCWJ5dGVwZXJzZWMgPSByYXRlIDw8IHNhbXBsZV9zaGlmdFtmbXRdOworCWJ1ZnMgPSBQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyOworCWlmIChkYi0+b3NzZnJhZ3NoaWZ0KSB7CisJCWlmICgoMTAwMCA8PCBkYi0+b3NzZnJhZ3NoaWZ0KSA8IGJ5dGVwZXJzZWMpCisJCQlkYi0+ZnJhZ3NoaWZ0ID0gbGQyKGJ5dGVwZXJzZWMvMTAwMCk7CisJCWVsc2UKKwkJCWRiLT5mcmFnc2hpZnQgPSBkYi0+b3NzZnJhZ3NoaWZ0OworCX0gZWxzZSB7CisJCWRiLT5mcmFnc2hpZnQgPSBsZDIoYnl0ZXBlcnNlYy8xMDAvKGRiLT5zdWJkaXZpc2lvbiA/IGRiLT5zdWJkaXZpc2lvbiA6IDEpKTsKKwkJaWYgKGRiLT5mcmFnc2hpZnQgPCAzKQorCQkJZGItPmZyYWdzaGlmdCA9IDM7CisJfQorCWRiLT5udW1mcmFnID0gYnVmcyA+PiBkYi0+ZnJhZ3NoaWZ0OworCXdoaWxlIChkYi0+bnVtZnJhZyA8IDQgJiYgZGItPmZyYWdzaGlmdCA+IDMpIHsKKwkJZGItPmZyYWdzaGlmdC0tOworCQlkYi0+bnVtZnJhZyA9IGJ1ZnMgPj4gZGItPmZyYWdzaGlmdDsKKwl9CisJZGItPmZyYWdzaXplID0gMSA8PCBkYi0+ZnJhZ3NoaWZ0OworCWlmIChkYi0+b3NzbWF4ZnJhZ3MgPj0gNCAmJiBkYi0+b3NzbWF4ZnJhZ3MgPCBkYi0+bnVtZnJhZykKKwkJZGItPm51bWZyYWcgPSBkYi0+b3NzbWF4ZnJhZ3M7CisJZGItPmZyYWdzYW1wbGVzID0gZGItPmZyYWdzaXplID4+IHNhbXBsZV9zaGlmdFtmbXRdOworCWRiLT5kbWFzaXplID0gZGItPm51bWZyYWcgPDwgZGItPmZyYWdzaGlmdDsKKwltZW1zZXQoZGItPnJhd2J1ZiwgKGZtdCAmIFNWX0NGTVRfMTZCSVQpID8gMCA6IDB4ODAsIGRiLT5kbWFzaXplKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmIChyZWMpIHsKKwkJc2V0X2RtYWMocywgZGItPmRtYWFkZHIsIGRiLT5udW1mcmFnIDw8IGRiLT5mcmFnc2hpZnQpOworCQkvKiBwcm9ncmFtIGVuaGFuY2VkIG1vZGUgcmVnaXN0ZXJzICovCisJCXdyaW5kaXIocywgU1ZfQ0lETUFDQkFTRUNPVU5UMSwgKGRiLT5mcmFnc2FtcGxlcy0xKSA+PiA4KTsKKwkJd3JpbmRpcihzLCBTVl9DSURNQUNCQVNFQ09VTlQwLCBkYi0+ZnJhZ3NhbXBsZXMtMSk7CisJfSBlbHNlIHsKKwkJc2V0X2RtYWEocywgZGItPmRtYWFkZHIsIGRiLT5udW1mcmFnIDw8IGRiLT5mcmFnc2hpZnQpOworCQkvKiBwcm9ncmFtIGVuaGFuY2VkIG1vZGUgcmVnaXN0ZXJzICovCisJCXdyaW5kaXIocywgU1ZfQ0lETUFBQkFTRUNPVU5UMSwgKGRiLT5mcmFnc2FtcGxlcy0xKSA+PiA4KTsKKwkJd3JpbmRpcihzLCBTVl9DSURNQUFCQVNFQ09VTlQwLCBkYi0+ZnJhZ3NhbXBsZXMtMSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlkYi0+ZW5hYmxlZCA9IDE7CisJZGItPnJlYWR5ID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2FkdmFuY2Uoc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGNoYXIgYyA9IChzLT5mbXQgJiAoU1ZfQ0ZNVF8xNkJJVCA8PCBTVl9DRk1UX0FTSElGVCkpID8gMCA6IDB4ODA7CisJdW5zaWduZWQgY2hhciAqYnVmID0gcy0+ZG1hX2RhYy5yYXdidWY7CisJdW5zaWduZWQgYnNpemUgPSBzLT5kbWFfZGFjLmRtYXNpemU7CisJdW5zaWduZWQgYnB0ciA9IHMtPmRtYV9kYWMuc3dwdHI7CisJdW5zaWduZWQgbGVuID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKworCWlmIChicHRyICsgbGVuID4gYnNpemUpIHsKKwkJdW5zaWduZWQgeCA9IGJzaXplIC0gYnB0cjsKKwkJbWVtc2V0KGJ1ZiArIGJwdHIsIGMsIHgpOworCQlicHRyID0gMDsKKwkJbGVuIC09IHg7CisJfQorCW1lbXNldChidWYgKyBicHRyLCBjLCBsZW4pOworfQorCisvKiBjYWxsIHdpdGggc3BpbmxvY2sgaGVsZCEgKi8KK3N0YXRpYyB2b2lkIHN2X3VwZGF0ZV9wdHIoc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGh3cHRyOworCWludCBkaWZmOworCisJLyogdXBkYXRlIEFEQyBwb2ludGVyICovCisJaWYgKHMtPmRtYV9hZGMucmVhZHkpIHsKKwkJaHdwdHIgPSAocy0+ZG1hX2FkYy5kbWFzaXplIC0gZ2V0X2RtYWMocykpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlkaWZmID0gKHMtPmRtYV9hZGMuZG1hc2l6ZSArIGh3cHRyIC0gcy0+ZG1hX2FkYy5od3B0cikgJSBzLT5kbWFfYWRjLmRtYXNpemU7CisJCXMtPmRtYV9hZGMuaHdwdHIgPSBod3B0cjsKKwkJcy0+ZG1hX2FkYy50b3RhbF9ieXRlcyArPSBkaWZmOworCQlzLT5kbWFfYWRjLmNvdW50ICs9IGRpZmY7CisJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2FkYy5mcmFnc2l6ZSkgCisJCQl3YWtlX3VwKCZzLT5kbWFfYWRjLndhaXQpOworCQlpZiAoIXMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+IChzaWduZWQpKHMtPmRtYV9hZGMuZG1hc2l6ZSAtICgoMyAqIHMtPmRtYV9hZGMuZnJhZ3NpemUpID4+IDEpKSkgeworCQkJCXMtPmVuYWJsZSAmPSB+U1ZfQ0VOQUJMRV9SRTsKKwkJCQl3cmluZGlyKHMsIFNWX0NJRU5BQkxFLCBzLT5lbmFibGUpOworCQkJCXMtPmRtYV9hZGMuZXJyb3IrKzsKKwkJCX0KKwkJfQorCX0KKwkvKiB1cGRhdGUgREFDIHBvaW50ZXIgKi8KKwlpZiAocy0+ZG1hX2RhYy5yZWFkeSkgeworCQlod3B0ciA9IChzLT5kbWFfZGFjLmRtYXNpemUgLSBnZXRfZG1hYShzKSkgJSBzLT5kbWFfZGFjLmRtYXNpemU7CisJCWRpZmYgPSAocy0+ZG1hX2RhYy5kbWFzaXplICsgaHdwdHIgLSBzLT5kbWFfZGFjLmh3cHRyKSAlIHMtPmRtYV9kYWMuZG1hc2l6ZTsKKwkJcy0+ZG1hX2RhYy5od3B0ciA9IGh3cHRyOworCQlzLT5kbWFfZGFjLnRvdGFsX2J5dGVzICs9IGRpZmY7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkgeworCQkJcy0+ZG1hX2RhYy5jb3VudCArPSBkaWZmOworCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgPj0gKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplKQorCQkJCXdha2VfdXAoJnMtPmRtYV9kYWMud2FpdCk7CisJCX0gZWxzZSB7CisJCQlzLT5kbWFfZGFjLmNvdW50IC09IGRpZmY7CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA8PSAwKSB7CisJCQkJcy0+ZW5hYmxlICY9IH5TVl9DRU5BQkxFX1BFOworCQkJCXdyaW5kaXIocywgU1ZfQ0lFTkFCTEUsIHMtPmVuYWJsZSk7CisJCQkJcy0+ZG1hX2RhYy5lcnJvcisrOworCQkJfSBlbHNlIGlmIChzLT5kbWFfZGFjLmNvdW50IDw9IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSAmJiAhcy0+ZG1hX2RhYy5lbmRjbGVhcmVkKSB7CisJCQkJY2xlYXJfYWR2YW5jZShzKTsKKwkJCQlzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAxOworCQkJfQorCQkJaWYgKHMtPmRtYV9kYWMuY291bnQgKyAoc2lnbmVkKXMtPmRtYV9kYWMuZnJhZ3NpemUgPD0gKHNpZ25lZClzLT5kbWFfZGFjLmRtYXNpemUpCisJCQkJd2FrZV91cCgmcy0+ZG1hX2RhYy53YWl0KTsKKwkJfQorCX0KK30KKworLyogaG9sZCBzcGlubG9jayBmb3IgdGhlIGZvbGxvd2luZyEgKi8KK3N0YXRpYyB2b2lkIHN2X2hhbmRsZV9taWRpKHN0cnVjdCBzdl9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCWludCB3YWtlOworCisJd2FrZSA9IDA7CisJd2hpbGUgKCEoaW5iKHMtPmlvbWlkaSsxKSAmIDB4ODApKSB7CisJCWNoID0gaW5iKHMtPmlvbWlkaSk7CisJCWlmIChzLT5taWRpLmljbnQgPCBNSURJSU5CVUYpIHsKKwkJCXMtPm1pZGkuaWJ1ZltzLT5taWRpLml3cl0gPSBjaDsKKwkJCXMtPm1pZGkuaXdyID0gKHMtPm1pZGkuaXdyICsgMSkgJSBNSURJSU5CVUY7CisJCQlzLT5taWRpLmljbnQrKzsKKwkJfQorCQl3YWtlID0gMTsKKwl9CisJaWYgKHdha2UpCisJCXdha2VfdXAoJnMtPm1pZGkuaXdhaXQpOworCXdha2UgPSAwOworCXdoaWxlICghKGluYihzLT5pb21pZGkrMSkgJiAweDQwKSAmJiBzLT5taWRpLm9jbnQgPiAwKSB7CisJCW91dGIocy0+bWlkaS5vYnVmW3MtPm1pZGkub3JkXSwgcy0+aW9taWRpKTsKKwkJcy0+bWlkaS5vcmQgPSAocy0+bWlkaS5vcmQgKyAxKSAlIE1JRElPVVRCVUY7CisJCXMtPm1pZGkub2NudC0tOworCQlpZiAocy0+bWlkaS5vY250IDwgTUlESU9VVEJVRi0xNikKKwkJCXdha2UgPSAxOworCX0KKwlpZiAod2FrZSkKKwkJd2FrZV91cCgmcy0+bWlkaS5vd2FpdCk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBzdl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKyAgICAgICAgc3RydWN0IHN2X3N0YXRlICpzID0gKHN0cnVjdCBzdl9zdGF0ZSAqKWRldl9pZDsKKwl1bnNpZ25lZCBpbnQgaW50c3JjOworCQorCS8qIGZhc3RwYXRoIG91dCwgdG8gZWFzZSBpbnRlcnJ1cHQgc2hhcmluZyAqLworCWludHNyYyA9IGluYihzLT5pb2VuaCArIFNWX0NPREVDX1NUQVRVUyk7CisJaWYgKCEoaW50c3JjICYgKFNWX0NTVEFUX0RNQUEgfCBTVl9DU1RBVF9ETUFDIHwgU1ZfQ1NUQVRfTUlESSkpKQorCQlyZXR1cm4gSVJRX05PTkU7CisJc3Bpbl9sb2NrKCZzLT5sb2NrKTsKKwlzdl91cGRhdGVfcHRyKHMpOworCXN2X2hhbmRsZV9taWRpKHMpOworCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHN2X21pZGlfdGltZXIodW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBzdl9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc3Zfc3RhdGUgKilkYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzdl9oYW5kbGVfbWlkaShzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcy0+bWlkaS50aW1lci5leHBpcmVzID0gamlmZmllcysxOworCWFkZF90aW1lcigmcy0+bWlkaS50aW1lcik7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPSBLRVJOX0NSSVQgInN2OiBpbnZhbGlkIG1hZ2ljIHZhbHVlXG4iOworCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKHMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWlmICghKHMpIHx8IChzKS0+bWFnaWMgIT0gU1ZfTUFHSUMpIHsgXAorCQlwcmludGsoaW52YWxpZF9tYWdpYyk7ICAgICAgICAgICAgXAorCQlyZXR1cm4gLUVOWElPOyAgICAgICAgICAgICAgICAgICAgXAorCX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30pCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIE1UXzQgICAgICAgICAgMQorI2RlZmluZSBNVF81TVVURSAgICAgIDIKKyNkZWZpbmUgTVRfNE1VVEVNT05PICAzCisjZGVmaW5lIE1UXzZNVVRFICAgICAgNAorCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwl1bnNpZ25lZCBsZWZ0OjU7CisJdW5zaWduZWQgcmlnaHQ6NTsKKwl1bnNpZ25lZCB0eXBlOjM7CisJdW5zaWduZWQgcmVjOjM7Cit9IG1peHRhYmxlW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7CisJW1NPVU5EX01JWEVSX1JFQ0xFVl0gPSB7IFNWX0NJTUlYX0FEQ0lOTCwgICAgU1ZfQ0lNSVhfQURDSU5SLCAgICBNVF80LCAgICAgICAgIDAgfSwKKwlbU09VTkRfTUlYRVJfTElORTFdICA9IHsgU1ZfQ0lNSVhfQVVYMUlOTCwgICBTVl9DSU1JWF9BVVgxSU5SLCAgIE1UXzVNVVRFLCAgICAgNSB9LAorCVtTT1VORF9NSVhFUl9DRF0gICAgID0geyBTVl9DSU1JWF9DRElOTCwgICAgIFNWX0NJTUlYX0NESU5SLCAgICAgTVRfNU1VVEUsICAgICAxIH0sCisJW1NPVU5EX01JWEVSX0xJTkVdICAgPSB7IFNWX0NJTUlYX0xJTkVJTkwsICAgU1ZfQ0lNSVhfTElORUlOUiwgICBNVF81TVVURSwgICAgIDQgfSwKKwlbU09VTkRfTUlYRVJfTUlDXSAgICA9IHsgU1ZfQ0lNSVhfTUlDSU4sICAgICBTVl9DSU1JWF9BRENJTkwsICAgIE1UXzRNVVRFTU9OTywgNiB9LAorCVtTT1VORF9NSVhFUl9TWU5USF0gID0geyBTVl9DSU1JWF9TWU5USElOTCwgIFNWX0NJTUlYX1NZTlRISU5SLCAgTVRfNU1VVEUsICAgICAyIH0sCisJW1NPVU5EX01JWEVSX0xJTkUyXSAgPSB7IFNWX0NJTUlYX0FVWDJJTkwsICAgU1ZfQ0lNSVhfQVVYMklOUiwgICBNVF81TVVURSwgICAgIDMgfSwKKwlbU09VTkRfTUlYRVJfVk9MVU1FXSA9IHsgU1ZfQ0lNSVhfQU5BTE9HSU5MLCBTVl9DSU1JWF9BTkFMT0dJTlIsIE1UXzVNVVRFLCAgICAgNyB9LAorCVtTT1VORF9NSVhFUl9QQ01dICAgID0geyBTVl9DSU1JWF9QQ01JTkwsICAgIFNWX0NJTUlYX1BDTUlOUiwgICAgTVRfNk1VVEUsICAgICAwIH0KK307CisKKyNpZmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKworc3RhdGljIGludCByZXR1cm5fbWl4dmFsKHN0cnVjdCBzdl9zdGF0ZSAqcywgdW5zaWduZWQgaSwgaW50ICphcmcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIGwsIHIsIHJsLCBycjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJbCA9IHJkaW5kaXIocywgbWl4dGFibGVbaV0ubGVmdCk7CisJciA9IHJkaW5kaXIocywgbWl4dGFibGVbaV0ucmlnaHQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKG1peHRhYmxlW2ldLnR5cGUpIHsKKwljYXNlIE1UXzQ6CisJCXIgJj0gMHhmOworCQlsICY9IDB4ZjsKKwkJcmwgPSAxMCArIDYgKiAobCAmIDE1KTsKKwkJcnIgPSAxMCArIDYgKiAociAmIDE1KTsKKwkJYnJlYWs7CisKKwljYXNlIE1UXzRNVVRFTU9OTzoKKwkJcmwgPSA1NSAtIDMgKiAobCAmIDE1KTsKKwkJaWYgKHIgJiAweDEwKQorCQkJcmwgKz0gNDU7CisJCXJyID0gcmw7CisJCXIgPSBsOworCQlicmVhazsKKworCWNhc2UgTVRfNU1VVEU6CisJZGVmYXVsdDoKKwkJcmwgPSAxMDAgLSAzICogKGwgJiAzMSk7CisJCXJyID0gMTAwIC0gMyAqIChyICYgMzEpOworCQlicmVhazsKKwkJCQkKKwljYXNlIE1UXzZNVVRFOgorCQlybCA9IDEwMCAtIDMgKiAobCAmIDYzKSAvIDI7CisJCXJyID0gMTAwIC0gMyAqIChyICYgNjMpIC8gMjsKKwkJYnJlYWs7CisJfQorCWlmIChsICYgMHg4MCkKKwkJcmwgPSAwOworCWlmIChyICYgMHg4MCkKKwkJcnIgPSAwOworCXJldHVybiBwdXRfdXNlcigocnIgPDwgOCkgfCBybCwgYXJnKTsKK30KKworI2Vsc2UgLyogT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHZvbGlkeFtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0gCit7CisJW1NPVU5EX01JWEVSX1JFQ0xFVl0gPSAxLAorCVtTT1VORF9NSVhFUl9MSU5FMV0gID0gMiwKKwlbU09VTkRfTUlYRVJfQ0RdICAgICA9IDMsCisJW1NPVU5EX01JWEVSX0xJTkVdICAgPSA0LAorCVtTT1VORF9NSVhFUl9NSUNdICAgID0gNSwKKwlbU09VTkRfTUlYRVJfU1lOVEhdICA9IDYsCisJW1NPVU5EX01JWEVSX0xJTkUyXSAgPSA3LAorCVtTT1VORF9NSVhFUl9WT0xVTUVdID0gOCwKKwlbU09VTkRfTUlYRVJfUENNXSAgICA9IDkKK307CisKKyNlbmRpZiAvKiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MgKi8KKworc3RhdGljIHVuc2lnbmVkIG1peGVyX3JlY21hc2soc3RydWN0IHN2X3N0YXRlICpzKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIGo7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWogPSByZGluZGlyKHMsIFNWX0NJTUlYX0FEQ0lOTCkgPj4gNTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJaiAmPSA3OworCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMgJiYgbWl4dGFibGVbaV0ucmVjICE9IGo7IGkrKyk7CisJcmV0dXJuIDEgPDwgaTsKK30KKworc3RhdGljIGludCBtaXhlcl9pb2N0bChzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGksIHZhbDsKKwl1bnNpZ25lZCBjaGFyIGwsIHIsIHJsLCBycjsKKwlpbnQgX191c2VyICpwID0gKGludCBfX3VzZXIgKilhcmc7CisKKwlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAgaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9JTkZPKSB7CisJCW1peGVyX2luZm8gaW5mbzsKKwkJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworCQlzdHJsY3B5KGluZm8uaWQsICJTb25pY1ZpYmVzIiwgc2l6ZW9mKGluZm8uaWQpKTsKKwkJc3RybGNweShpbmZvLm5hbWUsICJTMyBTb25pY1ZpYmVzIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpbmZvLm1vZGlmeV9jb3VudGVyID0gcy0+bWl4Lm1vZGNudDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCBfX3VzZXIgKilhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CisJCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCXN0cmxjcHkoaW5mby5pZCwgIlNvbmljVmliZXMiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgIlMzIFNvbmljVmliZXMiLCBzaXplb2YoaW5mby5uYW1lKSk7CisJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQgX191c2VyICopYXJnLCAmaW5mbywgc2l6ZW9mKGluZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGNtZCA9PSBPU1NfR0VUVkVSU0lPTikKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfUFJJVkFURTEpIHsgIC8qIFNSUyBzZXR0aW5ncyAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAodmFsICYgMSkgeworCQkJaWYgKHZhbCAmIDIpIHsKKwkJCQlsID0gNCAtICgodmFsID4+IDIpICYgNyk7CisJCQkJaWYgKGwgJiB+MykKKwkJCQkJbCA9IDQ7CisJCQkJciA9IDQgLSAoKHZhbCA+PiA1KSAmIDcpOworCQkJCWlmIChyICYgfjMpCisJCQkJCXIgPSA0OworCQkJCXdyaW5kaXIocywgU1ZfQ0lTUlNTUEFDRSwgbCk7CisJCQkJd3JpbmRpcihzLCBTVl9DSVNSU0NFTlRFUiwgcik7CisJCQl9IGVsc2UKKwkJCQl3cmluZGlyKHMsIFNWX0NJU1JTU1BBQ0UsIDB4ODApOworCQl9CisJCWwgPSByZGluZGlyKHMsIFNWX0NJU1JTU1BBQ0UpOworCQlyID0gcmRpbmRpcihzLCBTVl9DSVNSU0NFTlRFUik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGwgJiAweDgwKQorCQkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCQlyZXR1cm4gcHV0X3VzZXIoKCg0IC0gKGwgJiA3KSkgPDwgMikgfCAoKDQgLSAociAmIDcpKSA8PCA1KSB8IDIsIHApOworCX0KKwlpZiAoX0lPQ19UWVBFKGNtZCkgIT0gJ00nIHx8IF9TSU9DX1NJWkUoY21kKSAhPSBzaXplb2YoaW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgaWYgKF9TSU9DX0RJUihjbWQpID09IF9TSU9DX1JFQUQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJcmV0dXJuIHB1dF91c2VyKG1peGVyX3JlY21hc2socyksIHApOworCQkJCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOiAvKiBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIGRldmljZSAqLworCQkJZm9yICh2YWwgPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQkJCWlmIChtaXh0YWJsZVtpXS50eXBlKQorCQkJCQl2YWwgfD0gMSA8PCBpOworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgcmVjb3JkaW5nIHNvdXJjZSAqLworCQkJZm9yICh2YWwgPSBpID0gMDsgaSA8IFNPVU5EX01JWEVSX05SREVWSUNFUzsgaSsrKQorCQkJCWlmIChtaXh0YWJsZVtpXS5yZWMpCisJCQkJCXZhbCB8PSAxIDw8IGk7CisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJCQorICAgICAgICAgICAgICAgIGNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzogLyogTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gKi8KKwkJCWZvciAodmFsID0gaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJCQlpZiAobWl4dGFibGVbaV0udHlwZSAmJiBtaXh0YWJsZVtpXS50eXBlICE9IE1UXzRNVVRFTU9OTykKKwkJCQkJdmFsIHw9IDEgPDwgaTsKKwkJCXJldHVybiBwdXRfdXNlcih2YWwsIHApOworCQkJCisgICAgICAgICAgICAgICAgY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX0NBUF9FWENMX0lOUFVULCBwKTsKKworCQlkZWZhdWx0OgorCQkJaSA9IF9JT0NfTlIoY21kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUyB8fCAhbWl4dGFibGVbaV0udHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCQlyZXR1cm4gcmV0dXJuX21peHZhbChzLCBpLCBwKTsKKyNlbHNlIC8qIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUyAqLworCQkJaWYgKCF2b2xpZHhbaV0pCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFt2b2xpZHhbaV0tMV0sIHApOworI2VuZGlmIC8qIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUyAqLworCQl9CisJfQorICAgICAgICBpZiAoX1NJT0NfRElSKGNtZCkgIT0gKF9TSU9DX1JFQUR8X1NJT0NfV1JJVEUpKSAKKwkJcmV0dXJuIC1FSU5WQUw7CisJcy0+bWl4Lm1vZGNudCsrOworCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6IC8qIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWkgPSBod2VpZ2h0MzIodmFsKTsKKwkJaWYgKGkgPT0gMCkKKwkJCXJldHVybiAwOyAvKnZhbCA9IG1peGVyX3JlY21hc2socyk7Ki8KKwkJZWxzZSBpZiAoaSA+IDEpIAorCQkJdmFsICY9IH5taXhlcl9yZWNtYXNrKHMpOworCQlmb3IgKGkgPSAwOyBpIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTOyBpKyspIHsKKwkJCWlmICghKHZhbCAmICgxIDw8IGkpKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChtaXh0YWJsZVtpXS5yZWMpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFtaXh0YWJsZVtpXS5yZWMpCisJCQlyZXR1cm4gMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZnJvYmluZGlyKHMsIFNWX0NJTUlYX0FEQ0lOTCwgMHgxZiwgbWl4dGFibGVbaV0ucmVjIDw8IDUpOworCQlmcm9iaW5kaXIocywgU1ZfQ0lNSVhfQURDSU5SLCAweDFmLCBtaXh0YWJsZVtpXS5yZWMgPDwgNSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKwlkZWZhdWx0OgorCQlpID0gX0lPQ19OUihjbWQpOworCQlpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgIW1peHRhYmxlW2ldLnR5cGUpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbCA9IHZhbCAmIDB4ZmY7CisJCXIgPSAodmFsID4+IDgpICYgMHhmZjsKKwkJaWYgKG1peHRhYmxlW2ldLnR5cGUgPT0gTVRfNE1VVEVNT05PKQorCQkJbCA9IChyICsgbCkgLyAyOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCWlmIChyID4gMTAwKQorCQkJciA9IDEwMDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc3dpdGNoIChtaXh0YWJsZVtpXS50eXBlKSB7CisJCWNhc2UgTVRfNDoKKwkJCWlmIChsID49IDEwKQorCQkJCWwgLT0gMTA7CisJCQlpZiAociA+PSAxMCkKKwkJCQlyIC09IDEwOworCQkJZnJvYmluZGlyKHMsIG1peHRhYmxlW2ldLmxlZnQsIDB4ZjAsIGwgLyA2KTsKKwkJCWZyb2JpbmRpcihzLCBtaXh0YWJsZVtpXS5yaWdodCwgMHhmMCwgbCAvIDYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBNVF80TVVURU1PTk86CisJCQlyciA9IDA7CisJCQlpZiAobCA8IDEwKQorCQkJCXJsID0gMHg4MDsKKwkJCWVsc2UgeworCQkJCWlmIChsID49IDU1KSB7CisJCQkJCXJyID0gMHgxMDsKKwkJCQkJbCAtPSA0NTsKKwkJCQl9CisJCQkJcmwgPSAoNTUgLSBsKSAvIDM7CisJCQl9CisJCQl3cmluZGlyKHMsIG1peHRhYmxlW2ldLmxlZnQsIHJsKTsKKwkJCWZyb2JpbmRpcihzLCBtaXh0YWJsZVtpXS5yaWdodCwgfjB4MTAsIHJyKTsKKwkJCWJyZWFrOworCQkJCisJCWNhc2UgTVRfNU1VVEU6CisJCQlpZiAobCA8IDcpCisJCQkJcmwgPSAweDgwOworCQkJZWxzZQorCQkJCXJsID0gKDEwMCAtIGwpIC8gMzsKKwkJCWlmIChyIDwgNykKKwkJCQlyciA9IDB4ODA7CisJCQllbHNlCisJCQkJcnIgPSAoMTAwIC0gcikgLyAzOworCQkJd3JpbmRpcihzLCBtaXh0YWJsZVtpXS5sZWZ0LCBybCk7CisJCQl3cmluZGlyKHMsIG1peHRhYmxlW2ldLnJpZ2h0LCBycik7CisJCQlicmVhazsKKwkJCQkKKwkJY2FzZSBNVF82TVVURToKKwkJCWlmIChsIDwgNikKKwkJCQlybCA9IDB4ODA7CisJCQllbHNlCisJCQkJcmwgPSAoMTAwIC0gbCkgKiAyIC8gMzsKKwkJCWlmIChyIDwgNikKKwkJCQlyciA9IDB4ODA7CisJCQllbHNlCisJCQkJcnIgPSAoMTAwIC0gcikgKiAyIC8gMzsKKwkJCXdyaW5kaXIocywgbWl4dGFibGVbaV0ubGVmdCwgcmwpOworCQkJd3JpbmRpcihzLCBtaXh0YWJsZVtpXS5yaWdodCwgcnIpOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5fbWl4dmFsKHMsIGksIHApOworI2Vsc2UgLyogT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTICovCisJCWlmICghdm9saWR4W2ldKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXMtPm1peC52b2xbdm9saWR4W2ldLTFdID0gdmFsOworCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFt2b2xpZHhbaV0tMV0sIHApOworI2VuZGlmIC8qIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUyAqLworCX0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBpbnQgc3Zfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBzdl9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc3Zfc3RhdGUsIGRldnMpOworCQlpZiAocy0+ZGV2X21peGVyID09IG1pbm9yKQorCQkJYnJlYWs7CisJfQorICAgICAgIAlWQUxJREFURV9TVEFURShzKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBzOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzdl9yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCQorCVZBTElEQVRFX1NUQVRFKHMpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN2X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJcmV0dXJuIG1peGVyX2lvY3RsKChzdHJ1Y3Qgc3Zfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGEsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN2X21peGVyX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSBzdl9pb2N0bF9taXhkZXYsCisJLm9wZW4JCT0gc3Zfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSBzdl9yZWxlYXNlX21peGRldiwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50IGRyYWluX2RhYyhzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjb3VudCwgdG1vOworCisJaWYgKHMtPmRtYV9kYWMubWFwcGVkIHx8ICFzLT5kbWFfZGFjLnJlYWR5KQorCQlyZXR1cm4gMDsKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgICAgICBmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICBzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCA9IHMtPmRtYV9kYWMuY291bnQ7CisgICAgICAgICAgICAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBpZiAobm9uYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVCVVNZOworICAgICAgICAgICAgICAgIH0KKwkJdG1vID0gMyAqIEhaICogKGNvdW50ICsgcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgLyAyIC8gcy0+cmF0ZWRhYzsKKwkJdG1vID4+PSBzYW1wbGVfc2hpZnRbKHMtPmZtdCA+PiBTVl9DRk1UX0FTSElGVCkgJiBTVl9DRk1UX01BU0tdOworCQlpZiAoIXNjaGVkdWxlX3RpbWVvdXQodG1vICsgMSkpCisJCQlwcmludGsoS0VSTl9ERUJVRyAic3Y6IGRtYSB0aW1lZCBvdXQ/P1xuIik7CisgICAgICAgIH0KKyAgICAgICAgcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgICAgICBzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworICAgICAgICBpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FUkVTVEFSVFNZUzsKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCBzdl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDEpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSAwOworI2lmIDAKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXN2X3VwZGF0ZV9wdHIocyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworI2VuZGlmCisgICAgICAgIGFkZF93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXN3cHRyID0gcy0+ZG1hX2FkYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2FkYy5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA8IGNudCkKKwkJCWNudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2FkYy5lbmFibGVkKQorCQkJCXN0YXJ0X2FkYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KEhaKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzdjogcmVhZDogY2hpcCBsb2NrdXA/IGRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKKwkJCQkgICAgICAgcy0+ZG1hX2FkYy5kbWFzaXplLCBzLT5kbWFfYWRjLmZyYWdzaXplLCBzLT5kbWFfYWRjLmNvdW50LCAKKwkJCQkgICAgICAgcy0+ZG1hX2FkYy5od3B0ciwgcy0+ZG1hX2FkYy5zd3B0cik7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCQlzZXRfZG1hYyhzLCB2aXJ0X3RvX2J1cyhzLT5kbWFfYWRjLnJhd2J1ZiksIHMtPmRtYV9hZGMubnVtZnJhZyA8PCBzLT5kbWFfYWRjLmZyYWdzaGlmdCk7CisJCQkJLyogcHJvZ3JhbSBlbmhhbmNlZCBtb2RlIHJlZ2lzdGVycyAqLworCQkJCXdyaW5kaXIocywgU1ZfQ0lETUFDQkFTRUNPVU5UMSwgKHMtPmRtYV9hZGMuZnJhZ3NhbXBsZXMtMSkgPj4gOCk7CisJCQkJd3JpbmRpcihzLCBTVl9DSURNQUNCQVNFQ09VTlQwLCBzLT5kbWFfYWRjLmZyYWdzYW1wbGVzLTEpOworCQkJCXMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLmh3cHRyID0gcy0+ZG1hX2FkYy5zd3B0ciA9IDA7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpCisJCQkJCXJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBzLT5kbWFfYWRjLnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2FkYy5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfYWRjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9hZGMuY291bnQgLT0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9hZGMuZW5hYmxlZCkKKwkJCXN0YXJ0X2FkYyhzKTsKKwl9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfYWRjLndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN2X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisjaWYgMAorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc3ZfdXBkYXRlX3B0cihzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisjZW5kaWYKKyAgICAgICAgYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKHMtPmRtYV9kYWMuY291bnQgPCAwKSB7CisJCQlzLT5kbWFfZGFjLmNvdW50ID0gMDsKKwkJCXMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyOworCQl9CisJCXN3cHRyID0gcy0+ZG1hX2RhYy5zd3B0cjsKKwkJY250ID0gcy0+ZG1hX2RhYy5kbWFzaXplLXN3cHRyOworCQlpZiAocy0+ZG1hX2RhYy5jb3VudCArIGNudCA+IHMtPmRtYV9kYWMuZG1hc2l6ZSkKKwkJCWNudCA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIHMtPmRtYV9kYWMuY291bnQ7CisJCWlmIChjbnQgPD0gMCkKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5lbmFibGVkKQorCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KEhaKSkgeworCQkJCXByaW50ayhLRVJOX0RFQlVHICJzdjogd3JpdGU6IGNoaXAgbG9ja3VwPyBkbWFzeiAldSBmcmFnc3ogJXUgY291bnQgJWkgaHdwdHIgJXUgc3dwdHIgJXVcbiIsCisJCQkJICAgICAgIHMtPmRtYV9kYWMuZG1hc2l6ZSwgcy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcy0+ZG1hX2RhYy5jb3VudCwgCisJCQkJICAgICAgIHMtPmRtYV9kYWMuaHdwdHIsIHMtPmRtYV9kYWMuc3dwdHIpOworCQkJCXN0b3BfZGFjKHMpOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQkJc2V0X2RtYWEocywgdmlydF90b19idXMocy0+ZG1hX2RhYy5yYXdidWYpLCBzLT5kbWFfZGFjLm51bWZyYWcgPDwgcy0+ZG1hX2RhYy5mcmFnc2hpZnQpOworCQkJCS8qIHByb2dyYW0gZW5oYW5jZWQgbW9kZSByZWdpc3RlcnMgKi8KKwkJCQl3cmluZGlyKHMsIFNWX0NJRE1BQUJBU0VDT1VOVDEsIChzLT5kbWFfZGFjLmZyYWdzYW1wbGVzLTEpID4+IDgpOworCQkJCXdyaW5kaXIocywgU1ZfQ0lETUFBQkFTRUNPVU5UMCwgcy0+ZG1hX2RhYy5mcmFnc2FtcGxlcy0xKTsKKwkJCQlzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy5od3B0ciA9IHMtPmRtYV9kYWMuc3dwdHIgPSAwOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+ZG1hX2RhYy5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJc3dwdHIgPSAoc3dwdHIgKyBjbnQpICUgcy0+ZG1hX2RhYy5kbWFzaXplOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5kbWFfZGFjLnN3cHRyID0gc3dwdHI7CisJCXMtPmRtYV9kYWMuY291bnQgKz0gY250OworCQlzLT5kbWFfZGFjLmVuZGNsZWFyZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJaWYgKHMtPmRtYV9kYWMuZW5hYmxlZCkKKwkJCXN0YXJ0X2RhYyhzKTsKKwl9CisgICAgICAgIHJlbW92ZV93YWl0X3F1ZXVlKCZzLT5kbWFfZGFjLndhaXQsICZ3YWl0KTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIGtlcm5lbCBsb2NrIC0gd2UgaGF2ZSBvdXIgb3duIHNwaW5sb2NrICovCitzdGF0aWMgdW5zaWduZWQgaW50IHN2X3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1ZihzLCAxKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiBwcm9nX2RtYWJ1ZihzLCAwKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9hZGMud2FpdCwgd2FpdCk7CisJfQorCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJc3ZfdXBkYXRlX3B0cihzKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+ZG1hX2FkYy5jb3VudCA+PSAoc2lnbmVkKXMtPmRtYV9hZGMuZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfZGFjLmNvdW50ID49IChzaWduZWQpcy0+ZG1hX2RhYy5mcmFnc2l6ZSkgCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2lnbmVkKXMtPmRtYV9kYWMuZG1hc2l6ZSA+PSBzLT5kbWFfZGFjLmNvdW50ICsgKHNpZ25lZClzLT5kbWFfZGFjLmZyYWdzaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCXJldHVybiBtYXNrOworfQorCitzdGF0aWMgaW50IHN2X21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBzdl9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc3Zfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IGRtYWJ1ZiAqZGI7CisJaW50IHJldCA9IC1FSU5WQUw7CisJdW5zaWduZWQgbG9uZyBzaXplOworCisJVkFMSURBVEVfU1RBVEUocyk7CisJbG9ja19rZXJuZWwoKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWYocywgMSkpICE9IDApCisJCQlnb3RvIG91dDsKKwkJZGIgPSAmcy0+ZG1hX2RhYzsKKwl9IGVsc2UgaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWYocywgMCkpICE9IDApCisJCQlnb3RvIG91dDsKKwkJZGIgPSAmcy0+ZG1hX2FkYzsKKwl9IGVsc2UgCisJCWdvdG8gb3V0OworCXJldCA9IC1FSU5WQUw7CisJaWYgKHZtYS0+dm1fcGdvZmYgIT0gMCkKKwkJZ290byBvdXQ7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKwlpZiAoc2l6ZSA+IChQQUdFX1NJWkUgPDwgZGItPmJ1Zm9yZGVyKSkKKwkJZ290byBvdXQ7CisJcmV0ID0gLUVBR0FJTjsKKwlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCwKKwkJCQl2aXJ0X3RvX3BoeXMoZGItPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCQlzaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpCisJCWdvdG8gb3V0OworCWRiLT5tYXBwZWQgPSAxOworCXJldCA9IDA7CitvdXQ6CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgc3ZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBzdl9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc3Zfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKyAgICAgICAgYXVkaW9fYnVmX2luZm8gYWJpbmZvOworICAgICAgICBjb3VudF9pbmZvIGNpbmZvOworCWludCBjb3VudDsKKwlpbnQgdmFsLCBtYXBwZWQsIHJldDsKKwl1bnNpZ25lZCBjaGFyIGZtdG0sIGZtdGQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlWQUxJREFURV9TVEFURShzKTsKKyAgICAgICAgbWFwcGVkID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgcy0+ZG1hX2RhYy5tYXBwZWQpIHx8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgJiYgcy0+ZG1hX2FkYy5tYXBwZWQpOworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywgMC8qZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0sqLyk7CisJCXJldHVybiAwOworCQkKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSIHwgRFNQX0NBUF9NTUFQLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworCQkJcy0+ZG1hX2RhYy5zd3B0ciA9IHMtPmRtYV9kYWMuaHdwdHIgPSBzLT5kbWFfZGFjLmNvdW50ID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlcyA9IDA7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJCQlzLT5kbWFfYWRjLnN3cHRyID0gcy0+ZG1hX2FkYy5od3B0ciA9IHMtPmRtYV9hZGMuY291bnQgPSBzLT5kbWFfYWRjLnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCA+PSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCXNldF9hZGNfcmF0ZShzLCB2YWwpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMocyk7CisJCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQkJc2V0X2RhY19yYXRlKHMsIHZhbCk7CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IHMtPnJhdGVhZGMgOiBzLT5yYXRlZGFjLCBwKTsKKwkJCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJZm10ZCA9IDA7CisJCWZtdG0gPSB+MDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHMpOworCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQlpZiAodmFsKQorCQkJCWZtdGQgfD0gU1ZfQ0ZNVF9TVEVSRU8gPDwgU1ZfQ0ZNVF9DU0hJRlQ7CisJCQllbHNlCisJCQkJZm10bSAmPSB+KFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQ1NISUZUKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQlpZiAodmFsKQorCQkJCWZtdGQgfD0gU1ZfQ0ZNVF9TVEVSRU8gPDwgU1ZfQ0ZNVF9BU0hJRlQ7CisJCQllbHNlCisJCQkJZm10bSAmPSB+KFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQVNISUZUKTsKKwkJfQorCQlzZXRfZm10KHMsIGZtdG0sIGZtdGQpOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfQ0hBTk5FTFM6CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlmbXRkID0gMDsKKwkJCWZtdG0gPSB+MDsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQkJc3RvcF9hZGMocyk7CisJCQkJcy0+ZG1hX2FkYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlmbXRkIHw9IFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQ1NISUZUOworCQkJCWVsc2UKKwkJCQkJZm10bSAmPSB+KFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQ1NISUZUKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJZm10ZCB8PSBTVl9DRk1UX1NURVJFTyA8PCBTVl9DRk1UX0FTSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihTVl9DRk1UX1NURVJFTyA8PCBTVl9DRk1UX0FTSElGVCk7CisJCQl9CisJCQlzZXRfZm10KHMsIGZtdG0sIGZtdGQpOworCQl9CisJCXJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChTVl9DRk1UX1NURVJFTyA8PCBTVl9DRk1UX0NTSElGVCkgCisJCQkJCSAgIDogKFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQVNISUZUKSkpID8gMiA6IDEsIHApOworCQkKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgKi8KKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9VOCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6IC8qIFNlbGVjdHMgT05FIGZtdCovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJZm10ZCA9IDA7CisJCQlmbXRtID0gfjA7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCWZtdGQgfD0gU1ZfQ0ZNVF8xNkJJVCA8PCBTVl9DRk1UX0NTSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihTVl9DRk1UXzE2QklUIDw8IFNWX0NGTVRfQ1NISUZUKTsKKwkJCX0KKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHMpOworCQkJCXMtPmRtYV9kYWMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCWZtdGQgfD0gU1ZfQ0ZNVF8xNkJJVCA8PCBTVl9DRk1UX0FTSElGVDsKKwkJCQllbHNlCisJCQkJCWZtdG0gJj0gfihTVl9DRk1UXzE2QklUIDw8IFNWX0NGTVRfQVNISUZUKTsKKwkJCX0KKwkJCXNldF9mbXQocywgZm10bSwgZm10ZCk7CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKFNWX0NGTVRfMTZCSVQgPDwgU1ZfQ0ZNVF9DU0hJRlQpIAorCQkJCQkgICA6IChTVl9DRk1UXzE2QklUIDw8IFNWX0NGTVRfQVNISUZUKSkpID8gQUZNVF9TMTZfTEUgOiBBRk1UX1U4LCBwKTsKKwkJCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCXZhbCA9IDA7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEICYmIHMtPmVuYWJsZSAmIFNWX0NFTkFCTEVfUkUpIAorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSAmJiBzLT5lbmFibGUgJiBTVl9DRU5BQkxFX1BFKSAKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCQorCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHJldCA9ICBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJcy0+ZG1hX2FkYy5lbmFibGVkID0gMTsKKwkJCQlzdGFydF9hZGMocyk7CisJCQl9IGVsc2UgeworCQkJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDA7CisJCQkJc3RvcF9hZGMocyk7CisJCQl9CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHJldCA9IHByb2dfZG1hYnVmKHMsIDApKSkKKwkJCQkJcmV0dXJuIHJldDsKKwkJCQlzLT5kbWFfZGFjLmVuYWJsZWQgPSAxOworCQkJCXN0YXJ0X2RhYyhzKTsKKwkJCX0gZWxzZSB7CisJCQkJcy0+ZG1hX2RhYy5lbmFibGVkID0gMDsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmKHMsIDApKSAhPSAwKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc3ZfdXBkYXRlX3B0cihzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gcy0+ZG1hX2RhYy5mcmFnc2l6ZTsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGFiaW5mby5ieXRlcyA9IHMtPmRtYV9kYWMuZG1hc2l6ZSAtIGNvdW50OworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYy5udW1mcmFnOworICAgICAgICAgICAgICAgIGFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gcy0+ZG1hX2RhYy5mcmFnc2hpZnQ7ICAgICAgCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYocywgMSkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzdl91cGRhdGVfcHRyKHMpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplOworCQljb3VudCA9IHMtPmRtYV9hZGMuY291bnQ7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisgICAgICAgICAgICAgICAgYWJpbmZvLmJ5dGVzID0gY291bnQ7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bWZyYWc7CisgICAgICAgICAgICAgICAgYWJpbmZvLmZyYWdtZW50cyA9IGFiaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdDsgICAgICAKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZhYmluZm8sIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCQkKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorICAgICAgICAgICAgICAgIGZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAwKSkgIT0gMCkKKwkJCXJldHVybiB2YWw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXN2X3VwZGF0ZV9wdHIocyk7CisgICAgICAgICAgICAgICAgY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3VudCA8IDApCisJCQljb3VudCA9IDA7CisJCXJldHVybiBwdXRfdXNlcihjb3VudCwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2FkYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYocywgMSkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzdl91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfYWRjLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9hZGMuaHdwdHI7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworICAgICAgICBjYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWYocywgMCkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzdl91cGRhdGVfcHRyKHMpOworICAgICAgICAgICAgICAgIGNpbmZvLmJ5dGVzID0gcy0+ZG1hX2RhYy50b3RhbF9ieXRlczsKKwkJY291bnQgPSBzLT5kbWFfZGFjLmNvdW50OworCQlpZiAoY291bnQgPCAwKQorCQkJY291bnQgPSAwOworICAgICAgICAgICAgICAgIGNpbmZvLmJsb2NrcyA9IGNvdW50ID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworICAgICAgICAgICAgICAgIGNpbmZvLnB0ciA9IHMtPmRtYV9kYWMuaHdwdHI7CisJCWlmIChzLT5kbWFfZGFjLm1hcHBlZCkKKwkJCXMtPmRtYV9kYWMuY291bnQgJj0gcy0+ZG1hX2RhYy5mcmFnc2l6ZS0xOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZihjaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmICgodmFsID0gcHJvZ19kbWFidWYocywgMCkpKQorCQkJCXJldHVybiB2YWw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgcCk7CisJCX0KKwkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzLCAxKSkpCisJCQlyZXR1cm4gdmFsOworCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2FkYy5mcmFnc2l6ZSwgcCk7CisKKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorICAgICAgICAgICAgICAgIGlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJCXMtPmRtYV9hZGMub3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc2ZyYWdzaGlmdCA8IDQpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSA0OworCQkJaWYgKHMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSAxNTsKKwkJCWlmIChzLT5kbWFfYWRjLm9zc21heGZyYWdzIDwgNCkKKwkJCQlzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gNDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gdmFsICYgMHhmZmZmOworCQkJcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQkJaWYgKHMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDQ7CisJCQlpZiAocy0+ZG1hX2RhYy5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCQlzLT5kbWFfZGFjLm9zc2ZyYWdzaGlmdCA9IDE1OworCQkJaWYgKHMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPCA0KQorCQkJCXMtPmRtYV9kYWMub3NzbWF4ZnJhZ3MgPSA0OworCQl9CisJCXJldHVybiAwOworCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKSB8fAorCQkgICAgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFICYmIHMtPmRtYV9kYWMuc3ViZGl2aXNpb24pKQorCQkJcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKHZhbCwgcCkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHZhbCAhPSAxICYmIHZhbCAhPSAyICYmIHZhbCAhPSA0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcy0+ZG1hX2RhYy5zdWJkaXZpc2lvbiA9IHZhbDsKKwkJcmV0dXJuIDA7CisKKyAgICAgICAgY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlyZXR1cm4gcHV0X3VzZXIoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gcy0+cmF0ZWFkYyA6IHMtPnJhdGVkYWMsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCXJldHVybiBwdXRfdXNlcigocy0+Zm10ICYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSA/IChTVl9DRk1UX1NURVJFTyA8PCBTVl9DRk1UX0NTSElGVCkgCisJCQkJCSAgIDogKFNWX0NGTVRfU1RFUkVPIDw8IFNWX0NGTVRfQVNISUZUKSkpID8gMiA6IDEsIHApOworCisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0dXJuIHB1dF91c2VyKChzLT5mbXQgJiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8gKFNWX0NGTVRfMTZCSVQgPDwgU1ZfQ0ZNVF9DU0hJRlQpIAorCQkJCQkgICA6IChTVl9DRk1UXzE2QklUIDw8IFNWX0NGTVRfQVNISUZUKSkpID8gMTYgOiA4LCBwKTsKKworICAgICAgICBjYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisgICAgICAgIGNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworCQkKKwl9CisJcmV0dXJuIG1peGVyX2lvY3RsKHMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIGludCBzdl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgY2hhciBmbXRtID0gfjAsIGZtdHMgPSAwOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJc3RydWN0IHN2X3N0YXRlICpzOworCisJZm9yIChsaXN0ID0gZGV2cy5uZXh0OyA7IGxpc3QgPSBsaXN0LT5uZXh0KSB7CisJCWlmIChsaXN0ID09ICZkZXZzKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCXMgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBzdl9zdGF0ZSwgZGV2cyk7CisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKyAgICAgICAJVkFMSURBVEVfU1RBVEUocyk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gczsKKwkvKiB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgKi8KKwlkb3duKCZzLT5vcGVuX3NlbSk7CisJd2hpbGUgKHMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCXVwKCZzLT5vcGVuX3NlbSk7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl1cCgmcy0+b3Blbl9zZW0pOworCQlzY2hlZHVsZSgpOworCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcy0+b3Blbl93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJCWRvd24oJnMtPm9wZW5fc2VtKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJZm10bSAmPSB+KChTVl9DRk1UX1NURVJFTyB8IFNWX0NGTVRfMTZCSVQpIDw8IFNWX0NGTVRfQ1NISUZUKTsKKwkJaWYgKChtaW5vciAmIDB4ZikgPT0gU05EX0RFVl9EU1AxNikKKwkJCWZtdHMgfD0gU1ZfQ0ZNVF8xNkJJVCA8PCBTVl9DRk1UX0NTSElGVDsKKwkJcy0+ZG1hX2FkYy5vc3NmcmFnc2hpZnQgPSBzLT5kbWFfYWRjLm9zc21heGZyYWdzID0gcy0+ZG1hX2FkYy5zdWJkaXZpc2lvbiA9IDA7CisJCXMtPmRtYV9hZGMuZW5hYmxlZCA9IDE7CisJCXNldF9hZGNfcmF0ZShzLCA4MDAwKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWZtdG0gJj0gfigoU1ZfQ0ZNVF9TVEVSRU8gfCBTVl9DRk1UXzE2QklUKSA8PCBTVl9DRk1UX0FTSElGVCk7CisJCWlmICgobWlub3IgJiAweGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlmbXRzIHw9IFNWX0NGTVRfMTZCSVQgPDwgU1ZfQ0ZNVF9BU0hJRlQ7CisJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9IHMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSAwOworCQlzLT5kbWFfZGFjLmVuYWJsZWQgPSAxOworCQlzZXRfZGFjX3JhdGUocywgODAwMCk7CisJfQorCXNldF9mbXQocywgZm10bSwgZm10cyk7CisJcy0+b3Blbl9tb2RlIHw9IGZpbGUtPmZfbW9kZSAmIChGTU9ERV9SRUFEIHwgRk1PREVfV1JJVEUpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50IHN2X3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN2X3N0YXRlICpzID0gKHN0cnVjdCBzdl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQlkcmFpbl9kYWMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJc3RvcF9kYWMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjKTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJc3RvcF9hZGMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfYWRjKTsKKwl9CisJcy0+b3Blbl9tb2RlICY9IH4oZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUR8Rk1PREVfV1JJVEUpKTsKKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3ZfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gc3ZfcmVhZCwKKwkud3JpdGUJCT0gc3Zfd3JpdGUsCisJLnBvbGwJCT0gc3ZfcG9sbCwKKwkuaW9jdGwJCT0gc3ZfaW9jdGwsCisJLm1tYXAJCT0gc3ZfbW1hcCwKKwkub3BlbgkJPSBzdl9vcGVuLAorCS5yZWxlYXNlCT0gc3ZfcmVsZWFzZSwKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3NpemVfdCBzdl9taWRpX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCBzdl9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc3Zfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBwdHI7CisJaW50IGNudDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXQgPSAwOworCWFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLml3YWl0LCAmd2FpdCk7CisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlwdHIgPSBzLT5taWRpLmlyZDsKKwkJY250ID0gTUlESUlOQlVGIC0gcHRyOworCQlpZiAocy0+bWlkaS5pY250IDwgY250KQorCQkJY250ID0gcy0+bWlkaS5pY250OworCQlpZiAoY250IDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSAtRUFHQUlOOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIHMtPm1pZGkuaWJ1ZiArIHB0ciwgY250KSkgeworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCXB0ciA9IChwdHIgKyBjbnQpICUgTUlESUlOQlVGOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQlzLT5taWRpLmlyZCA9IHB0cjsKKwkJcy0+bWlkaS5pY250IC09IGNudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCWJyZWFrOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkuaXdhaXQsICZ3YWl0KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCBzdl9taWRpX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgcHRyOworCWludCBjbnQ7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKwlyZXQgPSAwOworICAgICAgICBhZGRfd2FpdF9xdWV1ZSgmcy0+bWlkaS5vd2FpdCwgJndhaXQpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcHRyID0gcy0+bWlkaS5vd3I7CisJCWNudCA9IE1JRElPVVRCVUYgLSBwdHI7CisJCWlmIChzLT5taWRpLm9jbnQgKyBjbnQgPiBNSURJT1VUQlVGKQorCQkJY250ID0gTUlESU9VVEJVRiAtIHMtPm1pZGkub2NudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlzdl9oYW5kbGVfbWlkaShzKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJc2NoZWR1bGUoKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIocy0+bWlkaS5vYnVmICsgcHRyLCBidWZmZXIsIGNudCkpIHsKKwkJCWlmICghcmV0KQorCQkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlwdHIgPSAocHRyICsgY250KSAlIE1JRElPVVRCVUY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPm1pZGkub3dyID0gcHRyOworCQlzLT5taWRpLm9jbnQgKz0gY250OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJc3ZfaGFuZGxlX21pZGkocyk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwl9CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSB3ZSBoYXZlIG91ciBvd24gc3BpbmxvY2sgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgc3ZfbWlkaV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHN2X3N0YXRlICpzID0gKHN0cnVjdCBzdl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5taWRpLm93YWl0LCB3YWl0KTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5taWRpLml3YWl0LCB3YWl0KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChzLT5taWRpLmljbnQgPiAwKQorCQkJbWFzayB8PSBQT0xMSU4gfCBQT0xMUkROT1JNOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHMtPm1pZGkub2NudCA8IE1JRElPVVRCVUYpCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgc3ZfbWlkaV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBzdl9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc3Zfc3RhdGUsIGRldnMpOworCQlpZiAocy0+ZGV2X21pZGkgPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiAoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWlmICghKHMtPm9wZW5fbW9kZSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKSkpIHsKKwkJcy0+bWlkaS5pcmQgPSBzLT5taWRpLml3ciA9IHMtPm1pZGkuaWNudCA9IDA7CisJCXMtPm1pZGkub3JkID0gcy0+bWlkaS5vd3IgPSBzLT5taWRpLm9jbnQgPSAwOworCQkvL291dGIoaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfQ09OVFJPTCkgfCBTVl9DQ1RSTF9XQVZFVEFCTEUsIHMtPmlvZW5oICsgU1ZfQ09ERUNfQ09OVFJPTCk7CisJCW91dGIoaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfSU5UTUFTSykgfCBTVl9DSU5UTUFTS19NSURJLCBzLT5pb2VuaCArIFNWX0NPREVDX0lOVE1BU0spOworCQl3cmluZGlyKHMsIFNWX0NJVUFSVENPTlRST0wsIDUpOyAvKiBvdXRwdXQgTUlESSBkYXRhIHRvIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBzeW50aCAqLworCQl3cmluZGlyKHMsIFNWX0NJV0FWRVRBQkxFU1JDLCAxKTsgLyogV2F2ZXRhYmxlIGluIFBDIFJBTSAqLworCQlvdXRiKDB4ZmYsIHMtPmlvbWlkaSsxKTsgLyogcmVzZXQgY29tbWFuZCAqLworCQlvdXRiKDB4M2YsIHMtPmlvbWlkaSsxKTsgLyogdWFydCBjb21tYW5kICovCisJCWlmICghKGluYihzLT5pb21pZGkrMSkgJiAweDgwKSkKKwkJCWluYihzLT5pb21pZGkpOworCQlzLT5taWRpLmlyZCA9IHMtPm1pZGkuaXdyID0gcy0+bWlkaS5pY250ID0gMDsKKwkJaW5pdF90aW1lcigmcy0+bWlkaS50aW1lcik7CisJCXMtPm1pZGkudGltZXIuZXhwaXJlcyA9IGppZmZpZXMrMTsKKwkJcy0+bWlkaS50aW1lci5kYXRhID0gKHVuc2lnbmVkIGxvbmcpczsKKwkJcy0+bWlkaS50aW1lci5mdW5jdGlvbiA9IHN2X21pZGlfdGltZXI7CisJCWFkZF90aW1lcigmcy0+bWlkaS50aW1lcik7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXMtPm1pZGkuaXJkID0gcy0+bWlkaS5pd3IgPSBzLT5taWRpLmljbnQgPSAwOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJcy0+bWlkaS5vcmQgPSBzLT5taWRpLm93ciA9IHMtPm1pZGkub2NudCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5vcGVuX21vZGUgfD0gKGZpbGUtPmZfbW9kZSA8PCBGTU9ERV9NSURJX1NISUZUKSAmIChGTU9ERV9NSURJX1JFQUQgfCBGTU9ERV9NSURJX1dSSVRFKTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCBzdl9taWRpX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHN2X3N0YXRlICpzID0gKHN0cnVjdCBzdl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGNvdW50LCB0bW87CisKKwlWQUxJREFURV9TVEFURShzKTsKKworCWxvY2tfa2VybmVsKCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWFkZF93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCWZvciAoOzspIHsKKwkJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCQljb3VudCA9IHMtPm1pZGkub2NudDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChjb3VudCA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJCWJyZWFrOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPm1pZGkub3dhaXQsICZ3YWl0KTsKKwkJCQlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCQkJCXVubG9ja19rZXJuZWwoKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJdG1vID0gKGNvdW50ICogSFopIC8gMzEwMDsKKwkJCWlmICghc2NoZWR1bGVfdGltZW91dCh0bW8gPyA6IDEpICYmIHRtbykKKwkJCQlwcmludGsoS0VSTl9ERUJVRyAic3Y6IG1pZGkgdGltZWQgb3V0Pz9cbiIpOworCQl9CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5taWRpLm93YWl0LCAmd2FpdCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJfQorCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlzLT5vcGVuX21vZGUgJj0gfigoZmlsZS0+Zl9tb2RlIDw8IEZNT0RFX01JRElfU0hJRlQpICYgKEZNT0RFX01JRElfUkVBRHxGTU9ERV9NSURJX1dSSVRFKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5vcGVuX21vZGUgJiAoRk1PREVfTUlESV9SRUFEIHwgRk1PREVfTUlESV9XUklURSkpKSB7CisJCW91dGIoaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfSU5UTUFTSykgJiB+U1ZfQ0lOVE1BU0tfTUlESSwgcy0+aW9lbmggKyBTVl9DT0RFQ19JTlRNQVNLKTsKKwkJZGVsX3RpbWVyKCZzLT5taWRpLnRpbWVyKTsJCQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJd2FrZV91cCgmcy0+b3Blbl93YWl0KTsKKwl1cCgmcy0+b3Blbl9zZW0pOworCXVubG9ja19rZXJuZWwoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHN2X21pZGlfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gc3ZfbWlkaV9yZWFkLAorCS53cml0ZQkJPSBzdl9taWRpX3dyaXRlLAorCS5wb2xsCQk9IHN2X21pZGlfcG9sbCwKKwkub3BlbgkJPSBzdl9taWRpX29wZW4sCisJLnJlbGVhc2UJPSBzdl9taWRpX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBzdl9kbWZtX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBvcF9vZmZzZXRbMThdID0geworCQkweDAwLCAweDAxLCAweDAyLCAweDAzLCAweDA0LCAweDA1LAorCQkweDA4LCAweDA5LCAweDBBLCAweDBCLCAweDBDLCAweDBELAorCQkweDEwLCAweDExLCAweDEyLCAweDEzLCAweDE0LCAweDE1CisJfTsKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSAoc3RydWN0IHN2X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbV9mbV92b2ljZSB2OworCXN0cnVjdCBkbV9mbV9ub3RlIG47CisJc3RydWN0IGRtX2ZtX3BhcmFtcyBwOworCXVuc2lnbmVkIGludCBpbzsKKwl1bnNpZ25lZCBpbnQgcmVnYjsKKworCXN3aXRjaCAoY21kKSB7CQkKKwljYXNlIEZNX0lPQ1RMX1JFU0VUOgorCQlmb3IgKHJlZ2IgPSAweGIwOyByZWdiIDwgMHhiOTsgcmVnYisrKSB7CisJCQlvdXRiKHJlZ2IsIHMtPmlvc3ludGgpOworCQkJb3V0YigwLCBzLT5pb3N5bnRoKzEpOworCQkJb3V0YihyZWdiLCBzLT5pb3N5bnRoKzIpOworCQkJb3V0YigwLCBzLT5pb3N5bnRoKzMpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBGTV9JT0NUTF9QTEFZX05PVEU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YobikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmIChuLnZvaWNlID49IDE4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChuLnZvaWNlID49IDkpIHsKKwkJCXJlZ2IgPSBuLnZvaWNlIC0gOTsKKwkJCWlvID0gcy0+aW9zeW50aCsyOworCQl9IGVsc2UgeworCQkJcmVnYiA9IG4udm9pY2U7CisJCQlpbyA9IHMtPmlvc3ludGg7CisJCX0KKwkJb3V0YigweGEwICsgcmVnYiwgaW8pOworCQlvdXRiKG4uZm51bSAmIDB4ZmYsIGlvKzEpOworCQlvdXRiKDB4YjAgKyByZWdiLCBpbyk7CisJCW91dGIoKChuLmZudW0gPj4gOCkgJiAzKSB8ICgobi5vY3RhdmUgJiA3KSA8PCAyKSB8ICgobi5rZXlfb24gJiAxKSA8PCA1KSwgaW8rMSk7CisJCXJldHVybiAwOworCisJY2FzZSBGTV9JT0NUTF9TRVRfVk9JQ0U6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmdiwgKHZvaWQgX191c2VyICopYXJnLCBzaXplb2YodikpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2LnZvaWNlID49IDE4KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXJlZ2IgPSBvcF9vZmZzZXRbdi52b2ljZV07CisJCWlvID0gcy0+aW9zeW50aCArICgodi5vcCAmIDEpIDw8IDEpOworCQlvdXRiKDB4MjAgKyByZWdiLCBpbyk7CisJCW91dGIoKCh2LmFtICYgMSkgPDwgNykgfCAoKHYudmlicmF0byAmIDEpIDw8IDYpIHwgKCh2LmRvX3N1c3RhaW4gJiAxKSA8PCA1KSB8IAorCQkgICAgICgodi5rYmRfc2NhbGUgJiAxKSA8PCA0KSB8ICh2Lmhhcm1vbmljICYgMHhmKSwgaW8rMSk7CisJCW91dGIoMHg0MCArIHJlZ2IsIGlvKTsKKwkJb3V0YigoKHYuc2NhbGVfbGV2ZWwgJiAweDMpIDw8IDYpIHwgKHYudm9sdW1lICYgMHgzZiksIGlvKzEpOworCQlvdXRiKDB4NjAgKyByZWdiLCBpbyk7CisJCW91dGIoKCh2LmF0dGFjayAmIDB4ZikgPDwgNCkgfCAodi5kZWNheSAmIDB4ZiksIGlvKzEpOworCQlvdXRiKDB4ODAgKyByZWdiLCBpbyk7CisJCW91dGIoKCh2LnN1c3RhaW4gJiAweGYpIDw8IDQpIHwgKHYucmVsZWFzZSAmIDB4ZiksIGlvKzEpOworCQlvdXRiKDB4ZTAgKyByZWdiLCBpbyk7CisJCW91dGIodi53YXZlZm9ybSAmIDB4NywgaW8rMSk7CisJCWlmIChuLnZvaWNlID49IDkpIHsKKwkJCXJlZ2IgPSBuLnZvaWNlIC0gOTsKKwkJCWlvID0gcy0+aW9zeW50aCsyOworCQl9IGVsc2UgeworCQkJcmVnYiA9IG4udm9pY2U7CisJCQlpbyA9IHMtPmlvc3ludGg7CisJCX0KKwkJb3V0YigweGMwICsgcmVnYiwgaW8pOworCQlvdXRiKCgodi5yaWdodCAmIDEpIDw8IDUpIHwgKCh2LmxlZnQgJiAxKSA8PCA0KSB8ICgodi5mZWVkYmFjayAmIDcpIDw8IDEpIHwKKwkJICAgICAodi5jb25uZWN0aW9uICYgMSksIGlvKzEpOworCQlyZXR1cm4gMDsKKwkJCisJY2FzZSBGTV9JT0NUTF9TRVRfUEFSQU1TOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJnAsICh2b2lkICpfX3VzZXIgKWFyZywgc2l6ZW9mKHApKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlvdXRiKDB4MDgsIHMtPmlvc3ludGgpOworCQlvdXRiKChwLmtiZF9zcGxpdCAmIDEpIDw8IDYsIHMtPmlvc3ludGgrMSk7CisJCW91dGIoMHhiZCwgcy0+aW9zeW50aCk7CisJCW91dGIoKChwLmFtX2RlcHRoICYgMSkgPDwgNykgfCAoKHAudmliX2RlcHRoICYgMSkgPDwgNikgfCAoKHAucmh5dGhtICYgMSkgPDwgNSkgfCAoKHAuYmFzcyAmIDEpIDw8IDQpIHwKKwkJICAgICAoKHAuc25hcmUgJiAxKSA8PCAzKSB8ICgocC50b210b20gJiAxKSA8PCAyKSB8ICgocC5jeW1iYWwgJiAxKSA8PCAxKSB8IChwLmhpaGF0ICYgMSksIHMtPmlvc3ludGgrMSk7CisJCXJldHVybiAwOworCisJY2FzZSBGTV9JT0NUTF9TRVRfT1BMOgorCQlvdXRiKDQsIHMtPmlvc3ludGgrMik7CisJCW91dGIoYXJnLCBzLT5pb3N5bnRoKzMpOworCQlyZXR1cm4gMDsKKworCWNhc2UgRk1fSU9DVExfU0VUX01PREU6CisJCW91dGIoNSwgcy0+aW9zeW50aCsyKTsKKwkJb3V0YihhcmcgJiAxLCBzLT5pb3N5bnRoKzMpOworCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludCBzdl9kbWZtX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXN0cnVjdCBzdl9zdGF0ZSAqczsKKworCWZvciAobGlzdCA9IGRldnMubmV4dDsgOyBsaXN0ID0gbGlzdC0+bmV4dCkgeworCQlpZiAobGlzdCA9PSAmZGV2cykKKwkJCXJldHVybiAtRU5PREVWOworCQlzID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3Qgc3Zfc3RhdGUsIGRldnMpOworCQlpZiAocy0+ZGV2X2RtZm0gPT0gbWlub3IpCisJCQlicmVhazsKKwl9CisgICAgICAgCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisJLyogd2FpdCBmb3IgZGV2aWNlIHRvIGJlY29tZSBmcmVlICovCisJZG93bigmcy0+b3Blbl9zZW0pOworCXdoaWxlIChzLT5vcGVuX21vZGUgJiBGTU9ERV9ETUZNKSB7CisJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJdXAoJnMtPm9wZW5fc2VtKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKwkJYWRkX3dhaXRfcXVldWUoJnMtPm9wZW5fd2FpdCwgJndhaXQpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXVwKCZzLT5vcGVuX3NlbSk7CisJCXNjaGVkdWxlKCk7CisJCXJlbW92ZV93YWl0X3F1ZXVlKCZzLT5vcGVuX3dhaXQsICZ3YWl0KTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJcmV0dXJuIC1FUkVTVEFSVFNZUzsKKwkJZG93bigmcy0+b3Blbl9zZW0pOworCX0KKwkvKiBpbml0IHRoZSBzdHVmZiAqLworCW91dGIoMSwgcy0+aW9zeW50aCk7CisJb3V0YigweDIwLCBzLT5pb3N5bnRoKzEpOyAvKiBlbmFibGUgd2F2ZWZvcm1zICovCisJb3V0Yig0LCBzLT5pb3N5bnRoKzIpOworCW91dGIoMCwgcy0+aW9zeW50aCszKTsgIC8qIG5vIDRvcCBlbmFibGVkICovCisJb3V0Yig1LCBzLT5pb3N5bnRoKzIpOworCW91dGIoMSwgcy0+aW9zeW50aCszKTsgIC8qIGVuYWJsZSBPUEwzICovCisJcy0+b3Blbl9tb2RlIHw9IEZNT0RFX0RNRk07CisJdXAoJnMtPm9wZW5fc2VtKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgc3ZfZG1mbV9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBzdl9zdGF0ZSAqcyA9IChzdHJ1Y3Qgc3Zfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IHJlZ2I7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlsb2NrX2tlcm5lbCgpOworCWRvd24oJnMtPm9wZW5fc2VtKTsKKwlzLT5vcGVuX21vZGUgJj0gfkZNT0RFX0RNRk07CisJZm9yIChyZWdiID0gMHhiMDsgcmVnYiA8IDB4Yjk7IHJlZ2IrKykgeworCQlvdXRiKHJlZ2IsIHMtPmlvc3ludGgpOworCQlvdXRiKDAsIHMtPmlvc3ludGgrMSk7CisJCW91dGIocmVnYiwgcy0+aW9zeW50aCsyKTsKKwkJb3V0YigwLCBzLT5pb3N5bnRoKzMpOworCX0KKwl3YWtlX3VwKCZzLT5vcGVuX3dhaXQpOworCXVwKCZzLT5vcGVuX3NlbSk7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgc3ZfZG1mbV9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gc3ZfZG1mbV9pb2N0bCwKKwkub3BlbgkJPSBzdl9kbWZtX29wZW4sCisJLnJlbGVhc2UJPSBzdl9kbWZtX3JlbGVhc2UsCit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbWF4aW11bSBudW1iZXIgb2YgZGV2aWNlczsgb25seSB1c2VkIGZvciBjb21tYW5kIGxpbmUgcGFyYW1zICovCisjZGVmaW5lIE5SX0RFVklDRSA1CisKK3N0YXRpYyBpbnQgcmV2ZXJiW05SX0RFVklDRV07CisKKyNpZiAwCitzdGF0aWMgaW50IHdhdmV0YWJsZVtOUl9ERVZJQ0VdOworI2VuZGlmCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZGV2aW5kZXg7CisKK21vZHVsZV9wYXJhbV9hcnJheShyZXZlcmIsIGJvb2wsIE5VTEwsIDApOworTU9EVUxFX1BBUk1fREVTQyhyZXZlcmIsICJpZiAxIGVuYWJsZXMgdGhlIHJldmVyYiBjaXJjdWl0cnkuIE5PVEU6IHlvdXIgY2FyZCBtdXN0IGhhdmUgdGhlIHJldmVyYiBSQU0iKTsKKyNpZiAwCitNT0RVTEVfUEFSTSh3YXZldGFibGUsICIxLSIgX19NT0RVTEVfU1RSSU5HKE5SX0RFVklDRSkgImkiKTsKK01PRFVMRV9QQVJNX0RFU0Mod2F2ZXRhYmxlLCAiaWYgMSB0aGUgd2F2ZXRhYmxlIHN5bnRoIGlzIGVuYWJsZWQiKTsKKyNlbmRpZgorCitNT0RVTEVfQVVUSE9SKCJUaG9tYXMgTS4gU2FpbGVyLCBzYWlsZXJAaWZlLmVlLmV0aHouY2gsIGhiOWpueEBoYjl3LmNoZS5ldSIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJTMyBTb25pY1ZpYmVzIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RydWN0IGluaXR2b2wgeworCWludCBtaXhjaDsKKwlpbnQgdm9sOworfSBpbml0dm9sW10gX19kZXZpbml0ZGF0YSA9IHsKKwl7IFNPVU5EX01JWEVSX1dSSVRFX1JFQ0xFViwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FMSwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9DRCwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FLCAweDQwNDAgfSwKKwl7IFNPVU5EX01JWEVSX1dSSVRFX01JQywgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9TWU5USCwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9MSU5FMiwgMHg0MDQwIH0sCisJeyBTT1VORF9NSVhFUl9XUklURV9WT0xVTUUsIDB4NDA0MCB9LAorCXsgU09VTkRfTUlYRVJfV1JJVEVfUENNLCAweDQwNDAgfQorfTsKKworI2RlZmluZSBSU1JDSVNJT1JFR0lPTihkZXYsbnVtKSAocGNpX3Jlc291cmNlX3N0YXJ0KChkZXYpLCAobnVtKSkgIT0gMCAmJiBcCisJCQkJIChwY2lfcmVzb3VyY2VfZmxhZ3MoKGRldiksIChudW0pKSAmIElPUkVTT1VSQ0VfSU8pKQorCitzdGF0aWMgaW50IF9fZGV2aW5pdCBzdl9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3Qgc3Zfc3RhdGUgKnMsIGludCBpb19wb3J0KQoreworCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvX3BvcnQsIFNWX0VYVEVOVF9HQU1FLCAiUzMgU29uaWNWaWJlcyBHYW1lcG9ydCIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Y6IGdhbWVwb3J0IGlvIHBvcnRzIGFyZSBpbiB1c2VcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCXMtPmdhbWVwb3J0ID0gZ3AgPSBnYW1lcG9ydF9hbGxvY2F0ZV9wb3J0KCk7CisJaWYgKCFncCkgeworCQlwcmludGsoS0VSTl9FUlIgInN2OiBjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZWxlYXNlX3JlZ2lvbihpb19wb3J0LCBTVl9FWFRFTlRfR0FNRSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWdhbWVwb3J0X3NldF9uYW1lKGdwLCAiUzMgU29uaWNWaWJlcyBHYW1lcG9ydCIpOworCWdhbWVwb3J0X3NldF9waHlzKGdwLCAiaXNhJTA0eC9nYW1lcG9ydDAiLCBpb19wb3J0KTsKKwlncC0+ZGV2LnBhcmVudCA9ICZzLT5kZXYtPmRldjsKKwlncC0+aW8gPSBpb19wb3J0OworCisJZ2FtZXBvcnRfcmVnaXN0ZXJfcG9ydChncCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2RldmluaXQgc3ZfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKnBjaWlkKQoreworCXN0YXRpYyBjaGFyIF9fZGV2aW5pdGRhdGEgc3ZfZGRtYV9uYW1lW10gPSAiUzMgSW5jLiBTb25pY1ZpYmVzIERETUEgQ29udHJvbGxlciI7CisgICAgICAgCXN0cnVjdCBzdl9zdGF0ZSAqczsKKwltbV9zZWdtZW50X3QgZnM7CisJaW50IGksIHZhbCwgcmV0OworCWludCBncGlvOworCWNoYXIgKmRkbWFuYW1lOworCXVuc2lnbmVkIGRkbWFuYW1lbGVuOworCisJaWYgKChyZXQ9cGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIVJTUkNJU0lPUkVHSU9OKHBjaWRldiwgUkVTT1VSQ0VfU0IpIHx8CisJICAgICFSU1JDSVNJT1JFR0lPTihwY2lkZXYsIFJFU09VUkNFX0VOSCkgfHwKKwkgICAgIVJTUkNJU0lPUkVHSU9OKHBjaWRldiwgUkVTT1VSQ0VfU1lOVEgpIHx8CisJICAgICFSU1JDSVNJT1JFR0lPTihwY2lkZXYsIFJFU09VUkNFX01JREkpIHx8CisJICAgICFSU1JDSVNJT1JFR0lPTihwY2lkZXYsIFJFU09VUkNFX0dBTUUpKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAocGNpZGV2LT5pcnEgPT0gMCkKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKHBjaV9zZXRfZG1hX21hc2socGNpZGV2LCAweDAwZmZmZmZmKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzb25pY3ZpYmVzOiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCAyNGJpdCBQQ0kgYnVzbWFzdGVyIERNQVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwkvKiB0cnkgdG8gYWxsb2NhdGUgYSBERE1BIHJlc291cmNlIGlmIG5vdCBhbHJlYWR5IGF2YWlsYWJsZSAqLworCWlmICghUlNSQ0lTSU9SRUdJT04ocGNpZGV2LCBSRVNPVVJDRV9ERE1BKSkgeworCQlwY2lkZXYtPnJlc291cmNlW1JFU09VUkNFX0RETUFdLnN0YXJ0ID0gMDsKKwkJcGNpZGV2LT5yZXNvdXJjZVtSRVNPVVJDRV9ERE1BXS5lbmQgPSAyKlNWX0VYVEVOVF9ETUEtMTsKKwkJcGNpZGV2LT5yZXNvdXJjZVtSRVNPVVJDRV9ERE1BXS5mbGFncyA9IFBDSV9CQVNFX0FERFJFU1NfU1BBQ0VfSU8gfCBJT1JFU09VUkNFX0lPOworCQlkZG1hbmFtZWxlbiA9IHN0cmxlbihzdl9kZG1hX25hbWUpKzE7CisJCWlmICghKGRkbWFuYW1lID0ga21hbGxvYyhkZG1hbmFtZWxlbiwgR0ZQX0tFUk5FTCkpKQorCQkJcmV0dXJuIC0xOworCQltZW1jcHkoZGRtYW5hbWUsIHN2X2RkbWFfbmFtZSwgZGRtYW5hbWVsZW4pOworCQlwY2lkZXYtPnJlc291cmNlW1JFU09VUkNFX0RETUFdLm5hbWUgPSBkZG1hbmFtZTsKKwkJaWYgKHBjaV9hc3NpZ25fcmVzb3VyY2UocGNpZGV2LCBSRVNPVVJDRV9ERE1BKSkgeworCQkJcGNpZGV2LT5yZXNvdXJjZVtSRVNPVVJDRV9ERE1BXS5uYW1lID0gTlVMTDsKKwkJCWtmcmVlKGRkbWFuYW1lKTsKKwkJCXByaW50ayhLRVJOX0VSUiAic3Y6IGNhbm5vdCBhbGxvY2F0ZSBERE1BIGNvbnRyb2xsZXIgaW8gcG9ydHNcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwlpZiAoIShzID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHN2X3N0YXRlKSwgR0ZQX0tFUk5FTCkpKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInN2OiBvdXQgb2YgbWVtb3J5XG4iKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCW1lbXNldChzLCAwLCBzaXplb2Yoc3RydWN0IHN2X3N0YXRlKSk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy53YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfZGFjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPm9wZW5fd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5pd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+bWlkaS5vd2FpdCk7CisJaW5pdF9NVVRFWCgmcy0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZzLT5sb2NrKTsKKwlzLT5tYWdpYyA9IFNWX01BR0lDOworCXMtPmRldiA9IHBjaWRldjsKKwlzLT5pb3NiID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgUkVTT1VSQ0VfU0IpOworCXMtPmlvZW5oID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgUkVTT1VSQ0VfRU5IKTsKKwlzLT5pb3N5bnRoID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgUkVTT1VSQ0VfU1lOVEgpOworCXMtPmlvbWlkaSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIFJFU09VUkNFX01JREkpOworCXMtPmlvZG1hYSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIFJFU09VUkNFX0RETUEpOworCXMtPmlvZG1hYyA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIFJFU09VUkNFX0RETUEpICsgU1ZfRVhURU5UX0RNQTsKKwlncGlvID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBjaWRldiwgUkVTT1VSQ0VfR0FNRSk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIDB4NDAsIHMtPmlvZG1hYSB8IDkpOyAgLyogZW5hYmxlIGFuZCB1c2UgZXh0ZW5kZWQgbW9kZSAqLworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpZGV2LCAweDQ4LCBzLT5pb2RtYWMgfCA5KTsgIC8qIGVuYWJsZSAqLworCXByaW50ayhLRVJOX0RFQlVHICJzdjogaW8gcG9ydHM6ICUjbHggJSNseCAlI2x4ICUjbHggJSN4ICUjeCAlI3hcbiIsCisJICAgICAgIHMtPmlvc2IsIHMtPmlvZW5oLCBzLT5pb3N5bnRoLCBzLT5pb21pZGksIGdwaW8sIHMtPmlvZG1hYSwgcy0+aW9kbWFjKTsKKwlzLT5pcnEgPSBwY2lkZXYtPmlycTsKKwkKKwkvKiBoYWNrICovCisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lkZXYsIDB4NjAsIHdhdmV0YWJsZV9tZW0gPj4gMTIpOyAgLyogd2F2ZXRhYmxlIGJhc2UgYWRkcmVzcyAqLworCisJcmV0ID0gLUVCVVNZOworCWlmICghcmVxdWVzdF9yZWdpb24ocy0+aW9lbmgsIFNWX0VYVEVOVF9FTkgsICJTMyBTb25pY1ZpYmVzIFBDTSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Y6IGlvIHBvcnRzICUjbHgtJSNseCBpbiB1c2VcbiIsIHMtPmlvZW5oLCBzLT5pb2VuaCtTVl9FWFRFTlRfRU5ILTEpOworCQlnb3RvIGVycl9yZWdpb241OworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvZG1hYSwgU1ZfRVhURU5UX0RNQSwgIlMzIFNvbmljVmliZXMgRE1BQSIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Y6IGlvIHBvcnRzICUjeC0lI3ggaW4gdXNlXG4iLCBzLT5pb2RtYWEsIHMtPmlvZG1hYStTVl9FWFRFTlRfRE1BLTEpOworCQlnb3RvIGVycl9yZWdpb240OworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvZG1hYywgU1ZfRVhURU5UX0RNQSwgIlMzIFNvbmljVmliZXMgRE1BQyIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Y6IGlvIHBvcnRzICUjeC0lI3ggaW4gdXNlXG4iLCBzLT5pb2RtYWMsIHMtPmlvZG1hYytTVl9FWFRFTlRfRE1BLTEpOworCQlnb3RvIGVycl9yZWdpb24zOworCX0KKwlpZiAoIXJlcXVlc3RfcmVnaW9uKHMtPmlvbWlkaSwgU1ZfRVhURU5UX01JREksICJTMyBTb25pY1ZpYmVzIE1pZGkiKSkgeworCQlwcmludGsoS0VSTl9FUlIgInN2OiBpbyBwb3J0cyAlI2x4LSUjbHggaW4gdXNlXG4iLCBzLT5pb21pZGksIHMtPmlvbWlkaStTVl9FWFRFTlRfTUlESS0xKTsKKwkJZ290byBlcnJfcmVnaW9uMjsKKwl9CisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihzLT5pb3N5bnRoLCBTVl9FWFRFTlRfU1lOVEgsICJTMyBTb25pY1ZpYmVzIFN5bnRoIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzdjogaW8gcG9ydHMgJSNseC0lI2x4IGluIHVzZVxuIiwgcy0+aW9zeW50aCwgcy0+aW9zeW50aCtTVl9FWFRFTlRfU1lOVEgtMSk7CisJCWdvdG8gZXJyX3JlZ2lvbjE7CisJfQorCisJLyogaW5pdGlhbGl6ZSBjb2RlYyByZWdpc3RlcnMgKi8KKwlvdXRiKDB4ODAsIHMtPmlvZW5oICsgU1ZfQ09ERUNfQ09OVFJPTCk7IC8qIGFzc2VydCByZXNldCAqLworCXVkZWxheSg1MCk7CisJb3V0YigweDAwLCBzLT5pb2VuaCArIFNWX0NPREVDX0NPTlRST0wpOyAvKiBkZWFzc2VydCByZXNldCAqLworCXVkZWxheSg1MCk7CisJb3V0YihTVl9DQ1RSTF9JTlRBRFJJVkUgfCBTVl9DQ1RSTF9FTkhBTkNFRCAvKnwgU1ZfQ0NUUkxfV0FWRVRBQkxFICovCisJICAgICB8IChyZXZlcmJbZGV2aW5kZXhdID8gU1ZfQ0NUUkxfUkVWRVJCIDogMCksIHMtPmlvZW5oICsgU1ZfQ09ERUNfQ09OVFJPTCk7CisJaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfU1RBVFVTKTsgLyogY2xlYXIgaW50cyAqLworCXdyaW5kaXIocywgU1ZfQ0lEUklWRUNPTlRST0wsIDApOyAgLyogZHJpdmUgY3VycmVudCAxNm1BICovCisJd3JpbmRpcihzLCBTVl9DSUVOQUJMRSwgcy0+ZW5hYmxlID0gMCk7ICAvKiBkaXNhYmxlIERNQUEgYW5kIERNQUMgKi8KKwlvdXRiKH4oU1ZfQ0lOVE1BU0tfRE1BQSB8IFNWX0NJTlRNQVNLX0RNQUMpLCBzLT5pb2VuaCArIFNWX0NPREVDX0lOVE1BU0spOworCS8qIG91dGIoMHhmZiwgcy0+aW9kbWFhICsgU1ZfRE1BX1JFU0VUKTsgKi8KKwkvKiBvdXRiKDB4ZmYsIHMtPmlvZG1hYyArIFNWX0RNQV9SRVNFVCk7ICovCisJaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfU1RBVFVTKTsgLyogYWNrIGludGVycnVwdHMgKi8KKwl3cmluZGlyKHMsIFNWX0NJQURDQ0xLU09VUkNFLCAwKTsgLyogdXNlIHBsbCBhcyBBREMgY2xvY2sgc291cmNlICovCisJd3JpbmRpcihzLCBTVl9DSUFOQUxPR1BXUkRPV04sIDApOyAvKiBwb3dlciB1cCB0aGUgYW5hbG9nIHBhcnRzIG9mIHRoZSBkZXZpY2UgKi8KKwl3cmluZGlyKHMsIFNWX0NJRElHSVRBTFBXUkRPV04sIDApOyAvKiBwb3dlciB1cCB0aGUgZGlnaXRhbCBwYXJ0cyBvZiB0aGUgZGV2aWNlICovCisJc2V0cGxsKHMsIFNWX0NJQURDUExMTSwgODAwMCk7CisJd3JpbmRpcihzLCBTVl9DSVNSU1NQQUNFLCAweDgwKTsgLyogU1JTIG9mZiAqLworCXdyaW5kaXIocywgU1ZfQ0lQQ01TUjAsICg4MDAwICogNjU1MzYgLyBGVUxMUkFURSkgJiAweGZmKTsKKwl3cmluZGlyKHMsIFNWX0NJUENNU1IxLCAoKDgwMDAgKiA2NTUzNiAvIEZVTExSQVRFKSA+PiA4KSAmIDB4ZmYpOworCXdyaW5kaXIocywgU1ZfQ0lBRENPVVRQVVQsIDApOworCS8qIHJlcXVlc3QgaXJxICovCisJaWYgKChyZXQ9cmVxdWVzdF9pcnEocy0+aXJxLHN2X2ludGVycnVwdCxTQV9TSElSUSwiUzMgU29uaWNWaWJlcyIscykpKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3Y6IGlycSAldSBpbiB1c2VcbiIsIHMtPmlycSk7CisJCWdvdG8gZXJyX2lycTsKKwl9CisJcHJpbnRrKEtFUk5fSU5GTyAic3Y6IGZvdW5kIGFkYXB0ZXIgYXQgaW8gJSNseCBpcnEgJXUgZG1hYSAlIzA2eCBkbWFjICUjMDZ4IHJldmlzaW9uICV1XG4iLAorCSAgICAgICBzLT5pb2VuaCwgcy0+aXJxLCBzLT5pb2RtYWEsIHMtPmlvZG1hYywgcmRpbmRpcihzLCBTVl9DSVJFVklTSU9OKSk7CisJLyogcmVnaXN0ZXIgZGV2aWNlcyAqLworCWlmICgocy0+ZGV2X2F1ZGlvID0gcmVnaXN0ZXJfc291bmRfZHNwKCZzdl9hdWRpb19mb3BzLCAtMSkpIDwgMCkgeworCQlyZXQgPSBzLT5kZXZfYXVkaW87CisJCWdvdG8gZXJyX2RldjE7CisJfQorCWlmICgocy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJnN2X21peGVyX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXJldCA9IHMtPmRldl9taXhlcjsKKwkJZ290byBlcnJfZGV2MjsKKwl9CisJaWYgKChzLT5kZXZfbWlkaSA9IHJlZ2lzdGVyX3NvdW5kX21pZGkoJnN2X21pZGlfZm9wcywgLTEpKSA8IDApIHsKKwkJcmV0ID0gcy0+ZGV2X21pZGk7CisJCWdvdG8gZXJyX2RldjM7CisJfQorCWlmICgocy0+ZGV2X2RtZm0gPSByZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKCZzdl9kbWZtX2ZvcHMsIDE1IC8qID8/ICovKSkgPCAwKSB7CisJCXJldCA9IHMtPmRldl9kbWZtOworCQlnb3RvIGVycl9kZXY0OworCX0KKwlwY2lfc2V0X21hc3RlcihwY2lkZXYpOyAgLyogZW5hYmxlIGJ1cyBtYXN0ZXJpbmcgKi8KKwkvKiBpbml0aWFsaXplIHRoZSBjaGlwcyAqLworCWZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJdmFsID0gU09VTkRfTUFTS19MSU5FfFNPVU5EX01BU0tfU1lOVEg7CisJbWl4ZXJfaW9jdGwocywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKGluaXR2b2wpL3NpemVvZihpbml0dm9sWzBdKTsgaSsrKSB7CisJCXZhbCA9IGluaXR2b2xbaV0udm9sOworCQltaXhlcl9pb2N0bChzLCBpbml0dm9sW2ldLm1peGNoLCAodW5zaWduZWQgbG9uZykmdmFsKTsKKwl9CisJc2V0X2ZzKGZzKTsKKwkvKiByZWdpc3RlciBnYW1lcG9ydCAqLworCXN2X3JlZ2lzdGVyX2dhbWVwb3J0KHMsIGdwaW8pOworCS8qIHN0b3JlIGl0IGluIHRoZSBkcml2ZXIgZmllbGQgKi8KKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBzKTsKKwkvKiBwdXQgaXQgaW50byBkcml2ZXIgbGlzdCAqLworCWxpc3RfYWRkX3RhaWwoJnMtPmRldnMsICZkZXZzKTsKKwkvKiBpbmNyZW1lbnQgZGV2aW5kZXggKi8KKwlpZiAoZGV2aW5kZXggPCBOUl9ERVZJQ0UtMSkKKwkJZGV2aW5kZXgrKzsKKwlyZXR1cm4gMDsKKworIGVycl9kZXY0OgorCXVucmVnaXN0ZXJfc291bmRfbWlkaShzLT5kZXZfbWlkaSk7CisgZXJyX2RldjM6CisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihzLT5kZXZfbWl4ZXIpOworIGVycl9kZXYyOgorCXVucmVnaXN0ZXJfc291bmRfZHNwKHMtPmRldl9hdWRpbyk7CisgZXJyX2RldjE6CisJcHJpbnRrKEtFUk5fRVJSICJzdjogY2Fubm90IHJlZ2lzdGVyIG1pc2MgZGV2aWNlXG4iKTsKKwlmcmVlX2lycShzLT5pcnEsIHMpOworIGVycl9pcnE6CisJcmVsZWFzZV9yZWdpb24ocy0+aW9zeW50aCwgU1ZfRVhURU5UX1NZTlRIKTsKKyBlcnJfcmVnaW9uMToKKwlyZWxlYXNlX3JlZ2lvbihzLT5pb21pZGksIFNWX0VYVEVOVF9NSURJKTsKKyBlcnJfcmVnaW9uMjoKKwlyZWxlYXNlX3JlZ2lvbihzLT5pb2RtYWMsIFNWX0VYVEVOVF9ETUEpOworIGVycl9yZWdpb24zOgorCXJlbGVhc2VfcmVnaW9uKHMtPmlvZG1hYSwgU1ZfRVhURU5UX0RNQSk7CisgZXJyX3JlZ2lvbjQ6CisJcmVsZWFzZV9yZWdpb24ocy0+aW9lbmgsIFNWX0VYVEVOVF9FTkgpOworIGVycl9yZWdpb241OgorCWtmcmVlKHMpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCBzdl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKK3sKKwlzdHJ1Y3Qgc3Zfc3RhdGUgKnMgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmICghcykKKwkJcmV0dXJuOworCWxpc3RfZGVsKCZzLT5kZXZzKTsKKwlvdXRiKH4wLCBzLT5pb2VuaCArIFNWX0NPREVDX0lOVE1BU0spOyAgLyogZGlzYWJsZSBpbnRzICovCisJc3luY2hyb25pemVfaXJxKHMtPmlycSk7CisJaW5iKHMtPmlvZW5oICsgU1ZfQ09ERUNfU1RBVFVTKTsgLyogYWNrIGludGVycnVwdHMgKi8KKwl3cmluZGlyKHMsIFNWX0NJRU5BQkxFLCAwKTsgICAgIC8qIGRpc2FibGUgRE1BQSBhbmQgRE1BQyAqLworCS8qb3V0YigwLCBzLT5pb2RtYWEgKyBTVl9ETUFfUkVTRVQpOyovCisJLypvdXRiKDAsIHMtPmlvZG1hYyArIFNWX0RNQV9SRVNFVCk7Ki8KKwlmcmVlX2lycShzLT5pcnEsIHMpOworCWlmIChzLT5nYW1lcG9ydCkgeworCQlpbnQgZ3BpbyA9IHMtPmdhbWVwb3J0LT5pbzsKKwkJZ2FtZXBvcnRfdW5yZWdpc3Rlcl9wb3J0KHMtPmdhbWVwb3J0KTsKKwkJcmVsZWFzZV9yZWdpb24oZ3BpbywgU1ZfRVhURU5UX0dBTUUpOworCX0KKwlyZWxlYXNlX3JlZ2lvbihzLT5pb2RtYWMsIFNWX0VYVEVOVF9ETUEpOworCXJlbGVhc2VfcmVnaW9uKHMtPmlvZG1hYSwgU1ZfRVhURU5UX0RNQSk7CisJcmVsZWFzZV9yZWdpb24ocy0+aW9lbmgsIFNWX0VYVEVOVF9FTkgpOworCXJlbGVhc2VfcmVnaW9uKHMtPmlvbWlkaSwgU1ZfRVhURU5UX01JREkpOworCXJlbGVhc2VfcmVnaW9uKHMtPmlvc3ludGgsIFNWX0VYVEVOVF9TWU5USCk7CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmRldl9taXhlcik7CisJdW5yZWdpc3Rlcl9zb3VuZF9taWRpKHMtPmRldl9taWRpKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX3NwZWNpYWwocy0+ZGV2X2RtZm0pOworCWtmcmVlKHMpOworCXBjaV9zZXRfZHJ2ZGF0YShkZXYsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgaWRfdGFibGVbXSA9IHsKKyAgICAgICB7IFBDSV9WRU5ET1JfSURfUzMsIFBDSV9ERVZJQ0VfSURfUzNfU09OSUNWSUJFUywgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCB9LAorICAgICAgIHsgMCwgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIGlkX3RhYmxlKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHN2X2RyaXZlciA9IHsKKyAgICAgICAubmFtZQkJPSAic29uaWN2aWJlcyIsCisgICAgICAgLmlkX3RhYmxlCT0gaWRfdGFibGUsCisgICAgICAgLnByb2JlCQk9IHN2X3Byb2JlLAorICAgICAgIC5yZW1vdmUJCT0gX19kZXZleGl0X3Aoc3ZfcmVtb3ZlKSwKK307CisgCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NvbmljdmliZXModm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJzdjogdmVyc2lvbiB2MC4zMSB0aW1lICIgX19USU1FX18gIiAiIF9fREFURV9fICJcbiIpOworI2lmIDAKKwlpZiAoISh3YXZldGFibGVfbWVtID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCAyMC1QQUdFX1NISUZUKSkpCisJCXByaW50ayhLRVJOX0lORk8gInN2OiBjYW5ub3QgYWxsb2NhdGUgMU1CIG9mIGNvbnRpZ3VvdXMgbm9ucGFnZWFibGUgbWVtb3J5IGZvciB3YXZldGFibGUgZGF0YVxuIik7CisjZW5kaWYKKwlyZXR1cm4gcGNpX21vZHVsZV9pbml0KCZzdl9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zb25pY3ZpYmVzKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyAic3Y6IHVubG9hZGluZ1xuIik7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZzdl9kcml2ZXIpOworIAlpZiAod2F2ZXRhYmxlX21lbSkKKwkJZnJlZV9wYWdlcyh3YXZldGFibGVfbWVtLCAyMC1QQUdFX1NISUZUKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9zb25pY3ZpYmVzKTsKK21vZHVsZV9leGl0KGNsZWFudXBfc29uaWN2aWJlcyk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIE1PRFVMRQorCisvKiBmb3JtYXQgaXM6IHNvbmljdmliZXM9W3JldmVyYl0gc29uaWN2aWJlc2RtYWlvPWRtYWlvYWRkciAqLworCitzdGF0aWMgaW50IF9faW5pdCBzb25pY3ZpYmVzX3NldHVwKGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgdW5zaWduZWQgX19pbml0ZGF0YSBucl9kZXYgPSAwOworCisJaWYgKG5yX2RldiA+PSBOUl9ERVZJQ0UpCisJCXJldHVybiAwOworI2lmIDAKKwlpZiAoZ2V0X29wdGlvbigmc3RyLCAmcmV2ZXJiW25yX2Rldl0pID09IDIpCisJCSh2b2lkKWdldF9vcHRpb24oJnN0ciwgJndhdmV0YWJsZVtucl9kZXZdKTsKKyNlbHNlCisJKHZvaWQpZ2V0X29wdGlvbigmc3RyLCAmcmV2ZXJiW25yX2Rldl0pOworI2VuZGlmCisKKwlucl9kZXYrKzsKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgic29uaWN2aWJlcz0iLCBzb25pY3ZpYmVzX3NldHVwKTsKKworI2VuZGlmIC8qIE1PRFVMRSAqLwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kX2NhbGxzLmggYi9zb3VuZC9vc3Mvc291bmRfY2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWUwNzUwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NvdW5kX2NhbGxzLmgKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqCURNQSBidWZmZXIgY2FsbHMKKyAqLworCitpbnQgRE1BYnVmX29wZW4oaW50IGRldiwgaW50IG1vZGUpOworaW50IERNQWJ1Zl9yZWxlYXNlKGludCBkZXYsIGludCBtb2RlKTsKK2ludCBETUFidWZfZ2V0d3JidWZmZXIoaW50IGRldiwgY2hhciAqKmJ1ZiwgaW50ICpzaXplLCBpbnQgZG9udGJsb2NrKTsKK2ludCBETUFidWZfZ2V0cmRidWZmZXIoaW50IGRldiwgY2hhciAqKmJ1ZiwgaW50ICpsZW4sIGludCBkb250YmxvY2spOworaW50IERNQWJ1Zl9ybWNoYXJzKGludCBkZXYsIGludCBidWZmX25vLCBpbnQgYyk7CitpbnQgRE1BYnVmX3N0YXJ0X291dHB1dChpbnQgZGV2LCBpbnQgYnVmZl9ubywgaW50IGwpOworaW50IERNQWJ1Zl9tb3ZlX3dycG9pbnRlcihpbnQgZGV2LCBpbnQgbCk7CisvKiBpbnQgRE1BYnVmX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcsIGludCBsb2NhbCk7ICovCit2b2lkIERNQWJ1Zl9pbml0KGludCBkZXYsIGludCBkbWExLCBpbnQgZG1hMik7Cit2b2lkIERNQWJ1Zl9kZWluaXQoaW50IGRldik7CitpbnQgRE1BYnVmX3N0YXJ0X2RtYSAoaW50IGRldiwgdW5zaWduZWQgbG9uZyBwaHlzYWRkciwgaW50IGNvdW50LCBpbnQgZG1hX21vZGUpOworaW50IERNQWJ1Zl9vcGVuX2RtYSAoaW50IGRldik7Cit2b2lkIERNQWJ1Zl9jbG9zZV9kbWEgKGludCBkZXYpOwordm9pZCBETUFidWZfaW5wdXRpbnRyKGludCBkZXYpOwordm9pZCBETUFidWZfb3V0cHV0aW50cihpbnQgZGV2LCBpbnQgdW5kZXJmbG93X2ZsYWcpOworc3RydWN0IGRtYV9idWZmcGFybXM7CitpbnQgRE1BYnVmX3NwYWNlX2luX3F1ZXVlIChpbnQgZGV2KTsKK2ludCBETUFidWZfYWN0aXZhdGVfcmVjb3JkaW5nIChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCk7CitpbnQgRE1BYnVmX2dldF9idWZmZXJfcG9pbnRlciAoaW50IGRldiwgc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAsIGludCBkaXJlY3Rpb24pOwordm9pZCBETUFidWZfbGF1bmNoX291dHB1dChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCk7Cit1bnNpZ25lZCBpbnQgRE1BYnVmX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIGludCBkZXYsIHBvbGxfdGFibGUgKndhaXQpOwordm9pZCBETUFidWZfc3RhcnRfZGV2aWNlcyh1bnNpZ25lZCBpbnQgZGV2bWFzayk7Cit2b2lkIERNQWJ1Zl9yZXNldCAoaW50IGRldik7CitpbnQgRE1BYnVmX3N5bmMgKGludCBkZXYpOworCisvKgorICoJU3lzdGVtIGNhbGxzIGZvciAvZGV2L2RzcCBhbmQgL2Rldi9hdWRpbyAoYXVkaW8uYykKKyAqLworCitpbnQgYXVkaW9fcmVhZCAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCk7CitpbnQgYXVkaW9fd3JpdGUgKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBpbnQgY291bnQpOworaW50IGF1ZGlvX29wZW4gKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3ZvaWQgYXVkaW9fcmVsZWFzZSAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpOworaW50IGF1ZGlvX2lvY3RsIChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkgICB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKK3ZvaWQgYXVkaW9faW5pdF9kZXZpY2VzICh2b2lkKTsKK3ZvaWQgcmVvcmdhbml6ZV9idWZmZXJzIChpbnQgZGV2LCBzdHJ1Y3QgZG1hX2J1ZmZwYXJtcyAqZG1hcCwgaW50IHJlY29yZGluZyk7CisKKy8qCisgKglTeXN0ZW0gY2FsbHMgZm9yIHRoZSAvZGV2L3NlcXVlbmNlcgorICovCisKK2ludCBzZXF1ZW5jZXJfcmVhZCAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCk7CitpbnQgc2VxdWVuY2VyX3dyaXRlIChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwgaW50IGNvdW50KTsKK2ludCBzZXF1ZW5jZXJfb3BlbiAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpOwordm9pZCBzZXF1ZW5jZXJfcmVsZWFzZSAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpOworaW50IHNlcXVlbmNlcl9pb2N0bCAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpOwordW5zaWduZWQgaW50IHNlcXVlbmNlcl9wb2xsKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICogd2FpdCk7CisKK3ZvaWQgc2VxdWVuY2VyX2luaXQgKHZvaWQpOwordm9pZCBzZXF1ZW5jZXJfdW5sb2FkICh2b2lkKTsKK3ZvaWQgc2VxdWVuY2VyX3RpbWVyKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworaW50IG5vdGVfdG9fZnJlcShpbnQgbm90ZV9udW0pOwordW5zaWduZWQgbG9uZyBjb21wdXRlX2ZpbmV0dW5lKHVuc2lnbmVkIGxvbmcgYmFzZV9mcmVxLCBpbnQgYmVuZCwgaW50IHJhbmdlLAorCQkJICAgICAgIGludCB2aWJyYXRvX2JlbmQpOwordm9pZCBzZXFfaW5wdXRfZXZlbnQodW5zaWduZWQgY2hhciAqZXZlbnQsIGludCBsZW4pOwordm9pZCBzZXFfY29weV90b19pbnB1dCAodW5zaWduZWQgY2hhciAqZXZlbnQsIGludCBsZW4pOworCisvKgorICoJU3lzdGVtIGNhbGxzIGZvciB0aGUgL2Rldi9taWRpCisgKi8KKworaW50IE1JRElidWZfcmVhZCAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCk7CitpbnQgTUlESWJ1Zl93cml0ZSAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIGludCBjb3VudCk7CitpbnQgTUlESWJ1Zl9vcGVuIChpbnQgZGV2LCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Cit2b2lkIE1JRElidWZfcmVsZWFzZSAoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUpOworaW50IE1JRElidWZfaW9jdGwgKGludCBkZXYsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKTsKK3Vuc2lnbmVkIGludCBNSURJYnVmX3BvbGwoaW50IGRldiwgc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KTsKK2ludCBNSURJYnVmX2F2YWlsKGludCBkZXYpOworCit2b2lkIE1JRElidWZfYnl0ZXNfcmVjZWl2ZWQoaW50IGRldiwgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgY291bnQpOwordm9pZCBNSURJYnVmX2luaXQodm9pZCk7CisKKworLyoJRnJvbSBzb3VuZGNhcmQuYwkqLwordm9pZCByZXF1ZXN0X3NvdW5kX3RpbWVyIChpbnQgY291bnQpOwordm9pZCBzb3VuZF9zdG9wX3RpbWVyKHZvaWQpOwordm9pZCBjb25mX3ByaW50ZihjaGFyICpuYW1lLCBzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOwordm9pZCBjb25mX3ByaW50ZjIoY2hhciAqbmFtZSwgaW50IGJhc2UsIGludCBpcnEsIGludCBkbWEsIGludCBkbWEyKTsKKworLyoJRnJvbSBzb3VuZF90aW1lci5jICovCit2b2lkIHNvdW5kX3RpbWVyX2ludGVycnVwdCh2b2lkKTsKK3ZvaWQgc291bmRfdGltZXJfc3luY2ludGVydmFsKHVuc2lnbmVkIGludCBuZXdfdXNlY3MpOworCisvKiAgICAgIEZyb20gbWlkaV9zeW50aC5jICAgICAgICovCit2b2lkIGRvX21pZGlfbXNnIChpbnQgc3ludGhubywgdW5zaWduZWQgY2hhciAqbXNnLCBpbnQgbWxlbik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc291bmRfY29uZmlnLmggYi9zb3VuZC9vc3Mvc291bmRfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5MTJiOAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zb3VuZF9jb25maWcuaApAQCAtMCwwICsxLDE1NCBAQAorLyogc291bmRfY29uZmlnLmgKKyAqCisgKiBBIGRyaXZlciBmb3Igc291bmQgY2FyZHMsIG1pc2MuIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAqLworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICovCisKKworI2lmbmRlZiAgX1NPVU5EX0NPTkZJR19IXworI2RlZmluZSAgX1NPVU5EX0NPTkZJR19IXworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorCisjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlICJzb3VuZHZlcnMuaCIKKworCisjaWZuZGVmIFNORF9ERUZBVUxUX0VOQUJMRQorI2RlZmluZSBTTkRfREVGQVVMVF9FTkFCTEUJMQorI2VuZGlmCisKKyNpZm5kZWYgTUFYX1JFQUxUSU1FX0ZBQ1RPUgorI2RlZmluZSBNQVhfUkVBTFRJTUVfRkFDVE9SCTQKKyNlbmRpZgorCisvKgorICogVXNlIGFsd2F5cyA2NGsgYnVmZmVyIHNpemUuIFRoZXJlIGlzIG5vIHJlYXNvbiB0byB1c2Ugc2hvcnRlci4KKyAqLworI3VuZGVmIERTUF9CVUZGU0laRQorI2RlZmluZSBEU1BfQlVGRlNJWkUJCSg2NCoxMDI0KQorCisjaWZuZGVmIERTUF9CVUZGQ09VTlQKKyNkZWZpbmUgRFNQX0JVRkZDT1VOVAkJMQkvKiAxIGlzIHJlY29tbWVuZGVkLiAqLworI2VuZGlmCisKKyNkZWZpbmUgRk1fTU9OTwkJMHgzODgJLyogVGhpcyBpcyB0aGUgSS9PIGFkZHJlc3MgdXNlZCBieSBBZExpYiAqLworCisjaWZuZGVmIENPTkZJR19QQVNfQkFTRQorI2RlZmluZSBDT05GSUdfUEFTX0JBU0UJMHgzODgKKyNlbmRpZgorCisvKiBTRVFfTUFYX1FVRVVFIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZXF1ZW5jZXIgZXZlbnRzIGJ1ZmZlcmVkIGJ5IHRoZQorICAgZHJpdmVyLiAoVGhlcmUgaXMgbm8gbmVlZCB0byBhbHRlciB0aGlzKSAqLworI2RlZmluZSBTRVFfTUFYX1FVRVVFCTEwMjQKKworI2RlZmluZSBTQkZNX01BWElOU1RSCQkoMjU2KQkvKiBTaXplIG9mIHRoZSBGTSBJbnN0cnVtZW50IGJhbmsgKi8KKy8qIDEyOCBpbnN0cnVtZW50cyBmb3IgZ2VuZXJhbCBNSURJIHNldHVwIGFuZCAxNiB1bmFzc2lnbmVkCSAqLworCisjZGVmaW5lIFNORF9OREVWUwkyNTYJLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBkZXZpY2VzICovCisKKyNkZWZpbmUgRFNQX0RFRkFVTFRfU1BFRUQJODAwMAorCisjZGVmaW5lIE1BWF9BVURJT19ERVYJNQorI2RlZmluZSBNQVhfTUlYRVJfREVWCTUKKyNkZWZpbmUgTUFYX1NZTlRIX0RFVgk1CisjZGVmaW5lIE1BWF9NSURJX0RFVgk2CisjZGVmaW5lIE1BWF9USU1FUl9ERVYJNAorCitzdHJ1Y3QgYWRkcmVzc19pbmZvIHsKKwlpbnQgaW9fYmFzZTsKKwlpbnQgaXJxOworCWludCBkbWE7CisJaW50IGRtYTI7CisJaW50IGFsd2F5c19kZXRlY3Q7CS8qIDE9VHJ1c3QgbWUsIGl0J3MgdGhlcmUgKi8KKwljaGFyICpuYW1lOworCWludCBkcml2ZXJfdXNlXzE7CS8qIERyaXZlciBkZWZpbmVkIGZpZWxkIDEgKi8KKwlpbnQgZHJpdmVyX3VzZV8yOwkvKiBEcml2ZXIgZGVmaW5lZCBmaWVsZCAyICovCisJaW50ICpvc3A7CS8qIE9TIHNwZWNpZmljIGluZm8gKi8KKwlpbnQgY2FyZF9zdWJ0eXBlOwkvKiBEcml2ZXIgc3BlY2lmaWMuIFVzdWFsbHkgMCAqLworCXZvaWQgKm1lbXB0cjsgICAgICAgICAgIC8qIE1vZHVsZSBtZW1vcnkgY2hhaW5lciAqLworCWludCBzbG90c1s2XTsgICAgICAgICAgIC8qIFRvIHJlbWVtYmVyIGRyaXZlciBzbG90IGlkcyAqLworfTsKKworI2RlZmluZSBTWU5USF9NQVhfVk9JQ0VTCTMyCisKK3N0cnVjdCB2b2ljZV9hbGxvY19pbmZvIHsKKwkJaW50IG1heF92b2ljZTsKKwkJaW50IHVzZWRfdm9pY2VzOworCQlpbnQgcHRyOwkJLyogRm9yIGRldmljZSBzcGVjaWZpYyB1c2UgKi8KKwkJdW5zaWduZWQgc2hvcnQgbWFwW1NZTlRIX01BWF9WT0lDRVNdOyAvKiAoY2ggPDwgOCkgfCAobm90ZSsxKSAqLworCQlpbnQgdGltZXN0YW1wOworCQlpbnQgYWxsb2NfdGltZXNbU1lOVEhfTUFYX1ZPSUNFU107CisJfTsKKworc3RydWN0IGNoYW5uZWxfaW5mbyB7CisJCWludCBwZ21fbnVtOworCQlpbnQgYmVuZGVyX3ZhbHVlOworCQlpbnQgYmVuZGVyX3JhbmdlOworCQl1bnNpZ25lZCBjaGFyIGNvbnRyb2xsZXJzWzEyOF07CisJfTsKKworLyoKKyAqIFByb2Nlc3Mgd2FrZXVwIHJlYXNvbnMKKyAqLworI2RlZmluZSBXS19OT05FCQkweDAwCisjZGVmaW5lIFdLX1dBS0VVUAkweDAxCisjZGVmaW5lIFdLX1RJTUVPVVQJMHgwMgorI2RlZmluZSBXS19TSUdOQUwJMHgwNAorI2RlZmluZSBXS19TTEVFUAkweDA4CisjZGVmaW5lIFdLX1NFTEVDVAkweDEwCisjZGVmaW5lIFdLX0FCT1JUCTB4MjAKKworI2RlZmluZSBPUEVOX1JFQUQJUENNX0VOQUJMRV9JTlBVVAorI2RlZmluZSBPUEVOX1dSSVRFCVBDTV9FTkFCTEVfT1VUUFVUCisjZGVmaW5lIE9QRU5fUkVBRFdSSVRFCShPUEVOX1JFQUR8T1BFTl9XUklURSkKKworI2lmIE9QRU5fUkVBRCA9PSBGTU9ERV9SRUFEICYmIE9QRU5fV1JJVEUgPT0gRk1PREVfV1JJVEUKKworc3RhdGljIGlubGluZSBpbnQgdHJhbnNsYXRlX21vZGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIGZpbGUtPmZfbW9kZTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgdHJhbnNsYXRlX21vZGUoc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPyBPUEVOX1JFQUQgOiAwKSB8CisJCSgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8gT1BFTl9XUklURSA6IDApOworfQorCisjZW5kaWYKKworCisjaW5jbHVkZSAic291bmRfY2FsbHMuaCIKKyNpbmNsdWRlICJkZXZfdGFibGUuaCIKKworI2lmbmRlZiBERUIKKyNkZWZpbmUgREVCKHgpCisjZW5kaWYKKworI2lmbmRlZiBEREIKKyNkZWZpbmUgRERCKHgpIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZm5kZWYgTURCCisjaWZkZWYgTU9EVUxFCisjZGVmaW5lIE1EQih4KSB4CisjZWxzZQorI2RlZmluZSBNREIoeCkKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgVElNRVJfQVJNRUQJMTIxMjM0CisjZGVmaW5lIFRJTUVSX05PVF9BUk1FRAkxCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kX2Zpcm13YXJlLmggYi9zb3VuZC9vc3Mvc291bmRfZmlybXdhcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTBjYmZkCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NvdW5kX2Zpcm13YXJlLmgKQEAgLTAsMCArMSwyIEBACitleHRlcm4gaW50IG1vZF9maXJtd2FyZV9sb2FkKGNvbnN0IGNoYXIgKmZuLCBjaGFyICoqZnApOworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvc291bmRfc3ltcy5jIGIvc291bmQvb3NzL3NvdW5kX3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjdjMzNmCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3NvdW5kX3N5bXMuYwpAQCAtMCwwICsxLDUwIEBACisvKgorICoJVGhlIHNvdW5kIGNvcmUgZXhwb3J0cyB0aGUgZm9sbG93aW5nIHN5bWJvbHMgdG8gdGhlIHJlc3Qgb2YKKyAqCW1vZHVsZXNwYWNlLgorICoKKyAqICAgICAgKEMpIENvcHlyaWdodCAxOTk3ICAgICAgQWxhbiBDb3gsIExpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR1BMCisgKgorICoJVGh1IE1heSAyNyAxOTk5IEFuZHJldyBKLiBLcm9sbCA8YWc3ODRAZnJlZW5ldC4uYnVmZmFsby4uZWR1PgorICoJbGVmdCBvdXQgZXhwb3J0ZWQgc3ltYm9sLi4uIGZpeGVkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInNvdW5kX2NhbGxzLmgiCisKK2NoYXIgc291bmRfc3ltc19zeW1ib2w7CisKK0VYUE9SVF9TWU1CT0wobWl4ZXJfZGV2cyk7CitFWFBPUlRfU1lNQk9MKGF1ZGlvX2RldnMpOworRVhQT1JUX1NZTUJPTChudW1fbWl4ZXJzKTsKK0VYUE9SVF9TWU1CT0wobnVtX2F1ZGlvZGV2cyk7CisKK0VYUE9SVF9TWU1CT0wobWlkaV9kZXZzKTsKK0VYUE9SVF9TWU1CT0wobnVtX21pZGlzKTsKK0VYUE9SVF9TWU1CT0woc3ludGhfZGV2cyk7CisKK0VYUE9SVF9TWU1CT0woc291bmRfdGltZXJfZGV2cyk7CisKK0VYUE9SVF9TWU1CT0woc291bmRfaW5zdGFsbF9hdWRpb2Rydik7CitFWFBPUlRfU1lNQk9MKHNvdW5kX2luc3RhbGxfbWl4ZXIpOworRVhQT1JUX1NZTUJPTChzb3VuZF9hbGxvY19kbWEpOworRVhQT1JUX1NZTUJPTChzb3VuZF9mcmVlX2RtYSk7CitFWFBPUlRfU1lNQk9MKHNvdW5kX29wZW5fZG1hKTsKK0VYUE9SVF9TWU1CT0woc291bmRfY2xvc2VfZG1hKTsKK0VYUE9SVF9TWU1CT0woc291bmRfYWxsb2NfbWlkaWRldik7CitFWFBPUlRfU1lNQk9MKHNvdW5kX2FsbG9jX21peGVyZGV2KTsKK0VYUE9SVF9TWU1CT0woc291bmRfYWxsb2NfdGltZXJkZXYpOworRVhQT1JUX1NZTUJPTChzb3VuZF9hbGxvY19zeW50aGRldik7CitFWFBPUlRfU1lNQk9MKHNvdW5kX3VubG9hZF9hdWRpb2Rldik7CitFWFBPUlRfU1lNQk9MKHNvdW5kX3VubG9hZF9taWRpZGV2KTsKK0VYUE9SVF9TWU1CT0woc291bmRfdW5sb2FkX21peGVyZGV2KTsKK0VYUE9SVF9TWU1CT0woc291bmRfdW5sb2FkX3RpbWVyZGV2KTsKK0VYUE9SVF9TWU1CT0woc291bmRfdW5sb2FkX3N5bnRoZGV2KTsKKworRVhQT1JUX1NZTUJPTChsb2FkX21peGVyX3ZvbHVtZXMpOworCitFWFBPUlRfU1lNQk9MKGNvbmZfcHJpbnRmKTsKK0VYUE9SVF9TWU1CT0woY29uZl9wcmludGYyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJPU1MgU291bmQgc3Vic3lzdGVtIik7CitNT0RVTEVfQVVUSE9SKCJIYW5udSBTYXZvbGFpbmVuLCBldCBhbC4iKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zb3VuZF90aW1lci5jIGIvc291bmQvb3NzL3NvdW5kX3RpbWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyNzc3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zb3VuZF90aW1lci5jCkBAIC0wLDAgKzEsMzIzIEBACisvKgorICogc291bmQvc291bmRfdGltZXIuYworICovCisvKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKy8qCisgKiBUaG9tYXMgU2FpbGVyICAgOiBpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKK3N0YXRpYyB2b2xhdGlsZSBpbnQgaW5pdGlhbGl6ZWQsIG9wZW5lZCwgdG1yX3J1bm5pbmc7CitzdGF0aWMgdm9sYXRpbGUgdGltZV90IHRtcl9vZmZzLCB0bXJfY3RyOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgdGlja3Nfb2ZmczsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgY3Vycl90ZW1wbywgY3Vycl90aW1lYmFzZTsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIGN1cnJfdGlja3M7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBuZXh0X2V2ZW50X3RpbWU7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X2V2ZW50X3RpbWU7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyB1c2Vjc19wZXJfdG1yOwkvKiBMZW5ndGggb2YgdGhlIGN1cnJlbnQgaW50ZXJ2YWwgKi8KKworc3RhdGljIHN0cnVjdCBzb3VuZF9sb3dsZXZfdGltZXIgKnRtcjsKK3N0YXRpYyBzcGlubG9ja190IGxvY2s7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRtcjJ0aWNrcyhpbnQgdG1yX3ZhbHVlKQoreworCS8qCisJICogICAgQ29udmVydCB0aW1lciB0aWNrcyB0byBNSURJIHRpY2tzCisJICovCisKKwl1bnNpZ25lZCBsb25nIHRtcDsKKwl1bnNpZ25lZCBsb25nIHNjYWxlOworCisJdG1wID0gdG1yX3ZhbHVlICogdXNlY3NfcGVyX3RtcjsJLyogQ29udmVydCB0byB1c2VjcyAqLworCXNjYWxlID0gKDYwICogMTAwMDAwMCkgLyAoY3Vycl90ZW1wbyAqIGN1cnJfdGltZWJhc2UpOwkvKiB1c2VjcyBwZXIgTUlESSB0aWNrICovCisJcmV0dXJuICh0bXAgKyAoc2NhbGUgLyAyKSkgLyBzY2FsZTsKK30KKwordm9pZCByZXByb2dyYW1fdGltZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nICAgdXNlY3NfcGVyX3RpY2s7CisKKwkvKgorCSAqCVRoZSB1c2VyIGlzIGNoYW5naW5nIHRoZSB0aW1lciByYXRlIGJlZm9yZSBzZXR0aW5nIGEgdGltZXIKKwkgKglzbGFwLCBiYWQgYmFkIG5vdCBhbGxvd2VkLgorCSAqLworCSAKKwlpZighdG1yKQorCQlyZXR1cm47CisJCQorCXVzZWNzX3Blcl90aWNrID0gKDYwICogMTAwMDAwMCkgLyAoY3Vycl90ZW1wbyAqIGN1cnJfdGltZWJhc2UpOworCisJLyoKKwkgKiBEb24ndCBraWxsIHRoZSBzeXN0ZW0gYnkgc2V0dGluZyB0b28gaGlnaCB0aW1lciByYXRlCisJICovCisJaWYgKHVzZWNzX3Blcl90aWNrIDwgMjAwMCkKKwkJdXNlY3NfcGVyX3RpY2sgPSAyMDAwOworCisJdXNlY3NfcGVyX3RtciA9IHRtci0+dG1yX3N0YXJ0KHRtci0+ZGV2LCB1c2Vjc19wZXJfdGljayk7Cit9CisKK3ZvaWQgc291bmRfdGltZXJfc3luY2ludGVydmFsKHVuc2lnbmVkIGludCBuZXdfdXNlY3MpCit7CisJLyoKKwkgKiAgICBUaGlzIHJvdXRpbmUgaXMgY2FsbGVkIGJ5IHRoZSBoYXJkd2FyZSBsZXZlbCBpZgorCSAqICAgICAgdGhlIGNsb2NrIGZyZXF1ZW5jeSBoYXMgY2hhbmdlZCBmb3Igc29tZSByZWFzb24uCisJICovCisJdG1yX29mZnMgPSB0bXJfY3RyOworCXRpY2tzX29mZnMgKz0gdG1yMnRpY2tzKHRtcl9jdHIpOworCXRtcl9jdHIgPSAwOworCXVzZWNzX3Blcl90bXIgPSBuZXdfdXNlY3M7Cit9CisKK3N0YXRpYyB2b2lkIHRtcl9yZXNldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwl0bXJfb2ZmcyA9IDA7CisJdGlja3Nfb2ZmcyA9IDA7CisJdG1yX2N0ciA9IDA7CisJbmV4dF9ldmVudF90aW1lID0gKHVuc2lnbmVkIGxvbmcpIC0xOworCXByZXZfZXZlbnRfdGltZSA9IDA7CisJY3Vycl90aWNrcyA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdGltZXJfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwlpZiAob3BlbmVkKQorCQlyZXR1cm4gLUVCVVNZOworCXRtcl9yZXNldCgpOworCWN1cnJfdGVtcG8gPSA2MDsKKwljdXJyX3RpbWViYXNlID0gMTAwOworCW9wZW5lZCA9IDE7CisJcmVwcm9ncmFtX3RpbWVyKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2Nsb3NlKGludCBkZXYpCit7CisJb3BlbmVkID0gdG1yX3J1bm5pbmcgPSAwOworCXRtci0+dG1yX2Rpc2FibGUodG1yLT5kZXYpOworfQorCitzdGF0aWMgaW50IHRpbWVyX2V2ZW50KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KQoreworCXVuc2lnbmVkIGNoYXIgY21kID0gZXZlbnRbMV07CisJdW5zaWduZWQgbG9uZyBwYXJtID0gKihpbnQgKikgJmV2ZW50WzRdOworCisJc3dpdGNoIChjbWQpCisJeworCQljYXNlIFRNUl9XQUlUX1JFTDoKKwkJCXBhcm0gKz0gcHJldl9ldmVudF90aW1lOworCQljYXNlIFRNUl9XQUlUX0FCUzoKKwkJCWlmIChwYXJtID4gMCkKKwkJCXsKKwkJCQlsb25nIHRpbWU7CisKKwkJCQlpZiAocGFybSA8PSBjdXJyX3RpY2tzKQkvKiBJdCdzIHRoZSB0aW1lICovCisJCQkJCXJldHVybiBUSU1FUl9OT1RfQVJNRUQ7CisJCQkJdGltZSA9IHBhcm07CisJCQkJbmV4dF9ldmVudF90aW1lID0gcHJldl9ldmVudF90aW1lID0gdGltZTsKKwkJCQlyZXR1cm4gVElNRVJfQVJNRUQ7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRNUl9TVEFSVDoKKwkJCXRtcl9yZXNldCgpOworCQkJdG1yX3J1bm5pbmcgPSAxOworCQkJcmVwcm9ncmFtX3RpbWVyKCk7CisJCQlicmVhazsKKworCQljYXNlIFRNUl9TVE9QOgorCQkJdG1yX3J1bm5pbmcgPSAwOworCQkJYnJlYWs7CisKKwkJY2FzZSBUTVJfQ09OVElOVUU6CisJCQl0bXJfcnVubmluZyA9IDE7CisJCQlyZXByb2dyYW1fdGltZXIoKTsKKwkJCWJyZWFrOworCisJCWNhc2UgVE1SX1RFTVBPOgorCQkJaWYgKHBhcm0pCisJCQl7CisJCQkJaWYgKHBhcm0gPCA4KQorCQkJCQlwYXJtID0gODsKKwkJCQlpZiAocGFybSA+IDI1MCkKKwkJCQkJcGFybSA9IDI1MDsKKwkJCQl0bXJfb2ZmcyA9IHRtcl9jdHI7CisJCQkJdGlja3Nfb2ZmcyArPSB0bXIydGlja3ModG1yX2N0cik7CisJCQkJdG1yX2N0ciA9IDA7CisJCQkJY3Vycl90ZW1wbyA9IHBhcm07CisJCQkJcmVwcm9ncmFtX3RpbWVyKCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRNUl9FQ0hPOgorCQkJc2VxX2NvcHlfdG9faW5wdXQoZXZlbnQsIDgpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDo7CisJfQorCXJldHVybiBUSU1FUl9OT1RfQVJNRUQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVyX2dldF90aW1lKGludCBkZXYpCit7CisJaWYgKCFvcGVuZWQpCisJCXJldHVybiAwOworCXJldHVybiBjdXJyX3RpY2tzOworfQorCitzdGF0aWMgaW50IHRpbWVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IF9fdXNlciAqcCA9IGFyZzsKKwlpbnQgdmFsOworCisJc3dpdGNoIChjbWQpIAorCXsKKwkJY2FzZSBTTkRDVExfVE1SX1NPVVJDRToKKwkJCXZhbCA9IFRNUl9JTlRFUk5BTDsKKwkJCWJyZWFrOworCisJCWNhc2UgU05EQ1RMX1RNUl9TVEFSVDoKKwkJCXRtcl9yZXNldCgpOworCQkJdG1yX3J1bm5pbmcgPSAxOworCQkJcmV0dXJuIDA7CisJCQorCQljYXNlIFNORENUTF9UTVJfU1RPUDoKKwkJCXRtcl9ydW5uaW5nID0gMDsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1RNUl9DT05USU5VRToKKwkJCXRtcl9ydW5uaW5nID0gMTsKKwkJCXJldHVybiAwOworCisJCWNhc2UgU05EQ1RMX1RNUl9USU1FQkFTRToKKwkJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJaWYgKHZhbCkgCisJCQl7CisJCQkJaWYgKHZhbCA8IDEpCisJCQkJCXZhbCA9IDE7CisJCQkJaWYgKHZhbCA+IDEwMDApCisJCQkJCXZhbCA9IDEwMDA7CisJCQkJY3Vycl90aW1lYmFzZSA9IHZhbDsKKwkJCX0KKwkJCXZhbCA9IGN1cnJfdGltZWJhc2U7CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9UTVJfVEVNUE86CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh2YWwpIAorCQkJeworCQkJCWlmICh2YWwgPCA4KQorCQkJCQl2YWwgPSA4OworCQkJCWlmICh2YWwgPiAyNTApCisJCQkJCXZhbCA9IDI1MDsKKwkJCQl0bXJfb2ZmcyA9IHRtcl9jdHI7CisJCQkJdGlja3Nfb2ZmcyArPSB0bXIydGlja3ModG1yX2N0cik7CisJCQkJdG1yX2N0ciA9IDA7CisJCQkJY3Vycl90ZW1wbyA9IHZhbDsKKwkJCQlyZXByb2dyYW1fdGltZXIoKTsKKwkJCX0KKwkJCXZhbCA9IGN1cnJfdGVtcG87CisJCQlicmVhazsKKworCQljYXNlIFNORENUTF9TRVFfQ1RSTFJBVEU6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCWlmICh2YWwgIT0gMCkJLyogQ2FuJ3QgY2hhbmdlICovCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl2YWwgPSAoKGN1cnJfdGVtcG8gKiBjdXJyX3RpbWViYXNlKSArIDMwKSAvIDYwOworCQkJYnJlYWs7CisJCQorCQljYXNlIFNORENUTF9TRVFfR0VUVElNRToKKwkJCXZhbCA9IGN1cnJfdGlja3M7CisJCQlicmVhazsKKwkJCisJCWNhc2UgU05EQ1RMX1RNUl9NRVRST05PTUU6CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVyX2FybShpbnQgZGV2LCBsb25nIHRpbWUpCit7CisJaWYgKHRpbWUgPCAwKQorCQl0aW1lID0gY3Vycl90aWNrcyArIDE7CisJZWxzZSBpZiAodGltZSA8PSBjdXJyX3RpY2tzKQkvKiBJdCdzIHRoZSB0aW1lICovCisJCXJldHVybjsKKworCW5leHRfZXZlbnRfdGltZSA9IHByZXZfZXZlbnRfdGltZSA9IHRpbWU7CisJcmV0dXJuOworfQorCitzdGF0aWMgc3RydWN0IHNvdW5kX3RpbWVyX29wZXJhdGlvbnMgc291bmRfdGltZXIgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7IlNvdW5kIFRpbWVyIiwgMH0sCisJLnByaW9yaXR5CT0gMSwJLyogUHJpb3JpdHkgKi8KKwkuZGV2bGluawk9IDAsCS8qIExvY2FsIGRldmljZSBsaW5rICovCisJLm9wZW4JCT0gdGltZXJfb3BlbiwKKwkuY2xvc2UJCT0gdGltZXJfY2xvc2UsCisJLmV2ZW50CQk9IHRpbWVyX2V2ZW50LAorCS5nZXRfdGltZQk9IHRpbWVyX2dldF90aW1lLAorCS5pb2N0bAkJPSB0aW1lcl9pb2N0bCwKKwkuYXJtX3RpbWVyCT0gdGltZXJfYXJtCit9OworCit2b2lkIHNvdW5kX3RpbWVyX2ludGVycnVwdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJaWYgKCFvcGVuZWQpCisJCXJldHVybjsKKworCXRtci0+dG1yX3Jlc3RhcnQodG1yLT5kZXYpOworCisJaWYgKCF0bXJfcnVubmluZykKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCXRtcl9jdHIrKzsKKwljdXJyX3RpY2tzID0gdGlja3Nfb2ZmcyArIHRtcjJ0aWNrcyh0bXJfY3RyKTsKKworCWlmIChjdXJyX3RpY2tzID49IG5leHRfZXZlbnRfdGltZSkKKwl7CisJCW5leHRfZXZlbnRfdGltZSA9ICh1bnNpZ25lZCBsb25nKSAtMTsKKwkJc2VxdWVuY2VyX3RpbWVyKDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKK30KKwordm9pZCAgc291bmRfdGltZXJfaW5pdChzdHJ1Y3Qgc291bmRfbG93bGV2X3RpbWVyICp0LCBjaGFyICpuYW1lKQoreworCWludCBuOworCisJaWYgKGluaXRpYWxpemVkKQorCXsKKwkJaWYgKHQtPnByaW9yaXR5IDw9IHRtci0+cHJpb3JpdHkpCisJCQlyZXR1cm47CS8qIFRoZXJlIGlzIGFscmVhZHkgYSBzaW1pbGFyIG9yIGJldHRlciB0aW1lciAqLworCQl0bXIgPSB0OworCQlyZXR1cm47CisJfQorCWluaXRpYWxpemVkID0gMTsKKwl0bXIgPSB0OworCisJbiA9IHNvdW5kX2FsbG9jX3RpbWVyZGV2KCk7CisJaWYgKG4gPT0gLTEpCisJCW4gPSAwOwkJLyogT3ZlcndyaXRlIHRoZSBzeXN0ZW0gdGltZXIgKi8KKwlzdHJjcHkoc291bmRfdGltZXIuaW5mby5uYW1lLCBuYW1lKTsKKwlzb3VuZF90aW1lcl9kZXZzW25dID0gJnNvdW5kX3RpbWVyOworfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kY2FyZC5jIGIvc291bmQvb3NzL3NvdW5kY2FyZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOTFjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc291bmRjYXJkLmMKQEAgLTAsMCArMSw3NTEgQEAKKy8qCisgKiBsaW51eC9kcml2ZXJzL3NvdW5kL3NvdW5kY2FyZC5jCisgKgorICogU291bmQgY2FyZCBkcml2ZXIgZm9yIExpbnV4CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICoKKyAqCisgKiBUaG9tYXMgU2FpbGVyICAgICA6IGlvY3RsIGNvZGUgcmV3b3JrZWQgKHZtYWxsb2MvdmZyZWUgcmVtb3ZlZCkKKyAqICAgICAgICAgICAgICAgICAgIGludGVncmF0ZWQgc291bmRfc3dpdGNoLmMKKyAqIFN0ZWZhbiBSZWluYXVlciAgIDogaW50ZWdyYXRlZCAvcHJvYy9zb3VuZCAoZXF1YWxzIHRvIC9kZXYvc25kc3RhdCwKKyAqICAgICAgICAgICAgICAgICAgIHdoaWNoIHNob3VsZCBkaXNhcHBlYXIgaW4gdGhlIG5lYXIgZnV0dXJlKQorICogRXJpYyBEdW1hcwkgICAgIDogZGV2ZnMgc3VwcG9ydCAoMjItSmFuLTk4KSA8ZHVtYXNAbGludXguZXUub3JnPiB3aXRoCisgKiAgICAgICAgICAgICAgICAgICBmaXh1cHMgYnkgQy4gU2NvdHQgQW5hbmlhbiA8Y2FuYW5pYW5AYWx1bW5pLnByaW5jZXRvbi5lZHU+CisgKiBSaWNoYXJkIEdvb2NoICAgICA6IG1vdmVkIGNvbW1vbiAobm9uIE9TUy1zcGVjaWZpYykgZGV2aWNlcyB0byBzb3VuZF9jb3JlLmMKKyAqIFJvYiBSaWdncwkgICAgIDogQWRkZWQgcGVyc2lzdGVudCBETUEgYnVmZmVycyBzdXBwb3J0ICgxOTk4LzEwLzE3KQorICogQ2hyaXN0b3BoIEhlbGx3aWcgOiBTb21lIGNsZWFudXAgd29yayAoMjAwMC8wMy8wMSkKKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGV2ZnNfZnNfa2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisvKgorICogVGhpcyBvdWdodCB0byBiZSBtb3ZlZCBpbnRvIGluY2x1ZGUvYXNtL2RtYS5oCisgKi8KKyNpZm5kZWYgdmFsaWRfZG1hCisjZGVmaW5lIHZhbGlkX2RtYShuKSAoKG4pID49IDAgJiYgKG4pIDwgTUFYX0RNQV9DSEFOTkVMUyAmJiAobikgIT0gNCkKKyNlbmRpZgorCisvKgorICogVGFibGUgZm9yIHBlcm1hbmVudGx5IGFsbG9jYXRlZCBtZW1vcnkgKHVzZWQgd2hlbiB1bmxvYWRpbmcgdGhlIG1vZHVsZSkKKyAqLwordm9pZCAqICAgICAgICAgIHNvdW5kX21lbV9ibG9ja3NbMTAyNF07CitpbnQgICAgICAgICAgICAgc291bmRfbmJsb2NrcyA9IDA7CisKKy8qIFBlcnNpc3RlbnQgRE1BIGJ1ZmZlcnMgKi8KKyNpZmRlZiBDT05GSUdfU09VTkRfRE1BUAoraW50ICAgICAgICAgICAgIHNvdW5kX2RtYXBfZmxhZyA9IDE7CisjZWxzZQoraW50ICAgICAgICAgICAgIHNvdW5kX2RtYXBfZmxhZyA9IDA7CisjZW5kaWYKKworc3RhdGljIGNoYXIgICAgIGRtYV9hbGxvY19tYXBbTUFYX0RNQV9DSEFOTkVMU107CisKKyNkZWZpbmUgRE1BX01BUF9VTkFWQUlMCQkwCisjZGVmaW5lIERNQV9NQVBfRlJFRQkJMQorI2RlZmluZSBETUFfTUFQX0JVU1kJCTIKKworCit1bnNpZ25lZCBsb25nIHNlcV90aW1lID0gMDsJLyogVGltZSBmb3IgL2Rldi9zZXF1ZW5jZXIgKi8KK2V4dGVybiBzdHJ1Y3QgY2xhc3Nfc2ltcGxlICpzb3VuZF9jbGFzczsKKworLyoKKyAqIFRhYmxlIGZvciBjb25maWd1cmFibGUgbWl4ZXIgdm9sdW1lIGhhbmRsaW5nCisgKi8KK3N0YXRpYyBtaXhlcl92b2xfdGFibGUgbWl4ZXJfdm9sc1tNQVhfTUlYRVJfREVWXTsKK3N0YXRpYyBpbnQgbnVtX21peGVyX3ZvbHVtZXM7CisKK2ludCAqbG9hZF9taXhlcl92b2x1bWVzKGNoYXIgKm5hbWUsIGludCAqbGV2ZWxzLCBpbnQgcHJlc2VudCkKK3sKKwlpbnQgICAgICAgICAgICAgaSwgbjsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbWl4ZXJfdm9sdW1lczsgaSsrKSB7CisJCWlmIChzdHJjbXAobmFtZSwgbWl4ZXJfdm9sc1tpXS5uYW1lKSA9PSAwKSB7CisJCQlpZiAocHJlc2VudCkKKwkJCQltaXhlcl92b2xzW2ldLm51bSA9IGk7CisJCQlyZXR1cm4gbWl4ZXJfdm9sc1tpXS5sZXZlbHM7CisJCX0KKwl9CisJaWYgKG51bV9taXhlcl92b2x1bWVzID49IE1BWF9NSVhFUl9ERVYpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogVG9vIG1hbnkgbWl4ZXJzICglcylcbiIsIG5hbWUpOworCQlyZXR1cm4gbGV2ZWxzOworCX0KKwluID0gbnVtX21peGVyX3ZvbHVtZXMrKzsKKworCXN0cmNweShtaXhlcl92b2xzW25dLm5hbWUsIG5hbWUpOworCisJaWYgKHByZXNlbnQpCisJCW1peGVyX3ZvbHNbbl0ubnVtID0gbjsKKwllbHNlCisJCW1peGVyX3ZvbHNbbl0ubnVtID0gLTE7CisKKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykKKwkJbWl4ZXJfdm9sc1tuXS5sZXZlbHNbaV0gPSBsZXZlbHNbaV07CisJcmV0dXJuIG1peGVyX3ZvbHNbbl0ubGV2ZWxzOworfQorCitzdGF0aWMgaW50IHNldF9taXhlcl9sZXZlbHModm9pZCBfX3VzZXIgKiBhcmcpCit7CisgICAgICAgIC8qIG1peGVyX3ZvbF90YWJsZSBpcyAxNzQgYnl0ZXMsIHNvIElNSE8gbm8gcmVhc29uIHRvIG5vdCBhbGxvY2F0ZSBpdCBvbiB0aGUgc3RhY2sgKi8KKwltaXhlcl92b2xfdGFibGUgYnVmOyAgIAorCisJaWYgKF9fY29weV9mcm9tX3VzZXIoJmJ1ZiwgYXJnLCBzaXplb2YoYnVmKSkpCisJCXJldHVybiAtRUZBVUxUOworCWxvYWRfbWl4ZXJfdm9sdW1lcyhidWYubmFtZSwgYnVmLmxldmVscywgMCk7CisJaWYgKF9fY29weV90b191c2VyKGFyZywgJmJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbWl4ZXJfbGV2ZWxzKHZvaWQgX191c2VyICogYXJnKQoreworCWludCBuOworCisJaWYgKF9fZ2V0X3VzZXIobiwgKGludCBfX3VzZXIgKikoJigoKG1peGVyX3ZvbF90YWJsZSBfX3VzZXIgKilhcmcpLT5udW0pKSkpCisJCXJldHVybiAtRUZBVUxUOworCWlmIChuIDwgMCB8fCBuID49IG51bV9taXhlcl92b2x1bWVzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoX19jb3B5X3RvX3VzZXIoYXJnLCAmbWl4ZXJfdm9sc1tuXSwgc2l6ZW9mKG1peGVyX3ZvbF90YWJsZSkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gMDsKK30KKworLyogNEsgcGFnZSBzaXplIGJ1dCBvdXIgb3V0cHV0IHJvdXRpbmVzIHVzZSBzb21lIHNsYWNrIGZvciBvdmVycnVucyAqLworI2RlZmluZSBQUk9DX0JMT0NLX1NJWkUgKDMqMTAyNCkKKworc3RhdGljIHNzaXplX3Qgc291bmRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IGRldiA9IGltaW5vcihmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZSk7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwkvKgorCSAqCVRoZSBPU1MgZHJpdmVycyBhcmVuJ3QgcmVtb3RlbHkgaGFwcHkgd2l0aG91dCB0aGlzIGxvY2tpbmcsCisJICoJYW5kIHVubGVzcyBzb21lb25lIGZpeGVzIHRoZW0gd2hlbiB0aGV5IGFyZSBhYm91dCB0byBiaXRlIHRoZQorCSAqCWJpZyBvbmUgYW55d2F5LCB3ZSBtaWdodCBhcyB3ZWxsIGJhbmRhZ2UgaGVyZS4uCisJICovCisJIAorCWxvY2tfa2VybmVsKCk7CisJCisJREVCKHByaW50aygic291bmRfcmVhZChkZXY9JWQsIGNvdW50PSVkKVxuIiwgZGV2LCBjb3VudCkpOworCXN3aXRjaCAoZGV2ICYgMHgwZikgeworCWNhc2UgU05EX0RFVl9EU1A6CisJY2FzZSBTTkRfREVWX0RTUDE2OgorCWNhc2UgU05EX0RFVl9BVURJTzoKKwkJcmV0ID0gYXVkaW9fcmVhZChkZXYsIGZpbGUsIGJ1ZiwgY291bnQpOworCQlicmVhazsKKworCWNhc2UgU05EX0RFVl9TRVE6CisJY2FzZSBTTkRfREVWX1NFUTI6CisJCXJldCA9IHNlcXVlbmNlcl9yZWFkKGRldiwgZmlsZSwgYnVmLCBjb3VudCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfREVWX01JRElOOgorCQlyZXQgPSBNSURJYnVmX3JlYWQoZGV2LCBmaWxlLCBidWYsIGNvdW50KTsKKwl9CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHNvdW5kX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlpbnQgZGV2ID0gaW1pbm9yKGZpbGUtPmZfZGVudHJ5LT5kX2lub2RlKTsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKKwkKKwlsb2NrX2tlcm5lbCgpOworCURFQihwcmludGsoInNvdW5kX3dyaXRlKGRldj0lZCwgY291bnQ9JWQpXG4iLCBkZXYsIGNvdW50KSk7CisJc3dpdGNoIChkZXYgJiAweDBmKSB7CisJY2FzZSBTTkRfREVWX1NFUToKKwljYXNlIFNORF9ERVZfU0VRMjoKKwkJcmV0ID0gIHNlcXVlbmNlcl93cml0ZShkZXYsIGZpbGUsIGJ1ZiwgY291bnQpOworCQlicmVhazsKKworCWNhc2UgU05EX0RFVl9EU1A6CisJY2FzZSBTTkRfREVWX0RTUDE2OgorCWNhc2UgU05EX0RFVl9BVURJTzoKKwkJcmV0ID0gYXVkaW9fd3JpdGUoZGV2LCBmaWxlLCBidWYsIGNvdW50KTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9ERVZfTUlESU46CisJCXJldCA9ICBNSURJYnVmX3dyaXRlKGRldiwgZmlsZSwgYnVmLCBjb3VudCk7CisJCWJyZWFrOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBzb3VuZF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpOworCWludCByZXR2YWw7CisKKwlERUIocHJpbnRrKCJzb3VuZF9vcGVuKGRldj0lZClcbiIsIGRldikpOworCWlmICgoZGV2ID49IFNORF9OREVWUykgfHwgKGRldiA8IDApKSB7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBtaW5vciBkZXZpY2UgJWRcbiIsIGRldik7CisJCXJldHVybiAtRU5YSU87CisJfQorCXN3aXRjaCAoZGV2ICYgMHgwZikgeworCWNhc2UgU05EX0RFVl9DVEw6CisJCWRldiA+Pj0gNDsKKwkJaWYgKGRldiA+PSAwICYmIGRldiA8IE1BWF9NSVhFUl9ERVYgJiYgbWl4ZXJfZGV2c1tkZXZdID09IE5VTEwpIHsKKwkJCXJlcXVlc3RfbW9kdWxlKCJtaXhlciVkIiwgZGV2KTsKKwkJfQorCQlpZiAoZGV2ICYmIChkZXYgPj0gbnVtX21peGVycyB8fCBtaXhlcl9kZXZzW2Rldl0gPT0gTlVMTCkpCisJCQlyZXR1cm4gLUVOWElPOworCQorCQlpZiAoIXRyeV9tb2R1bGVfZ2V0KG1peGVyX2RldnNbZGV2XS0+b3duZXIpKQorCQkJcmV0dXJuIC1FTlhJTzsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9ERVZfU0VROgorCWNhc2UgU05EX0RFVl9TRVEyOgorCQlpZiAoKHJldHZhbCA9IHNlcXVlbmNlcl9vcGVuKGRldiwgZmlsZSkpIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJCWJyZWFrOworCisJY2FzZSBTTkRfREVWX01JRElOOgorCQlpZiAoKHJldHZhbCA9IE1JRElidWZfb3BlbihkZXYsIGZpbGUpKSA8IDApCisJCQlyZXR1cm4gcmV0dmFsOworCQlicmVhazsKKworCWNhc2UgU05EX0RFVl9EU1A6CisJY2FzZSBTTkRfREVWX0RTUDE2OgorCWNhc2UgU05EX0RFVl9BVURJTzoKKwkJaWYgKChyZXR2YWwgPSBhdWRpb19vcGVuKGRldiwgZmlsZSkpIDwgMCkKKwkJCXJldHVybiByZXR2YWw7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJJbnZhbGlkIG1pbm9yIGRldmljZSAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb3VuZF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpOworCisJbG9ja19rZXJuZWwoKTsKKwlERUIocHJpbnRrKCJzb3VuZF9yZWxlYXNlKGRldj0lZClcbiIsIGRldikpOworCXN3aXRjaCAoZGV2ICYgMHgwZikgeworCWNhc2UgU05EX0RFVl9DVEw6CisJCW1vZHVsZV9wdXQobWl4ZXJfZGV2c1tkZXYgPj4gNF0tPm93bmVyKTsKKwkJYnJlYWs7CisJCQorCWNhc2UgU05EX0RFVl9TRVE6CisJY2FzZSBTTkRfREVWX1NFUTI6CisJCXNlcXVlbmNlcl9yZWxlYXNlKGRldiwgZmlsZSk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfREVWX01JRElOOgorCQlNSURJYnVmX3JlbGVhc2UoZGV2LCBmaWxlKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORF9ERVZfRFNQOgorCWNhc2UgU05EX0RFVl9EU1AxNjoKKwljYXNlIFNORF9ERVZfQVVESU86CisJCWF1ZGlvX3JlbGVhc2UoZGV2LCBmaWxlKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kIGVycm9yOiBSZWxlYXNpbmcgdW5rbm93biBkZXZpY2UgMHglMDJ4XG4iLCBkZXYpOworCX0KKwl1bmxvY2tfa2VybmVsKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbWl4ZXJfaW5mbyhpbnQgZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCW1peGVyX2luZm8gaW5mbzsKKwltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJc3RybGNweShpbmZvLmlkLCBtaXhlcl9kZXZzW2Rldl0tPmlkLCBzaXplb2YoaW5mby5pZCkpOworCXN0cmxjcHkoaW5mby5uYW1lLCBtaXhlcl9kZXZzW2Rldl0tPm5hbWUsIHNpemVvZihpbmZvLm5hbWUpKTsKKwlpbmZvLm1vZGlmeV9jb3VudGVyID0gbWl4ZXJfZGV2c1tkZXZdLT5tb2RpZnlfY291bnRlcjsKKwlpZiAoX19jb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgIHNpemVvZihpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdldF9vbGRfbWl4ZXJfaW5mbyhpbnQgZGV2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKyAJc3RybGNweShpbmZvLmlkLCBtaXhlcl9kZXZzW2Rldl0tPmlkLCBzaXplb2YoaW5mby5pZCkpOworIAlzdHJsY3B5KGluZm8ubmFtZSwgbWl4ZXJfZGV2c1tkZXZdLT5uYW1lLCBzaXplb2YoaW5mby5uYW1lKSk7CisgCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmaW5mbywgIHNpemVvZihpbmZvKSkpCisJCXJldHVybiAtRUZBVUxUOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNvdW5kX21peGVyX2lvY3RsKGludCBtaXhkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisgCWlmIChtaXhkZXYgPCAwIHx8IG1peGRldiA+PSBNQVhfTUlYRVJfREVWKQorIAkJcmV0dXJuIC1FTlhJTzsKKyAJLyogVHJ5IHRvIGxvYWQgdGhlIG1peGVyLi4uICovCisgCWlmIChtaXhlcl9kZXZzW21peGRldl0gPT0gTlVMTCkgeworIAkJcmVxdWVzdF9tb2R1bGUoIm1peGVyJWQiLCBtaXhkZXYpOworIAl9CisgCWlmIChtaXhkZXYgPj0gbnVtX21peGVycyB8fCAhbWl4ZXJfZGV2c1ttaXhkZXZdKQorIAkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoY21kID09IFNPVU5EX01JWEVSX0lORk8pCisJCXJldHVybiBnZXRfbWl4ZXJfaW5mbyhtaXhkZXYsIGFyZyk7CisJaWYgKGNtZCA9PSBTT1VORF9PTERfTUlYRVJfSU5GTykKKwkJcmV0dXJuIGdldF9vbGRfbWl4ZXJfaW5mbyhtaXhkZXYsIGFyZyk7CisJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpCisJCW1peGVyX2RldnNbbWl4ZGV2XS0+bW9kaWZ5X2NvdW50ZXIrKzsKKwlpZiAoIW1peGVyX2RldnNbbWl4ZGV2XS0+aW9jdGwpCisJCXJldHVybiAtRUlOVkFMOworCXJldHVybiBtaXhlcl9kZXZzW21peGRldl0tPmlvY3RsKG1peGRldiwgY21kLCBhcmcpOworfQorCitzdGF0aWMgaW50IHNvdW5kX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IGxlbiA9IDAsIGR0eXBlOworCWludCBkZXYgPSBpbWlub3IoaW5vZGUpOworCXZvaWQgX191c2VyICpwID0gKHZvaWQgX191c2VyICopYXJnOworCisJaWYgKF9TSU9DX0RJUihjbWQpICE9IF9TSU9DX05PTkUgJiYgX1NJT0NfRElSKGNtZCkgIT0gMCkgeworCQkvKgorCQkgKiBIYXZlIHRvIHZhbGlkYXRlIHRoZSBhZGRyZXNzIGdpdmVuIGJ5IHRoZSBwcm9jZXNzLgorCQkgKi8KKwkJbGVuID0gX1NJT0NfU0laRShjbWQpOworCQlpZiAobGVuIDwgMSB8fCBsZW4gPiA2NTUzNiB8fCAhcCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkKKwkJCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBwLCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19SRUFEKQorCQkJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBwLCBsZW4pKQorCQkJCXJldHVybiAtRUZBVUxUOworCX0KKwlERUIocHJpbnRrKCJzb3VuZF9pb2N0bChkZXY9JWQsIGNtZD0weCV4LCBhcmc9MHgleClcbiIsIGRldiwgY21kLCBhcmcpKTsKKwlpZiAoY21kID09IE9TU19HRVRWRVJTSU9OKQorCQlyZXR1cm4gX19wdXRfdXNlcihTT1VORF9WRVJTSU9OLCAoaW50IF9fdXNlciAqKXApOworCQorCWlmIChfSU9DX1RZUEUoY21kKSA9PSAnTScgJiYgbnVtX21peGVycyA+IDAgJiYgICAvKiBNaXhlciBpb2N0bCAqLworCSAgICAoZGV2ICYgMHgwZikgIT0gU05EX0RFVl9DVEwpIHsgICAgICAgICAgICAgIAorCQlkdHlwZSA9IGRldiAmIDB4MGY7CisJCXN3aXRjaCAoZHR5cGUpIHsKKwkJY2FzZSBTTkRfREVWX0RTUDoKKwkJY2FzZSBTTkRfREVWX0RTUDE2OgorCQljYXNlIFNORF9ERVZfQVVESU86CisJCQlyZXR1cm4gc291bmRfbWl4ZXJfaW9jdGwoYXVkaW9fZGV2c1tkZXYgPj4gNF0tPm1peGVyX2RldiwKKwkJCQkJCSBjbWQsIHApOworCQkJCisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gc291bmRfbWl4ZXJfaW9jdGwoZGV2ID4+IDQsIGNtZCwgcCk7CisJCX0KKwl9CisJc3dpdGNoIChkZXYgJiAweDBmKSB7CisJY2FzZSBTTkRfREVWX0NUTDoKKwkJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9HRVRMRVZFTFMpCisJCQlyZXR1cm4gZ2V0X21peGVyX2xldmVscyhwKTsKKwkJaWYgKGNtZCA9PSBTT1VORF9NSVhFUl9TRVRMRVZFTFMpCisJCQlyZXR1cm4gc2V0X21peGVyX2xldmVscyhwKTsKKwkJcmV0dXJuIHNvdW5kX21peGVyX2lvY3RsKGRldiA+PiA0LCBjbWQsIHApOworCisJY2FzZSBTTkRfREVWX1NFUToKKwljYXNlIFNORF9ERVZfU0VRMjoKKwkJcmV0dXJuIHNlcXVlbmNlcl9pb2N0bChkZXYsIGZpbGUsIGNtZCwgcCk7CisKKwljYXNlIFNORF9ERVZfRFNQOgorCWNhc2UgU05EX0RFVl9EU1AxNjoKKwljYXNlIFNORF9ERVZfQVVESU86CisJCXJldHVybiBhdWRpb19pb2N0bChkZXYsIGZpbGUsIGNtZCwgcCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRfREVWX01JRElOOgorCQlyZXR1cm4gTUlESWJ1Zl9pb2N0bChkZXYsIGZpbGUsIGNtZCwgcCk7CisJCWJyZWFrOworCisJfQorCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHNvdW5kX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHBvbGxfdGFibGUgKiB3YWl0KQoreworCXN0cnVjdCBpbm9kZSAqaW5vZGUgPSBmaWxlLT5mX2RlbnRyeS0+ZF9pbm9kZTsKKwlpbnQgZGV2ID0gaW1pbm9yKGlub2RlKTsKKworCURFQihwcmludGsoInNvdW5kX3BvbGwoZGV2PSVkKVxuIiwgZGV2KSk7CisJc3dpdGNoIChkZXYgJiAweDBmKSB7CisJY2FzZSBTTkRfREVWX1NFUToKKwljYXNlIFNORF9ERVZfU0VRMjoKKwkJcmV0dXJuIHNlcXVlbmNlcl9wb2xsKGRldiwgZmlsZSwgd2FpdCk7CisKKwljYXNlIFNORF9ERVZfTUlESU46CisJCXJldHVybiBNSURJYnVmX3BvbGwoZGV2LCBmaWxlLCB3YWl0KTsKKworCWNhc2UgU05EX0RFVl9EU1A6CisJY2FzZSBTTkRfREVWX0RTUDE2OgorCWNhc2UgU05EX0RFVl9BVURJTzoKKwkJcmV0dXJuIERNQWJ1Zl9wb2xsKGZpbGUsIGRldiA+PiA0LCB3YWl0KTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc291bmRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJaW50IGRldl9jbGFzczsKKwl1bnNpZ25lZCBsb25nIHNpemU7CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSBOVUxMOworCWludCBkZXYgPSBpbWlub3IoZmlsZS0+Zl9kZW50cnktPmRfaW5vZGUpOworCisJZGV2X2NsYXNzID0gZGV2ICYgMHgwZjsKKwlkZXYgPj49IDQ7CisKKwlpZiAoZGV2X2NsYXNzICE9IFNORF9ERVZfRFNQICYmIGRldl9jbGFzcyAhPSBTTkRfREVWX0RTUDE2ICYmIGRldl9jbGFzcyAhPSBTTkRfREVWX0FVRElPKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IG1tYXAoKSBub3Qgc3VwcG9ydGVkIGZvciBvdGhlciB0aGFuIGF1ZGlvIGRldmljZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJbG9ja19rZXJuZWwoKTsKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKQkvKiBNYXAgd3JpdGUgYW5kIHJlYWQvd3JpdGUgdG8gdGhlIG91dHB1dCBidWYgKi8KKwkJZG1hcCA9IGF1ZGlvX2RldnNbZGV2XS0+ZG1hcF9vdXQ7CisJZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpCisJCWRtYXAgPSBhdWRpb19kZXZzW2Rldl0tPmRtYXBfaW47CisJZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IFVuZGVmaW5lZCBtbWFwKCkgYWNjZXNzXG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZG1hcCA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAiU291bmQ6IG1tYXAoKSBlcnJvci4gZG1hcCA9PSBOVUxMXG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGRtYXAtPnJhd19idWYgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgIlNvdW5kOiBtbWFwKCkgY2FsbGVkIHdoZW4gcmF3X2J1ZiA9PSBOVUxMXG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTzsKKwl9CisJaWYgKGRtYXAtPm1hcHBpbmdfZmxhZ3MpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogbW1hcCgpIGNhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgRE1BIGJ1ZmZlclxuIik7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogbW1hcCgpIG9mZnNldCBtdXN0IGJlIDAuXG4iKTsKKwkJdW5sb2NrX2tlcm5lbCgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworCWlmIChzaXplICE9IGRtYXAtPmJ5dGVzX2luX3VzZSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJTb3VuZDogbW1hcCgpIHNpemUgPSAlbGQuIFNob3VsZCBiZSAlZFxuIiwgc2l6ZSwgZG1hcC0+Ynl0ZXNfaW5fdXNlKTsKKwl9CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQl2aXJ0X3RvX3BoeXMoZG1hcC0+cmF3X2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCXZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydCwgdm1hLT52bV9wYWdlX3Byb3QpKSB7CisJCXVubG9ja19rZXJuZWwoKTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJZG1hcC0+bWFwcGluZ19mbGFncyB8PSBETUFfTUFQX01BUFBFRDsKKworCWlmKCBhdWRpb19kZXZzW2Rldl0tPmQtPm1tYXApCisJCWF1ZGlvX2RldnNbZGV2XS0+ZC0+bW1hcChkZXYpOworCisJbWVtc2V0KGRtYXAtPnJhd19idWYsCisJICAgICAgIGRtYXAtPm5ldXRyYWxfYnl0ZSwKKwkgICAgICAgZG1hcC0+Ynl0ZXNfaW5fdXNlKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBmaWxlX29wZXJhdGlvbnMgb3NzX3NvdW5kX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHNvdW5kX3JlYWQsCisJLndyaXRlCQk9IHNvdW5kX3dyaXRlLAorCS5wb2xsCQk9IHNvdW5kX3BvbGwsCisJLmlvY3RsCQk9IHNvdW5kX2lvY3RsLAorCS5tbWFwCQk9IHNvdW5kX21tYXAsCisJLm9wZW4JCT0gc291bmRfb3BlbiwKKwkucmVsZWFzZQk9IHNvdW5kX3JlbGVhc2UsCit9OworCisvKgorICoJQ3JlYXRlIHRoZSByZXF1aXJlZCBzcGVjaWFsIHN1YmRldmljZXMKKyAqLworIAorc3RhdGljIGludCBjcmVhdGVfc3BlY2lhbF9kZXZpY2VzKHZvaWQpCit7CisJaW50IHNlcTEsc2VxMjsKKwlzZXExPXJlZ2lzdGVyX3NvdW5kX3NwZWNpYWwoJm9zc19zb3VuZF9mb3BzLCAxKTsKKwlpZihzZXExPT0tMSkKKwkJZ290byBiYWQ7CisJc2VxMj1yZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKCZvc3Nfc291bmRfZm9wcywgOCk7CisJaWYoc2VxMiE9LTEpCisJCXJldHVybiAwOworCXVucmVnaXN0ZXJfc291bmRfc3BlY2lhbCgxKTsKK2JhZDoKKwlyZXR1cm4gLTE7Cit9CisKKworLyogVGhlc2UgZGV2aWNlIG5hbWVzIGZvbGxvdyB0aGUgb2ZmaWNpYWwgTGludXggZGV2aWNlIGxpc3QsCisgKiBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0LiAgTGV0IHVzIGtub3cgaWYgdGhlcmUgYXJlIG90aGVyCisgKiBjb21tb24gbmFtZXMgd2Ugc2hvdWxkIHN1cHBvcnQgZm9yIGNvbXBhdGliaWxpdHkuCisgKiBPbmx5IHRob3NlIGRldmljZXMgbm90IGNyZWF0ZWQgYnkgdGhlIGdlbmVyaWMgY29kZSBpbiBzb3VuZF9jb3JlLmMgYXJlCisgKiByZWdpc3RlcmVkIGhlcmUuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCXVuc2lnbmVkIHNob3J0IG1pbm9yOworCWNoYXIgKm5hbWU7CisJdW1vZGVfdCBtb2RlOworCWludCAqbnVtOworfSBkZXZfbGlzdFtdID0geyAvKiBsaXN0IG9mIG1pbm9yIGRldmljZXMgKi8KKy8qIHNlZW1zIHRvIGJlIHNvbWUgY29uZnVzaW9uIGhlcmUgLS0gdGhpcyBkZXZpY2UgaXMgbm90IGluIHRoZSBkZXZpY2UgbGlzdCAqLworCXtTTkRfREVWX0RTUDE2LCAgICAgImRzcFciLAkgU19JV1VHTyB8IFNfSVJVU1IgfCBTX0lSR1JQLAorCSAmbnVtX2F1ZGlvZGV2c30sCisJe1NORF9ERVZfQVVESU8sICAgICAiYXVkaW8iLAkgU19JV1VHTyB8IFNfSVJVU1IgfCBTX0lSR1JQLAorCSAmbnVtX2F1ZGlvZGV2c30sCit9OworCitzdGF0aWMgaW50IGRtYWJ1ZjsKK3N0YXRpYyBpbnQgZG1hYnVnOworCittb2R1bGVfcGFyYW0oZG1hYnVmLCBpbnQsIDA0NDQpOworbW9kdWxlX3BhcmFtKGRtYWJ1ZywgaW50LCAwNDQ0KTsKKworc3RhdGljIGludCBfX2luaXQgb3NzX2luaXQodm9pZCkKK3sKKwlpbnQgICAgICAgICAgICAgZXJyOworCWludCBpLCBqOworCQorCS8qIGRyYWcgaW4gc291bmRfc3ltcy5vICovCisJeworCQlleHRlcm4gY2hhciBzb3VuZF9zeW1zX3N5bWJvbDsKKwkJc291bmRfc3ltc19zeW1ib2wgPSAwOworCX0KKworI2lmZGVmIENPTkZJR19QQ0kKKwlpZihkbWFidWcpCisJCWlzYV9kbWFfYnJpZGdlX2J1Z2d5ID0gZG1hYnVnOworI2VuZGlmCisKKwllcnIgPSBjcmVhdGVfc3BlY2lhbF9kZXZpY2VzKCk7CisJaWYgKGVycikgeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kOiBkcml2ZXIgYWxyZWFkeSBsb2FkZWQvaW5jbHVkZWQgaW4ga2VybmVsXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBQcm90ZWN0aW5nIHRoZSBpbm5vY2VudCAqLworCXNvdW5kX2RtYXBfZmxhZyA9IChkbWFidWYgPiAwID8gMSA6IDApOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAoZGV2X2xpc3QpIC8gc2l6ZW9mICpkZXZfbGlzdDsgaSsrKSB7CisJCWRldmZzX21rX2NkZXYoTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yKSwKKwkJCQlTX0lGQ0hSIHwgZGV2X2xpc3RbaV0ubW9kZSwKKwkJCQkic291bmQvJXMiLCBkZXZfbGlzdFtpXS5uYW1lKTsKKwkJY2xhc3Nfc2ltcGxlX2RldmljZV9hZGQoc291bmRfY2xhc3MsIAorCQkJCQlNS0RFVihTT1VORF9NQUpPUiwgZGV2X2xpc3RbaV0ubWlub3IpLAorCQkJCQlOVUxMLCAiJXMiLCBkZXZfbGlzdFtpXS5uYW1lKTsKKworCQlpZiAoIWRldl9saXN0W2ldLm51bSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaiA9IDE7IGogPCAqZGV2X2xpc3RbaV0ubnVtOyBqKyspIHsKKwkJCWRldmZzX21rX2NkZXYoTUtERVYoU09VTkRfTUFKT1IsCisJCQkJCQlkZXZfbGlzdFtpXS5taW5vciArIChqKjB4MTApKSwKKwkJCQkJU19JRkNIUiB8IGRldl9saXN0W2ldLm1vZGUsCisJCQkJCSJzb3VuZC8lcyVkIiwgZGV2X2xpc3RbaV0ubmFtZSwgaik7CisJCQljbGFzc19zaW1wbGVfZGV2aWNlX2FkZChzb3VuZF9jbGFzcywKKwkJCQkJTUtERVYoU09VTkRfTUFKT1IsIGRldl9saXN0W2ldLm1pbm9yICsgKGoqMHgxMCkpLAorCQkJCQlOVUxMLAorCQkJCQkiJXMlZCIsIGRldl9saXN0W2ldLm5hbWUsIGopOworCQl9CisJfQorCisJaWYgKHNvdW5kX25ibG9ja3MgPj0gMTAyNCkKKwkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZCB3YXJuaW5nOiBEZWFsbG9jYXRpb24gdGFibGUgd2FzIHRvbyBzbWFsbC5cbiIpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgb3NzX2NsZWFudXAodm9pZCkKK3sKKwlpbnQgaSwgajsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGRldl9saXN0KSAvIHNpemVvZiAqZGV2X2xpc3Q7IGkrKykgeworCQlkZXZmc19yZW1vdmUoInNvdW5kLyVzIiwgZGV2X2xpc3RbaV0ubmFtZSk7CisJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFNPVU5EX01BSk9SLCBkZXZfbGlzdFtpXS5taW5vcikpOworCQlpZiAoIWRldl9saXN0W2ldLm51bSkKKwkJCWNvbnRpbnVlOworCQlmb3IgKGogPSAxOyBqIDwgKmRldl9saXN0W2ldLm51bTsgaisrKSB7CisJCQlkZXZmc19yZW1vdmUoInNvdW5kLyVzJWQiLCBkZXZfbGlzdFtpXS5uYW1lLCBqKTsKKwkJCWNsYXNzX3NpbXBsZV9kZXZpY2VfcmVtb3ZlKE1LREVWKFNPVU5EX01BSk9SLCBkZXZfbGlzdFtpXS5taW5vciArIChqKjB4MTApKSk7CisJCX0KKwl9CisJCisJdW5yZWdpc3Rlcl9zb3VuZF9zcGVjaWFsKDEpOworCXVucmVnaXN0ZXJfc291bmRfc3BlY2lhbCg4KTsKKworCXNvdW5kX3N0b3BfdGltZXIoKTsKKworCXNlcXVlbmNlcl91bmxvYWQoKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfRE1BX0NIQU5ORUxTOyBpKyspCisJCWlmIChkbWFfYWxsb2NfbWFwW2ldICE9IERNQV9NQVBfVU5BVkFJTCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJTb3VuZDogSG1tLCBETUElZCB3YXMgbGVmdCBhbGxvY2F0ZWQgLSBmaXhlZFxuIiwgaSk7CisJCQlzb3VuZF9mcmVlX2RtYShpKTsKKwkJfQorCisJZm9yIChpID0gMDsgaSA8IHNvdW5kX25ibG9ja3M7IGkrKykKKwkJdmZyZWUoc291bmRfbWVtX2Jsb2Nrc1tpXSk7CisKK30KKworbW9kdWxlX2luaXQob3NzX2luaXQpOworbW9kdWxlX2V4aXQob3NzX2NsZWFudXApOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisKK2ludCBzb3VuZF9hbGxvY19kbWEoaW50IGNobiwgY2hhciAqZGV2aWNlSUQpCit7CisJaW50IGVycjsKKworCWlmICgoZXJyID0gcmVxdWVzdF9kbWEoY2huLCBkZXZpY2VJRCkpICE9IDApCisJCXJldHVybiBlcnI7CisKKwlkbWFfYWxsb2NfbWFwW2Nobl0gPSBETUFfTUFQX0ZSRUU7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHNvdW5kX29wZW5fZG1hKGludCBjaG4sIGNoYXIgKmRldmljZUlEKQoreworCWlmICghdmFsaWRfZG1hKGNobikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZF9vcGVuX2RtYTogSW52YWxpZCBETUEgY2hhbm5lbCAlZFxuIiwgY2huKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKGRtYV9hbGxvY19tYXBbY2huXSAhPSBETUFfTUFQX0ZSRUUpIHsKKwkJcHJpbnRrKCJzb3VuZF9vcGVuX2RtYTogRE1BIGNoYW5uZWwgJWQgYnVzeSBvciBub3QgYWxsb2NhdGVkICglZClcbiIsIGNobiwgZG1hX2FsbG9jX21hcFtjaG5dKTsKKwkJcmV0dXJuIDE7CisJfQorCWRtYV9hbGxvY19tYXBbY2huXSA9IERNQV9NQVBfQlVTWTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzb3VuZF9mcmVlX2RtYShpbnQgY2huKQoreworCWlmIChkbWFfYWxsb2NfbWFwW2Nobl0gPT0gRE1BX01BUF9VTkFWQUlMKSB7CisJCS8qIHByaW50ayggInNvdW5kX2ZyZWVfZG1hOiBCYWQgYWNjZXNzIHRvIERNQSBjaGFubmVsICVkXG4iLCAgY2huKTsgKi8KKwkJcmV0dXJuOworCX0KKwlmcmVlX2RtYShjaG4pOworCWRtYV9hbGxvY19tYXBbY2huXSA9IERNQV9NQVBfVU5BVkFJTDsKK30KKwordm9pZCBzb3VuZF9jbG9zZV9kbWEoaW50IGNobikKK3sKKwlpZiAoZG1hX2FsbG9jX21hcFtjaG5dICE9IERNQV9NQVBfQlVTWSkgeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kX2Nsb3NlX2RtYTogQmFkIGFjY2VzcyB0byBETUEgY2hhbm5lbCAlZFxuIiwgY2huKTsKKwkJcmV0dXJuOworCX0KKwlkbWFfYWxsb2NfbWFwW2Nobl0gPSBETUFfTUFQX0ZSRUU7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3NlcXVlbmNlcl90aW1lcih1bnNpZ25lZCBsb25nIGR1bW15KQoreworCXNlcXVlbmNlcl90aW1lcigwKTsKK30KKworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3Qgc2VxX3RpbWVyID0KKwkJVElNRVJfSU5JVElBTElaRVIoZG9fc2VxdWVuY2VyX3RpbWVyLCAwLCAwKTsKKwordm9pZCByZXF1ZXN0X3NvdW5kX3RpbWVyKGludCBjb3VudCkKK3sKKwlleHRlcm4gdW5zaWduZWQgbG9uZyBzZXFfdGltZTsKKworCWlmIChjb3VudCA8IDApIHsKKwkJc2VxX3RpbWVyLmV4cGlyZXMgPSAoLWNvdW50KSArIGppZmZpZXM7CisJCWFkZF90aW1lcigmc2VxX3RpbWVyKTsKKwkJcmV0dXJuOworCX0KKwljb3VudCArPSBzZXFfdGltZTsKKworCWNvdW50IC09IGppZmZpZXM7CisKKwlpZiAoY291bnQgPCAxKQorCQljb3VudCA9IDE7CisKKwlzZXFfdGltZXIuZXhwaXJlcyA9IChjb3VudCkgKyBqaWZmaWVzOworCWFkZF90aW1lcigmc2VxX3RpbWVyKTsKK30KKwordm9pZCBzb3VuZF9zdG9wX3RpbWVyKHZvaWQpCit7CisJZGVsX3RpbWVyKCZzZXFfdGltZXIpOworfQorCit2b2lkIGNvbmZfcHJpbnRmKGNoYXIgKm5hbWUsIHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKyNpZm5kZWYgQ09ORklHX1NPVU5EX1RSQUNFSU5JVAorCXJldHVybjsKKyNlbHNlCisJcHJpbnRrKCI8JXM+IGF0IDB4JTAzeCIsIG5hbWUsIGh3X2NvbmZpZy0+aW9fYmFzZSk7CisKKwlpZiAoaHdfY29uZmlnLT5pcnEpCisJCXByaW50aygiIGlycSAlZCIsIChod19jb25maWctPmlycSA+IDApID8gaHdfY29uZmlnLT5pcnEgOiAtaHdfY29uZmlnLT5pcnEpOworCisJaWYgKGh3X2NvbmZpZy0+ZG1hICE9IC0xIHx8IGh3X2NvbmZpZy0+ZG1hMiAhPSAtMSkKKwl7CisJCXByaW50aygiIGRtYSAlZCIsIGh3X2NvbmZpZy0+ZG1hKTsKKwkJaWYgKGh3X2NvbmZpZy0+ZG1hMiAhPSAtMSkKKwkJCXByaW50aygiLCVkIiwgaHdfY29uZmlnLT5kbWEyKTsKKwl9CisJcHJpbnRrKCJcbiIpOworI2VuZGlmCit9CisKK3ZvaWQgY29uZl9wcmludGYyKGNoYXIgKm5hbWUsIGludCBiYXNlLCBpbnQgaXJxLCBpbnQgZG1hLCBpbnQgZG1hMikKK3sKKyNpZm5kZWYgQ09ORklHX1NPVU5EX1RSQUNFSU5JVAorCXJldHVybjsKKyNlbHNlCisJcHJpbnRrKCI8JXM+IGF0IDB4JTAzeCIsIG5hbWUsIGJhc2UpOworCisJaWYgKGlycSkKKwkJcHJpbnRrKCIgaXJxICVkIiwgKGlycSA+IDApID8gaXJxIDogLWlycSk7CisKKwlpZiAoZG1hICE9IC0xIHx8IGRtYTIgIT0gLTEpCisJeworCQkgIHByaW50aygiIGRtYSAlZCIsIGRtYSk7CisJCSAgaWYgKGRtYTIgIT0gLTEpCisJCQkgIHByaW50aygiLCVkIiwgZG1hMik7CisJfQorCXByaW50aygiXG4iKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NvdW5kdmVycy5oIGIvc291bmQvb3NzL3NvdW5kdmVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDg0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc291bmR2ZXJzLmgKQEAgLTAsMCArMSwyIEBACisjZGVmaW5lIFNPVU5EX1ZFUlNJT05fU1RSSU5HICIzLjhzMisrLTk3MTEzMCIKKyNkZWZpbmUgU09VTkRfSU5URVJOQUxfVkVSU0lPTiAweDAzMDgwNApkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3NzY2FwZS5jIGIvc291bmQvb3NzL3NzY2FwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwY2E2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvc3NjYXBlLmMKQEAgLTAsMCArMSwxNDg1IEBACisvKgorICogc291bmQvc3NjYXBlLmMKKyAqCisgKiBMb3cgbGV2ZWwgZHJpdmVyIGZvciBFbnNvbmlxIFNvdW5kU2NhcGUKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NworICoKKyAqIE9TUy9GcmVlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICoKKyAqIFRob21hcyBTYWlsZXIgICAJOiBpb2N0bCBjb2RlIHJld29ya2VkICh2bWFsbG9jL3ZmcmVlIHJlbW92ZWQpCisgKiBTZXJnZXkgU21pdGllbmtvCTogZW5zb25pcSBwJ24ncCBzdXBwb3J0CisgKiBDaHJpc3RvcGggSGVsbHdpZwk6IGFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQKKyAqIEJhcnRsb21pZWogWm9sbmllcmtpZXdpY3ogOiBhZGRlZCBfX2luaXQgdG8gYXR0YWNoX3NzY2FwZSgpCisgKiBDaHJpcyBSYW5raW4JCTogU3BlY2lmeSB0aGF0IHRoaXMgbW9kdWxlIG93bnMgdGhlIGNvcHJvY2Vzc29yCisgKiBBcm5hbGRvIEMuIGRlIE1lbG8JOiBhZGRlZCBtaXNzaW5nIHJlc3RvcmVfZmxhZ3MgaW4gc3NjYXBlX3BucF91cGxvYWRfZmlsZQorICovCisKKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJzb3VuZF9maXJtd2FyZS5oIgorCisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KKyNpbmNsdWRlIDxsaW51eC9rbW9kLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKworI2luY2x1ZGUgImNvcHJvYy5oIgorCisjaW5jbHVkZSAiYWQxODQ4LmgiCisjaW5jbHVkZSAibXB1NDAxLmgiCisKKy8qCisgKiAgICBJL08gcG9ydHMKKyAqLworI2RlZmluZSBNSURJX0RBVEEgICAgICAgMAorI2RlZmluZSBNSURJX0NUUkwgICAgICAgMQorI2RlZmluZSBIT1NUX0NUUkwgICAgICAgMgorI2RlZmluZSBUWF9SRUFEWQkweDAyCisjZGVmaW5lIFJYX1JFQURZCTB4MDEKKyNkZWZpbmUgSE9TVF9EQVRBICAgICAgIDMKKyNkZWZpbmUgT0RJRV9BRERSICAgICAgIDQKKyNkZWZpbmUgT0RJRV9EQVRBICAgICAgIDUKKworLyoKKyAqICAgIEluZGlyZWN0IHJlZ2lzdGVycworICovCisKKyNkZWZpbmUgR0FfSU5UU1RBVF9SRUcJMAorI2RlZmluZSBHQV9JTlRFTkFfUkVHCTEKKyNkZWZpbmUgR0FfRE1BQV9SRUcJMgorI2RlZmluZSBHQV9ETUFCX1JFRwkzCisjZGVmaW5lIEdBX0lOVENGR19SRUcJNAorI2RlZmluZSBHQV9ETUFDRkdfUkVHCTUKKyNkZWZpbmUgR0FfQ0RDRkdfUkVHCTYKKyNkZWZpbmUgR0FfU01DRkdBX1JFRwk3CisjZGVmaW5lIEdBX1NNQ0ZHQl9SRUcJOAorI2RlZmluZSBHQV9ITUNUTF9SRUcJOQorCisvKgorICogRE1BIGNoYW5uZWwgaWRlbnRpZmllcnMgKEEgYW5kIEIpCisgKi8KKworI2RlZmluZSBTU0NBUEVfRE1BX0EJMAorI2RlZmluZSBTU0NBUEVfRE1BX0IJMQorCisjZGVmaW5lIFBPUlQobmFtZSkJKGRldmMtPmJhc2UrbmFtZSkKKworLyoKKyAqIEhvc3QgY29tbWFuZHMgcmVjb2duaXplZCBieSB0aGUgT0JQIG1pY3JvY29kZQorICovCisgCisjZGVmaW5lIENNRF9HRU5fSE9TVF9BQ0sJMHg4MAorI2RlZmluZSBDTURfR0VOX01QVV9BQ0sJCTB4ODEKKyNkZWZpbmUgQ01EX0dFVF9CT0FSRF9UWVBFCTB4ODIKKyNkZWZpbmUgQ01EX1NFVF9DT05UUk9MCQkweDg4CS8qIE9sZCBmaXJtd2FyZSBvbmx5ICovCisjZGVmaW5lIENNRF9HRVRfQ09OVFJPTAkJMHg4OQkvKiBPbGQgZmlybXdhcmUgb25seSAqLworI2RlZmluZSBDVExfTUFTVEVSX1ZPTAkJMAorI2RlZmluZSBDVExfTUlDX01PREUJCTIKKyNkZWZpbmUgQ1RMX1NZTlRIX1ZPTAkJNAorI2RlZmluZSBDVExfV0FWRV9WT0wJCTcKKyNkZWZpbmUgQ01EX1NFVF9FWFRNSURJCQkweDhhCisjZGVmaW5lIENNRF9HRVRfRVhUTUlESQkJMHg4YgorI2RlZmluZSBDTURfU0VUX01UMzIJCTB4OGMKKyNkZWZpbmUgQ01EX0dFVF9NVDMyCQkweDhkCisKKyNkZWZpbmUgQ01EX0FDSwkJCTB4ODAKKworI2RlZmluZQlJQ19PRElFCQkJMQorI2RlZmluZQlJQ19PUFVTCQkJMgorCit0eXBlZGVmIHN0cnVjdCBzc2NhcGVfaW5mbworeworCWludAliYXNlLCBpcnEsIGRtYTsKKwkKKwlpbnQJY29kZWMsIGNvZGVjX2lycTsJLyogcmVxdWlyZWQgdG8gc2V0dXAgcG5wIGNhcmRzKi8KKwlpbnQJY29kZWNfdHlwZTsKKwlpbnQJaWNfdHlwZTsKKwljaGFyKglyYXdfYnVmOworCXVuc2lnbmVkIGxvbmcJcmF3X2J1Zl9waHlzOworCWludAlidWZmc2l6ZTsJCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisJc3BpbmxvY2tfdCBsb2NrOworCWludAlvazsJLyogUHJvcGVybHkgZGV0ZWN0ZWQgKi8KKwlpbnQJZmFpbGVkOworCWludAlkbWFfYWxsb2NhdGVkOworCWludAljb2RlY19hdWRpb2RldjsKKwlpbnQJb3BlbmVkOworCWludAkqb3NwOworCWludAlteV9hdWRpb2RldjsKK30gc3NjYXBlX2luZm87CisKK3N0YXRpYyBzdHJ1Y3Qgc3NjYXBlX2luZm8gYWRldl9pbmZvID0geworCTAKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMgPSAmYWRldl9pbmZvOworc3RhdGljIGludCBzc2NhcGVfbWlkaWRldiA9IC0xOworCisvKiBTb21lIG9sZGVyIGNhcmRzIGhhdmUgYXNzaWduZWQgaW50ZXJydXB0IGJpdHMgZGlmZmVyZW50bHkgdGhhbiBuZXcgb25lcyAqLworc3RhdGljIGNoYXIgdmFsaWRfaW50ZXJydXB0c19vbGRbXSA9IHsKKwk5LCA3LCA1LCAxNQorfTsKKworc3RhdGljIGNoYXIgdmFsaWRfaW50ZXJydXB0c19uZXdbXSA9IHsKKwk5LCA1LCA3LCAxMAorfTsKKworc3RhdGljIGNoYXIgKnZhbGlkX2ludGVycnVwdHMgPSB2YWxpZF9pbnRlcnJ1cHRzX25ldzsKKworLyoKKyAqCVNlZSB0aGUgYm90dG9tIG9mIHRoZSBkcml2ZXIuIFRoaXMgY2FuIGJlIHNldCBieSBzcGVhID0wLzEuCisgKi8KKyAKKyNpZmRlZiBSRVZFQUxfU1BFQQorc3RhdGljIGNoYXIgb2xkX2hhcmR3YXJlID0gMTsKKyNlbHNlCitzdGF0aWMgY2hhciBvbGRfaGFyZHdhcmU7CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2xlZXAodW5zaWduZWQgaG93bG9uZykKK3sKKwljdXJyZW50LT5zdGF0ZSA9IFRBU0tfSU5URVJSVVBUSUJMRTsKKwlzY2hlZHVsZV90aW1lb3V0KGhvd2xvbmcpOworfQorCitzdGF0aWMgdW5zaWduZWQgY2hhciBzc2NhcGVfcmVhZChzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCByZWcpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlvdXRiKHJlZywgUE9SVChPRElFX0FERFIpKTsKKwl2YWwgPSBpbmIoUE9SVChPRElFX0RBVEEpKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgdm9pZCBfX3NzY2FwZV93cml0ZShpbnQgcmVnLCBpbnQgZGF0YSkKK3sKKwlvdXRiKHJlZywgUE9SVChPRElFX0FERFIpKTsKKwlvdXRiKGRhdGEsIFBPUlQoT0RJRV9EQVRBKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNzY2FwZV93cml0ZShzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCByZWcsIGludCBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJX19zc2NhcGVfd3JpdGUocmVnLCBkYXRhKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgc3NjYXBlX3BucF9yZWFkX2NvZGVjKHNzY2FwZV9pbmZvKiBkZXZjLCB1bnNpZ25lZCBjaGFyIHJlZykKK3sKKwl1bnNpZ25lZCBjaGFyIHJlczsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCW91dGIoIHJlZywgZGV2YyAtPiBjb2RlYyk7CisJcmVzID0gaW5iIChkZXZjIC0+IGNvZGVjICsgMSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJcmV0dXJuIHJlczsKKworfQorCitzdGF0aWMgdm9pZCBzc2NhcGVfcG5wX3dyaXRlX2NvZGVjKHNzY2FwZV9pbmZvKiBkZXZjLCB1bnNpZ25lZCBjaGFyIHJlZywgdW5zaWduZWQgY2hhciBkYXRhKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCW91dGIoIHJlZywgZGV2YyAtPiBjb2RlYyk7CisJb3V0YiggZGF0YSwgZGV2YyAtPiBjb2RlYyArIDEpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBob3N0X29wZW4oc3RydWN0IHNzY2FwZV9pbmZvICpkZXZjKQoreworCW91dGIoKDB4MDApLCBQT1JUKEhPU1RfQ1RSTCkpOwkvKiBQdXQgdGhlIGJvYXJkIHRvIHRoZSBob3N0IG1vZGUgKi8KK30KKworc3RhdGljIHZvaWQgaG9zdF9jbG9zZShzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMpCit7CisJb3V0YigoMHgwMyksIFBPUlQoSE9TVF9DVFJMKSk7CS8qIFB1dCB0aGUgYm9hcmQgdG8gdGhlIE1JREkgbW9kZSAqLworfQorCitzdGF0aWMgaW50IGhvc3Rfd3JpdGUoc3RydWN0IHNzY2FwZV9pbmZvICpkZXZjLCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgY291bnQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgdGltZW91dF92YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJLyoKKwkgKiBTZW5kIHRoZSBjb21tYW5kIGFuZCBkYXRhIGJ5dGVzCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwl7CisJCWZvciAodGltZW91dF92YWwgPSAxMDAwMDsgdGltZW91dF92YWwgPiAwOyB0aW1lb3V0X3ZhbC0tKQorCQkJaWYgKGluYihQT1JUKEhPU1RfQ1RSTCkpICYgVFhfUkVBRFkpCisJCQkJYnJlYWs7CisKKwkJaWYgKHRpbWVvdXRfdmFsIDw9IDApCisJCXsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJCSAgICByZXR1cm4gMDsKKwkJfQorCQlvdXRiKGRhdGFbaV0sIFBPUlQoSE9TVF9EQVRBKSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGhvc3RfcmVhZChzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgdGltZW91dF92YWw7CisJdW5zaWduZWQgY2hhciBkYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCS8qCisJICogUmVhZCBhIGJ5dGUKKwkgKi8KKworCWZvciAodGltZW91dF92YWwgPSAxMDAwMDsgdGltZW91dF92YWwgPiAwOyB0aW1lb3V0X3ZhbC0tKQorCQlpZiAoaW5iKFBPUlQoSE9TVF9DVFJMKSkgJiBSWF9SRUFEWSkKKwkJCWJyZWFrOworCisJaWYgKHRpbWVvdXRfdmFsIDw9IDApCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIC0xOworCX0KKwlkYXRhID0gaW5iKFBPUlQoSE9TVF9EQVRBKSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJcmV0dXJuIGRhdGE7Cit9CisKKyNpZiAwIC8qIHVudXNlZCAqLworc3RhdGljIGludCBob3N0X2NvbW1hbmQxKHN0cnVjdCBzc2NhcGVfaW5mbyAqZGV2YywgaW50IGNtZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisJYnVmWzBdID0gKHVuc2lnbmVkIGNoYXIpIChjbWQgJiAweGZmKTsKKwlyZXR1cm4gaG9zdF93cml0ZShkZXZjLCBidWYsIDEpOworfQorI2VuZGlmIC8qIHVudXNlZCAqLworCisKK3N0YXRpYyBpbnQgaG9zdF9jb21tYW5kMihzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCBjbWQsIGludCBwYXJtMSkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsxMF07CisKKwlidWZbMF0gPSAodW5zaWduZWQgY2hhcikgKGNtZCAmIDB4ZmYpOworCWJ1ZlsxXSA9ICh1bnNpZ25lZCBjaGFyKSAocGFybTEgJiAweGZmKTsKKworCXJldHVybiBob3N0X3dyaXRlKGRldmMsIGJ1ZiwgMik7Cit9CisKK3N0YXRpYyBpbnQgaG9zdF9jb21tYW5kMyhzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCBjbWQsIGludCBwYXJtMSwgaW50IHBhcm0yKQoreworCXVuc2lnbmVkIGNoYXIgYnVmWzEwXTsKKworCWJ1ZlswXSA9ICh1bnNpZ25lZCBjaGFyKSAoY21kICYgMHhmZik7CisJYnVmWzFdID0gKHVuc2lnbmVkIGNoYXIpIChwYXJtMSAmIDB4ZmYpOworCWJ1ZlsyXSA9ICh1bnNpZ25lZCBjaGFyKSAocGFybTIgJiAweGZmKTsKKwlyZXR1cm4gaG9zdF93cml0ZShkZXZjLCBidWYsIDMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfbXQzMihzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCB2YWx1ZSkKK3sKKwlob3N0X29wZW4oZGV2Yyk7CisJaG9zdF9jb21tYW5kMihkZXZjLCBDTURfU0VUX01UMzIsIHZhbHVlID8gMSA6IDApOworCWlmIChob3N0X3JlYWQoZGV2YykgIT0gQ01EX0FDSykKKwl7CisJCS8qIHByaW50ayggIlNORFNDQVBFOiBTZXR0aW5nIE1UMzIgbW9kZSBmYWlsZWRcbiIpOyAqLworCX0KKwlob3N0X2Nsb3NlKGRldmMpOworfQorCitzdGF0aWMgdm9pZCBzZXRfY29udHJvbChzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMsIGludCBjdHJsLCBpbnQgdmFsdWUpCit7CisJaG9zdF9vcGVuKGRldmMpOworCWhvc3RfY29tbWFuZDMoZGV2YywgQ01EX1NFVF9DT05UUk9MLCBjdHJsLCB2YWx1ZSk7CisJaWYgKGhvc3RfcmVhZChkZXZjKSAhPSBDTURfQUNLKQorCXsKKwkJLyogcHJpbnRrKCAiU05EU0NBUEU6IFNldHRpbmcgY29udHJvbCAoJWQpIGZhaWxlZFxuIiwgIGN0cmwpOyAqLworCX0KKwlob3N0X2Nsb3NlKGRldmMpOworfQorCitzdGF0aWMgdm9pZCBkb19kbWEoc3RydWN0IHNzY2FwZV9pbmZvICpkZXZjLCBpbnQgZG1hX2NoYW4sIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgYmxrX3NpemUsIGludCBtb2RlKQoreworCXVuc2lnbmVkIGNoYXIgdGVtcDsKKworCWlmIChkbWFfY2hhbiAhPSBTU0NBUEVfRE1BX0EpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJzb3VuZHNjYXBlOiBUcmllZCB0byB1c2UgRE1BIGNoYW5uZWwgICE9IEEuIFdoeT9cbiIpOworCQlyZXR1cm47CisJfQorCWF1ZGlvX2RldnNbZGV2Yy0+Y29kZWNfYXVkaW9kZXZdLT5mbGFncyAmPSB+RE1BX0FVVE9NT0RFOworCURNQWJ1Zl9zdGFydF9kbWEoZGV2Yy0+Y29kZWNfYXVkaW9kZXYsIGJ1ZiwgYmxrX3NpemUsIG1vZGUpOworCWF1ZGlvX2RldnNbZGV2Yy0+Y29kZWNfYXVkaW9kZXZdLT5mbGFncyB8PSBETUFfQVVUT01PREU7CisKKwl0ZW1wID0gZGV2Yy0+ZG1hIDw8IDQ7CS8qIFNldHVwIERNQSBjaGFubmVsIHNlbGVjdCBiaXRzICovCisJaWYgKGRldmMtPmRtYSA8PSAzKQorCQl0ZW1wIHw9IDB4ODA7CS8qIDggYml0IERNQSBjaGFubmVsICovCisKKwl0ZW1wIHw9IDE7CQkvKiBUcmlnZ2VyIERNQSAqLworCXNzY2FwZV93cml0ZShkZXZjLCBHQV9ETUFBX1JFRywgdGVtcCk7CisJdGVtcCAmPSAweGZlOwkJLyogQ2xlYXIgRE1BIHRyaWdnZXIgKi8KKwlzc2NhcGVfd3JpdGUoZGV2YywgR0FfRE1BQV9SRUcsIHRlbXApOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9tcHUoc3RydWN0IHNzY2FwZV9pbmZvICpkZXZjKQoreworCS8qCisJICogVGhlIFNvdW5kU2NhcGUgYm9hcmQgY291bGQgYmUgaW4gdGhyZWUgbW9kZXMgKE1QVSwgODI1MCBhbmQgaG9zdCkuCisJICogSWYgdGhlIGNhcmQgaXMgbm90IGluIHRoZSBNUFUgbW9kZSwgZW5hYmxpbmcgdGhlIE1QVSBkcml2ZXIgd2lsbAorCSAqIGNhdXNlIGluZmluaXRlIGxvb3AgKHRoZSBkcml2ZXIgYmVsaWV2ZXMgdGhhdCB0aGVyZSBpcyBhbHdheXMgc29tZQorCSAqIHJlY2VpdmVkIGRhdGEgaW4gdGhlIGJ1ZmZlci4KKwkgKgorCSAqIERldGVjdCB0aGlzIGJ5IGxvb2tpbmcgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiAxMCByZWNlaXZlZCBNSURJIGJ5dGVzCisJICogKDB4MDApIGluIHRoZSBidWZmZXIuCisJICovCisKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCAxMDsgaSsrKQorCXsKKwkJaWYgKGluYihkZXZjLT5iYXNlICsgSE9TVF9DVFJMKSAmIDB4ODApCisJCQlyZXR1cm4gMTsKKworCQlpZiAoaW5iKGRldmMtPmJhc2UpICE9IDB4MDApCisJCQlyZXR1cm4gMTsKKwl9CisJcHJpbnRrKEtFUk5fV0FSTklORyAiU291bmRTY2FwZTogVGhlIGRldmljZSBpcyBub3QgaW4gdGhlIE1QVS00MDEgbW9kZVxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3NjYXBlX2NvcHJvY19vcGVuKHZvaWQgKmRldl9pbmZvLCBpbnQgc3ViX2RldmljZSkKK3sKKwlpZiAoc3ViX2RldmljZSA9PSBDT1BSX01JREkpCisJeworCQlzZXRfbXQzMihkZXZjLCAwKTsKKwkJaWYgKCF2ZXJpZnlfbXB1KGRldmMpKQorCQkJcmV0dXJuIC1FSU87CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzc2NhcGVfY29wcm9jX2Nsb3NlKHZvaWQgKmRldl9pbmZvLCBpbnQgc3ViX2RldmljZSkKK3sKKwlzdHJ1Y3Qgc3NjYXBlX2luZm8gKmRldmMgPSBkZXZfaW5mbzsKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJaWYgKGRldmMtPmRtYV9hbGxvY2F0ZWQpCisJeworCQlfX3NzY2FwZV93cml0ZShHQV9ETUFBX1JFRywgMHgyMCk7CS8qIERNQSBjaGFubmVsIGRpc2FibGVkICovCisJCWRldmMtPmRtYV9hbGxvY2F0ZWQgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIHNzY2FwZV9jb3Byb2NfcmVzZXQodm9pZCAqZGV2X2luZm8pCit7Cit9CisKK3N0YXRpYyBpbnQgc3NjYXBlX2Rvd25sb2FkX2Jvb3Qoc3RydWN0IHNzY2FwZV9pbmZvICpkZXZjLCB1bnNpZ25lZCBjaGFyICpibG9jaywgaW50IHNpemUsIGludCBmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgY2hhciB0ZW1wOworCXZvbGF0aWxlIGludCBkb25lLCB0aW1lb3V0X3ZhbDsKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBjb2RlY19kbWFfYml0czsKKworCWlmIChmbGFnICYgQ1BGX0ZJUlNUKQorCXsKKwkJLyoKKwkJICogRmlyc3QgYmxvY2suIEhhdmUgdG8gYWxsb2NhdGUgRE1BIGFuZCB0byByZXNldCB0aGUgYm9hcmQKKwkJICogYmVmb3JlIGNvbnRpbnVpbmcuCisJCSAqLworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJY29kZWNfZG1hX2JpdHMgPSBzc2NhcGVfcmVhZChkZXZjLCBHQV9DRENGR19SRUcpOworCisJCWlmIChkZXZjLT5kbWFfYWxsb2NhdGVkID09IDApCisJCQlkZXZjLT5kbWFfYWxsb2NhdGVkID0gMTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKworCQlzc2NhcGVfd3JpdGUoZGV2YywgR0FfSE1DVExfUkVHLCAKKwkJCSh0ZW1wID0gc3NjYXBlX3JlYWQoZGV2YywgR0FfSE1DVExfUkVHKSkgJiAweDNmKTsJLypSZXNldCAqLworCisJCWZvciAodGltZW91dF92YWwgPSAxMDAwMDsgdGltZW91dF92YWwgPiAwOyB0aW1lb3V0X3ZhbC0tKQorCQkJc3NjYXBlX3JlYWQoZGV2YywgR0FfSE1DVExfUkVHKTsJLyogRGVsYXkgKi8KKworCQkvKiBUYWtlIGJvYXJkIG91dCBvZiByZXNldCAqLworCQlzc2NhcGVfd3JpdGUoZGV2YywgR0FfSE1DVExfUkVHLAorCQkJKHRlbXAgPSBzc2NhcGVfcmVhZChkZXZjLCBHQV9ITUNUTF9SRUcpKSB8IDB4ODApOworCX0KKwkvKgorCSAqIFRyYW5zZmVyIG9uZSBjb2RlIGJsb2NrIHVzaW5nIERNQQorCSAqLworCWlmIChhdWRpb19kZXZzW2RldmMtPmNvZGVjX2F1ZGlvZGV2XS0+ZG1hcF9vdXQtPnJhd19idWYgPT0gTlVMTCkKKwl7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvdW5kc2NhcGU6IERNQSBidWZmZXIgbm90IGF2YWlsYWJsZVxuIik7CisJCXJldHVybiAwOworCX0KKwltZW1jcHkoYXVkaW9fZGV2c1tkZXZjLT5jb2RlY19hdWRpb2Rldl0tPmRtYXBfb3V0LT5yYXdfYnVmLCBibG9jaywgc2l6ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCisJLyoqKioqKioqIElOVEVSUlVQVFMgRElTQUJMRUQgTk9XICoqKioqKioqLworCQorCWRvX2RtYShkZXZjLCBTU0NBUEVfRE1BX0EsCisJICAgICAgIGF1ZGlvX2RldnNbZGV2Yy0+Y29kZWNfYXVkaW9kZXZdLT5kbWFwX291dC0+cmF3X2J1Zl9waHlzLAorCSAgICAgICBzaXplLCBETUFfTU9ERV9XUklURSk7CisKKwkvKgorCSAqIFdhaXQgdW50aWwgdHJhbnNmZXIgY29tcGxldGVzLgorCSAqLworCQorCWRvbmUgPSAwOworCXRpbWVvdXRfdmFsID0gMzA7CisJd2hpbGUgKCFkb25lICYmIHRpbWVvdXRfdmFsLS0gPiAwKQorCXsKKwkJaW50IHJlc2lkOworCisJCWlmIChIWiAvIDUwKQorCQkJc2xlZXAoSFogLyA1MCk7CisJCWNsZWFyX2RtYV9mZihkZXZjLT5kbWEpOworCQlpZiAoKHJlc2lkID0gZ2V0X2RtYV9yZXNpZHVlKGRldmMtPmRtYSkpID09IDApCisJCQlkb25lID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwlpZiAoIWRvbmUpCisJCXJldHVybiAwOworCisJaWYgKGZsYWcgJiBDUEZfTEFTVCkKKwl7CisJCS8qCisJCSAqIFRha2UgdGhlIGJvYXJkIG91dCBvZiByZXNldAorCQkgKi8KKwkJb3V0YigoMHgwMCksIFBPUlQoSE9TVF9DVFJMKSk7CisJCW91dGIoKDB4MDApLCBQT1JUKE1JRElfQ1RSTCkpOworCisJCXRlbXAgPSBzc2NhcGVfcmVhZChkZXZjLCBHQV9ITUNUTF9SRUcpOworCQl0ZW1wIHw9IDB4NDA7CisJCXNzY2FwZV93cml0ZShkZXZjLCBHQV9ITUNUTF9SRUcsIHRlbXApOwkvKiBLaWNrc3RhcnQgdGhlIGJvYXJkICovCisKKwkJLyoKKwkJICogV2FpdCB1bnRpbCB0aGUgT0RCIHdha2VzIHVwCisJCSAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCWRvbmUgPSAwOworCQl0aW1lb3V0X3ZhbCA9IDUgKiBIWjsKKwkJd2hpbGUgKCFkb25lICYmIHRpbWVvdXRfdmFsLS0gPiAwKQorCQl7CisJCQl1bnNpZ25lZCBjaGFyIHg7CisJCQkKKwkJCXNsZWVwKDEpOworCQkJeCA9IGluYihQT1JUKEhPU1RfREFUQSkpOworCQkJaWYgKHggPT0gMHhmZiB8fCB4ID09IDB4ZmUpCQkvKiBPQlAgc3RhcnR1cCBhY2tub3dsZWRnZSAqLworCQkJeworCQkJCUREQihwcmludGsoIlNvdW5kc2NhcGU6IEFja25vd2xlZGdlID0gJXhcbiIsIHgpKTsKKwkJCQlkb25lID0gMTsKKwkJCX0KKwkJfQorCQlzc2NhcGVfd3JpdGUoZGV2YywgR0FfQ0RDRkdfUkVHLCBjb2RlY19kbWFfYml0cyk7CisKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCWlmICghZG9uZSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZHNjYXBlOiBUaGUgT0JQIGRpZG4ndCByZXNwb25kIGFmdGVyIGNvZGUgZG93bmxvYWRcbiIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQlkb25lID0gMDsKKwkJdGltZW91dF92YWwgPSA1ICogSFo7CisJCXdoaWxlICghZG9uZSAmJiB0aW1lb3V0X3ZhbC0tID4gMCkKKwkJeworCQkJc2xlZXAoMSk7CisJCQlpZiAoaW5iKFBPUlQoSE9TVF9EQVRBKSkgPT0gMHhmZSkJLyogSG9zdCBzdGFydHVwIGFja25vd2xlZGdlICovCisJCQkJZG9uZSA9IDE7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisJCWlmICghZG9uZSkKKwkJeworCQkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZHNjYXBlOiBPQlAgSW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwcmludGsoS0VSTl9JTkZPICJTb3VuZFNjYXBlIGJvYXJkIGluaXRpYWxpemVkIE9LXG4iKTsKKwkJc2V0X2NvbnRyb2woZGV2YywgQ1RMX01BU1RFUl9WT0wsIDEwMCk7CisJCXNldF9jb250cm9sKGRldmMsIENUTF9TWU5USF9WT0wsIDEwMCk7CisKKyNpZmRlZiBTU0NBUEVfREVCVUczCisJCS8qCisJCSAqIFRlbXBvcmFyeSBkZWJ1Z2dpbmcgYWlkLiBQcmludCBjb250ZW50cyBvZiB0aGUgcmVnaXN0ZXJzIGFmdGVyCisJCSAqIGRvd25sb2FkaW5nIHRoZSBjb2RlLgorCQkgKi8KKwkJeworCQkJaW50IGk7CisKKwkJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorCQkJCXByaW50aygiSSVkID0gJTAyeCAobmV3IHZhbHVlKVxuIiwgaSwgc3NjYXBlX3JlYWQoZGV2YywgaSkpOworCQl9CisjZW5kaWYKKworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBkb3dubG9hZF9ib290X2Jsb2NrKHZvaWQgKmRldl9pbmZvLCBjb3ByX2J1ZmZlciAqIGJ1ZikKK3sKKwlpZiAoYnVmLT5sZW4gPD0gMCB8fCBidWYtPmxlbiA+IHNpemVvZihidWYtPmRhdGEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICghc3NjYXBlX2Rvd25sb2FkX2Jvb3QoZGV2YywgYnVmLT5kYXRhLCBidWYtPmxlbiwgYnVmLT5mbGFncykpCisJeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kc2NhcGU6IFVuYWJsZSB0byBsb2FkIG1pY3JvY29kZSBibG9jayB0byB0aGUgT0JQLlxuIik7CisJCXJldHVybiAtRUlPOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzc2NhcGVfY29wcm9jX2lvY3RsKHZvaWQgKmRldl9pbmZvLCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnLCBpbnQgbG9jYWwpCit7CisJY29wcl9idWZmZXIgKmJ1ZjsKKwlpbnQgZXJyOworCisJc3dpdGNoIChjbWQpIAorCXsKKwkJY2FzZSBTTkRDVExfQ09QUl9SRVNFVDoKKwkJCXNzY2FwZV9jb3Byb2NfcmVzZXQoZGV2X2luZm8pOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTTkRDVExfQ09QUl9MT0FEOgorCQkJYnVmID0gKGNvcHJfYnVmZmVyICopIHZtYWxsb2Moc2l6ZW9mKGNvcHJfYnVmZmVyKSk7CisJCQlpZiAoYnVmID09IE5VTEwpCisJCQkJcmV0dXJuIC1FTk9TUEM7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoYnVmLCBhcmcsIHNpemVvZihjb3ByX2J1ZmZlcikpKSAKKwkJCXsKKwkJCQl2ZnJlZShidWYpOworCQkJCXJldHVybiAtRUZBVUxUOworCQkJfQorCQkJZXJyID0gZG93bmxvYWRfYm9vdF9ibG9jayhkZXZfaW5mbywgYnVmKTsKKwkJCXZmcmVlKGJ1Zik7CisJCQlyZXR1cm4gZXJyOworCQkKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGNvcHJvY19vcGVyYXRpb25zIHNzY2FwZV9jb3Byb2Nfb3BlcmF0aW9ucyA9Cit7CisJIlNvdW5kU2NhcGUgTTY4SyIsCisJVEhJU19NT0RVTEUsCisJc3NjYXBlX2NvcHJvY19vcGVuLAorCXNzY2FwZV9jb3Byb2NfY2xvc2UsCisJc3NjYXBlX2NvcHJvY19pb2N0bCwKKwlzc2NhcGVfY29wcm9jX3Jlc2V0LAorCSZhZGV2X2luZm8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKnNzY2FwZV9wb3J0czsKK3N0YXRpYyBpbnQgc3NjYXBlX2lzX3BucDsKKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF9zc2NhcGUoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworI2lmbmRlZiBTU0NBUEVfUkVHUworCS8qCisJICogQ29uZmlnIHJlZ2lzdGVyIHZhbHVlcyBmb3IgU3BlYS9WNyBNZWRpYSBGWCBhbmQgRW5zb25pcSBTLTIwMDAuCisJICogVGhlc2UgdmFsdWVzIGFyZSBjYXJkCisJICogZGVwZW5kZW50LiBJZiB5b3UgaGF2ZSBhbm90aGVyIFNvdW5kU2NhcGUgYmFzZWQgY2FyZCwgeW91IGhhdmUgdG8KKwkgKiBmaW5kIHRoZSBjb3JyZWN0IHZhbHVlcy4gRG8gdGhlIGZvbGxvd2luZzoKKwkgKiAgLSBDb21waWxlIHRoaXMgZHJpdmVyIHdpdGggU1NDQVBFX0RFQlVHMSBkZWZpbmVkLgorCSAqICAtIFNodXQgZG93biBhbmQgcG93ZXIgb2ZmIHlvdXIgbWFjaGluZS4KKwkgKiAgLSBCb290IHdpdGggRE9TIHNvIHRoYXQgdGhlIFNTSU5JVC5FWEUgcHJvZ3JhbSBpcyBydW4uCisJICogIC0gV2FybSBib290IHRvIHtMaW51eHxTWVNWfEJTRH0gYW5kIHdyaXRlIGRvd24gdGhlIGxpbmVzIGRpc3BsYXllZAorCSAqICAgIHdoZW4gZGV0ZWN0aW5nIHRoZSBTb3VuZFNjYXBlLgorCSAqICAtIE1vZGlmeSB0aGUgZm9sbG93aW5nIGxpc3QgdG8gdXNlIHRoZSB2YWx1ZXMgcHJpbnRlZCBkdXJpbmcgYm9vdC4KKwkgKiAgICBVbmRlZmluZSB0aGUgU1NDQVBFX0RFQlVHMQorCSAqLworI2RlZmluZSBTU0NBUEVfUkVHUyB7IFwKKy8qIEkwICovCTB4MDAsIFwKKy8qIEkxICovCTB4ZjAsIC8qIE5vdGUhIElnbm9yZWQuIFNldCBhbHdheXMgdG8gMHhmMCAqLyBcCisvKiBJMiAqLwkweDIwLCAvKiBOb3RlISBJZ25vcmVkLiBTZXQgYWx3YXlzIHRvIDB4MjAgKi8gXAorLyogSTMgKi8JMHgyMCwgLyogTm90ZSEgSWdub3JlZC4gU2V0IGFsd2F5cyB0byAweDIwICovIFwKKy8qIEk0ICovCTB4ZjUsIC8qIElnbm9yZWQgKi8gXAorLyogSTUgKi8JMHgxMCwgXAorLyogSTYgKi8JMHgwMCwgXAorLyogSTcgKi8JMHgyZSwgLyogSTcgTUVNIGNvbmZpZyBBLiBMaWtlbHkgdG8gdmFyeSBiZXR3ZWVuIG1vZGVscyAqLyBcCisvKiBJOCAqLwkweDAwLCAvKiBJOCBNRU0gY29uZmlnIEIuIExpa2VseSB0byB2YXJ5IGJldHdlZW4gbW9kZWxzICovIFwKKy8qIEk5ICovCTB4NDAgLyogSWdub3JlZCAqLyBcCisJfQorI2VuZGlmCisKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisJc3RhdGljIHVuc2lnbmVkIGNoYXIgcmVnc1sxMF0gPSBTU0NBUEVfUkVHUzsKKworCWludCBpLCBpcnFfYml0cyA9IDB4ZmY7CisKKwlpZiAob2xkX2hhcmR3YXJlKQorCXsKKwkJdmFsaWRfaW50ZXJydXB0cyA9IHZhbGlkX2ludGVycnVwdHNfb2xkOworCQljb25mX3ByaW50ZigiRW5zb25pcSBTb3VuZFNjYXBlIChvbGQpIiwgaHdfY29uZmlnKTsKKwl9CisJZWxzZQorCQljb25mX3ByaW50ZigiRW5zb25pcSBTb3VuZFNjYXBlIiwgaHdfY29uZmlnKTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJeworCQlpZiAoaHdfY29uZmlnLT5pcnEgPT0gdmFsaWRfaW50ZXJydXB0c1tpXSkKKwkJeworCQkJaXJxX2JpdHMgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGh3X2NvbmZpZy0+aXJxID4gMTUgfHwgKHJlZ3NbNF0gPSBpcnFfYml0cyA9PSAweGZmKSkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCBJUlElZFxuIiwgaHdfY29uZmlnLT5pcnEpOworCQlyZWxlYXNlX3JlZ2lvbihkZXZjLT5iYXNlLCAyKTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSArIDIsIDYpOworCQlpZiAoc3NjYXBlX2lzX3BucCkKKwkJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmNvZGVjLCAyKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoIXNzY2FwZV9pc19wbnApIHsKKwkKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCQkvKiBIb3N0IGludGVycnVwdCBlbmFibGUgKi8KKwkJc3NjYXBlX3dyaXRlKGRldmMsIDEsIDB4ZjApOwkvKiBBbGwgaW50ZXJydXB0cyBlbmFibGVkICovCisJCS8qIERNQSBBIHN0YXR1cy90cmlnZ2VyIHJlZ2lzdGVyICovCisJCXNzY2FwZV93cml0ZShkZXZjLCAyLCAweDIwKTsJLyogRE1BIGNoYW5uZWwgZGlzYWJsZWQgKi8KKwkJLyogRE1BIEIgc3RhdHVzL3RyaWdnZXIgcmVnaXN0ZXIgKi8KKwkJc3NjYXBlX3dyaXRlKGRldmMsIDMsIDB4MjApOwkvKiBETUEgY2hhbm5lbCBkaXNhYmxlZCAqLworCQkvKiBIb3N0IGludGVycnVwdCBjb25maWcgcmVnICovCisJCXNzY2FwZV93cml0ZShkZXZjLCA0LCAweGYwIHwgKGlycV9iaXRzIDw8IDIpIHwgaXJxX2JpdHMpOworCQkvKiBEb24ndCBkZXN0cm95IENELVJPTSBETUEgY29uZmlnIGJpdHMgKDB4YzApICovCisJCXNzY2FwZV93cml0ZShkZXZjLCA1LCAocmVnc1s1XSAmIDB4M2YpIHwgKHNzY2FwZV9yZWFkKGRldmMsIDUpICYgMHhjMCkpOworCQkvKiBDRC1ST00gY29uZmlnIChXU1MgY29kZWMgYWN0dWFsbHkpICovCisJCXNzY2FwZV93cml0ZShkZXZjLCA2LCByZWdzWzZdKTsKKwkJc3NjYXBlX3dyaXRlKGRldmMsIDcsIHJlZ3NbN10pOworCQlzc2NhcGVfd3JpdGUoZGV2YywgOCwgcmVnc1s4XSk7CisJCS8qIE1hc3RlciBjb250cm9sIHJlZy4gRG9uJ3QgbW9kaWZ5IENSLVJPTSBiaXRzLiBEaXNhYmxlIFNCIGVtdWwgKi8KKwkJc3NjYXBlX3dyaXRlKGRldmMsIDksIChzc2NhcGVfcmVhZChkZXZjLCA5KSAmIDB4ZjApIHwgMHgwOCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCX0KKyNpZmRlZiBTU0NBUEVfREVCVUcyCisJLyoKKwkgKiBUZW1wb3JhcnkgZGVidWdnaW5nIGFpZC4gUHJpbnQgY29udGVudHMgb2YgdGhlIHJlZ2lzdGVycyBhZnRlcgorCSAqIGNoYW5naW5nIHRoZW0uCisJICovCisJeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgMTM7IGkrKykKKwkJCXByaW50aygiSSVkID0gJTAyeCAobmV3IHZhbHVlKVxuIiwgaSwgc3NjYXBlX3JlYWQoZGV2YywgaSkpOworCX0KKyNlbmRpZgorCisJaWYgKHByb2JlX21wdTQwMShod19jb25maWcsIHNzY2FwZV9wb3J0cykpCisJCWh3X2NvbmZpZy0+YWx3YXlzX2RldGVjdCA9IDE7CisJaHdfY29uZmlnLT5uYW1lID0gIlNvdW5kU2NhcGUiOworCisJaHdfY29uZmlnLT5pcnEgKj0gLTE7CS8qIE5lZ2F0aXZlIHZhbHVlIHNpZ25hbHMgSVJRIHNoYXJpbmcgKi8KKwlhdHRhY2hfbXB1NDAxKGh3X2NvbmZpZywgVEhJU19NT0RVTEUpOworCWh3X2NvbmZpZy0+aXJxICo9IC0xOwkvKiBSZXN0b3JlIGl0ICovCisKKwlpZiAoaHdfY29uZmlnLT5zbG90c1sxXSAhPSAtMSkJLyogVGhlIE1QVSBkcml2ZXIgaW5zdGFsbGVkIGl0c2VsZiAqLworCXsKKwkJc3NjYXBlX21pZGlkZXYgPSBod19jb25maWctPnNsb3RzWzFdOworCQltaWRpX2RldnNbaHdfY29uZmlnLT5zbG90c1sxXV0tPmNvcHJvYyA9ICZzc2NhcGVfY29wcm9jX29wZXJhdGlvbnM7CisJfQorCXNzY2FwZV93cml0ZShkZXZjLCBHQV9JTlRFTkFfUkVHLCAweDgwKTsJLyogTWFzdGVyIElSUSBlbmFibGUgKi8KKwlkZXZjLT5vayA9IDE7CisJZGV2Yy0+ZmFpbGVkID0gMDsKK30KKworc3RhdGljIGludCBkZXRlY3RfZ2Eoc3NjYXBlX2luZm8gKiBkZXZjKQoreworCXVuc2lnbmVkIGNoYXIgc2F2ZTsKKworCUREQihwcmludGsoIkVudGVyZWQgU291bmRzY2FwZSBkZXRlY3RfZ2EoJXgpXG4iLCBkZXZjLT5iYXNlKSk7CisKKwkvKgorCSAqIEZpcnN0IGNoZWNrIHRoYXQgdGhlIGFkZHJlc3MgcmVnaXN0ZXIgb2YgIk9ESUUiIGlzCisJICogdGhlcmUgYW5kIHRoYXQgaXQgaGFzIGV4YWN0bHkgNCB3cml0YWJsZSBiaXRzLgorCSAqIEZpcnN0IDQgYml0cworCSAqLworCQorCWlmICgoc2F2ZSA9IGluYihQT1JUKE9ESUVfQUREUikpKSAmIDB4ZjApCisJeworCQlEREIocHJpbnRrKCJzb3VuZHNjYXBlOiBEZXRlY3QgZXJyb3IgQVxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0YigoMHgwMCksIFBPUlQoT0RJRV9BRERSKSk7CisJaWYgKGluYihQT1JUKE9ESUVfQUREUikpICE9IDB4MDApCisJeworCQlEREIocHJpbnRrKCJzb3VuZHNjYXBlOiBEZXRlY3QgZXJyb3IgQlxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0YigoMHhmZiksIFBPUlQoT0RJRV9BRERSKSk7CisJaWYgKGluYihQT1JUKE9ESUVfQUREUikpICE9IDB4MGYpCisJeworCQlEREIocHJpbnRrKCJzb3VuZHNjYXBlOiBEZXRlY3QgZXJyb3IgQ1xuIikpOworCQlyZXR1cm4gMDsKKwl9CisJb3V0Yigoc2F2ZSksIFBPUlQoT0RJRV9BRERSKSk7CisKKwkvKgorCSAqIE5vdyB2ZXJpZnkgdGhhdCBzb21lIGluZGlyZWN0IHJlZ2lzdGVycyByZXR1cm4gemVybyBvbiBzb21lIGJpdHMuCisJICogVGhpcyBtYXkgYnJlYWsgdGhlIGRyaXZlciB3aXRoIHNvbWUgZnV0dXJlIHJldmlzaW9ucyBvZiAiT0RJRSIgYnV0Li4uCisJICovCisKKwlpZiAoc3NjYXBlX3JlYWQoZGV2YywgMCkgJiAweDBjKQorCXsKKwkJRERCKHByaW50aygic291bmRzY2FwZTogRGV0ZWN0IGVycm9yIEQgKCV4KVxuIiwgc3NjYXBlX3JlYWQoZGV2YywgMCkpKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzc2NhcGVfcmVhZChkZXZjLCAxKSAmIDB4MGYpCisJeworCQlEREIocHJpbnRrKCJzb3VuZHNjYXBlOiBEZXRlY3QgZXJyb3IgRVxuIikpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHNzY2FwZV9yZWFkKGRldmMsIDUpICYgMHgwZikKKwl7CisJCUREQihwcmludGsoInNvdW5kc2NhcGU6IERldGVjdCBlcnJvciBGXG4iKSk7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljCWludCBzc2NhcGVfcmVhZF9ob3N0X2N0cmwoc3NjYXBlX2luZm8qIGRldmMpCit7CisJcmV0dXJuIGhvc3RfcmVhZChkZXZjKTsKK30KKworc3RhdGljCXZvaWQgc3NjYXBlX3dyaXRlX2hvc3RfY3RybDIoc3NjYXBlX2luZm8gKmRldmMsIGludCBhLCBpbnQgYikKK3sKKwlob3N0X2NvbW1hbmQyKGRldmMsIGEsIGIpOworfQorCitzdGF0aWMgaW50IHNzY2FwZV9hbGxvY19kbWEoc3NjYXBlX2luZm8gKmRldmMpCit7CisJY2hhciAqc3RhcnRfYWRkciwgKmVuZF9hZGRyOworCWludCBkbWFfcGFnZXNpemU7CisJaW50IHN6LCBzaXplOworCXN0cnVjdCBwYWdlICpwYWdlOworCisJaWYgKGRldmMtPnJhd19idWYgIT0gTlVMTCkgcmV0dXJuIDA7CS8qIEFscmVhZHkgZG9uZSAqLworCWRtYV9wYWdlc2l6ZSA9IChkZXZjLT5kbWEgPCA0KSA/ICg2NCAqIDEwMjQpIDogKDEyOCAqIDEwMjQpOworCWRldmMtPnJhd19idWYgPSBOVUxMOworCWRldmMtPmJ1ZmZzaXplID0gODE5Mio0OworCWlmIChkZXZjLT5idWZmc2l6ZSA+IGRtYV9wYWdlc2l6ZSkgZGV2Yy0+YnVmZnNpemUgPSBkbWFfcGFnZXNpemU7CisJc3RhcnRfYWRkciA9IE5VTEw7CisJLyoKKwkgKiBOb3cgbG9vcCB1bnRpbCB3ZSBnZXQgYSBmcmVlIGJ1ZmZlci4gVHJ5IHRvIGdldCBzbWFsbGVyIGJ1ZmZlciBpZgorCSAqIGl0IGZhaWxzLiBEb24ndCBhY2NlcHQgc21hbGxlciB0aGFuIDhrIGJ1ZmZlciBmb3IgcGVyZm9ybWFuY2UKKwkgKiByZWFzb25zLgorCSAqLworCXdoaWxlIChzdGFydF9hZGRyID09IE5VTEwgJiYgZGV2Yy0+YnVmZnNpemUgPiBQQUdFX1NJWkUpIHsKKwkJZm9yIChzeiA9IDAsIHNpemUgPSBQQUdFX1NJWkU7IHNpemUgPCBkZXZjLT5idWZmc2l6ZTsgc3orKywgc2l6ZSA8PD0gMSk7CisJCWRldmMtPmJ1ZmZzaXplID0gUEFHRV9TSVpFICogKDEgPDwgc3opOworCQlzdGFydF9hZGRyID0gKGNoYXIgKikgX19nZXRfZnJlZV9wYWdlcyhHRlBfQVRPTUlDfEdGUF9ETUEsIHN6KTsKKwkJaWYgKHN0YXJ0X2FkZHIgPT0gTlVMTCkgZGV2Yy0+YnVmZnNpemUgLz0gMjsKKwl9CisKKwlpZiAoc3RhcnRfYWRkciA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3NjYXBlIHBucCBpbml0IGVycm9yOiBDb3VsZG4ndCBhbGxvY2F0ZSBETUEgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJLyogbWFrZSBzb21lIGNoZWNrcyAqLworCQllbmRfYWRkciA9IHN0YXJ0X2FkZHIgKyBkZXZjLT5idWZmc2l6ZSAtIDE7CQkKKwkJLyogbm93IGNoZWNrIGlmIGl0IGZpdHMgaW50byB0aGUgc2FtZSBkbWEtcGFnZXNpemUgKi8KKworCQlpZiAoKChsb25nKSBzdGFydF9hZGRyICYgfihkbWFfcGFnZXNpemUgLSAxKSkgIT0gKChsb25nKSBlbmRfYWRkciAmIH4oZG1hX3BhZ2VzaXplIC0gMSkpCisJCSAgICB8fCBlbmRfYWRkciA+PSAoY2hhciAqKSAoTUFYX0RNQV9BRERSRVNTKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJzc2NhcGUgcG5wOiBHb3QgaW52YWxpZCBhZGRyZXNzIDB4JWx4IGZvciAlZGIgRE1BLWJ1ZmZlclxuIiwgKGxvbmcpIHN0YXJ0X2FkZHIsIGRldmMtPmJ1ZmZzaXplKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWRldmMtPnJhd19idWYgPSBzdGFydF9hZGRyOworCWRldmMtPnJhd19idWZfcGh5cyA9IHZpcnRfdG9fYnVzKHN0YXJ0X2FkZHIpOworCisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHN0YXJ0X2FkZHIpOyBwYWdlIDw9IHZpcnRfdG9fcGFnZShlbmRfYWRkcik7IHBhZ2UrKykKKwkJU2V0UGFnZVJlc2VydmVkKHBhZ2UpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBzc2NhcGVfZnJlZV9kbWEoc3NjYXBlX2luZm8gKmRldmMpCit7CisJaW50IHN6LCBzaXplOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfYWRkciwgZW5kX2FkZHI7CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwlpZiAoZGV2Yy0+cmF3X2J1ZiA9PSBOVUxMKSByZXR1cm47CisJZm9yIChzeiA9IDAsIHNpemUgPSBQQUdFX1NJWkU7IHNpemUgPCBkZXZjLT5idWZmc2l6ZTsgc3orKywgc2l6ZSA8PD0gMSk7CisJc3RhcnRfYWRkciA9ICh1bnNpZ25lZCBsb25nKSBkZXZjLT5yYXdfYnVmOworCWVuZF9hZGRyID0gc3RhcnRfYWRkciArIGRldmMtPmJ1ZmZzaXplOworCisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHN0YXJ0X2FkZHIpOyBwYWdlIDw9IHZpcnRfdG9fcGFnZShlbmRfYWRkcik7IHBhZ2UrKykKKwkJQ2xlYXJQYWdlUmVzZXJ2ZWQocGFnZSk7CisKKwlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSBkZXZjLT5yYXdfYnVmLCBzeik7CisJZGV2Yy0+cmF3X2J1ZiA9IE5VTEw7Cit9CisKKy8qIEludGVsIHZlcnNpb24gISEhISEhISEhICovCisKK3N0YXRpYyBpbnQgc3NjYXBlX3N0YXJ0X2RtYShpbnQgY2hhbiwgdW5zaWduZWQgbG9uZyBwaHlzYWRkciwgaW50IGNvdW50LCBpbnQgZG1hX21vZGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWZsYWdzID0gY2xhaW1fZG1hX2xvY2soKTsKKwlkaXNhYmxlX2RtYShjaGFuKTsKKwljbGVhcl9kbWFfZmYoY2hhbik7CisJc2V0X2RtYV9tb2RlKGNoYW4sIGRtYV9tb2RlKTsKKwlzZXRfZG1hX2FkZHIoY2hhbiwgcGh5c2FkZHIpOworCXNldF9kbWFfY291bnQoY2hhbiwgY291bnQpOworCWVuYWJsZV9kbWEoY2hhbik7CisJcmVsZWFzZV9kbWFfbG9jayhmbGFncyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNzY2FwZV9wbnBfc3RhcnRfZG1hKHNzY2FwZV9pbmZvKiBkZXZjLCBpbnQgYXJnICkKK3sKKwlpbnQgcmVnOworCWlmIChhcmcgPT0gMCkgcmVnID0gMjsKKwllbHNlIHJlZyA9IDM7CisKKwlzc2NhcGVfd3JpdGUoZGV2YywgcmVnLCBzc2NhcGVfcmVhZCggZGV2YywgcmVnKSB8IDB4MDEpOworCXNzY2FwZV93cml0ZShkZXZjLCByZWcsIHNzY2FwZV9yZWFkKCBkZXZjLCByZWcpICYgMHhGRSk7Cit9CisKK3N0YXRpYyBpbnQgc3NjYXBlX3BucF93YWl0X2RtYSAoc3NjYXBlX2luZm8qIGRldmMsIGludCBhcmcgKQoreworCWludAkJcmVnOworCXVuc2lnbmVkIGxvbmcJaTsKKwl1bnNpZ25lZCBjaGFyCWQ7CisKKwlpZiAoYXJnID09IDApIHJlZyA9IDI7CisJZWxzZSByZWcgPSAzOworCisJc2xlZXAgKCAxICk7CisJaSA9IDA7CisJZG8geworCQlkID0gc3NjYXBlX3JlYWQoZGV2YywgcmVnKSAmIDE7CisJCWlmICggZCA9PSAxKSAgYnJlYWs7CisJCWkrKzsKKwl9IHdoaWxlIChpIDwgNTAwMDAwKTsKKwlkID0gc3NjYXBlX3JlYWQoZGV2YywgcmVnKSAmIDE7IAorCXJldHVybiBkOworfQorCitzdGF0aWMJaW50CXNzY2FwZV9wbnBfYWxsb2NfZG1hKHNzY2FwZV9pbmZvKiBkZXZjKQoreworCS8qIHByaW50ayhLRVJOX0lORk8gInNzY2FwZTogcmVxdWVzdGluZyBkbWFcbiIpOyAqLworCWlmIChyZXF1ZXN0X2RtYShkZXZjIC0+IGRtYSwgInNzY2FwZSIpKSByZXR1cm4gMDsKKwkvKiBwcmludGsoS0VSTl9JTkZPICJzc2NhcGU6IGRtYSBjaGFubmVsIGFsbG9jYXRlZFxuIik7ICovCisJaWYgKCFzc2NhcGVfYWxsb2NfZG1hKGRldmMpKSB7CisJCWZyZWVfZG1hKGRldmMgLT4gZG1hKTsKKwkJcmV0dXJuIDA7CisJfTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljCXZvaWQJc3NjYXBlX3BucF9mcmVlX2RtYShzc2NhcGVfaW5mbyogZGV2YykKK3sKKwlzc2NhcGVfZnJlZV9kbWEoIGRldmMpOworCWZyZWVfZG1hKGRldmMgLT4gZG1hICk7CQorCS8qIHByaW50ayhLRVJOX0lORk8gInNzY2FwZTogZG1hIHJlbGVhc2VkXG4iKTsgKi8KK30KKworc3RhdGljCWludAlzc2NhcGVfcG5wX3VwbG9hZF9maWxlKHNzY2FwZV9pbmZvKiBkZXZjLCBjaGFyKiBmbikKK3sJCisJaW50CSAgICAgCWRvbmUgPSAwOworCWludAkgICAgIAl0aW1lb3V0X3ZhbDsKKwljaGFyKgkgICAgIAlkYXRhLCpkdDsKKwlpbnQJICAgICAJbGVuLGw7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKworCXNzY2FwZV93cml0ZSggZGV2YywgOSwgc3NjYXBlX3JlYWQoZGV2YywgOSApICAmIDB4M0YgKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDIsIChkZXZjIC0+IGRtYSA8PCA0KSB8IDB4ODAgKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDMsIDB4MjAgKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDksIHNzY2FwZV9yZWFkKCBkZXZjLCA5ICkgIHwgMHg4MCApOworCQorCWxlbiA9IG1vZF9maXJtd2FyZV9sb2FkKGZuLCAmZGF0YSk7CisJaWYgKGxlbiA9PSAwKSB7CisJCSAgICBwcmludGsoS0VSTl9FUlIgInNzY2FwZTogZmlsZSBub3QgZm91bmQ6ICVzXG4iLCBmbik7CisJCSAgICByZXR1cm4gMDsKKwl9CisJZHQgPSBkYXRhOworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwl3aGlsZSAoIGxlbiA+IDAgKSB7CisJCWlmIChsZW4gPiBkZXZjIC0+IGJ1ZmZzaXplKSBsID0gZGV2Yy0+YnVmZnNpemU7CisJCWVsc2UgbCA9IGxlbjsKKwkJbGVuIC09IGw7CQkKKwkJbWVtY3B5KGRldmMtPnJhd19idWYsIGR0LCBsKTsgZHQgKz0gbDsKKwkJc3NjYXBlX3N0YXJ0X2RtYShkZXZjLT5kbWEsIGRldmMtPnJhd19idWZfcGh5cywgbCwgMHg0OCk7CisJCXNzY2FwZV9wbnBfc3RhcnRfZG1hICggZGV2YywgMCApOworCQlpZiAoc3NjYXBlX3BucF93YWl0X2RtYSAoIGRldmMsIDAgKSA9PSAwKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCXZmcmVlKGRhdGEpOworCQorCW91dGIoMCwgZGV2YyAtPiBiYXNlICsgMik7CisJb3V0YigwLCBkZXZjIC0+IGJhc2UpOworCisJc3NjYXBlX3dyaXRlICggZGV2YywgOSwgc3NjYXBlX3JlYWQoIGRldmMsIDkgKSB8IDB4NDApOworCisJdGltZW91dF92YWwgPSA1ICogSFo7IAorCXdoaWxlICghZG9uZSAmJiB0aW1lb3V0X3ZhbC0tID4gMCkKKwl7CisJCXVuc2lnbmVkIGNoYXIgeDsKKwkJc2xlZXAoMSk7CisJCXggPSBpbmIoIGRldmMgLT4gYmFzZSArIDMpOworCQlpZiAoeCA9PSAweGZmIHx8IHggPT0gMHhmZSkJCS8qIE9CUCBzdGFydHVwIGFja25vd2xlZGdlICovCisJCXsKKwkJCS8vcHJpbnRrKEtFUk5fRVJSICJTb3VuZHNjYXBlOiBBY2tub3dsZWRnZSA9ICV4XG4iLCB4KTsKKwkJCWRvbmUgPSAxOworCQl9CisJfQorCXRpbWVvdXRfdmFsID0gNSAqIEhaOworCWRvbmUgPSAwOworCXdoaWxlICghZG9uZSAmJiB0aW1lb3V0X3ZhbC0tID4gMCkKKwl7CisJCXVuc2lnbmVkIGNoYXIgeDsKKwkJc2xlZXAoMSk7CisJCXggPSBpbmIoIGRldmMgLT4gYmFzZSArIDMpOworCQlpZiAoeCA9PSAweGZlKQkJLyogT0JQIHN0YXJ0dXAgYWNrbm93bGVkZ2UgKi8KKwkJeworCQkJLy9wcmludGsoS0VSTl9FUlIgIlNvdW5kc2NhcGU6IEFja25vd2xlZGdlID0gJXhcbiIsIHgpOworCQkJZG9uZSA9IDE7CisJCX0KKwl9CisKKwlpZiAoICFkb25lICkgcHJpbnRrKEtFUk5fRVJSICJzb3VuZHNjYXBlOiBPQlAgSW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDIsIGRldmMtPmljX3R5cGUgPT0gSUNfT0RJRSA/IDB4NzAgOiAweDQwKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDMsIChkZXZjIC0+IGRtYSA8PCA0KSArIDB4ODApOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgc3NjYXBlX3BucF9pbml0X2h3KHNzY2FwZV9pbmZvKiBkZXZjKQorewkKKwl1bnNpZ25lZCBjaGFyIG1pZGlfaXJxID0gMCwgc2JfaXJxID0gMDsKKwl1bnNpZ25lZCBpOworCXN0YXRpYwljaGFyIGNvZGVfZmlsZV9uYW1lWzIzXSA9ICIvc25kc2NhcGUvc25kc2NhcGUuY294IjsKKwkKKwlpbnQgc3NjYXBlX3NiX2VuYWJsZQkJPSAwOworCWludCBzc2NhcGVfam95c3RpY19lbmFibGUJPSAweDdmOworCWludCBzc2NhcGVfbWljX2VuYWJsZQkJPSAwOworCWludCBzc2NhcGVfZXh0X21pZGkJCT0gMDsJCQorCisJaWYgKCAhc3NjYXBlX3BucF9hbGxvY19kbWEoZGV2YykgKSB7CisJCXByaW50ayhLRVJOX0VSUiAic3NjYXBlOiBmYWlsZCB0byBhbGxvY2F0ZSBkbWFcbiIpOworCQlyZXR1cm47CisJfQorCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAoIGRldmMgLT4gaXJxICAgPT0gdmFsaWRfaW50ZXJydXB0c1tpXSApIAorCQkJbWlkaV9pcnEgPSBpOworCQlpZiAoIGRldmMgLT4gY29kZWNfaXJxID09IHZhbGlkX2ludGVycnVwdHNbaV0gKSAKKwkJCXNiX2lycSA9IGk7CisJfQorCisJc3NjYXBlX3dyaXRlKCBkZXZjLCA1LCAweDUwKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDcsIDB4MmUpOworCXNzY2FwZV93cml0ZSggZGV2YywgOCwgMHgwMCk7CisKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDIsIGRldmMtPmljX3R5cGUgPT0gSUNfT0RJRSA/IDB4NzAgOiAweDQwKTsKKwlzc2NhcGVfd3JpdGUoIGRldmMsIDMsICggZGV2YyAtPiBkbWEgPDwgNCkgfCAweDgwKTsKKworCWlmICggc3NjYXBlX3NiX2VuYWJsZSApCisJCXNzY2FwZV93cml0ZSAoZGV2YywgNCwgMHhGMCB8IChzYl9pcnEgPDwgMikgfCBtaWRpX2lycSk7CisJZWxzZQkKKwkJc3NjYXBlX3dyaXRlIChkZXZjLCA0LCAweEYwIHwgKG1pZGlfaXJxPDwyKSB8IG1pZGlfaXJxKTsKKworCWkgPSAweDEwOyAvL3NzY2FwZV9yZWFkKGRldmMsIDkpICYgKGRldmMtPmljX3R5cGUgPT0gSUNfT0RJRSA/IDB4ZjAgOiAweGMwKTsKKwlpZiAoIHNzY2FwZV9zYl9lbmFibGUgKQorCQlpIHw9IGRldmMtPmljX3R5cGUgPT0gSUNfT0RJRSA/IDB4MDUgOiAweDA3OwkgICAgCisJaWYgKHNzY2FwZV9qb3lzdGljX2VuYWJsZSkgaSB8PSA4OworCQorCXNzY2FwZV93cml0ZSAoZGV2YywgOSwgaSk7CisJc3NjYXBlX3dyaXRlIChkZXZjLCA2LCAweDgwKTsKKwlzc2NhcGVfd3JpdGUgKGRldmMsIDEsIDB4ODApOworCisJaWYgKGRldmMgLT4gY29kZWNfdHlwZSA9PSAyKSB7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMoIGRldmMsIDB4MEMsIDB4NTApOworCQlzc2NhcGVfcG5wX3dyaXRlX2NvZGVjKCBkZXZjLCAweDEwLCBzc2NhcGVfcG5wX3JlYWRfY29kZWMoIGRldmMsIDB4MTApICYgMHgzRik7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMoIGRldmMsIDB4MTEsIHNzY2FwZV9wbnBfcmVhZF9jb2RlYyggZGV2YywgMHgxMSkgfCAweEMwKTsKKwkJc3NjYXBlX3BucF93cml0ZV9jb2RlYyggZGV2YywgMjksIDB4MjApOworCX0KKworCWlmIChzc2NhcGVfcG5wX3VwbG9hZF9maWxlKGRldmMsICIvc25kc2NhcGUvc2NvcGUuY29kIikgPT0gMCApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJzc2NhcGU6IGZhaWxkIHRvIHVwbG9hZCBmaWxlIC9zbmRzY2FwZS9zY29wZS5jb2RcbiIpOworCQlzc2NhcGVfcG5wX2ZyZWVfZG1hKGRldmMpOworCQlyZXR1cm47CisJfQorCisJaSA9IHNzY2FwZV9yZWFkX2hvc3RfY3RybCggZGV2YyApOworCQorCWlmICggKGkgJiAweDBGKSA+ICA3ICkgeworCQlwcmludGsoS0VSTl9FUlIgInNzY2FwZTogc2NvcGUuY29kIGZhaWxkXG4iKTsKKwkJc3NjYXBlX3BucF9mcmVlX2RtYShkZXZjKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoIGkgJiAweDEwICkgc3NjYXBlX3dyaXRlKCBkZXZjLCA3LCAweDJGKTsKKwljb2RlX2ZpbGVfbmFtZVsyMV0gPSAoY2hhcikgKCBpICYgMHgwRikgKyAweDMwOworCWlmIChzc2NhcGVfcG5wX3VwbG9hZF9maWxlKCBkZXZjLCBjb2RlX2ZpbGVfbmFtZSkgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInNzY2FwZTogZmFpbGQgdG8gdXBsb2FkIGZpbGUgJXNcbiIsIGNvZGVfZmlsZV9uYW1lKTsKKwkJc3NjYXBlX3BucF9mcmVlX2RtYShkZXZjKTsKKwkJcmV0dXJuOworCX0KKwkKKwlpZiAoZGV2Yy0+aWNfdHlwZSAhPSBJQ19PRElFKSB7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMoIGRldmMsIDEwLCAoc3NjYXBlX3BucF9yZWFkX2NvZGVjKGRldmMsIDEwKSAmIDB4N2YpIHwKKwkJICggc3NjYXBlX21pY19lbmFibGUgPT0gMCA/IDB4MDAgOiAweDgwKSApOworCX0KKwlzc2NhcGVfd3JpdGVfaG9zdF9jdHJsMiggZGV2YywgMHg4NCwgMHg2NCApOyAgLyogTUlESSB2b2x1bWUgKi8KKwlzc2NhcGVfd3JpdGVfaG9zdF9jdHJsMiggZGV2YywgMHg4NiwgMHg2NCApOyAgLyogTUlESSB2b2x1bWU/PyAqLworCXNzY2FwZV93cml0ZV9ob3N0X2N0cmwyKCBkZXZjLCAweDhBLCBzc2NhcGVfZXh0X21pZGkpOworCisJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDYsIDB4M2YgKTsgLy9XQVZfVk9MCisJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDcsIDB4M2YgKTsgLy9XQVZfVk9MCisJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDIsIDB4MUYgKTsgLy9XRF9DRFhWT0xMCisJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDMsIDB4MUYgKTsgLy9XRF9DRFhWT0xSCisKKwlpZiAoZGV2YyAtPiBjb2RlY190eXBlID09IDEpIHsKKwkJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDQsIDB4MUYgKTsKKwkJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDUsIDB4MUYgKTsKKwkJc3NjYXBlX3dyaXRlX2hvc3RfY3RybDIoIGRldmMsIDB4ODgsIHNzY2FwZV9taWNfZW5hYmxlKTsKKwl9IGVsc2UgeworCQlpbnQgdDsKKwkJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDB4MTAsIDB4MUYgPDwgMSk7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMgKCBkZXZjLCAweDExLCAweEMwIHwgKDB4MUYgPDwgMSkpOworCisJCXQgPSBzc2NhcGVfcG5wX3JlYWRfY29kZWMoIGRldmMsIDB4MDApICYgMHhERjsKKwkJaWYgKCAoc3NjYXBlX21pY19lbmFibGUgPT0gMCkpIHQgfD0gMDsKKwkJZWxzZSB0IHw9IDB4MjA7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMgKCBkZXZjLCAweDAwLCB0KTsKKwkJdCA9IHNzY2FwZV9wbnBfcmVhZF9jb2RlYyggZGV2YywgMHgwMSkgJiAweERGOworCQlpZiAoIChzc2NhcGVfbWljX2VuYWJsZSA9PSAwKSApIHQgfD0gMDsKKwkJZWxzZSB0IHw9IDB4MjA7CisJCXNzY2FwZV9wbnBfd3JpdGVfY29kZWMgKCBkZXZjLCAweDAxLCB0KTsKKwkJc3NjYXBlX3BucF93cml0ZV9jb2RlYyAoIGRldmMsIDB4NDAgfCAyOSAsIDB4MjApOworCQlvdXRiKDAsIGRldmMgLT4gY29kZWMpOworCX0KKwlpZiAoZGV2YyAtPiBpY190eXBlID09IElDX09QVVMgKSB7CisJCWludCBpID0gc3NjYXBlX3JlYWQoIGRldmMsIDkgKTsKKwkJc3NjYXBlX3dyaXRlKCBkZXZjLCA5LCBpIHwgMyApOworCQlzc2NhcGVfd3JpdGUoIGRldmMsIDMsIDB4NDApOworCisJCWlmIChyZXF1ZXN0X3JlZ2lvbigweDIyOCwgMSwgInNzY2FwZSBzZXR1cCBqdW5rIikpIHsKKwkJCW91dGIoMCwgMHgyMjgpOworCQkJcmVsZWFzZV9yZWdpb24oMHgyMjgsMSk7CisJCX0KKwkJc3NjYXBlX3dyaXRlKCBkZXZjLCAzLCAoZGV2YyAtPiBkbWEgPDwgNCkgfCAweDgwKTsKKwkJc3NjYXBlX3dyaXRlKCBkZXZjLCA5LCBpICk7CisJfQorCQorCWhvc3RfY2xvc2UgKCBkZXZjICk7CisJc3NjYXBlX3BucF9mcmVlX2RtYShkZXZjKTsKK30KKworc3RhdGljIGludCBfX2luaXQgZGV0ZWN0X3NzY2FwZV9wbnAoc3NjYXBlX2luZm8qIGRldmMpCit7CisJbG9uZwkgaSwgaXJxX2JpdHMgPSAweGZmOworCXVuc2lnbmVkIGludCBkOworCisJRERCKHByaW50aygiRW50ZXJlZCBkZXRlY3Rfc3NjYXBlX3BucCgleClcbiIsIGRldmMtPmJhc2UpKTsKKworCWlmICghcmVxdWVzdF9yZWdpb24oZGV2Yy0+Y29kZWMsIDIsICJzc2NhcGUgY29kZWMiKSkgeworCQlwcmludGsoS0VSTl9FUlIgImRldGVjdF9zc2NhcGVfcG5wOiBwb3J0ICV4IGlzIG5vdCBmcmVlXG4iLCBkZXZjLT5jb2RlYyk7CQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKGluYihkZXZjLT5iYXNlICsgMikgJiAweDc4KSAhPSAwKQorCQlnb3RvIGZhaWw7CisKKwlkID0gaW5iICggZGV2YyAtPiBiYXNlICsgNCkgJiAweEYwOworCWlmIChkICYgMHg4MCkKKwkJZ290byBmYWlsOworCQorCWlmIChkID09IDApIHsKKwkJZGV2Yy0+Y29kZWNfdHlwZSA9IDE7CisJCWRldmMtPmljX3R5cGUgPSBJQ19PRElFOworCX0gZWxzZSBpZiAoIChkICYgMHg2MCkgIT0gMCkgeworCQlkZXZjLT5jb2RlY190eXBlID0gMjsKKwkJZGV2Yy0+aWNfdHlwZSA9IElDX09QVVM7CisJfSBlbHNlIGlmICggKGQgJiAweDQwKSAhPSAwKSB7CS8qIFdURj8gKi8KKwkJZGV2Yy0+Y29kZWNfdHlwZSA9IDI7CisJCWRldmMtPmljX3R5cGUgPSBJQ19PRElFOworCX0gZWxzZQorCQlnb3RvIGZhaWw7CisJCisJc3NjYXBlX2lzX3BucCA9IDE7CisJCQorCW91dGIoMHhGQSwgZGV2YyAtPiBiYXNlKzQpOworCWlmICAoKGluYiggZGV2YyAtPiBiYXNlKzQpICYgMHg5RikgIT0gMHgwQSkKKwkJZ290byBmYWlsOworCW91dGIoMHhGRSwgZGV2YyAtPiBiYXNlKzQpOworCWlmICAoIChpbmIoZGV2YyAtPiBiYXNlKzQpICYgMHg5RikgIT0gMHgwRSkKKwkJZ290byBmYWlsOworCWlmICAoIChpbmIoZGV2YyAtPiBiYXNlKzUpICYgMHg5RikgIT0gMHgwRSkKKwkJZ290byBmYWlsOworCisJaWYgKGRldmMtPmNvZGVjX3R5cGUgPT0gMikgeworCQlpZiAoZGV2Yy0+Y29kZWMgIT0gZGV2Yy0+YmFzZSArIDgpIHsKKwkJCXByaW50aygic291bmRzY2FwZSB3YXJuaW5nOiBpbmNvcnJlY3QgY29kZWMgcG9ydCBzcGVjaWZpZWRcbiIpOworCQkJZ290byBmYWlsOworCQl9CisJCWQgPSAweDEwIHwgKHNzY2FwZV9yZWFkKGRldmMsIDkpICAmIDB4Q0YpOworCQlzc2NhcGVfd3JpdGUoZGV2YywgOSwgZCk7CisJCXNzY2FwZV93cml0ZShkZXZjLCA2LCAweDgwKTsKKwl9IGVsc2UgeworCQkvL3RvZG86IGNoZWNrIGNvZGVjIGlzIG5vdCBiYXNlICsgOAorCX0KKworCWQgID0gKHNzY2FwZV9yZWFkKGRldmMsIDkpICYgMHgzRikgfCAweEMwOworCXNzY2FwZV93cml0ZShkZXZjLCA5LCBkKTsKKworCWZvciAoaSA9IDA7IGkgPCA1NTAwMDA7IGkrKykKKwkJaWYgKCAhKGluYihkZXZjIC0+IGNvZGVjKSAmIDB4ODApICkgYnJlYWs7CisKKwlkID0gaW5iKGRldmMgLT4gY29kZWMpOworCWlmIChkICYgMHg4MCkKKwkJZ290byBmYWlsOworCWlmICggaW5iKGRldmMgLT4gY29kZWMgKyAyKSA9PSAweEZGKQorCQlnb3RvIGZhaWw7CisKKwlzc2NhcGVfd3JpdGUoZGV2YywgOSwgc3NjYXBlX3JlYWQoZGV2YywgOSkgICYgMHgzRiApOworCisJZCAgPSBpbmIoZGV2YyAtPiBjb2RlYykgJiAweDgwOworCWlmICggZCA9PSAwKSB7CisJCXByaW50ayhLRVJOX0lORk8gInNvdW5kc2NhcGU6IGhhcmR3YXJlIGRldGVjdGVkXG4iKTsKKwkJdmFsaWRfaW50ZXJydXB0cyA9IHZhbGlkX2ludGVycnVwdHNfbmV3OworCX0gZWxzZQl7CisJCXByaW50ayhLRVJOX0lORk8gInNvdW5kc2NhcGU6IGJvYXJkIGxvb2tzIGxpa2UgbWVkaWEgZnhcbiIpOworCQl2YWxpZF9pbnRlcnJ1cHRzID0gdmFsaWRfaW50ZXJydXB0c19vbGQ7CisJCW9sZF9oYXJkd2FyZSA9IDE7CisJfQorCisJc3NjYXBlX3dyaXRlKCBkZXZjLCA5LCAweEMwIHwgKHNzY2FwZV9yZWFkKGRldmMsIDkpICAmIDB4M0YpICk7CisKKwlmb3IgKGkgPSAwOyBpIDwgNTUwMDAwOyBpKyspCisJCWlmICggIShpbmIoZGV2YyAtPiBjb2RlYykgJiAweDgwKSkgCisJCQlicmVhazsKKwkJCisJc3NjYXBlX3BucF9pbml0X2h3KGRldmMpOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCWlmIChkZXZjLT5jb2RlY19pcnEgPT0gdmFsaWRfaW50ZXJydXB0c1tpXSkgeworCQkJaXJxX2JpdHMgPSBpOworCQkJYnJlYWs7CisJCX0KKwl9CQorCXNzY2FwZV93cml0ZShkZXZjLCBHQV9JTlRFTkFfUkVHLCAweDAwKTsKKwlzc2NhcGVfd3JpdGUoZGV2YywgR0FfRE1BQ0ZHX1JFRywgMHg1MCk7CisJc3NjYXBlX3dyaXRlKGRldmMsIEdBX0RNQUFfUkVHLCAweDcwKTsKKwlzc2NhcGVfd3JpdGUoZGV2YywgR0FfRE1BQl9SRUcsIDB4MjApOworCXNzY2FwZV93cml0ZShkZXZjLCBHQV9JTlRDRkdfUkVHLCAweGYwKTsKKwlzc2NhcGVfd3JpdGUoZGV2YywgR0FfQ0RDRkdfUkVHLCAweDg5IHwgKGRldmMtPmRtYSA8PCA0KSB8IChpcnFfYml0cyA8PCAxKSk7CisKKwlzc2NhcGVfcG5wX3dyaXRlX2NvZGVjKCBkZXZjLCAwLCBzc2NhcGVfcG5wX3JlYWRfY29kZWMoIGRldmMsIDApIHwgMHgyMCk7CisJc3NjYXBlX3BucF93cml0ZV9jb2RlYyggZGV2YywgMCwgc3NjYXBlX3BucF9yZWFkX2NvZGVjKCBkZXZjLCAxKSB8IDB4MjApOworCisJcmV0dXJuIDE7CitmYWlsOgorCXJlbGVhc2VfcmVnaW9uKGRldmMtPmNvZGVjLCAyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfc3NjYXBlKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlkZXZjLT5iYXNlID0gaHdfY29uZmlnLT5pb19iYXNlOworCWRldmMtPmlycSA9IGh3X2NvbmZpZy0+aXJxOworCWRldmMtPmRtYSA9IGh3X2NvbmZpZy0+ZG1hOworCWRldmMtPm9zcCA9IGh3X2NvbmZpZy0+b3NwOworCisjaWZkZWYgU1NDQVBFX0RFQlVHMQorCS8qCisJICogVGVtcG9yYXJ5IGRlYnVnZ2luZyBhaWQuIFByaW50IGNvbnRlbnRzIG9mIHRoZSByZWdpc3RlcnMgYmVmb3JlCisJICogY2hhbmdpbmcgdGhlbS4KKwkgKi8KKwl7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorCQkJcHJpbnRrKCJJJWQgPSAlMDJ4IChvbGQgdmFsdWUpXG4iLCBpLCBzc2NhcGVfcmVhZChkZXZjLCBpKSk7CisJfQorI2VuZGlmCisJZGV2Yy0+ZmFpbGVkID0gMTsKKworCXNzY2FwZV9wb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGRldmMtPmJhc2UsIDIsICJtcHU0MDEiKTsKKwlpZiAoIXNzY2FwZV9wb3J0cykKKwkJcmV0dXJuIDA7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGRldmMtPmJhc2UgKyAyLCA2LCAiU291bmRTY2FwZSIpKSB7CisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UsIDIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWRldGVjdF9nYShkZXZjKSkgeworCQlpZiAoZGV0ZWN0X3NzY2FwZV9wbnAoZGV2YykpCisJCQlyZXR1cm4gMTsKKwkJcmVsZWFzZV9yZWdpb24oZGV2Yy0+YmFzZSwgMik7CisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmJhc2UgKyAyLCA2KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKG9sZF9oYXJkd2FyZSkJLyogQ2hlY2sgdGhhdCBpdCdzIHJlYWxseSBhbiBvbGQgU3BlYS9SZXZlYWwgY2FyZC4gKi8KKwl7CisJCXVuc2lnbmVkIGNoYXIgICB0bXA7CisJCWludCAgICAgICAgICAgICBjYzsKKworCQlpZiAoISgodG1wID0gc3NjYXBlX3JlYWQoZGV2YywgR0FfSE1DVExfUkVHKSkgJiAweGMwKSkKKwkJeworCQkJc3NjYXBlX3dyaXRlKGRldmMsIEdBX0hNQ1RMX1JFRywgdG1wIHwgMHg4MCk7CisJCQlmb3IgKGNjID0gMDsgY2MgPCAyMDAwMDA7ICsrY2MpCisJCQkJaW5iKGRldmMtPmJhc2UgKyBPRElFX0FERFIpOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NzX21zX3NvdW5kKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgaSwgaXJxX2JpdHMgPSAweGZmOworCWludCBhZF9mbGFncyA9IDA7CisJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwkKKwlpZiAoZGV2Yy0+ZmFpbGVkKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJzb3VuZHNjYXBlOiBDYXJkIG5vdCBkZXRlY3RlZFxuIik7CisJCXJldHVybiAwOworCX0KKwlpZiAoZGV2Yy0+b2sgPT0gMCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAic291bmRzY2FwZTogSW52YWxpZCBpbml0aWFsaXphdGlvbiBvcmRlci5cbiIpOworCQlyZXR1cm4gMDsKKwl9CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKwl7CisJCWlmIChod19jb25maWctPmlycSA9PSB2YWxpZF9pbnRlcnJ1cHRzW2ldKQorCQl7CisJCQlpcnFfYml0cyA9IGk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoaXJxX2JpdHMgPT0gMHhmZikgeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kc2NhcGU6IEludmFsaWQgTVNTIElSUSVkXG4iLCBod19jb25maWctPmlycSk7CisJCXJldHVybiAwOworCX0KKwkKKwlpZiAob2xkX2hhcmR3YXJlKQorCQlhZF9mbGFncyA9IDB4MTIzNDU2Nzc7CS8qIFRlbGwgdGhhdCB3ZSBtYXkgaGF2ZSBhIENTNDI0OCBjaGlwIChTcGVhLVY3IE1lZGlhIEZYKSAqLworCWVsc2UgaWYgKHNzY2FwZV9pc19wbnApCisJCWFkX2ZsYWdzID0gMHg4NzY1NDMyMTsgIC8qIFRlbGwgdGhhdCB3ZSBoYXZlIGEgc291bmRzY2FwZSBwbnAgd2l0aCAxODQ1IGNoaXAgKi8KKworCXBvcnRzID0gcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0LCAiYWQxODQ4Iik7CisJaWYgKCFwb3J0cykgeworCQlwcmludGsoS0VSTl9FUlIgInNvdW5kc2NhcGU6IHBvcnRzIGJ1c3lcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFkMTg0OF9kZXRlY3QocG9ydHMsICZhZF9mbGFncywgaHdfY29uZmlnLT5vc3ApKSB7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCk7CisJCXJldHVybiAwOworCX0KKworIAlpZiAoIXNzY2FwZV9pc19wbnApICAvKnBucCBpcyBhbHJlYWR5IHNldHVwKi8KKyAJeworIAkJLyoKKyAgICAgCQkgKiBTZXR1cCB0aGUgRE1BIHBvbGFyaXR5LgorIAkgICAgCSAqLworIAkJc3NjYXBlX3dyaXRlKGRldmMsIEdBX0RNQUNGR19SRUcsIDB4NTApOworIAkKKyAJCS8qCisgCQkgKiBUYWtlIHRoZSBnYXRlLWFycmF5IG9mZiBvZiB0aGUgRE1BIGNoYW5uZWwuCisgCQkgKi8KKyAJCXNzY2FwZV93cml0ZShkZXZjLCBHQV9ETUFCX1JFRywgMHgyMCk7CisgCQorIAkJLyoKKyAJCSAqIEluaXQgdGhlIEFEMTg0OCAoQ0QtUk9NKSBjb25maWcgcmVnLgorIAkJICovCisgCQlzc2NhcGVfd3JpdGUoZGV2YywgR0FfQ0RDRkdfUkVHLCAweDg5IHwgKGh3X2NvbmZpZy0+ZG1hIDw8IDQpIHwgKGlycV9iaXRzIDw8IDEpKTsKKyAJfQorIAkKKyAJaWYgKGh3X2NvbmZpZy0+aXJxID09IGRldmMtPmlycSkKKyAJCXByaW50ayhLRVJOX1dBUk5JTkcgInNvdW5kc2NhcGU6IFdhcm5pbmchIFRoZSBXU1MgbW9kZSBjYW4ndCBzaGFyZSBJUlEgd2l0aCBNSURJXG4iKTsKKyAJCQkJCisJaHdfY29uZmlnLT5zbG90c1swXSA9IGFkMTg0OF9pbml0KAorCQkJc3NjYXBlX2lzX3BucCA/ICJTb3VuZFNjYXBlIiA6ICJTb3VuZFNjYXBlIFBOUCIsCisJCQlwb3J0cywKKwkJCWh3X2NvbmZpZy0+aXJxLAorCQkJaHdfY29uZmlnLT5kbWEsCisJCQlod19jb25maWctPmRtYSwKKwkJCTAsCisJCQlkZXZjLT5vc3AsCisJCQlUSElTX01PRFVMRSk7CisKKyAJCQkJCSAgCisJaWYgKGh3X2NvbmZpZy0+c2xvdHNbMF0gIT0gLTEpCS8qIFRoZSBBRDE4NDggZHJpdmVyIGluc3RhbGxlZCBpdHNlbGYgKi8KKwl7CisJCWF1ZGlvX2RldnNbaHdfY29uZmlnLT5zbG90c1swXV0tPmNvcHJvYyA9ICZzc2NhcGVfY29wcm9jX29wZXJhdGlvbnM7CisJCWRldmMtPmNvZGVjX2F1ZGlvZGV2ID0gaHdfY29uZmlnLT5zbG90c1swXTsKKwkJZGV2Yy0+bXlfYXVkaW9kZXYgPSBod19jb25maWctPnNsb3RzWzBdOworCisJCS8qIFNldCBwcm9wZXIgcm91dGluZ3MgaGVyZSAod2hhdCBhcmUgdGhleSkgKi8KKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTEsIFNPVU5EX01JWEVSX0xJTkUpOworCX0KKwkJCisjaWZkZWYgU1NDQVBFX0RFQlVHNQorCS8qCisJICogVGVtcG9yYXJ5IGRlYnVnZ2luZyBhaWQuIFByaW50IGNvbnRlbnRzIG9mIHRoZSByZWdpc3RlcnMKKwkgKiBhZnRlciB0aGUgQUQxODQ4IGRldmljZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KKwkgKi8KKwl7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKQorCQkJcHJpbnRrKCJJJWQgPSAlMDJ4XG4iLCBpLCBzc2NhcGVfcmVhZChkZXZjLCBpKSk7CisJfQorI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfc3NjYXBlKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlyZWxlYXNlX3JlZ2lvbihkZXZjLT5iYXNlICsgMiwgNik7CisJdW5sb2FkX21wdTQwMShod19jb25maWcpOworCWlmIChzc2NhcGVfaXNfcG5wKQorCQlyZWxlYXNlX3JlZ2lvbihkZXZjLT5jb2RlYywgMik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfc3NfbXNfc291bmQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWFkMTg0OF91bmxvYWQoaHdfY29uZmlnLT5pb19iYXNlLAorCQkgICAgICBod19jb25maWctPmlycSwKKwkJICAgICAgZGV2Yy0+ZG1hLAorCQkgICAgICBkZXZjLT5kbWEsCisJCSAgICAgIDApOworCXNvdW5kX3VubG9hZF9hdWRpb2Rldihod19jb25maWctPnNsb3RzWzBdKTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21wdTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIHNwZWEgPSAtMTsKK3N0YXRpYyBpbnQgbXNzID0gMDsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpbyA9IC0xOworc3RhdGljIGludCBfX2luaXRkYXRhIG1wdV9pcnEgPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBtcHVfaW8gPSAtMTsKKworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3BlYSwgaW50LCAwKTsJCS8qIHNwZWE9MC8xIHNldCB0aGUgb2xkX2hhcmR3YXJlICovCittb2R1bGVfcGFyYW0obXB1X2lycSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShtcHVfaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXNzLCBpbnQsIDApOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3NzY2FwZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlNvdW5kc2NhcGUgZHJpdmVyIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTZcbiIpOworCQorCWNmZy5pcnEgPSBpcnE7CisJY2ZnLmRtYSA9IGRtYTsKKwljZmcuaW9fYmFzZSA9IGlvOworCisJY2ZnX21wdS5pcnEgPSBtcHVfaXJxOworCWNmZ19tcHUuaW9fYmFzZSA9IG1wdV9pbzsKKwkvKiBXRUggLSBUcnkgdG8gZ2V0IHJpZ2h0IGRtYSBjaGFubmVsICovCisgICAgICAgIGNmZ19tcHUuZG1hID0gZG1hOworCQorCWRldmMtPmNvZGVjID0gY2ZnLmlvX2Jhc2U7CisJZGV2Yy0+Y29kZWNfaXJxID0gY2ZnLmlycTsKKwlkZXZjLT5jb2RlY190eXBlID0gMDsKKwlkZXZjLT5pY190eXBlID0gMDsKKwlkZXZjLT5yYXdfYnVmID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+bG9jayk7CisKKwlpZiAoY2ZnLmRtYSA9PSAtMSB8fCBjZmcuaXJxID09IC0xIHx8IGNmZy5pb19iYXNlID09IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRE1BLCBJUlEsIGFuZCBJTyBwb3J0IG11c3QgYmUgc3BlY2lmaWVkLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwlpZiAoY2ZnX21wdS5pcnEgPT0gLTEgJiYgY2ZnX21wdS5pb19iYXNlICE9IC0xKSB7CisJCXByaW50ayhLRVJOX0VSUiAiTVBVX0lSUSBtdXN0IGJlIHNwZWNpZmllZCBpZiBNUFVfSU8gaXMgc2V0LlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwkKKwlpZihzcGVhICE9IC0xKSB7CisJCW9sZF9oYXJkd2FyZSA9IHNwZWE7CisJCXByaW50ayhLRVJOX0lORk8gIkZvcmNpbmcgJXMgaGFyZHdhcmUgc3VwcG9ydC5cbiIsCisJCQlzcGVhPyJuZXciOiJvbGQiKTsKKwl9CQorCWlmIChwcm9iZV9zc2NhcGUoJmNmZ19tcHUpID09IDApCisJCXJldHVybiAtRU5PREVWOworCisJYXR0YWNoX3NzY2FwZSgmY2ZnX21wdSk7CisJCisJbXNzID0gaW5pdF9zc19tc19zb3VuZCgmY2ZnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF9zc2NhcGUodm9pZCkKK3sKKwlpZiAobXNzKQorCQl1bmxvYWRfc3NfbXNfc291bmQoJmNmZyk7CisJdW5sb2FkX3NzY2FwZSgmY2ZnX21wdSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfc3NjYXBlKTsKK21vZHVsZV9leGl0KGNsZWFudXBfc3NjYXBlKTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3NzY2FwZShjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSwgZG1hLCBtcHVfaW8sIG1wdV9pcnEgKi8KKwlpbnQgaW50c1s2XTsKKwkKKwlzdHIgPSBnZXRfb3B0aW9ucyhzdHIsIEFSUkFZX1NJWkUoaW50cyksIGludHMpOworCQorCWlvCT0gaW50c1sxXTsKKwlpcnEJPSBpbnRzWzJdOworCWRtYQk9IGludHNbM107CisJbXB1X2lvCT0gaW50c1s0XTsKKwltcHVfaXJxCT0gaW50c1s1XTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJzc2NhcGU9Iiwgc2V0dXBfc3NjYXBlKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3N3YXJtX2NzNDI5N2EuYyBiL3NvdW5kL29zcy9zd2FybV9jczQyOTdhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0ZDM3NwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy9zd2FybV9jczQyOTdhLmMKQEAgLTAsMCArMSwyNzQyIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKgorKiAgICAgICJzd2FybV9jczQyOTdhLmMiIC0tICBDaXJydXMgTG9naWMtQ3J5c3RhbCBDUzQyOTdhIGxpbnV4IGF1ZGlvIGRyaXZlci4KKyoKKyogICAgICBDb3B5cmlnaHQgKEMpIDIwMDEgIEJyb2FkY29tIENvcnBvcmF0aW9uLgorKiAgICAgIENvcHlyaWdodCAoQykgMjAwMCwyMDAxICBDaXJydXMgTG9naWMgQ29ycC4gIAorKiAgICAgICAgICAgIC0tIGFkYXB0ZWQgZnJvbSBkcml2ZXJzIGJ5IFRob21hcyBTYWlsZXIsIAorKiAgICAgICAgICAgIC0tIGJ1dCBkb24ndCBidWcgaGltOyBQcm9ibGVtcyBzaG91bGQgZ28gdG86CisqICAgICAgICAgICAgLS0gdG9tIHdvbGxlciAodHdvbGxlckBjcnlzdGFsLmNpcnJ1cy5jb20pIG9yCisqICAgICAgICAgICAgICAgKGF1ZGlvQGNyeXN0YWwuY2lycnVzLmNvbSkuCisqICAgICAgICAgICAgLS0gYWRhcHRlZCBmcm9tIGNzNDI4MSBQQ0kgZHJpdmVyIGZvciBjczQyOTdhIG9uCisqICAgICAgICAgICAgICAgQkNNMTI1MCBTeW5jaHJvbm91cyBTZXJpYWwgaW50ZXJmYWNlCisqICAgICAgICAgICAgICAgKEtpcCBXYWxrZXIsIEJyb2FkY29tIENvcnAuKQorKiAgICAgIENvcHlyaWdodCAoQykgMjAwNCAgTWFjaWVqIFcuIFJvenlja2kKKyogICAgICBDb3B5cmlnaHQgKEMpIDIwMDUgUmFsZiBCYWVjaGxlIChyYWxmQGxpbnV4LW1pcHMub3JnKQorKgorKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisqICAgICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyogICAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorKiAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisqCisqICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisqICAgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyogICAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisqICAgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyoKKyogICAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKiAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisqICAgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisqCisqIE1vZHVsZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyczoKKyogICBub25lCisqCisqICBTdXBwb3J0ZWQgZGV2aWNlczoKKyogIC9kZXYvZHNwICAgIHN0YW5kYXJkIC9kZXYvZHNwIGRldmljZSwgKG1vc3RseSkgT1NTIGNvbXBhdGlibGUKKyogIC9kZXYvbWl4ZXIgIHN0YW5kYXJkIC9kZXYvbWl4ZXIgZGV2aWNlLCAobW9zdGx5KSBPU1MgY29tcGF0aWJsZQorKiAgL2Rldi9taWRpICAgc2ltcGxlIE1JREkgVUFSVCBpbnRlcmZhY2UsIG5vIGlvY3RsCisqCisqIE1vZGlmaWNhdGlvbiBIaXN0b3J5CisqIDA4LzIwLzAwIHRydyAtIHNpbGVuY2UgYW5kIG5vIHN0b3BwaW5nIERBQyB1bnRpbCByZWxlYXNlCisqIDA4LzIzLzAwIHRydyAtIGFkZGVkIENTX0RCRyBzdGF0ZW1lbnRzLCBmaXggaW50ZXJydXB0IGhhbmcgaXNzdWUgb24gREFDIHN0b3AuCisqIDA5LzE4LzAwIHRydyAtIGFkZGVkIDE2Yml0IG9ubHkgcmVjb3JkIHdpdGggY29udmVyc2lvbiAKKyogMDkvMjQvMDAgdHJ3IC0gYWRkZWQgRW5oYW5jZWQgRnVsbCBkdXBsZXggKHNlcGFyYXRlIHNpbXVsdGFuZW91cyAKKyogICAgICAgICAgICAgICAgY2FwdHVyZS9wbGF5YmFjayByYXRlcykKKyogMTAvMDMvMDAgdHJ3IC0gZml4ZWQgbW1hcCAoZml4ZWQgR1JFQ09SRCBhbmQgdGhlIFhNTVMgbW1hcCB0ZXN0IHBsdWdpbiAgCisqICAgICAgICAgICAgICAgIGxpYk9TU20uc28pCisqIDEwLzExLzAwIHRydyAtIG1vZGlmaWVkIGZvciAyLjQuMC10ZXN0OSBrZXJuZWwgZW5oYW5jZW1lbnRzIChOUl9NQVAgcmVtb3ZhbCkKKyogMTEvMDMvMDAgdHJ3IC0gZml4ZWQgaW50ZXJydXB0IGxvc3Mvc3R1dHRlciwgYWRkZWQgZGVidWcuCisqIDExLzEwLzAwIGJreiAtIGFkZGVkIF9fZGV2aW5pdCB0byBjczQyOTdhX2h3X2luaXQoKQorKiAxMS8xMC8wMCB0cncgLSBmaXhlZCBTTVAgYW5kIGNhcHR1cmUgc3BpbmxvY2sgaGFuZy4KKyogMTIvMDQvMDAgdHJ3IC0gY2xlYW5lZCB1cCBDU0RFQlVHIGZsYWdzIGFuZCBhZGRlZCAiZGVmYXVsdG9yZGVyIiBtb2R1bGVwYXJtLgorKiAxMi8wNS8wMCB0cncgLSBmaXhlZCBwb2xsaW5nIChteXRoMiksIGFuZCBhZGRlZCB1bmRlcnJ1biBzd3B0ciBmaXguCisqIDEyLzA4LzAwIHRydyAtIGFkZGVkIFBNIHN1cHBvcnQuIAorKiAxMi8xNC8wMCB0cncgLSBhZGRlZCB3cmFwcGVyIGNvZGUsIGJ1aWxkcyB1bmRlciAyLjQuMCwgMi4yLjE3LTIwLCAyLjIuMTctOCAKKyoJCSAoUkgvRGVsbCBiYXNlKSwgMi4yLjE4LCAyLjIuMTIuICBjbGVhbmVkIHVwIGNvZGUgbW9kcyBieSBpZGVudC4KKyogMTIvMTkvMDAgdHJ3IC0gYWRkZWQgUE0gc3VwcG9ydCBmb3IgMi4yIGJhc2UgKGFwbV9jYWxsYmFjaykuIG90aGVyIFBNIGNsZWFudXAuCisqIDEyLzIxLzAwIHRydyAtIGFkZGVkIGZyYWN0aW9uYWwgImRlZmF1bHRvcmRlciIgaW5wdXRzLiBpZiA+MTAwIHRoZW4gdXNlIAorKgkJIGRlZmF1bHRvcmRlci0xMDAgYXMgcG93ZXIgb2YgMiBmb3IgdGhlIGJ1ZmZlciBzaXplLiBleGFtcGxlOgorKgkJIDEwNiA9IDJeKDEwNi0xMDApID0gMl42ID0gNjQgYnl0ZXMgZm9yIHRoZSBidWZmZXIgc2l6ZS4KKyoKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kY2FyZC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjOTdfY29kZWMuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisKKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNpbmNsdWRlIDxhc20vc2lieXRlL3NiMTI1MF9yZWdzLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfaW50Lmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfZG1hLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfc2NkLmg+CisjaW5jbHVkZSA8YXNtL3NpYnl0ZS9zYjEyNTBfc3luY3Nlci5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwX21hYy5oPgorI2luY2x1ZGUgPGFzbS9zaWJ5dGUvc2IxMjUwLmg+CisKK3N0cnVjdCBjczQyOTdhX3N0YXRlOworCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyk7CitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpOworc3RhdGljIHZvaWQgc3RhcnRfYWRjKHN0cnVjdCBjczQyOTdhX3N0YXRlICpzKTsKKyN1bmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisjZGVmaW5lIENTNDI5N2FfTUFHSUMgICAgICAgICAgIDB4ZjAwYmVlZjEKKworLy8gYnVmZmVyIG9yZGVyIGRldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIGRtYSBidWZmZXIgZm9yIHRoZSBkcml2ZXIuCisvLyB1bmRlciBMaW51eCwgYSBzbWFsbGVyIGJ1ZmZlciBhbGxvd3MgbW9yZSByZXNwb25zaXZlbmVzcyBmcm9tIG1hbnkgb2YgdGhlIAorLy8gYXBwbGljYXRpb25zIChlLmcuIGdhbWVzKS4gIEEgbGFyZ2VyIGJ1ZmZlciBhbGxvd3Mgc29tZSBvZiB0aGUgYXBwcyAoZXNvdW5kKSAKKy8vIHRvIG5vdCB1bmRlcnJ1biB0aGUgZG1hIGJ1ZmZlciBhcyBlYXNpbHkuICBBcyBkZWZhdWx0LCB1c2UgMzJrIChvcmRlcj0zKQorLy8gcmF0aGVyIHRoYW4gNjRrIGFzIHNvbWUgb2YgdGhlIGdhbWVzIHdvcmsgbW9yZSByZXNwb25zaXZlbHkuCisvLyBsb2cgYmFzZSAyKCBidWZmIHN6ID0gMzJrKS4KKworLy9zdGF0aWMgdW5zaWduZWQgbG9uZyBkZWZhdWx0b3JkZXIgPSAzOworLy9NT0RVTEVfUEFSTShkZWZhdWx0b3JkZXIsICJpIik7CisKKy8vCisvLyBUdXJuIG9uL29mZiBkZWJ1Z2dpbmcgY29tcGlsYXRpb24gYnkgY29tbWVudGluZyBvdXQgIiNkZWZpbmUgQ1NERUJVRyIKKy8vCisjZGVmaW5lIENTREVCVUcgMAorI2lmIENTREVCVUcKKyNkZWZpbmUgQ1NERUJVR19JTlRFUkZBQ0UgMQorI2Vsc2UKKyN1bmRlZiBDU0RFQlVHX0lOVEVSRkFDRQorI2VuZGlmCisvLworLy8gY3NfZGVidWdtYXNrIGFyZWFzCisvLworI2RlZmluZSBDU19JTklUCSAJMHgwMDAwMDAwMQkvLyBpbml0aWFsaXphdGlvbiBhbmQgcHJvYmUgZnVuY3Rpb25zCisjZGVmaW5lIENTX0VSUk9SIAkweDAwMDAwMDAyCS8vIHRtcCBkZWJ1Z2dpbmcgYml0IHBsYWNlaG9sZGVyCisjZGVmaW5lIENTX0lOVEVSUlVQVAkweDAwMDAwMDA0CS8vIGludGVycnVwdCBoYW5kbGVyIChzZXBhcmF0ZSBmcm9tIGFsbCBvdGhlcikKKyNkZWZpbmUgQ1NfRlVOQ1RJT04gCTB4MDAwMDAwMDgJLy8gZW50ZXIvbGVhdmUgZnVuY3Rpb25zCisjZGVmaW5lIENTX1dBVkVfV1JJVEUgCTB4MDAwMDAwMTAJLy8gd3JpdGUgaW5mb3JtYXRpb24gZm9yIHdhdmUKKyNkZWZpbmUgQ1NfV0FWRV9SRUFEIAkweDAwMDAwMDIwCS8vIHJlYWQgaW5mb3JtYXRpb24gZm9yIHdhdmUKKyNkZWZpbmUgQ1NfQUM5NyAgICAgICAgIDB4MDAwMDAwNDAgICAgICAvLyBBQzk3IHJlZ2lzdGVyIGFjY2VzcworI2RlZmluZSBDU19ERVNDUiAgICAgICAgMHgwMDAwMDA4MCAgICAgIC8vIGRlc2NyaXB0b3IgbWFuYWdlbWVudAorI2RlZmluZSBDU19PUEVOCQkweDAwMDAwNDAwCS8vIGFsbCBvcGVuIGZ1bmN0aW9ucyBpbiB0aGUgZHJpdmVyCisjZGVmaW5lIENTX1JFTEVBU0UJMHgwMDAwMDgwMAkvLyBhbGwgcmVsZWFzZSBmdW5jdGlvbnMgaW4gdGhlIGRyaXZlcgorI2RlZmluZSBDU19QQVJNUwkweDAwMDAxMDAwCS8vIGZ1bmN0aW9uYWwgYW5kIG9wZXJhdGlvbmFsIHBhcmFtZXRlcnMKKyNkZWZpbmUgQ1NfSU9DVEwJMHgwMDAwMjAwMAkvLyBpb2N0bCAobm9uLW1peGVyKQorI2RlZmluZSBDU19UTVAJCTB4MTAwMDAwMDAJLy8gdG1wIGRlYnVnIG1hc2sgYml0CisKKy8vCisvLyBDU0RFQlVHIGlzIHVzdWFsIG1vZGUgaXMgc2V0IHRvIDEsIHRoZW4gdXNlIHRoZQorLy8gY3NfZGVidWdsZXZlbCBhbmQgY3NfZGVidWdtYXNrIHRvIHR1cm4gb24gb3Igb2ZmIGRlYnVnZ2luZy4KKy8vIERlYnVnIGxldmVsIG9mIDEgaGFzIGJlZW4gZGVmaW5lZCB0byBiZSBrZXJuZWwgZXJyb3JzIGFuZCBpbmZvCisvLyB0aGF0IHNob3VsZCBiZSBwcmludGVkIG9uIGFueSByZWxlYXNlZCBkcml2ZXIuCisvLworI2lmIENTREVCVUcKKyNkZWZpbmUgQ1NfREJHT1VUKG1hc2ssbGV2ZWwseCkgaWYoKGNzX2RlYnVnbGV2ZWwgPj0gKGxldmVsKSkgJiYgKChtYXNrKSAmIGNzX2RlYnVnbWFzaykgKSB7eDt9CisjZWxzZQorI2RlZmluZSBDU19EQkdPVVQobWFzayxsZXZlbCx4KQorI2VuZGlmCisKKyNpZiBDU0RFQlVHCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z2xldmVsID0gNDsJLy8gbGV2ZWxzIHJhbmdlIGZyb20gMS05CitzdGF0aWMgdW5zaWduZWQgbG9uZyBjc19kZWJ1Z21hc2sgPSBDU19JTklUIC8qfCBDU19JT0NUTCovOworTU9EVUxFX1BBUk0oY3NfZGVidWdsZXZlbCwgImkiKTsKK01PRFVMRV9QQVJNKGNzX2RlYnVnbWFzaywgImkiKTsKKyNlbmRpZgorI2RlZmluZSBDU19UUlVFIAkxCisjZGVmaW5lIENTX0ZBTFNFIAkwCisKKyNkZWZpbmUgQ1NfVFlQRV9BREMgMAorI2RlZmluZSBDU19UWVBFX0RBQyAxCisKKyNkZWZpbmUgU0VSX0JBU0UgICAgKEFfU0VSX0JBU0VfMSArIEtTRUcxKQorI2RlZmluZSBTU19DU1IodCkgICAoU0VSX0JBU0UrdCkKKyNkZWZpbmUgU1NfVFhUQkwodCkgKFNFUl9CQVNFK1JfU0VSX1RYX1RBQkxFX0JBU0UrKHQqOCkpCisjZGVmaW5lIFNTX1JYVEJMKHQpIChTRVJfQkFTRStSX1NFUl9SWF9UQUJMRV9CQVNFKyh0KjgpKQorCisjZGVmaW5lIEZSQU1FX0JZVEVTICAgICAgICAgICAgMzIKKyNkZWZpbmUgRlJBTUVfU0FNUExFX0JZVEVTICAgICAgNAorCisvKiBTaG91bGQgdGhpcyBiZSB2YXJpYWJsZT8gKi8KKyNkZWZpbmUgU0FNUExFX0JVRl9TSVpFICAgICAgICAoMTYqMTAyNCkKKyNkZWZpbmUgU0FNUExFX0ZSQU1FX0NPVU5UICAgICAoU0FNUExFX0JVRl9TSVpFIC8gRlJBTUVfU0FNUExFX0JZVEVTKQorLyogVGhlIGRyaXZlciBjYW4gZXhwbG9kZS9zaHJpbmsgdGhlIGZyYW1lcyB0by9mcm9tIGEgc21hbGxlciBzYW1wbGUKKyAgIGJ1ZmZlciAqLworI2RlZmluZSBETUFfQkxPQVRfRkFDVE9SICAgICAgIDEKKyNkZWZpbmUgRE1BX0RFU0NSICAgICAgICAgICAgICAoU0FNUExFX0ZSQU1FX0NPVU5UIC8gRE1BX0JMT0FUX0ZBQ1RPUikKKyNkZWZpbmUgRE1BX0JVRl9TSVpFICAgICAgICAgICAoRE1BX0RFU0NSICogRlJBTUVfQllURVMpCisKKy8qIFVzZSB0aGUgbWF4bWl1bSBjb3VudCAoMjU1ID09IDUuMSBtcyBiZXR3ZWVuIGludGVycnVwdHMpICovCisjZGVmaW5lIERNQV9JTlRfQ05UICAgICAgICAgICAgKCgxIDw8IFNfRE1BX0lOVF9QS1RDTlQpIC0gMSkKKworLyogRmlndXJlIHRoaXMgb3V0OiBob3cgbWFueSBUWCBETUFzIGFoZWFkIHRvIHNjaGVkdWxlIGEgcmVnIGFjY2VzcyAqLworI2RlZmluZSBSRUdfTEFURU5DWSAgICAgICAgICAgIDE1MAorCisjZGVmaW5lIEZSQU1FX1RYX1VTICAgICAgICAgICAgIDIwCisKKyNkZWZpbmUgU0VSRE1BX05FWFRCVUYoZCxmKSAoKChkKS0+ZisxKSAlIChkKS0+cmluZ3N6KQorCitzdGF0aWMgY29uc3QgY2hhciBpbnZhbGlkX21hZ2ljW10gPQorICAgIEtFUk5fQ1JJVCAiY3M0Mjk3YTogaW52YWxpZCBtYWdpYyB2YWx1ZVxuIjsKKworI2RlZmluZSBWQUxJREFURV9TVEFURShzKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIShzKSB8fCAocyktPm1hZ2ljICE9IENTNDI5N2FfTUFHSUMpIHsgXAorICAgICAgICAgICAgICAgIHByaW50ayhpbnZhbGlkX21hZ2ljKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiAtRU5YSU87ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfSkKKworc3RydWN0IGxpc3RfaGVhZCBjczQyOTdhX2RldnMgPSB7ICZjczQyOTdhX2RldnMsICZjczQyOTdhX2RldnMgfTsKKwordHlwZWRlZiBzdHJ1Y3Qgc2VyZG1hX2Rlc2NyX3MgeworICAgICAgICB1NjQgZGVzY3JfYTsKKyAgICAgICAgdTY0IGRlc2NyX2I7Cit9IHNlcmRtYV9kZXNjcl90OworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgcGFkZHJfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc2VyZG1hX3MgeworICAgICAgICB1bnNpZ25lZCAgICAgICAgIHJpbmdzejsKKyAgICAgICAgc2VyZG1hX2Rlc2NyX3QgICpkZXNjcnRhYjsKKyAgICAgICAgc2VyZG1hX2Rlc2NyX3QgICpkZXNjcnRhYl9lbmQ7CisgICAgICAgIHBhZGRyX3QgICAgICAgICAgZGVzY3J0YWJfcGh5czsKKyAgICAgICAgCisgICAgICAgIHNlcmRtYV9kZXNjcl90ICAqZGVzY3JfYWRkOworICAgICAgICBzZXJkbWFfZGVzY3JfdCAgKmRlc2NyX3JlbTsKKyAgICAgICAgCisgICAgICAgIHU2NCAgKmRtYV9idWY7ICAgICAgICAgICAvLyBidWZmZXIgZm9yIERNQSBjb250ZW50cyAoZnJhbWVzKQorICAgICAgICBwYWRkcl90ICAgICAgICAgIGRtYV9idWZfcGh5czsKKyAgICAgICAgdTE2ICAqc2FtcGxlX2J1ZjsJCS8vIHRtcCBidWZmZXIgZm9yIHNhbXBsZSBjb252ZXJzaW9ucworICAgICAgICB1MTYgICpzYl9zd3B0cjsKKyAgICAgICAgdTE2ICAqc2JfaHdwdHI7CisgICAgICAgIHUxNiAgKnNiX2VuZDsKKworICAgICAgICBkbWFfYWRkcl90IGRtYWFkZHI7CisvLyAgICAgICAgdW5zaWduZWQgYnVmb3JkZXI7CS8vIExvZyBiYXNlIDIgb2YgJ2RtYV9idWYnIHNpemUgaW4gYnl0ZXMuLgorICAgICAgICB1bnNpZ25lZCBudW1mcmFnOwkvLyAjIG9mICdmcmFnbWVudHMnIGluIHRoZSBidWZmZXIuCisgICAgICAgIHVuc2lnbmVkIGZyYWdzaGlmdDsJLy8gTG9nIGJhc2UgMiBvZiBmcmFnbWVudCBzaXplLgorICAgICAgICB1bnNpZ25lZCBod3B0ciwgc3dwdHI7CisgICAgICAgIHVuc2lnbmVkIHRvdGFsX2J5dGVzOwkvLyAjIGJ5dGVzIHByb2Nlc3Mgc2luY2Ugb3Blbi4KKyAgICAgICAgdW5zaWduZWQgYmxvY2tzOwkvLyBsYXN0IHJldHVybmVkIGJsb2NrcyB2YWx1ZSBHRVRPUFRSCisgICAgICAgIHVuc2lnbmVkIHdha2V1cDsJLy8gaW50ZXJydXB0IG9jY3VycmVkIG9uIGJsb2NrIAorICAgICAgICBpbnQgY291bnQ7CisgICAgICAgIHVuc2lnbmVkIHVuZGVycnVuOwkvLyB1bmRlcnJ1biBmbGFnCisgICAgICAgIHVuc2lnbmVkIGVycm9yOwkvLyBvdmVyL3VuZGVycnVuIAorICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OworICAgICAgICB3YWl0X3F1ZXVlX2hlYWRfdCByZWdfd2FpdDsKKyAgICAgICAgLy8gcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAKKyAgICAgICAgdW5zaWduZWQgZnJhZ3NpemU7CS8vIDIqKmZyYWdzaGlmdC4uCisgICAgICAgIHVuc2lnbmVkIHNidWZzejsJLy8gMioqYnVmb3JkZXIuCisgICAgICAgIHVuc2lnbmVkIGZyYWdzYW1wbGVzOworICAgICAgICAvLyBPU1Mgc3R1ZmYgCisgICAgICAgIHVuc2lnbmVkIG1hcHBlZDoxOwkvLyBCdWZmZXIgbWFwcGVkIGluIGNzNDI5N2FfbW1hcCgpPworICAgICAgICB1bnNpZ25lZCByZWFkeToxOwkvLyBwcm9nX2RtYWJ1Zl9kYWMoKS9hZGMoKSBzdWNjZXNzZnVsPworICAgICAgICB1bnNpZ25lZCBlbmRjbGVhcmVkOjE7CisgICAgICAgIHVuc2lnbmVkIHR5cGU6MTsJLy8gYWRjIG9yIGRhYyBidWZmZXIgKENTX1RZUEVfWFhYKQorICAgICAgICB1bnNpZ25lZCBvc3NmcmFnc2hpZnQ7CisgICAgICAgIGludCBvc3NtYXhmcmFnczsKKyAgICAgICAgdW5zaWduZWQgc3ViZGl2aXNpb247Cit9IHNlcmRtYV90OworCitzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSB7CisJLy8gbWFnaWMgCisJdW5zaWduZWQgaW50IG1hZ2ljOworCisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJLy8gc291bmRjb3JlIHN0dWZmIAorCWludCBkZXZfYXVkaW87CisJaW50IGRldl9taXhlcjsKKworCS8vIGhhcmR3YXJlIHJlc291cmNlcyAKKwl1bnNpZ25lZCBpbnQgaXJxOworCisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJ4X292cnJuOyAvKiBGSUZPICovCisgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHJ4X292ZXJmbG93OyAvKiBzdGFnaW5nIGJ1ZmZlciAqLworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0eF91bmRlcnJ1bjsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcnhfYmFkOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByeF9nb29kOworICAgICAgICB9IHN0YXRzOworCisJLy8gbWl4ZXIgcmVnaXN0ZXJzIAorCXN0cnVjdCB7CisJCXVuc2lnbmVkIHNob3J0IHZvbFsxMF07CisJCXVuc2lnbmVkIGludCByZWNzcmM7CisJCXVuc2lnbmVkIGludCBtb2RjbnQ7CisJCXVuc2lnbmVkIHNob3J0IG1pY3ByZWFtcDsKKwl9IG1peDsKKworCS8vIHdhdmUgc3R1ZmYgICAKKwlzdHJ1Y3QgcHJvcGVydGllcyB7CisJCXVuc2lnbmVkIGZtdDsKKwkJdW5zaWduZWQgZm10X29yaWdpbmFsOwkvLyBvcmlnaW5hbCByZXF1ZXN0ZWQgZm9ybWF0CisJCXVuc2lnbmVkIGNoYW5uZWxzOworCQl1bnNpZ25lZCByYXRlOworCX0gcHJvcF9kYWMsIHByb3BfYWRjOworCXVuc2lnbmVkIGNvbnZlcnNpb246MTsJLy8gY29udmVyc2lvbiBmcm9tIDE2IHRvIDggYml0IGluIHByb2dyZXNzCisJdW5zaWduZWQgZW5hOworCXNwaW5sb2NrX3QgbG9jazsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW1fYWRjOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW1fZGFjOworCW1vZGVfdCBvcGVuX21vZGU7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0OworCXdhaXRfcXVldWVfaGVhZF90IG9wZW5fd2FpdF9hZGM7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgb3Blbl93YWl0X2RhYzsKKworCWRtYV9hZGRyX3QgZG1hYWRkcl9zYW1wbGVfYnVmOworCXVuc2lnbmVkIGJ1Zm9yZGVyX3NhbXBsZV9idWY7CS8vIExvZyBiYXNlIDIgb2YgJ2RtYV9idWYnIHNpemUgaW4gYnl0ZXMuLgorCisgICAgICAgIHNlcmRtYV90IGRtYV9kYWMsIGRtYV9hZGM7CisKKyAgICAgICAgdm9sYXRpbGUgdTE2IHJlYWRfdmFsdWU7CisgICAgICAgIHZvbGF0aWxlIHUxNiByZWFkX3JlZzsKKyAgICAgICAgdm9sYXRpbGUgdTY0IHJlZ19yZXF1ZXN0OworfTsKKworI2lmIDEKKyNkZWZpbmUgcHJvZ19jb2RlYyhhLGIpCisjZGVmaW5lIGRlYWxsb2NfZG1hYnVmKGEsYik7CisjZW5kaWYKKworc3RhdGljIGludCBwcm9nX2RtYWJ1Zl9hZGMoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpCit7CisJcy0+ZG1hX2FkYy5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBwcm9nX2RtYWJ1Zl9kYWMoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpCit7CisJcy0+ZG1hX2RhYy5yZWFkeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFyX2FkdmFuY2Uodm9pZCAqYnVmLCB1bnNpZ25lZCBic2l6ZSwgdW5zaWduZWQgYnB0ciwKKwkJCSAgdW5zaWduZWQgbGVuLCB1bnNpZ25lZCBjaGFyIGMpCit7CisJaWYgKGJwdHIgKyBsZW4gPiBic2l6ZSkgeworCQl1bnNpZ25lZCB4ID0gYnNpemUgLSBicHRyOworCQltZW1zZXQoKChjaGFyICopIGJ1ZikgKyBicHRyLCBjLCB4KTsKKwkJYnB0ciA9IDA7CisJCWxlbiAtPSB4OworCX0KKwlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkiY3M0Mjk3YTogY2xlYXJfYWR2YW5jZSgpOiBtZW1zZXQgJWQgYXQgMHglLjh4IGZvciAlZCBzaXplIFxuIiwKKwkJCSh1bnNpZ25lZCljLCAodW5zaWduZWQpKChjaGFyICopIGJ1ZikgKyBicHRyLCBsZW4pKTsKKwltZW1zZXQoKChjaGFyICopIGJ1ZikgKyBicHRyLCBjLCBsZW4pOworfQorCisjaWYgQ1NERUJVRworCisvLyBERUJVRyBST1VUSU5FUworCisjZGVmaW5lIFNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMIAlfU0lPV1IoJ00nLDEyMCwgaW50KQorI2RlZmluZSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTCAJX1NJT1dSKCdNJywxMjEsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSyAJX1NJT1dSKCdNJywxMjIsIGludCkKKyNkZWZpbmUgU09VTkRfTUlYRVJfQ1NfU0VUREJHTUFTSyAJX1NJT1dSKCdNJywxMjMsIGludCkKKworc3RhdGljIHZvaWQgY3NfcHJpbnRpb2N0bCh1bnNpZ25lZCBpbnQgeCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIHZpZHg7CisJLy8gSW5kZXggb2YgbWl4dGFibGUxW10gbWVtYmVyIGlzIERldmljZSBJRCAKKwkvLyBhbmQgbXVzdCBiZSA8PSBTT1VORF9NSVhFUl9OUkRFVklDRVMuCisJLy8gVmFsdWUgb2YgYXJyYXkgbWVtYmVyIGlzIGluZGV4IGludG8gcy0+bWl4LnZvbFtdCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbWl4dGFibGUxW1NPVU5EX01JWEVSX05SREVWSUNFU10gPSB7CisJCVtTT1VORF9NSVhFUl9QQ01dID0gMSwJLy8gdm9pY2UgCisJCVtTT1VORF9NSVhFUl9MSU5FMV0gPSAyLAkvLyBBVVgKKwkJW1NPVU5EX01JWEVSX0NEXSA9IDMsCS8vIENEIAorCQlbU09VTkRfTUlYRVJfTElORV0gPSA0LAkvLyBMaW5lIAorCQlbU09VTkRfTUlYRVJfU1lOVEhdID0gNSwJLy8gRk0KKwkJW1NPVU5EX01JWEVSX01JQ10gPSA2LAkvLyBNaWMgCisJCVtTT1VORF9NSVhFUl9TUEVBS0VSXSA9IDcsCS8vIFNwZWFrZXIgCisJCVtTT1VORF9NSVhFUl9SRUNMRVZdID0gOCwJLy8gUmVjb3JkaW5nIGxldmVsIAorCQlbU09VTkRfTUlYRVJfVk9MVU1FXSA9IDkJLy8gTWFzdGVyIFZvbHVtZSAKKwl9OworCisJc3dpdGNoICh4KSB7CisJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfTUlYRVJfQ1NfR0VUREJHTUFTSzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9DU19HRVREQkdMRVZFTDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJICBwcmludGsoIlNPVU5EX01JWEVSX0NTX0dFVERCR0xFVkVMOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9DU19TRVREQkdNQVNLOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR0xFVkVMOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUw6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJPU1NfR0VUVkVSU0lPTjpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NZTkM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVERVUExFWDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVENBUFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfUkVTRVQ6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TUEVFRDoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1BFRUQ6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NURVJFTzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9DSEFOTkVMUzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVEZNVFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVEZNVDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1BPU1Q6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRUUklHR0VSOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU0VUVFJJR0dFUjpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUT1NQQUNFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRJU1BBQ0U6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfTk9OQkxPQ0s6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVE9ERUxBWTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX0dFVElQVFI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU05EQ1RMX0RTUF9HRVRPUFRSOlxuIikpOworCQlicmVhazsKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfR0VUQkxLU0laRTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNORENUTF9EU1BfU1VCRElWSURFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX1JBVEU6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9SQVRFOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkgIHByaW50aygiU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX1BDTV9SRUFEX0JJVFM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfUENNX1dSSVRFX0ZJTFRFUjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJICBwcmludGsoIlNPVU5EX1BDTV9XUklURV9GSUxURVI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTTkRDVExfRFNQX1NFVFNZTkNSTzpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9QQ01fUkVBRF9GSUxURVI6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTE6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFMTpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMjoKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEUyOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX1BSSVZBVEUzOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfTUlYRVJfUFJJVkFURTM6XG4iKSk7CisJCWJyZWFrOworCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9QUklWQVRFNDpcbiIpKTsKKwkJYnJlYWs7CisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFNToKKwkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsoIlNPVU5EX01JWEVSX1BSSVZBVEU1OlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX01JWEVSX0lORk86CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9JTkZPOlxuIikpOworCQlicmVhazsKKwljYXNlIFNPVU5EX09MRF9NSVhFUl9JTkZPOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aygiU09VTkRfT0xEX01JWEVSX0lORk86XG4iKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJc3dpdGNoIChfSU9DX05SKHgpKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfVk9MVU1FOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9WT0xVTUU6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9TUEVBS0VSOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TUEVBS0VSOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDTEVWOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9SRUNMRVY6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkJICBwcmludGsoIlNPVU5EX01JWEVSX01JQzpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TWU5USDpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCQkgIHByaW50aygiU09VTkRfTUlYRVJfUkVDU1JDOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfREVWTUFTSzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwKKwkJCQkgIHByaW50aygiU09VTkRfTUlYRVJfREVWTUFTSzpcbiIpKTsKKwkJCWJyZWFrOworCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsCisJCQkJICBwcmludGsoIlNPVU5EX01JWEVSX1JFQ01BU0s6XG4iKSk7CisJCQlicmVhazsKKwkJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LAorCQkJCSAgcHJpbnRrKCJTT1VORF9NSVhFUl9TVEVSRU9ERVZTOlxuIikpOworCQkJYnJlYWs7CisJCWNhc2UgU09VTkRfTUlYRVJfQ0FQUzoKKwkJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKCJTT1VORF9NSVhFUl9DQVBTOlxuIikpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpID0gX0lPQ19OUih4KTsKKwkJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUworCQkJICAgIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpIHsKKwkJCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50aworCQkJCQkoIlVOS05PV04gSU9DVEw6IDB4JS44eCBOUj0lZFxuIiwKKwkJCQkJCXgsIGkpKTsKKwkJCX0gZWxzZSB7CisJCQkJQ1NfREJHT1VUKENTX0lPQ1RMLCA0LCBwcmludGsKKwkJCQkJKCJTT1VORF9NSVhFUl9JT0NUTCBBQzl4OiAweCUuOHggTlI9JWRcbiIsCisJCQkJCQl4LCBpKSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKyNlbmRpZgorCisKK3N0YXRpYyBpbnQgc2VyX2luaXQoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpCit7CisgICAgICAgIGludCBpOworCisgICAgICAgIENTX0RCR09VVChDU19JTklULCAyLCAKKyAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IFNldHRpbmcgdXAgc2VyaWFsIHBhcmFtZXRlcnNcbiIpKTsKKworICAgICAgICBfX3Jhd193cml0ZXEoTV9TWU5DU0VSX0NNRF9SWF9SRVNFVCB8IE1fU1lOQ1NFUl9DTURfVFhfUkVTRVQsIFNTX0NTUihSX1NFUl9DTUQpKTsKKworICAgICAgICBfX3Jhd193cml0ZXEoTV9TWU5DU0VSX01TQl9GSVJTVCwgU1NfQ1NSKFJfU0VSX01PREUpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKDMyLCBTU19DU1IoUl9TRVJfTUlORlJNX1NaKSk7CisgICAgICAgIF9fcmF3X3dyaXRlcSgzMiwgU1NfQ1NSKFJfU0VSX01BWEZSTV9TWikpOworCisgICAgICAgIF9fcmF3X3dyaXRlcSgxLCBTU19DU1IoUl9TRVJfVFhfUkRfVEhSU0gpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKDQsIFNTX0NTUihSX1NFUl9UWF9XUl9USFJTSCkpOworICAgICAgICBfX3Jhd193cml0ZXEoOCwgU1NfQ1NSKFJfU0VSX1JYX1JEX1RIUlNIKSk7CisKKyAgICAgICAgLyogVGhpcyBsb29rcyBnb29kIGZyb20gZXhwZXJpbWVudGF0aW9uICovCisgICAgICAgIF9fcmF3X3dyaXRlcSgoTV9TWU5DU0VSX1RYU1lOQ19JTlQgfCBWX1NZTkNTRVJfVFhTWU5DX0RMWSgwKSB8IE1fU1lOQ1NFUl9UWENMS19FWFQgfAorICAgICAgICAgICAgICAgTV9TWU5DU0VSX1JYU1lOQ19JTlQgfCBWX1NZTkNTRVJfUlhTWU5DX0RMWSgxKSB8IE1fU1lOQ1NFUl9SWENMS19FWFQgfCBNX1NZTkNTRVJfUlhTWU5DX0VER0UpLAorICAgICAgICAgICAgICBTU19DU1IoUl9TRVJfTElORV9NT0RFKSk7CisKKyAgICAgICAgLyogVGhpcyBsb29rcyBnb29kIGZyb20gZXhwZXJpbWVudGF0aW9uICovCisgICAgICAgIF9fcmF3X3dyaXRlcShWX1NZTkNTRVJfU0VRX0NPVU5UKDE0KSB8IE1fU1lOQ1NFUl9TRVFfRU5BQkxFIHwgTV9TWU5DU0VSX1NFUV9TVFJPQkUsCisgICAgICAgICAgICAgIFNTX1RYVEJMKDApKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoMTUpIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfCBNX1NZTkNTRVJfU0VRX0JZVEUsCisgICAgICAgICAgICAgIFNTX1RYVEJMKDEpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoMTMpIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfCBNX1NZTkNTRVJfU0VRX0JZVEUsCisgICAgICAgICAgICAgIFNTX1RYVEJMKDIpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoIDApIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfAorICAgICAgICAgICAgICBNX1NZTkNTRVJfU0VRX1NUUk9CRSB8IE1fU1lOQ1NFUl9TRVFfTEFTVCwgU1NfVFhUQkwoMykpOworCisgICAgICAgIF9fcmF3X3dyaXRlcShWX1NZTkNTRVJfU0VRX0NPVU5UKDE0KSB8IE1fU1lOQ1NFUl9TRVFfRU5BQkxFIHwgTV9TWU5DU0VSX1NFUV9TVFJPQkUsCisgICAgICAgICAgICAgIFNTX1JYVEJMKDApKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoMTUpIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfCBNX1NZTkNTRVJfU0VRX0JZVEUsCisgICAgICAgICAgICAgIFNTX1JYVEJMKDEpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoMTMpIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfCBNX1NZTkNTRVJfU0VRX0JZVEUsCisgICAgICAgICAgICAgIFNTX1JYVEJMKDIpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKFZfU1lOQ1NFUl9TRVFfQ09VTlQoIDApIHwgTV9TWU5DU0VSX1NFUV9FTkFCTEUgfCBNX1NZTkNTRVJfU0VRX1NUUk9CRSB8CisgICAgICAgICAgICAgIE1fU1lOQ1NFUl9TRVFfTEFTVCwgU1NfUlhUQkwoMykpOworCisgICAgICAgIGZvciAoaT00OyBpPDE2OyBpKyspIHsKKyAgICAgICAgICAgICAgICAvKiBKdXN0IGluIGNhc2UuLi4gKi8KKyAgICAgICAgICAgICAgICBfX3Jhd193cml0ZXEoTV9TWU5DU0VSX1NFUV9MQVNULCBTU19UWFRCTChpKSk7CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVxKE1fU1lOQ1NFUl9TRVFfTEFTVCwgU1NfUlhUQkwoaSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9zZXJkbWEoc2VyZG1hX3QgKmRtYSkKK3sKKyAgICAgICAgQ1NfREJHT1VUKENTX0lOSVQsIDIsCisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IGRlc2MgLSAlZCBzYnVmc2l6ZSAtICVkIGRidWZzaXplIC0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRE1BX0RFU0NSLCBTQU1QTEVfQlVGX1NJWkUsIERNQV9CVUZfU0laRSkpOworCisgICAgICAgIC8qIERlc2NyaXB0b3JzICovCisgICAgICAgIGRtYS0+cmluZ3N6ID0gRE1BX0RFU0NSOworICAgICAgICBkbWEtPmRlc2NydGFiID0ga21hbGxvYyhkbWEtPnJpbmdzeiAqIHNpemVvZihzZXJkbWFfZGVzY3JfdCksIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIWRtYS0+ZGVzY3J0YWIpIHsKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IGttYWxsb2MgZGVzY3J0YWIgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGRtYS0+ZGVzY3J0YWIsIDAsIGRtYS0+cmluZ3N6ICogc2l6ZW9mKHNlcmRtYV9kZXNjcl90KSk7CisgICAgICAgIGRtYS0+ZGVzY3J0YWJfZW5kID0gZG1hLT5kZXNjcnRhYiArIGRtYS0+cmluZ3N6OworCS8qIFhYWCBibG9kZHkgbWVzcywgdXNlIHByb3BlciBETUEgQVBJIGhlcmUgLi4uICAqLworCWRtYS0+ZGVzY3J0YWJfcGh5cyA9IENQSFlTQUREUigobG9uZylkbWEtPmRlc2NydGFiKTsKKyAgICAgICAgZG1hLT5kZXNjcl9hZGQgPSBkbWEtPmRlc2NyX3JlbSA9IGRtYS0+ZGVzY3J0YWI7CisKKyAgICAgICAgLyogRnJhbWUgYnVmZmVyIGFyZWEgKi8KKyAgICAgICAgZG1hLT5kbWFfYnVmID0ga21hbGxvYyhETUFfQlVGX1NJWkUsIEdGUF9LRVJORUwpOworICAgICAgICBpZiAoIWRtYS0+ZG1hX2J1ZikgeworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YToga21hbGxvYyBkbWFfYnVmIGZhaWxlZFxuIik7CisgICAgICAgICAgICAgICAga2ZyZWUoZG1hLT5kZXNjcnRhYik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1lbXNldChkbWEtPmRtYV9idWYsIDAsIERNQV9CVUZfU0laRSk7CisgICAgICAgIGRtYS0+ZG1hX2J1Zl9waHlzID0gQ1BIWVNBRERSKChsb25nKWRtYS0+ZG1hX2J1Zik7CisKKyAgICAgICAgLyogU2FtcGxlcyBidWZmZXIgYXJlYSAqLworICAgICAgICBkbWEtPnNidWZzeiA9IFNBTVBMRV9CVUZfU0laRTsKKyAgICAgICAgZG1hLT5zYW1wbGVfYnVmID0ga21hbGxvYyhkbWEtPnNidWZzeiwgR0ZQX0tFUk5FTCk7CisgICAgICAgIGlmICghZG1hLT5zYW1wbGVfYnVmKSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQyOTdhOiBrbWFsbG9jIHNhbXBsZV9idWYgZmFpbGVkXG4iKTsKKyAgICAgICAgICAgICAgICBrZnJlZShkbWEtPmRlc2NydGFiKTsKKyAgICAgICAgICAgICAgICBrZnJlZShkbWEtPmRtYV9idWYpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBkbWEtPnNiX3N3cHRyID0gZG1hLT5zYl9od3B0ciA9IGRtYS0+c2FtcGxlX2J1ZjsKKyAgICAgICAgZG1hLT5zYl9lbmQgPSAodTE2ICopKCh2b2lkICopZG1hLT5zYW1wbGVfYnVmICsgZG1hLT5zYnVmc3opOworICAgICAgICBkbWEtPmZyYWdzaXplID0gZG1hLT5zYnVmc3ogPj4gMTsKKworICAgICAgICBDU19EQkdPVVQoQ1NfSU5JVCwgNCwgCisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IGRlc2NydGFiIC0gJTA4eCBkbWFfYnVmIC0gJXggc2FtcGxlX2J1ZiAtICV4XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpZG1hLT5kZXNjcnRhYiwgKGludClkbWEtPmRtYV9idWYsIAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpZG1hLT5zYW1wbGVfYnVmKSk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG1hX2luaXQoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpCit7CisgICAgICAgIGludCBpOworCisgICAgICAgIENTX0RCR09VVChDU19JTklULCAyLCAKKyAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IFNldHRpbmcgdXAgRE1BXG4iKSk7CisKKyAgICAgICAgaWYgKGluaXRfc2VyZG1hKCZzLT5kbWFfYWRjKSB8fAorICAgICAgICAgICAgaW5pdF9zZXJkbWEoJnMtPmRtYV9kYWMpKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICBpZiAoX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0NPVU5UX1JYKSl8fAorICAgICAgICAgICAgX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0NPVU5UX1RYKSkpIHsKKyAgICAgICAgICAgICAgICBwYW5pYygiRE1BIHN0YXRlIGNvcnJ1cHRlZD8hIik7CisgICAgICAgIH0KKworICAgICAgICAvKiBJbml0aWFsaXplIG5vdyAtIHRoZSBkZXNjci9idWZmZXIgcGFpcmluZ3Mgd2lsbCBuZXZlcgorICAgICAgICAgICBjaGFuZ2UuLi4gKi8KKyAgICAgICAgZm9yIChpPTA7IGk8RE1BX0RFU0NSOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmRlc2NydGFiW2ldLmRlc2NyX2EgPSBNX0RNQV9TRVJSWF9TT1AgfCBWX0RNQV9EU0NSQV9BX1NJWkUoMSkgfCAKKyAgICAgICAgICAgICAgICAgICAgICAgIChzLT5kbWFfZGFjLmRtYV9idWZfcGh5cyArIGkqRlJBTUVfQllURVMpOworICAgICAgICAgICAgICAgIHMtPmRtYV9kYWMuZGVzY3J0YWJbaV0uZGVzY3JfYiA9IFZfRE1BX0RTQ1JCX1BLVF9TSVpFKEZSQU1FX0JZVEVTKTsKKyAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLmRlc2NydGFiW2ldLmRlc2NyX2EgPSBWX0RNQV9EU0NSQV9BX1NJWkUoMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgKHMtPmRtYV9hZGMuZG1hX2J1Zl9waHlzICsgaSpGUkFNRV9CWVRFUyk7CisgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5kZXNjcnRhYltpXS5kZXNjcl9iID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIF9fcmF3X3dyaXRlcSgoTV9ETUFfRU9QX0lOVF9FTiB8IFZfRE1BX0lOVF9QS1RDTlQoRE1BX0lOVF9DTlQpIHwKKyAgICAgICAgICAgICAgIFZfRE1BX1JJTkdTWihETUFfREVTQ1IpIHwgTV9ETUFfVERYX0VOKSwKKyAgICAgICAgICAgICAgU1NfQ1NSKFJfU0VSX0RNQV9DT05GSUcwX1JYKSk7CisgICAgICAgIF9fcmF3X3dyaXRlcShNX0RNQV9MMkNBLCBTU19DU1IoUl9TRVJfRE1BX0NPTkZJRzFfUlgpKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKHMtPmRtYV9hZGMuZGVzY3J0YWJfcGh5cywgU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0JBU0VfUlgpKTsKKworICAgICAgICBfX3Jhd193cml0ZXEoVl9ETUFfUklOR1NaKERNQV9ERVNDUiksIFNTX0NTUihSX1NFUl9ETUFfQ09ORklHMF9UWCkpOworICAgICAgICBfX3Jhd193cml0ZXEoTV9ETUFfTDJDQSB8IE1fRE1BX05PX0RTQ1JfVVBEVCwgU1NfQ1NSKFJfU0VSX0RNQV9DT05GSUcxX1RYKSk7CisgICAgICAgIF9fcmF3X3dyaXRlcShzLT5kbWFfZGFjLmRlc2NydGFiX3BoeXMsIFNTX0NTUihSX1NFUl9ETUFfRFNDUl9CQVNFX1RYKSk7CisKKyAgICAgICAgLyogUHJlcCB0aGUgcmVjZWl2ZSBETUEgZGVzY3JpcHRvciByaW5nICovCisgICAgICAgIF9fcmF3X3dyaXRlcShETUFfREVTQ1IsIFNTX0NTUihSX1NFUl9ETUFfRFNDUl9DT1VOVF9SWCkpOworCisgICAgICAgIF9fcmF3X3dyaXRlcShNX1NZTkNTRVJfRE1BX1JYX0VOIHwgTV9TWU5DU0VSX0RNQV9UWF9FTiwgU1NfQ1NSKFJfU0VSX0RNQV9FTkFCTEUpKTsKKworICAgICAgICBfX3Jhd193cml0ZXEoKE1fU1lOQ1NFUl9SWF9TWU5DX0VSUiB8IE1fU1lOQ1NFUl9SWF9PVkVSUlVOIHwgTV9TWU5DU0VSX1JYX0VPUF9DT1VOVCksCisgICAgICAgICAgICAgIFNTX0NTUihSX1NFUl9JTlRfTUFTSykpOworCisgICAgICAgIC8qIEVuYWJsZSB0aGUgcngvdHg7IGxldCB0aGUgY29kZWMgd2FybSB1cCB0byB0aGUgc3luYyBhbmQKKyAgICAgICAgICAgc3RhcnQgc2VuZGluZyBnb29kIGZyYW1lcyBiZWZvcmUgdGhlIHJlY2VpdmUgRklGTyBpcworICAgICAgICAgICBlbmFibGVkICovCisgICAgICAgIF9fcmF3X3dyaXRlcShNX1NZTkNTRVJfQ01EX1RYX0VOLCBTU19DU1IoUl9TRVJfQ01EKSk7CisgICAgICAgIHVkZWxheSgxMDAwKTsKKyAgICAgICAgX19yYXdfd3JpdGVxKE1fU1lOQ1NFUl9DTURfUlhfRU4gfCBNX1NZTkNTRVJfQ01EX1RYX0VOLCBTU19DU1IoUl9TRVJfQ01EKSk7CisKKyAgICAgICAgLyogWFhYS1cgaXMgdGhpcyBtYWdpYz8gKHRoZSAiMSIgcGFydCkgKi8KKyAgICAgICAgd2hpbGUgKChfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfU1RBVFVTKSkgJiAweGYxKSAhPSAxKQorICAgICAgICAgICAgICAgIDsKKworICAgICAgICBDU19EQkdPVVQoQ1NfSU5JVCwgNCwgCisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBzdGF0dXM6ICUwOHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGludCkoX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX1NUQVRVUykpICYgMHhmZmZmZmZmZikpKTsKKworICAgICAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXJkbWFfcmVnX2FjY2VzcyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcywgdTY0IGRhdGEpCit7CisgICAgICAgIHNlcmRtYV90ICpkID0gJnMtPmRtYV9kYWM7CisgICAgICAgIHU2NCAqZGF0YV9wOworICAgICAgICB1bnNpZ25lZCBzd3B0cjsKKyAgICAgICAgaW50IGZsYWdzOworICAgICAgICBzZXJkbWFfZGVzY3JfdCAqZGVzY3I7CisKKyAgICAgICAgaWYgKHMtPnJlZ19yZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQyOTdhOiBhdHRlbXB0IHRvIGlzc3VlIG11bHRpcGxlIHJlZ19hY2Nlc3NcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzLT5lbmEgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgICAgIC8qIFNpbmNlIGEgd3JpdGVyIGhhcyB0aGUgRFNQIG9wZW4sIHdlIGhhdmUgdG8gbXV4IHRoZQorICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgaW4gKi8KKyAgICAgICAgICAgICAgICBzLT5yZWdfcmVxdWVzdCA9IGRhdGE7CisgICAgICAgICAgICAgICAgaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcy0+ZG1hX2RhYy5yZWdfd2FpdCk7CisgICAgICAgICAgICAgICAgLyogWFhYS1cgaG93IGNhbiBJIGRlYWwgd2l0aCB0aGUgc3RhcnZhdGlvbiBjYXNlIHdoZXJlCisgICAgICAgICAgICAgICAgICAgdGhlIG9wZW5lciBpc24ndCB3cml0aW5nPyAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qIEJlIHNhZmUgd2hlbiBjaGFuZ2luZyByaW5nIHBvaW50ZXJzICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgICAgICAgICAgaWYgKGQtPmh3cHRyICE9IGQtPnN3cHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IHJlZyBhY2Nlc3MgZm91bmQgYm9va2tlZXBpbmcgZXJyb3IgKGh3L3N3ID0gJWQvJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+aHdwdHIsIGQtPnN3cHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dwdHIgPSBkLT5zd3B0cjsKKyAgICAgICAgICAgICAgICBkLT5od3B0ciA9IGQtPnN3cHRyID0gKGQtPnN3cHRyICsgMSkgJSBkLT5yaW5nc3o7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKworICAgICAgICAgICAgICAgIGRlc2NyID0gJmQtPmRlc2NydGFiW3N3cHRyXTsKKyAgICAgICAgICAgICAgICBkYXRhX3AgPSAmZC0+ZG1hX2J1Zltzd3B0ciAqIDRdOworCQkqZGF0YV9wID0gY3B1X3RvX2JlNjQoZGF0YSk7CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVxKDEsIFNTX0NTUihSX1NFUl9ETUFfRFNDUl9DT1VOVF9UWCkpOworICAgICAgICAgICAgICAgIENTX0RCR09VVChDU19ERVNDUiwgNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogYWRkX3R4ICAlcCAoJXggLT4gJXgpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wLCBzd3B0ciwgZC0+aHdwdHIpKTsKKyAgICAgICAgfQorCisgICAgICAgIENTX0RCR09VVChDU19GVU5DVElPTiwgNiwKKyAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHNlcmRtYV9yZWdfYWNjZXNzKCktXG4iKSk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gMDsKK30KKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAiY3M0Mjk3YV9yZWFkX2FjOTciIC0tIFJlYWRzIGFuIEFDOTcgcmVnaXN0ZXIKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludCBjczQyOTdhX3JlYWRfYWM5NyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcywgdTMyIG9mZnNldCwKKwkJCSAgICB1MzIgKiB2YWx1ZSkKK3sKKyAgICAgICAgQ1NfREJHT1VUKENTX0FDOTcsIDEsCisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiByZWFkIHJlZyAlMnhcbiIsIG9mZnNldCkpOworICAgICAgICBpZiAoc2VyZG1hX3JlZ19hY2Nlc3MocywgKDB4Q0xMIDw8IDYwKSB8ICgxTEwgPDwgNDcpIHwgKCh1NjQpKG9mZnNldCAmIDB4N0YpIDw8IDQwKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGludGVycnVwdGlibGVfc2xlZXBfb24oJnMtPmRtYV9hZGMucmVnX3dhaXQpOworICAgICAgICAqdmFsdWUgPSBzLT5yZWFkX3ZhbHVlOworICAgICAgICBDU19EQkdPVVQoQ1NfQUM5NywgMiwKKyAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHJkciByZWcgJXggLT4gJXhcbiIsIHMtPnJlYWRfcmVnLCBzLT5yZWFkX3ZhbHVlKSk7CisKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAiY3M0Mjk3YV93cml0ZV9hYzk3KCkiLS0gd3JpdGVzIGFuIEFDOTcgcmVnaXN0ZXIKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorc3RhdGljIGludCBjczQyOTdhX3dyaXRlX2FjOTcoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMsIHUzMiBvZmZzZXQsCisJCQkgICAgIHUzMiB2YWx1ZSkKK3sKKyAgICAgICAgQ1NfREJHT1VUKENTX0FDOTcsIDEsCisgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiB3cml0ZSByZWcgJTJ4IC0+ICUwNHhcbiIsIG9mZnNldCwgdmFsdWUpKTsKKyAgICAgICAgcmV0dXJuIChzZXJkbWFfcmVnX2FjY2VzcyhzLCAoMHhFTEwgPDwgNjApIHwgKCh1NjQpKG9mZnNldCAmIDB4N0YpIDw8IDQwKSB8ICgodmFsdWUgJiAweGZmZmYpIDw8IDEyKSkpOworfQorCitzdGF0aWMgdm9pZCBzdG9wX2RhYyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUsIDMsIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHN0b3BfZGFjKCk6XG4iKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlzLT5lbmEgJj0gfkZNT0RFX1dSSVRFOworI2lmIDAKKyAgICAgICAgLyogWFhYS1cgd2hhdCBkbyBJIHJlYWxseSB3YW50IGhlcmU/ICBNeSB0aGVvcnkgZm9yIG5vdyBpcworICAgICAgICAgICB0aGF0IEkganVzdCBmbGlwIHRoZSAiZW5hIiBiaXQsIGFuZCB0aGUgaW50ZXJydXB0IGhhbmRsZXIKKyAgICAgICAgICAgd2lsbCBzdG9wIHByb2Nlc3NpbmcgdGhlIHhtaXQgY2hhbm5lbCAqLworICAgICAgICBfX3Jhd193cml0ZXEoKHMtPmVuYSAmIEZNT0RFX1JFQUQpID8gTV9TWU5DU0VSX0RNQV9SWF9FTiA6IDAsCisgICAgICAgICAgICAgIFNTX0NTUihSX1NFUl9ETUFfRU5BQkxFKSk7CisjZW5kaWYKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKK30KKworCitzdGF0aWMgdm9pZCBzdGFydF9kYWMoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogc3RhcnRfZGFjKCkrXG4iKSk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoIShzLT5lbmEgJiBGTU9ERV9XUklURSkgJiYgKHMtPmRtYV9kYWMubWFwcGVkIHx8CisJCQkJCShzLT5kbWFfZGFjLmNvdW50ID4gMAorCSAgICAJCQkJJiYgcy0+ZG1hX2RhYy5yZWFkeSkpKSB7CisJCXMtPmVuYSB8PSBGTU9ERV9XUklURTsKKyAgICAgICAgICAgICAgICAvKiBYWFhLVyB3aGF0IGRvIEkgcmVhbGx5IHdhbnQgaGVyZT8gIE15IHRoZW9yeSBmb3IKKyAgICAgICAgICAgICAgICAgICBub3cgaXMgdGhhdCBJIGp1c3QgZmxpcCB0aGUgImVuYSIgYml0LCBhbmQgdGhlCisgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0IGhhbmRsZXIgd2lsbCBzdGFydCBwcm9jZXNzaW5nIHRoZSB4bWl0CisgICAgICAgICAgICAgICAgICAgY2hhbm5lbCAqLworCisJCUNTX0RCR09VVChDU19XQVZFX1dSSVRFIHwgQ1NfUEFSTVMsIDgsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyOTdhOiBzdGFydF9kYWMoKTogc3RhcnQgZG1hXG4iKSk7CisKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBzdGFydF9kYWMoKS1cbiIpKTsKK30KKworCitzdGF0aWMgdm9pZCBzdG9wX2FkYyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAzLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHN0b3BfYWRjKCkrXG4iKSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCXMtPmVuYSAmPSB+Rk1PREVfUkVBRDsKKworCWlmIChzLT5jb252ZXJzaW9uID09IDEpIHsKKwkJcy0+Y29udmVyc2lvbiA9IDA7CisJCXMtPnByb3BfYWRjLmZtdCA9IHMtPnByb3BfYWRjLmZtdF9vcmlnaW5hbDsKKwl9CisgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gcmVhbGx5LCBJIG5lZWQgdG8ga2VlcCB0aGUgRE1BIGdvaW5nCisgICAgICAgICAgIFhYWEtXIHdoZW4gZG8gSSBnZXQgaGVyZSwgYW5kIGlzIHRoZXJlIG1vcmUgSSBzaG91bGQgZG8/ICovCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCUNTX0RCR09VVChDU19GVU5DVElPTiwgMywKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBzdG9wX2FkYygpLVxuIikpOworfQorCisKK3N0YXRpYyB2b2lkIHN0YXJ0X2FkYyhzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OLCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHN0YXJ0X2FkYygpK1xuIikpOworCisJaWYgKCEocy0+ZW5hICYgRk1PREVfUkVBRCkgJiYKKwkgICAgKHMtPmRtYV9hZGMubWFwcGVkIHx8IHMtPmRtYV9hZGMuY291bnQgPD0KKwkgICAgIChzaWduZWQpIChzLT5kbWFfYWRjLnNidWZzeiAtIDIgKiBzLT5kbWFfYWRjLmZyYWdzaXplKSkKKwkgICAgJiYgcy0+ZG1hX2FkYy5yZWFkeSkgeworCQlpZiAocy0+cHJvcF9hZGMuZm10ICYgQUZNVF9TOCB8fCBzLT5wcm9wX2FkYy5mbXQgJiBBRk1UX1U4KSB7CisJCQkvLyAKKwkJCS8vIG5vdyBvbmx5IHVzZSAxNiBiaXQgY2FwdHVyZSwgZHVlIHRvIHRydW5jYXRpb24gaXNzdWUKKwkJCS8vIGluIHRoZSBjaGlwLCBub3RpY2FibGUgZGlzdG9ydGlvbiBvY2N1cnMuCisJCQkvLyBhbGxvY2F0ZSBidWZmZXIgYW5kIHRoZW4gY29udmVydCBmcm9tIDE2IGJpdCB0byAKKwkJCS8vIDggYml0IGZvciB0aGUgdXNlciBidWZmZXIuCisJCQkvLworCQkJcy0+cHJvcF9hZGMuZm10X29yaWdpbmFsID0gcy0+cHJvcF9hZGMuZm10OworCQkJaWYgKHMtPnByb3BfYWRjLmZtdCAmIEFGTVRfUzgpIHsKKwkJCQlzLT5wcm9wX2FkYy5mbXQgJj0gfkFGTVRfUzg7CisJCQkJcy0+cHJvcF9hZGMuZm10IHw9IEFGTVRfUzE2X0xFOworCQkJfQorCQkJaWYgKHMtPnByb3BfYWRjLmZtdCAmIEFGTVRfVTgpIHsKKwkJCQlzLT5wcm9wX2FkYy5mbXQgJj0gfkFGTVRfVTg7CisJCQkJcy0+cHJvcF9hZGMuZm10IHw9IEFGTVRfVTE2X0xFOworCQkJfQorCQkJLy8KKwkJCS8vIHByb2dfZG1hYnVmX2FkYyBwZXJmb3JtcyBhIHN0b3BfYWRjKCkgYnV0IHRoYXQgaXMKKwkJCS8vIG9rIHNpbmNlIHdlIHJlYWxseSBoYXZlbid0IHN0YXJ0ZWQgdGhlIERNQSB5ZXQuCisJCQkvLworCQkJcHJvZ19jb2RlYyhzLCBDU19UWVBFX0FEQyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2dfZG1hYnVmX2FkYyhzKTsKKwkJCXMtPmNvbnZlcnNpb24gPSAxOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCXMtPmVuYSB8PSBGTU9ERV9SRUFEOworICAgICAgICAgICAgICAgIC8qIE5vdGhpbmcgdG8gZG8gcmVhbGx5LCBJIGFtIHByb2JhYmx5IGFscmVhZHkKKyAgICAgICAgICAgICAgICAgICBETUFpbmcuLi4gIFhYWEtXIHdoZW4gZG8gSSBnZXQgaGVyZSwgYW5kIGlzIHRoZXJlCisgICAgICAgICAgICAgICAgICAgbW9yZSBJIHNob3VsZCBkbz8gKi8KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCisJCUNTX0RCR09VVChDU19QQVJNUywgNiwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyOTdhOiBzdGFydF9hZGMoKTogc3RhcnQgYWRjXG4iKSk7CisJfQorCUNTX0RCR09VVChDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBzdGFydF9hZGMoKS1cbiIpKTsKKworfQorCisKKy8vIGNhbGwgd2l0aCBzcGlubG9jayBoZWxkISAKK3N0YXRpYyB2b2lkIGNzNDI5N2FfdXBkYXRlX3B0cihzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcywgaW50IGludGZsYWcpCit7CisJaW50IGdvb2RfZGlmZiwgZGlmZiwgZGlmZjI7CisgICAgICAgIHU2NCAqZGF0YV9wLCBkYXRhOworICAgICAgICB1MzIgKnNfcHRyOworCXVuc2lnbmVkIGh3cHRyOworICAgICAgICB1MzIgc3RhdHVzOworICAgICAgICBzZXJkbWFfdCAqZDsKKyAgICAgICAgc2VyZG1hX2Rlc2NyX3QgKmRlc2NyOworCisJLy8gdXBkYXRlIEFEQyBwb2ludGVyIAorICAgICAgICBzdGF0dXMgPSBpbnRmbGFnID8gX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX1NUQVRVUykpIDogMDsKKworCWlmICgocy0+ZW5hICYgRk1PREVfUkVBRCkgfHwgKHN0YXR1cyAmIChNX1NZTkNTRVJfUlhfRU9QX0NPVU5UKSkpIHsKKyAgICAgICAgICAgICAgICBkID0gJnMtPmRtYV9hZGM7CisgICAgICAgICAgICAgICAgaHdwdHIgPSAodW5zaWduZWQpICgoKF9fcmF3X3JlYWRxKFNTX0NTUihSX1NFUl9ETUFfQ1VSX0RTQ1JfQUREUl9SWCkpICYgTV9ETUFfQ1VSRFNDUl9BRERSKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+ZGVzY3J0YWJfcGh5cykgLyBzaXplb2Yoc2VyZG1hX2Rlc2NyX3QpKTsKKworICAgICAgICAgICAgICAgIGlmIChzLT5lbmEgJiBGTU9ERV9SRUFEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDIsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHVwZF9yY3Ygc3ctPmh3LT5odyAleC8leC8leCAoaW50LSVkKW4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5zd3B0ciwgZC0+aHdwdHIsIGh3cHRyLCBpbnRmbGFnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgRE1BIGJ1ZmZlcnMgYXZhaWxhYmxlIGZvciBzb2Z0d2FyZTogKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYyID0gZGlmZiA9IChkLT5yaW5nc3ogKyBod3B0ciAtIGQtPmh3cHRyKSAlIGQtPnJpbmdzejsKKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPmh3cHRyID0gaHdwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBnb29kX2RpZmYgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc19wdHIgPSAodTMyICopJihkLT5kbWFfYnVmW2QtPnN3cHRyKjRdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyID0gJmQtPmRlc2NydGFiW2QtPnN3cHRyXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkaWZmMi0tKSB7CisJCQkJdTY0IGRhdGEgPSBiZTY0X3RvX2NwdSgqKHU2NCAqKXNfcHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdTY0IGRlc2NyX2E7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUxNiBsZWZ0LCByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JfYSA9IGRlc2NyLT5kZXNjcl9hOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZGVzY3JfYSAmPSB+TV9ETUFfU0VSUlhfU09QOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRlc2NyX2EgJiBNX0RNQV9EU0NSQV9BX0FERFIpICE9IENQSFlTQUREUigobG9uZylzX3B0cikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IFJYIEJhZCBhZGRyZXNzIChyZWFkKVxuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoZGF0YSAmIDB4OTgwMDAwMDAwMDAwMDAwMCkgIT0gMHg5ODAwMDAwMDAwMDAwMDAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEoZGVzY3JfYSAmIE1fRE1BX1NFUlJYX1NPUCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR19ETUFfRFNDUkJfUEtUX1NJWkUoZGVzY3ItPmRlc2NyX2IpICE9IEZSQU1FX0JZVEVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXRzLnJ4X2JhZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJjczQyOTdhOiBSWCBCYWQgYXR0cmlidXRlcyAocmVhZClcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXRzLnJ4X2dvb2QrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChkYXRhID4+IDYxKSA9PSA3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVhZF92YWx1ZSA9IChkYXRhID4+IDEyKSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5yZWFkX3JlZyA9IChkYXRhID4+IDQwKSAmIDB4N2Y7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FrZV91cCgmZC0+cmVnX3dhaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5jb3VudCAmJiAoZC0+c2JfaHdwdHIgPT0gZC0+c2Jfc3dwdHIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhdHMucnhfb3ZlcmZsb3crKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9ERUJVRyAiY3M0Mjk3YTogUlggb3ZlcmZsb3dcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2RfZGlmZisrOworCQkJCWxlZnQgPSAoKGJlMzJfdG9fY3B1KHNfcHRyWzFdKSAmIDB4ZmYpIDw8IDgpIHwKKwkJCQkgICAgICAgKChiZTMyX3RvX2NwdShzX3B0clsyXSkgPj4gMjQpICYgMHhmZik7CisJCQkJcmlnaHQgPSAoYmUzMl90b19jcHUoc19wdHJbMl0pID4+IDQpICYgMHhmZmZmOworCQkJCSpkLT5zYl9od3B0cisrID0gY3B1X3RvX2JlMTYobGVmdCk7CisJCQkJKmQtPnNiX2h3cHRyKysgPSBjcHVfdG9fYmUxNihyaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5zYl9od3B0ciA9PSBkLT5zYl9lbmQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+c2JfaHdwdHIgPSBkLT5zYW1wbGVfYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3IgPT0gZC0+ZGVzY3J0YWJfZW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3IgPSBkLT5kZXNjcnRhYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzX3B0ciA9ICh1MzIgKilzLT5kbWFfYWRjLmRtYV9idWY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc19wdHIgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZC0+dG90YWxfYnl0ZXMgKz0gZ29vZF9kaWZmICogRlJBTUVfU0FNUExFX0JZVEVTOworICAgICAgICAgICAgICAgICAgICAgICAgZC0+Y291bnQgKz0gZ29vZF9kaWZmICogRlJBTUVfU0FNUExFX0JZVEVTOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGQtPmNvdW50ID4gZC0+c2J1ZnN6KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YTogYm9ndXMgcmVjZWl2ZSBvdmVyZmxvdyEhXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPnN3cHRyID0gKGQtPnN3cHRyICsgZGlmZikgJSBkLT5yaW5nc3o7CisgICAgICAgICAgICAgICAgICAgICAgICBfX3Jhd193cml0ZXEoZGlmZiwgU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0NPVU5UX1JYKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZC0+bWFwcGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5jb3VudCA+PSAoc2lnbmVkKSBkLT5mcmFnc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWtlX3VwKCZkLT53YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkLT5jb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3M0Mjk3YTogdXBkYXRlIGNvdW50IC0+ICVkXG4iLCBkLT5jb3VudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdha2VfdXAoJmQtPndhaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlY2VpdmUgaXMgZ29pbmcgZXZlbiBpZiBubyBvbmUgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmluZyAoZm9yIHJlZ2lzdGVyIGFjY2Vzc2VzIGFuZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgRklGTyBvdmVycnVuKSAqLworICAgICAgICAgICAgICAgICAgICAgICAgZGlmZjIgPSBkaWZmID0gKGh3cHRyICsgZC0+cmluZ3N6IC0gZC0+aHdwdHIpICUgZC0+cmluZ3N6OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkaWZmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YTogUlggZnVsbCBvciBlbXB0eT9cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjciA9ICZkLT5kZXNjcnRhYltkLT5zd3B0cl07CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3AgPSAmZC0+ZG1hX2J1ZltkLT5zd3B0cio0XTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgdGhpcyB0byBoYXBwZW4gYXQgbGVhc3Qgb25jZTsgSSBnb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgYmVjYXVzZSBvZiBhbiBpbnRlcnJ1cHQsIHNvIHRoZXJlIG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGEgYnVmZmVyIHRvIHByb2Nlc3MuICovCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisJCQkJZGF0YSA9IGJlNjRfdG9fY3B1KCpkYXRhX3ApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRlc2NyLT5kZXNjcl9hICYgTV9ETUFfRFNDUkFfQV9BRERSKSAhPSBDUEhZU0FERFIoKGxvbmcpZGF0YV9wKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YTogUlggQmFkIGFkZHJlc3MgJWQgKCVsbHggJWx4KVxuIiwgZC0+c3dwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKGRlc2NyLT5kZXNjcl9hICYgTV9ETUFfRFNDUkFfQV9BRERSKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpQ1BIWVNBRERSKChsb25nKWRhdGFfcCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGRhdGEgJiAoMUxMIDw8IDYzKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZGVzY3ItPmRlc2NyX2EgJiBNX0RNQV9TRVJSWF9TT1ApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoR19ETUFfRFNDUkJfUEtUX1NJWkUoZGVzY3ItPmRlc2NyX2IpICE9IEZSQU1FX0JZVEVTKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnN0YXRzLnJ4X2JhZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJjczQyOTdhOiBSWCBCYWQgYXR0cmlidXRlc1xuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhdHMucnhfZ29vZCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZGF0YSA+PiA2MSkgPT0gNykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVhZF92YWx1ZSA9IChkYXRhID4+IDEyKSAmIDB4ZmZmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPnJlYWRfcmVnID0gKGRhdGEgPj4gNDApICYgMHg3ZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdha2VfdXAoJmQtPnJlZ193YWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3ItPmRlc2NyX2EgJj0gfk1fRE1BX1NFUlJYX1NPUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3IrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+c3dwdHIrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjciA9PSBkLT5kZXNjcnRhYl9lbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjciA9IGQtPmRlc2NydGFiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPnN3cHRyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3AgPSBkLT5kbWFfYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlcSgxLCBTU19DU1IoUl9TRVJfRE1BX0RTQ1JfQ09VTlRfUlgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tZGlmZik7CisgICAgICAgICAgICAgICAgICAgICAgICBkLT5od3B0ciA9IGh3cHRyOworCisgICAgICAgICAgICAgICAgICAgICAgICBDU19EQkdPVVQoQ1NfREVTQ1IsIDYsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IGh3L3N3ICV4LyV4XG4iLCBkLT5od3B0ciwgZC0+c3dwdHIpKTsKKyAgICAgICAgICAgICAgICB9CisKKwkJQ1NfREJHT1VUKENTX1BBUk1TLCA4LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0Mjk3YTogY3M0Mjk3YV91cGRhdGVfcHRyKCk6IHM9MHglLjh4IGh3cHRyPSVkIHRvdGFsX2J5dGVzPSVkIGNvdW50PSVkIFxuIiwKKwkJCQkodW5zaWduZWQpcywgZC0+aHdwdHIsIAorCQkJCWQtPnRvdGFsX2J5dGVzLCBkLT5jb3VudCkpOworCX0KKworICAgICAgICAvKiBYWFhLVyB3b3JyeSBhYm91dCBzLT5yZWdfcmVxdWVzdCAtLSB0aGVyZSBpcyBhIHN0YXJ2YXRpb24KKyAgICAgICAgICAgY2FzZSBpZiBzLT5lbmEgaGFzIEZNT0RFX1dSSVRFIG9uLCBidXQgdGhlIGNsaWVudCBpc24ndAorICAgICAgICAgICBkb2luZyB3cml0ZXMgKi8KKworCS8vIHVwZGF0ZSBEQUMgcG9pbnRlciAKKwkvLworCS8vIGNoZWNrIGZvciBlbmQgb2YgYnVmZmVyLCBtZWFucyB0aGF0IHdlIGFyZSBnb2luZyB0byB3YWl0IGZvciBhbm90aGVyIGludGVycnVwdAorCS8vIHRvIGFsbG93IHNpbGVuY2UgdG8gZmlsbCB0aGUgZmlmb3Mgb24gdGhlIHBhcnQsIHRvIGtlZXAgcG9wcyBkb3duIHRvIGEgbWluaW11bS4KKwkvLworCWlmIChzLT5lbmEgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgICAgIHNlcmRtYV90ICpkID0gJnMtPmRtYV9kYWM7CisgICAgICAgICAgICAgICAgaHdwdHIgPSAodW5zaWduZWQpICgoKF9fcmF3X3JlYWRxKFNTX0NTUihSX1NFUl9ETUFfQ1VSX0RTQ1JfQUREUl9UWCkpICYgTV9ETUFfQ1VSRFNDUl9BRERSKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+ZGVzY3J0YWJfcGh5cykgLyBzaXplb2Yoc2VyZG1hX2Rlc2NyX3QpKTsKKyAgICAgICAgICAgICAgICBkaWZmID0gKGQtPnJpbmdzeiArIGh3cHRyIC0gZC0+aHdwdHIpICUgZC0+cmluZ3N6OworICAgICAgICAgICAgICAgIENTX0RCR09VVChDU19XQVZFX1dSSVRFLCA0LCBwcmludGsoS0VSTl9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3M0Mjk3YTogY3M0Mjk3YV91cGRhdGVfcHRyKCk6IGh3L2h3L3N3ICV4LyV4LyV4IGRpZmYgJWQgY291bnQgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLT5od3B0ciwgaHdwdHIsIGQtPnN3cHRyLCBkaWZmLCBkLT5jb3VudCkpOworICAgICAgICAgICAgICAgIGQtPmh3cHRyID0gaHdwdHI7CisgICAgICAgICAgICAgICAgLyogWFhYS1cgc3RlcmVvPyBjb252ZXJzaW9uPyBKdXN0IGFzc3VtZSAyIDE2LWJpdCBzYW1wbGVzIGZvciBub3cgKi8KKyAgICAgICAgICAgICAgICBkLT50b3RhbF9ieXRlcyArPSBkaWZmICogRlJBTUVfU0FNUExFX0JZVEVTOworCQlpZiAoZC0+bWFwcGVkKSB7CisJCQlkLT5jb3VudCArPSBkaWZmICogRlJBTUVfU0FNUExFX0JZVEVTOworCQkJaWYgKGQtPmNvdW50ID49IGQtPmZyYWdzaXplKSB7CisJCQkJZC0+d2FrZXVwID0gMTsKKwkJCQl3YWtlX3VwKCZkLT53YWl0KTsKKwkJCQlpZiAoZC0+Y291bnQgPiBkLT5zYnVmc3opCisJCQkJCWQtPmNvdW50ICY9IGQtPnNidWZzeiAtIDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkLT5jb3VudCAtPSBkaWZmICogRlJBTUVfU0FNUExFX0JZVEVTOworCQkJaWYgKGQtPmNvdW50IDw9IDApIHsKKwkJCQkvLworCQkJCS8vIGZpbGwgd2l0aCBzaWxlbmNlLCBhbmQgZG8gbm90IHNodXQgZG93biB0aGUgREFDLgorCQkJCS8vIENvbnRpbnVlIHRvIHBsYXkgc2lsZW5jZSB1bnRpbCB0aGUgX3JlbGVhc2UuCisJCQkJLy8KKwkJCQlDU19EQkdPVVQoQ1NfV0FWRV9XUklURSwgNiwgcHJpbnRrKEtFUk5fSU5GTworCQkJCQkiY3M0Mjk3YTogY3M0Mjk3YV91cGRhdGVfcHRyKCk6IG1lbXNldCAlZCBhdCAweCUuOHggZm9yICVkIHNpemUgXG4iLAorCQkJCQkJKHVuc2lnbmVkKShzLT5wcm9wX2RhYy5mbXQgJiAKKwkJCQkJCShBRk1UX1U4IHwgQUZNVF9VMTZfTEUpKSA/IDB4ODAgOiAwLCAKKwkJCQkJCSh1bnNpZ25lZClkLT5kbWFfYnVmLCAKKwkJCQkJCWQtPnJpbmdzeikpOworCQkJCW1lbXNldChkLT5kbWFfYnVmLCAwLCBkLT5yaW5nc3ogKiBGUkFNRV9CWVRFUyk7CisJCQkJaWYgKGQtPmNvdW50IDwgMCkgeworCQkJCQlkLT51bmRlcnJ1biA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+c3RhdHMudHhfdW5kZXJydW4rKzsKKwkJCQkJZC0+Y291bnQgPSAwOworCQkJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDksIHByaW50ayhLRVJOX0lORk8KKwkJCQkJICJjczQyOTdhOiBjczQyOTdhX3VwZGF0ZV9wdHIoKTogdW5kZXJydW5cbiIpKTsKKwkJCQl9CisJCQl9IGVsc2UgaWYgKGQtPmNvdW50IDw9CisJCQkJICAgKHNpZ25lZCkgZC0+ZnJhZ3NpemUKKwkJCQkgICAmJiAhZC0+ZW5kY2xlYXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFhLVyB3aGF0IGlzIHRoaXMgZm9yPyAqLworCQkJCWNsZWFyX2FkdmFuY2UoZC0+ZG1hX2J1ZiwKKwkJCQkJICAgICAgZC0+c2J1ZnN6LAorCQkJCQkgICAgICBkLT5zd3B0ciwKKwkJCQkJICAgICAgZC0+ZnJhZ3NpemUsCisJCQkJCSAgICAgIDApOworCQkJCWQtPmVuZGNsZWFyZWQgPSAxOworCQkJfQorCQkJaWYgKCAoZC0+Y291bnQgPD0gKHNpZ25lZCkgZC0+c2J1ZnN6LzIpIHx8IGludGZsYWcpCisJCQl7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX0RCR09VVChDU19XQVZFX1dSSVRFLCA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjczQyOTdhOiB1cGRhdGUgY291bnQgLT4gJWRcbiIsIGQtPmNvdW50KSk7CisJCQkJd2FrZV91cCgmZC0+d2FpdCk7CisJCQl9CisJCX0KKwkJQ1NfREJHT1VUKENTX1BBUk1TLCA4LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0Mjk3YTogY3M0Mjk3YV91cGRhdGVfcHRyKCk6IHM9MHglLjh4IGh3cHRyPSVkIHRvdGFsX2J5dGVzPSVkIGNvdW50PSVkIFxuIiwKKwkJCQkodW5zaWduZWQpIHMsIGQtPmh3cHRyLCAKKwkJCQlkLT50b3RhbF9ieXRlcywgZC0+Y291bnQpKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWl4ZXJfaW9jdGwoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMsIHVuc2lnbmVkIGludCBjbWQsCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwkvLyBJbmRleCB0byBtaXhlcl9zcmNbXSBpcyB2YWx1ZSBvZiBBQzk3IElucHV0IE11eCBTZWxlY3QgUmVnLgorCS8vIFZhbHVlIG9mIGFycmF5IG1lbWJlciBpcyByZWNvcmRpbmcgc291cmNlIERldmljZSBJRCBNYXNrLgorCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgbWl4ZXJfc3JjWzhdID0geworCQlTT1VORF9NQVNLX01JQywgU09VTkRfTUFTS19DRCwgMCwgU09VTkRfTUFTS19MSU5FMSwKKwkJU09VTkRfTUFTS19MSU5FLCBTT1VORF9NQVNLX1ZPTFVNRSwgMCwgMAorCX07CisKKwkvLyBJbmRleCBvZiBtaXh0YWJsZTFbXSBtZW1iZXIgaXMgRGV2aWNlIElEIAorCS8vIGFuZCBtdXN0IGJlIDw9IFNPVU5EX01JWEVSX05SREVWSUNFUy4KKwkvLyBWYWx1ZSBvZiBhcnJheSBtZW1iZXIgaXMgaW5kZXggaW50byBzLT5taXgudm9sW10KKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtaXh0YWJsZTFbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9IHsKKwkJW1NPVU5EX01JWEVSX1BDTV0gPSAxLAkvLyB2b2ljZSAKKwkJW1NPVU5EX01JWEVSX0xJTkUxXSA9IDIsCS8vIEFVWAorCQlbU09VTkRfTUlYRVJfQ0RdID0gMywJLy8gQ0QgCisJCVtTT1VORF9NSVhFUl9MSU5FXSA9IDQsCS8vIExpbmUgCisJCVtTT1VORF9NSVhFUl9TWU5USF0gPSA1LAkvLyBGTQorCQlbU09VTkRfTUlYRVJfTUlDXSA9IDYsCS8vIE1pYyAKKwkJW1NPVU5EX01JWEVSX1NQRUFLRVJdID0gNywJLy8gU3BlYWtlciAKKwkJW1NPVU5EX01JWEVSX1JFQ0xFVl0gPSA4LAkvLyBSZWNvcmRpbmcgbGV2ZWwgCisJCVtTT1VORF9NSVhFUl9WT0xVTUVdID0gOQkvLyBNYXN0ZXIgVm9sdW1lIAorCX07CisKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgbWl4cmVnW10gPSB7CisJCUFDOTdfUENNT1VUX1ZPTCwKKwkJQUM5N19BVVhfVk9MLAorCQlBQzk3X0NEX1ZPTCwKKwkJQUM5N19MSU5FSU5fVk9MCisJfTsKKwl1bnNpZ25lZCBjaGFyIGwsIHIsIHJsLCByciwgdmlkeDsKKwl1bnNpZ25lZCBjaGFyIGF0dGVudGJsWzExXSA9CisJICAgIHsgNjMsIDQyLCAyNiwgMTcsIDE0LCAxMSwgOCwgNiwgNCwgMiwgMCB9OworCXVuc2lnbmVkIHRlbXAxOworCWludCBpLCB2YWw7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04sIDQsIHByaW50ayhLRVJOX0lORk8KKwkJICJjczQyOTdhOiBtaXhlcl9pb2N0bCgpOiBzPTB4JS44eCBjbWQ9MHglLjh4XG4iLAorCQkJICh1bnNpZ25lZCkgcywgY21kKSk7CisjaWYgQ1NERUJVRworCWNzX3ByaW50aW9jdGwoY21kKTsKKyNlbmRpZgorI2lmIENTREVCVUdfSU5URVJGQUNFCisKKwlpZiAoKGNtZCA9PSBTT1VORF9NSVhFUl9DU19HRVREQkdNQVNLKSB8fAorCSAgICAoY21kID09IFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0spIHx8CisJICAgIChjbWQgPT0gU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUwpIHx8CisJICAgIChjbWQgPT0gU09VTkRfTUlYRVJfQ1NfU0VUREJHTEVWRUwpKQorCXsKKwkJc3dpdGNoIChjbWQpIHsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX0dFVERCR01BU0s6CisJCQlyZXR1cm4gcHV0X3VzZXIoY3NfZGVidWdtYXNrLAorCQkJCQkodW5zaWduZWQgbG9uZyAqKSBhcmcpOworCisJCWNhc2UgU09VTkRfTUlYRVJfQ1NfR0VUREJHTEVWRUw6CisJCQlyZXR1cm4gcHV0X3VzZXIoY3NfZGVidWdsZXZlbCwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgKikgYXJnKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0NTX1NFVERCR01BU0s6CisJCQlpZiAoZ2V0X3VzZXIodmFsLCAodW5zaWduZWQgbG9uZyAqKSBhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJY3NfZGVidWdtYXNrID0gdmFsOworCQkJcmV0dXJuIDA7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9DU19TRVREQkdMRVZFTDoKKwkJCWlmIChnZXRfdXNlcih2YWwsICh1bnNpZ25lZCBsb25nICopIGFyZykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQljc19kZWJ1Z2xldmVsID0gdmFsOworCQkJcmV0dXJuIDA7CisJCWRlZmF1bHQ6CisJCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0lORk8KKwkJCQkiY3M0Mjk3YTogbWl4ZXJfaW9jdGwoKTogRVJST1IgdW5rbm93biBkZWJ1ZyBjbWRcbiIpKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoY21kID09IFNPVU5EX01JWEVSX1BSSVZBVEUxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfUFJJVkFURTIpIHsKKwkJLy8gZW5hYmxlL2Rpc2FibGUvcXVlcnkgc3BhdGlhbGl6ZXIgCisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IC0xKSB7CisJCQl0ZW1wMSA9ICh2YWwgJiAweDNmKSA+PiAyOworCQkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsIEFDOTdfM0RfQ09OVFJPTCwgdGVtcDEpOworCQkJY3M0Mjk3YV9yZWFkX2FjOTcocywgQUM5N19HRU5FUkFMX1BVUlBPU0UsCisJCQkJCSAmdGVtcDEpOworCQkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsIEFDOTdfR0VORVJBTF9QVVJQT1NFLAorCQkJCQkgIHRlbXAxIHwgMHgyMDAwKTsKKwkJfQorCQljczQyOTdhX3JlYWRfYWM5NyhzLCBBQzk3XzNEX0NPTlRST0wsICZ0ZW1wMSk7CisJCXJldHVybiBwdXRfdXNlcigodGVtcDEgPDwgMikgfCAzLCAoaW50ICopIGFyZyk7CisJfQorCWlmIChjbWQgPT0gU09VTkRfTUlYRVJfSU5GTykgeworCQltaXhlcl9pbmZvIGluZm87CisJCW1lbXNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKwkJc3RybGNweShpbmZvLmlkLCAiQ1M0Mjk3YSIsIHNpemVvZihpbmZvLmlkKSk7CisJCXN0cmxjcHkoaW5mby5uYW1lLCAiQ3J5c3RhbCBDUzQyOTdhIiwgc2l6ZW9mKGluZm8ubmFtZSkpOworCQlpbmZvLm1vZGlmeV9jb3VudGVyID0gcy0+bWl4Lm1vZGNudDsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IFNPVU5EX09MRF9NSVhFUl9JTkZPKSB7CisJCV9vbGRfbWl4ZXJfaW5mbyBpbmZvOworCQltZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisJCXN0cmxjcHkoaW5mby5pZCwgIkNTNDI5N2EiLCBzaXplb2YoaW5mby5pZCkpOworCQlzdHJsY3B5KGluZm8ubmFtZSwgIkNyeXN0YWwgQ1M0Mjk3YSIsIHNpemVvZihpbmZvLm5hbWUpKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZpbmZvLCBzaXplb2YoaW5mbykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCX0KKwlpZiAoY21kID09IE9TU19HRVRWRVJTSU9OKQorCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgKGludCAqKSBhcmcpOworCisJaWYgKF9JT0NfVFlQRShjbWQpICE9ICdNJyB8fCBfU0lPQ19TSVpFKGNtZCkgIT0gc2l6ZW9mKGludCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gSWYgaW9jdGwgaGFzIG9ubHkgdGhlIFNJT0NfUkVBRCBiaXQoYml0IDMxKQorCS8vIG9uLCBwcm9jZXNzIHRoZSBvbmx5LXJlYWQgY29tbWFuZHMuIAorCWlmIChfU0lPQ19ESVIoY21kKSA9PSBfU0lPQ19SRUFEKSB7CisJCXN3aXRjaCAoX0lPQ19OUihjbWQpKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgkvLyBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggcmVjb3JkaW5nIHNvdXJjZSAKKwkJCWNzNDI5N2FfcmVhZF9hYzk3KHMsIEFDOTdfUkVDT1JEX1NFTEVDVCwKKwkJCQkJICZ0ZW1wMSk7CisJCQlyZXR1cm4gcHV0X3VzZXIobWl4ZXJfc3JjW3RlbXAxICYgN10sIChpbnQgKikgYXJnKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CS8vIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCBzdXBwb3J0ZWQgZGV2aWNlIAorCQkJcmV0dXJuIHB1dF91c2VyKFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKKwkJCQkJU09VTkRfTUFTS19WT0xVTUUgfCBTT1VORF9NQVNLX1JFQ0xFViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50ICopIGFyZyk7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgkvLyBBcmcgY29udGFpbnMgYSBiaXQgZm9yIGVhY2ggc3VwcG9ydGVkIHJlY29yZGluZyBzb3VyY2UgCisJCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfTUFTS19MSU5FIHwgU09VTkRfTUFTS19WT0xVTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCAqKSBhcmcpOworCisJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoJLy8gTWl4ZXIgY2hhbm5lbHMgc3VwcG9ydGluZyBzdGVyZW8gCisJCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAorCQkJCQlTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfUkVDTEVWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgKikgYXJnKTsKKworCQljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfQ0FQX0VYQ0xfSU5QVVQsIChpbnQgKikgYXJnKTsKKworCQlkZWZhdWx0OgorCQkJaSA9IF9JT0NfTlIoY21kKTsKKwkJCWlmIChpID49IFNPVU5EX01JWEVSX05SREVWSUNFUworCQkJICAgIHx8ICEodmlkeCA9IG1peHRhYmxlMVtpXSkpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+bWl4LnZvbFt2aWR4IC0gMV0sIChpbnQgKikgYXJnKTsKKwkJfQorCX0KKwkvLyBJZiBpb2N0bCBkb2Vzbid0IGhhdmUgYm90aCB0aGUgU0lPQ19SRUFEIGFuZCAKKwkvLyB0aGUgU0lPQ19XUklURSBiaXQgc2V0LCByZXR1cm4gaW52YWxpZC4KKwlpZiAoX1NJT0NfRElSKGNtZCkgIT0gKF9TSU9DX1JFQUQgfCBfU0lPQ19XUklURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJLy8gSW5jcmVtZW50IHRoZSBjb3VudCBvZiB2b2x1bWUgd3JpdGVzLgorCXMtPm1peC5tb2RjbnQrKzsKKworCS8vIElzb2xhdGUgdGhlIGNvbW1hbmQ7IGl0IG11c3QgYmUgYSB3cml0ZS4KKwlzd2l0Y2ggKF9JT0NfTlIoY21kKSkgeworCisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CS8vIEFyZyBjb250YWlucyBhIGJpdCBmb3IgZWFjaCByZWNvcmRpbmcgc291cmNlIAorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaSA9IGh3ZWlnaHQzMih2YWwpOwkvLyBpID0gIyBiaXRzIG9uIGluIHZhbC4KKwkJaWYgKGkgIT0gMSkJLy8gT25lICYgb25seSAxIGJpdCBtdXN0IGJlIG9uLgorCQkJcmV0dXJuIDA7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YobWl4ZXJfc3JjKSAvIHNpemVvZihpbnQpOyBpKyspIHsKKwkJCWlmICh2YWwgPT0gbWl4ZXJfc3JjW2ldKSB7CisJCQkJdGVtcDEgPSAoaSA8PCA4KSB8IGk7CisJCQkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsCisJCQkJCQkgIEFDOTdfUkVDT1JEX1NFTEVDVCwKKwkJCQkJCSAgdGVtcDEpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOwkvLyBNYXggc291bmRjYXJkLmggdm9sIGlzIDEwMC4KKwkJaWYgKGwgPCA2KSB7CisJCQlybCA9IDYzOworCQkJbCA9IDA7CisJCX0gZWxzZQorCQkJcmwgPSBhdHRlbnRibFsoMTAgKiBsKSAvIDEwMF07CS8vIENvbnZlcnQgMC0xMDAgdm9sIHRvIDYzLTAgYXR0ZW4uCisKKwkJciA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlpZiAociA+IDEwMCkKKwkJCXIgPSAxMDA7CS8vIE1heCByaWdodCB2b2x1bWUgaXMgMTAwLCB0b28KKwkJaWYgKHIgPCA2KSB7CisJCQlyciA9IDYzOworCQkJciA9IDA7CisJCX0gZWxzZQorCQkJcnIgPSBhdHRlbnRibFsoMTAgKiByKSAvIDEwMF07CS8vIENvbnZlcnQgdm9sdW1lIHRvIGF0dGVudWF0aW9uLgorCisJCWlmICgocmwgPiA2MCkgJiYgKHJyID4gNjApKQkvLyBJZiBib3RoIGwgJiByIGFyZSAnbG93JywgICAgICAgICAgCisJCQl0ZW1wMSA9IDB4ODAwMDsJLy8gIHR1cm4gb24gdGhlIG11dGUgYml0LgorCQllbHNlCisJCQl0ZW1wMSA9IDA7CisKKwkJdGVtcDEgfD0gKHJsIDw8IDgpIHwgcnI7CisKKwkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIHRlbXAxKTsKKwkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsIEFDOTdfUEhPTkVfVk9MLCB0ZW1wMSk7CisKKyNpZmRlZiBPU1NfRE9DVU1FTlRFRF9NSVhFUl9TRU1BTlRJQ1MKKwkJcy0+bWl4LnZvbFs4XSA9ICgodW5zaWduZWQgaW50KSByIDw8IDgpIHwgbDsKKyNlbHNlCisJCXMtPm1peC52b2xbOF0gPSB2YWw7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbOF0sIChpbnQgKikgYXJnKTsKKworCWNhc2UgU09VTkRfTUlYRVJfU1BFQUtFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCWlmIChsIDwgMykgeworCQkJcmwgPSAwOworCQkJbCA9IDA7CisJCX0gZWxzZSB7CisJCQlybCA9IChsICogMiAtIDUpIC8gMTM7CS8vIENvbnZlcnQgMC0xMDAgcmFuZ2UgdG8gMC0xNS4KKwkJCWwgPSAocmwgKiAxMyArIDUpIC8gMjsKKwkJfQorCisJCWlmIChybCA8IDMpIHsKKwkJCXRlbXAxID0gMHg4MDAwOworCQkJcmwgPSAwOworCQl9IGVsc2UKKwkJCXRlbXAxID0gMDsKKwkJcmwgPSAxNSAtIHJsOwkvLyBDb252ZXJ0IHZvbHVtZSB0byBhdHRlbnVhdGlvbi4KKwkJdGVtcDEgfD0gcmwgPDwgMTsKKwkJY3M0Mjk3YV93cml0ZV9hYzk3KHMsIEFDOTdfUENCRUVQX1ZPTCwgdGVtcDEpOworCisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCXMtPm1peC52b2xbNl0gPSBsIDw8IDg7CisjZWxzZQorCQlzLT5taXgudm9sWzZdID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzZdLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCXIgPSAodmFsID4+IDgpICYgMHhmZjsKKwkJaWYgKHIgPiAxMDApCisJCQlyID0gMTAwOworCQlybCA9IChsICogMiAtIDUpIC8gMTM7CS8vIENvbnZlcnQgMC0xMDAgc2NhbGUgdG8gMC0xNS4KKwkJcnIgPSAociAqIDIgLSA1KSAvIDEzOworCQlpZiAocmwgPCAzICYmIHJyIDwgMykKKwkJCXRlbXAxID0gMHg4MDAwOworCQllbHNlCisJCQl0ZW1wMSA9IDA7CisKKwkJdGVtcDEgPSB0ZW1wMSB8IChybCA8PCA4KSB8IHJyOworCQljczQyOTdhX3dyaXRlX2FjOTcocywgQUM5N19SRUNPUkRfR0FJTiwgdGVtcDEpOworCisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCXMtPm1peC52b2xbN10gPSAoKHVuc2lnbmVkIGludCkgciA8PCA4KSB8IGw7CisjZWxzZQorCQlzLT5taXgudm9sWzddID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzddLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNPVU5EX01JWEVSX01JQzoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWwgPSB2YWwgJiAweGZmOworCQlpZiAobCA+IDEwMCkKKwkJCWwgPSAxMDA7CisJCWlmIChsIDwgMSkgeworCQkJbCA9IDA7CisJCQlybCA9IDA7CisJCX0gZWxzZSB7CisJCQlybCA9ICgodW5zaWduZWQpIGwgKiA1IC0gNCkgLyAxNjsJLy8gQ29udmVydCAwLTEwMCByYW5nZSB0byAwLTMxLgorCQkJbCA9IChybCAqIDE2ICsgNCkgLyA1OworCQl9CisJCWNzNDI5N2FfcmVhZF9hYzk3KHMsIEFDOTdfTUlDX1ZPTCwgJnRlbXAxKTsKKwkJdGVtcDEgJj0gMHg0MDsJLy8gSXNvbGF0ZSAyMGRiIGdhaW4gYml0LgorCQlpZiAocmwgPCAzKSB7CisJCQl0ZW1wMSB8PSAweDgwMDA7CisJCQlybCA9IDA7CisJCX0KKwkJcmwgPSAzMSAtIHJsOwkvLyBDb252ZXJ0IHZvbHVtZSB0byBhdHRlbnVhdGlvbi4KKwkJdGVtcDEgfD0gcmw7CisJCWNzNDI5N2Ffd3JpdGVfYWM5NyhzLCBBQzk3X01JQ19WT0wsIHRlbXAxKTsKKworI2lmZGVmIE9TU19ET0NVTUVOVEVEX01JWEVSX1NFTUFOVElDUworCQlzLT5taXgudm9sWzVdID0gdmFsIDw8IDg7CisjZWxzZQorCQlzLT5taXgudm9sWzVdID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzVdLCAoaW50ICopIGFyZyk7CisKKworCWNhc2UgU09VTkRfTUlYRVJfU1lOVEg6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlsID0gdmFsICYgMHhmZjsKKwkJaWYgKGwgPiAxMDApCisJCQlsID0gMTAwOworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJciA9ICh2YWwgPj4gOCkgJiAweGZmOworCQlpZiAociA+IDEwMCkKKwkJCXIgPSAxMDA7CisJCXJsID0gKGwgKiAyIC0gMTEpIC8gMzsJLy8gQ29udmVydCAwLTEwMCByYW5nZSB0byAwLTYzLgorCQlyciA9IChyICogMiAtIDExKSAvIDM7CisJCWlmIChybCA8IDMpCS8vIElmIGwgaXMgbG93LCB0dXJuIG9uCisJCQl0ZW1wMSA9IDB4MDA4MDsJLy8gIHRoZSBtdXRlIGJpdC4KKwkJZWxzZQorCQkJdGVtcDEgPSAwOworCisJCXJsID0gNjMgLSBybDsJLy8gQ29udmVydCB2b2wgdG8gYXR0ZW51YXRpb24uCisvLwkJd3JpdGVsKHRlbXAxIHwgcmwsIHMtPnBCQTAgKyBGTUxWQyk7CisJCWlmIChyciA8IDMpCS8vICBJZiByciBpcyBsb3csIHR1cm4gb24KKwkJCXRlbXAxID0gMHgwMDgwOwkvLyAgIHRoZSBtdXRlIGJpdC4KKwkJZWxzZQorCQkJdGVtcDEgPSAwOworCQlyciA9IDYzIC0gcnI7CS8vIENvbnZlcnQgdm9sIHRvIGF0dGVudWF0aW9uLgorLy8JCXdyaXRlbCh0ZW1wMSB8IHJyLCBzLT5wQkEwICsgRk1SVkMpOworCisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCXMtPm1peC52b2xbNF0gPSAociA8PCA4KSB8IGw7CisjZWxzZQorCQlzLT5taXgudm9sWzRdID0gdmFsOworI2VuZGlmCisJCXJldHVybiBwdXRfdXNlcihzLT5taXgudm9sWzRdLCAoaW50ICopIGFyZyk7CisKKworCWRlZmF1bHQ6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI5N2E6IG1peGVyX2lvY3RsKCk6IGRlZmF1bHRcbiIpKTsKKworCQlpID0gX0lPQ19OUihjbWQpOworCQlpZiAoaSA+PSBTT1VORF9NSVhFUl9OUkRFVklDRVMgfHwgISh2aWR4ID0gbWl4dGFibGUxW2ldKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJbCA9IHZhbCAmIDB4ZmY7CisJCWlmIChsID4gMTAwKQorCQkJbCA9IDEwMDsKKwkJaWYgKGwgPCAxKSB7CisJCQlsID0gMDsKKwkJCXJsID0gMzE7CisJCX0gZWxzZQorCQkJcmwgPSAoYXR0ZW50YmxbKGwgKiAxMCkgLyAxMDBdKSA+PiAxOworCisJCXIgPSAodmFsID4+IDgpICYgMHhmZjsKKwkJaWYgKHIgPiAxMDApCisJCQlyID0gMTAwOworCQlpZiAociA8IDEpIHsKKwkJCXIgPSAwOworCQkJcnIgPSAzMTsKKwkJfSBlbHNlCisJCQlyciA9IChhdHRlbnRibFsociAqIDEwKSAvIDEwMF0pID4+IDE7CisJCWlmICgocmwgPiAzMCkgJiYgKHJyID4gMzApKQorCQkJdGVtcDEgPSAweDgwMDA7CisJCWVsc2UKKwkJCXRlbXAxID0gMDsKKwkJdGVtcDEgPSB0ZW1wMSB8IChybCA8PCA4KSB8IHJyOworCQljczQyOTdhX3dyaXRlX2FjOTcocywgbWl4cmVnW3ZpZHggLSAxXSwgdGVtcDEpOworCisjaWZkZWYgT1NTX0RPQ1VNRU5URURfTUlYRVJfU0VNQU5USUNTCisJCXMtPm1peC52b2xbdmlkeCAtIDFdID0gKCh1bnNpZ25lZCBpbnQpIHIgPDwgOCkgfCBsOworI2Vsc2UKKwkJcy0+bWl4LnZvbFt2aWR4IC0gMV0gPSB2YWw7CisjZW5kaWYKKwkJcmV0dXJuIHB1dF91c2VyKHMtPm1peC52b2xbdmlkeCAtIDFdLCAoaW50ICopIGFyZyk7CisJfQorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworc3RhdGljIGludCBjczQyOTdhX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnM9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDQsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogY3M0Mjk3YV9vcGVuX21peGRldigpK1xuIikpOworCisJbGlzdF9mb3JfZWFjaChlbnRyeSwgJmNzNDI5N2FfZGV2cykKKwl7CisJCXMgPSBsaXN0X2VudHJ5KGVudHJ5LCBzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSwgbGlzdCk7CisJCWlmKHMtPmRldl9taXhlciA9PSBtaW5vcikKKwkJCWJyZWFrOworCX0KKwlpZiAoIXMpCisJeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOIHwgQ1NfRVJST1IsIDIsCisJCQlwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBjczQyOTdhX29wZW5fbWl4ZGV2KCktIC1FTk9ERVZcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19PUEVOLCA0LAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IGNzNDI5N2Ffb3Blbl9taXhkZXYoKS0gMFxuIikpOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCisKK3N0YXRpYyBpbnQgY3M0Mjk3YV9yZWxlYXNlX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGNzNDI5N2FfaW9jdGxfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXJldHVybiBtaXhlcl9pb2N0bCgoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhLCBjbWQsCisJCQkgICBhcmcpOworfQorCisKKy8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gICBNaXhlciBmaWxlIG9wZXJhdGlvbnMgc3RydWN0LgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzNDI5N2FfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IGNzNDI5N2FfaW9jdGxfbWl4ZGV2LAorCS5vcGVuCQk9IGNzNDI5N2Ffb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSBjczQyOTdhX3JlbGVhc2VfbWl4ZGV2LAorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCisKK3N0YXRpYyBpbnQgZHJhaW5fYWRjKHN0cnVjdCBjczQyOTdhX3N0YXRlICpzLCBpbnQgbm9uYmxvY2spCit7CisgICAgICAgIC8qIFRoaXMgcm91dGluZSBzZXJ2ZXMgbm8gcHVycG9zZSBjdXJyZW50bHkgLSBhbnkgc2FtcGxlcworICAgICAgICAgICBzaXR0aW5nIGluIHRoZSByZWNlaXZlIHF1ZXVlIHdpbGwganVzdCBiZSBwcm9jZXNzZWQgYnkgdGhlCisgICAgICAgICAgIGJhY2tncm91bmQgY29uc3VtZXIuICBUaGlzIHdvdWxkIGJlIGRpZmZlcmVudCBpZiBETUEKKyAgICAgICAgICAgYWN0dWFsbHkgc3RvcHBlZCB3aGVuIHRoZXJlIHdlcmUgbm8gY2xpZW50cy4gKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcmFpbl9kYWMoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMsIGludCBub25ibG9jaykKK3sKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworICAgICAgICB1bnNpZ25lZCBod3B0cjsKKwl1bnNpZ25lZCB0bW87CisJaW50IGNvdW50OworCisJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKG5vbmJsb2NrKQorICAgICAgICAgICAgICAgIHJldHVybiAtRUJVU1k7CisJYWRkX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworICAgICAgICB3aGlsZSAoKGNvdW50ID0gX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0NPVU5UX1RYKSkpIHx8CisgICAgICAgICAgICAgICAocy0+ZG1hX2RhYy5jb3VudCA+IDApKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWEtXIGlzIHRoaXMgY2FsY3VsYXRpb24gd29ya2luZz8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRtbyA9ICgoY291bnQgKiBGUkFNRV9UWF9VUykgKiBIWikgLyAxMDAwMDAwOworICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVfdGltZW91dCh0bW8gKyAxKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogWFhYS1cgZG8gSSBjYXJlIGlmIHRoZXJlIGlzIGEgc2lnbmFsIHBlbmRpbmc/ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisgICAgICAgIC8qIFJlc2V0IHRoZSBib29ra2VlcGluZyAqLworICAgICAgICBod3B0ciA9IChpbnQpKCgoX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9DVVJfRFNDUl9BRERSX1RYKSkgJiBNX0RNQV9DVVJEU0NSX0FERFIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5kZXNjcnRhYl9waHlzKSAvIHNpemVvZihzZXJkbWFfZGVzY3JfdCkpOworICAgICAgICBzLT5kbWFfZGFjLmh3cHRyID0gcy0+ZG1hX2RhYy5zd3B0ciA9IGh3cHRyOworICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5sb2NrLCBmbGFncyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnMtPmRtYV9kYWMud2FpdCwgJndhaXQpOworCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJldHVybiAwOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAKKworc3RhdGljIHNzaXplX3QgY3M0Mjk3YV9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCwKKwkJCSAgIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMgPQorCSAgICAoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNudCwgY291bnRfZnIsIGNudF9ieTsKKwl1bnNpZ25lZCBjb3BpZWQgPSAwOworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9SRUFELCAyLAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IGNzNDI5N2FfcmVhZCgpKyAlZCBcbiIsIGNvdW50KSk7CisKKwlWQUxJREFURV9TVEFURShzKTsKKwlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpCisJCXJldHVybiAtRU5YSU87CisJaWYgKCFzLT5kbWFfYWRjLnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9hZGMocykpKQorCQlyZXR1cm4gcmV0OworCWlmICghYWNjZXNzX29rKFZFUklGWV9XUklURSwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisvLworLy8gImNvdW50IiBpcyB0aGUgYW1vdW50IG9mIGJ5dGVzIHRvIHJlYWQgKGZyb20gYXBwKSwgaXMgZGVjcmVtZW50ZWQgZWFjaCBsb29wCisvLyAgICAgIGJ5IHRoZSBhbW91bnQgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gcmV0dXJuZWQgdG8gdGhlIHVzZXIgYnVmZmVyLgorLy8gImNudCIgaXMgdGhlIHJ1bm5pbmcgdG90YWwgb2YgZWFjaCByZWFkIGZyb20gdGhlIGJ1ZmZlciAoY2hhbmdlcyBlYWNoIGxvb3ApCisvLyAiYnVmZmVyIiBwb2ludHMgdG8gdGhlIGFwcCdzIGJ1ZmZlcgorLy8gInJldCIga2VlcHMgYSBydW5uaW5nIHRvdGFsIG9mIHRoZSBhbW91bnQgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gY29waWVkCisvLyAgICAgIHRvIHRoZSB1c2VyIGJ1ZmZlci4KKy8vICJjb3BpZWQiIGlzIHRoZSB0b3RhbCBieXRlcyBjb3BpZWQgaW50byB0aGUgdXNlciBidWZmZXIgZm9yIGVhY2ggbG9vcC4KKy8vCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPCisJCQkiX3JlYWQoKSBjb3VudD4wIGNvdW50PSVkIC5jb3VudD0lZCAuc3dwdHI9JWQgLmh3cHRyPSVkIFxuIiwKKwkJCQljb3VudCwgcy0+ZG1hX2FkYy5jb3VudCwKKwkJCQlzLT5kbWFfYWRjLnN3cHRyLCBzLT5kbWFfYWRjLmh3cHRyKSk7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisKKyAgICAgICAgICAgICAgICAvKiBjbnQgd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBzYW1wbGVzICgxNi1iaXQKKyAgICAgICAgICAgICAgICAgICBzdGVyZW8pOyBpdCBzdGFydHMgb3V0IGFzIHRoZSBtYXhtaW11bSBjb25zZXF1ZXRpdmUKKyAgICAgICAgICAgICAgICAgICBzYW1wbGVzICovCisJCWNudCA9IChzLT5kbWFfYWRjLnNiX2VuZCAtIHMtPmRtYV9hZGMuc2Jfc3dwdHIpIC8gMjsKKyAgICAgICAgICAgICAgICBjb3VudF9mciA9IHMtPmRtYV9hZGMuY291bnQgLyBGUkFNRV9TQU1QTEVfQllURVM7CisKKwkJLy8gZG1hX2FkYy5jb3VudCBpcyB0aGUgY3VycmVudCB0b3RhbCBieXRlcyB0aGF0IGhhdmUgbm90IGJlZW4gcmVhZC4KKwkJLy8gaWYgdGhlIGFtb3VudCBvZiB1bnJlYWQgYnl0ZXMgZnJvbSB0aGUgY3VycmVudCBzdyBwb2ludGVyIHRvIHRoZQorCQkvLyBlbmQgb2YgdGhlIGJ1ZmZlciBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgdG90YWwgYnl0ZXMgdGhhdAorCQkvLyBoYXZlIG5vdCBiZWVuIHJlYWQsIHRoZW4gc2V0IHRoZSAiY250IiAodW5yZWFkIGJ5dGVzKSB0byB0aGUKKwkJLy8gYW1vdW50IG9mIHVucmVhZCBieXRlcy4gIAorCisJCWlmIChjb3VudF9mciA8IGNudCkKKwkJCWNudCA9IGNvdW50X2ZyOworICAgICAgICAgICAgICAgIGNudF9ieSA9IGNudCAqIEZSQU1FX1NBTVBMRV9CWVRFUzsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQkvLworCQkvLyBpZiB3ZSBhcmUgY29udmVydGluZyBmcm9tIDgvMTYgdGhlbiB3ZSBuZWVkIHRvIGNvcHkKKwkJLy8gdHdpY2UgdGhlIG51bWJlciBvZiAxNiBiaXQgYnl0ZXMgdGhlbiA4IGJpdCBieXRlcy4KKwkJLy8gCisJCWlmIChzLT5jb252ZXJzaW9uKSB7CisJCQlpZiAoY250X2J5ID4gKGNvdW50ICogMikpIHsKKwkJCQljbnQgPSAoY291bnQgKiAyKSAvIEZSQU1FX1NBTVBMRV9CWVRFUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250X2J5ID0gY291bnQgKiAyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9IGVsc2UgeworCQkJaWYgKGNudF9ieSA+IGNvdW50KSB7CisJCQkJY250ID0gY291bnQgLyBGUkFNRV9TQU1QTEVfQllURVM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudF9ieSA9IGNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisJCS8vCisJCS8vICJjbnQiIE5PVyBpcyB0aGUgc21hbGxlciBvZiB0aGUgYW1vdW50IHRoYXQgd2lsbCBiZSByZWFkLAorCQkvLyBhbmQgdGhlIGFtb3VudCB0aGF0IGlzIHJlcXVlc3RlZCBpbiB0aGlzIHJlYWQgKG9yIHBhcnRpYWwpLgorCQkvLyBpZiB0aGVyZSBhcmUgbm8gYnl0ZXMgaW4gdGhlIGJ1ZmZlciB0byByZWFkLCB0aGVuIHN0YXJ0IHRoZQorCQkvLyBBREMgYW5kIHdhaXQgZm9yIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciB0byB3YWtlIHVzIHVwLgorCQkvLworCQlpZiAoY250IDw9IDApIHsKKworCQkJLy8gc3RhcnQgdXAgdGhlIGRtYSBlbmdpbmUgYW5kIHRoZW4gY29udGludWUgYmFjayB0byB0aGUgdG9wIG9mCisJCQkvLyB0aGUgbG9vcCB3aGVuIHdha2UgdXAgb2NjdXJzLgorCQkJc3RhcnRfYWRjKHMpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJCXJldHVybiByZXQgPyByZXQgOiAtRUFHQUlOOworCQkJaW50ZXJydXB0aWJsZV9zbGVlcF9vbigmcy0+ZG1hX2FkYy53YWl0KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCQkJY29udGludWU7CisJCX0KKwkJLy8gdGhlcmUgYXJlIGJ5dGVzIGluIHRoZSBidWZmZXIgdG8gcmVhZC4KKwkJLy8gY29weSBmcm9tIHRoZSBodyBidWZmZXIgb3ZlciB0byB0aGUgdXNlciBidWZmZXIuCisJCS8vIHVzZXIgYnVmZmVyIGlzIGRlc2lnbmF0ZWQgYnkgImJ1ZmZlciIKKwkJLy8gdmlydHVhbCBhZGRyZXNzIHRvIGNvcHkgZnJvbSBpcyBkbWFfYnVmK3N3cHRyCisJCS8vIHRoZSAiY250IiBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCisKKwkJQ1NfREJHT1VUKENTX1dBVkVfUkVBRCwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJIl9yZWFkKCkgY29weV90byBjbnQ9JWQgY291bnQ9JWQgIiwgY250X2J5LCBjb3VudCkpOworCQlDU19EQkdPVVQoQ1NfV0FWRV9SRUFELCA4LCBwcmludGsoS0VSTl9JTkZPCisJCQkgIiAuc2J1ZnN6PSVkIC5jb3VudD0lZCBidWZmZXI9MHglLjh4IHJldD0lZFxuIiwKKwkJCQkgcy0+ZG1hX2FkYy5zYnVmc3osIHMtPmRtYV9hZGMuY291bnQsCisJCQkJICh1bnNpZ25lZCkgYnVmZmVyLCByZXQpKTsKKworCQlpZiAoY29weV90b191c2VyIChidWZmZXIsICgodm9pZCAqKXMtPmRtYV9hZGMuc2Jfc3dwdHIpLCBjbnRfYnkpKQorCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FRkFVTFQ7CisgICAgICAgICAgICAgICAgY29waWVkID0gY250X2J5OworCisgICAgICAgICAgICAgICAgLyogUmV0dXJuIHRoZSBkZXNjcmlwdG9ycyAqLworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworICAgICAgICAgICAgICAgIENTX0RCR09VVChDU19GVU5DVElPTiwgMiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IHVwZF9yY3Ygc3ctPmh3ICV4LyV4XG4iLCBzLT5kbWFfYWRjLnN3cHRyLCBzLT5kbWFfYWRjLmh3cHRyKSk7CisJCXMtPmRtYV9hZGMuY291bnQgLT0gY250X2J5OworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuc2Jfc3dwdHIgKz0gY250ICogMjsKKyAgICAgICAgICAgICAgICBpZiAocy0+ZG1hX2FkYy5zYl9zd3B0ciA9PSBzLT5kbWFfYWRjLnNiX2VuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuc2Jfc3dwdHIgPSBzLT5kbWFfYWRjLnNhbXBsZV9idWY7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY291bnQgLT0gY29waWVkOworCQlidWZmZXIgKz0gY29waWVkOworCQlyZXQgKz0gY29waWVkOworCQlzdGFydF9hZGMocyk7CisJfQorCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1dBVkVfUkVBRCwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBjczQyOTdhX3JlYWQoKS0gJWRcbiIsIHJldCkpOworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHNzaXplX3QgY3M0Mjk3YV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICogcHBvcykKK3sKKwlzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0ciwgaHdwdHI7CisJaW50IGNudDsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1dBVkVfV1JJVEUsIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogY3M0Mjk3YV93cml0ZSgpKyBjb3VudD0lZFxuIiwKKwkJCSBjb3VudCkpOworCVZBTElEQVRFX1NUQVRFKHMpOworCisJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghcy0+ZG1hX2RhYy5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfZGFjKHMpKSkKKwkJcmV0dXJuIHJldDsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfUkVBRCwgYnVmZmVyLCBjb3VudCkpCisJCXJldHVybiAtRUZBVUxUOworCXJldCA9IDA7CisJd2hpbGUgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIHNlcmRtYV90ICpkID0gJnMtPmRtYV9kYWM7CisgICAgICAgICAgICAgICAgaW50IGNvcHlfY250OworICAgICAgICAgICAgICAgIHUzMiAqc190bXBsOworICAgICAgICAgICAgICAgIHUzMiAqdF90bXBsOworICAgICAgICAgICAgICAgIHUzMiBsZWZ0LCByaWdodDsKKyAgICAgICAgICAgICAgICBpbnQgc3dhcCA9IChzLT5wcm9wX2RhYy5mbXQgPT0gQUZNVF9TMTZfTEUpIHx8IChzLT5wcm9wX2RhYy5mbXQgPT0gQUZNVF9VMTZfTEUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIFhYWFhYWCB0aGlzIGlzIGJyb2tlbiBmb3IgQkxPQVRfRkFDVE9SICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWlmIChkLT5jb3VudCA8IDApIHsKKwkJCWQtPmNvdW50ID0gMDsKKwkJCWQtPnN3cHRyID0gZC0+aHdwdHI7CisJCX0KKwkJaWYgKGQtPnVuZGVycnVuKSB7CisJCQlkLT51bmRlcnJ1biA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBod3B0ciA9ICh1bnNpZ25lZCkgKCgoX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9DVVJfRFNDUl9BRERSX1RYKSkgJiBNX0RNQV9DVVJEU0NSX0FERFIpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPmRlc2NydGFiX3BoeXMpIC8gc2l6ZW9mKHNlcmRtYV9kZXNjcl90KSk7CisJCQlkLT5zd3B0ciA9IGQtPmh3cHRyID0gaHdwdHI7CisJCX0KKwkJc3dwdHIgPSBkLT5zd3B0cjsKKwkJY250ID0gZC0+c2J1ZnN6IC0gKHN3cHRyICogRlJBTUVfU0FNUExFX0JZVEVTKTsKKyAgICAgICAgICAgICAgICAvKiBXaWxsIHRoaXMgd3JpdGUgZmlsbCB1cCB0aGUgYnVmZmVyPyAqLworCQlpZiAoZC0+Y291bnQgKyBjbnQgPiBkLT5zYnVmc3opCisJCQljbnQgPSBkLT5zYnVmc3ogLSBkLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQlzdGFydF9kYWMocyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spCisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FQUdBSU47CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZkLT53YWl0KTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVSRVNUQVJUU1lTOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHlfZnJvbV91c2VyKGQtPnNhbXBsZV9idWYsIGJ1ZmZlciwgY250KSkKKwkJCXJldHVybiByZXQgPyByZXQgOiAtRUZBVUxUOworCisgICAgICAgICAgICAgICAgY29weV9jbnQgPSBjbnQ7CisgICAgICAgICAgICAgICAgc190bXBsID0gKHUzMiAqKWQtPnNhbXBsZV9idWY7CisgICAgICAgICAgICAgICAgdF90bXBsID0gKHUzMiAqKShkLT5kbWFfYnVmICsgKHN3cHRyICogNCkpOworCisgICAgICAgICAgICAgICAgLyogWFhYS1cgYXNzdW1pbmcgMTYtYml0IHN0ZXJlbyEgKi8KKyAgICAgICAgICAgICAgICBkbyB7CisJCQl1MzIgdG1wOworCisJCQl0X3RtcGxbMF0gPSBjcHVfdG9fYmUzMigweDk4MDAwMDAwKTsKKworCQkJdG1wID0gYmUzMl90b19jcHUoc190bXBsWzBdKTsKKwkJCWxlZnQgPSB0bXAgJiAweGZmZmY7CisJCQlyaWdodCA9IHRtcCA+PiAxNjsKKwkJCWlmIChzd2FwKSB7CisJCQkJbGVmdCA9IHN3YWIxNihsZWZ0KTsKKwkJCQlyaWdodCA9IHN3YWIxNihyaWdodCk7CisJCQl9CisJCQl0X3RtcGxbMV0gPSBjcHVfdG9fYmUzMihsZWZ0ID4+IDgpOworCQkJdF90bXBsWzJdID0gY3B1X3RvX2JlMzIoKChsZWZ0ICYgMHhmZikgPDwgMjQpIHwKKwkJCQkJCShyaWdodCA8PCA0KSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNfdG1wbCsrOworICAgICAgICAgICAgICAgICAgICAgICAgdF90bXBsICs9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3B5X2NudCAtPSA0OworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGNvcHlfY250KTsKKworICAgICAgICAgICAgICAgIC8qIE11eCBpbiBhbnkgcGVuZGluZyByZWFkL3dyaXRlIGFjY2Vzc2VzICovCisgICAgICAgICAgICAgICAgaWYgKHMtPnJlZ19yZXF1ZXN0KSB7CisJCQkqKHU2NCAqKShkLT5kbWFfYnVmICsgKHN3cHRyICogNCkpIHw9CisJCQkJY3B1X3RvX2JlNjQocy0+cmVnX3JlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+cmVnX3JlcXVlc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgd2FrZV91cCgmcy0+ZG1hX2RhYy5yZWdfd2FpdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ1NfREJHT1VUKENTX1dBVkVfV1JJVEUsIDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjczQyOTdhOiBjb3B5IGluICVkIHRvIHN3cHRyICV4XG4iLCBjbnQsIHN3cHRyKSk7CisKKwkJc3dwdHIgPSAoc3dwdHIgKyAoY250L0ZSQU1FX1NBTVBMRV9CWVRFUykpICUgZC0+cmluZ3N6OworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlcShjbnQvRlJBTUVfU0FNUExFX0JZVEVTLCBTU19DU1IoUl9TRVJfRE1BX0RTQ1JfQ09VTlRfVFgpKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJZC0+c3dwdHIgPSBzd3B0cjsKKwkJZC0+Y291bnQgKz0gY250OworCQlkLT5lbmRjbGVhcmVkID0gMDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQljb3VudCAtPSBjbnQ7CisJCWJ1ZmZlciArPSBjbnQ7CisJCXJldCArPSBjbnQ7CisJCXN0YXJ0X2RhYyhzKTsKKwl9CisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OIHwgQ1NfV0FWRV9XUklURSwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBjczQyOTdhX3dyaXRlKCktICVkXG4iLCByZXQpKTsKKwlyZXR1cm4gcmV0OworfQorCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3M0Mjk3YV9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCXN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyA9CisJICAgIChzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19XQVZFX1dSSVRFIHwgQ1NfV0FWRV9SRUFELCA0LAorCQkgIHByaW50ayhLRVJOX0lORk8gImNzNDI5N2E6IGNzNDI5N2FfcG9sbCgpK1xuIikpOworCVZBTElEQVRFX1NUQVRFKHMpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19XQVZFX1dSSVRFIHwgQ1NfV0FWRV9SRUFELCA0LAorCQkJICBwcmludGsoS0VSTl9JTkZPCisJCQkJICJjczQyOTdhOiBjczQyOTdhX3BvbGwoKSB3YWl0IG9uIEZNT0RFX1dSSVRFXG4iKSk7CisJCWlmKCFzLT5kbWFfZGFjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYyhzKSkKKwkJCXJldHVybiAwOworCQlwb2xsX3dhaXQoZmlsZSwgJnMtPmRtYV9kYWMud2FpdCwgd2FpdCk7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1dBVkVfV1JJVEUgfCBDU19XQVZFX1JFQUQsIDQsCisJCQkgIHByaW50ayhLRVJOX0lORk8KKwkJCQkgImNzNDI5N2E6IGNzNDI5N2FfcG9sbCgpIHdhaXQgb24gRk1PREVfUkVBRFxuIikpOworCQlpZighcy0+ZG1hX2RhYy5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9hZGMocykpCisJCQlyZXR1cm4gMDsKKwkJcG9sbF93YWl0KGZpbGUsICZzLT5kbWFfYWRjLndhaXQsIHdhaXQpOworCX0KKwlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCWNzNDI5N2FfdXBkYXRlX3B0cihzLENTX0ZBTFNFKTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKSB7CisJCQlpZiAocy0+ZG1hX2RhYy5jb3VudCA+PQorCQkJICAgIChzaWduZWQpIHMtPmRtYV9kYWMuZnJhZ3NpemUpIHsKKwkJCQlpZiAocy0+ZG1hX2RhYy53YWtldXApCisJCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCQkJZWxzZQorCQkJCQltYXNrID0gMDsKKwkJCQlzLT5kbWFfZGFjLndha2V1cCA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoKHNpZ25lZCkgKHMtPmRtYV9kYWMuc2J1ZnN6LzIpID49IHMtPmRtYV9kYWMuY291bnQpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0gZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlpZiAocy0+ZG1hX2FkYy5tYXBwZWQpIHsKKwkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID49IChzaWduZWQpIHMtPmRtYV9hZGMuZnJhZ3NpemUpIAorCQkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzLT5kbWFfYWRjLmNvdW50ID4gMCkKKwkJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1dBVkVfV1JJVEUgfCBDU19XQVZFX1JFQUQsIDQsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogY3M0Mjk3YV9wb2xsKCktIDB4JS44eFxuIiwKKwkJCSBtYXNrKSk7CisJcmV0dXJuIG1hc2s7Cit9CisKKworc3RhdGljIGludCBjczQyOTdhX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworICAgICAgICAvKiBYWFhLVyBjdXJyZW50bHkgbm8gbW1hcCBzdXBwb3J0ICovCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgY3M0Mjk3YV9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBjczQyOTdhX3N0YXRlICpzID0KKwkgICAgKHN0cnVjdCBjczQyOTdhX3N0YXRlICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKwljb3VudF9pbmZvIGNpbmZvOworCWludCB2YWwsIG1hcHBlZCwgcmV0OworCisJQ1NfREJHT1VUKENTX0ZVTkNUSU9OfENTX0lPQ1RMLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCSAiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBmaWxlPTB4JS44eCBjbWQ9MHglLjh4XG4iLAorCQkJICh1bnNpZ25lZCkgZmlsZSwgY21kKSk7CisjaWYgQ1NERUJVRworCWNzX3ByaW50aW9jdGwoY21kKTsKKyNlbmRpZgorCVZBTElEQVRFX1NUQVRFKHMpOworCW1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIHMtPmRtYV9kYWMubWFwcGVkKSB8fAorCSAgICAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIHMtPmRtYV9hZGMubWFwcGVkKTsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBTT1VORF9WRVJTSU9OPTB4JS44eFxuIiwKKwkJCQkgU09VTkRfVkVSU0lPTikpOworCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NZTkM6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyOTdhOiBjczQyOTdhX2lvY3RsKCk6IERTUF9TWU5DXG4iKSk7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXJldHVybiBkcmFpbl9kYWMocywKKwkJCQkJIDAgLypmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyAqLworCQkJCQkgKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU0VURFVQTEVYOgorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRDQVBTOgorCQlyZXR1cm4gcHV0X3VzZXIoRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwKKwkJCQlEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX01NQVAsCisJCQkJKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1JFU0VUOgorCQlDU19EQkdPVVQoQ1NfSU9DVEwsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBEU1BfUkVTRVRcbiIpKTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5jb3VudCA9IHMtPmRtYV9kYWMudG90YWxfYnl0ZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfZGFjLmJsb2NrcyA9IHMtPmRtYV9kYWMud2FrZXVwID0gMDsKKwkJCXMtPmRtYV9kYWMuc3dwdHIgPSBzLT5kbWFfZGFjLmh3cHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfRE1BX0NVUl9EU0NSX0FERFJfVFgpKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2RhYy5kZXNjcnRhYl9waHlzKSAvIHNpemVvZihzZXJkbWFfZGVzY3JfdCkpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXN5bmNocm9uaXplX2lycShzLT5pcnEpOworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5jb3VudCA9IHMtPmRtYV9hZGMudG90YWxfYnl0ZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLT5kbWFfYWRjLmJsb2NrcyA9IHMtPmRtYV9kYWMud2FrZXVwID0gMDsKKwkJCXMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoKChfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfRE1BX0NVUl9EU0NSX0FERFJfUlgpKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5kZXNjcnRhYl9waHlzKSAvIHNpemVvZihzZXJkbWFfZGVzY3JfdCkpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBEU1BfU1BFRUQgdmFsPSVkIC0+IDQ4MDAwXG4iLCB2YWwpKTsKKyAgICAgICAgICAgICAgICB2YWwgPSA0ODAwMDsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHV0X3VzZXIodmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBEU1BfU1RFUkVPIHZhbD0lZFxuIiwgdmFsKSk7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlzdG9wX2FkYyhzKTsKKwkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJcy0+cHJvcF9hZGMuY2hhbm5lbHMgPSB2YWwgPyAyIDogMTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXN0b3BfZGFjKHMpOworCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IHZhbCA/IDIgOiAxOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSAiY3M0Mjk3YTogY3M0Mjk3YV9pb2N0bCgpOiBEU1BfQ0hBTk5FTFMgdmFsPSVkXG4iLAorCQkJCSB2YWwpKTsKKwkJaWYgKHZhbCAhPSAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgPj0gMikKKwkJCQkJcy0+cHJvcF9hZGMuY2hhbm5lbHMgPSAyOworCQkJCWVsc2UKKwkJCQkJcy0+cHJvcF9hZGMuY2hhbm5lbHMgPSAxOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMocyk7CisJCQkJcy0+ZG1hX2RhYy5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA+PSAyKQorCQkJCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IDI7CisJCQkJZWxzZQorCQkJCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IDE7CisJCQl9CisJCX0KKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQl2YWwgPSBzLT5wcm9wX2RhYy5jaGFubmVsczsKKwkJZWxzZSBpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXZhbCA9IHMtPnByb3BfYWRjLmNoYW5uZWxzOworCisJCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOgkvLyBSZXR1cm5zIGEgbWFzayAKKwkJQ1NfREJHT1VUKENTX0lPQ1RMIHwgQ1NfUEFSTVMsIDQsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyOTdhOiBjczQyOTdhX2lvY3RsKCk6IERTUF9HRVRGTVQgdmFsPTB4JS44eFxuIiwKKwkJCQkgQUZNVF9TMTZfTEUgfCBBRk1UX1UxNl9MRSB8IEFGTVRfUzggfAorCQkJCSBBRk1UX1U4KSk7CisJCXJldHVybiBwdXRfdXNlcihBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TOCB8CisJCQkJQUZNVF9VOCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCQkgImNzNDI5N2E6IGNzNDI5N2FfaW9jdGwoKTogRFNQX1NFVEZNVCB2YWw9MHglLjh4XG4iLAorCQkJCSB2YWwpKTsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHMpOworCQkJCXMtPmRtYV9hZGMucmVhZHkgPSAwOworCQkJCWlmICh2YWwgIT0gQUZNVF9TMTZfTEUKKwkJCQkgICAgJiYgdmFsICE9IEFGTVRfVTE2X0xFICYmIHZhbCAhPSBBRk1UX1M4CisJCQkJICAgICYmIHZhbCAhPSBBRk1UX1U4KQorCQkJCQl2YWwgPSBBRk1UX1U4OworCQkJCXMtPnByb3BfYWRjLmZtdCA9IHZhbDsKKwkJCQlzLT5wcm9wX2FkYy5mbXRfb3JpZ2luYWwgPSBzLT5wcm9wX2FkYy5mbXQ7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQlzdG9wX2RhYyhzKTsKKwkJCQlzLT5kbWFfZGFjLnJlYWR5ID0gMDsKKwkJCQlpZiAodmFsICE9IEFGTVRfUzE2X0xFCisJCQkJICAgICYmIHZhbCAhPSBBRk1UX1UxNl9MRSAmJiB2YWwgIT0gQUZNVF9TOAorCQkJCSAgICAmJiB2YWwgIT0gQUZNVF9VOCkKKwkJCQkJdmFsID0gQUZNVF9VODsKKwkJCQlzLT5wcm9wX2RhYy5mbXQgPSB2YWw7CisJCQkJcy0+cHJvcF9kYWMuZm10X29yaWdpbmFsID0gcy0+cHJvcF9kYWMuZm10OworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCXZhbCA9IHMtPnByb3BfZGFjLmZtdF9vcmlnaW5hbDsKKwkJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQkJdmFsID0gcy0+cHJvcF9hZGMuZm10X29yaWdpbmFsOworCQl9CisJCUNTX0RCR09VVChDU19JT0NUTCB8IENTX1BBUk1TLCA0LCBwcmludGsoS0VSTl9JTkZPCisJCSAgImNzNDI5N2E6IGNzNDI5N2FfaW9jdGwoKTogRFNQX1NFVEZNVCByZXR1cm4gdmFsPTB4JS44eFxuIiwgCisJCQl2YWwpKTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCUNTX0RCR09VVChDU19JT0NUTCwgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyOTdhOiBjczQyOTdhX2lvY3RsKCk6IERTUF9QT1NUXG4iKSk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVFRSSUdHRVI6CisJCXZhbCA9IDA7CisJCWlmIChmaWxlLT5mX21vZGUgJiBzLT5lbmEgJiBGTU9ERV9SRUFEKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBzLT5lbmEgJiBGTU9ERV9XUklURSkKKwkJCXZhbCB8PSBQQ01fRU5BQkxFX09VVFBVVDsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NFVFRSSUdHRVI6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkKKwkJCQkgICAgJiYgKHJldCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJc3RhcnRfYWRjKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9hZGMocyk7CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAoIXMtPmRtYV9kYWMucmVhZHkKKwkJCQkgICAgJiYgKHJldCA9IHByb2dfZG1hYnVmX2RhYyhzKSkpCisJCQkJCXJldHVybiByZXQ7CisJCQkJc3RhcnRfZGFjKHMpOworCQkJfSBlbHNlCisJCQkJc3RvcF9kYWMocyk7CisJCX0KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCFzLT5kbWFfZGFjLnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJcmV0dXJuIHZhbDsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJY3M0Mjk3YV91cGRhdGVfcHRyKHMsQ1NfRkFMU0UpOworCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfZGFjLmZyYWdzaXplOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpCisJCQlhYmluZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLnNidWZzejsKKwkJZWxzZQorCQkJYWJpbmZvLmJ5dGVzID0KKwkJCSAgICBzLT5kbWFfZGFjLnNidWZzeiAtIHMtPmRtYV9kYWMuY291bnQ7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2RhYy5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0OworCQlDU19EQkdPVVQoQ1NfRlVOQ1RJT04gfCBDU19QQVJNUywgNCwgcHJpbnRrKEtFUk5fSU5GTworCQkJImNzNDI5N2E6IGNzNDI5N2FfaW9jdGwoKTogR0VUT1NQQUNFIC5mcmFnc2l6ZT0lZCAuYnl0ZXM9JWQgLmZyYWdzdG90YWw9JWQgLmZyYWdtZW50cz0lZFxuIiwKKwkJCQlhYmluZm8uZnJhZ3NpemUsYWJpbmZvLmJ5dGVzLGFiaW5mby5mcmFnc3RvdGFsLAorCQkJCWFiaW5mby5mcmFnbWVudHMpKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmFiaW5mbywKKwkJCQkgICAgc2l6ZW9mKGFiaW5mbykpID8gLUVGQVVMVCA6IDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAoIXMtPmRtYV9hZGMucmVhZHkgJiYgKHZhbCA9IHByb2dfZG1hYnVmX2FkYyhzKSkpCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyOTdhX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCWlmIChzLT5jb252ZXJzaW9uKSB7CisJCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplIC8gMjsKKwkJCWFiaW5mby5ieXRlcyA9IHMtPmRtYV9hZGMuY291bnQgLyAyOworCQkJYWJpbmZvLmZyYWdzdG90YWwgPSBzLT5kbWFfYWRjLm51bWZyYWc7CisJCQlhYmluZm8uZnJhZ21lbnRzID0KKwkJCSAgICBhYmluZm8uYnl0ZXMgPj4gKHMtPmRtYV9hZGMuZnJhZ3NoaWZ0IC0gMSk7CisJCX0gZWxzZSB7CisJCQlhYmluZm8uZnJhZ3NpemUgPSBzLT5kbWFfYWRjLmZyYWdzaXplOworCQkJYWJpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy5jb3VudDsKKwkJCWFiaW5mby5mcmFnc3RvdGFsID0gcy0+ZG1hX2FkYy5udW1mcmFnOworCQkJYWJpbmZvLmZyYWdtZW50cyA9CisJCQkgICAgYWJpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworCQl9CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZhYmluZm8sCisJCQkJICAgIHNpemVvZihhYmluZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmKCFzLT5kbWFfZGFjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2RhYyhzKSkKKwkJCXJldHVybiAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyOTdhX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCXZhbCA9IHMtPmRtYV9kYWMuY291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmKCFzLT5kbWFfYWRjLnJlYWR5ICYmIHByb2dfZG1hYnVmX2FkYyhzKSkKKwkJCXJldHVybiAwOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+bG9jaywgZmxhZ3MpOworCQljczQyOTdhX3VwZGF0ZV9wdHIocyxDU19GQUxTRSk7CisJCWNpbmZvLmJ5dGVzID0gcy0+ZG1hX2FkYy50b3RhbF9ieXRlczsKKwkJaWYgKHMtPmRtYV9hZGMubWFwcGVkKSB7CisJCQljaW5mby5ibG9ja3MgPQorCQkJICAgIChjaW5mby5ieXRlcyA+PiBzLT5kbWFfYWRjLmZyYWdzaGlmdCkgLQorCQkJICAgIHMtPmRtYV9hZGMuYmxvY2tzOworCQkJcy0+ZG1hX2FkYy5ibG9ja3MgPQorCQkJICAgIGNpbmZvLmJ5dGVzID4+IHMtPmRtYV9hZGMuZnJhZ3NoaWZ0OworCQl9IGVsc2UgeworCQkJaWYgKHMtPmNvbnZlcnNpb24pIHsKKwkJCQljaW5mby5ibG9ja3MgPQorCQkJCSAgICBzLT5kbWFfYWRjLmNvdW50IC8KKwkJCQkgICAgMiA+PiAocy0+ZG1hX2FkYy5mcmFnc2hpZnQgLSAxKTsKKwkJCX0gZWxzZQorCQkJCWNpbmZvLmJsb2NrcyA9CisJCQkJICAgIHMtPmRtYV9hZGMuY291bnQgPj4gcy0+ZG1hX2FkYy4KKwkJCQkgICAgZnJhZ3NoaWZ0OworCQl9CisJCWlmIChzLT5jb252ZXJzaW9uKQorCQkJY2luZm8ucHRyID0gcy0+ZG1hX2FkYy5od3B0ciAvIDI7CisJCWVsc2UKKwkJCWNpbmZvLnB0ciA9IHMtPmRtYV9hZGMuaHdwdHI7CisJCWlmIChzLT5kbWFfYWRjLm1hcHBlZCkKKwkJCXMtPmRtYV9hZGMuY291bnQgJj0gcy0+ZG1hX2FkYy5mcmFnc2l6ZSAtIDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYoIXMtPmRtYV9kYWMucmVhZHkgJiYgcHJvZ19kbWFidWZfZGFjKHMpKQorCQkJcmV0dXJuIDA7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5sb2NrLCBmbGFncyk7CisJCWNzNDI5N2FfdXBkYXRlX3B0cihzLENTX0ZBTFNFKTsKKwkJY2luZm8uYnl0ZXMgPSBzLT5kbWFfZGFjLnRvdGFsX2J5dGVzOworCQlpZiAocy0+ZG1hX2RhYy5tYXBwZWQpIHsKKwkJCWNpbmZvLmJsb2NrcyA9CisJCQkgICAgKGNpbmZvLmJ5dGVzID4+IHMtPmRtYV9kYWMuZnJhZ3NoaWZ0KSAtCisJCQkgICAgcy0+ZG1hX2RhYy5ibG9ja3M7CisJCQlzLT5kbWFfZGFjLmJsb2NrcyA9CisJCQkgICAgY2luZm8uYnl0ZXMgPj4gcy0+ZG1hX2RhYy5mcmFnc2hpZnQ7CisJCX0gZWxzZSB7CisJCQljaW5mby5ibG9ja3MgPQorCQkJICAgIHMtPmRtYV9kYWMuY291bnQgPj4gcy0+ZG1hX2RhYy5mcmFnc2hpZnQ7CisJCX0KKwkJY2luZm8ucHRyID0gcy0+ZG1hX2RhYy5od3B0cjsKKwkJaWYgKHMtPmRtYV9kYWMubWFwcGVkKQorCQkJcy0+ZG1hX2RhYy5jb3VudCAmPSBzLT5kbWFfZGFjLmZyYWdzaXplIC0gMTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmNpbmZvLCBzaXplb2YoY2luZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9kYWMocykpKQorCQkJCXJldHVybiB2YWw7CisJCQlyZXR1cm4gcHV0X3VzZXIocy0+ZG1hX2RhYy5mcmFnc2l6ZSwgKGludCAqKSBhcmcpOworCQl9CisJCWlmICgodmFsID0gcHJvZ19kbWFidWZfYWRjKHMpKSkKKwkJCXJldHVybiB2YWw7CisJCWlmIChzLT5jb252ZXJzaW9uKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPmRtYV9hZGMuZnJhZ3NpemUgLyAyLAorCQkJCQkoaW50ICopIGFyZyk7CisJCWVsc2UKKwkJCXJldHVybiBwdXRfdXNlcihzLT5kbWFfYWRjLmZyYWdzaXplLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsJLy8gU2F5IE9LLCBidXQgZG8gbm90aGluZy4KKworCWNhc2UgU05EQ1RMX0RTUF9TVUJESVZJREU6CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCAmJiBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uKQorCQkgICAgfHwgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFCisJCQkmJiBzLT5kbWFfZGFjLnN1YmRpdmlzaW9uKSkgcmV0dXJuIC1FSU5WQUw7CisJCWlmIChnZXRfdXNlcih2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsICE9IDEgJiYgdmFsICE9IDIgJiYgdmFsICE9IDQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCQlzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gdmFsOworCQllbHNlIGlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJCXMtPmRtYV9kYWMuc3ViZGl2aXNpb24gPSB2YWw7CisJCXJldHVybiAwOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCXJldHVybiBwdXRfdXNlcihzLT5wcm9wX2FkYy5yYXRlLCAoaW50ICopIGFyZyk7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPnByb3BfZGFjLnJhdGUsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPnByb3BfYWRjLmNoYW5uZWxzLCAoaW50ICopIGFyZyk7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuIHB1dF91c2VyKHMtPnByb3BfZGFjLmNoYW5uZWxzLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcmV0dXJuCisJCQkgICAgcHV0X3VzZXIoCisJCQkJICAgICAocy0+cHJvcF9hZGMuCisJCQkJICAgICAgZm10ICYgKEFGTVRfUzggfCBBRk1UX1U4KSkgPyA4IDogMTYsCisJCQkJICAgICAoaW50ICopIGFyZyk7CisJCWVsc2UgaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJcmV0dXJuCisJCQkgICAgcHV0X3VzZXIoCisJCQkJICAgICAocy0+cHJvcF9kYWMuCisJCQkJICAgICAgZm10ICYgKEFGTVRfUzggfCBBRk1UX1U4KSkgPyA4IDogMTYsCisJCQkJICAgICAoaW50ICopIGFyZyk7CisKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0ZJTFRFUjoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBtaXhlcl9pb2N0bChzLCBjbWQsIGFyZyk7Cit9CisKKworc3RhdGljIGludCBjczQyOTdhX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnMgPQorCSAgICAoc3RydWN0IGNzNDI5N2Ffc3RhdGUgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCisgICAgICAgIENTX0RCR09VVChDU19GVU5DVElPTiB8IENTX1JFTEVBU0UsIDIsIHByaW50ayhLRVJOX0lORk8KKwkJICJjczQyOTdhOiBjczQyOTdhX3JlbGVhc2UoKTogaW5vZGU9MHglLjh4IGZpbGU9MHglLjh4IGZfbW9kZT0weCV4XG4iLAorCQkJICh1bnNpZ25lZCkgaW5vZGUsICh1bnNpZ25lZCkgZmlsZSwgZmlsZS0+Zl9tb2RlKSk7CisJVkFMSURBVEVfU1RBVEUocyk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJZHJhaW5fZGFjKHMsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJZG93bigmcy0+b3Blbl9zZW1fZGFjKTsKKwkJc3RvcF9kYWMocyk7CisJCWRlYWxsb2NfZG1hYnVmKHMsICZzLT5kbWFfZGFjKTsKKwkJcy0+b3Blbl9tb2RlICY9IH5GTU9ERV9XUklURTsKKwkJdXAoJnMtPm9wZW5fc2VtX2RhYyk7CisJCXdha2VfdXAoJnMtPm9wZW5fd2FpdF9kYWMpOworCX0KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQlkcmFpbl9hZGMocywgZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCQlkb3duKCZzLT5vcGVuX3NlbV9hZGMpOworCQlzdG9wX2FkYyhzKTsKKwkJZGVhbGxvY19kbWFidWYocywgJnMtPmRtYV9hZGMpOworCQlzLT5vcGVuX21vZGUgJj0gfkZNT0RFX1JFQUQ7CisJCXVwKCZzLT5vcGVuX3NlbV9hZGMpOworCQl3YWtlX3VwKCZzLT5vcGVuX3dhaXRfYWRjKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3M0Mjk3YV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnM9TlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeTsKKworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJImNzNDI5N2E6IGNzNDI5N2Ffb3BlbigpOiBpbm9kZT0weCUuOHggZmlsZT0weCUuOHggZl9tb2RlPTB4JXhcbiIsCisJCQkodW5zaWduZWQpIGlub2RlLCAodW5zaWduZWQpIGZpbGUsIGZpbGUtPmZfbW9kZSkpOworCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAiY3M0Mjk3YTogc3RhdHVzID0gJTA4eFxuIiwgKGludClfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfU1RBVFVTX0RFQlVHKSkpKTsKKworCWxpc3RfZm9yX2VhY2goZW50cnksICZjczQyOTdhX2RldnMpCisJeworCQlzID0gbGlzdF9lbnRyeShlbnRyeSwgc3RydWN0IGNzNDI5N2Ffc3RhdGUsIGxpc3QpOworCisJCWlmICghKChzLT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHhmKSkKKwkJCWJyZWFrOworCX0KKwlpZiAoZW50cnkgPT0gJmNzNDI5N2FfZGV2cykKKwkJcmV0dXJuIC1FTk9ERVY7CisJaWYgKCFzKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsIHByaW50ayhLRVJOX0lORk8KKwkJCSJjczQyOTdhOiBjczQyOTdhX29wZW4oKTogRXJyb3IgLSB1bmFibGUgdG8gZmluZCBhdWRpbyBzdGF0ZSBzdHJ1Y3RcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCVZBTElEQVRFX1NUQVRFKHMpOworCWZpbGUtPnByaXZhdGVfZGF0YSA9IHM7CisKKwkvLyB3YWl0IGZvciBkZXZpY2UgdG8gYmVjb21lIGZyZWUgCisJaWYgKCEoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpKSB7CisJCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4gfCBDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fSU5GTworCQkJICJjczQyOTdhOiBjczQyOTdhX29wZW4oKTogRXJyb3IgLSBtdXN0IG9wZW4gUkVBRCBhbmQvb3IgV1JJVEVcbiIpKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworICAgICAgICAgICAgICAgIGlmIChfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfRE1BX0RTQ1JfQ09VTlRfVFgpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9FUlIgImNzNDI5N2E6IFRYIHBpcGUgbmVlZHMgdG8gZHJhaW5cbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKF9fcmF3X3JlYWRxKFNTX0NTUihSX1NFUl9ETUFfRFNDUl9DT1VOVF9UWCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgIAorCQlkb3duKCZzLT5vcGVuX3NlbV9kYWMpOworCQl3aGlsZSAocy0+b3Blbl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCXVwKCZzLT5vcGVuX3NlbV9kYWMpOworCQkJCXJldHVybiAtRUJVU1k7CisJCQl9CisJCQl1cCgmcy0+b3Blbl9zZW1fZGFjKTsKKwkJCWludGVycnVwdGlibGVfc2xlZXBfb24oJnMtPm9wZW5fd2FpdF9kYWMpOworCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCJvcGVuIC0gc2lnIHBlbmRpbmdcbiIpOworCQkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisJCQlkb3duKCZzLT5vcGVuX3NlbV9kYWMpOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWRvd24oJnMtPm9wZW5fc2VtX2FkYyk7CisJCXdoaWxlIChzLT5vcGVuX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQl1cCgmcy0+b3Blbl9zZW1fYWRjKTsKKwkJCQlyZXR1cm4gLUVCVVNZOworCQkJfQorCQkJdXAoJnMtPm9wZW5fc2VtX2FkYyk7CisJCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZzLT5vcGVuX3dhaXRfYWRjKTsKKworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50aygib3BlbiAtIHNpZyBwZW5kaW5nXG4iKTsKKwkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCQkJZG93bigmcy0+b3Blbl9zZW1fYWRjKTsKKwkJfQorCX0KKwlzLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJcy0+cHJvcF9hZGMuZm10ID0gQUZNVF9TMTZfQkU7CisJCXMtPnByb3BfYWRjLmZtdF9vcmlnaW5hbCA9IHMtPnByb3BfYWRjLmZtdDsKKwkJcy0+cHJvcF9hZGMuY2hhbm5lbHMgPSAyOworCQlzLT5wcm9wX2FkYy5yYXRlID0gNDgwMDA7CisJCXMtPmNvbnZlcnNpb24gPSAwOworCQlzLT5lbmEgJj0gfkZNT0RFX1JFQUQ7CisJCXMtPmRtYV9hZGMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2FkYy5vc3NtYXhmcmFncyA9CisJCSAgICBzLT5kbWFfYWRjLnN1YmRpdmlzaW9uID0gMDsKKwkJdXAoJnMtPm9wZW5fc2VtX2FkYyk7CisKKwkJaWYgKHByb2dfZG1hYnVmX2FkYyhzKSkgeworCQkJQ1NfREJHT1VUKENTX09QRU4gfCBDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fRVJSCisJCQkJImNzNDI5N2E6IGFkYyBQcm9ncmFtIGRtYWJ1ZnMgZmFpbGVkLlxuIikpOworCQkJY3M0Mjk3YV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlzLT5wcm9wX2RhYy5mbXQgPSBBRk1UX1MxNl9CRTsKKwkJcy0+cHJvcF9kYWMuZm10X29yaWdpbmFsID0gcy0+cHJvcF9kYWMuZm10OworCQlzLT5wcm9wX2RhYy5jaGFubmVscyA9IDI7CisJCXMtPnByb3BfZGFjLnJhdGUgPSA0ODAwMDsKKwkJcy0+Y29udmVyc2lvbiA9IDA7CisJCXMtPmVuYSAmPSB+Rk1PREVfV1JJVEU7CisJCXMtPmRtYV9kYWMub3NzZnJhZ3NoaWZ0ID0gcy0+ZG1hX2RhYy5vc3NtYXhmcmFncyA9CisJCSAgICBzLT5kbWFfZGFjLnN1YmRpdmlzaW9uID0gMDsKKwkJdXAoJnMtPm9wZW5fc2VtX2RhYyk7CisKKwkJaWYgKHByb2dfZG1hYnVmX2RhYyhzKSkgeworCQkJQ1NfREJHT1VUKENTX09QRU4gfCBDU19FUlJPUiwgMiwgcHJpbnRrKEtFUk5fRVJSCisJCQkJImNzNDI5N2E6IGRhYyBQcm9ncmFtIGRtYWJ1ZnMgZmFpbGVkLlxuIikpOworCQkJY3M0Mjk3YV9yZWxlYXNlKGlub2RlLCBmaWxlKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJfQorCUNTX0RCR09VVChDU19GVU5DVElPTiB8IENTX09QRU4sIDIsCisJCSAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogY3M0Mjk3YV9vcGVuKCktIDBcbiIpKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKworLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyAgIFdhdmUgKGF1ZGlvKSBmaWxlIG9wZXJhdGlvbnMgc3RydWN0LgorLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitzdGF0aWMgLypjb25zdCAqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGNzNDI5N2FfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLnJlYWQJCT0gY3M0Mjk3YV9yZWFkLAorCS53cml0ZQkJPSBjczQyOTdhX3dyaXRlLAorCS5wb2xsCQk9IGNzNDI5N2FfcG9sbCwKKwkuaW9jdGwJCT0gY3M0Mjk3YV9pb2N0bCwKKwkubW1hcAkJPSBjczQyOTdhX21tYXAsCisJLm9wZW4JCT0gY3M0Mjk3YV9vcGVuLAorCS5yZWxlYXNlCT0gY3M0Mjk3YV9yZWxlYXNlLAorfTsKKworc3RhdGljIHZvaWQgY3M0Mjk3YV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqcyA9IChzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSAqKSBkZXZfaWQ7CisgICAgICAgIHUzMiBzdGF0dXM7CisKKyAgICAgICAgc3RhdHVzID0gX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX1NUQVRVU19ERUJVRykpOworCisgICAgICAgIENTX0RCR09VVChDU19JTlRFUlJVUFQsIDYsIHByaW50ayhLRVJOX0lORk8KKyAgICAgICAgICAgICAgICAgImNzNDI5N2E6IGNzNDI5N2FfaW50ZXJydXB0KCkgSElTUj0weCUuOHhcbiIsIHN0YXR1cykpOworCisjaWYgMAorICAgICAgICAvKiBYWFhLVyB3aGF0IGNoZWNrICpzaG91bGQqIGJlIGRvbmUgaGVyZT8gKi8KKyAgICAgICAgaWYgKCEoc3RhdHVzICYgKE1fU1lOQ1NFUl9SWF9FT1BfQ09VTlQgfCBNX1NZTkNTRVJfUlhfT1ZFUlJVTiB8IE1fU1lOQ1NFUl9SWF9TWU5DX0VSUikpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX1NUQVRVUykpOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YTogdW5leHBlY3RlZCBpbnRlcnJ1cHQgKHN0YXR1cyAlMDh4KVxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmIChzdGF0dXMgJiBNX1NZTkNTRVJfUlhfU1lOQ19FUlIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfU1RBVFVTKSk7CisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJjczQyOTdhOiByeCBzeW5jIGVycm9yIChzdGF0dXMgJTA4eClcbiIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXR1cyAmIE1fU1lOQ1NFUl9SWF9PVkVSUlVOKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld3B0ciwgaTsKKyAgICAgICAgICAgICAgICBzLT5zdGF0cy5yeF9vdnJybisrOworICAgICAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3M0Mjk3YTogcmVjZWl2ZSBGSUZPIG92ZXJydW5cbiIpOworCisgICAgICAgICAgICAgICAgLyogRml4IHRoaW5ncyB1cDogZ2V0IHRoZSByZWNlaXZlIGRlc2NyaXB0b3IgcG9vbAorICAgICAgICAgICAgICAgICAgIGNsZWFuIGFuZCBnaXZlIHRoZW0gYmFjayB0byB0aGUgaGFyZHdhcmUgKi8KKyAgICAgICAgICAgICAgICB3aGlsZSAoX19yYXdfcmVhZHEoU1NfQ1NSKFJfU0VSX0RNQV9EU0NSX0NPVU5UX1JYKSkpCisgICAgICAgICAgICAgICAgICAgICAgICA7CisgICAgICAgICAgICAgICAgbmV3cHRyID0gKHVuc2lnbmVkKSAoKChfX3Jhd19yZWFkcShTU19DU1IoUl9TRVJfRE1BX0NVUl9EU0NSX0FERFJfUlgpKSAmIE1fRE1BX0NVUkRTQ1JfQUREUikgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuZGVzY3J0YWJfcGh5cykgLyBzaXplb2Yoc2VyZG1hX2Rlc2NyX3QpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaTxETUFfREVTQ1I7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgcy0+ZG1hX2FkYy5kZXNjcnRhYltpXS5kZXNjcl9hICY9IH5NX0RNQV9TRVJSWF9TT1A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuc3dwdHIgPSBzLT5kbWFfYWRjLmh3cHRyID0gbmV3cHRyOworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuY291bnQgPSAwOworICAgICAgICAgICAgICAgIHMtPmRtYV9hZGMuc2Jfc3dwdHIgPSBzLT5kbWFfYWRjLnNiX2h3cHRyID0gcy0+ZG1hX2FkYy5zYW1wbGVfYnVmOworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlcShETUFfREVTQ1IsIFNTX0NTUihSX1NFUl9ETUFfRFNDUl9DT1VOVF9SWCkpOworICAgICAgICB9CisKKwlzcGluX2xvY2soJnMtPmxvY2spOworCWNzNDI5N2FfdXBkYXRlX3B0cihzLENTX1RSVUUpOworCXNwaW5fdW5sb2NrKCZzLT5sb2NrKTsKKworCUNTX0RCR09VVChDU19JTlRFUlJVUFQsIDYsIHByaW50ayhLRVJOX0lORk8KKwkJICAiY3M0Mjk3YTogY3M0Mjk3YV9pbnRlcnJ1cHQoKS1cbiIpKTsKK30KKworI2lmIDAKK3N0YXRpYyBzdHJ1Y3QgaW5pdHZvbCB7CisJaW50IG1peGNoOworCWludCB2b2w7Cit9IGluaXR2b2xbXSBfX2luaXRkYXRhID0geworCisgIAl7U09VTkRfTUlYRVJfV1JJVEVfVk9MVU1FLCAweDQwNDB9LAorICAgICAgICB7U09VTkRfTUlYRVJfV1JJVEVfUENNLCAweDQwNDB9LAorICAgICAgICB7U09VTkRfTUlYRVJfV1JJVEVfU1lOVEgsIDB4NDA0MH0sCisJe1NPVU5EX01JWEVSX1dSSVRFX0NELCAweDQwNDB9LAorCXtTT1VORF9NSVhFUl9XUklURV9MSU5FLCAweDQwNDB9LAorCXtTT1VORF9NSVhFUl9XUklURV9MSU5FMSwgMHg0MDQwfSwKKwl7U09VTkRfTUlYRVJfV1JJVEVfUkVDTEVWLCAweDAwMDB9LAorCXtTT1VORF9NSVhFUl9XUklURV9TUEVBS0VSLCAweDQwNDB9LAorCXtTT1VORF9NSVhFUl9XUklURV9NSUMsIDB4MDAwMH0KK307CisjZW5kaWYKKworc3RhdGljIGludCBfX2luaXQgY3M0Mjk3YV9pbml0KHZvaWQpCit7CisJc3RydWN0IGNzNDI5N2Ffc3RhdGUgKnM7CisJdTMyIHB3ciwgaWQ7CisJbW1fc2VnbWVudF90IGZzOworCWludCBydmFsOworI2lmbmRlZiBDT05GSUdfQkNNX0NTNDI5N0FfQ1NXQVJNCisJdTY0IGNmZzsKKwlpbnQgbWRpb192YWw7CisjZW5kaWYKKworCUNTX0RCR09VVChDU19JTklUIHwgQ1NfRlVOQ1RJT04sIDIsIHByaW50ayhLRVJOX0lORk8gCisJCSJjczQyOTdhOiBjczQyOTdhX2luaXRfbW9kdWxlKCkrIFxuIikpOworCisjaWZuZGVmIENPTkZJR19CQ01fQ1M0Mjk3QV9DU1dBUk0KKyAgICAgICAgbWRpb192YWwgPSBfX3Jhd19yZWFkcShLU0VHMSArIEFfTUFDX1JFR0lTVEVSKDIsIFJfTUFDX01ESU8pKSAmCisgICAgICAgICAgICAgICAgKE1fTUFDX01ESU9fRElSfE1fTUFDX01ESU9fT1VUKTsKKworICAgICAgICAvKiBDaGVjayBzeXNjZmcgZm9yIHN5bmNocm9ub3VzIHNlcmlhbCBvbiBwb3J0IDEgKi8KKyAgICAgICAgY2ZnID0gX19yYXdfcmVhZHEoS1NFRzEgKyBBX1NDRF9TWVNURU1fQ0ZHKTsKKyAgICAgICAgaWYgKCEoY2ZnICYgTV9TWVNfU0VSMV9FTkFCTEUpKSB7CisgICAgICAgICAgICAgICAgX19yYXdfd3JpdGVxKGNmZyB8IE1fU1lTX1NFUjFfRU5BQkxFLCBLU0VHMStBX1NDRF9TWVNURU1fQ0ZHKTsKKyAgICAgICAgICAgICAgICBjZmcgPSBfX3Jhd19yZWFkcShLU0VHMSArIEFfU0NEX1NZU1RFTV9DRkcpOworICAgICAgICAgICAgICAgIGlmICghKGNmZyAmIE1fU1lTX1NFUjFfRU5BQkxFKSkgeworICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogc2VyaWFsIHBvcnQgMSBub3QgY29uZmlndXJlZCBmb3Igc3luY2hyb25vdXMgb3BlcmF0aW9uXG4iKTsKKyAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBzZXJpYWwgcG9ydCAxIHN3aXRjaGluZyB0byBzeW5jaHJvbm91cyBvcGVyYXRpb25cbiIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8qIEZvcmNlIHRoZSBjb2RlYyAob24gU1dBUk0pIHRvIHJlc2V0IGJ5IGNsZWFyaW5nCisgICAgICAgICAgICAgICAgICAgR0VOTywgcHJlc2VydmluZyBNRElPIChubyBlZmZlY3Qgb24gQ1NXQVJNKSAqLworICAgICAgICAgICAgICAgIF9fcmF3X3dyaXRlcShtZGlvX3ZhbCwgS1NFRzErQV9NQUNfUkVHSVNURVIoMiwgUl9NQUNfTURJTykpOworICAgICAgICAgICAgICAgIHVkZWxheSgxMCk7CisgICAgICAgIH0KKworICAgICAgICAvKiBOb3cgc2V0IEdFTk8gKi8KKyAgICAgICAgX19yYXdfd3JpdGVxKG1kaW9fdmFsIHwgTV9NQUNfR0VOQywgS1NFRzErQV9NQUNfUkVHSVNURVIoMiwgUl9NQUNfTURJTykpOworICAgICAgICAvKiBHaXZlIHRoZSBjb2RlYyBzb21lIHRpbWUgdG8gZmluaXNoIHJlc2V0dGluZyAoc3RhcnQgdGhlIGJpdCBjbG9jaykgKi8KKyAgICAgICAgdWRlbGF5KDEwMCk7CisjZW5kaWYKKworCWlmICghKHMgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgY3M0Mjk3YV9zdGF0ZSksIEdGUF9LRVJORUwpKSkgeworCQlDU19EQkdPVVQoQ1NfRVJST1IsIDEsIHByaW50ayhLRVJOX0VSUgorCQkgICAgICAiY3M0Mjk3YTogcHJvYmUoKSBubyBtZW1vcnkgZm9yIHN0YXRlIHN0cnVjdC5cbiIpKTsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1zZXQocywgMCwgc2l6ZW9mKHN0cnVjdCBjczQyOTdhX3N0YXRlKSk7CisgICAgICAgIHMtPm1hZ2ljID0gQ1M0Mjk3YV9NQUdJQzsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFfYWRjLndhaXQpOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnMtPmRtYV9kYWMud2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2FkYy5yZWdfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+ZG1hX2RhYy5yZWdfd2FpdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmcy0+b3Blbl93YWl0KTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXRfYWRjKTsKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5vcGVuX3dhaXRfZGFjKTsKKwlpbml0X01VVEVYKCZzLT5vcGVuX3NlbV9hZGMpOworCWluaXRfTVVURVgoJnMtPm9wZW5fc2VtX2RhYyk7CisJc3Bpbl9sb2NrX2luaXQoJnMtPmxvY2spOworCisgICAgICAgIHMtPmlycSA9IEtfSU5UX1NFUl8xOworCisJaWYgKHJlcXVlc3RfaXJxCisJICAgIChzLT5pcnEsIGNzNDI5N2FfaW50ZXJydXB0LCAwLCAiQ3J5c3RhbCBDUzQyOTdhIiwgcykpIHsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwKKwkJCSAgcHJpbnRrKEtFUk5fRVJSICJjczQyOTdhOiBpcnEgJXUgaW4gdXNlXG4iLCBzLT5pcnEpKTsKKwkJZ290byBlcnJfaXJxOworCX0KKwlpZiAoKHMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmY3M0Mjk3YV9hdWRpb19mb3BzLCAtMSkpIDwKKwkgICAgMCkgeworCQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKKwkJCSAiY3M0Mjk3YTogcHJvYmUoKSByZWdpc3Rlcl9zb3VuZF9kc3AoKSBmYWlsZWQuXG4iKSk7CisJCWdvdG8gZXJyX2RldjE7CisJfQorCWlmICgocy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJmNzNDI5N2FfbWl4ZXJfZm9wcywgLTEpKSA8CisJICAgIDApIHsKKwkJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19FUlJPUiwgMSwgcHJpbnRrKEtFUk5fRVJSCisJCQkgImNzNDI5N2E6IHByb2JlKCkgcmVnaXN0ZXJfc291bmRfbWl4ZXIoKSBmYWlsZWQuXG4iKSk7CisJCWdvdG8gZXJyX2RldjI7CisJfQorCisgICAgICAgIGlmIChzZXJfaW5pdChzKSB8fCBkbWFfaW5pdChzKSkgeworCQlDU19EQkdPVVQoQ1NfSU5JVCB8IENTX0VSUk9SLCAxLCBwcmludGsoS0VSTl9FUlIKKwkJCSAiY3M0Mjk3YTogc2VyX2luaXQgZmFpbGVkLlxuIikpOworCQlnb3RvIGVycl9kZXYzOworICAgICAgICB9CisKKyAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHVkZWxheSg0MDAwKTsKKyAgICAgICAgICAgICAgICBydmFsID0gY3M0Mjk3YV9yZWFkX2FjOTcocywgQUM5N19QT1dFUl9DT05UUk9MLCAmcHdyKTsKKyAgICAgICAgfSB3aGlsZSAoIXJ2YWwgJiYgKHB3ciAhPSAweGYpKTsKKworICAgICAgICBpZiAoIXJ2YWwpIHsKKwkJY2hhciAqc2IxMjUwX2R1YXJ0X3ByZXNlbnQ7CisKKyAgICAgICAgICAgICAgICBmcyA9IGdldF9mcygpOworICAgICAgICAgICAgICAgIHNldF9mcyhLRVJORUxfRFMpOworI2lmIDAKKyAgICAgICAgICAgICAgICB2YWwgPSBTT1VORF9NQVNLX0xJTkU7CisgICAgICAgICAgICAgICAgbWl4ZXJfaW9jdGwocywgU09VTkRfTUlYRVJfV1JJVEVfUkVDU1JDLCAodW5zaWduZWQgbG9uZykgJnZhbCk7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihpbml0dm9sKSAvIHNpemVvZihpbml0dm9sWzBdKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBpbml0dm9sW2ldLnZvbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peGVyX2lvY3RsKHMsIGluaXR2b2xbaV0ubWl4Y2gsICh1bnNpZ25lZCBsb25nKSAmdmFsKTsKKyAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgICAgICBjczQyOTdhX3dyaXRlX2FjOTcocywgMHgxOCwgMHgwODA4KTsKKyNlbHNlCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgY3M0Mjk3YV93cml0ZV9hYzk3KHMsIDB4NWUsIDB4MTgwKTsKKyAgICAgICAgICAgICAgICBjczQyOTdhX3dyaXRlX2FjOTcocywgMHgwMiwgMHgwODA4KTsKKyAgICAgICAgICAgICAgICBjczQyOTdhX3dyaXRlX2FjOTcocywgMHgxOCwgMHgwODA4KTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHNldF9mcyhmcyk7CisKKyAgICAgICAgICAgICAgICBsaXN0X2FkZCgmcy0+bGlzdCwgJmNzNDI5N2FfZGV2cyk7CisKKyAgICAgICAgICAgICAgICBjczQyOTdhX3JlYWRfYWM5NyhzLCBBQzk3X1ZFTkRPUl9JRDEsICZpZCk7CisKKwkJc2IxMjUwX2R1YXJ0X3ByZXNlbnQgPSBzeW1ib2xfZ2V0KHNiMTI1MF9kdWFydF9wcmVzZW50KTsKKwkJaWYgKHNiMTI1MF9kdWFydF9wcmVzZW50KQorCQkJc2IxMjUwX2R1YXJ0X3ByZXNlbnRbMV0gPSAwOworCisgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogaW5pdGlhbGl6ZWQgKHZlbmRvciBpZCA9ICV4KVxuIiwgaWQpOworCisgICAgICAgICAgICAgICAgQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogY3M0Mjk3YV9pbml0X21vZHVsZSgpLVxuIikpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyBlcnJfZGV2MzoKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKHMtPmRldl9taXhlcik7CisgZXJyX2RldjI6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3Aocy0+ZGV2X2F1ZGlvKTsKKyBlcnJfZGV2MToKKwlmcmVlX2lycShzLT5pcnEsIHMpOworIGVycl9pcnE6CisJa2ZyZWUocyk7CisKKyAgICAgICAgcHJpbnRrKEtFUk5fSU5GTyAiY3M0Mjk3YTogaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKKworICAgICAgICByZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjczQyOTdhX2NsZWFudXAodm9pZCkKK3sKKyAgICAgICAgLyoKKyAgICAgICAgICBYWFhLVyAKKyAgICAgICAgICAgZGlzYWJsZV9pcnEsIGZyZWVfaXJxCisgICAgICAgICAgIGRyYWluIERNQSBxdWV1ZQorICAgICAgICAgICBkaXNhYmxlIERNQQorICAgICAgICAgICBkaXNhYmxlIFRYL1JYCisgICAgICAgICAgIGZyZWUgbWVtb3J5CisgICAgICAgICovCisJQ1NfREJHT1VUKENTX0lOSVQgfCBDU19GVU5DVElPTiwgMiwKKwkJICBwcmludGsoS0VSTl9JTkZPICJjczQyOTdhOiBjbGVhbnVwX2NzNDI5N2EoKSBmaW5pc2hlZFxuIikpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gCisKK01PRFVMRV9BVVRIT1IoIktpcCBXYWxrZXIsIEJyb2FkY29tIENvcnAuIik7CitNT0RVTEVfREVTQ1JJUFRJT04oIkNpcnJ1cyBMb2dpYyBDUzQyOTdhIERyaXZlciBmb3IgQnJvYWRjb20gU1dBUk0gYm9hcmQiKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIAorCittb2R1bGVfaW5pdChjczQyOTdhX2luaXQpOworbW9kdWxlX2V4aXQoY3M0Mjk3YV9jbGVhbnVwKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy9zeXNfdGltZXIuYyBiL3NvdW5kL29zcy9zeXNfdGltZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWZlMjliCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3N5c190aW1lci5jCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogc291bmQvc3lzX3RpbWVyLmMKKyAqCisgKiBUaGUgZGVmYXVsdCB0aW1lciBmb3IgdGhlIExldmVsIDIgc2VxdWVuY2VyIGludGVyZmFjZQorICogVXNlcyB0aGUgKDEvSFogc2VjKSB0aW1lciBvZiBrZXJuZWwuCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqLworLyoKKyAqIFRob21hcyBTYWlsZXIgICA6IGlvY3RsIGNvZGUgcmV3b3JrZWQgKHZtYWxsb2MvdmZyZWUgcmVtb3ZlZCkKKyAqIEFuZHJldyBWZWxpYXRoICA6IGFkYXB0ZWQgdG1yMnRpY2tzIGZyb20gbGV2ZWwgMSBzZXF1ZW5jZXIgKGF2b2lkIG92ZXJmbG93KQorICovCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworc3RhdGljIHZvbGF0aWxlIGludCBvcGVuZWQsIHRtcl9ydW5uaW5nOworc3RhdGljIHZvbGF0aWxlIHRpbWVfdCB0bXJfb2ZmcywgdG1yX2N0cjsKK3N0YXRpYyB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHRpY2tzX29mZnM7CitzdGF0aWMgdm9sYXRpbGUgaW50IGN1cnJfdGVtcG8sIGN1cnJfdGltZWJhc2U7CitzdGF0aWMgdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBjdXJyX3RpY2tzOworc3RhdGljIHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgbmV4dF9ldmVudF90aW1lOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9ldmVudF90aW1lOworCitzdGF0aWMgdm9pZCAgICAgcG9sbF9kZWZfdG1yKHVuc2lnbmVkIGxvbmcgZHVtbXkpOworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IGRlZl90bXIgPSBUSU1FUl9JTklUSUFMSVpFUihwb2xsX2RlZl90bXIsIDAsIDApOworCitzdGF0aWMgdW5zaWduZWQgbG9uZwordG1yMnRpY2tzKGludCB0bXJfdmFsdWUpCit7CisJLyoKKwkgKiAgICBDb252ZXJ0IHRpbWVyIHRpY2tzIHRvIE1JREkgdGlja3MKKwkgKi8KKworCXVuc2lnbmVkIGxvbmcgdG1wOworCXVuc2lnbmVkIGxvbmcgc2NhbGU7CisKKwkvKiB0bXJfdmFsdWUgKHRpY2tzIHBlciBzZWMpICoKKwkgICAxMDAwMDAwICh1c2VjcyBwZXIgc2VjKSAvIEhaICh0aWNrcyBwZXIgc2VjKSAtPT4gdXNlY3MgKi8KKwl0bXAgPSB0bXJfdmFsdWUgKiAoMTAwMDAwMCAvIEhaKTsKKwlzY2FsZSA9ICg2MCAqIDEwMDAwMDApIC8gKGN1cnJfdGVtcG8gKiBjdXJyX3RpbWViYXNlKTsJLyogdXNlY3MgcGVyIE1JREkgdGljayAqLworCXJldHVybiAodG1wICsgc2NhbGUgLyAyKSAvIHNjYWxlOworfQorCitzdGF0aWMgdm9pZAorcG9sbF9kZWZfdG1yKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisKKwlpZiAob3BlbmVkKQorCSAgeworCisJCSAgeworCQkJICBkZWZfdG1yLmV4cGlyZXMgPSAoMSkgKyBqaWZmaWVzOworCQkJICBhZGRfdGltZXIoJmRlZl90bXIpOworCQkgIH07CisKKwkJICBpZiAodG1yX3J1bm5pbmcpCisJCSAgICB7CisJCQkJc3Bpbl9sb2NrKCZsb2NrKTsKKwkJCSAgICB0bXJfY3RyKys7CisJCQkgICAgY3Vycl90aWNrcyA9IHRpY2tzX29mZnMgKyB0bXIydGlja3ModG1yX2N0cik7CisKKwkJCSAgICBpZiAoY3Vycl90aWNrcyA+PSBuZXh0X2V2ZW50X3RpbWUpCisJCQkgICAgICB7CisJCQkJICAgICAgbmV4dF9ldmVudF90aW1lID0gKHVuc2lnbmVkIGxvbmcpIC0xOworCQkJCSAgICAgIHNlcXVlbmNlcl90aW1lcigwKTsKKwkJCSAgICAgIH0KKwkJCQlzcGluX3VubG9jaygmbG9jayk7CisJCSAgICB9CisJICB9Cit9CisKK3N0YXRpYyB2b2lkCit0bXJfcmVzZXQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nICAgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisJdG1yX29mZnMgPSAwOworCXRpY2tzX29mZnMgPSAwOworCXRtcl9jdHIgPSAwOworCW5leHRfZXZlbnRfdGltZSA9ICh1bnNpZ25lZCBsb25nKSAtMTsKKwlwcmV2X2V2ZW50X3RpbWUgPSAwOworCWN1cnJfdGlja3MgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgaW50CitkZWZfdG1yX29wZW4oaW50IGRldiwgaW50IG1vZGUpCit7CisJaWYgKG9wZW5lZCkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXRtcl9yZXNldCgpOworCWN1cnJfdGVtcG8gPSA2MDsKKwljdXJyX3RpbWViYXNlID0gMTAwOworCW9wZW5lZCA9IDE7CisKKwk7CisKKwl7CisJCWRlZl90bXIuZXhwaXJlcyA9ICgxKSArIGppZmZpZXM7CisJCWFkZF90aW1lcigmZGVmX3Rtcik7CisJfTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorZGVmX3Rtcl9jbG9zZShpbnQgZGV2KQoreworCW9wZW5lZCA9IHRtcl9ydW5uaW5nID0gMDsKKwlkZWxfdGltZXIoJmRlZl90bXIpOworfQorCitzdGF0aWMgaW50CitkZWZfdG1yX2V2ZW50KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKmV2ZW50KQoreworCXVuc2lnbmVkIGNoYXIgICBjbWQgPSBldmVudFsxXTsKKwl1bnNpZ25lZCBsb25nICAgcGFybSA9ICooaW50ICopICZldmVudFs0XTsKKworCXN3aXRjaCAoY21kKQorCSAgeworCSAgY2FzZSBUTVJfV0FJVF9SRUw6CisJCSAgcGFybSArPSBwcmV2X2V2ZW50X3RpbWU7CisJICBjYXNlIFRNUl9XQUlUX0FCUzoKKwkJICBpZiAocGFybSA+IDApCisJCSAgICB7CisJCQkgICAgbG9uZyAgICAgICAgICAgIHRpbWU7CisKKwkJCSAgICBpZiAocGFybSA8PSBjdXJyX3RpY2tzKQkvKiBJdCdzIHRoZSB0aW1lICovCisJCQkJICAgIHJldHVybiBUSU1FUl9OT1RfQVJNRUQ7CisKKwkJCSAgICB0aW1lID0gcGFybTsKKwkJCSAgICBuZXh0X2V2ZW50X3RpbWUgPSBwcmV2X2V2ZW50X3RpbWUgPSB0aW1lOworCisJCQkgICAgcmV0dXJuIFRJTUVSX0FSTUVEOworCQkgICAgfQorCQkgIGJyZWFrOworCisJICBjYXNlIFRNUl9TVEFSVDoKKwkJICB0bXJfcmVzZXQoKTsKKwkJICB0bXJfcnVubmluZyA9IDE7CisJCSAgYnJlYWs7CisKKwkgIGNhc2UgVE1SX1NUT1A6CisJCSAgdG1yX3J1bm5pbmcgPSAwOworCQkgIGJyZWFrOworCisJICBjYXNlIFRNUl9DT05USU5VRToKKwkJICB0bXJfcnVubmluZyA9IDE7CisJCSAgYnJlYWs7CisKKwkgIGNhc2UgVE1SX1RFTVBPOgorCQkgIGlmIChwYXJtKQorCQkgICAgeworCQkJICAgIGlmIChwYXJtIDwgOCkKKwkJCQkgICAgcGFybSA9IDg7CisJCQkgICAgaWYgKHBhcm0gPiAzNjApCisJCQkJICAgIHBhcm0gPSAzNjA7CisJCQkgICAgdG1yX29mZnMgPSB0bXJfY3RyOworCQkJICAgIHRpY2tzX29mZnMgKz0gdG1yMnRpY2tzKHRtcl9jdHIpOworCQkJICAgIHRtcl9jdHIgPSAwOworCQkJICAgIGN1cnJfdGVtcG8gPSBwYXJtOworCQkgICAgfQorCQkgIGJyZWFrOworCisJICBjYXNlIFRNUl9FQ0hPOgorCQkgIHNlcV9jb3B5X3RvX2lucHV0KGV2ZW50LCA4KTsKKwkJICBicmVhazsKKworCSAgZGVmYXVsdDo7CisJICB9CisKKwlyZXR1cm4gVElNRVJfTk9UX0FSTUVEOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZworZGVmX3Rtcl9nZXRfdGltZShpbnQgZGV2KQoreworCWlmICghb3BlbmVkKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBjdXJyX3RpY2tzOworfQorCisvKiBzYW1lIGFzIHNvdW5kX3RpbWVyLmM6dGltZXJfaW9jdGwhPyAqLworc3RhdGljIGludCBkZWZfdG1yX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IF9fdXNlciAqcCA9IGFyZzsKKwlpbnQgdmFsOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORENUTF9UTVJfU09VUkNFOgorCQlyZXR1cm4gX19wdXRfdXNlcihUTVJfSU5URVJOQUwsIHApOworCisJY2FzZSBTTkRDVExfVE1SX1NUQVJUOgorCQl0bXJfcmVzZXQoKTsKKwkJdG1yX3J1bm5pbmcgPSAxOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX1RNUl9TVE9QOgorCQl0bXJfcnVubmluZyA9IDA7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfVE1SX0NPTlRJTlVFOgorCQl0bXJfcnVubmluZyA9IDE7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfVE1SX1RJTUVCQVNFOgorCQlpZiAoX19nZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwpIHsKKwkJCWlmICh2YWwgPCAxKQorCQkJCXZhbCA9IDE7CisJCQlpZiAodmFsID4gMTAwMCkKKwkJCQl2YWwgPSAxMDAwOworCQkJY3Vycl90aW1lYmFzZSA9IHZhbDsKKwkJfQorCQlyZXR1cm4gX19wdXRfdXNlcihjdXJyX3RpbWViYXNlLCBwKTsKKworCWNhc2UgU05EQ1RMX1RNUl9URU1QTzoKKwkJaWYgKF9fZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlpZiAodmFsKSB7CisJCQlpZiAodmFsIDwgOCkKKwkJCQl2YWwgPSA4OworCQkJaWYgKHZhbCA+IDI1MCkKKwkJCQl2YWwgPSAyNTA7CisJCQl0bXJfb2ZmcyA9IHRtcl9jdHI7CisJCQl0aWNrc19vZmZzICs9IHRtcjJ0aWNrcyh0bXJfY3RyKTsKKwkJCXRtcl9jdHIgPSAwOworCQkJY3Vycl90ZW1wbyA9IHZhbDsKKwkJCXJlcHJvZ3JhbV90aW1lcigpOworCQl9CisJCXJldHVybiBfX3B1dF91c2VyKGN1cnJfdGVtcG8sIHApOworCisJY2FzZSBTTkRDVExfU0VRX0NUUkxSQVRFOgorCQlpZiAoX19nZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWlmICh2YWwgIT0gMCkJLyogQ2FuJ3QgY2hhbmdlICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJdmFsID0gKChjdXJyX3RlbXBvICogY3Vycl90aW1lYmFzZSkgKyAzMCkgLyA2MDsKKwkJcmV0dXJuIF9fcHV0X3VzZXIodmFsLCBwKTsKKwkJCisJY2FzZSBTTkRDVExfU0VRX0dFVFRJTUU6CisJCXJldHVybiBfX3B1dF91c2VyKGN1cnJfdGlja3MsIHApOworCQkKKwljYXNlIFNORENUTF9UTVJfTUVUUk9OT01FOgorCQkvKiBOT1AgKi8KKwkJYnJlYWs7CisJCQorCWRlZmF1bHQ6OworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHZvaWQKK2RlZl90bXJfYXJtKGludCBkZXYsIGxvbmcgdGltZSkKK3sKKwlpZiAodGltZSA8IDApCisJCXRpbWUgPSBjdXJyX3RpY2tzICsgMTsKKwllbHNlIGlmICh0aW1lIDw9IGN1cnJfdGlja3MpCS8qIEl0J3MgdGhlIHRpbWUgKi8KKwkJcmV0dXJuOworCisJbmV4dF9ldmVudF90aW1lID0gcHJldl9ldmVudF90aW1lID0gdGltZTsKKworCXJldHVybjsKK30KKworc3RydWN0IHNvdW5kX3RpbWVyX29wZXJhdGlvbnMgZGVmYXVsdF9zb3VuZF90aW1lciA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pbmZvCQk9IHsiU3lzdGVtIGNsb2NrIiwgMH0sCisJLnByaW9yaXR5CT0gMCwJLyogUHJpb3JpdHkgKi8KKwkuZGV2bGluawk9IDAsCS8qIExvY2FsIGRldmljZSBsaW5rICovCisJLm9wZW4JCT0gZGVmX3Rtcl9vcGVuLAorCS5jbG9zZQkJPSBkZWZfdG1yX2Nsb3NlLAorCS5ldmVudAkJPSBkZWZfdG1yX2V2ZW50LAorCS5nZXRfdGltZQk9IGRlZl90bXJfZ2V0X3RpbWUsCisJLmlvY3RsCQk9IGRlZl90bXJfaW9jdGwsCisJLmFybV90aW1lcgk9IGRlZl90bXJfYXJtCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3RyaWRlbnQuYyBiL3NvdW5kL29zcy90cmlkZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1MzdmMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy90cmlkZW50LmMKQEAgLTAsMCArMSw0NjI4IEBACisvKgorICoJT1NTIGRyaXZlciBmb3IgTGludXggMi5bNDZdLnggZm9yCisgKgorICoJVHJpZGVudCA0RC1XYXZlCisgKglTaVMgNzAxOAorICoJQUxpIDU0NTEKKyAqCVR2aWEvSUdTVCBDeWJlclBybyA1MDUwCisgKgorICoJRHJpdmVyOiBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICoKKyAqICBCdWlsdCBmcm9tOgorICoJTG93IGxldmVsIGNvZGU6IDxhdWRpb0B0cmlkZW50bWljcm8uY29tPiBmcm9tIEFMU0EKKyAqCUZyYW1ld29yazogVGhvbWFzIFNhaWxlciA8c2FpbGVyQGlmZS5lZS5ldGh6LmNoPgorICoJRXh0ZW5kZWQgYnk6IFphY2ggQnJvd24gPHphYkByZWRoYXQuY29tPiAgCisgKgorICogIEhhY2tlZCB1cCBieToKKyAqCUFhcm9uIEhvbHR6bWFuIDxhaG9sdHptYUBlc3MuZW5nci51dmljLmNhPgorICoJT2xsaWUgTGhvIDxvbGxpZUBzaXMuY29tLnR3PiBTaVMgNzAxOCBBdWRpbyBDb3JlIFN1cHBvcnQKKyAqCUNoaW5nLUxpbmcgTGVlIDxjbGluZy1saUBhbGkuY29tLnR3PiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQgCisgKglNYXR0IFd1IDxtYXR0d3VAYWNlcnNvZnRlY2guY29tLmNuPiBBTGkgNTQ1MSBBdWRpbyBDb3JlIFN1cHBvcnQKKyAqCVBldGVyIFfkY2h0bGVyIDxwd2FlY2h0bGVyQGxvZXdlLWtvbXAuZGU+IEN5YmVyUHJvNTA1MCBzdXBwb3J0CisgKiAgICAgIE11bGkgQmVuLVllaHVkYSA8bXVsaXhAbXVsaXgub3JnPgorICoKKyAqCisgKglUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICoJaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqCXRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKgkoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqCUdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqCWFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiAgSGlzdG9yeQorICogIHYwLjE0LjEwagorICogIAlKYW51YXJ5IDMgMjAwNCBFdWdlbmUgVGVvIDxldWdlbmV0ZW9AZXVnZW5ldGVvLm5ldD4KKyAqICAJbWlub3IgY2xlYW51cCB0byB1c2UgcHJfZGVidWcgaW5zdGVhZCBvZiBUUkRCRyBzaW5jZSBpdCBpcyBhbHJlYWR5CisgKiAgCWRlZmluZWQgaW4gbGludXgva2VybmVsLmguCisgKiAgdjAuMTQuMTBpCisgKiAgICAgIERlY2VtYmVyIDI5IDIwMDMgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBtdWxpeC5vcmc+CisgKiAgICAgIG1ham9yIGNsZWFudXAgZm9yIDIuNiwgZml4IGEgZmV3IGVycm9yIHBhdGNoIGJ1Z2xldHMKKyAqICAgICAgd2l0aCByZXR1cm5pbmcgd2l0aG91dCBwcm9wZXJseSBjbGVhbmluZyB1cCBmaXJzdCwKKyAqICAgICAgZ2V0IHJpZCBvZiBsb2NrX2tlcm5lbCgpLgorICogIHYwLjE0LjEwaAorICoJU2VwdCAxMCAyMDAyIFBhc2NhbCBTY2htaWR0IDxkZXIuZXJlbWl0QGVtYWlsLmRlPgorICoJYWRkZWQgc3VwcG9ydCBmb3IgQUxpIDU0NTEgam95c3RpY2sgcG9ydAorICogIHYwLjE0LjEwZworICoJU2VwdCAwNSAyMDAyIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+CisgKglhZGFwdCB0byBuZXcgcGNpIGpveXN0aWNrIGF0dGFjaG1lbnQgaW50ZXJmYWNlCisgKiAgdjAuMTQuMTBmCisgKiAgICAgIEp1bHkgMjQgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KKyAqICAgICAgcGF0Y2ggZnJvbSBFcmljIExlbWFyICh2aWEgSWFuIFNvYm9yb2ZmKTogaW4gc3VzcGVuZCBhbmQgcmVzdW1lLCAKKyAqICAgICAgZml4IHdyb25nIGNhc3QgZnJvbSBwY2lfZGV2KiB0byBzdHJ1Y3QgdHJpZGVudF9jYXJkKi4gCisgKiAgdjAuMTQuMTBlCisgKiAgICAgIEp1bHkgMTkgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KKyAqICAgICAgcmV3cml0ZSB0aGUgRE1BIGJ1ZmZlciBhbGxvY2F0aW9uL2RlYWxsY29hdGlvbiBmdW5jdGlvbnMsIHRvIG1ha2UgaXQgCisgKiAgICAgIG1vZHVsYXIgYW5kIGZpeCBhIGJ1ZyB3aGVyZSB3ZSB3b3VsZCBjYWxsIGZyZWVfcGFnZXMgb24gbWVtb3J5IAorICogICAgICBvYnRhaW5lZCB3aXRoIHBjaV9hbGxvY19jb25zaXN0ZW50LiBBbHNvIHJlbW92ZSB1bm5lY2Vzc2FyeSAjaWZkZWYgCisgKiAgICAgIENPTkZJR19QUk9DX0ZTIGFuZCB2YXJpb3VzIG90aGVyIGNsZWFudXBzLgorICogIHYwLjE0LjEwZAorICogICAgICBKdWx5IDE5IDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+CisgKiAgICAgIG1hZGUgc2V2ZXJhbCBwcmludGsoS0VSTl9OT1RJQ0UuLi4pIGludG8gVFJEQkcoLi4uKSwgdG8gYXZvaWQgc3BhbW1pbmcKKyAqICAgICAgbXkgc3lzbG9nIHdpdGggaHVuZHJlZHMgb2YgbWVzc2FnZXMuIAorICogIHYwLjE0LjEwYworICogICAgICBKdWx5IDE2IDIwMDIgTXVsaSBCZW4tWWVodWRhIDxtdWxpeEBhY3Rjb20uY28uaWw+CisgKiAgICAgIENsZWFuZWQgdXAgTGVpIEh1J3MgMC40LjEwIGRyaXZlciB0byBjb25mb3JtIHRvIERvY3VtZW50YXRpb24vQ29kaW5nU3R5bGUKKyAqICAgICAgYW5kIHRoZSBjb2Rpbmcgc3R5bGUgdXNlZCBpbiB0aGUgcmVzdCBvZiB0aGUgZmlsZS4gCisgKiAgdjAuMTQuMTBiCisgKiAgICAgIEp1bmUgMjMgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4KKyAqICAgICAgYWRkIGEgbWlzc2luZyB1bmxvY2tfc2V0X2ZtdCwgcmVtb3ZlIGEgc3VwZXJmbG91cyBsb2NrL3VubG9jayBwYWlyIAorICogICAgICB3aXRoIG5vdGhpbmcgaW4gYmV0d2Vlbi4gCisgKiAgdjAuMTQuMTBhCisgKiAgICAgIEp1bmUgMjEgMjAwMiBNdWxpIEJlbi1ZZWh1ZGEgPG11bGl4QGFjdGNvbS5jby5pbD4gCisgKiAgICAgIHVzZSBhIGRlYnVnIG1hY3JvIGluc3RlYWQgb2YgI2lmZGVmIENPTkZJR19ERUJVRywgdHJpbSB0byA4MCBjb2x1bW5zIAorICogICAgICBwZXIgbGluZSwgdXNlICdkbyB7fSB3aGlsZSAoMCknIGluIHN0YXRlbWVudCBtYWNyb3MuIAorICogIHYwLjE0LjEwCisgKiAgICAgIEp1bmUgNiAyMDAyIExlaSBIdSA8TGVpX2h1QGFsaS5jb20udHc+CisgKiAgICAgIHJld3JpdGUgdGhlIHBhcnQgdG8gcmVhZC93cml0ZSByZWdpc3RlcnMgb2YgYXVkaW8gY29kZWMgZm9yIEFsaTU0NTEgCisgKiAgdjAuMTQuOWUKKyAqICAgICAgSmFudWFyeSAyIDIwMDIgVm9qdGVjaCBQYXZsaWsgPHZvanRlY2hAdWN3LmN6PiBhZGRlZCBnYW1lcG9ydAorICogICAgICBzdXBwb3J0IHRvIGF2b2lkIHJlc291cmNlIGNvbmZsaWN0IHdpdGggcGNpZ2FtZS5jCisgKiAgdjAuMTQuOWQKKyAqICAJT2N0b2JlciA4IDIwMDEgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKgl1c2Ugc2V0X2N1cnJlbnRfc3RhdGUsIHByb3Blcmx5IHJlbGVhc2UgcmVzb3VyY2VzIG9uIGZhaWx1cmUgaW4KKyAqCXRyaWRlbnRfcHJvYmUsIGdldCByaWQgb2YgY2hlY2tfcmVnaW9uCisgKiAgdjAuMTQuOWMKKyAqCUF1Z3VzdCAxMCAyMDAxIFBldGVyIFfkY2h0bGVyIDxwd2FlY2h0bGVyQGxvZXdlLWtvbXAuZGU+CisgKglhZGRlZCBzdXBwb3J0IGZvciBUdmlhIChmb3JtZXJseSBJbnRlZ3JhcGhpY3MvSUdTVCkgQ3liZXJQcm81MDUwCisgKgl0aGlzIGNoaXAgaXMgb2Z0ZW4gZm91bmQgaW4gc2V0dG9wIGJveGVzIChjb21iaW5lZCB2aWRlbythdWRpbykKKyAqICB2MC4xNC45YgorICoJU3dpdGNoIHRvIHN0YXRpYyBpbmxpbmUgbm90IGV4dGVybiBpbmxpbmUgKGdjYyAzKQorICogIHYwLjE0LjlhCisgKglBdWcgNiAyMDAxIEFsYW4gQ294CisgKgkwLjE0LjkgY3Jhc2hlZCBvbiBybW1vZCBkdWUgdG8gYSB0aW1lci9iaCBsZWZ0IHJ1bm5pbmcuIFNpbXBsaWZpZWQKKyAqCXRoZSBleGlzdGluZyBsb2dpYyAodGhlIEJIIGRvZXNuJ3QgaGVscCBhcyBhYzk3IGlzIGxvY2tfaXJxc2F2ZSkKKyAqCWFuZCB1c2VkIGRlbF90aW1lcl9zeW5jIHRvIGNsZWFuIHVwCisgKglGaXhlZCBhIHByb2JsZW0gd2hlcmUgdGhlIEFMaSBjaGFuZ2UgYnJva2UgbXkgZ2VuZXJpYyBjYXJkCisgKiAgdjAuMTQuOQorICoJSnVsIDEwIDIwMDEgTWF0dCBXdQorICoJQWRkIEgvVyBWb2x1bWUgQ29udHJvbAorICogIHYwLjE0LjhhCisgKglKdWx5IDcgMjAwMSBBbGFuIENveAorICoJTW92ZWQgTWF0dCBXdSdzIGFjOTcgcmVnaXN0ZXIgY2FjaGUgaW50byB0aGUgY2FyZCBzdHJ1Y3R1cmUKKyAqICB2MC4xNC44CisgKglBcHIgMzAgMjAwMSBNYXR0IFd1CisgKglTZXQgRUJVRjEgYW5kIEVCVUYyIHRvIHN0aWxsIG1vZGUKKyAqCUFkZCBkYzk3L2FjOTcgcmVzZXQgZnVuY3Rpb24KKyAqCUZpeCBwb3dlciBtYW5hZ2VtZW50OiBhbGlfcmVzdG9yZV9yZWdzCisgKiAgdW5yZWxlYXNlZCAKKyAqCU1hciAwOSAyMDAxIE1hdHQgV3UKKyAqCUFkZCBjYWNoZSBmb3IgYWM5NyBhY2Nlc3MKKyAqICB2MC4xNC43CisgKglGZWIgMDYgMjAwMSBNYXR0IFd1CisgKglGaXggYWM5NyBpbml0aWFsaXphdGlvbgorICoJRml4IGJ1ZzogYW4gZXh0cmEgdGFpbCB3aWxsIGJlIHBsYXllZCB3aGVuIHBsYXlpbmcKKyAqCUphbiAwNSAyMDAxIE1hdHQgV3UKKyAqCUltcGxlbWVudCBtdWx0aS1jaGFubmVscyBhbmQgUy9QRElGIGluIHN1cHBvcnQgZm9yIEFMaSAxNTM1KworICogIHYwLjE0LjYgCisgKglOb3YgMSAyMDAwIENoaW5nLUxpbmcgTGVlCisgKglGaXggdGhlIGJ1ZyBvZiBtZW1vcnkgbGVhayB3aGVuIHN3aXRjaGluZyA1LjEtY2hhbm5lbHMgdG8gMiBjaGFubmVscy4KKyAqCUFkZCBsb2NrIHByb3RlY3Rpb24gaW50byBkeW5hbWljIGNoYW5naW5nIGZvcm1hdCBvZiBkYXRhLgorICoJT2N0IDE4IDIwMDAgQ2hpbmctTGluZyBMZWUKKyAqCTUuMS1jaGFubmVscyBzdXBwb3J0IGZvciBBTGkKKyAqCUp1bmUgMjggMjAwMCBDaGluZy1MaW5nIExlZQorICoJUy9QRElGIG91dC9pbihwbGF5YmFjay9yZWNvcmQpIHN1cHBvcnQgZm9yIEFMaSAxNTM1KywgdXNpbmcgL3Byb2MgdG8gYmUgc2VsZWN0ZWQgYnkgdXNlcgorICoJU2ltcGxlIFBvd2VyIE1hbmFnZW1lbnQgc3VwcG9ydCBmb3IgQUxpCisgKiAgdjAuMTQuNSBNYXkgMjMgMjAwMCBPbGxpZSBMaG8KKyAqICAJTWlzYyBidWcgZml4IGZyb20gdGhlIE5ldAorICogIHYwLjE0LjQgTWF5IDIwIDIwMDAgQWFyb24gSG9sdHptYW4KKyAqICAJRml4IGtmcmVlJ2QgbWVtb3J5IGFjY2VzcyBpbiByZWxlYXNlCisgKiAgCUZpeCByYWNlIGluIG9wZW4gd2hpbGUgbG9va2luZyBmb3IgYSBmcmVlIHZpcnR1YWwgY2hhbm5lbCBzbG90CisgKiAgCXJlbW92ZSBvcGVuX3dhaXQgd3EgKHdoaWNoIGFwcGVhcnMgdG8gYmUgdW51c2VkKQorICogIHYwLjE0LjMgTWF5IDEwIDIwMDAgT2xsaWUgTGhvCisgKglmaXhlZCBhIHNtYWxsIGJ1ZyBpbiB0cmlkZW50X3VwZGF0ZV9wdHIsIHhtbXMgMS4wLjEgbm8gbG9uZ2VyIHVzZXMgMTAwJSBDUFUKKyAqICB2MC4xNC4yIE1hciAyOSAyMDAwIENoaW5nLUxpbmcgTGVlCisgKglBZGQgY2xlYXIgdG8gc2lsZW5jZSBhZHZhbmNlIGluIHRyaWRlbnRfdXBkYXRlX3B0ciAKKyAqCWZpeCBpbnZhbGlkIGRhdGEgb2YgdGhlIGVuZCBvZiB0aGUgc291bmQKKyAqICB2MC4xNC4xIE1hciAyNCAyMDAwIENoaW5nLUxpbmcgTGVlCisgKglBTGkgNTQ1MSBzdXBwb3J0IGFkZGVkLCBwbGF5YmFjayBhbmQgcmVjb3JkaW5nIE8uSy4KKyAqCUFMaSA1NDUxIG9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBzdHJ1Y3R1cmVkIGJhc2VkIG9uIHNvbmljdmliZXMsIGFuZAorICoJc3VnZ2VzdGVkIHRvIG1lcmdlIGludG8gdGhpcyBmaWxlIGJ5IEFsYW4gQ294LgorICogIHYwLjE0IE1hciAxNSAyMDAwIE9sbGllIExobworICoJNS4xIGNoYW5uZWwgb3V0cHV0IHN1cHBvcnQgd2l0aCBjaGFubmVsIGJpbmRpbmcuIFdoYXQncyB0aGUgTWF0cml4ID8KKyAqICB2MC4xMy4xIE1hciAxMCAyMDAwIE9sbGllIExobworICoJZmV3IG1pbm9yIGJ1Z3Mgb24gZHVhbCBjb2RlYyBzdXBwb3J0LCBuZWVkcyBtb3JlIHRlc3RpbmcKKyAqICB2MC4xMyBNYXIgMDMgMjAwMCBPbGxpZSBMaG8KKyAqCW5ldyBwY2lfKiBmb3IgMi40IGtlcm5lbCwgYmFjayBwb3J0ZWQgdG8gMi4yCisgKiAgdjAuMTIgRmViIDIzIDIwMDAgT2xsaWUgTGhvCisgKglQcmVsaW1pbmFyeSBSZWNvcmRpbmcgc3VwcG9ydAorICogIHYwLjExLjIgRmViIDE5IDIwMDAgT2xsaWUgTGhvCisgKglyZW1vdmVkIGluY29tcGxldGUgZnVsbC1kdWxwbGV4IHN1cHBvcnQKKyAqICB2MC4xMS4xIEphbiAyOCAyMDAwIE9sbGllIExobworICoJc21hbGwgYnVnIGluIHNldHRpbmcgc2FtcGxlIHJhdGUgZm9yIDRkLW54IChyZXBvcnRlZCBieSBBYXJvbikKKyAqICB2MC4xMSBKYW4gMjcgMjAwMCBPbGxpZSBMaG8KKyAqCURNQSBidWcsIHNjaGVkdWxlciBsYXRlbmN5LCBzZWNvbmQgdHJ5CisgKiAgdjAuMTAgSmFuIDI0IDIwMDAgT2xsaWUgTGhvCisgKglETUEgYnVnIGZpeGVkLCBmb3VuZCBrZXJuZWwgc2NoZWR1bGluZyBwcm9ibGVtCisgKiAgdjAuMDkgSmFuIDIwIDIwMDAgT2xsaWUgTGhvCisgKglDbGVhbiB1cCBvZiBjaGFubmVsIHJlZ2lzdGVyIGFjY2VzcyByb3V0aW5lIChwcmVwYXJlIGZvciBjaGFubmVsIGJpbmRpbmcpCisgKiAgdjAuMDggSmFuIDE0IDIwMDAgT2xsaWUgTGhvCisgKglJc29sYXRpb24gb2YgQUM5NyBjb2RlYyBjb2RlCisgKiAgdjAuMDcgSmFuIDEzIDIwMDAgT2xsaWUgTGhvCisgKglHZXQgcmlkIG9mIHVnbHkgb2xkIGxvdyBsZXZlbCBhY2Nlc3Mgcm91dGluZXMgKGUuZy4gQ0hSZWdzLmxwKioqKikKKyAqICB2MC4wNiBKYW4gMTEgMjAwMCBPbGxpZSBMaG8KKyAqCVByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIGR1YWwgKG1vcmUgPykgQUM5NyBjb2RlY3MKKyAqICB2MC4wNSBKYW4gMDggMjAwMCBMdWNhIE1vbnRlY2NoaWFuaSA8bS5sdWNhQGluYW1lLmNvbT4KKyAqCWFkYXB0IHRvIDIuMy54IG5ldyBfX3NldHVwL19faW5pdCBjYWxsCisgKiAgdjAuMDQgRGVjIDMxIDE5OTkgT2xsaWUgTGhvCisgKglNdWx0aXBsZSBPcGVuLCB1c2luZyBNaWRkbGUgTG9vcCBJbnRlcnJ1cHQgdG8gc21vb3RoIHBsYXliYWNrCisgKiAgdjAuMDMgRGVjIDI0IDE5OTkgT2xsaWUgTGhvCisgKgltZW0gbGVhayBpbiBwcm9nX2RtYWJ1ZiBhbmQgZGVhbGxvY19kbWFidWYgcmVtb3ZlZAorICogIHYwLjAyIERlYyAxNSAxOTk5IE9sbGllIExobworICoJU2lTIDcwMTggc3VwcG9ydCBhZGRlZCwgcGxheWJhY2sgTy5LLgorICogIHYwLjAxIEFsYW4gQ294IGV0LiBhbC4KKyAqCUluaXRpYWwgUmVsZWFzZSBpbiBrZXJuZWwgMi4zLjMwLCBkb2VzIG5vdCB3b3JrCisgKiAKKyAqICBUb0RvCisgKglDbGVhbiB1cCBvZiBsb3cgbGV2ZWwgY2hhbm5lbCByZWdpc3RlciBhY2Nlc3MgY29kZS4gKGRvbmUpCisgKglGaXggdGhlIGJ1ZyBvbiBkbWEgYnVmZmVyIG1hbmFnZW1lbnQgaW4gdXBkYXRlX3B0ciwgcmVhZC93cml0ZSwgZHJhaW5fZGFjIChkb25lKQorICoJRHVhbCBBQzk3IGNvZGVjcyBzdXBwb3J0IChkb25lKQorICoJUmVjb3JkaW5nIHN1cHBvcnQgKGRvbmUpCisgKglNbWFwIHN1cHBvcnQKKyAqCSJDaGFubmVsIEJpbmRpbmciIGlvY3RsIGV4dGVuc2lvbiAoZG9uZSkKKyAqCW5ldyBwY2kgZGV2aWNlIGRyaXZlciBpbnRlcmZhY2UgZm9yIDIuNCBrZXJuZWwgKGRvbmUpCisgKgorICoJTG9jayBvcmRlciAoaGlnaC0+bG93KQorICoJCWxvY2sJLQloYXJkd2FyZSBsb2NrCisgKgkJb3Blbl9zZW0gLSAJZ3VhcmQgb3BlbnMKKyAqCQlzZW0JLQlndWFyZCBkbWFidWYsIHdyaXRlIHJlLWVudHJ5IGV0YworICovCisKKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9zb3VuZGNhcmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvcG9sbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9hYzk3X2NvZGVjLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BtLmg+CisjaW5jbHVkZSA8bGludXgvZ2FtZXBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kbWEuaD4KKworI2lmIGRlZmluZWQoQ09ORklHX0FMUEhBX05BVVRJTFVTKSB8fCBkZWZpbmVkKENPTkZJR19BTFBIQV9HRU5FUklDKQorI2luY2x1ZGUgPGFzbS9od3JwYi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJ0cmlkZW50LmgiCisKKyNkZWZpbmUgRFJJVkVSX1ZFUlNJT04gIjAuMTQuMTBqLTIuNiIKKworLyogbWFnaWMgbnVtYmVycyB0byBwcm90ZWN0IG91ciBkYXRhIHN0cnVjdHVyZXMgKi8KKyNkZWZpbmUgVFJJREVOVF9DQVJEX01BR0lDCTB4NTA3MjY5NkUJLyogIlByaW4iICovCisjZGVmaW5lIFRSSURFTlRfU1RBVEVfTUFHSUMJMHg2MzY1NzM3MwkvKiAiY2VzcyIgKi8KKworI2RlZmluZSBUUklERU5UX0RNQV9NQVNLCTB4M2ZmZmZmZmYJLyogRE1BIGJ1ZmZlciBtYXNrIGZvciBwY2lfYWxsb2NfY29uc2lzdCAqLworI2RlZmluZSBBTElfRE1BX01BU0sJCTB4N2ZmZmZmZmYJLyogQUxJIFRyaWRlbnRzIGhhdmUgMzEtYml0IERNQS4gV293LiAqLworCisjZGVmaW5lIE5SX0hXX0NICQkzMgorCisvKiBtYXhpbXVtIG51bWJlciBvZiBBQzk3IGNvZGVjcyBjb25uZWN0ZWQsIEFDOTcgMi4wIGRlZmluZWQgNCwgYnV0IDcwMTggYW5kIDRELU5YIG9ubHkKKyAgIGhhdmUgMiBTREFUQV9JTiBsaW5lcyAoY3VycmVudGx5KSAqLworI2RlZmluZSBOUl9BQzk3CQkyCisKKy8qIG1pbm9yIG51bWJlciBvZiAvZGV2L3N3bW9kZW0gKHRlbXBvcmFyeSwgZXhwZXJpbWVudGFsKSAqLworI2RlZmluZSBTTkRfREVWX1NXTU9ERU0JNworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgYWxpX211bHRpX2NoYW5uZWxzXzVfMVtdID0geworCS8qQUxJX1NVUlJfTEVGVF9DSEFOTkVMLCBBTElfU1VSUl9SSUdIVF9DSEFOTkVMLCAqLworCUFMSV9DRU5URVJfQ0hBTk5FTCwKKwlBTElfTEVGX0NIQU5ORUwsCisJQUxJX1NVUlJfTEVGVF9DSEFOTkVMLAorCUFMSV9TVVJSX1JJR0hUX0NIQU5ORUwKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBzYW1wbGVfc2l6ZVtdID0geyAxLCAyLCAyLCA0IH07CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlX3NoaWZ0W10gPSB7IDAsIDEsIDEsIDIgfTsKKworc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9tYWdpY1tdID0gS0VSTl9DUklUICJ0cmlkZW50OiBpbnZhbGlkIG1hZ2ljIHZhbHVlIGluICVzXG4iOworCitlbnVtIHsKKwlUUklERU5UXzREX0RYID0gMCwKKwlUUklERU5UXzREX05YLAorCVNJU183MDE4LAorCUFMSV81NDUxLAorCUNZQkVSNTA1MAorfTsKKworc3RhdGljIGNoYXIgKmNhcmRfbmFtZXNbXSA9IHsKKwkiVHJpZGVudCA0RFdhdmUgRFgiLAorCSJUcmlkZW50IDREV2F2ZSBOWCIsCisJIlNpUyA3MDE4IFBDSSBBdWRpbyIsCisJIkFMaSBBdWRpbyBBY2NlbGVyYXRvciIsCisJIlR2aWEvSUdTVCBDeWJlclBybyA1MDUwIgorfTsKKworc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIHRyaWRlbnRfcGNpX3RibFtdID0geworCXtQQ0lfVkVORE9SX0lEX1RSSURFTlQsIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFgsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRSSURFTlRfNERfRFh9LAorCXtQQ0lfVkVORE9SX0lEX1RSSURFTlQsIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlgsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFRSSURFTlRfNERfTlh9LAorCXtQQ0lfVkVORE9SX0lEX1NJLCBQQ0lfREVWSUNFX0lEX1NJXzcwMTgsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIFNJU183MDE4fSwKKwl7UENJX1ZFTkRPUl9JRF9BTEksIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIEFMSV81NDUxfSwKKwl7UENJX1ZFTkRPUl9JRF9JTlRFUkcsIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTAsCisJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAsIDAsIENZQkVSNTA1MH0sCisJezAsfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHRyaWRlbnRfcGNpX3RibCk7CisKKy8qICJzb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AgKi8KK3N0cnVjdCB0cmlkZW50X3N0YXRlIHsKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsJLyogQ2FyZCBpbmZvICovCisKKwkvKiBmaWxlIG1vZGUgKi8KKwltb2RlX3Qgb3Blbl9tb2RlOworCisJLyogdmlydHVhbCBjaGFubmVsIG51bWJlciAqLworCWludCB2aXJ0OworCisJc3RydWN0IGRtYWJ1ZiB7CisJCS8qIHdhdmUgc2FtcGxlIHN0dWZmICovCisJCXVuc2lnbmVkIGludCByYXRlOworCQl1bnNpZ25lZCBjaGFyIGZtdCwgZW5hYmxlOworCisJCS8qIGhhcmR3YXJlIGNoYW5uZWwgKi8KKwkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbDsKKworCQkvKiBPU1MgYnVmZmVyIG1hbmFnZW1lbnQgc3R1ZmYgKi8KKwkJdm9pZCAqcmF3YnVmOworCQlkbWFfYWRkcl90IGRtYV9oYW5kbGU7CisJCXVuc2lnbmVkIGJ1Zm9yZGVyOworCQl1bnNpZ25lZCBudW1mcmFnOworCQl1bnNpZ25lZCBmcmFnc2hpZnQ7CisKKwkJLyogb3VyIGJ1ZmZlciBhY3RzIGxpa2UgYSBjaXJjdWxhciByaW5nICovCisJCXVuc2lnbmVkIGh3cHRyOwkvKiB3aGVyZSBkbWEgbGFzdCBzdGFydGVkLCB1cGRhdGVkIGJ5IHVwZGF0ZV9wdHIgKi8KKwkJdW5zaWduZWQgc3dwdHI7CS8qIHdoZXJlIGRyaXZlciBsYXN0IGNsZWFyL2ZpbGxlZCwgdXBkYXRlZCBieSByZWFkL3dyaXRlICovCisJCWludCBjb3VudDsJLyogYnl0ZXMgdG8gYmUgY29tc3VtZWQgb3IgYmVlbiBnZW5lcmF0ZWQgYnkgZG1hIG1hY2hpbmUgKi8KKwkJdW5zaWduZWQgdG90YWxfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIGRtYWVkIGJ5IGhhcmR3YXJlICovCisKKwkJdW5zaWduZWQgZXJyb3I7CS8qIG51bWJlciBvZiBvdmVyL3VuZGVycnVucyAqLworICAgICAgICAgICAgICAgIC8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLworCQl3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0OwkKKworCQkvKiByZWR1bmRhbnQsIGJ1dCBtYWtlcyBjYWxjdWxhdGlvbnMgZWFzaWVyICovCisJCXVuc2lnbmVkIGZyYWdzaXplOworCQl1bnNpZ25lZCBkbWFzaXplOworCQl1bnNpZ25lZCBmcmFnc2FtcGxlczsKKworCQkvKiBPU1Mgc3R1ZmYgKi8KKwkJdW5zaWduZWQgbWFwcGVkOjE7CisJCXVuc2lnbmVkIHJlYWR5OjE7CisJCXVuc2lnbmVkIGVuZGNsZWFyZWQ6MTsKKwkJdW5zaWduZWQgdXBkYXRlX2ZsYWc7CisJCXVuc2lnbmVkIG9zc2ZyYWdzaGlmdDsKKwkJaW50IG9zc21heGZyYWdzOworCQl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKKworCX0gZG1hYnVmOworCisJLyogNS4xIGNoYW5uZWxzICovCisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKm90aGVyX3N0YXRlc1s0XTsKKwlpbnQgbXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50OworCXVuc2lnbmVkIGNoYW5zX251bTsKKwl1bnNpZ25lZCBsb25nIGZtdF9mbGFnOworCS8qIEd1YXJkIGFnYWluc3QgbW1hcC93cml0ZS9yZWFkIHJhY2VzICovCisJc3RydWN0IHNlbWFwaG9yZSBzZW07CisKK307CisKKy8qIGhhcmR3YXJlIGNoYW5uZWxzICovCitzdHJ1Y3QgdHJpZGVudF9jaGFubmVsIHsKKwlpbnQgbnVtOyAvKiBjaGFubmVsIG51bWJlciAqLworCXUzMiBsYmE7IC8qIExvb3AgQmVnaW5lIEFkZHJlc3MsIHdoZXJlIGRtYSBidWZmZXIgc3RhcnRzICovCisJdTMyIGVzbzsgLyogRW5kIFNhbXBsZSBPZmZzZXQsIHdlaHJlIGRtYSBidWZmZXIgZW5kcyAqLyAKKwkgICAgICAgICAvKiAoaW4gdGhlIHVuaXQgb2Ygc2FtcGxlcykgKi8KKwl1MzIgZGVsdGE7IC8qIGRlbHRhIHZhbHVlLCBzYW1wbGUgcmF0ZSAvIDQ4ayBmb3IgcGxheWJhY2ssICovCisJICAgICAgICAgICAvKiA0OGsvc2FtcGxlIHJhdGUgZm9yIHJlY29yZGluZyAqLworCXUxNiBhdHRyaWJ1dGU7IC8qIGNvbnRyb2wgd2hlcmUgUENNIGRhdGEgZ28gYW5kIGNvbWUgICovCisJdTE2IGZtX3ZvbDsKKwl1MzIgY29udHJvbDsgLyogc2lnbmVkL3Vuc2lnbmVkLCA4LzE2IGJpdHMsIG1vbm8vc3RlcmVvICovCit9OworCitzdHJ1Y3QgdHJpZGVudF9wY21fYmFua19hZGRyZXNzIHsKKwl1MzIgc3RhcnQ7CisJdTMyIHN0b3A7CisJdTMyIGFpbnQ7CisJdTMyIGFpbnRfZW47Cit9OworCitzdGF0aWMgc3RydWN0IHRyaWRlbnRfcGNtX2JhbmtfYWRkcmVzcyBiYW5rX2FfYWRkcnMgPSB7CisJVDREX1NUQVJUX0EsCisJVDREX1NUT1BfQSwKKwlUNERfQUlOVF9BLAorCVQ0RF9BSU5URU5fQQorfTsKKworc3RhdGljIHN0cnVjdCB0cmlkZW50X3BjbV9iYW5rX2FkZHJlc3MgYmFua19iX2FkZHJzID0geworCVQ0RF9TVEFSVF9CLAorCVQ0RF9TVE9QX0IsCisJVDREX0FJTlRfQiwKKwlUNERfQUlOVEVOX0IKK307CisKK3N0cnVjdCB0cmlkZW50X3BjbV9iYW5rIHsKKwkvKiByZWdpc3RlciBhZGRyZXNzZXMgdG8gY29udHJvbCBiYW5rIG9wZXJhdGlvbnMgKi8KKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFua19hZGRyZXNzICphZGRyZXNzZXM7CisJLyogZWFjaCBiYW5rIGhhcyAzMiBjaGFubmVscyAqLworCXUzMiBiaXRtYXA7CQkvKiBjaGFubmVsIGFsbG9jYXRpb24gYml0bWFwICovCisJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCBjaGFubmVsc1szMl07Cit9OworCitzdHJ1Y3QgdHJpZGVudF9jYXJkIHsKKwl1bnNpZ25lZCBpbnQgbWFnaWM7CisKKwkvKiBXZSBrZWVwIHRyaWRlbnQgY2FyZHMgaW4gYSBsaW5rZWQgbGlzdCAqLworCXN0cnVjdCB0cmlkZW50X2NhcmQgKm5leHQ7CisKKwkvKiBzaW5nbGUgb3BlbiBsb2NrIG1lY2hhbmlzbSwgb25seSB1c2VkIGZvciByZWNvcmRpbmcgKi8KKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCisJLyogVGhlIHRyaWRlbnQgaGFzIGEgY2VydGFpbiBhbW91bnQgb2YgY3Jvc3MgY2hhbm5lbCBpbnRlcmFjdGlvbgorCSAgIHNvIHdlIHVzZSBhIHNpbmdsZSBwZXIgY2FyZCBsb2NrICovCisJc3BpbmxvY2tfdCBsb2NrOworCisJLyogUENJIGRldmljZSBzdHVmZiAqLworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2OworCXUxNiBwY2lfaWQ7CisJdTggcmV2aXNpb247CisKKwkvKiBzb3VuZGNvcmUgc3R1ZmYgKi8KKwlpbnQgZGV2X2F1ZGlvOworCisJLyogc3RydWN0dXJlcyBmb3IgYWJzdHJhY3Rpb24gb2YgaGFyZHdhcmUgZmFjaWxpdGllcywgY29kZWNzLCAqLyAKKwkvKiBiYW5rcyBhbmQgY2hhbm5lbHMgKi8KKwlzdHJ1Y3QgYWM5N19jb2RlYyAqYWM5N19jb2RlY1tOUl9BQzk3XTsKKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayBiYW5rc1tOUl9CQU5LU107CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlc1tOUl9IV19DSF07CisKKwkvKiBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwl1bnNpZ25lZCBsb25nIGlvYmFzZTsKKwl1MzIgaXJxOworCisJLyogRnVuY3Rpb24gc3VwcG9ydCAqLworCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKigqYWxsb2NfcGNtX2NoYW5uZWwpIChzdHJ1Y3QgdHJpZGVudF9jYXJkICopOworCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKigqYWxsb2NfcmVjX3BjbV9jaGFubmVsKSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKTsKKwl2b2lkICgqZnJlZV9wY21fY2hhbm5lbCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKiwgdW5zaWduZWQgaW50IGNoYW4pOworCXZvaWQgKCphZGRyZXNzX2ludGVycnVwdCkgKHN0cnVjdCB0cmlkZW50X2NhcmQgKik7CisKKwkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgZm9yIHNwZGlmIGluICovCisJaW50IG11bHRpX2NoYW5uZWxfdXNlX2NvdW50OworCWludCByZWNfY2hhbm5lbF91c2VfY291bnQ7CisJdTE2IG1peGVyX3JlZ3NbNjRdW05SX0FDOTddOwkvKiBNYWRlIGNhcmQgbG9jYWwgYnkgQWxhbiAqLworCWludCBtaXhlcl9yZWdzX3JlYWR5OworCisJLyogQWRkZWQgZm9yIGhhcmR3YXJlIHZvbHVtZSBjb250cm9sICovCisJaW50IGh3dm9sY3RsOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCisJLyogR2FtZSBwb3J0IHN1cHBvcnQgKi8KKwlzdHJ1Y3QgZ2FtZXBvcnQgKmdhbWVwb3J0OworfTsKKworZW51bSBkbWFidWZfbW9kZSB7CisJRE1fUExBWUJBQ0sgPSAwLAorCURNX1JFQ09SRAorfTsKKworLyogdGFibGUgdG8gbWFwIGZyb20gQ0hBTk5FTE1BU0sgdG8gY2hhbm5lbCBhdHRyaWJ1dGUgZm9yIFNpUyA3MDE4ICovCitzdGF0aWMgdTE2IG1hc2syYXR0cltdID0geworCVBDTV9MUiwgUENNX0xSLCBTVVJSX0xSLCBDRU5URVJfTEZFLAorCUhTRVQsIE1JQywgTU9ERU1fTElORTEsIE1PREVNX0xJTkUyLAorCUkyU19MUiwgU1BESUZfTFIKK307CisKKy8qIHRhYmxlIHRvIG1hcCBmcm9tIGNoYW5uZWwgYXR0cmlidXRlIHRvIENIQU5ORUxNQVNLIGZvciBTaVMgNzAxOCAqLworc3RhdGljIGludCBhdHRyMm1hc2tbXSA9IHsKKwlEU1BfQklORF9NT0RFTTEsIERTUF9CSU5EX01PREVNMiwgRFNQX0JJTkRfRlJPTlQsIERTUF9CSU5EX0hBTkRTRVQsCisJRFNQX0JJTkRfSTJTLCBEU1BfQklORF9DRU5URVJfTEZFLCBEU1BfQklORF9TVVJSLCBEU1BfQklORF9TUERJRgorfTsKKworLyogQWRkZWQgYnkgTWF0dCBXdSAwMS0wNS0yMDAxIGZvciBzcGRpZiBpbiAqLworc3RhdGljIGludCBhbGlfY2xvc2VfbXVsdGlfY2hhbm5lbHModm9pZCk7CitzdGF0aWMgdm9pZCBhbGlfZGVsYXkoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGludGVydmFsKTsKK3N0YXRpYyB2b2lkIGFsaV9kZXRlY3Rfc3BkaWZfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKTsKKworc3RhdGljIHZvaWQgYWxpX2FjOTdfd3JpdGUoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWwpOworc3RhdGljIHUxNiBhbGlfYWM5N19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKTsKKworc3RhdGljIHN0cnVjdCB0cmlkZW50X2NhcmQgKmRldnM7CisKK3N0YXRpYyB2b2lkIHRyaWRlbnRfYWM5N19zZXQoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWwpOworc3RhdGljIHUxNiB0cmlkZW50X2FjOTdfZ2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKTsKKworc3RhdGljIGludCB0cmlkZW50X29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdHJpZGVudF9pb2N0bF9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAorCQkJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKworc3RhdGljIHZvaWQgYWxpX2FjOTdfc2V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBzZWNvbmRhcnksIHU4IHJlZywgdTE2IHZhbCk7CitzdGF0aWMgdTE2IGFsaV9hYzk3X2dldChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgc2Vjb25kYXJ5LCB1OCByZWcpOworc3RhdGljIHZvaWQgYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgcmF0ZSk7CitzdGF0aWMgdm9pZCBhbGlfZW5hYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdCk7CitzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqYWxpX2FsbG9jX3JlY19wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKTsKK3N0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICphbGlfYWxsb2NfcGNtX2NoYW5uZWwoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CitzdGF0aWMgdm9pZCBhbGlfcmVzdG9yZV9yZWdzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpOworc3RhdGljIHZvaWQgYWxpX3NhdmVfcmVncyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKTsKK3N0YXRpYyBpbnQgdHJpZGVudF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCB1bnVzZWQpOworc3RhdGljIGludCB0cmlkZW50X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KTsKK3N0YXRpYyB2b2lkIGFsaV9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKTsKK3N0YXRpYyBpbnQgYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaGFuX251bXMpOworc3RhdGljIHVuc2lnbmVkIGludCBhbGlfZ2V0X3NwZGlmX2luX3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CitzdGF0aWMgdm9pZCBhbGlfc2V0dXBfc3BkaWZfaW4oc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCk7CitzdGF0aWMgdm9pZCBhbGlfZGlzYWJsZV9zcGRpZl9pbihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKTsKK3N0YXRpYyB2b2lkIGFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgY2gpOworc3RhdGljIHZvaWQgYWxpX3NldHVwX3NwZGlmX291dChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgZmxhZyk7CitzdGF0aWMgaW50IGFsaV93cml0ZV81XzEoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLAorCQkJIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIAorCQkJIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwgCisJCQkgdW5zaWduZWQgaW50ICpzdGF0ZV9jbnQpOworc3RhdGljIGludCBhbGlfYWxsb2NhdGVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIAorCQkJCQkgICAgICAgaW50IGNoYW5fbnVtcyk7CitzdGF0aWMgdm9pZCBhbGlfZnJlZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSk7CisKKy8qIHNhdmUgcmVnaXN0ZXJzIGZvciBBTGkgUG93ZXIgTWFuYWdlbWVudCAqLworc3RhdGljIHN0cnVjdCBhbGlfc2F2ZWRfcmVnaXN0ZXJzIHsKKwl1bnNpZ25lZCBsb25nIGdsb2JhbF9yZWdzW0FMSV9HTE9CQUxfUkVHU107CisJdW5zaWduZWQgbG9uZyBjaGFubmVsX3JlZ3NbQUxJX0NIQU5ORUxTXVtBTElfQ0hBTk5FTF9SRUdTXTsKKwl1bnNpZ25lZCBtaXhlcl9yZWdzW0FMSV9NSVhFUl9SRUdTXTsKK30gYWxpX3JlZ2lzdGVyczsKKworI2RlZmluZSBzZWVrX29mZnNldChkbWFfcHRyLCBidWZmZXIsIGNudCwgb2Zmc2V0LCBjb3B5X2NvdW50KQlkbyB7IFwKKyAgICAgICAgKGRtYV9wdHIpICs9IChvZmZzZXQpOwkgIFwKKwkoYnVmZmVyKSArPSAob2Zmc2V0KTsJICBcCisgICAgICAgIChjbnQpIC09IChvZmZzZXQpOwkgIFwKKwkoY29weV9jb3VudCkgKz0gKG9mZnNldCk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgaW50IGxvY2tfc2V0X2ZtdChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSogc3RhdGUpCit7CisJaWYgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnN0YXRlLT5mbXRfZmxhZykpCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bmxvY2tfc2V0X2ZtdChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSogc3RhdGUpCit7CisJY2xlYXJfYml0KDAsICZzdGF0ZS0+Zm10X2ZsYWcpOworfQorCitzdGF0aWMgaW50Cit0cmlkZW50X2VuYWJsZV9sb29wX2ludGVycnVwdHMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKK3sKKwl1MzIgZ2xvYmFsX2NvbnRyb2w7CisKKwlnbG9iYWxfY29udHJvbCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOworCisJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKKwkJZ2xvYmFsX2NvbnRyb2wgfD0gKEVORExQX0lFIHwgTUlETFBfSUUgfCBCQU5LX0JfRU4pOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgorCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CisJCWdsb2JhbF9jb250cm9sIHw9IChFTkRMUF9JRSB8IE1JRExQX0lFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJb3V0bChnbG9iYWxfY29udHJvbCwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKKworCXByX2RlYnVnKCJ0cmlkZW50OiBFbmFibGUgTG9vcCBJbnRlcnJ1cHRzLCBnbG9iY3RsID0gMHglMDhYXG4iLAorCQkgaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSkpOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK3RyaWRlbnRfZGlzYWJsZV9sb29wX2ludGVycnVwdHMoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKK3sKKwl1MzIgZ2xvYmFsX2NvbnRyb2w7CisKKwlnbG9iYWxfY29udHJvbCA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOworCWdsb2JhbF9jb250cm9sICY9IH4oRU5ETFBfSUUgfCBNSURMUF9JRSk7CisJb3V0bChnbG9iYWxfY29udHJvbCwgVFJJRF9SRUcoY2FyZCwgVDREX0xGT19HQ19DSVIpKTsKKworCXByX2RlYnVnKCJ0cmlkZW50OiBEaXNhYmxlZCBMb29wIEludGVycnVwdHMsIGdsb2JjdGwgPSAweCUwOFhcbiIsCisJCSBnbG9iYWxfY29udHJvbCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3RyaWRlbnRfZW5hYmxlX3ZvaWNlX2lycShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOworCXUzMiByZWcsIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPmFpbnRfZW47CisKKwlyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOworCXJlZyB8PSBtYXNrOworCW91dGwocmVnLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CisKKyNpZmRlZiBERUJVRworCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CisJcHJfZGVidWcoInRyaWRlbnQ6IGVuYWJsZWQgSVJRIG9uIGNoYW5uZWwgJWQsICVzID0gMHglMDh4KGFkZHI6JVgpXG4iLAorCQkgY2hhbm5lbCwgYWRkciA9PSBUNERfQUlOVEVOX0IgPyAiQUlOVEVOX0IiIDogIkFJTlRFTl9BIiwKKwkJIHJlZywgYWRkcik7CisjZW5kaWYgLyogREVCVUcgKi8KK30KKworc3RhdGljIHZvaWQKK3RyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgdW5zaWduZWQgaW50IGNoYW5uZWwpCit7CisJdW5zaWduZWQgaW50IG1hc2sgPSAxIDw8IChjaGFubmVsICYgMHgxZik7CisJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbmsgPSAmY2FyZC0+YmFua3NbY2hhbm5lbCA+PiA1XTsKKwl1MzIgcmVnLCBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50X2VuOworCisJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKKwlyZWcgJj0gfm1hc2s7CisJb3V0bChyZWcsIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKKworCS8qIEFjayB0aGUgY2hhbm5lbCBpbiBjYXNlIHRoZSBpbnRlcnJ1cHQgd2FzIHNldCBiZWZvcmUgd2UgZGlzYWJsZSBpdC4gKi8KKwlvdXRsKG1hc2ssIFRSSURfUkVHKGNhcmQsIGJhbmstPmFkZHJlc3Nlcy0+YWludCkpOworCisjaWZkZWYgREVCVUcKKwlyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOworCXByX2RlYnVnKCJ0cmlkZW50OiBkaXNhYmxlZCBJUlEgb24gY2hhbm5lbCAlZCwgJXMgPSAweCUwOHgoYWRkcjolWClcbiIsCisJCSBjaGFubmVsLCBhZGRyID09IFQ0RF9BSU5URU5fQiA/ICJBSU5URU5fQiIgOiAiQUlOVEVOX0EiLAorCQkgcmVnLCBhZGRyKTsKKyNlbmRpZiAvKiBERUJVRyAqLworfQorCitzdGF0aWMgdm9pZAordHJpZGVudF9zdGFydF92b2ljZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOworCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5zdGFydDsKKworI2lmZGVmIERFQlVHCisJdTMyIHJlZzsKKyNlbmRpZiAvKiBERUJVRyAqLworCisJb3V0bChtYXNrLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CisKKyNpZmRlZiBERUJVRworCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyKSk7CisJcHJfZGVidWcoInRyaWRlbnQ6IHN0YXJ0IHZvaWNlIG9uIGNoYW5uZWwgJWQsICVzID0gMHglMDh4KGFkZHI6JVgpXG4iLAorCQkgY2hhbm5lbCwgYWRkciA9PSBUNERfU1RBUlRfQiA/ICJTVEFSVF9CIiA6ICJTVEFSVF9BIiwKKwkJIHJlZywgYWRkcik7CisjZW5kaWYgLyogREVCVUcgKi8KK30KKworc3RhdGljIHZvaWQKK3RyaWRlbnRfc3RvcF92b2ljZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOworCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5zdG9wOworCisjaWZkZWYgREVCVUcKKwl1MzIgcmVnOworI2VuZGlmIC8qIERFQlVHICovCisKKwlvdXRsKG1hc2ssIFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKKworI2lmZGVmIERFQlVHCisJcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIGFkZHIpKTsKKwlwcl9kZWJ1ZygidHJpZGVudDogc3RvcCB2b2ljZSBvbiBjaGFubmVsICVkLCAlcyA9IDB4JTA4eChhZGRyOiVYKVxuIiwKKwkJIGNoYW5uZWwsIGFkZHIgPT0gVDREX1NUT1BfQiA/ICJTVE9QX0IiIDogIlNUT1BfQSIsCisJCSByZWcsIGFkZHIpOworI2VuZGlmIC8qIERFQlVHICovCit9CisKK3N0YXRpYyB1MzIKK3RyaWRlbnRfZ2V0X2ludGVycnVwdF9tYXNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rID0gJmNhcmQtPmJhbmtzW2NoYW5uZWxdOworCXUzMiBhZGRyID0gYmFuay0+YWRkcmVzc2VzLT5haW50OworCXJldHVybiBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOworfQorCitzdGF0aWMgaW50Cit0cmlkZW50X2NoZWNrX2NoYW5uZWxfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCXVuc2lnbmVkIGludCBtYXNrID0gMSA8PCAoY2hhbm5lbCAmIDB4MWYpOworCXUzMiByZWcgPSB0cmlkZW50X2dldF9pbnRlcnJ1cHRfbWFzayhjYXJkLCBjaGFubmVsID4+IDUpOworCisjaWZkZWYgREVCVUcKKwlpZiAocmVnICYgbWFzaykKKwkJcHJfZGVidWcoInRyaWRlbnQ6IGNoYW5uZWwgJWQgaGFzIGludGVycnVwdCwgJXMgPSAweCUwOHhcbiIsCisJCQkgY2hhbm5lbCwgcmVnID09IFQ0RF9BSU5UX0IgPyAiQUlOVF9CIiA6ICJBSU5UX0EiLAorCQkJIHJlZyk7CisjZW5kaWYgLyogREVCVUcgKi8KKwlyZXR1cm4gKHJlZyAmIG1hc2spID8gMSA6IDA7Cit9CisKK3N0YXRpYyB2b2lkCit0cmlkZW50X2Fja19jaGFubmVsX2ludGVycnVwdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDEgPDwgKGNoYW5uZWwgJiAweDFmKTsKKwlzdHJ1Y3QgdHJpZGVudF9wY21fYmFuayAqYmFuayA9ICZjYXJkLT5iYW5rc1tjaGFubmVsID4+IDVdOworCXUzMiByZWcsIGFkZHIgPSBiYW5rLT5hZGRyZXNzZXMtPmFpbnQ7CisKKwlyZWcgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcikpOworCXJlZyAmPSBtYXNrOworCW91dGwocmVnLCBUUklEX1JFRyhjYXJkLCBhZGRyKSk7CisKKyNpZmRlZiBERUJVRworCXJlZyA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfQUlOVF9CKSk7CisJcHJfZGVidWcoInRyaWRlbnQ6IEFjayBjaGFubmVsICVkIGludGVycnVwdCwgQUlOVF9CID0gMHglMDh4XG4iLAorCQkgY2hhbm5lbCwgcmVnKTsKKyNlbmRpZiAvKiBERUJVRyAqLworfQorCitzdGF0aWMgc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqCit0cmlkZW50X2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CisJaW50IGlkeDsKKworCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19CXTsKKworCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgeworCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgeworCQkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOworCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OworCQkJY2hhbm5lbC0+bnVtID0gaWR4ICsgMzI7CisJCQlyZXR1cm4gY2hhbm5lbDsKKwkJfQorCX0KKworCS8qIG5vIG1vcmUgZnJlZSBjaGFubmVscyBhdmFpbGFibGUgKi8KKwlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IG5vIG1vcmUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQi5cbiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAordHJpZGVudF9mcmVlX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCBjaGFubmVsKQoreworCWludCBiYW5rOworCXVuc2lnbmVkIGNoYXIgYjsKKworCWlmIChjaGFubmVsIDwgMzEgfHwgY2hhbm5lbCA+IDYzKQorCQlyZXR1cm47CisKKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFggfHwgCisJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YKSB7CisJCWIgPSBpbmIoVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOworCQlpZiAoKGIgJiB+MHg4MCkgPT0gY2hhbm5lbCkKKwkJCW91dGIoMHgwLCBUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7CisJfQorCisJYmFuayA9IGNoYW5uZWwgPj4gNTsKKwljaGFubmVsID0gY2hhbm5lbCAmIDB4MWY7CisKKwljYXJkLT5iYW5rc1tiYW5rXS5iaXRtYXAgJj0gfigxIDw8IChjaGFubmVsKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICoKK2N5YmVyX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CisJaW50IGlkeDsKKworCS8qIFRoZSBjeWJlcnBybyA1MDUwIGhhcyBvbmx5IDMyIHZvaWNlcyBhbmQgb25lIGJhbmsgKi8KKwkvKiAuLiBhdCBsZWFzdCB0aGV5IGFyZSBub3QgZG9jdW1lbnRlZCAoaWYgeW91IHdhbnQgdG8gY2FsbCB0aGF0IAorCSAqIGNyYXAgZG9jdW1lbnRhdGlvbiksIHBlcmhhcHMgYnJva2VuID8gKi8KKworCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKKworCWZvciAoaWR4ID0gMzE7IGlkeCA+PSAwOyBpZHgtLSkgeworCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgeworCQkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOworCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OworCQkJY2hhbm5lbC0+bnVtID0gaWR4OworCQkJcmV0dXJuIGNoYW5uZWw7CisJCX0KKwl9CisKKwkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhaWxhYmxlICovCisJcHJpbnRrKEtFUk5fRVJSICJjeWJlcnBybzUwNTA6IG5vIG1vcmUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQS5cbiIpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZAorY3liZXJfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlpZiAoY2hhbm5lbCA+IDMxKQorCQlyZXR1cm47CisJY2FyZC0+YmFua3NbQkFOS19BXS5iaXRtYXAgJj0gfigxIDw8IChjaGFubmVsKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY3liZXJfb3V0aWR4KGludCBwb3J0LCBpbnQgaWR4LCBpbnQgZGF0YSkKK3sKKwlvdXRiKGlkeCwgcG9ydCk7CisJb3V0YihkYXRhLCBwb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitjeWJlcl9pbmlkeChpbnQgcG9ydCwgaW50IGlkeCkKK3sKKwlvdXRiKGlkeCwgcG9ydCk7CisJcmV0dXJuIGluYihwb3J0ICsgMSk7Cit9CisKK3N0YXRpYyBpbnQKK2N5YmVyX2luaXRfcml0dWFsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJLyogc29tZSBibGFjayBtYWdpYywgdGFrZW4gZnJvbSBTREsgc2FtcGxlcyAqLworCS8qIHJlbW92ZSB0aGlzIGFuZCBub3RoaW5nIHdpbGwgd29yayAqLworCWludCBwb3J0RGF0OworCWludCByZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKgorCSAqICAgICAgS2VlcCBpbnRlcnJ1cHRzIG9mZiBmb3IgdGhlIGNvbmZpZ3VyZSAtIHdlIGRvbid0IHdhbnQgdG8KKwkgKiAgICAgIGNsYXNoIHdpdGggYW5vdGhlciBjeWJlcnBybyBjb25maWcgZXZlbnQKKwkgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJcG9ydERhdCA9IGN5YmVyX2luaWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUpOworCS8qIGVuYWJsZSwgaWYgaXQgd2FzIGRpc2FibGVkICovCisJaWYgKChwb3J0RGF0ICYgQ1lCRVJfQk1TS19BVUVOWikgIT0gQ1lCRVJfQk1TS19BVUVOWl9FTkFCTEUpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiY3liZXJwcm81MDUwOiBlbmFibGluZyBhdWRpbyBjb250cm9sbGVyXG4iKTsKKwkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIENZQkVSX0lEWF9BVURJT19FTkFCTEUsIAorCQkJICAgICBwb3J0RGF0IHwgQ1lCRVJfQk1TS19BVUVOWl9FTkFCTEUpOworCQkvKiBjaGVjayBhZ2FpbiBpZiBoYXJkd2FyZSBpcyBlbmFibGVkIG5vdyAqLworCQlwb3J0RGF0ID0gY3liZXJfaW5pZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0FVRElPX0VOQUJMRSk7CisJfQorCWlmICgocG9ydERhdCAmIENZQkVSX0JNU0tfQVVFTlopICE9IENZQkVSX0JNU0tfQVVFTlpfRU5BQkxFKSB7CisJCXByaW50ayhLRVJOX0VSUiAiY3liZXJwcm81MDUwOiBpbml0QXVkaW9BY2Nlc3M6IG5vIHN1Y2Nlc3NcbiIpOworCQlyZXQgPSAtMTsKKwl9IGVsc2UgeworCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgQ1lCRVJfSURYX0lSUV9FTkFCTEUsIAorCQkJICAgICBDWUJFUl9CTVNLX0FVRElPX0lOVF9FTkFCTEUpOworCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMSk7CisJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGJhLCAweDIwKTsKKwkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmIsIDB4MDgpOworCQljeWJlcl9vdXRpZHgoQ1lCRVJfUE9SVF9BVURJTywgMHhiZiwgMHgwMik7CisJCWN5YmVyX291dGlkeChDWUJFUl9QT1JUX0FVRElPLCAweGIzLCAweDA2KTsKKwkJY3liZXJfb3V0aWR4KENZQkVSX1BPUlRfQVVESU8sIDB4YmYsIDB4MDApOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyogIGNhbGxlZCB3aXRoIHNwaW4gbG9jayBoZWxkICovCisKK3N0YXRpYyBpbnQKK3RyaWRlbnRfbG9hZF9jaGFubmVsX3JlZ2lzdGVycyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1MzIgKiBkYXRhLCAKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgaTsKKworCWlmIChjaGFubmVsID4gNjMpCisJCXJldHVybiAwOworCisJLyogc2VsZWN0IGhhcmR3YXJlIGNoYW5uZWwgdG8gd3JpdGUgKi8KKwlvdXRiKGNoYW5uZWwsIFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisKKwkvKiBPdXRwdXQgdGhlIGNoYW5uZWwgcmVnaXN0ZXJzLCBidXQgZG9uJ3Qgd3JpdGUgcmVnaXN0ZXIKKwkgICB0aHJlZSB0byBhbiBBTEkgY2hpcC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQ0hBTk5FTF9SRUdTOyBpKyspIHsKKwkJaWYgKGkgPT0gMyAmJiBjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkKKwkJCWNvbnRpbnVlOworCQlvdXRsKGRhdGFbaV0sIFRSSURfUkVHKGNhcmQsIENIQU5ORUxfU1RBUlQgKyA0ICogaSkpOworCX0KKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEgfHwgCisJICAgIGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKSB7CisJCW91dGwoQUxJX0VNT0RfU3RpbGwsIFRSSURfUkVHKGNhcmQsIEFMSV9FQlVGMSkpOworCQlvdXRsKEFMSV9FTU9EX1N0aWxsLCBUUklEX1JFRyhjYXJkLCBBTElfRUJVRjIpKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIGNhbGxlZCB3aXRoIHNwaW4gbG9jayBoZWxkICovCitzdGF0aWMgaW50Cit0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXVuc2lnbmVkIGludCBkYXRhW0NIQU5ORUxfUkVHUyArIDFdOworCXN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKmNoYW5uZWw7CisKKwljaGFubmVsID0gc3RhdGUtPmRtYWJ1Zi5jaGFubmVsOworCisJZGF0YVsxXSA9IGNoYW5uZWwtPmxiYTsKKwlkYXRhWzRdID0gY2hhbm5lbC0+Y29udHJvbDsKKworCXN3aXRjaCAoc3RhdGUtPmNhcmQtPnBjaV9pZCkgeworCWNhc2UgUENJX0RFVklDRV9JRF9BTElfNTQ1MToKKwkJZGF0YVswXSA9IDA7CS8qIEN1cnJlbnQgU2FtcGxlIE9mZnNldCAqLworCQlkYXRhWzJdID0gKGNoYW5uZWwtPmVzbyA8PCAxNikgfCAoY2hhbm5lbC0+ZGVsdGEgJiAweGZmZmYpOworCQlkYXRhWzNdID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgorCQlkYXRhWzBdID0gMDsJLyogQ3VycmVudCBTYW1wbGUgT2Zmc2V0ICovCisJCWRhdGFbMl0gPSAoY2hhbm5lbC0+ZXNvIDw8IDE2KSB8IChjaGFubmVsLT5kZWx0YSAmIDB4ZmZmZik7CisJCWRhdGFbM10gPSAoY2hhbm5lbC0+YXR0cmlidXRlIDw8IDE2KSB8IChjaGFubmVsLT5mbV92b2wgJiAweGZmZmYpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CisJCWRhdGFbMF0gPSAwOwkvKiBDdXJyZW50IFNhbXBsZSBPZmZzZXQgKi8KKwkJZGF0YVsyXSA9IChjaGFubmVsLT5lc28gPDwgMTYpIHwgKGNoYW5uZWwtPmRlbHRhICYgMHhmZmZmKTsKKwkJZGF0YVszXSA9IGNoYW5uZWwtPmZtX3ZvbCAmIDB4ZmZmZjsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgorCQlkYXRhWzBdID0gKGNoYW5uZWwtPmRlbHRhIDw8IDI0KTsKKwkJZGF0YVsyXSA9ICgoY2hhbm5lbC0+ZGVsdGEgPDwgMTYpICYgMHhmZjAwMDAwMCkgfCAKKwkJCShjaGFubmVsLT5lc28gJiAweDAwZmZmZmZmKTsKKwkJZGF0YVszXSA9IGNoYW5uZWwtPmZtX3ZvbCAmIDB4ZmZmZjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHRyaWRlbnRfbG9hZF9jaGFubmVsX3JlZ2lzdGVycyhzdGF0ZS0+Y2FyZCwgZGF0YSwgY2hhbm5lbC0+bnVtKTsKK30KKworc3RhdGljIGludAorY29tcHV0ZV9yYXRlX3BsYXkodTMyIHJhdGUpCit7CisJaW50IGRlbHRhOworCS8qIFdlIHNwZWNpYWwgY2FzZSA0NDEwMCBhbmQgODAwMCBzaW5jZSByb3VuZGluZyB3aXRoIHRoZSBlcXVhdGlvbgorCSAgIGRvZXMgbm90IGdpdmUgdXMgYW4gYWNjdXJhdGUgZW5vdWdoIHZhbHVlLiBGb3IgMTEwMjUgYW5kIDIyMDUwCisJICAgdGhlIGVxdWF0aW9uIGdpdmVzIHVzIHRoZSBiZXN0IGFuc3dlci4gQWxsIG90aGVyIGZyZXF1ZW5jaWVzIHdpbGwKKwkgICBhbHNvIHVzZSB0aGUgZXF1YXRpb24uIEpEVyAqLworCWlmIChyYXRlID09IDQ0MTAwKQorCQlkZWx0YSA9IDB4ZWIzOworCWVsc2UgaWYgKHJhdGUgPT0gODAwMCkKKwkJZGVsdGEgPSAweDJhYjsKKwllbHNlIGlmIChyYXRlID09IDQ4MDAwKQorCQlkZWx0YSA9IDB4MTAwMDsKKwllbHNlCisJCWRlbHRhID0gKCgocmF0ZSA8PCAxMikgKyByYXRlKSAvIDQ4MDAwKSAmIDB4MDAwMGZmZmY7CisJcmV0dXJuIGRlbHRhOworfQorCitzdGF0aWMgaW50Citjb21wdXRlX3JhdGVfcmVjKHUzMiByYXRlKQoreworCWludCBkZWx0YTsKKworCWlmIChyYXRlID09IDQ0MTAwKQorCQlkZWx0YSA9IDB4MTE2YTsKKwllbHNlIGlmIChyYXRlID09IDgwMDApCisJCWRlbHRhID0gMHg2MDAwOworCWVsc2UgaWYgKHJhdGUgPT0gNDgwMDApCisJCWRlbHRhID0gMHgxMDAwOworCWVsc2UKKwkJZGVsdGEgPSAoKDQ4MDAwIDw8IDEyKSAvIHJhdGUpICYgMHgwMDAwZmZmZjsKKworCXJldHVybiBkZWx0YTsKK30KKworLyogc2V0IHBsYXliYWNrIHNhbXBsZSByYXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50Cit0cmlkZW50X3NldF9kYWNfcmF0ZShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgNDAwMCkKKwkJcmF0ZSA9IDQwMDA7CisKKwlkbWFidWYtPnJhdGUgPSByYXRlOworCWRtYWJ1Zi0+Y2hhbm5lbC0+ZGVsdGEgPSBjb21wdXRlX3JhdGVfcGxheShyYXRlKTsKKworCXRyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyhzdGF0ZSk7CisKKwlwcl9kZWJ1ZygidHJpZGVudDogY2FsbGVkIHRyaWRlbnRfc2V0X2RhY19yYXRlIDogcmF0ZSA9ICVkXG4iLCByYXRlKTsKKworCXJldHVybiByYXRlOworfQorCisvKiBzZXQgcmVjb3JkaW5nIHNhbXBsZSByYXRlICovCitzdGF0aWMgdW5zaWduZWQgaW50Cit0cmlkZW50X3NldF9hZGNfcmF0ZShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIHVuc2lnbmVkIGludCByYXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCisJaWYgKHJhdGUgPiA0ODAwMCkKKwkJcmF0ZSA9IDQ4MDAwOworCWlmIChyYXRlIDwgNDAwMCkKKwkJcmF0ZSA9IDQwMDA7CisKKwlkbWFidWYtPnJhdGUgPSByYXRlOworCWRtYWJ1Zi0+Y2hhbm5lbC0+ZGVsdGEgPSBjb21wdXRlX3JhdGVfcmVjKHJhdGUpOworCisJdHJpZGVudF93cml0ZV92b2ljZV9yZWdzKHN0YXRlKTsKKworCXByX2RlYnVnKCJ0cmlkZW50OiBjYWxsZWQgdHJpZGVudF9zZXRfYWRjX3JhdGUgOiByYXRlID0gJWRcbiIsIHJhdGUpOworCisJcmV0dXJuIHJhdGU7Cit9CisKKy8qIHByZXBhcmUgY2hhbm5lbCBhdHRyaWJ1dGVzIGZvciBwbGF5YmFjayAqLworc3RhdGljIHZvaWQKK3RyaWRlbnRfcGxheV9zZXR1cChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9IGRtYWJ1Zi0+Y2hhbm5lbDsKKworCWNoYW5uZWwtPmxiYSA9IGRtYWJ1Zi0+ZG1hX2hhbmRsZTsKKwljaGFubmVsLT5kZWx0YSA9IGNvbXB1dGVfcmF0ZV9wbGF5KGRtYWJ1Zi0+cmF0ZSk7CisKKwljaGFubmVsLT5lc28gPSBkbWFidWYtPmRtYXNpemUgPj4gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKKwljaGFubmVsLT5lc28gLT0gMTsKKworCWlmIChzdGF0ZS0+Y2FyZC0+cGNpX2lkICE9IFBDSV9ERVZJQ0VfSURfU0lfNzAxOCkgeworCQljaGFubmVsLT5hdHRyaWJ1dGUgPSAwOworCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCQlpZiAoKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfSU5fQ0hBTk5FTCkgfHwgCisJCQkgICAgKGNoYW5uZWwtPm51bSA9PSBBTElfUENNX0lOX0NIQU5ORUwpKQorCQkJCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChzdGF0ZS0+Y2FyZCwgY2hhbm5lbC0+bnVtKTsKKwkJCWVsc2UgaWYgKChpbmwoVFJJRF9SRUcoc3RhdGUtPmNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpIAorCQkJCSAgJiBBTElfU1BESUZfT1VUX0NIX0VOQUJMRSkKKwkJCQkgJiYgKGNoYW5uZWwtPm51bSA9PSBBTElfU1BESUZfT1VUX0NIQU5ORUwpKSB7CisJCQkJYWxpX3NldF9zcGRpZl9vdXRfcmF0ZShzdGF0ZS0+Y2FyZCwgCisJCQkJCQkgICAgICAgc3RhdGUtPmRtYWJ1Zi5yYXRlKTsKKwkJCQlzdGF0ZS0+ZG1hYnVmLmNoYW5uZWwtPmRlbHRhID0gMHgxMDAwOworCQkJfQorCQl9CisJfQorCisJY2hhbm5lbC0+Zm1fdm9sID0gMHgwOworCisJY2hhbm5lbC0+Y29udHJvbCA9IENIQU5ORUxfTE9PUDsKKwlpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgeworCQkvKiAxNi1iaXRzICovCisJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF8xNkJJVFM7CisJCS8qIHNpZ25lZCAqLworCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfU0lHTkVEOworCX0KKwlpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pCisJCS8qIHN0ZXJlbyAqLworCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfU1RFUkVPOworCisJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfcGxheV9zZXR1cCwgTEJBID0gMHglMDh4LCBEZWx0YSA9IDB4JTA4eCwgIgorCQkgIkVTTyA9IDB4JTA4eCwgQ29udHJvbCA9IDB4JTA4eFxuIiwgY2hhbm5lbC0+bGJhLAorCQkgY2hhbm5lbC0+ZGVsdGEsIGNoYW5uZWwtPmVzbywgY2hhbm5lbC0+Y29udHJvbCk7CisKKwl0cmlkZW50X3dyaXRlX3ZvaWNlX3JlZ3Moc3RhdGUpOworfQorCisvKiBwcmVwYXJlIGNoYW5uZWwgYXR0cmlidXRlcyBmb3IgcmVjb3JkaW5nICovCitzdGF0aWMgdm9pZAordHJpZGVudF9yZWNfc2V0dXAoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXUxNiB3OworCXU4IGJ2YWw7CisKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9IGRtYWJ1Zi0+Y2hhbm5lbDsKKwl1bnNpZ25lZCBpbnQgcmF0ZTsKKworCS8qIEVuYWJsZSBBQy05NyBBREMgKGNhcHR1cmUpICovCisJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CisJCWFsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKHN0YXRlKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CisJCS8qIGZvciA3MDE4LCB0aGUgYWM5NyBpcyBhbHdheXMgaW4gcGxheWJhY2svcmVjb3JkIChkdXBsZXgpIG1vZGUgKi8KKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgorCQl3ID0gaW5iKFRSSURfUkVHKGNhcmQsIERYX0FDUjJfQUM5N19DT01fU1RBVCkpOworCQlvdXRiKHcgfCAweDQ4LCBUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKKwkJLyogZW5hYmxlIGFuZCBzZXQgcmVjb3JkIGNoYW5uZWwgKi8KKwkJb3V0YigweDgwIHwgY2hhbm5lbC0+bnVtLCBUUklEX1JFRyhjYXJkLCBUNERfUkVDX0NIKSk7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKKwkJdyA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOworCQlvdXR3KHcgfCAweDEwMDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJCS8qIGVuYWJsZSBhbmQgc2V0IHJlY29yZCBjaGFubmVsICovCisJCW91dGIoMHg4MCB8IGNoYW5uZWwtPm51bSwgVFJJRF9SRUcoY2FyZCwgVDREX1JFQ19DSCkpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CisJCS8qIGRvbid0IGtub3cgeWV0LCB1c2luZyBzcGVjaWFsIGNoYW5uZWwgMjIgaW4gR0MxKDB4ZDQpPyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm47CisJfQorCisJY2hhbm5lbC0+bGJhID0gZG1hYnVmLT5kbWFfaGFuZGxlOworCWNoYW5uZWwtPmRlbHRhID0gY29tcHV0ZV9yYXRlX3JlYyhkbWFidWYtPnJhdGUpOworCWlmICgoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpICYmIAorCSAgICAoY2hhbm5lbC0+bnVtID09IEFMSV9TUERJRl9JTl9DSEFOTkVMKSkgeworCQlyYXRlID0gYWxpX2dldF9zcGRpZl9pbl9yYXRlKGNhcmQpOworCQlpZiAocmF0ZSA9PSAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBBTGkgNTQ1MSAiCisJCQkgICAgICAgIlMvUERJRiBpbnB1dCBzZXR1cCBlcnJvciFcbiIpOworCQkJcmF0ZSA9IDQ4MDAwOworCQl9CisJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKwkJaWYgKGJ2YWwgJiAweDEwKSB7CisJCQlvdXRiKGJ2YWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBjbGVhcmVkIEFMaSAiCisJCQkgICAgICAgIjU0NTEgUy9QRElGIHBhcml0eSBlcnJvciBmbGFnLlxuIik7CisJCX0KKworCQlpZiAocmF0ZSAhPSA0ODAwMCkKKwkJCWNoYW5uZWwtPmRlbHRhID0gKChyYXRlIDw8IDEyKSAvIGRtYWJ1Zi0+cmF0ZSkgJiAweDAwMDBmZmZmOworCX0KKworCWNoYW5uZWwtPmVzbyA9IGRtYWJ1Zi0+ZG1hc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOworCWNoYW5uZWwtPmVzbyAtPSAxOworCisJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgIT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CisJCWNoYW5uZWwtPmF0dHJpYnV0ZSA9IDA7CisJfQorCisJY2hhbm5lbC0+Zm1fdm9sID0gMHgwOworCisJY2hhbm5lbC0+Y29udHJvbCA9IENIQU5ORUxfTE9PUDsKKwlpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgeworCQkvKiAxNi1iaXRzICovCisJCWNoYW5uZWwtPmNvbnRyb2wgfD0gQ0hBTk5FTF8xNkJJVFM7CisJCS8qIHNpZ25lZCAqLworCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfU0lHTkVEOworCX0KKwlpZiAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pCisJCS8qIHN0ZXJlbyAqLworCQljaGFubmVsLT5jb250cm9sIHw9IENIQU5ORUxfU1RFUkVPOworCisJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfcmVjX3NldHVwLCBMQkEgPSAweCUwOHgsIERlbGF0ID0gMHglMDh4LCAiCisJCSAiRVNPID0gMHglMDh4LCBDb250cm9sID0gMHglMDh4XG4iLCBjaGFubmVsLT5sYmEsCisJCSBjaGFubmVsLT5kZWx0YSwgY2hhbm5lbC0+ZXNvLCBjaGFubmVsLT5jb250cm9sKTsKKworCXRyaWRlbnRfd3JpdGVfdm9pY2VfcmVncyhzdGF0ZSk7Cit9CisKKy8qIGdldCBjdXJyZW50IHBsYXliYWNrL3JlY29yZGluZyBkbWEgYnVmZmVyIHBvaW50ZXIgKGJ5dGUgb2Zmc2V0IGZyb20gTEJBKSwKKyAgIGNhbGxlZCB3aXRoIHNwaW5sb2NrIGhlbGQhICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkCit0cmlkZW50X2dldF9kbWFfYWRkcihzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdTMyIGNzbzsKKworCWlmICghZG1hYnVmLT5lbmFibGUpCisJCXJldHVybiAwOworCisJb3V0YihkbWFidWYtPmNoYW5uZWwtPm51bSwgVFJJRF9SRUcoc3RhdGUtPmNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisKKwlzd2l0Y2ggKHN0YXRlLT5jYXJkLT5wY2lfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgorCWNhc2UgUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MDoKKwkJLyogMTYgYml0cyBFU08sIENTTyBmb3IgNzAxOCBhbmQgRFggKi8KKwkJY3NvID0gaW53KFRSSURfUkVHKHN0YXRlLT5jYXJkLCBDSF9EWF9DU09fQUxQSEFfRk1TICsgMikpOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfTlg6CisJCS8qIDI0IGJpdHMgRVNPLCBDU08gZm9yIE5YICovCisJCWNzbyA9IGlubChUUklEX1JFRyhzdGF0ZS0+Y2FyZCwgQ0hfTlhfREVMVEFfQ1NPKSkgJiAweDAwZmZmZmZmOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwlwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9nZXRfZG1hX2FkZHI6IGNoaXAgcmVwb3J0ZWQgY2hhbm5lbDogJWQsICIKKwkJICJjc28gPSAweCUwNHhcbiIsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtLCBjc28pOworCisJLyogRVNPIGFuZCBDU08gYXJlIGluIHVuaXRzIG9mIFNhbXBsZXMsIGNvbnZlcnQgdG8gYnl0ZSBvZmZzZXQgKi8KKwljc28gPDw9IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CisKKwlyZXR1cm4gKGNzbyAlIGRtYWJ1Zi0+ZG1hc2l6ZSk7Cit9CisKKy8qIFN0b3AgcmVjb3JkaW5nIChsb2NrIGhlbGQpICovCitzdGF0aWMgaW5saW5lIHZvaWQKK19fc3RvcF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGludCBjaGFuX251bSA9IGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtOworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKworCWRtYWJ1Zi0+ZW5hYmxlICY9IH5BRENfUlVOTklORzsKKwl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbl9udW0pOworCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOworfQorCitzdGF0aWMgdm9pZAorc3RvcF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlfX3N0b3BfYWRjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitzdGFydF9hZGMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGludCBjaGFuX251bSA9IGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtOworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoKGRtYWJ1Zi0+bWFwcGVkIHx8IAorCSAgICAgZG1hYnVmLT5jb3VudCA8IChzaWduZWQpIGRtYWJ1Zi0+ZG1hc2l6ZSkgJiYgCisJICAgIGRtYWJ1Zi0+cmVhZHkpIHsKKwkJZG1hYnVmLT5lbmFibGUgfD0gQURDX1JVTk5JTkc7CisJCXRyaWRlbnRfZW5hYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFuX251bSk7CisJCXRyaWRlbnRfc3RhcnRfdm9pY2UoY2FyZCwgY2hhbl9udW0pOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKKy8qIHN0b3AgcGxheWJhY2sgKGxvY2sgaGVsZCkgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19zdG9wX2RhYyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgaW50IGNoYW5fbnVtID0gZG1hYnVmLT5jaGFubmVsLT5udW07CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCisJZG1hYnVmLT5lbmFibGUgJj0gfkRBQ19SVU5OSU5HOworCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFuX251bSk7CisJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgeworCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1swXS0+CisJCQkJICAgZG1hYnVmLmNoYW5uZWwtPm51bSk7CisJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT4KKwkJCQkgICBkbWFidWYuY2hhbm5lbC0+bnVtKTsKKwkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPgorCQkJCSAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgc3RhdGUtPm90aGVyX3N0YXRlc1szXS0+CisJCQkJICAgZG1hYnVmLmNoYW5uZWwtPm51bSk7CisJfQorCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOworfQorCitzdGF0aWMgdm9pZAorc3RvcF9kYWMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlfX3N0b3BfZGFjKHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitzdGFydF9kYWMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGludCBjaGFuX251bSA9IGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtOworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlpZiAoKGRtYWJ1Zi0+bWFwcGVkIHx8IGRtYWJ1Zi0+Y291bnQgPiAwKSAmJiBkbWFidWYtPnJlYWR5KSB7CisJCWRtYWJ1Zi0+ZW5hYmxlIHw9IERBQ19SVU5OSU5HOworCQl0cmlkZW50X2VuYWJsZV92b2ljZV9pcnEoY2FyZCwgY2hhbl9udW0pOworCQl0cmlkZW50X3N0YXJ0X3ZvaWNlKGNhcmQsIGNoYW5fbnVtKTsKKwkJaWYgKHN0YXRlLT5jaGFuc19udW0gPT0gNikgeworCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT4KKwkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT4KKwkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT4KKwkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQkJdHJpZGVudF9zdGFydF92b2ljZShjYXJkLCBzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT4KKwkJCQkJICAgIGRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworI2RlZmluZSBETUFCVUZfREVGQVVMVE9SREVSICgxNS1QQUdFX1NISUZUKQorI2RlZmluZSBETUFCVUZfTUlOT1JERVIgMQorCisvKiBhbGxvYyBhIERNQSBidWZmZXIgb2Ygd2l0aCBhIGJ1ZmZlciBvZiB0aGlzIG9yZGVyICovCitzdGF0aWMgaW50CithbGxvY19kbWFidWYoc3RydWN0IGRtYWJ1ZiAqZG1hYnVmLCBzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiwgaW50IG9yZGVyKQoreworCXZvaWQgKnJhd2J1ZiA9IE5VTEw7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJaWYgKCEocmF3YnVmID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQocGNpX2RldiwgUEFHRV9TSVpFIDw8IG9yZGVyLCAKKwkJCQkJICAgICZkbWFidWYtPmRtYV9oYW5kbGUpKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwcl9kZWJ1ZygidHJpZGVudDogYWxsb2NhdGVkICVsZCAob3JkZXIgPSAlZCkgYnl0ZXMgYXQgJXBcbiIsCisJCSBQQUdFX1NJWkUgPDwgb3JkZXIsIG9yZGVyLCByYXdidWYpOworCisJZG1hYnVmLT5yZWFkeSA9IGRtYWJ1Zi0+bWFwcGVkID0gMDsKKwlkbWFidWYtPnJhd2J1ZiA9IHJhd2J1ZjsKKwlkbWFidWYtPmJ1Zm9yZGVyID0gb3JkZXI7CisKKwkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSAqLyAKKwkvKiByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KKwlwZW5kID0gdmlydF90b19wYWdlKHJhd2J1ZiArIChQQUdFX1NJWkUgPDwgb3JkZXIpIC0gMSk7CisJZm9yIChwYWdlID0gdmlydF90b19wYWdlKHJhd2J1Zik7IHBhZ2UgPD0gcGVuZDsgcGFnZSsrKQorCQlTZXRQYWdlUmVzZXJ2ZWQocGFnZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogYWxsb2NhdGUgdGhlIG1haW4gRE1BIGJ1ZmZlciwgcGxheWJhY2sgYW5kIHJlY29yZGluZyBidWZmZXIgc2hvdWxkIGJlICovCisvKiBhbGxvY2F0ZWQgc2VwYXJhdGVseSAqLworc3RhdGljIGludAorYWxsb2NfbWFpbl9kbWFidWYoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCBvcmRlcjsKKwlpbnQgcmV0ID0gLUVOT01FTTsKKworCS8qIGFsbG9jIGFzIGJpZyBhIGNodW5rIGFzIHdlIGNhbiwgRklYTUU6IGlzIHRoaXMgbmVjZXNzYXJ5ID8/ICovCisJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkgeworCQlpZiAoIShyZXQgPSBhbGxvY19kbWFidWYoZG1hYnVmLCBzdGF0ZS0+Y2FyZC0+cGNpX2Rldiwgb3JkZXIpKSkKKwkJCXJldHVybiAwOworCQkvKiBlbHNlIHRyeSBhZ2FpbiAqLworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBkZWFsbG9jYXRlIGEgRE1BIGJ1ZmZlciAqLworc3RhdGljIHZvaWQKK2RlYWxsb2NfZG1hYnVmKHN0cnVjdCBkbWFidWYgKmRtYWJ1Ziwgc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYpCit7CisJc3RydWN0IHBhZ2UgKnBhZ2UsICpwZW5kOworCisJaWYgKGRtYWJ1Zi0+cmF3YnVmKSB7CisJCS8qIHVuZG8gbWFya2luZyB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQgKi8KKwkJcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChwYWdlID0gdmlydF90b19wYWdlKGRtYWJ1Zi0+cmF3YnVmKTsgcGFnZSA8PSBwZW5kOyBwYWdlKyspCisJCQlDbGVhclBhZ2VSZXNlcnZlZChwYWdlKTsKKwkJcGNpX2ZyZWVfY29uc2lzdGVudChwY2lfZGV2LCBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlciwgCisJCQkJICAgIGRtYWJ1Zi0+cmF3YnVmLCBkbWFidWYtPmRtYV9oYW5kbGUpOworCQlkbWFidWYtPnJhd2J1ZiA9IE5VTEw7CisJfQorCWRtYWJ1Zi0+bWFwcGVkID0gZG1hYnVmLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2dfZG1hYnVmKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSwgZW51bSBkbWFidWZfbW9kZSByZWMpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgYnl0ZXBlcnNlYzsKKwlzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqcyA9IHN0YXRlOworCXVuc2lnbmVkIGJ1ZnNpemUsIGRtYV9udW1zOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCwgaSwgb3JkZXI7CisKKwlpZiAoKHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpCisJCWRtYV9udW1zID0gNTsKKwllbHNlCisJCWRtYV9udW1zID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBkbWFfbnVtczsgaSsrKSB7CisJCWlmIChpID4gMCkgeworCQkJcyA9IHN0YXRlLT5vdGhlcl9zdGF0ZXNbaSAtIDFdOworCQkJZG1hYnVmID0gJnMtPmRtYWJ1ZjsKKwkJCWRtYWJ1Zi0+Zm10ID0gc3RhdGUtPmRtYWJ1Zi5mbXQ7CisJCQlkbWFidWYtPnJhdGUgPSBzdGF0ZS0+ZG1hYnVmLnJhdGU7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcy0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlkbWFidWYtPmh3cHRyID0gZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT5lcnJvciA9IDA7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnMtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQkvKiBhbGxvY2F0ZSBETUEgYnVmZmVyIGlmIG5vdCBhbGxvY2F0ZWQgeWV0ICovCisJCWlmICghZG1hYnVmLT5yYXdidWYpIHsKKwkJCWlmIChpID09IDApIHsKKwkJCQlpZiAoKHJldCA9IGFsbG9jX21haW5fZG1hYnVmKHN0YXRlKSkpIHsKKwkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOworCQkJCQlyZXR1cm4gcmV0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcmV0ID0gLUVOT01FTTsKKwkJCQlvcmRlciA9IHN0YXRlLT5kbWFidWYuYnVmb3JkZXIgLSAxOworCQkJCWlmIChvcmRlciA+PSBETUFCVUZfTUlOT1JERVIpIHsKKwkJCQkJcmV0ID0gYWxsb2NfZG1hYnVmKGRtYWJ1ZiwKKwkJCQkJCQkgICBzdGF0ZS0+Y2FyZC0+cGNpX2RldiwKKwkJCQkJCQkgICBvcmRlcik7CisJCQkJfQorCQkJCWlmIChyZXQpIHsKKwkJCQkJLyogcmVsZWFzZSB0aGUgbWFpbiBETUEgYnVmZmVyICovCisJCQkJCWRlYWxsb2NfZG1hYnVmKCZzdGF0ZS0+ZG1hYnVmLCBzdGF0ZS0+Y2FyZC0+cGNpX2Rldik7CisJCQkJCS8qIHJlbGVhc2UgdGhlIGF1eGlsaWFyeSBETUEgYnVmZmVycyAqLworCQkJCQlmb3IgKGkgLT0gMjsgaSA+PSAwOyBpLS0pCisJCQkJCQlkZWFsbG9jX2RtYWJ1Zigmc3RhdGUtPm90aGVyX3N0YXRlc1tpXS0+ZG1hYnVmLCAKKwkJCQkJCQkgICAgICAgc3RhdGUtPmNhcmQtPnBjaV9kZXYpOworCQkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJCQkJCXJldHVybiByZXQ7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIEZJWE1FOiBmaWd1cmUgb3V0IGFsbCB0aGlzIE9TUyBmcmFnbWVudCBzdHVmZiAqLworCQlieXRlcGVyc2VjID0gZG1hYnVmLT5yYXRlIDw8IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CisJCWJ1ZnNpemUgPSBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcjsKKwkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0KSB7CisJCQlpZiAoKDEwMDAgPDwgZG1hYnVmLT5vc3NmcmFnc2hpZnQpIDwgYnl0ZXBlcnNlYykKKwkJCQlkbWFidWYtPmZyYWdzaGlmdCA9IGxkMihieXRlcGVyc2VjIC8gMTAwMCk7CisJCQllbHNlCisJCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSBkbWFidWYtPm9zc2ZyYWdzaGlmdDsKKwkJfSBlbHNlIHsKKwkJCS8qIGxldHMgaGFuZCBvdXQgcmVhc29uYWJsZSBiaWcgYXNzIGJ1ZmZlcnMgYnkgZGVmYXVsdCAqLworCQkJZG1hYnVmLT5mcmFnc2hpZnQgPSAoZG1hYnVmLT5idWZvcmRlciArIFBBR0VfU0hJRlQgLSAyKTsKKwkJfQorCQlkbWFidWYtPm51bWZyYWcgPSBidWZzaXplID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQl3aGlsZSAoZG1hYnVmLT5udW1mcmFnIDwgNCAmJiBkbWFidWYtPmZyYWdzaGlmdCA+IDMpIHsKKwkJCWRtYWJ1Zi0+ZnJhZ3NoaWZ0LS07CisJCQlkbWFidWYtPm51bWZyYWcgPSBidWZzaXplID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQl9CisJCWRtYWJ1Zi0+ZnJhZ3NpemUgPSAxIDw8IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQlpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA+PSA0ICYmIGRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPCBkbWFidWYtPm51bWZyYWcpCisJCQlkbWFidWYtPm51bWZyYWcgPSBkbWFidWYtPm9zc21heGZyYWdzOworCQlkbWFidWYtPmZyYWdzYW1wbGVzID0gZG1hYnVmLT5mcmFnc2l6ZSA+PiBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOworCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcgPDwgZG1hYnVmLT5mcmFnc2hpZnQ7CisKKwkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyAwIDogMHg4MCwgCisJCSAgICAgICBkbWFidWYtPmRtYXNpemUpOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWlmIChyZWMgPT0gRE1fUkVDT1JEKQorCQkJdHJpZGVudF9yZWNfc2V0dXAocyk7CisJCWVsc2UgLyogRE1fUExBWUJBQ0sgKi8KKwkJCXRyaWRlbnRfcGxheV9zZXR1cChzKTsKKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJLyogc2V0IHRoZSByZWFkeSBmbGFnIGZvciB0aGUgZG1hIGJ1ZmZlciAqLworCQlkbWFidWYtPnJlYWR5ID0gMTsKKworCQlwcl9kZWJ1ZygidHJpZGVudDogcHJvZ19kbWFidWYoJWQpLCBzYW1wbGUgcmF0ZSA9ICVkLCAiCisJCQkgImZvcm1hdCA9ICVkLCBudW1mcmFnID0gJWQsIGZyYWdzaXplID0gJWQgIgorCQkJICJkbWFzaXplID0gJWRcbiIsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtLAorCQkJIGRtYWJ1Zi0+cmF0ZSwgZG1hYnVmLT5mbXQsIGRtYWJ1Zi0+bnVtZnJhZywKKwkJCSBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmRtYXNpemUpOworCX0KKwl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGlubGluZSBpbnQgcHJvZ19kbWFidWZfcmVjb3JkKHN0cnVjdCB0cmlkZW50X3N0YXRlKiBzdGF0ZSkKK3sKKwlyZXR1cm4gcHJvZ19kbWFidWYoc3RhdGUsIERNX1JFQ09SRCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHByb2dfZG1hYnVmX3BsYXliYWNrKHN0cnVjdCB0cmlkZW50X3N0YXRlKiBzdGF0ZSkKK3sKKwlyZXR1cm4gcHJvZ19kbWFidWYoc3RhdGUsIERNX1BMQVlCQUNLKTsKK30KKworLyogd2UgYXJlIGRvaW5nIHF1YW50dW0gbWVjaGFuaWNzIGhlcmUsIHRoZSBidWZmZXIgY2FuIG9ubHkgYmUgZW1wdHksIGhhbGYgb3IgZnVsbCBmaWxsZWQgaS5lLgorICAgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18ICAgb3IgICB8eHh4eHh4eHh4eHh4fC0tLS0tLS0tLS0tLXwgICBvciAgIHx4eHh4eHh4eHh4eHh8eHh4eHh4eHh4eHh4fAorICAgYnV0IHdlIGFsbW9zdCBhbHdheXMgZ2V0IHRoaXMKKyAgIHx4eHh4eHgtLS0tLS18LS0tLS0tLS0tLS0tfCAgIG9yICAgfHh4eHh4eHh4eHh4eHx4eHh4eC0tLS0tLS18CisgICBzbyB3ZSBoYXZlIHRvIGNsZWFyIHRoZSB0YWlsIHNwYWNlIHRvICJzaWxlbmNlIgorICAgfHh4eHh4eDAwMDAwMHwtLS0tLS0tLS0tLS18ICAgb3IgICB8eHh4eHh4eHh4eHh4fHh4eHh4eDAwMDAwMHwKKyovCitzdGF0aWMgdm9pZAordHJpZGVudF9jbGVhcl90YWlsKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBzd3B0cjsKKwl1bnNpZ25lZCBjaGFyIHNpbGVuY2UgPSAoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyAwIDogMHg4MDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCWlmIChzd3B0ciA9PSAwIHx8IHN3cHRyID09IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIgfHwgCisJICAgIHN3cHRyID09IGRtYWJ1Zi0+ZG1hc2l6ZSkKKwkJcmV0dXJuOworCisJaWYgKHN3cHRyIDwgZG1hYnVmLT5kbWFzaXplIC8gMikKKwkJbGVuID0gZG1hYnVmLT5kbWFzaXplIC8gMiAtIHN3cHRyOworCWVsc2UKKwkJbGVuID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisKKwltZW1zZXQoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgc2lsZW5jZSwgbGVuKTsKKwlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCAhPSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlkbWFidWYtPnN3cHRyICs9IGxlbjsKKwkJZG1hYnVmLT5jb3VudCArPSBsZW47CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJfQorCisJLyogcmVzdGFydCB0aGUgZG1hIG1hY2hpbmUgaW4gY2FzZSBpdCBpcyBoYWx0ZWQgKi8KKwlzdGFydF9kYWMoc3RhdGUpOworfQorCitzdGF0aWMgaW50CitkcmFpbl9kYWMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlLCBpbnQgbm9uYmxvY2spCit7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIHRtbzsKKwlpbnQgY291bnQ7CisJdW5zaWduZWQgbG9uZyBkaWZmID0gMDsKKworCWlmIChkbWFidWYtPm1hcHBlZCB8fCAhZG1hYnVmLT5yZWFkeSkKKwkJcmV0dXJuIDA7CisKKwlhZGRfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdCk7CisJZm9yICg7OykgeworCQkvKiBJdCBzZWVtcyB0aGF0IHdlIGhhdmUgdG8gc2V0IHRoZSBjdXJyZW50IHN0YXRlIHRvIFRBU0tfSU5URVJSVVBUSUJMRQorCQkgICBldmVyeSB0aW1lIHRvIG1ha2UgdGhlIHByb2Nlc3MgcmVhbGx5IGdvIHRvIHNsZWVwICovCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWNvdW50ID0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY291bnQgPD0gMCkKKwkJCWJyZWFrOworCisJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkKKwkJCWJyZWFrOworCisJCWlmIChub25ibG9jaykgeworCQkJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwkJCXJldHVybiAtRUJVU1k7CisJCX0KKworCQkvKiBObyBtYXR0ZXIgaG93IG11Y2ggZGF0YSBpcyBsZWZ0IGluIHRoZSBidWZmZXIsIHdlIGhhdmUgdG8gd2FpdCB1bnRpbAorCQkgICBDU08gPT0gRVNPLzIgb3IgQ1NPID09IEVTTyB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KKwkJaWYgKHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSB8fCAKKwkJICAgIHN0YXRlLT5jYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9JTlRFUkdfNTA1MCkgeworCQkJZGlmZiA9IGRtYWJ1Zi0+c3dwdHIgLSB0cmlkZW50X2dldF9kbWFfYWRkcihzdGF0ZSkgKyBkbWFidWYtPmRtYXNpemU7CisJCQlkaWZmID0gZGlmZiAlIChkbWFidWYtPmRtYXNpemUpOworCQkJdG1vID0gKGRpZmYgKiBIWikgLyBkbWFidWYtPnJhdGU7CisJCX0gZWxzZSB7CisJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gZG1hYnVmLT5yYXRlOworCQl9CisJCXRtbyA+Pj0gc2FtcGxlX3NoaWZ0W2RtYWJ1Zi0+Zm10XTsKKwkJaWYgKCFzY2hlZHVsZV90aW1lb3V0KHRtbyA/IHRtbyA6IDEpICYmIHRtbykgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmVtb3ZlX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXQpOworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHVwZGF0ZSBidWZmZXIgbWFuYW5nZW1lbnQgcG9pbnRlcnMsIGVzcGVjaWFsbHksICovIAorLyogZG1hYnVmLT5jb3VudCBhbmQgZG1hYnVmLT5od3B0ciAqLworc3RhdGljIHZvaWQKK3RyaWRlbnRfdXBkYXRlX3B0cihzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT5kbWFidWY7CisJdW5zaWduZWQgaHdwdHIsIHN3cHRyOworCWludCBjbGVhcl9jbnQgPSAwOworCWludCBkaWZmOworCXVuc2lnbmVkIGNoYXIgc2lsZW5jZTsKKwl1bnNpZ25lZCBoYWxmX2RtYXNpemU7CisKKwkvKiB1cGRhdGUgaGFyZHdhcmUgcG9pbnRlciAqLworCWh3cHRyID0gdHJpZGVudF9nZXRfZG1hX2FkZHIoc3RhdGUpOworCWRpZmYgPSAoZG1hYnVmLT5kbWFzaXplICsgaHdwdHIgLSBkbWFidWYtPmh3cHRyKSAlIGRtYWJ1Zi0+ZG1hc2l6ZTsKKwlkbWFidWYtPmh3cHRyID0gaHdwdHI7CisJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBkaWZmOworCisJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgQURDICovCisJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IEFEQ19SVU5OSU5HKSB7CisJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9IGVsc2UgeworCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOworCisJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgCisJCQkgICAgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgKi8gCisJCQkJLyogd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlciBpdCBoZXJlLCBqdXN0ICovIAorCQkJCS8qIHN0b3AgdGhlIG1hY2hpbmUgYW5kIGxldCB0aGUgcHJvY2VzcyAqLyAKKwkJCQkvKiBmb3JjZSBod3B0ciBhbmQgc3dwdHIgdG8gc3luYyAqLworCQkJCV9fc3RvcF9hZGMoc3RhdGUpOworCQkJCWRtYWJ1Zi0+ZXJyb3IrKzsKKwkJCX0KKwkJCWlmIChkbWFidWYtPmNvdW50IDwgKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplIC8gMikKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9CisJfQorCisJLyogZXJyb3IgaGFuZGxpbmcgYW5kIHByb2Nlc3Mgd2FrZSB1cCBmb3IgREFDICovCisJaWYgKGRtYWJ1Zi0+ZW5hYmxlID09IERBQ19SVU5OSU5HKSB7CisJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJZG1hYnVmLT5jb3VudCArPSBkaWZmOworCQkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gKHNpZ25lZCkgZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9IGVsc2UgeworCQkJZG1hYnVmLT5jb3VudCAtPSBkaWZmOworCisJCQlpZiAoZG1hYnVmLT5jb3VudCA8IDAgfHwgCisJCQkgICAgZG1hYnVmLT5jb3VudCA+IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQkJCS8qIGJ1ZmZlciB1bmRlcnJ1biBvciBidWZmZXIgb3ZlcnJ1biwgd2UgaGF2ZSBubyB3YXkgdG8gcmVjb3ZlcgorCQkJCSAgIGl0IGhlcmUsIGp1c3Qgc3RvcCB0aGUgbWFjaGluZSBhbmQgbGV0IHRoZSBwcm9jZXNzIGZvcmNlIGh3cHRyCisJCQkJICAgYW5kIHN3cHRyIHRvIHN5bmMgKi8KKwkJCQlfX3N0b3BfZGFjKHN0YXRlKTsKKwkJCQlkbWFidWYtPmVycm9yKys7CisJCQl9IGVsc2UgaWYgKCFkbWFidWYtPmVuZGNsZWFyZWQpIHsKKwkJCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisJCQkJc2lsZW5jZSA9IChkbWFidWYtPmZtdCAmIFRSSURFTlRfRk1UXzE2QklUID8gMCA6IDB4ODApOworCQkJCWlmIChkbWFidWYtPnVwZGF0ZV9mbGFnICYgQUxJX0FERFJFU1NfSU5UX1VQREFURSkgeworCQkJCQkvKiBXZSBtdXN0IGNsZWFyIGVuZCBkYXRhIG9mIDEvMiBkbWFidWYgaWYgbmVlZGVkLgorCQkJCQkgICBBY2NvcmRpbmcgdG8gMS8yIGFsZ29yaXRobSBvZiBBZGRyZXNzIEVuZ2luZSBJbnRlcnJ1cHQsCisJCQkJCSAgIGNoZWNrIHRoZSB2YWxpZGF0aW9uIG9mIHRoZSBkYXRhIG9mIGhhbGYgZG1hc2l6ZS4gKi8KKwkJCQkJaGFsZl9kbWFzaXplID0gZG1hYnVmLT5kbWFzaXplIC8gMjsKKwkJCQkJaWYgKChkaWZmID0gaHdwdHIgLSBoYWxmX2RtYXNpemUpIDwgMCkKKwkJCQkJCWRpZmYgPSBod3B0cjsKKwkJCQkJaWYgKChkbWFidWYtPmNvdW50ICsgZGlmZikgPCBoYWxmX2RtYXNpemUpIHsKKwkJCQkJCS8vdGhlcmUgaXMgaW52YWxpZCBkYXRhIGluIHRoZSBlbmQgb2YgaGFsZiBidWZmZXIKKwkJCQkJCWlmICgoY2xlYXJfY250ID0gaGFsZl9kbWFzaXplIC0gc3dwdHIpIDwgMCkKKwkJCQkJCQljbGVhcl9jbnQgKz0gaGFsZl9kbWFzaXplOworCQkJCQkJLy9jbGVhciB0aGUgaW52YWxpZCBkYXRhCisJCQkJCQltZW1zZXQoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgc2lsZW5jZSwgY2xlYXJfY250KTsKKwkJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKKwkJCQkJCQljbGVhcl9jbnQgPSBjbGVhcl9jbnQgLyAyOworCQkJCQkJCXN3cHRyID0gc3dwdHIgLyAyOworCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOworCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzFdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOworCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOworCQkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOworCQkJCQkJfQorCQkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMTsKKwkJCQkJfQorCQkJCX0gZWxzZSBpZiAoZG1hYnVmLT5jb3VudCA8IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpIHsKKwkJCQkJY2xlYXJfY250ID0gZG1hYnVmLT5mcmFnc2l6ZTsKKwkJCQkJaWYgKChzd3B0ciArIGNsZWFyX2NudCkgPiBkbWFidWYtPmRtYXNpemUpCisJCQkJCQljbGVhcl9jbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKKwkJCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIHNpbGVuY2UsIGNsZWFyX2NudCk7CisJCQkJCWlmIChzdGF0ZS0+Y2hhbnNfbnVtID09IDYpIHsKKwkJCQkJCWNsZWFyX2NudCA9IGNsZWFyX2NudCAvIDI7CisJCQkJCQlzd3B0ciA9IHN3cHRyIC8gMjsKKwkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzBdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CisJCQkJCQltZW1zZXQoc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmLnJhd2J1ZiArIHN3cHRyLCAKKwkJCQkJCSAgICAgICBzaWxlbmNlLCBjbGVhcl9jbnQpOworCQkJCQkJbWVtc2V0KHN0YXRlLT5vdGhlcl9zdGF0ZXNbMl0tPmRtYWJ1Zi5yYXdidWYgKyBzd3B0ciwgCisJCQkJCQkgICAgICAgc2lsZW5jZSwgY2xlYXJfY250KTsKKwkJCQkJCW1lbXNldChzdGF0ZS0+b3RoZXJfc3RhdGVzWzNdLT5kbWFidWYucmF3YnVmICsgc3dwdHIsIAorCQkJCQkJICAgICAgIHNpbGVuY2UsIGNsZWFyX2NudCk7CisJCQkJCX0KKwkJCQkJZG1hYnVmLT5lbmRjbGVhcmVkID0gMTsKKwkJCQl9CisJCQl9CisJCQkvKiB0cmlkZW50X3VwZGF0ZV9wdHIgaXMgY2FsbGVkIGJ5IGludGVycnVwdCBoYW5kbGVyIG9yIGJ5IHByb2Nlc3MgdmlhCisJCQkgICBpb2N0bC9wb2xsLCB3ZSBvbmx5IHdha2UgdXAgdGhlIHdhaXRpbmcgcHJvY2VzcyB3aGVuIHdlIGhhdmUgbW9yZQorCQkJICAgdGhhbiAxLzIgYnVmZmVyIGZyZWUgKGFsd2F5cyB0cnVlIGZvciBpbnRlcnJ1cHQgaGFuZGxlcikgKi8KKwkJCWlmIChkbWFidWYtPmNvdW50IDwgKHNpZ25lZCkgZG1hYnVmLT5kbWFzaXplIC8gMikKKwkJCQl3YWtlX3VwKCZkbWFidWYtPndhaXQpOworCQl9CisJfQorCWRtYWJ1Zi0+dXBkYXRlX2ZsYWcgJj0gfkFMSV9BRERSRVNTX0lOVF9VUERBVEU7Cit9CisKK3N0YXRpYyB2b2lkCit0cmlkZW50X2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJaW50IGk7CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlOworCXVuc2lnbmVkIGludCBjaGFubmVsOworCisJLyogVXBkYXRlIHRoZSBwb2ludGVycyBmb3IgYWxsIGNoYW5uZWxzIHdlIGFyZSBydW5uaW5nLiAqLworCS8qIEZJWE1FOiBzaG91bGQgcmVhZCBpbnRlcnJ1cHQgc3RhdHVzIG9ubHkgb25jZSAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9IV19DSDsgaSsrKSB7CisJCWNoYW5uZWwgPSA2MyAtIGk7CisJCWlmICh0cmlkZW50X2NoZWNrX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQsIGNoYW5uZWwpKSB7CisJCQl0cmlkZW50X2Fja19jaGFubmVsX2ludGVycnVwdChjYXJkLCBjaGFubmVsKTsKKwkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKKwkJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ0cmlkZW50OiBzcHVyaW91cyBjaGFubmVsICIgCisJCQkJICAgICAgICJpcnEgJWQuXG4iLCBjaGFubmVsKTsKKwkJCQl0cmlkZW50X3N0b3Bfdm9pY2UoY2FyZCwgY2hhbm5lbCk7CisJCQkJdHJpZGVudF9kaXNhYmxlX3ZvaWNlX2lycShjYXJkLCBjaGFubmVsKTsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2FsaV9od3ZvbF9jb250cm9sKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBvcHQpCit7CisJdTE2IGR3VGVtcCwgdm9sdW1lWzJdLCBtdXRlLCBkaWZmLCAqcFZvbFsyXTsKKworCWR3VGVtcCA9IGFsaV9hYzk3X3JlYWQoY2FyZC0+YWM5N19jb2RlY1swXSwgMHgwMik7CisJbXV0ZSA9IGR3VGVtcCAmIDB4ODAwMDsKKwl2b2x1bWVbMF0gPSBkd1RlbXAgJiAweDAwMWY7CisJdm9sdW1lWzFdID0gKGR3VGVtcCAmIDB4MWYwMCkgPj4gODsKKwlpZiAodm9sdW1lWzBdIDwgdm9sdW1lWzFdKSB7CisJCXBWb2xbMF0gPSAmdm9sdW1lWzBdOworCQlwVm9sWzFdID0gJnZvbHVtZVsxXTsKKwl9IGVsc2UgeworCQlwVm9sWzFdID0gJnZvbHVtZVswXTsKKwkJcFZvbFswXSA9ICZ2b2x1bWVbMV07CisJfQorCWRpZmYgPSAqKHBWb2xbMV0pIC0gKihwVm9sWzBdKTsKKworCWlmIChvcHQgPT0gMSkgewkJLy8gTVVURQorCQlkd1RlbXAgXj0gMHg4MDAwOworCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAKKwkJCSAgICAgICAweDAyLCBkd1RlbXApOworCX0gZWxzZSBpZiAob3B0ID09IDIpIHsJLy8gRG93bgorCQlpZiAobXV0ZSkKKwkJCXJldHVybjsKKwkJaWYgKCoocFZvbFsxXSkgPCAweDAwMWYpIHsKKwkJCSgqcFZvbFsxXSkrKzsKKwkJCSoocFZvbFswXSkgPSAqKHBWb2xbMV0pIC0gZGlmZjsKKwkJfQorCQlkd1RlbXAgJj0gMHhlMGUwOworCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOworCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCBkd1RlbXApOworCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8IAorCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKKwl9IGVsc2UgaWYgKG9wdCA9PSA0KSB7CS8vIFVwCisJCWlmIChtdXRlKQorCQkJcmV0dXJuOworCQlpZiAoKihwVm9sWzBdKSA+IDApIHsKKwkJCSgqcFZvbFswXSktLTsKKwkJCSoocFZvbFsxXSkgPSAqKHBWb2xbMF0pICsgZGlmZjsKKwkJfQorCQlkd1RlbXAgJj0gMHhlMGUwOworCQlkd1RlbXAgfD0gKHZvbHVtZVswXSkgfCAodm9sdW1lWzFdIDw8IDgpOworCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDAyLCBkd1RlbXApOworCQljYXJkLT5hYzk3X2NvZGVjWzBdLT5taXhlcl9zdGF0ZVswXSA9ICgoMzIgLSB2b2x1bWVbMF0pICogMjUgLyA4KSB8IAorCQkJKCgoMzIgLSB2b2x1bWVbMV0pICogMjUgLyA4KSA8PCA4KTsKKwl9IGVsc2UgeworCQkvKiBOb3RoaW5nIG5lZWRzIGRvaW5nICovCisJfQorfQorCisvKgorICoJUmUtZW5hYmxlIHJlcG9ydGluZyBvZiB2b2wgY2hhbmdlIGFmdGVyIDAuMSBzZWNvbmRzCisgKi8KKworc3RhdGljIHZvaWQKK2FsaV90aW1lb3V0KHVuc2lnbmVkIGxvbmcgcHRyKQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKSBwdHI7CisJdTE2IHRlbXAgPSAwOworCisJLyogRW5hYmxlIEdQSU8gSVJRIChNSVNDSU5UIGJpdCAxOGgpICovCisJdGVtcCA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCArIDIpKTsKKwl0ZW1wIHw9IDB4MDAwNDsKKwlvdXR3KHRlbXAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOworfQorCisvKgorICoJU2V0IHVwIHRoZSB0aW1lciB0byBjbGVhciB0aGUgdm9sIGNoYW5nZSBub3RpZmljYXRpb24KKyAqLworCitzdGF0aWMgdm9pZAorYWxpX3NldF90aW1lcihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCS8qIEFkZCBUaW1lciBSb3V0aW5lIHRvIEVuYWJsZSBHUElPIElSUSAqLworCWRlbF90aW1lcigmY2FyZC0+dGltZXIpOwkvKiBOZXZlciBxdWV1ZSB0d2ljZSAqLworCWNhcmQtPnRpbWVyLmZ1bmN0aW9uID0gYWxpX3RpbWVvdXQ7CisJY2FyZC0+dGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSBjYXJkOworCWNhcmQtPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgSFogLyAxMDsKKwlhZGRfdGltZXIoJmNhcmQtPnRpbWVyKTsKK30KKworLyoKKyAqCVByb2Nlc3MgYSBHUElPIGV2ZW50CisgKi8KKworc3RhdGljIHZvaWQKK2FsaV9xdWV1ZV90YXNrKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBvcHQpCit7CisJdTE2IHRlbXA7CisKKwkvKiBEaXNhYmxlIEdQSU8gSVJRIChNSVNDSU5UIGJpdCAxOGgpICovCisJdGVtcCA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCArIDIpKTsKKwl0ZW1wICY9ICh1MTYpICh+MHgwMDA0KTsKKwlvdXR3KHRlbXAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UICsgMikpOworCisJLyogQWRqdXN0IHRoZSB2b2x1bWUgKi8KKwlhbGlfaHd2b2xfY29udHJvbChjYXJkLCBvcHQpOworCisJLyogU2V0IHRoZSB0aW1lciBmb3IgMS8xMHRoIHNlYyAqLworCWFsaV9zZXRfdGltZXIoY2FyZCk7Cit9CisKK3N0YXRpYyB2b2lkCitjeWJlcl9hZGRyZXNzX2ludGVycnVwdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCWludCBpLCBpcnFfc3RhdHVzOworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZTsKKwl1bnNpZ25lZCBpbnQgY2hhbm5lbDsKKworCS8qIFVwZGF0ZSB0aGUgcG9pbnRlcnMgZm9yIGFsbCBjaGFubmVscyB3ZSBhcmUgcnVubmluZy4gKi8KKwkvKiBGSVhFRDogcmVhZCBpbnRlcnJ1cHQgc3RhdHVzIG9ubHkgb25jZSAqLworCWlycV9zdGF0dXMgPSBpbmwoVFJJRF9SRUcoY2FyZCwgVDREX0FJTlRfQSkpOworCisJcHJfZGVidWcoImN5YmVyX2FkZHJlc3NfaW50ZXJydXB0OiBpcnFfc3RhdHVzIDB4JVhcbiIsIGlycV9zdGF0dXMpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJY2hhbm5lbCA9IDMxIC0gaTsKKwkJaWYgKGlycV9zdGF0dXMgJiAoMSA8PCBjaGFubmVsKSkgeworCQkJLyogY2xlYXIgYml0IGJ5IHdyaXRpbmcgYSAxLCB6ZXJvZXMgYXJlIGlnbm9yZWQgKi8KKwkJCW91dGwoKDEgPDwgY2hhbm5lbCksIFRSSURfUkVHKGNhcmQsIFQ0RF9BSU5UX0EpKTsKKworCQkJcHJfZGVidWcoImN5YmVyX2ludGVycnVwdDogY2hhbm5lbCAlZFxuIiwgY2hhbm5lbCk7CisKKwkJCWlmICgoc3RhdGUgPSBjYXJkLT5zdGF0ZXNbaV0pICE9IE5VTEwpIHsKKwkJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9XQVJOSU5HICJjeWJlcjUwNTA6IHNwdXJpb3VzICIgCisJCQkJICAgICAgICJjaGFubmVsIGlycSAlZC5cbiIsIGNoYW5uZWwpOworCQkJCXRyaWRlbnRfc3RvcF92b2ljZShjYXJkLCBjaGFubmVsKTsKKwkJCQl0cmlkZW50X2Rpc2FibGVfdm9pY2VfaXJxKGNhcmQsIGNoYW5uZWwpOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QKK3RyaWRlbnRfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIGRldl9pZDsKKwl1MzIgZXZlbnQ7CisJdTMyIGdwaW87CisKKwlzcGluX2xvY2soJmNhcmQtPmxvY2spOworCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisKKwlwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF9pbnRlcnJ1cHQgY2FsbGVkLCBNSVNDSU5UID0gMHglMDh4XG4iLAorCQkgZXZlbnQpOworCisJaWYgKGV2ZW50ICYgQUREUkVTU19JUlEpIHsKKwkJY2FyZC0+YWRkcmVzc19pbnRlcnJ1cHQoY2FyZCk7CisJfQorCisJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCS8qIEdQSU8gSVJRIChIL1cgVm9sdW1lIENvbnRyb2wpICovCisJCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJCWlmIChldmVudCAmICgxIDw8IDI1KSkgeworCQkJZ3BpbyA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfR1BJTykpOworCQkJaWYgKCF0aW1lcl9wZW5kaW5nKCZjYXJkLT50aW1lcikpCisJCQkJYWxpX3F1ZXVlX3Rhc2soY2FyZCwgZ3BpbyAmIDB4MDcpOworCQl9CisJCWV2ZW50ID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJCW91dGwoZXZlbnQgfCAoU1RfVEFSR0VUX1JFQUNIRUQgfCBNSVhFUl9PVkVSRkxPVyB8IE1JWEVSX1VOREVSRkxPVyksIAorCQkgICAgIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJCXNwaW5fdW5sb2NrKCZjYXJkLT5sb2NrKTsKKwkJcmV0dXJuIElSUV9IQU5ETEVEOworCX0KKworCS8qIG1hbnVhbGx5IGNsZWFyIGludGVycnVwdCBzdGF0dXMsIGJhZCBoYXJkd2FyZSBkZXNpZ24sIGJsYW1lIFReMiAqLworCW91dGwoKFNUX1RBUkdFVF9SRUFDSEVEIHwgTUlYRVJfT1ZFUkZMT1cgfCBNSVhFUl9VTkRFUkZMT1cpLCAKKwkgICAgIFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJc3Bpbl91bmxvY2soJmNhcmQtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgKi8gCisvKiB0byBiZSBjb3BpZWQgdG8gdGhlIHVzZXIncyBidWZmZXIuICBpdCBpcyBmaWxsZWQgYnkgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKKy8qIGRyYWluZWQgYnkgdGhpcyBsb29wLiAqLworc3RhdGljIHNzaXplX3QKK3RyaWRlbnRfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBwcG9zKQoreworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzc2l6ZV90IHJldCA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBzd3B0cjsKKwlpbnQgY250OworCisJcHJfZGVidWcoInRyaWRlbnQ6IHRyaWRlbnRfcmVhZCBjYWxsZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKKworCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKKworCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJcmV0dXJuIC1FTlhJTzsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWRvd24oJnN0YXRlLT5zZW0pOworCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkpCisJCWdvdG8gb3V0OworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPiAoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUpIHsKKwkJCS8qIGJ1ZmZlciBvdmVycnVuLCB3ZSBhcmUgcmVjb3ZlcmluZyBmcm9tICovIAorCQkJLyogc2xlZXBfb25fdGltZW91dCwgcmVzeW5jIGh3cHRyIGFuZCBzd3B0ciwgKi8gCisJCQkvKiBtYWtlIHByb2Nlc3MgZmx1c2ggdGhlIGJ1ZmZlciAqLworCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOworCQl9CisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisJCWlmIChkbWFidWYtPmNvdW50IDwgY250KQorCQkJY250ID0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQl1bnNpZ25lZCBsb25nIHRtbzsKKwkJCS8qIGJ1ZmZlciBpcyBlbXB0eSwgc3RhcnQgdGhlIGRtYSBtYWNoaW5lIGFuZCAqLyAKKwkJCS8qIHdhaXQgZm9yIGRhdGEgdG8gYmUgcmVjb3JkZWQgKi8KKwkJCXN0YXJ0X2FkYyhzdGF0ZSk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKworCQkJdXAoJnN0YXRlLT5zZW0pOworCQkJLyogTm8gbWF0dGVyIGhvdyBtdWNoIHNwYWNlIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8gCisJCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8gCisJCQkvKiB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KKwkJCXRtbyA9IChkbWFidWYtPmRtYXNpemUgKiBIWikgLyAoZG1hYnVmLT5yYXRlICogMik7CisJCQl0bW8gPj49IHNhbXBsZV9zaGlmdFtkbWFidWYtPmZtdF07CisJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0IHJldHVybnMsIG9uZSBpcyB3aGVuCisJCQkgICB0aGUgaW50ZXJydXB0IGlzIHNlcnZpY2VkIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkKKwkJCSAgIElTUiBPTiBUSU1FLiBBbm90aGVyIGlzIHdoZW4gdGltZW91dCBpcyBleHBpcmVkLCB3aGljaCBtZWFucyB0aGF0CisJCQkgICBlaXRoZXIgaW50ZXJydXB0IGlzIE5PVCBzZXJ2aWNlZCBjb3JyZWN0bHkgKHBlbmRpbmcgaW50ZXJydXB0KSBvciBpdAorCQkJICAgaXMgVE9PIExBVEUgZm9yIHRoZSBwcm9jZXNzIHRvIGJlIHNjaGVkdWxlZCB0byBydW4gKHNjaGVkdWxlciBsYXRlbmN5KQorCQkJICAgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpIGJ1ZmZlciBvdmVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzCisJCQkgICBOT1RISU5HIHdlIGNhbiBkbyB0byBwcmV2ZW50IGl0LiAqLworCQkJaWYgKCFpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQoJmRtYWJ1Zi0+d2FpdCwgdG1vKSkgeworCQkJCXByX2RlYnVnKEtFUk5fRVJSICJ0cmlkZW50OiByZWNvcmRpbmcgc2NoZWR1bGUgdGltZW91dCwgIgorCQkJCQkgImRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKKwkJCQkJIGRtYWJ1Zi0+ZG1hc2l6ZSwgZG1hYnVmLT5mcmFnc2l6ZSwgZG1hYnVmLT5jb3VudCwKKwkJCQkJIGRtYWJ1Zi0+aHdwdHIsIGRtYWJ1Zi0+c3dwdHIpOworCisJCQkJLyogYSBidWZmZXIgb3ZlcnJ1biwgd2UgZGVsYXkgdGhlIHJlY292ZXJ5IHVudGlsIG5leHQgdGltZSB0aGUKKwkJCQkgICB3aGlsZSBsb29wIGJlZ2luIGFuZCB3ZSBSRUFMTFkgaGF2ZSBzcGFjZSB0byByZWNvcmQgKi8KKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlkb3duKCZzdGF0ZS0+c2VtKTsKKwkJCWlmIChkbWFidWYtPm1hcHBlZCkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRU5YSU87CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkKKwkJCQlyZXQgPSAtRUZBVUxUOworCQkJZ290byBvdXQ7CisJCX0KKworCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBkbWFidWYtPmRtYXNpemU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKKwkJZG1hYnVmLT5jb3VudCAtPSBjbnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQlzdGFydF9hZGMoc3RhdGUpOworCX0KK291dDoKKwl1cCgmc3RhdGUtPnNlbSk7CisJcmV0dXJuIHJldDsKK30KKworLyogaW4gdGhpcyBsb29wLCBkbWFidWYuY291bnQgc2lnbmlmaWVzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHdhaXRpbmcgdG8gYmUgZG1hIHRvCisgICB0aGUgc291bmRjYXJkLiAgaXQgaXMgZHJhaW5lZCBieSB0aGUgZG1hIG1hY2hpbmUgYW5kIGZpbGxlZCBieSB0aGlzIGxvb3AuICovCisKK3N0YXRpYyBzc2l6ZV90Cit0cmlkZW50X3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqIHBwb3MpCit7CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgc3dwdHI7CisJaW50IGNudDsKKwl1bnNpZ25lZCBpbnQgc3RhdGVfY250OworCXVuc2lnbmVkIGludCBjb3B5X2NvdW50OworCWludCBscmV0OyAvKiBmb3IgbG9ja19zZXRfZm10ICovCisKKwlwcl9kZWJ1ZygidHJpZGVudDogdHJpZGVudF93cml0ZSBjYWxsZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KTsKKworCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKKworCS8qCisJICogICAgICBHdWFyZCBhZ2FpbnN0IGFuIG1tYXAgb3IgaW9jdGwgd2hpbGUgd3JpdGluZworCSAqLworCisJZG93bigmc3RhdGUtPnNlbSk7CisKKwlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJcmV0ID0gLUVOWElPOworCQlnb3RvIG91dDsKKwl9CisJaWYgKCFkbWFidWYtPnJlYWR5ICYmIChyZXQgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpKQorCQlnb3RvIG91dDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBidWZmZXIsIGNvdW50KSkgeworCQlyZXQgPSAtRUZBVUxUOworCQlnb3RvIG91dDsKKwl9CisKKwlyZXQgPSAwOworCisJd2hpbGUgKGNvdW50ID4gMCkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCAwKSB7CisJCQkvKiBidWZmZXIgdW5kZXJydW4sIHdlIGFyZSByZWNvdmVyaW5nIGZyb20gKi8gCisJCQkvKiBzbGVlcF9vbl90aW1lb3V0LCByZXN5bmMgaHdwdHIgYW5kIHN3cHRyICovCisJCQlkbWFidWYtPmNvdW50ID0gMDsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyOworCQl9CisJCXN3cHRyID0gZG1hYnVmLT5zd3B0cjsKKwkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisJCWlmIChkbWFidWYtPmNvdW50ICsgY250ID4gZG1hYnVmLT5kbWFzaXplKQorCQkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKworCQlpZiAoY250ID4gY291bnQpCisJCQljbnQgPSBjb3VudDsKKwkJaWYgKGNudCA8PSAwKSB7CisJCQl1bnNpZ25lZCBsb25nIHRtbzsKKwkJCS8qIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kICovIAorCQkJLyogd2FpdCBmb3IgZGF0YSB0byBiZSBwbGF5ZWQgKi8KKwkJCXN0YXJ0X2RhYyhzdGF0ZSk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVBR0FJTjsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCS8qIE5vIG1hdHRlciBob3cgbXVjaCBkYXRhIGxlZnQgaW4gdGhlIGJ1ZmZlciwgKi8gCisJCQkvKiB3ZSBoYXZlIHRvIHdhaXQgdW50aWwgQ1NPID09IEVTTy8yIG9yIENTTyA9PSBFU08gKi8gCisJCQkvKiB3aGVuIGFkZHJlc3MgZW5naW5lIGludGVycnVwdHMgKi8KKwkJCWxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gKGRtYWJ1Zi0+cmF0ZSAqIDIpOworCQkJdG1vID4+PSBzYW1wbGVfc2hpZnRbZG1hYnVmLT5mbXRdOworCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOworCQkJdXAoJnN0YXRlLT5zZW0pOworCisJCQkvKiBUaGVyZSBhcmUgdHdvIHNpdHVhdGlvbnMgd2hlbiBzbGVlcF9vbl90aW1lb3V0ICovIAorCQkJLyogcmV0dXJucywgb25lIGlzIHdoZW4gdGhlIGludGVycnVwdCBpcyBzZXJ2aWNlZCAqLyAKKwkJCS8qIGNvcnJlY3RseSBhbmQgdGhlIHByb2Nlc3MgaXMgd2FrZWQgdXAgYnkgSVNSICovIAorCQkJLyogT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggKi8gCisJCQkvKiBtZWFucyB0aGF0IGVpdGhlciBpbnRlcnJ1cHQgaXMgTk9UIHNlcnZpY2VkICovIAorCQkJLyogY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQgaXMgVE9PIExBVEUgKi8gCisJCQkvKiBmb3IgdGhlIHByb2Nlc3MgdG8gYmUgc2NoZWR1bGVkIHRvIHJ1biAqLyAKKwkJCS8qIChzY2hlZHVsZXIgbGF0ZW5jeSkgd2hpY2ggcmVzdWx0cyBpbiBhIChwb3RlbnRpYWwpICovIAorCQkJLyogYnVmZmVyIHVuZGVycnVuLiBBbmQgd29yc2UsIHRoZXJlIGlzIE5PVEhJTkcgd2UgKi8gCisJCQkvKiBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KKwkJCWlmICghaW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KCZkbWFidWYtPndhaXQsIHRtbykpIHsKKwkJCQlwcl9kZWJ1ZyhLRVJOX0VSUiAidHJpZGVudDogcGxheWJhY2sgc2NoZWR1bGUgIgorCQkJCQkgInRpbWVvdXQsIGRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSAiCisJCQkJCSAiaHdwdHIgJXUgc3dwdHIgJXVcbiIsIGRtYWJ1Zi0+ZG1hc2l6ZSwKKwkJCQkJIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+Y291bnQsCisJCQkJCSBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKKworCQkJCS8qIGEgYnVmZmVyIHVuZGVycnVuLCB3ZSBkZWxheSB0aGUgcmVjb3ZlcnkgKi8gCisJCQkJLyogdW50aWwgbmV4dCB0aW1lIHRoZSB3aGlsZSBsb29wIGJlZ2luIGFuZCAqLyAKKwkJCQkvKiB3ZSBSRUFMTFkgaGF2ZSBkYXRhIHRvIHBsYXkgKi8KKwkJCX0KKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJZ290byBvdXRfbm9sb2NrOworCQkJfQorCQkJZG93bigmc3RhdGUtPnNlbSk7CisJCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVOWElPOworCQkJCWdvdG8gb3V0OworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKChscmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKSB7CisJCQlyZXQgPSBscmV0OworCQkJZ290byBvdXQ7CisJCX0KKworCQlpZiAoc3RhdGUtPmNoYW5zX251bSA9PSA2KSB7CisJCQljb3B5X2NvdW50ID0gMDsKKwkJCXN0YXRlX2NudCA9IDA7CisJCQlpZiAoYWxpX3dyaXRlXzVfMShzdGF0ZSwgYnVmZmVyLCBjbnQsICZjb3B5X2NvdW50LCAKKwkJCQkJICAmc3RhdGVfY250KSA9PSAtRUZBVUxUKSB7CisJCQkJaWYgKHN0YXRlX2NudCkgeworCQkJCQlzd3B0ciA9IChzd3B0ciArIHN0YXRlX2NudCkgJSBkbWFidWYtPmRtYXNpemU7CisJCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CisJCQkJCWRtYWJ1Zi0+Y291bnQgKz0gc3RhdGVfY250OworCQkJCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAwOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCX0KKwkJCQlyZXQgKz0gY29weV9jb3VudDsKKwkJCQlpZiAoIXJldCkKKwkJCQkJcmV0ID0gLUVGQVVMVDsKKwkJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgCisJCQkJCSAgIGJ1ZmZlciwgY250KSkgeworCQkJCWlmICghcmV0KQorCQkJCQlyZXQgPSAtRUZBVUxUOworCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXN0YXRlX2NudCA9IGNudDsKKwkJfQorCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisKKwkJc3dwdHIgPSAoc3dwdHIgKyBzdGF0ZV9jbnQpICUgZG1hYnVmLT5kbWFzaXplOworCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CisJCWRtYWJ1Zi0+Y291bnQgKz0gc3RhdGVfY250OworCQlkbWFidWYtPmVuZGNsZWFyZWQgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwkJc3RhcnRfZGFjKHN0YXRlKTsKKwl9CitvdXQ6CisJdXAoJnN0YXRlLT5zZW0pOworb3V0X25vbG9jazoKKwlyZXR1cm4gcmV0OworfQorCisvKiBObyBrZXJuZWwgbG9jayAtIHdlIGhhdmUgb3VyIG93biBzcGlubG9jayAqLworc3RhdGljIHVuc2lnbmVkIGludAordHJpZGVudF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IG1hc2sgPSAwOworCisJVkFMSURBVEVfU1RBVEUoc3RhdGUpOworCisJLyoKKwkgKiAgICAgIEd1YXJkIGFnYWluc3QgYSBwYXJhbGxlbCBwb2xsIGFuZCB3cml0ZSBjYXVzaW5nIG11bHRpcGxlCisJICogICAgICBwcm9nX2RtYWJ1ZiBldmVudHMKKwkgKi8KKworCWRvd24oJnN0YXRlLT5zZW0pOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpIHsKKwkJCXVwKCZzdGF0ZS0+c2VtKTsKKwkJCXJldHVybiAwOworCQl9CisJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpIHsKKwkJCXVwKCZzdGF0ZS0+c2VtKTsKKwkJCXJldHVybiAwOworCQl9CisJCXBvbGxfd2FpdChmaWxlLCAmZG1hYnVmLT53YWl0LCB3YWl0KTsKKwl9CisKKwl1cCgmc3RhdGUtPnNlbSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoc2lnbmVkKSBkbWFidWYtPmRtYXNpemUgPj0gZG1hYnVmLT5jb3VudCArIAorCQkJICAgIChzaWduZWQpIGRtYWJ1Zi0+ZnJhZ3NpemUpCisJCQkJbWFzayB8PSBQT0xMT1VUIHwgUE9MTFdSTk9STTsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQKK3RyaWRlbnRfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB0cmlkZW50X3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCWludCByZXQgPSAtRUlOVkFMOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKKworCS8qCisJICogICAgICBMb2NrIGFnYWluc3QgcG9sbCByZWFkIHdyaXRlIG9yIG1tYXAgY3JlYXRpbmcgYnVmZmVycy4gQWxzbyBsb2NrCisJICogICAgICBhIHJlYWQgb3Igd3JpdGUgYWdhaW5zdCBhbiBtbWFwLgorCSAqLworCisJZG93bigmc3RhdGUtPnNlbSk7CisKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX1dSSVRFKSB7CisJCWlmICgocmV0ID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSAhPSAwKQorCQkJZ290byBvdXQ7CisJfSBlbHNlIGlmICh2bWEtPnZtX2ZsYWdzICYgVk1fUkVBRCkgeworCQlpZiAoKHJldCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpICE9IDApCisJCQlnb3RvIG91dDsKKwl9IGVsc2UKKwkJZ290byBvdXQ7CisKKwlyZXQgPSAtRUlOVkFMOworCWlmICh2bWEtPnZtX3Bnb2ZmICE9IDApCisJCWdvdG8gb3V0OworCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJaWYgKHNpemUgPiAoUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXIpKQorCQlnb3RvIG91dDsKKwlyZXQgPSAtRUFHQUlOOworCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0LAorCQkJICAgICB2aXJ0X3RvX3BoeXMoZG1hYnVmLT5yYXdidWYpID4+IFBBR0VfU0hJRlQsCisJCQkgICAgIHNpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKKwkJZ290byBvdXQ7CisJZG1hYnVmLT5tYXBwZWQgPSAxOworCXJldCA9IDA7CitvdXQ6CisJdXAoJnN0YXRlLT5zZW0pOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQKK3RyaWRlbnRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsIAorCSAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWF1ZGlvX2J1Zl9pbmZvIGFiaW5mbzsKKwljb3VudF9pbmZvIGNpbmZvOworCWludCB2YWwsIG1hcHBlZCwgcmV0ID0gMDsKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gc3RhdGUtPmNhcmQ7CisJdm9pZCBfX3VzZXIgKmFyZ3AgPSAodm9pZCBfX3VzZXIgKilhcmc7CisJaW50IF9fdXNlciAqcCA9IGFyZ3A7CisKKwlWQUxJREFURV9TVEFURShzdGF0ZSk7CisKKworCW1hcHBlZCA9ICgoZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1dSSVRFIHwgRk1PREVfUkVBRCkpICYmIGRtYWJ1Zi0+bWFwcGVkKTsKKworCXByX2RlYnVnKCJ0cmlkZW50OiB0cmlkZW50X2lvY3RsLCBjb21tYW5kID0gJTJkLCBhcmcgPSAweCUwOHhcbiIsCisJCSBfSU9DX05SKGNtZCksIGFyZyA/ICpwIDogMCk7CisKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgT1NTX0dFVFZFUlNJT046CisJCXJldCA9IHB1dF91c2VyKFNPVU5EX1ZFUlNJT04sIHApOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJLyogRklYTUU6IHNwaW5fbG9jayA/ICovCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJc3luY2hyb25pemVfaXJxKGNhcmQtPmlycSk7CisJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKKwkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJc3RvcF9hZGMoc3RhdGUpOworCQkJc3luY2hyb25pemVfaXJxKGNhcmQtPmlycSk7CisJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCWRtYWJ1Zi0+c3dwdHIgPSBkbWFidWYtPmh3cHRyID0gMDsKKwkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCQlyZXQgPSBkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6CS8qIHNldCBzbWFwbGUgcmF0ZSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmICh2YWwgPj0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJCXRyaWRlbnRfc2V0X2RhY19yYXRlKHN0YXRlLCB2YWwpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJCQl0cmlkZW50X3NldF9hZGNfcmF0ZShzdGF0ZSwgdmFsKTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQkJfQorCQl9CisJCXJldCA9IHB1dF91c2VyKGRtYWJ1Zi0+cmF0ZSwgcCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NURVJFTzoJLyogc2V0IHN0ZXJlbyBvciBtb25vIGNoYW5uZWwgKi8KKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAoKHJldCA9IGxvY2tfc2V0X2ZtdChzdGF0ZSkpIDwgMCkKKwkJCXJldHVybiByZXQ7CisKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlzdG9wX2RhYyhzdGF0ZSk7CisJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCWlmICh2YWwpCisJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOworCQkJZWxzZQorCQkJCWRtYWJ1Zi0+Zm10ICY9IH5UUklERU5UX0ZNVF9TVEVSRU87CisJCX0KKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCXN0b3BfYWRjKHN0YXRlKTsKKwkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJaWYgKHZhbCkKKwkJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF9TVEVSRU87CisJCQllbHNlCisJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX1NURVJFTzsKKwkJfQorCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpKQorCQkJCXJldCA9IHZhbDsKKwkJCWVsc2UKKwkJCQlyZXQgPSBwdXRfdXNlcihkbWFidWYtPmZyYWdzaXplLCBwKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpKQorCQkJCXJldCA9IHZhbDsKKwkJCWVsc2UKKwkJCQlyZXQgPSBwdXRfdXNlcihkbWFidWYtPmZyYWdzaXplLCBwKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIG5laXRoZXIgUkVBRCBub3IgV1JJVEU/IGlzIHRoaXMgZXZlbiBwb3NzaWJsZT8gKi8KKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRGTVRTOiAvKiBSZXR1cm5zIGEgbWFzayBvZiBzdXBwb3J0ZWQgc2FtcGxlIGZvcm1hdCAqLworCQlyZXQgPSBwdXRfdXNlcihBRk1UX1MxNl9MRSB8IEFGTVRfVTE2X0xFIHwgQUZNVF9TOCB8IAorCQkJICAgICAgIEFGTVRfVTgsIHApOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CS8qIFNlbGVjdCBzYW1wbGUgZm9ybWF0ICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKChyZXQgPSBsb2NrX3NldF9mbXQoc3RhdGUpKSA8IDApCisJCQlyZXR1cm4gcmV0OworCisJCWlmICh2YWwgIT0gQUZNVF9RVUVSWSkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJc3RvcF9kYWMoc3RhdGUpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUpCisJCQkJCWRtYWJ1Zi0+Zm10IHw9IFRSSURFTlRfRk1UXzE2QklUOworCQkJCWVsc2UKKwkJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UXzE2QklUOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA9PSBBRk1UX1MxNl9MRSkKKwkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfMTZCSVQ7CisJCQkJZWxzZQorCQkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfMTZCSVQ7CisJCQl9CisJCX0KKwkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOworCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF8xNkJJVCkgPyBBRk1UX1MxNl9MRSA6IAorCQkJICAgICAgIEFGTVRfVTgsIHApOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9DSEFOTkVMUzoKKwkJaWYgKGdldF91c2VyKHZhbCwgcCkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlpZiAodmFsICE9IDApIHsKKwkJCWlmICgocmV0ID0gbG9ja19zZXRfZm10KHN0YXRlKSkgPCAwKQorCQkJCXJldHVybiByZXQ7CisKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKworCQkJCS8vcHJldmVudCBmcm9tIG1lbW9yeSBsZWFrCisJCQkJaWYgKChzdGF0ZS0+Y2hhbnNfbnVtID4gMikgJiYgKHN0YXRlLT5jaGFuc19udW0gIT0gdmFsKSkgeworCQkJCQlhbGlfZnJlZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0YXRlKTsKKwkJCQkJc3RhdGUtPmNoYW5zX251bSA9IDE7CisJCQkJfQorCisJCQkJaWYgKHZhbCA+PSAyKSB7CisKKwkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOworCQkJCQlpZiAoKHZhbCA9PSA2KSAmJiAoc3RhdGUtPmNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSkgeworCQkJCQkJaWYgKGNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudCA+IDApIHsKKwkJCQkJCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IFJlY29yZCBpcyAiCisJCQkJCQkJICAgICAgICJ3b3JraW5nIG9uIHRoZSBjYXJkIVxuIik7CisJCQkJCQkJcmV0ID0gLUVCVVNZOworCQkJCQkJCXVubG9ja19zZXRfZm10KHN0YXRlKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKworCQkJCQkJcmV0ID0gYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0YXRlLT5jYXJkLCA2KTsKKwkJCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJZG93bigmc3RhdGUtPmNhcmQtPm9wZW5fc2VtKTsKKwkJCQkJCXJldCA9IGFsaV9hbGxvY2F0ZV9vdGhlcl9zdGF0ZXNfcmVzb3VyY2VzKHN0YXRlLCA2KTsKKwkJCQkJCWlmIChyZXQgPCAwKSB7CisJCQkJCQkJdXAoJnN0YXRlLT5jYXJkLT5vcGVuX3NlbSk7CisJCQkJCQkJdW5sb2NrX3NldF9mbXQoc3RhdGUpOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJc3RhdGUtPmNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50Kys7CisJCQkJCQl1cCgmc3RhdGUtPmNhcmQtPm9wZW5fc2VtKTsKKwkJCQkJfSBlbHNlCisJCQkJCQl2YWwgPSAyOwkvKnlpZWxkIHRvIDItY2hhbm5lbHMgKi8KKwkJCQl9IGVsc2UKKwkJCQkJZG1hYnVmLT5mbXQgJj0gflRSSURFTlRfRk1UX1NURVJFTzsKKwkJCQlzdGF0ZS0+Y2hhbnNfbnVtID0gdmFsOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQlzdG9wX2FkYyhzdGF0ZSk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJaWYgKHZhbCA+PSAyKSB7CisJCQkJCWlmICghKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgCisJCQkJCSAgICAgICh2YWwgPT0gNikpKQorCQkJCQkJdmFsID0gMjsKKwkJCQkJZG1hYnVmLT5mbXQgfD0gVFJJREVOVF9GTVRfU1RFUkVPOworCQkJCX0gZWxzZQorCQkJCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfU1RFUkVPOworCQkJCXN0YXRlLT5jaGFuc19udW0gPSB2YWw7CisJCQl9CisJCQl1bmxvY2tfc2V0X2ZtdChzdGF0ZSk7CisJCX0KKwkJcmV0ID0gcHV0X3VzZXIodmFsLCBwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDoKKwkJLyogQ2F1c2UgdGhlIHdvcmtpbmcgZnJhZ21lbnQgdG8gYmUgb3V0cHV0ICovCisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NVQkRJVklERToKKwkJaWYgKGRtYWJ1Zi0+c3ViZGl2aXNpb24pIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmICh2YWwgIT0gMSAmJiB2YWwgIT0gMiAmJiB2YWwgIT0gNCkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWRtYWJ1Zi0+c3ViZGl2aXNpb24gPSB2YWw7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX1NFVEZSQUdNRU5UOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSB2YWwgJiAweGZmZmY7CisJCWRtYWJ1Zi0+b3NzbWF4ZnJhZ3MgPSAodmFsID4+IDE2KSAmIDB4ZmZmZjsKKwkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0IDwgNCkKKwkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gNDsKKwkJaWYgKGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID4gMTUpCisJCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IDE1OworCQlpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyA8IDQpCisJCQlkbWFidWYtPm9zc21heGZyYWdzID0gNDsKKworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPU1BBQ0U6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSAhPSAwKSB7CisJCQlyZXQgPSB2YWw7CisJCQlicmVhazsKKwkJfQorCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT5mcmFnc2l6ZTsKKwkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudDsKKwkJYWJpbmZvLmZyYWdzdG90YWwgPSBkbWFidWYtPm51bWZyYWc7CisJCWFiaW5mby5mcmFnbWVudHMgPSBhYmluZm8uYnl0ZXMgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YgKGFiaW5mbykpID8gCisJCQktRUZBVUxUIDogMDsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUSVNQQUNFOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkgIT0gMCkgeworCQkJcmV0ID0gdmFsOworCQkJYnJlYWs7CisJCX0KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCXRyaWRlbnRfdXBkYXRlX3B0cihzdGF0ZSk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IGRtYWJ1Zi0+ZnJhZ3NpemU7CisJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+Y291bnQ7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmFiaW5mbywgc2l6ZW9mIChhYmluZm8pKSA/IAorCQkJLUVGQVVMVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgorCQlmaWxlLT5mX2ZsYWdzIHw9IE9fTk9OQkxPQ0s7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVENBUFM6CisJCXJldCA9IHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUUgfCBEU1BfQ0FQX1RSSUdHRVIgfCAKKwkJCSAgICAgICBEU1BfQ0FQX01NQVAgfCBEU1BfQ0FQX0JJTkQsIHApOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIGRtYWJ1Zi0+ZW5hYmxlKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCWlmICgoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpICYmIGRtYWJ1Zi0+ZW5hYmxlKQorCQkJdmFsIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlyZXQgPSBwdXRfdXNlcih2YWwsIHApOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRUUklHR0VSOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlpZiAodmFsICYgUENNX0VOQUJMRV9JTlBVVCkgeworCQkJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAKKwkJCQkgICAgKHJldCA9IHByb2dfZG1hYnVmX3JlY29yZChzdGF0ZSkpKQorCQkJCQlicmVhazsKKwkJCQlzdGFydF9hZGMoc3RhdGUpOworCQkJfSBlbHNlCisJCQkJc3RvcF9hZGMoc3RhdGUpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJaWYgKHZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKSB7CisJCQkJaWYgKCFkbWFidWYtPnJlYWR5ICYmIAorCQkJCSAgICAocmV0ID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKSkKKwkJCQkJYnJlYWs7CisJCQkJc3RhcnRfZGFjKHN0YXRlKTsKKwkJCX0gZWxzZQorCQkJCXN0b3BfZGFjKHN0YXRlKTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJUFRSOgorCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcmVjb3JkKHN0YXRlKSkKKwkJICAgICE9IDApIHsKKwkJCXJldCA9IHZhbDsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXM7CisJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CisJCWNpbmZvLnB0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCWlmIChkbWFidWYtPm1hcHBlZCkKKwkJCWRtYWJ1Zi0+Y291bnQgJj0gZG1hYnVmLT5mcmFnc2l6ZSAtIDE7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT5jYXJkLT5sb2NrLCBmbGFncyk7CisJCXJldCA9IGNvcHlfdG9fdXNlcihhcmdwLCAmY2luZm8sIHNpemVvZiAoY2luZm8pKSA/IAorCQkJLUVGQVVMVCA6IDA7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9QVFI6CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgeworCQkJcmV0ID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICghZG1hYnVmLT5yZWFkeSAmJiAodmFsID0gcHJvZ19kbWFidWZfcGxheWJhY2soc3RhdGUpKQorCQkgICAgIT0gMCkgeworCQkJcmV0ID0gdmFsOworCQkJYnJlYWs7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJdHJpZGVudF91cGRhdGVfcHRyKHN0YXRlKTsKKwkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOworCQljaW5mby5ibG9ja3MgPSBkbWFidWYtPmNvdW50ID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCQlpZiAoZG1hYnVmLT5tYXBwZWQpCisJCQlkbWFidWYtPmNvdW50ICY9IGRtYWJ1Zi0+ZnJhZ3NpemUgLSAxOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YgKGNpbmZvKSkgPyAKKwkJCS1FRkFVTFQgOiAwOworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVREVVBMRVg6CisJCXJldCA9IC1FSU5WQUw7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9ERUxBWToKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1Zl9wbGF5YmFjayhzdGF0ZSkpICE9IDApIHsKKwkJCXJldCA9IHZhbDsKKwkJCWJyZWFrOworCQl9CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCQl2YWwgPSBkbWFidWYtPmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+Y2FyZC0+bG9jaywgZmxhZ3MpOworCQlyZXQgPSBwdXRfdXNlcih2YWwsIHApOworCQlicmVhazsKKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJcmV0ID0gcHV0X3VzZXIoZG1hYnVmLT5yYXRlLCBwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0NIQU5ORUxTOgorCQlyZXQgPSBwdXRfdXNlcigoZG1hYnVmLT5mbXQgJiBUUklERU5UX0ZNVF9TVEVSRU8pID8gMiA6IDEsIAorCQkJICAgICAgIHApOworCQlicmVhazsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQklUUzoKKwkJcmV0ID0gcHV0X3VzZXIoKGRtYWJ1Zi0+Zm10ICYgVFJJREVOVF9GTVRfMTZCSVQpID8gQUZNVF9TMTZfTEUgOiAKKwkJCSAgICAgICBBRk1UX1U4LCBwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0hBTk5FTE1BU0s6CisJCXJldCA9IHB1dF91c2VyKERTUF9CSU5EX0ZST05UIHwgRFNQX0JJTkRfU1VSUiB8IAorCQkJICAgICAgIERTUF9CSU5EX0NFTlRFUl9MRkUsICBwKTsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfQklORF9DSEFOTkVMOgorCQlpZiAoc3RhdGUtPmNhcmQtPnBjaV9pZCAhPSBQQ0lfREVWSUNFX0lEX1NJXzcwMTgpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChnZXRfdXNlcih2YWwsIHApKSB7CisJCQlyZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHZhbCA9PSBEU1BfQklORF9RVUVSWSkgeworCQkJdmFsID0gZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgfCAweDNjMDA7CisJCQl2YWwgPSBhdHRyMm1hc2tbdmFsID4+IDhdOworCQl9IGVsc2UgeworCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSA9IChDSEFOTkVMX1JFQyB8IAorCQkJCQkJCSAgICAgIFNSQ19FTkFCTEUpOworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKQorCQkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gKENIQU5ORUxfU1BDX1BCIHwgCisJCQkJCQkJICAgICAgU1JDX0VOQUJMRSk7CisJCQlkbWFidWYtPmNoYW5uZWwtPmF0dHJpYnV0ZSB8PSBtYXNrMmF0dHJbZmZzKHZhbCldOworCQl9CisJCXJldCA9IHB1dF91c2VyKHZhbCwgcCk7CisJCWJyZWFrOworCisJY2FzZSBTTkRDVExfRFNQX01BUElOQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9NQVBPVVRCVUY6CisJY2FzZSBTTkRDVExfRFNQX1NFVFNZTkNSTzoKKwljYXNlIFNPVU5EX1BDTV9XUklURV9GSUxURVI6CisJY2FzZSBTT1VORF9QQ01fUkVBRF9GSUxURVI6CisJZGVmYXVsdDoKKwkJcmV0ID0gLUVJTlZBTDsKKwkJYnJlYWs7CisKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordHJpZGVudF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBpID0gMDsKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBkZXZzOworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IE5VTEw7CisJc3RydWN0IGRtYWJ1ZiAqZG1hYnVmID0gTlVMTDsKKworCS8qIEFkZGVkIGJ5IE1hdHQgV3UgMDEtMDUtMjAwMSAqLworCS8qIFRPRE86IHRoZXJlJ3Mgc29tZSByZWR1bmRhY3kgaGVyZSB3cnQgdGhlIGNoZWNrIGJlbG93ICovCisJLyogZm9yIG11bHRpX3VzZV9jb3VudCA+IDAuIFNob3VsZCB3ZSByZXR1cm4gLUVCVVNZIG9yIGZpbmQgKi8KKwkvKiBhIGRpZmZlcmVudCBjYXJkPyBmb3Igbm93LCBkb24ndCBicmVhayBjdXJyZW50IGJlaGF2aW91ciAqLworCS8qIC0tIG11bGl4ICovCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCQlpZiAoY2FyZC0+bXVsdGlfY2hhbm5lbF91c2VfY291bnQgPiAwKQorCQkJCXJldHVybiAtRUJVU1k7CisJCX0KKwl9CisKKwkvKiBmaW5kIGFuIGF2YWlsYWJsZSB2aXJ0dWFsIGNoYW5uZWwgKGluc3RhbmNlIG9mIC9kZXYvZHNwKSAqLworCXdoaWxlIChjYXJkICE9IE5VTEwpIHsKKwkJZG93bigmY2FyZC0+b3Blbl9zZW0pOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJLyogU2tpcCBvcGVucyBvbiBjYXJkcyB0aGF0IGFyZSBpbiA2IGNoYW5uZWwgbW9kZSAqLworCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID4gMCkgeworCQkJCXVwKCZjYXJkLT5vcGVuX3NlbSk7CisJCQkJY2FyZCA9IGNhcmQtPm5leHQ7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJCWlmIChjYXJkLT5zdGF0ZXNbaV0gPT0gTlVMTCkgeworCQkJCXN0YXRlID0gY2FyZC0+c3RhdGVzW2ldID0ga21hbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CisJCQkJaWYgKHN0YXRlID09IE5VTEwpIHsKKwkJCQkJdXAoJmNhcmQtPm9wZW5fc2VtKTsKKwkJCQkJcmV0dXJuIC1FTk9NRU07CisJCQkJfQorCQkJCW1lbXNldChzdGF0ZSwgMCwgc2l6ZW9mKCpzdGF0ZSkpOworCQkJCWluaXRfTVVURVgoJnN0YXRlLT5zZW0pOworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+ZG1hYnVmOworCQkJCWdvdG8gZm91bmRfdmlydDsKKwkJCX0KKwkJfQorCQl1cCgmY2FyZC0+b3Blbl9zZW0pOworCQljYXJkID0gY2FyZC0+bmV4dDsKKwl9CisJLyogbm8gbW9yZSB2aXJ0dWFsIGNoYW5uZWwgYXZhaWFibGUgKi8KKwlpZiAoIXN0YXRlKSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKyAgICAgIGZvdW5kX3ZpcnQ6CisJLyogZm91bmQgYSBmcmVlIHZpcnR1YWwgY2hhbm5lbCwgYWxsb2NhdGUgaGFyZHdhcmUgY2hhbm5lbHMgKi8KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsKGNhcmQpOworCWVsc2UKKwkJZG1hYnVmLT5jaGFubmVsID0gY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwoY2FyZCk7CisKKwlpZiAoZG1hYnVmLT5jaGFubmVsID09IE5VTEwpIHsKKwkJa2ZyZWUoY2FyZC0+c3RhdGVzW2ldKTsKKwkJY2FyZC0+c3RhdGVzW2ldID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJLyogaW5pdGlhbGl6ZSB0aGUgdmlydHVhbCBjaGFubmVsICovCisJc3RhdGUtPnZpcnQgPSBpOworCXN0YXRlLT5jYXJkID0gY2FyZDsKKwlzdGF0ZS0+bWFnaWMgPSBUUklERU5UX1NUQVRFX01BR0lDOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJmRtYWJ1Zi0+d2FpdCk7CisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gc3RhdGU7CisKKwkvKiBzZXQgZGVmYXVsdCBzYW1wbGUgZm9ybWF0LiBBY2NvcmRpbmcgdG8gT1NTIFByb2dyYW1tZXIncyAqLyAKKwkvKiBHdWlkZSAgL2Rldi9kc3Agc2hvdWxkIGJlIGRlZmF1bHQgdG8gdW5zaWduZWQgOC1iaXRzLCBtb25vLCAqLyAKKwkvKiB3aXRoIHNhbXBsZSByYXRlIDhrSHogYW5kIC9kZXYvZHNwVyB3aWxsIGFjY2VwdCAxNi1iaXRzIHNhbXBsZSAqLworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfTUFTSzsKKwkJaWYgKChtaW5vciAmIDB4MGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF8xNkJJVDsKKwkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAwOworCQlkbWFidWYtPm9zc21heGZyYWdzID0gMDsKKwkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IDA7CisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CisJCQkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIGF0dHJpYnV0ZSB0byBub3JtYWwgcGxheWJhY2sgKi8KKwkJCWRtYWJ1Zi0+Y2hhbm5lbC0+YXR0cmlidXRlID0gQ0hBTk5FTF9QQjsKKwkJfQorCQl0cmlkZW50X3NldF9kYWNfcmF0ZShzdGF0ZSwgODAwMCk7CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJLyogRklYTUU6IFRyaWRlbnQgNGQgY2FuIG9ubHkgcmVjb3JkIGluIHNpZ25lZCAxNi1iaXRzIHN0ZXJlbywgKi8gCisJCS8qIDQ4a0h6IHNhbXBsZSwgdG8gYmUgZGVhbGVkIHdpdGggaW4gdHJpZGVudF9zZXRfYWRjX3JhdGUoKSA/PyAqLworCQlkbWFidWYtPmZtdCAmPSB+VFJJREVOVF9GTVRfTUFTSzsKKwkJaWYgKChtaW5vciAmIDB4MGYpID09IFNORF9ERVZfRFNQMTYpCisJCQlkbWFidWYtPmZtdCB8PSBUUklERU5UX0ZNVF8xNkJJVDsKKwkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSAwOworCQlkbWFidWYtPm9zc21heGZyYWdzID0gMDsKKwkJZG1hYnVmLT5zdWJkaXZpc2lvbiA9IDA7CisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9TSV83MDE4KSB7CisJCQkvKiBzZXQgZGVmYXVsdCBjaGFubmVsIGF0dHJpYnV0ZSB0byAweDhhODAsIHJlY29yZCBmcm9tCisJCQkgICBQQ00gTC9SIEZJRk8gYW5kIG1vbm8gPSAobGVmdCArIHJpZ2h0ICsgMSkvMiAqLworCQkJZG1hYnVmLT5jaGFubmVsLT5hdHRyaWJ1dGUgPSAoQ0hBTk5FTF9SRUMgfCBQQ01fTFIgfCAKKwkJCQkJCSAgICAgIE1PTk9fTUlYKTsKKwkJfQorCQl0cmlkZW50X3NldF9hZGNfcmF0ZShzdGF0ZSwgODAwMCk7CisKKwkJLyogQWRkZWQgYnkgTWF0dCBXdSAwMS0wNS0yMDAxICovCisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkKKwkJCWNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudCsrOworCX0KKworCXN0YXRlLT5vcGVuX21vZGUgfD0gZmlsZS0+Zl9tb2RlICYgKEZNT0RFX1JFQUQgfCBGTU9ERV9XUklURSk7CisJdXAoJmNhcmQtPm9wZW5fc2VtKTsKKworCXByX2RlYnVnKCJ0cmlkZW50OiBvcGVuIHZpcnR1YWwgY2hhbm5lbCAlZCwgaGFyZCBjaGFubmVsICVkXG4iLAorCQkgc3RhdGUtPnZpcnQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludAordHJpZGVudF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkOworCXN0cnVjdCBkbWFidWYgKmRtYWJ1ZjsKKworCVZBTElEQVRFX1NUQVRFKHN0YXRlKTsKKworCWNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwlkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQl0cmlkZW50X2NsZWFyX3RhaWwoc3RhdGUpOworCQlkcmFpbl9kYWMoc3RhdGUsIGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwl9CisKKwlwcl9kZWJ1ZygidHJpZGVudDogY2xvc2luZyB2aXJ0dWFsIGNoYW5uZWwgJWQsIGhhcmQgY2hhbm5lbCAlZFxuIiwKKwkJIHN0YXRlLT52aXJ0LCBkbWFidWYtPmNoYW5uZWwtPm51bSk7CisKKwkvKiBzdG9wIERNQSBzdGF0ZSBtYWNoaW5lIGFuZCBmcmVlIERNQSBidWZmZXJzL2NoYW5uZWxzICovCisJZG93bigmY2FyZC0+b3Blbl9zZW0pOworCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXN0b3BfZGFjKHN0YXRlKTsKKwkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5kbWFidWYsIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKKwkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKKworCQkvKiBBZGRlZCBieSBNYXR0IFd1ICovCisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgeworCQkJaWYgKHN0YXRlLT5jaGFuc19udW0gPiAyKSB7CisJCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50LS0gPCAwKQorCQkJCQljYXJkLT5tdWx0aV9jaGFubmVsX3VzZV9jb3VudCA9IDA7CisJCQkJaWYgKGNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID09IDApCisJCQkJCWFsaV9jbG9zZV9tdWx0aV9jaGFubmVscygpOworCQkJCWFsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RhdGUpOworCQkJfQorCQl9CisJfQorCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCXN0b3BfYWRjKHN0YXRlKTsKKwkJZGVhbGxvY19kbWFidWYoJnN0YXRlLT5kbWFidWYsIHN0YXRlLT5jYXJkLT5wY2lfZGV2KTsKKwkJc3RhdGUtPmNhcmQtPmZyZWVfcGNtX2NoYW5uZWwoc3RhdGUtPmNhcmQsIGRtYWJ1Zi0+Y2hhbm5lbC0+bnVtKTsKKworCQkvKiBBZGRlZCBieSBNYXR0IFd1ICovCisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgeworCQkJaWYgKGNhcmQtPnJlY19jaGFubmVsX3VzZV9jb3VudC0tIDwgMCkKKwkJCQljYXJkLT5yZWNfY2hhbm5lbF91c2VfY291bnQgPSAwOworCQl9CisJfQorCisJY2FyZC0+c3RhdGVzW3N0YXRlLT52aXJ0XSA9IE5VTEw7CisJa2ZyZWUoc3RhdGUpOworCisJLyogd2UncmUgY292ZXJlZCBieSB0aGUgb3Blbl9zZW0gKi8KKwl1cCgmY2FyZC0+b3Blbl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0ICovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdHJpZGVudF9hdWRpb19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsgPSBub19sbHNlZWssCisJLnJlYWQgPSB0cmlkZW50X3JlYWQsCisJLndyaXRlID0gdHJpZGVudF93cml0ZSwKKwkucG9sbCA9IHRyaWRlbnRfcG9sbCwKKwkuaW9jdGwgPSB0cmlkZW50X2lvY3RsLAorCS5tbWFwID0gdHJpZGVudF9tbWFwLAorCS5vcGVuID0gdHJpZGVudF9vcGVuLAorCS5yZWxlYXNlID0gdHJpZGVudF9yZWxlYXNlLAorfTsKKworLyogdHJpZGVudCBzcGVjaWZpYyBBQzk3IGZ1bmN0aW9ucyAqLworLyogV3JpdGUgQUM5NyBjb2RlYyByZWdpc3RlcnMgKi8KK3N0YXRpYyB2b2lkCit0cmlkZW50X2FjOTdfc2V0KHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsKQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKWNvZGVjLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2ssIGJ1c3k7CisJdW5zaWduZWQgc2hvcnQgY291bnQgPSAweGZmZmY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgZGF0YTsKKworCWRhdGEgPSAoKHUzMikgdmFsKSA8PCAxNjsKKworCXN3aXRjaCAoY2FyZC0+cGNpX2lkKSB7CisJZGVmYXVsdDoKKwljYXNlIFBDSV9ERVZJQ0VfSURfU0lfNzAxODoKKwkJYWRkcmVzcyA9IFNJX0FDOTdfV1JJVEU7CisJCW1hc2sgPSBTSV9BQzk3X0JVU1lfV1JJVEUgfCBTSV9BQzk3X0FVRElPX0JVU1k7CisJCWlmIChjb2RlYy0+aWQpCisJCQltYXNrIHw9IFNJX0FDOTdfU0VDT05EQVJZOworCQlidXN5ID0gU0lfQUM5N19CVVNZX1dSSVRFOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfVFJJREVOVF80RFdBVkVfRFg6CisJCWFkZHJlc3MgPSBEWF9BQ1IwX0FDOTdfVzsKKwkJbWFzayA9IGJ1c3kgPSBEWF9BQzk3X0JVU1lfV1JJVEU7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKKwkJYWRkcmVzcyA9IE5YX0FDUjFfQUM5N19XOworCQltYXNrID0gTlhfQUM5N19CVVNZX1dSSVRFOworCQlpZiAoY29kZWMtPmlkKQorCQkJbWFzayB8PSBOWF9BQzk3X1dSSVRFX1NFQ09OREFSWTsKKwkJYnVzeSA9IE5YX0FDOTdfQlVTWV9XUklURTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwOgorCQlhZGRyZXNzID0gU0lfQUM5N19XUklURTsKKwkJbWFzayA9IGJ1c3kgPSBTSV9BQzk3X0JVU1lfV1JJVEU7CisJCWlmIChjb2RlYy0+aWQpCisJCQltYXNrIHw9IFNJX0FDOTdfU0VDT05EQVJZOworCQlicmVhazsKKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCWRvIHsKKwkJaWYgKChpbncoVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpICYgYnVzeSkgPT0gMCkKKwkJCWJyZWFrOworCX0gd2hpbGUgKGNvdW50LS0pOworCisJZGF0YSB8PSAobWFzayB8IChyZWcgJiBBQzk3X1JFR19BRERSKSk7CisKKwlpZiAoY291bnQgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IEFDOTcgQ09ERUMgd3JpdGUgdGltZWQgb3V0LlxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKworCW91dGwoZGF0YSwgVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworLyogUmVhZCBBQzk3IGNvZGVjIHJlZ2lzdGVycyAqLworc3RhdGljIHUxNgordHJpZGVudF9hYzk3X2dldChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZykKK3sKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gKHN0cnVjdCB0cmlkZW50X2NhcmQgKiljb2RlYy0+cHJpdmF0ZV9kYXRhOworCXVuc2lnbmVkIGludCBhZGRyZXNzLCBtYXNrLCBidXN5OworCXVuc2lnbmVkIHNob3J0IGNvdW50ID0gMHhmZmZmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGRhdGE7CisKKwlzd2l0Y2ggKGNhcmQtPnBjaV9pZCkgeworCWRlZmF1bHQ6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CisJCWFkZHJlc3MgPSBTSV9BQzk3X1JFQUQ7CisJCW1hc2sgPSBTSV9BQzk3X0JVU1lfUkVBRCB8IFNJX0FDOTdfQVVESU9fQlVTWTsKKwkJaWYgKGNvZGVjLT5pZCkKKwkJCW1hc2sgfD0gU0lfQUM5N19TRUNPTkRBUlk7CisJCWJ1c3kgPSBTSV9BQzk3X0JVU1lfUkVBRDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYOgorCQlhZGRyZXNzID0gRFhfQUNSMV9BQzk3X1I7CisJCW1hc2sgPSBidXN5ID0gRFhfQUM5N19CVVNZX1JFQUQ7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWDoKKwkJaWYgKGNvZGVjLT5pZCkKKwkJCWFkZHJlc3MgPSBOWF9BQ1IzX0FDOTdfUl9TRUNPTkRBUlk7CisJCWVsc2UKKwkJCWFkZHJlc3MgPSBOWF9BQ1IyX0FDOTdfUl9QUklNQVJZOworCQltYXNrID0gTlhfQUM5N19CVVNZX1JFQUQ7CisJCWJ1c3kgPSBOWF9BQzk3X0JVU1lfUkVBRCB8IE5YX0FDOTdfQlVTWV9EQVRBOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CisJCWFkZHJlc3MgPSBTSV9BQzk3X1JFQUQ7CisJCW1hc2sgPSBidXN5ID0gU0lfQUM5N19CVVNZX1JFQUQ7CisJCWlmIChjb2RlYy0+aWQpCisJCQltYXNrIHw9IFNJX0FDOTdfU0VDT05EQVJZOworCQlicmVhazsKKwl9CisKKwlkYXRhID0gKG1hc2sgfCAocmVnICYgQUM5N19SRUdfQUREUikpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlvdXRsKGRhdGEsIFRSSURfUkVHKGNhcmQsIGFkZHJlc3MpKTsKKwlkbyB7CisJCWRhdGEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgYWRkcmVzcykpOworCQlpZiAoKGRhdGEgJiBidXN5KSA9PSAwKQorCQkJYnJlYWs7CisJfSB3aGlsZSAoY291bnQtLSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKGNvdW50ID09IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBBQzk3IENPREVDIHJlYWQgdGltZWQgb3V0LlxuIik7CisJCWRhdGEgPSAwOworCX0KKwlyZXR1cm4gKCh1MTYpIChkYXRhID4+IDE2KSk7Cit9CisKKy8qIHJld3JpdGUgYWM5NyByZWFkIGFuZCB3cml0ZSBtaXhlciByZWdpc3RlciBieSBodWxlaSBmb3IgQUxJKi8KK3N0YXRpYyBpbnQKK2FjcXVpcmVjb2RlY2FjY2VzcyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXUxNiB3c2VtYW1hc2sgPSAweDYwMDA7CS8qIGJpdCAxNC4uMTMgKi8KKwl1MTYgd3NlbWFiaXRzOworCXUxNiB3Y29udHJvbDsKKwlpbnQgYmxvY2sgPSAwOworCWludCBuY291bnQgPSAyNTsKKwl3aGlsZSAoMSkgeworCQl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOworCQl3c2VtYWJpdHMgPSB3Y29udHJvbCAmIHdzZW1hbWFzazsKKworCQlpZiAod3NlbWFiaXRzID09IDB4NDAwMCkKKwkJCXJldHVybiAxOwkvKiAweDQwMDAgaXMgYXVkaW8gLHRoZW4gc3VjY2VzcyAqLworCQlpZiAobmNvdW50LS0gPCAwKQorCQkJYnJlYWs7CisJCWlmICh3c2VtYWJpdHMgPT0gMCkgeworCQkgICAgICB1bmxvY2s6CisJCQlvdXRsKCgodTMyKSAod2NvbnRyb2wgJiAweDFlZmYpIHwgMHgwMDAwNDAwMCksIAorCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOworCQkJY29udGludWU7CisJCX0KKwkJdWRlbGF5KDIwKTsKKwl9CisJaWYgKCFibG9jaykgeworCQlwcl9kZWJ1ZygiYWNjZXNzY29kZWNzZW1hcGhvcmU6IHRyeSB1bmxvY2tcbiIpOworCQlibG9jayA9IDE7CisJCWdvdG8gdW5sb2NrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK3JlbGVhc2Vjb2RlY2FjY2VzcyhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgd2NvbnRyb2w7CisJd2NvbnRyb2wgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKKwlvdXRsKCh3Y29udHJvbCAmIDB4ZmZmZjFlZmYpLCBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOworfQorCitzdGF0aWMgaW50Cit3YWl0Zm9yc3RpbWVydGljayhzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgY2hrMSwgY2hrMjsKKwl1bnNpZ25lZCBpbnQgd2NvdW50ID0gMHhmZmZmOworCWNoazEgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NUSU1FUikpOworCisJd2hpbGUgKDEpIHsKKwkJY2hrMiA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7CisJCWlmICgod2NvdW50ID4gMCkgJiYgY2hrMSAhPSBjaGsyKQorCQkJcmV0dXJuIDE7CisJCWlmICh3Y291bnQgPD0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoNTApOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogUmVhZCBBQzk3IGNvZGVjIHJlZ2lzdGVycyBmb3IgQUxpKi8KK3N0YXRpYyB1MTYKK2FsaV9hYzk3X2dldChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgc2Vjb25kYXJ5LCB1OCByZWcpCit7CisJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2s7CisJdW5zaWduZWQgaW50IG5jb3VudDsKKwl1bnNpZ25lZCBsb25nIGF1ZF9yZWc7CisJdTMyIGRhdGE7CisJdTE2IHdjb250cm9sOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAoIWNhcmQpCisJCUJVRygpOworCisJYWRkcmVzcyA9IEFMSV9BQzk3X1JFQUQ7CisJaWYgKGNhcmQtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikgeworCQlhZGRyZXNzID0gQUxJX0FDOTdfV1JJVEU7CisJfQorCW1hc2sgPSBBTElfQUM5N19SRUFEX0FDVElPTiB8IEFMSV9BQzk3X0FVRElPX0JVU1k7CisJaWYgKHNlY29uZGFyeSkKKwkJbWFzayB8PSBBTElfQUM5N19TRUNPTkRBUlk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCisJaWYgKCFhY3F1aXJlY29kZWNhY2Nlc3MoY2FyZCkpCisJCXByaW50ayhLRVJOX0VSUiAiYWNjZXNzIGNvZGVjIGZhaWxcbiIpOworCisJd2NvbnRyb2wgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKKwl3Y29udHJvbCAmPSAweGZlMDA7CisJd2NvbnRyb2wgfD0gKDB4ODAwMCB8IHJlZyk7CisJb3V0dyh3Y29udHJvbCwgVFJJRF9SRUcoY2FyZCwgQUxJX0FDOTdfV1JJVEUpKTsKKworCWRhdGEgPSAobWFzayB8IChyZWcgJiBBQzk3X1JFR19BRERSKSk7CisKKwlpZiAoIXdhaXRmb3JzdGltZXJ0aWNrKGNhcmQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfcmVhZDogQklUX0NMT0NLIGlzIGRlYWRcbiIpOworCQlnb3RvIHJlbGVhc2Vjb2RlYzsKKwl9CisKKwl1ZGVsYXkoMjApOworCisJbmNvdW50ID0gMTA7CisKKwl3aGlsZSAoMSkgeworCQlpZiAoKGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpICYgQUxJX0FDOTdfQlVTWV9SRUFEKSAKKwkJICAgICE9IDApCisJCQlicmVhazsKKwkJaWYgKG5jb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChuY291bnQtLSA9PSAxKSB7CisJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfcmVhZCA6dHJ5IGNsZWFyIGJ1c3kgZmxhZ1xuIik7CisJCQlhdWRfcmVnID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CisJCQlvdXRsKChhdWRfcmVnICYgMHhmZmZmN2ZmZiksIAorCQkJICAgICBUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOworCQl9CisJCXVkZWxheSgxMCk7CisJfQorCisJZGF0YSA9IGlubChUUklEX1JFRyhjYXJkLCBhZGRyZXNzKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gKCh1MTYpIChkYXRhID4+IDE2KSk7CisKKyAgICAgIHJlbGVhc2Vjb2RlYzoKKwlyZWxlYXNlY29kZWNhY2Nlc3MoY2FyZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfcmVhZDogQUM5NyBDT0RFQyByZWFkIHRpbWVkIG91dC5cbiIpOworCXJldHVybiAwOworfQorCisvKiBXcml0ZSBBQzk3IGNvZGVjIHJlZ2lzdGVycyBmb3IgaHVsZWkqLworc3RhdGljIHZvaWQKK2FsaV9hYzk3X3NldChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCBpbnQgc2Vjb25kYXJ5LCB1OCByZWcsIHUxNiB2YWwpCit7CisJdW5zaWduZWQgaW50IGFkZHJlc3MsIG1hc2s7CisJdW5zaWduZWQgaW50IG5jb3VudDsKKwl1MzIgZGF0YTsKKwl1MTYgd2NvbnRyb2w7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRhdGEgPSAoKHUzMikgdmFsKSA8PCAxNjsKKworCWlmICghY2FyZCkKKwkJQlVHKCk7CisKKwlhZGRyZXNzID0gQUxJX0FDOTdfV1JJVEU7CisJbWFzayA9IEFMSV9BQzk3X1dSSVRFX0FDVElPTiB8IEFMSV9BQzk3X0FVRElPX0JVU1k7CisJaWYgKHNlY29uZGFyeSkKKwkJbWFzayB8PSBBTElfQUM5N19TRUNPTkRBUlk7CisJaWYgKGNhcmQtPnJldmlzaW9uID09IEFMSV81NDUxX1YwMikKKwkJbWFzayB8PSBBTElfQUM5N19XUklURV9NSVhFUl9SRUdJU1RFUjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisJaWYgKCFhY3F1aXJlY29kZWNhY2Nlc3MoY2FyZCkpCisJCXByaW50ayhLRVJOX0VSUiAiYWxpX2FjOTdfd3JpdGU6IGFjY2VzcyBjb2RlYyBmYWlsXG4iKTsKKworCXdjb250cm9sID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CisJd2NvbnRyb2wgJj0gMHhmZjAwOworCXdjb250cm9sIHw9ICgweDgxMDAgfCByZWcpOyAvKiBiaXQgOD0xOiAoYWxpMTUzNSApcmVzZXJ2ZWQvICovIAorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGkxNTM1KyB3cml0ZSAqLworCW91dGwoKGRhdGEgfCB3Y29udHJvbCksIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CisKKwlpZiAoIXdhaXRmb3JzdGltZXJ0aWNrKGNhcmQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklUX0NMT0NLIGlzIGRlYWRcbiIpOworCQlnb3RvIHJlbGVhc2Vjb2RlYzsKKwl9CisKKwluY291bnQgPSAxMDsKKwl3aGlsZSAoMSkgeworCQl3Y29udHJvbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfQUM5N19XUklURSkpOworCQlpZiAoISh3Y29udHJvbCAmIDB4ODAwMCkpCisJCQlicmVhazsKKwkJaWYgKG5jb3VudCA8PSAwKQorCQkJYnJlYWs7CisJCWlmIChuY291bnQtLSA9PSAxKSB7CisJCQlwcl9kZWJ1ZygiYWxpX2FjOTdfc2V0IDp0cnkgY2xlYXIgYnVzeSBmbGFnISFcbiIpOworCQkJb3V0dyh3Y29udHJvbCAmIDB4N2ZmZiwgCisJCQkgICAgIFRSSURfUkVHKGNhcmQsIEFMSV9BQzk3X1dSSVRFKSk7CisJCX0KKwkJdWRlbGF5KDEwKTsKKwl9CisKKyAgICAgIHJlbGVhc2Vjb2RlYzoKKwlyZWxlYXNlY29kZWNhY2Nlc3MoY2FyZCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2FyZC0+bG9jaywgZmxhZ3MpOworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2FsaV9lbmFibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCB0cmlkZW50X3N0YXRlICpzdGF0KQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0LT5jYXJkOworCXVuc2lnbmVkIGxvbmcgc19jaGFubmVsczsKKworCXNfY2hhbm5lbHMgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJc19jaGFubmVscyB8PSAoMSA8PCBzdGF0LT5kbWFidWYuY2hhbm5lbC0+bnVtKTsKKwlvdXRsKHNfY2hhbm5lbHMsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworfQorCitzdGF0aWMgdTE2CithbGlfYWM5N19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKQoreworCWludCBpZDsKKwl1MTYgZGF0YTsKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gTlVMTDsKKworCS8qIEFkZGVkIGJ5IE1hdHQgV3UgKi8KKwlpZiAoIWNvZGVjKQorCQlCVUcoKTsKKworCWNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFjYXJkLT5taXhlcl9yZWdzX3JlYWR5KQorCQlyZXR1cm4gYWxpX2FjOTdfZ2V0KGNhcmQsIGNvZGVjLT5pZCwgcmVnKTsKKworCS8qCisJICogICAgICBGSVhNRTogbmVlZCB0byBzdG9wIHRoaXMgY2FjaGluZyBzb21lIHJlZ2lzdGVycworCSAqLworCWlmIChjb2RlYy0+aWQpCisJCWlkID0gMTsKKwllbHNlCisJCWlkID0gMDsKKworCWRhdGEgPSBjYXJkLT5taXhlcl9yZWdzW3JlZyAvIDJdW2lkXTsKKwlyZXR1cm4gZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2FsaV9hYzk3X3dyaXRlKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsKQoreworCWludCBpZDsKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkOworCisJLyogIEFkZGVkIGJ5IE1hdHQgV3UgKi8KKwlpZiAoIWNvZGVjKQorCQlCVUcoKTsKKworCWNhcmQgPSAoc3RydWN0IHRyaWRlbnRfY2FyZCAqKSBjb2RlYy0+cHJpdmF0ZV9kYXRhOworCisJaWYgKCFjYXJkLT5taXhlcl9yZWdzX3JlYWR5KSB7CisJCWFsaV9hYzk3X3NldChjYXJkLCBjb2RlYy0+aWQsIHJlZywgdmFsKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChjb2RlYy0+aWQpCisJCWlkID0gMTsKKwllbHNlCisJCWlkID0gMDsKKworCWNhcmQtPm1peGVyX3JlZ3NbcmVnIC8gMl1baWRdID0gdmFsOworCWFsaV9hYzk3X3NldChjYXJkLCBjb2RlYy0+aWQsIHJlZywgdmFsKTsKK30KKworLyoKK2ZsYWc6CUFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUCisJQUxJX1BDTV9UT19TUERJRl9PVVQKKyovCisKK3N0YXRpYyB2b2lkCithbGlfc2V0dXBfc3BkaWZfb3V0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBmbGFnKQoreworCXVuc2lnbmVkIGxvbmcgc3BkaWY7CisJdW5zaWduZWQgY2hhciBjaDsKKworCWNoYXIgdGVtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisKKwlwY2lfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIAorCQkJCSAgcGNpX2Rldik7CisJaWYgKHBjaV9kZXYgPT0gTlVMTCkKKwkJcmV0dXJuOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NjEsICZ0ZW1wKTsKKwl0ZW1wIHw9IDB4NDA7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NjEsIHRlbXApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2QsICZ0ZW1wKTsKKwl0ZW1wIHw9IDB4MDE7CisJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2QsIHRlbXApOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4N2UsICZ0ZW1wKTsKKwl0ZW1wICY9ICh+MHgyMCk7CisJdGVtcCB8PSAweDEwOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDdlLCB0ZW1wKTsKKworCWNoID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOworCW91dGIoY2ggfCBBTElfU1BESUZfT1VUX0VOQUJMRSwgVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CisJY2ggPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKwlvdXRiKGNoICYgQUxJX1NQRElGX09VVF9DSF9TVEFUVVMsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CisKKwlpZiAoZmxhZyAmIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUKSB7CisJCXNwZGlmID0gaW53KFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCQlzcGRpZiB8PSBBTElfU1BESUZfT1VUX0NIX0VOQUJMRTsKKwkJc3BkaWYgJj0gQUxJX1NQRElGX09VVF9TRUxfU1BESUY7CisJCW91dHcoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCQlzcGRpZiA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MpKTsKKwkJaWYgKGZsYWcgJiBBTElfU1BESUZfT1VUX05PTl9QQ00pCisJCQlzcGRpZiB8PSAweDAwMDI7CisJCWVsc2UKKwkJCXNwZGlmICY9ICh+MHgwMDAyKTsKKwkJb3V0dyhzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTKSk7CisJfSBlbHNlIHsKKwkJc3BkaWYgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJCXNwZGlmIHw9IEFMSV9TUERJRl9PVVRfU0VMX1BDTTsKKwkJb3V0dyhzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaCkKK3sKKwl1bnNpZ25lZCBsb25nIHNjOworCisJc2MgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJc2MgJj0gfigxIDw8IGNoKTsKKwlvdXRsKHNjLCBUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKK30KKworc3RhdGljIHZvaWQKK2FsaV9kaXNhYmxlX3NwZGlmX2luKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBzcGRpZjsKKworCXNwZGlmID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCXNwZGlmICY9ICh+QUxJX1NQRElGX0lOX1NVUFBPUlQpOworCW91dGwoc3BkaWYsIFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCisJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGNhcmQsIEFMSV9TUERJRl9JTl9DSEFOTkVMKTsKK30KKworc3RhdGljIHZvaWQKK2FsaV9zZXR1cF9zcGRpZl9pbihzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXVuc2lnbmVkIGxvbmcgc3BkaWY7CisKKwkvL1NldCBTUERJRiBJTiBTdXBwb3J0ZWQKKwlzcGRpZiA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKKwlzcGRpZiB8PSBBTElfU1BESUZfSU5fU1VQUE9SVDsKKwlvdXRsKHNwZGlmLCBUUklEX1JFRyhjYXJkLCBBTElfR0xPQkFMX0NPTlRST0wpKTsKKworCS8vU2V0IFNQRElGIElOIFJlYworCXNwZGlmID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpOworCXNwZGlmIHw9IEFMSV9TUERJRl9JTl9DSF9FTkFCTEU7CisJb3V0bChzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisKKwlzcGRpZiA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOworCXNwZGlmIHw9IEFMSV9TUERJRl9JTl9DSF9TVEFUVVM7CisJb3V0YihzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKy8qCisJc3BkaWYgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKwlzcGRpZiB8PSBBTElfU1BESUZfSU5fRlVOQ19FTkFCTEU7CisJb3V0YihzcGRpZiwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKyovCit9CisKK3N0YXRpYyB2b2lkCithbGlfZGVsYXkoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCwgaW50IGludGVydmFsKQoreworCXVuc2lnbmVkIGxvbmcgYmVnaW50aW1lciwgY3VycmVudHRpbWVyOworCisJYmVnaW50aW1lciA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7CisJY3VycmVudHRpbWVyID0gaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9TVElNRVIpKTsKKworCXdoaWxlIChjdXJyZW50dGltZXIgPCBiZWdpbnRpbWVyICsgaW50ZXJ2YWwpCisJCWN1cnJlbnR0aW1lciA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU1RJTUVSKSk7Cit9CisKK3N0YXRpYyB2b2lkCithbGlfZGV0ZWN0X3NwZGlmX3JhdGUoc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCkKK3sKKwl1MTYgd3ZhbCA9IDA7CisJdTE2IGNvdW50ID0gMDsKKwl1OCBidmFsID0gMCwgUjEgPSAwLCBSMiA9IDA7CisKKwlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CisJYnZhbCB8PSAweDAyOworCW91dGIoYnZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKworCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CisJYnZhbCB8PSAweDFGOworCW91dGIoYnZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CisKKwl3aGlsZSAoKChSMSA8IDB4MEIpIHx8IChSMSA+IDB4MEUpKSAmJiAoUjEgIT0gMHgxMikgJiYgCisJICAgICAgIGNvdW50IDw9IDUwMDAwKSB7CisJCWNvdW50Kys7CisKKwkJYWxpX2RlbGF5KGNhcmQsIDYpOworCisJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CisJCVIxID0gYnZhbCAmIDB4MUY7CisJfQorCisJaWYgKGNvdW50ID4gNTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogRXJyb3IgaW4gIgorCQkgICAgICAgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZSFcbiIpOworCQlyZXR1cm47CisJfQorCisJY291bnQgPSAwOworCisJd2hpbGUgKGNvdW50IDw9IDUwMDAwKSB7CisJCWNvdW50Kys7CisKKwkJYWxpX2RlbGF5KGNhcmQsIDYpOworCisJCWJ2YWwgPSBpbmIoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAxKSk7CisJCVIyID0gYnZhbCAmIDB4MUY7CisKKwkJaWYgKFIyICE9IFIxKQorCQkJUjEgPSBSMjsKKwkJZWxzZQorCQkJYnJlYWs7CisJfQorCisJaWYgKGNvdW50ID4gNTAwMDApIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAidHJpZGVudDogRXJyb3IgaW4gIgorCQkgICAgICAgImFsaV9kZXRlY3Rfc3BkaWZfcmF0ZSFcbiIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChSMikgeworCWNhc2UgMHgwYjoKKwljYXNlIDB4MGM6CisJY2FzZSAweDBkOgorCWNhc2UgMHgwZToKKwkJd3ZhbCA9IGludyhUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDIpKTsKKwkJd3ZhbCAmPSAweEUwRjA7CisJCXd2YWwgfD0gKHUxNikgMHgwOSA8PCA4IHwgKHUxNikgMHgwNTsKKwkJb3V0dyh3dmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCArIDIpKTsKKworCQlidmFsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKSAmIDB4RjA7CisJCW91dGIoYnZhbCB8IDB4MDIsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDMpKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4MTI6CisJCXd2YWwgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAyKSk7CisJCXd2YWwgJj0gMHhFMEYwOworCQl3dmFsIHw9ICh1MTYpIDB4MEUgPDwgOCB8ICh1MTYpIDB4MDg7CisJCW91dHcod3ZhbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwgKyAyKSk7CisKKwkJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSkgJiAweEYwOworCQlvdXRiKGJ2YWwgfCAweDAzLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK2FsaV9nZXRfc3BkaWZfaW5fcmF0ZShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXUzMiBkd1JhdGUgPSAwOworCXU4IGJ2YWwgPSAwOworCisJYWxpX2RldGVjdF9zcGRpZl9yYXRlKGNhcmQpOworCisJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOworCWJ2YWwgJj0gMHg3RjsKKwlidmFsIHw9IDB4NDA7CisJb3V0YihidmFsLCBUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1RSTCkpOworCisJYnZhbCA9IGluYihUUklEX1JFRyhjYXJkLCBBTElfU1BESUZfQ1MgKyAzKSk7CisJYnZhbCAmPSAweDBGOworCisJc3dpdGNoIChidmFsKSB7CisJY2FzZSAwOgorCQlkd1JhdGUgPSA0NDEwMDsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlkd1JhdGUgPSA0ODAwMDsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkd1JhdGUgPSAzMjAwMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLy8gRXJyb3Igb2NjdXJzCisJCWJyZWFrOworCX0KKworCXJldHVybiBkd1JhdGU7CisKK30KKworc3RhdGljIGludAorYWxpX2Nsb3NlX211bHRpX2NoYW5uZWxzKHZvaWQpCit7CisJY2hhciB0ZW1wID0gMDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldiA9IE5VTEw7CisKKwlwY2lfZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIFBDSV9ERVZJQ0VfSURfQUxfTTE1MzMsIAorCQkJCSAgcGNpX2Rldik7CisJaWYgKHBjaV9kZXYgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIDB4NTksICZ0ZW1wKTsKKwl0ZW1wICY9IH4weDgwOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCB0ZW1wKTsKKworCXBjaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSwgCisJCQkJICBwY2lfZGV2KTsKKwlpZiAocGNpX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweEI4LCAmdGVtcCk7CisJdGVtcCAmPSB+MHgyMDsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgMHhCOCwgdGVtcCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYWxpX3NldHVwX211bHRpX2NoYW5uZWxzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIGludCBjaGFuX251bXMpCit7CisJdW5zaWduZWQgbG9uZyBkd1ZhbHVlOworCWNoYXIgdGVtcCA9IDA7CisJc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYgPSBOVUxMOworCisJcGNpX2RldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCAKKwkJCQkgIHBjaV9kZXYpOworCWlmIChwY2lfZGV2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKwlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCAmdGVtcCk7CisJdGVtcCB8PSAweDgwOworCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2LCAweDU5LCB0ZW1wKTsKKworCXBjaV9kZXYgPSBwY2lfZmluZF9kZXZpY2UoUENJX1ZFTkRPUl9JRF9BTCwgUENJX0RFVklDRV9JRF9BTF9NNzEwMSwgCisJCQkJICBwY2lfZGV2KTsKKwlpZiAocGNpX2RldiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2RldiwgKGludCkgMHhCOCwgJnRlbXApOworCXRlbXAgfD0gMHgyMDsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpX2RldiwgKGludCkgMHhCOCwgKHU4KSB0ZW1wKTsKKwlpZiAoY2hhbl9udW1zID09IDYpIHsKKwkJZHdWYWx1ZSA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKSB8IDB4MDAwZjAwMDA7CisJCW91dGwoZHdWYWx1ZSwgVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CisJCW1kZWxheSg0KTsKKwkJZHdWYWx1ZSA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKKwkJaWYgKGR3VmFsdWUgJiAweDIwMDAwMDApIHsKKwkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMF0sIDB4MDIsIDgwODApOworCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgMHgzNiwgMCk7CisJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzBdLCAweDM4LCAwKTsKKwkJCS8qCisJCQkgKiAgICAgIE9uIGEgYm9hcmQgd2l0aCBhIHNpbmdsZSBjb2RlYyB5b3Ugd29uJ3QgZ2V0IHRoZQorCQkJICogICAgICBzdXJyb3VuZC4gT24gb3RoZXIgYm9hcmRzIGNvbmZpZ3VyZSBpdC4KKwkJCSAqLworCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbMV0gIT0gTlVMTCkgeworCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4MzYsIDApOworCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4MzgsIDApOworCQkJCWFsaV9hYzk3X3dyaXRlKGNhcmQtPmFjOTdfY29kZWNbMV0sIDB4MDIsIDB4MDYwNik7CisJCQkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1sxXSwgMHgxOCwgMHgwMzAzKTsKKwkJCQlhbGlfYWM5N193cml0ZShjYXJkLT5hYzk3X2NvZGVjWzFdLCAweDc0LCAweDMpOworCQkJfQorCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyB2b2lkCithbGlfZnJlZV9wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkLCB1bnNpZ25lZCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgYmFuazsKKworCWlmIChjaGFubmVsID4gMzEpCisJCXJldHVybjsKKworCWJhbmsgPSBjaGFubmVsID4+IDU7CisJY2hhbm5lbCA9IGNoYW5uZWwgJiAweDFmOworCisJY2FyZC0+YmFua3NbYmFua10uYml0bWFwICY9IH4oMSA8PCAoY2hhbm5lbCkpOworfQorCitzdGF0aWMgaW50CithbGlfYWxsb2NhdGVfb3RoZXJfc3RhdGVzX3Jlc291cmNlcyhzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGludCBjaGFuX251bXMpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHN0YXRlLT5jYXJkOworCXN0cnVjdCB0cmlkZW50X3N0YXRlICpzOworCWludCBpLCBzdGF0ZV9jb3VudCA9IDA7CisJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CisJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbDsKKwl1bnNpZ25lZCBsb25nIG51bTsKKworCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKKworCWlmIChjaGFuX251bXMgIT0gNikKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyAoaSA8IEFMSV9DSEFOTkVMUykgJiYgKHN0YXRlX2NvdW50ICE9IDQpOyBpKyspIHsKKwkJaWYgKGNhcmQtPnN0YXRlc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOworCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBudW0pKSkgeworCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgbnVtOworCQkJY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tudW1dOworCQkJY2hhbm5lbC0+bnVtID0gbnVtOworCQl9IGVsc2UgeworCQkJc3RhdGVfY291bnQtLTsKKwkJCWZvciAoOyBzdGF0ZV9jb3VudCA+PSAwOyBzdGF0ZV9jb3VudC0tKSB7CisJCQkJa2ZyZWUoc3RhdGUtPm90aGVyX3N0YXRlc1tzdGF0ZV9jb3VudF0pOworCQkJCW51bSA9IGFsaV9tdWx0aV9jaGFubmVsc181XzFbc3RhdGVfY291bnRdOworCQkJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOworCQkJfQorCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlzID0gY2FyZC0+c3RhdGVzW2ldID0ga21hbGxvYyhzaXplb2YoKnN0YXRlKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcykgeworCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CisJCQlhbGlfZnJlZV9wY21fY2hhbm5lbChjYXJkLCBudW0pOworCQkJc3RhdGVfY291bnQtLTsKKwkJCWZvciAoOyBzdGF0ZV9jb3VudCA+PSAwOyBzdGF0ZV9jb3VudC0tKSB7CisJCQkJbnVtID0gYWxpX211bHRpX2NoYW5uZWxzXzVfMVtzdGF0ZV9jb3VudF07CisJCQkJYWxpX2ZyZWVfcGNtX2NoYW5uZWwoY2FyZCwgbnVtKTsKKwkJCQlrZnJlZShzdGF0ZS0+b3RoZXJfc3RhdGVzW3N0YXRlX2NvdW50XSk7CisJCQl9CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQltZW1zZXQocywgMCwgc2l6ZW9mKCpzdGF0ZSkpOworCisJCXMtPmRtYWJ1Zi5jaGFubmVsID0gY2hhbm5lbDsKKwkJcy0+ZG1hYnVmLm9zc2ZyYWdzaGlmdCA9IHMtPmRtYWJ1Zi5vc3NtYXhmcmFncyA9CisJCQlzLT5kbWFidWYuc3ViZGl2aXNpb24gPSAwOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZzLT5kbWFidWYud2FpdCk7CisJCXMtPm1hZ2ljID0gY2FyZC0+bWFnaWM7CisJCXMtPmNhcmQgPSBjYXJkOworCQlzLT52aXJ0ID0gaTsKKwkJYWxpX2VuYWJsZV9zcGVjaWFsX2NoYW5uZWwocyk7CisJCXN0YXRlLT5vdGhlcl9zdGF0ZXNbc3RhdGVfY291bnQrK10gPSBzOworCX0KKworCWlmIChzdGF0ZV9jb3VudCAhPSA0KSB7CisJCXN0YXRlX2NvdW50LS07CisJCWZvciAoOyBzdGF0ZV9jb3VudCA+PSAwOyBzdGF0ZV9jb3VudC0tKSB7CisJCQlrZnJlZShzdGF0ZS0+b3RoZXJfc3RhdGVzW3N0YXRlX2NvdW50XSk7CisJCQludW0gPSBhbGlfbXVsdGlfY2hhbm5lbHNfNV8xW3N0YXRlX2NvdW50XTsKKwkJCWFsaV9mcmVlX3BjbV9jaGFubmVsKGNhcmQsIG51bSk7CisJCX0KKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCithbGlfc2F2ZV9yZWdzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgajsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlhbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MmNdID0gaW5sKFRSSURfUkVHKGNhcmQsIFQ0RF9NSVNDSU5UKSk7CisJLy9hbGlfcmVnaXN0ZXJzLmdsb2JhbF9yZWdzWzB4MjBdID0gaW5sKFRSSURfUkVHKGNhcmQsVDREX1NUQVJUX0EpKTsgICAgCisJYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1sweDIxXSA9IGlubChUUklEX1JFRyhjYXJkLCBUNERfU1RPUF9BKSk7CisKKwkvL2Rpc2FibGUgYWxsIElSUSBiaXRzCisJb3V0bChBTElfRElTQUJMRV9BTExfSVJRLCBUUklEX1JFRyhjYXJkLCBUNERfTUlTQ0lOVCkpOworCisJZm9yIChpID0gMTsgaSA8IEFMSV9NSVhFUl9SRUdTOyBpKyspCisJCWFsaV9yZWdpc3RlcnMubWl4ZXJfcmVnc1tpXSA9IGFsaV9hYzk3X3JlYWQoY2FyZC0+YWM5N19jb2RlY1swXSwgCisJCQkJCQkJICAgIGkgKiAyKTsKKworCWZvciAoaSA9IDA7IGkgPCBBTElfR0xPQkFMX1JFR1M7IGkrKykgeworCQlpZiAoKGkgKiA0ID09IFQ0RF9NSVNDSU5UKSB8fCAoaSAqIDQgPT0gVDREX1NUT1BfQSkpCisJCQljb250aW51ZTsKKwkJYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1tpXSA9IGlubChUUklEX1JFRyhjYXJkLCBpICogNCkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBTElfQ0hBTk5FTFM7IGkrKykgeworCQlvdXRiKGksIFRSSURfUkVHKGNhcmQsIFQ0RF9MRk9fR0NfQ0lSKSk7CisJCWZvciAoaiA9IDA7IGogPCBBTElfQ0hBTk5FTF9SRUdTOyBqKyspCisJCQlhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSA9IGlubChUUklEX1JFRyhjYXJkLCAKKwkJCQkJCQkJCWogKiA0ICsgMHhlMCkpOworCX0KKworCS8vU3RvcCBhbGwgSFcgY2hhbm5lbAorCW91dGwoQUxJX1NUT1BfQUxMX0NIQU5ORUxTLCBUUklEX1JFRyhjYXJkLCBUNERfU1RPUF9BKSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCithbGlfcmVzdG9yZV9yZWdzKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaSwgajsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlmb3IgKGkgPSAxOyBpIDwgQUxJX01JWEVSX1JFR1M7IGkrKykKKwkJYWxpX2FjOTdfd3JpdGUoY2FyZC0+YWM5N19jb2RlY1swXSwgaSAqIDIsIAorCQkJICAgICAgIGFsaV9yZWdpc3RlcnMubWl4ZXJfcmVnc1tpXSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQUxJX0NIQU5ORUxTOyBpKyspIHsKKwkJb3V0YihpLCBUUklEX1JFRyhjYXJkLCBUNERfTEZPX0dDX0NJUikpOworCQlmb3IgKGogPSAwOyBqIDwgQUxJX0NIQU5ORUxfUkVHUzsgaisrKQorCQkJb3V0bChhbGlfcmVnaXN0ZXJzLmNoYW5uZWxfcmVnc1tpXVtqXSwgCisJCQkgICAgIFRSSURfUkVHKGNhcmQsIGogKiA0ICsgMHhlMCkpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBTElfR0xPQkFMX1JFR1M7IGkrKykgeworCQlpZiAoKGkgKiA0ID09IFQ0RF9NSVNDSU5UKSB8fCAoaSAqIDQgPT0gVDREX1NUT1BfQSkgfHwgCisJCSAgICAoaSAqIDQgPT0gVDREX1NUQVJUX0EpKQorCQkJY29udGludWU7CisJCW91dGwoYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1tpXSwgVFJJRF9SRUcoY2FyZCwgaSAqIDQpKTsKKwl9CisKKwkvL3N0YXJ0IEhXIGNoYW5uZWwKKwlvdXRsKGFsaV9yZWdpc3RlcnMuZ2xvYmFsX3JlZ3NbMHgyMF0sIFRSSURfUkVHKGNhcmQsIFQ0RF9TVEFSVF9BKSk7CisJLy9yZXN0b3JlIElSUSBlbmFibGUgYml0cworCW91dGwoYWxpX3JlZ2lzdGVycy5nbG9iYWxfcmVnc1sweDJjXSwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQpKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludAordHJpZGVudF9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpkZXYsIHBtX21lc3NhZ2VfdCB1bnVzZWQpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IHBjaV9nZXRfZHJ2ZGF0YShkZXYpOworCisJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCWFsaV9zYXZlX3JlZ3MoY2FyZCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit0cmlkZW50X3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBwY2lfZ2V0X2RydmRhdGEoZGV2KTsKKworCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgeworCQlhbGlfcmVzdG9yZV9yZWdzKGNhcmQpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKgorYWxpX2FsbG9jX3BjbV9jaGFubmVsKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJc3RydWN0IHRyaWRlbnRfcGNtX2JhbmsgKmJhbms7CisJaW50IGlkeDsKKworCWJhbmsgPSAmY2FyZC0+YmFua3NbQkFOS19BXTsKKworCWlmIChpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSkgJiAKKwkgICAgKEFMSV9TUERJRl9PVVRfQ0hfRU5BQkxFKSkgeworCQlpZHggPSBBTElfU1BESUZfT1VUX0NIQU5ORUw7CisJCWlmICghKGJhbmstPmJpdG1hcCAmICgxIDw8IGlkeCkpKSB7CisJCQlzdHJ1Y3QgdHJpZGVudF9jaGFubmVsICpjaGFubmVsID0gJmJhbmstPmNoYW5uZWxzW2lkeF07CisJCQliYW5rLT5iaXRtYXAgfD0gMSA8PCBpZHg7CisJCQljaGFubmVsLT5udW0gPSBpZHg7CisJCQlyZXR1cm4gY2hhbm5lbDsKKwkJfQorCX0KKworCWZvciAoaWR4ID0gQUxJX1BDTV9PVVRfQ0hBTk5FTF9GSVJTVDsgaWR4IDw9IEFMSV9QQ01fT1VUX0NIQU5ORUxfTEFTVDsgCisJICAgICBpZHgrKykgeworCQlpZiAoIShiYW5rLT5iaXRtYXAgJiAoMSA8PCBpZHgpKSkgeworCQkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOworCQkJYmFuay0+Yml0bWFwIHw9IDEgPDwgaWR4OworCQkJY2hhbm5lbC0+bnVtID0gaWR4OworCQkJcmV0dXJuIGNoYW5uZWw7CisJCX0KKwl9CisKKwkvKiBubyBtb3JlIGZyZWUgY2hhbm5lbHMgYXZhbGlhYmxlICovCisjaWYgMCAKKwlwcmludGsoS0VSTl9FUlIgImFsaTogbm8gbW9yZSBjaGFubmVscyBhdmFpbGFibGUgb24gQmFuayBBLlxuIik7CisjZW5kaWYgLyogMCAqLyAKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCB0cmlkZW50X2NoYW5uZWwgKgorYWxpX2FsbG9jX3JlY19wY21fY2hhbm5lbChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXN0cnVjdCB0cmlkZW50X3BjbV9iYW5rICpiYW5rOworCWludCBpZHg7CisKKwlpZiAoaW5sKFRSSURfUkVHKGNhcmQsIEFMSV9HTE9CQUxfQ09OVFJPTCkpICYgQUxJX1NQRElGX0lOX1NVUFBPUlQpCisJCWlkeCA9IEFMSV9TUERJRl9JTl9DSEFOTkVMOworCWVsc2UKKwkJaWR4ID0gQUxJX1BDTV9JTl9DSEFOTkVMOworCisJYmFuayA9ICZjYXJkLT5iYW5rc1tCQU5LX0FdOworCisJaWYgKCEoYmFuay0+Yml0bWFwICYgKDEgPDwgaWR4KSkpIHsKKwkJc3RydWN0IHRyaWRlbnRfY2hhbm5lbCAqY2hhbm5lbCA9ICZiYW5rLT5jaGFubmVsc1tpZHhdOworCQliYW5rLT5iaXRtYXAgfD0gMSA8PCBpZHg7CisJCWNoYW5uZWwtPm51bSA9IGlkeDsKKwkJcmV0dXJuIGNoYW5uZWw7CisJfQorCisJLyogbm8gZnJlZSByZWNvcmRhYmxlIGNoYW5uZWxzIGF2YWxpYWJsZSAqLworI2lmIDAgCisJcHJpbnRrKEtFUk5fRVJSICJhbGk6IG5vIHJlY29yZGFibGUgY2hhbm5lbHMgYXZhaWxhYmxlIG9uIEJhbmsgQS5cbiIpOworI2VuZGlmIC8qIDAgKi8gCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkCithbGlfc2V0X3NwZGlmX291dF9yYXRlKHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQsIHVuc2lnbmVkIGludCByYXRlKQoreworCXVuc2lnbmVkIGNoYXIgY2hfc3Rfc2VsOworCXVuc2lnbmVkIHNob3J0IHN0YXR1c19yYXRlOworCisJc3dpdGNoIChyYXRlKSB7CisJY2FzZSA0NDEwMDoKKwkJc3RhdHVzX3JhdGUgPSAwOworCQlicmVhazsKKwljYXNlIDMyMDAwOgorCQlzdGF0dXNfcmF0ZSA9IDB4MzAwOworCQlicmVhazsKKwljYXNlIDQ4MDAwOgorCWRlZmF1bHQ6CisJCXN0YXR1c19yYXRlID0gMHgyMDA7CisJCWJyZWFrOworCX0KKworCS8qIHNlbGVjdCBzcGRpZl9vdXQgKi8gCisJY2hfc3Rfc2VsID0gaW5iKFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSkgJiBBTElfU1BESUZfT1VUX0NIX1NUQVRVUzsKKworCWNoX3N0X3NlbCB8PSAweDgwOwkvKiBzZWxlY3QgcmlnaHQgKi8gCisJb3V0YihjaF9zdF9zZWwsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DVFJMKSk7CisJb3V0YihzdGF0dXNfcmF0ZSB8IDB4MjAsIFRSSURfUkVHKGNhcmQsIEFMSV9TUERJRl9DUyArIDIpKTsKKworCWNoX3N0X3NlbCAmPSAofjB4ODApOwkvKiBzZWxlY3QgbGVmdCAqLyAKKwlvdXRiKGNoX3N0X3NlbCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NUUkwpKTsKKwlvdXR3KHN0YXR1c19yYXRlIHwgMHgxMCwgVFJJRF9SRUcoY2FyZCwgQUxJX1NQRElGX0NTICsgMikpOworfQorCitzdGF0aWMgdm9pZAorYWxpX2FkZHJlc3NfaW50ZXJydXB0KHN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQpCit7CisJaW50IGksIGNoYW5uZWw7CisJc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlOworCXUzMiBtYXNrLCBjaGFubmVsX21hc2s7CisKKwltYXNrID0gdHJpZGVudF9nZXRfaW50ZXJydXB0X21hc2soY2FyZCwgMCk7CisJZm9yIChpID0gMDsgaSA8IE5SX0hXX0NIOyBpKyspIHsKKwkJaWYgKChzdGF0ZSA9IGNhcmQtPnN0YXRlc1tpXSkgPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQljaGFubmVsID0gc3RhdGUtPmRtYWJ1Zi5jaGFubmVsLT5udW07CisJCWlmICgoY2hhbm5lbF9tYXNrID0gMSA8PCBjaGFubmVsKSAmIG1hc2spIHsKKwkJCW1hc2sgJj0gfmNoYW5uZWxfbWFzazsKKwkJCXRyaWRlbnRfYWNrX2NoYW5uZWxfaW50ZXJydXB0KGNhcmQsIGNoYW5uZWwpOworCQkJdWRlbGF5KDEwMCk7CisJCQlzdGF0ZS0+ZG1hYnVmLnVwZGF0ZV9mbGFnIHw9IEFMSV9BRERSRVNTX0lOVF9VUERBVEU7CisJCQl0cmlkZW50X3VwZGF0ZV9wdHIoc3RhdGUpOworCQl9CisJfQorCWlmIChtYXNrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBOUl9IV19DSDsgaSsrKSB7CisJCQlpZiAobWFzayAmICgxIDw8IGkpKSB7CisJCQkJcHJpbnRrKCJhbGk6IHNwdXJpb3VzIGNoYW5uZWwgaXJxICVkLlxuIiwgaSk7CisJCQkJdHJpZGVudF9hY2tfY2hhbm5lbF9pbnRlcnJ1cHQoY2FyZCwgaSk7CisJCQkJdHJpZGVudF9zdG9wX3ZvaWNlKGNhcmQsIGkpOworCQkJCXRyaWRlbnRfZGlzYWJsZV92b2ljZV9pcnEoY2FyZCwgaSk7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIFVwZGF0aW5nIHRoZSB2YWx1ZXMgb2YgY291bnRlcnMgb2Ygb3RoZXJfc3RhdGVzJyBETUFzIHdpdGhvdXQgbG9jayAKK3Byb3RlY3Rpb24gaXMgbm8gaGFybSBiZWNhdXNlIGFsbCBETUFzIG9mIG11bHRpLWNoYW5uZWxzIGFuZCBpbnRlcnJ1cHQKK2RlcGVuZCBvbiBhIG1hc3RlciBzdGF0ZSdzIERNQSwgYW5kIGNoYW5naW5nIHRoZSBjb3VudGVycyBvZiB0aGUgbWFzdGVyCitzdGF0ZSBETUEgaXMgcHJvdGVjdGVkIGJ5IGEgc3BpbmxvY2suCisqLworc3RhdGljIGludAorYWxpX3dyaXRlXzVfMShzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqc3RhdGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsIAorCSAgICAgIGludCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIHVuc2lnbmVkIGludCAqY29weV9jb3VudCwgCisJICAgICAgdW5zaWduZWQgaW50ICpzdGF0ZV9jbnQpCit7CisKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWYgPSAmc3RhdGUtPmRtYWJ1ZjsKKwlzdHJ1Y3QgZG1hYnVmICpkbWFidWZfdGVtcDsKKwljb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyID0gYnVmOworCXVuc2lnbmVkIHN3cHRyLCBvdGhlcl9kbWFfbnVtcywgc2FtcGxlX3M7CisJdW5zaWduZWQgaW50IGksIGxvb3A7CisKKwlvdGhlcl9kbWFfbnVtcyA9IDQ7CisJc2FtcGxlX3MgPSBzYW1wbGVfc2l6ZVtkbWFidWYtPmZtdF0gPj4gMTsKKwlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisKKwlpZiAoKGkgPSBzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50KSA+IDApIHsKKwkJaWYgKGkgPT0gMSkgeworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAorCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CisJCQlpLS07CisJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CisJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50Kys7CisJCX0gZWxzZQorCQkJaSA9IGkgLSAoc3RhdGUtPmNoYW5zX251bSAtIG90aGVyX2RtYV9udW1zKTsKKwkJZm9yICg7IChpIDwgb3RoZXJfZG1hX251bXMpICYmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKTsgaSsrKSB7CisJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CisJCX0KKwkJaWYgKGNudF9mb3JfbXVsdGlfY2hhbm5lbCA9PSAwKQorCQkJc3RhdGUtPm11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudCArPSBpOworCX0KKwlpZiAoY250X2Zvcl9tdWx0aV9jaGFubmVsID4gMCkgeworCQlsb29wID0gY250X2Zvcl9tdWx0aV9jaGFubmVsIC8gKHN0YXRlLT5jaGFuc19udW0gKiBzYW1wbGVfcyk7CisJCWZvciAoaSA9IDA7IGkgPCBsb29wOyBpKyspIHsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIAorCQkJCQkgICBzYW1wbGVfcyAqIDIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc2Vla19vZmZzZXQoc3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCQkgICAgc2FtcGxlX3MgKiAyLCAqY29weV9jb3VudCk7CisJCQkoKnN0YXRlX2NudCkgKz0gKHNhbXBsZV9zICogMik7CisKKwkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbMF0tPmRtYWJ1ZjsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKKworCQkJZG1hYnVmX3RlbXAgPSAmc3RhdGUtPm90aGVyX3N0YXRlc1sxXS0+ZG1hYnVmOworCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zl90ZW1wLT5yYXdidWYgKyBkbWFidWZfdGVtcC0+c3dwdHIsIAorCQkJCQkgICBidWZmZXIsIHNhbXBsZV9zKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNlZWtfb2Zmc2V0KGRtYWJ1Zl90ZW1wLT5zd3B0ciwgYnVmZmVyLCBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOworCisJCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzWzJdLT5kbWFidWY7CisJCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmX3RlbXAtPnJhd2J1ZiArIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CisKKwkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbM10tPmRtYWJ1ZjsKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgZG1hYnVmX3RlbXAtPnN3cHRyLCAKKwkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlzZWVrX29mZnNldChkbWFidWZfdGVtcC0+c3dwdHIsIGJ1ZmZlciwgY250X2Zvcl9tdWx0aV9jaGFubmVsLCAKKwkJCQkgICAgc2FtcGxlX3MsICpjb3B5X2NvdW50KTsKKwkJfQorCisJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CisJCQlzdGF0ZS0+bXVsdGlfY2hhbm5lbHNfYWRqdXN0X2NvdW50ID0gY250X2Zvcl9tdWx0aV9jaGFubmVsIC8gc2FtcGxlX3M7CisKKwkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWYtPnJhd2J1ZiArIHN3cHRyLCBidWZmZXIsIHNhbXBsZV9zKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJICAgIHNhbXBsZV9zLCAqY29weV9jb3VudCk7CisJCQkoKnN0YXRlX2NudCkgKz0gc2FtcGxlX3M7CisKKwkJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CisJCQkJaWYgKGNvcHlfZnJvbV91c2VyKGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIAorCQkJCQkJICAgYnVmZmVyLCBzYW1wbGVfcykpCisJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCXNlZWtfb2Zmc2V0KHN3cHRyLCBidWZmZXIsIGNudF9mb3JfbXVsdGlfY2hhbm5lbCwgCisJCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOworCQkJCSgqc3RhdGVfY250KSArPSBzYW1wbGVfczsKKworCQkJCWlmIChjbnRfZm9yX211bHRpX2NoYW5uZWwgPiAwKSB7CisJCQkJCWludCBkaWZmID0gc3RhdGUtPmNoYW5zX251bSAtIG90aGVyX2RtYV9udW1zOworCQkJCQlsb29wID0gc3RhdGUtPm11bHRpX2NoYW5uZWxzX2FkanVzdF9jb3VudCAtIGRpZmY7CisJCQkJCWZvciAoaSA9IDA7IGkgPCBsb29wOyBpKyspIHsKKwkJCQkJCWRtYWJ1Zl90ZW1wID0gJnN0YXRlLT5vdGhlcl9zdGF0ZXNbaV0tPmRtYWJ1ZjsKKwkJCQkJCWlmIChjb3B5X2Zyb21fdXNlcihkbWFidWZfdGVtcC0+cmF3YnVmICsgCisJCQkJCQkJCSAgIGRtYWJ1Zl90ZW1wLT5zd3B0ciwgCisJCQkJCQkJCSAgIGJ1ZmZlciwgc2FtcGxlX3MpKQorCQkJCQkJCXJldHVybiAtRUZBVUxUOworCQkJCQkJc2Vla19vZmZzZXQoZG1hYnVmX3RlbXAtPnN3cHRyLCBidWZmZXIsIAorCQkJCQkJCSAgICBjbnRfZm9yX211bHRpX2NoYW5uZWwsIAorCQkJCQkJCSAgICBzYW1wbGVfcywgKmNvcHlfY291bnQpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9IGVsc2UKKwkJCXN0YXRlLT5tdWx0aV9jaGFubmVsc19hZGp1c3RfY291bnQgPSAwOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgb3RoZXJfZG1hX251bXM7IGkrKykgeworCQlkbWFidWZfdGVtcCA9ICZzdGF0ZS0+b3RoZXJfc3RhdGVzW2ldLT5kbWFidWY7CisJCWRtYWJ1Zl90ZW1wLT5zd3B0ciA9IGRtYWJ1Zl90ZW1wLT5zd3B0ciAlIGRtYWJ1Zl90ZW1wLT5kbWFzaXplOworCX0KKwlyZXR1cm4gKnN0YXRlX2NudDsKK30KKworc3RhdGljIHZvaWQKK2FsaV9mcmVlX290aGVyX3N0YXRlc19yZXNvdXJjZXMoc3RydWN0IHRyaWRlbnRfc3RhdGUgKnN0YXRlKQoreworCWludCBpOworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBzdGF0ZS0+Y2FyZDsKKwlzdHJ1Y3QgdHJpZGVudF9zdGF0ZSAqczsKKwl1bnNpZ25lZCBvdGhlcl9zdGF0ZXNfY291bnQ7CisKKwlvdGhlcl9zdGF0ZXNfY291bnQgPSBzdGF0ZS0+Y2hhbnNfbnVtIC0gMjsgLyogZXhjZXB0IFBDTSBML1IgY2hhbm5lbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgb3RoZXJfc3RhdGVzX2NvdW50OyBpKyspIHsKKwkJcyA9IHN0YXRlLT5vdGhlcl9zdGF0ZXNbaV07CisJCWRlYWxsb2NfZG1hYnVmKCZzLT5kbWFidWYsIGNhcmQtPnBjaV9kZXYpOworCQlhbGlfZGlzYWJsZV9zcGVjaWFsX2NoYW5uZWwocy0+Y2FyZCwgcy0+ZG1hYnVmLmNoYW5uZWwtPm51bSk7CisJCXN0YXRlLT5jYXJkLT5mcmVlX3BjbV9jaGFubmVsKHMtPmNhcmQsIHMtPmRtYWJ1Zi5jaGFubmVsLT5udW0pOworCQljYXJkLT5zdGF0ZXNbcy0+dmlydF0gPSBOVUxMOworCQlrZnJlZShzKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKnJlczsKKworc3RhdGljIGludAorYWxpX3dyaXRlX3Byb2Moc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IChzdHJ1Y3QgdHJpZGVudF9jYXJkICopIGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwljaGFyIGM7CisKKwlpZiAoY291bnQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGdldF91c2VyKGMsIGJ1ZmZlcikpCisJCXJldHVybiAtRUZBVUxUOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmNhcmQtPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKGMpIHsKKwljYXNlICcwJzoKKwkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfUENNX1RPX1NQRElGX09VVCk7CisJCWFsaV9kaXNhYmxlX3NwZWNpYWxfY2hhbm5lbChjYXJkLCBBTElfU1BESUZfT1VUX0NIQU5ORUwpOworCQlicmVhazsKKwljYXNlICcxJzoKKwkJYWxpX3NldHVwX3NwZGlmX291dChjYXJkLCBBTElfU1BESUZfT1VUX1RPX1NQRElGX09VVCB8IAorCQkJCSAgICBBTElfU1BESUZfT1VUX1BDTSk7CisJCWJyZWFrOworCWNhc2UgJzInOgorCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUIHwgCisJCQkJICAgIEFMSV9TUERJRl9PVVRfTk9OX1BDTSk7CisJCWJyZWFrOworCWNhc2UgJzMnOgorCQlhbGlfZGlzYWJsZV9zcGRpZl9pbihjYXJkKTsJLy9kZWZhdWx0CisJCWJyZWFrOworCWNhc2UgJzQnOgorCQlhbGlfc2V0dXBfc3BkaWZfaW4oY2FyZCk7CisJCWJyZWFrOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjYXJkLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIE9TUyAvZGV2L21peGVyIGZpbGUgb3BlcmF0aW9uIG1ldGhvZHMgKi8KK3N0YXRpYyBpbnQKK3RyaWRlbnRfb3Blbl9taXhkZXYoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IGkgPSAwOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGRldnM7CisKKwlmb3IgKGNhcmQgPSBkZXZzOyBjYXJkICE9IE5VTEw7IGNhcmQgPSBjYXJkLT5uZXh0KQorCQlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKQorCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJiAKKwkJCSAgICBjYXJkLT5hYzk3X2NvZGVjW2ldLT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQkJZ290byBtYXRjaDsKKworCWlmICghY2FyZCkgeworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisgICAgICBtYXRjaDoKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBjYXJkLT5hYzk3X2NvZGVjW2ldOworCisJcmV0dXJuIG5vbnNlZWthYmxlX29wZW4oaW5vZGUsIGZpbGUpOworfQorCitzdGF0aWMgaW50Cit0cmlkZW50X2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgCisJCSAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjID0gKHN0cnVjdCBhYzk3X2NvZGVjICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiBjb2RlYy0+bWl4ZXJfaW9jdGwoY29kZWMsIGNtZCwgYXJnKTsKK30KKworc3RhdGljIC8qY29uc3QgKi8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmlkZW50X21peGVyX2ZvcHMgPSB7CisJLm93bmVyID0gVEhJU19NT0RVTEUsCisJLmxsc2VlayA9IG5vX2xsc2VlaywKKwkuaW9jdGwgPSB0cmlkZW50X2lvY3RsX21peGRldiwKKwkub3BlbiA9IHRyaWRlbnRfb3Blbl9taXhkZXYsCit9OworCitzdGF0aWMgaW50CithbGlfcmVzZXRfNTQ1MShzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwY2lfZGV2ID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgZHdWYWw7CisJdW5zaWduZWQgc2hvcnQgd0NvdW50LCB3UmVnOworCisJcGNpX2RldiA9IHBjaV9maW5kX2RldmljZShQQ0lfVkVORE9SX0lEX0FMLCBQQ0lfREVWSUNFX0lEX0FMX00xNTMzLCAKKwkJCQkgIHBjaV9kZXYpOworCWlmIChwY2lfZGV2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCAmZHdWYWwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg3YywgZHdWYWwgfCAweDA4MDAwMDAwKTsKKwl1ZGVsYXkoNTAwMCk7CisJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4N2MsICZkd1ZhbCk7CisJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDdjLCBkd1ZhbCAmIDB4ZjdmZmZmZmYpOworCXVkZWxheSg1MDAwKTsKKworCXBjaV9kZXYgPSBjYXJkLT5wY2lfZGV2OworCWlmIChwY2lfZGV2ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwY2lfZGV2LCAweDQ0LCAmZHdWYWwpOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX2RldiwgMHg0NCwgZHdWYWwgfCAweDAwMGMwMDAwKTsKKwl1ZGVsYXkoNTAwKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX2RldiwgMHg0NCwgJmR3VmFsKTsKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9kZXYsIDB4NDQsIGR3VmFsICYgMHhmZmZiZmZmZik7CisJdWRlbGF5KDUwMDApOworCisJLyogVE9ETzogcmVjb2duaXplIGlmIHdlIGhhdmUgYSBQTSBjYXBhYmxlIGNvZGVjIGFuZCBvbmx5IGRvIHRoaXMgKi8KKwkvKiBpZiB0aGUgY29kZWMgaXMgUE0gY2FwYWJsZSAqLworCXdDb3VudCA9IDIwMDA7CisJd2hpbGUgKHdDb3VudC0tKSB7CisJCXdSZWcgPSBhbGlfYWM5N19nZXQoY2FyZCwgMCwgQUM5N19QT1dFUl9DT05UUk9MKTsKKwkJaWYgKCh3UmVnICYgMHgwMDBmKSA9PSAweDAwMGYpCisJCQlyZXR1cm4gMDsKKwkJdWRlbGF5KDUwMDApOworCX0KKwkvKiBUaGlzIGlzIG5vbiBmYXRhbCBpZiB5b3UgaGF2ZSBhIG5vbiBQTSBjYXBhYmxlIGNvZGVjLi4gKi8KKwlyZXR1cm4gMDsKK30KKworLyogQUM5NyBjb2RlYyBpbml0aWFsaXNhdGlvbi4gKi8KK3N0YXRpYyBpbnQgX19kZXZpbml0Cit0cmlkZW50X2FjOTdfaW5pdChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCWludCBudW1fYWM5NyA9IDA7CisJdW5zaWduZWQgbG9uZyByZWFkeV8ybmQgPSAwOworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYzsKKwlpbnQgaSA9IDA7CisKKwkvKiBpbml0aWFsaXplIGNvbnRyb2xsZXIgc2lkZSBvZiBBQyBsaW5rLCBhbmQgZmluZCBvdXQgaWYgc2Vjb25kYXJ5IGNvZGVzCisJICAgcmVhbGx5IGV4aXN0ICovCisJc3dpdGNoIChjYXJkLT5wY2lfaWQpIHsKKwljYXNlIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTE6CisJCWlmIChhbGlfcmVzZXRfNTQ1MShjYXJkKSkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50X2FjOTdfaW5pdDogZXJyb3IgIgorCQkJICAgICAgICJyZXNldHRpbmcgNTQ1MS5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJCW91dGwoMHg4MDAwMDAwMSwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJCW91dGwoMHgwMDAwMDAwMCwgVFJJRF9SRUcoY2FyZCwgVDREX0FJTlRFTl9BKSk7CisJCW91dGwoMHhmZmZmZmZmZiwgVFJJRF9SRUcoY2FyZCwgVDREX0FJTlRfQSkpOworCQlvdXRsKDB4MDAwMDAwMDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NVVNJQ1ZPTF9XQVZFVk9MKSk7CisJCW91dGIoMHgxMCwgVFJJRF9SRUcoY2FyZCwgQUxJX01QVVIyKSk7CisJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBBTElfU0NUUkwpKTsKKwkJcmVhZHlfMm5kICY9IDB4M2ZmZjsKKwkJb3V0bChyZWFkeV8ybmQgfCBQQ01PVVQgfCAweDgwMDAsIFRSSURfUkVHKGNhcmQsIEFMSV9TQ1RSTCkpOworCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgQUxJX1NDVFJMKSk7CisJCXJlYWR5XzJuZCAmPSBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWTsKKwkJaWYgKGNhcmQtPnJldmlzaW9uIDwgQUxJXzU0NTFfVjAyKQorCQkJcmVhZHlfMm5kID0gMDsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1NJXzcwMTg6CisJCS8qIGRpc2FibGUgQUM5NyBHUElPIGludGVycnVwdCAqLworCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOworCQkvKiB3aGVuIHBvd2VyIHVwIHRoZSBBQyBsaW5rIGlzIGluIGNvbGQgcmVzZXQgbW9kZSBzbyBzdG9wIGl0ICovCisJCW91dGwoUENNT1VUIHwgU1VSUk9VVCB8IENFTlRFUk9VVCB8IExGRU9VVCB8IFNFQ09OREFSWV9JRCwgCisJCSAgICAgVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOworCQkvKiBpdCB0YWtlIGEgbG9uZyB0aW1lIHRvIHJlY292ZXIgZnJvbSBhIGNvbGQgcmVzZXQgKi8gCisJCS8qIChlc3BlY2lhbGx5IHdoZW4geW91IGhhdmUgbW9yZSB0aGFuIG9uZSBjb2RlYykgKi8KKwkJdWRlbGF5KDIwMDApOworCQlyZWFkeV8ybmQgPSBpbmwoVFJJRF9SRUcoY2FyZCwgU0lfU0VSSUFMX0lOVEZfQ1RSTCkpOworCQlyZWFkeV8ybmQgJj0gU0lfQUM5N19TRUNPTkRBUllfUkVBRFk7CisJCWJyZWFrOworCWNhc2UgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWDoKKwkJLyogcGxheWJhY2sgb24gKi8KKwkJb3V0bChEWF9BQzk3X1BMQVlCQUNLLCBUUklEX1JFRyhjYXJkLCBEWF9BQ1IyX0FDOTdfQ09NX1NUQVQpKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YOgorCQkvKiBlbmFibGUgQUM5NyBPdXRwdXQgU2xvdCAzLDQgKFBDTSBMZWZ0L1JpZ2h0IFBsYXliYWNrKSAqLworCQlvdXRsKE5YX0FDOTdfUENNX09VVFBVVCwgVFJJRF9SRUcoY2FyZCwgTlhfQUNSMF9BQzk3X0NPTV9TVEFUKSk7CisJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBOWF9BQ1IwX0FDOTdfQ09NX1NUQVQpKTsKKwkJcmVhZHlfMm5kICY9IE5YX0FDOTdfU0VDT05EQVJZX1JFQURZOworCQlicmVhazsKKwljYXNlIFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTA6CisJCS8qIGRpc2FibGUgQUM5NyBHUElPIGludGVycnVwdCAqLworCQlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFNJX0FDOTdfR1BJTykpOworCQkvKiB3aGVuIHBvd2VyIHVwLCB0aGUgQUMgbGluayBpcyBpbiBjb2xkIHJlc2V0IG1vZGUsIHNvIHN0b3AgaXQgKi8KKwkJb3V0bChQQ01PVVQgfCBTVVJST1VUIHwgQ0VOVEVST1VUIHwgTEZFT1VULCAKKwkJICAgICBUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CisJCS8qIGl0IHRha2UgYSBsb25nIHRpbWUgdG8gcmVjb3ZlciBmcm9tIGEgY29sZCByZXNldCAoZXNwZWNpYWxseSAqLyAKKwkJLyogd2hlbiB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIGNvZGVjKSAqLworCQl1ZGVsYXkoMjAwMCk7CisJCXJlYWR5XzJuZCA9IGlubChUUklEX1JFRyhjYXJkLCBTSV9TRVJJQUxfSU5URl9DVFJMKSk7CisJCXJlYWR5XzJuZCAmPSBTSV9BQzk3X1NFQ09OREFSWV9SRUFEWTsKKwkJYnJlYWs7CisJfQorCisJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgeworCQlpZiAoKGNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJLyogaW5pdGlhbGl6ZSBzb21lIGJhc2ljIGNvZGVjIGluZm9ybWF0aW9uLCBvdGhlciBmaWVsZHMgKi8gCisJCS8qIHdpbGwgYmUgZmlsbGVkIGluIGFjOTdfcHJvYmVfY29kZWMgKi8KKwkJY29kZWMtPnByaXZhdGVfZGF0YSA9IGNhcmQ7CisJCWNvZGVjLT5pZCA9IG51bV9hYzk3OworCisJCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgeworCQkJY29kZWMtPmNvZGVjX3JlYWQgPSBhbGlfYWM5N19yZWFkOworCQkJY29kZWMtPmNvZGVjX3dyaXRlID0gYWxpX2FjOTdfd3JpdGU7CisJCX0gZWxzZSB7CisJCQljb2RlYy0+Y29kZWNfcmVhZCA9IHRyaWRlbnRfYWM5N19nZXQ7CisJCQljb2RlYy0+Y29kZWNfd3JpdGUgPSB0cmlkZW50X2FjOTdfc2V0OworCQl9CisKKwkJaWYgKGFjOTdfcHJvYmVfY29kZWMoY29kZWMpID09IDApCisJCQlicmVhazsKKworCQljb2RlYy0+ZGV2X21peGVyID0gcmVnaXN0ZXJfc291bmRfbWl4ZXIoJnRyaWRlbnRfbWl4ZXJfZm9wcywgLTEpOworCQlpZiAoY29kZWMtPmRldl9taXhlciA8IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogY291bGRuJ3QgcmVnaXN0ZXIgbWl4ZXIhXG4iKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisJCQlicmVhazsKKwkJfQorCisJCWNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID0gY29kZWM7CisKKwkJLyogaWYgdGhlcmUgaXMgbm8gc2Vjb25kYXJ5IGNvZGVjIGF0IGFsbCwgZG9uJ3QgcHJvYmUgYW55IG1vcmUgKi8KKwkJaWYgKCFyZWFkeV8ybmQpCisJCQlicmVhazsKKwl9CisKKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKKwkJZm9yIChudW1fYWM5NyA9IDA7IG51bV9hYzk3IDwgTlJfQUM5NzsgbnVtX2FjOTcrKykgeworCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbbnVtX2FjOTddID09IE5VTEwpCisJCQkJYnJlYWs7CisJCQlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQkJCXUxNiByZWcgPSBhbGlfYWM5N19nZXQoY2FyZCwgbnVtX2FjOTcsIGkgKiAyKTsKKwkJCQljYXJkLT5taXhlcl9yZWdzW2ldW251bV9hYzk3XSA9IHJlZzsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gbnVtX2FjOTcgKyAxOworfQorCisvKiBHYW1lcG9ydCBmdW5jdGlvbnMgZm9yIHRoZSBjYXJkcyBBREMgZ2FtZXBvcnQgKi8KKworc3RhdGljIHVuc2lnbmVkIGNoYXIKK3RyaWRlbnRfZ2FtZV9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7CisJcmV0dXJuIGluYihUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9MRUcpKTsKK30KKworc3RhdGljIHZvaWQKK3RyaWRlbnRfZ2FtZV90cmlnZ2VyKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7CisJb3V0YigweGZmLCBUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9MRUcpKTsKK30KKworc3RhdGljIGludAordHJpZGVudF9nYW1lX2Nvb2tlZF9yZWFkKHN0cnVjdCBnYW1lcG9ydCAqZ2FtZXBvcnQsIGludCAqYXhlcywgaW50ICpidXR0b25zKQoreworCXN0cnVjdCB0cmlkZW50X2NhcmQgKmNhcmQgPSBnYW1lcG9ydC0+cG9ydF9kYXRhOworCWludCBpOworCisJKmJ1dHRvbnMgPSAofmluYihUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9MRUcpKSA+PiA0KSAmIDB4ZjsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJYXhlc1tpXSA9IGludyhUUklEX1JFRyhjYXJkLCBUNERfR0FNRV9BWEQpICsgaSAqIHNpemVvZiAodTE2KSk7CisJCWlmIChheGVzW2ldID09IDB4ZmZmZikKKwkJCWF4ZXNbaV0gPSAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAordHJpZGVudF9nYW1lX29wZW4oc3RydWN0IGdhbWVwb3J0ICpnYW1lcG9ydCwgaW50IG1vZGUpCit7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZCA9IGdhbWVwb3J0LT5wb3J0X2RhdGE7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEdBTUVQT1JUX01PREVfQ09PS0VEOgorCQlvdXRiKDB4ODAsIFRSSURfUkVHKGNhcmQsIFQ0RF9HQU1FX0NSKSk7CisJCW1zbGVlcCgyMCk7CisJCXJldHVybiAwOworCWNhc2UgR0FNRVBPUlRfTU9ERV9SQVc6CisJCW91dGIoMHgwMCwgVFJJRF9SRUcoY2FyZCwgVDREX0dBTUVfQ1IpKTsKKwkJcmV0dXJuIDA7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9fZGV2aW5pdAordHJpZGVudF9yZWdpc3Rlcl9nYW1lcG9ydChzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkKQoreworCXN0cnVjdCBnYW1lcG9ydCAqZ3A7CisKKwljYXJkLT5nYW1lcG9ydCA9IGdwID0gZ2FtZXBvcnRfYWxsb2NhdGVfcG9ydCgpOworCWlmICghZ3ApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjYW4gbm90IGFsbG9jYXRlIG1lbW9yeSBmb3IgZ2FtZXBvcnRcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlnYW1lcG9ydF9zZXRfbmFtZShncCwgIlRyaWRlbnQgNERXYXZlIik7CisJZ2FtZXBvcnRfc2V0X3BoeXMoZ3AsICJwY2klcy9nYW1lcG9ydDAiLCBwY2lfbmFtZShjYXJkLT5wY2lfZGV2KSk7CisJZ3AtPnJlYWQgPSB0cmlkZW50X2dhbWVfcmVhZDsKKwlncC0+dHJpZ2dlciA9IHRyaWRlbnRfZ2FtZV90cmlnZ2VyOworCWdwLT5jb29rZWRfcmVhZCA9IHRyaWRlbnRfZ2FtZV9jb29rZWRfcmVhZDsKKwlncC0+b3BlbiA9IHRyaWRlbnRfZ2FtZV9vcGVuOworCWdwLT5mdXp6ID0gNjQ7CisJZ3AtPnBvcnRfZGF0YSA9IGNhcmQ7CisKKwlnYW1lcG9ydF9yZWdpc3Rlcl9wb3J0KGdwKTsKKworCXJldHVybiAwOworfQorCisvKiBpbnN0YWxsIHRoZSBkcml2ZXIsIHdlIGRvIG5vdCBhbGxvY2F0ZSBoYXJkd2FyZSBjaGFubmVsIG5vciBETUEgYnVmZmVyICovIAorLyogbm93LCB0aGV5IGFyZSBkZWZlcmVkIHVudGlsICJBQ0NFU1MiIHRpbWUgKGluIHByb2dfZG1hYnVmIGNhbGxlZCBieSAqLyAKKy8qIG9wZW4vcmVhZC93cml0ZS9pb2N0bC9tbWFwKSAqLworc3RhdGljIGludCBfX2RldmluaXQKK3RyaWRlbnRfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBjaV9kZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICpwY2lfaWQpCit7CisJdW5zaWduZWQgbG9uZyBpb2Jhc2U7CisJc3RydWN0IHRyaWRlbnRfY2FyZCAqY2FyZDsKKwl1OCBiaXRzOworCXU4IHJldmlzaW9uOworCWludCBpID0gMDsKKwl1MTYgdGVtcDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX2Rldl9tMTUzMyA9IE5VTEw7CisJaW50IHJjID0gLUVOT0RFVjsKKwl1NjQgZG1hX21hc2s7CisKKwlpZiAocGNpX2VuYWJsZV9kZXZpY2UocGNpX2RldikpCisJCWdvdG8gb3V0OworCisJaWYgKHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKQorCQlkbWFfbWFzayA9IEFMSV9ETUFfTUFTSzsKKwllbHNlCisJCWRtYV9tYXNrID0gVFJJREVOVF9ETUFfTUFTSzsKKwlpZiAocGNpX3NldF9kbWFfbWFzayhwY2lfZGV2LCBkbWFfbWFzaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBhcmNoaXRlY3R1cmUgZG9lcyBub3Qgc3VwcG9ydCIgCisJCSAgICAgICAiICVzIFBDSSBidXNtYXN0ZXIgRE1BXG4iLCAKKwkJICAgICAgIHBjaV9kZXYtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxID8gCisJCSAgICAgICAiMzItYml0IiA6ICIzMC1iaXQiKTsKKwkJZ290byBvdXQ7CisJfQorCXBjaV9yZWFkX2NvbmZpZ19ieXRlKHBjaV9kZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJnJldmlzaW9uKTsKKworCWlmIChwY2lfaWQtPmRldmljZSA9PSBQQ0lfREVWSUNFX0lEX0lOVEVSR181MDUwKQorCQlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMSk7CisJZWxzZQorCQlpb2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGNpX2RldiwgMCk7CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvYmFzZSwgMjU2LCBjYXJkX25hbWVzW3BjaV9pZC0+ZHJpdmVyX2RhdGFdKSkgeworCQlwcmludGsoS0VSTl9FUlIgInRyaWRlbnQ6IGNhbid0IGFsbG9jYXRlIEkvTyBzcGFjZSBhdCAiCisJCSAgICAgICAiMHglNC40bHhcbiIsIGlvYmFzZSk7CisJCWdvdG8gb3V0OworCX0KKworCXJjID0gLUVOT01FTTsKKwlpZiAoKGNhcmQgPSBrbWFsbG9jKHNpemVvZigqY2FyZCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCXByaW50ayhLRVJOX0VSUiAidHJpZGVudDogb3V0IG9mIG1lbW9yeVxuIik7CisJCWdvdG8gb3V0X3JlbGVhc2VfcmVnaW9uOworCX0KKwltZW1zZXQoY2FyZCwgMCwgc2l6ZW9mICgqY2FyZCkpOworCisJaW5pdF90aW1lcigmY2FyZC0+dGltZXIpOworCWNhcmQtPmlvYmFzZSA9IGlvYmFzZTsKKwljYXJkLT5wY2lfZGV2ID0gcGNpX2RldjsKKwljYXJkLT5wY2lfaWQgPSBwY2lfaWQtPmRldmljZTsKKwljYXJkLT5yZXZpc2lvbiA9IHJldmlzaW9uOworCWNhcmQtPmlycSA9IHBjaV9kZXYtPmlycTsKKwljYXJkLT5uZXh0ID0gZGV2czsKKwljYXJkLT5tYWdpYyA9IFRSSURFTlRfQ0FSRF9NQUdJQzsKKwljYXJkLT5iYW5rc1tCQU5LX0FdLmFkZHJlc3NlcyA9ICZiYW5rX2FfYWRkcnM7CisJY2FyZC0+YmFua3NbQkFOS19BXS5iaXRtYXAgPSAwVUw7CisJY2FyZC0+YmFua3NbQkFOS19CXS5hZGRyZXNzZXMgPSAmYmFua19iX2FkZHJzOworCWNhcmQtPmJhbmtzW0JBTktfQl0uYml0bWFwID0gMFVMOworCisJaW5pdF9NVVRFWCgmY2FyZC0+b3Blbl9zZW0pOworCXNwaW5fbG9ja19pbml0KCZjYXJkLT5sb2NrKTsKKwlpbml0X3RpbWVyKCZjYXJkLT50aW1lcik7CisKKwlkZXZzID0gY2FyZDsKKworCXBjaV9zZXRfbWFzdGVyKHBjaV9kZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAidHJpZGVudDogJXMgZm91bmQgYXQgSU8gMHglMDRseCwgSVJRICVkXG4iLCAKKwkgICAgICAgY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZC0+aW9iYXNlLCBjYXJkLT5pcnEpOworCisJaWYgKGNhcmQtPnBjaV9pZCA9PSBQQ0lfREVWSUNFX0lEX0FMSV81NDUxKSB7CisJCS8qIEFMaSBjaGFubmVsIE1hbmFnZW1lbnQgKi8KKwkJY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBhbGlfYWxsb2NfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IGFsaV9hbGxvY19yZWNfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBhbGlfZnJlZV9wY21fY2hhbm5lbDsKKworCQljYXJkLT5hZGRyZXNzX2ludGVycnVwdCA9IGFsaV9hZGRyZXNzX2ludGVycnVwdDsKKworCQkvKiBBZGRlZCBieSBNYXR0IFd1IDAxLTA1LTIwMDEgZm9yIHNwZGlmIGluICovCisJCWNhcmQtPm11bHRpX2NoYW5uZWxfdXNlX2NvdW50ID0gMDsKKwkJY2FyZC0+cmVjX2NoYW5uZWxfdXNlX2NvdW50ID0gMDsKKworCQkvKiBBTGkgU1BESUYgT1VUIGZ1bmN0aW9uICovCisJCWlmIChjYXJkLT5yZXZpc2lvbiA9PSBBTElfNTQ1MV9WMDIpIHsKKwkJCWFsaV9zZXR1cF9zcGRpZl9vdXQoY2FyZCwgQUxJX1BDTV9UT19TUERJRl9PVVQpOworCQkJcmVzID0gY3JlYXRlX3Byb2NfZW50cnkoIkFMaTU0NTEiLCAwLCBOVUxMKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlyZXMtPndyaXRlX3Byb2MgPSBhbGlfd3JpdGVfcHJvYzsKKwkJCQlyZXMtPmRhdGEgPSBjYXJkOworCQkJfQorCQl9CisKKwkJLyogQWRkIEgvVyBWb2x1bWUgQ29udHJvbCBCeSBNYXR0IFd1IEp1bC4gMDYsIDIwMDEgKi8KKwkJY2FyZC0+aHd2b2xjdGwgPSAwOworCQlwY2lfZGV2X20xNTMzID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfQUwsIAorCQkJCQkJUENJX0RFVklDRV9JRF9BTF9NMTUzMywgCisJCQkJCQlwY2lfZGV2X20xNTMzKTsKKwkJcmMgPSAtRU5PREVWOworCQlpZiAocGNpX2Rldl9tMTUzMyA9PSBOVUxMKQorCQkJZ290byBvdXRfcHJvY19mczsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpX2Rldl9tMTUzMywgMHg2MywgJmJpdHMpOworCQlpZiAoYml0cyAmICgxIDw8IDUpKQorCQkJY2FyZC0+aHd2b2xjdGwgPSAxOworCQlpZiAoY2FyZC0+aHd2b2xjdGwpIHsKKwkJCS8qIENsZWFyIG0xNTMzIHBjaSBjZmcgNzhoIGJpdCAzMCB0byB6ZXJvLCB3aGljaCBtYWtlcworCQkJICAgR1BJTzExLzEyLzEzIHdvcmsgYXMgQUNHUF9VUC9ET1dOL01VVEUuICovCisJCQlwY2lfcmVhZF9jb25maWdfYnl0ZShwY2lfZGV2X20xNTMzLCAweDdiLCAmYml0cyk7CisJCQliaXRzICY9IDB4YmY7CS8qY2xlYXIgYml0IDYgKi8KKwkJCXBjaV93cml0ZV9jb25maWdfYnl0ZShwY2lfZGV2X20xNTMzLCAweDdiLCBiaXRzKTsKKwkJfQorCX0gZWxzZSBpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfSU5URVJHXzUwNTApIHsKKwkJY2FyZC0+YWxsb2NfcGNtX2NoYW5uZWwgPSBjeWJlcl9hbGxvY19wY21fY2hhbm5lbDsKKwkJY2FyZC0+YWxsb2NfcmVjX3BjbV9jaGFubmVsID0gY3liZXJfYWxsb2NfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSBjeWJlcl9mcmVlX3BjbV9jaGFubmVsOworCQljYXJkLT5hZGRyZXNzX2ludGVycnVwdCA9IGN5YmVyX2FkZHJlc3NfaW50ZXJydXB0OworCQljeWJlcl9pbml0X3JpdHVhbChjYXJkKTsKKwl9IGVsc2UgeworCQljYXJkLT5hbGxvY19wY21fY2hhbm5lbCA9IHRyaWRlbnRfYWxsb2NfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmFsbG9jX3JlY19wY21fY2hhbm5lbCA9IHRyaWRlbnRfYWxsb2NfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmZyZWVfcGNtX2NoYW5uZWwgPSB0cmlkZW50X2ZyZWVfcGNtX2NoYW5uZWw7CisJCWNhcmQtPmFkZHJlc3NfaW50ZXJydXB0ID0gdHJpZGVudF9hZGRyZXNzX2ludGVycnVwdDsKKwl9CisKKwkvKiBjbGFpbSBvdXIgaXJxICovCisJcmMgPSAtRU5PREVWOworCWlmIChyZXF1ZXN0X2lycShjYXJkLT5pcnEsICZ0cmlkZW50X2ludGVycnVwdCwgU0FfU0hJUlEsIAorCQkJY2FyZF9uYW1lc1twY2lfaWQtPmRyaXZlcl9kYXRhXSwgY2FyZCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiB1bmFibGUgdG8gYWxsb2NhdGUgaXJxICVkXG4iLCAKKwkJICAgICAgIGNhcmQtPmlycSk7CisJCWdvdG8gb3V0X3Byb2NfZnM7CisJfQorCS8qIHJlZ2lzdGVyIC9kZXYvZHNwICovCisJaWYgKChjYXJkLT5kZXZfYXVkaW8gPSByZWdpc3Rlcl9zb3VuZF9kc3AoJnRyaWRlbnRfYXVkaW9fZm9wcywgLTEpKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ0cmlkZW50OiBjb3VsZG4ndCByZWdpc3RlciBEU1AgZGV2aWNlIVxuIik7CisJCWdvdG8gb3V0X2ZyZWVfaXJxOworCX0KKwljYXJkLT5taXhlcl9yZWdzX3JlYWR5ID0gMDsKKwkvKiBpbml0aWFsaXplIEFDOTcgY29kZWMgYW5kIHJlZ2lzdGVyIC9kZXYvbWl4ZXIgKi8KKwlpZiAodHJpZGVudF9hYzk3X2luaXQoY2FyZCkgPD0gMCkgeworCQkvKiB1bnJlZ2lzdGVyIGF1ZGlvIGRldmljZXMgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykgeworCQkJaWYgKGNhcmQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCkgeworCQkJCXN0cnVjdCBhYzk3X2NvZGVjKiBjb2RlYyA9IGNhcmQtPmFjOTdfY29kZWNbaV07CisJCQkJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjb2RlYy0+ZGV2X21peGVyKTsKKwkJCQlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMpOworCQkJfQorCQl9CisJCWdvdG8gb3V0X3VucmVnaXN0ZXJfc291bmRfZHNwOworCX0KKwljYXJkLT5taXhlcl9yZWdzX3JlYWR5ID0gMTsKKwlvdXRsKDB4MDAsIFRSSURfUkVHKGNhcmQsIFQ0RF9NVVNJQ1ZPTF9XQVZFVk9MKSk7CisKKwlpZiAoY2FyZC0+cGNpX2lkID09IFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEpIHsKKwkJLyogQWRkIEgvVyBWb2x1bWUgQ29udHJvbCBCeSBNYXR0IFd1IEp1bC4gMDYsIDIwMDEgKi8KKwkJaWYgKGNhcmQtPmh3dm9sY3RsKSB7CisJCQkvKiBFbmFibGUgR1BJTyBJUlEgKE1JU0NJTlQgYml0IDE4aCkgKi8KKwkJCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7CisJCQl0ZW1wIHw9IDB4MDAwNDsKKwkJCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgVDREX01JU0NJTlQgKyAyKSk7CisKKwkJCS8qIEVuYWJsZSBIL1cgVm9sdW1lIENvbnRyb2wgR0xPVkFMIENPTlRST0wgYml0IDAgKi8KKwkJCXRlbXAgPSBpbncoVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisJCQl0ZW1wIHw9IDB4MDAwMTsKKwkJCW91dHcodGVtcCwgVFJJRF9SRUcoY2FyZCwgQUxJX0dMT0JBTF9DT05UUk9MKSk7CisKKwkJfQorCQlpZiAoY2FyZC0+cmV2aXNpb24gPT0gQUxJXzU0NTFfVjAyKQorCQkJYWxpX2Nsb3NlX211bHRpX2NoYW5uZWxzKCk7CisJCS8qIGVkaXRlZCBieSBITVNFTyBmb3IgR1Qgc291bmQgKi8KKyNpZiBkZWZpbmVkKENPTkZJR19BTFBIQV9OQVVUSUxVUykgfHwgZGVmaW5lZChDT05GSUdfQUxQSEFfR0VORVJJQykKKwkJeworCQkJdTE2IGFjOTdfZGF0YTsKKwkJCWV4dGVybiBzdHJ1Y3QgaHdycGJfc3RydWN0ICpod3JwYjsKKworCQkJaWYgKChod3JwYi0+c3lzX3R5cGUpID09IDIwMSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gInRyaWRlbnQ6IFJ1bm5pbmcgb24gQWxwaGEgc3lzdGVtICIKKwkJCQkgICAgICAgInR5cGUgTmF1dGlsdXNcbiIpOworCQkJCWFjOTdfZGF0YSA9IGFsaV9hYzk3X2dldChjYXJkLCAwLCBBQzk3X1BPV0VSX0NPTlRST0wpOworCQkJCWFsaV9hYzk3X3NldChjYXJkLCAwLCBBQzk3X1BPV0VSX0NPTlRST0wsIAorCQkJCQkgICAgIGFjOTdfZGF0YSB8IEFMSV9FQVBEX1BPV0VSX0RPV04pOworCQkJfQorCQl9CisjZW5kaWYJCQkJLyogQ09ORklHX0FMUEhBX05BVVRJTFVTIHx8IENPTkZJR19BTFBIQV9HRU5FUklDICovCisJCS8qIGVkaXRlZCBieSBITVNFTyBmb3IgR1Qgc291bmQgKi8KKwl9CisJcmMgPSAwOworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBjYXJkKTsKKworCS8qIEVuYWJsZSBBZGRyZXNzIEVuZ2luZSBJbnRlcnJ1cHRzICovCisJdHJpZGVudF9lbmFibGVfbG9vcF9pbnRlcnJ1cHRzKGNhcmQpOworCisJLyogUmVnaXN0ZXIgZ2FtZXBvcnQgKi8KKwl0cmlkZW50X3JlZ2lzdGVyX2dhbWVwb3J0KGNhcmQpOworCitvdXQ6CisJcmV0dXJuIHJjOworCitvdXRfdW5yZWdpc3Rlcl9zb3VuZF9kc3A6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoY2FyZC0+ZGV2X2F1ZGlvKTsKK291dF9mcmVlX2lycToKKwlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworb3V0X3Byb2NfZnM6CisJaWYgKHJlcykgeworCQlyZW1vdmVfcHJvY19lbnRyeSgiQUxpNTQ1MSIsIE5VTEwpOworCQlyZXMgPSBOVUxMOworCX0KKwlrZnJlZShjYXJkKTsKKwlkZXZzID0gTlVMTDsKK291dF9yZWxlYXNlX3JlZ2lvbjoKKwlyZWxlYXNlX3JlZ2lvbihpb2Jhc2UsIDI1Nik7CisJcmV0dXJuIHJjOyAKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0Cit0cmlkZW50X3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGNpX2RldikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgdHJpZGVudF9jYXJkICpjYXJkID0gcGNpX2dldF9kcnZkYXRhKHBjaV9kZXYpOworCisJLyoKKwkgKiAgICAgIEtpbGwgcnVubmluZyB0aW1lcnMgYmVmb3JlIHVubG9hZC4gV2UgY2FuJ3QgaGF2ZSB0aGVtCisJICogICAgICBnb2luZyBvZmYgYWZ0ZXIgcm1tb2QhCisJICovCisJaWYgKGNhcmQtPmh3dm9sY3RsKQorCQlkZWxfdGltZXJfc3luYygmY2FyZC0+dGltZXIpOworCisJLyogQUxpIFMvUERJRiBhbmQgUG93ZXIgTWFuYWdlbWVudCAqLworCWlmIChjYXJkLT5wY2lfaWQgPT0gUENJX0RFVklDRV9JRF9BTElfNTQ1MSkgeworCQlhbGlfc2V0dXBfc3BkaWZfb3V0KGNhcmQsIEFMSV9QQ01fVE9fU1BESUZfT1VUKTsKKwkJYWxpX2Rpc2FibGVfc3BlY2lhbF9jaGFubmVsKGNhcmQsIEFMSV9TUERJRl9PVVRfQ0hBTk5FTCk7CisJCWFsaV9kaXNhYmxlX3NwZGlmX2luKGNhcmQpOworCQlyZW1vdmVfcHJvY19lbnRyeSgiQUxpNTQ1MSIsIE5VTEwpOworCX0KKworCS8qIFVucmVnaXN0ZXIgZ2FtZXBvcnQgKi8KKwlpZiAoY2FyZC0+Z2FtZXBvcnQpCisJCWdhbWVwb3J0X3VucmVnaXN0ZXJfcG9ydChjYXJkLT5nYW1lcG9ydCk7CisKKwkvKiBLaWxsIGludGVycnVwdHMsIGFuZCBTUC9ESUYgKi8KKwl0cmlkZW50X2Rpc2FibGVfbG9vcF9pbnRlcnJ1cHRzKGNhcmQpOworCisJLyogZnJlZSBoYXJkd2FyZSByZXNvdXJjZXMgKi8KKwlmcmVlX2lycShjYXJkLT5pcnEsIGNhcmQpOworCXJlbGVhc2VfcmVnaW9uKGNhcmQtPmlvYmFzZSwgMjU2KTsKKworCS8qIHVucmVnaXN0ZXIgYXVkaW8gZGV2aWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBOUl9BQzk3OyBpKyspCisJCWlmIChjYXJkLT5hYzk3X2NvZGVjW2ldICE9IE5VTEwpIHsKKwkJCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIoY2FyZC0+YWM5N19jb2RlY1tpXS0+ZGV2X21peGVyKTsKKwkJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3X2NvZGVjW2ldKTsKKwkJfQorCXVucmVnaXN0ZXJfc291bmRfZHNwKGNhcmQtPmRldl9hdWRpbyk7CisKKwlrZnJlZShjYXJkKTsKKworCXBjaV9zZXRfZHJ2ZGF0YShwY2lfZGV2LCBOVUxMKTsKK30KKworTU9EVUxFX0FVVEhPUigiQWxhbiBDb3gsIEFhcm9uIEhvbHR6bWFuLCBPbGxpZSBMaG8sIENoaW5nIExpbmcgTGVlLCBNdWxpIEJlbi1ZZWh1ZGEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiVHJpZGVudCA0RFdhdmUvU2lTIDcwMTgvQUxpIDU0NTEgYW5kIFR2aWEvSUdTVCBDeWJlclBybzUwNTAgUENJICIKKwkJICAgIkF1ZGlvIERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCisjZGVmaW5lIFRSSURFTlRfTU9EVUxFX05BTUUgInRyaWRlbnQiCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB0cmlkZW50X3BjaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBUUklERU5UX01PRFVMRV9OQU1FLAorCS5pZF90YWJsZSA9IHRyaWRlbnRfcGNpX3RibCwKKwkucHJvYmUgPSB0cmlkZW50X3Byb2JlLAorCS5yZW1vdmUgPSBfX2RldmV4aXRfcCh0cmlkZW50X3JlbW92ZSksCisJLnN1c3BlbmQgPSB0cmlkZW50X3N1c3BlbmQsCisJLnJlc3VtZSA9IHRyaWRlbnRfcmVzdW1lCit9OworCitzdGF0aWMgaW50IF9faW5pdAordHJpZGVudF9pbml0X21vZHVsZSh2b2lkKQoreworCXByaW50ayhLRVJOX0lORk8gIlRyaWRlbnQgNERXYXZlL1NpUyA3MDE4L0FMaSA1NDUxLFR2aWEgQ3liZXJQcm8gIiAKKwkgICAgICAgIjUwNTAgUENJIEF1ZGlvLCB2ZXJzaW9uICIgRFJJVkVSX1ZFUlNJT04gIiwgIiBfX1RJTUVfXyAiICIgCisJICAgICAgIF9fREFURV9fICJcbiIpOworCisJcmV0dXJuIHBjaV9yZWdpc3Rlcl9kcml2ZXIoJnRyaWRlbnRfcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdAordHJpZGVudF9jbGVhbnVwX21vZHVsZSh2b2lkKQoreworCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmdHJpZGVudF9wY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQodHJpZGVudF9pbml0X21vZHVsZSk7Cittb2R1bGVfZXhpdCh0cmlkZW50X2NsZWFudXBfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy90cmlkZW50LmggYi9zb3VuZC9vc3MvdHJpZGVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTNiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvdHJpZGVudC5oCkBAIC0wLDAgKzEsMzU4IEBACisjaWZuZGVmIF9fVFJJRDREV0FWRV9ICisjZGVmaW5lIF9fVFJJRDREV0FWRV9ICisKKy8qCisgKiAgYXVkaW9AdHJpZGVudG1pY3JvLmNvbQorICogIEZyaSBGZWIgMTkgMTU6NTU6MjggTVNUIDE5OTkKKyAqICBEZWZpbml0aW9ucyBmb3IgVHJpZGVudCA0RFdhdmUgRFgvTlggY2hpcHMKKyAqCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICoKKyAqLworCisvKiBQQ0kgdmVuZG9yIGFuZCBkZXZpY2UgSUQgKi8gCisjaWZuZGVmIFBDSV9WRU5ET1JfSURfVFJJREVOVAorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1RSSURFTlQJCTB4MTAyMworI2VuZGlmCisKKyNpZm5kZWYgUENJX1ZFTkRPUl9JRF9TSQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX1NJCQkJMHgxMDM5CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfVkVORE9SX0lEX0FMSQorI2RlZmluZSBQQ0lfVkVORE9SX0lEX0FMSQkJCTB4MTBiOQorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9EWAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX0RYCTB4MjAwMAorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9UUklERU5UXzREV0FWRV9OWAorI2RlZmluZSBQQ0lfREVWSUNFX0lEX1RSSURFTlRfNERXQVZFX05YCTB4MjAwMQorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9TSV83MDE4CisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfU0lfNzAxOAkJMHg3MDE4CisjZW5kaWYKKworI2lmbmRlZiBQQ0lfREVWSUNFX0lEX0FMSV81NDUxCisjZGVmaW5lIFBDSV9ERVZJQ0VfSURfQUxJXzU0NTEJCTB4NTQ1MQorI2VuZGlmCisKKyNpZm5kZWYgUENJX0RFVklDRV9JRF9BTElfMTUzMworI2RlZmluZSBQQ0lfREVWSUNFX0lEX0FMSV8xNTMzCQkweDE1MzMKKyNlbmRpZgorCisjZGVmaW5lIENIQU5ORUxfUkVHUwk1CisjZGVmaW5lIENIQU5ORUxfU1RBUlQJMHhlMCAgIC8vIFRoZSBmaXJzdCBieXRlcyBvZiB0aGUgY29udGlndW91cyByZWdpc3RlciBzcGFjZS4KKworI2RlZmluZSBCQU5LX0EgCQkwCisjZGVmaW5lIEJBTktfQiAJCTEKKyNkZWZpbmUgTlJfQkFOS1MJCTIKKworI2RlZmluZSBUUklERU5UX0ZNVF9TVEVSRU8gICAgIDB4MDEKKyNkZWZpbmUgVFJJREVOVF9GTVRfMTZCSVQgICAgICAweDAyCisjZGVmaW5lIFRSSURFTlRfRk1UX01BU0sgICAgICAgMHgwMworCisjZGVmaW5lIERBQ19SVU5OSU5HCTB4MDEKKyNkZWZpbmUgQURDX1JVTk5JTkcJMHgwMgorCisvKiBSZWdpc3RlciBBZGRyZXNzZXMgKi8KKworLyogb3BlcmF0aW9uYWwgcmVnaXN0ZXJzIGNvbW1vbiB0byBEWCwgTlgsIDcwMTggKi8KK2VudW0gdHJpZGVudF9vcF9yZWdpc3RlcnMgeworCVQ0RF9HQU1FX0NSCT0gMHgzMCwgVDREX0dBTUVfTEVHCT0gMHgzMSwKKwlUNERfR0FNRV9BWEQJPSAweDM0LAorCVQ0RF9SRUNfQ0gJPSAweDcwLAorCVQ0RF9TVEFSVF9BICAgICA9IDB4ODAsIFQ0RF9TVE9QX0EgICAgICA9IDB4ODQsCisJVDREX0RMWV9BICAgICAgID0gMHg4OCwgVDREX1NJR05fQ1NPX0EgID0gMHg4YywKKwlUNERfQ1NQRl9BICAgICAgPSAweDkwLCBUNERfQ0VCQ19BICAgICAgPSAweDk0LAorCVQ0RF9BSU5UX0EgICAgICA9IDB4OTgsIFQ0RF9FSU5UX0EJPSAweDljLAorCVQ0RF9MRk9fR0NfQ0lSCT0gMHhhMCwgVDREX0FJTlRFTl9BICAgID0gMHhhNCwKKwlUNERfTVVTSUNWT0xfV0FWRVZPTCA9IDB4YTgsIFQ0RF9TQkRFTFRBX0RFTFRBX1IgPSAweGFjLAorCVQ0RF9NSVNDSU5UCT0gMHhiMCwgVDREX1NUQVJUX0IgICAgID0gMHhiNCwKKwlUNERfU1RPUF9CICAgICAgPSAweGI4LCBUNERfQ1NQRl9CCT0gMHhiYywKKwlUNERfU0JCTF9TQkNMCT0gMHhjMCwgVDREX1NCQ1RSTF9TQkUyUl9TQkREICAgID0gMHhjNCwKKwlUNERfU1RJTUVSCT0gMHhjOCwgVDREX0xGT19CX0kyU19ERUxUQSAgICAgID0gMHhjYywKKwlUNERfQUlOVF9CCT0gMHhkOCwgVDREX0FJTlRFTl9CCT0gMHhkYywKKwlBTElfTVBVUjIJPSAweDIyLAlBTElfR1BJTwk9IDB4N2MsCisJQUxJX0VCVUYxID0gMHhmNCwKKwlBTElfRUJVRjIgPSAweGY4Cit9OworCitlbnVtIGFsaV9vcF9yZWdpc3RlcnMgeworCUFMSV9TQ1RSTAkJPSAweDQ4LAorCUFMSV9HTE9CQUxfQ09OVFJPTAk9IDB4ZDQsCisJQUxJX1NUSU1FUgkJPSAweGM4LAorCUFMSV9TUERJRl9DUwkJPSAweDcwLAorCUFMSV9TUERJRl9DVFJMCQk9IDB4NzQKK307CisKK2VudW0gYWxpX3JlZ2lzdGVyc19udW1iZXIgeworCUFMSV9HTE9CQUxfUkVHUwkJPSA1NiwKKwlBTElfQ0hBTk5FTF9SRUdTCT0gOCwKKwlBTElfTUlYRVJfUkVHUwkJPSAyMAorfTsKKworZW51bSBhbGlfc2N0cmxfY29udHJvbF9iaXQgeworCUFMSV9TUERJRl9PVVRfRU5BQkxFCT0gMHgyMAorfTsKKworZW51bSBhbGlfZ2xvYmFsX2NvbnRyb2xfYml0IHsKKwlBTElfU1BESUZfT1VUX1NFTF9QQ00JPSAweDAwMDAwNDAwLAorCUFMSV9TUERJRl9JTl9TVVBQT1JUCT0gMHgwMDAwMDgwMCwKKwlBTElfU1BESUZfT1VUX0NIX0VOQUJMRQk9IDB4MDAwMDgwMDAsCisJQUxJX1NQRElGX0lOX0NIX0VOQUJMRQk9IDB4MDAwODAwMDAsCisJQUxJX1BDTV9JTl9ESVNBQkxFCT0gMHg3ZmZmZmZmZiwKKwlBTElfUENNX0lOX0VOQUJMRQk9IDB4ODAwMDAwMDAsCisJQUxJX1NQRElGX0lOX0NIX0RJU0FCTEUJPSAweGZmZjdmZmZmLAorCUFMSV9TUERJRl9PVVRfQ0hfRElTQUJMRSA9IDB4ZmZmZjdmZmYsCisJQUxJX1NQRElGX09VVF9TRUxfU1BESUYJPSAweGZmZmZmYmZmCisJCit9OworCitlbnVtIGFsaV9zcGRpZl9jb250cm9sX2JpdCB7CisJQUxJX1NQRElGX0lOX0ZVTkNfRU5BQkxFCT0gMHgwMiwKKwlBTElfU1BESUZfSU5fQ0hfU1RBVFVTCQk9IDB4NDAsCisJQUxJX1NQRElGX09VVF9DSF9TVEFUVVMJCT0gMHhiZgorCQorfTsKKworZW51bSBhbGlfY29udHJvbF9hbGwgeworCUFMSV9ESVNBQkxFX0FMTF9JUlEJPSAwLAorCUFMSV9DSEFOTkVMUwkJPSAzMiwKKwlBTElfU1RPUF9BTExfQ0hBTk5FTFMJPSAweGZmZmZmZmZmLAorCUFMSV9NVUxUSV9DSEFOTkVMU19TVEFSVF9TVE9QCT0gMHgwNzgwMDAwMAorfTsKKworZW51bSBhbGlfRU1PRF9jb250cm9sX2JpdCB7CisJQUxJX0VNT0RfREVDCT0gMHgwMDAwMDAwMCwKKwlBTElfRU1PRF9JTkMJPSAweDEwMDAwMDAwLAorCUFMSV9FTU9EX0RlbGF5CT0gMHgyMDAwMDAwMCwKKwlBTElfRU1PRF9TdGlsbAk9IDB4MzAwMDAwMDAKK307CisKK2VudW0gYWxpX3BjbV9pbl9jaGFubmVsX251bSB7CisJQUxJX05PUk1BTF9DSEFOTkVMCT0gMCwKKwlBTElfU1BESUZfT1VUX0NIQU5ORUwJPSAxNSwKKwlBTElfU1BESUZfSU5fQ0hBTk5FTCAgICA9IDE5LAorCUFMSV9MRUZfQ0hBTk5FTAkJPSAyMywKKwlBTElfQ0VOVEVSX0NIQU5ORUwJPSAyNCwKKwlBTElfU1VSUl9SSUdIVF9DSEFOTkVMCT0gMjUsCisJQUxJX1NVUlJfTEVGVF9DSEFOTkVMCT0gMjYsCisJQUxJX1BDTV9JTl9DSEFOTkVMCT0gMzEKK307CisKK2VudW0gYWxpX3BjbV9vdXRfY2hhbm5lbF9udW0geworCUFMSV9QQ01fT1VUX0NIQU5ORUxfRklSU1QgPSAwLAorCUFMSV9QQ01fT1VUX0NIQU5ORUxfTEFTVCA9IDMxCit9OworCitlbnVtIGFsaV9hYzk3X3Bvd2VyX2NvbnRyb2xfYml0IHsKKwlBTElfRUFQRF9QT1dFUl9ET1dOCT0gMHg4MDAwCit9OworCitlbnVtIGFsaV91cGRhdGVfcHRyX2ZsYWdzIHsKKwlBTElfQUREUkVTU19JTlRfVVBEQVRFCT0gMHgwMQorfTsKKworZW51bSBhbGlfcmV2aXNpb24geworCUFMSV81NDUxX1YwMgk9IDB4MDIKK307CisKK2VudW0gYWxpX3NwZGlmX291dF9jb250cm9sIHsKKwlBTElfUENNX1RPX1NQRElGX09VVAkJPSAwLAorCUFMSV9TUERJRl9PVVRfVE9fU1BESUZfT1VUCT0gMSwKKwlBTElfU1BESUZfT1VUX1BDTQkJPSAwLAorCUFMSV9TUERJRl9PVVRfTk9OX1BDTQkJPSAyCit9OworCisvKiBTL1BESUYgT3BlcmF0aW9uYWwgUmVnaXN0ZXJzIGZvciA0RC1OWCAqLworZW51bSBueF9zcGRpZl9yZWdpc3RlcnMgeworCU5YX1NQQ1RSTF9TUENTTwk9IDB4MjQsIE5YX1NQTEJBID0gMHgyOCwKKwlOWF9TUEVTTwk9IDB4MmMsIE5YX1NQQ1NUQVRVUyA9IDB4NjQKK307CisKKy8qIE9QIHJlZ2lzdGVycyB0byBhY2Nlc3MgZWFjaCBoYXJkd2FyZSBjaGFubmVsICovCitlbnVtIGNoYW5uZWxfcmVnaXN0ZXJzIHsKKwlDSF9EWF9DU09fQUxQSEFfRk1TID0gMHhlMCwgQ0hfRFhfRVNPX0RFTFRBID0gMHhlOCwKKwlDSF9EWF9GTUNfUlZPTF9DVk9MID0gMHhlYywKKwlDSF9OWF9ERUxUQV9DU08gICAgID0gMHhlMCwgQ0hfTlhfREVMVEFfRVNPID0gMHhlOCwKKwlDSF9OWF9BTFBIQV9GTVNfRk1DX1JWT0xfQ1ZPTCA9IDB4ZWMsCisJQ0hfTEJBICAgICAgICAgICAgICA9IDB4ZTQsCisJQ0hfR1ZTRUxfUEFOX1ZPTF9DVFJMX0VDICAgICAgPSAweGYwCit9OworCisvKiByZWdpc3RlcnMgdG8gcmVhZC93cml0ZS9jb250cm9sIEFDOTcgY29kZWMgKi8KK2VudW0gZHhfYWM5N19yZWdpc3RlcnMgeworCURYX0FDUjBfQUM5N19XICAgICAgICA9IDB4NDAsIERYX0FDUjFfQUM5N19SID0gMHg0NCwKKwlEWF9BQ1IyX0FDOTdfQ09NX1NUQVQgPSAweDQ4Cit9OworCitlbnVtIG54X2FjOTdfcmVnaXN0ZXJzIHsKKwlOWF9BQ1IwX0FDOTdfQ09NX1NUQVQgID0gMHg0MCwgTlhfQUNSMV9BQzk3X1cgICAgICAgICAgID0gMHg0NCwKKwlOWF9BQ1IyX0FDOTdfUl9QUklNQVJZID0gMHg0OCwgTlhfQUNSM19BQzk3X1JfU0VDT05EQVJZCT0gMHg0YworfTsKKworZW51bSBzaV9hYzk3X3JlZ2lzdGVycyB7CisJU0lfQUM5N19XUklURSAgICAgICA9IDB4NDAsIFNJX0FDOTdfUkVBRCA9IDB4NDQsCisJU0lfU0VSSUFMX0lOVEZfQ1RSTCA9IDB4NDgsIFNJX0FDOTdfR1BJTyA9IDB4NGMKK307CisKK2VudW0gYWxpX2FjOTdfcmVnaXN0ZXJzIHsKKwlBTElfQUM5N19XUklURSAgICAgICA9IDB4NDAsIEFMSV9BQzk3X1JFQUQgPSAweDQ0Cit9OworCisvKiBCaXQgbWFzayBmb3Igb3BlcmF0aW9uYWwgcmVnaXN0ZXJzICovCisjZGVmaW5lIEFDOTdfUkVHX0FERFIgICAgICAweDAwMDAwMGZmCisKK2VudW0gYWxpX2FjOTdfYml0cyB7CisJQUxJX0FDOTdfQlVTWV9XUklURSA9IDB4ODAwMCwgQUxJX0FDOTdfQlVTWV9SRUFEID0gMHg4MDAwLAorCUFMSV9BQzk3X1dSSVRFX0FDVElPTiA9IDB4ODAwMCwgQUxJX0FDOTdfUkVBRF9BQ1RJT04gPSAweDgwMDAsCisJQUxJX0FDOTdfQVVESU9fQlVTWSA9IDB4NDAwMCwgQUxJX0FDOTdfU0VDT05EQVJZICA9IDB4MDA4MCwKKwlBTElfQUM5N19SRUFEX01JWEVSX1JFR0lTVEVSID0gMHhmZWZmLAorCUFMSV9BQzk3X1dSSVRFX01JWEVSX1JFR0lTVEVSID0gMHgwMTAwCit9OworCitlbnVtIHNpczcwMThfYWM5N19iaXRzIHsKKwlTSV9BQzk3X0JVU1lfV1JJVEUgPSAweDgwMDAsIFNJX0FDOTdfQlVTWV9SRUFEID0gMHg4MDAwLAorCVNJX0FDOTdfQVVESU9fQlVTWSA9IDB4NDAwMCwgU0lfQUM5N19NT0RFTV9CVVNZID0gMHgyMDAwLAorCVNJX0FDOTdfU0VDT05EQVJZICA9IDB4MDA4MAorfTsKKworZW51bSB0cmlkZW50X2R4X2FjOTdfYml0cyB7CisJRFhfQUM5N19CVVNZX1dSSVRFID0gMHg4MDAwLCBEWF9BQzk3X0JVU1lfUkVBRCA9IDB4ODAwMCwKKwlEWF9BQzk3X1JFQURZICAgICAgPSAweDAwMTAsIERYX0FDOTdfUkVDT1JEICAgID0gMHgwMDA4LAorCURYX0FDOTdfUExBWUJBQ0sgICA9IDB4MDAwMgorfTsKKworZW51bSB0cmlkZW50X254X2FjOTdfYml0cyB7CisJLyogQUNSMS0zICovCisJTlhfQUM5N19CVVNZX1dSSVRFID0gMHgwODAwLCBOWF9BQzk3X0JVU1lfUkVBRCA9IDB4MDgwMCwKKwlOWF9BQzk3X0JVU1lfREFUQSAgPSAweDA0MDAsIE5YX0FDOTdfV1JJVEVfU0VDT05EQVJZID0gMHgwMTAwLAorCS8qIEFDUjAgKi8KKwlOWF9BQzk3X1NFQ09OREFSWV9SRUFEWSA9IDB4MDA0MCwgTlhfQUM5N19TRUNPTkRBUllfUkVDT1JEID0gMHgwMDIwLAorCU5YX0FDOTdfU1VSUk9VTkRfT1VUUFVUID0gMHgwMDEwLAorCU5YX0FDOTdfUFJJTUFSWV9SRUFEWSAgID0gMHgwMDA4LCBOWF9BQzk3X1BSSU1BUllfUkVDT1JEICAgPSAweDAwMDQsCisJTlhfQUM5N19QQ01fT1VUUFVUICAgICAgPSAweDAwMDIsCisJTlhfQUM5N19XQVJNX1JFU0VUICAgICAgPSAweDAwMDEKK307CisKK2VudW0gc2VyaWFsX2ludGZfY3RybF9iaXRzIHsKKwlXQVJNX1JFU1QgICA9IDB4MDAwMDAwMDEsIENPTERfUkVTRVQgID0gMHgwMDAwMDAwMiwKKwlJMlNfQ0xPQ0sgICA9IDB4MDAwMDAwMDQsIFBDTV9TRUNfQUM5Nz0gMHgwMDAwMDAwOCwKKwlBQzk3X0RCTF9SQVRFID0gMHgwMDAwMDAxMCwgU1BESUZfRU4gID0gMHgwMDAwMDAyMCwKKwlJMlNfT1VUUFVUX0VOID0gMHgwMDAwMDA0MCwgSTJTX0lOUFVUX0VOID0gMHgwMDAwMDA4MCwKKwlQQ01JTiAgICAgICA9IDB4MDAwMDAxMDAsIExJTkUxSU4gICAgID0gMHgwMDAwMDIwMCwKKwlNSUNJTiAgICAgICA9IDB4MDAwMDA0MDAsIExJTkUySU4gICAgID0gMHgwMDAwMDgwMCwKKwlIRUFEX1NFVF9JTiA9IDB4MDAwMDEwMDAsIEdQSU9JTiAgICAgID0gMHgwMDAwMjAwMCwKKwkvKiA3MDE4IHNwZWMgc2F5cyBpZCA9IDAxIGJ1dCB0aGUgZGVtbyBib2FyZCByb3V0ZWQgdG8gMTAgCisJICAgU0VDT05EQVJZX0lEPSAweDAwMDA0MDAwLCAqLworCVNFQ09OREFSWV9JRD0gMHgwMDAwNDAwMCwKKwlQQ01PVVQgICAgICA9IDB4MDAwMTAwMDAsIFNVUlJPVVQgICAgID0gMHgwMDAyMDAwMCwKKwlDRU5URVJPVVQgICA9IDB4MDAwNDAwMDAsIExGRU9VVCAgICAgID0gMHgwMDA4MDAwMCwKKwlMSU5FMU9VVCAgICA9IDB4MDAxMDAwMDAsIExJTkUyT1VUICAgID0gMHgwMDIwMDAwMCwKKwlHUElPT1VUICAgICA9IDB4MDA0MDAwMDAsCisJU0lfQUM5N19QUklNQVJZX1JFQURZICAgPSAweDAxMDAwMDAwLAorCVNJX0FDOTdfU0VDT05EQVJZX1JFQURZID0gMHgwMjAwMDAwMCwKK307CisKK2VudW0gZ2xvYmFsX2NvbnRyb2xfYml0cyB7CisJQ0hBTk5MRV9JRFggPSAweDAwMDAwMDNmLCBQQl9SRVNFVCAgICA9IDB4MDAwMDAxMDAsCisJUEFVU0VfRU5HICAgPSAweDAwMDAwMjAwLAorCU9WRVJSVU5fSUUgID0gMHgwMDAwMDQwMCwgVU5ERVJSVU5fSUUgPSAweDAwMDAwODAwLAorCUVORExQX0lFICAgID0gMHgwMDAwMTAwMCwgTUlETFBfSUUgICAgPSAweDAwMDAyMDAwLAorCUVUT0dfSUUgICAgID0gMHgwMDAwNDAwMCwKKwlFRFJPUF9JRSAgICA9IDB4MDAwMDgwMDAsIEJBTktfQl9FTiAgID0gMHgwMDAxMDAwMAorfTsKKworZW51bSBjaGFubmVsX2NvbnRyb2xfYml0cyB7CisJQ0hBTk5FTF9MT09QICAgPSAweDAwMDAxMDAwLCBDSEFOTkVMX1NJR05FRCA9IDB4MDAwMDIwMDAsCisJQ0hBTk5FTF9TVEVSRU8gPSAweDAwMDA0MDAwLCBDSEFOTkVMXzE2QklUUyA9IDB4MDAwMDgwMDAsCit9OworCitlbnVtIGNoYW5uZWxfYXR0cmlidXRlIHsKKwkvKiBwbGF5YmFjay9yZWNvcmQgc2VsZWN0ICovCisJQ0hBTk5FTF9QQiAgICAgPSAweDAwMDAsIENIQU5ORUxfU1BDX1BCID0gMHg0MDAwLAorCUNIQU5ORUxfUkVDICAgID0gMHg4MDAwLCBDSEFOTkVMX1JFQ19QQiA9IDB4YzAwMCwKKwkvKiBwbGF5YmFjayBkZXN0aW5hdGlvbi9yZWNvcmQgc291cmNlIHNlbGVjdCAqLworCU1PREVNX0xJTkUxICAgID0gMHgwMDAwLCBNT0RFTV9MSU5FMiAgICA9IDB4MDQwMCwKKwlQQ01fTFIgICAgICAgICA9IDB4MDgwMCwgSFNFVCAgICAgICAgICAgPSAweDBjMDAsCisJSTJTX0xSICAgICAgICAgPSAweDEwMDAsIENFTlRFUl9MRkUgICAgID0gMHgxNDAwLAorCVNVUlJfTFIgICAgICAgID0gMHgxODAwLCBTUERJRl9MUiAgICAgICA9IDB4MWMwMCwKKwlNSUMgICAgICAgICAgICA9IDB4MTQwMCwKKwkvKiBtaXN0IHN0dWZmICovCisJTU9OT19MRUZUICAgICAgPSAweDAwMDAsIE1PTk9fUklHSFQgICAgID0gMHgwMTAwLAorCU1PTk9fTUlYICAgICAgID0gMHgwMjAwLCBTUkNfRU5BQkxFICAgICA9IDB4MDA4MCwKK307CisKK2VudW0gbWlzY2ludF9iaXRzIHsKKwlQQl9VTkRFUlJVTl9JUk8gPSAweDAwMDAwMDAxLCBSRUNfT1ZFUlJVTl9JUlEgPSAweDAwMDAwMDAyLAorCVNCX0lSUSAgICAgICAgICA9IDB4MDAwMDAwMDQsIE1QVTQwMV9JUlEgICAgICA9IDB4MDAwMDAwMDgsCisJT1BMM19JUlEgICAgICAgID0gMHgwMDAwMDAxMCwgQUREUkVTU19JUlEgICAgID0gMHgwMDAwMDAyMCwKKwlFTlZFTE9QRV9JUlEgICAgPSAweDAwMDAwMDQwLCBTVF9JUlEgICAgICAgICAgPSAweDAwMDAwMDgwLAorCVBCX1VOREVSUlVOICAgICA9IDB4MDAwMDAxMDAsIFJFQ19PVkVSUlVOICAgICA9IDB4MDAwMDAyMDAsCisJTUlYRVJfVU5ERVJGTE9XID0gMHgwMDAwMDQwMCwgTUlYRVJfT1ZFUkZMT1cgID0gMHgwMDAwMDgwMCwKKwlTVF9UQVJHRVRfUkVBQ0hFRCA9IDB4MDAwMDgwMDAsIFBCXzI0S19NT0RFICAgPSAweDAwMDEwMDAwLCAKKwlTVF9JUlFfRU4gICAgICAgPSAweDAwODAwMDAwLCBBQ0dQSU9fSVJRICAgICAgPSAweDAxMDAwMDAwCit9OworCisjZGVmaW5lIFRSSURfUkVHKCB0cmlkZW50LCB4ICkgKCAodHJpZGVudCkgLT4gaW9iYXNlICsgKHgpICkKKworI2RlZmluZQkJQ1lCRVJfUE9SVF9BVURJTwkJMHgzQ0UKKyNkZWZpbmUJCUNZQkVSX0lEWF9BVURJT19FTkFCTEUgICAgICAgICAgMHg3QgorI2RlZmluZQkJQ1lCRVJfQk1TS19BVURJT19JTlRfRU5BQkxFCTB4MDkKKyNkZWZpbmUJCUNZQkVSX0JNU0tfQVVFTloJCTB4MDEKKyNkZWZpbmUJCUNZQkVSX0JNU0tfQVVFTlpfRU5BQkxFCQkweDAwCisjZGVmaW5lCQlDWUJFUl9JRFhfSVJRX0VOQUJMRQkJMHgxMgorICAgICAgCisjZGVmaW5lIFZBTElEQVRFX01BR0lDKEZPTyxNQUcpCQkJCVwKKyh7CQkJCQkJICAJXAorCWlmICghKEZPTykgfHwgKEZPTyktPm1hZ2ljICE9IE1BRykgeyAJCVwKKwkJcHJpbnRrKGludmFsaWRfbWFnaWMsX19GVU5DVElPTl9fKTsJXAorCQlyZXR1cm4gLUVOWElPOwkJCSAgCVwKKwl9CQkJCQkgIAlcCit9KQorCisjZGVmaW5lIFZBTElEQVRFX1NUQVRFKGEpIFZBTElEQVRFX01BR0lDKGEsVFJJREVOVF9TVEFURV9NQUdJQykKKyNkZWZpbmUgVkFMSURBVEVfQ0FSRChhKSBWQUxJREFURV9NQUdJQyhhLFRSSURFTlRfQ0FSRF9NQUdJQykKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsZDIodW5zaWduZWQgaW50IHgpCit7CisJdW5zaWduZWQgciA9IDA7CisJCisJaWYgKHggPj0gMHgxMDAwMCkgeworCQl4ID4+PSAxNjsKKwkJciArPSAxNjsKKwl9CisJaWYgKHggPj0gMHgxMDApIHsKKwkJeCA+Pj0gODsKKwkJciArPSA4OworCX0KKwlpZiAoeCA+PSAweDEwKSB7CisJCXggPj49IDQ7CisJCXIgKz0gNDsKKwl9CisJaWYgKHggPj0gNCkgeworCQl4ID4+PSAyOworCQlyICs9IDI7CisJfQorCWlmICh4ID49IDIpCisJCXIrKzsKKwlyZXR1cm4gcjsKK30KKworI2VuZGlmIC8qIF9fVFJJRDREV0FWRV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdHJpeC5jIGIvc291bmQvb3NzL3RyaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWYxZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3RyaXguYwpAQCAtMCwwICsxLDUyNSBAQAorLyoKKyAqIHNvdW5kL3RyaXguYworICoKKyAqIExvdyBsZXZlbCBkcml2ZXIgZm9yIHRoZSBNZWRpYVRyaXggQXVkaW9Ucml4IFBybworICogKE1ULTAwMDItUEMgQ29udHJvbCBDaGlwKQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBDaGFuZ2VzCisgKglBbGFuIENveAkJTW9kdWxhcmlzYXRpb24sIGNsZWFudXAuCisgKglDaHJpc3RvcGggSGVsbHdpZwlBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKglBcm5hbGRvIEMuIGRlIE1lbG8JR290IHJpZCBvZiBhdHRhY2hfdWFydDQwMQorICovCisgCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorCisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisjaW5jbHVkZSAic2IuaCIKKyNpbmNsdWRlICJzb3VuZF9maXJtd2FyZS5oIgorCisjaW5jbHVkZSAiYWQxODQ4LmgiCisjaW5jbHVkZSAibXB1NDAxLmgiCisKKyNpbmNsdWRlICJ0cml4X2Jvb3QuaCIKKworc3RhdGljIGludCBtcHU7CisKK3N0YXRpYyBpbnQgam95c3RpY2s7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHRyaXhfcmVhZChpbnQgYWRkcikKK3sKKwlvdXRiKCgodW5zaWduZWQgY2hhcikgYWRkciksIDB4MzkwKTsJLyogTVQtMDAwMi1QQyBBU0lDIGFkZHJlc3MgKi8KKwlyZXR1cm4gaW5iKDB4MzkxKTsJLyogTVQtMDAwMi1QQyBBU0lDIGRhdGEgKi8KK30KKworc3RhdGljIHZvaWQgdHJpeF93cml0ZShpbnQgYWRkciwgaW50IGRhdGEpCit7CisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIGFkZHIpLCAweDM5MCk7CS8qIE1ULTAwMDItUEMgQVNJQyBhZGRyZXNzICovCisJb3V0YigoKHVuc2lnbmVkIGNoYXIpIGRhdGEpLCAweDM5MSk7CS8qIE1ULTAwMDItUEMgQVNJQyBkYXRhICovCit9CisKK3N0YXRpYyB2b2lkIGRvd25sb2FkX2Jvb3QoaW50IGJhc2UpCit7CisJaW50IGkgPSAwLCBuID0gdHJpeF9ib290X2xlbjsKKworCWlmICh0cml4X2Jvb3RfbGVuID09IDApCisJCXJldHVybjsKKworCXRyaXhfd3JpdGUoMHhmOCwgMHgwMCk7CS8qID8/Pz8/Pz8gKi8KKwlvdXRiKCgweDAxKSwgYmFzZSArIDYpOwkvKiBDbGVhciB0aGUgaW50ZXJuYWwgZGF0YSBwb2ludGVyICovCisJb3V0YigoMHgwMCksIGJhc2UgKyA2KTsJLyogUmVzdGFydCAqLworCisJLyoKKwkgICAqICBXcml0ZSB0aGUgYm9vdCBjb2RlIHRvIHRoZSBSQU0gdXBsb2FkL2Rvd25sb2FkIHJlZ2lzdGVyLgorCSAgICogIEVhY2ggd3JpdGUgaW5jcmVtZW50cyB0aGUgaW50ZXJuYWwgZGF0YSBwb2ludGVyLgorCSAqLworCW91dGIoKDB4MDEpLCBiYXNlICsgNik7CS8qIENsZWFyIHRoZSBpbnRlcm5hbCBkYXRhIHBvaW50ZXIgKi8KKwlvdXRiKCgweDFBKSwgMHgzOTApOwkvKiBTZWxlY3QgUkFNIGRvd25sb2FkL3VwbG9hZCBwb3J0ICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQlvdXRiKCh0cml4X2Jvb3RbaV0pLCAweDM5MSk7CisJZm9yIChpID0gbjsgaSA8IDEwMDE2OyBpKyspCS8qIENsZWFyIHVwIHRvIGZpcnN0IDE2IGJ5dGVzIG9mIGRhdGEgUkFNICovCisJCW91dGIoKDB4MDApLCAweDM5MSk7CisJb3V0YigoMHgwMCksIGJhc2UgKyA2KTsJLyogUmVzZXQgKi8KKwlvdXRiKCgweDUwKSwgMHgzOTApOwkvKiA/Pz8/Pz8gKi8KKworfQorCitzdGF0aWMgaW50IHRyaXhfc2V0X3dzc19wb3J0KHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwl1bnNpZ25lZCBjaGFyICAgYWRkcl9iaXRzOworCisJaWYgKHRyaXhfcmVhZCgweDE1KSAhPSAweDcxKQkvKiBObyBBU0lDIHNpZ25hdHVyZSAqLworCXsKKwkJTURCKHByaW50ayhLRVJOX0VSUiAiTm8gQXVkaW9Ucml4IEFTSUMgc2lnbmF0dXJlIGZvdW5kXG4iKSk7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogUmVzZXQgc29tZSByZWdpc3RlcnMuCisJICovCisKKwl0cml4X3dyaXRlKDB4MTMsIDApOworCXRyaXhfd3JpdGUoMHgxNCwgMCk7CisKKwkvKgorCSAqIENvbmZpZ3VyZSB0aGUgQVNJQyB0byBwbGFjZSB0aGUgY29kZWMgdG8gdGhlIHByb3BlciBJL08gbG9jYXRpb24KKwkgKi8KKworCXN3aXRjaCAoaHdfY29uZmlnLT5pb19iYXNlKQorCXsKKwkJY2FzZSAweDUzMDoKKwkJCWFkZHJfYml0cyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAweDYwNDoKKwkJCWFkZHJfYml0cyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAweEU4MDoKKwkJCWFkZHJfYml0cyA9IDI7CisJCQlicmVhazsKKwkJY2FzZSAweEY0MDoKKwkJCWFkZHJfYml0cyA9IDM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAwOworCX0KKworCXRyaXhfd3JpdGUoMHgxOSwgKHRyaXhfcmVhZCgweDE5KSAmIDB4MDMpIHwgYWRkcl9iaXRzKTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqICAgIFByb2JlIGFuZCBhdHRhY2ggcm91dGluZXMgZm9yIHRoZSBXaW5kb3dzIFNvdW5kIFN5c3RlbSBtb2RlIG9mCisgKiAgICAgIEF1ZGlvVHJpeCBQcm8KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RyaXhfd3NzKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hhciBkbWFfYml0c1s0XSA9IHsKKwkJMSwgMiwgMCwgMworCX07CisJc3RydWN0IHJlc291cmNlICpwb3J0czsKKwlpbnQgY29uZmlnX3BvcnQgPSBod19jb25maWctPmlvX2Jhc2UgKyAwOworCWludCBkbWExID0gaHdfY29uZmlnLT5kbWEsIGRtYTIgPSBod19jb25maWctPmRtYTI7CisJaW50IG9sZF9udW1fbWl4ZXJzID0gbnVtX21peGVyczsKKwl1OCBjb25maWcsIGJpdHM7CisJaW50IHJldDsKKyAKKwlzd2l0Y2goaHdfY29uZmlnLT5pcnEpIHsKKwljYXNlIDc6CisJCWJpdHMgPSA4OworCQlicmVhazsKKwljYXNlIDk6CisJCWJpdHMgPSAweDEwOworCQlicmVhazsKKwljYXNlIDEwOgorCQliaXRzID0gMHgxODsKKwkJYnJlYWs7CisJY2FzZSAxMToKKwkJYml0cyA9IDB4MjA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAiQXVkaW9Ucml4OiBCYWQgV1NTIElSUSAlZFxuIiwgaHdfY29uZmlnLT5pcnEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlzd2l0Y2ggKGRtYTEpIHsKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJBdWRpb1RyaXg6IEJhZCBXU1MgRE1BICVkXG4iLCBkbWExKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChkbWEyKSB7CisJY2FzZSAtMToKKwljYXNlIDA6CisJY2FzZSAxOgorCWNhc2UgMzoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRrKEtFUk5fRVJSICJBdWRpb1RyaXg6IEJhZCBjYXB0dXJlIERNQSAlZFxuIiwgZG1hMik7CisJCXJldHVybiAwOworCX0KKworCS8qCisJICogQ2hlY2sgaWYgdGhlIElPIHBvcnQgcmV0dXJucyB2YWxpZCBzaWduYXR1cmUuIFRoZSBvcmlnaW5hbCBNUyBTb3VuZAorCSAqIHN5c3RlbSByZXR1cm5zIDB4MDQgd2hpbGUgc29tZSBjYXJkcyAoQXVkaW9Ucml4IFBybyBmb3IgZXhhbXBsZSkKKwkgKiByZXR1cm4gMHgwMC4KKwkgKi8KKwlwb3J0cyA9IHJlcXVlc3RfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSArIDQsIDQsICJhZDE4NDgiKTsKKwlpZiAoIXBvcnRzKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQXVkaW9Ucml4OiBNU1MgSS9PIHBvcnQgY29uZmxpY3QgKCV4KVxuIiwgaHdfY29uZmlnLT5pb19iYXNlKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDQsICJNU1MgY29uZmlnIikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBdWRpb1RyaXg6IE1TUyBJL08gcG9ydCBjb25mbGljdCAoJXgpXG4iLCBod19jb25maWctPmlvX2Jhc2UpOworCQlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UgKyA0LCA0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCF0cml4X3NldF93c3NfcG9ydChod19jb25maWcpKQorCQlnb3RvIGZhaWw7CisKKwljb25maWcgPSBpbmIoaHdfY29uZmlnLT5pb19iYXNlICsgMyk7CisKKwlpZiAoKGNvbmZpZyAmIDB4M2YpICE9IDB4MDApCisJeworCQlNREIocHJpbnRrKEtFUk5fRVJSICJObyBNU1Mgc2lnbmF0dXJlIGRldGVjdGVkIG9uIHBvcnQgMHgleFxuIiwgaHdfY29uZmlnLT5pb19iYXNlKSk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRoYXQgRE1BMCBpcyBub3QgaW4gdXNlIHdpdGggYSA4IGJpdCBib2FyZC4KKwkgKi8KKworCWlmIChkbWExID09IDAgJiYgY29uZmlnICYgMHg4MCkKKwl7CisJCXByaW50ayhLRVJOX0VSUiAiQXVkaW9Ucml4OiBDYW4ndCB1c2UgRE1BMCB3aXRoIGEgOCBiaXQgY2FyZCBzbG90XG4iKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAoaHdfY29uZmlnLT5pcnEgPiA5ICYmIGNvbmZpZyAmIDB4ODApCisJeworCQlwcmludGsoS0VSTl9FUlIgIkF1ZGlvVHJpeDogQ2FuJ3QgdXNlIElSUSVkIHdpdGggYSA4IGJpdCBjYXJkIHNsb3RcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJZ290byBmYWlsOworCX0KKworCXJldCA9IGFkMTg0OF9kZXRlY3QocG9ydHMsIE5VTEwsIGh3X2NvbmZpZy0+b3NwKTsKKwlpZiAoIXJldCkKKwkJZ290byBmYWlsOworCisJaWYgKGpveXN0aWNrPT0xKQorCQl0cml4X3dyaXRlKDB4MTUsIDB4ODApOworCisJLyoKKwkgKiBTZXQgdGhlIElSUSBhbmQgRE1BIGFkZHJlc3Nlcy4KKwkgKi8KKworCW91dGIoKGJpdHMgfCAweDQwKSwgY29uZmlnX3BvcnQpOworCisJaWYgKGRtYTIgPT0gLTEgfHwgZG1hMiA9PSBkbWExKQorCXsKKwkJICBiaXRzIHw9IGRtYV9iaXRzW2RtYTFdOworCQkgIGRtYTIgPSBkbWExOworCX0KKwllbHNlCisJeworCQl1bnNpZ25lZCBjaGFyIHRtcDsKKworCQl0bXAgPSB0cml4X3JlYWQoMHgxMykgJiB+MzA7CisJCXRyaXhfd3JpdGUoMHgxMywgdG1wIHwgMHg4MCB8IChkbWExIDw8IDQpKTsKKworCQl0bXAgPSB0cml4X3JlYWQoMHgxNCkgJiB+MzA7CisJCXRyaXhfd3JpdGUoMHgxNCwgdG1wIHwgMHg4MCB8IChkbWEyIDw8IDQpKTsKKwl9CisKKwlvdXRiKChiaXRzKSwgY29uZmlnX3BvcnQpOwkvKiBXcml0ZSBJUlErRE1BIHNldHVwICovCisKKwlod19jb25maWctPnNsb3RzWzBdID0gYWQxODQ4X2luaXQoIkF1ZGlvVHJpeCBQcm8iLCBwb3J0cywKKwkJCQkJICBod19jb25maWctPmlycSwKKwkJCQkJICBkbWExLAorCQkJCQkgIGRtYTIsCisJCQkJCSAgMCwKKwkJCQkJICBod19jb25maWctPm9zcCwKKwkJCQkJICBUSElTX01PRFVMRSk7CisKKwlpZiAobnVtX21peGVycyA+IG9sZF9udW1fbWl4ZXJzKQkvKiBNaXhlciBnb3QgaW5zdGFsbGVkICovCisJeworCQlBRDE4NDhfUkVST1VURShTT1VORF9NSVhFUl9MSU5FMSwgU09VTkRfTUlYRVJfTElORSk7CS8qIExpbmUgaW4gKi8KKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTIsIFNPVU5EX01JWEVSX0NEKTsKKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfTElORTMsIFNPVU5EX01JWEVSX1NZTlRIKTsJCS8qIE9QTDQgKi8KKwkJQUQxODQ4X1JFUk9VVEUoU09VTkRfTUlYRVJfU1BFQUtFUiwgU09VTkRfTUlYRVJfQUxUUENNKTsJLyogU0IgKi8KKwl9CisJcmV0dXJuIDE7CisKK2ZhaWw6CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKKwlyZWxlYXNlX3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UgKyA0LCA0KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfdHJpeF9zYihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisKKwlpbnQgdG1wOworCXVuc2lnbmVkIGNoYXIgY29uZjsKKwlleHRlcm4gaW50IHNiX2JlX3F1aWV0OworCWludCBvbGRfcXVpZXQ7CisJc3RhdGljIHNpZ25lZCBjaGFyIGlycV90cmFuc2xhdGVbXSA9IHsKKwkJLTEsIC0xLCAtMSwgMCwgMSwgMiwgLTEsIDMKKwl9OworCisJaWYgKHRyaXhfYm9vdF9sZW4gPT0gMCkKKwkJcmV0dXJuIDA7CS8qIE5vIGJvb3QgY29kZSAtPiBubyBmdW4gKi8KKworCWlmICgoaHdfY29uZmlnLT5pb19iYXNlICYgMHhmZmZmZmY4ZikgIT0gMHgyMDApCisJCXJldHVybiAwOworCisJdG1wID0gaHdfY29uZmlnLT5pcnE7CisJaWYgKHRtcCA+IDcpCisJCXJldHVybiAwOworCWlmIChpcnFfdHJhbnNsYXRlW3RtcF0gPT0gLTEpCisJCXJldHVybiAwOworCisJdG1wID0gaHdfY29uZmlnLT5kbWE7CisJaWYgKHRtcCAhPSAxICYmIHRtcCAhPSAzKQorCQlyZXR1cm4gMDsKKworCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNiwgInNvdW5kYmxhc3RlciIpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQXVkaW9Ucml4OiBTQiBJL08gcG9ydCBjb25mbGljdCAoJXgpXG4iLCBod19jb25maWctPmlvX2Jhc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwljb25mID0gMHg4NDsJCS8qIERNQSBhbmQgSVJRIGVuYWJsZSAqLworCWNvbmYgfD0gaHdfY29uZmlnLT5pb19iYXNlICYgMHg3MDsJLyogSS9PIGFkZHJlc3MgYml0cyAqLworCWNvbmYgfD0gaXJxX3RyYW5zbGF0ZVtod19jb25maWctPmlycV07CisJaWYgKGh3X2NvbmZpZy0+ZG1hID09IDMpCisJCWNvbmYgfD0gMHgwODsKKwl0cml4X3dyaXRlKDB4MWIsIGNvbmYpOworCisJZG93bmxvYWRfYm9vdChod19jb25maWctPmlvX2Jhc2UpOworCisJaHdfY29uZmlnLT5uYW1lID0gIkF1ZGlvVHJpeCBTQiI7CisJaWYgKCFzYl9kc3BfZGV0ZWN0KGh3X2NvbmZpZywgMCwgMCwgTlVMTCkpIHsKKwkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNik7CisJCXJldHVybiAwOworCX0KKworCWh3X2NvbmZpZy0+ZHJpdmVyX3VzZV8xID0gU0JfTk9fTUlESSB8IFNCX05PX01JWEVSIHwgU0JfTk9fUkVDT1JESU5HOworCisJLyogUHJldmVudCBmYWxzZSBhbGFybXMgKi8KKwlvbGRfcXVpZXQgPSBzYl9iZV9xdWlldDsKKwlzYl9iZV9xdWlldCA9IDE7CisKKwlzYl9kc3BfaW5pdChod19jb25maWcsIFRISVNfTU9EVUxFKTsKKworCXNiX2JlX3F1aWV0ID0gb2xkX3F1aWV0OworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV90cml4X21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5zaWduZWQgY2hhciBjb25mOworCXN0YXRpYyBpbnQgaXJxX2JpdHNbXSA9IHsKKwkJLTEsIC0xLCAtMSwgMSwgMiwgMywgLTEsIDQsIC0xLCA1CisJfTsKKworCWlmIChod19jb25maWctPmlycSA+IDkpCisJeworCQlwcmludGsoS0VSTl9FUlIgIkF1ZGlvVHJpeDogQmFkIE1QVSBJUlEgJWRcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChpcnFfYml0c1tod19jb25maWctPmlycV0gPT0gLTEpCisJeworCQlwcmludGsoS0VSTl9FUlIgIkF1ZGlvVHJpeDogQmFkIE1QVSBJUlEgJWRcbiIsIGh3X2NvbmZpZy0+aXJxKTsKKwkJcmV0dXJuIDA7CisJfQorCXN3aXRjaCAoaHdfY29uZmlnLT5pb19iYXNlKQorCXsKKwkJY2FzZSAweDMzMDoKKwkJCWNvbmYgPSAweDAwOworCQkJYnJlYWs7CisJCWNhc2UgMHgzNzA6CisJCQljb25mID0gMHgwNDsKKwkJCWJyZWFrOworCQljYXNlIDB4M2IwOgorCQkJY29uZiA9IDB4MDg7CisJCQlicmVhazsKKwkJY2FzZSAweDNmMDoKKwkJCWNvbmYgPSAweDBjOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gMDsJLyogSW52YWxpZCBwb3J0ICovCisJfQorCisJY29uZiB8PSBpcnFfYml0c1tod19jb25maWctPmlycV0gPDwgNDsKKwl0cml4X3dyaXRlKDB4MTksICh0cml4X3JlYWQoMHgxOSkgJiAweDgzKSB8IGNvbmYpOworCWh3X2NvbmZpZy0+bmFtZSA9ICJBdWRpb1RyaXggUHJvIjsKKwlyZXR1cm4gcHJvYmVfdWFydDQwMShod19jb25maWcsIFRISVNfTU9EVUxFKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVubG9hZF90cml4X3dzcyhzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJaW50IGRtYTIgPSBod19jb25maWctPmRtYTI7CisKKwlpZiAoZG1hMiA9PSAtMSkKKwkJZG1hMiA9IGh3X2NvbmZpZy0+ZG1hOworCisJcmVsZWFzZV9yZWdpb24oMHgzOTAsIDIpOworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCk7CisKKwlhZDE4NDhfdW5sb2FkKGh3X2NvbmZpZy0+aW9fYmFzZSArIDQsCisJCSAgICAgIGh3X2NvbmZpZy0+aXJxLAorCQkgICAgICBod19jb25maWctPmRtYSwKKwkJICAgICAgZG1hMiwKKwkJICAgICAgMCk7CisJc291bmRfdW5sb2FkX2F1ZGlvZGV2KGh3X2NvbmZpZy0+c2xvdHNbMF0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19leGl0IHVubG9hZF90cml4X21wdShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdW5sb2FkX3VhcnQ0MDEoaHdfY29uZmlnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9fZXhpdCB1bmxvYWRfdHJpeF9zYihzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJc2JfZHNwX3VubG9hZChod19jb25maWcsIG1wdSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzI7CitzdGF0aWMgc3RydWN0IGFkZHJlc3NfaW5mbyBjZmdfbXB1OworCitzdGF0aWMgaW50IHNiOworc3RhdGljIGludCBmd19sb2FkOworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8JPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBpcnEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEJPSAtMTsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEyCT0gLTE7CS8qIFNldCB0aGlzIGZvciBtb2R1bGVzIHRoYXQgbmVlZCBpdCAqLworc3RhdGljIGludCBfX2luaXRkYXRhIHNiX2lvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgc2JfZG1hCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgc2JfaXJxCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXB1X2lvCT0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgbXB1X2lycQk9IC0xOworCittb2R1bGVfcGFyYW0oaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oaXJxLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGRtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShkbWEyLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNiX2lvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNiX2RtYSwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzYl9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0obXB1X2lvLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKG1wdV9pcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oam95c3RpY2ssIGJvb2wsIDApOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3RyaXgodm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJNZWRpYVRyaXggYXVkaW8gZHJpdmVyIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTZcbiIpOworCisJY2ZnLmlvX2Jhc2UgPSBpbzsKKwljZmcuaXJxID0gaXJxOworCWNmZy5kbWEgPSBkbWE7CisJY2ZnLmRtYTIgPSBkbWEyOworCisJY2ZnMi5pb19iYXNlID0gc2JfaW87CisJY2ZnMi5pcnEgPSBzYl9pcnE7CisJY2ZnMi5kbWEgPSBzYl9kbWE7CisKKwljZmdfbXB1LmlvX2Jhc2UgPSBtcHVfaW87CisJY2ZnX21wdS5pcnEgPSBtcHVfaXJxOworCisJaWYgKGNmZy5pb19iYXNlID09IC0xIHx8IGNmZy5kbWEgPT0gLTEgfHwgY2ZnLmlycSA9PSAtMSkgeworCQlwcmludGsoS0VSTl9JTkZPICJJL08sIElSUSwgRE1BIGFuZCB0eXBlIGFyZSBtYW5kYXRvcnlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoY2ZnMi5pb19iYXNlICE9IC0xICYmIChjZmcyLmlycSA9PSAtMSB8fCBjZmcyLmRtYSA9PSAtMSkpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ09ORklHX1NCX0lSUSBhbmQgQ09ORklHX1NCX0RNQSBtdXN0IGJlIHNwZWNpZmllZCBpZiBTQl9JTyBpcyBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjZmdfbXB1LmlvX2Jhc2UgIT0gLTEgJiYgY2ZnX21wdS5pcnEgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiQ09ORklHX01QVV9JUlEgbXVzdCBiZSBzcGVjaWZpZWQgaWYgTVBVX0lPIGlzIHNldC5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKCF0cml4X2Jvb3QpCisJeworCQlmd19sb2FkID0gMTsKKwkJdHJpeF9ib290X2xlbiA9IG1vZF9maXJtd2FyZV9sb2FkKCIvZXRjL3NvdW5kL3RyeHByby5iaW4iLAorCQkJCQkJICAgIChjaGFyICoqKSAmdHJpeF9ib290KTsKKwl9CisKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKDB4MzkwLCAyLCAiQXVkaW9Ucml4IikpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJBdWRpb1RyaXg6IENvbmZpZyBwb3J0IEkvTyBjb25mbGljdFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWlmICghaW5pdF90cml4X3dzcygmY2ZnKSkgeworCQlyZWxlYXNlX3JlZ2lvbigweDM5MCwgMik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qCisJICogICAgV2UgbXVzdCBhdHRhY2ggaW4gdGhlIHJpZ2h0IG9yZGVyIHRvIGdldCB0aGUgZmlybXdhcmUKKwkgKiAgICAgIGxvYWRlZCB1cCBpbiB0aW1lLgorCSAqLworCisJaWYgKGNmZzIuaW9fYmFzZSAhPSAtMSkgeworCQlzYiA9IHByb2JlX3RyaXhfc2IoJmNmZzIpOworCX0KKwkKKwlpZiAoY2ZnX21wdS5pb19iYXNlICE9IC0xKQorCQltcHUgPSBwcm9iZV90cml4X21wdSgmY2ZnX21wdSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGNsZWFudXBfdHJpeCh2b2lkKQoreworCWlmIChmd19sb2FkICYmIHRyaXhfYm9vdCkKKwkJdmZyZWUodHJpeF9ib290KTsKKwlpZiAoc2IpCisJCXVubG9hZF90cml4X3NiKCZjZmcyKTsKKwlpZiAobXB1KQorCQl1bmxvYWRfdHJpeF9tcHUoJmNmZ19tcHUpOworCXVubG9hZF90cml4X3dzcygmY2ZnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF90cml4KTsKK21vZHVsZV9leGl0KGNsZWFudXBfdHJpeCk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF90cml4IChjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSwgZG1hLCBkbWEyLCBzYl9pbywgc2JfaXJxLCBzYl9kbWEsIG1wdV9pbywgbXB1X2lycSAqLworCWludCBpbnRzWzldOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpbwk9IGludHNbMV07CisJaXJxCT0gaW50c1syXTsKKwlkbWEJPSBpbnRzWzNdOworCWRtYTIJPSBpbnRzWzRdOworCXNiX2lvCT0gaW50c1s1XTsKKwlzYl9pcnEJPSBpbnRzWzZdOworCXNiX2RtYQk9IGludHNbNl07CisJbXB1X2lvCT0gaW50c1s3XTsKKwltcHVfaXJxCT0gaW50c1s4XTsKKworCXJldHVybiAxOworfQorCitfX3NldHVwKCJ0cml4PSIsIHNldHVwX3RyaXgpOworI2VuZGlmCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdHVuaW5nLmggYi9zb3VuZC9vc3MvdHVuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU4ZTFmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvdHVuaW5nLmgKQEAgLTAsMCArMSwyOSBAQAorI2lmZGVmIFNFUVVFTkNFUl9DCisKK3Vuc2lnbmVkIHNob3J0IHNlbWl0b25lX3R1bmluZ1syNF0gPSAKK3sKKy8qICAgMCAqLyAxMDAwMCwgMTA1OTUsIDExMjI1LCAxMTg5MiwgMTI1OTksIDEzMzQ4LCAxNDE0MiwgMTQ5ODMsIAorLyogICA4ICovIDE1ODc0LCAxNjgxOCwgMTc4MTgsIDE4ODc3LCAyMDAwMCwgMjExODksIDIyNDQ5LCAyMzc4NCwgCisvKiAgMTYgKi8gMjUxOTgsIDI2Njk3LCAyODI4NCwgMjk5NjYsIDMxNzQ4LCAzMzYzNiwgMzU2MzYsIDM3NzU1Cit9OworCit1bnNpZ25lZCBzaG9ydCBjZW50X3R1bmluZ1sxMDBdID0KK3sKKy8qICAgMCAqLyAxMDAwMCwgMTAwMDYsIDEwMDEyLCAxMDAxNywgMTAwMjMsIDEwMDI5LCAxMDAzNSwgMTAwNDEsIAorLyogICA4ICovIDEwMDQ2LCAxMDA1MiwgMTAwNTgsIDEwMDY0LCAxMDA3MCwgMTAwNzUsIDEwMDgxLCAxMDA4NywgCisvKiAgMTYgKi8gMTAwOTMsIDEwMDk5LCAxMDEwNSwgMTAxMTAsIDEwMTE2LCAxMDEyMiwgMTAxMjgsIDEwMTM0LCAKKy8qICAyNCAqLyAxMDE0MCwgMTAxNDUsIDEwMTUxLCAxMDE1NywgMTAxNjMsIDEwMTY5LCAxMDE3NSwgMTAxODEsIAorLyogIDMyICovIDEwMTg3LCAxMDE5MiwgMTAxOTgsIDEwMjA0LCAxMDIxMCwgMTAyMTYsIDEwMjIyLCAxMDIyOCwgCisvKiAgNDAgKi8gMTAyMzQsIDEwMjQwLCAxMDI0NiwgMTAyNTEsIDEwMjU3LCAxMDI2MywgMTAyNjksIDEwMjc1LCAKKy8qICA0OCAqLyAxMDI4MSwgMTAyODcsIDEwMjkzLCAxMDI5OSwgMTAzMDUsIDEwMzExLCAxMDMxNywgMTAzMjMsIAorLyogIDU2ICovIDEwMzI5LCAxMDMzNSwgMTAzNDEsIDEwMzQ3LCAxMDM1MywgMTAzNTksIDEwMzY1LCAxMDM3MSwgCisvKiAgNjQgKi8gMTAzNzcsIDEwMzgzLCAxMDM4OSwgMTAzOTUsIDEwNDAxLCAxMDQwNywgMTA0MTMsIDEwNDE5LCAKKy8qICA3MiAqLyAxMDQyNSwgMTA0MzEsIDEwNDM3LCAxMDQ0MywgMTA0NDksIDEwNDU1LCAxMDQ2MSwgMTA0NjcsIAorLyogIDgwICovIDEwNDczLCAxMDQ3OSwgMTA0ODUsIDEwNDkxLCAxMDQ5NywgMTA1MDMsIDEwNTA5LCAxMDUxNSwgCisvKiAgODggKi8gMTA1MjEsIDEwNTI4LCAxMDUzNCwgMTA1NDAsIDEwNTQ2LCAxMDU1MiwgMTA1NTgsIDEwNTY0LCAKKy8qICA5NiAqLyAxMDU3MCwgMTA1NzYsIDEwNTgyLCAxMDU4OQorfTsKKyNlbHNlCitleHRlcm4gdW5zaWduZWQgc2hvcnQgc2VtaXRvbmVfdHVuaW5nWzI0XTsKK2V4dGVybiB1bnNpZ25lZCBzaG9ydCBjZW50X3R1bmluZ1sxMDBdOworI2VuZGlmCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdWFydDQwMS5jIGIvc291bmQvb3NzL3VhcnQ0MDEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2Q3NWJhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3VhcnQ0MDEuYwpAQCAtMCwwICsxLDQ4MSBAQAorLyoKKyAqIHNvdW5kL3VhcnQ0MDEuYworICoKKyAqIE1QVS00MDEgVUFSVCBkcml2ZXIgKGZvcm1lcmx5IHVhcnQ0MDFfbWlkaS5jKQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBDaGFuZ2VzOgorICoJQWxhbiBDb3gJCVJlZm9ybWF0dGVkLCByZW1vdmVkIHNvdW5kX21lbSB1c2FnZSwgdXNlIG5vcm1hbCBMaW51eAorICoJCQkJaW50ZXJydXB0IGFsbG9jYXRpb24uIFByb3RlY3QgYWdhaW5zdCBib2d1cyB1bmxvYWQKKyAqCQkJCUZpeGVkIHRvIGFsbG93IElSUSA+IDE1CisgKglDaHJpc3RvcGggSGVsbHdpZwlBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKglBcm5hbGRvIEMuIGRlIE1lbG8JZ290IHJpZCBvZiBjaGVja19yZWdpb24KKyAqCisgKiBTdGF0dXM6CisgKgkJVW50ZXN0ZWQKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSAic291bmRfY29uZmlnLmgiCisKKyNpbmNsdWRlICJtcHU0MDEuaCIKKwordHlwZWRlZiBzdHJ1Y3QgdWFydDQwMV9kZXZjCit7CisJaW50ICAgICAgICAgICAgIGJhc2U7CisJaW50ICAgICAgICAgICAgIGlycTsKKwlpbnQgICAgICAgICAgICAqb3NwOworCXZvaWQgICAgICAgICAgICAoKm1pZGlfaW5wdXRfaW50cikgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSk7CisJaW50ICAgICAgICAgICAgIG9wZW5lZCwgZGlzYWJsZWQ7CisJdm9sYXRpbGUgdW5zaWduZWQgY2hhciBpbnB1dF9ieXRlOworCWludCAgICAgICAgICAgICBteV9kZXY7CisJaW50ICAgICAgICAgICAgIHNoYXJlX2lycTsKKwlzcGlubG9ja190CWxvY2s7Cit9Cit1YXJ0NDAxX2RldmM7CisKKyNkZWZpbmUJREFUQVBPUlQgICAoZGV2Yy0+YmFzZSkKKyNkZWZpbmUJQ09NRFBPUlQgICAoZGV2Yy0+YmFzZSsxKQorI2RlZmluZQlTVEFUUE9SVCAgIChkZXZjLT5iYXNlKzEpCisKK3N0YXRpYyBpbnQgdWFydDQwMV9zdGF0dXModWFydDQwMV9kZXZjICogZGV2YykKK3sKKwlyZXR1cm4gaW5iKFNUQVRQT1JUKTsKK30KKworI2RlZmluZSBpbnB1dF9hdmFpbChkZXZjKSAoISh1YXJ0NDAxX3N0YXR1cyhkZXZjKSZJTlBVVF9BVkFJTCkpCisjZGVmaW5lIG91dHB1dF9yZWFkeShkZXZjKQkoISh1YXJ0NDAxX3N0YXR1cyhkZXZjKSZPVVRQVVRfUkVBRFkpKQorCitzdGF0aWMgdm9pZCB1YXJ0NDAxX2NtZCh1YXJ0NDAxX2RldmMgKiBkZXZjLCB1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwlvdXRiKChjbWQpLCBDT01EUE9SVCk7Cit9CisKK3N0YXRpYyBpbnQgdWFydDQwMV9yZWFkKHVhcnQ0MDFfZGV2YyAqIGRldmMpCit7CisJcmV0dXJuIGluYihEQVRBUE9SVCk7Cit9CisKK3N0YXRpYyB2b2lkIHVhcnQ0MDFfd3JpdGUodWFydDQwMV9kZXZjICogZGV2YywgdW5zaWduZWQgY2hhciBieXRlKQoreworCW91dGIoKGJ5dGUpLCBEQVRBUE9SVCk7Cit9CisKKyNkZWZpbmUJT1VUUFVUX1JFQURZCTB4NDAKKyNkZWZpbmUJSU5QVVRfQVZBSUwJMHg4MAorI2RlZmluZQlNUFVfQUNLCQkweEZFCisjZGVmaW5lCU1QVV9SRVNFVAkweEZGCisjZGVmaW5lCVVBUlRfTU9ERV9PTgkweDNGCisKK3N0YXRpYyBpbnQgICAgICByZXNldF91YXJ0NDAxKHVhcnQ0MDFfZGV2YyAqIGRldmMpOworc3RhdGljIHZvaWQgICAgIGVudGVyX3VhcnRfbW9kZSh1YXJ0NDAxX2RldmMgKiBkZXZjKTsKKworc3RhdGljIHZvaWQgdWFydDQwMV9pbnB1dF9sb29wKHVhcnQ0MDFfZGV2YyAqIGRldmMpCit7CisJaW50IHdvcmtfbGltaXQ9MzAwMDA7CisJCisJd2hpbGUgKGlucHV0X2F2YWlsKGRldmMpICYmIC0td29ya19saW1pdCkKKwl7CisJCXVuc2lnbmVkIGNoYXIgICBjID0gdWFydDQwMV9yZWFkKGRldmMpOworCisJCWlmIChjID09IE1QVV9BQ0spCisJCQlkZXZjLT5pbnB1dF9ieXRlID0gYzsKKwkJZWxzZSBpZiAoZGV2Yy0+b3BlbmVkICYgT1BFTl9SRUFEICYmIGRldmMtPm1pZGlfaW5wdXRfaW50cikKKwkJCWRldmMtPm1pZGlfaW5wdXRfaW50cihkZXZjLT5teV9kZXYsIGMpOworCX0KKwlpZih3b3JrX2xpbWl0PT0wKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJUb28gbXVjaCB3b3JrIGluIGludGVycnVwdCBvbiB1YXJ0NDAxICgweCVYKS4gVUFSVCBqYWJiZXJpbmcgPz9cbiIsIGRldmMtPmJhc2UpOworfQorCitpcnFyZXR1cm5fdCB1YXJ0NDAxaW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpkdW1teSkKK3sKKwl1YXJ0NDAxX2RldmMgKmRldmMgPSBkZXZfaWQ7CisKKwlpZiAoZGV2YyA9PSBOVUxMKQorCXsKKwkJcHJpbnRrKEtFUk5fRVJSICJ1YXJ0NDAxOiBiYWQgZGV2Y1xuIik7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlpZiAoaW5wdXRfYXZhaWwoZGV2YykpCisJCXVhcnQ0MDFfaW5wdXRfbG9vcChkZXZjKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpbnQKK3VhcnQ0MDFfb3BlbihpbnQgZGV2LCBpbnQgbW9kZSwKKwkgICAgIHZvaWQgICAgICAgICAgICAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKKwkgICAgIHZvaWQgICAgICAgICAgICAoKm91dHB1dCkgKGludCBkZXYpCispCit7CisJdWFydDQwMV9kZXZjICpkZXZjID0gKHVhcnQ0MDFfZGV2YyAqKSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmIChkZXZjLT5vcGVuZWQpCisJCXJldHVybiAtRUJVU1k7CisKKwkvKiBGbHVzaCB0aGUgVUFSVCAqLworCQorCXdoaWxlIChpbnB1dF9hdmFpbChkZXZjKSkKKwkJdWFydDQwMV9yZWFkKGRldmMpOworCisJZGV2Yy0+bWlkaV9pbnB1dF9pbnRyID0gaW5wdXQ7CisJZGV2Yy0+b3BlbmVkID0gbW9kZTsKKwllbnRlcl91YXJ0X21vZGUoZGV2Yyk7CisJZGV2Yy0+ZGlzYWJsZWQgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVhcnQ0MDFfY2xvc2UoaW50IGRldikKK3sKKwl1YXJ0NDAxX2RldmMgKmRldmMgPSAodWFydDQwMV9kZXZjICopIG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCisJcmVzZXRfdWFydDQwMShkZXZjKTsKKwlkZXZjLT5vcGVuZWQgPSAwOworfQorCitzdGF0aWMgaW50IHVhcnQ0MDFfb3V0KGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKQoreworCWludCB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdWFydDQwMV9kZXZjICpkZXZjID0gKHVhcnQ0MDFfZGV2YyAqKSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKworCWlmIChkZXZjLT5kaXNhYmxlZCkKKwkJcmV0dXJuIDE7CisJLyoKKwkgKiBUZXN0IGZvciBpbnB1dCBzaW5jZSBwZW5kaW5nIGlucHV0IHNlZW1zIHRvIGJsb2NrIHRoZSBvdXRwdXQuCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2Yy0+bG9jayxmbGFncyk7CQorCWlmIChpbnB1dF9hdmFpbChkZXZjKSkKKwkJdWFydDQwMV9pbnB1dF9sb29wKGRldmMpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7CisKKwkvKgorCSAqIFNvbWV0aW1lcyBpdCB0YWtlcyBhYm91dCAxMzAwMCBsb29wcyBiZWZvcmUgdGhlIG91dHB1dCBiZWNvbWVzIHJlYWR5CisJICogKEFmdGVyIHJlc2V0KS4gTm9ybWFsbHkgaXQgdGFrZXMganVzdCBhYm91dCAxMCBsb29wcy4KKwkgKi8KKworCWZvciAodGltZW91dCA9IDMwMDAwOyB0aW1lb3V0ID4gMCAmJiAhb3V0cHV0X3JlYWR5KGRldmMpOyB0aW1lb3V0LS0pOworCisJaWYgKCFvdXRwdXRfcmVhZHkoZGV2YykpCisJeworCQkgIHByaW50ayhLRVJOX1dBUk5JTkcgInVhcnQ0MDE6IFRpbWVvdXQgLSBEZXZpY2Ugbm90IHJlc3BvbmRpbmdcbiIpOworCQkgIGRldmMtPmRpc2FibGVkID0gMTsKKwkJICByZXNldF91YXJ0NDAxKGRldmMpOworCQkgIGVudGVyX3VhcnRfbW9kZShkZXZjKTsKKwkJICByZXR1cm4gMTsKKwl9CisJdWFydDQwMV93cml0ZShkZXZjLCBtaWRpX2J5dGUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCB1YXJ0NDAxX3N0YXJ0X3JlYWQoaW50IGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdWFydDQwMV9lbmRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWFydDQwMV9raWNrKGludCBkZXYpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHVhcnQ0MDFfYnVmZmVyX3N0YXR1cyhpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCisjZGVmaW5lIE1JRElfU1lOVEhfTkFNRQkiTVBVLTQwMSBVQVJUIgorI2RlZmluZSBNSURJX1NZTlRIX0NBUFMJU1lOVEhfQ0FQX0lOUFVUCisjaW5jbHVkZSAibWlkaV9zeW50aC5oIgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1pZGlfb3BlcmF0aW9ucyB1YXJ0NDAxX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7Ik1QVS00MDEgKFVBUlQpIE1JREkiLCAwLCAwLCBTTkRDQVJEX01QVTQwMX0sCisJLmNvbnZlcnRlcgk9ICZzdGRfbWlkaV9zeW50aCwKKwkuaW5faW5mbwk9IHswfSwKKwkub3BlbgkJPSB1YXJ0NDAxX29wZW4sCisJLmNsb3NlCQk9IHVhcnQ0MDFfY2xvc2UsCisJLm91dHB1dGMJPSB1YXJ0NDAxX291dCwKKwkuc3RhcnRfcmVhZAk9IHVhcnQ0MDFfc3RhcnRfcmVhZCwKKwkuZW5kX3JlYWQJPSB1YXJ0NDAxX2VuZF9yZWFkLAorCS5raWNrCQk9IHVhcnQ0MDFfa2ljaywKKwkuYnVmZmVyX3N0YXR1cwk9IHVhcnQ0MDFfYnVmZmVyX3N0YXR1cywKK307CisKK3N0YXRpYyB2b2lkIGVudGVyX3VhcnRfbW9kZSh1YXJ0NDAxX2RldmMgKiBkZXZjKQoreworCWludCBvaywgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOwkKKwlmb3IgKHRpbWVvdXQgPSAzMDAwMDsgdGltZW91dCA+IDAgJiYgIW91dHB1dF9yZWFkeShkZXZjKTsgdGltZW91dC0tKTsKKworCWRldmMtPmlucHV0X2J5dGUgPSAwOworCXVhcnQ0MDFfY21kKGRldmMsIFVBUlRfTU9ERV9PTik7CisKKwlvayA9IDA7CisJZm9yICh0aW1lb3V0ID0gNTAwMDA7IHRpbWVvdXQgPiAwICYmICFvazsgdGltZW91dC0tKQorCQlpZiAoZGV2Yy0+aW5wdXRfYnl0ZSA9PSBNUFVfQUNLKQorCQkJb2sgPSAxOworCQllbHNlIGlmIChpbnB1dF9hdmFpbChkZXZjKSkKKwkJCWlmICh1YXJ0NDAxX3JlYWQoZGV2YykgPT0gTVBVX0FDSykKKwkJCQlvayA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCByZXNldF91YXJ0NDAxKHVhcnQ0MDFfZGV2YyAqIGRldmMpCit7CisJaW50IG9rLCB0aW1lb3V0LCBuOworCisJLyoKKwkgKiBTZW5kIHRoZSBSRVNFVCBjb21tYW5kLiBUcnkgYWdhaW4gaWYgbm8gc3VjY2VzcyBhdCB0aGUgZmlyc3QgdGltZS4KKwkgKi8KKworCW9rID0gMDsKKworCWZvciAobiA9IDA7IG4gPCAyICYmICFvazsgbisrKQorCXsKKwkJZm9yICh0aW1lb3V0ID0gMzAwMDA7IHRpbWVvdXQgPiAwICYmICFvdXRwdXRfcmVhZHkoZGV2Yyk7IHRpbWVvdXQtLSk7CisJCWRldmMtPmlucHV0X2J5dGUgPSAwOworCQl1YXJ0NDAxX2NtZChkZXZjLCBNUFVfUkVTRVQpOworCisJCS8qCisJCSAqIFdhaXQgYXQgbGVhc3QgMjUgbXNlYy4gVGhpcyBtZXRob2QgaXMgbm90IGFjY3VyYXRlIHNvIGxldCdzIG1ha2UgdGhlCisJCSAqIGxvb3AgYml0IGxvbmdlci4gQ2Fubm90IHNsZWVwIHNpbmNlIHRoaXMgaXMgY2FsbGVkIGR1cmluZyBib290LgorCQkgKi8KKworCQlmb3IgKHRpbWVvdXQgPSA1MDAwMDsgdGltZW91dCA+IDAgJiYgIW9rOyB0aW1lb3V0LS0pCisJCXsKKwkJCWlmIChkZXZjLT5pbnB1dF9ieXRlID09IE1QVV9BQ0spCS8qIEludGVycnVwdCAqLworCQkJCW9rID0gMTsKKwkJCWVsc2UgaWYgKGlucHV0X2F2YWlsKGRldmMpKQorCQkJeworCQkJCWlmICh1YXJ0NDAxX3JlYWQoZGV2YykgPT0gTVBVX0FDSykKKwkJCQkJb2sgPSAxOworCQkJfQorCQl9CisJfQorCisKKwlpZiAob2spCisJeworCQlERUIocHJpbnRrKCJSZXNldCBVQVJUNDAxIE9LXG4iKSk7CisJfQorCWVsc2UKKwkJRERCKHByaW50aygiUmVzZXQgVUFSVDQwMSBmYWlsZWQgLSBObyBoYXJkd2FyZSBkZXRlY3RlZC5cbiIpKTsKKworCWlmIChvaykKKwkJdWFydDQwMV9pbnB1dF9sb29wKGRldmMpOwkvKgorCQkJCQkJICogRmx1c2ggaW5wdXQgYmVmb3JlIGVuYWJsaW5nIGludGVycnVwdHMKKwkJCQkJCSAqLworCisJcmV0dXJuIG9rOworfQorCitpbnQgcHJvYmVfdWFydDQwMShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcsIHN0cnVjdCBtb2R1bGUgKm93bmVyKQoreworCXVhcnQ0MDFfZGV2YyAqZGV2YzsKKwljaGFyICpuYW1lID0gIk1QVS00MDEgKFVBUlQpIE1JREkiOworCWludCBvayA9IDA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCUREQihwcmludGsoIkVudGVyZWQgcHJvYmVfdWFydDQwMSgpXG4iKSk7CisKKwkvKiBEZWZhdWx0IHRvICJub3QgZm91bmQiICovCisJaHdfY29uZmlnLT5zbG90c1s0XSA9IC0xOworCisJaWYgKCFyZXF1ZXN0X3JlZ2lvbihod19jb25maWctPmlvX2Jhc2UsIDQsICJNUFUtNDAxIFVBUlQiKSkgeworCQlwcmludGsoS0VSTl9JTkZPICJ1YXJ0NDAxOiBjb3VsZCBub3QgcmVxdWVzdF9yZWdpb24oJWQsIDQpXG4iLCBod19jb25maWctPmlvX2Jhc2UpOworCQlyZXR1cm4gMDsKKwl9CisKKwlkZXZjID0ga21hbGxvYyhzaXplb2YodWFydDQwMV9kZXZjKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkZXZjKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInVhcnQ0MDE6IENhbid0IGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWdvdG8gY2xlYW51cF9yZWdpb247CisJfQorCisJZGV2Yy0+YmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKwlkZXZjLT5pcnEgPSBod19jb25maWctPmlycTsKKwlkZXZjLT5vc3AgPSBod19jb25maWctPm9zcDsKKwlkZXZjLT5taWRpX2lucHV0X2ludHIgPSBOVUxMOworCWRldmMtPm9wZW5lZCA9IDA7CisJZGV2Yy0+aW5wdXRfYnl0ZSA9IDA7CisJZGV2Yy0+bXlfZGV2ID0gMDsKKwlkZXZjLT5zaGFyZV9pcnEgPSAwOworCXNwaW5fbG9ja19pbml0KCZkZXZjLT5sb2NrKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXZjLT5sb2NrLGZsYWdzKTsJCisJb2sgPSByZXNldF91YXJ0NDAxKGRldmMpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCisJaWYgKCFvaykKKwkJZ290byBjbGVhbnVwX2RldmM7CisKKwlpZiAoaHdfY29uZmlnLT5uYW1lKQorCQluYW1lID0gaHdfY29uZmlnLT5uYW1lOworCisJaWYgKGRldmMtPmlycSA8IDApIHsKKwkJZGV2Yy0+c2hhcmVfaXJxID0gMTsKKwkJZGV2Yy0+aXJxICo9IC0xOworCX0gZWxzZQorCQlkZXZjLT5zaGFyZV9pcnEgPSAwOworCisJaWYgKCFkZXZjLT5zaGFyZV9pcnEpCisJCWlmIChyZXF1ZXN0X2lycShkZXZjLT5pcnEsIHVhcnQ0MDFpbnRyLCAwLCAiTVBVLTQwMSBVQVJUIiwgZGV2YykgPCAwKSB7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJ1YXJ0NDAxOiBGYWlsZWQgdG8gYWxsb2NhdGUgSVJRJWRcbiIsIGRldmMtPmlycSk7CisJCQlkZXZjLT5zaGFyZV9pcnEgPSAxOworCQl9CisJZGV2Yy0+bXlfZGV2ID0gc291bmRfYWxsb2NfbWlkaWRldigpOworCWVudGVyX3VhcnRfbW9kZShkZXZjKTsKKworCWlmIChkZXZjLT5teV9kZXYgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidWFydDQwMTogVG9vIG1hbnkgbWlkaSBkZXZpY2VzIGRldGVjdGVkXG4iKTsKKwkJZ290byBjbGVhbnVwX2lycTsKKwl9CisJY29uZl9wcmludGYobmFtZSwgaHdfY29uZmlnKTsKKwltaWRpX2RldnNbZGV2Yy0+bXlfZGV2XSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1pZGlfZGV2c1tkZXZjLT5teV9kZXZdKSB7CisJCXByaW50ayhLRVJOX0VSUiAidWFydDQwMTogRmFpbGVkIHRvIGFsbG9jYXRlIG1lbW9yeVxuIik7CisJCWdvdG8gY2xlYW51cF91bmxvYWRfbWlkaWRldjsKKwl9CisJbWVtY3B5KG1pZGlfZGV2c1tkZXZjLT5teV9kZXZdLCAmdWFydDQwMV9vcGVyYXRpb25zLCBzaXplb2Yoc3RydWN0IG1pZGlfb3BlcmF0aW9ucykpOworCisJaWYgKG93bmVyKQorCQltaWRpX2RldnNbZGV2Yy0+bXlfZGV2XS0+b3duZXIgPSBvd25lcjsKKwkKKwltaWRpX2RldnNbZGV2Yy0+bXlfZGV2XS0+ZGV2YyA9IGRldmM7CisJbWlkaV9kZXZzW2RldmMtPm15X2Rldl0tPmNvbnZlcnRlciA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtaWRpX2RldnNbZGV2Yy0+bXlfZGV2XS0+Y29udmVydGVyKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInVhcnQ0MDE6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnlcbiIpOworCQlnb3RvIGNsZWFudXBfbWlkaV9kZXZzOworCX0KKwltZW1jcHkobWlkaV9kZXZzW2RldmMtPm15X2Rldl0tPmNvbnZlcnRlciwgJnN0ZF9taWRpX3N5bnRoLCBzaXplb2Yoc3RydWN0IHN5bnRoX29wZXJhdGlvbnMpKTsKKwlzdHJjcHkobWlkaV9kZXZzW2RldmMtPm15X2Rldl0tPmluZm8ubmFtZSwgbmFtZSk7CisJbWlkaV9kZXZzW2RldmMtPm15X2Rldl0tPmNvbnZlcnRlci0+aWQgPSAiVUFSVDQwMSI7CisJbWlkaV9kZXZzW2RldmMtPm15X2Rldl0tPmNvbnZlcnRlci0+bWlkaV9kZXYgPSBkZXZjLT5teV9kZXY7CisKKwlpZiAob3duZXIpCisJCW1pZGlfZGV2c1tkZXZjLT5teV9kZXZdLT5jb252ZXJ0ZXItPm93bmVyID0gb3duZXI7CisKKwlod19jb25maWctPnNsb3RzWzRdID0gZGV2Yy0+bXlfZGV2OworCXNlcXVlbmNlcl9pbml0KCk7CisJZGV2Yy0+b3BlbmVkID0gMDsKKwlyZXR1cm4gMTsKK2NsZWFudXBfbWlkaV9kZXZzOgorCWtmcmVlKG1pZGlfZGV2c1tkZXZjLT5teV9kZXZdKTsKK2NsZWFudXBfdW5sb2FkX21pZGlkZXY6CisJc291bmRfdW5sb2FkX21pZGlkZXYoZGV2Yy0+bXlfZGV2KTsKK2NsZWFudXBfaXJxOgorCWlmICghZGV2Yy0+c2hhcmVfaXJxKQorCQlmcmVlX2lycShkZXZjLT5pcnEsIGRldmMpOworY2xlYW51cF9kZXZjOgorCWtmcmVlKGRldmMpOworY2xlYW51cF9yZWdpb246CisJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCA0KTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCB1bmxvYWRfdWFydDQwMShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdWFydDQwMV9kZXZjICpkZXZjOworCWludCBuPWh3X2NvbmZpZy0+c2xvdHNbNF07CisJCisJLyogTm90IHNldCB1cCAqLworCWlmKG49PS0xIHx8IG1pZGlfZGV2c1tuXT09TlVMTCkKKwkJcmV0dXJuOworCQkKKwkvKiBOb3QgYWxsb2NhdGVkIChlcm0gPz8pICovCisJCisJZGV2YyA9IG1pZGlfZGV2c1tod19jb25maWctPnNsb3RzWzRdXS0+ZGV2YzsKKwlpZiAoZGV2YyA9PSBOVUxMKQorCQlyZXR1cm47CisKKwlyZXNldF91YXJ0NDAxKGRldmMpOworCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgNCk7CisKKwlpZiAoIWRldmMtPnNoYXJlX2lycSkKKwkJZnJlZV9pcnEoZGV2Yy0+aXJxLCBkZXZjKTsKKwlpZiAoZGV2YykKKwl7CisJCWtmcmVlKG1pZGlfZGV2c1tkZXZjLT5teV9kZXZdLT5jb252ZXJ0ZXIpOworCQlrZnJlZShtaWRpX2RldnNbZGV2Yy0+bXlfZGV2XSk7CisJCWtmcmVlKGRldmMpOworCQlkZXZjID0gTlVMTDsKKwl9CisJLyogVGhpcyBraWxscyBtaWRpX2RldnNbeF0gKi8KKwlzb3VuZF91bmxvYWRfbWlkaWRldihod19jb25maWctPnNsb3RzWzRdKTsKK30KKworRVhQT1JUX1NZTUJPTChwcm9iZV91YXJ0NDAxKTsKK0VYUE9SVF9TWU1CT0wodW5sb2FkX3VhcnQ0MDEpOworRVhQT1JUX1NZTUJPTCh1YXJ0NDAxaW50cik7CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZ19tcHU7CisKK3N0YXRpYyBpbnQgaW8gPSAtMTsKK3N0YXRpYyBpbnQgaXJxID0gLTE7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwNDQ0KTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMDQ0NCk7CisKKworc3RhdGljIGludCBfX2luaXQgaW5pdF91YXJ0NDAxKHZvaWQpCit7CisJY2ZnX21wdS5pcnEgPSBpcnE7CisJY2ZnX21wdS5pb19iYXNlID0gaW87CisKKwkvKiBDYW4gYmUgbG9hZGVkIGVpdGhlciBmb3IgbW9kdWxlIHVzZSBvciB0byBwcm92aWRlIGZ1bmN0aW9ucworCSAgIHRvIG90aGVycyAqLworCWlmIChjZmdfbXB1LmlvX2Jhc2UgIT0gLTEgJiYgY2ZnX21wdS5pcnEgIT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiTVBVLTQwMSBVQVJUIGRyaXZlciBDb3B5cmlnaHQgKEMpIEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3Iik7CisJCWlmICghcHJvYmVfdWFydDQwMSgmY2ZnX21wdSwgVEhJU19NT0RVTEUpKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3VhcnQ0MDEodm9pZCkKK3sKKwlpZiAoY2ZnX21wdS5pb19iYXNlICE9IC0xICYmIGNmZ19tcHUuaXJxICE9IC0xKQorCQl1bmxvYWRfdWFydDQwMSgmY2ZnX21wdSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdWFydDQwMSk7Cittb2R1bGVfZXhpdChjbGVhbnVwX3VhcnQ0MDEpOworCisjaWZuZGVmIE1PRFVMRQorc3RhdGljIGludCBfX2luaXQgc2V0dXBfdWFydDQwMShjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSAqLworCWludCBpbnRzWzNdOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisKKwlpbyA9IGludHNbMV07CisJaXJxID0gaW50c1syXTsKKwkKKwlyZXR1cm4gMTsKK30KKworX19zZXR1cCgidWFydDQwMT0iLCBzZXR1cF91YXJ0NDAxKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3VhcnQ2ODUwLmMgYi9zb3VuZC9vc3MvdWFydDY4NTAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTAwY2YxCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3VhcnQ2ODUwLmMKQEAgLTAsMCArMSwzNjIgQEAKKy8qCisgKiBzb3VuZC91YXJ0Njg1MC5jCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTcKKyAqCisgKiBPU1MvRnJlZSBmb3IgTGludXggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEdOVSBHRU5FUkFMIFBVQkxJQyBMSUNFTlNFIChHUEwpCisgKiBWZXJzaW9uIDIgKEp1bmUgMTk5MSkuIFNlZSB0aGUgIkNPUFlJTkciIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlCisgKiBmb3IgbW9yZSBpbmZvLgorICogRXh0ZW5kZWQgYnkgQWxhbiBDb3ggZm9yIFJlZCBIYXQgU29mdHdhcmUuIE5vdyBhIGxvYWRhYmxlIE1JREkgZHJpdmVyLgorICogMjgvNC85NyAtIChDKSBDb3B5cmlnaHQgQWxhbiBDb3guIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgdmVyc2lvbiAyLgorICoKKyAqIEFsYW4gQ294OgkJVXBkYXRlZCBmb3IgbmV3IG1vZHVsYXIgY29kZS4gUmVtb3ZlZCBzbmRfKiBpcnEgaGFuZGxpbmcuIE5vdworICoJCQl1c2VzIG5hdGl2ZSBsaW51eCByZXNvdXJjZXMKKyAqIENocmlzdG9waCBIZWxsd2lnOglBZGFwdGVkIHRvIG1vZHVsZV9pbml0L21vZHVsZV9leGl0CisgKiBKZWZmIEdhcnppazoJCU1hZGUgaXQgd29yayBhZ2FpbiwgaW4gdGhlb3J5CisgKgkJCUZJWE1FOiBJZiB0aGUgcmVxdWVzdF9pcnEoKSBzdWNjZWVkcywgdGhlIHByb2JlIHN1Y2NlZWRzLiBVZy4KKyAqCisgKglTdGF0dXM6IFRlc3RpbmcgcmVxdWlyZWQgKG5vIHNoaXQgLWpnYXJ6aWspCisgKgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisvKiBNb24gTm92IDIyIDIyOjM4OjM1IE1FVCAxOTkzIG1hcmNvQGRyaXEuaG9tZS51c24ubmw6CisgKiAgICAgIGFkZGVkIDY4NTAgc3VwcG9ydCwgdXNlZCB3aXRoIENPVk9YIFNvdW5kTWFzdGVyIElJIGFuZCBjdXN0b20gY2FyZHMuCisgKi8KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCitzdGF0aWMgaW50IHVhcnQ2ODUwX2Jhc2UgPSAweDMzMDsKKworc3RhdGljIGludCAqdWFydDY4NTBfb3NwOworCisjZGVmaW5lCURBVEFQT1JUICAgKHVhcnQ2ODUwX2Jhc2UpCisjZGVmaW5lCUNPTURQT1JUICAgKHVhcnQ2ODUwX2Jhc2UrMSkKKyNkZWZpbmUJU1RBVFBPUlQgICAodWFydDY4NTBfYmFzZSsxKQorCitzdGF0aWMgaW50IHVhcnQ2ODUwX3N0YXR1cyh2b2lkKQoreworCXJldHVybiBpbmIoU1RBVFBPUlQpOworfQorCisjZGVmaW5lIGlucHV0X2F2YWlsKCkJCSh1YXJ0Njg1MF9zdGF0dXMoKSZJTlBVVF9BVkFJTCkKKyNkZWZpbmUgb3V0cHV0X3JlYWR5KCkJCSh1YXJ0Njg1MF9zdGF0dXMoKSZPVVRQVVRfUkVBRFkpCisKK3N0YXRpYyB2b2lkIHVhcnQ2ODUwX2NtZCh1bnNpZ25lZCBjaGFyIGNtZCkKK3sKKwlvdXRiKGNtZCwgQ09NRFBPUlQpOworfQorCitzdGF0aWMgaW50IHVhcnQ2ODUwX3JlYWQodm9pZCkKK3sKKwlyZXR1cm4gaW5iKERBVEFQT1JUKTsKK30KKworc3RhdGljIHZvaWQgdWFydDY4NTBfd3JpdGUodW5zaWduZWQgY2hhciBieXRlKQoreworCW91dGIoYnl0ZSwgREFUQVBPUlQpOworfQorCisjZGVmaW5lCU9VVFBVVF9SRUFEWQkweDAyCS8qIE1hc2sgZm9yIGRhdGEgcmVhZHkgQml0ICovCisjZGVmaW5lCUlOUFVUX0FWQUlMCTB4MDEJLyogTWFzayBmb3IgRGF0YSBTZW5kIFJlYWR5IEJpdCAqLworCisjZGVmaW5lCVVBUlRfUkVTRVQJMHg5NQorI2RlZmluZQlVQVJUX01PREVfT04JMHgwMworCitzdGF0aWMgaW50IHVhcnQ2ODUwX29wZW5lZDsKK3N0YXRpYyBpbnQgdWFydDY4NTBfaXJxOworc3RhdGljIGludCB1YXJ0Njg1MF9kZXRlY3RlZDsKK3N0YXRpYyBpbnQgbXlfZGV2Oworc3RhdGljIERFRklORV9TUElOTE9DSyhsb2NrKTsKKworc3RhdGljIHZvaWQgKCptaWRpX2lucHV0X2ludHIpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpOworc3RhdGljIHZvaWQgcG9sbF91YXJ0Njg1MCh1bnNpZ25lZCBsb25nIGR1bW15KTsKKworCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdWFydDY4NTBfdGltZXIgPQorCQlUSU1FUl9JTklUSUFMSVpFUihwb2xsX3VhcnQ2ODUwLCAwLCAwKTsKKworc3RhdGljIHZvaWQgdWFydDY4NTBfaW5wdXRfbG9vcCh2b2lkKQoreworCWludCBjb3VudCA9IDEwOworCisJd2hpbGUgKGNvdW50KQorCXsKKwkJLyoKKwkJICogTm90IHRpbWVkIG91dAorCQkgKi8KKwkJaWYgKGlucHV0X2F2YWlsKCkpCisJCXsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9IHVhcnQ2ODUwX3JlYWQoKTsKKwkJCWNvdW50ID0gMTAwOworCQkJaWYgKHVhcnQ2ODUwX29wZW5lZCAmIE9QRU5fUkVBRCkKKwkJCQltaWRpX2lucHV0X2ludHIobXlfZGV2LCBjKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXdoaWxlICghaW5wdXRfYXZhaWwoKSAmJiBjb3VudCkKKwkJCQljb3VudC0tOworCQl9CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgbTY4NTBpbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmR1bW15KQoreworCWlmIChpbnB1dF9hdmFpbCgpKQorCQl1YXJ0Njg1MF9pbnB1dF9sb29wKCk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICoJSXQgbG9va3MgbGlrZSB0aGVyZSBpcyBubyBpbnB1dCBpbnRlcnJ1cHRzIGluIHRoZSBVQVJUIG1vZGUuIExldCdzIHRyeQorICoJcG9sbGluZy4KKyAqLworCitzdGF0aWMgdm9pZCBwb2xsX3VhcnQ2ODUwKHVuc2lnbmVkIGxvbmcgZHVtbXkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghKHVhcnQ2ODUwX29wZW5lZCAmIE9QRU5fUkVBRCkpCisJCXJldHVybjsJCS8qIERldmljZSBoYXMgYmVlbiBjbG9zZWQgKi8KKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKwlpZiAoaW5wdXRfYXZhaWwoKSkKKwkJdWFydDY4NTBfaW5wdXRfbG9vcCgpOworCisJdWFydDY4NTBfdGltZXIuZXhwaXJlcyA9IDEgKyBqaWZmaWVzOworCWFkZF90aW1lcigmdWFydDY4NTBfdGltZXIpOworCQorCS8qCisJICoJQ29tZSBiYWNrIGxhdGVyCisJICovCisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKK30KKworc3RhdGljIGludCB1YXJ0Njg1MF9vcGVuKGludCBkZXYsIGludCBtb2RlLAorCSAgICAgIHZvaWQgICAgICAgICAgICAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKKwkgICAgICB2b2lkICAgICAgICAgICAgKCpvdXRwdXQpIChpbnQgZGV2KQorKQoreworCWlmICh1YXJ0Njg1MF9vcGVuZWQpCisJeworLyoJCSAgcHJpbnRrKCJNaWRpNjg1MDogTWlkaSBidXN5XG4iKTsqLworCQkgIHJldHVybiAtRUJVU1k7CisJfTsKKworCXVhcnQ2ODUwX2NtZChVQVJUX1JFU0VUKTsKKwl1YXJ0Njg1MF9pbnB1dF9sb29wKCk7CisJbWlkaV9pbnB1dF9pbnRyID0gaW5wdXQ7CisJdWFydDY4NTBfb3BlbmVkID0gbW9kZTsKKwlwb2xsX3VhcnQ2ODUwKDApOwkvKgorCQkJCSAqIEVuYWJsZSBpbnB1dCBwb2xsaW5nCisJCQkJICovCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdWFydDY4NTBfY2xvc2UoaW50IGRldikKK3sKKwl1YXJ0Njg1MF9jbWQoVUFSVF9NT0RFX09OKTsKKwlkZWxfdGltZXIoJnVhcnQ2ODUwX3RpbWVyKTsKKwl1YXJ0Njg1MF9vcGVuZWQgPSAwOworfQorCitzdGF0aWMgaW50IHVhcnQ2ODUwX291dChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIG1pZGlfYnl0ZSkKK3sKKwlpbnQgdGltZW91dDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyoKKwkgKiBUZXN0IGZvciBpbnB1dCBzaW5jZSBwZW5kaW5nIGlucHV0IHNlZW1zIHRvIGJsb2NrIHRoZSBvdXRwdXQuCisJICovCisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisKKwlpZiAoaW5wdXRfYXZhaWwoKSkKKwkJdWFydDY4NTBfaW5wdXRfbG9vcCgpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisKKwkvKgorCSAqIFNvbWV0aW1lcyBpdCB0YWtlcyBhYm91dCAxMzAwMCBsb29wcyBiZWZvcmUgdGhlIG91dHB1dCBiZWNvbWVzIHJlYWR5CisJICogKEFmdGVyIHJlc2V0KS4gTm9ybWFsbHkgaXQgdGFrZXMganVzdCBhYm91dCAxMCBsb29wcy4KKwkgKi8KKworCWZvciAodGltZW91dCA9IDMwMDAwOyB0aW1lb3V0ID4gMCAmJiAhb3V0cHV0X3JlYWR5KCk7IHRpbWVvdXQtLSk7CS8qCisJCQkJCQkJCQkJICogV2FpdAorCQkJCQkJCQkJCSAqLworCWlmICghb3V0cHV0X3JlYWR5KCkpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJNaWRpNjg1MDogVGltZW91dFxuIik7CisJCXJldHVybiAwOworCX0KKwl1YXJ0Njg1MF93cml0ZShtaWRpX2J5dGUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW5saW5lIGludCB1YXJ0Njg1MF9jb21tYW5kKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgKm1pZGlfYnl0ZSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdWFydDY4NTBfc3RhcnRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB1YXJ0Njg1MF9lbmRfcmVhZChpbnQgZGV2KQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWFydDY4NTBfa2ljayhpbnQgZGV2KQoreworfQorCitzdGF0aWMgaW5saW5lIGludCB1YXJ0Njg1MF9idWZmZXJfc3RhdHVzKGludCBkZXYpCit7CisJcmV0dXJuIDA7CQkvKgorCQkJCSAqIE5vIGRhdGEgaW4gYnVmZmVycworCQkJCSAqLworfQorCisjZGVmaW5lIE1JRElfU1lOVEhfTkFNRQkiNjg1MCBVQVJUIE1pZGkiCisjZGVmaW5lIE1JRElfU1lOVEhfQ0FQUwlTWU5USF9DQVBfSU5QVVQKKyNpbmNsdWRlICJtaWRpX3N5bnRoLmgiCisKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIHVhcnQ2ODUwX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7IjY4NTAgVUFSVCIsIDAsIDAsIFNORENBUkRfVUFSVDY4NTB9LAorCS5jb252ZXJ0ZXIJPSAmc3RkX21pZGlfc3ludGgsCisJLmluX2luZm8JPSB7MH0sCisJLm9wZW4JCT0gdWFydDY4NTBfb3BlbiwKKwkuY2xvc2UJCT0gdWFydDY4NTBfY2xvc2UsCisJLm91dHB1dGMJPSB1YXJ0Njg1MF9vdXQsCisJLnN0YXJ0X3JlYWQJPSB1YXJ0Njg1MF9zdGFydF9yZWFkLAorCS5lbmRfcmVhZAk9IHVhcnQ2ODUwX2VuZF9yZWFkLAorCS5raWNrCQk9IHVhcnQ2ODUwX2tpY2ssCisJLmNvbW1hbmQJPSB1YXJ0Njg1MF9jb21tYW5kLAorCS5idWZmZXJfc3RhdHVzCT0gdWFydDY4NTBfYnVmZmVyX3N0YXR1cworfTsKKworCitzdGF0aWMgdm9pZCBfX2luaXQgYXR0YWNoX3VhcnQ2ODUwKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlpbnQgb2ssIHRpbWVvdXQ7CisJdW5zaWduZWQgbG9uZyAgIGZsYWdzOworCisJaWYgKCF1YXJ0Njg1MF9kZXRlY3RlZCkKKwkJcmV0dXJuOworCisJaWYgKChteV9kZXYgPSBzb3VuZF9hbGxvY19taWRpZGV2KCkpID09IC0xKQorCXsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidWFydDY4NTA6IFRvbyBtYW55IG1pZGkgZGV2aWNlcyBkZXRlY3RlZFxuIik7CisJCXJldHVybjsKKwl9CisJdWFydDY4NTBfYmFzZSA9IGh3X2NvbmZpZy0+aW9fYmFzZTsKKwl1YXJ0Njg1MF9vc3AgPSBod19jb25maWctPm9zcDsKKwl1YXJ0Njg1MF9pcnEgPSBod19jb25maWctPmlycTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKworCWZvciAodGltZW91dCA9IDMwMDAwOyB0aW1lb3V0ID4gMCAmJiAhb3V0cHV0X3JlYWR5KCk7IHRpbWVvdXQtLSk7CS8qCisJCQkJCQkJCQkJICogV2FpdAorCQkJCQkJCQkJCSAqLworCXVhcnQ2ODUwX2NtZChVQVJUX01PREVfT04pOworCW9rID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKKworCWNvbmZfcHJpbnRmKCI2ODUwIE1pZGkgSW50ZXJmYWNlIiwgaHdfY29uZmlnKTsKKworCXN0ZF9taWRpX3N5bnRoLm1pZGlfZGV2ID0gbXlfZGV2OworCWh3X2NvbmZpZy0+c2xvdHNbNF0gPSBteV9kZXY7CisJbWlkaV9kZXZzW215X2Rldl0gPSAmdWFydDY4NTBfb3BlcmF0aW9uczsKKwlzZXF1ZW5jZXJfaW5pdCgpOworfQorCitzdGF0aWMgaW5saW5lIGludCByZXNldF91YXJ0Njg1MCh2b2lkKQoreworCXVhcnQ2ODUwX3JlYWQoKTsKKwlyZXR1cm4gMTsJCS8qCisJCQkJICogT0sKKwkJCQkgKi8KK30KKworc3RhdGljIGludCBfX2luaXQgcHJvYmVfdWFydDY4NTAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWludCBvazsKKworCXVhcnQ2ODUwX29zcCA9IGh3X2NvbmZpZy0+b3NwOworCXVhcnQ2ODUwX2Jhc2UgPSBod19jb25maWctPmlvX2Jhc2U7CisJdWFydDY4NTBfaXJxID0gaHdfY29uZmlnLT5pcnE7CisKKwlpZiAocmVxdWVzdF9pcnEodWFydDY4NTBfaXJxLCBtNjg1MGludHIsIDAsICJNSURJNjg1MCIsIE5VTEwpIDwgMCkKKwkJcmV0dXJuIDA7CisKKwlvayA9IHJlc2V0X3VhcnQ2ODUwKCk7CisJdWFydDY4NTBfZGV0ZWN0ZWQgPSBvazsKKwlyZXR1cm4gb2s7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfdWFydDY4NTAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCBOVUxMKTsKKwlzb3VuZF91bmxvYWRfbWlkaWRldihod19jb25maWctPnNsb3RzWzRdKTsKK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnX21wdTsKKworc3RhdGljIGludCBfX2luaXRkYXRhIGlvID0gLTE7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgaXJxID0gLTE7CisKK21vZHVsZV9wYXJhbShpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdWFydDY4NTAodm9pZCkKK3sKKwljZmdfbXB1LmlvX2Jhc2UgPSBpbzsKKwljZmdfbXB1LmlycSA9IGlycTsKKworCWlmIChjZmdfbXB1LmlvX2Jhc2UgPT0gLTEgfHwgY2ZnX21wdS5pcnEgPT0gLTEpIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyAidWFydDY4NTA6IGlycSBhbmQgaW8gbXVzdCBiZSBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHByb2JlX3VhcnQ2ODUwKCZjZmdfbXB1KSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYXR0YWNoX3VhcnQ2ODUwKCZjZmdfbXB1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF91YXJ0Njg1MCh2b2lkKQoreworCXVubG9hZF91YXJ0Njg1MCgmY2ZnX21wdSk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdWFydDY4NTApOworbW9kdWxlX2V4aXQoY2xlYW51cF91YXJ0Njg1MCk7CisKKyNpZm5kZWYgTU9EVUxFCitzdGF0aWMgaW50IF9faW5pdCBzZXR1cF91YXJ0Njg1MChjaGFyICpzdHIpCit7CisJLyogaW8sIGlycSAqLworCWludCBpbnRzWzNdOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisJaW8gPSBpbnRzWzFdOworCWlycSA9IGludHNbMl07CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInVhcnQ2ODUwPSIsIHNldHVwX3VhcnQ2ODUwKTsKKyNlbmRpZgorTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3VsYXcuaCBiL3NvdW5kL29zcy91bGF3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmOGMwYQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy91bGF3LmgKQEAgLTAsMCArMSw2OSBAQAorc3RhdGljIHVuc2lnbmVkIGNoYXIgdWxhd19kc3BbXSA9IHsKKyAgICAgMywgICAgNywgICAxMSwgICAxNSwgICAxOSwgICAyMywgICAyNywgICAzMSwKKyAgICAzNSwgICAzOSwgICA0MywgICA0NywgICA1MSwgICA1NSwgICA1OSwgICA2MywKKyAgICA2NiwgICA2OCwgICA3MCwgICA3MiwgICA3NCwgICA3NiwgICA3OCwgICA4MCwKKyAgICA4MiwgICA4NCwgICA4NiwgICA4OCwgICA5MCwgICA5MiwgICA5NCwgICA5NiwKKyAgICA5OCwgICA5OSwgIDEwMCwgIDEwMSwgIDEwMiwgIDEwMywgIDEwNCwgIDEwNSwKKyAgIDEwNiwgIDEwNywgIDEwOCwgIDEwOSwgIDExMCwgIDExMSwgIDExMiwgIDExMywKKyAgIDExMywgIDExNCwgIDExNCwgIDExNSwgIDExNSwgIDExNiwgIDExNiwgIDExNywKKyAgIDExNywgIDExOCwgIDExOCwgIDExOSwgIDExOSwgIDEyMCwgIDEyMCwgIDEyMSwKKyAgIDEyMSwgIDEyMSwgIDEyMiwgIDEyMiwgIDEyMiwgIDEyMiwgIDEyMywgIDEyMywKKyAgIDEyMywgIDEyMywgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNCwgIDEyNSwgIDEyNSwKKyAgIDEyNSwgIDEyNSwgIDEyNSwgIDEyNSwgIDEyNiwgIDEyNiwgIDEyNiwgIDEyNiwKKyAgIDEyNiwgIDEyNiwgIDEyNiwgIDEyNiwgIDEyNywgIDEyNywgIDEyNywgIDEyNywKKyAgIDEyNywgIDEyNywgIDEyNywgIDEyNywgIDEyNywgIDEyNywgIDEyNywgIDEyNywKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKKyAgIDI1MywgIDI0OSwgIDI0NSwgIDI0MSwgIDIzNywgIDIzMywgIDIyOSwgIDIyNSwKKyAgIDIyMSwgIDIxNywgIDIxMywgIDIwOSwgIDIwNSwgIDIwMSwgIDE5NywgIDE5MywKKyAgIDE5MCwgIDE4OCwgIDE4NiwgIDE4NCwgIDE4MiwgIDE4MCwgIDE3OCwgIDE3NiwKKyAgIDE3NCwgIDE3MiwgIDE3MCwgIDE2OCwgIDE2NiwgIDE2NCwgIDE2MiwgIDE2MCwKKyAgIDE1OCwgIDE1NywgIDE1NiwgIDE1NSwgIDE1NCwgIDE1MywgIDE1MiwgIDE1MSwKKyAgIDE1MCwgIDE0OSwgIDE0OCwgIDE0NywgIDE0NiwgIDE0NSwgIDE0NCwgIDE0MywKKyAgIDE0MywgIDE0MiwgIDE0MiwgIDE0MSwgIDE0MSwgIDE0MCwgIDE0MCwgIDEzOSwKKyAgIDEzOSwgIDEzOCwgIDEzOCwgIDEzNywgIDEzNywgIDEzNiwgIDEzNiwgIDEzNSwKKyAgIDEzNSwgIDEzNSwgIDEzNCwgIDEzNCwgIDEzNCwgIDEzNCwgIDEzMywgIDEzMywKKyAgIDEzMywgIDEzMywgIDEzMiwgIDEzMiwgIDEzMiwgIDEzMiwgIDEzMSwgIDEzMSwKKyAgIDEzMSwgIDEzMSwgIDEzMSwgIDEzMSwgIDEzMCwgIDEzMCwgIDEzMCwgIDEzMCwKKyAgIDEzMCwgIDEzMCwgIDEzMCwgIDEzMCwgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwKKyAgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwgIDEyOSwKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKKyAgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwgIDEyOCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRzcF91bGF3W10gPSB7CisgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDEsICAgIDEsICAgIDEsCisgICAgIDEsICAgIDIsICAgIDIsICAgIDIsICAgIDIsICAgIDMsICAgIDMsICAgIDMsCisgICAgIDMsICAgIDQsICAgIDQsICAgIDQsICAgIDQsICAgIDUsICAgIDUsICAgIDUsCisgICAgIDUsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgIDcsICAgIDcsICAgIDcsCisgICAgIDcsICAgIDgsICAgIDgsICAgIDgsICAgIDgsICAgIDksICAgIDksICAgIDksCisgICAgIDksICAgMTAsICAgMTAsICAgMTAsICAgMTAsICAgMTEsICAgMTEsICAgMTEsCisgICAgMTEsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTMsICAgMTMsICAgMTMsCisgICAgMTMsICAgMTQsICAgMTQsICAgMTQsICAgMTQsICAgMTUsICAgMTUsICAgMTUsCisgICAgMTUsICAgMTYsICAgMTYsICAgMTcsICAgMTcsICAgMTgsICAgMTgsICAgMTksCisgICAgMTksICAgMjAsICAgMjAsICAgMjEsICAgMjEsICAgMjIsICAgMjIsICAgMjMsCisgICAgMjMsICAgMjQsICAgMjQsICAgMjUsICAgMjUsICAgMjYsICAgMjYsICAgMjcsCisgICAgMjcsICAgMjgsICAgMjgsICAgMjksICAgMjksICAgMzAsICAgMzAsICAgMzEsCisgICAgMzEsICAgMzIsICAgMzMsICAgMzQsICAgMzUsICAgMzYsICAgMzcsICAgMzgsCisgICAgMzksICAgNDAsICAgNDEsICAgNDIsICAgNDMsICAgNDQsICAgNDUsICAgNDYsCisgICAgNDcsICAgNDksICAgNTEsICAgNTMsICAgNTUsICAgNTcsICAgNTksICAgNjEsCisgICAgNjMsICAgNjYsICAgNzAsICAgNzQsICAgNzgsICAgODQsICAgOTIsICAxMDQsCisgICAyNTQsICAyMzEsICAyMTksICAyMTEsICAyMDUsICAyMDEsICAxOTcsICAxOTMsCisgICAxOTAsICAxODgsICAxODYsICAxODQsICAxODIsICAxODAsICAxNzgsICAxNzYsCisgICAxNzUsICAxNzQsICAxNzMsICAxNzIsICAxNzEsICAxNzAsICAxNjksICAxNjgsCisgICAxNjcsICAxNjYsICAxNjUsICAxNjQsICAxNjMsICAxNjIsICAxNjEsICAxNjAsCisgICAxNTksICAxNTksICAxNTgsICAxNTgsICAxNTcsICAxNTcsICAxNTYsICAxNTYsCisgICAxNTUsICAxNTUsICAxNTQsICAxNTQsICAxNTMsICAxNTMsICAxNTIsICAxNTIsCisgICAxNTEsICAxNTEsICAxNTAsICAxNTAsICAxNDksICAxNDksICAxNDgsICAxNDgsCisgICAxNDcsICAxNDcsICAxNDYsICAxNDYsICAxNDUsICAxNDUsICAxNDQsICAxNDQsCisgICAxNDMsICAxNDMsICAxNDMsICAxNDMsICAxNDIsICAxNDIsICAxNDIsICAxNDIsCisgICAxNDEsICAxNDEsICAxNDEsICAxNDEsICAxNDAsICAxNDAsICAxNDAsICAxNDAsCisgICAxMzksICAxMzksICAxMzksICAxMzksICAxMzgsICAxMzgsICAxMzgsICAxMzgsCisgICAxMzcsICAxMzcsICAxMzcsICAxMzcsICAxMzYsICAxMzYsICAxMzYsICAxMzYsCisgICAxMzUsICAxMzUsICAxMzUsICAxMzUsICAxMzQsICAxMzQsICAxMzQsICAxMzQsCisgICAxMzMsICAxMzMsICAxMzMsICAxMzMsICAxMzIsICAxMzIsICAxMzIsICAxMzIsCisgICAxMzEsICAxMzEsICAxMzEsICAxMzEsICAxMzAsICAxMzAsICAxMzAsICAxMzAsCisgICAxMjksICAxMjksICAxMjksICAxMjksICAxMjgsICAxMjgsICAxMjgsICAxMjgsCit9OwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3ZfbWlkaS5jIGIvc291bmQvb3NzL3ZfbWlkaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2I3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3Mvdl9taWRpLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBzb3VuZC92X21pZGkuYworICoKKyAqIFRoZSBsb3cgbGV2ZWwgZHJpdmVyIGZvciB0aGUgU291bmQgQmxhc3RlciBEUyBjaGlwcy4KKyAqCisgKgorICogQ29weXJpZ2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NgorICoKKyAqIFVTUy9MaXRlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKiA/PworICoKKyAqIENoYW5nZXMKKyAqCUFsYW4gQ294CQlNb2R1bGFyaXNhdGlvbiwgY2hhbmdlZCBtZW1vcnkgYWxsb2NhdGlvbnMKKyAqCUNocmlzdG9waCBIZWxsd2lnCUFkYXB0ZWQgdG8gbW9kdWxlX2luaXQvbW9kdWxlX2V4aXQKKyAqCisgKiBTdGF0dXMKKyAqCVVudGVzdGVkCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSAidl9taWRpLmgiCisKK3N0YXRpYyB2bWlkaV9kZXZjICp2X2RldmNbMl0gPSB7IE5VTEwsIE5VTEx9Oworc3RhdGljIGludCBtaWRpMSxtaWRpMjsKK3N0YXRpYyB2b2lkICptaWRpX21lbSA9IE5VTEw7CisKKy8qCisgKiBUaGUgRFNQIGNoYW5uZWwgY2FuIGJlIHVzZWQgZWl0aGVyIGZvciBpbnB1dCBvciBvdXRwdXQuIFZhcmlhYmxlCisgKiAnc2JfaXJxX21vZGUnIHdpbGwgYmUgc2V0IHdoZW4gdGhlIHByb2dyYW0gY2FsbHMgcmVhZCBvciB3cml0ZSBmaXJzdCB0aW1lCisgKiBhZnRlciBvcGVuLiBDdXJyZW50IHZlcnNpb24gZG9lc24ndCBzdXBwb3J0IG1vZGUgY2hhbmdlcyB3aXRob3V0IGNsb3NpbmcKKyAqIGFuZCByZW9wZW5pbmcgdGhlIGRldmljZS4gU3VwcG9ydCBmb3IgdGhpcyBmZWF0dXJlIG1heSBiZSBpbXBsZW1lbnRlZCBpbiBhCisgKiBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIGRyaXZlci4KKyAqLworCisKK3ZvaWQgICAgICAgICAgICAoKm1pZGlfaW5wdXRfaW50cikgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgZGF0YSk7CisKK3N0YXRpYyBpbnQgdl9taWRpX29wZW4gKGludCBkZXYsIGludCBtb2RlLAorCSAgICAgIHZvaWQgICAgICAgICAgICAoKmlucHV0KSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKSwKKwkgICAgICB2b2lkICAgICAgICAgICAgKCpvdXRwdXQpIChpbnQgZGV2KQorKQoreworCXZtaWRpX2RldmMgKmRldmMgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRldmMgPT0gTlVMTCkKKwkJcmV0dXJuIC0oRU5YSU8pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWlmIChkZXZjLT5vcGVuZWQpCisJeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXZjLT5sb2NrLGZsYWdzKTsKKwkJcmV0dXJuIC0oRUJVU1kpOworCX0KKwlkZXZjLT5vcGVuZWQgPSAxOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCisJZGV2Yy0+aW50cl9hY3RpdmUgPSAxOworCisJaWYgKG1vZGUgJiBPUEVOX1JFQUQpCisJeworCQlkZXZjLT5pbnB1dF9vcGVuZWQgPSAxOworCQlkZXZjLT5taWRpX2lucHV0X2ludHIgPSBpbnB1dDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgdl9taWRpX2Nsb3NlIChpbnQgZGV2KQoreworCXZtaWRpX2RldmMgKmRldmMgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGRldmMgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldmMtPmxvY2ssZmxhZ3MpOworCWRldmMtPmludHJfYWN0aXZlID0gMDsKKwlkZXZjLT5pbnB1dF9vcGVuZWQgPSAwOworCWRldmMtPm9wZW5lZCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2Yy0+bG9jayxmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQgdl9taWRpX291dCAoaW50IGRldiwgdW5zaWduZWQgY2hhciBtaWRpX2J5dGUpCit7CisJdm1pZGlfZGV2YyAqZGV2YyA9IG1pZGlfZGV2c1tkZXZdLT5kZXZjOworCXZtaWRpX2RldmMgKnBkZXZjOworCisJaWYgKGRldmMgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTlhJTzsKKworCXBkZXZjID0gbWlkaV9kZXZzW2RldmMtPnBhaXJfbWlkaWRldl0tPmRldmM7CisJaWYgKHBkZXZjLT5pbnB1dF9vcGVuZWQgPiAwKXsKKwkJaWYgKE1JRElidWZfYXZhaWwocGRldmMtPm15X21pZGlkZXYpID4gNTAwKQorCQkJcmV0dXJuIDA7CisJCXBkZXZjLT5taWRpX2lucHV0X2ludHIgKHBkZXZjLT5teV9taWRpZGV2LCBtaWRpX2J5dGUpOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdl9taWRpX3N0YXJ0X3JlYWQgKGludCBkZXYpCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdl9taWRpX2VuZF9yZWFkIChpbnQgZGV2KQoreworCXZtaWRpX2RldmMgKmRldmMgPSBtaWRpX2RldnNbZGV2XS0+ZGV2YzsKKwlpZiAoZGV2YyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOWElPOworCisJZGV2Yy0+aW50cl9hY3RpdmUgPSAwOworCXJldHVybiAwOworfQorCisvKiB3aHkgLUVQRVJNIGFuZCBub3QgLUVJTlZBTD8/ICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHZfbWlkaV9pb2N0bCAoaW50IGRldiwgdW5zaWduZWQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCXJldHVybiAtRVBFUk07Cit9CisKKworI2RlZmluZSBNSURJX1NZTlRIX05BTUUJIkxvb3BiYWNrIE1JREkiCisjZGVmaW5lIE1JRElfU1lOVEhfQ0FQUwlTWU5USF9DQVBfSU5QVVQKKworI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgdl9taWRpX29wZXJhdGlvbnMgPQoreworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaW5mbwkJPSB7Ikxvb3BiYWNrIE1JREkgUG9ydCAxIiwgMCwgMCwgU05EQ0FSRF9WTUlESX0sCisJLmNvbnZlcnRlcgk9ICZzdGRfbWlkaV9zeW50aCwKKwkuaW5faW5mbwk9IHswfSwKKwkub3BlbgkJPSB2X21pZGlfb3BlbiwKKwkuY2xvc2UJCT0gdl9taWRpX2Nsb3NlLAorCS5pb2N0bAkJPSB2X21pZGlfaW9jdGwsCisJLm91dHB1dGMJPSB2X21pZGlfb3V0LAorCS5zdGFydF9yZWFkCT0gdl9taWRpX3N0YXJ0X3JlYWQsCisJLmVuZF9yZWFkCT0gdl9taWRpX2VuZF9yZWFkLAorfTsKKworc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgdl9taWRpX29wZXJhdGlvbnMyID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmluZm8JCT0geyJMb29wYmFjayBNSURJIFBvcnQgMiIsIDAsIDAsIFNORENBUkRfVk1JREl9LAorCS5jb252ZXJ0ZXIJPSAmc3RkX21pZGlfc3ludGgsCisJLmluX2luZm8JPSB7MH0sCisJLm9wZW4JCT0gdl9taWRpX29wZW4sCisJLmNsb3NlCQk9IHZfbWlkaV9jbG9zZSwKKwkuaW9jdGwJCT0gdl9taWRpX2lvY3RsLAorCS5vdXRwdXRjCT0gdl9taWRpX291dCwKKwkuc3RhcnRfcmVhZAk9IHZfbWlkaV9zdGFydF9yZWFkLAorCS5lbmRfcmVhZAk9IHZfbWlkaV9lbmRfcmVhZCwKK307CisKKy8qCisgKglXZSBrbWFsbG9jIGp1c3Qgb25lIG9mIHRoZXNlIC0gaXQgbWFrZXMgbGlmZSBzaW1wbGVyIGFuZCB0aGUgY29kZQorICoJY2xlYW5lciBhbmQgdGhlIG1lbW9yeSBoYW5kbGluZyBmYXIgbW9yZSBlZmZpY2llbnQKKyAqLworIAorc3RydWN0IHZtaWRpX21lbW9yeQoreworCS8qIE11c3QgYmUgZmlyc3QgKi8KKwlzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIG1fb3BzWzJdOworCXN0cnVjdCBzeW50aF9vcGVyYXRpb25zIHNfb3BzWzJdOworCXN0cnVjdCB2bWlkaV9kZXZjIHZfb3BzWzJdOworfTsKKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF92X21pZGkgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlzdHJ1Y3Qgdm1pZGlfbWVtb3J5ICptOworCS8qIHByaW50aygiQXR0YWNoaW5nIHZfbWlkaSBkZXZpY2UuLi4uLlxuIik7ICovCisKKwltaWRpMSA9IHNvdW5kX2FsbG9jX21pZGlkZXYoKTsKKwlpZiAobWlkaTEgPT0gLTEpCisJeworCQlwcmludGsoS0VSTl9FUlIgInZfbWlkaTogVG9vIG1hbnkgbWlkaSBkZXZpY2VzIGRldGVjdGVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwkKKwltPShzdHJ1Y3Qgdm1pZGlfbWVtb3J5ICopa21hbGxvYyhzaXplb2Yoc3RydWN0IHZtaWRpX21lbW9yeSksIEdGUF9LRVJORUwpOworCWlmIChtID09IE5VTEwpCisJeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJMb29wYmFjayBNSURJOiBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5XG4iKTsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYobWlkaTEpOworCQlyZXR1cm47CisJfQorCQorCW1pZGlfbWVtID0gbTsKKwkKKwltaWRpX2RldnNbbWlkaTFdID0gJm0tPm1fb3BzWzBdOworCQorCisJbWlkaTIgPSBzb3VuZF9hbGxvY19taWRpZGV2KCk7CisJaWYgKG1pZGkyID09IC0xKQorCXsKKwkJcHJpbnRrIChLRVJOX0VSUiAidl9taWRpOiBUb28gbWFueSBtaWRpIGRldmljZXMgZGV0ZWN0ZWRcbiIpOworCQlrZnJlZShtKTsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYobWlkaTEpOworCQlyZXR1cm47CisJfQorCisJbWlkaV9kZXZzW21pZGkyXSA9ICZtLT5tX29wc1sxXTsKKworCS8qIHByaW50aygiVk1JREkxOiAlZCAgIFZNSURJMjogJWRcbiIsbWlkaTEsbWlkaTIpOyAqLworCisJLyogZm9yIE1JREktMSAqLworCXZfZGV2Y1swXSA9ICZtLT52X29wc1swXTsKKwltZW1jcHkgKChjaGFyICopIG1pZGlfZGV2c1ttaWRpMV0sIChjaGFyICopICZ2X21pZGlfb3BlcmF0aW9ucywKKwkJc2l6ZW9mIChzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSk7CisKKwl2X2RldmNbMF0tPm15X21pZGlkZXYgPSBtaWRpMTsKKwl2X2RldmNbMF0tPnBhaXJfbWlkaWRldiA9IG1pZGkyOworCXZfZGV2Y1swXS0+b3BlbmVkID0gdl9kZXZjWzBdLT5pbnB1dF9vcGVuZWQgPSAwOworCXZfZGV2Y1swXS0+aW50cl9hY3RpdmUgPSAwOworCXZfZGV2Y1swXS0+bWlkaV9pbnB1dF9pbnRyID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmdl9kZXZjWzBdLT5sb2NrKTsKKworCW1pZGlfZGV2c1ttaWRpMV0tPmRldmMgPSB2X2RldmNbMF07CisKKwltaWRpX2RldnNbbWlkaTFdLT5jb252ZXJ0ZXIgPSAmbS0+c19vcHNbMF07CisJc3RkX21pZGlfc3ludGgubWlkaV9kZXYgPSBtaWRpMTsKKwltZW1jcHkgKChjaGFyICopIG1pZGlfZGV2c1ttaWRpMV0tPmNvbnZlcnRlciwgKGNoYXIgKikgJnN0ZF9taWRpX3N5bnRoLAorCQlzaXplb2YgKHN0cnVjdCBzeW50aF9vcGVyYXRpb25zKSk7CisJbWlkaV9kZXZzW21pZGkxXS0+Y29udmVydGVyLT5pZCA9ICJWX01JREkgMSI7CisKKwkvKiBmb3IgTUlESS0yICovCisJdl9kZXZjWzFdID0gJm0tPnZfb3BzWzFdOworCisJbWVtY3B5ICgoY2hhciAqKSBtaWRpX2RldnNbbWlkaTJdLCAoY2hhciAqKSAmdl9taWRpX29wZXJhdGlvbnMyLAorCQlzaXplb2YgKHN0cnVjdCBtaWRpX29wZXJhdGlvbnMpKTsKKworCXZfZGV2Y1sxXS0+bXlfbWlkaWRldiA9IG1pZGkyOworCXZfZGV2Y1sxXS0+cGFpcl9taWRpZGV2ID0gbWlkaTE7CisJdl9kZXZjWzFdLT5vcGVuZWQgPSB2X2RldmNbMV0tPmlucHV0X29wZW5lZCA9IDA7CisJdl9kZXZjWzFdLT5pbnRyX2FjdGl2ZSA9IDA7CisJdl9kZXZjWzFdLT5taWRpX2lucHV0X2ludHIgPSBOVUxMOworCXNwaW5fbG9ja19pbml0KCZ2X2RldmNbMV0tPmxvY2spOworCisJbWlkaV9kZXZzW21pZGkyXS0+ZGV2YyA9IHZfZGV2Y1sxXTsKKwltaWRpX2RldnNbbWlkaTJdLT5jb252ZXJ0ZXIgPSAmbS0+c19vcHNbMV07CisKKwlzdGRfbWlkaV9zeW50aC5taWRpX2RldiA9IG1pZGkyOworCW1lbWNweSAoKGNoYXIgKikgbWlkaV9kZXZzW21pZGkyXS0+Y29udmVydGVyLCAoY2hhciAqKSAmc3RkX21pZGlfc3ludGgsCisJCXNpemVvZiAoc3RydWN0IHN5bnRoX29wZXJhdGlvbnMpKTsKKwltaWRpX2RldnNbbWlkaTJdLT5jb252ZXJ0ZXItPmlkID0gIlZfTUlESSAyIjsKKworCXNlcXVlbmNlcl9pbml0KCk7CisJLyogcHJpbnRrKCJBdHRhY2hlZCB2X21pZGkgZGV2aWNlXG4iKTsgKi8KK30KKworc3RhdGljIGlubGluZSBpbnQgX19pbml0IHByb2JlX3ZfbWlkaShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJcmV0dXJuKDEpOwkvKiBhbHdheXMgT0sgKi8KK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX3ZfbWlkaShzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJc291bmRfdW5sb2FkX21pZGlkZXYobWlkaTEpOworCXNvdW5kX3VubG9hZF9taWRpZGV2KG1pZGkyKTsKKwlrZnJlZShtaWRpX21lbSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIGNmZzsgLyogZHVtbXkgKi8KKworc3RhdGljIGludCBfX2luaXQgaW5pdF92bWlkaSh2b2lkKQoreworCXByaW50aygiTUlESSBMb29wYmFjayBkZXZpY2UgZHJpdmVyXG4iKTsKKwlpZiAoIXByb2JlX3ZfbWlkaSgmY2ZnKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJYXR0YWNoX3ZfbWlkaSgmY2ZnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF92bWlkaSh2b2lkKQoreworCXVubG9hZF92X21pZGkoJmNmZyk7Cit9CisKK21vZHVsZV9pbml0KGluaXRfdm1pZGkpOworbW9kdWxlX2V4aXQoY2xlYW51cF92bWlkaSk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvdl9taWRpLmggYi9zb3VuZC9vc3Mvdl9taWRpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI4NmNiNAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy92X21pZGkuaApAQCAtMCwwICsxLDE1IEBACit0eXBlZGVmIHN0cnVjdCB2bWlkaV9kZXZjIHsKKwkgICBpbnQgZGV2OworCisJLyogU3RhdGUgdmFyaWFibGVzICovCisgCSAgIGludCBvcGVuZWQ7CisJICAgc3BpbmxvY2tfdCBsb2NrOworCQorCS8qIE1JREkgZmllbGRzICovCisJICAgaW50IG15X21pZGlkZXY7CisJICAgaW50IHBhaXJfbWlkaWRldjsKKwkgICBpbnQgaW5wdXRfb3BlbmVkOworCSAgIGludCBpbnRyX2FjdGl2ZTsKKwkgICB2b2lkICgqbWlkaV9pbnB1dF9pbnRyKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKTsKKwl9IHZtaWRpX2RldmM7CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYyBiL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzg3ZTFlNQotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy92aWE4MmN4eHhfYXVkaW8uYwpAQCAtMCwwICsxLDM2MTUgQEAKKy8qCisgKiBTdXBwb3J0IGZvciBWSUEgODJDeHh4IEF1ZGlvIENvZGVjcworICogQ29weXJpZ2h0IDE5OTksMjAwMCBKZWZmIEdhcnppaworICoKKyAqIFVwZGF0ZWQgdG8gc3VwcG9ydCB0aGUgVklBIDgyMzMvODIzNSBhdWRpbyBzdWJzeXN0ZW0KKyAqIEFsYW4gQ294IDxhbGFuQHJlZGhhdC5jb20+IChDKSBDb3B5cmlnaHQgMjAwMiwgMjAwMyBSZWQgSGF0IEluYworICoKKyAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKSBWZXJzaW9uIDIuCisgKiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZSBmb3IgbW9yZSBpbmZvLgorICogTk8gV0FSUkFOVFkKKyAqCisgKiBGb3IgYSBsaXN0IG9mIGtub3duIGJ1Z3MgKGVycmF0YSkgYW5kIGRvY3VtZW50YXRpb24sCisgKiBzZWUgdmlhLWF1ZGlvLnBkZiBpbiBEb2N1bWVudGF0aW9uL0RvY0Jvb2suCisgKiBJZiB0aGlzIGRvY3VtZW50YXRpb24gZG9lcyBub3QgZXhpc3QsIHJ1biAibWFrZSBwZGZkb2NzIi4KKyAqLworCisKKyNkZWZpbmUgVklBX1ZFUlNJT04JIjEuOS4xLWFjNC0yLjUiCisKKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvc291bmQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGFzbS9zZW1hcGhvcmUuaD4KKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKyNpbmNsdWRlICJkZXZfdGFibGUuaCIKKyNpbmNsdWRlICJtcHU0MDEuaCIKKworCisjdW5kZWYgVklBX0RFQlVHCS8qIGRlZmluZSB0byBlbmFibGUgZGVidWdnaW5nIG91dHB1dCBhbmQgY2hlY2tzICovCisjaWZkZWYgVklBX0RFQlVHCisvKiBub3RlOiBwcmludHMgZnVuY3Rpb24gbmFtZSBmb3IgeW91ICovCisjZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKSBwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQorI2Vsc2UKKyNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI3VuZGVmIFZJQV9OREVCVUcJLyogZGVmaW5lIHRvIGRpc2FibGUgbGlnaHR3ZWlnaHQgcnVudGltZSBjaGVja3MgKi8KKyNpZmRlZiBWSUFfTkRFQlVHCisjZGVmaW5lIGFzc2VydChleHByKQorI2Vsc2UKKyNkZWZpbmUgYXNzZXJ0KGV4cHIpIFwKKyAgICAgICAgaWYoIShleHByKSkgewkJCQkJXAorICAgICAgICBwcmludGsoICJBc3NlcnRpb24gZmFpbGVkISAlcywlcywlcyxsaW5lPSVkXG4iLAlcCisgICAgICAgICNleHByLF9fRklMRV9fLF9fRlVOQ1RJT05fXyxfX0xJTkVfXyk7CQlcCisgICAgICAgIH0KKyNlbmRpZgorCisjZGVmaW5lIFZJQV9TVVBQT1JUX01NQVAgMSAvKiBidWdneSwgZm9yIG5vdy4uLiAqLworCisjZGVmaW5lIE1BWF9DQVJEUwkxCisKKyNkZWZpbmUgVklBX0NBUkRfTkFNRQkiVklBIDgyQ3h4eCBBdWRpbyBkcml2ZXIgIiBWSUFfVkVSU0lPTgorI2RlZmluZSBWSUFfTU9EVUxFX05BTUUgInZpYTgyY3h4eCIKKyNkZWZpbmUgUEZYCQlWSUFfTU9EVUxFX05BTUUgIjogIgorCisjZGVmaW5lIFZJQV9DT1VOVEVSX0xJTUlUCTEwMDAwMAorCisvKiBzaXplIG9mIERNQSBidWZmZXJzICovCisjZGVmaW5lIFZJQV9NQVhfQlVGRkVSX0RNQV9QQUdFUwkzMgorCisvKiBidWZmZXJpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gbXMgKi8KKyNkZWZpbmUgVklBX0RFRkFVTFRfRlJBR19USU1FCQkyMAorI2RlZmluZSBWSUFfREVGQVVMVF9CVUZGRVJfVElNRQkJNTAwCisKKy8qIHRoZSBoYXJkd2FyZSBoYXMgYSAyNTYgZnJhZ21lbnQgbGltaXQgKi8KKyNkZWZpbmUgVklBX01JTl9GUkFHX05VTUJFUgkJMgorI2RlZmluZSBWSUFfTUFYX0ZSQUdfTlVNQkVSCQkxMjgKKworI2RlZmluZSBWSUFfTUFYX0ZSQUdfU0laRQkJUEFHRV9TSVpFCisjZGVmaW5lIFZJQV9NSU5fRlJBR19TSVpFCQkoVklBX01BWF9CVUZGRVJfRE1BX1BBR0VTICogUEFHRV9TSVpFIC8gVklBX01BWF9GUkFHX05VTUJFUikKKworCisvKiA4MkM2ODYgZnVuY3Rpb24gNSAoYXVkaW8gY29kZWMpIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyAqLworI2RlZmluZSBWSUFfQUNMSU5LX1NUQVRVUwkweDQwCisjZGVmaW5lIFZJQV9BQ0xJTktfQ1RSTAkJMHg0MQorI2RlZmluZSBWSUFfRlVOQ19FTkFCTEUJCTB4NDIKKyNkZWZpbmUgVklBX1BOUF9DT05UUk9MCQkweDQzCisjZGVmaW5lIFZJQV9GTV9OTUlfQ1RSTAkJMHg0OAorCisvKgorICogY29udHJvbGxlciBiYXNlIDAgKHNjYXR0ZXItZ2F0aGVyKSByZWdpc3RlcnMKKyAqCisgKiBOT1RFOiBWaWEgZGF0YXNoZWV0IGxpc3RzIGZpcnN0IGNoYW5uZWwgYXMgInJlYWQiCisgKiBjaGFubmVsIGFuZCBzZWNvbmQgY2hhbm5lbCBhcyAid3JpdGUiIGNoYW5uZWwuCisgKiBJIGNoYW5nZWQgdGhlIG5hbWluZyBvZiB0aGUgY29uc3RhbnRzIHRvIGJlIG1vcmUKKyAqIGNsZWFyIHRoYW4gSSBmZWx0IHRoZSBkYXRhc2hlZXQgdG8gYmUuCisgKi8KKworI2RlZmluZSBWSUFfQkFTRTBfUENNX09VVF9DSEFOCTB4MDAgLyogb3V0cHV0IFBDTSB0byB1c2VyICovCisjZGVmaW5lIFZJQV9CQVNFMF9QQ01fT1VUX0NIQU5fU1RBVFVTIDB4MDAKKyNkZWZpbmUgVklBX0JBU0UwX1BDTV9PVVRfQ0hBTl9DVFJMCTB4MDEKKyNkZWZpbmUgVklBX0JBU0UwX1BDTV9PVVRfQ0hBTl9UWVBFCTB4MDIKKworI2RlZmluZSBWSUFfQkFTRTBfUENNX0lOX0NIQU4JCTB4MTAgLyogaW5wdXQgUENNIGZyb20gdXNlciAqLworI2RlZmluZSBWSUFfQkFTRTBfUENNX0lOX0NIQU5fU1RBVFVTCTB4MTAKKyNkZWZpbmUgVklBX0JBU0UwX1BDTV9JTl9DSEFOX0NUUkwJMHgxMQorI2RlZmluZSBWSUFfQkFTRTBfUENNX0lOX0NIQU5fVFlQRQkweDEyCisKKy8qIG9mZnNldHMgZnJvbSBiYXNlICovCisjZGVmaW5lIFZJQV9QQ01fU1RBVFVTCQkJMHgwMAorI2RlZmluZSBWSUFfUENNX0NPTlRST0wJCQkweDAxCisjZGVmaW5lIFZJQV9QQ01fVFlQRQkJCTB4MDIKKyNkZWZpbmUgVklBX1BDTV9MRUZUVk9MCQkJMHgwMgorI2RlZmluZSBWSUFfUENNX1JJR0hUVk9MCQkweDAzCisjZGVmaW5lIFZJQV9QQ01fVEFCTEVfQUREUgkJMHgwNAorI2RlZmluZSBWSUFfUENNX1NUT1BSQVRFCQkweDA4CS8qIDgyMzMrICovCisjZGVmaW5lIFZJQV9QQ01fQkxPQ0tfQ09VTlQJCTB4MEMKKworLyogWFhYIHVudXNlZCBETUEgY2hhbm5lbCBmb3IgRk0gUENNIGRhdGEgKi8KKyNkZWZpbmUgVklBX0JBU0UwX0ZNX09VVF9DSEFOCQkweDIwCisjZGVmaW5lIFZJQV9CQVNFMF9GTV9PVVRfQ0hBTl9TVEFUVVMJMHgyMAorI2RlZmluZSBWSUFfQkFTRTBfRk1fT1VUX0NIQU5fQ1RSTAkweDIxCisjZGVmaW5lIFZJQV9CQVNFMF9GTV9PVVRfQ0hBTl9UWVBFCTB4MjIKKworLyogU2l4IGNoYW5uZWwgYXVkaW8gb3V0cHV0IG9uIDgyMzMgKi8KKyNkZWZpbmUgVklBX0JBU0UwX01VTFRJX09VVF9DSEFOCQkweDQwCisjZGVmaW5lIFZJQV9CQVNFMF9NVUxUSV9PVVRfQ0hBTl9TVEFUVVMJCTB4NDAKKyNkZWZpbmUgVklBX0JBU0UwX01VTFRJX09VVF9DSEFOX0NUUkwJCTB4NDEKKyNkZWZpbmUgVklBX0JBU0UwX01VTFRJX09VVF9DSEFOX1RZUEUJCTB4NDIKKworI2RlZmluZSBWSUFfQkFTRTBfQUM5N19DVFJMCQkweDgwCisjZGVmaW5lIFZJQV9CQVNFMF9TR0RfU1RBVFVTX1NIQURPVwkweDg0CisjZGVmaW5lIFZJQV9CQVNFMF9HUElfSU5UX0VOQUJMRQkweDhDCisjZGVmaW5lIFZJQV9JTlRSX09VVAkJCSgoMTw8MCkgfCAgKDE8PDQpIHwgICgxPDw4KSkKKyNkZWZpbmUgVklBX0lOVFJfSU4JCQkoKDE8PDEpIHwgICgxPDw1KSB8ICAoMTw8OSkpCisjZGVmaW5lIFZJQV9JTlRSX0ZNCQkJKCgxPDwyKSB8ICAoMTw8NikgfCAoMTw8MTApKQorI2RlZmluZSBWSUFfSU5UUl9NQVNLCQkoVklBX0lOVFJfT1VUIHwgVklBX0lOVFJfSU4gfCBWSUFfSU5UUl9GTSkKKworLyogTmV3ZXIgVklBIHdlIG5lZWQgdG8gbW9uaXRvciB0aGUgbG93IDMgYml0cyBvZiBlYWNoIGNoYW5uZWwuIFRoaXMKKyAgIG1hc2sgY292ZXJzIHRoZSBjaGFubmVscyB3ZSBkb24ndCB5ZXQgdXNlIGFzIHdlbGwgCisgKi8KKyAKKyNkZWZpbmUgVklBX05FV19JTlRSX01BU0sJCTB4NzcwNzc3NzdVTAorCisvKiBWSUFfQkFTRTBfQVVESU9feHh4X0NIQU5fVFlQRSBiaXRzICovCisjZGVmaW5lIFZJQV9JUlFfT05fRkxBRwkJCSgxPDwwKQkvKiBpbnQgb24gZWFjaCBmbGFnZ2VkIHNjYXR0ZXIgYmxvY2sgKi8KKyNkZWZpbmUgVklBX0lSUV9PTl9FT0wJCQkoMTw8MSkJLyogaW50IGF0IGVuZCBvZiBzY2F0dGVyIGxpc3QgKi8KKyNkZWZpbmUgVklBX0lOVF9TRUxfUENJX0xBU1RfTElORV9SRUFECSgwKQkvKiBpbnQgYXQgUENJIHJlYWQgb2YgbGFzdCBsaW5lICovCisjZGVmaW5lIFZJQV9JTlRfU0VMX0xBU1RfU0FNUExFX1NFTlQJKDE8PDIpCS8qIGludCBhdCBsYXN0IHNhbXBsZSBzZW50ICovCisjZGVmaW5lIFZJQV9JTlRfU0VMX09ORV9MSU5FX0xFRlQJKDE8PDMpCS8qIGludCBhdCBsZXNzIHRoYW4gb25lIGxpbmUgdG8gc2VuZCAqLworI2RlZmluZSBWSUFfUENNX0ZNVF9TVEVSRU8JCSgxPDw0KQkvKiBQQ00gc3RlcmVvIGZvcm1hdCAoYml0IGNsZWFyID09IG1vbm8pICovCisjZGVmaW5lIFZJQV9QQ01fRk1UXzE2QklUCQkoMTw8NSkJLyogUENNIDE2LWJpdCBmb3JtYXQgKGJpdCBjbGVhciA9PSA4LWJpdCkgKi8KKyNkZWZpbmUgVklBX1BDTV9SRUNfRklGTwkJKDE8PDYpCS8qIFBDTSBSZWNvcmRpbmcgRklGTyAqLworI2RlZmluZSBWSUFfUkVTVEFSVF9TR0RfT05fRU9MCQkoMTw8NykJLyogcmVzdGFydCBzY2F0dGVyLWdhdGhlciBhdCBFT0wgKi8KKyNkZWZpbmUgVklBX1BDTV9GTVRfTUFTSwkJKFZJQV9QQ01fRk1UX1NURVJFT3xWSUFfUENNX0ZNVF8xNkJJVCkKKyNkZWZpbmUgVklBX0NIQU5fVFlQRV9NQVNLCQkoVklBX1JFU1RBUlRfU0dEX09OX0VPTCB8IFwKKwkJCQkJIFZJQV9JUlFfT05fRkxBRyB8IFwKKwkJCQkJIFZJQV9JUlFfT05fRU9MKQorI2RlZmluZSBWSUFfQ0hBTl9UWVBFX0lOVF9TRUxFQ1QJKFZJQV9JTlRfU0VMX0xBU1RfU0FNUExFX1NFTlQpCisKKy8qIFBDSSBjb25maWd1cmF0aW9uIHJlZ2lzdGVyIGJpdHMgYW5kIG1hc2tzICovCisjZGVmaW5lIFZJQV9DUjQwX0FDOTdfUkVBRFkJMHgwMQorI2RlZmluZSBWSUFfQ1I0MF9BQzk3X0xPV19QT1dFUgkweDAyCisjZGVmaW5lIFZJQV9DUjQwX1NFQ09OREFSWV9SRUFEWSAweDA0CisKKyNkZWZpbmUgVklBX0NSNDFfQUM5N19FTkFCTEUJMHg4MCAvKiBlbmFibGUgQUM5NyBjb2RlYyAqLworI2RlZmluZSBWSUFfQ1I0MV9BQzk3X1JFU0VUCTB4NDAgLyogY2xlYXIgYml0IHRvIHJlc2V0IEFDOTcgKi8KKyNkZWZpbmUgVklBX0NSNDFfQUM5N19XQUtFVVAJMHgyMCAvKiB3YWtlIHVwIGZyb20gcG93ZXItZG93biBtb2RlICovCisjZGVmaW5lIFZJQV9DUjQxX0FDOTdfU0RPCTB4MTAgLyogZm9yY2UgU2VyaWFsIERhdGEgT3V0IChTRE8pIGhpZ2ggKi8KKyNkZWZpbmUgVklBX0NSNDFfVlJBCQkweDA4IC8qIGVuYWJsZSB2YXJpYWJsZSBzYW1wbGUgcmF0ZSAqLworI2RlZmluZSBWSUFfQ1I0MV9QQ01fRU5BQkxFCTB4MDQgLyogQUMgTGluayBTR0QgUmVhZCBDaGFubmVsIFBDTSBEYXRhIE91dHB1dCAqLworI2RlZmluZSBWSUFfQ1I0MV9GTV9QQ01fRU5BQkxFCTB4MDIgLyogQUMgTGluayBGTSBDaGFubmVsIFBDTSBEYXRhIE91dCAqLworI2RlZmluZSBWSUFfQ1I0MV9TQl9QQ01fRU5BQkxFCTB4MDEgLyogQUMgTGluayBTQiBQQ00gRGF0YSBPdXRwdXQgKi8KKyNkZWZpbmUgVklBX0NSNDFfQk9PVF9NQVNLCShWSUFfQ1I0MV9BQzk3X0VOQUJMRSB8IFwKKwkJCQkgVklBX0NSNDFfQUM5N19XQUtFVVAgfCBcCisJCQkJIFZJQV9DUjQxX0FDOTdfU0RPKQorI2RlZmluZSBWSUFfQ1I0MV9SVU5fTUFTSwkoVklBX0NSNDFfQUM5N19FTkFCTEUgfCBcCisJCQkJIFZJQV9DUjQxX0FDOTdfUkVTRVQgfCBcCisJCQkJIFZJQV9DUjQxX1ZSQSB8IFwKKwkJCQkgVklBX0NSNDFfUENNX0VOQUJMRSkKKworI2RlZmluZSBWSUFfQ1I0Ml9TQl9FTkFCTEUJMHgwMQorI2RlZmluZSBWSUFfQ1I0Ml9NSURJX0VOQUJMRQkweDAyCisjZGVmaW5lIFZJQV9DUjQyX0ZNX0VOQUJMRQkweDA0CisjZGVmaW5lIFZJQV9DUjQyX0dBTUVfRU5BQkxFCTB4MDgKKyNkZWZpbmUgVklBX0NSNDJfTUlESV9JUlFNQVNLICAgMHg0MAorI2RlZmluZSBWSUFfQ1I0Ml9NSURJX1BOUAkweDgwCisKKyNkZWZpbmUgVklBX0NSNDRfU0VDT05EX0NPREVDX1NVUFBPUlQJKDEgPDwgNikKKyNkZWZpbmUgVklBX0NSNDRfQUNfTElOS19BQ0NFU1MJCSgxIDw8IDcpCisKKyNkZWZpbmUgVklBX0NSNDhfRk1fVFJBUF9UT19OTUkJCSgxIDw8IDIpCisKKy8qIGNvbnRyb2xsZXIgYmFzZSAwIHJlZ2lzdGVyIGJpdG1hc2tzICovCisjZGVmaW5lIFZJQV9JTlRfRElTQUJMRV9NQVNLCQkofigweDAxfDB4MDIpKQorI2RlZmluZSBWSUFfU0dEX1NUT1BQRUQJCQkoMSA8PCAyKQorI2RlZmluZSBWSUFfU0dEX1BBVVNFRAkJCSgxIDw8IDYpCisjZGVmaW5lIFZJQV9TR0RfQUNUSVZFCQkJKDEgPDwgNykKKyNkZWZpbmUgVklBX1NHRF9URVJNSU5BVEUJCSgxIDw8IDYpCisjZGVmaW5lIFZJQV9TR0RfRkxBRwkJCSgxIDw8IDApCisjZGVmaW5lIFZJQV9TR0RfRU9MCQkJKDEgPDwgMSkKKyNkZWZpbmUgVklBX1NHRF9TVEFSVAkJCSgxIDw8IDcpCisKKyNkZWZpbmUgVklBX0NSODBfRklSU1RfQ09ERUMJCTAKKyNkZWZpbmUgVklBX0NSODBfU0VDT05EX0NPREVDCQkoMSA8PCAzMCkKKyNkZWZpbmUgVklBX0NSODBfRklSU1RfQ09ERUNfVkFMSUQJKDEgPDwgMjUpCisjZGVmaW5lIFZJQV9DUjgwX1ZBTElECQkJKDEgPDwgMjUpCisjZGVmaW5lIFZJQV9DUjgwX1NFQ09ORF9DT0RFQ19WQUxJRAkoMSA8PCAyNykKKyNkZWZpbmUgVklBX0NSODBfQlVTWQkJCSgxIDw8IDI0KQorI2RlZmluZSBWSUFfQ1I4M19CVVNZCQkJKDEpCisjZGVmaW5lIFZJQV9DUjgzX0ZJUlNUX0NPREVDX1ZBTElECSgxIDw8IDEpCisjZGVmaW5lIFZJQV9DUjgwX1JFQUQJCQkoMSA8PCAyMykKKyNkZWZpbmUgVklBX0NSODBfV1JJVEVfTU9ERQkJMAorI2RlZmluZSBWSUFfQ1I4MF9SRUdfSURYKGlkeCkJCSgoKChpZHgpICYgMHhGRikgPj4gMSkgPDwgMTYpCisKKy8qIGNhcGFiaWxpdGllcyB3ZSBhbm5vdW5jZSAqLworI2lmZGVmIFZJQV9TVVBQT1JUX01NQVAKKyNkZWZpbmUgVklBX0RTUF9DQVAgKERTUF9DQVBfUkVWSVNJT04gfCBEU1BfQ0FQX0RVUExFWCB8IERTUF9DQVBfTU1BUCB8IFwKKwkJICAgICBEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX1JFQUxUSU1FKQorI2Vsc2UKKyNkZWZpbmUgVklBX0RTUF9DQVAgKERTUF9DQVBfUkVWSVNJT04gfCBEU1BfQ0FQX0RVUExFWCB8IFwKKwkJICAgICBEU1BfQ0FQX1RSSUdHRVIgfCBEU1BfQ0FQX1JFQUxUSU1FKQorI2VuZGlmCisKKy8qIHNjYXR0ZXItZ2F0aGVyIERNQSB0YWJsZSBlbnRyeSwgZXhhY3RseSBhcyBwYXNzZWQgdG8gaGFyZHdhcmUgKi8KK3N0cnVjdCB2aWFfc2dkX3RhYmxlIHsKKwl1MzIgYWRkcjsKKwl1MzIgY291bnQ7CS8qIGluY2x1ZGVzIGFkZGl0aW9uYWwgVklBX3h4eCBiaXRzIGFsc28gKi8KK307CisKKyNkZWZpbmUgVklBX0VPTCAoMSA8PCAzMSkKKyNkZWZpbmUgVklBX0ZMQUcgKDEgPDwgMzApCisjZGVmaW5lIFZJQV9TVE9QICgxIDw8IDI5KQorCisKK2VudW0gdmlhX2NoYW5uZWxfc3RhdGVzIHsKKwlzZ2Rfc3RvcHBlZCA9IDAsCisJc2dkX2luX3Byb2dyZXNzID0gMSwKK307CisKKworc3RydWN0IHZpYV9idWZmZXJfcGd0YmwgeworCWRtYV9hZGRyX3QgaGFuZGxlOworCXZvaWQgKmNwdWFkZHI7Cit9OworCisKK3N0cnVjdCB2aWFfY2hhbm5lbCB7CisJYXRvbWljX3Qgbl9mcmFnczsKKwlhdG9taWNfdCBod19wdHI7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd2FpdDsKKworCXVuc2lnbmVkIGludCBzd19wdHI7CisJdW5zaWduZWQgaW50IHNsb3BfbGVuOworCXVuc2lnbmVkIGludCBuX2lycXM7CisJaW50IGJ5dGVzOworCisJdW5zaWduZWQgaXNfYWN0aXZlIDogMTsKKwl1bnNpZ25lZCBpc19yZWNvcmQgOiAxOworCXVuc2lnbmVkIGlzX21hcHBlZCA6IDE7CisJdW5zaWduZWQgaXNfZW5hYmxlZCA6IDE7CisJdW5zaWduZWQgaXNfbXVsdGk6IDE7CS8qIDgyMzMgNiBjaGFubmVsICovCisJdTggcGNtX2ZtdDsJCS8qIFZJQV9QQ01fRk1UX3h4eCAqLworCXU4IGNoYW5uZWxzOwkJLyogQ2hhbm5lbCBjb3VudCAqLworCisJdW5zaWduZWQgcmF0ZTsJCS8qIHNhbXBsZSByYXRlICovCisJdW5zaWduZWQgaW50IGZyYWdfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgZnJhZ19udW1iZXI7CisJCisJdW5zaWduZWQgY2hhciBpbnRtYXNrOworCisJdm9sYXRpbGUgc3RydWN0IHZpYV9zZ2RfdGFibGUgKnNndGFibGU7CisJZG1hX2FkZHJfdCBzZ3RfaGFuZGxlOworCisJdW5zaWduZWQgaW50IHBhZ2VfbnVtYmVyOworCXN0cnVjdCB2aWFfYnVmZmVyX3BndGJsIHBndGJsW1ZJQV9NQVhfQlVGRkVSX0RNQV9QQUdFU107CisKKwlsb25nIGlvYmFzZTsKKworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCisKKy8qIGRhdGEgc3RvcmVkIGZvciBlYWNoIGNoaXAgKi8KK3N0cnVjdCB2aWFfaW5mbyB7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJbG9uZyBiYXNlYWRkcjsKKworCXN0cnVjdCBhYzk3X2NvZGVjICphYzk3OworCXNwaW5sb2NrX3QgYWM5N19sb2NrOworCXNwaW5sb2NrX3QgbG9jazsKKwlpbnQgY2FyZF9udW07CQkvKiB1bmlxdWUgY2FyZCBudW1iZXIsIGZyb20gMCAqLworCisJaW50IGRldl9kc3A7CQkvKiAvZGV2L2RzcCBpbmRleCBmcm9tIHJlZ2lzdGVyX3NvdW5kX2RzcCgpICovCisKKwl1bnNpZ25lZCByZXZfaCA6IDE7CisJdW5zaWduZWQgbGVnYWN5OiAxOwkvKiBIYXMgbGVnYWN5IHBvcnRzICovCisJdW5zaWduZWQgaW50bWFzazogMTsJLyogTmVlZHMgaW50IGJpdHMgKi8KKwl1bnNpZ25lZCBzaXhjaGFubmVsOiAxOwkvKiA4MjMzLzM1IHdpdGggNiBjaGFubmVsIHN1cHBvcnQgKi8KKwl1bnNpZ25lZCB2b2x1bWU6IDE7CisKKwlpbnQgbG9ja2VkX3JhdGUgOiAxOworCQorCWludCBtaXhlcl92b2w7CQkvKiA4MjMzLzM1IHZvbHVtZSAgLSBub3QgeWV0IGltcGxlbWVudGVkICovCisKKwlzdHJ1Y3Qgc2VtYXBob3JlIHN5c2NhbGxfc2VtOworCXN0cnVjdCBzZW1hcGhvcmUgb3Blbl9zZW07CisKKwkvKiBUaGUgODIzMy84MjM1IGhhdmUgNCBEWCBhdWRpbyBjaGFubmVscywgdHdvIHJlY29yZCBhbmQKKwkgICBvbmUgc2l4IGNoYW5uZWwgb3V0LiBXZSBiaW5kIGNoX2luIHRvIERYIDEsIGNoX291dCB0byBtdWx0aWNoYW5uZWwKKwkgICBhbmQgY2hfZm0gdG8gRFggMi4gRFggMyBhbmQgUkVDMC9SRUMxIGFyZSB1bnVzZWQgYXQgdGhlCisJICAgbW9tZW50ICovCisJICAgCisJc3RydWN0IHZpYV9jaGFubmVsIGNoX2luOworCXN0cnVjdCB2aWFfY2hhbm5lbCBjaF9vdXQ7CisJc3RydWN0IHZpYV9jaGFubmVsIGNoX2ZtOworCisjaWZkZWYgQ09ORklHX01JRElfVklBODJDWFhYCisgICAgICAgIHZvaWQgKm1pZGlfZGV2YzsKKyAgICAgICAgc3RydWN0IGFkZHJlc3NfaW5mbyBtaWRpX2luZm87CisjZW5kaWYKK307CisKKworLyogbnVtYmVyIG9mIGNhcmRzLCB1c2VkIGZvciBhc3NpZ25pbmcgdW5pcXVlIG51bWJlcnMgdG8gY2FyZHMgKi8KK3N0YXRpYyB1bnNpZ25lZCB2aWFfbnVtX2NhcmRzOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBwcm90b3R5cGVzCisgKgorICoKKyAqLworCitzdGF0aWMgaW50IHZpYV9pbml0X29uZSAoc3RydWN0IHBjaV9kZXYgKmRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKTsKK3N0YXRpYyB2b2lkIF9fZGV2ZXhpdCB2aWFfcmVtb3ZlX29uZSAoc3RydWN0IHBjaV9kZXYgKnBkZXYpOworCitzdGF0aWMgc3NpemVfdCB2aWFfZHNwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyBzc2l6ZV90IHZpYV9kc3Bfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlhX2RzcF9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpOworc3RhdGljIGludCB2aWFfZHNwX2lvY3RsIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpOworc3RhdGljIGludCB2aWFfZHNwX29wZW4gKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdmlhX2RzcF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKK3N0YXRpYyBpbnQgdmlhX2RzcF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKK3N0YXRpYyB1MTYgdmlhX2FjOTdfcmVhZF9yZWcgKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnKTsKK3N0YXRpYyB2b2lkIHZpYV9hYzk3X3dyaXRlX3JlZyAoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjLCB1OCByZWcsIHUxNiB2YWx1ZSk7CitzdGF0aWMgdTggdmlhX2FjOTdfd2FpdF9pZGxlIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQpOworCitzdGF0aWMgdm9pZCB2aWFfY2hhbl9mcmVlIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbik7CitzdGF0aWMgdm9pZCB2aWFfY2hhbl9jbGVhciAoc3RydWN0IHZpYV9pbmZvICpjYXJkLCBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4pOworc3RhdGljIHZvaWQgdmlhX2NoYW5fcGNtX2ZtdCAoc3RydWN0IHZpYV9jaGFubmVsICpjaGFuLCBpbnQgcmVzZXQpOworc3RhdGljIHZvaWQgdmlhX2NoYW5fYnVmZmVyX2ZyZWUgKHN0cnVjdCB2aWFfaW5mbyAqY2FyZCwgc3RydWN0IHZpYV9jaGFubmVsICpjaGFuKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFZhcmlvdXMgZGF0YSB0aGUgZHJpdmVyIG5lZWRzCisgKgorICoKKyAqLworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCB2aWFfcGNpX3RibFtdID0geworCXsgUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzY4Nl81LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMH0sCisJeyBQQ0lfVkVORE9SX0lEX1ZJQSwgUENJX0RFVklDRV9JRF9WSUFfODIzM181LAorCSAgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgMX0sCisJeyAwLCB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksdmlhX3BjaV90YmwpOworCisKK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciB2aWFfZHJpdmVyID0geworCS5uYW1lCQk9IFZJQV9NT0RVTEVfTkFNRSwKKwkuaWRfdGFibGUJPSB2aWFfcGNpX3RibCwKKwkucHJvYmUJCT0gdmlhX2luaXRfb25lLAorCS5yZW1vdmUJCT0gX19kZXZleGl0X3AodmlhX3JlbW92ZV9vbmUpLAorfTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIExvdy1sZXZlbCBiYXNlIDAgcmVnaXN0ZXIgcmVhZC93cml0ZSBoZWxwZXJzCisgKgorICoKKyAqLworCisvKioKKyAqCXZpYV9jaGFuX3N0b3AgLSBUZXJtaW5hdGUgRE1BIG9uIHNwZWNpZmllZCBQQ00gY2hhbm5lbAorICoJQGlvYmFzZTogUENJIGJhc2UgYWRkcmVzcyBmb3IgU0dEIGNoYW5uZWwgcmVnaXN0ZXJzCisgKgorICoJVGVybWluYXRlIHNjYXR0ZXItZ2F0aGVyIERNQSBvcGVyYXRpb24gZm9yIGdpdmVuCisgKgljaGFubmVsIChkZXJpdmVkIGZyb20gQGlvYmFzZSksIGlmIERNQSBpcyBhY3RpdmUuCisgKgorICoJTm90ZSB0aGF0IEBpb2Jhc2UgaXMgbm90IHRoZSBQQ0kgYmFzZSBhZGRyZXNzLAorICoJYnV0IHRoZSBQQ0kgYmFzZSBhZGRyZXNzIHBsdXMgYW4gb2Zmc2V0IHRvCisgKglvbmUgb2YgdGhyZWUgUENNIGNoYW5uZWxzIHN1cHBvcnRlZCBieSB0aGUgY2hpcC4KKyAqCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHZpYV9jaGFuX3N0b3AgKGxvbmcgaW9iYXNlKQoreworCWlmIChpbmIgKGlvYmFzZSArIFZJQV9QQ01fU1RBVFVTKSAmIFZJQV9TR0RfQUNUSVZFKQorCQlvdXRiIChWSUFfU0dEX1RFUk1JTkFURSwgaW9iYXNlICsgVklBX1BDTV9DT05UUk9MKTsKK30KKworCisvKioKKyAqCXZpYV9jaGFuX3N0YXR1c19jbGVhciAtIENsZWFyIHN0YXR1cyBmbGFncyBvbiBzcGVjaWZpZWQgRE1BIGNoYW5uZWwKKyAqCUBpb2Jhc2U6IFBDSSBiYXNlIGFkZHJlc3MgZm9yIFNHRCBjaGFubmVsIHJlZ2lzdGVycworICoKKyAqCUNsZWFyIGFueSBwZW5kaW5nIHN0YXR1cyBmbGFncyBmb3IgdGhlIGdpdmVuCisgKglETUEgY2hhbm5lbCAoZGVyaXZlZCBmcm9tIEBpb2Jhc2UpLCBpZiBhbnkKKyAqCWZsYWdzIGFyZSBhc3NlcnRlZC4KKyAqCisgKglOb3RlIHRoYXQgQGlvYmFzZSBpcyBub3QgdGhlIFBDSSBiYXNlIGFkZHJlc3MsCisgKglidXQgdGhlIFBDSSBiYXNlIGFkZHJlc3MgcGx1cyBhbiBvZmZzZXQgdG8KKyAqCW9uZSBvZiB0aHJlZSBQQ00gY2hhbm5lbHMgc3VwcG9ydGVkIGJ5IHRoZSBjaGlwLgorICoKKyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgdmlhX2NoYW5fc3RhdHVzX2NsZWFyIChsb25nIGlvYmFzZSkKK3sKKwl1OCB0bXAgPSBpbmIgKGlvYmFzZSArIFZJQV9QQ01fU1RBVFVTKTsKKworCWlmICh0bXAgIT0gMCkKKwkJb3V0YiAodG1wLCBpb2Jhc2UgKyBWSUFfUENNX1NUQVRVUyk7Cit9CisKKworLyoqCisgKglzZ19iZWdpbiAtIEJlZ2luIHJlY29yZGluZyBvciBwbGF5YmFjayBvbiBhIFBDTSBjaGFubmVsCisgKglAY2hhbjogQ2hhbm5lbCBmb3Igd2hpY2ggRE1BIG9wZXJhdGlvbiBzaGFsbCBiZWdpbgorICoKKyAqCVN0YXJ0IHNjYXR0ZXItZ2F0aGVyIERNQSBmb3IgdGhlIGdpdmVuIGNoYW5uZWwuCisgKgorICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZ19iZWdpbiAoc3RydWN0IHZpYV9jaGFubmVsICpjaGFuKQoreworCURQUklOVEsoIlN0YXJ0IHdpdGggaW50bWFzayAlZFxuIiwgY2hhbi0+aW50bWFzayk7CisJRFBSSU5USygiQWJvdXQgdG8gc3RhcnQgZnJvbSAlZCB0byAlZFxuIiwgCisJCWlubChjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX0JMT0NLX0NPVU5UKSwKKwkJaW5iKGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUgKyAzKSk7CisJb3V0YiAoVklBX1NHRF9TVEFSVHxjaGFuLT5pbnRtYXNrLCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX0NPTlRST0wpOworCURQUklOVEsoIlN0YXR1cyBpcyBub3cgJTAyWFxuIiwgaW5iKGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RBVFVTKSk7CisJRFBSSU5USygiQ29udHJvbCBpcyBub3cgJTAyWFxuIiwgaW5iKGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fQ09OVFJPTCkpOworfQorCisKK3N0YXRpYyBpbnQgc2dfYWN0aXZlIChsb25nIGlvYmFzZSkKK3sKKwl1OCB0bXAgPSBpbmIgKGlvYmFzZSArIFZJQV9QQ01fU1RBVFVTKTsKKwlpZiAoKHRtcCAmIFZJQV9TR0RfU1RPUFBFRCkgfHwgKHRtcCAmIFZJQV9TR0RfUEFVU0VEKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJ2aWE4MmN4eHggd2FybmluZzogU0cgc3RvcHBlZCBvciBwYXVzZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHRtcCAmIFZJQV9TR0RfQUNUSVZFKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB2aWFfc2dfb2Zmc2V0KHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwlyZXR1cm4gaW5sIChjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX0JMT0NLX0NPVU5UKSAmIDB4MDBGRkZGRkY7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogTWlzY2VsbGFuZW91cyBkZWJyaXMKKyAqCisgKgorICovCisKKworLyoqCisgKgl2aWFfc3lzY2FsbF9kb3duIC0gZG93biB0aGUgY2FyZC1zcGVjaWZpYyBzeXNjZWxsIHNlbWFwaG9yZQorICoJQGNhcmQ6IFByaXZhdGUgaW5mbyBmb3Igc3BlY2lmaWVkIGJvYXJkCisgKglAbm9uYmxvY2s6IGJvb2xlYW4sIG5vbi16ZXJvIGlmIE9fTk9OQkxPQ0sgaXMgc2V0CisgKgorICoJRW5jYXBzdWxhdGVzIHN0YW5kYXJkIG1ldGhvZCBvZiBhY3F1aXJpbmcgdGhlIHN5c2NhbGwgc2VtLgorICoKKyAqCVJldHVybnMgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IsIG9yIHplcm8gZm9yIHN1Y2Nlc3MuCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgdmlhX3N5c2NhbGxfZG93biAoc3RydWN0IHZpYV9pbmZvICpjYXJkLCBpbnQgbm9uYmxvY2spCit7CisJLyogVGhvbWFzIFNhaWxlcjoKKwkgKiBFQUdBSU4gaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpZiBJTyBpcyBwZW5kaW5nLAorCSAqIG5vdCBpZiB0aGVyZSBpcyBjb250ZW50aW9uIG9uIHNvbWUgaW50ZXJuYWwKKwkgKiBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlIHdoaWNoIHNob3VsZCBiZQorCSAqIGhlbGQgb25seSBmb3IgYSBzaG9ydCB0aW1lIGFueXdheQorCSAqLworCW5vbmJsb2NrID0gMDsKKworCWlmIChub25ibG9jaykgeworCQlpZiAoZG93bl90cnlsb2NrICgmY2FyZC0+c3lzY2FsbF9zZW0pKQorCQkJcmV0dXJuIC1FQUdBSU47CisJfSBlbHNlIHsKKwkJaWYgKGRvd25faW50ZXJydXB0aWJsZSAoJmNhcmQtPnN5c2NhbGxfc2VtKSkKKwkJCXJldHVybiAtRVJFU1RBUlRTWVM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisgKgl2aWFfc3RvcF9ldmVyeXRoaW5nIC0gU3RvcCBhbGwgYXVkaW8gb3BlcmF0aW9ucworICoJQGNhcmQ6IFByaXZhdGUgaW5mbyBmb3Igc3BlY2lmaWVkIGJvYXJkCisgKgorICoJU3RvcHMgYWxsIERNQSBvcGVyYXRpb25zIGFuZCBpbnRlcnJ1cHRzLCBhbmQgY2xlYXIKKyAqCWFueSBwZW5kaW5nIHN0YXR1cyBiaXRzIHJlc3VsdGluZyBmcm9tIHRob3NlIG9wZXJhdGlvbnMuCisgKi8KKworc3RhdGljIHZvaWQgdmlhX3N0b3BfZXZlcnl0aGluZyAoc3RydWN0IHZpYV9pbmZvICpjYXJkKQoreworCXU4IHRtcCwgbmV3X3RtcDsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwkvKgorCSAqIHRlcm1pbmF0ZSBhbnkgZXhpc3Rpbmcgb3BlcmF0aW9ucyBvbiBhdWRpbyByZWFkL3dyaXRlIGNoYW5uZWxzCisJICovCisJdmlhX2NoYW5fc3RvcCAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX09VVF9DSEFOKTsKKwl2aWFfY2hhbl9zdG9wIChjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9QQ01fSU5fQ0hBTik7CisJdmlhX2NoYW5fc3RvcCAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfRk1fT1VUX0NIQU4pOworCWlmKGNhcmQtPnNpeGNoYW5uZWwpCisJCXZpYV9jaGFuX3N0b3AgKGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX01VTFRJX09VVF9DSEFOKTsKKworCS8qCisJICogY2xlYXIgYW55IGV4aXN0aW5nIHN0b3BzIC8gZmxhZ3MgKHNhbml0eSBjaGVjayBtYWlubHkpCisJICovCisJdmlhX2NoYW5fc3RhdHVzX2NsZWFyIChjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9QQ01fT1VUX0NIQU4pOworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX0lOX0NIQU4pOworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfRk1fT1VUX0NIQU4pOworCWlmKGNhcmQtPnNpeGNoYW5uZWwpCisJCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfTVVMVElfT1VUX0NIQU4pOworCisJLyoKKwkgKiBjbGVhciBhbnkgZW5hYmxlZCBpbnRlcnJ1cHQgYml0cworCSAqLworCXRtcCA9IGluYiAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX09VVF9DSEFOX1RZUEUpOworCW5ld190bXAgPSB0bXAgJiB+KFZJQV9JUlFfT05fRkxBR3xWSUFfSVJRX09OX0VPTHxWSUFfUkVTVEFSVF9TR0RfT05fRU9MKTsKKwlpZiAodG1wICE9IG5ld190bXApCisJCW91dGIgKDAsIGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX1BDTV9PVVRfQ0hBTl9UWVBFKTsKKworCXRtcCA9IGluYiAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX0lOX0NIQU5fVFlQRSk7CisJbmV3X3RtcCA9IHRtcCAmIH4oVklBX0lSUV9PTl9GTEFHfFZJQV9JUlFfT05fRU9MfFZJQV9SRVNUQVJUX1NHRF9PTl9FT0wpOworCWlmICh0bXAgIT0gbmV3X3RtcCkKKwkJb3V0YiAoMCwgY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX0lOX0NIQU5fVFlQRSk7CisKKwl0bXAgPSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX0ZNX09VVF9DSEFOX1RZUEUpOworCW5ld190bXAgPSB0bXAgJiB+KFZJQV9JUlFfT05fRkxBR3xWSUFfSVJRX09OX0VPTHxWSUFfUkVTVEFSVF9TR0RfT05fRU9MKTsKKwlpZiAodG1wICE9IG5ld190bXApCisJCW91dGIgKDAsIGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX0ZNX09VVF9DSEFOX1RZUEUpOworCisJaWYoY2FyZC0+c2l4Y2hhbm5lbCkKKwl7CisJCXRtcCA9IGluYiAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfTVVMVElfT1VUX0NIQU5fVFlQRSk7CisJCW5ld190bXAgPSB0bXAgJiB+KFZJQV9JUlFfT05fRkxBR3xWSUFfSVJRX09OX0VPTHxWSUFfUkVTVEFSVF9TR0RfT05fRU9MKTsKKwkJaWYgKHRtcCAhPSBuZXdfdG1wKQorCQkJb3V0YiAoMCwgY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfTVVMVElfT1VUX0NIQU5fVFlQRSk7CisJfQorCisJdWRlbGF5KDEwKTsKKworCS8qCisJICogY2xlYXIgYW55IGV4aXN0aW5nIGZsYWdzCisJICovCisJdmlhX2NoYW5fc3RhdHVzX2NsZWFyIChjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9QQ01fT1VUX0NIQU4pOworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfUENNX0lOX0NIQU4pOworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfRk1fT1VUX0NIQU4pOworCisJRFBSSU5USyAoIkVYSVRcbiIpOworfQorCisKKy8qKgorICoJdmlhX3NldF9yYXRlIC0gU2V0IFBDTSByYXRlIGZvciBnaXZlbiBjaGFubmVsCisgKglAYWM5NzogUG9pbnRlciB0byBnZW5lcmljIGNvZGVjIGluZm8gc3RydWN0CisgKglAY2hhbjogUHJpdmF0ZSBpbmZvIGZvciBzcGVjaWZpZWQgY2hhbm5lbAorICoJQHJhdGU6IERlc2lyZWQgUENNIHNhbXBsZSByYXRlLCBpbiBLaHoKKyAqCisgKglTZXRzIHRoZSBQQ00gc2FtcGxlIHJhdGUgZm9yIGEgY2hhbm5lbC4KKyAqCisgKglWYWx1ZXMgZm9yIEByYXRlIGFyZSBjbGFtcGVkIHRvIGEgcmFuZ2Ugb2YgNDAwMCBLaHogdGhyb3VnaCA0ODAwMCBLaHosCisgKglkdWUgdG8gaGFyZHdhcmUgY29uc3RyYWludHMuCisgKi8KKworc3RhdGljIGludCB2aWFfc2V0X3JhdGUgKHN0cnVjdCBhYzk3X2NvZGVjICphYzk3LAorCQkJIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgcmF0ZSkKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQgPSBhYzk3LT5wcml2YXRlX2RhdGE7CisJaW50IHJhdGVfcmVnOworCXUzMiBkYWNwOworCXUzMiBtYXN0X3ZvbCwgcGhvbmVfdm9sLCBtb25vX3ZvbCwgcGNtX3ZvbDsKKwl1MzIgbXV0ZV92b2wgPSAweDgwMDA7CS8qIFRoZSBtdXRlIHZvbHVtZT8gLS0gU2VlbXMgdG8gd29yayEgKi8KKworCURQUklOVEsgKCJFTlRFUiwgcmF0ZSA9ICVkXG4iLCByYXRlKTsKKworCWlmIChjaGFuLT5yYXRlID09IHJhdGUpCisJCWdvdG8gb3V0OworCWlmIChjYXJkLT5sb2NrZWRfcmF0ZSkgeworCQljaGFuLT5yYXRlID0gNDgwMDA7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChyYXRlID4gNDgwMDApCQlyYXRlID0gNDgwMDA7CisJaWYgKHJhdGUgPCA0MDAwKSAJCXJhdGUgPSA0MDAwOworCisJcmF0ZV9yZWcgPSBjaGFuLT5pc19yZWNvcmQgPyBBQzk3X1BDTV9MUl9BRENfUkFURSA6CisJCQkgICAgQUM5N19QQ01fRlJPTlRfREFDX1JBVEU7CisKKwkvKiBTYXZlIGN1cnJlbnQgc3RhdGUgKi8KKwlkYWNwPXZpYV9hYzk3X3JlYWRfcmVnKGFjOTcsIEFDOTdfUE9XRVJfQ09OVFJPTCk7CisJbWFzdF92b2wgPSB2aWFfYWM5N19yZWFkX3JlZyhhYzk3LCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPKTsKKwltb25vX3ZvbCA9IHZpYV9hYzk3X3JlYWRfcmVnKGFjOTcsIEFDOTdfTUFTVEVSX1ZPTF9NT05PKTsKKwlwaG9uZV92b2wgPSB2aWFfYWM5N19yZWFkX3JlZyhhYzk3LCBBQzk3X0hFQURQSE9ORV9WT0wpOworCXBjbV92b2wgPSB2aWFfYWM5N19yZWFkX3JlZyhhYzk3LCBBQzk3X1BDTU9VVF9WT0wpOworCS8qIE11dGUgLSBsYXJnZWx5IHJlZHVjZXMgcG9wcGluZyAqLworCXZpYV9hYzk3X3dyaXRlX3JlZyhhYzk3LCBBQzk3X01BU1RFUl9WT0xfU1RFUkVPLCBtdXRlX3ZvbCk7CisJdmlhX2FjOTdfd3JpdGVfcmVnKGFjOTcsIEFDOTdfTUFTVEVSX1ZPTF9NT05PLCBtdXRlX3ZvbCk7CisJdmlhX2FjOTdfd3JpdGVfcmVnKGFjOTcsIEFDOTdfSEVBRFBIT05FX1ZPTCwgbXV0ZV92b2wpOworICAgICAgIAl2aWFfYWM5N193cml0ZV9yZWcoYWM5NywgQUM5N19QQ01PVVRfVk9MLCBtdXRlX3ZvbCk7CisJLyogUG93ZXIgZG93biB0aGUgREFDICovCisJdmlhX2FjOTdfd3JpdGVfcmVnKGFjOTcsIEFDOTdfUE9XRVJfQ09OVFJPTCwgZGFjcHwweDAyMDApOworCisgICAgICAgIC8qIFNldCBuZXcgcmF0ZSAqLworCXZpYV9hYzk3X3dyaXRlX3JlZyAoYWM5NywgcmF0ZV9yZWcsIHJhdGUpOworCisJLyogUG93ZXIgREFDIGJhY2sgdXAgKi8KKwl2aWFfYWM5N193cml0ZV9yZWcoYWM5NywgQUM5N19QT1dFUl9DT05UUk9MLCBkYWNwKTsKKwl1ZGVsYXkgKDIwMCk7IC8qIHJlZHVjZXMgcG9wcGluZyAqLworCisJLyogUmVzdG9yZSB2b2x1bWVzICovCisJdmlhX2FjOTdfd3JpdGVfcmVnKGFjOTcsIEFDOTdfTUFTVEVSX1ZPTF9TVEVSRU8sIG1hc3Rfdm9sKTsKKwl2aWFfYWM5N193cml0ZV9yZWcoYWM5NywgQUM5N19NQVNURVJfVk9MX01PTk8sIG1vbm9fdm9sKTsKKwl2aWFfYWM5N193cml0ZV9yZWcoYWM5NywgQUM5N19IRUFEUEhPTkVfVk9MLCBwaG9uZV92b2wpOworCXZpYV9hYzk3X3dyaXRlX3JlZyhhYzk3LCBBQzk3X1BDTU9VVF9WT0wsIHBjbV92b2wpOworCisJLyogdGhlIGhhcmR3YXJlIG1pZ2h0IHJldHVybiBhIHZhbHVlIGRpZmZlcmVudCB0aGFuIHdoYXQgd2UKKwkgKiBwYXNzZWQgdG8gaXQsIHNvIHJlYWQgdGhlIHJhdGUgdmFsdWUgYmFjayBmcm9tIGhhcmR3YXJlCisJICogdG8gc2VlIHdoYXQgd2UgY2FtZSB1cCB3aXRoCisJICovCisJY2hhbi0+cmF0ZSA9IHZpYV9hYzk3X3JlYWRfcmVnIChhYzk3LCByYXRlX3JlZyk7CisKKwlpZiAoY2hhbi0+cmF0ZSA9PSAwKSB7CisJCWNhcmQtPmxvY2tlZF9yYXRlID0gMTsKKwkJY2hhbi0+cmF0ZSA9IDQ4MDAwOworCQlwcmludGsgKEtFUk5fV0FSTklORyBQRlggIkNvZGVjIHJhdGUgbG9ja2VkIGF0IDQ4S2h6XG4iKTsKKwl9CisKK291dDoKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIHJhdGUgJWQgSHpcbiIsIGNoYW4tPnJhdGUpOworCXJldHVybiBjaGFuLT5yYXRlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ2hhbm5lbC1zcGVjaWZpYyBvcGVyYXRpb25zCisgKgorICoKKyAqLworCisKKy8qKgorICoJdmlhX2NoYW5faW5pdF9kZWZhdWx0cyAtIEluaXRpYWxpemUgYSBzdHJ1Y3QgdmlhX2NoYW5uZWwKKyAqCUBjYXJkOiBQcml2YXRlIGF1ZGlvIGNoaXAgaW5mbworICoJQGNoYW46IENoYW5uZWwgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqCisgKglaZXJvIEBjaGFuLCBhbmQgdGhlbiBzZXQgYWxsIHN0YXRpYyBkZWZhdWx0cyBmb3IgdGhlIHN0cnVjdHVyZS4KKyAqLworCitzdGF0aWMgdm9pZCB2aWFfY2hhbl9pbml0X2RlZmF1bHRzIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwltZW1zZXQgKGNoYW4sIDAsIHNpemVvZiAoKmNoYW4pKTsKKworCWlmKGNhcmQtPmludG1hc2spCisJCWNoYW4tPmludG1hc2sgPSAweDIzOwkvKiBUdXJuIG9uIHRoZSBJUlEgYml0cyAqLworCQkKKwlpZiAoY2hhbiA9PSAmY2FyZC0+Y2hfb3V0KSB7CisJCWNoYW4tPm5hbWUgPSAiUENNLU9VVCI7CisJCWlmKGNhcmQtPnNpeGNoYW5uZWwpCisJCXsKKwkJCWNoYW4tPmlvYmFzZSA9IGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX01VTFRJX09VVF9DSEFOOworCQkJY2hhbi0+aXNfbXVsdGkgPSAxOworCQkJRFBSSU5USygiVXNpbmcgbXVsdGljaGFubmVsIGZvciBwY20gb3V0XG4iKTsKKwkJfQorCQllbHNlCisJCQljaGFuLT5pb2Jhc2UgPSBjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9QQ01fT1VUX0NIQU47CisJfSBlbHNlIGlmIChjaGFuID09ICZjYXJkLT5jaF9pbikgeworCQljaGFuLT5uYW1lID0gIlBDTS1JTiI7CisJCWNoYW4tPmlvYmFzZSA9IGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX1BDTV9JTl9DSEFOOworCQljaGFuLT5pc19yZWNvcmQgPSAxOworCX0gZWxzZSBpZiAoY2hhbiA9PSAmY2FyZC0+Y2hfZm0pIHsKKwkJY2hhbi0+bmFtZSA9ICJQQ00tT1VULUZNIjsKKwkJY2hhbi0+aW9iYXNlID0gY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfRk1fT1VUX0NIQU47CisJfSBlbHNlIHsKKwkJQlVHKCk7CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCAoJmNoYW4tPndhaXQpOworCisJY2hhbi0+cGNtX2ZtdCA9IFZJQV9QQ01fRk1UX01BU0s7CisJY2hhbi0+aXNfZW5hYmxlZCA9IDE7CisKKwljaGFuLT5mcmFnX251bWJlciA9IDA7CisgICAgICAgIGNoYW4tPmZyYWdfc2l6ZSA9IDA7CisJYXRvbWljX3NldCgmY2hhbi0+bl9mcmFncywgMCk7CisJYXRvbWljX3NldCAoJmNoYW4tPmh3X3B0ciwgMCk7Cit9CisKKy8qKgorICogICAgICB2aWFfY2hhbl9pbml0IC0gSW5pdGlhbGl6ZSBQQ00gY2hhbm5lbAorICogICAgICBAY2FyZDogUHJpdmF0ZSBhdWRpbyBjaGlwIGluZm8KKyAqICAgICAgQGNoYW46IENoYW5uZWwgdG8gYmUgaW5pdGlhbGl6ZWQKKyAqCisgKiAgICAgIFBlcmZvcm1zIHNvbWUgb2YgdGhlIHByZXBhcmF0aW9ucyBuZWNlc3NhcnkgdG8gYmVnaW4KKyAqICAgICAgdXNpbmcgYSBQQ00gY2hhbm5lbC4KKyAqCisgKiAgICAgIEN1cnJlbnRseSB0aGUgcHJlcGFyYXRpb25zIGNvbnNpc3Qgb2YKKyAqICAgICAgc2V0dGluZyB0aGUgUENNIGNoYW5uZWwgdG8gYSBrbm93biBzdGF0ZS4KKyAqLworCisKK3N0YXRpYyB2b2lkIHZpYV9jaGFuX2luaXQgKHN0cnVjdCB2aWFfaW5mbyAqY2FyZCwgc3RydWN0IHZpYV9jaGFubmVsICpjaGFuKQoreworCisgICAgICAgIERQUklOVEsgKCJFTlRFUlxuIik7CisKKwkvKiBiemVybyBjaGFubmVsIHN0cnVjdHVyZSwgYW5kIGluaXQgbWVtYmVycyB0byBkZWZhdWx0cyAqLworICAgICAgICB2aWFfY2hhbl9pbml0X2RlZmF1bHRzIChjYXJkLCBjaGFuKTsKKworICAgICAgICAvKiBzdG9wIGFueSBleGlzdGluZyBjaGFubmVsIG91dHB1dCAqLworICAgICAgICB2aWFfY2hhbl9jbGVhciAoY2FyZCwgY2hhbik7CisgICAgICAgIHZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2hhbi0+aW9iYXNlKTsKKyAgICAgICAgdmlhX2NoYW5fcGNtX2ZtdCAoY2hhbiwgMSk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKy8qKgorICoJdmlhX2NoYW5fYnVmZmVyX2luaXQgLSBJbml0aWFsaXplIFBDTSBjaGFubmVsIGJ1ZmZlcgorICoJQGNhcmQ6IFByaXZhdGUgYXVkaW8gY2hpcCBpbmZvCisgKglAY2hhbjogQ2hhbm5lbCB0byBiZSBpbml0aWFsaXplZAorICoKKyAqCVBlcmZvcm1zIHNvbWUgb2YgdGhlIHByZXBhcmF0aW9ucyBuZWNlc3NhcnkgdG8gYmVnaW4KKyAqCXVzaW5nIGEgUENNIGNoYW5uZWwuCisgKgorICoJQ3VycmVudGx5IHRoZSBwcmVwYXJhdGlvbnMgaW5jbHVkZSBhbGxvY2F0aW5nIHRoZQorICoJc2NhdHRlci1nYXRoZXIgRE1BIHRhYmxlIGFuZCBidWZmZXJzLAorICoJYW5kIHBhc3NpbmcgdGhlCisgKglhZGRyZXNzIG9mIHRoZSBETUEgdGFibGUgdG8gdGhlIGhhcmR3YXJlLgorICoKKyAqCU5vdGUgdGhhdCBzcGVjaWFsIGNhcmUgaXMgdGFrZW4gd2hlbiBwYXNzaW5nIHRoZQorICoJRE1BIHRhYmxlIGFkZHJlc3MgdG8gaGFyZHdhcmUsIGJlY2F1c2UgaXQgd2FzIGZvdW5kCisgKglkdXJpbmcgZHJpdmVyIGRldmVsb3BtZW50IHRoYXQgdGhlIGhhcmR3YXJlIGRpZCBub3QKKyAqCWFsd2F5cyAidGFrZSIgdGhlIGFkZHJlc3MuCisgKi8KKworc3RhdGljIGludCB2aWFfY2hhbl9idWZmZXJfaW5pdCAoc3RydWN0IHZpYV9pbmZvICpjYXJkLCBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4pCit7CisJaW50IHBhZ2UsIG9mZnNldDsKKwlpbnQgaTsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKworCWNoYW4tPmludG1hc2sgPSAwOworCWlmKGNhcmQtPmludG1hc2spCisJCWNoYW4tPmludG1hc2sgPSAweDIzOwkvKiBUdXJuIG9uIHRoZSBJUlEgYml0cyAqLworCQkKKwlpZiAoY2hhbi0+c2d0YWJsZSAhPSBOVUxMKSB7CisJCURQUklOVEsgKCJFWElUXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogYWxsb2MgRE1BLWFibGUgbWVtb3J5IGZvciBzY2F0dGVyLWdhdGhlciB0YWJsZSAqLworCWNoYW4tPnNndGFibGUgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAoY2FyZC0+cGRldiwKKwkJKHNpemVvZiAoc3RydWN0IHZpYV9zZ2RfdGFibGUpICogY2hhbi0+ZnJhZ19udW1iZXIpLAorCQkmY2hhbi0+c2d0X2hhbmRsZSk7CisJaWYgKCFjaGFuLT5zZ3RhYmxlKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJETUEgdGFibGUgYWxsb2MgZmFpbCwgYWJvcnRpbmdcbiIpOworCQlEUFJJTlRLICgiRVhJVFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCW1lbXNldCAoKHZvaWQqKWNoYW4tPnNndGFibGUsIDAsCisJCShzaXplb2YgKHN0cnVjdCB2aWFfc2dkX3RhYmxlKSAqIGNoYW4tPmZyYWdfbnVtYmVyKSk7CisKKwkvKiBhbGxvYyBETUEtYWJsZSBtZW1vcnkgZm9yIHNjYXR0ZXItZ2F0aGVyIGJ1ZmZlcnMgKi8KKworCWNoYW4tPnBhZ2VfbnVtYmVyID0gKGNoYW4tPmZyYWdfbnVtYmVyICogY2hhbi0+ZnJhZ19zaXplKSAvIFBBR0VfU0laRSArCisJCQkgICAgKCgoY2hhbi0+ZnJhZ19udW1iZXIgKiBjaGFuLT5mcmFnX3NpemUpICUgUEFHRV9TSVpFKSA/IDEgOiAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFuLT5wYWdlX251bWJlcjsgaSsrKSB7CisJCWNoYW4tPnBndGJsW2ldLmNwdWFkZHIgPSBwY2lfYWxsb2NfY29uc2lzdGVudCAoY2FyZC0+cGRldiwgUEFHRV9TSVpFLAorCQkJCQkgICAgICAmY2hhbi0+cGd0YmxbaV0uaGFuZGxlKTsKKworCQlpZiAoIWNoYW4tPnBndGJsW2ldLmNwdWFkZHIpIHsKKwkJCWNoYW4tPnBhZ2VfbnVtYmVyID0gaTsKKwkJCWdvdG8gZXJyX291dF9ub21lbTsKKwkJfQorCisjaWZuZGVmIFZJQV9OREVCVUcKKyAgICAgICAgICAgICAgICBtZW1zZXQgKGNoYW4tPnBndGJsW2ldLmNwdWFkZHIsIDB4QkMsIGNoYW4tPmZyYWdfc2l6ZSk7CisjZW5kaWYKKworI2lmIDEKKyAgICAgICAgICAgICAgICBEUFJJTlRLICgiZG1hYnVmX3BnICMlZCAoaD0lbHgsIHYycD0lbHgsIGE9JXApXG4iLAorCQkJaSwgKGxvbmcpY2hhbi0+cGd0YmxbaV0uaGFuZGxlLAorCQkJdmlydF90b19waHlzKGNoYW4tPnBndGJsW2ldLmNwdWFkZHIpLAorCQkJY2hhbi0+cGd0YmxbaV0uY3B1YWRkcik7CisjZW5kaWYKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hhbi0+ZnJhZ19udW1iZXI7IGkrKykgeworCisJCXBhZ2UgPSBpIC8gKFBBR0VfU0laRSAvIGNoYW4tPmZyYWdfc2l6ZSk7CisJCW9mZnNldCA9IChpICUgKFBBR0VfU0laRSAvIGNoYW4tPmZyYWdfc2l6ZSkpICogY2hhbi0+ZnJhZ19zaXplOworCisJCWNoYW4tPnNndGFibGVbaV0uY291bnQgPSBjcHVfdG9fbGUzMiAoY2hhbi0+ZnJhZ19zaXplIHwgVklBX0ZMQUcpOworCQljaGFuLT5zZ3RhYmxlW2ldLmFkZHIgPSBjcHVfdG9fbGUzMiAoY2hhbi0+cGd0YmxbcGFnZV0uaGFuZGxlICsgb2Zmc2V0KTsKKworI2lmIDEKKwkJRFBSSU5USyAoImRtYWJ1ZiAjJWQgKDMyKGgpPSVseClcbiIsCisJCQkgaSwKKwkJCSAobG9uZyljaGFuLT5zZ3RhYmxlW2ldLmFkZHIpOworI2VuZGlmCisJfQorCisJLyogb3ZlcndyaXRlIHRoZSBsYXN0IGJ1ZmZlciBpbmZvcm1hdGlvbiAqLworCWNoYW4tPnNndGFibGVbY2hhbi0+ZnJhZ19udW1iZXIgLSAxXS5jb3VudCA9IGNwdV90b19sZTMyIChjaGFuLT5mcmFnX3NpemUgfCBWSUFfRU9MKTsKKworCS8qIHNldCBsb2NhdGlvbiBvZiBETUEtYWJsZSBzY2F0dGVyLWdhdGhlciBpbmZvIHRhYmxlICovCisJRFBSSU5USyAoIm91dGwgKDB4JVgsIDB4JTA0bFgpXG4iLAorCQljaGFuLT5zZ3RfaGFuZGxlLCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX1RBQkxFX0FERFIpOworCisJdmlhX2FjOTdfd2FpdF9pZGxlIChjYXJkKTsKKwlvdXRsIChjaGFuLT5zZ3RfaGFuZGxlLCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX1RBQkxFX0FERFIpOworCXVkZWxheSAoMjApOworCXZpYV9hYzk3X3dhaXRfaWRsZSAoY2FyZCk7CisJLyogbG9hZCBubyByYXRlIGFkYXB0aW9uLCBzdGVyZW8gMTZiaXQsIHNldCB1cCByaW5nIHNsb3RzICovCisJaWYoY2FyZC0+c2l4Y2hhbm5lbCkKKwl7CisJCWlmKCFjaGFuLT5pc19tdWx0aSkKKwkJeworCQkJb3V0bCAoMHhGRkZGRiB8ICgweDMgPDwgMjApIHwgKGNoYW4tPmZyYWdfbnVtYmVyIDw8IDI0KSwgY2hhbi0+aW9iYXNlICsgVklBX1BDTV9TVE9QUkFURSk7CisJCQl1ZGVsYXkgKDIwKTsKKwkJCXZpYV9hYzk3X3dhaXRfaWRsZSAoY2FyZCk7CisJCX0KKwl9CisKKwlEUFJJTlRLICgiaW5sICgweCVsWCkgPSAleFxuIiwKKwkJY2hhbi0+aW9iYXNlICsgVklBX1BDTV9UQUJMRV9BRERSLAorCQlpbmwoY2hhbi0+aW9iYXNlICsgVklBX1BDTV9UQUJMRV9BRERSKSk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfbm9tZW06CisJcHJpbnRrIChLRVJOX0VSUiBQRlggIkRNQSBidWZmZXIgYWxsb2MgZmFpbCwgYWJvcnRpbmdcbiIpOworCXZpYV9jaGFuX2J1ZmZlcl9mcmVlIChjYXJkLCBjaGFuKTsKKwlEUFJJTlRLICgiRVhJVFxuIik7CisJcmV0dXJuIC1FTk9NRU07Cit9CisKKworLyoqCisgKgl2aWFfY2hhbl9mcmVlIC0gUmVsZWFzZSBhIFBDTSBjaGFubmVsCisgKglAY2FyZDogUHJpdmF0ZSBhdWRpbyBjaGlwIGluZm8KKyAqCUBjaGFuOiBDaGFubmVsIHRvIGJlIHJlbGVhc2VkCisgKgorICoJUGVyZm9ybXMgYWxsIHRoZSBmdW5jdGlvbnMgbmVjZXNzYXJ5IHRvIGNsZWFuIHVwCisgKglhbiBpbml0aWFsaXplZCBjaGFubmVsLgorICoKKyAqCUN1cnJlbnRseSB0aGVzZSBmdW5jdGlvbnMgaW5jbHVkZSBkaXNhYmxlZCBhbnkKKyAqCWFjdGl2ZSBETUEgb3BlcmF0aW9ucywgc2V0dGluZyB0aGUgUENNIGNoYW5uZWwKKyAqCWJhY2sgdG8gYSBrbm93biBzdGF0ZSwgYW5kIHJlbGVhc2luZyBhbnkgYWxsb2NhdGVkCisgKglzb3VuZCBidWZmZXJzLgorICovCisKK3N0YXRpYyB2b2lkIHZpYV9jaGFuX2ZyZWUgKHN0cnVjdCB2aWFfaW5mbyAqY2FyZCwgc3RydWN0IHZpYV9jaGFubmVsICpjaGFuKQoreworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlzcGluX2xvY2tfaXJxICgmY2FyZC0+bG9jayk7CisKKwkvKiBzdG9wIGFueSBleGlzdGluZyBjaGFubmVsIG91dHB1dCAqLworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2hhbi0+aW9iYXNlKTsKKwl2aWFfY2hhbl9zdG9wIChjaGFuLT5pb2Jhc2UpOworCXZpYV9jaGFuX3N0YXR1c19jbGVhciAoY2hhbi0+aW9iYXNlKTsKKworCXNwaW5fdW5sb2NrX2lycSAoJmNhcmQtPmxvY2spOworCisJc3luY2hyb25pemVfaXJxKGNhcmQtPnBkZXYtPmlycSk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHZpYV9jaGFuX2J1ZmZlcl9mcmVlIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwlpbnQgaTsKKworICAgICAgICBEUFJJTlRLICgiRU5URVJcbiIpOworCisJLyogemVybyBsb2NhdGlvbiBvZiBETUEtYWJsZSBzY2F0dGVyLWdhdGhlciBpbmZvIHRhYmxlICovCisJdmlhX2FjOTdfd2FpdF9pZGxlKGNhcmQpOworCW91dGwgKDAsIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fVEFCTEVfQUREUik7CisKKwlmb3IgKGkgPSAwOyBpIDwgY2hhbi0+cGFnZV9udW1iZXI7IGkrKykKKwkJaWYgKGNoYW4tPnBndGJsW2ldLmNwdWFkZHIpIHsKKwkJCXBjaV9mcmVlX2NvbnNpc3RlbnQgKGNhcmQtPnBkZXYsIFBBR0VfU0laRSwKKwkJCQkJICAgICBjaGFuLT5wZ3RibFtpXS5jcHVhZGRyLAorCQkJCQkgICAgIGNoYW4tPnBndGJsW2ldLmhhbmRsZSk7CisJCQljaGFuLT5wZ3RibFtpXS5jcHVhZGRyID0gTlVMTDsKKwkJCWNoYW4tPnBndGJsW2ldLmhhbmRsZSA9IDA7CisJCX0KKworCWNoYW4tPnBhZ2VfbnVtYmVyID0gMDsKKworCWlmIChjaGFuLT5zZ3RhYmxlKSB7CisJCXBjaV9mcmVlX2NvbnNpc3RlbnQgKGNhcmQtPnBkZXYsCisJCQkoc2l6ZW9mIChzdHJ1Y3QgdmlhX3NnZF90YWJsZSkgKiBjaGFuLT5mcmFnX251bWJlciksCisJCQkodm9pZCopY2hhbi0+c2d0YWJsZSwgY2hhbi0+c2d0X2hhbmRsZSk7CisJCWNoYW4tPnNndGFibGUgPSBOVUxMOworCX0KKworCURQUklOVEsgKCJFWElUXG4iKTsKK30KKworCisvKioKKyAqCXZpYV9jaGFuX3BjbV9mbXQgLSBVcGRhdGUgUENNIGNoYW5uZWwgc2V0dGluZ3MKKyAqCUBjaGFuOiBDaGFubmVsIHRvIGJlIHVwZGF0ZWQKKyAqCUByZXNldDogQm9vbGVhbi4gIElmIG5vbi16ZXJvLCBjaGFubmVsIHdpbGwgYmUgcmVzZXQKKyAqCQl0byA4LWJpdCBtb25vIG1vZGUuCisgKgorICoJU3RvcmVzIHRoZSBzZXR0aW5ncyBvZiB0aGUgY3VycmVudCBQQ00gZm9ybWF0LAorICoJOC1iaXQgb3IgMTYtYml0LCBhbmQgbW9uby9zdGVyZW8sIGludG8gdGhlCisgKgloYXJkd2FyZSBzZXR0aW5ncyBmb3IgdGhlIHNwZWNpZmllZCBjaGFubmVsLgorICoJSWYgQHJlc2V0IGlzIG5vbi16ZXJvLCB0aGUgY2hhbm5lbCBpcyByZXNldAorICoJdG8gOC1iaXQgbW9ubyBtb2RlLiAgT3RoZXJ3aXNlLCB0aGUgY2hhbm5lbAorICoJaXMgc2V0IHRvIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSBjaGFubmVsCisgKglpbmZvcm1hdGlvbiBzdHJ1Y3QgQGNoYW4uCisgKi8KKworc3RhdGljIHZvaWQgdmlhX2NoYW5fcGNtX2ZtdCAoc3RydWN0IHZpYV9jaGFubmVsICpjaGFuLCBpbnQgcmVzZXQpCit7CisJRFBSSU5USyAoIkVOVEVSLCBwY21fZm10PTB4JTAyWCwgcmVzZXQ9JXNcbiIsCisJCSBjaGFuLT5wY21fZm10LCByZXNldCA/ICJ5ZXMiIDogIm5vIik7CisKKwlhc3NlcnQgKGNoYW4gIT0gTlVMTCk7CisKKwlpZiAocmVzZXQpCisJeworCQkvKiByZXNldCB0byA4LWJpdCBtb25vIG1vZGUgKi8KKwkJY2hhbi0+cGNtX2ZtdCA9IDA7CisJCWNoYW4tPmNoYW5uZWxzID0gMTsKKwl9CisKKwkvKiBlbmFibGUgaW50ZXJydXB0cyBvbiBGTEFHIGFuZCBFT0wgKi8KKwljaGFuLT5wY21fZm10IHw9IFZJQV9DSEFOX1RZUEVfTUFTSzsKKworCS8qIGlmIHdlIGFyZSByZWNvcmRpbmcsIGVuYWJsZSByZWNvcmRpbmcgZmlmbyBiaXQgKi8KKwlpZiAoY2hhbi0+aXNfcmVjb3JkKQorCQljaGFuLT5wY21fZm10IHw9IFZJQV9QQ01fUkVDX0ZJRk87CisJLyogc2V0IGludGVycnVwdCBzZWxlY3QgYml0cyB3aGVyZSBhcHBsaWNhYmxlIChQQ00gaW4gJiBvdXQgY2hhbm5lbHMpICovCisJaWYgKCFjaGFuLT5pc19yZWNvcmQpCisJCWNoYW4tPnBjbV9mbXQgfD0gVklBX0NIQU5fVFlQRV9JTlRfU0VMRUNUOworCQorCURQUklOVEsoIlNFVCBGTVQgLSAlMDJ4ICUwMnhcbiIsIGNoYW4tPmludG1hc2sgLCBjaGFuLT5pc19tdWx0aSk7CisJCisJaWYoY2hhbi0+aW50bWFzaykKKwl7CisJCXUzMiBtOworCisJCS8qCisJCSAqCUNoYW5uZWwgMHg0IGlzIHVwIHRvIDYgeCAxNmJpdCBhbmQgaGFzIHRvIGJlCisJCSAqCXByb2dyYW1tZWQgZGlmZmVyZW50bHkgCisJCSAqLworCQkgCQkKKwkJaWYoY2hhbi0+aXNfbXVsdGkpCisJCXsKKwkJCXU4IGMgPSAwOworCQkJCisJCQkvKgorCQkJICoJTG9hZCB0aGUgdHlwZSBiaXQgZm9yIG51bSBjaGFubmVscworCQkJICoJYW5kIDgvMTZiaXQKKwkJCSAqLworCQkJIAorCQkJaWYoY2hhbi0+cGNtX2ZtdCAmIFZJQV9QQ01fRk1UXzE2QklUKQorCQkJCWMgPSAxIDw8IDc7CisJCQlpZihjaGFuLT5wY21fZm10ICYgVklBX1BDTV9GTVRfU1RFUkVPKQorCQkJCWMgfD0gKDI8PDQpOworCQkJZWxzZQorCQkJCWMgfD0gKDE8PDQpOworCQkJCQorCQkJb3V0YihjLCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX1RZUEUpOworCQkJCisJCQkvKgorCQkJICoJU2V0IHRoZSBjaGFubmVsIHN0ZWVyaW5nCisJCQkgKglNb25vCisJCQkgKgkJQ2hhbm5lbCAwIHRvIHNsb3QgMworCQkJICoJCUNoYW5uZWwgMCB0byBzbG90IDQKKwkJCSAqCVN0ZXJlbworCQkJICoJCUNoYW5uZWwgMCB0byBzbG90IDMKKwkJCSAqCQlDaGFubmVsIDEgdG8gc2xvdCA0CisJCQkgKi8KKwkJCSAKKwkJCXN3aXRjaChjaGFuLT5jaGFubmVscykKKwkJCXsKKwkJCQljYXNlIDE6CisJCQkJCW91dGwoMHhGRjAwMDAwMCB8ICgxPDwwKSB8ICgxPDw0KSAsIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDI6CisJCQkJCW91dGwoMHhGRjAwMDAwMCB8ICgxPDwwKSB8ICgyPDw0KSAsIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6CisJCQkJCW91dGwoMHhGRjAwMDAwMCB8ICgxPDwwKSB8ICgyPDw0KSB8ICgzPDw4KSB8ICg0PDwxMiksIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDY6CisJCQkJCW91dGwoMHhGRjAwMDAwMCB8ICgxPDwwKSB8ICgyPDw0KSB8ICg1PDw4KSB8ICg2PDwxMikgfCAoMzw8MTYpIHwgKDQ8PDIwKSwgY2hhbi0+aW9iYXNlICsgVklBX1BDTV9TVE9QUkFURSk7CisJCQkJCWJyZWFrOworCQkJfQkJCQkKKwkJfQorCQllbHNlCisJCXsKKwkJCS8qCisJCQkgKglOZXcgc3R5bGUsIHR1cm4gb2ZmIGNoYW5uZWwgdm9sdW1lCisJCQkgKgljb250cm9sLCBzZXQgYml0cyBpbiB0aGUgcmlnaHQgcmVnaXN0ZXIKKwkJCSAqLwkKKwkJCW91dGIoMHgwLCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX0xFRlRWT0wpOworCQkJb3V0YigweDAsIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fUklHSFRWT0wpOworCisJCQltID0gaW5sKGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUpOworCQkJbSAmPSB+KDM8PDIwKTsKKwkJCWlmKGNoYW4tPnBjbV9mbXQgJiBWSUFfUENNX0ZNVF9TVEVSRU8pCisJCQkJbSB8PSAoMSA8PCAyMCk7CisJCQlpZihjaGFuLT5wY21fZm10ICYgVklBX1BDTV9GTVRfMTZCSVQpCisJCQkJbSB8PSAoMSA8PCAyMSk7CisJCQlvdXRsKG0sIGNoYW4tPmlvYmFzZSArIFZJQV9QQ01fU1RPUFJBVEUpOworCQl9CQkKKwl9CisJZWxzZQorCQlvdXRiIChjaGFuLT5wY21fZm10LCBjaGFuLT5pb2Jhc2UgKyBWSUFfUENNX1RZUEUpOworCisKKwlEUFJJTlRLICgiRVhJVCwgcGNtX2ZtdCA9IDB4JTAyWCwgcmVnID0gMHglMDJYXG4iLAorCQkgY2hhbi0+cGNtX2ZtdCwKKwkJIGluYiAoY2hhbi0+aW9iYXNlICsgVklBX1BDTV9UWVBFKSk7Cit9CisKKworLyoqCisgKgl2aWFfY2hhbl9jbGVhciAtIFN0b3AgRE1BIGNoYW5uZWwgb3BlcmF0aW9uLCBhbmQgcmVzZXQgcG9pbnRlcnMKKyAqCUBjYXJkOiB0aGUgY2hpcCB0byBhY2Nlc3NlZAorICoJQGNoYW46IENoYW5uZWwgdG8gYmUgY2xlYXJlZAorICoKKyAqCUNhbGwgdmlhX2NoYW5fc3RvcCB0byBoYWx0IERNQSBvcGVyYXRpb25zLCBhbmQgdGhlbiByZXNldHMKKyAqCWFsbCBzb2Z0d2FyZSBwb2ludGVycyB3aGljaCB0cmFjayBETUEgb3BlcmF0aW9uLgorICovCisKK3N0YXRpYyB2b2lkIHZpYV9jaGFuX2NsZWFyIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCXZpYV9jaGFuX3N0b3AgKGNoYW4tPmlvYmFzZSk7CisJdmlhX2NoYW5fYnVmZmVyX2ZyZWUoY2FyZCwgY2hhbik7CisJY2hhbi0+aXNfYWN0aXZlID0gMDsKKwljaGFuLT5pc19tYXBwZWQgPSAwOworCWNoYW4tPmlzX2VuYWJsZWQgPSAxOworCWNoYW4tPnNsb3BfbGVuID0gMDsKKwljaGFuLT5zd19wdHIgPSAwOworCWNoYW4tPm5faXJxcyA9IDA7CisJYXRvbWljX3NldCAoJmNoYW4tPmh3X3B0ciwgMCk7CisJRFBSSU5USyAoIkVYSVRcbiIpOworfQorCisKKy8qKgorICoJdmlhX2NoYW5fc2V0X3NwZWVkIC0gU2V0IFBDTSBzYW1wbGUgcmF0ZSBmb3IgZ2l2ZW4gY2hhbm5lbAorICoJQGNhcmQ6IFByaXZhdGUgaW5mbyBmb3Igc3BlY2lmaWVkIGJvYXJkCisgKglAY2hhbjogQ2hhbm5lbCB3aG9zZSBzYW1wbGUgcmF0ZSB3aWxsIGJlIGFkanVzdGVkCisgKglAdmFsOiBOZXcgc2FtcGxlIHJhdGUsIGluIEtoegorICoKKyAqCUhlbHBlciBmdW5jdGlvbiBmb3IgdGhlICVTTkRDVExfRFNQX1NQRUVEIGlvY3RsLiAgT1NTIHNlbWFudGljcworICoJZGVtYW5kIHRoYXQgYWxsIGF1ZGlvIG9wZXJhdGlvbnMgaGFsdCAoaWYgdGhleSBhcmUgbm90IGFscmVhZHkKKyAqCWhhbHRlZCkgd2hlbiB0aGUgJVNORENUTF9EU1BfU1BFRUQgaXMgZ2l2ZW4uCisgKgorICoJVGhpcyBmdW5jdGlvbiBoYWx0cyBhbGwgYXVkaW8gb3BlcmF0aW9ucyBmb3IgdGhlIGdpdmVuIGNoYW5uZWwKKyAqCUBjaGFuLCBhbmQgdGhlbiBjYWxscyB2aWFfc2V0X3JhdGUgdG8gc2V0IHRoZSBhdWRpbyBoYXJkd2FyZQorICoJdG8gdGhlIG5ldyByYXRlLgorICovCisKK3N0YXRpYyBpbnQgdmlhX2NoYW5fc2V0X3NwZWVkIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsCisJCQkgICAgICAgc3RydWN0IHZpYV9jaGFubmVsICpjaGFuLCBpbnQgdmFsKQoreworCURQUklOVEsgKCJFTlRFUiwgcmVxdWVzdGVkIHJhdGUgPSAlZFxuIiwgdmFsKTsKKworCXZpYV9jaGFuX2NsZWFyIChjYXJkLCBjaGFuKTsKKworCXZhbCA9IHZpYV9zZXRfcmF0ZSAoY2FyZC0+YWM5NywgY2hhbiwgdmFsKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWRcbiIsIHZhbCk7CisJcmV0dXJuIHZhbDsKK30KKworCisvKioKKyAqCXZpYV9jaGFuX3NldF9mbXQgLSBTZXQgUENNIHNhbXBsZSBzaXplIGZvciBnaXZlbiBjaGFubmVsCisgKglAY2FyZDogUHJpdmF0ZSBpbmZvIGZvciBzcGVjaWZpZWQgYm9hcmQKKyAqCUBjaGFuOiBDaGFubmVsIHdob3NlIHNhbXBsZSBzaXplIHdpbGwgYmUgYWRqdXN0ZWQKKyAqCUB2YWw6IE5ldyBzYW1wbGUgc2l6ZSwgdXNlIHRoZSAlQUZNVF94eHggY29uc3RhbnRzCisgKgorICoJSGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgJVNORENUTF9EU1BfU0VURk1UIGlvY3RsLiAgT1NTIHNlbWFudGljcworICoJZGVtYW5kIHRoYXQgYWxsIGF1ZGlvIG9wZXJhdGlvbnMgaGFsdCAoaWYgdGhleSBhcmUgbm90IGFscmVhZHkKKyAqCWhhbHRlZCkgd2hlbiB0aGUgJVNORENUTF9EU1BfU0VURk1UIGlzIGdpdmVuLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gaGFsdHMgYWxsIGF1ZGlvIG9wZXJhdGlvbnMgZm9yIHRoZSBnaXZlbiBjaGFubmVsCisgKglAY2hhbiwgYW5kIHRoZW4gY2FsbHMgdmlhX2NoYW5fcGNtX2ZtdCB0byBzZXQgdGhlIGF1ZGlvIGhhcmR3YXJlCisgKgl0byB0aGUgbmV3IHNhbXBsZSBzaXplLCBlaXRoZXIgOC1iaXQgb3IgMTYtYml0LgorICovCisKK3N0YXRpYyBpbnQgdmlhX2NoYW5fc2V0X2ZtdCAoc3RydWN0IHZpYV9pbmZvICpjYXJkLAorCQkJICAgICBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4sIGludCB2YWwpCit7CisJRFBSSU5USyAoIkVOVEVSLCB2YWw9JXNcbiIsCisJCSB2YWwgPT0gQUZNVF9VOCA/ICJBRk1UX1U4IiA6CisJIAkgdmFsID09IEFGTVRfUzE2X0xFID8gIkFGTVRfUzE2X0xFIiA6CisJCSAidW5rbm93biIpOworCisJdmlhX2NoYW5fY2xlYXIgKGNhcmQsIGNoYW4pOworCisJYXNzZXJ0ICh2YWwgIT0gQUZNVF9RVUVSWSk7IC8qIHRoaXMgY2FzZSBpcyBoYW5kbGVkIGVsc2V3aGVyZSAqLworCisJc3dpdGNoICh2YWwpIHsKKwljYXNlIEFGTVRfUzE2X0xFOgorCQlpZiAoKGNoYW4tPnBjbV9mbXQgJiBWSUFfUENNX0ZNVF8xNkJJVCkgPT0gMCkgeworCQkJY2hhbi0+cGNtX2ZtdCB8PSBWSUFfUENNX0ZNVF8xNkJJVDsKKwkJCXZpYV9jaGFuX3BjbV9mbXQgKGNoYW4sIDApOworCQl9CisJCWJyZWFrOworCisJY2FzZSBBRk1UX1U4OgorCQlpZiAoY2hhbi0+cGNtX2ZtdCAmIFZJQV9QQ01fRk1UXzE2QklUKSB7CisJCQljaGFuLT5wY21fZm10ICY9IH5WSUFfUENNX0ZNVF8xNkJJVDsKKwkJCXZpYV9jaGFuX3BjbV9mbXQgKGNoYW4sIDApOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJRFBSSU5USyAoInVua25vd24gQUZNVDogMHglWFxuIiwgdmFsKTsKKwkJdmFsID0gQUZNVF9TMTZfTEU7CisJfQorCisJRFBSSU5USyAoIkVYSVRcbiIpOworCXJldHVybiB2YWw7Cit9CisKKworLyoqCisgKgl2aWFfY2hhbl9zZXRfc3RlcmVvIC0gRW5hYmxlIG9yIGRpc2FibGUgc3RlcmVvIGZvciBhIERNQSBjaGFubmVsCisgKglAY2FyZDogUHJpdmF0ZSBpbmZvIGZvciBzcGVjaWZpZWQgYm9hcmQKKyAqCUBjaGFuOiBDaGFubmVsIHdob3NlIHN0ZXJlbyBzZXR0aW5nIHdpbGwgYmUgYWRqdXN0ZWQKKyAqCUB2YWw6IE5ldyBzYW1wbGUgc2l6ZSwgdXNlIHRoZSAlQUZNVF94eHggY29uc3RhbnRzCisgKgorICoJSGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgJVNORENUTF9EU1BfQ0hBTk5FTFMgYW5kICVTTkRDVExfRFNQX1NURVJFTyBpb2N0bHMuICBPU1Mgc2VtYW50aWNzCisgKglkZW1hbmQgdGhhdCBhbGwgYXVkaW8gb3BlcmF0aW9ucyBoYWx0IChpZiB0aGV5IGFyZSBub3QgYWxyZWFkeQorICoJaGFsdGVkKSB3aGVuICVTTkRDVExfRFNQX0NIQU5ORUxTIG9yIFNORENUTF9EU1BfU1RFUkVPIGlzIGdpdmVuLgorICoKKyAqCVRoaXMgZnVuY3Rpb24gaGFsdHMgYWxsIGF1ZGlvIG9wZXJhdGlvbnMgZm9yIHRoZSBnaXZlbiBjaGFubmVsCisgKglAY2hhbiwgYW5kIHRoZW4gY2FsbHMgdmlhX2NoYW5fcGNtX2ZtdCB0byBzZXQgdGhlIGF1ZGlvIGhhcmR3YXJlCisgKgl0byBlbmFibGUgb3IgZGlzYWJsZSBzdGVyZW8uCisgKi8KKworc3RhdGljIGludCB2aWFfY2hhbl9zZXRfc3RlcmVvIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsCisJCQkgICAgICAgIHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiwgaW50IHZhbCkKK3sKKwlEUFJJTlRLICgiRU5URVIsIGNoYW5uZWxzID0gJWRcbiIsIHZhbCk7CisKKwl2aWFfY2hhbl9jbGVhciAoY2FyZCwgY2hhbik7CisKKwlzd2l0Y2ggKHZhbCkgeworCisJLyogbW9ubyAqLworCWNhc2UgMToKKwkJY2hhbi0+cGNtX2ZtdCAmPSB+VklBX1BDTV9GTVRfU1RFUkVPOworCQljaGFuLT5jaGFubmVscyA9IDE7CisJCXZpYV9jaGFuX3BjbV9mbXQgKGNoYW4sIDApOworCQlicmVhazsKKworCS8qIHN0ZXJlbyAqLworCWNhc2UgMjoKKwkJY2hhbi0+cGNtX2ZtdCB8PSBWSUFfUENNX0ZNVF9TVEVSRU87CisJCWNoYW4tPmNoYW5uZWxzID0gMjsKKwkJdmlhX2NoYW5fcGNtX2ZtdCAoY2hhbiwgMCk7CisJCWJyZWFrOworCisJY2FzZSA0OgorCWNhc2UgNjoKKwkJaWYoY2hhbi0+aXNfbXVsdGkpCisJCXsKKwkJCWNoYW4tPnBjbV9mbXQgfD0gVklBX1BDTV9GTVRfU1RFUkVPOworCQkJY2hhbi0+Y2hhbm5lbHMgPSB2YWw7CisJCQlicmVhazsKKwkJfQorCS8qIHVua25vd24gKi8KKwlkZWZhdWx0OgorCQl2YWwgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCB2YWwpOworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyBpbnQgdmlhX2NoYW5fc2V0X2J1ZmZlcmluZyAoc3RydWN0IHZpYV9pbmZvICpjYXJkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4sIGludCB2YWwpCit7CisJaW50IHNoaWZ0OworCisgICAgICAgIERQUklOVEsgKCJFTlRFUlxuIik7CisKKwkvKiBpbiBib3RoIGNhc2VzIHRoZSBidWZmZXIgY2Fubm90IGJlIGNoYW5nZWQgKi8KKwlpZiAoY2hhbi0+aXNfYWN0aXZlIHx8IGNoYW4tPmlzX21hcHBlZCkgeworCQlEUFJJTlRLICgiRVhJVFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNhbGxlZCBvdXRzaWRlIFNFVEZSQUdNRU5UICovCisJLyogc2V0IGRlZmF1bHRzIG9yIGRvIG5vdGhpbmcgKi8KKwlpZiAodmFsIDwgMCkgeworCisJCWlmIChjaGFuLT5mcmFnX3NpemUgJiYgY2hhbi0+ZnJhZ19udW1iZXIpCisJCQlnb3RvIG91dDsKKworCQlEUFJJTlRLICgiXG4iKTsKKworCQljaGFuLT5mcmFnX3NpemUgPSAoVklBX0RFRkFVTFRfRlJBR19USU1FICogY2hhbi0+cmF0ZSAqIGNoYW4tPmNoYW5uZWxzCisJCQkJICAgKiAoKGNoYW4tPnBjbV9mbXQgJiBWSUFfUENNX0ZNVF8xNkJJVCkgPyAyIDogMSkpIC8gMTAwMCAtIDE7CisKKwkJc2hpZnQgPSAwOworCQl3aGlsZSAoY2hhbi0+ZnJhZ19zaXplKSB7CisJCQljaGFuLT5mcmFnX3NpemUgPj49IDE7CisJCQlzaGlmdCsrOworCQl9CisJCWNoYW4tPmZyYWdfc2l6ZSA9IDEgPDwgc2hpZnQ7CisKKwkJY2hhbi0+ZnJhZ19udW1iZXIgPSAoVklBX0RFRkFVTFRfQlVGRkVSX1RJTUUgLyBWSUFfREVGQVVMVF9GUkFHX1RJTUUpOworCisJCURQUklOVEsgKCJzZXR0aW5nIGRlZmF1bHQgdmFsdWVzICVkICVkXG4iLCBjaGFuLT5mcmFnX3NpemUsIGNoYW4tPmZyYWdfbnVtYmVyKTsKKwl9IGVsc2UgeworCQljaGFuLT5mcmFnX3NpemUgPSAxIDw8ICh2YWwgJiAweEZGRkYpOworCQljaGFuLT5mcmFnX251bWJlciA9ICh2YWwgPj4gMTYpICYgMHhGRkZGOworCisJCURQUklOVEsgKCJ1c2luZyB1c2VyIHZhbHVlcyAlZCAlZFxuIiwgY2hhbi0+ZnJhZ19zaXplLCBjaGFuLT5mcmFnX251bWJlcik7CisJfQorCisJLyogcXVha2UzIHdhbnRzIGZyYWdfbnVtYmVyIHRvIGJlIGEgcG93ZXIgb2YgdHdvICovCisJc2hpZnQgPSAwOworCXdoaWxlIChjaGFuLT5mcmFnX251bWJlcikgeworCQljaGFuLT5mcmFnX251bWJlciA+Pj0gMTsKKwkJc2hpZnQrKzsKKwl9CisJY2hhbi0+ZnJhZ19udW1iZXIgPSAxIDw8IHNoaWZ0OworCisJaWYgKGNoYW4tPmZyYWdfc2l6ZSA+IFZJQV9NQVhfRlJBR19TSVpFKQorCQljaGFuLT5mcmFnX3NpemUgPSBWSUFfTUFYX0ZSQUdfU0laRTsKKwllbHNlIGlmIChjaGFuLT5mcmFnX3NpemUgPCBWSUFfTUlOX0ZSQUdfU0laRSkKKwkJY2hhbi0+ZnJhZ19zaXplID0gVklBX01JTl9GUkFHX1NJWkU7CisKKwlpZiAoY2hhbi0+ZnJhZ19udW1iZXIgPCBWSUFfTUlOX0ZSQUdfTlVNQkVSKQorICAgICAgICAgICAgICAgIGNoYW4tPmZyYWdfbnVtYmVyID0gVklBX01JTl9GUkFHX05VTUJFUjsKKyAgICAgICAgaWYgKGNoYW4tPmZyYWdfbnVtYmVyID4gVklBX01BWF9GUkFHX05VTUJFUikKKyAgICAgICAgCWNoYW4tPmZyYWdfbnVtYmVyID0gVklBX01BWF9GUkFHX05VTUJFUjsKKworCWlmICgoY2hhbi0+ZnJhZ19udW1iZXIgKiBjaGFuLT5mcmFnX3NpemUpIC8gUEFHRV9TSVpFID4gVklBX01BWF9CVUZGRVJfRE1BX1BBR0VTKQorCQljaGFuLT5mcmFnX251bWJlciA9IChWSUFfTUFYX0JVRkZFUl9ETUFfUEFHRVMgKiBQQUdFX1NJWkUpIC8gY2hhbi0+ZnJhZ19zaXplOworCitvdXQ6CisJaWYgKGNoYW4tPmlzX3JlY29yZCkKKwkJYXRvbWljX3NldCAoJmNoYW4tPm5fZnJhZ3MsIDApOworCWVsc2UKKwkJYXRvbWljX3NldCAoJmNoYW4tPm5fZnJhZ3MsIGNoYW4tPmZyYWdfbnVtYmVyKTsKKworCURQUklOVEsgKCJFWElUXG4iKTsKKworCXJldHVybiAwOworfQorCisjaWZkZWYgVklBX0NIQU5fRFVNUF9CVUZTCisvKioKKyAqCXZpYV9jaGFuX2R1bXBfYnVmcyAtIERpc3BsYXkgRE1BIHRhYmxlIGNvbnRlbnRzCisgKglAY2hhbjogQ2hhbm5lbCB3aG9zZSBETUEgdGFibGUgd2lsbCBiZSBkaXNwbGF5ZWQKKyAqCisgKglEZWJ1Z2dpbmcgZnVuY3Rpb24gd2hpY2ggZGlzcGxheXMgdGhlIGNvbnRlbnRzIG9mIHRoZQorICoJc2NhdHRlci1nYXRoZXIgRE1BIHRhYmxlIGZvciB0aGUgZ2l2ZW4gY2hhbm5lbCBAY2hhbi4KKyAqLworCitzdGF0aWMgdm9pZCB2aWFfY2hhbl9kdW1wX2J1ZnMgKHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjaGFuLT5mcmFnX251bWJlcjsgaSsrKSB7CisJCURQUklOVEsgKCIjJTAyZDogYWRkcj0leCwgY291bnQ9JXUsIGZsYWc9JWQsIGVvbD0lZFxuIiwKKwkJCSBpLCBjaGFuLT5zZ3RhYmxlW2ldLmFkZHIsCisJCQkgY2hhbi0+c2d0YWJsZVtpXS5jb3VudCAmIDB4MDBGRkZGRkYsCisJCQkgY2hhbi0+c2d0YWJsZVtpXS5jb3VudCAmIFZJQV9GTEFHID8gMSA6IDAsCisJCQkgY2hhbi0+c2d0YWJsZVtpXS5jb3VudCAmIFZJQV9FT0wgPyAxIDogMCk7CisJfQorCURQUklOVEsgKCJidWZfaW5fdXNlID0gJWQsIG5leHRidWYgPSAlZFxuIiwKKwkJIGF0b21pY19yZWFkICgmY2hhbi0+YnVmX2luX3VzZSksCisJCSBhdG9taWNfcmVhZCAoJmNoYW4tPnN3X3B0cikpOworfQorI2VuZGlmIC8qIFZJQV9DSEFOX0RVTVBfQlVGUyAqLworCisKKy8qKgorICoJdmlhX2NoYW5fZmx1c2hfZnJhZyAtIEZsdXNoIHBhcnRpYWxseS1mdWxsIHBsYXliYWNrIGJ1ZmZlciB0byBoYXJkd2FyZQorICoJQGNoYW46IENoYW5uZWwgd2hvc2UgRE1BIHRhYmxlIHdpbGwgYmUgZmx1c2hlZAorICoKKyAqCUZsdXNoZXMgcGFydGlhbGx5LWZ1bGwgcGxheWJhY2sgYnVmZmVyIHRvIGhhcmR3YXJlLgorICovCisKK3N0YXRpYyB2b2lkIHZpYV9jaGFuX2ZsdXNoX2ZyYWcgKHN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbikKK3sKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0IChjaGFuLT5zbG9wX2xlbiA+IDApOworCisJaWYgKGNoYW4tPnN3X3B0ciA9PSAoY2hhbi0+ZnJhZ19udW1iZXIgLSAxKSkKKwkJY2hhbi0+c3dfcHRyID0gMDsKKwllbHNlCisJCWNoYW4tPnN3X3B0cisrOworCisJY2hhbi0+c2xvcF9sZW4gPSAwOworCisJYXNzZXJ0IChhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpID4gMCk7CisJYXRvbWljX2RlYyAoJmNoYW4tPm5fZnJhZ3MpOworCisJRFBSSU5USyAoIkVYSVRcbiIpOworfQorCisKKworLyoqCisgKgl2aWFfY2hhbl9tYXliZV9zdGFydCAtIEluaXRpYXRlIGF1ZGlvIGhhcmR3YXJlIERNQSBvcGVyYXRpb24KKyAqCUBjaGFuOiBDaGFubmVsIHdob3NlIERNQSBpcyB0byBiZSBzdGFydGVkCisgKgorICoJSW5pdGlhdGUgRE1BIG9wZXJhdGlvbiwgaWYgdGhlIERNQSBlbmdpbmUgZm9yIHRoZSBnaXZlbgorICoJY2hhbm5lbCBAY2hhbiBpcyBub3QgYWxyZWFkeSBhY3RpdmUuCisgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHZpYV9jaGFuX21heWJlX3N0YXJ0IChzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4pCit7CisJYXNzZXJ0IChjaGFuLT5pc19hY3RpdmUgPT0gc2dfYWN0aXZlKGNoYW4tPmlvYmFzZSkpOworCisJRFBSSU5USyAoIk1BWUJFIFNUQVJUICVzXG4iLCBjaGFuLT5uYW1lKTsKKwlpZiAoIWNoYW4tPmlzX2FjdGl2ZSAmJiBjaGFuLT5pc19lbmFibGVkKSB7CisJCWNoYW4tPmlzX2FjdGl2ZSA9IDE7CisJCXNnX2JlZ2luIChjaGFuKTsKKwkJRFBSSU5USyAoInN0YXJ0aW5nIGNoYW5uZWwgJXNcbiIsIGNoYW4tPm5hbWUpOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIEludGVyZmFjZSB0byBhYzk3LWNvZGVjIG1vZHVsZQorICoKKyAqCisgKi8KKworLyoqCisgKgl2aWFfYWM5N193YWl0X2lkbGUgLSBXYWl0IHVudGlsIEFDOTcgY29kZWMgaXMgbm90IGJ1c3kKKyAqCUBjYXJkOiBQcml2YXRlIGluZm8gZm9yIHNwZWNpZmllZCBib2FyZAorICoKKyAqCVNsZWVwIHVudGlsIHRoZSBBQzk3IGNvZGVjIGlzIG5vIGxvbmdlciBidXN5LgorICoJUmV0dXJucyB0aGUgZmluYWwgdmFsdWUgcmVhZCBmcm9tIHRoZSBTR0QKKyAqCXJlZ2lzdGVyIGJlaW5nIHBvbGxlZC4KKyAqLworCitzdGF0aWMgdTggdmlhX2FjOTdfd2FpdF9pZGxlIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQpCit7CisJdTggdG1wODsKKwlpbnQgY291bnRlciA9IFZJQV9DT1VOVEVSX0xJTUlUOworCisJRFBSSU5USyAoIkVOVEVSL0VYSVRcbiIpOworCisJYXNzZXJ0IChjYXJkICE9IE5VTEwpOworCWFzc2VydCAoY2FyZC0+cGRldiAhPSBOVUxMKTsKKworCWRvIHsKKwkJdWRlbGF5ICgxNSk7CisKKwkJdG1wOCA9IGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDgzKTsKKwl9IHdoaWxlICgodG1wOCAmIFZJQV9DUjgzX0JVU1kpICYmIChjb3VudGVyLS0gPiAwKSk7CisKKwlpZiAodG1wOCAmIFZJQV9DUjgzX0JVU1kpCisJCXByaW50ayAoS0VSTl9XQVJOSU5HIFBGWCAidGltZW91dCB3YWl0aW5nIG9uIEFDOTcgY29kZWNcbiIpOworCXJldHVybiB0bXA4OworfQorCisKKy8qKgorICoJdmlhX2FjOTdfcmVhZF9yZWcgLSBSZWFkIEFDOTcgc3RhbmRhcmQgcmVnaXN0ZXIKKyAqCUBjb2RlYzogUG9pbnRlciB0byBnZW5lcmljIEFDOTcgY29kZWMgaW5mbworICoJQHJlZzogSW5kZXggb2YgQUM5NyByZWdpc3RlciB0byBiZSByZWFkCisgKgorICoJUmVhZCB0aGUgdmFsdWUgb2YgYSBzaW5nbGUgQUM5NyBjb2RlYyByZWdpc3RlciwKKyAqCWFzIGRlZmluZWQgYnkgdGhlIEludGVsIEFDOTcgc3BlY2lmaWNhdGlvbi4KKyAqCisgKglEZWZpbmVzIHRoZSBzdGFuZGFyZCBBQzk3IHJlYWQtcmVnaXN0ZXIgb3BlcmF0aW9uCisgKglyZXF1aXJlZCBieSB0aGUga2VybmVsJ3MgYWM5N19jb2RlYyBpbnRlcmZhY2UuCisgKgorICoJUmV0dXJucyB0aGUgMTYtYml0IHZhbHVlIHN0b3JlZCBpbiB0aGUgc3BlY2lmaWVkCisgKglyZWdpc3Rlci4KKyAqLworCitzdGF0aWMgdTE2IHZpYV9hYzk3X3JlYWRfcmVnIChzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMsIHU4IHJlZykKK3sKKwl1bnNpZ25lZCBsb25nIGRhdGE7CisJc3RydWN0IHZpYV9pbmZvICpjYXJkOworCWludCBjb3VudGVyOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAoY29kZWMgIT0gTlVMTCk7CisJYXNzZXJ0IChjb2RlYy0+cHJpdmF0ZV9kYXRhICE9IE5VTEwpOworCisJY2FyZCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisJCisJc3Bpbl9sb2NrKCZjYXJkLT5hYzk3X2xvY2spOworCisJLyogRXZlcnkgdGltZSB3ZSB3cml0ZSB0byByZWdpc3RlciA4MCB3ZSBjYXVzZSBhIHRyYW5zYWN0aW9uLgorCSAgIFRoZSBvbmx5IHNhZmUgd2F5IHRvIGNsZWFyIHRoZSB2YWxpZCBiaXQgaXMgdG8gd3JpdGUgaXQgYXQKKwkgICB0aGUgc2FtZSB0aW1lIGFzIHRoZSBjb21tYW5kICovCisJZGF0YSA9IChyZWcgPDwgMTYpIHwgVklBX0NSODBfUkVBRCB8IFZJQV9DUjgwX1ZBTElEOworCisJb3V0bCAoZGF0YSwgY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfQUM5N19DVFJMKTsKKwl1ZGVsYXkgKDIwKTsKKworCWZvciAoY291bnRlciA9IFZJQV9DT1VOVEVSX0xJTUlUOyBjb3VudGVyID4gMDsgY291bnRlci0tKSB7CisJCXVkZWxheSAoMSk7CisJCWlmICgoKChkYXRhID0gaW5sKGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX0FDOTdfQ1RSTCkpICYKKwkJICAgICAgKFZJQV9DUjgwX1ZBTElEfFZJQV9DUjgwX0JVU1kpKSA9PSBWSUFfQ1I4MF9WQUxJRCkpCisJCQlnb3RvIG91dDsKKwl9CisKKwlwcmludGsgKEtFUk5fV0FSTklORyBQRlggInRpbWVvdXQgd2hpbGUgcmVhZGluZyBBQzk3IGNvZGVjICgweCVsWClcbiIsIGRhdGEpOworCWdvdG8gZXJyX291dDsKKworb3V0OgorCS8qIE9uY2UgdGhlIHZhbGlkIGJpdCBoYXMgYmVjb21lIHNldCwgd2UgbXVzdCB3YWl0IGEgY29tcGxldGUgQUM5NworCSAgIGZyYW1lIGJlZm9yZSB0aGUgZGF0YSBoYXMgc2V0dGxlZC4gKi8KKwl1ZGVsYXkoMjUpOworCWRhdGEgPSAodW5zaWduZWQgbG9uZykgaW5sIChjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9BQzk3X0NUUkwpOworCisJb3V0YiAoMHgwMiwgY2FyZC0+YmFzZWFkZHIgKyAweDgzKTsKKworCWlmICgoKGRhdGEgJiAweDAwN0YwMDAwKSA+PiAxNikgPT0gcmVnKSB7CisJCURQUklOVEsgKCJFWElULCBzdWNjZXNzLCBkYXRhPTB4JWx4LCByZXR2YWw9MHglbHhcbiIsCisJCQkgZGF0YSwgZGF0YSAmIDB4MDAwMEZGRkYpOworCQlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwkJcmV0dXJuIGRhdGEgJiAweDAwMDBGRkZGOworCX0KKworCXByaW50ayAoS0VSTl9XQVJOSU5HICJ2aWE4MmN4eHhfYXVkaW86IG5vdCBvdXIgaW5kZXg6IHJlZz0weCV4LCBuZXdyZWc9MHglbHhcbiIsCisJCXJlZywgKChkYXRhICYgMHgwMDdGMDAwMCkgPj4gMTYpKTsKKworZXJyX291dDoKKwlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworfQorCisKKy8qKgorICoJdmlhX2FjOTdfd3JpdGVfcmVnIC0gV3JpdGUgQUM5NyBzdGFuZGFyZCByZWdpc3RlcgorICoJQGNvZGVjOiBQb2ludGVyIHRvIGdlbmVyaWMgQUM5NyBjb2RlYyBpbmZvCisgKglAcmVnOiBJbmRleCBvZiBBQzk3IHJlZ2lzdGVyIHRvIGJlIHdyaXR0ZW4KKyAqCUB2YWx1ZTogVmFsdWUgdG8gYmUgd3JpdHRlbiB0byBBQzk3IHJlZ2lzdGVyCisgKgorICoJV3JpdGUgdGhlIHZhbHVlIG9mIGEgc2luZ2xlIEFDOTcgY29kZWMgcmVnaXN0ZXIsCisgKglhcyBkZWZpbmVkIGJ5IHRoZSBJbnRlbCBBQzk3IHNwZWNpZmljYXRpb24uCisgKgorICoJRGVmaW5lcyB0aGUgc3RhbmRhcmQgQUM5NyB3cml0ZS1yZWdpc3RlciBvcGVyYXRpb24KKyAqCXJlcXVpcmVkIGJ5IHRoZSBrZXJuZWwncyBhYzk3X2NvZGVjIGludGVyZmFjZS4KKyAqLworCitzdGF0aWMgdm9pZCB2aWFfYWM5N193cml0ZV9yZWcgKHN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYywgdTggcmVnLCB1MTYgdmFsdWUpCit7CisJdTMyIGRhdGE7CisJc3RydWN0IHZpYV9pbmZvICpjYXJkOworCWludCBjb3VudGVyOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAoY29kZWMgIT0gTlVMTCk7CisJYXNzZXJ0IChjb2RlYy0+cHJpdmF0ZV9kYXRhICE9IE5VTEwpOworCisJY2FyZCA9IGNvZGVjLT5wcml2YXRlX2RhdGE7CisKKwlzcGluX2xvY2soJmNhcmQtPmFjOTdfbG9jayk7CisJCisJZGF0YSA9IChyZWcgPDwgMTYpICsgdmFsdWU7CisJb3V0bCAoZGF0YSwgY2FyZC0+YmFzZWFkZHIgKyBWSUFfQkFTRTBfQUM5N19DVFJMKTsKKwl1ZGVsYXkgKDEwKTsKKworCWZvciAoY291bnRlciA9IFZJQV9DT1VOVEVSX0xJTUlUOyBjb3VudGVyID4gMDsgY291bnRlci0tKSB7CisJCWlmICgoaW5iIChjYXJkLT5iYXNlYWRkciArIDB4ODMpICYgVklBX0NSODNfQlVTWSkgPT0gMCkKKwkJCWdvdG8gb3V0OworCisJCXVkZWxheSAoMTUpOworCX0KKworCXByaW50ayAoS0VSTl9XQVJOSU5HIFBGWCAidGltZW91dCBhZnRlciBBQzk3IGNvZGVjIHdyaXRlICgweCVYLCAweCVYKVxuIiwgcmVnLCB2YWx1ZSk7CisKK291dDoKKwlzcGluX3VubG9jaygmY2FyZC0+YWM5N19sb2NrKTsKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworc3RhdGljIGludCB2aWFfbWl4ZXJfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJaW50IG1pbm9yID0gaW1pbm9yKGlub2RlKTsKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBOVUxMOworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnZyOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCXdoaWxlICgocGRldiA9IHBjaV9maW5kX2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBwZGV2KSkgIT0gTlVMTCkgeworCQlkcnZyID0gcGNpX2Rldl9kcml2ZXIgKHBkZXYpOworCQlpZiAoZHJ2ciA9PSAmdmlhX2RyaXZlcikgeworCQkJYXNzZXJ0IChwY2lfZ2V0X2RydmRhdGEgKHBkZXYpICE9IE5VTEwpOworCisJCQljYXJkID0gcGNpX2dldF9kcnZkYXRhIChwZGV2KTsKKwkJCWlmIChjYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPT0gbWlub3IpCisJCQkJZ290byBtYXRjaDsKKwkJfQorCX0KKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVOT0RFVlxuIik7CisJcmV0dXJuIC1FTk9ERVY7CisKK21hdGNoOgorCWZpbGUtPnByaXZhdGVfZGF0YSA9IGNhcmQtPmFjOTc7CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKK30KKworc3RhdGljIGludCB2aWFfbWl4ZXJfaW9jdGwgKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCBhYzk3X2NvZGVjICpjb2RlYyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisJaW50IG5vbmJsb2NrID0gKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlpbnQgcmM7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0IChjb2RlYyAhPSBOVUxMKTsKKwljYXJkID0gY29kZWMtPnByaXZhdGVfZGF0YTsKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlyYyA9IHZpYV9zeXNjYWxsX2Rvd24gKGNhcmQsIG5vbmJsb2NrKTsKKwlpZiAocmMpIGdvdG8gb3V0OworCQorI2lmIDAKKwkvKgorCSAqCUludGVyY2VwdCB2b2x1bWUgY29udHJvbCBvbiA4MjMzIGFuZCA4MjM1CisJICovCisJaWYoY2FyZC0+dm9sdW1lKQorCXsKKwkJc3dpdGNoKGNtZCkKKwkJeworCQkJY2FzZSBTT1VORF9NSVhFUl9SRUFEX1ZPTFVNRToKKwkJCQlyZXR1cm4gY2FyZC0+bWl4ZXJfdm9sOworCQkJY2FzZSBTT1VORF9NSVhFUl9XUklURV9WT0xVTUU6CisJCQl7CisJCQkJaW50IHY7CisJCQkJaWYoZ2V0X3VzZXIodiwgKGludCAqKWFyZykpCisJCQkJeworCQkJCQlyYyA9IC1FRkFVTFQ7CisJCQkJCWdvdG8gb3V0OworCQkJCX0KKwkJCQljYXJkLT5taXhlcl92b2wgPSB2OworCQkJfQorCQl9CisJfQkJCisjZW5kaWYKKwlyYyA9IGNvZGVjLT5taXhlcl9pb2N0bChjb2RlYywgY21kLCBhcmcpOworCisJdXAgKCZjYXJkLT5zeXNjYWxsX3NlbSk7CisKK291dDoKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHZpYV9taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJPSB2aWFfbWl4ZXJfb3BlbiwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0gdmlhX21peGVyX2lvY3RsLAorfTsKKworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWFfYWM5N19yZXNldCAoc3RydWN0IHZpYV9pbmZvICpjYXJkKQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gY2FyZC0+cGRldjsKKwl1OCB0bXA4OworCXUxNiB0bXAxNjsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKHBkZXYgIT0gTlVMTCk7CisKKyNpZm5kZWYgTkRFQlVHCisJeworCQl1OCByNDAscjQxLHI0MixyNDMscjQ0LHI0ODsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDAsICZyNDApOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0MSwgJnI0MSk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQyLCAmcjQyKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDMsICZyNDMpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0NCwgJnI0NCk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQ4LCAmcjQ4KTsKKwkJRFBSSU5USyAoIlBDSSBjb25maWc6ICUwMlggJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYXG4iLAorCQkJcjQwLHI0MSxyNDIscjQzLHI0NCxyNDgpOworCisJCXNwaW5fbG9ja19pcnEgKCZjYXJkLT5sb2NrKTsKKwkJRFBSSU5USyAoInJlZ3M9PSUwMlggJTAyWCAlMDJYICUwOFggJTA4WCAlMDhYICUwOFhcbiIsCisJCQkgaW5iIChjYXJkLT5iYXNlYWRkciArIDB4MDApLAorCQkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAxKSwKKwkJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMiksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4MDQpLAorCQkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDBDKSwKKwkJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHg4MCksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4ODQpKTsKKwkJc3Bpbl91bmxvY2tfaXJxICgmY2FyZC0+bG9jayk7CisKKwl9CisjZW5kaWYKKworICAgICAgICAvKgorICAgICAgICAgKiBSZXNldCBBQzk3IGNvbnRyb2xsZXI6IGVuYWJsZSwgZGlzYWJsZSwgZW5hYmxlLAorICAgICAgICAgKiBwYXVzaW5nIGFmdGVyIGVhY2ggY29tbWFuZCBmb3IgZ29vZCBsdWNrLiAgT25seQorCSAqIGRvIHRoaXMgaWYgdGhlIGNvZGVjIGlzIG5vdCByZWFkeSwgYmVjYXVzZSBpdCBjYXVzZXMKKwkgKiBsb3VkIHBvcHMgYW5kIHN1Y2ggZHVlIHRvIHN1Y2ggYSBoYXJkIGNvZGVjIHJlc2V0LgorICAgICAgICAgKi8KKwlwY2lfcmVhZF9jb25maWdfYnl0ZSAocGRldiwgVklBX0FDTElOS19TVEFUVVMsICZ0bXA4KTsKKwlpZiAoKHRtcDggJiBWSUFfQ1I0MF9BQzk3X1JFQURZKSA9PSAwKSB7CisgICAgICAgIAlwY2lfd3JpdGVfY29uZmlnX2J5dGUgKHBkZXYsIFZJQV9BQ0xJTktfQ1RSTCwKKwkJCQkgICAgICAgVklBX0NSNDFfQUM5N19FTkFCTEUgfAorICAgICAgICAgICAgICAgIAkJICAgICAgIFZJQV9DUjQxX0FDOTdfUkVTRVQgfAorCQkJCSAgICAgICBWSUFfQ1I0MV9BQzk3X1dBS0VVUCk7CisgICAgICAgIAl1ZGVsYXkgKDEwMCk7CisKKyAgICAgICAgCXBjaV93cml0ZV9jb25maWdfYnl0ZSAocGRldiwgVklBX0FDTElOS19DVFJMLCAwKTsKKyAgICAgICAgCXVkZWxheSAoMTAwKTsKKworICAgICAgICAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChwZGV2LCBWSUFfQUNMSU5LX0NUUkwsCisJCQkJICAgICAgIFZJQV9DUjQxX0FDOTdfRU5BQkxFIHwKKwkJCQkgICAgICAgVklBX0NSNDFfUENNX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgCQkgICAgICAgVklBX0NSNDFfVlJBIHwgVklBX0NSNDFfQUM5N19SRVNFVCk7CisgICAgICAgIAl1ZGVsYXkgKDEwMCk7CisJfQorCisJLyogTWFrZSBzdXJlIFZSQSBpcyBlbmFibGVkLCBpbiBjYXNlIHdlIGRpZG4ndCBkbyBhCisJICogY29tcGxldGUgY29kZWMgcmVzZXQsIGFib3ZlCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUgKHBkZXYsIFZJQV9BQ0xJTktfQ1RSTCwgJnRtcDgpOworCWlmICgoKHRtcDggJiBWSUFfQ1I0MV9WUkEpID09IDApIHx8CisJICAgICgodG1wOCAmIFZJQV9DUjQxX0FDOTdfRU5BQkxFKSA9PSAwKSB8fAorCSAgICAoKHRtcDggJiBWSUFfQ1I0MV9QQ01fRU5BQkxFKSA9PSAwKSB8fAorCSAgICAoKHRtcDggJiBWSUFfQ1I0MV9BQzk3X1JFU0VUKSA9PSAwKSkgeworICAgICAgICAJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChwZGV2LCBWSUFfQUNMSU5LX0NUUkwsCisJCQkJICAgICAgIFZJQV9DUjQxX0FDOTdfRU5BQkxFIHwKKwkJCQkgICAgICAgVklBX0NSNDFfUENNX0VOQUJMRSB8CisgICAgICAgICAgICAgICAgCQkgICAgICAgVklBX0NSNDFfVlJBIHwgVklBX0NSNDFfQUM5N19SRVNFVCk7CisgICAgICAgIAl1ZGVsYXkgKDEwMCk7CisJfQorCisJaWYoY2FyZC0+bGVnYWN5KQorCXsKKyNpZiAwIC8qIHRoaXMgYnJlYWtzIG9uIEs3TSAqLworCQkvKiBkaXNhYmxlIGxlZ2FjeSBzdHVmZiAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUgKHBkZXYsIDB4NDIsIDB4MDApOworCQl1ZGVsYXkoMTApOworI2VuZGlmCisKKwkJLyogcm91dGUgRk0gdHJhcCB0byBJUlEsIGRpc2FibGUgRk0gdHJhcCAqLworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUgKHBkZXYsIDB4NDgsIDB4MDUpOworCQl1ZGVsYXkoMTApOworCX0KKwkKKwkvKiBkaXNhYmxlIGFsbCBjb2RlYyBHUEkgaW50ZXJydXB0cyAqLworCW91dGwgKDAsIHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCkgKyAweDhDKTsKKworCS8qIFdBUk5JTkc6IHRoaXMgbGluZSBpcyBtYWdpYy4gIFJlbW92ZSB0aGlzCisJICogYW5kIHRoaW5ncyBicmVhay4gKi8KKwkvKiBlbmFibGUgdmFyaWFibGUgcmF0ZSAqLworIAl0bXAxNiA9IHZpYV9hYzk3X3JlYWRfcmVnIChjYXJkLT5hYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUyk7CisgCWlmICgodG1wMTYgJiAxKSA9PSAwKQorIAkJdmlhX2FjOTdfd3JpdGVfcmVnIChjYXJkLT5hYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgdG1wMTYgfCAxKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIHZvaWQgdmlhX2FjOTdfY29kZWNfd2FpdCAoc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjKQoreworCWFzc2VydCAoY29kZWMtPnByaXZhdGVfZGF0YSAhPSBOVUxMKTsKKwl2aWFfYWM5N193YWl0X2lkbGUgKGNvZGVjLT5wcml2YXRlX2RhdGEpOworfQorCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHZpYV9hYzk3X2luaXQgKHN0cnVjdCB2aWFfaW5mbyAqY2FyZCkKK3sKKwlpbnQgcmM7CisJdTE2IHRtcDE2OworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAoY2FyZCAhPSBOVUxMKTsKKworCWNhcmQtPmFjOTcgPSBhYzk3X2FsbG9jX2NvZGVjKCk7CisJaWYoY2FyZC0+YWM5NyA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKwkJCisJY2FyZC0+YWM5Ny0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKwljYXJkLT5hYzk3LT5jb2RlY19yZWFkID0gdmlhX2FjOTdfcmVhZF9yZWc7CisJY2FyZC0+YWM5Ny0+Y29kZWNfd3JpdGUgPSB2aWFfYWM5N193cml0ZV9yZWc7CisJY2FyZC0+YWM5Ny0+Y29kZWNfd2FpdCA9IHZpYV9hYzk3X2NvZGVjX3dhaXQ7CisKKwljYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlciAoJnZpYV9taXhlcl9mb3BzLCAtMSk7CisJaWYgKGNhcmQtPmFjOTctPmRldl9taXhlciA8IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byByZWdpc3RlciBBQzk3IG1peGVyLCBhYm9ydGluZ1xuIik7CisJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVJT1xuIik7CisJCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3KTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJcmMgPSB2aWFfYWM5N19yZXNldCAoY2FyZCk7CisJaWYgKHJjKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJ1bmFibGUgdG8gcmVzZXQgQUM5NyBjb2RlYywgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVycl9vdXQ7CisJfQorCQorCW1kZWxheSgxMCk7CisJCisJaWYgKGFjOTdfcHJvYmVfY29kZWMgKGNhcmQtPmFjOTcpID09IDApIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byBwcm9iZSBBQzk3IGNvZGVjLCBhYm9ydGluZ1xuIik7CisJCXJjID0gLUVJTzsKKwkJZ290byBlcnJfb3V0OworCX0KKworCS8qIGVuYWJsZSB2YXJpYWJsZSByYXRlICovCisJdG1wMTYgPSB2aWFfYWM5N19yZWFkX3JlZyAoY2FyZC0+YWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworCXZpYV9hYzk3X3dyaXRlX3JlZyAoY2FyZC0+YWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMsIHRtcDE2IHwgMSk7CisKKyAJLyoKKyAJICogSWYgd2UgY2Fubm90IGVuYWJsZSBWUkEsIHdlIGhhdmUgYSBsb2NrZWQtcmF0ZSBjb2RlYy4KKyAJICogV2UgdHJ5IGFnYWluIHRvIGVuYWJsZSBWUkEgYmVmb3JlIGFzc3VtaW5nIHNvLCBob3dldmVyLgorIAkgKi8KKyAJdG1wMTYgPSB2aWFfYWM5N19yZWFkX3JlZyAoY2FyZC0+YWM5NywgQUM5N19FWFRFTkRFRF9TVEFUVVMpOworIAlpZiAoKHRtcDE2ICYgMSkgPT0gMCkgeworIAkJdmlhX2FjOTdfd3JpdGVfcmVnIChjYXJkLT5hYzk3LCBBQzk3X0VYVEVOREVEX1NUQVRVUywgdG1wMTYgfCAxKTsKKyAJCXRtcDE2ID0gdmlhX2FjOTdfcmVhZF9yZWcgKGNhcmQtPmFjOTcsIEFDOTdfRVhURU5ERURfU1RBVFVTKTsKKyAJCWlmICgodG1wMTYgJiAxKSA9PSAwKSB7CisgCQkJY2FyZC0+bG9ja2VkX3JhdGUgPSAxOworIAkJCXByaW50ayAoS0VSTl9XQVJOSU5HIFBGWCAiQ29kZWMgcmF0ZSBsb2NrZWQgYXQgNDhLaHpcbiIpOworIAkJfQorIAl9CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworCitlcnJfb3V0OgorCXVucmVnaXN0ZXJfc291bmRfbWl4ZXIgKGNhcmQtPmFjOTctPmRldl9taXhlcik7CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOworCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3KTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgdmlhX2FjOTdfY2xlYW51cCAoc3RydWN0IHZpYV9pbmZvICpjYXJkKQoreworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisJYXNzZXJ0IChjYXJkLT5hYzk3LT5kZXZfbWl4ZXIgPj0gMCk7CisKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyIChjYXJkLT5hYzk3LT5kZXZfbWl4ZXIpOworCWFjOTdfcmVsZWFzZV9jb2RlYyhjYXJkLT5hYzk3KTsKKworCURQUklOVEsgKCJFWElUXG4iKTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogSW50ZXJydXB0LXJlbGF0ZWQgY29kZQorICoKKyAqLworCisvKioKKyAqCXZpYV9pbnRyX2NoYW5uZWwgLSBoYW5kbGUgYW4gaW50ZXJydXB0IGZvciBhIHNpbmdsZSBjaGFubmVsCisgKiAgICAgIEBjYXJkOiB1bnVzZWQKKyAqCUBjaGFuOiBoYW5kbGUgaW50ZXJydXB0IGZvciB0aGlzIGNoYW5uZWwKKyAqCisgKglUaGlzIGlzIHRoZSAibWVhdCIgb2YgdGhlIGludGVycnVwdCBoYW5kbGVyLAorICoJY29udGFpbmluZyB0aGUgYWN0aW9ucyB0YWtlbiBlYWNoIHRpbWUgYW4gaW50ZXJydXB0CisgKglvY2N1cnMuICBBbGwgY29tbXVuaWNhdGlvbiBhbmQgY29vcmRpbmF0aW9uIHdpdGgKKyAqCXVzZXJzcGFjZSB0YWtlcyBwbGFjZSBoZXJlLgorICoKKyAqCUxvY2tpbmc6IGluc2lkZSBjYXJkLT5sb2NrCisgKi8KKworc3RhdGljIHZvaWQgdmlhX2ludHJfY2hhbm5lbCAoc3RydWN0IHZpYV9pbmZvICpjYXJkLCBzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4pCit7CisJdTggc3RhdHVzOworCWludCBuOworCQorCS8qIGNoZWNrIHBlcnRpbmVudCBiaXRzIG9mIHN0YXR1cyByZWdpc3RlciBmb3IgYWN0aW9uIGJpdHMgKi8KKwlzdGF0dXMgPSBpbmIgKGNoYW4tPmlvYmFzZSkgJiAoVklBX1NHRF9GTEFHIHwgVklBX1NHRF9FT0wgfCBWSUFfU0dEX1NUT1BQRUQpOworCWlmICghc3RhdHVzKQorCQlyZXR1cm47CisKKwkvKiBhY2tub3dsZWRnZSBhbnkgZmxhZ2dlZCBiaXRzIEFTQVAgKi8KKwlvdXRiIChzdGF0dXMsIGNoYW4tPmlvYmFzZSk7CisKKwlpZiAoIWNoYW4tPnNndGFibGUpIC8qIFhYWDogdGVtcG9yYXJ5IHNvbHV0aW9uICovCisJCXJldHVybjsKKworCS8qIGdyYWIgY3VycmVudCBoL3cgcHRyIHZhbHVlICovCisJbiA9IGF0b21pY19yZWFkICgmY2hhbi0+aHdfcHRyKTsKKworCS8qIHNhbml0eSBjaGVjazogbWFrZSBzdXJlIG91ciBoL3cgcHRyIGRvZXNuJ3QgaGF2ZSBhIHdlaXJkIHZhbHVlICovCisJYXNzZXJ0IChuID49IDApOworCWFzc2VydCAobiA8IGNoYW4tPmZyYWdfbnVtYmVyKTsKKworCQorCS8qIHJlc2V0IFNHRCBkYXRhIHN0cnVjdHVyZSBpbiBtZW1vcnkgdG8gcmVmbGVjdCBhIGZ1bGwgYnVmZmVyLAorCSAqIGFuZCBhZHZhbmNlIHRoZSBoL3cgcHRyLCB3cmFwcGluZyBhcm91bmQgdG8gemVybyBpZiBuZWVkZWQKKwkgKi8KKwlpZiAobiA9PSAoY2hhbi0+ZnJhZ19udW1iZXIgLSAxKSkgeworCQljaGFuLT5zZ3RhYmxlW25dLmNvdW50ID0gY3B1X3RvX2xlMzIoY2hhbi0+ZnJhZ19zaXplIHwgVklBX0VPTCk7CisJCWF0b21pY19zZXQgKCZjaGFuLT5od19wdHIsIDApOworCX0gZWxzZSB7CisJCWNoYW4tPnNndGFibGVbbl0uY291bnQgPSBjcHVfdG9fbGUzMihjaGFuLT5mcmFnX3NpemUgfCBWSUFfRkxBRyk7CisJCWF0b21pY19pbmMgKCZjaGFuLT5od19wdHIpOworCX0KKworCS8qIGFjY291bnRpbmcgY3JhcCBmb3IgU05EQ1RMX0RTUF9HRVR4UFRSICovCisJY2hhbi0+bl9pcnFzKys7CisJY2hhbi0+Ynl0ZXMgKz0gY2hhbi0+ZnJhZ19zaXplOworCS8qIEZJWE1FIC0gc2lnbmVkIG92ZXJmbG93IGlzIHVuZGVmaW5lZCAqLworCWlmIChjaGFuLT5ieXRlcyA8IDApIC8qIGhhbmRsZSBvdmVyZmxvdyBvZiAzMS1iaXQgdmFsdWUgKi8KKwkJY2hhbi0+Ynl0ZXMgPSBjaGFuLT5mcmFnX3NpemU7CisJLyogYWxsIGZvbGxvd2luZyBjaGVja3Mgb25seSBvY2N1ciB3aGVuIG5vdCBpbiBtbWFwKDIpIG1vZGUgKi8KKwlpZiAoIWNoYW4tPmlzX21hcHBlZCkKKwl7CisJCS8qIElmIHdlIGFyZSByZWNvcmRpbmcsIHRoZW4gbl9mcmFncyByZXByZXNlbnRzIHRoZSBudW1iZXIKKwkJICogb2YgZnJhZ21lbnRzIHdhaXRpbmcgdG8gYmUgaGFuZGxlZCBieSB1c2Vyc3BhY2UuCisJCSAqIElmIHdlIGFyZSBwbGF5YmFjaywgdGhlbiBuX2ZyYWdzIHJlcHJlc2VudHMgdGhlIG51bWJlcgorCQkgKiBvZiBmcmFnbWVudHMgcmVtYWluaW5nIHRvIGJlIGZpbGxlZCBieSB1c2Vyc3BhY2UuCisJCSAqIFdlIGluY3JlbWVudCBoZXJlLiAgSWYgd2UgcmVhY2ggbWF4IG51bWJlciBvZiBmcmFnbWVudHMsCisJCSAqIHRoaXMgaW5kaWNhdGVzIGFuIHVuZGVycnVuL292ZXJydW4uICBGb3IgdGhpcyBjYXNlIHVuZGVyIE9TUywKKwkJICogd2Ugc3RvcCB0aGUgcmVjb3JkL3BsYXliYWNrIHByb2Nlc3MuCisJCSAqLworCQlpZiAoYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKSA8IGNoYW4tPmZyYWdfbnVtYmVyKQorCQkJYXRvbWljX2luYyAoJmNoYW4tPm5fZnJhZ3MpOworCQlhc3NlcnQgKGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykgPD0gY2hhbi0+ZnJhZ19udW1iZXIpOworCQlpZiAoYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKSA9PSBjaGFuLT5mcmFnX251bWJlcikgeworCQkJY2hhbi0+aXNfYWN0aXZlID0gMDsKKwkJCXZpYV9jaGFuX3N0b3AgKGNoYW4tPmlvYmFzZSk7CisJCX0KKwl9CisJLyogd2FrZSB1cCBhbnlvbmUgbGlzdGVuaW5nIHRvIHNlZSB3aGVuIGludGVycnVwdHMgb2NjdXIgKi8KKwl3YWtlX3VwX2FsbCAoJmNoYW4tPndhaXQpOworCisJRFBSSU5USyAoIiVzIGludHIsIHN0YXR1cz0weCUwMlgsIGh3cHRyPTB4JWxYLCBjaGFuLT5od19wdHI9JWRcbiIsCisJCSBjaGFuLT5uYW1lLCBzdGF0dXMsIChsb25nKSBpbmwgKGNoYW4tPmlvYmFzZSArIDB4MDQpLAorCQkgYXRvbWljX3JlYWQgKCZjaGFuLT5od19wdHIpKTsKKworCURQUklOVEsgKCIlcyBpbnRyLCBjaGFubmVsIG5fZnJhZ3MgPT0gJWQsIG1pc3NlZCAlZFxuIiwgY2hhbi0+bmFtZSwKKwkJIGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncyksIG1pc3NlZCk7Cit9CisKKworc3RhdGljIGlycXJldHVybl90ICB2aWFfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHZpYV9pbmZvICpjYXJkID0gZGV2X2lkOworCXUzMiBzdGF0dXMzMjsKKworCS8qIHRvIG1pbmltaXplIGludGVycnVwdCBzaGFyaW5nIGNvc3RzLCB3ZSB1c2UgdGhlIFNHRCBzdGF0dXMKKwkgKiBzaGFkb3cgcmVnaXN0ZXIgdG8gY2hlY2sgdGhlIHN0YXR1cyBvZiBhbGwgaW5wdXRzIGFuZAorCSAqIG91dHB1dHMgd2l0aCBhIHNpbmdsZSAzMi1iaXQgYnVzIHJlYWQuICBJZiBubyBpbnRlcnJ1cHQKKwkgKiBjb25kaXRpb25zIGFyZSBmbGFnZ2VkLCB3ZSBleGl0IGltbWVkaWF0ZWx5CisJICovCisJc3RhdHVzMzIgPSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgVklBX0JBU0UwX1NHRF9TVEFUVVNfU0hBRE9XKTsKKwlpZiAoIShzdGF0dXMzMiAmIFZJQV9JTlRSX01BU0spKQorICAgICAgICB7CisjaWZkZWYgQ09ORklHX01JRElfVklBODJDWFhYCisJICAgIAkgaWYgKGNhcmQtPm1pZGlfZGV2YykKKyAgICAgICAgICAgICAgICAgICAgCXVhcnQ0MDFpbnRyKGlycSwgY2FyZC0+bWlkaV9kZXZjLCByZWdzKTsKKyNlbmRpZgorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisgICAgCX0KKwlEUFJJTlRLICgiaW50ciwgc3RhdHVzMzIgPT0gMHglMDhYXG4iLCBzdGF0dXMzMik7CisKKwkvKiBzeW5jaHJvbml6ZSBpbnRlcnJ1cHQgaGFuZGxpbmcgdW5kZXIgU01QLiAgdGhpcyBzcGlubG9jaworCSAqIGdvZXMgYXdheSBjb21wbGV0ZWx5IG9uIFVQCisJICovCisJc3Bpbl9sb2NrICgmY2FyZC0+bG9jayk7CisKKwlpZiAoc3RhdHVzMzIgJiBWSUFfSU5UUl9PVVQpCisJCXZpYV9pbnRyX2NoYW5uZWwgKGNhcmQsICZjYXJkLT5jaF9vdXQpOworCWlmIChzdGF0dXMzMiAmIFZJQV9JTlRSX0lOKQorCQl2aWFfaW50cl9jaGFubmVsIChjYXJkLCAmY2FyZC0+Y2hfaW4pOworCWlmIChzdGF0dXMzMiAmIFZJQV9JTlRSX0ZNKQorCQl2aWFfaW50cl9jaGFubmVsIChjYXJkLCAmY2FyZC0+Y2hfZm0pOworCisJc3Bpbl91bmxvY2sgKCZjYXJkLT5sb2NrKTsKKwkKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCB2aWFfbmV3X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXN0cnVjdCB2aWFfaW5mbyAqY2FyZCA9IGRldl9pZDsKKwl1MzIgc3RhdHVzMzI7CisKKwkvKiB0byBtaW5pbWl6ZSBpbnRlcnJ1cHQgc2hhcmluZyBjb3N0cywgd2UgdXNlIHRoZSBTR0Qgc3RhdHVzCisJICogc2hhZG93IHJlZ2lzdGVyIHRvIGNoZWNrIHRoZSBzdGF0dXMgb2YgYWxsIGlucHV0cyBhbmQKKwkgKiBvdXRwdXRzIHdpdGggYSBzaW5nbGUgMzItYml0IGJ1cyByZWFkLiAgSWYgbm8gaW50ZXJydXB0CisJICogY29uZGl0aW9ucyBhcmUgZmxhZ2dlZCwgd2UgZXhpdCBpbW1lZGlhdGVseQorCSAqLworCXN0YXR1czMyID0gaW5sIChjYXJkLT5iYXNlYWRkciArIFZJQV9CQVNFMF9TR0RfU1RBVFVTX1NIQURPVyk7CisJaWYgKCEoc3RhdHVzMzIgJiBWSUFfTkVXX0lOVFJfTUFTSykpCisJCXJldHVybiBJUlFfTk9ORTsKKwkvKgorCSAqIGdvZXMgYXdheSBjb21wbGV0ZWx5IG9uIFVQCisJICovCisJc3Bpbl9sb2NrICgmY2FyZC0+bG9jayk7CisKKwl2aWFfaW50cl9jaGFubmVsIChjYXJkLCAmY2FyZC0+Y2hfb3V0KTsKKwl2aWFfaW50cl9jaGFubmVsIChjYXJkLCAmY2FyZC0+Y2hfaW4pOworCXZpYV9pbnRyX2NoYW5uZWwgKGNhcmQsICZjYXJkLT5jaF9mbSk7CisKKwlzcGluX3VubG9jayAoJmNhcmQtPmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworCisvKioKKyAqCXZpYV9pbnRlcnJ1cHRfaW5pdCAtIEluaXRpYWxpemUgaW50ZXJydXB0IGhhbmRsaW5nCisgKglAY2FyZDogUHJpdmF0ZSBpbmZvIGZvciBzcGVjaWZpZWQgYm9hcmQKKyAqCisgKglPYnRhaW4gYW5kIHJlc2VydmUgSVJRIGZvciB1c2luZyBpbiBoYW5kbGluZyBhdWRpbyBldmVudHMuCisgKglBbHNvLCBkaXNhYmxlIGFueSBJUlEtZ2VuZXJhdGluZyByZXNvdXJjZXMsIHRvIG1ha2Ugc3VyZQorICoJd2UgZG9uJ3QgZ2V0IGludGVycnVwdHMgYmVmb3JlIHdlIHdhbnQgdGhlbS4KKyAqLworCitzdGF0aWMgaW50IHZpYV9pbnRlcnJ1cHRfaW5pdCAoc3RydWN0IHZpYV9pbmZvICpjYXJkKQoreworCXU4IHRtcDg7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0IChjYXJkICE9IE5VTEwpOworCWFzc2VydCAoY2FyZC0+cGRldiAhPSBOVUxMKTsKKworCS8qIGNoZWNrIGZvciBzYW5lIElSUSBudW1iZXIuIGNhbiB0aGlzIGV2ZXIgaGFwcGVuPyAqLworCWlmIChjYXJkLT5wZGV2LT5pcnEgPCAyKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJpbnNhbmUgSVJRICVkLCBhYm9ydGluZ1xuIiwKKwkJCWNhcmQtPnBkZXYtPmlycSk7CisJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVJT1xuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIFZJQSByZXF1aXJlcyB0aGlzIGlzIGRvbmUgKi8KKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUoY2FyZC0+cGRldiwgUENJX0lOVEVSUlVQVF9MSU5FLCBjYXJkLT5wZGV2LT5pcnEpOworCQorCWlmKGNhcmQtPmxlZ2FjeSkKKwl7CisJCS8qIG1ha2Ugc3VyZSBGTSBpcnEgaXMgbm90IHJvdXRlZCB0byB1cyAqLworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgVklBX0ZNX05NSV9DVFJMLCAmdG1wOCk7CisJCWlmICgodG1wOCAmIFZJQV9DUjQ4X0ZNX1RSQVBfVE9fTk1JKSA9PSAwKSB7CisJCQl0bXA4IHw9IFZJQV9DUjQ4X0ZNX1RSQVBfVE9fTk1JOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCBWSUFfRk1fTk1JX0NUUkwsIHRtcDgpOworCQl9CisJCWlmIChyZXF1ZXN0X2lycSAoY2FyZC0+cGRldi0+aXJxLCB2aWFfaW50ZXJydXB0LCBTQV9TSElSUSwgVklBX01PRFVMRV9OQU1FLCBjYXJkKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byBvYnRhaW4gSVJRICVkLCBhYm9ydGluZ1xuIiwKKwkJCQljYXJkLT5wZGV2LT5pcnEpOworCQkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAtRUJVU1lcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKwllbHNlIAorCXsKKwkJaWYgKHJlcXVlc3RfaXJxIChjYXJkLT5wZGV2LT5pcnEsIHZpYV9uZXdfaW50ZXJydXB0LCBTQV9TSElSUSwgVklBX01PRFVMRV9OQU1FLCBjYXJkKSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byBvYnRhaW4gSVJRICVkLCBhYm9ydGluZ1xuIiwKKwkJCQljYXJkLT5wZGV2LT5pcnEpOworCQkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAtRUJVU1lcbiIpOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCX0KKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBPU1MgRFNQIGRldmljZQorICoKKyAqLworCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB2aWFfZHNwX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQk9IHZpYV9kc3Bfb3BlbiwKKwkucmVsZWFzZQk9IHZpYV9kc3BfcmVsZWFzZSwKKwkucmVhZAkJPSB2aWFfZHNwX3JlYWQsCisJLndyaXRlCQk9IHZpYV9kc3Bfd3JpdGUsCisJLnBvbGwJCT0gdmlhX2RzcF9wb2xsLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5pb2N0bAkJPSB2aWFfZHNwX2lvY3RsLAorCS5tbWFwCQk9IHZpYV9kc3BfbW1hcCwKK307CisKKworc3RhdGljIGludCBfX2RldmluaXQgdmlhX2RzcF9pbml0IChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQpCit7CisJdTggdG1wODsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlpZihjYXJkLT5sZWdhY3kpCisJeworCQkvKiB0dXJuIG9mZiBsZWdhY3kgZmVhdHVyZXMsIGlmIG5vdCBhbHJlYWR5ICovCisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCBWSUFfRlVOQ19FTkFCTEUsICZ0bXA4KTsKKwkJaWYgKHRtcDggJiAoVklBX0NSNDJfU0JfRU5BQkxFIHwgIFZJQV9DUjQyX0ZNX0VOQUJMRSkpIHsKKwkJCXRtcDggJj0gfihWSUFfQ1I0Ml9TQl9FTkFCTEUgfCBWSUFfQ1I0Ml9GTV9FTkFCTEUpOworCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCBWSUFfRlVOQ19FTkFCTEUsIHRtcDgpOworCQl9CisJfQorCisJdmlhX3N0b3BfZXZlcnl0aGluZyAoY2FyZCk7CisKKwljYXJkLT5kZXZfZHNwID0gcmVnaXN0ZXJfc291bmRfZHNwICgmdmlhX2RzcF9mb3BzLCAtMSk7CisJaWYgKGNhcmQtPmRldl9kc3AgPCAwKSB7CisJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVOT0RFVlxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIDBcbiIpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIHZpYV9kc3BfY2xlYW51cCAoc3RydWN0IHZpYV9pbmZvICpjYXJkKQoreworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisJYXNzZXJ0IChjYXJkLT5kZXZfZHNwID49IDApOworCisJdmlhX3N0b3BfZXZlcnl0aGluZyAoY2FyZCk7CisKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcCAoY2FyZC0+ZGV2X2RzcCk7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworc3RhdGljIHN0cnVjdCBwYWdlICogdmlhX21tX25vcGFnZSAoc3RydWN0IHZtX2FyZWFfc3RydWN0ICogdm1hLAorCQkJCSAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCAqdHlwZSkKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQgPSB2bWEtPnZtX3ByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4gPSAmY2FyZC0+Y2hfb3V0OworCXN0cnVjdCBwYWdlICpkbWFwYWdlOworCXVuc2lnbmVkIGxvbmcgcGdvZmY7CisJaW50IHJkLCB3cjsKKworCURQUklOVEsgKCJFTlRFUiwgc3RhcnQgJWxYaCwgb2ZzICVsWGgsIHBnb2ZmICVsZCwgYWRkciAlbFhoXG4iLAorCQkgdm1hLT52bV9zdGFydCwKKwkJIGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0LAorCQkgKGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0KSA+PiBQQUdFX1NISUZULAorCQkgYWRkcmVzcyk7CisKKyAgICAgICAgaWYgKGFkZHJlc3MgPiB2bWEtPnZtX2VuZCkgeworCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIE5PUEFHRV9TSUdCVVNcbiIpOworCQlyZXR1cm4gTk9QQUdFX1NJR0JVUzsgLyogRGlzYWxsb3cgbXJlbWFwICovCisJfQorICAgICAgICBpZiAoIWNhcmQpIHsKKwkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyBOT1BBR0VfT09NXG4iKTsKKwkJcmV0dXJuIE5PUEFHRV9PT007CS8qIE5vdGhpbmcgYWxsb2NhdGVkICovCisJfQorCisJcGdvZmYgPSB2bWEtPnZtX3Bnb2ZmICsgKChhZGRyZXNzIC0gdm1hLT52bV9zdGFydCkgPj4gUEFHRV9TSElGVCk7CisJcmQgPSBjYXJkLT5jaF9pbi5pc19tYXBwZWQ7CisJd3IgPSBjYXJkLT5jaF9vdXQuaXNfbWFwcGVkOworCisjaWZuZGVmIFZJQV9OREVCVUcKKwl7CisJdW5zaWduZWQgbG9uZyBtYXhfYnVmcyA9IGNoYW4tPmZyYWdfbnVtYmVyOworCWlmIChyZCAmJiB3cikgbWF4X2J1ZnMgKj0gMjsKKwkvKiB2aWFfZHNwX21tYXAoKSBzaG91bGQgZW5zdXJlIHRoaXMgKi8KKwlhc3NlcnQgKHBnb2ZmIDwgbWF4X2J1ZnMpOworCX0KKyNlbmRpZgorCisJLyogaWYgZnVsbC1kdXBsZXggKHJlYWQrd3JpdGUpIGFuZCB3ZSBoYXZlIHR3byBzZXRzIG9mIGJ1ZnMsCisJICogdGhlbiB0aGUgcGxheWJhY2sgYnVmZmVycyBjb21lIGZpcnN0LCBzZXogc291bmRjYXJkLmMgKi8KKwlpZiAocGdvZmYgPj0gY2hhbi0+cGFnZV9udW1iZXIpIHsKKwkJcGdvZmYgLT0gY2hhbi0+cGFnZV9udW1iZXI7CisJCWNoYW4gPSAmY2FyZC0+Y2hfaW47CisJfSBlbHNlIGlmICghd3IpCisJCWNoYW4gPSAmY2FyZC0+Y2hfaW47CisKKwlhc3NlcnQgKCgoKHVuc2lnbmVkIGxvbmcpY2hhbi0+cGd0YmxbcGdvZmZdLmNwdWFkZHIpICUgUEFHRV9TSVpFKSA9PSAwKTsKKworCWRtYXBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKGNoYW4tPnBndGJsW3Bnb2ZmXS5jcHVhZGRyKTsKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIHBhZ2UgJXAgZm9yIGNwdWFkZHIgJWxYaFxuIiwKKwkJIGRtYXBhZ2UsICh1bnNpZ25lZCBsb25nKSBjaGFuLT5wZ3RibFtwZ29mZl0uY3B1YWRkcik7CisJZ2V0X3BhZ2UgKGRtYXBhZ2UpOworCWlmICh0eXBlKQorCQkqdHlwZSA9IFZNX0ZBVUxUX01JTk9SOworCXJldHVybiBkbWFwYWdlOworfQorCisKKyNpZm5kZWYgVk1fUkVTRVJWRUQKK3N0YXRpYyBpbnQgdmlhX21tX3N3YXBvdXQgKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBWTV9SRVNFUlZFRCAqLworCisKK3N0YXRpYyBzdHJ1Y3Qgdm1fb3BlcmF0aW9uc19zdHJ1Y3QgdmlhX21tX29wcyA9IHsKKwkubm9wYWdlCQk9IHZpYV9tbV9ub3BhZ2UsCisKKyNpZm5kZWYgVk1fUkVTRVJWRUQKKwkuc3dhcG91dAk9IHZpYV9tbV9zd2Fwb3V0LAorI2VuZGlmCit9OworCisKK3N0YXRpYyBpbnQgdmlhX2RzcF9tbWFwKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisJaW50IG5vbmJsb2NrID0gKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKTsKKwlpbnQgcmMgPSAtRUlOVkFMLCByZD0wLCB3cj0wOworCXVuc2lnbmVkIGxvbmcgbWF4X3NpemUsIHNpemUsIHN0YXJ0LCBvZmZzZXQ7CisKKwlhc3NlcnQgKGZpbGUgIT0gTlVMTCk7CisJYXNzZXJ0ICh2bWEgIT0gTlVMTCk7CisJY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlEUFJJTlRLICgiRU5URVIsIHN0YXJ0ICVsWGgsIHNpemUgJWxkLCBwZ29mZiAlbGRcbiIsCisJCSB2bWEtPnZtX3N0YXJ0LAorCQkgdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0LAorCQkgdm1hLT52bV9wZ29mZik7CisKKwltYXhfc2l6ZSA9IDA7CisJaWYgKHZtYS0+dm1fZmxhZ3MgJiBWTV9SRUFEKSB7CisJCXJkID0gMTsKKwkJdmlhX2NoYW5fc2V0X2J1ZmZlcmluZyhjYXJkLCAmY2FyZC0+Y2hfaW4sIC0xKTsKKwkJdmlhX2NoYW5fYnVmZmVyX2luaXQgKGNhcmQsICZjYXJkLT5jaF9pbik7CisJCW1heF9zaXplICs9IGNhcmQtPmNoX2luLnBhZ2VfbnVtYmVyIDw8IFBBR0VfU0hJRlQ7CisJfQorCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJd3IgPSAxOworCQl2aWFfY2hhbl9zZXRfYnVmZmVyaW5nKGNhcmQsICZjYXJkLT5jaF9vdXQsIC0xKTsKKwkJdmlhX2NoYW5fYnVmZmVyX2luaXQgKGNhcmQsICZjYXJkLT5jaF9vdXQpOworCQltYXhfc2l6ZSArPSBjYXJkLT5jaF9vdXQucGFnZV9udW1iZXIgPDwgUEFHRV9TSElGVDsKKwl9CisKKwlzdGFydCA9IHZtYS0+dm1fc3RhcnQ7CisJb2Zmc2V0ID0gKHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVCk7CisJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKKworCS8qIHNvbWUgYmFzaWMgc2l6ZS9vZmZzZXQgc2FuaXR5IGNoZWNrcyAqLworCWlmIChzaXplID4gbWF4X3NpemUpCisJCWdvdG8gb3V0OworCWlmIChvZmZzZXQgPiBtYXhfc2l6ZSAtIHNpemUpCisJCWdvdG8gb3V0OworCisJcmMgPSB2aWFfc3lzY2FsbF9kb3duIChjYXJkLCBub25ibG9jayk7CisJaWYgKHJjKSBnb3RvIG91dDsKKworCXZtYS0+dm1fb3BzID0gJnZpYV9tbV9vcHM7CisJdm1hLT52bV9wcml2YXRlX2RhdGEgPSBjYXJkOworCisjaWZkZWYgVk1fUkVTRVJWRUQKKwl2bWEtPnZtX2ZsYWdzIHw9IFZNX1JFU0VSVkVEOworI2VuZGlmCisKKwlpZiAocmQpCisJCWNhcmQtPmNoX2luLmlzX21hcHBlZCA9IDE7CisJaWYgKHdyKQorCQljYXJkLT5jaF9vdXQuaXNfbWFwcGVkID0gMTsKKworCXVwICgmY2FyZC0+c3lzY2FsbF9zZW0pOworCXJjID0gMDsKKworb3V0OgorCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHNzaXplX3QgdmlhX2RzcF9kb19yZWFkIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsCisJCQkJY2hhciBfX3VzZXIgKnVzZXJidWYsIHNpemVfdCBjb3VudCwKKwkJCQlpbnQgbm9uYmxvY2spCit7CisgICAgICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWNvbnN0IGNoYXIgX191c2VyICpvcmlnX3VzZXJidWYgPSB1c2VyYnVmOworCXN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiA9ICZjYXJkLT5jaF9pbjsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgbiwgdG1wOworCXNzaXplX3QgcmV0ID0gMDsKKworCS8qIGlmIFNHRCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQsIHN0YXJ0IGl0ICovCisJdmlhX2NoYW5fbWF5YmVfc3RhcnQgKGNoYW4pOworCitoYW5kbGVfb25lX2Jsb2NrOgorCS8qIGp1c3QgdG8gYmUgYSBuaWNlIG5laWdoYm9yICovCisJLyogVGhvbWFzIFNhaWxlcjoKKwkgKiBCdXQgYWxzbyB0byBvdXJzZWx2ZXMsIHJlbGVhc2Ugc2VtYXBob3JlIGlmIHdlIGRvIHNvICovCisJaWYgKG5lZWRfcmVzY2hlZCgpKSB7CisJCXVwKCZjYXJkLT5zeXNjYWxsX3NlbSk7CisJCXNjaGVkdWxlICgpOworCQlyZXQgPSB2aWFfc3lzY2FsbF9kb3duIChjYXJkLCBub25ibG9jayk7CisJCWlmIChyZXQpCisJCQlnb3RvIG91dDsKKwl9CisKKwkvKiBncmFiIGN1cnJlbnQgY2hhbm5lbCBzb2Z0d2FyZSBwb2ludGVyLiAgSW4gdGhlIGNhc2Ugb2YKKwkgKiByZWNvcmRpbmcsIHRoaXMgaXMgcG9pbnRpbmcgdG8gdGhlIG5leHQgYnVmZmVyIHRoYXQKKwkgKiB3aWxsIHJlY2VpdmUgZGF0YSBmcm9tIHRoZSBhdWRpbyBoYXJkd2FyZS4KKwkgKi8KKwluID0gY2hhbi0+c3dfcHRyOworCisJLyogbl9mcmFncyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIHdhaXRpbmcKKwkgKiB0byBiZSBjb3BpZWQgdG8gdXNlcmxhbmQuICBzbGVlcCB1bnRpbCBhdCBsZWFzdAorCSAqIG9uZSBidWZmZXIgaGFzIGJlZW4gcmVhZCBmcm9tIHRoZSBhdWRpbyBoYXJkd2FyZS4KKwkgKi8KKwlhZGRfd2FpdF9xdWV1ZSgmY2hhbi0+d2FpdCwgJndhaXQpOworCWZvciAoOzspIHsKKwkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCQl0bXAgPSBhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpOworCQlhc3NlcnQgKHRtcCA+PSAwKTsKKwkJYXNzZXJ0ICh0bXAgPD0gY2hhbi0+ZnJhZ19udW1iZXIpOworCQlpZiAodG1wKQorCQkJYnJlYWs7CisJCWlmIChub25ibG9jayB8fCAhY2hhbi0+aXNfYWN0aXZlKSB7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworCQl1cCgmY2FyZC0+c3lzY2FsbF9zZW0pOworCisJCURQUklOVEsgKCJTbGVlcGluZyBvbiBibG9jayAlZFxuIiwgbik7CisJCXNjaGVkdWxlKCk7CisKKwkJcmV0ID0gdmlhX3N5c2NhbGxfZG93biAoY2FyZCwgbm9uYmxvY2spOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+d2FpdCwgJndhaXQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogTm93IHRoYXQgd2UgaGF2ZSBhIGJ1ZmZlciB3ZSBjYW4gcmVhZCBmcm9tLCBzZW5kCisJICogYXMgbXVjaCBhcyBzYW1wbGUgZGF0YSBwb3NzaWJsZSB0byB1c2Vyc3BhY2UuCisJICovCisJd2hpbGUgKChjb3VudCA+IDApICYmIChjaGFuLT5zbG9wX2xlbiA8IGNoYW4tPmZyYWdfc2l6ZSkpIHsKKwkJc2l6ZV90IHNsb3BfbGVmdCA9IGNoYW4tPmZyYWdfc2l6ZSAtIGNoYW4tPnNsb3BfbGVuOworCQl2b2lkICpiYXNlID0gY2hhbi0+cGd0YmxbbiAvIChQQUdFX1NJWkUgLyBjaGFuLT5mcmFnX3NpemUpXS5jcHVhZGRyOworCQl1bnNpZ25lZCBvZnMgPSAobiAlIChQQUdFX1NJWkUgLyBjaGFuLT5mcmFnX3NpemUpKSAqIGNoYW4tPmZyYWdfc2l6ZTsKKworCQlzaXplID0gKGNvdW50IDwgc2xvcF9sZWZ0KSA/IGNvdW50IDogc2xvcF9sZWZ0OworCQlpZiAoY29weV90b191c2VyICh1c2VyYnVmLAorCQkJCSAgYmFzZSArIG9mcyArIGNoYW4tPnNsb3BfbGVuLAorCQkJCSAgc2l6ZSkpIHsKKwkJCXJldCA9IC1FRkFVTFQ7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWNvdW50IC09IHNpemU7CisJCWNoYW4tPnNsb3BfbGVuICs9IHNpemU7CisJCXVzZXJidWYgKz0gc2l6ZTsKKwl9CisKKwkvKiBJZiB3ZSBkaWRuJ3QgY29weSB0aGUgYnVmZmVyIGNvbXBsZXRlbHkgdG8gdXNlcnNwYWNlLAorCSAqIHN0b3Agbm93LgorCSAqLworCWlmIChjaGFuLT5zbG9wX2xlbiA8IGNoYW4tPmZyYWdfc2l6ZSkKKwkJZ290byBvdXQ7CisKKwkvKgorCSAqIElmIHdlIGdldCB0byB0aGlzIHBvaW50LCB3ZSBjb3BpZWQgb25lIGJ1ZmZlciBjb21wbGV0ZWx5CisJICogdG8gdXNlcnNwYWNlLCBnaXZlIHRoZSBidWZmZXIgYmFjayB0byB0aGUgaGFyZHdhcmUuCisJICovCisKKwkvKiBhZHZhbmNlIGNoYW5uZWwgc29mdHdhcmUgcG9pbnRlciB0byBwb2ludCB0bworCSAqIHRoZSBuZXh0IGJ1ZmZlciBmcm9tIHdoaWNoIHdlIHdpbGwgY29weQorCSAqLworCWlmIChjaGFuLT5zd19wdHIgPT0gKGNoYW4tPmZyYWdfbnVtYmVyIC0gMSkpCisJCWNoYW4tPnN3X3B0ciA9IDA7CisJZWxzZQorCQljaGFuLT5zd19wdHIrKzsKKworCS8qIG1hcmsgb25lIGxlc3MgYnVmZmVyIHdhaXRpbmcgdG8gYmUgcHJvY2Vzc2VkICovCisJYXNzZXJ0IChhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpID4gMCk7CisJYXRvbWljX2RlYyAoJmNoYW4tPm5fZnJhZ3MpOworCisJLyogd2UgYXJlIGF0IGEgYmxvY2sgYm91bmRhcnksIHRoZXJlIGlzIG5vIGZyYWdtZW50IGRhdGEgKi8KKwljaGFuLT5zbG9wX2xlbiA9IDA7CisKKwlEUFJJTlRLICgiRmx1c2hlZCBibG9jayAldSwgc3dfcHRyIG5vdyAldSwgbl9mcmFncyBub3cgJWRcbiIsCisJCW4sIGNoYW4tPnN3X3B0ciwgYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKSk7CisKKwlEUFJJTlRLICgicmVncz09JTAyWCAlMDJYICUwMlggJTA4WCAlMDhYICUwOFggJTA4WFxuIiwKKwkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAwKSwKKwkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAxKSwKKwkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAyKSwKKwkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDA0KSwKKwkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDBDKSwKKwkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDgwKSwKKwkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDg0KSk7CisKKwlpZiAoY291bnQgPiAwKQorCQlnb3RvIGhhbmRsZV9vbmVfYmxvY2s7CisKK291dDoKKwlyZXR1cm4gKHVzZXJidWYgIT0gb3JpZ191c2VyYnVmKSA/ICh1c2VyYnVmIC0gb3JpZ191c2VyYnVmKSA6IHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCB2aWFfZHNwX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB2aWFfaW5mbyAqY2FyZDsKKwlpbnQgbm9uYmxvY2sgPSAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWludCByYzsKKworCURQUklOVEsgKCJFTlRFUiwgZmlsZT0lcCwgYnVmZmVyPSVwLCBjb3VudD0ldSwgcHBvcz0lbHVcbiIsCisJCSBmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zID8gKCh1bnNpZ25lZCBsb25nKSpwcG9zKSA6IDApOworCisJYXNzZXJ0IChmaWxlICE9IE5VTEwpOworCWNhcmQgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJYXNzZXJ0IChjYXJkICE9IE5VTEwpOworCisJcmMgPSB2aWFfc3lzY2FsbF9kb3duIChjYXJkLCBub25ibG9jayk7CisJaWYgKHJjKSBnb3RvIG91dDsKKworCWlmIChjYXJkLT5jaF9pbi5pc19tYXBwZWQpIHsKKwkJcmMgPSAtRU5YSU87CisJCWdvdG8gb3V0X3VwOworCX0KKworCXZpYV9jaGFuX3NldF9idWZmZXJpbmcoY2FyZCwgJmNhcmQtPmNoX2luLCAtMSk7CisgICAgICAgIHJjID0gdmlhX2NoYW5fYnVmZmVyX2luaXQgKGNhcmQsICZjYXJkLT5jaF9pbik7CisKKwlpZiAocmMpCisJCWdvdG8gb3V0X3VwOworCisJcmMgPSB2aWFfZHNwX2RvX3JlYWQgKGNhcmQsIGJ1ZmZlciwgY291bnQsIG5vbmJsb2NrKTsKKworb3V0X3VwOgorCXVwICgmY2FyZC0+c3lzY2FsbF9zZW0pOworb3V0OgorCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJWxkXG4iLChsb25nKSByYyk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBzc2l6ZV90IHZpYV9kc3BfZG9fd3JpdGUgKHN0cnVjdCB2aWFfaW5mbyAqY2FyZCwKKwkJCQkgY29uc3QgY2hhciBfX3VzZXIgKnVzZXJidWYsIHNpemVfdCBjb3VudCwKKwkJCQkgaW50IG5vbmJsb2NrKQoreworICAgICAgICBERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwljb25zdCBjaGFyIF9fdXNlciAqb3JpZ191c2VyYnVmID0gdXNlcmJ1ZjsKKwlzdHJ1Y3QgdmlhX2NoYW5uZWwgKmNoYW4gPSAmY2FyZC0+Y2hfb3V0OworCXZvbGF0aWxlIHN0cnVjdCB2aWFfc2dkX3RhYmxlICpzZ3RhYmxlID0gY2hhbi0+c2d0YWJsZTsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgbiwgdG1wOworCXNzaXplX3QgcmV0ID0gMDsKKworaGFuZGxlX29uZV9ibG9jazoKKwkvKiBqdXN0IHRvIGJlIGEgbmljZSBuZWlnaGJvciAqLworCS8qIFRob21hcyBTYWlsZXI6CisJICogQnV0IGFsc28gdG8gb3Vyc2VsdmVzLCByZWxlYXNlIHNlbWFwaG9yZSBpZiB3ZSBkbyBzbyAqLworCWlmIChuZWVkX3Jlc2NoZWQoKSkgeworCQl1cCgmY2FyZC0+c3lzY2FsbF9zZW0pOworCQlzY2hlZHVsZSAoKTsKKwkJcmV0ID0gdmlhX3N5c2NhbGxfZG93biAoY2FyZCwgbm9uYmxvY2spOworCQlpZiAocmV0KQorCQkJZ290byBvdXQ7CisJfQorCisJLyogZ3JhYiBjdXJyZW50IGNoYW5uZWwgZnJhZ21lbnQgcG9pbnRlci4gIEluIHRoZSBjYXNlIG9mCisJICogcGxheWJhY2ssIHRoaXMgaXMgcG9pbnRpbmcgdG8gdGhlIG5leHQgZnJhZ21lbnQgdGhhdAorCSAqIHNob3VsZCByZWNlaXZlIGRhdGEgZnJvbSB1c2VybGFuZC4KKwkgKi8KKwluID0gY2hhbi0+c3dfcHRyOworCisJLyogbl9mcmFncyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgZnJhZ21lbnRzIHJlbWFpbmluZworCSAqIHRvIGJlIGZpbGxlZCBieSB1c2Vyc3BhY2UuICBTbGVlcCB1bnRpbAorCSAqIGF0IGxlYXN0IG9uZSBmcmFnbWVudCBpcyBhdmFpbGFibGUgZm9yIG91ciB1c2UuCisJICovCisJYWRkX3dhaXRfcXVldWUoJmNoYW4tPndhaXQsICZ3YWl0KTsKKwlmb3IgKDs7KSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdG1wID0gYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKTsKKwkJYXNzZXJ0ICh0bXAgPj0gMCk7CisJCWFzc2VydCAodG1wIDw9IGNoYW4tPmZyYWdfbnVtYmVyKTsKKwkJaWYgKHRtcCkKKwkJCWJyZWFrOworCQlpZiAobm9uYmxvY2sgfHwgIWNoYW4tPmlzX2FjdGl2ZSkgeworCQkJcmV0ID0gLUVBR0FJTjsKKwkJCWJyZWFrOworCQl9CisKKwkJdXAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKKworCQlEUFJJTlRLICgiU2xlZXBpbmcgb24gcGFnZSAlZCwgdG1wPT0lZCwgaXI9PSVkXG4iLCBuLCB0bXAsIGNoYW4tPmlzX3JlY29yZCk7CisJCXNjaGVkdWxlKCk7CisKKwkJcmV0ID0gdmlhX3N5c2NhbGxfZG93biAoY2FyZCwgbm9uYmxvY2spOworCQlpZiAocmV0KQorCQkJYnJlYWs7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nIChjdXJyZW50KSkgeworCQkJcmV0ID0gLUVSRVNUQVJUU1lTOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmY2hhbi0+d2FpdCwgJndhaXQpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogTm93IHRoYXQgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgZnJhZ21lbnQgd2UgY2FuIHdyaXRlIHRvLCBmaWxsIHRoZSBidWZmZXIKKwkgKiBhcyBtdWNoIGFzIHBvc3NpYmxlIHdpdGggZGF0YSBmcm9tIHVzZXJzcGFjZS4KKwkgKi8KKwl3aGlsZSAoKGNvdW50ID4gMCkgJiYgKGNoYW4tPnNsb3BfbGVuIDwgY2hhbi0+ZnJhZ19zaXplKSkgeworCQlzaXplX3Qgc2xvcF9sZWZ0ID0gY2hhbi0+ZnJhZ19zaXplIC0gY2hhbi0+c2xvcF9sZW47CisKKwkJc2l6ZSA9IChjb3VudCA8IHNsb3BfbGVmdCkgPyBjb3VudCA6IHNsb3BfbGVmdDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyIChjaGFuLT5wZ3RibFtuIC8gKFBBR0VfU0laRSAvIGNoYW4tPmZyYWdfc2l6ZSldLmNwdWFkZHIgKyAobiAlIChQQUdFX1NJWkUgLyBjaGFuLT5mcmFnX3NpemUpKSAqIGNoYW4tPmZyYWdfc2l6ZSArIGNoYW4tPnNsb3BfbGVuLAorCQkJCSAgICB1c2VyYnVmLCBzaXplKSkgeworCQkJcmV0ID0gLUVGQVVMVDsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJY291bnQgLT0gc2l6ZTsKKwkJY2hhbi0+c2xvcF9sZW4gKz0gc2l6ZTsKKwkJdXNlcmJ1ZiArPSBzaXplOworCX0KKworCS8qIElmIHdlIGRpZG4ndCBmaWxsIHVwIHRoZSBidWZmZXIgd2l0aCBkYXRhLCBzdG9wIG5vdy4KKyAgICAgICAgICogUHV0IGEgJ3N0b3AnIG1hcmtlciBpbiB0aGUgRE1BIHRhYmxlIHRvbywgdG8gdGVsbCB0aGUKKyAgICAgICAgICogYXVkaW8gaGFyZHdhcmUgdG8gc3RvcCBpZiBpdCBnZXRzIGhlcmUuCisgICAgICAgICAqLworCWlmIChjaGFuLT5zbG9wX2xlbiA8IGNoYW4tPmZyYWdfc2l6ZSkgeworCQlzZ3RhYmxlW25dLmNvdW50ID0gY3B1X3RvX2xlMzIgKGNoYW4tPnNsb3BfbGVuIHwgVklBX0VPTCB8IFZJQV9TVE9QKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKyAgICAgICAgICogSWYgd2UgZ2V0IHRvIHRoaXMgcG9pbnQsIHdlIGhhdmUgZmlsbGVkIGEgYnVmZmVyIHdpdGgKKyAgICAgICAgICogYXVkaW8gZGF0YSwgZmx1c2ggdGhlIGJ1ZmZlciB0byBhdWRpbyBoYXJkd2FyZS4KKyAgICAgICAgICovCisKKwkvKiBSZWNvcmQgdGhlIHRydWUgc2l6ZSBmb3IgdGhlIGF1ZGlvIGhhcmR3YXJlIHRvIG5vdGljZSAqLworICAgICAgICBpZiAobiA9PSAoY2hhbi0+ZnJhZ19udW1iZXIgLSAxKSkKKyAgICAgICAgICAgICAgICBzZ3RhYmxlW25dLmNvdW50ID0gY3B1X3RvX2xlMzIgKGNoYW4tPmZyYWdfc2l6ZSB8IFZJQV9FT0wpOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2d0YWJsZVtuXS5jb3VudCA9IGNwdV90b19sZTMyIChjaGFuLT5mcmFnX3NpemUgfCBWSUFfRkxBRyk7CisKKwkvKiBhZHZhbmNlIGNoYW5uZWwgc29mdHdhcmUgcG9pbnRlciB0byBwb2ludCB0bworCSAqIHRoZSBuZXh0IGJ1ZmZlciB3ZSB3aWxsIGZpbGwgd2l0aCBkYXRhCisJICovCisJaWYgKGNoYW4tPnN3X3B0ciA9PSAoY2hhbi0+ZnJhZ19udW1iZXIgLSAxKSkKKwkJY2hhbi0+c3dfcHRyID0gMDsKKwllbHNlCisJCWNoYW4tPnN3X3B0cisrOworCisJLyogbWFyayBvbmUgbGVzcyBidWZmZXIgYXMgYmVpbmcgYXZhaWxhYmxlIGZvciB1c2Vyc3BhY2UgY29uc3VtcHRpb24gKi8KKwlhc3NlcnQgKGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykgPiAwKTsKKwlhdG9taWNfZGVjICgmY2hhbi0+bl9mcmFncyk7CisKKwkvKiB3ZSBhcmUgYXQgYSBibG9jayBib3VuZGFyeSwgdGhlcmUgaXMgbm8gZnJhZ21lbnQgZGF0YSAqLworCWNoYW4tPnNsb3BfbGVuID0gMDsKKworCS8qIGlmIFNHRCBoYXMgbm90IHlldCBiZWVuIHN0YXJ0ZWQsIHN0YXJ0IGl0ICovCisJdmlhX2NoYW5fbWF5YmVfc3RhcnQgKGNoYW4pOworCisJRFBSSU5USyAoIkZsdXNoZWQgYmxvY2sgJXUsIHN3X3B0ciBub3cgJXUsIG5fZnJhZ3Mgbm93ICVkXG4iLAorCQluLCBjaGFuLT5zd19wdHIsIGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykpOworCisJRFBSSU5USyAoInJlZ3M9PVM9JTAyWCBDPSUwMlggVFA9JTAyWCBCUD0lMDhYIFJUPSUwOFggU0c9JTA4WCBDQz0lMDhYIFNTPSUwOFhcbiIsCisJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMCksCisJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMSksCisJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMiksCisJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHgwNCksCisJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHgwOCksCisJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHgwQyksCisJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHg4MCksCisJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHg4NCkpOworCisJaWYgKGNvdW50ID4gMCkKKwkJZ290byBoYW5kbGVfb25lX2Jsb2NrOworCitvdXQ6CisJaWYgKHVzZXJidWYgLSBvcmlnX3VzZXJidWYpCisJCXJldHVybiB1c2VyYnVmIC0gb3JpZ191c2VyYnVmOworCWVsc2UKKwkJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgc3NpemVfdCB2aWFfZHNwX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisJc3NpemVfdCByYzsKKwlpbnQgbm9uYmxvY2sgPSAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCisJRFBSSU5USyAoIkVOVEVSLCBmaWxlPSVwLCBidWZmZXI9JXAsIGNvdW50PSV1LCBwcG9zPSVsdVxuIiwKKwkJIGZpbGUsIGJ1ZmZlciwgY291bnQsIHBwb3MgPyAoKHVuc2lnbmVkIGxvbmcpKnBwb3MpIDogMCk7CisKKwlhc3NlcnQgKGZpbGUgIT0gTlVMTCk7CisJY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlyYyA9IHZpYV9zeXNjYWxsX2Rvd24gKGNhcmQsIG5vbmJsb2NrKTsKKwlpZiAocmMpIGdvdG8gb3V0OworCisJaWYgKGNhcmQtPmNoX291dC5pc19tYXBwZWQpIHsKKwkJcmMgPSAtRU5YSU87CisJCWdvdG8gb3V0X3VwOworCX0KKworCXZpYV9jaGFuX3NldF9idWZmZXJpbmcoY2FyZCwgJmNhcmQtPmNoX291dCwgLTEpOworCXJjID0gdmlhX2NoYW5fYnVmZmVyX2luaXQgKGNhcmQsICZjYXJkLT5jaF9vdXQpOworCisJaWYgKHJjKQorCQlnb3RvIG91dF91cDsKKworCXJjID0gdmlhX2RzcF9kb193cml0ZSAoY2FyZCwgYnVmZmVyLCBjb3VudCwgbm9uYmxvY2spOworCitvdXRfdXA6CisJdXAgKCZjYXJkLT5zeXNjYWxsX3NlbSk7CitvdXQ6CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlbGRcbiIsKGxvbmcpIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHVuc2lnbmVkIGludCB2aWFfZHNwX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCBwb2xsX3RhYmxlX3N0cnVjdCAqd2FpdCkKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisJc3RydWN0IHZpYV9jaGFubmVsICpjaGFuOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlhc3NlcnQgKGZpbGUgIT0gTlVMTCk7CisJY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQljaGFuID0gJmNhcmQtPmNoX2luOworCQlpZiAoc2dfYWN0aXZlIChjaGFuLT5pb2Jhc2UpKQorCSAgICAgICAgICAgICAgICBwb2xsX3dhaXQoZmlsZSwgJmNoYW4tPndhaXQsIHdhaXQpOworCQlpZiAoYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKSA+IDApCisJCQltYXNrIHw9IFBPTExJTiB8IFBPTExSRE5PUk07CisJfQorCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCWNoYW4gPSAmY2FyZC0+Y2hfb3V0OworCQlpZiAoc2dfYWN0aXZlIChjaGFuLT5pb2Jhc2UpKQorCSAgICAgICAgICAgICAgICBwb2xsX3dhaXQoZmlsZSwgJmNoYW4tPndhaXQsIHdhaXQpOworCQlpZiAoYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKSA+IDApCisJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCX0KKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgJXVcbiIsIG1hc2spOworCXJldHVybiBtYXNrOworfQorCisKKy8qKgorICoJdmlhX2RzcF9kcmFpbl9wbGF5YmFjayAtIHNsZWVwIHVudGlsIGFsbCBwbGF5YmFjayBzYW1wbGVzIGFyZSBmbHVzaGVkCisgKglAY2FyZDogUHJpdmF0ZSBpbmZvIGZvciBzcGVjaWZpZWQgYm9hcmQKKyAqCUBjaGFuOiBDaGFubmVsIHRvIGRyYWluCisgKglAbm9uYmxvY2s6IGJvb2xlYW4sIG5vbi16ZXJvIGlmIE9fTk9OQkxPQ0sgaXMgc2V0CisgKgorICoJU2xlZXBzIHVudGlsIGFsbCBwbGF5YmFjayBoYXMgYmVlbiBmbHVzaGVkIHRvIHRoZSBhdWRpbworICoJaGFyZHdhcmUuCisgKgorICoJTG9ja2luZzogaW5zaWRlIGNhcmQtPnN5c2NhbGxfc2VtCisgKi8KKworc3RhdGljIGludCB2aWFfZHNwX2RyYWluX3BsYXliYWNrIChzdHJ1Y3QgdmlhX2luZm8gKmNhcmQsCisJCQkJICAgc3RydWN0IHZpYV9jaGFubmVsICpjaGFuLCBpbnQgbm9uYmxvY2spCit7CisgICAgICAgIERFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCWludCByZXQgPSAwOworCisJRFBSSU5USyAoIkVOVEVSLCBub25ibG9jayA9ICVkXG4iLCBub25ibG9jayk7CisKKwlpZiAoY2hhbi0+c2xvcF9sZW4gPiAwKQorCQl2aWFfY2hhbl9mbHVzaF9mcmFnIChjaGFuKTsKKworCWlmIChhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpID09IGNoYW4tPmZyYWdfbnVtYmVyKQorCQlnb3RvIG91dDsKKworCXZpYV9jaGFuX21heWJlX3N0YXJ0IChjaGFuKTsKKworCWFkZF93YWl0X3F1ZXVlKCZjaGFuLT53YWl0LCAmd2FpdCk7CisJZm9yICg7OykgeworCQlEUFJJTlRLICgiRlJBR1MgJWQgRlJBR05VTSAlZFxuIiwgYXRvbWljX3JlYWQoJmNoYW4tPm5fZnJhZ3MpLCBjaGFuLT5mcmFnX251bWJlcik7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykgPj0gY2hhbi0+ZnJhZ19udW1iZXIpCisJCQlicmVhazsKKworCQlpZiAobm9uYmxvY2spIHsKKwkJCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgLUVBR0FJTlxuIik7CisJCQlyZXQgPSAtRUFHQUlOOworCQkJYnJlYWs7CisJCX0KKworI2lmZGVmIFZJQV9ERUJVRworCQl7CisJCXU4IHI0MCxyNDEscjQyLHI0MyxyNDQscjQ4OworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0MCwgJnI0MCk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQxLCAmcjQxKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDIsICZyNDIpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0MywgJnI0Myk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQ0LCAmcjQ0KTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDgsICZyNDgpOworCQlEUFJJTlRLICgiUENJIGNvbmZpZzogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlyNDAscjQxLHI0MixyNDMscjQ0LHI0OCk7CisKKwkJRFBSSU5USyAoInJlZ3M9PSUwMlggJTAyWCAlMDJYICUwOFggJTA4WCAlMDhYICUwOFhcbiIsCisJCQkgaW5iIChjYXJkLT5iYXNlYWRkciArIDB4MDApLAorCQkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAxKSwKKwkJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMiksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4MDQpLAorCQkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDBDKSwKKwkJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHg4MCksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4ODQpKTsKKwkJfQorCisJCWlmICghY2hhbi0+aXNfYWN0aXZlKQorCQkJcHJpbnRrIChLRVJOX0VSUiAic2xlZXBpbmcgYnV0IG5vdCBhY3RpdmVcbiIpOworI2VuZGlmCisKKwkJdXAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKKworCQlEUFJJTlRLICgic2xlZXBpbmcsIG5idWZzPSVkXG4iLCBhdG9taWNfcmVhZCAoJmNoYW4tPm5fZnJhZ3MpKTsKKwkJc2NoZWR1bGUoKTsKKworCQlpZiAoKHJldCA9IHZpYV9zeXNjYWxsX2Rvd24gKGNhcmQsIG5vbmJsb2NrKSkpCisJCQlicmVhazsKKworCQlpZiAoc2lnbmFsX3BlbmRpbmcgKGN1cnJlbnQpKSB7CisJCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIC1FUkVTVEFSVFNZU1xuIik7CisJCQlyZXQgPSAtRVJFU1RBUlRTWVM7CisJCQlicmVhazsKKwkJfQorCX0KKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZjaGFuLT53YWl0LCAmd2FpdCk7CisKKyNpZmRlZiBWSUFfREVCVUcKKwl7CisJCXU4IHI0MCxyNDEscjQyLHI0MyxyNDQscjQ4OworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0MCwgJnI0MCk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQxLCAmcjQxKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDIsICZyNDIpOworCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAoY2FyZC0+cGRldiwgMHg0MywgJnI0Myk7CisJCXBjaV9yZWFkX2NvbmZpZ19ieXRlIChjYXJkLT5wZGV2LCAweDQ0LCAmcjQ0KTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKGNhcmQtPnBkZXYsIDB4NDgsICZyNDgpOworCQlEUFJJTlRLICgiUENJIGNvbmZpZzogJTAyWCAlMDJYICUwMlggJTAyWCAlMDJYICUwMlhcbiIsCisJCQlyNDAscjQxLHI0MixyNDMscjQ0LHI0OCk7CisKKwkJRFBSSU5USyAoInJlZ3M9PSUwMlggJTAyWCAlMDJYICUwOFggJTA4WCAlMDhYICUwOFhcbiIsCisJCQkgaW5iIChjYXJkLT5iYXNlYWRkciArIDB4MDApLAorCQkJIGluYiAoY2FyZC0+YmFzZWFkZHIgKyAweDAxKSwKKwkJCSBpbmIgKGNhcmQtPmJhc2VhZGRyICsgMHgwMiksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4MDQpLAorCQkJIGlubCAoY2FyZC0+YmFzZWFkZHIgKyAweDBDKSwKKwkJCSBpbmwgKGNhcmQtPmJhc2VhZGRyICsgMHg4MCksCisJCQkgaW5sIChjYXJkLT5iYXNlYWRkciArIDB4ODQpKTsKKworCQlEUFJJTlRLICgiZmluYWwgbmJ1ZnM9JWRcbiIsIGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncykpOworCX0KKyNlbmRpZgorCitvdXQ6CisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0OworfQorCisKKy8qKgorICoJdmlhX2RzcF9pb2N0bF9zcGFjZSAtIGdldCBpbmZvcm1hdGlvbiBhYm91dCBjaGFubmVsIGJ1ZmZlcmluZworICoJQGNhcmQ6IFByaXZhdGUgaW5mbyBmb3Igc3BlY2lmaWVkIGJvYXJkCisgKglAY2hhbjogcG9pbnRlciB0byBjaGFubmVsLXNwZWNpZmljIGluZm8KKyAqCUBhcmc6IHVzZXIgYnVmZmVyIGZvciByZXR1cm5lZCBpbmZvcm1hdGlvbgorICoKKyAqCUhhbmRsZXMgU05EQ1RMX0RTUF9HRVRJU1BBQ0UgYW5kIFNORENUTF9EU1BfR0VUT1NQQUNFLgorICoKKyAqCUxvY2tpbmc6IGluc2lkZSBjYXJkLT5zeXNjYWxsX3NlbQorICovCisKK3N0YXRpYyBpbnQgdmlhX2RzcF9pb2N0bF9zcGFjZSAoc3RydWN0IHZpYV9pbmZvICpjYXJkLAorCQkJCXN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiwKKwkJCQl2b2lkIF9fdXNlciAqYXJnKQoreworCWF1ZGlvX2J1Zl9pbmZvIGluZm87CisKKwl2aWFfY2hhbl9zZXRfYnVmZmVyaW5nKGNhcmQsIGNoYW4sIC0xKTsKKworCWluZm8uZnJhZ3N0b3RhbCA9IGNoYW4tPmZyYWdfbnVtYmVyOworCWluZm8uZnJhZ3NpemUgPSBjaGFuLT5mcmFnX3NpemU7CisKKwkvKiBudW1iZXIgb2YgZnVsbCBmcmFnbWVudHMgd2UgY2FuIHJlYWQvd3JpdGUgd2l0aG91dCBibG9ja2luZyAqLworCWluZm8uZnJhZ21lbnRzID0gYXRvbWljX3JlYWQgKCZjaGFuLT5uX2ZyYWdzKTsKKworCWlmICgoY2hhbi0+c2xvcF9sZW4gJSBjaGFuLT5mcmFnX3NpemUgPiAwKSAmJiAoaW5mby5mcmFnbWVudHMgPiAwKSkKKwkJaW5mby5mcmFnbWVudHMtLTsKKworCS8qIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIG9yIHdyaXR0ZW4gaW1tZWRpYXRlbHkKKwkgKiB3aXRob3V0IGJsb2NraW5nLgorCSAqLworCWluZm8uYnl0ZXMgPSAoaW5mby5mcmFnbWVudHMgKiBjaGFuLT5mcmFnX3NpemUpOworCWlmIChjaGFuLT5zbG9wX2xlbiAlIGNoYW4tPmZyYWdfc2l6ZSA+IDApCisJCWluZm8uYnl0ZXMgKz0gY2hhbi0+ZnJhZ19zaXplIC0gKGNoYW4tPnNsb3BfbGVuICUgY2hhbi0+ZnJhZ19zaXplKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgZnJhZ3N0b3RhbD0lZCwgZnJhZ3NpemU9JWQsIGZyYWdtZW50cz0lZCwgYnl0ZXM9JWRcbiIsCisJCWluZm8uZnJhZ3N0b3RhbCwKKwkJaW5mby5mcmFnc2l6ZSwKKwkJaW5mby5mcmFnbWVudHMsCisJCWluZm8uYnl0ZXMpOworCisJcmV0dXJuIGNvcHlfdG9fdXNlciAoYXJnLCAmaW5mbywgc2l6ZW9mIChpbmZvKSk/LUVGQVVMVDowOworfQorCisKKy8qKgorICoJdmlhX2RzcF9pb2N0bF9wdHIgLSBnZXQgaW5mb3JtYXRpb24gYWJvdXQgaGFyZHdhcmUgYnVmZmVyIHB0cgorICoJQGNhcmQ6IFByaXZhdGUgaW5mbyBmb3Igc3BlY2lmaWVkIGJvYXJkCisgKglAY2hhbjogcG9pbnRlciB0byBjaGFubmVsLXNwZWNpZmljIGluZm8KKyAqCUBhcmc6IHVzZXIgYnVmZmVyIGZvciByZXR1cm5lZCBpbmZvcm1hdGlvbgorICoKKyAqCUhhbmRsZXMgU05EQ1RMX0RTUF9HRVRJUFRSIGFuZCBTTkRDVExfRFNQX0dFVE9QVFIuCisgKgorICoJTG9ja2luZzogaW5zaWRlIGNhcmQtPnN5c2NhbGxfc2VtCisgKi8KKworc3RhdGljIGludCB2aWFfZHNwX2lvY3RsX3B0ciAoc3RydWN0IHZpYV9pbmZvICpjYXJkLAorCQkJCXN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbiwKKwkJCQl2b2lkIF9fdXNlciAqYXJnKQoreworCWNvdW50X2luZm8gaW5mbzsKKworCXNwaW5fbG9ja19pcnEgKCZjYXJkLT5sb2NrKTsKKworCWluZm8uYnl0ZXMgPSBjaGFuLT5ieXRlczsKKwlpbmZvLmJsb2NrcyA9IGNoYW4tPm5faXJxczsKKwljaGFuLT5uX2lycXMgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxICgmY2FyZC0+bG9jayk7CisKKwlpZiAoY2hhbi0+aXNfYWN0aXZlKSB7CisJCXVuc2lnbmVkIGxvbmcgZXh0cmE7CisJCWluZm8ucHRyID0gYXRvbWljX3JlYWQgKCZjaGFuLT5od19wdHIpICogY2hhbi0+ZnJhZ19zaXplOworCQlleHRyYSA9IGNoYW4tPmZyYWdfc2l6ZSAtIHZpYV9zZ19vZmZzZXQoY2hhbik7CisJCWluZm8ucHRyICs9IGV4dHJhOworCQlpbmZvLmJ5dGVzICs9IGV4dHJhOworCX0gZWxzZSB7CisJCWluZm8ucHRyID0gMDsKKwl9CisKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIGJ5dGVzPSVkLCBibG9ja3M9JWQsIHB0cj0lZFxuIiwKKwkJaW5mby5ieXRlcywKKwkJaW5mby5ibG9ja3MsCisJCWluZm8ucHRyKTsKKworCXJldHVybiBjb3B5X3RvX3VzZXIgKGFyZywgJmluZm8sIHNpemVvZiAoaW5mbykpPy1FRkFVTFQ6MDsKK30KKworCitzdGF0aWMgaW50IHZpYV9kc3BfaW9jdGxfdHJpZ2dlciAoc3RydWN0IHZpYV9jaGFubmVsICpjaGFuLCBpbnQgdmFsKQoreworCWludCBlbmFibGUsIGRvX3NvbWV0aGluZzsKKworCWlmIChjaGFuLT5pc19yZWNvcmQpCisJCWVuYWJsZSA9ICh2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKTsKKwllbHNlCisJCWVuYWJsZSA9ICh2YWwgJiBQQ01fRU5BQkxFX09VVFBVVCk7CisKKwlpZiAoIWNoYW4tPmlzX2VuYWJsZWQgJiYgZW5hYmxlKSB7CisJCWRvX3NvbWV0aGluZyA9IDE7CisJfSBlbHNlIGlmIChjaGFuLT5pc19lbmFibGVkICYmICFlbmFibGUpIHsKKwkJZG9fc29tZXRoaW5nID0gLTE7CisJfSBlbHNlIHsKKwkJZG9fc29tZXRoaW5nID0gMDsKKwl9CisKKwlEUFJJTlRLICgiZW5hYmxlPSVkLCBkb19zb21ldGhpbmc9JWRcbiIsCisJCSBlbmFibGUsIGRvX3NvbWV0aGluZyk7CisKKwlpZiAoY2hhbi0+aXNfYWN0aXZlICYmIGRvX3NvbWV0aGluZykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoZG9fc29tZXRoaW5nID09IDEpIHsKKwkJY2hhbi0+aXNfZW5hYmxlZCA9IDE7CisJCXZpYV9jaGFuX21heWJlX3N0YXJ0IChjaGFuKTsKKwkJRFBSSU5USyAoIlRyaWdnZXJpbmcgaW5wdXRcbiIpOworCX0KKworCWVsc2UgaWYgKGRvX3NvbWV0aGluZyA9PSAtMSkgeworCQljaGFuLT5pc19lbmFibGVkID0gMDsKKwkJRFBSSU5USyAoIlNldHVwIGlucHV0IHRyaWdnZXJcbiIpOworCX0KKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBpbnQgdmlhX2RzcF9pb2N0bCAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCWludCByYywgcmQ9MCwgd3I9MCwgdmFsPTA7CisJc3RydWN0IHZpYV9pbmZvICpjYXJkOworCXN0cnVjdCB2aWFfY2hhbm5lbCAqY2hhbjsKKwlpbnQgbm9uYmxvY2sgPSAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spOworCWludCBfX3VzZXIgKmlwID0gKGludCBfX3VzZXIgKilhcmc7CisJdm9pZCBfX3VzZXIgKnAgPSAodm9pZCBfX3VzZXIgKilhcmc7CisKKwlhc3NlcnQgKGZpbGUgIT0gTlVMTCk7CisJY2FyZCA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlhc3NlcnQgKGNhcmQgIT0gTlVMTCk7CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpCisJCXdyID0gMTsKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkKKwkJcmQgPSAxOworCisJcmMgPSB2aWFfc3lzY2FsbF9kb3duIChjYXJkLCBub25ibG9jayk7CisJaWYgKHJjKQorCQlyZXR1cm4gcmM7CisJcmMgPSAtRUlOVkFMOworCisJc3dpdGNoIChjbWQpIHsKKworCS8qIE9TUyBBUEkgdmVyc2lvbi4gIFhYWCB1bnZlcmlmaWVkICovCisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJRFBSSU5USyAoImlvY3RsIE9TU19HRVRWRVJTSU9OLCBFWElULCByZXR1cm5pbmcgU09VTkRfVkVSU0lPTlxuIik7CisJCXJjID0gcHV0X3VzZXIgKFNPVU5EX1ZFUlNJT04sIGlwKTsKKwkJYnJlYWs7CisKKwkvKiBsaXN0IG9mIHN1cHBvcnRlZCBQQ00gZGF0YSBmb3JtYXRzICovCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CisJCURQUklOVEsgKCJEU1BfR0VURk1UUywgRVhJVCwgcmV0dXJuaW5nIEFGTVQgVTh8UzE2X0xFXG4iKTsKKyAgICAgICAgICAgICAgICByYyA9IHB1dF91c2VyIChBRk1UX1U4IHwgQUZNVF9TMTZfTEUsIGlwKTsKKwkJYnJlYWs7CisKKwkvKiBxdWVyeSBvciBzZXQgY3VycmVudCBjaGFubmVsJ3MgUENNIGRhdGEgZm9ybWF0ICovCisJY2FzZSBTTkRDVExfRFNQX1NFVEZNVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgaXApKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlEUFJJTlRLICgiRFNQX1NFVEZNVCwgdmFsPT0lZFxuIiwgdmFsKTsKKwkJaWYgKHZhbCAhPSBBRk1UX1FVRVJZKSB7CisJCQlyYyA9IDA7CisKKwkJCWlmIChyZCkKKwkJCQlyYyA9IHZpYV9jaGFuX3NldF9mbXQgKGNhcmQsICZjYXJkLT5jaF9pbiwgdmFsKTsKKworCQkJaWYgKHJjID49IDAgJiYgd3IpCisJCQkJcmMgPSB2aWFfY2hhbl9zZXRfZm10IChjYXJkLCAmY2FyZC0+Y2hfb3V0LCB2YWwpOworCisJCQlpZiAocmMgPCAwKQorCQkJCWJyZWFrOworCisJCQl2YWwgPSByYzsKKwkJfSBlbHNlIHsKKwkJCWlmICgocmQgJiYgKGNhcmQtPmNoX2luLnBjbV9mbXQgJiBWSUFfUENNX0ZNVF8xNkJJVCkpIHx8CisJCQkgICAgKHdyICYmIChjYXJkLT5jaF9vdXQucGNtX2ZtdCAmIFZJQV9QQ01fRk1UXzE2QklUKSkpCisJCQkJdmFsID0gQUZNVF9TMTZfTEU7CisJCQllbHNlCisJCQkJdmFsID0gQUZNVF9VODsKKwkJfQorCQlEUFJJTlRLICgiU0VURk1UIEVYSVQsIHJldHVybmluZyAlZFxuIiwgdmFsKTsKKyAgICAgICAgICAgICAgICByYyA9IHB1dF91c2VyICh2YWwsIGlwKTsKKwkJYnJlYWs7CisKKwkvKiBxdWVyeSBvciBzZXQgbnVtYmVyIG9mIGNoYW5uZWxzICgxPW1vbm8sIDI9c3RlcmVvLCA0LzYgZm9yIG11bHRpY2hhbm5lbCkgKi8KKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBpcCkpIHsKKwkJCXJjID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisJCURQUklOVEsgKCJEU1BfQ0hBTk5FTFMsIHZhbD09JWRcbiIsIHZhbCk7CisJCWlmICh2YWwgIT0gMCkgeworCQkJcmMgPSAwOworCisJCQlpZiAocmQpCisJCQkJcmMgPSB2aWFfY2hhbl9zZXRfc3RlcmVvIChjYXJkLCAmY2FyZC0+Y2hfaW4sIHZhbCk7CisKKwkJCWlmIChyYyA+PSAwICYmIHdyKQorCQkJCXJjID0gdmlhX2NoYW5fc2V0X3N0ZXJlbyAoY2FyZCwgJmNhcmQtPmNoX291dCwgdmFsKTsKKworCQkJaWYgKHJjIDwgMCkKKwkJCQlicmVhazsKKworCQkJdmFsID0gcmM7CisJCX0gZWxzZSB7CisJCQlpZiAocmQpCisJCQkJdmFsID0gY2FyZC0+Y2hfaW4uY2hhbm5lbHM7CisJCQllbHNlCisJCQkJdmFsID0gY2FyZC0+Y2hfb3V0LmNoYW5uZWxzOworCQl9CisJCURQUklOVEsgKCJDSEFOTkVMUyBFWElULCByZXR1cm5pbmcgJWRcbiIsIHZhbCk7CisgICAgICAgICAgICAgICAgcmMgPSBwdXRfdXNlciAodmFsLCBpcCk7CisJCWJyZWFrOworCisJLyogZW5hYmxlICh2YWwgaXMgbm90IHplcm8pIG9yIGRpc2FibGUgKHZhbCA9PSAwKSBzdGVyZW8gKi8KKyAgICAgICAgY2FzZSBTTkRDVExfRFNQX1NURVJFTzoKKwkJaWYgKGdldF91c2VyKHZhbCwgaXApKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlEUFJJTlRLICgiRFNQX1NURVJFTywgdmFsPT0lZFxuIiwgdmFsKTsKKwkJcmMgPSAwOworCisJCWlmIChyZCkKKwkJCXJjID0gdmlhX2NoYW5fc2V0X3N0ZXJlbyAoY2FyZCwgJmNhcmQtPmNoX2luLCB2YWwgPyAyIDogMSk7CisJCWlmIChyYyA+PSAwICYmIHdyKQorCQkJcmMgPSB2aWFfY2hhbl9zZXRfc3RlcmVvIChjYXJkLCAmY2FyZC0+Y2hfb3V0LCB2YWwgPyAyIDogMSk7CisKKwkJaWYgKHJjIDwgMCkKKwkJCWJyZWFrOworCisJCXZhbCA9IHJjIC0gMTsKKworCQlEUFJJTlRLICgiU1RFUkVPIEVYSVQsIHJldHVybmluZyAlZFxuIiwgdmFsKTsKKwkJcmMgPSBwdXRfdXNlcih2YWwsIGlwKTsKKwkJYnJlYWs7CisKKwkvKiBxdWVyeSBvciBzZXQgc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICBjYXNlIFNORENUTF9EU1BfU1BFRUQ6CisJCWlmIChnZXRfdXNlcih2YWwsIGlwKSkgeworCQkJcmMgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKwkJRFBSSU5USyAoIkRTUF9TUEVFRCwgdmFsPT0lZFxuIiwgdmFsKTsKKwkJaWYgKHZhbCA8IDApIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisJCWlmICh2YWwgPiAwKSB7CisJCQlyYyA9IDA7CisKKwkJCWlmIChyZCkKKwkJCQlyYyA9IHZpYV9jaGFuX3NldF9zcGVlZCAoY2FyZCwgJmNhcmQtPmNoX2luLCB2YWwpOworCQkJaWYgKHJjID49IDAgJiYgd3IpCisJCQkJcmMgPSB2aWFfY2hhbl9zZXRfc3BlZWQgKGNhcmQsICZjYXJkLT5jaF9vdXQsIHZhbCk7CisKKwkJCWlmIChyYyA8IDApCisJCQkJYnJlYWs7CisKKwkJCXZhbCA9IHJjOworCQl9IGVsc2UgeworCQkJaWYgKHJkKQorCQkJCXZhbCA9IGNhcmQtPmNoX2luLnJhdGU7CisJCQllbHNlIGlmICh3cikKKwkJCQl2YWwgPSBjYXJkLT5jaF9vdXQucmF0ZTsKKwkJCWVsc2UKKwkJCQl2YWwgPSAwOworCQl9CisJCURQUklOVEsgKCJTUEVFRCBFWElULCByZXR1cm5pbmcgJWRcbiIsIHZhbCk7CisgICAgICAgICAgICAgICAgcmMgPSBwdXRfdXNlciAodmFsLCBpcCk7CisJCWJyZWFrOworCisJLyogd2FpdCB1bnRpbCBhbGwgYnVmZmVycyBoYXZlIGJlZW4gcGxheWVkLCBhbmQgdGhlbiBzdG9wIGRldmljZSAqLworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlEUFJJTlRLICgiRFNQX1NZTkNcbiIpOworCQlyYyA9IDA7CisJCWlmICh3cikgeworCQkJRFBSSU5USyAoIlNZTkMgRVhJVCAoYWZ0ZXIgY2FsbGluZyB2aWFfZHNwX2RyYWluX3BsYXliYWNrKVxuIik7CisJCQlyYyA9IHZpYV9kc3BfZHJhaW5fcGxheWJhY2sgKGNhcmQsICZjYXJkLT5jaF9vdXQsIG5vbmJsb2NrKTsKKwkJfQorCQlicmVhazsKKworCS8qIHN0b3AgcmVjb3JkaW5nL3BsYXliYWNrIGltbWVkaWF0ZWx5ICovCisgICAgICAgIGNhc2UgU05EQ1RMX0RTUF9SRVNFVDoKKwkJRFBSSU5USyAoIkRTUF9SRVNFVFxuIik7CisJCWlmIChyZCkgeworCQkJdmlhX2NoYW5fY2xlYXIgKGNhcmQsICZjYXJkLT5jaF9pbik7CisJCQljYXJkLT5jaF9pbi5mcmFnX251bWJlciA9IDA7CisJCQljYXJkLT5jaF9pbi5mcmFnX3NpemUgPSAwOworCQkJYXRvbWljX3NldCgmY2FyZC0+Y2hfaW4ubl9mcmFncywgMCk7CisJCX0KKworCQlpZiAod3IpIHsKKwkJCXZpYV9jaGFuX2NsZWFyIChjYXJkLCAmY2FyZC0+Y2hfb3V0KTsKKwkJCWNhcmQtPmNoX291dC5mcmFnX251bWJlciA9IDA7CisJCQljYXJkLT5jaF9vdXQuZnJhZ19zaXplID0gMDsKKwkJCWF0b21pY19zZXQoJmNhcmQtPmNoX291dC5uX2ZyYWdzLCAwKTsKKwkJfQorCisJCXJjID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfTk9OQkxPQ0s6CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmMgPSAwOworCQlicmVhazsKKworCS8qIG9idGFpbiBiaXRtYXNrIG9mIGRldmljZSBjYXBhYmlsaXRpZXMsIHN1Y2ggYXMgbW1hcCwgZnVsbCBkdXBsZXgsIGV0Yy4gKi8KKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJRFBSSU5USyAoIkRTUF9HRVRDQVBTXG4iKTsKKwkJcmMgPSBwdXRfdXNlcihWSUFfRFNQX0NBUCwgaXApOworCQlicmVhazsKKworCS8qIG9idGFpbiBidWZmZXIgZnJhZ21lbnQgc2l6ZSAqLworCWNhc2UgU05EQ1RMX0RTUF9HRVRCTEtTSVpFOgorCQlEUFJJTlRLICgiRFNQX0dFVEJMS1NJWkVcbiIpOworCisJCWlmIChyZCkgeworCQkJdmlhX2NoYW5fc2V0X2J1ZmZlcmluZyhjYXJkLCAmY2FyZC0+Y2hfaW4sIC0xKTsKKwkJCXJjID0gcHV0X3VzZXIoY2FyZC0+Y2hfaW4uZnJhZ19zaXplLCBpcCk7CisJCX0gZWxzZSBpZiAod3IpIHsKKwkJCXZpYV9jaGFuX3NldF9idWZmZXJpbmcoY2FyZCwgJmNhcmQtPmNoX291dCwgLTEpOworCQkJcmMgPSBwdXRfdXNlcihjYXJkLT5jaF9vdXQuZnJhZ19zaXplLCBpcCk7CisJCX0KKwkJYnJlYWs7CisKKwkvKiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgaW5wdXQgYnVmZmVyaW5nICovCisJY2FzZSBTTkRDVExfRFNQX0dFVElTUEFDRToKKwkJRFBSSU5USyAoIkRTUF9HRVRJU1BBQ0VcbiIpOworCQlpZiAocmQpCisJCQlyYyA9IHZpYV9kc3BfaW9jdGxfc3BhY2UgKGNhcmQsICZjYXJkLT5jaF9pbiwgcCk7CisJCWJyZWFrOworCisJLyogb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IG91dHB1dCBidWZmZXJpbmcgKi8KKwljYXNlIFNORENUTF9EU1BfR0VUT1NQQUNFOgorCQlEUFJJTlRLICgiRFNQX0dFVE9TUEFDRVxuIik7CisJCWlmICh3cikKKwkJCXJjID0gdmlhX2RzcF9pb2N0bF9zcGFjZSAoY2FyZCwgJmNhcmQtPmNoX291dCwgcCk7CisJCWJyZWFrOworCisJLyogb2J0YWluIGluZm9ybWF0aW9uIGFib3V0IGlucHV0IGhhcmR3YXJlIHBvaW50ZXIgKi8KKwljYXNlIFNORENUTF9EU1BfR0VUSVBUUjoKKwkJRFBSSU5USyAoIkRTUF9HRVRJUFRSXG4iKTsKKwkJaWYgKHJkKQorCQkJcmMgPSB2aWFfZHNwX2lvY3RsX3B0ciAoY2FyZCwgJmNhcmQtPmNoX2luLCBwKTsKKwkJYnJlYWs7CisKKwkvKiBvYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgb3V0cHV0IGhhcmR3YXJlIHBvaW50ZXIgKi8KKwljYXNlIFNORENUTF9EU1BfR0VUT1BUUjoKKwkJRFBSSU5USyAoIkRTUF9HRVRPUFRSXG4iKTsKKwkJaWYgKHdyKQorCQkJcmMgPSB2aWFfZHNwX2lvY3RsX3B0ciAoY2FyZCwgJmNhcmQtPmNoX291dCwgcCk7CisJCWJyZWFrOworCisJLyogcmV0dXJuIG51bWJlciBvZiBieXRlcyByZW1haW5pbmcgdG8gYmUgcGxheWVkIGJ5IERNQSBlbmdpbmUgKi8KKwljYXNlIFNORENUTF9EU1BfR0VUT0RFTEFZOgorCQl7CisJCURQUklOVEsgKCJEU1BfR0VUT0RFTEFZXG4iKTsKKworCQljaGFuID0gJmNhcmQtPmNoX291dDsKKworCQlpZiAoIXdyKQorCQkJYnJlYWs7CisKKwkJaWYgKGNoYW4tPmlzX2FjdGl2ZSkgeworCisJCQl2YWwgPSBjaGFuLT5mcmFnX251bWJlciAtIGF0b21pY19yZWFkICgmY2hhbi0+bl9mcmFncyk7CisKKwkJCWFzc2VydCh2YWwgPj0gMCk7CisJCQkJCisJCQlpZiAodmFsID4gMCkgeworCQkJCXZhbCAqPSBjaGFuLT5mcmFnX3NpemU7CisJCQkJdmFsIC09IGNoYW4tPmZyYWdfc2l6ZSAtIHZpYV9zZ19vZmZzZXQoY2hhbik7CisJCQl9CisJCQl2YWwgKz0gY2hhbi0+c2xvcF9sZW4gJSBjaGFuLT5mcmFnX3NpemU7CisJCX0gZWxzZQorCQkJdmFsID0gMDsKKworCQlhc3NlcnQgKHZhbCA8PSAoY2hhbi0+ZnJhZ19zaXplICogY2hhbi0+ZnJhZ19udW1iZXIpKTsKKworCQlEUFJJTlRLICgiR0VUT0RFTEFZIEVYSVQsIHZhbCA9ICVkIGJ5dGVzXG4iLCB2YWwpOworICAgICAgICAgICAgICAgIHJjID0gcHV0X3VzZXIgKHZhbCwgaXApOworCQlicmVhazsKKwkJfQorCisJLyogaGFuZGxlIHRoZSBxdWljay1zdGFydCBvZiBhIGNoYW5uZWwsCisJICogb3IgdGhlIG5vdGlmaWNhdGlvbiB0aGF0IGEgcXVpY2stc3RhcnQgd2lsbAorCSAqIG9jY3VyIGluIHRoZSBmdXR1cmUKKwkgKi8KKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoKKwkJaWYgKGdldF91c2VyKHZhbCwgaXApKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlEUFJJTlRLICgiRFNQX1NFVFRSSUdHRVIsIHJkPSVkLCB3cj0lZCwgYWN0PSVkLyVkLCBlbj0lZC8lZFxuIiwKKwkJCXJkLCB3ciwgY2FyZC0+Y2hfaW4uaXNfYWN0aXZlLCBjYXJkLT5jaF9vdXQuaXNfYWN0aXZlLAorCQkJY2FyZC0+Y2hfaW4uaXNfZW5hYmxlZCwgY2FyZC0+Y2hfb3V0LmlzX2VuYWJsZWQpOworCisJCXJjID0gMDsKKworCQlpZiAocmQpCisJCQlyYyA9IHZpYV9kc3BfaW9jdGxfdHJpZ2dlciAoJmNhcmQtPmNoX2luLCB2YWwpOworCisJCWlmICghcmMgJiYgd3IpCisJCQlyYyA9IHZpYV9kc3BfaW9jdGxfdHJpZ2dlciAoJmNhcmQtPmNoX291dCwgdmFsKTsKKworCQlicmVhazsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRUUklHR0VSOgorCQl2YWwgPSAwOworCQlpZiAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpICYmIGNhcmQtPmNoX2luLmlzX2VuYWJsZWQpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwkJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYgY2FyZC0+Y2hfb3V0LmlzX2VuYWJsZWQpCisJCQl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCXJjID0gcHV0X3VzZXIodmFsLCBpcCk7CisJCWJyZWFrOworCisJLyogRW5hYmxlIGZ1bGwgZHVwbGV4LiAgU2luY2Ugd2UgZG8gdGhpcyBhcyBzb29uIGFzIHdlIGFyZSBvcGVuZWQKKwkgKiB3aXRoIE9fUkRXUiwgdGhpcyBpcyBtYWlubHkgYSBuby1vcCB0aGF0IGFsd2F5cyByZXR1cm5zIHN1Y2Nlc3MuCisJICovCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJRFBSSU5USyAoIkRTUF9TRVREVVBMRVhcbiIpOworCQlpZiAoIXJkIHx8ICF3cikKKwkJCWJyZWFrOworCQlyYyA9IDA7CisJCWJyZWFrOworCisJLyogc2V0IGZyYWdtZW50IHNpemUuICBpbXBsZW1lbnRlZCBhcyBhIHN1Y2Nlc3NmdWwgbm8tb3AgZm9yIG5vdyAqLworCWNhc2UgU05EQ1RMX0RTUF9TRVRGUkFHTUVOVDoKKwkJaWYgKGdldF91c2VyKHZhbCwgaXApKSB7CisJCQlyYyA9IC1FRkFVTFQ7CisJCQlicmVhazsKKwkJfQorCQlEUFJJTlRLICgiRFNQX1NFVEZSQUdNRU5ULCB2YWw9PSVkXG4iLCB2YWwpOworCisJCWlmIChyZCkKKwkJCXJjID0gdmlhX2NoYW5fc2V0X2J1ZmZlcmluZyhjYXJkLCAmY2FyZC0+Y2hfaW4sIHZhbCk7CisKKwkJaWYgKHdyKQorCQkJcmMgPSB2aWFfY2hhbl9zZXRfYnVmZmVyaW5nKGNhcmQsICZjYXJkLT5jaF9vdXQsIHZhbCk7CisKKwkJRFBSSU5USyAoIlNORENUTF9EU1BfU0VURlJBR01FTlQgKGZyYWdzaGlmdD09MHglMDRYICglZCksIG1heGZyYWdzPT0weCUwNFggKCVkKSlcbiIsCisJCQkgdmFsICYgMHhGRkZGLAorCQkJIHZhbCAmIDB4RkZGRiwKKwkJCSAodmFsID4+IDE2KSAmIDB4RkZGRiwKKwkJCSAodmFsID4+IDE2KSAmIDB4RkZGRik7CisKKwkJcmMgPSAwOworCQlicmVhazsKKworCS8qIGluZm9ybSBkZXZpY2Ugb2YgYW4gdXBjb21pbmcgcGF1c2UgaW4gaW5wdXQgKG9yIG91dHB1dCkuICovCisJY2FzZSBTTkRDVExfRFNQX1BPU1Q6CisJCURQUklOVEsgKCJEU1BfUE9TVFxuIik7CisJCWlmICh3cikgeworCQkJaWYgKGNhcmQtPmNoX291dC5zbG9wX2xlbiA+IDApCisJCQkJdmlhX2NoYW5fZmx1c2hfZnJhZyAoJmNhcmQtPmNoX291dCk7CisJCQl2aWFfY2hhbl9tYXliZV9zdGFydCAoJmNhcmQtPmNoX291dCk7CisJCX0KKworCQlyYyA9IDA7CisJCWJyZWFrOworCisJLyogbm90IGltcGxlbWVudGVkICovCisJZGVmYXVsdDoKKwkJRFBSSU5USyAoInVuaGFuZGxlZCBpb2N0bCwgY21kPT0ldSwgYXJnPT0lcFxuIiwKKwkJCSBjbWQsIHApOworCQlicmVhazsKKwl9CisKKwl1cCAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKKwlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nICVkXG4iLCByYyk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgdmlhX2RzcF9vcGVuIChzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlpbnQgbWlub3IgPSBpbWlub3IoaW5vZGUpOworCXN0cnVjdCB2aWFfaW5mbyAqY2FyZDsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IE5VTEw7CisJc3RydWN0IHZpYV9jaGFubmVsICpjaGFuOworCXN0cnVjdCBwY2lfZHJpdmVyICpkcnZyOworCWludCBub25ibG9jayA9IChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisKKwlEUFJJTlRLICgiRU5URVIsIG1pbm9yPSVkLCBmaWxlLT5mX21vZGU9MHgleFxuIiwgbWlub3IsIGZpbGUtPmZfbW9kZSk7CisKKwlpZiAoIShmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKSkpIHsKKwkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAtRUlOVkFMXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2FyZCA9IE5VTEw7CisJd2hpbGUgKChwZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHBkZXYpKSAhPSBOVUxMKSB7CisJCWRydnIgPSBwY2lfZGV2X2RyaXZlciAocGRldik7CisJCWlmIChkcnZyID09ICZ2aWFfZHJpdmVyKSB7CisJCQlhc3NlcnQgKHBjaV9nZXRfZHJ2ZGF0YSAocGRldikgIT0gTlVMTCk7CisKKwkJCWNhcmQgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCQkJRFBSSU5USyAoImRldl9kc3AgPSAlZCwgbWlub3IgPSAlZCwgYXNzbiA9ICVkXG4iLAorCQkJCSBjYXJkLT5kZXZfZHNwLCBtaW5vciwKKwkJCQkgKGNhcmQtPmRldl9kc3AgXiBtaW5vcikgJiB+MHhmKTsKKworCQkJaWYgKCgoY2FyZC0+ZGV2X2RzcCBeIG1pbm9yKSAmIH4weGYpID09IDApCisJCQkJZ290byBtYXRjaDsKKwkJfQorCX0KKworCURQUklOVEsgKCJubyBtYXRjaGluZyAlcyBmb3VuZFxuIiwgY2FyZCA/ICJtaW5vciIgOiAiZHJpdmVyIik7CisJcmV0dXJuIC1FTk9ERVY7CisKK21hdGNoOgorCWlmIChub25ibG9jaykgeworCQlpZiAoZG93bl90cnlsb2NrICgmY2FyZC0+b3Blbl9zZW0pKSB7CisJCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIC1FQUdBSU5cbiIpOworCQkJcmV0dXJuIC1FQUdBSU47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoZG93bl9pbnRlcnJ1cHRpYmxlICgmY2FyZC0+b3Blbl9zZW0pKSB7CisJCQlEUFJJTlRLICgiRVhJVCwgcmV0dXJuaW5nIC1FUkVTVEFSVFNZU1xuIik7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJfQorCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gY2FyZDsKKwlEUFJJTlRLICgiZmlsZS0+Zl9tb2RlID09IDB4JXhcbiIsIGZpbGUtPmZfbW9kZSk7CisKKwkvKiBoYW5kbGUgaW5wdXQgZnJvbSBhbmFsb2cgc291cmNlICovCisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJY2hhbiA9ICZjYXJkLT5jaF9pbjsKKworCQl2aWFfY2hhbl9pbml0IChjYXJkLCBjaGFuKTsKKworCQkvKiB3aHkgaXMgdGhpcyBmb3JjZWQgdG8gMTYtYml0IHN0ZXJlbyBpbiBhbGwgZHJpdmVycz8gKi8KKwkJY2hhbi0+cGNtX2ZtdCA9IFZJQV9QQ01fRk1UXzE2QklUIHwgVklBX1BDTV9GTVRfU1RFUkVPOworCQljaGFuLT5jaGFubmVscyA9IDI7CisKKwkJLy8gVE8gRE8gLSB1c2UgRklGTzogdmlhX2NhcHR1cmVfZmlmbyhjYXJkLCAxKTsKKwkJdmlhX2NoYW5fcGNtX2ZtdCAoY2hhbiwgMCk7CisJCXZpYV9zZXRfcmF0ZSAoY2FyZC0+YWM5NywgY2hhbiwgNDQxMDApOworCX0KKworCS8qIGhhbmRsZSBvdXRwdXQgdG8gYW5hbG9nIHNvdXJjZSAqLworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQljaGFuID0gJmNhcmQtPmNoX291dDsKKworCQl2aWFfY2hhbl9pbml0IChjYXJkLCBjaGFuKTsKKworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJLyogaWYgaW4gZHVwbGV4IG1vZGUgbWFrZSB0aGUgcmVjb3JkaW5nIGFuZCBwbGF5YmFjayBjaGFubmVscworCQkJICAgaGF2ZSB0aGUgc2FtZSBzZXR0aW5ncyAqLworCQkJY2hhbi0+cGNtX2ZtdCA9IFZJQV9QQ01fRk1UXzE2QklUIHwgVklBX1BDTV9GTVRfU1RFUkVPOworCQkJY2hhbi0+Y2hhbm5lbHMgPSAyOworCQkJdmlhX2NoYW5fcGNtX2ZtdCAoY2hhbiwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICB2aWFfc2V0X3JhdGUgKGNhcmQtPmFjOTcsIGNoYW4sIDQ0MTAwKTsKKwkJfSBlbHNlIHsKKwkJCSBpZiAoKG1pbm9yICYgMHhmKSA9PSBTTkRfREVWX0RTUDE2KSB7CisJCQkJY2hhbi0+cGNtX2ZtdCA9IFZJQV9QQ01fRk1UXzE2QklUOworCQkJCXZpYV9jaGFuX3BjbV9mbXQgKGNoYW4sIDApOworCQkJCXZpYV9zZXRfcmF0ZSAoY2FyZC0+YWM5NywgY2hhbiwgNDQxMDApOworCQkJfSBlbHNlIHsKKwkJCQl2aWFfY2hhbl9wY21fZm10IChjaGFuLCAxKTsKKwkJCQl2aWFfc2V0X3JhdGUgKGNhcmQtPmFjOTcsIGNoYW4sIDgwMDApOworCQkJfQorCQl9CisJfQorCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAwXG4iKTsKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKKworc3RhdGljIGludCB2aWFfZHNwX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHZpYV9pbmZvICpjYXJkOworCWludCBub25ibG9jayA9IChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSyk7CisJaW50IHJjOworCisJRFBSSU5USyAoIkVOVEVSXG4iKTsKKworCWFzc2VydCAoZmlsZSAhPSBOVUxMKTsKKwljYXJkID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCWFzc2VydCAoY2FyZCAhPSBOVUxMKTsKKworCXJjID0gdmlhX3N5c2NhbGxfZG93biAoY2FyZCwgbm9uYmxvY2spOworCWlmIChyYykgeworCQlEUFJJTlRLICgiRVhJVCAoc3lzY2FsbF9kb3duIGVycm9yKSwgcmM9JWRcbiIsIHJjKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQlyYyA9IHZpYV9kc3BfZHJhaW5fcGxheWJhY2sgKGNhcmQsICZjYXJkLT5jaF9vdXQsIG5vbmJsb2NrKTsKKwkJaWYgKHJjICYmIHJjICE9IC1FUkVTVEFSVFNZUykJLyogTm9ib2R5IG5lZWRzIHRvIGtub3cgYWJvdXQgXkMgKi8KKwkJCXByaW50ayAoS0VSTl9ERUJVRyAidmlhX2F1ZGlvOiBpZ25vcmluZyBkcmFpbiBwbGF5YmFjayBlcnJvciAlZFxuIiwgcmMpOworCisJCXZpYV9jaGFuX2ZyZWUgKGNhcmQsICZjYXJkLT5jaF9vdXQpOworCQl2aWFfY2hhbl9idWZmZXJfZnJlZShjYXJkLCAmY2FyZC0+Y2hfb3V0KTsKKwl9CisKKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQl2aWFfY2hhbl9mcmVlIChjYXJkLCAmY2FyZC0+Y2hfaW4pOworCQl2aWFfY2hhbl9idWZmZXJfZnJlZSAoY2FyZCwgJmNhcmQtPmNoX2luKTsKKwl9CisKKwl1cCAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKKwl1cCAoJmNhcmQtPm9wZW5fc2VtKTsKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDaGlwIHNldHVwIGFuZCBrZXJuZWwgcmVnaXN0cmF0aW9uCisgKgorICoKKyAqLworCitzdGF0aWMgaW50IF9fZGV2aW5pdCB2aWFfaW5pdF9vbmUgKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqaWQpCit7CisjaWZkZWYgQ09ORklHX01JRElfVklBODJDWFhYCisJdTggcjQyOworI2VuZGlmCisJaW50IHJjOworCXN0cnVjdCB2aWFfaW5mbyAqY2FyZDsKKwlzdGF0aWMgaW50IHByaW50ZWRfdmVyc2lvbjsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlpZiAocHJpbnRlZF92ZXJzaW9uKysgPT0gMCkKKwkJcHJpbnRrIChLRVJOX0lORk8gIlZpYSA2ODZhLzgyMzMvODIzNSBhdWRpbyBkcml2ZXIgIiBWSUFfVkVSU0lPTiAiXG4iKTsKKworCXJjID0gcGNpX2VuYWJsZV9kZXZpY2UgKHBkZXYpOworCWlmIChyYykKKwkJZ290byBlcnJfb3V0OworCisJcmMgPSBwY2lfcmVxdWVzdF9yZWdpb25zIChwZGV2LCAidmlhODJjeHh4X2F1ZGlvIik7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfZGlzYWJsZTsKKworCXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCAweGZmZmZmZmZmVUxMKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyX291dF9yZXM7CisJcmMgPSBwY2lfc2V0X2NvbnNpc3RlbnRfZG1hX21hc2socGRldiwgMHhmZmZmZmZmZlVMTCk7CisJaWYgKHJjKQorCQlnb3RvIGVycl9vdXRfcmVzOworCisJY2FyZCA9IGttYWxsb2MgKHNpemVvZiAoKmNhcmQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWNhcmQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggIm91dCBvZiBtZW1vcnksIGFib3J0aW5nXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycl9vdXRfcmVzOworCX0KKworCXBjaV9zZXRfZHJ2ZGF0YSAocGRldiwgY2FyZCk7CisKKwltZW1zZXQgKGNhcmQsIDAsIHNpemVvZiAoKmNhcmQpKTsKKwljYXJkLT5wZGV2ID0gcGRldjsKKwljYXJkLT5iYXNlYWRkciA9IHBjaV9yZXNvdXJjZV9zdGFydCAocGRldiwgMCk7CisJY2FyZC0+Y2FyZF9udW0gPSB2aWFfbnVtX2NhcmRzKys7CisJc3Bpbl9sb2NrX2luaXQgKCZjYXJkLT5sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCAoJmNhcmQtPmFjOTdfbG9jayk7CisJaW5pdF9NVVRFWCAoJmNhcmQtPnN5c2NhbGxfc2VtKTsKKwlpbml0X01VVEVYICgmY2FyZC0+b3Blbl9zZW0pOworCisJLyogd2UgbXVzdCBpbml0IHRoZXNlIG5vdywgaW4gY2FzZSB0aGUgaW50ciBoYW5kbGVyIG5lZWRzIHRoZW0gKi8KKwl2aWFfY2hhbl9pbml0X2RlZmF1bHRzIChjYXJkLCAmY2FyZC0+Y2hfb3V0KTsKKwl2aWFfY2hhbl9pbml0X2RlZmF1bHRzIChjYXJkLCAmY2FyZC0+Y2hfaW4pOworCXZpYV9jaGFuX2luaXRfZGVmYXVsdHMgKGNhcmQsICZjYXJkLT5jaF9mbSk7CisKKwkvKiBpZiBCQVIgMiBpcyBwcmVzZW50LCBjaGlwIGlzIFJldiBIIG9yIGxhdGVyLAorCSAqIHdoaWNoIG1lYW5zIGl0IGhhcyBhIGZldyBleHRyYSBmZWF0dXJlcyAqLworCWlmIChwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDIpID4gMCkKKwkJY2FyZC0+cmV2X2ggPSAxOworCQkKKwkvKiBPdmVya2lsbCBmb3Igbm93LCBidXQgbW9yZSBmbGV4aWJsZSBkb25lIHJpZ2h0ICovCisJCisJY2FyZC0+aW50bWFzayA9IGlkLT5kcml2ZXJfZGF0YTsKKwljYXJkLT5sZWdhY3kgPSAhY2FyZC0+aW50bWFzazsKKwljYXJkLT5zaXhjaGFubmVsID0gaWQtPmRyaXZlcl9kYXRhOworCQorCWlmKGNhcmQtPnNpeGNoYW5uZWwpCisJCXByaW50ayhLRVJOX0lORk8gUEZYICJTaXggY2hhbm5lbCBhdWRpbyBhdmFpbGFibGVcbiIpOworCWlmIChwZGV2LT5pcnEgPCAxKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJpbnZhbGlkIFBDSSBJUlEgJWQsIGFib3J0aW5nXG4iLCBwZGV2LT5pcnEpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9rZnJlZTsKKwl9CisKKwlpZiAoIShwY2lfcmVzb3VyY2VfZmxhZ3MgKHBkZXYsIDApICYgSU9SRVNPVVJDRV9JTykpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggInVuYWJsZSB0byBsb2NhdGUgSS9PIHJlc291cmNlcywgYWJvcnRpbmdcbiIpOworCQlyYyA9IC1FTk9ERVY7CisJCWdvdG8gZXJyX291dF9rZnJlZTsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwZGV2KTsKKwkKKwkvKgorCSAqIGluaXQgQUM5NyBtaXhlciBhbmQgY29kZWMKKwkgKi8KKwlyYyA9IHZpYV9hYzk3X2luaXQgKGNhcmQpOworCWlmIChyYykgeworCQlwcmludGsgKEtFUk5fRVJSIFBGWCAiQUM5NyBpbml0IGZhaWxlZCwgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVycl9vdXRfa2ZyZWU7CisJfQorCisJLyoKKwkgKiBpbml0IERTUCBkZXZpY2UKKwkgKi8KKwlyYyA9IHZpYV9kc3BfaW5pdCAoY2FyZCk7CisJaWYgKHJjKSB7CisJCXByaW50ayAoS0VSTl9FUlIgUEZYICJEU1AgZGV2aWNlIGluaXQgZmFpbGVkLCBhYm9ydGluZ1xuIik7CisJCWdvdG8gZXJyX291dF9oYXZlX21peGVyOworCX0KKworCS8qCisJICogaW5pdCBhbmQgdHVybiBvbiBpbnRlcnJ1cHRzLCBhcyB0aGUgbGFzdCB0aGluZyB3ZSBkbworCSAqLworCXJjID0gdmlhX2ludGVycnVwdF9pbml0IChjYXJkKTsKKwlpZiAocmMpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBQRlggImludGVycnVwdCBpbml0IGZhaWxlZCwgYWJvcnRpbmdcbiIpOworCQlnb3RvIGVycl9vdXRfaGF2ZV9kc3A7CisJfQorCisJcHJpbnRrIChLRVJOX0lORk8gUEZYICJib2FyZCAjJWQgYXQgMHglMDRsWCwgSVJRICVkXG4iLAorCQljYXJkLT5jYXJkX251bSArIDEsIGNhcmQtPmJhc2VhZGRyLCBwZGV2LT5pcnEpOworCisjaWZkZWYgQ09ORklHX01JRElfVklBODJDWFhYCisJLyogRGlzYWJsZSBieSBkZWZhdWx0ICovCisJY2FyZC0+bWlkaV9pbmZvLmlvX2Jhc2UgPSAwOworCisJaWYoY2FyZC0+bGVnYWN5KQorCXsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUgKHBkZXYsIDB4NDIsICZyNDIpOworCQkvKiBEaXNhYmxlIE1JREkgaW50ZXJydXB0ICovCisJCXBjaV93cml0ZV9jb25maWdfYnl0ZSAocGRldiwgMHg0MiwgcjQyIHwgVklBX0NSNDJfTUlESV9JUlFNQVNLKTsKKwkJaWYgKHI0MiAmIFZJQV9DUjQyX01JRElfRU5BQkxFKQorCQl7CisJCQlpZiAocjQyICYgVklBX0NSNDJfTUlESV9QTlApIC8qIEFkZHJlc3Mgc2VsZWN0ZWQgYnkgaW9iYXNlIDIgLSBub3QgdGVzdGVkICovCisJCQkJY2FyZC0+bWlkaV9pbmZvLmlvX2Jhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQgKHBkZXYsIDIpOworCQkJZWxzZSAvKiBBZGRyZXNzIHNlbGVjdGVkIGJ5IGJ5dGUgMHg0MyAqLworCQkJeworCQkJCXU4IHI0MzsKKwkJCQlwY2lfcmVhZF9jb25maWdfYnl0ZSAocGRldiwgMHg0MywgJnI0Myk7CisJCQkJY2FyZC0+bWlkaV9pbmZvLmlvX2Jhc2UgPSAweDMwMCArICgocjQzICYgMHgwYykgPDwgMik7CisJCQl9CisKKwkJCWNhcmQtPm1pZGlfaW5mby5pcnEgPSAtcGRldi0+aXJxOworCQkJaWYgKHByb2JlX3VhcnQ0MDEoJiBjYXJkLT5taWRpX2luZm8sIFRISVNfTU9EVUxFKSkKKwkJCXsKKwkJCQljYXJkLT5taWRpX2RldmM9bWlkaV9kZXZzW2NhcmQtPm1pZGlfaW5mby5zbG90c1s0XV0tPmRldmM7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ19ieXRlKHBkZXYsIDB4NDIsIHI0MiAmIH5WSUFfQ1I0Ml9NSURJX0lSUU1BU0spOworCQkJCXByaW50aygiRW5hYmxlZCBWaWEgTUlESVxuIik7CisJCQl9CisJCX0KKwl9CisjZW5kaWYKKworCURQUklOVEsgKCJFWElULCByZXR1cm5pbmcgMFxuIik7CisJcmV0dXJuIDA7CisKK2Vycl9vdXRfaGF2ZV9kc3A6CisJdmlhX2RzcF9jbGVhbnVwIChjYXJkKTsKKworZXJyX291dF9oYXZlX21peGVyOgorCXZpYV9hYzk3X2NsZWFudXAgKGNhcmQpOworCitlcnJfb3V0X2tmcmVlOgorI2lmbmRlZiBWSUFfTkRFQlVHCisJbWVtc2V0IChjYXJkLCAweEFCLCBzaXplb2YgKCpjYXJkKSk7IC8qIHBvaXNvbiBtZW1vcnkgKi8KKyNlbmRpZgorCWtmcmVlIChjYXJkKTsKKworZXJyX291dF9yZXM6CisJcGNpX3JlbGVhc2VfcmVnaW9ucyAocGRldik7CisKK2Vycl9vdXRfZGlzYWJsZToKKwlwY2lfZGlzYWJsZV9kZXZpY2UgKHBkZXYpOworCitlcnJfb3V0OgorCXBjaV9zZXRfZHJ2ZGF0YSAocGRldiwgTlVMTCk7CisJRFBSSU5USyAoIkVYSVQgLSByZXR1cm5pbmcgJWRcbiIsIHJjKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHZvaWQgX19kZXZleGl0IHZpYV9yZW1vdmVfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldikKK3sKKwlzdHJ1Y3QgdmlhX2luZm8gKmNhcmQ7CisKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJYXNzZXJ0IChwZGV2ICE9IE5VTEwpOworCWNhcmQgPSBwY2lfZ2V0X2RydmRhdGEgKHBkZXYpOworCWFzc2VydCAoY2FyZCAhPSBOVUxMKTsKKworI2lmZGVmIENPTkZJR19NSURJX1ZJQTgyQ1hYWAorCWlmIChjYXJkLT5taWRpX2luZm8uaW9fYmFzZSkKKwkJdW5sb2FkX3VhcnQ0MDEoJmNhcmQtPm1pZGlfaW5mbyk7CisjZW5kaWYKKworCWZyZWVfaXJxIChjYXJkLT5wZGV2LT5pcnEsIGNhcmQpOworCXZpYV9kc3BfY2xlYW51cCAoY2FyZCk7CisJdmlhX2FjOTdfY2xlYW51cCAoY2FyZCk7CisKKyNpZm5kZWYgVklBX05ERUJVRworCW1lbXNldCAoY2FyZCwgMHhBQiwgc2l6ZW9mICgqY2FyZCkpOyAvKiBwb2lzb24gbWVtb3J5ICovCisjZW5kaWYKKwlrZnJlZSAoY2FyZCk7CisKKwlwY2lfc2V0X2RydmRhdGEgKHBkZXYsIE5VTEwpOworCisJcGNpX3JlbGVhc2VfcmVnaW9ucyAocGRldik7CisJcGNpX2Rpc2FibGVfZGV2aWNlIChwZGV2KTsKKwlwY2lfc2V0X3Bvd2VyX3N0YXRlIChwZGV2LCAzKTsgLyogLi4uenp6enp6ICovCisKKwlEUFJJTlRLICgiRVhJVFxuIik7CisJcmV0dXJuOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogRHJpdmVyIGluaXRpYWxpemF0aW9uIGFuZCBjbGVhbnVwCisgKgorICoKKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3ZpYTgyY3h4eF9hdWRpbyh2b2lkKQoreworCWludCByYzsKKworCURQUklOVEsgKCJFTlRFUlxuIik7CisKKwlyYyA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIgKCZ2aWFfZHJpdmVyKTsKKwlpZiAocmMpIHsKKwkJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAlZFxuIiwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCisJRFBSSU5USyAoIkVYSVQsIHJldHVybmluZyAwXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF92aWE4MmN4eHhfYXVkaW8odm9pZCkKK3sKKwlEUFJJTlRLICgiRU5URVJcbiIpOworCisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyICgmdmlhX2RyaXZlcik7CisKKwlEUFJJTlRLICgiRVhJVFxuIik7Cit9CisKKworbW9kdWxlX2luaXQoaW5pdF92aWE4MmN4eHhfYXVkaW8pOworbW9kdWxlX2V4aXQoY2xlYW51cF92aWE4MmN4eHhfYXVkaW8pOworCitNT0RVTEVfQVVUSE9SKCJKZWZmIEdhcnppayIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJEU1AgYXVkaW8gYW5kIG1peGVyIGRyaXZlciBmb3IgVmlhIDgyQ3h4eCBhdWRpbyBkZXZpY2VzIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92aWRjLmMgYi9zb3VuZC9vc3MvdmlkYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZmU1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MvdmlkYy5jCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvc291bmQvdmlkYy5jCisgKgorICogIENvcHlyaWdodCAoQykgMTk5Ny0yMDAwIGJ5IFJ1c3NlbGwgS2luZyA8cm1rQGFybS5saW51eC5vcmcudWs+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIGFzCisgKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgVklEQzIwIGF1ZGlvIGRyaXZlci4KKyAqCisgKiBUaGUgVklEQzIwIHNvdW5kIGhhcmR3YXJlIGNvbnNpc3RzIG9mIHRoZSBWSURDMjAgaXRzZWxmLCBhIERBQyBhbmQgYSBETUEKKyAqIGVuZ2luZS4gIFRoZSBETUEgdHJhbnNmZXJzIGZpeGVkLWZvcm1hdCAoMTYtYml0IGxpdHRsZS1lbmRpYW4gbGluZWFyKQorICogc2FtcGxlcyB0byB0aGUgVklEQzIwLCB3aGljaCB0aGVuIHRyYW5zZmVycyB0aGlzIGRhdGEgc2VyaWFsbHkgdG8gdGhlCisgKiBEQUNzLiAgVGhlIHNhbXBsZXJhdGUgaXMgY29udHJvbGxlZCBieSB0aGUgVklEQy4KKyAqCisgKiBXZSBjdXJyZW50bHkgc3VwcG9ydCBhIG1peGVyIGRldmljZSwgYnV0IGl0IGlzIGN1cnJlbnRseSBub24tZnVuY3Rpb25hbC4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8YXNtL2RtYS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb21kLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgInZpZGMuaCIKKworI2lmbmRlZiBfU0lPQ19UWVBFCisjZGVmaW5lIF9TSU9DX1RZUEUoeCkJX0lPQ19UWVBFKHgpCisjZW5kaWYKKyNpZm5kZWYgX1NJT0NfTlIKKyNkZWZpbmUgX1NJT0NfTlIoeCkJX0lPQ19OUih4KQorI2VuZGlmCisKKyNkZWZpbmUgVklEQ19TT1VORF9DTE9DSwkoMjUwMDAwKQorI2RlZmluZSBWSURDX1NPVU5EX0NMT0NLX0VYVAkoMTc2NDAwKQorCisvKgorICogV2hlbiB1c2luZyBTRVJJQUwgU09VTkQgbW9kZSAoZXh0ZXJuYWwgREFDKSwgdGhlIG51bWJlciBvZiBwaHlzaWNhbAorICogY2hhbm5lbHMgaXMgZml4ZWQgYXQgMi4KKyAqLworc3RhdGljIGludAkJdmlkY19idXN5Oworc3RhdGljIGludAkJdmlkY19hZGV2Oworc3RhdGljIGludAkJdmlkY19hdWRpb19yYXRlOworc3RhdGljIGNoYXIJCXZpZGNfYXVkaW9fZm9ybWF0Oworc3RhdGljIGNoYXIJCXZpZGNfYXVkaW9fY2hhbm5lbHM7CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCXZpZGNfbGV2ZWxfbFtTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCTg1LAkJLyogbWFzdGVyCSovCisJNTAsCQkvKiBiYXNzCQkqLworCTUwLAkJLyogdHJlYmxlCSovCisJMCwJCS8qIHN5bnRoCSovCisJNzUsCQkvKiBwY20JCSovCisJMCwJCS8qIHNwZWFrZXIJKi8KKwkxMDAsCQkvKiBleHQgbGluZQkqLworCTAsCQkvKiBtaWMJCSovCisJMTAwLAkJLyogQ0QJCSovCisJMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCXZpZGNfbGV2ZWxfcltTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCTg1LAkJLyogbWFzdGVyCSovCisJNTAsCQkvKiBiYXNzCQkqLworCTUwLAkJLyogdHJlYmxlCSovCisJMCwJCS8qIHN5bnRoCSovCisJNzUsCQkvKiBwY20JCSovCisJMCwJCS8qIHNwZWFrZXIJKi8KKwkxMDAsCQkvKiBleHQgbGluZQkqLworCTAsCQkvKiBtaWMJCSovCisJMTAwLAkJLyogQ0QJCSovCisJMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQJdmlkY19hdWRpb192b2x1bWVfbDsJLyogbGVmdCBQQ00gdm9sLCAwIC0gNjU1MzYgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQJdmlkY19hdWRpb192b2x1bWVfcjsJLyogcmlnaHQgUENNIHZvbCwgMCAtIDY1NTM2ICovCisKK2V4dGVybiB2b2lkCXZpZGNfdXBkYXRlX2ZpbGxlcihpbnQgYml0cywgaW50IGNoYW5uZWxzKTsKK2V4dGVybiBpbnQJc29mdG9zc19kZXY7CisKK3N0YXRpYyB2b2lkCit2aWRjX21peGVyX3NldChpbnQgbWRldiwgdW5zaWduZWQgaW50IGxldmVsKQoreworCXVuc2lnbmVkIGludCBsZXZfbCA9IGxldmVsICYgMHgwMDdmOworCXVuc2lnbmVkIGludCBsZXZfciA9IChsZXZlbCAmIDB4N2YwMCkgPj4gODsKKwl1bnNpZ25lZCBpbnQgbWxldl9sLCBtbGV2X3I7CisKKwlpZiAobGV2X2wgPiAxMDApCisJCWxldl9sID0gMTAwOworCWlmIChsZXZfciA+IDEwMCkKKwkJbGV2X3IgPSAxMDA7CisKKyNkZWZpbmUgU0NBTEUobGV2LG1hc3RlcikJKChsZXYpICogKG1hc3RlcikgKiA2NTUzNiAvIDEwMDAwKQorCisJbWxldl9sID0gdmlkY19sZXZlbF9sW1NPVU5EX01JWEVSX1ZPTFVNRV07CisJbWxldl9yID0gdmlkY19sZXZlbF9yW1NPVU5EX01JWEVSX1ZPTFVNRV07CisKKwlzd2l0Y2ggKG1kZXYpIHsKKwljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwkJdmlkY19sZXZlbF9sW21kZXZdID0gbGV2X2w7CisJCXZpZGNfbGV2ZWxfclttZGV2XSA9IGxldl9yOworCisJCXZpZGNfYXVkaW9fdm9sdW1lX2wgPSBTQ0FMRShsZXZfbCwgbWxldl9sKTsKKwkJdmlkY19hdWRpb192b2x1bWVfciA9IFNDQUxFKGxldl9yLCBtbGV2X3IpOworLypwcmludGsoIlZJREM6IFBDTSB2b2wgJTA1WCAlMDVYXG4iLCB2aWRjX2F1ZGlvX3ZvbHVtZV9sLCB2aWRjX2F1ZGlvX3ZvbHVtZV9yKTsqLworCQlicmVhazsKKwl9CisjdW5kZWYgU0NBTEUKK30KKworc3RhdGljIGludCB2aWRjX21peGVyX2lvY3RsKGludCBkZXYsIHVuc2lnbmVkIGludCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJdW5zaWduZWQgaW50IHZhbDsKKwl1bnNpZ25lZCBpbnQgbWRldjsKKworCWlmIChfU0lPQ19UWVBFKGNtZCkgIT0gJ00nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1kZXYgPSBfU0lPQ19OUihjbWQpOworCisJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpIHsKKwkJaWYgKGdldF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJaWYgKG1kZXYgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMpCisJCQl2aWRjX21peGVyX3NldChtZGV2LCB2YWwpOworCQllbHNlCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIFJldHVybiBwYXJhbWV0ZXJzCisJICovCisJc3dpdGNoIChtZGV2KSB7CisJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQl2YWwgPSBTT1VORF9NQVNLX1ZPTFVNRSB8IFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19TWU5USDsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1NURVJFT0RFVlM6CisJCXZhbCA9IFNPVU5EX01BU0tfVk9MVU1FIHwgU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX1NZTlRIOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfUkVDTUFTSzoKKwkJdmFsID0gMDsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX0NBUFM6CisJCXZhbCA9IDA7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKG1kZXYgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMpCisJCQl2YWwgPSB2aWRjX2xldmVsX2xbbWRldl0gfCB2aWRjX2xldmVsX3JbbWRldl0gPDwgODsKKwkJZWxzZQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHB1dF91c2VyKHZhbCwgKHVuc2lnbmVkIGludCBfX3VzZXIgKilhcmcpID8gLUVGQVVMVCA6IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdmlkY19hdWRpb19zZXRfZm9ybWF0KGludCBkZXYsIHVuc2lnbmVkIGludCBmbXQpCit7CisJc3dpdGNoIChmbXQpIHsKKwlkZWZhdWx0OgorCQlmbXQgPSBBRk1UX1MxNl9MRTsKKwljYXNlIEFGTVRfVTg6CisJY2FzZSBBRk1UX1M4OgorCWNhc2UgQUZNVF9TMTZfTEU6CisJCXZpZGNfYXVkaW9fZm9ybWF0ID0gZm10OworCQl2aWRjX3VwZGF0ZV9maWxsZXIodmlkY19hdWRpb19mb3JtYXQsIHZpZGNfYXVkaW9fY2hhbm5lbHMpOworCWNhc2UgQUZNVF9RVUVSWToKKwkJYnJlYWs7CisJfQorCXJldHVybiB2aWRjX2F1ZGlvX2Zvcm1hdDsKK30KKworI2RlZmluZSBteV9hYnMoaSkgKChpKTwwID8gLShpKSA6IChpKSkKKworc3RhdGljIGludCB2aWRjX2F1ZGlvX3NldF9zcGVlZChpbnQgZGV2LCBpbnQgcmF0ZSkKK3sKKwlpZiAocmF0ZSkgeworCQl1bnNpZ25lZCBpbnQgaHdjdHJsLCBod3JhdGUsIGh3cmF0ZV9leHQsIHJhdGVfaW50LCByYXRlX2V4dDsKKwkJdW5zaWduZWQgaW50IGRpZmZfaW50LCBkaWZmX2V4dDsKKwkJdW5zaWduZWQgaW50IG5ld3NpemUsIG5ldzJzaXplOworCisJCWh3Y3RybCA9IDB4MDAwMDAwMDM7CisKKwkJLyogVXNpbmcgaW50ZXJuYWwgY2xvY2sgKi8KKwkJaHdyYXRlID0gKCgoVklEQ19TT1VORF9DTE9DSyAqIDIpIC8gcmF0ZSkgKyAxKSA+PiAxOworCQlpZiAoaHdyYXRlIDwgMykKKwkJCWh3cmF0ZSA9IDM7CisJCWlmIChod3JhdGUgPiAyNTUpCisJCQlod3JhdGUgPSAyNTU7CisKKwkJLyogVXNpbmcgZXhlcm5hbCBjbG9jayAqLworCQlod3JhdGVfZXh0ID0gKCgoVklEQ19TT1VORF9DTE9DS19FWFQgKiAyKSAvIHJhdGUpICsgMSkgPj4gMTsKKwkJaWYgKGh3cmF0ZV9leHQgPCAzKQorCQkJaHdyYXRlX2V4dCA9IDM7CisJCWlmIChod3JhdGVfZXh0ID4gMjU1KQorCQkJaHdyYXRlX2V4dCA9IDI1NTsKKworCQlyYXRlX2ludCA9IFZJRENfU09VTkRfQ0xPQ0sgLyBod3JhdGU7CisJCXJhdGVfZXh0ID0gVklEQ19TT1VORF9DTE9DS19FWFQgLyBod3JhdGVfZXh0OworCisJCS8qIENob3NlIGJldHdlZW4gZXh0ZXJuYWwgYW5kIGludGVybmFsIGNsb2NrICovCisJCWRpZmZfaW50ID0gbXlfYWJzKHJhdGVfZXh0LXJhdGUpOworCQlkaWZmX2V4dCA9IG15X2FicyhyYXRlX2ludC1yYXRlKTsKKwkJaWYgKGRpZmZfZXh0IDwgZGlmZl9pbnQpIHsKKwkJCS8qcHJpbnRrKCJWSURDOiBleHRlcm5hbCAlZCAlZCAlZFxuIiwgcmF0ZSwgcmF0ZV9leHQsIGh3cmF0ZV9leHQpOyovCisJCQlod3JhdGU9aHdyYXRlX2V4dDsKKwkJCWh3Y3RybD0weDAwMDAwMDAyOworCQkJLyogQWxsb3cgcm91Z2hseSAwLjQlIHRvbGVyYW5jZSAqLworCQkJaWYgKGRpZmZfZXh0ID4gKHJhdGUvMjU2KSkKKwkJCQlyYXRlPXJhdGVfZXh0OworCQl9IGVsc2UgeworCQkJLypwcmludGsoIlZJREM6IGludGVybmFsICVkICVkICVkXG4iLCByYXRlLCByYXRlX2ludCwgaHdyYXRlKTsqLworCQkJaHdjdHJsPTB4MDAwMDAwMDM7CisJCQkvKiBBbGxvdyByb3VnbHkgMC40JSB0b2xlcmFuY2UgKi8KKwkJCWlmIChkaWZmX2ludCA+IChyYXRlLzI1NikpCisJCQkJcmF0ZT1yYXRlX2ludDsKKwkJfQorCisJCXZpZGNfd3JpdGVsKDB4YjAwMDAwMDAgfCAoaHdyYXRlIC0gMikpOworCQl2aWRjX3dyaXRlbCgweGIxMDAwMDAwIHwgaHdjdHJsKTsKKworCQluZXdzaXplID0gKDEwMDAwIC8gaHdyYXRlKSAmIH4zOworCQlpZiAobmV3c2l6ZSA8IDIwOCkKKwkJCW5ld3NpemUgPSAyMDg7CisJCWlmIChuZXdzaXplID4gNDA5NikKKwkJCW5ld3NpemUgPSA0MDk2OworCQlmb3IgKG5ldzJzaXplID0gMTI4OyBuZXcyc2l6ZSA8IG5ld3NpemU7IG5ldzJzaXplIDw8PSAxKTsKKwkJaWYgKG5ldzJzaXplIC0gbmV3c2l6ZSA+IG5ld3NpemUgLSAobmV3MnNpemUgPj4gMSkpCisJCQluZXcyc2l6ZSA+Pj0gMTsKKwkJaWYgKG5ldzJzaXplID4gNDA5NikgeworCQkJcHJpbnRrKEtFUk5fRVJSICJWSURDOiBlcnJvcjogZG1hIGJ1ZmZlciAoJWQpICVkID4gNEtcbiIsCisJCQkJbmV3c2l6ZSwgbmV3MnNpemUpOworCQkJbmV3MnNpemUgPSA0MDk2OworCQl9CisJCS8qcHJpbnRrKCJWSURDOiBkbWEgc2l6ZSAlZFxuIiwgbmV3MnNpemUpOyovCisJCWRtYV9idWZzaXplID0gbmV3MnNpemU7CisJCXZpZGNfYXVkaW9fcmF0ZSA9IHJhdGU7CisJfQorCXJldHVybiB2aWRjX2F1ZGlvX3JhdGU7Cit9CisKK3N0YXRpYyBzaG9ydCB2aWRjX2F1ZGlvX3NldF9jaGFubmVscyhpbnQgZGV2LCBzaG9ydCBjaGFubmVscykKK3sKKwlzd2l0Y2ggKGNoYW5uZWxzKSB7CisJZGVmYXVsdDoKKwkJY2hhbm5lbHMgPSAyOworCWNhc2UgMToKKwljYXNlIDI6CisJCXZpZGNfYXVkaW9fY2hhbm5lbHMgPSBjaGFubmVsczsKKwkJdmlkY191cGRhdGVfZmlsbGVyKHZpZGNfYXVkaW9fZm9ybWF0LCB2aWRjX2F1ZGlvX2NoYW5uZWxzKTsKKwljYXNlIDA6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmlkY19hdWRpb19jaGFubmVsczsKK30KKworLyoKKyAqIE9wZW4gdGhlIGRldmljZQorICovCitzdGF0aWMgaW50IHZpZGNfYXVkaW9fb3BlbihpbnQgZGV2LCBpbnQgbW9kZSkKK3sKKwkvKiBUaGlzIGF1ZGlvIGRldmljZSBkb2VzIG5vdCBoYXZlIHJlY29yZGluZyBjYXBhYmlsaXR5ICovCisJaWYgKG1vZGUgPT0gT1BFTl9SRUFEKQorCQlyZXR1cm4gLUVQRVJNOworCisJaWYgKHZpZGNfYnVzeSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXZpZGNfYnVzeSA9IDE7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbG9zZSB0aGUgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIHZpZGNfYXVkaW9fY2xvc2UoaW50IGRldikKK3sKKwl2aWRjX2J1c3kgPSAwOworfQorCisvKgorICogT3V0cHV0IGEgYmxvY2sgdmlhIERNQSB0byBzb3VuZCBkZXZpY2UuCisgKgorICogV2UganVzdCBzZXQgdGhlIERNQSBzdGFydCBhbmQgY291bnQ7IHRoZSBETUEgaW50ZXJydXB0IHJvdXRpbmUKKyAqIHdpbGwgdGFrZSBjYXJlIG9mIGZvcm1hdHRpbmcgdGhlIHNhbXBsZXMgKHZpYSB0aGUgYXBwcm9wcmlhdGUKKyAqIHZpZGNfZmlsbGVyIHJvdXRpbmUpLCBhbmQgZmxhZyB2aWEgdmlkY19hdWRpb19kbWFfaW50ZXJydXB0IHdoZW4KKyAqIG1vcmUgZGF0YSBpcyByZXF1aXJlZC4KKyAqLworc3RhdGljIHZvaWQKK3ZpZGNfYXVkaW9fb3V0cHV0X2Jsb2NrKGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgdG90YWxfY291bnQsIGludCBvbmUpCit7CisJc3RydWN0IGRtYV9idWZmcGFybXMgKmRtYXAgPSBhdWRpb19kZXZzW2Rldl0tPmRtYXBfb3V0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJZG1hX3N0YXJ0ID0gYnVmIC0gKHVuc2lnbmVkIGxvbmcpZG1hcC0+cmF3X2J1Zl9waHlzICsgKHVuc2lnbmVkIGxvbmcpZG1hcC0+cmF3X2J1ZjsKKwlkbWFfY291bnQgPSB0b3RhbF9jb3VudDsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCit2aWRjX2F1ZGlvX3N0YXJ0X2lucHV0KGludCBkZXYsIHVuc2lnbmVkIGxvbmcgYnVmLCBpbnQgY291bnQsIGludCBpbnRyZmxhZykKK3sKK30KKworc3RhdGljIGludCB2aWRjX2F1ZGlvX3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlycXJldHVybl90IHZpZGNfYXVkaW9fZG1hX2ludGVycnVwdCh2b2lkKQoreworCURNQWJ1Zl9vdXRwdXRpbnRyKHZpZGNfYWRldiwgMSk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKgorICogUHJlcGFyZSBmb3Igb3V0cHV0dGluZyBzYW1wbGVzLgorICoKKyAqIEVhY2ggYnVmZmVyIHRoYXQgd2lsbCBiZSBwYXNzZWQgd2lsbCBiZSBgYnNpemUnIGJ5dGVzIGxvbmcsCisgKiB3aXRoIGEgdG90YWwgb2YgYGJjb3VudCcgYnVmZmVycy4KKyAqLworc3RhdGljIGludCB2aWRjX2F1ZGlvX3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisKKwlkbWFfaW50ZXJydXB0ID0gTlVMTDsKKwlhZGV2LT5kbWFwX291dC0+ZmxhZ3MgfD0gRE1BX05PRE1BOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTdG9wIG91ciBjdXJyZW50IG9wZXJhdGlvbi4KKyAqLworc3RhdGljIHZvaWQgdmlkY19hdWRpb19yZXNldChpbnQgZGV2KQoreworCWRtYV9pbnRlcnJ1cHQgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHZpZGNfYXVkaW9fbG9jYWxfcWxlbihpbnQgZGV2KQoreworCXJldHVybiAvKmRtYV9jb3VudCAhPSovIDA7Cit9CisKK3N0YXRpYyB2b2lkIHZpZGNfYXVkaW9fdHJpZ2dlcihpbnQgZGV2LCBpbnQgZW5hYmxlX2JpdHMpCit7CisJc3RydWN0IGF1ZGlvX29wZXJhdGlvbnMgKmFkZXYgPSBhdWRpb19kZXZzW2Rldl07CisKKwlpZiAoZW5hYmxlX2JpdHMgJiBQQ01fRU5BQkxFX09VVFBVVCkgeworCQlpZiAoIShhZGV2LT5mbGFncyAmIERNQV9BQ1RJVkUpKSB7CisJCQl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkJCS8qIHByZXZlbnQgcmVjdXNpb24gKi8KKwkJCWFkZXYtPmZsYWdzIHw9IERNQV9BQ1RJVkU7CisKKwkJCWRtYV9pbnRlcnJ1cHQgPSB2aWRjX2F1ZGlvX2RtYV9pbnRlcnJ1cHQ7CisJCQl2aWRjX3NvdW5kX2RtYV9pcnEoMCwgTlVMTCwgTlVMTCk7CisJCQlpb21kX3dyaXRlYihETUFfQ1JfRSB8IDB4MTAsIElPTURfU0QwQ1IpOworCisJCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYXVkaW9fZHJpdmVyIHZpZGNfYXVkaW9fZHJpdmVyID0KK3sKKwkub3duZXIJCQk9IFRISVNfTU9EVUxFLAorCS5vcGVuCQkJPSB2aWRjX2F1ZGlvX29wZW4sCisJLmNsb3NlCQkJPSB2aWRjX2F1ZGlvX2Nsb3NlLAorCS5vdXRwdXRfYmxvY2sJCT0gdmlkY19hdWRpb19vdXRwdXRfYmxvY2ssCisJLnN0YXJ0X2lucHV0CQk9IHZpZGNfYXVkaW9fc3RhcnRfaW5wdXQsCisJLnByZXBhcmVfZm9yX2lucHV0CT0gdmlkY19hdWRpb19wcmVwYXJlX2Zvcl9pbnB1dCwKKwkucHJlcGFyZV9mb3Jfb3V0cHV0CT0gdmlkY19hdWRpb19wcmVwYXJlX2Zvcl9vdXRwdXQsCisJLmhhbHRfaW8JCT0gdmlkY19hdWRpb19yZXNldCwKKwkubG9jYWxfcWxlbgkJPSB2aWRjX2F1ZGlvX2xvY2FsX3FsZW4sCisJLnRyaWdnZXIJCT0gdmlkY19hdWRpb190cmlnZ2VyLAorCS5zZXRfc3BlZWQJCT0gdmlkY19hdWRpb19zZXRfc3BlZWQsCisJLnNldF9iaXRzCQk9IHZpZGNfYXVkaW9fc2V0X2Zvcm1hdCwKKwkuc2V0X2NoYW5uZWxzCQk9IHZpZGNfYXVkaW9fc2V0X2NoYW5uZWxzCit9OworCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgdmlkY19taXhlcl9vcGVyYXRpb25zID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkuaWQJCT0gIlZJREMiLAorCS5uYW1lCQk9ICJWSURDc291bmQiLAorCS5pb2N0bAkJPSB2aWRjX21peGVyX2lvY3RsCit9OworCit2b2lkIHZpZGNfdXBkYXRlX2ZpbGxlcihpbnQgZm9ybWF0LCBpbnQgY2hhbm5lbHMpCit7CisjZGVmaW5lIFRZUEUoZm10LGNoKSAoKChmbXQpPDwyKSB8ICgoY2gpJjMpKQorCisJc3dpdGNoIChUWVBFKGZvcm1hdCwgY2hhbm5lbHMpKSB7CisJZGVmYXVsdDoKKwljYXNlIFRZUEUoQUZNVF9VOCwgMSk6CisJCXZpZGNfZmlsbGVyID0gdmlkY19maWxsXzF4OF91OworCQlicmVhazsKKworCWNhc2UgVFlQRShBRk1UX1U4LCAyKToKKwkJdmlkY19maWxsZXIgPSB2aWRjX2ZpbGxfMng4X3U7CisJCWJyZWFrOworCisJY2FzZSBUWVBFKEFGTVRfUzgsIDEpOgorCQl2aWRjX2ZpbGxlciA9IHZpZGNfZmlsbF8xeDhfczsKKwkJYnJlYWs7CisKKwljYXNlIFRZUEUoQUZNVF9TOCwgMik6CisJCXZpZGNfZmlsbGVyID0gdmlkY19maWxsXzJ4OF9zOworCQlicmVhazsKKworCWNhc2UgVFlQRShBRk1UX1MxNl9MRSwgMSk6CisJCXZpZGNfZmlsbGVyID0gdmlkY19maWxsXzF4MTZfczsKKwkJYnJlYWs7CisKKwljYXNlIFRZUEUoQUZNVF9TMTZfTEUsIDIpOgorCQl2aWRjX2ZpbGxlciA9IHZpZGNfZmlsbF8yeDE2X3M7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF92aWRjKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwljaGFyIG5hbWVbMzJdOworCWludCBpLCBhZGV2OworCisJc3ByaW50ZihuYW1lLCAiVklEQyAlZC1iaXQgc291bmQiLCBod19jb25maWctPmNhcmRfc3VidHlwZSk7CisJY29uZl9wcmludGYobmFtZSwgaHdfY29uZmlnKTsKKwltZW1zZXQoZG1hX2J1ZiwgMCwgc2l6ZW9mKGRtYV9idWYpKTsKKworCWFkZXYgPSBzb3VuZF9pbnN0YWxsX2F1ZGlvZHJ2KEFVRElPX0RSSVZFUl9WRVJTSU9OLCBuYW1lLAorCQkJJnZpZGNfYXVkaW9fZHJpdmVyLCBzaXplb2YodmlkY19hdWRpb19kcml2ZXIpLAorCQkJRE1BX0FVVE9NT0RFLCBBRk1UX1U4IHwgQUZNVF9TOCB8IEFGTVRfUzE2X0xFLAorCQkJTlVMTCwgaHdfY29uZmlnLT5kbWEsIGh3X2NvbmZpZy0+ZG1hMik7CisKKwlpZiAoYWRldiA8IDApCisJCWdvdG8gYXVkaW9fZmFpbGVkOworCisJLyoKKwkgKiAxMDI0IGJ5dGVzID0+IDY0IGJ1ZmZlcnMKKwkgKi8KKwlhdWRpb19kZXZzW2FkZXZdLT5taW5fZnJhZ21lbnQgPSAxMDsKKwlhdWRpb19kZXZzW2FkZXZdLT5taXhlcl9kZXYgPSBudW1fbWl4ZXJzOworCisJYXVkaW9fZGV2c1thZGV2XS0+bWl4ZXJfZGV2ID0KKwkJc291bmRfaW5zdGFsbF9taXhlcihNSVhFUl9EUklWRVJfVkVSU0lPTiwKKwkJCQluYW1lLCAmdmlkY19taXhlcl9vcGVyYXRpb25zLAorCQkJCXNpemVvZih2aWRjX21peGVyX29wZXJhdGlvbnMpLCBOVUxMKTsKKworCWlmIChhdWRpb19kZXZzW2FkZXZdLT5taXhlcl9kZXYgPCAwKQorCQlnb3RvIG1peGVyX2ZhaWxlZDsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZG1hX2J1ZltpXSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFkbWFfYnVmW2ldKSB7CisJCQlwcmludGsoS0VSTl9FUlIgIiVzOiBjYW4ndCBhbGxvY2F0ZSByZXF1aXJlZCBidWZmZXJzXG4iLAorCQkJCW5hbWUpOworCQkJZ290byBtZW1fZmFpbGVkOworCQl9CisJCWRtYV9wYnVmW2ldID0gdmlydF90b19waHlzKCh2b2lkICopZG1hX2J1ZltpXSk7CisJfQorCisJaWYgKHNvdW5kX2FsbG9jX2RtYShod19jb25maWctPmRtYSwgaHdfY29uZmlnLT5uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBETUEgJWQgaXMgaW4gIHVzZVxuIiwgbmFtZSwgaHdfY29uZmlnLT5kbWEpOworCQlnb3RvIGRtYV9mYWlsZWQ7CisJfQorCisJaWYgKHJlcXVlc3RfaXJxKGh3X2NvbmZpZy0+aXJxLCB2aWRjX3NvdW5kX2RtYV9pcnEsIDAsCisJCQlod19jb25maWctPm5hbWUsICZkbWFfc3RhcnQpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IElSUSAlZCBpcyBpbiB1c2VcbiIsIG5hbWUsIGh3X2NvbmZpZy0+aXJxKTsKKwkJZ290byBpcnFfZmFpbGVkOworCX0KKwl2aWRjX2FkZXYgPSBhZGV2OworCXZpZGNfbWl4ZXJfc2V0KFNPVU5EX01JWEVSX1ZPTFVNRSwgKDg1IHwgODUgPDwgOCkpOworCisjaWYgZGVmaW5lZChDT05GSUdfU09VTkRfU09GVE9TUykgfHwgZGVmaW5lZChDT05GSUdfU09VTkRfU09GVE9TU19NT0RVTEUpCisJc29mdG9zc19kZXYgPSBhZGV2OworI2VuZGlmCisJcmV0dXJuOworCitpcnFfZmFpbGVkOgorCXNvdW5kX2ZyZWVfZG1hKGh3X2NvbmZpZy0+ZG1hKTsKK2RtYV9mYWlsZWQ6CittZW1fZmFpbGVkOgorCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCisJCWZyZWVfcGFnZShkbWFfYnVmW2ldKTsKKwlzb3VuZF91bmxvYWRfbWl4ZXJkZXYoYXVkaW9fZGV2c1thZGV2XS0+bWl4ZXJfZGV2KTsKK21peGVyX2ZhaWxlZDoKKwlzb3VuZF91bmxvYWRfYXVkaW9kZXYoYWRldik7CithdWRpb19mYWlsZWQ6CisJcmV0dXJuOworfQorCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV92aWRjKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKwlod19jb25maWctPmlycQkJPSBJUlFfRE1BUzA7CisJaHdfY29uZmlnLT5kbWEJCT0gRE1BX1ZJUlRVQUxfU09VTkQ7CisJaHdfY29uZmlnLT5kbWEyCQk9IC0xOworCWh3X2NvbmZpZy0+Y2FyZF9zdWJ0eXBlCT0gMTY7CisJaHdfY29uZmlnLT5uYW1lCQk9ICJWSURDMjAiOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgdW5sb2FkX3ZpZGMoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCWludCBpLCBhZGV2ID0gdmlkY19hZGV2OworCisJdmlkY19hZGV2ID0gLTE7CisKKwlmcmVlX2lycShod19jb25maWctPmlycSwgJmRtYV9zdGFydCk7CisJc291bmRfZnJlZV9kbWEoaHdfY29uZmlnLT5kbWEpOworCisJaWYgKGFkZXYgPj0gMCkgeworCQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYoYXVkaW9fZGV2c1thZGV2XS0+bWl4ZXJfZGV2KTsKKwkJc291bmRfdW5sb2FkX2F1ZGlvZGV2KGFkZXYpOworCQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKQorCQkJZnJlZV9wYWdlKGRtYV9idWZbaV0pOworCX0KK30KKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3ZpZGModm9pZCkKK3sKKwlpZiAocHJvYmVfdmlkYygmY2ZnKSA9PSAwKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWF0dGFjaF92aWRjKCZjZmcpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3ZpZGModm9pZCkKK3sKKwl1bmxvYWRfdmlkYygmY2ZnKTsKK30KKworbW9kdWxlX2luaXQoaW5pdF92aWRjKTsKK21vZHVsZV9leGl0KGNsZWFudXBfdmlkYyk7CisKK01PRFVMRV9BVVRIT1IoIlJ1c3NlbGwgS2luZyIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJWSURDMjAgYXVkaW8gZHJpdmVyIik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdmlkYy5oIGIvc291bmQvb3NzL3ZpZGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWI3MDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3ZpZGMuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogIGxpbnV4L2RyaXZlcnMvc291bmQvdmlkYy5oCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBSdXNzZWxsIEtpbmcgPHJta0Bhcm0ubGludXgub3JnLnVrPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogIFZJREMgc291bmQgZnVuY3Rpb24gcHJvdG90eXBlcworICovCisKKy8qIHZpZGMuYyAqLworCitleHRlcm4gaW50IHZpZGNfYnVzeTsKKworLyogdmlkY19maWxsLlMgKi8KKworLyoKKyAqIEZpbGxlciByb3V0aW5lcyBmb3IgZGlmZmVyZW50IGNoYW5uZWxzIGFuZCBzYW1wbGUgc2l6ZXMKKyAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyB2aWRjX2ZpbGxfMXg4X3UodW5zaWduZWQgbG9uZyBpYnVmLCB1bnNpZ25lZCBsb25nIGllbmQsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG9idWYsIGludCBtYXNrKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZpZGNfZmlsbF8yeDhfdSh1bnNpZ25lZCBsb25nIGlidWYsIHVuc2lnbmVkIGxvbmcgaWVuZCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2J1ZiwgaW50IG1hc2spOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdmlkY19maWxsXzF4OF9zKHVuc2lnbmVkIGxvbmcgaWJ1ZiwgdW5zaWduZWQgbG9uZyBpZW5kLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyBvYnVmLCBpbnQgbWFzayk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB2aWRjX2ZpbGxfMng4X3ModW5zaWduZWQgbG9uZyBpYnVmLCB1bnNpZ25lZCBsb25nIGllbmQsCisJCQkJICAgICB1bnNpZ25lZCBsb25nIG9idWYsIGludCBtYXNrKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHZpZGNfZmlsbF8xeDE2X3ModW5zaWduZWQgbG9uZyBpYnVmLCB1bnNpZ25lZCBsb25nIGllbmQsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyBvYnVmLCBpbnQgbWFzayk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB2aWRjX2ZpbGxfMngxNl9zKHVuc2lnbmVkIGxvbmcgaWJ1ZiwgdW5zaWduZWQgbG9uZyBpZW5kLAorCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgb2J1ZiwgaW50IG1hc2spOworCisvKgorICogRE1BIEludGVycnVwdCBoYW5kbGVyCisgKi8KKworZXh0ZXJuIGlycXJldHVybl90IHZpZGNfc291bmRfZG1hX2lycShpbnQgaXJxbnIsIHZvaWQgKnJlZiwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpOworCisvKgorICogRmlsbGVyIHJvdXRpbmUgcG9pbnRlcgorICovCisKK2V4dGVybiB1bnNpZ25lZCBsb25nICgqdmlkY19maWxsZXIpICh1bnNpZ25lZCBsb25nIGlidWYsIHVuc2lnbmVkIGxvbmcgaWVuZCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgb2J1ZiwgaW50IG1hc2spOworCisvKgorICogVmlydHVhbCBETUEgYnVmZmVyIGV4aGF1c3RlZAorICovCisKK2V4dGVybiBpcnFyZXR1cm5fdCAoKmRtYV9pbnRlcnJ1cHQpICh2b2lkKTsKKworLyoKKyAqIFZpcnR1YWwgRE1BIGJ1ZmZlciBhZGRyZXNzZXMKKyAqLworCitleHRlcm4gdW5zaWduZWQgbG9uZyBkbWFfc3RhcnQsIGRtYV9jb3VudCwgZG1hX2J1ZnNpemU7CitleHRlcm4gdW5zaWduZWQgbG9uZyBkbWFfYnVmWzJdLCBkbWFfcGJ1ZlsyXTsKKworLyogdmlkY19zeW50aC5jICovCisKK2V4dGVybiB2b2lkICAgICB2aWRjX3N5bnRoX2luaXQoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKTsKK2V4dGVybiB2b2lkCXZpZGNfc3ludGhfZXhpdChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpOworZXh0ZXJuIGludCAgICAgIHZpZGNfc3ludGhfZ2V0X3ZvbHVtZSh2b2lkKTsKK2V4dGVybiBpbnQgICAgICB2aWRjX3N5bnRoX3NldF92b2x1bWUoaW50IHZvbCk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MvdmlkY19maWxsLlMgYi9zb3VuZC9vc3MvdmlkY19maWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjY2MwNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy92aWRjX2ZpbGwuUwpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqICBsaW51eC9kcml2ZXJzL3NvdW5kL3ZpZGNfZmlsbC5TCisgKgorICogIENvcHlyaWdodCAoQykgMTk5NyBSdXNzZWxsIEtpbmcKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBGaWxsZXIgcm91dGluZXMgZm9yIERNQSBidWZmZXJzCisgKi8KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisjaW5jbHVkZSA8YXNtL2Fzc2VtYmxlci5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9oYXJkd2FyZS9pb21kLmg+CisKKwkJLnRleHQKKworRU5UUlkodmlkY19maWxsXzF4OF91KQorCQltb3YJaXAsICMweGZmMDAKKzE6CQljbXAJcjAsIHIxCisJCWJnZQl2aWRjX2NsZWFyCisJCWxkcmIJcjQsIFtyMF0sICMxCisJCWVvcglyNCwgcjQsICMweDgwCisJCWFuZAlyNCwgaXAsIHI0LCBsc2wgIzgKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJc3RyCXI0LCBbcjJdLCAjNAorCQljbXAJcjIsIHIzCisJCWJsdAkxYgorCQltb3YJcGMsIGxyCisKK0VOVFJZKHZpZGNfZmlsbF8yeDhfdSkKKwkJbW92CWlwLCAjMHhmZjAwCisxOgkJY21wCXIwLCByMQorCQliZ2UJdmlkY19jbGVhcgorCQlsZHIJcjQsIFtyMF0sICMyCisJCWFuZAlyNSwgcjQsIGlwCisJCWFuZAlyNCwgaXAsIHI0LCBsc2wgIzgKKwkJb3JyCXI0LCByNCwgcjUsIGxzbCAjMTYKKwkJb3JyCXI0LCByNCwgcjQsIGxzciAjOAorCQlzdHIJcjQsIFtyMl0sICM0CisJCWNtcAlyMiwgcjMKKwkJYmx0CTFiCisJCW1vdglwYywgbHIKKworRU5UUlkodmlkY19maWxsXzF4OF9zKQorCQltb3YJaXAsICMweGZmMDAKKzE6CQljbXAJcjAsIHIxCisJCWJnZQl2aWRjX2NsZWFyCisJCWxkcmIJcjQsIFtyMF0sICMxCisJCWFuZAlyNCwgaXAsIHI0LCBsc2wgIzgKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJc3RyCXI0LCBbcjJdLCAjNAorCQljbXAJcjIsIHIzCisJCWJsdAkxYgorCQltb3YJcGMsIGxyCisKK0VOVFJZKHZpZGNfZmlsbF8yeDhfcykKKwkJbW92CWlwLCAjMHhmZjAwCisxOgkJY21wCXIwLCByMQorCQliZ2UJdmlkY19jbGVhcgorCQlsZHIJcjQsIFtyMF0sICMyCisJCWFuZAlyNSwgcjQsIGlwCisJCWFuZAlyNCwgaXAsIHI0LCBsc2wgIzgKKwkJb3JyCXI0LCByNCwgcjUsIGxzbCAjMTYKKwkJb3JyCXI0LCByNCwgcjQsIGxzciAjOAorCQlzdHIJcjQsIFtyMl0sICM0CisJCWNtcAlyMiwgcjMKKwkJYmx0CTFiCisJCW1vdglwYywgbHIKKworRU5UUlkodmlkY19maWxsXzF4MTZfcykKKwkJbW92CWlwLCAjMHhmZjAwCisJCW9ycglpcCwgaXAsIGlwLCBsc3IgIzgKKzE6CQljbXAJcjAsIHIxCisJCWJnZQl2aWRjX2NsZWFyCisJCWxkcglyNSwgW3IwXSwgIzIKKwkJYW5kCXI0LCByNSwgaXAKKwkJb3JyCXI0LCByNCwgcjQsIGxzbCAjMTYKKwkJc3RyCXI0LCBbcjJdLCAjNAorCQljbXAJcjAsIHIxCisJCWFkZGx0CXIwLCByMCwgIzIKKwkJYW5kbHQJcjQsIHI1LCBpcCwgbHNsICMxNgorCQlvcnJsdAlyNCwgcjQsIHI0LCBsc3IgIzE2CisJCXN0cmx0CXI0LCBbcjJdLCAjNAorCQljbXAJcjIsIHIzCisJCWJsdAkxYgorCQltb3YJcGMsIGxyCisKK0VOVFJZKHZpZGNfZmlsbF8yeDE2X3MpCisJCW1vdglpcCwgIzB4ZmYwMAorCQlvcnIJaXAsIGlwLCBpcCwgbHNyICM4CisxOgkJY21wCXIwLCByMQorCQliZ2UJdmlkY19jbGVhcgorCQlsZHIJcjQsIFtyMF0sICM0CisJCXN0cglyNCwgW3IyXSwgIzQKKwkJY21wCXIwLCByMQorCQlsZHJsdAlyNCwgW3IwXSwgIzQKKwkJc3RybHQJcjQsIFtyMl0sICM0CisJCWNtcAlyMiwgcjMKKwkJYmx0CTFiCisJCW1vdglwYywgbHIKKworRU5UUlkodmlkY19maWxsX25vYXVkaW8pCisJCW1vdglyMCwgIzAKKwkJbW92CXIxLCAjMAorMjoJCW1vdglyNCwgIzAKKwkJbW92CXI1LCAjMAorMToJCWNtcAlyMiwgcjMKKwkJc3RtbHRpYQlyMiEsIHtyMCwgcjEsIHI0LCByNX0KKwkJYmx0CTFiCisJCW1vdglwYywgbHIKKworRU5UUlkodmlkY19jbGVhcikKKwkJbW92CXIwLCAjMAorCQltb3YJcjEsICMwCisJCXRzdAlyMiwgIzQKKwkJc3RyCXIwLCBbcjJdLCAjNAorCQl0c3QJcjIsICM4CisJCXN0bWlhCXIyISwge3IwLCByMX0KKwkJYgkyYgorCisvKgorICogQ2FsbCBmaWxsZXIgcm91dGluZXMgd2l0aDoKKyAqICByMCA9IHBoeXMgYWRkcmVzcworICogIHIxID0gcGh5cyBlbmQKKyAqICByMiA9IGJ1ZmZlcgorICogUmV0dXJuczoKKyAqICByMCA9IG5ldyBidWZmZXIgYWRkcmVzcworICogIHIyID0gbmV3IGJ1ZmZlciBmaW5pc2gKKyAqICByNCA9IGNvcnJ1cHRlZAorICogIHI1ID0gY29ycnVwdGVkCisgKiAgaXAgPSBjb3JydXB0ZWQKKyAqLworCitFTlRSWSh2aWRjX3NvdW5kX2RtYV9pcnEpCisJCXN0bWZkCXNwISwge3I0IC0gcjgsIGxyfQorCQlsZHIJcjgsID1kbWFfc3RhcnQKKwkJbGRtaWEJcjgsIHtyMCwgcjEsIHIyLCByMywgcjQsIHI1fQorCQl0ZXEJcjEsICMwCisJCWFkcmVxCXI0LCB2aWRjX2ZpbGxfbm9hdWRpbworCQltb3ZlcQlyNywgIzEgPDwgMzEKKwkJbW92bmUJcjcsICMwCisJCW1vdglpcCwgI0lPTURfQkFTRSAmIDB4ZmYwMDAwMDAKKwkJb3JyCWlwLCBpcCwgI0lPTURfQkFTRSAmIDB4MDBmZjAwMDAKKwkJbGRyYglyNiwgW2lwLCAjSU9NRF9TRDBTVF0KKwkJdHN0CXI2LCAjRE1BX1NUX09GTAkJCUAgQ2hlY2sgZm9yIG92ZXJydW4KKwkJZW9ybmUJcjYsIHI2LCAjRE1BX1NUX0FCCisJCXRzdAlyNiwgI0RNQV9TVF9BQgorCQltb3ZlcQlyMiwgcjMJCQkJQCBETUFpbmcgQSwgdXBkYXRlIEIKKwkJYWRkCXIzLCByMiwgcjUJCQlAIEVuZCBvZiBETUEgYnVmZmVyCisJCWFkZAlyMSwgcjEsIHIwCQkJQCBFbmQgb2YgdmlydHVhbCBETUEgYnVmZmVyCisJCW1vdglsciwgcGMKKwkJbW92CXBjLCByNAkJCQlAIENhbGwgZmlsbCByb3V0aW5lICh1c2VzIHI0LCBpcCkKKwkJc3ViCXIxLCByMSwgcjAJCQlAIFJlbWFpbmluZyBsZW5ndGgKKwkJc3RtaWEJcjgsIHtyMCwgcjF9CisJCW1vdglyMCwgIzAKKwkJdHN0CXIyLCAjNAkJCQlAIFJvdW5kIGJ1ZmZlciB1cCB0byA0IHdvcmRzCisJCXN0cm5lCXIwLCBbcjJdLCAjNAorCQl0c3QJcjIsICM4CisJCXN0cm5lCXIwLCBbcjJdLCAjNAorCQlzdHJuZQlyMCwgW3IyXSwgIzQKKwkJc3ViCXIyLCByMiwgIzE2CisJCW1vdglyMiwgcjIsIGxzbCAjMjAKKwkJbW92cwlyMiwgcjIsIGxzciAjMjAKKwkJb3JyZXEJcjIsIHIyLCAjMSA8PCAzMAkJQCBTZXQgTCBiaXQKKwkJb3JyCXIyLCByMiwgcjcKKwkJbGRtZGIJcjgsIHtyMywgcjQsIHI1fQorCQl0c3QJcjYsICNETUFfU1RfQUIKKwkJbW92CWlwLCAjSU9NRF9CQVNFICYgMHhmZjAwMDAwMAorCQlvcnIJaXAsIGlwLCAjSU9NRF9CQVNFICYgMHgwMGZmMDAwMAorCQlzdHJlcQlyNCwgW2lwLCAjSU9NRF9TRDBDVVJCXQorCQlzdHJuZQlyNSwgW2lwLCAjSU9NRF9TRDBDVVJBXQorCQlzdHJlcQlyMiwgW2lwLCAjSU9NRF9TRDBFTkRCXQorCQlzdHJuZQlyMiwgW2lwLCAjSU9NRF9TRDBFTkRBXQorCQlsZHIJbHIsIFtpcCwgI0lPTURfU0QwU1RdCisJCXRzdAlsciwgI0RNQV9TVF9PRkwKKwkJYm5lCTFmCisJCXRzdAlyNiwgI0RNQV9TVF9BQgorCQlzdHJuZQlyNCwgW2lwLCAjSU9NRF9TRDBDVVJCXQorCQlzdHJlcQlyNSwgW2lwLCAjSU9NRF9TRDBDVVJBXQorCQlzdHJuZQlyMiwgW2lwLCAjSU9NRF9TRDBFTkRCXQorCQlzdHJlcQlyMiwgW2lwLCAjSU9NRF9TRDBFTkRBXQorMToJCXRlcQlyNywgIzAKKwkJbW92CXIwLCAjMHgxMAorCQlzdHJuZWIJcjAsIFtpcCwgI0lPTURfU0QwQ1JdCisJCWxkbWZkCXNwISwge3I0IC0gcjgsIGxyfQorCQltb3YJcjAsICMxCQkJCUAgSVJRX0hBTkRMRUQKKwkJdGVxCXIxLCAjMAkJCQlAIElmIHdlIGhhdmUgbm8gbW9yZQorCQltb3ZuZQlwYywgbHIKKwkJdGVxCXIzLCAjMAorCQltb3ZuZQlwYywgcjMJCQkJQCBDYWxsIGludGVycnVwdCByb3V0aW5lCisJCW1vdglwYywgbHIKKworCQkuZGF0YQorCQkuZ2xvYmwJZG1hX2ludGVycnVwdAorZG1hX2ludGVycnVwdDoKKwkJLmxvbmcJMAkJCQlAIHIzCisJCS5nbG9ibAlkbWFfcGJ1ZgorZG1hX3BidWY6CisJCS5sb25nCTAJCQkJQCByNAorCQkubG9uZwkwCQkJCUAgcjUKKwkJLmdsb2JsCWRtYV9zdGFydAorZG1hX3N0YXJ0OgorCQkubG9uZwkwCQkJCUAgcjAKKwkJLmdsb2JsCWRtYV9jb3VudAorZG1hX2NvdW50OgorCQkubG9uZwkwCQkJCUAgcjEKKwkJLmdsb2JsCWRtYV9idWYKK2RtYV9idWY6CisJCS5sb25nCTAJCQkJQCByMgorCQkubG9uZwkwCQkJCUAgcjMKKwkJLmdsb2JsCXZpZGNfZmlsbGVyCit2aWRjX2ZpbGxlcjoKKwkJLmxvbmcJdmlkY19maWxsX25vYXVkaW8JCUAgcjQKKwkJLmdsb2JsCWRtYV9idWZzaXplCitkbWFfYnVmc2l6ZToKKwkJLmxvbmcJMHgxMDAwCQkJCUAgcjUKZGlmZiAtLWdpdCBhL3NvdW5kL29zcy92d3NuZC5jIGIvc291bmQvb3NzL3Z3c25kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1NDIzMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy92d3NuZC5jCkBAIC0wLDAgKzEsMzQ4NiBAQAorLyoKKyAqIFNvdW5kIGRyaXZlciBmb3IgU2lsaWNvbiBHcmFwaGljcyAzMjAgYW5kIDU0MCBWaXN1YWwgV29ya3N0YXRpb25zJworICogb25ib2FyZCBhdWRpby4gIFNlZSBub3RlcyBpbiBEb2N1bWVudGF0aW9uL3NvdW5kL29zcy92d3NuZCAuCisgKgorICogQ29weXJpZ2h0IDE5OTkgU2lsaWNvbiBHcmFwaGljcywgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjdW5kZWYgVldTTkRfREVCVUcJCQkvKiBkZWZpbmUgZm9yIGRlYnVnZ2luZyAqLworCisvKgorICogWFhYIHRvIGRvIC0KKyAqCisgKglFeHRlcm5hbCBzeW5jLgorICoJUmVuYW1lIHN3YnVmLCBod2J1ZiwgdSZpLCBod3B0ciZzd3B0ciB0byBzb21ldGhpbmcgcmF0aW9uYWwuCisgKglCdWcgLSBpZiBzZWxlY3QoKSBjYWxsZWQgYmVmb3JlIHJlYWQoKSwgcGNtX3NldHVwKCkgbm90IGNhbGxlZC4KKyAqCUJ1ZyAtIG91dHB1dCBkb2Vzbid0IHN0b3Agc29vbiBlbm91Z2ggaWYgcHJvY2VzcyBraWxsZWQuCisgKi8KKworLyoKKyAqIFRoaW5ncyB0byB0ZXN0IC0KKyAqCisgKglXaWxsIHJlYWR2L3dyaXRldiB3b3JrPyAgV3JpdGUgYSB0ZXN0LgorICoKKyAqCWluc21vZC9ybW1vZCAxMDAgbWlsbGlvbiB0aW1lcy4KKyAqCisgKglSdW4gSS9PIHVudGlsIGludCBwdHJzIHdyYXAgYXJvdW5kIChyb3VnaGx5IDYuMiBob3VycyBAIERBVAorICoJcmF0ZSkuCisgKgorICoJQ29uY3VycmVudCB0aHJlYWRzIGJhbmdpbmcgb24gbWl4ZXIgc2ltdWx0YW5lb3VzbHksIGJvdGggVVAKKyAqCWFuZCBTTVAga2VybmVscy4gIEVzcGVjaWFsbHksIHdhdGNoIGZvciB0aHJlYWQgQSBjaGFuZ2luZworICoJT1VUU1JDIHdoaWxlIHRocmVhZCBCIGNoYW5nZXMgZ2FpbiAtLSBib3RoIHdyaXRlIHRvIHRoZSBzYW1lCisgKglhZDE4NDMgcmVnaXN0ZXIuCisgKgorICoJV2hhdCBoYXBwZW5zIGlmIGEgY2xpZW50IG9wZW5zIC9kZXYvYXVkaW8gdGhlbiBmb3Jrcz8KKyAqCURvIHR3byBwcm9jcyBoYXZlIC9kZXYvYXVkaW8gb3Blbj8gIFRlc3QuCisgKgorICoJUHVtcCBhdWRpbyB0aHJvdWdoIHRoZSBDRCwgTUlDIGFuZCBsaW5lIGlucHV0cyBhbmQgdmVyaWZ5IHRoYXQKKyAqCXRoZXkgbWl4L211dGUgaW50byB0aGUgb3V0cHV0LgorICoKKyAqCUFwcHM6CisgKgkJYW1wCisgKgkJbXBnMTIzCisgKgkJeDExYW1wCisgKgkJbXh2CisgKgkJa21lZGlhCisgKgkJZXNvdW5kCisgKgkJbmVlZCBtb3JlIGlucHV0IGFwcHMKKyAqCisgKglSdW4gdGVzdHMgd2hpbGUgYm9tYmFyZGluZyB3aXRoIHNpZ25hbHMuICBzZXRpdGltZXIoMikgd2lsbCBkbyBpdC4uLiAgKi8KKworLyoKKyAqIFRoaXMgZHJpdmVyIGlzIG9yZ2FuaXplZCBpbiBuaW5lIHNlY3Rpb25zLgorICogVGhlIG5pbmUgc2VjdGlvbnMgYXJlOgorICoKKyAqCWRlYnVnIHN0dWZmCisgKiAJbG93IGxldmVsIGxpdGhpdW0gYWNjZXNzCisgKgloaWdoIGxldmVsIGxpdGhpdW0gYWNjZXNzCisgKglBRDE4NDMgYWNjZXNzCisgKglQQ00gSS9PCisgKglhdWRpbyBkcml2ZXIKKyAqCW1peGVyIGRyaXZlcgorICoJcHJvYmUvYXR0YWNoL3VubG9hZAorICoJaW5pdGlhbGl6YXRpb24gYW5kIGxvYWRhYmxlIGtlcm5lbCBtb2R1bGUgaW50ZXJmYWNlCisgKgorICogVGhhdCBpcyByb3VnaGx5IHRoZSBvcmRlciBvZiBpbmNyZWFzaW5nIGFic3RyYWN0aW9uLCBzbyBmb3J3YXJkCisgKiBkZXBlbmRlbmNpZXMgYXJlIG1pbmltYWwuCisgKi8KKworLyoKKyAqIExvY2tpbmcgTm90ZXMKKyAqCisgKglJTkNfVVNFX0NPVU5UIGFuZCBERUNfVVNFX0NPVU5UIGtlZXAgdHJhY2sgb2YgdGhlIG51bWJlciBvZgorICoJb3BlbiBkZXNjcmlwdG9ycyB0byB0aGlzIGRyaXZlci4gVGhleSBzdG9yZSBpdCBpbiB2d3NuZF91c2VfY291bnQuCisgKiAJVGhlIGdsb2JhbCBkZXZpY2UgbGlzdCwgdndzbmRfZGV2X2xpc3QsCWlzIGltbXV0YWJsZSB3aGVuIHRoZSBJTl9VU0UKKyAqCWlzIHRydWUuCisgKgorICoJZGV2Yy0+b3Blbl9sb2NrIGlzIGEgc2VtYXBob3JlIHRoYXQgaXMgdXNlZCB0byBlbmZvcmNlIHRoZQorICoJc2luZ2xlIHJlYWRlci9zaW5nbGUgd3JpdGVyIHJ1bGUgZm9yIC9kZXYvYXVkaW8uICBUaGUgcnVsZSBpcworICoJdGhhdCBlYWNoIGRldmljZSBtYXkgaGF2ZSBhdCBtb3N0IG9uZSByZWFkZXIgYW5kIG9uZSB3cml0ZXIuCisgKglPcGVuIHdpbGwgYmxvY2sgdW50aWwgdGhlIHByZXZpb3VzIGNsaWVudCBoYXMgY2xvc2VkIHRoZQorICoJZGV2aWNlLCB1bmxlc3MgT19OT05CTE9DSyBpcyBzcGVjaWZpZWQuCisgKgorICoJVGhlIHNlbWFwaG9yZSBkZXZjLT5pb19zZW1hIHNlcmlhbGl6ZXMgUENNIEkvTyBzeXNjYWxscy4gIFRoaXMKKyAqCWlzIHVubmVjZXNzYXJ5IGluIExpbnV4IDIuMiwgYmVjYXVzZSB0aGUga2VybmVsIGxvY2sKKyAqCXNlcmlhbGl6ZXMgcmVhZCwgd3JpdGUsIGFuZCBpb2N0bCBnbG9iYWxseSwgYnV0IGl0J3MgdGhlcmUsCisgKglyZWFkeSBmb3IgdGhlIGJyYXZlLCBuZXcgcG9zdC1rZXJuZWwtbG9jayB3b3JsZC4KKyAqCisgKglMb2NraW5nIGJldHdlZW4gaW50ZXJydXB0IGFuZCBiYXNlbGV2ZWwgaXMgaGFuZGxlZCBieSB0aGUKKyAqCSJsb2NrIiBzcGlubG9jayBpbiB2d3NuZF9wb3J0IChvbmUgbG9jayBlYWNoIGZvciByZWFkIGFuZAorICoJd3JpdGUpLiAgRWFjaCBoYWxmIGhvbGRzIHRoZSBsb2NrIGp1c3QgbG9uZyBlbm91Z2ggdG8gc2VlIHdoYXQKKyAqCWFyZWEgaXQgb3ducyBhbmQgdXBkYXRlIGl0cyBwb2ludGVycy4gIFNlZSBwY21fb3V0cHV0KCkgYW5kCisgKglwY21faW5wdXQoKSBmb3IgbW9zdCBvZiB0aGUgZ29yeSBzdHVmZi4KKyAqCisgKglkZXZjLT5taXhfc2VtYSBzZXJpYWxpemVzIGFsbCBtaXhlciBpb2N0bHMuICBUaGlzIGlzIGFsc28KKyAqCXJlZHVuZGFudCBiZWNhdXNlIG9mIHRoZSBrZXJuZWwgbG9jay4KKyAqCisgKglUaGUgbG93ZXN0IGxldmVsIGxvY2sgaXMgbGl0aC0+bGl0aGl1bV9sb2NrLiAgSXQgaXMgYQorICoJc3BpbmxvY2sgd2hpY2ggaXMgaGVsZCBkdXJpbmcgdGhlIHR3by1yZWdpc3RlciB0YW5nbyBvZgorICoJcmVhZGluZy93cml0aW5nIGFuIEFEMTg0MyByZWdpc3Rlci4gIFNlZQorICoJbGlfe3JlYWQsd3JpdGV9X2FkMTg0M19yZWcoKS4KKyAqLworCisvKgorICogU2FtcGxlIEZvcm1hdCBOb3RlcworICoKKyAqCUxpdGhpdW0ncyBETUEgZW5naW5lIGhhcyB0d28gZm9ybWF0czogMTYtYml0IDIncyBjb21wbGVtZW50CisgKglhbmQgOC1iaXQgdW5zaWduZWQgLiAgMTYtYml0IHRyYW5zZmVycyB0aGUgZGF0YSB1bm1vZGlmaWVkLCAyCisgKglieXRlcyBwZXIgc2FtcGxlLiAgOC1iaXQgdW5zaWduZWQgdHJhbnNmZXJzIDEgYnl0ZSBwZXIgc2FtcGxlCisgKglhbmQgWE9ScyBlYWNoIGJ5dGUgd2l0aCAweDgwLiAgTGl0aGl1bSBjYW4gaW5wdXQgb3Igb3V0cHV0CisgKgllaXRoZXIgbW9ubyBvciBzdGVyZW8gaW4gZWl0aGVyIGZvcm1hdC4KKyAqCisgKglUaGUgQUQxODQzIGhhcyBmb3VyIGZvcm1hdHM6IDE2LWJpdCAyJ3MgY29tcGxlbWVudCwgOC1iaXQKKyAqCXVuc2lnbmVkLCA4LWJpdCBtdS1MYXcgYW5kIDgtYml0IEEtTGF3LgorICoKKyAqCVRoaXMgZHJpdmVyIHN1cHBvcnRzIGZpdmUgZm9ybWF0czogQUZNVF9TOCwgQUZNVF9VOCwKKyAqCUFGTVRfTVVfTEFXLCBBRk1UX0FfTEFXLCBhbmQgQUZNVF9TMTZfTEUuCisgKgorICoJRm9yIEFGTVRfVTggb3V0cHV0LCB3ZSBrZWVwIHRoZSBBRDE4NDMgaW4gMTYtYml0IG1vZGUsIGFuZAorICoJcmVseSBvbiBMaXRoaXVtJ3MgWE9SIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIFU4IGFuZCBTOC4KKyAqCisgKglGb3IgQUZNVF9TOCwgQUZNVF9NVV9MQVcgYW5kIEFGTVRfQV9MQVcgb3V0cHV0LCB3ZSBoYXZlIHRvIFhPUgorICoJdGhlIDB4ODAgYml0IGluIHNvZnR3YXJlIHRvIGNvbXBlbnNhdGUgZm9yIExpdGhpdW0ncyBYT1IuCisgKglUaGlzIGhhcHBlbnMgaW4gcGNtX2NvcHlfe2luLG91dH0oKS4KKyAqCisgKiBDaGFuZ2VzOgorICogMTEtMTAtMjAwMAlCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxia3pAbGludXgtaWRlLm9yZz4KKyAqCQlBZGRlZCBzb21lIF9faW5pdC9fX2V4aXQKKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxhc20vc2VtYXBob3JlLmg+CisjaW5jbHVkZSA8YXNtL21hY2gtdmlzd3MvY29iYWx0Lmg+CisKKyNpbmNsdWRlICJzb3VuZF9jb25maWcuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogZGVidWcgc3R1ZmYgKi8KKworI2lmZGVmIFZXU05EX0RFQlVHCisKK3N0YXRpYyBpbnQgc2h1dF91cCA9IDE7CisKKy8qCisgKiBkYmdhc3NlcnQgLSBjYWxsZWQgd2hlbiBhbiBhc3NlcnRpb24gZmFpbHMuCisgKi8KKworc3RhdGljIHZvaWQgZGJnYXNzZXJ0KGNvbnN0IGNoYXIgKmZjbiwgaW50IGxpbmUsIGNvbnN0IGNoYXIgKmV4cHIpCit7CisJaWYgKGluX2ludGVycnVwdCgpKQorCQlwYW5pYygiQVNTRVJUSU9OIEZBSUxFRCBJTiBJTlRFUlJVUFQsICVzOiVzOiVkICVzXG4iLAorCQkgICAgICBfX0ZJTEVfXywgZmNuLCBsaW5lLCBleHByKTsKKwllbHNlIHsKKwkJaW50IHg7CisJCXByaW50ayhLRVJOX0VSUiAiQVNTRVJUSU9OIEZBSUxFRCwgJXM6JXM6JWQgJXNcbiIsCisJCSAgICAgICBfX0ZJTEVfXywgZmNuLCBsaW5lLCBleHByKTsKKwkJeCA9ICogKHZvbGF0aWxlIGludCAqKSAwOyAvKiBmb3JjZSBwcm9jIHRvIGV4aXQgKi8KKwl9Cit9CisKKy8qCisgKiBCdW5jaCBvZiB1c2VmdWwgZGVidWcgbWFjcm9zOgorICoKKyAqCUFTU0VSVAktIHByaW50IHVubGVzcyBlIG5vbnplcm8gKHBhbmljIGlmIGluIGludGVycnVwdCkKKyAqCURCR0RPCS0gaW5jbHVkZSBhcmJpdHJhcnkgY29kZSBpZiBkZWJ1Z2dpbmcKKyAqCURCR1gJLSBkZWJ1ZyBwcmludCByYXcgKHcvbyBmdW5jdGlvbiBuYW1lKQorICoJREJHUAktIGRlYnVnIHByaW50IHcvIGZ1bmN0aW9uIG5hbWUKKyAqCURCR0UJLSBkZWJ1ZyBwcmludCBmdW5jdGlvbiBlbnRyeQorICoJREJHQwktIGRlYnVnIHByaW50IGZ1bmN0aW9uIGNhbGwKKyAqCURCR1IJLSBkZWJ1ZyBwcmludCBmdW5jdGlvbiByZXR1cm4KKyAqCURCR1hWCS0gZGVidWcgcHJpbnQgcmF3IHdoZW4gdmVyYm9zZQorICoJREJHUFYJLSBkZWJ1ZyBwcmludCB3aGVuIHZlcmJvc2UKKyAqCURCR0VWCS0gZGVidWcgcHJpbnQgZnVuY3Rpb24gZW50cnkgd2hlbiB2ZXJib3NlCisgKglEQkdSVgktIGRlYnVnIHByaW50IGZ1bmN0aW9uIHJldHVybiB3aGVuIHZlcmJvc2UKKyAqLworCisjZGVmaW5lIEFTU0VSVChlKSAgICAgICgoZSkgPyAodm9pZCkgMCA6IGRiZ2Fzc2VydChfX0ZVTkNUSU9OX18sIF9fTElORV9fLCAjZSkpCisjZGVmaW5lIERCR0RPKHgpICAgICAgICAgICAgeAorI2RlZmluZSBEQkdYKGZtdCwgYXJncy4uLikgIChpbl9pbnRlcnJ1cHQoKSA/IDAgOiBwcmludGsoS0VSTl9FUlIgZm10LCAjI2FyZ3MpKQorI2RlZmluZSBEQkdQKGZtdCwgYXJncy4uLikgIChEQkdYKCIlczogIiBmbXQsIF9fRlVOQ1RJT05fXyAsICMjYXJncykpCisjZGVmaW5lIERCR0UoZm10LCBhcmdzLi4uKSAgKERCR1goIiVzIiBmbXQsIF9fRlVOQ1RJT05fXyAsICMjYXJncykpCisjZGVmaW5lIERCR0MocnRuKSAgICAgICAgICAgKERCR1AoImNhbGxpbmcgJXNcbiIsIHJ0bikpCisjZGVmaW5lIERCR1IoKSAgICAgICAgICAgICAgKERCR1AoInJldHVybmluZ1xuIikpCisjZGVmaW5lIERCR1hWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHWChmbXQsICMjYXJncykpCisjZGVmaW5lIERCR1BWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHUChmbXQsICMjYXJncykpCisjZGVmaW5lIERCR0VWKGZtdCwgYXJncy4uLikgKHNodXRfdXAgPyAwIDogREJHRShmbXQsICMjYXJncykpCisjZGVmaW5lIERCR0NWKHJ0bikgICAgICAgICAgKHNodXRfdXAgPyAwIDogREJHQyhydG4pKQorI2RlZmluZSBEQkdSVigpICAgICAgICAgICAgIChzaHV0X3VwID8gMCA6IERCR1IoKSkKKworI2Vsc2UgLyogIVZXU05EX0RFQlVHICovCisKKyNkZWZpbmUgQVNTRVJUKGUpICAgICAgICAgICAoKHZvaWQpIDApCisjZGVmaW5lIERCR0RPKHgpICAgICAgICAgICAgLyogZG9uJ3QgKi8KKyNkZWZpbmUgREJHWChmbXQsIGFyZ3MuLi4pICAoKHZvaWQpIDApCisjZGVmaW5lIERCR1AoZm10LCBhcmdzLi4uKSAgKCh2b2lkKSAwKQorI2RlZmluZSBEQkdFKGZtdCwgYXJncy4uLikgICgodm9pZCkgMCkKKyNkZWZpbmUgREJHQyhydG4pICAgICAgICAgICAoKHZvaWQpIDApCisjZGVmaW5lIERCR1IoKSAgICAgICAgICAgICAgKCh2b2lkKSAwKQorI2RlZmluZSBEQkdQVihmbXQsIGFyZ3MuLi4pICgodm9pZCkgMCkKKyNkZWZpbmUgREJHWFYoZm10LCBhcmdzLi4uKSAoKHZvaWQpIDApCisjZGVmaW5lIERCR0VWKGZtdCwgYXJncy4uLikgKCh2b2lkKSAwKQorI2RlZmluZSBEQkdDVihydG4pICAgICAgICAgICgodm9pZCkgMCkKKyNkZWZpbmUgREJHUlYoKSAgICAgICAgICAgICAoKHZvaWQpIDApCisKKyNlbmRpZiAvKiAhVldTTkRfREVCVUcgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbG93IGxldmVsIGxpdGhpdW0gYWNjZXNzICovCisKKy8qCisgKiBXZSBuZWVkIHRvIHRhbGsgdG8gTGl0aGl1bSByZWdpc3RlcnMgb24gdGhyZWUgcGFnZXMuICBIZXJlIGFyZQorICogdGhlIHBhZ2VzJyBvZmZzZXRzIGZyb20gdGhlIGJhc2UgYWRkcmVzcyAoMHhGRjAwMTAwMCkuCisgKi8KKworZW51bSB7CisJTElfUEFHRTBfT0ZGU0VUID0gMHgwMTAwMCAtIDB4MTAwMCwgLyogRkYwMDEwMDAgKi8KKwlMSV9QQUdFMV9PRkZTRVQgPSAweDBGMDAwIC0gMHgxMDAwLCAvKiBGRjAwRjAwMCAqLworCUxJX1BBR0UyX09GRlNFVCA9IDB4MTAwMDAgLSAweDEwMDAsIC8qIEZGMDEwMDAwICovCit9OworCisvKiBsb3ctbGV2ZWwgbGl0aGl1bSBkYXRhICovCisKK3R5cGVkZWYgc3RydWN0IGxpdGhpdW0geworCXZvaWQgKgkJcGFnZTA7CQkvKiB2aXJ0dWFsIGFkZHJlc3NlcyAqLworCXZvaWQgKgkJcGFnZTE7CisJdm9pZCAqCQlwYWdlMjsKKwlzcGlubG9ja190CWxvY2s7CQkvKiBwcm90ZWN0cyBjb2RlYyBhbmQgVVNUL01TQyBhY2Nlc3MgKi8KK30gbGl0aGl1bV90OworCisvKgorICogbGlfY3JlYXRlIGluaXRpYWxpemVzIHRoZSBsaXRoaXVtX3Qgc3RydWN0dXJlIGFuZCBzZXRzIHVwIHZtIG1hcHBpbmdzCisgKiB0byBhY2Nlc3MgdGhlIHJlZ2lzdGVycy4KKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IF9faW5pdCBsaV9jcmVhdGUobGl0aGl1bV90ICpsaXRoLCB1bnNpZ25lZCBsb25nIGJhc2VhZGRyKQoreworCXN0YXRpYyB2b2lkIGxpX2Rlc3Ryb3kobGl0aGl1bV90ICopOworCisJc3Bpbl9sb2NrX2luaXQoJmxpdGgtPmxvY2spOworCWxpdGgtPnBhZ2UwID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTBfT0ZGU0VULCBQQUdFX1NJWkUpOworCWxpdGgtPnBhZ2UxID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTFfT0ZGU0VULCBQQUdFX1NJWkUpOworCWxpdGgtPnBhZ2UyID0gaW9yZW1hcF9ub2NhY2hlKGJhc2VhZGRyICsgTElfUEFHRTJfT0ZGU0VULCBQQUdFX1NJWkUpOworCWlmICghbGl0aC0+cGFnZTAgfHwgIWxpdGgtPnBhZ2UxIHx8ICFsaXRoLT5wYWdlMikgeworCQlsaV9kZXN0cm95KGxpdGgpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsaV9kZXN0cm95IGRlc3Ryb3lzIHRoZSBsaXRoaXVtX3Qgc3RydWN0dXJlIGFuZCB2bSBtYXBwaW5ncy4KKyAqLworCitzdGF0aWMgdm9pZCBsaV9kZXN0cm95KGxpdGhpdW1fdCAqbGl0aCkKK3sKKwlpZiAobGl0aC0+cGFnZTApIHsKKwkJaW91bm1hcChsaXRoLT5wYWdlMCk7CisJCWxpdGgtPnBhZ2UwID0gTlVMTDsKKwl9CisJaWYgKGxpdGgtPnBhZ2UxKSB7CisJCWlvdW5tYXAobGl0aC0+cGFnZTEpOworCQlsaXRoLT5wYWdlMSA9IE5VTEw7CisJfQorCWlmIChsaXRoLT5wYWdlMikgeworCQlpb3VubWFwKGxpdGgtPnBhZ2UyKTsKKwkJbGl0aC0+cGFnZTIgPSBOVUxMOworCX0KK30KKworLyoKKyAqIGJhc2ljIHJlZ2lzdGVyIGFjY2Vzc29ycyAtIHJlYWQvd3JpdGUgbG9uZy9ieXRlCisgKi8KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZyBsaV9yZWFkbChsaXRoaXVtX3QgKmxpdGgsIGludCBvZmYpCit7CisJcmV0dXJuICogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgtPnBhZ2UwICsgb2ZmKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgY2hhciBsaV9yZWFkYihsaXRoaXVtX3QgKmxpdGgsIGludCBvZmYpCit7CisJcmV0dXJuICogKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikgKGxpdGgtPnBhZ2UwICsgb2ZmKTsKK30KKworc3RhdGljIF9faW5saW5lX18gdm9pZCBsaV93cml0ZWwobGl0aGl1bV90ICpsaXRoLCBpbnQgb2ZmLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwkqICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChsaXRoLT5wYWdlMCArIG9mZikgPSB2YWw7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlfd3JpdGViKGxpdGhpdW1fdCAqbGl0aCwgaW50IG9mZiwgdW5zaWduZWQgY2hhciB2YWwpCit7CisJKiAodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKSAobGl0aC0+cGFnZTAgKyBvZmYpID0gdmFsOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBIaWdoIExldmVsIExpdGhpdW0gQWNjZXNzICovCisKKy8qCisgKiBMaXRoaXVtIERNQSBOb3RlcworICoKKyAqIExpdGhpdW0gaGFzIHR3byBkZWRpY2F0ZWQgRE1BIGNoYW5uZWxzIGZvciBhdWRpby4gIFRoZXkgYXJlIGtub3duCisgKiBhcyBjb21tMSBhbmQgY29tbTIgKGNvbW11bmljYXRpb24gYXJlYXMgMSBhbmQgMikuICBDb21tMSBpcyBmb3IKKyAqIGlucHV0LCBhbmQgY29tbTIgaXMgZm9yIG91dHB1dC4gIEVhY2ggaXMgY29udHJvbGxlZCBieSB0aHJlZQorICogcmVnaXN0ZXJzOiBCQVNFIChiYXNlIGFkZHJlc3MpLCBDRkcgKGNvbmZpZykgYW5kIENDVEwKKyAqIChjb25maWcvY29udHJvbCkuCisgKgorICogRWFjaCBETUEgY2hhbm5lbCBwb2ludHMgdG8gYSBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMgcmluZyBidWZmZXIgaW4KKyAqIG1haW4gbWVtb3J5IG9mIHVwIHRvIDggS2J5dGVzLiAgKFRoaXMgZHJpdmVyIGFsd2F5cyB1c2VzIDggS2IuKQorICogVGhlcmUgYXJlIHRocmVlIHBvaW50ZXJzIGludG8gdGhlIHJpbmcgYnVmZmVyOiByZWFkLCB3cml0ZSwgYW5kCisgKiB0cmlnZ2VyLiAgVGhlIHBvaW50ZXJzIGFyZSA4IGJpdHMgZWFjaC4gIEVhY2ggcG9pbnRlciBwb2ludHMgdG8KKyAqIDMyLWJ5dGUgImNodW5rcyIgb2YgZGF0YS4gIFRoZSBETUEgZW5naW5lIG1vdmVzIDMyIGJ5dGVzIGF0IGEgdGltZSwKKyAqIHNvIHRoZXJlIGlzIG5vIGZpbmVyLWdyYW51bGFyaXR5IGNvbnRyb2wuCisgKgorICogSW4gY29tbTEsIHRoZSBoYXJkd2FyZSB1cGRhdGVzIHRoZSB3cml0ZSBwdHIsIGFuZCBzb2Z0d2FyZSB1cGRhdGVzCisgKiB0aGUgcmVhZCBwdHIuICBJbiBjb21tMiwgaXQncyB0aGUgb3Bwb3NpdGU6IGhhcmR3YXJlIHVwZGF0ZXMgdGhlCisgKiByZWFkIHB0ciwgYW5kIHNvZnR3YXJlIHVwZGF0ZXMgdGhlIHdyaXRlIHB0ci4gIEkgZGVzaWduYXRlIHRoZQorICogaGFyZHdhcmUtdXBkYXRlZCBwdHIgYXMgdGhlIGh3cHRyLCBhbmQgdGhlIHNvZnR3YXJlLXVwZGF0ZWQgcHRyIGFzCisgKiB0aGUgc3dwdHIuCisgKgorICogVGhlIHRyaWdnZXIgcHRyIGFuZCB0cmlnZ2VyIG1hc2sgYXJlIHVzZWQgdG8gdHJpZ2dlciBpbnRlcnJ1cHRzLgorICogRnJvbSB0aGUgTGl0aGl1bSBzcGVjLCBzZWN0aW9uIDUuNi44LCByZXZpc2lvbiBvZiAxMi8xNS8xOTk4OgorICoKKyAqCVRyaWdnZXIgTWFzayBWYWx1ZQorICoKKyAqCUEgdGhyZWUgYml0IHdpZGUgZmllbGQgdGhhdCByZXByZXNlbnRzIGEgcG93ZXIgb2YgdHdvIG1hc2sKKyAqCXRoYXQgaXMgdXNlZCB3aGVuZXZlciB0aGUgdHJpZ2dlciBwb2ludGVyIGlzIGNvbXBhcmVkIHRvIGl0cworICoJcmVzcGVjdGl2ZSByZWFkIG9yIHdyaXRlIHBvaW50ZXIuICBBIHZhbHVlIG9mIHplcm8gaGVyZQorICoJaW1wbGllcyBhIG1hc2sgb2YgMHhGRiBhbmQgYSB2YWx1ZSBvZiBzZXZlbiBpbXBsaWVzIGEgbWFzaworICoJMHgwMS4gIFRoaXMgdmFsdWUgY2FuIGJlIHVzZWQgdG8gc3ViLWRpdmlkZSB0aGUgcmluZyBidWZmZXIKKyAqCWludG8gcGllIHNlY3Rpb25zIHNvIHRoYXQgaW50ZXJydXB0cyBtb25pdG9yIHRoZSBwcm9ncmVzcyBvZgorICoJaGFyZHdhcmUgZnJvbSBzZWN0aW9uIHRvIHNlY3Rpb24uCisgKgorICogTXkgaW50ZXJwcmV0YXRpb24gb2YgdGhhdCBpcywgd2hlbmV2ZXIgdGhlIGh3IHB0ciBpcyB1cGRhdGVkLCBpdCBpcworICogY29tcGFyZWQgd2l0aCB0aGUgdHJpZ2dlciBwdHIsIGFuZCB0aGUgcmVzdWx0IGlzIG1hc2tlZCBieSB0aGUKKyAqIHRyaWdnZXIgbWFzay4gIChBY3R1YWxseSwgYnkgdGhlIGNvbXBsZW1lbnQgb2YgdGhlIHRyaWdnZXIgbWFzay4pCisgKiBJZiB0aGUgcmVzdWx0IGlzIHplcm8sIGFuIGludGVycnVwdCBpcyB0cmlnZ2VyZWQuICBJLmUuLCBpbnRlcnJ1cHQKKyAqIGlmICgoaHdwdHIgJiB+bWFzaykgPT0gKHRycHRyICYgfm1hc2spKS4gIFRoZSBtYXNrIGlzIGZvcm1lZCBmcm9tCisgKiB0aGUgdHJpZ2dlciByZWdpc3RlciB2YWx1ZSBhcyBtYXNrID0gKDEgPDwgKDggLSB0bXJlZykpIC0gMS4KKyAqCisgKiBJbiB5ZXQgZGlmZmVyZW50IHdvcmRzLCBzZXR0aW5nIHRtcmVnIHRvIDAgY2F1c2VzIGFuIGludGVycnVwdCBhZnRlcgorICogZXZlcnkgMjU2IERNQSBjaHVua3MgKDgxOTIgYnl0ZXMpIG9yIG9uY2UgcGVyIHRyYXZlcnNhbCBvZiB0aGUKKyAqIHJpbmcgYnVmZmVyLiAgU2V0dGluZyBpdCB0byA3IGNhdWVzIGFuIGludGVycnVwdCBldmVyeSAyIERNQSBjaHVua3MKKyAqICg2NCBieXRlcykgb3IgMTI4IHRpbWVzIHBlciB0cmF2ZXJzYWwgb2YgdGhlIHJpbmcgYnVmZmVyLgorICovCisKKy8qIExpdGhpdW0gcmVnaXN0ZXIgb2Zmc2V0cyBhbmQgYml0IGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgTElfSE9TVF9DT05UUk9MTEVSCTB4MDAwCisjIGRlZmluZSBMSV9IQ19SRVNFVAkJIDB4MDAwMDgwMDAKKyMgZGVmaW5lIExJX0hDX0xJTktfRU5BQkxFCSAweDAwMDA0MDAwCisjIGRlZmluZSBMSV9IQ19MSU5LX0ZBSUxVUkUJIDB4MDAwMDAwMDQKKyMgZGVmaW5lIExJX0hDX0xJTktfQ09ERUMJIDB4MDAwMDAwMDIKKyMgZGVmaW5lIExJX0hDX0xJTktfUkVBRFkJIDB4MDAwMDAwMDEKKworI2RlZmluZSBMSV9JTlRSX1NUQVRVUwkJMHgwMTAKKyNkZWZpbmUgTElfSU5UUl9NQVNLCQkweDAxNAorIyBkZWZpbmUgTElfSU5UUl9MSU5LX0VSUgkgMHgwMDAwODAwMAorIyBkZWZpbmUgTElfSU5UUl9DT01NMl9UUklHCSAweDAwMDAwMDA4CisjIGRlZmluZSBMSV9JTlRSX0NPTU0yX1VOREVSRkxPVyAweDAwMDAwMDA0CisjIGRlZmluZSBMSV9JTlRSX0NPTU0xX1RSSUcJIDB4MDAwMDAwMDIKKyMgZGVmaW5lIExJX0lOVFJfQ09NTTFfT1ZFUkZMT1cgIDB4MDAwMDAwMDEKKworI2RlZmluZSBMSV9DT0RFQ19DT01NQU5ECTB4MDE4CisjIGRlZmluZSBMSV9DQ19CVVNZCQkgMHgwMDAwODAwMAorIyBkZWZpbmUgTElfQ0NfRElSCQkgMHgwMDAwMDA4MAorIyAgZGVmaW5lIExJX0NDX0RJUl9SRAkJICBMSV9DQ19ESVIKKyMgIGRlZmluZSBMSV9DQ19ESVJfV1IJCSghTElfQ0NfRElSKQorIyBkZWZpbmUgTElfQ0NfQUREUl9NQVNLCSAweDAwMDAwMDdGCisKKyNkZWZpbmUgTElfQ09ERUNfREFUQQkJMHgwMUMKKworI2RlZmluZSBMSV9DT01NMV9CQVNFCQkweDEwMAorI2RlZmluZSBMSV9DT01NMV9DVEwJCTB4MTA0CisjIGRlZmluZSBMSV9DQ1RMX1JFU0VUCQkgMHg4MDAwMDAwMAorIyBkZWZpbmUgTElfQ0NUTF9TSVpFCQkgMHg3MDAwMDAwMAorIyBkZWZpbmUgTElfQ0NUTF9ETUFfRU5BQkxFCSAweDA4MDAwMDAwCisjIGRlZmluZSBMSV9DQ1RMX1RNQVNLCQkgMHgwNzAwMDAwMCAvKiB0cmlnZ2VyIG1hc2sgKi8KKyMgZGVmaW5lIExJX0NDVExfVFBUUgkJIDB4MDBGRjAwMDAgLyogdHJpZ2dlciBwb2ludGVyICovCisjIGRlZmluZSBMSV9DQ1RMX1JQVFIJCSAweDAwMDBGRjAwCisjIGRlZmluZSBMSV9DQ1RMX1dQVFIJCSAweDAwMDAwMEZGCisjZGVmaW5lIExJX0NPTU0xX0NGRwkJMHgxMDgKKyMgZGVmaW5lIExJX0NDRkdfTE9DSwkJIDB4MDAwMDgwMDAKKyMgZGVmaW5lIExJX0NDRkdfU0xPVAkJIDB4MDAwMDAwNzAKKyMgZGVmaW5lIExJX0NDRkdfRElSRUNUSU9OCSAweDAwMDAwMDA4CisjICBkZWZpbmUgTElfQ0NGR19ESVJfSU4JKCFMSV9DQ0ZHX0RJUkVDVElPTikKKyMgIGRlZmluZSBMSV9DQ0ZHX0RJUl9PVVQJICBMSV9DQ0ZHX0RJUkVDVElPTgorIyBkZWZpbmUgTElfQ0NGR19NT0RFCQkgMHgwMDAwMDAwNAorIyAgZGVmaW5lIExJX0NDRkdfTU9ERV9NT05PCSghTElfQ0NGR19NT0RFKQorIyAgZGVmaW5lIExJX0NDRkdfTU9ERV9TVEVSRU8JICBMSV9DQ0ZHX01PREUKKyMgZGVmaW5lIExJX0NDRkdfRk9STUFUCQkgMHgwMDAwMDAwMworIyAgZGVmaW5lIExJX0NDRkdfRk1UXzhCSVQJICAweDAwMDAwMDAwCisjICBkZWZpbmUgTElfQ0NGR19GTVRfMTZCSVQJICAweDAwMDAwMDAxCisjZGVmaW5lIExJX0NPTU0yX0JBU0UJCTB4MTBDCisjZGVmaW5lIExJX0NPTU0yX0NUTAkJMHgxMTAKKyAvKiBiaXQgZGVmaW5pdGlvbnMgYXJlIHRoZSBzYW1lIGFzIExJX0NPTU0xX0NUTCAqLworI2RlZmluZSBMSV9DT01NMl9DRkcJCTB4MTE0CisgLyogYml0IGRlZmluaXRpb25zIGFyZSB0aGUgc2FtZSBhcyBMSV9DT01NMV9DRkcgKi8KKworI2RlZmluZSBMSV9VU1RfTE9XCQkweDIwMAkvKiA2NC1iaXQgVW5hZGp1c3RlZCBTeXN0ZW0gVGltZSBpcyAqLworI2RlZmluZSBMSV9VU1RfSElHSAkJMHgyMDQJLyogbWljcm9zZWNvbmRzIHNpbmNlIGJvb3QgKi8KKworI2RlZmluZSBMSV9BVURJTzFfVVNUCQkweDMwMAkvKiBVU1QtTVNDIHBhaXJzICovCisjZGVmaW5lIExJX0FVRElPMV9NU0MJCTB4MzA0CS8qIE1TQyAoTWVkaWEgU3RyZWFtIENvdW50ZXIpICovCisjZGVmaW5lIExJX0FVRElPMl9VU1QJCTB4MzA4CS8qIGNvdW50cyBzYW1wbGVzIGFjdHVhbGx5ICovCisjZGVmaW5lIExJX0FVRElPMl9NU0MJCTB4MzBDCS8qIHByb2Nlc3NlZCBhcyBvZiB0aW1lIFVTVCAqLworCisvKiAKKyAqIExpdGhpdW0ncyBETUEgZW5naW5lIG9wZXJhdGVzIG9uIGNodW5rcyBvZiAzMiBieXRlcy4gIFdlIGNhbGwgdGhhdAorICogYSBETUFDSFVOSy4KKyAqLworCisjZGVmaW5lIERNQUNIVU5LX1NISUZUIDUKKyNkZWZpbmUgRE1BQ0hVTktfU0laRSAoMSA8PCBETUFDSFVOS19TSElGVCkKKyNkZWZpbmUgQllURVNfVE9fQ0hVTktTKGJ5dGVzKSAoKGJ5dGVzKSA+PiBETUFDSFVOS19TSElGVCkKKyNkZWZpbmUgQ0hVTktTX1RPX0JZVEVTKGNodW5rcykgKChjaHVua3MpIDw8IERNQUNIVU5LX1NISUZUKQorCisvKgorICogVHdvIGNvbnZlbmllbnQgbWFjcm9zIHRvIHNoaWZ0IGJpdGZpZWxkcyBpbnRvL291dCBvZiBwb3NpdGlvbi4KKyAqCisgKiBPYnNlcnZlIHRoYXQgKG1hc2sgJiAtbWFzaykgaXMgKDEgPDwgbG93X3NldF9iaXRfb2YobWFzaykpLgorICogQXMgbG9uZyBhcyBtYXNrIGlzIGNvbnN0YW50LCB3ZSB0cnVzdCB0aGUgY29tcGlsZXIgd2lsbCBjaGFuZ2UgdGhlCisgKiBtdWx0aXB5IGFuZCBkaXZpZGUgaW50byBzaGlmdHMuCisgKi8KKworI2RlZmluZSBTSElGVF9GSUVMRCh2YWwsIG1hc2spICgoKHZhbCkgKiAoKG1hc2spICYgLShtYXNrKSkpICYgKG1hc2spKQorI2RlZmluZSBVTlNISUZUX0ZJRUxEKHZhbCwgbWFzaykgKCgodmFsKSAmIChtYXNrKSkgLyAoKG1hc2spICYgLShtYXNrKSkpCisKKy8qCisgKiBkbWFfY2hhbl9kZXNjIGlzIGludmFyaWFudCBpbmZvcm1hdGlvbiBhYm91dCBhIExpdGhpdW0KKyAqIERNQSBjaGFubmVsLiAgVGhlcmUgYXJlIHR3byBpbnN0YW5jZXMsIGxpX2NvbW0xIGFuZCBsaV9jb21tMi4KKyAqCisgKiBOb3RlIHRoYXQgdGhlIENDVEwgcmVnaXN0ZXIgZmllbGRzIGFyZSB3cml0ZSBwdHIgYW5kIHJlYWQgcHRyLCBidXQgd2hhdAorICogd2UgY2FyZSBhYm91dCBhcmUgd2hpY2ggcG9pbnRlciBpcyB1cGRhdGVkIGJ5IHNvZnR3YXJlIGFuZCB3aGljaCBieQorICogaGFyZHdhcmUuCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgZG1hX2NoYW5fZGVzYyB7CisJaW50IGJhc2VyZWc7CisJaW50IGNmZ3JlZzsKKwlpbnQgY3RscmVnOworCWludCBod3B0cnJlZzsKKwlpbnQgc3dwdHJyZWc7CisJaW50IHVzdHJlZzsKKwlpbnQgbXNjcmVnOworCXVuc2lnbmVkIGxvbmcgc3dwdHJtYXNrOworCWludCBhZDE4NDNfc2xvdDsKKwlpbnQgZGlyZWN0aW9uOwkJCS8qIExJX0NDVExfRElSX0lOL09VVCAqLworfSBkbWFfY2hhbl9kZXNjX3Q7CisKK3N0YXRpYyBjb25zdCBkbWFfY2hhbl9kZXNjX3QgbGlfY29tbTEgPSB7CisJTElfQ09NTTFfQkFTRSwJCQkvKiBiYXNlIHJlZ2lzdGVyIG9mZnNldCAqLworCUxJX0NPTU0xX0NGRywJCQkvKiBjb25maWcgcmVnaXN0ZXIgb2Zmc2V0ICovCisJTElfQ09NTTFfQ1RMLAkJCS8qIGNvbnRyb2wgcmVnaXN0ZXIgb2Zmc2V0ICovCisJTElfQ09NTTFfQ1RMICsgMCwJCS8qIGh3IHB0ciByZWcgb2Zmc2V0ICh3cml0ZSBwdHIpICovCisJTElfQ09NTTFfQ1RMICsgMSwJCS8qIHN3IHB0ciByZWcgb2Zmc2V0IChyZWFkIHB0cikgKi8KKwlMSV9BVURJTzFfVVNULAkJCS8qIHVzdCByZWcgb2Zmc2V0ICovCisJTElfQVVESU8xX01TQywJCQkvKiBtc2MgcmVnIG9mZnNldCAqLworCUxJX0NDVExfUlBUUiwJCQkvKiBzdyBwdHIgYml0bWFzayBpbiBjdGx2YWwgKi8KKwkyLAkJCQkvKiBhZDE4NDMgc2VyaWFsIHNsb3QgKi8KKwlMSV9DQ0ZHX0RJUl9JTgkJCS8qIGRpcmVjdGlvbiAqLworfTsKKworc3RhdGljIGNvbnN0IGRtYV9jaGFuX2Rlc2NfdCBsaV9jb21tMiA9IHsKKwlMSV9DT01NMl9CQVNFLAkJCS8qIGJhc2UgcmVnaXN0ZXIgb2Zmc2V0ICovCisJTElfQ09NTTJfQ0ZHLAkJCS8qIGNvbmZpZyByZWdpc3RlciBvZmZzZXQgKi8KKwlMSV9DT01NMl9DVEwsCQkJLyogY29udHJvbCByZWdpc3RlciBvZmZzZXQgKi8KKwlMSV9DT01NMl9DVEwgKyAxLAkJLyogaHcgcHRyIHJlZyBvZmZzZXQgKHJlYWQgcHRyKSAqLworCUxJX0NPTU0yX0NUTCArIDAsCQkvKiBzdyBwdHIgcmVnIG9mZnNldCAod3JpdHIgcHRyKSAqLworCUxJX0FVRElPMl9VU1QsCQkJLyogdXN0IHJlZyBvZmZzZXQgKi8KKwlMSV9BVURJTzJfTVNDLAkJCS8qIG1zYyByZWcgb2Zmc2V0ICovCisJTElfQ0NUTF9XUFRSLAkJCS8qIHN3IHB0ciBiaXRtYXNrIGluIGN0bHZhbCAqLworCTIsCQkJCS8qIGFkMTg0MyBzZXJpYWwgc2xvdCAqLworCUxJX0NDRkdfRElSX09VVAkJCS8qIGRpcmVjdGlvbiAqLworfTsKKworLyoKKyAqIGRtYV9jaGFuIGlzIHZhcmlhYmxlIGluZm9ybWF0aW9uIGFib3V0IGEgTGl0aGl1bSBETUEgY2hhbm5lbC4KKyAqCisgKiBUaGUgZGVzYyBmaWVsZCBwb2ludHMgdG8gaW52YXJpYW50IGluZm9ybWF0aW9uLgorICogVGhlIGxpdGggZmllbGQgcG9pbnRzIHRvIGEgbGl0aGl1bV90IHdoaWNoIGlzIHBhc3NlZAorICogdG8gbGlfcmVhZCogYW5kIGxpX3dyaXRlKiB0byBhY2Nlc3MgdGhlIHJlZ2lzdGVycy4KKyAqIFRoZSAqdmFsIGZpZWxkcyBzaGFkb3cgdGhlIGxpdGhpdW0gcmVnaXN0ZXJzJyBjb250ZW50cy4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBkbWFfY2hhbiB7CisJY29uc3QgZG1hX2NoYW5fZGVzY190ICpkZXNjOworCWxpdGhpdW1fdCAgICAgICpsaXRoOworCXVuc2lnbmVkIGxvbmcgICBiYXNldmFsOworCXVuc2lnbmVkIGxvbmcJY2ZndmFsOworCXVuc2lnbmVkIGxvbmcJY3RsdmFsOworfSBkbWFfY2hhbl90OworCisvKgorICogdXN0bXNjIGlzIGEgVVNUL01TQyBwYWlyIChVbmFkanVzdGVkIFN5c3RlbSBUaW1lL01lZGlhIFN0cmVhbSBDb3VudGVyKS4KKyAqIFVTVCBpcyB0aW1lIGluIG1pY3Jvc2Vjb25kcyBzaW5jZSB0aGUgc3lzdGVtIGJvb3RlZCwgYW5kIE1TQyBpcyBhCisgKiBjb3VudGVyIHRoYXQgaW5jcmVtZW50cyB3aXRoIGV2ZXJ5IGF1ZGlvIHNhbXBsZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB1c3Rtc2MgeworCXVuc2lnbmVkIGxvbmcgbG9uZyB1c3Q7CisJdW5zaWduZWQgbG9uZyBtc2M7Cit9IHVzdG1zY190OworCisvKgorICogbGlfYWQxODQzX3dhaXQgd2FpdHMgdW50aWwgbGl0aGl1bSBzYXlzIHRoZSBBRDE4NDMgcmVnaXN0ZXIKKyAqIGV4Y2hhbmdlIGlzIG5vdCBidXN5LiAgUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1FQlVTWSBvbiB0aW1lb3V0LgorICoKKyAqIExvY2tpbmc6IG11c3QgYmUgY2FsbGVkIHdpdGggbGl0aGl1bV9sb2NrIGhlbGQuCisgKi8KKworc3RhdGljIGludCBsaV9hZDE4NDNfd2FpdChsaXRoaXVtX3QgKmxpdGgpCit7CisJdW5zaWduZWQgbG9uZyBsYXRlciA9IGppZmZpZXMgKyAyOworCXdoaWxlIChsaV9yZWFkbChsaXRoLCBMSV9DT0RFQ19DT01NQU5EKSAmIExJX0NDX0JVU1kpCisJCWlmICh0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGxhdGVyKSkKKwkJCXJldHVybiAtRUJVU1k7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBsaV9yZWFkX2FkMTg0M19yZWcgcmV0dXJucyB0aGUgY3VycmVudCBjb250ZW50cyBvZiBhIDE2IGJpdCBBRDE4NDMgcmVnaXN0ZXIuCisgKgorICogUmV0dXJucyB1bnNpZ25lZCByZWdpc3RlciB2YWx1ZSBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IGxpX3JlYWRfYWQxODQzX3JlZyhsaXRoaXVtX3QgKmxpdGgsIGludCByZWcpCit7CisJaW50IHZhbDsKKworCUFTU0VSVCghaW5faW50ZXJydXB0KCkpOworCXNwaW5fbG9jaygmbGl0aC0+bG9jayk7CisJeworCQl2YWwgPSBsaV9hZDE4NDNfd2FpdChsaXRoKTsKKwkJaWYgKHZhbCA9PSAwKSB7CisJCQlsaV93cml0ZWwobGl0aCwgTElfQ09ERUNfQ09NTUFORCwgTElfQ0NfRElSX1JEIHwgcmVnKTsKKwkJCXZhbCA9IGxpX2FkMTg0M193YWl0KGxpdGgpOworCQl9CisJCWlmICh2YWwgPT0gMCkKKwkJCXZhbCA9IGxpX3JlYWRsKGxpdGgsIExJX0NPREVDX0RBVEEpOworCX0KKwlzcGluX3VubG9jaygmbGl0aC0+bG9jayk7CisKKwlEQkdYVigibGlfcmVhZF9hZDE4NDNfcmVnKGxpdGg9MHglcCwgcmVnPSVkKSByZXR1cm5zIDB4JTA0eFxuIiwKKwkgICAgICBsaXRoLCByZWcsIHZhbCk7CisKKwlyZXR1cm4gdmFsOworfQorCisvKgorICogbGlfd3JpdGVfYWQxODQzX3JlZyB3cml0ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSB0byBhIDE2IGJpdCBBRDE4NDMgcmVnaXN0ZXIuCisgKi8KKworc3RhdGljIHZvaWQgbGlfd3JpdGVfYWQxODQzX3JlZyhsaXRoaXVtX3QgKmxpdGgsIGludCByZWcsIGludCBuZXd2YWwpCit7CisJc3Bpbl9sb2NrKCZsaXRoLT5sb2NrKTsKKwl7CisJCWlmIChsaV9hZDE4NDNfd2FpdChsaXRoKSA9PSAwKSB7CisJCQlsaV93cml0ZWwobGl0aCwgTElfQ09ERUNfREFUQSwgbmV3dmFsKTsKKwkJCWxpX3dyaXRlbChsaXRoLCBMSV9DT0RFQ19DT01NQU5ELCBMSV9DQ19ESVJfV1IgfCByZWcpOworCQl9CisJfQorCXNwaW5fdW5sb2NrKCZsaXRoLT5sb2NrKTsKK30KKworLyoKKyAqIGxpX3NldHVwX2RtYSBjYWxjdWxhdGVzIGFsbCB0aGUgcmVnaXN0ZXIgc2V0dGluZ3MgZm9yIERNQSBpbiBhIHBhcnRpY3VsYXIKKyAqIG1vZGUuICBJdCB0YWtlcyB0b28gbWFueSBhcmd1bWVudHMuCisgKi8KKworc3RhdGljIHZvaWQgbGlfc2V0dXBfZG1hKGRtYV9jaGFuX3QgKmNoYW4sCisJCQkgY29uc3QgZG1hX2NoYW5fZGVzY190ICpkZXNjLAorCQkJIGxpdGhpdW1fdCAqbGl0aCwKKwkJCSB1bnNpZ25lZCBsb25nIGJ1ZmZlcl9wYWRkciwKKwkJCSBpbnQgYnVmc2hpZnQsCisJCQkgaW50IGZyYWdzaGlmdCwKKwkJCSBpbnQgY2hhbm5lbHMsCisJCQkgaW50IHNhbXBzaXplKQoreworCXVuc2lnbmVkIGxvbmcgbW9kZSwgZm9ybWF0OworCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdG1hc2s7CisKKwlEQkdFVigiKGNoYW49MHglcCwgZGVzYz0weCVwLCBsaXRoPTB4JXAsIGJ1ZmZlcl9wYWRkcj0weCVseCwgIgorCSAgICAgImJ1ZnNoaWZ0PSVkLCBmcmFnc2hpZnQ9JWQsIGNoYW5uZWxzPSVkLCBzYW1wc2l6ZT0lZClcbiIsCisJICAgICBjaGFuLCBkZXNjLCBsaXRoLCBidWZmZXJfcGFkZHIsCisJICAgICBidWZzaGlmdCwgZnJhZ3NoaWZ0LCBjaGFubmVscywgc2FtcHNpemUpOworCisJLyogUmVzZXQgdGhlIGNoYW5uZWwgZmlyc3QuICovCisKKwlsaV93cml0ZWwobGl0aCwgZGVzYy0+Y3RscmVnLCBMSV9DQ1RMX1JFU0VUKTsKKworCUFTU0VSVChjaGFubmVscyA9PSAxIHx8IGNoYW5uZWxzID09IDIpOworCWlmIChjaGFubmVscyA9PSAyKQorCQltb2RlID0gTElfQ0NGR19NT0RFX1NURVJFTzsKKwllbHNlCisJCW1vZGUgPSBMSV9DQ0ZHX01PREVfTU9OTzsKKwlBU1NFUlQoc2FtcHNpemUgPT0gMSB8fCBzYW1wc2l6ZSA9PSAyKTsKKwlpZiAoc2FtcHNpemUgPT0gMikKKwkJZm9ybWF0ID0gTElfQ0NGR19GTVRfMTZCSVQ7CisJZWxzZQorCQlmb3JtYXQgPSBMSV9DQ0ZHX0ZNVF84QklUOworCWNoYW4tPmRlc2MgPSBkZXNjOworCWNoYW4tPmxpdGggPSBsaXRoOworCisJLyoKKwkgKiBMaXRoaXVtIERNQSBhZGRyZXNzIHJlZ2lzdGVyIHRha2VzIGEgNDAtYml0IHBoeXNpY2FsCisJICogYWRkcmVzcywgcmlnaHQtc2hpZnRlZCBieSA4IHNvIGl0IGZpdHMgaW4gMzIgYml0cy4gIEJpdCAzNworCSAqIG11c3QgYmUgc2V0IC0tIGl0IGVuYWJsZXMgY2FjaGUgY29oZXJlbmNlLgorCSAqLworCisJQVNTRVJUKCEoYnVmZmVyX3BhZGRyICYgMHhGRikpOworCWNoYW4tPmJhc2V2YWwgPSAoYnVmZmVyX3BhZGRyID4+IDgpIHwgMSA8PCAoMzcgLSA4KTsKKworCWNoYW4tPmNmZ3ZhbCA9ICghTElfQ0NGR19MT0NLIHwKKwkJCVNISUZUX0ZJRUxEKGRlc2MtPmFkMTg0M19zbG90LCBMSV9DQ0ZHX1NMT1QpIHwKKwkJCWRlc2MtPmRpcmVjdGlvbiB8CisJCQltb2RlIHwKKwkJCWZvcm1hdCk7CisKKwlzaXplID0gYnVmc2hpZnQgLSA2OworCXRtYXNrID0gMTMgLSBmcmFnc2hpZnQ7CQkvKiBTZWUgTGl0aGl1bSBETUEgTm90ZXMgYWJvdmUuICovCisJQVNTRVJUKHNpemUgPj0gMiAmJiBzaXplIDw9IDcpOworCUFTU0VSVCh0bWFzayA+PSAxICYmIHRtYXNrIDw9IDcpOworCWNoYW4tPmN0bHZhbCA9ICghTElfQ0NUTF9SRVNFVCB8CisJCQlTSElGVF9GSUVMRChzaXplLCBMSV9DQ1RMX1NJWkUpIHwKKwkJCSFMSV9DQ1RMX0RNQV9FTkFCTEUgfAorCQkJU0hJRlRfRklFTEQodG1hc2ssIExJX0NDVExfVE1BU0spIHwKKwkJCVNISUZUX0ZJRUxEKDAsIExJX0NDVExfVFBUUikpOworCisJREJHUFYoImJhc2VyZWcgMHgleCA9IDB4JWx4XG4iLCBkZXNjLT5iYXNlcmVnLCBjaGFuLT5iYXNldmFsKTsKKwlEQkdQVigiY2ZncmVnIDB4JXggPSAweCVseFxuIiwgZGVzYy0+Y2ZncmVnLCBjaGFuLT5jZmd2YWwpOworCURCR1BWKCJjdGxyZWcgMHgleCA9IDB4JWx4XG4iLCBkZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7CisKKwlsaV93cml0ZWwobGl0aCwgZGVzYy0+YmFzZXJlZywgY2hhbi0+YmFzZXZhbCk7CisJbGlfd3JpdGVsKGxpdGgsIGRlc2MtPmNmZ3JlZywgY2hhbi0+Y2ZndmFsKTsKKwlsaV93cml0ZWwobGl0aCwgZGVzYy0+Y3RscmVnLCBjaGFuLT5jdGx2YWwpOworCisJREJHUlYoKTsKK30KKworc3RhdGljIHZvaWQgbGlfc2h1dGRvd25fZG1hKGRtYV9jaGFuX3QgKmNoYW4pCit7CisJbGl0aGl1bV90ICpsaXRoID0gY2hhbi0+bGl0aDsKKwl2b2lkICogbGl0aDEgPSBsaXRoLT5wYWdlMTsKKworCURCR0VWKCIoY2hhbj0weCVwKVxuIiwgY2hhbik7CisJCisJY2hhbi0+Y3RsdmFsICY9IH5MSV9DQ1RMX0RNQV9FTkFCTEU7CisJREJHUFYoImN0bHJlZyAweCV4ID0gMHglbHhcbiIsIGNoYW4tPmRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKKwlsaV93cml0ZWwobGl0aCwgY2hhbi0+ZGVzYy0+Y3RscmVnLCBjaGFuLT5jdGx2YWwpOworCisJLyoKKwkgKiBPZmZzZXQgMHg1MDAgb24gTGl0aGl1bSBwYWdlIDEgaXMgYW4gdW5kb2N1bWVudGVkLAorCSAqIHVuc3VwcG9ydGVkIHJlZ2lzdGVyIHRoYXQgaG9sZHMgdGhlIHplcm8gc2FtcGxlIHZhbHVlLgorCSAqIExpdGhpdW0gaXMgc3VwcG9zZWQgdG8gb3V0cHV0IHplcm8gc2FtcGxlcyB3aGVuIERNQSBpcworCSAqIGluYWN0aXZlLCBhbmQgcmVwZWF0IHRoZSBsYXN0IHNhbXBsZSB3aGVuIERNQSB1bmRlcmZsb3dzLgorCSAqIEJ1dCBpdCBoYXMgYSBidWcsIHdoZXJlLCBhZnRlciB1bmRlcmZsb3cgb2NjdXJzLCB0aGUgemVybworCSAqIHNhbXBsZSBpcyBub3QgcmVzZXQuCisJICoKKwkgKiBJIGV4cGVjdCB0aGlzIHRvIGJyZWFrIGluIGEgZnV0dXJlIHJldiBvZiBMaXRoaXVtLgorCSAqLworCisJaWYgKGxpdGgxICYmIGNoYW4tPmRlc2MtPmRpcmVjdGlvbiA9PSBMSV9DQ0ZHX0RJUl9PVVQpCisJCSogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgxICsgMHg1MDApID0gMDsKK30KKworLyoKKyAqIGxpX2FjdGl2YXRlX2RtYSBhbHdheXMgc3RhcnRzIGRtYSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuCisgKgorICogTi5CLiwgdGhlc2UgbWF5IGJlIGNhbGxlZCBmcm9tIGludGVycnVwdC4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkIGxpX2FjdGl2YXRlX2RtYShkbWFfY2hhbl90ICpjaGFuKQoreworCWNoYW4tPmN0bHZhbCB8PSBMSV9DQ1RMX0RNQV9FTkFCTEU7CisJREJHUFYoImN0bHZhbCA9IDB4JWx4XG4iLCBjaGFuLT5jdGx2YWwpOworCWxpX3dyaXRlbChjaGFuLT5saXRoLCBjaGFuLT5kZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7Cit9CisKK3N0YXRpYyB2b2lkIGxpX2RlYWN0aXZhdGVfZG1hKGRtYV9jaGFuX3QgKmNoYW4pCit7CisJbGl0aGl1bV90ICpsaXRoID0gY2hhbi0+bGl0aDsKKwl2b2lkICogbGl0aDIgPSBsaXRoLT5wYWdlMjsKKworCWNoYW4tPmN0bHZhbCAmPSB+KExJX0NDVExfRE1BX0VOQUJMRSB8IExJX0NDVExfUlBUUiB8IExJX0NDVExfV1BUUik7CisJREJHUFYoImN0bHZhbCA9IDB4JWx4XG4iLCBjaGFuLT5jdGx2YWwpOworCURCR1BWKCJjdGxyZWcgMHgleCA9IDB4JWx4XG4iLCBjaGFuLT5kZXNjLT5jdGxyZWcsIGNoYW4tPmN0bHZhbCk7CisJbGlfd3JpdGVsKGxpdGgsIGNoYW4tPmRlc2MtPmN0bHJlZywgY2hhbi0+Y3RsdmFsKTsKKworCS8qCisJICogT2Zmc2V0cyAweDk4IGFuZCAweDlDIG9uIExpdGhpdW0gcGFnZSAyIGFyZSB1bmRvY3VtZW50ZWQsCisJICogdW5zdXBwb3J0ZWQgcmVnaXN0ZXJzIHRoYXQgYXJlIGludGVybmFsIGNvcGllcyBvZiB0aGUgRE1BCisJICogcmVhZCBhbmQgd3JpdGUgcG9pbnRlcnMuICBCZWNhdXNlIG9mIGEgTGl0aGl1bSBidWcsIHRoZXNlCisJICogcmVnaXN0ZXJzIGFyZW4ndCB6ZXJvZWQgY29ycmVjdGx5IHdoZW4gRE1BIGlzIHNodXQgb2ZmLiAgU28KKwkgKiB3ZSB3aGFjayB0aGVtIGRpcmVjdGx5LgorCSAqCisJICogSSBleHBlY3QgdGhpcyB0byBicmVhayBpbiBhIGZ1dHVyZSByZXYgb2YgTGl0aGl1bS4KKwkgKi8KKworCWlmIChsaXRoMiAmJiBjaGFuLT5kZXNjLT5kaXJlY3Rpb24gPT0gTElfQ0NGR19ESVJfT1VUKSB7CisJCSogKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKikgKGxpdGgyICsgMHg5OCkgPSAwOworCQkqICh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopIChsaXRoMiArIDB4OUMpID0gMDsKKwl9Cit9CisKKy8qCisgKiByZWFkL3dyaXRlIHRoZSByaW5nIGJ1ZmZlciBwb2ludGVycy4gIFRoZXNlIHJvdXRpbmVzJyBhcmd1bWVudHMgYW5kIHJlc3VsdHMKKyAqIGFyZSBieXRlIG9mZnNldHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSByaW5nIGJ1ZmZlci4KKyAqLworCitzdGF0aWMgX19pbmxpbmVfXyBpbnQgbGlfcmVhZF9zd3B0cihkbWFfY2hhbl90ICpjaGFuKQoreworCWNvbnN0IHVuc2lnbmVkIGxvbmcgbWFzayA9IGNoYW4tPmRlc2MtPnN3cHRybWFzazsKKworCXJldHVybiBDSFVOS1NfVE9fQllURVMoVU5TSElGVF9GSUVMRChjaGFuLT5jdGx2YWwsIG1hc2spKTsKK30KKworc3RhdGljIF9faW5saW5lX18gaW50IGxpX3JlYWRfaHdwdHIoZG1hX2NoYW5fdCAqY2hhbikKK3sKKwlyZXR1cm4gQ0hVTktTX1RPX0JZVEVTKGxpX3JlYWRiKGNoYW4tPmxpdGgsIGNoYW4tPmRlc2MtPmh3cHRycmVnKSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQgbGlfd3JpdGVfc3dwdHIoZG1hX2NoYW5fdCAqY2hhbiwgaW50IHZhbCkKK3sKKwljb25zdCB1bnNpZ25lZCBsb25nIG1hc2sgPSBjaGFuLT5kZXNjLT5zd3B0cm1hc2s7CisKKwlBU1NFUlQoISh2YWwgJiB+Q0hVTktTX1RPX0JZVEVTKDB4RkYpKSk7CisJdmFsID0gQllURVNfVE9fQ0hVTktTKHZhbCk7CisJY2hhbi0+Y3RsdmFsID0gKGNoYW4tPmN0bHZhbCAmIH5tYXNrKSB8IFNISUZUX0ZJRUxEKHZhbCwgbWFzayk7CisJbGlfd3JpdGViKGNoYW4tPmxpdGgsIGNoYW4tPmRlc2MtPnN3cHRycmVnLCB2YWwpOworfQorCisvKiBsaV9yZWFkX1VTVE1TQygpIHJldHVybnMgYSBVU1QvTVNDIHBhaXIgZm9yIHRoZSBnaXZlbiBjaGFubmVsLiAqLworCitzdGF0aWMgdm9pZCBsaV9yZWFkX1VTVE1TQyhkbWFfY2hhbl90ICpjaGFuLCB1c3Rtc2NfdCAqdXN0bXNjKQoreworCWxpdGhpdW1fdCAqbGl0aCA9IGNoYW4tPmxpdGg7CisJY29uc3QgZG1hX2NoYW5fZGVzY190ICpkZXNjID0gY2hhbi0+ZGVzYzsKKwl1bnNpZ25lZCBsb25nIG5vd19sb3csIG5vd19oaWdoMCwgbm93X2hpZ2gxLCBjaGFuX3VzdDsKKworCXNwaW5fbG9jaygmbGl0aC0+bG9jayk7CisJeworCQkvKgorCQkgKiByZXRyeSB1bnRpbCB3ZSBkbyBhbGwgZml2ZSByZWFkcyB3aXRob3V0IHRoZQorCQkgKiBoaWdoIHdvcmQgY2hhbmdpbmcuICAoSGlnaCB3b3JkIGluY3JlbWVudHMKKwkJICogZXZlcnkgMl4zMiBtaWNyb3NlY29uZHMsIGkuZS4sIG5vdCBvZnRlbikKKwkJICovCisJCWRvIHsKKwkJCW5vd19oaWdoMCA9IGxpX3JlYWRsKGxpdGgsIExJX1VTVF9ISUdIKTsKKwkJCW5vd19sb3cgPSBsaV9yZWFkbChsaXRoLCBMSV9VU1RfTE9XKTsKKworCQkJLyoKKwkJCSAqIExpdGhpdW0gZ3VhcmFudGVlcyB0aGVzZSB0d28gcmVhZHMgd2lsbCBiZQorCQkJICogYXRvbWljIC0tIHVzdCB3aWxsIG5vdCBpbmNyZW1lbnQgYWZ0ZXIgbXNjCisJCQkgKiBpcyByZWFkLgorCQkJICovCisKKwkJCXVzdG1zYy0+bXNjID0gbGlfcmVhZGwobGl0aCwgZGVzYy0+bXNjcmVnKTsKKwkJCWNoYW5fdXN0ID0gbGlfcmVhZGwobGl0aCwgZGVzYy0+dXN0cmVnKTsKKworCQkJbm93X2hpZ2gxID0gbGlfcmVhZGwobGl0aCwgTElfVVNUX0hJR0gpOworCQl9IHdoaWxlIChub3dfaGlnaDAgIT0gbm93X2hpZ2gxKTsKKwl9CQorCXNwaW5fdW5sb2NrKCZsaXRoLT5sb2NrKTsKKwl1c3Rtc2MtPnVzdCA9ICgodW5zaWduZWQgbG9uZyBsb25nKSBub3dfaGlnaDAgPDwgMzIgfCBjaGFuX3VzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGxpX2VuYWJsZV9pbnRlcnJ1cHRzKGxpdGhpdW1fdCAqbGl0aCwgdW5zaWduZWQgaW50IG1hc2spCit7CisJREJHRVYoIihsaXRoPTB4JXAsIG1hc2s9MHgleClcbiIsIGxpdGgsIG1hc2spOworCisJLyogY2xlYXIgYW55IGFscmVhZHktcGVuZGluZyBpbnRlcnJ1cHRzLiAqLworCisJbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfU1RBVFVTLCBtYXNrKTsKKworCS8qIGVuYWJsZSB0aGUgaW50ZXJydXB0cy4gKi8KKworCW1hc2sgfD0gbGlfcmVhZGwobGl0aCwgTElfSU5UUl9NQVNLKTsKKwlsaV93cml0ZWwobGl0aCwgTElfSU5UUl9NQVNLLCBtYXNrKTsKK30KKworc3RhdGljIHZvaWQgbGlfZGlzYWJsZV9pbnRlcnJ1cHRzKGxpdGhpdW1fdCAqbGl0aCwgdW5zaWduZWQgaW50IG1hc2spCit7CisJdW5zaWduZWQgaW50IGtlZXBtYXNrOworCisJREJHRVYoIihsaXRoPTB4JXAsIG1hc2s9MHgleClcbiIsIGxpdGgsIG1hc2spOworCisJLyogZGlzYWJsZSB0aGUgaW50ZXJydXB0cyAqLworCisJa2VlcG1hc2sgPSBsaV9yZWFkbChsaXRoLCBMSV9JTlRSX01BU0spICYgfm1hc2s7CisJbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfTUFTSywga2VlcG1hc2spOworCisJLyogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKworCWxpX3dyaXRlbChsaXRoLCBMSV9JTlRSX1NUQVRVUywgbWFzayk7Cit9CisKKy8qIEdldCB0aGUgaW50ZXJydXB0IHN0YXR1cyBhbmQgY2xlYXIgYWxsIHBlbmRpbmcgaW50ZXJydXB0cy4gKi8KKworc3RhdGljIHVuc2lnbmVkIGludCBsaV9nZXRfY2xlYXJfaW50cl9zdGF0dXMobGl0aGl1bV90ICpsaXRoKQoreworCXVuc2lnbmVkIGludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBsaV9yZWFkbChsaXRoLCBMSV9JTlRSX1NUQVRVUyk7CisJbGlfd3JpdGVsKGxpdGgsIExJX0lOVFJfU1RBVFVTLCB+MCk7CisJcmV0dXJuIHN0YXR1cyAmIGxpX3JlYWRsKGxpdGgsIExJX0lOVFJfTUFTSyk7Cit9CisKK3N0YXRpYyBpbnQgbGlfaW5pdChsaXRoaXVtX3QgKmxpdGgpCit7CisJLyogMS4gU3lzdGVtIHBvd2VyIHN1cHBsaWVzIHN0YWJpbGl6ZS4gKi8KKworCS8qIDIuIEFzc2VydCB0aGUgflJFU0VUIHNpZ25hbC4gKi8KKworCWxpX3dyaXRlbChsaXRoLCBMSV9IT1NUX0NPTlRST0xMRVIsIExJX0hDX1JFU0VUKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiAzLiBEZWFzc2VydCB0aGUgflJFU0VUIHNpZ25hbCBhbmQgZW50ZXIgYSB3YWl0IHBlcmlvZCB0byBhbGxvdworCSAgIHRoZSBBRDE4NDMgaW50ZXJuYWwgY2xvY2tzIGFuZCB0aGUgZXh0ZXJuYWwgY3J5c3RhbCBvc2NpbGxhdG9yCisJICAgdG8gc3RhYmlsaXplLiAqLworCisJbGlfd3JpdGVsKGxpdGgsIExJX0hPU1RfQ09OVFJPTExFUiwgTElfSENfTElOS19FTkFCTEUpOworCXVkZWxheSgxKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBBRDE4NDMgYWNjZXNzICovCisKKy8qCisgKiBBRDE4NDMgYml0ZmllbGQgZGVmaW5pdGlvbnMuICBBbGwgYXJlIG5hbWVkIGFzIGluIHRoZSBBRDE4NDMgZGF0YQorICogc2hlZXQsIHdpdGggYWQxODQzXyBwcmVwZW5kZWQgYW5kIGluZGl2aWR1YWwgYml0IG51bWJlcnMgcmVtb3ZlZC4KKyAqCisgKiBFLmcuLCBiaXRzIExTUzAgdGhyb3VnaCBMU1MyIGJlY29tZSBhZDE4NDNfTFNTLgorICoKKyAqIE9ubHkgdGhlIGJpdGZpZWxkcyB3ZSBuZWVkIGFyZSBkZWZpbmVkLgorICovCisKK3R5cGVkZWYgc3RydWN0IGFkMTg0M19iaXRmaWVsZCB7CisJY2hhciByZWc7CisJY2hhciBsb19iaXQ7CisJY2hhciBuYml0czsKK30gYWQxODQzX2JpdGZpZWxkX3Q7CisKK3N0YXRpYyBjb25zdCBhZDE4NDNfYml0ZmllbGRfdAorCWFkMTg0M19QRE5PICAgPSB7ICAwLCAxNCwgIDEgfSwJLyogQ29udmVydGVyIFBvd2VyLURvd24gRmxhZyAqLworCWFkMTg0M19JTklUICAgPSB7ICAwLCAxNSwgIDEgfSwJLyogQ2xvY2sgSW5pdGlhbGl6YXRpb24gRmxhZyAqLworCWFkMTg0M19SSUcgICAgPSB7ICAyLCAgMCwgIDQgfSwJLyogUmlnaHQgQURDIElucHV0IEdhaW4gKi8KKwlhZDE4NDNfUk1HRSAgID0geyAgMiwgIDQsICAxIH0sCS8qIFJpZ2h0IEFEQyBNaWMgR2FpbiBFbmFibGUgKi8KKwlhZDE4NDNfUlNTICAgID0geyAgMiwgIDUsICAzIH0sCS8qIFJpZ2h0IEFEQyBTb3VyY2UgU2VsZWN0ICovCisJYWQxODQzX0xJRyAgICA9IHsgIDIsICA4LCAgNCB9LAkvKiBMZWZ0IEFEQyBJbnB1dCBHYWluICovCisJYWQxODQzX0xNR0UgICA9IHsgIDIsIDEyLCAgMSB9LAkvKiBMZWZ0IEFEQyBNaWMgR2FpbiBFbmFibGUgKi8KKwlhZDE4NDNfTFNTICAgID0geyAgMiwgMTMsICAzIH0sCS8qIExlZnQgQURDIFNvdXJjZSBTZWxlY3QgKi8KKwlhZDE4NDNfUlgxTSAgID0geyAgNCwgIDAsICA1IH0sCS8qIFJpZ2h0IEF1eCAxIE1peCBHYWluL0F0dGVuICovCisJYWQxODQzX1JYMU1NICA9IHsgIDQsICA3LCAgMSB9LAkvKiBSaWdodCBBdXggMSBNaXggTXV0ZSAqLworCWFkMTg0M19MWDFNICAgPSB7ICA0LCAgOCwgIDUgfSwJLyogTGVmdCBBdXggMSBNaXggR2Fpbi9BdHRlbiAqLworCWFkMTg0M19MWDFNTSAgPSB7ICA0LCAxNSwgIDEgfSwJLyogTGVmdCBBdXggMSBNaXggTXV0ZSAqLworCWFkMTg0M19SWDJNICAgPSB7ICA1LCAgMCwgIDUgfSwJLyogUmlnaHQgQXV4IDIgTWl4IEdhaW4vQXR0ZW4gKi8KKwlhZDE4NDNfUlgyTU0gID0geyAgNSwgIDcsICAxIH0sCS8qIFJpZ2h0IEF1eCAyIE1peCBNdXRlICovCisJYWQxODQzX0xYMk0gICA9IHsgIDUsICA4LCAgNSB9LAkvKiBMZWZ0IEF1eCAyIE1peCBHYWluL0F0dGVuICovCisJYWQxODQzX0xYMk1NICA9IHsgIDUsIDE1LCAgMSB9LAkvKiBMZWZ0IEF1eCAyIE1peCBNdXRlICovCisJYWQxODQzX1JNQ00gICA9IHsgIDcsICAwLCAgNSB9LAkvKiBSaWdodCBNaWMgTWl4IEdhaW4vQXR0ZW4gKi8KKwlhZDE4NDNfUk1DTU0gID0geyAgNywgIDcsICAxIH0sCS8qIFJpZ2h0IE1pYyBNaXggTXV0ZSAqLworCWFkMTg0M19MTUNNICAgPSB7ICA3LCAgOCwgIDUgfSwJLyogTGVmdCBNaWMgTWl4IEdhaW4vQXR0ZW4gKi8KKwlhZDE4NDNfTE1DTU0gID0geyAgNywgMTUsICAxIH0sCS8qIExlZnQgTWljIE1peCBNdXRlICovCisJYWQxODQzX0hQT1MgICA9IHsgIDgsICA0LCAgMSB9LAkvKiBIZWFkcGhvbmUgT3V0cHV0IFZvbHRhZ2UgU3dpbmcgKi8KKwlhZDE4NDNfSFBPTSAgID0geyAgOCwgIDUsICAxIH0sCS8qIEhlYWRwaG9uZSBPdXRwdXQgTXV0ZSAqLworCWFkMTg0M19SREExRyAgPSB7ICA5LCAgMCwgIDYgfSwJLyogUmlnaHQgREFDMSBBbmFsb2cvRGlnaXRhbCBHYWluICovCisJYWQxODQzX1JEQTFHTSA9IHsgIDksICA3LCAgMSB9LAkvKiBSaWdodCBEQUMxIEFuYWxvZyBNdXRlICovCisJYWQxODQzX0xEQTFHICA9IHsgIDksICA4LCAgNiB9LAkvKiBMZWZ0IERBQzEgQW5hbG9nL0RpZ2l0YWwgR2FpbiAqLworCWFkMTg0M19MREExR00gPSB7ICA5LCAxNSwgIDEgfSwJLyogTGVmdCBEQUMxIEFuYWxvZyBNdXRlICovCisJYWQxODQzX1JEQTFBTSA9IHsgMTEsICA3LCAgMSB9LAkvKiBSaWdodCBEQUMxIERpZ2l0YWwgTXV0ZSAqLworCWFkMTg0M19MREExQU0gPSB7IDExLCAxNSwgIDEgfSwJLyogTGVmdCBEQUMxIERpZ2l0YWwgTXV0ZSAqLworCWFkMTg0M19BRExDICAgPSB7IDE1LCAgMCwgIDIgfSwJLyogQURDIExlZnQgU2FtcGxlIFJhdGUgU291cmNlICovCisJYWQxODQzX0FEUkMgICA9IHsgMTUsICAyLCAgMiB9LAkvKiBBREMgUmlnaHQgU2FtcGxlIFJhdGUgU291cmNlICovCisJYWQxODQzX0RBMUMgICA9IHsgMTUsICA4LCAgMiB9LAkvKiBEQUMxIFNhbXBsZSBSYXRlIFNvdXJjZSAqLworCWFkMTg0M19DMUMgICAgPSB7IDE3LCAgMCwgMTYgfSwJLyogQ2xvY2sgMSBTYW1wbGUgUmF0ZSBTZWxlY3QgKi8KKwlhZDE4NDNfQzJDICAgID0geyAyMCwgIDAsIDE2IH0sCS8qIENsb2NrIDEgU2FtcGxlIFJhdGUgU2VsZWN0ICovCisJYWQxODQzX0RBQURMICA9IHsgMjUsICA0LCAgMiB9LAkvKiBEaWdpdGFsIEFEQyBMZWZ0IFNvdXJjZSBTZWxlY3QgKi8KKwlhZDE4NDNfREFBRFIgID0geyAyNSwgIDYsICAyIH0sCS8qIERpZ2l0YWwgQURDIFJpZ2h0IFNvdXJjZSBTZWxlY3QgKi8KKwlhZDE4NDNfRFJTRkxUID0geyAyNSwgMTUsICAxIH0sCS8qIERpZ2l0YWwgUmVhbXBsZXIgRmlsdGVyIE1vZGUgKi8KKwlhZDE4NDNfQURMRiAgID0geyAyNiwgIDAsICAyIH0sIC8qIEFEQyBMZWZ0IENoYW5uZWwgRGF0YSBGb3JtYXQgKi8KKwlhZDE4NDNfQURSRiAgID0geyAyNiwgIDIsICAyIH0sIC8qIEFEQyBSaWdodCBDaGFubmVsIERhdGEgRm9ybWF0ICovCisJYWQxODQzX0FEVExLICA9IHsgMjYsICA0LCAgMSB9LAkvKiBBREMgVHJhbnNtaXQgTG9jayBNb2RlIFNlbGVjdCAqLworCWFkMTg0M19TQ0YgICAgPSB7IDI2LCAgNywgIDEgfSwJLyogU0NMSyBGcmVxdWVuY3kgU2VsZWN0ICovCisJYWQxODQzX0RBMUYgICA9IHsgMjYsICA4LCAgMiB9LAkvKiBEQUMxIERhdGEgRm9ybWF0IFNlbGVjdCAqLworCWFkMTg0M19EQTFTTSAgPSB7IDI2LCAxNCwgIDEgfSwJLyogREFDMSBTdGVyZW8vTW9ubyBNb2RlIFNlbGVjdCAqLworCWFkMTg0M19BRExFTiAgPSB7IDI3LCAgMCwgIDEgfSwJLyogQURDIExlZnQgQ2hhbm5lbCBFbmFibGUgKi8KKwlhZDE4NDNfQURSRU4gID0geyAyNywgIDEsICAxIH0sCS8qIEFEQyBSaWdodCBDaGFubmVsIEVuYWJsZSAqLworCWFkMTg0M19BQU1FTiAgPSB7IDI3LCAgNCwgIDEgfSwJLyogQW5hbG9nIHRvIEFuYWxvZyBNaXggRW5hYmxlICovCisJYWQxODQzX0FOQUVOICA9IHsgMjcsICA3LCAgMSB9LAkvKiBBbmFsb2cgQ2hhbm5lbCBFbmFibGUgKi8KKwlhZDE4NDNfREExRU4gID0geyAyNywgIDgsICAxIH0sCS8qIERBQzEgRW5hYmxlICovCisJYWQxODQzX0RBMkVOICA9IHsgMjcsICA5LCAgMSB9LAkvKiBEQUMyIEVuYWJsZSAqLworCWFkMTg0M19DMUVOICAgPSB7IDI4LCAxMSwgIDEgfSwJLyogQ2xvY2sgR2VuZXJhdG9yIDEgRW5hYmxlICovCisJYWQxODQzX0MyRU4gICA9IHsgMjgsIDEyLCAgMSB9LAkvKiBDbG9jayBHZW5lcmF0b3IgMiBFbmFibGUgKi8KKwlhZDE4NDNfUEROSSAgID0geyAyOCwgMTUsICAxIH07CS8qIENvbnZlcnRlciBQb3dlciBEb3duICovCisKKy8qCisgKiBUaGUgdmFyaW91cyByZWdpc3RlcnMgb2YgdGhlIEFEMTg0MyB1c2UgdGhyZWUgZGlmZmVyZW50IGZvcm1hdHMgZm9yCisgKiBzcGVjaWZ5aW5nIGdhaW4uICBUaGUgYWQxODQzX2dhaW4gc3RydWN0dXJlIHBhcmFtZXRlcml6ZXMgdGhlCisgKiBmb3JtYXRzLgorICovCisKK3R5cGVkZWYgc3RydWN0IGFkMTg0M19nYWluIHsKKworCWludAluZWdhdGl2ZTsJCS8qIG5vbnplcm8gaWYgZ2FpbiBpcyBuZWdhdGl2ZS4gKi8KKwljb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqbGZpZWxkOworCWNvbnN0IGFkMTg0M19iaXRmaWVsZF90ICpyZmllbGQ7CisKK30gYWQxODQzX2dhaW5fdDsKKworc3RhdGljIGNvbnN0IGFkMTg0M19nYWluX3QgYWQxODQzX2dhaW5fUkVDTEVWCisJCQkJPSB7IDAsICZhZDE4NDNfTElHLCAgICZhZDE4NDNfUklHIH07CitzdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9MSU5FCisJCQkJPSB7IDEsICZhZDE4NDNfTFgxTSwgICZhZDE4NDNfUlgxTSB9Oworc3RhdGljIGNvbnN0IGFkMTg0M19nYWluX3QgYWQxODQzX2dhaW5fQ0QKKwkJCQk9IHsgMSwgJmFkMTg0M19MWDJNLCAgJmFkMTg0M19SWDJNIH07CitzdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9NSUMKKwkJCQk9IHsgMSwgJmFkMTg0M19MTUNNLCAgJmFkMTg0M19STUNNIH07CitzdGF0aWMgY29uc3QgYWQxODQzX2dhaW5fdCBhZDE4NDNfZ2Fpbl9QQ00KKwkJCQk9IHsgMSwgJmFkMTg0M19MREExRywgJmFkMTg0M19SREExRyB9OworCisvKiByZWFkIHRoZSBjdXJyZW50IHZhbHVlIG9mIGFuIEFEMTg0MyBiaXRmaWVsZC4gKi8KKworc3RhdGljIGludCBhZDE4NDNfcmVhZF9iaXRzKGxpdGhpdW1fdCAqbGl0aCwgY29uc3QgYWQxODQzX2JpdGZpZWxkX3QgKmZpZWxkKQoreworCWludCB3ID0gbGlfcmVhZF9hZDE4NDNfcmVnKGxpdGgsIGZpZWxkLT5yZWcpOworCWludCB2YWwgPSB3ID4+IGZpZWxkLT5sb19iaXQgJiAoKDEgPDwgZmllbGQtPm5iaXRzKSAtIDEpOworCisJREJHWFYoImFkMTg0M19yZWFkX2JpdHMobGl0aD0weCVwLCBmaWVsZC0+eyVkICVkICVkfSkgcmV0dXJucyAweCV4XG4iLAorCSAgICAgIGxpdGgsIGZpZWxkLT5yZWcsIGZpZWxkLT5sb19iaXQsIGZpZWxkLT5uYml0cywgdmFsKTsKKworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiB3cml0ZSBhIG5ldyB2YWx1ZSB0byBhbiBBRDE4NDMgYml0ZmllbGQgYW5kIHJldHVybiB0aGUgb2xkIHZhbHVlLgorICovCisKK3N0YXRpYyBpbnQgYWQxODQzX3dyaXRlX2JpdHMobGl0aGl1bV90ICpsaXRoLAorCQkJICAgICBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZmllbGQsCisJCQkgICAgIGludCBuZXd2YWwpCit7CisJaW50IHcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgZmllbGQtPnJlZyk7CisJaW50IG1hc2sgPSAoKDEgPDwgZmllbGQtPm5iaXRzKSAtIDEpIDw8IGZpZWxkLT5sb19iaXQ7CisJaW50IG9sZHZhbCA9ICh3ICYgbWFzaykgPj4gZmllbGQtPmxvX2JpdDsKKwlpbnQgbmV3Yml0cyA9IChuZXd2YWwgPDwgZmllbGQtPmxvX2JpdCkgJiBtYXNrOworCXcgPSAodyAmIH5tYXNrKSB8IG5ld2JpdHM7CisJKHZvaWQpIGxpX3dyaXRlX2FkMTg0M19yZWcobGl0aCwgZmllbGQtPnJlZywgdyk7CisKKwlEQkdYVigiYWQxODQzX3dyaXRlX2JpdHMobGl0aD0weCVwLCBmaWVsZC0+eyVkICVkICVkfSwgdmFsPTB4JXgpICIKKwkgICAgICAicmV0dXJucyAweCV4XG4iLAorCSAgICAgIGxpdGgsIGZpZWxkLT5yZWcsIGZpZWxkLT5sb19iaXQsIGZpZWxkLT5uYml0cywgbmV3dmFsLAorCSAgICAgIG9sZHZhbCk7CisKKwlyZXR1cm4gb2xkdmFsOworfQorCisvKgorICogYWQxODQzX3JlYWRfbXVsdGkgcmVhZHMgbXVsdGlwbGUgYml0ZmllbGRzIGZyb20gdGhlIHNhbWUgQUQxODQzCisgKiByZWdpc3Rlci4gIEl0IHVzZXMgYSBzaW5nbGUgcmVhZCBjeWNsZSB0byBkbyBpdC4gIChSZWFkaW5nIHRoZQorICogYWQxODQzIHJlcXVpcmVzIDI1NiBiaXQgdGltZXMgYXQgMTIuMjg4IE1Ieiwgb3IgbmVhcmx5IDIwCisgKiBtaWNyb3NlY29uZHMuKQorICoKKyAqIENhbGxlZCBpa2UgdGhpcy4KKyAqCisgKiAgYWQxODQzX3JlYWRfbXVsdGkobGl0aCwgbmZpZWxkcywKKyAqCQkgICAgICAmYWQxODQzX0ZJRUxEMSwgJnZhbDEsCisgKgkJICAgICAgJmFkMTg0M19GSUVMRDIsICZ2YWwyLCAuLi4pOworICovCisKK3N0YXRpYyB2b2lkIGFkMTg0M19yZWFkX211bHRpKGxpdGhpdW1fdCAqbGl0aCwgaW50IGFyZ2NvdW50LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwljb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqZnA7CisJaW50IHcgPSAwLCBtYXNrLCAqdmFsdWUsIHJlZyA9IC0xOworCisJdmFfc3RhcnQoYXAsIGFyZ2NvdW50KTsKKwl3aGlsZSAoLS1hcmdjb3VudCA+PSAwKSB7CisJCWZwID0gdmFfYXJnKGFwLCBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqKTsKKwkJdmFsdWUgPSB2YV9hcmcoYXAsIGludCAqKTsKKwkJaWYgKHJlZyA9PSAtMSkgeworCQkJcmVnID0gZnAtPnJlZzsKKwkJCXcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgcmVnKTsKKwkJfQorCQlBU1NFUlQocmVnID09IGZwLT5yZWcpOworCQltYXNrID0gKDEgPDwgZnAtPm5iaXRzKSAtIDE7CisJCSp2YWx1ZSA9IHcgPj4gZnAtPmxvX2JpdCAmIG1hc2s7CisJfQorCXZhX2VuZChhcCk7Cit9CisKKy8qCisgKiBhZDE4NDNfd3JpdGVfbXVsdGkgc3RvcmVzIG11bHRpcGxlIGJpdGZpZWxkcyBpbnRvIHRoZSBzYW1lIEFEMTg0MworICogcmVnaXN0ZXIuICBJdCB1c2VzIG9uZSByZWFkIGFuZCBvbmUgd3JpdGUgY3ljbGUgdG8gZG8gaXQuCisgKgorICogQ2FsbGVkIGxpa2UgdGhpcy4KKyAqCisgKiAgYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIG5maWVsZHMsCisgKgkJICAgICAgICZhZDE4NDNfRklFTEQxLCB2YWwxLAorICoJCSAgICAgICAmYWQxODQzX0ZJRUxGMiwgdmFsMiwgLi4uKTsKKyAqLworCitzdGF0aWMgdm9pZCBhZDE4NDNfd3JpdGVfbXVsdGkobGl0aGl1bV90ICpsaXRoLCBpbnQgYXJnY291bnQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByZWc7CisJY29uc3QgYWQxODQzX2JpdGZpZWxkX3QgKmZwOworCWludCB2YWx1ZTsKKwlpbnQgdywgbSwgbWFzaywgYml0czsKKworCW1hc2sgPSAwOworCWJpdHMgPSAwOworCXJlZyA9IC0xOworCisJdmFfc3RhcnQoYXAsIGFyZ2NvdW50KTsKKwl3aGlsZSAoLS1hcmdjb3VudCA+PSAwKSB7CisJCWZwID0gdmFfYXJnKGFwLCBjb25zdCBhZDE4NDNfYml0ZmllbGRfdCAqKTsKKwkJdmFsdWUgPSB2YV9hcmcoYXAsIGludCk7CisJCWlmIChyZWcgPT0gLTEpCisJCQlyZWcgPSBmcC0+cmVnOworCQlBU1NFUlQoZnAtPnJlZyA9PSByZWcpOworCQltID0gKCgxIDw8IGZwLT5uYml0cykgLSAxKSA8PCBmcC0+bG9fYml0OworCQltYXNrIHw9IG07CisJCWJpdHMgfD0gKHZhbHVlIDw8IGZwLT5sb19iaXQpICYgbTsKKwl9CisJdmFfZW5kKGFwKTsKKwlBU1NFUlQoIShiaXRzICYgfm1hc2spKTsKKwlpZiAofm1hc2sgJiAweEZGRkYpCisJCXcgPSBsaV9yZWFkX2FkMTg0M19yZWcobGl0aCwgcmVnKTsKKwllbHNlCisJCXcgPSAwOworCXcgPSAodyAmIH5tYXNrKSB8IGJpdHM7CisJKHZvaWQpIGxpX3dyaXRlX2FkMTg0M19yZWcobGl0aCwgcmVnLCB3KTsKK30KKworLyoKKyAqIGFkMTg0M19nZXRfZ2FpbiByZWFkcyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGFuZCBleHRyYWN0cyB0aGUgZ2FpbiB2YWx1ZQorICogdXNpbmcgdGhlIHN1cHBsaWVkIGdhaW4gdHlwZS4gIEl0IHJldHVybnMgdGhlIGdhaW4gaW4gT1NTIGZvcm1hdC4KKyAqLworCitzdGF0aWMgaW50IGFkMTg0M19nZXRfZ2FpbihsaXRoaXVtX3QgKmxpdGgsIGNvbnN0IGFkMTg0M19nYWluX3QgKmdwKQoreworCWludCBsZywgcmc7CisJdW5zaWduZWQgc2hvcnQgbWFzayA9ICgxIDw8IGdwLT5sZmllbGQtPm5iaXRzKSAtIDE7CisKKwlhZDE4NDNfcmVhZF9tdWx0aShsaXRoLCAyLCBncC0+bGZpZWxkLCAmbGcsIGdwLT5yZmllbGQsICZyZyk7CisJaWYgKGdwLT5uZWdhdGl2ZSkgeworCQlsZyA9IG1hc2sgLSBsZzsKKwkJcmcgPSBtYXNrIC0gcmc7CisJfQorCWxnID0gKGxnICogMTAwICsgKG1hc2sgPj4gMSkpIC8gbWFzazsKKwlyZyA9IChyZyAqIDEwMCArIChtYXNrID4+IDEpKSAvIG1hc2s7CisJcmV0dXJuIGxnIDw8IDAgfCByZyA8PCA4OworfQorCisvKgorICogU2V0IGFuIGF1ZGlvIGNoYW5uZWwncyBnYWluLiBDb252ZXJ0cyBmcm9tIE9TUyBmb3JtYXQgdG8gQUQxODQzJ3MKKyAqIGZvcm1hdC4KKyAqCisgKiBSZXR1cm5zIHRoZSBuZXcgZ2Fpbiwgd2hpY2ggbWF5IGJlIGxvd2VyIHRoYW4gdGhlIG9sZCBnYWluLgorICovCisKK3N0YXRpYyBpbnQgYWQxODQzX3NldF9nYWluKGxpdGhpdW1fdCAqbGl0aCwKKwkJCSAgIGNvbnN0IGFkMTg0M19nYWluX3QgKmdwLAorCQkJICAgaW50IG5ld3ZhbCkKK3sKKwl1bnNpZ25lZCBzaG9ydCBtYXNrID0gKDEgPDwgZ3AtPmxmaWVsZC0+bmJpdHMpIC0gMTsKKworCWludCBsZyA9IG5ld3ZhbCA+PiAwICYgMHhGRjsKKwlpbnQgcmcgPSBuZXd2YWwgPj4gODsKKwlpZiAobGcgPCAwIHx8IGxnID4gMTAwIHx8IHJnIDwgMCB8fCByZyA+IDEwMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJbGcgPSAobGcgKiBtYXNrICsgKG1hc2sgPj4gMSkpIC8gMTAwOworCXJnID0gKHJnICogbWFzayArIChtYXNrID4+IDEpKSAvIDEwMDsKKwlpZiAoZ3AtPm5lZ2F0aXZlKSB7CisJCWxnID0gbWFzayAtIGxnOworCQlyZyA9IG1hc2sgLSByZzsKKwl9CisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsIGdwLT5sZmllbGQsIGxnLCBncC0+cmZpZWxkLCByZyk7CisJcmV0dXJuIGFkMTg0M19nZXRfZ2FpbihsaXRoLCBncCk7Cit9CisKKy8qIFJldHVybnMgdGhlIGN1cnJlbnQgcmVjb3JkaW5nIHNvdXJjZSwgaW4gT1NTIGZvcm1hdC4gKi8KKworc3RhdGljIGludCBhZDE4NDNfZ2V0X3JlY3NyYyhsaXRoaXVtX3QgKmxpdGgpCit7CisJaW50IGxzID0gYWQxODQzX3JlYWRfYml0cyhsaXRoLCAmYWQxODQzX0xTUyk7CisKKwlzd2l0Y2ggKGxzKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gU09VTkRfTUFTS19NSUM7CisJY2FzZSAyOgorCQlyZXR1cm4gU09VTkRfTUFTS19MSU5FOworCWNhc2UgMzoKKwkJcmV0dXJuIFNPVU5EX01BU0tfQ0Q7CisJY2FzZSA2OgorCQlyZXR1cm4gU09VTkRfTUFTS19QQ007CisJZGVmYXVsdDoKKwkJQVNTRVJUKDApOworCQlyZXR1cm4gLTE7CisJfQorfQorCisvKgorICogRW5hYmxlL2Rpc2FibGUgZGlnaXRhbCByZXNhbXBsZSBtb2RlIGluIHRoZSBBRDE4NDMuCisgKgorICogVGhlIEFEMTg0MyByZXF1aXJlcyB0aGF0IEFETCwgQURSLCBEQTEgYW5kIERBMiBiZSBwb3dlcmVkIGRvd24KKyAqIHdoaWxlIHN3aXRjaGluZyBtb2Rlcy4gIFNvIHdlIHNhdmUgREExJ3Mgc3RhdGUgKERBMidzIHN0YXRlIGlzIG5vdAorICogaW50ZXJlc3RpbmcpLCBwb3dlciB0aGVtIGRvd24sIHN3aXRjaCBpbnRvL291dCBvZiByZXNhbXBsZSBtb2RlLAorICogcG93ZXIgdGhlbSB1cCwgYW5kIHJlc3RvcmUgc3RhdGUuCisgKgorICogVGhpcyB3aWxsIGNhdXNlIGF1ZGlibGUgZ2xpdGNoZXMgaWYgRC9BIG9yIEEvRCBpcyBnb2luZyBvbiwgc28gdGhlCisgKiBkcml2ZXIgZGlzYWxsb3dzIHRoYXQgKGluIG1peGVyX3dyaXRlX2lvY3RsKCkpLgorICoKKyAqIFRoZSBvcGVuIHF1ZXN0aW9uIGlzLCBpcyB0aGlzIHdvcnRoIGRvaW5nPyAgSSdtIGxlYXZpbmcgaXQgaW4sCisgKiBiZWNhdXNlIGl0J3Mgd3JpdHRlbiwgYnV0Li4uCisgKi8KKworc3RhdGljIHZvaWQgYWQxODQzX3NldF9yZXNhbXBsZV9tb2RlKGxpdGhpdW1fdCAqbGl0aCwgaW50IG9ub2ZmKQoreworCS8qIFNhdmUgREExIG11dGUgYW5kIGdhaW4gKGFkZHIgOSBpcyBEQTEgYW5hbG9nIGdhaW4vYXR0ZW51YXRpb24pICovCisJaW50IHNhdmVfZGExID0gbGlfcmVhZF9hZDE4NDNfcmVnKGxpdGgsIDkpOworCisJLyogUG93ZXIgZG93biBBL0QgYW5kIEQvQS4gKi8KKwlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgNCwKKwkJCSAgICZhZDE4NDNfREExRU4sIDAsCisJCQkgICAmYWQxODQzX0RBMkVOLCAwLAorCQkJICAgJmFkMTg0M19BRExFTiwgMCwKKwkJCSAgICZhZDE4NDNfQURSRU4sIDApOworCisJLyogU3dpdGNoIG1vZGUgKi8KKwlBU1NFUlQob25vZmYgPT0gMCB8fCBvbm9mZiA9PSAxKTsKKwlhZDE4NDNfd3JpdGVfYml0cyhsaXRoLCAmYWQxODQzX0RSU0ZMVCwgb25vZmYpOworCisgCS8qIFBvd2VyIHVwIEEvRCBhbmQgRC9BLiAqLworCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAzLAorCQkJICAgJmFkMTg0M19EQTFFTiwgMSwKKwkJCSAgICZhZDE4NDNfQURMRU4sIDEsCisJCQkgICAmYWQxODQzX0FEUkVOLCAxKTsKKworCS8qIFJlc3RvcmUgREExIG11dGUgYW5kIGdhaW4uICovCisJbGlfd3JpdGVfYWQxODQzX3JlZyhsaXRoLCA5LCBzYXZlX2RhMSk7Cit9CisKKy8qCisgKiBTZXQgcmVjb3JkaW5nIHNvdXJjZS4gIEFyZyBuZXdzcmMgc3BlY2lmaWVzIGFuIE9TUyBjaGFubmVsIG1hc2suCisgKgorICogVGhlIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHdoZW4gd2Ugc3dpdGNoIGludG8vb3V0IG9mIGxvb3BiYWNrIG1vZGUKKyAqIChpLmUuLCBzcmMgPSBTT1VORF9NQVNLX1BDTSksIHdlIGNoYW5nZSB0aGUgQUQxODQzIGludG8vb3V0IG9mCisgKiBkaWdpdGFsIHJlc2FtcGxpbmcgbW9kZS4KKyAqCisgKiBSZXR1cm5zIG5ld3NyYyBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IGFkMTg0M19zZXRfcmVjc3JjKGxpdGhpdW1fdCAqbGl0aCwgaW50IG5ld3NyYykKK3sKKwlpbnQgYml0czsKKwlpbnQgb2xkYml0czsKKworCXN3aXRjaCAobmV3c3JjKSB7CisJY2FzZSBTT1VORF9NQVNLX1BDTToKKwkJYml0cyA9IDY7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NQVNLX01JQzoKKwkJYml0cyA9IDE7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NQVNLX0xJTkU6CisJCWJpdHMgPSAyOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUFTS19DRDoKKwkJYml0cyA9IDM7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW9sZGJpdHMgPSBhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfTFNTKTsKKwlpZiAobmV3c3JjID09IFNPVU5EX01BU0tfUENNICYmIG9sZGJpdHMgIT0gNikgeworCQlEQkdQKCJlbmFibGluZyBkaWdpdGFsIHJlc2FtcGxlIG1vZGVcbiIpOworCQlhZDE4NDNfc2V0X3Jlc2FtcGxlX21vZGUobGl0aCwgMSk7CisJCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLAorCQkJCSAgICZhZDE4NDNfREFBREwsIDIsCisJCQkJICAgJmFkMTg0M19EQUFEUiwgMik7CisJfSBlbHNlIGlmIChuZXdzcmMgIT0gU09VTkRfTUFTS19QQ00gJiYgb2xkYml0cyA9PSA2KSB7CisJCURCR1AoImRpc2FibGluZyBkaWdpdGFsIHJlc2FtcGxlIG1vZGVcbiIpOworCQlhZDE4NDNfc2V0X3Jlc2FtcGxlX21vZGUobGl0aCwgMCk7CisJCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLAorCQkJCSAgICZhZDE4NDNfREFBREwsIDAsCisJCQkJICAgJmFkMTg0M19EQUFEUiwgMCk7CisJfQorCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xTUywgYml0cywgJmFkMTg0M19SU1MsIGJpdHMpOworCXJldHVybiBuZXdzcmM7Cit9CisKKy8qCisgKiBSZXR1cm4gY3VycmVudCBvdXRwdXQgc291cmNlcywgaW4gT1NTIGZvcm1hdC4KKyAqLworCitzdGF0aWMgaW50IGFkMTg0M19nZXRfb3V0c3JjKGxpdGhpdW1fdCAqbGl0aCkKK3sKKwlpbnQgcGNtLCBsaW5lLCBtaWMsIGNkOworCisJcGNtICA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MREExR00pID8gMCA6IFNPVU5EX01BU0tfUENNOworCWxpbmUgPSBhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfTFgxTU0pICA/IDAgOiBTT1VORF9NQVNLX0xJTkU7CisJY2QgICA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MWDJNTSkgID8gMCA6IFNPVU5EX01BU0tfQ0Q7CisJbWljICA9IGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19MTUNNTSkgID8gMCA6IFNPVU5EX01BU0tfTUlDOworCisJcmV0dXJuIHBjbSB8IGxpbmUgfCBjZCB8IG1pYzsKK30KKworLyoKKyAqIFNldCBvdXRwdXQgc291cmNlcy4gIEFyZyBpcyBhIG1hc2sgb2YgYWN0aXZlIHNvdXJjZXMgaW4gT1NTIGZvcm1hdC4KKyAqCisgKiBSZXR1cm5zIHNvdXJjZSBtYXNrIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgYWQxODQzX3NldF9vdXRzcmMobGl0aGl1bV90ICpsaXRoLCBpbnQgbWFzaykKK3sKKwlpbnQgcGNtLCBsaW5lLCBtaWMsIGNkOworCisJaWYgKG1hc2sgJiB+KFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKKwkJICAgICBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19NSUMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlwY20gID0gKG1hc2sgJiBTT1VORF9NQVNLX1BDTSkgID8gMCA6IDE7CisJbGluZSA9IChtYXNrICYgU09VTkRfTUFTS19MSU5FKSA/IDAgOiAxOworCW1pYyAgPSAobWFzayAmIFNPVU5EX01BU0tfTUlDKSAgPyAwIDogMTsKKwljZCAgID0gKG1hc2sgJiBTT1VORF9NQVNLX0NEKSAgID8gMCA6IDE7CisKKwlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MREExR00sIHBjbSwgJmFkMTg0M19SREExR00sIHBjbSk7CisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfTFgxTU0sIGxpbmUsICZhZDE4NDNfUlgxTU0sIGxpbmUpOworCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLCAmYWQxODQzX0xYMk1NLCBjZCwgICAmYWQxODQzX1JYMk1NLCBjZCk7CisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfTE1DTU0sIG1pYywgICZhZDE4NDNfUk1DTU0sIG1pYyk7CisKKwlyZXR1cm4gbWFzazsKK30KKworLyogU2V0dXAgYWQxODQzIGZvciBEL0EgY29udmVyc2lvbi4gKi8KKworc3RhdGljIHZvaWQgYWQxODQzX3NldHVwX2RhYyhsaXRoaXVtX3QgKmxpdGgsCisJCQkgICAgIGludCBmcmFtZXJhdGUsCisJCQkgICAgIGludCBmbXQsCisJCQkgICAgIGludCBjaGFubmVscykKK3sKKwlpbnQgYWRfZm10ID0gMCwgYWRfbW9kZSA9IDA7CisKKwlEQkdFVigiKGxpdGg9MHglcCwgZnJhbWVyYXRlPSVkLCBmbXQ9JWQsIGNoYW5uZWxzPSVkKVxuIiwKKwkgICAgICBsaXRoLCBmcmFtZXJhdGUsIGZtdCwgY2hhbm5lbHMpOworCisJc3dpdGNoIChmbXQpIHsKKwljYXNlIEFGTVRfUzg6CQlhZF9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfVTg6CQlhZF9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfUzE2X0xFOglhZF9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfTVVfTEFXOglhZF9mbXQgPSAyOyBicmVhazsKKwljYXNlIEFGTVRfQV9MQVc6CWFkX2ZtdCA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CQlBU1NFUlQoMCk7CisJfQorCisJc3dpdGNoIChjaGFubmVscykgeworCWNhc2UgMjoJCQlhZF9tb2RlID0gMDsgYnJlYWs7CisJY2FzZSAxOgkJCWFkX21vZGUgPSAxOyBicmVhazsKKwlkZWZhdWx0OgkJQVNTRVJUKDApOworCX0KKwkJCisJREJHUFYoImFkX21vZGUgPSAlZCwgYWRfZm10ID0gJWRcbiIsIGFkX21vZGUsIGFkX2ZtdCk7CisJQVNTRVJUKGZyYW1lcmF0ZSA+PSA0MDAwICYmIGZyYW1lcmF0ZSA8PSA0OTAwMCk7CisJYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19DMUMsIGZyYW1lcmF0ZSk7CisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsCisJCQkgICAmYWQxODQzX0RBMVNNLCBhZF9tb2RlLCAmYWQxODQzX0RBMUYsIGFkX2ZtdCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0M19zaHV0ZG93bl9kYWMobGl0aGl1bV90ICpsaXRoKQoreworCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfREExRiwgMSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkMTg0M19zZXR1cF9hZGMobGl0aGl1bV90ICpsaXRoLCBpbnQgZnJhbWVyYXRlLCBpbnQgZm10LCBpbnQgY2hhbm5lbHMpCit7CisJaW50IGRhX2ZtdCA9IDA7CisKKwlEQkdFVigiKGxpdGg9MHglcCwgZnJhbWVyYXRlPSVkLCBmbXQ9JWQsIGNoYW5uZWxzPSVkKVxuIiwKKwkgICAgICBsaXRoLCBmcmFtZXJhdGUsIGZtdCwgY2hhbm5lbHMpOworCisJc3dpdGNoIChmbXQpIHsKKwljYXNlIEFGTVRfUzg6CQlkYV9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfVTg6CQlkYV9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfUzE2X0xFOglkYV9mbXQgPSAxOyBicmVhazsKKwljYXNlIEFGTVRfTVVfTEFXOglkYV9mbXQgPSAyOyBicmVhazsKKwljYXNlIEFGTVRfQV9MQVc6CWRhX2ZtdCA9IDM7IGJyZWFrOworCWRlZmF1bHQ6CQlBU1NFUlQoMCk7CisJfQorCisJREJHUFYoImRhX2ZtdCA9ICVkXG4iLCBkYV9mbXQpOworCUFTU0VSVChmcmFtZXJhdGUgPj0gNDAwMCAmJiBmcmFtZXJhdGUgPD0gNDkwMDApOworCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfQzJDLCBmcmFtZXJhdGUpOworCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAyLAorCQkJICAgJmFkMTg0M19BRExGLCBkYV9mbXQsICZhZDE4NDNfQURSRiwgZGFfZm10KTsKK30KKworc3RhdGljIHZvaWQgYWQxODQzX3NodXRkb3duX2FkYyhsaXRoaXVtX3QgKmxpdGgpCit7CisJLyogbm90aGluZyB0byBkbyAqLworfQorCisvKgorICogRnVsbHkgaW5pdGlhbGl6ZSB0aGUgYWQxODQzLiAgQXMgZGVzY3JpYmVkIGluIHRoZSBBRDE4NDMgZGF0YQorICogc2hlZXQsIHNlY3Rpb24gIlNUQVJULVVQIFNFUVVFTkNFIi4gIFRoZSBudW1iZXJlZCBjb21tZW50cyBhcmUKKyAqIHN1YnNlY3Rpb24gaGVhZGluZ3MgZnJvbSB0aGUgZGF0YSBzaGVldC4gIFNlZSB0aGUgZGF0YSBzaGVldCwgcGFnZXMKKyAqIDUyLTU0LCBmb3IgbW9yZSBpbmZvLgorICoKKyAqIHJldHVybiAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLiAgKi8KKworc3RhdGljIGludCBfX2luaXQgYWQxODQzX2luaXQobGl0aGl1bV90ICpsaXRoKQoreworCXVuc2lnbmVkIGxvbmcgbGF0ZXI7CisJaW50IGVycjsKKworCWVyciA9IGxpX2luaXQobGl0aCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWlmIChhZDE4NDNfcmVhZF9iaXRzKGxpdGgsICZhZDE4NDNfSU5JVCkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInZ3c25kIHNvdW5kOiBBRDE4NDMgd29uJ3QgaW5pdGlhbGl6ZVxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfU0NGLCAxKTsKKworCS8qIDQuIFB1dCB0aGUgY29udmVyc2lvbiByZXNvdXJjZXMgaW50byBzdGFuZGJ5LiAqLworCisJYWQxODQzX3dyaXRlX2JpdHMobGl0aCwgJmFkMTg0M19QRE5JLCAwKTsKKwlsYXRlciA9IGppZmZpZXMgKyBIWiAvIDI7CS8qIHJvdWdobHkgaGFsZiBhIHNlY29uZCAqLworCURCR0RPKHNodXRfdXArKyk7CisJd2hpbGUgKGFkMTg0M19yZWFkX2JpdHMobGl0aCwgJmFkMTg0M19QRE5PKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCBsYXRlcikpIHsKKwkJCXByaW50ayhLRVJOX0VSUgorCQkJICAgICAgICJ2d3NuZCBhdWRpbzogQUQxODQzIHdvbid0IHBvd2VyIHVwXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCXNjaGVkdWxlKCk7CisJfQorCURCR0RPKHNodXRfdXAtLSk7CisKKwkvKiA1LiBQb3dlciB1cCB0aGUgY2xvY2sgZ2VuZXJhdG9ycyBhbmQgZW5hYmxlIGNsb2NrIG91dHB1dCBwaW5zLiAqLworCisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfQzFFTiwgMSwgJmFkMTg0M19DMkVOLCAxKTsKKworCS8qIDYuIENvbmZpZ3VyZSBjb252ZXJzaW9uIHJlc291cmNlcyB3aGlsZSB0aGV5IGFyZSBpbiBzdGFuZGJ5LiAqLworCisgCS8qIERBQzEgdXNlcyBjbG9jayAxIGFzIHNvdXJjZSwgQURDIHVzZXMgY2xvY2sgMi4gIEFsd2F5cy4gKi8KKworCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCAzLAorCQkJICAgJmFkMTg0M19EQTFDLCAxLAorCQkJICAgJmFkMTg0M19BRExDLCAyLAorCQkJICAgJmFkMTg0M19BRFJDLCAyKTsKKworCS8qIDcuIEVuYWJsZSBjb252ZXJzaW9uIHJlc291cmNlcy4gKi8KKworCWFkMTg0M193cml0ZV9iaXRzKGxpdGgsICZhZDE4NDNfQURUTEssIDEpOworCWFkMTg0M193cml0ZV9tdWx0aShsaXRoLCA1LAorCQkJICAgJmFkMTg0M19BTkFFTiwgMSwKKwkJCSAgICZhZDE4NDNfQUFNRU4sIDEsCisJCQkgICAmYWQxODQzX0RBMUVOLCAxLAorCQkJICAgJmFkMTg0M19BRExFTiwgMSwKKwkJCSAgICZhZDE4NDNfQURSRU4sIDEpOworCisJLyogOC4gQ29uZmlndXJlIGNvbnZlcnNpb24gcmVzb3VyY2VzIHdoaWxlIHRoZXkgYXJlIGVuYWJsZWQuICovCisKKwlhZDE4NDNfd3JpdGVfYml0cyhsaXRoLCAmYWQxODQzX0RBMUMsIDEpOworCisJLyogVW5tdXRlIGFsbCBjaGFubmVscy4gKi8KKworCWFkMTg0M19zZXRfb3V0c3JjKGxpdGgsCisJCQkgIChTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8CisJCQkgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QpKTsKKwlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MREExQU0sIDAsICZhZDE4NDNfUkRBMUFNLCAwKTsKKworCS8qIFNldCBkZWZhdWx0IHJlY29yZGluZyBzb3VyY2UgdG8gTGluZSBJbiBhbmQgc2V0CisJICogbWljIGdhaW4gdG8gKzIwIGRCLgorCSAqLworCisJYWQxODQzX3NldF9yZWNzcmMobGl0aCwgU09VTkRfTUFTS19MSU5FKTsKKwlhZDE4NDNfd3JpdGVfbXVsdGkobGl0aCwgMiwgJmFkMTg0M19MTUdFLCAxLCAmYWQxODQzX1JNR0UsIDEpOworCisJLyogU2V0IFNwZWFrZXIgT3V0IGxldmVsIHRvICsvLSA0ViBhbmQgdW5tdXRlIGl0LiAqLworCisJYWQxODQzX3dyaXRlX211bHRpKGxpdGgsIDIsICZhZDE4NDNfSFBPUywgMSwgJmFkMTg0M19IUE9NLCAwKTsKKworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBQQ00gSS9PICovCisKKyNkZWZpbmUgUkVBRF9JTlRSX01BU0sgIChMSV9JTlRSX0NPTU0xX1RSSUcgfCBMSV9JTlRSX0NPTU0xX09WRVJGTE9XKQorI2RlZmluZSBXUklURV9JTlRSX01BU0sgKExJX0lOVFJfQ09NTTJfVFJJRyB8IExJX0lOVFJfQ09NTTJfVU5ERVJGTE9XKQorCit0eXBlZGVmIGVudW0gdndzbmRfcG9ydF9zd3N0YXRlIHsJLyogc29mdHdhcmUgc3RhdGUgKi8KKwlTV19PRkYsCisJU1dfSU5JVElBTCwKKwlTV19SVU4sCisJU1dfRFJBSU4sCit9IHZ3c25kX3BvcnRfc3dzdGF0ZV90OworCit0eXBlZGVmIGVudW0gdndzbmRfcG9ydF9od3N0YXRlIHsJLyogaGFyZHdhcmUgc3RhdGUgKi8KKwlIV19TVE9QUEVELAorCUhXX1JVTk5JTkcsCit9IHZ3c25kX3BvcnRfaHdzdGF0ZV90OworCisvKgorICogVGhlc2UgZmxhZ3MgYXJlIHJlYWQgYnkgSVNSLCBidXQgb25seSB3cml0dGVuIGF0IGJhc2VsaW5lLgorICovCisKK3R5cGVkZWYgZW51bSB2d3NuZF9wb3J0X2ZsYWdzIHsKKwlESVNBQkxFRCA9IDEgPDwgMCwKKwlFUkZMT1dOICA9IDEgPDwgMSwJCS8qIG92ZXJmbG93biBvciB1bmRlcmZsb3duICovCisJSFdfQlVTWSAgPSAxIDw8IDIsCit9IHZ3c25kX3BvcnRfZmxhZ3NfdDsKKworLyoKKyAqIHZ3c25kX3BvcnQgaXMgdGhlIHBlci1wb3J0IGRhdGEgc3RydWN0dXJlLiAgRWFjaCBkZXZpY2UgaGFzIHR3bworICogcG9ydHMsIG9uZSBmb3IgaW5wdXQgYW5kIG9uZSBmb3Igb3V0cHV0LgorICoKKyAqIExvY2tpbmc6CisgKgorICoJcG9ydC0+bG9jayBwcm90ZWN0czogaHdzdGF0ZSwgZmxhZ3MsIHN3Yl9baXVdX2F2YWlsLgorICoKKyAqCWRldmMtPmlvX3NlbWEgcHJvdGVjdHM6IHN3c3RhdGUsIHN3XyosIHN3Yl9baXVdX2lkeC4KKyAqCisgKglldmVyeXRoaW5nIGVsc2UgaXMgb25seSB3cml0dGVuIGJ5IG9wZW4vcmVsZWFzZSBvcgorICoJcGNtX3tzZXR1cCxzaHV0ZG93bn0oKSwgd2hpY2ggYXJlIHNlcmlhbGl6ZWQgYnkgYQorICoJY29tYmluYXRpb24gb2YgZGV2Yy0+b3Blbl9zZW1hIGFuZCBkZXZjLT5pb19zZW1hLgorICovCisKK3R5cGVkZWYgc3RydWN0IHZ3c25kX3BvcnQgeworCisJc3BpbmxvY2tfdAlsb2NrOworCXdhaXRfcXVldWVfaGVhZF90IHF1ZXVlOworCXZ3c25kX3BvcnRfc3dzdGF0ZV90IHN3c3RhdGU7CisJdndzbmRfcG9ydF9od3N0YXRlX3QgaHdzdGF0ZTsKKwl2d3NuZF9wb3J0X2ZsYWdzX3QgZmxhZ3M7CisKKwlpbnQJCXN3X2NoYW5uZWxzOworCWludAkJc3dfc2FtcGxlZm10OworCWludAkJc3dfZnJhbWVyYXRlOworCWludAkJc2FtcGxlX3NpemU7CisJaW50CQlmcmFtZV9zaXplOworCXVuc2lnbmVkIGludAl6ZXJvX3dvcmQ7CS8qIHplcm8gZm9yIHRoZSBzYW1wbGUgZm9ybWF0ICovCisKKwlpbnQJCXN3X2ZyYWdzaGlmdDsKKwlpbnQJCXN3X2ZyYWdjb3VudDsKKwlpbnQJCXN3X3N1YmRpdnNoaWZ0OworCisJdW5zaWduZWQgaW50CWh3X2ZyYWdzaGlmdDsKKwl1bnNpZ25lZCBpbnQJaHdfZnJhZ3NpemU7CisJdW5zaWduZWQgaW50CWh3X2ZyYWdjb3VudDsKKworCWludAkJaHdidWZfc2l6ZTsKKwl1bnNpZ25lZCBsb25nCWh3YnVmX3BhZGRyOworCXVuc2lnbmVkIGxvbmcJaHdidWZfdmFkZHI7CisJdm9pZCAqCQlod2J1ZjsJCS8qIGh3YnVmID09IGh3YnVmX3ZhZGRyICovCisJaW50CQlod2J1Zl9tYXg7CS8qIG1heCBieXRlcyB0byBwcmVsb2FkICovCisKKwl2b2lkICoJCXN3YnVmOworCXVuc2lnbmVkIGludAlzd2J1Zl9zaXplOwkvKiBzaXplIGluIGJ5dGVzICovCisJdW5zaWduZWQgaW50CXN3Yl91X2lkeDsJLyogaW5kZXggb2YgbmV4dCB1c2VyIGJ5dGUgKi8KKwl1bnNpZ25lZCBpbnQJc3diX2lfaWR4OwkvKiBpbmRleCBvZiBuZXh0IGludHIgYnl0ZSAqLworCXVuc2lnbmVkIGludAlzd2JfdV9hdmFpbDsJLyogIyBieXRlcyBhdmFpbCB0byB1c2VyICovCisJdW5zaWduZWQgaW50CXN3Yl9pX2F2YWlsOwkvKiAjIGJ5dGVzIGF2YWlsIHRvIGludHIgKi8KKworCWRtYV9jaGFuX3QJY2hhbjsKKworCS8qIEFjY291bnRpbmcgKi8KKworCWludAkJYnl0ZV9jb3VudDsKKwlpbnQJCWZyYWdfY291bnQ7CisJaW50CQlNU0Nfb2Zmc2V0OworCit9IHZ3c25kX3BvcnRfdDsKKworLyogdndzbmRfZGV2IGlzIHRoZSBwZXItZGV2aWNlIGRhdGEgc3RydWN0dXJlLiAqLworCit0eXBlZGVmIHN0cnVjdCB2d3NuZF9kZXYgeworCXN0cnVjdCB2d3NuZF9kZXYgKm5leHRfZGV2OworCWludAkJYXVkaW9fbWlub3I7CS8qIG1pbm9yIG51bWJlciBvZiBhdWRpbyBkZXZpY2UgKi8KKwlpbnQJCW1peGVyX21pbm9yOwkvKiBtaW5vciBudW1iZXIgb2YgbWl4ZXIgZGV2aWNlICovCisKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtYTsKKwlzdHJ1Y3Qgc2VtYXBob3JlIGlvX3NlbWE7CisJc3RydWN0IHNlbWFwaG9yZSBtaXhfc2VtYTsKKwltb2RlX3QJCW9wZW5fbW9kZTsKKwl3YWl0X3F1ZXVlX2hlYWRfdCBvcGVuX3dhaXQ7CisKKwlsaXRoaXVtX3QJbGl0aDsKKworCXZ3c25kX3BvcnRfdAlycG9ydDsKKwl2d3NuZF9wb3J0X3QJd3BvcnQ7Cit9IHZ3c25kX2Rldl90OworCitzdGF0aWMgdndzbmRfZGV2X3QgKnZ3c25kX2Rldl9saXN0OwkvKiBsaW5rZWQgbGlzdCBvZiBhbGwgZGV2aWNlcyAqLworCitzdGF0aWMgYXRvbWljX3QgdndzbmRfdXNlX2NvdW50ID0gQVRPTUlDX0lOSVQoMCk7CisKKyMgZGVmaW5lIElOQ19VU0VfQ09VTlQgKGF0b21pY19pbmMoJnZ3c25kX3VzZV9jb3VudCkpCisjIGRlZmluZSBERUNfVVNFX0NPVU5UIChhdG9taWNfZGVjKCZ2d3NuZF91c2VfY291bnQpKQorIyBkZWZpbmUgSU5fVVNFICAgICAgICAoYXRvbWljX3JlYWQoJnZ3c25kX3VzZV9jb3VudCkgIT0gMCkKKworLyoKKyAqIExpdGhpdW0gY2FuIG9ubHkgRE1BIG11bHRpcGxlcyBvZiAzMiBieXRlcy4gIEl0cyBETUEgYnVmZmVyIG1heQorICogYmUgdXAgdG8gOCBLYi4gIFRoaXMgZHJpdmVyIGFsd2F5cyB1c2VzIDggS2IuCisgKgorICogTWVtb3J5IGJ1ZyB3b3JrYXJvdW5kIC0tIEknbSBub3Qgc3VyZSB3aGF0J3MgZ29pbmcgb24gaGVyZSwgYnV0CisgKiBzb21laG93IHBjbV9jb3B5X291dCgpIHdhcyB0cmlnZ2VyaW5nIHNlZ3YncyBnb2luZyBvbiB0byB0aGUgbmV4dAorICogcGFnZSBvZiB0aGUgaHcgYnVmZmVyLiAgU28sIEkgbWFrZSB0aGUgaHcgYnVmZmVyIG9uZSBzaXplIGJpZ2dlcgorICogdGhhbiB3ZSBhY3R1YWxseSB1c2UuICBUaGF0IHdheSwgdGhlIGZvbGxvd2luZyBwYWdlIGlzIGFsbG9jYXRlZAorICogYW5kIG1hcHBlZCwgYW5kIG5vIGVycm9yLiAgSSBzdXNwZWN0IHRoYXQgc29tZXRoaW5nIGlzIGJyb2tlbgorICogaW4gQ29iYWx0LCBidXQgaGF2ZW4ndCByZWFsbHkgaW52ZXN0aWdhdGVkLiAgSEJPIGlzIHRoZSBhY3R1YWwKKyAqIHNpemUgb2YgdGhlIGJ1ZmZlciwgYW5kIEhXQlVGX09SREVSIGlzIHdoYXQgd2UgYWxsb2NhdGUuCisgKi8KKworI2RlZmluZSBIV0JVRl9TSElGVCAxMworI2RlZmluZSBIV0JVRl9TSVpFICgxIDw8IEhXQlVGX1NISUZUKQorIyBkZWZpbmUgSEJPICAgICAgICAgKEhXQlVGX1NISUZUID4gUEFHRV9TSElGVCA/IEhXQlVGX1NISUZUIC0gUEFHRV9TSElGVCA6IDApCisjIGRlZmluZSBIV0JVRl9PUkRFUiAoSEJPICsgMSkJCS8qIG5leHQgc2l6ZSBiaWdnZXIgKi8KKyNkZWZpbmUgTUlOX1NQRUVEIDQwMDAKKyNkZWZpbmUgTUFYX1NQRUVEIDQ5MDAwCisKKyNkZWZpbmUgTUlOX0ZSQUdTSElGVAkJCShETUFDSFVOS19TSElGVCArIDEpCisjZGVmaW5lIE1BWF9GUkFHU0hJRlQJCQkoUEFHRV9TSElGVCkKKyNkZWZpbmUgTUlOX0ZSQUdTSVpFCQkJKDEgPDwgTUlOX0ZSQUdTSElGVCkKKyNkZWZpbmUgTUFYX0ZSQUdTSVpFCQkJKDEgPDwgTUFYX0ZSQUdTSElGVCkKKyNkZWZpbmUgTUlOX0ZSQUdDT1VOVChmcmFnc2l6ZSkJCTMKKyNkZWZpbmUgTUFYX0ZSQUdDT1VOVChmcmFnc2l6ZSkJCSgzMiAqIFBBR0VfU0laRSAvIChmcmFnc2l6ZSkpCisjZGVmaW5lIERFRkFVTFRfRlJBR1NISUZUCQkxMgorI2RlZmluZSBERUZBVUxUX0ZSQUdDT1VOVAkJMTYKKyNkZWZpbmUgREVGQVVMVF9TVUJESVZTSElGVAkJMAorCisvKgorICogVGhlIHNvZnR3YXJlIGJ1ZmZlciAoc3didWYpIGlzIGEgcmluZyBidWZmZXIgc2hhcmVkIGJldHdlZW4gdXNlcgorICogbGV2ZWwgYW5kIGludGVycnVwdCBsZXZlbC4gIEVhY2ggbGV2ZWwgb3ducyBzb21lIG9mIHRoZSBieXRlcyBpbgorICogdGhlIGJ1ZmZlciwgYW5kIG1heSBnaXZlIGJ5dGVzIGF3YXkgYnkgY2FsbGluZyBzd2JfaW5jX3t1LGl9KCkuCisgKiBVc2VyIGxldmVsIGNhbGxzIF91IGZvciB1c2VyLCBhbmQgaW50ZXJydXB0IGxldmVsIGNhbGxzIF9pIGZvcgorICogaW50ZXJydXB0LgorICoKKyAqIHBvcnQtPnN3Yl97dSxpfV9hdmFpbCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSB0byB0aGF0IGxldmVsLgorICoKKyAqIHBvcnQtPnN3Yl97dSxpfV9pZHggaXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhdmFpbGFibGUgYnl0ZSBpbiB0aGUKKyAqIGJ1ZmZlci4KKyAqCisgKiBFYWNoIGxldmVsIGNhbGxzIHN3Yl9pbmNfe3UsaX0oKSB0byBhdG9taWNhbGx5IGluY3JlbWVudCBpdHMgaW5kZXgsCisgKiByZWNhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgYm90aCBzaWRlcywgYW5kCisgKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUuICBTaW5jZSBlYWNoIHNpZGUgY2FuIG9ubHkKKyAqIGdpdmUgYXdheSBieXRlcywgdGhlIG90aGVyIHNpZGUgY2FuIG9ubHkgaW5jcmVhc2UgdGhlIG51bWJlciBvZgorICogYnl0ZXMgYXZhaWxhYmxlIHRvIHRoaXMgc2lkZS4gIEVhY2ggc2lkZSB1cGRhdGVzIGl0cyBvd24gaW5kZXgKKyAqIHZhcmlhYmxlLCBzd2Jfe3UsaX1faWR4LCBzbyBubyBsb2NrIGlzIG5lZWRlZCB0byByZWFkIGl0LgorICoKKyAqIFRvIHF1ZXJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgYXZhaWxhYmxlLCBjYWxsIHN3Yl9pbmNfe3UsaX0gd2l0aCBhbgorICogaW5jcmVtZW50IG9mIHplcm8uCisgKi8KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IF9fc3diX2luY191KHZ3c25kX3BvcnRfdCAqcG9ydCwgaW50IGluYykKK3sKKwlpZiAoaW5jKSB7CisJCXBvcnQtPnN3Yl91X2lkeCArPSBpbmM7CisJCXBvcnQtPnN3Yl91X2lkeCAlPSBwb3J0LT5zd2J1Zl9zaXplOworCQlwb3J0LT5zd2JfdV9hdmFpbCAtPSBpbmM7CisJCXBvcnQtPnN3Yl9pX2F2YWlsICs9IGluYzsKKwl9CisJcmV0dXJuIHBvcnQtPnN3Yl91X2F2YWlsOworfQorCitzdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBpbnQgc3diX2luY191KHZ3c25kX3BvcnRfdCAqcG9ydCwgaW50IGluYykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXsKKwkJcmV0ID0gX19zd2JfaW5jX3UocG9ydCwgaW5jKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9ydC0+bG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHVuc2lnbmVkIGludCBfX3N3Yl9pbmNfaSh2d3NuZF9wb3J0X3QgKnBvcnQsIGludCBpbmMpCit7CisJaWYgKGluYykgeworCQlwb3J0LT5zd2JfaV9pZHggKz0gaW5jOworCQlwb3J0LT5zd2JfaV9pZHggJT0gcG9ydC0+c3didWZfc2l6ZTsKKwkJcG9ydC0+c3diX2lfYXZhaWwgLT0gaW5jOworCQlwb3J0LT5zd2JfdV9hdmFpbCArPSBpbmM7CisJfQorCXJldHVybiBwb3J0LT5zd2JfaV9hdmFpbDsKK30KKworc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgaW50IHN3Yl9pbmNfaSh2d3NuZF9wb3J0X3QgKnBvcnQsIGludCBpbmMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwl7CisJCXJldCA9IF9fc3diX2luY19pKHBvcnQsIGluYyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvcnQtPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogcGNtX3NldHVwIC0gdGhpcyByb3V0aW5lIGluaXRpYWxpemVzIGFsbCBwb3J0IHN0YXRlIGFmdGVyCisgKiBtb2RlLXNldHRpbmcgaW9jdGxzIGhhdmUgYmVlbiBkb25lLCBidXQgYmVmb3JlIHRoZSBmaXJzdCBJL08gaXMKKyAqIGRvbmUuCisgKgorICogTG9ja2luZzogY2FsbGVkIHdpdGggZGV2Yy0+aW9fc2VtYSBoZWxkLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtZXJybm8gb24gZmFpbHVyZS4KKyAqLworCitzdGF0aWMgaW50IHBjbV9zZXR1cCh2d3NuZF9kZXZfdCAqZGV2YywKKwkJICAgICB2d3NuZF9wb3J0X3QgKnJwb3J0LAorCQkgICAgIHZ3c25kX3BvcnRfdCAqd3BvcnQpCit7CisJdndzbmRfcG9ydF90ICphcG9ydCA9IHJwb3J0ID8gcnBvcnQgOiB3cG9ydDsKKwlpbnQgc2FtcGxlX3NpemU7CisJdW5zaWduZWQgaW50IHplcm9fd29yZDsKKworCURCR0VWKCIoZGV2Yz0weCVwLCBycG9ydD0weCVwLCB3cG9ydD0weCVwKVxuIiwgZGV2YywgcnBvcnQsIHdwb3J0KTsKKworCUFTU0VSVChhcG9ydCAhPSBOVUxMKTsKKwlpZiAoYXBvcnQtPnN3YnVmICE9IE5VTEwpCisJCXJldHVybiAwOworCXN3aXRjaCAoYXBvcnQtPnN3X3NhbXBsZWZtdCkgeworCWNhc2UgQUZNVF9NVV9MQVc6CisJCXNhbXBsZV9zaXplID0gMTsKKwkJemVyb193b3JkID0gMHhGRkZGRkZGRiBeIDB4ODA4MDgwODA7CisJCWJyZWFrOworCisJY2FzZSBBRk1UX0FfTEFXOgorCQlzYW1wbGVfc2l6ZSA9IDE7CisJCXplcm9fd29yZCA9IDB4RDVENUQ1RDUgXiAweDgwODA4MDgwOworCQlicmVhazsKKworCWNhc2UgQUZNVF9VODoKKwkJc2FtcGxlX3NpemUgPSAxOworCQl6ZXJvX3dvcmQgPSAweDgwODA4MDgwOworCQlicmVhazsKKworCWNhc2UgQUZNVF9TODoKKwkJc2FtcGxlX3NpemUgPSAxOworCQl6ZXJvX3dvcmQgPSAweDAwMDAwMDAwOworCQlicmVhazsKKworCWNhc2UgQUZNVF9TMTZfTEU6CisJCXNhbXBsZV9zaXplID0gMjsKKwkJemVyb193b3JkID0gMHgwMDAwMDAwMDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzYW1wbGVfc2l6ZSA9IDA7CS8qIHByZXZlbnQgY29tcGlsZXIgd2FybmluZyAqLworCQl6ZXJvX3dvcmQgPSAwOworCQlBU1NFUlQoMCk7CisJfQorCWFwb3J0LT5zYW1wbGVfc2l6ZSAgPSBzYW1wbGVfc2l6ZTsKKwlhcG9ydC0+emVyb193b3JkICAgID0gemVyb193b3JkOworCWFwb3J0LT5mcmFtZV9zaXplICAgPSBhcG9ydC0+c3dfY2hhbm5lbHMgKiBhcG9ydC0+c2FtcGxlX3NpemU7CisJYXBvcnQtPmh3X2ZyYWdzaGlmdCA9IGFwb3J0LT5zd19mcmFnc2hpZnQgLSBhcG9ydC0+c3dfc3ViZGl2c2hpZnQ7CisJYXBvcnQtPmh3X2ZyYWdzaXplICA9IDEgPDwgYXBvcnQtPmh3X2ZyYWdzaGlmdDsKKwlhcG9ydC0+aHdfZnJhZ2NvdW50ID0gYXBvcnQtPnN3X2ZyYWdjb3VudCA8PCBhcG9ydC0+c3dfc3ViZGl2c2hpZnQ7CisJQVNTRVJUKGFwb3J0LT5od19mcmFnc2l6ZSA+PSBNSU5fRlJBR1NJWkUpOworCUFTU0VSVChhcG9ydC0+aHdfZnJhZ3NpemUgPD0gTUFYX0ZSQUdTSVpFKTsKKwlBU1NFUlQoYXBvcnQtPmh3X2ZyYWdjb3VudCA+PSBNSU5fRlJBR0NPVU5UKGFwb3J0LT5od19mcmFnc2l6ZSkpOworCUFTU0VSVChhcG9ydC0+aHdfZnJhZ2NvdW50IDw9IE1BWF9GUkFHQ09VTlQoYXBvcnQtPmh3X2ZyYWdzaXplKSk7CisJaWYgKHJwb3J0KSB7CisJCWludCBod2ZyYWdzLCBzd2ZyYWdzOworCQlycG9ydC0+aHdidWZfbWF4ID0gYXBvcnQtPmh3YnVmX3NpemUgLSBETUFDSFVOS19TSVpFOworCQlod2ZyYWdzID0gcnBvcnQtPmh3YnVmX21heCA+PiBhcG9ydC0+aHdfZnJhZ3NoaWZ0OworCQlzd2ZyYWdzID0gYXBvcnQtPmh3X2ZyYWdjb3VudCAtIGh3ZnJhZ3M7CisJCWlmIChzd2ZyYWdzIDwgMikKKwkJCXN3ZnJhZ3MgPSAyOworCQlycG9ydC0+c3didWZfc2l6ZSA9IHN3ZnJhZ3MgKiBhcG9ydC0+aHdfZnJhZ3NpemU7CisJCURCR1BWKCJod2ZyYWdzID0gJWQsIHN3ZnJhZ3MgPSAlZFxuIiwgaHdmcmFncywgc3dmcmFncyk7CisJCURCR1BWKCJyZWFkIGh3YnVmX21heCA9ICVkLCBzd2J1Zl9zaXplID0gJWRcbiIsCisJCSAgICAgcnBvcnQtPmh3YnVmX21heCwgcnBvcnQtPnN3YnVmX3NpemUpOworCX0KKwlpZiAod3BvcnQpIHsKKwkJaW50IGh3ZnJhZ3MsIHN3ZnJhZ3M7CisJCWludCB0b3RhbF9ieXRlcyA9IGFwb3J0LT5od19mcmFnY291bnQgKiBhcG9ydC0+aHdfZnJhZ3NpemU7CisJCXdwb3J0LT5od2J1Zl9tYXggPSBhcG9ydC0+aHdidWZfc2l6ZSAtIERNQUNIVU5LX1NJWkU7CisJCWlmICh3cG9ydC0+aHdidWZfbWF4ID4gdG90YWxfYnl0ZXMpCisJCQl3cG9ydC0+aHdidWZfbWF4ID0gdG90YWxfYnl0ZXM7CisJCWh3ZnJhZ3MgPSB3cG9ydC0+aHdidWZfbWF4ID4+IGFwb3J0LT5od19mcmFnc2hpZnQ7CisJCURCR1BWKCJod2ZyYWdzID0gJWRcbiIsIGh3ZnJhZ3MpOworCQlzd2ZyYWdzID0gYXBvcnQtPmh3X2ZyYWdjb3VudCAtIGh3ZnJhZ3M7CisJCWlmIChzd2ZyYWdzIDwgMikKKwkJCXN3ZnJhZ3MgPSAyOworCQl3cG9ydC0+c3didWZfc2l6ZSA9IHN3ZnJhZ3MgKiBhcG9ydC0+aHdfZnJhZ3NpemU7CisJCURCR1BWKCJod2ZyYWdzID0gJWQsIHN3ZnJhZ3MgPSAlZFxuIiwgaHdmcmFncywgc3dmcmFncyk7CisJCURCR1BWKCJ3cml0ZSBod2J1Zl9tYXggPSAlZCwgc3didWZfc2l6ZSA9ICVkXG4iLAorCQkgICAgIHdwb3J0LT5od2J1Zl9tYXgsIHdwb3J0LT5zd2J1Zl9zaXplKTsKKwl9CisKKwlhcG9ydC0+c3diX3VfaWR4ICAgID0gMDsKKwlhcG9ydC0+c3diX2lfaWR4ICAgID0gMDsKKwlhcG9ydC0+Ynl0ZV9jb3VudCAgID0gMDsKKworCS8qCisJICogSXMgdGhpcyBhIENvYmFsdCBidWc/ICBXZSBuZWVkIHRvIG1ha2UgdGhpcyBidWZmZXIgZXh0ZW5kCisJICogb25lIHBhZ2UgZnVydGhlciB0aGFuIHdlIGFjdHVhbGx5IHVzZSAtLSBzb21laG93IG1lbWNweQorCSAqIGNhdXNlcyBhbiBleGNlcHRvaW4gb3RoZXJ3aXNlLiAgSSBzdXNwZWN0IHRoZXJlJ3MgYSBidWcgaW4KKwkgKiBDb2JhbHQgKG9yIHNvbWV3aGVyZSkgd2hlcmUgaXQncyBnZW5lcmF0aW5nIGEgZmF1bHQgb24gYQorCSAqIHNwZWN1bGF0aXZlIGxvYWQgb3Igc29tZXRoaW5nLiAgT2J2aW91c2x5LCBJIGhhdmVuJ3QgdGFrZW4KKwkgKiB0aGUgdGltZSB0byB0cmFjayBpdCBkb3duLgorCSAqLworCisJYXBvcnQtPnN3YnVmICAgICAgICA9IHZtYWxsb2MoYXBvcnQtPnN3YnVmX3NpemUgKyBQQUdFX1NJWkUpOworCWlmICghYXBvcnQtPnN3YnVmKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAocnBvcnQgJiYgd3BvcnQpIHsKKwkJQVNTRVJUKGFwb3J0ID09IHJwb3J0KTsKKwkJQVNTRVJUKHdwb3J0LT5zd2J1ZiA9PSBOVUxMKTsKKwkJLyogT25lIGV4dHJhIHBhZ2UgLSBzZWUgY29tbWVudCBhYm92ZS4gKi8KKwkJd3BvcnQtPnN3YnVmID0gdm1hbGxvYyhhcG9ydC0+c3didWZfc2l6ZSArIFBBR0VfU0laRSk7CisJCWlmICghd3BvcnQtPnN3YnVmKSB7CisJCQl2ZnJlZShhcG9ydC0+c3didWYpOworCQkJYXBvcnQtPnN3YnVmID0gTlVMTDsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXdwb3J0LT5zYW1wbGVfc2l6ZSAgPSBycG9ydC0+c2FtcGxlX3NpemU7CisJCXdwb3J0LT56ZXJvX3dvcmQgICAgPSBycG9ydC0+emVyb193b3JkOworCQl3cG9ydC0+ZnJhbWVfc2l6ZSAgID0gcnBvcnQtPmZyYW1lX3NpemU7CisJCXdwb3J0LT5od19mcmFnc2hpZnQgPSBycG9ydC0+aHdfZnJhZ3NoaWZ0OworCQl3cG9ydC0+aHdfZnJhZ3NpemUgID0gcnBvcnQtPmh3X2ZyYWdzaXplOworCQl3cG9ydC0+aHdfZnJhZ2NvdW50ID0gcnBvcnQtPmh3X2ZyYWdjb3VudDsKKwkJd3BvcnQtPnN3YnVmX3NpemUgICA9IHJwb3J0LT5zd2J1Zl9zaXplOworCQl3cG9ydC0+aHdidWZfbWF4ICAgID0gcnBvcnQtPmh3YnVmX21heDsKKwkJd3BvcnQtPnN3Yl91X2lkeCAgICA9IHJwb3J0LT5zd2JfdV9pZHg7CisJCXdwb3J0LT5zd2JfaV9pZHggICAgPSBycG9ydC0+c3diX2lfaWR4OworCQl3cG9ydC0+Ynl0ZV9jb3VudCAgID0gcnBvcnQtPmJ5dGVfY291bnQ7CisJfQorCWlmIChycG9ydCkgeworCQlycG9ydC0+c3diX3VfYXZhaWwgPSAwOworCQlycG9ydC0+c3diX2lfYXZhaWwgPSBycG9ydC0+c3didWZfc2l6ZTsKKwkJcnBvcnQtPnN3c3RhdGUgPSBTV19SVU47CisJCWxpX3NldHVwX2RtYSgmcnBvcnQtPmNoYW4sCisJCQkgICAgICZsaV9jb21tMSwKKwkJCSAgICAgJmRldmMtPmxpdGgsCisJCQkgICAgIHJwb3J0LT5od2J1Zl9wYWRkciwKKwkJCSAgICAgSFdCVUZfU0hJRlQsCisJCQkgICAgIHJwb3J0LT5od19mcmFnc2hpZnQsCisJCQkgICAgIHJwb3J0LT5zd19jaGFubmVscywKKwkJCSAgICAgcnBvcnQtPnNhbXBsZV9zaXplKTsKKwkJYWQxODQzX3NldHVwX2FkYygmZGV2Yy0+bGl0aCwKKwkJCQkgcnBvcnQtPnN3X2ZyYW1lcmF0ZSwKKwkJCQkgcnBvcnQtPnN3X3NhbXBsZWZtdCwKKwkJCQkgcnBvcnQtPnN3X2NoYW5uZWxzKTsKKwkJbGlfZW5hYmxlX2ludGVycnVwdHMoJmRldmMtPmxpdGgsIFJFQURfSU5UUl9NQVNLKTsKKwkJaWYgKCEocnBvcnQtPmZsYWdzICYgRElTQUJMRUQpKSB7CisJCQl1c3Rtc2NfdCB1c3Rtc2M7CisJCQlycG9ydC0+aHdzdGF0ZSA9IEhXX1JVTk5JTkc7CisJCQlsaV9hY3RpdmF0ZV9kbWEoJnJwb3J0LT5jaGFuKTsKKwkJCWxpX3JlYWRfVVNUTVNDKCZycG9ydC0+Y2hhbiwgJnVzdG1zYyk7CisJCQlycG9ydC0+TVNDX29mZnNldCA9IHVzdG1zYy5tc2M7CisJCX0KKwl9CisJaWYgKHdwb3J0KSB7CisJCWlmICh3cG9ydC0+aHdidWZfbWF4ID4gd3BvcnQtPnN3YnVmX3NpemUpCisJCQl3cG9ydC0+aHdidWZfbWF4ID0gd3BvcnQtPnN3YnVmX3NpemU7CisJCXdwb3J0LT5mbGFncyAmPSB+RVJGTE9XTjsKKwkJd3BvcnQtPnN3Yl91X2F2YWlsID0gd3BvcnQtPnN3YnVmX3NpemU7CisJCXdwb3J0LT5zd2JfaV9hdmFpbCA9IDA7CisJCXdwb3J0LT5zd3N0YXRlID0gU1dfUlVOOworCQlsaV9zZXR1cF9kbWEoJndwb3J0LT5jaGFuLAorCQkJICAgICAmbGlfY29tbTIsCisJCQkgICAgICZkZXZjLT5saXRoLAorCQkJICAgICB3cG9ydC0+aHdidWZfcGFkZHIsCisJCQkgICAgIEhXQlVGX1NISUZULAorCQkJICAgICB3cG9ydC0+aHdfZnJhZ3NoaWZ0LAorCQkJICAgICB3cG9ydC0+c3dfY2hhbm5lbHMsCisJCQkgICAgIHdwb3J0LT5zYW1wbGVfc2l6ZSk7CisJCWFkMTg0M19zZXR1cF9kYWMoJmRldmMtPmxpdGgsCisJCQkJIHdwb3J0LT5zd19mcmFtZXJhdGUsCisJCQkJIHdwb3J0LT5zd19zYW1wbGVmbXQsCisJCQkJIHdwb3J0LT5zd19jaGFubmVscyk7CisJCWxpX2VuYWJsZV9pbnRlcnJ1cHRzKCZkZXZjLT5saXRoLCBXUklURV9JTlRSX01BU0spOworCX0KKwlEQkdSVigpOworCXJldHVybiAwOworfQorCisvKgorICogcGNtX3NodXRkb3duX3BvcnQgLSBzaHV0IGRvd24gb25lIHBvcnQgKGRpcmVjdGlvbikgZm9yIFBDTSBJL08uCisgKiBPbmx5IGNhbGxlZCBmcm9tIHBjbV9zaHV0ZG93bi4KKyAqLworCitzdGF0aWMgdm9pZCBwY21fc2h1dGRvd25fcG9ydCh2d3NuZF9kZXZfdCAqZGV2YywKKwkJCSAgICAgIHZ3c25kX3BvcnRfdCAqYXBvcnQsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbWFzaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXZ3c25kX3BvcnRfaHdzdGF0ZV90IGh3c3RhdGU7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisKKwlhcG9ydC0+c3dzdGF0ZSA9IFNXX0lOSVRJQUw7CisJYWRkX3dhaXRfcXVldWUoJmFwb3J0LT5xdWV1ZSwgJndhaXQpOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmFwb3J0LT5sb2NrLCBmbGFncyk7CisJCXsKKwkJCWh3c3RhdGUgPSBhcG9ydC0+aHdzdGF0ZTsKKwkJfQkJCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFwb3J0LT5sb2NrLCBmbGFncyk7CisJCWlmIChod3N0YXRlID09IEhXX1NUT1BQRUQpCisJCQlicmVhazsKKwkJc2NoZWR1bGUoKTsKKwl9CisJY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcmVtb3ZlX3dhaXRfcXVldWUoJmFwb3J0LT5xdWV1ZSwgJndhaXQpOworCWxpX2Rpc2FibGVfaW50ZXJydXB0cygmZGV2Yy0+bGl0aCwgbWFzayk7CisJaWYgKGFwb3J0ID09ICZkZXZjLT5ycG9ydCkKKwkJYWQxODQzX3NodXRkb3duX2FkYygmZGV2Yy0+bGl0aCk7CisJZWxzZSAvKiBhcG9ydCA9PSAmZGV2Yy0+d3BvcnQpICovCisJCWFkMTg0M19zaHV0ZG93bl9kYWMoJmRldmMtPmxpdGgpOworCWxpX3NodXRkb3duX2RtYSgmYXBvcnQtPmNoYW4pOworCXZmcmVlKGFwb3J0LT5zd2J1Zik7CisJYXBvcnQtPnN3YnVmID0gTlVMTDsKKwlhcG9ydC0+Ynl0ZV9jb3VudCA9IDA7Cit9CisKKy8qCisgKiBwY21fc2h1dGRvd24gdW5kb2VzIHdoYXQgcGNtX3NldHVwIGRpZC4KKyAqIEFsc28gc2V0cyB0aGUgcG9ydHMnIHN3c3RhdGUgdG8gbmV3c3RhdGUuCisgKi8KKworc3RhdGljIHZvaWQgcGNtX3NodXRkb3duKHZ3c25kX2Rldl90ICpkZXZjLAorCQkJIHZ3c25kX3BvcnRfdCAqcnBvcnQsCisJCQkgdndzbmRfcG9ydF90ICp3cG9ydCkKK3sKKwlEQkdFVigiKGRldmM9MHglcCwgcnBvcnQ9MHglcCwgd3BvcnQ9MHglcClcbiIsIGRldmMsIHJwb3J0LCB3cG9ydCk7CisKKwlpZiAocnBvcnQgJiYgcnBvcnQtPnN3YnVmKSB7CisJCURCR1BWKCJzaHV0dGluZyBkb3duIHJwb3J0XG4iKTsKKwkJcGNtX3NodXRkb3duX3BvcnQoZGV2YywgcnBvcnQsIFJFQURfSU5UUl9NQVNLKTsKKwl9CisJaWYgKHdwb3J0ICYmIHdwb3J0LT5zd2J1ZikgeworCQlEQkdQVigic2h1dHRpbmcgZG93biB3cG9ydFxuIik7CisJCXBjbV9zaHV0ZG93bl9wb3J0KGRldmMsIHdwb3J0LCBXUklURV9JTlRSX01BU0spOworCX0KKwlEQkdSVigpOworfQorCitzdGF0aWMgdm9pZCBwY21fY29weV9pbih2d3NuZF9wb3J0X3QgKnJwb3J0LCBpbnQgc3dpZHgsIGludCBod2lkeCwgaW50IG5iKQoreworCWNoYXIgKnNyYyA9IHJwb3J0LT5od2J1ZiArIGh3aWR4OworCWNoYXIgKmRzdCA9IHJwb3J0LT5zd2J1ZiArIHN3aWR4OworCWludCBmbXQgPSBycG9ydC0+c3dfc2FtcGxlZm10OworCisJREJHUFYoInN3aWR4ID0gJWQsIGh3aWR4ID0gJWRcbiIsIHN3aWR4LCBod2lkeCk7CisJQVNTRVJUKHJwb3J0LT5od2J1ZiAhPSBOVUxMKTsKKwlBU1NFUlQocnBvcnQtPnN3YnVmICE9IE5VTEwpOworCUFTU0VSVChuYiA+IDAgJiYgKG5iICUgMzIpID09IDApOworCUFTU0VSVChzd2lkeCAlIDMyID09IDAgJiYgaHdpZHggJSAzMiA9PSAwKTsKKwlBU1NFUlQoc3dpZHggPj0gMCAmJiBzd2lkeCArIG5iIDw9IHJwb3J0LT5zd2J1Zl9zaXplKTsKKwlBU1NFUlQoaHdpZHggPj0gMCAmJiBod2lkeCArIG5iIDw9IHJwb3J0LT5od2J1Zl9zaXplKTsKKworCWlmIChmbXQgPT0gQUZNVF9NVV9MQVcgfHwgZm10ID09IEFGTVRfQV9MQVcgfHwgZm10ID09IEFGTVRfUzgpIHsKKworCQkvKiBTZWUgU2FtcGxlIEZvcm1hdCBOb3RlcyBhYm92ZS4gKi8KKworCQljaGFyICplbmQgPSBzcmMgKyBuYjsKKwkJd2hpbGUgKHNyYyA8IGVuZCkKKwkJCSpkc3QrKyA9ICpzcmMrKyBeIDB4ODA7CisJfSBlbHNlCisJCW1lbWNweShkc3QsIHNyYywgbmIpOworfQorCitzdGF0aWMgdm9pZCBwY21fY29weV9vdXQodndzbmRfcG9ydF90ICp3cG9ydCwgaW50IHN3aWR4LCBpbnQgaHdpZHgsIGludCBuYikKK3sKKwljaGFyICpzcmMgPSB3cG9ydC0+c3didWYgKyBzd2lkeDsKKwljaGFyICpkc3QgPSB3cG9ydC0+aHdidWYgKyBod2lkeDsKKwlpbnQgZm10ID0gd3BvcnQtPnN3X3NhbXBsZWZtdDsKKworCUFTU0VSVChuYiA+IDAgJiYgKG5iICUgMzIpID09IDApOworCUFTU0VSVCh3cG9ydC0+aHdidWYgIT0gTlVMTCk7CisJQVNTRVJUKHdwb3J0LT5zd2J1ZiAhPSBOVUxMKTsKKwlBU1NFUlQoc3dpZHggJSAzMiA9PSAwICYmIGh3aWR4ICUgMzIgPT0gMCk7CisJQVNTRVJUKHN3aWR4ID49IDAgJiYgc3dpZHggKyBuYiA8PSB3cG9ydC0+c3didWZfc2l6ZSk7CisJQVNTRVJUKGh3aWR4ID49IDAgJiYgaHdpZHggKyBuYiA8PSB3cG9ydC0+aHdidWZfc2l6ZSk7CisJaWYgKGZtdCA9PSBBRk1UX01VX0xBVyB8fCBmbXQgPT0gQUZNVF9BX0xBVyB8fCBmbXQgPT0gQUZNVF9TOCkgeworCisJCS8qIFNlZSBTYW1wbGUgRm9ybWF0IE5vdGVzIGFib3ZlLiAqLworCisJCWNoYXIgKmVuZCA9IHNyYyArIG5iOworCQl3aGlsZSAoc3JjIDwgZW5kKQorCQkJKmRzdCsrID0gKnNyYysrIF4gMHg4MDsKKwl9IGVsc2UKKwkJbWVtY3B5KGRzdCwgc3JjLCBuYik7Cit9CisKKy8qCisgKiBwY21fb3V0cHV0KCkgaXMgY2FsbGVkIGJvdGggZnJvbSBiYXNlbGV2ZWwgYW5kIGZyb20gaW50ZXJydXB0IGxldmVsLgorICogVGhpcyBpcyB3aGVyZSBhdWRpbyBmcmFtZXMgYXJlIGNvcGllZCBpbnRvIHRoZSBoYXJkd2FyZS1hY2Nlc3NpYmxlCisgKiByaW5nIGJ1ZmZlci4KKyAqCisgKiBMb2NraW5nIG5vdGU6IFRoZSBwYXJ0IG9mIHRoaXMgcm91dGluZSB0aGF0IGZpZ3VyZXMgb3V0IHdoYXQgdG8gZG8KKyAqIGhvbGRzIHdwb3J0LT5sb2NrLiAgVGhlIGxvbmdlciBwYXJ0IHJlbGVhc2VzIHdwb3J0LT5sb2NrLCBidXQgc2V0cworICogd3BvcnQtPmZsYWdzICYgSFdfQlVTWS4gIEFmdGVyd2FyZCwgaXQgcmVhY3F1aXJlcyB3cG9ydC0+bG9jaywgYW5kCisgKiBjaGVja3MgZm9yIG1vcmUgd29yayB0byBkby4KKyAqCisgKiBJZiBhbm90aGVyIHRocmVhZCBjYWxscyBwY21fb3V0cHV0KCkgd2hpbGUgSFdfQlVTWSBpcyBzZXQsIGl0CisgKiByZXR1cm5zIGltbWVkaWF0ZWx5LCBrbm93aW5nIHRoYXQgdGhlIHRocmVhZCB0aGF0IHNldCBIV19CVVNZIHdpbGwKKyAqIGxvb2sgZm9yIG1vcmUgd29yayB0byBkbyBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBwb3J0LT5sb2NrIGlzIGhlbGQgZm9yIHNldmVyYWwgc2hvcnQKKyAqIHBlcmlvZHMgaW5zdGVhZCBvZiBvbmUgbG9uZyBwZXJpb2QuICBBbHNvLCB3aGVuIHBjbV9vdXRwdXQgaXMKKyAqIGNhbGxlZCBmcm9tIGJhc2UgbGV2ZWwsIGl0IHJlZW5hYmxlcyBpbnRlcnJ1cHRzLgorICovCisKK3N0YXRpYyB2b2lkIHBjbV9vdXRwdXQodndzbmRfZGV2X3QgKmRldmMsIGludCBlcmZsb3duLCBpbnQgbmIpCit7CisJdndzbmRfcG9ydF90ICp3cG9ydCA9ICZkZXZjLT53cG9ydDsKKwljb25zdCBpbnQgaHdtYXggID0gd3BvcnQtPmh3YnVmX21heDsKKwljb25zdCBpbnQgaHdzaXplID0gd3BvcnQtPmh3YnVmX3NpemU7CisJY29uc3QgaW50IHN3c2l6ZSA9IHdwb3J0LT5zd2J1Zl9zaXplOworCWNvbnN0IGludCBmcmFnc2l6ZSA9IHdwb3J0LT5od19mcmFnc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGlmbGFnczsKKworCURCR0VWKCIoZGV2Yz0weCVwLCBlcmZsb3duPSVkLCBuYj0lZClcbiIsIGRldmMsIGVyZmxvd24sIG5iKTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGlmbGFncyk7CisJaWYgKGVyZmxvd24pCisJCXdwb3J0LT5mbGFncyB8PSBFUkZMT1dOOworCSh2b2lkKSBfX3N3Yl9pbmNfdSh3cG9ydCwgbmIpOworCWlmICh3cG9ydC0+ZmxhZ3MgJiBIV19CVVNZKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOworCQlEQkdQVigicmV0dXJuaW5nOiBIVyBCVVNZXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAod3BvcnQtPmZsYWdzICYgRElTQUJMRUQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGlmbGFncyk7CisJCURCR1BWKCJyZXR1cm5pbmc6IERJU0FCTEVEXG4iKTsKKwkJcmV0dXJuOworCX0KKwl3cG9ydC0+ZmxhZ3MgfD0gSFdfQlVTWTsKKwl3aGlsZSAoMSkgeworCQlpbnQgc3dwdHIsIGh3cHRyLCBod19hdmFpbCwgc3dfYXZhaWwsIHN3aWR4OworCQl2d3NuZF9wb3J0X2h3c3RhdGVfdCBod3N0YXRlID0gd3BvcnQtPmh3c3RhdGU7CisJCXZ3c25kX3BvcnRfc3dzdGF0ZV90IHN3c3RhdGUgPSB3cG9ydC0+c3dzdGF0ZTsKKwkJaW50IGh3X3VuYXZhaWw7CisJCXVzdG1zY190IHVzdG1zYzsKKworCQlod3B0ciA9IGxpX3JlYWRfaHdwdHIoJndwb3J0LT5jaGFuKTsKKwkJc3dwdHIgPSBsaV9yZWFkX3N3cHRyKCZ3cG9ydC0+Y2hhbik7CisJCWh3X3VuYXZhaWwgPSAoc3dwdHIgLSBod3B0ciArIGh3c2l6ZSkgJSBod3NpemU7CisJCWh3X2F2YWlsID0gKGh3bWF4IC0gaHdfdW5hdmFpbCkgJiAtZnJhZ3NpemU7CisJCXN3X2F2YWlsID0gd3BvcnQtPnN3Yl9pX2F2YWlsICYgLWZyYWdzaXplOworCQlpZiAoc3dfYXZhaWwgJiYgc3dzdGF0ZSA9PSBTV19SVU4pIHsKKwkJCWlmICh3cG9ydC0+ZmxhZ3MgJiBFUkZMT1dOKSB7CisJCQkJd3BvcnQtPmZsYWdzICY9IH5FUkZMT1dOOworCQkJfQorCQl9IGVsc2UgaWYgKHN3c3RhdGUgPT0gU1dfSU5JVElBTCB8fAorCQkJIHN3c3RhdGUgPT0gU1dfT0ZGIHx8CisJCQkgKHN3c3RhdGUgPT0gU1dfRFJBSU4gJiYKKwkJCSAgIXN3X2F2YWlsICYmCisJCQkgICh3cG9ydC0+ZmxhZ3MgJiBFUkZMT1dOKSkpIHsKKwkJCURCR1AoInN0b3BwaW5nLiAgaHdzdGF0ZSA9ICVkXG4iLCBod3N0YXRlKTsKKwkJCWlmIChod3N0YXRlICE9IEhXX1NUT1BQRUQpIHsKKwkJCQlsaV9kZWFjdGl2YXRlX2RtYSgmd3BvcnQtPmNoYW4pOworCQkJCXdwb3J0LT5od3N0YXRlID0gSFdfU1RPUFBFRDsKKwkJCX0KKwkJCXdha2VfdXAoJndwb3J0LT5xdWV1ZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN3X2F2YWlsIHx8ICFod19hdmFpbCkKKwkJCWJyZWFrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgaWZsYWdzKTsKKworCQkvKgorCQkgKiBXZSBnYXZlIHVwIHRoZSBwb3J0IGxvY2ssIGJ1dCB3ZSBoYXZlIHRoZSBIV19CVVNZIGZsYWcuCisJCSAqIFByb2NlZWQgd2l0aG91dCBhY2Nlc3NpbmcgYW55IG5vbmxvY2FsIHN0YXRlLgorCQkgKiBEbyBub3QgZXhpdCB0aGUgbG9vcCAtLSBtdXN0IGNoZWNrIGZvciBtb3JlIHdvcmsuCisJCSAqLworCisJCXN3aWR4ID0gd3BvcnQtPnN3Yl9pX2lkeDsKKwkJbmIgPSBod19hdmFpbDsKKwkJaWYgKG5iID4gc3dfYXZhaWwpCisJCQluYiA9IHN3X2F2YWlsOworCQlpZiAobmIgPiBod3NpemUgLSBzd3B0cikKKwkJCW5iID0gaHdzaXplIC0gc3dwdHI7IC8qIGRvbid0IG92ZXJmbG93IGh3YnVmICovCisJCWlmIChuYiA+IHN3c2l6ZSAtIHN3aWR4KQorCQkJbmIgPSBzd3NpemUgLSBzd2lkeDsgLyogZG9uJ3Qgb3ZlcmZsb3cgc3didWYgKi8KKwkJQVNTRVJUKG5iID4gMCk7CisJCWlmIChuYiAlIGZyYWdzaXplKSB7CisJCQlEQkdQKCJuYiA9ICVkLCBmcmFnc2l6ZSA9ICVkXG4iLCBuYiwgZnJhZ3NpemUpOworCQkJREJHUCgiaHdfYXZhaWwgPSAlZFxuIiwgaHdfYXZhaWwpOworCQkJREJHUCgic3dfYXZhaWwgPSAlZFxuIiwgc3dfYXZhaWwpOworCQkJREJHUCgiaHdzaXplID0gJWQsIHN3cHRyID0gJWRcbiIsIGh3c2l6ZSwgc3dwdHIpOworCQkJREJHUCgic3dzaXplID0gJWQsIHN3aWR4ID0gJWRcbiIsIHN3c2l6ZSwgc3dpZHgpOworCQl9CisJCUFTU0VSVCghKG5iICUgZnJhZ3NpemUpKTsKKwkJREJHUFYoImNvcHlpbmcgc3diWyVkLi4lZF0gdG8gaHdiWyVkLi4lZF1cbiIsCisJCSAgICAgIHN3aWR4LCBzd2lkeCArIG5iLCBzd3B0ciwgc3dwdHIgKyBuYik7CisJCXBjbV9jb3B5X291dCh3cG9ydCwgc3dpZHgsIHN3cHRyLCBuYik7CisJCWxpX3dyaXRlX3N3cHRyKCZ3cG9ydC0+Y2hhbiwgKHN3cHRyICsgbmIpICUgaHdzaXplKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOworCQlpZiAoaHdzdGF0ZSA9PSBIV19TVE9QUEVEKSB7CisJCQlEQkdQVigic3RhcnRpbmdcbiIpOworCQkJbGlfYWN0aXZhdGVfZG1hKCZ3cG9ydC0+Y2hhbik7CisJCQl3cG9ydC0+aHdzdGF0ZSA9IEhXX1JVTk5JTkc7CisJCQlsaV9yZWFkX1VTVE1TQygmd3BvcnQtPmNoYW4sICZ1c3Rtc2MpOworCQkJQVNTRVJUKHdwb3J0LT5ieXRlX2NvdW50ICUgd3BvcnQtPmZyYW1lX3NpemUgPT0gMCk7CisJCQl3cG9ydC0+TVNDX29mZnNldCA9IHVzdG1zYy5tc2MgLSB3cG9ydC0+Ynl0ZV9jb3VudCAvIHdwb3J0LT5mcmFtZV9zaXplOworCQl9CisJCV9fc3diX2luY19pKHdwb3J0LCBuYik7CisJCXdwb3J0LT5ieXRlX2NvdW50ICs9IG5iOworCQl3cG9ydC0+ZnJhZ19jb3VudCArPSBuYiAvIGZyYWdzaXplOworCQlBU1NFUlQobmIgJSBmcmFnc2l6ZSA9PSAwKTsKKwkJd2FrZV91cCgmd3BvcnQtPnF1ZXVlKTsKKwl9CisJd3BvcnQtPmZsYWdzICY9IH5IV19CVVNZOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndwb3J0LT5sb2NrLCBpZmxhZ3MpOworCURCR1JWKCk7Cit9CisKKy8qCisgKiBwY21faW5wdXQoKSBpcyBjYWxsZWQgYm90aCBmcm9tIGJhc2VsZXZlbCBhbmQgZnJvbSBpbnRlcnJ1cHQgbGV2ZWwuCisgKiBUaGlzIGlzIHdoZXJlIGF1ZGlvIGZyYW1lcyBhcmUgY29waWVkIG91dCBvZiB0aGUgaGFyZHdhcmUtYWNjZXNzaWJsZQorICogcmluZyBidWZmZXIuCisgKgorICogTG9ja2luZyBub3RlOiBUaGUgcGFydCBvZiB0aGlzIHJvdXRpbmUgdGhhdCBmaWd1cmVzIG91dCB3aGF0IHRvIGRvCisgKiBob2xkcyBycG9ydC0+bG9jay4gIFRoZSBsb25nZXIgcGFydCByZWxlYXNlcyBycG9ydC0+bG9jaywgYnV0IHNldHMKKyAqIHJwb3J0LT5mbGFncyAmIEhXX0JVU1kuICBBZnRlcndhcmQsIGl0IHJlYWNxdWlyZXMgcnBvcnQtPmxvY2ssIGFuZAorICogY2hlY2tzIGZvciBtb3JlIHdvcmsgdG8gZG8uCisgKgorICogSWYgYW5vdGhlciB0aHJlYWQgY2FsbHMgcGNtX2lucHV0KCkgd2hpbGUgSFdfQlVTWSBpcyBzZXQsIGl0CisgKiByZXR1cm5zIGltbWVkaWF0ZWx5LCBrbm93aW5nIHRoYXQgdGhlIHRocmVhZCB0aGF0IHNldCBIV19CVVNZIHdpbGwKKyAqIGxvb2sgZm9yIG1vcmUgd29yayB0byBkbyBiZWZvcmUgcmV0dXJuaW5nLgorICoKKyAqIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2UgdGhhdCBwb3J0LT5sb2NrIGlzIGhlbGQgZm9yIHNldmVyYWwgc2hvcnQKKyAqIHBlcmlvZHMgaW5zdGVhZCBvZiBvbmUgbG9uZyBwZXJpb2QuICBBbHNvLCB3aGVuIHBjbV9pbnB1dCBpcworICogY2FsbGVkIGZyb20gYmFzZSBsZXZlbCwgaXQgcmVlbmFibGVzIGludGVycnVwdHMuCisgKi8KKworc3RhdGljIHZvaWQgcGNtX2lucHV0KHZ3c25kX2Rldl90ICpkZXZjLCBpbnQgZXJmbG93biwgaW50IG5iKQoreworCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAmZGV2Yy0+cnBvcnQ7CisJY29uc3QgaW50IGh3bWF4ICA9IHJwb3J0LT5od2J1Zl9tYXg7CisJY29uc3QgaW50IGh3c2l6ZSA9IHJwb3J0LT5od2J1Zl9zaXplOworCWNvbnN0IGludCBzd3NpemUgPSBycG9ydC0+c3didWZfc2l6ZTsKKwljb25zdCBpbnQgZnJhZ3NpemUgPSBycG9ydC0+aHdfZnJhZ3NpemU7CisJdW5zaWduZWQgbG9uZyBpZmxhZ3M7CisKKwlEQkdFVigiKGRldmM9MHglcCwgZXJmbG93bj0lZCwgbmI9JWQpXG4iLCBkZXZjLCBlcmZsb3duLCBuYik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7CisJaWYgKGVyZmxvd24pCisJCXJwb3J0LT5mbGFncyB8PSBFUkZMT1dOOworCSh2b2lkKSBfX3N3Yl9pbmNfdShycG9ydCwgbmIpOworCWlmIChycG9ydC0+ZmxhZ3MgJiBIV19CVVNZIHx8ICFycG9ydC0+c3didWYpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7CisJCURCR1BWKCJyZXR1cm5pbmc6IEhXIEJVU1kgb3IgIXN3YnVmXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocnBvcnQtPmZsYWdzICYgRElTQUJMRUQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7CisJCURCR1BWKCJyZXR1cm5pbmc6IERJU0FCTEVEXG4iKTsKKwkJcmV0dXJuOworCX0KKwlycG9ydC0+ZmxhZ3MgfD0gSFdfQlVTWTsKKwl3aGlsZSAoMSkgeworCQlpbnQgc3dwdHIsIGh3cHRyLCBod19hdmFpbCwgc3dfYXZhaWwsIHN3aWR4OworCQl2d3NuZF9wb3J0X2h3c3RhdGVfdCBod3N0YXRlID0gcnBvcnQtPmh3c3RhdGU7CisJCXZ3c25kX3BvcnRfc3dzdGF0ZV90IHN3c3RhdGUgPSBycG9ydC0+c3dzdGF0ZTsKKworCQlod3B0ciA9IGxpX3JlYWRfaHdwdHIoJnJwb3J0LT5jaGFuKTsKKwkJc3dwdHIgPSBsaV9yZWFkX3N3cHRyKCZycG9ydC0+Y2hhbik7CisJCWh3X2F2YWlsID0gKGh3cHRyIC0gc3dwdHIgKyBod3NpemUpICUgaHdzaXplICYgLWZyYWdzaXplOworCQlpZiAoaHdfYXZhaWwgPiBod21heCkKKwkJCWh3X2F2YWlsID0gaHdtYXg7CisJCXN3X2F2YWlsID0gcnBvcnQtPnN3Yl9pX2F2YWlsICYgLWZyYWdzaXplOworCQlpZiAoc3dzdGF0ZSAhPSBTV19SVU4pIHsKKwkJCURCR1AoInN0b3BwaW5nLiAgaHdzdGF0ZSA9ICVkXG4iLCBod3N0YXRlKTsKKwkJCWlmIChod3N0YXRlICE9IEhXX1NUT1BQRUQpIHsKKwkJCQlsaV9kZWFjdGl2YXRlX2RtYSgmcnBvcnQtPmNoYW4pOworCQkJCXJwb3J0LT5od3N0YXRlID0gSFdfU1RPUFBFRDsKKwkJCX0KKwkJCXdha2VfdXAoJnJwb3J0LT5xdWV1ZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoIXN3X2F2YWlsIHx8ICFod19hdmFpbCkKKwkJCWJyZWFrOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgaWZsYWdzKTsKKworCQkvKgorCQkgKiBXZSBnYXZlIHVwIHRoZSBwb3J0IGxvY2ssIGJ1dCB3ZSBoYXZlIHRoZSBIV19CVVNZIGZsYWcuCisJCSAqIFByb2NlZWQgd2l0aG91dCBhY2Nlc3NpbmcgYW55IG5vbmxvY2FsIHN0YXRlLgorCQkgKiBEbyBub3QgZXhpdCB0aGUgbG9vcCAtLSBtdXN0IGNoZWNrIGZvciBtb3JlIHdvcmsuCisJCSAqLworCisJCXN3aWR4ID0gcnBvcnQtPnN3Yl9pX2lkeDsKKwkJbmIgPSBod19hdmFpbDsKKwkJaWYgKG5iID4gc3dfYXZhaWwpCisJCQluYiA9IHN3X2F2YWlsOworCQlpZiAobmIgPiBod3NpemUgLSBzd3B0cikKKwkJCW5iID0gaHdzaXplIC0gc3dwdHI7IC8qIGRvbid0IG92ZXJmbG93IGh3YnVmICovCisJCWlmIChuYiA+IHN3c2l6ZSAtIHN3aWR4KQorCQkJbmIgPSBzd3NpemUgLSBzd2lkeDsgLyogZG9uJ3Qgb3ZlcmZsb3cgc3didWYgKi8KKwkJQVNTRVJUKG5iID4gMCk7CisJCWlmIChuYiAlIGZyYWdzaXplKSB7CisJCQlEQkdQKCJuYiA9ICVkLCBmcmFnc2l6ZSA9ICVkXG4iLCBuYiwgZnJhZ3NpemUpOworCQkJREJHUCgiaHdfYXZhaWwgPSAlZFxuIiwgaHdfYXZhaWwpOworCQkJREJHUCgic3dfYXZhaWwgPSAlZFxuIiwgc3dfYXZhaWwpOworCQkJREJHUCgiaHdzaXplID0gJWQsIHN3cHRyID0gJWRcbiIsIGh3c2l6ZSwgc3dwdHIpOworCQkJREJHUCgic3dzaXplID0gJWQsIHN3aWR4ID0gJWRcbiIsIHN3c2l6ZSwgc3dpZHgpOworCQl9CisJCUFTU0VSVCghKG5iICUgZnJhZ3NpemUpKTsKKwkJREJHUFYoImNvcHlpbmcgaHdiWyVkLi4lZF0gdG8gc3diWyVkLi4lZF1cbiIsCisJCSAgICAgIHN3cHRyLCBzd3B0ciArIG5iLCBzd2lkeCwgc3dpZHggKyBuYik7CisJCXBjbV9jb3B5X2luKHJwb3J0LCBzd2lkeCwgc3dwdHIsIG5iKTsKKwkJbGlfd3JpdGVfc3dwdHIoJnJwb3J0LT5jaGFuLCAoc3dwdHIgKyBuYikgJSBod3NpemUpOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGlmbGFncyk7CisJCV9fc3diX2luY19pKHJwb3J0LCBuYik7CisJCXJwb3J0LT5ieXRlX2NvdW50ICs9IG5iOworCQlycG9ydC0+ZnJhZ19jb3VudCArPSBuYiAvIGZyYWdzaXplOworCQlBU1NFUlQobmIgJSBmcmFnc2l6ZSA9PSAwKTsKKwkJd2FrZV91cCgmcnBvcnQtPnF1ZXVlKTsKKwl9CisJcnBvcnQtPmZsYWdzICY9IH5IV19CVVNZOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBpZmxhZ3MpOworCURCR1JWKCk7Cit9CisKKy8qCisgKiBwY21fZmx1c2hfZnJhZygpIHdyaXRlcyB6ZXJvIHNhbXBsZXMgdG8gZmlsbCB0aGUgY3VycmVudCBmcmFnbWVudCwKKyAqIHRoZW4gZmx1c2hlcyBpdCB0byB0aGUgaGFyZHdhcmUuCisgKgorICogSXQgaXMgb25seSBtZWFuaW5nZnVsIHRvIGZsdXNoIG91dHB1dCwgbm90IGlucHV0LgorICovCisKK3N0YXRpYyB2b2lkIHBjbV9mbHVzaF9mcmFnKHZ3c25kX2Rldl90ICpkZXZjKQoreworCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAmZGV2Yy0+d3BvcnQ7CisKKwlEQkdQVigic3dzdGF0ZSA9ICVkXG4iLCB3cG9ydC0+c3dzdGF0ZSk7CisJaWYgKHdwb3J0LT5zd3N0YXRlID09IFNXX1JVTikgeworCQlpbnQgaWR4ID0gd3BvcnQtPnN3Yl91X2lkeDsKKwkJaW50IGVuZCA9IChpZHggKyB3cG9ydC0+aHdfZnJhZ3NpemUgLSAxKQorCQkJPj4gd3BvcnQtPmh3X2ZyYWdzaGlmdAorCQkJPDwgd3BvcnQtPmh3X2ZyYWdzaGlmdDsKKwkJaW50IG5iID0gZW5kIC0gaWR4OworCQlEQkdQVigiY2xlYXJpbmcgJWQgYnl0ZXNcbiIsIG5iKTsKKwkJaWYgKG5iKQorCQkJbWVtc2V0KHdwb3J0LT5zd2J1ZiArIGlkeCwKKwkJCSAgICAgICAoY2hhcikgd3BvcnQtPnplcm9fd29yZCwKKwkJCSAgICAgICBuYik7CisJCXdwb3J0LT5zd3N0YXRlID0gU1dfRFJBSU47CisJCXBjbV9vdXRwdXQoZGV2YywgMCwgbmIpOworCX0KKwlEQkdSVigpOworfQorCisvKgorICogV2FpdCBmb3Igb3V0cHV0IHRvIGRyYWluLiAgVGhpcyBzbGVlcHMgdW5pbnRlcnJ1cHRpYmx5IGJlY2F1c2UKKyAqIHRoZXJlIGlzIG5vdGhpbmcgaW50ZWxsaWdlbnQgd2UgY2FuIGRvIGlmIGludGVycnVwdGVkLiAgVGhpcworICogbWVhbnMgdGhlIHByb2Nlc3Mgd2lsbCBiZSBkZWxheWVkIGluIHJlc3BvbmRpbmcgdG8gdGhlIHNpZ25hbC4KKyAqLworCitzdGF0aWMgdm9pZCBwY21fd3JpdGVfc3luYyh2d3NuZF9kZXZfdCAqZGV2YykKK3sKKwl2d3NuZF9wb3J0X3QgKndwb3J0ID0gJmRldmMtPndwb3J0OworCURFQ0xBUkVfV0FJVFFVRVVFKHdhaXQsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdndzbmRfcG9ydF9od3N0YXRlX3QgaHdzdGF0ZTsKKworCURCR0VWKCIoZGV2Yz0weCVwKVxuIiwgZGV2Yyk7CisJYWRkX3dhaXRfcXVldWUoJndwb3J0LT5xdWV1ZSwgJndhaXQpOworCXdoaWxlICgxKSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJndwb3J0LT5sb2NrLCBmbGFncyk7CisJCXsKKwkJCWh3c3RhdGUgPSB3cG9ydC0+aHdzdGF0ZTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQlpZiAoaHdzdGF0ZSA9PSBIV19TVE9QUEVEKQorCQkJYnJlYWs7CisJCXNjaGVkdWxlKCk7CisJfQorCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXJlbW92ZV93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKKwlEQkdQVigic3dzdGF0ZSA9ICVkLCBod3N0YXRlID0gJWRcbiIsIHdwb3J0LT5zd3N0YXRlLCB3cG9ydC0+aHdzdGF0ZSk7CisJREJHUlYoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogYXVkaW8gZHJpdmVyICovCisKKy8qCisgKiBzZWVrIG9uIGFuIGF1ZGlvIGRldmljZSBhbHdheXMgZmFpbHMuCisgKi8KKworc3RhdGljIHZvaWQgdndzbmRfYXVkaW9fcmVhZF9pbnRyKHZ3c25kX2Rldl90ICpkZXZjLCB1bnNpZ25lZCBpbnQgc3RhdHVzKQoreworCWludCBvdmVyZmxvd24gPSBzdGF0dXMgJiBMSV9JTlRSX0NPTU0xX09WRVJGTE9XOworCisJaWYgKHN0YXR1cyAmIFJFQURfSU5UUl9NQVNLKQorCQlwY21faW5wdXQoZGV2Yywgb3ZlcmZsb3duLCAwKTsKK30KKworc3RhdGljIHZvaWQgdndzbmRfYXVkaW9fd3JpdGVfaW50cih2d3NuZF9kZXZfdCAqZGV2YywgdW5zaWduZWQgaW50IHN0YXR1cykKK3sKKwlpbnQgdW5kZXJmbG93biA9IHN0YXR1cyAmIExJX0lOVFJfQ09NTTJfVU5ERVJGTE9XOworCisJaWYgKHN0YXR1cyAmIFdSSVRFX0lOVFJfTUFTSykKKwkJcGNtX291dHB1dChkZXZjLCB1bmRlcmZsb3duLCAwKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHZ3c25kX2F1ZGlvX2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBkZXZfaWQ7CisJdW5zaWduZWQgaW50IHN0YXR1czsKKworCURCR0VWKCIoaXJxPSVkLCBkZXZfaWQ9MHglcCwgcmVncz0weCVwKVxuIiwgaXJxLCBkZXZfaWQsIHJlZ3MpOworCisJc3RhdHVzID0gbGlfZ2V0X2NsZWFyX2ludHJfc3RhdHVzKCZkZXZjLT5saXRoKTsKKwl2d3NuZF9hdWRpb19yZWFkX2ludHIoZGV2Yywgc3RhdHVzKTsKKwl2d3NuZF9hdWRpb193cml0ZV9pbnRyKGRldmMsIHN0YXR1cyk7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3NpemVfdCB2d3NuZF9hdWRpb19kb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLAorCQkJCSAgIGNoYXIgKmJ1ZmZlciwKKwkJCQkgICBzaXplX3QgY291bnQsCisJCQkJICAgbG9mZl90ICpwcG9zKQoreworCXZ3c25kX2Rldl90ICpkZXZjID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KKwkJCSAgICAgICAmZGV2Yy0+cnBvcnQgOiBOVUxMKTsKKwlpbnQgcmV0LCBuYjsKKworCURCR0VWKCIoZmlsZT0weCVwLCBidWZmZXI9MHglcCwgY291bnQ9JWQsIHBwb3M9MHglcClcbiIsCisJICAgICBmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKKworCWlmICghcnBvcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHJwb3J0LT5zd2J1ZiA9PSBOVUxMKSB7CisJCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8KKwkJCSZkZXZjLT53cG9ydCA6IE5VTEw7CisJCXJldCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJfQorCisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsIGJ1ZmZlciwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXQgPSAwOworCXdoaWxlIChjb3VudCkgeworCQlERUNMQVJFX1dBSVRRVUVVRSh3YWl0LCBjdXJyZW50KTsKKwkJYWRkX3dhaXRfcXVldWUoJnJwb3J0LT5xdWV1ZSwgJndhaXQpOworCQl3aGlsZSAoKG5iID0gc3diX2luY191KHJwb3J0LCAwKSkgPT0gMCkgeworCQkJREJHUFYoImJsb2NraW5nXG4iKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAocnBvcnQtPmZsYWdzICYgRElTQUJMRUQgfHwKKwkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZycG9ydC0+cXVldWUsICZ3YWl0KTsKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmcnBvcnQtPnF1ZXVlLCAmd2FpdCk7CisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKKwkJCX0KKwkJfQorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJnJwb3J0LT5xdWV1ZSwgJndhaXQpOworCQlwY21faW5wdXQoZGV2YywgMCwgMCk7CisJCS8qIG5iIGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdXNlcmJ1Zi4gKi8KKwkJaWYgKG5iID4gY291bnQpCisJCQluYiA9IGNvdW50OworCQlEQkdQVigibmIgPSAlZFxuIiwgbmIpOworCQlpZiAoY29weV90b191c2VyKGJ1ZmZlciwgcnBvcnQtPnN3YnVmICsgcnBvcnQtPnN3Yl91X2lkeCwgbmIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCSh2b2lkKSBzd2JfaW5jX3UocnBvcnQsIG5iKTsKKwkJYnVmZmVyICs9IG5iOworCQljb3VudCAtPSBuYjsKKwkJcmV0ICs9IG5iOworCX0KKwlEQkdQVigicmV0dXJuaW5nICVkXG4iLCByZXQpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHZ3c25kX2F1ZGlvX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJY2hhciAqYnVmZmVyLAorCQkJCXNpemVfdCBjb3VudCwKKwkJCQlsb2ZmX3QgKnBwb3MpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisKKwlkb3duKCZkZXZjLT5pb19zZW1hKTsKKwlyZXQgPSB2d3NuZF9hdWRpb19kb19yZWFkKGZpbGUsIGJ1ZmZlciwgY291bnQsIHBwb3MpOworCXVwKCZkZXZjLT5pb19zZW1hKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3NpemVfdCB2d3NuZF9hdWRpb19kb193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQkgICAgY29uc3QgY2hhciAqYnVmZmVyLAorCQkJCSAgICBzaXplX3QgY291bnQsCisJCQkJICAgIGxvZmZfdCAqcHBvcykKK3sKKwl2d3NuZF9kZXZfdCAqZGV2YyA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwl2d3NuZF9wb3J0X3QgKndwb3J0ID0gKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgPworCQkJICAgICAgICZkZXZjLT53cG9ydCA6IE5VTEwpOworCWludCByZXQsIG5iOworCisJREJHRVYoIihmaWxlPTB4JXAsIGJ1ZmZlcj0weCVwLCBjb3VudD0lZCwgcHBvcz0weCVwKVxuIiwKKwkgICAgICBmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKKworCWlmICghd3BvcnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHdwb3J0LT5zd2J1ZiA9PSBOVUxMKSB7CisJCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPworCQkJJmRldmMtPnJwb3J0IDogTlVMTDsKKwkJcmV0ID0gcGNtX3NldHVwKGRldmMsIHJwb3J0LCB3cG9ydCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwl9CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBidWZmZXIsIGNvdW50KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJcmV0ID0gMDsKKwl3aGlsZSAoY291bnQpIHsKKwkJREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3VycmVudCk7CisJCWFkZF93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKKwkJd2hpbGUgKChuYiA9IHN3Yl9pbmNfdSh3cG9ydCwgMCkpID09IDApIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAod3BvcnQtPmZsYWdzICYgRElTQUJMRUQgfHwKKwkJCSAgICBmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkJCWN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQkJCXJlbW92ZV93YWl0X3F1ZXVlKCZ3cG9ydC0+cXVldWUsICZ3YWl0KTsKKwkJCQlyZXR1cm4gcmV0ID8gcmV0IDogLUVBR0FJTjsKKwkJCX0KKwkJCXNjaGVkdWxlKCk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJCQlyZW1vdmVfd2FpdF9xdWV1ZSgmd3BvcnQtPnF1ZXVlLCAmd2FpdCk7CisJCQkJcmV0dXJuIHJldCA/IHJldCA6IC1FUkVTVEFSVFNZUzsKKwkJCX0KKwkJfQorCQljdXJyZW50LT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkJcmVtb3ZlX3dhaXRfcXVldWUoJndwb3J0LT5xdWV1ZSwgJndhaXQpOworCQkvKiBuYiBieXRlcyBhcmUgYXZhaWxhYmxlIGluIHVzZXJidWYuICovCisJCWlmIChuYiA+IGNvdW50KQorCQkJbmIgPSBjb3VudDsKKwkJREJHUFYoIm5iID0gJWRcbiIsIG5iKTsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKHdwb3J0LT5zd2J1ZiArIHdwb3J0LT5zd2JfdV9pZHgsIGJ1ZmZlciwgbmIpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXBjbV9vdXRwdXQoZGV2YywgMCwgbmIpOworCQlidWZmZXIgKz0gbmI7CisJCWNvdW50IC09IG5iOworCQlyZXQgKz0gbmI7CisJfQorCURCR1BWKCJyZXR1cm5pbmcgJWRcbiIsIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgdndzbmRfYXVkaW9fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCQkgc2l6ZV90IGNvdW50LAorCQkJCSBsb2ZmX3QgKnBwb3MpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3NpemVfdCByZXQ7CisKKwlkb3duKCZkZXZjLT5pb19zZW1hKTsKKwlyZXQgPSB2d3NuZF9hdWRpb19kb193cml0ZShmaWxlLCBidWZmZXIsIGNvdW50LCBwcG9zKTsKKwl1cCgmZGV2Yy0+aW9fc2VtYSk7CisJcmV0dXJuIHJldDsKK30KKworLyogTm8ga2VybmVsIGxvY2sgLSBmaW5lICovCitzdGF0aWMgdW5zaWduZWQgaW50IHZ3c25kX2F1ZGlvX3BvbGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJICAgICBzdHJ1Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKndhaXQpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZ3c25kX3BvcnRfdCAqcnBvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgPworCQkmZGV2Yy0+cnBvcnQgOiBOVUxMOworCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpID8KKwkJJmRldmMtPndwb3J0IDogTlVMTDsKKwl1bnNpZ25lZCBpbnQgbWFzayA9IDA7CisKKwlEQkdFVigiKGZpbGU9MHglcCwgd2FpdD0weCVwKVxuIiwgZmlsZSwgd2FpdCk7CisKKwlBU1NFUlQocnBvcnQgfHwgd3BvcnQpOworCWlmIChycG9ydCkgeworCQlwb2xsX3dhaXQoZmlsZSwgJnJwb3J0LT5xdWV1ZSwgd2FpdCk7CisJCWlmIChzd2JfaW5jX3UocnBvcnQsIDApKQorCQkJbWFzayB8PSAoUE9MTElOIHwgUE9MTFJETk9STSk7CisJfQorCWlmICh3cG9ydCkgeworCQlwb2xsX3dhaXQoZmlsZSwgJndwb3J0LT5xdWV1ZSwgd2FpdCk7CisJCWlmICh3cG9ydC0+c3didWYgPT0gTlVMTCB8fCBzd2JfaW5jX3Uod3BvcnQsIDApKQorCQkJbWFzayB8PSAoUE9MTE9VVCB8IFBPTExXUk5PUk0pOworCX0KKworCURCR1BWKCJyZXR1cm5pbmcgMHgleFxuIiwgbWFzayk7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgdndzbmRfYXVkaW9fZG9faW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwKKwkJCQlzdHJ1Y3QgZmlsZSAqZmlsZSwKKwkJCQl1bnNpZ25lZCBpbnQgY21kLAorCQkJCXVuc2lnbmVkIGxvbmcgYXJnKQoreworCXZ3c25kX2Rldl90ICpkZXZjID0gKHZ3c25kX2Rldl90ICopIGZpbGUtPnByaXZhdGVfZGF0YTsKKwl2d3NuZF9wb3J0X3QgKnJwb3J0ID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpID8KKwkJJmRldmMtPnJwb3J0IDogTlVMTDsKKwl2d3NuZF9wb3J0X3QgKndwb3J0ID0gKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSA/CisJCSZkZXZjLT53cG9ydCA6IE5VTEw7CisJdndzbmRfcG9ydF90ICphcG9ydCA9IHJwb3J0ID8gcnBvcnQgOiB3cG9ydDsKKwlzdHJ1Y3QgYXVkaW9fYnVmX2luZm8gYnVmX2luZm87CisJc3RydWN0IGNvdW50X2luZm8gaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpdmFsOworCisJCisJREJHRVYoIihpbm9kZT0weCVwLCBmaWxlPTB4JXAsIGNtZD0weCV4LCBhcmc9MHglbHgpXG4iLAorCSAgICAgIGlub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJc3dpdGNoIChjbWQpIHsKKwljYXNlIE9TU19HRVRWRVJTSU9OOgkJLyogX1NJT1IgKCdNJywgMTE4LCBpbnQpICovCisJCURCR1goIk9TU19HRVRWRVJTSU9OXG4iKTsKKwkJaXZhbCA9IFNPVU5EX1ZFUlNJT047CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoJLyogX1NJT1IgKCdQJywxNSwgaW50KSAqLworCQlEQkdYKCJTTkRDVExfRFNQX0dFVENBUFNcbiIpOworCQlpdmFsID0gRFNQX0NBUF9EVVBMRVggfCBEU1BfQ0FQX1JFQUxUSU1FIHwgRFNQX0NBUF9UUklHR0VSOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEZNVFM6CS8qIF9TSU9SICgnUCcsMTEsIGludCkgKi8KKwkJREJHWCgiU05EQ1RMX0RTUF9HRVRGTVRTXG4iKTsKKwkJaXZhbCA9IChBRk1UX1MxNl9MRSB8IEFGTVRfTVVfTEFXIHwgQUZNVF9BX0xBVyB8CisJCQlBRk1UX1U4IHwgQUZNVF9TOCk7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9QQ01fUkVBRF9SQVRFOgkvKiBfU0lPUiAoJ1AnLCAyLCBpbnQpICovCisJCURCR1goIlNPVU5EX1BDTV9SRUFEX1JBVEVcbiIpOworCQlpdmFsID0gYXBvcnQtPnN3X2ZyYW1lcmF0ZTsKKwkJcmV0dXJuIHB1dF91c2VyKGl2YWwsIChpbnQgKikgYXJnKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CS8qIF9TSU9SICgnUCcsIDYsIGludCkgKi8KKwkJREJHWCgiU09VTkRfUENNX1JFQURfQ0hBTk5FTFNcbiIpOworCQlpdmFsID0gYXBvcnQtPnN3X2NoYW5uZWxzOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1NQRUVEOgkJLyogX1NJT1dSKCdQJywgMiwgaW50KSAqLworCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURCR1goIlNORENUTF9EU1BfU1BFRUQgJWRcbiIsIGl2YWwpOworCQlpZiAoaXZhbCkgeworCQkJaWYgKGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpIHsKKwkJCQlEQkdYKCJTTkRDVExfRFNQX1NQRUVEIGZhaWxlZDogc3dzdGF0ZSA9ICVkXG4iLAorCQkJCSAgICAgYXBvcnQtPnN3c3RhdGUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaWYgKGl2YWwgPCBNSU5fU1BFRUQpCisJCQkJaXZhbCA9IE1JTl9TUEVFRDsKKwkJCWlmIChpdmFsID4gTUFYX1NQRUVEKQorCQkJCWl2YWwgPSBNQVhfU1BFRUQ7CisJCQlpZiAocnBvcnQpCisJCQkJcnBvcnQtPnN3X2ZyYW1lcmF0ZSA9IGl2YWw7CisJCQlpZiAod3BvcnQpCisJCQkJd3BvcnQtPnN3X2ZyYW1lcmF0ZSA9IGl2YWw7CisJCX0gZWxzZQorCQkJaXZhbCA9IGFwb3J0LT5zd19mcmFtZXJhdGU7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU1RFUkVPOgkJLyogX1NJT1dSKCdQJywgMywgaW50KSAqLworCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURCR1goIlNORENUTF9EU1BfU1RFUkVPICVkXG4iLCBpdmFsKTsKKwkJaWYgKGl2YWwgIT0gMCAmJiBpdmFsICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKHJwb3J0KQorCQkJcnBvcnQtPnN3X2NoYW5uZWxzID0gaXZhbCArIDE7CisJCWlmICh3cG9ydCkKKwkJCXdwb3J0LT5zd19jaGFubmVscyA9IGl2YWwgKyAxOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgkvKiBfU0lPV1IoJ1AnLCA2LCBpbnQpICovCisJCWlmIChnZXRfdXNlcihpdmFsLCAoaW50ICopIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJREJHWCgiU05EQ1RMX0RTUF9DSEFOTkVMUyAlZFxuIiwgaXZhbCk7CisJCWlmIChpdmFsICE9IDEgJiYgaXZhbCAhPSAyKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWlmIChycG9ydCkKKwkJCXJwb3J0LT5zd19jaGFubmVscyA9IGl2YWw7CisJCWlmICh3cG9ydCkKKwkJCXdwb3J0LT5zd19jaGFubmVscyA9IGl2YWw7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQkxLU0laRToJLyogX1NJT1dSKCdQJywgNCwgaW50KSAqLworCQlpdmFsID0gcGNtX3NldHVwKGRldmMsIHJwb3J0LCB3cG9ydCk7CisJCWlmIChpdmFsIDwgMCkgeworCQkJREJHWCgiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIGZhaWxlZCwgZXJybm8gJWRcbiIsIGl2YWwpOworCQkJcmV0dXJuIGl2YWw7CisJCX0KKwkJaXZhbCA9IDEgPDwgYXBvcnQtPnN3X2ZyYWdzaGlmdDsKKwkJREJHWCgiU05EQ1RMX0RTUF9HRVRCTEtTSVpFIHJldHVybmluZyAlZFxuIiwgaXZhbCk7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CS8qIF9TSU9XUignUCcsMTAsIGludCkgKi8KKwkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlEQkdYKCJTTkRDVExfRFNQX1NFVEZSQUdNRU5UICVkOiVkXG4iLAorCQkgICAgIGl2YWwgPj4gMTYsIGl2YWwgJiAweEZGRkYpOworCQlpZiAoYXBvcnQtPnN3c3RhdGUgIT0gU1dfSU5JVElBTCkKKwkJCXJldHVybiAtRUlOVkFMOworCQl7CisJCQlpbnQgc3dfZnJhZ3NoaWZ0ID0gaXZhbCAmIDB4RkZGRjsKKwkJCWludCBzd19zdWJkaXZzaGlmdCA9IGFwb3J0LT5zd19zdWJkaXZzaGlmdDsKKwkJCWludCBod19mcmFnc2hpZnQgPSBzd19mcmFnc2hpZnQgLSBzd19zdWJkaXZzaGlmdDsKKwkJCWludCBzd19mcmFnY291bnQgPSAoaXZhbCA+PiAxNikgJiAweEZGRkY7CisJCQlpbnQgaHdfZnJhZ3NpemU7CisJCQlpZiAoaHdfZnJhZ3NoaWZ0IDwgTUlOX0ZSQUdTSElGVCkKKwkJCQlod19mcmFnc2hpZnQgPSBNSU5fRlJBR1NISUZUOworCQkJaWYgKGh3X2ZyYWdzaGlmdCA+IE1BWF9GUkFHU0hJRlQpCisJCQkJaHdfZnJhZ3NoaWZ0ID0gTUFYX0ZSQUdTSElGVDsKKwkJCXN3X2ZyYWdzaGlmdCA9IGh3X2ZyYWdzaGlmdCArIGFwb3J0LT5zd19zdWJkaXZzaGlmdDsKKwkJCWh3X2ZyYWdzaXplID0gMSA8PCBod19mcmFnc2hpZnQ7CisJCQlpZiAoc3dfZnJhZ2NvdW50IDwgTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkpCisJCQkJc3dfZnJhZ2NvdW50ID0gTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSk7CisJCQlpZiAoc3dfZnJhZ2NvdW50ID4gTUFYX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkpCisJCQkJc3dfZnJhZ2NvdW50ID0gTUFYX0ZSQUdDT1VOVChod19mcmFnc2l6ZSk7CisJCQlEQkdQVigic3dfZnJhZ3NoaWZ0ID0gJWRcbiIsIHN3X2ZyYWdzaGlmdCk7CisJCQlEQkdQVigicnBvcnQgPSAweCVwLCB3cG9ydCA9IDB4JXBcbiIsIHJwb3J0LCB3cG9ydCk7CisJCQlpZiAocnBvcnQpIHsKKwkJCQlycG9ydC0+c3dfZnJhZ3NoaWZ0ID0gc3dfZnJhZ3NoaWZ0OworCQkJCXJwb3J0LT5zd19mcmFnY291bnQgPSBzd19mcmFnY291bnQ7CisJCQl9CisJCQlpZiAod3BvcnQpIHsKKwkJCQl3cG9ydC0+c3dfZnJhZ3NoaWZ0ID0gc3dfZnJhZ3NoaWZ0OworCQkJCXdwb3J0LT5zd19mcmFnY291bnQgPSBzd19mcmFnY291bnQ7CisJCQl9CisJCQlpdmFsID0gc3dfZnJhZ2NvdW50IDw8IDE2IHwgc3dfZnJhZ3NoaWZ0OworCQl9CisJCURCR1goIlNORENUTF9EU1BfU0VURlJBR01FTlQgcmV0dXJucyAlZDolZFxuIiwKKwkJICAgICAgaXZhbCA+PiAxNiwgaXZhbCAmIDB4RkZGRik7CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU1VCRElWSURFOgkvKiBfU0lPV1IoJ1AnLCA5LCBpbnQpICovCisgICAgICAgICAgICAgICAgaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlEQkdYKCJTTkRDVExfRFNQX1NVQkRJVklERSAlZFxuIiwgaXZhbCk7CisJCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXsKKwkJCWludCBzdWJkaXZzaGlmdDsKKwkJCWludCBod19mcmFnc2hpZnQsIGh3X2ZyYWdzaXplLCBod19mcmFnY291bnQ7CisJCQlzd2l0Y2ggKGl2YWwpIHsKKwkJCWNhc2UgMTogc3ViZGl2c2hpZnQgPSAwOyBicmVhazsKKwkJCWNhc2UgMjogc3ViZGl2c2hpZnQgPSAxOyBicmVhazsKKwkJCWNhc2UgNDogc3ViZGl2c2hpZnQgPSAyOyBicmVhazsKKwkJCWRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaHdfZnJhZ3NoaWZ0ID0gYXBvcnQtPnN3X2ZyYWdzaGlmdCAtIHN1YmRpdnNoaWZ0OworCQkJaWYgKGh3X2ZyYWdzaGlmdCA8IE1JTl9GUkFHU0hJRlQgfHwKKwkJCSAgICBod19mcmFnc2hpZnQgPiBNQVhfRlJBR1NISUZUKQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJaHdfZnJhZ3NpemUgPSAxIDw8IGh3X2ZyYWdzaGlmdDsKKwkJCWh3X2ZyYWdjb3VudCA9IGFwb3J0LT5zd19mcmFnY291bnQgPj4gc3ViZGl2c2hpZnQ7CisJCQlpZiAoaHdfZnJhZ2NvdW50IDwgTUlOX0ZSQUdDT1VOVChod19mcmFnc2l6ZSkgfHwKKwkJCSAgICBod19mcmFnY291bnQgPiBNQVhfRlJBR0NPVU5UKGh3X2ZyYWdzaXplKSkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmIChycG9ydCkKKwkJCQlycG9ydC0+c3dfc3ViZGl2c2hpZnQgPSBzdWJkaXZzaGlmdDsKKwkJCWlmICh3cG9ydCkKKwkJCQl3cG9ydC0+c3dfc3ViZGl2c2hpZnQgPSBzdWJkaXZzaGlmdDsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TRVRGTVQ6CQkvKiBfU0lPV1IoJ1AnLDUsIGludCkgKi8KKwkJaWYgKGdldF91c2VyKGl2YWwsIChpbnQgKikgYXJnKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlEQkdYKCJTTkRDVExfRFNQX1NFVEZNVCAlZFxuIiwgaXZhbCk7CisJCWlmIChpdmFsICE9IEFGTVRfUVVFUlkpIHsKKwkJCWlmIChhcG9ydC0+c3dzdGF0ZSAhPSBTV19JTklUSUFMKSB7CisJCQkJREJHUCgiU0VURk1UIGZhaWxlZCwgc3dzdGF0ZSA9ICVkXG4iLAorCQkJCSAgICAgYXBvcnQtPnN3c3RhdGUpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJc3dpdGNoIChpdmFsKSB7CisJCQljYXNlIEFGTVRfTVVfTEFXOgorCQkJY2FzZSBBRk1UX0FfTEFXOgorCQkJY2FzZSBBRk1UX1U4OgorCQkJY2FzZSBBRk1UX1M4OgorCQkJY2FzZSBBRk1UX1MxNl9MRToKKwkJCQlpZiAocnBvcnQpCisJCQkJCXJwb3J0LT5zd19zYW1wbGVmbXQgPSBpdmFsOworCQkJCWlmICh3cG9ydCkKKwkJCQkJd3BvcnQtPnN3X3NhbXBsZWZtdCA9IGl2YWw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQl9CisJCWl2YWwgPSBhcG9ydC0+c3dfc2FtcGxlZm10OworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToJLyogX1NJT1IgKCdQJywxMiwgYXVkaW9fYnVmX2luZm8pICovCisJCURCR1hWKCJTTkRDVExfRFNQX0dFVE9TUEFDRVxuIik7CisJCWlmICghd3BvcnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaXZhbCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOworCQlpZiAoaXZhbCA8IDApCisJCQlyZXR1cm4gaXZhbDsKKwkJaXZhbCA9IHN3Yl9pbmNfdSh3cG9ydCwgMCk7CisJCWJ1Zl9pbmZvLmZyYWdtZW50cyA9IGl2YWwgPj4gd3BvcnQtPnN3X2ZyYWdzaGlmdDsKKwkJYnVmX2luZm8uZnJhZ3N0b3RhbCA9IHdwb3J0LT5zd19mcmFnY291bnQ7CisJCWJ1Zl9pbmZvLmZyYWdzaXplID0gMSA8PCB3cG9ydC0+c3dfZnJhZ3NoaWZ0OworCQlidWZfaW5mby5ieXRlcyA9IGl2YWw7CisJCURCR1hWKCJTTkRDVExfRFNQX0dFVE9TUEFDRSByZXR1cm5zIHsgJWQgJWQgJWQgJWQgfVxuIiwKKwkJICAgICBidWZfaW5mby5mcmFnbWVudHMsIGJ1Zl9pbmZvLmZyYWdzdG90YWwsCisJCSAgICAgYnVmX2luZm8uZnJhZ3NpemUsIGJ1Zl9pbmZvLmJ5dGVzKTsKKwkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKSBhcmcsICZidWZfaW5mbywgc2l6ZW9mIGJ1Zl9pbmZvKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CS8qIF9TSU9SICgnUCcsMTMsIGF1ZGlvX2J1Zl9pbmZvKSAqLworCQlEQkdYKCJTTkRDVExfRFNQX0dFVElTUEFDRVxuIik7CisJCWlmICghcnBvcnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaXZhbCA9IHBjbV9zZXR1cChkZXZjLCBycG9ydCwgd3BvcnQpOworCQlpZiAoaXZhbCA8IDApCisJCQlyZXR1cm4gaXZhbDsKKwkJaXZhbCA9IHN3Yl9pbmNfdShycG9ydCwgMCk7CisJCWJ1Zl9pbmZvLmZyYWdtZW50cyA9IGl2YWwgPj4gcnBvcnQtPnN3X2ZyYWdzaGlmdDsKKwkJYnVmX2luZm8uZnJhZ3N0b3RhbCA9IHJwb3J0LT5zd19mcmFnY291bnQ7CisJCWJ1Zl9pbmZvLmZyYWdzaXplID0gMSA8PCBycG9ydC0+c3dfZnJhZ3NoaWZ0OworCQlidWZfaW5mby5ieXRlcyA9IGl2YWw7CisJCURCR1goIlNORENUTF9EU1BfR0VUSVNQQUNFIHJldHVybnMgeyAlZCAlZCAlZCAlZCB9XG4iLAorCQkgICAgIGJ1Zl9pbmZvLmZyYWdtZW50cywgYnVmX2luZm8uZnJhZ3N0b3RhbCwKKwkJICAgICBidWZfaW5mby5mcmFnc2l6ZSwgYnVmX2luZm8uYnl0ZXMpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmJ1Zl9pbmZvLCBzaXplb2YgYnVmX2luZm8pKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX05PTkJMT0NLOgkvKiBfU0lPICAoJ1AnLDE0KSAqLworCQlEQkdYKCJTTkRDVExfRFNQX05PTkJMT0NLXG4iKTsKKwkJZmlsZS0+Zl9mbGFncyB8PSBPX05PTkJMT0NLOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9SRVNFVDoJCS8qIF9TSU8gICgnUCcsIDApICovCisJCURCR1goIlNORENUTF9EU1BfUkVTRVRcbiIpOworCQkvKgorCQkgKiBOb3RoaW5nIHNwZWNpYWwgbmVlZHMgdG8gYmUgZG9uZSBmb3IgaW5wdXQuICBJbnB1dAorCQkgKiBzYW1wbGVzIHNpdCBpbiBzd2J1ZiwgYnV0IGl0IHdpbGwgYmUgcmVpbml0aWFsaXplZAorCQkgKiB0byBlbXB0eSB3aGVuIHBjbV9zZXR1cCgpIGlzIGNhbGxlZC4KKwkJICovCisJCWlmICh3cG9ydCAmJiB3cG9ydC0+c3didWYpIHsKKwkJCXdwb3J0LT5zd3N0YXRlID0gU1dfSU5JVElBTDsKKwkJCXBjbV9vdXRwdXQoZGV2YywgMCwgMCk7CisJCQlwY21fd3JpdGVfc3luYyhkZXZjKTsKKwkJfQorCQlwY21fc2h1dGRvd24oZGV2YywgcnBvcnQsIHdwb3J0KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1lOQzoJCS8qIF9TSU8gICgnUCcsIDEpICovCisJCURCR1goIlNORENUTF9EU1BfU1lOQ1xuIik7CisJCWlmICh3cG9ydCkgeworCQkJcGNtX2ZsdXNoX2ZyYWcoZGV2Yyk7CisJCQlwY21fd3JpdGVfc3luYyhkZXZjKTsKKwkJfQorCQlwY21fc2h1dGRvd24oZGV2YywgcnBvcnQsIHdwb3J0KTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfUE9TVDoJCS8qIF9TSU8gICgnUCcsIDgpICovCisJCURCR1goIlNORENUTF9EU1BfUE9TVFxuIik7CisJCWlmICghd3BvcnQpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJcGNtX2ZsdXNoX2ZyYWcoZGV2Yyk7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CS8qIF9TSU9SICgnUCcsIDE3LCBjb3VudF9pbmZvKSAqLworCQlEQkdYKCJTTkRDVExfRFNQX0dFVElQVFJcbiIpOworCQlpZiAoIXJwb3J0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZycG9ydC0+bG9jaywgZmxhZ3MpOworCQl7CisJCQl1c3Rtc2NfdCB1c3Rtc2M7CisJCQlpZiAocnBvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgeworCQkJCUFTU0VSVChycG9ydC0+c3dzdGF0ZSA9PSBTV19SVU4pOworCQkJCWxpX3JlYWRfVVNUTVNDKCZycG9ydC0+Y2hhbiwgJnVzdG1zYyk7CisJCQkJaW5mby5ieXRlcyA9IHVzdG1zYy5tc2MgLSBycG9ydC0+TVNDX29mZnNldDsKKwkJCQlpbmZvLmJ5dGVzICo9IHJwb3J0LT5mcmFtZV9zaXplOworCQkJfSBlbHNlIHsKKwkJCQlpbmZvLmJ5dGVzID0gcnBvcnQtPmJ5dGVfY291bnQ7CisJCQl9CisJCQlpbmZvLmJsb2NrcyA9IHJwb3J0LT5mcmFnX2NvdW50OworCQkJaW5mby5wdHIgPSAwOwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwkJCXJwb3J0LT5mcmFnX2NvdW50ID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZycG9ydC0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmluZm8sIHNpemVvZiBpbmZvKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgkvKiBfU0lPUiAoJ1AnLDE4LCBjb3VudF9pbmZvKSAqLworCQlEQkdYKCJTTkRDVExfRFNQX0dFVE9QVFJcbiIpOworCQlpZiAoIXdwb3J0KQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQl7CisJCQl1c3Rtc2NfdCB1c3Rtc2M7CisJCQlpZiAod3BvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgeworCQkJCUFTU0VSVCh3cG9ydC0+c3dzdGF0ZSA9PSBTV19SVU4pOworCQkJCWxpX3JlYWRfVVNUTVNDKCZ3cG9ydC0+Y2hhbiwgJnVzdG1zYyk7CisJCQkJaW5mby5ieXRlcyA9IHVzdG1zYy5tc2MgLSB3cG9ydC0+TVNDX29mZnNldDsKKwkJCQlpbmZvLmJ5dGVzICo9IHdwb3J0LT5mcmFtZV9zaXplOworCQkJfSBlbHNlIHsKKwkJCQlpbmZvLmJ5dGVzID0gd3BvcnQtPmJ5dGVfY291bnQ7CisJCQl9CisJCQlpbmZvLmJsb2NrcyA9IHdwb3J0LT5mcmFnX2NvdW50OworCQkJaW5mby5wdHIgPSAwOwkvKiBub3QgaW1wbGVtZW50ZWQgKi8KKwkJCXdwb3J0LT5mcmFnX2NvdW50ID0gMDsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQlpZiAoY29weV90b191c2VyKCh2b2lkICopIGFyZywgJmluZm8sIHNpemVvZiBpbmZvKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPREVMQVk6CS8qIF9TSU9SICgnUCcsIDIzLCBpbnQpICovCisJCURCR1goIlNORENUTF9EU1BfR0VUT0RFTEFZXG4iKTsKKwkJaWYgKCF3cG9ydCkKKwkJCXJldHVybiAtRUlOVkFMOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKKwkJeworCQkJaW50IGZzaXplID0gd3BvcnQtPmZyYW1lX3NpemU7CisJCQlpdmFsID0gd3BvcnQtPnN3Yl9pX2F2YWlsIC8gZnNpemU7CisJCQlpZiAod3BvcnQtPmh3c3RhdGUgPT0gSFdfUlVOTklORykgeworCQkJCWludCBzd3B0ciwgaHdwdHIsIGh3ZnJhbWVzLCBod2J5dGVzLCBod3NpemU7CisJCQkJaW50IHRvdGFsaHdieXRlczsKKwkJCQl1c3Rtc2NfdCB1c3Rtc2M7CisKKwkJCQlod3NpemUgPSB3cG9ydC0+aHdidWZfc2l6ZTsKKwkJCQlzd3B0ciA9IGxpX3JlYWRfc3dwdHIoJndwb3J0LT5jaGFuKTsKKwkJCQlsaV9yZWFkX1VTVE1TQygmd3BvcnQtPmNoYW4sICZ1c3Rtc2MpOworCQkJCWh3ZnJhbWVzID0gdXN0bXNjLm1zYyAtIHdwb3J0LT5NU0Nfb2Zmc2V0OworCQkJCXRvdGFsaHdieXRlcyA9IGh3ZnJhbWVzICogZnNpemU7CisJCQkJaHdwdHIgPSB0b3RhbGh3Ynl0ZXMgJSBod3NpemU7CisJCQkJaHdieXRlcyA9IChzd3B0ciAtIGh3cHRyICsgaHdzaXplKSAlIGh3c2l6ZTsKKwkJCQlpdmFsICs9IGh3Ynl0ZXMgLyBmc2l6ZTsKKwkJCX0KKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gcHV0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpOworCisJY2FzZSBTTkRDVExfRFNQX1BST0ZJTEU6CS8qIF9TSU9XICgnUCcsIDIzLCBpbnQpICovCisJCURCR1goIlNORENUTF9EU1BfUFJPRklMRVxuIik7CisKKwkJLyoKKwkJICogVGhvbWFzIFNhaWxlciBleHBsYWlucyBTTkRDVExfRFNQX1BST0ZJTEUKKwkJICogKHByaXZhdGUgZW1haWwsIE1hcmNoIDI0LCAxOTk5KToKKwkJICoKKwkJICogICAgIFRoaXMgZ2l2ZXMgdGhlIHNvdW5kIGRyaXZlciBhIGhpbnQgb24gd2hhdCBpdAorCQkgKiAgICAgc2hvdWxkIGRvIHdpdGggcGFydGlhbCBmcmFnbWVudHMKKwkJICogICAgIChpLmUuIGZyYWdtZW50cyBwYXJ0aWFsbHkgZmlsbGVkIHdpdGggd3JpdGUpLgorCQkgKiAgICAgVGhpcyBjYW4gZGlyZWN0IHRoZSBkcml2ZXIgdG8gemVybyB0aGVtIG9yCisJCSAqICAgICBsZWF2ZSB0aGVtIGFsb25lLiAgQnV0IGRvbid0IGFzayBtZSB3aGF0IHRoaXMKKwkJICogICAgIGlzIGdvb2QgZm9yLCBteSBkcml2ZXIganVzdCB6ZXJvZXMgdGhlIGxhc3QKKwkJICogICAgIGZyYWdtZW50IGJlZm9yZSB0aGUgcmVjZWl2ZXIgc3RvcHMsIG5vIGlkZWEKKwkJICogICAgIHdoYXQgZ29vZCBmb3IgYW55IG90aGVyIGJlaGF2aW91ciBjb3VsZAorCQkgKiAgICAgYmUuIEltcGxlbWVudGluZyBpdCBhcyBOT1Agc2VlbXMgc2FmZS4KKwkJICovCisKKwkJYnJlYWs7CisKKwljYXNlIFNORENUTF9EU1BfR0VUVFJJR0dFUjoJLyogX1NJT1IgKCdQJywxNiwgaW50KSAqLworCQlEQkdYKCJTTkRDVExfRFNQX0dFVFRSSUdHRVJcbiIpOworCQlpdmFsID0gMDsKKwkJaWYgKHJwb3J0KSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCXsKKwkJCQlpZiAoIShycG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkpCisJCQkJCWl2YWwgfD0gUENNX0VOQUJMRV9JTlBVVDsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnJwb3J0LT5sb2NrLCBmbGFncyk7CisJCX0KKwkJaWYgKHdwb3J0KSB7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCXsKKwkJCQlpZiAoISh3cG9ydC0+ZmxhZ3MgJiBESVNBQkxFRCkpCisJCQkJCWl2YWwgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQl9CisJCXJldHVybiBwdXRfdXNlcihpdmFsLCAoaW50ICopIGFyZyk7CisKKwljYXNlIFNORENUTF9EU1BfU0VUVFJJR0dFUjoJLyogX1NJT1cgKCdQJywxNiwgaW50KSAqLworCQlpZiAoZ2V0X3VzZXIoaXZhbCwgKGludCAqKSBhcmcpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCURCR1goIlNORENUTF9EU1BfU0VUVFJJR0dFUiAlZFxuIiwgaXZhbCk7CisKKwkJLyoKKwkJICogSWYgdXNlciBpcyBkaXNhYmxpbmcgSS9PIGFuZCBwb3J0IGlzIG5vdCBpbiBpbml0aWFsCisJCSAqIHN0YXRlLCBmYWlsIHdpdGggRUlOVkFMLgorCQkgKi8KKworCQlpZiAoKChycG9ydCAmJiAhKGl2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKSkgfHwKKwkJICAgICAod3BvcnQgJiYgIShpdmFsICYgUENNX0VOQUJMRV9PVVRQVVQpKSkgJiYKKwkJICAgIGFwb3J0LT5zd3N0YXRlICE9IFNXX0lOSVRJQUwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlpZiAocnBvcnQpIHsKKwkJCXZ3c25kX3BvcnRfaHdzdGF0ZV90IGh3c3RhdGU7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCXsKKwkJCQlod3N0YXRlID0gcnBvcnQtPmh3c3RhdGU7CisJCQkJaWYgKGl2YWwgJiBQQ01fRU5BQkxFX0lOUFVUKQorCQkJCQlycG9ydC0+ZmxhZ3MgJj0gfkRJU0FCTEVEOworCQkJCWVsc2UKKwkJCQkJcnBvcnQtPmZsYWdzIHw9IERJU0FCTEVEOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcnBvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChod3N0YXRlICE9IEhXX1JVTk5JTkcgJiYgaXZhbCAmIFBDTV9FTkFCTEVfSU5QVVQpIHsKKworCQkJCWlmIChycG9ydC0+c3dzdGF0ZSA9PSBTV19JTklUSUFMKQorCQkJCQlwY21fc2V0dXAoZGV2YywgcnBvcnQsIHdwb3J0KTsKKwkJCQllbHNlCisJCQkJCWxpX2FjdGl2YXRlX2RtYSgmcnBvcnQtPmNoYW4pOworCQkJfQorCQl9CisJCWlmICh3cG9ydCkgeworCQkJdndzbmRfcG9ydF9mbGFnc190IHBmbGFnczsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZ3cG9ydC0+bG9jaywgZmxhZ3MpOworCQkJeworCQkJCXBmbGFncyA9IHdwb3J0LT5mbGFnczsKKwkJCQlpZiAoaXZhbCAmIFBDTV9FTkFCTEVfT1VUUFVUKQorCQkJCQl3cG9ydC0+ZmxhZ3MgJj0gfkRJU0FCTEVEOworCQkJCWVsc2UKKwkJCQkJd3BvcnQtPmZsYWdzIHw9IERJU0FCTEVEOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd3BvcnQtPmxvY2ssIGZsYWdzKTsKKwkJCWlmIChwZmxhZ3MgJiBESVNBQkxFRCAmJiBpdmFsICYgUENNX0VOQUJMRV9PVVRQVVQpIHsKKwkJCQlpZiAod3BvcnQtPnN3c3RhdGUgPT0gU1dfUlVOKQorCQkJCQlwY21fb3V0cHV0KGRldmMsIDAsIDApOworCQkJfQorCQl9CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJREJHUCgidW5rbm93biBpb2N0bCAweCV4XG4iLCBjbWQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJREJHUCgidW5pbXBsZW1lbnRlZCBpb2N0bCAweCV4XG4iLCBjbWQpOworCXJldHVybiAtRUlOVkFMOworfQorCitzdGF0aWMgaW50IHZ3c25kX2F1ZGlvX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsCisJCQkJc3RydWN0IGZpbGUgKmZpbGUsCisJCQkJdW5zaWduZWQgaW50IGNtZCwKKwkJCQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwl2d3NuZF9kZXZfdCAqZGV2YyA9ICh2d3NuZF9kZXZfdCAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CisJaW50IHJldDsKKworCWRvd24oJmRldmMtPmlvX3NlbWEpOworCXJldCA9IHZ3c25kX2F1ZGlvX2RvX2lvY3RsKGlub2RlLCBmaWxlLCBjbWQsIGFyZyk7CisJdXAoJmRldmMtPmlvX3NlbWEpOworCXJldHVybiByZXQ7Cit9CisKKy8qIE5vIG1tYXAuICovCisKK3N0YXRpYyBpbnQgdndzbmRfYXVkaW9fbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJREJHRSgiKGZpbGU9MHglcCwgdm1hPTB4JXApXG4iLCBmaWxlLCB2bWEpOworCXJldHVybiAtRU5PREVWOworfQorCisvKgorICogT3BlbiB0aGUgYXVkaW8gZGV2aWNlIGZvciByZWFkIGFuZC9vciB3cml0ZS4KKyAqCisgKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgLWVycm5vIG9uIGZhaWx1cmUuCisgKi8KKworc3RhdGljIGludCB2d3NuZF9hdWRpb19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXZ3c25kX2Rldl90ICpkZXZjOworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJaW50IHN3X3NhbXBsZWZtdDsKKworCURCR0UoIihpbm9kZT0weCVwLCBmaWxlPTB4JXApXG4iLCBpbm9kZSwgZmlsZSk7CisKKwlJTkNfVVNFX0NPVU5UOworCWZvciAoZGV2YyA9IHZ3c25kX2Rldl9saXN0OyBkZXZjOyBkZXZjID0gZGV2Yy0+bmV4dF9kZXYpCisJCWlmICgoZGV2Yy0+YXVkaW9fbWlub3IgJiB+MHgwRikgPT0gKG1pbm9yICYgfjB4MEYpKQorCQkJYnJlYWs7CisKKwlpZiAoZGV2YyA9PSBOVUxMKSB7CisJCURFQ19VU0VfQ09VTlQ7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWRvd24oJmRldmMtPm9wZW5fc2VtYSk7CisJd2hpbGUgKGRldmMtPm9wZW5fbW9kZSAmIGZpbGUtPmZfbW9kZSkgeworCQl1cCgmZGV2Yy0+b3Blbl9zZW1hKTsKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQlERUNfVVNFX0NPVU5UOworCQkJcmV0dXJuIC1FQlVTWTsKKwkJfQorCQlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKCZkZXZjLT5vcGVuX3dhaXQpOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCURFQ19VU0VfQ09VTlQ7CisJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOworCQl9CisJCWRvd24oJmRldmMtPm9wZW5fc2VtYSk7CisJfQorCWRldmMtPm9wZW5fbW9kZSB8PSBmaWxlLT5mX21vZGUgJiAoRk1PREVfUkVBRCB8IEZNT0RFX1dSSVRFKTsKKwl1cCgmZGV2Yy0+b3Blbl9zZW1hKTsKKworCS8qIGdldCBkZWZhdWx0IHNhbXBsZSBmb3JtYXQgZnJvbSBtaW5vciBudW1iZXIuICovCisKKwlzd19zYW1wbGVmbXQgPSAwOworCWlmICgobWlub3IgJiAweEYpID09IFNORF9ERVZfRFNQKQorCQlzd19zYW1wbGVmbXQgPSBBRk1UX1U4OworCWVsc2UgaWYgKChtaW5vciAmIDB4RikgPT0gU05EX0RFVl9BVURJTykKKwkJc3dfc2FtcGxlZm10ID0gQUZNVF9NVV9MQVc7CisJZWxzZSBpZiAoKG1pbm9yICYgMHhGKSA9PSBTTkRfREVWX0RTUDE2KQorCQlzd19zYW1wbGVmbXQgPSBBRk1UX1MxNl9MRTsKKwllbHNlCisJCUFTU0VSVCgwKTsKKworCS8qIEluaXRpYWxpemUgdndzbmRfcG9ydHMuICovCisKKwlkb3duKCZkZXZjLT5pb19zZW1hKTsKKwl7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQlkZXZjLT5ycG9ydC5zd3N0YXRlICAgICAgICA9IFNXX0lOSVRJQUw7CisJCQlkZXZjLT5ycG9ydC5mbGFncyAgICAgICAgICA9IDA7CisJCQlkZXZjLT5ycG9ydC5zd19jaGFubmVscyAgICA9IDE7CisJCQlkZXZjLT5ycG9ydC5zd19zYW1wbGVmbXQgICA9IHN3X3NhbXBsZWZtdDsKKwkJCWRldmMtPnJwb3J0LnN3X2ZyYW1lcmF0ZSAgID0gODAwMDsKKwkJCWRldmMtPnJwb3J0LnN3X2ZyYWdzaGlmdCAgID0gREVGQVVMVF9GUkFHU0hJRlQ7CisJCQlkZXZjLT5ycG9ydC5zd19mcmFnY291bnQgICA9IERFRkFVTFRfRlJBR0NPVU5UOworCQkJZGV2Yy0+cnBvcnQuc3dfc3ViZGl2c2hpZnQgPSBERUZBVUxUX1NVQkRJVlNISUZUOworCQkJZGV2Yy0+cnBvcnQuYnl0ZV9jb3VudCAgICAgPSAwOworCQkJZGV2Yy0+cnBvcnQuZnJhZ19jb3VudCAgICAgPSAwOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJZGV2Yy0+d3BvcnQuc3dzdGF0ZSAgICAgICAgPSBTV19JTklUSUFMOworCQkJZGV2Yy0+d3BvcnQuZmxhZ3MgICAgICAgICAgPSAwOworCQkJZGV2Yy0+d3BvcnQuc3dfY2hhbm5lbHMgICAgPSAxOworCQkJZGV2Yy0+d3BvcnQuc3dfc2FtcGxlZm10ICAgPSBzd19zYW1wbGVmbXQ7CisJCQlkZXZjLT53cG9ydC5zd19mcmFtZXJhdGUgICA9IDgwMDA7CisJCQlkZXZjLT53cG9ydC5zd19mcmFnc2hpZnQgICA9IERFRkFVTFRfRlJBR1NISUZUOworCQkJZGV2Yy0+d3BvcnQuc3dfZnJhZ2NvdW50ICAgPSBERUZBVUxUX0ZSQUdDT1VOVDsKKwkJCWRldmMtPndwb3J0LnN3X3N1YmRpdnNoaWZ0ID0gREVGQVVMVF9TVUJESVZTSElGVDsKKwkJCWRldmMtPndwb3J0LmJ5dGVfY291bnQgICAgID0gMDsKKwkJCWRldmMtPndwb3J0LmZyYWdfY291bnQgICAgID0gMDsKKwkJfQorCX0KKwl1cCgmZGV2Yy0+aW9fc2VtYSk7CisKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXZjOworCURCR1JWKCk7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZWxlYXNlIChjbG9zZSkgdGhlIGF1ZGlvIGRldmljZS4KKyAqLworCitzdGF0aWMgaW50IHZ3c25kX2F1ZGlvX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZ3c25kX3BvcnRfdCAqd3BvcnQgPSBOVUxMLCAqcnBvcnQgPSBOVUxMOworCWludCBlcnIgPSAwOworCisJbG9ja19rZXJuZWwoKTsKKwlkb3duKCZkZXZjLT5pb19zZW1hKTsKKwl7CisJCURCR0VWKCIoaW5vZGU9MHglcCwgZmlsZT0weCVwKVxuIiwgaW5vZGUsIGZpbGUpOworCisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKQorCQkJcnBvcnQgPSAmZGV2Yy0+cnBvcnQ7CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJd3BvcnQgPSAmZGV2Yy0+d3BvcnQ7CisJCQlwY21fZmx1c2hfZnJhZyhkZXZjKTsKKwkJCXBjbV93cml0ZV9zeW5jKGRldmMpOworCQl9CisJCXBjbV9zaHV0ZG93bihkZXZjLCBycG9ydCwgd3BvcnQpOworCQlpZiAocnBvcnQpCisJCQlycG9ydC0+c3dzdGF0ZSA9IFNXX09GRjsKKwkJaWYgKHdwb3J0KQorCQkJd3BvcnQtPnN3c3RhdGUgPSBTV19PRkY7CisJfQorCXVwKCZkZXZjLT5pb19zZW1hKTsKKworCWRvd24oJmRldmMtPm9wZW5fc2VtYSk7CisJeworCQlkZXZjLT5vcGVuX21vZGUgJj0gfmZpbGUtPmZfbW9kZTsKKwl9CisJdXAoJmRldmMtPm9wZW5fc2VtYSk7CisJd2FrZV91cCgmZGV2Yy0+b3Blbl93YWl0KTsKKwlERUNfVVNFX0NPVU5UOworCURCR1IoKTsKKwl1bmxvY2tfa2VybmVsKCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdndzbmRfYXVkaW9fZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubGxzZWVrID0Jbm9fbGxzZWVrLAorCS5yZWFkID0JCXZ3c25kX2F1ZGlvX3JlYWQsCisJLndyaXRlID0JdndzbmRfYXVkaW9fd3JpdGUsCisJLnBvbGwgPQkJdndzbmRfYXVkaW9fcG9sbCwKKwkuaW9jdGwgPQl2d3NuZF9hdWRpb19pb2N0bCwKKwkubW1hcCA9CQl2d3NuZF9hdWRpb19tbWFwLAorCS5vcGVuID0JCXZ3c25kX2F1ZGlvX29wZW4sCisJLnJlbGVhc2UgPQl2d3NuZF9hdWRpb19yZWxlYXNlLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogbWl4ZXIgZHJpdmVyICovCisKKy8qIG9wZW4gdGhlIG1peGVyIGRldmljZS4gKi8KKworc3RhdGljIGludCB2d3NuZF9taXhlcl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXZ3c25kX2Rldl90ICpkZXZjOworCisJREJHRVYoIihpbm9kZT0weCVwLCBmaWxlPTB4JXApXG4iLCBpbm9kZSwgZmlsZSk7CisKKwlJTkNfVVNFX0NPVU5UOworCWZvciAoZGV2YyA9IHZ3c25kX2Rldl9saXN0OyBkZXZjOyBkZXZjID0gZGV2Yy0+bmV4dF9kZXYpCisJCWlmIChkZXZjLT5taXhlcl9taW5vciA9PSBpbWlub3IoaW5vZGUpKQorCQkJYnJlYWs7CisKKwlpZiAoZGV2YyA9PSBOVUxMKSB7CisJCURFQ19VU0VfQ09VTlQ7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBkZXZjOworCXJldHVybiAwOworfQorCisvKiByZWxlYXNlIChjbG9zZSkgdGhlIG1peGVyIGRldmljZS4gKi8KKworc3RhdGljIGludCB2d3NuZF9taXhlcl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCURCR0VWKCIoaW5vZGU9MHglcCwgZmlsZT0weCVwKVxuIiwgaW5vZGUsIGZpbGUpOworCURFQ19VU0VfQ09VTlQ7CisJcmV0dXJuIDA7Cit9CisKKy8qIG1peGVyX3JlYWRfaW9jdGwgaGFuZGxlcyBhbGwgcmVhZCBpb2N0bHMgb24gdGhlIG1peGVyIGRldmljZS4gKi8KKworc3RhdGljIGludCBtaXhlcl9yZWFkX2lvY3RsKHZ3c25kX2Rldl90ICpkZXZjLCB1bnNpZ25lZCBpbnQgbnIsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHZhbCA9IC0xOworCisJREJHRVYoIihkZXZjPTB4JXAsIG5yPTB4JXgsIGFyZz0weCVwKVxuIiwgZGV2YywgbnIsIGFyZyk7CisKKwlzd2l0Y2ggKG5yKSB7CisJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQl2YWwgPSBTT1VORF9DQVBfRVhDTF9JTlBVVDsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX0RFVk1BU0s6CisJCXZhbCA9IChTT1VORF9NQVNLX1BDTSB8IFNPVU5EX01BU0tfTElORSB8CisJCSAgICAgICBTT1VORF9NQVNLX01JQyB8IFNPVU5EX01BU0tfQ0QgfCBTT1VORF9NQVNLX1JFQ0xFVik7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9TVEVSRU9ERVZTOgorCQl2YWwgPSAoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAorCQkgICAgICAgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0NEIHwgU09VTkRfTUFTS19SRUNMRVYpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfT1VUTUFTSzoKKwkJdmFsID0gKFNPVU5EX01BU0tfUENNIHwgU09VTkRfTUFTS19MSU5FIHwKKwkJICAgICAgIFNPVU5EX01BU0tfTUlDIHwgU09VTkRfTUFTS19DRCk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9SRUNNQVNLOgorCQl2YWwgPSAoU09VTkRfTUFTS19QQ00gfCBTT1VORF9NQVNLX0xJTkUgfAorCQkgICAgICAgU09VTkRfTUFTS19NSUMgfCBTT1VORF9NQVNLX0NEKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwkJdmFsID0gYWQxODQzX2dldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fUENNKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX0xJTkU6CisJCXZhbCA9IGFkMTg0M19nZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX0xJTkUpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQl2YWwgPSBhZDE4NDNfZ2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9NSUMpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfQ0Q6CisJCXZhbCA9IGFkMTg0M19nZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX0NEKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ0xFVjoKKwkJdmFsID0gYWQxODQzX2dldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fUkVDTEVWKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJdmFsID0gYWQxODQzX2dldF9yZWNzcmMoJmRldmMtPmxpdGgpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOgorCQl2YWwgPSBhZDE4NDNfZ2V0X291dHNyYygmZGV2Yy0+bGl0aCk7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiBwdXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZyk7Cit9CisKKy8qIG1peGVyX3dyaXRlX2lvY3RsIGhhbmRsZXMgYWxsIHdyaXRlIGlvY3RscyBvbiB0aGUgbWl4ZXIgZGV2aWNlLiAqLworCitzdGF0aWMgaW50IG1peGVyX3dyaXRlX2lvY3RsKHZ3c25kX2Rldl90ICpkZXZjLCB1bnNpZ25lZCBpbnQgbnIsIHZvaWQgX191c2VyICphcmcpCit7CisJaW50IHZhbDsKKwlpbnQgZXJyOworCisJREJHRVYoIihkZXZjPTB4JXAsIG5yPTB4JXgsIGFyZz0weCVwKVxuIiwgZGV2YywgbnIsIGFyZyk7CisKKwllcnIgPSBnZXRfdXNlcih2YWwsIChpbnQgX191c2VyICopIGFyZyk7CisJaWYgKGVycikKKwkJcmV0dXJuIC1FRkFVTFQ7CisJc3dpdGNoIChucikgeworCWNhc2UgU09VTkRfTUlYRVJfUENNOgorCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9QQ00sIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9MSU5FOgorCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9MSU5FLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfTUlDOgorCQl2YWwgPSBhZDE4NDNfc2V0X2dhaW4oJmRldmMtPmxpdGgsICZhZDE4NDNfZ2Fpbl9NSUMsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9DRDoKKwkJdmFsID0gYWQxODQzX3NldF9nYWluKCZkZXZjLT5saXRoLCAmYWQxODQzX2dhaW5fQ0QsIHZhbCk7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9SRUNMRVY6CisJCXZhbCA9IGFkMTg0M19zZXRfZ2FpbigmZGV2Yy0+bGl0aCwgJmFkMTg0M19nYWluX1JFQ0xFViwgdmFsKTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX1JFQ1NSQzoKKwkJaWYgKGRldmMtPnJwb3J0LnN3YnVmIHx8IGRldmMtPndwb3J0LnN3YnVmKQorCQkJcmV0dXJuIC1FQlVTWTsJLyogY2FuJ3QgY2hhbmdlIHJlY3NyYyB3aGlsZSBydW5uaW5nICovCisJCXZhbCA9IGFkMTg0M19zZXRfcmVjc3JjKCZkZXZjLT5saXRoLCB2YWwpOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfT1VUU1JDOgorCQl2YWwgPSBhZDE4NDNfc2V0X291dHNyYygmZGV2Yy0+bGl0aCwgdmFsKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKHZhbCA8IDApCisJCXJldHVybiB2YWw7CisJcmV0dXJuIHB1dF91c2VyKHZhbCwgKGludCBfX3VzZXIgKikgYXJnKTsKK30KKworLyogVGhpcyBpcyB0aGUgaW9jdGwgZW50cnkgdG8gdGhlIG1peGVyIGRyaXZlci4gKi8KKworc3RhdGljIGludCB2d3NuZF9taXhlcl9pb2N0bChzdHJ1Y3QgaW5vZGUgKmlvY3RsLAorCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgY21kLAorCQkJICAgICAgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSAodndzbmRfZGV2X3QgKikgZmlsZS0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHVuc2lnbmVkIGludCBucm1hc2sgPSBfSU9DX05STUFTSyA8PCBfSU9DX05SU0hJRlQ7CisJY29uc3QgdW5zaWduZWQgaW50IG5yID0gKGNtZCAmIG5ybWFzaykgPj4gX0lPQ19OUlNISUZUOworCWludCByZXR2YWw7CisKKwlEQkdFVigiKGRldmM9MHglcCwgY21kPTB4JXgsIGFyZz0weCVseClcbiIsIGRldmMsIGNtZCwgYXJnKTsKKworCWRvd24oJmRldmMtPm1peF9zZW1hKTsKKwl7CisJCWlmICgoY21kICYgfm5ybWFzaykgPT0gTUlYRVJfUkVBRCgwKSkKKwkJCXJldHZhbCA9IG1peGVyX3JlYWRfaW9jdGwoZGV2YywgbnIsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQllbHNlIGlmICgoY21kICYgfm5ybWFzaykgPT0gTUlYRVJfV1JJVEUoMCkpCisJCQlyZXR2YWwgPSBtaXhlcl93cml0ZV9pb2N0bChkZXZjLCBuciwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWVsc2UKKwkJCXJldHZhbCA9IC1FSU5WQUw7CisJfQorCXVwKCZkZXZjLT5taXhfc2VtYSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdndzbmRfbWl4ZXJfZm9wcyA9IHsKKwkub3duZXIgPQlUSElTX01PRFVMRSwKKwkubGxzZWVrID0Jbm9fbGxzZWVrLAorCS5pb2N0bCA9CXZ3c25kX21peGVyX2lvY3RsLAorCS5vcGVuID0JCXZ3c25kX21peGVyX29wZW4sCisJLnJlbGVhc2UgPQl2d3NuZF9taXhlcl9yZWxlYXNlLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogcHJvYmUvYXR0YWNoL3VubG9hZCAqLworCisvKiBkcml2ZXIgcHJvYmUgcm91dGluZS4gIFJldHVybiBub256ZXJvIGlmIGhhcmR3YXJlIGlzIGZvdW5kLiAqLworCitzdGF0aWMgaW50IF9faW5pdCBwcm9iZV92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJbGl0aGl1bV90IGxpdGg7CisJaW50IHc7CisJdW5zaWduZWQgbG9uZyBsYXRlcjsKKworCURCR0VWKCIoaHdfY29uZmlnPTB4JXApXG4iLCBod19jb25maWcpOworCisJLyogWFhYIHZlcmlmeSBsaXRoaXVtIHByZXNlbnQgKHRvIHByZXZlbnQgY3Jhc2ggb24gbm9uLXZ3KSAqLworCisJaWYgKGxpX2NyZWF0ZSgmbGl0aCwgaHdfY29uZmlnLT5pb19iYXNlKSAhPSAwKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInByb2JlX3Z3c25kOiBjYW4ndCBtYXAgbGl0aGl1bVxuIik7CisJCXJldHVybiAwOworCX0KKwlsYXRlciA9IGppZmZpZXMgKyAyOworCWxpX3dyaXRlbCgmbGl0aCwgTElfSE9TVF9DT05UUk9MTEVSLCBMSV9IQ19MSU5LX0VOQUJMRSk7CisJZG8geworCQl3ID0gbGlfcmVhZGwoJmxpdGgsIExJX0hPU1RfQ09OVFJPTExFUik7CisJfSB3aGlsZSAodyA9PSBMSV9IQ19MSU5LX0VOQUJMRSAmJiB0aW1lX2JlZm9yZShqaWZmaWVzLCBsYXRlcikpOworCQorCWxpX2Rlc3Ryb3koJmxpdGgpOworCisJREJHUFYoIkhDID0gMHglMDR4XG4iLCB3KTsKKworCWlmICgodyA9PSBMSV9IQ19MSU5LX0VOQUJMRSkgfHwgKHcgJiBMSV9IQ19MSU5LX0NPREVDKSkgeworCisJCS8qIFRoaXMgbWF5IGluZGljYXRlIGEgYmV0YSBtYWNoaW5lIHdpdGggbm8gYXVkaW8sCisJCSAqIG9yIGEgZnV0dXJlIG1hY2hpbmUgd2l0aCBkaWZmZXJlbnQgYXVkaW8uCisJCSAqIE9uIGJldGEtcmVsZWFzZSAzMjAgdy8gbm8gYXVkaW8sIEhDID09IDB4NDAwMCAqLworCisJCXByaW50ayhLRVJOX1dBUk5JTkcgInByb2JlX3Z3c25kOiBhdWRpbyBjb2RlYyBub3QgZm91bmRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodyAmIExJX0hDX0xJTktfRkFJTFVSRSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJwcm9iZV92d3NuZDogY2FuJ3QgaW5pdCBhdWRpbyBjb2RlY1xuIik7CisJCXJldHVybiAwOworCX0KKworCXByaW50ayhLRVJOX0lORk8gInZ3c25kOiBsaXRoaXVtIGF1ZGlvIGF0IG1taW8gJSN4IGlycSAlZFxuIiwKKwkJaHdfY29uZmlnLT5pb19iYXNlLCBod19jb25maWctPmlycSk7CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIGRyaXZlciBhdHRhY2ggcm91dGluZS4gIEluaXRpYWxpemUgZHJpdmVyIGRhdGEgc3RydWN0dXJlcyBhbmQKKyAqIGluaXRpYWxpemUgaGFyZHdhcmUuICBBIG5ldyB2d3NuZF9kZXZfdCBpcyBhbGxvY2F0ZWQgYW5kIHB1dAorICogb250byB0aGUgZ2xvYmFsIGxpc3QsIHZ3c25kX2Rldl9saXN0LgorICoKKyAqIFJldHVybiArbWlub3JfZGV2IG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBmYWlsdXJlLgorICovCisKK3N0YXRpYyBpbnQgX19pbml0IGF0dGFjaF92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdndzbmRfZGV2X3QgKmRldmMgPSBOVUxMOworCWludCBlcnIgPSAtRU5PTUVNOworCisJREJHRVYoIihod19jb25maWc9MHglcClcbiIsIGh3X2NvbmZpZyk7CisKKwlkZXZjID0ga21hbGxvYyhzaXplb2YgKHZ3c25kX2Rldl90KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGRldmMgPT0gTlVMTCkKKwkJZ290byBmYWlsMDsKKworCWVyciA9IGxpX2NyZWF0ZSgmZGV2Yy0+bGl0aCwgaHdfY29uZmlnLT5pb19iYXNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWwxOworCisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+b3Blbl93YWl0KTsKKworCWRldmMtPnJwb3J0Lmh3YnVmX3NpemUgPSBIV0JVRl9TSVpFOworCWRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBIV0JVRl9PUkRFUik7CisJaWYgKCFkZXZjLT5ycG9ydC5od2J1Zl92YWRkcikKKwkJZ290byBmYWlsMjsKKwlkZXZjLT5ycG9ydC5od2J1ZiA9ICh2b2lkICopIGRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyOworCWRldmMtPnJwb3J0Lmh3YnVmX3BhZGRyID0gdmlydF90b19waHlzKGRldmMtPnJwb3J0Lmh3YnVmKTsKKworCS8qCisJICogUXVvdGUgZnJvbSB0aGUgTlQgZHJpdmVyOgorCSAqCisJICogLy8gV0FSTklORyEhISBIQUNLIHRvIHNldHVwIG91dHB1dCBkbWEhISEKKwkgKiAvLyBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgZXZlbiBvbiBvdXRwdXQgdGhlcmUgaXMgc29tZSBkYXRhCisJICogLy8gdHJpY2tsaW5nIGludG8gdGhlIGlucHV0IERNQSBjaGFubmVsLiAgVGhpcyBpcyBhIGJ1ZyBpbiB0aGUKKwkgKiAvLyBMaXRoaXVtIG1pY3JvY29kZS4KKwkgKiAvLyAtLXNkZQorCSAqCisJICogV2Ugc2V0IHRoZSBpbnB1dCBzaWRlJ3MgRE1BIGJhc2UgYWRkcmVzcyBoZXJlLiAgSXQgd2lsbCByZW1haW4KKwkgKiB2YWxpZCB1bnRpbCB0aGUgZHJpdmVyIGlzIHVubG9hZGVkLgorCSAqLworCisJbGlfd3JpdGVsKCZkZXZjLT5saXRoLCBMSV9DT01NMV9CQVNFLAorCQkgIGRldmMtPnJwb3J0Lmh3YnVmX3BhZGRyID4+IDggfCAxIDw8ICgzNyAtIDgpKTsKKworCWRldmMtPndwb3J0Lmh3YnVmX3NpemUgPSBIV0JVRl9TSVpFOworCWRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyID0gX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMLCBIV0JVRl9PUkRFUik7CisJaWYgKCFkZXZjLT53cG9ydC5od2J1Zl92YWRkcikKKwkJZ290byBmYWlsMzsKKwlkZXZjLT53cG9ydC5od2J1ZiA9ICh2b2lkICopIGRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyOworCWRldmMtPndwb3J0Lmh3YnVmX3BhZGRyID0gdmlydF90b19waHlzKGRldmMtPndwb3J0Lmh3YnVmKTsKKwlEQkdQKCJ3cG9ydCBod2J1ZiA9IDB4JXBcbiIsIGRldmMtPndwb3J0Lmh3YnVmKTsKKworCURCR0RPKHNodXRfdXArKyk7CisJZXJyID0gYWQxODQzX2luaXQoJmRldmMtPmxpdGgpOworCURCR0RPKHNodXRfdXAtLSk7CisJaWYgKGVycikKKwkJZ290byBmYWlsNDsKKworCS8qIGluc3RhbGwgaW50ZXJydXB0IGhhbmRsZXIgKi8KKworCWVyciA9IHJlcXVlc3RfaXJxKGh3X2NvbmZpZy0+aXJxLCB2d3NuZF9hdWRpb19pbnRyLCAwLCAidndzbmQiLCBkZXZjKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZhaWw1OworCisJLyogcmVnaXN0ZXIgdGhpcyBkZXZpY2UncyBkcml2ZXJzLiAqLworCisJZGV2Yy0+YXVkaW9fbWlub3IgPSByZWdpc3Rlcl9zb3VuZF9kc3AoJnZ3c25kX2F1ZGlvX2ZvcHMsIC0xKTsKKwlpZiAoKGVyciA9IGRldmMtPmF1ZGlvX21pbm9yKSA8IDApIHsKKwkJREJHRE8ocHJpbnRrKEtFUk5fV0FSTklORworCQkJICAgICAiYXR0YWNoX3Z3c25kOiByZWdpc3Rlcl9zb3VuZF9kc3AgZXJyb3IgJWRcbiIsCisJCQkgICAgIGVycikpOworCQlnb3RvIGZhaWw2OworCX0KKwlkZXZjLT5taXhlcl9taW5vciA9IHJlZ2lzdGVyX3NvdW5kX21peGVyKCZ2d3NuZF9taXhlcl9mb3BzLAorCQkJCQkJIGRldmMtPmF1ZGlvX21pbm9yID4+IDQpOworCWlmICgoZXJyID0gZGV2Yy0+bWl4ZXJfbWlub3IpIDwgMCkgeworCQlEQkdETyhwcmludGsoS0VSTl9XQVJOSU5HCisJCQkgICAgICJhdHRhY2hfdndzbmQ6IHJlZ2lzdGVyX3NvdW5kX21peGVyIGVycm9yICVkXG4iLAorCQkJICAgICBlcnIpKTsKKwkJZ290byBmYWlsNzsKKwl9CisKKwkvKiBTcXVpcnJlbCBhd2F5IGRldmljZSBpbmRpY2VzIGZvciB1bmxvYWQgcm91dGluZS4gKi8KKworCWh3X2NvbmZpZy0+c2xvdHNbMF0gPSBkZXZjLT5hdWRpb19taW5vcjsKKworCS8qIEluaXRpYWxpemUgYXMgbXVjaCBvZiAqZGV2YyBhcyBwb3NzaWJsZSAqLworCisJaW5pdF9NVVRFWCgmZGV2Yy0+b3Blbl9zZW1hKTsKKwlpbml0X01VVEVYKCZkZXZjLT5pb19zZW1hKTsKKwlpbml0X01VVEVYKCZkZXZjLT5taXhfc2VtYSk7CisJZGV2Yy0+b3Blbl9tb2RlID0gMDsKKwlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+cnBvcnQubG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+cnBvcnQucXVldWUpOworCWRldmMtPnJwb3J0LnN3c3RhdGUgPSBTV19PRkY7CisJZGV2Yy0+cnBvcnQuaHdzdGF0ZSA9IEhXX1NUT1BQRUQ7CisJZGV2Yy0+cnBvcnQuZmxhZ3MgPSAwOworCWRldmMtPnJwb3J0LnN3YnVmID0gTlVMTDsKKwlzcGluX2xvY2tfaW5pdCgmZGV2Yy0+d3BvcnQubG9jayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmZGV2Yy0+d3BvcnQucXVldWUpOworCWRldmMtPndwb3J0LnN3c3RhdGUgPSBTV19PRkY7CisJZGV2Yy0+d3BvcnQuaHdzdGF0ZSA9IEhXX1NUT1BQRUQ7CisJZGV2Yy0+d3BvcnQuZmxhZ3MgPSAwOworCWRldmMtPndwb3J0LnN3YnVmID0gTlVMTDsKKworCS8qIFN1Y2Nlc3MuICBMaW5rIHVzIG9udG8gdGhlIGxvY2FsIGRldmljZSBsaXN0LiAqLworCisJZGV2Yy0+bmV4dF9kZXYgPSB2d3NuZF9kZXZfbGlzdDsKKwl2d3NuZF9kZXZfbGlzdCA9IGRldmM7CisJcmV0dXJuIGRldmMtPmF1ZGlvX21pbm9yOworCisJLyogU28gbWFueSB3YXlzIHRvIGZhaWwuICBVbmRvIHdoYXQgd2UgZGlkLiAqLworCisgZmFpbDc6CisJdW5yZWdpc3Rlcl9zb3VuZF9kc3AoZGV2Yy0+YXVkaW9fbWlub3IpOworIGZhaWw2OgorCWZyZWVfaXJxKGh3X2NvbmZpZy0+aXJxLCBkZXZjKTsKKyBmYWlsNToKKyBmYWlsNDoKKwlmcmVlX3BhZ2VzKGRldmMtPndwb3J0Lmh3YnVmX3ZhZGRyLCBIV0JVRl9PUkRFUik7CisgZmFpbDM6CisJZnJlZV9wYWdlcyhkZXZjLT5ycG9ydC5od2J1Zl92YWRkciwgSFdCVUZfT1JERVIpOworIGZhaWwyOgorCWxpX2Rlc3Ryb3koJmRldmMtPmxpdGgpOworIGZhaWwxOgorCWtmcmVlKGRldmMpOworIGZhaWwwOgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgX19leGl0IHVubG9hZF92d3NuZChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpCit7CisJdndzbmRfZGV2X3QgKmRldmMsICoqZGV2Y3A7CisKKwlEQkdFKCIoKVxuIik7CisKKwlkZXZjcCA9ICZ2d3NuZF9kZXZfbGlzdDsKKwl3aGlsZSAoKGRldmMgPSAqZGV2Y3ApKSB7CisJCWlmIChkZXZjLT5hdWRpb19taW5vciA9PSBod19jb25maWctPnNsb3RzWzBdKSB7CisJCQkqZGV2Y3AgPSBkZXZjLT5uZXh0X2RldjsKKwkJCWJyZWFrOworCQl9CisJCWRldmNwID0gJmRldmMtPm5leHRfZGV2OworCX0KKworCWlmICghZGV2YykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl1bnJlZ2lzdGVyX3NvdW5kX21peGVyKGRldmMtPm1peGVyX21pbm9yKTsKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChkZXZjLT5hdWRpb19taW5vcik7CisJZnJlZV9pcnEoaHdfY29uZmlnLT5pcnEsIGRldmMpOworCWZyZWVfcGFnZXMoZGV2Yy0+d3BvcnQuaHdidWZfdmFkZHIsIEhXQlVGX09SREVSKTsKKwlmcmVlX3BhZ2VzKGRldmMtPnJwb3J0Lmh3YnVmX3ZhZGRyLCBIV0JVRl9PUkRFUik7CisJbGlfZGVzdHJveSgmZGV2Yy0+bGl0aCk7CisJa2ZyZWUoZGV2Yyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaW5pdGlhbGl6YXRpb24gYW5kIGxvYWRhYmxlIGtlcm5lbCBtb2R1bGUgaW50ZXJmYWNlICovCisKK3N0YXRpYyBzdHJ1Y3QgYWRkcmVzc19pbmZvIHRoZV9od19jb25maWcgPSB7CisJMHhGRjAwMTAwMCwJCQkvKiBsaXRoaXVtIHBoeXMgYWRkciAgKi8KKwlDT19JUlEoQ09fQVBJQ19MSV9BVURJTykJLyogaXJxICovCit9OworCitNT0RVTEVfREVTQ1JJUFRJT04oIlNHSSBWaXN1YWwgV29ya3N0YXRpb24gc291bmQgbW9kdWxlIik7CitNT0RVTEVfQVVUSE9SKCJCb2IgTWlsbGVyIDxrYm9iQHNnaS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3N0YXRpYyBpbnQgX19pbml0IGluaXRfdndzbmQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJREJHWFYoIlxuIik7CisJREJHWFYoInNvdW5kOjp2d3NuZDo6aW5pdF9tb2R1bGUoKVxuIik7CisKKwlpZiAoIXByb2JlX3Z3c25kKCZ0aGVfaHdfY29uZmlnKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllcnIgPSBhdHRhY2hfdndzbmQoJnRoZV9od19jb25maWcpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF92d3NuZCh2b2lkKQoreworCURCR1goInNvdW5kOjp2d3NuZDo6Y2xlYW51cF9tb2R1bGUoKVxuIik7CisKKwl1bmxvYWRfdndzbmQoJnRoZV9od19jb25maWcpOworfQorCittb2R1bGVfaW5pdChpbml0X3Z3c25kKTsKK21vZHVsZV9leGl0KGNsZWFudXBfdndzbmQpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3dhdmVhcnRpc3QuYyBiL3NvdW5kL29zcy93YXZlYXJ0aXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkMDRhZAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy93YXZlYXJ0aXN0LmMKQEAgLTAsMCArMSwyMDM1IEBACisvKgorICogbGludXgvZHJpdmVycy9zb3VuZC93YXZlYXJ0aXN0LmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgdGhlIFJXQTAxMCBSb2Nrd2VsbCBXYXZlIEFydGlzdAorICogY29kZWMgY2hpcCB1c2VkIGluIHRoZSBSZWJlbC5jb20gTmV0V2luZGVyLgorICoKKyAqIENsZWFuZWQgdXAgYW5kIGludGVncmF0ZWQgaW50byAyLjEgYnkgUnVzc2VsbCBLaW5nIChybWtAYXJtLmxpbnV4Lm9yZy51aykKKyAqIGFuZCBQYXQgQmVpcm5lIChwYXRiQGNvcmVsLmNhKQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IFJlYmVsLmNvbSAxOTk4LTE5OTkKKyAqCisgKiBSV0EwMTAgc3BlY3MgcmVjZWl2ZWQgdW5kZXIgTkRBIGZyb20gUm9ja3dlbGwKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNhdm9sYWluZW4gMTk5My0xOTk3CisgKgorICogT1NTL0ZyZWUgZm9yIExpbnV4IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRSAoR1BMKQorICogVmVyc2lvbiAyIChKdW5lIDE5OTEpLiBTZWUgdGhlICJDT1BZSU5HIiBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyBzb2Z0d2FyZQorICogZm9yIG1vcmUgaW5mby4KKyAqCisgKiBDaGFuZ2VzOgorICogMTEtMTAtMjAwMAlCYXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxia3pAbGludXgtaWRlLm9yZz4KKyAqCQlBZGRlZCBfX2luaXQgdG8gd2F2ZWFydGlzdF9pbml0KCkKKyAqLworCisvKiBEZWJ1Z2dpbmcgKi8KKyNkZWZpbmUgREVCVUdfQ01ECTEKKyNkZWZpbmUgREVCVUdfT1VUCTIKKyNkZWZpbmUgREVCVUdfSU4JNAorI2RlZmluZSBERUJVR19JTlRSCTgKKyNkZWZpbmUgREVCVUdfTUlYRVIJMTYKKyNkZWZpbmUgREVCVUdfVFJJR0dFUgkzMgorCisjZGVmaW5lIGRlYnVnX2ZsZyAoMCkKKworI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KKworI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorI2luY2x1ZGUgIndhdmVhcnRpc3QuaCIKKworI2lmZGVmIENPTkZJR19BUk0KKyNpbmNsdWRlIDxhc20vaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxhc20vbWFjaC10eXBlcy5oPgorI2VuZGlmCisKKyNpZm5kZWYgTk9fRE1BCisjZGVmaW5lIE5PX0RNQQkyNTUKKyNlbmRpZgorCisjZGVmaW5lIFNVUFBPUlRFRF9NSVhFUl9ERVZJQ0VTCQkoU09VTkRfTUFTS19TWU5USCAgICAgIHxcCisJCQkJCSBTT1VORF9NQVNLX1BDTSAgICAgICAgfFwKKwkJCQkJIFNPVU5EX01BU0tfTElORSAgICAgICB8XAorCQkJCQkgU09VTkRfTUFTS19NSUMgICAgICAgIHxcCisJCQkJCSBTT1VORF9NQVNLX0xJTkUxICAgICAgfFwKKwkJCQkJIFNPVU5EX01BU0tfUkVDTEVWICAgICB8XAorCQkJCQkgU09VTkRfTUFTS19WT0xVTUUgICAgIHxcCisJCQkJCSBTT1VORF9NQVNLX0lNSVgpCisKK3N0YXRpYyB1bnNpZ25lZCBzaG9ydCBsZXZlbHNbU09VTkRfTUlYRVJfTlJERVZJQ0VTXSA9IHsKKwkweDU1NTUsCQkvKiBNYXN0ZXIgVm9sdW1lCSAqLworCTB4MDAwMCwJCS8qIEJhc3MJCQkgKi8KKwkweDAwMDAsCQkvKiBUcmVibGUJCSAqLworCTB4MjMyMywJCS8qIFN5bnRoIChGTSkJCSAqLworCTB4NGI0YiwJCS8qIFBDTQkJCSAqLworCTB4NjQ2NCwJCS8qIFBDIFNwZWFrZXIJCSAqLworCTB4MDAwMCwJCS8qIEV4dCBMaW5lCQkgKi8KKwkweDAwMDAsCQkvKiBNaWMJCQkgKi8KKwkweDAwMDAsCQkvKiBDRAkJCSAqLworCTB4NjQ2NCwJCS8qIFJlY29yZGluZyBtb25pdG9yCSAqLworCTB4MDAwMCwJCS8qIFNCIFBDTSAoQUxUIFBDTSkJICovCisJMHgwMDAwLAkJLyogUmVjb3JkaW5nIGxldmVsCSAqLworCTB4NjQ2NCwJCS8qIElucHV0IGdhaW4JCSAqLworCTB4NjQ2NCwJCS8qIE91dHB1dCBnYWluCQkgKi8KKwkweDAwMDAsCQkvKiBMaW5lMSAoQXV4MSkJCSAqLworCTB4MDAwMCwJCS8qIExpbmUyIChBdXgyKQkJICovCisJMHgwMDAwLAkJLyogTGluZTMgKEF1eDMpCQkgKi8KKwkweDAwMDAsCQkvKiBEaWdpdGFsMQkJICovCisJMHgwMDAwLAkJLyogRGlnaXRhbDIJCSAqLworCTB4MDAwMCwJCS8qIERpZ2l0YWwzCQkgKi8KKwkweDAwMDAsCQkvKiBQaG9uZSBJbgkJICovCisJMHg2NDY0LAkJLyogUGhvbmUgT3V0CQkgKi8KKwkweDAwMDAsCQkvKiBWaWRlbwkJICovCisJMHgwMDAwLAkJLyogUmFkaW8JCSAqLworCTB4MDAwMAkJLyogTW9uaXRvcgkJICovCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IGFkZHJlc3NfaW5mbyAgaHc7CS8qIGhhcmR3YXJlICovCisJY2hhcgkJKmNoaXBfbmFtZTsKKworCWludAkJeGZlcl9jb3VudDsKKwlpbnQJCWF1ZGlvX21vZGU7CisJaW50CQlvcGVuX21vZGU7CisJaW50CQlhdWRpb19mbGFnczsKKwlpbnQJCXJlY29yZF9kZXY7CisJaW50CQlwbGF5YmFja19kZXY7CisJaW50CQlkZXZfbm87CisKKwkvKiBNaXhlciBwYXJhbWV0ZXJzICovCisJY29uc3Qgc3RydWN0IHdhdmVhcnRpc3RfbWl4ZXJfaW5mbyAqbWl4OworCisJdW5zaWduZWQgc2hvcnQJKmxldmVsczsJICAgLyogY2FjaGUgb2Ygdm9sdW1lIHNldHRpbmdzICAgKi8KKwlpbnQJCXJlY21hc2s7CSAgIC8qIGN1cnJlbnRseSBlbmFibGVkIHJlY29yZGluZyBkZXZpY2UhICovCisKKyNpZmRlZiBDT05GSUdfQVJDSF9ORVRXSU5ERVIKKwlzaWduZWQgaW50CXNsaWRlcl92b2w7CSAgIC8qIGhhcmR3YXJlIHNsaWRlciB2b2x1bWUgICAgICovCisJdW5zaWduZWQgaW50CWhhbmRzZXRfZGV0ZWN0CToxOworCXVuc2lnbmVkIGludAl0ZWxlcGhvbmVfZGV0ZWN0OjE7CisJdW5zaWduZWQgaW50CW5vX2F1dG9zZWxlY3QJOjE7LyogaGFuZHNldC90ZWxlcGhvbmUgYXV0b3NlbGVjdHMgYSBwYXRoICovCisJdW5zaWduZWQgaW50CXNwa3JfbXV0ZV9zdGF0ZQk6MTsvKiBzZXQgYnkgaW9jdGwgb3IgYXV0b3NlbGVjdCAqLworCXVuc2lnbmVkIGludAlsaW5lX211dGVfc3RhdGUJOjE7Lyogc2V0IGJ5IGlvY3RsIG9yIGF1dG9zZWxlY3QgKi8KKwl1bnNpZ25lZCBpbnQJdXNlX3NsaWRlcgk6MTsvKiB1c2Ugc2xpZGVyIHNldHRpbmcgZm9yIG8vcCB2b2wgKi8KKyNlbmRpZgorfSB3YXZuY19pbmZvOworCisvKgorICogVGhpcyBpcyB0aGUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgbWl4ZXIgaW5mb3JtYXRpb24uCisgKi8KK3N0cnVjdCB3YXZlYXJ0aXN0X21peGVyX2luZm8geworCXVuc2lnbmVkIGludAlzdXBwb3J0ZWRfZGV2czsJICAgLyogU3VwcG9ydGVkIGRldmljZXMgKi8KKwl1bnNpZ25lZCBpbnQJcmVjb3JkaW5nX2RldnM7CSAgIC8qIFJlY29yZGFibGUgZGV2aWVzICovCisJdW5zaWduZWQgaW50CXN0ZXJlb19kZXZzOwkgICAvKiBTdGVyZW8gZGV2aWNlcwkqLworCisJdW5zaWduZWQgaW50CSgqc2VsZWN0X2lucHV0KSh3YXZuY19pbmZvICosIHVuc2lnbmVkIGludCwKKwkJCQkJdW5zaWduZWQgY2hhciAqLCB1bnNpZ25lZCBjaGFyICopOworCWludAkJKCpkZWNvZGVfbWl4ZXIpKHdhdm5jX2luZm8gKiwgaW50LAorCQkJCQl1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyKTsKKwlpbnQJCSgqZ2V0X21peGVyKSh3YXZuY19pbmZvICosIGludCk7Cit9OworCit0eXBlZGVmIHN0cnVjdCB3YXZuY19wb3J0X2luZm8geworCWludAkJb3Blbl9tb2RlOworCWludAkJc3BlZWQ7CisJaW50CQljaGFubmVsczsKKwlpbnQJCWF1ZGlvX2Zvcm1hdDsKK30gd2F2bmNfcG9ydF9pbmZvOworCitzdGF0aWMgaW50CQlucl93YXZlYXJ0aXN0X2RldnM7CitzdGF0aWMgd2F2bmNfaW5mbwlhZGV2X2luZm9bTUFYX0FVRElPX0RFVl07CitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKHdhdmVhcnRpc3RfbG9jayk7CisKKyNpZm5kZWYgQ09ORklHX0FSQ0hfTkVUV0lOREVSCisjZGVmaW5lIG1hY2hpbmVfaXNfbmV0d2luZGVyKCkgMAorI2Vsc2UKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCB2bmNfdGltZXI7CitzdGF0aWMgdm9pZCB2bmNfY29uZmlndXJlX21peGVyKHdhdm5jX2luZm8gKmRldmMsIHVuc2lnbmVkIGludCBpbnB1dF9tYXNrKTsKK3N0YXRpYyBpbnQgdm5jX3ByaXZhdGVfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgaW50IF9fdXNlciAqYXJnKTsKK3N0YXRpYyB2b2lkIHZuY19zbGlkZXJfdGljayh1bnNpZ25lZCBsb25nIGRhdGEpOworI2VuZGlmCisKK3N0YXRpYyBpbmxpbmUgdm9pZAord2F2ZWFydGlzdF9zZXRfY3RscihzdHJ1Y3QgYWRkcmVzc19pbmZvICpodywgdW5zaWduZWQgY2hhciBjbGVhciwgdW5zaWduZWQgY2hhciBzZXQpCit7CisJdW5zaWduZWQgaW50IGN0bHJfcG9ydCA9IGh3LT5pb19iYXNlICsgQ1RMUjsKKworCWNsZWFyID0gfmNsZWFyICYgaW5iKGN0bHJfcG9ydCk7CisKKwlvdXRiKGNsZWFyIHwgc2V0LCBjdGxyX3BvcnQpOworfQorCisvKiBUb2dnbGUgSVJRIGFja25vd2xlZGdlIGxpbmUKKyAqLworc3RhdGljIGlubGluZSB2b2lkCit3YXZlYXJ0aXN0X2lhY2sod2F2bmNfaW5mbyAqZGV2YykKK3sKKwl1bnNpZ25lZCBpbnQgY3Rscl9wb3J0ID0gZGV2Yy0+aHcuaW9fYmFzZSArIENUTFI7CisJaW50IG9sZF9jdGxyOworCisJb2xkX2N0bHIgPSBpbmIoY3Rscl9wb3J0KSAmIH5JUlFfQUNLOworCisJb3V0YihvbGRfY3RsciB8IElSUV9BQ0ssIGN0bHJfcG9ydCk7CisJb3V0YihvbGRfY3RsciwgY3Rscl9wb3J0KTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3dhdmVhcnRpc3Rfc2xlZXAoaW50IHRpbWVvdXRfbXMpCit7CisJdW5zaWduZWQgaW50IHRpbWVvdXQgPSB0aW1lb3V0X21zICogMTAgKiBIWiAvIDEwMDsKKworCWRvIHsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJdGltZW91dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJfSB3aGlsZSAodGltZW91dCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord2F2ZWFydGlzdF9yZXNldCh3YXZuY19pbmZvICpkZXZjKQoreworCXN0cnVjdCBhZGRyZXNzX2luZm8gKmh3ID0gJmRldmMtPmh3OworCXVuc2lnbmVkIGludCB0aW1lb3V0LCByZXMgPSAtMTsKKworCXdhdmVhcnRpc3Rfc2V0X2N0bHIoaHcsIC0xLCBSRVNFVCk7CisJd2F2ZWFydGlzdF9zbGVlcCgyKTsKKwl3YXZlYXJ0aXN0X3NldF9jdGxyKGh3LCBSRVNFVCwgMCk7CisKKwl0aW1lb3V0ID0gNTAwOworCWRvIHsKKwkJbWRlbGF5KDIpOworCisJCWlmIChpbmIoaHctPmlvX2Jhc2UgKyBTVEFUUikgJiBDTURfUkYpIHsKKwkJCXJlcyA9IGludyhody0+aW9fYmFzZSArIENNRFIpOworCQkJaWYgKHJlcyA9PSAweDU1YWEpCisJCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlICgtLXRpbWVvdXQpOworCisJaWYgKHRpbWVvdXQgPT0gMCkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXZlQXJ0aXN0OiByZXNldCB0aW1lb3V0ICIpOworCQlpZiAocmVzICE9ICh1bnNpZ25lZCBpbnQpLTEpCisJCQlwcmludGsoIihyZXM9JTA0WCkiLCByZXMpOworCQlwcmludGsoIlxuIik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogSGVscGVyIGZ1bmN0aW9uIHRvIHNlbmQgYW5kIHJlY2VpdmUgd29yZHMKKyAqIGZyb20gV2F2ZUFydGlzdC4gIEl0IGhhbmRsZXMgYWxsIHRoZSBoYW5kc2hha2luZworICogYW5kIGNhbiBzZW5kIG9yIHJlY2VpdmUgbXVsdGlwbGUgd29yZHMuCisgKi8KK3N0YXRpYyBpbnQKK3dhdmVhcnRpc3RfY21kKHdhdm5jX2luZm8gKmRldmMsCisJCWludCBucl9jbWQsIHVuc2lnbmVkIGludCAqY21kLAorCQlpbnQgbnJfcmVzcCwgdW5zaWduZWQgaW50ICpyZXNwKQoreworCXVuc2lnbmVkIGludCBpb19iYXNlID0gZGV2Yy0+aHcuaW9fYmFzZTsKKwl1bnNpZ25lZCBpbnQgdGltZWRfb3V0ID0gMDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWlmIChkZWJ1Z19mbGcgJiBERUJVR19DTUQpIHsKKwkJcHJpbnRrKCJ3YXZlYXJ0aXN0X2NtZDogY21kPSIpOworCisJCWZvciAoaSA9IDA7IGkgPCBucl9jbWQ7IGkrKykKKwkJCXByaW50aygiJTA0WCAiLCBjbWRbaV0pOworCisJCXByaW50aygiXG4iKTsKKwl9CisKKwlpZiAoaW5iKGlvX2Jhc2UgKyBTVEFUUikgJiBDTURfUkYpIHsKKwkJaW50IG9sZF9kYXRhOworCisJCS8qIGZsdXNoIHRoZSBwb3J0CisJCSAqLworCisJCW9sZF9kYXRhID0gaW53KGlvX2Jhc2UgKyBDTURSKTsKKworCQlpZiAoZGVidWdfZmxnICYgREVCVUdfQ01EKQorCQkJcHJpbnRrKCJmbHVzaGVkICUwNFguLi4iLCBvbGRfZGF0YSk7CisKKwkJdWRlbGF5KDEwKTsKKwl9CisKKwlmb3IgKGkgPSAwOyAhdGltZWRfb3V0ICYmIGkgPCBucl9jbWQ7IGkrKykgeworCQlpbnQgY291bnQ7CisKKwkJZm9yIChjb3VudCA9IDUwMDA7IGNvdW50OyBjb3VudC0tKQorCQkJaWYgKGluYihpb19iYXNlICsgU1RBVFIpICYgQ01EX1dFKQorCQkJCWJyZWFrOworCisJCWlmICghY291bnQpCisJCQl0aW1lZF9vdXQgPSAxOworCQllbHNlCisJCQlvdXR3KGNtZFtpXSwgaW9fYmFzZSArIENNRFIpOworCX0KKworCWZvciAoaSA9IDA7ICF0aW1lZF9vdXQgJiYgaSA8IG5yX3Jlc3A7IGkrKykgeworCQlpbnQgY291bnQ7CisKKwkJZm9yIChjb3VudCA9IDUwMDA7IGNvdW50OyBjb3VudC0tKQorCQkJaWYgKGluYihpb19iYXNlICsgU1RBVFIpICYgQ01EX1JGKQorCQkJCWJyZWFrOworCisJCWlmICghY291bnQpCisJCQl0aW1lZF9vdXQgPSAxOworCQllbHNlCisJCQlyZXNwW2ldID0gaW53KGlvX2Jhc2UgKyBDTURSKTsKKwl9CisKKwlpZiAoZGVidWdfZmxnICYgREVCVUdfQ01EKSB7CisJCWlmICghdGltZWRfb3V0KSB7CisJCQlwcmludGsoIndhdmVhcnRpc3RfY21kOiByZXNwPSIpOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbnJfcmVzcDsgaSsrKQorCQkJCXByaW50aygiJTA0WCAiLCByZXNwW2ldKTsKKworCQkJcHJpbnRrKCJcbiIpOworCQl9IGVsc2UKKwkJCXByaW50aygid2F2ZWFydGlzdF9jbWQ6IHRpbWVkIG91dFxuIik7CisJfQorCisJcmV0dXJuIHRpbWVkX291dCA/IDEgOiAwOworfQorCisvKgorICogU2VuZCBvbmUgY29tbWFuZCB3b3JkCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit3YXZlYXJ0aXN0X2NtZDEod2F2bmNfaW5mbyAqZGV2YywgdW5zaWduZWQgaW50IGNtZCkKK3sKKwlyZXR1cm4gd2F2ZWFydGlzdF9jbWQoZGV2YywgMSwgJmNtZCwgMCwgTlVMTCk7Cit9CisKKy8qCisgKiBTZW5kIG9uZSBjb21tYW5kLCByZWNlaXZlIG9uZSB3b3JkCisgKi8KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50Cit3YXZlYXJ0aXN0X2NtZDFfcih3YXZuY19pbmZvICpkZXZjLCB1bnNpZ25lZCBpbnQgY21kKQoreworCXVuc2lnbmVkIGludCByZXQ7CisKKwl3YXZlYXJ0aXN0X2NtZChkZXZjLCAxLCAmY21kLCAxLCAmcmV0KTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTZW5kIGEgZG91YmxlIGNvbW1hbmQsIHJlY2VpdmUgb25lCisgKiB3b3JkIChhbmQgdGhyb3cgaXQgYXdheSkKKyAqLworc3RhdGljIGlubGluZSBpbnQKK3dhdmVhcnRpc3RfY21kMih3YXZuY19pbmZvICpkZXZjLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBpbnQgYXJnKQoreworCXVuc2lnbmVkIGludCB2YWxzWzJdOworCisJdmFsc1swXSA9IGNtZDsKKwl2YWxzWzFdID0gYXJnOworCisJcmV0dXJuIHdhdmVhcnRpc3RfY21kKGRldmMsIDIsIHZhbHMsIDEsIHZhbHMpOworfQorCisvKgorICogU2VuZCBhIHRyaXBsZSBjb21tYW5kCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Cit3YXZlYXJ0aXN0X2NtZDMod2F2bmNfaW5mbyAqZGV2YywgdW5zaWduZWQgaW50IGNtZCwKKwkJdW5zaWduZWQgaW50IGFyZzEsIHVuc2lnbmVkIGludCBhcmcyKQoreworCXVuc2lnbmVkIGludCB2YWxzWzNdOworCisJdmFsc1swXSA9IGNtZDsKKwl2YWxzWzFdID0gYXJnMTsKKwl2YWxzWzJdID0gYXJnMjsKKworCXJldHVybiB3YXZlYXJ0aXN0X2NtZChkZXZjLCAzLCB2YWxzLCAwLCBOVUxMKTsKK30KKworc3RhdGljIGludAord2F2ZWFydGlzdF9nZXRyZXYod2F2bmNfaW5mbyAqZGV2YywgY2hhciAqcmV2KQoreworCXVuc2lnbmVkIGludCB0ZW1wWzJdOworCXVuc2lnbmVkIGludCBjbWQgPSBXQUNNRF9HRVRSRVY7CisKKwl3YXZlYXJ0aXN0X2NtZChkZXZjLCAxLCAmY21kLCAyLCB0ZW1wKTsKKworCXJldlswXSA9IHRlbXBbMF0gPj4gODsKKwlyZXZbMV0gPSB0ZW1wWzBdICYgMjU1OworCXJldlsyXSA9ICdcMCc7CisKKwlyZXR1cm4gdGVtcFswXTsKK30KKworc3RhdGljIHZvaWQgd2F2ZWFydGlzdF9oYWx0X291dHB1dChpbnQgZGV2KTsKK3N0YXRpYyB2b2lkIHdhdmVhcnRpc3RfaGFsdF9pbnB1dChpbnQgZGV2KTsKK3N0YXRpYyB2b2lkIHdhdmVhcnRpc3RfaGFsdChpbnQgZGV2KTsKK3N0YXRpYyB2b2lkIHdhdmVhcnRpc3RfdHJpZ2dlcihpbnQgZGV2LCBpbnQgc3RhdGUpOworCitzdGF0aWMgaW50Cit3YXZlYXJ0aXN0X29wZW4oaW50IGRldiwgaW50IG1vZGUpCit7CisJd2F2bmNfaW5mbwkqZGV2YzsKKwl3YXZuY19wb3J0X2luZm8JKnBvcnRjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX2F1ZGlvZGV2cykKKwkJcmV0dXJuIC1FTlhJTzsKKworCWRldmMgID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXBvcnRjID0gKHdhdm5jX3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndhdmVhcnRpc3RfbG9jaywgZmxhZ3MpOworCWlmIChwb3J0Yy0+b3Blbl9tb2RlIHx8IChkZXZjLT5vcGVuX21vZGUgJiBtb2RlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlkZXZjLT5hdWRpb19tb2RlICA9IDA7CisJZGV2Yy0+b3Blbl9tb2RlICB8PSBtb2RlOworCXBvcnRjLT5vcGVuX21vZGUgID0gbW9kZTsKKwl3YXZlYXJ0aXN0X3RyaWdnZXIoZGV2LCAwKTsKKworCWlmIChtb2RlICYgT1BFTl9SRUFEKQorCQlkZXZjLT5yZWNvcmRfZGV2ID0gZGV2OworCWlmIChtb2RlICYgT1BFTl9XUklURSkKKwkJZGV2Yy0+cGxheWJhY2tfZGV2ID0gZGV2OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndhdmVhcnRpc3RfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X2Nsb3NlKGludCBkZXYpCit7CisJd2F2bmNfaW5mbwkqZGV2YyA9ICh3YXZuY19pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+ZGV2YzsKKwl3YXZuY19wb3J0X2luZm8JKnBvcnRjID0gKHdhdm5jX3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisKKwl3YXZlYXJ0aXN0X2hhbHQoZGV2KTsKKworCWRldmMtPmF1ZGlvX21vZGUgPSAwOworCWRldmMtPm9wZW5fbW9kZSAmPSB+cG9ydGMtPm9wZW5fbW9kZTsKKwlwb3J0Yy0+b3Blbl9tb2RlID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndhdmVhcnRpc3RfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAord2F2ZWFydGlzdF9vdXRwdXRfYmxvY2soaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBfX2NvdW50LCBpbnQgaW50cmZsYWcpCit7CisJd2F2bmNfcG9ydF9pbmZvCSpwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKwl3YXZuY19pbmZvCSpkZXZjID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgaW50CWNvdW50ID0gX19jb3VudDsgCisKKwlpZiAoZGVidWdfZmxnICYgREVCVUdfT1VUKQorCQlwcmludGsoIndhdmVhcnRpc3Q6IG91dHB1dCBibG9jaywgYnVmPTB4JWx4LCBjb3VudD0weCV4Li4uXG4iLAorCQkJYnVmLCBjb3VudCk7CisJLyoKKwkgKiAxNiBiaXQgZGF0YQorCSAqLworCWlmIChwb3J0Yy0+YXVkaW9fZm9ybWF0ICYgKEFGTVRfUzE2X0xFIHwgQUZNVF9TMTZfQkUpKQorCQljb3VudCA+Pj0gMTsKKworCWlmIChwb3J0Yy0+Y2hhbm5lbHMgPiAxKQorCQljb3VudCA+Pj0gMTsKKworCWNvdW50IC09IDE7CisKKwlpZiAoZGV2Yy0+YXVkaW9fbW9kZSAmIFBDTV9FTkFCTEVfT1VUUFVUICYmCisJICAgIGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfQVVUT01PREUgJiYKKwkgICAgaW50cmZsYWcgJiYKKwkgICAgY291bnQgPT0gZGV2Yy0+eGZlcl9jb3VudCkgeworCQlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfT1VUUFVUOworCQlyZXR1cm47CS8qCisJCQkgKiBBdXRvIERNQSBtb2RlIG9uLiBObyBuZWVkIHRvIHJlYWN0CisJCQkgKi8KKwl9CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIHNldCBzYW1wbGUgY291bnQKKwkgKi8KKwl3YXZlYXJ0aXN0X2NtZDIoZGV2YywgV0FDTURfT1VUUFVUU0laRSwgY291bnQpOworCisJZGV2Yy0+eGZlcl9jb3VudCA9IGNvdW50OworCWRldmMtPmF1ZGlvX21vZGUgfD0gUENNX0VOQUJMRV9PVVRQVVQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK3dhdmVhcnRpc3Rfc3RhcnRfaW5wdXQoaW50IGRldiwgdW5zaWduZWQgbG9uZyBidWYsIGludCBfX2NvdW50LCBpbnQgaW50cmZsYWcpCit7CisJd2F2bmNfcG9ydF9pbmZvICpwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKwl3YXZuY19pbmZvCSpkZXZjID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJdW5zaWduZWQgaW50CWNvdW50ID0gX19jb3VudDsKKworCWlmIChkZWJ1Z19mbGcgJiBERUJVR19JTikKKwkJcHJpbnRrKCJ3YXZlYXJ0aXN0OiBzdGFydCBpbnB1dCwgYnVmPTB4JWx4LCBjb3VudD0weCV4Li4uXG4iLAorCQkJYnVmLCBjb3VudCk7CisKKwlpZiAocG9ydGMtPmF1ZGlvX2Zvcm1hdCAmIChBRk1UX1MxNl9MRSB8IEFGTVRfUzE2X0JFKSkJLyogMTYgYml0IGRhdGEgKi8KKwkJY291bnQgPj49IDE7CisKKwlpZiAocG9ydGMtPmNoYW5uZWxzID4gMSkKKwkJY291bnQgPj49IDE7CisKKwljb3VudCAtPSAxOworCisJaWYgKGRldmMtPmF1ZGlvX21vZGUgJiBQQ01fRU5BQkxFX0lOUFVUICYmCisJICAgIGF1ZGlvX2RldnNbZGV2XS0+ZmxhZ3MgJiBETUFfQVVUT01PREUgJiYKKwkgICAgaW50cmZsYWcgJiYKKwkgICAgY291bnQgPT0gZGV2Yy0+eGZlcl9jb3VudCkgeworCQlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisJCXJldHVybjsJLyoKKwkJCSAqIEF1dG8gRE1BIG1vZGUgb24uIE5vIG5lZWQgdG8gcmVhY3QKKwkJCSAqLworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogc2V0IHNhbXBsZSBjb3VudAorCSAqLworCXdhdmVhcnRpc3RfY21kMihkZXZjLCBXQUNNRF9JTlBVVFNJWkUsIGNvdW50KTsKKworCWRldmMtPnhmZXJfY291bnQgPSBjb3VudDsKKwlkZXZjLT5hdWRpb19tb2RlIHw9IFBDTV9FTkFCTEVfSU5QVVQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGludAord2F2ZWFydGlzdF9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAord2F2ZWFydGlzdF9nZXRfc3BlZWQod2F2bmNfcG9ydF9pbmZvICpwb3J0YykKK3sKKwl1bnNpZ25lZCBpbnQgc3BlZWQ7CisKKwkvKgorCSAqIHByb2dyYW0gdGhlIHNwZWVkLCBjaGFubmVscywgYml0cworCSAqLworCWlmIChwb3J0Yy0+c3BlZWQgPT0gODAwMCkKKwkJc3BlZWQgPSAweDJFNzE7CisJZWxzZSBpZiAocG9ydGMtPnNwZWVkID09IDExMDI1KQorCQlzcGVlZCA9IDB4NDAwMDsKKwllbHNlIGlmIChwb3J0Yy0+c3BlZWQgPT0gMjIwNTApCisJCXNwZWVkID0gMHg4MDAwOworCWVsc2UgaWYgKHBvcnRjLT5zcGVlZCA9PSA0NDEwMCkKKwkJc3BlZWQgPSAweDA7CisJZWxzZSB7CisJCS8qCisJCSAqIG5vbi1zdGFuZGFyZCAtIGp1c3QgY2FsY3VsYXRlCisJCSAqLworCQlzcGVlZCA9IHBvcnRjLT5zcGVlZCA8PCAxNjsKKworCQlzcGVlZCA9IChzcGVlZCAvIDQ0MTAwKSAmIDY1NTM1OworCX0KKworCXJldHVybiBzcGVlZDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAord2F2ZWFydGlzdF9nZXRfYml0cyh3YXZuY19wb3J0X2luZm8gKnBvcnRjKQoreworCXVuc2lnbmVkIGludCBiaXRzOworCisJaWYgKHBvcnRjLT5hdWRpb19mb3JtYXQgPT0gQUZNVF9TMTZfTEUpCisJCWJpdHMgPSAxOworCWVsc2UgaWYgKHBvcnRjLT5hdWRpb19mb3JtYXQgPT0gQUZNVF9TOCkKKwkJYml0cyA9IDA7CisJZWxzZQorCQliaXRzID0gMjsJLy9kZWZhdWx0IEFGTVRfVTgKKworCXJldHVybiBiaXRzOworfQorCitzdGF0aWMgaW50Cit3YXZlYXJ0aXN0X3ByZXBhcmVfZm9yX2lucHV0KGludCBkZXYsIGludCBic2l6ZSwgaW50IGJjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCXdhdm5jX2luZm8JKmRldmMgPSAod2F2bmNfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJd2F2bmNfcG9ydF9pbmZvCSpwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKwl1bnNpZ25lZCBpbnQJc3BlZWQsIGJpdHM7CisKKwlpZiAoZGV2Yy0+YXVkaW9fbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlzcGVlZCA9IHdhdmVhcnRpc3RfZ2V0X3NwZWVkKHBvcnRjKTsKKwliaXRzICA9IHdhdmVhcnRpc3RfZ2V0X2JpdHMocG9ydGMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndhdmVhcnRpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHdhdmVhcnRpc3RfY21kMihkZXZjLCBXQUNNRF9JTlBVVEZPUk1BVCwgYml0cykpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVhcnRpc3Q6IGVycm9yIHNldHRpbmcgdGhlICIKKwkJICAgICAgICJyZWNvcmQgZm9ybWF0IHRvICVkXG4iLCBwb3J0Yy0+YXVkaW9fZm9ybWF0KTsKKworCWlmICh3YXZlYXJ0aXN0X2NtZDIoZGV2YywgV0FDTURfSU5QVVRDSEFOTkVMUywgcG9ydGMtPmNoYW5uZWxzKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2F2ZWFydGlzdDogZXJyb3Igc2V0dGluZyByZWNvcmQgIgorCQkgICAgICAgInRvICVkIGNoYW5uZWxzXG4iLCBwb3J0Yy0+Y2hhbm5lbHMpOworCisJLyoKKwkgKiB3cml0ZSBjbWQgU2V0U2FtcGxlU3BlZWRUaW1lQ29uc3RhbnQKKwkgKi8KKwlpZiAod2F2ZWFydGlzdF9jbWQyKGRldmMsIFdBQ01EX0lOUFVUU1BFRUQsIHNwZWVkKSkKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2F2ZWFydGlzdDogZXJyb3Igc2V0dGluZyB0aGUgcmVjb3JkICIKKwkJICAgICAgICJzcGVlZCB0byAlZEh6LlxuIiwgcG9ydGMtPnNwZWVkKTsKKworCWlmICh3YXZlYXJ0aXN0X2NtZDIoZGV2YywgV0FDTURfSU5QVVRETUEsIDEpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiBlcnJvciBzZXR0aW5nIHRoZSByZWNvcmQgIgorCQkgICAgICAgImRhdGEgcGF0aCB0byAweCVYXG4iLCAxKTsKKworCWlmICh3YXZlYXJ0aXN0X2NtZDIoZGV2YywgV0FDTURfSU5QVVRGT1JNQVQsIGJpdHMpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiBlcnJvciBzZXR0aW5nIHRoZSByZWNvcmQgIgorCQkgICAgICAgImZvcm1hdCB0byAlZFxuIiwgcG9ydGMtPmF1ZGlvX2Zvcm1hdCk7CisKKwlkZXZjLT54ZmVyX2NvdW50ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKwl3YXZlYXJ0aXN0X2hhbHRfaW5wdXQoZGV2KTsKKworCWlmIChkZWJ1Z19mbGcgJiBERUJVR19JTlRSKSB7CisJCXByaW50aygiV0EgQ1RMUiByZWc6IDB4JTAyWC5cbiIsCisJCSAgICAgICBpbmIoZGV2Yy0+aHcuaW9fYmFzZSArIENUTFIpKTsKKwkJcHJpbnRrKCJXQSBTVEFUIHJlZzogMHglMDJYLlxuIiwKKwkJICAgICAgIGluYihkZXZjLT5ody5pb19iYXNlICsgU1RBVFIpKTsKKwkJcHJpbnRrKCJXQSBJUlFTIHJlZzogMHglMDJYLlxuIiwKKwkJICAgICAgIGluYihkZXZjLT5ody5pb19iYXNlICsgSVJRU1RBVCkpOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3YXZlYXJ0aXN0X3ByZXBhcmVfZm9yX291dHB1dChpbnQgZGV2LCBpbnQgYnNpemUsIGludCBiY291bnQpCit7CisJdW5zaWduZWQgbG9uZwlmbGFnczsKKwl3YXZuY19pbmZvCSpkZXZjID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXdhdm5jX3BvcnRfaW5mbwkqcG9ydGMgPSAod2F2bmNfcG9ydF9pbmZvICopIGF1ZGlvX2RldnNbZGV2XS0+cG9ydGM7CisJdW5zaWduZWQgaW50CXNwZWVkLCBiaXRzOworCisJLyoKKwkgKiBwcm9ncmFtIHRoZSBzcGVlZCwgY2hhbm5lbHMsIGJpdHMKKwkgKi8KKwlzcGVlZCA9IHdhdmVhcnRpc3RfZ2V0X3NwZWVkKHBvcnRjKTsKKwliaXRzICA9IHdhdmVhcnRpc3RfZ2V0X2JpdHMocG9ydGMpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJndhdmVhcnRpc3RfbG9jaywgZmxhZ3MpOworCisJaWYgKHdhdmVhcnRpc3RfY21kMihkZXZjLCBXQUNNRF9PVVRQVVRTUEVFRCwgc3BlZWQpICYmCisJICAgIHdhdmVhcnRpc3RfY21kMihkZXZjLCBXQUNNRF9PVVRQVVRTUEVFRCwgc3BlZWQpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiBlcnJvciBzZXR0aW5nIHRoZSBwbGF5YmFjayAiCisJCSAgICAgICAic3BlZWQgdG8gJWRIei5cbiIsIHBvcnRjLT5zcGVlZCk7CisKKwlpZiAod2F2ZWFydGlzdF9jbWQyKGRldmMsIFdBQ01EX09VVFBVVENIQU5ORUxTLCBwb3J0Yy0+Y2hhbm5lbHMpKQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiBlcnJvciBzZXR0aW5nIHRoZSBwbGF5YmFjayAiCisJCSAgICAgICAidG8gJWQgY2hhbm5lbHNcbiIsIHBvcnRjLT5jaGFubmVscyk7CisKKwlpZiAod2F2ZWFydGlzdF9jbWQyKGRldmMsIFdBQ01EX09VVFBVVERNQSwgMCkpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVhcnRpc3Q6IGVycm9yIHNldHRpbmcgdGhlIHBsYXliYWNrICIKKwkJICAgICAgICJkYXRhIHBhdGggdG8gMHglWFxuIiwgMCk7CisKKwlpZiAod2F2ZWFydGlzdF9jbWQyKGRldmMsIFdBQ01EX09VVFBVVEZPUk1BVCwgYml0cykpCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVhcnRpc3Q6IGVycm9yIHNldHRpbmcgdGhlIHBsYXliYWNrICIKKwkJICAgICAgICJmb3JtYXQgdG8gJWRcbiIsIHBvcnRjLT5hdWRpb19mb3JtYXQpOworCisJZGV2Yy0+eGZlcl9jb3VudCA9IDA7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisJd2F2ZWFydGlzdF9oYWx0X291dHB1dChkZXYpOworCisJaWYgKGRlYnVnX2ZsZyAmIERFQlVHX0lOVFIpIHsKKwkJcHJpbnRrKCJXQSBDVExSIHJlZzogMHglMDJYLlxuIixpbmIoZGV2Yy0+aHcuaW9fYmFzZSArIENUTFIpKTsKKwkJcHJpbnRrKCJXQSBTVEFUIHJlZzogMHglMDJYLlxuIixpbmIoZGV2Yy0+aHcuaW9fYmFzZSArIFNUQVRSKSk7CisJCXByaW50aygiV0EgSVJRUyByZWc6IDB4JTAyWC5cbiIsaW5iKGRldmMtPmh3LmlvX2Jhc2UgKyBJUlFTVEFUKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X2hhbHQoaW50IGRldikKK3sKKwl3YXZuY19wb3J0X2luZm8JKnBvcnRjID0gKHdhdm5jX3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCXdhdm5jX2luZm8JKmRldmM7CisKKwlpZiAocG9ydGMtPm9wZW5fbW9kZSAmIE9QRU5fV1JJVEUpCisJCXdhdmVhcnRpc3RfaGFsdF9vdXRwdXQoZGV2KTsKKworCWlmIChwb3J0Yy0+b3Blbl9tb2RlICYgT1BFTl9SRUFEKQorCQl3YXZlYXJ0aXN0X2hhbHRfaW5wdXQoZGV2KTsKKworCWRldmMgPSAod2F2bmNfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJZGV2Yy0+YXVkaW9fbW9kZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X2hhbHRfaW5wdXQoaW50IGRldikKK3sKKwl3YXZuY19pbmZvCSpkZXZjID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIFN0b3AgY2FwdHVyZQorCSAqLworCXdhdmVhcnRpc3RfY21kMShkZXZjLCBXQUNNRF9JTlBVVFNUT1ApOworCisJZGV2Yy0+YXVkaW9fbW9kZSAmPSB+UENNX0VOQUJMRV9JTlBVVDsKKworCS8qCisJICogQ2xlYXIgaW50ZXJydXB0IGJ5IHRvZ2dsaW5nCisJICogdGhlIElSUV9BQ0sgYml0IGluIENUUkwKKwkgKi8KKwlpZiAoaW5iKGRldmMtPmh3LmlvX2Jhc2UgKyBTVEFUUikgJiBJUlFfUkVRKQorCQl3YXZlYXJ0aXN0X2lhY2soZGV2Yyk7CisKKy8vCWRldmMtPmF1ZGlvX21vZGUgJj0gflBDTV9FTkFCTEVfSU5QVVQ7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQKK3dhdmVhcnRpc3RfaGFsdF9vdXRwdXQoaW50IGRldikKK3sKKwl3YXZuY19pbmZvCSpkZXZjID0gKHdhdm5jX2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5kZXZjOworCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisKKwl3YXZlYXJ0aXN0X2NtZDEoZGV2YywgV0FDTURfT1VUUFVUU1RPUCk7CisKKwlkZXZjLT5hdWRpb19tb2RlICY9IH5QQ01fRU5BQkxFX09VVFBVVDsKKworCS8qCisJICogQ2xlYXIgaW50ZXJydXB0IGJ5IHRvZ2dsaW5nCisJICogdGhlIElSUV9BQ0sgYml0IGluIENUUkwKKwkgKi8KKwlpZiAoaW5iKGRldmMtPmh3LmlvX2Jhc2UgKyBTVEFUUikgJiBJUlFfUkVRKQorCQl3YXZlYXJ0aXN0X2lhY2soZGV2Yyk7CisKKy8vCWRldmMtPmF1ZGlvX21vZGUgJj0gflBDTV9FTkFCTEVfT1VUUFVUOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X3RyaWdnZXIoaW50IGRldiwgaW50IHN0YXRlKQoreworCXdhdm5jX2luZm8JKmRldmMgPSAod2F2bmNfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJd2F2bmNfcG9ydF9pbmZvCSpwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKwl1bnNpZ25lZCBsb25nCWZsYWdzOworCisJaWYgKGRlYnVnX2ZsZyAmIERFQlVHX1RSSUdHRVIpIHsKKwkJcHJpbnRrKCJ3YXZuYzogYXVkaW8gdHJpZ2dlciAiKTsKKwkJaWYgKHN0YXRlICYgUENNX0VOQUJMRV9JTlBVVCkKKwkJCXByaW50aygiaW4gIik7CisJCWlmIChzdGF0ZSAmIFBDTV9FTkFCTEVfT1VUUFVUKQorCQkJcHJpbnRrKCJvdXQiKTsKKwkJcHJpbnRrKCJcbiIpOworCX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKworCXN0YXRlICY9IGRldmMtPmF1ZGlvX21vZGU7CisKKwlpZiAocG9ydGMtPm9wZW5fbW9kZSAmIE9QRU5fUkVBRCAmJgorCSAgICBzdGF0ZSAmIFBDTV9FTkFCTEVfSU5QVVQpCisJCS8qCisJCSAqIGVuYWJsZSBBREMgRGF0YSBUcmFuc2ZlciB0byBQQworCQkgKi8KKwkJd2F2ZWFydGlzdF9jbWQxKGRldmMsIFdBQ01EX0lOUFVUU1RBUlQpOworCisJaWYgKHBvcnRjLT5vcGVuX21vZGUgJiBPUEVOX1dSSVRFICYmCisJICAgIHN0YXRlICYgUENNX0VOQUJMRV9PVVRQVVQpCisJCS8qCisJCSAqIGVuYWJsZSBEQUMgZGF0YSB0cmFuc2ZlciBmcm9tIFBDCisJCSAqLworCQl3YXZlYXJ0aXN0X2NtZDEoZGV2YywgV0FDTURfT1VUUFVUU1RBUlQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVhcnRpc3Rfc2V0X3NwZWVkKGludCBkZXYsIGludCBhcmcpCit7CisJd2F2bmNfcG9ydF9pbmZvICpwb3J0YyA9ICh3YXZuY19wb3J0X2luZm8gKikgYXVkaW9fZGV2c1tkZXZdLT5wb3J0YzsKKworCWlmIChhcmcgPD0gMCkKKwkJcmV0dXJuIHBvcnRjLT5zcGVlZDsKKworCWlmIChhcmcgPCA1MDAwKQorCQlhcmcgPSA1MDAwOworCWlmIChhcmcgPiA0NDEwMCkKKwkJYXJnID0gNDQxMDA7CisKKwlwb3J0Yy0+c3BlZWQgPSBhcmc7CisJcmV0dXJuIHBvcnRjLT5zcGVlZDsKKworfQorCitzdGF0aWMgc2hvcnQKK3dhdmVhcnRpc3Rfc2V0X2NoYW5uZWxzKGludCBkZXYsIHNob3J0IGFyZykKK3sKKwl3YXZuY19wb3J0X2luZm8gKnBvcnRjID0gKHdhdm5jX3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCisJaWYgKGFyZyAhPSAxICYmIGFyZyAhPSAyKQorCQlyZXR1cm4gcG9ydGMtPmNoYW5uZWxzOworCisJcG9ydGMtPmNoYW5uZWxzID0gYXJnOworCXJldHVybiBhcmc7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3dhdmVhcnRpc3Rfc2V0X2JpdHMoaW50IGRldiwgdW5zaWduZWQgaW50IGFyZykKK3sKKwl3YXZuY19wb3J0X2luZm8gKnBvcnRjID0gKHdhdm5jX3BvcnRfaW5mbyAqKSBhdWRpb19kZXZzW2Rldl0tPnBvcnRjOworCisJaWYgKGFyZyA9PSAwKQorCQlyZXR1cm4gcG9ydGMtPmF1ZGlvX2Zvcm1hdDsKKworCWlmICgoYXJnICE9IEFGTVRfVTgpICYmIChhcmcgIT0gQUZNVF9TMTZfTEUpICYmIChhcmcgIT0gQUZNVF9TOCkpCisJCWFyZyA9IEFGTVRfVTg7CisKKwlwb3J0Yy0+YXVkaW9fZm9ybWF0ID0gYXJnOworCisJcmV0dXJuIGFyZzsKK30KKworc3RhdGljIHN0cnVjdCBhdWRpb19kcml2ZXIgd2F2ZWFydGlzdF9hdWRpb19kcml2ZXIgPSB7CisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkub3BlbgkJCT0gd2F2ZWFydGlzdF9vcGVuLAorCS5jbG9zZQkJCT0gd2F2ZWFydGlzdF9jbG9zZSwKKwkub3V0cHV0X2Jsb2NrCQk9IHdhdmVhcnRpc3Rfb3V0cHV0X2Jsb2NrLAorCS5zdGFydF9pbnB1dAkJPSB3YXZlYXJ0aXN0X3N0YXJ0X2lucHV0LAorCS5pb2N0bAkJCT0gd2F2ZWFydGlzdF9pb2N0bCwKKwkucHJlcGFyZV9mb3JfaW5wdXQJPSB3YXZlYXJ0aXN0X3ByZXBhcmVfZm9yX2lucHV0LAorCS5wcmVwYXJlX2Zvcl9vdXRwdXQJPSB3YXZlYXJ0aXN0X3ByZXBhcmVfZm9yX291dHB1dCwKKwkuaGFsdF9pbwkJPSB3YXZlYXJ0aXN0X2hhbHQsCisJLmhhbHRfaW5wdXQJCT0gd2F2ZWFydGlzdF9oYWx0X2lucHV0LAorCS5oYWx0X291dHB1dAkJPSB3YXZlYXJ0aXN0X2hhbHRfb3V0cHV0LAorCS50cmlnZ2VyCQk9IHdhdmVhcnRpc3RfdHJpZ2dlciwKKwkuc2V0X3NwZWVkCQk9IHdhdmVhcnRpc3Rfc2V0X3NwZWVkLAorCS5zZXRfYml0cwkJPSB3YXZlYXJ0aXN0X3NldF9iaXRzLAorCS5zZXRfY2hhbm5lbHMJCT0gd2F2ZWFydGlzdF9zZXRfY2hhbm5lbHMKK307CisKKworc3RhdGljIGlycXJldHVybl90Cit3YXZlYXJ0aXN0X2ludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl3YXZuY19pbmZvICpkZXZjID0gKHdhdm5jX2luZm8gKilkZXZfaWQ7CisJaW50CSAgIGlycXN0YXR1cywgc3RhdHVzOworCisJc3Bpbl9sb2NrKCZ3YXZlYXJ0aXN0X2xvY2spOworCWlycXN0YXR1cyA9IGluYihkZXZjLT5ody5pb19iYXNlICsgSVJRU1RBVCk7CisJc3RhdHVzICAgID0gaW5iKGRldmMtPmh3LmlvX2Jhc2UgKyBTVEFUUik7CisKKwlpZiAoZGVidWdfZmxnICYgREVCVUdfSU5UUikKKwkJcHJpbnRrKCJ3YXZlYXJ0aXN0X2ludHI6IHN0YXQ9JTAyeCwgaXJxc3RhdD0lMDJ4XG4iLAorCQkgICAgICAgc3RhdHVzLCBpcnFzdGF0dXMpOworCisJaWYgKHN0YXR1cyAmIElSUV9SRVEpCS8qIENsZWFyIGludGVycnVwdCAqLworCQl3YXZlYXJ0aXN0X2lhY2soZGV2Yyk7CisJZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiB1bmV4cGVjdGVkIGludGVycnVwdFxuIik7CisKKwlpZiAoaXJxc3RhdHVzICYgMHgwMSkgeworCQlpbnQgdGVtcCA9IDE7CisKKwkJLyogUENNIGJ1ZmZlciBkb25lCisJCSAqLworCQlpZiAoKHN0YXR1cyAmIERNQTApICYmIChkZXZjLT5hdWRpb19tb2RlICYgUENNX0VOQUJMRV9PVVRQVVQpKSB7CisJCQlETUFidWZfb3V0cHV0aW50cihkZXZjLT5wbGF5YmFja19kZXYsIDEpOworCQkJdGVtcCA9IDA7CisJCX0KKwkJaWYgKChzdGF0dXMgJiBETUExKSAmJiAoZGV2Yy0+YXVkaW9fbW9kZSAmIFBDTV9FTkFCTEVfSU5QVVQpKSB7CisJCQlETUFidWZfaW5wdXRpbnRyKGRldmMtPnJlY29yZF9kZXYpOworCQkJdGVtcCA9IDA7CisJCX0KKwkJaWYgKHRlbXApCS8vZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVhcnRpc3Q6IFVua25vd24gaW50ZXJydXB0XG4iKTsKKwl9CisJaWYgKGlycXN0YXR1cyAmIDB4MikKKwkJLy8gV2UgZG8gbm90IHVzZSBTQiBtb2RlIG5hdGl2ZWx5Li4uCisJCXByaW50ayhLRVJOX1dBUk5JTkcgIndhdmVhcnRpc3Q6IFVuZXhwZWN0ZWQgU0IgaW50ZXJydXB0Li4uXG4iKTsKKwlzcGluX3VubG9jaygmd2F2ZWFydGlzdF9sb2NrKTsKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1peGVyIHN0dWZmCisgKi8KK3N0cnVjdCBtaXhfZW50IHsKKwl1bnNpZ25lZCBjaGFyCXJlZ19sOworCXVuc2lnbmVkIGNoYXIJcmVnX3I7CisJdW5zaWduZWQgY2hhcglzaGlmdDsKKwl1bnNpZ25lZCBjaGFyCW1heDsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWl4X2VudCBtaXhfZGV2c1tTT1VORF9NSVhFUl9OUkRFVklDRVNdID0geworCXsgMiwgNiwgMSwgIDcgfSwgLyogU09VTkRfTUlYRVJfVk9MVU1FICAgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX0JBU1MgICAgICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9UUkVCTEUgICAqLworCXsgMCwgMCwgMCwgIDAgfSwgLyogU09VTkRfTUlYRVJfU1lOVEggICAgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX1BDTSAgICAgICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9TUEVBS0VSICAqLworCXsgMCwgNCwgNiwgMzEgfSwgLyogU09VTkRfTUlYRVJfTElORSAgICAgKi8KKwl7IDIsIDYsIDQsICAzIH0sIC8qIFNPVU5EX01JWEVSX01JQyAgICAgICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9DRCAgICAgICAqLworCXsgMCwgMCwgMCwgIDAgfSwgLyogU09VTkRfTUlYRVJfSU1JWCAgICAgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX0FMVFBDTSAgICovCisjaWYgMAorCXsgMywgNywgMCwgMTAgfSwgLyogU09VTkRfTUlYRVJfUkVDTEVWICAgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX0lHQUlOICAgICovCisjZWxzZQorCXsgMCwgMCwgMCwgIDAgfSwgLyogU09VTkRfTUlYRVJfUkVDTEVWICAgKi8KKwl7IDMsIDcsIDAsICA3IH0sIC8qIFNPVU5EX01JWEVSX0lHQUlOICAgICovCisjZW5kaWYKKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX09HQUlOICAgICovCisJeyAwLCA0LCAxLCAzMSB9LCAvKiBTT1VORF9NSVhFUl9MSU5FMSAgICAqLworCXsgMSwgNSwgNiwgMzEgfSwgLyogU09VTkRfTUlYRVJfTElORTIgICAgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX0xJTkUzICAgICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9ESUdJVEFMMSAqLworCXsgMCwgMCwgMCwgIDAgfSwgLyogU09VTkRfTUlYRVJfRElHSVRBTDIgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX0RJR0lUQUwzICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9QSE9ORUlOICAqLworCXsgMCwgMCwgMCwgIDAgfSwgLyogU09VTkRfTUlYRVJfUEhPTkVPVVQgKi8KKwl7IDAsIDAsIDAsICAwIH0sIC8qIFNPVU5EX01JWEVSX1ZJREVPICAgICovCisJeyAwLCAwLCAwLCAgMCB9LCAvKiBTT1VORF9NSVhFUl9SQURJTyAgICAqLworCXsgMCwgMCwgMCwgIDAgfSAgLyogU09VTkRfTUlYRVJfTU9OSVRPUiAgKi8KK307CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X21peGVyX3VwZGF0ZSh3YXZuY19pbmZvICpkZXZjLCBpbnQgd2hpY2hEZXYpCit7CisJdW5zaWduZWQgaW50IGxldl9sZWZ0LCBsZXZfcmlnaHQ7CisKKwlsZXZfbGVmdCAgPSBkZXZjLT5sZXZlbHNbd2hpY2hEZXZdICYgMHhmZjsKKwlsZXZfcmlnaHQgPSBkZXZjLT5sZXZlbHNbd2hpY2hEZXZdID4+IDg7CisKKwlpZiAobGV2X2xlZnQgPiAxMDApCisJCWxldl9sZWZ0ID0gMTAwOworCWlmIChsZXZfcmlnaHQgPiAxMDApCisJCWxldl9yaWdodCA9IDEwMDsKKworI2RlZmluZSBTQ0FMRShsZXYsbWF4KQkoKGxldikgKiAobWF4KSAvIDEwMCkKKworCWlmIChtYWNoaW5lX2lzX25ldHdpbmRlcigpICYmIHdoaWNoRGV2ID09IFNPVU5EX01JWEVSX1BIT05FT1VUKQorCQl3aGljaERldiA9IFNPVU5EX01JWEVSX1ZPTFVNRTsKKworCWlmIChtaXhfZGV2c1t3aGljaERldl0ucmVnX2wgfHwgbWl4X2RldnNbd2hpY2hEZXZdLnJlZ19yKSB7CisJCWNvbnN0IHN0cnVjdCBtaXhfZW50ICptaXggPSBtaXhfZGV2cyArIHdoaWNoRGV2OworCQl1bnNpZ25lZCBpbnQgbWFzaywgbGVmdCwgcmlnaHQ7CisKKwkJbWFzayA9IG1peC0+bWF4IDw8IG1peC0+c2hpZnQ7CisJCWxldl9sZWZ0ICA9IFNDQUxFKGxldl9sZWZ0LCAgbWl4LT5tYXgpIDw8IG1peC0+c2hpZnQ7CisJCWxldl9yaWdodCA9IFNDQUxFKGxldl9yaWdodCwgbWl4LT5tYXgpIDw8IG1peC0+c2hpZnQ7CisKKwkJLyogcmVhZCBsZWZ0IHNldHRpbmcgKi8KKwkJbGVmdCAgPSB3YXZlYXJ0aXN0X2NtZDFfcihkZXZjLCBXQUNNRF9HRVRfTEVWRUwgfAorCQkJCQkgICAgICAgbWl4LT5yZWdfbCA8PCA4KTsKKworCQkvKiByZWFkIHJpZ2h0IHNldHRpbmcgKi8KKwkJcmlnaHQgPSB3YXZlYXJ0aXN0X2NtZDFfcihkZXZjLCBXQUNNRF9HRVRfTEVWRUwgfAorCQkJCQkJbWl4LT5yZWdfciA8PCA4KTsKKworCQlsZWZ0ICA9IChsZWZ0ICAmIH5tYXNrKSB8IChsZXZfbGVmdCAgJiBtYXNrKTsKKwkJcmlnaHQgPSAocmlnaHQgJiB+bWFzaykgfCAobGV2X3JpZ2h0ICYgbWFzayk7CisKKwkJLyogd3JpdGUgbGVmdCxyaWdodCBiYWNrICovCisJCXdhdmVhcnRpc3RfY21kMyhkZXZjLCBXQUNNRF9TRVRfTUlYRVIsIGxlZnQsIHJpZ2h0KTsKKwl9IGVsc2UgeworCQlzd2l0Y2god2hpY2hEZXYpIHsKKwkJY2FzZSBTT1VORF9NSVhFUl9QQ006CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX0xFVkVMLAorCQkJCQlTQ0FMRShsZXZfbGVmdCwgIDMyNzY3KSwKKwkJCQkJU0NBTEUobGV2X3JpZ2h0LCAzMjc2NykpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKKwkJCXdhdmVhcnRpc3RfY21kMyhkZXZjLCAweDAxMDAgfCBXQUNNRF9TRVRfTEVWRUwsCisJCQkJCVNDQUxFKGxldl9sZWZ0LCAgMzI3NjcpLAorCQkJCQlTQ0FMRShsZXZfcmlnaHQsIDMyNzY3KSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIFNldCB0aGUgQURDIE1VWCB0byB0aGUgc3BlY2lmaWVkIHZhbHVlcy4gIFdlIGRvIE5PVCBkbyBhbnkKKyAqIGNoZWNraW5nIG9mIHRoZSB2YWx1ZXMgcGFzc2VkLCBzaW5jZSB3ZSBhc3N1bWUgdGhhdCB0aGUKKyAqIHJlbGV2YW50ICpfc2VsZWN0X2lucHV0IGZ1bmN0aW9uIGhhcyBkb25lIHRoYXQgZm9yIHVzLgorICovCitzdGF0aWMgdm9pZAord2F2ZWFydGlzdF9zZXRfYWRjX211eCh3YXZuY19pbmZvICpkZXZjLCBjaGFyIGxlZnRfZGV2LCBjaGFyIHJpZ2h0X2RldikKK3sKKwl1bnNpZ25lZCBpbnQgcmVnXzA4LCByZWdfMDk7CisKKwlyZWdfMDggPSB3YXZlYXJ0aXN0X2NtZDFfcihkZXZjLCBXQUNNRF9HRVRfTEVWRUwgfCAweDA4MDApOworCXJlZ18wOSA9IHdhdmVhcnRpc3RfY21kMV9yKGRldmMsIFdBQ01EX0dFVF9MRVZFTCB8IDB4MDkwMCk7CisKKwlyZWdfMDggPSAocmVnXzA4ICYgfjB4M2YpIHwgcmlnaHRfZGV2IDw8IDMgfCBsZWZ0X2RldjsKKworCXdhdmVhcnRpc3RfY21kMyhkZXZjLCBXQUNNRF9TRVRfTUlYRVIsIHJlZ18wOCwgcmVnXzA5KTsKK30KKworLyoKKyAqIERlY29kZSBhIHJlY29yZGluZyBtYXNrIGludG8gYSBtaXhlciBzZWxlY3Rpb24gYXMgZm9sbG93czoKKyAqCisgKiAgICAgT1NTIFNvdXJjZQlXQSBTb3VyY2UJQWN0dWFsIHNvdXJjZQorICogIFNPVU5EX01BU0tfSU1JWAlNaXhlcgkJTWl4ZXIgb3V0cHV0IChzYW1lIGFzIEFEMTg0OCkKKyAqICBTT1VORF9NQVNLX0xJTkUJTGluZQkJTGluZSBpbgorICogIFNPVU5EX01BU0tfTElORTEJQXV4IDEJCUF1eCAxIGluCisgKiAgU09VTkRfTUFTS19MSU5FMglBdXggMgkJQXV4IDIgaW4KKyAqICBTT1VORF9NQVNLX01JQwlNaWMJCU1pY3JvcGhvbmUKKyAqLworc3RhdGljIHVuc2lnbmVkIGludAord2F2ZWFydGlzdF9zZWxlY3RfaW5wdXQod2F2bmNfaW5mbyAqZGV2YywgdW5zaWduZWQgaW50IHJlY21hc2ssCisJCQl1bnNpZ25lZCBjaGFyICpkZXZfbCwgdW5zaWduZWQgY2hhciAqZGV2X3IpCit7CisJdW5zaWduZWQgaW50IHJlY2RldiA9IEFEQ19NVVhfTk9ORTsKKworCWlmIChyZWNtYXNrICYgU09VTkRfTUFTS19JTUlYKSB7CisJCXJlY21hc2sgPSBTT1VORF9NQVNLX0lNSVg7CisJCXJlY2RldiA9IEFEQ19NVVhfTUlYRVI7CisJfSBlbHNlIGlmIChyZWNtYXNrICYgU09VTkRfTUFTS19MSU5FMikgeworCQlyZWNtYXNrID0gU09VTkRfTUFTS19MSU5FMjsKKwkJcmVjZGV2ID0gQURDX01VWF9BVVgyOworCX0gZWxzZSBpZiAocmVjbWFzayAmIFNPVU5EX01BU0tfTElORTEpIHsKKwkJcmVjbWFzayA9IFNPVU5EX01BU0tfTElORTE7CisJCXJlY2RldiA9IEFEQ19NVVhfQVVYMTsKKwl9IGVsc2UgaWYgKHJlY21hc2sgJiBTT1VORF9NQVNLX0xJTkUpIHsKKwkJcmVjbWFzayA9IFNPVU5EX01BU0tfTElORTsKKwkJcmVjZGV2ID0gQURDX01VWF9MSU5FOworCX0gZWxzZSBpZiAocmVjbWFzayAmIFNPVU5EX01BU0tfTUlDKSB7CisJCXJlY21hc2sgPSBTT1VORF9NQVNLX01JQzsKKwkJcmVjZGV2ID0gQURDX01VWF9NSUM7CisJfQorCisJKmRldl9sID0gKmRldl9yID0gcmVjZGV2OworCisJcmV0dXJuIHJlY21hc2s7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVhcnRpc3RfZGVjb2RlX21peGVyKHdhdm5jX2luZm8gKmRldmMsIGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbGV2X2wsCisJCQl1bnNpZ25lZCBjaGFyIGxldl9yKQoreworCXN3aXRjaCAoZGV2KSB7CisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwljYXNlIFNPVU5EX01JWEVSX0xJTkU6CisJY2FzZSBTT1VORF9NSVhFUl9NSUM6CisJY2FzZSBTT1VORF9NSVhFUl9JR0FJTjoKKwljYXNlIFNPVU5EX01JWEVSX0xJTkUxOgorCWNhc2UgU09VTkRfTUlYRVJfTElORTI6CisJCWRldmMtPmxldmVsc1tkZXZdID0gbGV2X2wgfCBsZXZfciA8PCA4OworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfSU1JWDoKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlkZXYgPSAtRUlOVkFMOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW50IHdhdmVhcnRpc3RfZ2V0X21peGVyKHdhdm5jX2luZm8gKmRldmMsIGludCBkZXYpCit7CisJcmV0dXJuIGRldmMtPmxldmVsc1tkZXZdOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHdhdmVhcnRpc3RfbWl4ZXJfaW5mbyB3YXZlYXJ0aXN0X21peGVyID0geworCS5zdXBwb3J0ZWRfZGV2cwk9IFNVUFBPUlRFRF9NSVhFUl9ERVZJQ0VTIHwgU09VTkRfTUFTS19JR0FJTiwKKwkucmVjb3JkaW5nX2RldnMJPSBTT1VORF9NQVNLX0xJTkUgIHwgU09VTkRfTUFTS19NSUMgICB8CisJCQlTT1VORF9NQVNLX0xJTkUxIHwgU09VTkRfTUFTS19MSU5FMiB8CisJCQlTT1VORF9NQVNLX0lNSVgsCisJLnN0ZXJlb19kZXZzCT0gKFNVUFBPUlRFRF9NSVhFUl9ERVZJQ0VTIHwgU09VTkRfTUFTS19JR0FJTikgJiB+CisJCQkoU09VTkRfTUFTS19TUEVBS0VSIHwgU09VTkRfTUFTS19JTUlYKSwKKwkuc2VsZWN0X2lucHV0CT0gd2F2ZWFydGlzdF9zZWxlY3RfaW5wdXQsCisJLmRlY29kZV9taXhlcgk9IHdhdmVhcnRpc3RfZGVjb2RlX21peGVyLAorCS5nZXRfbWl4ZXIJPSB3YXZlYXJ0aXN0X2dldF9taXhlciwKK307CisKK3N0YXRpYyB2b2lkCit3YXZlYXJ0aXN0X3NldF9yZWNtYXNrKHdhdm5jX2luZm8gKmRldmMsIHVuc2lnbmVkIGludCByZWNtYXNrKQoreworCXVuc2lnbmVkIGNoYXIgZGV2X2wsIGRldl9yOworCisJcmVjbWFzayAmPSBkZXZjLT5taXgtPnJlY29yZGluZ19kZXZzOworCisJLyoKKwkgKiBJZiBtb3JlIHRoYW4gb25lIHJlY29yZGluZyBkZXZpY2Ugc2VsZWN0ZWQsCisJICogZGlzYWJsZSB0aGUgZGV2aWNlIHRoYXQgaXMgY3VycmVudGx5IGluIHVzZS4KKwkgKi8KKwlpZiAoaHdlaWdodDMyKHJlY21hc2spID4gMSkKKwkJcmVjbWFzayAmPSB+ZGV2Yy0+cmVjbWFzazsKKworCS8qCisJICogVHJhbnNsYXRlIHRoZSByZWNvcmRpbmcgZGV2aWNlIG1hc2sgaW50bworCSAqIHRoZSBBREMgbXVsdGlwbGV4ZXIgc2V0dGluZ3MuCisJICovCisJZGV2Yy0+cmVjbWFzayA9IGRldmMtPm1peC0+c2VsZWN0X2lucHV0KGRldmMsIHJlY21hc2ssCisJCQkJCQkmZGV2X2wsICZkZXZfcik7CisKKwl3YXZlYXJ0aXN0X3NldF9hZGNfbXV4KGRldmMsIGRldl9sLCBkZXZfcik7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVhcnRpc3Rfc2V0X21peGVyKHdhdm5jX2luZm8gKmRldmMsIGludCBkZXYsIHVuc2lnbmVkIGludCBsZXZlbCkKK3sKKwl1bnNpZ25lZCBpbnQgbGV2X2xlZnQgID0gbGV2ZWwgJiAweDAwZmY7CisJdW5zaWduZWQgaW50IGxldl9yaWdodCA9IChsZXZlbCAmIDB4ZmYwMCkgPj4gODsKKworCWlmIChsZXZfbGVmdCA+IDEwMCkKKwkJbGV2X2xlZnQgPSAxMDA7CisJaWYgKGxldl9yaWdodCA+IDEwMCkKKwkJbGV2X3JpZ2h0ID0gMTAwOworCisJLyoKKwkgKiBNb25vIGRldmljZXMgaGF2ZSB0aGVpciByaWdodCB2b2x1bWUgZm9yY2VkIHRvIHRoZWlyCisJICogbGVmdCB2b2x1bWUuICAoZnJvbSBBTFNBIGRyaXZlciBPU1MgZW11bGF0aW9uKS4KKwkgKi8KKwlpZiAoIShkZXZjLT5taXgtPnN0ZXJlb19kZXZzICYgKDEgPDwgZGV2KSkpCisJCWxldl9yaWdodCA9IGxldl9sZWZ0OworCisJZGV2ID0gZGV2Yy0+bWl4LT5kZWNvZGVfbWl4ZXIoZGV2YywgZGV2LCBsZXZfbGVmdCwgbGV2X3JpZ2h0KTsKKworCWlmIChkZXYgPj0gMCkKKwkJd2F2ZWFydGlzdF9taXhlcl91cGRhdGUoZGV2YywgZGV2KTsKKworCXJldHVybiBkZXYgPCAwID8gZGV2IDogMDsKK30KKworc3RhdGljIGludAord2F2ZWFydGlzdF9taXhlcl9pb2N0bChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqIGFyZykKK3sKKwl3YXZuY19pbmZvICpkZXZjID0gKHdhdm5jX2luZm8gKilhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJaW50IHJldCA9IDAsIHZhbCwgbnI7CisKKwkvKgorCSAqIEFsbCBTT1VORF9NSVhFUl8qIGlvY3RscyB1c2UgdHlwZSAnTScKKwkgKi8KKwlpZiAoKChjbWQgPj4gOCkgJiAyNTUpICE9ICdNJykKKwkJcmV0dXJuIC1FTk9JT0NUTENNRDsKKworI2lmZGVmIENPTkZJR19BUkNIX05FVFdJTkRFUgorCWlmIChtYWNoaW5lX2lzX25ldHdpbmRlcigpKSB7CisJCXJldCA9IHZuY19wcml2YXRlX2lvY3RsKGRldiwgY21kLCBhcmcpOworCQlpZiAocmV0ICE9IC1FTk9JT0NUTENNRCkKKwkJCXJldHVybiByZXQ7CisJCWVsc2UKKwkJCXJldCA9IDA7CisJfQorI2VuZGlmCisKKwluciA9IGNtZCAmIDB4ZmY7CisKKwlpZiAoX1NJT0NfRElSKGNtZCkgJiBfU0lPQ19XUklURSkgeworCQlpZiAoZ2V0X3VzZXIodmFsLCAoaW50IF9fdXNlciAqKWFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzd2l0Y2ggKG5yKSB7CisJCWNhc2UgU09VTkRfTUlYRVJfUkVDU1JDOgorCQkJd2F2ZWFydGlzdF9zZXRfcmVjbWFzayhkZXZjLCB2YWwpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlpZiAobnIgPCBTT1VORF9NSVhFUl9OUkRFVklDRVMgJiYKKwkJCSAgICBkZXZjLT5taXgtPnN1cHBvcnRlZF9kZXZzICYgKDEgPDwgbnIpKQorCQkJCXJldCA9IHdhdmVhcnRpc3Rfc2V0X21peGVyKGRldmMsIG5yLCB2YWwpOworCQl9CisJfQorCisJaWYgKHJldCA9PSAwICYmIF9TSU9DX0RJUihjbWQpICYgX1NJT0NfUkVBRCkgeworCQlyZXQgPSAtRUlOVkFMOworCisJCXN3aXRjaCAobnIpIHsKKwkJY2FzZSBTT1VORF9NSVhFUl9SRUNTUkM6CisJCQlyZXQgPSBkZXZjLT5yZWNtYXNrOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9ERVZNQVNLOgorCQkJcmV0ID0gZGV2Yy0+bWl4LT5zdXBwb3J0ZWRfZGV2czsKKwkJCWJyZWFrOworCisJCWNhc2UgU09VTkRfTUlYRVJfU1RFUkVPREVWUzoKKwkJCXJldCA9IGRldmMtPm1peC0+c3RlcmVvX2RldnM7CisJCQlicmVhazsKKworCQljYXNlIFNPVU5EX01JWEVSX1JFQ01BU0s6CisJCQlyZXQgPSBkZXZjLT5taXgtPnJlY29yZGluZ19kZXZzOworCQkJYnJlYWs7CisKKwkJY2FzZSBTT1VORF9NSVhFUl9DQVBTOgorCQkJcmV0ID0gU09VTkRfQ0FQX0VYQ0xfSU5QVVQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaWYgKG5yIDwgU09VTkRfTUlYRVJfTlJERVZJQ0VTKQorCQkJCXJldCA9IGRldmMtPm1peC0+Z2V0X21peGVyKGRldmMsIG5yKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKHJldCA+PSAwKQorCQkJcmV0ID0gcHV0X3VzZXIocmV0LCAoaW50IF9fdXNlciAqKWFyZykgPyAtRUZBVUxUIDogMDsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IG1peGVyX29wZXJhdGlvbnMgd2F2ZWFydGlzdF9taXhlcl9vcGVyYXRpb25zID0KK3sKKwkub3duZXIJPSBUSElTX01PRFVMRSwKKwkuaWQJPSAiV2F2ZUFydGlzdCIsCisJLm5hbWUJPSAiV2F2ZUFydGlzdCIsCisJLmlvY3RsCT0gd2F2ZWFydGlzdF9taXhlcl9pb2N0bAorfTsKKworc3RhdGljIHZvaWQKK3dhdmVhcnRpc3RfbWl4ZXJfcmVzZXQod2F2bmNfaW5mbyAqZGV2YykKK3sKKwlpbnQgaTsKKworCWlmIChkZWJ1Z19mbGcgJiBERUJVR19NSVhFUikKKwkJcHJpbnRrKCIlczogbWl4ZXJfcmVzZXRcbiIsIGRldmMtPmh3Lm5hbWUpOworCisJLyoKKwkgKiByZXNldCBtaXhlciBjbWQKKwkgKi8KKwl3YXZlYXJ0aXN0X2NtZDEoZGV2YywgV0FDTURfUlNUX01JWEVSKTsKKworCS8qCisJICogc2V0IGlucHV0IGZvciBBREMgdG8gY29tZSBmcm9tICdxdWlldCcKKwkgKiB0dXJuIG9uIGRlZmF1bHQgbW9kZXMKKwkgKi8KKwl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCAweDk4MDAsIDB4YTgzNik7CisKKwkvKgorCSAqIHNldCBtaXhlciBpbnB1dCBzZWxlY3QgdG8gbm9uZSwgUlggZmlsdGVyIGdhaW5zIDAgZEIKKwkgKi8KKwl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCAweDRjMDAsIDB4OGMwMCk7CisKKwkvKgorCSAqIHNldCBiaXQgMCByZWcgMiB0byAxIC0gdW5tdXRlIE1vbm9PdXQKKwkgKi8KKwl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCAweDI4MDEsIDB4NjgwMCk7CisKKwkvKiBzZXQgZGVmYXVsdCBpbnB1dCBkZXZpY2UgPSBpbnRlcm5hbCBtaWMKKwkgKiBjdXJyZW50IHJlY29yZGluZyBkZXZpY2UgPSBub25lCisJICovCisJd2F2ZWFydGlzdF9zZXRfcmVjbWFzayhkZXZjLCAwKTsKKworCWZvciAoaSA9IDA7IGkgPCBTT1VORF9NSVhFUl9OUkRFVklDRVM7IGkrKykKKwkJd2F2ZWFydGlzdF9taXhlcl91cGRhdGUoZGV2YywgaSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHdhdmVhcnRpc3RfaW5pdCh3YXZuY19pbmZvICpkZXZjKQoreworCXdhdm5jX3BvcnRfaW5mbyAqcG9ydGM7CisJY2hhciByZXZbM10sIGRldl9uYW1lWzY0XTsKKwlpbnQgbXlfZGV2OworCisJaWYgKHdhdmVhcnRpc3RfcmVzZXQoZGV2YykpCisJCXJldHVybiAtRU5PREVWOworCisJc3ByaW50ZihkZXZfbmFtZSwgIiVzICglcyIsIGRldmMtPmh3Lm5hbWUsIGRldmMtPmNoaXBfbmFtZSk7CisKKwlpZiAod2F2ZWFydGlzdF9nZXRyZXYoZGV2YywgcmV2KSkgeworCQlzdHJjYXQoZGV2X25hbWUsICIgcmV2LiAiKTsKKwkJc3RyY2F0KGRldl9uYW1lLCByZXYpOworCX0KKwlzdHJjYXQoZGV2X25hbWUsICIpIik7CisKKwljb25mX3ByaW50ZjIoZGV2X25hbWUsIGRldmMtPmh3LmlvX2Jhc2UsIGRldmMtPmh3LmlycSwKKwkJICAgICBkZXZjLT5ody5kbWEsIGRldmMtPmh3LmRtYTIpOworCisJcG9ydGMgPSAod2F2bmNfcG9ydF9pbmZvICopa21hbGxvYyhzaXplb2Yod2F2bmNfcG9ydF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKHBvcnRjID09IE5VTEwpCisJCWdvdG8gbm9tZW07CisKKwltZW1zZXQocG9ydGMsIDAsIHNpemVvZih3YXZuY19wb3J0X2luZm8pKTsKKworCW15X2RldiA9IHNvdW5kX2luc3RhbGxfYXVkaW9kcnYoQVVESU9fRFJJVkVSX1ZFUlNJT04sIGRldl9uYW1lLAorCQkJJndhdmVhcnRpc3RfYXVkaW9fZHJpdmVyLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2RyaXZlciksCisJCQlkZXZjLT5hdWRpb19mbGFncywgQUZNVF9VOCB8IEFGTVRfUzE2X0xFIHwgQUZNVF9TOCwKKwkJCWRldmMsIGRldmMtPmh3LmRtYSwgZGV2Yy0+aHcuZG1hMik7CisKKwlpZiAobXlfZGV2IDwgMCkKKwkJZ290byBmcmVlOworCisJYXVkaW9fZGV2c1tteV9kZXZdLT5wb3J0YyA9IHBvcnRjOworCisJd2F2ZWFydGlzdF9taXhlcl9yZXNldChkZXZjKTsKKworCS8qCisJICogY2xlYXIgYW55IHBlbmRpbmcgaW50ZXJydXB0CisJICovCisJd2F2ZWFydGlzdF9pYWNrKGRldmMpOworCisJaWYgKHJlcXVlc3RfaXJxKGRldmMtPmh3LmlycSwgd2F2ZWFydGlzdF9pbnRyLCAwLCBkZXZjLT5ody5uYW1lLCBkZXZjKSA8IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogSVJRICVkIGluIHVzZVxuIiwKKwkJCWRldmMtPmh3Lm5hbWUsIGRldmMtPmh3LmlycSk7CisJCWdvdG8gdW5pbnN0YWxsOworCX0KKworCWlmIChzb3VuZF9hbGxvY19kbWEoZGV2Yy0+aHcuZG1hLCBkZXZjLT5ody5uYW1lKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDYW4ndCBhbGxvY2F0ZSBETUElZFxuIiwKKwkJCWRldmMtPmh3Lm5hbWUsIGRldmMtPmh3LmRtYSk7CisJCWdvdG8gdW5pbnN0YWxsX2lycTsKKwl9CisKKwlpZiAoZGV2Yy0+aHcuZG1hICE9IGRldmMtPmh3LmRtYTIgJiYgZGV2Yy0+aHcuZG1hMiAhPSBOT19ETUEpCisJCWlmIChzb3VuZF9hbGxvY19kbWEoZGV2Yy0+aHcuZG1hMiwgZGV2Yy0+aHcubmFtZSkpIHsKKwkJCXByaW50ayhLRVJOX0VSUiAiJXM6IGNhbid0IGFsbG9jYXRlIERNQSVkXG4iLAorCQkJCWRldmMtPmh3Lm5hbWUsIGRldmMtPmh3LmRtYTIpOworCQkJZ290byB1bmluc3RhbGxfZG1hOworCQl9CisKKwl3YXZlYXJ0aXN0X3NldF9jdGxyKCZkZXZjLT5odywgMCwgRE1BMV9JRSB8IERNQTBfSUUpOworCisJYXVkaW9fZGV2c1tteV9kZXZdLT5taXhlcl9kZXYgPQorCQlzb3VuZF9pbnN0YWxsX21peGVyKE1JWEVSX0RSSVZFUl9WRVJTSU9OLAorCQkJCWRldl9uYW1lLAorCQkJCSZ3YXZlYXJ0aXN0X21peGVyX29wZXJhdGlvbnMsCisJCQkJc2l6ZW9mKHN0cnVjdCBtaXhlcl9vcGVyYXRpb25zKSwKKwkJCQlkZXZjKTsKKworCXJldHVybiBteV9kZXY7CisKK3VuaW5zdGFsbF9kbWE6CisJc291bmRfZnJlZV9kbWEoZGV2Yy0+aHcuZG1hKTsKKwordW5pbnN0YWxsX2lycToKKwlmcmVlX2lycShkZXZjLT5ody5pcnEsIGRldmMpOworCit1bmluc3RhbGw6CisJc291bmRfdW5sb2FkX2F1ZGlvZGV2KG15X2Rldik7CisKK2ZyZWU6CisJa2ZyZWUocG9ydGMpOworCitub21lbToKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX3dhdmVhcnRpc3Qoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworCXdhdm5jX2luZm8gKmRldmMgPSAmYWRldl9pbmZvW25yX3dhdmVhcnRpc3RfZGV2c107CisKKwlpZiAobnJfd2F2ZWFydGlzdF9kZXZzID49IE1BWF9BVURJT19ERVYpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAid2F2ZWFydGlzdDogdG9vIG1hbnkgYXVkaW8gZGV2aWNlc1xuIik7CisJCXJldHVybiAwOworCX0KKworCWlmICghcmVxdWVzdF9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNSwgaHdfY29uZmlnLT5uYW1lKSkgIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiV2F2ZUFydGlzdDogSS9PIHBvcnQgY29uZmxpY3RcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaHdfY29uZmlnLT5pcnEgPiAxNSB8fCBod19jb25maWctPmlycSA8IDApIHsKKwkJcmVsZWFzZV9yZWdpb24oaHdfY29uZmlnLT5pb19iYXNlLCAxNSk7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgIldhdmVBcnRpc3Q6IEJhZCBJUlEgJWRcbiIsCisJCSAgICAgICBod19jb25maWctPmlycSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChod19jb25maWctPmRtYSAhPSAzKSB7CisJCXJlbGVhc2VfcmVnaW9uKGh3X2NvbmZpZy0+aW9fYmFzZSwgMTUpOworCQlwcmludGsoS0VSTl9XQVJOSU5HICJXYXZlQXJ0aXN0OiBCYWQgRE1BICVkXG4iLAorCQkgICAgICAgaHdfY29uZmlnLT5kbWEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlod19jb25maWctPm5hbWUgPSAiV2F2ZUFydGlzdCI7CisJZGV2Yy0+aHcgPSAqaHdfY29uZmlnOworCWRldmMtPm9wZW5fbW9kZSA9IDA7CisJZGV2Yy0+Y2hpcF9uYW1lID0gIlJXQS0wMTAiOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdAorYXR0YWNoX3dhdmVhcnRpc3Qoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHcsIGNvbnN0IHN0cnVjdCB3YXZlYXJ0aXN0X21peGVyX2luZm8gKm1peCkKK3sKKwl3YXZuY19pbmZvICpkZXZjID0gJmFkZXZfaW5mb1tucl93YXZlYXJ0aXN0X2RldnNdOworCisJLyoKKwkgKiBOT1RFISBJZiBpcnEgPCAwLCB0aGVyZSBpcyBhbm90aGVyIGRyaXZlciB3aGljaCBoYXMgYWxsb2NhdGVkIHRoZQorCSAqICAgSVJRIHNvIHRoYXQgdGhpcyBkcml2ZXIgZG9lc24ndCBuZWVkIHRvIGFsbG9jYXRlL2RlYWxsb2NhdGUgaXQuCisJICogICBUaGUgYWN0dWFsbHkgdXNlZCBJUlEgaXMgQUJTKGlycSkuCisJICovCisJZGV2Yy0+aHcgPSAqaHc7CisJZGV2Yy0+aHcuaXJxID0gKGh3LT5pcnEgPiAwKSA/IGh3LT5pcnEgOiAwOworCWRldmMtPm9wZW5fbW9kZSA9IDA7CisJZGV2Yy0+cGxheWJhY2tfZGV2ID0gMDsKKwlkZXZjLT5yZWNvcmRfZGV2ID0gMDsKKwlkZXZjLT5hdWRpb19mbGFncyA9IERNQV9BVVRPTU9ERTsKKwlkZXZjLT5sZXZlbHMgPSBsZXZlbHM7CisKKwlpZiAoaHctPmRtYSAhPSBody0+ZG1hMiAmJiBody0+ZG1hMiAhPSBOT19ETUEpCisJCWRldmMtPmF1ZGlvX2ZsYWdzIHw9IERNQV9EVVBMRVg7CisKKwlkZXZjLT5taXggPSBtaXg7CisJZGV2Yy0+ZGV2X25vID0gd2F2ZWFydGlzdF9pbml0KGRldmMpOworCisJaWYgKGRldmMtPmRldl9ubyA8IDApCisJCXJlbGVhc2VfcmVnaW9uKGh3LT5pb19iYXNlLCAxNSk7CisJZWxzZSB7CisjaWZkZWYgQ09ORklHX0FSQ0hfTkVUV0lOREVSCisJCWlmIChtYWNoaW5lX2lzX25ldHdpbmRlcigpKSB7CisJCQlpbml0X3RpbWVyKCZ2bmNfdGltZXIpOworCQkJdm5jX3RpbWVyLmZ1bmN0aW9uID0gdm5jX3NsaWRlcl90aWNrOworCQkJdm5jX3RpbWVyLmV4cGlyZXMgID0gamlmZmllczsKKwkJCXZuY190aW1lci5kYXRhICAgICA9IG5yX3dhdmVhcnRpc3RfZGV2czsKKwkJCWFkZF90aW1lcigmdm5jX3RpbWVyKTsKKworCQkJdm5jX2NvbmZpZ3VyZV9taXhlcihkZXZjLCAwKTsKKworCQkJZGV2Yy0+bm9fYXV0b3NlbGVjdCA9IDE7CisJCX0KKyNlbmRpZgorCQlucl93YXZlYXJ0aXN0X2RldnMgKz0gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfd2F2ZWFydGlzdChzdHJ1Y3QgYWRkcmVzc19pbmZvICpodykKK3sKKwl3YXZuY19pbmZvICpkZXZjID0gTlVMTDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBucl93YXZlYXJ0aXN0X2RldnM7IGkrKykKKwkJaWYgKGh3LT5pb19iYXNlID09IGFkZXZfaW5mb1tpXS5ody5pb19iYXNlKSB7CisJCQlkZXZjID0gYWRldl9pbmZvICsgaTsKKwkJCWJyZWFrOworCQl9CisKKwlpZiAoZGV2YyAhPSBOVUxMKSB7CisJCWludCBtaXhlcjsKKworI2lmZGVmIENPTkZJR19BUkNIX05FVFdJTkRFUgorCQlpZiAobWFjaGluZV9pc19uZXR3aW5kZXIoKSkKKwkJCWRlbF90aW1lcigmdm5jX3RpbWVyKTsKKyNlbmRpZgorCisJCXJlbGVhc2VfcmVnaW9uKGRldmMtPmh3LmlvX2Jhc2UsIDE1KTsKKworCQl3YXZlYXJ0aXN0X3NldF9jdGxyKCZkZXZjLT5odywgRE1BMV9JRXxETUEwX0lFLCAwKTsKKworCQlpZiAoZGV2Yy0+aHcuaXJxID49IDApCisJCQlmcmVlX2lycShkZXZjLT5ody5pcnEsIGRldmMpOworCisJCXNvdW5kX2ZyZWVfZG1hKGRldmMtPmh3LmRtYSk7CisKKwkJaWYgKGRldmMtPmh3LmRtYSAhPSBkZXZjLT5ody5kbWEyICYmCisJCSAgICBkZXZjLT5ody5kbWEyICE9IE5PX0RNQSkKKwkJCXNvdW5kX2ZyZWVfZG1hKGRldmMtPmh3LmRtYTIpOworCisJCW1peGVyID0gYXVkaW9fZGV2c1tkZXZjLT5kZXZfbm9dLT5taXhlcl9kZXY7CisKKwkJaWYgKG1peGVyID49IDApCisJCQlzb3VuZF91bmxvYWRfbWl4ZXJkZXYobWl4ZXIpOworCisJCWlmIChkZXZjLT5kZXZfbm8gPj0gMCkKKwkJCXNvdW5kX3VubG9hZF9hdWRpb2RldihkZXZjLT5kZXZfbm8pOworCisJCW5yX3dhdmVhcnRpc3RfZGV2cyAtPSAxOworCisJCWZvciAoOyBpIDwgbnJfd2F2ZWFydGlzdF9kZXZzOyBpKyspCisJCQlhZGV2X2luZm9baV0gPSBhZGV2X2luZm9baSArIDFdOworCX0gZWxzZQorCQlwcmludGsoS0VSTl9XQVJOSU5HICJ3YXZlYXJ0aXN0OiBjYW4ndCBmaW5kIGRldmljZSAiCisJCSAgICAgICAidG8gdW5sb2FkXG4iKTsKK30KKworI2lmZGVmIENPTkZJR19BUkNIX05FVFdJTkRFUgorCisvKgorICogUmViZWwuY29tIE5ldHdpbmRlciBzcGVjaWZpY3MuLi4KKyAqLworCisjaW5jbHVkZSA8YXNtL2hhcmR3YXJlL2RlYzIxMjg1Lmg+CisgCisjZGVmaW5lCVZOQ19USU1FUl9QRVJJT0QgKEhaLzQpCS8vY2hlY2sgc2xpZGVyIDQgdGltZXMvc2VjCisKKyNkZWZpbmUJTUlYRVJfUFJJVkFURTNfUkVTRVQJMHg1MzU3MDAwMAorI2RlZmluZQlNSVhFUl9QUklWQVRFM19SRUFECTB4NTM1NzAwMDEKKyNkZWZpbmUJTUlYRVJfUFJJVkFURTNfV1JJVEUJMHg1MzU3MDAwMgorCisjZGVmaW5lCVZOQ19NVVRFX0lOVEVSTkFMX1NQS1IJMHgwMQkvL3RoZSBzdyBtdXRlIG9uL29mZiBjb250cm9sIGJpdAorI2RlZmluZQlWTkNfTVVURV9MSU5FX09VVAkweDEwCisjZGVmaW5lIFZOQ19QSE9ORV9ERVRFQ1QJMHgyMAorI2RlZmluZSBWTkNfSEFORFNFVF9ERVRFQ1QJMHg0MAorI2RlZmluZSBWTkNfRElTQUJMRV9BVVRPU1dJVENICTB4ODAKKworZXh0ZXJuIHNwaW5sb2NrX3QgZ3Bpb19sb2NrOworCitzdGF0aWMgaW5saW5lIHZvaWQKK3ZuY19tdXRlX3Nwa3Iod2F2bmNfaW5mbyAqZGV2YykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmdwaW9fbG9jaywgZmxhZ3MpOworCWNwbGRfbW9kaWZ5KENQTERfVU5NVVRFLCBkZXZjLT5zcGtyX211dGVfc3RhdGUgPyAwIDogQ1BMRF9VTk1VVEUpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmdwaW9fbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZAordm5jX211dGVfbG91dCh3YXZuY19pbmZvICpkZXZjKQoreworCXVuc2lnbmVkIGludCBsZWZ0LCByaWdodDsKKworCWxlZnQgID0gd2F2ZWFydGlzdF9jbWQxX3IoZGV2YywgV0FDTURfR0VUX0xFVkVMKTsKKwlyaWdodCA9IHdhdmVhcnRpc3RfY21kMV9yKGRldmMsIFdBQ01EX0dFVF9MRVZFTCB8IDB4NDAwKTsKKworCWlmIChkZXZjLT5saW5lX211dGVfc3RhdGUpIHsKKwkJbGVmdCAmPSB+MTsKKwkJcmlnaHQgJj0gfjE7CisJfSBlbHNlIHsKKwkJbGVmdCB8PSAxOworCQlyaWdodCB8PSAxOworCX0KKwl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBsZWZ0LCByaWdodCk7CisJCQorfQorCitzdGF0aWMgaW50Cit2bmNfdm9sdW1lX3NsaWRlcih3YXZuY19pbmZvICpkZXZjKQoreworCXN0YXRpYyBzaWduZWQgaW50IG9sZF9zbGlkZXJfdm9sdW1lOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc2lnbmVkIGludCB2b2x1bWUgPSAyNTU7CisKKwkqQ1NSX1RJTUVSMV9MT0FEID0gMHgwMGZmZmZmZjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKworCW91dGIoMHhGRiwgMHgyMDEpOworCSpDU1JfVElNRVIxX0NOVEwgPSBUSU1FUl9DTlRMX0VOQUJMRSB8IFRJTUVSX0NOVExfRElWMTsKKworCXdoaWxlICh2b2x1bWUgJiYgKGluYigweDIwMSkgJiAweDAxKSkKKwkJdm9sdW1lLS07CisKKwkqQ1NSX1RJTUVSMV9DTlRMID0gMDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndhdmVhcnRpc3RfbG9jayxmbGFncyk7CisJCisJdm9sdW1lID0gMHgwMGZmZmZmZiAtICpDU1JfVElNRVIxX1ZBTFVFOworCisKKyNpZm5kZWYgUkVWRVJTRQorCXZvbHVtZSA9IDE1MCAtICh2b2x1bWUgPj4gNSk7CisjZWxzZQorCXZvbHVtZSA9ICh2b2x1bWUgPj4gNikgLSAyNTsKKyNlbmRpZgorCisJaWYgKHZvbHVtZSA8IDApCisJCXZvbHVtZSA9IDA7CisKKwlpZiAodm9sdW1lID4gMTAwKQorCQl2b2x1bWUgPSAxMDA7CisKKwkvKgorCSAqIHNsaWRlciBxdWl0ZSBvZnRlbiByZWFkcyArLTgsIHNvIGRlYm91bmNlIHRoaXMgcmFuZG9tIG5vaXNlCisJICovCisJaWYgKGFicyh2b2x1bWUgLSBvbGRfc2xpZGVyX3ZvbHVtZSkgPiA3KSB7CisJCW9sZF9zbGlkZXJfdm9sdW1lID0gdm9sdW1lOworCisJCWlmIChkZWJ1Z19mbGcgJiBERUJVR19NSVhFUikKKwkJCXByaW50ayhLRVJOX0RFQlVHICJTbGlkZXIgdm9sdW1lOiAlZC5cbiIsIHZvbHVtZSk7CisJfQorCisJcmV0dXJuIG9sZF9zbGlkZXJfdm9sdW1lOworfQorCisvKgorICogRGVjb2RlIGEgcmVjb3JkaW5nIG1hc2sgaW50byBhIG1peGVyIHNlbGVjdGlvbiBvbiB0aGUgTmV0V2luZGVyCisgKiBhcyBmb2xsb3dzOgorICoKKyAqICAgICBPU1MgU291cmNlCVdBIFNvdXJjZQlBY3R1YWwgc291cmNlCisgKiAgU09VTkRfTUFTS19JTUlYCU1peGVyCQlNaXhlciBvdXRwdXQgKHNhbWUgYXMgQUQxODQ4KQorICogIFNPVU5EX01BU0tfTElORQlMaW5lCQlMaW5lIGluCisgKiAgU09VTkRfTUFTS19MSU5FMQlMZWZ0IE1pYwlIYW5kc2V0CisgKiAgU09VTkRfTUFTS19QSE9ORUlOCUxlZnQgQXV4CVRlbGVwaG9uZSBtaWNyb3Bob25lCisgKiAgU09VTkRfTUFTS19NSUMJUmlnaHQgTWljCUJ1aWx0aW4gbWljcm9waG9uZQorICovCitzdGF0aWMgdW5zaWduZWQgaW50CituZXR3aW5kZXJfc2VsZWN0X2lucHV0KHdhdm5jX2luZm8gKmRldmMsIHVuc2lnbmVkIGludCByZWNtYXNrLAorCQkgICAgICAgdW5zaWduZWQgY2hhciAqZGV2X2wsIHVuc2lnbmVkIGNoYXIgKmRldl9yKQoreworCXVuc2lnbmVkIGludCByZWNkZXZfbCA9IEFEQ19NVVhfTk9ORSwgcmVjZGV2X3IgPSBBRENfTVVYX05PTkU7CisKKwlpZiAocmVjbWFzayAmIFNPVU5EX01BU0tfSU1JWCkgeworCQlyZWNtYXNrID0gU09VTkRfTUFTS19JTUlYOworCQlyZWNkZXZfbCA9IEFEQ19NVVhfTUlYRVI7CisJCXJlY2Rldl9yID0gQURDX01VWF9NSVhFUjsKKwl9IGVsc2UgaWYgKHJlY21hc2sgJiBTT1VORF9NQVNLX0xJTkUpIHsKKwkJcmVjbWFzayA9IFNPVU5EX01BU0tfTElORTsKKwkJcmVjZGV2X2wgPSBBRENfTVVYX0xJTkU7CisJCXJlY2Rldl9yID0gQURDX01VWF9MSU5FOworCX0gZWxzZSBpZiAocmVjbWFzayAmIFNPVU5EX01BU0tfTElORTEpIHsKKwkJcmVjbWFzayA9IFNPVU5EX01BU0tfTElORTE7CisJCXdhdmVhcnRpc3RfY21kMShkZXZjLCBXQUNNRF9TRVRfTU9OTyk7IC8qIGxlZnQgKi8KKwkJcmVjZGV2X2wgPSBBRENfTVVYX01JQzsKKwkJcmVjZGV2X3IgPSBBRENfTVVYX05PTkU7CisJfSBlbHNlIGlmIChyZWNtYXNrICYgU09VTkRfTUFTS19QSE9ORUlOKSB7CisJCXJlY21hc2sgPSBTT1VORF9NQVNLX1BIT05FSU47CisJCXdhdmVhcnRpc3RfY21kMShkZXZjLCBXQUNNRF9TRVRfTU9OTyk7IC8qIGxlZnQgKi8KKwkJcmVjZGV2X2wgPSBBRENfTVVYX0FVWDE7CisJCXJlY2Rldl9yID0gQURDX01VWF9OT05FOworCX0gZWxzZSBpZiAocmVjbWFzayAmIFNPVU5EX01BU0tfTUlDKSB7CisJCXJlY21hc2sgPSBTT1VORF9NQVNLX01JQzsKKwkJd2F2ZWFydGlzdF9jbWQxKGRldmMsIFdBQ01EX1NFVF9NT05PIHwgMHgxMDApOwkvKiByaWdodCAqLworCQlyZWNkZXZfbCA9IEFEQ19NVVhfTk9ORTsKKwkJcmVjZGV2X3IgPSBBRENfTVVYX01JQzsKKwl9CisKKwkqZGV2X2wgPSByZWNkZXZfbDsKKwkqZGV2X3IgPSByZWNkZXZfcjsKKworCXJldHVybiByZWNtYXNrOworfQorCitzdGF0aWMgaW50CituZXR3aW5kZXJfZGVjb2RlX21peGVyKHdhdm5jX2luZm8gKmRldmMsIGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbGV2X2wsCisJCSAgICAgICB1bnNpZ25lZCBjaGFyIGxldl9yKQoreworCXN3aXRjaCAoZGV2KSB7CisJY2FzZSBTT1VORF9NSVhFUl9WT0xVTUU6CisJY2FzZSBTT1VORF9NSVhFUl9TWU5USDoKKwljYXNlIFNPVU5EX01JWEVSX1BDTToKKwljYXNlIFNPVU5EX01JWEVSX0xJTkU6CisJY2FzZSBTT1VORF9NSVhFUl9JR0FJTjoKKwkJZGV2Yy0+bGV2ZWxzW2Rldl0gPSBsZXZfbCB8IGxldl9yIDw8IDg7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9NSUM6CQkvKiByaWdodCBtaWMgb25seSAqLworCQlkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTUlDXSAmPSAweGZmOworCQlkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTUlDXSB8PSBsZXZfbCA8PCA4OworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfTElORTE6CQkvKiBsZWZ0IG1pYyBvbmx5ICAqLworCQlkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTUlDXSAmPSAweGZmMDA7CisJCWRldmMtPmxldmVsc1tTT1VORF9NSVhFUl9NSUNdIHw9IGxldl9sOworCQlkZXYgPSBTT1VORF9NSVhFUl9NSUM7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9QSE9ORUlOOgkvKiBsZWZ0IGF1eCBvbmx5ICAqLworCQlkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTElORTFdID0gbGV2X2w7CisJCWRldiA9IFNPVU5EX01JWEVSX0xJTkUxOworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfSU1JWDoKKwljYXNlIFNPVU5EX01JWEVSX1BIT05FT1VUOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWRldiA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gZGV2OworfQorCitzdGF0aWMgaW50IG5ldHdpbmRlcl9nZXRfbWl4ZXIod2F2bmNfaW5mbyAqZGV2YywgaW50IGRldikKK3sKKwlpbnQgbGV2ZWxzOworCisJc3dpdGNoIChkZXYpIHsKKwljYXNlIFNPVU5EX01JWEVSX1ZPTFVNRToKKwljYXNlIFNPVU5EX01JWEVSX1NZTlRIOgorCWNhc2UgU09VTkRfTUlYRVJfUENNOgorCWNhc2UgU09VTkRfTUlYRVJfTElORToKKwljYXNlIFNPVU5EX01JWEVSX0lHQUlOOgorCQlsZXZlbHMgPSBkZXZjLT5sZXZlbHNbZGV2XTsKKwkJYnJlYWs7CisKKwljYXNlIFNPVU5EX01JWEVSX01JQzoJCS8qIGJ1aWx0aW4gbWljOiByaWdodCBtaWMgb25seSAqLworCQlsZXZlbHMgPSBkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTUlDXSA+PiA4OworCQlsZXZlbHMgfD0gbGV2ZWxzIDw8IDg7CisJCWJyZWFrOworCisJY2FzZSBTT1VORF9NSVhFUl9MSU5FMToJCS8qIGhhbmRzZXQgbWljOiBsZWZ0IG1pYyBvbmx5ICovCisJCWxldmVscyA9IGRldmMtPmxldmVsc1tTT1VORF9NSVhFUl9NSUNdICYgMHhmZjsKKwkJbGV2ZWxzIHw9IGxldmVscyA8PCA4OworCQlicmVhazsKKworCWNhc2UgU09VTkRfTUlYRVJfUEhPTkVJTjoJLyogcGhvbmUgbWljOiBsZWZ0IGF1eDEgb25seSAqLworCQlsZXZlbHMgPSBkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfTElORTFdICYgMHhmZjsKKwkJbGV2ZWxzIHw9IGxldmVscyA8PCA4OworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWxldmVscyA9IDA7CisJfQorCisJcmV0dXJuIGxldmVsczsKK30KKworLyoKKyAqIFdhdmVhcnRpc3Qgc3BlY2lmaWMgbWl4ZXIgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgd2F2ZWFydGlzdF9taXhlcl9pbmZvIG5ldHdpbmRlcl9taXhlciA9IHsKKwkuc3VwcG9ydGVkX2RldnMJPSBTT1VORF9NQVNLX1ZPTFVNRSAgfCBTT1VORF9NQVNLX1NZTlRIICAgfAorCQkJU09VTkRfTUFTS19QQ00gICAgIHwgU09VTkRfTUFTS19TUEVBS0VSIHwKKwkJCVNPVU5EX01BU0tfTElORSAgICB8IFNPVU5EX01BU0tfTUlDICAgICB8CisJCQlTT1VORF9NQVNLX0lNSVggICAgfCBTT1VORF9NQVNLX0xJTkUxICAgfAorCQkJU09VTkRfTUFTS19QSE9ORUlOIHwgU09VTkRfTUFTS19QSE9ORU9VVHwKKwkJCVNPVU5EX01BU0tfSUdBSU4sCisKKwkucmVjb3JkaW5nX2RldnMJPSBTT1VORF9NQVNLX0xJTkUgICAgfCBTT1VORF9NQVNLX01JQyAgICAgfAorCQkJU09VTkRfTUFTS19JTUlYICAgIHwgU09VTkRfTUFTS19MSU5FMSAgIHwKKwkJCVNPVU5EX01BU0tfUEhPTkVJTiwKKworCS5zdGVyZW9fZGV2cwk9IFNPVU5EX01BU0tfVk9MVU1FICB8IFNPVU5EX01BU0tfU1lOVEggICB8CisJCQlTT1VORF9NQVNLX1BDTSAgICAgfCBTT1VORF9NQVNLX0xJTkUgICAgfAorCQkJU09VTkRfTUFTS19JTUlYICAgIHwgU09VTkRfTUFTS19JR0FJTiwKKworCS5zZWxlY3RfaW5wdXQJPSBuZXR3aW5kZXJfc2VsZWN0X2lucHV0LAorCS5kZWNvZGVfbWl4ZXIJPSBuZXR3aW5kZXJfZGVjb2RlX21peGVyLAorCS5nZXRfbWl4ZXIJPSBuZXR3aW5kZXJfZ2V0X21peGVyLAorfTsKKworc3RhdGljIHZvaWQKK3ZuY19jb25maWd1cmVfbWl4ZXIod2F2bmNfaW5mbyAqZGV2YywgdW5zaWduZWQgaW50IHJlY21hc2spCit7CisJaWYgKCFkZXZjLT5ub19hdXRvc2VsZWN0KSB7CisJCWlmIChkZXZjLT5oYW5kc2V0X2RldGVjdCkgeworCQkJcmVjbWFzayA9IFNPVU5EX01BU0tfTElORTE7CisJCQlkZXZjLT5zcGtyX211dGVfc3RhdGUgPSBkZXZjLT5saW5lX211dGVfc3RhdGUgPSAxOworCQl9IGVsc2UgaWYgKGRldmMtPnRlbGVwaG9uZV9kZXRlY3QpIHsKKwkJCXJlY21hc2sgPSBTT1VORF9NQVNLX1BIT05FSU47CisJCQlkZXZjLT5zcGtyX211dGVfc3RhdGUgPSBkZXZjLT5saW5lX211dGVfc3RhdGUgPSAxOworCQl9IGVsc2UgeworCQkJLyogdW5sZXNzIHNvbWVvbmUgaGFzIGFza2VkIGZvciBMSU5FLUlOLAorCQkJICogd2UgZGVmYXVsdCB0byBNSUMKKwkJCSAqLworCQkJaWYgKChkZXZjLT5yZWNtYXNrICYgU09VTkRfTUFTS19MSU5FKSA9PSAwKQorCQkJCWRldmMtPnJlY21hc2sgPSBTT1VORF9NQVNLX01JQzsKKwkJCWRldmMtPnNwa3JfbXV0ZV9zdGF0ZSA9IGRldmMtPmxpbmVfbXV0ZV9zdGF0ZSA9IDA7CisJCX0KKwkJdm5jX211dGVfc3BrcihkZXZjKTsKKwkJdm5jX211dGVfbG91dChkZXZjKTsKKworCQlpZiAocmVjbWFzayAhPSBkZXZjLT5yZWNtYXNrKQorCQkJd2F2ZWFydGlzdF9zZXRfcmVjbWFzayhkZXZjLCByZWNtYXNrKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3ZuY19zbGlkZXIod2F2bmNfaW5mbyAqZGV2YykKK3sKKwlzaWduZWQgaW50IHNsaWRlcl92b2x1bWU7CisJdW5zaWduZWQgaW50IHRlbXAsIG9sZF9ocywgb2xkX3RkOworCisJLyoKKwkgKiByZWFkIHRoZSAiYnV0dG9ucyIgc3RhdGUuCisJICogIEJpdCA0ID0gMCBtZWFucyBoYW5kc2V0IHByZXNlbnQKKwkgKiAgQml0IDUgPSAxIG1lYW5zIHBob25lIG9mZmhvb2sKKwkgKi8KKwl0ZW1wID0gaW5iKDB4MjAxKTsKKworCW9sZF9ocyA9IGRldmMtPmhhbmRzZXRfZGV0ZWN0OworCW9sZF90ZCA9IGRldmMtPnRlbGVwaG9uZV9kZXRlY3Q7CisKKwlkZXZjLT5oYW5kc2V0X2RldGVjdCA9ICEodGVtcCAmIDB4MTApOworCWRldmMtPnRlbGVwaG9uZV9kZXRlY3QgPSAhISh0ZW1wICYgMHgyMCk7CisKKwlpZiAoIWRldmMtPm5vX2F1dG9zZWxlY3QgJiYKKwkgICAgKG9sZF9ocyAhPSBkZXZjLT5oYW5kc2V0X2RldGVjdCB8fAorCSAgICAgb2xkX3RkICE9IGRldmMtPnRlbGVwaG9uZV9kZXRlY3QpKQorCQl2bmNfY29uZmlndXJlX21peGVyKGRldmMsIGRldmMtPnJlY21hc2spOworCisJc2xpZGVyX3ZvbHVtZSA9IHZuY192b2x1bWVfc2xpZGVyKGRldmMpOworCisJLyoKKwkgKiBJZiB3ZSdyZSB1c2luZyBzb2Z0d2FyZSBjb250cm9sbGVkIHZvbHVtZSwgYW5kCisJICogdGhlIHNsaWRlciBtb3ZlcyBieSBtb3JlIHRoYW4gMjAlLCB0aGVuIHdlCisJICogc3dpdGNoIGJhY2sgdG8gc2xpZGVyIGNvbnRyb2xsZWQgdm9sdW1lLgorCSAqLworCWlmIChhYnMoZGV2Yy0+c2xpZGVyX3ZvbCAtIHNsaWRlcl92b2x1bWUpID4gMjApCisJCWRldmMtPnVzZV9zbGlkZXIgPSAxOworCisJLyoKKwkgKiB1c2Ugb25seSBsZWZ0IGNoYW5uZWwKKwkgKi8KKwl0ZW1wID0gbGV2ZWxzW1NPVU5EX01JWEVSX1ZPTFVNRV0gJiAweEZGOworCisJaWYgKHNsaWRlcl92b2x1bWUgIT0gdGVtcCAmJiBkZXZjLT51c2Vfc2xpZGVyKSB7CisJCWRldmMtPnNsaWRlcl92b2wgPSBzbGlkZXJfdm9sdW1lOworCisJCXdhdmVhcnRpc3Rfc2V0X21peGVyKGRldmMsIFNPVU5EX01JWEVSX1ZPTFVNRSwKKwkJCXNsaWRlcl92b2x1bWUgfCBzbGlkZXJfdm9sdW1lIDw8IDgpOworCisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAordm5jX3NsaWRlcl90aWNrKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlpbnQgbmV4dF90aW1lb3V0OworCisJaWYgKHZuY19zbGlkZXIoYWRldl9pbmZvICsgZGF0YSkpCisJCW5leHRfdGltZW91dCA9IDU7CS8vIG1peGVyIHJlcG9ydGVkIGNoYW5nZQorCWVsc2UKKwkJbmV4dF90aW1lb3V0ID0gVk5DX1RJTUVSX1BFUklPRDsKKworCW1vZF90aW1lcigmdm5jX3RpbWVyLCBqaWZmaWVzICsgbmV4dF90aW1lb3V0KTsKK30KKworc3RhdGljIGludAordm5jX3ByaXZhdGVfaW9jdGwoaW50IGRldiwgdW5zaWduZWQgaW50IGNtZCwgaW50IF9fdXNlciAqIGFyZykKK3sKKwl3YXZuY19pbmZvICpkZXZjID0gKHdhdm5jX2luZm8gKilhdWRpb19kZXZzW2Rldl0tPmRldmM7CisJaW50IHZhbDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMToKKwl7CisJCXVfaW50IHByZXZfc3Brcl9tdXRlLCBwcmV2X2xpbmVfbXV0ZSwgcHJldl9hdXRvX3N0YXRlOworCQlpbnQgdmFsOworCisJCWlmIChnZXRfdXNlcih2YWwsIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQkvKiBjaGVjayBpZiBwYXJhbWV0ZXIgaXMgbG9naWNhbCAqLworCQlpZiAodmFsICYgfihWTkNfTVVURV9JTlRFUk5BTF9TUEtSIHwKKwkJCSAgICBWTkNfTVVURV9MSU5FX09VVCB8CisJCQkgICAgVk5DX0RJU0FCTEVfQVVUT1NXSVRDSCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKworCQlwcmV2X2F1dG9fc3RhdGUgPSBkZXZjLT5ub19hdXRvc2VsZWN0OworCQlwcmV2X3Nwa3JfbXV0ZSAgPSBkZXZjLT5zcGtyX211dGVfc3RhdGU7CisJCXByZXZfbGluZV9tdXRlICA9IGRldmMtPmxpbmVfbXV0ZV9zdGF0ZTsKKworCQlkZXZjLT5ub19hdXRvc2VsZWN0ICAgPSAodmFsICYgVk5DX0RJU0FCTEVfQVVUT1NXSVRDSCkgPyAxIDogMDsKKwkJZGV2Yy0+c3Brcl9tdXRlX3N0YXRlID0gKHZhbCAmIFZOQ19NVVRFX0lOVEVSTkFMX1NQS1IpID8gMSA6IDA7CisJCWRldmMtPmxpbmVfbXV0ZV9zdGF0ZSA9ICh2YWwgJiBWTkNfTVVURV9MSU5FX09VVCkgPyAxIDogMDsKKworCQlpZiAocHJldl9zcGtyX211dGUgIT0gZGV2Yy0+c3Brcl9tdXRlX3N0YXRlKQorCQkJdm5jX211dGVfc3BrcihkZXZjKTsKKworCQlpZiAocHJldl9saW5lX211dGUgIT0gZGV2Yy0+bGluZV9tdXRlX3N0YXRlKQorCQkJdm5jX211dGVfbG91dChkZXZjKTsKKworCQlpZiAocHJldl9hdXRvX3N0YXRlICE9IGRldmMtPm5vX2F1dG9zZWxlY3QpCisJCQl2bmNfY29uZmlndXJlX21peGVyKGRldmMsIGRldmMtPnJlY21hc2spOworCisJCXJldHVybiAwOworCX0KKworCWNhc2UgU09VTkRfTUlYRVJfUFJJVkFURTI6CisJCWlmIChnZXRfdXNlcih2YWwsIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlzd2l0Y2ggKHZhbCkgeworI2RlZmluZSBWTkNfU09VTkRfUEFVU0UgICAgICAgICAweDUzICAgIC8vdG8gcGF1c2UgdGhlIERTUAorI2RlZmluZSBWTkNfU09VTkRfUkVTVU1FICAgICAgICAweDU3ICAgIC8vdG8gdW5wYXVzZSB0aGUgRFNQCisJCWNhc2UgVk5DX1NPVU5EX1BBVVNFOgorCQkJd2F2ZWFydGlzdF9jbWQxKGRldmMsIDB4MTYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBWTkNfU09VTkRfUkVTVU1FOgorCQkJd2F2ZWFydGlzdF9jbWQxKGRldmMsIDB4MTgpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXJldHVybiAwOworCisJLyogcHJpdmF0ZSBpb2N0bCB0byBhbGxvdyBidWxrIGFjY2VzcyB0byB3YXZlYXJ0aXN0ICovCisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFMzoKKwl7CisJCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CisJCWludAkJbWl4ZXJfcmVnWzE1XSwgaSwgdmFsOworCisJCWlmIChnZXRfdXNlcih2YWwsIGFyZykpCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKG1peGVyX3JlZywgKHZvaWQgKil2YWwsIHNpemVvZihtaXhlcl9yZWcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXN3aXRjaCAobWl4ZXJfcmVnWzE0XSkgeworCQljYXNlIE1JWEVSX1BSSVZBVEUzX1JFU0VUOgorCQkJd2F2ZWFydGlzdF9taXhlcl9yZXNldChkZXZjKTsKKwkJCWJyZWFrOworCisJCWNhc2UgTUlYRVJfUFJJVkFURTNfV1JJVEU6CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBtaXhlcl9yZWdbMF0sIG1peGVyX3JlZ1s0XSk7CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBtaXhlcl9yZWdbMV0sIG1peGVyX3JlZ1s1XSk7CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBtaXhlcl9yZWdbMl0sIG1peGVyX3JlZ1s2XSk7CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBtaXhlcl9yZWdbM10sIG1peGVyX3JlZ1s3XSk7CisJCQl3YXZlYXJ0aXN0X2NtZDMoZGV2YywgV0FDTURfU0VUX01JWEVSLCBtaXhlcl9yZWdbOF0sIG1peGVyX3JlZ1s5XSk7CisKKwkJCXdhdmVhcnRpc3RfY21kMyhkZXZjLCBXQUNNRF9TRVRfTEVWRUwsIG1peGVyX3JlZ1sxMF0sIG1peGVyX3JlZ1sxMV0pOworCQkJd2F2ZWFydGlzdF9jbWQzKGRldmMsIFdBQ01EX1NFVF9MRVZFTCwgbWl4ZXJfcmVnWzEyXSwgbWl4ZXJfcmVnWzEzXSk7CisJCQlicmVhazsKKworCQljYXNlIE1JWEVSX1BSSVZBVEUzX1JFQUQ6CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmd2F2ZWFydGlzdF9sb2NrLCBmbGFncyk7CisKKwkJCWZvciAoaSA9IDB4MzA7IGkgPCAxNCA8PCA4OyBpICs9IDEgPDwgOCkKKwkJCQl3YXZlYXJ0aXN0X2NtZChkZXZjLCAxLCAmaSwgMSwgbWl4ZXJfcmVnICsgKGkgPj4gOCkpOworCisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3YXZlYXJ0aXN0X2xvY2ssIGZsYWdzKTsKKworCQkJaWYgKGNvcHlfdG9fdXNlcigodm9pZCAqKXZhbCwgbWl4ZXJfcmVnLCBzaXplb2YobWl4ZXJfcmVnKSkpCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogcmVhZCBiYWNrIHRoZSBzdGF0ZSBmcm9tIFBSSVZBVEUxICovCisJY2FzZSBTT1VORF9NSVhFUl9QUklWQVRFNDoKKwkJdmFsID0gKGRldmMtPnNwa3JfbXV0ZV9zdGF0ZSAgPyBWTkNfTVVURV9JTlRFUk5BTF9TUEtSIDogMCkgfAorCQkgICAgICAoZGV2Yy0+bGluZV9tdXRlX3N0YXRlICA/IFZOQ19NVVRFX0xJTkVfT1VUICAgICAgOiAwKSB8CisJCSAgICAgIChkZXZjLT5oYW5kc2V0X2RldGVjdCAgID8gVk5DX0hBTkRTRVRfREVURUNUICAgICA6IDApIHwKKwkJICAgICAgKGRldmMtPnRlbGVwaG9uZV9kZXRlY3QgPyBWTkNfUEhPTkVfREVURUNUICAgICAgIDogMCkgfAorCQkgICAgICAoZGV2Yy0+bm9fYXV0b3NlbGVjdCAgICA/IFZOQ19ESVNBQkxFX0FVVE9TV0lUQ0ggOiAwKTsKKworCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBhcmcpID8gLUVGQVVMVCA6IDA7CisJfQorCisJaWYgKF9TSU9DX0RJUihjbWQpICYgX1NJT0NfV1JJVEUpIHsKKwkJLyoKKwkJICogc3BlY2lhbCBjYXNlIGZvciBtYXN0ZXIgdm9sdW1lOiBpZiB3ZQorCQkgKiByZWNlaXZlZCB0aGlzIGNhbGwgLSBzd2l0Y2ggZnJvbSBodworCQkgKiB2b2x1bWUgY29udHJvbCB0byBhIHNvZnR3YXJlIHZvbHVtZQorCQkgKiBjb250cm9sLCB0aWxsIHRoZSBodyB2b2x1bWUgaXMgbW9kaWZpZWQKKwkJICogdG8gc2lnbmFsIHRoYXQgdXNlciB3YW50cyB0byBiZSBiYWNrIGluCisJCSAqIGhhcmR3YXJlLi4uCisJCSAqLworCQlpZiAoKGNtZCAmIDB4ZmYpID09IFNPVU5EX01JWEVSX1ZPTFVNRSkKKwkJCWRldmMtPnVzZV9zbGlkZXIgPSAwOworCisJCS8qIHNwZWFrZXIgb3V0cHV0ICAgICAgICAgICAgKi8KKwkJaWYgKChjbWQgJiAweGZmKSA9PSBTT1VORF9NSVhFUl9TUEVBS0VSKSB7CisJCQl1bnNpZ25lZCBpbnQgdmFsLCBsLCByOworCisJCQlpZiAoZ2V0X3VzZXIodmFsLCBhcmcpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQlsID0gdmFsICYgMHg3ZjsKKwkJCXIgPSAodmFsICYgMHg3ZjAwKSA+PiA4OworCQkJdmFsID0gKGwgKyByKSAvIDI7CisJCQlkZXZjLT5sZXZlbHNbU09VTkRfTUlYRVJfU1BFQUtFUl0gPSB2YWwgfCAodmFsIDw8IDgpOworCQkJZGV2Yy0+c3Brcl9tdXRlX3N0YXRlID0gKHZhbCA8PSA1MCk7CisJCQl2bmNfbXV0ZV9zcGtyKGRldmMpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlyZXR1cm4gLUVOT0lPQ1RMQ01EOworfQorCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBhZGRyZXNzX2luZm8gY2ZnOworCitzdGF0aWMgaW50IGF0dGFjaGVkOworCitzdGF0aWMgaW50IF9faW5pdGRhdGEgaW8gPSAwOworc3RhdGljIGludCBfX2luaXRkYXRhIGlycSA9IDA7CitzdGF0aWMgaW50IF9faW5pdGRhdGEgZG1hID0gMDsKK3N0YXRpYyBpbnQgX19pbml0ZGF0YSBkbWEyID0gMDsKKworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3dhdmVhcnRpc3Qodm9pZCkKK3sKKwljb25zdCBzdHJ1Y3Qgd2F2ZWFydGlzdF9taXhlcl9pbmZvICptaXg7CisKKwlpZiAoIWlvICYmIG1hY2hpbmVfaXNfbmV0d2luZGVyKCkpIHsKKwkJLyoKKwkJICogVGhlIE5ldFdpbmRlciBXYXZlQXJ0aXN0IGlzIGF0IGEgZml4ZWQgYWRkcmVzcy4KKwkJICogSWYgdGhlIHVzZXIgZG9lcyBub3Qgc3VwcGx5IGFuIGFkZHJlc3MsIHVzZSB0aGUKKwkJICogd2VsbC1rbm93biBwYXJhbWV0ZXJzLgorCQkgKi8KKwkJaW8gICA9IDB4MjUwOworCQlpcnEgID0gMTI7CisJCWRtYSAgPSAzOworCQlkbWEyID0gNzsKKwl9CisKKwltaXggPSAmd2F2ZWFydGlzdF9taXhlcjsKKyNpZmRlZiBDT05GSUdfQVJDSF9ORVRXSU5ERVIKKwlpZiAobWFjaGluZV9pc19uZXR3aW5kZXIoKSkKKwkJbWl4ID0gJm5ldHdpbmRlcl9taXhlcjsKKyNlbmRpZgorCisJY2ZnLmlvX2Jhc2UgPSBpbzsKKwljZmcuaXJxID0gaXJxOworCWNmZy5kbWEgPSBkbWE7CisJY2ZnLmRtYTIgPSBkbWEyOworCisJaWYgKCFwcm9iZV93YXZlYXJ0aXN0KCZjZmcpKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWF0dGFjaF93YXZlYXJ0aXN0KCZjZmcsIG1peCk7CisJYXR0YWNoZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBjbGVhbnVwX3dhdmVhcnRpc3Qodm9pZCkKK3sKKwlpZiAoYXR0YWNoZWQpCisJCXVubG9hZF93YXZlYXJ0aXN0KCZjZmcpOworfQorCittb2R1bGVfaW5pdChpbml0X3dhdmVhcnRpc3QpOworbW9kdWxlX2V4aXQoY2xlYW51cF93YXZlYXJ0aXN0KTsKKworI2lmbmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3dhdmVhcnRpc3QoY2hhciAqc3RyKQoreworCS8qIGlvLCBpcnEsIGRtYSwgZG1hMiAqLworCWludCBpbnRzWzVdOworCQorCXN0ciA9IGdldF9vcHRpb25zKHN0ciwgQVJSQVlfU0laRShpbnRzKSwgaW50cyk7CisJCisJaW8JPSBpbnRzWzFdOworCWlycQk9IGludHNbMl07CisJZG1hCT0gaW50c1szXTsKKwlkbWEyCT0gaW50c1s0XTsKKworCXJldHVybiAxOworfQorX19zZXR1cCgid2F2ZWFydGlzdD0iLCBzZXR1cF93YXZlYXJ0aXN0KTsKKyNlbmRpZgorCitNT0RVTEVfREVTQ1JJUFRJT04oIlJvY2t3ZWxsIFdhdmVBcnRpc3QgUldBLTAxMCBzb3VuZCBkcml2ZXIiKTsKK01PRFVMRV9QQVJNKGlvLCAiaSIpOwkJLyogSU8gYmFzZSAqLworTU9EVUxFX1BBUk0oaXJxLCAiaSIpOwkJLyogSVJRICovCitNT0RVTEVfUEFSTShkbWEsICJpIik7CQkvKiBETUEgKi8KK01PRFVMRV9QQVJNKGRtYTIsICJpIik7CQkvKiBETUEyICovCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3Mvd2F2ZWFydGlzdC5oIGIvc291bmQvb3NzL3dhdmVhcnRpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDMzZmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3dhdmVhcnRpc3QuaApAQCAtMCwwICsxLDkyIEBACisvKgorICogbGludXgvZHJpdmVycy9zb3VuZC93YXZlYXJ0aXN0LmgKKyAqCisgKiBkZWYgZmlsZSBmb3IgUm9ja3dlbGwgUldBMDEwIGNoaXAgc2V0LCBhcyBpbnN0YWxsZWQgaW4gUmViZWwuY29tIE5ldFdpbmRlcgorICovCisKKy8vcmVnaXN0ZXJzCisjZGVmaW5lIENNRFIJMAorI2RlZmluZSBEQVRSCTIKKyNkZWZpbmUgQ1RMUgk0CisjZGVmaW5lCVNUQVRSCTUKKyNkZWZpbmUJSVJRU1RBVAkxMgorCisvL2JpdCBkZWZzCisvL3JlZyBTVEFUUgorI2RlZmluZQlDTURfV0UJMHg4MAorI2RlZmluZQlDTURfUkYJMHg0MAorI2RlZmluZQlEQVRfV0UJMHgyMAorI2RlZmluZQlEQVRfUkYJMHgxMAorCisjZGVmaW5lCUlSUV9SRVEJMHgwOAorI2RlZmluZQlETUExCTB4MDQKKyNkZWZpbmUJRE1BMAkweDAyCisKKy8vYml0IGRlZnMKKy8vcmVnIENUTFIKKyNkZWZpbmUJQ01EX1dFSUUJMHg4MAorI2RlZmluZQlDTURfUkZJRQkweDQwCisjZGVmaW5lCURBVF9XRUlFCTB4MjAKKyNkZWZpbmUJREFUX1JGSUUJMHgxMAorCisjZGVmaW5lCVJFU0VUCTB4MDgKKyNkZWZpbmUJRE1BMV9JRQkweDA0CisjZGVmaW5lCURNQTBfSUUJMHgwMgorI2RlZmluZQlJUlFfQUNLCTB4MDEKKworLy9jb21tYW5kcworCisjZGVmaW5lCVdBQ01EX1NZU1RFTUlECQkweDAwCisjZGVmaW5lIFdBQ01EX0dFVFJFVgkJMHgwMAorI2RlZmluZQlXQUNNRF9JTlBVVEZPUk1BVAkweDEwCS8vMC04UywgMS0xNlMsIDItOFUKKyNkZWZpbmUJV0FDTURfSU5QVVRDSEFOTkVMUwkweDExCS8vMS1Nb25vLCAyLVN0ZXJlbworI2RlZmluZQlXQUNNRF9JTlBVVFNQRUVECTB4MTIJLy9zYW1wbGluZyByYXRlCisjZGVmaW5lCVdBQ01EX0lOUFVURE1BCQkweDEzCS8vMC04Yml0LCAxLTE2Yml0LCAyLVBJTworI2RlZmluZQlXQUNNRF9JTlBVVFNJWkUJCTB4MTQJLy9zYW1wbGVzIHRvIGludGVycnVwdAorI2RlZmluZQlXQUNNRF9JTlBVVFNUQVJUCTB4MTUJLy9zdGFydCBBREMKKyNkZWZpbmUJV0FDTURfSU5QVVRQQVVTRQkweDE2CS8vcGF1c2UgQURDCisjZGVmaW5lCVdBQ01EX0lOUFVUU1RPUAkJMHgxNwkvL3N0b3AgQURDCisjZGVmaW5lCVdBQ01EX0lOUFVUUkVTVU1FCTB4MTgJLy9yZXN1bWUgQURDCisjZGVmaW5lCVdBQ01EX0lOUFVUUElPCQkweDE5CS8vUElPIEFEQworCisjZGVmaW5lCVdBQ01EX09VVFBVVEZPUk1BVAkweDIwCS8vMC04UywgMS0xNlMsIDItOFUKKyNkZWZpbmUJV0FDTURfT1VUUFVUQ0hBTk5FTFMJMHgyMQkvLzEtTW9ubywgMi1TdGVyZW8KKyNkZWZpbmUJV0FDTURfT1VUUFVUU1BFRUQJMHgyMgkvL3NhbXBsaW5nIHJhdGUKKyNkZWZpbmUJV0FDTURfT1VUUFVURE1BCQkweDIzCS8vMC04Yml0LCAxLTE2Yml0LCAyLVBJTworI2RlZmluZQlXQUNNRF9PVVRQVVRTSVpFCTB4MjQJLy9zYW1wbGVzIHRvIGludGVycnVwdAorI2RlZmluZQlXQUNNRF9PVVRQVVRTVEFSVAkweDI1CS8vc3RhcnQgQURDCisjZGVmaW5lCVdBQ01EX09VVFBVVFBBVVNFCTB4MjYJLy9wYXVzZSBBREMKKyNkZWZpbmUJV0FDTURfT1VUUFVUU1RPUAkweDI3CS8vc3RvcCBBREMKKyNkZWZpbmUJV0FDTURfT1VUUFVUUkVTVU1FCTB4MjgJLy9yZXN1bWUgQURDCisjZGVmaW5lCVdBQ01EX09VVFBVVFBJTwkJMHgyOQkvL1BJTyBBREMKKworI2RlZmluZQlXQUNNRF9HRVRfTEVWRUwJCTB4MzAKKyNkZWZpbmUJV0FDTURfU0VUX0xFVkVMCQkweDMxCisjZGVmaW5lCVdBQ01EX1NFVF9NSVhFUgkJMHgzMgorI2RlZmluZQlXQUNNRF9SU1RfTUlYRVIJCTB4MzMKKyNkZWZpbmUJV0FDTURfU0VUX01PTk8JCTB4MzQKKworLyoKKyAqIERlZmluaXRpb25zIGZvciBsZWZ0L3JpZ2h0IHJlY29yZGluZyBpbnB1dCBtdXgKKyAqLworI2RlZmluZSBBRENfTVVYX05PTkUJMAorI2RlZmluZSBBRENfTVVYX01JWEVSCTEKKyNkZWZpbmUgQURDX01VWF9MSU5FCTIKKyNkZWZpbmUgQURDX01VWF9BVVgyCTMKKyNkZWZpbmUgQURDX01VWF9BVVgxCTQKKyNkZWZpbmUgQURDX01VWF9NSUMJNQorCisvKgorICogRGVmaW5pdGlvbnMgZm9yIG1peGVyIGdhaW4gc2V0dGluZ3MKKyAqLworI2RlZmluZSBNSVhfR0FJTl9MSU5FCTAJLyogbGluZSBpbgkgKi8KKyNkZWZpbmUgTUlYX0dBSU5fQVVYMQkxCS8qIGF1eDEJCSAqLworI2RlZmluZSBNSVhfR0FJTl9BVVgyCTIJLyogYXV4MgkJICovCisjZGVmaW5lIE1JWF9HQUlOX1hNSUMJMwkvKiBjcm9zc292ZXIgbWljICovCisjZGVmaW5lIE1JWF9HQUlOX01JQwk0CS8qIG5vcm1hbCBtaWMJICovCisjZGVmaW5lIE1JWF9HQUlOX1BSRU1JQwk1CS8qIHByZWFtcCBtaWMJICovCisjZGVmaW5lIE1JWF9HQUlOX09VVAk2CS8qIG91dHB1dAkgKi8KKyNkZWZpbmUgTUlYX0dBSU5fTU9OTwk3CS8qIG1vbm8gaW4JICovCisKK2ludCB3YV9zZW5kY21kKHVuc2lnbmVkIGludCBjbWQpOworaW50IHdhX3dyaXRlY21kKHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGludCBhcmcpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3dhdmZyb250LmMgYi9zb3VuZC9vc3Mvd2F2ZnJvbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2UxMjc4Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3dhdmZyb250LmMKQEAgLTAsMCArMSwzNTM4IEBACisvKiAgLSotIGxpbnV4LWMgLSotCisgKgorICogc291bmQvd2F2ZnJvbnQuYworICoKKyAqIEEgTGludXggZHJpdmVyIGZvciBUdXJ0bGUgQmVhY2ggV2F2ZUZyb250IFNlcmllcyAoTWF1aSwgVHJvcGV6LCBUcm9wZXogUGx1cykKKyAqCisgKiBUaGlzIGRyaXZlciBzdXBwb3J0cyB0aGUgb25ib2FyZCB3YXZldGFibGUgc3ludGhlc2l6ZXIgKGFuIElDUzIxMTUpLAorICogaW5jbHVkaW5nIHBhdGNoLCBzYW1wbGUgYW5kIHByb2dyYW0gbG9hZGluZyBhbmQgdW5sb2FkaW5nLCBjb252ZXJzaW9uCisgKiBvZiBHVVMgcGF0Y2hlcyBkdXJpbmcgbG9hZGluZywgYW5kIGZ1bGwgdXNlci1sZXZlbCBhY2Nlc3MgdG8gYWxsCisgKiBXYXZlRnJvbnQgY29tbWFuZHMuIEl0IHRyaWVzIHRvIHByb3ZpZGUgc2VtaS1pbnRlbGxpZ2VudCBwYXRjaCBhbmQKKyAqIHNhbXBsZSBtYW5hZ2VtZW50IGFzIHdlbGwuCisgKgorICogSXQgYWxzbyBwcm92aWRlcyBzdXBwb3J0IGZvciB0aGUgSUNTIGVtdWxhdGlvbiBvZiBhbiBNUFUtNDAxLiAgRnVsbAorICogc3VwcG9ydCBmb3IgdGhlIElDUyBlbXVsYXRpb24ncyAidmlydHVhbCBNSURJIG1vZGUiIGlzIHByb3ZpZGVkIGluCisgKiB3Zl9taWRpLmMuCisgKgorICogU3VwcG9ydCBpcyBhbHNvIHByb3ZpZGVkIGZvciB0aGUgVHJvcGV6IFBsdXMnIG9uYm9hcmQgRlggcHJvY2Vzc29yLAorICogYSBZYW1haGEgWVNTMjI1LiBDdXJyZW50bHksIGNvZGUgZXhpc3RzIHRvIGNvbmZpZ3VyZSB0aGUgWVNTMjI1LAorICogYW5kIHRoZXJlIGlzIGFuIGludGVyZmFjZSBhbGxvd2luZyB0d2Vha2luZyBvZiBhbnkgb2YgaXRzIG1lbW9yeQorICogYWRkcmVzc2VzLiBIb3dldmVyLCBJIGhhdmUgYmVlbiB1bmFibGUgdG8gZGVjaXBoZXIgdGhlIGxvZ2ljYWwKKyAqIHBvc2l0aW9uaW5nIG9mIHRoZSBjb25maWd1cmF0aW9uIGluZm8gZm9yIHZhcmlvdXMgZWZmZWN0cywgc28gZm9yCisgKiBub3csIHlvdSBqdXN0IGdldCB0aGUgWVNTMjI1IGluIHRoZSBzYW1lIHN0YXRlIGFzIFR1cnRsZSBCZWFjaCdzCisgKiAiU0VUVVBTTkQuRVhFIiB1dGlsaXR5IGxlYXZlcyBpdC4KKyAqCisgKiBUaGUgYm9hcmRzJyBEQUMvQURDIChhIENyeXN0YWwgQ1M0MjMyKSBpcyBzdXBwb3J0ZWQgYnkgY3M0MjMyLltjb10sCisgKiBUaGlzIGNoaXAgYWxzbyBjb250cm9scyB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY2FyZDogdGhlIHdhdmVmcm9udAorICogc3ludGggaXMgbG9naWNhbCB1bml0IDQuCisgKgorICoKKyAqIFN1cHBvcnRlZCBkZXZpY2VzOgorICoKKyAqICAgL2Rldi9kc3AgICAgICAgICAgICAgICAgICAgICAgLSB1c2luZyBjczQyMzIrYWQxODQ4IG1vZHVsZXMsIE9TUyBjb21wYXRpYmxlCisgKiAgIC9kZXYvbWlkaU5OIGFuZCAvZGV2L21pZGlOTisxIC0gdXNpbmcgd2ZfbWlkaSBjb2RlLCBPU1MgY29tcGF0aWJsZQorICogICAvZGV2L3N5bnRoMDAgICAgICAgICAgICAgICAgICAtIHJhdyBzeW50aCBpbnRlcmZhY2UKKyAqIAorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIGJ5IFBhdWwgQmFydG9uLURhdmlzIDE5OTgKKyAqCisgKiBTb21lIHBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgdGFrZW4gZnJvbSB3b3JrIHRoYXQgaXMKKyAqIGNvcHlyaWdodCAoQykgYnkgSGFubnUgU2F2b2xhaW5lbiAxOTkzLTE5OTYKKyAqCisgKiBBbHRob3VnaCB0aGUgcmVsZXZhbnQgY29kZSBoZXJlIGlzIGFsbCBuZXcsIHRoZSBoYW5kbGluZyBvZgorICogc2FtcGxlL2FsaWFzL211bHRpLSBzYW1wbGVzIGlzIGVudGlyZWx5IGJhc2VkIG9uIGEgZHJpdmVyIGJ5IE1hdHQKKyAqIE1hcnRpbiBhbmQgUnV0Z2VyIE5pamx1bnNpbmcgd2hpY2ggZGVtb25zdHJhdGVkIGhvdyB0byBnZXQgdGhpbmdzCisgKiB0byB3b3JrIGNvcnJlY3RseS4gVGhlIEdVUyBwYXRjaCBsb2FkaW5nIGNvZGUgaGFzIGJlZW4gYWxtb3N0CisgKiB1bmFsdGVyZWQgYnkgbWUsIGV4Y2VwdCB0byBmaXQgZm9ybWF0dGluZyBhbmQgZnVuY3Rpb24gbmFtZXMgaW4gdGhlCisgKiByZXN0IG9mIHRoZSBmaWxlLiBNYW55IHRoYW5rcyB0byB0aGVtLgorICoKKyAqIEFwcHJlY2lhdGlvbiBhbmQgdGhhbmtzIHRvIEhhbm51IFNhdm9sYWluZW4gZm9yIGhpcyBlYXJseSB3b3JrIG9uIHRoZSBNYXVpCisgKiBkcml2ZXIsIGFuZCBhbnN3ZXJpbmcgYSBmZXcgcXVlc3Rpb25zIHdoaWxlIHRoaXMgb25lIHdhcyBkZXZlbG9wZWQuCisgKgorICogQWJzb2x1dGVseSBOTyB0aGFua3MgdG8gVHVydGxlIEJlYWNoL1ZveWV0cmEgYW5kIFlhbWFoYSBmb3IgdGhlaXIKKyAqIGNvbXBsZXRlIGxhY2sgb2YgaGVscCBpbiBkZXZlbG9waW5nIHRoaXMgZHJpdmVyLCBhbmQgaW4gcGFydGljdWxhcgorICogZm9yIHRoZWlyIHV0dGVyIHNpbGVuY2UgaW4gcmVzcG9uc2UgdG8gcXVlc3Rpb25zIGFib3V0IHVuZG9jdW1lbnRlZAorICogYXNwZWN0cyBvZiBjb25maWd1cmluZyBhIFdhdmVGcm9udCBzb3VuZGNhcmQsIHBhcnRpY3VsYXJseSB0aGUKKyAqIGVmZmVjdHMgcHJvY2Vzc29yLgorICoKKyAqICRJZDogd2F2ZnJvbnQuYyx2IDAuNyAxOTk4LzA5LzA5IDE1OjQ3OjM2IHBiZCBFeHAgJAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKgorICogQ2hhbmdlczoKKyAqIDExLTEwLTIwMDAJQmFydGxvbWllaiBab2xuaWVya2lld2ljeiA8Ymt6QGxpbnV4LWlkZS5vcmc+CisgKgkJQWRkZWQgc29tZSBfX2luaXQgYW5kIF9faW5pdGRhdGEgdG8gZW50cmllcyBpbiB5c3MyMjUuYworICovCisKKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvZmNudGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNjYWxscy5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPiAgICAKKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKworI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8bGludXgvd2F2ZWZyb250Lmg+CisKKyNkZWZpbmUgX01JRElfU1lOVEhfQ18KKyNkZWZpbmUgTUlESV9TWU5USF9OQU1FCSJXYXZlRnJvbnQgTUlESSIKKyNkZWZpbmUgTUlESV9TWU5USF9DQVBTCVNZTlRIX0NBUF9JTlBVVAorI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworLyogQ29tcGlsZS10aW1lIGNvbnRyb2wgb2YgdGhlIGV4dGVudCB0byB3aGljaCBPU1MgaXMgc3VwcG9ydGVkLgorCisgICBJIGNvbnNpZGVyIC9kZXYvc2VxdWVuY2VyIHRvIGJlIGFuIGFuYWNocm9uaXNtLCBidXQgZ2l2ZW4gaXRzCisgICB3aWRlc3ByZWFkIHVzYWdlIGJ5IHZhcmlvdXMgTGludXggTUlESSBzb2Z0d2FyZSwgaXQgc2VlbXMgd29ydGgKKyAgIG9mZmVyaW5nIHN1cHBvcnQgdG8gaXQgaWYgaXQncyBub3QgdG9vIHBhaW5mdWwuIEluc3RlYWQgb2YgdXNpbmcKKyAgIC9kZXYvc2VxdWVuY2VyLCBJIHJlY29tbWVuZDoKKworICAgICBmb3Igc3ludGggcHJvZ3JhbW1pbmcgYW5kIHBhdGNoIGxvYWRpbmc6IC9kZXYvc3ludGhOTgorICAgICBmb3Iga2VybmVsLXN5bmNocm9uaXplZCBNSURJIHNlcXVlbmNpbmc6IHRoZSBBTFNBIHNlcXVlbmNlcgorICAgICBmb3IgZGlyZWN0IE1JREkgY29udHJvbDogL2Rldi9taWRpTk4KKworICAgSSBoYXZlIG5ldmVyIHRyaWVkIHN0YXRpYyBjb21waWxhdGlvbiBpbnRvIHRoZSBrZXJuZWwuIFRoZSAjaWYncworICAgZm9yIHRoaXMgYXJlIHJlYWxseSBqdXN0IG5vdGVzIHRvIG15c2VsZiBhYm91dCB3aGF0IHRoZSBjb2RlIGlzCisgICBmb3IuCisqLworCisjZGVmaW5lIE9TU19TVVBQT1JUX1NFUSAgICAgICAgICAgIDB4MSAgLyogdXNlIG9mIC9kZXYvc2VxdWVuY2VyICovCisjZGVmaW5lIE9TU19TVVBQT1JUX1NUQVRJQ19JTlNUQUxMIDB4MiAgLyogc3RhdGljIGNvbXBpbGF0aW9uIGludG8ga2VybmVsICovCisKKyNkZWZpbmUgT1NTX1NVUFBPUlRfTEVWRUwgICAgICAgICAgMHgxICAvKiBqdXN0IC9kZXYvc2VxdWVuY2VyIGZvciBub3cgKi8KKworI2lmICAgIE9TU19TVVBQT1JUX0xFVkVMICYgT1NTX1NVUFBPUlRfU0VRCitzdGF0aWMgaW50ICgqbWlkaV9sb2FkX3BhdGNoKSAoaW50IGRldm5vLCBpbnQgZm9ybWF0LCBjb25zdCBjaGFyIF9fdXNlciAqYWRkciwKKwkJCSAgICAgICBpbnQgb2ZmcywgaW50IGNvdW50LCBpbnQgcG1ncl9mbGFnKSA9IE5VTEw7CisjZW5kaWYgLyogT1NTX1NVUFBPUlRfU0VRICovCisKKy8qIGlmIFdGX0RFQlVHIG5vdCBkZWZpbmVkLCBubyBydW4tdGltZSBkZWJ1Z2dpbmcgbWVzc2FnZXMgd2lsbAorICAgYmUgYXZhaWxhYmxlIHZpYSB0aGUgZGVidWcgZmxhZyBzZXR0aW5nLiBHaXZlbiB0aGUgY3VycmVudAorICAgYmV0YSBzdGF0ZSBvZiB0aGUgZHJpdmVyLCB0aGlzIHdpbGwgcmVtYWluIHNldCB1bnRpbCBhIGZ1dHVyZSAKKyAgIHZlcnNpb24uCisqLworCisjZGVmaW5lIFdGX0RFQlVHIDEKKworI2lmZGVmIFdGX0RFQlVHCisKKy8qIFRoYW5rIGdvb2RuZXNzIGZvciBnY2MncyBwcmVwcm9jZXNzb3IgLi4uICovCisKKyNkZWZpbmUgRFBSSU5UKGNvbmQsIGZvcm1hdCwgYXJncy4uLikgXAorICAgICAgIGlmICgoZGV2LmRlYnVnICYgKGNvbmQpKSA9PSAoY29uZCkpIHsgXAorCSAgICAgcHJpbnRrIChLRVJOX0RFQlVHIExPR05BTUUgZm9ybWF0LCAjIyBhcmdzKTsgXAorICAgICAgIH0KKyNlbHNlCisjZGVmaW5lIERQUklOVChjb25kLCBmb3JtYXQsIGFyZ3MuLi4pCisjZW5kaWYKKworI2RlZmluZSBMT0dOQU1FICJXYXZlRnJvbnQ6ICIKKworLyogYml0bWFza3MgZm9yIFdhdmVGcm9udCBzdGF0dXMgcG9ydCB2YWx1ZSAqLworCisjZGVmaW5lIFNUQVRfUklOVFJfRU5BQkxFRAkweDAxCisjZGVmaW5lIFNUQVRfQ0FOX1JFQUQJCTB4MDIKKyNkZWZpbmUgU1RBVF9JTlRSX1JFQUQJCTB4MDQKKyNkZWZpbmUgU1RBVF9XSU5UUl9FTkFCTEVECTB4MTAKKyNkZWZpbmUgU1RBVF9DQU5fV1JJVEUJCTB4MjAKKyNkZWZpbmUgU1RBVF9JTlRSX1dSSVRFCQkweDQwCisKKy8qKiogTW9kdWxlLWFjY2Vzc2libGUgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCB3Zl9yYXc7ICAgICAvKiB3ZSBub3JtYWxseSBjaGVjayBmb3IgInJhdyBzdGF0ZSIgdG8gZmlybXdhcmUKKwkJICAgbG9hZGluZy4gaWYgc2V0LCB0aGVuIGR1cmluZyBkcml2ZXIgbG9hZGluZywgdGhlCisJCSAgIHN0YXRlIG9mIHRoZSBib2FyZCBpcyBpZ25vcmVkLCBhbmQgd2UgcmVzZXQgdGhlCisJCSAgIGJvYXJkIGFuZCBsb2FkIHRoZSBmaXJtd2FyZSBhbnl3YXkuCisJCSovCisJCSAgIAorc3RhdGljIGludCBmeF9yYXcgPSAxOyAvKiBpZiB0aGlzIGlzIHplcm8sIHdlJ2xsIGxlYXZlIHRoZSBGWCBwcm9jZXNzb3IgaW4KKwkJICAgICAgICAgIHdoYXRldmVyIHN0YXRlIGl0IGlzIHdoZW4gdGhlIGRyaXZlciBpcyBsb2FkZWQuCisJCSAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byBkb3dubG9hZCB0aGUgbWljcm9wcm9ncmFtIGFuZAorCQkgICAgICAgICAgYXNzb2NpYXRlZCBjb2VmZmljaWVudHMgdG8gc2V0IGl0IHVwIGZvciAiZGVmYXVsdCIKKwkJICAgICAgICAgIG9wZXJhdGlvbiwgd2hhdGV2ZXIgdGhhdCBtZWFucy4KKwkJICAgICAgICovCisKK3N0YXRpYyBpbnQgZGVidWdfZGVmYXVsdDsgIC8qIHlvdSBjYW4gc2V0IHRoaXMgdG8gY29udHJvbCBkZWJ1Z2dpbmcKKwkJCSAgICAgIGR1cmluZyBkcml2ZXIgbG9hZGluZy4gaXQgdGFrZXMgYW55IGNvbWJpbmF0aW9uCisJCQkgICAgICBvZiB0aGUgV0ZfREVCVUdfKiBmbGFncyBkZWZpbmVkIGluCisJCQkgICAgICB3YXZlZnJvbnQuaAorCQkJICAgKi8KKworLyogWFhYIHRoaXMgbmVlZHMgdG8gYmUgbWFkZSBmaXJtd2FyZSBhbmQgaGFyZHdhcmUgdmVyc2lvbiBkZXBlbmRlbnQgKi8KKworc3RhdGljIGNoYXIgKm9zcGF0aCA9ICIvZXRjL3NvdW5kL3dhdmVmcm9udC5vcyI7IC8qIHdoZXJlIHRvIGZpbmQgYSBwcm9jZXNzZWQKKwkJCQkJICAgICAgICAgICAgdmVyc2lvbiBvZiB0aGUgV2F2ZUZyb250IE9TCisJCQkJCSAgICAgICAgICAqLworCitzdGF0aWMgaW50IHdhaXRfcG9sbHMgPSAyMDAwOyAvKiBUaGlzIGlzIGEgbnVtYmVyIG9mIHRyaWVzIHdlIHBvbGwgdGhlCisJCQkJIHN0YXR1cyByZWdpc3RlciBiZWZvcmUgcmVzb3J0aW5nIHRvIHNsZWVwaW5nLgorCQkJCSBXYXZlRnJvbnQgYmVpbmcgYW4gSVNBIGNhcmQgZWFjaCBwb2xsIHRha2VzCisJCQkJIGFib3V0IDEuMnVzLiBTbyBiZWZvcmUgZ29pbmcgdG8KKwkJCSAgICAgICAgIHNsZWVwIHdlIHdhaXQgdXAgdG8gMi40bXMgaW4gYSBsb29wLgorCQkJICAgICAqLworCitzdGF0aWMgaW50IHNsZWVwX2xlbmd0aCA9IEhaLzEwMDsgLyogVGhpcyBzYXlzIGhvdyBsb25nIHdlJ3JlIGdvaW5nIHRvCisJCQkJICAgICBzbGVlcCBiZXR3ZWVuIHBvbGxzLgorCQkJICAgICAgICAgICAgIDEwbXMgc291bmRzIHJlYXNvbmFibGUgZm9yIGZhc3QgcmVzcG9uc2UuCisJCQkgICAgICAgICAgKi8KKworc3RhdGljIGludCBzbGVlcF90cmllcyA9IDUwOyAgICAgICAvKiBXYWl0IGZvciBzdGF0dXMgMC41IHNlY29uZHMgdG90YWwuICovCisKK3N0YXRpYyBpbnQgcmVzZXRfdGltZSA9IDI7IC8qIGh1bmRyZXRocyBvZiBhIHNlY29uZCB3ZSB3YWl0IGFmdGVyIGEgSFcgcmVzZXQgZm9yCisJCQkgICAgICB0aGUgZXhwZWN0ZWQgaW50ZXJydXB0LgorCQkJICAgKi8KKworc3RhdGljIGludCByYW1jaGVja190aW1lID0gMjA7ICAgIC8qIHRpbWUgaW4gc2Vjb25kcyB0byB3YWl0IHdoaWxlIFJPTSBjb2RlCisJCQkgICAgICAgICAgICAgY2hlY2tzIG9uLWJvYXJkIFJBTS4KKwkJCSAgICAgICAgICAqLworCitzdGF0aWMgaW50IG9zcnVuX3RpbWUgPSAxMDsgIC8qIHRpbWUgaW4gc2Vjb25kcyB3ZSB3YWl0IGZvciB0aGUgT1MgdG8KKwkJCSAgICAgICAgc3RhcnQgcnVubmluZy4KKwkJCSAgICAgKi8KKworbW9kdWxlX3BhcmFtKHdmX3JhdywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShmeF9yYXcsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oZGVidWdfZGVmYXVsdCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbSh3YWl0X3BvbGxzLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHNsZWVwX2xlbmd0aCwgaW50LCAwKTsKK21vZHVsZV9wYXJhbShzbGVlcF90cmllcywgaW50LCAwKTsKK21vZHVsZV9wYXJhbShvc3BhdGgsIGNoYXJwLCAwKTsKK21vZHVsZV9wYXJhbShyZXNldF90aW1lLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKHJhbWNoZWNrX3RpbWUsIGludCwgMCk7Cittb2R1bGVfcGFyYW0ob3NydW5fdGltZSwgaW50LCAwKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogTm90ZTogYmVjYXVzZSB0aGlzIG1vZHVsZSBkb2Vzbid0IGV4cG9ydCBhbnkgc3ltYm9scywgdGhpcyByZWFsbHkgaXNuJ3QKKyAgIGEgZ2xvYmFsIHZhcmlhYmxlLCBldmVuIGlmIGl0IGxvb2tzIGxpa2Ugb25lLiBJIHdhcyBxdWl0ZSBjb25mdXNlZCBieQorICAgdGhpcyB3aGVuIEkgc3RhcnRlZCB3cml0aW5nIHRoaXMgYXMgYSAobmV3ZXIpIG1vZHVsZSAtLSBwYmQuCisqLworCitzdHJ1Y3Qgd2ZfY29uZmlnIHsKKwlpbnQgZGV2bm87ICAgICAgICAgICAgLyogZGV2aWNlIG51bWJlciBmcm9tIGtlcm5lbCAqLworCWludCBpcnE7ICAgICAgICAgICAgICAvKiAieW91IHdlcmUgb25lLCBvbmUgb2YgdGhlIGZldyAuLi4iICovCisJaW50IGJhc2U7ICAgICAgICAgICAgIC8qIGxvdyBpL28gcG9ydCBhZGRyZXNzICovCisKKyNkZWZpbmUgbXB1X2RhdGFfcG9ydCAgICBiYXNlIAorI2RlZmluZSBtcHVfY29tbWFuZF9wb3J0IGJhc2UgKyAxIC8qIHdyaXRlIHNlbWFudGljcyAqLworI2RlZmluZSBtcHVfc3RhdHVzX3BvcnQgIGJhc2UgKyAxIC8qIHJlYWQgc2VtYW50aWNzICovCisjZGVmaW5lIGRhdGFfcG9ydCAgICAgICAgYmFzZSArIDIgCisjZGVmaW5lIHN0YXR1c19wb3J0ICAgICAgYmFzZSArIDMgLyogcmVhZCBzZW1hbnRpY3MgKi8KKyNkZWZpbmUgY29udHJvbF9wb3J0ICAgICBiYXNlICsgMyAvKiB3cml0ZSBzZW1hbnRpY3MgICovCisjZGVmaW5lIGJsb2NrX3BvcnQgICAgICAgYmFzZSArIDQgLyogMTYgYml0LCB3cml0ZW9ubHkgKi8KKyNkZWZpbmUgbGFzdF9ibG9ja19wb3J0ICBiYXNlICsgNiAvKiAxNiBiaXQsIHdyaXRlb25seSAqLworCisJLyogRlggcG9ydHMuIFRoZXNlIGFyZSBtYXBwZWQgdGhyb3VnaCB0aGUgSUNTMjExNSB0byB0aGUgWVMyMjUuCisJICAgVGhlIElDUzIxMTUgdGFrZXMgY2FyZSBvZiBmbGlwcGluZyB0aGUgcmVsZXZhbnQgcGlucyBvbiB0aGUKKwkgICBZUzIyNSBzbyB0aGF0IGFjY2VzcyB0byBlYWNoIG9mIHRoZXNlIHBvcnRzIGRvZXMgdGhlIHJpZ2h0CisJICAgdGhpbmcuIE5vdGU6IHRoZXNlIGFyZSBOT1QgZG9jdW1lbnRlZCBieSBUdXJ0bGUgQmVhY2guCisJKi8KKworI2RlZmluZSBmeF9zdGF0dXMgICAgICAgYmFzZSArIDggCisjZGVmaW5lIGZ4X29wICAgICAgICAgICBiYXNlICsgOCAKKyNkZWZpbmUgZnhfbGNyICAgICAgICAgIGJhc2UgKyA5IAorI2RlZmluZSBmeF9kc3BfYWRkciAgICAgYmFzZSArIDB4YQorI2RlZmluZSBmeF9kc3BfcGFnZSAgICAgYmFzZSArIDB4YiAKKyNkZWZpbmUgZnhfZHNwX2xzYiAgICAgIGJhc2UgKyAweGMgCisjZGVmaW5lIGZ4X2RzcF9tc2IgICAgICBiYXNlICsgMHhkIAorI2RlZmluZSBmeF9tb2RfYWRkciAgICAgYmFzZSArIDB4ZQorI2RlZmluZSBmeF9tb2RfZGF0YSAgICAgYmFzZSArIDB4ZiAKKworCXZvbGF0aWxlIGludCBpcnFfb2s7ICAgICAgICAgICAgICAgLyogc2V0IGJ5IGludGVycnVwdCBoYW5kbGVyICovCisgICAgICAgIHZvbGF0aWxlIGludCBpcnFfY250OyAgICAgICAgICAgICAgLyogZGl0dG8gKi8KKwlpbnQgb3BlbmVkOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWcsIGhvbGRzIG9wZW4oMikgbW9kZSAqLworCWNoYXIgZGVidWc7ICAgICAgICAgICAgICAgICAgICAgICAgLyogZGVidWdnaW5nIGZsYWdzICovCisJaW50IGZyZWVtZW07ICAgICAgICAgICAgICAgICAgICAgICAvKiBpbnN0YWxsZWQgUkFNLCBpbiBieXRlcyAqLyAKKworCWludCBzeW50aF9kZXY7ICAgICAgICAgICAgICAgICAgICAgLyogZGV2bm8gZm9yICJyYXciIHN5bnRoICovCisJaW50IG1pZGlkZXY7ICAgICAgICAgICAgICAgICAgICAgICAvKiBkZXZubyBmb3IgaW50ZXJuYWwgTUlESSAqLworCWludCBleHRfbWlkaWRldjsgICAgICAgICAgICAgICAgICAgLyogZGV2bm8gZm9yIGV4dGVybmFsIE1JREkgKi8gCisgICAgICAgIGludCBmeF9taWRpZGV2OyAgICAgICAgICAgICAgICAgICAgLyogZGV2bm8gZm9yIEZYIE1JREkgaW50ZXJmYWNlICovCisjaWYgT1NTX1NVUFBPUlRfTEVWRUwgJiBPU1NfU1VQUE9SVF9TRVEKKwlpbnQgb3NzX2RldjsgICAgICAgICAgICAgICAgICAgICAgLyogZGV2bm8gZm9yIE9TUyBzZXF1ZW5jZXIgc3ludGggKi8KKyNlbmRpZiAvKiBPU1NfU1VQUE9SVF9TRVEgKi8KKworCWNoYXIgZndfdmVyc2lvblsyXTsgICAgICAgICAgICAgICAgLyogbWFqb3IgPSBbMF0sIG1pbm9yID0gWzFdICovCisJY2hhciBod192ZXJzaW9uWzJdOyAgICAgICAgICAgICAgICAvKiBtYWpvciA9IFswXSwgbWlub3IgPSBbMV0gKi8KKwljaGFyIGlzcmF3OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWRzIE1vdG9yb2xhIG1pY3JvY29kZSAqLworCWNoYXIgaGFzX2Z4OyAgICAgICAgICAgICAgICAgICAgICAgLyogaGFzIEZYIHByb2Nlc3NvciAoVHJvcGV6KykgKi8KKwljaGFyIHByb2dfc3RhdHVzW1dGX01BWF9QUk9HUkFNXTsgIC8qIFdGX1NMT1RfKiAqLworCWNoYXIgcGF0Y2hfc3RhdHVzW1dGX01BWF9QQVRDSF07ICAgLyogV0ZfU0xPVF8qICovCisJY2hhciBzYW1wbGVfc3RhdHVzW1dGX01BWF9TQU1QTEVdOyAvKiBXRl9TVF8qIHwgV0ZfU0xPVF8qICovCisJaW50IHNhbXBsZXNfdXNlZDsgICAgICAgICAgICAgICAgICAvKiBob3cgbWFueSAqLworCWNoYXIgaW50ZXJydXB0c19vbjsgICAgICAgICAgICAgICAgLyogaC93IE1QVSBpbnRlcnJ1cHRzIGVuYWJsZWQgPyAqLworCWNoYXIgcm9tX3NhbXBsZXNfcmRvbmx5OyAgICAgICAgICAgLyogY2FuIHdlIHdyaXRlIG9uIFJPTSBzYW1wbGVzICovCisJd2FpdF9xdWV1ZV9oZWFkX3QgaW50ZXJydXB0X3NsZWVwZXI7IAorfSBkZXY7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CitzdGF0aWMgaW50ICBkZXRlY3Rfd2ZmeCh2b2lkKTsKK3N0YXRpYyBpbnQgIHdmZnhfaW9jdGwgKHdhdmVmcm9udF9meF9pbmZvICopOworc3RhdGljIGludCAgd2ZmeF9pbml0ICh2b2lkKTsKKworc3RhdGljIGludCB3YXZlZnJvbnRfZGVsZXRlX3NhbXBsZSAoaW50IHNhbXBudW0pOworc3RhdGljIGludCB3YXZlZnJvbnRfZmluZF9mcmVlX3NhbXBsZSAodm9pZCk7CisKKy8qIEZyb20gd2ZfbWlkaS5jICovCisKK2V4dGVybiBpbnQgIHZpcnR1YWxfbWlkaV9lbmFibGUgICh2b2lkKTsKK2V4dGVybiBpbnQgIHZpcnR1YWxfbWlkaV9kaXNhYmxlICh2b2lkKTsKK2V4dGVybiBpbnQgIGRldGVjdF93Zl9tcHUgKGludCwgaW50KTsKK2V4dGVybiBpbnQgIGluc3RhbGxfd2ZfbXB1ICh2b2lkKTsKK2V4dGVybiBpbnQgIHVuaW5zdGFsbF93Zl9tcHUgKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IGNtZDsKKwljaGFyICphY3Rpb247CisJdW5zaWduZWQgaW50IHJlYWRfY250OworCXVuc2lnbmVkIGludCB3cml0ZV9jbnQ7CisJaW50IG5lZWRfYWNrOworfSB3YXZlZnJvbnRfY29tbWFuZDsKKworc3RhdGljIHN0cnVjdCB7CisJaW50IGVycm5vOworCWNvbnN0IGNoYXIgKmVycnN0cjsKK30gd2F2ZWZyb250X2Vycm9yc1tdID0geworCXsgMHgwMSwgIkJhZCBzYW1wbGUgbnVtYmVyIiB9LAorCXsgMHgwMiwgIk91dCBvZiBzYW1wbGUgbWVtb3J5IiB9LAorCXsgMHgwMywgIkJhZCBwYXRjaCBudW1iZXIiIH0sCisJeyAweDA0LCAiRXJyb3IgaW4gbnVtYmVyIG9mIHZvaWNlcyIgfSwKKwl7IDB4MDYsICJTYW1wbGUgbG9hZCBhbHJlYWR5IGluIHByb2dyZXNzIiB9LAorCXsgMHgwQiwgIk5vIHNhbXBsZSBsb2FkIHJlcXVlc3QgcGVuZGluZyIgfSwKKwl7IDB4MEUsICJCYWQgTUlESSBjaGFubmVsIG51bWJlciIgfSwKKwl7IDB4MTAsICJEb3dubG9hZCBSZWNvcmQgRXJyb3IiIH0sCisJeyAweDgwLCAiU3VjY2VzcyIgfSwKKwl7IDAgfQorfTsKKworI2RlZmluZSBORUVEU19BQ0sgMQorCitzdGF0aWMgd2F2ZWZyb250X2NvbW1hbmQgd2F2ZWZyb250X2NvbW1hbmRzW10gPSB7CisJeyBXRkNfU0VUX1NZTlRIVk9MLCAic2V0IHN5bnRoZXNpemVyIHZvbHVtZSIsIDAsIDEsIE5FRURTX0FDSyB9LAorCXsgV0ZDX0dFVF9TWU5USFZPTCwgImdldCBzeW50aGVzaXplciB2b2x1bWUiLCAxLCAwLCAwfSwKKwl7IFdGQ19TRVRfTlZPSUNFUywgInNldCBudW1iZXIgb2Ygdm9pY2VzIiwgMCwgMSwgTkVFRFNfQUNLIH0sCisJeyBXRkNfR0VUX05WT0lDRVMsICJnZXQgbnVtYmVyIG9mIHZvaWNlcyIsIDEsIDAsIDAgfSwKKwl7IFdGQ19TRVRfVFVOSU5HLCAic2V0IHN5bnRoZXNpemVyIHR1bmluZyIsIDAsIDIsIE5FRURTX0FDSyB9LAorCXsgV0ZDX0dFVF9UVU5JTkcsICJnZXQgc3ludGhlc2l6ZXIgdHVuaW5nIiwgMiwgMCwgMCB9LAorCXsgV0ZDX0RJU0FCTEVfQ0hBTk5FTCwgImRpc2FibGUgc3ludGggY2hhbm5lbCIsIDAsIDEsIE5FRURTX0FDSyB9LAorCXsgV0ZDX0VOQUJMRV9DSEFOTkVMLCAiZW5hYmxlIHN5bnRoIGNoYW5uZWwiLCAwLCAxLCBORUVEU19BQ0sgfSwKKwl7IFdGQ19HRVRfQ0hBTk5FTF9TVEFUVVMsICJnZXQgc3ludGggY2hhbm5lbCBzdGF0dXMiLCAzLCAwLCAwIH0sCisJeyBXRkNfTUlTWU5USF9PRkYsICJkaXNhYmxlIG1pZGktaW4gdG8gc3ludGgiLCAwLCAwLCBORUVEU19BQ0sgfSwKKwl7IFdGQ19NSVNZTlRIX09OLCAiZW5hYmxlIG1pZGktaW4gdG8gc3ludGgiLCAwLCAwLCBORUVEU19BQ0sgfSwKKwl7IFdGQ19WTUlESV9PTiwgImVuYWJsZSB2aXJ0dWFsIG1pZGkgbW9kZSIsIDAsIDAsIE5FRURTX0FDSyB9LAorCXsgV0ZDX1ZNSURJX09GRiwgImRpc2FibGUgdmlydHVhbCBtaWRpIG1vZGUiLCAwLCAwLCBORUVEU19BQ0sgfSwKKwl7IFdGQ19NSURJX1NUQVRVUywgInJlcG9ydCBtaWRpIHN0YXR1cyIsIDEsIDAsIDAgfSwKKwl7IFdGQ19GSVJNV0FSRV9WRVJTSU9OLCAicmVwb3J0IGZpcm13YXJlIHZlcnNpb24iLCAyLCAwLCAwIH0sCisJeyBXRkNfSEFSRFdBUkVfVkVSU0lPTiwgInJlcG9ydCBoYXJkd2FyZSB2ZXJzaW9uIiwgMiwgMCwgMCB9LAorCXsgV0ZDX0dFVF9OU0FNUExFUywgInJlcG9ydCBudW1iZXIgb2Ygc2FtcGxlcyIsIDIsIDAsIDAgfSwKKwl7IFdGQ19JTlNUT1VUX0xFVkVMUywgInJlcG9ydCBpbnN0YW50YW5lb3VzIG91dHB1dCBsZXZlbHMiLCA3LCAwLCAwIH0sCisJeyBXRkNfUEVBS09VVF9MRVZFTFMsICJyZXBvcnQgcGVhayBvdXRwdXQgbGV2ZWxzIiwgNywgMCwgMCB9LAorCXsgV0ZDX0RPV05MT0FEX1NBTVBMRSwgImRvd25sb2FkIHNhbXBsZSIsCisJICAwLCBXRl9TQU1QTEVfQllURVMsIE5FRURTX0FDSyB9LAorCXsgV0ZDX0RPV05MT0FEX0JMT0NLLCAiZG93bmxvYWQgYmxvY2siLCAwLCAwLCBORUVEU19BQ0t9LAorCXsgV0ZDX0RPV05MT0FEX1NBTVBMRV9IRUFERVIsICJkb3dubG9hZCBzYW1wbGUgaGVhZGVyIiwKKwkgIDAsIFdGX1NBTVBMRV9IRFJfQllURVMsIE5FRURTX0FDSyB9LAorCXsgV0ZDX1VQTE9BRF9TQU1QTEVfSEVBREVSLCAidXBsb2FkIHNhbXBsZSBoZWFkZXIiLCAxMywgMiwgMCB9LAorCisJLyogVGhpcyBjb21tYW5kIHJlcXVpcmVzIGEgdmFyaWFibGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCisJICAgVGhlcmUgaXMgYSBoYWNrIGluIHdhdmVmcm9udF9jbWQoKSB0byBzdXBwb3J0IHRoaXMuIFRoZSBhY3R1YWwKKwkgICBjb3VudCBpcyBwYXNzZWQgaW4gYXMgdGhlIHJlYWQgYnVmZmVyIHB0ciwgY2FzdCBhcHByb3ByaWF0ZWx5LgorCSAgIFVnaC4KKwkqLworCisJeyBXRkNfRE9XTkxPQURfTVVMVElTQU1QTEUsICJkb3dubG9hZCBtdWx0aXNhbXBsZSIsIDAsIDAsIE5FRURTX0FDSyB9LAorCisJLyogVGhpcyBvbmUgaXMgYSBoYWNrIGFzIHdlbGwuIFdlIGp1c3QgcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUKKwkgICByZXNwb25zZSwgZG9uJ3QgZmV0Y2ggYW4gQUNLLCBhbmQgbGVhdmUgdGhlIHJlc3QgdG8gdGhlIAorCSAgIGNhbGxpbmcgZnVuY3Rpb24uIFVnbHksIHVnbHksIHVnbHkuCisJKi8KKworCXsgV0ZDX1VQTE9BRF9NVUxUSVNBTVBMRSwgInVwbG9hZCBtdWx0aXNhbXBsZSIsIDIsIDEsIDAgfSwKKwl7IFdGQ19ET1dOTE9BRF9TQU1QTEVfQUxJQVMsICJkb3dubG9hZCBzYW1wbGUgYWxpYXMiLAorCSAgMCwgV0ZfQUxJQVNfQllURVMsIE5FRURTX0FDSyB9LAorCXsgV0ZDX1VQTE9BRF9TQU1QTEVfQUxJQVMsICJ1cGxvYWQgc2FtcGxlIGFsaWFzIiwgV0ZfQUxJQVNfQllURVMsIDIsIDB9LAorCXsgV0ZDX0RFTEVURV9TQU1QTEUsICJkZWxldGUgc2FtcGxlIiwgMCwgMiwgTkVFRFNfQUNLIH0sCisJeyBXRkNfSURFTlRJRllfU0FNUExFX1RZUEUsICJpZGVudGlmeSBzYW1wbGUgdHlwZSIsIDUsIDIsIDAgfSwKKwl7IFdGQ19VUExPQURfU0FNUExFX1BBUkFNUywgInVwbG9hZCBzYW1wbGUgcGFyYW1ldGVycyIgfSwKKwl7IFdGQ19SRVBPUlRfRlJFRV9NRU1PUlksICJyZXBvcnQgZnJlZSBtZW1vcnkiLCA0LCAwLCAwIH0sCisJeyBXRkNfRE9XTkxPQURfUEFUQ0gsICJkb3dubG9hZCBwYXRjaCIsIDAsIDEzNCwgTkVFRFNfQUNLIH0sCisJeyBXRkNfVVBMT0FEX1BBVENILCAidXBsb2FkIHBhdGNoIiwgMTMyLCAyLCAwIH0sCisJeyBXRkNfRE9XTkxPQURfUFJPR1JBTSwgImRvd25sb2FkIHByb2dyYW0iLCAwLCAzMywgTkVFRFNfQUNLIH0sCisJeyBXRkNfVVBMT0FEX1BST0dSQU0sICJ1cGxvYWQgcHJvZ3JhbSIsIDMyLCAxLCAwIH0sCisJeyBXRkNfRE9XTkxPQURfRURSVU1fUFJPR1JBTSwgImRvd25sb2FkIGVuaGFuY2VkIGRydW0gcHJvZ3JhbSIsIDAsIDksCisJICBORUVEU19BQ0t9LAorCXsgV0ZDX1VQTE9BRF9FRFJVTV9QUk9HUkFNLCAidXBsb2FkIGVuaGFuY2VkIGRydW0gcHJvZ3JhbSIsIDgsIDEsIDB9LAorCXsgV0ZDX1NFVF9FRFJVTV9DSEFOTkVMLCAic2V0IGVuaGFuY2VkIGRydW0gcHJvZ3JhbSBjaGFubmVsIiwKKwkgIDAsIDEsIE5FRURTX0FDSyB9LAorCXsgV0ZDX0RJU0FCTEVfRFJVTV9QUk9HUkFNLCAiZGlzYWJsZSBkcnVtIHByb2dyYW0iLCAwLCAxLCBORUVEU19BQ0sgfSwKKwl7IFdGQ19SRVBPUlRfQ0hBTk5FTF9QUk9HUkFNUywgInJlcG9ydCBjaGFubmVsIHByb2dyYW0gbnVtYmVycyIsCisJICAzMiwgMCwgMCB9LAorCXsgV0ZDX05PT1AsICJ0aGUgbm8tb3AgY29tbWFuZCIsIDAsIDAsIE5FRURTX0FDSyB9LAorCXsgMHgwMCB9Cit9OworCitzdGF0aWMgY29uc3QgY2hhciAqCit3YXZlZnJvbnRfZXJyb3JzdHIgKGludCBlcnJudW0pCisKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHdhdmVmcm9udF9lcnJvcnNbaV0uZXJyc3RyOyBpKyspIHsKKwkJaWYgKHdhdmVmcm9udF9lcnJvcnNbaV0uZXJybm8gPT0gZXJybnVtKSB7CisJCQlyZXR1cm4gd2F2ZWZyb250X2Vycm9yc1tpXS5lcnJzdHI7CisJCX0KKwl9CisKKwlyZXR1cm4gIlVua25vd24gV2F2ZUZyb250IGVycm9yIjsKK30KKworc3RhdGljIHdhdmVmcm9udF9jb21tYW5kICoKK3dhdmVmcm9udF9nZXRfY29tbWFuZCAoaW50IGNtZCkgCisKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHdhdmVmcm9udF9jb21tYW5kc1tpXS5jbWQgIT0gMDsgaSsrKSB7CisJCWlmIChjbWQgPT0gd2F2ZWZyb250X2NvbW1hbmRzW2ldLmNtZCkgeworCQkJcmV0dXJuICZ3YXZlZnJvbnRfY29tbWFuZHNbaV07CisJCX0KKwl9CisKKwlyZXR1cm4gKHdhdmVmcm9udF9jb21tYW5kICopIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50Cit3YXZlZnJvbnRfc3RhdHVzICh2b2lkKSAKKworeworCXJldHVybiBpbmIgKGRldi5zdGF0dXNfcG9ydCk7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF93YWl0IChpbnQgbWFzaykKKworeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IHdhaXRfcG9sbHM7IGkrKykKKwkJaWYgKHdhdmVmcm9udF9zdGF0dXMoKSAmIG1hc2spCisJCQlyZXR1cm4gMTsKKworCWZvciAoaSA9IDA7IGkgPCBzbGVlcF90cmllczsgaSsrKSB7CisKKwkJaWYgKHdhdmVmcm9udF9zdGF0dXMoKSAmIG1hc2spIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCQlyZXR1cm4gMTsKKwkJfQorCisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCXNjaGVkdWxlX3RpbWVvdXQoc2xlZXBfbGVuZ3RoKTsKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQorCQkJYnJlYWs7CisJfQorCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X3JlYWQgKHZvaWQpCisKK3sKKwlpZiAod2F2ZWZyb250X3dhaXQgKFNUQVRfQ0FOX1JFQUQpKQorCQlyZXR1cm4gaW5iIChkZXYuZGF0YV9wb3J0KTsKKworCURQUklOVCAoV0ZfREVCVUdfREFUQSwgInJlYWQgdGltZW91dC5cbiIpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfd3JpdGUgKHVuc2lnbmVkIGNoYXIgZGF0YSkKKworeworCWlmICh3YXZlZnJvbnRfd2FpdCAoU1RBVF9DQU5fV1JJVEUpKSB7CisJCW91dGIgKGRhdGEsIGRldi5kYXRhX3BvcnQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlEUFJJTlQgKFdGX0RFQlVHX0RBVEEsICJ3cml0ZSB0aW1lb3V0LlxuIik7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9jbWQgKGludCBjbWQsIHVuc2lnbmVkIGNoYXIgKnJidWYsIHVuc2lnbmVkIGNoYXIgKndidWYpCisKK3sKKwlpbnQgYWNrOworCWludCBpOworCWludCBjOworCXdhdmVmcm9udF9jb21tYW5kICp3ZmNtZDsKKworCWlmICgod2ZjbWQgPSB3YXZlZnJvbnRfZ2V0X2NvbW1hbmQgKGNtZCkpID09ICh3YXZlZnJvbnRfY29tbWFuZCAqKSAwKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImNvbW1hbmQgMHgleCBub3Qgc3VwcG9ydGVkLlxuIiwKKwkJCWNtZCk7CisJCXJldHVybiAxOworCX0KKworCS8qIEhhY2sgdG8gaGFuZGxlIHRoZSBvbmUgdmFyaWFibGUtc2l6ZSB3cml0ZSBjb21tYW5kLiBTZWUKKwkgICB3YXZlZnJvbnRfc2VuZF9tdWx0aXNhbXBsZSgpIGZvciB0aGUgb3RoZXIgaGFsZiBvZiB0aGlzCisJICAgZ3Jvc3MgYW5kIHVnbHkgc3RyYXRlZ3kuCisJKi8KKworCWlmIChjbWQgPT0gV0ZDX0RPV05MT0FEX01VTFRJU0FNUExFKSB7CisJCXdmY21kLT53cml0ZV9jbnQgPSAodW5zaWduZWQgaW50KSByYnVmOworCQlyYnVmID0gTlVMTDsKKwl9CisKKwlEUFJJTlQgKFdGX0RFQlVHX0NNRCwgIjB4JXggWyVzXSAoJWQsJWQsJWQpXG4iLAorCQkJICAgICAgIGNtZCwgd2ZjbWQtPmFjdGlvbiwgd2ZjbWQtPnJlYWRfY250LAorCQkJICAgICAgIHdmY21kLT53cml0ZV9jbnQsIHdmY21kLT5uZWVkX2Fjayk7CisgICAgCisJaWYgKHdhdmVmcm9udF93cml0ZSAoY21kKSkgeyAKKwkJRFBSSU5UICgoV0ZfREVCVUdfSU98V0ZfREVCVUdfQ01EKSwgImNhbm5vdCByZXF1ZXN0ICIKKwkJCQkJCSAgICAgIjB4JXggWyVzXS5cbiIsCisJCQkJCQkgICAgIGNtZCwgd2ZjbWQtPmFjdGlvbik7CisJCXJldHVybiAxOworCX0gCisKKwlpZiAod2ZjbWQtPndyaXRlX2NudCA+IDApIHsKKwkJRFBSSU5UIChXRl9ERUJVR19EQVRBLCAid3JpdGluZyAlZCBieXRlcyAiCisJCQkJCSJmb3IgMHgleFxuIiwKKwkJCQkJd2ZjbWQtPndyaXRlX2NudCwgY21kKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgd2ZjbWQtPndyaXRlX2NudDsgaSsrKSB7CisJCQlpZiAod2F2ZWZyb250X3dyaXRlICh3YnVmW2ldKSkgeworCQkJCURQUklOVCAoV0ZfREVCVUdfSU8sICJiYWQgd3JpdGUgZm9yIGJ5dGUgIgorCQkJCQkJICAgICAgIiVkIG9mIDB4JXggWyVzXS5cbiIsCisJCQkJCQkgICAgICBpLCBjbWQsIHdmY21kLT5hY3Rpb24pOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQlEUFJJTlQgKFdGX0RFQlVHX0RBVEEsICJ3cml0ZVslZF0gPSAweCV4XG4iLAorCQkJCQkJaSwgd2J1ZltpXSk7CisJCX0KKwl9CisKKwlpZiAod2ZjbWQtPnJlYWRfY250ID4gMCkgeworCQlEUFJJTlQgKFdGX0RFQlVHX0RBVEEsICJyZWFkaW5nICVkIGludHMgIgorCQkJCQkiZm9yIDB4JXhcbiIsCisJCQkJCXdmY21kLT5yZWFkX2NudCwgY21kKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgd2ZjbWQtPnJlYWRfY250OyBpKyspIHsKKworCQkJaWYgKChjID0gd2F2ZWZyb250X3JlYWQoKSkgPT0gLTEpIHsKKwkJCQlEUFJJTlQgKFdGX0RFQlVHX0lPLCAiYmFkIHJlYWQgZm9yIGJ5dGUgIgorCQkJCQkJICAgICAgIiVkIG9mIDB4JXggWyVzXS5cbiIsCisJCQkJCQkgICAgICBpLCBjbWQsIHdmY21kLT5hY3Rpb24pOworCQkJCXJldHVybiAxOworCQkJfQorCisJCQkvKiBOb3cgaGFuZGxlIGVycm9ycy4gTG90cyBvZiBzcGVjaWFsIGNhc2VzIGhlcmUgKi8KKwkgICAgCisJCQlpZiAoYyA9PSAweGZmKSB7IAorCQkJCWlmICgoYyA9IHdhdmVmcm9udF9yZWFkICgpKSA9PSAtMSkgeworCQkJCQlEUFJJTlQgKFdGX0RFQlVHX0lPLCAiYmFkIHJlYWQgZm9yICIKKwkJCQkJCQkgICAgICAiZXJyb3IgYnl0ZSBhdCAiCisJCQkJCQkJICAgICAgInJlYWQgYnl0ZSAlZCAiCisJCQkJCQkJICAgICAgIm9mIDB4JXggWyVzXS5cbiIsCisJCQkJCQkJICAgICAgaSwgY21kLAorCQkJCQkJCSAgICAgIHdmY21kLT5hY3Rpb24pOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisKKwkJCQkvKiBDYW4geW91IGJlbGlldmUgdGhpcyBtYWRuZXNzID8gKi8KKworCQkJCWlmIChjID09IDEgJiYKKwkJCQkgICAgd2ZjbWQtPmNtZCA9PSBXRkNfSURFTlRJRllfU0FNUExFX1RZUEUpIHsKKwkJCQkJcmJ1ZlswXSA9IFdGX1NUX0VNUFRZOworCQkJCQlyZXR1cm4gKDApOworCisJCQkJfSBlbHNlIGlmIChjID09IDMgJiYKKwkJCQkJICAgd2ZjbWQtPmNtZCA9PSBXRkNfVVBMT0FEX1BBVENIKSB7CisKKwkJCQkJcmV0dXJuIDM7CisKKwkJCQl9IGVsc2UgaWYgKGMgPT0gMSAmJgorCQkJCQkgICB3ZmNtZC0+Y21kID09IFdGQ19VUExPQURfUFJPR1JBTSkgeworCisJCQkJCXJldHVybiAxOworCisJCQkJfSBlbHNlIHsKKworCQkJCQlEUFJJTlQgKFdGX0RFQlVHX0lPLCAiZXJyb3IgJWQgKCVzKSAiCisJCQkJCQkJICAgICAgImR1cmluZyAiCisJCQkJCQkJICAgICAgInJlYWQgZm9yIGJ5dGUgIgorCQkJCQkJCSAgICAgICIlZCBvZiAweCV4ICIKKwkJCQkJCQkgICAgICAiWyVzXS5cbiIsCisJCQkJCQkJICAgICAgYywKKwkJCQkJCQkgICAgICB3YXZlZnJvbnRfZXJyb3JzdHIgKGMpLAorCQkJCQkJCSAgICAgIGksIGNtZCwKKwkJCQkJCQkgICAgICB3ZmNtZC0+YWN0aW9uKTsKKwkJCQkJcmV0dXJuIDE7CisKKwkJCQl9CisJCQorCQl9IGVsc2UgeworCQkJCXJidWZbaV0gPSBjOworCQkJfQorCQkJCisJCQlEUFJJTlQgKFdGX0RFQlVHX0RBVEEsICJyZWFkWyVkXSA9IDB4JXhcbiIsaSwgcmJ1ZltpXSk7CisJCX0KKwl9CisJCisJaWYgKCh3ZmNtZC0+cmVhZF9jbnQgPT0gMCAmJiB3ZmNtZC0+d3JpdGVfY250ID09IDApIHx8IHdmY21kLT5uZWVkX2FjaykgeworCisJCURQUklOVCAoV0ZfREVCVUdfQ01ELCAicmVhZGluZyBBQ0sgZm9yIDB4JXhcbiIsIGNtZCk7CisKKwkJLyogU29tZSBjb21tYW5kcyBuZWVkIGFuIEFDSywgYnV0IHJldHVybiB6ZXJvIGluc3RlYWQKKwkJICAgb2YgdGhlIHN0YW5kYXJkIHZhbHVlLgorCQkqLworCSAgICAKKwkJaWYgKChhY2sgPSB3YXZlZnJvbnRfcmVhZCgpKSA9PSAwKSB7CisJCQlhY2sgPSBXRl9BQ0s7CisJCX0KKwkKKwkJaWYgKGFjayAhPSBXRl9BQ0spIHsKKwkJCWlmIChhY2sgPT0gLTEpIHsKKwkJCQlEUFJJTlQgKFdGX0RFQlVHX0lPLCAiY2Fubm90IHJlYWQgYWNrIGZvciAiCisJCQkJCQkgICAgICAiMHgleCBbJXNdLlxuIiwKKwkJCQkJCSAgICAgIGNtZCwgd2ZjbWQtPmFjdGlvbik7CisJCQkJcmV0dXJuIDE7CisJCQorCQkJfSBlbHNlIHsKKwkJCQlpbnQgZXJyID0gLTE7IC8qIHNvbWV0aGluZyB1bmtub3duICovCisKKwkJCQlpZiAoYWNrID09IDB4ZmYpIHsgLyogZXhwbGljaXQgZXJyb3IgKi8KKwkJICAgIAorCQkJCQlpZiAoKGVyciA9IHdhdmVmcm9udF9yZWFkICgpKSA9PSAtMSkgeworCQkJCQkJRFBSSU5UIChXRl9ERUJVR19EQVRBLAorCQkJCQkJCSJjYW5ub3QgcmVhZCBlcnIgIgorCQkJCQkJCSJmb3IgMHgleCBbJXNdLlxuIiwKKwkJCQkJCQljbWQsIHdmY21kLT5hY3Rpb24pOworCQkJCQl9CisJCQkJfQorCQkJCQorCQkJCURQUklOVCAoV0ZfREVCVUdfSU8sICIweCV4IFslc10gIgorCQkJCQkiZmFpbGVkICgweCV4LCAweCV4LCAlcylcbiIsCisJCQkJCWNtZCwgd2ZjbWQtPmFjdGlvbiwgYWNrLCBlcnIsCisJCQkJCXdhdmVmcm9udF9lcnJvcnN0ciAoZXJyKSk7CisJCQkJCisJCQkJcmV0dXJuIC1lcnI7CisJCQl9CisJCX0KKwkJCisJCURQUklOVCAoV0ZfREVCVUdfREFUQSwgImFjayByZWNlaXZlZCAiCisJCQkJCSJmb3IgMHgleCBbJXNdXG4iLAorCQkJCQljbWQsIHdmY21kLT5hY3Rpb24pOworCX0gZWxzZSB7CisKKwkJRFBSSU5UIChXRl9ERUJVR19DTUQsICIweCV4IFslc10gZG9lcyBub3QgbmVlZCAiCisJCQkJICAgICAgICJBQ0sgKCVkLCVkLCVkKVxuIiwKKwkJCQkgICAgICAgY21kLCB3ZmNtZC0+YWN0aW9uLCB3ZmNtZC0+cmVhZF9jbnQsCisJCQkJICAgICAgIHdmY21kLT53cml0ZV9jbnQsIHdmY21kLT5uZWVkX2Fjayk7CisJfQorCisJcmV0dXJuIDA7CisJCit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1dhdmVGcm9udDogZGF0YSBtdW5naW5nICAgCisKK1RoaW5ncyBoZXJlIGFyZSB3ZWlyZC4gQWxsIGRhdGEgd3JpdHRlbiB0byB0aGUgYm9hcmQgY2Fubm90IAoraGF2ZSBpdHMgbW9zdCBzaWduaWZpY2FudCBiaXQgc2V0LiBBbnkgZGF0YSBpdGVtIHdpdGggdmFsdWVzIAorcG90ZW50aWFsbHkgPiAweDdGICgxMjcpIG11c3QgYmUgc3BsaXQgYWNyb3NzIG11bHRpcGxlIGJ5dGVzLgorCitTb21ldGltZXMsIHdlIG5lZWQgdG8gbXVuZ2UgbnVtZXJpYyB2YWx1ZXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgb24KK3RoZSB4ODYgc2lkZSBhcyA4LTMyIGJpdCB2YWx1ZXMuIFNvbWV0aW1lcywgd2UgbmVlZCB0byBtdW5nZSBkYXRhCit0aGF0IGlzIHJlcHJlc2VudGVkIG9uIHRoZSB4ODYgc2lkZSBhcyBhbiBhcnJheSBvZiBieXRlcy4gVGhlIG1vc3QKK2VmZmljaWVudCBhcHByb2FjaCB0byBoYW5kbGluZyBib3RoIGNhc2VzIHNlZW1zIHRvIGJlIHRvIHVzZSAyCitkaWZmZXJlbnQgZnVuY3Rpb25zIGZvciBtdW5naW5nIGFuZCAyIGZvciBkZS1tdW5naW5nLiBUaGlzIGF2b2lkcword2VpcmQgY2FzdGluZyBhbmQgd29ycnlpbmcgYWJvdXQgYml0LWxldmVsIG9mZnNldHMuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyAKK3Vuc2lnbmVkIGNoYXIgKgorbXVuZ2VfaW50MzIgKHVuc2lnbmVkIGludCBzcmMsCisJICAgICB1bnNpZ25lZCBjaGFyICpkc3QsCisJICAgICB1bnNpZ25lZCBpbnQgZHN0X3NpemUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwO2kgPCBkc3Rfc2l6ZTsgaSsrKSB7CisJCSpkc3QgPSBzcmMgJiAweDdGOyAgLyogTWFzayBoaWdoIGJpdCBvZiBMU0IgKi8KKwkJc3JjID0gc3JjID4+IDc7ICAgICAvKiBSb3RhdGUgUmlnaHQgNyBiaXRzICAqLworCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOb3RlOiB3ZSBsZWF2ZSB0aGUgdXBwZXIgYml0cyBpbiBwbGFjZSAqLyAKKworCQlkc3QrKzsKKyAJfTsKKwlyZXR1cm4gZHN0OworfTsKKworc3RhdGljIGludCAKK2RlbXVuZ2VfaW50MzIgKHVuc2lnbmVkIGNoYXIqIHNyYywgaW50IHNyY19zaXplKQorCit7CisJaW50IGk7CisgCWludCBvdXR2YWwgPSAwOworCQorIAlmb3IgKGkgPSBzcmNfc2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCW91dHZhbD0ob3V0dmFsPDw3KStzcmNbaV07CisJfQorCisJcmV0dXJuIG91dHZhbDsKK307CisKK3N0YXRpYyAKK3Vuc2lnbmVkIGNoYXIgKgorbXVuZ2VfYnVmICh1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IGRzdF9zaXplKQorCit7CisJaW50IGk7CisJdW5zaWduZWQgaW50IGxhc3QgPSBkc3Rfc2l6ZSAvIDI7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGFzdDsgaSsrKSB7CisJCSpkc3QrKyA9IHNyY1tpXSAmIDB4N2Y7CisJCSpkc3QrKyA9IHNyY1tpXSA+PiA3OworCX0KKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgCit1bnNpZ25lZCBjaGFyICoKK2RlbXVuZ2VfYnVmICh1bnNpZ25lZCBjaGFyICpzcmMsIHVuc2lnbmVkIGNoYXIgKmRzdCwgdW5zaWduZWQgaW50IHNyY19ieXRlcykKKworeworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKmVuZCA9IHNyYyArIHNyY19ieXRlczsKKyAgICAKKwllbmQgPSBzcmMgKyBzcmNfYnl0ZXM7CisKKwkvKiBOT1RFOiBzcmMgYW5kIGRzdCAqQ0FOKiBwb2ludCB0byB0aGUgc2FtZSBhZGRyZXNzICovCisKKwlmb3IgKGkgPSAwOyBzcmMgIT0gZW5kOyBpKyspIHsKKwkJZHN0W2ldID0gKnNyYysrOworCQlkc3RbaV0gfD0gKCpzcmMrKyk8PDc7CisJfQorCisJcmV0dXJuIGRzdDsKK30KKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorV2F2ZUZyb250OiBzYW1wbGUsIHBhdGNoIGFuZCBwcm9ncmFtIG1hbmFnZW1lbnQuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworc3RhdGljIGludAord2F2ZWZyb250X2RlbGV0ZV9zYW1wbGUgKGludCBzYW1wbGVfbnVtKQorCit7CisJdW5zaWduZWQgY2hhciB3YnVmWzJdOworCWludCB4OworCisJd2J1ZlswXSA9IHNhbXBsZV9udW0gJiAweDdmOworCXdidWZbMV0gPSBzYW1wbGVfbnVtID4+IDc7CisKKwlpZiAoKHggPSB3YXZlZnJvbnRfY21kIChXRkNfREVMRVRFX1NBTVBMRSwgTlVMTCwgd2J1ZikpID09IDApIHsKKwkJZGV2LnNhbXBsZV9zdGF0dXNbc2FtcGxlX251bV0gPSBXRl9TVF9FTVBUWTsKKwl9CisKKwlyZXR1cm4geDsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X2dldF9zYW1wbGVfc3RhdHVzIChpbnQgYXNzdW1lX3JvbSkKKworeworCWludCBpOworCXVuc2lnbmVkIGNoYXIgcmJ1ZlszMl0sIHdidWZbMzJdOworCXVuc2lnbmVkIGludCAgICBzY19yZWFsLCBzY19hbGlhcywgc2NfbXVsdGk7CisKKwkvKiBjaGVjayBzYW1wbGUgc3RhdHVzICovCisgICAgCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19HRVRfTlNBTVBMRVMsIHJidWYsIHdidWYpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImNhbm5vdCByZXF1ZXN0IHNhbXBsZSBjb3VudC5cbiIpOworCQlyZXR1cm4gLTE7CisJfSAKKyAgICAKKwlzY19yZWFsID0gc2NfYWxpYXMgPSBzY19tdWx0aSA9IGRldi5zYW1wbGVzX3VzZWQgPSAwOworICAgIAorCWZvciAoaSA9IDA7IGkgPCBXRl9NQVhfU0FNUExFOyBpKyspIHsKKwkKKwkJd2J1ZlswXSA9IGkgJiAweDdmOworCQl3YnVmWzFdID0gaSA+PiA3OworCisJCWlmICh3YXZlZnJvbnRfY21kIChXRkNfSURFTlRJRllfU0FNUExFX1RZUEUsIHJidWYsIHdidWYpKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FCisJCQkJImNhbm5vdCBpZGVudGlmeSBzYW1wbGUgIgorCQkJCSJ0eXBlIG9mIHNsb3QgJWRcbiIsIGkpOworCQkJZGV2LnNhbXBsZV9zdGF0dXNbaV0gPSBXRl9TVF9FTVBUWTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZGV2LnNhbXBsZV9zdGF0dXNbaV0gPSAoV0ZfU0xPVF9GSUxMRUR8cmJ1ZlswXSk7CisKKwkJaWYgKGFzc3VtZV9yb20pIHsKKwkJCWRldi5zYW1wbGVfc3RhdHVzW2ldIHw9IFdGX1NMT1RfUk9NOworCQl9CisKKwkJc3dpdGNoIChyYnVmWzBdICYgV0ZfU1RfTUFTSykgeworCQljYXNlIFdGX1NUX1NBTVBMRToKKwkJCXNjX3JlYWwrKzsKKwkJCWJyZWFrOworCQljYXNlIFdGX1NUX01VTFRJU0FNUExFOgorCQkJc2NfbXVsdGkrKzsKKwkJCWJyZWFrOworCQljYXNlIFdGX1NUX0FMSUFTOgorCQkJc2NfYWxpYXMrKzsKKwkJCWJyZWFrOworCQljYXNlIFdGX1NUX0VNUFRZOgorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgInVua25vd24gc2FtcGxlIHR5cGUgZm9yICIKKwkJCQkic2xvdCAlZCAoMHgleClcbiIsIAorCQkJCWksIHJidWZbMF0pOworCQl9CisKKwkJaWYgKHJidWZbMF0gIT0gV0ZfU1RfRU1QVFkpIHsKKwkJCWRldi5zYW1wbGVzX3VzZWQrKzsKKwkJfSAKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FCisJCSIlZCBzYW1wbGVzIHVzZWQgKCVkIHJlYWwsICVkIGFsaWFzZXMsICVkIG11bHRpKSwgIgorCQkiJWQgZW1wdHlcbiIsIGRldi5zYW1wbGVzX3VzZWQsIHNjX3JlYWwsIHNjX2FsaWFzLCBzY19tdWx0aSwKKwkJV0ZfTUFYX1NBTVBMRSAtIGRldi5zYW1wbGVzX3VzZWQpOworCisKKwlyZXR1cm4gKDApOworCit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9nZXRfcGF0Y2hfc3RhdHVzICh2b2lkKQorCit7CisJdW5zaWduZWQgY2hhciBwYXRjaGJ1ZltXRl9QQVRDSF9CWVRFU107CisJdW5zaWduZWQgY2hhciBwYXRjaG51bVsyXTsKKwl3YXZlZnJvbnRfcGF0Y2ggKnA7CisJaW50IGksIHgsIGNudCwgY250MjsKKworCWZvciAoaSA9IDA7IGkgPCBXRl9NQVhfUEFUQ0g7IGkrKykgeworCQlwYXRjaG51bVswXSA9IGkgJiAweDdmOworCQlwYXRjaG51bVsxXSA9IGkgPj4gNzsKKworCQlpZiAoKHggPSB3YXZlZnJvbnRfY21kIChXRkNfVVBMT0FEX1BBVENILCBwYXRjaGJ1ZiwKKwkJCQkJcGF0Y2hudW0pKSA9PSAwKSB7CisKKwkJCWRldi5wYXRjaF9zdGF0dXNbaV0gfD0gV0ZfU0xPVF9GSUxMRUQ7CisJCQlwID0gKHdhdmVmcm9udF9wYXRjaCAqKSBwYXRjaGJ1ZjsKKwkJCWRldi5zYW1wbGVfc3RhdHVzCisJCQkJW3AtPnNhbXBsZV9udW1iZXJ8KHAtPnNhbXBsZV9tc2I8PDcpXSB8PQorCQkJCVdGX1NMT1RfVVNFRDsKKwkgICAgCisJCX0gZWxzZSBpZiAoeCA9PSAzKSB7IC8qIEJhZCBwYXRjaCBudW1iZXIgKi8KKwkJCWRldi5wYXRjaF9zdGF0dXNbaV0gPSAwOworCQl9IGVsc2UgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ1cGxvYWQgcGF0Y2ggIgorCQkJCSJlcnJvciAweCV4XG4iLCB4KTsKKwkJCWRldi5wYXRjaF9zdGF0dXNbaV0gPSAwOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvKiBwcm9ncmFtIHN0YXR1cyBoYXMgYWxyZWFkeSBmaWxsZWQgaW4gc2xvdF91c2VkIGJpdHMgKi8KKworCWZvciAoaSA9IDAsIGNudCA9IDAsIGNudDIgPSAwOyBpIDwgV0ZfTUFYX1BBVENIOyBpKyspIHsKKwkJaWYgKGRldi5wYXRjaF9zdGF0dXNbaV0gJiBXRl9TTE9UX0ZJTExFRCkgeworCQkJY250Kys7CisJCX0KKwkJaWYgKGRldi5wYXRjaF9zdGF0dXNbaV0gJiBXRl9TTE9UX1VTRUQpIHsKKwkJCWNudDIrKzsKKwkJfQorCQorCX0KKwlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FCisJCSIlZCBwYXRjaCBzbG90cyBmaWxsZWQsICVkIGluIHVzZVxuIiwgY250LCBjbnQyKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9nZXRfcHJvZ3JhbV9zdGF0dXMgKHZvaWQpCisKK3sKKwl1bnNpZ25lZCBjaGFyIHByb2didWZbV0ZfUFJPR1JBTV9CWVRFU107CisJd2F2ZWZyb250X3Byb2dyYW0gcHJvZzsKKwl1bnNpZ25lZCBjaGFyIHByb2dudW07CisJaW50IGksIHgsIGwsIGNudDsKKworCWZvciAoaSA9IDA7IGkgPCBXRl9NQVhfUFJPR1JBTTsgaSsrKSB7CisJCXByb2dudW0gPSBpOworCisJCWlmICgoeCA9IHdhdmVmcm9udF9jbWQgKFdGQ19VUExPQURfUFJPR1JBTSwgcHJvZ2J1ZiwKKwkJCQkJJnByb2dudW0pKSA9PSAwKSB7CisKKwkJCWRldi5wcm9nX3N0YXR1c1tpXSB8PSBXRl9TTE9UX1VTRUQ7CisKKwkJCWRlbXVuZ2VfYnVmIChwcm9nYnVmLCAodW5zaWduZWQgY2hhciAqKSAmcHJvZywKKwkJCQkgICAgIFdGX1BST0dSQU1fQllURVMpOworCisJCQlmb3IgKGwgPSAwOyBsIDwgV0ZfTlVNX0xBWUVSUzsgbCsrKSB7CisJCQkJaWYgKHByb2cubGF5ZXJbbF0ubXV0ZSkgeworCQkJCQlkZXYucGF0Y2hfc3RhdHVzCisJCQkJCQlbcHJvZy5sYXllcltsXS5wYXRjaF9udW1iZXJdIHw9CisJCQkJCQlXRl9TTE9UX1VTRUQ7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKHggPT0gMSkgeyAvKiBCYWQgcHJvZ3JhbSBudW1iZXIgKi8KKwkJCWRldi5wcm9nX3N0YXR1c1tpXSA9IDA7CisJCX0gZWxzZSB7CisJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgInVwbG9hZCBwcm9ncmFtICIKKwkJCQkiZXJyb3IgMHgleFxuIiwgeCk7CisJCQlkZXYucHJvZ19zdGF0dXNbaV0gPSAwOworCQl9CisJfQorCisJZm9yIChpID0gMCwgY250ID0gMDsgaSA8IFdGX01BWF9QUk9HUkFNOyBpKyspIHsKKwkJaWYgKGRldi5wcm9nX3N0YXR1c1tpXSkgeworCQkJY250Kys7CisJCX0KKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FICIlZCBwcm9ncmFtcyBzbG90cyBpbiB1c2VcbiIsIGNudCk7CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfc2VuZF9wYXRjaCAod2F2ZWZyb250X3BhdGNoX2luZm8gKmhlYWRlcikKKworeworCXVuc2lnbmVkIGNoYXIgYnVmW1dGX1BBVENIX0JZVEVTKzJdOworCXVuc2lnbmVkIGNoYXIgKmJwdHI7CisKKwlEUFJJTlQgKFdGX0RFQlVHX0xPQURfUEFUQ0gsICJkb3dubG9hZGluZyBwYXRjaCAlZFxuIiwKKwkJCQkgICAgICBoZWFkZXItPm51bWJlcik7CisKKwlkZXYucGF0Y2hfc3RhdHVzW2hlYWRlci0+bnVtYmVyXSB8PSBXRl9TTE9UX0ZJTExFRDsKKworCWJwdHIgPSBidWY7CisJYnB0ciA9IG11bmdlX2ludDMyIChoZWFkZXItPm51bWJlciwgYnVmLCAyKTsKKwltdW5nZV9idWYgKCh1bnNpZ25lZCBjaGFyICopJmhlYWRlci0+aGRyLnAsIGJwdHIsIFdGX1BBVENIX0JZVEVTKTsKKyAgICAKKwlpZiAod2F2ZWZyb250X2NtZCAoV0ZDX0RPV05MT0FEX1BBVENILCBOVUxMLCBidWYpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiZG93bmxvYWQgcGF0Y2ggZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0oRUlPKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfc2VuZF9wcm9ncmFtICh3YXZlZnJvbnRfcGF0Y2hfaW5mbyAqaGVhZGVyKQorCit7CisJdW5zaWduZWQgY2hhciBidWZbV0ZfUFJPR1JBTV9CWVRFUysxXTsKKwlpbnQgaTsKKworCURQUklOVCAoV0ZfREVCVUdfTE9BRF9QQVRDSCwgImRvd25sb2FkaW5nIHByb2dyYW0gJWRcbiIsCisJCWhlYWRlci0+bnVtYmVyKTsKKworCWRldi5wcm9nX3N0YXR1c1toZWFkZXItPm51bWJlcl0gPSBXRl9TTE9UX1VTRUQ7CisKKwkvKiBYWFggbmVlZCB0byB6ZXJvIGV4aXN0aW5nIFNMT1RfVVNFRCBiaXQgZm9yIHByb2dyYW1fc3RhdHVzW2ldCisJICAgd2hlcmUgYGknIGlzIHRoZSBwcm9ncmFtIHRoYXQncyBiZWluZyAocG90ZW50aWFsbHkpIG92ZXJ3cml0dGVuLgorCSovCisgICAgCisJZm9yIChpID0gMDsgaSA8IFdGX05VTV9MQVlFUlM7IGkrKykgeworCQlpZiAoaGVhZGVyLT5oZHIucHIubGF5ZXJbaV0ubXV0ZSkgeworCQkJZGV2LnBhdGNoX3N0YXR1c1toZWFkZXItPmhkci5wci5sYXllcltpXS5wYXRjaF9udW1iZXJdIHw9CisJCQkJV0ZfU0xPVF9VU0VEOworCisJCQkvKiBYWFggbmVlZCB0byBtYXJrIFNMT1RfVVNFRCBmb3Igc2FtcGxlIHVzZWQgYnkKKwkJCSAgIHBhdGNoX251bWJlciwgYnV0IHRoaXMgbWVhbnMgd2UgaGF2ZSB0byBsb2FkIGl0LiBJY2suCisJCQkqLworCQl9CisJfQorCisJYnVmWzBdID0gaGVhZGVyLT5udW1iZXI7CisJbXVuZ2VfYnVmICgodW5zaWduZWQgY2hhciAqKSZoZWFkZXItPmhkci5wciwgJmJ1ZlsxXSwgV0ZfUFJPR1JBTV9CWVRFUyk7CisgICAgCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19ET1dOTE9BRF9QUk9HUkFNLCBOVUxMLCBidWYpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImRvd25sb2FkIHBhdGNoIGZhaWxlZFxuIik7CQorCQlyZXR1cm4gLShFSU8pOworCX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9mcmVlbWVtICh2b2lkKQorCit7CisJY2hhciByYnVmWzhdOworCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19SRVBPUlRfRlJFRV9NRU1PUlksIHJidWYsIE5VTEwpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImNhbid0IGdldCBtZW1vcnkgc3RhdHMuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSB7CisJCXJldHVybiBkZW11bmdlX2ludDMyIChyYnVmLCA0KTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9zZW5kX3NhbXBsZSAod2F2ZWZyb250X3BhdGNoX2luZm8gKmhlYWRlciwKKwkJICAgICAgIFVJTlQxNiBfX3VzZXIgKmRhdGFwdHIsCisJCSAgICAgICBpbnQgZGF0YV9pc191bnNpZ25lZCkKKworeworCS8qIHNhbXBsZXMgYXJlIGRvd25sb2FkZWQgdmlhIGEgMTYtYml0IHdpZGUgaS9vIHBvcnQKKwkgICAoeW91IGNvdWxkIHRoaW5rIG9mIGl0IGFzIDIgYWRqYWNlbnQgOC1iaXQgd2lkZSBwb3J0cworCSAgIGJ1dCBpdHMgbGVzcyBlZmZpY2llbnQgdGhhdCB3YXkpLiB0aGVyZWZvcmUsIGFsbAorCSAgIHRoZSBibG9ja3NpemVzIGFuZCBzbyBmb3J0aCBsaXN0ZWQgaW4gdGhlIGRvY3VtZW50YXRpb24sCisJICAgYW5kIHVzZWQgY29udmVudGlvbmFsbHkgdG8gcmVmZXIgdG8gc2FtcGxlIHNpemVzLAorCSAgIHdoaWNoIGFyZSBnaXZlbiBpbiA4LWJpdCB1bml0cyAoYnl0ZXMpLCBuZWVkIHRvIGJlCisJICAgZGl2aWRlZCBieSAyLgorICAgICAgICAqLworCisJVUlOVDE2IHNhbXBsZV9zaG9ydDsKKwlVSU5UMzIgbGVuZ3RoOworCVVJTlQxNiBfX3VzZXIgKmRhdGFfZW5kID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBpbnQgbWF4X2Jsa3NpemUgPSA0MDk2LzI7CisJdW5zaWduZWQgaW50IHdyaXR0ZW47CisJdW5zaWduZWQgaW50IGJsb2Nrc2l6ZTsKKwlpbnQgZG1hX2FjazsKKwlpbnQgYmxvY2tudW07CisJdW5zaWduZWQgY2hhciBzYW1wbGVfaGRyW1dGX1NBTVBMRV9IRFJfQllURVNdOworCXVuc2lnbmVkIGNoYXIgKnNocHRyOworCWludCBza2lwID0gMDsKKwlpbnQgaW5pdGlhbF9za2lwID0gMDsKKworCURQUklOVCAoV0ZfREVCVUdfTE9BRF9QQVRDSCwgInNhbXBsZSAlc2Rvd25sb2FkIGZvciBzbG90ICVkLCAiCisJCQkJICAgICAgInR5cGUgJWQsICVkIGJ5dGVzIGZyb20gJXBcbiIsCisJCQkJICAgICAgaGVhZGVyLT5zaXplID8gIiIgOiAiaGVhZGVyICIsIAorCQkJCSAgICAgIGhlYWRlci0+bnVtYmVyLCBoZWFkZXItPnN1YmtleSwKKwkJCQkgICAgICBoZWFkZXItPnNpemUsCisJCQkJICAgICAgaGVhZGVyLT5kYXRhcHRyKTsKKworCWlmIChoZWFkZXItPm51bWJlciA9PSBXQVZFRlJPTlRfRklORF9GUkVFX1NBTVBMRV9TTE9UKSB7CisJCWludCB4OworCisJCWlmICgoeCA9IHdhdmVmcm9udF9maW5kX2ZyZWVfc2FtcGxlICgpKSA8IDApIHsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCXByaW50ayAoS0VSTl9ERUJVRyBMT0dOQU1FICJ1bnNwZWNpZmllZCBzYW1wbGUgPT4gJWRcbiIsIHgpOworCQloZWFkZXItPm51bWJlciA9IHg7CisJfQorCisJaWYgKGhlYWRlci0+c2l6ZSkgeworCisJCS8qIFhYWCBpdCdzIGEgZGViYXRhYmxlIHBvaW50IHdoZXRoZXIgb3Igbm90IFJET05MWSBzZW1hbnRpY3MKKwkJICAgb24gdGhlIFJPTSBzYW1wbGVzIHNob3VsZCBjb3ZlciBqdXN0IHRoZSBzYW1wbGUgZGF0YSBvcgorCQkgICB0aGUgc2FtcGxlIGhlYWRlci4gRm9yIG5vdywgaXQgb25seSBjb3ZlcnMgdGhlIHNhbXBsZSBkYXRhLAorCQkgICBzbyBhbnlvbmUgaXMgZnJlZSBhdCBhbGwgdGltZXMgdG8gcmV3cml0ZSBzYW1wbGUgaGVhZGVycy4KKworCQkgICBNeSByZWFzb24gZm9yIHRoaXMgaXMgdGhhdCB3ZSBoYXZlIHRoZSBzYW1wbGUgaGVhZGVycworCQkgICBhdmFpbGFibGUgaW4gdGhlIFdGQiBmaWxlIGZvciBHZW5lcmFsIE1JREksIGFuZCBzbyB0aGVzZQorCQkgICBjYW4gYWx3YXlzIGJlIHJlc2V0IGlmIG5lZWRlZC4gVGhlIHNhbXBsZSBkYXRhLCBob3dldmVyLAorCQkgICBjYW5ub3QgYmUgcmVjb3ZlcmVkIHdpdGhvdXQgYSBjb21wbGV0ZSByZXNldCBhbmQgZmlybXdhcmUKKwkJICAgcmVsb2FkIG9mIHRoZSBJQ1MyMTE1LCB3aGljaCBpcyBhIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbi4KKworCQkgICBTbywgZG9pbmcgdGhpbmdzIHRoaXMgd2F5IGFsbG93cyB1cyB0byBob25vciB0aGUgbm90aW9uIG9mCisJCSAgICJSRVNFVFNBTVBMRVMiIHJlYXNvbmFibHkgY2hlYXBseS4gTm90ZSBob3dldmVyLCB0aGF0IHRoaXMKKwkJICAgaXMgZG9uZSBwdXJlbHkgYXQgdXNlciBsZXZlbDogdGhlcmUgaXMgbm8gV0ZCIHBhcnNlciBpbgorCQkgICB0aGlzIGRyaXZlciwgYW5kIHNvIGEgY29tcGxldGUgcmVzZXQgKGJhY2sgdG8gR2VuZXJhbCBNSURJLAorCQkgICBvciB0aGVvcmV0aWNhbGx5IHNvbWUgb3RoZXIgY29uZmlndXJhdGlvbikgaXMgdGhlCisJCSAgIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIGxldmVsIGxpYnJhcnkuIAorCisJCSAgIFRvIHRyeSB0byBkbyB0aGlzIGluIHRoZSBrZXJuZWwgd291bGQgYmUgYSBsaXR0bGUKKwkJICAgY3Jhenk6IHdlJ2QgbmVlZCAxNThLIG9mIGtlcm5lbCBzcGFjZSBqdXN0IHRvIGhvbGQKKwkJICAgYSBjb3B5IG9mIHRoZSBwYXRjaC9wcm9ncmFtL3NhbXBsZSBoZWFkZXIgZGF0YS4KKwkJKi8KKworCQlpZiAoZGV2LnJvbV9zYW1wbGVzX3Jkb25seSkgeworCQkJaWYgKGRldi5zYW1wbGVfc3RhdHVzW2hlYWRlci0+bnVtYmVyXSAmIFdGX1NMT1RfUk9NKSB7CisJCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJzYW1wbGUgc2xvdCAlZCAiCisJCQkJCSJ3cml0ZSBwcm90ZWN0ZWRcbiIsCisJCQkJCWhlYWRlci0+bnVtYmVyKTsKKwkJCQlyZXR1cm4gLUVBQ0NFUzsKKwkJCX0KKwkJfQorCisJCXdhdmVmcm9udF9kZWxldGVfc2FtcGxlIChoZWFkZXItPm51bWJlcik7CisJfQorCisJaWYgKGhlYWRlci0+c2l6ZSkgeworCQlkZXYuZnJlZW1lbSA9IHdhdmVmcm9udF9mcmVlbWVtICgpOworCisJCWlmIChkZXYuZnJlZW1lbSA8IGhlYWRlci0+c2l6ZSkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FCisJCQkJImluc3VmZmljaWVudCBtZW1vcnkgdG8gIgorCQkJCSJsb2FkICVkIGJ5dGUgc2FtcGxlLlxuIiwKKwkJCQloZWFkZXItPnNpemUpOworCQkJcmV0dXJuIC1FTk9NRU07CisJCX0KKwkKKwl9CisKKwlza2lwID0gV0ZfR0VUX0NIQU5ORUwoJmhlYWRlci0+aGRyLnMpOworCisJaWYgKHNraXAgPiAwICYmIGhlYWRlci0+aGRyLnMuU2FtcGxlUmVzb2x1dGlvbiAhPSBMSU5FQVJfMTZCSVQpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJjaGFubmVsIHNlbGVjdGlvbiBvbmx5ICIKKwkJCSJwb3NzaWJsZSBvbiAxNi1iaXQgc2FtcGxlcyIpOworCQlyZXR1cm4gLShFSU5WQUwpOworCX0KKworCXN3aXRjaCAoc2tpcCkgeworCWNhc2UgMDoKKwkJaW5pdGlhbF9za2lwID0gMDsKKwkJc2tpcCA9IDE7CisJCWJyZWFrOworCWNhc2UgMToKKwkJaW5pdGlhbF9za2lwID0gMDsKKwkJc2tpcCA9IDI7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJaW5pdGlhbF9za2lwID0gMTsKKwkJc2tpcCA9IDI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJaW5pdGlhbF9za2lwID0gMjsKKwkJc2tpcCA9IDM7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaW5pdGlhbF9za2lwID0gMzsKKwkJc2tpcCA9IDQ7CisJCWJyZWFrOworCWNhc2UgNToKKwkJaW5pdGlhbF9za2lwID0gNDsKKwkJc2tpcCA9IDU7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJaW5pdGlhbF9za2lwID0gNTsKKwkJc2tpcCA9IDY7CisJCWJyZWFrOworCX0KKworCURQUklOVCAoV0ZfREVCVUdfTE9BRF9QQVRDSCwgImNoYW5uZWwgc2VsZWN0aW9uOiAlZCA9PiAiCisJCQkJICAgICAgImluaXRpYWwgc2tpcCA9ICVkLCBza2lwID0gJWRcbiIsCisJCQkJICAgICAgV0ZfR0VUX0NIQU5ORUwgKCZoZWFkZXItPmhkci5zKSwKKwkJCQkgICAgICBpbml0aWFsX3NraXAsIHNraXApOworICAgIAorCS8qIEJlIHNhZmUsIGFuZCB6ZXJvIHRoZSAiVW51c2VkIiBiaXRzIC4uLiAqLworCisJV0ZfU0VUX0NIQU5ORUwoJmhlYWRlci0+aGRyLnMsIDApOworCisJLyogYWRqdXN0IHNpemUgZm9yIDE2IGJpdCBzYW1wbGVzIGJ5IGRpdmlkaW5nIGJ5IHR3by4gIFdlIGFsd2F5cworCSAgIHNlbmQgMTYgYml0cyBwZXIgd3JpdGUsIGV2ZW4gZm9yIDggYml0IHNhbXBsZXMsIHNvIHRoZSBsZW5ndGgKKwkgICBpcyBhbHdheXMgaGFsZiB0aGUgc2l6ZSBvZiB0aGUgc2FtcGxlIGRhdGEgaW4gYnl0ZXMuCisJKi8KKworCWxlbmd0aCA9IGhlYWRlci0+c2l6ZSAvIDI7CisKKwkvKiB0aGUgZGF0YSB3ZSdyZSBzZW50IGhhcyBub3QgYmVlbiBtdW5nZWQsIGFuZCBpbiBmYWN0LCB0aGUKKwkgICBoZWFkZXIgd2UgaGF2ZSB0byBzZW5kIGlzbid0IGp1c3QgYSBtdW5nZWQgY29weSBlaXRoZXIuCisJICAgc28sIGJ1aWxkIHRoZSBzYW1wbGUgaGVhZGVyIHJpZ2h0IGhlcmUuCisJKi8KKworCXNocHRyID0gJnNhbXBsZV9oZHJbMF07CisKKwlzaHB0ciA9IG11bmdlX2ludDMyIChoZWFkZXItPm51bWJlciwgc2hwdHIsIDIpOworCisJaWYgKGhlYWRlci0+c2l6ZSkgeworCQlzaHB0ciA9IG11bmdlX2ludDMyIChsZW5ndGgsIHNocHRyLCA0KTsKKwl9CisKKwkvKiBZZXMsIGEgNCBieXRlIHJlc3VsdCBkb2Vzbid0IGNvbnRhaW4gYWxsIG9mIHRoZSBvZmZzZXQgYml0cywKKwkgICBidXQgdGhlIG9mZnNldCBvbmx5IHVzZXMgMjQgYml0cy4KKwkqLworCisJc2hwdHIgPSBtdW5nZV9pbnQzMiAoKigoVUlOVDMyICopICZoZWFkZXItPmhkci5zLnNhbXBsZVN0YXJ0T2Zmc2V0KSwKKwkJCSAgICAgc2hwdHIsIDQpOworCXNocHRyID0gbXVuZ2VfaW50MzIgKCooKFVJTlQzMiAqKSAmaGVhZGVyLT5oZHIucy5sb29wU3RhcnRPZmZzZXQpLAorCQkJICAgICBzaHB0ciwgNCk7CisJc2hwdHIgPSBtdW5nZV9pbnQzMiAoKigoVUlOVDMyICopICZoZWFkZXItPmhkci5zLmxvb3BFbmRPZmZzZXQpLAorCQkJICAgICBzaHB0ciwgNCk7CisJc2hwdHIgPSBtdW5nZV9pbnQzMiAoKigoVUlOVDMyICopICZoZWFkZXItPmhkci5zLnNhbXBsZUVuZE9mZnNldCksCisJCQkgICAgIHNocHRyLCA0KTsKKwkKKwkvKiBUaGlzIG9uZSBpcyB0cnVseSB3ZWlyZC4gV2hhdCBraW5kIG9mIHdlaXJkbyBkZWNpZGVkIHRoYXQgaW4KKwkgICBhIHN5c3RlbSBkb21pbmF0ZWQgYnkgMTYgYW5kIDMyIGJpdCBpbnRlZ2VycywgdGhleSB3b3VsZCB1c2UKKwkgICBhIGp1c3QgMTIgYml0cyA/CisJKi8KKwkKKwlzaHB0ciA9IG11bmdlX2ludDMyIChoZWFkZXItPmhkci5zLkZyZXF1ZW5jeUJpYXMsIHNocHRyLCAzKTsKKwkKKwkvKiBXaHkgaXMgdGhpcyBueWJibGlmaWVkLCB3aGVuIHRoZSBNU0IgaXMgKmFsd2F5cyogemVybyA/IAorCSAgIEFueXdheSwgd2UgY2FuJ3QgdGFrZSBhZGRyZXNzIG9mIGJpdGZpZWxkLCBzbyBtYWtlIGEKKwkgICBnb29kLWZhaXRoIGd1ZXNzIGF0IHdoZXJlIGl0IHN0YXJ0cy4KKwkqLworCQorCXNocHRyID0gbXVuZ2VfaW50MzIgKCooJmhlYWRlci0+aGRyLnMuRnJlcXVlbmN5QmlhcysxKSwKKwkJCSAgICAgc2hwdHIsIDIpOworCisJaWYgKHdhdmVmcm9udF9jbWQgKGhlYWRlci0+c2l6ZSA/CisJCQkgICBXRkNfRE9XTkxPQURfU0FNUExFIDogV0ZDX0RPV05MT0FEX1NBTVBMRV9IRUFERVIsCisJCQkgICBOVUxMLCBzYW1wbGVfaGRyKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJzYW1wbGUgJXNkb3dubG9hZCByZWZ1c2VkLlxuIiwKKwkJCWhlYWRlci0+c2l6ZSA/ICIiIDogImhlYWRlciAiKTsKKwkJcmV0dXJuIC0oRUlPKTsKKwl9CisKKwlpZiAoaGVhZGVyLT5zaXplID09IDApIHsKKwkJZ290byBzZW50OyAvKiBTb3JyeS4gSnVzdCBoYWQgdG8gaGF2ZSBvbmUgc29tZXdoZXJlICovCisJfQorICAgIAorCWRhdGFfZW5kID0gZGF0YXB0ciArIGxlbmd0aDsKKworCS8qIERvIGFueSBpbml0aWFsIHNraXAgb3ZlciBhbiB1bnVzZWQgY2hhbm5lbCdzIGRhdGEgKi8KKworCWRhdGFwdHIgKz0gaW5pdGlhbF9za2lwOworICAgIAorCWZvciAod3JpdHRlbiA9IDAsIGJsb2NrbnVtID0gMDsKKwkgICAgIHdyaXR0ZW4gPCBsZW5ndGg7IHdyaXR0ZW4gKz0gbWF4X2Jsa3NpemUsIGJsb2NrbnVtKyspIHsKKwkKKwkJaWYgKChsZW5ndGggLSB3cml0dGVuKSA+IG1heF9ibGtzaXplKSB7CisJCQlibG9ja3NpemUgPSBtYXhfYmxrc2l6ZTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJvdW5kIHRvIG5lYXJlc3QgMTYtYnl0ZSB2YWx1ZSAqLworCQkJYmxvY2tzaXplID0gKChsZW5ndGgtd3JpdHRlbis3KSZ+MHg3KTsKKwkJfQorCisJCWlmICh3YXZlZnJvbnRfY21kIChXRkNfRE9XTkxPQURfQkxPQ0ssIE5VTEwsIE5VTEwpKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJkb3dubG9hZCBibG9jayAiCisJCQkJInJlcXVlc3QgcmVmdXNlZC5cbiIpOworCQkJcmV0dXJuIC0oRUlPKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBibG9ja3NpemU7IGkrKykgeworCisJCQlpZiAoZGF0YXB0ciA8IGRhdGFfZW5kKSB7CisJCQorCQkJCV9fZ2V0X3VzZXIgKHNhbXBsZV9zaG9ydCwgZGF0YXB0cik7CisJCQkJZGF0YXB0ciArPSBza2lwOworCQkKKwkJCQlpZiAoZGF0YV9pc191bnNpZ25lZCkgeyAvKiBHVVMgPyAqLworCisJCQkJCWlmIChXRl9TQU1QTEVfSVNfOEJJVCgmaGVhZGVyLT5oZHIucykpIHsKKwkJCQorCQkJCQkJLyogOCBiaXQgc2FtcGxlCisJCQkJCQkgcmVzb2x1dGlvbiwgc2lnbgorCQkJCQkJIGV4dGVuZCBib3RoIGJ5dGVzLgorCQkJCQkJKi8KKwkJCQorCQkJCQkJKCh1bnNpZ25lZCBjaGFyKikKKwkJCQkJCSAmc2FtcGxlX3Nob3J0KVswXSArPSAweDdmOworCQkJCQkJKCh1bnNpZ25lZCBjaGFyKikKKwkJCQkJCSAmc2FtcGxlX3Nob3J0KVsxXSArPSAweDdmOworCQkJCisJCQkJCX0gZWxzZSB7CisJCQkKKwkJCQkJCS8qIDE2IGJpdCBzYW1wbGUKKwkJCQkJCSByZXNvbHV0aW9uLCBzaWduCisJCQkJCQkgZXh0ZW5kIHRoZSBNU0IuCisJCQkJCQkqLworCQkJCisJCQkJCQlzYW1wbGVfc2hvcnQgKz0gMHg3ZmZmOworCQkJCQl9CisJCQkJfQorCisJCQl9IGVsc2UgeworCisJCQkJLyogSW4gcGFkZGluZyBzZWN0aW9uIG9mIGZpbmFsIGJsb2NrOgorCisJCQkJICAgRG9uJ3QgZmV0Y2ggdW5zdXBwbGllZCBkYXRhIGZyb20KKwkJCQkgICB1c2VyIHNwYWNlLCBqdXN0IGNvbnRpbnVlIHdpdGgKKwkJCQkgICB3aGF0ZXZlciB0aGUgZmluYWwgdmFsdWUgd2FzLgorCQkJCSovCisJCQl9CisJICAgIAorCQkJaWYgKGkgPCBibG9ja3NpemUgLSAxKSB7CisJCQkJb3V0dyAoc2FtcGxlX3Nob3J0LCBkZXYuYmxvY2tfcG9ydCk7CisJCQl9IGVsc2UgeworCQkJCW91dHcgKHNhbXBsZV9zaG9ydCwgZGV2Lmxhc3RfYmxvY2tfcG9ydCk7CisJCQl9CisJCX0KKworCQkvKiBHZXQgIkRNQSBwYWdlIGFja25vd2xlZGdlIiwgZXZlbiB0aG91Z2ggaXRzIHJlYWxseQorCQkgICBub3RoaW5nIHRvIGRvIHdpdGggRE1BIGF0IGFsbC4KKwkJKi8KKwkKKwkJaWYgKChkbWFfYWNrID0gd2F2ZWZyb250X3JlYWQgKCkpICE9IFdGX0RNQV9BQ0spIHsKKwkJCWlmIChkbWFfYWNrID09IC0xKSB7CisJCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ1cGxvYWQgc2FtcGxlICIKKwkJCQkJIkRNQSBhY2sgdGltZW91dFxuIik7CisJCQkJcmV0dXJuIC0oRUlPKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ1cGxvYWQgc2FtcGxlICIKKwkJCQkJIkRNQSBhY2sgZXJyb3IgMHgleFxuIiwKKwkJCQkJZG1hX2Fjayk7CisJCQkJcmV0dXJuIC0oRUlPKTsKKwkJCX0KKwkJfQorCX0KKworCWRldi5zYW1wbGVfc3RhdHVzW2hlYWRlci0+bnVtYmVyXSA9IChXRl9TTE9UX0ZJTExFRHxXRl9TVF9TQU1QTEUpOworCisJLyogTm90ZSwgbGFiZWwgaXMgaGVyZSBiZWNhdXNlIHNlbmRpbmcgdGhlIHNhbXBsZSBoZWFkZXIgc2hvdWxkbid0CisJICAgYWx0ZXIgdGhlIHNhbXBsZV9zdGF0dXMgaW5mbyBhdCBhbGwuCisJKi8KKworIHNlbnQ6CisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X3NlbmRfYWxpYXMgKHdhdmVmcm9udF9wYXRjaF9pbmZvICpoZWFkZXIpCisKK3sKKwl1bnNpZ25lZCBjaGFyIGFsaWFzX2hkcltXRl9BTElBU19CWVRFU107CisKKwlEUFJJTlQgKFdGX0RFQlVHX0xPQURfUEFUQ0gsICJkb3dubG9hZCBhbGlhcywgJWQgaXMgIgorCQkJCSAgICAgICJhbGlhcyBmb3IgJWRcbiIsCisJCQkJICAgICAgaGVhZGVyLT5udW1iZXIsCisJCQkJICAgICAgaGVhZGVyLT5oZHIuYS5PcmlnaW5hbFNhbXBsZSk7CisgICAgCisJbXVuZ2VfaW50MzIgKGhlYWRlci0+bnVtYmVyLCAmYWxpYXNfaGRyWzBdLCAyKTsKKwltdW5nZV9pbnQzMiAoaGVhZGVyLT5oZHIuYS5PcmlnaW5hbFNhbXBsZSwgJmFsaWFzX2hkclsyXSwgMik7CisJbXVuZ2VfaW50MzIgKCooKHVuc2lnbmVkIGludCAqKSZoZWFkZXItPmhkci5hLnNhbXBsZVN0YXJ0T2Zmc2V0KSwKKwkJICAgICAmYWxpYXNfaGRyWzRdLCA0KTsKKwltdW5nZV9pbnQzMiAoKigodW5zaWduZWQgaW50ICopJmhlYWRlci0+aGRyLmEubG9vcFN0YXJ0T2Zmc2V0KSwKKwkJICAgICAmYWxpYXNfaGRyWzhdLCA0KTsKKwltdW5nZV9pbnQzMiAoKigodW5zaWduZWQgaW50ICopJmhlYWRlci0+aGRyLmEubG9vcEVuZE9mZnNldCksCisJCSAgICAgJmFsaWFzX2hkclsxMl0sIDQpOworCW11bmdlX2ludDMyICgqKCh1bnNpZ25lZCBpbnQgKikmaGVhZGVyLT5oZHIuYS5zYW1wbGVFbmRPZmZzZXQpLAorCQkgICAgICZhbGlhc19oZHJbMTZdLCA0KTsKKwltdW5nZV9pbnQzMiAoaGVhZGVyLT5oZHIuYS5GcmVxdWVuY3lCaWFzLCAmYWxpYXNfaGRyWzIwXSwgMyk7CisJbXVuZ2VfaW50MzIgKCooJmhlYWRlci0+aGRyLmEuRnJlcXVlbmN5QmlhcysxKSwgJmFsaWFzX2hkclsyM10sIDIpOworCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19ET1dOTE9BRF9TQU1QTEVfQUxJQVMsIE5VTEwsIGFsaWFzX2hkcikpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJkb3dubG9hZCBhbGlhcyBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0oRUlPKTsKKwl9CisKKwlkZXYuc2FtcGxlX3N0YXR1c1toZWFkZXItPm51bWJlcl0gPSAoV0ZfU0xPVF9GSUxMRUR8V0ZfU1RfQUxJQVMpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X3NlbmRfbXVsdGlzYW1wbGUgKHdhdmVmcm9udF9wYXRjaF9pbmZvICpoZWFkZXIpCit7CisJaW50IGk7CisJaW50IG51bV9zYW1wbGVzOworCXVuc2lnbmVkIGNoYXIgbXNhbXBsZV9oZHJbV0ZfTVNBTVBMRV9CWVRFU107CisKKwltdW5nZV9pbnQzMiAoaGVhZGVyLT5udW1iZXIsICZtc2FtcGxlX2hkclswXSwgMik7CisKKwkvKiBZb3UnbGwgcmVjYWxsIGF0IHRoaXMgcG9pbnQgdGhhdCB0aGUgIm51bWJlciBvZiBzYW1wbGVzIiB2YWx1ZQorCSAgIGluIGEgd2F2ZWZyb250X211bHRpc2FtcGxlIHN0cnVjdCBpcyBhY3R1YWxseSB0aGUgbG9nMiBvZiB0aGUKKwkgICByZWFsIG51bWJlciBvZiBzYW1wbGVzLgorCSovCisKKwludW1fc2FtcGxlcyA9ICgxPDwoaGVhZGVyLT5oZHIubXMuTnVtYmVyT2ZTYW1wbGVzJjcpKTsKKwltc2FtcGxlX2hkclsyXSA9ICh1bnNpZ25lZCBjaGFyKSBoZWFkZXItPmhkci5tcy5OdW1iZXJPZlNhbXBsZXM7CisKKwlEUFJJTlQgKFdGX0RFQlVHX0xPQURfUEFUQ0gsICJtdWx0aSAlZCB3aXRoICVkPSVkIHNhbXBsZXNcbiIsCisJCQkJICAgICAgaGVhZGVyLT5udW1iZXIsCisJCQkJICAgICAgaGVhZGVyLT5oZHIubXMuTnVtYmVyT2ZTYW1wbGVzLAorCQkJCSAgICAgIG51bV9zYW1wbGVzKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fc2FtcGxlczsgaSsrKSB7CisJCURQUklOVChXRl9ERUJVR19MT0FEX1BBVENIfFdGX0RFQlVHX0RBVEEsICJzYW1wbGVbJWRdID0gJWRcbiIsCisJCSAgICAgICBpLCBoZWFkZXItPmhkci5tcy5TYW1wbGVOdW1iZXJbaV0pOworCQltdW5nZV9pbnQzMiAoaGVhZGVyLT5oZHIubXMuU2FtcGxlTnVtYmVyW2ldLAorCQkgICAgICZtc2FtcGxlX2hkclszKyhpKjIpXSwgMik7CisJfQorICAgIAorCS8qIE5lZWQgYSBoYWNrIGhlcmUgdG8gcGFzcyBpbiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisJICAgdG8gYmUgd3JpdHRlbiB0byB0aGUgc3ludGguIFRoaXMgaXMgdWdseSwgYW5kIHBlcmhhcHMKKwkgICBvbmUgZGF5LCBJJ2xsIGZpeCBpdC4KKwkqLworCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19ET1dOTE9BRF9NVUxUSVNBTVBMRSwgCisJCQkgICAodW5zaWduZWQgY2hhciAqKSAoKG51bV9zYW1wbGVzKjIpKzMpLAorCQkJICAgbXNhbXBsZV9oZHIpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiZG93bmxvYWQgb2YgbXVsdGlzYW1wbGUgZmFpbGVkLlxuIik7CisJCXJldHVybiAtKEVJTyk7CisJfQorCisJZGV2LnNhbXBsZV9zdGF0dXNbaGVhZGVyLT5udW1iZXJdID0gKFdGX1NMT1RfRklMTEVEfFdGX1NUX01VTFRJU0FNUExFKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9mZXRjaF9tdWx0aXNhbXBsZSAod2F2ZWZyb250X3BhdGNoX2luZm8gKmhlYWRlcikKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyIGxvZ19uc1sxXTsKKwl1bnNpZ25lZCBjaGFyIG51bWJlclsyXTsKKwlpbnQgbnVtX3NhbXBsZXM7CisKKwltdW5nZV9pbnQzMiAoaGVhZGVyLT5udW1iZXIsIG51bWJlciwgMik7CisgICAgCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19VUExPQURfTVVMVElTQU1QTEUsIGxvZ19ucywgbnVtYmVyKSkgeworCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgInVwbG9hZCBtdWx0aXNhbXBsZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0oRUlPKTsKKwl9CisgICAgCisJRFBSSU5UIChXRl9ERUJVR19EQVRBLCAibXNhbXBsZSAlZCBoYXMgJWQgc2FtcGxlc1xuIiwKKwkJCQloZWFkZXItPm51bWJlciwgbG9nX25zWzBdKTsKKworCWhlYWRlci0+aGRyLm1zLk51bWJlck9mU2FtcGxlcyA9IGxvZ19uc1swXTsKKworCS8qIGdldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgLi4uICovCisKKwludW1fc2FtcGxlcyA9ICgxIDw8IGxvZ19uc1swXSk7CisgICAgCisJZm9yIChpID0gMDsgaSA8IG51bV9zYW1wbGVzOyBpKyspIHsKKwkJczggZFsyXTsKKwkKKwkJaWYgKChkWzBdID0gd2F2ZWZyb250X3JlYWQgKCkpID09IC0xKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgInVwbG9hZCBtdWx0aXNhbXBsZSBmYWlsZWQgIgorCQkJCSJkdXJpbmcgc2FtcGxlIGxvb3AuXG4iKTsKKwkJCXJldHVybiAtKEVJTyk7CisJCX0KKworCQlpZiAoKGRbMV0gPSB3YXZlZnJvbnRfcmVhZCAoKSkgPT0gLTEpIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAidXBsb2FkIG11bHRpc2FtcGxlIGZhaWxlZCAiCisJCQkJImR1cmluZyBzYW1wbGUgbG9vcC5cbiIpOworCQkJcmV0dXJuIC0oRUlPKTsKKwkJfQorCQorCQloZWFkZXItPmhkci5tcy5TYW1wbGVOdW1iZXJbaV0gPQorCQkJZGVtdW5nZV9pbnQzMiAoKHVuc2lnbmVkIGNoYXIgKikgZCwgMik7CisJCisJCURQUklOVCAoV0ZfREVCVUdfREFUQSwgIm1zYW1wbGUgc2FtcGxlWyVkXSA9ICVkXG4iLAorCQkJCQlpLCBoZWFkZXItPmhkci5tcy5TYW1wbGVOdW1iZXJbaV0pOworCX0KKworCXJldHVybiAoMCk7Cit9CisKKworc3RhdGljIGludAord2F2ZWZyb250X3NlbmRfZHJ1bSAod2F2ZWZyb250X3BhdGNoX2luZm8gKmhlYWRlcikKKworeworCXVuc2lnbmVkIGNoYXIgZHJ1bWJ1ZltXRl9EUlVNX0JZVEVTXTsKKwl3YXZlZnJvbnRfZHJ1bSAqZHJ1bSA9ICZoZWFkZXItPmhkci5kOworCWludCBpOworCisJRFBSSU5UIChXRl9ERUJVR19MT0FEX1BBVENILCAiZG93bmxvYWRpbmcgZWRydW0gZm9yIE1JREkgIgorCQkibm90ZSAlZCwgcGF0Y2ggPSAlZFxuIiwgCisJCWhlYWRlci0+bnVtYmVyLCBkcnVtLT5QYXRjaE51bWJlcik7CisKKwlkcnVtYnVmWzBdID0gaGVhZGVyLT5udW1iZXIgJiAweDdmOworCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQltdW5nZV9pbnQzMiAoKCh1bnNpZ25lZCBjaGFyICopZHJ1bSlbaV0sICZkcnVtYnVmWzErKGkqMildLCAyKTsKKwl9CisKKwlpZiAod2F2ZWZyb250X2NtZCAoV0ZDX0RPV05MT0FEX0VEUlVNX1BST0dSQU0sIE5VTEwsIGRydW1idWYpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiZG93bmxvYWQgZHJ1bSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0oRUlPKTsKKwl9CisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IAord2F2ZWZyb250X2ZpbmRfZnJlZV9zYW1wbGUgKHZvaWQpCisKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBXRl9NQVhfU0FNUExFOyBpKyspIHsKKwkJaWYgKCEoZGV2LnNhbXBsZV9zdGF0dXNbaV0gJiBXRl9TTE9UX0ZJTExFRCkpIHsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgIm5vIGZyZWUgc2FtcGxlIHNsb3RzIVxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IAord2F2ZWZyb250X2ZpbmRfZnJlZV9wYXRjaCAodm9pZCkKKworeworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFdGX01BWF9QQVRDSDsgaSsrKSB7CisJCWlmICghKGRldi5wYXRjaF9zdGF0dXNbaV0gJiBXRl9TTE9UX0ZJTExFRCkpIHsKKwkJCXJldHVybiBpOworCQl9CisJfQorCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgIm5vIGZyZWUgcGF0Y2ggc2xvdHMhXG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgCitsb2cyXzIwNDgoaW50IG4pCisKK3sKKwlpbnQgdGJsW109ezAsIDAsIDIwNDgsIDMyNDYsIDQwOTYsIDQ3NTUsIDUyOTQsIDU3NDksIDYxNDMsCisJCSAgIDY0OTIsIDY4MDMsIDcwODQsIDczNDIsIDc1NzgsIDc3OTcsIDgwMDEsIDgxOTIsCisJCSAgIDgzNzEsIDg1NDAsIDg2OTksIDg4NTEsIDg5OTUsIDkxMzIsIDkyNjQsIDkzOTAsCisJCSAgIDk1MTAsIDk2MjYsIDk3MzgsIDk4NDUsIDk5NDksIDEwMDQ5LCAxMDE0Nn07CisJaW50IGk7CisKKwkvKiBSZXR1cm5zIDIwNDgqbG9nMihuKSAqLworCisJLyogRklYTUU6IHRoaXMgaXMgbGlrZSBkb2luZyBpbnRlZ2VyIG1hdGgKKwkgICBvbiBxdWFudHVtIHBhcnRpY2xlcyAoUnVOKSAqLworCisJaT0wOworCXdoaWxlKG4+PTMyKjI1NikgeworCQluPj49ODsKKwkJaSs9MjA0OCo4OworCX0KKwl3aGlsZShuPj0zMikgeworCQluPj49MTsKKwkJaSs9MjA0ODsKKwl9CisJaSs9dGJsW25dOworCXJldHVybihpKTsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X2xvYWRfZ3VzX3BhdGNoIChpbnQgZGV2bm8sIGludCBmb3JtYXQsIGNvbnN0IGNoYXIgX191c2VyICphZGRyLAorCQkJICBpbnQgb2ZmcywgaW50IGNvdW50LCBpbnQgcG1ncl9mbGFnKQoreworCXN0cnVjdCBwYXRjaF9pbmZvIGd1c3BhdGNoOworCXdhdmVmcm9udF9wYXRjaF9pbmZvICpzYW1wLCAqcGF0LCAqcHJvZzsKKwl3YXZlZnJvbnRfcGF0Y2ggKnBhdHA7CisJd2F2ZWZyb250X3NhbXBsZSAqc2FtcHA7CisJd2F2ZWZyb250X3Byb2dyYW0gKnByb2dwOworCisJaW50IGksYmFzZV9ub3RlOworCWxvbmcgc2l6ZW9mX3BhdGNoOworCWludCByYyA9IC1FTk9NRU07CisKKwlzYW1wID0ga21hbGxvYygzICogc2l6ZW9mKHdhdmVmcm9udF9wYXRjaF9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzYW1wKQorCQlnb3RvIGZyZWVfZmFpbDsKKwlwYXQgPSBzYW1wICsgMTsKKwlwcm9nID0gcGF0ICsgMTsKKworCS8qIENvcHkgaW4gdGhlIGhlYWRlciBvZiB0aGUgR1VTIHBhdGNoICovCisKKwlzaXplb2ZfcGF0Y2ggPSAobG9uZykgJmd1c3BhdGNoLmRhdGFbMF0gLSAobG9uZykgJmd1c3BhdGNoOyAKKwlpZiAoY29weV9mcm9tX3VzZXIoJigoY2hhciAqKSAmZ3VzcGF0Y2gpW29mZnNdLAorCQkJICAgJihhZGRyKVtvZmZzXSwgc2l6ZW9mX3BhdGNoIC0gb2ZmcykpIHsKKwkJcmMgPSAtRUZBVUxUOworCQlnb3RvIGZyZWVfZmFpbDsKKwl9CisKKwlpZiAoKGkgPSB3YXZlZnJvbnRfZmluZF9mcmVlX3BhdGNoICgpKSA9PSAtMSkgeworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBmcmVlX2ZhaWw7CisJfQorCXBhdC0+bnVtYmVyID0gaTsKKwlwYXQtPnN1YmtleSA9IFdGX1NUX1BBVENIOworCXBhdHAgPSAmcGF0LT5oZHIucDsKKworCWlmICgoaSA9IHdhdmVmcm9udF9maW5kX2ZyZWVfc2FtcGxlICgpKSA9PSAtMSkgeworCQlyYyA9IC1FQlVTWTsKKwkJZ290byBmcmVlX2ZhaWw7CisJfQorCXNhbXAtPm51bWJlciA9IGk7CisJc2FtcC0+c3Via2V5ID0gV0ZfU1RfU0FNUExFOworCXNhbXAtPnNpemUgPSBndXNwYXRjaC5sZW47CisJc2FtcHAgPSAmc2FtcC0+aGRyLnM7CisKKwlwcm9nLT5udW1iZXIgPSBndXNwYXRjaC5pbnN0cl9ubzsKKwlwcm9ncCA9ICZwcm9nLT5oZHIucHI7CisKKwkvKiBTZXR1cCB0aGUgcGF0Y2ggc3RydWN0dXJlICovCisKKwlwYXRwLT5hbXBsaXR1ZGVfYmlhcz1ndXNwYXRjaC52b2x1bWU7CisJcGF0cC0+cG9ydGFtZW50bz0wOworCXBhdHAtPnNhbXBsZV9udW1iZXI9IHNhbXAtPm51bWJlciAmIDB4ZmY7CisJcGF0cC0+c2FtcGxlX21zYj0gc2FtcC0+bnVtYmVyID4+IDg7CisJcGF0cC0+cGl0Y2hfYmVuZD0gLyoxMiovIDA7CisJcGF0cC0+bW9ubz0xOworCXBhdHAtPnJldHJpZ2dlcj0xOworCXBhdHAtPm5vaG9sZD0oZ3VzcGF0Y2gubW9kZSAmIFdBVkVfU1VTVEFJTl9PTikgPyAwOjE7CisJcGF0cC0+ZnJlcXVlbmN5X2JpYXM9MDsKKwlwYXRwLT5yZXN0YXJ0PTA7CisJcGF0cC0+cmV1c2U9MDsKKwlwYXRwLT5yZXNldF9sZm89MTsKKwlwYXRwLT5mbV9zcmMyPTA7CisJcGF0cC0+Zm1fc3JjMT1XRl9NT0RfTU9EX1dIRUVMOworCXBhdHAtPmFtX3NyYz1XRl9NT0RfUFJFU1NVUkU7CisJcGF0cC0+YW1fYW1vdW50PTEyNzsKKwlwYXRwLT5mYzFfbW9kX2Ftb3VudD0wOworCXBhdHAtPmZjMl9tb2RfYW1vdW50PTA7IAorCXBhdHAtPmZtX2Ftb3VudDE9MDsKKwlwYXRwLT5mbV9hbW91bnQyPTA7CisJcGF0cC0+ZW52ZWxvcGUxLmF0dGFja19sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUxLmRlY2F5MV9sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUxLmRlY2F5Ml9sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUxLnN1c3RhaW5fbGV2ZWw9MTI3OworCXBhdHAtPmVudmVsb3BlMS5yZWxlYXNlX2xldmVsPTA7CisJcGF0cC0+ZW52ZWxvcGUyLmF0dGFja192ZWxvY2l0eT0xMjc7CisJcGF0cC0+ZW52ZWxvcGUyLmF0dGFja19sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUyLmRlY2F5MV9sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUyLmRlY2F5Ml9sZXZlbD0xMjc7CisJcGF0cC0+ZW52ZWxvcGUyLnN1c3RhaW5fbGV2ZWw9MTI3OworCXBhdHAtPmVudmVsb3BlMi5yZWxlYXNlX2xldmVsPTA7CisJcGF0cC0+ZW52ZWxvcGUyLmF0dGFja192ZWxvY2l0eT0xMjc7CisJcGF0cC0+cmFuZG9taXplcj0wOworCisJLyogUHJvZ3JhbSBmb3IgdGhpcyBwYXRjaCAqLworCisJcHJvZ3AtPmxheWVyWzBdLnBhdGNoX251bWJlcj0gcGF0LT5udW1iZXI7IC8qIFhYWCBpcyB0aGlzIHJpZ2h0ID8gKi8KKwlwcm9ncC0+bGF5ZXJbMF0ubXV0ZT0xOworCXByb2dwLT5sYXllclswXS5wYW5fb3JfbW9kPTE7CisJcHJvZ3AtPmxheWVyWzBdLnBhbj03OworCXByb2dwLT5sYXllclswXS5taXhfbGV2ZWw9MTI3ICAvKiBndXNwYXRjaC52b2x1bWUgKi87CisJcHJvZ3AtPmxheWVyWzBdLnNwbGl0X3R5cGU9MDsKKwlwcm9ncC0+bGF5ZXJbMF0uc3BsaXRfcG9pbnQ9MDsKKwlwcm9ncC0+bGF5ZXJbMF0ucGxheV9iZWxvdz0wOworCisJZm9yIChpID0gMTsgaSA8IDQ7IGkrKykgeworCQlwcm9ncC0+bGF5ZXJbaV0ubXV0ZT0wOworCX0KKworCS8qIFNhbXBsZSBkYXRhICovCisKKwlzYW1wcC0+U2FtcGxlUmVzb2x1dGlvbj0oKH5ndXNwYXRjaC5tb2RlICYgV0FWRV8xNl9CSVRTKTw8MSk7CisKKwlmb3IgKGJhc2Vfbm90ZT0wOworCSAgICAgbm90ZV90b19mcmVxIChiYXNlX25vdGUpIDwgZ3VzcGF0Y2guYmFzZV9ub3RlOworCSAgICAgYmFzZV9ub3RlKyspOworCisJaWYgKChndXNwYXRjaC5iYXNlX25vdGUtbm90ZV90b19mcmVxKGJhc2Vfbm90ZSkpCisJICAgID4obm90ZV90b19mcmVxKGJhc2Vfbm90ZSktZ3VzcGF0Y2guYmFzZV9ub3RlKSkKKwkJYmFzZV9ub3RlKys7CisKKwlwcmludGsoS0VSTl9ERUJVRyAicmVmIGZyZXE9JWQsYmFzZSBub3RlPSVkXG4iLAorCSAgICAgICBndXNwYXRjaC5iYXNlX2ZyZXEsCisJICAgICAgIGJhc2Vfbm90ZSk7CisKKwlzYW1wcC0+RnJlcXVlbmN5QmlhcyA9ICgyOTU1MCAtIGxvZzJfMjA0OChndXNwYXRjaC5iYXNlX2ZyZXEpCisJCQkJKyBiYXNlX25vdGUqMTcxKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiRnJlcSBCaWFzIGlzICVkXG4iLCBzYW1wcC0+RnJlcXVlbmN5Qmlhcyk7CisJc2FtcHAtPkxvb3A9KGd1c3BhdGNoLm1vZGUgJiBXQVZFX0xPT1BJTkcpID8gMTowOworCXNhbXBwLT5zYW1wbGVTdGFydE9mZnNldC5GcmFjdGlvbj0wOworCXNhbXBwLT5zYW1wbGVTdGFydE9mZnNldC5JbnRlZ2VyPTA7CisJc2FtcHAtPmxvb3BTdGFydE9mZnNldC5GcmFjdGlvbj0wOworCXNhbXBwLT5sb29wU3RhcnRPZmZzZXQuSW50ZWdlcj1ndXNwYXRjaC5sb29wX3N0YXJ0CisJCT4+KChndXNwYXRjaC5tb2RlJldBVkVfMTZfQklUUykgPyAxOjApOworCXNhbXBwLT5sb29wRW5kT2Zmc2V0LkZyYWN0aW9uPTA7CisJc2FtcHAtPmxvb3BFbmRPZmZzZXQuSW50ZWdlcj1ndXNwYXRjaC5sb29wX2VuZAorCQk+PigoZ3VzcGF0Y2gubW9kZSZXQVZFXzE2X0JJVFMpID8gMTowKTsKKwlzYW1wcC0+c2FtcGxlRW5kT2Zmc2V0LkZyYWN0aW9uPTA7CisJc2FtcHAtPnNhbXBsZUVuZE9mZnNldC5JbnRlZ2VyPWd1c3BhdGNoLmxlbiA+PiAoZ3VzcGF0Y2gubW9kZSYxKTsKKwlzYW1wcC0+QmlkaXJlY3Rpb25hbD0oZ3VzcGF0Y2gubW9kZSZXQVZFX0JJRElSX0xPT1ApID8gMTowOworCXNhbXBwLT5SZXZlcnNlPShndXNwYXRjaC5tb2RlJldBVkVfTE9PUF9CQUNLKSA/IDE6MDsKKworCS8qIE5vdyBzaGlwIGl0IGRvd24gKi8KKworCXdhdmVmcm9udF9zZW5kX3NhbXBsZSAoc2FtcCwKKwkJCSAgICAgICAodW5zaWduZWQgc2hvcnQgX191c2VyICopICYoYWRkcilbc2l6ZW9mX3BhdGNoXSwKKwkJCSAgICAgICAoZ3VzcGF0Y2gubW9kZSAmIFdBVkVfVU5TSUdORUQpID8gMTowKTsKKwl3YXZlZnJvbnRfc2VuZF9wYXRjaCAocGF0KTsKKwl3YXZlZnJvbnRfc2VuZF9wcm9ncmFtIChwcm9nKTsKKworCS8qIE5vdyBwYW4gYXMgYmVzdCB3ZSBjYW4gLi4uIHVzZSB0aGUgc2xhdmUvaW50ZXJuYWwgTUlESSBkZXZpY2UKKwkgICBudW1iZXIgaWYgaXQgZXhpc3RzIChzaW5jZSBpdCB0YWxrcyB0byB0aGUgV2F2ZUZyb250KSwgb3IgdGhlCisJICAgbWFzdGVyIG90aGVyd2lzZS4KKwkqLworCisJaWYgKGRldi5taWRpZGV2ID4gMCkgeworCQltaWRpX3N5bnRoX2NvbnRyb2xsZXIgKGRldi5taWRpZGV2LCBndXNwYXRjaC5pbnN0cl9ubywgMTAsCisJCQkJICAgICAgICgoZ3VzcGF0Y2gucGFubmluZyA8PCA0KSA+IDEyNykgPworCQkJCSAgICAgICAxMjcgOiAoZ3VzcGF0Y2gucGFubmluZyA8PCA0KSk7CisJfQorCXJjID0gMDsKKworZnJlZV9mYWlsOgorCWtmcmVlKHNhbXApOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X2xvYWRfcGF0Y2ggKGNvbnN0IGNoYXIgX191c2VyICphZGRyKQorCisKK3sKKwl3YXZlZnJvbnRfcGF0Y2hfaW5mbyBoZWFkZXI7CisJCisJaWYgKGNvcHlfZnJvbV91c2VyICgmaGVhZGVyLCBhZGRyLCBzaXplb2Yod2F2ZWZyb250X3BhdGNoX2luZm8pIC0KKwkJCSAgICBzaXplb2Yod2F2ZWZyb250X2FueSkpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImJhZCBhZGRyZXNzIGZvciBsb2FkIHBhdGNoLlxuIik7CisJCXJldHVybiAtRUZBVUxUOworCX0KKworCURQUklOVCAoV0ZfREVCVUdfTE9BRF9QQVRDSCwgImRvd25sb2FkICIKKwkJCQkgICAgICAiU2FtcGxlIHR5cGU6ICVkICIKKwkJCQkgICAgICAiU2FtcGxlIG51bWJlcjogJWQgIgorCQkJCSAgICAgICJTYW1wbGUgc2l6ZTogJWRcbiIsCisJCQkJICAgICAgaGVhZGVyLnN1YmtleSwKKwkJCQkgICAgICBoZWFkZXIubnVtYmVyLAorCQkJCSAgICAgIGhlYWRlci5zaXplKTsKKworCXN3aXRjaCAoaGVhZGVyLnN1YmtleSkgeworCWNhc2UgV0ZfU1RfU0FNUExFOiAgLyogc2FtcGxlIG9yIHNhbXBsZV9oZWFkZXIsIGJhc2VkIG9uIHBhdGNoLT5zaXplICovCisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCh1bnNpZ25lZCBjaGFyICopICZoZWFkZXIuaGRyLnMsCisJCQkJICAgKHVuc2lnbmVkIGNoYXIgX191c2VyICopIGhlYWRlci5oZHJwdHIsCisJCQkJICAgc2l6ZW9mICh3YXZlZnJvbnRfc2FtcGxlKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gd2F2ZWZyb250X3NlbmRfc2FtcGxlICgmaGVhZGVyLCBoZWFkZXIuZGF0YXB0ciwgMCk7CisKKwljYXNlIFdGX1NUX01VTFRJU0FNUExFOgorCisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGVhZGVyLmhkci5zLCBoZWFkZXIuaGRycHRyLAorCQkJCSAgIHNpemVvZih3YXZlZnJvbnRfbXVsdGlzYW1wbGUpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiB3YXZlZnJvbnRfc2VuZF9tdWx0aXNhbXBsZSAoJmhlYWRlcik7CisKKworCWNhc2UgV0ZfU1RfQUxJQVM6CisKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZoZWFkZXIuaGRyLmEsIGhlYWRlci5oZHJwdHIsCisJCQkJICAgc2l6ZW9mICh3YXZlZnJvbnRfYWxpYXMpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiB3YXZlZnJvbnRfc2VuZF9hbGlhcyAoJmhlYWRlcik7CisKKwljYXNlIFdGX1NUX0RSVU06CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGVhZGVyLmhkci5kLCBoZWFkZXIuaGRycHRyLAorCQkJCSAgIHNpemVvZiAod2F2ZWZyb250X2RydW0pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJldHVybiB3YXZlZnJvbnRfc2VuZF9kcnVtICgmaGVhZGVyKTsKKworCWNhc2UgV0ZfU1RfUEFUQ0g6CisJCWlmIChjb3B5X2Zyb21fdXNlcigmaGVhZGVyLmhkci5wLCBoZWFkZXIuaGRycHRyLAorCQkJCSAgIHNpemVvZiAod2F2ZWZyb250X3BhdGNoKSkpCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlyZXR1cm4gd2F2ZWZyb250X3NlbmRfcGF0Y2ggKCZoZWFkZXIpOworCisJY2FzZSBXRl9TVF9QUk9HUkFNOgorCQlpZiAoY29weV9mcm9tX3VzZXIoJmhlYWRlci5oZHIucHIsIGhlYWRlci5oZHJwdHIsCisJCQkJICAgc2l6ZW9mICh3YXZlZnJvbnRfcHJvZ3JhbSkpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcmV0dXJuIHdhdmVmcm9udF9zZW5kX3Byb2dyYW0gKCZoZWFkZXIpOworCisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ1bmtub3duIHBhdGNoIHR5cGUgJWQuXG4iLAorCQkJaGVhZGVyLnN1YmtleSk7CisJCXJldHVybiAtKEVJTlZBTCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisMCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK1dhdmVGcm9udDogL2Rldi9zZXF1ZW5jZXJ7LDJ9IGFuZCBvdGhlciBoYXJkd2FyZS1kZXBlbmRlbnQgaW50ZXJmYWNlcworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyB2b2lkCitwcm9jZXNzX3NhbXBsZV9oZHIgKFVDSEFSOCAqYnVmKQorCit7CisJd2F2ZWZyb250X3NhbXBsZSBzOworCVVDSEFSOCAqcHRyOworCisJcHRyID0gYnVmOworCisJLyogVGhlIGJvYXJkIGRvZXNuJ3Qgc2VuZCB1cyBhbiBleGFjdCBjb3B5IG9mIGEgIndhdmVmcm9udF9zYW1wbGUiCisJICAgaW4gcmVzcG9uc2UgdG8gYW4gVXBsb2FkIFNhbXBsZSBIZWFkZXIgY29tbWFuZC4gSW5zdGVhZCwgd2UgCisJICAgaGF2ZSB0byBjb252ZXJ0IHRoZSBkYXRhIGZvcm1hdCBiYWNrIGludG8gb3VyIGRhdGEgc3RydWN0dXJlLAorCSAgIGp1c3QgYXMgaW4gdGhlIERvd25sb2FkIFNhbXBsZSBjb21tYW5kLCB3aGVyZSB3ZSBoYXZlIHRvIGRvCisJICAgc29tZXRoaW5nIHZlcnkgc2ltaWxhciBpbiB0aGUgcmV2ZXJzZSBkaXJlY3Rpb24uCisJKi8KKworCSooKFVJTlQzMiAqKSAmcy5zYW1wbGVTdGFydE9mZnNldCkgPSBkZW11bmdlX2ludDMyIChwdHIsIDQpOyBwdHIgKz0gNDsKKwkqKChVSU5UMzIgKikgJnMubG9vcFN0YXJ0T2Zmc2V0KSA9IGRlbXVuZ2VfaW50MzIgKHB0ciwgNCk7IHB0ciArPSA0OworCSooKFVJTlQzMiAqKSAmcy5sb29wRW5kT2Zmc2V0KSA9IGRlbXVuZ2VfaW50MzIgKHB0ciwgNCk7IHB0ciArPSA0OworCSooKFVJTlQzMiAqKSAmcy5zYW1wbGVFbmRPZmZzZXQpID0gZGVtdW5nZV9pbnQzMiAocHRyLCA0KTsgcHRyICs9IDQ7CisJKigoVUlOVDMyICopICZzLkZyZXF1ZW5jeUJpYXMpID0gZGVtdW5nZV9pbnQzMiAocHRyLCAzKTsgcHRyICs9IDM7CisKKwlzLlNhbXBsZVJlc29sdXRpb24gPSAqcHRyICYgMHgzOworCXMuTG9vcCA9ICpwdHIgJiAweDg7CisJcy5CaWRpcmVjdGlvbmFsID0gKnB0ciAmIDB4MTA7CisJcy5SZXZlcnNlID0gKnB0ciAmIDB4NDA7CisKKwkvKiBOb3cgY29weSBpdCBiYWNrIHRvIHdoZXJlIGl0IGNhbWUgZnJvbSAqLworCisJbWVtY3B5IChidWYsICh1bnNpZ25lZCBjaGFyICopICZzLCBzaXplb2YgKHdhdmVmcm9udF9zYW1wbGUpKTsKK30KKworc3RhdGljIGludAord2F2ZWZyb250X3N5bnRoX2NvbnRyb2wgKGludCBjbWQsIHdhdmVmcm9udF9jb250cm9sICp3YykKKworeworCXVuc2lnbmVkIGNoYXIgcGF0Y2hudW1idWZbMl07CisJaW50IGk7CisKKwlEUFJJTlQgKFdGX0RFQlVHX0NNRCwgInN5bnRoIGNvbnRyb2wgd2l0aCAiCisJCSJjbWQgMHgleFxuIiwgd2MtPmNtZCk7CisKKwkvKiBQcmUtaGFuZGxpbmcgb2Ygb3IgZm9yIHZhcmlvdXMgY29tbWFuZHMgKi8KKworCXN3aXRjaCAod2MtPmNtZCkgeworCWNhc2UgV0ZDX0RJU0FCTEVfSU5URVJSVVBUUzoKKwkJcHJpbnRrIChLRVJOX0lORk8gTE9HTkFNRSAiaW50ZXJydXB0cyBkaXNhYmxlZC5cbiIpOworCQlvdXRiICgweDgwfDB4MjAsIGRldi5jb250cm9sX3BvcnQpOworCQlkZXYuaW50ZXJydXB0c19vbiA9IDA7CisJCXJldHVybiAwOworCisJY2FzZSBXRkNfRU5BQkxFX0lOVEVSUlVQVFM6CisJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUgImludGVycnVwdHMgZW5hYmxlZC5cbiIpOworCQlvdXRiICgweDgwfDB4NDB8MHgyMCwgZGV2LmNvbnRyb2xfcG9ydCk7CisJCWRldi5pbnRlcnJ1cHRzX29uID0gMTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdGQ19JTlRFUlJVUFRfU1RBVFVTOgorCQl3Yy0+cmJ1ZlswXSA9IGRldi5pbnRlcnJ1cHRzX29uOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0ZDX1JPTVNBTVBMRVNfUkRPTkxZOgorCQlkZXYucm9tX3NhbXBsZXNfcmRvbmx5ID0gd2MtPndidWZbMF07CisJCXdjLT5zdGF0dXMgPSAwOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0ZDX0lERU5USUZZX1NMT1RfVFlQRToKKwkJaSA9IHdjLT53YnVmWzBdIHwgKHdjLT53YnVmWzFdIDw8IDcpOworCQlpZiAoaSA8MCB8fCBpID49IFdGX01BWF9TQU1QTEUpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImludmFsaWQgc2xvdCBJRCAlZFxuIiwKKwkJCQlpKTsKKwkJCXdjLT5zdGF0dXMgPSBFSU5WQUw7CisJCQlyZXR1cm4gMDsKKwkJfQorCQl3Yy0+cmJ1ZlswXSA9IGRldi5zYW1wbGVfc3RhdHVzW2ldOworCQl3Yy0+c3RhdHVzID0gMDsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFdGQ19ERUJVR19EUklWRVI6CisJCWRldi5kZWJ1ZyA9IHdjLT53YnVmWzBdOworCQlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FICJkZWJ1ZyA9IDB4JXhcbiIsIGRldi5kZWJ1Zyk7CisJCXJldHVybiAwOworCisJY2FzZSBXRkNfRlhfSU9DVEw6CisJCXdmZnhfaW9jdGwgKCh3YXZlZnJvbnRfZnhfaW5mbyAqKSAmd2MtPndidWZbMF0pOworCQlyZXR1cm4gMDsKKworCWNhc2UgV0ZDX1VQTE9BRF9QQVRDSDoKKwkJbXVuZ2VfaW50MzIgKCooKFVJTlQzMiAqKSB3Yy0+d2J1ZiksIHBhdGNobnVtYnVmLCAyKTsKKwkJbWVtY3B5ICh3Yy0+d2J1ZiwgcGF0Y2hudW1idWYsIDIpOworCQlicmVhazsKKworCWNhc2UgV0ZDX1VQTE9BRF9NVUxUSVNBTVBMRToKKwkJLyogbXVsdGlzYW1wbGVzIGhhdmUgdG8gYmUgaGFuZGxlZCBkaWZmZXJlbnRseSwgYW5kCisJCSAgIGNhbm5vdCBiZSBkZWFsdCB3aXRoIHByb3Blcmx5IGJ5IHdhdmVmcm9udF9jbWQoKSBhbG9uZS4KKwkJKi8KKwkJd2MtPnN0YXR1cyA9IHdhdmVmcm9udF9mZXRjaF9tdWx0aXNhbXBsZQorCQkJKCh3YXZlZnJvbnRfcGF0Y2hfaW5mbyAqKSB3Yy0+cmJ1Zik7CisJCXJldHVybiAwOworCisJY2FzZSBXRkNfVVBMT0FEX1NBTVBMRV9BTElBUzoKKwkJcHJpbnRrIChLRVJOX0lORk8gTE9HTkFNRSAic3VwcG9ydCBmb3Igc2FtcGxlIGFsaWFzIHVwbG9hZCAiCisJCQkiYmVpbmcgY29uc2lkZXJlZC5cbiIpOworCQl3Yy0+c3RhdHVzID0gRUlOVkFMOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl3Yy0+c3RhdHVzID0gd2F2ZWZyb250X2NtZCAod2MtPmNtZCwgd2MtPnJidWYsIHdjLT53YnVmKTsKKworCS8qIFBvc3QtaGFuZGxpbmcgb2YgY2VydGFpbiBjb21tYW5kcy4KKworCSAgIEluIHBhcnRpY3VsYXIsIGlmIHRoZSBjb21tYW5kIHdhcyBhbiB1cGxvYWQsIGRlbXVuZ2UgdGhlIGRhdGEKKwkgICBzbyB0aGF0IHRoZSB1c2VyLWxldmVsIGRvZXNuJ3QgaGF2ZSB0byB0aGluayBhYm91dCBpdC4KKwkqLworCisJaWYgKHdjLT5zdGF0dXMgPT0gMCkgeworCQlzd2l0Y2ggKHdjLT5jbWQpIHsKKwkJCS8qIGludGVyY2VwdCBhbnkgZnJlZW1lbSByZXF1ZXN0cyBzbyB0aGF0IHdlIGtub3cKKwkJCSAgIHdlIGFyZSBhbHdheXMgY3VycmVudCB3aXRoIHRoZSB1c2VyLWxldmVsIHZpZXcKKwkJCSAgIG9mIHRoaW5ncy4KKwkJCSovCisKKwkJY2FzZSBXRkNfUkVQT1JUX0ZSRUVfTUVNT1JZOgorCQkJZGV2LmZyZWVtZW0gPSBkZW11bmdlX2ludDMyICh3Yy0+cmJ1ZiwgNCk7CisJCQlicmVhazsKKworCQljYXNlIFdGQ19VUExPQURfUEFUQ0g6CisJCQlkZW11bmdlX2J1ZiAod2MtPnJidWYsIHdjLT5yYnVmLCBXRl9QQVRDSF9CWVRFUyk7CisJCQlicmVhazsKKworCQljYXNlIFdGQ19VUExPQURfUFJPR1JBTToKKwkJCWRlbXVuZ2VfYnVmICh3Yy0+cmJ1Ziwgd2MtPnJidWYsIFdGX1BST0dSQU1fQllURVMpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXRkNfVVBMT0FEX0VEUlVNX1BST0dSQU06CisJCQlkZW11bmdlX2J1ZiAod2MtPnJidWYsIHdjLT5yYnVmLCBXRl9EUlVNX0JZVEVTIC0gMSk7CisJCQlicmVhazsKKworCQljYXNlIFdGQ19VUExPQURfU0FNUExFX0hFQURFUjoKKwkJCXByb2Nlc3Nfc2FtcGxlX2hkciAod2MtPnJidWYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBXRkNfVVBMT0FEX1NBTVBMRV9BTElBUzoKKwkJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUgInN1cHBvcnQgZm9yICIKKwkJCQkic2FtcGxlIGFsaWFzZXMgc3RpbGwgIgorCQkJCSJiZWluZyBjb25zaWRlcmVkLlxuIik7CisJCQlicmVhazsKKworCQljYXNlIFdGQ19WTUlESV9PRkY6CisJCQlpZiAodmlydHVhbF9taWRpX2Rpc2FibGUgKCkgPCAwKSB7CisJCQkJcmV0dXJuIC0oRUlPKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgV0ZDX1ZNSURJX09OOgorCQkJaWYgKHZpcnR1YWxfbWlkaV9lbmFibGUgKCkgPCAwKSB7CisJCQkJcmV0dXJuIC0oRUlPKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKKwwKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIFdhdmVGcm9udDogTGludXggZmlsZSBzeXN0ZW0gaW50ZXJmYWNlIChmb3IgYWNjZXNzIHZpYSByYXcgc3ludGgpICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBpbnQgCit3YXZlZnJvbnRfb3BlbiAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJLyogWFhYIGZpeCBtZSAqLworCWRldi5vcGVuZWQgPSBmaWxlLT5mX2ZsYWdzOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlsb2NrX2tlcm5lbCgpOworCWRldi5vcGVuZWQgPSAwOworCWRldi5kZWJ1ZyA9IDA7CisJdW5sb2NrX2tlcm5lbCgpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisJCXVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQoreworCXdhdmVmcm9udF9jb250cm9sIHdjOworCWludCBlcnI7CisKKwlzd2l0Y2ggKGNtZCkgeworCisJY2FzZSBXRkNUTF9XRkNNRDoKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ3YywgKHZvaWQgX191c2VyICopIGFyZywgc2l6ZW9mICh3YykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCQorCQlpZiAoKGVyciA9IHdhdmVmcm9udF9zeW50aF9jb250cm9sIChjbWQsICZ3YykpID09IDApIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIgKCh2b2lkIF9fdXNlciAqKSBhcmcsICZ3Yywgc2l6ZW9mICh3YykpKQorCQkJCXJldHVybiAtRUZBVUxUOworCQl9CisKKwkJcmV0dXJuIGVycjsKKwkJCisJY2FzZSBXRkNUTF9MT0FEX1NQUDoKKwkJcmV0dXJuIHdhdmVmcm9udF9sb2FkX3BhdGNoICgoY29uc3QgY2hhciBfX3VzZXIgKikgYXJnKTsKKwkJCisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAiaW52YWxpZCBpb2N0bCAlI3hcbiIsIGNtZCk7CisJCXJldHVybiAtKEVJTlZBTCk7CisKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyAvKmNvbnN0Ki8gc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB3YXZlZnJvbnRfZm9wcyA9IHsKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmxsc2VlawkJPSBub19sbHNlZWssCisJLmlvY3RsCQk9IHdhdmVmcm9udF9pb2N0bCwKKwkub3BlbgkJPSB3YXZlZnJvbnRfb3BlbiwKKwkucmVsZWFzZQk9IHdhdmVmcm9udF9yZWxlYXNlLAorfTsKKworDAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV2F2ZUZyb250OiBPU1MgaW5zdGFsbGF0aW9uIGFuZCBzdXBwb3J0IGludGVyZmFjZSAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWYgT1NTX1NVUFBPUlRfTEVWRUwgJiBPU1NfU1VQUE9SVF9TRVEKKworc3RhdGljIHN0cnVjdCBzeW50aF9pbmZvIHdhdmVmcm9udF9pbmZvID0KK3siVHVydGxlIEJlYWNoIFdhdmVGcm9udCIsIDAsIFNZTlRIX1RZUEVfU0FNUExFLCBTQU1QTEVfVFlQRV9XQVZFRlJPTlQsCisgMCwgMzIsIDAsIDAsIFNZTlRIX0NBUF9JTlBVVH07CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9vc3Nfb3BlbiAoaW50IGRldm5vLCBpbnQgbW9kZSkKKworeworCWRldi5vcGVuZWQgPSBtb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAord2F2ZWZyb250X29zc19jbG9zZSAoaW50IGRldm5vKQorCit7CisJZGV2Lm9wZW5lZCA9IDA7CisJZGV2LmRlYnVnID0gMDsKKwlyZXR1cm47Cit9CisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9vc3NfaW9jdGwgKGludCBkZXZubywgdW5zaWduZWQgaW50IGNtZCwgdm9pZCBfX3VzZXIgKiBhcmcpCisKK3sKKwl3YXZlZnJvbnRfY29udHJvbCB3YzsKKwlpbnQgZXJyOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIFNORENUTF9TWU5USF9JTkZPOgorCQlpZihjb3B5X3RvX3VzZXIoYXJnLCAmd2F2ZWZyb250X2luZm8sIHNpemVvZiAod2F2ZWZyb250X2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX1NFUV9SRVNFVFNBTVBMRVM6CisvLwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAiZHJpdmVyIGNhbm5vdCByZXNldCBzYW1wbGVzLlxuIik7CisJCXJldHVybiAwOyAvKiBkb24ndCBmb3JjZSBhbiBlcnJvciAqLworCisJY2FzZSBTTkRDVExfU0VRX1BFUkNNT0RFOgorCQlyZXR1cm4gMDsgLyogZG9uJ3QgZm9yY2UgYW4gZXJyb3IgKi8KKworCWNhc2UgU05EQ1RMX1NZTlRIX01FTUFWTDoKKwkJaWYgKChkZXYuZnJlZW1lbSA9IHdhdmVmcm9udF9mcmVlbWVtICgpKSA8IDApIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiY2Fubm90IGdldCBtZW1vcnkgc2l6ZVxuIik7CisJCQlyZXR1cm4gLUVJTzsKKwkJfSBlbHNlIHsKKwkJCXJldHVybiBkZXYuZnJlZW1lbTsKKwkJfQorCQlicmVhazsKKworCWNhc2UgU05EQ1RMX1NZTlRIX0NPTlRST0w6CisJCWlmKGNvcHlfZnJvbV91c2VyICgmd2MsIGFyZywgc2l6ZW9mICh3YykpKQorCQkJZXJyID0gLUVGQVVMVDsKKwkJZWxzZSBpZiAoKGVyciA9IHdhdmVmcm9udF9zeW50aF9jb250cm9sIChjbWQsICZ3YykpID09IDApIHsKKwkJCWlmKGNvcHlfdG9fdXNlciAoYXJnLCAmd2MsIHNpemVvZiAod2MpKSkKKwkJCQllcnIgPSAtRUZBVUxUOworCQl9CisKKwkJcmV0dXJuIGVycjsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtKEVJTlZBTCk7CisJfQorfQorCitzdGF0aWMgaW50Cit3YXZlZnJvbnRfb3NzX2xvYWRfcGF0Y2ggKGludCBkZXZubywgaW50IGZvcm1hdCwgY29uc3QgY2hhciBfX3VzZXIgKmFkZHIsCisJCQkgIGludCBvZmZzLCBpbnQgY291bnQsIGludCBwbWdyX2ZsYWcpCit7CisKKwlpZiAoZm9ybWF0ID09IFNZU0VYX1BBVENIKSB7CS8qIEhhbmRsZWQgYnkgbWlkaV9zeW50aC5jICovCisJCWlmIChtaWRpX2xvYWRfcGF0Y2ggPT0gTlVMTCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FCisJCQkJIlNZU0VYIG5vdCBsb2FkYWJsZTogIgorCQkJCSJubyBtaWRpIHBhdGNoIGxvYWRlciFcbiIpOworCQkJcmV0dXJuIC0oRUlOVkFMKTsKKwkJfQorCisJCXJldHVybiBtaWRpX2xvYWRfcGF0Y2ggKGRldm5vLCBmb3JtYXQsIGFkZHIsCisJCQkJCW9mZnMsIGNvdW50LCBwbWdyX2ZsYWcpOworCisJfSBlbHNlIGlmIChmb3JtYXQgPT0gR1VTX1BBVENIKSB7CisJCXJldHVybiB3YXZlZnJvbnRfbG9hZF9ndXNfcGF0Y2ggKGRldm5vLCBmb3JtYXQsCisJCQkJCQkgYWRkciwgb2ZmcywgY291bnQsIHBtZ3JfZmxhZyk7CisKKwl9IGVsc2UgaWYgKGZvcm1hdCAhPSBXQVZFRlJPTlRfUEFUQ0gpIHsKKwkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ1bmtub3duIHBhdGNoIGZvcm1hdCAlZFxuIiwgZm9ybWF0KTsKKwkJcmV0dXJuIC0oRUlOVkFMKTsKKwl9CisKKwlpZiAoY291bnQgPCBzaXplb2YgKHdhdmVmcm9udF9wYXRjaF9pbmZvKSkgeworCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgInNhbXBsZSBoZWFkZXIgdG9vIHNob3J0XG4iKTsKKwkJcmV0dXJuIC0oRUlOVkFMKTsKKwl9CisKKwkvKiAiYWRkciIgcG9pbnRzIHRvIGEgdXNlci1zcGFjZSB3YXZlZnJvbnRfcGF0Y2hfaW5mbyAqLworCisJcmV0dXJuIHdhdmVmcm9udF9sb2FkX3BhdGNoIChhZGRyKTsKK30JCisKK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucyB3YXZlZnJvbnRfb3BlcmF0aW9ucyA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pZAkJPSAiV2F2ZUZyb250IiwKKwkuaW5mbwkJPSAmd2F2ZWZyb250X2luZm8sCisJLm1pZGlfZGV2CT0gMCwKKwkuc3ludGhfdHlwZQk9IFNZTlRIX1RZUEVfU0FNUExFLAorCS5zeW50aF9zdWJ0eXBlCT0gU0FNUExFX1RZUEVfV0FWRUZST05ULAorCS5vcGVuCQk9IHdhdmVmcm9udF9vc3Nfb3BlbiwKKwkuY2xvc2UJCT0gd2F2ZWZyb250X29zc19jbG9zZSwKKwkuaW9jdGwJCT0gd2F2ZWZyb250X29zc19pb2N0bCwKKwkua2lsbF9ub3RlCT0gbWlkaV9zeW50aF9raWxsX25vdGUsCisJLnN0YXJ0X25vdGUJPSBtaWRpX3N5bnRoX3N0YXJ0X25vdGUsCisJLnNldF9pbnN0cgk9IG1pZGlfc3ludGhfc2V0X2luc3RyLAorCS5yZXNldAkJPSBtaWRpX3N5bnRoX3Jlc2V0LAorCS5sb2FkX3BhdGNoCT0gbWlkaV9zeW50aF9sb2FkX3BhdGNoLAorCS5hZnRlcnRvdWNoCT0gbWlkaV9zeW50aF9hZnRlcnRvdWNoLAorCS5jb250cm9sbGVyCT0gbWlkaV9zeW50aF9jb250cm9sbGVyLAorCS5wYW5uaW5nCT0gbWlkaV9zeW50aF9wYW5uaW5nLAorCS5iZW5kZXIJCT0gbWlkaV9zeW50aF9iZW5kZXIsCisJLnNldHVwX3ZvaWNlCT0gbWlkaV9zeW50aF9zZXR1cF92b2ljZQorfTsKKyNlbmRpZiAvKiBPU1NfU1VQUE9SVF9TRVEgKi8KKworI2lmIE9TU19TVVBQT1JUX0xFVkVMICYgT1NTX1NVUFBPUlRfU1RBVElDX0lOU1RBTEwKKworc3RhdGljIHZvaWQgX19pbml0IGF0dGFjaF93YXZlZnJvbnQgKHN0cnVjdCBhZGRyZXNzX2luZm8gKmh3X2NvbmZpZykKK3sKKyAgICAodm9pZCkgaW5zdGFsbF93YXZlZnJvbnQgKCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IHByb2JlX3dhdmVmcm9udCAoc3RydWN0IGFkZHJlc3NfaW5mbyAqaHdfY29uZmlnKQoreworICAgIHJldHVybiAhZGV0ZWN0X3dhdmVmcm9udCAoaHdfY29uZmlnLT5pcnEsIGh3X2NvbmZpZy0+aW9fYmFzZSk7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmxvYWRfd2F2ZWZyb250IChzdHJ1Y3QgYWRkcmVzc19pbmZvICpod19jb25maWcpIAoreworICAgICh2b2lkKSB1bmluc3RhbGxfd2F2ZWZyb250ICgpOworfQorCisjZW5kaWYgLyogT1NTX1NVUFBPUlRfU1RBVElDX0lOU1RBTEwgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogV2F2ZUZyb250OiBMaW51eCBtb2R1bGFyIHNvdW5kIGtlcm5lbCBpbnN0YWxsYXRpb24gaW50ZXJmYWNlICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgaXJxcmV0dXJuX3QKK3dhdmVmcm9udGludHIoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqZHVtbXkpCit7CisJc3RydWN0IHdmX2NvbmZpZyAqaHcgPSBkZXZfaWQ7CisKKwkvKgorCSAgIFNvbWUgY29tbWVudHMgb24gaW50ZXJydXB0cy4gSSBhdHRlbXB0ZWQgYSB2ZXJzaW9uIG9mIHRoaXMKKwkgICBkcml2ZXIgdGhhdCB1c2VkIGludGVycnVwdHMgdGhyb3VnaG91dCB0aGUgY29kZSBpbnN0ZWFkIG9mCisJICAgZG9pbmcgYnVzeSBhbmQvb3Igc2xlZXAtd2FpdGluZy4gQWxhcywgaXQgYXBwZWFycyB0aGF0IG9uY2UKKwkgICB0aGUgTW90b3JvbGEgZmlybXdhcmUgaXMgZG93bmxvYWRlZCwgdGhlIGNhcmQgKm5ldmVyKgorCSAgIGdlbmVyYXRlcyBhbiBSWCBpbnRlcnJ1cHQuIFRoZXNlIGFyZSBzdWNjZXNzZnVsbHkgZ2VuZXJhdGVkCisJICAgZHVyaW5nIGZpcm13YXJlIGxvYWRpbmcsIGFuZCBhZnRlciB0aGF0IHdhdmVmcm9udF9zdGF0dXMoKQorCSAgIHJlcG9ydHMgdGhhdCBhbiBpbnRlcnJ1cHQgaXMgcGVuZGluZyBvbiB0aGUgY2FyZCBmcm9tIHRpbWUKKwkgICB0byB0aW1lLCBidXQgaXQgbmV2ZXIgc2VlbXMgdG8gYmUgZGVsaXZlcmVkIHRvIHRoaXMKKwkgICBkcml2ZXIuIE5vdGUgYWxzbyB0aGF0IHdhdmVmcm9udF9zdGF0dXMoKSBjb250aW51ZXMgdG8KKwkgICByZXBvcnQgdGhhdCBSWCBpbnRlcnJ1cHRzIGFyZSBlbmFibGVkLCBzdWdnZXN0aW5nIHRoYXQgSQorCSAgIGRpZG4ndCBnb29mIHVwIGFuZCBkaXNhYmxlIHRoZW0gYnkgbWlzdGFrZS4KKworCSAgIFRodXMsIEkgc3RlcHBlZCBiYWNrIHRvIGEgcHJpb3IgdmVyc2lvbiBvZgorCSAgIHdhdmVmcm9udF93YWl0KCksIHRoZSBvbmx5IHBsYWNlIHdoZXJlIHRoaXMgcmVhbGx5CisJICAgbWF0dGVycy4gSXRzIHNhZCwgYnV0IEkndmUgbG9va2VkIHRocm91Z2ggdGhlIGNvZGUgdG8gY2hlY2sKKwkgICBvbiB0aGluZ3MsIGFuZCBJIHJlYWxseSBmZWVsIGNlcnRhaW4gdGhhdCB0aGUgTW90b3JvbGEKKwkgICBmaXJtd2FyZSBwcmV2ZW50cyBSWC1yZWFkeSBpbnRlcnJ1cHRzLgorCSovCisKKwlpZiAoKHdhdmVmcm9udF9zdGF0dXMoKSAmIChTVEFUX0lOVFJfUkVBRHxTVEFUX0lOVFJfV1JJVEUpKSA9PSAwKSB7CisJCXJldHVybiBJUlFfTk9ORTsKKwl9CisKKwlody0+aXJxX29rID0gMTsKKwlody0+aXJxX2NudCsrOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSAoJmh3LT5pbnRlcnJ1cHRfc2xlZXBlcik7CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiBTVEFUVVMgUkVHSVNURVIgCisKKzAgSG9zdCBSeCBJbnRlcnJ1cHQgRW5hYmxlICgxPUVuYWJsZWQpCisxIEhvc3QgUnggUmVnaXN0ZXIgRnVsbCAoMT1GdWxsKQorMiBIb3N0IFJ4IEludGVycnVwdCBQZW5kaW5nICgxPUludGVycnVwdCkKKzMgVW51c2VkCis0IEhvc3QgVHggSW50ZXJydXB0ICgxPUVuYWJsZWQpCis1IEhvc3QgVHggUmVnaXN0ZXIgZW1wdHkgKDE9RW1wdHkpCis2IEhvc3QgVHggSW50ZXJydXB0IFBlbmRpbmcgKDE9SW50ZXJydXB0KQorNyBVbnVzZWQKKyovCisKK3N0YXRpYyBpbnQKK3dhdmVmcm9udF9pbnRlcnJ1cHRfYml0cyAoaW50IGlycSkKKworeworCWludCBiaXRzOworCisJc3dpdGNoIChpcnEpIHsKKwljYXNlIDk6CisJCWJpdHMgPSAweDAwOworCQlicmVhazsKKwljYXNlIDU6CisJCWJpdHMgPSAweDA4OworCQlicmVhazsKKwljYXNlIDEyOgorCQliaXRzID0gMHgxMDsKKwkJYnJlYWs7CisJY2FzZSAxNToKKwkJYml0cyA9IDB4MTg7CisJCWJyZWFrOworCQorCWRlZmF1bHQ6CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImludmFsaWQgSVJRICVkXG4iLCBpcnEpOworCQliaXRzID0gLTE7CisJfQorCisJcmV0dXJuIGJpdHM7Cit9CisKK3N0YXRpYyB2b2lkCit3YXZlZnJvbnRfc2hvdWxkX2NhdXNlX2ludGVycnVwdCAoaW50IHZhbCwgaW50IHBvcnQsIGludCB0aW1lb3V0KQorCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIHRoaXMgd2lsbCBub3QgaGVscCBvbiBTTVAgLSBidXQgYXQgbGVhc3QgaXQgY29tcGlsZXMgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jaywgZmxhZ3MpOworCWRldi5pcnFfb2sgPSAwOworCW91dGIgKHZhbCxwb3J0KTsKKwlpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQgKCZkZXYuaW50ZXJydXB0X3NsZWVwZXIsIHRpbWVvdXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworfQorCitzdGF0aWMgaW50IF9faW5pdCB3YXZlZnJvbnRfaHdfcmVzZXQgKHZvaWQpCit7CisJaW50IGJpdHM7CisJaW50IGh3dlsyXTsKKwl1bnNpZ25lZCBsb25nIGlycV9tYXNrOworCXNob3J0IHJlcG9ydGVkX2lycTsKKworCS8qIElSUSBhbHJlYWR5IGNoZWNrZWQgaW4gaW5pdF9tb2R1bGUoKSAqLworCisJYml0cyA9IHdhdmVmcm9udF9pbnRlcnJ1cHRfYml0cyAoZGV2LmlycSk7CisKKwlwcmludGsgKEtFUk5fREVCVUcgTE9HTkFNRSAiYXV0b2RldGVjdGluZyBXYXZlRnJvbnQgSVJRXG4iKTsKKworCWlycV9tYXNrID0gcHJvYmVfaXJxX29uICgpOworCisJb3V0YiAoMHgwLCBkZXYuY29udHJvbF9wb3J0KTsgCisJb3V0YiAoMHg4MCB8IDB4NDAgfCBiaXRzLCBkZXYuZGF0YV9wb3J0KTsJCisJd2F2ZWZyb250X3Nob3VsZF9jYXVzZV9pbnRlcnJ1cHQoMHg4MHwweDQwfDB4MTB8MHgxLAorCQkJCQkgZGV2LmNvbnRyb2xfcG9ydCwKKwkJCQkJIChyZXNldF90aW1lKkhaKS8xMDApOworCisJcmVwb3J0ZWRfaXJxID0gcHJvYmVfaXJxX29mZiAoaXJxX21hc2spOworCisJaWYgKHJlcG9ydGVkX2lycSAhPSBkZXYuaXJxKSB7CisJCWlmIChyZXBvcnRlZF9pcnEgPT0gMCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FCisJCQkJIk5vIHVuYXNzaWduZWQgaW50ZXJydXB0cyBkZXRlY3RlZCAiCisJCQkJImFmdGVyIGgvdyByZXNldFxuIik7CisJCX0gZWxzZSBpZiAocmVwb3J0ZWRfaXJxIDwgMCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FCisJCQkJIk11bHRpcGxlIHVuYXNzaWduZWQgaW50ZXJydXB0cyBkZXRlY3RlZCAiCisJCQkJImFmdGVyIGgvdyByZXNldFxuIik7CisJCX0gZWxzZSB7CisJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgImF1dG9kZXRlY3RlZCBJUlEgJWQgbm90IHRoZSAiCisJCQkJInZhbHVlIHByb3ZpZGVkICglZClcbiIsIHJlcG9ydGVkX2lycSwKKwkJCQlkZXYuaXJxKTsKKwkJfQorCQlkZXYuaXJxID0gLTE7CisJCXJldHVybiAxOworCX0gZWxzZSB7CisJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUgImF1dG9kZXRlY3RlZCBJUlEgYXQgJWRcbiIsCisJCQlyZXBvcnRlZF9pcnEpOworCX0KKworCWlmIChyZXF1ZXN0X2lycSAoZGV2LmlycSwgd2F2ZWZyb250aW50ciwKKwkJCSBTQV9JTlRFUlJVUFR8U0FfU0hJUlEsCisJCQkgIndhdmVmcm9udCBzeW50aCIsICZkZXYpIDwgMCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJJUlEgJWQgbm90IGF2YWlsYWJsZSFcbiIsCisJCQlkZXYuaXJxKTsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogdHJ5IHJlc2V0IG9mIHBvcnQgKi8KKyAgICAgIAorCW91dGIgKDB4MCwgZGV2LmNvbnRyb2xfcG9ydCk7IAorICAKKwkvKiBBdCB0aGlzIHBvaW50LCB0aGUgYm9hcmQgaXMgaW4gcmVzZXQsIGFuZCB0aGUgSC9XIGluaXRpYWxpemF0aW9uCisJICAgcmVnaXN0ZXIgaXMgYWNjZXNzZWQgYXQgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgZGF0YSBwb3J0LgorICAgICAKKwkgICBCaXQgNyAtIEVuYWJsZSBJUlEgRHJpdmVyCQorCSAgIDAgLSBUcmktc3RhdGUgdGhlIFdhdmUtQm9hcmQgZHJpdmVycyBmb3IgdGhlIFBDIEJ1cyBJUlFzCisJICAgMSAtIEVuYWJsZSBJUlEgc2VsZWN0ZWQgYnkgYml0cyA1OjMgdG8gYmUgZHJpdmVuIG9udG8gdGhlIFBDIEJ1cy4KKyAgICAgCisJICAgQml0IDYgLSBNSURJIEludGVyZmFjZSBTZWxlY3QKKworCSAgIDAgLSBVc2UgdGhlIE1JREkgSW5wdXQgZnJvbSB0aGUgMjYtcGluIFdhdmVCbGFzdGVyCisJICAgY29tcGF0aWJsZSBoZWFkZXIgYXMgdGhlIHNlcmlhbCBNSURJIHNvdXJjZQorCSAgIDEgLSBVc2UgdGhlIE1JREkgSW5wdXQgZnJvbSB0aGUgOS1waW4gRCBjb25uZWN0b3IgYXMgdGhlCisJICAgc2VyaWFsIE1JREkgc291cmNlLgorICAgICAKKwkgICBCaXRzIDU6MyAtIElSUSBTZWxlY3Rpb24KKwkgICAwIDAgMCAtIElSUSAyLzkKKwkgICAwIDAgMSAtIElSUSA1CisJICAgMCAxIDAgLSBJUlEgMTIKKwkgICAwIDEgMSAtIElSUSAxNQorCSAgIDEgMCAwIC0gUmVzZXJ2ZWQKKwkgICAxIDAgMSAtIFJlc2VydmVkCisJICAgMSAxIDAgLSBSZXNlcnZlZAorCSAgIDEgMSAxIC0gUmVzZXJ2ZWQKKyAgICAgCisJICAgQml0cyAyOjEgLSBSZXNlcnZlZAorCSAgIEJpdCAwIC0gRGlzYWJsZSBCb290IFJPTQorCSAgIDAgLSBtZW1vcnkgYWNjZXNzZXMgdG8gMDNGQzMwLTAzRkZGRkggdXRpbGl6ZSB0aGUgaW50ZXJuYWwgQm9vdCBST00KKwkgICAxIC0gbWVtb3J5IGFjY2Vzc2VzIHRvIDAzRkMzMC0wM0ZGRkZIIGFyZSBkaXJlY3RlZCB0byBleHRlcm5hbCAKKwkgICBzdG9yYWdlLgorICAgICAKKwkqLworCisJLyogY29uZmlndXJlIGhhcmR3YXJlOiBJUlEsIGVuYWJsZSBpbnRlcnJ1cHRzLCAKKwkgICBwbHVzIGV4dGVybmFsIDktcGluIE1JREkgaW50ZXJmYWNlIHNlbGVjdGVkCisJKi8KKworCW91dGIgKDB4ODAgfCAweDQwIHwgYml0cywgZGV2LmRhdGFfcG9ydCk7CQorICAKKwkvKiBDT05UUk9MIFJFR0lTVEVSCisKKwkgICAwIEhvc3QgUnggSW50ZXJydXB0IEVuYWJsZSAoMT1FbmFibGVkKSAgICAgIDB4MQorCSAgIDEgVW51c2VkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCisJICAgMiBVbnVzZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKKwkgICAzIFVudXNlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4OAorCSAgIDQgSG9zdCBUeCBJbnRlcnJ1cHQgRW5hYmxlICAgICAgICAgICAgICAgICAweDEwCisJICAgNSBNdXRlICgwPU11dGU7IDE9UGxheSkgICAgICAgICAgICAgICAgICAgIDB4MjAKKwkgICA2IE1hc3RlciBJbnRlcnJ1cHQgRW5hYmxlICgxPUVuYWJsZWQpICAgICAgMHg0MAorCSAgIDcgTWFzdGVyIFJlc2V0ICgwPVJlc2V0OyAxPVJ1bikgICAgICAgICAgICAweDgwCisKKwkgICBUYWtlIHVzIG91dCBvZiByZXNldCwgbXV0ZSBvdXRwdXQsIG1hc3RlciArIFRYICsgUlggaW50ZXJydXB0cyBvbi4KKwkgICAKKwkgICBXZSdsbCBnZXQgYW4gaW50ZXJydXB0IHByZXN1bWFibHkgdG8gdGVsbCB1cyB0aGF0IHRoZSBUWAorCSAgIHJlZ2lzdGVyIGlzIGNsZWFyLgorCSovCisKKwl3YXZlZnJvbnRfc2hvdWxkX2NhdXNlX2ludGVycnVwdCgweDgwfDB4NDB8MHgxMHwweDEsCisJCQkJCSBkZXYuY29udHJvbF9wb3J0LAorCQkJCQkgKHJlc2V0X3RpbWUqSFopLzEwMCk7CisKKwkvKiBOb3RlOiBkYXRhIHBvcnQgaXMgbm93IHRoZSBkYXRhIHBvcnQsIG5vdCB0aGUgaC93IGluaXRpYWxpemF0aW9uCisJICAgcG9ydC4KKwkgKi8KKworCWlmICghZGV2LmlycV9vaykgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FCisJCQkiaW50ciBub3QgcmVjZWl2ZWQgYWZ0ZXIgaC93IHVuLXJlc2V0LlxuIik7CisJCWdvdG8gZ29uZV9iYWQ7CisJfSAKKworCWRldi5pbnRlcnJ1cHRzX29uID0gMTsKKwkKKwkvKiBOb3RlOiBkYXRhIHBvcnQgaXMgbm93IHRoZSBkYXRhIHBvcnQsIG5vdCB0aGUgaC93IGluaXRpYWxpemF0aW9uCisJICAgcG9ydC4KKworCSAgIEF0IHRoaXMgcG9pbnQsIG9ubHkgIkhXIFZFUlNJT04iIG9yICJET1dOTE9BRCBPUyIgY29tbWFuZHMKKwkgICB3aWxsIHdvcmsuIFNvLCBpc3N1ZSBvbmUgb2YgdGhlbSwgYW5kIHdhaXQgZm9yIFRYCisJICAgaW50ZXJydXB0LiBUaGlzIGNhbiB0YWtlIGEgKmxvbmcqIHRpbWUgYWZ0ZXIgYSBjb2xkIGJvb3QsCisJICAgd2hpbGUgdGhlIElTQyBST00gZG9lcyBpdHMgUkFNIHRlc3QuIFRoZSBTREsgc2F5cyB1cCB0byA0CisJICAgc2Vjb25kcyAtIHdpdGggMTJNQiBvZiBSQU0gb24gYSBUcm9wZXorLCBpdCB0YWtlcyBhIGxvdAorCSAgIGxvbmdlciB0aGFuIHRoYXQgKH4xNnNlY3MpLiBOb3RlIHRoYXQgdGhlIGNhcmQgdW5kZXJzdGFuZHMKKwkgICB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGEgd2FybSBhbmQgYSBjb2xkIGJvb3QsIHNvCisJICAgc3Vic2VxdWVudCBJU0MyMTE1IHJlYm9vdHMgKHNheSwgY2F1c2VkIGJ5IG1vZHVsZQorCSAgIHJlbG9hZGluZykgd2lsbCBnZXQgdGhyb3VnaCB0aGlzIG11Y2ggZmFzdGVyLgorCisJICAgWFhYIEludGVyZXN0aW5nIHF1ZXN0aW9uOiB3aHkgaXMgbm8gUlggaW50ZXJydXB0IHJlY2VpdmVkIGZpcnN0ID8KKwkqLworCisJd2F2ZWZyb250X3Nob3VsZF9jYXVzZV9pbnRlcnJ1cHQoV0ZDX0hBUkRXQVJFX1ZFUlNJT04sIAorCQkJCQkgZGV2LmRhdGFfcG9ydCwgcmFtY2hlY2tfdGltZSpIWik7CisKKwlpZiAoIWRldi5pcnFfb2spIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJInBvc3QtUkFNLWNoZWNrIGludGVycnVwdCBub3QgcmVjZWl2ZWQuXG4iKTsKKwkJZ290byBnb25lX2JhZDsKKwl9IAorCisJaWYgKCF3YXZlZnJvbnRfd2FpdCAoU1RBVF9DQU5fUkVBRCkpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJIm5vIHJlc3BvbnNlIHRvIEhXIHZlcnNpb24gY21kLlxuIik7CisJCWdvdG8gZ29uZV9iYWQ7CisJfQorCQorCWlmICgoaHd2WzBdID0gd2F2ZWZyb250X3JlYWQgKCkpID09IC0xKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUKKwkJCSJib2FyZCBub3QgcmVzcG9uZGluZyBjb3JyZWN0bHkuXG4iKTsKKwkJZ290byBnb25lX2JhZDsKKwl9CisKKwlpZiAoaHd2WzBdID09IDB4RkYpIHsgLyogTkFLICovCisKKwkJLyogQm9hcmQncyBSQU0gdGVzdCBmYWlsZWQuIFRyeSB0byByZWFkIGVycm9yIGNvZGUsCisJCSAgIGFuZCB0ZWxsIHVzIGFib3V0IGl0IGVpdGhlciB3YXkuCisJCSovCisJCQorCQlpZiAoKGh3dlswXSA9IHdhdmVmcm9udF9yZWFkICgpKSA9PSAtMSkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAib24tYm9hcmQgUkFNIHRlc3QgZmFpbGVkICIKKwkJCQkiKGJhZCBlcnJvciBjb2RlKS5cbiIpOworCQl9IGVsc2UgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAib24tYm9hcmQgUkFNIHRlc3QgZmFpbGVkICIKKwkJCQkiKGVycm9yIGNvZGU6IDB4JXgpLlxuIiwKKwkJCQlod3ZbMF0pOworCQl9CisJCWdvdG8gZ29uZV9iYWQ7CisJfQorCisJLyogV2UncmUgT0ssIGp1c3QgZ2V0IHRoZSBuZXh0IGJ5dGUgb2YgdGhlIEhXIHZlcnNpb24gcmVzcG9uc2UgKi8KKworCWlmICgoaHd2WzFdID0gd2F2ZWZyb250X3JlYWQgKCkpID09IC0xKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImluY29ycmVjdCBoL3cgcmVzcG9uc2UuXG4iKTsKKwkJZ290byBnb25lX2JhZDsKKwl9CisKKwlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FICJoYXJkd2FyZSB2ZXJzaW9uICVkLiVkXG4iLAorCQlod3ZbMF0sIGh3dlsxXSk7CisKKwlyZXR1cm4gMDsKKworCisgICAgIGdvbmVfYmFkOgorCWlmIChkZXYuaXJxID49IDApIHsKKwkJZnJlZV9pcnEgKGRldi5pcnEsICZkZXYpOworCQlkZXYuaXJxID0gLTE7CisJfQorCXJldHVybiAoMSk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGRldGVjdF93YXZlZnJvbnQgKGludCBpcnEsIGludCBpb19iYXNlKQoreworCXVuc2lnbmVkIGNoYXIgICByYnVmWzRdLCB3YnVmWzRdOworCisJLyogVEIgZG9jcyBzYXkgdGhlIGRldmljZSB0YWtlcyB1cCA4IHBvcnRzLCBidXQgd2Uga25vdyB0aGF0CisJICAgaWYgdGhlcmUgaXMgYW4gRlggZGV2aWNlIHByZXNlbnQgKGkuZS4gYSBUcm9wZXorKSBpdCByZWFsbHkKKwkgICBjb25zdW1lcyAxNi4KKwkqLworCisJaWYgKGNoZWNrX3JlZ2lvbiAoaW9fYmFzZSwgMTYpKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiSU8gYWRkcmVzcyByYW5nZSAweCV4IC0gMHgleCAiCisJCQkiYWxyZWFkeSBpbiB1c2UgLSBpZ25vcmVkXG4iLCBkZXYuYmFzZSwKKwkJCWRldi5iYXNlKzE1KTsKKwkJcmV0dXJuIC0xOworCX0KKyAgCisJZGV2LmlycSA9IGlycTsKKwlkZXYuYmFzZSA9IGlvX2Jhc2U7CisJZGV2LmlzcmF3ID0gMDsKKwlkZXYuZGVidWcgPSBkZWJ1Z19kZWZhdWx0OworCWRldi5pbnRlcnJ1cHRzX29uID0gMDsKKwlkZXYuaXJxX2NudCA9IDA7CisJZGV2LnJvbV9zYW1wbGVzX3Jkb25seSA9IDE7IC8qIFhYWCBkZWZhdWx0IGxvY2sgb24gUk9NIHNhbXBsZSBzbG90cyAqLworCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19GSVJNV0FSRV9WRVJTSU9OLCByYnVmLCB3YnVmKSA9PSAwKSB7CisKKwkJZGV2LmZ3X3ZlcnNpb25bMF0gPSByYnVmWzBdOworCQlkZXYuZndfdmVyc2lvblsxXSA9IHJidWZbMV07CisJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUKKwkJCSJmaXJtd2FyZSAlZC4lZCBhbHJlYWR5IGxvYWRlZC5cbiIsCisJCQlyYnVmWzBdLCByYnVmWzFdKTsKKworCQkvKiBjaGVjayB0aGF0IGEgY29tbWFuZCBhY3R1YWxseSB3b3JrcyAqLworICAgICAgCisJCWlmICh3YXZlZnJvbnRfY21kIChXRkNfSEFSRFdBUkVfVkVSU0lPTiwKKwkJCQkgICByYnVmLCB3YnVmKSA9PSAwKSB7CisJCQlkZXYuaHdfdmVyc2lvblswXSA9IHJidWZbMF07CisJCQlkZXYuaHdfdmVyc2lvblsxXSA9IHJidWZbMV07CisJCX0gZWxzZSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJub3QgcmF3LCBidXQgbm8gIgorCQkJCSJoYXJkd2FyZSB2ZXJzaW9uIVxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICghd2ZfcmF3KSB7CisJCQlyZXR1cm4gMTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUKKwkJCQkicmVsb2FkaW5nIGZpcm13YXJlIGFueXdheS5cbiIpOworCQkJZGV2LmlzcmF3ID0gMTsKKwkJfQorCisJfSBlbHNlIHsKKworCQlkZXYuaXNyYXcgPSAxOworCQlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FCisJCQkibm8gcmVzcG9uc2UgdG8gZmlybXdhcmUgcHJvYmUsIGFzc3VtZSByYXcuXG4iKTsKKworCX0KKworCWluaXRfd2FpdHF1ZXVlX2hlYWQgKCZkZXYuaW50ZXJydXB0X3NsZWVwZXIpOworCisJaWYgKHdhdmVmcm9udF9od19yZXNldCAoKSkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJoYXJkd2FyZSByZXNldCBmYWlsZWRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBDaGVjayBmb3IgRlggZGV2aWNlLCBwcmVzZW50IG9ubHkgb24gVHJvcGV6KyAqLworCisJZGV2Lmhhc19meCA9IChkZXRlY3Rfd2ZmeCAoKSA9PSAwKTsKKworCXJldHVybiAxOworfQorCisjaW5jbHVkZSAib3MuaCIKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKworc3RhdGljIGludAord2F2ZWZyb250X2Rvd25sb2FkX2Zpcm13YXJlIChjaGFyICpwYXRoKQorCit7CisJdW5zaWduZWQgY2hhciBzZWN0aW9uW1dGX1NFQ1RJT05fTUFYXTsKKwljaGFyIHNlY3Rpb25fbGVuZ3RoOyAvKiB5ZXMsIGp1c3QgYSBjaGFyOyBtYXggdmFsdWUgaXMgV0ZfU0VDVElPTl9NQVggKi8KKwlpbnQgc2VjdGlvbl9jbnRfZG93bmxvYWRlZCA9IDA7CisJaW50IGZkOworCWludCBjOworCWludCBpOworCW1tX3NlZ21lbnRfdCBmczsKKworCS8qIFRoaXMgdHJpZXMgdG8gYmUgYSBiaXQgY2xldmVyZXIgdGhhbiB0aGUgc3R1ZmYgQWxhbiBDb3ggZGlkIGZvcgorCSAgIHRoZSBnZW5lcmljIHNvdW5kIGZpcm13YXJlLCBpbiB0aGF0IGl0IGFjdHVhbGx5IGtub3dzCisJICAgc29tZXRoaW5nIGFib3V0IHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIE1vdG9yb2xhIGZpcm13YXJlLiBJbgorCSAgIHBhcnRpY3VsYXIsIGl0IHVzZXMgYSB2ZXJzaW9uIHRoYXQgaGFzIGJlZW4gc3RyaXBwZWQgb2YgdGhlCisJICAgMjBLIG9mIHVzZWxlc3MgaGVhZGVyIGluZm9ybWF0aW9uLCBhbmQgaGFkIHNlY3Rpb24gbGVuZ3RocworCSAgIGFkZGVkLCBtYWtpbmcgaXQgcG9zc2libGUgdG8gbG9hZCB0aGUgZW50aXJlIE9TIHdpdGhvdXQgYW55CisJICAgW2t2XW1hbGxvYygpIGFjdGl2aXR5LCBzaW5jZSB0aGUgbG9uZ2VzdCBlbnRpdHkgd2UgZXZlciByZWFkIGlzCisJICAgNDIgYnl0ZXMgKHdlbGwsIFdGX1NFQ1RJT05fTUFYKSBsb25nLgorCSovCisKKwlmcyA9IGdldF9mcygpOworCXNldF9mcyAoZ2V0X2RzKCkpOworCisJaWYgKChmZCA9IHN5c19vcGVuIChwYXRoLCAwLCAwKSkgPCAwKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgIlVuYWJsZSB0byBsb2FkIFwiJXNcIi5cbiIsCisJCQlwYXRoKTsKKwkJcmV0dXJuIDE7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaW50IHg7CisKKwkJaWYgKCh4ID0gc3lzX3JlYWQgKGZkLCAmc2VjdGlvbl9sZW5ndGgsIHNpemVvZiAoc2VjdGlvbl9sZW5ndGgpKSkgIT0KKwkJICAgIHNpemVvZiAoc2VjdGlvbl9sZW5ndGgpKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgImZpcm13YXJlIHJlYWQgZXJyb3IuXG4iKTsKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfQorCisJCWlmIChzZWN0aW9uX2xlbmd0aCA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzeXNfcmVhZCAoZmQsIHNlY3Rpb24sIHNlY3Rpb25fbGVuZ3RoKSAhPSBzZWN0aW9uX2xlbmd0aCkgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJmaXJtd2FyZSBzZWN0aW9uICIKKwkJCQkicmVhZCBlcnJvci5cbiIpOworCQkJZ290byBmYWlsdXJlOworCQl9CisKKwkJLyogU2VuZCBjb21tYW5kICovCisJCisJCWlmICh3YXZlZnJvbnRfd3JpdGUgKFdGQ19ET1dOTE9BRF9PUykpIHsKKwkJCWdvdG8gZmFpbHVyZTsKKwkJfQorCQorCQlmb3IgKGkgPSAwOyBpIDwgc2VjdGlvbl9sZW5ndGg7IGkrKykgeworCQkJaWYgKHdhdmVmcm9udF93cml0ZSAoc2VjdGlvbltpXSkpIHsKKwkJCQlnb3RvIGZhaWx1cmU7CisJCQl9CisJCX0KKwkKKwkJLyogZ2V0IEFDSyAqLworCQorCQlpZiAod2F2ZWZyb250X3dhaXQgKFNUQVRfQ0FOX1JFQUQpKSB7CisKKwkJCWlmICgoYyA9IGluYiAoZGV2LmRhdGFfcG9ydCkpICE9IFdGX0FDSykgeworCisJCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJkb3dubG9hZCAiCisJCQkJCSJvZiBzZWN0aW9uICMlZCBub3QgIgorCQkJCQkiYWNrbm93bGVkZ2VkLCBhY2sgPSAweCV4XG4iLAorCQkJCQlzZWN0aW9uX2NudF9kb3dubG9hZGVkICsgMSwgYyk7CisJCQkJZ290byBmYWlsdXJlOworCQkKKwkJCX0KKworCQl9IGVsc2UgeworCQkJcHJpbnRrIChLRVJOX0VSUiBMT0dOQU1FICJ0aW1lIG91dCBmb3IgZmlybXdhcmUgQUNLLlxuIik7CisJCQlnb3RvIGZhaWx1cmU7CisJCX0KKworCX0KKworCXN5c19jbG9zZSAoZmQpOworCXNldF9mcyAoZnMpOworCXJldHVybiAwOworCisgZmFpbHVyZToKKwlzeXNfY2xvc2UgKGZkKTsKKwlzZXRfZnMgKGZzKTsKKwlwcmludGsgKEtFUk5fRVJSICJcbldhdmVGcm9udDogZmlybXdhcmUgZG93bmxvYWQgZmFpbGVkISEhXG4iKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBfX2luaXQgd2F2ZWZyb250X2NvbmZpZ19taWRpICh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgcmJ1Zls0XSwgd2J1Zls0XTsKKyAgICAKKwlpZiAoZGV0ZWN0X3dmX21wdSAoZGV2LmlycSwgZGV2LmJhc2UpIDwgMCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FCisJCQkiY291bGQgbm90IGZpbmQgd29ya2luZyBNSURJIGRldmljZVxuIik7CisJCXJldHVybiAtMTsKKwl9IAorCisJaWYgKChkZXYubWlkaWRldiA9IGluc3RhbGxfd2ZfbXB1ICgpKSA8IDApIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJIk1JREkgaW50ZXJmYWNlcyBub3QgY29uZmlndXJlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBSb3V0ZSBleHRlcm5hbCBNSURJIHRvIFdhdmVGcm9udCBzeW50aCAoYnkgZGVmYXVsdCkgKi8KKyAgICAKKwlpZiAod2F2ZWZyb250X2NtZCAoV0ZDX01JU1lOVEhfT04sIHJidWYsIHdidWYpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUKKwkJCSJjYW5ub3QgZW5hYmxlIE1JREktSU4gdG8gc3ludGggcm91dGluZy5cbiIpOworCQkvKiBYWFggZXJyb3IgPyAqLworCX0KKworCisjaWYgT1NTX1NVUFBPUlRfTEVWRUwgJiBPU1NfU1VQUE9SVF9TRVEKKwkvKiBHZXQgdGhlIHJlZ3VsYXIgTUlESSBwYXRjaCBsb2FkaW5nIGZ1bmN0aW9uLCBzbyB3ZSBjYW4KKwkgICB1c2UgaXQgaWYgd2UgZXZlciBnZXQgaGFuZGVkIGEgU1lTRVggcGF0Y2guIFRoaXMgaXMKKwkgICB1bmxpa2VseSwgYmVjYXVzZSBpdHMgc28gZGFtbiBzbG93LCBidXQgd2UgbWF5IGFzIHdlbGwKKwkgICBsZWF2ZSB0aGlzIGZ1bmN0aW9uYWxpdHkgZnJvbSBtYXVpLmMgYmVoaW5kLCBzaW5jZSBpdAorCSAgIGNvdWxkIGJlIHVzZWZ1bCBmb3Igc2VxdWVuY2VyIGFwcGxpY2F0aW9ucyB0aGF0IGNhbgorCSAgIG9ubHkgdXNlIE1JREkgdG8gZG8gcGF0Y2ggbG9hZGluZy4KKwkqLworCisJaWYgKG1pZGlfZGV2c1tkZXYubWlkaWRldl0tPmNvbnZlcnRlciAhPSBOVUxMKSB7CisJCW1pZGlfbG9hZF9wYXRjaCA9IG1pZGlfZGV2c1tkZXYubWlkaWRldl0tPmNvbnZlcnRlci0+bG9hZF9wYXRjaDsKKwkJbWlkaV9kZXZzW2Rldi5taWRpZGV2XS0+Y29udmVydGVyLT5sb2FkX3BhdGNoID0KKwkJICAgICZ3YXZlZnJvbnRfb3NzX2xvYWRfcGF0Y2g7CisJfQorCisjZW5kaWYgLyogT1NTX1NVUFBPUlRfU0VRICovCisJCisJLyogVHVybiBvbiBWaXJ0dWFsIE1JREksIGJ1dCBmaXJzdCAqYWx3YXlzKiB0dXJuIGl0IG9mZiwKKwkgICBzaW5jZSBvdGhlcndpc2UgY29uc2VjdHV0aXZlIHJlbG9hZHMgb2YgdGhlIGRyaXZlciB3aWxsCisJICAgbmV2ZXIgY2F1c2UgdGhlIGhhcmR3YXJlIHRvIGdlbmVyYXRlIHRoZSBpbml0aWFsICJpbnRlcm5hbCIgb3IgCisJICAgImV4dGVybmFsIiBzb3VyY2UgYnl0ZXMgaW4gdGhlIE1JREkgZGF0YSBzdHJlYW0uIFRoaXMKKwkgICBpcyBwcmV0dHkgaW1wb3J0YW50LCBzaW5jZSB0aGUgaW50ZXJuYWwgaGFyZHdhcmUgZ2VuZXJhbGx5IHdpbGwKKwkgICBiZSB1c2VkIHRvIGdlbmVyYXRlIG5vbmUgb3IgdmVyeSBsaXR0bGUgTUlESSBvdXRwdXQsIGFuZAorCSAgIHRodXMgdGhlIG9ubHkgc291cmNlIG9mIE1JREkgZGF0YSBpcyBhY3R1YWxseSBleHRlcm5hbC4gV2l0aG91dAorCSAgIHRoZSBzd2l0Y2ggYnl0ZXMsIHRoZSBkcml2ZXIgd2lsbCB0aGluayBpdCBhbGwgY29tZXMgZnJvbQorCSAgIHRoZSBpbnRlcm5hbCBpbnRlcmZhY2UuIER1aC4KKwkqLworCisJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19WTUlESV9PRkYsIHJidWYsIHdidWYpKSB7IAorCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FCisJCQkidmlydHVhbCBNSURJIG1vZGUgbm90IGRpc2FibGVkXG4iKTsKKwkJcmV0dXJuIDA7IC8qIFdlJ3JlIE9LLCBidXQgbWlzc2luZyB0aGUgZXh0ZXJuYWwgTUlESSBkZXYgKi8KKwl9CisKKwlpZiAoKGRldi5leHRfbWlkaWRldiA9IHZpcnR1YWxfbWlkaV9lbmFibGUgKCkpIDwgMCkgeworCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FICJubyB2aXJ0dWFsIE1JREkgYWNjZXNzLlxuIik7CisJfSBlbHNlIHsKKwkJaWYgKHdhdmVmcm9udF9jbWQgKFdGQ19WTUlESV9PTiwgcmJ1Ziwgd2J1ZikpIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUKKwkJCQkiY2Fubm90IGVuYWJsZSB2aXJ0dWFsIE1JREkgbW9kZS5cbiIpOworCQkJdmlydHVhbF9taWRpX2Rpc2FibGUgKCk7CisJCX0gCisJfQorICAgIAorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCB3YXZlZnJvbnRfZG9fcmVzZXQgKGludCBhdGJvb3QpCit7CisJY2hhciB2b2ljZXNbMV07CisKKwlpZiAoIWF0Ym9vdCAmJiB3YXZlZnJvbnRfaHdfcmVzZXQgKCkpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAiaHcgcmVzZXQgZmFpbGVkLlxuIik7CisJCWdvdG8gZ29uZV9iYWQ7CisJfQorCisJaWYgKGRldi5pc3JhdykgeworCQlpZiAod2F2ZWZyb250X2Rvd25sb2FkX2Zpcm13YXJlIChvc3BhdGgpKSB7CisJCQlnb3RvIGdvbmVfYmFkOworCQl9CisKKwkJZGV2LmlzcmF3ID0gMDsKKworCQkvKiBXYWl0IGZvciB0aGUgT1MgdG8gZ2V0IHJ1bm5pbmcuIFRoZSBwcm90b2NvbCBmb3IKKwkJICAgdGhpcyBpcyBub24tb2J2aW91cywgYW5kIHdhcyBkZXRlcm1pbmVkIGJ5CisJCSAgIHVzaW5nIHBvcnQtSU8gdHJhY2luZyBpbiBET1NlbXUgYW5kIHNvbWUKKwkJICAgZXhwZXJpbWVudGF0aW9uIGhlcmUuCisJCSAgIAorCQkgICBSYXRoZXIgdGhhbiB1c2luZyB0aW1lZCB3YWl0cywgdXNlIGludGVycnVwdHMgY3JlYXRpdmVseS4KKwkJKi8KKworCQl3YXZlZnJvbnRfc2hvdWxkX2NhdXNlX2ludGVycnVwdCAoV0ZDX05PT1AsCisJCQkJCQkgIGRldi5kYXRhX3BvcnQsCisJCQkJCQkgIChvc3J1bl90aW1lKkhaKSk7CisKKwkJaWYgKCFkZXYuaXJxX29rKSB7CisJCQlwcmludGsgKEtFUk5fV0FSTklORyBMT0dOQU1FCisJCQkJIm5vIHBvc3QtT1MgaW50ZXJydXB0LlxuIik7CisJCQlnb3RvIGdvbmVfYmFkOworCQl9CisJCQorCQkvKiBOb3csIGRvIGl0IGFnYWluICEgKi8KKwkJCisJCXdhdmVmcm9udF9zaG91bGRfY2F1c2VfaW50ZXJydXB0IChXRkNfTk9PUCwKKwkJCQkJCSAgZGV2LmRhdGFfcG9ydCwgKDEwKkhaKSk7CisJCQorCQlpZiAoIWRldi5pcnFfb2spIHsKKwkJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUKKwkJCQkibm8gcG9zdC1PUyBpbnRlcnJ1cHQoMikuXG4iKTsKKwkJCWdvdG8gZ29uZV9iYWQ7CisJCX0KKworCQkvKiBPSywgbm8gKFJYL1RYKSBpbnRlcnJ1cHRzIGFueSBtb3JlLCBidXQgbGVhdmUgbXV0ZQorCQkgICBpbiBlZmZlY3QuIAorCQkqLworCQkKKwkJb3V0YiAoMHg4MHwweDQwLCBkZXYuY29udHJvbF9wb3J0KTsgCisKKwkJLyogTm8gbmVlZCBmb3IgdGhlIElSUSBhbnltb3JlICovCisJCQorCQlmcmVlX2lycSAoZGV2LmlycSwgJmRldik7CisKKwl9CisKKwlpZiAoZGV2Lmhhc19meCAmJiBmeF9yYXcpIHsKKwkJd2ZmeF9pbml0ICgpOworCX0KKworCS8qIFNFVFVQU05ELkVYRSBhc2tzIGZvciBzYW1wbGUgbWVtb3J5IGNvbmZpZyBoZXJlLCBidXQgc2luY2UgaQorCSAgIGhhdmUgbm8gaWRlYSBob3cgdG8gaW50ZXJwcmV0IHRoZSByZXN1bHQsIHdlJ2xsIGZvcmdldAorCSAgIGFib3V0IGl0LgorCSovCisJCisJaWYgKChkZXYuZnJlZW1lbSA9IHdhdmVmcm9udF9mcmVlbWVtICgpKSA8IDApIHsKKwkJZ290byBnb25lX2JhZDsKKwl9CisJCQorCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUgImF2YWlsYWJsZSBEUkFNICVka1xuIiwgZGV2LmZyZWVtZW0gLyAxMDI0KTsKKworCWlmICh3YXZlZnJvbnRfd3JpdGUgKDB4ZjApIHx8CisJICAgIHdhdmVmcm9udF93cml0ZSAoMSkgfHwKKwkgICAgKHdhdmVmcm9udF9yZWFkICgpIDwgMCkpIHsKKwkJZGV2LmRlYnVnID0gMDsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAiTVBVIGVtdWxhdGlvbiBtb2RlIG5vdCBzZXQuXG4iKTsKKwkJZ290byBnb25lX2JhZDsKKwl9CisKKwl2b2ljZXNbMF0gPSAzMjsKKworCWlmICh3YXZlZnJvbnRfY21kIChXRkNfU0VUX05WT0lDRVMsIE5VTEwsIHZvaWNlcykpIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJImNhbm5vdCBzZXQgbnVtYmVyIG9mIHZvaWNlcyB0byAzMi5cbiIpOworCQlnb3RvIGdvbmVfYmFkOworCX0KKworCisJcmV0dXJuIDA7CisKKyBnb25lX2JhZDoKKwkvKiByZXNldCB0aGF0IHN1Y2tlciBzbyB0aGF0IGl0IGRvZXNuJ3QgYm90aGVyIHVzLiAqLworCisJb3V0YiAoMHgwLCBkZXYuY29udHJvbF9wb3J0KTsKKwlkZXYuaW50ZXJydXB0c19vbiA9IDA7CisJaWYgKGRldi5pcnEgPj0gMCkgeworCQlmcmVlX2lycSAoZGV2LmlycSwgJmRldik7CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IF9faW5pdCB3YXZlZnJvbnRfaW5pdCAoaW50IGF0Ym9vdCkKK3sKKwlpbnQgc2FtcGxlc19hcmVfZnJvbV9yb207CisKKwlpZiAoZGV2LmlzcmF3KSB7CisJCXNhbXBsZXNfYXJlX2Zyb21fcm9tID0gMTsKKwl9IGVsc2UgeworCQkvKiBYWFggaXMgdGhpcyBhbHdheXMgdHJ1ZSA/ICovCisJCXNhbXBsZXNfYXJlX2Zyb21fcm9tID0gMDsKKwl9CisKKwlpZiAoZGV2LmlzcmF3IHx8IGZ4X3JhdykgeworCQlpZiAod2F2ZWZyb250X2RvX3Jlc2V0IChhdGJvb3QpKSB7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwl3YXZlZnJvbnRfZ2V0X3NhbXBsZV9zdGF0dXMgKHNhbXBsZXNfYXJlX2Zyb21fcm9tKTsKKwl3YXZlZnJvbnRfZ2V0X3Byb2dyYW1fc3RhdHVzICgpOworCXdhdmVmcm9udF9nZXRfcGF0Y2hfc3RhdHVzICgpOworCisJLyogU3RhcnQgbm9ybWFsIG9wZXJhdGlvbjogdW5yZXNldCwgbWFzdGVyIGludGVycnVwdCBlbmFibGVkLCBubyBtdXRlCisJKi8KKworCW91dGIgKDB4ODB8MHg0MHwweDIwLCBkZXYuY29udHJvbF9wb3J0KTsgCisKKwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50IF9faW5pdCBpbnN0YWxsX3dhdmVmcm9udCAodm9pZCkKKworeworCWlmICgoZGV2LnN5bnRoX2RldiA9IHJlZ2lzdGVyX3NvdW5kX3N5bnRoICgmd2F2ZWZyb250X2ZvcHMsIC0xKSkgPCAwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiY2Fubm90IHJlZ2lzdGVyIHJhdyBzeW50aFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKyNpZiBPU1NfU1VQUE9SVF9MRVZFTCAmIE9TU19TVVBQT1JUX1NFUQorCWlmICgoZGV2Lm9zc19kZXYgPSBzb3VuZF9hbGxvY19zeW50aGRldigpKSA9PSAtMSkgeworCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgIlRvbyBtYW55IHNlcXVlbmNlcnNcbiIpOworCQlyZXR1cm4gLTE7CisJfSBlbHNlIHsKKwkJc3ludGhfZGV2c1tkZXYub3NzX2Rldl0gPSAmd2F2ZWZyb250X29wZXJhdGlvbnM7CisJfQorI2VuZGlmIC8qIE9TU19TVVBQT1JUX1NFUSAqLworCisJaWYgKHdhdmVmcm9udF9pbml0ICgxKSA8IDApIHsKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRSAiaW5pdGlhbGl6YXRpb24gZmFpbGVkLlxuIik7CisKKyNpZiBPU1NfU1VQUE9SVF9MRVZFTCAmIE9TU19TVVBQT1JUX1NFUQorCQlzb3VuZF91bmxvYWRfc3ludGhkZXYgKGRldi5vc3NfZGV2KTsKKyNlbmRpZiAvKiBPU1NfU1VQUE9SVF9TRVEgKi8gCisKKwkJcmV0dXJuIC0xOworCX0KKyAgICAKKwlyZXF1ZXN0X3JlZ2lvbiAoZGV2LmJhc2UrMiwgNiwgIndhdmVmcm9udCBzeW50aCIpOworCisJaWYgKGRldi5oYXNfZngpIHsKKwkJcmVxdWVzdF9yZWdpb24gKGRldi5iYXNlKzgsIDgsICJ3YXZlZnJvbnQgZngiKTsKKwl9CisKKwlpZiAod2F2ZWZyb250X2NvbmZpZ19taWRpICgpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HIExPR05BTUUgImNvdWxkIG5vdCBpbml0aWFsaXplIE1JREkuXG4iKTsKKwl9CisKKwlyZXR1cm4gZGV2Lm9zc19kZXY7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB1bmluc3RhbGxfd2F2ZWZyb250ICh2b2lkKQoreworCS8qIHRoZSBmaXJzdCB0d28gaS9vIGFkZHJlc3NlcyBhcmUgZnJlZWQgYnkgdGhlIHdmX21wdSBjb2RlICovCisJcmVsZWFzZV9yZWdpb24gKGRldi5iYXNlKzIsIDYpOworCisJaWYgKGRldi5oYXNfZngpIHsKKwkJcmVsZWFzZV9yZWdpb24gKGRldi5iYXNlKzgsIDgpOworCX0KKworCXVucmVnaXN0ZXJfc291bmRfc3ludGggKGRldi5zeW50aF9kZXYpOworCisjaWYgT1NTX1NVUFBPUlRfTEVWRUwgJiBPU1NfU1VQUE9SVF9TRVEKKwlzb3VuZF91bmxvYWRfc3ludGhkZXYgKGRldi5vc3NfZGV2KTsKKyNlbmRpZiAvKiBPU1NfU1VQUE9SVF9TRVEgKi8gCisJdW5pbnN0YWxsX3dmX21wdSAoKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICBXYXZlRnJvbnQgRlggY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAieXNzMjI1LmgiCisKKy8qIENvbnRyb2wgYml0cyBmb3IgdGhlIExvYWQgQ29udHJvbCBSZWdpc3RlcgorICovCisKKyNkZWZpbmUgRlhfTFNCX1RSQU5TRkVSIDB4MDEgICAgLyogdHJhbnNmZXIgYWZ0ZXIgRFNQIExTQiBieXRlIHdyaXR0ZW4gKi8KKyNkZWZpbmUgRlhfTVNCX1RSQU5TRkVSIDB4MDIgICAgLyogdHJhbnNmZXIgYWZ0ZXIgRFNQIE1TQiBieXRlIHdyaXR0ZW4gKi8KKyNkZWZpbmUgRlhfQVVUT19JTkNSICAgIDB4MDQgICAgLyogYXV0by1pbmNyZW1lbnQgRFNQIGFkZHJlc3MgYWZ0ZXIgdHJhbnNmZXIgKi8KKworc3RhdGljIGludAord2ZmeF9pZGxlICh2b2lkKSAKKyAgICAKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBpbnQgeCA9IDB4ODA7CisgICAgCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQl4ID0gaW5iIChkZXYuZnhfc3RhdHVzKTsKKwkJaWYgKCh4ICYgMHg4MCkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisgICAgCisJaWYgKHggJiAweDgwKSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiRlggZGV2aWNlIG5ldmVyIGlkbGUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorICAgIAorCXJldHVybiAoMSk7Cit9CisKK2ludCBfX2luaXQgZGV0ZWN0X3dmZnggKHZvaWQpCit7CisJLyogVGhpcyBpcyBhIGNydWRlIGNoZWNrLCBidXQgaXRzIHRoZSBiZXN0IG9uZSBJIGhhdmUgZm9yIG5vdy4KKwkgICBDZXJ0YWlubHkgb24gdGhlIE1hdWkgYW5kIHRoZSBUcm9wZXosIHdmZnhfaWRsZSgpIHdpbGwKKwkgICByZXBvcnQgIm5ldmVyIGlkbGUiLCB3aGljaCBzdWdnZXN0cyB0aGF0IHRoaXMgdGVzdCBzaG91bGQKKwkgICB3b3JrIE9LLgorCSovCisKKwlpZiAoaW5iIChkZXYuZnhfc3RhdHVzKSAmIDB4ODApIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gTE9HTkFNRSAiSG1tLCBwcm9iYWJseSBhIE1hdWkgb3IgVHJvcGV6LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30JCisKK3ZvaWQKK3dmZnhfbXV0ZSAoaW50IG9ub2ZmKQorICAgIAoreworCWlmICghd2ZmeF9pZGxlKCkpIHsKKwkJcmV0dXJuOworCX0KKyAgICAKKwlvdXRiIChvbm9mZiA/IDB4MDIgOiAweDAwLCBkZXYuZnhfb3ApOworfQorCitzdGF0aWMgaW50Cit3ZmZ4X21lbXNldCAoaW50IHBhZ2UsCisJICAgICBpbnQgYWRkciwgaW50IGNudCwgdW5zaWduZWQgc2hvcnQgKmRhdGEpCit7CisJaWYgKHBhZ2UgPCAwIHx8IHBhZ2UgPiA3KSB7CisJCXByaW50ayAoS0VSTl9FUlIgTE9HTkFNRSAiRlggbWVtc2V0OiAiCisJCQkicGFnZSBtdXN0IGJlID49IDAgYW5kIDw9IDdcbiIpOworCQlyZXR1cm4gLShFSU5WQUwpOworCX0KKworCWlmIChhZGRyIDwgMCB8fCBhZGRyID4gMHg3ZikgeworCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgIkZYIG1lbXNldDogIgorCQkJImFkZHIgbXVzdCBiZSA+PSAwIGFuZCA8PSA3ZlxuIik7CisJCXJldHVybiAtKEVJTlZBTCk7CisJfQorCisJaWYgKGNudCA9PSAxKSB7CisKKwkJb3V0YiAoRlhfTFNCX1RSQU5TRkVSLCBkZXYuZnhfbGNyKTsKKwkJb3V0YiAocGFnZSwgZGV2LmZ4X2RzcF9wYWdlKTsKKwkJb3V0YiAoYWRkciwgZGV2LmZ4X2RzcF9hZGRyKTsKKwkJb3V0YiAoKGRhdGFbMF0gPj4gOCksIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAoKGRhdGFbMF0gJiAweGZmKSwgZGV2LmZ4X2RzcF9sc2IpOworCisJCXByaW50ayAoS0VSTl9JTkZPIExPR05BTUUgIkZYOiBhZGRyICVkOiV4IHNldCB0byAweCV4XG4iLAorCQkJcGFnZSwgYWRkciwgZGF0YVswXSk7CisJCisJfSBlbHNlIHsKKwkJaW50IGk7CisKKwkJb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJCW91dGIgKHBhZ2UsIGRldi5meF9kc3BfcGFnZSk7CisJCW91dGIgKGFkZHIsIGRldi5meF9kc3BfYWRkcik7CisKKwkJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCQlvdXRiICgoZGF0YVtpXSA+PiA4KSwgZGV2LmZ4X2RzcF9tc2IpOworCQkJb3V0YiAoKGRhdGFbaV0gJiAweGZmKSwgZGV2LmZ4X2RzcF9sc2IpOworCQkJaWYgKCF3ZmZ4X2lkbGUgKCkpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpICE9IGNudCkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJCSJGWCBtZW1zZXQgIgorCQkJCSIoMHgleCwgMHgleCwgJXAsICVkKSBpbmNvbXBsZXRlXG4iLAorCQkJCXBhZ2UsIGFkZHIsIGRhdGEsIGNudCk7CisJCQlyZXR1cm4gLShFSU8pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3dmZnhfaW9jdGwgKHdhdmVmcm9udF9meF9pbmZvICpyKQorCit7CisJdW5zaWduZWQgc2hvcnQgcGFnZV9kYXRhWzI1Nl07CisJdW5zaWduZWQgc2hvcnQgKnBkOworCisJc3dpdGNoIChyLT5yZXF1ZXN0KSB7CisJY2FzZSBXRkZYX01VVEU6CisJCXdmZnhfbXV0ZSAoci0+ZGF0YVswXSk7CisJCXJldHVybiAwOworCisJY2FzZSBXRkZYX01FTVNFVDoKKworCQlpZiAoci0+ZGF0YVsyXSA8PSAwKSB7CisJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgImNhbm5vdCB3cml0ZSAiCisJCQkJIjw9IDAgYnl0ZXMgdG8gRlhcbiIpOworCQkJcmV0dXJuIC0oRUlOVkFMKTsKKwkJfSBlbHNlIGlmIChyLT5kYXRhWzJdID09IDEpIHsKKwkJCXBkID0gKHVuc2lnbmVkIHNob3J0ICopICZyLT5kYXRhWzNdOworCQl9IGVsc2UgeworCQkJaWYgKHItPmRhdGFbMl0gPiBzaXplb2YgKHBhZ2VfZGF0YSkpIHsKKwkJCQlwcmludGsgKEtFUk5fRVJSIExPR05BTUUgImNhbm5vdCB3cml0ZSAiCisJCQkJCSI+IDI1NSBieXRlcyB0byBGWFxuIik7CisJCQkJcmV0dXJuIC0oRUlOVkFMKTsKKwkJCX0KKwkJCWlmIChjb3B5X2Zyb21fdXNlcihwYWdlX2RhdGEsCisJCQkJCSAgICh1bnNpZ25lZCBjaGFyIF9fdXNlciAqKXItPmRhdGFbM10sCisJCQkJCSAgIHItPmRhdGFbMl0pKQorCQkJCXJldHVybiAtRUZBVUxUOworCQkJcGQgPSBwYWdlX2RhdGE7CisJCX0KKworCQlyZXR1cm4gd2ZmeF9tZW1zZXQgKHItPmRhdGFbMF0sIC8qIHBhZ2UgKi8KKwkJCQkgICAgci0+ZGF0YVsxXSwgLyogYWRkciAqLworCQkJCSAgICByLT5kYXRhWzJdLCAvKiBjbnQgKi8KKwkJCQkgICAgcGQpOworCisJZGVmYXVsdDoKKwkJcHJpbnRrIChLRVJOX1dBUk5JTkcgTE9HTkFNRQorCQkJIkZYOiBpb2N0bCAlZCBub3QgeWV0IHN1cHBvcnRlZFxuIiwKKwkJCXItPnJlcXVlc3QpOworCQlyZXR1cm4gLShFSU5WQUwpOworCX0KK30KKworLyogWVNTMjI1IGluaXRpYWxpemF0aW9uLgorCisgICBUaGlzIGNvZGUgd2FzIGRldmVsb3BlZCB1c2luZyBET1NFTVUuIFRoZSBUdXJ0bGUgQmVhY2ggU0VUVVBTTkQKKyAgIHV0aWxpdHkgd2FzIHJ1biB3aXRoIEkvTyB0cmFjaW5nIGluIERPU0VNVSBlbmFibGVkLCBhbmQgYSByZWNvbnN0cnVjdGlvbgorICAgb2YgdGhlIHBvcnQgSS9PIGRvbmUsIHVzaW5nIHRoZSBZYW1haGEgZmF4YmFjayBkb2N1bWVudCBhcyBhIGd1aWRlCisgICB0byBhZGQgbW9yZSBsb2dpYyB0byB0aGUgY29kZS4gSXRzIHJlYWxseSBwcmV0dHkgd2VpcmQuCisKKyAgIFRoZXJlIHdhcyBhbiBhbHRlcm5hdGl2ZSBhcHByb2FjaCBvZiBqdXN0IGR1bXBpbmcgdGhlIHdob2xlIEkvTworICAgc2VxdWVuY2UgYXMgYSBzZXJpZXMgb2YgcG9ydC92YWx1ZSBwYWlycyBhbmQgYSBzaW1wbGUgbG9vcAorICAgdGhhdCBvdXRwdXQgaXQuIEhvd2V2ZXIsIEkgaG9wZSB0aGF0IGV2ZW50dWFsbHkgSSdsbCBnZXQgbW9yZQorICAgY29udHJvbCBvdmVyIHdoYXQgdGhpcyBjb2RlIGRvZXMsIGFuZCBzbyBJIHRyaWVkIHRvIHN0aWNrIHdpdGgKKyAgIGEgc29tZXdoYXQgImFsZ29yaXRobWljIiBhcHByb2FjaC4KKyovCisKK3N0YXRpYyBpbnQgX19pbml0IHdmZnhfaW5pdCAodm9pZCkKK3sKKwlpbnQgaTsKKwlpbnQgajsKKworCS8qIFNldCBhbGwgYml0cyBmb3IgYWxsIGNoYW5uZWxzIG9uIHRoZSBNT0QgdW5pdCB0byB6ZXJvICovCisJLyogWFhYIEJ1dCB3aHkgZG8gdGhpcyB0d2ljZSA/ICovCisKKwlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCWZvciAoaSA9IDB4MTA7IGkgPD0gMHhmZjsgaSsrKSB7CisJICAgIAorCQkJaWYgKCF3ZmZ4X2lkbGUgKCkpIHsKKwkJCQlyZXR1cm4gKC0xKTsKKwkJCX0KKwkgICAgCisJCQlvdXRiIChpLCBkZXYuZnhfbW9kX2FkZHIpOworCQkJb3V0YiAoMHgwLCBkZXYuZnhfbW9kX2RhdGEpOworCQl9CisJfQorCisJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJb3V0YiAoMHgwMiwgZGV2LmZ4X29wKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXRlIG9uICovCisKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDQsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDIsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDMsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4N2MsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4N2UsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDYsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDksIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NDcsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4NGEsIGRldi5meF9kc3BfYWRkcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9tc2IpOworCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbHNiKTsKKworCS8qIGVpdGhlciBiZWNhdXNlIG9mIHN0dXBpZGl0eSBieSBUQidzIHByb2dyYW1tZXJzLCBvciBiZWNhdXNlIGl0CisJICAgYWN0dWFsbHkgZG9lcyBzb21ldGhpbmcsIHJlemVybyB0aGUgTU9EIHBhZ2UuCisJKi8KKwlmb3IgKGkgPSAweDEwOyBpIDw9IDB4ZmY7IGkrKykgeworCQorCQlpZiAoIXdmZnhfaWRsZSAoKSkgeworCQkJcmV0dXJuICgtMSk7CisJCX0KKwkKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgwLCBkZXYuZnhfbW9kX2RhdGEpOworCX0KKwkvKiBsb2FkIHBhZ2UgemVybyAqLworCisJb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9wYWdlKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV96ZXJvKTsgaSArPSAyKSB7CisJCW91dGIgKHBhZ2VfemVyb1tpXSwgZGV2LmZ4X2RzcF9tc2IpOworCQlvdXRiIChwYWdlX3plcm9baSsxXSwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwkvKiBOb3cgbG9hZCBwYWdlIG9uZSAqLworCisJb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJb3V0YiAoMHgwMSwgZGV2LmZ4X2RzcF9wYWdlKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV9vbmUpOyBpICs9IDIpIHsKKwkJb3V0YiAocGFnZV9vbmVbaV0sIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAocGFnZV9vbmVbaSsxXSwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisgICAgCisJb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJb3V0YiAoMHgwMiwgZGV2LmZ4X2RzcF9wYWdlKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV90d28pOyBpKyspIHsKKwkJb3V0YiAocGFnZV90d29baV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOworCW91dGIgKDB4MDMsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfdGhyZWUpOyBpKyspIHsKKwkJb3V0YiAocGFnZV90aHJlZVtpXSwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisgICAgCisJb3V0YiAoRlhfQVVUT19JTkNSfEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJb3V0YiAoMHgwNCwgZGV2LmZ4X2RzcF9wYWdlKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX2FkZHIpOworCisJZm9yIChpID0gMDsgaSA8IHNpemVvZiAocGFnZV9mb3VyKTsgaSsrKSB7CisJCW91dGIgKHBhZ2VfZm91cltpXSwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwkvKiBMb2FkIG1lbW9yeSBhcmVhIChwYWdlIHNpeCkgKi8KKyAgICAKKwlvdXRiIChGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOyAKKwlvdXRiICgweDA2LCBkZXYuZnhfZHNwX3BhZ2UpOyAKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2Vfc2l4KTsgaSArPSAzKSB7CisJCW91dGIgKHBhZ2Vfc2l4W2ldLCBkZXYuZnhfZHNwX2FkZHIpOworCQlvdXRiIChwYWdlX3NpeFtpKzFdLCBkZXYuZnhfZHNwX21zYik7CisJCW91dGIgKHBhZ2Vfc2l4W2krMl0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2Vfc2V2ZW4pOyBpICs9IDIpIHsKKwkJb3V0YiAocGFnZV9zZXZlbltpXSwgZGV2LmZ4X2RzcF9tc2IpOworCQlvdXRiIChwYWdlX3NldmVuW2krMV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJLyogTm93IHNldHVwIHRoZSBNT0QgYXJlYS4gV2UgZG8gdGhpcyBhbGdvcml0aG1pY2FsbHkgaW4gb3JkZXIgdG8KKwkgICBzYXZlIGEgbGl0dGxlIGRhdGEgc3BhY2UuIEl0IGNvdWxkIGJlIGRvbmUgaW4gdGhlIHNhbWUgZmFzaGlvbgorCSAgIGFzIHRoZSAicGFnZXMiLgorCSovCisKKwlmb3IgKGkgPSAweDAwOyBpIDw9IDB4MGY7IGkrKykgeworCQlvdXRiICgweDAxLCBkZXYuZnhfbW9kX2FkZHIpOworCQlvdXRiIChpLCBkZXYuZnhfbW9kX2RhdGEpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwkJb3V0YiAoMHgwMiwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgwMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJZm9yIChpID0gMHhiMDsgaSA8PSAweGJmOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgyMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJZm9yIChpID0gMHhmMDsgaSA8PSAweGZmOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgyMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJZm9yIChpID0gMHgxMDsgaSA8PSAweDFkOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHhmZiwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJb3V0YiAoMHgxZSwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDQwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJZm9yIChpID0gMHgxZjsgaSA8PSAweDJkOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHhmZiwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJb3V0YiAoMHgyZSwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJZm9yIChpID0gMHgyZjsgaSA8PSAweDNlOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgwMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJb3V0YiAoMHgzZiwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDIwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJZm9yIChpID0gMHg0MDsgaSA8PSAweDRkOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgwMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJb3V0YiAoMHg0ZSwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDBlLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4NGYsIGRldi5meF9tb2RfYWRkcik7CisJb3V0YiAoMHgwZSwgZGV2LmZ4X21vZF9kYXRhKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKworCisJZm9yIChpID0gMHg1MDsgaSA8PSAweDZiOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHgwMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorCisJb3V0YiAoMHg2YywgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDQwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJb3V0YiAoMHg2ZCwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJb3V0YiAoMHg2ZSwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDQwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJb3V0YiAoMHg2ZiwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDQwLCBkZXYuZnhfbW9kX2RhdGEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJZm9yIChpID0gMHg3MDsgaSA8PSAweDdmOyBpKyspIHsKKwkJb3V0YiAoaSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAoMHhjMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCWZvciAoaSA9IDB4ODA7IGkgPD0gMHhhZjsgaSsrKSB7CisJCW91dGIgKGksIGRldi5meF9tb2RfYWRkcik7CisJCW91dGIgKDB4MDAsIGRldi5meF9tb2RfZGF0YSk7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKworCWZvciAoaSA9IDB4YzA7IGkgPD0gMHhkZDsgaSsrKSB7CisJCW91dGIgKGksIGRldi5meF9tb2RfYWRkcik7CisJCW91dGIgKDB4MDAsIGRldi5meF9tb2RfZGF0YSk7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKworCW91dGIgKDB4ZGUsIGRldi5meF9tb2RfYWRkcik7CisJb3V0YiAoMHgxMCwgZGV2LmZ4X21vZF9kYXRhKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweGRmLCBkZXYuZnhfbW9kX2FkZHIpOworCW91dGIgKDB4MTAsIGRldi5meF9tb2RfZGF0YSk7CisJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisKKwlmb3IgKGkgPSAweGUwOyBpIDw9IDB4ZWY7IGkrKykgeworCQlvdXRiIChpLCBkZXYuZnhfbW9kX2FkZHIpOworCQlvdXRiICgweDAwLCBkZXYuZnhfbW9kX2RhdGEpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwlmb3IgKGkgPSAweDAwOyBpIDw9IDB4MGY7IGkrKykgeworCQlvdXRiICgweDAxLCBkZXYuZnhfbW9kX2FkZHIpOworCQlvdXRiIChpLCBkZXYuZnhfbW9kX2RhdGEpOworCQlvdXRiICgweDAyLCBkZXYuZnhfbW9kX2FkZHIpOworCQlvdXRiICgweDAxLCBkZXYuZnhfbW9kX2RhdGEpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwlvdXRiICgweDAyLCBkZXYuZnhfb3ApOyAvKiBtdXRlIG9uICovCisKKwkvKiBOb3cgc2V0IHRoZSBjb2VmZmljaWVudHMgYW5kIHNvIGZvcnRoIGZvciB0aGUgcHJvZ3JhbXMgYWJvdmUgKi8KKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvZWZmaWNpZW50cyk7IGkgKz0gNCkgeworCQlvdXRiIChjb2VmZmljaWVudHNbaV0sIGRldi5meF9kc3BfcGFnZSk7CisJCW91dGIgKGNvZWZmaWNpZW50c1tpKzFdLCBkZXYuZnhfZHNwX2FkZHIpOworCQlvdXRiIChjb2VmZmljaWVudHNbaSsyXSwgZGV2LmZ4X2RzcF9tc2IpOworCQlvdXRiIChjb2VmZmljaWVudHNbaSszXSwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwkvKiBTb21lIHNldHRpbmdzICg/KSB0aGF0IGFyZSB0b28gc21hbGwgdG8gYnVuZGxlIGludG8gbG9vcHMgKi8KKworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MWUsIGRldi5meF9tb2RfYWRkcik7CisJb3V0YiAoMHgxNCwgZGV2LmZ4X21vZF9kYXRhKTsKKwlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwlvdXRiICgweGRlLCBkZXYuZnhfbW9kX2FkZHIpOworCW91dGIgKDB4MjAsIGRldi5meF9tb2RfZGF0YSk7CisJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJb3V0YiAoMHhkZiwgZGV2LmZ4X21vZF9hZGRyKTsKKwlvdXRiICgweDIwLCBkZXYuZnhfbW9kX2RhdGEpOworICAgIAorCS8qIHNvbWUgbW9yZSBjb2VmZmljaWVudHMgKi8KKworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDYsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHg3OCwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHg0MCwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwMywgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDBmLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHhmZiwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwYiwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDBmLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHhmZiwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwMiwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgwYSwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHg0NiwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9sc2IpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCW91dGIgKDB4MDcsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHg0OSwgZGV2LmZ4X2RzcF9hZGRyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX21zYik7CisJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9sc2IpOworICAgIAorCS8qIE5vdywgZm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIGxldHMgcmVsb2FkIGV2ZXJ5IHBhZ2UKKwkgICBhbmQgYWxsIHRoZSBjb2VmZmljaWVudHMgb3ZlciBhZ2Fpbi4gSSBoYXZlICpOTyogaWRlYQorCSAgIHdoeSB0aGlzIGlzIGRvbmUuIEkgZG8ga25vdyB0aGF0IG5vIHNvdW5kIGlzIHByb2R1Y2VkCisJICAgaXMgdGhpcyBwaGFzZSBpcyBvbWl0dGVkLgorCSovCisKKwlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYuZnhfbGNyKTsKKwlvdXRiICgweDAwLCBkZXYuZnhfZHNwX3BhZ2UpOyAgCisJb3V0YiAoMHgxMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfemVyb192Mik7IGkgKz0gMikgeworCQlvdXRiIChwYWdlX3plcm9fdjJbaV0sIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAocGFnZV96ZXJvX3YyW2krMV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOworCW91dGIgKDB4MDEsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgxMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2Vfb25lX3YyKTsgaSArPSAyKSB7CisJCW91dGIgKHBhZ2Vfb25lX3YyW2ldLCBkZXYuZnhfZHNwX21zYik7CisJCW91dGIgKHBhZ2Vfb25lX3YyW2krMV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworICAgIAorCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOworCW91dGIgKDB4MDIsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgxMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfdHdvX3YyKTsgaSsrKSB7CisJCW91dGIgKHBhZ2VfdHdvX3YyW2ldLCBkZXYuZnhfZHNwX2xzYik7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKwlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYuZnhfbGNyKTsKKwlvdXRiICgweDAzLCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4MTAsIGRldi5meF9kc3BfYWRkcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX3RocmVlX3YyKTsgaSsrKSB7CisJCW91dGIgKHBhZ2VfdGhyZWVfdjJbaV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCW91dGIgKEZYX0FVVE9fSU5DUnxGWF9MU0JfVFJBTlNGRVIsIGRldi5meF9sY3IpOworCW91dGIgKDB4MDQsIGRldi5meF9kc3BfcGFnZSk7CisJb3V0YiAoMHgxMCwgZGV2LmZ4X2RzcF9hZGRyKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKHBhZ2VfZm91cl92Mik7IGkrKykgeworCQlvdXRiIChwYWdlX2ZvdXJfdjJbaV0sIGRldi5meF9kc3BfbHNiKTsKKwkJaWYgKCF3ZmZ4X2lkbGUoKSkgcmV0dXJuICgtMSk7CisJfQorICAgIAorCW91dGIgKEZYX0xTQl9UUkFOU0ZFUiwgZGV2LmZ4X2xjcik7CisJb3V0YiAoMHgwNiwgZGV2LmZ4X2RzcF9wYWdlKTsKKworCS8qIFBhZ2Ugc2l4IHYuMiBpcyBhbGdvcml0aG1pYyAqLworICAgIAorCWZvciAoaSA9IDB4MTA7IGkgPD0gMHgzZTsgaSArPSAyKSB7CisJCW91dGIgKGksIGRldi5meF9kc3BfYWRkcik7CisJCW91dGIgKDB4MDAsIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAoMHgwMCwgZGV2LmZ4X2RzcF9sc2IpOworCQlpZiAoIXdmZnhfaWRsZSgpKSByZXR1cm4gKC0xKTsKKwl9CisKKwlvdXRiIChGWF9BVVRPX0lOQ1J8RlhfTFNCX1RSQU5TRkVSLCBkZXYuZnhfbGNyKTsKKwlvdXRiICgweDA3LCBkZXYuZnhfZHNwX3BhZ2UpOworCW91dGIgKDB4MTAsIGRldi5meF9kc3BfYWRkcik7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIChwYWdlX3NldmVuX3YyKTsgaSArPSAyKSB7CisJCW91dGIgKHBhZ2Vfc2V2ZW5fdjJbaV0sIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAocGFnZV9zZXZlbl92MltpKzFdLCBkZXYuZnhfZHNwX2xzYik7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKworCWZvciAoaSA9IDB4MDA7IGkgPCBzaXplb2YobW9kX3YyKTsgaSArPSAyKSB7CisJCW91dGIgKG1vZF92MltpXSwgZGV2LmZ4X21vZF9hZGRyKTsKKwkJb3V0YiAobW9kX3YyW2krMV0sIGRldi5meF9tb2RfZGF0YSk7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvZWZmaWNpZW50czIpOyBpICs9IDQpIHsKKwkJb3V0YiAoY29lZmZpY2llbnRzMltpXSwgZGV2LmZ4X2RzcF9wYWdlKTsKKwkJb3V0YiAoY29lZmZpY2llbnRzMltpKzFdLCBkZXYuZnhfZHNwX2FkZHIpOworCQlvdXRiIChjb2VmZmljaWVudHMyW2krMl0sIGRldi5meF9kc3BfbXNiKTsKKwkJb3V0YiAoY29lZmZpY2llbnRzMltpKzNdLCBkZXYuZnhfZHNwX2xzYik7CisJCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgKGNvZWZmaWNpZW50czMpOyBpICs9IDIpIHsKKwkJaW50IHg7CisKKwkJb3V0YiAoMHgwNywgZGV2LmZ4X2RzcF9wYWdlKTsKKwkJeCA9IChpICUgNCkgPyAweDRlIDogMHg0YzsKKwkJb3V0YiAoeCwgZGV2LmZ4X2RzcF9hZGRyKTsKKwkJb3V0YiAoY29lZmZpY2llbnRzM1tpXSwgZGV2LmZ4X2RzcF9tc2IpOworCQlvdXRiIChjb2VmZmljaWVudHMzW2krMV0sIGRldi5meF9kc3BfbHNiKTsKKwl9CisKKwlvdXRiICgweDAwLCBkZXYuZnhfb3ApOyAvKiBtdXRlIG9mZiAqLworCWlmICghd2ZmeF9pZGxlKCkpIHJldHVybiAoLTEpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludCBpbyA9IC0xOworc3RhdGljIGludCBpcnEgPSAtMTsKKworTU9EVUxFX0FVVEhPUiAgICAgICgiUGF1bCBCYXJ0b24tRGF2aXMgPHBiZEBvcC5uZXQ+Iik7CitNT0RVTEVfREVTQ1JJUFRJT04gKCJUdXJ0bGUgQmVhY2ggV2F2ZUZyb250IExpbnV4IERyaXZlciIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworbW9kdWxlX3BhcmFtICAgICAgIChpbywgaW50LCAwKTsKK21vZHVsZV9wYXJhbSAgICAgICAoaXJxLCBpbnQsIDApOworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X3dhdmZyb250ICh2b2lkKQoreworCXByaW50ayAoIlR1cnRsZSBCZWFjaCBXYXZlRnJvbnQgRHJpdmVyXG4iCisJCSJDb3B5cmlnaHQgKEMpIGJ5IEhhbm51IFNvbHZhaW5lbiwgIgorCQkiUGF1bCBCYXJ0b24tRGF2aXMgMTk5My0xOTk4LlxuIik7CisKKwkvKiBYWFggdCd3b3VsZCBiZSBsb3ZlbHkgdG8gYXNrIHRoZSBDUzQyMzIgZm9yIHRoZXNlIHZhbHVlcywgZWggPyAqLworCisJaWYgKGlvID09IC0xIHx8IGlycSA9PSAtMSkgeworCQlwcmludGsgKEtFUk5fSU5GTyBMT0dOQU1FICJpcnEgYW5kIGlvIG9wdGlvbnMgbXVzdCBiZSBzZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKHdhdmVmcm9udF9pbnRlcnJ1cHRfYml0cyAoaXJxKSA8IDApIHsKKwkJcHJpbnRrIChLRVJOX0lORk8gTE9HTkFNRQorCQkJIklSUSBtdXN0IGJlIDksIDUsIDEyIG9yIDE1IChub3QgJWQpXG4iLCBpcnEpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwlpZiAoZGV0ZWN0X3dhdmVmcm9udCAoaXJxLCBpbykgPCAwKSB7CisJCXJldHVybiAtRU5PREVWOworCX0gCisKKwlpZiAoaW5zdGFsbF93YXZlZnJvbnQgKCkgPCAwKSB7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgY2xlYW51cF93YXZmcm9udCAodm9pZCkKK3sKKwl1bmluc3RhbGxfd2F2ZWZyb250ICgpOworfQorCittb2R1bGVfaW5pdChpbml0X3dhdmZyb250KTsKK21vZHVsZV9leGl0KGNsZWFudXBfd2F2ZnJvbnQpOwpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3dmX21pZGkuYyBiL3NvdW5kL29zcy93Zl9taWRpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2IxNjdiNwotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy93Zl9taWRpLmMKQEAgLTAsMCArMSw4ODAgQEAKKy8qCisgKiBzb3VuZC93Zl9taWRpLmMKKyAqCisgKiBUaGUgbG93IGxldmVsIGRyaXZlciBmb3IgdGhlIFdhdmVGcm9udCBJQ1MyMTE1IE1JREkgaW50ZXJmYWNlKHMpCisgKiBOb3RlIHRoYXQgdGhlcmUgaXMgYWxzbyBhbiBNUFUtNDAxIGVtdWxhdGlvbiAoYWN0dWFsbHksIGEgVUFSVC00MDEKKyAqIGVtdWxhdGlvbikgb24gdGhlIENTNDIzMiBvbiB0aGUgVHJvcGV6IFBsdXMuIFRoaXMgY29kZSBoYXMgbm90aGluZworICogdG8gZG8gd2l0aCB0aGF0IGludGVyZmFjZSBhdCBhbGwuCisgKgorICogVGhlIGludGVyZmFjZSBpcyBlc3NlbnRpYWxseSBqdXN0IGEgVUFSVC00MDEsIGJ1dCBpcyBoYXMgdGhlCisgKiBpbnRlcmVzdGluZyBwcm9wZXJ0eSBvZiBzdXBwb3J0aW5nIHdoYXQgVHVydGxlIEJlYWNoIGNhbGxlZAorICogIlZpcnR1YWwgTUlESSIgbW9kZS4gSW4gdGhpcyBtb2RlLCB0aGVyZSBhcmUgZWZmZWN0aXZlbHkgKnR3byoKKyAqIE1JREkgYnVzZXMgYWNjZXNzaWJsZSB2aWEgdGhlIGludGVyZmFjZSwgb25lIHRoYXQgaXMgcm91dGVkCisgKiBzb2xlbHkgdG8vZnJvbSB0aGUgZXh0ZXJuYWwgV2F2ZUZyb250IHN5bnRoZXNpemVyIGFuZCB0aGUgb3RoZXIKKyAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBpbi9zb2NrZXQgY29ubmVjdG9yIHVzZWQgdG8gbGluayBleHRlcm5hbAorICogTUlESSBkZXZpY2VzIHRvIHRoZSBib2FyZC4KKyAqCisgKiBUaGlzIGRyaXZlciBmdWxseSBzdXBwb3J0cyB0aGlzIG1vZGUsIGFsbG93aW5nIHR3byBkaXN0aW5jdAorICogbWlkaSBkZXZpY2VzICgvZGV2L21pZGlOTiBhbmQgL2Rldi9taWRpTk4rMSkgdG8gYmUgdXNlZAorICogY29tcGxldGVseSBpbmRlcGVuZGVudGx5LCBnaXZpbmcgMzIgY2hhbm5lbHMgb2YgTUlESSByb3V0aW5nLAorICogMTYgdG8gdGhlIFdhdmVGcm9udCBzeW50aCBhbmQgMTYgdG8gdGhlIGV4dGVybmFsIE1JREkgYnVzLgorICoKKyAqIFN3aXRjaGluZyBiZXR3ZWVuIHRoZSB0d28gaXMgYWNjb21wbGlzaGVkIGV4dGVybmFsbHkgYnkgdGhlIGRyaXZlcgorICogdXNpbmcgdGhlIHR3byBvdGhlcndpc2UgdW51c2VkIE1JREkgYnl0ZXMuIFNlZSB0aGUgY29kZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIE5PVEU6IFZJUlRVQUwgTUlESSBNT0RFIElTIE9OIEJZIERFRkFVTFQgKHNlZSB3YXZlZnJvbnQuYykKKyAqCisgKiBUaGUgbWFpbiByZWFzb24gdG8gdHVybiBvZmYgVmlydHVhbCBNSURJIG1vZGUgaXMgd2hlbiB5b3Ugd2FudCB0bworICogdGlnaHRseSBjb3VwbGUgdGhlIFdhdmVGcm9udCBzeW50aCB3aXRoIGFuIGV4dGVybmFsIE1JREkKKyAqIGRldmljZS4gWW91IHdvbid0IGJlIGFibGUgdG8gZGlzdGluZ3Vpc2ggdGhlIHNvdXJjZSBvZiBhbnkgTUlESQorICogZGF0YSBleGNlcHQgdmlhIFN5c0V4IElELCBidXQgdGhhdHMgcHJvYmFibHkgT0ssIHNpbmNlIGZvciB0aGUgbW9zdAorICogcGFydCwgdGhlIFdhdmVGcm9udCB3b24ndCBiZSBzZW5kaW5nIGFueSBNSURJIGRhdGEgYXQgYWxsLgorICogIAorICogVGhlIG1haW4gcmVhc29uIHRvIHR1cm4gb24gVmlydHVhbCBNSURJIE1vZGUgaXMgdG8gcHJvdmlkZSB0d28KKyAqIGNvbXBsZXRlbHkgaW5kZXBlbmRlbnQgMTYtY2hhbm5lbCBNSURJIGJ1c2VzLCBvbmUgdG8gdGhlCisgKiBXYXZlRnJvbnQgYW5kIG9uZSB0byBhbnkgZXh0ZXJuYWwgTUlESSBkZXZpY2VzLiBHaXZlbiB0aGUgMzIKKyAqIHZvaWNlIG5hdHVyZSBvZiB0aGUgV2F2ZUZyb250LCBpdHMgcHJldHR5IGVhc3kgdG8gZmluZCBhIHVzZQorICogZm9yIGFsbCAxNiBjaGFubmVscyBkcml2aW5nIGp1c3QgdGhhdCBzeW50aC4KKyAqCisgKi8KKworLyoKKyAqIENvcHlyaWdodCAoQykgYnkgUGF1bCBCYXJ0b24tRGF2aXMgMTk5OAorICogU29tZSBwb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGRlcml2ZWQgZnJvbSB3b3JrIHRoYXQgaXM6CisgKgorICogICAgQ29weXJpR2h0IChDKSBieSBIYW5udSBTYXZvbGFpbmVuIDE5OTMtMTk5NgorICoKKyAqIFVTUy9MaXRlIGZvciBMaW51eCBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UgKEdQTCkKKyAqIFZlcnNpb24gMiAoSnVuZSAxOTkxKS4gU2VlIHRoZSAiQ09QWUlORyIgZmlsZSBkaXN0cmlidXRlZCB3aXRoIHRoaXMgc29mdHdhcmUKKyAqIGZvciBtb3JlIGluZm8uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorCisjaW5jbHVkZSA8bGludXgvd2F2ZWZyb250Lmg+CisKKyNpZmRlZiBNT0RVTEUKKworc3RydWN0IHdmX21wdV9jb25maWcgeworCWludCAgICAgICAgICAgICBiYXNlOworI2RlZmluZQlEQVRBUE9SVChkKSAgIChkKS0+YmFzZQorI2RlZmluZQlDT01EUE9SVChkKSAgIChkKS0+YmFzZSsxCisjZGVmaW5lCVNUQVRQT1JUKGQpICAgKGQpLT5iYXNlKzEKKworCWludCAgICAgICAgICAgICBpcnE7CisJaW50ICAgICAgICAgICAgIG9wZW5lZDsKKwlpbnQgICAgICAgICAgICAgZGV2bm87CisJaW50ICAgICAgICAgICAgIHN5bnRobm87CisJaW50ICAgICAgICAgICAgIG1vZGU7CisjZGVmaW5lIE1PREVfTUlESQkxCisjZGVmaW5lIE1PREVfU1lOVEgJMgorCisJdm9pZCAgICAgICAgICAgICgqaW5wdXRpbnRyKSAoaW50IGRldiwgdW5zaWduZWQgY2hhciBkYXRhKTsKKwljaGFyIGlzdmlydHVhbDsgICAgICAgICAgICAgICAgLyogZG8gdmlydHVhbCBJL08gc3R1ZmYgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAgZGV2c1syXTsKK3N0YXRpYyBzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAqcGh5c19kZXYgPSAmZGV2c1swXTsKK3N0YXRpYyBzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAqdmlydF9kZXYgPSAmZGV2c1sxXTsKKworc3RhdGljIHZvaWQgc3RhcnRfdWFydF9tb2RlICh2b2lkKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisKKyNkZWZpbmUJT1VUUFVUX1JFQURZCTB4NDAKKyNkZWZpbmUJSU5QVVRfQVZBSUwJMHg4MAorI2RlZmluZQlNUFVfQUNLCQkweEZFCisjZGVmaW5lCVVBUlRfTU9ERV9PTgkweDNGCisKK3N0YXRpYyBpbmxpbmUgaW50IHdmX21wdV9zdGF0dXMgKHZvaWQpCit7CisJcmV0dXJuIGluYiAoU1RBVFBPUlQgKHBoeXNfZGV2KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlucHV0X2F2YWlsICh2b2lkKQoreworCXJldHVybiAhKHdmX21wdV9zdGF0dXMoKSAmIElOUFVUX0FWQUlMKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgb3V0cHV0X3JlYWR5ICh2b2lkKQoreworCXJldHVybiAhKHdmX21wdV9zdGF0dXMoKSAmIE9VVFBVVF9SRUFEWSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50ICByZWFkX2RhdGEgKHZvaWQpCit7CisJcmV0dXJuIGluYiAoREFUQVBPUlQgKHBoeXNfZGV2KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZV9kYXRhICh1bnNpZ25lZCBjaGFyIGJ5dGUpCit7CisJb3V0YiAoYnl0ZSwgREFUQVBPUlQgKHBoeXNfZGV2KSk7Cit9CisKKy8qCisgKiBTdGF0ZXMgZm9yIHRoZSBpbnB1dCBzY2FubmVyIChzaG91bGQgYmUgaW4gZGV2X3RhYmxlLmgpCisgKi8KKworI2RlZmluZSBNU1RfU1lTTVNHCQkxMDAJLyogU3lzdGVtIG1lc3NhZ2UgKHN5c3ggZXRjKS4gKi8KKyNkZWZpbmUgTVNUX01UQwkJCTEwMgkvKiBNaWRpIFRpbWUgQ29kZSAoTVRDKSBxZnJhbWUgbXNnICovCisjZGVmaW5lIE1TVF9TT05HU0VMCQkxMDMJLyogU29uZyBzZWxlY3QgKi8KKyNkZWZpbmUgTVNUX1NPTkdQT1MJCTEwNAkvKiBTb25nIHBvc2l0aW9uIHBvaW50ZXIgKi8KKyNkZWZpbmUgTVNUX1RJTUVECQkxMDUJLyogTGVhZGluZyB0aW1pbmcgYnl0ZSByY3ZkICovCisKKy8qIGJ1ZmZlciBzcGFjZSBjaGVjayBmb3IgaW5wdXQgc2Nhbm5lciAqLworCisjZGVmaW5lIEJVRlRFU1QobWkpIGlmIChtaS0+bV9wdHIgPj0gTUlfTUFYIHx8IG1pLT5tX3B0ciA8IDApIFwKK3twcmludGsoS0VSTl9FUlIgIldGLU1QVTogSW52YWxpZCBidWZmZXIgcG9pbnRlciAlZC8lZCwgcz0lZFxuIiwgXAorCW1pLT5tX3B0ciwgbWktPm1fbGVmdCwgbWktPm1fc3RhdGUpO21pLT5tX3B0ci0tO30KKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbGVuX3RhYltdID0JLyogIyBvZiBkYXRhIGJ5dGVzIGZvbGxvd2luZyBhIHN0YXR1cworCQkJCQkgKi8KK3sKKwkyLAkJCQkvKiA4eCAqLworCTIsCQkJCS8qIDl4ICovCisJMiwJCQkJLyogQXggKi8KKwkyLAkJCQkvKiBCeCAqLworCTEsCQkJCS8qIEN4ICovCisJMSwJCQkJLyogRHggKi8KKwkyLAkJCQkvKiBFeCAqLworCTAJCQkJLyogRnggKi8KK307CisKK3N0YXRpYyBpbnQKK3dmX21wdV9pbnB1dF9zY2FubmVyIChpbnQgZGV2bm8sIGludCBzeW50aGRldiwgdW5zaWduZWQgY2hhciBtaWRpYykKKworeworCXN0cnVjdCBtaWRpX2lucHV0X2luZm8gKm1pID0gJm1pZGlfZGV2c1tkZXZub10tPmluX2luZm87CisKKwlzd2l0Y2ggKG1pLT5tX3N0YXRlKSB7CisJY2FzZSBNU1RfSU5JVDoKKwkJc3dpdGNoIChtaWRpYykgeworCQljYXNlIDB4Zjg6CisJCQkvKiBUaW1lciBvdmVyZmxvdyAqLworCQkJYnJlYWs7CisJCQorCQljYXNlIDB4ZmM6CisJCQlicmVhazsKKwkJCisJCWNhc2UgMHhmZDoKKwkJCS8qIFhYWCBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggdGhpcy4gSWYgdGhlcmUgaXMKKwkJCSAgIGFuIGV4dGVybmFsIE1JREkgdGltZXIgKGUuZy4gYSBoYXJkd2FyZSBzZXF1ZW5jZXIsCisJCQkgICBhIHVzZWZ1bCB0aW1lciBjYW4gYmUgZGVyaXZlZCAuLi4KKwkJICAgCisJCQkgICBGb3Igbm93LCBubyB0aW1lciBzdXBwb3J0LgorCQkJKi8KKwkJCWJyZWFrOworCQkKKwkJY2FzZSAweGZlOgorCQkJcmV0dXJuIE1QVV9BQ0s7CisJCQlicmVhazsKKwkJCisJCWNhc2UgMHhmMDoKKwkJY2FzZSAweGYxOgorCQljYXNlIDB4ZjI6CisJCWNhc2UgMHhmMzoKKwkJY2FzZSAweGY0OgorCQljYXNlIDB4ZjU6CisJCWNhc2UgMHhmNjoKKwkJY2FzZSAweGY3OgorCQkJYnJlYWs7CisJCQorCQljYXNlIDB4Zjk6CisJCQlicmVhazsKKwkJCisJCWNhc2UgMHhmZjoKKwkJCW1pLT5tX3N0YXRlID0gTVNUX1NZU01TRzsKKwkJCWJyZWFrOworCQkKKwkJZGVmYXVsdDoKKwkJCWlmIChtaWRpYyA8PSAweGVmKSB7CisJCQkJbWktPm1fc3RhdGUgPSBNU1RfVElNRUQ7CisJCQl9CisJCQllbHNlCisJCQkJcHJpbnRrIChLRVJOX0VSUiAiPE1QVTogVW5rbm93biBldmVudCAlMDJ4PiAiLAorCQkJCQltaWRpYyk7CisJCX0KKwkJYnJlYWs7CisJICAKKwljYXNlIE1TVF9USU1FRDoKKwl7CisJCWludCAgICAgICAgICAgICBtc2cgPSAoKGludCkgKG1pZGljICYgMHhmMCkgPj4gNCk7CisJICAKKwkJbWktPm1fc3RhdGUgPSBNU1RfREFUQTsKKwkgIAorCQlpZiAobXNnIDwgOCkgewkvKiBEYXRhIGJ5dGUgKi8KKwkgICAgICAKKwkJCW1zZyA9ICgoaW50KSAobWktPm1fcHJldl9zdGF0dXMgJiAweGYwKSA+PiA0KTsKKwkJCW1zZyAtPSA4OworCQkJbWktPm1fbGVmdCA9IGxlbl90YWJbbXNnXSAtIDE7CisJICAgICAgCisJCQltaS0+bV9wdHIgPSAyOworCQkJbWktPm1fYnVmWzBdID0gbWktPm1fcHJldl9zdGF0dXM7CisJCQltaS0+bV9idWZbMV0gPSBtaWRpYzsKKworCQkJaWYgKG1pLT5tX2xlZnQgPD0gMCkgeworCQkJCW1pLT5tX3N0YXRlID0gTVNUX0lOSVQ7CisJCQkJZG9fbWlkaV9tc2cgKHN5bnRoZGV2LCBtaS0+bV9idWYsIG1pLT5tX3B0cik7CisJCQkJbWktPm1fcHRyID0gMDsKKwkJCX0KKwkJfSBlbHNlIGlmIChtc2cgPT0gMHhmKSB7CS8qIE1QVSBNQVJLICovCisJICAgICAgCisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCisJCQlzd2l0Y2ggKG1pZGljKSB7CisJCQljYXNlIDB4Zjg6CisJCQkJYnJlYWs7CisJCSAgICAKKwkJCWNhc2UgMHhmOToKKwkJCQlicmVhazsKKwkJICAgIAorCQkJY2FzZSAweGZjOgorCQkJCWJyZWFrOworCQkgICAgCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJbWktPm1fcHJldl9zdGF0dXMgPSBtaWRpYzsKKwkJCW1zZyAtPSA4OworCQkJbWktPm1fbGVmdCA9IGxlbl90YWJbbXNnXTsKKwkgICAgICAKKwkJCW1pLT5tX3B0ciA9IDE7CisJCQltaS0+bV9idWZbMF0gPSBtaWRpYzsKKwkgICAgICAKKwkJCWlmIChtaS0+bV9sZWZ0IDw9IDApIHsKKwkJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJCWRvX21pZGlfbXNnIChzeW50aGRldiwgbWktPm1fYnVmLCBtaS0+bV9wdHIpOworCQkJCW1pLT5tX3B0ciA9IDA7CisJCQl9CisJCX0KKwl9CisJYnJlYWs7CisKKwljYXNlIE1TVF9TWVNNU0c6CisJCXN3aXRjaCAobWlkaWMpIHsKKwkJY2FzZSAweGYwOgorCQkJbWktPm1fc3RhdGUgPSBNU1RfU1lTRVg7CisJCQlicmVhazsKKwkgICAgCisJCWNhc2UgMHhmMToKKwkJCW1pLT5tX3N0YXRlID0gTVNUX01UQzsKKwkJCWJyZWFrOworCisJCWNhc2UgMHhmMjoKKwkJCW1pLT5tX3N0YXRlID0gTVNUX1NPTkdQT1M7CisJCQltaS0+bV9wdHIgPSAwOworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4ZjM6CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9TT05HU0VMOworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4ZjY6CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCSAgICAKKwkJCS8qCisJCQkgKiAgICBSZWFsIHRpbWUgbWVzc2FnZXMKKwkJCSAqLworCQljYXNlIDB4Zjg6CisJCQkvKiBtaWRpIGNsb2NrICovCisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJLyogWFhYIG5lZWQgZXh0IE1JREkgdGltZXIgc3VwcG9ydCAqLworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4ZkE6CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJLyogWFhYIG5lZWQgZXh0IE1JREkgdGltZXIgc3VwcG9ydCAqLworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4RkI6CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJLyogWFhYIG5lZWQgZXh0IE1JREkgdGltZXIgc3VwcG9ydCAqLworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4RkM6CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJLyogWFhYIG5lZWQgZXh0IE1JREkgdGltZXIgc3VwcG9ydCAqLworCQkJYnJlYWs7CisJICAgIAorCQljYXNlIDB4RkU6CisJCQkvKiBhY3RpdmUgc2Vuc2luZyAqLworCQkJbWktPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJCWJyZWFrOworCSAgICAKKwkJY2FzZSAweGZmOgorCQkJbWktPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGsgKEtFUk5fRVJSICJ1bmtub3duIE1JREkgc3lzbXNnICUweFxuIiwgbWlkaWMpOworCQkJbWktPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJfQorCQlicmVhazsKKworCWNhc2UgTVNUX01UQzoKKwkJbWktPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJYnJlYWs7CisKKwljYXNlIE1TVF9TWVNFWDoKKwkJaWYgKG1pZGljID09IDB4ZjcpIHsKKwkJCW1pLT5tX3N0YXRlID0gTVNUX0lOSVQ7CisJCX0gZWxzZSB7CisJCQkvKiBYWFggZml4IG1lICovCisJCX0KKwkJYnJlYWs7CisKKwljYXNlIE1TVF9TT05HUE9TOgorCQlCVUZURVNUIChtaSk7CisJCW1pLT5tX2J1ZlttaS0+bV9wdHIrK10gPSBtaWRpYzsKKwkJaWYgKG1pLT5tX3B0ciA9PSAyKSB7CisJCQltaS0+bV9zdGF0ZSA9IE1TVF9JTklUOworCQkJbWktPm1fcHRyID0gMDsKKwkJCS8qIFhYWCBuZWVkIGV4dCBNSURJIHRpbWVyIHN1cHBvcnQgKi8KKwkJfQorCQlicmVhazsKKworCWNhc2UgTVNUX0RBVEE6CisJCUJVRlRFU1QgKG1pKTsKKwkJbWktPm1fYnVmW21pLT5tX3B0cisrXSA9IG1pZGljOworCQlpZiAoKC0tbWktPm1fbGVmdCkgPD0gMCkgeworCQkJbWktPm1fc3RhdGUgPSBNU1RfSU5JVDsKKwkJCWRvX21pZGlfbXNnIChzeW50aGRldiwgbWktPm1fYnVmLCBtaS0+bV9wdHIpOworCQkJbWktPm1fcHRyID0gMDsKKwkJfQorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ayAoS0VSTl9FUlIgIkJhZCBzdGF0ZSAlZCAiLCBtaS0+bV9zdGF0ZSk7CisJCW1pLT5tX3N0YXRlID0gTVNUX0lOSVQ7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdAord2ZfbXB1aW50cihpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpkdW1teSkKKworeworCXN0cnVjdCB3Zl9tcHVfY29uZmlnICpwaHlzaWNhbF9kZXYgPSBkZXZfaWQ7CisJc3RhdGljIHN0cnVjdCB3Zl9tcHVfY29uZmlnICppbnB1dF9kZXY7CisJc3RydWN0IG1pZGlfaW5wdXRfaW5mbyAqbWkgPSAmbWlkaV9kZXZzW3BoeXNpY2FsX2Rldi0+ZGV2bm9dLT5pbl9pbmZvOworCWludCBuOworCisJaWYgKCFpbnB1dF9hdmFpbCgpKSB7IC8qIG5vdCBmb3IgdXMgKi8KKwkJcmV0dXJuIElSUV9OT05FOworCX0KKworCWlmIChtaS0+bV9idXN5KQorCQlyZXR1cm4gSVJRX0hBTkRMRUQ7CisJc3Bpbl9sb2NrKCZsb2NrKTsKKwltaS0+bV9idXN5ID0gMTsKKworCWlmICghaW5wdXRfZGV2KSB7CisJCWlucHV0X2RldiA9IHBoeXNpY2FsX2RldjsKKwl9CisKKwluID0gNTA7IC8qIFhYWCB3aHkgPyAqLworCisJZG8geworCQl1bnNpZ25lZCBjaGFyIGMgPSByZWFkX2RhdGEgKCk7CisgICAgICAKKwkJaWYgKHBoeXNfZGV2LT5pc3ZpcnR1YWwpIHsKKworCQkJaWYgKGMgPT0gV0ZfRVhURVJOQUxfU1dJVENIKSB7CisJCQkJaW5wdXRfZGV2ID0gdmlydF9kZXY7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKGMgPT0gV0ZfSU5URVJOQUxfU1dJVENIKSB7IAorCQkJCWlucHV0X2RldiA9IHBoeXNfZGV2OworCQkJCWNvbnRpbnVlOworCQkJfSAvKiBlbHNlIGp1c3QgbGVhdmUgaXQgYXMgaXQgaXMgKi8KKworCQl9IGVsc2UgeworCQkJaW5wdXRfZGV2ID0gcGh5c19kZXY7CisJCX0KKworCQlpZiAoaW5wdXRfZGV2LT5tb2RlID09IE1PREVfU1lOVEgpIHsKKwkgIAorCQkJd2ZfbXB1X2lucHV0X3NjYW5uZXIgKGlucHV0X2Rldi0+ZGV2bm8sCisJCQkJCSAgICAgIGlucHV0X2Rldi0+c3ludGhubywgYyk7CisJICAKKwkJfSBlbHNlIGlmIChpbnB1dF9kZXYtPm9wZW5lZCAmIE9QRU5fUkVBRCkgeworCSAgCisJCQlpZiAoaW5wdXRfZGV2LT5pbnB1dGludHIpIHsKKwkJCQlpbnB1dF9kZXYtPmlucHV0aW50ciAoaW5wdXRfZGV2LT5kZXZubywgYyk7CisJCQl9IAorCQl9CisKKwl9IHdoaWxlIChpbnB1dF9hdmFpbCgpICYmIG4tLSA+IDApOworCisJbWktPm1fYnVzeSA9IDA7CisJc3Bpbl91bmxvY2soJmxvY2spOworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGludAord2ZfbXB1X29wZW4gKGludCBkZXYsIGludCBtb2RlLAorCSAgICAgdm9pZCAgICAgICAgICAgICgqaW5wdXQpIChpbnQgZGV2LCB1bnNpZ25lZCBjaGFyIGRhdGEpLAorCSAgICAgdm9pZCAgICAgICAgICAgICgqb3V0cHV0KSAoaW50IGRldikKKwkpCit7CisJc3RydWN0IHdmX21wdV9jb25maWcgKmRldmM7CisKKwlpZiAoZGV2IDwgMCB8fCBkZXYgPj0gbnVtX21pZGlzIHx8IG1pZGlfZGV2c1tkZXZdPT1OVUxMKQorCQlyZXR1cm4gLShFTlhJTyk7CisKKwlpZiAocGh5c19kZXYtPmRldm5vID09IGRldikgeworCQlkZXZjID0gcGh5c19kZXY7CisJfSBlbHNlIGlmIChwaHlzX2Rldi0+aXN2aXJ0dWFsICYmIHZpcnRfZGV2LT5kZXZubyA9PSBkZXYpIHsKKwkJZGV2YyA9IHZpcnRfZGV2OworCX0gZWxzZSB7CisJCXByaW50ayAoS0VSTl9FUlIgIldGLU1QVTogdW5rbm93biBkZXZpY2UgbnVtYmVyICVkXG4iLCBkZXYpOworCQlyZXR1cm4gLShFSU5WQUwpOworCX0KKworCWlmIChkZXZjLT5vcGVuZWQpIHsKKwkJcmV0dXJuIC0oRUJVU1kpOworCX0KKworCWRldmMtPm1vZGUgPSBNT0RFX01JREk7CisJZGV2Yy0+b3BlbmVkID0gbW9kZTsKKwlkZXZjLT5zeW50aG5vID0gMDsKKworCWRldmMtPmlucHV0aW50ciA9IGlucHV0OworCXJldHVybiAwOworfQorIAorc3RhdGljIHZvaWQKK3dmX21wdV9jbG9zZSAoaW50IGRldikKK3sKKwlzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAqZGV2YzsKKworCWlmIChkZXYgPCAwIHx8IGRldiA+PSBudW1fbWlkaXMgfHwgbWlkaV9kZXZzW2Rldl09PU5VTEwpCisJCXJldHVybjsKKworCWlmIChwaHlzX2Rldi0+ZGV2bm8gPT0gZGV2KSB7CisJCWRldmMgPSBwaHlzX2RldjsKKwl9IGVsc2UgaWYgKHBoeXNfZGV2LT5pc3ZpcnR1YWwgJiYgdmlydF9kZXYtPmRldm5vID09IGRldikgeworCQlkZXZjID0gdmlydF9kZXY7CisJfSBlbHNlIHsKKwkJcHJpbnRrIChLRVJOX0VSUiAiV0YtTVBVOiB1bmtub3duIGRldmljZSBudW1iZXIgJWRcbiIsIGRldik7CisJCXJldHVybjsKKwl9CisKKwlkZXZjLT5tb2RlID0gMDsKKwlkZXZjLT5pbnB1dGludHIgPSBOVUxMOworCWRldmMtPm9wZW5lZCA9IDA7Cit9CisKK3N0YXRpYyBpbnQKK3dmX21wdV9vdXQgKGludCBkZXYsIHVuc2lnbmVkIGNoYXIgbWlkaV9ieXRlKQoreworCWludCAgICAgICAgICAgICB0aW1lb3V0OworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKwlzdGF0aWMgaW50IGxhc3RvdXRkZXYgPSAtMTsKKwl1bnNpZ25lZCBjaGFyIHN3aXRjaGNoOworCisJaWYgKHBoeXNfZGV2LT5pc3ZpcnR1YWwgJiYgbGFzdG91dGRldiAhPSBkZXYpIHsKKyAgICAgIAorCQlpZiAoZGV2ID09IHBoeXNfZGV2LT5kZXZubykgeyAKKwkJCXN3aXRjaGNoID0gV0ZfSU5URVJOQUxfU1dJVENIOworCQl9IGVsc2UgaWYgKGRldiA9PSB2aXJ0X2Rldi0+ZGV2bm8pIHsgCisJCQlzd2l0Y2hjaCA9IFdGX0VYVEVSTkFMX1NXSVRDSDsKKwkJfSBlbHNlIHsKKwkJCXByaW50ayAoS0VSTl9FUlIgIldGLU1QVTogYmFkIGRldmljZSBudW1iZXIgJWQiLCBkZXYpOworCQkJcmV0dXJuICgwKTsKKwkJfQorCisJCS8qIFhYWCBmaXggbWUgKi8KKyAgICAgIAorCQlmb3IgKHRpbWVvdXQgPSAzMDAwMDsgdGltZW91dCA+IDAgJiYgIW91dHB1dF9yZWFkeSAoKTsKKwkJICAgICB0aW1lb3V0LS0pOworICAgICAgCisJCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKyAgICAgIAorCQlpZiAoIW91dHB1dF9yZWFkeSAoKSkgeworCQkJcHJpbnRrIChLRVJOX1dBUk5JTkcgIldGLU1QVTogU2VuZCBzd2l0Y2ggIgorCQkJCSJieXRlIHRpbWVvdXRcbiIpOworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJCQlyZXR1cm4gMDsKKwkJfQorICAgICAgCisJCXdyaXRlX2RhdGEgKHN3aXRjaGNoKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisJfSAKKworCWxhc3RvdXRkZXYgPSBkZXY7CisKKwkvKgorCSAqIFNvbWV0aW1lcyBpdCB0YWtlcyBhYm91dCAzMDAwMCBsb29wcyBiZWZvcmUgdGhlIG91dHB1dCBiZWNvbWVzIHJlYWR5CisJICogKEFmdGVyIHJlc2V0KS4gTm9ybWFsbHkgaXQgdGFrZXMganVzdCBhYm91dCAxMCBsb29wcy4KKwkgKi8KKworCS8qIFhYWCBmaXggbWUgKi8KKworCWZvciAodGltZW91dCA9IDMwMDAwOyB0aW1lb3V0ID4gMCAmJiAhb3V0cHV0X3JlYWR5ICgpOyB0aW1lb3V0LS0pOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxvY2ssZmxhZ3MpOworCWlmICghb3V0cHV0X3JlYWR5ICgpKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxvY2ssZmxhZ3MpOworCQlwcmludGsgKEtFUk5fV0FSTklORyAiV0YtTVBVOiBTZW5kIGRhdGEgdGltZW91dFxuIik7CisJCXJldHVybiAwOworCX0KKworCXdyaXRlX2RhdGEgKG1pZGlfYnl0ZSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2ZfbXB1X3N0YXJ0X3JlYWQgKGludCBkZXYpIHsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2ZfbXB1X2VuZF9yZWFkIChpbnQgZGV2KSB7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2ZfbXB1X2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBjbWQsIHZvaWQgX191c2VyICphcmcpCit7CisJcHJpbnRrIChLRVJOX1dBUk5JTkcKKwkJIldGLU1QVTogSW50ZWxsaWdlbnQgbW9kZSBub3Qgc3VwcG9ydGVkIGJ5IGhhcmR3YXJlLlxuIik7CisJcmV0dXJuIC0oRUlOVkFMKTsKK30KKworc3RhdGljIGludCB3Zl9tcHVfYnVmZmVyX3N0YXR1cyAoaW50IGRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBzeW50aF9vcGVyYXRpb25zIHdmX21wdV9zeW50aF9vcGVyYXRpb25zWzJdOworc3RhdGljIHN0cnVjdCBtaWRpX29wZXJhdGlvbnMgIHdmX21wdV9taWRpX29wZXJhdGlvbnNbMl07CisKK3N0YXRpYyBzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zIHdmX21wdV9taWRpX3Byb3RvID0KK3sKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmluZm8JCT0geyJXRi1NUFUgTUlESSIsIDAsIE1JRElfQ0FQX01QVTQwMSwgU05EQ0FSRF9NUFU0MDF9LAorCS5pbl9pbmZvCT0gezB9LCAgIC8qIGluX2luZm8gKi8KKwkub3BlbgkJPSB3Zl9tcHVfb3BlbiwKKwkuY2xvc2UJCT0gd2ZfbXB1X2Nsb3NlLAorCS5pb2N0bAkJPSB3Zl9tcHVfaW9jdGwsCisJLm91dHB1dGMJPSB3Zl9tcHVfb3V0LAorCS5zdGFydF9yZWFkCT0gd2ZfbXB1X3N0YXJ0X3JlYWQsCisJLmVuZF9yZWFkCT0gd2ZfbXB1X2VuZF9yZWFkLAorCS5idWZmZXJfc3RhdHVzCT0gd2ZfbXB1X2J1ZmZlcl9zdGF0dXMsCit9OworCitzdGF0aWMgc3RydWN0IHN5bnRoX2luZm8gd2ZfbXB1X3N5bnRoX2luZm9fcHJvdG8gPQoreyJXYXZlRnJvbnQgTVBVLTQwMSBpbnRlcmZhY2UiLCAwLAorIFNZTlRIX1RZUEVfTUlESSwgTUlESV9UWVBFX01QVTQwMSwgMCwgMTI4LCAwLCAxMjgsIFNZTlRIX0NBUF9JTlBVVH07CisKK3N0YXRpYyBzdHJ1Y3Qgc3ludGhfaW5mbyB3Zl9tcHVfc3ludGhfaW5mb1syXTsKKworc3RhdGljIGludAord2ZfbXB1X3N5bnRoX2lvY3RsIChpbnQgZGV2LCB1bnNpZ25lZCBpbnQgY21kLCB2b2lkIF9fdXNlciAqYXJnKQoreworCWludCAgICAgICAgICAgICBtaWRpX2RldjsKKwlpbnQgaW5kZXg7CisKKwltaWRpX2RldiA9IHN5bnRoX2RldnNbZGV2XS0+bWlkaV9kZXY7CisKKwlpZiAobWlkaV9kZXYgPCAwIHx8IG1pZGlfZGV2ID4gbnVtX21pZGlzIHx8IG1pZGlfZGV2c1ttaWRpX2Rldl09PU5VTEwpCisJCXJldHVybiAtKEVOWElPKTsKKworCWlmIChtaWRpX2RldiA9PSBwaHlzX2Rldi0+ZGV2bm8pIHsKKwkJaW5kZXggPSAwOworCX0gZWxzZSBpZiAocGh5c19kZXYtPmlzdmlydHVhbCAmJiBtaWRpX2RldiA9PSB2aXJ0X2Rldi0+ZGV2bm8pIHsKKwkJaW5kZXggPSAxOworCX0gZWxzZSB7CisJCXJldHVybiAtKEVJTlZBTCk7CisJfQorCisJc3dpdGNoIChjbWQpIHsKKworCWNhc2UgU05EQ1RMX1NZTlRIX0lORk86CisJCWlmIChjb3B5X3RvX3VzZXIoYXJnLAorCQkJICAgICAgJndmX21wdV9zeW50aF9pbmZvW2luZGV4XSwKKwkJCSAgICAgIHNpemVvZiAoc3RydWN0IHN5bnRoX2luZm8pKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlyZXR1cm4gMDsKKwkKKwljYXNlIFNORENUTF9TWU5USF9NRU1BVkw6CisJCXJldHVybiAweDdmZmZmZmZmOworCQorCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KK30KKworc3RhdGljIGludAord2ZfbXB1X3N5bnRoX29wZW4gKGludCBkZXYsIGludCBtb2RlKQoreworCWludCAgICAgICAgICAgICBtaWRpX2RldjsKKwlzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAqZGV2YzsKKworCW1pZGlfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKworCWlmIChtaWRpX2RldiA8IDAgfHwgbWlkaV9kZXYgPiBudW1fbWlkaXMgfHwgbWlkaV9kZXZzW21pZGlfZGV2XT09TlVMTCkgeworCQlyZXR1cm4gLShFTlhJTyk7CisJfQorICAKKwlpZiAocGh5c19kZXYtPmRldm5vID09IG1pZGlfZGV2KSB7CisJCWRldmMgPSBwaHlzX2RldjsKKwl9IGVsc2UgaWYgKHBoeXNfZGV2LT5pc3ZpcnR1YWwgJiYgdmlydF9kZXYtPmRldm5vID09IG1pZGlfZGV2KSB7CisJCWRldmMgPSB2aXJ0X2RldjsKKwl9IGVsc2UgeworCQlwcmludGsgKEtFUk5fRVJSICJXRi1NUFU6IHVua25vd24gZGV2aWNlIG51bWJlciAlZFxuIiwgZGV2KTsKKwkJcmV0dXJuIC0oRUlOVkFMKTsKKwl9CisKKwlpZiAoZGV2Yy0+b3BlbmVkKSB7CisJCXJldHVybiAtKEVCVVNZKTsKKwl9CisgIAorCWRldmMtPm1vZGUgPSBNT0RFX1NZTlRIOworCWRldmMtPnN5bnRobm8gPSBkZXY7CisJZGV2Yy0+b3BlbmVkID0gbW9kZTsKKwlkZXZjLT5pbnB1dGludHIgPSBOVUxMOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAord2ZfbXB1X3N5bnRoX2Nsb3NlIChpbnQgZGV2KQoreworCWludCAgICAgICAgICAgICBtaWRpX2RldjsKKwlzdHJ1Y3Qgd2ZfbXB1X2NvbmZpZyAqZGV2YzsKKworCW1pZGlfZGV2ID0gc3ludGhfZGV2c1tkZXZdLT5taWRpX2RldjsKKworCWlmIChwaHlzX2Rldi0+ZGV2bm8gPT0gbWlkaV9kZXYpIHsKKwkJZGV2YyA9IHBoeXNfZGV2OworCX0gZWxzZSBpZiAocGh5c19kZXYtPmlzdmlydHVhbCAmJiB2aXJ0X2Rldi0+ZGV2bm8gPT0gbWlkaV9kZXYpIHsKKwkJZGV2YyA9IHZpcnRfZGV2OworCX0gZWxzZSB7CisJCXByaW50ayAoS0VSTl9FUlIgIldGLU1QVTogdW5rbm93biBkZXZpY2UgbnVtYmVyICVkXG4iLCBkZXYpOworCQlyZXR1cm47CisJfQorCisJZGV2Yy0+aW5wdXRpbnRyID0gTlVMTDsKKwlkZXZjLT5vcGVuZWQgPSAwOworCWRldmMtPm1vZGUgPSAwOworfQorCisjZGVmaW5lIF9NSURJX1NZTlRIX0NfCisjZGVmaW5lIE1JRElfU1lOVEhfTkFNRQkiV2F2ZUZyb250IChNSURJKSIKKyNkZWZpbmUgTUlESV9TWU5USF9DQVBTCVNZTlRIX0NBUF9JTlBVVAorI2luY2x1ZGUgIm1pZGlfc3ludGguaCIKKworc3RhdGljIHN0cnVjdCBzeW50aF9vcGVyYXRpb25zIHdmX21wdV9zeW50aF9wcm90byA9Cit7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5pZAkJPSAiV2F2ZUZyb250IChJQ1MyMTE1KSIsCisJLmluZm8JCT0gTlVMTCwgIC8qIGluZm8gZmllbGQsIGZpbGxlZCBpbiBkdXJpbmcgY29uZmlndXJhdGlvbiAqLworCS5taWRpX2Rldgk9IDAsICAgICAvKiBNSURJIGRldiBYWFggc2hvdWxkIHRoaXMgYmUgLTEgPyAqLworCS5zeW50aF90eXBlCT0gU1lOVEhfVFlQRV9NSURJLAorCS5zeW50aF9zdWJ0eXBlCT0gU0FNUExFX1RZUEVfV0FWRUZST05ULAorCS5vcGVuCQk9IHdmX21wdV9zeW50aF9vcGVuLAorCS5jbG9zZQkJPSB3Zl9tcHVfc3ludGhfY2xvc2UsCisJLmlvY3RsCQk9IHdmX21wdV9zeW50aF9pb2N0bCwKKwkua2lsbF9ub3RlCT0gbWlkaV9zeW50aF9raWxsX25vdGUsCisJLnN0YXJ0X25vdGUJPSBtaWRpX3N5bnRoX3N0YXJ0X25vdGUsCisJLnNldF9pbnN0cgk9IG1pZGlfc3ludGhfc2V0X2luc3RyLAorCS5yZXNldAkJPSBtaWRpX3N5bnRoX3Jlc2V0LAorCS5od19jb250cm9sCT0gbWlkaV9zeW50aF9od19jb250cm9sLAorCS5sb2FkX3BhdGNoCT0gbWlkaV9zeW50aF9sb2FkX3BhdGNoLAorCS5hZnRlcnRvdWNoCT0gbWlkaV9zeW50aF9hZnRlcnRvdWNoLAorCS5jb250cm9sbGVyCT0gbWlkaV9zeW50aF9jb250cm9sbGVyLAorCS5wYW5uaW5nCT0gbWlkaV9zeW50aF9wYW5uaW5nLAorCS5iZW5kZXIJCT0gbWlkaV9zeW50aF9iZW5kZXIsCisJLnNldHVwX3ZvaWNlCT0gbWlkaV9zeW50aF9zZXR1cF92b2ljZSwKKwkuc2VuZF9zeXNleAk9IG1pZGlfc3ludGhfc2VuZF9zeXNleAorfTsKKworc3RhdGljIGludAorY29uZmlnX3dmX21wdSAoc3RydWN0IHdmX21wdV9jb25maWcgKmRldikKKworeworCWludCBpc19leHRlcm5hbDsKKwljaGFyICpuYW1lOworCWludCBpbmRleDsKKworCWlmIChkZXYgPT0gcGh5c19kZXYpIHsKKwkJbmFtZSA9ICJXYXZlRnJvbnQgaW50ZXJuYWwgTUlESSI7CisJCWlzX2V4dGVybmFsID0gMDsKKwkJaW5kZXggPSAwOworCQltZW1jcHkgKChjaGFyICopICZ3Zl9tcHVfc3ludGhfb3BlcmF0aW9uc1tpbmRleF0sCisJCQkoY2hhciAqKSAmd2ZfbXB1X3N5bnRoX3Byb3RvLAorCQkJc2l6ZW9mIChzdHJ1Y3Qgc3ludGhfb3BlcmF0aW9ucykpOworCX0gZWxzZSB7CisJCW5hbWUgPSAiV2F2ZUZyb250IGV4dGVybmFsIE1JREkiOworCQlpc19leHRlcm5hbCA9IDE7CisJCWluZGV4ID0gMTsKKwkJLyogbm8gc3ludGggb3BlcmF0aW9ucyBmb3IgYW4gZXh0ZXJuYWwgTUlESSBpbnRlcmZhY2UgKi8KKwl9CisKKwltZW1jcHkgKChjaGFyICopICZ3Zl9tcHVfc3ludGhfaW5mb1tkZXYtPmRldm5vXSwKKwkJKGNoYXIgKikgJndmX21wdV9zeW50aF9pbmZvX3Byb3RvLAorCQlzaXplb2YgKHN0cnVjdCBzeW50aF9pbmZvKSk7CisKKwlzdHJjcHkgKHdmX21wdV9zeW50aF9pbmZvW2luZGV4XS5uYW1lLCBuYW1lKTsKKworCXdmX21wdV9zeW50aF9vcGVyYXRpb25zW2luZGV4XS5taWRpX2RldiA9IGRldi0+ZGV2bm87CisJd2ZfbXB1X3N5bnRoX29wZXJhdGlvbnNbaW5kZXhdLmluZm8gPSAmd2ZfbXB1X3N5bnRoX2luZm9baW5kZXhdOworCisJbWVtY3B5ICgoY2hhciAqKSAmd2ZfbXB1X21pZGlfb3BlcmF0aW9uc1tpbmRleF0sCisJCShjaGFyICopICZ3Zl9tcHVfbWlkaV9wcm90bywKKwkJc2l6ZW9mIChzdHJ1Y3QgbWlkaV9vcGVyYXRpb25zKSk7CisgIAorCWlmIChpc19leHRlcm5hbCkgeworCQl3Zl9tcHVfbWlkaV9vcGVyYXRpb25zW2luZGV4XS5jb252ZXJ0ZXIgPSBOVUxMOworCX0gZWxzZSB7CisJCXdmX21wdV9taWRpX29wZXJhdGlvbnNbaW5kZXhdLmNvbnZlcnRlciA9CisJCQkmd2ZfbXB1X3N5bnRoX29wZXJhdGlvbnNbaW5kZXhdOworCX0KKworCXN0cmNweSAod2ZfbXB1X21pZGlfb3BlcmF0aW9uc1tpbmRleF0uaW5mby5uYW1lLCBuYW1lKTsKKworCW1pZGlfZGV2c1tkZXYtPmRldm5vXSA9ICZ3Zl9tcHVfbWlkaV9vcGVyYXRpb25zW2luZGV4XTsKKwltaWRpX2RldnNbZGV2LT5kZXZub10tPmluX2luZm8ubV9idXN5ID0gMDsKKwltaWRpX2RldnNbZGV2LT5kZXZub10tPmluX2luZm8ubV9zdGF0ZSA9IE1TVF9JTklUOworCW1pZGlfZGV2c1tkZXYtPmRldm5vXS0+aW5faW5mby5tX3B0ciA9IDA7CisJbWlkaV9kZXZzW2Rldi0+ZGV2bm9dLT5pbl9pbmZvLm1fbGVmdCA9IDA7CisJbWlkaV9kZXZzW2Rldi0+ZGV2bm9dLT5pbl9pbmZvLm1fcHJldl9zdGF0dXMgPSAwOworCisJZGV2c1tpbmRleF0ub3BlbmVkID0gMDsKKwlkZXZzW2luZGV4XS5tb2RlID0gMDsKKworCXJldHVybiAoMCk7Cit9CisKK2ludCB2aXJ0dWFsX21pZGlfZW5hYmxlICh2b2lkKQorCit7CisJaWYgKCh2aXJ0X2Rldi0+ZGV2bm8gPCAwKSAmJgorCSAgICAodmlydF9kZXYtPmRldm5vID0gc291bmRfYWxsb2NfbWlkaWRldigpKSA9PSAtMSkgeworCQlwcmludGsgKEtFUk5fRVJSCisJCQkiV0YtTVBVOiB0b28gbWFueSBtaWRpIGRldmljZXMgZGV0ZWN0ZWRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJY29uZmlnX3dmX21wdSAodmlydF9kZXYpOworCisJcGh5c19kZXYtPmlzdmlydHVhbCA9IDE7CisJcmV0dXJuIHZpcnRfZGV2LT5kZXZubzsKK30KKworaW50Cit2aXJ0dWFsX21pZGlfZGlzYWJsZSAodm9pZCkKKworeworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbG9jayxmbGFncyk7CisKKwl3Zl9tcHVfY2xvc2UgKHZpcnRfZGV2LT5kZXZubyk7CisJLyogbm8gc3ludGggb24gdmlydF9kZXYsIHNvIG5vIG5lZWQgdG8gY2FsbCB3Zl9tcHVfc3ludGhfY2xvc2UoKSAqLworCXBoeXNfZGV2LT5pc3ZpcnR1YWwgPSAwOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbG9jayxmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBkZXRlY3Rfd2ZfbXB1IChpbnQgaXJxLCBpbnQgaW9fYmFzZSkKK3sKKwlpZiAoIXJlcXVlc3RfcmVnaW9uKGlvX2Jhc2UsIDIsICJ3YXZlZnJvbnQgbWlkaSIpKSB7CisJCXByaW50ayAoS0VSTl9XQVJOSU5HICJXRi1NUFU6IEkvTyBwb3J0ICV4IGFscmVhZHkgaW4gdXNlLlxuIiwKKwkJCWlvX2Jhc2UpOworCQlyZXR1cm4gLTE7CisJfQorCisJcGh5c19kZXYtPmJhc2UgPSBpb19iYXNlOworCXBoeXNfZGV2LT5pcnEgPSBpcnE7CisJcGh5c19kZXYtPmRldm5vID0gLTE7CisJdmlydF9kZXYtPmRldm5vID0gLTE7CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9faW5pdCBpbnN0YWxsX3dmX21wdSAodm9pZCkKK3sKKwlpZiAoKHBoeXNfZGV2LT5kZXZubyA9IHNvdW5kX2FsbG9jX21pZGlkZXYoKSkgPCAwKXsKKworCQlwcmludGsgKEtFUk5fRVJSICJXRi1NUFU6IFRvbyBtYW55IE1JREkgZGV2aWNlcyBkZXRlY3RlZC5cbiIpOworCQlyZWxlYXNlX3JlZ2lvbihwaHlzX2Rldi0+YmFzZSwgMik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwaHlzX2Rldi0+aXN2aXJ0dWFsID0gMDsKKworCWlmIChjb25maWdfd2ZfbXB1IChwaHlzX2RldikpIHsKKworCQlwcmludGsgKEtFUk5fV0FSTklORworCQkJIldGLU1QVTogY29uZmlndXJhdGlvbiBmb3IgTUlESSBkZXZpY2UgJWQgZmFpbGVkXG4iLAorCQkJcGh5c19kZXYtPmRldm5vKTsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYgKHBoeXNfZGV2LT5kZXZubyk7CisKKwl9CisKKwkvKiBPSywgbm93IHdlJ3JlIGNvbmZpZ3VyZWQgdG8gaGFuZGxlIGFuIGludGVycnVwdCAuLi4gKi8KKworCWlmIChyZXF1ZXN0X2lycSAocGh5c19kZXYtPmlycSwgd2ZfbXB1aW50ciwgU0FfSU5URVJSVVBUfFNBX1NISVJRLAorCQkJICJ3YXZlZnJvbnQgbWlkaSIsIHBoeXNfZGV2KSA8IDApIHsKKworCQlwcmludGsgKEtFUk5fRVJSICJXRi1NUFU6IEZhaWxlZCB0byBhbGxvY2F0ZSBJUlElZFxuIiwKKwkJCXBoeXNfZGV2LT5pcnEpOworCQlyZXR1cm4gLTE7CisKKwl9CisKKwkvKiBUaGlzIGJlaW5nIGEgV2F2ZUZyb250IChJQ1MtMjExNSkgZW11bGF0ZWQgTVBVLTQwMSwgd2UgaGF2ZQorCSAgIHRvIHN3aXRjaCBpdCBpbnRvIFVBUlQgKGR1bWIpIG1vZGUsIGJlY2F1c2Ugb3RoZXJ3aXNlLCBpdAorCSAgIHdvbid0IGRvIGFueXRoaW5nIGF0IGFsbC4KKwkqLworICAKKwlzdGFydF91YXJ0X21vZGUgKCk7CisKKwlyZXR1cm4gcGh5c19kZXYtPmRldm5vOworfQorIAordm9pZAordW5pbnN0YWxsX3dmX21wdSAodm9pZCkKKworeworCXJlbGVhc2VfcmVnaW9uIChwaHlzX2Rldi0+YmFzZSwgMik7IAorCWZyZWVfaXJxIChwaHlzX2Rldi0+aXJxLCBwaHlzX2Rldik7CisJc291bmRfdW5sb2FkX21pZGlkZXYgKHBoeXNfZGV2LT5kZXZubyk7CisKKwlpZiAodmlydF9kZXYtPmRldm5vID49IDApIHsKKwkJc291bmRfdW5sb2FkX21pZGlkZXYgKHZpcnRfZGV2LT5kZXZubyk7CisJfQorfQorCitzdGF0aWMgdm9pZAorc3RhcnRfdWFydF9tb2RlICh2b2lkKQorCit7CisJaW50ICAgICAgICAgICAgIG9rLCBpOworCXVuc2lnbmVkIGxvbmcgICBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZsb2NrLGZsYWdzKTsKKworCS8qIFhYWCBmaXggbWUgKi8KKworCWZvciAoaSA9IDA7IGkgPCAzMDAwMCAmJiAhb3V0cHV0X3JlYWR5ICgpOyBpKyspOworCisJb3V0YiAoVUFSVF9NT0RFX09OLCBDT01EUE9SVChwaHlzX2RldikpOworCisJZm9yIChvayA9IDAsIGkgPSA1MDAwMDsgaSA+IDAgJiYgIW9rOyBpLS0pIHsKKwkJaWYgKGlucHV0X2F2YWlsICgpKSB7CisJCQlpZiAocmVhZF9kYXRhICgpID09IE1QVV9BQ0spIHsKKwkJCQlvayA9IDE7CisJCQl9CisJCX0KKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLGZsYWdzKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc291bmQvb3NzL3ltZnBjaS5jIGIvc291bmQvb3NzL3ltZnBjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjAzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zb3VuZC9vc3MveW1mcGNpLmMKQEAgLTAsMCArMSwyNjkxIEBACisvKgorICogIENvcHlyaWdodCAxOTk5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICBDb3B5cmlnaHQgMjAwMCBBbGFuIENveCA8YWxhbkByZWRoYXQuY29tPgorICogIENvcHlyaWdodCAyMDAxIEthaSBHZXJtYXNjaGV3c2tpIDxrYWlAdHAxLnJ1aHItdW5pLWJvY2h1bS5kZT4KKyAqICBDb3B5cmlnaHQgMjAwMiBQZXRlIFphaXRjZXYgPHphaXRjZXZAeWFob28uY29tPgorICoKKyAqICBZYW1haGEgWU1GN3h4IGRyaXZlci4KKyAqCisgKiAgVGhpcyBjb2RlIGlzIGEgcmVzdWx0IG9mIGhpZ2gtc3BlZWQgY29sbGlzaW9uCisgKiAgYmV0d2VlbiB5bWZwY2kuYyBvZiBBTFNBIGFuZCBjczQ2eHguYyBvZiBMaW51eC4KKyAqICAtLSBQZXRlIFphaXRjZXYgPHphaXRjZXZAeWFob28uY29tPjsgMjAwMC8wOS8xOAorICoKKyAqICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqCisgKiBUT0RPOgorICogIC0gVXNlIFA0NFNsb3QgZm9yIDQ0LjEgcGxheWJhY2sgKGJld2FyZSBvZiBpZGxlIGJ1enppbmcgaW4gUDQ0U2xvdCkuCisgKiAgLSA5NktIeiBwbGF5YmFjayBmb3IgRFZEIC0gdXNlIHBpdGNoIG9mIDIuMC4KKyAqICAtIFJldGFpbiBETUEgYnVmZmVyIG9uIGNsb3NlLCBkbyBub3Qgd2FpdCB0aGUgZW5kIG9mIGZyYW1lLgorICogIC0gUmVzb2x2ZSBYWFggdGFnZ2VkIHF1ZXN0aW9ucy4KKyAqICAtIENhbm5vdCBwbGF5IDUxMzNIei4KKyAqICAtIDIwMDEvMDEvMDcgQ29uc2lkZXIgaWYgd2UgY2FuIHJlbW92ZSB2b2ljZV9sb2NrLCBsaWtlIHNvOgorICogICAgIDogQWxsb2NhdGUvZGVhbGxvY2F0ZSB2b2ljZXMgaW4gb3Blbi9jbG9zZSB1bmRlciBzZW1hZm9yZS4KKyAqICAgICA6IFdlIGFjY2VzcyB2b2ljZXMgaW4gaW50ZXJydXB0LCB0aGF0IG9ubHkgZm9yIHBjbXMgdGhhdCBvcGVuLgorICogICAgdm9pY2VfbG9jayBhcm91bmQgcGxheWJhY2tfcHJlcGFyZSBjbG9zZXMgaW50ZXJydXB0cyBmb3IgaW5zYW5lIGR1cmF0aW9uLgorICogIC0gUmV2aXNpdCB0aGUgd2F5IHZvaWNlX2FsbG9jIGlzIGRvbmUgLSB0b28gY29uZnVzaW5nLCBvdmVyY29tcGxpY2F0ZWQuCisgKiAgICBTaG91bGQgc3VwcG9ydCB2YXJpb3VzIGNoYW5uZWwgdHlwZXMsIGhvd2V2ZXIuCisgKiAgLSBSZW1vdmUgcHJvZ19kbWFidWYgZnJvbSByZWFkL3dyaXRlLCBsZWF2ZSBpdCBpbiBvcGVuLgorICogIC0gMjAwMS8wMS8wNyBSZXBsYWNlIHRoZSBPUEwzIHBhcnQgb2YgQ09ORklHX1NPVU5EX1lNRlBDSV9MRUdBQ1kgY29kZSB3aXRoCisgKiAgICBuYXRpdmUgc3ludGhlc2l6ZXIgdGhyb3VnaCBhIHBsYXliYWNrIHNsb3QuCisgKiAgLSAyMDAxLzExLzI5IGFjOTdfc2F2ZV9zdGF0ZQorICogICAgVGFsayB0byBLYWkgdG8gcmVtb3ZlIGFjOTdfc2F2ZV9zdGF0ZSBiZWZvcmUgaXQncyB0b28gbGF0ZSEKKyAqICAtIFNlY29uZCBBQzk3CisgKiAgLSBSZXN0b3JlIFMvUERJRiAtIFRvc2hpYmFzIGhhdmUgaXQuCisgKgorICogS2FpIHVzZWQgcGNpX2FsbG9jX2NvbnNpc3RlbnQgZm9yIERNQSBidWZmZXIsIHdoaWNoIHNvdW5kcyBhIGxpdHRsZQorICogdW5jb252ZW50aW9uYWwuIEhvd2V2ZXIsIGdpdmVuIGhvdyBzbWFsbCBvdXIgZnJhZ21lbnRzIGNhbiBiZSwKKyAqIGEgbGl0dGxlIHVuY2FjaGVkIGFjY2VzcyBpcyBwZXJoYXBzIGJldHRlciB0aGFuIGVuZGxlc3MgZmx1c2hpbmcuCisgKiBPbiBpMzg2IGFuZCBvdGhlciBJL08tY29oZXJlbnQgYXJjaGl0ZWN0dXJlcyBwY2lfYWxsb2NfY29uc2lzdGVudAorICogaXMgZW50aXJlbHkgaGFybWxlc3MuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvc291bmRjYXJkLmg+CisjaW5jbHVkZSA8bGludXgvYWM5N19jb2RlYy5oPgorI2luY2x1ZGUgPGxpbnV4L3NvdW5kLmg+CisKKyNpbmNsdWRlIDxhc20vaW8uaD4KKyNpbmNsdWRlIDxhc20vZG1hLmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKworI2lmZGVmIENPTkZJR19TT1VORF9ZTUZQQ0lfTEVHQUNZCisjIGluY2x1ZGUgInNvdW5kX2NvbmZpZy5oIgorIyBpbmNsdWRlICJtcHU0MDEuaCIKKyNlbmRpZgorI2luY2x1ZGUgInltZnBjaS5oIgorCisvKgorICogSSBkbyBub3QgYmVsaWV2ZSBpbiBkZWJ1ZyBsZXZlbHMgYXMgSSBuZXZlciBjYW4gZ3Vlc3Mgd2hhdAorICogcGFydCBvZiB0aGUgY29kZSBpcyBnb2luZyB0byBiZSBwcm9ibGVtYXRpYyBpbiB0aGUgZnV0dXJlLgorICogRG9uJ3QgZm9yZ2V0IHRvIHJ1biB5b3VyIGtsb2dkIHdpdGggLWMgOC4KKyAqCisgKiBFeGFtcGxlIChkbyBub3QgcmVtb3ZlKToKKyAqICNkZWZpbmUgWU1GREJHKGZtdCwgYXJnLi4uKSAgZG97IHByaW50ayhLRVJOX0RFQlVHIGZtdCwgIyNhcmcpOyB9d2hpbGUoMCkKKyAqLworI2RlZmluZSBZTUZEQkdXKGZtdCwgYXJnLi4uKSAgLyogKi8JLyogd3JpdGUgY291bnRzICovCisjZGVmaW5lIFlNRkRCR0koZm10LCBhcmcuLi4pICAvKiAqLwkvKiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIFlNRkRCR1goZm10LCBhcmcuLi4pICAvKiAqLwkvKiBpb2N0bCAqLworCitzdGF0aWMgaW50IHltZl9wbGF5YmFja190cmlnZ2VyKHltZnBjaV90ICp1bml0LCBzdHJ1Y3QgeW1mX3BjbSAqeXBjbSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCB5bWZfY2FwdHVyZV90cmlnZ2VyKHltZnBjaV90ICp1bml0LCBzdHJ1Y3QgeW1mX3BjbSAqeXBjbSwgaW50IGNtZCk7CitzdGF0aWMgdm9pZCB5bWZwY2lfdm9pY2VfZnJlZSh5bWZwY2lfdCAqdW5pdCwgeW1mcGNpX3ZvaWNlX3QgKnB2b2ljZSk7CitzdGF0aWMgaW50IHltZl9jYXB0dXJlX2FsbG9jKHN0cnVjdCB5bWZfdW5pdCAqdW5pdCwgaW50ICpwYmFuayk7CitzdGF0aWMgaW50IHltZl9wbGF5YmFja19wcmVwYXJlKHN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlKTsKK3N0YXRpYyBpbnQgeW1mX2NhcHR1cmVfcHJlcGFyZShzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZSk7CitzdGF0aWMgc3RydWN0IHltZl9zdGF0ZSAqeW1mX3N0YXRlX2FsbG9jKHltZnBjaV90ICp1bml0KTsKKworc3RhdGljIHZvaWQgeW1mcGNpX2FjbGlua19yZXNldChzdHJ1Y3QgcGNpX2RldiAqIHBjaSk7CitzdGF0aWMgdm9pZCB5bWZwY2lfZGlzYWJsZV9kc3AoeW1mcGNpX3QgKnVuaXQpOworc3RhdGljIHZvaWQgeW1mcGNpX2Rvd25sb2FkX2ltYWdlKHltZnBjaV90ICpjb2RlYyk7CitzdGF0aWMgdm9pZCB5bWZfbWVtbG9hZCh5bWZwY2lfdCAqdW5pdCk7CisKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soeW1mX2RldnNfbG9jayk7CitzdGF0aWMgTElTVF9IRUFEKHltZl9kZXZzKTsKKworLyoKKyAqICBjb25zdGFudHMKKyAqLworCitzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgeW1mX2lkX3RibFtdID0geworI2RlZmluZSBERVYodiwgZCwgZGF0YSkgXAorICB7IFBDSV9WRU5ET1JfSURfIyN2LCBQQ0lfREVWSUNFX0lEXyMjdiMjXyMjZCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgMCwgMCwgKHVuc2lnbmVkIGxvbmcpZGF0YSB9CisJREVWIChZQU1BSEEsIDcyNCwgICJZTUY3MjQiKSwKKwlERVYgKFlBTUFIQSwgNzI0RiwgIllNRjcyNEYiKSwKKwlERVYgKFlBTUFIQSwgNzQwLCAgIllNRjc0MCIpLAorCURFViAoWUFNQUhBLCA3NDBDLCAiWU1GNzQwQyIpLAorCURFViAoWUFNQUhBLCA3NDQsICAiWU1GNzQ0IiksCisJREVWIChZQU1BSEEsIDc1NCwgICJZTUY3NTQiKSwKKyN1bmRlZiBERVYKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKHBjaSwgeW1mX2lkX3RibCk7CisKKy8qCisgKiAgY29tbW9uIEkvTyByb3V0aW5lcworICovCisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5bWZwY2lfd3JpdGViKHltZnBjaV90ICpjb2RlYywgdTMyIG9mZnNldCwgdTggdmFsKQoreworCXdyaXRlYih2YWwsIGNvZGVjLT5yZWdfYXJlYV92aXJ0ICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB1MTYgeW1mcGNpX3JlYWR3KHltZnBjaV90ICpjb2RlYywgdTMyIG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZHcoY29kZWMtPnJlZ19hcmVhX3ZpcnQgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgeW1mcGNpX3dyaXRldyh5bWZwY2lfdCAqY29kZWMsIHUzMiBvZmZzZXQsIHUxNiB2YWwpCit7CisJd3JpdGV3KHZhbCwgY29kZWMtPnJlZ19hcmVhX3ZpcnQgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB5bWZwY2lfcmVhZGwoeW1mcGNpX3QgKmNvZGVjLCB1MzIgb2Zmc2V0KQoreworCXJldHVybiByZWFkbChjb2RlYy0+cmVnX2FyZWFfdmlydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB5bWZwY2lfd3JpdGVsKHltZnBjaV90ICpjb2RlYywgdTMyIG9mZnNldCwgdTMyIHZhbCkKK3sKKwl3cml0ZWwodmFsLCBjb2RlYy0+cmVnX2FyZWFfdmlydCArIG9mZnNldCk7Cit9CisKK3N0YXRpYyBpbnQgeW1mcGNpX2NvZGVjX3JlYWR5KHltZnBjaV90ICpjb2RlYywgaW50IHNlY29uZGFyeSwgaW50IHNjaGVkKQoreworCXNpZ25lZCBsb25nIGVuZF90aW1lOworCXUzMiByZWcgPSBzZWNvbmRhcnkgPyBZRFNYR1JfU0VDU1RBVFVTQURSIDogWURTWEdSX1BSSVNUQVRVU0FEUjsKKwkKKwllbmRfdGltZSA9IGppZmZpZXMgKyAzICogKEhaIC8gNCk7CisJZG8geworCQlpZiAoKHltZnBjaV9yZWFkdyhjb2RlYywgcmVnKSAmIDB4ODAwMCkgPT0gMCkKKwkJCXJldHVybiAwOworCQlpZiAoc2NoZWQpIHsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJCXNjaGVkdWxlX3RpbWVvdXQoMSk7CisJCX0KKwl9IHdoaWxlIChlbmRfdGltZSAtIChzaWduZWQgbG9uZylqaWZmaWVzID49IDApOworCXByaW50ayhLRVJOX0VSUiAieW1mcGNpX2NvZGVjX3JlYWR5OiBjb2RlYyAlaSBpcyBub3QgcmVhZHkgWzB4JXhdXG4iLAorCSAgICBzZWNvbmRhcnksIHltZnBjaV9yZWFkdyhjb2RlYywgcmVnKSk7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3RhdGljIHZvaWQgeW1mcGNpX2NvZGVjX3dyaXRlKHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZywgdTE2IHZhbCkKK3sKKwl5bWZwY2lfdCAqY29kZWMgPSBkZXYtPnByaXZhdGVfZGF0YTsKKwl1MzIgY21kOworCisJc3Bpbl9sb2NrKCZjb2RlYy0+YWM5N19sb2NrKTsKKwkvKiBYWFggRG8gbWFrZSB1c2Ugb2YgZGV2LT5pZCAqLworCXltZnBjaV9jb2RlY19yZWFkeShjb2RlYywgMCwgMCk7CisJY21kID0gKChZRFNYR19BQzk3V1JJVEVDTUQgfCByZWcpIDw8IDE2KSB8IHZhbDsKKwl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfQUM5N0NNRERBVEEsIGNtZCk7CisJc3Bpbl91bmxvY2soJmNvZGVjLT5hYzk3X2xvY2spOworfQorCitzdGF0aWMgdTE2IF95bWZwY2lfY29kZWNfcmVhZCh5bWZwY2lfdCAqdW5pdCwgdTggcmVnKQoreworCWludCBpOworCisJaWYgKHltZnBjaV9jb2RlY19yZWFkeSh1bml0LCAwLCAwKSkKKwkJcmV0dXJuIH4wOworCXltZnBjaV93cml0ZXcodW5pdCwgWURTWEdSX0FDOTdDTURBRFIsIFlEU1hHX0FDOTdSRUFEQ01EIHwgcmVnKTsKKwlpZiAoeW1mcGNpX2NvZGVjX3JlYWR5KHVuaXQsIDAsIDApKQorCQlyZXR1cm4gfjA7CisJaWYgKHVuaXQtPnBjaS0+ZGV2aWNlID09IFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0NCAmJiB1bml0LT5yZXYgPCAyKSB7CisJCWZvciAoaSA9IDA7IGkgPCA2MDA7IGkrKykKKwkJCXltZnBjaV9yZWFkdyh1bml0LCBZRFNYR1JfUFJJU1RBVFVTREFUQSk7CisJfQorCXJldHVybiB5bWZwY2lfcmVhZHcodW5pdCwgWURTWEdSX1BSSVNUQVRVU0RBVEEpOworfQorCitzdGF0aWMgdTE2IHltZnBjaV9jb2RlY19yZWFkKHN0cnVjdCBhYzk3X2NvZGVjICpkZXYsIHU4IHJlZykKK3sKKwl5bWZwY2lfdCAqdW5pdCA9IGRldi0+cHJpdmF0ZV9kYXRhOworCXUxNiByZXQ7CisJCisJc3Bpbl9sb2NrKCZ1bml0LT5hYzk3X2xvY2spOworCXJldCA9IF95bWZwY2lfY29kZWNfcmVhZCh1bml0LCByZWcpOworCXNwaW5fdW5sb2NrKCZ1bml0LT5hYzk3X2xvY2spOworCQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiAgTWlzYyByb3V0aW5lcworICovCisKKy8qCisgKiBDYWxjdWxhdGUgdGhlIGFjdHVhbCBzYW1wbGluZyByYXRlIHJlbGF0ZXRpdmVseSB0byB0aGUgYmFzZSBjbG9jayAoNDhrSHopLgorICovCitzdGF0aWMgdTMyIHltZnBjaV9jYWxjX2RlbHRhKHUzMiByYXRlKQoreworCXN3aXRjaCAocmF0ZSkgeworCWNhc2UgODAwMDoJcmV0dXJuIDB4MDJhYWFiMDA7CisJY2FzZSAxMTAyNToJcmV0dXJuIDB4MDNhY2NkMDA7CisJY2FzZSAxNjAwMDoJcmV0dXJuIDB4MDU1NTU1MDA7CisJY2FzZSAyMjA1MDoJcmV0dXJuIDB4MDc1OTlhMDA7CisJY2FzZSAzMjAwMDoJcmV0dXJuIDB4MGFhYWFiMDA7CisJY2FzZSA0NDEwMDoJcmV0dXJuIDB4MGViMzMzMDA7CisJZGVmYXVsdDoJcmV0dXJuICgocmF0ZSA8PCAxNikgLyA0ODAwMCkgPDwgMTI7CisJfQorfQorCitzdGF0aWMgdTMyIGRlZl9yYXRlWzhdID0geworCTEwMCwgMjAwMCwgODAwMCwgMTEwMjUsIDE2MDAwLCAyMjA1MCwgMzIwMDAsIDQ4MDAwCit9OworCitzdGF0aWMgdTMyIHltZnBjaV9jYWxjX2xwZksodTMyIHJhdGUpCit7CisJdTMyIGk7CisJc3RhdGljIHUzMiB2YWxbOF0gPSB7CisJCTB4MDA1NzAwMDAsIDB4MDZBQTAwMDAsIDB4MThCMjAwMDAsIDB4MjA5MzAwMDAsCisJCTB4MkI5QTAwMDAsIDB4MzVBMTAwMDAsIDB4M0VBQTAwMDAsIDB4NDAwMDAwMDAKKwl9OworCQorCWlmIChyYXRlID09IDQ0MTAwKQorCQlyZXR1cm4gMHg0MDAwMDAwMDsJLyogRklYTUU6IFdoYXQncyB0aGUgcmlnaHQgdmFsdWU/ICovCisJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKKwkJaWYgKHJhdGUgPD0gZGVmX3JhdGVbaV0pCisJCQlyZXR1cm4gdmFsW2ldOworCXJldHVybiB2YWxbMF07Cit9CisKK3N0YXRpYyB1MzIgeW1mcGNpX2NhbGNfbHBmUSh1MzIgcmF0ZSkKK3sKKwl1MzIgaTsKKwlzdGF0aWMgdTMyIHZhbFs4XSA9IHsKKwkJMHgzNTI4MDAwMCwgMHgzNEE3MDAwMCwgMHgzMjAyMDAwMCwgMHgzMTc3MDAwMCwKKwkJMHgzMTM5MDAwMCwgMHgzMUM5MDAwMCwgMHgzM0QwMDAwMCwgMHg0MDAwMDAwMAorCX07CisJCisJaWYgKHJhdGUgPT0gNDQxMDApCisJCXJldHVybiAweDM3MEEwMDAwOworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCWlmIChyYXRlIDw9IGRlZl9yYXRlW2ldKQorCQkJcmV0dXJuIHZhbFtpXTsKKwlyZXR1cm4gdmFsWzBdOworfQorCitzdGF0aWMgdTMyIHltZl9jYWxjX2xlbmQodTMyIHJhdGUpCit7CisJcmV0dXJuIChyYXRlICogWU1GX1NBTVBGKSAvIDQ4MDAwOworfQorCisvKgorICogV2UgZXZlciBhbGxvdyBvbmx5IGEgZmV3IGZvcm1hdHMsIGJ1dCBsZXQncyBiZSBnZW5lcmljLCBmb3Igc21hbGxlciBzdXJwcmlzZS4KKyAqLworc3RhdGljIGludCB5bWZfcGNtX2Zvcm1hdF93aWR0aChpbnQgZm9ybWF0KQoreworCXN0YXRpYyBpbnQgbWFzazE2ID0gQUZNVF9TMTZfTEV8QUZNVF9TMTZfQkV8QUZNVF9VMTZfTEV8QUZNVF9VMTZfQkU7CisKKwlpZiAoKGZvcm1hdCAmIChmb3JtYXQtMSkpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IGZvcm1hdCAweCV4IGlzIG5vdCBhIHBvd2VyIG9mIDJcbiIsIGZvcm1hdCk7CisJCXJldHVybiA4OworCX0KKworCWlmIChmb3JtYXQgPT0gQUZNVF9JTUFfQURQQ00pIHJldHVybiA0OworCWlmICgoZm9ybWF0ICYgbWFzazE2KSAhPSAwKSByZXR1cm4gMTY7CisJcmV0dXJuIDg7Cit9CisKK3N0YXRpYyB2b2lkIHltZl9wY21fdXBkYXRlX3NoaWZ0KHN0cnVjdCB5bWZfcGNtX2Zvcm1hdCAqZikKK3sKKwlmLT5zaGlmdCA9IDA7CisJaWYgKGYtPnZvaWNlcyA9PSAyKQorCQlmLT5zaGlmdCsrOworCWlmICh5bWZfcGNtX2Zvcm1hdF93aWR0aChmLT5mb3JtYXQpID09IDE2KQorCQlmLT5zaGlmdCsrOworfQorCisvKiBBcmUgeW91IHN1cmUgMzJLIGlzIG5vdCB0b28gbXVjaD8gU2VlIGlmIG1wZzEyMyBza2lwcyBvbiBsb2FkZWQgc3lzdGVtcy4gKi8KKyNkZWZpbmUgRE1BQlVGX0RFRkFVTFRPUkRFUiAoMTUtUEFHRV9TSElGVCkKKyNkZWZpbmUgRE1BQlVGX01JTk9SREVSIDEKKworLyoKKyAqIEFsbG9jYXRlIERNQSBidWZmZXIKKyAqLworc3RhdGljIGludCBhbGxvY19kbWFidWYoeW1mcGNpX3QgKnVuaXQsIHN0cnVjdCB5bWZfZG1hYnVmICpkbWFidWYpCit7CisJdm9pZCAqcmF3YnVmID0gTlVMTDsKKwlkbWFfYWRkcl90IGRtYV9hZGRyOworCWludCBvcmRlcjsKKwlzdHJ1Y3QgcGFnZSAqbWFwLCAqbWFwZW5kOworCisJLyogYWxsb2MgYXMgYmlnIGEgY2h1bmsgYXMgd2UgY2FuICovCisJZm9yIChvcmRlciA9IERNQUJVRl9ERUZBVUxUT1JERVI7IG9yZGVyID49IERNQUJVRl9NSU5PUkRFUjsgb3JkZXItLSkgeworCQlyYXdidWYgPSBwY2lfYWxsb2NfY29uc2lzdGVudCh1bml0LT5wY2ksIFBBR0VfU0laRSA8PCBvcmRlciwgJmRtYV9hZGRyKTsKKwkJaWYgKHJhd2J1ZikKKwkJCWJyZWFrOworCX0KKwlpZiAoIXJhd2J1ZikKKwkJcmV0dXJuIC1FTk9NRU07CisKKyNpZiAwCisJcHJpbnRrKEtFUk5fREVCVUcgInltZnBjaTogYWxsb2NhdGVkICVsZCAob3JkZXIgPSAlZCkgYnl0ZXMgYXQgJXBcbiIsCisJICAgICAgIFBBR0VfU0laRSA8PCBvcmRlciwgb3JkZXIsIHJhd2J1Zik7CisjZW5kaWYKKworCWRtYWJ1Zi0+cmVhZHkgID0gZG1hYnVmLT5tYXBwZWQgPSAwOworCWRtYWJ1Zi0+cmF3YnVmID0gcmF3YnVmOworCWRtYWJ1Zi0+ZG1hX2FkZHIgPSBkbWFfYWRkcjsKKwlkbWFidWYtPmJ1Zm9yZGVyID0gb3JkZXI7CisKKwkvKiBub3cgbWFyayB0aGUgcGFnZXMgYXMgcmVzZXJ2ZWQ7IG90aGVyd2lzZSByZW1hcF9wZm5fcmFuZ2UgZG9lc24ndCBkbyB3aGF0IHdlIHdhbnQgKi8KKwltYXBlbmQgPSB2aXJ0X3RvX3BhZ2UocmF3YnVmICsgKFBBR0VfU0laRSA8PCBvcmRlcikgLSAxKTsKKwlmb3IgKG1hcCA9IHZpcnRfdG9fcGFnZShyYXdidWYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKKwkJc2V0X2JpdChQR19yZXNlcnZlZCwgJm1hcC0+ZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBGcmVlIERNQSBidWZmZXIKKyAqLworc3RhdGljIHZvaWQgZGVhbGxvY19kbWFidWYoeW1mcGNpX3QgKnVuaXQsIHN0cnVjdCB5bWZfZG1hYnVmICpkbWFidWYpCit7CisJc3RydWN0IHBhZ2UgKm1hcCwgKm1hcGVuZDsKKworCWlmIChkbWFidWYtPnJhd2J1ZikgeworCQkvKiB1bmRvIG1hcmtpbmcgdGhlIHBhZ2VzIGFzIHJlc2VydmVkICovCisJCW1hcGVuZCA9IHZpcnRfdG9fcGFnZShkbWFidWYtPnJhd2J1ZiArIChQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlcikgLSAxKTsKKwkJZm9yIChtYXAgPSB2aXJ0X3RvX3BhZ2UoZG1hYnVmLT5yYXdidWYpOyBtYXAgPD0gbWFwZW5kOyBtYXArKykKKwkJCWNsZWFyX2JpdChQR19yZXNlcnZlZCwgJm1hcC0+ZmxhZ3MpOworCisJCXBjaV9mcmVlX2NvbnNpc3RlbnQodW5pdC0+cGNpLCBQQUdFX1NJWkUgPDwgZG1hYnVmLT5idWZvcmRlciwKKwkJICAgIGRtYWJ1Zi0+cmF3YnVmLCBkbWFidWYtPmRtYV9hZGRyKTsKKwl9CisJZG1hYnVmLT5yYXdidWYgPSBOVUxMOworCWRtYWJ1Zi0+bWFwcGVkID0gZG1hYnVmLT5yZWFkeSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcHJvZ19kbWFidWYoc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUsIGludCByZWMpCit7CisJc3RydWN0IHltZl9kbWFidWYgKmRtYWJ1ZjsKKwlpbnQgd18xNjsKKwl1bnNpZ25lZCBidWZzaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJlZHpvbmUsIHJlZGZyYWdzOworCWludCByZXQ7CisKKwl3XzE2ID0geW1mX3BjbV9mb3JtYXRfd2lkdGgoc3RhdGUtPmZvcm1hdC5mb3JtYXQpID09IDE2OworCWRtYWJ1ZiA9IHJlYyA/ICZzdGF0ZS0+cnBjbS5kbWFidWYgOiAmc3RhdGUtPndwY20uZG1hYnVmOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCWRtYWJ1Zi0+aHdwdHIgPSBkbWFidWYtPnN3cHRyID0gMDsKKwlkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwlkbWFidWYtPmNvdW50ID0gMDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCS8qIGFsbG9jYXRlIERNQSBidWZmZXIgaWYgbm90IGFsbG9jYXRlZCB5ZXQgKi8KKwlpZiAoIWRtYWJ1Zi0+cmF3YnVmKQorCQlpZiAoKHJldCA9IGFsbG9jX2RtYWJ1ZihzdGF0ZS0+dW5pdCwgZG1hYnVmKSkpCisJCQlyZXR1cm4gcmV0OworCisJLyoKKwkgKiBDcmVhdGUgZmFrZSBmcmFnbWVudCBzaXplcyBhbmQgbnVtYmVycyBmb3IgT1NTIGlvY3Rscy4KKwkgKiBJbXBvcnQgd2hhdCBEb29tIG1pZ2h0IGhhdmUgc2V0IHdpdGggU05EQ1RMX0RTUF9TRVRGUkFHTUVOVC4KKwkgKi8KKwlidWZzaXplID0gUEFHRV9TSVpFIDw8IGRtYWJ1Zi0+YnVmb3JkZXI7CisJLyogQnkgZGVmYXVsdCB3ZSBnaXZlIDQgYmlnIGJ1ZmZlcnMuICovCisJZG1hYnVmLT5mcmFnc2hpZnQgPSAoZG1hYnVmLT5idWZvcmRlciArIFBBR0VfU0hJRlQgLSAyKTsKKwlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQgPiAzICYmCisJICAgIGRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0IDwgZG1hYnVmLT5mcmFnc2hpZnQpIHsKKwkJLyogSWYgT1NTIHNldCBzbWFsbGVyIGZyYWdtZW50cywgZ2l2ZSBtb3JlIHNtYWxsZXIgYnVmZmVycy4gKi8KKwkJZG1hYnVmLT5mcmFnc2hpZnQgPSBkbWFidWYtPm9zc2ZyYWdzaGlmdDsKKwl9CisJZG1hYnVmLT5mcmFnc2l6ZSA9IDEgPDwgZG1hYnVmLT5mcmFnc2hpZnQ7CisKKwlkbWFidWYtPm51bWZyYWcgPSBidWZzaXplID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCWRtYWJ1Zi0+ZG1hc2l6ZSA9IGRtYWJ1Zi0+bnVtZnJhZyA8PCBkbWFidWYtPmZyYWdzaGlmdDsKKworCWlmIChkbWFidWYtPm9zc21heGZyYWdzID49IDIpIHsKKwkJcmVkem9uZSA9IHltZl9jYWxjX2xlbmQoc3RhdGUtPmZvcm1hdC5yYXRlKTsKKwkJcmVkem9uZSA8PD0gc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwkJcmVkem9uZSAqPSAzOworCQlyZWRmcmFncyA9IChyZWR6b25lICsgZG1hYnVmLT5mcmFnc2l6ZS0xKSA+PiBkbWFidWYtPmZyYWdzaGlmdDsKKworCQlpZiAoZG1hYnVmLT5vc3NtYXhmcmFncyArIHJlZGZyYWdzIDwgZG1hYnVmLT5udW1mcmFnKSB7CisJCQlkbWFidWYtPm51bWZyYWcgPSBkbWFidWYtPm9zc21heGZyYWdzICsgcmVkZnJhZ3M7CisJCQlkbWFidWYtPmRtYXNpemUgPSBkbWFidWYtPm51bWZyYWcgPDwgZG1hYnVmLT5mcmFnc2hpZnQ7CisJCX0KKwl9CisKKwltZW1zZXQoZG1hYnVmLT5yYXdidWYsIHdfMTYgPyAwIDogMHg4MCwgZG1hYnVmLT5kbWFzaXplKTsKKworCS8qCisJICoJTm93IHNldCB1cCB0aGUgcmluZyAKKwkgKi8KKworCS8qIFhYWCAgIHJldCA9IHJlYz8gY2FwX3ByZSgpOiBwYmtfcHJlKCk7ICAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+dm9pY2VfbG9jaywgZmxhZ3MpOworCWlmIChyZWMpIHsKKwkJaWYgKChyZXQgPSB5bWZfY2FwdHVyZV9wcmVwYXJlKHN0YXRlKSkgIT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKHJldCA9IHltZl9wbGF5YmFja19wcmVwYXJlKHN0YXRlKSkgIT0gMCkgeworCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKwkJCXJldHVybiByZXQ7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKworCS8qIHNldCB0aGUgcmVhZHkgZmxhZyBmb3IgdGhlIGRtYSBidWZmZXIgKHRoaXMgY29tbWVudCBpcyBub3Qgc3R1cGlkKSAqLworCWRtYWJ1Zi0+cmVhZHkgPSAxOworCisjaWYgMAorCXByaW50ayhLRVJOX0RFQlVHICJwcm9nX2RtYWJ1ZjogcmF0ZSAlZCBmb3JtYXQgMHgleCwiCisJICAgICIgbnVtZnJhZyAlZCBmcmFnc2l6ZSAlZCBkbWFzaXplICVkXG4iLAorCSAgICAgICBzdGF0ZS0+Zm9ybWF0LnJhdGUsIHN0YXRlLT5mb3JtYXQuZm9ybWF0LCBkbWFidWYtPm51bWZyYWcsCisJICAgICAgIGRtYWJ1Zi0+ZnJhZ3NpemUsIGRtYWJ1Zi0+ZG1hc2l6ZSk7CisjZW5kaWYKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5bWZfc3RhcnRfZGFjKHN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlKQoreworCXltZl9wbGF5YmFja190cmlnZ2VyKHN0YXRlLT51bml0LCAmc3RhdGUtPndwY20sIDEpOworfQorCisvLyBzdGF0aWMgdm9pZCB5bWZfc3RhcnRfYWRjKHN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlKQorLy8geworLy8gCXltZl9jYXB0dXJlX3RyaWdnZXIoc3RhdGUtPnVuaXQsICZzdGF0ZS0+cnBjbSwgMSk7CisvLyB9CisKKy8qCisgKiBXYWl0IHVudGlsIG91dHB1dCBpcyBkcmFpbmVkLgorICogVGhpcyBkb2VzIG5vdCBraWxsIHRoZSBoYXJkd2FyZSBmb3IgdGhlIHNha2Ugb2YgaW9jdGxzLgorICovCitzdGF0aWMgdm9pZCB5bWZfd2FpdF9kYWMoc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHltZl91bml0ICp1bml0ID0gc3RhdGUtPnVuaXQ7CisJc3RydWN0IHltZl9wY20gKnlwY20gPSAmc3RhdGUtPndwY207CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdGEsIGN1cnJlbnQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlhZGRfd2FpdF9xdWV1ZSgmeXBjbS0+ZG1hYnVmLndhaXQsICZ3YWl0YSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAoeXBjbS0+ZG1hYnVmLmNvdW50ICE9IDAgJiYgIXlwY20tPnJ1bm5pbmcpIHsKKwkJeW1mX3BsYXliYWNrX3RyaWdnZXIodW5pdCwgeXBjbSwgMSk7CisJfQorCisjaWYgMAorCWlmIChmaWxlLT5mX2ZsYWdzICYgT19OT05CTE9DSykgeworCQkvKgorCQkgKiBYWFggT3VyICBtaXN0YWtlIGlzIHRvIGF0dGFjaCBETUEgYnVmZmVyIHRvIHN0YXRlCisJCSAqIHJhdGhlciB0aGFuIHRvIHNvbWUgcGVyLWRldmljZSBzdHJ1Y3R1cmUuCisJCSAqIENhbm5vdCBza2lwIHdhaXRpbmcsIGNhbiBvbmx5IG1ha2UgaXQgc2hvcnRlci4KKwkJICovCisJfQorI2VuZGlmCisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJd2hpbGUgKHlwY20tPnJ1bm5pbmcpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJc2NoZWR1bGUoKTsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJcmVtb3ZlX3dhaXRfcXVldWUoJnlwY20tPmRtYWJ1Zi53YWl0LCAmd2FpdGEpOworCisJLyoKKwkgKiBUaGlzIGZ1bmN0aW9uIG1heSB0YWtlIHVwIHRvIDQgc2Vjb25kcyB0byByZWFjaCB0aGlzIHBvaW50CisJICogKDMySyBjaXJjdWxhciBidWZmZXIsIDgwMDAgSHopLiBVc2VyIG5vdGljZXMuCisJICovCit9CisKKy8qIENhbiBqdXN0IHN0b3AsIHdpdGhvdXQgd2FpdC4gT3IgY2FuIHdlPyAqLworc3RhdGljIHZvaWQgeW1mX3N0b3BfYWRjKHN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCB5bWZfdW5pdCAqdW5pdCA9IHN0YXRlLT51bml0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl5bWZfY2FwdHVyZV90cmlnZ2VyKHVuaXQsICZzdGF0ZS0+cnBjbSwgMCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqICBIYXJkd2FyZSBzdGFydCBtYW5hZ2VtZW50CisgKi8KKworc3RhdGljIHZvaWQgeW1mcGNpX2h3X3N0YXJ0KHltZnBjaV90ICp1bml0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlpZiAodW5pdC0+c3RhcnRfY291bnQrKyA9PSAwKSB7CisJCXltZnBjaV93cml0ZWwodW5pdCwgWURTWEdSX01PREUsCisJCSAgICB5bWZwY2lfcmVhZGwodW5pdCwgWURTWEdSX01PREUpIHwgMyk7CisJCXVuaXQtPmFjdGl2ZV9iYW5rID0geW1mcGNpX3JlYWRsKHVuaXQsIFlEU1hHUl9DVFJMU0VMRUNUKSAmIDE7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIHltZnBjaV9od19zdG9wKHltZnBjaV90ICp1bml0KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyB0aW1lb3V0ID0gMTAwMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCWlmICgtLXVuaXQtPnN0YXJ0X2NvdW50ID09IDApIHsKKwkJeW1mcGNpX3dyaXRlbCh1bml0LCBZRFNYR1JfTU9ERSwKKwkJICAgIHltZnBjaV9yZWFkbCh1bml0LCBZRFNYR1JfTU9ERSkgJiB+Myk7CisJCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCQlpZiAoKHltZnBjaV9yZWFkbCh1bml0LCBZRFNYR1JfU1RBVFVTKSAmIDIpID09IDApCisJCQkJYnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqICBQbGF5YmFjayB2b2ljZSBtYW5hZ2VtZW50CisgKi8KKworc3RhdGljIGludCB2b2ljZV9hbGxvYyh5bWZwY2lfdCAqY29kZWMsIHltZnBjaV92b2ljZV90eXBlX3QgdHlwZSwgaW50IHBhaXIsIHltZnBjaV92b2ljZV90ICpydm9pY2VbXSkKK3sKKwl5bWZwY2lfdm9pY2VfdCAqdm9pY2UsICp2b2ljZTI7CisJaW50IGlkeDsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgWURTWEdfUExBWUJBQ0tfVk9JQ0VTOyBpZHggKz0gcGFpciA/IDIgOiAxKSB7CisJCXZvaWNlID0gJmNvZGVjLT52b2ljZXNbaWR4XTsKKwkJdm9pY2UyID0gcGFpciA/ICZjb2RlYy0+dm9pY2VzW2lkeCsxXSA6IE5VTEw7CisJCWlmICh2b2ljZS0+dXNlIHx8ICh2b2ljZTIgJiYgdm9pY2UyLT51c2UpKQorCQkJY29udGludWU7CisJCXZvaWNlLT51c2UgPSAxOworCQlpZiAodm9pY2UyKQorCQkJdm9pY2UyLT51c2UgPSAxOworCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBZTUZQQ0lfUENNOgorCQkJdm9pY2UtPnBjbSA9IDE7CisJCQlpZiAodm9pY2UyKQorCQkJCXZvaWNlMi0+cGNtID0gMTsKKwkJCWJyZWFrOworCQljYXNlIFlNRlBDSV9TWU5USDoKKwkJCXZvaWNlLT5zeW50aCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBZTUZQQ0lfTUlESToKKwkJCXZvaWNlLT5taWRpID0gMTsKKwkJCWJyZWFrOworCQl9CisJCXltZnBjaV9od19zdGFydChjb2RlYyk7CisJCXJ2b2ljZVswXSA9IHZvaWNlOworCQlpZiAodm9pY2UyKSB7CisJCQl5bWZwY2lfaHdfc3RhcnQoY29kZWMpOworCQkJcnZvaWNlWzFdID0gdm9pY2UyOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gLUVCVVNZOwkvKiBZb3VyIGF1ZGlvIGNoYW5uZWwgaXMgb3BlbiBieSBzb21lb25lIGVsc2UuICovCit9CisKK3N0YXRpYyB2b2lkIHltZnBjaV92b2ljZV9mcmVlKHltZnBjaV90ICp1bml0LCB5bWZwY2lfdm9pY2VfdCAqcHZvaWNlKQoreworCXltZnBjaV9od19zdG9wKHVuaXQpOworCXB2b2ljZS0+dXNlID0gcHZvaWNlLT5wY20gPSBwdm9pY2UtPnN5bnRoID0gcHZvaWNlLT5taWRpID0gMDsKKwlwdm9pY2UtPnlwY20gPSBOVUxMOworfQorCisvKgorICovCisKK3N0YXRpYyB2b2lkIHltZl9wY21faW50ZXJydXB0KHltZnBjaV90ICpjb2RlYywgeW1mcGNpX3ZvaWNlX3QgKnZvaWNlKQoreworCXN0cnVjdCB5bWZfcGNtICp5cGNtOworCWludCByZWR6b25lOworCWludCBwb3MsIGRlbHRhLCBzd3B0cjsKKwlpbnQgcGxheWVkLCBkaXN0YW5jZTsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiAqZG1hYnVmOworCWNoYXIgc2lsZW5jZTsKKworCWlmICgoeXBjbSA9IHZvaWNlLT55cGNtKSA9PSBOVUxMKSB7CisJCXJldHVybjsKKwl9CisJaWYgKChzdGF0ZSA9IHlwY20tPnN0YXRlKSA9PSBOVUxMKSB7CisJCXlwY20tPnJ1bm5pbmcgPSAwOwkvLyBsb2NrIGl0CisJCXJldHVybjsKKwl9CisJZG1hYnVmID0gJnlwY20tPmRtYWJ1ZjsKKwlzcGluX2xvY2soJmNvZGVjLT5yZWdfbG9jayk7CisJaWYgKHlwY20tPnJ1bm5pbmcpIHsKKwkJWU1GREJHSSgieW1mcGNpOiAlZCwgaW50ciBiYW5rICVkIGNvdW50ICVkIHN0YXJ0IDB4JXg6JXhcbiIsCisJCSAgIHZvaWNlLT5udW1iZXIsIGNvZGVjLT5hY3RpdmVfYmFuaywgZG1hYnVmLT5jb3VudCwKKwkJICAgbGUzMl90b19jcHUodm9pY2UtPmJhbmtbMF0uc3RhcnQpLAorCQkgICBsZTMyX3RvX2NwdSh2b2ljZS0+YmFua1sxXS5zdGFydCkpOworCQlzaWxlbmNlID0gKHltZl9wY21fZm9ybWF0X3dpZHRoKHN0YXRlLT5mb3JtYXQuZm9ybWF0KSA9PSAxNikgPworCQkgICAgMCA6IDB4ODA7CisJCS8qIFdlIG5lZWQgYWN0dWFsIGxlZnQtaGFuZC1zaWRlIHJlZHpvbmUgc2l6ZSBoZXJlLiAqLworCQlyZWR6b25lID0geW1mX2NhbGNfbGVuZChzdGF0ZS0+Zm9ybWF0LnJhdGUpOworCQlyZWR6b25lIDw8PSAoc3RhdGUtPmZvcm1hdC5zaGlmdCArIDEpOworCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisKKwkJcG9zID0gbGUzMl90b19jcHUodm9pY2UtPmJhbmtbY29kZWMtPmFjdGl2ZV9iYW5rXS5zdGFydCk7CisJCXBvcyA8PD0gc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwkJaWYgKHBvcyA8IDAgfHwgcG9zID49IGRtYWJ1Zi0+ZG1hc2l6ZSkgewkvKiB1Y29kZSBidWcgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAieW1mcGNpJWQ6IHJ1bmF3YXkgdm9pY2UgJWQ6IGh3cHRyICVkPT4lZCBkbWFzaXplICVkXG4iLAorCQkJICAgIGNvZGVjLT5kZXZfYXVkaW8sIHZvaWNlLT5udW1iZXIsCisJCQkgICAgZG1hYnVmLT5od3B0ciwgcG9zLCBkbWFidWYtPmRtYXNpemUpOworCQkJcG9zID0gMDsKKwkJfQorCQlpZiAocG9zIDwgZG1hYnVmLT5od3B0cikgeworCQkJZGVsdGEgPSBkbWFidWYtPmRtYXNpemUgLSBkbWFidWYtPmh3cHRyOworCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgZG1hYnVmLT5od3B0ciwgc2lsZW5jZSwgZGVsdGEpOworCQkJZGVsdGEgKz0gcG9zOworCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmLCBzaWxlbmNlLCBwb3MpOworCQl9IGVsc2UgeworCQkJZGVsdGEgPSBwb3MgLSBkbWFidWYtPmh3cHRyOworCQkJbWVtc2V0KGRtYWJ1Zi0+cmF3YnVmICsgZG1hYnVmLT5od3B0ciwgc2lsZW5jZSwgZGVsdGEpOworCQl9CisJCWRtYWJ1Zi0+aHdwdHIgPSBwb3M7CisKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPT0gMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2klZDogJWQ6IHN0cmFpbjogaHdwdHIgJWRcbiIsCisJCQkgICAgY29kZWMtPmRldl9hdWRpbywgdm9pY2UtPm51bWJlciwgZG1hYnVmLT5od3B0cik7CisJCQl5bWZfcGxheWJhY2tfdHJpZ2dlcihjb2RlYywgeXBjbSwgMCk7CisJCX0KKworCQlpZiAoc3dwdHIgPD0gcG9zKSB7CisJCQlkaXN0YW5jZSA9IHBvcyAtIHN3cHRyOworCQl9IGVsc2UgeworCQkJZGlzdGFuY2UgPSBkbWFidWYtPmRtYXNpemUgLSAoc3dwdHIgLSBwb3MpOworCQl9CisJCWlmIChkaXN0YW5jZSA8IHJlZHpvbmUpIHsKKwkJCS8qCisJCQkgKiBod3B0ciBpbnNpZGUgcmVkem9uZSA9PiBETUEgcmFuIG91dCBvZiBzYW1wbGVzLgorCQkJICovCisJCQlpZiAoZGVsdGEgPCBkbWFidWYtPmNvdW50KSB7CisJCQkJLyoKKwkJCQkgKiBMb3N0IGludGVycnVwdCBvciBvdGhlciBzY3Jld2FnZS4KKwkJCQkgKi8KKwkJCQlwcmludGsoS0VSTl9FUlIgInltZnBjaSVkOiAlZDogbG9zdDogZGVsdGEgJWQiCisJCQkJICAgICIgaHdwdHIgJWQgc3dwdHIgJWQgZGlzdGFuY2UgJWQgY291bnQgJWRcbiIsCisJCQkJICAgIGNvZGVjLT5kZXZfYXVkaW8sIHZvaWNlLT5udW1iZXIsIGRlbHRhLAorCQkJCSAgICBkbWFidWYtPmh3cHRyLCBzd3B0ciwgZGlzdGFuY2UsIGRtYWJ1Zi0+Y291bnQpOworCQkJfSBlbHNlIHsKKwkJCQkvKgorCQkJCSAqIE5vcm1hbCBlbmQgb2YgRE1BLgorCQkJCSAqLworCQkJCVlNRkRCR0koInltZnBjaSVkOiAlZDogZG9uZTogZGVsdGEgJWQiCisJCQkJICAgICIgaHdwdHIgJWQgc3dwdHIgJWQgZGlzdGFuY2UgJWQgY291bnQgJWRcbiIsCisJCQkJICAgIGNvZGVjLT5kZXZfYXVkaW8sIHZvaWNlLT5udW1iZXIsIGRlbHRhLAorCQkJCSAgICBkbWFidWYtPmh3cHRyLCBzd3B0ciwgZGlzdGFuY2UsIGRtYWJ1Zi0+Y291bnQpOworCQkJfQorCQkJcGxheWVkID0gZG1hYnVmLT5jb3VudDsKKwkJCWlmICh5cGNtLT5ydW5uaW5nKSB7CisJCQkJeW1mX3BsYXliYWNrX3RyaWdnZXIoY29kZWMsIHlwY20sIDApOworCQkJfQorCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIGh3cHRyIGlzIGNoaXBwaW5nIGF3YXkgdG93YXJkcyBhIHJlbW90ZSBzd3B0ci4KKwkJCSAqIENhbGN1bGF0ZSBvdGhlciBkaXN0YW5jZSBhbmQgYXBwbHkgaXQgdG8gY291bnQuCisJCQkgKi8KKwkJCWlmIChzd3B0ciA+PSBwb3MpIHsKKwkJCQlkaXN0YW5jZSA9IHN3cHRyIC0gcG9zOworCQkJfSBlbHNlIHsKKwkJCQlkaXN0YW5jZSA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIChwb3MgLSBzd3B0cik7CisJCQl9CisJCQlpZiAoZGlzdGFuY2UgPCBkbWFidWYtPmNvdW50KSB7CisJCQkJcGxheWVkID0gZG1hYnVmLT5jb3VudCAtIGRpc3RhbmNlOworCQkJfSBlbHNlIHsKKwkJCQlwbGF5ZWQgPSAwOworCQkJfQorCQl9CisKKwkJZG1hYnVmLT50b3RhbF9ieXRlcyArPSBwbGF5ZWQ7CisJCWRtYWJ1Zi0+Y291bnQgLT0gcGxheWVkOworCQlpZiAoZG1hYnVmLT5jb3VudCA8IGRtYWJ1Zi0+ZG1hc2l6ZSAvIDIpIHsKKwkJCXdha2VfdXAoJmRtYWJ1Zi0+d2FpdCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmNvZGVjLT5yZWdfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHltZl9jYXBfaW50ZXJydXB0KHltZnBjaV90ICp1bml0LCBzdHJ1Y3QgeW1mX2NhcHR1cmUgKmNhcCkKK3sKKwlzdHJ1Y3QgeW1mX3BjbSAqeXBjbTsKKwlpbnQgcmVkem9uZTsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiAqZG1hYnVmOworCWludCBwb3MsIGRlbHRhOworCWludCBjbnQ7CisKKwlpZiAoKHlwY20gPSBjYXAtPnlwY20pID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHN0YXRlID0geXBjbS0+c3RhdGUpID09IE5VTEwpIHsKKwkJeXBjbS0+cnVubmluZyA9IDA7CS8vIGxvY2sgaXQKKwkJcmV0dXJuOworCX0KKwlkbWFidWYgPSAmeXBjbS0+ZG1hYnVmOworCXNwaW5fbG9jaygmdW5pdC0+cmVnX2xvY2spOworCWlmICh5cGNtLT5ydW5uaW5nKSB7CisJCXJlZHpvbmUgPSB5bWZfY2FsY19sZW5kKHN0YXRlLT5mb3JtYXQucmF0ZSk7CisJCXJlZHpvbmUgPDw9IChzdGF0ZS0+Zm9ybWF0LnNoaWZ0ICsgMSk7CisKKwkJcG9zID0gbGUzMl90b19jcHUoY2FwLT5iYW5rW3VuaXQtPmFjdGl2ZV9iYW5rXS5zdGFydCk7CisJCS8vIHBvcyA8PD0gc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwkJaWYgKHBvcyA8IDAgfHwgcG9zID49IGRtYWJ1Zi0+ZG1hc2l6ZSkgewkvKiB1Y29kZSBidWcgKi8KKwkJCXByaW50ayhLRVJOX0VSUiAieW1mcGNpJWQ6IHJ1bmF3YXkgY2FwdHVyZSAlZDogaHdwdHIgJWQ9PiVkIGRtYXNpemUgJWRcbiIsCisJCQkgICAgdW5pdC0+ZGV2X2F1ZGlvLCB5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyLAorCQkJICAgIGRtYWJ1Zi0+aHdwdHIsIHBvcywgZG1hYnVmLT5kbWFzaXplKTsKKwkJCXBvcyA9IDA7CisJCX0KKwkJaWYgKHBvcyA8IGRtYWJ1Zi0+aHdwdHIpIHsKKwkJCWRlbHRhID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5od3B0cjsKKwkJCWRlbHRhICs9IHBvczsKKwkJfSBlbHNlIHsKKwkJCWRlbHRhID0gcG9zIC0gZG1hYnVmLT5od3B0cjsKKwkJfQorCQlkbWFidWYtPmh3cHRyID0gcG9zOworCisJCWNudCA9IGRtYWJ1Zi0+Y291bnQ7CisJCWNudCArPSBkZWx0YTsKKwkJaWYgKGNudCArIHJlZHpvbmUgPiBkbWFidWYtPmRtYXNpemUpIHsKKwkJCS8qIE92ZXJmbG93IC0gYnVtcCBzd3B0ciAqLworCQkJZG1hYnVmLT5jb3VudCA9IGRtYWJ1Zi0+ZG1hc2l6ZSAtIHJlZHpvbmU7CisJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0ciArIHJlZHpvbmU7CisJCQlpZiAoZG1hYnVmLT5zd3B0ciA+PSBkbWFidWYtPmRtYXNpemUpIHsKKwkJCQlkbWFidWYtPnN3cHRyIC09IGRtYWJ1Zi0+ZG1hc2l6ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRtYWJ1Zi0+Y291bnQgPSBjbnQ7CisJCX0KKworCQlkbWFidWYtPnRvdGFsX2J5dGVzICs9IGRlbHRhOworCQlpZiAoZG1hYnVmLT5jb3VudCkgewkJLyogJiYgaXNfc2xlZXBpbmcgIFhYWCAqLworCQkJd2FrZV91cCgmZG1hYnVmLT53YWl0KTsKKwkJfQorCX0KKwlzcGluX3VubG9jaygmdW5pdC0+cmVnX2xvY2spOworfQorCitzdGF0aWMgaW50IHltZl9wbGF5YmFja190cmlnZ2VyKHltZnBjaV90ICpjb2RlYywgc3RydWN0IHltZl9wY20gKnlwY20sIGludCBjbWQpCit7CisKKwlpZiAoeXBjbS0+dm9pY2VzWzBdID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChjbWQgIT0gMCkgeworCQljb2RlYy0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMF0tPm51bWJlciArIDFdID0KKwkJICAgIGNwdV90b19sZTMyKHlwY20tPnZvaWNlc1swXS0+YmFua19iYSk7CisJCWlmICh5cGNtLT52b2ljZXNbMV0gIT0gTlVMTCkKKwkJCWNvZGVjLT5jdHJsX3BsYXliYWNrW3lwY20tPnZvaWNlc1sxXS0+bnVtYmVyICsgMV0gPQorCQkJICAgIGNwdV90b19sZTMyKHlwY20tPnZvaWNlc1sxXS0+YmFua19iYSk7CisJCXlwY20tPnJ1bm5pbmcgPSAxOworCX0gZWxzZSB7CisJCWNvZGVjLT5jdHJsX3BsYXliYWNrW3lwY20tPnZvaWNlc1swXS0+bnVtYmVyICsgMV0gPSAwOworCQlpZiAoeXBjbS0+dm9pY2VzWzFdICE9IE5VTEwpCisJCQljb2RlYy0+Y3RybF9wbGF5YmFja1t5cGNtLT52b2ljZXNbMV0tPm51bWJlciArIDFdID0gMDsKKwkJeXBjbS0+cnVubmluZyA9IDA7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5bWZfY2FwdHVyZV90cmlnZ2VyKHltZnBjaV90ICpjb2RlYywgc3RydWN0IHltZl9wY20gKnlwY20sIGludCBjbWQpCit7CisJdTMyIHRtcDsKKworCWlmIChjbWQgIT0gMCkgeworCQl0bXAgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9NQVBPRlJFQykgfCAoMSA8PCB5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyKTsKKwkJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX01BUE9GUkVDLCB0bXApOworCQl5cGNtLT5ydW5uaW5nID0gMTsKKwl9IGVsc2UgeworCQl0bXAgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9NQVBPRlJFQykgJiB+KDEgPDwgeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlcik7CisJCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9NQVBPRlJFQywgdG1wKTsKKwkJeXBjbS0+cnVubmluZyA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHltZnBjaV9wY21fdm9pY2VfYWxsb2Moc3RydWN0IHltZl9wY20gKnlwY20sIGludCB2b2ljZXMpCit7CisJc3RydWN0IHltZl91bml0ICp1bml0OworCWludCBlcnI7CisKKwl1bml0ID0geXBjbS0+c3RhdGUtPnVuaXQ7CisJaWYgKHlwY20tPnZvaWNlc1sxXSAhPSBOVUxMICYmIHZvaWNlcyA8IDIpIHsKKwkJeW1mcGNpX3ZvaWNlX2ZyZWUodW5pdCwgeXBjbS0+dm9pY2VzWzFdKTsKKwkJeXBjbS0+dm9pY2VzWzFdID0gTlVMTDsKKwl9CisJaWYgKHZvaWNlcyA9PSAxICYmIHlwY20tPnZvaWNlc1swXSAhPSBOVUxMKQorCQlyZXR1cm4gMDsJCS8qIGFscmVhZHkgYWxsb2NhdGVkICovCisJaWYgKHZvaWNlcyA9PSAyICYmIHlwY20tPnZvaWNlc1swXSAhPSBOVUxMICYmIHlwY20tPnZvaWNlc1sxXSAhPSBOVUxMKQorCQlyZXR1cm4gMDsJCS8qIGFscmVhZHkgYWxsb2NhdGVkICovCisJaWYgKHZvaWNlcyA+IDEpIHsKKwkJaWYgKHlwY20tPnZvaWNlc1swXSAhPSBOVUxMICYmIHlwY20tPnZvaWNlc1sxXSA9PSBOVUxMKSB7CisJCQl5bWZwY2lfdm9pY2VfZnJlZSh1bml0LCB5cGNtLT52b2ljZXNbMF0pOworCQkJeXBjbS0+dm9pY2VzWzBdID0gTlVMTDsKKwkJfQkJCisJCWlmICgoZXJyID0gdm9pY2VfYWxsb2ModW5pdCwgWU1GUENJX1BDTSwgMSwgeXBjbS0+dm9pY2VzKSkgPCAwKQorCQkJcmV0dXJuIGVycjsKKwkJeXBjbS0+dm9pY2VzWzBdLT55cGNtID0geXBjbTsKKwkJeXBjbS0+dm9pY2VzWzFdLT55cGNtID0geXBjbTsKKwl9IGVsc2UgeworCQlpZiAoKGVyciA9IHZvaWNlX2FsbG9jKHVuaXQsIFlNRlBDSV9QQ00sIDAsIHlwY20tPnZvaWNlcykpIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCXlwY20tPnZvaWNlc1swXS0+eXBjbSA9IHlwY207CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5bWZfcGNtX2luaXRfdm9pY2UoeW1mcGNpX3ZvaWNlX3QgKnZvaWNlLCBpbnQgc3RlcmVvLAorICAgIGludCByYXRlLCBpbnQgd18xNiwgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBpbnQgZW5kLCBpbnQgc3BkaWYpCit7CisJdTMyIGZvcm1hdDsKKwl1MzIgZGVsdGEgPSB5bWZwY2lfY2FsY19kZWx0YShyYXRlKTsKKwl1MzIgbHBmUSA9IHltZnBjaV9jYWxjX2xwZlEocmF0ZSk7CisJdTMyIGxwZksgPSB5bWZwY2lfY2FsY19scGZLKHJhdGUpOworCXltZnBjaV9wbGF5YmFja19iYW5rX3QgKmJhbms7CisJaW50IG5iYW5rOworCisJLyoKKwkgKiBUaGUgZ2FpbiBpcyBhIGZsb2F0aW5nIHBvaW50IG51bWJlci4gQWNjb3JkaW5nIHRvIHRoZSBtYW51YWwsCisJICogYml0IDMxIGluZGljYXRlcyBhIHNpZ24gYml0LCBiaXQgMzAgaW5kaWNhdGVzIGFuIGludGVnZXIgcGFydCwKKwkgKiBhbmQgYml0cyBbMjk6MTVdIGluZGljYXRlIGEgZGVjaW1hbCBmcmFjdGlvbiBwYXJ0LiBUaHVzLAorCSAqIGZvciBhIGdhaW4gb2YgMS4wIHRoZSBjb25zdGFudCBvZiAweDQwMDAwMDAwIGlzIGxvYWRlZC4KKwkgKi8KKwl1bnNpZ25lZCBkZWZhdWx0X2dhaW4gPSBjcHVfdG9fbGUzMigweDQwMDAwMDAwKTsKKworCWZvcm1hdCA9IChzdGVyZW8gPyAweDAwMDEwMDAwIDogMCkgfCAod18xNiA/IDAgOiAweDgwMDAwMDAwKTsKKwlpZiAoc3RlcmVvKQorCQllbmQgPj49IDE7CisJaWYgKHdfMTYpCisJCWVuZCA+Pj0gMTsKKwlmb3IgKG5iYW5rID0gMDsgbmJhbmsgPCAyOyBuYmFuaysrKSB7CisJCWJhbmsgPSAmdm9pY2UtPmJhbmtbbmJhbmtdOworCQliYW5rLT5mb3JtYXQgPSBjcHVfdG9fbGUzMihmb3JtYXQpOworCQliYW5rLT5sb29wX2RlZmF1bHQgPSAwOwkvKiAwLWxvb3BzIGZvcmV2ZXIsIG90aGVyd2lzZSBjb3VudCAqLworCQliYW5rLT5iYXNlID0gY3B1X3RvX2xlMzIoYWRkcik7CisJCWJhbmstPmxvb3Bfc3RhcnQgPSAwOworCQliYW5rLT5sb29wX2VuZCA9IGNwdV90b19sZTMyKGVuZCk7CisJCWJhbmstPmxvb3BfZnJhYyA9IDA7CisJCWJhbmstPmVnX2dhaW5fZW5kID0gZGVmYXVsdF9nYWluOworCQliYW5rLT5scGZRID0gY3B1X3RvX2xlMzIobHBmUSk7CisJCWJhbmstPnN0YXR1cyA9IDA7CisJCWJhbmstPm51bV9vZl9mcmFtZXMgPSAwOworCQliYW5rLT5sb29wX2NvdW50ID0gMDsKKwkJYmFuay0+c3RhcnQgPSAwOworCQliYW5rLT5zdGFydF9mcmFjID0gMDsKKwkJYmFuay0+ZGVsdGEgPQorCQliYW5rLT5kZWx0YV9lbmQgPSBjcHVfdG9fbGUzMihkZWx0YSk7CisJCWJhbmstPmxwZksgPQorCQliYW5rLT5scGZLX2VuZCA9IGNwdV90b19sZTMyKGxwZkspOworCQliYW5rLT5lZ19nYWluID0gZGVmYXVsdF9nYWluOworCQliYW5rLT5scGZEMSA9CisJCWJhbmstPmxwZkQyID0gMDsKKworCQliYW5rLT5sZWZ0X2dhaW4gPSAKKwkJYmFuay0+cmlnaHRfZ2FpbiA9CisJCWJhbmstPmxlZnRfZ2Fpbl9lbmQgPQorCQliYW5rLT5yaWdodF9nYWluX2VuZCA9CisJCWJhbmstPmVmZjFfZ2FpbiA9CisJCWJhbmstPmVmZjJfZ2FpbiA9CisJCWJhbmstPmVmZjNfZ2FpbiA9CisJCWJhbmstPmVmZjFfZ2Fpbl9lbmQgPQorCQliYW5rLT5lZmYyX2dhaW5fZW5kID0KKwkJYmFuay0+ZWZmM19nYWluX2VuZCA9IDA7CisKKwkJaWYgKCFzdGVyZW8pIHsKKwkJCWlmICghc3BkaWYpIHsKKwkJCQliYW5rLT5sZWZ0X2dhaW4gPSAKKwkJCQliYW5rLT5yaWdodF9nYWluID0KKwkJCQliYW5rLT5sZWZ0X2dhaW5fZW5kID0KKwkJCQliYW5rLT5yaWdodF9nYWluX2VuZCA9IGRlZmF1bHRfZ2FpbjsKKwkJCX0gZWxzZSB7CisJCQkJYmFuay0+ZWZmMl9nYWluID0KKwkJCQliYW5rLT5lZmYyX2dhaW5fZW5kID0KKwkJCQliYW5rLT5lZmYzX2dhaW4gPQorCQkJCWJhbmstPmVmZjNfZ2Fpbl9lbmQgPSBkZWZhdWx0X2dhaW47CisJCQl9CisJCX0gZWxzZSB7CisJCQlpZiAoIXNwZGlmKSB7CisJCQkJaWYgKCh2b2ljZS0+bnVtYmVyICYgMSkgPT0gMCkgeworCQkJCQliYW5rLT5sZWZ0X2dhaW4gPQorCQkJCQliYW5rLT5sZWZ0X2dhaW5fZW5kID0gZGVmYXVsdF9nYWluOworCQkJCX0gZWxzZSB7CisJCQkJCWJhbmstPmZvcm1hdCB8PSBjcHVfdG9fbGUzMigxKTsKKwkJCQkJYmFuay0+cmlnaHRfZ2FpbiA9CisJCQkJCWJhbmstPnJpZ2h0X2dhaW5fZW5kID0gZGVmYXVsdF9nYWluOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKCh2b2ljZS0+bnVtYmVyICYgMSkgPT0gMCkgeworCQkJCQliYW5rLT5lZmYyX2dhaW4gPQorCQkJCQliYW5rLT5lZmYyX2dhaW5fZW5kID0gZGVmYXVsdF9nYWluOworCQkJCX0gZWxzZSB7CisJCQkJCWJhbmstPmZvcm1hdCB8PSBjcHVfdG9fbGUzMigxKTsKKwkJCQkJYmFuay0+ZWZmM19nYWluID0KKwkJCQkJYmFuay0+ZWZmM19nYWluX2VuZCA9IGRlZmF1bHRfZ2FpbjsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKKy8qCisgKiBYWFggQ2FwdHVyZSBjaGFubmVsIGFsbG9jYXRpb24gaXMgZW50aXJlbHkgZmFrZSBhdCB0aGUgbW9tZW50LgorICogV2UgdXNlIG9ubHkgb25lIGNoYW5uZWwgYW5kIG1hcmsgaXQgYnVzeSBhcyByZXF1aXJlZC4KKyAqLworc3RhdGljIGludCB5bWZfY2FwdHVyZV9hbGxvYyhzdHJ1Y3QgeW1mX3VuaXQgKnVuaXQsIGludCAqcGJhbmspCit7CisJc3RydWN0IHltZl9jYXB0dXJlICpjYXA7CisJaW50IGNiYW5rOworCisJY2JhbmsgPSAxOwkJLyogT25seSBBREMgc2xvdCBpcyB1c2VkIGZvciBub3cuICovCisJY2FwID0gJnVuaXQtPmNhcHR1cmVbY2JhbmtdOworCWlmIChjYXAtPnVzZSkKKwkJcmV0dXJuIC1FQlVTWTsKKwljYXAtPnVzZSA9IDE7CisJKnBiYW5rID0gY2Jhbms7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeW1mX3BsYXliYWNrX3ByZXBhcmUoc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IHltZl9wY20gKnlwY20gPSAmc3RhdGUtPndwY207CisJaW50IGVyciwgbnZvaWNlOworCisJaWYgKChlcnIgPSB5bWZwY2lfcGNtX3ZvaWNlX2FsbG9jKHlwY20sIHN0YXRlLT5mb3JtYXQudm9pY2VzKSkgPCAwKSB7CisJCS8qIFNvbWVib2R5IHN0YXJ0ZWQgMzIgbXBnMTIzJ3MgaW4gcGFyYWxsZWw/ICovCisJCXByaW50ayhLRVJOX0lORk8gInltZnBjaSVkOiBjYW5ub3QgYWxsb2NhdGUgdm9pY2VcbiIsCisJCSAgICBzdGF0ZS0+dW5pdC0+ZGV2X2F1ZGlvKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlmb3IgKG52b2ljZSA9IDA7IG52b2ljZSA8IHN0YXRlLT5mb3JtYXQudm9pY2VzOyBudm9pY2UrKykgeworCQl5bWZfcGNtX2luaXRfdm9pY2UoeXBjbS0+dm9pY2VzW252b2ljZV0sCisJCSAgICBzdGF0ZS0+Zm9ybWF0LnZvaWNlcyA9PSAyLCBzdGF0ZS0+Zm9ybWF0LnJhdGUsCisJCSAgICB5bWZfcGNtX2Zvcm1hdF93aWR0aChzdGF0ZS0+Zm9ybWF0LmZvcm1hdCkgPT0gMTYsCisJCSAgICB5cGNtLT5kbWFidWYuZG1hX2FkZHIsIHlwY20tPmRtYWJ1Zi5kbWFzaXplLAorCQkgICAgeXBjbS0+c3BkaWYpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB5bWZfY2FwdHVyZV9wcmVwYXJlKHN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlKQoreworCXltZnBjaV90ICp1bml0ID0gc3RhdGUtPnVuaXQ7CisJc3RydWN0IHltZl9wY20gKnlwY20gPSAmc3RhdGUtPnJwY207CisJeW1mcGNpX2NhcHR1cmVfYmFua190ICogYmFuazsKKwkvKiBYWFggVGhpcyBpcyBjb25mdXNpbmcsIGdvdHRhIHJlbmFtZSBvbmUgb2YgdGhlbSBiYW5rcy4uLiAqLworCWludCBuYmFuazsJCS8qIGZsaXAtZmxvcCBiYW5rICovCisJaW50IGNiYW5rOwkJLyogaW5wdXQgW3N1cGVyLV1iYW5rICovCisJc3RydWN0IHltZl9jYXB0dXJlICpjYXA7CisJdTMyIHJhdGUsIGZvcm1hdDsKKworCWlmICh5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyID09IC0xKSB7CisJCWlmICh5bWZfY2FwdHVyZV9hbGxvYyh1bml0LCAmY2JhbmspICE9IDApCisJCQlyZXR1cm4gLUVCVVNZOworCisJCXlwY20tPmNhcHR1cmVfYmFua19udW1iZXIgPSBjYmFuazsKKworCQljYXAgPSAmdW5pdC0+Y2FwdHVyZVtjYmFua107CisJCWNhcC0+YmFuayA9IHVuaXQtPmJhbmtfY2FwdHVyZVtjYmFua11bMF07CisJCWNhcC0+eXBjbSA9IHlwY207CisJCXltZnBjaV9od19zdGFydCh1bml0KTsKKwl9CisKKwkvLyB5cGNtLT5mcmFnX3NpemUgPSBzbmRfcGNtX2xpYl90cmFuc2Zlcl9mcmFnbWVudChzdWJzdHJlYW0pOworCS8vIGZyYWdfc2l6ZSBpcyByZXBsYWNlZCB3aXRoIG5vbmZyYWdnZWQgYnl0ZS1hbGlnbmVkIHJvbGxpbmcgYnVmZmVyCisJcmF0ZSA9ICgoNDgwMDAgKiA0MDk2KSAvIHN0YXRlLT5mb3JtYXQucmF0ZSkgLSAxOworCWZvcm1hdCA9IDA7CisJaWYgKHN0YXRlLT5mb3JtYXQudm9pY2VzID09IDIpCisJCWZvcm1hdCB8PSAyOworCWlmICh5bWZfcGNtX2Zvcm1hdF93aWR0aChzdGF0ZS0+Zm9ybWF0LmZvcm1hdCkgPT0gOCkKKwkJZm9ybWF0IHw9IDE7CisJc3dpdGNoICh5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyKSB7CisJY2FzZSAwOgorCQl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9SRUNGT1JNQVQsIGZvcm1hdCk7CisJCXltZnBjaV93cml0ZWwodW5pdCwgWURTWEdSX1JFQ1NMT1RTUiwgcmF0ZSk7CisJCWJyZWFrOworCWNhc2UgMToKKwkJeW1mcGNpX3dyaXRlbCh1bml0LCBZRFNYR1JfQURDRk9STUFULCBmb3JtYXQpOworCQl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9BRENTTE9UU1IsIHJhdGUpOworCQlicmVhazsKKwl9CisJZm9yIChuYmFuayA9IDA7IG5iYW5rIDwgMjsgbmJhbmsrKykgeworCQliYW5rID0gdW5pdC0+YmFua19jYXB0dXJlW3lwY20tPmNhcHR1cmVfYmFua19udW1iZXJdW25iYW5rXTsKKwkJYmFuay0+YmFzZSA9IGNwdV90b19sZTMyKHlwY20tPmRtYWJ1Zi5kbWFfYWRkcik7CisJCS8vIGJhbmstPmxvb3BfZW5kID0geXBjbS0+ZG1hYnVmLmRtYXNpemUgPj4gc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwkJYmFuay0+bG9vcF9lbmQgPSBjcHVfdG9fbGUzMih5cGNtLT5kbWFidWYuZG1hc2l6ZSk7CisJCWJhbmstPnN0YXJ0ID0gMDsKKwkJYmFuay0+bnVtX29mX2xvb3BzID0gMDsKKwl9CisjaWYgMCAvKiBzL3BkaWYgKi8KKwlpZiAoc3RhdGUtPmRpZ2l0YWwuZGlnX3ZhbGlkKQorCQkvKnN0YXRlLT5kaWdpdGFsLnR5cGUgPT0gU05EX1BDTV9ESUdfQUVTX0lFQzk1OCovCisJCXltZnBjaV93cml0ZXcoY29kZWMsIFlEU1hHUl9TUERJRk9VVFNUQVRVUywKKwkJICAgIHN0YXRlLT5kaWdpdGFsLmRpZ19zdGF0dXNbMF0gfCAoc3RhdGUtPmRpZ2l0YWwuZGlnX3N0YXR1c1sxXSA8PCA4KSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlycXJldHVybl90IHltZl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl5bWZwY2lfdCAqY29kZWMgPSBkZXZfaWQ7CisJdTMyIHN0YXR1cywgbnZvaWNlLCBtb2RlOworCXN0cnVjdCB5bWZfdm9pY2UgKnZvaWNlOworCXN0cnVjdCB5bWZfY2FwdHVyZSAqY2FwOworCisJc3RhdHVzID0geW1mcGNpX3JlYWRsKGNvZGVjLCBZRFNYR1JfU1RBVFVTKTsKKwlpZiAoc3RhdHVzICYgMHg4MDAwMDAwMCkgeworCQljb2RlYy0+YWN0aXZlX2JhbmsgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9DVFJMU0VMRUNUKSAmIDE7CisJCXNwaW5fbG9jaygmY29kZWMtPnZvaWNlX2xvY2spOworCQlmb3IgKG52b2ljZSA9IDA7IG52b2ljZSA8IFlEU1hHX1BMQVlCQUNLX1ZPSUNFUzsgbnZvaWNlKyspIHsKKwkJCXZvaWNlID0gJmNvZGVjLT52b2ljZXNbbnZvaWNlXTsKKwkJCWlmICh2b2ljZS0+dXNlKQorCQkJCXltZl9wY21faW50ZXJydXB0KGNvZGVjLCB2b2ljZSk7CisJCX0KKwkJZm9yIChudm9pY2UgPSAwOyBudm9pY2UgPCBZRFNYR19DQVBUVVJFX1ZPSUNFUzsgbnZvaWNlKyspIHsKKwkJCWNhcCA9ICZjb2RlYy0+Y2FwdHVyZVtudm9pY2VdOworCQkJaWYgKGNhcC0+dXNlKQorCQkJCXltZl9jYXBfaW50ZXJydXB0KGNvZGVjLCBjYXApOworCQl9CisJCXNwaW5fdW5sb2NrKCZjb2RlYy0+dm9pY2VfbG9jayk7CisJCXNwaW5fbG9jaygmY29kZWMtPnJlZ19sb2NrKTsKKwkJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX1NUQVRVUywgMHg4MDAwMDAwMCk7CisJCW1vZGUgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9NT0RFKSB8IDI7CisJCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9NT0RFLCBtb2RlKTsKKwkJc3Bpbl91bmxvY2soJmNvZGVjLT5yZWdfbG9jayk7CisJfQorCisJc3RhdHVzID0geW1mcGNpX3JlYWRsKGNvZGVjLCBZRFNYR1JfSU5URkxBRyk7CisJaWYgKHN0YXR1cyAmIDEpIHsKKwkJLyogdGltZXIgaGFuZGxlciAqLworCQl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfSU5URkxBRywgfjApOworCX0KKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyB2b2lkIHltZl9wY21fZnJlZV9zdWJzdHJlYW0oc3RydWN0IHltZl9wY20gKnlwY20pCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgeW1mX3VuaXQgKnVuaXQ7CisKKwl1bml0ID0geXBjbS0+c3RhdGUtPnVuaXQ7CisKKwlpZiAoeXBjbS0+dHlwZSA9PSBQTEFZQkFDS19WT0lDRSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+dm9pY2VfbG9jaywgZmxhZ3MpOworCQlpZiAoeXBjbS0+dm9pY2VzWzFdKQorCQkJeW1mcGNpX3ZvaWNlX2ZyZWUodW5pdCwgeXBjbS0+dm9pY2VzWzFdKTsKKwkJaWYgKHlwY20tPnZvaWNlc1swXSkKKwkJCXltZnBjaV92b2ljZV9mcmVlKHVuaXQsIHlwY20tPnZvaWNlc1swXSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnZvaWNlX2xvY2ssIGZsYWdzKTsKKwl9IGVsc2UgeworCQlpZiAoeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlciAhPSAtMSkgeworCQkJdW5pdC0+Y2FwdHVyZVt5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyXS51c2UgPSAwOworCQkJeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlciA9IC0xOworCQkJeW1mcGNpX2h3X3N0b3AodW5pdCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgeW1mX3N0YXRlICp5bWZfc3RhdGVfYWxsb2MoeW1mcGNpX3QgKnVuaXQpCit7CisJc3RydWN0IHltZl9wY20gKnlwY207CisJc3RydWN0IHltZl9zdGF0ZSAqc3RhdGU7CisKKwlpZiAoKHN0YXRlID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHltZl9zdGF0ZSksIEdGUF9LRVJORUwpKSA9PSBOVUxMKSB7CisJCWdvdG8gb3V0MDsKKwl9CisJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RydWN0IHltZl9zdGF0ZSkpOworCisJeXBjbSA9ICZzdGF0ZS0+d3BjbTsKKwl5cGNtLT5zdGF0ZSA9IHN0YXRlOworCXlwY20tPnR5cGUgPSBQTEFZQkFDS19WT0lDRTsKKwl5cGNtLT5jYXB0dXJlX2JhbmtfbnVtYmVyID0gLTE7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmeXBjbS0+ZG1hYnVmLndhaXQpOworCisJeXBjbSA9ICZzdGF0ZS0+cnBjbTsKKwl5cGNtLT5zdGF0ZSA9IHN0YXRlOworCXlwY20tPnR5cGUgPSBDQVBUVVJFX0FDOTc7CisJeXBjbS0+Y2FwdHVyZV9iYW5rX251bWJlciA9IC0xOworCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnlwY20tPmRtYWJ1Zi53YWl0KTsKKworCXN0YXRlLT51bml0ID0gdW5pdDsKKworCXN0YXRlLT5mb3JtYXQuZm9ybWF0ID0gQUZNVF9VODsKKwlzdGF0ZS0+Zm9ybWF0LnJhdGUgPSA4MDAwOworCXN0YXRlLT5mb3JtYXQudm9pY2VzID0gMTsKKwl5bWZfcGNtX3VwZGF0ZV9zaGlmdCgmc3RhdGUtPmZvcm1hdCk7CisKKwlyZXR1cm4gc3RhdGU7CisKK291dDA6CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEFFUy9JRUM5NTggY2hhbm5lbCBzdGF0dXMgYml0cyAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPRkVTU0lPTkFMCSgxPDwwKQkvKiAwID0gY29uc3VtZXIsIDEgPSBwcm9mZXNzaW9uYWwgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMwX05PTkFVRElPCQkoMTw8MSkJLyogMCA9IGF1ZGlvLCAxID0gbm9uLWF1ZGlvICovCisjZGVmaW5lIFNORF9QQ01fQUVTMF9QUk9fRU1QSEFTSVMJKDc8PDIpCS8qIG1hc2sgLSBlbXBoYXNpcyAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPX0VNUEhBU0lTX05PVElECSgwPDwyKQkvKiBlbXBoYXNpcyBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIFNORF9QQ01fQUVTMF9QUk9fRU1QSEFTSVNfTk9ORQkoMTw8MikJLyogbm9uZSBlbXBoYXNpcyAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPX0VNUEhBU0lTXzUwMTUJKDM8PDIpCS8qIDUwLzE1dXMgZW1waGFzaXMgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMwX1BST19FTVBIQVNJU19DQ0lUVAkoNzw8MikJLyogQ0NJVFQgSi4xNyBlbXBoYXNpcyAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPX0ZSRVFfVU5MT0NLRUQJKDE8PDUpCS8qIHNvdXJjZSBzYW1wbGUgZnJlcXVlbmN5OiAwID0gbG9ja2VkLCAxID0gdW5sb2NrZWQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMwX1BST19GUwkJKDM8PDYpCS8qIG1hc2sgLSBzYW1wbGUgZnJlcXVlbmN5ICovCisjZGVmaW5lIFNORF9QQ01fQUVTMF9QUk9fRlNfTk9USUQJKDA8PDYpCS8qIGZzIG5vdCBpbmRpY2F0ZWQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMwX1BST19GU180NDEwMAkoMTw8NikJLyogNDQuMWtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPX0ZTXzQ4MDAwCSgyPDw2KQkvKiA0OGtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfUFJPX0ZTXzMyMDAwCSgzPDw2KQkvKiAzMmtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfQ09OX05PVF9DT1BZUklHSFQJKDE8PDIpCS8qIDAgPSBjb3B5cmlnaHQsIDEgPSBub3QgY29weXJpZ2h0ICovCisjZGVmaW5lIFNORF9QQ01fQUVTMF9DT05fRU1QSEFTSVMJKDc8PDMpCS8qIG1hc2sgLSBlbXBoYXNpcyAqLworI2RlZmluZSBTTkRfUENNX0FFUzBfQ09OX0VNUEhBU0lTX05PTkUJKDA8PDMpCS8qIG5vbmUgZW1waGFzaXMgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMwX0NPTl9FTVBIQVNJU181MDE1CSgxPDwzKQkvKiA1MC8xNXVzIGVtcGhhc2lzICovCisjZGVmaW5lIFNORF9QQ01fQUVTMF9DT05fTU9ERQkJKDM8PDYpCS8qIG1hc2sgLSBtb2RlICovCisjZGVmaW5lIFNORF9QQ01fQUVTMV9QUk9fTU9ERQkJKDE1PDwwKQkvKiBtYXNrIC0gY2hhbm5lbCBtb2RlICovCisjZGVmaW5lIFNORF9QQ01fQUVTMV9QUk9fTU9ERV9OT1RJRAkoMDw8MCkJLyogbm90IGluZGljYXRlZCAqLworI2RlZmluZSBTTkRfUENNX0FFUzFfUFJPX01PREVfU1RFUkVPUEhPTklDICgyPDwwKSAvKiBzdGVyZW9waG9uaWMgLSBjaCBBIGlzIGxlZnQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMxX1BST19NT0RFX1NJTkdMRQkoNDw8MCkJLyogc2luZ2xlIGNoYW5uZWwgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMxX1BST19NT0RFX1RXTwkoODw8MCkJLyogdHdvIGNoYW5uZWxzICovCisjZGVmaW5lIFNORF9QQ01fQUVTMV9QUk9fTU9ERV9QUklNQVJZCSgxMjw8MCkJLyogcHJpbWFyeS9zZWNvbmRhcnkgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMxX1BST19NT0RFX0JZVEUzCSgxNTw8MCkJLyogdmVjdG9yIHRvIGJ5dGUgMyAqLworI2RlZmluZSBTTkRfUENNX0FFUzFfUFJPX1VTRVJCSVRTCSgxNTw8NCkJLyogbWFzayAtIHVzZXIgYml0cyAqLworI2RlZmluZSBTTkRfUENNX0FFUzFfUFJPX1VTRVJCSVRTX05PVElECSgwPDw0KQkvKiBub3QgaW5kaWNhdGVkICovCisjZGVmaW5lIFNORF9QQ01fQUVTMV9QUk9fVVNFUkJJVFNfMTkyCSg4PDw0KQkvKiAxOTItYml0IHN0cnVjdHVyZSAqLworI2RlZmluZSBTTkRfUENNX0FFUzFfUFJPX1VTRVJCSVRTX1VERUYJKDEyPDw0KQkvKiB1c2VyIGRlZmluZWQgYXBwbGljYXRpb24gKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9DQVRFR09SWQkweDdmCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fR0VORVJBTAkweDAwCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fRVhQRVJJTUVOVEFMCTB4NDAKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9TT0xJRE1FTV9NQVNLCTB4MGYKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9TT0xJRE1FTV9JRAkweDA4CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fQlJPQURDQVNUMV9NQVNLIDB4MDcKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9CUk9BRENBU1QxX0lECTB4MDQKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9ESUdESUdDT05WX01BU0sgMHgwNworI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX0RJR0RJR0NPTlZfSUQJMHgwMgorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX0FEQ19DT1BZUklHSFRfTUFTSyAweDFmCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fQURDX0NPUFlSSUdIVF9JRCAweDA2CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fQURDX01BU0sJMHgxZgorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX0FEQ19JRAkJMHgxNgorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX0JST0FEQ0FTVDJfTUFTSyAweDBmCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fQlJPQURDQVNUMl9JRAkweDBlCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fTEFTRVJPUFRfTUFTSwkweDA3CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fTEFTRVJPUFRfSUQJMHgwMQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX01VU0lDQUxfTUFTSwkweDA3CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fTVVTSUNBTF9JRAkweDA1CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fTUFHTkVUSUNfTUFTSwkweDA3CisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fTUFHTkVUSUNfSUQJMHgwMworI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX0lFQzkwOF9DRAkoU05EX1BDTV9BRVMxX0NPTl9MQVNFUk9QVF9JRHwweDAwKQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX05PTl9JRUM5MDhfQ0QJKFNORF9QQ01fQUVTMV9DT05fTEFTRVJPUFRfSUR8MHgwOCkKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9QQ01fQ09ERVIJKFNORF9QQ01fQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDAwKQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX1NBTVBMRVIJKFNORF9QQ01fQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDIwKQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX01JWEVSCQkoU05EX1BDTV9BRVMxX0NPTl9ESUdESUdDT05WX0lEfDB4MTApCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fUkFURV9DT05WRVJURVIJKFNORF9QQ01fQUVTMV9DT05fRElHRElHQ09OVl9JRHwweDE4KQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX1NZTlRIRVNJWkVSCShTTkRfUENNX0FFUzFfQ09OX01VU0lDQUxfSUR8MHgwMCkKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9NSUNST1BIT05FCShTTkRfUENNX0FFUzFfQ09OX01VU0lDQUxfSUR8MHgwOCkKKyNkZWZpbmUgU05EX1BDTV9BRVMxX0NPTl9EQVQJCShTTkRfUENNX0FFUzFfQ09OX01BR05FVElDX0lEfDB4MDApCisjZGVmaW5lIFNORF9QQ01fQUVTMV9DT05fVkNSCQkoU05EX1BDTV9BRVMxX0NPTl9NQUdORVRJQ19JRHwweDA4KQorI2RlZmluZSBTTkRfUENNX0FFUzFfQ09OX09SSUdJTkFMCSgxPDw3KQkvKiB0aGlzIGJpdHMgZGVwZW5kcyBvbiB0aGUgY2F0ZWdvcnkgY29kZSAqLworI2RlZmluZSBTTkRfUENNX0FFUzJfUFJPX1NCSVRTCQkoNzw8MCkJLyogbWFzayAtIHNhbXBsZSBiaXRzICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9QUk9fU0JJVFNfMjAJKDI8PDApCS8qIDIwLWJpdCAtIGNvb3JkaW5hdGlvbiAqLworI2RlZmluZSBTTkRfUENNX0FFUzJfUFJPX1NCSVRTXzI0CSg0PDwwKQkvKiAyNC1iaXQgLSBtYWluIGF1ZGlvICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9QUk9fU0JJVFNfVURFRgkoNjw8MCkJLyogdXNlciBkZWZpbmVkIGFwcGxpY2F0aW9uICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9QUk9fV09SRExFTgkoNzw8MykJLyogbWFzayAtIHNvdXJjZSB3b3JkIGxlbmd0aCAqLworI2RlZmluZSBTTkRfUENNX0FFUzJfUFJPX1dPUkRMRU5fTk9USUQJKDA8PDMpCS8qIG5vdCBpbmRpY2F0ZWQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMyX1BST19XT1JETEVOXzIyXzE4CSgyPDwzKQkvKiAyMi1iaXQgb3IgMTgtYml0ICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9QUk9fV09SRExFTl8yM18xOQkoNDw8MykJLyogMjMtYml0IG9yIDE5LWJpdCAqLworI2RlZmluZSBTTkRfUENNX0FFUzJfUFJPX1dPUkRMRU5fMjRfMjAJKDU8PDMpCS8qIDI0LWJpdCBvciAyMC1iaXQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMyX1BST19XT1JETEVOXzIwXzE2CSg2PDwzKQkvKiAyMC1iaXQgb3IgMTYtYml0ICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9DT05fU09VUkNFCQkoMTU8PDApCS8qIG1hc2sgLSBzb3VyY2UgbnVtYmVyICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9DT05fU09VUkNFX1VOU1BFQwkoMDw8MCkJLyogdW5zcGVjaWZpZWQgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMyX0NPTl9DSEFOTkVMCSgxNTw8NCkJLyogbWFzayAtIGNoYW5uZWwgbnVtYmVyICovCisjZGVmaW5lIFNORF9QQ01fQUVTMl9DT05fQ0hBTk5FTF9VTlNQRUMJKDA8PDQpCS8qIHVuc3BlY2lmaWVkICovCisjZGVmaW5lIFNORF9QQ01fQUVTM19DT05fRlMJCSgxNTw8MCkJLyogbWFzayAtIHNhbXBsZSBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMzX0NPTl9GU180NDEwMAkoMDw8MCkJLyogNDQuMWtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzNfQ09OX0ZTXzQ4MDAwCSgyPDwwKQkvKiA0OGtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzNfQ09OX0ZTXzMyMDAwCSgzPDwwKQkvKiAzMmtIeiAqLworI2RlZmluZSBTTkRfUENNX0FFUzNfQ09OX0NMT0NLCQkoMzw8NCkJLyogbWFzayAtIGNsb2NrIGFjY3VyYWN5ICovCisjZGVmaW5lIFNORF9QQ01fQUVTM19DT05fQ0xPQ0tfMTAwMFBQTQkoMDw8NCkJLyogMTAwMCBwcG0gKi8KKyNkZWZpbmUgU05EX1BDTV9BRVMzX0NPTl9DTE9DS181MFBQTQkoMTw8NCkJLyogNTAgcHBtICovCisjZGVmaW5lIFNORF9QQ01fQUVTM19DT05fQ0xPQ0tfVkFSSUFCTEUJKDI8PDQpCS8qIHZhcmlhYmxlIHBpdGNoICovCisKKy8qCisgKiBVc2VyIGludGVyZmFjZQorICovCisKKy8qCisgKiBpbiB0aGlzIGxvb3AsIGRtYWJ1Zi5jb3VudCBzaWduaWZpZXMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMKKyAqIHdhaXRpbmcgdG8gYmUgY29waWVkIHRvIHRoZSB1c2VyJ3MgYnVmZmVyLiAgaXQgaXMgZmlsbGVkIGJ5IHRoZSBkbWEKKyAqIG1hY2hpbmUgYW5kIGRyYWluZWQgYnkgdGhpcyBsb29wLgorICovCitzdGF0aWMgc3NpemVfdAoreW1mX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB5bWZfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHltZl9kbWFidWYgKmRtYWJ1ZiA9ICZzdGF0ZS0+cnBjbS5kbWFidWY7CisJc3RydWN0IHltZl91bml0ICp1bml0ID0gc3RhdGUtPnVuaXQ7CisJREVDTEFSRV9XQUlUUVVFVUUod2FpdGEsIGN1cnJlbnQpOworCXNzaXplX3QgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IHN3cHRyOworCWludCBjbnQ7CQkJLyogVGhpcyBtYW55IHRvIGdvIGluIHRoaXMgcmV2b2x1dGlvbiAqLworCisJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDEpKSkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSAwOworCisJYWRkX3dhaXRfcXVldWUoJmRtYWJ1Zi0+d2FpdCwgJndhaXRhKTsKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXdoaWxlIChjb3VudCA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCWlmICh1bml0LT5zdXNwZW5kZWQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KSByZXQgPSAtRUFHQUlOOworCQkJCWJyZWFrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJc3dwdHIgPSBkbWFidWYtPnN3cHRyOworCQljbnQgPSBkbWFidWYtPmRtYXNpemUgLSBzd3B0cjsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPCBjbnQpCisJCQljbnQgPSBkbWFidWYtPmNvdW50OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCisJCWlmIChjbnQgPiBjb3VudCkKKwkJCWNudCA9IGNvdW50OworCQlpZiAoY250IDw9IDApIHsKKwkJCXVuc2lnbmVkIGxvbmcgdG1vOworCQkJLyogYnVmZmVyIGlzIGVtcHR5LCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kIHdhaXQgZm9yIGRhdGEgdG8gYmUKKwkJCSAgIHJlY29yZGVkICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQlpZiAoIXN0YXRlLT5ycGNtLnJ1bm5pbmcpIHsKKwkJCQl5bWZfY2FwdHVyZV90cmlnZ2VyKHN0YXRlLT51bml0LCAmc3RhdGUtPnJwY20sIDEpOworCQkJfQorCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlpZiAoIXJldCkgcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIFRoaXMgaXNudCBzdHJpY3RseSByaWdodCBmb3IgdGhlIDgxMCAgYnV0IGl0J2xsIGRvICovCisJCQl0bW8gPSAoZG1hYnVmLT5kbWFzaXplICogSFopIC8gKHN0YXRlLT5mb3JtYXQucmF0ZSAqIDIpOworCQkJdG1vID4+PSBzdGF0ZS0+Zm9ybWF0LnNoaWZ0OworCQkJLyogVGhlcmUgYXJlIHR3byBzaXR1YXRpb25zIHdoZW4gc2xlZXBfb25fdGltZW91dCByZXR1cm5zLCBvbmUgaXMgd2hlbgorCQkJICAgdGhlIGludGVycnVwdCBpcyBzZXJ2aWNlZCBjb3JyZWN0bHkgYW5kIHRoZSBwcm9jZXNzIGlzIHdha2VkIHVwIGJ5CisJCQkgICBJU1IgT04gVElNRS4gQW5vdGhlciBpcyB3aGVuIHRpbWVvdXQgaXMgZXhwaXJlZCwgd2hpY2ggbWVhbnMgdGhhdAorCQkJICAgZWl0aGVyIGludGVycnVwdCBpcyBOT1Qgc2VydmljZWQgY29ycmVjdGx5IChwZW5kaW5nIGludGVycnVwdCkgb3IgaXQKKwkJCSAgIGlzIFRPTyBMQVRFIGZvciB0aGUgcHJvY2VzcyB0byBiZSBzY2hlZHVsZWQgdG8gcnVuIChzY2hlZHVsZXIgbGF0ZW5jeSkKKwkJCSAgIHdoaWNoIHJlc3VsdHMgaW4gYSAocG90ZW50aWFsKSBidWZmZXIgb3ZlcnJ1bi4gQW5kIHdvcnNlLCB0aGVyZSBpcworCQkJICAgTk9USElORyB3ZSBjYW4gZG8gdG8gcHJldmVudCBpdC4gKi8KKwkJCXRtbyA9IHNjaGVkdWxlX3RpbWVvdXQodG1vKTsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAodG1vID09IDAgJiYgZG1hYnVmLT5jb3VudCA9PSAwKSB7CisJCQkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2klZDogcmVjb3JkaW5nIHNjaGVkdWxlIHRpbWVvdXQsICIKKwkJCQkgICAgImRtYXN6ICV1IGZyYWdzeiAldSBjb3VudCAlaSBod3B0ciAldSBzd3B0ciAldVxuIiwKKwkJCQkgICAgc3RhdGUtPnVuaXQtPmRldl9hdWRpbywKKwkJCQkgICAgZG1hYnVmLT5kbWFzaXplLCBkbWFidWYtPmZyYWdzaXplLCBkbWFidWYtPmNvdW50LAorCQkJCSAgICBkbWFidWYtPmh3cHRyLCBkbWFidWYtPnN3cHRyKTsKKwkJCX0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CisJCQkJaWYgKCFyZXQpIHJldCA9IC1FUkVTVEFSVFNZUzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNvcHlfdG9fdXNlcihidWZmZXIsIGRtYWJ1Zi0+cmF3YnVmICsgc3dwdHIsIGNudCkpIHsKKwkJCWlmICghcmV0KSByZXQgPSAtRUZBVUxUOworCQkJYnJlYWs7CisJCX0KKworCQlzd3B0ciA9IChzd3B0ciArIGNudCkgJSBkbWFidWYtPmRtYXNpemU7CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCWlmICh1bml0LT5zdXNwZW5kZWQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKKwkJZG1hYnVmLT5jb3VudCAtPSBjbnQ7CisJCS8vIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisKKwkJY291bnQgLT0gY250OworCQlidWZmZXIgKz0gY250OworCQlyZXQgKz0gY250OworCQkvLyBzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJaWYgKCFzdGF0ZS0+cnBjbS5ydW5uaW5nKSB7CisJCQl5bWZfY2FwdHVyZV90cmlnZ2VyKHVuaXQsICZzdGF0ZS0+cnBjbSwgMSk7CisJCX0KKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwl9CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlyZW1vdmVfd2FpdF9xdWV1ZSgmZG1hYnVmLT53YWl0LCAmd2FpdGEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QKK3ltZl93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHltZl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwlzdHJ1Y3QgeW1mX3VuaXQgKnVuaXQgPSBzdGF0ZS0+dW5pdDsKKwlERUNMQVJFX1dBSVRRVUVVRSh3YWl0YSwgY3VycmVudCk7CisJc3NpemVfdCByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgc3dwdHI7CisJaW50IGNudDsJCQkvKiBUaGlzIG1hbnkgdG8gZ28gaW4gdGhpcyByZXZvbHV0aW9uICovCisJaW50IHJlZHpvbmU7CisJaW50IGRlbGF5OworCisJWU1GREJHVygieW1mX3dyaXRlOiBjb3VudCAlZFxuIiwgY291bnQpOworCisJaWYgKGRtYWJ1Zi0+bWFwcGVkKQorCQlyZXR1cm4gLUVOWElPOworCWlmICghZG1hYnVmLT5yZWFkeSAmJiAocmV0ID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSkKKwkJcmV0dXJuIHJldDsKKwlyZXQgPSAwOworCisJLyoKKwkgKiBBbGFuJ3MgY3M0Nnh4IHdvcmtzIHdpdGhvdXQgYSByZWQgem9uZSAtIG1hcnZlbCBvZiBpbmdlbnVpdHkuCisJICogV2UgYXJlIG5vdCBzbyBicmlsbGlhbnQuLi4gUmVkIHpvbmUgZG9lcyB0d28gdGhpbmdzOgorCSAqICAxLiBhbGxvd3MgZm9yIHNhZmUgc3RhcnQgYWZ0ZXIgYSBwYXVzZSBhcyB3ZSBoYXZlIG5vIHdheQorCSAqICAgICB0byBrbm93IHdoYXQgdGhlIGFjdHVhbCwgcmVsZW50bGVzc2x5IGFkdmFuY2luZywgaHdwdHIgaXMuCisJICogIDIuIG1ha2VzIGNvbXB1dGF0aW9ucyBpbiB5bWZfcGNtX2ludGVycnVwdCBzaW1wbGVyLgorCSAqLworCXJlZHpvbmUgPSB5bWZfY2FsY19sZW5kKHN0YXRlLT5mb3JtYXQucmF0ZSkgPDwgc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwlyZWR6b25lICo9IDM7CS8qIDIgcmVkem9uZSArIDEgcG9zc2libGUgdW5jZXJ0YWludHkgcmVzZXJ2ZS4gKi8KKworCWFkZF93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0YSk7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQlpZiAodW5pdC0+c3VzcGVuZGVkKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJc2NoZWR1bGUoKTsKKwkJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpIHsKKwkJCQlpZiAoIXJldCkgcmV0ID0gLUVBR0FJTjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChkbWFidWYtPmNvdW50IDwgMCkgeworCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkgICAieW1mX3dyaXRlOiBjb3VudCAlZCwgd2FzIGxlZ2FsIGluIGNzNDZ4eFxuIiwKKwkJCSAgICBkbWFidWYtPmNvdW50KTsKKwkJCWRtYWJ1Zi0+Y291bnQgPSAwOworCQl9CisJCWlmIChkbWFidWYtPmNvdW50ID09IDApIHsKKwkJCXN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwkJCWlmIChzdGF0ZS0+d3BjbS5ydW5uaW5nKSB7CisJCQkJLyoKKwkJCQkgKiBBZGQgdW5jZXJ0YWludHkgcmVzZXJ2ZS4KKwkJCQkgKi8KKwkJCQljbnQgPSB5bWZfY2FsY19sZW5kKHN0YXRlLT5mb3JtYXQucmF0ZSk7CisJCQkJY250IDw8PSBzdGF0ZS0+Zm9ybWF0LnNoaWZ0OworCQkJCWlmICgoc3dwdHIgKz0gY250KSA+PSBkbWFidWYtPmRtYXNpemUpIHsKKwkJCQkJc3dwdHIgLT0gZG1hYnVmLT5kbWFzaXplOworCQkJCX0KKwkJCX0KKwkJCWRtYWJ1Zi0+c3dwdHIgPSBzd3B0cjsKKwkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBYWFggVGhpcyBpcyBub3QgcmlnaHQgaWYgZG1hYnVmLT5jb3VudCBpcyBzbWFsbCAtCisJCQkgKiBhYm91dCAyKnggZnJhbWUgc2l6ZSBvciBsZXNzLiBXZSBjYW5ub3QgY291bnQgb24KKwkJCSAqIG9uIGFwcGVuZGluZyBhbmQgbm90IGNhdXNpbmcgYW4gYXJ0ZWZhY3QuCisJCQkgKiBTaG91bGQgdXNlIGEgdmFyaWF0aW9uIG9mIHRoZSBjb3VudD09MCBjYXNlIGFib3ZlLgorCQkJICovCisJCQlzd3B0ciA9IGRtYWJ1Zi0+c3dwdHI7CisJCX0KKwkJY250ID0gZG1hYnVmLT5kbWFzaXplIC0gc3dwdHI7CisJCWlmIChkbWFidWYtPmNvdW50ICsgY250ID4gZG1hYnVmLT5kbWFzaXplIC0gcmVkem9uZSkKKwkJCWNudCA9IChkbWFidWYtPmRtYXNpemUgLSByZWR6b25lKSAtIGRtYWJ1Zi0+Y291bnQ7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisKKwkJaWYgKGNudCA+IGNvdW50KQorCQkJY250ID0gY291bnQ7CisJCWlmIChjbnQgPD0gMCkgeworCQkJWU1GREJHVygieW1mX3dyaXRlOiBmdWxsLCBjb3VudCAlZCBzd3B0ciAlZFxuIiwKKwkJCSAgIGRtYWJ1Zi0+Y291bnQsIGRtYWJ1Zi0+c3dwdHIpOworCQkJLyoKKwkJCSAqIGJ1ZmZlciBpcyBmdWxsLCBzdGFydCB0aGUgZG1hIG1hY2hpbmUgYW5kCisJCQkgKiB3YWl0IGZvciBkYXRhIHRvIGJlIHBsYXllZAorCQkJICovCisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCWlmICghc3RhdGUtPndwY20ucnVubmluZykgeworCQkJCXltZl9wbGF5YmFja190cmlnZ2VyKHVuaXQsICZzdGF0ZS0+d3BjbSwgMSk7CisJCQl9CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKSB7CisJCQkJaWYgKCFyZXQpIHJldCA9IC1FQUdBSU47CisJCQkJYnJlYWs7CisJCQl9CisJCQlzY2hlZHVsZSgpOworCQkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJCWlmIChzaWduYWxfcGVuZGluZyhjdXJyZW50KSkgeworCQkJCWlmICghcmV0KSByZXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY29weV9mcm9tX3VzZXIoZG1hYnVmLT5yYXdidWYgKyBzd3B0ciwgYnVmZmVyLCBjbnQpKSB7CisJCQlpZiAoIXJldCkgcmV0ID0gLUVGQVVMVDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKChzd3B0ciArPSBjbnQpID49IGRtYWJ1Zi0+ZG1hc2l6ZSkgeworCQkJc3dwdHIgLT0gZG1hYnVmLT5kbWFzaXplOworCQl9CisKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCWlmICh1bml0LT5zdXNwZW5kZWQpIHsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQljb250aW51ZTsKKwkJfQorCQlkbWFidWYtPnN3cHRyID0gc3dwdHI7CisJCWRtYWJ1Zi0+Y291bnQgKz0gY250OworCisJCS8qCisJCSAqIFN0YXJ0IGhlcmUgaXMgYSBiYWQgaWRlYSAtIG1heSBjYXVzZSBzdGFydHVwIGNsaWNrCisJCSAqIGluIC9iaW4vcGxheSB3aGVuIGRtYWJ1ZiBpcyBub3QgZnVsbCB5ZXQuCisJCSAqIEhvd2V2ZXIsIHNvbWUgYnJva2VuIGFwcGxpY2F0aW9ucyBkbyBub3QgbWFrZQorCQkgKiBhbnkgdXNlIG9mIFNORENUTF9EU1BfU1lOQyAoRG9vbSBpcyB0aGUgd29yc3QpLgorCQkgKiBPbmUgZnJhbWUgaXMgYWJvdXQgNS4zbXMsIERvb20gd3JpdGUgc2l6ZSBpcyA0Nm1zLgorCQkgKi8KKwkJZGVsYXkgPSBzdGF0ZS0+Zm9ybWF0LnJhdGUgLyAyMDsJLyogNTBtcyAqLworCQlkZWxheSA8PD0gc3RhdGUtPmZvcm1hdC5zaGlmdDsKKwkJaWYgKGRtYWJ1Zi0+Y291bnQgPj0gZGVsYXkgJiYgIXN0YXRlLT53cGNtLnJ1bm5pbmcpIHsKKwkJCXltZl9wbGF5YmFja190cmlnZ2VyKHVuaXQsICZzdGF0ZS0+d3BjbSwgMSk7CisJCX0KKworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCisJCWNvdW50IC09IGNudDsKKwkJYnVmZmVyICs9IGNudDsKKwkJcmV0ICs9IGNudDsKKwl9CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCXJlbW92ZV93YWl0X3F1ZXVlKCZkbWFidWYtPndhaXQsICZ3YWl0YSk7CisKKwlZTUZEQkdXKCJ5bWZfd3JpdGU6IHJldCAlZCBkbWFidWYuY291bnQgJWRcbiIsIHJldCwgZG1hYnVmLT5jb3VudCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB5bWZfcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHBvbGxfdGFibGVfc3RydWN0ICp3YWl0KQoreworCXN0cnVjdCB5bWZfc3RhdGUgKnN0YXRlID0gKHN0cnVjdCB5bWZfc3RhdGUgKilmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHltZl9kbWFidWYgKmRtYWJ1ZjsKKwlpbnQgcmVkem9uZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBtYXNrID0gMDsKKworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkKKwkJcG9sbF93YWl0KGZpbGUsICZzdGF0ZS0+d3BjbS5kbWFidWYud2FpdCwgd2FpdCk7CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpCisJCXBvbGxfd2FpdChmaWxlLCAmc3RhdGUtPnJwY20uZG1hYnVmLndhaXQsIHdhaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCWRtYWJ1ZiA9ICZzdGF0ZS0+cnBjbS5kbWFidWY7CisJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCXJlZHpvbmUgPSB5bWZfY2FsY19sZW5kKHN0YXRlLT5mb3JtYXQucmF0ZSk7CisJCXJlZHpvbmUgPDw9IHN0YXRlLT5mb3JtYXQuc2hpZnQ7CisJCXJlZHpvbmUgKj0gMzsKKworCQlkbWFidWYgPSAmc3RhdGUtPndwY20uZG1hYnVmOworCQlpZiAoZG1hYnVmLT5tYXBwZWQpIHsKKwkJCWlmIChkbWFidWYtPmNvdW50ID49IChzaWduZWQpZG1hYnVmLT5mcmFnc2l6ZSkKKwkJCQltYXNrIHw9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIERvbid0IHNlbGVjdCB1bmxlc3MgYSBmdWxsIGZyYWdtZW50IGlzIGF2YWlsYWJsZS4KKwkJCSAqIE90aGVyd2lzZSBhcnRzZCBkb2VzIEdFVE9TUEFDRSwgc2VlcyAwLCBhbmQgbG9vcHMuCisJCQkgKi8KKwkJCWlmIChkbWFidWYtPmNvdW50ICsgcmVkem9uZSArIGRtYWJ1Zi0+ZnJhZ3NpemUKKwkJCSAgICAgPD0gZG1hYnVmLT5kbWFzaXplKQorCQkJCW1hc2sgfD0gUE9MTE9VVCB8IFBPTExXUk5PUk07CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gbWFzazsKK30KKworc3RhdGljIGludCB5bWZfbW1hcChzdHJ1Y3QgZmlsZSAqZmlsZSwgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCit7CisJc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHltZl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiAqZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKworCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fV1JJVEUpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpICE9IDApCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSBpZiAodm1hLT52bV9mbGFncyAmIFZNX1JFQUQpIHsKKwkJaWYgKChyZXQgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpICE9IDApCisJCQlyZXR1cm4gcmV0OworCX0gZWxzZSAKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodm1hLT52bV9wZ29mZiAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OworCWlmIChzaXplID4gKFBBR0VfU0laRSA8PCBkbWFidWYtPmJ1Zm9yZGVyKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQsCisJCQkgICAgIHZpcnRfdG9fcGh5cyhkbWFidWYtPnJhd2J1ZikgPj4gUEFHRV9TSElGVCwKKwkJCSAgICAgc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQorCQlyZXR1cm4gLUVBR0FJTjsKKwlkbWFidWYtPm1hcHBlZCA9IDE7CisKKy8qIFAzICovIHByaW50ayhLRVJOX0lORk8gInltZnBjaTogdXNpbmcgbWVtb3J5IG1hcHBlZCBzb3VuZCwgdW50ZXN0ZWQhXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB5bWZfaW9jdGwoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUsCisgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IHltZl9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IHltZl9zdGF0ZSAqKWZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiAqZG1hYnVmOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYXVkaW9fYnVmX2luZm8gYWJpbmZvOworCWNvdW50X2luZm8gY2luZm87CisJaW50IHJlZHpvbmU7CisJaW50IHZhbDsKKwl2b2lkIF9fdXNlciAqYXJncCA9ICh2b2lkIF9fdXNlciAqKWFyZzsKKwlpbnQgX191c2VyICpwID0gYXJncDsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBPU1NfR0VUVkVSU0lPTjoKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChHRVRWRVIpIGFyZyAweCVseFxuIiwgY21kLCBhcmcpOworCQlyZXR1cm4gcHV0X3VzZXIoU09VTkRfVkVSU0lPTiwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfUkVTRVQ6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoUkVTRVQpXG4iLCBjbWQpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXltZl93YWl0X2RhYyhzdGF0ZSk7CisJCQlkbWFidWYgPSAmc3RhdGUtPndwY20uZG1hYnVmOworCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQlkbWFidWYtPnN3cHRyID0gZG1hYnVmLT5od3B0cjsKKwkJCWRtYWJ1Zi0+Y291bnQgPSBkbWFidWYtPnRvdGFsX2J5dGVzID0gMDsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQl5bWZfc3RvcF9hZGMoc3RhdGUpOworCQkJZG1hYnVmID0gJnN0YXRlLT5ycGNtLmRtYWJ1ZjsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJZG1hYnVmLT5zd3B0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCQlkbWFidWYtPmNvdW50ID0gZG1hYnVmLT50b3RhbF9ieXRlcyA9IDA7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJfQorCQlyZXR1cm4gMDsKKworCWNhc2UgU05EQ1RMX0RTUF9TWU5DOgorCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KFNZTkMpXG4iLCBjbWQpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCWRtYWJ1ZiA9ICZzdGF0ZS0+d3BjbS5kbWFidWY7CisJCQlpZiAoZmlsZS0+Zl9mbGFncyAmIE9fTk9OQkxPQ0spIHsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJaWYgKGRtYWJ1Zi0+Y291bnQgIT0gMCAmJiAhc3RhdGUtPndwY20ucnVubmluZykgeworCQkJCQl5bWZfc3RhcnRfZGFjKHN0YXRlKTsKKwkJCQl9CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQl9IGVsc2UgeworCQkJCXltZl93YWl0X2RhYyhzdGF0ZSk7CisJCQl9CisJCX0KKwkJLyogWFhYIFdoYXQgZG9lcyB0aGlzIGRvIGZvciByZWFkaW5nPyBkbWFidWYtPmNvdW50PTA7ID8gKi8KKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU1BFRUQ6IC8qIHNldCBzbWFwbGUgcmF0ZSAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KFNQRUVEKSBzcCAlZFxuIiwgY21kLCB2YWwpOworCQlpZiAodmFsID49IDgwMDAgJiYgdmFsIDw9IDQ4MDAwKSB7CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCQl5bWZfd2FpdF9kYWMoc3RhdGUpOworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+d3BjbS5kbWFidWY7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCXN0YXRlLT5mb3JtYXQucmF0ZSA9IHZhbDsKKwkJCQl5bWZfcGNtX3VwZGF0ZV9zaGlmdCgmc3RhdGUtPmZvcm1hdCk7CisJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQl9CisJCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJCXltZl9zdG9wX2FkYyhzdGF0ZSk7CisJCQkJZG1hYnVmID0gJnN0YXRlLT5ycGNtLmRtYWJ1ZjsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJc3RhdGUtPmZvcm1hdC5yYXRlID0gdmFsOworCQkJCXltZl9wY21fdXBkYXRlX3NoaWZ0KCZzdGF0ZS0+Zm9ybWF0KTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoc3RhdGUtPmZvcm1hdC5yYXRlLCBwKTsKKworCS8qCisJICogT1NTIG1hbnVhbCBkb2VzIG5vdCBtZW50aW9uIFNORENUTF9EU1BfU1RFUkVPIGF0IGFsbC4KKwkgKiBBbGwgY2hhbm5lbHMgYXJlIG1vbm8gYW5kIGlmIHlvdSB3YW50IHN0ZXJlbywgeW91CisJICogcGxheSBpbnRvIHR3byBjaGFubmVscyB3aXRoIFNORENUTF9EU1BfQ0hBTk5FTFMuCisJICogSG93ZXZlciwgbXBnMTIzIGNhbGxzIGl0LiBJIHdvbmRlciwgd2h5IE1pY2hhZWwgSGlwcCB1c2VkIGl0LgorCSAqLworCWNhc2UgU05EQ1RMX0RTUF9TVEVSRU86IC8qIHNldCBzdGVyZW8gb3IgbW9ubyBjaGFubmVsICovCisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoU1RFUkVPKSBzdCAlZFxuIiwgY21kLCB2YWwpOworCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJCXltZl93YWl0X2RhYyhzdGF0ZSk7IAorCQkJZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJc3RhdGUtPmZvcm1hdC52b2ljZXMgPSB2YWwgPyAyIDogMTsKKwkJCXltZl9wY21fdXBkYXRlX3NoaWZ0KCZzdGF0ZS0+Zm9ybWF0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQl9CisJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9SRUFEKSB7CisJCQl5bWZfc3RvcF9hZGMoc3RhdGUpOworCQkJZG1hYnVmID0gJnN0YXRlLT5ycGNtLmRtYWJ1ZjsKKwkJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJc3RhdGUtPmZvcm1hdC52b2ljZXMgPSB2YWwgPyAyIDogMTsKKwkJCXltZl9wY21fdXBkYXRlX3NoaWZ0KCZzdGF0ZS0+Zm9ybWF0KTsKKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQl9CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVEJMS1NJWkU6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoR0VUQkxLKVxuIiwgY21kKTsKKwkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQlpZiAoKHZhbCA9IHByb2dfZG1hYnVmKHN0YXRlLCAwKSkpCisJCQkJcmV0dXJuIHZhbDsKKwkJCXZhbCA9IHN0YXRlLT53cGNtLmRtYWJ1Zi5mcmFnc2l6ZTsKKwkJCVlNRkRCR1goInltZl9pb2N0bDogR0VUQkxLIHcgJWRcbiIsIHZhbCk7CisJCQlyZXR1cm4gcHV0X3VzZXIodmFsLCBwKTsKKwkJfQorCQlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkgeworCQkJaWYgKCh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpKQorCQkJCXJldHVybiB2YWw7CisJCQl2YWwgPSBzdGF0ZS0+cnBjbS5kbWFidWYuZnJhZ3NpemU7CisJCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IEdFVEJMSyByICVkXG4iLCB2YWwpOworCQkJcmV0dXJuIHB1dF91c2VyKHZhbCwgcCk7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYXNlIFNORENUTF9EU1BfR0VURk1UUzogLyogUmV0dXJucyBhIG1hc2sgb2Ygc3VwcG9ydGVkIHNhbXBsZSBmb3JtYXQqLworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KEdFVEZNVFMpXG4iLCBjbWQpOworCQlyZXR1cm4gcHV0X3VzZXIoQUZNVF9TMTZfTEV8QUZNVF9VOCwgcCk7CisKKwljYXNlIFNORENUTF9EU1BfU0VURk1UOiAvKiBTZWxlY3Qgc2FtcGxlIGZvcm1hdCAqLworCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KFNFVEZNVCkgZm10ICVkXG4iLCBjbWQsIHZhbCk7CisJCWlmICh2YWwgPT0gQUZNVF9TMTZfTEUgfHwgdmFsID09IEFGTVRfVTgpIHsKKwkJCWlmIChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgeworCQkJCXltZl93YWl0X2RhYyhzdGF0ZSk7CisJCQkJZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJZG1hYnVmLT5yZWFkeSA9IDA7CisJCQkJc3RhdGUtPmZvcm1hdC5mb3JtYXQgPSB2YWw7CisJCQkJeW1mX3BjbV91cGRhdGVfc2hpZnQoJnN0YXRlLT5mb3JtYXQpOworCQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQl5bWZfc3RvcF9hZGMoc3RhdGUpOworCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+cnBjbS5kbWFidWY7CisJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCXN0YXRlLT5mb3JtYXQuZm9ybWF0ID0gdmFsOworCQkJCXltZl9wY21fdXBkYXRlX3NoaWZ0KCZzdGF0ZS0+Zm9ybWF0KTsKKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gcHV0X3VzZXIoc3RhdGUtPmZvcm1hdC5mb3JtYXQsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0NIQU5ORUxTOgorCQlpZiAoZ2V0X3VzZXIodmFsLCBwKSkKKwkJCXJldHVybiAtRUZBVUxUOworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KENIQU4pIGNoICVkXG4iLCBjbWQsIHZhbCk7CisJCWlmICh2YWwgIT0gMCkgeworCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSB7CisJCQkJeW1mX3dhaXRfZGFjKHN0YXRlKTsKKwkJCQlpZiAodmFsID09IDEgfHwgdmFsID09IDIpIHsKKwkJCQkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQkJCQlkbWFidWYgPSAmc3RhdGUtPndwY20uZG1hYnVmOworCQkJCQlkbWFidWYtPnJlYWR5ID0gMDsKKwkJCQkJc3RhdGUtPmZvcm1hdC52b2ljZXMgPSB2YWw7CisJCQkJCXltZl9wY21fdXBkYXRlX3NoaWZ0KCZzdGF0ZS0+Zm9ybWF0KTsKKwkJCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJfQorCQkJfQorCQkJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJCQl5bWZfc3RvcF9hZGMoc3RhdGUpOworCQkJCWlmICh2YWwgPT0gMSB8fCB2YWwgPT0gMikgeworCQkJCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCQkJCWRtYWJ1ZiA9ICZzdGF0ZS0+cnBjbS5kbWFidWY7CisJCQkJCWRtYWJ1Zi0+cmVhZHkgPSAwOworCQkJCQlzdGF0ZS0+Zm9ybWF0LnZvaWNlcyA9IHZhbDsKKwkJCQkJeW1mX3BjbV91cGRhdGVfc2hpZnQoJnN0YXRlLT5mb3JtYXQpOworCQkJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIHB1dF91c2VyKHN0YXRlLT5mb3JtYXQudm9pY2VzLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9QT1NUOgorCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KFBPU1QpXG4iLCBjbWQpOworCQkvKgorCQkgKiBRdW90aW5nIE9TUyBQRzoKKwkJICogICAgVGhlIGlvY3RsIFNORENUTF9EU1BfUE9TVCBpcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gb2YKKwkJICogICAgU05EQ1RMX0RTUF9TWU5DLiBJdCBqdXN0IHRlbGxzIHRvIHRoZSBkcml2ZXIgdGhhdCB0aGVyZQorCQkgKiAgICBpcyBsaWtlbHkgdG8gYmUgYSBwYXVzZSBpbiB0aGUgb3V0cHV0LiBUaGlzIG1ha2VzIGl0CisJCSAqICAgIHBvc3NpYmxlIGZvciB0aGUgZGV2aWNlIHRvIGhhbmRsZSB0aGUgcGF1c2UgbW9yZQorCQkgKiAgICBpbnRlbGxpZ2VudGx5LiBUaGlzIGlvY3RsIGRvZXNuJ3QgYmxvY2sgdGhlIGFwcGxpY2F0aW9uLgorCQkgKgorCQkgKiBUaGUgcGFyYWdyYXBoIGFib3ZlIGlzIGEgY2x1bXN5IHdheSB0byBzYXkgImZsdXNoIGlvY3RsIi4KKwkJICogVGhpcyBpb2N0bCBpcyB1c2VkIGJ5IG1wZzEyMy4KKwkJICovCisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJaWYgKHN0YXRlLT53cGNtLmRtYWJ1Zi5jb3VudCAhPSAwICYmICFzdGF0ZS0+d3BjbS5ydW5uaW5nKSB7CisJCQl5bWZfc3RhcnRfZGFjKHN0YXRlKTsKKwkJfQorCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfU0VURlJBR01FTlQ6CisJCWlmIChnZXRfdXNlcih2YWwsIHApKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoU0VURlJBRykgZnIgMHglMDR4OiUwNHgoJWQ6JWQpXG4iLAorCQkgICAgY21kLAorCQkgICAgKHZhbCA+PiAxNikgJiAweEZGRkYsIHZhbCAmIDB4RkZGRiwKKwkJICAgICh2YWwgPj4gMTYpICYgMHhGRkZGLCB2YWwgJiAweEZGRkYpOworCQlkbWFidWYgPSAmc3RhdGUtPndwY20uZG1hYnVmOworCQlkbWFidWYtPm9zc2ZyYWdzaGlmdCA9IHZhbCAmIDB4ZmZmZjsKKwkJZG1hYnVmLT5vc3NtYXhmcmFncyA9ICh2YWwgPj4gMTYpICYgMHhmZmZmOworCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQgPCA0KQorCQkJZG1hYnVmLT5vc3NmcmFnc2hpZnQgPSA0OworCQlpZiAoZG1hYnVmLT5vc3NmcmFnc2hpZnQgPiAxNSkKKwkJCWRtYWJ1Zi0+b3NzZnJhZ3NoaWZ0ID0gMTU7CisJCXJldHVybiAwOworCisJY2FzZSBTTkRDVExfRFNQX0dFVE9TUEFDRToKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChHRVRPU1BBQ0UpXG4iLCBjbWQpOworCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMCkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlyZWR6b25lID0geW1mX2NhbGNfbGVuZChzdGF0ZS0+Zm9ybWF0LnJhdGUpOworCQlyZWR6b25lIDw8PSBzdGF0ZS0+Zm9ybWF0LnNoaWZ0OworCQlyZWR6b25lICo9IDM7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJYWJpbmZvLmZyYWdzaXplID0gZG1hYnVmLT5mcmFnc2l6ZTsKKwkJYWJpbmZvLmJ5dGVzID0gZG1hYnVmLT5kbWFzaXplIC0gZG1hYnVmLT5jb3VudCAtIHJlZHpvbmU7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRJU1BBQ0U6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoR0VUSVNQQUNFKVxuIiwgY21kKTsKKwkJaWYgKCEoZmlsZS0+Zl9tb2RlICYgRk1PREVfUkVBRCkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG1hYnVmID0gJnN0YXRlLT5ycGNtLmRtYWJ1ZjsKKwkJaWYgKCFkbWFidWYtPnJlYWR5ICYmICh2YWwgPSBwcm9nX2RtYWJ1ZihzdGF0ZSwgMSkpICE9IDApCisJCQlyZXR1cm4gdmFsOworCQlzcGluX2xvY2tfaXJxc2F2ZSgmc3RhdGUtPnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCWFiaW5mby5mcmFnc2l6ZSA9IGRtYWJ1Zi0+ZnJhZ3NpemU7CisJCWFiaW5mby5ieXRlcyA9IGRtYWJ1Zi0+Y291bnQ7CisJCWFiaW5mby5mcmFnc3RvdGFsID0gZG1hYnVmLT5udW1mcmFnOworCQlhYmluZm8uZnJhZ21lbnRzID0gYWJpbmZvLmJ5dGVzID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIGNvcHlfdG9fdXNlcihhcmdwLCAmYWJpbmZvLCBzaXplb2YoYWJpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9OT05CTE9DSzoKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChOT05CTE9DSylcbiIsIGNtZCk7CisJCWZpbGUtPmZfZmxhZ3MgfD0gT19OT05CTE9DSzsKKwkJcmV0dXJuIDA7CisKKwljYXNlIFNORENUTF9EU1BfR0VUQ0FQUzoKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChHRVRDQVBTKVxuIiwgY21kKTsKKwkJLyogcmV0dXJuIHB1dF91c2VyKERTUF9DQVBfUkVBTFRJTUV8RFNQX0NBUF9UUklHR0VSfERTUF9DQVBfTU1BUCwKKwkJCSAgICBwKTsgKi8KKwkJcmV0dXJuIHB1dF91c2VyKDAsIHApOworCisJY2FzZSBTTkRDVExfRFNQX0dFVElQVFI6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoR0VUSVBUUilcbiIsIGNtZCk7CisJCWlmICghKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCWRtYWJ1ZiA9ICZzdGF0ZS0+cnBjbS5kbWFidWY7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJY2luZm8uYnl0ZXMgPSBkbWFidWYtPnRvdGFsX2J5dGVzOworCQljaW5mby5ibG9ja3MgPSBkbWFidWYtPmNvdW50ID4+IGRtYWJ1Zi0+ZnJhZ3NoaWZ0OworCQljaW5mby5wdHIgPSBkbWFidWYtPmh3cHRyOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzdGF0ZS0+dW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBHRVRJUFRSIHB0ciAlZCBieXRlcyAlZFxuIiwKKwkJICAgIGNpbmZvLnB0ciwgY2luZm8uYnl0ZXMpOworCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZjaW5mbywgc2l6ZW9mKGNpbmZvKSkgPyAtRUZBVUxUIDogMDsKKworCWNhc2UgU05EQ1RMX0RTUF9HRVRPUFRSOgorCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4KEdFVE9QVFIpXG4iLCBjbWQpOworCQlpZiAoIShmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJZG1hYnVmID0gJnN0YXRlLT53cGNtLmRtYWJ1ZjsKKwkJc3Bpbl9sb2NrX2lycXNhdmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQljaW5mby5ieXRlcyA9IGRtYWJ1Zi0+dG90YWxfYnl0ZXM7CisJCWNpbmZvLmJsb2NrcyA9IGRtYWJ1Zi0+Y291bnQgPj4gZG1hYnVmLT5mcmFnc2hpZnQ7CisJCWNpbmZvLnB0ciA9IGRtYWJ1Zi0+aHdwdHI7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnN0YXRlLT51bml0LT5yZWdfbG9jaywgZmxhZ3MpOworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IEdFVE9QVFIgcHRyICVkIGJ5dGVzICVkXG4iLAorCQkgICAgY2luZm8ucHRyLCBjaW5mby5ieXRlcyk7CisJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNpbmZvLCBzaXplb2YoY2luZm8pKSA/IC1FRkFVTFQgOiAwOworCisJY2FzZSBTTkRDVExfRFNQX1NFVERVUExFWDoKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChTRVREVVBMRVgpXG4iLCBjbWQpOworCQlyZXR1cm4gMDsJCS8qIEFsd2F5cyBkdXBsZXggKi8KKworCWNhc2UgU09VTkRfUENNX1JFQURfUkFURToKKwkJWU1GREJHWCgieW1mX2lvY3RsOiBjbWQgMHgleChSRUFEX1JBVEUpXG4iLCBjbWQpOworCQlyZXR1cm4gcHV0X3VzZXIoc3RhdGUtPmZvcm1hdC5yYXRlLCBwKTsKKworCWNhc2UgU09VTkRfUENNX1JFQURfQ0hBTk5FTFM6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoUkVBRF9DSClcbiIsIGNtZCk7CisJCXJldHVybiBwdXRfdXNlcihzdGF0ZS0+Zm9ybWF0LnZvaWNlcywgcCk7CisKKwljYXNlIFNPVU5EX1BDTV9SRUFEX0JJVFM6CisJCVlNRkRCR1goInltZl9pb2N0bDogY21kIDB4JXgoUkVBRF9CSVRTKVxuIiwgY21kKTsKKwkJcmV0dXJuIHB1dF91c2VyKEFGTVRfUzE2X0xFLCBwKTsKKworCWNhc2UgU05EQ1RMX0RTUF9NQVBJTkJVRjoKKwljYXNlIFNORENUTF9EU1BfTUFQT1VUQlVGOgorCWNhc2UgU05EQ1RMX0RTUF9TRVRTWU5DUk86CisJY2FzZSBTT1VORF9QQ01fV1JJVEVfRklMVEVSOgorCWNhc2UgU09VTkRfUENNX1JFQURfRklMVEVSOgorCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4IHVuc3VwcG9ydGVkXG4iLCBjbWQpOworCQlyZXR1cm4gLUVOT1RUWTsKKworCWRlZmF1bHQ6CisJCS8qCisJCSAqIFNvbWUgcHJvZ3JhbXMgbWl4IHVwIGF1ZGlvIGRldmljZXMgYW5kIGlvY3RscworCQkgKiBvciBwZXJoYXBzIHRoZXkgZXhwZWN0ICJ1bml2ZXJzYWwiIGlvY3RscywKKwkJICogZm9yIGluc3RhbmNlIHdlIGdldCBTTkRDVExfVE1SX0NPTlRJTlVFIGhlcmUuCisJCSAqIChtcGcxMjMgLWcgMTAwIGVuZHMgaGVyZSB0b28gLSB0byBiZSBmaXhlZC4pCisJCSAqLworCQlZTUZEQkdYKCJ5bWZfaW9jdGw6IGNtZCAweCV4IHVua25vd25cbiIsIGNtZCk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gLUVOT1RUWTsKK30KKworLyoKKyAqIG9wZW4oMikKKyAqIFdlIHVzZSB1cHBlciBwYXJ0IG9mIHRoZSBtaW5vciB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHNvdW5kY2FyZHMuCisgKiBDaGFubmVscyBhcmUgb3BlbmVkIHdpdGggYSBjbG9uZSBvcGVuLgorICovCitzdGF0aWMgaW50IHltZl9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7CisJeW1mcGNpX3QgKnVuaXQgPSBOVUxMOworCWludCBtaW5vcjsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKwlpbnQgZXJyOworCisJbWlub3IgPSBpbWlub3IoaW5vZGUpOworCWlmICgobWlub3IgJiAweDBGKSA9PSAzKSB7CS8qIC9kZXYvZHNwTiAqLworCQk7CisJfSBlbHNlIHsKKwkJcmV0dXJuIC1FTlhJTzsKKwl9CisKKwl1bml0ID0gTlVMTDsJLyogZ2NjIHdhcm5zICovCisJc3Bpbl9sb2NrKCZ5bWZfZGV2c19sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoKGxpc3QsICZ5bWZfZGV2cykgeworCQl1bml0ID0gbGlzdF9lbnRyeShsaXN0LCB5bWZwY2lfdCwgeW1mX2RldnMpOworCQlpZiAoKCh1bml0LT5kZXZfYXVkaW8gXiBtaW5vcikgJiB+MHgwRikgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlzcGluX3VubG9jaygmeW1mX2RldnNfbG9jayk7CisJaWYgKHVuaXQgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlkb3duKCZ1bml0LT5vcGVuX3NlbSk7CisKKwlpZiAoKHN0YXRlID0geW1mX3N0YXRlX2FsbG9jKHVuaXQpKSA9PSBOVUxMKSB7CisJCXVwKCZ1bml0LT5vcGVuX3NlbSk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlsaXN0X2FkZF90YWlsKCZzdGF0ZS0+Y2hhaW4sICZ1bml0LT5zdGF0ZXMpOworCisJZmlsZS0+cHJpdmF0ZV9kYXRhID0gc3RhdGU7CisKKwkvKgorCSAqIHltZl9yZWFkIGFuZCB5bWZfd3JpdGUgdGhhdCB3ZSBib3Jyb3dlZCBmcm9tIGNzNDZ4eAorCSAqIGFsbG9jYXRlIGJ1ZmZlcnMgd2l0aCBwcm9nX2RtYWJ1ZigpLiBXZSBjYWxsIHByb2dfZG1hYnVmCisJICogaGVyZSBzbyB0aGF0IGluIGNhc2Ugb2YgRE1BIG1lbW9yeSBleGhhdXN0aW9uIG9wZW4KKwkgKiBmYWlscyByYXRoZXIgdGhhbiB3cml0ZS4KKwkgKgorCSAqIFhYWCBwcm9nX2RtYWJ1ZiBhbGxvY2F0ZXMgdm9pY2UuIFNob3VsZCBhbGxvY2F0ZSBleHBsaWNpdGx5LCBhYm92ZS4KKwkgKi8KKwlpZiAoZmlsZS0+Zl9tb2RlICYgRk1PREVfV1JJVEUpIHsKKwkJaWYgKCFzdGF0ZS0+d3BjbS5kbWFidWYucmVhZHkpIHsKKwkJCWlmICgoZXJyID0gcHJvZ19kbWFidWYoc3RhdGUsIDApKSAhPSAwKSB7CisJCQkJZ290byBvdXRfbm9kbWE7CisJCQl9CisJCX0KKwl9CisJaWYgKGZpbGUtPmZfbW9kZSAmIEZNT0RFX1JFQUQpIHsKKwkJaWYgKCFzdGF0ZS0+cnBjbS5kbWFidWYucmVhZHkpIHsKKwkJCWlmICgoZXJyID0gcHJvZ19kbWFidWYoc3RhdGUsIDEpKSAhPSAwKSB7CisJCQkJZ290byBvdXRfbm9kbWE7CisJCQl9CisJCX0KKwl9CisKKyNpZiAwIC8qIHRlc3QgaWYgaW50ZXJydXB0cyB3b3JrICovCisJeW1mcGNpX3dyaXRldyh1bml0LCBZRFNYR1JfVElNRVJDT1VOVCwgMHhmZmZlKTsJLyogfiA2ODBtcyAqLworCXltZnBjaV93cml0ZWIodW5pdCwgWURTWEdSX1RJTUVSQ1RSTCwKKwkgICAgKFlEU1hHUl9USU1FUkNUUkxfVEVOfFlEU1hHUl9USU1FUkNUUkxfVElFTikpOworI2VuZGlmCisJdXAoJnVuaXQtPm9wZW5fc2VtKTsKKworCXJldHVybiBub25zZWVrYWJsZV9vcGVuKGlub2RlLCBmaWxlKTsKKworb3V0X25vZG1hOgorCS8qCisJICogWFhYIEJyb2tlbiBjdXN0b206ICJnb3RvIG91dF94eHgiIGluIG90aGVyIHBsYWNlIGlzCisJICogYSBuZXN0YWJsZSBleGNlcHRpb24sIGJ1dCBoZXJlIGl0IGlzIG5vdCBuZXN0YWJsZSBkdWUgdG8gc2VtYXBob3JlLgorCSAqIFhYWCBEb3VidGZ1bCB0ZWNobmlxdWUgb2Ygc2VsZi1kZXNjcmliaW5nIG9iamVjdHMuLi4uCisJICovCisJZGVhbGxvY19kbWFidWYodW5pdCwgJnN0YXRlLT53cGNtLmRtYWJ1Zik7CisJZGVhbGxvY19kbWFidWYodW5pdCwgJnN0YXRlLT5ycGNtLmRtYWJ1Zik7CisJeW1mX3BjbV9mcmVlX3N1YnN0cmVhbSgmc3RhdGUtPndwY20pOworCXltZl9wY21fZnJlZV9zdWJzdHJlYW0oJnN0YXRlLT5ycGNtKTsKKworCWxpc3RfZGVsKCZzdGF0ZS0+Y2hhaW4pOworCWtmcmVlKHN0YXRlKTsKKworCXVwKCZ1bml0LT5vcGVuX3NlbSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB5bWZfcmVsZWFzZShzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKK3sKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgeW1mX3N0YXRlICopZmlsZS0+cHJpdmF0ZV9kYXRhOworCXltZnBjaV90ICp1bml0ID0gc3RhdGUtPnVuaXQ7CisKKyNpZiAwIC8qIHRlc3QgaWYgaW50ZXJydXB0cyB3b3JrICovCisJeW1mcGNpX3dyaXRlYih1bml0LCBZRFNYR1JfVElNRVJDVFJMLCAwKTsKKyNlbmRpZgorCisJZG93bigmdW5pdC0+b3Blbl9zZW0pOworCisJLyoKKwkgKiBYWFggU29sdmUgdGhlIGNhc2Ugb2YgT19OT05CTE9DSyBjbG9zZSAtIGRvbid0IGRlYWxsb2NhdGUgaGVyZS4KKwkgKiBEZWFsbG9jYXRlIHdoZW4gdW5sb2FkaW5nIHRoZSBkcml2ZXIgYW5kIHdlIGNhbiB3YWl0LgorCSAqLworCXltZl93YWl0X2RhYyhzdGF0ZSk7CisJeW1mX3N0b3BfYWRjKHN0YXRlKTsJCS8qIGZvcnR1bmF0ZWx5LCBpdCdzIGltbWVkaWF0ZSAqLworCWRlYWxsb2NfZG1hYnVmKHVuaXQsICZzdGF0ZS0+d3BjbS5kbWFidWYpOworCWRlYWxsb2NfZG1hYnVmKHVuaXQsICZzdGF0ZS0+cnBjbS5kbWFidWYpOworCXltZl9wY21fZnJlZV9zdWJzdHJlYW0oJnN0YXRlLT53cGNtKTsKKwl5bWZfcGNtX2ZyZWVfc3Vic3RyZWFtKCZzdGF0ZS0+cnBjbSk7CisKKwlsaXN0X2RlbCgmc3RhdGUtPmNoYWluKTsKKwlmaWxlLT5wcml2YXRlX2RhdGEgPSBOVUxMOwkvKiBDYW4geW91IHRlbGwgSSBwcm9ncmFtbWVkIFNvbGFyaXMgKi8KKwlrZnJlZShzdGF0ZSk7CisKKwl1cCgmdW5pdC0+b3Blbl9zZW0pOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBNaXhlciBvcGVyYXRpb25zIGFyZSBiYXNlZCBvbiBjczQ2eHguCisgKi8KK3N0YXRpYyBpbnQgeW1mX29wZW5fbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCWludCBtaW5vciA9IGltaW5vcihpbm9kZSk7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKKwl5bWZwY2lfdCAqdW5pdDsKKwlpbnQgaTsKKworCXNwaW5fbG9jaygmeW1mX2RldnNfbG9jayk7CisJbGlzdF9mb3JfZWFjaChsaXN0LCAmeW1mX2RldnMpIHsKKwkJdW5pdCA9IGxpc3RfZW50cnkobGlzdCwgeW1mcGNpX3QsIHltZl9kZXZzKTsKKwkJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykgeworCQkJaWYgKHVuaXQtPmFjOTdfY29kZWNbaV0gIT0gTlVMTCAmJgorCQkJICAgIHVuaXQtPmFjOTdfY29kZWNbaV0tPmRldl9taXhlciA9PSBtaW5vcikgeworCQkJCXNwaW5fdW5sb2NrKCZ5bWZfZGV2c19sb2NrKTsKKwkJCQlnb3RvIG1hdGNoOworCQkJfQorCQl9CisJfQorCXNwaW5fdW5sb2NrKCZ5bWZfZGV2c19sb2NrKTsKKwlyZXR1cm4gLUVOT0RFVjsKKworIG1hdGNoOgorCWZpbGUtPnByaXZhdGVfZGF0YSA9IHVuaXQtPmFjOTdfY29kZWNbaV07CisKKwlyZXR1cm4gbm9uc2Vla2FibGVfb3Blbihpbm9kZSwgZmlsZSk7Cit9CisKK3N0YXRpYyBpbnQgeW1mX2lvY3RsX21peGRldihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSwKKyAgICB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWMgPSAoc3RydWN0IGFjOTdfY29kZWMgKilmaWxlLT5wcml2YXRlX2RhdGE7CisKKwlyZXR1cm4gY29kZWMtPm1peGVyX2lvY3RsKGNvZGVjLCBjbWQsIGFyZyk7Cit9CisKK3N0YXRpYyBpbnQgeW1mX3JlbGVhc2VfbWl4ZGV2KHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQoreworCXJldHVybiAwOworfQorCitzdGF0aWMgLypjb25zdCovIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgeW1mX2ZvcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAorCS5yZWFkCQk9IHltZl9yZWFkLAorCS53cml0ZQkJPSB5bWZfd3JpdGUsCisJLnBvbGwJCT0geW1mX3BvbGwsCisJLmlvY3RsCQk9IHltZl9pb2N0bCwKKwkubW1hcAkJPSB5bWZfbW1hcCwKKwkub3BlbgkJPSB5bWZfb3BlbiwKKwkucmVsZWFzZQk9IHltZl9yZWxlYXNlLAorfTsKKworc3RhdGljIC8qY29uc3QqLyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHltZl9taXhlcl9mb3BzID0geworCS5vd25lcgkJPSBUSElTX01PRFVMRSwKKwkubGxzZWVrCQk9IG5vX2xsc2VlaywKKwkuaW9jdGwJCT0geW1mX2lvY3RsX21peGRldiwKKwkub3BlbgkJPSB5bWZfb3Blbl9taXhkZXYsCisJLnJlbGVhc2UJPSB5bWZfcmVsZWFzZV9taXhkZXYsCit9OworCisvKgorICovCisKK3N0YXRpYyBpbnQgeW1mX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgcG1fbWVzc2FnZV90IHVudXNlZCkKK3sKKwlzdHJ1Y3QgeW1mX3VuaXQgKnVuaXQgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCB5bWZfZG1hYnVmICpkbWFidWY7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CisJaW50IGk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKworCXVuaXQtPnN1c3BlbmRlZCA9IDE7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlJfQUM5NzsgaSsrKSB7CisJCWlmICgoY29kZWMgPSB1bml0LT5hYzk3X2NvZGVjW2ldKSAhPSBOVUxMKQorCQkJYWM5N19zYXZlX3N0YXRlKGNvZGVjKTsKKwl9CisKKwlsaXN0X2Zvcl9lYWNoKHAsICZ1bml0LT5zdGF0ZXMpIHsKKwkJc3RhdGUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB5bWZfc3RhdGUsIGNoYWluKTsKKworCQlkbWFidWYgPSAmc3RhdGUtPndwY20uZG1hYnVmOworCQlkbWFidWYtPmh3cHRyID0gZG1hYnVmLT5zd3B0ciA9IDA7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCQlkbWFidWYtPmNvdW50ID0gMDsKKworCQlkbWFidWYgPSAmc3RhdGUtPnJwY20uZG1hYnVmOworCQlkbWFidWYtPmh3cHRyID0gZG1hYnVmLT5zd3B0ciA9IDA7CisJCWRtYWJ1Zi0+dG90YWxfYnl0ZXMgPSAwOworCQlkbWFidWYtPmNvdW50ID0gMDsKKwl9CisKKwl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9OQVRJVkVEQUNPVVRWT0wsIDApOworCXltZnBjaV9kaXNhYmxlX2RzcCh1bml0KTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisJCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeW1mX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGNpZGV2KQoreworCXN0cnVjdCB5bWZfdW5pdCAqdW5pdCA9IHBjaV9nZXRfZHJ2ZGF0YShwY2lkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGxpc3RfaGVhZCAqcDsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3QgYWM5N19jb2RlYyAqY29kZWM7CisJaW50IGk7CisKKwl5bWZwY2lfYWNsaW5rX3Jlc2V0KHVuaXQtPnBjaSk7CisJeW1mcGNpX2NvZGVjX3JlYWR5KHVuaXQsIDAsIDEpOwkJLyogcHJpbnRzIGRpYWcgaWYgbm90IHJlYWR5LiAqLworCisjaWZkZWYgQ09ORklHX1NPVU5EX1lNRlBDSV9MRUdBQ1kKKwkvKiBYWFggQXQgdGhpcyB0aW1lIHRoZSBsZWdhY3kgcmVnaXN0ZXJzIGFyZSBwcm9iYWJseSBkZXByb2dyYW1tZWQuICovCisjZW5kaWYKKworCXltZnBjaV9kb3dubG9hZF9pbWFnZSh1bml0KTsKKworCXltZl9tZW1sb2FkKHVuaXQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVuaXQtPnJlZ19sb2NrLCBmbGFncyk7CisKKwlpZiAodW5pdC0+c3RhcnRfY291bnQpIHsKKwkJeW1mcGNpX3dyaXRlbCh1bml0LCBZRFNYR1JfTU9ERSwgMyk7CisJCXVuaXQtPmFjdGl2ZV9iYW5rID0geW1mcGNpX3JlYWRsKHVuaXQsIFlEU1hHUl9DVFJMU0VMRUNUKSAmIDE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IE5SX0FDOTc7IGkrKykgeworCQlpZiAoKGNvZGVjID0gdW5pdC0+YWM5N19jb2RlY1tpXSkgIT0gTlVMTCkKKwkJCWFjOTdfcmVzdG9yZV9zdGF0ZShjb2RlYyk7CisJfQorCisJdW5pdC0+c3VzcGVuZGVkID0gMDsKKwlsaXN0X2Zvcl9lYWNoKHAsICZ1bml0LT5zdGF0ZXMpIHsKKwkJc3RhdGUgPSBsaXN0X2VudHJ5KHAsIHN0cnVjdCB5bWZfc3RhdGUsIGNoYWluKTsKKwkJd2FrZV91cCgmc3RhdGUtPndwY20uZG1hYnVmLndhaXQpOworCQl3YWtlX3VwKCZzdGF0ZS0+cnBjbS5kbWFidWYud2FpdCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdW5pdC0+cmVnX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqICBpbml0aWFsaXphdGlvbiByb3V0aW5lcworICovCisKKyNpZmRlZiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWQorCitzdGF0aWMgaW50IHltZnBjaV9zZXR1cF9sZWdhY3koeW1mcGNpX3QgKnVuaXQsIHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJaW50IHY7CisJaW50IG1wdWlvID0gLTEsIG9wbGlvID0gLTE7CisKKwlzd2l0Y2ggKHVuaXQtPmlvbWlkaSkgeworCWNhc2UgMHgzMzA6CisJCW1wdWlvID0gMDsKKwkJYnJlYWs7CisJY2FzZSAweDMwMDoKKwkJbXB1aW8gPSAxOworCQlicmVhazsKKwljYXNlIDB4MzMyOgorCQltcHVpbyA9IDI7CisJCWJyZWFrOworCWNhc2UgMHgzMzQ6CisJCW1wdWlvID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDogOworCX0KKworCXN3aXRjaCAodW5pdC0+aW9zeW50aCkgeworCWNhc2UgMHgzODg6CisJCW9wbGlvID0gMDsKKwkJYnJlYWs7CisJY2FzZSAweDM5ODoKKwkJb3BsaW8gPSAxOworCQlicmVhazsKKwljYXNlIDB4M2EwOgorCQlvcGxpbyA9IDI7CisJCWJyZWFrOworCWNhc2UgMHgzYTg6CisJCW9wbGlvID0gMzsKKwkJYnJlYWs7CisJZGVmYXVsdDogOworCX0KKworCWlmIChtcHVpbyA+PSAwIHx8IG9wbGlvID49IDApIHsKKwkJLyogMHgwMDIwOiAxIC0gMTAgYml0cyBvZiBJL08gYWRkcmVzcyBkZWNvZGVkLCAwIC0gMTYgYml0cy4gKi8KKwkJdiA9IDB4MDAxZTsKKwkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgUENJUl9MRUdDVFJMLCB2KTsKKworCQlzd2l0Y2ggKHBjaWRldi0+ZGV2aWNlKSB7CisJCWNhc2UgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzI0OgorCQljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0MDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83MjRGOgorCQljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0MEM6CisJCQl2ID0gMHg4ODAwOworCQkJaWYgKG1wdWlvID49IDApIHsgdiB8PSBtcHVpbzw8NDsgfQorCQkJaWYgKG9wbGlvID49IDApIHsgdiB8PSBvcGxpbzsgfQorCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgUENJUl9FTEVHQ1RSTCwgdik7CisJCQlicmVhazsKKworCQljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0NDoKKwkJY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NTQ6CisJCQl2ID0gMHg4ODAwOworCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgUENJUl9FTEVHQ1RSTCwgdik7CisJCQlpZiAob3BsaW8gPj0gMCkgeworCQkJCXBjaV93cml0ZV9jb25maWdfd29yZChwY2lkZXYsIFBDSVJfT1BMQURSLCB1bml0LT5pb3N5bnRoKTsKKwkJCX0KKwkJCWlmIChtcHVpbyA+PSAwKSB7CisJCQkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBjaWRldiwgUENJUl9NUFVBRFIsIHVuaXQtPmlvbWlkaSk7CisJCQl9CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IFVua25vd24gZGV2aWNlIElEOiAweCV4XG4iLAorCQkJICAgIHBjaWRldi0+ZGV2aWNlKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1NPVU5EX1lNRlBDSV9MRUdBQ1kgKi8KKworc3RhdGljIHZvaWQgeW1mcGNpX2FjbGlua19yZXNldChzdHJ1Y3QgcGNpX2RldiAqIHBjaSkKK3sKKwl1OCBjbWQ7CisKKwkvKgorCSAqIEluIHRoZSA3NDQsIDc1NCBvbmx5IDB4MDEgZXhpc3RzLCAweDAyIGlzIHVuZGVmaW5lZC4KKwkgKiBJdCBkb2VzIG5vdCBzZWVtIHRvIGh1cnQgdG8gdHJpcCBib3RoIHJlZ2FyZGxlc3Mgb2YgcmV2aXNpb24uCisJICovCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpLCBQQ0lSX0RTWEdDVFJMLCAmY21kKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCBQQ0lSX0RTWEdDVFJMLCBjbWQgJiAweGZjKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCBQQ0lSX0RTWEdDVFJMLCBjbWQgfCAweDAzKTsKKwlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGNpLCBQQ0lSX0RTWEdDVFJMLCBjbWQgJiAweGZjKTsKKworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIFBDSVJfRFNYUFdSQ1RSTDEsIDApOworCXBjaV93cml0ZV9jb25maWdfd29yZChwY2ksIFBDSVJfRFNYUFdSQ1RSTDIsIDApOworfQorCitzdGF0aWMgdm9pZCB5bWZwY2lfZW5hYmxlX2RzcCh5bWZwY2lfdCAqY29kZWMpCit7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX0NPTkZJRywgMHgwMDAwMDAwMSk7Cit9CisKK3N0YXRpYyB2b2lkIHltZnBjaV9kaXNhYmxlX2RzcCh5bWZwY2lfdCAqY29kZWMpCit7CisJdTMyIHZhbDsKKwlpbnQgdGltZW91dCA9IDEwMDA7CisKKwl2YWwgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9DT05GSUcpOworCWlmICh2YWwpCisJCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9DT05GSUcsIDB4MDAwMDAwMDApOworCXdoaWxlICh0aW1lb3V0LS0gPiAwKSB7CisJCXZhbCA9IHltZnBjaV9yZWFkbChjb2RlYywgWURTWEdSX1NUQVRVUyk7CisJCWlmICgodmFsICYgMHgwMDAwMDAwMikgPT0gMCkKKwkJCWJyZWFrOworCX0KK30KKworI2luY2x1ZGUgInltZnBjaV9pbWFnZS5oIgorCitzdGF0aWMgdm9pZCB5bWZwY2lfZG93bmxvYWRfaW1hZ2UoeW1mcGNpX3QgKmNvZGVjKQoreworCWludCBpLCB2ZXJfMWU7CisJdTE2IGN0cmw7CisKKwl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfTkFUSVZFREFDT1VUVk9MLCAweDAwMDAwMDAwKTsKKwl5bWZwY2lfZGlzYWJsZV9kc3AoY29kZWMpOworCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9NT0RFLCAweDAwMDEwMDAwKTsKKwl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfTU9ERSwgMHgwMDAwMDAwMCk7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX01BUE9GUkVDLCAweDAwMDAwMDAwKTsKKwl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfTUFQT0ZFRkZFQ1QsIDB4MDAwMDAwMDApOworCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9QTEFZQ1RSTEJBU0UsIDB4MDAwMDAwMDApOworCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9SRUNDVFJMQkFTRSwgMHgwMDAwMDAwMCk7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX0VGRkNUUkxCQVNFLCAweDAwMDAwMDAwKTsKKwljdHJsID0geW1mcGNpX3JlYWR3KGNvZGVjLCBZRFNYR1JfR0xPQkFMQ1RSTCk7CisJeW1mcGNpX3dyaXRldyhjb2RlYywgWURTWEdSX0dMT0JBTENUUkwsIGN0cmwgJiB+MHgwMDA3KTsKKworCS8qIHNldHVwIERTUCBpbnN0cnVjdGlvbiBjb2RlICovCisJZm9yIChpID0gMDsgaSA8IFlEU1hHX0RTUExFTkdUSCAvIDQ7IGkrKykKKwkJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX0RTUElOU1RSQU0gKyAoaSA8PCAyKSwgRHNwSW5zdFtpXSk7CisKKwlzd2l0Y2ggKGNvZGVjLT5wY2ktPmRldmljZSkgeworCWNhc2UgUENJX0RFVklDRV9JRF9ZQU1BSEFfNzI0RjoKKwljYXNlIFBDSV9ERVZJQ0VfSURfWUFNQUhBXzc0MEM6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NDQ6CisJY2FzZSBQQ0lfREVWSUNFX0lEX1lBTUFIQV83NTQ6CisJCXZlcl8xZSA9IDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZlcl8xZSA9IDA7CisJfQorCisJaWYgKHZlcl8xZSkgeworCQkvKiBzZXR1cCBjb250cm9sIGluc3RydWN0aW9uIGNvZGUgKi8KKwkJZm9yIChpID0gMDsgaSA8IFlEU1hHX0NUUkxMRU5HVEggLyA0OyBpKyspCisJCQl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfQ1RSTElOU1RSQU0gKyAoaSA8PCAyKSwgQ250cmxJbnN0MUVbaV0pOworCX0gZWxzZSB7CisJCWZvciAoaSA9IDA7IGkgPCBZRFNYR19DVFJMTEVOR1RIIC8gNDsgaSsrKQorCQkJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX0NUUkxJTlNUUkFNICsgKGkgPDwgMiksIENudHJsSW5zdFtpXSk7CisJfQorCisJeW1mcGNpX2VuYWJsZV9kc3AoY29kZWMpOworCisJLyogMC4wMnMgc291bmRzIG5vdCB0b28gYmFkLCB3ZSBtYXkgZG8gc2NoZWR1bGVfdGltZW91dCgpIGxhdGVyLiAqLworCW1kZWxheSgyMCk7IC8qIHNlZW1zIHdlIG5lZWQgc29tZSBkZWxheSBhZnRlciBkb3dubG9hZGluZyBpbWFnZS4uICovCit9CisKK3N0YXRpYyBpbnQgeW1mcGNpX21lbWFsbG9jKHltZnBjaV90ICpjb2RlYykKK3sKKwl1bnNpZ25lZCBpbnQgcGxheWJhY2tfY3RybF9zaXplOworCXVuc2lnbmVkIGludCBiYW5rX3NpemVfcGxheWJhY2s7CisJdW5zaWduZWQgaW50IGJhbmtfc2l6ZV9jYXB0dXJlOworCXVuc2lnbmVkIGludCBiYW5rX3NpemVfZWZmZWN0OworCXVuc2lnbmVkIGludCBzaXplOworCXVuc2lnbmVkIGludCBvZmY7CisJY2hhciAqcHRyOworCWRtYV9hZGRyX3QgcGJhOworCWludCB2b2ljZSwgYmFuazsKKworCXBsYXliYWNrX2N0cmxfc2l6ZSA9IDQgKyA0ICogWURTWEdfUExBWUJBQ0tfVk9JQ0VTOworCWJhbmtfc2l6ZV9wbGF5YmFjayA9IHltZnBjaV9yZWFkbChjb2RlYywgWURTWEdSX1BMQVlDVFJMU0laRSkgPDwgMjsKKwliYW5rX3NpemVfY2FwdHVyZSA9IHltZnBjaV9yZWFkbChjb2RlYywgWURTWEdSX1JFQ0NUUkxTSVpFKSA8PCAyOworCWJhbmtfc2l6ZV9lZmZlY3QgPSB5bWZwY2lfcmVhZGwoY29kZWMsIFlEU1hHUl9FRkZDVFJMU0laRSkgPDwgMjsKKwljb2RlYy0+d29ya19zaXplID0gWURTWEdfREVGQVVMVF9XT1JLX1NJWkU7CisKKwlzaXplID0gKChwbGF5YmFja19jdHJsX3NpemUgKyAweDAwZmYpICYgfjB4MDBmZikgKworCSAgICAoKGJhbmtfc2l6ZV9wbGF5YmFjayAqIDIgKiBZRFNYR19QTEFZQkFDS19WT0lDRVMgKyAweGZmKSAmIH4weGZmKSArCisJICAgICgoYmFua19zaXplX2NhcHR1cmUgKiAyICogWURTWEdfQ0FQVFVSRV9WT0lDRVMgKyAweGZmKSAmIH4weGZmKSArCisJICAgICgoYmFua19zaXplX2VmZmVjdCAqIDIgKiBZRFNYR19FRkZFQ1RfVk9JQ0VTICsgMHhmZikgJiB+MHhmZikgKworCSAgICBjb2RlYy0+d29ya19zaXplOworCisJcHRyID0gcGNpX2FsbG9jX2NvbnNpc3RlbnQoY29kZWMtPnBjaSwgc2l6ZSArIDB4ZmYsICZwYmEpOworCWlmIChwdHIgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisJY29kZWMtPmRtYV9hcmVhX3ZhID0gcHRyOworCWNvZGVjLT5kbWFfYXJlYV9iYSA9IHBiYTsKKwljb2RlYy0+ZG1hX2FyZWFfc2l6ZSA9IHNpemUgKyAweGZmOworCisJb2ZmID0gKHVuc2lnbmVkIGxvbmcpcHRyICYgMHhmZjsKKwlpZiAob2ZmKSB7CisJCXB0ciArPSAweDEwMCAtIG9mZjsKKwkJcGJhICs9IDB4MTAwIC0gb2ZmOworCX0KKworCS8qCisJICogSGFyZHdhcmUgcmVxdWlyZXMgb25seSBwdHJbcGxheWJhY2tfY3RybF9zaXplXSB6ZXJvZWQsCisJICogYnV0IGluIG91ciBqdWRnZW1lbnQgaXQgaXMgYSB3cm9uZyBraW5kIG9mIHNhdmluZ3MsIHNvIGNsZWFyIGl0IGFsbC4KKwkgKi8KKwltZW1zZXQocHRyLCAwLCBzaXplKTsKKworCWNvZGVjLT5jdHJsX3BsYXliYWNrID0gKHUzMiAqKXB0cjsKKwljb2RlYy0+Y3RybF9wbGF5YmFja19iYSA9IHBiYTsKKwljb2RlYy0+Y3RybF9wbGF5YmFja1swXSA9IGNwdV90b19sZTMyKFlEU1hHX1BMQVlCQUNLX1ZPSUNFUyk7CisJcHRyICs9IChwbGF5YmFja19jdHJsX3NpemUgKyAweDAwZmYpICYgfjB4MDBmZjsKKwlwYmEgKz0gKHBsYXliYWNrX2N0cmxfc2l6ZSArIDB4MDBmZikgJiB+MHgwMGZmOworCisJb2ZmID0gMDsKKwlmb3IgKHZvaWNlID0gMDsgdm9pY2UgPCBZRFNYR19QTEFZQkFDS19WT0lDRVM7IHZvaWNlKyspIHsKKwkJY29kZWMtPnZvaWNlc1t2b2ljZV0ubnVtYmVyID0gdm9pY2U7CisJCWNvZGVjLT52b2ljZXNbdm9pY2VdLmJhbmsgPQorCQkgICAgKHltZnBjaV9wbGF5YmFja19iYW5rX3QgKikgKHB0ciArIG9mZik7CisJCWNvZGVjLT52b2ljZXNbdm9pY2VdLmJhbmtfYmEgPSBwYmEgKyBvZmY7CisJCW9mZiArPSAyICogYmFua19zaXplX3BsYXliYWNrOwkJLyogMiBiYW5rcyAqLworCX0KKwlvZmYgPSAob2ZmICsgMHhmZikgJiB+MHhmZjsKKwlwdHIgKz0gb2ZmOworCXBiYSArPSBvZmY7CisKKwlvZmYgPSAwOworCWNvZGVjLT5iYW5rX2Jhc2VfY2FwdHVyZSA9IHBiYTsKKwlmb3IgKHZvaWNlID0gMDsgdm9pY2UgPCBZRFNYR19DQVBUVVJFX1ZPSUNFUzsgdm9pY2UrKykKKwkJZm9yIChiYW5rID0gMDsgYmFuayA8IDI7IGJhbmsrKykgeworCQkJY29kZWMtPmJhbmtfY2FwdHVyZVt2b2ljZV1bYmFua10gPQorCQkJICAgICh5bWZwY2lfY2FwdHVyZV9iYW5rX3QgKikgKHB0ciArIG9mZik7CisJCQlvZmYgKz0gYmFua19zaXplX2NhcHR1cmU7CisJCX0KKwlvZmYgPSAob2ZmICsgMHhmZikgJiB+MHhmZjsKKwlwdHIgKz0gb2ZmOworCXBiYSArPSBvZmY7CisKKwlvZmYgPSAwOworCWNvZGVjLT5iYW5rX2Jhc2VfZWZmZWN0ID0gcGJhOworCWZvciAodm9pY2UgPSAwOyB2b2ljZSA8IFlEU1hHX0VGRkVDVF9WT0lDRVM7IHZvaWNlKyspCisJCWZvciAoYmFuayA9IDA7IGJhbmsgPCAyOyBiYW5rKyspIHsKKwkJCWNvZGVjLT5iYW5rX2VmZmVjdFt2b2ljZV1bYmFua10gPQorCQkJICAgICh5bWZwY2lfZWZmZWN0X2JhbmtfdCAqKSAocHRyICsgb2ZmKTsKKwkJCW9mZiArPSBiYW5rX3NpemVfZWZmZWN0OworCQl9CisJb2ZmID0gKG9mZiArIDB4ZmYpICYgfjB4ZmY7CisJcHRyICs9IG9mZjsKKwlwYmEgKz0gb2ZmOworCisJY29kZWMtPndvcmtfYmFzZSA9IHBiYTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB5bWZwY2lfbWVtZnJlZSh5bWZwY2lfdCAqY29kZWMpCit7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX1BMQVlDVFJMQkFTRSwgMCk7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX1JFQ0NUUkxCQVNFLCAwKTsKKwl5bWZwY2lfd3JpdGVsKGNvZGVjLCBZRFNYR1JfRUZGQ1RSTEJBU0UsIDApOworCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9XT1JLQkFTRSwgMCk7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX1dPUktTSVpFLCAwKTsKKwlwY2lfZnJlZV9jb25zaXN0ZW50KGNvZGVjLT5wY2ksCisJICAgIGNvZGVjLT5kbWFfYXJlYV9zaXplLCBjb2RlYy0+ZG1hX2FyZWFfdmEsIGNvZGVjLT5kbWFfYXJlYV9iYSk7Cit9CisKK3N0YXRpYyB2b2lkIHltZl9tZW1sb2FkKHltZnBjaV90ICp1bml0KQoreworCisJeW1mcGNpX3dyaXRlbCh1bml0LCBZRFNYR1JfUExBWUNUUkxCQVNFLCB1bml0LT5jdHJsX3BsYXliYWNrX2JhKTsKKwl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9SRUNDVFJMQkFTRSwgdW5pdC0+YmFua19iYXNlX2NhcHR1cmUpOworCXltZnBjaV93cml0ZWwodW5pdCwgWURTWEdSX0VGRkNUUkxCQVNFLCB1bml0LT5iYW5rX2Jhc2VfZWZmZWN0KTsKKwl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9XT1JLQkFTRSwgdW5pdC0+d29ya19iYXNlKTsKKwl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9XT1JLU0laRSwgdW5pdC0+d29ya19zaXplID4+IDIpOworCisJLyogUy9QRElGIG91dHB1dCBpbml0aWFsaXphdGlvbiAqLworCXltZnBjaV93cml0ZXcodW5pdCwgWURTWEdSX1NQRElGT1VUQ1RSTCwgMCk7CisJeW1mcGNpX3dyaXRldyh1bml0LCBZRFNYR1JfU1BESUZPVVRTVEFUVVMsCisJCVNORF9QQ01fQUVTMF9DT05fRU1QSEFTSVNfTk9ORSB8CisJCShTTkRfUENNX0FFUzFfQ09OX09SSUdJTkFMIDw8IDgpIHwKKwkJKFNORF9QQ01fQUVTMV9DT05fUENNX0NPREVSIDw8IDgpKTsKKworCS8qIFMvUERJRiBpbnB1dCBpbml0aWFsaXphdGlvbiAqLworCXltZnBjaV93cml0ZXcodW5pdCwgWURTWEdSX1NQRElGSU5DVFJMLCAwKTsKKworCS8qIG1vdmUgdGhpcyB2b2x1bWUgc2V0dXAgdG8gbWl4ZXIgKi8KKwl5bWZwY2lfd3JpdGVsKHVuaXQsIFlEU1hHUl9OQVRJVkVEQUNPVVRWT0wsIDB4M2ZmZjNmZmYpOworCXltZnBjaV93cml0ZWwodW5pdCwgWURTWEdSX0JVRjQ0MU9VVFZPTCwgMCk7CisJeW1mcGNpX3dyaXRlbCh1bml0LCBZRFNYR1JfTkFUSVZFQURDSU5WT0wsIDB4M2ZmZjNmZmYpOworCXltZnBjaV93cml0ZWwodW5pdCwgWURTWEdSX05BVElWRURBQ0lOVk9MLCAweDNmZmYzZmZmKTsKK30KKworc3RhdGljIGludCB5bWZfYWM5N19pbml0KHltZnBjaV90ICp1bml0LCBpbnQgbnVtX2FjOTcpCit7CisJc3RydWN0IGFjOTdfY29kZWMgKmNvZGVjOworCXUxNiBlaWQ7CisKKwlpZiAoKGNvZGVjID0gYWM5N19hbGxvY19jb2RlYygpKSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsKKworCS8qIGluaXRpYWxpemUgc29tZSBiYXNpYyBjb2RlYyBpbmZvcm1hdGlvbiwgb3RoZXIgZmllbGRzIHdpbGwgYmUgZmlsbGVkCisJICAgaW4gYWM5N19wcm9iZV9jb2RlYyAqLworCWNvZGVjLT5wcml2YXRlX2RhdGEgPSB1bml0OworCWNvZGVjLT5pZCA9IG51bV9hYzk3OworCisJY29kZWMtPmNvZGVjX3JlYWQgPSB5bWZwY2lfY29kZWNfcmVhZDsKKwljb2RlYy0+Y29kZWNfd3JpdGUgPSB5bWZwY2lfY29kZWNfd3JpdGU7CisKKwlpZiAoYWM5N19wcm9iZV9jb2RlYyhjb2RlYykgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogYWM5N19wcm9iZV9jb2RlYyBmYWlsZWRcbiIpOworCQlnb3RvIG91dF9rZnJlZTsKKwl9CisKKwllaWQgPSB5bWZwY2lfY29kZWNfcmVhZChjb2RlYywgQUM5N19FWFRFTkRFRF9JRCk7CisJaWYgKGVpZD09MHhGRkZGKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcgInltZnBjaTogbm8gY29kZWMgYXR0YWNoZWQgP1xuIik7CisJCWdvdG8gb3V0X2tmcmVlOworCX0KKworCXVuaXQtPmFjOTdfZmVhdHVyZXMgPSBlaWQ7CisKKwlpZiAoKGNvZGVjLT5kZXZfbWl4ZXIgPSByZWdpc3Rlcl9zb3VuZF9taXhlcigmeW1mX21peGVyX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiBjb3VsZG4ndCByZWdpc3RlciBtaXhlciFcbiIpOworCQlnb3RvIG91dF9rZnJlZTsKKwl9CisKKwl1bml0LT5hYzk3X2NvZGVjW251bV9hYzk3XSA9IGNvZGVjOworCisJcmV0dXJuIDA7Cisgb3V0X2tmcmVlOgorCWFjOTdfcmVsZWFzZV9jb2RlYyhjb2RlYyk7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKKyNpZmRlZiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWQorIyBpZmRlZiBNT0RVTEUKK3N0YXRpYyBpbnQgbXB1X2lvOworc3RhdGljIGludCBzeW50aF9pbzsKK21vZHVsZV9wYXJhbShtcHVfaW8sIGludCwgMCk7Cittb2R1bGVfcGFyYW0oc3ludGhfaW8sIGludCwgMCk7CisjIGVsc2UKK3N0YXRpYyBpbnQgbXB1X2lvICAgICA9IDB4MzMwOworc3RhdGljIGludCBzeW50aF9pbyAgID0gMHgzODg7CisjIGVuZGlmCitzdGF0aWMgaW50IGFzc2lnbmVkOworI2VuZGlmIC8qIENPTkZJR19TT1VORF9ZTUZQQ0lfTEVHQUNZICovCisKK3N0YXRpYyBpbnQgX19kZXZpbml0IHltZl9wcm9iZV9vbmUoc3RydWN0IHBjaV9kZXYgKnBjaWRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCkKK3sKKwl1MTYgY3RybDsKKwl1bnNpZ25lZCBsb25nIGJhc2U7CisJeW1mcGNpX3QgKmNvZGVjOworCisJaW50IGVycjsKKworCWlmICgoZXJyID0gcGNpX2VuYWJsZV9kZXZpY2UocGNpZGV2KSkgIT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogcGNpX2VuYWJsZV9kZXZpY2UgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJYmFzZSA9IHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApOworCisJaWYgKChjb2RlYyA9IGttYWxsb2Moc2l6ZW9mKHltZnBjaV90KSwgR0ZQX0tFUk5FTCkpID09IE5VTEwpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IG5vIGNvcmVcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJbWVtc2V0KGNvZGVjLCAwLCBzaXplb2YoKmNvZGVjKSk7CisKKwlzcGluX2xvY2tfaW5pdCgmY29kZWMtPnJlZ19sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmY29kZWMtPnZvaWNlX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZjb2RlYy0+YWM5N19sb2NrKTsKKwlpbml0X01VVEVYKCZjb2RlYy0+b3Blbl9zZW0pOworCUlOSVRfTElTVF9IRUFEKCZjb2RlYy0+c3RhdGVzKTsKKwljb2RlYy0+cGNpID0gcGNpZGV2OworCisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGNpZGV2LCBQQ0lfUkVWSVNJT05fSUQsICZjb2RlYy0+cmV2KTsKKworCWlmIChyZXF1ZXN0X21lbV9yZWdpb24oYmFzZSwgMHg4MDAwLCAieW1mcGNpIikgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogdW5hYmxlIHRvIHJlcXVlc3QgbWVtIHJlZ2lvblxuIik7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCisJaWYgKChjb2RlYy0+cmVnX2FyZWFfdmlydCA9IGlvcmVtYXAoYmFzZSwgMHg4MDAwKSkgPT0gTlVMTCkgeworCQlwcmludGsoS0VSTl9FUlIgInltZnBjaTogdW5hYmxlIHRvIG1hcCByZWdpc3RlcnNcbiIpOworCQlnb3RvIG91dF9yZWxlYXNlX3JlZ2lvbjsKKwl9CisKKwlwY2lfc2V0X21hc3RlcihwY2lkZXYpOworCisJcHJpbnRrKEtFUk5fSU5GTyAieW1mcGNpOiAlcyBhdCAweCVseCBJUlEgJWRcbiIsCisJICAgIChjaGFyICopZW50LT5kcml2ZXJfZGF0YSwgYmFzZSwgcGNpZGV2LT5pcnEpOworCisJeW1mcGNpX2FjbGlua19yZXNldChwY2lkZXYpOworCWlmICh5bWZwY2lfY29kZWNfcmVhZHkoY29kZWMsIDAsIDEpIDwgMCkKKwkJZ290byBvdXRfdW5tYXA7CisKKyNpZmRlZiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWQorCWlmIChhc3NpZ25lZCA9PSAwKSB7CisJCWNvZGVjLT5pb21pZGkgPSBtcHVfaW87CisJCWNvZGVjLT5pb3N5bnRoID0gc3ludGhfaW87CisJCWlmICh5bWZwY2lfc2V0dXBfbGVnYWN5KGNvZGVjLCBwY2lkZXYpIDwgMCkKKwkJCWdvdG8gb3V0X3VubWFwOworCQlhc3NpZ25lZCA9IDE7CisJfQorI2VuZGlmCisKKwl5bWZwY2lfZG93bmxvYWRfaW1hZ2UoY29kZWMpOworCisJaWYgKHltZnBjaV9tZW1hbGxvYyhjb2RlYykgPCAwKQorCQlnb3RvIG91dF9kaXNhYmxlX2RzcDsKKwl5bWZfbWVtbG9hZChjb2RlYyk7CisKKwlpZiAocmVxdWVzdF9pcnEocGNpZGV2LT5pcnEsIHltZl9pbnRlcnJ1cHQsIFNBX1NISVJRLCAieW1mcGNpIiwgY29kZWMpICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJ5bWZwY2k6IHVuYWJsZSB0byByZXF1ZXN0IElSUSAlZFxuIiwKKwkJICAgIHBjaWRldi0+aXJxKTsKKwkJZ290byBvdXRfbWVtZnJlZTsKKwl9CisKKwkvKiByZWdpc3RlciAvZGV2L2RzcCAqLworCWlmICgoY29kZWMtPmRldl9hdWRpbyA9IHJlZ2lzdGVyX3NvdW5kX2RzcCgmeW1mX2ZvcHMsIC0xKSkgPCAwKSB7CisJCXByaW50ayhLRVJOX0VSUiAieW1mcGNpOiB1bmFibGUgdG8gcmVnaXN0ZXIgZHNwXG4iKTsKKwkJZ290byBvdXRfZnJlZV9pcnE7CisJfQorCisJLyoKKwkgKiBQb2tlIGp1c3QgdGhlIHByaW1hcnkgZm9yIHRoZSBtb21lbnQuCisJICovCisJaWYgKChlcnIgPSB5bWZfYWM5N19pbml0KGNvZGVjLCAwKSkgIT0gMCkKKwkJZ290byBvdXRfdW5yZWdpc3Rlcl9zb3VuZF9kc3A7CisKKyNpZmRlZiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWQorCWNvZGVjLT5vcGwzX2RhdGEubmFtZSA9ICJ5bWZwY2kiOworCWNvZGVjLT5tcHVfZGF0YS5uYW1lICA9ICJ5bWZwY2kiOworCisJY29kZWMtPm9wbDNfZGF0YS5pb19iYXNlID0gY29kZWMtPmlvc3ludGg7CisJY29kZWMtPm9wbDNfZGF0YS5pcnEgICAgID0gLTE7CisKKwljb2RlYy0+bXB1X2RhdGEuaW9fYmFzZSAgPSBjb2RlYy0+aW9taWRpOworCWNvZGVjLT5tcHVfZGF0YS5pcnEgICAgICA9IC0xOwkvKiBNYXkgYmUgZGlmZmVyZW50IGZyb20gb3VyIFBDSSBJUlEuICovCisKKwlpZiAoY29kZWMtPmlvbWlkaSkgeworCQlpZiAoIXByb2JlX3VhcnQ0MDEoJmNvZGVjLT5tcHVfZGF0YSwgVEhJU19NT0RVTEUpKSB7CisJCQljb2RlYy0+aW9taWRpID0gMDsJLyogWFhYIGtsdWRnZSAqLworCQl9CisJfQorI2VuZGlmIC8qIENPTkZJR19TT1VORF9ZTUZQQ0lfTEVHQUNZICovCisKKwkvKiBwdXQgaXQgaW50byBkcml2ZXIgbGlzdCAqLworCXNwaW5fbG9jaygmeW1mX2RldnNfbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmY29kZWMtPnltZl9kZXZzLCAmeW1mX2RldnMpOworCXNwaW5fdW5sb2NrKCZ5bWZfZGV2c19sb2NrKTsKKwlwY2lfc2V0X2RydmRhdGEocGNpZGV2LCBjb2RlYyk7CisKKwlyZXR1cm4gMDsKKworIG91dF91bnJlZ2lzdGVyX3NvdW5kX2RzcDoKKwl1bnJlZ2lzdGVyX3NvdW5kX2RzcChjb2RlYy0+ZGV2X2F1ZGlvKTsKKyBvdXRfZnJlZV9pcnE6CisJZnJlZV9pcnEocGNpZGV2LT5pcnEsIGNvZGVjKTsKKyBvdXRfbWVtZnJlZToKKwl5bWZwY2lfbWVtZnJlZShjb2RlYyk7Cisgb3V0X2Rpc2FibGVfZHNwOgorCXltZnBjaV9kaXNhYmxlX2RzcChjb2RlYyk7CisJY3RybCA9IHltZnBjaV9yZWFkdyhjb2RlYywgWURTWEdSX0dMT0JBTENUUkwpOworCXltZnBjaV93cml0ZXcoY29kZWMsIFlEU1hHUl9HTE9CQUxDVFJMLCBjdHJsICYgfjB4MDAwNyk7CisJeW1mcGNpX3dyaXRlbChjb2RlYywgWURTWEdSX1NUQVRVUywgfjApOworIG91dF91bm1hcDoKKwlpb3VubWFwKGNvZGVjLT5yZWdfYXJlYV92aXJ0KTsKKyBvdXRfcmVsZWFzZV9yZWdpb246CisJcmVsZWFzZV9tZW1fcmVnaW9uKHBjaV9yZXNvdXJjZV9zdGFydChwY2lkZXYsIDApLCAweDgwMDApOworIG91dF9mcmVlOgorCWlmIChjb2RlYy0+YWM5N19jb2RlY1swXSkKKwkJYWM5N19yZWxlYXNlX2NvZGVjKGNvZGVjLT5hYzk3X2NvZGVjWzBdKTsKKwlyZXR1cm4gLUVOT0RFVjsKK30KKworc3RhdGljIHZvaWQgX19kZXZleGl0IHltZl9yZW1vdmVfb25lKHN0cnVjdCBwY2lfZGV2ICpwY2lkZXYpCit7CisJX191MTYgY3RybDsKKwl5bWZwY2lfdCAqY29kZWMgPSBwY2lfZ2V0X2RydmRhdGEocGNpZGV2KTsKKworCS8qIHJlbW92ZSBmcm9tIGxpc3Qgb2YgZGV2aWNlcyAqLworCXNwaW5fbG9jaygmeW1mX2RldnNfbG9jayk7CisJbGlzdF9kZWwoJmNvZGVjLT55bWZfZGV2cyk7CisJc3Bpbl91bmxvY2soJnltZl9kZXZzX2xvY2spOworCisJdW5yZWdpc3Rlcl9zb3VuZF9taXhlcihjb2RlYy0+YWM5N19jb2RlY1swXS0+ZGV2X21peGVyKTsKKwlhYzk3X3JlbGVhc2VfY29kZWMoY29kZWMtPmFjOTdfY29kZWNbMF0pOworCXVucmVnaXN0ZXJfc291bmRfZHNwKGNvZGVjLT5kZXZfYXVkaW8pOworCWZyZWVfaXJxKHBjaWRldi0+aXJxLCBjb2RlYyk7CisJeW1mcGNpX21lbWZyZWUoY29kZWMpOworCXltZnBjaV93cml0ZWwoY29kZWMsIFlEU1hHUl9TVEFUVVMsIH4wKTsKKwl5bWZwY2lfZGlzYWJsZV9kc3AoY29kZWMpOworCWN0cmwgPSB5bWZwY2lfcmVhZHcoY29kZWMsIFlEU1hHUl9HTE9CQUxDVFJMKTsKKwl5bWZwY2lfd3JpdGV3KGNvZGVjLCBZRFNYR1JfR0xPQkFMQ1RSTCwgY3RybCAmIH4weDAwMDcpOworCWlvdW5tYXAoY29kZWMtPnJlZ19hcmVhX3ZpcnQpOworCXJlbGVhc2VfbWVtX3JlZ2lvbihwY2lfcmVzb3VyY2Vfc3RhcnQocGNpZGV2LCAwKSwgMHg4MDAwKTsKKyNpZmRlZiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWQorCWlmIChjb2RlYy0+aW9taWRpKSB7CisJCXVubG9hZF91YXJ0NDAxKCZjb2RlYy0+bXB1X2RhdGEpOworCX0KKyNlbmRpZiAvKiBDT05GSUdfU09VTkRfWU1GUENJX0xFR0FDWSAqLworfQorCitNT0RVTEVfQVVUSE9SKCJKYXJvc2xhdiBLeXNlbGEiKTsKK01PRFVMRV9ERVNDUklQVElPTigiWWFtYWhhIFlNRjd4eCBQQ0kgQXVkaW8iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHltZnBjaV9kcml2ZXIgPSB7CisJLm5hbWUJCT0gInltZnBjaSIsCisJLmlkX3RhYmxlCT0geW1mX2lkX3RibCwKKwkucHJvYmUJCT0geW1mX3Byb2JlX29uZSwKKwkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKHltZl9yZW1vdmVfb25lKSwKKwkuc3VzcGVuZAk9IHltZl9zdXNwZW5kLAorCS5yZXN1bWUJCT0geW1mX3Jlc3VtZQorfTsKKworc3RhdGljIGludCBfX2luaXQgeW1mX2luaXRfbW9kdWxlKHZvaWQpCit7CisJcmV0dXJuIHBjaV9tb2R1bGVfaW5pdCgmeW1mcGNpX2RyaXZlcik7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCB5bWZfY2xlYW51cF9tb2R1bGUgKHZvaWQpCit7CisJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ5bWZwY2lfZHJpdmVyKTsKK30KKworbW9kdWxlX2luaXQoeW1mX2luaXRfbW9kdWxlKTsKK21vZHVsZV9leGl0KHltZl9jbGVhbnVwX21vZHVsZSk7CmRpZmYgLS1naXQgYS9zb3VuZC9vc3MveW1mcGNpLmggYi9zb3VuZC9vc3MveW1mcGNpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxMGExMAotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy95bWZwY2kuaApAQCAtMCwwICsxLDM2MCBAQAorI2lmbmRlZiBfX1lNRlBDSV9ICisjZGVmaW5lIF9fWU1GUENJX0gKKworLyoKKyAqICBDb3B5cmlnaHQgKGMpIGJ5IEphcm9zbGF2IEt5c2VsYSA8cGVyZXhAc3VzZS5jej4KKyAqICBEZWZpbml0aW9ucyBmb3IgWWFoYW1hIFlNRjcyNC83NDAvNzQ0Lzc1NCBjaGlwcworICoKKyAqCisgKiAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisjaW5jbHVkZSA8bGludXgvY29uZmlnLmg+CisKKy8qCisgKiAgRGlyZWN0IHJlZ2lzdGVycworICovCisKKy8qICNkZWZpbmUgWU1GUkVHKGNvZGVjLCByZWcpCQkoY29kZWMtPnBvcnQgKyBZRFNYR1JfIyNyZWcpICovCisKKyNkZWZpbmUJWURTWEdSX0lOVEZMQUcJCQkweDAwMDQKKyNkZWZpbmUJWURTWEdSX0FDVElWSVRZCQkJMHgwMDA2CisjZGVmaW5lCVlEU1hHUl9HTE9CQUxDVFJMCQkweDAwMDgKKyNkZWZpbmUJWURTWEdSX1pWQ1RSTAkJCTB4MDAwQQorI2RlZmluZQlZRFNYR1JfVElNRVJDVFJMCQkweDAwMTAKKyNkZWZpbmUJWURTWEdSX1RJTUVSQ1RSTF9URU4JCSAweDAwMDEKKyNkZWZpbmUJWURTWEdSX1RJTUVSQ1RSTF9USUVOCQkgMHgwMDAyCisjZGVmaW5lCVlEU1hHUl9USU1FUkNPVU5UCQkweDAwMTIKKyNkZWZpbmUJWURTWEdSX1NQRElGT1VUQ1RSTAkJMHgwMDE4CisjZGVmaW5lCVlEU1hHUl9TUERJRk9VVFNUQVRVUwkJMHgwMDFDCisjZGVmaW5lCVlEU1hHUl9FRVBST01DVFJMCQkweDAwMjAKKyNkZWZpbmUJWURTWEdSX1NQRElGSU5DVFJMCQkweDAwMzQKKyNkZWZpbmUJWURTWEdSX1NQRElGSU5TVEFUVVMJCTB4MDAzOAorI2RlZmluZQlZRFNYR1JfRFNQUFJPR1JBTURMCQkweDAwNDgKKyNkZWZpbmUJWURTWEdSX0RMQ05UUkwJCQkweDAwNEMKKyNkZWZpbmUJWURTWEdSX0dQSU9JTklOVEZMQUcJCTB4MDA1MAorI2RlZmluZQlZRFNYR1JfR1BJT0lOSU5URU5BQkxFCQkweDAwNTIKKyNkZWZpbmUJWURTWEdSX0dQSU9JTlNUQVRVUwkJMHgwMDU0CisjZGVmaW5lCVlEU1hHUl9HUElPT1VUQ1RSTAkJMHgwMDU2CisjZGVmaW5lCVlEU1hHUl9HUElPRlVOQ0VOQUJMRQkJMHgwMDU4CisjZGVmaW5lCVlEU1hHUl9HUElPVFlQRUNPTkZJRwkJMHgwMDVBCisjZGVmaW5lCVlEU1hHUl9BQzk3Q01EREFUQQkJMHgwMDYwCisjZGVmaW5lCVlEU1hHUl9BQzk3Q01EQURSCQkweDAwNjIKKyNkZWZpbmUJWURTWEdSX1BSSVNUQVRVU0RBVEEJCTB4MDA2NAorI2RlZmluZQlZRFNYR1JfUFJJU1RBVFVTQURSCQkweDAwNjYKKyNkZWZpbmUJWURTWEdSX1NFQ1NUQVRVU0RBVEEJCTB4MDA2OAorI2RlZmluZQlZRFNYR1JfU0VDU1RBVFVTQURSCQkweDAwNkEKKyNkZWZpbmUJWURTWEdSX1NFQ0NPTkZJRwkJMHgwMDcwCisjZGVmaW5lCVlEU1hHUl9MRUdBQ1lPVVRWT0wJCTB4MDA4MAorI2RlZmluZQlZRFNYR1JfTEVHQUNZT1VUVk9MTAkJMHgwMDgwCisjZGVmaW5lCVlEU1hHUl9MRUdBQ1lPVVRWT0xSCQkweDAwODIKKyNkZWZpbmUJWURTWEdSX05BVElWRURBQ09VVFZPTAkJMHgwMDg0CisjZGVmaW5lCVlEU1hHUl9OQVRJVkVEQUNPVVRWT0xMCQkweDAwODQKKyNkZWZpbmUJWURTWEdSX05BVElWRURBQ09VVFZPTFIJCTB4MDA4NgorI2RlZmluZQlZRFNYR1JfU1BESUZPVVRWT0wJCTB4MDA4OAorI2RlZmluZQlZRFNYR1JfU1BESUZPVVRWT0xMCQkweDAwODgKKyNkZWZpbmUJWURTWEdSX1NQRElGT1VUVk9MUgkJMHgwMDhBCisjZGVmaW5lCVlEU1hHUl9BQzNPVVRWT0wJCTB4MDA4QworI2RlZmluZQlZRFNYR1JfQUMzT1VUVk9MTAkJMHgwMDhDCisjZGVmaW5lCVlEU1hHUl9BQzNPVVRWT0xSCQkweDAwOEUKKyNkZWZpbmUJWURTWEdSX1BSSUFEQ09VVFZPTAkJMHgwMDkwCisjZGVmaW5lCVlEU1hHUl9QUklBRENPVVRWT0xMCQkweDAwOTAKKyNkZWZpbmUJWURTWEdSX1BSSUFEQ09VVFZPTFIJCTB4MDA5MgorI2RlZmluZQlZRFNYR1JfTEVHQUNZTE9PUFZPTAkJMHgwMDk0CisjZGVmaW5lCVlEU1hHUl9MRUdBQ1lMT09QVk9MTAkJMHgwMDk0CisjZGVmaW5lCVlEU1hHUl9MRUdBQ1lMT09QVk9MUgkJMHgwMDk2CisjZGVmaW5lCVlEU1hHUl9OQVRJVkVEQUNMT09QVk9MCQkweDAwOTgKKyNkZWZpbmUJWURTWEdSX05BVElWRURBQ0xPT1BWT0xMCTB4MDA5OAorI2RlZmluZQlZRFNYR1JfTkFUSVZFREFDTE9PUFZPTFIJMHgwMDlBCisjZGVmaW5lCVlEU1hHUl9TUERJRkxPT1BWT0wJCTB4MDA5QworI2RlZmluZQlZRFNYR1JfU1BESUZMT09QVk9MTAkJMHgwMDlFCisjZGVmaW5lCVlEU1hHUl9TUERJRkxPT1BWT0xSCQkweDAwOUUKKyNkZWZpbmUJWURTWEdSX0FDM0xPT1BWT0wJCTB4MDBBMAorI2RlZmluZQlZRFNYR1JfQUMzTE9PUFZPTEwJCTB4MDBBMAorI2RlZmluZQlZRFNYR1JfQUMzTE9PUFZPTFIJCTB4MDBBMgorI2RlZmluZQlZRFNYR1JfUFJJQURDTE9PUFZPTAkJMHgwMEE0CisjZGVmaW5lCVlEU1hHUl9QUklBRENMT09QVk9MTAkJMHgwMEE0CisjZGVmaW5lCVlEU1hHUl9QUklBRENMT09QVk9MUgkJMHgwMEE2CisjZGVmaW5lCVlEU1hHUl9OQVRJVkVBRENJTlZPTAkJMHgwMEE4CisjZGVmaW5lCVlEU1hHUl9OQVRJVkVBRENJTlZPTEwJCTB4MDBBOAorI2RlZmluZQlZRFNYR1JfTkFUSVZFQURDSU5WT0xSCQkweDAwQUEKKyNkZWZpbmUJWURTWEdSX05BVElWRURBQ0lOVk9MCQkweDAwQUMKKyNkZWZpbmUJWURTWEdSX05BVElWRURBQ0lOVk9MTAkJMHgwMEFDCisjZGVmaW5lCVlEU1hHUl9OQVRJVkVEQUNJTlZPTFIJCTB4MDBBRQorI2RlZmluZQlZRFNYR1JfQlVGNDQxT1VUVk9MCQkweDAwQjAKKyNkZWZpbmUJWURTWEdSX0JVRjQ0MU9VVFZPTEwJCTB4MDBCMAorI2RlZmluZQlZRFNYR1JfQlVGNDQxT1VUVk9MUgkJMHgwMEIyCisjZGVmaW5lCVlEU1hHUl9CVUY0NDFMT09QVk9MCQkweDAwQjQKKyNkZWZpbmUJWURTWEdSX0JVRjQ0MUxPT1BWT0xMCQkweDAwQjQKKyNkZWZpbmUJWURTWEdSX0JVRjQ0MUxPT1BWT0xSCQkweDAwQjYKKyNkZWZpbmUJWURTWEdSX1NQRElGT1VUVk9MMgkJMHgwMEI4CisjZGVmaW5lCVlEU1hHUl9TUERJRk9VVFZPTDJMCQkweDAwQjgKKyNkZWZpbmUJWURTWEdSX1NQRElGT1VUVk9MMlIJCTB4MDBCQQorI2RlZmluZQlZRFNYR1JfU1BESUZMT09QVk9MMgkJMHgwMEJDCisjZGVmaW5lCVlEU1hHUl9TUERJRkxPT1BWT0wyTAkJMHgwMEJDCisjZGVmaW5lCVlEU1hHUl9TUERJRkxPT1BWT0wyUgkJMHgwMEJFCisjZGVmaW5lCVlEU1hHUl9BRENTTE9UU1IJCTB4MDBDMAorI2RlZmluZQlZRFNYR1JfUkVDU0xPVFNSCQkweDAwQzQKKyNkZWZpbmUJWURTWEdSX0FEQ0ZPUk1BVAkJMHgwMEM4CisjZGVmaW5lCVlEU1hHUl9SRUNGT1JNQVQJCTB4MDBDQworI2RlZmluZQlZRFNYR1JfUDQ0U0xPVFNSCQkweDAwRDAKKyNkZWZpbmUJWURTWEdSX1NUQVRVUwkJCTB4MDEwMAorI2RlZmluZQlZRFNYR1JfQ1RSTFNFTEVDVAkJMHgwMTA0CisjZGVmaW5lCVlEU1hHUl9NT0RFCQkJMHgwMTA4CisjZGVmaW5lCVlEU1hHUl9TQU1QTEVDT1VOVAkJMHgwMTBDCisjZGVmaW5lCVlEU1hHUl9OVU1PRlNBTVBMRVMJCTB4MDExMAorI2RlZmluZQlZRFNYR1JfQ09ORklHCQkJMHgwMTE0CisjZGVmaW5lCVlEU1hHUl9QTEFZQ1RSTFNJWkUJCTB4MDE0MAorI2RlZmluZQlZRFNYR1JfUkVDQ1RSTFNJWkUJCTB4MDE0NAorI2RlZmluZQlZRFNYR1JfRUZGQ1RSTFNJWkUJCTB4MDE0OAorI2RlZmluZQlZRFNYR1JfV09SS1NJWkUJCQkweDAxNEMKKyNkZWZpbmUJWURTWEdSX01BUE9GUkVDCQkJMHgwMTUwCisjZGVmaW5lCVlEU1hHUl9NQVBPRkVGRkVDVAkJMHgwMTU0CisjZGVmaW5lCVlEU1hHUl9QTEFZQ1RSTEJBU0UJCTB4MDE1OAorI2RlZmluZQlZRFNYR1JfUkVDQ1RSTEJBU0UJCTB4MDE1QworI2RlZmluZQlZRFNYR1JfRUZGQ1RSTEJBU0UJCTB4MDE2MAorI2RlZmluZQlZRFNYR1JfV09SS0JBU0UJCQkweDAxNjQKKyNkZWZpbmUJWURTWEdSX0RTUElOU1RSQU0JCTB4MTAwMAorI2RlZmluZQlZRFNYR1JfQ1RSTElOU1RSQU0JCTB4NDAwMAorCisjZGVmaW5lIFlEU1hHX0FDOTdSRUFEQ01ECQkweDgwMDAKKyNkZWZpbmUgWURTWEdfQUM5N1dSSVRFQ01ECQkweDAwMDAKKworI2RlZmluZSBQQ0lSX0xFR0NUUkwJCQkweDQwCisjZGVmaW5lIFBDSVJfRUxFR0NUUkwJCQkweDQyCisjZGVmaW5lIFBDSVJfRFNYR0NUUkwJCQkweDQ4CisjZGVmaW5lIFBDSVJfRFNYUFdSQ1RSTDEJCTB4NGEKKyNkZWZpbmUgUENJUl9EU1hQV1JDVFJMMgkJMHg0ZQorI2RlZmluZSBQQ0lSX09QTEFEUgkJCTB4NjAKKyNkZWZpbmUgUENJUl9TQkFEUgkJCTB4NjIKKyNkZWZpbmUgUENJUl9NUFVBRFIJCQkweDY0CisKKyNkZWZpbmUgWURTWEdfRFNQTEVOR1RICQkJMHgwMDgwCisjZGVmaW5lIFlEU1hHX0NUUkxMRU5HVEgJCTB4MzAwMAorCisjZGVmaW5lIFlEU1hHX0RFRkFVTFRfV09SS19TSVpFCQkweDA0MDAKKworI2RlZmluZSBZRFNYR19QTEFZQkFDS19WT0lDRVMJCTY0CisjZGVmaW5lIFlEU1hHX0NBUFRVUkVfVk9JQ0VTCQkyCisjZGVmaW5lIFlEU1hHX0VGRkVDVF9WT0lDRVMJCTUKKworLyogbWF4aW51bSBudW1iZXIgb2YgQUM5NyBjb2RlY3MgY29ubmVjdGVkLCBBQzk3IDIuMCBkZWZpbmVkIDQgKi8KKyNkZWZpbmUgTlJfQUM5NwkJMgorCisjZGVmaW5lIFlNRl9TQU1QRgkJCTI1NgkvKiBTYW1wbGVzIHBlciBmcmFtZSBANDgwMDAgKi8KKworLyoKKyAqIFRoZSBzbG90L3ZvaWNlIGNvbnRyb2wgYmFuayAoMiBvZiB0aGVzZSBwZXIgdm9pY2UpCisgKi8KKwordHlwZWRlZiBzdHJ1Y3Qgc3RydV95bWZwY2lfcGxheWJhY2tfYmFuayB7CisJdTMyIGZvcm1hdDsKKwl1MzIgbG9vcF9kZWZhdWx0OworCXUzMiBiYXNlOwkJCS8qIDMyLWJpdCBhZGRyZXNzICovCisJdTMyIGxvb3Bfc3RhcnQ7CQkJLyogMzItYml0IG9mZnNldCAqLworCXUzMiBsb29wX2VuZDsJCQkvKiAzMi1iaXQgb2Zmc2V0ICovCisJdTMyIGxvb3BfZnJhYzsJCQkvKiA4LWJpdCBmcmFjdGlvbiAtIGxvb3Bfc3RhcnQgKi8KKwl1MzIgZGVsdGFfZW5kOwkJCS8qIHBpdGNoIGRlbHRhIGVuZCAqLworCXUzMiBscGZLX2VuZDsKKwl1MzIgZWdfZ2Fpbl9lbmQ7CisJdTMyIGxlZnRfZ2Fpbl9lbmQ7CisJdTMyIHJpZ2h0X2dhaW5fZW5kOworCXUzMiBlZmYxX2dhaW5fZW5kOworCXUzMiBlZmYyX2dhaW5fZW5kOworCXUzMiBlZmYzX2dhaW5fZW5kOworCXUzMiBscGZROworCXUzMiBzdGF0dXM7CQkvKiBQMzogQWx3YXlzIDAgZm9yIHNvbWUgcmVhc29uLiAqLworCXUzMiBudW1fb2ZfZnJhbWVzOworCXUzMiBsb29wX2NvdW50OworCXUzMiBzdGFydDsJCS8qIFAzOiBKLiByZWFkcyB0aGlzIHRvIGtub3cgd2hlcmUgY2hpcCBpcy4gKi8KKwl1MzIgc3RhcnRfZnJhYzsKKwl1MzIgZGVsdGE7CisJdTMyIGxwZks7CisJdTMyIGVnX2dhaW47CisJdTMyIGxlZnRfZ2FpbjsKKwl1MzIgcmlnaHRfZ2FpbjsKKwl1MzIgZWZmMV9nYWluOworCXUzMiBlZmYyX2dhaW47CisJdTMyIGVmZjNfZ2FpbjsKKwl1MzIgbHBmRDE7CisJdTMyIGxwZkQyOworfSB5bWZwY2lfcGxheWJhY2tfYmFua190OworCit0eXBlZGVmIHN0cnVjdCBzdHJ1X3ltZnBjaV9jYXB0dXJlX2JhbmsgeworCXUzMiBiYXNlOwkJCS8qIDMyLWJpdCBhZGRyZXNzIChhbGlnbmVkIGF0IDQpICovCisJdTMyIGxvb3BfZW5kOwkJCS8qIHNpemUgaW4gQllURVMgKGFsaWduZWQgYXQgNCkgKi8KKwl1MzIgc3RhcnQ7CQkJLyogMzItYml0IG9mZnNldCAqLworCXUzMiBudW1fb2ZfbG9vcHM7CQkvKiBjb3VudGVyICovCit9IHltZnBjaV9jYXB0dXJlX2JhbmtfdDsKKwordHlwZWRlZiBzdHJ1Y3Qgc3RydV95bWZwY2lfZWZmZWN0X2JhbmsgeworCXUzMiBiYXNlOwkJCS8qIDMyLWJpdCBhZGRyZXNzICovCisJdTMyIGxvb3BfZW5kOwkJCS8qIDMyLWJpdCBvZmZzZXQgKi8KKwl1MzIgc3RhcnQ7CQkJLyogMzItYml0IG9mZnNldCAqLworCXUzMiB0ZW1wOworfSB5bWZwY2lfZWZmZWN0X2JhbmtfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeW1mX3ZvaWNlIHltZnBjaV92b2ljZV90OworLyoKKyAqIFRocm91Z2hvdXQgdGhlIGNvZGUgWWFyb3NsYXYgbmFtZXMgWU1GIHVuaXQgcG9pbnRlciAiY29kZWMiCisgKiBldmVuIHRob3VnaCBpdCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGFueSBjb2RlYy4gTXVzdCBiZSBoaXN0b3JpYy4KKyAqIFdlIHJlcGxhY2UgaXQgd2l0aCAidW5pdCIgb3ZlciB0aW1lLgorICogQUM5NyBwYXJ0cyB1c2UgImNvZGVjIiB0byBkZW5vdGUgYSBjb2RlYywgbmF0dXJhbGx5LgorICovCit0eXBlZGVmIHN0cnVjdCB5bWZfdW5pdCB5bWZwY2lfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlZTUZQQ0lfUENNLAorCVlNRlBDSV9TWU5USCwKKwlZTUZQQ0lfTUlESQorfSB5bWZwY2lfdm9pY2VfdHlwZV90OworCitzdHJ1Y3QgeW1mX3ZvaWNlIHsKKwkvLyB5bWZwY2lfdCAqY29kZWM7CisJaW50IG51bWJlcjsKKwljaGFyIHVzZSwgcGNtLCBzeW50aCwgbWlkaTsJLy8gYm9vbAorCXltZnBjaV9wbGF5YmFja19iYW5rX3QgKmJhbms7CisJc3RydWN0IHltZl9wY20gKnlwY207CisJZG1hX2FkZHJfdCBiYW5rX2JhOworfTsKKworc3RydWN0IHltZl9jYXB0dXJlIHsKKwkvLyBzdHJ1Y3QgeW1mX3VuaXQgKnVuaXQ7CisJaW50IHVzZTsKKwl5bWZwY2lfY2FwdHVyZV9iYW5rX3QgKmJhbms7CisJc3RydWN0IHltZl9wY20gKnlwY207Cit9OworCitzdHJ1Y3QgeW1mX3VuaXQgeworCXU4IHJldjsJCQkJLyogUENJIHJldmlzaW9uICovCisJdm9pZCBfX2lvbWVtICpyZWdfYXJlYV92aXJ0OworCXZvaWQgKmRtYV9hcmVhX3ZhOworCWRtYV9hZGRyX3QgZG1hX2FyZWFfYmE7CisJdW5zaWduZWQgaW50IGRtYV9hcmVhX3NpemU7CisKKwlkbWFfYWRkcl90IGJhbmtfYmFzZV9jYXB0dXJlOworCWRtYV9hZGRyX3QgYmFua19iYXNlX2VmZmVjdDsKKwlkbWFfYWRkcl90IHdvcmtfYmFzZTsKKwl1bnNpZ25lZCBpbnQgd29ya19zaXplOworCisJdTMyICpjdHJsX3BsYXliYWNrOworCWRtYV9hZGRyX3QgY3RybF9wbGF5YmFja19iYTsKKwl5bWZwY2lfcGxheWJhY2tfYmFua190ICpiYW5rX3BsYXliYWNrW1lEU1hHX1BMQVlCQUNLX1ZPSUNFU11bMl07CisJeW1mcGNpX2NhcHR1cmVfYmFua190ICpiYW5rX2NhcHR1cmVbWURTWEdfQ0FQVFVSRV9WT0lDRVNdWzJdOworCXltZnBjaV9lZmZlY3RfYmFua190ICpiYW5rX2VmZmVjdFtZRFNYR19FRkZFQ1RfVk9JQ0VTXVsyXTsKKworCWludCBzdGFydF9jb3VudDsKKwlpbnQgc3VzcGVuZGVkOworCisJdTMyIGFjdGl2ZV9iYW5rOworCXN0cnVjdCB5bWZfdm9pY2Ugdm9pY2VzW1lEU1hHX1BMQVlCQUNLX1ZPSUNFU107CisJc3RydWN0IHltZl9jYXB0dXJlIGNhcHR1cmVbWURTWEdfQ0FQVFVSRV9WT0lDRVNdOworCisJc3RydWN0IGFjOTdfY29kZWMgKmFjOTdfY29kZWNbTlJfQUM5N107CisJdTE2IGFjOTdfZmVhdHVyZXM7CisKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpOworCisjaWZkZWYgQ09ORklHX1NPVU5EX1lNRlBDSV9MRUdBQ1kKKwkvKiBsZWdhY3kgaGFyZHdhcmUgcmVzb3VyY2VzICovCisJdW5zaWduZWQgaW50IGlvc3ludGgsIGlvbWlkaTsKKwlzdHJ1Y3QgYWRkcmVzc19pbmZvIG9wbDNfZGF0YSwgbXB1X2RhdGE7CisjZW5kaWYKKworCXNwaW5sb2NrX3QgcmVnX2xvY2s7CisJc3BpbmxvY2tfdCB2b2ljZV9sb2NrOworCXNwaW5sb2NrX3QgYWM5N19sb2NrOworCisJLyogc291bmRjb3JlIHN0dWZmICovCisJaW50IGRldl9hdWRpbzsKKwlzdHJ1Y3Qgc2VtYXBob3JlIG9wZW5fc2VtOworCisJc3RydWN0IGxpc3RfaGVhZCB5bWZfZGV2czsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0YXRlczsJLyogTGlzdCBvZiBzdGF0ZXMgZm9yIHRoaXMgdW5pdCAqLworfTsKKworc3RydWN0IHltZl9kbWFidWYgeworCWRtYV9hZGRyX3QgZG1hX2FkZHI7CisJdm9pZCAqcmF3YnVmOworCXVuc2lnbmVkIGJ1Zm9yZGVyOworCisJLyogT1NTIGJ1ZmZlciBtYW5hZ2VtZW50IHN0dWZmICovCisJdW5zaWduZWQgbnVtZnJhZzsKKwl1bnNpZ25lZCBmcmFnc2hpZnQ7CisKKwkvKiBvdXIgYnVmZmVyIGFjdHMgbGlrZSBhIGNpcmN1bGFyIHJpbmcgKi8KKwl1bnNpZ25lZCBod3B0cjsJCS8qIHdoZXJlIGRtYSBsYXN0IHN0YXJ0ZWQgKi8KKwl1bnNpZ25lZCBzd3B0cjsJCS8qIHdoZXJlIGRyaXZlciBsYXN0IGNsZWFyL2ZpbGxlZCAqLworCWludCBjb3VudDsJCS8qIGZpbGwgY291bnQgKi8KKwl1bnNpZ25lZCB0b3RhbF9ieXRlczsJLyogdG90YWwgYnl0ZXMgZG1hZWQgYnkgaGFyZHdhcmUgKi8KKworCXdhaXRfcXVldWVfaGVhZF90IHdhaXQ7CS8qIHB1dCBwcm9jZXNzIG9uIHdhaXQgcXVldWUgd2hlbiBubyBtb3JlIHNwYWNlIGluIGJ1ZmZlciAqLworCisJLyogcmVkdW5kYW50LCBidXQgbWFrZXMgY2FsY3VsYXRpb25zIGVhc2llciAqLworCXVuc2lnbmVkIGZyYWdzaXplOworCXVuc2lnbmVkIGRtYXNpemU7CS8qIFRvdGFsIHJhd2J1ZltdIHNpemUgKi8KKworCS8qIE9TUyBzdHVmZiAqLworCXVuc2lnbmVkIG1hcHBlZDoxOworCXVuc2lnbmVkIHJlYWR5OjE7CisJdW5zaWduZWQgb3NzZnJhZ3NoaWZ0OworCWludCBvc3NtYXhmcmFnczsKKwl1bnNpZ25lZCBzdWJkaXZpc2lvbjsKK307CisKK3N0cnVjdCB5bWZfcGNtX2Zvcm1hdCB7CisJaW50IGZvcm1hdDsJCQkvKiBPU1MgZm9ybWF0ICovCisJaW50IHJhdGU7CQkJLyogcmF0ZSBpbiBIeiAqLworCWludCB2b2ljZXM7CQkJLyogbnVtYmVyIG9mIHZvaWNlcyAqLworCWludCBzaGlmdDsJCQkvKiByZWR1bmRhbnQsIGNvbXB1dGVkIGZyb20gdGhlIGFib3ZlICovCit9OworCit0eXBlZGVmIGVudW0geworCVBMQVlCQUNLX1ZPSUNFLAorCUNBUFRVUkVfUkVDLAorCUNBUFRVUkVfQUM5NywKKwlFRkZFQ1RfRFJZX0xFRlQsCisJRUZGRUNUX0RSWV9SSUdIVCwKKwlFRkZFQ1RfRUZGMSwKKwlFRkZFQ1RfRUZGMiwKKwlFRkZFQ1RfRUZGMworfSB5bWZwY2lfcGNtX3R5cGVfdDsKKworLyogVGhpcyBpcyB2YXJpYW50IHJlY29yZCwgYnV0IHdlIGhhdGUgdW5pb25zLiBMaXR0bGUgd2FzdGUgb24gcG9pbnRlcnMgW10uICovCitzdHJ1Y3QgeW1mX3BjbSB7CisJeW1mcGNpX3BjbV90eXBlX3QgdHlwZTsKKwlzdHJ1Y3QgeW1mX3N0YXRlICpzdGF0ZTsKKworCXltZnBjaV92b2ljZV90ICp2b2ljZXNbMl07CisJaW50IGNhcHR1cmVfYmFua19udW1iZXI7CisKKwlzdHJ1Y3QgeW1mX2RtYWJ1ZiBkbWFidWY7CisJaW50IHJ1bm5pbmc7CisJaW50IHNwZGlmOworfTsKKworLyoKKyAqICJTb2Z0d2FyZSIgb3IgdmlydHVhbCBjaGFubmVsLCBhbiBpbnN0YW5jZSBvZiBvcGVuZWQgL2Rldi9kc3AuCisgKiBJdCBtYXkgaGF2ZSB0d28gcGh5c2ljYWwgY2hhbm5lbHMgKHBjbXMpIGZvciBkdXBsZXggb3BlcmF0aW9ucy4KKyAqLworCitzdHJ1Y3QgeW1mX3N0YXRlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoYWluOworCXN0cnVjdCB5bWZfdW5pdCAqdW5pdDsJCQkvKiBiYWNrcG9pbnRlciAqLworCXN0cnVjdCB5bWZfcGNtIHJwY20sIHdwY207CisJc3RydWN0IHltZl9wY21fZm9ybWF0IGZvcm1hdDsKK307CisKKyNlbmRpZgkJCQkvKiBfX1lNRlBDSV9IICovCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MveW1mcGNpX2ltYWdlLmggYi9zb3VuZC9vc3MveW1mcGNpX2ltYWdlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyZjJmZgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy95bWZwY2lfaW1hZ2UuaApAQCAtMCwwICsxLDE1NjUgQEAKKyNpZm5kZWYgX0hXTUNPREVfCisjZGVmaW5lIF9IV01DT0RFXworCitzdGF0aWMgdTMyIERzcEluc3RbWURTWEdfRFNQTEVOR1RIIC8gNF0gPSB7CisJMHgwMDAwMDA4MSwgMHgwMDAwMDFhNCwgMHgwMDAwMDAwYSwgMHgwMDAwMDAyZiwKKwkweDAwMDgwMjUzLCAweDAxODAwMzE3LCAweDAwMDA0MDdiLCAweDAwMDA4NDNmLAorCTB4MDAwMTQ4M2MsIDB4MDAwMTk0M2MsIDB4MDAwNWQ4M2MsIDB4MDAwMDFjM2MsCisJMHgwMDAwYzA3YiwgMHgwMDA1MGMzZiwgMHgwMTIxNTAzYywgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLAorCTB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDAsCisJMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCwKKwkweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwLCAweDAwMDAwMDAwCit9OworCitzdGF0aWMgdTMyIENudHJsSW5zdFtZRFNYR19DVFJMTEVOR1RIIC8gNF0gPSB7CisJMHgwMDAwMDcsIDB4MjQwMDA3LCAweDBDMDAwNywgMHgxQzAwMDcsCisJMHgwNjAwMDcsIDB4NzAwMDAyLCAweDAwMDAyMCwgMHgwMzAwNDAsCisJMHgwMDcxMDQsIDB4MDA0Mjg2LCAweDAzMDA0MCwgMHgwMDBGMEQsCisJMHgwMDA4MTAsIDB4MjAwNDNBLCAweDAwMDI4MiwgMHgwMDAyMEQsCisJMHgwMDA4MTAsIDB4MjAwNDNBLCAweDAwMTI4MiwgMHgyMDBFODIsCisJMHgwMDFBODIsIDB4MDMyRDBELCAweDAwMDgxMCwgMHgxMDA0M0EsCisJMHgwMkQzOEQsIDB4MDAwODEwLCAweDE4MDQzQSwgMHgwMDAxMEQsCisJMHgwMjAwMTUsIDB4MDAwMEZELCAweDAwMDAyMCwgMHgwMzg4NjAsCisJMHgwMzkwNjAsIDB4MDM4MDYwLCAweDAzODA0MCwgMHgwMzgwNDAsCisJMHgwMzgwNDAsIDB4MDE4MDQwLCAweDAwMEE3RCwgMHgwMzgwNDAsCisJMHgwMzgwNDAsIDB4MDE4MDQwLCAweDIwMDQwMiwgMHgwMDA4ODIsCisJMHgwODAwMUEsIDB4MDAwOTA0LCAweDAxNTk4NiwgMHgwMDAwMDcsCisJMHgyNjAwMDcsIDB4MDAwMDA3LCAweDAwMDAwNywgMHgwMThBMDYsCisJMHgwMDAwMDcsIDB4MDMwQzhELCAweDAwMDgxMCwgMHgxODA0M0EsCisJMHgyNjAwMDcsIDB4MDAwODdELCAweDAxODA0MiwgMHgwMDE2MEEsCisJMHgwNEEyMDYsIDB4MDAwMDA3LCAweDAwMjE4RCwgMHgwMDA4MTAsCisJMHgwODA0M0EsIDB4MjFDMjA2LCAweDAwMDAwNywgMHgwMDA3RkQsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgwMjkzODYsCisJMHgwMDAxOTUsIDB4MDkwRDA0LCAweDAwMDAwNywgMHgwMDA4MjAsCisJMHgwMDAwRjUsIDB4MDAwQjdELCAweDAxRjA2MCwgMHgwMDAwRkQsCisJMHgwMzIyMDYsIDB4MDE4MDQwLCAweDAwMEE3RCwgMHgwMzgwNDIsCisJMHgxMzgwNEEsIDB4MTgwMDBBLCAweDAwMTgyMCwgMHgwNTkwNjAsCisJMHgwNTg4NjAsIDB4MDE4MDQwLCAweDAwMDBGRCwgMHgwMTgwNDIsCisJMHg3MDAwMEEsIDB4MDAwMTE1LCAweDA3MTE0NCwgMHgwMzIzODYsCisJMHgwMzAwMDAsIDB4MDA3MDIwLCAweDAzNEEwNiwgMHgwMTgwNDAsCisJMHgwMDM0OEQsIDB4MDAwODEwLCAweDA4MDQzQSwgMHgyMUVBMDYsCisJMHgwMDAwMDcsIDB4MDJEMzhELCAweDAwMDgxMCwgMHgxODA0M0EsCisJMHgwMTgyMDYsIDB4MDAwMDA3LCAweDI0MDAwNywgMHgwMDBGOEQsCisJMHgwMDA4MTAsIDB4MDAxNjNBLCAweDAwMjQwMiwgMHgwMDVDMDIsCisJMHgwMDI4RkQsIDB4MDAwMDIwLCAweDAxODA0MCwgMHgwODAwMEQsCisJMHgwMDA4MTUsIDB4NTEwOTg0LCAweDAwMDAwNywgMHgwMDAwNEQsCisJMHgwMDBFNUQsIDB4MDAwRTAyLCAweDAwNDE4RCwgMHgwMDA4MTAsCisJMHgwODA0M0EsIDB4MkM4QTA2LCAweDAwMDAwNywgMHgwMDAwOEQsCisJMHgwMDA5MjQsIDB4MDAwRjAyLCAweDAwNDU4RCwgMHgwMDA4MTAsCisJMHgwODA0M0EsIDB4MkM4QTA2LCAweDAwMDAwNywgMHgwMDM4N0QsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMTAxNSwgMHgwMTA5ODQsCisJMHgwMTgzODYsIDB4MDAwMDA3LCAweDAxQUEwNiwgMHgwMDAwMDcsCisJMHgwMDA4RkQsIDB4MDE4MDQyLCAweDE4MDAwQSwgMHgwMDE5MDQsCisJMHgyMTgwODYsIDB4MjgwMDA3LCAweDAwMTgxMCwgMHgyODA0M0EsCisJMHgyODBDMDIsIDB4MDAwMDBELCAweDAwMDgxMCwgMHgyODE0M0EsCisJMHgwODgwOEQsIDB4MDAwODIwLCAweDAwMDJGRCwgMHgwMTgwNDAsCisJMHgyMDAwMDcsIDB4MDAwMjBELCAweDE4OTkwNCwgMHgwMDAwMDcsCisJMHgwMDQwMkQsIDB4MDAwMEJELCAweDAwMDJGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDA1NUE4NiwgMHgwMDAwMDcsCisJMHgwMDAxMDAsIDB4MDAwQTIwLCAweDAwMDQ3RCwgMHgwMTgwNDAsCisJMHgwMTgwNDIsIDB4MjAwMDBBLCAweDAwMzAxNSwgMHgwMTIxNDQsCisJMHgwMzQ5ODYsIDB4MDAwMDA3LCAweDAwMjEwNCwgMHgwMzQ5ODYsCisJMHgwMDAwMDcsIDB4MDAwRjhELCAweDAwMDgxMCwgMHgyODBDM0EsCisJMHgwMjM5NDQsIDB4MDZDOTg2LCAweDAwMDAwNywgMHgwMDE4MTAsCisJMHgyODA0M0EsIDB4MDg4MTBELCAweDAwMDgyMCwgMHgwMDAyRkQsCisJMHgwMTgwNDAsIDB4MjAwMDA3LCAweDAwMjgxMCwgMHg3ODAwM0EsCisJMHgwMDY4OEQsIDB4MDAwODEwLCAweDA4MDQzQSwgMHgyODhBMDYsCisJMHgwMDAwMDcsIDB4MDA0MDBELCAweDAwMTAxNSwgMHgxODk5MDQsCisJMHgyOTI5MDQsIDB4MzkzOTA0LCAweDAwMDAwNywgMHgwNjAyMDYsCisJMHgwMDAwMDcsIDB4MDAwNEY1LCAweDAwMDA3RCwgMHgwMDAwMjAsCisJMHgwMDAwOEQsIDB4MDEwODYwLCAweDAxODA0MCwgMHgwMDA0N0QsCisJMHgwMzgwNDIsIDB4MjE4MDRBLCAweDE4MDAwQSwgMHgwMjE5NDQsCisJMHgyMTU4ODYsIDB4MDAwMDA3LCAweDAwNDA3NSwgMHg3MUYxMDQsCisJMHgwMDAwMDcsIDB4MDEwMDQyLCAweDI4MDAwQSwgMHgwMDI5MDQsCisJMHgyMTIwODYsIDB4MDAwMDA3LCAweDAwM0MwRCwgMHgzMEE5MDQsCisJMHgwMDAwMDcsIDB4MDAwNzdELCAweDAxODA0MiwgMHgwODAwMEEsCisJMHgwMDA5MDQsIDB4MDdEQTg2LCAweDAwMDU3RCwgMHgwMDI4MjAsCisJMHgwM0IwNjAsIDB4MDdGMjA2LCAweDAxODA0MCwgMHgwMDMwMjAsCisJMHgwM0E4NjAsIDB4MDE4MDQwLCAweDAwMDJGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDA3RkE4NiwgMHgwMDAwMDcsCisJMHgwMDA1N0QsIDB4MDE4MDQyLCAweDI4MDQwQSwgMHgwMDBFOEQsCisJMHgwMDA4MTAsIDB4MjgwQzNBLCAweDAwMDAwRCwgMHgwMDA4MTAsCisJMHgyODE0M0EsIDB4MDkwMDBELCAweDAwMDgyMCwgMHgwMDAyRkQsCisJMHgwMTgwNDAsIDB4MjAwMDA3LCAweDAwM0RGRCwgMHgwMDAwMjAsCisJMHgwMTgwNDAsIDB4MDAxMDdELCAweDAwOEQ4RCwgMHgwMDA4MTAsCisJMHgwODA0M0EsIDB4Mjg4QTA2LCAweDAwMDAwNywgMHgwMDA4MTUsCisJMHgwODAwMUEsIDB4MDEwOTg0LCAweDA5NTE4NiwgMHgwMDEzN0QsCisJMHgyMDA1MDAsIDB4MjgwRjIwLCAweDMzOEY2MCwgMHgzQjhGNjAsCisJMHg0MzhGNjAsIDB4NEI4RjYwLCAweDUzOEY2MCwgMHg1QjhGNjAsCisJMHgwMzhBNjAsIDB4MDE4MDQwLCAweDAwN0ZCRCwgMHgzODNEQzQsCisJMHgwMDAwMDcsIDB4MDAxQTdELCAweDAwMTM3NSwgMHgwMTgwNDIsCisJMHgwOTAwNEEsIDB4MTAwMDBBLCAweDBCOEQwNCwgMHgxMzk1MDQsCisJMHgwMDAwMDcsIDB4MDAwODIwLCAweDAxOTA2MCwgMHgwMDExMDQsCisJMHgyMTIwODYsIDB4MDEwMDQwLCAweDAwMTdGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDIxMjI4NiwgMHgwMDAwMDcsCisJMHgwMDE5N0QsIDB4MDM4MDQyLCAweDA5ODA0QSwgMHgxMDAwMEEsCisJMHgwMDA5MjQsIDB4MDAxNjY0LCAweDAwMTFGRCwgMHgwMzgwNDIsCisJMHgyQjgwNEEsIDB4MTk4MDRBLCAweDAwMDA4RCwgMHgyMTg5NDQsCisJMHgwMDAwMDcsIDB4MDAyMjQ0LCAweDBBRTE4NiwgMHgwMDAwMDcsCisJMHgwMDFBNjQsIDB4MDAyQTI0LCAweDAwMTk3RCwgMHgwODAxMDIsCisJMHgxMDAxMjIsIDB4MDAwODIwLCAweDAzOTA2MCwgMHgwMTgwNDAsCisJMHgwMDNERkQsIDB4MDAwMDhELCAweDAwMDgyMCwgMHgwMTgwNDAsCisJMHgwMDEzNzUsIDB4MDAxQTdELCAweDAxMDA0MiwgMHgwOTgwNEEsCisJMHgxMDAwMEEsIDB4MDAwMjFELCAweDAxODlFNCwgMHgyOTkyRTQsCisJMHgzMDkxNDQsIDB4MDAwMDA3LCAweDAwMDYwRCwgMHgwMDBBMTUsCisJMHgwMDBDMUQsIDB4MDAxMDI1LCAweDAwQTlFNCwgMHgwMTJCRTQsCisJMHgwMDA0NjQsIDB4MDFCM0U0LCAweDAyMzJFNCwgMHgwMDA0NjQsCisJMHgwMDA0NjQsIDB4MDAwNDY0LCAweDAwMDQ2NCwgMHgwMDA0MEQsCisJMHgwOEIxQzQsIDB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMDBCRjUsCisJMHgwMzAwNDAsIDB4MDAxOTdELCAweDAzODA0MiwgMHgwOTgwNEEsCisJMHgwMDBBMjQsIDB4MDgwMDBBLCAweDA4MEU2NCwgMHgwMDAwMDcsCisJMHgxMDAxMjIsIDB4MDAwODIwLCAweDAzMTA2MCwgMHgwMTAwNDAsCisJMHgwMDY0QUMsIDB4MDAwMjdELCAweDAwMDAyMCwgMHgwMTgwNDAsCisJMHgwMDEwN0QsIDB4MDE4MDQyLCAweDAwMTFGRCwgMHgzQjgwNEEsCisJMHgwOTgwNEEsIDB4MjAwMDBBLCAweDAwMDA5NSwgMHgxQTExNDQsCisJMHgwMEExNDQsIDB4MEQyMDg2LCAweDAwMDQwRCwgMHgwMEI5ODQsCisJMHgwRDIxODYsIDB4MDAxOEZELCAweDAxODA0MiwgMHgwMDEwRkQsCisJMHgwOTgwNEEsIDB4MjgwMDBBLCAweDAwMDA5NSwgMHgwMTA5MjQsCisJMHgwMDJBNjQsIDB4MEQxMTg2LCAweDAwMDAwNywgMHgwMDI5MDQsCisJMHgwRDIyODYsIDB4MDAwMDA3LCAweDBEMkEwNiwgMHgwODAwMDIsCisJMHgwMDAwOEQsIDB4MDAzODdELCAweDAwMDgyMCwgMHgwMTgwNDAsCisJMHgwMDEyN0QsIDB4MDE4MDQyLCAweDEwMDAwQSwgMHgwMDM5MDQsCisJMHgwREQxODYsIDB4MDAwODBELCAweDdGRkZCNSwgMHgwMEI5ODQsCisJMHgwREExODYsIDB4MDAwMDI1LCAweDBFN0EwNiwgMHgwMDAwMkQsCisJMHgwMDAwMTUsIDB4MDAwODJELCAweDAyQzc4RCwgMHgwMDA4MjAsCisJMHgwRUMyMDYsIDB4MDAwMDBELCAweDdGODAzNSwgMHgwMEI5ODQsCisJMHgwRTcxODYsIDB4NDAwMDI1LCAweDAwMDA4RCwgMHgxMTA5NDQsCisJMHgwMDAwMDcsIDB4MDAwMThELCAweDEwOTUwNCwgMHgwMDAwMDcsCisJMHgwMDkxNjQsIDB4MDAwNDI0LCAweDAwMDQyNCwgMHgwMDA0MjQsCisJMHgxMDAxMDIsIDB4MjgwMDAyLCAweDAyQzY4RCwgMHgwMDA4MjAsCisJMHgwRUMyMDYsIDB4MDAwMThELCAweDAwMDQyRCwgMHgwMDAwOEQsCisJMHgxMDk1MDQsIDB4MDAwMDA3LCAweDAwMDIwRCwgMHgxMDkxODQsCisJMHgwMDAwMDcsIDB4MDJDNzBELCAweDAwMDgyMCwgMHgwMDAwOEQsCisJMHgwMDM4RkQsIDB4MDE4MDQwLCAweDAwM0JGRCwgMHgwMDEwMjAsCisJMHgwM0E4NjAsIDB4MDAwODE1LCAweDMxMzE4NCwgMHgyMTIxODQsCisJMHgwMDAwMDcsIDB4MDNCMDYwLCAweDAzQTA2MCwgMHgwMTgwNDAsCisJMHgwMDIyRkQsIDB4MDAwMDk1LCAweDAxMDkyNCwgMHgwMDA0MjQsCisJMHgwMDA0MjQsIDB4MDAxMjY0LCAweDEwMDEwMiwgMHgwMDA4MjAsCisJMHgwMzkwNjAsIDB4MDE4MDQwLCAweDAwMTkyNCwgMHgwMEZCOEQsCisJMHgwMDM5N0QsIDB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsCisJMHgwOTg0NEEsIDB4MDAwNjA2LCAweDA4MDQwQSwgMHgwMDA0MjQsCisJMHgwMDA0MjQsIDB4MDAxMTdELCAweDAxODA0MiwgMHgwODAwMEEsCisJMHgwMDBBMjQsIDB4MjgwNTAyLCAweDI4MEMwMiwgMHgwOTgwMEQsCisJMHgwMDA4MjAsIDB4MDAwMkZELCAweDAxODA0MCwgMHgyMDAwMDcsCisJMHgwMDIyRkQsIDB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDAwOTUsCisJMHgyODBEQzQsIDB4MDExOTI0LCAweDAwMTk3RCwgMHgwMTgwNDIsCisJMHgwMDExRkQsIDB4MDk4MDRBLCAweDEwMDAwQSwgMHgwMDAwQjUsCisJMHgxMTMxNDQsIDB4MEE4RDA0LCAweDAwMDAwNywgMHgwODBBNDQsCisJMHgxMjk1MDQsIDB4MDAwMDA3LCAweDAwMjNGRCwgMHgwMDEwMjAsCisJMHgwMzgwNDAsIDB4MTAxMjQ0LCAweDAwMDAwNywgMHgwMDA4MjAsCisJMHgwMzkwNjAsIDB4MDE4MDQwLCAweDAwMDJGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDEwRkE4NiwgMHgwMDAwMDcsCisJMHgwMDNCRkQsIDB4MDAwMTAwLCAweDAwMEExMCwgMHgwQjgwN0EsCisJMHgxMzgwNEEsIDB4MDkwOTg0LCAweDAwMDAwNywgMHgwMDAwOTUsCisJMHgwMTNEMDQsIDB4MTE4MDg2LCAweDEwMDAwQSwgMHgxMDAwMDIsCisJMHgwOTA5ODQsIDB4MDAwMDA3LCAweDAzODA0MiwgMHgxMTgwNEEsCisJMHgwOTBEMDQsIDB4MDAwMDA3LCAweDEwMDAwQSwgMHgwOTBEODQsCisJMHgwMDAwMDcsIDB4MDAyNTdELCAweDAwMDgyMCwgMHgwMTgwNDAsCisJMHgwMDAxMEQsIDB4MDAwODEwLCAweDI4MTQzQSwgMHgwMDEyN0QsCisJMHgwMTgwNDIsIDB4MjAwMDBBLCAweDAwMTk3RCwgMHgwMTgwNDIsCisJMHgwMDExN0QsIDB4MzE4MDRBLCAweDEwMDAwQSwgMHgwMDMxMjQsCisJMHgwMTI4MEQsIDB4MDAzOTdELCAweDAwMDgyMCwgMHgwNTgwNDAsCisJMHgwMzgwNDIsIDB4MDk4NDRBLCAweDAwMDYwNiwgMHgwODA0MEEsCisJMHgzMDAxMDIsIDB4MDAzMTI0LCAweDAwMDQyNCwgMHgwMDA0MjQsCisJMHgwMDEyMjQsIDB4MjgwNTAyLCAweDAwMUE0QywgMHgxMzAxODYsCisJMHg3MDAwMDIsIDB4MDAwMDJELCAweDAzMDAwMCwgMHgwMDM4N0QsCisJMHgwMTgwNDIsIDB4MTAwMDBBLCAweDEzMkEwNiwgMHgwMDIxMjQsCisJMHgwMDAwQUQsIDB4MTAwMDAyLCAweDAwMDEwRCwgMHgwMDA5MjQsCisJMHgwMDZCMjQsIDB4MDEzNjhELCAweDAwMzk3RCwgMHgwMDA4MjAsCisJMHgwNTgwNDAsIDB4MDM4MDQyLCAweDA5ODQ0QSwgMHgwMDA2MDYsCisJMHgwODA0MEEsIDB4MDAzMjY0LCAweDAwMDA4RCwgMHgwMDBBMjQsCisJMHgwMDEwMjAsIDB4MDAyMjdELCAweDAxODA0MCwgMHgwMTNDMEQsCisJMHgwMDA4MTAsIDB4MDgwNDNBLCAweDI5RDIwNiwgMHgwMDAwMDcsCisJMHgwMDI4MjAsIDB4MDAyMDdELCAweDAxODA0MCwgMHgwMDExN0QsCisJMHgwMzgwNDIsIDB4MTM4MDRBLCAweDMzODAwQSwgMHgwMDM4N0QsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgxNjNBODYsCisJMHgwMDAwMDcsIDB4MDAwMDhELCAweDAzMDk2NCwgMHgwMTQ3OEQsCisJMHgwMDM5N0QsIDB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsCisJMHgwOTg0NEEsIDB4MDAwNjA2LCAweDA4MDQwQSwgMHgzODAxMDIsCisJMHgwMDA0MjQsIDB4MDAwNDI0LCAweDAwMTIyNCwgMHgwMDAyRkQsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgxNEEyODYsCisJMHgwMDAwMDcsIDB4MjgwNTAyLCAweDAwMUE0QywgMHgxNjM5ODYsCisJMHgwMDAwMDcsIDB4MDMyMTY0LCAweDAwNjMyQywgMHgwMDNERkQsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDA5NSwgMHgwOTA5MDQsCisJMHgwMDAwMDcsIDB4MDAwODIwLCAweDAwMUE0QywgMHgxNTYxODYsCisJMHgwMTgwNDAsIDB4MDMwMDAwLCAweDE1N0EwNiwgMHgwMDIxMjQsCisJMHgwMDAxMEQsIDB4MDAwOTI0LCAweDAwNkIyNCwgMHgwMTVCOEQsCisJMHgwMDM5N0QsIDB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsCisJMHgwOTg0NEEsIDB4MDAwNjA2LCAweDA4MDQwQSwgMHgwMDNBNjQsCisJMHgwMDAwOTUsIDB4MDAxMjI0LCAweDAwMDJGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDE1REE4NiwgMHgwMDAwMDcsCisJMHgwMTYyOEQsIDB4MDAwODEwLCAweDA4MDQzQSwgMHgyOUQyMDYsCisJMHgwMDAwMDcsIDB4MTREMjA2LCAweDAwMDAwNywgMHgwMDcwMjAsCisJMHgwODAxMEEsIDB4MTAwMTJBLCAweDAwMjBGRCwgMHgwMzg4NjAsCisJMHgwMzkwNjAsIDB4MDE4MDQwLCAweDAwMjI3RCwgMHgwMTgwNDIsCisJMHgwMDNERkQsIDB4MDgwMDBBLCAweDMxODQ0QSwgMHgwMDA5MDQsCisJMHgxNkQ4ODYsIDB4MTgwMDhCLCAweDAwMDA4RCwgMHgxODk5MDQsCisJMHgwMDMxMkMsIDB4MTdBQTA2LCAweDAwMDAwNywgMHgwMDMyNEMsCisJMHgxNzMzODYsIDB4MDAwMDA3LCAweDAwMTkwNCwgMHgxNzMwODYsCisJMHgwMDAwMDcsIDB4MDAwMDk1LCAweDE5OTE0NCwgMHgwMDIyMkMsCisJMHgwMDMxMjQsIDB4MDA2MzZDLCAweDAwMEUzRCwgMHgwMDEzNzUsCisJMHgwMDBCRkQsIDB4MDEwMDQyLCAweDA5ODA0QSwgMHgxMDAwMEEsCisJMHgwMzhBRUMsIDB4MDM5M0VDLCAweDAwMjI0QywgMHgxN0E5ODYsCisJMHgwMDAwMDcsIDB4MDAwMDhELCAweDE4OTkwNCwgMHgwMDIyNkMsCisJMHgwMDMyMkMsIDB4MzAwNTBBLCAweDMwMURBQiwgMHgwMDIwODMsCisJMHgwMDE4RkQsIDB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMTg5MjQsCisJMHgzMDA1MDIsIDB4MDAxMDgzLCAweDAwMTg3NSwgMHgwMTAwNDIsCisJMHgxMDAwMEEsIDB4MDAwMDhELCAweDAxMDkyNCwgMHgwMDEzNzUsCisJMHgzMzA1NDIsIDB4MzMwQ0NCLCAweDMzMkNDQiwgMHgzMzM0Q0IsCisJMHgzMzNDQ0IsIDB4MzM0NENCLCAweDMzNENDQiwgMHgzMzU0Q0IsCisJMHgzMDVDOEIsIDB4MDA2MDgzLCAweDAwMDJGNSwgMHgwMTAwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDE4N0E4NiwgMHgwMDAwMDcsCisJMHgwMDFFMkQsIDB4MDAwNUZELCAweDAxODA0MiwgMHgwODAwMEEsCisJMHgwMjg5MjQsIDB4MjgwNTAyLCAweDAwMDYwRCwgMHgwMDA4MTAsCisJMHgyODBDM0EsIDB4MDAwMDhELCAweDAwMDgxMCwgMHgyODE0M0EsCisJMHgwQTgwOEQsIDB4MDAwODIwLCAweDAwMDJGNSwgMHgwMTAwNDAsCisJMHgyMjAwMDcsIDB4MDAxMjc1LCAweDAzMDA0MiwgMHgyMTAwNEEsCisJMHgwMDAwOEQsIDB4MUEwOTQ0LCAweDAwMDAwNywgMHgwMTk4MEQsCisJMHgwMDA4MTAsIDB4MDgwNDNBLCAweDJCMjIwNiwgMHgwMDAwMDcsCisJMHgwMDAxRjUsIDB4MDMwMDQyLCAweDBEMDA0QSwgMHgxMDAwMEEsCisJMHgwODkxNDQsIDB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTAwNDAsCisJMHgwMDI1RjUsIDB4MEEzMTQ0LCAweDAwMDAwNywgMHgwMDA4MjAsCisJMHgwMzI4NjAsIDB4MDMwMDQwLCAweDAwMjE3RCwgMHgwMzgwNDIsCisJMHgwQjgwNEEsIDB4MTAwMDBBLCAweDAwMDgyMCwgMHgwMzEwNjAsCisJMHgwMzAwNDAsIDB4MDAwMDhELCAweDAwMDEyNCwgMHgwMDAxMkMsCisJMHgwMDBFNjQsIDB4MDAxQTY0LCAweDAwNjM2QywgMHgwODAxMEEsCisJMHgxMDAxMkEsIDB4MDAwODIwLCAweDAzMTA2MCwgMHgwMzAwNDAsCisJMHgwMDIwRkQsIDB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDIyN0QsCisJMHgwMTgwNDIsIDB4MTAwMDBBLCAweDAwMDgyMCwgMHgwMzEwNjAsCisJMHgwMzAwNDAsIDB4MDAxOTdELCAweDAxODA0MiwgMHgwODAwMEEsCisJMHgwMDIyRkQsIDB4MDM4MDQyLCAweDEwMDAwQSwgMHgwMDA4MjAsCisJMHgwMzEwNjAsIDB4MDMwMDQwLCAweDA5MEQwNCwgMHgwMDAwMDcsCisJMHgwMDA4MjAsIDB4MDMwMDQwLCAweDAzODA0MiwgMHgwQjgwNEEsCisJMHgxMDAwMEEsIDB4MDAwODIwLCAweDAzMTA2MCwgMHgwMzAwNDAsCisJMHgwMzgwNDIsIDB4MTM4MDRBLCAweDE5ODA0QSwgMHgxMTBEMDQsCisJMHgxOThEMDQsIDB4MDAwMDA3LCAweDA4MDAwQSwgMHgwMDEwMjAsCisJMHgwMzE4NjAsIDB4MDMwODYwLCAweDAzMDA0MCwgMHgwMDAwOEQsCisJMHgwQjA5NDQsIDB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTAwNDAsCisJMHgwMDA1RjUsIDB4MDMwMDQyLCAweDA4MDAwQSwgMHgwMDA4MjAsCisJMHgwMTAwNDAsIDB4MDAwMEY1LCAweDAxMDA0MiwgMHgwODAwMEEsCisJMHgwMDA5MDQsIDB4MUM2MDg2LCAweDAwMUU3NSwgMHgwMzAwNDIsCisJMHgwMTA0NEEsIDB4MDAwQzBBLCAweDFDNzIwNiwgMHgwMDAwMDcsCisJMHgwMDA0MDIsIDB4MDAwQzAyLCAweDAwMTc3RCwgMHgwMDFBRjUsCisJMHgwMTgwNDIsIDB4MDMxNDRBLCAweDAzMUM0QSwgMHgwMzI0NEEsCisJMHgwMzJDNEEsIDB4MDMzNDRBLCAweDAzM0M0QSwgMHgwMzQ0NEEsCisJMHgwMDRDMEEsIDB4MDAwNDNELCAweDAwMTNGNSwgMHgwMDFBRkQsCisJMHgwMzAwNDIsIDB4MEIwMDRBLCAweDFCODA0QSwgMHgxMzgwNEEsCisJMHgyMDAwMEEsIDB4MDg5MTQ0LCAweDE5QTE0NCwgMHgwMzg5RTQsCisJMHgwMzk5RUMsIDB4MDA1NTAyLCAweDAwNUQwQSwgMHgwMzAwNDIsCisJMHgwQjAwNEEsIDB4MUI4MDRBLCAweDEzODA0QSwgMHgyMDAwMEEsCisJMHgwODkxNDQsIDB4MTlBMTQ0LCAweDAzODlFNCwgMHgwMzk5RUMsCisJMHgwMDY1MDIsIDB4MDA2RDBBLCAweDAzMDA0MiwgMHgwQjAwNEEsCisJMHgxOTAwNEEsIDB4MkI4MDRBLCAweDEzODA0QSwgMHgyMTgwNEEsCisJMHgzMDAwMEEsIDB4MDg5MTQ0LCAweDE5QTE0NCwgMHgyQUIxNDQsCisJMHgwMzg5RTQsIDB4MDM5OUVDLCAweDAwNzUwMiwgMHgwMDdEMEEsCisJMHgwM0E5RTQsIDB4MDAwNzAyLCAweDAwMTA3RCwgMHgwMDA0MTUsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAxMDlFNCwgMHgwMDBGMDIsCisJMHgwMDJBRjUsIDB4MDAxOUZELCAweDAxMDA0MiwgMHgwOTgwNEEsCisJMHgxMDAwMEEsIDB4MDAwOTM0LCAweDAwMTY3NCwgMHgwMDI5RjUsCisJMHgwMTAwNDIsIDB4MTAwMDBBLCAweDAwOTE3QywgMHgwMDIwNzUsCisJMHgwMTAwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgxRUQyODYsCisJMHgwMDI2RjUsIDB4MDAyN0Y1LCAweDAzMDA0MiwgMHgwOTAwNEEsCisJMHgxMDAwMEEsIDB4MDAwQTNDLCAweDAwMTY3QywgMHgwMDFBNzUsCisJMHgwMDBCRkQsIDB4MDEwMDQyLCAweDUxODA0QSwgMHg0ODAwMEEsCisJMHgxNjAwMDcsIDB4MDAxMDc1LCAweDAxMDA0MiwgMHgyODJDMEEsCisJMHgyODFEMTIsIDB4MjgyNTEyLCAweDAwMUYzMiwgMHgxRTAwMDcsCisJMHgwRTAwMDcsIDB4MDAxOTc1LCAweDAxMDA0MiwgMHgwMDJERjUsCisJMHgwRDAwNEEsIDB4MTAwMDBBLCAweDAwOTE0NCwgMHgxRkIyODYsCisJMHgwMTAwNDIsIDB4MjgzNDBBLCAweDAwMEU1RCwgMHgwMDAwOEQsCisJMHgwMDAzNzUsIDB4MDAwODIwLCAweDAxMDA0MCwgMHgwNUQyRjQsCisJMHg1NEQxMDQsIDB4MDA3MzVDLCAweDIwNTM4NiwgMHgwMDAwMDcsCisJMHgwQzAwMDcsIDB4MDgwMDA3LCAweDBBMDAwNywgMHgwMjA0MEQsCisJMHgwMDA4MTAsIDB4MDgwNDNBLCAweDMzMjIwNiwgMHgwMDAwMDcsCisJMHgyMDVBMDYsIDB4MDAwMDA3LCAweDA4MDAwNywgMHgwMDIyNzUsCisJMHgwMTAwNDIsIDB4MjAwMDBBLCAweDAwMjEwNCwgMHgyMTIwODYsCisJMHgwMDFFMkQsIDB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsCisJMHgwMDA5MDQsIDB4MjA5Mjg2LCAweDAwMDAwNywgMHgwMDIwMTAsCisJMHgzMDA0M0EsIDB4MDAwNTdELCAweDAxODBDMywgMHgwODAwMEEsCisJMHgwMjg5MjQsIDB4MjgwNTAyLCAweDI4MEMwMiwgMHgwQTgxMEQsCisJMHgwMDA4MjAsIDB4MDAwMkY1LCAweDAxMDA0MCwgMHgyMjAwMDcsCisJMHgwMDA0RkQsIDB4MDE4MDQyLCAweDcwMDAwQSwgMHgwMzAwMDAsCisJMHgwMDcwMjAsIDB4MDZGQTA2LCAweDAxODA0MCwgMHgwMjE4MEQsCisJMHgwMDA4MTAsIDB4MDgwNDNBLCAweDJCMjIwNiwgMHgwMDAwMDcsCisJMHgwMDAyRkQsIDB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsCisJMHgyMThBODYsIDB4MDAwMDA3LCAweDAxRjIwNiwgMHgwMDAwMDcsCisJMHgwMDA4NzUsIDB4MDAwOUZELCAweDAwMDEwRCwgMHgyMjBBMDYsCisJMHgwMDAyOTUsIDB4MDAwQjc1LCAweDAwMDk3RCwgMHgwMDAwMEQsCisJMHgwMDA1MTUsIDB4MDEwMDQyLCAweDE4MDAwQSwgMHgwMDE5MDQsCisJMHgyODc4ODYsIDB4MDAwNkY1LCAweDAwMTAyMCwgMHgwMTAwNDAsCisJMHgwMDA0RjUsIDB4MDAwODIwLCAweDAxMDA0MCwgMHgwMDA3NzUsCisJMHgwMTAwNDIsIDB4MDk4MDRBLCAweDEwMDAwQSwgMHgwMDExMjQsCisJMHgwMDA5MDQsIDB4MjJCQTg2LCAweDAwMDgxNSwgMHgwODAxMDIsCisJMHgxMDEyMDQsIDB4MjJEQTA2LCAweDAwMDU3NSwgMHgwODEyMDQsCisJMHgwMDAwMDcsIDB4MTAwMTAyLCAweDAwMDU3NSwgMHgwMDA0MjUsCisJMHgwMjExMjQsIDB4MTAwMTAyLCAweDAwMDgyMCwgMHgwMzEwNjAsCisJMHgwMTAwNDAsIDB4MDAxOTI0LCAweDI4Nzg4NiwgMHgwMDAwOEQsCisJMHgwMDA0NjQsIDB4MDA5RDA0LCAweDI3ODg4NiwgMHgxODAxMDIsCisJMHgwMDA1NzUsIDB4MDEwMDQyLCAweDI4MDQwQSwgMHgwMDAxOEQsCisJMHgwMDA5MjQsIDB4MjgwRDAyLCAweDAwMDAwRCwgMHgwMDA5MjQsCisJMHgyODE1MDIsIDB4MTAwMDBELCAweDAwMDgyMCwgMHgwMDAyRjUsCisJMHgwMTAwNDAsIDB4MjAwMDA3LCAweDAwMTE3NSwgMHgwMDAyRkQsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgyM0MyODYsCisJMHgwMDAwMDcsIDB4MDAwMTAwLCAweDA4MEIyMCwgMHgxMzBCNjAsCisJMHgxQjBCNjAsIDB4MDMwQTYwLCAweDAxMDA0MCwgMHgwNTAwNDIsCisJMHgzRDAwNEEsIDB4MzUwMDRBLCAweDJEMDA0QSwgMHgyMDAwMEEsCisJMHgwMDA2RjUsIDB4MDEwMDQyLCAweDI4MTQwQSwgMHgwMDA0RjUsCisJMHgwMTAwNDIsIDB4MDgwMDBBLCAweDAwMDMxNSwgMHgwMTBEMDQsCisJMHgyNENBODYsIDB4MDA0MDE1LCAweDAwMDA5NSwgMHgwMTBEMDQsCisJMHgyNEI4ODYsIDB4MTAwMDIyLCAweDEwMDAyQSwgMHgyNEUyMDYsCisJMHgwMDAwMDcsIDB4MzMzMTA0LCAweDJBQTkwNCwgMHgwMDAwMDcsCisJMHgwMzIxMjQsIDB4MjgwNTAyLCAweDAwMTEyNCwgMHgwMDA0MjQsCisJMHgwMDA0MjQsIDB4MDAzMjI0LCAweDAwMjkyQywgMHgwMDYzNkMsCisJMHgyNUYzODYsIDB4MDAwMDA3LCAweDAyQjE2NCwgMHgwMDA0NjQsCisJMHgwMDA0NjQsIDB4MDAwMDhELCAweDAwMEE2NCwgMHgyODBEMDIsCisJMHgxMDAwOEQsIDB4MDAwODIwLCAweDAwMDJGNSwgMHgwMTAwNDAsCisJMHgyMjAwMDcsIDB4MDAwMDhELCAweDM4QjkwNCwgMHgwMDAwMDcsCisJMHgwMzI5NkMsIDB4MzAwMTBBLCAweDAwMDJGNSwgMHgwMTAwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDI1QkE4NiwgMHgwMDAwMDcsCisJMHgwMjMxMkMsIDB4MjgwNTBBLCAweDAwMDA4RCwgMHgwMTA5NkMsCisJMHgyODBEMEEsIDB4MTAwMTBELCAweDAwMDgyMCwgMHgwMDAyRjUsCisJMHgwMTAwNDAsIDB4MjIwMDA3LCAweDAwMTEyNCwgMHgwMDA0MjQsCisJMHgwMDA0MjQsIDB4MDAzMjI0LCAweDMwMDEwMiwgMHgwMzI5NDQsCisJMHgyNjdBODYsIDB4MDAwMDA3LCAweDMwMDAwMiwgMHgwMDA0RjUsCisJMHgwMTAwNDIsIDB4MDgwMDBBLCAweDAwMDMxNSwgMHgwMTBEMDQsCisJMHgyNkMwODYsIDB4MDAzMTI0LCAweDAwMDQ2NCwgMHgzMDAxMDIsCisJMHgwMDAyRjUsIDB4MDEwMDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsCisJMHgyNkNBODYsIDB4MDAwMDA3LCAweDAwMzEyNCwgMHgzMDA1MDIsCisJMHgwMDM5MjQsIDB4MzAwNTgzLCAweDAwMDg4MywgMHgwMDA1RjUsCisJMHgwMTAwNDIsIDB4MjgwNDBBLCAweDAwMDA4RCwgMHgwMDgxMjQsCisJMHgyODBEMDIsIDB4MDAwMDhELCAweDAwODEyNCwgMHgyODE1MDIsCisJMHgxMDAxOEQsIDB4MDAwODIwLCAweDAwMDJGNSwgMHgwMTAwNDAsCisJMHgyMjAwMDcsIDB4MDAxMDI1LCAweDAwMDU3NSwgMHgwMzAwNDIsCisJMHgwOTAwNEEsIDB4MTAwMDBBLCAweDBBMDkwNCwgMHgxMjExMDQsCisJMHgwMDAwMDcsIDB4MDAxMDIwLCAweDA1MDg2MCwgMHgwNTAwNDAsCisJMHgwMDA2RkQsIDB4MDE4MDQyLCAweDA5MDA0QSwgMHgxMDAwMEEsCisJMHgwMDAwQTUsIDB4MEEwOTA0LCAweDEyMTEwNCwgMHgwMDAwMDcsCisJMHgwMDA4MjAsIDB4MDE5MDYwLCAweDAxMDA0MCwgMHgwMDAyRjUsCisJMHgwMTAwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgyODQyODYsCisJMHgwMDAwMDcsIDB4MjMwQTA2LCAweDAwMDAwNywgMHgwMDA2MDYsCisJMHgwMDAwMDcsIDB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsCisJMHgwMDA5MDQsIDB4Mjg5Mjg2LCAweDAwMDAwNywgMHgwMDAxMDAsCisJMHgwODBCMjAsIDB4MTM4QjYwLCAweDFCOEI2MCwgMHgyMzhCNjAsCisJMHgyQjhCNjAsIDB4MzM4QjYwLCAweDNCOEI2MCwgMHg0MzhCNjAsCisJMHg0QjhCNjAsIDB4NTM4QjYwLCAweDVCOEI2MCwgMHg2MzhCNjAsCisJMHg2QjhCNjAsIDB4NzM4QjYwLCAweDdCOEI2MCwgMHgwMzhGNjAsCisJMHgwQjhGNjAsIDB4MTM4RjYwLCAweDFCOEY2MCwgMHgyMzhGNjAsCisJMHgyQjhGNjAsIDB4MzM4RjYwLCAweDNCOEY2MCwgMHg0MzhGNjAsCisJMHg0QjhGNjAsIDB4NTM4RjYwLCAweDVCOEY2MCwgMHg2MzhGNjAsCisJMHg2QjhGNjAsIDB4NzM4RjYwLCAweDdCOEY2MCwgMHgwMzhBNjAsCisJMHgwMDA2MDYsIDB4MDE4MDQwLCAweDAwMDA4RCwgMHgwMDBBNjQsCisJMHgyODBEMDIsIDB4MDAwQTI0LCAweDAwMDI3RCwgMHgwMTgwNDIsCisJMHgxMDAwMEEsIDB4MDAxMjI0LCAweDAwMDNGRCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDJBODI4NiwgMHgwMDAwMDcsCisJMHgwMDAxOEQsIDB4MDAwQTI0LCAweDAwMDQ2NCwgMHgwMDA0NjQsCisJMHgwODAxMDIsIDB4MDAwOTI0LCAweDAwMDQyNCwgMHgwMDA0MjQsCisJMHgxMDAxMDIsIDB4MDIwMDBELCAweDAwOTE0NCwgMHgyQUQ5ODYsCisJMHgwMDAwMDcsIDB4MDAwMUZELCAweDAxODA0MiwgMHgwODAwMEEsCisJMHgwMDBBNDQsIDB4MkFCQjg2LCAweDAxODA0MiwgMHgwQTAwMEQsCisJMHgwMDA4MjAsIDB4MDAwMkZELCAweDAxODA0MCwgMHgyMDAwMDcsCisJMHgwMDAyN0QsIDB4MDAxMDIwLCAweDAwMDYwNiwgMHgwMTgwNDAsCisJMHgwMDAyRjUsIDB4MDEwMDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsCisJMHgyQjJBODYsIDB4MDAwMDA3LCAweDAwMDM3RCwgMHgwMTgwNDIsCisJMHgwODAwMEEsIDB4MDAwOTA0LCAweDJCNUE4NiwgMHgwMDAwMDcsCisJMHgwMDAwNzUsIDB4MDAyRTdELCAweDAxMDA0MiwgMHgwQjgwNEEsCisJMHgwMDAwMjAsIDB4MDAwOTA0LCAweDAwMDY4NiwgMHgwMTAwNDAsCisJMHgzMTg0NEEsIDB4MzAwNDhCLCAweDAwMDg4MywgMHgwMDAwOEQsCisJMHgwMDA4MTAsIDB4MjgxNDNBLCAweDAwMDA4RCwgMHgwMDA4MTAsCisJMHgyODBDM0EsIDB4MDAwNjc1LCAweDAxMDA0MiwgMHgwODAwMEEsCisJMHgwMDM4MTUsIDB4MDEwOTI0LCAweDI4MDUwMiwgMHgwQjAwMEQsCisJMHgwMDA4MjAsIDB4MDAwMkY1LCAweDAxMDA0MCwgMHgwMDA2MDYsCisJMHgyMjAwMDcsIDB4MDAwNDY0LCAweDAwMDQ2NCwgMHgwMDA2MDYsCisJMHgwMDAwMDcsIDB4MDAwMTM0LCAweDAwN0Y4RCwgMHgwMDA5M0MsCisJMHgyODFEMTIsIDB4MjgyNTEyLCAweDAwMUYzMiwgMHgwRTAwMDcsCisJMHgwMDAxMEQsIDB4MDAwMzdELCAweDAwMDgyMCwgMHgwMTgwNDAsCisJMHgwNUQyRjQsIDB4MDAwMDA3LCAweDA4MDAwNywgMHgwMDAzN0QsCisJMHgwMTgwNDIsIDB4MDgwMDBBLCAweDAwMDkwNCwgMHgyRDAyODYsCisJMHgwMDAwMDcsIDB4MDAwNjA2LCAweDAwMDAwNywgMHgwMDAwMDcsCisJMHgwMDAwMTIsIDB4MTAwMDA3LCAweDMyMDAwNywgMHg2MDAwMDcsCisJMHgxMDAwODAsIDB4NDgwMDFBLCAweDAwNDkwNCwgMHgyRDYxODYsCisJMHgwMDAwMDcsIDB4MDAxMjEwLCAweDU4MDAzQSwgMHgwMDAxNDUsCisJMHg1QzVEMDQsIDB4MDAwMDA3LCAweDAwMDA4MCwgMHg0ODAwMUEsCisJMHgwMDQ5MDQsIDB4MkRCMTg2LCAweDAwMDAwNywgMHgwMDEyMTAsCisJMHg1MDAwM0EsIDB4MDA1OTA0LCAweDJFMDg4NiwgMHgwMDAwNDUsCisJMHgwMDAwQzUsIDB4N0ZGRkY1LCAweDdGRkY3RCwgMHgwN0Q1MjQsCisJMHgwMDQyMjQsIDB4NTAwMTAyLCAweDIwMDUwMiwgMHgwMDAwODIsCisJMHg0MDAwMUEsIDB4MDA0MTA0LCAweDJFMzk4NiwgMHgwMDAwMDcsCisJMHgwMDM4NjUsIDB4NDAwMDFBLCAweDAwNDAyMCwgMHgwMDEwNEQsCisJMHgwNEMxODQsIDB4MzAxQjg2LCAweDAwMDA0MCwgMHgwNDAwMDcsCisJMHgwMDAxNjUsIDB4MDAwMTQ1LCAweDAwNDAyMCwgMHgwMDAwNDAsCisJMHgwMDA3NjUsIDB4MDgwMDgwLCAweDQwMDAxQSwgMHgwMDQxMDQsCisJMHgyRUM5ODYsIDB4MDAwMDA3LCAweDAwMTIxMCwgMHg0MDAwM0EsCisJMHgwMDQxMDQsIDB4MkYyMjg2LCAweDAwMDA0RCwgMHgwMDAwQ0QsCisJMHgwMDQ4MTAsIDB4MjAwNDNBLCAweDAwMDg4MiwgMHg0MDAwMUEsCisJMHgwMDQxMDQsIDB4MkYzMTg2LCAweDAwMDAwNywgMHgwMDQ4MjAsCisJMHgwMDU5MDQsIDB4MzAwODg2LCAweDAwMDA0MCwgMHgwMDA3RTUsCisJMHgyMDA0ODAsIDB4MjgxNkEwLCAweDMyMTZFMCwgMHgzQTE2RTAsCisJMHg0MjE2RTAsIDB4MDIxMjYwLCAweDAwMDA0MCwgMHgwMDAwMzIsCisJMHg0MDAwNzUsIDB4MDAwMDdELCAweDA3RDU3NCwgMHgyMDA1MTIsCisJMHgwMDAwODIsIDB4NDAwMDFBLCAweDAwNDEwNCwgMHgyRkUxODYsCisJMHgwMDAwMDcsIDB4MDM3MjA2LCAweDY0MDAwNywgMHgwNjAwMDcsCisJMHgwMDAwRTUsIDB4MDAwMDIwLCAweDAwMDA0MCwgMHgwMDBBNjUsCisJMHgwMDAwMjAsIDB4MDIwMDQwLCAweDAyMDA0MCwgMHgwMDAwNDAsCisJMHgwMDAxNjUsIDB4MDAwMDQyLCAweDcwMDAwQSwgMHgwMDcxMDQsCisJMHgzMEEyODYsIDB4MDAwMDA3LCAweDAxODIwNiwgMHg2NDAwMDcsCisJMHgwNTAwMDAsIDB4MDA3MDIwLCAweDAwMDA0MCwgMHgwMzcyMDYsCisJMHg2NDAwMDcsIDB4MDAwMDA3LCAweDAwMzA2RCwgMHgwMjg4NjAsCisJMHgwMjkwNjAsIDB4MDgwMDBBLCAweDAyODg2MCwgMHgwMDgwNDAsCisJMHgxMDAwMTIsIDB4MDAxMDBELCAweDAwOTE4NCwgMHgzMTQxODYsCisJMHgwMDBFMEQsIDB4MDA5MTg0LCAweDMyNTE4NiwgMHgwMDAwMDcsCisJMHgzMDAwMDcsIDB4MDAxMDIwLCAweDAwM0I2RCwgMHgwMDgwNDAsCisJMHgwMDAwODAsIDB4MDgwMDFBLCAweDAwMDkwNCwgMHgzMTYxODYsCisJMHgwMDAwMDcsIDB4MDAxMjIwLCAweDAwMERFRCwgMHgwMDgwNDAsCisJMHgwMDgwNDIsIDB4MTAwMDBBLCAweDQwMDAwRCwgMHgxMDk1NDQsCisJMHgwMDAwMDcsIDB4MDAxMDIwLCAweDAwMERFRCwgMHgwMDgwNDAsCisJMHgwMDgwNDIsIDB4MjAwNDBBLCAweDAwMDA4MiwgMHgwODAwMUEsCisJMHgwMDA5MDQsIDB4MzFGMTg2LCAweDAwMDAwNywgMHgwMDNCNkQsCisJMHgwMDgwNDIsIDB4MDgwMDBBLCAweDAwMEUxNSwgMHgwMTA5ODQsCisJMHgzMjlCODYsIDB4NjAwMDA3LCAweDA4MDAxQSwgMHgwMDBDMTUsCisJMHgwMTA5ODQsIDB4MzI4Mzg2LCAweDAwMDAyMCwgMHgxQTAwMDcsCisJMHgwMDAyRUQsIDB4MDA4MDQwLCAweDYyMDAwNywgMHgwMDMwNkQsCisJMHgwMjgwNDIsIDB4MEE4MDRBLCAweDAwMDgyMCwgMHgwQTgwNEEsCisJMHgwMDA2MDYsIDB4MTA4MDRBLCAweDAwMDAwNywgMHgyODI1MTIsCisJMHgwMDFGMzIsIDB4MDVEMkY0LCAweDU0RDEwNCwgMHgwMDczNUMsCisJMHgwMDA3ODYsIDB4MDAwMDA3LCAweDBDMDAwNywgMHgwQTAwMDcsCisJMHgxQzAwMDcsIDB4MDAzNDY1LCAweDAyMDA0MCwgMHgwMDQ4MjAsCisJMHgwMjUwNjAsIDB4NDAwMDBBLCAweDAyNDA2MCwgMHgwMDAwNDAsCisJMHg0NTQ5NDQsIDB4MDAwMDA3LCAweDAwNDAyMCwgMHgwMDNBRTUsCisJMHgwMDAwNDAsIDB4MDAyOEU1LCAweDAwMDA0MiwgMHg0ODAwMEEsCisJMHgwMDQ5MDQsIDB4Mzg2ODg2LCAweDAwMkM2NSwgMHgwMDAwNDIsCisJMHg0MDAwMEEsIDB4MDAwMEQ1LCAweDQ1NDEwNCwgMHgwMDAwMDcsCisJMHgwMDA2NTUsIDB4MDU0NTA0LCAweDM0RjI4NiwgMHgwMDAxRDUsCisJMHgwNTQ1MDQsIDB4MzRGMDg2LCAweDAwMkI2NSwgMHgwMDAwNDIsCisJMHgwMDNBRTUsIDB4NTAwMDRBLCAweDQwMDAwQSwgMHg0NUMzRDQsCisJMHgwMDAwMDcsIDB4NDU0NTA0LCAweDAwMDAwNywgMHgwMDAwQ0QsCisJMHg0NDQ5NDQsIDB4MDAwMDA3LCAweDQ1NDUwNCwgMHgwMDAwMDcsCisJMHgwMDAxNEQsIDB4NTU0OTQ0LCAweDAwMDAwNywgMHgwNDUxNDQsCisJMHgzNEU5ODYsIDB4MDAyQzY1LCAweDAwMDA0MiwgMHg0ODAwMEEsCisJMHg0Q0QxMDQsIDB4MDAwMDA3LCAweDA0QzE0NCwgMHgzNEYzODYsCisJMHgwMDAwMDcsIDB4MTYwMDA3LCAweDAwMkNFNSwgMHgwNDAwNDIsCisJMHg0MDAwMEEsIDB4MDA0MDIwLCAweDAwMDA0MCwgMHgwMDI5NjUsCisJMHgwMDAwNDIsIDB4NDAwMDBBLCAweDAwNDEwNCwgMHgzNTYwODYsCisJMHgwMDAwMDcsIDB4MDAyNDAyLCAweDM2QTIwNiwgMHgwMDVDMDIsCisJMHgwMDI1RTUsIDB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQyNzQsCisJMHgwMDJBRTUsIDB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQyNzQsCisJMHg1MDAxMTIsIDB4MDAyOUU1LCAweDAwMDA0MiwgMHg0MDAwMEEsCisJMHgwMDQyMzQsIDB4NDU0MTA0LCAweDAwMDAwNywgMHgwMDQwMjAsCisJMHgwMDAwNDAsIDB4MDAzRUU1LCAweDAwMDAyMCwgMHgwMDAwNDAsCisJMHgwMDJERTUsIDB4NDAwMTUyLCAweDUwMDAwQSwgMHgwNDUxNDQsCisJMHgzNjRBODYsIDB4MDAwMEM1LCAweDAwM0VFNSwgMHgwMDQwMjAsCisJMHgwMDAwNDAsIDB4MDAyQkU1LCAweDAwMDA0MiwgMHg0MDAwMEEsCisJMHg0MDQyNTQsIDB4MDAwMDA3LCAweDAwMkFFNSwgMHgwMDQwMjAsCisJMHgwMDAwNDAsIDB4NTAwMTMyLCAweDA0MDEzNCwgMHgwMDU2NzQsCisJMHgwMDI5RTUsIDB4MDIwMDQyLCAweDQyMDAwQSwgMHgwMDAwNDIsCisJMHg1MDAwMEEsIDB4MDU0MTdDLCAweDAwMjhFNSwgMHgwMDAwNDIsCisJMHg0ODAwMEEsIDB4MDAwMEM1LCAweDRDQzE0NCwgMHgzNzEwODYsCisJMHgwMDI2RTUsIDB4MDAyN0U1LCAweDAyMDA0MiwgMHg0MDAwNEEsCisJMHg1MDAwMEEsIDB4MDA0MjNDLCAweDAwNTY3QywgMHgwMDI4RTUsCisJMHgwMDQ4MjAsIDB4MDAwMDQwLCAweDI4MUQxMiwgMHgyODI1MTIsCisJMHgwMDFGNzIsIDB4MDAyOTY1LCAweDAwMDA0MiwgMHg0MDAwMEEsCisJMHgwMDQxMDQsIDB4MzdBQTg2LCAweDBFMDAwNywgMHgxNjAwMDcsCisJMHgxRTAwMDcsIDB4MDAzRUU1LCAweDAwMDA0MiwgMHg0MDAwMEEsCisJMHgwMDQxMDQsIDB4MzdFODg2LCAweDAwMkQ2NSwgMHgwMDAwNDIsCisJMHgyODM0MEEsIDB4MDAzNDY1LCAweDAyMDA0MiwgMHg0MjAwNEEsCisJMHgwMDQwMjAsIDB4NEEwMDRBLCAweDUwMDA0QSwgMHgwNUQyRjQsCisJMHg1NEQxMDQsIDB4MDA3MzVDLCAweDM4NTE4NiwgMHgwMDAwMDcsCisJMHgwMDA2MDYsIDB4MDgwMDA3LCAweDBDMDAwNywgMHgwODAwMDcsCisJMHgwQTAwMDcsIDB4MDAwMUU1LCAweDAyMDA0NSwgMHgwMDQwMjAsCisJMHgwMDAwNjAsIDB4MDAwMzY1LCAweDAwMDA0MCwgMHgwMDJFNjUsCisJMHgwMDFBMjAsIDB4MEExQTYwLCAweDAwMDA0MCwgMHgwMDM0NjUsCisJMHgwMjAwNDIsIDB4NDIwMDRBLCAweDAwNDAyMCwgMHg0QTAwNEEsCisJMHgwMDA2MDYsIDB4NTAwMDRBLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsCisJMHgwMDAwMDAsIDB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgRFMtMUUgQ29udHJvbGxlciBJbnN0cnVjdGlvblJBTSBDb2RlCisvLwkxOTk5LzA2LzIxCisvLwlCdWY0NDEgc2xvdCBpcyBFbmFibGVkLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDA0LzA5ICBjcmVhdAorLy8gMDQvMTIgIHN0b3AgbmlzZSBmaXgKKy8vIDA2LzIxICBXb3JraW5nT2ZmIHRpbW1pbmcKK3N0YXRpYyB1MzIgQ250cmxJbnN0MUVbWURTWEdfQ1RSTExFTkdUSCAvIDRdID0geworCTB4MDAwMDA3LCAweDI0MDAwNywgMHgwQzAwMDcsIDB4MUMwMDA3LAorCTB4MDYwMDA3LCAweDcwMDAwMiwgMHgwMDAwMjAsIDB4MDMwMDQwLAorCTB4MDA3MTA0LCAweDAwNDI4NiwgMHgwMzAwNDAsIDB4MDAwRjBELAorCTB4MDAwODEwLCAweDIwMDQzQSwgMHgwMDAyODIsIDB4MDAwMjBELAorCTB4MDAwODEwLCAweDIwMDQzQSwgMHgwMDEyODIsIDB4MjAwRTgyLAorCTB4MDA4MDBELCAweDAwMDgxMCwgMHgyMDA0M0EsIDB4MDAxQTgyLAorCTB4MDM0NjBELCAweDAwMDgxMCwgMHgxMDA0M0EsIDB4MDJFQzBELAorCTB4MDAwODEwLCAweDE4MDQzQSwgMHgwMDAxMEQsIDB4MDIwMDE1LAorCTB4MDAwMEZELCAweDAwMDAyMCwgMHgwMzg4NjAsIDB4MDM5MDYwLAorCTB4MDM4MDYwLCAweDAzODA0MCwgMHgwMzgwNDAsIDB4MDM4MDQwLAorCTB4MDE4MDQwLCAweDAwMEE3RCwgMHgwMzgwNDAsIDB4MDM4MDQwLAorCTB4MDE4MDQwLCAweDIwMDQwMiwgMHgwMDA4ODIsIDB4MDgwMDFBLAorCTB4MDAwOTA0LCAweDAxNzE4NiwgMHgwMDAwMDcsIDB4MjYwMDA3LAorCTB4NDAwMDA3LCAweDAwMDAwNywgMHgwMzI1OEQsIDB4MDAwODEwLAorCTB4MTgwNDNBLCAweDI2MDAwNywgMHgyODQ0MDIsIDB4MDAwODdELAorCTB4MDE4MDQyLCAweDAwMTYwQSwgMHgwNUEyMDYsIDB4MDAwMDA3LAorCTB4NDQwMDA3LCAweDAwMjMwRCwgMHgwMDA4MTAsIDB4MDgwNDNBLAorCTB4MjJGQTA2LCAweDAwMDAwNywgMHgwMDA3RkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgwMkFCODYsIDB4MDAwMTk1LAorCTB4MDkwRDA0LCAweDAwMDAwNywgMHgwMDA4MjAsIDB4MDAwMEY1LAorCTB4MDAwQjdELCAweDAxRjA2MCwgMHgwMDAwRkQsIDB4MDMzQTA2LAorCTB4MDE4MDQwLCAweDAwMEE3RCwgMHgwMzgwNDIsIDB4MTM4MDRBLAorCTB4MTgwMDBBLCAweDAwMTgyMCwgMHgwNTkwNjAsIDB4MDU4ODYwLAorCTB4MDE4MDQwLCAweDAwMDBGRCwgMHgwMTgwNDIsIDB4NzAwMDBBLAorCTB4MDAwMTE1LCAweDA3MTE0NCwgMHgwMzNCODYsIDB4MDMwMDAwLAorCTB4MDA3MDIwLCAweDAzNjIwNiwgMHgwMTgwNDAsIDB4MDAzNjBELAorCTB4MDAwODEwLCAweDA4MDQzQSwgMHgyMzIyMDYsIDB4MDAwMDA3LAorCTB4MDJFQzBELCAweDAwMDgxMCwgMHgxODA0M0EsIDB4MDE5QTA2LAorCTB4MDAwMDA3LCAweDI0MDAwNywgMHgwMDBGOEQsIDB4MDAwODEwLAorCTB4MDAxNjNBLCAweDAwMjQwMiwgMHgwMDVDMDIsIDB4MDAyOEZELAorCTB4MDAwMDIwLCAweDAxODA0MCwgMHgwODAwMEQsIDB4MDAwODE1LAorCTB4NTEwOTg0LCAweDAwMDAwNywgMHgwMDAwNEQsIDB4MDAwRTVELAorCTB4MDAwRTAyLCAweDAwNDMwRCwgMHgwMDA4MTAsIDB4MDgwNDNBLAorCTB4MkUxMjA2LCAweDAwMDAwNywgMHgwMDAwOEQsIDB4MDAwOTI0LAorCTB4MDAwRjAyLCAweDAwNDcwRCwgMHgwMDA4MTAsIDB4MDgwNDNBLAorCTB4MkUxMjA2LCAweDAwMDAwNywgMHg0ODA0ODAsIDB4MDAxMjEwLAorCTB4MjgwNDNBLCAweDAwNzc4RCwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MDAwNjhELCAweDAwMDgxMCwgMHgyODE0M0EsIDB4Mjg0NDAyLAorCTB4MDMyNThELCAweDAwMDgxMCwgMHgxODA0M0EsIDB4MDdGRjhELAorCTB4MDAwODIwLCAweDAwMDJGRCwgMHgwMTgwNDAsIDB4MjYwMDA3LAorCTB4MjAwMDA3LCAweDAwMDJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDA1MTI4NiwgMHgwMDAwMDcsIDB4MjQwMDA3LAorCTB4MDJFQzBELCAweDAwMDgxMCwgMHgxODA0M0EsIDB4MDAzODdELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDEwMTUsIDB4MDEwOTg0LAorCTB4MDE5Qjg2LCAweDAwMDAwNywgMHgwMUIyMDYsIDB4MDAwMDA3LAorCTB4MDAwOEZELCAweDAxODA0MiwgMHgxODAwMEEsIDB4MDAxOTA0LAorCTB4MjJCODg2LCAweDI4MDAwNywgMHgwMDE4MTAsIDB4MjgwNDNBLAorCTB4MjgwQzAyLCAweDAwMDAwRCwgMHgwMDA4MTAsIDB4MjgxNDNBLAorCTB4MDg4MDhELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwMDIwRCwgMHgxODk5MDQsIDB4MDAwMDA3LAorCTB4MDA0MDJELCAweDAwMDBCRCwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgwNjVBODYsIDB4MDAwMDA3LAorCTB4MDAwMTAwLCAweDAwMEEyMCwgMHgwMDA0N0QsIDB4MDE4MDQwLAorCTB4MDE4MDQyLCAweDIwMDAwQSwgMHgwMDMwMTUsIDB4MDEyMTQ0LAorCTB4MDM2MTg2LCAweDAwMDAwNywgMHgwMDIxMDQsIDB4MDM2MTg2LAorCTB4MDAwMDA3LCAweDAwMEY4RCwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MDIzOTQ0LCAweDA3Qzk4NiwgMHgwMDAwMDcsIDB4MDAxODEwLAorCTB4MjgwNDNBLCAweDA4ODEwRCwgMHgwMDA4MjAsIDB4MDAwMkZELAorCTB4MDE4MDQwLCAweDIwMDAwNywgMHgwMDI4MTAsIDB4NzgwMDNBLAorCTB4MDA3ODhELCAweDAwMDgxMCwgMHgwODA0M0EsIDB4MkExMjA2LAorCTB4MDAwMDA3LCAweDAwNDAwRCwgMHgwMDEwMTUsIDB4MTg5OTA0LAorCTB4MjkyOTA0LCAweDM5MzkwNCwgMHgwMDAwMDcsIDB4MDcwMjA2LAorCTB4MDAwMDA3LCAweDAwMDRGNSwgMHgwMDAwN0QsIDB4MDAwMDIwLAorCTB4MDAwMDhELCAweDAxMDg2MCwgMHgwMTgwNDAsIDB4MDAwNDdELAorCTB4MDM4MDQyLCAweDIxODA0QSwgMHgxODAwMEEsIDB4MDIxOTQ0LAorCTB4MjI5MDg2LCAweDAwMDAwNywgMHgwMDQwNzUsIDB4NzFGMTA0LAorCTB4MDAwMDA3LCAweDAxMDA0MiwgMHgyODAwMEEsIDB4MDAyOTA0LAorCTB4MjI1ODg2LCAweDAwMDAwNywgMHgwMDNDMEQsIDB4MzBBOTA0LAorCTB4MDAwMDA3LCAweDAwMDc3RCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDA4REE4NiwgMHgwMDA1N0QsIDB4MDAyODIwLAorCTB4MDNCMDYwLCAweDA4RjIwNiwgMHgwMTgwNDAsIDB4MDAzMDIwLAorCTB4MDNBODYwLCAweDAxODA0MCwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgwOEZBODYsIDB4MDAwMDA3LAorCTB4MDAwNTdELCAweDAxODA0MiwgMHgyODA0MEEsIDB4MDAwRThELAorCTB4MDAwODEwLCAweDI4MEMzQSwgMHgwMDAwMEQsIDB4MDAwODEwLAorCTB4MjgxNDNBLCAweDA5MDAwRCwgMHgwMDA4MjAsIDB4MDAwMkZELAorCTB4MDE4MDQwLCAweDIwMDAwNywgMHgwMDNERkQsIDB4MDAwMDIwLAorCTB4MDE4MDQwLCAweDAwMTA3RCwgMHgwMDlEOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJBMTIwNiwgMHgwMDAwMDcsIDB4MDAwODE1LAorCTB4MDgwMDFBLCAweDAxMDk4NCwgMHgwQTUxODYsIDB4MDAxMzdELAorCTB4MjAwNTAwLCAweDI4MEYyMCwgMHgzMzhGNjAsIDB4M0I4RjYwLAorCTB4NDM4RjYwLCAweDRCOEY2MCwgMHg1MzhGNjAsIDB4NUI4RjYwLAorCTB4MDM4QTYwLCAweDAxODA0MCwgMHgwMDEwN0QsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDIxNSwgMHgwMTA5ODQsIDB4M0E4MTg2LAorCTB4MDAwMDA3LCAweDAwN0ZCRCwgMHgzODNEQzQsIDB4MDAwMDA3LAorCTB4MDAxQTdELCAweDAwMTM3NSwgMHgwMTgwNDIsIDB4MDkwMDRBLAorCTB4MTAwMDBBLCAweDBCOEQwNCwgMHgxMzk1MDQsIDB4MDAwMDA3LAorCTB4MDAwODIwLCAweDAxOTA2MCwgMHgwMDExMDQsIDB4MjI1ODg2LAorCTB4MDEwMDQwLCAweDAwMTdGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDIyNUE4NiwgMHgwMDAwMDcsIDB4MDAxOTdELAorCTB4MDM4MDQyLCAweDA5ODA0QSwgMHgxMDAwMEEsIDB4MDAwOTI0LAorCTB4MDAxNjY0LCAweDAwMTFGRCwgMHgwMzgwNDIsIDB4MkI4MDRBLAorCTB4MTk4MDRBLCAweDAwMDA4RCwgMHgyMTg5NDQsIDB4MDAwMDA3LAorCTB4MDAyMjQ0LCAweDBDMTk4NiwgMHgwMDAwMDcsIDB4MDAxQTY0LAorCTB4MDAyQTI0LCAweDAwMTk3RCwgMHgwODAxMDIsIDB4MTAwMTIyLAorCTB4MDAwODIwLCAweDAzOTA2MCwgMHgwMTgwNDAsIDB4MDAzREZELAorCTB4MDAwMDhELCAweDAwMDgyMCwgMHgwMTgwNDAsIDB4MDAxMzc1LAorCTB4MDAxQTdELCAweDAxMDA0MiwgMHgwOTgwNEEsIDB4MTAwMDBBLAorCTB4MDAwMjFELCAweDAxODlFNCwgMHgyOTkyRTQsIDB4MzA5MTQ0LAorCTB4MDAwMDA3LCAweDAwMDYwRCwgMHgwMDBBMTUsIDB4MDAwQzFELAorCTB4MDAxMDI1LCAweDAwQTlFNCwgMHgwMTJCRTQsIDB4MDAwNDY0LAorCTB4MDFCM0U0LCAweDAyMzJFNCwgMHgwMDA0NjQsIDB4MDAwNDY0LAorCTB4MDAwNDY0LCAweDAwMDQ2NCwgMHgwMDA0MEQsIDB4MDhCMUM0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMDBCRjUsIDB4MDMwMDQwLAorCTB4MDAxOTdELCAweDAzODA0MiwgMHgwOTgwNEEsIDB4MDAwQTI0LAorCTB4MDgwMDBBLCAweDA4MEU2NCwgMHgwMDAwMDcsIDB4MTAwMTIyLAorCTB4MDAwODIwLCAweDAzMTA2MCwgMHgwMTAwNDAsIDB4MDA2NEFDLAorCTB4MDAwMjdELCAweDAwMDAyMCwgMHgwMTgwNDAsIDB4MDAxMDdELAorCTB4MDE4MDQyLCAweDAwMTFGRCwgMHgzQjgwNEEsIDB4MDk4MDRBLAorCTB4MjAwMDBBLCAweDAwMDA5NSwgMHgxQTExNDQsIDB4MDBBMTQ0LAorCTB4MEU1ODg2LCAweDAwMDQwRCwgMHgwMEI5ODQsIDB4MEU1OTg2LAorCTB4MDAxOEZELCAweDAxODA0MiwgMHgwMDEwRkQsIDB4MDk4MDRBLAorCTB4MjgwMDBBLCAweDAwMDA5NSwgMHgwMTA5MjQsIDB4MDAyQTY0LAorCTB4MEU0OTg2LCAweDAwMDAwNywgMHgwMDI5MDQsIDB4MEU1QTg2LAorCTB4MDAwMDA3LCAweDBFNjIwNiwgMHgwODAwMDIsIDB4MDAwMDhELAorCTB4MDAzODdELCAweDAwMDgyMCwgMHgwMTgwNDAsIDB4MDAxMjdELAorCTB4MDE4MDQyLCAweDEwMDAwQSwgMHgwMDM5MDQsIDB4MEYwOTg2LAorCTB4MDAwODBELCAweDdGRkZCNSwgMHgwMEI5ODQsIDB4MEVEOTg2LAorCTB4MDAwMDI1LCAweDBGQjIwNiwgMHgwMDAwMkQsIDB4MDAwMDE1LAorCTB4MDAwODJELCAweDAyRTAwRCwgMHgwMDA4MjAsIDB4MEZGQTA2LAorCTB4MDAwMDBELCAweDdGODAzNSwgMHgwMEI5ODQsIDB4MEZBOTg2LAorCTB4NDAwMDI1LCAweDAwMDA4RCwgMHgxMTA5NDQsIDB4MDAwMDA3LAorCTB4MDAwMThELCAweDEwOTUwNCwgMHgwMDAwMDcsIDB4MDA5MTY0LAorCTB4MDAwNDI0LCAweDAwMDQyNCwgMHgwMDA0MjQsIDB4MTAwMTAyLAorCTB4MjgwMDAyLCAweDAyREYwRCwgMHgwMDA4MjAsIDB4MEZGQTA2LAorCTB4MDAwMThELCAweDAwMDQyRCwgMHgwMDAwOEQsIDB4MTA5NTA0LAorCTB4MDAwMDA3LCAweDAwMDIwRCwgMHgxMDkxODQsIDB4MDAwMDA3LAorCTB4MDJERjhELCAweDAwMDgyMCwgMHgwMDAwOEQsIDB4MDAzOEZELAorCTB4MDE4MDQwLCAweDAwM0JGRCwgMHgwMDEwMjAsIDB4MDNBODYwLAorCTB4MDAwODE1LCAweDMxMzE4NCwgMHgyMTIxODQsIDB4MDAwMDA3LAorCTB4MDNCMDYwLCAweDAzQTA2MCwgMHgwMTgwNDAsIDB4MDAyMkZELAorCTB4MDAwMDk1LCAweDAxMDkyNCwgMHgwMDA0MjQsIDB4MDAwNDI0LAorCTB4MDAxMjY0LCAweDEwMDEwMiwgMHgwMDA4MjAsIDB4MDM5MDYwLAorCTB4MDE4MDQwLCAweDAwMTkyNCwgMHgwMTBGMEQsIDB4MDAzOTdELAorCTB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsIDB4MDk4NDRBLAorCTB4MDAwNjA2LCAweDA4MDQwQSwgMHgwMDA0MjQsIDB4MDAwNDI0LAorCTB4MDAxMTdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwQTI0LAorCTB4MjgwNTAyLCAweDI4MEMwMiwgMHgwOTgwMEQsIDB4MDAwODIwLAorCTB4MDAwMkZELCAweDAxODA0MCwgMHgyMDAwMDcsIDB4MDAyMkZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDAwOTUsIDB4MjgwREM0LAorCTB4MDExOTI0LCAweDAwMTk3RCwgMHgwMTgwNDIsIDB4MDAxMUZELAorCTB4MDk4MDRBLCAweDEwMDAwQSwgMHgwMDAwQjUsIDB4MTEzMTQ0LAorCTB4MEE4RDA0LCAweDAwMDAwNywgMHgwODBBNDQsIDB4MTI5NTA0LAorCTB4MDAwMDA3LCAweDAwMjNGRCwgMHgwMDEwMjAsIDB4MDM4MDQwLAorCTB4MTAxMjQ0LCAweDAwMDAwNywgMHgwMDA4MjAsIDB4MDM5MDYwLAorCTB4MDE4MDQwLCAweDAwMDJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDEyMzI4NiwgMHgwMDAwMDcsIDB4MDAzQkZELAorCTB4MDAwMTAwLCAweDAwMEExMCwgMHgwQjgwN0EsIDB4MTM4MDRBLAorCTB4MDkwOTg0LCAweDAwMDAwNywgMHgwMDAwOTUsIDB4MDEzRDA0LAorCTB4MTJCODg2LCAweDEwMDAwQSwgMHgxMDAwMDIsIDB4MDkwOTg0LAorCTB4MDAwMDA3LCAweDAzODA0MiwgMHgxMTgwNEEsIDB4MDkwRDA0LAorCTB4MDAwMDA3LCAweDEwMDAwQSwgMHgwOTBEODQsIDB4MDAwMDA3LAorCTB4MDAyNTdELCAweDAwMDgyMCwgMHgwMTgwNDAsIDB4MDAwMTBELAorCTB4MDAwODEwLCAweDI4MTQzQSwgMHgwMDEyN0QsIDB4MDE4MDQyLAorCTB4MjAwMDBBLCAweDAwMTk3RCwgMHgwMTgwNDIsIDB4MDAxMTdELAorCTB4MzE4MDRBLCAweDEwMDAwQSwgMHgwMDMxMjQsIDB4MDEzQjhELAorCTB4MDAzOTdELCAweDAwMDgyMCwgMHgwNTgwNDAsIDB4MDM4MDQyLAorCTB4MDk4NDRBLCAweDAwMDYwNiwgMHgwODA0MEEsIDB4MzAwMTAyLAorCTB4MDAzMTI0LCAweDAwMDQyNCwgMHgwMDA0MjQsIDB4MDAxMjI0LAorCTB4MjgwNTAyLCAweDAwMUE0QywgMHgxNDM5ODYsIDB4NzAwMDAyLAorCTB4MDAwMDJELCAweDAzMDAwMCwgMHgwMDM4N0QsIDB4MDE4MDQyLAorCTB4MTAwMDBBLCAweDE0NjIwNiwgMHgwMDIxMjQsIDB4MDAwMEFELAorCTB4MTAwMDAyLCAweDAwMDEwRCwgMHgwMDA5MjQsIDB4MDA2QjI0LAorCTB4MDE0QTBELCAweDAwMzk3RCwgMHgwMDA4MjAsIDB4MDU4MDQwLAorCTB4MDM4MDQyLCAweDA5ODQ0QSwgMHgwMDA2MDYsIDB4MDgwNDBBLAorCTB4MDAzMjY0LCAweDAwMDA4RCwgMHgwMDBBMjQsIDB4MDAxMDIwLAorCTB4MDAyMjdELCAweDAxODA0MCwgMHgwMTRGOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJCNUEwNiwgMHgwMDAwMDcsIDB4MDAyODIwLAorCTB4MDAyMDdELCAweDAxODA0MCwgMHgwMDExN0QsIDB4MDM4MDQyLAorCTB4MTM4MDRBLCAweDMzODAwQSwgMHgwMDM4N0QsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgxNzcyODYsIDB4MDAwMDA3LAorCTB4MDAwMDhELCAweDAzMDk2NCwgMHgwMTVCMEQsIDB4MDAzOTdELAorCTB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsIDB4MDk4NDRBLAorCTB4MDAwNjA2LCAweDA4MDQwQSwgMHgzODAxMDIsIDB4MDAwNDI0LAorCTB4MDAwNDI0LCAweDAwMTIyNCwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgxNURBODYsIDB4MDAwMDA3LAorCTB4MjgwNTAyLCAweDAwMUE0QywgMHgxNzcxODYsIDB4MDAwMDA3LAorCTB4MDMyMTY0LCAweDAwNjMyQywgMHgwMDNERkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDA5NSwgMHgwOTA5MDQsIDB4MDAwMDA3LAorCTB4MDAwODIwLCAweDAwMUE0QywgMHgxNjk5ODYsIDB4MDE4MDQwLAorCTB4MDMwMDAwLCAweDE2QjIwNiwgMHgwMDIxMjQsIDB4MDAwMTBELAorCTB4MDAwOTI0LCAweDAwNkIyNCwgMHgwMTZGMEQsIDB4MDAzOTdELAorCTB4MDAwODIwLCAweDA1ODA0MCwgMHgwMzgwNDIsIDB4MDk4NDRBLAorCTB4MDAwNjA2LCAweDA4MDQwQSwgMHgwMDNBNjQsIDB4MDAwMDk1LAorCTB4MDAxMjI0LCAweDAwMDJGRCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDE3MTI4NiwgMHgwMDAwMDcsIDB4MDE3NjBELAorCTB4MDAwODEwLCAweDA4MDQzQSwgMHgyQjVBMDYsIDB4MDAwMDA3LAorCTB4MTYwQTA2LCAweDAwMDAwNywgMHgwMDcwMjAsIDB4MDgwMTBBLAorCTB4MTAwMTJBLCAweDAwMjBGRCwgMHgwMzg4NjAsIDB4MDM5MDYwLAorCTB4MDE4MDQwLCAweDAwMjI3RCwgMHgwMTgwNDIsIDB4MDAzREZELAorCTB4MDgwMDBBLCAweDMxODQ0QSwgMHgwMDA5MDQsIDB4MTgxMDg2LAorCTB4MTgwMDhCLCAweDAwMDA4RCwgMHgxODk5MDQsIDB4MDAzMTJDLAorCTB4MThFMjA2LCAweDAwMDAwNywgMHgwMDMyNEMsIDB4MTg2Qjg2LAorCTB4MDAwMDA3LCAweDAwMTkwNCwgMHgxODY4ODYsIDB4MDAwMDA3LAorCTB4MDAwMDk1LCAweDE5OTE0NCwgMHgwMDIyMkMsIDB4MDAzMTI0LAorCTB4MDA2MzZDLCAweDAwMEUzRCwgMHgwMDEzNzUsIDB4MDAwQkZELAorCTB4MDEwMDQyLCAweDA5ODA0QSwgMHgxMDAwMEEsIDB4MDM4QUVDLAorCTB4MDM5M0VDLCAweDAwMjI0QywgMHgxOEUxODYsIDB4MDAwMDA3LAorCTB4MDAwMDhELCAweDE4OTkwNCwgMHgwMDIyNkMsIDB4MDAzMjJDLAorCTB4MzAwNTBBLCAweDMwMURBQiwgMHgwMDIwODMsIDB4MDAxOEZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMTg5MjQsIDB4MzAwNTAyLAorCTB4MDAxMDgzLCAweDAwMTg3NSwgMHgwMTAwNDIsIDB4MTAwMDBBLAorCTB4MDAwMDhELCAweDAxMDkyNCwgMHgwMDEzNzUsIDB4MzMwNTQyLAorCTB4MzMwQ0NCLCAweDMzMkNDQiwgMHgzMzM0Q0IsIDB4MzMzQ0NCLAorCTB4MzM0NENCLCAweDMzNENDQiwgMHgzMzU0Q0IsIDB4MzA1QzhCLAorCTB4MDA2MDgzLCAweDAwMDJGNSwgMHgwMTAwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDE5QjI4NiwgMHgwMDAwMDcsIDB4MDAxRTJELAorCTB4MDAwNUZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDI4OTI0LAorCTB4MjgwNTAyLCAweDAwMDYwRCwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MDAwMDhELCAweDAwMDgxMCwgMHgyODE0M0EsIDB4MEE4MDhELAorCTB4MDAwODIwLCAweDAwMDJGNSwgMHgwMTAwNDAsIDB4MjIwMDA3LAorCTB4MDAxMjc1LCAweDAzMDA0MiwgMHgyMTAwNEEsIDB4MDAwMDhELAorCTB4MUEwOTQ0LCAweDAwMDAwNywgMHgwMUFCOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJDQUEwNiwgMHgwMDAwMDcsIDB4MDAwMUY1LAorCTB4MDMwMDQyLCAweDBEMDA0QSwgMHgxMDAwMEEsIDB4MDg5MTQ0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTAwNDAsIDB4MDAyNUY1LAorCTB4MEEzMTQ0LCAweDAwMDAwNywgMHgwMDA4MjAsIDB4MDMyODYwLAorCTB4MDMwMDQwLCAweDAwMjE3RCwgMHgwMzgwNDIsIDB4MEI4MDRBLAorCTB4MTAwMDBBLCAweDAwMDgyMCwgMHgwMzEwNjAsIDB4MDMwMDQwLAorCTB4MDAwMDhELCAweDAwMDEyNCwgMHgwMDAxMkMsIDB4MDAwRTY0LAorCTB4MDAxQTY0LCAweDAwNjM2QywgMHgwODAxMEEsIDB4MTAwMTJBLAorCTB4MDAwODIwLCAweDAzMTA2MCwgMHgwMzAwNDAsIDB4MDAyMEZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDIyN0QsIDB4MDE4MDQyLAorCTB4MTAwMDBBLCAweDAwMDgyMCwgMHgwMzEwNjAsIDB4MDMwMDQwLAorCTB4MDAxOTdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAyMkZELAorCTB4MDM4MDQyLCAweDEwMDAwQSwgMHgwMDA4MjAsIDB4MDMxMDYwLAorCTB4MDMwMDQwLCAweDA5MEQwNCwgMHgwMDAwMDcsIDB4MDAwODIwLAorCTB4MDMwMDQwLCAweDAzODA0MiwgMHgwQjgwNEEsIDB4MTAwMDBBLAorCTB4MDAwODIwLCAweDAzMTA2MCwgMHgwMzAwNDAsIDB4MDM4MDQyLAorCTB4MTM4MDRBLCAweDE5ODA0QSwgMHgxMTBEMDQsIDB4MTk4RDA0LAorCTB4MDAwMDA3LCAweDA4MDAwQSwgMHgwMDEwMjAsIDB4MDMxODYwLAorCTB4MDMwODYwLCAweDAzMDA0MCwgMHgwMDAwOEQsIDB4MEIwOTQ0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTAwNDAsIDB4MDAwNUY1LAorCTB4MDMwMDQyLCAweDA4MDAwQSwgMHgwMDA4MjAsIDB4MDEwMDQwLAorCTB4MDAwMEY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MUQ5ODg2LCAweDAwMUU3NSwgMHgwMzAwNDIsIDB4MDEwNDRBLAorCTB4MDAwQzBBLCAweDFEQUEwNiwgMHgwMDAwMDcsIDB4MDAwNDAyLAorCTB4MDAwQzAyLCAweDAwMTc3RCwgMHgwMDFBRjUsIDB4MDE4MDQyLAorCTB4MDMxNDRBLCAweDAzMUM0QSwgMHgwMzI0NEEsIDB4MDMyQzRBLAorCTB4MDMzNDRBLCAweDAzM0M0QSwgMHgwMzQ0NEEsIDB4MDA0QzBBLAorCTB4MDAwNDNELCAweDAwMTNGNSwgMHgwMDFBRkQsIDB4MDMwMDQyLAorCTB4MEIwMDRBLCAweDFCODA0QSwgMHgxMzgwNEEsIDB4MjAwMDBBLAorCTB4MDg5MTQ0LCAweDE5QTE0NCwgMHgwMzg5RTQsIDB4MDM5OUVDLAorCTB4MDA1NTAyLCAweDAwNUQwQSwgMHgwMzAwNDIsIDB4MEIwMDRBLAorCTB4MUI4MDRBLCAweDEzODA0QSwgMHgyMDAwMEEsIDB4MDg5MTQ0LAorCTB4MTlBMTQ0LCAweDAzODlFNCwgMHgwMzk5RUMsIDB4MDA2NTAyLAorCTB4MDA2RDBBLCAweDAzMDA0MiwgMHgwQjAwNEEsIDB4MTkwMDRBLAorCTB4MkI4MDRBLCAweDEzODA0QSwgMHgyMTgwNEEsIDB4MzAwMDBBLAorCTB4MDg5MTQ0LCAweDE5QTE0NCwgMHgyQUIxNDQsIDB4MDM4OUU0LAorCTB4MDM5OUVDLCAweDAwNzUwMiwgMHgwMDdEMEEsIDB4MDNBOUU0LAorCTB4MDAwNzAyLCAweDAwMTA3RCwgMHgwMDA0MTUsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAxMDlFNCwgMHgwMDBGMDIsIDB4MDAyQUY1LAorCTB4MDAxOUZELCAweDAxMDA0MiwgMHgwOTgwNEEsIDB4MTAwMDBBLAorCTB4MDAwOTM0LCAweDAwMTY3NCwgMHgwMDI5RjUsIDB4MDEwMDQyLAorCTB4MTAwMDBBLCAweDAwOTE3QywgMHgwMDIwNzUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgyMDBBODYsIDB4MDAyNkY1LAorCTB4MDAyN0Y1LCAweDAzMDA0MiwgMHgwOTAwNEEsIDB4MTAwMDBBLAorCTB4MDAwQTNDLCAweDAwMTY3QywgMHgwMDFBNzUsIDB4MDAwQkZELAorCTB4MDEwMDQyLCAweDUxODA0QSwgMHg0ODAwMEEsIDB4MTYwMDA3LAorCTB4MDAxMDc1LCAweDAxMDA0MiwgMHgyODJDMEEsIDB4MjgxRDEyLAorCTB4MjgyNTEyLCAweDAwMUYzMiwgMHgxRTAwMDcsIDB4MEUwMDA3LAorCTB4MDAxOTc1LCAweDAxMDA0MiwgMHgwMDJERjUsIDB4MEQwMDRBLAorCTB4MTAwMDBBLCAweDAwOTE0NCwgMHgyMEVBODYsIDB4MDEwMDQyLAorCTB4MjgzNDBBLCAweDAwMEU1RCwgMHgwMDAwOEQsIDB4MDAwMzc1LAorCTB4MDAwODIwLCAweDAxMDA0MCwgMHgwNUQyRjQsIDB4NTREMTA0LAorCTB4MDA3MzVDLCAweDIxOEI4NiwgMHgwMDAwMDcsIDB4MEMwMDA3LAorCTB4MDgwMDA3LCAweDBBMDAwNywgMHgwMjE3OEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDM0QjIwNiwgMHgwMDAwMDcsIDB4MjE5MjA2LAorCTB4MDAwMDA3LCAweDA4MDAwNywgMHgwMDIyNzUsIDB4MDEwMDQyLAorCTB4MjAwMDBBLCAweDAwMjEwNCwgMHgyMjU4ODYsIDB4MDAxRTJELAorCTB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MjFDQTg2LCAweDAwMDAwNywgMHgwMDIwMTAsIDB4MzAwNDNBLAorCTB4MDAwNTdELCAweDAxODBDMywgMHgwODAwMEEsIDB4MDI4OTI0LAorCTB4MjgwNTAyLCAweDI4MEMwMiwgMHgwQTgxMEQsIDB4MDAwODIwLAorCTB4MDAwMkY1LCAweDAxMDA0MCwgMHgyMjAwMDcsIDB4MDAwNEZELAorCTB4MDE4MDQyLCAweDcwMDAwQSwgMHgwMzAwMDAsIDB4MDA3MDIwLAorCTB4MDdGQTA2LCAweDAxODA0MCwgMHgwMjJCOEQsIDB4MDAwODEwLAorCTB4MDgwNDNBLCAweDJDQUEwNiwgMHgwMDAwMDcsIDB4MDAwMkZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MjJDMjg2LAorCTB4MDAwMDA3LCAweDAyMDIwNiwgMHgwMDAwMDcsIDB4MDAwODc1LAorCTB4MDAwOUZELCAweDAwMDEwRCwgMHgyMzQyMDYsIDB4MDAwMjk1LAorCTB4MDAwQjc1LCAweDAwMDk3RCwgMHgwMDAwMEQsIDB4MDAwNTE1LAorCTB4MDEwMDQyLCAweDE4MDAwQSwgMHgwMDE5MDQsIDB4MkEwMDg2LAorCTB4MDAwNkY1LCAweDAwMTAyMCwgMHgwMTAwNDAsIDB4MDAwNEY1LAorCTB4MDAwODIwLCAweDAxMDA0MCwgMHgwMDA3NzUsIDB4MDEwMDQyLAorCTB4MDk4MDRBLCAweDEwMDAwQSwgMHgwMDExMjQsIDB4MDAwOTA0LAorCTB4MjNGMjg2LCAweDAwMDgxNSwgMHgwODAxMDIsIDB4MTAxMjA0LAorCTB4MjQxMjA2LCAweDAwMDU3NSwgMHgwODEyMDQsIDB4MDAwMDA3LAorCTB4MTAwMTAyLCAweDAwMDU3NSwgMHgwMDA0MjUsIDB4MDIxMTI0LAorCTB4MTAwMTAyLCAweDAwMDgyMCwgMHgwMzEwNjAsIDB4MDEwMDQwLAorCTB4MDAxOTI0LCAweDJBMDA4NiwgMHgwMDAwOEQsIDB4MDAwNDY0LAorCTB4MDA5RDA0LCAweDI5MTA4NiwgMHgxODAxMDIsIDB4MDAwNTc1LAorCTB4MDEwMDQyLCAweDI4MDQwQSwgMHgwMDAxOEQsIDB4MDAwOTI0LAorCTB4MjgwRDAyLCAweDAwMDAwRCwgMHgwMDA5MjQsIDB4MjgxNTAyLAorCTB4MTAwMDBELCAweDAwMDgyMCwgMHgwMDAyRjUsIDB4MDEwMDQwLAorCTB4MjAwMDA3LCAweDAwMTE3NSwgMHgwMDAyRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgyNEZBODYsIDB4MDAwMDA3LAorCTB4MDAwMTAwLCAweDA4MEIyMCwgMHgxMzBCNjAsIDB4MUIwQjYwLAorCTB4MDMwQTYwLCAweDAxMDA0MCwgMHgwNTAwNDIsIDB4M0QwMDRBLAorCTB4MzUwMDRBLCAweDJEMDA0QSwgMHgyMDAwMEEsIDB4MDAwNkY1LAorCTB4MDEwMDQyLCAweDI4MTQwQSwgMHgwMDA0RjUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMDMxNSwgMHgwMTBEMDQsIDB4MjYwMjg2LAorCTB4MDA0MDE1LCAweDAwMDA5NSwgMHgwMTBEMDQsIDB4MjVGMDg2LAorCTB4MTAwMDIyLCAweDEwMDAyQSwgMHgyNjFBMDYsIDB4MDAwMDA3LAorCTB4MzMzMTA0LCAweDJBQTkwNCwgMHgwMDAwMDcsIDB4MDMyMTI0LAorCTB4MjgwNTAyLCAweDI4NDQwMiwgMHgwMDExMjQsIDB4NDAwMTAyLAorCTB4MDAwNDI0LCAweDAwMDQyNCwgMHgwMDMyMjQsIDB4MDAyOTJDLAorCTB4MDA2MzZDLCAweDI3NzM4NiwgMHgwMDAwMDcsIDB4MDJCMTY0LAorCTB4MDAwNDY0LCAweDAwMDQ2NCwgMHgwMDAwOEQsIDB4MDAwQTY0LAorCTB4MjgwRDAyLCAweDEwMDA4RCwgMHgwMDA4MjAsIDB4MDAwMkY1LAorCTB4MDEwMDQwLCAweDIyMDAwNywgMHgwMDAwOEQsIDB4MzhCOTA0LAorCTB4MDAwMDA3LCAweDAzMjk2QywgMHgzMDAxMEEsIDB4MDAwMkY1LAorCTB4MDEwMDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MjcwMjg2LAorCTB4MDAwMDA3LCAweDAwMjEyQywgMHgyODA1MEEsIDB4MDAzMTZDLAorCTB4MDAwNDZDLCAweDAwMDQ2QywgMHgyODQ1MEEsIDB4MDAxMTI0LAorCTB4MDA2QjY0LCAweDEwMDEwMiwgMHgwMDAwOEQsIDB4MDEwOTZDLAorCTB4MjgwRDBBLCAweDEwMDEwRCwgMHgwMDA4MjAsIDB4MDAwMkY1LAorCTB4MDEwMDQwLCAweDIyMDAwNywgMHgwMDQxMjQsIDB4MDAwNDI0LAorCTB4MDAwNDI0LCAweDAwMzIyNCwgMHgzMDAxMDIsIDB4MDMyOTQ0LAorCTB4MjdGQTg2LCAweDAwMDAwNywgMHgzMDAwMDIsIDB4MDAwNEY1LAorCTB4MDEwMDQyLCAweDA4MDAwQSwgMHgwMDAzMTUsIDB4MDEwRDA0LAorCTB4Mjg0MDg2LCAweDAwMzEyNCwgMHgwMDA0NjQsIDB4MzAwMTAyLAorCTB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4Mjg0QTg2LCAweDAwMDAwNywgMHgyODQ0MDIsIDB4MDAzMTI0LAorCTB4MzAwNTAyLCAweDAwMzkyNCwgMHgzMDA1ODMsIDB4MDAwODgzLAorCTB4MDAwNUY1LCAweDAxMDA0MiwgMHgyODA0MEEsIDB4MDAwMDhELAorCTB4MDA4MTI0LCAweDI4MEQwMiwgMHgwMDAwOEQsIDB4MDA4MTI0LAorCTB4MjgxNTAyLCAweDEwMDE4RCwgMHgwMDA4MjAsIDB4MDAwMkY1LAorCTB4MDEwMDQwLCAweDIyMDAwNywgMHgwMDEwMjUsIDB4MDAwNTc1LAorCTB4MDMwMDQyLCAweDA5MDA0QSwgMHgxMDAwMEEsIDB4MEEwOTA0LAorCTB4MTIxMTA0LCAweDAwMDAwNywgMHgwMDEwMjAsIDB4MDUwODYwLAorCTB4MDUwMDQwLCAweDAwMDZGRCwgMHgwMTgwNDIsIDB4MDkwMDRBLAorCTB4MTAwMDBBLCAweDAwMDBBNSwgMHgwQTA5MDQsIDB4MTIxMTA0LAorCTB4MDAwMDA3LCAweDAwMDgyMCwgMHgwMTkwNjAsIDB4MDEwMDQwLAorCTB4MDAwMkY1LCAweDAxMDA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MjlDQTg2LCAweDAwMDAwNywgMHgyNDQyMDYsIDB4MDAwMDA3LAorCTB4MDAwNjA2LCAweDAwMDAwNywgMHgwMDAyRjUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMDkwNCwgMHgyQTFBODYsIDB4MDAwMDA3LAorCTB4MDAwMTAwLCAweDA4MEIyMCwgMHgxMzhCNjAsIDB4MUI4QjYwLAorCTB4MjM4QjYwLCAweDJCOEI2MCwgMHgzMzhCNjAsIDB4M0I4QjYwLAorCTB4NDM4QjYwLCAweDRCOEI2MCwgMHg1MzhCNjAsIDB4NUI4QjYwLAorCTB4NjM4QjYwLCAweDZCOEI2MCwgMHg3MzhCNjAsIDB4N0I4QjYwLAorCTB4MDM4RjYwLCAweDBCOEY2MCwgMHgxMzhGNjAsIDB4MUI4RjYwLAorCTB4MjM4RjYwLCAweDJCOEY2MCwgMHgzMzhGNjAsIDB4M0I4RjYwLAorCTB4NDM4RjYwLCAweDRCOEY2MCwgMHg1MzhGNjAsIDB4NUI4RjYwLAorCTB4NjM4RjYwLCAweDZCOEY2MCwgMHg3MzhGNjAsIDB4N0I4RjYwLAorCTB4MDM4QTYwLCAweDAwMDYwNiwgMHgwMTgwNDAsIDB4MDAwMDhELAorCTB4MDAwQTY0LCAweDI4MEQwMiwgMHgwMDBBMjQsIDB4MDAwMjdELAorCTB4MDE4MDQyLCAweDEwMDAwQSwgMHgwMDEyMjQsIDB4MDAwM0ZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MkMwQTg2LAorCTB4MDAwMDA3LCAweDAwMDE4RCwgMHgwMDBBMjQsIDB4MDAwNDY0LAorCTB4MDAwNDY0LCAweDA4MDEwMiwgMHgwMDA5MjQsIDB4MDAwNDI0LAorCTB4MDAwNDI0LCAweDEwMDEwMiwgMHgwMjAwMEQsIDB4MDA5MTQ0LAorCTB4MkM2MTg2LCAweDAwMDAwNywgMHgwMDAxRkQsIDB4MDE4MDQyLAorCTB4MDgwMDBBLCAweDAwMEE0NCwgMHgyQzQzODYsIDB4MDE4MDQyLAorCTB4MEEwMDBELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwMDI3RCwgMHgwMDEwMjAsIDB4MDAwNjA2LAorCTB4MDE4MDQwLCAweDAwMDJGNSwgMHgwMTAwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDJDQjI4NiwgMHgwMDAwMDcsIDB4MDAwMzdELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4MkNFMjg2LAorCTB4MDAwMDA3LCAweDAwMDA3NSwgMHgwMDJFN0QsIDB4MDEwMDQyLAorCTB4MEI4MDRBLCAweDAwMDAyMCwgMHgwMDA5MDQsIDB4MDAwNjg2LAorCTB4MDEwMDQwLCAweDMxODQ0QSwgMHgzMDA0OEIsIDB4MDAwODgzLAorCTB4MDAwMDhELCAweDAwMDgxMCwgMHgyODE0M0EsIDB4MDAwMDhELAorCTB4MDAwODEwLCAweDI4MEMzQSwgMHgwMDA2NzUsIDB4MDEwMDQyLAorCTB4MDgwMDBBLCAweDAwMzgxNSwgMHgwMTA5MjQsIDB4MjgwNTAyLAorCTB4MEIwMDBELCAweDAwMDgyMCwgMHgwMDAyRjUsIDB4MDEwMDQwLAorCTB4MDAwNjA2LCAweDIyMDAwNywgMHgwMDA0NjQsIDB4MDAwNDY0LAorCTB4MDAwNjA2LCAweDAwMDAwNywgMHgwMDAxMzQsIDB4MDA3RjhELAorCTB4MDAwOTNDLCAweDI4MUQxMiwgMHgyODI1MTIsIDB4MDAxRjMyLAorCTB4MEUwMDA3LCAweDAwMDEwRCwgMHgwMDAzN0QsIDB4MDAwODIwLAorCTB4MDE4MDQwLCAweDA1RDJGNCwgMHgwMDAwMDcsIDB4MDgwMDA3LAorCTB4MDAwMzdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MkU4QTg2LCAweDAwMDAwNywgMHgwMDA2MDYsIDB4MDAwMDA3LAorCTB4MDAwMDA3LCAweDAwMDAxMiwgMHgxMDAwMDcsIDB4MzIwMDA3LAorCTB4NjAwMDA3LCAweDQ2MDAwNywgMHgxMDAwODAsIDB4NDgwMDFBLAorCTB4MDA0OTA0LCAweDJFRjE4NiwgMHgwMDAwMDcsIDB4MDAxMjEwLAorCTB4NTgwMDNBLCAweDAwMDE0NSwgMHg1QzVEMDQsIDB4MDAwMDA3LAorCTB4MDAwMDgwLCAweDQ4MDAxQSwgMHgwMDQ5MDQsIDB4MkY0MTg2LAorCTB4MDAwMDA3LCAweDAwMTIxMCwgMHg1MDAwM0EsIDB4MDA1OTA0LAorCTB4MkY5ODg2LCAweDAwMDA0NSwgMHgwMDAwQzUsIDB4N0ZGRkY1LAorCTB4N0ZGRjdELCAweDA3RDUyNCwgMHgwMDQyMjQsIDB4NTAwMTAyLAorCTB4MjAwNTAyLCAweDAwMDA4MiwgMHg0MDAwMUEsIDB4MDA0MTA0LAorCTB4MkZDOTg2LCAweDAwMDAwNywgMHgwMDM4NjUsIDB4NDAwMDFBLAorCTB4MDA0MDIwLCAweDAwMTA0RCwgMHgwNEMxODQsIDB4MzFBQjg2LAorCTB4MDAwMDQwLCAweDA0MDAwNywgMHgwMDAxNjUsIDB4MDAwMTQ1LAorCTB4MDA0MDIwLCAweDAwMDA0MCwgMHgwMDA3NjUsIDB4MDgwMDgwLAorCTB4NDAwMDFBLCAweDAwNDEwNCwgMHgzMDU5ODYsIDB4MDAwMDA3LAorCTB4MDAxMjEwLCAweDQwMDAzQSwgMHgwMDQxMDQsIDB4MzBCMjg2LAorCTB4MDAwMDRELCAweDAwMDBDRCwgMHgwMDQ4MTAsIDB4MjAwNDNBLAorCTB4MDAwODgyLCAweDQwMDAxQSwgMHgwMDQxMDQsIDB4MzBDMTg2LAorCTB4MDAwMDA3LCAweDAwNDgyMCwgMHgwMDU5MDQsIDB4MzE5ODg2LAorCTB4MDAwMDQwLCAweDAwMDdFNSwgMHgyMDA0ODAsIDB4MjgxNkEwLAorCTB4MzIxNkUwLCAweDNBMTZFMCwgMHg0MjE2RTAsIDB4MDIxMjYwLAorCTB4MDAwMDQwLCAweDAwMDAzMiwgMHg0MDAwNzUsIDB4MDAwMDdELAorCTB4MDdENTc0LCAweDIwMDUxMiwgMHgwMDAwODIsIDB4NDAwMDFBLAorCTB4MDA0MTA0LCAweDMxNzE4NiwgMHgwMDAwMDcsIDB4MDM4QTA2LAorCTB4NjQwMDA3LCAweDAwMDBFNSwgMHgwMDAwMjAsIDB4MDAwMDQwLAorCTB4MDAwQTY1LCAweDAwMDAyMCwgMHgwMjAwNDAsIDB4MDIwMDQwLAorCTB4MDAwMDQwLCAweDAwMDE2NSwgMHgwMDAwNDIsIDB4NzAwMDBBLAorCTB4MDA3MTA0LCAweDMyMzI4NiwgMHgwMDAwMDcsIDB4MDYwMDA3LAorCTB4MDE5QTA2LCAweDY0MDAwNywgMHgwNTAwMDAsIDB4MDA3MDIwLAorCTB4MDAwMDQwLCAweDAzOEEwNiwgMHg2NDAwMDcsIDB4MDAwMDA3LAorCTB4MDAzMDZELCAweDAyODg2MCwgMHgwMjkwNjAsIDB4MDgwMDBBLAorCTB4MDI4ODYwLCAweDAwODA0MCwgMHgxMDAwMTIsIDB4MDAxMDBELAorCTB4MDA5MTg0LCAweDMyRDE4NiwgMHgwMDBFMEQsIDB4MDA5MTg0LAorCTB4MzNFMTg2LCAweDAwMDAwNywgMHgzMDAwMDcsIDB4MDAxMDIwLAorCTB4MDAzQjZELCAweDAwODA0MCwgMHgwMDAwODAsIDB4MDgwMDFBLAorCTB4MDAwOTA0LCAweDMyRjE4NiwgMHgwMDAwMDcsIDB4MDAxMjIwLAorCTB4MDAwREVELCAweDAwODA0MCwgMHgwMDgwNDIsIDB4MTAwMDBBLAorCTB4NDAwMDBELCAweDEwOTU0NCwgMHgwMDAwMDcsIDB4MDAxMDIwLAorCTB4MDAwREVELCAweDAwODA0MCwgMHgwMDgwNDIsIDB4MjAwNDBBLAorCTB4MDAwMDgyLCAweDA4MDAxQSwgMHgwMDA5MDQsIDB4MzM4MTg2LAorCTB4MDAwMDA3LCAweDAwM0I2RCwgMHgwMDgwNDIsIDB4MDgwMDBBLAorCTB4MDAwRTE1LCAweDAxMDk4NCwgMHgzNDJCODYsIDB4NjAwMDA3LAorCTB4MDgwMDFBLCAweDAwMEMxNSwgMHgwMTA5ODQsIDB4MzQxMzg2LAorCTB4MDAwMDIwLCAweDFBMDAwNywgMHgwMDAyRUQsIDB4MDA4MDQwLAorCTB4NjIwMDA3LCAweDAwMzA2RCwgMHgwMjgwNDIsIDB4MEE4MDRBLAorCTB4MDAwODIwLCAweDBBODA0QSwgMHgwMDA2MDYsIDB4MTA4MDRBLAorCTB4MDAwMDA3LCAweDI4MjUxMiwgMHgwMDFGMzIsIDB4MDVEMkY0LAorCTB4NTREMTA0LCAweDAwNzM1QywgMHgwMDA3ODYsIDB4MDAwMDA3LAorCTB4MEMwMDA3LCAweDBBMDAwNywgMHgxQzAwMDcsIDB4MDAzNDY1LAorCTB4MDIwMDQwLCAweDAwNDgyMCwgMHgwMjUwNjAsIDB4NDAwMDBBLAorCTB4MDI0MDYwLCAweDAwMDA0MCwgMHg0NTQ5NDQsIDB4MDAwMDA3LAorCTB4MDA0MDIwLCAweDAwM0FFNSwgMHgwMDAwNDAsIDB4MDAyOEU1LAorCTB4MDAwMDQyLCAweDQ4MDAwQSwgMHgwMDQ5MDQsIDB4MzlGODg2LAorCTB4MDAyQzY1LCAweDAwMDA0MiwgMHg0MDAwMEEsIDB4MDAwMEQ1LAorCTB4NDU0MTA0LCAweDAwMDAwNywgMHgwMDA2NTUsIDB4MDU0NTA0LAorCTB4MzY4Mjg2LCAweDAwMDFENSwgMHgwNTQ1MDQsIDB4MzY4MDg2LAorCTB4MDAyQjY1LCAweDAwMDA0MiwgMHgwMDNBRTUsIDB4NTAwMDRBLAorCTB4NDAwMDBBLCAweDQ1QzNENCwgMHgwMDAwMDcsIDB4NDU0NTA0LAorCTB4MDAwMDA3LCAweDAwMDBDRCwgMHg0NDQ5NDQsIDB4MDAwMDA3LAorCTB4NDU0NTA0LCAweDAwMDAwNywgMHgwMDAxNEQsIDB4NTU0OTQ0LAorCTB4MDAwMDA3LCAweDA0NTE0NCwgMHgzNjc5ODYsIDB4MDAyQzY1LAorCTB4MDAwMDQyLCAweDQ4MDAwQSwgMHg0Q0QxMDQsIDB4MDAwMDA3LAorCTB4MDRDMTQ0LCAweDM2ODM4NiwgMHgwMDAwMDcsIDB4MTYwMDA3LAorCTB4MDAyQ0U1LCAweDA0MDA0MiwgMHg0MDAwMEEsIDB4MDA0MDIwLAorCTB4MDAwMDQwLCAweDAwMjk2NSwgMHgwMDAwNDIsIDB4NDAwMDBBLAorCTB4MDA0MTA0LCAweDM2RjA4NiwgMHgwMDAwMDcsIDB4MDAyNDAyLAorCTB4MzgzMjA2LCAweDAwNUMwMiwgMHgwMDI1RTUsIDB4MDAwMDQyLAorCTB4NDAwMDBBLCAweDAwNDI3NCwgMHgwMDJBRTUsIDB4MDAwMDQyLAorCTB4NDAwMDBBLCAweDAwNDI3NCwgMHg1MDAxMTIsIDB4MDAyOUU1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQyMzQsIDB4NDU0MTA0LAorCTB4MDAwMDA3LCAweDAwNDAyMCwgMHgwMDAwNDAsIDB4MDAzRUU1LAorCTB4MDAwMDIwLCAweDAwMDA0MCwgMHgwMDJERTUsIDB4NDAwMTUyLAorCTB4NTAwMDBBLCAweDA0NTE0NCwgMHgzN0RBODYsIDB4MDAwMEM1LAorCTB4MDAzRUU1LCAweDAwNDAyMCwgMHgwMDAwNDAsIDB4MDAyQkU1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHg0MDQyNTQsIDB4MDAwMDA3LAorCTB4MDAyQUU1LCAweDAwNDAyMCwgMHgwMDAwNDAsIDB4NTAwMTMyLAorCTB4MDQwMTM0LCAweDAwNTY3NCwgMHgwMDI5RTUsIDB4MDIwMDQyLAorCTB4NDIwMDBBLCAweDAwMDA0MiwgMHg1MDAwMEEsIDB4MDU0MTdDLAorCTB4MDAyOEU1LCAweDAwMDA0MiwgMHg0ODAwMEEsIDB4MDAwMEM1LAorCTB4NENDMTQ0LCAweDM4QTA4NiwgMHgwMDI2RTUsIDB4MDAyN0U1LAorCTB4MDIwMDQyLCAweDQwMDA0QSwgMHg1MDAwMEEsIDB4MDA0MjNDLAorCTB4MDA1NjdDLCAweDAwMjhFNSwgMHgwMDQ4MjAsIDB4MDAwMDQwLAorCTB4MjgxRDEyLCAweDI4MjUxMiwgMHgwMDFGNzIsIDB4MDAyOTY1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQxMDQsIDB4MzkzQTg2LAorCTB4MEUwMDA3LCAweDE2MDAwNywgMHgxRTAwMDcsIDB4MDAzRUU1LAorCTB4MDAwMDQyLCAweDQwMDAwQSwgMHgwMDQxMDQsIDB4Mzk3ODg2LAorCTB4MDAyRDY1LCAweDAwMDA0MiwgMHgyODM0MEEsIDB4MDAzNDY1LAorCTB4MDIwMDQyLCAweDQyMDA0QSwgMHgwMDQwMjAsIDB4NEEwMDRBLAorCTB4NTAwMDRBLCAweDA1RDJGNCwgMHg1NEQxMDQsIDB4MDA3MzVDLAorCTB4MzlFMTg2LCAweDAwMDAwNywgMHgwMDA2MDYsIDB4MDgwMDA3LAorCTB4MEMwMDA3LCAweDA4MDAwNywgMHgwQTAwMDcsIDB4MDAwMUU1LAorCTB4MDIwMDQ1LCAweDAwNDAyMCwgMHgwMDAwNjAsIDB4MDAwMzY1LAorCTB4MDAwMDQwLCAweDAwMkU2NSwgMHgwMDFBMjAsIDB4MEExQTYwLAorCTB4MDAwMDQwLCAweDAwMzQ2NSwgMHgwMjAwNDIsIDB4NDIwMDRBLAorCTB4MDA0MDIwLCAweDRBMDA0QSwgMHgwMDA2MDYsIDB4NTAwMDRBLAorCTB4MDAxN0ZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4MjI1QTg2LCAweDAwMDAwNywgMHgwMDEwN0QsIDB4MDE4MDQyLAorCTB4MDAxMUZELCAweDMzODA0QSwgMHgxOTgwNEEsIDB4MjAwMDBBLAorCTB4MDAwMDk1LCAweDJBMTE0NCwgMHgwMUExNDQsIDB4M0I5MDg2LAorCTB4MDAwNDBELCAweDAwQjE4NCwgMHgzQjkxODYsIDB4MDAxOEZELAorCTB4MDE4MDQyLCAweDAwMTBGRCwgMHgwOTgwNEEsIDB4MzgwMDBBLAorCTB4MDAwMDk1LCAweDAxMDkyNCwgMHgwMDNBNjQsIDB4M0I4MTg2LAorCTB4MDAwMDA3LCAweDAwMzkwNCwgMHgzQjkyODYsIDB4MDAwMDA3LAorCTB4M0I5QTA2LCAweDAwMDAwRCwgMHgwMDAwOEQsIDB4MDAwODIwLAorCTB4MDAzODdELCAweDAxODA0MCwgMHg3MDAwMDIsIDB4MDAxMTdELAorCTB4MDE4MDQyLCAweDAwMTk3RCwgMHgyOTgwNEEsIDB4MzAwMDBBLAorCTB4MzgwMDAyLCAweDAwMzEyNCwgMHgwMDA0MjQsIDB4MDAwNDI0LAorCTB4MDAyQTI0LCAweDI4MDUwMiwgMHgwMDA2OEQsIDB4MDAwODEwLAorCTB4MjgxNDNBLCAweDAwNzUwRCwgMHgwMEIxMjQsIDB4MDAyMjY0LAorCTB4M0QwMzg2LCAweDI4NDQwMiwgMHgwMDA4MTAsIDB4MjgwQzNBLAorCTB4MEI4MDBELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwNzU4RCwgMHgwMEIxMjQsIDB4MTAwMTAyLAorCTB4MDEyMTQ0LCAweDNFNDk4NiwgMHgwMDE4MTAsIDB4MTAwMDNBLAorCTB4MDAzODdELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4M0U0ODg2LCAweDAzMDAwMCwgMHgzRTRBMDYsIDB4MDAwMEJELAorCTB4MDAwMDhELCAweDAyMzE2NCwgMHgwMDBBNjQsIDB4MjgwRDAyLAorCTB4MEI4MDhELCAweDAwMDgyMCwgMHgwMDAyRkQsIDB4MDE4MDQwLAorCTB4MjAwMDA3LCAweDAwMzg3RCwgMHgwMTgwNDIsIDB4MDgwMDBBLAorCTB4MDAwOTA0LCAweDNFMzI4NiwgMHgwMzAwMDAsIDB4MDAwMkZELAorCTB4MDE4MDQyLCAweDA4MDAwQSwgMHgwMDA5MDQsIDB4M0Q4Mjg2LAorCTB4MDAwMDA3LCAweDAwMjgxMCwgMHgyODA0M0EsIDB4MDA3NTBELAorCTB4MDMwOTI0LCAweDAwMjI2NCwgMHgyODBEMDIsIDB4MDIzMTZDLAorCTB4Mjg0NTBBLCAweDBCODEwRCwgMHgwMDA4MjAsIDB4MDAwMkZELAorCTB4MDE4MDQwLCAweDIwMDAwNywgMHgwMDAwOEQsIDB4MDAwQTI0LAorCTB4M0U0QTA2LCAweDEwMDEwMiwgMHgwMDE4MTAsIDB4MTAwMDNBLAorCTB4MDAwMEJELCAweDAwMzgxMCwgMHgzMDA0M0EsIDB4MDAxODdELAorCTB4MDE4MDQyLCAweDAwMThGRCwgMHgwOTgwNEEsIDB4MjAwMDBBLAorCTB4MDAwMEFELCAweDAyODkyNCwgMHgwNzIxMkMsIDB4MDAxMDEwLAorCTB4MzAwNTgzLCAweDMwMEQ4QiwgMHgzMDE0QkIsIDB4MzAxQzgzLAorCTB4MDAyMDgzLCAweDAwMTM3RCwgMHgwMzgwNDIsIDB4MzM4NDRBLAorCTB4MzNBQ0NCLCAweDMzQjRDQiwgMHgzM0JDQ0IsIDB4MzNDNENCLAorCTB4MzNDQ0NCLCAweDMzRDRDQiwgMHgzMDVDOEIsIDB4MDA2MDgzLAorCTB4MDAxRTBELCAweDAwMDVGRCwgMHgwMTgwNDIsIDB4MjAwMDBBLAorCTB4MDIwOTI0LCAweDAwMDY4RCwgMHgwMEE5NkMsIDB4MDAwMDlELAorCTB4MDAwMkZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4M0Y2QTg2LCAweDAwMDAwNywgMHgyODA1MDIsIDB4MjgwRDBBLAorCTB4Mjg0NDAyLCAweDAwMTgxMCwgMHgyODE0M0EsIDB4MEMwMDhELAorCTB4MDAwODIwLCAweDAwMDJGRCwgMHgwMTgwNDAsIDB4MjIwMDA3LAorCTB4MDAzOTA0LCAweDIyNTg4NiwgMHgwMDFFMEQsIDB4MDAwNTdELAorCTB4MDE4MDQyLCAweDIwMDAwQSwgMHgwMjA5MjQsIDB4MDAwMEE1LAorCTB4MDAwMkZELCAweDAxODA0MiwgMHgwODAwMEEsIDB4MDAwOTA0LAorCTB4NDAyQTg2LCAweDAwMDAwNywgMHgyODA1MDIsIDB4MjgwQzAyLAorCTB4MDAyMDEwLCAweDI4MTQzQSwgMHgwQzAxMEQsIDB4MDAwODIwLAorCTB4MDAwMkZELCAweDAxODA0MCwgMHgyMjVBMDYsIDB4MjIwMDA3LAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwLAorCTB4MDAwMDAwLCAweDAwMDAwMCwgMHgwMDAwMDAsIDB4MDAwMDAwCit9OworCisjZW5kaWYJLy9fSFdNQ09ERV8KZGlmZiAtLWdpdCBhL3NvdW5kL29zcy95c3MyMjUuYyBiL3NvdW5kL29zcy95c3MyMjUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzAwNDAwCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvb3NzL3lzczIyNS5jCkBAIC0wLDAgKzEsMzE5IEBACisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorCit1bnNpZ25lZCBjaGFyIHBhZ2VfemVyb1tdIF9faW5pdGRhdGEgPSB7CisweDAxLCAweDdjLCAweDAwLCAweDFlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGY1LCAweDAwLAorMHgxMSwgMHgwMCwgMHgyMCwgMHgwMCwgMHgzMiwgMHgwMCwgMHg0MCwgMHgwMCwgMHgxMywgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MTQsIDB4MDIsIDB4NzYsIDB4MDAsIDB4NjAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTgsIDB4MDAsIDB4MTksCisweDAxLCAweDFhLCAweDAxLCAweDIwLCAweDAxLCAweDQwLCAweDAxLCAweDE3LCAweDAwLCAweDAwLCAweDAxLAorMHg4MCwgMHgwMSwgMHgyMCwgMHgwMCwgMHgxMCwgMHgwMSwgMHhhMCwgMHgwMywgMHhkMSwgMHgwMCwgMHgwMCwKKzB4MDEsIDB4ZjIsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZjQsIDB4MDIsCisweGUwLCAweDAwLCAweDE1LCAweDAwLCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDE3LAorMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg1MCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzEsIDB4MDIsIDB4MDAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MDAsCisweDAwLCAweDkyLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDAwLCAweDAwLCAweDAwLCAweGIzLCAweDAyLAorMHgwMCwgMHgwMCwgMHhhMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg0MCwKKzB4MDAsIDB4ODAsIDB4MDAsIDB4ZjUsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NzAsIDB4MDAsIDB4YTAsIDB4MDIsCisweDExLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDIwLAorMHgwMiwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgxNywgMHgwMCwgMHgxYiwgMHgwMCwKKzB4MWQsIDB4MDIsIDB4ZGYKK307ICAgIAorCit1bnNpZ25lZCBjaGFyIHBhZ2Vfb25lW10gX19pbml0ZGF0YSA9IHsKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MTksIDB4MDAsCisweDFmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweGQ4LCAweDAwLCAweDAwLAorMHgwMiwgMHgyMCwgMHgwMCwgMHgxOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMSwKKzB4YzAsIDB4MDEsIDB4ZmEsIDB4MDAsIDB4MWEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHg0MCwgMHgwMiwgMHg2MCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4YzAsIDB4MDIsIDB4ODAsIDB4MDAsCisweDAwLCAweDAyLCAweGZiLCAweDAyLCAweGEwLCAweDAwLCAweDAwLCAweDAwLCAweDFiLCAweDAyLCAweGQ3LAorMHgwMCwgMHgwMCwgMHgwMiwgMHhmNywgMHgwMywgMHgyMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MWMsIDB4MDMsIDB4M2MsIDB4MDAsIDB4MDAsIDB4MDMsIDB4M2YsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YzAsCisweDAwLCAweDAwLCAweDAzLCAweGRmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDVkLCAweDAwLAorMHgwMCwgMHgwMywgMHhjMCwgMHgwMCwgMHgwMCwgMHgwMywgMHg3ZCwgMHgwMCwgMHgwMCwgMHgwMywgMHhjMCwKKzB4MDAsIDB4MDAsIDB4MDMsIDB4OWUsIDB4MDAsIDB4MDAsIDB4MDMsIDB4YzAsIDB4MDAsIDB4MDAsIDB4MDMsCisweGJlLCAweDAwLCAweDAwLCAweDAzLCAweGMwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgxYiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwKKzB4ZGIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4ZGIsIDB4MDAsIDB4MDAsIDB4MDIsIDB4ZTAsIDB4MDAsIDB4MDAsCisweDAyLCAweGZiLCAweDAwLCAweDAwLCAweDAyLCAweGMwLCAweDAyLCAweDQwLCAweDAyLCAweGZiLCAweDAyLAorMHg2MCwgMHgwMCwgMHgxYgorfTsKKwordW5zaWduZWQgY2hhciBwYWdlX3R3b1tdIF9faW5pdGRhdGEgPSB7CisweGM0LCAweDAwLCAweDQ0LCAweDA3LCAweDQ0LCAweDAwLCAweDQwLCAweDI1LCAweDAxLCAweDA2LCAweGM0LAorMHgwNywgMHg0MCwgMHgyNSwgMHgwMSwgMHgwMCwgMHg0NiwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDYsIDB4MDcsCisweDA1LCAweDA1LCAweDA1LCAweDA0LCAweDA3LCAweDA1LCAweDA0LCAweDA3LCAweDA1LCAweDQ0LCAweDQ2LAorMHg0NCwgMHg0NiwgMHg0NiwgMHgwNywgMHgwNSwgMHg0NCwgMHg0NiwgMHgwNSwgMHg0NiwgMHgwNSwgMHg0NiwKKzB4MDUsIDB4NDYsIDB4MDUsIDB4NDQsIDB4NDYsIDB4MDUsIDB4MDcsIDB4NDQsIDB4NDYsIDB4MDUsIDB4MDcsCisweDQ0LCAweDQ2LCAweDA1LCAweDA3LCAweDQ0LCAweDQ2LCAweDA1LCAweDA3LCAweDQ0LCAweDA1LCAweDA1LAorMHgwNSwgMHg0NCwgMHgwNSwgMHgwNSwgMHgwNSwgMHg0NiwgMHgwNSwgMHg0NiwgMHgwNSwgMHg0NiwgMHgwNSwKKzB4NDYsIDB4MDUsIDB4NDYsIDB4MDcsIDB4NDYsIDB4MDcsIDB4NDQKK307CisKK3Vuc2lnbmVkIGNoYXIgcGFnZV90aHJlZVtdIF9faW5pdGRhdGEgPSB7CisweDA3LCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQ3LCAweDAwLCAweDQwLCAweDAwLCAweDQwLCAweDA2LAorMHg0MCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4ODAsCisweGMwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDQwLCAweDAwLAorMHg2MCwgMHgwMCwgMHg3MCwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MiwgMHgwMCwgMHg0MCwKKzB4MDAsIDB4MDIsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLCAweDAwLCAweDQwLCAweDAwLCAweDAwLAorMHgwMCwgMHg0MiwgMHgwMCwgMHg0MCwgMHgwMCwgMHg0MiwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMiwgMHgwMCwKKzB4MDIsIDB4MDAsIDB4NDIsIDB4MDAsIDB4YzAsIDB4MDAsIDB4NDAKK307CisKK3Vuc2lnbmVkIGNoYXIgcGFnZV9mb3VyW10gX19pbml0ZGF0YSA9IHsKKzB4NjMsIDB4MDMsIDB4MjYsIDB4MDIsIDB4MmMsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MmUsIDB4MDIsIDB4MDIsCisweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwKKzB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MjAsCisweDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDIwLCAweDAwLCAweDYwLCAweDAwLAorMHgyMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg2MCwgMHgwMCwgMHgyMCwgMHgwMCwgMHg2MCwKKzB4MDAsIDB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4NjAsIDB4MDAsIDB4MjAsIDB4MDAsCisweDIwLCAweDAwLCAweDIyLCAweDAyLCAweDIyLCAweDAyLCAweDIwLCAweDAwLCAweDYwLCAweDAwLCAweDIyLAorMHgwMiwgMHg2MiwgMHgwMiwgMHgyMCwgMHgwMSwgMHgyMSwgMHgwMQorfTsKKwordW5zaWduZWQgY2hhciBwYWdlX3NpeFtdIF9faW5pdGRhdGEgPSB7CisweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDA2LCAweDAwLAorMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwYSwgMHgwMCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwZSwKKzB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MTIsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsCisweDE2LCAweDAwLCAweDAwLCAweDE4LCAweDAwLCAweDAwLCAweDFhLCAweDAwLCAweDAwLCAweDFjLCAweDAwLAorMHgwMCwgMHgxZSwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgyMiwgMHgwMCwgMHgwMCwgMHgyNCwKKzB4MDAsIDB4MDAsIDB4MjYsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MmEsIDB4MDAsIDB4MDAsCisweDJjLCAweDAwLCAweDAwLCAweDJlLCAweDAwLCAweDAwLCAweDMwLCAweDAwLCAweDAwLCAweDMyLCAweDAwLAorMHgwMCwgMHgzNCwgMHgwMCwgMHgwMCwgMHgzNiwgMHgwMCwgMHgwMCwgMHgzOCwgMHgwMCwgMHgwMCwgMHgzYSwKKzB4MDAsIDB4MDAsIDB4M2MsIDB4MDAsIDB4MDAsIDB4M2UsIDB4MDAsIDB4MDAsIDB4NDAsIDB4MDAsIDB4MDAsCisweDQyLCAweDAzLCAweDAwLCAweDQ0LCAweDAxLCAweDAwLCAweDQ2LCAweDBhLCAweDIxLCAweDQ4LCAweDBkLAorMHgyMywgMHg0YSwgMHgyMywgMHgxYiwgMHg0YywgMHgzNywgMHg4ZiwgMHg0ZSwgMHg0NSwgMHg3NywgMHg1MCwKKzB4NTIsIDB4ZTIsIDB4NTIsIDB4MWMsIDB4OTIsIDB4NTQsIDB4MWMsIDB4NTIsIDB4NTYsIDB4MDcsIDB4MDAsCisweDU4LCAweDJmLCAweGM2LCAweDVhLCAweDBiLCAweDAwLCAweDVjLCAweDMwLCAweDA2LCAweDVlLCAweDE3LAorMHgwMCwgMHg2MCwgMHgzZCwgMHhkYSwgMHg2MiwgMHgyOSwgMHgwMCwgMHg2NCwgMHgzZSwgMHg0MSwgMHg2NiwKKzB4MzksIDB4MDAsIDB4NjgsIDB4NGMsIDB4NDgsIDB4NmEsIDB4NDksIDB4MDAsIDB4NmMsIDB4NGMsIDB4NmMsCisweDZlLCAweDExLCAweGQyLCAweDcwLCAweDE2LCAweDBjLCAweDcyLCAweDAwLCAweDAwLCAweDc0LCAweDAwLAorMHg4MCwgMHg3NiwgMHgwZiwgMHgwMCwgMHg3OCwgMHgwMCwgMHg4MCwgMHg3YSwgMHgxMywgMHgwMCwgMHg3YywKKzB4ODAsIDB4MDAsIDB4N2UsIDB4ODAsIDB4ODAKK307CisKK3Vuc2lnbmVkIGNoYXIgcGFnZV9zZXZlbltdIF9faW5pdGRhdGEgPSB7CisweDBmLCAweGZmLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDAyLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwKKzB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGYsCisweGZmLCAweDBmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwZiwgMHhmZiwgMHgwZiwgMHhmZiwKKzB4MGYsIDB4ZmYsIDB4MGYsIDB4ZmYsIDB4MDIsIDB4ZTksIDB4MDYsIDB4OGMsIDB4MDYsIDB4OGMsIDB4MGYsCisweGZmLCAweDFhLCAweDc1LCAweDBkLCAweDhiLCAweDA0LCAweGU5LCAweDBiLCAweDE2LCAweDFhLCAweDM4LAorMHgwZCwgMHhjOCwgMHgwNCwgMHg2ZiwgMHgwYiwgMHg5MSwgMHgwZiwgMHhmZiwgMHgwNiwgMHg0MCwgMHgwNiwKKzB4NDAsIDB4MDIsIDB4OGYsIDB4MGYsIDB4ZmYsIDB4MDYsIDB4NjIsIDB4MDYsIDB4NjIsIDB4MDIsIDB4N2IsCisweDBmLCAweGZmLCAweDA2LCAweDk3LCAweDA2LCAweDk3LCAweDAyLCAweDUyLCAweDBmLCAweGZmLCAweDA2LAorMHhmNiwgMHgwNiwgMHhmNiwgMHgwMiwgMHgxOSwgMHgwNSwgMHg1NSwgMHgwNSwgMHg1NSwgMHgwNSwgMHg1NSwKKzB4MDUsIDB4NTUsIDB4MDUsIDB4NTUsIDB4MDUsIDB4NTUsIDB4MDUsIDB4NTUsIDB4MDUsIDB4NTUsIDB4MTQsCisweGRhLCAweDBkLCAweDkzLCAweDA0LCAweGRhLCAweDA1LCAweDkzLCAweDE0LCAweGRhLCAweDBkLCAweDkzLAorMHgwNCwgMHhkYSwgMHgwNSwgMHg5MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDIsIDB4MDAKK307CisKK3Vuc2lnbmVkIGNoYXIgcGFnZV96ZXJvX3YyW10gX19pbml0ZGF0YSA9IHsKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKwordW5zaWduZWQgY2hhciBwYWdlX29uZV92MltdIF9faW5pdGRhdGEgPSB7CisweDAxLCAweGMwLCAweDAxLCAweGZhLCAweDAwLCAweDFhLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307CisKK3Vuc2lnbmVkIGNoYXIgcGFnZV90d29fdjJbXSBfX2luaXRkYXRhID0geworMHg0NiwgMHg0NiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307Cit1bnNpZ25lZCBjaGFyIHBhZ2VfdGhyZWVfdjJbXSBfX2luaXRkYXRhID0geworMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAKK307Cit1bnNpZ25lZCBjaGFyIHBhZ2VfZm91cl92MltdIF9faW5pdGRhdGEgPSB7CisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKKwordW5zaWduZWQgY2hhciBwYWdlX3NldmVuX3YyW10gX19pbml0ZGF0YSA9IHsKKzB4MGYsIDB4ZmYsIDB4MGYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAorMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMAorfTsKK3Vuc2lnbmVkIGNoYXIgbW9kX3YyW10gX19pbml0ZGF0YSA9IHsKKzB4MDEsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDEsIDB4MDIsIDB4MDAsIDB4MDEsIDB4MDIsIDB4MDIsCisweDAwLCAweDAxLCAweDAzLCAweDAyLCAweDAwLCAweDAxLCAweDA0LCAweDAyLCAweDAwLCAweDAxLCAweDA1LAorMHgwMiwgMHgwMCwgMHgwMSwgMHgwNiwgMHgwMiwgMHgwMCwgMHgwMSwgMHgwNywgMHgwMiwgMHgwMCwgMHhiMCwKKzB4MjAsIDB4YjEsIDB4MjAsIDB4YjIsIDB4MjAsIDB4YjMsIDB4MjAsIDB4YjQsIDB4MjAsIDB4YjUsIDB4MjAsCisweGI2LCAweDIwLCAweGI3LCAweDIwLCAweGYwLCAweDIwLCAweGYxLCAweDIwLCAweGYyLCAweDIwLCAweGYzLAorMHgyMCwgMHhmNCwgMHgyMCwgMHhmNSwgMHgyMCwgMHhmNiwgMHgyMCwgMHhmNywgMHgyMCwgMHgxMCwgMHhmZiwKKzB4MTEsIDB4ZmYsIDB4MTIsIDB4ZmYsIDB4MTMsIDB4ZmYsIDB4MTQsIDB4ZmYsIDB4MTUsIDB4ZmYsIDB4MTYsCisweGZmLCAweDE3LCAweGZmLCAweDIwLCAweGZmLCAweDIxLCAweGZmLCAweDIyLCAweGZmLCAweDIzLCAweGZmLAorMHgyNCwgMHhmZiwgMHgyNSwgMHhmZiwgMHgyNiwgMHhmZiwgMHgyNywgMHhmZiwgMHgzMCwgMHgwMCwgMHgzMSwKKzB4MDAsIDB4MzIsIDB4MDAsIDB4MzMsIDB4MDAsIDB4MzQsIDB4MDAsIDB4MzUsIDB4MDAsIDB4MzYsIDB4MDAsCisweDM3LCAweDAwLCAweDQwLCAweDAwLCAweDQxLCAweDAwLCAweDQyLCAweDAwLCAweDQzLCAweDAwLCAweDQ0LAorMHgwMCwgMHg0NSwgMHgwMCwgMHg0NiwgMHgwMCwgMHg0NywgMHgwMCwgMHg1MCwgMHgwMCwgMHg1MSwgMHgwMCwKKzB4NTIsIDB4MDAsIDB4NTMsIDB4MDAsIDB4NTQsIDB4MDAsIDB4NTUsIDB4MDAsIDB4NTYsIDB4MDAsIDB4NTcsCisweDAwLCAweDYwLCAweDAwLCAweDYxLCAweDAwLCAweDYyLCAweDAwLCAweDYzLCAweDAwLCAweDY0LCAweDAwLAorMHg2NSwgMHgwMCwgMHg2NiwgMHgwMCwgMHg2NywgMHgwMCwgMHg3MCwgMHhjMCwgMHg3MSwgMHhjMCwgMHg3MiwKKzB4YzAsIDB4NzMsIDB4YzAsIDB4NzQsIDB4YzAsIDB4NzUsIDB4YzAsIDB4NzYsIDB4YzAsIDB4NzcsIDB4YzAsCisweDgwLCAweDAwLCAweDgxLCAweDAwLCAweDgyLCAweDAwLCAweDgzLCAweDAwLCAweDg0LCAweDAwLCAweDg1LAorMHgwMCwgMHg4NiwgMHgwMCwgMHg4NywgMHgwMCwgMHg5MCwgMHgwMCwgMHg5MSwgMHgwMCwgMHg5MiwgMHgwMCwKKzB4OTMsIDB4MDAsIDB4OTQsIDB4MDAsIDB4OTUsIDB4MDAsIDB4OTYsIDB4MDAsIDB4OTcsIDB4MDAsIDB4YTAsCisweDAwLCAweGExLCAweDAwLCAweGEyLCAweDAwLCAweGEzLCAweDAwLCAweGE0LCAweDAwLCAweGE1LCAweDAwLAorMHhhNiwgMHgwMCwgMHhhNywgMHgwMCwgMHhjMCwgMHgwMCwgMHhjMSwgMHgwMCwgMHhjMiwgMHgwMCwgMHhjMywKKzB4MDAsIDB4YzQsIDB4MDAsIDB4YzUsIDB4MDAsIDB4YzYsIDB4MDAsIDB4YzcsIDB4MDAsIDB4ZDAsIDB4MDAsCisweGQxLCAweDAwLCAweGQyLCAweDAwLCAweGQzLCAweDAwLCAweGQ0LCAweDAwLCAweGQ1LCAweDAwLCAweGQ2LAorMHgwMCwgMHhkNywgMHgwMCwgMHhlMCwgMHgwMCwgMHhlMSwgMHgwMCwgMHhlMiwgMHgwMCwgMHhlMywgMHgwMCwKKzB4ZTQsIDB4MDAsIDB4ZTUsIDB4MDAsIDB4ZTYsIDB4MDAsIDB4ZTcsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDIsCisweDAxLCAweDAxLCAweDAxLCAweDAyLCAweDAxLCAweDAxLCAweDAyLCAweDAyLCAweDAxLCAweDAxLCAweDAzLAorMHgwMiwgMHgwMSwgMHgwMSwgMHgwNCwgMHgwMiwgMHgwMSwgMHgwMSwgMHgwNSwgMHgwMiwgMHgwMSwgMHgwMSwKKzB4MDYsIDB4MDIsIDB4MDEsIDB4MDEsIDB4MDcsIDB4MDIsIDB4MDEKK307Cit1bnNpZ25lZCBjaGFyIGNvZWZmaWNpZW50c1tdIF9faW5pdGRhdGEgPSB7CisweDA3LCAweDQ2LCAweDAwLCAweDAwLCAweDA3LCAweDQ5LCAweDAwLCAweDAwLCAweDAwLCAweDRiLCAweDAzLAorMHgxMSwgMHgwMCwgMHg0ZCwgMHgwMSwgMHgzMiwgMHgwNywgMHg0NiwgMHgwMCwgMHgwMCwgMHgwNywgMHg0OSwKKzB4MDAsIDB4MDAsIDB4MDcsIDB4NDAsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDEsIDB4MDAsIDB4MDAsIDB4MDEsCisweDQwLCAweDAyLCAweDQwLCAweDAxLCAweDQxLCAweDAyLCAweDYwLCAweDA3LCAweDQwLCAweDAwLCAweDAwLAorMHgwNywgMHg0MSwgMHgwMCwgMHgwMCwgMHgwNywgMHg0NywgMHgwMCwgMHgwMCwgMHgwNywgMHg0YSwgMHgwMCwKKzB4MDAsIDB4MDAsIDB4NDcsIDB4MDEsIDB4MDAsIDB4MDAsIDB4NGEsIDB4MDEsIDB4MjAsIDB4MDcsIDB4NDcsCisweDAwLCAweDAwLCAweDA3LCAweDRhLCAweDAwLCAweDAwLCAweDA3LCAweDdjLCAweDAwLCAweDAwLCAweDA3LAorMHg3ZSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgxYywgMHgwNywgMHg3YywgMHgwMCwgMHgwMCwKKzB4MDcsIDB4N2UsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MDEsCisweDAwLCAweDA3LCAweDQ0LCAweDAwLCAweDAwLCAweDA3LCAweDQyLCAweDAwLCAweDAwLCAweDA3LCAweDQzLAorMHgwMCwgMHgwMCwgMHgwMCwgMHg0MiwgMHgwMSwgMHgxYSwgMHgwMCwgMHg0MywgMHgwMSwgMHgyMCwgMHgwNywKKzB4NDIsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDAsIDB4MDAsIDB4MDAsCisweDA3LCAweDQxLCAweDAwLCAweDAwLCAweDAxLCAweDQwLCAweDAyLCAweDQwLCAweDAxLCAweDQxLCAweDAyLAorMHg2MCwgMHgwNywgMHg0MCwgMHgwMCwgMHgwMCwgMHgwNywgMHg0MSwgMHgwMCwgMHgwMCwgMHgwNywgMHg0NCwKKzB4MGYsIDB4ZmYsIDB4MDcsIDB4NDIsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDMsIDB4MDAsIDB4MDAsIDB4MDcsCisweDQwLCAweDAwLCAweDAwLCAweDA3LCAweDQxLCAweDAwLCAweDAwLCAweDA3LCAweDUxLCAweDA2LCAweDQwLAorMHgwNywgMHg1MCwgMHgwNiwgMHg0MCwgMHgwNywgMHg0ZiwgMHgwMywgMHg4MSwgMHgwNywgMHg1MywgMHgxYSwKKzB4NzYsIDB4MDcsIDB4NTQsIDB4MGQsIDB4OGIsIDB4MDcsIDB4NTUsIDB4MDQsIDB4ZTksIDB4MDcsIDB4NTYsCisweDBiLCAweDE3LCAweDA3LCAweDU3LCAweDFhLCAweDM4LCAweDA3LCAweDU4LCAweDBkLCAweGM5LCAweDA3LAorMHg1OSwgMHgwNCwgMHg2ZiwgMHgwNywgMHg1YSwgMHgwYiwgMHg5MSwgMHgwNywgMHg3MywgMHgxNCwgMHhkYSwKKzB4MDcsIDB4NzQsIDB4MGQsIDB4OTMsIDB4MDcsIDB4NzUsIDB4MDQsIDB4ZDksIDB4MDcsIDB4NzYsIDB4MDUsCisweDkzLCAweDA3LCAweDc3LCAweDE0LCAweGRhLCAweDA3LCAweDc4LCAweDBkLCAweDkzLCAweDA3LCAweDc5LAorMHgwNCwgMHhkOSwgMHgwNywgMHg3YSwgMHgwNSwgMHg5MywgMHgwNywgMHg1ZSwgMHgwMywgMHg2OCwgMHgwNywKKzB4NWMsIDB4MDQsIDB4MzEsIDB4MDcsIDB4NWQsIDB4MDQsIDB4MzEsIDB4MDcsIDB4NjIsIDB4MDMsIDB4NTIsCisweDA3LCAweDYwLCAweDA0LCAweDc2LCAweDA3LCAweDYxLCAweDA0LCAweDc2LCAweDA3LCAweDY2LCAweDAzLAorMHgyZSwgMHgwNywgMHg2NCwgMHgwNCwgMHhkYSwgMHgwNywgMHg2NSwgMHgwNCwgMHhkYSwgMHgwNywgMHg2YSwKKzB4MDIsIDB4ZjYsIDB4MDcsIDB4NjgsIDB4MDUsIDB4NjIsIDB4MDcsIDB4NjksIDB4MDUsIDB4NjIsIDB4MDYsCisweDQ2LCAweDBhLCAweDIyLCAweDA2LCAweDQ4LCAweDBkLCAweDI0LCAweDA2LCAweDZlLCAweDExLCAweGQzLAorMHgwNiwgMHg3MCwgMHgxNSwgMHhjYiwgMHgwNiwgMHg1MiwgMHgyMCwgMHg5MywgMHgwNiwgMHg1NCwgMHgyMCwKKzB4NTQsIDB4MDYsIDB4NGEsIDB4MjcsIDB4MWQsIDB4MDYsIDB4NTgsIDB4MmYsIDB4YzgsIDB4MDYsIDB4NWMsCisweDMwLCAweDA3LCAweDA2LCAweDRjLCAweDM3LCAweDkwLCAweDA2LCAweDYwLCAweDNkLCAweGRiLCAweDA2LAorMHg2NCwgMHgzZSwgMHg0MiwgMHgwNiwgMHg0ZSwgMHg0NSwgMHg3OCwgMHgwNiwgMHg2OCwgMHg0YywgMHg0OCwKKzB4MDYsIDB4NmMsIDB4NGMsIDB4NmMsIDB4MDYsIDB4NTAsIDB4NTIsIDB4ZTIsIDB4MDYsIDB4NDIsIDB4MDIsCisweGJhCit9OwordW5zaWduZWQgY2hhciBjb2VmZmljaWVudHMyW10gX19pbml0ZGF0YSA9IHsKKzB4MDcsIDB4NDYsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDUsIDB4MGYsCisweGZmLCAweDA3LCAweDQ4LCAweDBmLCAweGZmLCAweDA3LCAweDdiLCAweDA0LCAweGNjLCAweDA3LCAweDdkLAorMHgwNCwgMHhjYywgMHgwNywgMHg3YywgMHgwMCwgMHgwMCwgMHgwNywgMHg3ZSwgMHgwMCwgMHgwMCwgMHgwNywKKzB4NDYsIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDksIDB4MDAsIDB4MDAsIDB4MDcsIDB4NDcsIDB4MDAsIDB4MDAsCisweDA3LCAweDRhLCAweDAwLCAweDAwLCAweDA3LCAweDRjLCAweDAwLCAweDAwLCAweDA3LCAweDRlLCAweDAwLCAweDAwCit9OwordW5zaWduZWQgY2hhciBjb2VmZmljaWVudHMzW10gX19pbml0ZGF0YSA9IHsgCisweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDI4LCAweDAwLCAweDI4LCAweDAwLCAweDUxLCAweDAwLAorMHg1MSwgMHgwMCwgMHg3YSwgMHgwMCwgMHg3YSwgMHgwMCwgMHhhMywgMHgwMCwgMHhhMywgMHgwMCwgMHhjYywKKzB4MDAsIDB4Y2MsIDB4MDAsIDB4ZjUsIDB4MDAsIDB4ZjUsIDB4MDEsIDB4MWUsIDB4MDEsIDB4MWUsIDB4MDEsCisweDQ3LCAweDAxLCAweDQ3LCAweDAxLCAweDcwLCAweDAxLCAweDcwLCAweDAxLCAweDk5LCAweDAxLCAweDk5LAorMHgwMSwgMHhjMiwgMHgwMSwgMHhjMiwgMHgwMSwgMHhlYiwgMHgwMSwgMHhlYiwgMHgwMiwgMHgxNCwgMHgwMiwKKzB4MTQsIDB4MDIsIDB4M2QsIDB4MDIsIDB4M2QsIDB4MDIsIDB4NjYsIDB4MDIsIDB4NjYsIDB4MDIsIDB4OGYsCisweDAyLCAweDhmLCAweDAyLCAweGI4LCAweDAyLCAweGI4LCAweDAyLCAweGUxLCAweDAyLCAweGUxLCAweDAzLAorMHgwYSwgMHgwMywgMHgwYSwgMHgwMywgMHgzMywgMHgwMywgMHgzMywgMHgwMywgMHg1YywgMHgwMywgMHg1YywKKzB4MDMsIDB4ODUsIDB4MDMsIDB4ODUsIDB4MDMsIDB4YWUsIDB4MDMsIDB4YWUsIDB4MDMsIDB4ZDcsIDB4MDMsCisweGQ3LCAweDA0LCAweDAwLCAweDA0LCAweDAwLCAweDA0LCAweDI4LCAweDA0LCAweDI4LCAweDA0LCAweDUxLAorMHgwNCwgMHg1MSwgMHgwNCwgMHg3YSwgMHgwNCwgMHg3YSwgMHgwNCwgMHhhMywgMHgwNCwgMHhhMywgMHgwNCwKKzB4Y2MsIDB4MDQsIDB4Y2MsIDB4MDQsIDB4ZjUsIDB4MDQsIDB4ZjUsIDB4MDUsIDB4MWUsIDB4MDUsIDB4MWUsCisweDA1LCAweDQ3LCAweDA1LCAweDQ3LCAweDA1LCAweDcwLCAweDA1LCAweDcwLCAweDA1LCAweDk5LCAweDA1LAorMHg5OSwgMHgwNSwgMHhjMiwgMHgwNSwgMHhjMiwgMHgwNSwgMHhlYiwgMHgwNSwgMHhlYiwgMHgwNiwgMHgxNCwKKzB4MDYsIDB4MTQsIDB4MDYsIDB4M2QsIDB4MDYsIDB4M2QsIDB4MDYsIDB4NjYsIDB4MDYsIDB4NjYsIDB4MDYsCisweDhmLCAweDA2LCAweDhmLCAweDA2LCAweGI4LCAweDA2LCAweGI4LCAweDA2LCAweGUxLCAweDA2LCAweGUxLAorMHgwNywgMHgwYSwgMHgwNywgMHgwYSwgMHgwNywgMHgzMywgMHgwNywgMHgzMywgMHgwNywgMHg1YywgMHgwNywKKzB4NWMsIDB4MDcsIDB4ODUsIDB4MDcsIDB4ODUsIDB4MDcsIDB4YWUsIDB4MDcsIDB4YWUsIDB4MDcsIDB4ZDcsCisweDA3LCAweGQ3LCAweDA4LCAweDAwLCAweDA4LCAweDAwLCAweDA4LCAweDI4LCAweDA4LCAweDI4LCAweDA4LAorMHg1MSwgMHgwOCwgMHg1MSwgMHgwOCwgMHg3YSwgMHgwOCwgMHg3YSwgMHgwOCwgMHhhMywgMHgwOCwgMHhhMywKKzB4MDgsIDB4Y2MsIDB4MDgsIDB4Y2MsIDB4MDgsIDB4ZjUsIDB4MDgsIDB4ZjUsIDB4MDksIDB4MWUsIDB4MDksCisweDFlLCAweDA5LCAweDQ3LCAweDA5LCAweDQ3LCAweDA5LCAweDcwLCAweDA5LCAweDcwLCAweDA5LCAweDk5LAorMHgwOSwgMHg5OSwgMHgwOSwgMHhjMiwgMHgwOSwgMHhjMiwgMHgwOSwgMHhlYiwgMHgwOSwgMHhlYiwgMHgwYSwKKzB4MTQsIDB4MGEsIDB4MTQsIDB4MGEsIDB4M2QsIDB4MGEsIDB4M2QsIDB4MGEsIDB4NjYsIDB4MGEsIDB4NjYsCisweDBhLCAweDhmLCAweDBhLCAweDhmLCAweDBhLCAweGI4LCAweDBhLCAweGI4LCAweDBhLCAweGUxLCAweDBhLAorMHhlMSwgMHgwYiwgMHgwYSwgMHgwYiwgMHgwYSwgMHgwYiwgMHgzMywgMHgwYiwgMHgzMywgMHgwYiwgMHg1YywKKzB4MGIsIDB4NWMsIDB4MGIsIDB4ODUsIDB4MGIsIDB4ODUsIDB4MGIsIDB4YWUsIDB4MGIsIDB4YWUsIDB4MGIsCisweGQ3LCAweDBiLCAweGQ3LCAweDBjLCAweDAwLCAweDBjLCAweDAwLCAweDBjLCAweDI4LCAweDBjLCAweDI4LAorMHgwYywgMHg1MSwgMHgwYywgMHg1MSwgMHgwYywgMHg3YSwgMHgwYywgMHg3YSwgMHgwYywgMHhhMywgMHgwYywKKzB4YTMsIDB4MGMsIDB4Y2MsIDB4MGMsIDB4Y2MsIDB4MGMsIDB4ZjUsIDB4MGMsIDB4ZjUsIDB4MGQsIDB4MWUsCisweDBkLCAweDFlLCAweDBkLCAweDQ3LCAweDBkLCAweDQ3LCAweDBkLCAweDcwLCAweDBkLCAweDcwLCAweDBkLAorMHg5OSwgMHgwZCwgMHg5OSwgMHgwZCwgMHhjMiwgMHgwZCwgMHhjMiwgMHgwZCwgMHhlYiwgMHgwZCwgMHhlYiwKKzB4MGUsIDB4MTQsIDB4MGUsIDB4MTQsIDB4MGUsIDB4M2QsIDB4MGUsIDB4M2QsIDB4MGUsIDB4NjYsIDB4MGUsCisweDY2LCAweDBlLCAweDhmLCAweDBlLCAweDhmLCAweDBlLCAweGI4LCAweDBlLCAweGI4LCAweDBlLCAweGUxLAorMHgwZSwgMHhlMSwgMHgwZiwgMHgwYSwgMHgwZiwgMHgwYSwgMHgwZiwgMHgzMywgMHgwZiwgMHgzMywgMHgwZiwKKzB4NWMsIDB4MGYsIDB4NWMsIDB4MGYsIDB4ODUsIDB4MGYsIDB4ODUsIDB4MGYsIDB4YWUsIDB4MGYsIDB4YWUsCisweDBmLCAweGQ3LCAweDBmLCAweGQ3LCAweDBmLCAweGZmLCAweDBmLCAweGZmCit9OworCmRpZmYgLS1naXQgYS9zb3VuZC9vc3MveXNzMjI1LmggYi9zb3VuZC9vc3MveXNzMjI1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkOGI2YgotLS0gL2Rldi9udWxsCisrKyBiL3NvdW5kL29zcy95c3MyMjUuaApAQCAtMCwwICsxLDI0IEBACisjaWZuZGVmIF9feXNzMjU1X2hfXworI2RlZmluZSBfX3lzczI1NV9oX18KKworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcGFnZV96ZXJvWzI1Nl07CitleHRlcm4gdW5zaWduZWQgY2hhciBwYWdlX29uZVsyNTZdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcGFnZV90d29bMTI4XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBhZ2VfdGhyZWVbMTI4XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBhZ2VfZm91clsxMjhdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcGFnZV9zaXhbMTkyXTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBhZ2Vfc2V2ZW5bMjU2XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBhZ2VfemVyb192Mls5Nl07CitleHRlcm4gdW5zaWduZWQgY2hhciBwYWdlX29uZV92Mls5Nl07CitleHRlcm4gdW5zaWduZWQgY2hhciBwYWdlX3R3b192Mls0OF07CitleHRlcm4gdW5zaWduZWQgY2hhciBwYWdlX3RocmVlX3YyWzQ4XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIHBhZ2VfZm91cl92Mls0OF07CitleHRlcm4gdW5zaWduZWQgY2hhciBwYWdlX3NldmVuX3YyWzk2XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIG1vZF92MlszMDRdOworZXh0ZXJuIHVuc2lnbmVkIGNoYXIgY29lZmZpY2llbnRzWzM2NF07CitleHRlcm4gdW5zaWduZWQgY2hhciBjb2VmZmljaWVudHMyWzU2XTsKK2V4dGVybiB1bnNpZ25lZCBjaGFyIGNvZWZmaWNpZW50czNbNDA0XTsKKworCisjZW5kaWYgLyogX195czIyNV9oX18gKi8KKwo=